diff -Nrc3pad gcc-3.0.4/boehm-gc/AmigaOS.c gcc-3.1/boehm-gc/AmigaOS.c *** gcc-3.0.4/boehm-gc/AmigaOS.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/AmigaOS.c Fri Aug 17 18:30:44 2001 *************** *** 0 **** --- 1,623 ---- + + + /****************************************************************** + + AmigaOS-spesific routines for GC. + This file is normally included from os_dep.c + + ******************************************************************/ + + + #if !defined(GC_AMIGA_DEF) && !defined(GC_AMIGA_SB) && !defined(GC_AMIGA_DS) && !defined(GC_AMIGA_AM) + # include "gc_priv.h" + # include + # include + # define GC_AMIGA_DEF + # define GC_AMIGA_SB + # define GC_AMIGA_DS + # define GC_AMIGA_AM + #endif + + + #ifdef GC_AMIGA_DEF + + # ifndef __GNUC__ + # include + # endif + # include + # include + # include + # include + + #endif + + + + + #ifdef GC_AMIGA_SB + + /****************************************************************** + Find the base of the stack. + ******************************************************************/ + + ptr_t GC_get_stack_base() + { + struct Process *proc = (struct Process*)SysBase->ThisTask; + + /* Reference: Amiga Guru Book Pages: 42,567,574 */ + if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS + && proc->pr_CLI != NULL) { + /* first ULONG is StackSize */ + /*longPtr = proc->pr_ReturnAddr; + size = longPtr[0];*/ + + return (char *)proc->pr_ReturnAddr + sizeof(ULONG); + } else { + return (char *)proc->pr_Task.tc_SPUpper; + } + } + + #if 0 /* old version */ + ptr_t GC_get_stack_base() + { + extern struct WBStartup *_WBenchMsg; + extern long __base; + extern long __stack; + struct Task *task; + struct Process *proc; + struct CommandLineInterface *cli; + long size; + + if ((task = FindTask(0)) == 0) { + GC_err_puts("Cannot find own task structure\n"); + ABORT("task missing"); + } + proc = (struct Process *)task; + cli = BADDR(proc->pr_CLI); + + if (_WBenchMsg != 0 || cli == 0) { + size = (char *)task->tc_SPUpper - (char *)task->tc_SPLower; + } else { + size = cli->cli_DefaultStack * 4; + } + return (ptr_t)(__base + GC_max(size, __stack)); + } + #endif + + + #endif + + + #ifdef GC_AMIGA_DS + /****************************************************************** + Register data segments. + ******************************************************************/ + + void GC_register_data_segments() + { + struct Process *proc; + struct CommandLineInterface *cli; + BPTR myseglist; + ULONG *data; + + int num; + + + # ifdef __GNUC__ + ULONG dataSegSize; + GC_bool found_segment = FALSE; + extern char __data_size[]; + + dataSegSize=__data_size+8; + /* Can`t find the Location of __data_size, because + it`s possible that is it, inside the segment. */ + + # endif + + proc= (struct Process*)SysBase->ThisTask; + + /* Reference: Amiga Guru Book Pages: 538ff,565,573 + and XOper.asm */ + if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS) { + if (proc->pr_CLI == NULL) { + myseglist = proc->pr_SegList; + } else { + /* ProcLoaded 'Loaded as a command: '*/ + cli = BADDR(proc->pr_CLI); + myseglist = cli->cli_Module; + } + } else { + ABORT("Not a Process."); + } + + if (myseglist == NULL) { + ABORT("Arrrgh.. can't find segments, aborting"); + } + + /* xoper hunks Shell Process */ + + num=0; + for (data = (ULONG *)BADDR(myseglist); data != NULL; + data = (ULONG *)BADDR(data[0])) { + if (((ULONG) GC_register_data_segments < (ULONG) &data[1]) || + ((ULONG) GC_register_data_segments > (ULONG) &data[1] + data[-1])) { + # ifdef __GNUC__ + if (dataSegSize == data[-1]) { + found_segment = TRUE; + } + # endif + GC_add_roots_inner((char *)&data[1], + ((char *)&data[1]) + data[-1], FALSE); + } + ++num; + } /* for */ + # ifdef __GNUC__ + if (!found_segment) { + ABORT("Can`t find correct Segments.\nSolution: Use an newer version of ixemul.library"); + } + # endif + } + + #if 0 /* old version */ + void GC_register_data_segments() + { + extern struct WBStartup *_WBenchMsg; + struct Process *proc; + struct CommandLineInterface *cli; + BPTR myseglist; + ULONG *data; + + if ( _WBenchMsg != 0 ) { + if ((myseglist = _WBenchMsg->sm_Segment) == 0) { + GC_err_puts("No seglist from workbench\n"); + return; + } + } else { + if ((proc = (struct Process *)FindTask(0)) == 0) { + GC_err_puts("Cannot find process structure\n"); + return; + } + if ((cli = BADDR(proc->pr_CLI)) == 0) { + GC_err_puts("No CLI\n"); + return; + } + if ((myseglist = cli->cli_Module) == 0) { + GC_err_puts("No seglist from CLI\n"); + return; + } + } + + for (data = (ULONG *)BADDR(myseglist); data != 0; + data = (ULONG *)BADDR(data[0])) { + # ifdef AMIGA_SKIP_SEG + if (((ULONG) GC_register_data_segments < (ULONG) &data[1]) || + ((ULONG) GC_register_data_segments > (ULONG) &data[1] + data[-1])) { + # else + { + # endif /* AMIGA_SKIP_SEG */ + GC_add_roots_inner((char *)&data[1], + ((char *)&data[1]) + data[-1], FALSE); + } + } + } + #endif /* old version */ + + + #endif + + + + #ifdef GC_AMIGA_AM + + #ifndef GC_AMIGA_FASTALLOC + + void *GC_amiga_allocwrapper(size_t size,void *(*AllocFunction)(size_t size2)){ + return (*AllocFunction)(size); + } + + void *(*GC_amiga_allocwrapper_do)(size_t size,void *(*AllocFunction)(size_t size2)) + =GC_amiga_allocwrapper; + + #else + + + + + void *GC_amiga_allocwrapper_firsttime(size_t size,void *(*AllocFunction)(size_t size2)); + + void *(*GC_amiga_allocwrapper_do)(size_t size,void *(*AllocFunction)(size_t size2)) + =GC_amiga_allocwrapper_firsttime; + + + /****************************************************************** + Amiga-spesific routines to obtain memory, and force GC to give + back fast-mem whenever possible. + These hacks makes gc-programs go many times faster when + the amiga is low on memory, and are therefore strictly necesarry. + + -Kjetil S. Matheussen, 2000. + ******************************************************************/ + + + + /* List-header for all allocated memory. */ + + struct GC_Amiga_AllocedMemoryHeader{ + ULONG size; + struct GC_Amiga_AllocedMemoryHeader *next; + }; + struct GC_Amiga_AllocedMemoryHeader *GC_AMIGAMEM=(struct GC_Amiga_AllocedMemoryHeader *)(int)~(NULL); + + + + /* Type of memory. Once in the execution of a program, this might change to MEMF_ANY|MEMF_CLEAR */ + + ULONG GC_AMIGA_MEMF = MEMF_FAST | MEMF_CLEAR; + + + /* Prevents GC_amiga_get_mem from allocating memory if this one is TRUE. */ + #ifndef GC_AMIGA_ONLYFAST + BOOL GC_amiga_dontalloc=FALSE; + #endif + + #ifdef GC_AMIGA_PRINTSTATS + int succ=0,succ2=0; + int nsucc=0,nsucc2=0; + int nullretries=0; + int numcollects=0; + int chipa=0; + int allochip=0; + int allocfast=0; + int cur0=0; + int cur1=0; + int cur10=0; + int cur50=0; + int cur150=0; + int cur151=0; + int ncur0=0; + int ncur1=0; + int ncur10=0; + int ncur50=0; + int ncur150=0; + int ncur151=0; + #endif + + /* Free everything at program-end. */ + + void GC_amiga_free_all_mem(void){ + struct GC_Amiga_AllocedMemoryHeader *gc_am=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(GC_AMIGAMEM)); + struct GC_Amiga_AllocedMemoryHeader *temp; + + #ifdef GC_AMIGA_PRINTSTATS + printf("\n\n" + "%d bytes of chip-mem, and %d bytes of fast-mem where allocated from the OS.\n", + allochip,allocfast + ); + printf( + "%d bytes of chip-mem were returned from the GC_AMIGA_FASTALLOC supported allocating functions.\n", + chipa + ); + printf("\n"); + printf("GC_gcollect was called %d times to avoid returning NULL or start allocating with the MEMF_ANY flag.\n",numcollects); + printf("%d of them was a success. (the others had to use allocation from the OS.)\n",nullretries); + printf("\n"); + printf("Succeded forcing %d gc-allocations (%d bytes) of chip-mem to be fast-mem.\n",succ,succ2); + printf("Failed forcing %d gc-allocations (%d bytes) of chip-mem to be fast-mem.\n",nsucc,nsucc2); + printf("\n"); + printf( + "Number of retries before succeding a chip->fast force:\n" + "0: %d, 1: %d, 2-9: %d, 10-49: %d, 50-149: %d, >150: %d\n", + cur0,cur1,cur10,cur50,cur150,cur151 + ); + printf( + "Number of retries before giving up a chip->fast force:\n" + "0: %d, 1: %d, 2-9: %d, 10-49: %d, 50-149: %d, >150: %d\n", + ncur0,ncur1,ncur10,ncur50,ncur150,ncur151 + ); + #endif + + while(gc_am!=NULL){ + temp=gc_am->next; + FreeMem(gc_am,gc_am->size); + gc_am=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(temp)); + } + } + + #ifndef GC_AMIGA_ONLYFAST + + /* All memory with address lower than this one is chip-mem. */ + + char *chipmax; + + + /* + * Allways set to the last size of memory tried to be allocated. + * Needed to ensure allocation when the size is bigger than 100000. + * + */ + size_t latestsize; + + #endif + + + /* + * The actual function that is called with the GET_MEM macro. + * + */ + + void *GC_amiga_get_mem(size_t size){ + struct GC_Amiga_AllocedMemoryHeader *gc_am; + + #ifndef GC_AMIGA_ONLYFAST + if(GC_amiga_dontalloc==TRUE){ + // printf("rejected, size: %d, latestsize: %d\n",size,latestsize); + return NULL; + } + + // We really don't want to use chip-mem, but if we must, then as little as possible. + if(GC_AMIGA_MEMF==(MEMF_ANY|MEMF_CLEAR) && size>100000 && latestsize<50000) return NULL; + #endif + + gc_am=AllocMem((ULONG)(size + sizeof(struct GC_Amiga_AllocedMemoryHeader)),GC_AMIGA_MEMF); + if(gc_am==NULL) return NULL; + + gc_am->next=GC_AMIGAMEM; + gc_am->size=size + sizeof(struct GC_Amiga_AllocedMemoryHeader); + GC_AMIGAMEM=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(gc_am)); + + // printf("Allocated %d (%d) bytes at address: %x. Latest: %d\n",size,tot,gc_am,latestsize); + + #ifdef GC_AMIGA_PRINTSTATS + if((char *)gc_amchipmax || ret==NULL){ + if(ret==NULL){ + nsucc++; + nsucc2+=size; + if(rec==0) ncur0++; + if(rec==1) ncur1++; + if(rec>1 && rec<10) ncur10++; + if(rec>=10 && rec<50) ncur50++; + if(rec>=50 && rec<150) ncur150++; + if(rec>=150) ncur151++; + }else{ + succ++; + succ2+=size; + if(rec==0) cur0++; + if(rec==1) cur1++; + if(rec>1 && rec<10) cur10++; + if(rec>=10 && rec<50) cur50++; + if(rec>=50 && rec<150) cur150++; + if(rec>=150) cur151++; + } + } + #endif + + if (((char *)ret)<=chipmax && ret!=NULL && (rec<(size>500000?9:size/5000))){ + ret=GC_amiga_rec_alloc(size,AllocFunction,rec+1); + // GC_free(ret2); + } + + return ret; + } + #endif + + + /* The allocating-functions defined inside the amiga-blocks in gc.h is called + * via these functions. + */ + + + void *GC_amiga_allocwrapper_any(size_t size,void *(*AllocFunction)(size_t size2)){ + void *ret,*ret2; + + GC_amiga_dontalloc=TRUE; // Pretty tough thing to do, but its indeed necesarry. + latestsize=size; + + ret=(*AllocFunction)(size); + + if(((char *)ret) <= chipmax){ + if(ret==NULL){ + //Give GC access to allocate memory. + #ifdef GC_AMIGA_GC + if(!GC_dont_gc){ + GC_gcollect(); + #ifdef GC_AMIGA_PRINTSTATS + numcollects++; + #endif + ret=(*AllocFunction)(size); + } + #endif + if(ret==NULL){ + GC_amiga_dontalloc=FALSE; + ret=(*AllocFunction)(size); + if(ret==NULL){ + WARN("Out of Memory! Returning NIL!\n", 0); + } + } + #ifdef GC_AMIGA_PRINTSTATS + else{ + nullretries++; + } + if(ret!=NULL && (char *)ret<=chipmax) chipa+=size; + #endif + } + #ifdef GC_AMIGA_RETRY + else{ + /* We got chip-mem. Better try again and again and again etc., we might get fast-mem sooner or later... */ + /* Using gctest to check the effectiviness of doing this, does seldom give a very good result. */ + /* However, real programs doesn't normally rapidly allocate and deallocate. */ + // printf("trying to force... %d bytes... ",size); + if( + AllocFunction!=GC_malloc_uncollectable + #ifdef ATOMIC_UNCOLLECTABLE + && AllocFunction!=GC_malloc_atomic_uncollectable + #endif + ){ + ret2=GC_amiga_rec_alloc(size,AllocFunction,0); + }else{ + ret2=(*AllocFunction)(size); + #ifdef GC_AMIGA_PRINTSTATS + if((char *)ret2chipmax){ + // printf("Succeeded.\n"); + GC_free(ret); + ret=ret2; + }else{ + GC_free(ret2); + // printf("But did not succeed.\n"); + } + } + #endif + } + + GC_amiga_dontalloc=FALSE; + + return ret; + } + + + + void (*GC_amiga_toany)(void)=NULL; + + void GC_amiga_set_toany(void (*func)(void)){ + GC_amiga_toany=func; + } + + #endif // !GC_AMIGA_ONLYFAST + + + void *GC_amiga_allocwrapper_fast(size_t size,void *(*AllocFunction)(size_t size2)){ + void *ret; + + ret=(*AllocFunction)(size); + + if(ret==NULL){ + // Enable chip-mem allocation. + // printf("ret==NULL\n"); + #ifdef GC_AMIGA_GC + if(!GC_dont_gc){ + GC_gcollect(); + #ifdef GC_AMIGA_PRINTSTATS + numcollects++; + #endif + ret=(*AllocFunction)(size); + } + #endif + if(ret==NULL){ + #ifndef GC_AMIGA_ONLYFAST + GC_AMIGA_MEMF=MEMF_ANY | MEMF_CLEAR; + if(GC_amiga_toany!=NULL) (*GC_amiga_toany)(); + GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_any; + return GC_amiga_allocwrapper_any(size,AllocFunction); + #endif + } + #ifdef GC_AMIGA_PRINTSTATS + else{ + nullretries++; + } + #endif + } + + return ret; + } + + void *GC_amiga_allocwrapper_firsttime(size_t size,void *(*AllocFunction)(size_t size2)){ + atexit(&GC_amiga_free_all_mem); + chipmax=(char *)SysBase->MaxLocMem; // For people still having SysBase in chip-mem, this might speed up a bit. + GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_fast; + return GC_amiga_allocwrapper_fast(size,AllocFunction); + } + + + #endif //GC_AMIGA_FASTALLOC + + + + /* + * The wrapped realloc function. + * + */ + void *GC_amiga_realloc(void *old_object,size_t new_size_in_bytes){ + #ifndef GC_AMIGA_FASTALLOC + return GC_realloc(old_object,new_size_in_bytes); + #else + void *ret; + latestsize=new_size_in_bytes; + ret=GC_realloc(old_object,new_size_in_bytes); + if(ret==NULL && GC_AMIGA_MEMF==(MEMF_FAST | MEMF_CLEAR)){ + /* Out of fast-mem. */ + #ifdef GC_AMIGA_GC + if(!GC_dont_gc){ + GC_gcollect(); + #ifdef GC_AMIGA_PRINTSTATS + numcollects++; + #endif + ret=GC_realloc(old_object,new_size_in_bytes); + } + #endif + if(ret==NULL){ + #ifndef GC_AMIGA_ONLYFAST + GC_AMIGA_MEMF=MEMF_ANY | MEMF_CLEAR; + if(GC_amiga_toany!=NULL) (*GC_amiga_toany)(); + GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_any; + ret=GC_realloc(old_object,new_size_in_bytes); + #endif + } + #ifdef GC_AMIGA_PRINTSTATS + else{ + nullretries++; + } + #endif + } + if(ret==NULL){ + WARN("Out of Memory! Returning NIL!\n", 0); + } + #ifdef GC_AMIGA_PRINTSTATS + if(((char *)ret) ! * mach_dep.c (GC_push_regs) [I386 && (SVR4 || SCO || SCO_ELF) ! && __GNUC__ ]: Call GC_push_one in C to allow for PIC code. ! Fixes PR bootstrap/4162. 2001-09-26 Rainer Orth * solaris_threads.c (MAX_ORIG_STACK_SIZE) [I386]: Provide special Solaris 2/Intel definition. - (GC_get_orig_stack_size): NL-terminate warning message. * configure.in (i?86-*-solaris2.[89]*): Define SOLARIS25_PROC_VDB_BUG_FIXED. ! * gcconfig.h [I386 && SUNOS5]: Use it. * configure: Regenerate. ! * gcconfig.h [I386 && SUNOS5] (DATASTART): Use _etext. (DATAEND): Define using _end. - (STACKBOTTOM): Define. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. 2001-07-03 Tom Tromey --- 1,287 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-08 Alexandre Oliva ! * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at ! script entry, and set LD to it when configuring multilibs. ! * configure: Rebuilt. ! 2002-04-22 Jeff Sturm ! * Makefile.am (toolexeclib_LTLIBRARIES): Remove. ! (noinst_LTLIBRARIES): Add libgcjgc.la. ! * Makefile.in: Rebuild. ! 2002-04-22 David S. Miller ! ! * include/private/gcconfig.h: Hard-code STACKBOTTOM on ! 64-bit SPARC Linux, the __libc_stack_end technique does ! not work in this case. ! ! 2002-04-22 Jeff Sturm ! ! * gcconfig.h: Enable DYNAMIC_LOADING for all sparc-solaris ABIs. ! ! 2002-04-17 Hans Boehm ! ! * include/private/gcconfig.h: Use LINUX_STACKBOTTOM for ! SPARC Linux. ! ! 2002-04-09 Loren J. Rittle ! Richard Henderson ! ! * include/private/gcconfig.h (DATAEND): Update comment example ! to match reality. Clarify comment. ! Change all likely references to linker script synthesized ! symbols to use this idiom: extern int etext[]; etext ! * os_dep.c (GC_init_linux_data_start): Fix references to ! __data_start and _end. ! ! 2002-04-08 Hans Boehm ! ! * include/private/gc_priv.h (WARN macro): Add "GC warning:" prefix. ! (GC_large_alloc_warn_interval, GC_large_alloc_warn_suppressed): ! declare. ! * allchblk.c (GC_allchblk_nth): Change text and support reduced ! frequency for blacklist warning message. ! * misc.c (GC_large_alloc_warn_interval, ! GC_large_alloc_warn_suppressed): define. ! (GC_init_inner): Check GC_NO_BLACKLIST_WARNING and ! GC_LARGE_ALLOC_WARN_INTERVAL environment variables. ! * doc/README.environment (GC_NO_BLACKLIST_WARNING): Deprecate. ! (GC_LARGE_ALLOC_WARN_INTERVAL): Add documentation. ! ! * dyn_load.c (_DYNAMIC): Move declaration to file scope. ! ! 2002-04-04 Loren J. Rittle ! ! * include/private/gcconfig.h: Add support for an unmapped ! memory hole between the end of the initialized data segment ! and the start of the BSS on FreeBSD/i386. ! ! 2002-04-01 Loren J. Rittle ! ! * include/private/gcconfig.h: Add unified test for FreeBSD. ! Support FreeBSD/alpha. ! * os_dep.c: Do not include unless available. ! (GC_freebsd_stack_base): Fix types. ! ! 2002-03-30 Krister Walfridsson ! ! * include/private/gcconfig.h: define DYNAMIC_LOADING for ELF ! NetBSD/i386. ! ! 2002-03-29 Hans Boehm ! ! * linux_threads.c (return_free_lists): Clear fl[i] unconditionally. ! (GC_local_gcj_malloc): Add assertion. ! (start_mark_threads): Fix abort message. ! * mark.c (GC_mark_from): Generalize assertion. ! * reclaim.c (GC_clear_fl_links): New function. ! (GC_start_reclaim): Must clear some freelist links. ! * include/private/specific.h, specific.c: Add assertions. ! Safer definition for INVALID_QTID, quick_thread_id. Fix/add comments. ! Rearrange tse fields. ! ! 2002-03-24 Jeff Sturm ! ! * linux_threads.c (GC_get_nprocs): Close file descriptor. ! ! 2002-03-15 Anthony Green ! ! * misc.c (GC_init_inner): Initialize GC_write_cs before use. ! * configure.in: Disable use of getenv for win32 targets (some of ! which have broken implementations). ! * configure: Rebuilt. ! ! 2002-03-12 Adam Megacz ! ! * dyn_load.c: Renamed GC_win32s to GC_no_win32_dlls. ! * misc.c: Renamed GC_is_win32s() to GC_no_win32_dlls ! * os_dep.c: Renamed GC_win32s to GC_no_win32_dlls and ! statically initialized it to TRUE if compiling with GCC. ! * win32_threads.c (thread_start): We no longer use SEH if ! compiling with GCC. ! * mark.c (GC_mark_some): We no longer use SEH if ! compiling with GCC. ! ! 2002-03-09 Bryce McKinlay ! ! * include/gc_priv.h: Define ALIGN_DOUBLE on 32 bit targets if GCJ ! support is enabled, for hash synchronization. ! ! 2002-03-17 Bryce McKinlay ! ! * Makefile.am: Make a convenience library. ! * Makefile.in: Rebuilt. ! ! 2002-02-24 Adam Megacz ! ! * Makefile.am: Added win32_threads.c to sources list. ! * win32_threads.c: Added two */'s which I had neglected. ! ! 2002-02-20 Bryce McKinlay ! ! * Makefile.am: Re-add SUBDIRS parameter which was lost in merge. ! * Makefile.in: Rebuilt. ! ! 2002-02-13 Bryce McKinlay ! ! * dbg_mlc.c (GC_debug_generic_malloc): Removed. ! ! * sparc_mach_dep.S: Rename from sparc_mach_dep.s as it is a ! preprocessor file. ! * mips_sgi_mach_dep.S: Likewise. ! * Makefile.am: Update for above changes. ! * Makefile.in: Rebuilt. ! ! 2002-02-12 Richard Henderson ! ! * configure.in: Re-apply 2001-06-26 configure change. ! * configure: Rebuild. ! ! 2002-02-12 Bryce McKinlay ! ! Imported GC 6.1 Alpha 3. ! ! * sparc_mach_dep.S: Delete incorrectly named file. ! ! 2001-02-11 Adam Megacz ! ! * include/private/gcconfig.h: Add XSCALE NOSYS support for bare ! board embedded targets. ! * os_dep.c: Avoid signal handling code for NOSYS/ECOS targets. ! Use GC_get_stack_base for NOSYS/ECOS targets. Clean up some ! redundant uses of ECOS. ! * misc.c: Use NOSYS where ECOS is being used. ! Don't define GC_write twice for ECOS systems. ! (GC_write): New function for NOSYS targets. ! ! 2002-02-06 Adam Megacz ! ! * boehm-gc/include/gc.h: (GC_CreateThread) This function is ! now exposed on all Win32 platforms. ! * boehm-gc/win32_threads.c: (GC_CreateThread) This now ! compiles on Win32; it invokes CreateThread() if GC is built ! as a DLL; otherwise it registers the thread. ! * boehm-gc/misc.c (GC_init): Initialize GC_allocate_ml in case ! libgcjgc was not built as a DLL. ! ! 2002-02-01 Adam Megacz ! ! * boehm-gc on win32 now automatically detects if it is being built ! as a DLL; see http://gcc.gnu.org/ml/java/2001-12/msg00240.html ! ! 2002-01-25 David Edelsohn ! ! * include/gc.h (GC_INIT): Add DATASTART and DATAEND roots on AIX. ! * include/private/gcconfig.h (RS6000): Add 64-bit AIX support. ! Define USE_GENERIC_PUSH_REGS. Use AIX _data and _end symbols for ! DATASTART and DATAEND roots. ! * rs6000_mach_dep.s: Add function descriptor and traceback table. ! ! 2001-12-16 Jeff Sturm ! ! * dyn_load.c: Define ElfW (if needed) for all targets, ! not just GNU/Linux. ! (GC_FirstDLOpenedLinkMap): Use it. ! (GC_register_dynamic_libraries_dl): Use it. ! * include/private/gcconfig.h: Define CPP_WORDSZ, ELF_CLASS ! for sparcv9. ! ! 2001-12-16 Craig Rodrigues ! ! PR other/3725 ! * configure.in: Add AC_SUBST(target_alias). ! * configure: Regenerated. ! ! 2001-11-26 Loren J. Rittle ! ! * linux_threads.c (WRAP_FUNC(pthread_join)): Remove special ! case for GC_FREEBSD_THREADS. ! * configure.in (*-*-freebsd*): Clarify warning. ! * configure: Rebuilt. ! ! 2001-10-23 Loren J. Rittle ! Andreas Tobler ! ! * include/private/solaris_threads.h: Update to use GC_SOLARIS_THREADS. ! ! 2001-10-22 Bryce McKinlay ! ! * linux_threads.c (GC_init_parallel): Do not declare as a static ! constructor. ! * include/gc.h (GC_init): Declare here. Add description. ! * include/private/gc_priv.h (GC_init): Remove declaration. ! ! 2001-10-16 Loren J. Rittle ! ! * include/gc_pthread_redirects.h: Generalize test to use GC_PTHREADS. ! * linux_threads.c (WRAP_FUNC(pthread_join)): Conditionalized on ! GC_FREEBSD_THREADS, handle strange interaction between system ! pthread implementation and boehm-gc signal-handler architecture. ! * tests/test.c (main): Conditionalized on GC_FREEBSD_THREADS, ! set stack. ! * include/private/gcconfig.h (configuration keyed off FREEBSD): ! Define SIG_SUSPEND, SIG_THR_RESTART. Do not define ! MPROTECT_VDB when GC_FREEBSD_THREADS is defined. ! ! 2001-10-16 Loren J. Rittle ! ! * Makefile.am (test.o): Find tests/test.c in $(srcdir). ! * Makefile.in: Rebuilt. ! ! 2001-10-16 Bryce McKinlay ! ! * Makefile.am, acinclude.m4, configure.in: Imported GC 6.1 Alpha 1 and ! merged local changes. 2001-09-26 Rainer Orth * solaris_threads.c (MAX_ORIG_STACK_SIZE) [I386]: Provide special Solaris 2/Intel definition. * configure.in (i?86-*-solaris2.[89]*): Define SOLARIS25_PROC_VDB_BUG_FIXED. ! * include/private/gcconfig.h [I386 && SUNOS5]: Use it. * configure: Regenerate. ! * include/private/gcconfig.h [I386 && SUNOS5] (DATASTART): Use _etext. (DATAEND): Define using _end. ! 2001-09-11 Per Bothner ! * include/Makefile.am: New file. It defines include_HEADERS. ! * Makefile.am (SUBDIRS): New macro, set to include. ! * configure.in (AC_OUTPUT): Add include/Makefile. ! 2001-08-20 Tom Tromey ! * configure: Rebuilt. ! * configure.in: Always ask gcc for threads package. ! 2001-08-17 Tom Tromey ! * Makefile.am, acinclude.m4, configure.in: Imported GC 6.0 and ! merged local changes. ! ! 2001-08-02 David Billinghurst ! ! * configure: Rebuilt. ! * configure.in: POSIX threads on cygwin does not link with ! -lpthreads. 2001-07-03 Tom Tromey *************** *** 53,67 **** * aclocal.m4, configure, Makefile.in: Rebuilt. * acinclude.m4: Set mkinstalldirs for in-tree build. ! 20010617 Release Manager ! * GCC 3.0 Released. 2001-06-12 Tom Tromey * aclocal.m4, configure: Rebuilt. * acinclude.m4: Find configure.host in srcdir. 2001-06-07 Tom Tromey For PR bootstrap/3075: --- 289,313 ---- * aclocal.m4, configure, Makefile.in: Rebuilt. * acinclude.m4: Set mkinstalldirs for in-tree build. ! 2001-06-26 Richard Henderson ! * alpha_mach_dep.s: Mark call-saved FP registers. ! * include/private/gcconfig.h (ALPHA): Remove USE_GENERIC_PUSH_REGS. ! * configure.in (alpha*): Re-enable alpha_mach_dep.s ! * configure: Rebuild. 2001-06-12 Tom Tromey * aclocal.m4, configure: Rebuilt. * acinclude.m4: Find configure.host in srcdir. + 2001-06-09 Alexandre Oliva , Stephen L Moshier + + * configure.in (AC_EXEEXT): Work around in case it expands to + nothing, as in autoconf 2.50. + * acinclude.m4: Likewise. + * aclocal.m4, configure: Rebuilt. + 2001-06-07 Tom Tromey For PR bootstrap/3075: *************** *** 73,78 **** --- 319,359 ---- * Makefile.am (CONFIG_STATUS_DEPENDENCIES): Use srcdir, not boehm_gc_basedir. + 2001-05-24 Bryce McKinlay + + * Makefile.am: Override gctest_OBJECTS so tests/test.c can be built. + (libgcjgc_la_SOURCES): Remove typo. + * tests/test.c: Fix struct names and includes for GC_GCJ_SUPPORT case. + * Makefile.in: Rebuilt. + + 2001-05-21 Bryce McKinlay + + Imported version version 6.0alpha7. + + * README, README.Mac, README.OS2, README.QUICK, README.alpha, + README.amiga, README.debugging, README.dj, README.hp, README.linux, + README.rs6000, README.sgi, README.solaris2, README.uts, + README.win32, SCoptions.amiga, backptr.h, barrett_diagram, + dbg_mlc.h, gc.h, gc.man, gc_alloc.h, gc_cpp.h, gc_hdrs.h, gc_mark.h, + gc_priv.h, gc_private.h, gc_typed.h, gcconfig.h, + hpux_irix_threads.c, makefile.depend, nursery.c, + solaris_threads.h, test.c, test_cpp.cc, weakpointer.h, cord/README, + cord/SCOPTIONS.amiga, cord/SMakefile.amiga, cord/cord.h, + cord/ec.h, cord/gc.h, cord/private/cord_pos.h, include/backptr.h, + include/gc_copy_descr.h, include/gc_nursery.h: Remove obsolete/moved + files. + + 2001-05-19 Hans Boehm + + * configure.host: Build with -fexceptions. + * linux_threads.c: Remember which thread stopped world for + + 2001-05-04 Loren J. Rittle + with final tuning by Bryce McKinlay + + * configure.in: Add support for --enable-threads=posix on FreeBSD. + * configure: Rebuilt. + 2001-05-01 Jeffrey Oldham * gc_priv.h (UNLOCK): Change type of GC_noop1 argument. diff -Nrc3pad gcc-3.0.4/boehm-gc/EMX_MAKEFILE gcc-3.1/boehm-gc/EMX_MAKEFILE *** gcc-3.0.4/boehm-gc/EMX_MAKEFILE Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/EMX_MAKEFILE Fri Aug 17 18:30:44 2001 *************** $(OBJS) test.o: $(srcdir)/gc_priv.h $(sr *** 77,83 **** # options such as -DSILENT affects the size of GC_arrays, # invalidating all .o files that rely on gc_priv.h ! mark.o typd_mlc.o finalize.o: $(srcdir)/gc_mark.h gc.a: $(OBJS) $(AR) ru gc.a $(OBJS) --- 77,83 ---- # options such as -DSILENT affects the size of GC_arrays, # invalidating all .o files that rely on gc_priv.h ! mark.o typd_mlc.o finalize.o: $(srcdir)/include/gc_mark.h $(srcdir)/include/private/gc_pmark.h gc.a: $(OBJS) $(AR) ru gc.a $(OBJS) *************** cord/de.exe: $(srcdir)/cord/de.c $(srcdi *** 120,132 **** $(CC) $(CFLAGS) -o cord/de.exe $(srcdir)/cord/de.c $(srcdir)/cord/cordbscs.o $(srcdir)/cord/cordxtra.o gc.a $(CURSES) clean: ! rm -f gc.a test.o gctest.exe output-local output-diff $(OBJS) \ setjmp_test mon.out gmon.out a.out core \ $(CORD_OBJS) cord/cordtest.exe cord/de.exe -rm -f *~ ! gctest.exe: test.o gc.a ! $(CC) $(CFLAGS) -o gctest.exe test.o gc.a # If an optimized setjmp_test generates a segmentation fault, # odds are your compiler is broken. Gctest may still work. --- 120,132 ---- $(CC) $(CFLAGS) -o cord/de.exe $(srcdir)/cord/de.c $(srcdir)/cord/cordbscs.o $(srcdir)/cord/cordxtra.o gc.a $(CURSES) clean: ! rm -f gc.a tests/test.o gctest.exe output-local output-diff $(OBJS) \ setjmp_test mon.out gmon.out a.out core \ $(CORD_OBJS) cord/cordtest.exe cord/de.exe -rm -f *~ ! gctest.exe: tests/test.o gc.a ! $(CC) $(CFLAGS) -o gctest.exe tests/test.o gc.a # If an optimized setjmp_test generates a segmentation fault, # odds are your compiler is broken. Gctest may still work. diff -Nrc3pad gcc-3.0.4/boehm-gc/Makefile.am gcc-3.1/boehm-gc/Makefile.am *** gcc-3.0.4/boehm-gc/Makefile.am Fri Jun 8 17:59:15 2001 --- gcc-3.1/boehm-gc/Makefile.am Tue Apr 23 03:20:04 2002 *************** *** 6,11 **** --- 6,13 ---- AUTOMAKE_OPTIONS = cygnus + SUBDIRS = include + # Multilib support variables. MULTISRCTOP = MULTIBUILDTOP = *************** toolexecdir = $(exec_prefix)/$(target_al *** 23,37 **** toolexeclibdir = $(toolexecdir)/lib$(MULTISUBDIR) endif ! toolexeclib_LTLIBRARIES = $(target_all) ! EXTRA_LTLIBRARIES = libgcjgc.la ! libgcjgc_la_SOURCES = allchblk.c alloc.c blacklst.c checksums.c \ ! gcconfig.h dbg_mlc.c dyn_load.c finalize.c gc.h gc_alloc.h gc_cpp.h \ ! gc_hdrs.h gc_mark.h gc_priv.h gc_private.h gc_typed.h gcj_mlc.c headers.c \ ! hpux_irix_threads.c linux_threads.c malloc.c mallocx.c mark.c mark_rts.c \ ! misc.c new_hblk.c obj_map.c os_dep.c pcr_interface.c ptr_chck.c \ ! real_malloc.c reclaim.c solaris_pthreads.c solaris_threads.c \ ! solaris_threads.h stubborn.c typd_mlc.c version.h weakpointer.h # Include THREADLIBS here to ensure that the correct versions of # linuxthread semaphore functions get linked: --- 25,48 ---- toolexeclibdir = $(toolexecdir)/lib$(MULTISUBDIR) endif ! noinst_LTLIBRARIES = libgcjgc.la libgcjgc_convenience.la ! ! GC_SOURCES = allchblk.c alloc.c blacklst.c checksums.c dbg_mlc.c \ ! dyn_load.c finalize.c gc_dlopen.c gcj_mlc.c headers.c irix_threads.c \ ! linux_threads.c malloc.c mallocx.c mark.c mark_rts.c misc.c new_hblk.c \ ! obj_map.c os_dep.c pcr_interface.c ptr_chck.c real_malloc.c reclaim.c \ ! solaris_pthreads.c solaris_threads.c specific.c stubborn.c typd_mlc.c \ ! backgraph.c win32_threads.c ! ! EXTRA_GC_SOURCES = alpha_mach_dep.s \ ! mips_sgi_mach_dep.S mips_ultrix_mach_dep.s powerpc_macosx_mach_dep.s \ ! rs6000_mach_dep.s sparc_mach_dep.S sparc_netbsd_mach_dep.s \ ! sparc_sunos4_mach_dep.s ia64_save_regs_in_stack.s ! ! libgcjgc_la_SOURCES = $(GC_SOURCES) ! libgcjgc_convenience_la_SOURCES = $(GC_SOURCES) ! EXTRA_libgcjgc_la_SOURCES = $(EXTRA_GC_SOURCES) ! EXTRA_libgcjgc_convenience_la_SOURCES = $(EXTRA_GC_SOURCES) # Include THREADLIBS here to ensure that the correct versions of # linuxthread semaphore functions get linked: *************** libgcjgc_la_LIBADD = @addobjs@ $(THREADL *** 39,53 **** libgcjgc_la_DEPENDENCIES = @addobjs@ libgcjgc_la_LDFLAGS = -version-info 1:1:0 -rpath $(toolexeclibdir) ! EXTRA_libgcjgc_la_SOURCES = alpha_mach_dep.s mips_sgi_mach_dep.s \ ! mips_ultrix_mach_dep.s rs6000_mach_dep.s sparc_mach_dep.s \ ! sparc_sunos4_mach_dep.s mach_dep.c ecos.cc ! AM_CXXFLAGS = @BOEHM_GC_CFLAGS@ ! AM_CFLAGS = @BOEHM_GC_CFLAGS@ check_PROGRAMS = gctest ! gctest_SOURCES = test.c gctest_LDADD = ./libgcjgc.la $(THREADLIBS) $(EXTRA_TEST_LIBS) gctest_LDFLAGS = -shared-libgcc TESTS_ENVIRONMENT = LD_LIBRARY_PATH=../../$(MULTIBUILDTOP)gcc --- 50,69 ---- libgcjgc_la_DEPENDENCIES = @addobjs@ libgcjgc_la_LDFLAGS = -version-info 1:1:0 -rpath $(toolexeclibdir) ! libgcjgc_convenience_la_LIBADD = @addobjs@ ! libgcjgc_convenience_la_DEPENDENCIES = @addobjs@ ! AM_CXXFLAGS = @GC_CFLAGS@ ! AM_CFLAGS = @GC_CFLAGS@ check_PROGRAMS = gctest ! # The following hack produces a warning from automake, but we need it in order ! # to build a file from a subdirectory. FIXME. ! test.o: tests/test.c ! $(COMPILE) -c $(srcdir)/tests/test.c ! # Using $< in the above seems to fail with the HP/UX on Itanium make. ! ! gctest_OBJECTS = test.o gctest_LDADD = ./libgcjgc.la $(THREADLIBS) $(EXTRA_TEST_LIBS) gctest_LDFLAGS = -shared-libgcc TESTS_ENVIRONMENT = LD_LIBRARY_PATH=../../$(MULTIBUILDTOP)gcc *************** TESTS = gctest *** 55,61 **** ## FIXME: relies on internal code generated by automake. all_objs = @addobjs@ $(libgcjgc_la_OBJECTS) ! $(all_objs) : gcconfig.h gc_priv.h gc_hdrs.h gc.h gc_mark.h ## FIXME: we shouldn't have to do this, but automake forces us to. .s.lo: --- 71,78 ---- ## FIXME: relies on internal code generated by automake. all_objs = @addobjs@ $(libgcjgc_la_OBJECTS) ! $(all_objs) : include/private/gcconfig.h include/private/gc_priv.h \ ! include/private/gc_hdrs.h include/gc.h include/gc_gcj.h include/gc_mark.h ## FIXME: we shouldn't have to do this, but automake forces us to. .s.lo: *************** $(all_objs) : gcconfig.h gc_priv.h gc_hd *** 67,76 **** ## CFLAGS, not those passed in from the top level make. LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) \ ! $(AM_CFLAGS) $(MY_CFLAGS) $(BOEHM_GC_CFLAGS) LINK = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(MY_CFLAGS) $(LDFLAGS) -o $@ ! AM_CFLAGS = @BOEHM_GC_CFLAGS@ # Work around what appears to be a GNU make bug handling MAKEFLAGS # values defined in terms of make variables, as is the case for CC and --- 84,93 ---- ## CFLAGS, not those passed in from the top level make. LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) \ ! $(AM_CFLAGS) $(MY_CFLAGS) $(GC_CFLAGS) LINK = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(MY_CFLAGS) $(LDFLAGS) -o $@ ! AM_CFLAGS = @GC_CFLAGS@ # Work around what appears to be a GNU make bug handling MAKEFLAGS # values defined in terms of make variables, as is the case for CC and diff -Nrc3pad gcc-3.0.4/boehm-gc/Makefile.direct gcc-3.1/boehm-gc/Makefile.direct *** gcc-3.0.4/boehm-gc/Makefile.direct Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/Makefile.direct Tue Feb 12 04:37:53 2002 *************** *** 0 **** --- 1,614 ---- + # This is the original manually generated Makefile. It may still be used + # to build the collector. + # + # Primary targets: + # gc.a - builds basic library + # c++ - adds C++ interface to library + # cords - adds cords (heavyweight strings) to library + # test - prints porting information, then builds basic version of gc.a, + # and runs some tests of collector and cords. Does not add cords or + # c++ interface to gc.a + # cord/de - builds dumb editor based on cords. + ABI_FLAG= + CC=cc $(ABI_FLAG) + CXX=g++ $(ABI_FLAG) + AS=as $(ABI_FLAG) + # The above doesn't work with gas, which doesn't run cpp. + # Define AS as `gcc -c -x assembler-with-cpp' instead. + # Under Irix 6, you will have to specify the ABI (-o32, -n32, or -64) + # if you use something other than the default ABI on your machine. + + # Redefining srcdir allows object code for the nonPCR version of the collector + # to be generated in different directories. + srcdir= . + VPATH= $(srcdir) + + CFLAGS= -O -I$(srcdir)/include -DATOMIC_UNCOLLECTABLE -DNO_SIGNALS -DNO_EXECUTE_PERMISSION -DSILENT -DALL_INTERIOR_POINTERS + + # To build the parallel collector on Linux, add to the above: + # -DGC_LINUX_THREADS -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC + # To build the parallel collector n a static library on HP/UX, add to the above: + # -DGC_HPUX_THREADS -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC -DUSE_HPUX_TLS -D_POSIX_C_SOURCE=199506L + + # HOSTCC and HOSTCFLAGS are used to build executables that will be run as + # part of the build process, i.e. on the build machine. These will usually + # be the same as CC and CFLAGS, except in a cross-compilation environment. + # Note that HOSTCFLAGS should include any -D flags that affect thread support. + HOSTCC=$(CC) + HOSTCFLAGS=$(CFLAGS) + + # For dynamic library builds, it may be necessary to add flags to generate + # PIC code, e.g. -fPIC on Linux. + + # Setjmp_test may yield overly optimistic results when compiled + # without optimization. + + # These define arguments influence the collector configuration: + # -DSILENT disables statistics printing, and improves performance. + # -DFIND_LEAK causes GC_find_leak to be initially set. + # This causes the collector to assume that all inaccessible + # objects should have been explicitly deallocated, and reports exceptions. + # Finalization and the test program are not usable in this mode. + # -DGC_SOLARIS_THREADS enables support for Solaris (thr_) threads. + # (Clients should also define GC_SOLARIS_THREADS and then include + # gc.h before performing thr_ or dl* or GC_ operations.) + # Must also define -D_REENTRANT. + # -DGC_SOLARIS_PTHREADS enables support for Solaris pthreads. + # Define SOLARIS_THREADS as well. + # -DGC_IRIX_THREADS enables support for Irix pthreads. See README.irix. + # -DGC_HPUX_THREADS enables support for HP/UX 11 pthreads. + # Also requires -D_REENTRANT or -D_POSIX_C_SOURCE=199506L. See README.hp. + # -DGC_LINUX_THREADS enables support for Xavier Leroy's Linux threads. + # see README.linux. -D_REENTRANT may also be required. + # -DALL_INTERIOR_POINTERS allows all pointers to the interior + # of objects to be recognized. (See gc_priv.h for consequences.) + # Alternatively, GC_all_interior_pointers can be set at process + # initialization time. + # -DSMALL_CONFIG tries to tune the collector for small heap sizes, + # usually causing it to use less space in such situations. + # Incremental collection no longer works in this case. + # -DLARGE_CONFIG tunes the collector for unusually large heaps. + # Necessary for heaps larger than about 500 MB on most machines. + # Recommended for heaps larger than about 64 MB. + # -DDONT_ADD_BYTE_AT_END is meaningful only with -DALL_INTERIOR_POINTERS or + # GC_all_interior_pointers = 1. Normally -DALL_INTERIOR_POINTERS + # causes all objects to be padded so that pointers just past the end of + # an object can be recognized. This can be expensive. (The padding + # is normally more than one byte due to alignment constraints.) + # -DDONT_ADD_BYTE_AT_END disables the padding. + # -DNO_SIGNALS does not disable signals during critical parts of + # the GC process. This is no less correct than many malloc + # implementations, and it sometimes has a significant performance + # impact. However, it is dangerous for many not-quite-ANSI C + # programs that call things like printf in asynchronous signal handlers. + # This is on by default. Turning it off has not been extensively tested with + # compilers that reorder stores. It should have been. + # -DNO_EXECUTE_PERMISSION may cause some or all of the heap to not + # have execute permission, i.e. it may be impossible to execute + # code from the heap. Currently this only affects the incremental + # collector on UNIX machines. It may greatly improve its performance, + # since this may avoid some expensive cache synchronization. + # -DGC_NO_OPERATOR_NEW_ARRAY declares that the C++ compiler does not support + # the new syntax "operator new[]" for allocating and deleting arrays. + # See gc_cpp.h for details. No effect on the C part of the collector. + # This is defined implicitly in a few environments. Must also be defined + # by clients that use gc_cpp.h. + # -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be + # defined as aliases for X, GC_realloc, and GC_free, respectively. + # Calloc and strdup are redefined in terms of the new malloc. X should + # be either GC_malloc or GC_malloc_uncollectable, or + # GC_debug_malloc_replacement. (The latter invokes GC_debug_malloc + # with dummy source location information, but still results in + # properly remembered call stacks on Linux/X86 and Solaris/SPARC.) + # The former is occasionally useful for working around leaks in code + # you don't want to (or can't) look at. It may not work for + # existing code, but it often does. Neither works on all platforms, + # since some ports use malloc or calloc to obtain system memory. + # (Probably works for UNIX, and win32.) If you build with DBG_HDRS_ALL, + # you should only use GC_debug_malloc_replacement as a malloc + # replacement. + # -DREDIRECT_REALLOC=X causes GC_realloc to be redirected to X. + # The canonical use is -DREDIRECT_REALLOC=GC_debug_realloc_replacement, + # together with -DREDIRECT_MALLOC=GC_debug_malloc_replacement to + # generate leak reports with call stacks for both malloc and realloc. + # -DIGNORE_FREE turns calls to free into a noop. Only useful with + # -DREDIRECT_MALLOC. + # -DNO_DEBUGGING removes GC_dump and the debugging routines it calls. + # Reduces code size slightly at the expense of debuggability. + # -DJAVA_FINALIZATION makes it somewhat safer to finalize objects out of + # order by specifying a nonstandard finalization mark procedure (see + # finalize.c). Objects reachable from finalizable objects will be marked + # in a sepearte postpass, and hence their memory won't be reclaimed. + # Not recommended unless you are implementing a language that specifies + # these semantics. Since 5.0, determines only only the initial value + # of GC_java_finalization variable. + # -DFINALIZE_ON_DEMAND causes finalizers to be run only in response + # to explicit GC_invoke_finalizers() calls. + # In 5.0 this became runtime adjustable, and this only determines the + # initial value of GC_finalize_on_demand. + # -DATOMIC_UNCOLLECTABLE includes code for GC_malloc_atomic_uncollectable. + # This is useful if either the vendor malloc implementation is poor, + # or if REDIRECT_MALLOC is used. + # -DHBLKSIZE=ddd, where ddd is a power of 2 between 512 and 16384, explicitly + # sets the heap block size. Each heap block is devoted to a single size and + # kind of object. For the incremental collector it makes sense to match + # the most likely page size. Otherwise large values result in more + # fragmentation, but generally better performance for large heaps. + # -DUSE_MMAP use MMAP instead of sbrk to get new memory. + # Works for Solaris and Irix. + # -DUSE_MUNMAP causes memory to be returned to the OS under the right + # circumstances. This currently disables VM-based incremental collection. + # This is currently experimental, and works only under some Unix, + # Linux and Windows versions. + # -DMMAP_STACKS (for Solaris threads) Use mmap from /dev/zero rather than + # GC_scratch_alloc() to get stack memory. + # -DPRINT_BLACK_LIST Whenever a black list entry is added, i.e. whenever + # the garbage collector detects a value that looks almost, but not quite, + # like a pointer, print both the address containing the value, and the + # value of the near-bogus-pointer. Can be used to identifiy regions of + # memory that are likely to contribute misidentified pointers. + # -DKEEP_BACK_PTRS Add code to save back pointers in debugging headers + # for objects allocated with the debugging allocator. If all objects + # through GC_MALLOC with GC_DEBUG defined, this allows the client + # to determine how particular or randomly chosen objects are reachable + # for debugging/profiling purposes. The gc_backptr.h interface is + # implemented only if this is defined. + # -DGC_ASSERTIONS Enable some internal GC assertion checking. Currently + # this facility is only used in a few places. It is intended primarily + # for debugging of the garbage collector itself, but could also + # -DDBG_HDRS_ALL Make sure that all objects have debug headers. Increases + # the reliability (from 99.9999% to 100%) of some of the debugging + # code (especially KEEP_BACK_PTRS). Makes -DSHORT_DBG_HDRS possible. + # Assumes that all client allocation is done through debugging + # allocators. + # -DSHORT_DBG_HDRS Assume that all objects have debug headers. Shorten + # the headers to minimize object size, at the expense of checking for + # writes past the end of an object. This is intended for environments + # in which most client code is written in a "safe" language, such as + # Scheme or Java. Assumes that all client allocation is done using + # the GC_debug_ functions, or through the macros that expand to these, + # or by redirecting malloc to GC_debug_malloc_replacement. + # (Also eliminates the field for the requested object size.) + # occasionally be useful for debugging of client code. Slows down the + # collector somewhat, but not drastically. + # -DSAVE_CALL_COUNT= Set the number of call frames saved with objects + # allocated through the debugging interface. Affects the amount of + # information generated in leak reports. Only matters on platforms + # on which we can quickly generate call stacks, currently Linux/(X86 & SPARC) + # and Solaris/SPARC and platforms that provide execinfo.h. + # Default is zero. On X86, client + # code should NOT be compiled with -fomit-frame-pointer. + # -DSAVE_CALL_NARGS= Set the number of functions arguments to be + # saved with each call frame. Default is zero. Ignored if we + # don't know how to retrieve arguments on the platform. + # -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly + # altered stubborn objects, at substantial performance cost. + # Use only for debugging of the incremental collector. + # -DGC_GCJ_SUPPORT includes support for gcj (and possibly other systems + # that include a pointer to a type descriptor in each allocated object). + # Building this way requires an ANSI C compiler. + # -DUSE_I686_PREFETCH causes the collector to issue Pentium III style + # prefetch instructions. No effect except on X86 Linux platforms. + # Assumes a very recent gcc-compatible compiler and assembler. + # (Gas prefetcht0 support was added around May 1999.) + # Empirically the code appears to still run correctly on Pentium II + # processors, though with no performance benefit. May not run on other + # X86 processors? In some cases this improves performance by + # 15% or so. + # -DUSE_3DNOW_PREFETCH causes the collector to issue AMD 3DNow style + # prefetch instructions. Same restrictions as USE_I686_PREFETCH. + # UNTESTED!! + # -DGC_USE_LD_WRAP in combination with the gld flags listed in README.linux + # causes the collector some system and pthread calls in a more transparent + # fashion than the usual macro-based approach. Requires GNU ld, and + # currently probably works only with Linux. + # -DTHREAD_LOCAL_ALLOC defines GC_local_malloc(), GC_local_malloc_atomic() + # and GC_local_gcj_malloc(). Needed for gc_gcj.h interface. These allocate + # in a way that usually does not involve acquisition of a global lock. + # Currently requires -DGC_LINUX_THREADS, but should be easy to port to + # other pthreads environments. Recommended for multiprocessors. + # -DPARALLEL_MARK allows the marker to run in multiple threads. Recommended + # for multiprocessors. Currently requires Linux on X86 or IA64, though + # support for other Posix platforms should be fairly easy to add, + # if the thread implementation is otherwise supported. + # -DNO_GETENV prevents the collector from looking at environment variables. + # These may otherwise alter its configuration, or turn off GC altogether. + # I don't know of a reason to disable this, except possibly if the + # resulting process runs as a privileged user? + # -DUSE_GLOBAL_ALLOC. Win32 only. Use GlobalAlloc instead of + # VirtualAlloc to allocate the heap. May be needed to work around + # a Windows NT/2000 issue. Incompatible with USE_MUNMAP. + # See README.win32 for details. + # -DMAKE_BACK_GRAPH. Enable GC_PRINT_BACK_HEIGHT environment variable. + # See README.environment for details. Experimental. Limited platform + # support. Implies DBG_HDRS_ALL. All allocation should be done using + # the debug interface. + # -DSTUBBORN_ALLOC allows allocation of "hard to change" objects, and thus + # makes incremental collection easier. Was enabled by default until 6.0. + # Rarely used, to my knowledge. + # + + CXXFLAGS= $(CFLAGS) + AR= ar + RANLIB= ranlib + + + OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o irix_threads.o linux_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o gcj_mlc.o specific.o gc_dlopen.o backgraph.o + + CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c irix_threads.c linux_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c gcj_mlc.c specific.c gc_dlopen.c backgraph.c + + CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/de.c cord/cordtest.c include/cord.h include/ec.h include/private/cord_pos.h cord/de_win.c cord/de_win.h cord/de_cmds.h cord/de_win.ICO cord/de_win.RC + + CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o + + SRCS= $(CSRCS) mips_sgi_mach_dep.s rs6000_mach_dep.s alpha_mach_dep.s \ + sparc_mach_dep.S include/gc.h include/gc_typed.h \ + include/private/gc_hdrs.h include/private/gc_priv.h \ + include/private/gcconfig.h include/private/gc_pmark.h \ + include/gc_inl.h include/gc_inline.h include/gc_mark.h \ + threadlibs.c if_mach.c if_not_there.c gc_cpp.cc include/gc_cpp.h \ + gcname.c include/weakpointer.h include/private/gc_locks.h \ + gcc_support.c mips_ultrix_mach_dep.s include/gc_alloc.h \ + include/new_gc_alloc.h include/javaxfc.h sparc_sunos4_mach_dep.s \ + sparc_netbsd_mach_dep.s \ + include/private/solaris_threads.h include/gc_backptr.h \ + hpux_test_and_clear.s include/gc_gcj.h \ + include/gc_local_alloc.h include/private/dbg_mlc.h \ + include/private/specific.h powerpc_macosx_mach_dep.s \ + include/leak_detector.h include/gc_amiga_redirects.h \ + include/gc_pthread_redirects.h $(CORD_SRCS) + + DOC_FILES= README.QUICK doc/README.Mac doc/README.MacOSX doc/README.OS2 \ + doc/README.amiga doc/README.cords doc/debugging.html \ + doc/README.dj doc/README.hp doc/README.linux doc/README.rs6000 \ + doc/README.sgi doc/README.solaris2 doc/README.uts \ + doc/README.win32 doc/barrett_diagram doc/README \ + doc/README.contributors doc/README.changes doc/gc.man \ + doc/README.environment doc/tree.html doc/gcdescr.html \ + doc/README.autoconf doc/README.macros doc/README.ews4800 + + TESTS= tests/test.c tests/test_cpp.cc tests/trace_test.c \ + tests/leak_test.c tests/thread_leak_test.c + + GNU_BUILD_FILES= configure.in Makefile.am configure acinclude.m4 \ + libtool.m4 install-sh configure.host Makefile.in \ + aclocal.m4 config.sub config.guess ltconfig \ + ltmain.sh mkinstalldirs + + OTHER_MAKEFILES= OS2_MAKEFILE NT_MAKEFILE NT_THREADS_MAKEFILE gc.mak \ + BCC_MAKEFILE EMX_MAKEFILE WCC_MAKEFILE Makefile.dj \ + PCR-Makefile SMakefile.amiga Makefile.DLLs \ + digimars.mak Makefile.direct + # Makefile and Makefile.direct are copies of each other. + + OTHER_FILES= Makefile setjmp_t.c callprocs pc_excludes \ + MacProjects.sit.hqx MacOS.c \ + Mac_files/datastart.c Mac_files/dataend.c \ + Mac_files/MacOS_config.h Mac_files/MacOS_Test_config.h \ + add_gc_prefix.c gc_cpp.cpp win32_threads.c \ + version.h AmigaOS.c \ + $(TESTS) $(GNU_BUILD_FILES) $(OTHER_MAKEFILES) + + CORD_INCLUDE_FILES= $(srcdir)/include/gc.h $(srcdir)/include/cord.h \ + $(srcdir)/include/ec.h $(srcdir)/include/private/cord_pos.h + + UTILS= if_mach if_not_there threadlibs + + # Libraries needed for curses applications. Only needed for de. + CURSES= -lcurses -ltermlib + + # The following is irrelevant on most systems. But a few + # versions of make otherwise fork the shell specified in + # the SHELL environment variable. + SHELL= /bin/sh + + SPECIALCFLAGS = -I$(srcdir)/include + # Alternative flags to the C compiler for mach_dep.c. + # Mach_dep.c often doesn't like optimization, and it's + # not time-critical anyway. + # Set SPECIALCFLAGS to -q nodirect_code on Encore. + + all: gc.a gctest + + BSD-pkg-all: bsd-libgc.a + + bsd-libgc.a: + $(MAKE) CFLAGS="$(CFLAGS)" clean c++-t + mv gc.a bsd-libgc.a + + BSD-pkg-install: BSD-pkg-all + ${CP} bsd-libgc.a libgc.a + ${INSTALL_DATA} libgc.a ${PREFIX}/lib + ${INSTALL_DATA} gc.h gc_cpp.h ${PREFIX}/include + + pcr: PCR-Makefile include/private/gc_private.h include/private/gc_hdrs.h \ + include/private/gc_locks.h include/gc.h include/private/gcconfig.h \ + mach_dep.o $(SRCS) + $(MAKE) -f PCR-Makefile depend + $(MAKE) -f PCR-Makefile + + $(OBJS) tests/test.o dyn_load.o dyn_load_sunos53.o: \ + $(srcdir)/include/private/gc_priv.h \ + $(srcdir)/include/private/gc_hdrs.h $(srcdir)/include/private/gc_locks.h \ + $(srcdir)/include/gc.h \ + $(srcdir)/include/private/gcconfig.h $(srcdir)/include/gc_typed.h \ + Makefile + # The dependency on Makefile is needed. Changing + # options such as -DSILENT affects the size of GC_arrays, + # invalidating all .o files that rely on gc_priv.h + + mark.o typd_mlc.o finalize.o ptr_chck.o: $(srcdir)/include/gc_mark.h $(srcdir)/include/private/gc_pmark.h + + specific.o linux_threads.o: $(srcdir)/include/private/specific.h + + solaris_threads.o solaris_pthreads.o: $(srcdir)/include/private/solaris_threads.h + + dbg_mlc.o gcj_mlc.o: $(srcdir)/include/private/dbg_mlc.h + + tests/test.o: tests $(srcdir)/tests/test.c + $(CC) $(CFLAGS) -c $(srcdir)/tests/test.c + mv test.o tests/test.o + + tests: + mkdir tests + + base_lib gc.a: $(OBJS) dyn_load.o $(UTILS) + echo > base_lib + rm -f dont_ar_1 + ./if_mach SPARC SUNOS5 touch dont_ar_1 + ./if_mach SPARC SUNOS5 $(AR) rus gc.a $(OBJS) dyn_load.o + ./if_mach M68K AMIGA touch dont_ar_1 + ./if_mach M68K AMIGA $(AR) -vrus gc.a $(OBJS) dyn_load.o + ./if_not_there dont_ar_1 $(AR) ru gc.a $(OBJS) dyn_load.o + ./if_not_there dont_ar_1 $(RANLIB) gc.a || cat /dev/null + # ignore ranlib failure; that usually means it doesn't exist, and isn't needed + + cords: $(CORD_OBJS) cord/cordtest $(UTILS) + rm -f dont_ar_3 + ./if_mach SPARC SUNOS5 touch dont_ar_3 + ./if_mach SPARC SUNOS5 $(AR) rus gc.a $(CORD_OBJS) + ./if_mach M68K AMIGA touch dont_ar_3 + ./if_mach M68K AMIGA $(AR) -vrus gc.a $(CORD_OBJS) + ./if_not_there dont_ar_3 $(AR) ru gc.a $(CORD_OBJS) + ./if_not_there dont_ar_3 $(RANLIB) gc.a || cat /dev/null + + gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/include/gc_cpp.h $(srcdir)/include/gc.h Makefile + $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc + + test_cpp: $(srcdir)/tests/test_cpp.cc $(srcdir)/include/gc_cpp.h gc_cpp.o $(srcdir)/include/gc.h \ + base_lib $(UTILS) + rm -f test_cpp + ./if_mach HP_PA HPUX $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/tests/test_cpp.cc gc_cpp.o gc.a -ldld `./threadlibs` + ./if_not_there test_cpp $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/tests/test_cpp.cc gc_cpp.o gc.a `./threadlibs` + + c++-t: c++ + ./test_cpp 1 + + c++-nt: c++ + @echo "Use ./test_cpp 1 to test the leak library" + + c++: gc_cpp.o $(srcdir)/include/gc_cpp.h test_cpp + rm -f dont_ar_4 + ./if_mach SPARC SUNOS5 touch dont_ar_4 + ./if_mach SPARC SUNOS5 $(AR) rus gc.a gc_cpp.o + ./if_mach M68K AMIGA touch dont_ar_4 + ./if_mach M68K AMIGA $(AR) -vrus gc.a gc_cpp.o + ./if_not_there dont_ar_4 $(AR) ru gc.a gc_cpp.o + ./if_not_there dont_ar_4 $(RANLIB) gc.a || cat /dev/null + ./test_cpp 1 + echo > c++ + + dyn_load_sunos53.o: dyn_load.c + $(CC) $(CFLAGS) -DSUNOS53_SHARED_LIB -c $(srcdir)/dyn_load.c -o $@ + + # SunOS5 shared library version of the collector + sunos5gc.so: $(OBJS) dyn_load_sunos53.o + $(CC) -G -o sunos5gc.so $(OBJS) dyn_load_sunos53.o -ldl + ln sunos5gc.so libgc.so + + # Alpha/OSF shared library version of the collector + libalphagc.so: $(OBJS) + ld -shared -o libalphagc.so $(OBJS) dyn_load.o -lc + ln libalphagc.so libgc.so + + # IRIX shared library version of the collector + libirixgc.so: $(OBJS) dyn_load.o + ld -shared $(ABI_FLAG) -o libirixgc.so $(OBJS) dyn_load.o -lc + ln libirixgc.so libgc.so + + # Linux shared library version of the collector + liblinuxgc.so: $(OBJS) dyn_load.o + gcc -shared -o liblinuxgc.so $(OBJS) dyn_load.o + ln liblinuxgc.so libgc.so + + # Alternative Linux rule. This is preferable, but is likely to break the + # Makefile for some non-linux platforms. + # LIBOBJS= $(patsubst %.o, %.lo, $(OBJS)) + # + #.SUFFIXES: .lo $(SUFFIXES) + # + #.c.lo: + # $(CC) $(CFLAGS) $(CPPFLAGS) -fPIC -c $< -o $@ + # + # liblinuxgc.so: $(LIBOBJS) dyn_load.lo + # gcc -shared -Wl,-soname=libgc.so.0 -o libgc.so.0 $(LIBOBJS) dyn_load.lo + # touch liblinuxgc.so + + mach_dep.o: $(srcdir)/mach_dep.c $(srcdir)/mips_sgi_mach_dep.s $(srcdir)/mips_ultrix_mach_dep.s \ + $(srcdir)/rs6000_mach_dep.s $(srcdir)/powerpc_macosx_mach_dep.s $(UTILS) + rm -f mach_dep.o + ./if_mach MIPS IRIX5 $(AS) -o mach_dep.o $(srcdir)/mips_sgi_mach_dep.s + ./if_mach MIPS RISCOS $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s + ./if_mach MIPS ULTRIX $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s + ./if_mach RS6000 "" $(AS) -o mach_dep.o $(srcdir)/rs6000_mach_dep.s + ./if_mach POWERPC MACOSX $(AS) -o mach_dep.o $(srcdir)/powerpc_macosx_mach_dep.s + # ./if_mach ALPHA "" $(AS) -o mach_dep.o $(srcdir)/alpha_mach_dep.s + # alpha_mach_dep.s assumes that pointers are not saved in fp registers. + # Gcc on a 21264 can spill pointers to fp registers. Oops. + ./if_mach SPARC SUNOS5 $(CC) -c -o mach_dep.o $(srcdir)/sparc_mach_dep.S + ./if_mach SPARC SUNOS4 $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s + ./if_mach SPARC OPENBSD $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s + ./if_mach SPARC NETBSD $(AS) -o mach_dep.o $(srcdir)/sparc_netbsd_mach_dep.s + ./if_mach IA64 "" as $(AS_ABI_FLAG) -o ia64_save_regs_in_stack.o $(srcdir)/ia64_save_regs_in_stack.s + ./if_mach IA64 "" $(CC) -c -o mach_dep1.o $(SPECIALCFLAGS) $(srcdir)/mach_dep.c + ./if_mach IA64 "" ld -r -o mach_dep.o mach_dep1.o ia64_save_regs_in_stack.o + ./if_not_there mach_dep.o $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c + + mark_rts.o: $(srcdir)/mark_rts.c $(UTILS) + rm -f mark_rts.o + -./if_mach ALPHA OSF1 $(CC) -c $(CFLAGS) -Wo,-notail $(srcdir)/mark_rts.c + ./if_not_there mark_rts.o $(CC) -c $(CFLAGS) $(srcdir)/mark_rts.c + # Work-around for DEC optimizer tail recursion elimination bug. + # The ALPHA-specific line should be removed if gcc is used. + + alloc.o: version.h + + cord: + mkdir cord + + cord/cordbscs.o: cord $(srcdir)/cord/cordbscs.c $(CORD_INCLUDE_FILES) + $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordbscs.c + mv cordbscs.o cord/cordbscs.o + # not all compilers understand -o filename + + cord/cordxtra.o: cord $(srcdir)/cord/cordxtra.c $(CORD_INCLUDE_FILES) + $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordxtra.c + mv cordxtra.o cord/cordxtra.o + + cord/cordprnt.o: cord $(srcdir)/cord/cordprnt.c $(CORD_INCLUDE_FILES) + $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordprnt.c + mv cordprnt.o cord/cordprnt.o + + cord/cordtest: $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a $(UTILS) + rm -f cord/cordtest + ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a -lucb + ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a -ldld `./threadlibs` + ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a `./threadlibs` + ./if_not_there cord/cordtest $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a `./threadlibs` + + cord/de: $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(UTILS) + rm -f cord/de + ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -lucb `./threadlibs` + ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -ldld `./threadlibs` + ./if_mach RS6000 "" $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses + ./if_mach POWERPC MACOSX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a + ./if_mach I386 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` + ./if_mach ALPHA LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` + ./if_mach IA64 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` + ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses + ./if_not_there cord/de $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) `./threadlibs` + + if_mach: $(srcdir)/if_mach.c $(srcdir)/include/private/gcconfig.h + $(HOSTCC) $(HOSTCFLAGS) -o if_mach $(srcdir)/if_mach.c + + threadlibs: $(srcdir)/threadlibs.c $(srcdir)/include/private/gcconfig.h Makefile + $(HOSTCC) $(HOSTCFLAGS) -o threadlibs $(srcdir)/threadlibs.c + + if_not_there: $(srcdir)/if_not_there.c + $(HOSTCC) $(HOSTCFLAGS) -o if_not_there $(srcdir)/if_not_there.c + + clean: + rm -f gc.a *.o *.exe tests/*.o gctest gctest_dyn_link test_cpp \ + setjmp_test mon.out gmon.out a.out core if_not_there if_mach \ + threadlibs $(CORD_OBJS) cord/cordtest cord/de + -rm -f *~ + + gctest: tests/test.o gc.a $(UTILS) + rm -f gctest + ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o gctest tests/test.o gc.a -lucb + ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o gctest tests/test.o gc.a -ldld `./threadlibs` + ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o gctest tests/test.o gc.a `./threadlibs` + ./if_not_there gctest $(CC) $(CFLAGS) -o gctest tests/test.o gc.a `./threadlibs` + + # If an optimized setjmp_test generates a segmentation fault, + # odds are your compiler is broken. Gctest may still work. + # Try compiling setjmp_t.c unoptimized. + setjmp_test: $(srcdir)/setjmp_t.c $(srcdir)/include/gc.h $(UTILS) + $(CC) $(CFLAGS) -o setjmp_test $(srcdir)/setjmp_t.c + + test: KandRtest cord/cordtest + cord/cordtest + + # Those tests that work even with a K&R C compiler: + KandRtest: setjmp_test gctest + ./setjmp_test + ./gctest + + add_gc_prefix: $(srcdir)/add_gc_prefix.c $(srcdir)/version.h + $(CC) -o add_gc_prefix $(srcdir)/add_gc_prefix.c + + gcname: $(srcdir)/gcname.c $(srcdir)/version.h + $(CC) -o gcname $(srcdir)/gcname.c + + gc.tar: $(SRCS) $(DOC_FILES) $(OTHER_FILES) add_gc_prefix gcname + cp Makefile Makefile.old + cp Makefile.direct Makefile + rm -f `./gcname` + ln -s . `./gcname` + ./add_gc_prefix $(SRCS) $(DOC_FILES) $(OTHER_FILES) > /tmp/gc.tar-files + tar cvfh gc.tar `cat /tmp/gc.tar-files` + cp gc.tar `./gcname`.tar + gzip `./gcname`.tar + rm `./gcname` + + pc_gc.tar: $(SRCS) $(OTHER_FILES) + tar cvfX pc_gc.tar pc_excludes $(SRCS) $(OTHER_FILES) + + floppy: pc_gc.tar + -mmd a:/cord + -mmd a:/cord/private + -mmd a:/include + -mmd a:/include/private + mkdir /tmp/pc_gc + cat pc_gc.tar | (cd /tmp/pc_gc; tar xvf -) + -mcopy -tmn /tmp/pc_gc/* a: + -mcopy -tmn /tmp/pc_gc/cord/* a:/cord + -mcopy -mn /tmp/pc_gc/cord/de_win.ICO a:/cord + -mcopy -tmn /tmp/pc_gc/cord/private/* a:/cord/private + -mcopy -tmn /tmp/pc_gc/include/* a:/include + -mcopy -tmn /tmp/pc_gc/include/private/* a:/include/private + rm -r /tmp/pc_gc + + gc.tar.Z: gc.tar + compress gc.tar + + gc.tar.gz: gc.tar + gzip gc.tar + + lint: $(CSRCS) tests/test.c + lint -DLINT $(CSRCS) tests/test.c | egrep -v "possible pointer alignment problem|abort|exit|sbrk|mprotect|syscall|change in ANSI|improper alignment" + + # BTL: added to test shared library version of collector. + # Currently works only under SunOS5. Requires GC_INIT call from statically + # loaded client code. + ABSDIR = `pwd` + gctest_dyn_link: tests/test.o libgc.so + $(CC) -L$(ABSDIR) -R$(ABSDIR) -o gctest_dyn_link tests/test.o -lgc -ldl -lthread + + gctest_irix_dyn_link: tests/test.o libirixgc.so + $(CC) -L$(ABSDIR) -o gctest_irix_dyn_link tests/test.o -lirixgc + + # The following appear to be dead, especially since libgc_globals.h + # is apparently lost. + test_dll.o: tests/test.c libgc_globals.h + $(CC) $(CFLAGS) -DGC_USE_DLL -c tests/test.c -o test_dll.o + + test_dll: test_dll.o libgc_dll.a libgc.dll + $(CC) test_dll.o -L$(ABSDIR) -lgc_dll -o test_dll + + SYM_PREFIX-libgc=GC + + # Uncomment the following line to build a GNU win32 DLL + # include Makefile.DLLs + + reserved_namespace: $(SRCS) + for file in $(SRCS) tests/test.c tests/test_cpp.cc; do \ + sed s/GC_/_GC_/g < $$file > tmp; \ + cp tmp $$file; \ + done + + user_namespace: $(SRCS) + for file in $(SRCS) tests/test.c tests/test_cpp.cc; do \ + sed s/_GC_/GC_/g < $$file > tmp; \ + cp tmp $$file; \ + done diff -Nrc3pad gcc-3.0.4/boehm-gc/Makefile.dist gcc-3.1/boehm-gc/Makefile.dist *** gcc-3.0.4/boehm-gc/Makefile.dist Fri Dec 15 08:13:12 2000 --- gcc-3.1/boehm-gc/Makefile.dist Fri Aug 17 18:30:44 2001 *************** *** 1,6 **** # Primary targets: # gc.a - builds basic library - # libgc.a - builds library for use with g++ "-fgc-keyword" extension # c++ - adds C++ interface to library # cords - adds cords (heavyweight strings) to library # test - prints porting information, then builds basic version of gc.a, --- 1,8 ---- + # This is the original manually generated Makefile. It may stil be used + # to build the collector. + # # Primary targets: # gc.a - builds basic library # c++ - adds C++ interface to library # cords - adds cords (heavyweight strings) to library # test - prints porting information, then builds basic version of gc.a, *************** *** 9,15 **** # cord/de - builds dumb editor based on cords. ABI_FLAG= CC=cc $(ABI_FLAG) - HOSTCC=$(CC) CXX=g++ $(ABI_FLAG) AS=as $(ABI_FLAG) # The above doesn't work with gas, which doesn't run cpp. --- 11,16 ---- *************** AS=as $(ABI_FLAG) *** 17,55 **** # Under Irix 6, you will have to specify the ABI (-o32, -n32, or -64) # if you use something other than the default ABI on your machine. ! CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_SIGNALS -DNO_EXECUTE_PERMISSION -DALL_INTERIOR_POINTERS -DSILENT # For dynamic library builds, it may be necessary to add flags to generate # PIC code, e.g. -fPIC on Linux. # Setjmp_test may yield overly optimistic results when compiled # without optimization. # -DSILENT disables statistics printing, and improves performance. # -DFIND_LEAK causes GC_find_leak to be initially set. # This causes the collector to assume that all inaccessible # objects should have been explicitly deallocated, and reports exceptions. # Finalization and the test program are not usable in this mode. ! # -DSOLARIS_THREADS enables support for Solaris (thr_) threads. ! # (Clients should also define SOLARIS_THREADS and then include # gc.h before performing thr_ or dl* or GC_ operations.) # Must also define -D_REENTRANT. ! # -D_SOLARIS_PTHREADS enables support for Solaris pthreads. # Define SOLARIS_THREADS as well. ! # -DIRIX_THREADS enables support for Irix pthreads. See README.irix. ! # -DHPUX_THREADS enables support for HP/UX 11 pthreads. ! # Also requires -D_REENTRANT. See README.hp. ! # -DLINUX_THREADS enables support for Xavier Leroy's Linux threads. # see README.linux. -D_REENTRANT may also be required. # -DALL_INTERIOR_POINTERS allows all pointers to the interior # of objects to be recognized. (See gc_priv.h for consequences.) # -DSMALL_CONFIG tries to tune the collector for small heap sizes, # usually causing it to use less space in such situations. # Incremental collection no longer works in this case. # -DLARGE_CONFIG tunes the collector for unusually large heaps. # Necessary for heaps larger than about 500 MB on most machines. # Recommended for heaps larger than about 64 MB. ! # -DDONT_ADD_BYTE_AT_END is meaningful only with ! # -DALL_INTERIOR_POINTERS. Normally -DALL_INTERIOR_POINTERS # causes all objects to be padded so that pointers just past the end of # an object can be recognized. This can be expensive. (The padding # is normally more than one byte due to alignment constraints.) --- 18,77 ---- # Under Irix 6, you will have to specify the ABI (-o32, -n32, or -64) # if you use something other than the default ABI on your machine. ! # Redefining srcdir allows object code for the nonPCR version of the collector ! # to be generated in different directories. ! srcdir= . ! VPATH= $(srcdir) ! ! CFLAGS= -O -I$(srcdir)/include -DATOMIC_UNCOLLECTABLE -DNO_SIGNALS -DNO_EXECUTE_PERMISSION -DSILENT -DALL_INTERIOR_POINTERS ! ! # To build the parallel collector on Linux, add to the above: ! # -DGC_LINUX_THREADS -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC ! # To build the parallel collector n a static library on HP/UX, add to the above: ! # -DGC_HPUX_THREADS -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC -DUSE_HPUX_TLS -D_POSIX_C_SOURCE=199506L ! ! # HOSTCC and HOSTCFLAGS are used to build executables that will be run as ! # part of the build process, i.e. on the build machine. These will usually ! # be the same as CC and CFLAGS, except in a cross-compilation environment. ! # Note that HOSTCFLAGS should include any -D flags that affect thread support. ! HOSTCC=$(CC) ! HOSTCFLAGS=$(CFLAGS) # For dynamic library builds, it may be necessary to add flags to generate # PIC code, e.g. -fPIC on Linux. # Setjmp_test may yield overly optimistic results when compiled # without optimization. + + # These define arguments influence the collector configuration: # -DSILENT disables statistics printing, and improves performance. # -DFIND_LEAK causes GC_find_leak to be initially set. # This causes the collector to assume that all inaccessible # objects should have been explicitly deallocated, and reports exceptions. # Finalization and the test program are not usable in this mode. ! # -DGC_SOLARIS_THREADS enables support for Solaris (thr_) threads. ! # (Clients should also define GC_SOLARIS_THREADS and then include # gc.h before performing thr_ or dl* or GC_ operations.) # Must also define -D_REENTRANT. ! # -DGC_SOLARIS_PTHREADS enables support for Solaris pthreads. # Define SOLARIS_THREADS as well. ! # -DGC_IRIX_THREADS enables support for Irix pthreads. See README.irix. ! # -DGC_HPUX_THREADS enables support for HP/UX 11 pthreads. ! # Also requires -D_REENTRANT or -D_POSIX_C_SOURCE=199506L. See README.hp. ! # -DGC_LINUX_THREADS enables support for Xavier Leroy's Linux threads. # see README.linux. -D_REENTRANT may also be required. # -DALL_INTERIOR_POINTERS allows all pointers to the interior # of objects to be recognized. (See gc_priv.h for consequences.) + # Alternatively, GC_all_interior_pointers can be set at process + # initialization time. # -DSMALL_CONFIG tries to tune the collector for small heap sizes, # usually causing it to use less space in such situations. # Incremental collection no longer works in this case. # -DLARGE_CONFIG tunes the collector for unusually large heaps. # Necessary for heaps larger than about 500 MB on most machines. # Recommended for heaps larger than about 64 MB. ! # -DDONT_ADD_BYTE_AT_END is meaningful only with -DALL_INTERIOR_POINTERS or ! # GC_all_interior_pointers = 1. Normally -DALL_INTERIOR_POINTERS # causes all objects to be padded so that pointers just past the end of # an object can be recognized. This can be expensive. (The padding # is normally more than one byte due to alignment constraints.) *************** CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_S *** 73,84 **** # -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined # as aliases for X, GC_realloc, and GC_free, respectively. # Calloc is redefined in terms of the new malloc. X should ! # be either GC_malloc or GC_malloc_uncollectable. # The former is occasionally useful for working around leaks in code # you don't want to (or can't) look at. It may not work for # existing code, but it often does. Neither works on all platforms, # since some ports use malloc or calloc to obtain system memory. # (Probably works for UNIX, and win32.) # -DIGNORE_FREE turns calls to free into a noop. Only useful with # -DREDIRECT_MALLOC. # -DNO_DEBUGGING removes GC_dump and the debugging routines it calls. --- 95,113 ---- # -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined # as aliases for X, GC_realloc, and GC_free, respectively. # Calloc is redefined in terms of the new malloc. X should ! # be either GC_malloc or GC_malloc_uncollectable, or ! # GC_debug_malloc_replacement. (The latter invokes GC_debug_malloc ! # with dummy source location information, but still results in ! # properly remembered call stacks on Linux/X86 and Solaris/SPARC.) # The former is occasionally useful for working around leaks in code # you don't want to (or can't) look at. It may not work for # existing code, but it often does. Neither works on all platforms, # since some ports use malloc or calloc to obtain system memory. # (Probably works for UNIX, and win32.) + # -DREDIRECT_REALLOC=X causes GC_realloc to be redirected to X. + # The canonical use is -DREDIRECT_REALLOC=GC_debug_realloc_replacement, + # together with -DREDIRECT_MALLOC=GC_debug_malloc_replacement to + # generate leak reports with call stacks for both malloc and realloc. # -DIGNORE_FREE turns calls to free into a noop. Only useful with # -DREDIRECT_MALLOC. # -DNO_DEBUGGING removes GC_dump and the debugging routines it calls. *************** CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_S *** 119,131 **** # for objects allocated with the debugging allocator. If all objects # through GC_MALLOC with GC_DEBUG defined, this allows the client # to determine how particular or randomly chosen objects are reachable ! # for debugging/profiling purposes. The backptr.h interface is # implemented only if this is defined. # -DGC_ASSERTIONS Enable some internal GC assertion checking. Currently # this facility is only used in a few places. It is intended primarily # for debugging of the garbage collector itself, but could also # occasionally be useful for debugging of client code. Slows down the # collector somewhat, but not drastically. # -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly # altered stubborn objects, at substantial performance cost. # Use only for debugging of the incremental collector. --- 148,179 ---- # for objects allocated with the debugging allocator. If all objects # through GC_MALLOC with GC_DEBUG defined, this allows the client # to determine how particular or randomly chosen objects are reachable ! # for debugging/profiling purposes. The gc_backptr.h interface is # implemented only if this is defined. # -DGC_ASSERTIONS Enable some internal GC assertion checking. Currently # this facility is only used in a few places. It is intended primarily # for debugging of the garbage collector itself, but could also + # -DDBG_HDRS_ALL Make sure that all objects have debug headers. Increases + # the reliability (from 99.9999% to 100%) of some of the debugging + # code (especially KEEP_BACK_PTRS). Makes -DSHORT_DBG_HDRS possible. + # Assumes that all client allocation is done through debugging + # allocators. + # -DSHORT_DBG_HDRS Assume that all objects have debug headers. Shorten + # the headers to minimize object size, at the expense of checking for + # writes past the end of an object. This is intended for environments + # in which most client code is written in a "safe" language, such as + # Scheme or Java. Assumes that all client allocation is done using + # the GC_debug_ functions, or through the macros that expand to these, + # or by redirecting malloc to GC_debug_malloc_replacement. + # (Also eliminates the field for the requested object size.) # occasionally be useful for debugging of client code. Slows down the # collector somewhat, but not drastically. + # -DSAVE_CALL_COUNT= Set the number of call frames saved with objects + # allocated through the debugging interface. Affects the amount of + # information generated in leak reports. Only matters on platforms + # on which we can quickly generate call stacks, currently Linux/(X86 & SPARC) + # and Solaris/SPARC. Turns on call chain saving on X86. On X86, client + # code should NOT be compiled with -fomit-frame-pointer. # -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly # altered stubborn objects, at substantial performance cost. # Use only for debugging of the incremental collector. *************** CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_S *** 143,208 **** # -DUSE_3DNOW_PREFETCH causes the collector to issue AMD 3DNow style # prefetch instructions. Same restrictions as USE_I686_PREFETCH. # UNTESTED!! ! # -DUSE_LD_WRAP in combination with the gld flags listed in README.linux # causes the collector some system and pthread calls in a more transparent # fashion than the usual macro-based approach. Requires GNU ld, and # currently probably works only with Linux. # - - LIBGC_CFLAGS= -O -DNO_SIGNALS -DSILENT \ - -DREDIRECT_MALLOC=GC_malloc_uncollectable \ - -DDONT_ADD_BYTE_AT_END -DALL_INTERIOR_POINTERS - # Flags for building libgc.a -- the last two are required. - CXXFLAGS= $(CFLAGS) AR= ar RANLIB= ranlib ! # Redefining srcdir allows object code for the nonPCR version of the collector ! # to be generated in different directories. In this case, the destination directory ! # should contain a copy of the original include directory. ! srcdir = . ! VPATH = $(srcdir) ! ! OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o hpux_irix_threads.o linux_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o gcj_mlc.o ! CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c hpux_irix_threads.c linux_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c gcj_mlc.c ! CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/de.c cord/cordtest.c cord/cord.h cord/ec.h cord/private/cord_pos.h cord/de_win.c cord/de_win.h cord/de_cmds.h cord/de_win.ICO cord/de_win.RC cord/SCOPTIONS.amiga cord/SMakefile.amiga CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o SRCS= $(CSRCS) mips_sgi_mach_dep.s rs6000_mach_dep.s alpha_mach_dep.s \ ! sparc_mach_dep.s gc.h gc_typed.h gc_hdrs.h gc_priv.h gc_private.h \ ! gcconfig.h gc_mark.h include/gc_inl.h include/gc_inline.h gc.man \ ! threadlibs.c if_mach.c if_not_there.c gc_cpp.cc gc_cpp.h weakpointer.h \ ! gcc_support.c mips_ultrix_mach_dep.s include/gc_alloc.h gc_alloc.h \ include/new_gc_alloc.h include/javaxfc.h sparc_sunos4_mach_dep.s \ ! solaris_threads.h backptr.h hpux_test_and_clear.s include/gc_gcj.h \ ! dbg_mlc.h $(CORD_SRCS) OTHER_FILES= Makefile PCR-Makefile OS2_MAKEFILE NT_MAKEFILE BCC_MAKEFILE \ ! README test.c test_cpp.cc setjmp_t.c SMakefile.amiga \ ! SCoptions.amiga README.amiga README.win32 cord/README \ ! cord/gc.h include/gc.h include/gc_typed.h include/cord.h \ ! include/ec.h include/private/cord_pos.h include/private/gcconfig.h \ ! include/private/gc_hdrs.h include/private/gc_priv.h \ ! include/gc_cpp.h README.rs6000 include/backptr.h \ ! include/weakpointer.h README.QUICK callprocs pc_excludes \ ! barrett_diagram README.OS2 README.Mac MacProjects.sit.hqx \ ! MacOS.c EMX_MAKEFILE makefile.depend README.debugging \ ! include/gc_cpp.h Mac_files/datastart.c Mac_files/dataend.c \ Mac_files/MacOS_config.h Mac_files/MacOS_Test_config.h \ ! add_gc_prefix.c README.solaris2 README.sgi README.hp README.uts \ ! win32_threads.c NT_THREADS_MAKEFILE gc.mak README.dj Makefile.dj \ ! README.alpha README.linux version.h Makefile.DLLs \ ! WCC_MAKEFILE nursery.c include/gc_nursery.h include/gc_copy_descr.h \ ! include/leak_detector.h ! CORD_INCLUDE_FILES= $(srcdir)/gc.h $(srcdir)/cord/cord.h $(srcdir)/cord/ec.h \ ! $(srcdir)/cord/private/cord_pos.h UTILS= if_mach if_not_there threadlibs --- 191,270 ---- # -DUSE_3DNOW_PREFETCH causes the collector to issue AMD 3DNow style # prefetch instructions. Same restrictions as USE_I686_PREFETCH. # UNTESTED!! ! # -DGC_USE_LD_WRAP in combination with the gld flags listed in README.linux # causes the collector some system and pthread calls in a more transparent # fashion than the usual macro-based approach. Requires GNU ld, and # currently probably works only with Linux. + # -DTHREAD_LOCAL_ALLOC defines GC_local_malloc(), GC_local_malloc_atomic() + # and GC_local_gcj_malloc(). Needed for gc_gcj.h interface. These allocate + # in a way that usually does not involve acquisition of a global lock. + # Currently requires -DGC_LINUX_THREADS, but should be easy to port to + # other pthreads environments. Recommended for multiprocessors. + # -DPARALLEL_MARK allows the marker to run in multiple threads. Recommended + # for multiprocessors. Currently requires Linux on X86 or IA64, though + # support for other Posix platforms should be fairly easy to add, + # if the thread implementation is otherwise supported. + # -DNO_GETENV prevents the collector from looking at environment variables. + # These may otherwise alter its configuration, or turn off GC altogether. + # I don't know of a reason to disable this, except possibly if the + # resulting process runs as a privileged user? + # -DSTUBBORN_ALLOC allows allocation of "hard to change" objects, and thus + # makes incremental collection easier. Was enabled by default until 6.0. + # Rarely used, to my knowledge. # CXXFLAGS= $(CFLAGS) AR= ar RANLIB= ranlib ! OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o irix_threads.o linux_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o gcj_mlc.o specific.o gc_dlopen.o ! CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c irix_threads.c linux_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c gcj_mlc.c specific.c gc_dlopen.c ! CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/de.c cord/cordtest.c include/cord.h include/ec.h include/private/cord_pos.h cord/de_win.c cord/de_win.h cord/de_cmds.h cord/de_win.ICO cord/de_win.RC CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o SRCS= $(CSRCS) mips_sgi_mach_dep.s rs6000_mach_dep.s alpha_mach_dep.s \ ! sparc_mach_dep.s include/gc.h include/gc_typed.h \ ! include/private/gc_hdrs.h include/private/gc_priv.h \ ! include/private/gcconfig.h include/private/gc_pmark.h \ ! include/gc_inl.h include/gc_inline.h include/gc_mark.h \ ! threadlibs.c if_mach.c if_not_there.c gc_cpp.cc include/gc_cpp.h \ ! include/weakpointer.h include/private/gc_locks.h \ ! gcc_support.c mips_ultrix_mach_dep.s include/gc_alloc.h \ include/new_gc_alloc.h include/javaxfc.h sparc_sunos4_mach_dep.s \ ! sparc_netbsd_mach_dep.s \ ! include/private/solaris_threads.h include/gc_backptr.h \ ! hpux_test_and_clear.s include/gc_gcj.h \ ! include/gc_local_alloc.h include/private/dbg_mlc.h \ ! include/private/specific.h powerpc_macosx_mach_dep.s \ ! include/leak_detector.h include/gc_amiga_redirects.h \ ! include/gc_pthread_redirects.h $(CORD_SRCS) + DOC_FILES= README.QUICK doc/README.Mac doc/README.MacOSX doc/README.OS2 \ + doc/README.amiga doc/README.cords doc/README.debugging \ + doc/README.dj doc/README.hp doc/README.linux doc/README.rs6000 \ + doc/README.sgi doc/README.solaris2 doc/README.uts \ + doc/README.win32 doc/barrett_diagram doc/README \ + doc/README.contributors doc/README.changes doc/gc.man \ + doc/README.environment + + TESTS= tests/test.c tests/test_cpp.cc tests/trace_test.c \ + tests/leak_test.c tests/thread_leak_test.c OTHER_FILES= Makefile PCR-Makefile OS2_MAKEFILE NT_MAKEFILE BCC_MAKEFILE \ ! setjmp_t.c SMakefile.amiga configure.in Makefile.am \ ! callprocs pc_excludes \ ! MacProjects.sit.hqx MacOS.c EMX_MAKEFILE \ ! Mac_files/datastart.c Mac_files/dataend.c \ Mac_files/MacOS_config.h Mac_files/MacOS_Test_config.h \ ! add_gc_prefix.c gc_cpp.cpp \ ! win32_threads.c NT_THREADS_MAKEFILE gc.mak Makefile.dj \ ! version.h Makefile.DLLs WCC_MAKEFILE AmigaOS.c $(TESTS) ! CORD_INCLUDE_FILES= $(srcdir)/include/gc.h $(srcdir)/include/cord.h \ ! $(srcdir)/include/ec.h $(srcdir)/include/private/cord_pos.h UTILS= if_mach if_not_there threadlibs *************** CURSES= -lcurses -ltermlib *** 214,220 **** # the SHELL environment variable. SHELL= /bin/sh ! SPECIALCFLAGS = # Alternative flags to the C compiler for mach_dep.c. # Mach_dep.c often doesn't like optimization, and it's # not time-critical anyway. --- 276,282 ---- # the SHELL environment variable. SHELL= /bin/sh ! SPECIALCFLAGS = -I$(srcdir)/include # Alternative flags to the C compiler for mach_dep.c. # Mach_dep.c often doesn't like optimization, and it's # not time-critical anyway. *************** SPECIALCFLAGS = *** 222,238 **** all: gc.a gctest ! pcr: PCR-Makefile gc_private.h gc_hdrs.h gc.h gcconfig.h mach_dep.o $(SRCS) ! make -f PCR-Makefile depend ! make -f PCR-Makefile ! $(OBJS) test.o dyn_load.o dyn_load_sunos53.o: $(srcdir)/gc_priv.h $(srcdir)/gc_hdrs.h $(srcdir)/gc.h \ ! $(srcdir)/gcconfig.h $(srcdir)/gc_typed.h Makefile # The dependency on Makefile is needed. Changing # options such as -DSILENT affects the size of GC_arrays, # invalidating all .o files that rely on gc_priv.h ! mark.o typd_mlc.o finalize.o: $(srcdir)/gc_mark.h base_lib gc.a: $(OBJS) dyn_load.o $(UTILS) echo > base_lib --- 284,330 ---- all: gc.a gctest ! BSD-pkg-all: bsd-libgc.a ! bsd-libgc.a: ! $(MAKE) CFLAGS="$(CFLAGS)" clean c++-t ! mv gc.a bsd-libgc.a ! ! BSD-pkg-install: BSD-pkg-all ! ${CP} bsd-libgc.a libgc.a ! ${INSTALL_DATA} libgc.a ${PREFIX}/lib ! ${INSTALL_DATA} gc.h gc_cpp.h ${PREFIX}/include ! ! pcr: PCR-Makefile include/private/gc_private.h include/private/gc_hdrs.h \ ! include/private/gc_locks.h include/gc.h include/private/gcconfig.h \ ! mach_dep.o $(SRCS) ! $(MAKE) -f PCR-Makefile depend ! $(MAKE) -f PCR-Makefile ! ! $(OBJS) tests/test.o dyn_load.o dyn_load_sunos53.o: \ ! $(srcdir)/include/private/gc_priv.h \ ! $(srcdir)/include/private/gc_hdrs.h $(srcdir)/include/private/gc_locks.h \ ! $(srcdir)/include/gc.h \ ! $(srcdir)/include/private/gcconfig.h $(srcdir)/include/gc_typed.h \ ! Makefile # The dependency on Makefile is needed. Changing # options such as -DSILENT affects the size of GC_arrays, # invalidating all .o files that rely on gc_priv.h ! mark.o typd_mlc.o finalize.o ptr_chck.o: $(srcdir)/include/gc_mark.h $(srcdir)/include/private/gc_pmark.h ! ! specific.o linux_threads.o: $(srcdir)/include/private/specific.h ! ! solaris_threads.o solaris_pthreads.o: $(srcdir)/include/private/solaris_threads.h ! ! dbg_mlc.o gcj_mlc.o: $(srcdir)/include/private/dbg_mlc.h ! ! tests/test.o: tests $(srcdir)/tests/test.c ! $(CC) $(CFLAGS) -c $(srcdir)/tests/test.c ! mv test.o tests/test.o ! ! tests: ! mkdir tests base_lib gc.a: $(OBJS) dyn_load.o $(UTILS) echo > base_lib *************** cords: $(CORD_OBJS) cord/cordtest $(UTIL *** 254,269 **** ./if_not_there dont_ar_3 $(AR) ru gc.a $(CORD_OBJS) ./if_not_there dont_ar_3 $(RANLIB) gc.a || cat /dev/null ! gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/gc_cpp.h $(srcdir)/gc.h Makefile $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc ! test_cpp: $(srcdir)/test_cpp.cc $(srcdir)/gc_cpp.h gc_cpp.o $(srcdir)/gc.h \ base_lib $(UTILS) rm -f test_cpp ! ./if_mach HP_PA HPUX $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a -ldld `./threadlibs` ! ./if_not_there test_cpp $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a `./threadlibs` ! c++: gc_cpp.o $(srcdir)/gc_cpp.h test_cpp rm -f dont_ar_4 ./if_mach SPARC SUNOS5 touch dont_ar_4 ./if_mach SPARC SUNOS5 $(AR) rus gc.a gc_cpp.o --- 346,367 ---- ./if_not_there dont_ar_3 $(AR) ru gc.a $(CORD_OBJS) ./if_not_there dont_ar_3 $(RANLIB) gc.a || cat /dev/null ! gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/include/gc_cpp.h $(srcdir)/include/gc.h Makefile $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc ! test_cpp: $(srcdir)/tests/test_cpp.cc $(srcdir)/include/gc_cpp.h gc_cpp.o $(srcdir)/include/gc.h \ base_lib $(UTILS) rm -f test_cpp ! ./if_mach HP_PA HPUX $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/tests/test_cpp.cc gc_cpp.o gc.a -ldld `./threadlibs` ! ./if_not_there test_cpp $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/tests/test_cpp.cc gc_cpp.o gc.a `./threadlibs` ! c++-t: c++ ! ./test_cpp 1 ! ! c++-nt: c++ ! @echo "Use ./test_cpp 1 to test the leak library" ! ! c++: gc_cpp.o $(srcdir)/include/gc_cpp.h test_cpp rm -f dont_ar_4 ./if_mach SPARC SUNOS5 touch dont_ar_4 ./if_mach SPARC SUNOS5 $(AR) rus gc.a gc_cpp.o *************** libirixgc.so: $(OBJS) dyn_load.o *** 294,300 **** # Linux shared library version of the collector liblinuxgc.so: $(OBJS) dyn_load.o ! gcc -shared -o liblinuxgc.so $(OBJS) dyn_load.o -lo ln liblinuxgc.so libgc.so # Alternative Linux rule. This is preferable, but is likely to break the --- 392,398 ---- # Linux shared library version of the collector liblinuxgc.so: $(OBJS) dyn_load.o ! gcc -shared -o liblinuxgc.so $(OBJS) dyn_load.o ln liblinuxgc.so libgc.so # Alternative Linux rule. This is preferable, but is likely to break the *************** liblinuxgc.so: $(OBJS) dyn_load.o *** 310,330 **** # gcc -shared -Wl,-soname=libgc.so.0 -o libgc.so.0 $(LIBOBJS) dyn_load.lo # touch liblinuxgc.so ! mach_dep.o: $(srcdir)/mach_dep.c $(srcdir)/mips_sgi_mach_dep.s $(srcdir)/mips_ultrix_mach_dep.s $(srcdir)/rs6000_mach_dep.s $(UTILS) rm -f mach_dep.o ./if_mach MIPS IRIX5 $(AS) -o mach_dep.o $(srcdir)/mips_sgi_mach_dep.s ./if_mach MIPS RISCOS $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach MIPS ULTRIX $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach RS6000 "" $(AS) -o mach_dep.o $(srcdir)/rs6000_mach_dep.s # ./if_mach ALPHA "" $(AS) -o mach_dep.o $(srcdir)/alpha_mach_dep.s # alpha_mach_dep.s assumes that pointers are not saved in fp registers. # Gcc on a 21264 can spill pointers to fp registers. Oops. ./if_mach SPARC SUNOS5 $(AS) -o mach_dep.o $(srcdir)/sparc_mach_dep.s ./if_mach SPARC SUNOS4 $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s ./if_mach SPARC OPENBSD $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s ! ./if_mach HP_PA HPUX $(AS) -o hpux_test_and_clear.o $(srcdir)/hpux_test_and_clear.s ! ./if_mach HP_PA HPUX $(CC) -c -o md_tmp.o $(SPECIALCFLAGS) $(srcdir)/mach_dep.c ! ./if_mach HP_PA HPUX ld -r -o mach_dep.o md_tmp.o hpux_test_and_clear.o ./if_not_there mach_dep.o $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c mark_rts.o: $(srcdir)/mark_rts.c $(UTILS) --- 408,428 ---- # gcc -shared -Wl,-soname=libgc.so.0 -o libgc.so.0 $(LIBOBJS) dyn_load.lo # touch liblinuxgc.so ! mach_dep.o: $(srcdir)/mach_dep.c $(srcdir)/mips_sgi_mach_dep.s $(srcdir)/mips_ultrix_mach_dep.s \ ! $(srcdir)/rs6000_mach_dep.s $(srcdir)/powerpc_macosx_mach_dep.s $(UTILS) rm -f mach_dep.o ./if_mach MIPS IRIX5 $(AS) -o mach_dep.o $(srcdir)/mips_sgi_mach_dep.s ./if_mach MIPS RISCOS $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach MIPS ULTRIX $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach RS6000 "" $(AS) -o mach_dep.o $(srcdir)/rs6000_mach_dep.s + ./if_mach POWERPC MACOSX $(AS) -o mach_dep.o $(srcdir)/powerpc_macosx_mach_dep.s # ./if_mach ALPHA "" $(AS) -o mach_dep.o $(srcdir)/alpha_mach_dep.s # alpha_mach_dep.s assumes that pointers are not saved in fp registers. # Gcc on a 21264 can spill pointers to fp registers. Oops. ./if_mach SPARC SUNOS5 $(AS) -o mach_dep.o $(srcdir)/sparc_mach_dep.s ./if_mach SPARC SUNOS4 $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s ./if_mach SPARC OPENBSD $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s ! ./if_mach SPARC NETBSD $(AS) -o mach_dep.o $(srcdir)/sparc_netbsd_mach_dep.s ./if_not_there mach_dep.o $(CC) -c $(SPECIALCFLAGS) $(srcdir)/mach_dep.c mark_rts.o: $(srcdir)/mark_rts.c $(UTILS) *************** mark_rts.o: $(srcdir)/mark_rts.c $(UTILS *** 336,351 **** alloc.o: version.h ! cord/cordbscs.o: $(srcdir)/cord/cordbscs.c $(CORD_INCLUDE_FILES) $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordbscs.c mv cordbscs.o cord/cordbscs.o # not all compilers understand -o filename ! cord/cordxtra.o: $(srcdir)/cord/cordxtra.c $(CORD_INCLUDE_FILES) $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordxtra.c mv cordxtra.o cord/cordxtra.o ! cord/cordprnt.o: $(srcdir)/cord/cordprnt.c $(CORD_INCLUDE_FILES) $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordprnt.c mv cordprnt.o cord/cordprnt.o --- 434,452 ---- alloc.o: version.h ! cord: ! mkdir cord ! ! cord/cordbscs.o: cord $(srcdir)/cord/cordbscs.c $(CORD_INCLUDE_FILES) $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordbscs.c mv cordbscs.o cord/cordbscs.o # not all compilers understand -o filename ! cord/cordxtra.o: cord $(srcdir)/cord/cordxtra.c $(CORD_INCLUDE_FILES) $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordxtra.c mv cordxtra.o cord/cordxtra.o ! cord/cordprnt.o: cord $(srcdir)/cord/cordprnt.c $(CORD_INCLUDE_FILES) $(CC) $(CFLAGS) -c -I$(srcdir) $(srcdir)/cord/cordprnt.c mv cordprnt.o cord/cordprnt.o *************** cord/cordtest: $(srcdir)/cord/cordtest.c *** 353,358 **** --- 454,460 ---- rm -f cord/cordtest ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a -lucb ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a -ldld `./threadlibs` + ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a `./threadlibs` ./if_not_there cord/cordtest $(CC) $(CFLAGS) -o cord/cordtest $(srcdir)/cord/cordtest.c $(CORD_OBJS) gc.a `./threadlibs` cord/de: $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(UTILS) *************** cord/de: $(srcdir)/cord/de.c cord/cordbs *** 360,396 **** ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -lucb `./threadlibs` ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -ldld `./threadlibs` ./if_mach RS6000 "" $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses ./if_mach I386 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` ./if_mach ALPHA LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` ./if_mach IA64 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` ! ./if_mach M68K AMIGA $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses ./if_not_there cord/de $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) `./threadlibs` ! if_mach: $(srcdir)/if_mach.c $(srcdir)/gcconfig.h ! $(HOSTCC) $(CFLAGS) -o if_mach $(srcdir)/if_mach.c ! threadlibs: $(srcdir)/threadlibs.c $(srcdir)/gcconfig.h Makefile ! $(HOSTCC) $(CFLAGS) -o threadlibs $(srcdir)/threadlibs.c if_not_there: $(srcdir)/if_not_there.c ! $(HOSTCC) $(CFLAGS) -o if_not_there $(srcdir)/if_not_there.c clean: ! rm -f gc.a *.o gctest gctest_dyn_link test_cpp \ setjmp_test mon.out gmon.out a.out core if_not_there if_mach \ threadlibs $(CORD_OBJS) cord/cordtest cord/de -rm -f *~ ! gctest: test.o gc.a $(UTILS) rm -f gctest ! ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o gctest test.o gc.a -lucb ! ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o gctest test.o gc.a -ldld `./threadlibs` ! ./if_not_there gctest $(CC) $(CFLAGS) -o gctest test.o gc.a `./threadlibs` # If an optimized setjmp_test generates a segmentation fault, # odds are your compiler is broken. Gctest may still work. # Try compiling setjmp_t.c unoptimized. ! setjmp_test: $(srcdir)/setjmp_t.c $(srcdir)/gc.h $(UTILS) $(CC) $(CFLAGS) -o setjmp_test $(srcdir)/setjmp_t.c test: KandRtest cord/cordtest --- 462,500 ---- ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -lucb `./threadlibs` ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) -ldld `./threadlibs` ./if_mach RS6000 "" $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses + ./if_mach POWERPC MACOSX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a ./if_mach I386 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` ./if_mach ALPHA LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` ./if_mach IA64 LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses `./threadlibs` ! ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses ./if_not_there cord/de $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) `./threadlibs` ! if_mach: $(srcdir)/if_mach.c $(srcdir)/include/private/gcconfig.h ! $(HOSTCC) $(HOSTCFLAGS) -o if_mach $(srcdir)/if_mach.c ! threadlibs: $(srcdir)/threadlibs.c $(srcdir)/include/private/gcconfig.h Makefile ! $(HOSTCC) $(HOSTCFLAGS) -o threadlibs $(srcdir)/threadlibs.c if_not_there: $(srcdir)/if_not_there.c ! $(HOSTCC) $(HOSTCFLAGS) -o if_not_there $(srcdir)/if_not_there.c clean: ! rm -f gc.a *.o *.exe tests/*.o gctest gctest_dyn_link test_cpp \ setjmp_test mon.out gmon.out a.out core if_not_there if_mach \ threadlibs $(CORD_OBJS) cord/cordtest cord/de -rm -f *~ ! gctest: tests/test.o gc.a $(UTILS) rm -f gctest ! ./if_mach SPARC DRSNX $(CC) $(CFLAGS) -o gctest tests/test.o gc.a -lucb ! ./if_mach HP_PA HPUX $(CC) $(CFLAGS) -o gctest tests/test.o gc.a -ldld `./threadlibs` ! ./if_mach M68K AMIGA $(CC) $(CFLAGS) -UGC_AMIGA_MAKINGLIB -o gctest tests/test.o gc.a `./threadlibs` ! ./if_not_there gctest $(CC) $(CFLAGS) -o gctest tests/test.o gc.a `./threadlibs` # If an optimized setjmp_test generates a segmentation fault, # odds are your compiler is broken. Gctest may still work. # Try compiling setjmp_t.c unoptimized. ! setjmp_test: $(srcdir)/setjmp_t.c $(srcdir)/include/gc.h $(UTILS) $(CC) $(CFLAGS) -o setjmp_test $(srcdir)/setjmp_t.c test: KandRtest cord/cordtest *************** KandRtest: setjmp_test gctest *** 404,411 **** add_gc_prefix: add_gc_prefix.c $(CC) -o add_gc_prefix $(srcdir)/add_gc_prefix.c ! gc.tar: $(SRCS) $(OTHER_FILES) add_gc_prefix ! ./add_gc_prefix $(SRCS) $(OTHER_FILES) > /tmp/gc.tar-files tar cvfh gc.tar `cat /tmp/gc.tar-files` pc_gc.tar: $(SRCS) $(OTHER_FILES) --- 508,515 ---- add_gc_prefix: add_gc_prefix.c $(CC) -o add_gc_prefix $(srcdir)/add_gc_prefix.c ! gc.tar: $(SRCS) $(DOC_FILES) $(OTHER_FILES) add_gc_prefix ! ./add_gc_prefix $(SRCS) $(DOC_FILES) $(OTHER_FILES) > /tmp/gc.tar-files tar cvfh gc.tar `cat /tmp/gc.tar-files` pc_gc.tar: $(SRCS) $(OTHER_FILES) *************** gc.tar.Z: gc.tar *** 432,452 **** gc.tar.gz: gc.tar gzip gc.tar ! lint: $(CSRCS) test.c ! lint -DLINT $(CSRCS) test.c | egrep -v "possible pointer alignment problem|abort|exit|sbrk|mprotect|syscall|change in ANSI|improper alignment" # BTL: added to test shared library version of collector. # Currently works only under SunOS5. Requires GC_INIT call from statically # loaded client code. ABSDIR = `pwd` ! gctest_dyn_link: test.o libgc.so ! $(CC) -L$(ABSDIR) -R$(ABSDIR) -o gctest_dyn_link test.o -lgc -ldl -lthread ! gctest_irix_dyn_link: test.o libirixgc.so ! $(CC) -L$(ABSDIR) -o gctest_irix_dyn_link test.o -lirixgc ! test_dll.o: test.c libgc_globals.h ! $(CC) $(CFLAGS) -DGC_USE_DLL -c test.c -o test_dll.o test_dll: test_dll.o libgc_dll.a libgc.dll $(CC) test_dll.o -L$(ABSDIR) -lgc_dll -o test_dll --- 536,558 ---- gc.tar.gz: gc.tar gzip gc.tar ! lint: $(CSRCS) tests/test.c ! lint -DLINT $(CSRCS) tests/test.c | egrep -v "possible pointer alignment problem|abort|exit|sbrk|mprotect|syscall|change in ANSI|improper alignment" # BTL: added to test shared library version of collector. # Currently works only under SunOS5. Requires GC_INIT call from statically # loaded client code. ABSDIR = `pwd` ! gctest_dyn_link: tests/test.o libgc.so ! $(CC) -L$(ABSDIR) -R$(ABSDIR) -o gctest_dyn_link tests/test.o -lgc -ldl -lthread ! gctest_irix_dyn_link: tests/test.o libirixgc.so ! $(CC) -L$(ABSDIR) -o gctest_irix_dyn_link tests/test.o -lirixgc ! # The following appear to be dead, especially since libgc_globals.h ! # is apparently lost. ! test_dll.o: tests/test.c libgc_globals.h ! $(CC) $(CFLAGS) -DGC_USE_DLL -c tests/test.c -o test_dll.o test_dll: test_dll.o libgc_dll.a libgc.dll $(CC) test_dll.o -L$(ABSDIR) -lgc_dll -o test_dll *************** SYM_PREFIX-libgc=GC *** 457,469 **** # include Makefile.DLLs reserved_namespace: $(SRCS) ! for file in $(SRCS) test.c test_cpp.cc; do \ sed s/GC_/_GC_/g < $$file > tmp; \ cp tmp $$file; \ done user_namespace: $(SRCS) ! for file in $(SRCS) test.c test_cpp.cc; do \ sed s/_GC_/GC_/g < $$file > tmp; \ cp tmp $$file; \ done --- 563,575 ---- # include Makefile.DLLs reserved_namespace: $(SRCS) ! for file in $(SRCS) tests/test.c tests/test_cpp.cc; do \ sed s/GC_/_GC_/g < $$file > tmp; \ cp tmp $$file; \ done user_namespace: $(SRCS) ! for file in $(SRCS) tests/test.c tests/test_cpp.cc; do \ sed s/_GC_/GC_/g < $$file > tmp; \ cp tmp $$file; \ done diff -Nrc3pad gcc-3.0.4/boehm-gc/Makefile.dj gcc-3.1/boehm-gc/Makefile.dj *** gcc-3.0.4/boehm-gc/Makefile.dj Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/Makefile.dj Tue Oct 16 09:01:34 2001 *************** *** 1,6 **** --- 1,12 ---- + # This Makefile is intended only for DJGPP use. + # It is mainly a copy of the main Makefile, but tends to get out of sync + # with it. A merge would probably be appropriate. + # Primary targets: # gc.a - builds basic library # libgc.a - builds library for use with g++ "-fgc-keyword" extension + # -fgc-keyword was never really available. Historical + # interest only. # c++ - adds C++ interface to library # cords - adds cords (heavyweight strings) to library # test - prints porting information, then builds basic version of gc.a, *************** AS=gcc -c -x assembler-with-cpp $(ABI_FL *** 20,48 **** CXXLD=gxx $(ABI_FLAG) EXE_SUFFIX=.exe ! CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_SIGNALS -DALL_INTERIOR_POINTERS -DNO_EXECUTE_PERMISSION -DSILENT ! # For dynamic library builds, it may be necessary to add flags to generate ! # PIC code, e.g. -fPIC on Linux. # Setjmp_test may yield overly optimistic results when compiled # without optimization. # -DSILENT disables statistics printing, and improves performance. ! # -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly ! # altered stubborn objects, at substantial performance cost. ! # Use only for incremental collector debugging. ! # -DFIND_LEAK causes the collector to assume that all inaccessible # objects should have been explicitly deallocated, and reports exceptions. # Finalization and the test program are not usable in this mode. - # -DSOLARIS_THREADS enables support for Solaris (thr_) threads. - # (Clients should also define SOLARIS_THREADS and then include - # gc.h before performing thr_ or dl* or GC_ operations.) - # Must also define -D_REENTRANT. - # -D_SOLARIS_PTHREADS enables support for Solaris pthreads. - # Define SOLARIS_THREADS as well. - # -DIRIX_THREADS enables support for Irix pthreads. See README.irix. - # -DLINUX_THREADS enables support for Xavier Leroy's Linux threads. - # see README.linux. -D_REENTRANT may also be required. # -DALL_INTERIOR_POINTERS allows all pointers to the interior # of objects to be recognized. (See gc_priv.h for consequences.) # -DSMALL_CONFIG tries to tune the collector for small heap sizes, --- 26,43 ---- CXXLD=gxx $(ABI_FLAG) EXE_SUFFIX=.exe ! srcdir= . ! VPATH= $(srcdir) ! CFLAGS= -O -I$(srcdir)/include -DATOMIC_UNCOLLECTABLE -DNO_SIGNALS -DALL_INTERIOR_POINTERS -DNO_EXECUTE_PERMISSION -DSILENT # Setjmp_test may yield overly optimistic results when compiled # without optimization. # -DSILENT disables statistics printing, and improves performance. ! # -DFIND_LEAK causes GC_find_leak to be initially set. ! # This causes the collector to assume that all inaccessible # objects should have been explicitly deallocated, and reports exceptions. # Finalization and the test program are not usable in this mode. # -DALL_INTERIOR_POINTERS allows all pointers to the interior # of objects to be recognized. (See gc_priv.h for consequences.) # -DSMALL_CONFIG tries to tune the collector for small heap sizes, *************** CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_S *** 62,76 **** # implementations, and it sometimes has a significant performance # impact. However, it is dangerous for many not-quite-ANSI C # programs that call things like printf in asynchronous signal handlers. # -DNO_EXECUTE_PERMISSION may cause some or all of the heap to not # have execute permission, i.e. it may be impossible to execute # code from the heap. Currently this only affects the incremental # collector on UNIX machines. It may greatly improve its performance, # since this may avoid some expensive cache synchronization. ! # -DOPERATOR_NEW_ARRAY declares that the C++ compiler supports the ! # new syntax "operator new[]" for allocating and deleting arrays. # See gc_cpp.h for details. No effect on the C part of the collector. ! # This is defined implicitly in a few environments. # -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined # as aliases for X, GC_realloc, and GC_free, respectively. # Calloc is redefined in terms of the new malloc. X should --- 57,74 ---- # implementations, and it sometimes has a significant performance # impact. However, it is dangerous for many not-quite-ANSI C # programs that call things like printf in asynchronous signal handlers. + # This is on by default. Turning it off has not been extensively tested with + # compilers that reorder stores. It should have been. # -DNO_EXECUTE_PERMISSION may cause some or all of the heap to not # have execute permission, i.e. it may be impossible to execute # code from the heap. Currently this only affects the incremental # collector on UNIX machines. It may greatly improve its performance, # since this may avoid some expensive cache synchronization. ! # -DGC_NO_OPERATOR_NEW_ARRAY declares that the C++ compiler does not support ! # the new syntax "operator new[]" for allocating and deleting arrays. # See gc_cpp.h for details. No effect on the C part of the collector. ! # This is defined implicitly in a few environments. Must also be defined ! # by clients that use gc_cpp.h. # -DREDIRECT_MALLOC=X causes malloc, realloc, and free to be defined # as aliases for X, GC_realloc, and GC_free, respectively. # Calloc is redefined in terms of the new malloc. X should *************** CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_S *** 89,97 **** # finalize.c). Objects reachable from finalizable objects will be marked # in a sepearte postpass, and hence their memory won't be reclaimed. # Not recommended unless you are implementing a language that specifies ! # these semantics. # -DFINALIZE_ON_DEMAND causes finalizers to be run only in response # to explicit GC_invoke_finalizers() calls. # -DATOMIC_UNCOLLECTABLE includes code for GC_malloc_atomic_uncollectable. # This is useful if either the vendor malloc implementation is poor, # or if REDIRECT_MALLOC is used. --- 87,98 ---- # finalize.c). Objects reachable from finalizable objects will be marked # in a sepearte postpass, and hence their memory won't be reclaimed. # Not recommended unless you are implementing a language that specifies ! # these semantics. Since 5.0, determines only only the initial value ! # of GC_java_finalization variable. # -DFINALIZE_ON_DEMAND causes finalizers to be run only in response # to explicit GC_invoke_finalizers() calls. + # In 5.0 this became runtime adjustable, and this only determines the + # initial value of GC_finalize_on_demand. # -DATOMIC_UNCOLLECTABLE includes code for GC_malloc_atomic_uncollectable. # This is useful if either the vendor malloc implementation is poor, # or if REDIRECT_MALLOC is used. *************** CFLAGS= -O -DATOMIC_UNCOLLECTABLE -DNO_S *** 100,175 **** # kind of object. For the incremental collector it makes sense to match # the most likely page size. Otherwise large values result in more # fragmentation, but generally better performance for large heaps. - # -DUSE_MMAP use MMAP instead of sbrk to get new memory. - # Works for Solaris and Irix. - # -DMMAP_STACKS (for Solaris threads) Use mmap from /dev/zero rather than - # GC_scratch_alloc() to get stack memory. # -DPRINT_BLACK_LIST Whenever a black list entry is added, i.e. whenever # the garbage collector detects a value that looks almost, but not quite, # like a pointer, print both the address containing the value, and the # value of the near-bogus-pointer. Can be used to identifiy regions of # memory that are likely to contribute misidentified pointers. ! # -DOLD_BLOCK_ALLOC Use the old, possibly faster, large block ! # allocation strategy. The new strategy tries harder to minimize ! # fragmentation, sometimes at the expense of spending more time in the ! # large block allocator and/or collecting more frequently. ! # If you expect the allocator to promtly use an explicitly expanded ! # heap, this is highly recommended. ! # ! ! - LIBGC_CFLAGS= -O -DNO_SIGNALS -DSILENT \ - -DREDIRECT_MALLOC=GC_malloc_uncollectable \ - -DDONT_ADD_BYTE_AT_END -DALL_INTERIOR_POINTERS - # Flags for building libgc.a -- the last two are required. CXXFLAGS= $(CFLAGS) -DOPERATOR_NEW_ARRAY AR= ar RANLIB= ranlib ! # Redefining srcdir allows object code for the nonPCR version of the collector ! # to be generated in different directories. In this case, the destination directory ! # should contain a copy of the original include directory. ! srcdir = . ! VPATH = $(srcdir) ! ! OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o irix_threads.o linux_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o ! CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c irix_threads.c linux_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c ! CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/de.c cord/cordtest.c cord/cord.h cord/ec.h cord/private/cord_pos.h cord/de_win.c cord/de_win.h cord/de_cmds.h cord/de_win.ICO cord/de_win.RC cord/SCOPTIONS.amiga cord/SMakefile.amiga CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o SRCS= $(CSRCS) mips_sgi_mach_dep.s rs6000_mach_dep.s alpha_mach_dep.s \ ! sparc_mach_dep.s gc.h gc_typed.h gc_hdrs.h gc_priv.h gc_private.h \ ! gcconfig.h gc_mark.h include/gc_inl.h include/gc_inline.h gc.man \ ! threadlibs.c if_mach.c if_not_there.c gc_cpp.cc gc_cpp.h weakpointer.h \ ! gcc_support.c mips_ultrix_mach_dep.s include/gc_alloc.h gc_alloc.h \ include/new_gc_alloc.h include/javaxfc.h sparc_sunos4_mach_dep.s \ ! solaris_threads.h $(CORD_SRCS) OTHER_FILES= Makefile PCR-Makefile OS2_MAKEFILE NT_MAKEFILE BCC_MAKEFILE \ README test.c test_cpp.cc setjmp_t.c SMakefile.amiga \ SCoptions.amiga README.amiga README.win32 cord/README \ ! cord/gc.h include/gc.h include/gc_typed.h include/cord.h \ ! include/ec.h include/private/cord_pos.h include/private/gcconfig.h \ ! include/private/gc_hdrs.h include/private/gc_priv.h \ ! include/gc_cpp.h README.rs6000 \ ! include/weakpointer.h README.QUICK callprocs pc_excludes \ barrett_diagram README.OS2 README.Mac MacProjects.sit.hqx \ ! MacOS.c EMX_MAKEFILE makefile.depend README.debugging \ ! include/gc_cpp.h Mac_files/datastart.c Mac_files/dataend.c \ Mac_files/MacOS_config.h Mac_files/MacOS_Test_config.h \ add_gc_prefix.c README.solaris2 README.sgi README.hp README.uts \ win32_threads.c NT_THREADS_MAKEFILE gc.mak README.dj Makefile.dj \ ! README.alpha README.linux version.h Makefile.DLLs \ ! WCC_MAKEFILE ! CORD_INCLUDE_FILES= $(srcdir)/gc.h $(srcdir)/cord/cord.h $(srcdir)/cord/ec.h \ ! $(srcdir)/cord/private/cord_pos.h UTILS= if_mach$(EXE_SUFFIX) if_not_there$(EXE_SUFFIX) --- 101,200 ---- # kind of object. For the incremental collector it makes sense to match # the most likely page size. Otherwise large values result in more # fragmentation, but generally better performance for large heaps. # -DPRINT_BLACK_LIST Whenever a black list entry is added, i.e. whenever # the garbage collector detects a value that looks almost, but not quite, # like a pointer, print both the address containing the value, and the # value of the near-bogus-pointer. Can be used to identifiy regions of # memory that are likely to contribute misidentified pointers. ! # -DKEEP_BACK_PTRS Add code to save back pointers in debugging headers ! # for objects allocated with the debugging allocator. If all objects ! # through GC_MALLOC with GC_DEBUG defined, this allows the client ! # to determine how particular or randomly chosen objects are reachable ! # for debugging/profiling purposes. The gc_backptr.h interface is ! # implemented only if this is defined. ! # -DGC_ASSERTIONS Enable some internal GC assertion checking. Currently ! # this facility is only used in a few places. It is intended primarily ! # for debugging of the garbage collector itself, but could also ! # -DDBG_HDRS_ALL Make sure that all objects have debug headers. Increases ! # the reliability (from 99.9999% to 100%) of some of the debugging ! # code (especially KEEP_BACK_PTRS). Makes -DSHORT_DBG_HDRS possible. ! # Assumes that all client allocation is done through debugging ! # allocators. ! # -DSHORT_DBG_HDRS Assume that all objects have debug headers. Shorten ! # the headers to minimize object size, at the expense of checking for ! # writes past the end of an object. This is intended for environments ! # in which most client code is written in a "safe" language, such as ! # Scheme or Java. Assumes that all client allocation is done using ! # the GC_debug_ functions (or through the macros that expand to these. ! # (Also eliminates the field for the requested object size.) ! # occasionally be useful for debugging of client code. Slows down the ! # collector somewhat, but not drastically. ! # -DCHECKSUMS reports on erroneously clear dirty bits, and unexpectedly ! # altered stubborn objects, at substantial performance cost. ! # Use only for debugging of the incremental collector. ! # -DGC_GCJ_SUPPORT includes support for gcj (and possibly other systems ! # that include a pointer to a type descriptor in each allocated object). ! # Building this way requires an ANSI C compiler. ! # -DUSE_I686_PREFETCH causes the collector to issue Pentium III style ! # prefetch instructions. No effect except on X86 Linux platforms. ! # Assumes a very recent gcc-compatible compiler and assembler. ! # (Gas prefetcht0 support was added around May 1999.) ! # Empirically the code appears to still run correctly on Pentium II ! # processors, though with no performance benefit. May not run on other ! # X86 processors? In some cases this improves performance by ! # 15% or so. ! # -DUSE_3DNOW_PREFETCH causes the collector to issue AMD 3DNow style ! # prefetch instructions. Same restrictions as USE_I686_PREFETCH. ! # UNTESTED!! ! # -DGC_USE_LD_WRAP in combination with the gld flags listed in README.linux ! # causes the collector some system and pthread calls in a more transparent ! # fashion than the usual macro-based approach. Requires GNU ld, and ! # currently probably works only with Linux. CXXFLAGS= $(CFLAGS) -DOPERATOR_NEW_ARRAY AR= ar RANLIB= ranlib ! OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o dbg_mlc.o malloc.o stubborn.o checksums.o solaris_threads.o hpux_irix_threads.o linux_threads.o typd_mlc.o ptr_chck.o mallocx.o solaris_pthreads.o gcj_mlc.o specific.o ! CSRCS= reclaim.c allchblk.c misc.c alloc.c mach_dep.c os_dep.c mark_rts.c headers.c mark.c obj_map.c pcr_interface.c blacklst.c finalize.c new_hblk.c real_malloc.c dyn_load.c dbg_mlc.c malloc.c stubborn.c checksums.c solaris_threads.c hpux_irix_threads.c linux_threads.c typd_mlc.c ptr_chck.c mallocx.c solaris_pthreads.c gcj_mlc.c specific.c ! CORD_SRCS= cord/cordbscs.c cord/cordxtra.c cord/cordprnt.c cord/de.c cord/cordtest.c include/cord.h include/ec.h include/private/cord_pos.h cord/de_win.c cord/de_win.h cord/de_cmds.h cord/de_win.ICO cord/de_win.RC cord/SCOPTIONS.amiga cord/SMakefile.amiga CORD_OBJS= cord/cordbscs.o cord/cordxtra.o cord/cordprnt.o SRCS= $(CSRCS) mips_sgi_mach_dep.s rs6000_mach_dep.s alpha_mach_dep.s \ ! sparc_mach_dep.s include/gc.h include/gc_typed.h \ ! include/private/gc_hdrs.h include/private/gc_priv.h \ ! include/private/gcconfig.h include/private/gc_mark.h \ ! include/gc_inl.h include/gc_inline.h gc.man \ ! threadlibs.c if_mach.c if_not_there.c gc_cpp.cc include/gc_cpp.h \ ! include/weakpointer.h include/private/gc_locks.h \ ! gcc_support.c mips_ultrix_mach_dep.s include/gc_alloc.h \ include/new_gc_alloc.h include/javaxfc.h sparc_sunos4_mach_dep.s \ ! include/private/solaris_threads.h include/gc_backptr.h \ ! hpux_test_and_clear.s include/gc_gcj.h \ ! include/gc_local_alloc.h include/private/dbg_mlc.h \ ! include/private/specific.h powerpc_macosx_mach_dep.s \ ! include/leak_detector.h $(CORD_SRCS) OTHER_FILES= Makefile PCR-Makefile OS2_MAKEFILE NT_MAKEFILE BCC_MAKEFILE \ README test.c test_cpp.cc setjmp_t.c SMakefile.amiga \ SCoptions.amiga README.amiga README.win32 cord/README \ ! README.rs6000 README.QUICK callprocs pc_excludes \ barrett_diagram README.OS2 README.Mac MacProjects.sit.hqx \ ! MacOS.c EMX_MAKEFILE README.debugging \ ! Mac_files/datastart.c Mac_files/dataend.c \ Mac_files/MacOS_config.h Mac_files/MacOS_Test_config.h \ add_gc_prefix.c README.solaris2 README.sgi README.hp README.uts \ win32_threads.c NT_THREADS_MAKEFILE gc.mak README.dj Makefile.dj \ ! README.alpha README.linux README.MacOSX version.h Makefile.DLLs \ ! WCC_MAKEFILE nursery.c include/gc_nursery.h include/gc_copy_descr.h ! CORD_INCLUDE_FILES= $(srcdir)/include/gc.h $(srcdir)/include/cord.h \ ! $(srcdir)/include/ec.h $(srcdir)/include/private/cord_pos.h UTILS= if_mach$(EXE_SUFFIX) if_not_there$(EXE_SUFFIX) *************** SPECIALCFLAGS = *** 189,200 **** all: gc.a gctest$(EXE_SUFFIX) ! pcr: PCR-Makefile gc_private.h gc_hdrs.h gc.h gcconfig.h mach_dep.o $(SRCS) ! make -f PCR-Makefile depend ! make -f PCR-Makefile ! ! $(OBJS) test.o dyn_load.o dyn_load_sunos53.o: $(srcdir)/gc_priv.h $(srcdir)/gc_hdrs.h $(srcdir)/gc.h \ ! $(srcdir)/gcconfig.h $(srcdir)/gc_typed.h Makefile # The dependency on Makefile is needed. Changing # options such as -DSILENT affects the size of GC_arrays, # invalidating all .o files that rely on gc_priv.h --- 214,225 ---- all: gc.a gctest$(EXE_SUFFIX) ! $(OBJS) test.o dyn_load.o dyn_load_sunos53.o: \ ! $(srcdir)/include/private/gc_priv.h \ ! $(srcdir)/include/private/gc_hdrs.h $(srcdir)/include/private/gc_locks.h \ ! $(srcdir)/include/gc.h \ ! $(srcdir)/include/private/gcconfig.h $(srcdir)/include/gc_typed.h \ ! Makefile # The dependency on Makefile is needed. Changing # options such as -DSILENT affects the size of GC_arrays, # invalidating all .o files that rely on gc_priv.h *************** cords: $(CORD_OBJS) cord/cordtest$(EXE_S *** 217,233 **** ./if_not_there on_sparc_sunos5_3 $(AR) ru gc.a $(CORD_OBJS) -./if_not_there on_sparc_sunos5_3 $(RANLIB) gc.a ! gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/gc_cpp.h $(srcdir)/gc.h Makefile $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc ! test_cpp$(EXE_SUFFIX): $(srcdir)/test_cpp.cc $(srcdir)/gc_cpp.h gc_cpp.o $(srcdir)/gc.h \ base_lib $(UTILS) rm -f test_cpp test_cpp$(EXE_SUFFIX) ./if_mach HP_PA "" $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a -ldld ./if_not_there test_cpp$(EXE_SUFFIX) $(CXXLD) $(CXXFLAGS) -o test_cpp$(EXE_SUFFIX) $(srcdir)/test_cpp.cc gc_cpp.o gc.a rm -f test_cpp ! c++: gc_cpp.o $(srcdir)/gc_cpp.h test_cpp$(EXE_SUFFIX) rm -f on_sparc_sunos5_4 ./if_mach SPARC SUNOS5 touch on_sparc_sunos5_4 ./if_mach SPARC SUNOS5 $(AR) rus gc.a gc_cpp.o --- 242,258 ---- ./if_not_there on_sparc_sunos5_3 $(AR) ru gc.a $(CORD_OBJS) -./if_not_there on_sparc_sunos5_3 $(RANLIB) gc.a ! gc_cpp.o: $(srcdir)/gc_cpp.cc $(srcdir)/include/gc_cpp.h $(srcdir)/include/gc.h Makefile $(CXX) -c $(CXXFLAGS) $(srcdir)/gc_cpp.cc ! test_cpp$(EXE_SUFFIX): $(srcdir)/test_cpp.cc $(srcdir)/include/gc_cpp.h gc_cpp.o $(srcdir)/include/gc.h \ base_lib $(UTILS) rm -f test_cpp test_cpp$(EXE_SUFFIX) ./if_mach HP_PA "" $(CXX) $(CXXFLAGS) -o test_cpp $(srcdir)/test_cpp.cc gc_cpp.o gc.a -ldld ./if_not_there test_cpp$(EXE_SUFFIX) $(CXXLD) $(CXXFLAGS) -o test_cpp$(EXE_SUFFIX) $(srcdir)/test_cpp.cc gc_cpp.o gc.a rm -f test_cpp ! c++: gc_cpp.o $(srcdir)/include/gc_cpp.h test_cpp$(EXE_SUFFIX) rm -f on_sparc_sunos5_4 ./if_mach SPARC SUNOS5 touch on_sparc_sunos5_4 ./if_mach SPARC SUNOS5 $(AR) rus gc.a gc_cpp.o *************** liblinuxgc.so: $(OBJS) dyn_load.o *** 259,270 **** gcc -shared -o liblinuxgc.so $(OBJS) dyn_load.o -lo ln liblinuxgc.so libgc.so ! mach_dep.o: $(srcdir)/mach_dep.c $(srcdir)/mips_sgi_mach_dep.s $(srcdir)/mips_ultrix_mach_dep.s $(srcdir)/rs6000_mach_dep.s $(UTILS) rm -f mach_dep.o ./if_mach MIPS IRIX5 $(AS) -o mach_dep.o $(srcdir)/mips_sgi_mach_dep.s ./if_mach MIPS RISCOS $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach MIPS ULTRIX $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach RS6000 "" $(AS) -o mach_dep.o $(srcdir)/rs6000_mach_dep.s ./if_mach ALPHA "" $(AS) -o mach_dep.o $(srcdir)/alpha_mach_dep.s ./if_mach SPARC SUNOS5 $(AS) -o mach_dep.o $(srcdir)/sparc_mach_dep.s ./if_mach SPARC SUNOS4 $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s --- 284,297 ---- gcc -shared -o liblinuxgc.so $(OBJS) dyn_load.o -lo ln liblinuxgc.so libgc.so ! mach_dep.o: $(srcdir)/mach_dep.c $(srcdir)/mips_sgi_mach_dep.s $(srcdir)/mips_ultrix_mach_dep.s \ ! $(srcdir)/rs6000_mach_dep.s $(srcdir)/powerpc_macosx_mach_dep.s $(UTILS) rm -f mach_dep.o ./if_mach MIPS IRIX5 $(AS) -o mach_dep.o $(srcdir)/mips_sgi_mach_dep.s ./if_mach MIPS RISCOS $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach MIPS ULTRIX $(AS) -o mach_dep.o $(srcdir)/mips_ultrix_mach_dep.s ./if_mach RS6000 "" $(AS) -o mach_dep.o $(srcdir)/rs6000_mach_dep.s + ./if_mach POWERPC MACOSX $(AS) -o mach_dep.o $(srcdir)/powerpc_macosx_mach_dep.s ./if_mach ALPHA "" $(AS) -o mach_dep.o $(srcdir)/alpha_mach_dep.s ./if_mach SPARC SUNOS5 $(AS) -o mach_dep.o $(srcdir)/sparc_mach_dep.s ./if_mach SPARC SUNOS4 $(AS) -o mach_dep.o $(srcdir)/sparc_sunos4_mach_dep.s *************** cord/de$(EXE_SUFFIX): $(srcdir)/cord/de. *** 312,331 **** ./if_mach ALPHA LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses ./if_not_there cord/de$(EXE_SUFFIX) $(CC) $(CFLAGS) -o cord/de$(EXE_SUFFIX) $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) ! if_mach$(EXE_SUFFIX): $(srcdir)/if_mach.c $(srcdir)/gcconfig.h rm -f if_mach if_mach$(EXE_SUFFIX) $(CC) $(CFLAGS) -o if_mach $(srcdir)/if_mach.c - rm -f if_mach ! threadlibs$(EXE_SUFFIX): $(srcdir)/threadlibs.c $(srcdir)/gcconfig.h Makefile rm -f threadlibs threadlibs$(EXE_SUFFIX) $(CC) $(CFLAGS) -o threadlibs $(srcdir)/threadlibs.c - rm -f threadlibs if_not_there$(EXE_SUFFIX): $(srcdir)/if_not_there.c rm -f if_not_there if_not_there$(EXE_SUFFIX) $(CC) $(CFLAGS) -o if_not_there $(srcdir)/if_not_there.c - rm -f if_not_there # Clean removes *.o several times, # because as the first one doesn't seem to get them all! --- 339,355 ---- ./if_mach ALPHA LINUX $(CC) $(CFLAGS) -o cord/de $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a -lcurses ./if_not_there cord/de$(EXE_SUFFIX) $(CC) $(CFLAGS) -o cord/de$(EXE_SUFFIX) $(srcdir)/cord/de.c cord/cordbscs.o cord/cordxtra.o gc.a $(CURSES) ! if_mach$(EXE_SUFFIX): $(srcdir)/if_mach.c $(srcdir)/include/private/gcconfig.h rm -f if_mach if_mach$(EXE_SUFFIX) $(CC) $(CFLAGS) -o if_mach $(srcdir)/if_mach.c ! threadlibs$(EXE_SUFFIX): $(srcdir)/threadlibs.c $(srcdir)include/private/gcconfig.h Makefile rm -f threadlibs threadlibs$(EXE_SUFFIX) $(CC) $(CFLAGS) -o threadlibs $(srcdir)/threadlibs.c if_not_there$(EXE_SUFFIX): $(srcdir)/if_not_there.c rm -f if_not_there if_not_there$(EXE_SUFFIX) $(CC) $(CFLAGS) -o if_not_there $(srcdir)/if_not_there.c # Clean removes *.o several times, # because as the first one doesn't seem to get them all! *************** gctest$(EXE_SUFFIX): test.o gc.a if_mach *** 352,358 **** # If an optimized setjmp_test generates a segmentation fault, # odds are your compiler is broken. Gctest may still work. # Try compiling setjmp_t.c unoptimized. ! setjmp_test$(EXE_SUFFIX): $(srcdir)/setjmp_t.c $(srcdir)/gc.h \ if_mach$(EXE_SUFFIX) if_not_there$(EXE_SUFFIX) rm -f setjmp_test$(EXE_SUFFIX) $(CC) $(CFLAGS) -o setjmp_test $(srcdir)/setjmp_t.c --- 376,382 ---- # If an optimized setjmp_test generates a segmentation fault, # odds are your compiler is broken. Gctest may still work. # Try compiling setjmp_t.c unoptimized. ! setjmp_test$(EXE_SUFFIX): $(srcdir)/setjmp_t.c $(srcdir)/include/gc.h \ if_mach$(EXE_SUFFIX) if_not_there$(EXE_SUFFIX) rm -f setjmp_test$(EXE_SUFFIX) $(CC) $(CFLAGS) -o setjmp_test $(srcdir)/setjmp_t.c *************** gc.tar: $(SRCS) $(OTHER_FILES) add_gc_pr *** 377,397 **** pc_gc.tar: $(SRCS) $(OTHER_FILES) tar cvfX pc_gc.tar pc_excludes $(SRCS) $(OTHER_FILES) - floppy: pc_gc.tar - -mmd a:/cord - -mmd a:/cord/private - -mmd a:/include - -mmd a:/include/private - mkdir /tmp/pc_gc - cat pc_gc.tar | (cd /tmp/pc_gc; tar xvf -) - -mcopy -tmn /tmp/pc_gc/* a: - -mcopy -tmn /tmp/pc_gc/cord/* a:/cord - -mcopy -mn /tmp/pc_gc/cord/de_win.ICO a:/cord - -mcopy -tmn /tmp/pc_gc/cord/private/* a:/cord/private - -mcopy -tmn /tmp/pc_gc/include/* a:/include - -mcopy -tmn /tmp/pc_gc/include/private/* a:/include/private - rm -r /tmp/pc_gc - gc.tar.Z: gc.tar compress gc.tar --- 401,406 ---- *************** ABSDIR = `pwd` *** 408,416 **** gctest_dyn_link: test.o libgc.so $(CC) -L$(ABSDIR) -R$(ABSDIR) -o gctest_dyn_link test.o -lgc -ldl -lthread - gctest_irix_dyn_link: test.o libirixgc.so - $(CC) -L$(ABSDIR) -o gctest_irix_dyn_link test.o -lirixgc - test_dll.o: test.c libgc_globals.h $(CC) $(CFLAGS) -DGC_USE_DLL -c test.c -o test_dll.o --- 417,422 ---- *************** SYM_PREFIX-libgc=GC *** 422,436 **** # Uncomment the following line to build a GNU win32 DLL # include Makefile.DLLs - reserved_namespace: $(SRCS) - for file in $(SRCS) test.c test_cpp.cc; do \ - sed s/GC_/_GC_/g < $$file > tmp; \ - cp tmp $$file; \ - done - - user_namespace: $(SRCS) - for file in $(SRCS) test.c test_cpp.cc; do \ - sed s/_GC_/GC_/g < $$file > tmp; \ - cp tmp $$file; \ - done - --- 428,430 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/Makefile.in gcc-3.1/boehm-gc/Makefile.in *** gcc-3.0.4/boehm-gc/Makefile.in Wed Feb 20 19:40:48 2002 --- gcc-3.1/boehm-gc/Makefile.in Wed May 15 02:40:18 2002 *************** *** 1,6 **** ! # Makefile.in generated automatically by automake 1.4 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. --- 1,6 ---- ! # Makefile.in generated automatically by automake 1.4-p5 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. *************** target_alias = @target_alias@ *** 65,71 **** target_triplet = @target@ AR = @AR@ AS = @AS@ - BOEHM_GC_CFLAGS = @BOEHM_GC_CFLAGS@ CC = @CC@ CPP = @CPP@ CXX = @CXX@ --- 65,70 ---- *************** EXEEXT = @EXEEXT@ *** 76,81 **** --- 75,81 ---- EXTRA_TEST_LIBS = @EXTRA_TEST_LIBS@ GCJ = @GCJ@ GCJFLAGS = @GCJFLAGS@ + GC_CFLAGS = @GC_CFLAGS@ INCLUDES = @INCLUDES@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ *************** STRIP = @STRIP@ *** 90,101 **** THREADLIBS = @THREADLIBS@ VERSION = @VERSION@ addobjs = @addobjs@ ! boehm_gc_basedir = @boehm_gc_basedir@ mkinstalldirs = @mkinstalldirs@ target_all = @target_all@ AUTOMAKE_OPTIONS = cygnus # Multilib support variables. MULTISRCTOP = MULTIBUILDTOP = --- 90,103 ---- THREADLIBS = @THREADLIBS@ VERSION = @VERSION@ addobjs = @addobjs@ ! gc_basedir = @gc_basedir@ mkinstalldirs = @mkinstalldirs@ target_all = @target_all@ AUTOMAKE_OPTIONS = cygnus + SUBDIRS = include + # Multilib support variables. MULTISRCTOP = MULTIBUILDTOP = *************** MULTIDIRS = *** 103,143 **** MULTISUBDIR = MULTIDO = true MULTICLEAN = true ! @USE_LIBDIR_TRUE@toolexeclibdir = \ ! @USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexeclibdir = \ ! @USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexecdir = \ ! @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) ! toolexeclib_LTLIBRARIES = $(target_all) ! EXTRA_LTLIBRARIES = libgcjgc.la ! libgcjgc_la_SOURCES = allchblk.c alloc.c blacklst.c checksums.c \ ! gcconfig.h dbg_mlc.c dyn_load.c finalize.c gc.h gc_alloc.h gc_cpp.h \ ! gc_hdrs.h gc_mark.h gc_priv.h gc_private.h gc_typed.h gcj_mlc.c headers.c \ ! hpux_irix_threads.c linux_threads.c malloc.c mallocx.c mark.c mark_rts.c \ ! misc.c new_hblk.c obj_map.c os_dep.c pcr_interface.c ptr_chck.c \ ! real_malloc.c reclaim.c solaris_pthreads.c solaris_threads.c \ ! solaris_threads.h stubborn.c typd_mlc.c version.h weakpointer.h # Include THREADLIBS here to ensure that the correct versions of # linuxthread semaphore functions get linked: libgcjgc_la_LIBADD = @addobjs@ $(THREADLIBS) libgcjgc_la_DEPENDENCIES = @addobjs@ libgcjgc_la_LDFLAGS = -version-info 1:1:0 -rpath $(toolexeclibdir) ! EXTRA_libgcjgc_la_SOURCES = alpha_mach_dep.s mips_sgi_mach_dep.s \ ! mips_ultrix_mach_dep.s rs6000_mach_dep.s sparc_mach_dep.s \ ! sparc_sunos4_mach_dep.s mach_dep.c ecos.cc ! ! AM_CXXFLAGS = @BOEHM_GC_CFLAGS@ ! AM_CFLAGS = @BOEHM_GC_CFLAGS@ check_PROGRAMS = gctest ! gctest_SOURCES = test.c gctest_LDADD = ./libgcjgc.la $(THREADLIBS) $(EXTRA_TEST_LIBS) gctest_LDFLAGS = -shared-libgcc TESTS_ENVIRONMENT = LD_LIBRARY_PATH=../../$(MULTIBUILDTOP)gcc --- 105,152 ---- MULTISUBDIR = MULTIDO = true MULTICLEAN = true ! @USE_LIBDIR_TRUE@toolexeclibdir = @USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexeclibdir = @USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexecdir = @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) ! noinst_LTLIBRARIES = libgcjgc.la libgcjgc_convenience.la ! ! GC_SOURCES = allchblk.c alloc.c blacklst.c checksums.c dbg_mlc.c \ ! dyn_load.c finalize.c gc_dlopen.c gcj_mlc.c headers.c irix_threads.c \ ! linux_threads.c malloc.c mallocx.c mark.c mark_rts.c misc.c new_hblk.c \ ! obj_map.c os_dep.c pcr_interface.c ptr_chck.c real_malloc.c reclaim.c \ ! solaris_pthreads.c solaris_threads.c specific.c stubborn.c typd_mlc.c \ ! backgraph.c win32_threads.c + EXTRA_GC_SOURCES = alpha_mach_dep.s \ + mips_sgi_mach_dep.S mips_ultrix_mach_dep.s powerpc_macosx_mach_dep.s \ + rs6000_mach_dep.s sparc_mach_dep.S sparc_netbsd_mach_dep.s \ + sparc_sunos4_mach_dep.s ia64_save_regs_in_stack.s + + + libgcjgc_la_SOURCES = $(GC_SOURCES) + libgcjgc_convenience_la_SOURCES = $(GC_SOURCES) + EXTRA_libgcjgc_la_SOURCES = $(EXTRA_GC_SOURCES) + EXTRA_libgcjgc_convenience_la_SOURCES = $(EXTRA_GC_SOURCES) + # Include THREADLIBS here to ensure that the correct versions of # linuxthread semaphore functions get linked: libgcjgc_la_LIBADD = @addobjs@ $(THREADLIBS) libgcjgc_la_DEPENDENCIES = @addobjs@ libgcjgc_la_LDFLAGS = -version-info 1:1:0 -rpath $(toolexeclibdir) ! libgcjgc_convenience_la_LIBADD = @addobjs@ ! libgcjgc_convenience_la_DEPENDENCIES = @addobjs@ ! AM_CXXFLAGS = @GC_CFLAGS@ ! AM_CFLAGS = @GC_CFLAGS@ check_PROGRAMS = gctest ! # Using $< in the above seems to fail with the HP/UX on Itanium make. ! ! gctest_OBJECTS = test.o gctest_LDADD = ./libgcjgc.la $(THREADLIBS) $(EXTRA_TEST_LIBS) gctest_LDFLAGS = -shared-libgcc TESTS_ENVIRONMENT = LD_LIBRARY_PATH=../../$(MULTIBUILDTOP)gcc *************** all_objs = @addobjs@ $(libgcjgc_la_OBJEC *** 147,153 **** LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) \ ! $(AM_CFLAGS) $(MY_CFLAGS) $(BOEHM_GC_CFLAGS) LINK = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(MY_CFLAGS) $(LDFLAGS) -o $@ --- 156,162 ---- LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) \ ! $(AM_CFLAGS) $(MY_CFLAGS) $(GC_CFLAGS) LINK = $(LIBTOOL) --mode=link $(CC) $(AM_CFLAGS) $(MY_CFLAGS) $(LDFLAGS) -o $@ *************** CONFIG_STATUS_DEPENDENCIES = $(srcdir)/c *** 198,204 **** MAKEOVERRIDES = ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 CONFIG_CLEAN_FILES = ! LTLIBRARIES = $(toolexeclib_LTLIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) --- 207,213 ---- MAKEOVERRIDES = ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 CONFIG_CLEAN_FILES = ! LTLIBRARIES = $(noinst_LTLIBRARIES) DEFS = @DEFS@ -I. -I$(srcdir) *************** CPPFLAGS = @CPPFLAGS@ *** 206,241 **** LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libgcjgc_la_OBJECTS = allchblk.lo alloc.lo blacklst.lo checksums.lo \ ! dbg_mlc.lo dyn_load.lo finalize.lo gcj_mlc.lo headers.lo \ ! hpux_irix_threads.lo linux_threads.lo malloc.lo mallocx.lo mark.lo \ mark_rts.lo misc.lo new_hblk.lo obj_map.lo os_dep.lo pcr_interface.lo \ ptr_chck.lo real_malloc.lo reclaim.lo solaris_pthreads.lo \ ! solaris_threads.lo stubborn.lo typd_mlc.lo check_PROGRAMS = gctest$(EXEEXT) - gctest_OBJECTS = test.$(OBJEXT) gctest_DEPENDENCIES = ./libgcjgc.la - CXXFLAGS = @CXXFLAGS@ - CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) - LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) - CXXLD = $(CXX) - CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) ! DIST_COMMON = README ChangeLog Makefile.am Makefile.in acinclude.m4 \ ! aclocal.m4 configure configure.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = tar GZIP_ENV = --best ! SOURCES = $(libgcjgc_la_SOURCES) $(EXTRA_libgcjgc_la_SOURCES) $(gctest_SOURCES) ! OBJECTS = $(libgcjgc_la_OBJECTS) $(gctest_OBJECTS) all: all-redirect .SUFFIXES: ! .SUFFIXES: .S .c .cc .lo .o .obj .s $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile --- 215,254 ---- LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libgcjgc_la_OBJECTS = allchblk.lo alloc.lo blacklst.lo checksums.lo \ ! dbg_mlc.lo dyn_load.lo finalize.lo gc_dlopen.lo gcj_mlc.lo headers.lo \ ! irix_threads.lo linux_threads.lo malloc.lo mallocx.lo mark.lo \ mark_rts.lo misc.lo new_hblk.lo obj_map.lo os_dep.lo pcr_interface.lo \ ptr_chck.lo real_malloc.lo reclaim.lo solaris_pthreads.lo \ ! solaris_threads.lo specific.lo stubborn.lo typd_mlc.lo backgraph.lo \ ! win32_threads.lo ! libgcjgc_convenience_la_LDFLAGS = ! libgcjgc_convenience_la_OBJECTS = allchblk.lo alloc.lo blacklst.lo \ ! checksums.lo dbg_mlc.lo dyn_load.lo finalize.lo gc_dlopen.lo gcj_mlc.lo \ ! headers.lo irix_threads.lo linux_threads.lo malloc.lo mallocx.lo \ ! mark.lo mark_rts.lo misc.lo new_hblk.lo obj_map.lo os_dep.lo \ ! pcr_interface.lo ptr_chck.lo real_malloc.lo reclaim.lo \ ! solaris_pthreads.lo solaris_threads.lo specific.lo stubborn.lo \ ! typd_mlc.lo backgraph.lo win32_threads.lo check_PROGRAMS = gctest$(EXEEXT) gctest_DEPENDENCIES = ./libgcjgc.la CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) ! DIST_COMMON = ChangeLog Makefile.am Makefile.in acinclude.m4 aclocal.m4 \ ! config.guess config.sub configure configure.in install-sh ltconfig \ ! ltmain.sh mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = gtar GZIP_ENV = --best ! SOURCES = $(libgcjgc_la_SOURCES) $(EXTRA_libgcjgc_la_SOURCES) $(libgcjgc_convenience_la_SOURCES) $(EXTRA_libgcjgc_convenience_la_SOURCES) ! OBJECTS = $(libgcjgc_la_OBJECTS) $(libgcjgc_convenience_la_OBJECTS) all: all-redirect .SUFFIXES: ! .SUFFIXES: .S .c .lo .o .obj .s $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile *************** config.status: $(srcdir)/configure $(CON *** 251,280 **** $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) ! mostlyclean-toolexeclibLTLIBRARIES: ! ! clean-toolexeclibLTLIBRARIES: ! -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) ! ! distclean-toolexeclibLTLIBRARIES: ! maintainer-clean-toolexeclibLTLIBRARIES: ! install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) ! @$(NORMAL_INSTALL) ! $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) ! @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ ! if test -f $$p; then \ ! echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \ ! $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \ ! else :; fi; \ ! done ! uninstall-toolexeclibLTLIBRARIES: ! @$(NORMAL_UNINSTALL) ! list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ ! $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \ ! done .c.o: $(COMPILE) -c $< --- 264,277 ---- $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) ! mostlyclean-noinstLTLIBRARIES: ! clean-noinstLTLIBRARIES: ! -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) ! distclean-noinstLTLIBRARIES: ! maintainer-clean-noinstLTLIBRARIES: .c.o: $(COMPILE) -c $< *************** maintainer-clean-libtool: *** 320,325 **** --- 317,325 ---- libgcjgc.la: $(libgcjgc_la_OBJECTS) $(libgcjgc_la_DEPENDENCIES) $(LINK) $(libgcjgc_la_LDFLAGS) $(libgcjgc_la_OBJECTS) $(libgcjgc_la_LIBADD) $(LIBS) + libgcjgc_convenience.la: $(libgcjgc_convenience_la_OBJECTS) $(libgcjgc_convenience_la_DEPENDENCIES) + $(LINK) $(libgcjgc_convenience_la_LDFLAGS) $(libgcjgc_convenience_la_OBJECTS) $(libgcjgc_convenience_la_LIBADD) $(LIBS) + mostlyclean-checkPROGRAMS: clean-checkPROGRAMS: *************** maintainer-clean-checkPROGRAMS: *** 332,343 **** gctest$(EXEEXT): $(gctest_OBJECTS) $(gctest_DEPENDENCIES) @rm -f gctest$(EXEEXT) $(LINK) $(gctest_LDFLAGS) $(gctest_OBJECTS) $(gctest_LDADD) $(LIBS) ! .cc.o: ! $(CXXCOMPILE) -c $< ! .cc.obj: ! $(CXXCOMPILE) -c `cygpath -w $<` ! .cc.lo: ! $(LTCXXCOMPILE) -c $< tags: TAGS --- 332,392 ---- gctest$(EXEEXT): $(gctest_OBJECTS) $(gctest_DEPENDENCIES) @rm -f gctest$(EXEEXT) $(LINK) $(gctest_LDFLAGS) $(gctest_OBJECTS) $(gctest_LDADD) $(LIBS) ! ! # This directory's subdirectories are mostly independent; you can cd ! # into them and run `make' without going through this Makefile. ! # To change the values of `make' variables: instead of editing Makefiles, ! # (1) if the variable is set in `config.status', edit `config.status' ! # (which will cause the Makefiles to be regenerated when you run `make'); ! # (2) otherwise, pass the desired values on the `make' command line. ! ! @SET_MAKE@ ! ! all-recursive install-data-recursive install-exec-recursive \ ! installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ ! check-recursive installcheck-recursive info-recursive dvi-recursive: ! @set fnord $(MAKEFLAGS); amf=$$2; \ ! dot_seen=no; \ ! target=`echo $@ | sed s/-recursive//`; \ ! list='$(SUBDIRS)'; for subdir in $$list; do \ ! echo "Making $$target in $$subdir"; \ ! if test "$$subdir" = "."; then \ ! dot_seen=yes; \ ! local_target="$$target-am"; \ ! else \ ! local_target="$$target"; \ ! fi; \ ! (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ ! || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ! done; \ ! if test "$$dot_seen" = "no"; then \ ! $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ ! fi; test -z "$$fail" ! ! mostlyclean-recursive clean-recursive distclean-recursive \ ! maintainer-clean-recursive: ! @set fnord $(MAKEFLAGS); amf=$$2; \ ! dot_seen=no; \ ! rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ ! rev="$$subdir $$rev"; \ ! test "$$subdir" != "." || dot_seen=yes; \ ! done; \ ! test "$$dot_seen" = "no" && rev=". $$rev"; \ ! target=`echo $@ | sed s/-recursive//`; \ ! for subdir in $$rev; do \ ! echo "Making $$target in $$subdir"; \ ! if test "$$subdir" = "."; then \ ! local_target="$$target-am"; \ ! else \ ! local_target="$$target"; \ ! fi; \ ! (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ ! || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ! done && test -z "$$fail" ! tags-recursive: ! list='$(SUBDIRS)'; for subdir in $$list; do \ ! test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ ! done tags: TAGS *************** ID: $(HEADERS) $(SOURCES) $(LISP) *** 349,357 **** here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) ! TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ --- 398,411 ---- here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) ! TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ *************** distdir: $(DISTFILES) *** 409,421 **** @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ ! cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done check-TESTS: $(TESTS) @failed=0; all=0; \ srcdir=$(srcdir); export srcdir; \ --- 463,485 ---- @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ ! cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done check-TESTS: $(TESTS) @failed=0; all=0; \ srcdir=$(srcdir); export srcdir; \ *************** check-TESTS: $(TESTS) *** 442,474 **** echo "$$dashes"; \ test "$$failed" -eq 0 info-am: ! info: info-am dvi-am: ! dvi: dvi-am check-am: $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS ! check: check-am installcheck-am: ! installcheck: installcheck-am install-info-am: ! install-info: install-info-am ! install-exec-am: install-toolexeclibLTLIBRARIES ! install-exec: install-exec-am install-data-am: ! install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ! install: install-am ! uninstall-am: uninstall-toolexeclibLTLIBRARIES ! uninstall: uninstall-am all-am: Makefile $(LTLIBRARIES) ! all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install ! installdirs: ! $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) mostlyclean-generic: --- 506,538 ---- echo "$$dashes"; \ test "$$failed" -eq 0 info-am: ! info: info-recursive dvi-am: ! dvi: dvi-recursive check-am: $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS ! check: check-recursive installcheck-am: ! installcheck: installcheck-recursive install-info-am: ! install-info: install-info-recursive ! install-exec-am: ! install-exec: install-exec-recursive install-data-am: ! install-data: install-data-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ! install: install-recursive ! uninstall-am: ! uninstall: uninstall-recursive all-am: Makefile $(LTLIBRARIES) ! all-redirect: all-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install ! installdirs: installdirs-recursive ! installdirs-am: mostlyclean-generic: *************** distclean-generic: *** 480,532 **** -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: ! mostlyclean-am: mostlyclean-toolexeclibLTLIBRARIES mostlyclean-compile \ mostlyclean-libtool mostlyclean-checkPROGRAMS \ mostlyclean-tags mostlyclean-generic ! mostlyclean: mostlyclean-am ! clean-am: clean-toolexeclibLTLIBRARIES clean-compile clean-libtool \ clean-checkPROGRAMS clean-tags clean-generic \ mostlyclean-am ! clean: clean-am ! distclean-am: distclean-toolexeclibLTLIBRARIES distclean-compile \ distclean-libtool distclean-checkPROGRAMS \ distclean-tags distclean-generic clean-am -rm -f libtool ! distclean: distclean-am -rm -f config.status ! maintainer-clean-am: maintainer-clean-toolexeclibLTLIBRARIES \ maintainer-clean-compile maintainer-clean-libtool \ maintainer-clean-checkPROGRAMS maintainer-clean-tags \ maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." ! maintainer-clean: maintainer-clean-am -rm -f config.status ! .PHONY: mostlyclean-toolexeclibLTLIBRARIES \ ! distclean-toolexeclibLTLIBRARIES clean-toolexeclibLTLIBRARIES \ ! maintainer-clean-toolexeclibLTLIBRARIES \ ! uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile mostlyclean-libtool distclean-libtool \ clean-libtool maintainer-clean-libtool mostlyclean-checkPROGRAMS \ distclean-checkPROGRAMS clean-checkPROGRAMS \ ! maintainer-clean-checkPROGRAMS tags mostlyclean-tags distclean-tags \ ! clean-tags maintainer-clean-tags distdir check-TESTS info-am info \ ! dvi-am dvi check check-am installcheck-am installcheck install-info-am \ ! install-info install-exec-am install-exec install-data-am install-data \ ! install-am install uninstall-am uninstall all-redirect all-am all \ ! installdirs mostlyclean-generic distclean-generic clean-generic \ ! maintainer-clean-generic clean mostlyclean distclean maintainer-clean ! $(all_objs) : gcconfig.h gc_priv.h gc_hdrs.h gc.h gc_mark.h .s.lo: $(LTCOMPILE) -Wp,-P -x assembler-with-cpp -c $< --- 544,605 ---- -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: ! mostlyclean-am: mostlyclean-noinstLTLIBRARIES mostlyclean-compile \ mostlyclean-libtool mostlyclean-checkPROGRAMS \ mostlyclean-tags mostlyclean-generic ! mostlyclean: mostlyclean-recursive ! clean-am: clean-noinstLTLIBRARIES clean-compile clean-libtool \ clean-checkPROGRAMS clean-tags clean-generic \ mostlyclean-am ! clean: clean-recursive ! distclean-am: distclean-noinstLTLIBRARIES distclean-compile \ distclean-libtool distclean-checkPROGRAMS \ distclean-tags distclean-generic clean-am -rm -f libtool ! distclean: distclean-recursive -rm -f config.status ! maintainer-clean-am: maintainer-clean-noinstLTLIBRARIES \ maintainer-clean-compile maintainer-clean-libtool \ maintainer-clean-checkPROGRAMS maintainer-clean-tags \ maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." ! maintainer-clean: maintainer-clean-recursive -rm -f config.status ! .PHONY: mostlyclean-noinstLTLIBRARIES distclean-noinstLTLIBRARIES \ ! clean-noinstLTLIBRARIES maintainer-clean-noinstLTLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile mostlyclean-libtool distclean-libtool \ clean-libtool maintainer-clean-libtool mostlyclean-checkPROGRAMS \ distclean-checkPROGRAMS clean-checkPROGRAMS \ ! maintainer-clean-checkPROGRAMS install-data-recursive \ ! uninstall-data-recursive install-exec-recursive \ ! uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ ! all-recursive check-recursive installcheck-recursive info-recursive \ ! dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ ! maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ ! distclean-tags clean-tags maintainer-clean-tags distdir check-TESTS \ ! info-am info dvi-am dvi check check-am installcheck-am installcheck \ ! install-info-am install-info install-exec-am install-exec \ ! install-data-am install-data install-am install uninstall-am uninstall \ ! all-redirect all-am all installdirs-am installdirs mostlyclean-generic \ ! distclean-generic clean-generic maintainer-clean-generic clean \ ! mostlyclean distclean maintainer-clean ! # The following hack produces a warning from automake, but we need it in order ! # to build a file from a subdirectory. FIXME. ! test.o: tests/test.c ! $(COMPILE) -c $(srcdir)/tests/test.c ! $(all_objs) : include/private/gcconfig.h include/private/gc_priv.h \ ! include/private/gc_hdrs.h include/gc.h include/gc_gcj.h include/gc_mark.h .s.lo: $(LTCOMPILE) -Wp,-P -x assembler-with-cpp -c $< diff -Nrc3pad gcc-3.0.4/boehm-gc/NT_MAKEFILE gcc-3.1/boehm-gc/NT_MAKEFILE *** gcc-3.0.4/boehm-gc/NT_MAKEFILE Sun May 7 00:43:49 2000 --- gcc-3.1/boehm-gc/NT_MAKEFILE Fri Aug 17 18:30:45 2001 *************** OBJS= alloc.obj reclaim.obj allchblk.obj *** 10,38 **** all: gctest.exe cord\de.exe test_cpp.exe .c.obj: ! $(cc) $(cdebug) $(cflags) $(cvars) -DSILENT -DALL_INTERIOR_POINTERS -D__STDC__ $*.c /Fo$*.obj .cpp.obj: ! $(cc) $(cdebug) $(cflags) $(cvars) -DSILENT -DALL_INTERIOR_POINTERS $*.CPP /Fo$*.obj ! $(OBJS) test.obj: gc_priv.h gc_hdrs.h gc.h gc.lib: $(OBJS) lib /MACHINE:i386 /out:gc.lib $(OBJS) # The original NT SDK used lib32 instead of lib ! gctest.exe: test.obj gc.lib # The following works for win32 debugging. For win32s debugging use debugtype:coff # and add mapsympe line. # This produces a "GUI" applications that opens no windows and writes to the log file # "gc.log". This is done to make the result runnable under win32s. ! $(link) -debug:full -debugtype:cv $(guiflags) -stack:131072 -out:$*.exe test.obj $(guilibs) gc.lib # mapsympe -n -o gctest.sym gctest.exe cord\de_win.rbj: cord\de_win.res cvtres -$(CPU) cord\de_win.res -o cord\de_win.rbj ! cord\de.obj cord\de_win.obj: cord\cord.h cord\private\cord_pos.h cord\de_win.h cord\de_cmds.h cord\de_win.res: cord\de_win.rc cord\de_win.h cord\de_cmds.h $(rc) $(rcvars) -r -fo cord\de_win.res $(cvars) cord\de_win.rc --- 10,38 ---- all: gctest.exe cord\de.exe test_cpp.exe .c.obj: ! $(cc) $(cdebug) $(cflags) $(cvars) -Iinclude -DSILENT -DALL_INTERIOR_POINTERS -D__STDC__ -DGC_NOT_DLL $*.c /Fo$*.obj .cpp.obj: ! $(cc) $(cdebug) $(cflags) $(cvars) -Iinclude -DSILENT -DALL_INTERIOR_POINTERS -DGC_NOT_DLL $*.CPP /Fo$*.obj ! $(OBJS) tests\test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h include\private\gc_locks.h include\private\gc_pmark.h include\gc_mark.h gc.lib: $(OBJS) lib /MACHINE:i386 /out:gc.lib $(OBJS) # The original NT SDK used lib32 instead of lib ! gctest.exe: tests\test.obj gc.lib # The following works for win32 debugging. For win32s debugging use debugtype:coff # and add mapsympe line. # This produces a "GUI" applications that opens no windows and writes to the log file # "gc.log". This is done to make the result runnable under win32s. ! $(link) -debug:full -debugtype:cv $(guiflags) -stack:131072 -out:$*.exe tests\test.obj $(guilibs) gc.lib # mapsympe -n -o gctest.sym gctest.exe cord\de_win.rbj: cord\de_win.res cvtres -$(CPU) cord\de_win.res -o cord\de_win.rbj ! cord\de.obj cord\de_win.obj: include\cord.h include\private\cord_pos.h cord\de_win.h cord\de_cmds.h cord\de_win.res: cord\de_win.rc cord\de_win.h cord\de_cmds.h $(rc) $(rcvars) -r -fo cord\de_win.res $(cvars) cord\de_win.rc *************** cord\de_win.res: cord\de_win.rc cord\de_ *** 41,58 **** cord\de.exe: cord\cordbscs.obj cord\cordxtra.obj cord\de.obj cord\de_win.obj cord\de_win.rbj gc.lib $(link) -debug:full -debugtype:cv $(guiflags) -stack:16384 -out:cord\de.exe cord\cordbscs.obj cord\cordxtra.obj cord\de.obj cord\de_win.obj cord\de_win.rbj gc.lib $(guilibs) ! gc_cpp.obj: gc_cpp.h gc.h gc_cpp.cpp: gc_cpp.cc copy gc_cpp.cc gc_cpp.cpp ! test_cpp.cpp: test_cpp.cc ! copy test_cpp.cc test_cpp.cpp # This generates the C++ test executable. The executable expects # a single numeric argument, which is the number of iterations. # The output appears in the file "gc.log". ! test_cpp.exe: test_cpp.obj gc_cpp.h gc.h gc.lib $(link) -debug:full -debugtype:cv $(guiflags) -stack:16384 -out:test_cpp.exe test_cpp.obj gc.lib $(guilibs) --- 41,58 ---- cord\de.exe: cord\cordbscs.obj cord\cordxtra.obj cord\de.obj cord\de_win.obj cord\de_win.rbj gc.lib $(link) -debug:full -debugtype:cv $(guiflags) -stack:16384 -out:cord\de.exe cord\cordbscs.obj cord\cordxtra.obj cord\de.obj cord\de_win.obj cord\de_win.rbj gc.lib $(guilibs) ! gc_cpp.obj: include\gc_cpp.h include\gc.h gc_cpp.cpp: gc_cpp.cc copy gc_cpp.cc gc_cpp.cpp ! test_cpp.cpp: tests\test_cpp.cc ! copy tests\test_cpp.cc test_cpp.cpp # This generates the C++ test executable. The executable expects # a single numeric argument, which is the number of iterations. # The output appears in the file "gc.log". ! test_cpp.exe: test_cpp.obj include\gc_cpp.h include\gc.h gc.lib $(link) -debug:full -debugtype:cv $(guiflags) -stack:16384 -out:test_cpp.exe test_cpp.obj gc.lib $(guilibs) diff -Nrc3pad gcc-3.0.4/boehm-gc/NT_THREADS_MAKEFILE gcc-3.1/boehm-gc/NT_THREADS_MAKEFILE *** gcc-3.0.4/boehm-gc/NT_THREADS_MAKEFILE Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/NT_THREADS_MAKEFILE Tue Oct 16 09:01:35 2001 *************** *** 1,5 **** # Microsoft Developer Studio Generated NMAKE File, Format Version 4.10 ! # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 --- 1,6 ---- # Microsoft Developer Studio Generated NMAKE File, Format Version 4.10 ! # This has been hand-edited way too many times. ! # A clean, manually generated makefile would be an improvement. # TARGTYPE "Win32 (x86) Application" 0x0101 # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 *************** CLEAN : *** 72,77 **** --- 73,80 ---- -@erase ".\Release\finalize.obj" -@erase ".\Release\finalize.sbr" -@erase ".\Release\gc.bsc" + -@erase ".\Release\gc_cpp.obj" + -@erase ".\Release\gc_cpp.sbr" -@erase ".\Release\gc.dll" -@erase ".\Release\gc.exp" -@erase ".\Release\gc.lib" *************** CLEAN : *** 111,120 **** CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D\ "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\Release/ CPP_SBRS=.\Release/ --- 114,123 ---- CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D\ "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "GC_WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\Release/ CPP_SBRS=.\Release/ *************** BSC32_SBRS= \ *** 155,160 **** --- 158,164 ---- ".\Release\dbg_mlc.sbr" \ ".\Release\dyn_load.sbr" \ ".\Release\finalize.sbr" \ + ".\Release\gc_cpp.sbr" \ ".\Release\headers.sbr" \ ".\Release\mach_dep.sbr" \ ".\Release\malloc.sbr" \ *************** LINK32_OBJS= \ *** 192,197 **** --- 196,202 ---- ".\Release\dbg_mlc.obj" \ ".\Release\dyn_load.obj" \ ".\Release\finalize.obj" \ + ".\Release\gc_cpp.obj" \ ".\Release\headers.obj" \ ".\Release\mach_dep.obj" \ ".\Release\malloc.obj" \ *************** CLEAN : *** 245,250 **** --- 250,257 ---- -@erase ".\Debug\dyn_load.sbr" -@erase ".\Debug\finalize.obj" -@erase ".\Debug\finalize.sbr" + -@erase ".\Debug\gc_cpp.obj" + -@erase ".\Debug\gc_cpp.sbr" -@erase ".\Debug\gc.bsc" -@erase ".\Debug\gc.dll" -@erase ".\Debug\gc.exp" *************** CLEAN : *** 289,298 **** CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "SILENT" /D "GC_BUILD"\ /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/"\ /Fd"$(INTDIR)/" /c CPP_OBJS=.\Debug/ CPP_SBRS=.\Debug/ --- 296,305 ---- CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I include /D "_DEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I include /D "_DEBUG" /D "SILENT" /D "GC_BUILD"\ /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "GC_WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/"\ /Fd"$(INTDIR)/" /c CPP_OBJS=.\Debug/ CPP_SBRS=.\Debug/ *************** BSC32_SBRS= \ *** 334,339 **** --- 341,347 ---- ".\Debug\dbg_mlc.sbr" \ ".\Debug\dyn_load.sbr" \ ".\Debug\finalize.sbr" \ + ".\Debug\gc_cpp.sbr" \ ".\Debug\headers.sbr" \ ".\Debug\mach_dep.sbr" \ ".\Debug\malloc.sbr" \ *************** LINK32_OBJS= \ *** 371,376 **** --- 379,385 ---- ".\Debug\dbg_mlc.obj" \ ".\Debug\dyn_load.obj" \ ".\Debug\finalize.obj" \ + ".\Debug\gc_cpp.obj" \ ".\Debug\headers.obj" \ ".\Debug\mach_dep.obj" \ ".\Debug\malloc.obj" \ *************** CLEAN : *** 416,426 **** "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ ! "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\gctest\Release/ CPP_SBRS=.\. --- 425,438 ---- "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + test.c : tests\test.c + copy tests\test.c test.c + CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ ! "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\gctest\Release/ CPP_SBRS=.\. *************** CLEAN : *** 504,512 **** CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\ ! /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR"$(INTDIR)/"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\gctest\Debug/ CPP_SBRS=.\gctest\Debug/ --- 516,524 ---- CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I include /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\ ! /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR"$(INTDIR)/"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\gctest\Debug/ CPP_SBRS=.\gctest\Debug/ *************** CLEAN : *** 596,602 **** CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\cord\Release/ CPP_SBRS=.\. --- 608,614 ---- CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "." /I include /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\cord\Release/ CPP_SBRS=.\. *************** CLEAN : *** 688,694 **** CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D\ "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX\ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\cord\Debug/ --- 700,706 ---- CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /I include /D "_DEBUG" /D "WIN32" /D\ "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX\ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\cord\Debug/ *************** LINK32_OBJS= \ *** 763,777 **** ################################################################################ # Begin Source File SOURCE=.\reclaim.c !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_RECLA=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ --- 775,839 ---- ################################################################################ # Begin Source File + SOURCE=.\gc_cpp.cpp + + !IF "$(CFG)" == "gc - Win32 Release" + + DEP_CPP_RECLA=\ + ".\include\private\gcconfig.h"\ + ".\include\gc.h"\ + ".\include\private\gc_hdrs.h"\ + ".\include\private\gc_priv.h"\ + ".\include\gc_cpp.h"\ + {$(INCLUDE)}"\sys\TYPES.H"\ + + NODEP_CPP_RECLA=\ + ".\th\PCR_Th.h"\ + ".\th\PCR_ThCrSec.h"\ + ".\th\PCR_ThCtl.h"\ + + + ".\Release\gc_cpp.obj" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + ".\Release\gc_cpp.sbr" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + + !ELSEIF "$(CFG)" == "gc - Win32 Debug" + + DEP_CPP_RECLA=\ + ".\include\private\gcconfig.h"\ + ".\include\gc.h"\ + ".\include\private\gc_hdrs.h"\ + ".\include\private\gc_priv.h"\ + ".\include\gc_cpp.h"\ + {$(INCLUDE)}"\sys\TYPES.H"\ + + NODEP_CPP_RECLA=\ + ".\th\PCR_Th.h"\ + ".\th\PCR_ThCrSec.h"\ + ".\th\PCR_ThCtl.h"\ + + + ".\Debug\gc_cpp.obj" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + ".\Debug\gc_cpp.sbr" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + + !ENDIF + + # End Source File + ################################################################################ + # Begin Source File + SOURCE=.\reclaim.c !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_RECLA=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ *************** NODEP_CPP_RECLA=\ *** 788,797 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_RECLA=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ --- 850,859 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_RECLA=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ *************** NODEP_CPP_RECLA=\ *** 808,813 **** --- 870,876 ---- !ENDIF # End Source File + ################################################################################ # Begin Source File *************** SOURCE=.\os_dep.c *** 816,825 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OS_DE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 879,888 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OS_DE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** NODEP_CPP_OS_DE=\ *** 840,849 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OS_DE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 903,912 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OS_DE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** SOURCE=.\misc.c *** 872,881 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MISC_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ --- 935,944 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MISC_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ *************** NODEP_CPP_MISC_=\ *** 893,902 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MISC_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ --- 956,965 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MISC_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ *************** SOURCE=.\mark_rts.c *** 922,931 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ --- 985,994 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ *************** NODEP_CPP_MARK_=\ *** 942,951 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ --- 1005,1014 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ *************** SOURCE=.\mach_dep.c *** 970,979 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MACH_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ --- 1033,1042 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MACH_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ *************** NODEP_CPP_MACH_=\ *** 990,999 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MACH_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ --- 1053,1062 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MACH_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ *************** SOURCE=.\headers.c *** 1018,1027 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_HEADE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ --- 1081,1090 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_HEADE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ *************** NODEP_CPP_HEADE=\ *** 1038,1047 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_HEADE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ --- 1101,1110 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_HEADE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ *************** SOURCE=.\alloc.c *** 1066,1075 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLOC=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ --- 1129,1138 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLOC=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ *************** NODEP_CPP_ALLOC=\ *** 1086,1095 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLOC=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ --- 1149,1158 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLOC=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ *************** SOURCE=.\allchblk.c *** 1114,1123 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLCH=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ --- 1177,1186 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLCH=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ *************** NODEP_CPP_ALLCH=\ *** 1134,1143 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLCH=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ --- 1197,1206 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLCH=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ *************** SOURCE=.\stubborn.c *** 1162,1171 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_STUBB=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ --- 1225,1234 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_STUBB=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ *************** NODEP_CPP_STUBB=\ *** 1182,1191 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_STUBB=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ --- 1245,1254 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_STUBB=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ *************** SOURCE=.\obj_map.c *** 1210,1219 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OBJ_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ --- 1273,1282 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OBJ_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ *************** NODEP_CPP_OBJ_M=\ *** 1230,1239 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OBJ_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ --- 1293,1302 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OBJ_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ *************** SOURCE=.\new_hblk.c *** 1258,1267 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_NEW_H=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ --- 1321,1330 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_NEW_H=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ *************** NODEP_CPP_NEW_H=\ *** 1278,1287 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_NEW_H=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ --- 1341,1350 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_NEW_H=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ *************** SOURCE=.\mark.c *** 1306,1316 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ --- 1369,1380 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ *************** NODEP_CPP_MARK_C=\ *** 1327,1337 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ --- 1391,1402 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ *************** SOURCE=.\malloc.c *** 1356,1365 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLO=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ --- 1421,1430 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLO=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ *************** NODEP_CPP_MALLO=\ *** 1376,1385 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLO=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ --- 1441,1450 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLO=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ *************** SOURCE=.\mallocx.c *** 1404,1413 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLX=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ --- 1469,1478 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLX=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ *************** NODEP_CPP_MALLX=\ *** 1424,1433 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLX=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ --- 1489,1498 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLX=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ *************** SOURCE=.\finalize.c *** 1452,1462 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_FINAL=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ --- 1517,1528 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_FINAL=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ *************** NODEP_CPP_FINAL=\ *** 1473,1483 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_FINAL=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ --- 1539,1550 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_FINAL=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ *************** SOURCE=.\dbg_mlc.c *** 1502,1511 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DBG_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ --- 1569,1578 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DBG_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ *************** NODEP_CPP_DBG_M=\ *** 1522,1531 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DBG_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ --- 1589,1598 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DBG_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ *************** SOURCE=.\blacklst.c *** 1550,1559 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_BLACK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ --- 1617,1626 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_BLACK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ *************** NODEP_CPP_BLACK=\ *** 1570,1579 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_BLACK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ --- 1637,1646 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_BLACK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ *************** SOURCE=.\typd_mlc.c *** 1598,1609 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_TYPD_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ ! ".\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ --- 1665,1677 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_TYPD_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ ! ".\include\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ *************** NODEP_CPP_TYPD_=\ *** 1620,1631 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_TYPD_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ ! ".\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ --- 1688,1700 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_TYPD_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ ! ".\include\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ *************** SOURCE=.\ptr_chck.c *** 1650,1660 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_PTR_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ --- 1719,1730 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_PTR_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ *************** NODEP_CPP_PTR_C=\ *** 1671,1681 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_PTR_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ --- 1741,1752 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_PTR_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ *************** SOURCE=.\dyn_load.c *** 1700,1709 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DYN_L=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 1771,1780 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DYN_L=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** NODEP_CPP_DYN_L=\ *** 1723,1732 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DYN_L=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 1794,1803 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DYN_L=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** SOURCE=.\win32_threads.c *** 1754,1763 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_WIN32=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ --- 1825,1834 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_WIN32=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ *************** NODEP_CPP_WIN32=\ *** 1774,1783 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_WIN32=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ --- 1845,1854 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_WIN32=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ *************** SOURCE=.\checksums.c *** 1802,1811 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_CHECK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ --- 1873,1882 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_CHECK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ *************** NODEP_CPP_CHECK=\ *** 1822,1831 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_CHECK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ --- 1893,1902 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_CHECK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ *************** NODEP_CPP_CHECK=\ *** 1876,1888 **** ################################################################################ # Begin Source File ! SOURCE=.\test.c DEP_CPP_TEST_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ ! ".\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TEST_=\ --- 1947,1959 ---- ################################################################################ # Begin Source File ! SOURCE=.\tests\test.c DEP_CPP_TEST_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ ! ".\include\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TEST_=\ *************** NODEP_CPP_TEST_=\ *** 1944,1956 **** SOURCE=.\cord\de_win.c DEP_CPP_DE_WI=\ ! ".\cord\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_DE_WI=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2015,2027 ---- SOURCE=.\cord\de_win.c DEP_CPP_DE_WI=\ ! ".\include\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_DE_WI=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" *************** NODEP_CPP_DE_WI=\ *** 1975,1987 **** SOURCE=.\cord\de.c DEP_CPP_DE_C2e=\ ! ".\cord\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_DE_C2e=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2046,2058 ---- SOURCE=.\cord\de.c DEP_CPP_DE_C2e=\ ! ".\include\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_DE_C2e=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" *************** NODEP_CPP_DE_C2e=\ *** 2006,2017 **** SOURCE=.\cord\cordxtra.c DEP_CPP_CORDX=\ ! ".\cord\cord.h"\ ! ".\cord\ec.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_CORDX=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2077,2088 ---- SOURCE=.\cord\cordxtra.c DEP_CPP_CORDX=\ ! ".\include\cord.h"\ ! ".\include\ec.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_CORDX=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" *************** NODEP_CPP_CORDX=\ *** 2036,2046 **** SOURCE=.\cord\cordbscs.c DEP_CPP_CORDB=\ ! ".\cord\cord.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_CORDB=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2107,2117 ---- SOURCE=.\cord\cordbscs.c DEP_CPP_CORDB=\ ! ".\include\cord.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_CORDB=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" diff -Nrc3pad gcc-3.0.4/boehm-gc/OS2_MAKEFILE gcc-3.1/boehm-gc/OS2_MAKEFILE *** gcc-3.0.4/boehm-gc/OS2_MAKEFILE Wed Jun 30 12:42:37 1999 --- gcc-3.1/boehm-gc/OS2_MAKEFILE Fri Aug 17 18:30:45 2001 *************** CFLAGS= /O /Q /DSILENT /DSMALL_CONFIG /D *** 17,23 **** all: $(OBJS) gctest.exe cord\cordtest.exe ! $(OBJS) test.obj: gc_priv.h gc_hdrs.h gc.h ## ERASE THE LIB FIRST - if it is already there then this command will fail ## (make sure its there or erase will fail!) --- 17,23 ---- all: $(OBJS) gctest.exe cord\cordtest.exe ! $(OBJS) test.obj: include\private\gc_priv.h include\private\gc_hdrs.h include\gc.h include\private\gcconfig.h ## ERASE THE LIB FIRST - if it is already there then this command will fail ## (make sure its there or erase will fail!) *************** mach_dep.obj: mach_dep.c *** 32,45 **** gctest.exe: test.obj gc.lib $(CC) $(CFLAGS) /B"/STACK:524288" /Fegctest test.obj gc.lib ! cord\cordbscs.obj: cord\cordbscs.c cord\cord.h cord\private\cord_pos.h $(CC) $(CFLAGS) /C /Focord\cordbscs cord\cordbscs.c ! cord\cordxtra.obj: cord\cordxtra.c cord\cord.h cord\private\cord_pos.h cord\ec.h $(CC) $(CFLAGS) /C /Focord\cordxtra cord\cordxtra.c ! cord\cordprnt.obj: cord\cordprnt.c cord\cord.h cord\private\cord_pos.h cord\ec.h $(CC) $(CFLAGS) /C /Focord\cordprnt cord\cordprnt.c ! cord\cordtest.exe: cord\cordtest.c cord\cord.h cord\private\cord_pos.h cord\ec.h $(CORDOBJS) gc.lib $(CC) $(CFLAGS) /B"/STACK:65536" /Fecord\cordtest cord\cordtest.c gc.lib $(CORDOBJS) --- 32,45 ---- gctest.exe: test.obj gc.lib $(CC) $(CFLAGS) /B"/STACK:524288" /Fegctest test.obj gc.lib ! cord\cordbscs.obj: cord\cordbscs.c include\cord.h include\private\cord_pos.h $(CC) $(CFLAGS) /C /Focord\cordbscs cord\cordbscs.c ! cord\cordxtra.obj: cord\cordxtra.c include\cord.h include\private\cord_pos.h include\ec.h $(CC) $(CFLAGS) /C /Focord\cordxtra cord\cordxtra.c ! cord\cordprnt.obj: cord\cordprnt.c include\cord.h include\private\cord_pos.h include\ec.h $(CC) $(CFLAGS) /C /Focord\cordprnt cord\cordprnt.c ! cord\cordtest.exe: cord\cordtest.c include\cord.h include\private\cord_pos.h include\ec.h $(CORDOBJS) gc.lib $(CC) $(CFLAGS) /B"/STACK:65536" /Fecord\cordtest cord\cordtest.c gc.lib $(CORDOBJS) diff -Nrc3pad gcc-3.0.4/boehm-gc/README gcc-3.1/boehm-gc/README *** gcc-3.0.4/boehm-gc/README Tue Jun 20 01:04:58 2000 --- gcc-3.1/boehm-gc/README Thu Jan 1 00:00:00 1970 *************** *** 1,1646 **** - Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved. - Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. - Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. - - [ This version of the collector modified for use in libgcj. - See the file ChangeLog for details ] - - THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - - Permission is hereby granted to use or copy this program - for any purpose, provided the above notices are retained on all copies. - Permission to modify the code and to distribute modified code is granted, - provided the above notices are retained, and a notice that the code was - modified is included with the above copyright notice. - - This is version 5.1 of a conservative garbage collector for C and C++. - - You might find a more recent version of this at - - http://www.hpl.hp.com/personal/Hans_Boehm/gc - - HISTORY - - - Early versions of this collector were developed as a part of research - projects supported in part by the National Science Foundation - and the Defense Advance Research Projects Agency. - Much of the code was rewritten by Hans-J. Boehm (boehm@acm.org) at Xerox PARC, - SGI, and HP Labs. - - Some other contributors: - - More recent contributors are mentioned in the modification history at the - end of this file. My apologies for any omissions. - - The SPARC specific code was contributed by Mark Weiser - (weiser@parc.xerox.com). The Encore Multimax modifications were supplied by - Kevin Kenny (kenny@m.cs.uiuc.edu). The adaptation to the RT is largely due - to Vernon Lee (scorpion@rice.edu), on machines made available by IBM. - Much of the HP specific code and a number of good suggestions for improving the - generic code are due to Walter Underwood (wunder@hp-ses.sde.hp.com). - Robert Brazile (brazile@diamond.bbn.com) originally supplied the ULTRIX code. - Al Dosser (dosser@src.dec.com) and Regis Cridlig (Regis.Cridlig@cl.cam.ac.uk) - subsequently provided updates and information on variation between ULTRIX - systems. Parag Patel (parag@netcom.com) supplied the A/UX code. - Jesper Peterson(jep@mtiame.mtia.oz.au), Michel Schinz, and - Martin Tauchmann (martintauchmann@bigfoot.com) supplied the Amiga port. - Thomas Funke (thf@zelator.in-berlin.de(?)) and - Brian D.Carlstrom (bdc@clark.lcs.mit.edu) supplied the NeXT ports. - Douglas Steel (doug@wg.icl.co.uk) provided ICL DRS6000 code. - Bill Janssen (janssen@parc.xerox.com) supplied the SunOS dynamic loader - specific code. Manuel Serrano (serrano@cornas.inria.fr) supplied linux and - Sony News specific code. Al Dosser provided Alpha/OSF/1 code. He and - Dave Detlefs(detlefs@src.dec.com) also provided several generic bug fixes. - Alistair G. Crooks(agc@uts.amdahl.com) supplied the NetBSD and 386BSD ports. - Jeffrey Hsu (hsu@soda.berkeley.edu) provided the FreeBSD port. - Brent Benson (brent@jade.ssd.csd.harris.com) ported the collector to - a Motorola 88K processor running CX/UX (Harris NightHawk). - Ari Huttunen (Ari.Huttunen@hut.fi) generalized the OS/2 port to - nonIBM development environments (a nontrivial task). - Patrick Beard (beard@cs.ucdavis.edu) provided the initial MacOS port. - David Chase, then at Olivetti Research, suggested several improvements. - Scott Schwartz (schwartz@groucho.cse.psu.edu) supplied some of the - code to save and print call stacks for leak detection on a SPARC. - Jesse Hull and John Ellis supplied the C++ interface code. - Zhong Shao performed much of the experimentation that led to the - current typed allocation facility. (His dynamic type inference code hasn't - made it into the released version of the collector, yet.) - (Blame for misinstallation of these modifications goes to the first author, - however.) - - OVERVIEW - - This is intended to be a general purpose, garbage collecting storage - allocator. The algorithms used are described in: - - Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment", - Software Practice & Experience, September 1988, pp. 807-820. - - Boehm, H., A. Demers, and S. Shenker, "Mostly Parallel Garbage Collection", - Proceedings of the ACM SIGPLAN '91 Conference on Programming Language Design - and Implementation, SIGPLAN Notices 26, 6 (June 1991), pp. 157-164. - - Boehm, H., "Space Efficient Conservative Garbage Collection", Proceedings - of the ACM SIGPLAN '91 Conference on Programming Language Design and - Implementation, SIGPLAN Notices 28, 6 (June 1993), pp. 197-206. - - Possible interactions between the collector and optimizing compilers are - discussed in - - Boehm, H., and D. Chase, "A Proposal for GC-safe C Compilation", - The Journal of C Language Translation 4, 2 (December 1992). - - and - - Boehm H., "Simple GC-safe Compilation", Proceedings - of the ACM SIGPLAN '96 Conference on Programming Language Design and - Implementation. - - (Both are also available from - http://reality.sgi.com/boehm/papers/, among other places.) - - Unlike the collector described in the second reference, this collector - operates either with the mutator stopped during the entire collection - (default) or incrementally during allocations. (The latter is supported - on only a few machines.) It does not rely on threads, but is intended - to be thread-safe. - - Some of the ideas underlying the collector have previously been explored - by others. (Doug McIlroy wrote a vaguely similar collector that is part of - version 8 UNIX (tm).) However none of this work appears to have been widely - disseminated. - - Rudimentary tools for use of the collector as a leak detector are included, as - is a fairly sophisticated string package "cord" that makes use of the collector. - (See cord/README.) - - - GENERAL DESCRIPTION - - This is a garbage collecting storage allocator that is intended to be - used as a plug-in replacement for C's malloc. - - Since the collector does not require pointers to be tagged, it does not - attempt to ensure that all inaccessible storage is reclaimed. However, - in our experience, it is typically more successful at reclaiming unused - memory than most C programs using explicit deallocation. Unlike manually - introduced leaks, the amount of unreclaimed memory typically stays - bounded. - - In the following, an "object" is defined to be a region of memory allocated - by the routines described below. - - Any objects not intended to be collected must be pointed to either - from other such accessible objects, or from the registers, - stack, data, or statically allocated bss segments. Pointers from - the stack or registers may point to anywhere inside an object. - The same is true for heap pointers if the collector is compiled with - ALL_INTERIOR_POINTERS defined, as is now the default. - - Compiling without ALL_INTERIOR_POINTERS may reduce accidental retention - of garbage objects, by requiring pointers from the heap to to the beginning - of an object. But this no longer appears to be a significant - issue for most programs. - - There are a number of routines which modify the pointer recognition - algorithm. GC_register_displacement allows certain interior pointers - to be recognized even if ALL_INTERIOR_POINTERS is nor defined. - GC_malloc_ignore_off_page allows some pointers into the middle of large objects - to be disregarded, greatly reducing the probablility of accidental - retention of large objects. For most purposes it seems best to compile - with ALL_INTERIOR_POINTERS and to use GC_malloc_ignore_off_page if - you get collector warnings from allocations of very large objects. - See README.debugging for details. - - Note that pointers inside memory allocated by the standard "malloc" are not - seen by the garbage collector. Thus objects pointed to only from such a - region may be prematurely deallocated. It is thus suggested that the - standard "malloc" be used only for memory regions, such as I/O buffers, that - are guaranteed not to contain pointers to garbage collectable memory. - Pointers in C language automatic, static, or register variables, - are correctly recognized. (Note that GC_malloc_uncollectable has semantics - similar to standard malloc, but allocates objects that are traced by the - collector.) - - The collector does not always know how to find pointers in data - areas that are associated with dynamic libraries. This is easy to - remedy IF you know how to find those data areas on your operating - system (see GC_add_roots). Code for doing this under SunOS, IRIX 5.X and 6.X, - HP/UX, Alpha OSF/1, Linux, and win32 is included and used by default. (See - README.win32 for win32 details.) On other systems pointers from dynamic - library data areas may not be considered by the collector. - - Note that the garbage collector does not need to be informed of shared - read-only data. However if the shared library mechanism can introduce - discontiguous data areas that may contain pointers, then the collector does - need to be informed. - - Signal processing for most signals may be deferred during collection, - and during uninterruptible parts of the allocation process. Unlike - standard ANSI C mallocs, it can be safe to invoke malloc - from a signal handler while another malloc is in progress, provided - the original malloc is not restarted. (Empirically, many UNIX - applications already assume this.) To obtain this level of signal - safety, remove the definition of -DNO_SIGNALS in Makefile. This incurs - a minor performance penalty, and hence is no longer the default. - - The allocator/collector can also be configured for thread-safe operation. - (Full signal safety can also be achieved, but only at the cost of two system - calls per malloc, which is usually unacceptable.) - - INSTALLATION AND PORTABILITY - - As distributed, the macro SILENT is defined in Makefile. - In the event of problems, this can be removed to obtain a moderate - amount of descriptive output for each collection. - (The given statistics exhibit a few peculiarities. - Things don't appear to add up for a variety of reasons, most notably - fragmentation losses. These are probably much more significant for the - contrived program "test.c" than for your application.) - - Note that typing "make test" will automatically build the collector - and then run setjmp_test and gctest. Setjmp_test will give you information - about configuring the collector, which is useful primarily if you have - a machine that's not already supported. Gctest is a somewhat superficial - test of collector functionality. Failure is indicated by a core dump or - a message to the effect that the collector is broken. Gctest takes about - 35 seconds to run on a SPARCstation 2. On a slower machine, - expect it to take a while. It may use up to 8 MB of memory. (The - multi-threaded version will use more.) "Make test" will also, as - its last step, attempt to build and test the "cord" string library. - This will fail without an ANSI C compiler. - - The Makefile will generate a library gc.a which you should link against. - Typing "make cords" will add the cord library to gc.a. - Note that this requires an ANSI C compiler. - - It is suggested that if you need to replace a piece of the collector - (e.g. GC_mark_rts.c) you simply list your version ahead of gc.a on the - work.) - ld command line, rather than replacing the one in gc.a. (This will - generate numerous warnings under some versions of AIX, but it still - works.) - - All include files that need to be used by clients will be put in the - include subdirectory. (Normally this is just gc.h. "Make cords" adds - "cord.h" and "ec.h".) - - The collector currently is designed to run essentially unmodified on - machines that use a flat 32-bit or 64-bit address space. - That includes the vast majority of Workstations and X86 (X >= 3) PCs. - (The list here was deleted because it was getting too long and constantly - out of date.) - It does NOT run under plain 16-bit DOS or Windows 3.X. There are however - various packages (e.g. win32s, djgpp) that allow flat 32-bit address - applications to run under those systemsif the have at least an 80386 processor, - and several of those are compatible with the collector. - - In a few cases (Amiga, OS/2, Win32, MacOS) a separate makefile - or equivalent is supplied. Many of these have separate README.system - files. - - Dynamic libraries are completely supported only under SunOS - (and even that support is not functional on the last Sun 3 release), - IRIX 5&6, HP-PA, Win32 (not Win32S) and OSF/1 on DEC AXP machines. - On other machines we recommend that you do one of the following: - - 1) Add dynamic library support (and send us the code). - 2) Use static versions of the libraries. - 3) Arrange for dynamic libraries to use the standard malloc. - This is still dangerous if the library stores a pointer to a - garbage collected object. But nearly all standard interfaces - prohibit this, because they deal correctly with pointers - to stack allocated objects. (Strtok is an exception. Don't - use it.) - - In all cases we assume that pointer alignment is consistent with that - enforced by the standard C compilers. If you use a nonstandard compiler - you may have to adjust the alignment parameters defined in gc_priv.h. - - A port to a machine that is not byte addressed, or does not use 32 bit - or 64 bit addresses will require a major effort. A port to plain MSDOS - or win16 is hard. - - For machines not already mentioned, or for nonstandard compilers, the - following are likely to require change: - - 1. The parameters in gcconfig.h. - The parameters that will usually require adjustment are - STACKBOTTOM, ALIGNMENT and DATASTART. Setjmp_test - prints its guesses of the first two. - DATASTART should be an expression for computing the - address of the beginning of the data segment. This can often be - &etext. But some memory management units require that there be - some unmapped space between the text and the data segment. Thus - it may be more complicated. On UNIX systems, this is rarely - documented. But the adb "$m" command may be helpful. (Note - that DATASTART will usually be a function of &etext. Thus a - single experiment is usually insufficient.) - STACKBOTTOM is used to initialize GC_stackbottom, which - should be a sufficient approximation to the coldest stack address. - On some machines, it is difficult to obtain such a value that is - valid across a variety of MMUs, OS releases, etc. A number of - alternatives exist for using the collector in spite of this. See the - discussion in gcconfig.h immediately preceding the various - definitions of STACKBOTTOM. - - 2. mach_dep.c. - The most important routine here is one to mark from registers. - The distributed file includes a generic hack (based on setjmp) that - happens to work on many machines, and may work on yours. Try - compiling and running setjmp_t.c to see whether it has a chance of - working. (This is not correct C, so don't blame your compiler if it - doesn't work. Based on limited experience, register window machines - are likely to cause trouble. If your version of setjmp claims that - all accessible variables, including registers, have the value they - had at the time of the longjmp, it also will not work. Vanilla 4.2 BSD - on Vaxen makes such a claim. SunOS does not.) - If your compiler does not allow in-line assembly code, or if you prefer - not to use such a facility, mach_dep.c may be replaced by a .s file - (as we did for the MIPS machine and the PC/RT). - At this point enough architectures are supported by mach_dep.c - that you will rarely need to do more than adjust for assembler - syntax. - - 3. os_dep.c (and gc_priv.h). - Several kinds of operating system dependent routines reside here. - Many are optional. Several are invoked only through corresponding - macros in gc_priv.h, which may also be redefined as appropriate. - The routine GC_register_data_segments is crucial. It registers static - data areas that must be traversed by the collector. (User calls to - GC_add_roots may sometimes be used for similar effect.) - Routines to obtain memory from the OS also reside here. - Alternatively this can be done entirely by the macro GET_MEM - defined in gc_priv.h. Routines to disable and reenable signals - also reside here if they are need by the macros DISABLE_SIGNALS - and ENABLE_SIGNALS defined in gc_priv.h. - In a multithreaded environment, the macros LOCK and UNLOCK - in gc_priv.h will need to be suitably redefined. - The incremental collector requires page dirty information, which - is acquired through routines defined in os_dep.c. Unless directed - otherwise by gcconfig.h, these are implemented as stubs that simply - treat all pages as dirty. (This of course makes the incremental - collector much less useful.) - - 4. dyn_load.c - This provides a routine that allows the collector to scan data - segments associated with dynamic libraries. Often it is not - necessary to provide this routine unless user-written dynamic - libraries are used. - - For a different version of UN*X or different machines using the - Motorola 68000, Vax, SPARC, 80386, NS 32000, PC/RT, or MIPS architecture, - it should frequently suffice to change definitions in gcconfig.h. - - - THE C INTERFACE TO THE ALLOCATOR - - The following routines are intended to be directly called by the user. - Note that usually only GC_malloc is necessary. GC_clear_roots and GC_add_roots - calls may be required if the collector has to trace from nonstandard places - (e.g. from dynamic library data areas on a machine on which the - collector doesn't already understand them.) On some machines, it may - be desirable to set GC_stacktop to a good approximation of the stack base. - (This enhances code portability on HP PA machines, since there is no - good way for the collector to compute this value.) Client code may include - "gc.h", which defines all of the following, plus many others. - - 1) GC_malloc(nbytes) - - allocate an object of size nbytes. Unlike malloc, the object is - cleared before being returned to the user. Gc_malloc will - invoke the garbage collector when it determines this to be appropriate. - GC_malloc may return 0 if it is unable to acquire sufficient - space from the operating system. This is the most probable - consequence of running out of space. Other possible consequences - are that a function call will fail due to lack of stack space, - or that the collector will fail in other ways because it cannot - maintain its internal data structures, or that a crucial system - process will fail and take down the machine. Most of these - possibilities are independent of the malloc implementation. - - 2) GC_malloc_atomic(nbytes) - - allocate an object of size nbytes that is guaranteed not to contain any - pointers. The returned object is not guaranteed to be cleared. - (Can always be replaced by GC_malloc, but results in faster collection - times. The collector will probably run faster if large character - arrays, etc. are allocated with GC_malloc_atomic than if they are - statically allocated.) - - 3) GC_realloc(object, new_size) - - change the size of object to be new_size. Returns a pointer to the - new object, which may, or may not, be the same as the pointer to - the old object. The new object is taken to be atomic iff the old one - was. If the new object is composite and larger than the original object, - then the newly added bytes are cleared (we hope). This is very likely - to allocate a new object, unless MERGE_SIZES is defined in gc_priv.h. - Even then, it is likely to recycle the old object only if the object - is grown in small additive increments (which, we claim, is generally bad - coding practice.) - - 4) GC_free(object) - - explicitly deallocate an object returned by GC_malloc or - GC_malloc_atomic. Not necessary, but can be used to minimize - collections if performance is critical. Probably a performance - loss for very small objects (<= 8 bytes). - - 5) GC_expand_hp(bytes) - - Explicitly increase the heap size. (This is normally done automatically - if a garbage collection failed to GC_reclaim enough memory. Explicit - calls to GC_expand_hp may prevent unnecessarily frequent collections at - program startup.) - - 6) GC_malloc_ignore_off_page(bytes) - - identical to GC_malloc, but the client promises to keep a pointer to - the somewhere within the first 256 bytes of the object while it is - live. (This pointer should nortmally be declared volatile to prevent - interference from compiler optimizations.) This is the recommended - way to allocate anything that is likely to be larger than 100Kbytes - or so. (GC_malloc may result in failure to reclaim such objects.) - - 7) GC_set_warn_proc(proc) - - Can be used to redirect warnings from the collector. Such warnings - should be rare, and should not be ignored during code development. - - 8) GC_enable_incremental() - - Enables generational and incremental collection. Useful for large - heaps on machines that provide access to page dirty information. - Some dirty bit implementations may interfere with debugging - (by catching address faults) and place restrictions on heap arguments - to system calls (since write faults inside a system call may not be - handled well). - - 9) Several routines to allow for registration of finalization code. - User supplied finalization code may be invoked when an object becomes - unreachable. To call (*f)(obj, x) when obj becomes inaccessible, use - GC_register_finalizer(obj, f, x, 0, 0); - For more sophisticated uses, and for finalization ordering issues, - see gc.h. - - The global variable GC_free_space_divisor may be adjusted up from its - default value of 4 to use less space and more collection time, or down for - the opposite effect. Setting it to 1 or 0 will effectively disable collections - and cause all allocations to simply grow the heap. - - The variable GC_non_gc_bytes, which is normally 0, may be changed to reflect - the amount of memory allocated by the above routines that should not be - considered as a candidate for collection. Careless use may, of course, result - in excessive memory consumption. - - Some additional tuning is possible through the parameters defined - near the top of gc_priv.h. - - If only GC_malloc is intended to be used, it might be appropriate to define: - - #define malloc(n) GC_malloc(n) - #define calloc(m,n) GC_malloc((m)*(n)) - - For small pieces of VERY allocation intensive code, gc_inl.h - includes some allocation macros that may be used in place of GC_malloc - and friends. - - All externally visible names in the garbage collector start with "GC_". - To avoid name conflicts, client code should avoid this prefix, except when - accessing garbage collector routines or variables. - - There are provisions for allocation with explicit type information. - This is rarely necessary. Details can be found in gc_typed.h. - - THE C++ INTERFACE TO THE ALLOCATOR: - - The Ellis-Hull C++ interface to the collector is included in - the collector distribution. If you intend to use this, type - "make c++" after the initial build of the collector is complete. - See gc_cpp.h for the definition of the interface. This interface - tries to approximate the Ellis-Detlefs C++ garbage collection - proposal without compiler changes. - - Cautions: - 1. Arrays allocated without new placement syntax are - allocated as uncollectable objects. They are traced by the - collector, but will not be reclaimed. - - 2. Failure to use "make c++" in combination with (1) will - result in arrays allocated using the default new operator. - This is likely to result in disaster without linker warnings. - - 3. If your compiler supports an overloaded new[] operator, - then gc_cpp.cc and gc_cpp.h should be suitably modified. - - 4. Many current C++ compilers have deficiencies that - break some of the functionality. See the comments in gc_cpp.h - for suggested workarounds. - - USE AS LEAK DETECTOR: - - The collector may be used to track down leaks in C programs that are - intended to run with malloc/free (e.g. code with extreme real-time or - portability constraints). To do so define FIND_LEAK in Makefile - This will cause the collector to invoke the report_leak - routine defined near the top of reclaim.c whenever an inaccessible - object is found that has not been explicitly freed. The collector will - no longer reclaim inaccessible memory; in this form it is purely a - debugging tool. - Productive use of this facility normally involves redefining report_leak - to do something more intelligent. This typically requires annotating - objects with additional information (e.g. creation time stack trace) that - identifies their origin. Such code is typically not very portable, and is - not included here, except on SPARC machines. - If all objects are allocated with GC_DEBUG_MALLOC (see next section), - then the default version of report_leak will report the source file - and line number at which the leaked object was allocated. This may - sometimes be sufficient. (On SPARC/SUNOS4 machines, it will also report - a cryptic stack trace. This can often be turned into a sympolic stack - trace by invoking program "foo" with "callprocs foo". Callprocs is - a short shell script that invokes adb to expand program counter values - to symbolic addresses. It was largely supplied by Scott Schwartz.) - Note that the debugging facilities described in the next section can - sometimes be slightly LESS effective in leak finding mode, since in - leak finding mode, GC_debug_free actually results in reuse of the object. - (Otherwise the object is simply marked invalid.) Also note that the test - program is not designed to run meaningfully in FIND_LEAK mode. - Use "make gc.a" to build the collector. - - DEBUGGING FACILITIES: - - The routines GC_debug_malloc, GC_debug_malloc_atomic, GC_debug_realloc, - and GC_debug_free provide an alternate interface to the collector, which - provides some help with memory overwrite errors, and the like. - Objects allocated in this way are annotated with additional - information. Some of this information is checked during garbage - collections, and detected inconsistencies are reported to stderr. - - Simple cases of writing past the end of an allocated object should - be caught if the object is explicitly deallocated, or if the - collector is invoked while the object is live. The first deallocation - of an object will clear the debugging info associated with an - object, so accidentally repeated calls to GC_debug_free will report the - deallocation of an object without debugging information. Out of - memory errors will be reported to stderr, in addition to returning - NIL. - - GC_debug_malloc checking during garbage collection is enabled - with the first call to GC_debug_malloc. This will result in some - slowdown during collections. If frequent heap checks are desired, - this can be achieved by explicitly invoking GC_gcollect, e.g. from - the debugger. - - GC_debug_malloc allocated objects should not be passed to GC_realloc - or GC_free, and conversely. It is however acceptable to allocate only - some objects with GC_debug_malloc, and to use GC_malloc for other objects, - provided the two pools are kept distinct. In this case, there is a very - low probablility that GC_malloc allocated objects may be misidentified as - having been overwritten. This should happen with probability at most - one in 2**32. This probability is zero if GC_debug_malloc is never called. - - GC_debug_malloc, GC_malloc_atomic, and GC_debug_realloc take two - additional trailing arguments, a string and an integer. These are not - interpreted by the allocator. They are stored in the object (the string is - not copied). If an error involving the object is detected, they are printed. - - The macros GC_MALLOC, GC_MALLOC_ATOMIC, GC_REALLOC, GC_FREE, and - GC_REGISTER_FINALIZER are also provided. These require the same arguments - as the corresponding (nondebugging) routines. If gc.h is included - with GC_DEBUG defined, they call the debugging versions of these - functions, passing the current file name and line number as the two - extra arguments, where appropriate. If gc.h is included without GC_DEBUG - defined, then all these macros will instead be defined to their nondebugging - equivalents. (GC_REGISTER_FINALIZER is necessary, since pointers to - objects with debugging information are really pointers to a displacement - of 16 bytes form the object beginning, and some translation is necessary - when finalization routines are invoked. For details, about what's stored - in the header, see the definition of the type oh in debug_malloc.c) - - INCREMENTAL/GENERATIONAL COLLECTION: - - The collector normally interrupts client code for the duration of - a garbage collection mark phase. This may be unacceptable if interactive - response is needed for programs with large heaps. The collector - can also run in a "generational" mode, in which it usually attempts to - collect only objects allocated since the last garbage collection. - Furthermore, in this mode, garbage collections run mostly incrementally, - with a small amount of work performed in response to each of a large number of - GC_malloc requests. - - This mode is enabled by a call to GC_enable_incremental(). - - Incremental and generational collection is effective in reducing - pause times only if the collector has some way to tell which objects - or pages have been recently modified. The collector uses two sources - of information: - - 1. Information provided by the VM system. This may be provided in - one of several forms. Under Solaris 2.X (and potentially under other - similar systems) information on dirty pages can be read from the - /proc file system. Under other systems (currently SunOS4.X) it is - possible to write-protect the heap, and catch the resulting faults. - On these systems we require that system calls writing to the heap - (other than read) be handled specially by client code. - See os_dep.c for details. - - 2. Information supplied by the programmer. We define "stubborn" - objects to be objects that are rarely changed. Such an object - can be allocated (and enabled for writing) with GC_malloc_stubborn. - Once it has been initialized, the collector should be informed with - a call to GC_end_stubborn_change. Subsequent writes that store - pointers into the object must be preceded by a call to - GC_change_stubborn. - - This mechanism performs best for objects that are written only for - initialization, and such that only one stubborn object is writable - at once. It is typically not worth using for short-lived - objects. Stubborn objects are treated less efficiently than pointerfree - (atomic) objects. - - A rough rule of thumb is that, in the absence of VM information, garbage - collection pauses are proportional to the amount of pointerful storage - plus the amount of modified "stubborn" storage that is reachable during - the collection. - - Initial allocation of stubborn objects takes longer than allocation - of other objects, since other data structures need to be maintained. - - We recommend against random use of stubborn objects in client - code, since bugs caused by inappropriate writes to stubborn objects - are likely to be very infrequently observed and hard to trace. - However, their use may be appropriate in a few carefully written - library routines that do not make the objects themselves available - for writing by client code. - - - BUGS: - - Any memory that does not have a recognizable pointer to it will be - reclaimed. Exclusive-or'ing forward and backward links in a list - doesn't cut it. - Some C optimizers may lose the last undisguised pointer to a memory - object as a consequence of clever optimizations. This has almost - never been observed in practice. Send mail to boehm@acm.org - for suggestions on how to fix your compiler. - This is not a real-time collector. In the standard configuration, - percentage of time required for collection should be constant across - heap sizes. But collection pauses will increase for larger heaps. - (On SPARCstation 2s collection times will be on the order of 300 msecs - per MB of accessible memory that needs to be scanned. Your mileage - may vary.) The incremental/generational collection facility helps, - but is portable only if "stubborn" allocation is used. - Please address bug reports to boehm@acm.org. If you are - contemplating a major addition, you might also send mail to ask whether - it's already been done (or whether we tried and discarded it). - - RECENT VERSIONS: - - Version 1.3 and immediately preceding versions contained spurious - assembly language assignments to TMP_SP. Only the assignment in the PC/RT - code is necessary. On other machines, with certain compiler options, - the assignments can lead to an unsaved register being overwritten. - Known to cause problems under SunOS 3.5 WITHOUT the -O option. (With - -O the compiler recognizes it as dead code. It probably shouldn't, - but that's another story.) - - Version 1.4 and earlier versions used compile time determined values - for the stack base. This no longer works on Sun 3s, since Sun 3/80s use - a different stack base. We now use a straightforward heuristic on all - machines on which it is known to work (incl. Sun 3s) and compile-time - determined values for the rest. There should really be library calls - to determine such values. - - Version 1.5 and earlier did not ensure 8 byte alignment for objects - allocated on a sparc based machine. - - Version 1.8 added ULTRIX support in gc_private.h. - - Version 1.9 fixed a major bug in gc_realloc. - - Version 2.0 introduced a consistent naming convention for collector - routines and added support for registering dynamic library data segments - in the standard mark_roots.c. Most of the data structures were revamped. - The treatment of interior pointers was completely changed. Finalization - was added. Support for locking was added. Object kinds were added. - We added a black listing facility to avoid allocating at addresses known - to occur as integers somewhere in the address space. Much of this - was accomplished by adapting ideas and code from the PCR collector. - The test program was changed and expanded. - - Version 2.1 was the first stable version since 1.9, and added support - for PPCR. - - Version 2.2 added debugging allocation, and fixed various bugs. Among them: - - GC_realloc could fail to extend the size of the object for certain large object sizes. - - A blatant subscript range error in GC_printf, which unfortunately - wasn't exercised on machines with sufficient stack alignment constraints. - - GC_register_displacement did the wrong thing if it was called after - any allocation had taken place. - - The leak finding code would eventually break after 2048 byte - byte objects leaked. - - interface.c didn't compile. - - The heap size remained much too small for large stacks. - - The stack clearing code behaved badly for large stacks, and perhaps - on HP/PA machines. - - Version 2.3 added ALL_INTERIOR_POINTERS and fixed the following bugs: - - Missing declaration of etext in the A/UX version. - - Some PCR root-finding problems. - - Blacklisting was not 100% effective, because the plausible future - heap bounds were being miscalculated. - - GC_realloc didn't handle out-of-memory correctly. - - GC_base could return a nonzero value for addresses inside free blocks. - - test.c wasn't really thread safe, and could erroneously report failure - in a multithreaded environment. (The locking primitives need to be - replaced for other threads packages.) - - GC_CONS was thoroughly broken. - - On a SPARC with dynamic linking, signals stayed diabled while the - client code was running. - (Thanks to Manuel Serrano at INRIA for reporting the last two.) - - Version 2.4 added GC_free_space_divisor as a tuning knob, added - support for OS/2 and linux, and fixed the following bugs: - - On machines with unaligned pointers (e.g. Sun 3), every 128th word could - fail to be considered for marking. - - Dynamic_load.c erroneously added 4 bytes to the length of the data and - bss sections of the dynamic library. This could result in a bad memory - reference if the actual length was a multiple of a page. (Observed on - Sun 3. Can probably also happen on a Sun 4.) - (Thanks to Robert Brazile for pointing out that the Sun 3 version - was broken. Dynamic library handling is still broken on Sun 3s - under 4.1.1U1, but apparently not 4.1.1. If you have such a machine, - use -Bstatic.) - - Version 2.5 fixed the following bugs: - - Removed an explicit call to exit(1) - - Fixed calls to GC_printf and GC_err_printf, so the correct number of - arguments are always supplied. The OS/2 C compiler gets confused if - the number of actuals and the number of formals differ. (ANSI C - doesn't require this to work. The ANSI sanctioned way of doing things - causes too many compatibility problems.) - - Version 3.0 added generational/incremental collection and stubborn - objects. - - Version 3.1 added the following features: - - A workaround for a SunOS 4.X SPARC C compiler - misfeature that caused problems when the collector was turned into - a dynamic library. - - A fix for a bug in GC_base that could result in a memory fault. - - A fix for a performance bug (and several other misfeatures) pointed - out by Dave Detlefs and Al Dosser. - - Use of dirty bit information for static data under Solaris 2.X. - - DEC Alpha/OSF1 support (thanks to Al Dosser). - - Incremental collection on more platforms. - - A more refined heap expansion policy. Less space usage by default. - - Various minor enhancements to reduce space usage, and to reduce - the amount of memory scanned by the collector. - - Uncollectable allocation without per object overhead. - - More conscientious handling of out-of-memory conditions. - - Fixed a bug in debugging stubborn allocation. - - Fixed a bug that resulted in occasional erroneous reporting of smashed - objects with debugging allocation. - - Fixed bogus leak reports of size 4096 blocks with FIND_LEAK. - - Version 3.2 fixed a serious and not entirely repeatable bug in - the incremental collector. It appeared only when dirty bit info - on the roots was available, which is normally only under Solaris. - It also added GC_general_register_disappearing_link, and some - testing code. Interface.c disappeared. - - Version 3.3 fixes several bugs and adds new ports: - - PCR-specific bugs. - - Missing locking in GC_free, redundant FASTUNLOCK - in GC_malloc_stubborn, and 2 bugs in - GC_unregister_disappearing_link. - All of the above were pointed out by Neil Sharman - (neil@cs.mu.oz.au). - - Common symbols allocated by the SunOS4.X dynamic loader - were not included in the root set. - - Bug in GC_finalize (reported by Brian Beuning and Al Dosser) - - Merged Amiga port from Jesper Peterson (untested) - - Merged NeXT port from Thomas Funke (significantly - modified and untested) - - Version 3.4: - - Fixed a performance bug in GC_realloc. - - Updated the amiga port. - - Added NetBSD and 386BSD ports. - - Added cord library. - - Added trivial performance enhancement for - ALL_INTERIOR_POINTERS. (Don't scan last word.) - - Version 3.5 - - Minor collections now mark from roots only once, if that - doesn't cause an excessive pause. - - The stack clearing heuristic was refined to prevent anomalies - with very heavily recursive programs and sparse stacks. - - Fixed a bug that prevented mark stack growth in some cases. - GC_objects_are_marked should be set to TRUE after a call - to GC_push_roots and as part of GC_push_marked, since - both can now set mark bits. I think this is only a performance - bug, but I wouldn't bet on it. It's certainly very hard to argue - that the old version was correct. - - Fixed an incremental collection bug that prevented it from - working at all when HBLKSIZE != getpagesize() - - Changed dynamic_loading.c to include gc_priv.h before testing - DYNAMIC_LOADING. SunOS dynamic library scanning - must have been broken in 3.4. - - Object size rounding now adapts to program behavior. - - Added a workaround (provided by Manuel Serrano and - colleagues) to a long-standing SunOS 4.X (and 3.X?) ld bug - that I had incorrectly assumed to have been squished. - The collector was broken if the text segment size was within - 32 bytes of a multiple of 8K bytes, and if the beginning of - the data segment contained interesting roots. The workaround - assumes a demand-loadable executable. The original may have - have "worked" in some other cases. - - Added dynamic library support under IRIX5. - - Added support for EMX under OS/2 (thanks to Ari Huttunen). - - Version 3.6: - - fixed a bug in the mark stack growth code that was introduced - in 3.4. - - fixed Makefile to work around DEC AXP compiler tail recursion - bug. - - Version 3.7: - - Added a workaround for an HP/UX compiler bug. - - Fixed another stack clearing performance bug. Reworked - that code once more. - - Version 4.0: - - Added support for Solaris threads (which was possible - only by reimplementing some fraction of Solaris threads, - since Sun doesn't currently make the thread debugging - interface available). - - Added non-threads win32 and win32S support. - - (Grudgingly, with suitable muttering of obscenities) renamed - files so that the collector distribution could live on a FAT - file system. Files that are guaranteed to be useless on - a PC still have long names. Gc_inline.h and gc_private.h - still exist, but now just include gc_inl.h and gc_priv.h. - - Fixed a really obscure bug in finalization that could cause - undetected mark stack overflows. (I would be surprised if - any real code ever tickled this one.) - - Changed finalization code to dynamically resize the hash - tables it maintains. (This probably does not matter for well- - -written code. It no doubt does for C++ code that overuses - destructors.) - - Added typed allocation primitives. Rewrote the marker to - accommodate them with more reasonable efficiency. This - change should also speed up marking for GC_malloc allocated - objects a little. See gc_typed.h for new primitives. - - Improved debugging facilities slightly. Allocation time - stack traces are now kept by default on SPARC/SUNOS4. - (Thanks to Scott Schwartz.) - - Added better support for small heap applications. - - Significantly extended cord package. Fixed a bug in the - implementation of lazily read files. Printf and friends now - have cord variants. Cord traversals are a bit faster. - - Made ALL_INTERIOR_POINTERS recognition the default. - - Fixed de so that it can run in constant space, independent - of file size. Added simple string searching to cords and de. - - Added the Hull-Ellis C++ interface. - - Added dynamic library support for OSF/1. - (Thanks to Al Dosser and Tim Bingham at DEC.) - - Changed argument to GC_expand_hp to be expressed - in units of bytes instead of heap blocks. (Necessary - since the heap block size now varies depending on - configuration. The old version was never very clean.) - - Added GC_get_heap_size(). The previous "equivalent" - was broken. - - Restructured the Makefile a bit. - - Since version 4.0: - - Changed finalization implementation to guarantee that - finalization procedures are called outside of the allocation - lock, making direct use of the interface a little less dangerous. - MAY BREAK EXISTING CLIENTS that assume finalizers - are protected by a lock. Since there seem to be few multithreaded - clients that use finalization, this is hopefully not much of - a problem. - - Fixed a gross bug in CORD_prev. - - Fixed a bug in blacklst.c that could result in unbounded - heap growth during startup on machines that do not clear - memory obtained from the OS (e.g. win32S). - - Ported de editor to win32/win32S. (This is now the only - version with a mouse-sensitive UI.) - - Added GC_malloc_ignore_off_page to allocate large arrays - in the presence of ALL_INTERIOR_POINTERS. - - Changed GC_call_with_alloc_lock to not disable signals in - the single-threaded case. - - Reduced retry count in GC_collect_or_expand for garbage - collecting when out of memory. - - Made uncollectable allocations bypass black-listing, as they - should. - - Fixed a bug in typed_test in test.c that could cause (legitimate) - GC crashes. - - Fixed some potential synchronization problems in finalize.c - - Fixed a real locking problem in typd_mlc.c. - - Worked around an AIX 3.2 compiler feature that results in - out of bounds memory references. - - Partially worked around an IRIX5.2 beta problem (which may - or may not persist to the final release). - - Fixed a bug in the heap integrity checking code that could - result in explicitly deallocated objects being identified as - smashed. Fixed a bug in the dbg_mlc stack saving code - that caused old argument pointers to be considered live. - - Fixed a bug in CORD_ncmp (and hence CORD_str). - - Repaired the OS2 port, which had suffered from bit rot - in 4.0. Worked around what appears to be CSet/2 V1.0 - optimizer bug. - - Fixed a Makefile bug for target "c++". - - Since version 4.1: - - Multiple bug fixes/workarounds in the Solaris threads version. - (It occasionally failed to locate some register contents for - marking. It also turns out that thr_suspend and friends are - unreliable in Solaris 2.3. Dirty bit reads appear - to be unreliable under some weird - circumstances. My stack marking code - contained a serious performance bug. The new code is - extremely defensive, and has not failed in several cpu - hours of testing. But no guarantees ...) - - Added MacOS support (thanks to Patrick Beard.) - - Fixed several syntactic bugs in gc_c++.h and friends. (These - didn't bother g++, but did bother most other compilers.) - Fixed gc_c++.h finalization interface. (It didn't.) - - 64 bit alignment for allocated objects was not guaranteed in a - few cases in which it should have been. - - Added GC_malloc_atomic_ignore_off_page. - - Added GC_collect_a_little. - - Added some prototypes to gc.h. - - Some other minor bug fixes (notably in Makefile). - - Fixed OS/2 / EMX port (thanks to Ari Huttunen). - - Fixed AmigaDOS port. (thanks to Michel Schinz). - - Fixed the DATASTART definition under Solaris. There - was a 1 in 16K chance of the collector missing the first - 64K of static data (and thus crashing). - - Fixed some blatant anachronisms in the README file. - - Fixed PCR-Makefile for upcoming PPCR release. - - Since version 4.2: - - Fixed SPARC alignment problem with GC_DEBUG. - - Fixed Solaris threads /proc workaround. The real - problem was an interaction with mprotect. - - Incorporated fix from Patrick Beard for gc_c++.h (now gc_cpp.h). - - Slightly improved allocator space utilization by - fixing the GC_size_map mechanism. - - Integrated some Sony News and MIPS RISCos 4.51 - patches. (Thanks to Nobuyuki Hikichi of - Software Research Associates, Inc. Japan) - - Fixed HP_PA alignment problem. (Thanks to - xjam@cork.cs.berkeley.edu.) - - Added GC_same_obj and friends. Changed GC_base - to return 0 for pointers past the end of large objects. - Improved GC_base performance with ALL_INTERIOR_POINTERS - on machines with a slow integer mod operation. - Added GC_PTR_ADD, GC_PTR_STORE, etc. to prepare - for preprocessor. - - changed the default on most UNIX machines to be that - signals are not disabled during critical GC operations. - This is still ANSI-conforming, though somewhat dangerous - in the presence of signal handlers. But the performance - cost of the alternative is sometimes problematic. - Can be changed back with a minor Makefile edit. - - renamed IS_STRING in gc.h, to CORD_IS_STRING, thus - following my own naming convention. Added the function - CORD_to_const_char_star. - - Fixed a gross bug in GC_finalize. Symptom: occasional - address faults in that function. (Thanks to Anselm - Baird-Smith (Anselm.BairdSmith@inria.fr) - - Added port to ICL DRS6000 running DRS/NX. Restructured - things a bit to factor out common code, and remove obsolete - code. Collector should now run under SUNOS5 with either - mprotect or /proc dirty bits. (Thanks to Douglas Steel - (doug@wg.icl.co.uk)). - - More bug fixes and workarounds for Solaris 2.X. (These were - mostly related to putting the collector in a dynamic library, - which didn't really work before. Also SOLARIS_THREADS - didn't interact well with dl_open.) Thanks to btlewis@eng.sun.com. - - Fixed a serious performance bug on the DEC Alpha. The text - segment was getting registered as part of the root set. - (Amazingly, the result was still fast enough that the bug - was not conspicuous.) The fix works on OSF/1, version 1.3. - Hopefully it also works on other versions of OSF/1 ... - - Fixed a bug in GC_clear_roots. - - Fixed a bug in GC_generic_malloc_words_small that broke - gc_inl.h. (Reported by Antoine de Maricourt. I broke it - in trying to tweak the Mac port.) - - Fixed some problems with cord/de under Linux. - - Fixed some cord problems, notably with CORD_riter4. - - Added DG/UX port. - Thanks to Ben A. Mesander (ben@piglet.cr.usgs.gov) - - Added finalization registration routines with weaker ordering - constraints. (This is necessary for C++ finalization with - multiple inheritance, since the compiler often adds self-cycles.) - - Filled the holes in the SCO port. (Thanks to Michael Arnoldus - .) - - John Ellis' additions to the C++ support: From John: - - * I completely rewrote the documentation in the interface gc_c++.h - (later renamed gc_cpp.h). I've tried to make it both clearer and more - precise. - - * The definition of accessibility now ignores pointers from an - finalizable object (an object with a clean-up function) to itself. - This allows objects with virtual base classes to be finalizable by the - collector. Compilers typically implement virtual base classes using - pointers from an object to itself, which under the old definition of - accessibility prevented objects with virtual base classes from ever - being collected or finalized. - - * gc_cleanup now includes gc as a virtual base. This was enabled by - the change in the definition of accessibility. - - * I added support for operator new[]. Since most (all?) compilers - don't yet support operator new[], it is conditionalized on - -DOPERATOR_NEW_ARRAY. The code is untested, but its trivial and looks - correct. - - * The test program test_gc_c++ (later renamed test_cpp.cc) - tries to test for the C++-specific functionality not tested by the - other programs. - - Added include to misc.c. (Needed for ppcr.) - - Added PowerMac port. (Thanks to Patrick Beard again.) - - Fixed "srcdir"-related Makefile problems. Changed things so - that all externally visible include files always appear in the - include subdirectory of the source. Made gc.h directly - includable from C++ code. (These were at Per - Bothner's suggestion.) - - Changed Intel code to also mark from ebp (Kevin Warne's - suggestion). - - Renamed C++ related files so they could live in a FAT - file system. (Charles Fiterman's suggestion.) - - Changed Windows NT Makefile to include C++ support in - gc.lib. Added C++ test as Makefile target. - - Since version 4.3: - - ASM_CLEAR_CODE was erroneously defined for HP - PA machines, resulting in a compile error. - - Fixed OS/2 Makefile to create a library. (Thanks to - Mark Boulter (mboulter@vnet.ibm.com)). - - Gc_cleanup objects didn't work if they were created on - the stack. Fixed. - - One copy of Gc_cpp.h in the distribution was out of - synch, and failed to document some known compiler - problems with explicit destructor invocation. Partially - fixed. There are probably other compilers on which - gc_cleanup is miscompiled. - - Fixed Makefile to pass C compiler flags to C++ compiler. - - Added Mac fixes. - - Fixed os_dep.c to work around what appears to be - a new and different VirtualQuery bug under newer - versions of win32S. - - GC_non_gc_bytes was not correctly maintained by - GC_free. Fixed. Thanks to James Clark (jjc@jclark.com). - - Added GC_set_max_heap_size. - - Changed allocation code to ignore blacklisting if it is preventing - use of a very large block of memory. This has the advantage - that naive code allocating very large objects is much more - likely to work. The downside is you might no - longer find out that such code should really use - GC_malloc_ignore_off_page. - - Changed GC_printf under win32 to close and reopen the file - between calls. FAT file systems otherwise make the log file - useless for debugging. - - Added GC_try_to_collect and GC_get_bytes_since_gc. These - allow starting an abortable collection during idle times. - This facility does not require special OS support. (Thanks to - Michael Spertus of Geodesic Systems for suggesting this. It was - actually an easy addition. Kumar Srikantan previously added a similar - facility to a now ancient version of the collector. At the time - this was much harder, and the result was less convincing.) - - Added some support for the Borland development environment. (Thanks - to John Ellis and Michael Spertus.) - - Removed a misfeature from checksums.c that caused unexpected - heap growth. (Thanks to Scott Schwartz.) - - Changed finalize.c to call WARN if it encounters a finalization cycle. - WARN is defined in gc_priv.h to write a message, usually to stdout. - In many environments, this may be inappropriate. - - Renamed NO_PARAMS in gc.h to GC_NO_PARAMS, thus adhering to my own - naming convention. - - Added GC_set_warn_proc to intercept warnings. - - Fixed Amiga port. (Thanks to Michel Schinz (schinz@alphanet.ch).) - - Fixed a bug in mark.c that could result in an access to unmapped - memory from GC_mark_from_mark_stack on machines with unaligned - pointers. - - Fixed a win32 specific performance bug that could result in scanning of - objects allocated with the system malloc. - - Added REDIRECT_MALLOC. - - Since version 4.4: - - Fixed many minor and one major README bugs. (Thanks to Franklin Chen - (chen@adi.com) for pointing out many of them.) - - Fixed ALPHA/OSF/1 dynamic library support. (Thanks to Jonathan Bachrach - (jonathan@harlequin.com)). - - Added incremental GC support (MPROTECT_VDB) for Linux (with some - help from Bruno Haible). - - Altered SPARC recognition tests in gc.h and config.h (mostly as - suggested by Fergus Henderson). - - Added basic incremental GC support for win32, as implemented by - Windows NT and Windows 95. GC_enable_incremental is a noop - under win32s, which doesn't implement enough of the VM interface. - - Added -DLARGE_CONFIG. - - Fixed GC_..._ignore_off_page to also function without - -DALL_INTERIOR_POINTERS. - - (Hopefully) fixed RS/6000 port. (Only the test was broken.) - - Fixed a performance bug in the nonincremental collector running - on machines supporting incremental collection with MPROTECT_VDB - (e.g. SunOS 4, DEC AXP). This turned into a correctness bug under - win32s with win32 incremental collection. (Not all memory protection - was disabled.) - - Fixed some ppcr related bit rot. - - Caused dynamic libraries to be unregistered before reregistering. - The old way turned out to be a performance bug on some machines. - - GC_root_size was not properly maintained under MSWIN32. - - Added -DNO_DEBUGGING and GC_dump. - - Fixed a couple of bugs arising with SOLARIS_THREADS + - REDIRECT_MALLOC. - - Added NetBSD/M68K port. (Thanks to Peter Seebach - .) - - Fixed a serious realloc bug. For certain object sizes, the collector - wouldn't scan the expanded part of the object. (Thanks to Clay Spence - (cds@peanut.sarnoff.com) for noticing the problem, and helping me to - track it down.) - - Since version 4.5: - - Added Linux ELF support. (Thanks to Arrigo Triulzi .) - - GC_base crashed if it was called before any other GC_ routines. - This could happen if a gc_cleanup object was allocated outside the heap - before any heap allocation. - - The heap expansion heuristic was not stable if all objects had finalization - enabled. Fixed finalize.c to count memory in finalization queue and - avoid explicit deallocation. Changed alloc.c to also consider this count. - (This is still not recommended. It's expensive if nothing else.) Thanks - to John Ellis for pointing this out. - - GC_malloc_uncollectable(0) was broken. Thanks to Phong Vo for pointing - this out. - - The collector didn't compile under Linux 1.3.X. (Thanks to Fred Gilham for - pointing this out.) The current workaround is ugly, but expected to be - temporary. - - Fixed a formatting problem for SPARC stack traces. - - Fixed some '=='s in os_dep.c that should have been assignments. - Fortunately these were in code that should never be executed anyway. - (Thanks to Fergus Henderson.) - - Fixed the heap block allocator to only drop blacklisted blocks in small - chunks. Made BL_LIMIT self adjusting. (Both of these were in response - to heap growth observed by Paul Graham.) - - Fixed the Metrowerks/68K Mac code to also mark from a6. (Thanks - to Patrick Beard.) - - Significantly updated README.debugging. - - Fixed some problems with longjmps out of signal handlers, especially under - Solaris. Added a workaround for the fact that siglongjmp doesn't appear to - do the right thing with -lthread under Solaris. - - Added MSDOS/djgpp port. (Thanks to Mitch Harris (maharri@uiuc.edu).) - - Added "make reserved_namespace" and "make user_namespace". The - first renames ALL "GC_xxx" identifiers as "_GC_xxx". The second is the - inverse transformation. Note that doing this is guaranteed to break all - clients written for the other names. - - descriptor field for kind NORMAL in GC_obj_kinds with ADD_BYTE_AT_END - defined should be -ALIGNMENT not WORDS_TO_BYTES(-1). This is - a serious bug on machines with pointer alignment of less than a word. - - GC_ignore_self_finalize_mark_proc didn't handle pointers to very near the - end of the object correctly. Caused failures of the C++ test on a DEC Alpha - with g++. - - gc_inl.h still had problems. Partially fixed. Added warnings at the - beginning to hopefully specify the remaining dangers. - - Added DATAEND definition to config.h. - - Fixed some of the .h file organization. Fixed "make floppy". - - Since version 4.6: - - Fixed some compilation problems with -DCHECKSUMS (thanks to Ian Searle) - - Updated some Mac specific files to synchronize with Patrick Beard. - - Fixed a serious bug for machines with non-word-aligned pointers. - (Thanks to Patrick Beard for pointing out the problem. The collector - should fail almost any conceivable test immediately on such machines.) - - Since version 4.7: - - Changed a "comment" in a MacOS specific part of mach-dep.c that caused - gcc to fail on other platforms. - - Since version 4.8 - - More README.debugging fixes. - - Objects ready for finalization, but not finalized in the same GC - cycle, could be prematurely collected. This occasionally happened - in test_cpp. - - Too little memory was obtained from the system for very large - objects. That could cause a heap explosion if these objects were - not contiguous (e.g. under PCR), and too much of them was blacklisted. - - Due to an improper initialization, the collector was too hesitant to - allocate blacklisted objects immediately after system startup. - - Moved GC_arrays from the data into the bss segment by not explicitly - initializing it to zero. This significantly - reduces the size of executables, and probably avoids some disk accesses - on program startup. It's conceivable that it might break a port that I - didn't test. - - Fixed EMX_MAKEFILE to reflect the gc_c++.h to gc_cpp.h renaming which - occurred a while ago. - - Since 4.9: - - Fixed a typo around a call to GC_collect_or_expand in alloc.c. It broke - handling of out of memory. (Thanks to Patrick Beard for noticing.) - - Since 4.10: - - Rationalized (hopefully) GC_try_to_collect in an incremental collection - environment. It appeared to not handle a call while a collection was in - progress, and was otherwise too conservative. - - Merged GC_reclaim_or_delete_all into GC_reclaim_all to get rid of some - code. - - Added Patrick Beard's Mac fixes, with substantial completely untested - modifications. - - Fixed the MPROTECT_VDB code to deal with large pages and imprecise - fault addresses (as on an UltraSPARC running Solaris 2.5). Note that this - was not a problem in the default configuration, which uses PROC_VDB. - - The DEC Alpha assembly code needed to restore $gp between calls. - Thanks to Fergus Henderson for tracking this down and supplying a - patch. - - The write command for "de" was completely broken for large files. - I used the easiest portable fix, which involved changing the semantics - so that f.new is written instead of overwriting f. That's safer anyway. - - Added README.solaris2 with a discussion of the possible problems of - mixing the collector's sbrk allocation with malloc/realloc. - - Changed the data segment starting address for SGI machines. The - old code failed under IRIX6. - - Required double word alignment for MIPS. - - Various minor fixes to remove warnings. - - Attempted to fix some Solaris threads problems reported by Zhiying Chen. - In particular, the collector could try to fork a thread with the - world stopped as part of GC_thr_init. It also failed to deal with - the case in which the original thread terminated before the whole - process did. - - Added -DNO_EXECUTE_PERMISSION. This has a major performance impact - on the incremental collector under Irix, and perhaps under other - operating systems. - - Added some code to support allocating the heap with mmap. This may - be preferable under some circumstances. - - Integrated dynamic library support for HP. - (Thanks to Knut Tvedten .) - - Integrated James Clark's win32 threads support, and made a number - of changes to it, many of which were suggested by Pontus Rydin. - This is still not 100% solid. - - Integrated Alistair Crooks' support for UTS4 running on an Amdahl - 370-class machine. - - Fixed a serious bug in explicitly typed allocation. Objects requiring - large descriptors where handled in a way that usually resulted in - a segmentation fault in the marker. (Thanks to Jeremy Fitzhardinge - for helping to track this down.) - - Added partial support for GNU win32 development. (Thanks to Fergus - Henderson.) - - Added optional support for Java-style finalization semantics. (Thanks - to Patrick Bridges.) This is recommended only for Java implementations. - - GC_malloc_uncollectable faulted instead of returning 0 when out of - memory. (Thanks to dan@math.uiuc.edu for noticing.) - - Calls to GC_base before the collector was initialized failed on a - DEC Alpha. (Thanks to Matthew Flatt.) - - Added base pointer checking to GC_REGISTER_FINALIZER in debugging - mode, at the suggestion of Jeremy Fitzhardinge. - - GC_debug_realloc failed for uncollectable objects. (Thanks to - Jeremy Fitzhardinge.) - - Explicitly typed allocation could crash if it ran out of memory. - (Thanks to Jeremy Fitzhardinge.) - - Added minimal support for a DEC Alpha running Linux. - - Fixed a problem with allocation of objects whose size overflowed - ptrdiff_t. (This now fails unconditionally, as it should.) - - Added the beginning of Irix pthread support. - - Integrated Xiaokun Zhu's fixes for djgpp 2.01. - - Added SGI-style STL allocator support (gc_alloc.h). - - Fixed a serious bug in README.solaris2. Multithreaded programs must include - gc.h with SOLARIS_THREADS defined. - - Changed GC_free so it actually deallocates uncollectable objects. - (Thanks to Peter Chubb for pointing out the problem.) - - Added Linux ELF support for dynamic libararies. (Thanks again to - Patrick Bridges.) - - Changed the Borland cc configuration so that the assembler is not - required. - - Fixed a bug in the C++ test that caused it to fail in 64-bit - environments. - - Since 4.11: - - Fixed ElfW definition in dyn_load.c. (Thanks to Fergus Henderson.) - This prevented the dynamic library support from compiling on some - older ELF Linux systems. - - Fixed UTS4 port (which I apparently mangled during the integration) - (Thanks to again to Alistair Crooks.) - - "Make C++" failed on Suns with SC4.0, due to a problem with "bool". - Fixed in gc_priv.h. - - Added more pieces for GNU win32. (Thanks to Timothy N. Newsham.) - The current state of things should suffice for at least some - applications. - - Changed the out of memory retry count handling as suggested by - Kenjiro Taura. (This matters only if GC_max_retries > 0, which - is no longer the default.) - - If a /proc read failed repeatedly, GC_written_pages was not updated - correctly. (Thanks to Peter Chubb for diagnosing this.) - - Under unlikely circumstances, the allocator could infinite loop in - an out of memory situation. (Thanks again to Kenjiro Taura for - identifying the problem and supplying a fix.) - - Fixed a syntactic error in the DJGPP code. (Thanks to Fergus - Henderson for finding this by inspection.) Also fixed a test program - problem with DJGPP (Thanks to Peter Monks.) - - Atomic uncollectable objects were not treated correctly by the - incremental collector. This resulted in weird log statistics and - occasional performance problems. (Thanks to Peter Chubb for pointing - this out.) - - Fixed some problems resulting from compilers that dont define - __STDC__. In this case void * and char * were used inconsistently - in some cases. (Void * should not have been used at all. If - you have an ANSI superset compiler that does not define __STDC__, - please compile with -D__STDC__=0. Thanks to Manuel Serrano and others - for pointing out the problem.) - - Fixed a compilation problem on Irix with -n32 and -DIRIX_THREADS. - Also fixed some other IRIX_THREADS problems which may or may not have - had observable symptoms. - - Fixed an HP PA compilation problem in dyn_load.c. (Thanks to - Philippe Queinnec.) - - SEGV fault handlers sometimes did not get reset correctly. (Thanks - to David Pickens.) - - Added a fix for SOLARIS_THREADS on Intel. (Thanks again to David - Pickens.) This probably needs more work to become functional. - - Fixed struct sigcontext_struct in os_dep.c for compilation under - Linux 2.1.X. (Thanks to Fergus Henderson.) - - Changed the DJGPP STACKBOTTOM and DATASTART values to those suggested - by Kristian Kristensen. These may still not be right, but it is - it is likely to work more often than what was there before. They may - even be exactly right. - - Added a #include to test_cpp.cc. This appears to help - with HP/UX and gcc. (Thanks to assar@sics.se.) - - Version 4.11 failed to run in incremental mode on recent 64-bit Irix - kernels. This was a problem related to page unaligned heap segments. - Changed the code to page align heap sections on all platforms. - (I had mistakenly identified this as a kernel problem earlier. - It was not.) - - Version 4.11 did not make allocated storage executable, except on - one or two platforms, due to a bug in a #if test. (Thanks to Dave - Grove for pointing this out.) - - Added sparc_sunos4_mach_dep.s to support Sun's compilers under SunOS4. - - Added GC_exclude_static_roots. - - Fixed the object size mapping algorithm. This shouldn't matter, - but the old code was ugly. - - Heap checking code could die if one of the allocated objects was - larger than its base address. (Unsigned underflow problem. Thanks - to Clay Spence for isolating the problem.) - - Added RS6000 (AIX) dynamic library support and fixed STACK_BOTTOM. - (Thanks to Fred Stearns.) - - Added Fergus Henderson's patches for improved robustness with large - heaps and lots of blacklisting. - - Added Peter Chubb's changes to support Solaris Pthreads, to support - MMAP allocation in Solaris, to allow Solaris to find dynamic libraries - through /proc, to add malloc_typed_ignore_off_page, and a few other - minor features and bug fixes. - - The Solaris 2 port should not use sbrk. I received confirmation from - Sun that the use of sbrk and malloc in the same program is not - supported. The collector now defines USE_MMAP by default on Solaris. - - Replaced the djgpp makefile with Gary Leavens' version. - - Fixed MSWIN32 detection test. - - Added Fergus Henderson's patches to allow putting the collector into - a DLL under GNU win32. - - Added Ivan V. Demakov's port to Watcom C on X86. - - Added Ian Piumarta's Linux/PowerPC port. - - On Brian Burton's suggestion added PointerFreeGC to the placement - options in gc_cpp.h. This is of course unsafe, and may be controversial. - On the other hand, it seems to be needed often enough that it's worth - adding as a standard facility. - - Since 4.12: - - Fixed a crucial bug in the Watcom port. There was a redundant decl - of GC_push_one in gc_priv.h. - - Added FINALIZE_ON_DEMAND. - - Fixed some pre-ANSI cc problems in test.c. - - Removed getpagesize() use for Solaris. It seems to be missing in one - or two versions. - - Fixed bool handling for SPARCCompiler version 4.2. - - Fixed some files in include that had gotten unlinked from the main - copy. - - Some RS/6000 fixes (missing casts). Thanks to Toralf Foerster. - - Fixed several problems in GC_debug_realloc, affecting mostly the - FIND_LEAK case. - - GC_exclude_static_roots contained a buggy unsigned comparison to - terminate a loop. (Thanks to Wilson Ho.) - - CORD_str failed if the substring occurred at the last possible position. - (Only affects cord users.) - - Fixed Linux code to deal with RedHat 5.0 and integrated Peter Bigot's - os_dep.c code for dealing with various Linux versions. - - Added workaround for Irix pthreads sigaction bug and possible signal - misdirection problems. - Since alpha1: - - Changed RS6000 STACKBOTTOM. - - Integrated Patrick Beard's Mac changes. - - Alpha1 didn't compile on Irix m.n, m < 6. - - Replaced Makefile.dj with a new one from Gary Leavens. - - Added Andrew Stitcher's changes to support SCO OpenServer. - - Added PRINT_BLACK_LIST, to allow debugging of high densities of false - pointers. - - Added code to debug allocator to keep track of return address - in GC_malloc caller, thus giving a bit more context. - - Changed default behavior of large block allocator to more - aggressively avoid fragmentation. This is likely to slow down the - collector when it succeeds at reducing space cost. - - Integrated Fergus Henderson's CYGWIN32 changes. They are untested, - but needed for newer versions. - - USE_MMAP had some serious bugs. This caused the collector to fail - consistently on Solaris with -DSMALL_CONFIG. - - Added Linux threads support, thanks largely to Fergus Henderson. - Since alpha2: - - Fixed more Linux threads problems. - - Changed default GC_free_space_divisor to 3 with new large block allocation. - (Thanks to Matthew Flatt for some measurements that suggest the old - value sometimes favors space too much over time.) - - More CYGWIN32 fixes. - - Integrated Tyson-Dowd's Linux-M68K port. - - Minor HP PA and DEC UNIX fixes from Fergus Henderson. - - Integrated Christoffe Raffali's Linux-SPARC changes. - - Allowed for one more GC fixup iteration after a full GC in incremental - mode. Some quick measurements suggested that this significantly - reduces pause times even with smaller GC_RATE values. - - Moved some more GC data structures into GC_arrays. This decreases - pause times and GC overhead, but makes debugging slightly less convenient. - - Fixed namespace pollution problem ("excl_table"). - - Made GC_incremental a constant for -DSMALL_CONFIG, hopefully shrinking - that slightly. - - Added some win32 threads fixes. - - Integrated Ivan Demakov and David Stes' Watcom fixes. - - Various other minor fixes contributed by many people. - - Renamed config.h to gcconfig.h, since config.h tends to be used for - many other things. - - Integrated Matthew Flatt's support for 68K MacOS "far globals". - - Fixed up some of the dynamic library Makefile targets for consistency - across platforms. - - Fixed a USE_MMAP typo that caused out-of-memory handling to fail - on Solaris. - - Added code to test.c to test thread creation a bit more. - - Integrated GC_win32_free_heap, as suggested by Ivan Demakov. - - Fixed Solaris 2.7 stack base finding problem. (This may actually - have been done in an earlier alpha release.) - Since alpha3: - - Fixed MSWIN32 recognition test, which interfered with cygwin. - - Removed unnecessary gc_watcom.asm from distribution. Removed - some obsolete README.win32 text. - - Added Alpha Linux incremental GC support. (Thanks to Philipp Tomsich - for code for retrieving the fault address in a signal handler.) - Changed Linux signal handler context argument to be a pointer. - - Took care of some new warnings generated by the 7.3 SGI compiler. - - Integrated Phillip Musumeci's FreeBSD/ELF fixes. - - -DIRIX_THREADS was broken with the -o32 ABI (typo in gc_priv.h> - - Since 4.13: - - Fixed GC_print_source_ptr to not use a prototype. - - generalized CYGWIN test. - - gc::new did the wrong thing with PointerFreeGC placement. - (Thanks to Rauli Ruohonen.) - - In the ALL_INTERIOR_POINTERS (default) case, some callee-save register - values could fail to be scanned if the register was saved and - reused in a GC frame. This showed up in verbose mode with gctest - compiled with an unreleased SGI compiler. I vaguely recall an old - bug report that may have been related. The bug was probably quite old. - (The problem was that the stack scanning could be deferred until - after the relevant frame was overwritten, and the new save location - might be outside the scanned area. Fixed by more eager stack scanning.) - - PRINT_BLACK_LIST had some problems. A few source addresses were garbage. - - Replaced Makefile.dj and added -I flags to cord make targets. - (Thanks to Gary Leavens.) - - GC_try_to_collect was broken with the nonincremental collector. - - gc_cleanup destructors could pass the wrong address to - GC_register_finalizer_ignore_self in the presence of multiple - inheritance. (Thanks to Darrell Schiebel.) - - Changed PowerPC Linux stack finding code. - - Since 4.14alpha1 - - -DSMALL_CONFIG did not work reliably with large (> 4K) pages. - Recycling the mark stack during expansion could result in a size - zero heap segment, which confused things. (This was probably also an - issue with the normal config and huge pages.) - - Did more work to make sure that callee-save registers were scanned - completely, even with the setjmp-based code. Added USE_GENERIC_PUSH_REGS - macro to facilitate testing on machines I have access to. - - Added code to explicitly push register contents for win32 threads. - This seems to be necessary. (Thanks to Pierre de Rop.) - - Since 4.14alpha2 - - changed STACKBOTTOM for DJGPP (Thanks to Salvador Eduardo Tropea). - - Since 4.14 - - Reworked large block allocator. Now uses multiple doubly linked free - lists to approximate best fit. - - Changed heap expansion heuristic. Entirely free blocks are no longer - counted towards the heap size. This seems to have a major impact on - heap size stability; the old version could expand the heap way too - much in the presence of large block fragmentation. - - added -DGC_ASSERTIONS and some simple assertions inside the collector. - This is mainlyt for collector debugging. - - added -DUSE_MUNMAP to allow the heap to shrink. Suupported on only - a few UNIX-like platforms for now. - - added GC_dump_regions() for debugging of fragmentation issues. - - Changed PowerPC pointer alignment under Linux to 4. (This needs - checking by someone who has one. The suggestions came to me via a - rather circuitous path.) - - Changed the Linux/Alpha port to walk the data segment backwards until - it encounters a SIGSEGV. The old way to find the start of the data - segment broke with a recent release. - - cordxtra.c needed to call GC_REGISTER_FINALIZER instead of - GC_register_finalizer, so that it would continue to work with GC_DEBUG. - - allochblk sometimes cleared the wrong block for debugging purposes - when it dropped blacklisted blocks. This could result in spurious - error reports with GC_DEBUG. - - added MACOS X Server support. (Thanks to Andrew Stone.) - - Changed the Solaris threads code to ignore stack limits > 8 MB with - a warning. Empirically, it is not safe to access arbitrary pages - in such large stacks. And the dirty bit implementation does not - guarantee that none of them will be accessed. - - Integrated Martin Tauchmann's Amiga changes. - - Integrated James Dominy's OpenBSD/SPARC port. - - Since 5.0alpha1 - - Fixed bugs introduced in alpha1 (OpenBSD & large block initialization). - - Added -DKEEP_BACK_PTRS and backptr.h interface. (The implementation - idea came from Al Demers.) - - Since 5.0alpha2 - - Added some highly incomplete code to support a copied young generation. - Comments on nursery.h are appreciated. - - Changed -DFIND_LEAK, -DJAVA_FINALIZATION, and -DFINALIZE_ON_DEMAND, - so the same effect could be obtained with a runtime switch. This is - a step towards standardizing on a single dynamic GC library. - - Significantly changed the way leak detection is handled, as a consequence - of the above. - - Since 5.0 alpha3 - - Added protection fault handling patch for Linux/M68K from Fergus - Henderson and Roman Hodek. - - Removed the tests for SGI_SOURCE in new_gc_alloc.h. This was causing that - interface to fail on nonSGI platforms. - - Changed the Linux stack finding code to use /proc, after changing it - to use HEURISTIC1. (Thanks to David Mossberger for pointing out the - /proc hook.) - - Added HP/UX incremental GC support and HP/UX 11 thread support. - Thread support is currently still flakey. - - Added basic Linux/IA64 support. - - Integrated Anthony Green's PicoJava support. - - Integrated Scott Ananian's StrongARM/NetBSD support. - - Fixed some fairly serious performance bugs in the incremental - collector. These have probably been there essentially forever. - (Mark bits were sometimes set before scanning dirty pages. - The reclaim phase unnecessarily dirtied full small object pages.) - - Changed the reclaim phase to ignore nearly full pages to avoid - touching them. - - Limited GC_black_list_spacing to roughly the heap growth increment. - - Changed full collection triggering heuristic to decrease full GC - frequency by default, but to explicitly trigger full GCs during - heap growth. This doesn't always improve things, but on average it's - probably a win. - - GC_debug_free(0, ...) failed. Thanks to Fergus Henderson for the - bug report and fix. - - Since 5.0 alpha4 - - GC_malloc_explicitly_typed and friends sometimes failed to - initialize first word. - - Added allocation routines and support in the marker for mark descriptors - in a type structure referenced by the first word of an object. This was - introduced to support gcj, but hopefully in a way that makes it - generically useful. - - Added GC_requested_heapsize, and inhibited collections in nonincremental - mode if the actual used heap size is less than what was explicitly - requested. - - The Solaris pthreads version of GC_pthread_create didn't handle a NULL - attribute pointer. Solaris thread support used the wrong default thread - stack size. (Thanks to Melissa O'Neill for the patch.) - - Changed PUSH_CONTENTS macro to no longer modify first parameter. - This usually doesn't matter, but it was certainly an accident waiting - to happen ... - - Added GC_register_finalizer_no_order and friends to gc.h. They're - needed by Java implementations. - - Integrated a fix for a win32 deadlock resulting from clock() calling - malloc. (Thanks to Chris Dodd.) - - Integrated Hiroshi Kawashima's port to Linux/MIPS. This was designed - for a handheld platform, and may or may not be sufficient for other - machines. - - Fixed a va_arg problem with the %c specifier in cordprnt.c. It appears - that this was always broken, but recent versions of gcc are the first to - report the (statically detectable) bug. - - Added an attempt at a more general solution to dlopen races/deadlocks. - GC_dlopen now temporarily disables collection. Still not ideal, but ... - - Added -DUSE_I686_PREFETCH, -DUSE_3DNOW_PREFETCH, and support for IA64 - prefetch instructions. May improve performance measurably, but I'm not - sure the code will run correctly on processors that don't support the - instruction. Won't build except with very recent gcc. - - Added caching for header lookups in the marker. This seems to result - in a barely measurable performance gain. Added support for interleaved - lookups of two pointers, but unconfigured that since the performance - gain is currently near zero, and it adds to code size. - - Changed Linux DATA_START definition to check both data_start and - __data_start, since nothing else seems to be portable. - - Added -DUSE_LD_WRAP to optionally take advantage of the GNU ld function - wrapping mechanism. Probably currently useful only on Linux. - - Moved some variables for the scratch allocator into GC_arrays, on - Martin Hirzel's suggestion. - - Fixed a win32 threads bug that caused the collector to not look for - interior pointers from one of the thread stacks without - ALL_INTERIOR_POINTERS. (Thanks to Jeff Sturm.) - - Added Mingw32 support. (Thanks again to Jeff Sturm for the patch.) - - Changed the alpha port to use the generic register scanning code instead - of alpha_mach_dep.s. Alpha_mach_dep.s doesn't look for pointers in fp - registers, but gcc sometimes spills pointers there. (Thanks to Manuel - Serrano for helping me debug this by email.) Changed the IA64 code to - do something similar for similar reasons. - - Since 5.0alpha6: - - -DREDIRECT_MALLOC was broken in alpha6. Fixed. - - Cleaned up gc_ccp.h slightly, thus also causing the HP C++ compiler to - accept it. - - Removed accidental reference to dbg_mlc.c, which caused dbg_mlc.o to be - linked into every executable. - - Added PREFETCH to bitmap marker. Changed it to use the header cache. - - GC_push_marked sometimes pushed one object too many, resulting in a - segmentation fault in GC_mark_from_mark_stack. This was probably an old - bug. It finally showed up in gctest on win32. - - Gc_priv.h erroneously #defined GC_incremental to be TRUE instead of FALSE - when SMALL_CONFIG was defined. This was no doubt a major performance bug for - the default win32 configuration. - - Removed -DSMALL_CONFIG from NT_MAKEFILE. It seemed like an anchronism now - that the average PC has 64MB or so. - - Integrated Bryce McKinley's patches for linux threads and dynamic loading - from the libgcj tree. Turned on dynamic loading support for Linux/PPC. - - Changed the stack finding code to use environ on HP/UX. (Thanks - to Gustavo Rodriguez-Rivera for the suggestion.) This should probably - be done on other platforms, too. Since I can't test those, that'll - wait until after 5.0. - - Since 5.0alpha7: - - Fixed threadlibs.c for linux threads. -DUSE_LD_WRAP was broken and - -ldl was omitted. Fixed Linux stack finding code to handle - -DUSE_LD_WRAP correctly. - - Added MSWIN32 exception handler around marker, so that the collector - can recover from root segments that are unmapped during the collection. - This caused occasional failures under Windows 98, and may also be - an issue under Windows NT/2000. - - Since 5.0 - - Fixed a gc.h header bug which showed up under Irix. (Thanks to - Dan Sullivan.) - - Fixed a typo in GC_double_descr in typd_mlc.c not getting traced correctly. - This probably could result in objects described by array descriptors not - getting traced correctly. (Thanks to Ben Hutchings for pointing this out.) - - The block nearly full tests in reclaim.c were not correct for 64 bit - environments. This could result in unnecessary heap growth under unlikely - conditions. - - Removed use of CLEAR_DOUBLE from generic reclaim code, since odd sizes - could occur. - - To do: - - Integrate Linux/SPARC fixes. - - Very large root set sizes (> 16 MB or so) could cause the collector - to abort with an unexpected mark stack overflow. (Thanks again to - Peter Chubb.) NOT YET FIXED. Workaround is to increase the initial - size. - - The SGI version of the collector marks from mmapped pages, even - if they are not part of dynamic library static data areas. This - causes performance problems with some SGI libraries that use mmap - as a bitmap allocator. NOT YET FIXED. It may be possible to turn - off DYNAMIC_LOADING in the collector as a workaround. It may also - be possible to conditionally intercept mmap and use GC_exclude_static_roots. - The real fix is to walk rld data structures, which looks possible. - - Integrate MIT and DEC pthreads ports. - - Incremental collector should handle large objects better. Currently, - it looks like the whole object is treated as dirty if any part of it - is. - - Cord/cordprnt.c doesn't build on a few platforms (notably PowerPC), since - we make some unwarranted assumptions about how varargs are handled. This - currently makes the cord-aware versions of printf unusable on some platforms. - Fixing this is unfortunately not trivial. --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.Mac gcc-3.1/boehm-gc/README.Mac *** gcc-3.0.4/boehm-gc/README.Mac Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.Mac Thu Jan 1 00:00:00 1970 *************** *** 1,385 **** - Patrick Beard's Notes for building GC v4.12 with CodeWarrior Pro 2: - ---------------------------------------------------------------------------- - The current build environment for the collector is CodeWarrior Pro 2. - Projects for CodeWarrior Pro 2 (and for quite a few older versions) - are distributed in the file Mac_projects.sit.hqx. The project file - :Mac_projects:gc.prj builds static library versions of the collector. - :Mac_projects:gctest.prj builds the GC test suite. - - Configuring the collector is still done by editing the files - :Mac_files:MacOS_config.h and :Mac_files:MacOS_Test_config.h. - - Lars Farm's suggestions on building the collector: - ---------------------------------------------------------------------------- - Garbage Collection on MacOS - a manual 'MakeFile' - ------------------------------------------------- - - Project files and IDE's are great on the Macintosh, but they do have - problems when used as distribution media. This note tries to provide - porting instructions in pure TEXT form to avoid those problems. A manual - 'makefile' if you like. - - GC version: 4.12a2 - Codewarrior: CWPro1 - date: 18 July 1997 - - The notes may or may not apply to earlier or later versions of the - GC/CWPro. Actually, they do apply to earlier versions of both except that - until recently a project could only build one target so each target was a - separate project. The notes will most likely apply to future versions too. - Possibly with minor tweaks. - - This is just to record my experiences. These notes do not mean I now - provide a supported port of the GC to MacOS. It works for me. If it works - for you, great. If it doesn't, sorry, try again...;-) Still, if you find - errors, please let me know. - - mailto: lars.farm@ite.mh.se - - address: Lars Farm - Krönvägen 33b - 856 44 Sundsvall - Sweden - - Porting to MacOS is a bit more complex than it first seems. Which MacOS? - 68K/PowerPC? Which compiler? Each supports both 68K and PowerPC and offer a - large number of (unique to each environment) compiler settings. Each - combination of compiler/68K/PPC/settings require a unique combination of - standard libraries. And the IDE's does not select them for you. They don't - even check that the library is built with compatible setting and this is - the major source of problems when porting the GC (and otherwise too). - - You will have to make choices when you configure the GC. I've made some - choices here, but there are other combinations of settings and #defines - that work too. - - As for target settings the major obstacles may be: - - 68K Processor: check "4-byte Ints". - - PPC Processor: uncheck "Store Static Data in TOC". - - What you need to do: - =================== - - 1) Build the GC as a library - 2) Test that the library works with 'test.c'. - 3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'. - - 1) The Libraries: - ================= - I made one project with four targets (68K/PPC tempmem or appheap). One target - will suffice if you're able to decide which one you want. I wasn't... - - Codewarrior allows a large number of compiler/linker settings. I used these: - - Settings shared by all targets: - ------------------------------ - o Access Paths: - - User Paths: the GC folder - - System Paths: {Compiler}:Metrowerks Standard Library: - {Compiler}:MacOS Support:Headers: - {Compiler}:MacOS Support:MacHeaders: - o C/C++ language: - - inlining: normal - - direct to SOM: off - - enable/check: exceptions, RTTI, bool (and if you like pool strings) - - PowerPC target settings - ----------------------- - o Target Settings: - - name of target - - MacOS PPC Linker - o PPC Target - - name of library - o C/C++ language - - prefix file as described below - o PPC Processor - - Struct Alignment: PowerPC - - uncheck "Store Static Data in TOC" -- important! - I don't think the others matter, I use full optimization and its ok - o PPC Linker - - Factory Settings (SYM file with full paths, faster linking, dead-strip - static init, Main: __start) - - - 68K target settings - ------------------- - o Target Settings: - - name of target - - MacOS 68K Linker - o 68K Target - - name of library - - A5 relative data - o C/C++ language - - prefix file as described below - o 68K Processor - - Code model: smart - - Struct alignment: 68K - - FP: SANE - - enable 4-Byte Ints -- important! - I don't think the others matter. I selected... - - enable: 68020 - - enable: global register allocation - o IR Optimizer - - enable: Optimize Space, Optimize Speed - I suppose the others would work too, but haven't tried... - o 68K Linker - - Factory Settings (New Style MacsBug,SYM file with full paths, - A6 Frames, fast link, Merge compiler glue into segment 1, - dead-strip static init) - - Prefix Files to configure the GC sources - ---------------------------------------- - The Codewarrior equivalent of commandline compilers -DNAME=X is to use - prefix-files. A TEXT file that is automatically #included before the first byte - of every source file. I used these: - - ---- ( cut here ) ---- gc_prefix_tempmem.h -- 68K and PPC ----- - #include "gc_prefix_common.h" - #undef USE_TEMPORARY_MEMORY - #define USE_TEMPORARY_MEMORY - ---- ( cut here ) ---- gc_prefix_appmem.h -- 68K and PPC ----- - #include "gc_prefix_common.h" - #undef USE_TEMPORARY_MEMORY - // #define USE_TEMPORARY_MEMORY - - ---- ( cut here ) ---- gc_prefix_common.h -------------------- - // gc_prefix_common.h - // ------------------ - // Codewarrior prefix file to configure the GC libraries - // - // prefix files are the Codewarrior equivalent of the - // command line option -Dname=x frequently seen in makefiles - - #if !__MWERKS__ - #error only tried this with Codewarrior - #endif - - #if macintosh - #define MSL_USE_PRECOMPILED_HEADERS 0 - #include - #ifndef __STDC__ - #define __STDC__ 0 - #endif - - // See list of #defines to configure the library in: 'MakeFile' - // see also README - - #define SILENT // no collection messages. In case - // of trouble you might want this off - #define ALL_INTERIOR_POINTERS // follows interior pointers. - //#define DONT_ADD_BYTE_AT_END // disables the padding if defined. - //#define SMALL_CONFIG // whether to use a smaller heap. - #define NO_SIGNALS // signals aren't real on the Macintosh. - #define ATOMIC_UNCOLLECTABLE // GC_malloc_atomic_uncollectable() - - // define either or none as per personal preference - // used in malloc.c - #define REDIRECT_MALLOC GC_malloc - //#define REDIRECT_MALLOC GC_malloc_uncollectable - // if REDIRECT_MALLOC is #defined make sure that the GC library - // is listed before the ANSI/ISO libs in the Codewarrior - // 'Link order' panel - //#define IGNORE_FREE - - // mac specific configs - //#define USE_TEMPORARY_MEMORY // use Macintosh temporary memory. - //#define SHARED_LIBRARY_BUILD // build for use in a shared library. - - #else - // could build Win32 here too, or in the future - // Rhapsody PPC-mach, Rhapsody PPC-MacOS, - // Rhapsody Intel-mach, Rhapsody Intel-Win32,... - // ... ugh this will get messy ... - #endif - - // make sure ints are at least 32-bit - // ( could be set to 16-bit by compiler settings (68K) ) - - struct gc_private_assert_intsize_{ char x[ sizeof(int)>=4 ? 1 : 0 ]; }; - - #if __powerc - #if __option(toc_data) - #error turn off "store static data in TOC" when using GC - // ... or find a way to add TOC to the root set...(?) - #endif - #endif - ---- ( cut here ) ---- end of gc_prefix_common.h ----------------- - - Files to build the GC libraries: - -------------------------------- - allchblk.c - alloc.c - blacklst.c - checksums.c - dbg_mlc.c - finalize.c - headers.c - mach_dep.c - MacOS.c -- contains MacOS code - malloc.c - mallocx.c - mark.c - mark_rts.c - misc.c - new_hblk.c - obj_map.c - os_dep.c -- contains MacOS code - ptr_chck.c - reclaim.c - stubborn.c - typd_mlc.c - gc++.cc -- this is 'gc_cpp.cc' with less 'inline' and - -- throw std::bad_alloc when out of memory - -- gc_cpp.cc works just fine too - - 2) Test that the library works with 'test.c'. - ============================================= - - The test app is just an ordinary ANSI-C console app. Make sure settings - match the library you're testing. - - Files - ----- - test.c - the GC library to test -- link order before ANSI libs - suitable Mac+ANSI libraries - - prefix: - ------ - ---- ( cut here ) ---- gc_prefix_testlib.h -- all libs ----- - #define MSL_USE_PRECOMPILED_HEADERS 0 - #include - #undef NDEBUG - - #define ALL_INTERIOR_POINTERS /* for GC_priv.h */ - ---- ( cut here ) ---- - - 3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'. - - The test app is just an ordinary ANSI-C console app. Make sure settings match - the library you're testing. - - Files - ----- - test_cpp.cc - the GC library to test -- link order before ANSI libs - suitable Mac+ANSI libraries - - prefix: - ------ - same as for test.c - - For convenience I used one test-project with several targets so that all - test apps are build at once. Two for each library to test: test.c and - gc_app.cc. When I was satisfied that the libraries were ok. I put the - libraries + gc.h + the c++ interface-file in a folder that I then put into - the MSL hierarchy so that I don't have to alter access-paths in projects - that use the GC. - - After that, just add the proper GC library to your project and the GC is in - action! malloc will call GC_malloc and free GC_free, new/delete too. You - don't have to call free or delete. You may have to be a bit cautious about - delete if you're freeing other resources than RAM. See gc_cpp.h. You can - also keep coding as always with delete/free. That works too. If you want, - "include and tweak it's use a bit. - - Symantec SPM - ============ - It has been a while since I tried the GC in SPM, but I think that the above - instructions should be sufficient to guide you through in SPM too. SPM - needs to know where the global data is. Use the files 'datastart.c' and - 'dataend.c'. Put 'datastart.c' at the top of your project and 'dataend.c' - at the bottom of your project so that all data is surrounded. This is not - needed in Codewarrior because it provides intrinsic variables - __datastart__, __data_end__ that wraps all globals. - - Source Changes (GC 4.12a2) - ========================== - Very few. Just one tiny in the GC, not strictly needed. - - MacOS.c line 131 in routine GC_MacFreeTemporaryMemory() - change # if !defined(SHARED_LIBRARY_BUILD) - to # if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD) - To turn off a message when the application quits (actually, I faked - this change by #defining SHARED_LIBRARY_BUILD in a statically linked - library for more than a year without ill effects but perhaps this is - better). - - - test_cpp.cc - made the first lines of main() look like this: - ------------ - int main( int argc, char* argv[] ) { - #endif - #if macintosh // MacOS - char* argv_[] = {"test_cpp","10"}; // doesn't - argv=argv_; // have a - argc = sizeof(argv_)/sizeof(argv_[0]); // commandline - #endif // - - int i, iters, n; - # ifndef __GNUC__ - alloc dummy_to_fool_the_compiler_into_doing_things_it_currently_cant_handle; - ------------ - - - config.h [now gcconfig.h] - __MWERKS__ does not have to mean MACOS. You can use Codewarrior to - build a Win32 or BeOS library and soon a Rhapsody library. You may - have to change that #if... - - - - It worked for me, hope it works for you. - - Lars Farm - 18 July 1997 - ---------------------------------------------------------------------------- - - - Patrick Beard's instructions (may be dated): - - v4.3 of the collector now runs under Symantec C++/THINK C v7.0.4, and - Metrowerks C/C++ v4.5 both 68K and PowerPC. Project files are provided - to build and test the collector under both development systems. - - Configuration - ------------- - - To configure the collector, under both development systems, a prefix file - is used to set preprocessor directives. This file is called "MacOS_config.h". - Also to test the collector, "MacOS_Test_config.h" is provided. - - Testing - ------- - - To test the collector (always a good idea), build one of the gctest projects, - gctest.¹ (Symantec C++/THINK C), mw/gctest.68K.¹, or mw/gctest.PPC.¹. The - test will ask you how many times to run; 1 should be sufficient. - - Building - -------- - - For your convenience project files for the major Macintosh development - systems are provided. - - For Symantec C++/THINK C, you must build the two projects gclib-1.¹ and - gclib-2.¹. It has to be split up because the collector has more than 32k - of static data and no library can have more than this in the Symantec - environment. (Future versions will probably fix this.) - - For Metrowerks C/C++ 4.5 you build gc.68K.¹/gc.PPC.¹ and the result will - be a library called gc.68K.lib/gc.PPC.lib. - - Using - ----- - - Under Symantec C++/THINK C, you can just add the gclib-1.¹ and gclib-2.¹ - projects to your own project. Under Metrowerks, you add gc.68K.lib or - gc.PPC.lib and two additional files. You add the files called datastart.c - and dataend.c to your project, bracketing all files that use the collector. - See mw/gctest.¹ for an example. - - Include the projects/libraries you built above into your own project, - #include "gc.h", and call GC_malloc. You don't have to call GC_free. - - - Patrick C. Beard - January 4, 1995 --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.OS2 gcc-3.1/boehm-gc/README.OS2 *** gcc-3.0.4/boehm-gc/README.OS2 Wed Jun 30 12:42:42 1999 --- gcc-3.1/boehm-gc/README.OS2 Thu Jan 1 00:00:00 1970 *************** *** 1,6 **** - The code assumes static linking, and a single thread. The editor de has - not been ported. The cord test program has. The supplied OS2_MAKEFILE - assumes the IBM C Set/2 environment, but the code shouldn't. - - Since we haven't figured out hoe to do perform partial links or to build static - libraries, clients currently need to link against a long list of executables. --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.QUICK gcc-3.1/boehm-gc/README.QUICK *** gcc-3.0.4/boehm-gc/README.QUICK Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.QUICK Thu Jan 1 00:00:00 1970 *************** *** 1,43 **** - Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. - Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. - Copyright (c) 1999 by Hewlett-Packard. All rights reserved. - - THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - - Permission is hereby granted to use or copy this program - for any purpose, provided the above notices are retained on all copies. - Permission to modify the code and to distribute modified code is granted, - provided the above notices are retained, and a notice that the code was - modified is included with the above copyright notice. - - - For more details and the names of other contributors, see the - README file and gc.h. This file describes typical use of - the collector on a machine that is already supported. - - INSTALLATION: - Under UN*X, type "make test". Under OS/2 or Windows NT, copy the - appropriate makefile to MAKEFILE, read it, and type "nmake test". - Read the machine specific README if one exists. The only way to - develop code with the collector for Windows 3.1 is to develop under - Windows NT, and then to use win32S. - - If you wish to use the cord (structured string) library type - "make cords". (This requires an ANSI C compiler. You may need - to redefine CC in the Makefile.) - - If you wish to use the collector from C++, type - "make c++". These add further files to gc.a and to the include - subdirectory. See cord/cord.h and gc_c++.h. - - TYPICAL USE: - Include "gc.h" from this directory. Link against the appropriate library - ("gc.a" under UN*X). Replace calls to malloc by calls to GC_MALLOC, - and calls to realloc by calls to GC_REALLOC. If the object is known - to never contain pointers, use GC_MALLOC_ATOMIC instead of - GC_MALLOC. - - Define GC_DEBUG before including gc.h for additional checking. - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.alpha gcc-3.1/boehm-gc/README.alpha *** gcc-3.0.4/boehm-gc/README.alpha Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.alpha Thu Jan 1 00:00:00 1970 *************** *** 1,22 **** - Should work under OSF/1 and Linux. Currently no VMS or NT support, though - the latter shouldn't be hard. - - Incremental gc not yet supported under Linux because signal handler - for SIGSEGV can't get a hold of fault address. Dynamic library support - is also missing from Linux/alpha, probably for no good reason. - - Currently there is no thread support in the standard distribution. There - exists a separate port to DEC Unix pthreads. It should be possible to - port the X86 Linux threads support to Alpha without much trouble. - - If you get asssembler errors, be sure to read the first few lines of the - Makefile. - - From Philippe Queinnec: - - System: DEC/Alpha OSF1 v3.2, vendor cc - Problem: can't link if libgc has been compiled with "cc -std1". - It works if the library has been compiled with either gcc or "cc" - alone. The problem is because the variable "end" is not defined if - compiling in std1 mode (see man ld). - Proposed fix: none. Don't use cc -std1 ! --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.amiga gcc-3.1/boehm-gc/README.amiga *** gcc-3.0.4/boehm-gc/README.amiga Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.amiga Thu Jan 1 00:00:00 1970 *************** *** 1,180 **** - =========================================================================== - Martin Tauchmann's notes (1-Apr-99) - =========================================================================== - - Works now, also with the GNU-C compiler V2.7.2.1. - Modify the `Makefile` - CC=cc $(ABI_FLAG) - to - CC=gcc $(ABI_FLAG) - - TECHNICAL NOTES - - - `GC_get_stack_base()`, `GC_register_data_segments()` works now with every - C compiler; also Workbench. - - - Removed AMIGA_SKIP_SEG, but the Code-Segment must not be scanned by GC. - - - PROBLEMS - - When the Linker, does`t merge all Code-Segments to an single one. LD of GCC - do it always. - - - With ixemul.library V47.3, when an GC program launched from another program - (example: `Make` or `if_mach M68K AMIGA gctest`), `GC_register_data_segments()` - found the Segment-List of the caller program. - Can be fixed, if the run-time initialization code (for C programs, usually *crt0*) - support `__data` and `__bss`. - - - PowerPC Amiga currently not supported. - - - Dynamic libraries (dyn_load.c) not supported. - - - TESTED WITH SOFTWARE - - `Optimized Oberon 2 C` (oo2c) - - - TESTED WITH HARDWARE - - MC68030 - - - CONTACT - - Please, contact me at , when you change the - Amiga port. - - =========================================================================== - Michel Schinz's notes - =========================================================================== - WHO DID WHAT - - The original Amiga port was made by Jesper Peterson. I (Michel Schinz) - modified it slightly to reflect the changes made in the new official - distributions, and to take advantage of the new SAS/C 6.x features. I also - created a makefile to compile the "cord" package (see the cord - subdirectory). - - TECHNICAL NOTES - - In addition to Jesper's notes, I have the following to say: - - - Starting with version 4.3, gctest checks to see if the code segment is - added to the root set or not, and complains if it is. Previous versions - of this Amiga port added the code segment to the root set, so I tried to - fix that. The only problem is that, as far as I know, it is impossible to - know which segments are code segments and which are data segments (there - are indeed solutions to this problem, like scanning the program on disk - or patch the LoadSeg functions, but they are rather complicated). The - solution I have chosen (see os_dep.c) is to test whether the program - counter is in the segment we are about to add to the root set, and if it - is, to skip the segment. The problems are that this solution is rather - awkward and that it works only for one code segment. This means that if - your program has more than one code segment, all of them but one will be - added to the root set. This isn't a big problem in fact, since the - collector will continue to work correctly, but it may be slower. - - Anyway, the code which decides whether to skip a segment or not can be - removed simply by not defining AMIGA_SKIP_SEG. But notice that if you do - so, gctest will complain (it will say that "GC_is_visible produced wrong - failure indication"). However, it may be useful if you happen to have - pointers stored in a code segment (you really shouldn't). - - If anyone has a good solution to the problem of finding, when a program - is loaded in memory, whether a segment is a code or a data segment, - please let me know. - - PROBLEMS - - If you have any problem with this version, please contact me at - schinz@alphanet.ch (but do *not* send long files, since we pay for - every mail!). - - =========================================================================== - Jesper Peterson's notes - =========================================================================== - - ADDITIONAL NOTES FOR AMIGA PORT - - These notes assume some familiarity with Amiga internals. - - WHY I PORTED TO THE AMIGA - - The sole reason why I made this port was as a first step in getting - the Sather(*) language on the Amiga. A port of this language will - be done as soon as the Sather 1.0 sources are made available to me. - Given this motivation, the garbage collection (GC) port is rather - minimal. - - (*) For information on Sather read the comp.lang.sather newsgroup. - - LIMITATIONS - - This port assumes that the startup code linked with target programs - is that supplied with SAS/C versions 6.0 or later. This allows - assumptions to be made about where to find the stack base pointer - and data segments when programs are run from WorkBench, as opposed - to running from the CLI. The compiler dependent code is all in the - GC_get_stack_base() and GC_register_data_segments() functions, but - may spread as I add Amiga specific features. - - Given that SAS/C was assumed, the port is set up to be built with - "smake" using the "SMakefile". Compiler options in "SCoptions" can - be set with "scopts" program. Both "smake" and "scopts" are part of - the SAS/C commercial development system. - - In keeping with the porting philosophy outlined above, this port - will not behave well with Amiga specific code. Especially not inter- - process comms via messages, and setting up public structures like - Intuition objects or anything else in the system lists. For the - time being the use of this library is limited to single threaded - ANSI/POSIX compliant or near-complient code. (ie. Stick to stdio - for now). Given this limitation there is currently no mechanism for - allocating "CHIP" or "PUBLIC" memory under the garbage collector. - I'll add this after giving it considerable thought. The major - problem is the entire physical address space may have to me scanned, - since there is no telling who we may have passed memory to. - - If you allocate your own stack in client code, you will have to - assign the pointer plus stack size to GC_stackbottom. - - The initial stack size of the target program can be compiled in by - setting the __stack symbol (see SAS documentaion). It can be over- - ridden from the CLI by running the AmigaDOS "stack" program, or from - the WorkBench by setting the stack size in the tool types window. - - SAS/C COMPILER OPTIONS (SCoptions) - - You may wish to check the "CPU" code option is appropriate for your - intended target system. - - Under no circumstances set the "StackExtend" code option in either - compiling the library or *ANY* client code. - - All benign compiler warnings have been suppressed. These mainly - involve lack of prototypes in the code, and dead assignments - detected by the optimizer. - - THE GOOD NEWS - - The library as it stands is compatible with the GigaMem commercial - virtual memory software, and probably similar PD software. - - The performance of "gctest" on an Amiga 2630 (68030 @ 25Mhz) - compares favourably with an HP9000 with similar architecture (a 325 - with a 68030 I think). - - ----------------------------------------------------------------------- - - The Amiga port has been brought to you by: - - Jesper Peterson. - - jep@mtiame.mtia.oz.au (preferred, but 1 week turnaround) - jep@orca1.vic.design.telecom.au (that's orca, 1 day turnaround) - - At least one of these addresses should be around for a while, even - though I don't work for either of the companies involved. - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.debugging gcc-3.1/boehm-gc/README.debugging *** gcc-3.0.4/boehm-gc/README.debugging Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/README.debugging Thu Jan 1 00:00:00 1970 *************** *** 1,68 **** - Debugging suggestions: - - ****If you get a segmentation fault or bus error while debugging with a debugger: - If the fault occurred in GC_find_limit, or with incremental collection enabled, this is probably normal. The collector installs handlers to take care of these. You will not see these unless you are using a debugger. Your debugger should allow you to continue. It's preferable to tell the debugger to ignore SIGBUS and SIGSEGV ("handle" in gdb, "ignore" in most versions of dbx) and set a breakpoint in abort. The collector will call abort if the signal had another cause, and there was not other handler previously installed. I recommend debugging without incremental collection if possible. (This applies directly to UNIX systems. Debugging with incremental collection under win32 is worse. See README.win32.) - - ****If you get warning messages informing you that the collector needed to allocate blacklisted blocks: - - 0) Ignore these warnings while you are using GC_DEBUG. Some of the routines mentioned below don't have debugging equivalents. (Alternatively, write the missing routines and send them to me.) - - 1) Replace allocator calls that request large blocks with calls to GC_malloc_ignore_off_page or GC_malloc_atomic_ignore_off_page. You may want to set a breakpoint in GC_default_warn_proc to help you identify such calls. Make sure that a pointer to somewhere near the beginning of the resulting block is maintained in a (preferably volatile) variable as long as the block is needed. - - 2) If the large blocks are allocated with realloc, I suggest instead allocating them with something like the following. Note that the realloc size increment should be fairly large (e.g. a factor of 3/2) for this to exhibit reasonable performance. But we all know we should do that anyway. - - void * big_realloc(void *p, size_t new_size) - { - size_t old_size = GC_size(p); - void * result; - - if (new_size <= 10000) return(GC_realloc(p, new_size)); - if (new_size <= old_size) return(p); - result = GC_malloc_ignore_off_page(new_size); - if (result == 0) return(0); - memcpy(result,p,old_size); - GC_free(p); - return(result); - } - - 3) In the unlikely case that even relatively small object (<20KB) allocations are triggering these warnings, then your address space contains lots of "bogus pointers", i.e. values that appear to be pointers but aren't. Usually this can be solved by using GC_malloc_atomic or the routines in gc_typed.h to allocate large pointerfree regions of bitmaps, etc. Sometimes the problem can be solved with trivial changes of encoding in certain values. It is possible, though not pleasant, to identify the source of the bogus pointers by setting a breakpoint in GC_add_to_black_list_stack, and looking at the value of current_p in the GC_mark_from_mark_stack frame. Current_p contains the address of the bogus pointer. - - 4) If you get only a fixed number of these warnings, you are probably only introducing a bounded leak by ignoring them. If the data structures being allocated are intended to be permanent, then it is also safe to ignore them. The warnings can be turned off by calling GC_set_warn_proc with a procedure that ignores these warnings (e.g. by doing absolutely nothing). - - - ****If the collector dies in GC_malloc while trying to remove a free list element: - - 1) With > 99% probability, you wrote past the end of an allocated object. Try setting GC_DEBUG and using the debugging facilities in gc.h. - - - ****If the heap grows too much: - - 1) Consider using GC_malloc_atomic for objects containing nonpointers. This is especially important for large arrays containg compressed data, pseudo-random numbers, and the like. (This isn't all that likely to solve your problem, but it's a useful and easy optimization anyway, and this is a good time to try it.) If you allocate large objects containg only one or two pointers at the beginning, either try the typed allocation primitives is gc.h, or separate out the pointerfree component. - 2) If you are using the collector in its default mode, with interior pointer recognition enabled, consider using GC_malloc_ignore_off_page to allocate large objects. (See gc.h and above for details. Large means > 100K in most environments.) - 3) GC_print_block_list() will print a list of all currently allocated heap blocks and what size objects they contain. GC_print_hblkfreelist() will print a list of free heap blocks, and whether they are blacklisted. GC_dump calls both of these, and also prints information about heap sections, and root segments. - 4) Build the collector with -DKEEP_BACK_PTRS, and use the backptr.h - interface to determine why objects are being retained. - - - ****If the collector appears to be losing objects: - - 1) Replace all calls to GC_malloc_atomic and typed allocation by GC_malloc calls. If this fixes the problem, gradually reinsert your optimizations. - 2) You may also want to try the safe(r) pointer manipulation primitives in gc.h. But those are hard to use until the preprocessor becomes available. - 3) Try using the GC_DEBUG facilities. This is less likely to be successful here than if the collector crashes. - [The rest of these are primarily for wizards. You shouldn't need them unless you're doing something really strange, or debugging a collector port.] - 4) Don't turn on incremental collection. If that fixes the problem, suspect a bug in the dirty bit implementation. Try compiling with -DCHECKSUMS to check for modified, but supposedly clean, pages. - 5) On a SPARC, in a single-threaded environment, GC_print_callers(GC_arrays._last_stack) prints a cryptic stack trace as of the time of the last collection. (You will need a debugger to decipher the result.) The question to ask then is "why should this object have been accessible at the time of the last collection? Where was a pointer to it stored?". This facility should be easy to add for some other collector ports (namely if it's easy to traverse stack frames), but will be hard for others. - 6) "print *GC_find_header(p)" in dbx or gdb will print the garbage collector block header information associated with the object p (e.g. object size, etc.) - 7) GC_is_marked(p) determines whether p is the base address of a marked object. Note that objects allocated since the last collection should not be marked, and that unmarked objects are reclaimed incrementally. It's usually most interesting to set a breakpoint in GC_finish_collection and then to determine how much of the damaged data structure is marked at that point. - 8) Look at the tracing facility in mark.c. (Ignore this suggestion unless you are very familiar with collector internals.) - 9) [From Melissa O'Neill:] - If you're using multiple threads, double check that all thread - creation goes through the GC_ wrapper functions rather than - calling the thread-creation functions themselves (e.g., - GC_pthread_create rather than pthread_create). The gc.h header - file includes suitable preprocessor definitions to accomplish - this mapping transparently -- the question is: are you including - it in all the modules that create threads? - - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.dj gcc-3.1/boehm-gc/README.dj *** gcc-3.0.4/boehm-gc/README.dj Wed Jun 30 12:42:48 1999 --- gcc-3.1/boehm-gc/README.dj Thu Jan 1 00:00:00 1970 *************** *** 1,12 **** - [Original version supplied by Xiaokun Zhu ] - [This version came mostly from Gary Leavens. ] - - Look first at Makefile.dj, and possibly change the definitions of - RM and MV if you don't have rm and mv installed. - Then use Makefile.dj to compile the garbage collector. - For example, you can do: - - make -f Makefile.dj test - - All the tests should work fine. - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.hp gcc-3.1/boehm-gc/README.hp *** gcc-3.0.4/boehm-gc/README.hp Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.hp Thu Jan 1 00:00:00 1970 *************** *** 1,16 **** - Dynamic loading support requires that executables be linked with -ldld. - The alternative is to build the collector without defining DYNAMIC_LOADING - in gcconfig.h and ensuring that all garbage collectable objects are - accessible without considering statically allocated variables in dynamic - libraries. - - The collector should compile with either plain cc or cc -Ae. CC -Aa - fails to define _HPUX_SOURCE and thus will not configure the collector - correctly. - - Incremental collection support was reccently added, and should now work. - - Thread support for HP/UX 11 Pthreads was also recently added. It is still - flakey in this release. (It has only been tested on a uniprocessor. Even - there some fraction of thread creation calls fail with a not-yet-understood - error return from sem_wait.) --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.linux gcc-3.1/boehm-gc/README.linux *** gcc-3.0.4/boehm-gc/README.linux Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/README.linux Thu Jan 1 00:00:00 1970 *************** *** 1,68 **** - See README.alpha for Linux on DEC AXP info. - - This file applies mostly to Linux/Intel IA32. Ports to Linux on an M68K - and PowerPC are also integrated. They should behave similarly, except that - the PowerPC port lacks incremental GC support, and it is unknown to what - extent the Linux threads code is functional. - - Incremental GC is supported on Intel IA32 and M68K. - - Dynamic libraries are supported on an ELF system. A static executable - should be linked with the gcc option "-Wl,-defsym,_DYNAMIC=0". - - The collector appears to work with Linux threads. We have seen - intermittent hangs in sem_wait. So far we have been unable to reproduce - these unless the process was being debugged or traced. Thus it's - possible that the only real issue is that the debugger loses - signals on rare occasions. - - The garbage collector uses SIGPWR and SIGXCPU if it is used with - Linux threads. These should not be touched by the client program. - - To use threads, you need to abide by the following requirements: - - 1) You need to use LinuxThreads (which are included in libc6). - - The collector relies on some implementation details of the LinuxThreads - package. It is unlikely that this code will work on other - pthread implementations (in particular it will *not* work with - MIT pthreads). - - 2) You must compile the collector with -DLINUX_THREADS and -D_REENTRANT - specified in the Makefile. - - 3a) Every file that makes thread calls should define LINUX_THREADS and - _REENTRANT and then include gc.h. Gc.h redefines some of the - pthread primitives as macros which also provide the collector with - information it requires. - - 3b) A new alternative to (3a) is to build the collector with - -DUSE_LD_WRAP, and to link the final program with - - (for ld) --wrap read --wrap dlopen --wrap pthread_create \ - --wrap pthread_join --wrap pthread_sigmask - - (for gcc) -Wl,--wrap -Wl,read -Wl,--wrap -Wl,dlopen -Wl,--wrap \ - -Wl,pthread_create -Wl,--wrap -Wl,pthread_join -Wl,--wrap \ - -Wl,pthread_sigmask - - In any case, _REENTRANT should be defined during compilation. - - 4) Dlopen() disables collection during its execution. (It can't run - concurrently with the collector, since the collector looks at its - data structures. It can't acquire the allocator lock, since arbitrary - user startup code may run as part of dlopen().) Under unusual - conditions, this may cause unexpected heap growth. - - 5) The combination of LINUX_THREADS, REDIRECT_MALLOC, and incremental - collection fails in seemingly random places. This hasn't been tracked - down yet, but is perhaps not completely astonishing. The thread package - uses malloc, and thus can presumably get SIGSEGVs while inside the - package. There is no real guarantee that signals are handled properly - at that point. - - 6) Thread local storage may not be viewed as part of the root set by the - collector. This probably depends on the linuxthreads version. For the - time being, any collectable memory referenced by thread local storage should - also be referenced from elsewhere, or be allocated as uncollectable. - (This is really a bug that should be fixed somehow.) --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.rs6000 gcc-3.1/boehm-gc/README.rs6000 *** gcc-3.0.4/boehm-gc/README.rs6000 Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.rs6000 Thu Jan 1 00:00:00 1970 *************** *** 1,9 **** - We have so far failed to find a good way to determine the stack base. - It is highly recommended that GC_stackbottom be set explicitly on program - startup. The supplied value sometimes causes failure under AIX 4.1, though - it appears to work under 3.X. HEURISTIC2 seems to work under 4.1, but - involves a substantial performance penalty, and will fail if there is - no limit on stack size. - - There is no thread support. (I assume recent versions of AIX provide - pthreads? I no longer have access to a machine ...) --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.sgi gcc-3.1/boehm-gc/README.sgi *** gcc-3.0.4/boehm-gc/README.sgi Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.sgi Thu Jan 1 00:00:00 1970 *************** *** 1,41 **** - Performance of the incremental collector can be greatly enhanced with - -DNO_EXECUTE_PERMISSION. - - The collector should run with all of the -32, -n32 and -64 ABIs. Remember to - define the AS macro in the Makefile to be "as -64", or "as -n32". - - If you use -DREDIRECT_MALLOC=GC_malloc with C++ code, your code should make - at least one explicit call to malloc instead of new to ensure that the proper - version of malloc is linked in. - - Sproc threads are not supported in this version, though there may exist other - ports. - - Pthreads support is provided. This requires that: - - 1) You compile the collector with -DIRIX_THREADS specified in the Makefile. - - 2) You have the latest pthreads patches installed. - - (Though the collector makes only documented pthread calls, - it relies on signal/threads interactions working just right in ways - that are not required by the standard. It is unlikely that this code - will run on other pthreads platforms. But please tell me if it does.) - - 3) Every file that makes thread calls should define IRIX_THREADS and then - include gc.h. Gc.h redefines some of the pthread primitives as macros which - also provide the collector with information it requires. - - 4) pthread_cond_wait and pthread_cond_timed_wait should be prepared for - premature wakeups. (I believe the pthreads and realted standards require this - anyway. Irix pthreads often terminate a wait if a signal arrives. - The garbage collector uses signals to stop threads.) - - 5) It is expensive to stop a thread waiting in IO at the time the request is - initiated. Applications with many such threads may not exhibit acceptable - performance with the collector. (Increasing the heap size may help.) - - 6) The collector should not be compiled with -DREDIRECT_MALLOC. This - confuses some library calls made by the pthreads implementation, which - expect the standard malloc. - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.solaris2 gcc-3.1/boehm-gc/README.solaris2 *** gcc-3.0.4/boehm-gc/README.solaris2 Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/README.solaris2 Thu Jan 1 00:00:00 1970 *************** *** 1,62 **** - The collector supports both incremental collection and threads under - Solaris 2. The incremental collector normally retrieves page dirty information - through the appropriate /proc calls. But it can also be configured - (by defining MPROTECT_VDB instead of PROC_VDB in gcconfig.h) to use mprotect - and signals. This may result in shorter pause times, but it is no longer - safe to issue arbitrary system calls that write to the heap. - - Under other UNIX versions, - the collector normally obtains memory through sbrk. There is some reason - to expect that this is not safe if the client program also calls the system - malloc, or especially realloc. The sbrk man page strongly suggests this is - not safe: "Many library routines use malloc() internally, so use brk() - and sbrk() only when you know that malloc() definitely will not be used by - any library routine." This doesn't make a lot of sense to me, since there - seems to be no documentation as to which routines can transitively call malloc. - Nonetheless, under Solaris2, the collector now (since 4.12) allocates - memory using mmap by default. (It defines USE_MMAP in gcconfig.h.) - You may want to reverse this decisions if you use -DREDIRECT_MALLOC=... - - - SOLARIS THREADS: - - The collector must be compiled with -DSOLARIS_THREADS to be thread safe. - It is also essential that gc.h be included in files that call thr_create, - thr_join, thr_suspend, thr_continue, or dlopen. Gc.h macro defines - these to also do GC bookkeeping, etc. Gc.h must be included with - SOLARIS_THREADS defined, otherwise these replacements are not visible. - A collector built in this way way only be used by programs that are - linked with the threads library. - - If you are using the Pthreads interface, also define _SOLARIS_PTHREADS. - - In this mode, the collector contains various workarounds for older Solaris - bugs. Mostly, these should not be noticeable unless you look at system - call traces. However, it cannot protect a guard page at the end of - a thread stack. If you know that you will only be running Solaris2.5 - or later, it should be possible to fix this by compiling the collector - with -DSOLARIS23_MPROTECT_BUG_FIXED. - - Since 5.0 alpha5, dlopen disables collection temporarily, - unless USE_PROC_FOR_LIBRARIES is defined. In some unlikely cases, this - can result in unpleasant heap growth. But it seems better than the - race/deadlock issues we had before. - - If solaris_threads are used on an X86 processor with malloc redirected to - GC_malloc, it is necessary to call GC_thr_init explicitly before forking the - first thread. (This avoids a deadlock arising from calling GC_thr_init - with the allocation lock held.) - - It appears that there is a problem in using gc_cpp.h in conjunction with - Solaris threads and Sun's C++ runtime. Apparently the overloaded new operator - is invoked by some iostream initialization code before threads are correctly - initialized. As a result, call to thr_self() in garbage collector - initialization segfaults. Currently the only known workaround is to not - invoke the garbage collector from a user defined global operator new, or to - have it invoke the garbage-collector's allocators only after main has started. - (Note that the latter requires a moderately expensive test in operator - delete.) - - Hans-J. Boehm - (The above contains my personal opinions, which are probably not shared - by anyone else.) --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.uts gcc-3.1/boehm-gc/README.uts *** gcc-3.0.4/boehm-gc/README.uts Wed Jun 30 12:42:56 1999 --- gcc-3.1/boehm-gc/README.uts Thu Jan 1 00:00:00 1970 *************** *** 1,2 **** - Alistair Crooks supplied the port. He used Lexa C version 2.1.3 with - -Xa to compile. --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/README.win32 gcc-3.1/boehm-gc/README.win32 *** gcc-3.0.4/boehm-gc/README.win32 Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/README.win32 Thu Jan 1 00:00:00 1970 *************** *** 1,149 **** - The collector has only been compiled under Windows NT, with the - original Microsoft SDK, with Visual C++ 2.0 and later, with - the GNU win32 environment, with Borland 4.5, and recently with - Watcom C. - - It runs under both win32s and win32, but with different semantics. - Under win32, all writable pages outside of the heaps and stack are - scanned for roots. Thus the collector sees pointers in DLL data - segments. Under win32s, only the main data segment is scanned. - (The main data segment should always be scanned. Under some - versions of win32s, other regions may also be scanned.) - Thus all accessible objects should be accessible from local variables - or variables in the main data segment. Alternatively, other data - segments (e.g. in DLLs) may be registered with the collector by - calling GC_init() and then GC_register_root_section(a), where - a is the address of some variable inside the data segment. (Duplicate - registrations are ignored, but not terribly quickly.) - - (There are two reasons for this. We didn't want to see many 16:16 - pointers. And the VirtualQuery call has different semantics under - the two systems, and under different versions of win32s.) - - The collector test program "gctest" is linked as a GUI application, - but does not open any windows. Its output appears in the file - "gc.log". It may be started from the file manager. The hour glass - cursor will appear as long as it's running. If it is started from the - command line, it will usually run in the background. Wait a few - minutes (a few seconds on a modern machine) before you check the output. - You should see either a failure indication or a "Collector appears to - work" message. - - The cord test program has not been ported (but should port - easily). A toy editor (cord/de.exe) based on cords (heavyweight - strings represented as trees) has been ported and is included. - It runs fine under either win32 or win32S. It serves as an example - of a true Windows application, except that it was written by a - nonexpert Windows programmer. (There are some peculiarities - in the way files are displayed. The is displayed explicitly - for standard DOS text files. As in the UNIX version, control - characters are displayed explicitly, but in this case as red text. - This may be suboptimal for some tastes and/or sets of default - window colors.) - - For Microsoft development tools, rename NT_MAKEFILE as - MAKEFILE. (Make sure that the CPU environment variable is defined - to be i386.) - - For GNU-win32, use the regular makefile, possibly after uncommenting - the line "include Makefile.DLLs". The latter should be necessary only - if you want to package the collector as a DLL. The GNU-win32 port is - believed to work only for b18, not b19, probably dues to linker changes - in b19. This is probably fixable with a different definition of - DATASTART and DATAEND in gcconfig.h. - - For Borland tools, use BCC_MAKEFILE. Note that - Borland's compiler defaults to 1 byte alignment in structures (-a1), - whereas Visual C++ appears to default to 8 byte alignment (/Zp8). - The garbage collector in its default configuration EXPECTS AT - LEAST 4 BYTE ALIGNMENT. Thus the BORLAND DEFAULT MUST - BE OVERRIDDEN. (In my opinion, it should usually be anyway. - I expect that -a1 introduces major performance penalties on a - 486 or Pentium.) Note that this changes structure layouts. (As a last - resort, gcconfig.h can be changed to allow 1 byte alignment. But - this has significant negative performance implications.) - The Makefile is set up to assume Borland 4.5. If you have another - version, change the line near the top. By default, it does not - require the assembler. If you do have the assembler, I recommend - removing the -DUSE_GENERIC. - - Incremental collection support was recently added. This is - currently pretty simpleminded. Pages are protected. Protection - faults are caught by a handler installed at the bottom of the handler - stack. This is both slow and interacts poorly with a debugger. - Whenever possible, I recommend adding a call to - GC_enable_incremental at the last possible moment, after most - debugging is complete. Unlike the UNIX versions, no system - calls are wrapped by the collector itself. It may be necessary - to wrap ReadFile calls that use a buffer in the heap, so that the - call does not encounter a protection fault while it's running. - (As usual, none of this is an issue unless GC_enable_incremental - is called.) - - Note that incremental collection is disabled with -DSMALL_CONFIG, - which is the default for win32. If you need incremental collection, - undefine SMALL_CONFIG. - - Incremental collection is not supported under win32s, and it may not - be possible to do so. However, win32 applications that attempt to use - incremental collection should continue to run, since the - collector detects if it's running under win32s and turns calls to - GC_enable_incremental() into noops. - - James Clark has contributed the necessary code to support win32 threads. - This code is known to exhibit some problems with incremental collection - enabled. Use NT_THREADS_MAKEFILE (a.k.a gc.mak) instead of NT_MAKEFILE - to build this version. Note that this requires some files whose names - are more than 8 + 3 characters long. Thus you should unpack the tar file - so that long file names are preserved. To build the garbage collector - test with VC++ from the command line, use - - nmake /F ".\gc.mak" CFG="gctest - Win32 Release" - - This requires that the subdirectory gctest\Release exist. - The test program and DLL will reside in the Release directory. - - This version relies on the collector residing in a dll. - - This version currently supports incremental collection only if it is - enabled before any additional threads are created. - Version 4.13 attempts to fix some of the earlier problems, but there - may be other issues. If you need solid support for win32 threads, you - might check with Geodesic Systems. Their collector must be licensed, - but they have invested far more time in win32-specific issues. - - Hans - - Ivan V. Demakov's README for the Watcom port: - - The collector has been compiled with Watcom C 10.6 and 11.0. - It runs under win32, win32s, and even under msdos with dos4gw - dos-extender. It should also run under OS/2, though this isn't - tested. Under win32 the collector can be built either as dll - or as static library. - - Note that all compilations were done under Windows 95 or NT. - For unknown reason compiling under Windows 3.11 for NT (one - attempt has been made) leads to broken executables. - - Incremental collection is not supported. - - cord is not ported. - - Before compiling you may need to edit WCC_MAKEFILE to set target - platform, library type (dynamic or static), calling conventions, and - optimization options. - - To compile the collector and testing programs use the command: - wmake -f WCC_MAKEFILE - - All programs using gc should be compiled with 4-byte alignment. - For further explanations on this see comments about Borland. - - If gc compiled as dll, the macro ``GC_DLL'' should be defined before - including "gc.h" (for example, with -DGC_DLL compiler option). It's - important, otherwise resulting programs will not run. - - Ivan Demakov (email: ivan@tgrad.nsk.su) - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/SCoptions.amiga gcc-3.1/boehm-gc/SCoptions.amiga *** gcc-3.0.4/boehm-gc/SCoptions.amiga Wed Jun 30 12:42:59 1999 --- gcc-3.1/boehm-gc/SCoptions.amiga Thu Jan 1 00:00:00 1970 *************** *** 1,16 **** - CPU=68030 - NOSTACKCHECK - OPTIMIZE - VERBOSE - MAPHUNK - NOVERSION - NOICONS - OPTIMIZERTIME - DEFINE SILENT - DEFINE AMIGA_SKIP_SEG - IGNORE=85 - IGNORE=154 - IGNORE=161 - IGNORE=100 - OPTIMIZERCOMPLEXITY=4 - OPTIMIZERDEPTH=3 --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/SMakefile.amiga gcc-3.1/boehm-gc/SMakefile.amiga *** gcc-3.0.4/boehm-gc/SMakefile.amiga Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/SMakefile.amiga Fri Aug 17 18:30:45 2001 *************** *** 1,48 **** - OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o real_malloc.o dyn_load.o dbg_mlc.o malloc.o stubborn.o checksums.o typd_mlc.o ptr_chck.o ! INC= gc_private.h gc_hdrs.h gc.h gcconfig.h ! all: gctest setjmp_t alloc.o : alloc.c $(INC) reclaim.o : reclaim.c $(INC) allchblk.o : allchblk.c $(INC) misc.o : misc.c $(INC) ! os_dep.o : os_dep.c $(INC) mark_rts.o : mark_rts.c $(INC) headers.o : headers.c $(INC) mark.o : mark.c $(INC) obj_map.o : obj_map.c $(INC) blacklst.o : blacklst.c $(INC) finalize.o : finalize.c $(INC) ! sc noopt finalize.c # There seems to be a bug in the optimizer (V6.51). ! # gctest won't work if you remove this... new_hblk.o : new_hblk.c $(INC) real_malloc.o : real_malloc.c $(INC) dyn_load.o : dyn_load.c $(INC) dbg_mlc.o : dbg_mlc.c $(INC) malloc.o : malloc.c $(INC) ! mallocx.o : malloc.c $(INC) stubborn.o : stubborn.c $(INC) checksums.o : checksums.c $(INC) typd_mlc.o: typd_mlc.c $(INC) mach_dep.o : mach_dep.c $(INC) ptr_chck.o: ptr_chck.c $(INC) test.o : test.c $(INC) ! gc.lib: $(OBJS) ! oml gc.lib r $(OBJS) - clean: - delete gc.lib gctest setjmp_t \#?.o ! gctest: gc.lib test.o ! slink LIB:c.o test.o to $@ lib gc.lib LIB:sc.lib LIB:scm.lib - setjmp_t: setjmp_t.c gc.h - sc setjmp_t.c - slink LIB:c.o $@.o to $@ lib LIB:sc.lib - test: setjmp_t gctest - setjmp_t - gctest --- 1,178 ---- ! # Rewritten smakefile for amiga / sas/c. -Kjetil M. ! # Dont use the cord-package if you define parm=both or parm=reg. ! ! #----------------TOOLS-------------------------------- ! CC=sc ! LINKER=slink ! LIBER=oml ! ! #----------------CPU OPTIONS-------------------------- ! ! CPU=68060 ! ! #----------------FPU OPTIONS-------------------------- ! ! MATH=8 ! MATHLIB=LIB:scm881.lib ! ! #----------------COMPILER OPTIONS--------------------- ! ! IGNORE= IGNORE=85 IGNORE=154 IGNORE=161 IGNORE=100 ! ! OPTIMIZE=optimize optimizetime optglobal optimizerdepth=100 optimizerpeephole optloop OPTSCHED optimizerinlocal optimizerrecurdepth=100 ! # optimizerinline optimizercomplexity=100 ! ! OPT= $(OPTIMIZE) CPU=$(CPU) math=$(MATH) NOSTACKCHECK VERBOSE \ ! MAPHUNK NOVERSION NOICONS nodebug \ ! DEFINE SILENT \ ! parm=reg \ ! DEFINE __USE_SYSBASE ! ! ! SOPT= $(OPT) $(IGNORE) \ ! DEFINE AMIGA_SKIP_SEG \ ! DEFINE ATOMIC_UNCOLLECTABLE \ ! DEFINE GC_AMIGA_FASTALLOC \ ! DEFINE GC_AMIGA_RETRY \ ! DEFINE GC_AMIGA_PRINTSTATS \ ! DEFINE GC_AMIGA_GC ! ! ! #DEFINE ALL_INTERIOR_POINTERS \ ! ! ! SCOPT= $(SOPT) define GC_AMIGA_MAKINGLIB ! ! CSCOPT= $(OPT) DEFINE AMIGA IGNORE=100 IGNORE=161 ! ! #------------------LINKING---------------------------- ! ! ! all: gctest setjmp_t cord/cordtest ! ! clean: ! delete *.lib gctest setjmp_t *.o *.lnk cord/*.o cord/*.lib cord/*.lnk cord/cordtest ! smake ! ! test: setjmp_t gctest cord/cordtest ! setjmp_t ! gctest ! cord/cordtest ! ! gctest: gc$(CPU).lib GCAmigaOS$(CPU).lib test.o ! $(LINKER) LIB:c.o test.o TO gctest LIB gc$(CPU).lib LIB:sc.lib $(MATHLIB) ! ! setjmp_t: setjmp_t.o gc.h ! $(LINKER) LIB:c.o setjmp_t.o to setjmp_t lib LIB:sc.lib ! ! cord/cordtest: cord/cordtest.o cord/cord$(CPU).lib gc$(CPU).lib ! slink LIB:c.o cord/cordtest.o LIB $(MATHLIB) gc$(CPU).lib cord/cord$(CPU).lib LIB:sc.lib TO cord/cordtest ! ! ! #------------------LIBBING---------------------------- ! ! OBJS= alloc.o reclaim.o allchblk.o misc.o mach_dep.o os_dep.o mark_rts.o headers.o mark.o obj_map.o blacklst.o finalize.o new_hblk.o real_malloc.o dyn_load.o dbg_mlc.o malloc.o stubborn.o checksums.o typd_mlc.o ptr_chck.o mallocx.o ! ! gc$(CPU).lib: $(OBJS) ! $(LIBER) gc$(CPU).lib r $(OBJS) ! ! ! COBJS = cord/cordbscs.o cord/cordprnt.o cord/cordxtra.o ! ! cord/cord$(CPU).lib: $(COBJS) ! oml cord/cord$(CPU).lib r $(COBJS) ! ! #------------------COMPILING-------------------------- ! ! INC= gc_private.h gc_hdrs.h gc.h gcconfig.h alloc.o : alloc.c $(INC) + $(CC) alloc.c $(SCOPT) ignore=7 + reclaim.o : reclaim.c $(INC) + $(CC) reclaim.c $(SCOPT) + allchblk.o : allchblk.c $(INC) + $(CC) allchblk.c $(SCOPT) + misc.o : misc.c $(INC) ! $(CC) misc.c $(SCOPT) ! ! os_dep.o : os_dep.c $(INC) AmigaOS.c ! $(CC) os_dep.c $(SCOPT) ! mark_rts.o : mark_rts.c $(INC) + $(CC) mark_rts.c $(SCOPT) + headers.o : headers.c $(INC) + $(CC) headers.c $(SCOPT) + mark.o : mark.c $(INC) + $(CC) mark.c $(SCOPT) + obj_map.o : obj_map.c $(INC) + $(CC) obj_map.c $(SCOPT) + blacklst.o : blacklst.c $(INC) + $(CC) blacklst.c $(SCOPT) + finalize.o : finalize.c $(INC) ! $(CC) finalize.c $(SCOPT) noopt #Could sas/c still have problems with this one? Gctest sometimes fails to finalize all. ! new_hblk.o : new_hblk.c $(INC) + $(CC) new_hblk.c $(SCOPT) + real_malloc.o : real_malloc.c $(INC) + $(CC) real_malloc.c $(SCOPT) + dyn_load.o : dyn_load.c $(INC) + $(CC) dyn_load.c $(SCOPT) + dbg_mlc.o : dbg_mlc.c $(INC) + $(CC) dbg_mlc.c $(SCOPT) + malloc.o : malloc.c $(INC) ! $(CC) malloc.c $(SCOPT) ! ! mallocx.o : mallocx.c $(INC) ! $(CC) mallocx.c $(SCOPT) ! stubborn.o : stubborn.c $(INC) + $(CC) stubborn.c $(SCOPT) + checksums.o : checksums.c $(INC) + $(CC) checksums.c $(SCOPT) + typd_mlc.o: typd_mlc.c $(INC) + $(CC) typd_mlc.c $(SCOPT) + mach_dep.o : mach_dep.c $(INC) + $(CC) mach_dep.c $(SCOPT) + ptr_chck.o: ptr_chck.c $(INC) + $(CC) ptr_chck.c $(SCOPT) + test.o : test.c $(INC) + $(CC) test.c $(SOPT) ! setjmp_t: setjmp_t.c gc.h ! $(CC) setjmp_t.c $(SOPT) ! # cords: ! ! cord/cordbscs.o: cord/cordbscs.c ! sc cord/cordbscs.c $(CSCOPT) ! ! cord/cordprnt.o: cord/cordprnt.c ! sc cord/cordprnt.c $(CSCOPT) ! ! cord/cordxtra.o: cord/cordxtra.c ! sc cord/cordxtra.c $(CSCOPT) ! ! cord/cordtest.o: cord/cordtest.c ! sc cord/cordtest.c $(CSCOPT) diff -Nrc3pad gcc-3.0.4/boehm-gc/WCC_MAKEFILE gcc-3.1/boehm-gc/WCC_MAKEFILE *** gcc-3.0.4/boehm-gc/WCC_MAKEFILE Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/WCC_MAKEFILE Fri Aug 17 18:30:45 2001 *************** test_cpp.exe: test_cpp.obj gc.lib *** 169,177 **** gc_cpp.obj: gc_cpp.cc .AUTODEPEND $(CXX) $(TEST_CXXFLAGS) -iinclude $*.cc ! test.obj: test.c .AUTODEPEND $(CC) $(TEST_CFLAGS) $*.c ! test_cpp.obj: test_cpp.cc .AUTODEPEND $(CXX) $(TEST_CXXFLAGS) -iinclude $*.cc --- 169,177 ---- gc_cpp.obj: gc_cpp.cc .AUTODEPEND $(CXX) $(TEST_CXXFLAGS) -iinclude $*.cc ! test.obj: tests\test.c .AUTODEPEND $(CC) $(TEST_CFLAGS) $*.c ! test_cpp.obj: tests\test_cpp.cc .AUTODEPEND $(CXX) $(TEST_CXXFLAGS) -iinclude $*.cc diff -Nrc3pad gcc-3.0.4/boehm-gc/acinclude.m4 gcc-3.1/boehm-gc/acinclude.m4 *** gcc-3.0.4/boehm-gc/acinclude.m4 Tue Jul 3 22:29:46 2001 --- gcc-3.1/boehm-gc/acinclude.m4 Tue Oct 16 09:01:35 2001 *************** *** 1,10 **** # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We # are probably using a cross compiler, which will not be able to fully # link an executable. This should really be fixed in autoconf # itself. ! AC_DEFUN(BOEHM_CONFIGURE, [ dnl Default to --enable-multilib AC_ARG_ENABLE(multilib, --- 1,23 ---- + # Copyright (c) 1999-2001 by Red Hat, Inc. All rights reserved. + # + # THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + # OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + # + # Permission is hereby granted to use or copy this program + # for any purpose, provided the above notices are retained on all copies. + # Permission to modify the code and to distribute modified code is granted, + # provided the above notices are retained, and a notice that the code was + # modified is included with the above copyright notice. + # + # Original author: Tom Tromey + # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We # are probably using a cross compiler, which will not be able to fully # link an executable. This should really be fixed in autoconf # itself. ! AC_DEFUN(GC_CONFIGURE, [ dnl Default to --enable-multilib AC_ARG_ENABLE(multilib, *************** AC_ARG_ENABLE(multilib, *** 18,34 **** dnl We may get other options which we don't document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir if test "[$]{srcdir}" = "."; then ! if test "[$]{with_target_subdir}" != "."; then ! boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1" else ! boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}$1" fi else ! boehm_gc_basedir="[$]{srcdir}/$1" fi ! AC_SUBST(boehm_gc_basedir) ! AC_CONFIG_AUX_DIR($boehm_gc_basedir/..) if :; then :; else # This overrides the previous occurrence for automake, but not for # autoconf, which is exactly what we want. --- 31,48 ---- dnl We may get other options which we don't document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir + dnl I needed to add the -n test to allow configuration in src directory - HB if test "[$]{srcdir}" = "."; then ! if test "[$]{with_target_subdir}" != "." -a -n "[$]{with_target_subdir}"; then ! gc_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1" else ! gc_basedir="[$]{srcdir}/[$]{with_multisrctop}$1" fi else ! gc_basedir="[$]{srcdir}/$1" fi ! AC_SUBST(gc_basedir) ! AC_CONFIG_AUX_DIR($gc_basedir/..) if :; then :; else # This overrides the previous occurrence for automake, but not for # autoconf, which is exactly what we want. *************** AC_CANONICAL_SYSTEM *** 41,47 **** mkinstalldirs="`cd $ac_aux_dir && pwd`/mkinstalldirs" AC_SUBST(mkinstalldirs) ! AM_INIT_AUTOMAKE(boehm-gc, 5.1, no-define) # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We --- 55,61 ---- mkinstalldirs="`cd $ac_aux_dir && pwd`/mkinstalldirs" AC_SUBST(mkinstalldirs) ! AM_INIT_AUTOMAKE(gc, 6.1a1, no-define) # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We *************** AM_MAINTAINER_MODE *** 141,167 **** # automake happy, but we don't execute it, since we don't care about # the result. if false; then AC_EXEEXT fi . [$]{srcdir}/configure.host ! case [$]{boehm_gc_basedir} in ! /* | [A-Za-z]:[/\\]*) boehm_gc_flagbasedir=[$]{boehm_gc_basedir} ;; ! *) boehm_gc_flagbasedir='[$](top_builddir)/'[$]{boehm_gc_basedir} ;; esac ! boehm_gc_cflags="[$]{boehm_gc_cflags} -I"'[$](top_builddir)'"/$1/targ-include -I[$]{boehm_gc_flagbasedir}/libc/include" case "${host}" in *-*-cygwin32*) ! boehm_gc_cflags="[$]{boehm_gc_cflags} -I[$]{boehm_gc_flagbasedir}/../winsup/include" ;; esac ! boehm_gc_cflags="[$]{boehm_gc_cflags} -fno-builtin" ! BOEHM_GC_CFLAGS=${boehm_gc_cflags} ! AC_SUBST(BOEHM_GC_CFLAGS) ])) )))) --- 155,185 ---- # automake happy, but we don't execute it, since we don't care about # the result. if false; then + # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands + # to nothing, so nothing would remain between `then' and `fi' if it + # were not for the `:' below. + : AC_EXEEXT fi . [$]{srcdir}/configure.host ! case [$]{gc_basedir} in ! /* | [A-Za-z]:[/\\]*) gc_flagbasedir=[$]{gc_basedir} ;; ! *) gc_flagbasedir='[$](top_builddir)/'[$]{gc_basedir} ;; esac ! gc_cflags="[$]{gc_cflags} -I"'[$](top_builddir)'"/$1/targ-include -I[$]{gc_flagbasedir}/libc/include" case "${host}" in *-*-cygwin32*) ! gc_cflags="[$]{gc_cflags} -I[$]{gc_flagbasedir}/../winsup/include" ;; esac ! dnl gc_cflags="[$]{gc_cflags} -fno-builtin" ! GC_CFLAGS=${gc_cflags} ! AC_SUBST(GC_CFLAGS) ])) )))) diff -Nrc3pad gcc-3.0.4/boehm-gc/aclocal.m4 gcc-3.1/boehm-gc/aclocal.m4 *** gcc-3.0.4/boehm-gc/aclocal.m4 Wed Feb 20 19:40:48 2002 --- gcc-3.1/boehm-gc/aclocal.m4 Wed May 15 02:40:18 2002 *************** dnl but WITHOUT ANY WARRANTY, to the ext *** 10,22 **** dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A dnl PARTICULAR PURPOSE. # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We # are probably using a cross compiler, which will not be able to fully # link an executable. This should really be fixed in autoconf # itself. ! AC_DEFUN(BOEHM_CONFIGURE, [ dnl Default to --enable-multilib AC_ARG_ENABLE(multilib, --- 10,35 ---- dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A dnl PARTICULAR PURPOSE. + # Copyright (c) 1999-2001 by Red Hat, Inc. All rights reserved. + # + # THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + # OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + # + # Permission is hereby granted to use or copy this program + # for any purpose, provided the above notices are retained on all copies. + # Permission to modify the code and to distribute modified code is granted, + # provided the above notices are retained, and a notice that the code was + # modified is included with the above copyright notice. + # + # Original author: Tom Tromey + # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We # are probably using a cross compiler, which will not be able to fully # link an executable. This should really be fixed in autoconf # itself. ! AC_DEFUN(GC_CONFIGURE, [ dnl Default to --enable-multilib AC_ARG_ENABLE(multilib, *************** AC_ARG_ENABLE(multilib, *** 30,46 **** dnl We may get other options which we don't document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir if test "[$]{srcdir}" = "."; then ! if test "[$]{with_target_subdir}" != "."; then ! boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1" else ! boehm_gc_basedir="[$]{srcdir}/[$]{with_multisrctop}$1" fi else ! boehm_gc_basedir="[$]{srcdir}/$1" fi ! AC_SUBST(boehm_gc_basedir) ! AC_CONFIG_AUX_DIR($boehm_gc_basedir/..) if :; then :; else # This overrides the previous occurrence for automake, but not for # autoconf, which is exactly what we want. --- 43,60 ---- dnl We may get other options which we don't document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir + dnl I needed to add the -n test to allow configuration in src directory - HB if test "[$]{srcdir}" = "."; then ! if test "[$]{with_target_subdir}" != "." -a -n "[$]{with_target_subdir}"; then ! gc_basedir="[$]{srcdir}/[$]{with_multisrctop}../$1" else ! gc_basedir="[$]{srcdir}/[$]{with_multisrctop}$1" fi else ! gc_basedir="[$]{srcdir}/$1" fi ! AC_SUBST(gc_basedir) ! AC_CONFIG_AUX_DIR($gc_basedir/..) if :; then :; else # This overrides the previous occurrence for automake, but not for # autoconf, which is exactly what we want. *************** AC_CANONICAL_SYSTEM *** 53,59 **** mkinstalldirs="`cd $ac_aux_dir && pwd`/mkinstalldirs" AC_SUBST(mkinstalldirs) ! AM_INIT_AUTOMAKE(boehm-gc, 5.1, no-define) # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We --- 67,73 ---- mkinstalldirs="`cd $ac_aux_dir && pwd`/mkinstalldirs" AC_SUBST(mkinstalldirs) ! AM_INIT_AUTOMAKE(gc, 6.0, no-define) # FIXME: We temporarily define our own version of AC_PROG_CC. This is # copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We *************** AM_MAINTAINER_MODE *** 153,179 **** # automake happy, but we don't execute it, since we don't care about # the result. if false; then AC_EXEEXT fi . [$]{srcdir}/configure.host ! case [$]{boehm_gc_basedir} in ! /* | [A-Za-z]:[/\\]*) boehm_gc_flagbasedir=[$]{boehm_gc_basedir} ;; ! *) boehm_gc_flagbasedir='[$](top_builddir)/'[$]{boehm_gc_basedir} ;; esac ! boehm_gc_cflags="[$]{boehm_gc_cflags} -I"'[$](top_builddir)'"/$1/targ-include -I[$]{boehm_gc_flagbasedir}/libc/include" case "${host}" in *-*-cygwin32*) ! boehm_gc_cflags="[$]{boehm_gc_cflags} -I[$]{boehm_gc_flagbasedir}/../winsup/include" ;; esac ! boehm_gc_cflags="[$]{boehm_gc_cflags} -fno-builtin" ! BOEHM_GC_CFLAGS=${boehm_gc_cflags} ! AC_SUBST(BOEHM_GC_CFLAGS) ])) )))) --- 167,197 ---- # automake happy, but we don't execute it, since we don't care about # the result. if false; then + # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands + # to nothing, so nothing would remain between `then' and `fi' if it + # were not for the `:' below. + : AC_EXEEXT fi . [$]{srcdir}/configure.host ! case [$]{gc_basedir} in ! /* | [A-Za-z]:[/\\]*) gc_flagbasedir=[$]{gc_basedir} ;; ! *) gc_flagbasedir='[$](top_builddir)/'[$]{gc_basedir} ;; esac ! gc_cflags="[$]{gc_cflags} -I"'[$](top_builddir)'"/$1/targ-include -I[$]{gc_flagbasedir}/libc/include" case "${host}" in *-*-cygwin32*) ! gc_cflags="[$]{gc_cflags} -I[$]{gc_flagbasedir}/../winsup/include" ;; esac ! dnl gc_cflags="[$]{gc_cflags} -fno-builtin" ! GC_CFLAGS=${gc_cflags} ! AC_SUBST(GC_CFLAGS) ])) )))) diff -Nrc3pad gcc-3.0.4/boehm-gc/add_gc_prefix.c gcc-3.1/boehm-gc/add_gc_prefix.c *** gcc-3.0.4/boehm-gc/add_gc_prefix.c Wed Jun 30 12:43:06 1999 --- gcc-3.1/boehm-gc/add_gc_prefix.c Sat Aug 18 01:04:42 2001 *************** *** 1,4 **** --- 1,5 ---- # include + # include "version.h" int main(argc, argv, envp) int argc; *************** char ** envp; *** 8,14 **** int i; for (i = 1; i < argc; i++) { ! printf("gc/%s ", argv[i]); } return(0); } --- 9,20 ---- int i; for (i = 1; i < argc; i++) { ! if (GC_ALPHA_VERSION == GC_NOT_ALPHA) { ! printf("gc%d.%d/%s ", GC_VERSION_MAJOR, GC_VERSION_MINOR, argv[i]); ! } else { ! printf("gc%d.%dalpha%d/%s ", GC_VERSION_MAJOR, ! GC_VERSION_MINOR, GC_ALPHA_VERSION, argv[i]); ! } } return(0); } diff -Nrc3pad gcc-3.0.4/boehm-gc/allchblk.c gcc-3.1/boehm-gc/allchblk.c *** gcc-3.0.4/boehm-gc/allchblk.c Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/allchblk.c Tue Apr 9 00:03:24 2002 *************** *** 14,23 **** * modified is included with the above copyright notice. */ ! #define DEBUG ! #undef DEBUG #include ! #include "gc_priv.h" GC_bool GC_use_entire_heap = 0; --- 14,22 ---- * modified is included with the above copyright notice. */ ! /* #define DEBUG */ #include ! #include "private/gc_priv.h" GC_bool GC_use_entire_heap = 0; *************** GC_bool GC_use_entire_heap = 0; *** 47,52 **** --- 46,80 ---- struct hblk * GC_hblkfreelist[N_HBLK_FLS+1] = { 0 }; + #ifndef USE_MUNMAP + word GC_free_bytes[N_HBLK_FLS+1] = { 0 }; + /* Number of free bytes on each list. */ + + /* Is bytes + the number of free bytes on lists n .. N_HBLK_FLS */ + /* > GC_max_large_allocd_bytes? */ + GC_bool GC_enough_large_bytes_left(bytes,n) + word bytes; + int n; + { + int i; + for (i = N_HBLK_FLS; i >= n; --i) { + bytes += GC_free_bytes[i]; + if (bytes > GC_max_large_allocd_bytes) return TRUE; + } + return FALSE; + } + + # define INCR_FREE_BYTES(n, b) GC_free_bytes[n] += (b); + + # define FREE_ASSERT(e) GC_ASSERT(e) + + #else /* USE_MUNMAP */ + + # define INCR_FREE_BYTES(n, b) + # define FREE_ASSERT(e) + + #endif /* USE_MUNMAP */ + /* Map a number of blocks to the appropriate large block free list index. */ int GC_hblk_fl_from_blocks(blocks_needed) word blocks_needed; *************** word blocks_needed; *** 58,64 **** } - # define HBLK_IS_FREE(hdr) ((hdr) -> hb_map == GC_invalid_map) # define PHDR(hhdr) HDR(hhdr -> hb_prev) # define NHDR(hhdr) HDR(hhdr -> hb_next) --- 86,91 ---- *************** void GC_print_hblkfreelist() *** 79,85 **** for (i = 0; i <= N_HBLK_FLS; ++i) { h = GC_hblkfreelist[i]; ! if (0 != h) GC_printf1("Free list %ld:\n", (unsigned long)i); while (h != 0) { hhdr = HDR(h); sz = hhdr -> hb_sz; --- 106,119 ---- for (i = 0; i <= N_HBLK_FLS; ++i) { h = GC_hblkfreelist[i]; ! # ifdef USE_MUNMAP ! if (0 != h) GC_printf1("Free list %ld (Total size %ld):\n", ! (unsigned long)i); ! # else ! if (0 != h) GC_printf2("Free list %ld (Total size %ld):\n", ! (unsigned long)i, ! (unsigned long)GC_free_bytes[i]); ! # endif while (h != 0) { hhdr = HDR(h); sz = hhdr -> hb_sz; *************** void GC_remove_from_fl(hhdr, n) *** 219,232 **** hdr * hhdr; int n; { GC_ASSERT(((hhdr -> hb_sz) & (HBLKSIZE-1)) == 0); if (hhdr -> hb_prev == 0) { ! int index; ! if (FL_UNKNOWN == n) { index = GC_hblk_fl_from_blocks(divHBLKSZ(hhdr -> hb_sz)); ! } else { index = n; ! } GC_ASSERT(HDR(GC_hblkfreelist[index]) == hhdr); GC_hblkfreelist[index] = hhdr -> hb_next; } else { --- 253,277 ---- hdr * hhdr; int n; { + int index; + GC_ASSERT(((hhdr -> hb_sz) & (HBLKSIZE-1)) == 0); + # ifndef USE_MUNMAP + /* We always need index to mainatin free counts. */ + if (FL_UNKNOWN == n) { + index = GC_hblk_fl_from_blocks(divHBLKSZ(hhdr -> hb_sz)); + } else { + index = n; + } + # endif if (hhdr -> hb_prev == 0) { ! # ifdef USE_MUNMAP ! if (FL_UNKNOWN == n) { index = GC_hblk_fl_from_blocks(divHBLKSZ(hhdr -> hb_sz)); ! } else { index = n; ! } ! # endif GC_ASSERT(HDR(GC_hblkfreelist[index]) == hhdr); GC_hblkfreelist[index] = hhdr -> hb_next; } else { *************** int n; *** 234,239 **** --- 279,286 ---- GET_HDR(hhdr -> hb_prev, phdr); phdr -> hb_next = hhdr -> hb_next; } + INCR_FREE_BYTES(index, - (signed_word)(hhdr -> hb_sz)); + FREE_ASSERT(GC_free_bytes[index] >= 0); if (0 != hhdr -> hb_next) { hdr * nhdr; GC_ASSERT(!IS_FORWARDING_ADDR_OR_NIL(NHDR(hhdr))); *************** hdr * hhdr; *** 294,299 **** --- 341,348 ---- # endif GC_ASSERT(((hhdr -> hb_sz) & (HBLKSIZE-1)) == 0); GC_hblkfreelist[index] = h; + INCR_FREE_BYTES(index, hhdr -> hb_sz); + FREE_ASSERT(GC_free_bytes[index] <= GC_large_free_bytes) hhdr -> hb_next = second; hhdr -> hb_prev = 0; if (0 != second) { *************** int index; *** 419,425 **** rest_hdr -> hb_sz = total_size - bytes; rest_hdr -> hb_flags = 0; # ifdef GC_ASSERTIONS ! // Mark h not free, to avoid assertion about adjacent free blocks. hhdr -> hb_map = 0; # endif GC_add_to_fl(rest, rest_hdr); --- 468,474 ---- rest_hdr -> hb_sz = total_size - bytes; rest_hdr -> hb_flags = 0; # ifdef GC_ASSERTIONS ! /* Mark h not free, to avoid assertion about adjacent free blocks. */ hhdr -> hb_map = 0; # endif GC_add_to_fl(rest, rest_hdr); *************** int index; /* Index of free list */ *** 463,468 **** --- 512,519 ---- if (0 != next) { HDR(next) -> hb_prev = n; } + INCR_FREE_BYTES(index, -(signed_word)h_size); + FREE_ASSERT(GC_free_bytes[index] > 0); # ifdef GC_ASSERTIONS nhdr -> hb_map = 0; /* Don't fail test for consecutive */ /* free blocks in GC_add_to_fl. */ *************** struct hblk * GC_allochblk_nth(); *** 484,503 **** * NOTE: We set obj_map field in header correctly. * Caller is responsible for building an object freelist in block. * ! * We clear the block if it is destined for large objects, and if ! * kind requires that newly allocated objects be cleared. */ struct hblk * GC_allochblk(sz, kind, flags) word sz; int kind; ! unsigned char flags; /* IGNORE_OFF_PAGE or 0 */ { ! int start_list = GC_hblk_fl_from_blocks(OBJ_SZ_TO_BLOCKS(sz)); int i; for (i = start_list; i <= N_HBLK_FLS; ++i) { struct hblk * result = GC_allochblk_nth(sz, kind, flags, i); ! if (0 != result) return result; } return 0; } --- 535,557 ---- * NOTE: We set obj_map field in header correctly. * Caller is responsible for building an object freelist in block. * ! * Unlike older versions of the collectors, the client is responsible ! * for clearing the block, if necessary. */ struct hblk * GC_allochblk(sz, kind, flags) word sz; int kind; ! unsigned flags; /* IGNORE_OFF_PAGE or 0 */ { ! word blocks = OBJ_SZ_TO_BLOCKS(sz); ! int start_list = GC_hblk_fl_from_blocks(blocks); int i; for (i = start_list; i <= N_HBLK_FLS; ++i) { struct hblk * result = GC_allochblk_nth(sz, kind, flags, i); ! if (0 != result) { ! return result; ! } } return 0; } *************** int n; *** 526,537 **** GET_HDR(hbp, hhdr); size_avail = hhdr->hb_sz; if (size_avail < size_needed) continue; ! if (!GC_use_entire_heap) { ! if (size_avail != size_needed ! && USED_HEAP_SIZE >= GC_requested_heapsize ! && !GC_incremental && GC_should_collect()) { continue; ! } } /* If the next heap block is obviously better, go on. */ /* This prevents us from disassembling a single large block */ --- 580,601 ---- GET_HDR(hbp, hhdr); size_avail = hhdr->hb_sz; if (size_avail < size_needed) continue; ! if (!GC_use_entire_heap ! && size_avail != size_needed ! && USED_HEAP_SIZE >= GC_requested_heapsize ! && !GC_incremental && GC_should_collect()) { ! # ifdef USE_MUNMAP continue; ! # else ! /* If we enough large blocks left to cover any */ ! /* previous request for large blocks, we go ahead */ ! /* and split. Assuming a steady state, that should */ ! /* be safe. It means that we can use the full */ ! /* heap if we allocate only small objects. */ ! if (!GC_enough_large_bytes_left(GC_large_allocd_bytes, n)) { ! continue; ! } ! # endif /* !USE_MUNMAP */ } /* If the next heap block is obviously better, go on. */ /* This prevents us from disassembling a single large block */ *************** int n; *** 562,568 **** while ((ptr_t)lasthbp <= search_end && (thishbp = GC_is_black_listed(lasthbp, ! (word)eff_size_needed))) { lasthbp = thishbp; } size_avail -= (ptr_t)lasthbp - (ptr_t)hbp; --- 626,633 ---- while ((ptr_t)lasthbp <= search_end && (thishbp = GC_is_black_listed(lasthbp, ! (word)eff_size_needed)) ! != 0) { lasthbp = thishbp; } size_avail -= (ptr_t)lasthbp - (ptr_t)hbp; *************** int n; *** 573,579 **** /* Make sure it's mapped before we mangle it. */ # ifdef USE_MUNMAP if (!IS_MAPPED(hhdr)) { ! GC_remap((ptr_t)hbp, size_avail); hhdr -> hb_flags &= ~WAS_UNMAPPED; } # endif --- 638,644 ---- /* Make sure it's mapped before we mangle it. */ # ifdef USE_MUNMAP if (!IS_MAPPED(hhdr)) { ! GC_remap((ptr_t)hbp, hhdr -> hb_sz); hhdr -> hb_flags &= ~WAS_UNMAPPED; } # endif *************** int n; *** 589,596 **** && orig_avail - size_needed > (signed_word)BL_LIMIT) { /* Punt, since anything else risks unreasonable heap growth. */ ! WARN("Needed to allocate blacklisted block at 0x%lx\n", ! (word)hbp); size_avail = orig_avail; } else if (size_avail == 0 && size_needed == HBLKSIZE && IS_MAPPED(hhdr)) { --- 654,667 ---- && orig_avail - size_needed > (signed_word)BL_LIMIT) { /* Punt, since anything else risks unreasonable heap growth. */ ! if (++GC_large_alloc_warn_suppressed ! >= GC_large_alloc_warn_interval) { ! WARN("Repeated allocation of very large block " ! "(appr. size %ld):\n" ! "\tMay lead to memory leak and poor performance.\n", ! size_needed); ! GC_large_alloc_warn_suppressed = 0; ! } size_avail = orig_avail; } else if (size_avail == 0 && size_needed == HBLKSIZE && IS_MAPPED(hhdr)) { *************** int n; *** 618,627 **** if (h == hbp || 0 != (hhdr = GC_install_header(h))) { (void) setup_header( hhdr, ! BYTES_TO_WORDS(HBLKSIZE - HDR_BYTES), PTRFREE, 0); /* Cant fail */ if (GC_debugging_started) { ! BZERO(h + HDR_BYTES, HBLKSIZE - HDR_BYTES); } } } --- 689,698 ---- if (h == hbp || 0 != (hhdr = GC_install_header(h))) { (void) setup_header( hhdr, ! BYTES_TO_WORDS(HBLKSIZE), PTRFREE, 0); /* Cant fail */ if (GC_debugging_started) { ! BZERO(h, HBLKSIZE); } } } *************** int n; *** 638,644 **** if( size_avail >= size_needed ) { # ifdef USE_MUNMAP if (!IS_MAPPED(hhdr)) { ! GC_remap((ptr_t)hbp, size_avail); hhdr -> hb_flags &= ~WAS_UNMAPPED; } # endif --- 709,715 ---- if( size_avail >= size_needed ) { # ifdef USE_MUNMAP if (!IS_MAPPED(hhdr)) { ! GC_remap((ptr_t)hbp, hhdr -> hb_sz); hhdr -> hb_flags &= ~WAS_UNMAPPED; } # endif *************** int n; *** 651,659 **** if (0 == hbp) return 0; - /* Notify virtual dirty bit implementation that we are about to write. */ - GC_write_hint(hbp); - /* Add it to map of valid blocks */ if (!GC_install_counts(hbp, (word)size_needed)) return(0); /* This leaks memory under very rare conditions. */ --- 722,727 ---- *************** int n; *** 663,675 **** GC_remove_counts(hbp, (word)size_needed); return(0); /* ditto */ } - - /* Clear block if necessary */ - if (GC_debugging_started - || sz > MAXOBJSZ && GC_obj_kinds[kind].ok_init) { - BZERO(hbp + HDR_BYTES, size_needed - HDR_BYTES); - } /* We just successfully allocated a block. Restart count of */ /* consecutive failures. */ { --- 731,742 ---- GC_remove_counts(hbp, (word)size_needed); return(0); /* ditto */ } + /* Notify virtual dirty bit implementation that we are about to write. */ + /* Ensure that pointerfree objects are not protected if it's avoidable. */ + GC_remove_protection(hbp, divHBLKSZ(size_needed), + (hhdr -> hb_descr == 0) /* pointer-free */); + /* We just successfully allocated a block. Restart count of */ /* consecutive failures. */ { *************** signed_word size; *** 712,717 **** --- 779,785 ---- if (HBLK_IS_FREE(hhdr)) { GC_printf1("Duplicate large block deallocation of 0x%lx\n", (unsigned long) hbp); + ABORT("Duplicate large block deallocation"); } GC_ASSERT(IS_MAPPED(hhdr)); diff -Nrc3pad gcc-3.0.4/boehm-gc/alloc.c gcc-3.1/boehm-gc/alloc.c *** gcc-3.0.4/boehm-gc/alloc.c Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/alloc.c Tue Feb 12 04:37:53 2002 *************** *** 16,25 **** */ ! # include "gc_priv.h" # include ! # ifndef MACOS # include # include # endif --- 16,25 ---- */ ! # include "private/gc_priv.h" # include ! # if !defined(MACOS) && !defined(MSWINCE) # include # include # endif *************** word GC_non_gc_bytes = 0; /* Number of *** 60,68 **** word GC_gc_no = 0; #ifndef SMALL_CONFIG ! int GC_incremental = 0; /* By default, stop the world. */ #endif int GC_full_freq = 19; /* Every 20th collection is a full */ /* collection, whether we need it */ /* or not. */ --- 60,70 ---- word GC_gc_no = 0; #ifndef SMALL_CONFIG ! int GC_incremental = 0; /* By default, stop the world. */ #endif + int GC_parallel = FALSE; /* By default, parallel GC is off. */ + int GC_full_freq = 19; /* Every 20th collection is a full */ /* collection, whether we need it */ /* or not. */ *************** char * GC_copyright[] = *** 76,81 **** --- 78,84 ---- {"Copyright 1988,1989 Hans-J. Boehm and Alan J. Demers ", "Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. ", "Copyright (c) 1996-1998 by Silicon Graphics. All rights reserved. ", + "Copyright (c) 1999-2001 by Hewlett-Packard Company. All rights reserved. ", "THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY", " EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK.", "See source code for details." }; *************** word GC_free_space_divisor = 3; *** 94,108 **** extern GC_bool GC_collection_in_progress(); /* Collection is in progress, or was abandoned. */ int GC_never_stop_func GC_PROTO((void)) { return(0); } CLOCK_TYPE GC_start_time; /* Time at which we stopped world. */ /* used only in GC_timeout_stop_func. */ int GC_n_attempts = 0; /* Number of attempts at finishing */ ! /* collection within TIME_LIMIT */ ! #ifdef SMALL_CONFIG # define GC_timeout_stop_func GC_never_stop_func #else int GC_timeout_stop_func GC_PROTO((void)) --- 97,115 ---- extern GC_bool GC_collection_in_progress(); /* Collection is in progress, or was abandoned. */ + extern GC_bool GC_print_back_height; + int GC_never_stop_func GC_PROTO((void)) { return(0); } + unsigned long GC_time_limit = TIME_LIMIT; + CLOCK_TYPE GC_start_time; /* Time at which we stopped world. */ /* used only in GC_timeout_stop_func. */ int GC_n_attempts = 0; /* Number of attempts at finishing */ ! /* collection within GC_time_limit. */ ! #if defined(SMALL_CONFIG) || defined(NO_CLOCK) # define GC_timeout_stop_func GC_never_stop_func #else int GC_timeout_stop_func GC_PROTO((void)) *************** int GC_n_attempts = 0; /* Number of att *** 115,125 **** #ifndef NO_CLOCK GET_TIME(current_time); time_diff = MS_TIME_DIFF(current_time,GC_start_time); ! if (time_diff >= TIME_LIMIT) { ! # ifdef PRINTSTATS GC_printf0("Abandoning stopped marking after "); GC_printf1("%lu msecs", (unsigned long)time_diff); GC_printf1("(attempt %d)\n", (unsigned long) GC_n_attempts); # endif return(1); } --- 122,134 ---- #ifndef NO_CLOCK GET_TIME(current_time); time_diff = MS_TIME_DIFF(current_time,GC_start_time); ! if (time_diff >= GC_time_limit) { ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf0("Abandoning stopped marking after "); GC_printf1("%lu msecs", (unsigned long)time_diff); GC_printf1("(attempt %d)\n", (unsigned long) GC_n_attempts); + } # endif return(1); } *************** GC_bool GC_should_collect() *** 222,228 **** void GC_notify_full_gc() { ! if (GC_start_call_back != (void (*)())0) { (*GC_start_call_back)(); } } --- 231,237 ---- void GC_notify_full_gc() { ! if (GC_start_call_back != (void (*) GC_PROTO((void)))0) { (*GC_start_call_back)(); } } *************** void GC_maybe_gc() *** 245,256 **** GC_gcollect_inner(); n_partial_gcs = 0; return; ! } else if (GC_need_full_gc || n_partial_gcs >= GC_full_freq) { ! # ifdef PRINTSTATS ! GC_printf2( ! "***>Full mark for collection %lu after %ld allocd bytes\n", ! (unsigned long) GC_gc_no+1, ! (long)WORDS_TO_BYTES(GC_words_allocd)); # endif GC_promote_black_lists(); (void)GC_reclaim_all((GC_stop_func)0, TRUE); --- 254,271 ---- GC_gcollect_inner(); n_partial_gcs = 0; return; ! } else { ! # ifdef PARALLEL_MARK ! GC_wait_for_reclaim(); ! # endif ! if (GC_need_full_gc || n_partial_gcs >= GC_full_freq) { ! # ifdef CONDPRINT ! if (GC_print_stats) { ! GC_printf2( ! "***>Full mark for collection %lu after %ld allocd bytes\n", ! (unsigned long) GC_gc_no+1, ! (long)WORDS_TO_BYTES(GC_words_allocd)); ! } # endif GC_promote_black_lists(); (void)GC_reclaim_all((GC_stop_func)0, TRUE); *************** void GC_maybe_gc() *** 258,273 **** n_partial_gcs = 0; GC_notify_full_gc(); GC_is_full_gc = TRUE; ! } else { n_partial_gcs++; ! } /* We try to mark with the world stopped. */ /* If we run out of time, this turns into */ /* incremental marking. */ ! #ifndef NO_CLOCK ! GET_TIME(GC_start_time); ! #endif ! if (GC_stopped_mark(GC_timeout_stop_func)) { # ifdef SAVE_CALL_CHAIN GC_save_callers(GC_last_stack); # endif --- 273,290 ---- n_partial_gcs = 0; GC_notify_full_gc(); GC_is_full_gc = TRUE; ! } else { n_partial_gcs++; ! } ! } /* We try to mark with the world stopped. */ /* If we run out of time, this turns into */ /* incremental marking. */ ! # ifndef NO_CLOCK ! if (GC_time_limit != GC_TIME_UNLIMITED) { GET_TIME(GC_start_time); } ! # endif ! if (GC_stopped_mark(GC_time_limit == GC_TIME_UNLIMITED? ! GC_never_stop_func : GC_timeout_stop_func)) { # ifdef SAVE_CALL_CHAIN GC_save_callers(GC_last_stack); # endif *************** GC_bool GC_try_to_collect_inner(stop_fun *** 290,316 **** GC_stop_func stop_func; { if (GC_incremental && GC_collection_in_progress()) { ! # ifdef PRINTSTATS GC_printf0( "GC_try_to_collect_inner: finishing collection in progress\n"); ! # endif /* PRINTSTATS */ /* Just finish collection already in progress. */ while(GC_collection_in_progress()) { if (stop_func()) return(FALSE); GC_collect_a_little_inner(1); } } ! # ifdef PRINTSTATS GC_printf2( "Initiating full world-stop collection %lu after %ld allocd bytes\n", (unsigned long) GC_gc_no+1, (long)WORDS_TO_BYTES(GC_words_allocd)); # endif GC_promote_black_lists(); /* Make sure all blocks have been reclaimed, so sweep routines */ /* don't see cleared mark bits. */ /* If we're guaranteed to finish, then this is unnecessary. */ ! if (stop_func != GC_never_stop_func && !GC_reclaim_all(stop_func, FALSE)) { /* Aborted. So far everything is still consistent. */ return(FALSE); --- 307,342 ---- GC_stop_func stop_func; { if (GC_incremental && GC_collection_in_progress()) { ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf0( "GC_try_to_collect_inner: finishing collection in progress\n"); ! } ! # endif /* CONDPRINT */ /* Just finish collection already in progress. */ while(GC_collection_in_progress()) { if (stop_func()) return(FALSE); GC_collect_a_little_inner(1); } } ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf2( "Initiating full world-stop collection %lu after %ld allocd bytes\n", (unsigned long) GC_gc_no+1, (long)WORDS_TO_BYTES(GC_words_allocd)); + } # endif GC_promote_black_lists(); /* Make sure all blocks have been reclaimed, so sweep routines */ /* don't see cleared mark bits. */ /* If we're guaranteed to finish, then this is unnecessary. */ ! /* In the find_leak case, we have to finish to guarantee that */ ! /* previously unmarked objects are not reported as leaks. */ ! # ifdef PARALLEL_MARK ! GC_wait_for_reclaim(); ! # endif ! if ((GC_find_leak || stop_func != GC_never_stop_func) && !GC_reclaim_all(stop_func, FALSE)) { /* Aborted. So far everything is still consistent. */ return(FALSE); *************** GC_stop_func stop_func; *** 348,354 **** # define GC_RATE 10 # define MAX_PRIOR_ATTEMPTS 1 /* Maximum number of prior attempts at world stop marking */ ! /* A value of 1 means that we finish the seconf time, no matter */ /* how long it takes. Doesn't count the initial root scan */ /* for a full GC. */ --- 374,380 ---- # define GC_RATE 10 # define MAX_PRIOR_ATTEMPTS 1 /* Maximum number of prior attempts at world stop marking */ ! /* A value of 1 means that we finish the second time, no matter */ /* how long it takes. Doesn't count the initial root scan */ /* for a full GC. */ *************** int n; *** 367,373 **** # ifdef SAVE_CALL_CHAIN GC_save_callers(GC_last_stack); # endif ! if (GC_n_attempts < MAX_PRIOR_ATTEMPTS) { GET_TIME(GC_start_time); if (!GC_stopped_mark(GC_timeout_stop_func)) { GC_n_attempts++; --- 393,403 ---- # ifdef SAVE_CALL_CHAIN GC_save_callers(GC_last_stack); # endif ! # ifdef PARALLEL_MARK ! GC_wait_for_reclaim(); ! # endif ! if (GC_n_attempts < MAX_PRIOR_ATTEMPTS ! && GC_time_limit != GC_TIME_UNLIMITED) { GET_TIME(GC_start_time); if (!GC_stopped_mark(GC_timeout_stop_func)) { GC_n_attempts++; *************** GC_stop_func stop_func; *** 412,429 **** { register int i; int dummy; ! # ifdef PRINTSTATS CLOCK_TYPE start_time, current_time; # endif STOP_WORLD(); ! # ifdef PRINTSTATS GET_TIME(start_time); GC_printf1("--> Marking for collection %lu ", (unsigned long) GC_gc_no + 1); GC_printf2("after %lu allocd bytes + %lu wasted bytes\n", (unsigned long) WORDS_TO_BYTES(GC_words_allocd), (unsigned long) WORDS_TO_BYTES(GC_words_wasted)); # endif /* Mark from all roots. */ --- 442,471 ---- { register int i; int dummy; ! # if defined(PRINTTIMES) || defined(CONDPRINT) CLOCK_TYPE start_time, current_time; # endif STOP_WORLD(); ! # ifdef PRINTTIMES GET_TIME(start_time); + # endif + # if defined(CONDPRINT) && !defined(PRINTTIMES) + if (GC_print_stats) GET_TIME(start_time); + # endif + # ifdef CONDPRINT + if (GC_print_stats) { GC_printf1("--> Marking for collection %lu ", (unsigned long) GC_gc_no + 1); GC_printf2("after %lu allocd bytes + %lu wasted bytes\n", (unsigned long) WORDS_TO_BYTES(GC_words_allocd), (unsigned long) WORDS_TO_BYTES(GC_words_wasted)); + } + # endif + # ifdef MAKE_BACK_GRAPH + if (GC_print_back_height) { + GC_build_back_graph(); + } # endif /* Mark from all roots. */ *************** GC_stop_func stop_func; *** 433,442 **** GC_initiate_gc(); for(i = 0;;i++) { if ((*stop_func)()) { ! # ifdef PRINTSTATS GC_printf0("Abandoned stopped marking after "); GC_printf1("%lu iterations\n", (unsigned long)i); # endif GC_deficit = i; /* Give the mutator a chance. */ START_WORLD(); --- 475,486 ---- GC_initiate_gc(); for(i = 0;;i++) { if ((*stop_func)()) { ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf0("Abandoned stopped marking after "); GC_printf1("%lu iterations\n", (unsigned long)i); + } # endif GC_deficit = i; /* Give the mutator a chance. */ START_WORLD(); *************** GC_stop_func stop_func; *** 450,461 **** GC_printf2("Collection %lu reclaimed %ld bytes", (unsigned long) GC_gc_no - 1, (long)WORDS_TO_BYTES(GC_mem_found)); ! GC_printf1(" ---> heapsize = %lu bytes\n", ! (unsigned long) GC_heapsize); ! /* Printf arguments may be pushed in funny places. Clear the */ ! /* space. */ ! GC_printf0(""); ! # endif /* Check all debugged objects for consistency */ if (GC_debugging_started) { --- 494,515 ---- GC_printf2("Collection %lu reclaimed %ld bytes", (unsigned long) GC_gc_no - 1, (long)WORDS_TO_BYTES(GC_mem_found)); ! # else ! # ifdef CONDPRINT ! if (GC_print_stats) { ! GC_printf1("Collection %lu finished", (unsigned long) GC_gc_no - 1); ! } ! # endif ! # endif /* !PRINTSTATS */ ! # ifdef CONDPRINT ! if (GC_print_stats) { ! GC_printf1(" ---> heapsize = %lu bytes\n", ! (unsigned long) GC_heapsize); ! /* Printf arguments may be pushed in funny places. Clear the */ ! /* space. */ ! GC_printf0(""); ! } ! # endif /* CONDPRINT */ /* Check all debugged objects for consistency */ if (GC_debugging_started) { *************** GC_stop_func stop_func; *** 466,476 **** --- 520,589 ---- GET_TIME(current_time); GC_printf1("World-stopped marking took %lu msecs\n", MS_TIME_DIFF(current_time,start_time)); + # else + # ifdef CONDPRINT + if (GC_print_stats) { + GET_TIME(current_time); + GC_printf1("World-stopped marking took %lu msecs\n", + MS_TIME_DIFF(current_time,start_time)); + } + # endif # endif START_WORLD(); return(TRUE); } + /* Set all mark bits for the free list whose first entry is q */ + #ifdef __STDC__ + void GC_set_fl_marks(ptr_t q) + #else + void GC_set_fl_marks(q) + ptr_t q; + #endif + { + ptr_t p; + struct hblk * h, * last_h = 0; + hdr *hhdr; + int word_no; + + for (p = q; p != 0; p = obj_link(p)){ + h = HBLKPTR(p); + if (h != last_h) { + last_h = h; + hhdr = HDR(h); + } + word_no = (((word *)p) - ((word *)h)); + set_mark_bit_from_hdr(hhdr, word_no); + } + } + + /* Clear all mark bits for the free list whose first entry is q */ + /* Decrement GC_mem_found by number of words on free list. */ + #ifdef __STDC__ + void GC_clear_fl_marks(ptr_t q) + #else + void GC_clear_fl_marks(q) + ptr_t q; + #endif + { + ptr_t p; + struct hblk * h, * last_h = 0; + hdr *hhdr; + int word_no; + + for (p = q; p != 0; p = obj_link(p)){ + h = HBLKPTR(p); + if (h != last_h) { + last_h = h; + hhdr = HDR(h); + } + word_no = (((word *)p) - ((word *)h)); + clear_mark_bit_from_hdr(hhdr, word_no); + # ifdef GATHERSTATS + GC_mem_found -= hhdr -> hb_sz; + # endif + } + } /* Finish up a collection. Assumes lock is held, signals are disabled, */ /* but the world is otherwise running. */ *************** void GC_finish_collection() *** 488,513 **** # ifdef GATHERSTATS GC_mem_found = 0; # endif if (GC_find_leak) { /* Mark all objects on the free list. All objects should be */ /* marked when we're done. */ { register word size; /* current object size */ - register ptr_t p; /* pointer to current object */ - register struct hblk * h; /* pointer to block containing *p */ - register hdr * hhdr; - register int word_no; /* "index" of *p in *q */ int kind; for (kind = 0; kind < GC_n_kinds; kind++) { for (size = 1; size <= MAXOBJSZ; size++) { ! for (p= GC_obj_kinds[kind].ok_freelist[size]; ! p != 0; p=obj_link(p)){ ! h = HBLKPTR(p); ! hhdr = HDR(h); ! word_no = (((word *)p) - ((word *)h)); ! set_mark_bit_from_hdr(hhdr, word_no); ! } } } } --- 601,623 ---- # ifdef GATHERSTATS GC_mem_found = 0; # endif + # if defined(LINUX) && defined(__ELF__) && !defined(SMALL_CONFIG) + if (getenv("GC_PRINT_ADDRESS_MAP") != 0) { + GC_print_address_map(); + } + # endif if (GC_find_leak) { /* Mark all objects on the free list. All objects should be */ /* marked when we're done. */ { register word size; /* current object size */ int kind; + ptr_t q; for (kind = 0; kind < GC_n_kinds; kind++) { for (size = 1; size <= MAXOBJSZ; size++) { ! q = GC_obj_kinds[kind].ok_freelist[size]; ! if (q != 0) GC_set_fl_marks(q); } } } *************** void GC_finish_collection() *** 524,556 **** GET_TIME(finalize_time); # endif /* Clear free list mark bits, in case they got accidentally marked */ ! /* Note: HBLKPTR(p) == pointer to head of block containing *p */ ! /* (or GC_find_leak is set and they were intentionally marked.) */ /* Also subtract memory remaining from GC_mem_found count. */ /* Note that composite objects on free list are cleared. */ /* Thus accidentally marking a free list is not a problem; only */ /* objects on the list itself will be marked, and that's fixed here. */ { register word size; /* current object size */ ! register ptr_t p; /* pointer to current object */ ! register struct hblk * h; /* pointer to block containing *p */ ! register hdr * hhdr; ! register int word_no; /* "index" of *p in *q */ int kind; for (kind = 0; kind < GC_n_kinds; kind++) { for (size = 1; size <= MAXOBJSZ; size++) { ! for (p= GC_obj_kinds[kind].ok_freelist[size]; ! p != 0; p=obj_link(p)){ ! h = HBLKPTR(p); ! hhdr = HDR(h); ! word_no = (((word *)p) - ((word *)h)); ! clear_mark_bit_from_hdr(hhdr, word_no); ! # ifdef GATHERSTATS ! GC_mem_found -= size; ! # endif ! } } } } --- 634,665 ---- GET_TIME(finalize_time); # endif + if (GC_print_back_height) { + # ifdef MAKE_BACK_GRAPH + GC_traverse_back_graph(); + # else + # ifndef SMALL_CONFIG + GC_err_printf0("Back height not available: " + "Rebuild collector with -DMAKE_BACK_GRAPH\n"); + # endif + # endif + } + /* Clear free list mark bits, in case they got accidentally marked */ ! /* (or GC_find_leak is set and they were intentionally marked). */ /* Also subtract memory remaining from GC_mem_found count. */ /* Note that composite objects on free list are cleared. */ /* Thus accidentally marking a free list is not a problem; only */ /* objects on the list itself will be marked, and that's fixed here. */ { register word size; /* current object size */ ! register ptr_t q; /* pointer to current object */ int kind; for (kind = 0; kind < GC_n_kinds; kind++) { for (size = 1; size <= MAXOBJSZ; size++) { ! q = GC_obj_kinds[kind].ok_freelist[size]; ! if (q != 0) GC_clear_fl_marks(q); } } } *************** word bytes; *** 663,684 **** GC_heap_sects[GC_n_heap_sects].hs_start = (ptr_t)p; GC_heap_sects[GC_n_heap_sects].hs_bytes = bytes; GC_n_heap_sects++; ! words = BYTES_TO_WORDS(bytes - HDR_BYTES); phdr -> hb_sz = words; ! phdr -> hb_map = (char *)1; /* A value != GC_invalid_map */ phdr -> hb_flags = 0; GC_freehblk(p); GC_heapsize += bytes; ! if ((ptr_t)p <= GC_least_plausible_heap_addr || GC_least_plausible_heap_addr == 0) { ! GC_least_plausible_heap_addr = (ptr_t)p - sizeof(word); /* Making it a little smaller than necessary prevents */ /* us from getting a false hit from the variable */ /* itself. There's some unintentional reflection */ /* here. */ } ! if ((ptr_t)p + bytes >= GC_greatest_plausible_heap_addr) { ! GC_greatest_plausible_heap_addr = (ptr_t)p + bytes; } } --- 772,793 ---- GC_heap_sects[GC_n_heap_sects].hs_start = (ptr_t)p; GC_heap_sects[GC_n_heap_sects].hs_bytes = bytes; GC_n_heap_sects++; ! words = BYTES_TO_WORDS(bytes); phdr -> hb_sz = words; ! phdr -> hb_map = (unsigned char *)1; /* A value != GC_invalid_map */ phdr -> hb_flags = 0; GC_freehblk(p); GC_heapsize += bytes; ! if ((ptr_t)p <= (ptr_t)GC_least_plausible_heap_addr || GC_least_plausible_heap_addr == 0) { ! GC_least_plausible_heap_addr = (GC_PTR)((ptr_t)p - sizeof(word)); /* Making it a little smaller than necessary prevents */ /* us from getting a false hit from the variable */ /* itself. There's some unintentional reflection */ /* here. */ } ! if ((ptr_t)p + bytes >= (ptr_t)GC_greatest_plausible_heap_addr) { ! GC_greatest_plausible_heap_addr = (GC_PTR)((ptr_t)p + bytes); } } *************** void GC_print_heap_sects() *** 705,712 **** } # endif ! ptr_t GC_least_plausible_heap_addr = (ptr_t)ONES; ! ptr_t GC_greatest_plausible_heap_addr = 0; ptr_t GC_max(x,y) ptr_t x, y; --- 814,821 ---- } # endif ! GC_PTR GC_least_plausible_heap_addr = (GC_PTR)ONES; ! GC_PTR GC_greatest_plausible_heap_addr = 0; ptr_t GC_max(x,y) ptr_t x, y; *************** word n; *** 762,770 **** } space = GET_MEM(bytes); if( space == 0 ) { return(FALSE); } ! # ifdef PRINTSTATS GC_printf2("Increasing heap size by %lu after %lu allocated bytes\n", (unsigned long)bytes, (unsigned long)WORDS_TO_BYTES(GC_words_allocd)); --- 871,886 ---- } space = GET_MEM(bytes); if( space == 0 ) { + # ifdef CONDPRINT + if (GC_print_stats) { + GC_printf1("Failed to expand heap by %ld bytes\n", + (unsigned long)bytes); + } + # endif return(FALSE); } ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf2("Increasing heap size by %lu after %lu allocated bytes\n", (unsigned long)bytes, (unsigned long)WORDS_TO_BYTES(GC_words_allocd)); *************** word n; *** 773,778 **** --- 889,895 ---- GC_print_block_list(); GC_print_hblkfreelist(); GC_printf0("\n"); # endif + } # endif expansion_slop = 8 * WORDS_TO_BYTES(min_words_allocd()); if (5 * HBLKSIZE * MAXHINCR > expansion_slop) { *************** GC_bool ignore_off_page; *** 856,867 **** GC_notify_full_gc(); GC_gcollect_inner(); } else { ! WARN("Out of Memory! Returning NIL!\n", 0); return(FALSE); } } else { ! # ifdef PRINTSTATS ! if (GC_fail_count) { GC_printf0("Memory available again ...\n"); } # endif --- 973,986 ---- GC_notify_full_gc(); GC_gcollect_inner(); } else { ! # if !defined(AMIGA) || !defined(GC_AMIGA_FASTALLOC) ! WARN("Out of Memory! Returning NIL!\n", 0); ! # endif return(FALSE); } } else { ! # ifdef CONDPRINT ! if (GC_fail_count && GC_print_stats) { GC_printf0("Memory available again ...\n"); } # endif diff -Nrc3pad gcc-3.0.4/boehm-gc/alpha_mach_dep.s gcc-3.1/boehm-gc/alpha_mach_dep.s *** gcc-3.0.4/boehm-gc/alpha_mach_dep.s Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/alpha_mach_dep.s Fri Aug 17 18:30:45 2001 *************** *** 1,63 **** - # This is BROKEN on a 21264 running gcc, and probably in other cases. - # The compiler may spill pointers to fp registers, and this code doesn't - # scan those. - - # define call_push(x) \ - lda $16, 0(x); /* copy x to first argument register */ \ - jsr $26, GC_push_one; /* call GC_push_one, ret addr in $26 */ \ - ldgp $gp, 0($26) /* restore $gp register from $ra */ - .text .align 4 .globl GC_push_regs .ent GC_push_regs 2 GC_push_regs: ! ldgp $gp, 0($27) # set gp from the procedure value reg ! lda $sp, -32($sp) # make stack frame ! stq $26, 8($sp) # save return address ! .mask 0x04000000, -8 .frame $sp, 16, $26, 0 ! # call_push($0) # expression eval and int func result ! ! # call_push($1) # temp regs - not preserved cross calls ! # call_push($2) ! # call_push($3) ! # call_push($4) ! # call_push($5) ! # call_push($6) ! # call_push($7) ! # call_push($8) ! call_push($9) # Saved regs call_push($10) call_push($11) call_push($12) call_push($13) call_push($14) ! call_push($15) # frame ptr or saved reg ! # call_push($16) # argument regs - not preserved cross calls ! # call_push($17) ! # call_push($18) ! # call_push($19) ! # call_push($20) ! # call_push($21) ! # call_push($22) # temp regs - not preserved cross calls ! # call_push($23) ! # call_push($24) ! # call_push($25) ! # call_push($26) # return address - expression eval ! # call_push($27) # procedure value or temporary reg ! # call_push($28) # assembler temp - not presrved ! call_push($29) # Global Pointer ! # call_push($30) # Stack Pointer - ldq $26, 8($sp) # restore return address - lda $sp, 32($sp) # pop stack frame - ret $31, ($26), 1 # return ($31 == hardwired zero) .end GC_push_regs --- 1,86 ---- + .arch ev6 .text .align 4 .globl GC_push_regs .ent GC_push_regs 2 GC_push_regs: ! ldgp $gp, 0($27) ! lda $sp, -16($sp) ! stq $26, 0($sp) ! .mask 0x04000000, 0 .frame $sp, 16, $26, 0 ! # $0 integer result ! # $1-$8 temp regs - not preserved cross calls ! # $9-$15 call saved regs ! # $16-$21 argument regs - not preserved cross calls ! # $22-$28 temp regs - not preserved cross calls ! # $29 global pointer - not preserved cross calls ! # $30 stack pointer ! # define call_push(x) \ ! mov x, $16; \ ! jsr $26, GC_push_one; \ ! ldgp $gp, 0($26) ! ! call_push($9) call_push($10) call_push($11) call_push($12) call_push($13) call_push($14) + call_push($15) ! # $f0-$f1 floating point results ! # $f2-$f9 call saved regs ! # $f10-$f30 temp regs - not preserved cross calls ! # Use the most efficient transfer method for this hardware. ! # Bit 1 detects the FIX extension, which includes ftoit. ! amask 2, $0 ! bne $0, $use_stack ! #undef call_push ! #define call_push(x) \ ! ftoit x, $16; \ ! jsr $26, GC_push_one; \ ! ldgp $gp, 0($26) ! call_push($f2) ! call_push($f3) ! call_push($f4) ! call_push($f5) ! call_push($f6) ! call_push($f7) ! call_push($f8) ! call_push($f9) ! ! ldq $26, 0($sp) ! lda $sp, 16($sp) ! ret $31, ($26), 1 ! ! .align 4 ! $use_stack: ! ! #undef call_push ! #define call_push(x) \ ! stt x, 8($sp); \ ! ldq $16, 8($sp); \ ! jsr $26, GC_push_one; \ ! ldgp $gp, 0($26) ! ! call_push($f2) ! call_push($f3) ! call_push($f4) ! call_push($f5) ! call_push($f6) ! call_push($f7) ! call_push($f8) ! call_push($f9) ! ! ldq $26, 0($sp) ! lda $sp, 16($sp) ! ret $31, ($26), 1 .end GC_push_regs diff -Nrc3pad gcc-3.0.4/boehm-gc/backgraph.c gcc-3.1/boehm-gc/backgraph.c *** gcc-3.0.4/boehm-gc/backgraph.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/backgraph.c Thu Jan 31 02:48:45 2002 *************** *** 0 **** --- 1,447 ---- + /* + * Copyright (c) 2001 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ + + /* + * This implements a full, though not well-tuned, representation of the + * backwards points-to graph. This is used to test for non-GC-robust + * data structures; the code is not used during normal garbage collection. + * + * One restriction is that we drop all back-edges from nodes with very + * high in-degree, and simply add them add them to a list of such + * nodes. They are then treated as permanent roots. Id this by itself + * doesn't introduce a space leak, then such nodes can't contribute to + * a growing space leak. + */ + + #ifdef MAKE_BACK_GRAPH + + #define MAX_IN 10 /* Maximum in-degree we handle directly */ + + #include "private/dbg_mlc.h" + #include + + #if !defined(DBG_HDRS_ALL) || (ALIGNMENT != CPP_WORDSZ/8) || !defined(UNIX_LIKE) + # error Configuration doesnt support MAKE_BACK_GRAPH + #endif + + /* We store single back pointers directly in the object's oh_bg_ptr field. */ + /* If there is more than one ptr to an object, we store q | FLAG_MANY, */ + /* where q is a pointer to a back_edges object. */ + /* Every once in a while we use a back_edges object even for a single */ + /* pointer, since we need the other fields in the back_edges structure to */ + /* be present in some fraction of the objects. Otherwise we get serious */ + /* performance issues. */ + #define FLAG_MANY 2 + + typedef struct back_edges_struct { + word n_edges; /* Number of edges, including those in continuation */ + /* structures. */ + unsigned short flags; + # define RETAIN 1 /* Directly points to a reachable object; */ + /* retain for next GC. */ + unsigned short height_gc_no; + /* If height > 0, then the GC_gc_no value when it */ + /* was computed. If it was computed this cycle, then */ + /* it is current. If it was computed during the */ + /* last cycle, then it represents the old height, */ + /* which is only saved for live objects referenced by */ + /* dead ones. This may grow due to refs from newly */ + /* dead objects. */ + signed_word height; + /* Longest path through unreachable nodes to this node */ + /* that we found using depth first search. */ + + # define HEIGHT_UNKNOWN ((signed_word)(-2)) + # define HEIGHT_IN_PROGRESS ((signed_word)(-1)) + ptr_t edges[MAX_IN]; + struct back_edges_struct *cont; + /* Pointer to continuation structure; we use only the */ + /* edges field in the continuation. */ + /* also used as free list link. */ + } back_edges; + + /* Allocate a new back edge structure. Should be more sophisticated */ + /* if this were production code. */ + #define MAX_BACK_EDGE_STRUCTS 100000 + static back_edges *back_edge_space = 0; + int GC_n_back_edge_structs = 0; /* Serves as pointer to never used */ + /* back_edges space. */ + static back_edges *avail_back_edges = 0; + /* Pointer to free list of deallocated */ + /* back_edges structures. */ + + static back_edges * new_back_edges(void) + { + if (0 == back_edge_space) { + back_edge_space = (back_edges *) + sbrk(MAX_BACK_EDGE_STRUCTS*sizeof(back_edges)); + } + if (0 != avail_back_edges) { + back_edges * result = avail_back_edges; + avail_back_edges = result -> cont; + result -> cont = 0; + return result; + } + if (GC_n_back_edge_structs >= MAX_BACK_EDGE_STRUCTS - 1) { + ABORT("needed too much space for back edges: adjust " + "MAX_BACK_EDGE_STRUCTS"); + } + return back_edge_space + (GC_n_back_edge_structs++); + } + + /* Deallocate p and its associated continuation structures. */ + static void deallocate_back_edges(back_edges *p) + { + back_edges *last = p; + + while (0 != last -> cont) last = last -> cont; + last -> cont = avail_back_edges; + avail_back_edges = p; + } + + /* Table of objects that are currently on the depth-first search */ + /* stack. Only objects with in-degree one are in this table. */ + /* Other objects are identified using HEIGHT_IN_PROGRESS. */ + /* This data structure NEEDS IMPROVEMENT. */ + #define MAX_IN_PROGRESS 10000 + static ptr_t * in_progress_space = 0; + static int n_in_progress = 0; + + static void push_in_progress(ptr_t p) + { + if (in_progress_space == 0) + in_progress_space = sbrk(MAX_IN_PROGRESS * sizeof(ptr_t)); + if (n_in_progress == MAX_IN_PROGRESS) + ABORT("Exceeded MAX_IN_PROGRESS"); + in_progress_space[n_in_progress++] = p; + } + + static GC_bool is_in_progress(ptr_t p) + { + int i; + for (i = 0; i < n_in_progress; ++i) { + if (in_progress_space[i] == p) return TRUE; + } + return FALSE; + } + + static void pop_in_progress(ptr_t p) + { + --n_in_progress; + GC_ASSERT(in_progress_space[n_in_progress] == p); + } + + #define GET_OH_BG_PTR(p) \ + (ptr_t)REVEAL_POINTER(((oh *)(p)) -> oh_bg_ptr) + #define SET_OH_BG_PTR(p,q) (((oh *)(p)) -> oh_bg_ptr) = HIDE_POINTER(q) + + /* Execute s once for each predecessor q of p in the points-to graph. */ + /* s should be a bracketed statement. We declare q. */ + #define FOR_EACH_PRED(q, p, s) \ + { \ + ptr_t q = GET_OH_BG_PTR(p); \ + if (!((word)q & FLAG_MANY)) { \ + if (q && !((word)q & 1)) s \ + /* !((word)q & 1) checks for a misnterpreted freelist link */ \ + } else { \ + back_edges *orig_be_ = (back_edges *)((word)q & ~FLAG_MANY); \ + back_edges *be_ = orig_be_; \ + int total_, local_; \ + int n_edges_ = be_ -> n_edges; \ + for (total_ = 0, local_ = 0; total_ < n_edges_; ++local_, ++total_) { \ + if (local_ == MAX_IN) { \ + be_ = be_ -> cont; \ + local_ = 0; \ + } \ + q = be_ -> edges[local_]; s \ + } \ + } \ + } + + /* Ensure that p has a back_edges structure associated with it. */ + static void ensure_struct(ptr_t p) + { + ptr_t old_back_ptr = GET_OH_BG_PTR(p); + + if (!((word)old_back_ptr & FLAG_MANY)) { + back_edges *be = new_back_edges(); + be -> flags = 0; + if (0 == old_back_ptr) { + be -> n_edges = 0; + } else { + be -> n_edges = 1; + be -> edges[0] = old_back_ptr; + } + be -> height = HEIGHT_UNKNOWN; + be -> height_gc_no = GC_gc_no - 1; + GC_ASSERT(be >= back_edge_space); + SET_OH_BG_PTR(p, (word)be | FLAG_MANY); + } + } + + /* Add the (forward) edge from p to q to the backward graph. Both p */ + /* q are pointers to the object base, i.e. pointers to an oh. */ + static void add_edge(ptr_t p, ptr_t q) + { + ptr_t old_back_ptr = GET_OH_BG_PTR(q); + back_edges * be, *be_cont; + word i; + static unsigned random_number = 13; + # define GOT_LUCKY_NUMBER (((++random_number) & 0x7f) == 0) + /* A not very random number we use to occasionally allocate a */ + /* back_edges structure even for a single backward edge. This */ + /* prevents us from repeatedly tracing back through very long */ + /* chains, since we will have some place to store height and */ + /* in_progress flags along the way. */ + + GC_ASSERT(p == GC_base(p) && q == GC_base(q)); + if (!GC_HAS_DEBUG_INFO(q) || !GC_HAS_DEBUG_INFO(p)) { + /* This is really a misinterpreted free list link, since we saw */ + /* a pointer to a free list. Dont overwrite it! */ + return; + } + if (0 == old_back_ptr) { + SET_OH_BG_PTR(q, p); + if (GOT_LUCKY_NUMBER) ensure_struct(q); + return; + } + /* Check whether it was already in the list of predecessors. */ + FOR_EACH_PRED(pred, q, { if (p == pred) return; }); + ensure_struct(q); + old_back_ptr = GET_OH_BG_PTR(q); + be = (back_edges *)((word)old_back_ptr & ~FLAG_MANY); + for (i = be -> n_edges, be_cont = be; i > MAX_IN; + be_cont = be_cont -> cont, i -= MAX_IN) {} + if (i == MAX_IN) { + be_cont -> cont = new_back_edges(); + be_cont = be_cont -> cont; + i = 0; + } + be_cont -> edges[i] = p; + be -> n_edges++; + if (be -> n_edges == 100) { + # if 0 + if (GC_print_stats) { + GC_err_printf0("The following object has in-degree >= 100:\n"); + GC_print_heap_obj(q); + } + # endif + } + } + + typedef void (*per_object_func)(ptr_t p, word n_words, word gc_descr); + + static void per_object_helper(struct hblk *h, word fn) + { + hdr * hhdr = HDR(h); + word sz = hhdr -> hb_sz; + word descr = hhdr -> hb_descr; + per_object_func f = (per_object_func)fn; + int i = 0; + + do { + f((ptr_t)(h -> hb_body + i), sz, descr); + i += sz; + } while (i + sz <= BYTES_TO_WORDS(HBLKSIZE)); + } + + void GC_apply_to_each_object(per_object_func f) + { + GC_apply_to_all_blocks(per_object_helper, (word)f); + } + + static void reset_back_edge(ptr_t p, word n_words, word gc_descr) + { + /* Skip any free list links, or dropped blocks */ + if (GC_HAS_DEBUG_INFO(p)) { + ptr_t old_back_ptr = GET_OH_BG_PTR(p); + if ((word)old_back_ptr & FLAG_MANY) { + back_edges *be = (back_edges *)((word)old_back_ptr & ~FLAG_MANY); + if (!(be -> flags & RETAIN)) { + deallocate_back_edges(be); + SET_OH_BG_PTR(p, 0); + } else { + word *currentp; + + GC_ASSERT(GC_is_marked(p)); + + /* Back edges may point to objects that will not be retained. */ + /* Delete them for now, but remember the height. */ + /* Some will be added back at next GC. */ + be -> n_edges = 0; + if (0 != be -> cont) { + deallocate_back_edges(be -> cont); + be -> cont = 0; + } + + GC_ASSERT(GC_is_marked(p)); + + /* We only retain things for one GC cycle at a time. */ + be -> flags &= ~RETAIN; + } + } else /* Simple back pointer */ { + /* Clear to avoid dangling pointer. */ + SET_OH_BG_PTR(p, 0); + } + } + } + + static void add_back_edges(ptr_t p, word n_words, word gc_descr) + { + word *currentp = (word *)(p + sizeof(oh)); + + /* For now, fix up non-length descriptors conservatively. */ + if((gc_descr & GC_DS_TAGS) != GC_DS_LENGTH) { + gc_descr = WORDS_TO_BYTES(n_words); + } + while (currentp < (word *)(p + gc_descr)) { + word current = *currentp++; + if (current >= (word)GC_least_plausible_heap_addr && + current <= (word)GC_greatest_plausible_heap_addr) { + ptr_t target = GC_base((GC_PTR)current); + if (0 != target) { + add_edge(p, target); + } + } + } + } + + /* Rebuild the reprentation of the backward reachability graph. */ + /* Does not examine mark bits. Can be called before GC. */ + void GC_build_back_graph(void) + { + GC_apply_to_each_object(add_back_edges); + } + + /* Return an approximation to the length of the longest simple path */ + /* through unreachable objects to p. We refer to this as the height */ + /* of p. */ + static word backwards_height(ptr_t p) + { + word result; + ptr_t back_ptr = GET_OH_BG_PTR(p); + back_edges *be; + + if (0 == back_ptr) return 1; + if (!((word)back_ptr & FLAG_MANY)) { + if (is_in_progress(p)) return 0; /* DFS back edge, i.e. we followed */ + /* an edge to an object already */ + /* on our stack: ignore */ + push_in_progress(p); + result = backwards_height(back_ptr)+1; + pop_in_progress(p); + return result; + } + be = (back_edges *)((word)back_ptr & ~FLAG_MANY); + if (be -> height >= 0 && be -> height_gc_no == GC_gc_no) + return be -> height; + /* Ignore back edges in DFS */ + if (be -> height == HEIGHT_IN_PROGRESS) return 0; + result = (be -> height > 0? be -> height : 1); + be -> height = HEIGHT_IN_PROGRESS; + FOR_EACH_PRED(q, p, { + word this_height; + if (GC_is_marked(q) && !(FLAG_MANY & (word)GET_OH_BG_PTR(p))) { + if (GC_print_stats) + GC_printf2("Found bogus pointer from 0x%lx to 0x%lx\n", q, p); + /* Reachable object "points to" unreachable one. */ + /* Could be caused by our lax treatment of GC descriptors. */ + this_height = 1; + } else { + this_height = backwards_height(q); + } + if (this_height >= result) result = this_height + 1; + }); + be -> height = result; + be -> height_gc_no = GC_gc_no; + return result; + } + + word GC_max_height; + ptr_t GC_deepest_obj; + + /* Compute the maximum height of every unreachable predecessor p of a */ + /* reachable object. Arrange to save the heights of all such objects p */ + /* so that they can be used in calculating the height of objects in the */ + /* next GC. */ + /* Set GC_max_height to be the maximum height we encounter, and */ + /* GC_deepest_obj to be the corresponding object. */ + static void update_max_height(ptr_t p, word n_words, word gc_descr) + { + if (GC_is_marked(p) && GC_HAS_DEBUG_INFO(p)) { + int i; + word p_height = 0; + ptr_t p_deepest_obj = 0; + ptr_t back_ptr; + back_edges *be = 0; + + /* If we remembered a height last time, use it as a minimum. */ + /* It may have increased due to newly unreachable chains pointing */ + /* to p, but it can't have decreased. */ + back_ptr = GET_OH_BG_PTR(p); + if (0 != back_ptr && ((word)back_ptr & FLAG_MANY)) { + be = (back_edges *)((word)back_ptr & ~FLAG_MANY); + if (be -> height != HEIGHT_UNKNOWN) p_height = be -> height; + } + FOR_EACH_PRED(q, p, { + if (!GC_is_marked(q) && GC_HAS_DEBUG_INFO(q)) { + word q_height; + + q_height = backwards_height(q); + if (q_height > p_height) { + p_height = q_height; + p_deepest_obj = q; + } + } + }); + if (p_height > 0) { + /* Remember the height for next time. */ + if (be == 0) { + ensure_struct(p); + back_ptr = GET_OH_BG_PTR(p); + be = (back_edges *)((word)back_ptr & ~FLAG_MANY); + } + be -> flags |= RETAIN; + be -> height = p_height; + be -> height_gc_no = GC_gc_no; + } + if (p_height > GC_max_height) { + GC_max_height = p_height; + GC_deepest_obj = p_deepest_obj; + } + } + } + + void GC_traverse_back_graph(void) + { + static word max_max_height = 0; + GC_max_height = 0; + GC_apply_to_each_object(update_max_height); + GC_printf2("Maximum backwards height of reachable objects at GC %lu is %ld\n", + (unsigned long) GC_gc_no, GC_max_height); + if (GC_max_height > max_max_height) { + max_max_height = GC_max_height; + GC_printf0("The following unreachable object is last in a longest chain " + "of unreachable objects:\n"); + GC_print_heap_obj(GC_deepest_obj); + } + if (GC_print_stats) { + GC_printf1("Needed max total of %ld back-edge structs\n", + GC_n_back_edge_structs); + } + GC_apply_to_each_object(reset_back_edge); + GC_deepest_obj = 0; + } + + #endif /* MAKE_BACK_GRAPH */ diff -Nrc3pad gcc-3.0.4/boehm-gc/backptr.h gcc-3.1/boehm-gc/backptr.h *** gcc-3.0.4/boehm-gc/backptr.h Wed Apr 19 02:29:15 2000 --- gcc-3.1/boehm-gc/backptr.h Thu Jan 1 00:00:00 1970 *************** *** 1,63 **** - /* - * This is a simple API to implement pointer back tracing, i.e. - * to answer questions such as "who is pointing to this" or - * "why is this object being retained by the collector" - * - * This API assumes that we have an ANSI C compiler. - * - * Most of these calls yield useful information on only after - * a garbage collection. Usually the client will first force - * a full collection and then gather information, preferably - * before much intervening allocation. - * - * The implementation of the interface is only about 99.9999% - * correct. It is intended to be good enough for profiling, - * but is not intended to be used with production code. - * - * Results are likely to be much more useful if all allocation is - * accomplished through the debugging allocators. - * - * The implementation idea is due to A. Demers. - */ - - /* Store information about the object referencing dest in *base_p */ - /* and *offset_p. */ - /* If multiple objects or roots point to dest, the one reported */ - /* will be the last on used by the garbage collector to trace the */ - /* object. */ - /* source is root ==> *base_p = address, *offset_p = 0 */ - /* source is heap object ==> *base_p != 0, *offset_p = offset */ - /* Returns 1 on success, 0 if source couldn't be determined. */ - /* Dest can be any address within a heap object. */ - typedef enum { GC_UNREFERENCED, /* No reference info available. */ - GC_NO_SPACE, /* Dest not allocated with debug alloc */ - GC_REFD_FROM_ROOT, /* Referenced directly by root *base_p */ - GC_REFD_FROM_REG, /* Referenced from a register, i.e. */ - /* a root without an address. */ - GC_REFD_FROM_HEAP, /* Referenced from another heap obj. */ - GC_FINALIZER_REFD /* Finalizable and hence accessible. */ - } GC_ref_kind; - - GC_ref_kind GC_get_back_ptr_info(void *dest, void **base_p, size_t *offset_p); - - /* Generate a random heap address. */ - /* The resulting address is in the heap, but */ - /* not necessarily inside a valid object. */ - void * GC_generate_random_heap_address(void); - - /* Generate a random address inside a valid marked heap object. */ - void * GC_generate_random_valid_address(void); - - /* Force a garbage collection and generate a backtrace from a */ - /* random heap address. */ - /* This uses the GC logging mechanism (GC_printf) to produce */ - /* output. It can often be called from a debugger. The */ - /* source in dbg_mlc.c also serves as a sample client. */ - void GC_generate_random_backtrace(void); - - /* Print a backtrace from a specific address. Used by the */ - /* above. The client should call GC_gcollect() immediately */ - /* before invocation. */ - void GC_print_backtrace(void *); - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/barrett_diagram gcc-3.1/boehm-gc/barrett_diagram *** gcc-3.0.4/boehm-gc/barrett_diagram Wed Jun 30 12:43:12 1999 --- gcc-3.1/boehm-gc/barrett_diagram Thu Jan 1 00:00:00 1970 *************** *** 1,106 **** - This is an ASCII diagram of the data structure used to check pointer - validity. It was provided by Dave Barrett , - and should be of use to others attempting to understand the code. - The data structure in GC4.X is essentially the same. -HB - - - - - Data Structure used by GC_base in gc3.7: - 21-Apr-94 - - - - - 63 LOG_TOP_SZ[11] LOG_BOTTOM_SZ[10] LOG_HBLKSIZE[13] - +------------------+----------------+------------------+------------------+ - p:| | TL_HASH(hi) | | HBLKDISPL(p) | - +------------------+----------------+------------------+------------------+ - \-----------------------HBLKPTR(p)-------------------/ - \------------hi-------------------/ - \______ ________/ \________ _______/ \________ _______/ - V V V - | | | - GC_top_index[] | | | - --- +--------------+ | | | - ^ | | | | | - | | | | | | - TOP +--------------+<--+ | | - _SZ +-<| [] | * | | - (items)| +--------------+ if 0 < bi< HBLKSIZE | | - | | | | then large object | | - | | | | starts at the bi'th | | - v | | | HBLK before p. | i | - --- | +--------------+ | (word- | - v | aligned) | - bi= |GET_BI(p){->hash_link}->key==hi | | - v | | - | (bottom_index) \ scratch_alloc'd | | - | ( struct bi ) / by get_index() | | - --- +->+--------------+ | | - ^ | | | | - ^ | | | | - BOTTOM | | ha=GET_HDR_ADDR(p) | | - _SZ(items)+--------------+<----------------------+ +-------+ - | +--<| index[] | | - | | +--------------+ GC_obj_map: v - | | | | from / +-+-+-----+-+-+-+-+ --- - v | | | GC_add < 0| | | | | | | | ^ - --- | +--------------+ _map_entry \ +-+-+-----+-+-+-+-+ | - | | asc_link | +-+-+-----+-+-+-+-+ MAXOBJSZ - | +--------------+ +-->| | | j | | | | | +1 - | | key | | +-+-+-----+-+-+-+-+ | - | +--------------+ | +-+-+-----+-+-+-+-+ | - | | hash_link | | | | | | | | | | v - | +--------------+ | +-+-+-----+-+-+-+-+ --- - | | |<--MAX_OFFSET--->| - | | (bytes) - HDR(p)| GC_find_header(p) | |<--MAP_ENTRIES-->| - | \ from | =HBLKSIZE/WORDSZ - | (hdr) (struct hblkhdr) / alloc_hdr() | (1024 on Alpha) - +-->+----------------------+ | (8/16 bits each) - GET_HDR(p)| word hb_sz (words) | | - +----------------------+ | - | struct hblk *hb_next | | - +----------------------+ | - |mark_proc hb_mark_proc| | - +----------------------+ | - | char * hb_map |>-------------+ - +----------------------+ - | ushort hb_obj_kind | - +----------------------+ - | hb_last_reclaimed | - --- +----------------------+ - ^ | | - MARK_BITS| hb_marks[] | *if hdr is free, hb_sz + DISCARD_WORDS - _SZ(words)| | is the size of a heap chunk (struct hblk) - v | | of at least MININCR*HBLKSIZE bytes (below), - --- +----------------------+ otherwise, size of each object in chunk. - - Dynamic data structures above are interleaved throughout the heap in blocks of - size MININCR * HBLKSIZE bytes as done by gc_scratch_alloc which cannot be - freed; free lists are used (e.g. alloc_hdr). HBLKs's below are collected. - - (struct hblk) - --- +----------------------+ < HBLKSIZE --- --- DISCARD_ - ^ |garbage[DISCARD_WORDS]| aligned ^ ^ HDR_BYTES WORDS - | | | | v (bytes) (words) - | +-----hb_body----------+ < WORDSZ | --- --- - | | | aligned | ^ ^ - | | Object 0 | | hb_sz | - | | | i |(word- (words)| - | | | (bytes)|aligned) v | - | + - - - - - - - - - - -+ --- | --- | - | | | ^ | ^ | - n * | | j (words) | hb_sz BODY_SZ - HBLKSIZE | Object 1 | v v | (words) - (bytes) | |--------------- v MAX_OFFSET - | + - - - - - - - - - - -+ --- (bytes) - | | | !All_INTERIOR_PTRS ^ | - | | | sets j only for hb_sz | - | | Object N | valid object offsets. | | - v | | All objects WORDSZ v v - --- +----------------------+ aligned. --- --- - - DISCARD_WORDS is normally zero. Indeed the collector has not been tested - with another value in ages. --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/blacklst.c gcc-3.1/boehm-gc/blacklst.c *** gcc-3.0.4/boehm-gc/blacklst.c Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/blacklst.c Fri Aug 17 18:30:45 2001 *************** *** 12,18 **** * modified is included with the above copyright notice. */ /* Boehm, August 9, 1995 6:09 pm PDT */ ! # include "gc_priv.h" /* * We maintain several hash tables of hblks that have had false hits. --- 12,18 ---- * modified is included with the above copyright notice. */ /* Boehm, August 9, 1995 6:09 pm PDT */ ! # include "private/gc_priv.h" /* * We maintain several hash tables of hblks that have had false hits. *************** word GC_black_list_spacing = MINHINCR*HB *** 52,66 **** void GC_clear_bl(); ! void GC_default_print_heap_obj_proc(p) ! ptr_t p; { ptr_t base = GC_base(p); GC_err_printf2("start: 0x%lx, appr. length: %ld", base, GC_size(base)); } ! void (*GC_print_heap_obj)(/* char * s, ptr_t p */) = GC_default_print_heap_obj_proc; void GC_print_source_ptr(p) --- 52,70 ---- void GC_clear_bl(); ! # if defined(__STDC__) || defined(__cplusplus) ! void GC_default_print_heap_obj_proc(ptr_t p) ! # else ! void GC_default_print_heap_obj_proc(p) ! ptr_t p; ! # endif { ptr_t base = GC_base(p); GC_err_printf2("start: 0x%lx, appr. length: %ld", base, GC_size(base)); } ! void (*GC_print_heap_obj) GC_PROTO((ptr_t p)) = GC_default_print_heap_obj_proc; void GC_print_source_ptr(p) *************** ptr_t p; *** 81,98 **** void GC_bl_init() { ! # ifndef ALL_INTERIOR_POINTERS ! GC_old_normal_bl = (word *) GC_scratch_alloc((word)(sizeof (page_hash_table))); ! GC_incomplete_normal_bl = (word *)GC_scratch_alloc ((word)(sizeof(page_hash_table))); ! if (GC_old_normal_bl == 0 || GC_incomplete_normal_bl == 0) { GC_err_printf0("Insufficient memory for black list\n"); EXIT(); } - GC_clear_bl(GC_old_normal_bl); - GC_clear_bl(GC_incomplete_normal_bl); - # endif GC_old_stack_bl = (word *)GC_scratch_alloc((word)(sizeof(page_hash_table))); GC_incomplete_stack_bl = (word *)GC_scratch_alloc ((word)(sizeof(page_hash_table))); --- 85,102 ---- void GC_bl_init() { ! if (!GC_all_interior_pointers) { ! GC_old_normal_bl = (word *) GC_scratch_alloc((word)(sizeof (page_hash_table))); ! GC_incomplete_normal_bl = (word *)GC_scratch_alloc ((word)(sizeof(page_hash_table))); ! if (GC_old_normal_bl == 0 || GC_incomplete_normal_bl == 0) { GC_err_printf0("Insufficient memory for black list\n"); EXIT(); + } + GC_clear_bl(GC_old_normal_bl); + GC_clear_bl(GC_incomplete_normal_bl); } GC_old_stack_bl = (word *)GC_scratch_alloc((word)(sizeof(page_hash_table))); GC_incomplete_stack_bl = (word *)GC_scratch_alloc ((word)(sizeof(page_hash_table))); *************** void GC_promote_black_lists() *** 127,135 **** GC_old_normal_bl = GC_incomplete_normal_bl; GC_old_stack_bl = GC_incomplete_stack_bl; ! # ifndef ALL_INTERIOR_POINTERS GC_clear_bl(very_old_normal_bl); ! # endif GC_clear_bl(very_old_stack_bl); GC_incomplete_normal_bl = very_old_normal_bl; GC_incomplete_stack_bl = very_old_stack_bl; --- 131,139 ---- GC_old_normal_bl = GC_incomplete_normal_bl; GC_old_stack_bl = GC_incomplete_stack_bl; ! if (!GC_all_interior_pointers) { GC_clear_bl(very_old_normal_bl); ! } GC_clear_bl(very_old_stack_bl); GC_incomplete_normal_bl = very_old_normal_bl; GC_incomplete_stack_bl = very_old_stack_bl; *************** void GC_promote_black_lists() *** 156,168 **** void GC_unpromote_black_lists() { ! # ifndef ALL_INTERIOR_POINTERS GC_copy_bl(GC_old_normal_bl, GC_incomplete_normal_bl); ! # endif GC_copy_bl(GC_old_stack_bl, GC_incomplete_stack_bl); } - # ifndef ALL_INTERIOR_POINTERS /* P is not a valid pointer reference, but it falls inside */ /* the plausible heap bounds. */ /* Add it to the normal incomplete black list if appropriate. */ --- 160,171 ---- void GC_unpromote_black_lists() { ! if (!GC_all_interior_pointers) { GC_copy_bl(GC_old_normal_bl, GC_incomplete_normal_bl); ! } GC_copy_bl(GC_old_stack_bl, GC_incomplete_stack_bl); } /* P is not a valid pointer reference, but it falls inside */ /* the plausible heap bounds. */ /* Add it to the normal incomplete black list if appropriate. */ *************** word p; *** 193,199 **** /* object, and isn't worth black listing. */ } } - # endif /* And the same for false pointers from the stack. */ #ifdef PRINT_BLACK_LIST --- 196,201 ---- *************** word len; *** 236,247 **** register word i; word nblocks = divHBLKSZ(len); ! # ifndef ALL_INTERIOR_POINTERS if (get_pht_entry_from_index(GC_old_normal_bl, index) || get_pht_entry_from_index(GC_incomplete_normal_bl, index)) { return(h+1); } ! # endif for (i = 0; ; ) { if (GC_old_stack_bl[divWORDSZ(index)] == 0 --- 238,249 ---- register word i; word nblocks = divHBLKSZ(len); ! if (!GC_all_interior_pointers) { if (get_pht_entry_from_index(GC_old_normal_bl, index) || get_pht_entry_from_index(GC_incomplete_normal_bl, index)) { return(h+1); } ! } for (i = 0; ; ) { if (GC_old_stack_bl[divWORDSZ(index)] == 0 diff -Nrc3pad gcc-3.0.4/boehm-gc/checksums.c gcc-3.1/boehm-gc/checksums.c *** gcc-3.0.4/boehm-gc/checksums.c Wed Jun 30 12:43:17 1999 --- gcc-3.1/boehm-gc/checksums.c Fri Aug 17 18:30:45 2001 *************** int index; *** 80,86 **** if (pe -> block != 0 && pe -> block != h + OFFSET) ABORT("goofed"); pe -> old_sum = pe -> new_sum; pe -> new_sum = GC_checksum(h); ! # ifndef MSWIN32 if (pe -> new_sum != 0 && !GC_page_was_ever_dirty(h)) { GC_printf1("GC_page_was_ever_dirty(0x%lx) is wrong\n", (unsigned long)h); --- 80,86 ---- if (pe -> block != 0 && pe -> block != h + OFFSET) ABORT("goofed"); pe -> old_sum = pe -> new_sum; pe -> new_sum = GC_checksum(h); ! # if !defined(MSWIN32) && !defined(MSWINCE) if (pe -> new_sum != 0 && !GC_page_was_ever_dirty(h)) { GC_printf1("GC_page_was_ever_dirty(0x%lx) is wrong\n", (unsigned long)h); diff -Nrc3pad gcc-3.0.4/boehm-gc/config.guess gcc-3.1/boehm-gc/config.guess *** gcc-3.0.4/boehm-gc/config.guess Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/config.guess Tue Feb 12 04:37:53 2002 *************** *** 0 **** --- 1,1319 ---- + #! /bin/sh + # Attempt to guess a canonical system name. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + # 2000, 2001, 2002 Free Software Foundation, Inc. + + timestamp='2002-01-10' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Originally written by Per Bothner . + # Please send patches to . Submit a context + # diff and a properly formatted ChangeLog entry. + # + # This script attempts to guess a canonical system name similar to + # config.sub. If it succeeds, it prints the system name on stdout, and + # exits with 0. Otherwise, it exits with 1. + # + # The plan is that this can be called by configure scripts if you + # don't specify an explicit build system type. + + me=`echo "$0" | sed -e 's,.*/,,'` + + usage="\ + Usage: $0 [OPTION] + + Output the configuration name of the system \`$me' is run on. + + Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + + Report bugs and patches to ." + + version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + + help=" + Try \`$me --help' for more information." + + # Parse command line + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac + done + + if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 + fi + + + dummy=dummy-$$ + trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + + # CC_FOR_BUILD -- compiler used by this script. + # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still + # use `HOST_CC' if defined, but it is deprecated. + + set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; + for c in cc gcc c89 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac' + + # This is needed to find uname on a Pyramid OSx when run in the BSD universe. + # (ghazi@noc.rutgers.edu 1994-08-24) + if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH + fi + + UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown + UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown + UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + + # Note: order is significant - the case branches are not exclusive. + + case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + UNAME_MACHINE_ARCH=`(uname -p) 2>/dev/null` || \ + UNAME_MACHINE_ARCH=unknown + case "${UNAME_MACHINE_ARCH}" in + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .data + \$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main + main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main + EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __cplusplus + #include /* for printf() prototype */ + int main (int argc, char *argv[]) { + #else + int main (argc, argv) int argc; char *argv[]; { + #endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } + EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } + EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } + EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } + EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i386-pc-interix3 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c + test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + ld_supported_targets=`cd /; ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + LIBC=gnuaout + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + esac + + #echo '(No uname command or uname output not recognized.)' 1>&2 + #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + + eval $set_cc_for_build + cat >$dummy.c < + # include + #endif + main () + { + #if defined (sony) + #if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); + #else + #include + printf ("m68k-sony-newsos%s\n", + #ifdef NEWSOS4 + "4" + #else + "" + #endif + ); exit (0); + #endif + #endif + + #if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); + #endif + + #if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); + #endif + + #if defined (NeXT) + #if !defined (__ARCHITECTURE__) + #define __ARCHITECTURE__ "m68k" + #endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); + #endif + + #if defined (MULTIMAX) || defined (n16) + #if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); + #else + #if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); + #else + printf ("ns32k-encore-bsd\n"); exit (0); + #endif + #endif + #endif + + #if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); + #endif + + #if defined (sequent) + #if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); + #endif + #if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); + #endif + #endif + + #if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + + #endif + + #if defined (vax) + # if !defined (ultrix) + # include + # if defined (BSD) + # if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); + # else + # if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); + # else + printf ("vax-dec-bsd\n"); exit (0); + # endif + # endif + # else + printf ("vax-dec-bsd\n"); exit (0); + # endif + # else + printf ("vax-dec-ultrix\n"); exit (0); + # endif + #endif + + #if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); + #endif + + exit (1); + } + EOF + + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + + # Apollos put the system type in the environment. + + test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + + # Convex versions that predate uname can use getsysinfo(1) + + if [ -x /usr/convex/getsysinfo ] + then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac + fi + + cat >&2 < in order to provide the needed + information to handle your system. + + config.guess timestamp = $timestamp + + uname -m = `(uname -m) 2>/dev/null || echo unknown` + uname -r = `(uname -r) 2>/dev/null || echo unknown` + uname -s = `(uname -s) 2>/dev/null || echo unknown` + uname -v = `(uname -v) 2>/dev/null || echo unknown` + + /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` + /bin/uname -X = `(/bin/uname -X) 2>/dev/null` + + hostinfo = `(hostinfo) 2>/dev/null` + /bin/universe = `(/bin/universe) 2>/dev/null` + /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` + /bin/arch = `(/bin/arch) 2>/dev/null` + /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` + /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + + UNAME_MACHINE = ${UNAME_MACHINE} + UNAME_RELEASE = ${UNAME_RELEASE} + UNAME_SYSTEM = ${UNAME_SYSTEM} + UNAME_VERSION = ${UNAME_VERSION} + EOF + + exit 1 + + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "timestamp='" + # time-stamp-format: "%:y-%02m-%02d" + # time-stamp-end: "'" + # End: diff -Nrc3pad gcc-3.0.4/boehm-gc/config.sub gcc-3.1/boehm-gc/config.sub *** gcc-3.0.4/boehm-gc/config.sub Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/config.sub Tue Feb 12 04:37:53 2002 *************** *** 0 **** --- 1,1440 ---- + #! /bin/sh + # Configuration validation subroutine script. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + # 2000, 2001, 2002 Free Software Foundation, Inc. + + timestamp='2002-01-02' + + # This file is (in principle) common to ALL GNU software. + # The presence of a machine in this file suggests that SOME GNU software + # can handle that machine. It does not imply ALL GNU software can. + # + # This file is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. + + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Please send patches to . Submit a context + # diff and a properly formatted ChangeLog entry. + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. + # Otherwise, we print the canonical config type on stdout and succeed. + + # This file is supposed to be the same for all GNU packages + # and recognize all the CPU types, system types and aliases + # that are meaningful with *any* GNU software. + # Each package is responsible for reporting which valid configurations + # it does not support. The user should be able to distinguish + # a failure to support a valid configuration from a meaningless + # configuration. + + # The goal of this file is to map all the various variations of a given + # machine specification into a single specification in the form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM + # or in some cases, the newer four-part form: + # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + # It is wrong to echo any other type of specification. + + me=`echo "$0" | sed -e 's,.*/,,'` + + usage="\ + Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + + Canonicalize a configuration name. + + Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + + Report bugs and patches to ." + + version="\ + GNU config.sub ($timestamp) + + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 + Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + + help=" + Try \`$me --help' for more information." + + # Parse command line + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac + done + + case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; + esac + + # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in + nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; + esac + + ### Let's recognize common machines as not being operating systems so + ### that things like config.sub decstation-3100 work. We also + ### recognize some manufacturers as not being operating systems, so we + ### can provide default operating systems below. + case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + esac + + # Decode aliases for certain CPU-COMPANY combinations. + case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ + | mipsisa32 \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[34] | sh[34]eb | shbe | shle \ + | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cray2-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ + | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* \ + | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [cjt]90) + basic_machine=${basic_machine}-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + # I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh3eb | sh4eb) + basic_machine=sh-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + esac + + # Here we canonicalize certain aliases for manufacturers. + case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; + esac + + # Decode manufacturer-specific aliases for certain operating systems. + + if [ x"$os" != x"" ] + then + case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* | -morphos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; + esac + else + + # Here we handle the default operating systems that come with various machines. + # The value should be what the vendor currently ships out the door with their + # machine or put another way, the most popular os provided with the machine. + + # Note that if you're going to try to match "-MANUFACTURER" here (say, + # "-sun"), then you have to tell the case statement up towards the top + # that MANUFACTURER isn't an operating system. Otherwise, code above + # will signal an error saying that MANUFACTURER isn't an operating + # system, and we'll never get to this point. + + case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; + esac + fi + + # Here we handle the case where we know the os, and the CPU type, but not the + # manufacturer. We pick the logical manufacturer. + vendor=unknown + case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; + esac + + echo $basic_machine$os + exit 0 + + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) + # time-stamp-start: "timestamp='" + # time-stamp-format: "%:y-%02m-%02d" + # time-stamp-end: "'" + # End: diff -Nrc3pad gcc-3.0.4/boehm-gc/configure gcc-3.1/boehm-gc/configure *** gcc-3.0.4/boehm-gc/configure Wed Feb 20 19:40:48 2002 --- gcc-3.1/boehm-gc/configure Wed May 15 02:40:18 2002 *************** ac_help="$ac_help *** 37,45 **** --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer" ac_help="$ac_help ! --enable-java-gc=TYPE choose garbage collector [boehm]" ac_help="$ac_help --with-ecos enable runtime eCos target support" # Initialize some variables set by options. # The variables have the same names as the options, with --- 37,49 ---- --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer" ac_help="$ac_help ! --enable-parallel-mark parallelize marking and free list construction" ac_help="$ac_help --with-ecos enable runtime eCos target support" + ac_help="$ac_help + --enable-shared[=PKGS] build shared libraries [default=no]" + ac_help="$ac_help + --enable-full-debug include full support for pointer backtracing etc." # Initialize some variables set by options. # The variables have the same names as the options, with *************** program_suffix=NONE *** 57,62 **** --- 61,67 ---- program_transform_name=s,x,x, silent= site= + sitefile= srcdir= target=NONE verbose= *************** Configuration: *** 171,176 **** --- 176,182 ---- --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages + --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX *************** EOF *** 341,346 **** --- 347,357 ---- -site=* | --site=* | --sit=*) site="$ac_optarg" ;; + -site-file | --site-file | --site-fil | --site-fi | --site-f) + ac_prev=sitefile ;; + -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) + sitefile="$ac_optarg" ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) *************** echo > confdefs.h *** 480,486 **** # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ! ac_unique_file=gc_mark.h # Find the source files, if location was not specified. if test -z "$srcdir"; then --- 491,497 ---- # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ! ac_unique_file=gcj_mlc.c # Find the source files, if location was not specified. if test -z "$srcdir"; then *************** fi *** 506,517 **** srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. ! if test -z "$CONFIG_SITE"; then ! if test "x$prefix" != xNONE; then ! CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ! else ! CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then --- 517,532 ---- srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. ! if test -z "$sitefile"; then ! if test -z "$CONFIG_SITE"; then ! if test "x$prefix" != xNONE; then ! CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ! else ! CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" ! fi fi + else + CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then *************** fi *** 551,556 **** --- 566,597 ---- + # This works around the fact that libtool configuration may change LD + # for this particular configuration, but some shells, instead of + # keeping the changes in LD private, export them just because LD is + # exported. + ORIGINAL_LD_FOR_MULTILIBS=$LD + + ac_aux_dir= + for ac_dir in . $srcdir/.; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi + done + if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in . $srcdir/." 1>&2; exit 1; } + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: *************** fi *** 563,569 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:567: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 604,610 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:608: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_SCRIPT" && INSTALL_SCR *** 616,622 **** test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:620: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile --- 657,663 ---- test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:661: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile *************** test "$program_suffix" != NONE && *** 673,679 **** test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:677: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 714,720 ---- test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:718: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 706,717 **** fi echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 ! echo "configure:710: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:751: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else --- 763,769 ---- return __CYGWIN__; ; return 0; } EOF ! if { (eval echo configure:767: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else *************** echo "$ac_t""$ac_cv_cygwin" 1>&6 *** 739,757 **** CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:743: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else --- 780,798 ---- CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:784: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else *************** fi *** 782,798 **** if test "${srcdir}" = "."; then ! if test "${with_target_subdir}" != "."; then ! boehm_gc_basedir="${srcdir}/${with_multisrctop}../." else ! boehm_gc_basedir="${srcdir}/${with_multisrctop}." fi else ! boehm_gc_basedir="${srcdir}/." fi ac_aux_dir= ! for ac_dir in $boehm_gc_basedir/.. $srcdir/$boehm_gc_basedir/..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" --- 823,839 ---- if test "${srcdir}" = "."; then ! if test "${with_target_subdir}" != "." -a -n "${with_target_subdir}"; then ! gc_basedir="${srcdir}/${with_multisrctop}../." else ! gc_basedir="${srcdir}/${with_multisrctop}." fi else ! gc_basedir="${srcdir}/." fi ac_aux_dir= ! for ac_dir in $gc_basedir/.. $srcdir/$gc_basedir/..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" *************** for ac_dir in $boehm_gc_basedir/.. $srcd *** 804,810 **** fi done if test -z "$ac_aux_dir"; then ! { echo "configure: error: can not find install-sh or install.sh in $boehm_gc_basedir/.. $srcdir/$boehm_gc_basedir/.." 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub --- 845,851 ---- fi done if test -z "$ac_aux_dir"; then ! { echo "configure: error: can not find install-sh or install.sh in $gc_basedir/.. $srcdir/$gc_basedir/.." 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub *************** else { echo "configure: error: can not r *** 862,868 **** fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:866: checking host system type" >&5 host_alias=$host case "$host_alias" in --- 903,909 ---- fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:907: checking host system type" >&5 host_alias=$host case "$host_alias" in *************** host_os=`echo $host | sed 's/^\([^-]*\)- *** 883,889 **** echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 ! echo "configure:887: checking target system type" >&5 target_alias=$target case "$target_alias" in --- 924,930 ---- echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 ! echo "configure:928: checking target system type" >&5 target_alias=$target case "$target_alias" in *************** target_os=`echo $target | sed 's/^\([^-] *** 901,907 **** echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:905: checking build system type" >&5 build_alias=$build case "$build_alias" in --- 942,948 ---- echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:946: checking build system type" >&5 build_alias=$build case "$build_alias" in *************** mkinstalldirs="`cd $ac_aux_dir && pwd`/m *** 929,937 **** ! PACKAGE=boehm-gc ! VERSION=5.1 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } --- 970,978 ---- ! PACKAGE=gc ! VERSION=6.0 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } *************** fi *** 941,947 **** missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:945: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 982,988 ---- missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:986: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 954,960 **** fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:958: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 995,1001 ---- fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:999: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 967,973 **** fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:971: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1008,1014 ---- fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:1012: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 980,986 **** fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:984: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1021,1027 ---- fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:1025: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 993,999 **** fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:997: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1034,1040 ---- fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:1038: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** fi *** 1019,1025 **** # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1023: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1060,1066 ---- # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1064: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -z "$CC"; then *** 1049,1055 **** # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1053: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1090,1096 ---- # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1094: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1098,1104 **** fi echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:1102: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1139,1145 ---- fi echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:1143: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1107,1113 **** yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1111: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no --- 1148,1154 ---- yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1152: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no *************** if test $ac_cv_prog_gcc = yes; then *** 1122,1128 **** ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:1126: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1163,1169 ---- ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:1167: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** do *** 1159,1165 **** # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1163: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1200,1206 ---- # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1204: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** test -n "$CXX" || CXX="gcc" *** 1192,1198 **** test -z "$CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 ! echo "configure:1196: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1233,1239 ---- test -z "$CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 ! echo "configure:1237: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1201,1207 **** yes; #endif EOF ! if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1205: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no --- 1242,1248 ---- yes; #endif EOF ! if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no *************** if test $ac_cv_prog_gxx = yes; then *** 1216,1222 **** ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 ! echo "configure:1220: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1257,1263 ---- ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 ! echo "configure:1261: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1249,1255 **** # NEWLIB_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:1253: checking build system type" >&5 build_alias=$build case "$build_alias" in --- 1290,1296 ---- # NEWLIB_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:1294: checking build system type" >&5 build_alias=$build case "$build_alias" in *************** echo "$ac_t""$build" 1>&6 *** 1270,1276 **** # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1274: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1311,1317 ---- # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1315: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1302,1308 **** # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1306: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1343,1349 ---- # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1347: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1334,1340 **** # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1338: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1375,1381 ---- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1379: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 1366,1372 **** # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1370: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1407,1413 ---- # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1411: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1411,1417 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1415: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1452,1458 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1456: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_DATA" && INSTALL_DATA= *** 1465,1471 **** echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:1469: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" --- 1506,1512 ---- echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:1510: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" *************** fi *** 1496,1505 **** # automake happy, but we don't execute it, since we don't care about # the result. if false; then echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1503: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1537,1550 ---- # automake happy, but we don't execute it, since we don't care about # the result. if false; then + # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands + # to nothing, so nothing would remain between `then' and `fi' if it + # were not for the `:' below. + : echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1548: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1509,1518 **** rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1513: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done --- 1554,1563 ---- rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1558: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj | *.ilk | *.pdb) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done *************** fi *** 1533,1553 **** . ${srcdir}/configure.host ! case ${boehm_gc_basedir} in ! /* | A-Za-z:/\\*) boehm_gc_flagbasedir=${boehm_gc_basedir} ;; ! *) boehm_gc_flagbasedir='$(top_builddir)/'${boehm_gc_basedir} ;; esac ! boehm_gc_cflags="${boehm_gc_cflags} -I"'$(top_builddir)'"/./targ-include -I${boehm_gc_flagbasedir}/libc/include" case "${host}" in *-*-cygwin32*) ! boehm_gc_cflags="${boehm_gc_cflags} -I${boehm_gc_flagbasedir}/../winsup/include" ;; esac - boehm_gc_cflags="${boehm_gc_cflags} -fno-builtin" ! BOEHM_GC_CFLAGS=${boehm_gc_cflags} --- 1578,1597 ---- . ${srcdir}/configure.host ! case ${gc_basedir} in ! /* | A-Za-z:/\\*) gc_flagbasedir=${gc_basedir} ;; ! *) gc_flagbasedir='$(top_builddir)/'${gc_basedir} ;; esac ! gc_cflags="${gc_cflags} -I"'$(top_builddir)'"/./targ-include -I${gc_flagbasedir}/libc/include" case "${host}" in *-*-cygwin32*) ! gc_cflags="${gc_cflags} -I${gc_flagbasedir}/../winsup/include" ;; esac ! GC_CFLAGS=${gc_cflags} *************** ac_prog=ld *** 1632,1638 **** if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1636: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw --- 1676,1682 ---- if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1680: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw *************** echo "configure:1636: checking for ld us *** 1662,1671 **** esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1666: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1669: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1706,1715 ---- esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1710: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1713: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 1700,1706 **** fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1704: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1744,1750 ---- fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1748: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** with_gnu_ld=$lt_cv_prog_gnu_ld *** 1717,1723 **** echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1721: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1761,1767 ---- echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1765: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** reload_flag=$lt_cv_ld_reload_flag *** 1729,1735 **** test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1733: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1773,1779 ---- test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1777: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** NM="$lt_cv_path_NM" *** 1767,1773 **** echo "$ac_t""$NM" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:1771: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1811,1817 ---- echo "$ac_t""$NM" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:1815: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1788,1794 **** fi echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1792: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1832,1838 ---- fi echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1836: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** file_magic_cmd=$lt_cv_file_magic_cmd *** 1952,1964 **** deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:1956: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:1962: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; --- 1996,2008 ---- deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:2000: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:2006: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; *************** case $deplibs_check_method in *** 1982,1988 **** file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:1986: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2026,2032 ---- file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:2030: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 2044,2050 **** if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:2048: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2088,2094 ---- if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:2092: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** esac *** 2115,2121 **** # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2119: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2159,2165 ---- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2163: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 2147,2153 **** # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2151: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2191,2197 ---- # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2195: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 2182,2188 **** # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2186: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2226,2232 ---- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2230: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 2214,2220 **** # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2218: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2258,2264 ---- # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2262: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** test x"$pic_mode" = xno && libtool_flags *** 2281,2288 **** case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 2285 "configure"' > conftest.$ac_ext ! if { (eval echo configure:2286: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" --- 2325,2332 ---- case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 2329 "configure"' > conftest.$ac_ext ! if { (eval echo configure:2330: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" *************** case $host in *** 2303,2309 **** SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:2307: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2347,2353 ---- SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:2351: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** ac_link='${CC-cc} -o conftest${ac_exeext *** 2316,2329 **** cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else --- 2360,2373 ---- cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else *************** echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6 *** 2353,2359 **** esac echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 ! echo "configure:2357: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 2397,2403 ---- esac echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 ! echo "configure:2401: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** ac_link='${CXX-g++} -o conftest${ac_exee *** 2366,2377 **** cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2375: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2410,2421 ---- cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2419: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** fi *** 2518,2524 **** echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:2522: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" --- 2562,2568 ---- echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:2566: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" *************** fi *** 2543,2553 **** # automake wants to see AC_EXEEXT. But we don't need it. And having # it is actually a problem, because the compiler we're passed can't # necessarily do a full link. So we fool automake here. ! if test "x" = "y"; then ! echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:2551: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2587,2601 ---- # automake wants to see AC_EXEEXT. But we don't need it. And having # it is actually a problem, because the compiler we're passed can't # necessarily do a full link. So we fool automake here. ! if false; then ! # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands ! # to nothing, so nothing would remain between `then' and `fi' if it ! # were not for the `:' below. ! : ! echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:2599: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 2557,2566 **** rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:2561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done --- 2605,2614 ---- rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:2609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj | *.ilk | *.pdb) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done *************** ac_exeext=$EXEEXT *** 2580,2590 **** fi echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6 ! echo "configure:2584: checking for thread model used by GCC" >&5 THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'` echo "$ac_t""$THREADS" 1>&6 ! INCLUDES= THREADLIBS= case "$THREADS" in no | none | single) --- 2628,2653 ---- fi echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6 ! echo "configure:2632: checking for thread model used by GCC" >&5 THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'` + if test -z "$THREADS"; then + THREADS=no + fi echo "$ac_t""$THREADS" 1>&6 ! # Check whether --enable-parallel-mark or --disable-parallel-mark was given. ! if test "${enable_parallel_mark+set}" = set; then ! enableval="$enable_parallel_mark" ! case "$THREADS" in ! no | none | single) ! { echo "configure: error: Parallel mark requires --enable-threads=x spec" 1>&2; exit 1; } ! ;; ! esac ! ! fi ! ! ! INCLUDES=-I${srcdir}/include THREADLIBS= case "$THREADS" in no | none | single) *************** case "$THREADS" in *** 2592,2601 **** ;; posix | pthreads) THREADS=posix case "$host" in *-*-linux*) cat >> confdefs.h <<\EOF ! #define LINUX_THREADS 1 EOF cat >> confdefs.h <<\EOF --- 2655,2685 ---- ;; posix | pthreads) THREADS=posix + THREADLIBS=-lpthread case "$host" in + x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux*) + cat >> confdefs.h <<\EOF + #define GC_LINUX_THREADS 1 + EOF + + cat >> confdefs.h <<\EOF + #define _REENTRANT 1 + EOF + + if test "${enable_parallel_mark}"; then + cat >> confdefs.h <<\EOF + #define PARALLEL_MARK 1 + EOF + + fi + cat >> confdefs.h <<\EOF + #define THREAD_LOCAL_ALLOC 1 + EOF + + ;; *-*-linux*) cat >> confdefs.h <<\EOF ! #define GC_LINUX_THREADS 1 EOF cat >> confdefs.h <<\EOF *************** EOF *** 2603,2628 **** EOF ;; *-*-solaris*) cat >> confdefs.h <<\EOF ! #define SOLARIS_THREADS 1 EOF cat >> confdefs.h <<\EOF ! #define _SOLARIS_PTHREADS 1 EOF ;; *-*-irix*) cat >> confdefs.h <<\EOF ! #define IRIX_THREADS 1 EOF ;; esac - THREADLIBS=-lpthread ;; ! decosf1 | irix | mach | os2 | solaris | win32 | dce | vxworks) { echo "configure: error: thread package $THREADS not yet supported" 1>&2; exit 1; } ;; *) --- 2687,2755 ---- EOF ;; + *-*-hpux*) + echo "configure: warning: "Only HP/UX 11 threads are supported."" 1>&2 + cat >> confdefs.h <<\EOF + #define GC_HPUX_THREADS 1 + EOF + + cat >> confdefs.h <<\EOF + #define _POSIX_C_SOURCE 199506L + EOF + + if test "${enable_parallel_mark}" = yes; then + cat >> confdefs.h <<\EOF + #define PARALLEL_MARK 1 + EOF + + fi + cat >> confdefs.h <<\EOF + #define THREAD_LOCAL_ALLOC 1 + EOF + + THREADLIBS="-lpthread -lrt" + ;; + *-*-freebsd*) + echo "configure: warning: "FreeBSD does not yet fully support threads with Boehm GC."" 1>&2 + cat >> confdefs.h <<\EOF + #define GC_FREEBSD_THREADS 1 + EOF + + INCLUDES="$INCLUDES -pthread" + THREADLIBS=-pthread + ;; *-*-solaris*) cat >> confdefs.h <<\EOF ! #define GC_SOLARIS_THREADS 1 EOF cat >> confdefs.h <<\EOF ! #define GC_SOLARIS_PTHREADS 1 EOF ;; *-*-irix*) cat >> confdefs.h <<\EOF ! #define GC_IRIX_THREADS 1 EOF ;; + *-*-cygwin*) + THREADLIBS= + ;; esac ;; ! win32) ! cat >> confdefs.h <<\EOF ! #define GC_WIN32_THREADS 1 ! EOF ! ! cat >> confdefs.h <<\EOF ! #define NO_GETENV 1 ! EOF ! ! ;; ! decosf1 | irix | mach | os2 | solaris | dce | vxworks) { echo "configure: error: thread package $THREADS not yet supported" 1>&2; exit 1; } ;; *) *************** esac *** 2632,2638 **** echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 ! echo "configure:2636: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 2759,2765 ---- echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 ! echo "configure:2763: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 2640,2646 **** ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 2778,2784 ---- dlopen() ; return 0; } EOF ! if { (eval echo configure:2782: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 2673,2691 **** ! # Check whether --enable-java-gc or --disable-java-gc was given. ! if test "${enable_java_gc+set}" = set; then ! enableval="$enable_java_gc" ! ! GC=$enableval ! else ! GC=boehm ! fi - target_all= - if test "$GC" = "boehm"; then - target_all=libgcjgc.la - fi TARGET_ECOS="no" --- 2800,2807 ---- ! target_all=libgcjgc.la TARGET_ECOS="no" *************** esac *** 2718,2728 **** machdep= case "$host" in ! # alpha_mach_dep.s assumes that pointers are not saved in fp registers. ! # Gcc on a 21264 can spill pointers to fp registers. Oops. ! # alpha*-*-*) ! # machdep="alpha_mach_dep.lo" ! # ;; i?86-*-solaris2.[89]*) cat >> confdefs.h <<\EOF #define SOLARIS25_PROC_VDB_BUG_FIXED 1 --- 2834,2871 ---- machdep= case "$host" in ! alpha*-*-openbsd*) ! machdep="alpha_mach_dep.lo" ! if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then ! echo "configure: warning: OpenBSD/Alpha without dlopen(). Shared library support is disabled" 1>&2 ! # Check whether --enable-shared or --disable-shared was given. ! if test "${enable_shared+set}" = set; then ! enableval="$enable_shared" ! p=${PACKAGE-default} ! case $enableval in ! yes) enable_shared=yes ;; ! no) enable_shared=no ;; ! *) ! enable_shared=no ! # Look at the argument we got. We use all the common list separators. ! IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," ! for pkg in $enableval; do ! if test "X$pkg" = "X$p"; then ! enable_shared=yes ! fi ! done ! IFS="$ac_save_ifs" ! ;; ! esac ! else ! enable_shared=no ! fi ! ! fi ! ;; ! alpha*-*-*) ! machdep="alpha_mach_dep.lo" ! ;; i?86-*-solaris2.[89]*) cat >> confdefs.h <<\EOF #define SOLARIS25_PROC_VDB_BUG_FIXED 1 *************** EOF *** 2751,2761 **** --- 2894,2911 ---- ;; sparc-sun-solaris2.3*) + machdep="sparc_mach_dep.lo" cat >> confdefs.h <<\EOF #define SUNOS53_SHARED_LIB 1 EOF ;; + sparc-sun-solaris2.*) + machdep="sparc_mach_dep.lo" + ;; + ia64-*-*) + machdep="mach_dep.lo ia64_save_regs_in_stack.lo" + ;; esac if test x"$machdep" = x; then machdep="mach_dep.lo" *************** cat >> confdefs.h <<\EOF *** 2793,2798 **** --- 2943,2957 ---- EOF cat >> confdefs.h <<\EOF + #define NO_EXECUTE_PERMISSION 1 + EOF + + cat >> confdefs.h <<\EOF + #define ALL_INTERIOR_POINTERS 1 + EOF + + + cat >> confdefs.h <<\EOF #define JAVA_FINALIZATION 1 EOF *************** cat >> confdefs.h <<\EOF *** 2800,2805 **** --- 2959,2968 ---- #define GC_GCJ_SUPPORT 1 EOF + cat >> confdefs.h <<\EOF + #define ATOMIC_UNCOLLECTABLE 1 + EOF + if test -n "${with_cross_host}"; then cat >> confdefs.h <<\EOF *************** if test -n "${with_cross_host}"; then *** 2807,2827 **** EOF cat >> confdefs.h <<\EOF ! #define NO_CLOCK 1 EOF ! cat >> confdefs.h <<\EOF ! #define SMALL_CONFIG 1 EOF ! cat >> confdefs.h <<\EOF ! #define NO_DEBUGGING 1 EOF fi if test -z "$with_cross_host"; then USE_LIBDIR_TRUE= USE_LIBDIR_FALSE='#' --- 2970,3018 ---- EOF cat >> confdefs.h <<\EOF ! #define NO_DEBUGGING 1 EOF ! fi ! ! # Check whether --enable-full-debug or --disable-full-debug was given. ! if test "${enable_full_debug+set}" = set; then ! enableval="$enable_full_debug" ! if test "$enable_full_debug" = "yes"; then ! echo "configure: warning: "Must define GC_DEBUG and use debug alloc. in clients."" 1>&2 ! cat >> confdefs.h <<\EOF ! #define KEEP_BACK_PTRS 1 EOF ! cat >> confdefs.h <<\EOF ! #define DBG_HDRS_ALL 1 EOF + case $host in + ia64-*-linux* ) + cat >> confdefs.h <<\EOF + #define MAKE_BACK_GRAPH 1 + EOF + + ;; + x86-*-linux* | i586-*-linux* | i686-*-linux* ) + cat >> confdefs.h <<\EOF + #define MAKE_BACK_GRAPH 1 + EOF + + echo "configure: warning: "Client must not use -fomit-frame-pointer."" 1>&2 + cat >> confdefs.h <<\EOF + #define SAVE_CALL_COUNT 8 + EOF + + ;; + esac + fi fi + if test -z "$with_cross_host"; then USE_LIBDIR_TRUE= USE_LIBDIR_FALSE='#' *************** done *** 2949,2955 **** ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" ! trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then --- 3265,3271 ---- cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then *************** target=${target} *** 3141,3147 **** with_multisubdir=${with_multisubdir} ac_configure_args="${multilib_arg} ${ac_configure_args}" CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} ! boehm_gc_basedir=${boehm_gc_basedir} CC="${CC}" DEFS="$DEFS" --- 3332,3338 ---- with_multisubdir=${with_multisubdir} ac_configure_args="${multilib_arg} ${ac_configure_args}" CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} ! gc_basedir=${gc_basedir} CC="${CC}" DEFS="$DEFS" *************** cat >> $CONFIG_STATUS <<\EOF *** 3151,3157 **** echo "$DEFS" > boehm-cflags if test -n "$CONFIG_FILES"; then ! ac_file=Makefile . ${boehm_gc_basedir}/../config-ml.in fi exit 0 EOF --- 3342,3349 ---- echo "$DEFS" > boehm-cflags if test -n "$CONFIG_FILES"; then ! LD="${ORIGINAL_LD_FOR_MULTILIBS}" ! ac_file=Makefile . ${gc_basedir}/../config-ml.in fi exit 0 EOF diff -Nrc3pad gcc-3.0.4/boehm-gc/configure.host gcc-3.1/boehm-gc/configure.host *** gcc-3.0.4/boehm-gc/configure.host Wed Jun 30 12:43:22 1999 --- gcc-3.1/boehm-gc/configure.host Sat Aug 18 01:04:42 2001 *************** *** 1,6 **** # configure.host ! # This shell script handles all host based configuration for boehm_gc. # It sets various shell variables based on the the host and the # configuration options. You can modify this shell script without # needing to rerun autoconf. --- 1,7 ---- # configure.host ! # This shell script handles all host based configuration for the garbage ! # collector. # It sets various shell variables based on the the host and the # configuration options. You can modify this shell script without # needing to rerun autoconf. *************** *** 15,30 **** # target_optspace --enable-target-optspace ("yes", "no", "") # It sets the following shell variables: ! # boehm_gc_cflags Special CFLAGS to use when building ! boehm_gc_cflags= case "${target_optspace}:${host}" in yes:*) ! boehm_gc_cflags="${boehm_gc_cflags} -Os" ;; :m32r-* | :d10v-* | :d30v-*) ! boehm_gc_cflags="${boehm_gc_cflags} -Os" ;; no:* | :*) # Nothing. --- 16,40 ---- # target_optspace --enable-target-optspace ("yes", "no", "") # It sets the following shell variables: ! # gc_cflags Special CFLAGS to use when building ! # We should set -fexceptions if we are using gcc and might be used ! # inside something like gcj. This is the zeroth approximation: ! case "$host" in ! *-*-linux* ) ! gc_cflags=-fexceptions ! ;; ! *-*-hpux* ) ! gc_cflags=+ESdbgasm ! ;; ! esac case "${target_optspace}:${host}" in yes:*) ! gc_cflags="${gc_cflags} -Os" ;; :m32r-* | :d10v-* | :d30v-*) ! gc_cflags="${gc_cflags} -Os" ;; no:* | :*) # Nothing. diff -Nrc3pad gcc-3.0.4/boehm-gc/configure.in gcc-3.1/boehm-gc/configure.in *** gcc-3.0.4/boehm-gc/configure.in Wed Sep 26 13:10:55 2001 --- gcc-3.1/boehm-gc/configure.in Wed May 8 04:25:22 2002 *************** *** 1,8 **** dnl Process this file with autoconf to produce configure. ! AC_INIT(gc_mark.h) ! BOEHM_CONFIGURE(.) AM_PROG_LIBTOOL --- 1,30 ---- + # Copyright (c) 1999, 2000, 2001, 2002 by Red Hat, Inc. All rights reserved. + # + # THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + # OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + # + # Permission is hereby granted to use or copy this program + # for any purpose, provided the above notices are retained on all copies. + # Permission to modify the code and to distribute modified code is granted, + # provided the above notices are retained, and a notice that the code was + # modified is included with the above copyright notice. + # + # Original author: Tom Tromey + dnl Process this file with autoconf to produce configure. ! AC_INIT(gcj_mlc.c) ! # This works around the fact that libtool configuration may change LD ! # for this particular configuration, but some shells, instead of ! # keeping the changes in LD private, export them just because LD is ! # exported. ! ORIGINAL_LD_FOR_MULTILIBS=$LD ! ! dnl Can't be done in GC_CONFIGURE because that confuses automake. ! AC_CONFIG_AUX_DIR(.) ! ! GC_CONFIGURE(.) AM_PROG_LIBTOOL *************** AM_MAINTAINER_MODE *** 17,31 **** # automake wants to see AC_EXEEXT. But we don't need it. And having # it is actually a problem, because the compiler we're passed can't # necessarily do a full link. So we fool automake here. ! if test "x" = "y"; then ! AC_EXEEXT fi AC_MSG_CHECKING([for thread model used by GCC]) THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'` AC_MSG_RESULT([$THREADS]) ! INCLUDES= THREADLIBS= case "$THREADS" in no | none | single) --- 39,69 ---- # automake wants to see AC_EXEEXT. But we don't need it. And having # it is actually a problem, because the compiler we're passed can't # necessarily do a full link. So we fool automake here. ! if false; then ! # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands ! # to nothing, so nothing would remain between `then' and `fi' if it ! # were not for the `:' below. ! : ! AC_EXEEXT fi AC_MSG_CHECKING([for thread model used by GCC]) THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'` + if test -z "$THREADS"; then + THREADS=no + fi AC_MSG_RESULT([$THREADS]) ! AC_ARG_ENABLE(parallel-mark, ! [ --enable-parallel-mark parallelize marking and free list construction], ! [case "$THREADS" in ! no | none | single) ! AC_MSG_ERROR([Parallel mark requires --enable-threads=x spec]) ! ;; ! esac] ! ) ! ! INCLUDES=-I${srcdir}/include THREADLIBS= case "$THREADS" in no | none | single) *************** case "$THREADS" in *** 33,54 **** ;; posix | pthreads) THREADS=posix case "$host" in *-*-linux*) ! AC_DEFINE(LINUX_THREADS) AC_DEFINE(_REENTRANT) ;; *-*-solaris*) ! AC_DEFINE(SOLARIS_THREADS) ! AC_DEFINE(_SOLARIS_PTHREADS) ;; *-*-irix*) ! AC_DEFINE(IRIX_THREADS) ;; esac - THREADLIBS=-lpthread ;; ! decosf1 | irix | mach | os2 | solaris | win32 | dce | vxworks) AC_MSG_ERROR(thread package $THREADS not yet supported) ;; *) --- 71,123 ---- ;; posix | pthreads) THREADS=posix + THREADLIBS=-lpthread case "$host" in + x86-*-linux* | ia64-*-linux* | i586-*-linux* | i686-*-linux*) + AC_DEFINE(GC_LINUX_THREADS) + AC_DEFINE(_REENTRANT) + if test "${enable_parallel_mark}"; then + AC_DEFINE(PARALLEL_MARK) + fi + AC_DEFINE(THREAD_LOCAL_ALLOC) + ;; *-*-linux*) ! AC_DEFINE(GC_LINUX_THREADS) AC_DEFINE(_REENTRANT) ;; + *-*-hpux*) + AC_MSG_WARN("Only HP/UX 11 threads are supported.") + AC_DEFINE(GC_HPUX_THREADS) + AC_DEFINE(_POSIX_C_SOURCE,199506L) + if test "${enable_parallel_mark}" = yes; then + AC_DEFINE(PARALLEL_MARK) + fi + AC_DEFINE(THREAD_LOCAL_ALLOC) + THREADLIBS="-lpthread -lrt" + ;; + *-*-freebsd*) + AC_MSG_WARN("FreeBSD does not yet fully support threads with Boehm GC.") + AC_DEFINE(GC_FREEBSD_THREADS) + INCLUDES="$INCLUDES -pthread" + THREADLIBS=-pthread + ;; *-*-solaris*) ! AC_DEFINE(GC_SOLARIS_THREADS) ! AC_DEFINE(GC_SOLARIS_PTHREADS) ;; *-*-irix*) ! AC_DEFINE(GC_IRIX_THREADS) ! ;; ! *-*-cygwin*) ! THREADLIBS= ;; esac ;; ! win32) ! AC_DEFINE(GC_WIN32_THREADS) ! AC_DEFINE(NO_GETENV) ! ;; ! decosf1 | irix | mach | os2 | solaris | dce | vxworks) AC_MSG_ERROR(thread package $THREADS not yet supported) ;; *) *************** AC_SUBST(THREADLIBS) *** 60,76 **** AC_CHECK_LIB(dl, dlopen, EXTRA_TEST_LIBS="$EXTRA_TEST_LIBS -ldl") AC_SUBST(EXTRA_TEST_LIBS) ! AC_ARG_ENABLE(java-gc, ! changequote(<<,>>)dnl ! << --enable-java-gc=TYPE choose garbage collector [boehm]>>, ! changequote([,]) ! GC=$enableval, ! GC=boehm) ! target_all= ! if test "$GC" = "boehm"; then ! target_all=libgcjgc.la ! fi AC_SUBST(target_all) dnl If the target is an eCos system, use the appropriate eCos dnl I/O routines. --- 129,137 ---- AC_CHECK_LIB(dl, dlopen, EXTRA_TEST_LIBS="$EXTRA_TEST_LIBS -ldl") AC_SUBST(EXTRA_TEST_LIBS) ! target_all=libgcjgc.la AC_SUBST(target_all) + AC_SUBST(target_alias) dnl If the target is an eCos system, use the appropriate eCos dnl I/O routines. *************** AC_SUBST(CXXINCLUDES) *** 100,110 **** machdep= case "$host" in ! # alpha_mach_dep.s assumes that pointers are not saved in fp registers. ! # Gcc on a 21264 can spill pointers to fp registers. Oops. ! # alpha*-*-*) ! # machdep="alpha_mach_dep.lo" ! # ;; i?86-*-solaris2.[[89]]*) AC_DEFINE(SOLARIS25_PROC_VDB_BUG_FIXED) ;; --- 161,176 ---- machdep= case "$host" in ! alpha*-*-openbsd*) ! machdep="alpha_mach_dep.lo" ! if test x"${ac_cv_lib_dl_dlopen}" != xyes ; then ! AC_MSG_WARN(OpenBSD/Alpha without dlopen(). Shared library support is disabled) ! AM_DISABLE_SHARED ! fi ! ;; ! alpha*-*-*) ! machdep="alpha_mach_dep.lo" ! ;; i?86-*-solaris2.[[89]]*) AC_DEFINE(SOLARIS25_PROC_VDB_BUG_FIXED) ;; *************** case "$host" in *** 121,128 **** --- 187,201 ---- AC_DEFINE(NO_EXECUTE_PERMISSION) ;; sparc-sun-solaris2.3*) + machdep="sparc_mach_dep.lo" AC_DEFINE(SUNOS53_SHARED_LIB) ;; + sparc-sun-solaris2.*) + machdep="sparc_mach_dep.lo" + ;; + ia64-*-*) + machdep="mach_dep.lo ia64_save_regs_in_stack.lo" + ;; esac if test x"$machdep" = x; then machdep="mach_dep.lo" *************** dnl We need to override the top-level CF *** 154,176 **** MY_CFLAGS="$CFLAGS" AC_SUBST(MY_CFLAGS) ! dnl Define a few things to retarget the library towards ! dnl embedded Java. AC_DEFINE(SILENT) AC_DEFINE(NO_SIGNALS) AC_DEFINE(JAVA_FINALIZATION) AC_DEFINE(GC_GCJ_SUPPORT) dnl This is something of a hack. When cross-compiling we turn off ! dnl some functionality. We also enable the "small" configuration. ! dnl These is only correct when targetting an embedded system. FIXME. if test -n "${with_cross_host}"; then AC_DEFINE(NO_SIGSET) - AC_DEFINE(NO_CLOCK) - AC_DEFINE(SMALL_CONFIG) AC_DEFINE(NO_DEBUGGING) fi AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host") if test "${multilib}" = "yes"; then --- 227,270 ---- MY_CFLAGS="$CFLAGS" AC_SUBST(MY_CFLAGS) ! dnl Include defines that have become de facto standard. ! dnl ALL_INTERIOR_POINTERS can be overridden in startup code. AC_DEFINE(SILENT) AC_DEFINE(NO_SIGNALS) + AC_DEFINE(NO_EXECUTE_PERMISSION) + AC_DEFINE(ALL_INTERIOR_POINTERS) + + dnl By default, make the library as general as possible. AC_DEFINE(JAVA_FINALIZATION) AC_DEFINE(GC_GCJ_SUPPORT) + AC_DEFINE(ATOMIC_UNCOLLECTABLE) dnl This is something of a hack. When cross-compiling we turn off ! dnl some functionality. These is only correct when targetting an ! dnl embedded system. FIXME. if test -n "${with_cross_host}"; then AC_DEFINE(NO_SIGSET) AC_DEFINE(NO_DEBUGGING) fi + AC_ARG_ENABLE(full-debug, + [ --enable-full-debug include full support for pointer backtracing etc.], + [ if test "$enable_full_debug" = "yes"; then + AC_MSG_WARN("Must define GC_DEBUG and use debug alloc. in clients.") + AC_DEFINE(KEEP_BACK_PTRS) + AC_DEFINE(DBG_HDRS_ALL) + case $host in + ia64-*-linux* ) + AC_DEFINE(MAKE_BACK_GRAPH) + ;; + x86-*-linux* | i586-*-linux* | i686-*-linux* ) + AC_DEFINE(MAKE_BACK_GRAPH) + AC_MSG_WARN("Client must not use -fomit-frame-pointer.") + AC_DEFINE(SAVE_CALL_COUNT, 8) + ;; + esac ] + fi) + AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host") if test "${multilib}" = "yes"; then *************** else *** 179,193 **** multilib_arg= fi ! AC_OUTPUT(Makefile, ! [ ! dnl Put all the -D options in a file. These are required before ! dnl boehm-config.h can be included. This is a huge hack brought ! dnl about by overall poor structuring of this entire library. echo "$DEFS" > boehm-cflags if test -n "$CONFIG_FILES"; then ! ac_file=Makefile . ${boehm_gc_basedir}/../config-ml.in fi], srcdir=${srcdir} host=${host} --- 273,285 ---- multilib_arg= fi ! AC_OUTPUT(Makefile include/Makefile, [ ! dnl Put all the -D options in a file. echo "$DEFS" > boehm-cflags if test -n "$CONFIG_FILES"; then ! LD="${ORIGINAL_LD_FOR_MULTILIBS}" ! ac_file=Makefile . ${gc_basedir}/../config-ml.in fi], srcdir=${srcdir} host=${host} *************** target=${target} *** 195,201 **** with_multisubdir=${with_multisubdir} ac_configure_args="${multilib_arg} ${ac_configure_args}" CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} ! boehm_gc_basedir=${boehm_gc_basedir} CC="${CC}" DEFS="$DEFS" ) --- 287,293 ---- with_multisubdir=${with_multisubdir} ac_configure_args="${multilib_arg} ${ac_configure_args}" CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} ! gc_basedir=${gc_basedir} CC="${CC}" DEFS="$DEFS" ) diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/README gcc-3.1/boehm-gc/cord/README *** gcc-3.0.4/boehm-gc/cord/README Wed Apr 7 14:56:06 1999 --- gcc-3.1/boehm-gc/cord/README Thu Jan 1 00:00:00 1970 *************** *** 1,31 **** - Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved. - - THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - - Permission is hereby granted to use or copy this program - for any purpose, provided the above notices are retained on all copies. - Permission to modify the code and to distribute modified code is granted, - provided the above notices are retained, and a notice that the code was - modified is included with the above copyright notice. - - Please send bug reports to Hans-J. Boehm (boehm@sgi.com). - - This is a string packages that uses a tree-based representation. - See cord.h for a description of the functions provided. Ec.h describes - "extensible cords", which are essentially output streams that write - to a cord. These allow for efficient construction of cords without - requiring a bound on the size of a cord. - - de.c is a very dumb text editor that illustrates the use of cords. - It maintains a list of file versions. Each version is simply a - cord representing the file contents. Nonetheless, standard - editing operations are efficient, even on very large files. - (Its 3 line "user manual" can be obtained by invoking it without - arguments. Note that ^R^N and ^R^P move the cursor by - almost a screen. It does not understand tabs, which will show - up as highlighred "I"s. Use the UNIX "expand" program first.) - To build the editor, type "make cord/de" in the gc directory. - - This package assumes an ANSI C compiler such as gcc. It will - not compile with an old-style K&R compiler. --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/SCOPTIONS.amiga gcc-3.1/boehm-gc/cord/SCOPTIONS.amiga *** gcc-3.0.4/boehm-gc/cord/SCOPTIONS.amiga Wed Apr 7 14:56:06 1999 --- gcc-3.1/boehm-gc/cord/SCOPTIONS.amiga Thu Jan 1 00:00:00 1970 *************** *** 1,14 **** - MATH=STANDARD - CPU=68030 - NOSTACKCHECK - OPTIMIZE - VERBOSE - NOVERSION - NOICONS - OPTIMIZERTIME - INCLUDEDIR=/ - DEFINE AMIGA - LIBRARY=cord.lib - LIBRARY=/gc.lib - IGNORE=100 - IGNORE=161 --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/SMakefile.amiga gcc-3.1/boehm-gc/cord/SMakefile.amiga *** gcc-3.0.4/boehm-gc/cord/SMakefile.amiga Wed Apr 7 14:56:06 1999 --- gcc-3.1/boehm-gc/cord/SMakefile.amiga Thu Jan 1 00:00:00 1970 *************** *** 1,20 **** - # Makefile for cord.lib - # Michel Schinz 1994/07/20 - - OBJS = cordbscs.o cordprnt.o cordxtra.o - - all: cord.lib cordtest - - cordbscs.o: cordbscs.c - cordprnt.o: cordprnt.c - cordxtra.o: cordxtra.c - cordtest.o: cordtest.c - - cord.lib: $(OBJS) - oml cord.lib r $(OBJS) - - cordtest: cordtest.o cord.lib - sc cordtest.o link - - clean: - delete cord.lib cordtest \#?.o \#?.lnk --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/cord.h gcc-3.1/boehm-gc/cord/cord.h *** gcc-3.0.4/boehm-gc/cord/cord.h Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/cord/cord.h Thu Jan 1 00:00:00 1970 *************** *** 1,327 **** - /* - * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - * - * Author: Hans-J. Boehm (boehm@parc.xerox.com) - */ - /* Boehm, October 5, 1995 4:20 pm PDT */ - - /* - * Cords are immutable character strings. A number of operations - * on long cords are much more efficient than their strings.h counterpart. - * In particular, concatenation takes constant time independent of the length - * of the arguments. (Cords are represented as trees, with internal - * nodes representing concatenation and leaves consisting of either C - * strings or a functional description of the string.) - * - * The following are reasonable applications of cords. They would perform - * unacceptably if C strings were used: - * - A compiler that produces assembly language output by repeatedly - * concatenating instructions onto a cord representing the output file. - * - A text editor that converts the input file to a cord, and then - * performs editing operations by producing a new cord representing - * the file after echa character change (and keeping the old ones in an - * edit history) - * - * For optimal performance, cords should be built by - * concatenating short sections. - * This interface is designed for maximum compatibility with C strings. - * ASCII NUL characters may be embedded in cords using CORD_from_fn. - * This is handled correctly, but CORD_to_char_star will produce a string - * with embedded NULs when given such a cord. - * - * This interface is fairly big, largely for performance reasons. - * The most basic constants and functions: - * - * CORD - the type of a cord; - * CORD_EMPTY - empty cord; - * CORD_len(cord) - length of a cord; - * CORD_cat(cord1,cord2) - concatenation of two cords; - * CORD_substr(cord, start, len) - substring (or subcord); - * CORD_pos i; CORD_FOR(i, cord) { ... CORD_pos_fetch(i) ... } - - * examine each character in a cord. CORD_pos_fetch(i) is the char. - * CORD_fetch(int i) - Retrieve i'th character (slowly). - * CORD_cmp(cord1, cord2) - compare two cords. - * CORD_from_file(FILE * f) - turn a read-only file into a cord. - * CORD_to_char_star(cord) - convert to C string. - * (Non-NULL C constant strings are cords.) - * CORD_printf (etc.) - cord version of printf. Use %r for cords. - */ - # ifndef CORD_H - - # define CORD_H - # include - # include - /* Cords have type const char *. This is cheating quite a bit, and not */ - /* 100% portable. But it means that nonempty character string */ - /* constants may be used as cords directly, provided the string is */ - /* never modified in place. The empty cord is represented by, and */ - /* can be written as, 0. */ - - typedef const char * CORD; - - /* An empty cord is always represented as nil */ - # define CORD_EMPTY 0 - - /* Is a nonempty cord represented as a C string? */ - #define CORD_IS_STRING(s) (*(s) != '\0') - - /* Concatenate two cords. If the arguments are C strings, they may */ - /* not be subsequently altered. */ - CORD CORD_cat(CORD x, CORD y); - - /* Concatenate a cord and a C string with known length. Except for the */ - /* empty string case, this is a special case of CORD_cat. Since the */ - /* length is known, it can be faster. */ - /* The string y is shared with the resulting CORD. Hence it should */ - /* not be altered by the caller. */ - CORD CORD_cat_char_star(CORD x, const char * y, size_t leny); - - /* Compute the length of a cord */ - size_t CORD_len(CORD x); - - /* Cords may be represented by functions defining the ith character */ - typedef char (* CORD_fn)(size_t i, void * client_data); - - /* Turn a functional description into a cord. */ - CORD CORD_from_fn(CORD_fn fn, void * client_data, size_t len); - - /* Return the substring (subcord really) of x with length at most n, */ - /* starting at position i. (The initial character has position 0.) */ - CORD CORD_substr(CORD x, size_t i, size_t n); - - /* Return the argument, but rebalanced to allow more efficient */ - /* character retrieval, substring operations, and comparisons. */ - /* This is useful only for cords that were built using repeated */ - /* concatenation. Guarantees log time access to the result, unless */ - /* x was obtained through a large number of repeated substring ops */ - /* or the embedded functional descriptions take longer to evaluate. */ - /* May reallocate significant parts of the cord. The argument is not */ - /* modified; only the result is balanced. */ - CORD CORD_balance(CORD x); - - /* The following traverse a cord by applying a function to each */ - /* character. This is occasionally appropriate, especially where */ - /* speed is crucial. But, since C doesn't have nested functions, */ - /* clients of this sort of traversal are clumsy to write. Consider */ - /* the functions that operate on cord positions instead. */ - - /* Function to iteratively apply to individual characters in cord. */ - typedef int (* CORD_iter_fn)(char c, void * client_data); - - /* Function to apply to substrings of a cord. Each substring is a */ - /* a C character string, not a general cord. */ - typedef int (* CORD_batched_iter_fn)(const char * s, void * client_data); - # define CORD_NO_FN ((CORD_batched_iter_fn)0) - - /* Apply f1 to each character in the cord, in ascending order, */ - /* starting at position i. If */ - /* f2 is not CORD_NO_FN, then multiple calls to f1 may be replaced by */ - /* a single call to f2. The parameter f2 is provided only to allow */ - /* some optimization by the client. This terminates when the right */ - /* end of this string is reached, or when f1 or f2 return != 0. In the */ - /* latter case CORD_iter returns != 0. Otherwise it returns 0. */ - /* The specified value of i must be < CORD_len(x). */ - int CORD_iter5(CORD x, size_t i, CORD_iter_fn f1, - CORD_batched_iter_fn f2, void * client_data); - - /* A simpler version that starts at 0, and without f2: */ - int CORD_iter(CORD x, CORD_iter_fn f1, void * client_data); - # define CORD_iter(x, f1, cd) CORD_iter5(x, 0, f1, CORD_NO_FN, cd) - - /* Similar to CORD_iter5, but end-to-beginning. No provisions for */ - /* CORD_batched_iter_fn. */ - int CORD_riter4(CORD x, size_t i, CORD_iter_fn f1, void * client_data); - - /* A simpler version that starts at the end: */ - int CORD_riter(CORD x, CORD_iter_fn f1, void * client_data); - - /* Functions that operate on cord positions. The easy way to traverse */ - /* cords. A cord position is logically a pair consisting of a cord */ - /* and an index into that cord. But it is much faster to retrieve a */ - /* charcter based on a position than on an index. Unfortunately, */ - /* positions are big (order of a few 100 bytes), so allocate them with */ - /* caution. */ - /* Things in cord_pos.h should be treated as opaque, except as */ - /* described below. Also note that */ - /* CORD_pos_fetch, CORD_next and CORD_prev have both macro and function */ - /* definitions. The former may evaluate their argument more than once. */ - # include "private/cord_pos.h" - - /* - Visible definitions from above: - - typedef CORD_pos[1]; - - * Extract the cord from a position: - CORD CORD_pos_to_cord(CORD_pos p); - - * Extract the current index from a position: - size_t CORD_pos_to_index(CORD_pos p); - - * Fetch the character located at the given position: - char CORD_pos_fetch(CORD_pos p); - - * Initialize the position to refer to the given cord and index. - * Note that this is the most expensive function on positions: - void CORD_set_pos(CORD_pos p, CORD x, size_t i); - - * Advance the position to the next character. - * P must be initialized and valid. - * Invalidates p if past end: - void CORD_next(CORD_pos p); - - * Move the position to the preceding character. - * P must be initialized and valid. - * Invalidates p if past beginning: - void CORD_prev(CORD_pos p); - - * Is the position valid, i.e. inside the cord? - int CORD_pos_valid(CORD_pos p); - */ - # define CORD_FOR(pos, cord) \ - for (CORD_set_pos(pos, cord, 0); CORD_pos_valid(pos); CORD_next(pos)) - - - /* An out of memory handler to call. May be supplied by client. */ - /* Must not return. */ - extern void (* CORD_oom_fn)(void); - - /* Dump the representation of x to stdout in an implementation defined */ - /* manner. Intended for debugging only. */ - void CORD_dump(CORD x); - - /* The following could easily be implemented by the client. They are */ - /* provided in cordxtra.c for convenience. */ - - /* Concatenate a character to the end of a cord. */ - CORD CORD_cat_char(CORD x, char c); - - /* Concatenate n cords. */ - CORD CORD_catn(int n, /* CORD */ ...); - - /* Return the character in CORD_substr(x, i, 1) */ - char CORD_fetch(CORD x, size_t i); - - /* Return < 0, 0, or > 0, depending on whether x < y, x = y, x > y */ - int CORD_cmp(CORD x, CORD y); - - /* A generalization that takes both starting positions for the */ - /* comparison, and a limit on the number of characters to be compared. */ - int CORD_ncmp(CORD x, size_t x_start, CORD y, size_t y_start, size_t len); - - /* Find the first occurrence of s in x at position start or later. */ - /* Return the position of the first character of s in x, or */ - /* CORD_NOT_FOUND if there is none. */ - size_t CORD_str(CORD x, size_t start, CORD s); - - /* Return a cord consisting of i copies of (possibly NUL) c. Dangerous */ - /* in conjunction with CORD_to_char_star. */ - /* The resulting representation takes constant space, independent of i. */ - CORD CORD_chars(char c, size_t i); - # define CORD_nul(i) CORD_chars('\0', (i)) - - /* Turn a file into cord. The file must be seekable. Its contents */ - /* must remain constant. The file may be accessed as an immediate */ - /* result of this call and/or as a result of subsequent accesses to */ - /* the cord. Short files are likely to be immediately read, but */ - /* long files are likely to be read on demand, possibly relying on */ - /* stdio for buffering. */ - /* We must have exclusive access to the descriptor f, i.e. we may */ - /* read it at any time, and expect the file pointer to be */ - /* where we left it. Normally this should be invoked as */ - /* CORD_from_file(fopen(...)) */ - /* CORD_from_file arranges to close the file descriptor when it is no */ - /* longer needed (e.g. when the result becomes inaccessible). */ - /* The file f must be such that ftell reflects the actual character */ - /* position in the file, i.e. the number of characters that can be */ - /* or were read with fread. On UNIX systems this is always true. On */ - /* MS Windows systems, f must be opened in binary mode. */ - CORD CORD_from_file(FILE * f); - - /* Equivalent to the above, except that the entire file will be read */ - /* and the file pointer will be closed immediately. */ - /* The binary mode restriction from above does not apply. */ - CORD CORD_from_file_eager(FILE * f); - - /* Equivalent to the above, except that the file will be read on demand.*/ - /* The binary mode restriction applies. */ - CORD CORD_from_file_lazy(FILE * f); - - /* Turn a cord into a C string. The result shares no structure with */ - /* x, and is thus modifiable. */ - char * CORD_to_char_star(CORD x); - - /* Turn a C string into a CORD. The C string is copied, and so may */ - /* subsequently be modified. */ - CORD CORD_from_char_star(const char *s); - - /* Identical to the above, but the result may share structure with */ - /* the argument and is thus not modifiable. */ - const char * CORD_to_const_char_star(CORD x); - - /* Write a cord to a file, starting at the current position. No */ - /* trailing NULs are newlines are added. */ - /* Returns EOF if a write error occurs, 1 otherwise. */ - int CORD_put(CORD x, FILE * f); - - /* "Not found" result for the following two functions. */ - # define CORD_NOT_FOUND ((size_t)(-1)) - - /* A vague analog of strchr. Returns the position (an integer, not */ - /* a pointer) of the first occurrence of (char) c inside x at position */ - /* i or later. The value i must be < CORD_len(x). */ - size_t CORD_chr(CORD x, size_t i, int c); - - /* A vague analog of strrchr. Returns index of the last occurrence */ - /* of (char) c inside x at position i or earlier. The value i */ - /* must be < CORD_len(x). */ - size_t CORD_rchr(CORD x, size_t i, int c); - - - /* The following are also not primitive, but are implemented in */ - /* cordprnt.c. They provide functionality similar to the ANSI C */ - /* functions with corresponding names, but with the following */ - /* additions and changes: */ - /* 1. A %r conversion specification specifies a CORD argument. Field */ - /* width, precision, etc. have the same semantics as for %s. */ - /* (Note that %c,%C, and %S were already taken.) */ - /* 2. The format string is represented as a CORD. */ - /* 3. CORD_sprintf and CORD_vsprintf assign the result through the 1st */ /* argument. Unlike their ANSI C versions, there is no need to guess */ - /* the correct buffer size. */ - /* 4. Most of the conversions are implement through the native */ - /* vsprintf. Hence they are usually no faster, and */ - /* idiosyncracies of the native printf are preserved. However, */ - /* CORD arguments to CORD_sprintf and CORD_vsprintf are NOT copied; */ - /* the result shares the original structure. This may make them */ - /* very efficient in some unusual applications. */ - /* The format string is copied. */ - /* All functions return the number of characters generated or -1 on */ - /* error. This complies with the ANSI standard, but is inconsistent */ - /* with some older implementations of sprintf. */ - - /* The implementation of these is probably less portable than the rest */ - /* of this package. */ - - #ifndef CORD_NO_IO - - #include - - int CORD_sprintf(CORD * out, CORD format, ...); - int CORD_vsprintf(CORD * out, CORD format, va_list args); - int CORD_fprintf(FILE * f, CORD format, ...); - int CORD_vfprintf(FILE * f, CORD format, va_list args); - int CORD_printf(CORD format, ...); - int CORD_vprintf(CORD format, va_list args); - - #endif /* CORD_NO_IO */ - - # endif /* CORD_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/cordtest.c gcc-3.1/boehm-gc/cord/cordtest.c *** gcc-3.0.4/boehm-gc/cord/cordtest.c Wed Apr 7 14:56:06 1999 --- gcc-3.1/boehm-gc/cord/cordtest.c Fri Aug 17 18:30:48 2001 *************** *** 14,19 **** --- 14,20 ---- # include "cord.h" # include # include + # include /* This is a very incomplete test of the cord package. It knows about */ /* a few internals of the package (e.g. when C strings are returned) */ /* that real clients shouldn't rely on. */ diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/ec.h gcc-3.1/boehm-gc/cord/ec.h *** gcc-3.0.4/boehm-gc/cord/ec.h Wed Apr 7 14:56:06 1999 --- gcc-3.1/boehm-gc/cord/ec.h Thu Jan 1 00:00:00 1970 *************** *** 1,70 **** - # ifndef EC_H - # define EC_H - - # ifndef CORD_H - # include "cord.h" - # endif - - /* Extensible cords are strings that may be destructively appended to. */ - /* They allow fast construction of cords from characters that are */ - /* being read from a stream. */ - /* - * A client might look like: - * - * { - * CORD_ec x; - * CORD result; - * char c; - * FILE *f; - * - * ... - * CORD_ec_init(x); - * while(...) { - * c = getc(f); - * ... - * CORD_ec_append(x, c); - * } - * result = CORD_balance(CORD_ec_to_cord(x)); - * - * If a C string is desired as the final result, the call to CORD_balance - * may be replaced by a call to CORD_to_char_star. - */ - - # ifndef CORD_BUFSZ - # define CORD_BUFSZ 128 - # endif - - typedef struct CORD_ec_struct { - CORD ec_cord; - char * ec_bufptr; - char ec_buf[CORD_BUFSZ+1]; - } CORD_ec[1]; - - /* This structure represents the concatenation of ec_cord with */ - /* ec_buf[0 ... (ec_bufptr-ec_buf-1)] */ - - /* Flush the buffer part of the extended chord into ec_cord. */ - /* Note that this is almost the only real function, and it is */ - /* implemented in 6 lines in cordxtra.c */ - void CORD_ec_flush_buf(CORD_ec x); - - /* Convert an extensible cord to a cord. */ - # define CORD_ec_to_cord(x) (CORD_ec_flush_buf(x), (x)[0].ec_cord) - - /* Initialize an extensible cord. */ - # define CORD_ec_init(x) ((x)[0].ec_cord = 0, (x)[0].ec_bufptr = (x)[0].ec_buf) - - /* Append a character to an extensible cord. */ - # define CORD_ec_append(x, c) \ - { \ - if ((x)[0].ec_bufptr == (x)[0].ec_buf + CORD_BUFSZ) { \ - CORD_ec_flush_buf(x); \ - } \ - *((x)[0].ec_bufptr)++ = (c); \ - } - - /* Append a cord to an extensible cord. Structure remains shared with */ - /* original. */ - void CORD_ec_append_cord(CORD_ec x, CORD s); - - # endif /* EC_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/gc.h gcc-3.1/boehm-gc/cord/gc.h *** gcc-3.0.4/boehm-gc/cord/gc.h Mon Jun 19 23:41:59 2000 --- gcc-3.1/boehm-gc/cord/gc.h Thu Jan 1 00:00:00 1970 *************** *** 1,804 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. - * Copyright 1996-1999 by Silicon Graphics. All rights reserved. - * Copyright 1999 by Hewlett-Packard Company. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - - /* - * Note that this defines a large number of tuning hooks, which can - * safely be ignored in nearly all cases. For normal use it suffices - * to call only GC_MALLOC and perhaps GC_REALLOC. - * For better performance, also look at GC_MALLOC_ATOMIC, and - * GC_enable_incremental. If you need an action to be performed - * immediately before an object is collected, look at GC_register_finalizer. - * If you are using Solaris threads, look at the end of this file. - * Everything else is best ignored unless you encounter performance - * problems. - */ - - #ifndef _GC_H - - # define _GC_H - # define __GC - # include - - #if defined(__CYGWIN32__) && defined(GC_USE_DLL) - #include "libgc_globals.h" - #endif - - #if defined(__MINGW32__) && defined(WIN32_THREADS) - # ifdef GC_BUILD - # define GC_API __declspec(dllexport) - # else - # define GC_API __declspec(dllimport) - # endif - #endif - - #if defined(_MSC_VER) && defined(_DLL) - # ifdef GC_BUILD - # define GC_API __declspec(dllexport) - # else - # define GC_API __declspec(dllimport) - # endif - #endif - - #if defined(__WATCOMC__) && defined(GC_DLL) - # ifdef GC_BUILD - # define GC_API extern __declspec(dllexport) - # else - # define GC_API extern __declspec(dllimport) - # endif - #endif - - #ifndef GC_API - #define GC_API extern - #endif - - # if defined(__STDC__) || defined(__cplusplus) - # define GC_PROTO(args) args - typedef void * GC_PTR; - # define GC_CONST const - # else - # define GC_PROTO(args) () - typedef char * GC_PTR; - # define GC_CONST - # endif - - # ifdef __cplusplus - extern "C" { - # endif - - - /* Define word and signed_word to be unsigned and signed types of the */ - /* size as char * or void *. There seems to be no way to do this */ - /* even semi-portably. The following is probably no better/worse */ - /* than almost anything else. */ - /* The ANSI standard suggests that size_t and ptr_diff_t might be */ - /* better choices. But those appear to have incorrect definitions */ - /* on may systems. Notably "typedef int size_t" seems to be both */ - /* frequent and WRONG. */ - typedef unsigned long GC_word; - typedef long GC_signed_word; - - /* Public read-only variables */ - - GC_API GC_word GC_gc_no;/* Counter incremented per collection. */ - /* Includes empty GCs at startup. */ - - - /* Public R/W variables */ - - GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested)); - /* When there is insufficient memory to satisfy */ - /* an allocation request, we return */ - /* (*GC_oom_fn)(). By default this just */ - /* returns 0. */ - /* If it returns, it must return 0 or a valid */ - /* pointer to a previously allocated heap */ - /* object. */ - - GC_API int GC_find_leak; - /* Do not actually garbage collect, but simply */ - /* report inaccessible memory that was not */ - /* deallocated with GC_free. Initial value */ - /* is determined by FIND_LEAK macro. */ - - GC_API int GC_quiet; /* Disable statistics output. Only matters if */ - /* collector has been compiled with statistics */ - /* enabled. This involves a performance cost, */ - /* and is thus not the default. */ - - GC_API int GC_finalize_on_demand; - /* If nonzero, finalizers will only be run in */ - /* response to an eplit GC_invoke_finalizers */ - /* call. The default is determined by whether */ - /* the FINALIZE_ON_DEMAND macro is defined */ - /* when the collector is built. */ - - GC_API int GC_java_finalization; - /* Mark objects reachable from finalizable */ - /* objects in a separate postpass. This makes */ - /* it a bit safer to use non-topologically- */ - /* ordered finalization. Default value is */ - /* determined by JAVA_FINALIZATION macro. */ - - GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */ - /* because it's not safe. */ - - GC_API int GC_dont_expand; - /* Dont expand heap unless explicitly requested */ - /* or forced to. */ - - GC_API int GC_use_entire_heap; - /* Causes the nonincremental collector to use the */ - /* entire heap before collecting. This was the only */ - /* option for GC versions < 5.0. This sometimes */ - /* results in more large block fragmentation, since */ - /* very larg blocks will tend to get broken up */ - /* during each GC cycle. It is likely to result in a */ - /* larger working set, but lower collection */ - /* frequencies, and hence fewer instructions executed */ - /* in the collector. */ - - GC_API int GC_full_freq; /* Number of partial collections between */ - /* full collections. Matters only if */ - /* GC_incremental is set. */ - /* Full collections are also triggered if */ - /* the collector detects a substantial */ - /* increase in the number of in-use heap */ - /* blocks. Values in the tens are now */ - /* perfectly reasonable, unlike for */ - /* earlier GC versions. */ - - GC_API GC_word GC_non_gc_bytes; - /* Bytes not considered candidates for collection. */ - /* Used only to control scheduling of collections. */ - - GC_API GC_word GC_free_space_divisor; - /* We try to make sure that we allocate at */ - /* least N/GC_free_space_divisor bytes between */ - /* collections, where N is the heap size plus */ - /* a rough estimate of the root set size. */ - /* Initially, GC_free_space_divisor = 4. */ - /* Increasing its value will use less space */ - /* but more collection time. Decreasing it */ - /* will appreciably decrease collection time */ - /* at the expense of space. */ - /* GC_free_space_divisor = 1 will effectively */ - /* disable collections. */ - - GC_API GC_word GC_max_retries; - /* The maximum number of GCs attempted before */ - /* reporting out of memory after heap */ - /* expansion fails. Initially 0. */ - - - GC_API char *GC_stackbottom; /* Cool end of user stack. */ - /* May be set in the client prior to */ - /* calling any GC_ routines. This */ - /* avoids some overhead, and */ - /* potentially some signals that can */ - /* confuse debuggers. Otherwise the */ - /* collector attempts to set it */ - /* automatically. */ - /* For multithreaded code, this is the */ - /* cold end of the stack for the */ - /* primordial thread. */ - - /* Public procedures */ - /* - * general purpose allocation routines, with roughly malloc calling conv. - * The atomic versions promise that no relevant pointers are contained - * in the object. The nonatomic versions guarantee that the new object - * is cleared. GC_malloc_stubborn promises that no changes to the object - * will occur after GC_end_stubborn_change has been called on the - * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object - * that is scanned for pointers to collectable objects, but is not itself - * collectable. GC_malloc_uncollectable and GC_free called on the resulting - * object implicitly update GC_non_gc_bytes appropriately. - */ - GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes)); - GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes)); - GC_API GC_PTR GC_malloc_uncollectable GC_PROTO((size_t size_in_bytes)); - GC_API GC_PTR GC_malloc_stubborn GC_PROTO((size_t size_in_bytes)); - - /* The following is only defined if the library has been suitably */ - /* compiled: */ - GC_API GC_PTR GC_malloc_atomic_uncollectable GC_PROTO((size_t size_in_bytes)); - - /* Explicitly deallocate an object. Dangerous if used incorrectly. */ - /* Requires a pointer to the base of an object. */ - /* If the argument is stubborn, it should not be changeable when freed. */ - /* An object should not be enable for finalization when it is */ - /* explicitly deallocated. */ - /* GC_free(0) is a no-op, as required by ANSI C for free. */ - GC_API void GC_free GC_PROTO((GC_PTR object_addr)); - - /* - * Stubborn objects may be changed only if the collector is explicitly informed. - * The collector is implicitly informed of coming change when such - * an object is first allocated. The following routines inform the - * collector that an object will no longer be changed, or that it will - * once again be changed. Only nonNIL pointer stores into the object - * are considered to be changes. The argument to GC_end_stubborn_change - * must be exacly the value returned by GC_malloc_stubborn or passed to - * GC_change_stubborn. (In the second case it may be an interior pointer - * within 512 bytes of the beginning of the objects.) - * There is a performance penalty for allowing more than - * one stubborn object to be changed at once, but it is acceptable to - * do so. The same applies to dropping stubborn objects that are still - * changeable. - */ - GC_API void GC_change_stubborn GC_PROTO((GC_PTR)); - GC_API void GC_end_stubborn_change GC_PROTO((GC_PTR)); - - /* Return a pointer to the base (lowest address) of an object given */ - /* a pointer to a location within the object. */ - /* Return 0 if displaced_pointer doesn't point to within a valid */ - /* object. */ - GC_API GC_PTR GC_base GC_PROTO((GC_PTR displaced_pointer)); - - /* Given a pointer to the base of an object, return its size in bytes. */ - /* The returned size may be slightly larger than what was originally */ - /* requested. */ - GC_API size_t GC_size GC_PROTO((GC_PTR object_addr)); - - /* For compatibility with C library. This is occasionally faster than */ - /* a malloc followed by a bcopy. But if you rely on that, either here */ - /* or with the standard C library, your code is broken. In my */ - /* opinion, it shouldn't have been invented, but now we're stuck. -HB */ - /* The resulting object has the same kind as the original. */ - /* If the argument is stubborn, the result will have changes enabled. */ - /* It is an error to have changes enabled for the original object. */ - /* Follows ANSI comventions for NULL old_object. */ - GC_API GC_PTR GC_realloc - GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes)); - - /* Explicitly increase the heap size. */ - /* Returns 0 on failure, 1 on success. */ - GC_API int GC_expand_hp GC_PROTO((size_t number_of_bytes)); - - /* Limit the heap size to n bytes. Useful when you're debugging, */ - /* especially on systems that don't handle running out of memory well. */ - /* n == 0 ==> unbounded. This is the default. */ - GC_API void GC_set_max_heap_size GC_PROTO((GC_word n)); - - /* Inform the collector that a certain section of statically allocated */ - /* memory contains no pointers to garbage collected memory. Thus it */ - /* need not be scanned. This is sometimes important if the application */ - /* maps large read/write files into the address space, which could be */ - /* mistaken for dynamic library data segments on some systems. */ - GC_API void GC_exclude_static_roots GC_PROTO((GC_PTR start, GC_PTR finish)); - - /* Clear the set of root segments. Wizards only. */ - GC_API void GC_clear_roots GC_PROTO((void)); - - /* Add a root segment. Wizards only. */ - GC_API void GC_add_roots GC_PROTO((char * low_address, - char * high_address_plus_1)); - - /* Add a displacement to the set of those considered valid by the */ - /* collector. GC_register_displacement(n) means that if p was returned */ - /* by GC_malloc, then (char *)p + n will be considered to be a valid */ - /* pointer to n. N must be small and less than the size of p. */ - /* (All pointers to the interior of objects from the stack are */ - /* considered valid in any case. This applies to heap objects and */ - /* static data.) */ - /* Preferably, this should be called before any other GC procedures. */ - /* Calling it later adds to the probability of excess memory */ - /* retention. */ - /* This is a no-op if the collector was compiled with recognition of */ - /* arbitrary interior pointers enabled, which is now the default. */ - GC_API void GC_register_displacement GC_PROTO((GC_word n)); - - /* The following version should be used if any debugging allocation is */ - /* being done. */ - GC_API void GC_debug_register_displacement GC_PROTO((GC_word n)); - - /* Explicitly trigger a full, world-stop collection. */ - GC_API void GC_gcollect GC_PROTO((void)); - - /* Trigger a full world-stopped collection. Abort the collection if */ - /* and when stop_func returns a nonzero value. Stop_func will be */ - /* called frequently, and should be reasonably fast. This works even */ - /* if virtual dirty bits, and hence incremental collection is not */ - /* available for this architecture. Collections can be aborted faster */ - /* than normal pause times for incremental collection. However, */ - /* aborted collections do no useful work; the next collection needs */ - /* to start from the beginning. */ - /* Return 0 if the collection was aborted, 1 if it succeeded. */ - typedef int (* GC_stop_func) GC_PROTO((void)); - GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func)); - - /* Return the number of bytes in the heap. Excludes collector private */ - /* data structures. Includes empty blocks and fragmentation loss. */ - /* Includes some pages that were allocated but never written. */ - GC_API size_t GC_get_heap_size GC_PROTO((void)); - - /* Return a lower bound on the number of free bytes in the heap. */ - GC_API size_t GC_get_free_bytes GC_PROTO((void)); - - /* Return the number of bytes allocated since the last collection. */ - GC_API size_t GC_get_bytes_since_gc GC_PROTO((void)); - - /* Enable incremental/generational collection. */ - /* Not advisable unless dirty bits are */ - /* available or most heap objects are */ - /* pointerfree(atomic) or immutable. */ - /* Don't use in leak finding mode. */ - /* Ignored if GC_dont_gc is true. */ - GC_API void GC_enable_incremental GC_PROTO((void)); - - /* Perform some garbage collection work, if appropriate. */ - /* Return 0 if there is no more work to be done. */ - /* Typically performs an amount of work corresponding roughly */ - /* to marking from one page. May do more work if further */ - /* progress requires it, e.g. if incremental collection is */ - /* disabled. It is reasonable to call this in a wait loop */ - /* until it returns 0. */ - GC_API int GC_collect_a_little GC_PROTO((void)); - - /* Allocate an object of size lb bytes. The client guarantees that */ - /* as long as the object is live, it will be referenced by a pointer */ - /* that points to somewhere within the first 256 bytes of the object. */ - /* (This should normally be declared volatile to prevent the compiler */ - /* from invalidating this assertion.) This routine is only useful */ - /* if a large array is being allocated. It reduces the chance of */ - /* accidentally retaining such an array as a result of scanning an */ - /* integer that happens to be an address inside the array. (Actually, */ - /* it reduces the chance of the allocator not finding space for such */ - /* an array, since it will try hard to avoid introducing such a false */ - /* reference.) On a SunOS 4.X or MS Windows system this is recommended */ - /* for arrays likely to be larger than 100K or so. For other systems, */ - /* or if the collector is not configured to recognize all interior */ - /* pointers, the threshold is normally much higher. */ - GC_API GC_PTR GC_malloc_ignore_off_page GC_PROTO((size_t lb)); - GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb)); - - #if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION >= 720 - # define GC_ADD_CALLER - # define GC_RETURN_ADDR (GC_word)__return_address - #endif - - #ifdef GC_ADD_CALLER - # define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__ - # define GC_EXTRA_PARAMS GC_word ra, GC_CONST char * s, int i - #else - # define GC_EXTRAS __FILE__, __LINE__ - # define GC_EXTRA_PARAMS GC_CONST char * s, int i - #endif - - /* Debugging (annotated) allocation. GC_gcollect will check */ - /* objects allocated in this way for overwrites, etc. */ - GC_API GC_PTR GC_debug_malloc - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API GC_PTR GC_debug_malloc_atomic - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API GC_PTR GC_debug_malloc_uncollectable - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API GC_PTR GC_debug_malloc_stubborn - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API void GC_debug_free GC_PROTO((GC_PTR object_addr)); - GC_API GC_PTR GC_debug_realloc - GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes, - GC_EXTRA_PARAMS)); - - GC_API void GC_debug_change_stubborn GC_PROTO((GC_PTR)); - GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_PTR)); - # ifdef GC_DEBUG - # define GC_MALLOC(sz) GC_debug_malloc(sz, GC_EXTRAS) - # define GC_MALLOC_ATOMIC(sz) GC_debug_malloc_atomic(sz, GC_EXTRAS) - # define GC_MALLOC_UNCOLLECTABLE(sz) GC_debug_malloc_uncollectable(sz, \ - GC_EXTRAS) - # define GC_REALLOC(old, sz) GC_debug_realloc(old, sz, GC_EXTRAS) - # define GC_FREE(p) GC_debug_free(p) - # define GC_REGISTER_FINALIZER(p, f, d, of, od) \ - GC_debug_register_finalizer(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ - GC_debug_register_finalizer_ignore_self(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \ - GC_debug_register_finalizer_no_order(p, f, d, of, od) - # define GC_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS); - # define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p) - # define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p) - # define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \ - GC_general_register_disappearing_link(link, GC_base(obj)) - # define GC_REGISTER_DISPLACEMENT(n) GC_debug_register_displacement(n) - # else - # define GC_MALLOC(sz) GC_malloc(sz) - # define GC_MALLOC_ATOMIC(sz) GC_malloc_atomic(sz) - # define GC_MALLOC_UNCOLLECTABLE(sz) GC_malloc_uncollectable(sz) - # define GC_REALLOC(old, sz) GC_realloc(old, sz) - # define GC_FREE(p) GC_free(p) - # define GC_REGISTER_FINALIZER(p, f, d, of, od) \ - GC_register_finalizer(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ - GC_register_finalizer_ignore_self(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \ - GC_register_finalizer_no_order(p, f, d, of, od) - # define GC_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz) - # define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p) - # define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p) - # define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \ - GC_general_register_disappearing_link(link, obj) - # define GC_REGISTER_DISPLACEMENT(n) GC_register_displacement(n) - # endif - /* The following are included because they are often convenient, and */ - /* reduce the chance for a misspecifed size argument. But calls may */ - /* expand to something syntactically incorrect if t is a complicated */ - /* type expression. */ - # define GC_NEW(t) (t *)GC_MALLOC(sizeof (t)) - # define GC_NEW_ATOMIC(t) (t *)GC_MALLOC_ATOMIC(sizeof (t)) - # define GC_NEW_STUBBORN(t) (t *)GC_MALLOC_STUBBORN(sizeof (t)) - # define GC_NEW_UNCOLLECTABLE(t) (t *)GC_MALLOC_UNCOLLECTABLE(sizeof (t)) - - /* Finalization. Some of these primitives are grossly unsafe. */ - /* The idea is to make them both cheap, and sufficient to build */ - /* a safer layer, closer to PCedar finalization. */ - /* The interface represents my conclusions from a long discussion */ - /* with Alan Demers, Dan Greene, Carl Hauser, Barry Hayes, */ - /* Christian Jacobi, and Russ Atkinson. It's not perfect, and */ - /* probably nobody else agrees with it. Hans-J. Boehm 3/13/92 */ - typedef void (*GC_finalization_proc) - GC_PROTO((GC_PTR obj, GC_PTR client_data)); - - GC_API void GC_register_finalizer - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - GC_API void GC_debug_register_finalizer - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - /* When obj is no longer accessible, invoke */ - /* (*fn)(obj, cd). If a and b are inaccessible, and */ - /* a points to b (after disappearing links have been */ - /* made to disappear), then only a will be */ - /* finalized. (If this does not create any new */ - /* pointers to b, then b will be finalized after the */ - /* next collection.) Any finalizable object that */ - /* is reachable from itself by following one or more */ - /* pointers will not be finalized (or collected). */ - /* Thus cycles involving finalizable objects should */ - /* be avoided, or broken by disappearing links. */ - /* All but the last finalizer registered for an object */ - /* is ignored. */ - /* Finalization may be removed by passing 0 as fn. */ - /* Finalizers are implicitly unregistered just before */ - /* they are invoked. */ - /* The old finalizer and client data are stored in */ - /* *ofn and *ocd. */ - /* Fn is never invoked on an accessible object, */ - /* provided hidden pointers are converted to real */ - /* pointers only if the allocation lock is held, and */ - /* such conversions are not performed by finalization */ - /* routines. */ - /* If GC_register_finalizer is aborted as a result of */ - /* a signal, the object may be left with no */ - /* finalization, even if neither the old nor new */ - /* finalizer were NULL. */ - /* Obj should be the nonNULL starting address of an */ - /* object allocated by GC_malloc or friends. */ - /* Note that any garbage collectable object referenced */ - /* by cd will be considered accessible until the */ - /* finalizer is invoked. */ - - /* Another versions of the above follow. It ignores */ - /* self-cycles, i.e. pointers from a finalizable object to */ - /* itself. There is a stylistic argument that this is wrong, */ - /* but it's unavoidable for C++, since the compiler may */ - /* silently introduce these. It's also benign in that specific */ - /* case. */ - GC_API void GC_register_finalizer_ignore_self - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - GC_API void GC_debug_register_finalizer_ignore_self - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - - /* Another version of the above. It ignores all cycles. */ - /* It should probably only be used by Java implementations. */ - GC_API void GC_register_finalizer_no_order - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - GC_API void GC_debug_register_finalizer_no_order - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - - - /* The following routine may be used to break cycles between */ - /* finalizable objects, thus causing cyclic finalizable */ - /* objects to be finalized in the correct order. Standard */ - /* use involves calling GC_register_disappearing_link(&p), */ - /* where p is a pointer that is not followed by finalization */ - /* code, and should not be considered in determining */ - /* finalization order. */ - GC_API int GC_register_disappearing_link GC_PROTO((GC_PTR * /* link */)); - /* Link should point to a field of a heap allocated */ - /* object obj. *link will be cleared when obj is */ - /* found to be inaccessible. This happens BEFORE any */ - /* finalization code is invoked, and BEFORE any */ - /* decisions about finalization order are made. */ - /* This is useful in telling the finalizer that */ - /* some pointers are not essential for proper */ - /* finalization. This may avoid finalization cycles. */ - /* Note that obj may be resurrected by another */ - /* finalizer, and thus the clearing of *link may */ - /* be visible to non-finalization code. */ - /* There's an argument that an arbitrary action should */ - /* be allowed here, instead of just clearing a pointer. */ - /* But this causes problems if that action alters, or */ - /* examines connectivity. */ - /* Returns 1 if link was already registered, 0 */ - /* otherwise. */ - /* Only exists for backward compatibility. See below: */ - - GC_API int GC_general_register_disappearing_link - GC_PROTO((GC_PTR * /* link */, GC_PTR obj)); - /* A slight generalization of the above. *link is */ - /* cleared when obj first becomes inaccessible. This */ - /* can be used to implement weak pointers easily and */ - /* safely. Typically link will point to a location */ - /* holding a disguised pointer to obj. (A pointer */ - /* inside an "atomic" object is effectively */ - /* disguised.) In this way soft */ - /* pointers are broken before any object */ - /* reachable from them are finalized. Each link */ - /* May be registered only once, i.e. with one obj */ - /* value. This was added after a long email discussion */ - /* with John Ellis. */ - /* Obj must be a pointer to the first word of an object */ - /* we allocated. It is unsafe to explicitly deallocate */ - /* the object containing link. Explicitly deallocating */ - /* obj may or may not cause link to eventually be */ - /* cleared. */ - GC_API int GC_unregister_disappearing_link GC_PROTO((GC_PTR * /* link */)); - /* Returns 0 if link was not actually registered. */ - /* Undoes a registration by either of the above two */ - /* routines. */ - - /* Auxiliary fns to make finalization work correctly with displaced */ - /* pointers introduced by the debugging allocators. */ - GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data)); - GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data)); - - /* Returns !=0 if GC_invoke_finalizers has something to do. */ - GC_API int GC_should_invoke_finalizers GC_PROTO((void)); - - GC_API int GC_invoke_finalizers GC_PROTO((void)); - /* Run finalizers for all objects that are ready to */ - /* be finalized. Return the number of finalizers */ - /* that were run. Normally this is also called */ - /* implicitly during some allocations. If */ - /* GC-finalize_on_demand is nonzero, it must be called */ - /* explicitly. */ - - /* GC_set_warn_proc can be used to redirect or filter warning messages. */ - /* p may not be a NULL pointer. */ - typedef void (*GC_warn_proc) GC_PROTO((char *msg, GC_word arg)); - GC_API GC_warn_proc GC_set_warn_proc GC_PROTO((GC_warn_proc p)); - /* Returns old warning procedure. */ - - /* The following is intended to be used by a higher level */ - /* (e.g. cedar-like) finalization facility. It is expected */ - /* that finalization code will arrange for hidden pointers to */ - /* disappear. Otherwise objects can be accessed after they */ - /* have been collected. */ - /* Note that putting pointers in atomic objects or in */ - /* nonpointer slots of "typed" objects is equivalent to */ - /* disguising them in this way, and may have other advantages. */ - # if defined(I_HIDE_POINTERS) || defined(GC_I_HIDE_POINTERS) - typedef GC_word GC_hidden_pointer; - # define HIDE_POINTER(p) (~(GC_hidden_pointer)(p)) - # define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p))) - /* Converting a hidden pointer to a real pointer requires verifying */ - /* that the object still exists. This involves acquiring the */ - /* allocator lock to avoid a race with the collector. */ - # endif /* I_HIDE_POINTERS */ - - typedef GC_PTR (*GC_fn_type) GC_PROTO((GC_PTR client_data)); - GC_API GC_PTR GC_call_with_alloc_lock - GC_PROTO((GC_fn_type fn, GC_PTR client_data)); - - /* Check that p and q point to the same object. */ - /* Fail conspicuously if they don't. */ - /* Returns the first argument. */ - /* Succeeds if neither p nor q points to the heap. */ - /* May succeed if both p and q point to between heap objects. */ - GC_API GC_PTR GC_same_obj GC_PROTO((GC_PTR p, GC_PTR q)); - - /* Checked pointer pre- and post- increment operations. Note that */ - /* the second argument is in units of bytes, not multiples of the */ - /* object size. This should either be invoked from a macro, or the */ - /* call should be automatically generated. */ - GC_API GC_PTR GC_pre_incr GC_PROTO((GC_PTR *p, size_t how_much)); - GC_API GC_PTR GC_post_incr GC_PROTO((GC_PTR *p, size_t how_much)); - - /* Check that p is visible */ - /* to the collector as a possibly pointer containing location. */ - /* If it isn't fail conspicuously. */ - /* Returns the argument in all cases. May erroneously succeed */ - /* in hard cases. (This is intended for debugging use with */ - /* untyped allocations. The idea is that it should be possible, though */ - /* slow, to add such a call to all indirect pointer stores.) */ - /* Currently useless for multithreaded worlds. */ - GC_API GC_PTR GC_is_visible GC_PROTO((GC_PTR p)); - - /* Check that if p is a pointer to a heap page, then it points to */ - /* a valid displacement within a heap object. */ - /* Fail conspicuously if this property does not hold. */ - /* Uninteresting with ALL_INTERIOR_POINTERS. */ - /* Always returns its argument. */ - GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p)); - - /* Safer, but slow, pointer addition. Probably useful mainly with */ - /* a preprocessor. Useful only for heap pointers. */ - #ifdef GC_DEBUG - # define GC_PTR_ADD3(x, n, type_of_result) \ - ((type_of_result)GC_same_obj((x)+(n), (x))) - # define GC_PRE_INCR3(x, n, type_of_result) \ - ((type_of_result)GC_pre_incr(&(x), (n)*sizeof(*x)) - # define GC_POST_INCR2(x, type_of_result) \ - ((type_of_result)GC_post_incr(&(x), sizeof(*x)) - # ifdef __GNUC__ - # define GC_PTR_ADD(x, n) \ - GC_PTR_ADD3(x, n, typeof(x)) - # define GC_PRE_INCR(x, n) \ - GC_PRE_INCR3(x, n, typeof(x)) - # define GC_POST_INCR(x, n) \ - GC_POST_INCR3(x, typeof(x)) - # else - /* We can't do this right without typeof, which ANSI */ - /* decided was not sufficiently useful. Repeatedly */ - /* mentioning the arguments seems too dangerous to be */ - /* useful. So does not casting the result. */ - # define GC_PTR_ADD(x, n) ((x)+(n)) - # endif - #else /* !GC_DEBUG */ - # define GC_PTR_ADD3(x, n, type_of_result) ((x)+(n)) - # define GC_PTR_ADD(x, n) ((x)+(n)) - # define GC_PRE_INCR3(x, n, type_of_result) ((x) += (n)) - # define GC_PRE_INCR(x, n) ((x) += (n)) - # define GC_POST_INCR2(x, n, type_of_result) ((x)++) - # define GC_POST_INCR(x, n) ((x)++) - #endif - - /* Safer assignment of a pointer to a nonstack location. */ - #ifdef GC_DEBUG - # ifdef __STDC__ - # define GC_PTR_STORE(p, q) \ - (*(void **)GC_is_visible(p) = GC_is_valid_displacement(q)) - # else - # define GC_PTR_STORE(p, q) \ - (*(char **)GC_is_visible(p) = GC_is_valid_displacement(q)) - # endif - #else /* !GC_DEBUG */ - # define GC_PTR_STORE(p, q) *((p) = (q)) - #endif - - /* Fynctions called to report pointer checking errors */ - GC_API void (*GC_same_obj_print_proc) GC_PROTO((GC_PTR p, GC_PTR q)); - - GC_API void (*GC_is_valid_displacement_print_proc) - GC_PROTO((GC_PTR p)); - - GC_API void (*GC_is_visible_print_proc) - GC_PROTO((GC_PTR p)); - - #if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS) - # define SOLARIS_THREADS - #endif - - #ifdef SOLARIS_THREADS - /* We need to intercept calls to many of the threads primitives, so */ - /* that we can locate thread stacks and stop the world. */ - /* Note also that the collector cannot see thread specific data. */ - /* Thread specific data should generally consist of pointers to */ - /* uncollectable objects, which are deallocated using the destructor */ - /* facility in thr_keycreate. */ - # include - # include - int GC_thr_create(void *stack_base, size_t stack_size, - void *(*start_routine)(void *), void *arg, long flags, - thread_t *new_thread); - int GC_thr_join(thread_t wait_for, thread_t *departed, void **status); - int GC_thr_suspend(thread_t target_thread); - int GC_thr_continue(thread_t target_thread); - void * GC_dlopen(const char *path, int mode); - - # ifdef _SOLARIS_PTHREADS - # include - extern int GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void * (*thread_execp)(void *), void *arg); - extern int GC_pthread_join(pthread_t wait_for, void **status); - - # undef thread_t - - # define pthread_join GC_pthread_join - # define pthread_create GC_pthread_create - #endif - - # define thr_create GC_thr_create - # define thr_join GC_thr_join - # define thr_suspend GC_thr_suspend - # define thr_continue GC_thr_continue - # define dlopen GC_dlopen - - # endif /* SOLARIS_THREADS */ - - - #if !defined(USE_LD_WRAP) && \ - (defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS)) - /* We treat these similarly. */ - # include - # include - - int GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg); - int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); - int GC_pthread_join(pthread_t thread, void **retval); - - # define pthread_create GC_pthread_create - # define pthread_sigmask GC_pthread_sigmask - # define pthread_join GC_pthread_join - # define dlopen GC_dlopen - - #endif /* xxxxx_THREADS */ - - # if defined(PCR) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ - defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ - defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) - /* Any flavor of threads except SRC_M3. */ - /* This returns a list of objects, linked through their first */ - /* word. Its use can greatly reduce lock contention problems, since */ - /* the allocation lock can be acquired and released many fewer times. */ - /* lb must be large enough to hold the pointer field. */ - GC_PTR GC_malloc_many(size_t lb); - #define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */ - /* in returned list. */ - extern void GC_thr_init(); /* Needed for Solaris/X86 */ - - #endif /* THREADS && !SRC_M3 */ - - /* - * If you are planning on putting - * the collector in a SunOS 5 dynamic library, you need to call GC_INIT() - * from the statically loaded program section. - * This circumvents a Solaris 2.X (X<=4) linker bug. - */ - #if defined(sparc) || defined(__sparc) - # define GC_INIT() { extern end, etext; \ - GC_noop(&end, &etext); } - #else - # if defined(__CYGWIN32__) && defined(GC_USE_DLL) - /* - * Similarly gnu-win32 DLLs need explicit initialization - */ - # define GC_INIT() { GC_add_roots(DATASTART, DATAEND); } - # else - # define GC_INIT() - # endif - #endif - - #if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ - || defined(_WIN32) - /* win32S may not free all resources on process exit. */ - /* This explicitly deallocates the heap. */ - GC_API void GC_win32_free_heap (); - #endif - - #ifdef __cplusplus - } /* end of extern "C" */ - #endif - - #endif /* _GC_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/cord/private/cord_pos.h gcc-3.1/boehm-gc/cord/private/cord_pos.h *** gcc-3.0.4/boehm-gc/cord/private/cord_pos.h Wed Apr 7 14:56:06 1999 --- gcc-3.1/boehm-gc/cord/private/cord_pos.h Thu Jan 1 00:00:00 1970 *************** *** 1,118 **** - /* - * Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - /* Boehm, May 19, 1994 2:23 pm PDT */ - # ifndef CORD_POSITION_H - - /* The representation of CORD_position. This is private to the */ - /* implementation, but the size is known to clients. Also */ - /* the implementation of some exported macros relies on it. */ - /* Don't use anything defined here and not in cord.h. */ - - # define MAX_DEPTH 48 - /* The maximum depth of a balanced cord + 1. */ - /* We don't let cords get deeper than MAX_DEPTH. */ - - struct CORD_pe { - CORD pe_cord; - size_t pe_start_pos; - }; - - /* A structure describing an entry on the path from the root */ - /* to current position. */ - typedef struct CORD_Pos { - size_t cur_pos; - int path_len; - # define CORD_POS_INVALID (0x55555555) - /* path_len == INVALID <==> position invalid */ - const char *cur_leaf; /* Current leaf, if it is a string. */ - /* If the current leaf is a function, */ - /* then this may point to function_buf */ - /* containing the next few characters. */ - /* Always points to a valid string */ - /* containing the current character */ - /* unless cur_end is 0. */ - size_t cur_start; /* Start position of cur_leaf */ - size_t cur_end; /* Ending position of cur_leaf */ - /* 0 if cur_leaf is invalid. */ - struct CORD_pe path[MAX_DEPTH + 1]; - /* path[path_len] is the leaf corresponding to cur_pos */ - /* path[0].pe_cord is the cord we point to. */ - # define FUNCTION_BUF_SZ 8 - char function_buf[FUNCTION_BUF_SZ]; /* Space for next few chars */ - /* from function node. */ - } CORD_pos[1]; - - /* Extract the cord from a position: */ - CORD CORD_pos_to_cord(CORD_pos p); - - /* Extract the current index from a position: */ - size_t CORD_pos_to_index(CORD_pos p); - - /* Fetch the character located at the given position: */ - char CORD_pos_fetch(CORD_pos p); - - /* Initialize the position to refer to the give cord and index. */ - /* Note that this is the most expensive function on positions: */ - void CORD_set_pos(CORD_pos p, CORD x, size_t i); - - /* Advance the position to the next character. */ - /* P must be initialized and valid. */ - /* Invalidates p if past end: */ - void CORD_next(CORD_pos p); - - /* Move the position to the preceding character. */ - /* P must be initialized and valid. */ - /* Invalidates p if past beginning: */ - void CORD_prev(CORD_pos p); - - /* Is the position valid, i.e. inside the cord? */ - int CORD_pos_valid(CORD_pos p); - - char CORD__pos_fetch(CORD_pos); - void CORD__next(CORD_pos); - void CORD__prev(CORD_pos); - - #define CORD_pos_fetch(p) \ - (((p)[0].cur_end != 0)? \ - (p)[0].cur_leaf[(p)[0].cur_pos - (p)[0].cur_start] \ - : CORD__pos_fetch(p)) - - #define CORD_next(p) \ - (((p)[0].cur_pos + 1 < (p)[0].cur_end)? \ - (p)[0].cur_pos++ \ - : (CORD__next(p), 0)) - - #define CORD_prev(p) \ - (((p)[0].cur_end != 0 && (p)[0].cur_pos > (p)[0].cur_start)? \ - (p)[0].cur_pos-- \ - : (CORD__prev(p), 0)) - - #define CORD_pos_to_index(p) ((p)[0].cur_pos) - - #define CORD_pos_to_cord(p) ((p)[0].path[0].pe_cord) - - #define CORD_pos_valid(p) ((p)[0].path_len != CORD_POS_INVALID) - - /* Some grubby stuff for performance-critical friends: */ - #define CORD_pos_chars_left(p) ((long)((p)[0].cur_end) - (long)((p)[0].cur_pos)) - /* Number of characters in cache. <= 0 ==> none */ - - #define CORD_pos_advance(p,n) ((p)[0].cur_pos += (n) - 1, CORD_next(p)) - /* Advance position by n characters */ - /* 0 < n < CORD_pos_chars_left(p) */ - - #define CORD_pos_cur_char_addr(p) \ - (p)[0].cur_leaf + ((p)[0].cur_pos - (p)[0].cur_start) - /* address of current character in cache. */ - - #endif --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/dbg_mlc.c gcc-3.1/boehm-gc/dbg_mlc.c *** gcc-3.0.4/boehm-gc/dbg_mlc.c Sun May 7 00:43:49 2000 --- gcc-3.1/boehm-gc/dbg_mlc.c Wed Feb 13 05:38:39 2002 *************** *** 2,8 **** * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. * Copyright (c) 1997 by Silicon Graphics. All rights reserved. ! * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. --- 2,8 ---- * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. * Copyright (c) 1997 by Silicon Graphics. All rights reserved. ! * Copyright (c) 1999-2000 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 14,20 **** * modified is included with the above copyright notice. */ ! #include "dbg_mlc.h" void GC_default_print_heap_obj_proc(); GC_API void GC_register_finalizer_no_order --- 14,20 ---- * modified is included with the above copyright notice. */ ! #include "private/dbg_mlc.h" void GC_default_print_heap_obj_proc(); GC_API void GC_register_finalizer_no_order *************** GC_API void GC_register_finalizer_no_ord *** 22,31 **** GC_finalization_proc *ofn, GC_PTR *ocd)); /* Check whether object with base pointer p has debugging info */ /* p is assumed to point to a legitimate object in our part */ /* of the heap. */ ! GC_bool GC_has_debug_info(p) ptr_t p; { register oh * ohdr = (oh *)p; --- 22,38 ---- GC_finalization_proc *ofn, GC_PTR *ocd)); + #ifndef SHORT_DBG_HDRS /* Check whether object with base pointer p has debugging info */ /* p is assumed to point to a legitimate object in our part */ /* of the heap. */ ! /* This excludes the check as to whether the back pointer is */ ! /* odd, which is added by the GC_HAS_DEBUG_INFO macro. */ ! /* Note that if DBG_HDRS_ALL is set, uncollectable objects */ ! /* on free lists may not have debug information set. Thus it's */ ! /* not always safe to return TRUE, even if the client does */ ! /* its part. */ ! GC_bool GC_has_other_debug_info(p) ptr_t p; { register oh * ohdr = (oh *)p; *************** ptr_t p; *** 33,39 **** register word sz = GC_size((ptr_t) ohdr); if (HBLKPTR((ptr_t)ohdr) != HBLKPTR((ptr_t)body) ! || sz < sizeof (oh)) { return(FALSE); } if (ohdr -> oh_sz == sz) { --- 40,46 ---- register word sz = GC_size((ptr_t) ohdr); if (HBLKPTR((ptr_t)ohdr) != HBLKPTR((ptr_t)body) ! || sz < DEBUG_BYTES + EXTRA_BYTES) { return(FALSE); } if (ohdr -> oh_sz == sz) { *************** ptr_t p; *** 46,53 **** --- 53,71 ---- } return(FALSE); } + #endif #ifdef KEEP_BACK_PTRS + + # include + + # if defined(LINUX) || defined(SUNOS4) || defined(SUNOS5) \ + || defined(HPUX) || defined(IRIX) || defined(OSF1) + # define RANDOM() random() + # else + # define RANDOM() (long)rand() + # endif + /* Store back pointer to source in dest, if that appears to be possible. */ /* This is not completely safe, since we may mistakenly conclude that */ /* dest has a debugging wrapper. But the error probability is very */ *************** ptr_t p; *** 56,63 **** /* be a pointer to the interior of an object. */ void GC_store_back_pointer(ptr_t source, ptr_t dest) { ! if (GC_has_debug_info(dest)) { ! ((oh *)dest) -> oh_back_ptr = (ptr_t)HIDE_POINTER(source); } } --- 74,81 ---- /* be a pointer to the interior of an object. */ void GC_store_back_pointer(ptr_t source, ptr_t dest) { ! if (GC_HAS_DEBUG_INFO(dest)) { ! ((oh *)dest) -> oh_back_ptr = HIDE_BACK_PTR(source); } } *************** ptr_t p; *** 76,94 **** oh * hdr = (oh *)GC_base(dest); ptr_t bp; ptr_t bp_base; ! if (!GC_has_debug_info((ptr_t) hdr)) return GC_NO_SPACE; ! bp = hdr -> oh_back_ptr; if (MARKED_FOR_FINALIZATION == bp) return GC_FINALIZER_REFD; if (MARKED_FROM_REGISTER == bp) return GC_REFD_FROM_REG; ! if (0 == bp) return GC_UNREFERENCED; ! bp = REVEAL_POINTER(bp); bp_base = GC_base(bp); if (0 == bp_base) { *base_p = bp; *offset_p = 0; return GC_REFD_FROM_ROOT; } else { ! if (GC_has_debug_info(bp_base)) bp_base += sizeof(oh); *base_p = bp_base; *offset_p = bp - bp_base; return GC_REFD_FROM_HEAP; --- 94,127 ---- oh * hdr = (oh *)GC_base(dest); ptr_t bp; ptr_t bp_base; ! if (!GC_HAS_DEBUG_INFO((ptr_t) hdr)) return GC_NO_SPACE; ! bp = REVEAL_POINTER(hdr -> oh_back_ptr); if (MARKED_FOR_FINALIZATION == bp) return GC_FINALIZER_REFD; if (MARKED_FROM_REGISTER == bp) return GC_REFD_FROM_REG; ! if (NOT_MARKED == bp) return GC_UNREFERENCED; ! # if ALIGNMENT == 1 ! /* Heuristically try to fix off by 1 errors we introduced by */ ! /* insisting on even addresses. */ ! { ! ptr_t alternate_ptr = bp + 1; ! ptr_t target = *(ptr_t *)bp; ! ptr_t alternate_target = *(ptr_t *)alternate_ptr; ! ! if (alternate_target >= GC_least_plausible_heap_addr ! && alternate_target <= GC_greatest_plausible_heap_addr ! && (target < GC_least_plausible_heap_addr ! || target > GC_greatest_plausible_heap_addr)) { ! bp = alternate_ptr; ! } ! } ! # endif bp_base = GC_base(bp); if (0 == bp_base) { *base_p = bp; *offset_p = 0; return GC_REFD_FROM_ROOT; } else { ! if (GC_HAS_DEBUG_INFO(bp_base)) bp_base += sizeof(oh); *base_p = bp_base; *offset_p = bp - bp_base; return GC_REFD_FROM_HEAP; *************** ptr_t p; *** 101,107 **** void *GC_generate_random_heap_address(void) { int i; ! int heap_offset = random() % GC_heapsize; for (i = 0; i < GC_n_heap_sects; ++ i) { int size = GC_heap_sects[i].hs_bytes; if (heap_offset < size) { --- 134,148 ---- void *GC_generate_random_heap_address(void) { int i; ! long heap_offset = RANDOM(); ! if (GC_heapsize > RAND_MAX) { ! heap_offset *= RAND_MAX; ! heap_offset += RANDOM(); ! } ! heap_offset %= GC_heapsize; ! /* This doesn't yield a uniform distribution, especially if */ ! /* e.g. RAND_MAX = 1.5* GC_heapsize. But for typical cases, */ ! /* it's not too bad. */ for (i = 0; i < GC_n_heap_sects; ++ i) { int size = GC_heap_sects[i].hs_bytes; if (heap_offset < size) { *************** ptr_t p; *** 192,198 **** ptr_t GC_store_debug_info(p, sz, string, integer) register ptr_t p; /* base pointer */ word sz; /* bytes */ ! char * string; word integer; { register word * result = (word *)((oh *)p + 1); --- 233,239 ---- ptr_t GC_store_debug_info(p, sz, string, integer) register ptr_t p; /* base pointer */ word sz; /* bytes */ ! GC_CONST char * string; word integer; { register word * result = (word *)((oh *)p + 1); *************** word integer; *** 203,220 **** /* inconsistent while we're in the handler. */ LOCK(); # ifdef KEEP_BACK_PTRS ! ((oh *)p) -> oh_back_ptr = 0; # endif ((oh *)p) -> oh_string = string; ((oh *)p) -> oh_int = integer; ! ((oh *)p) -> oh_sz = sz; ! ((oh *)p) -> oh_sf = START_FLAG ^ (word)result; ! ((word *)p)[BYTES_TO_WORDS(GC_size(p))-1] = ! result[ROUNDED_UP_WORDS(sz)] = END_FLAG ^ (word)result; UNLOCK(); return((ptr_t)result); } /* Check the object with debugging info at ohdr */ /* return NIL if it's OK. Else return clobbered */ /* address. */ --- 244,299 ---- /* inconsistent while we're in the handler. */ LOCK(); # ifdef KEEP_BACK_PTRS ! ((oh *)p) -> oh_back_ptr = HIDE_BACK_PTR(NOT_MARKED); ! # endif ! # ifdef MAKE_BACK_GRAPH ! ((oh *)p) -> oh_bg_ptr = HIDE_BACK_PTR((ptr_t)0); # endif ((oh *)p) -> oh_string = string; ((oh *)p) -> oh_int = integer; ! # ifndef SHORT_DBG_HDRS ! ((oh *)p) -> oh_sz = sz; ! ((oh *)p) -> oh_sf = START_FLAG ^ (word)result; ! ((word *)p)[BYTES_TO_WORDS(GC_size(p))-1] = ! result[SIMPLE_ROUNDED_UP_WORDS(sz)] = END_FLAG ^ (word)result; ! # endif UNLOCK(); return((ptr_t)result); } + #ifdef DBG_HDRS_ALL + /* Store debugging info into p. Return displaced pointer. */ + /* This version assumes we do hold the allocation lock. */ + ptr_t GC_store_debug_info_inner(p, sz, string, integer) + register ptr_t p; /* base pointer */ + word sz; /* bytes */ + char * string; + word integer; + { + register word * result = (word *)((oh *)p + 1); + + /* There is some argument that we should disable signals here. */ + /* But that's expensive. And this way things should only appear */ + /* inconsistent while we're in the handler. */ + # ifdef KEEP_BACK_PTRS + ((oh *)p) -> oh_back_ptr = HIDE_BACK_PTR(NOT_MARKED); + # endif + # ifdef MAKE_BACK_GRAPH + ((oh *)p) -> oh_bg_ptr = HIDE_BACK_PTR((ptr_t)0); + # endif + ((oh *)p) -> oh_string = string; + ((oh *)p) -> oh_int = integer; + # ifndef SHORT_DBG_HDRS + ((oh *)p) -> oh_sz = sz; + ((oh *)p) -> oh_sf = START_FLAG ^ (word)result; + ((word *)p)[BYTES_TO_WORDS(GC_size(p))-1] = + result[SIMPLE_ROUNDED_UP_WORDS(sz)] = END_FLAG ^ (word)result; + # endif + return((ptr_t)result); + } + #endif + + #ifndef SHORT_DBG_HDRS /* Check the object with debugging info at ohdr */ /* return NIL if it's OK. Else return clobbered */ /* address. */ *************** register oh * ohdr; *** 232,243 **** if (((word *)ohdr)[BYTES_TO_WORDS(gc_sz)-1] != (END_FLAG ^ (word)body)) { return((ptr_t)((word *)ohdr + BYTES_TO_WORDS(gc_sz)-1)); } ! if (((word *)body)[ROUNDED_UP_WORDS(ohdr -> oh_sz)] != (END_FLAG ^ (word)body)) { ! return((ptr_t)((word *)body + ROUNDED_UP_WORDS(ohdr -> oh_sz))); } return(0); } void GC_print_obj(p) ptr_t p; --- 311,323 ---- if (((word *)ohdr)[BYTES_TO_WORDS(gc_sz)-1] != (END_FLAG ^ (word)body)) { return((ptr_t)((word *)ohdr + BYTES_TO_WORDS(gc_sz)-1)); } ! if (((word *)body)[SIMPLE_ROUNDED_UP_WORDS(ohdr -> oh_sz)] != (END_FLAG ^ (word)body)) { ! return((ptr_t)((word *)body + SIMPLE_ROUNDED_UP_WORDS(ohdr -> oh_sz))); } return(0); } + #endif /* !SHORT_DBG_HDRS */ void GC_print_obj(p) ptr_t p; *************** ptr_t p; *** 246,266 **** GC_err_printf1("0x%lx (", ((unsigned long)ohdr + sizeof(oh))); GC_err_puts(ohdr -> oh_string); ! GC_err_printf2(":%ld, sz=%ld)\n", (unsigned long)(ohdr -> oh_int), ! (unsigned long)(ohdr -> oh_sz)); PRINT_CALL_CHAIN(ohdr); } ! void GC_debug_print_heap_obj_proc(p) ! ptr_t p; { ! if (GC_has_debug_info(p)) { GC_print_obj(p); } else { GC_default_print_heap_obj_proc(p); } } void GC_print_smashed_obj(p, clobbered_addr) ptr_t p, clobbered_addr; { --- 326,355 ---- GC_err_printf1("0x%lx (", ((unsigned long)ohdr + sizeof(oh))); GC_err_puts(ohdr -> oh_string); ! # ifdef SHORT_DBG_HDRS ! GC_err_printf1(":%ld, sz=%ld)\n", (unsigned long)(ohdr -> oh_int)); ! # else ! GC_err_printf2(":%ld, sz=%ld)\n", (unsigned long)(ohdr -> oh_int), ! (unsigned long)(ohdr -> oh_sz)); ! # endif PRINT_CALL_CHAIN(ohdr); } ! # if defined(__STDC__) || defined(__cplusplus) ! void GC_debug_print_heap_obj_proc(ptr_t p) ! # else ! void GC_debug_print_heap_obj_proc(p) ! ptr_t p; ! # endif { ! if (GC_HAS_DEBUG_INFO(p)) { GC_print_obj(p); } else { GC_default_print_heap_obj_proc(p); } } + #ifndef SHORT_DBG_HDRS void GC_print_smashed_obj(p, clobbered_addr) ptr_t p, clobbered_addr; { *************** ptr_t p, clobbered_addr; *** 283,294 **** PRINT_CALL_CHAIN(ohdr); } } ! void GC_check_heap_proc(); void GC_start_debugging() { ! GC_check_heap = GC_check_heap_proc; GC_print_heap_obj = GC_debug_print_heap_obj_proc; GC_debugging_started = TRUE; GC_register_displacement((word)sizeof(oh)); --- 372,390 ---- PRINT_CALL_CHAIN(ohdr); } } + #endif ! void GC_check_heap_proc GC_PROTO((void)); ! ! void GC_do_nothing() {} void GC_start_debugging() { ! # ifndef SHORT_DBG_HDRS ! GC_check_heap = GC_check_heap_proc; ! # else ! GC_check_heap = GC_do_nothing; ! # endif GC_print_heap_obj = GC_debug_print_heap_obj_proc; GC_debugging_started = TRUE; GC_register_displacement((word)sizeof(oh)); *************** void GC_start_debugging() *** 333,366 **** return (GC_store_debug_info(result, (word)lb, s, (word)i)); } ! # ifdef __STDC__ ! GC_PTR GC_debug_generic_malloc(size_t lb, int k, GC_EXTRA_PARAMS) ! # else ! GC_PTR GC_debug_malloc(lb, k, s, i) ! size_t lb; ! int k; ! char * s; ! int i; ! # ifdef GC_ADD_CALLER ! --> GC_ADD_CALLER not implemented for K&R C ! # endif ! # endif ! { ! GC_PTR result = GC_generic_malloc(lb + DEBUG_BYTES, k); if (result == 0) { ! GC_err_printf1("GC_debug_malloc(%ld) returning NIL (", (unsigned long) lb); - GC_err_puts(s); - GC_err_printf1(":%ld)\n", (unsigned long)i); return(0); } ! if (!GC_debugging_started) { ! GC_start_debugging(); } ADD_CALL_CHAIN(result, ra); ! return (GC_store_debug_info(result, (word)lb, s, (word)i)); ! } #ifdef STUBBORN_ALLOC # ifdef __STDC__ --- 429,470 ---- return (GC_store_debug_info(result, (word)lb, s, (word)i)); } ! # ifdef DBG_HDRS_ALL ! /* ! * An allocation function for internal use. ! * Normally internally allocated objects do not have debug information. ! * But in this case, we need to make sure that all objects have debug ! * headers. ! * We assume debugging was started in collector initialization, ! * and we already hold the GC lock. ! */ ! GC_PTR GC_debug_generic_malloc_inner(size_t lb, int k) ! { ! GC_PTR result = GC_generic_malloc_inner(lb + DEBUG_BYTES, k); if (result == 0) { ! GC_err_printf1("GC internal allocation (%ld bytes) returning NIL\n", (unsigned long) lb); return(0); } ! ADD_CALL_CHAIN(result, ra); ! return (GC_store_debug_info_inner(result, (word)lb, "INTERNAL", (word)0)); ! } ! ! GC_PTR GC_debug_generic_malloc_inner_ignore_off_page(size_t lb, int k) ! { ! GC_PTR result = GC_generic_malloc_inner_ignore_off_page( ! lb + DEBUG_BYTES, k); ! ! if (result == 0) { ! GC_err_printf1("GC internal allocation (%ld bytes) returning NIL\n", ! (unsigned long) lb); ! return(0); } ADD_CALL_CHAIN(result, ra); ! return (GC_store_debug_info_inner(result, (word)lb, "INTERNAL", (word)0)); ! } ! # endif #ifdef STUBBORN_ALLOC # ifdef __STDC__ *************** GC_PTR p; *** 554,571 **** "GC_debug_free called on pointer %lx wo debugging info\n", (unsigned long)p); } else { ! clobbered = GC_check_annotated_obj((oh *)base); ! if (clobbered != 0) { ! if (((oh *)base) -> oh_sz == GC_size(base)) { GC_err_printf0( "GC_debug_free: found previously deallocated (?) object at "); ! } else { GC_err_printf0("GC_debug_free: found smashed location at "); } ! GC_print_smashed_obj(p, clobbered); ! } ! /* Invalidate size */ ! ((oh *)base) -> oh_sz = GC_size(base); } if (GC_find_leak) { GC_free(base); --- 658,677 ---- "GC_debug_free called on pointer %lx wo debugging info\n", (unsigned long)p); } else { ! # ifndef SHORT_DBG_HDRS ! clobbered = GC_check_annotated_obj((oh *)base); ! if (clobbered != 0) { ! if (((oh *)base) -> oh_sz == GC_size(base)) { GC_err_printf0( "GC_debug_free: found previously deallocated (?) object at "); ! } else { GC_err_printf0("GC_debug_free: found smashed location at "); + } + GC_print_smashed_obj(p, clobbered); } ! /* Invalidate size */ ! ((oh *)base) -> oh_sz = GC_size(base); ! # endif /* SHORT_DBG_HDRS */ } if (GC_find_leak) { GC_free(base); *************** GC_PTR p; *** 585,590 **** --- 691,707 ---- } /* !GC_find_leak */ } + #ifdef THREADS + + extern void GC_free_inner(GC_PTR p); + + /* Used internally; we assume it's called correctly. */ + void GC_debug_free_inner(GC_PTR p) + { + GC_free_inner(GC_base(p)); + } + #endif + # ifdef __STDC__ GC_PTR GC_debug_realloc(GC_PTR p, size_t lb, GC_EXTRA_PARAMS) # else *************** GC_PTR p; *** 639,650 **** GC_err_printf0("GC_debug_realloc: encountered bad kind\n"); ABORT("bad kind"); } ! clobbered = GC_check_annotated_obj((oh *)base); ! if (clobbered != 0) { GC_err_printf0("GC_debug_realloc: found smashed location at "); GC_print_smashed_obj(p, clobbered); ! } ! old_sz = ((oh *)base) -> oh_sz; if (old_sz < copy_sz) copy_sz = old_sz; if (result == 0) return(0); BCOPY(p, result, copy_sz); --- 756,771 ---- GC_err_printf0("GC_debug_realloc: encountered bad kind\n"); ABORT("bad kind"); } ! # ifdef SHORT_DBG_HDRS ! old_sz = GC_size(base) - sizeof(oh); ! # else ! clobbered = GC_check_annotated_obj((oh *)base); ! if (clobbered != 0) { GC_err_printf0("GC_debug_realloc: found smashed location at "); GC_print_smashed_obj(p, clobbered); ! } ! old_sz = ((oh *)base) -> oh_sz; ! # endif if (old_sz < copy_sz) copy_sz = old_sz; if (result == 0) return(0); BCOPY(p, result, copy_sz); *************** GC_PTR p; *** 652,662 **** return(result); } /* Check all marked objects in the given block for validity */ /*ARGSUSED*/ ! void GC_check_heap_block(hbp, dummy) ! register struct hblk *hbp; /* ptr to current heap block */ ! word dummy; { register struct hblkhdr * hhdr = HDR(hbp); register word sz = hhdr -> hb_sz; --- 773,788 ---- return(result); } + #ifndef SHORT_DBG_HDRS /* Check all marked objects in the given block for validity */ /*ARGSUSED*/ ! # if defined(__STDC__) || defined(__cplusplus) ! void GC_check_heap_block(register struct hblk *hbp, word dummy) ! # else ! void GC_check_heap_block(hbp, dummy) ! register struct hblk *hbp; /* ptr to current heap block */ ! word dummy; ! # endif { register struct hblkhdr * hhdr = HDR(hbp); register word sz = hhdr -> hb_sz; *************** word dummy; *** 664,670 **** register word *p, *plim; p = (word *)(hbp->hb_body); ! word_no = HDR_WORDS; if (sz > MAXOBJSZ) { plim = p; } else { --- 790,796 ---- register word *p, *plim; p = (word *)(hbp->hb_body); ! word_no = 0; if (sz > MAXOBJSZ) { plim = p; } else { *************** word dummy; *** 673,679 **** /* go through all words in block */ while( p <= plim ) { if( mark_bit_from_hdr(hhdr, word_no) ! && GC_has_debug_info((ptr_t)p)) { ptr_t clobbered = GC_check_annotated_obj((oh *)p); if (clobbered != 0) { --- 799,805 ---- /* go through all words in block */ while( p <= plim ) { if( mark_bit_from_hdr(hhdr, word_no) ! && GC_HAS_DEBUG_INFO((ptr_t)p)) { ptr_t clobbered = GC_check_annotated_obj((oh *)p); if (clobbered != 0) { *************** void GC_check_heap_proc() *** 700,705 **** --- 826,833 ---- GC_apply_to_all_blocks(GC_check_heap_block, (word)0); } + #endif /* !SHORT_DBG_HDRS */ + struct closure { GC_finalization_proc cl_fn; GC_PTR cl_data; *************** struct closure { *** 714,720 **** # endif { struct closure * result = ! (struct closure *) GC_malloc(sizeof (struct closure)); result -> cl_fn = fn; result -> cl_data = data; --- 842,853 ---- # endif { struct closure * result = ! # ifdef DBG_HDRS_ALL ! (struct closure *) GC_debug_malloc(sizeof (struct closure), ! GC_EXTRAS); ! # else ! (struct closure *) GC_malloc(sizeof (struct closure)); ! # endif result -> cl_fn = fn; result -> cl_data = data; *************** struct closure { *** 734,739 **** --- 867,894 ---- (*(cl -> cl_fn))((GC_PTR)((char *)obj + sizeof(oh)), cl -> cl_data); } + /* Set ofn and ocd to reflect the values we got back. */ + static void store_old (obj, my_old_fn, my_old_cd, ofn, ocd) + GC_PTR obj; + GC_finalization_proc my_old_fn; + struct closure * my_old_cd; + GC_finalization_proc *ofn; + GC_PTR *ocd; + { + if (0 != my_old_fn) { + if (my_old_fn != GC_debug_invoke_finalizer) { + GC_err_printf1("Debuggable object at 0x%lx had non-debug finalizer.\n", + obj); + /* This should probably be fatal. */ + } else { + if (ofn) *ofn = my_old_cd -> cl_fn; + if (ocd) *ocd = my_old_cd -> cl_data; + } + } else { + if (ofn) *ofn = 0; + if (ocd) *ocd = 0; + } + } # ifdef __STDC__ void GC_debug_register_finalizer(GC_PTR obj, GC_finalization_proc fn, *************** struct closure { *** 748,761 **** GC_PTR *ocd; # endif { ptr_t base = GC_base(obj); if (0 == base || (ptr_t)obj - base != sizeof(oh)) { GC_err_printf1( "GC_register_finalizer called with non-base-pointer 0x%lx\n", obj); } ! GC_register_finalizer(base, GC_debug_invoke_finalizer, ! GC_make_closure(fn,cd), ofn, ocd); } # ifdef __STDC__ --- 903,923 ---- GC_PTR *ocd; # endif { + GC_finalization_proc my_old_fn; + GC_PTR my_old_cd; ptr_t base = GC_base(obj); if (0 == base || (ptr_t)obj - base != sizeof(oh)) { GC_err_printf1( "GC_register_finalizer called with non-base-pointer 0x%lx\n", obj); } ! if (0 == fn) { ! GC_register_finalizer(base, 0, 0, &my_old_fn, &my_old_cd); ! } else { ! GC_register_finalizer(base, GC_debug_invoke_finalizer, ! GC_make_closure(fn,cd), &my_old_fn, &my_old_cd); ! } ! store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd); } # ifdef __STDC__ *************** struct closure { *** 773,786 **** GC_PTR *ocd; # endif { ptr_t base = GC_base(obj); if (0 == base || (ptr_t)obj - base != sizeof(oh)) { GC_err_printf1( "GC_register_finalizer_no_order called with non-base-pointer 0x%lx\n", obj); } ! GC_register_finalizer_no_order(base, GC_debug_invoke_finalizer, ! GC_make_closure(fn,cd), ofn, ocd); } # ifdef __STDC__ --- 935,956 ---- GC_PTR *ocd; # endif { + GC_finalization_proc my_old_fn; + GC_PTR my_old_cd; ptr_t base = GC_base(obj); if (0 == base || (ptr_t)obj - base != sizeof(oh)) { GC_err_printf1( "GC_register_finalizer_no_order called with non-base-pointer 0x%lx\n", obj); } ! if (0 == fn) { ! GC_register_finalizer_no_order(base, 0, 0, &my_old_fn, &my_old_cd); ! } else { ! GC_register_finalizer_no_order(base, GC_debug_invoke_finalizer, ! GC_make_closure(fn,cd), &my_old_fn, ! &my_old_cd); ! } ! store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd); } # ifdef __STDC__ *************** struct closure { *** 798,809 **** GC_PTR *ocd; # endif { ptr_t base = GC_base(obj); if (0 == base || (ptr_t)obj - base != sizeof(oh)) { GC_err_printf1( "GC_register_finalizer_ignore_self called with non-base-pointer 0x%lx\n", obj); } ! GC_register_finalizer_ignore_self(base, GC_debug_invoke_finalizer, ! GC_make_closure(fn,cd), ofn, ocd); } --- 968,1006 ---- GC_PTR *ocd; # endif { + GC_finalization_proc my_old_fn; + GC_PTR my_old_cd; ptr_t base = GC_base(obj); if (0 == base || (ptr_t)obj - base != sizeof(oh)) { GC_err_printf1( "GC_register_finalizer_ignore_self called with non-base-pointer 0x%lx\n", obj); } ! if (0 == fn) { ! GC_register_finalizer_ignore_self(base, 0, 0, &my_old_fn, &my_old_cd); ! } else { ! GC_register_finalizer_ignore_self(base, GC_debug_invoke_finalizer, ! GC_make_closure(fn,cd), &my_old_fn, ! &my_old_cd); ! } ! store_old(obj, my_old_fn, (struct closure *)my_old_cd, ofn, ocd); ! } ! ! #ifdef GC_ADD_CALLER ! # define RA GC_RETURN_ADDR, ! #else ! # define RA ! #endif ! ! GC_PTR GC_debug_malloc_replacement(lb) ! size_t lb; ! { ! return GC_debug_malloc(lb, RA "unknown", 0); ! } ! ! GC_PTR GC_debug_realloc_replacement(p, lb) ! GC_PTR p; ! size_t lb; ! { ! return GC_debug_realloc(p, lb, RA "unknown", 0); } diff -Nrc3pad gcc-3.0.4/boehm-gc/dbg_mlc.h gcc-3.1/boehm-gc/dbg_mlc.h *** gcc-3.0.4/boehm-gc/dbg_mlc.h Wed Apr 19 02:29:15 2000 --- gcc-3.1/boehm-gc/dbg_mlc.h Thu Jan 1 00:00:00 1970 *************** *** 1,102 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. - * Copyright (c) 1997 by Silicon Graphics. All rights reserved. - * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - - /* - * This is mostly an internal header file. Typical clients should - * not use it. Clients that define their own object kinds with - * debugging allocators will probably want to include this, however. - * No attempt is made to keep the namespace clean. This should not be - * included from header filrd that are frequently included by clients. - */ - - #ifndef _DBG_MLC_H - - #define _DBG_MLC_H - - # define I_HIDE_POINTERS - # include "gc_priv.h" - # ifdef KEEP_BACK_PTRS - # include "backptr.h" - # endif - - # define START_FLAG ((word)0xfedcedcb) - # define END_FLAG ((word)0xbcdecdef) - /* Stored both one past the end of user object, and one before */ - /* the end of the object as seen by the allocator. */ - - - /* Object header */ - typedef struct { - # ifdef KEEP_BACK_PTRS - ptr_t oh_back_ptr; - # define MARKED_FOR_FINALIZATION (ptr_t)(-1) - /* Object was marked because it is finalizable. */ - # define MARKED_FROM_REGISTER (ptr_t)(-2) - /* Object was marked from a rgister. Hence the */ - /* source of the reference doesn't have an address. */ - # ifdef ALIGN_DOUBLE - word oh_dummy; - # endif - # endif - char * oh_string; /* object descriptor string */ - word oh_int; /* object descriptor integers */ - # ifdef NEED_CALLINFO - struct callinfo oh_ci[NFRAMES]; - # endif - word oh_sz; /* Original malloc arg. */ - word oh_sf; /* start flag */ - } oh; - /* The size of the above structure is assumed not to dealign things, */ - /* and to be a multiple of the word length. */ - - #define DEBUG_BYTES (sizeof (oh) + sizeof (word)) - #define USR_PTR_FROM_BASE(p) ((ptr_t)(p) + sizeof(oh)) - - /* There is no reason to ever add a byte at the end explicitly, since we */ - /* already add a guard word. */ - #undef ROUNDED_UP_WORDS - #define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1) - 1) - - #ifdef SAVE_CALL_CHAIN - # define ADD_CALL_CHAIN(base, ra) GC_save_callers(((oh *)(base)) -> oh_ci) - # define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci) - #else - # ifdef GC_ADD_CALLER - # define ADD_CALL_CHAIN(base, ra) ((oh *)(base)) -> oh_ci[0].ci_pc = (ra) - # define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci) - # else - # define ADD_CALL_CHAIN(base, ra) - # define PRINT_CALL_CHAIN(base) - # endif - #endif - - # ifdef GC_ADD_CALLER - # define OPT_RA ra, - # else - # define OPT_RA - # endif - - - /* Check whether object with base pointer p has debugging info */ - /* p is assumed to point to a legitimate object in our part */ - /* of the heap. */ - GC_bool GC_has_debug_info(/* p */); - - /* Store debugging info into p. Return displaced pointer. */ - /* Assumes we don't hold allocation lock. */ - ptr_t GC_store_debug_info(/* p, sz, string, integer */); - - #endif /* _DBG_MLC_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/digimars.mak gcc-3.1/boehm-gc/digimars.mak *** gcc-3.0.4/boehm-gc/digimars.mak Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/digimars.mak Fri Aug 17 18:39:17 2001 *************** *** 0 **** --- 1,90 ---- + # Makefile to build Hans Boehm garbage collector using the Digital Mars + # compiler from www.digitalmars.com + # Written by Walter Bright + + + DEFINES=-DNDEBUG -DSILENT -DGC_BUILD -D_WINDOWS -DGC_DLL -DALL_INTERIOR_POINTERS -D__STDC__ -DWIN32_THREADS + CFLAGS=-Iinclude $(DEFINES) -wx -g + LFLAGS=/ma/implib/co + CC=sc + + .c.obj: + $(CC) -c $(CFLAGS) $* + + .cpp.obj: + $(CC) -c $(CFLAGS) -Aa $* + + OBJS= \ + allchblk.obj\ + alloc.obj\ + blacklst.obj\ + checksums.obj\ + dbg_mlc.obj\ + dyn_load.obj\ + finalize.obj\ + gc_cpp.obj\ + headers.obj\ + mach_dep.obj\ + malloc.obj\ + mallocx.obj\ + mark.obj\ + mark_rts.obj\ + misc.obj\ + new_hblk.obj\ + obj_map.obj\ + os_dep.obj\ + ptr_chck.obj\ + reclaim.obj\ + stubborn.obj\ + typd_mlc.obj\ + win32_threads.obj + + targets: gc.dll gc.lib gctest.exe + + gc.dll: $(OBJS) gc.def digimars.mak + sc -ogc.dll $(OBJS) -L$(LFLAGS) gc.def kernel32.lib user32.lib + + gc.def: digimars.mak + echo LIBRARY GC >gc.def + echo DESCRIPTION "Hans Boehm Garbage Collector" >>gc.def + echo EXETYPE NT >>gc.def + echo EXPORTS >>gc.def + echo GC_is_visible_print_proc >>gc.def + echo GC_is_valid_displacement_print_proc >>gc.def + + clean: + del gc.def + del $(OBJS) + + + gctest.exe : gc.lib tests\test.obj + sc -ogctest.exe tests\test.obj gc.lib + + tests\test.obj : tests\test.c + $(CC) -c -g -DNDEBUG -DSILENT -DGC_BUILD -D_WINDOWS -DGC_DLL \ + -DALL_INTERIOR_POINTERS -DWIN32_THREADS \ + -Iinclude tests\test.c -otests\test.obj + + allchblk.obj: allchblk.c + alloc.obj: alloc.c + blacklst.obj: blacklst.c + checksums.obj: checksums.c + dbg_mlc.obj: dbg_mlc.c + dyn_load.obj: dyn_load.c + finalize.obj: finalize.c + gc_cpp.obj: gc_cpp.cpp + headers.obj: headers.c + mach_dep.obj: mach_dep.c + malloc.obj: malloc.c + mallocx.obj: mallocx.c + mark.obj: mark.c + mark_rts.obj: mark_rts.c + misc.obj: misc.c + new_hblk.obj: new_hblk.c + obj_map.obj: obj_map.c + os_dep.obj: os_dep.c + ptr_chck.obj: ptr_chck.c + reclaim.obj: reclaim.c + stubborn.obj: stubborn.c + typd_mlc.obj: typd_mlc.c + win32_threads.obj: win32_threads.c diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README gcc-3.1/boehm-gc/doc/README *** gcc-3.0.4/boehm-gc/doc/README Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README Tue Feb 12 04:37:55 2002 *************** *** 0 **** --- 1,617 ---- + Copyright (c) 1988, 1989 Hans-J. Boehm, Alan J. Demers + Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved. + Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. + Copyright (c) 1999-2001 by Hewlett-Packard Company. All rights reserved. + + The file linux_threads.c is also + Copyright (c) 1998 by Fergus Henderson. All rights reserved. + + The files Makefile.am, and configure.in are + Copyright (c) 2001 by Red Hat Inc. All rights reserved. + + The files config.guess and a few others are copyrighted by the Free + Software Foundation. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program + for any purpose, provided the above notices are retained on all copies. + Permission to modify the code and to distribute modified code is granted, + provided the above notices are retained, and a notice that the code was + modified is included with the above copyright notice. + + A few of the files needed to use the GNU-style build procedure come with + slightly different licenses, though they are all similar in spirit. A few + are GPL'ed, but with an exception that should cover all uses in the + collector. (If you are concerned about such things, I recommend you look + at the notice in config.guess or ltmain.sh.) + + This is version 6.1alpha3 of a conservative garbage collector for C and C++. + + You might find a more recent version of this at + + http://www.hpl.hp.com/personal/Hans_Boehm/gc + + OVERVIEW + + This is intended to be a general purpose, garbage collecting storage + allocator. The algorithms used are described in: + + Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment", + Software Practice & Experience, September 1988, pp. 807-820. + + Boehm, H., A. Demers, and S. Shenker, "Mostly Parallel Garbage Collection", + Proceedings of the ACM SIGPLAN '91 Conference on Programming Language Design + and Implementation, SIGPLAN Notices 26, 6 (June 1991), pp. 157-164. + + Boehm, H., "Space Efficient Conservative Garbage Collection", Proceedings + of the ACM SIGPLAN '91 Conference on Programming Language Design and + Implementation, SIGPLAN Notices 28, 6 (June 1993), pp. 197-206. + + Boehm H., "Reducing Garbage Collector Cache Misses", Proceedings of the + 2000 International Symposium on Memory Management. + + Possible interactions between the collector and optimizing compilers are + discussed in + + Boehm, H., and D. Chase, "A Proposal for GC-safe C Compilation", + The Journal of C Language Translation 4, 2 (December 1992). + + and + + Boehm H., "Simple GC-safe Compilation", Proceedings + of the ACM SIGPLAN '96 Conference on Programming Language Design and + Implementation. + + (Some of these are also available from + http://www.hpl.hp.com/personal/Hans_Boehm/papers/, among other places.) + + Unlike the collector described in the second reference, this collector + operates either with the mutator stopped during the entire collection + (default) or incrementally during allocations. (The latter is supported + on only a few machines.) On the most common platforms, it can be built + with or without thread support. On a few platforms, it can take advantage + of a multiprocessor to speed up garbage collection. + + Many of the ideas underlying the collector have previously been explored + by others. Notably, some of the run-time systems developed at Xerox PARC + in the early 1980s conservatively scanned thread stacks to locate possible + pointers (cf. Paul Rovner, "On Adding Garbage Collection and Runtime Types + to a Strongly-Typed Statically Checked, Concurrent Language" Xerox PARC + CSL 84-7). Doug McIlroy wrote a simpler fully conservative collector that + was part of version 8 UNIX (tm), but appears to not have received + widespread use. + + Rudimentary tools for use of the collector as a leak detector are included + (see http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html), + as is a fairly sophisticated string package "cord" that makes use of the + collector. (See doc/README.cords and H.-J. Boehm, R. Atkinson, and M. Plass, + "Ropes: An Alternative to Strings", Software Practice and Experience 25, 12 + (December 1995), pp. 1315-1330. This is very similar to the "rope" package + in Xerox Cedar, or the "rope" package in the SGI STL or the g++ distribution.) + + Further collector documantation can be found at + + http://www.hpl.hp.com/personal/Hans_Boehm/gc + + + GENERAL DESCRIPTION + + This is a garbage collecting storage allocator that is intended to be + used as a plug-in replacement for C's malloc. + + Since the collector does not require pointers to be tagged, it does not + attempt to ensure that all inaccessible storage is reclaimed. However, + in our experience, it is typically more successful at reclaiming unused + memory than most C programs using explicit deallocation. Unlike manually + introduced leaks, the amount of unreclaimed memory typically stays + bounded. + + In the following, an "object" is defined to be a region of memory allocated + by the routines described below. + + Any objects not intended to be collected must be pointed to either + from other such accessible objects, or from the registers, + stack, data, or statically allocated bss segments. Pointers from + the stack or registers may point to anywhere inside an object. + The same is true for heap pointers if the collector is compiled with + ALL_INTERIOR_POINTERS defined, as is now the default. + + Compiling without ALL_INTERIOR_POINTERS may reduce accidental retention + of garbage objects, by requiring pointers from the heap to to the beginning + of an object. But this no longer appears to be a significant + issue for most programs. + + There are a number of routines which modify the pointer recognition + algorithm. GC_register_displacement allows certain interior pointers + to be recognized even if ALL_INTERIOR_POINTERS is nor defined. + GC_malloc_ignore_off_page allows some pointers into the middle of large objects + to be disregarded, greatly reducing the probablility of accidental + retention of large objects. For most purposes it seems best to compile + with ALL_INTERIOR_POINTERS and to use GC_malloc_ignore_off_page if + you get collector warnings from allocations of very large objects. + See README.debugging for details. + + WARNING: pointers inside memory allocated by the standard "malloc" are not + seen by the garbage collector. Thus objects pointed to only from such a + region may be prematurely deallocated. It is thus suggested that the + standard "malloc" be used only for memory regions, such as I/O buffers, that + are guaranteed not to contain pointers to garbage collectable memory. + Pointers in C language automatic, static, or register variables, + are correctly recognized. (Note that GC_malloc_uncollectable has semantics + similar to standard malloc, but allocates objects that are traced by the + collector.) + + WARNING: the collector does not always know how to find pointers in data + areas that are associated with dynamic libraries. This is easy to + remedy IF you know how to find those data areas on your operating + system (see GC_add_roots). Code for doing this under SunOS, IRIX 5.X and 6.X, + HP/UX, Alpha OSF/1, Linux, and win32 is included and used by default. (See + README.win32 for win32 details.) On other systems pointers from dynamic + library data areas may not be considered by the collector. + If you're writing a program that depends on the collector scanning + dynamic library data areas, it may be a good idea to include at least + one call to GC_is_visible() to ensure that those areas are visible + to the collector. + + Note that the garbage collector does not need to be informed of shared + read-only data. However if the shared library mechanism can introduce + discontiguous data areas that may contain pointers, then the collector does + need to be informed. + + Signal processing for most signals may be deferred during collection, + and during uninterruptible parts of the allocation process. + Like standard ANSI C mallocs, by default it is unsafe to invoke + malloc (and other GC routines) from a signal handler while another + malloc call may be in progress. Removing -DNO_SIGNALS from Makefile + attempts to remedy that. But that may not be reliable with a compiler that + substantially reorders memory operations inside GC_malloc. + + The allocator/collector can also be configured for thread-safe operation. + (Full signal safety can also be achieved, but only at the cost of two system + calls per malloc, which is usually unacceptable.) + WARNING: the collector does not guarantee to scan thread-local storage + (e.g. of the kind accessed with pthread_getspecific()). The collector + does scan thread stacks, though, so generally the best solution is to + ensure that any pointers stored in thread-local storage are also + stored on the thread's stack for the duration of their lifetime. + (This is arguably a longstanding bug, but it hasn't been fixed yet.) + + INSTALLATION AND PORTABILITY + + As distributed, the macro SILENT is defined in Makefile. + In the event of problems, this can be removed to obtain a moderate + amount of descriptive output for each collection. + (The given statistics exhibit a few peculiarities. + Things don't appear to add up for a variety of reasons, most notably + fragmentation losses. These are probably much more significant for the + contrived program "test.c" than for your application.) + + Note that typing "make test" will automatically build the collector + and then run setjmp_test and gctest. Setjmp_test will give you information + about configuring the collector, which is useful primarily if you have + a machine that's not already supported. Gctest is a somewhat superficial + test of collector functionality. Failure is indicated by a core dump or + a message to the effect that the collector is broken. Gctest takes about + 35 seconds to run on a SPARCstation 2. It may use up to 8 MB of memory. (The + multi-threaded version will use more. 64-bit versions may use more.) + "Make test" will also, as its last step, attempt to build and test the + "cord" string library. This will fail without an ANSI C compiler, but + the garbage collector itself should still be usable. + + The Makefile will generate a library gc.a which you should link against. + Typing "make cords" will add the cord library to gc.a. + Note that this requires an ANSI C compiler. + + It is suggested that if you need to replace a piece of the collector + (e.g. GC_mark_rts.c) you simply list your version ahead of gc.a on the + ld command line, rather than replacing the one in gc.a. (This will + generate numerous warnings under some versions of AIX, but it still + works.) + + All include files that need to be used by clients will be put in the + include subdirectory. (Normally this is just gc.h. "Make cords" adds + "cord.h" and "ec.h".) + + The collector currently is designed to run essentially unmodified on + machines that use a flat 32-bit or 64-bit address space. + That includes the vast majority of Workstations and X86 (X >= 3) PCs. + (The list here was deleted because it was getting too long and constantly + out of date.) + It does NOT run under plain 16-bit DOS or Windows 3.X. There are however + various packages (e.g. win32s, djgpp) that allow flat 32-bit address + applications to run under those systemsif the have at least an 80386 processor, + and several of those are compatible with the collector. + + In a few cases (Amiga, OS/2, Win32, MacOS) a separate makefile + or equivalent is supplied. Many of these have separate README.system + files. + + Dynamic libraries are completely supported only under SunOS + (and even that support is not functional on the last Sun 3 release), + Linux, IRIX 5&6, HP-PA, Win32 (not Win32S) and OSF/1 on DEC AXP machines. + On other machines we recommend that you do one of the following: + + 1) Add dynamic library support (and send us the code). + 2) Use static versions of the libraries. + 3) Arrange for dynamic libraries to use the standard malloc. + This is still dangerous if the library stores a pointer to a + garbage collected object. But nearly all standard interfaces + prohibit this, because they deal correctly with pointers + to stack allocated objects. (Strtok is an exception. Don't + use it.) + + In all cases we assume that pointer alignment is consistent with that + enforced by the standard C compilers. If you use a nonstandard compiler + you may have to adjust the alignment parameters defined in gc_priv.h. + + A port to a machine that is not byte addressed, or does not use 32 bit + or 64 bit addresses will require a major effort. A port to plain MSDOS + or win16 is hard. + + For machines not already mentioned, or for nonstandard compilers, the + following are likely to require change: + + 1. The parameters in gcconfig.h. + The parameters that will usually require adjustment are + STACKBOTTOM, ALIGNMENT and DATASTART. Setjmp_test + prints its guesses of the first two. + DATASTART should be an expression for computing the + address of the beginning of the data segment. This can often be + &etext. But some memory management units require that there be + some unmapped space between the text and the data segment. Thus + it may be more complicated. On UNIX systems, this is rarely + documented. But the adb "$m" command may be helpful. (Note + that DATASTART will usually be a function of &etext. Thus a + single experiment is usually insufficient.) + STACKBOTTOM is used to initialize GC_stackbottom, which + should be a sufficient approximation to the coldest stack address. + On some machines, it is difficult to obtain such a value that is + valid across a variety of MMUs, OS releases, etc. A number of + alternatives exist for using the collector in spite of this. See the + discussion in gcconfig.h immediately preceding the various + definitions of STACKBOTTOM. + + 2. mach_dep.c. + The most important routine here is one to mark from registers. + The distributed file includes a generic hack (based on setjmp) that + happens to work on many machines, and may work on yours. Try + compiling and running setjmp_t.c to see whether it has a chance of + working. (This is not correct C, so don't blame your compiler if it + doesn't work. Based on limited experience, register window machines + are likely to cause trouble. If your version of setjmp claims that + all accessible variables, including registers, have the value they + had at the time of the longjmp, it also will not work. Vanilla 4.2 BSD + on Vaxen makes such a claim. SunOS does not.) + If your compiler does not allow in-line assembly code, or if you prefer + not to use such a facility, mach_dep.c may be replaced by a .s file + (as we did for the MIPS machine and the PC/RT). + At this point enough architectures are supported by mach_dep.c + that you will rarely need to do more than adjust for assembler + syntax. + + 3. os_dep.c (and gc_priv.h). + Several kinds of operating system dependent routines reside here. + Many are optional. Several are invoked only through corresponding + macros in gc_priv.h, which may also be redefined as appropriate. + The routine GC_register_data_segments is crucial. It registers static + data areas that must be traversed by the collector. (User calls to + GC_add_roots may sometimes be used for similar effect.) + Routines to obtain memory from the OS also reside here. + Alternatively this can be done entirely by the macro GET_MEM + defined in gc_priv.h. Routines to disable and reenable signals + also reside here if they are need by the macros DISABLE_SIGNALS + and ENABLE_SIGNALS defined in gc_priv.h. + In a multithreaded environment, the macros LOCK and UNLOCK + in gc_priv.h will need to be suitably redefined. + The incremental collector requires page dirty information, which + is acquired through routines defined in os_dep.c. Unless directed + otherwise by gcconfig.h, these are implemented as stubs that simply + treat all pages as dirty. (This of course makes the incremental + collector much less useful.) + + 4. dyn_load.c + This provides a routine that allows the collector to scan data + segments associated with dynamic libraries. Often it is not + necessary to provide this routine unless user-written dynamic + libraries are used. + + For a different version of UN*X or different machines using the + Motorola 68000, Vax, SPARC, 80386, NS 32000, PC/RT, or MIPS architecture, + it should frequently suffice to change definitions in gcconfig.h. + + + THE C INTERFACE TO THE ALLOCATOR + + The following routines are intended to be directly called by the user. + Note that usually only GC_malloc is necessary. GC_clear_roots and GC_add_roots + calls may be required if the collector has to trace from nonstandard places + (e.g. from dynamic library data areas on a machine on which the + collector doesn't already understand them.) On some machines, it may + be desirable to set GC_stacktop to a good approximation of the stack base. + (This enhances code portability on HP PA machines, since there is no + good way for the collector to compute this value.) Client code may include + "gc.h", which defines all of the following, plus many others. + + 1) GC_malloc(nbytes) + - allocate an object of size nbytes. Unlike malloc, the object is + cleared before being returned to the user. Gc_malloc will + invoke the garbage collector when it determines this to be appropriate. + GC_malloc may return 0 if it is unable to acquire sufficient + space from the operating system. This is the most probable + consequence of running out of space. Other possible consequences + are that a function call will fail due to lack of stack space, + or that the collector will fail in other ways because it cannot + maintain its internal data structures, or that a crucial system + process will fail and take down the machine. Most of these + possibilities are independent of the malloc implementation. + + 2) GC_malloc_atomic(nbytes) + - allocate an object of size nbytes that is guaranteed not to contain any + pointers. The returned object is not guaranteed to be cleared. + (Can always be replaced by GC_malloc, but results in faster collection + times. The collector will probably run faster if large character + arrays, etc. are allocated with GC_malloc_atomic than if they are + statically allocated.) + + 3) GC_realloc(object, new_size) + - change the size of object to be new_size. Returns a pointer to the + new object, which may, or may not, be the same as the pointer to + the old object. The new object is taken to be atomic iff the old one + was. If the new object is composite and larger than the original object, + then the newly added bytes are cleared (we hope). This is very likely + to allocate a new object, unless MERGE_SIZES is defined in gc_priv.h. + Even then, it is likely to recycle the old object only if the object + is grown in small additive increments (which, we claim, is generally bad + coding practice.) + + 4) GC_free(object) + - explicitly deallocate an object returned by GC_malloc or + GC_malloc_atomic. Not necessary, but can be used to minimize + collections if performance is critical. Probably a performance + loss for very small objects (<= 8 bytes). + + 5) GC_expand_hp(bytes) + - Explicitly increase the heap size. (This is normally done automatically + if a garbage collection failed to GC_reclaim enough memory. Explicit + calls to GC_expand_hp may prevent unnecessarily frequent collections at + program startup.) + + 6) GC_malloc_ignore_off_page(bytes) + - identical to GC_malloc, but the client promises to keep a pointer to + the somewhere within the first 256 bytes of the object while it is + live. (This pointer should nortmally be declared volatile to prevent + interference from compiler optimizations.) This is the recommended + way to allocate anything that is likely to be larger than 100Kbytes + or so. (GC_malloc may result in failure to reclaim such objects.) + + 7) GC_set_warn_proc(proc) + - Can be used to redirect warnings from the collector. Such warnings + should be rare, and should not be ignored during code development. + + 8) GC_enable_incremental() + - Enables generational and incremental collection. Useful for large + heaps on machines that provide access to page dirty information. + Some dirty bit implementations may interfere with debugging + (by catching address faults) and place restrictions on heap arguments + to system calls (since write faults inside a system call may not be + handled well). + + 9) Several routines to allow for registration of finalization code. + User supplied finalization code may be invoked when an object becomes + unreachable. To call (*f)(obj, x) when obj becomes inaccessible, use + GC_register_finalizer(obj, f, x, 0, 0); + For more sophisticated uses, and for finalization ordering issues, + see gc.h. + + The global variable GC_free_space_divisor may be adjusted up from its + default value of 4 to use less space and more collection time, or down for + the opposite effect. Setting it to 1 or 0 will effectively disable collections + and cause all allocations to simply grow the heap. + + The variable GC_non_gc_bytes, which is normally 0, may be changed to reflect + the amount of memory allocated by the above routines that should not be + considered as a candidate for collection. Careless use may, of course, result + in excessive memory consumption. + + Some additional tuning is possible through the parameters defined + near the top of gc_priv.h. + + If only GC_malloc is intended to be used, it might be appropriate to define: + + #define malloc(n) GC_malloc(n) + #define calloc(m,n) GC_malloc((m)*(n)) + + For small pieces of VERY allocation intensive code, gc_inl.h + includes some allocation macros that may be used in place of GC_malloc + and friends. + + All externally visible names in the garbage collector start with "GC_". + To avoid name conflicts, client code should avoid this prefix, except when + accessing garbage collector routines or variables. + + There are provisions for allocation with explicit type information. + This is rarely necessary. Details can be found in gc_typed.h. + + THE C++ INTERFACE TO THE ALLOCATOR: + + The Ellis-Hull C++ interface to the collector is included in + the collector distribution. If you intend to use this, type + "make c++" after the initial build of the collector is complete. + See gc_cpp.h for the definition of the interface. This interface + tries to approximate the Ellis-Detlefs C++ garbage collection + proposal without compiler changes. + + Cautions: + 1. Arrays allocated without new placement syntax are + allocated as uncollectable objects. They are traced by the + collector, but will not be reclaimed. + + 2. Failure to use "make c++" in combination with (1) will + result in arrays allocated using the default new operator. + This is likely to result in disaster without linker warnings. + + 3. If your compiler supports an overloaded new[] operator, + then gc_cpp.cc and gc_cpp.h should be suitably modified. + + 4. Many current C++ compilers have deficiencies that + break some of the functionality. See the comments in gc_cpp.h + for suggested workarounds. + + USE AS LEAK DETECTOR: + + The collector may be used to track down leaks in C programs that are + intended to run with malloc/free (e.g. code with extreme real-time or + portability constraints). To do so define FIND_LEAK in Makefile + This will cause the collector to invoke the report_leak + routine defined near the top of reclaim.c whenever an inaccessible + object is found that has not been explicitly freed. Such objects will + also be automatically reclaimed. + Productive use of this facility normally involves redefining report_leak + to do something more intelligent. This typically requires annotating + objects with additional information (e.g. creation time stack trace) that + identifies their origin. Such code is typically not very portable, and is + not included here, except on SPARC machines. + If all objects are allocated with GC_DEBUG_MALLOC (see next section), + then the default version of report_leak will report the source file + and line number at which the leaked object was allocated. This may + sometimes be sufficient. (On SPARC/SUNOS4 machines, it will also report + a cryptic stack trace. This can often be turned into a sympolic stack + trace by invoking program "foo" with "callprocs foo". Callprocs is + a short shell script that invokes adb to expand program counter values + to symbolic addresses. It was largely supplied by Scott Schwartz.) + Note that the debugging facilities described in the next section can + sometimes be slightly LESS effective in leak finding mode, since in + leak finding mode, GC_debug_free actually results in reuse of the object. + (Otherwise the object is simply marked invalid.) Also note that the test + program is not designed to run meaningfully in FIND_LEAK mode. + Use "make gc.a" to build the collector. + + DEBUGGING FACILITIES: + + The routines GC_debug_malloc, GC_debug_malloc_atomic, GC_debug_realloc, + and GC_debug_free provide an alternate interface to the collector, which + provides some help with memory overwrite errors, and the like. + Objects allocated in this way are annotated with additional + information. Some of this information is checked during garbage + collections, and detected inconsistencies are reported to stderr. + + Simple cases of writing past the end of an allocated object should + be caught if the object is explicitly deallocated, or if the + collector is invoked while the object is live. The first deallocation + of an object will clear the debugging info associated with an + object, so accidentally repeated calls to GC_debug_free will report the + deallocation of an object without debugging information. Out of + memory errors will be reported to stderr, in addition to returning + NIL. + + GC_debug_malloc checking during garbage collection is enabled + with the first call to GC_debug_malloc. This will result in some + slowdown during collections. If frequent heap checks are desired, + this can be achieved by explicitly invoking GC_gcollect, e.g. from + the debugger. + + GC_debug_malloc allocated objects should not be passed to GC_realloc + or GC_free, and conversely. It is however acceptable to allocate only + some objects with GC_debug_malloc, and to use GC_malloc for other objects, + provided the two pools are kept distinct. In this case, there is a very + low probablility that GC_malloc allocated objects may be misidentified as + having been overwritten. This should happen with probability at most + one in 2**32. This probability is zero if GC_debug_malloc is never called. + + GC_debug_malloc, GC_malloc_atomic, and GC_debug_realloc take two + additional trailing arguments, a string and an integer. These are not + interpreted by the allocator. They are stored in the object (the string is + not copied). If an error involving the object is detected, they are printed. + + The macros GC_MALLOC, GC_MALLOC_ATOMIC, GC_REALLOC, GC_FREE, and + GC_REGISTER_FINALIZER are also provided. These require the same arguments + as the corresponding (nondebugging) routines. If gc.h is included + with GC_DEBUG defined, they call the debugging versions of these + functions, passing the current file name and line number as the two + extra arguments, where appropriate. If gc.h is included without GC_DEBUG + defined, then all these macros will instead be defined to their nondebugging + equivalents. (GC_REGISTER_FINALIZER is necessary, since pointers to + objects with debugging information are really pointers to a displacement + of 16 bytes form the object beginning, and some translation is necessary + when finalization routines are invoked. For details, about what's stored + in the header, see the definition of the type oh in debug_malloc.c) + + INCREMENTAL/GENERATIONAL COLLECTION: + + The collector normally interrupts client code for the duration of + a garbage collection mark phase. This may be unacceptable if interactive + response is needed for programs with large heaps. The collector + can also run in a "generational" mode, in which it usually attempts to + collect only objects allocated since the last garbage collection. + Furthermore, in this mode, garbage collections run mostly incrementally, + with a small amount of work performed in response to each of a large number of + GC_malloc requests. + + This mode is enabled by a call to GC_enable_incremental(). + + Incremental and generational collection is effective in reducing + pause times only if the collector has some way to tell which objects + or pages have been recently modified. The collector uses two sources + of information: + + 1. Information provided by the VM system. This may be provided in + one of several forms. Under Solaris 2.X (and potentially under other + similar systems) information on dirty pages can be read from the + /proc file system. Under other systems (currently SunOS4.X) it is + possible to write-protect the heap, and catch the resulting faults. + On these systems we require that system calls writing to the heap + (other than read) be handled specially by client code. + See os_dep.c for details. + + 2. Information supplied by the programmer. We define "stubborn" + objects to be objects that are rarely changed. Such an object + can be allocated (and enabled for writing) with GC_malloc_stubborn. + Once it has been initialized, the collector should be informed with + a call to GC_end_stubborn_change. Subsequent writes that store + pointers into the object must be preceded by a call to + GC_change_stubborn. + + This mechanism performs best for objects that are written only for + initialization, and such that only one stubborn object is writable + at once. It is typically not worth using for short-lived + objects. Stubborn objects are treated less efficiently than pointerfree + (atomic) objects. + + A rough rule of thumb is that, in the absence of VM information, garbage + collection pauses are proportional to the amount of pointerful storage + plus the amount of modified "stubborn" storage that is reachable during + the collection. + + Initial allocation of stubborn objects takes longer than allocation + of other objects, since other data structures need to be maintained. + + We recommend against random use of stubborn objects in client + code, since bugs caused by inappropriate writes to stubborn objects + are likely to be very infrequently observed and hard to trace. + However, their use may be appropriate in a few carefully written + library routines that do not make the objects themselves available + for writing by client code. + + + BUGS: + + Any memory that does not have a recognizable pointer to it will be + reclaimed. Exclusive-or'ing forward and backward links in a list + doesn't cut it. + Some C optimizers may lose the last undisguised pointer to a memory + object as a consequence of clever optimizations. This has almost + never been observed in practice. Send mail to boehm@acm.org + for suggestions on how to fix your compiler. + This is not a real-time collector. In the standard configuration, + percentage of time required for collection should be constant across + heap sizes. But collection pauses will increase for larger heaps. + (On SPARCstation 2s collection times will be on the order of 300 msecs + per MB of accessible memory that needs to be scanned. Your mileage + may vary.) The incremental/generational collection facility helps, + but is portable only if "stubborn" allocation is used. + Please address bug reports to boehm@acm.org. If you are + contemplating a major addition, you might also send mail to ask whether + it's already been done (or whether we tried and discarded it). + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.Mac gcc-3.1/boehm-gc/doc/README.Mac *** gcc-3.0.4/boehm-gc/doc/README.Mac Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.Mac Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,385 ---- + Patrick Beard's Notes for building GC v4.12 with CodeWarrior Pro 2: + ---------------------------------------------------------------------------- + The current build environment for the collector is CodeWarrior Pro 2. + Projects for CodeWarrior Pro 2 (and for quite a few older versions) + are distributed in the file Mac_projects.sit.hqx. The project file + :Mac_projects:gc.prj builds static library versions of the collector. + :Mac_projects:gctest.prj builds the GC test suite. + + Configuring the collector is still done by editing the files + :Mac_files:MacOS_config.h and :Mac_files:MacOS_Test_config.h. + + Lars Farm's suggestions on building the collector: + ---------------------------------------------------------------------------- + Garbage Collection on MacOS - a manual 'MakeFile' + ------------------------------------------------- + + Project files and IDE's are great on the Macintosh, but they do have + problems when used as distribution media. This note tries to provide + porting instructions in pure TEXT form to avoid those problems. A manual + 'makefile' if you like. + + GC version: 4.12a2 + Codewarrior: CWPro1 + date: 18 July 1997 + + The notes may or may not apply to earlier or later versions of the + GC/CWPro. Actually, they do apply to earlier versions of both except that + until recently a project could only build one target so each target was a + separate project. The notes will most likely apply to future versions too. + Possibly with minor tweaks. + + This is just to record my experiences. These notes do not mean I now + provide a supported port of the GC to MacOS. It works for me. If it works + for you, great. If it doesn't, sorry, try again...;-) Still, if you find + errors, please let me know. + + mailto: lars.farm@ite.mh.se + + address: Lars Farm + Krönvägen 33b + 856 44 Sundsvall + Sweden + + Porting to MacOS is a bit more complex than it first seems. Which MacOS? + 68K/PowerPC? Which compiler? Each supports both 68K and PowerPC and offer a + large number of (unique to each environment) compiler settings. Each + combination of compiler/68K/PPC/settings require a unique combination of + standard libraries. And the IDE's does not select them for you. They don't + even check that the library is built with compatible setting and this is + the major source of problems when porting the GC (and otherwise too). + + You will have to make choices when you configure the GC. I've made some + choices here, but there are other combinations of settings and #defines + that work too. + + As for target settings the major obstacles may be: + - 68K Processor: check "4-byte Ints". + - PPC Processor: uncheck "Store Static Data in TOC". + + What you need to do: + =================== + + 1) Build the GC as a library + 2) Test that the library works with 'test.c'. + 3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'. + + 1) The Libraries: + ================= + I made one project with four targets (68K/PPC tempmem or appheap). One target + will suffice if you're able to decide which one you want. I wasn't... + + Codewarrior allows a large number of compiler/linker settings. I used these: + + Settings shared by all targets: + ------------------------------ + o Access Paths: + - User Paths: the GC folder + - System Paths: {Compiler}:Metrowerks Standard Library: + {Compiler}:MacOS Support:Headers: + {Compiler}:MacOS Support:MacHeaders: + o C/C++ language: + - inlining: normal + - direct to SOM: off + - enable/check: exceptions, RTTI, bool (and if you like pool strings) + + PowerPC target settings + ----------------------- + o Target Settings: + - name of target + - MacOS PPC Linker + o PPC Target + - name of library + o C/C++ language + - prefix file as described below + o PPC Processor + - Struct Alignment: PowerPC + - uncheck "Store Static Data in TOC" -- important! + I don't think the others matter, I use full optimization and its ok + o PPC Linker + - Factory Settings (SYM file with full paths, faster linking, dead-strip + static init, Main: __start) + + + 68K target settings + ------------------- + o Target Settings: + - name of target + - MacOS 68K Linker + o 68K Target + - name of library + - A5 relative data + o C/C++ language + - prefix file as described below + o 68K Processor + - Code model: smart + - Struct alignment: 68K + - FP: SANE + - enable 4-Byte Ints -- important! + I don't think the others matter. I selected... + - enable: 68020 + - enable: global register allocation + o IR Optimizer + - enable: Optimize Space, Optimize Speed + I suppose the others would work too, but haven't tried... + o 68K Linker + - Factory Settings (New Style MacsBug,SYM file with full paths, + A6 Frames, fast link, Merge compiler glue into segment 1, + dead-strip static init) + + Prefix Files to configure the GC sources + ---------------------------------------- + The Codewarrior equivalent of commandline compilers -DNAME=X is to use + prefix-files. A TEXT file that is automatically #included before the first byte + of every source file. I used these: + + ---- ( cut here ) ---- gc_prefix_tempmem.h -- 68K and PPC ----- + #include "gc_prefix_common.h" + #undef USE_TEMPORARY_MEMORY + #define USE_TEMPORARY_MEMORY + ---- ( cut here ) ---- gc_prefix_appmem.h -- 68K and PPC ----- + #include "gc_prefix_common.h" + #undef USE_TEMPORARY_MEMORY + // #define USE_TEMPORARY_MEMORY + + ---- ( cut here ) ---- gc_prefix_common.h -------------------- + // gc_prefix_common.h + // ------------------ + // Codewarrior prefix file to configure the GC libraries + // + // prefix files are the Codewarrior equivalent of the + // command line option -Dname=x frequently seen in makefiles + + #if !__MWERKS__ + #error only tried this with Codewarrior + #endif + + #if macintosh + #define MSL_USE_PRECOMPILED_HEADERS 0 + #include + #ifndef __STDC__ + #define __STDC__ 0 + #endif + + // See list of #defines to configure the library in: 'MakeFile' + // see also README + + #define SILENT // no collection messages. In case + // of trouble you might want this off + #define ALL_INTERIOR_POINTERS // follows interior pointers. + //#define DONT_ADD_BYTE_AT_END // disables the padding if defined. + //#define SMALL_CONFIG // whether to use a smaller heap. + #define NO_SIGNALS // signals aren't real on the Macintosh. + #define ATOMIC_UNCOLLECTABLE // GC_malloc_atomic_uncollectable() + + // define either or none as per personal preference + // used in malloc.c + #define REDIRECT_MALLOC GC_malloc + //#define REDIRECT_MALLOC GC_malloc_uncollectable + // if REDIRECT_MALLOC is #defined make sure that the GC library + // is listed before the ANSI/ISO libs in the Codewarrior + // 'Link order' panel + //#define IGNORE_FREE + + // mac specific configs + //#define USE_TEMPORARY_MEMORY // use Macintosh temporary memory. + //#define SHARED_LIBRARY_BUILD // build for use in a shared library. + + #else + // could build Win32 here too, or in the future + // Rhapsody PPC-mach, Rhapsody PPC-MacOS, + // Rhapsody Intel-mach, Rhapsody Intel-Win32,... + // ... ugh this will get messy ... + #endif + + // make sure ints are at least 32-bit + // ( could be set to 16-bit by compiler settings (68K) ) + + struct gc_private_assert_intsize_{ char x[ sizeof(int)>=4 ? 1 : 0 ]; }; + + #if __powerc + #if __option(toc_data) + #error turn off "store static data in TOC" when using GC + // ... or find a way to add TOC to the root set...(?) + #endif + #endif + ---- ( cut here ) ---- end of gc_prefix_common.h ----------------- + + Files to build the GC libraries: + -------------------------------- + allchblk.c + alloc.c + blacklst.c + checksums.c + dbg_mlc.c + finalize.c + headers.c + mach_dep.c + MacOS.c -- contains MacOS code + malloc.c + mallocx.c + mark.c + mark_rts.c + misc.c + new_hblk.c + obj_map.c + os_dep.c -- contains MacOS code + ptr_chck.c + reclaim.c + stubborn.c + typd_mlc.c + gc++.cc -- this is 'gc_cpp.cc' with less 'inline' and + -- throw std::bad_alloc when out of memory + -- gc_cpp.cc works just fine too + + 2) Test that the library works with 'test.c'. + ============================================= + + The test app is just an ordinary ANSI-C console app. Make sure settings + match the library you're testing. + + Files + ----- + test.c + the GC library to test -- link order before ANSI libs + suitable Mac+ANSI libraries + + prefix: + ------ + ---- ( cut here ) ---- gc_prefix_testlib.h -- all libs ----- + #define MSL_USE_PRECOMPILED_HEADERS 0 + #include + #undef NDEBUG + + #define ALL_INTERIOR_POINTERS /* for GC_priv.h */ + ---- ( cut here ) ---- + + 3) Test that the C++ interface 'gc_cpp.cc/h' works with 'test_cpp.cc'. + + The test app is just an ordinary ANSI-C console app. Make sure settings match + the library you're testing. + + Files + ----- + test_cpp.cc + the GC library to test -- link order before ANSI libs + suitable Mac+ANSI libraries + + prefix: + ------ + same as for test.c + + For convenience I used one test-project with several targets so that all + test apps are build at once. Two for each library to test: test.c and + gc_app.cc. When I was satisfied that the libraries were ok. I put the + libraries + gc.h + the c++ interface-file in a folder that I then put into + the MSL hierarchy so that I don't have to alter access-paths in projects + that use the GC. + + After that, just add the proper GC library to your project and the GC is in + action! malloc will call GC_malloc and free GC_free, new/delete too. You + don't have to call free or delete. You may have to be a bit cautious about + delete if you're freeing other resources than RAM. See gc_cpp.h. You can + also keep coding as always with delete/free. That works too. If you want, + "include and tweak it's use a bit. + + Symantec SPM + ============ + It has been a while since I tried the GC in SPM, but I think that the above + instructions should be sufficient to guide you through in SPM too. SPM + needs to know where the global data is. Use the files 'datastart.c' and + 'dataend.c'. Put 'datastart.c' at the top of your project and 'dataend.c' + at the bottom of your project so that all data is surrounded. This is not + needed in Codewarrior because it provides intrinsic variables + __datastart__, __data_end__ that wraps all globals. + + Source Changes (GC 4.12a2) + ========================== + Very few. Just one tiny in the GC, not strictly needed. + - MacOS.c line 131 in routine GC_MacFreeTemporaryMemory() + change # if !defined(SHARED_LIBRARY_BUILD) + to # if !defined(SILENT) && !defined(SHARED_LIBRARY_BUILD) + To turn off a message when the application quits (actually, I faked + this change by #defining SHARED_LIBRARY_BUILD in a statically linked + library for more than a year without ill effects but perhaps this is + better). + + - test_cpp.cc + made the first lines of main() look like this: + ------------ + int main( int argc, char* argv[] ) { + #endif + #if macintosh // MacOS + char* argv_[] = {"test_cpp","10"}; // doesn't + argv=argv_; // have a + argc = sizeof(argv_)/sizeof(argv_[0]); // commandline + #endif // + + int i, iters, n; + # ifndef __GNUC__ + alloc dummy_to_fool_the_compiler_into_doing_things_it_currently_cant_handle; + ------------ + + - config.h [now gcconfig.h] + __MWERKS__ does not have to mean MACOS. You can use Codewarrior to + build a Win32 or BeOS library and soon a Rhapsody library. You may + have to change that #if... + + + + It worked for me, hope it works for you. + + Lars Farm + 18 July 1997 + ---------------------------------------------------------------------------- + + + Patrick Beard's instructions (may be dated): + + v4.3 of the collector now runs under Symantec C++/THINK C v7.0.4, and + Metrowerks C/C++ v4.5 both 68K and PowerPC. Project files are provided + to build and test the collector under both development systems. + + Configuration + ------------- + + To configure the collector, under both development systems, a prefix file + is used to set preprocessor directives. This file is called "MacOS_config.h". + Also to test the collector, "MacOS_Test_config.h" is provided. + + Testing + ------- + + To test the collector (always a good idea), build one of the gctest projects, + gctest.¹ (Symantec C++/THINK C), mw/gctest.68K.¹, or mw/gctest.PPC.¹. The + test will ask you how many times to run; 1 should be sufficient. + + Building + -------- + + For your convenience project files for the major Macintosh development + systems are provided. + + For Symantec C++/THINK C, you must build the two projects gclib-1.¹ and + gclib-2.¹. It has to be split up because the collector has more than 32k + of static data and no library can have more than this in the Symantec + environment. (Future versions will probably fix this.) + + For Metrowerks C/C++ 4.5 you build gc.68K.¹/gc.PPC.¹ and the result will + be a library called gc.68K.lib/gc.PPC.lib. + + Using + ----- + + Under Symantec C++/THINK C, you can just add the gclib-1.¹ and gclib-2.¹ + projects to your own project. Under Metrowerks, you add gc.68K.lib or + gc.PPC.lib and two additional files. You add the files called datastart.c + and dataend.c to your project, bracketing all files that use the collector. + See mw/gctest.¹ for an example. + + Include the projects/libraries you built above into your own project, + #include "gc.h", and call GC_malloc. You don't have to call GC_free. + + + Patrick C. Beard + January 4, 1995 diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.MacOSX gcc-3.1/boehm-gc/doc/README.MacOSX *** gcc-3.0.4/boehm-gc/doc/README.MacOSX Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.MacOSX Sat Aug 18 01:04:43 2001 *************** *** 0 **** --- 1,27 ---- + While the GC should work on MacOS X Server, MacOS X and Darwin, I only tested + it on MacOS X Server. + I've added a PPC assembly version of GC_push_regs(), thus the setjmp() hack is + no longer necessary. Incremental collection is supported via mprotect/signal. + The current solution isn't really optimal because the signal handler must decode + the faulting PPC machine instruction in order to find the correct heap address. + Further, it must poke around in the register state which the kernel saved away + in some obscure register state structure before it calls the signal handler - + needless to say the layout of this structure is no where documented. + Threads and dynamic libraries are not yet supported (adding dynamic library + support via the low-level dyld API shouldn't be that hard). + + The original MacOS X port was brought to you by Andrew Stone. + + + June, 1 2000 + + Dietmar Planitzer + dave.pl@ping.at + + Note from Andrew Begel: + + One more fix to enable gc.a to link successfully into a shared library for + MacOS X. You have to add -fno-common to the CFLAGS in the Makefile. MacOSX + disallows common symbols in anything that eventually finds its way into a + shared library. (I don't completely understand why, but -fno-common seems to + work and doesn't mess up the garbage collector's functionality). diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.OS2 gcc-3.1/boehm-gc/doc/README.OS2 *** gcc-3.0.4/boehm-gc/doc/README.OS2 Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.OS2 Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,6 ---- + The code assumes static linking, and a single thread. The editor de has + not been ported. The cord test program has. The supplied OS2_MAKEFILE + assumes the IBM C Set/2 environment, but the code shouldn't. + + Since we haven't figured out hoe to do perform partial links or to build static + libraries, clients currently need to link against a long list of executables. diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.amiga gcc-3.1/boehm-gc/doc/README.amiga *** gcc-3.0.4/boehm-gc/doc/README.amiga Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.amiga Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,322 ---- + =========================================================================== + Kjetil S. Matheussen's notes (28-11-2000) + =========================================================================== + Compiles under SAS/C again. Should allso still compile under other + amiga compilers without big changes. I haven't checked if it still + works under gcc, because I don't have gcc for amiga. But I have + updated 'Makefile', and hope it compiles fine. + + + WHATS NEW: + + 1. + Made a pretty big effort in preventing GCs allocating-functions from returning + chip-mem. + + The lower part of the new file AmigaOS.c does this in various ways, mainly by + wrapping GC_malloc, GC_malloc_atomic, GC_malloc_uncollectable, + GC_malloc_atomic_uncollectable, GC_malloc_stubborn, GC_malloc_ignore_off_page + and GC_malloc_atomic_ignore_off_page. GC_realloc is allso wrapped, but + doesn't do the same effort in preventing to return chip-mem. + Other allocating-functions (f.ex. GC_*_typed_) can probably be + used without any problems, but beware that the warn hook will not be called. + In case of problems, don't define GC_AMIGA_FASTALLOC. + + Programs using more time actually using the memory allocated + (instead of just allocate and free rapidly) have + the most to earn on this, but even gctest now normally runs twice + as fast and uses less memory, on my poor 8MB machine. + + The changes have only effect when there is no more + fast-mem left. But with the way GC works, it + could happen quite often. Beware that an atexit handler had to be added, + so using the abort() function will make a big memory-loss. + If you absolutely must call abort() instead of exit(), try calling + the GC_amiga_free_all_mem function before abort(). + + New amiga-spesific compilation flags: + + GC_AMIGA_FASTALLOC - By NOT defining this option, GC will work like before, + it will not try to force fast-mem out of the OS, and + it will use normal calloc for allocation, and the rest + of the following flags will have no effect. + + GC_AMIGA_ONLYFAST - Makes GC never to return chip-mem. GC_AMIGA_RETRY have + no effect if this flag is set. + + GC_AMIGA_GC - If gc returns NULL, do a GC_gcollect, and try again. This + usually is a success with the standard GC configuration. + It is allso the most important flag to set to prevent + GC from returning chip-mem. Beware that it slows down a lot + when a program is rapidly allocating/deallocating when + theres either very little fast-memory left or verly little + chip-memory left. Its not a very common situation, but gctest + sometimes (very rare) use many minutes because of this. + + GC_AMIGA_RETRY - If gc succeed allocating memory, but it is chip-mem, + try again and see if it is fast-mem. Most of the time, + it will actually return fast-mem for the second try. + I have set max number of retries to 9 or size/5000. You + can change this if you like. (see GC_amiga_rec_alloc()) + + GC_AMIGA_PRINTSTATS - Gather some statistics during the execution of a + program, and prints out the info when the atexit-handler + is called. + + My reccomendation is to set all this flags, except GC_AMIGA_PRINTSTATS and + GC_AMIGA_ONLYFAST. + + If your program demands high response-time, you should + not define GC_AMIGA_GC, and possible allso define GC_AMIGA_ONLYFAST. + GC_AMIGA_RETRY does not seem to slow down much. + + Allso, when compiling up programs, and GC_AMIGA_FASTALLOC was not defined when + compilling gc, you can define GC_AMIGA_MAKINGLIB to avoid having these allocation- + functions wrapped. (see gc.h) + + Note that GC_realloc must not be called before any of + the other above mentioned allocating-functions have been called. (shouldn't be + any programs doing so either, I hope). + + Another note. The allocation-function is wrapped when defining + GC_AMIGA_FASTALLOC by letting the function go thru the new + GC_amiga_allocwrapper_do function-pointer (see gc.h). Means that + sending function-pointers, such as GC_malloc, GC_malloc_atomic, etc., + for later to be called like f.ex this, (*GC_malloc_functionpointer)(size), + will not wrap the function. This is normally not a big problem, unless + all allocation function is called like this, which will cause the + atexit un-allocating function never to be called. Then you either + have to manually add the atexit handler, or call the allocation- + functions function-pointer functions like this; + (*GC_amiga_allocwrapper_do)(size,GC_malloc_functionpointer). + There are probably better ways this problem could be handled, unfortunately, + I didn't find any without rewriting or replacing a lot of the GC-code, which + I really didn't want to. (Making new GC_malloc_* functions, and just + define f.ex GC_malloc as GC_amiga_malloc should allso work). + + + New amiga-spesific function: + + void GC_amiga_set_toany(void (*func)(void)); + + 'func' is a function that will be called right before gc has to change + allocation-method from MEMF_FAST to MEMF_ANY. Ie. when it is likely + it will return chip-mem. + + + 2. A few small compiler-spesific additions to make it compile with SAS/C again. + + 3. Updated and rewritten the smakefile, so that it works again and that + the "unnecesarry" 'SCOPTIONS' files could be removed. Allso included + the cord-smakefile stuff in the main smakefile, so that the cord smakefile + could be removed too. By writing smake -f Smakefile.smk, both gc.lib and + cord.lib will be made. + + + + STILL MISSING: + + Programs can not be started from workbench, at least not for SAS/C. (Martin + Tauchmanns note about that it now works with workbench is definitely wrong + when concerning SAS/C). I guess it works if you use the old "#if 0'ed"-code, + but I haven't tested it. I think the reason for MT to replace the + "#if 0'ed"-code was only because it was a bit to SAS/C-spesific. But I + don't know. An iconx-script solves this problem anyway. + + + BEWARE! + + -To run gctest, set the stack to around 200000 bytes first. + -SAS/C-spesific: cord will crash if you compile gc.lib with + either parm=reg or parm=both. (missing legal prototypes for + function-pointers someplace is the reason I guess.). + + + tested with software: Radium, http://www.stud.ifi.uio.no/~ksvalast/radium/ + + tested with hardware: MC68060 + + + -ksvalast@ifi.uio.no + + + =========================================================================== + Martin Tauchmann's notes (1-Apr-99) + =========================================================================== + + Works now, also with the GNU-C compiler V2.7.2.1. + Modify the `Makefile` + CC=cc $(ABI_FLAG) + to + CC=gcc $(ABI_FLAG) + + TECHNICAL NOTES + + - `GC_get_stack_base()`, `GC_register_data_segments()` works now with every + C compiler; also Workbench. + + - Removed AMIGA_SKIP_SEG, but the Code-Segment must not be scanned by GC. + + + PROBLEMS + - When the Linker, does`t merge all Code-Segments to an single one. LD of GCC + do it always. + + - With ixemul.library V47.3, when an GC program launched from another program + (example: `Make` or `if_mach M68K AMIGA gctest`), `GC_register_data_segments()` + found the Segment-List of the caller program. + Can be fixed, if the run-time initialization code (for C programs, usually *crt0*) + support `__data` and `__bss`. + + - PowerPC Amiga currently not supported. + + - Dynamic libraries (dyn_load.c) not supported. + + + TESTED WITH SOFTWARE + + `Optimized Oberon 2 C` (oo2c) + + + TESTED WITH HARDWARE + + MC68030 + + + CONTACT + + Please, contact me at , when you change the + Amiga port. + + =========================================================================== + Michel Schinz's notes + =========================================================================== + WHO DID WHAT + + The original Amiga port was made by Jesper Peterson. I (Michel Schinz) + modified it slightly to reflect the changes made in the new official + distributions, and to take advantage of the new SAS/C 6.x features. I also + created a makefile to compile the "cord" package (see the cord + subdirectory). + + TECHNICAL NOTES + + In addition to Jesper's notes, I have the following to say: + + - Starting with version 4.3, gctest checks to see if the code segment is + added to the root set or not, and complains if it is. Previous versions + of this Amiga port added the code segment to the root set, so I tried to + fix that. The only problem is that, as far as I know, it is impossible to + know which segments are code segments and which are data segments (there + are indeed solutions to this problem, like scanning the program on disk + or patch the LoadSeg functions, but they are rather complicated). The + solution I have chosen (see os_dep.c) is to test whether the program + counter is in the segment we are about to add to the root set, and if it + is, to skip the segment. The problems are that this solution is rather + awkward and that it works only for one code segment. This means that if + your program has more than one code segment, all of them but one will be + added to the root set. This isn't a big problem in fact, since the + collector will continue to work correctly, but it may be slower. + + Anyway, the code which decides whether to skip a segment or not can be + removed simply by not defining AMIGA_SKIP_SEG. But notice that if you do + so, gctest will complain (it will say that "GC_is_visible produced wrong + failure indication"). However, it may be useful if you happen to have + pointers stored in a code segment (you really shouldn't). + + If anyone has a good solution to the problem of finding, when a program + is loaded in memory, whether a segment is a code or a data segment, + please let me know. + + PROBLEMS + + If you have any problem with this version, please contact me at + schinz@alphanet.ch (but do *not* send long files, since we pay for + every mail!). + + =========================================================================== + Jesper Peterson's notes + =========================================================================== + + ADDITIONAL NOTES FOR AMIGA PORT + + These notes assume some familiarity with Amiga internals. + + WHY I PORTED TO THE AMIGA + + The sole reason why I made this port was as a first step in getting + the Sather(*) language on the Amiga. A port of this language will + be done as soon as the Sather 1.0 sources are made available to me. + Given this motivation, the garbage collection (GC) port is rather + minimal. + + (*) For information on Sather read the comp.lang.sather newsgroup. + + LIMITATIONS + + This port assumes that the startup code linked with target programs + is that supplied with SAS/C versions 6.0 or later. This allows + assumptions to be made about where to find the stack base pointer + and data segments when programs are run from WorkBench, as opposed + to running from the CLI. The compiler dependent code is all in the + GC_get_stack_base() and GC_register_data_segments() functions, but + may spread as I add Amiga specific features. + + Given that SAS/C was assumed, the port is set up to be built with + "smake" using the "SMakefile". Compiler options in "SCoptions" can + be set with "scopts" program. Both "smake" and "scopts" are part of + the SAS/C commercial development system. + + In keeping with the porting philosophy outlined above, this port + will not behave well with Amiga specific code. Especially not inter- + process comms via messages, and setting up public structures like + Intuition objects or anything else in the system lists. For the + time being the use of this library is limited to single threaded + ANSI/POSIX compliant or near-complient code. (ie. Stick to stdio + for now). Given this limitation there is currently no mechanism for + allocating "CHIP" or "PUBLIC" memory under the garbage collector. + I'll add this after giving it considerable thought. The major + problem is the entire physical address space may have to me scanned, + since there is no telling who we may have passed memory to. + + If you allocate your own stack in client code, you will have to + assign the pointer plus stack size to GC_stackbottom. + + The initial stack size of the target program can be compiled in by + setting the __stack symbol (see SAS documentaion). It can be over- + ridden from the CLI by running the AmigaDOS "stack" program, or from + the WorkBench by setting the stack size in the tool types window. + + SAS/C COMPILER OPTIONS (SCoptions) + + You may wish to check the "CPU" code option is appropriate for your + intended target system. + + Under no circumstances set the "StackExtend" code option in either + compiling the library or *ANY* client code. + + All benign compiler warnings have been suppressed. These mainly + involve lack of prototypes in the code, and dead assignments + detected by the optimizer. + + THE GOOD NEWS + + The library as it stands is compatible with the GigaMem commercial + virtual memory software, and probably similar PD software. + + The performance of "gctest" on an Amiga 2630 (68030 @ 25Mhz) + compares favourably with an HP9000 with similar architecture (a 325 + with a 68030 I think). + + ----------------------------------------------------------------------- + + The Amiga port has been brought to you by: + + Jesper Peterson. + + jep@mtiame.mtia.oz.au (preferred, but 1 week turnaround) + jep@orca1.vic.design.telecom.au (that's orca, 1 day turnaround) + + At least one of these addresses should be around for a while, even + though I don't work for either of the companies involved. + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.autoconf gcc-3.1/boehm-gc/doc/README.autoconf *** gcc-3.0.4/boehm-gc/doc/README.autoconf Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.autoconf Fri Aug 17 18:39:18 2001 *************** *** 0 **** --- 1,59 ---- + As of GC6.0alpha8, we attempt to support GNU-style builds based on automake, + autoconf and libtool. This is based almost entirely on Tom Tromey's work + with gcj. + + To build and install libraries use + + configure; make; make install + + The advantages of this process are: + + 1) It should eventually do a better job of automatically determining the + right compiler to use, etc. It probably already does in some cases. + + 2) It tries to automatically set a good set of default GC parameters for + the platform (e.g. thread support). It provides an easier way to configure + some of the others. + + 3) It integrates better with other projects using a GNU-style build process. + + 4) It builds both dynamic and static libraries. + + The known disadvantages are: + + 1) The build scripts are much more complex and harder to debug (though largely + standard). I don't understand them all, and there's probably lots of redundant + stuff. + + 2) It probably doesn't work on all Un*x-like platforms yet. It probably will + never work on the rest. + + 3) The scripts are not yet complete. Some of the standard GNU targets don't + yet work. (Corrections/additions are very welcome.) + + The distribution should contain all files needed to run "configure" and "make", + as well as the sources needed to regenerate the derived files. (If I missed + some, please let me know.) + + Note that the distribution comes with a "Makefile" which will be overwritten + by "configure" with one that is not at all equiavelent to the original. The + distribution contains a copy of the original "Makefile" in "Makefile.direct". + + Important options to configure: + + --prefix=PREFIX install architecture-independent files in PREFIX + [/usr/local] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --enable-threads=TYPE choose threading package + --enable-parallel-mark parallelize marking and free list construction + --enable-full-debug include full support for pointer backtracing etc. + + Unless --prefix is set (or --exec-prefix or one of the more obscure options), + make install will install libgc.a and libgc.so in /usr/local/bin, which + would typically require the "make install" to be run as root. + + Most commonly --enable-threads=posix or will be needed. --enable-parallel-mark + is recommended for multiprocessors if it is supported on the platform. + + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.changes gcc-3.1/boehm-gc/doc/README.changes *** gcc-3.0.4/boehm-gc/doc/README.changes Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.changes Tue Feb 12 04:37:55 2002 *************** *** 0 **** --- 1,1494 ---- + This is a rough history of garbage collector bugs and versions. + + This has been maintained with varying diligence over the years. + + I made an attempt to include recent contributors here. I apologize for any + omissions. + + ------------------------- + + Version 1.3 and immediately preceding versions contained spurious + assembly language assignments to TMP_SP. Only the assignment in the PC/RT + code is necessary. On other machines, with certain compiler options, + the assignments can lead to an unsaved register being overwritten. + Known to cause problems under SunOS 3.5 WITHOUT the -O option. (With + -O the compiler recognizes it as dead code. It probably shouldn't, + but that's another story.) + + Version 1.4 and earlier versions used compile time determined values + for the stack base. This no longer works on Sun 3s, since Sun 3/80s use + a different stack base. We now use a straightforward heuristic on all + machines on which it is known to work (incl. Sun 3s) and compile-time + determined values for the rest. There should really be library calls + to determine such values. + + Version 1.5 and earlier did not ensure 8 byte alignment for objects + allocated on a sparc based machine. + + Version 1.8 added ULTRIX support in gc_private.h. + + Version 1.9 fixed a major bug in gc_realloc. + + Version 2.0 introduced a consistent naming convention for collector + routines and added support for registering dynamic library data segments + in the standard mark_roots.c. Most of the data structures were revamped. + The treatment of interior pointers was completely changed. Finalization + was added. Support for locking was added. Object kinds were added. + We added a black listing facility to avoid allocating at addresses known + to occur as integers somewhere in the address space. Much of this + was accomplished by adapting ideas and code from the PCR collector. + The test program was changed and expanded. + + Version 2.1 was the first stable version since 1.9, and added support + for PPCR. + + Version 2.2 added debugging allocation, and fixed various bugs. Among them: + - GC_realloc could fail to extend the size of the object for certain large object sizes. + - A blatant subscript range error in GC_printf, which unfortunately + wasn't exercised on machines with sufficient stack alignment constraints. + - GC_register_displacement did the wrong thing if it was called after + any allocation had taken place. + - The leak finding code would eventually break after 2048 byte + byte objects leaked. + - interface.c didn't compile. + - The heap size remained much too small for large stacks. + - The stack clearing code behaved badly for large stacks, and perhaps + on HP/PA machines. + + Version 2.3 added ALL_INTERIOR_POINTERS and fixed the following bugs: + - Missing declaration of etext in the A/UX version. + - Some PCR root-finding problems. + - Blacklisting was not 100% effective, because the plausible future + heap bounds were being miscalculated. + - GC_realloc didn't handle out-of-memory correctly. + - GC_base could return a nonzero value for addresses inside free blocks. + - test.c wasn't really thread safe, and could erroneously report failure + in a multithreaded environment. (The locking primitives need to be + replaced for other threads packages.) + - GC_CONS was thoroughly broken. + - On a SPARC with dynamic linking, signals stayed diabled while the + client code was running. + (Thanks to Manuel Serrano at INRIA for reporting the last two.) + + Version 2.4 added GC_free_space_divisor as a tuning knob, added + support for OS/2 and linux, and fixed the following bugs: + - On machines with unaligned pointers (e.g. Sun 3), every 128th word could + fail to be considered for marking. + - Dynamic_load.c erroneously added 4 bytes to the length of the data and + bss sections of the dynamic library. This could result in a bad memory + reference if the actual length was a multiple of a page. (Observed on + Sun 3. Can probably also happen on a Sun 4.) + (Thanks to Robert Brazile for pointing out that the Sun 3 version + was broken. Dynamic library handling is still broken on Sun 3s + under 4.1.1U1, but apparently not 4.1.1. If you have such a machine, + use -Bstatic.) + + Version 2.5 fixed the following bugs: + - Removed an explicit call to exit(1) + - Fixed calls to GC_printf and GC_err_printf, so the correct number of + arguments are always supplied. The OS/2 C compiler gets confused if + the number of actuals and the number of formals differ. (ANSI C + doesn't require this to work. The ANSI sanctioned way of doing things + causes too many compatibility problems.) + + Version 3.0 added generational/incremental collection and stubborn + objects. + + Version 3.1 added the following features: + - A workaround for a SunOS 4.X SPARC C compiler + misfeature that caused problems when the collector was turned into + a dynamic library. + - A fix for a bug in GC_base that could result in a memory fault. + - A fix for a performance bug (and several other misfeatures) pointed + out by Dave Detlefs and Al Dosser. + - Use of dirty bit information for static data under Solaris 2.X. + - DEC Alpha/OSF1 support (thanks to Al Dosser). + - Incremental collection on more platforms. + - A more refined heap expansion policy. Less space usage by default. + - Various minor enhancements to reduce space usage, and to reduce + the amount of memory scanned by the collector. + - Uncollectable allocation without per object overhead. + - More conscientious handling of out-of-memory conditions. + - Fixed a bug in debugging stubborn allocation. + - Fixed a bug that resulted in occasional erroneous reporting of smashed + objects with debugging allocation. + - Fixed bogus leak reports of size 4096 blocks with FIND_LEAK. + + Version 3.2 fixed a serious and not entirely repeatable bug in + the incremental collector. It appeared only when dirty bit info + on the roots was available, which is normally only under Solaris. + It also added GC_general_register_disappearing_link, and some + testing code. Interface.c disappeared. + + Version 3.3 fixes several bugs and adds new ports: + - PCR-specific bugs. + - Missing locking in GC_free, redundant FASTUNLOCK + in GC_malloc_stubborn, and 2 bugs in + GC_unregister_disappearing_link. + All of the above were pointed out by Neil Sharman + (neil@cs.mu.oz.au). + - Common symbols allocated by the SunOS4.X dynamic loader + were not included in the root set. + - Bug in GC_finalize (reported by Brian Beuning and Al Dosser) + - Merged Amiga port from Jesper Peterson (untested) + - Merged NeXT port from Thomas Funke (significantly + modified and untested) + + Version 3.4: + - Fixed a performance bug in GC_realloc. + - Updated the amiga port. + - Added NetBSD and 386BSD ports. + - Added cord library. + - Added trivial performance enhancement for + ALL_INTERIOR_POINTERS. (Don't scan last word.) + + Version 3.5 + - Minor collections now mark from roots only once, if that + doesn't cause an excessive pause. + - The stack clearing heuristic was refined to prevent anomalies + with very heavily recursive programs and sparse stacks. + - Fixed a bug that prevented mark stack growth in some cases. + GC_objects_are_marked should be set to TRUE after a call + to GC_push_roots and as part of GC_push_marked, since + both can now set mark bits. I think this is only a performance + bug, but I wouldn't bet on it. It's certainly very hard to argue + that the old version was correct. + - Fixed an incremental collection bug that prevented it from + working at all when HBLKSIZE != getpagesize() + - Changed dynamic_loading.c to include gc_priv.h before testing + DYNAMIC_LOADING. SunOS dynamic library scanning + must have been broken in 3.4. + - Object size rounding now adapts to program behavior. + - Added a workaround (provided by Manuel Serrano and + colleagues) to a long-standing SunOS 4.X (and 3.X?) ld bug + that I had incorrectly assumed to have been squished. + The collector was broken if the text segment size was within + 32 bytes of a multiple of 8K bytes, and if the beginning of + the data segment contained interesting roots. The workaround + assumes a demand-loadable executable. The original may have + have "worked" in some other cases. + - Added dynamic library support under IRIX5. + - Added support for EMX under OS/2 (thanks to Ari Huttunen). + + Version 3.6: + - fixed a bug in the mark stack growth code that was introduced + in 3.4. + - fixed Makefile to work around DEC AXP compiler tail recursion + bug. + + Version 3.7: + - Added a workaround for an HP/UX compiler bug. + - Fixed another stack clearing performance bug. Reworked + that code once more. + + Version 4.0: + - Added support for Solaris threads (which was possible + only by reimplementing some fraction of Solaris threads, + since Sun doesn't currently make the thread debugging + interface available). + - Added non-threads win32 and win32S support. + - (Grudgingly, with suitable muttering of obscenities) renamed + files so that the collector distribution could live on a FAT + file system. Files that are guaranteed to be useless on + a PC still have long names. Gc_inline.h and gc_private.h + still exist, but now just include gc_inl.h and gc_priv.h. + - Fixed a really obscure bug in finalization that could cause + undetected mark stack overflows. (I would be surprised if + any real code ever tickled this one.) + - Changed finalization code to dynamically resize the hash + tables it maintains. (This probably does not matter for well- + -written code. It no doubt does for C++ code that overuses + destructors.) + - Added typed allocation primitives. Rewrote the marker to + accommodate them with more reasonable efficiency. This + change should also speed up marking for GC_malloc allocated + objects a little. See gc_typed.h for new primitives. + - Improved debugging facilities slightly. Allocation time + stack traces are now kept by default on SPARC/SUNOS4. + (Thanks to Scott Schwartz.) + - Added better support for small heap applications. + - Significantly extended cord package. Fixed a bug in the + implementation of lazily read files. Printf and friends now + have cord variants. Cord traversals are a bit faster. + - Made ALL_INTERIOR_POINTERS recognition the default. + - Fixed de so that it can run in constant space, independent + of file size. Added simple string searching to cords and de. + - Added the Hull-Ellis C++ interface. + - Added dynamic library support for OSF/1. + (Thanks to Al Dosser and Tim Bingham at DEC.) + - Changed argument to GC_expand_hp to be expressed + in units of bytes instead of heap blocks. (Necessary + since the heap block size now varies depending on + configuration. The old version was never very clean.) + - Added GC_get_heap_size(). The previous "equivalent" + was broken. + - Restructured the Makefile a bit. + + Since version 4.0: + - Changed finalization implementation to guarantee that + finalization procedures are called outside of the allocation + lock, making direct use of the interface a little less dangerous. + MAY BREAK EXISTING CLIENTS that assume finalizers + are protected by a lock. Since there seem to be few multithreaded + clients that use finalization, this is hopefully not much of + a problem. + - Fixed a gross bug in CORD_prev. + - Fixed a bug in blacklst.c that could result in unbounded + heap growth during startup on machines that do not clear + memory obtained from the OS (e.g. win32S). + - Ported de editor to win32/win32S. (This is now the only + version with a mouse-sensitive UI.) + - Added GC_malloc_ignore_off_page to allocate large arrays + in the presence of ALL_INTERIOR_POINTERS. + - Changed GC_call_with_alloc_lock to not disable signals in + the single-threaded case. + - Reduced retry count in GC_collect_or_expand for garbage + collecting when out of memory. + - Made uncollectable allocations bypass black-listing, as they + should. + - Fixed a bug in typed_test in test.c that could cause (legitimate) + GC crashes. + - Fixed some potential synchronization problems in finalize.c + - Fixed a real locking problem in typd_mlc.c. + - Worked around an AIX 3.2 compiler feature that results in + out of bounds memory references. + - Partially worked around an IRIX5.2 beta problem (which may + or may not persist to the final release). + - Fixed a bug in the heap integrity checking code that could + result in explicitly deallocated objects being identified as + smashed. Fixed a bug in the dbg_mlc stack saving code + that caused old argument pointers to be considered live. + - Fixed a bug in CORD_ncmp (and hence CORD_str). + - Repaired the OS2 port, which had suffered from bit rot + in 4.0. Worked around what appears to be CSet/2 V1.0 + optimizer bug. + - Fixed a Makefile bug for target "c++". + + Since version 4.1: + - Multiple bug fixes/workarounds in the Solaris threads version. + (It occasionally failed to locate some register contents for + marking. It also turns out that thr_suspend and friends are + unreliable in Solaris 2.3. Dirty bit reads appear + to be unreliable under some weird + circumstances. My stack marking code + contained a serious performance bug. The new code is + extremely defensive, and has not failed in several cpu + hours of testing. But no guarantees ...) + - Added MacOS support (thanks to Patrick Beard.) + - Fixed several syntactic bugs in gc_c++.h and friends. (These + didn't bother g++, but did bother most other compilers.) + Fixed gc_c++.h finalization interface. (It didn't.) + - 64 bit alignment for allocated objects was not guaranteed in a + few cases in which it should have been. + - Added GC_malloc_atomic_ignore_off_page. + - Added GC_collect_a_little. + - Added some prototypes to gc.h. + - Some other minor bug fixes (notably in Makefile). + - Fixed OS/2 / EMX port (thanks to Ari Huttunen). + - Fixed AmigaDOS port. (thanks to Michel Schinz). + - Fixed the DATASTART definition under Solaris. There + was a 1 in 16K chance of the collector missing the first + 64K of static data (and thus crashing). + - Fixed some blatant anachronisms in the README file. + - Fixed PCR-Makefile for upcoming PPCR release. + + Since version 4.2: + - Fixed SPARC alignment problem with GC_DEBUG. + - Fixed Solaris threads /proc workaround. The real + problem was an interaction with mprotect. + - Incorporated fix from Patrick Beard for gc_c++.h (now gc_cpp.h). + - Slightly improved allocator space utilization by + fixing the GC_size_map mechanism. + - Integrated some Sony News and MIPS RISCos 4.51 + patches. (Thanks to Nobuyuki Hikichi of + Software Research Associates, Inc. Japan) + - Fixed HP_PA alignment problem. (Thanks to + xjam@cork.cs.berkeley.edu.) + - Added GC_same_obj and friends. Changed GC_base + to return 0 for pointers past the end of large objects. + Improved GC_base performance with ALL_INTERIOR_POINTERS + on machines with a slow integer mod operation. + Added GC_PTR_ADD, GC_PTR_STORE, etc. to prepare + for preprocessor. + - changed the default on most UNIX machines to be that + signals are not disabled during critical GC operations. + This is still ANSI-conforming, though somewhat dangerous + in the presence of signal handlers. But the performance + cost of the alternative is sometimes problematic. + Can be changed back with a minor Makefile edit. + - renamed IS_STRING in gc.h, to CORD_IS_STRING, thus + following my own naming convention. Added the function + CORD_to_const_char_star. + - Fixed a gross bug in GC_finalize. Symptom: occasional + address faults in that function. (Thanks to Anselm + Baird-Smith (Anselm.BairdSmith@inria.fr) + - Added port to ICL DRS6000 running DRS/NX. Restructured + things a bit to factor out common code, and remove obsolete + code. Collector should now run under SUNOS5 with either + mprotect or /proc dirty bits. (Thanks to Douglas Steel + (doug@wg.icl.co.uk)). + - More bug fixes and workarounds for Solaris 2.X. (These were + mostly related to putting the collector in a dynamic library, + which didn't really work before. Also SOLARIS_THREADS + didn't interact well with dl_open.) Thanks to btlewis@eng.sun.com. + - Fixed a serious performance bug on the DEC Alpha. The text + segment was getting registered as part of the root set. + (Amazingly, the result was still fast enough that the bug + was not conspicuous.) The fix works on OSF/1, version 1.3. + Hopefully it also works on other versions of OSF/1 ... + - Fixed a bug in GC_clear_roots. + - Fixed a bug in GC_generic_malloc_words_small that broke + gc_inl.h. (Reported by Antoine de Maricourt. I broke it + in trying to tweak the Mac port.) + - Fixed some problems with cord/de under Linux. + - Fixed some cord problems, notably with CORD_riter4. + - Added DG/UX port. + Thanks to Ben A. Mesander (ben@piglet.cr.usgs.gov) + - Added finalization registration routines with weaker ordering + constraints. (This is necessary for C++ finalization with + multiple inheritance, since the compiler often adds self-cycles.) + - Filled the holes in the SCO port. (Thanks to Michael Arnoldus + .) + - John Ellis' additions to the C++ support: From John: + + * I completely rewrote the documentation in the interface gc_c++.h + (later renamed gc_cpp.h). I've tried to make it both clearer and more + precise. + + * The definition of accessibility now ignores pointers from an + finalizable object (an object with a clean-up function) to itself. + This allows objects with virtual base classes to be finalizable by the + collector. Compilers typically implement virtual base classes using + pointers from an object to itself, which under the old definition of + accessibility prevented objects with virtual base classes from ever + being collected or finalized. + + * gc_cleanup now includes gc as a virtual base. This was enabled by + the change in the definition of accessibility. + + * I added support for operator new[]. Since most (all?) compilers + don't yet support operator new[], it is conditionalized on + -DOPERATOR_NEW_ARRAY. The code is untested, but its trivial and looks + correct. + + * The test program test_gc_c++ (later renamed test_cpp.cc) + tries to test for the C++-specific functionality not tested by the + other programs. + - Added include to misc.c. (Needed for ppcr.) + - Added PowerMac port. (Thanks to Patrick Beard again.) + - Fixed "srcdir"-related Makefile problems. Changed things so + that all externally visible include files always appear in the + include subdirectory of the source. Made gc.h directly + includable from C++ code. (These were at Per + Bothner's suggestion.) + - Changed Intel code to also mark from ebp (Kevin Warne's + suggestion). + - Renamed C++ related files so they could live in a FAT + file system. (Charles Fiterman's suggestion.) + - Changed Windows NT Makefile to include C++ support in + gc.lib. Added C++ test as Makefile target. + + Since version 4.3: + - ASM_CLEAR_CODE was erroneously defined for HP + PA machines, resulting in a compile error. + - Fixed OS/2 Makefile to create a library. (Thanks to + Mark Boulter (mboulter@vnet.ibm.com)). + - Gc_cleanup objects didn't work if they were created on + the stack. Fixed. + - One copy of Gc_cpp.h in the distribution was out of + synch, and failed to document some known compiler + problems with explicit destructor invocation. Partially + fixed. There are probably other compilers on which + gc_cleanup is miscompiled. + - Fixed Makefile to pass C compiler flags to C++ compiler. + - Added Mac fixes. + - Fixed os_dep.c to work around what appears to be + a new and different VirtualQuery bug under newer + versions of win32S. + - GC_non_gc_bytes was not correctly maintained by + GC_free. Fixed. Thanks to James Clark (jjc@jclark.com). + - Added GC_set_max_heap_size. + - Changed allocation code to ignore blacklisting if it is preventing + use of a very large block of memory. This has the advantage + that naive code allocating very large objects is much more + likely to work. The downside is you might no + longer find out that such code should really use + GC_malloc_ignore_off_page. + - Changed GC_printf under win32 to close and reopen the file + between calls. FAT file systems otherwise make the log file + useless for debugging. + - Added GC_try_to_collect and GC_get_bytes_since_gc. These + allow starting an abortable collection during idle times. + This facility does not require special OS support. (Thanks to + Michael Spertus of Geodesic Systems for suggesting this. It was + actually an easy addition. Kumar Srikantan previously added a similar + facility to a now ancient version of the collector. At the time + this was much harder, and the result was less convincing.) + - Added some support for the Borland development environment. (Thanks + to John Ellis and Michael Spertus.) + - Removed a misfeature from checksums.c that caused unexpected + heap growth. (Thanks to Scott Schwartz.) + - Changed finalize.c to call WARN if it encounters a finalization cycle. + WARN is defined in gc_priv.h to write a message, usually to stdout. + In many environments, this may be inappropriate. + - Renamed NO_PARAMS in gc.h to GC_NO_PARAMS, thus adhering to my own + naming convention. + - Added GC_set_warn_proc to intercept warnings. + - Fixed Amiga port. (Thanks to Michel Schinz (schinz@alphanet.ch).) + - Fixed a bug in mark.c that could result in an access to unmapped + memory from GC_mark_from_mark_stack on machines with unaligned + pointers. + - Fixed a win32 specific performance bug that could result in scanning of + objects allocated with the system malloc. + - Added REDIRECT_MALLOC. + + Since version 4.4: + - Fixed many minor and one major README bugs. (Thanks to Franklin Chen + (chen@adi.com) for pointing out many of them.) + - Fixed ALPHA/OSF/1 dynamic library support. (Thanks to Jonathan Bachrach + (jonathan@harlequin.com)). + - Added incremental GC support (MPROTECT_VDB) for Linux (with some + help from Bruno Haible). + - Altered SPARC recognition tests in gc.h and config.h (mostly as + suggested by Fergus Henderson). + - Added basic incremental GC support for win32, as implemented by + Windows NT and Windows 95. GC_enable_incremental is a noop + under win32s, which doesn't implement enough of the VM interface. + - Added -DLARGE_CONFIG. + - Fixed GC_..._ignore_off_page to also function without + -DALL_INTERIOR_POINTERS. + - (Hopefully) fixed RS/6000 port. (Only the test was broken.) + - Fixed a performance bug in the nonincremental collector running + on machines supporting incremental collection with MPROTECT_VDB + (e.g. SunOS 4, DEC AXP). This turned into a correctness bug under + win32s with win32 incremental collection. (Not all memory protection + was disabled.) + - Fixed some ppcr related bit rot. + - Caused dynamic libraries to be unregistered before reregistering. + The old way turned out to be a performance bug on some machines. + - GC_root_size was not properly maintained under MSWIN32. + - Added -DNO_DEBUGGING and GC_dump. + - Fixed a couple of bugs arising with SOLARIS_THREADS + + REDIRECT_MALLOC. + - Added NetBSD/M68K port. (Thanks to Peter Seebach + .) + - Fixed a serious realloc bug. For certain object sizes, the collector + wouldn't scan the expanded part of the object. (Thanks to Clay Spence + (cds@peanut.sarnoff.com) for noticing the problem, and helping me to + track it down.) + + Since version 4.5: + - Added Linux ELF support. (Thanks to Arrigo Triulzi .) + - GC_base crashed if it was called before any other GC_ routines. + This could happen if a gc_cleanup object was allocated outside the heap + before any heap allocation. + - The heap expansion heuristic was not stable if all objects had finalization + enabled. Fixed finalize.c to count memory in finalization queue and + avoid explicit deallocation. Changed alloc.c to also consider this count. + (This is still not recommended. It's expensive if nothing else.) Thanks + to John Ellis for pointing this out. + - GC_malloc_uncollectable(0) was broken. Thanks to Phong Vo for pointing + this out. + - The collector didn't compile under Linux 1.3.X. (Thanks to Fred Gilham for + pointing this out.) The current workaround is ugly, but expected to be + temporary. + - Fixed a formatting problem for SPARC stack traces. + - Fixed some '=='s in os_dep.c that should have been assignments. + Fortunately these were in code that should never be executed anyway. + (Thanks to Fergus Henderson.) + - Fixed the heap block allocator to only drop blacklisted blocks in small + chunks. Made BL_LIMIT self adjusting. (Both of these were in response + to heap growth observed by Paul Graham.) + - Fixed the Metrowerks/68K Mac code to also mark from a6. (Thanks + to Patrick Beard.) + - Significantly updated README.debugging. + - Fixed some problems with longjmps out of signal handlers, especially under + Solaris. Added a workaround for the fact that siglongjmp doesn't appear to + do the right thing with -lthread under Solaris. + - Added MSDOS/djgpp port. (Thanks to Mitch Harris (maharri@uiuc.edu).) + - Added "make reserved_namespace" and "make user_namespace". The + first renames ALL "GC_xxx" identifiers as "_GC_xxx". The second is the + inverse transformation. Note that doing this is guaranteed to break all + clients written for the other names. + - descriptor field for kind NORMAL in GC_obj_kinds with ADD_BYTE_AT_END + defined should be -ALIGNMENT not WORDS_TO_BYTES(-1). This is + a serious bug on machines with pointer alignment of less than a word. + - GC_ignore_self_finalize_mark_proc didn't handle pointers to very near the + end of the object correctly. Caused failures of the C++ test on a DEC Alpha + with g++. + - gc_inl.h still had problems. Partially fixed. Added warnings at the + beginning to hopefully specify the remaining dangers. + - Added DATAEND definition to config.h. + - Fixed some of the .h file organization. Fixed "make floppy". + + Since version 4.6: + - Fixed some compilation problems with -DCHECKSUMS (thanks to Ian Searle) + - Updated some Mac specific files to synchronize with Patrick Beard. + - Fixed a serious bug for machines with non-word-aligned pointers. + (Thanks to Patrick Beard for pointing out the problem. The collector + should fail almost any conceivable test immediately on such machines.) + + Since version 4.7: + - Changed a "comment" in a MacOS specific part of mach-dep.c that caused + gcc to fail on other platforms. + + Since version 4.8 + - More README.debugging fixes. + - Objects ready for finalization, but not finalized in the same GC + cycle, could be prematurely collected. This occasionally happened + in test_cpp. + - Too little memory was obtained from the system for very large + objects. That could cause a heap explosion if these objects were + not contiguous (e.g. under PCR), and too much of them was blacklisted. + - Due to an improper initialization, the collector was too hesitant to + allocate blacklisted objects immediately after system startup. + - Moved GC_arrays from the data into the bss segment by not explicitly + initializing it to zero. This significantly + reduces the size of executables, and probably avoids some disk accesses + on program startup. It's conceivable that it might break a port that I + didn't test. + - Fixed EMX_MAKEFILE to reflect the gc_c++.h to gc_cpp.h renaming which + occurred a while ago. + + Since 4.9: + - Fixed a typo around a call to GC_collect_or_expand in alloc.c. It broke + handling of out of memory. (Thanks to Patrick Beard for noticing.) + + Since 4.10: + - Rationalized (hopefully) GC_try_to_collect in an incremental collection + environment. It appeared to not handle a call while a collection was in + progress, and was otherwise too conservative. + - Merged GC_reclaim_or_delete_all into GC_reclaim_all to get rid of some + code. + - Added Patrick Beard's Mac fixes, with substantial completely untested + modifications. + - Fixed the MPROTECT_VDB code to deal with large pages and imprecise + fault addresses (as on an UltraSPARC running Solaris 2.5). Note that this + was not a problem in the default configuration, which uses PROC_VDB. + - The DEC Alpha assembly code needed to restore $gp between calls. + Thanks to Fergus Henderson for tracking this down and supplying a + patch. + - The write command for "de" was completely broken for large files. + I used the easiest portable fix, which involved changing the semantics + so that f.new is written instead of overwriting f. That's safer anyway. + - Added README.solaris2 with a discussion of the possible problems of + mixing the collector's sbrk allocation with malloc/realloc. + - Changed the data segment starting address for SGI machines. The + old code failed under IRIX6. + - Required double word alignment for MIPS. + - Various minor fixes to remove warnings. + - Attempted to fix some Solaris threads problems reported by Zhiying Chen. + In particular, the collector could try to fork a thread with the + world stopped as part of GC_thr_init. It also failed to deal with + the case in which the original thread terminated before the whole + process did. + - Added -DNO_EXECUTE_PERMISSION. This has a major performance impact + on the incremental collector under Irix, and perhaps under other + operating systems. + - Added some code to support allocating the heap with mmap. This may + be preferable under some circumstances. + - Integrated dynamic library support for HP. + (Thanks to Knut Tvedten .) + - Integrated James Clark's win32 threads support, and made a number + of changes to it, many of which were suggested by Pontus Rydin. + This is still not 100% solid. + - Integrated Alistair Crooks' support for UTS4 running on an Amdahl + 370-class machine. + - Fixed a serious bug in explicitly typed allocation. Objects requiring + large descriptors where handled in a way that usually resulted in + a segmentation fault in the marker. (Thanks to Jeremy Fitzhardinge + for helping to track this down.) + - Added partial support for GNU win32 development. (Thanks to Fergus + Henderson.) + - Added optional support for Java-style finalization semantics. (Thanks + to Patrick Bridges.) This is recommended only for Java implementations. + - GC_malloc_uncollectable faulted instead of returning 0 when out of + memory. (Thanks to dan@math.uiuc.edu for noticing.) + - Calls to GC_base before the collector was initialized failed on a + DEC Alpha. (Thanks to Matthew Flatt.) + - Added base pointer checking to GC_REGISTER_FINALIZER in debugging + mode, at the suggestion of Jeremy Fitzhardinge. + - GC_debug_realloc failed for uncollectable objects. (Thanks to + Jeremy Fitzhardinge.) + - Explicitly typed allocation could crash if it ran out of memory. + (Thanks to Jeremy Fitzhardinge.) + - Added minimal support for a DEC Alpha running Linux. + - Fixed a problem with allocation of objects whose size overflowed + ptrdiff_t. (This now fails unconditionally, as it should.) + - Added the beginning of Irix pthread support. + - Integrated Xiaokun Zhu's fixes for djgpp 2.01. + - Added SGI-style STL allocator support (gc_alloc.h). + - Fixed a serious bug in README.solaris2. Multithreaded programs must include + gc.h with SOLARIS_THREADS defined. + - Changed GC_free so it actually deallocates uncollectable objects. + (Thanks to Peter Chubb for pointing out the problem.) + - Added Linux ELF support for dynamic libararies. (Thanks again to + Patrick Bridges.) + - Changed the Borland cc configuration so that the assembler is not + required. + - Fixed a bug in the C++ test that caused it to fail in 64-bit + environments. + + Since 4.11: + - Fixed ElfW definition in dyn_load.c. (Thanks to Fergus Henderson.) + This prevented the dynamic library support from compiling on some + older ELF Linux systems. + - Fixed UTS4 port (which I apparently mangled during the integration) + (Thanks to again to Alistair Crooks.) + - "Make C++" failed on Suns with SC4.0, due to a problem with "bool". + Fixed in gc_priv.h. + - Added more pieces for GNU win32. (Thanks to Timothy N. Newsham.) + The current state of things should suffice for at least some + applications. + - Changed the out of memory retry count handling as suggested by + Kenjiro Taura. (This matters only if GC_max_retries > 0, which + is no longer the default.) + - If a /proc read failed repeatedly, GC_written_pages was not updated + correctly. (Thanks to Peter Chubb for diagnosing this.) + - Under unlikely circumstances, the allocator could infinite loop in + an out of memory situation. (Thanks again to Kenjiro Taura for + identifying the problem and supplying a fix.) + - Fixed a syntactic error in the DJGPP code. (Thanks to Fergus + Henderson for finding this by inspection.) Also fixed a test program + problem with DJGPP (Thanks to Peter Monks.) + - Atomic uncollectable objects were not treated correctly by the + incremental collector. This resulted in weird log statistics and + occasional performance problems. (Thanks to Peter Chubb for pointing + this out.) + - Fixed some problems resulting from compilers that dont define + __STDC__. In this case void * and char * were used inconsistently + in some cases. (Void * should not have been used at all. If + you have an ANSI superset compiler that does not define __STDC__, + please compile with -D__STDC__=0. Thanks to Manuel Serrano and others + for pointing out the problem.) + - Fixed a compilation problem on Irix with -n32 and -DIRIX_THREADS. + Also fixed some other IRIX_THREADS problems which may or may not have + had observable symptoms. + - Fixed an HP PA compilation problem in dyn_load.c. (Thanks to + Philippe Queinnec.) + - SEGV fault handlers sometimes did not get reset correctly. (Thanks + to David Pickens.) + - Added a fix for SOLARIS_THREADS on Intel. (Thanks again to David + Pickens.) This probably needs more work to become functional. + - Fixed struct sigcontext_struct in os_dep.c for compilation under + Linux 2.1.X. (Thanks to Fergus Henderson.) + - Changed the DJGPP STACKBOTTOM and DATASTART values to those suggested + by Kristian Kristensen. These may still not be right, but it is + it is likely to work more often than what was there before. They may + even be exactly right. + - Added a #include to test_cpp.cc. This appears to help + with HP/UX and gcc. (Thanks to assar@sics.se.) + - Version 4.11 failed to run in incremental mode on recent 64-bit Irix + kernels. This was a problem related to page unaligned heap segments. + Changed the code to page align heap sections on all platforms. + (I had mistakenly identified this as a kernel problem earlier. + It was not.) + - Version 4.11 did not make allocated storage executable, except on + one or two platforms, due to a bug in a #if test. (Thanks to Dave + Grove for pointing this out.) + - Added sparc_sunos4_mach_dep.s to support Sun's compilers under SunOS4. + - Added GC_exclude_static_roots. + - Fixed the object size mapping algorithm. This shouldn't matter, + but the old code was ugly. + - Heap checking code could die if one of the allocated objects was + larger than its base address. (Unsigned underflow problem. Thanks + to Clay Spence for isolating the problem.) + - Added RS6000 (AIX) dynamic library support and fixed STACK_BOTTOM. + (Thanks to Fred Stearns.) + - Added Fergus Henderson's patches for improved robustness with large + heaps and lots of blacklisting. + - Added Peter Chubb's changes to support Solaris Pthreads, to support + MMAP allocation in Solaris, to allow Solaris to find dynamic libraries + through /proc, to add malloc_typed_ignore_off_page, and a few other + minor features and bug fixes. + - The Solaris 2 port should not use sbrk. I received confirmation from + Sun that the use of sbrk and malloc in the same program is not + supported. The collector now defines USE_MMAP by default on Solaris. + - Replaced the djgpp makefile with Gary Leavens' version. + - Fixed MSWIN32 detection test. + - Added Fergus Henderson's patches to allow putting the collector into + a DLL under GNU win32. + - Added Ivan V. Demakov's port to Watcom C on X86. + - Added Ian Piumarta's Linux/PowerPC port. + - On Brian Burton's suggestion added PointerFreeGC to the placement + options in gc_cpp.h. This is of course unsafe, and may be controversial. + On the other hand, it seems to be needed often enough that it's worth + adding as a standard facility. + + Since 4.12: + - Fixed a crucial bug in the Watcom port. There was a redundant decl + of GC_push_one in gc_priv.h. + - Added FINALIZE_ON_DEMAND. + - Fixed some pre-ANSI cc problems in test.c. + - Removed getpagesize() use for Solaris. It seems to be missing in one + or two versions. + - Fixed bool handling for SPARCCompiler version 4.2. + - Fixed some files in include that had gotten unlinked from the main + copy. + - Some RS/6000 fixes (missing casts). Thanks to Toralf Foerster. + - Fixed several problems in GC_debug_realloc, affecting mostly the + FIND_LEAK case. + - GC_exclude_static_roots contained a buggy unsigned comparison to + terminate a loop. (Thanks to Wilson Ho.) + - CORD_str failed if the substring occurred at the last possible position. + (Only affects cord users.) + - Fixed Linux code to deal with RedHat 5.0 and integrated Peter Bigot's + os_dep.c code for dealing with various Linux versions. + - Added workaround for Irix pthreads sigaction bug and possible signal + misdirection problems. + Since alpha1: + - Changed RS6000 STACKBOTTOM. + - Integrated Patrick Beard's Mac changes. + - Alpha1 didn't compile on Irix m.n, m < 6. + - Replaced Makefile.dj with a new one from Gary Leavens. + - Added Andrew Stitcher's changes to support SCO OpenServer. + - Added PRINT_BLACK_LIST, to allow debugging of high densities of false + pointers. + - Added code to debug allocator to keep track of return address + in GC_malloc caller, thus giving a bit more context. + - Changed default behavior of large block allocator to more + aggressively avoid fragmentation. This is likely to slow down the + collector when it succeeds at reducing space cost. + - Integrated Fergus Henderson's CYGWIN32 changes. They are untested, + but needed for newer versions. + - USE_MMAP had some serious bugs. This caused the collector to fail + consistently on Solaris with -DSMALL_CONFIG. + - Added Linux threads support, thanks largely to Fergus Henderson. + Since alpha2: + - Fixed more Linux threads problems. + - Changed default GC_free_space_divisor to 3 with new large block allocation. + (Thanks to Matthew Flatt for some measurements that suggest the old + value sometimes favors space too much over time.) + - More CYGWIN32 fixes. + - Integrated Tyson-Dowd's Linux-M68K port. + - Minor HP PA and DEC UNIX fixes from Fergus Henderson. + - Integrated Christoffe Raffali's Linux-SPARC changes. + - Allowed for one more GC fixup iteration after a full GC in incremental + mode. Some quick measurements suggested that this significantly + reduces pause times even with smaller GC_RATE values. + - Moved some more GC data structures into GC_arrays. This decreases + pause times and GC overhead, but makes debugging slightly less convenient. + - Fixed namespace pollution problem ("excl_table"). + - Made GC_incremental a constant for -DSMALL_CONFIG, hopefully shrinking + that slightly. + - Added some win32 threads fixes. + - Integrated Ivan Demakov and David Stes' Watcom fixes. + - Various other minor fixes contributed by many people. + - Renamed config.h to gcconfig.h, since config.h tends to be used for + many other things. + - Integrated Matthew Flatt's support for 68K MacOS "far globals". + - Fixed up some of the dynamic library Makefile targets for consistency + across platforms. + - Fixed a USE_MMAP typo that caused out-of-memory handling to fail + on Solaris. + - Added code to test.c to test thread creation a bit more. + - Integrated GC_win32_free_heap, as suggested by Ivan Demakov. + - Fixed Solaris 2.7 stack base finding problem. (This may actually + have been done in an earlier alpha release.) + Since alpha3: + - Fixed MSWIN32 recognition test, which interfered with cygwin. + - Removed unnecessary gc_watcom.asm from distribution. Removed + some obsolete README.win32 text. + - Added Alpha Linux incremental GC support. (Thanks to Philipp Tomsich + for code for retrieving the fault address in a signal handler.) + Changed Linux signal handler context argument to be a pointer. + - Took care of some new warnings generated by the 7.3 SGI compiler. + - Integrated Phillip Musumeci's FreeBSD/ELF fixes. + - -DIRIX_THREADS was broken with the -o32 ABI (typo in gc_priv.h> + + Since 4.13: + - Fixed GC_print_source_ptr to not use a prototype. + - generalized CYGWIN test. + - gc::new did the wrong thing with PointerFreeGC placement. + (Thanks to Rauli Ruohonen.) + - In the ALL_INTERIOR_POINTERS (default) case, some callee-save register + values could fail to be scanned if the register was saved and + reused in a GC frame. This showed up in verbose mode with gctest + compiled with an unreleased SGI compiler. I vaguely recall an old + bug report that may have been related. The bug was probably quite old. + (The problem was that the stack scanning could be deferred until + after the relevant frame was overwritten, and the new save location + might be outside the scanned area. Fixed by more eager stack scanning.) + - PRINT_BLACK_LIST had some problems. A few source addresses were garbage. + - Replaced Makefile.dj and added -I flags to cord make targets. + (Thanks to Gary Leavens.) + - GC_try_to_collect was broken with the nonincremental collector. + - gc_cleanup destructors could pass the wrong address to + GC_register_finalizer_ignore_self in the presence of multiple + inheritance. (Thanks to Darrell Schiebel.) + - Changed PowerPC Linux stack finding code. + + Since 4.14alpha1 + - -DSMALL_CONFIG did not work reliably with large (> 4K) pages. + Recycling the mark stack during expansion could result in a size + zero heap segment, which confused things. (This was probably also an + issue with the normal config and huge pages.) + - Did more work to make sure that callee-save registers were scanned + completely, even with the setjmp-based code. Added USE_GENERIC_PUSH_REGS + macro to facilitate testing on machines I have access to. + - Added code to explicitly push register contents for win32 threads. + This seems to be necessary. (Thanks to Pierre de Rop.) + + Since 4.14alpha2 + - changed STACKBOTTOM for DJGPP (Thanks to Salvador Eduardo Tropea). + + Since 4.14 + - Reworked large block allocator. Now uses multiple doubly linked free + lists to approximate best fit. + - Changed heap expansion heuristic. Entirely free blocks are no longer + counted towards the heap size. This seems to have a major impact on + heap size stability; the old version could expand the heap way too + much in the presence of large block fragmentation. + - added -DGC_ASSERTIONS and some simple assertions inside the collector. + This is mainlyt for collector debugging. + - added -DUSE_MUNMAP to allow the heap to shrink. Suupported on only + a few UNIX-like platforms for now. + - added GC_dump_regions() for debugging of fragmentation issues. + - Changed PowerPC pointer alignment under Linux to 4. (This needs + checking by someone who has one. The suggestions came to me via a + rather circuitous path.) + - Changed the Linux/Alpha port to walk the data segment backwards until + it encounters a SIGSEGV. The old way to find the start of the data + segment broke with a recent release. + - cordxtra.c needed to call GC_REGISTER_FINALIZER instead of + GC_register_finalizer, so that it would continue to work with GC_DEBUG. + - allochblk sometimes cleared the wrong block for debugging purposes + when it dropped blacklisted blocks. This could result in spurious + error reports with GC_DEBUG. + - added MACOS X Server support. (Thanks to Andrew Stone.) + - Changed the Solaris threads code to ignore stack limits > 8 MB with + a warning. Empirically, it is not safe to access arbitrary pages + in such large stacks. And the dirty bit implementation does not + guarantee that none of them will be accessed. + - Integrated Martin Tauchmann's Amiga changes. + - Integrated James Dominy's OpenBSD/SPARC port. + + Since 5.0alpha1 + - Fixed bugs introduced in alpha1 (OpenBSD & large block initialization). + - Added -DKEEP_BACK_PTRS and backptr.h interface. (The implementation + idea came from Al Demers.) + + Since 5.0alpha2 + - Added some highly incomplete code to support a copied young generation. + Comments on nursery.h are appreciated. + - Changed -DFIND_LEAK, -DJAVA_FINALIZATION, and -DFINALIZE_ON_DEMAND, + so the same effect could be obtained with a runtime switch. This is + a step towards standardizing on a single dynamic GC library. + - Significantly changed the way leak detection is handled, as a consequence + of the above. + + Since 5.0 alpha3 + - Added protection fault handling patch for Linux/M68K from Fergus + Henderson and Roman Hodek. + - Removed the tests for SGI_SOURCE in new_gc_alloc.h. This was causing that + interface to fail on nonSGI platforms. + - Changed the Linux stack finding code to use /proc, after changing it + to use HEURISTIC1. (Thanks to David Mossberger for pointing out the + /proc hook.) + - Added HP/UX incremental GC support and HP/UX 11 thread support. + Thread support is currently still flakey. + - Added basic Linux/IA64 support. + - Integrated Anthony Green's PicoJava support. + - Integrated Scott Ananian's StrongARM/NetBSD support. + - Fixed some fairly serious performance bugs in the incremental + collector. These have probably been there essentially forever. + (Mark bits were sometimes set before scanning dirty pages. + The reclaim phase unnecessarily dirtied full small object pages.) + - Changed the reclaim phase to ignore nearly full pages to avoid + touching them. + - Limited GC_black_list_spacing to roughly the heap growth increment. + - Changed full collection triggering heuristic to decrease full GC + frequency by default, but to explicitly trigger full GCs during + heap growth. This doesn't always improve things, but on average it's + probably a win. + - GC_debug_free(0, ...) failed. Thanks to Fergus Henderson for the + bug report and fix. + + Since 5.0 alpha4 + - GC_malloc_explicitly_typed and friends sometimes failed to + initialize first word. + - Added allocation routines and support in the marker for mark descriptors + in a type structure referenced by the first word of an object. This was + introduced to support gcj, but hopefully in a way that makes it + generically useful. + - Added GC_requested_heapsize, and inhibited collections in nonincremental + mode if the actual used heap size is less than what was explicitly + requested. + - The Solaris pthreads version of GC_pthread_create didn't handle a NULL + attribute pointer. Solaris thread support used the wrong default thread + stack size. (Thanks to Melissa O'Neill for the patch.) + - Changed PUSH_CONTENTS macro to no longer modify first parameter. + This usually doesn't matter, but it was certainly an accident waiting + to happen ... + - Added GC_register_finalizer_no_order and friends to gc.h. They're + needed by Java implementations. + - Integrated a fix for a win32 deadlock resulting from clock() calling + malloc. (Thanks to Chris Dodd.) + - Integrated Hiroshi Kawashima's port to Linux/MIPS. This was designed + for a handheld platform, and may or may not be sufficient for other + machines. + - Fixed a va_arg problem with the %c specifier in cordprnt.c. It appears + that this was always broken, but recent versions of gcc are the first to + report the (statically detectable) bug. + - Added an attempt at a more general solution to dlopen races/deadlocks. + GC_dlopen now temporarily disables collection. Still not ideal, but ... + - Added -DUSE_I686_PREFETCH, -DUSE_3DNOW_PREFETCH, and support for IA64 + prefetch instructions. May improve performance measurably, but I'm not + sure the code will run correctly on processors that don't support the + instruction. Won't build except with very recent gcc. + - Added caching for header lookups in the marker. This seems to result + in a barely measurable performance gain. Added support for interleaved + lookups of two pointers, but unconfigured that since the performance + gain is currently near zero, and it adds to code size. + - Changed Linux DATA_START definition to check both data_start and + __data_start, since nothing else seems to be portable. + - Added -DUSE_LD_WRAP to optionally take advantage of the GNU ld function + wrapping mechanism. Probably currently useful only on Linux. + - Moved some variables for the scratch allocator into GC_arrays, on + Martin Hirzel's suggestion. + - Fixed a win32 threads bug that caused the collector to not look for + interior pointers from one of the thread stacks without + ALL_INTERIOR_POINTERS. (Thanks to Jeff Sturm.) + - Added Mingw32 support. (Thanks again to Jeff Sturm for the patch.) + - Changed the alpha port to use the generic register scanning code instead + of alpha_mach_dep.s. Alpha_mach_dep.s doesn't look for pointers in fp + registers, but gcc sometimes spills pointers there. (Thanks to Manuel + Serrano for helping me debug this by email.) Changed the IA64 code to + do something similar for similar reasons. + + [5.0alpha5 doesn't really exist, but it may have escaped.] + + Since 5.0alpha6: + - -DREDIRECT_MALLOC was broken in alpha6. Fixed. + - Cleaned up gc_ccp.h slightly, thus also causing the HP C++ compiler to + accept it. + - Removed accidental reference to dbg_mlc.c, which caused dbg_mlc.o to be + linked into every executable. + - Added PREFETCH to bitmap marker. Changed it to use the header cache. + - GC_push_marked sometimes pushed one object too many, resulting in a + segmentation fault in GC_mark_from_mark_stack. This was probably an old + bug. It finally showed up in gctest on win32. + - Gc_priv.h erroneously #defined GC_incremental to be TRUE instead of FALSE + when SMALL_CONFIG was defined. This was no doubt a major performance bug for + the default win32 configuration. + - Removed -DSMALL_CONFIG from NT_MAKEFILE. It seemed like an anchronism now + that the average PC has 64MB or so. + - Integrated Bryce McKinley's patches for linux threads and dynamic loading + from the libgcj tree. Turned on dynamic loading support for Linux/PPC. + - Changed the stack finding code to use environ on HP/UX. (Thanks + to Gustavo Rodriguez-Rivera for the suggestion.) This should probably + be done on other platforms, too. Since I can't test those, that'll + wait until after 5.0. + + Since 5.0alpha7: + - Fixed threadlibs.c for linux threads. -DUSE_LD_WRAP was broken and + -ldl was omitted. Fixed Linux stack finding code to handle + -DUSE_LD_WRAP correctly. + - Added MSWIN32 exception handler around marker, so that the collector + can recover from root segments that are unmapped during the collection. + This caused occasional failures under Windows 98, and may also be + an issue under Windows NT/2000. + + Since 5.0 + - Fixed a gc.h header bug which showed up under Irix. (Thanks to + Dan Sullivan.) + - Fixed a typo in GC_double_descr in typd_mlc.c. + This probably could result in objects described by array descriptors not + getting traced correctly. (Thanks to Ben Hutchings for pointing this out.) + - The block nearly full tests in reclaim.c were not correct for 64 bit + environments. This could result in unnecessary heap growth under unlikely + conditions. + + Since 5.1 + - dyn_load.c declared GC_scratch_last_end_ptr as an extern even if it + was defined as a macro. This prevented the collector from building on + Irix. + - We quietly assumed that indirect mark descriptors were never 0. + Our own typed allocation interface violated that. This could result + in segmentation faults in the marker with typed allocation. + - Fixed a _DUSE_MUNMAP bug in the heap block allocation code. + (Thanks to Ben Hutchings for the patch.) + - Taught the collector about VC++ handling array operator new. + (Thanks again to Ben Hutchings for the patch.) + - The two copies of gc_hdrs.h had diverged. Made one a link to the other + again. + + Since 5.2 (A few 5.2 patches are not in 6.0alpha1) + - Fixed _end declaration for OSF1. + - There were lots of spurious leak reports in leak detection mode, caused + by the fact that some pages were not being swept, and hence unmarked + objects weren't making it onto free lists. (This bug dated back to 5.0.) + - Fixed a typo in the liblinuxgc.so Makefile rule. + - Added the GetExitCodeThread to Win32 GC_stop_world to (mostly) work + around a Windows 95 GetOpenFileName problem. (Thanks to Jacob Navia.) + + Since 5.3 + - Fixed a typo that prevented compilation with -DUSE_3DNOW_PREFETCH. + (Thanks to Shawn Wagner for actually testing this.) + - Fixed GC_is_thread_stack in solaris_threads.c. It forgot to return a value + in the common case. I wonder why nobody noticed? + - Fixed another silly syntax problem in GC_double_descr. (Thanks to + Fergus Henderson for finding it.) + - Fixed a GC_gcj_malloc bug: It tended to release the allocator lock twice. + + Since 5.4 (A few 5.3 patches are not in 6.0alpha2) + - Added HP/PA prefetch support. + - Added -DDBG_HDRS_ALL and -DSHORT_DBG_HDRS to reduce the cost and improve + the reliability of generating pointer backtrace information, e.g. in + the Bigloo environment. + - Added parallel marking support (-DPARALLEL_MARK). This currently + works only under IA32 and IA64 Linux, but it shouldn't be hard to adapt + to other platforms. This is intended to be a lighter-weight (less + new code, probably not as scalable) solution than the work by Toshio Endo + et al, at the University of Tokyo. A number of their ideas were + reused, though the code wasn't, and the underlying data structure + is significantly different. In particular, we keep the global mark + stack as a single shared data structure, but most of the work is done + on smaller thread-local mark stacks. + - Changed GC_malloc_many to be cheaper, and to require less mutual exclusion + with -DPARALLEL_MARK. + - Added full support for thread local allocation under Linux + (-DTHREAD_LOCAL_ALLOC). This is a thin veneer on GC_malloc_many, and + should be easily portable to other platforms, especially those that + support pthreads. + - CLEAR_DOUBLE was not always getting invoked when it should have been. + - GC_gcj_malloc and friends used different out of memory handling than + everything else, probably because I forgot about one when I implemented + the other. They now both call GC_oom_fn(), not GC_oom_action(). + - Integrated Jakub Jelinek's fixes for Linux/SPARC. + - Moved GC_objfreelist, GC_aobjfreelist, and GC_words_allocd out of + GC_arrays, and separately registered the first two as excluded roots. + This makes code compiled with gc_inl.h less dependent on the + collector version. (It would be nice to remove the inclusion of + gc_priv.h by gc_inl.h completely, but we're not there yet. The + locking definitions in gc_priv.h are still referenced.) + This change was later coniditoned on SEPARATE_GLOBALS, which + is not defined by default, since it involves a performance hit. + - Register GC_obj_kinds separately as an excluded root region. The + attempt to register it with GC_arrays was usually failing. (This wasn't + serious, but seemed to generate some confusion.) + - Moved backptr.h to gc_backptr.h. + + Since 6.0alpha1 + - Added USE_MARK_BYTES to reduce the need for compare-and-swap on platforms + for which that's expensive. + - Fixed a locking bug ib GC_gcj_malloc and some locking assertion problems. + - Added a missing volatile to OR_WORD and renamed the parameter to + GC_compare_and_swap so it's not a C++ reserved word. (Thanks to + Toshio Endo for pointing out both of those.) + - Changed Linux dynamic library registration code to look at /proc/self/maps + instead of the rld data structures when REDIRECT_MALLOC is defined. + Otherwise some of the rld data data structures may be prematurely garbage + collected. (Thanks to Eric Benson for helping to track this down.) + - Fixed USE_LD_WRAP a bit more, so it should now work without threads. + - Renamed XXX_THREADS macros to GC_XXX_THREADS for namespace correctness. + Tomporarily added some backward compatibility definitions. Renamed + USE_LD_WRAP to GC_USE_LD_WRAP. + - Many MACOSX POWERPC changes, some additions to the gctest output, and + a few minor generic bug fixes. (Thanks to Dietmar Planitzer.) + + Since 6.0 alpha2 + - Fixed the /proc/self/maps code to not seek, since that apparently is not + reliable across all interesting kernels. + - Fixed some compilation problems in the absence of PARALLEL_MARK + (introduced in alpha2). + - Fixed an algorithmic problem with PARALLEL_MARK. If work needs to + be given back to the main mark "stack", the BOTTOM entries of the local + stack should be given away, not the top ones. This has substantial + performance impact, especially for > 2 processors, from what I can tell. + - Extracted gc_lock.h from gc_priv.h. This should eventually make it a + bit easier to avoid including gc_priv.h in clients. + - Moved all include files to include/ and removed duplicate links to the + same file. The old scheme was a bad idea because it was too easy to get the + copies out of sync, and many systems don't support hard links. + Unfortunately, it's likely that I broke some of the non-Unix Makefiles in + the process, although I tried to update them appropriately. + - Removed the partial support for a copied nursery. It's not clear that + this would be a tremendous win, since we don't consistently lose to + generational copying collectors. And it would significantly complicate + many things. May be reintroduced if/when it really turns out to win. + - Removed references to IRIX_JDK_THREADS, since I believe there never + were and never will be any clients. + - Added some code to linux_threads.c to possibly support HPUX threads + using the Linux code. Unfortunately, it doesn't work yet, and is + currently disabled. + - Added support under Linux/X86 for saving the call chain, both in (debug) + objects for client debugging, and in GC_arrays._last_stack for GC + debugging. This was previously supported only under Solaris. It is + not enabled by default under X86, since it requires that code be compiled + to explicitly dave frame pointers on the call stack. (With gcc this + currently happens by default, but is often turned off explicitly.) + To turn it on, define SAVE_CALL_CHAIN. + + Since 6.0 alpha3 + - Moved up the detection of mostly full blocks to the initiatiation of the + sweep phase. This eliminates some lock conention in the PARALLEL_MARK case, + as multiple threads try to look at mostly full blocks concurrently. + - Restored the code in GC_malloc_many that grabs a prefix of the global + free list. This avoids the case in which every GC_malloc_many call + tries and fails to allocate a new heap block, and the returns a single + object from the global free list. + - Some minor fixes in new_hblk.c. (Attempted to build free lists in order + of increasing addresses instead of decreasing addresses for cache performance + reasons. But this seems to be only a very minor gain with -DEAGER_SWEEP, + and a loss in other cases. So the change was backed out.) + - Fixed some of the documentation. (Thanks in large part to Fergus + Henderson.) + - Fixed the Linux USE_PROC_FOR_LIBRARIES code to deal with apps that perform + large numbers of mmaps. (Thanks to Eric Benson.) Also fixed that code to + deal with short reads. + - Added GC_get_total_bytes(). + - Fixed leak detection mode to avoid spurious messages under linuxthreads. + (This should also now be easy for the other supported threads packages. + But the code is tricky enough that I'm hesitant to do it without being able + to test. Everything allocated in the GC thread support itself should be + explicitly deallocated.) + - Made it possible (with luck) to redirect malloc to GC_local_malloc. + + Since 6.0 alpha4 + - Changed the definition of GC_pause in linux_threads.c to use a volatile + asm. Some versions of gcc apparently optimize away writes to local volatile + variables. This caused poor locking behaviour starting at about + 4 processors. + - Added GC_start_blocking(), GC_end_blocking() calls and wrapper for sleep + to linux_threads.c. + The first two calls could be used to generally avoid sending GC signals to + blocked threads, avoiding both premature wakeups and unnecessary overhead. + - Fixed a serious bug in thread-local allocation. At thread termination, + GC_free could get called on small integers. Changed the code for thread + termination to more efficiently return left-over free-lists. + - Integrated Kjetil Matheussen's BeOS support. + - Rearranged the directory structure to create the doc and tests + subdirectories. + - Sort of integrated Eric Benson's patch for OSF1. This provided basic + OSF1 thread support by suitably extending hpux_irix_threads.c. Based + on earlier email conversations with David Butenhof, I suspect that it + will be more reliable in the long run to base this on linux_threads.c + instead. Thus I attempted to patch up linux_threads.c based on Eric's code. + The result is almost certainly broken, but hopefully close enough that + someone with access to a machine can pick it up. + - Integrated lots of minor changes from the NetBSD distribution. (These + were supplied by David Brownlee. I'm not sure about the original + authors.) + - Hacked a bit more on the HP/UX thread-support in linux_threads.c. It + now appears to work in the absence of incremental collection. Renamed + hpux_irix_threads.c back to irix_threads.c, and removed the attempt to + support HPUX there. + - Changed gc.h to define _REENTRANT in cases in which it should already + have been defined. It is still safer to also define it on the command + line. + + Since 6.0alpha5: + - Changed the definition of DATASTART on ALPHA and IA64, where data_start + and __data_start are not defined by earlier versions of glibc. This might + need to be fixed on other platforms as well. + - Changed the way the stack base and backing store base are found on IA64. + This should now remain reliable on future kernels. But since it relies + on /proc, it will no longer work in the simulated NUE environment. + - Made the call to random() in dbg_mlc.c with -DKEEP_BACK_PTRS dependent + on the OS. On non-Unix systems, rand() should be used instead. Handled + small RAND_MAX. (Thanks to Peter Ross for pointing this out.) + - Fixed the cord make rules to create the cord subdirectory, if necessary. + (Thanks to Doug Moen.) + - Changed fo_object_size calculation in finalize.c. Turned finalization + of nonheap object into a no-op. Removed anachronism from GC_size() + implementation. + - Changed GC_push_dirty call in solaris_threads.c to GC_push_selected. + It was missed in a previous renaming. (Thanks to Vladimir Tsichevski + for pointing this out.) + - Arranged to not not mask SIGABRT in linux_threads.c. (Thanks to Bryce + McKinlay.) + - Added GC_no_dls hook for applications that want to register their own + roots. + - Integrated Kjetil Matheussen's Amiga changes. + - Added FREEBSD_STACKBOTTOM. Changed the X86/FreeBSD port to use it. + (Thanks to Matthew Flatt.) + - Added pthread_detach interception for platforms supported by linux_threads.c + and irix_threads.c. Should also be added for Solaris? + - Changed the USE_MMAP code to check for the case in which we got the + high end of the address space, i.e. mem_ptr + mem_sz == 0. It appears + that this can happen under Solaris 7. It seems to be allowed by what + I would claim is an oversight in the mmap specification. (Thanks to Toshio + Endo for pointing out the problem.) + - Cleanup of linux_threads.c. Some code was originally cloned from + irix_threads.c and now unnecessary. Some comments were obviously wrong. + - (Mostly) fixed a longstanding problem with setting of dirty bits from + a signal handler. In the presence of threads, dirty bits could get lost, + since the etting of a bit in the bit vector was not atomic with respect + to other updates. The fix is 100% correct only for platforms for which + GC_test_and_set is defined. The goal is to make that all platforms with + thread support. Matters only if incremental GC and threads are both + enabled. + - made GC_all_interior_pointers (a.k.a. ALL_INTERIOR_POINTERS) an + initialization time, instead of build-time option. This is a + nontrivial, high risk change. It should slow down the code measurably + only if MERGE_SIZES is not defined, which is a very nonstandard + configuration. + - Added doc/README.environment, and implemented what it describes. This + allows a number of additional configuration options to be set through + the environment. It documents a few previously undocumented options. + - Integrated Eric Benson's leak testing improvements. + - Removed the option to throw away the beginning of each page (DISCARD_WORDS). + This became less and less useful as processors enforce stricter alignment. + And it hadn't been tested in ages, and was thus probably broken anyway. + + Since 6.0alpha6: + - Added GC_finalizer_notifier. Fixed GC_finalize_on_demand. (The variable + actually wasn't being tested at the right points. The build-time flag + was.) + - Added Tom Tromey's S390 Linux patch. + - Added code to push GC_finalize_now in GC_push_finalizer_structures. + (Thanks to Matthew Flatt.) + - Added GC_push_gc_structures() to push all GC internal roots. + - Integrated some FreeBSD changes from Matthew Flatt. + - It looks like USRSTACK is not always correctly defined under Solaris. + Hacked gcconfig.h to attempt to work around the problem. The result + is not well tested. (Thanks again to Matthew Flatt for pointing this + out. The gross hack is mine. - HB) + - Added Ji-Yong Chung's win32 threads and C++ fixes. + - Arranged for hpux_test_and_clear.s to no longer be needed or built. + It was causing build problems with gas, and it's not clear this is + better than the pthreads alternative on this platform. + - Some MINGW32 fixes from Hubert Garavel. + - Added Initial Hitachi SH4 port from Kaz Kojima. + - Ported thread-local allocation and parallel mark code to HP/UX on PA_RISC. + - Made include/gc_mark.h more public and separated out the really private + pieces. This is probably still not quite sufficient for clients that + want to supply their own kind of type information. But it's a start. + This involved lots of identifier renaming to make it namespace clean. + - Added GC_dont_precollect for clients that need complete control over + the root set. + - GC_is_visible didn't do the right thing with gcj objects. (Not that + many people are likely to care, but ...) + - Don't redefine read with GC_USE_LD_WRAP. + - Initial port to LINUX/HP_PA. Incremental collection and threads are not + yet supported. (Incremental collection should work if you have the + right kernel. Threads may work with a sufficiently patched pthread + library.) + - Changed gcconfig.h to recognize __i386__ as an alternative to i386 in + many places. (Thanks to Benjamin Lerman.) + - Made win32_threads.c more tolerant of detaching a thread that it didn't + know about. (Thanks to Paul Nash.) + - Added Makefile.am and configure.in from gcc to the distribution, with + minimal changes. For the moment, those are just placeholders. In the + future, we're planning to switch to a GNU-style build environment for + Un*x-like systems, though the old Makefile will remain as a backup. + - Turned off STUBBORN_ALLOC by default, and added it back as a Makefile + option. + - Redistributed some functions between malloc.c and mallocx.c, so that + simple statically linked apps no longer pull in mallocx.o. + - Changed large object allocation to clear the first and last few words + of each block before releassing the lock. Otherwise the marker could see + objects with nonsensical type descriptors. + - Fixed a couple of subtle problems that could result in not recognizing + interior pointers from the stack. (I believe these were introduced + in 6.0alpha6.) + - GC_debug_free_inner called GC_free, which tried to reacquire the + allocator lock, and hence deadlocked. (DBG_HDRS_ALL probably never worked + with threads?) + - Fixed several problems with back traces. Accidental references to a free + list could cause the free list pointer to be overwritten by a back pointer. + There seemed to be some problems with the encoding of root and finalizer + references. + + Since 6.0alpha7: + - Changed GC_debug_malloc_replacement and GC_debug_realloc_replacement + so that they compile under Irix. (Thanks to Dave Love.) + - Updated powerpc_macosx_mach_dep.s so that it works if the collector + is in a dynamic library. (Thanks to Andrew Begel.) + - Transformed README.debugging into debugging.html, updating and + expanding it in the process. Added gcdescr.html and tree.html + from the web site to the GC distribution. + - Fixed several problems related to PRINT_BLACK_LIST. This involved + restructuring some of the marker macros. + - Fixed some problems with the sizing of objects with debug information. + Finalization was broken KEEP_BACK_PTRS or PRINT_BLACK_LIST. Reduced the + object size with SHORT_DEBUG_HDRS by another word. + - The "Needed to allocate blacklisted ..." warning had inadvertently + been turned off by default, due to a buggy test in allchblk.c. Turned + it back on. + - Removed the marker macros to deal with 2 pointers in interleaved fashion. + They were messy and the performance improvement seemed minimal. We'll + leave such scheduling issues to the compiler. + - Changed Linux/PowerPC test to also check for __powerpc__ in response + to a discussion on the gcc mailing list. + - On Matthew Flatt's suggestion removed the "static" from the jmp_buf + declaration in GC_generic_push_regs. This was causing problems in + systems that register all of their own roots. It looks far more correct + to me without the "static" anyway. + - Fixed several problems with thread local allocation of pointerfree or + typed objects. The collector was reclaiming thread-local free lists, since + it wasn't following the link fields. + - There was apparently a long-standing race condition related to multithreaded + incremental collection. A collection could be started and a thread stopped + between the memory unprotect system call and the setting of the + corresponding dirt bit. I believe this did not affect Solaris or PCR, which + use a different dirty-bit implementation. Fixed this by installing + signal handlers with sigaction instead of signal, and disabling the thread + suspend signal while in the write-protect handler. (It is unclear + whether this scenario ever actually occurred. I found it while tracking + down the following:) + - Incremental collection did not cooperate correctly with the PARALLEL_MARK + implementation of GC_malloc_many or the local_malloc primitves. It still + doesn't work well, but it shouldn't lose memory anymore. + - Integrated some changes from the gcc source tree that I had previously + missed. (Thanks to Bryce McKinley for the reminder/diff.) + - Added Makefile.direct as a copy of the default Makefile, which would + normally be overwritten if configure is run. + - Changed the gc.tar target in Makefile.direct to embed the version number + in the gc directory name. This will affect future tar file distributions. + - Changed the Irix dynamic library finding code to no longer try to + eliminate writable text segments under Irix6.x, since that is probably no + longer necessary, and can apparently be unsafe on occasion. (Thanks to + Shiro Kawai for pointing this out.) + - GC_cleanup with GC_DEBUG enabled passed a real object base address to + GC_debug_register_finalizer_ignore_self, which expected a pointer past the + debug header. Call GC_register_finalizer_ignore_self instead, even with + debugging enabled. (Thanks to Jean-Daniel Fekete for catching this.) + - The collector didn't build with call chain saving enabled but NARGS=0. + (Thanks to Maarten Thibaut.) + - Fixed up the GNU-style build files enough so that they work in some + obvious cases. + - Added initial port to Digital Mars compiler for win32. (Thanks to Walter + Bright.) + + Since 6.0alpha8: + - added README.macros. + - Made gc.mak a symbolic link to work around winzip's tendency to ignore + hard links. + - Simplified the setting of NEED_FIND_LIMIT in os_dep.c, possibly breaking + it on untested platforms. + - Integrated initial GNU HURD port. (Thanks to Chris Lingard and Igor + Khavkine.) + - A few more fixes for Digital Mars compiler (Walter Bright). + - Fixed gcc version recognition. Renamed OPERATOR_NEW_ARRAY to + GC_OPERATOR_NEW_ARRAY. Changed GC_OPERATOR_NEW_ARRAY to be the default. + It can be overridden with -DGC_NO_OPERATOR_NEW_ARRAY. (Thanks to + Cesar Eduardo Barros.) + - Changed the byte size to free-list mapping in thread local allocation + so that size 0 allocations are handled correctly. + - Fixed Linux/MIPS stackbottom for new toolchain. (Thanks to Ryan Murray.) + - Changed finalization registration to invoke GC_oom_fn when it runs out + of memory. + - Removed lvalue cast in finalize.c. This caused some debug configurations + not to build with some non-gcc compilers. + + Since 6.0alpha9: + - Two more bug fixes for KEEP_BACK_PTRS and DBG_HDRS_ALL. + - Fixed a stack clearing problem that resulted in SIGILL with a + misaligned stack pointer for multithreaded SPARC builds. + - Integrated another HURD patch (thanks to Igor Khavkine). + + Since 6.0: + - Non-debug, atomic allocations could result in bogus smashed object + reports with debugging on. (Thanks to Patrick Doyle for the small + test case.) + - Fixed GC_get_register_stack_base (Itanium only) to work around a glibc + 2.2.4 bug. + - Initial port to HP/UX on Itanium. Thread support and both 32 and 64 + bit ABIs appear to work. Parallel mark support doesn't yet, due to + some inline assembly code issues. Thread local allocation does appear + to work. + - ifdef'ed out glibc2.1/Itanium workaround. I suspect nobody is using + that combination anymore. + - Added a patch to make new_gc_alloc.h usable with gcc3.0. (Thanks to + Dimitris Vyzovitis for the patch.) + - Debugged 64-bit support on HP/UX PA-RISC. + - Turned on dynamic loading support for FreeBSD/ELF. (Thanks to Peter + Housel.) + - Unregistering of finalizers with debugging allocation was broken. + (Thanks to Jani Kajala for the test case.) + - Old finalizers were not returned correctly from GC_debug_register_finalizer. + - Disabled MPROTECT_VDB for Linux/M68K based on a report that it doesn't work. + - Cleaned up some statistics gathering code in reclaim.c (Thanks to Walter + Bright.) + - Added some support for OpenBSD/ELF/Linux. (Thanks to Suzuki Toshiya.) + - Added Jakub Jelinek's patch to use dl_iterate_phdr for dynamic library + traversal to dyn_load.c. Changed it to weakly reference dl_iterate_phdr, + so that the old code is stilll used with old versions of glibc. + - Cleaned up feature test macros for various threads packages and + integrated (partially functional) FreeBSD threads code from Loren Rittle. + It's likely that the cleanup broke something, since it touched lots of + code. It's also likelly that it fixed some unreported bugs in the + less common thread implementations, since some of the original code + didn't stand up to close scrutiny. Support for the next pthreads + implementation should be easier to add. + + Since 6.1alpha1: + - No longer wrap read by default in multithreaded applications. It was + pointed out on the libgcj list that this holds the allocation lock for + way too long if the read blocks. For now, reads into the heap are + broken with incremental collection. It's possible to turn this back on + if you make sure that read calls don't block (e.g. by calling select + first). + - Fix ifdef in Solaris_threads.h to refer to GC_SOLARIS_THREADS. + - Added check for environment variable GC_IGNORE_GCJ_INFO. + - Added printing of stop-the-world GC times if GC_PRINT_STATS environment + variable is set. + - The calloc definition in leak_detector.h was missing parentheses, and + realloc was missing a second argument to GC_REALLOC. + (Thanks to Elrond (elrondsamba-tng.org).) + - Added GC_PRINT_BACK_HEIGHT environment variable and associated + code, mostly in the new file backgraph.c. See doc/README.environment. + - Added -DUSE_GLOBAL_ALLOC to work around a Windows NT issue. (Thanks to + Jonathan Clark.) + - Integrated port to NEC EWS4800 (MIPS-based workstation, with somewhat + different address-space layout). This may help for other machines with + holes in the data segment. (Thanks to Hironori Sakamoto.) + - Changed the order in which GC_push_roots and friends push things onto + the mark stack. GC_push_all calls need to come first, since we can't + necessarily recovere if those overflow the mark stack. (Thanks to + Matthew Flatt for tracking down the problem.) + - Some minor cleanups to mostly support the Intel compiler on Linux/IA64. + + Since 6.1 alpha2: + - Minor cleanup on the gcconfig.h section for SPARC. + - Minor fix to support Intel compiler for I386/Linux. (Thanks to Sven + Hartrumpf.) + - Added SPARC V9 (64-bit) support. (Thanks to Jeff Sturm.) + - Restructured the way in which we determine whether or not to keep + call stacks for debug allocation. By default SAVE_CALL_COUNT is + now zero on all platforms. Added SAVE_CALL_NARGS parameters. + If possible, use execinfo.h to capture call stack. (This should + add support for a number of new platforms, though often at + considerable runtime expense.) + - Try to print symbolic information for call stacks. On Linux, we + do this with a combination of execinfo.h and running addr2line in + a separate process. This is both much more expensive and much more + useful. Amazingly, it seems to be fast enough for most purposes. + - Redefined strdup if -DREDIRECT_MALLOC is given. + - Changed incremental collector and MPROTECT_VDB implementation so that, + under favorable conditions, pointerfree objects are not protected. + Added GC_incremental_protection_needs() to determine ahead of time whether + pointerfree objects may be protected. Replaced GC_write_hint() with + GC_remove_protection(). + - Added test for GC_ENABLE_INCREMENTAL environment variable. + - Made GC_time_limit runtime configurable. Added GC_PAUSE_TIME_TARGET + environment variable. + - Eliminated GC_page_sz, a duplicate of GC_page_size. + - Caused the Solaris and Irix thread creation primitives to call + GC_init_inner(). + + + To do: + - There seem to be outstanding issues on Solaris/X86, possibly with + finding the data segment starting address. Information/patches would + be appreciated. + - Very large root set sizes (> 16 MB or so) could cause the collector + to abort with an unexpected mark stack overflow. (Thanks again to + Peter Chubb.) NOT YET FIXED. Workaround is to increase the initial + size. + - The SGI version of the collector marks from mmapped pages, even + if they are not part of dynamic library static data areas. This + causes performance problems with some SGI libraries that use mmap + as a bitmap allocator. NOT YET FIXED. It may be possible to turn + off DYNAMIC_LOADING in the collector as a workaround. It may also + be possible to conditionally intercept mmap and use GC_exclude_static_roots. + The real fix is to walk rld data structures, which looks possible. + - Incremental collector should handle large objects better. Currently, + it looks like the whole object is treated as dirty if any part of it + is. + - Cord/cordprnt.c doesn't build on a few platforms (notably PowerPC), since + we make some unwarranted assumptions about how varargs are handled. This + currently makes the cord-aware versions of printf unusable on some platforms. + Fixing this is unfortunately not trivial. diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.contributors gcc-3.1/boehm-gc/doc/README.contributors *** gcc-3.0.4/boehm-gc/doc/README.contributors Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.contributors Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,57 ---- + This is an attempt to acknowledge early contributions to the garbage + collector. Later contributions should instead be mentioned in + README.changes. + + HISTORY - + + Early versions of this collector were developed as a part of research + projects supported in part by the National Science Foundation + and the Defense Advance Research Projects Agency. + + The garbage collector originated as part of the run-time system for + the Russell programming language implementation. The first version of the + garbage collector was written primarily by Al Demers. It was then refined + and mostly rewritten, primarily by Hans-J. Boehm, at Cornell U., + the University of Washington, Rice University (where it was first used for + C and assembly code), Xerox PARC, SGI, and HP Labs. However, significant + contributions have also been made by many others. + + Some other contributors: + + More recent contributors are mentioned in the modification history in + README.changes. My apologies for any omissions. + + The SPARC specific code was originally contributed by Mark Weiser. + The Encore Multimax modifications were supplied by + Kevin Kenny (kenny@m.cs.uiuc.edu). The adaptation to the IBM PC/RT is largely + due to Vernon Lee, on machines made available to Rice by IBM. + Much of the HP specific code and a number of good suggestions for improving the + generic code are due to Walter Underwood. + Robert Brazile (brazile@diamond.bbn.com) originally supplied the ULTRIX code. + Al Dosser (dosser@src.dec.com) and Regis Cridlig (Regis.Cridlig@cl.cam.ac.uk) + subsequently provided updates and information on variation between ULTRIX + systems. Parag Patel (parag@netcom.com) supplied the A/UX code. + Jesper Peterson(jep@mtiame.mtia.oz.au), Michel Schinz, and + Martin Tauchmann (martintauchmann@bigfoot.com) supplied the Amiga port. + Thomas Funke (thf@zelator.in-berlin.de(?)) and + Brian D.Carlstrom (bdc@clark.lcs.mit.edu) supplied the NeXT ports. + Douglas Steel (doug@wg.icl.co.uk) provided ICL DRS6000 code. + Bill Janssen (janssen@parc.xerox.com) supplied the SunOS dynamic loader + specific code. Manuel Serrano (serrano@cornas.inria.fr) supplied linux and + Sony News specific code. Al Dosser provided Alpha/OSF/1 code. He and + Dave Detlefs(detlefs@src.dec.com) also provided several generic bug fixes. + Alistair G. Crooks(agc@uts.amdahl.com) supplied the NetBSD and 386BSD ports. + Jeffrey Hsu (hsu@soda.berkeley.edu) provided the FreeBSD port. + Brent Benson (brent@jade.ssd.csd.harris.com) ported the collector to + a Motorola 88K processor running CX/UX (Harris NightHawk). + Ari Huttunen (Ari.Huttunen@hut.fi) generalized the OS/2 port to + nonIBM development environments (a nontrivial task). + Patrick Beard (beard@cs.ucdavis.edu) provided the initial MacOS port. + David Chase, then at Olivetti Research, suggested several improvements. + Scott Schwartz (schwartz@groucho.cse.psu.edu) supplied some of the + code to save and print call stacks for leak detection on a SPARC. + Jesse Hull and John Ellis supplied the C++ interface code. + Zhong Shao performed much of the experimentation that led to the + current typed allocation facility. (His dynamic type inference code hasn't + made it into the released version of the collector, yet.) + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.cords gcc-3.1/boehm-gc/doc/README.cords *** gcc-3.0.4/boehm-gc/doc/README.cords Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.cords Sat Aug 18 01:04:43 2001 *************** *** 0 **** --- 1,53 ---- + Copyright (c) 1993-1994 by Xerox Corporation. All rights reserved. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program + for any purpose, provided the above notices are retained on all copies. + Permission to modify the code and to distribute modified code is granted, + provided the above notices are retained, and a notice that the code was + modified is included with the above copyright notice. + + Please send bug reports to Hans-J. Boehm (Hans_Boehm@hp.com or + boehm@acm.org). + + This is a string packages that uses a tree-based representation. + See cord.h for a description of the functions provided. Ec.h describes + "extensible cords", which are essentially output streams that write + to a cord. These allow for efficient construction of cords without + requiring a bound on the size of a cord. + + More details on the data structure can be found in + + Boehm, Atkinson, and Plass, "Ropes: An Alternative to Strings", + Software Practice and Experience 25, 12, December 1995, pp. 1315-1330. + + A fundamentally similar "rope" data structure is also part of SGI's standard + template library implementation, and its descendents, which include the + GNU C++ library. That uses reference counting by default. + There is a short description of that data structure at + http://reality.sgi.com/boehm/ropeimpl.html . (The more official location + http://www.sgi.com/tech/stl/ropeimpl.html is missing a figure.) + + All of these are descendents of the "ropes" in Xerox Cedar. + + de.c is a very dumb text editor that illustrates the use of cords. + It maintains a list of file versions. Each version is simply a + cord representing the file contents. Nonetheless, standard + editing operations are efficient, even on very large files. + (Its 3 line "user manual" can be obtained by invoking it without + arguments. Note that ^R^N and ^R^P move the cursor by + almost a screen. It does not understand tabs, which will show + up as highlighred "I"s. Use the UNIX "expand" program first.) + To build the editor, type "make cord/de" in the gc directory. + + This package assumes an ANSI C compiler such as gcc. It will + not compile with an old-style K&R compiler. + + Note that CORD_printf iand friends use C functions with variable numbers + of arguments in non-standard-conforming ways. This code is known to + break on some platforms, notably PowerPC. It should be possible to + build the remainder of the library (everything but cordprnt.c) on + any platform that supports the collector. + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.dj gcc-3.1/boehm-gc/doc/README.dj *** gcc-3.0.4/boehm-gc/doc/README.dj Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.dj Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,12 ---- + [Original version supplied by Xiaokun Zhu ] + [This version came mostly from Gary Leavens. ] + + Look first at Makefile.dj, and possibly change the definitions of + RM and MV if you don't have rm and mv installed. + Then use Makefile.dj to compile the garbage collector. + For example, you can do: + + make -f Makefile.dj test + + All the tests should work fine. + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.environment gcc-3.1/boehm-gc/doc/README.environment *** gcc-3.0.4/boehm-gc/doc/README.environment Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.environment Tue Apr 9 00:03:25 2002 *************** *** 0 **** --- 1,94 ---- + The garbage collector looks at a number of environment variables which are + then used to affect its operation. These are examined only on Un*x-like + platforms. + + GC_INITIAL_HEAP_SIZE= - Initial heap size in bytes. May speed up + process start-up. + + GC_LOOP_ON_ABORT - Causes the collector abort routine to enter a tight loop. + This may make it easier to debug, such a process, especially + for multithreaded platforms that don't produce usable core + files, or if a core file would be too large. On some + platforms, this also causes SIGSEGV to be caught and + result in an infinite loop in a handler, allowing + similar debugging techniques. + + GC_PRINT_STATS - Turn on as much logging as is easily feasible without + adding signifcant runtime overhead. Doesn't work if + the collector is built with SMALL_CONFIG. Overridden + by setting GC_quiet. On by default if the collector + was built without -DSILENT. + + GC_PRINT_ADDRESS_MAP - Linux only. Dump /proc/self/maps, i.e. various address + maps for the process, to stderr on every GC. Useful for + mapping root addresses to source for deciphering leak + reports. + + GC_NPROCS= - Linux w/threads only. Explicitly sets the number of processors + that the GC should expect to use. Note that setting this to 1 + when multiple processors are available will preserve + correctness, but may lead to really horrible performance. + + GC_NO_BLACKLIST_WARNING - Prevents the collector from issuing + warnings about allocations of very large blocks. + Deprecated. Use GC_LARGE_ALLOC_WARN_INTERVAL instead. + + GC_LARGE_ALLOC_WARN_INTERVAL= - Print every nth warning about very large + block allocations, starting with the nth one. Small values + of n are generally benign, in that a bounded number of + such warnings generally indicate at most a bounded leak. + For best results it should be set at 1 during testing. + Default is 5. Very large numbers effectively disable the + warning. + + GC_IGNORE_GCJ_INFO - Ignore the type descriptors implicitly supplied by + GC_gcj_malloc and friends. This is useful for debugging + descriptor generation problems, and possibly for + temporarily working around such problems. It forces a + fully conservative scan of all heap objects except + those known to be pointerfree, and may thus have other + adverse effects. + + GC_PRINT_BACK_HEIGHT - Print max length of chain through unreachable objects + ending in a reachable one. If this number remains + bounded, then the program is "GC robust". This ensures + that a fixed number of misidentified pointers can only + result in a bounded space leak. This currently only + works if debugging allocation is used throughout. + It increases GC space and time requirements appreciably. + This feature is still somewhat experimental, and requires + that the collector have been built with MAKE_BACK_GRAPH + defined. For details, see Boehm, "Bounding Space Usage + of Conservative Garbage Collectors", POPL 2001, or + http://lib.hpl.hp.com/techpubs/2001/HPL-2001-251.html . + + GC_ENABLE_INCREMENTAL - Turn on incremental collection at startup. Note that, + depending on platform and collector configuration, this + may involve write protecting pieces of the heap to + track modifications. These pieces may include pointerfree + objects or not. Although this is intended to be + transparent, it may cause unintended system call failures. + Use with caution. + + GC_PAUSE_TIME_TARGET - Set the desired garbage collector pause time in msecs. + This only has an effect if incremental collection is enabled. + If a collection requires appreciably more time than this, + the client will be restarted, and the collector will need + to do additional work to compensate. The special value + "999999" indicates that pause time is unlimited, and the + incremental collector will behave completely like a + simple generational collector. If the collector is + configured for parallel marking, and run on a multiprocessor, + incremental collection should only be used with unlimited + pause time. + + The following turn on runtime flags that are also program settable. Checked + only during initialization. We expect that they will usually be set through + other means, but this may help with debugging and testing: + + GC_FIND_LEAK - Turns on GC_find_leak and thus leak detection. + + GC_ALL_INTERIOR_POINTERS - Turns on GC_all_interior_pointers and thus interior + pointer recognition. + + GC_DONT_GC - Turns off garbage collection. Use cautiously. diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.ews4800 gcc-3.1/boehm-gc/doc/README.ews4800 *** gcc-3.0.4/boehm-gc/doc/README.ews4800 Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.ews4800 Thu Jan 31 02:48:54 2002 *************** *** 0 **** --- 1,75 ---- + GC on EWS4800 + ------------- + + 1. About EWS4800 + EWS4800 is 32bit/64bit workstation. + + Vender: NEC Corporation + OS: UX/4800 R9.* - R13.* (SystemV R4.2) + CPU: R4000, R4400, R10000 (MIPS) + + 2. Compiler + + 32bit: + Use ANSI C compiler. + CC = /usr/abiccs/bin/cc + + 64bit: + Use 64bit ANSI C compiler. + CC = /usr/ccs64/bin/cc + AR = /usr/ccs64/bin/ar + + 3. ELF file format + *** Caution: The following infomation is empirical. *** + + 32bit: + ELF file has an unique format. (See a.out(4) and end(3C).) + + &_start + : text segment + &etext + DATASTART + : data segment (initialized) + &edata + DATASTART2 + : data segment (uninitialized) + &end + + Here, DATASTART and DATASTART2 are macros of GC, and are defined as + the following equations. (See include/private/gcconfig.h.) + The algorithm for DATASTART is similar with the function + GC_SysVGetDataStart() in os_dep.c. + + DATASTART = ((&etext + 0x3ffff) & ~0x3ffff) + (&etext & 0xffff) + + Dynamically linked: + DATASTART2 = (&_gp + 0x8000 + 0x3ffff) & ~0x3ffff + + Statically linked: + DATASTART2 = &edata + + GC has to check addresses both between DATASTART and &edata, and + between DATASTART2 and &end. If a program accesses between &etext + and DATASTART, or between &edata and DATASTART2, the segmentation + error occurs and the program stops. + + If a program is statically linked, there is not a gap between + &edata and DATASTART2. The global symbol &_DYNAMIC_LINKING is used + for the detection. + + 64bit: + ELF file has a simple format. (See end(3C).) + + _ftext + : text segment + _etext + _fdata = DATASTART + : data segment (initialized) + _edata + _fbss + : data segment (uninitialized) + _end = DATAEND + + -- + Hironori SAKAMOTO + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.hp gcc-3.1/boehm-gc/doc/README.hp *** gcc-3.0.4/boehm-gc/doc/README.hp Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.hp Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,18 ---- + Dynamic loading support requires that executables be linked with -ldld. + The alternative is to build the collector without defining DYNAMIC_LOADING + in gcconfig.h and ensuring that all garbage collectable objects are + accessible without considering statically allocated variables in dynamic + libraries. + + The collector should compile with either plain cc or cc -Ae. Cc -Aa + fails to define _HPUX_SOURCE and thus will not configure the collector + correctly. + + Incremental collection support was reccently added, and should now work. + + In spite of past claims, pthread support under HP/UX 11 should now work. + Define GC_HPUX_THREADS for the build. Incremental collection still does not + work in combination with it. + + The stack finding code can be confused by putenv calls before collector + initialization. Call GC_malloc or GC_init before any putenv calls. diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.linux gcc-3.1/boehm-gc/doc/README.linux *** gcc-3.0.4/boehm-gc/doc/README.linux Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.linux Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,135 ---- + See README.alpha for Linux on DEC AXP info. + + This file applies mostly to Linux/Intel IA32. Ports to Linux on an M68K + and PowerPC are also integrated. They should behave similarly, except that + the PowerPC port lacks incremental GC support, and it is unknown to what + extent the Linux threads code is functional. See below for M68K specific + notes. + + Incremental GC is supported on Intel IA32 and M68K. + + Dynamic libraries are supported on an ELF system. A static executable + should be linked with the gcc option "-Wl,-defsym,_DYNAMIC=0". + + The collector appears to work with Linux threads. We have seen + intermittent hangs in sem_wait. So far we have been unable to reproduce + these unless the process was being debugged or traced. Thus it's + possible that the only real issue is that the debugger loses + signals on rare occasions. + + The garbage collector uses SIGPWR and SIGXCPU if it is used with + Linux threads. These should not be touched by the client program. + + To use threads, you need to abide by the following requirements: + + 1) You need to use LinuxThreads (which are included in libc6). + + The collector relies on some implementation details of the LinuxThreads + package. It is unlikely that this code will work on other + pthread implementations (in particular it will *not* work with + MIT pthreads). + + 2) You must compile the collector with -DGC_LINUX_THREADS and -D_REENTRANT + specified in the Makefile. + + 3a) Every file that makes thread calls should define GC_LINUX_THREADS and + _REENTRANT and then include gc.h. Gc.h redefines some of the + pthread primitives as macros which also provide the collector with + information it requires. + + 3b) A new alternative to (3a) is to build the collector and compile GC clients + with -DGC_USE_LD_WRAP, and to link the final program with + + (for ld) --wrap read --wrap dlopen --wrap pthread_create \ + --wrap pthread_join --wrap pthread_detach \ + --wrap pthread_sigmask --wrap sleep + + (for gcc) -Wl,--wrap -Wl,read -Wl,--wrap -Wl,dlopen -Wl,--wrap \ + -Wl,pthread_create -Wl,--wrap -Wl,pthread_join -Wl,--wrap \ + -Wl,pthread_detach -Wl,--wrap -Wl,pthread_sigmask \ + -Wl,--wrap -Wl,sleep + + In any case, _REENTRANT should be defined during compilation. + + 4) Dlopen() disables collection during its execution. (It can't run + concurrently with the collector, since the collector looks at its + data structures. It can't acquire the allocator lock, since arbitrary + user startup code may run as part of dlopen().) Under unusual + conditions, this may cause unexpected heap growth. + + 5) The combination of GC_LINUX_THREADS, REDIRECT_MALLOC, and incremental + collection fails in seemingly random places. This hasn't been tracked + down yet, but is perhaps not completely astonishing. The thread package + uses malloc, and thus can presumably get SIGSEGVs while inside the + package. There is no real guarantee that signals are handled properly + at that point. + + 6) Thread local storage may not be viewed as part of the root set by the + collector. This probably depends on the linuxthreads version. For the + time being, any collectable memory referenced by thread local storage should + also be referenced from elsewhere, or be allocated as uncollectable. + (This is really a bug that should be fixed somehow.) + + + M68K LINUX: + (From Richard Zidlicky) + The bad news is that it can crash every linux-m68k kernel on a 68040, + so an additional test is needed somewhere on startup. I have meanwhile + patches to correct the problem in 68040 buserror handler but it is not + yet in any standard kernel. + + Here is a simple test program to detect whether the kernel has the + problem. It could be run as a separate check in configure or tested + upon startup. If it fails (return !0) than mprotect can't be used + on that system. + + /* + * test for bug that may crash 68040 based Linux + */ + + #include + #include + #include + #include + #include + + + char *membase; + int pagesize=4096; + int pageshift=12; + int x_taken=0; + + int sighandler(int sig) + { + mprotect(membase,pagesize,PROT_READ|PROT_WRITE); + x_taken=1; + } + + main() + { + long l; + + signal(SIGSEGV,sighandler); + l=(long)mmap(NULL,pagesize,PROT_READ,MAP_PRIVATE | MAP_ANON,-1,0); + if (l==-1) + { + perror("mmap/malloc"); + abort(); + } + membase=(char*)l; + *(long*)(membase+sizeof(long))=123456789; + if (*(long*)(membase+sizeof(long)) != 123456789 ) + { + fprintf(stderr,"writeback failed !\n"); + exit(1); + } + if (!x_taken) + { + fprintf(stderr,"exception not taken !\n"); + exit(1); + } + fprintf(stderr,"vmtest Ok\n"); + exit(0); + } + + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.macros gcc-3.1/boehm-gc/doc/README.macros *** gcc-3.0.4/boehm-gc/doc/README.macros Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.macros Fri Aug 17 18:39:18 2001 *************** *** 0 **** --- 1,78 ---- + The collector uses a large amount of conditional compilation in order to + deal with platform dependencies. This violates a number of known coding + standards. On the other hand, it seems to be the only practical way to + support this many platforms without excessive code duplication. + + A few guidelines have mostly been followed in order to keep this manageable: + + 1) #if and #ifdef directives are properly indented whenever easily possible. + All known C compilers allow whitespace between the "#" and the "if" to make + this possible. ANSI C also allows white space before the "#", though we + avoid that. It has the known disadvantages that it differs from the normal + GNU conventions, and that it makes patches larger than otherwise necessary. + In my opinion, it's still well worth it, for the same reason that we indent + ordinary "if" statements. + + 2) Whenever possible, tests are performed on the macros defined in gcconfig.h + instead of directly testing patform-specific predefined macros. This makes it + relatively easy to adapt to new compilers with a different set of predefined + macros. Currently these macros generally identify platforms instead of + features. In many cases, this is a mistake. + + 3) The code currently avoids #elif, eventhough that would make it more + readable. This was done since #elif would need to be understood by ALL + compilers used to build the collector, and that hasn't always been the case. + It makes sense to reconsider this decision at some point, since #elif has been + standardized at least since 1989. + + Many of the tested configuration macros are at least somewhat defined in + either include/private/gcconfig.h or in Makefile.direct. Here is an attempt + at defining some of the remainder: (Thanks to Walter Bright for suggesting + this. This is a work in progress) + + MACRO EXPLANATION + ----- ----------- + + __DMC__ Always #define'd by the Digital Mars compiler. Expands + to the compiler version number in hex, i.e. 0x810 is + version 8.1b0 + + _ENABLE_ARRAYNEW + #define'd by the Digital Mars C++ compiler when + operator new[] and delete[] are separately + overloadable. Used in gc_cpp.h. + + _MSC_VER Expands to the Visual C++ compiler version. Assumed to + not be defined for other compilers (at least if they behave + appreciably differently). + + _DLL Defined by Visual C++ if dynamic libraries are being built + or used. Used to test whether __declspec(dllimport) or + __declspec(dllexport) needs to be added to declarations + to support the case in which the collector is in a dll. + + GC_DLL User-settable macro that forces the effect of _DLL. + + GC_NOT_DLL User-settable macro that overrides _DLL, e.g. if dynamic + libraries are used, but the collector is in a static library. + + __STDC__ Assumed to be defined only by compilers that understand + prototypes and other C89 features. Its value is generally + not used, since we are fine with most nonconforming extensions. + + SUNOS5SIGS Solaris-like signal handling. This is probably misnamed, + since it really doesn't guarantee much more than Posix. + Currently set only for Solaris2.X, HPUX, and DRSNX. Should + probably be set for some other platforms. + + PCR Set if the collector is being built as part of the Xerox + Portable Common Runtime. + + SRC_M3 Set if the collector is being built as a replacement of the + one in the DEC/Compaq SRC Modula-3 runtime. I suspect this + was last used around 1994, and no doubt broke a long time ago. + It's there primarily incase someone wants to port to a similar + system. + + + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.rs6000 gcc-3.1/boehm-gc/doc/README.rs6000 *** gcc-3.0.4/boehm-gc/doc/README.rs6000 Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.rs6000 Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,9 ---- + We have so far failed to find a good way to determine the stack base. + It is highly recommended that GC_stackbottom be set explicitly on program + startup. The supplied value sometimes causes failure under AIX 4.1, though + it appears to work under 3.X. HEURISTIC2 seems to work under 4.1, but + involves a substantial performance penalty, and will fail if there is + no limit on stack size. + + There is no thread support. (I assume recent versions of AIX provide + pthreads? I no longer have access to a machine ...) diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.sgi gcc-3.1/boehm-gc/doc/README.sgi *** gcc-3.0.4/boehm-gc/doc/README.sgi Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.sgi Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,41 ---- + Performance of the incremental collector can be greatly enhanced with + -DNO_EXECUTE_PERMISSION. + + The collector should run with all of the -32, -n32 and -64 ABIs. Remember to + define the AS macro in the Makefile to be "as -64", or "as -n32". + + If you use -DREDIRECT_MALLOC=GC_malloc with C++ code, your code should make + at least one explicit call to malloc instead of new to ensure that the proper + version of malloc is linked in. + + Sproc threads are not supported in this version, though there may exist other + ports. + + Pthreads support is provided. This requires that: + + 1) You compile the collector with -DGC_IRIX_THREADS specified in the Makefile. + + 2) You have the latest pthreads patches installed. + + (Though the collector makes only documented pthread calls, + it relies on signal/threads interactions working just right in ways + that are not required by the standard. It is unlikely that this code + will run on other pthreads platforms. But please tell me if it does.) + + 3) Every file that makes thread calls should define IRIX_THREADS and then + include gc.h. Gc.h redefines some of the pthread primitives as macros which + also provide the collector with information it requires. + + 4) pthread_cond_wait and pthread_cond_timed_wait should be prepared for + premature wakeups. (I believe the pthreads and realted standards require this + anyway. Irix pthreads often terminate a wait if a signal arrives. + The garbage collector uses signals to stop threads.) + + 5) It is expensive to stop a thread waiting in IO at the time the request is + initiated. Applications with many such threads may not exhibit acceptable + performance with the collector. (Increasing the heap size may help.) + + 6) The collector should not be compiled with -DREDIRECT_MALLOC. This + confuses some library calls made by the pthreads implementation, which + expect the standard malloc. + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.solaris2 gcc-3.1/boehm-gc/doc/README.solaris2 *** gcc-3.0.4/boehm-gc/doc/README.solaris2 Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.solaris2 Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,62 ---- + The collector supports both incremental collection and threads under + Solaris 2. The incremental collector normally retrieves page dirty information + through the appropriate /proc calls. But it can also be configured + (by defining MPROTECT_VDB instead of PROC_VDB in gcconfig.h) to use mprotect + and signals. This may result in shorter pause times, but it is no longer + safe to issue arbitrary system calls that write to the heap. + + Under other UNIX versions, + the collector normally obtains memory through sbrk. There is some reason + to expect that this is not safe if the client program also calls the system + malloc, or especially realloc. The sbrk man page strongly suggests this is + not safe: "Many library routines use malloc() internally, so use brk() + and sbrk() only when you know that malloc() definitely will not be used by + any library routine." This doesn't make a lot of sense to me, since there + seems to be no documentation as to which routines can transitively call malloc. + Nonetheless, under Solaris2, the collector now (since 4.12) allocates + memory using mmap by default. (It defines USE_MMAP in gcconfig.h.) + You may want to reverse this decisions if you use -DREDIRECT_MALLOC=... + + + SOLARIS THREADS: + + The collector must be compiled with -DGC_SOLARIS_THREADS (thr_ functions) + or -DGC_SOLARIS_PTHREADS (pthread_ functions) to be thread safe. + It is also essential that gc.h be included in files that call thr_create, + thr_join, thr_suspend, thr_continue, or dlopen. Gc.h macro defines + these to also do GC bookkeeping, etc. Gc.h must be included with + one or both of these macros defined, otherwise + these replacements are not visible. + A collector built in this way way only be used by programs that are + linked with the threads library. + + In this mode, the collector contains various workarounds for older Solaris + bugs. Mostly, these should not be noticeable unless you look at system + call traces. However, it cannot protect a guard page at the end of + a thread stack. If you know that you will only be running Solaris2.5 + or later, it should be possible to fix this by compiling the collector + with -DSOLARIS23_MPROTECT_BUG_FIXED. + + Since 5.0 alpha5, dlopen disables collection temporarily, + unless USE_PROC_FOR_LIBRARIES is defined. In some unlikely cases, this + can result in unpleasant heap growth. But it seems better than the + race/deadlock issues we had before. + + If solaris_threads are used on an X86 processor with malloc redirected to + GC_malloc, it is necessary to call GC_thr_init explicitly before forking the + first thread. (This avoids a deadlock arising from calling GC_thr_init + with the allocation lock held.) + + It appears that there is a problem in using gc_cpp.h in conjunction with + Solaris threads and Sun's C++ runtime. Apparently the overloaded new operator + is invoked by some iostream initialization code before threads are correctly + initialized. As a result, call to thr_self() in garbage collector + initialization segfaults. Currently the only known workaround is to not + invoke the garbage collector from a user defined global operator new, or to + have it invoke the garbage-collector's allocators only after main has started. + (Note that the latter requires a moderately expensive test in operator + delete.) + + Hans-J. Boehm + (The above contains my personal opinions, which are probably not shared + by anyone else.) diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.uts gcc-3.1/boehm-gc/doc/README.uts *** gcc-3.0.4/boehm-gc/doc/README.uts Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.uts Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,2 ---- + Alistair Crooks supplied the port. He used Lexa C version 2.1.3 with + -Xa to compile. diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/README.win32 gcc-3.1/boehm-gc/doc/README.win32 *** gcc-3.0.4/boehm-gc/doc/README.win32 Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/README.win32 Tue Feb 12 04:37:55 2002 *************** *** 0 **** --- 1,156 ---- + The collector has at various times been compiled under Windows 95 & NT, + with the original Microsoft SDK, with Visual C++ 2.0, 4.0, and 6, with + the GNU win32 environment, with Borland 4.5, with Watcom C, and recently + with the Digital Mars compiler. It is likely that some of these have been + broken in the meantime. Patches are appreciated. + + It runs under both win32s and win32, but with different semantics. + Under win32, all writable pages outside of the heaps and stack are + scanned for roots. Thus the collector sees pointers in DLL data + segments. Under win32s, only the main data segment is scanned. + (The main data segment should always be scanned. Under some + versions of win32s, other regions may also be scanned.) + Thus all accessible objects should be accessible from local variables + or variables in the main data segment. Alternatively, other data + segments (e.g. in DLLs) may be registered with the collector by + calling GC_init() and then GC_register_root_section(a), where + a is the address of some variable inside the data segment. (Duplicate + registrations are ignored, but not terribly quickly.) + + (There are two reasons for this. We didn't want to see many 16:16 + pointers. And the VirtualQuery call has different semantics under + the two systems, and under different versions of win32s.) + + The collector test program "gctest" is linked as a GUI application, + but does not open any windows. Its output appears in the file + "gc.log". It may be started from the file manager. The hour glass + cursor may appear as long as it's running. If it is started from the + command line, it will usually run in the background. Wait a few + minutes (a few seconds on a modern machine) before you check the output. + You should see either a failure indication or a "Collector appears to + work" message. + + The cord test program has not been ported (but should port + easily). A toy editor (cord/de.exe) based on cords (heavyweight + strings represented as trees) has been ported and is included. + It runs fine under either win32 or win32S. It serves as an example + of a true Windows application, except that it was written by a + nonexpert Windows programmer. (There are some peculiarities + in the way files are displayed. The is displayed explicitly + for standard DOS text files. As in the UNIX version, control + characters are displayed explicitly, but in this case as red text. + This may be suboptimal for some tastes and/or sets of default + window colors.) + + In general -DREDIRECT_MALLOC is unlikely to work unless the + application is completely statically linked. + + The collector normally allocates memory from the OS with VirtualAlloc. + This appears to cause problems under Windows NT and Windows 2000 (but + not Windows 95/98) if the memory is later passed to CreateDIBitmap. + To work around this problem, build the collector with -DUSE_GLOBAL_ALLOC. + This is currently incompatible with -DUSE_MUNMAP. (Thanks to Jonathan + Clark for tracking this down.) + + For Microsoft development tools, rename NT_MAKEFILE as + MAKEFILE. (Make sure that the CPU environment variable is defined + to be i386.) In order to use the gc_cpp.h C++ interface, all + client code should include gc_cpp.h. + + Clients may need to define GC_NOT_DLL before including gc.h, if the + collector was built as a static library (as it normally is in the + absence of thread support). + + For GNU-win32, use the regular makefile, possibly after uncommenting + the line "include Makefile.DLLs". The latter should be necessary only + if you want to package the collector as a DLL. The GNU-win32 port is + believed to work only for b18, not b19, probably dues to linker changes + in b19. This is probably fixable with a different definition of + DATASTART and DATAEND in gcconfig.h. + + For Borland tools, use BCC_MAKEFILE. Note that + Borland's compiler defaults to 1 byte alignment in structures (-a1), + whereas Visual C++ appears to default to 8 byte alignment (/Zp8). + The garbage collector in its default configuration EXPECTS AT + LEAST 4 BYTE ALIGNMENT. Thus the BORLAND DEFAULT MUST + BE OVERRIDDEN. (In my opinion, it should usually be anyway. + I expect that -a1 introduces major performance penalties on a + 486 or Pentium.) Note that this changes structure layouts. (As a last + resort, gcconfig.h can be changed to allow 1 byte alignment. But + this has significant negative performance implications.) + The Makefile is set up to assume Borland 4.5. If you have another + version, change the line near the top. By default, it does not + require the assembler. If you do have the assembler, I recommend + removing the -DUSE_GENERIC. + + There is some support for incremental collection. This is + currently pretty simple-minded. Pages are protected. Protection + faults are caught by a handler installed at the bottom of the handler + stack. This is both slow and interacts poorly with a debugger. + Whenever possible, I recommend adding a call to + GC_enable_incremental at the last possible moment, after most + debugging is complete. Unlike the UNIX versions, no system + calls are wrapped by the collector itself. It may be necessary + to wrap ReadFile calls that use a buffer in the heap, so that the + call does not encounter a protection fault while it's running. + (As usual, none of this is an issue unless GC_enable_incremental + is called.) + + Note that incremental collection is disabled with -DSMALL_CONFIG. + + James Clark has contributed the necessary code to support win32 threads. + Use NT_THREADS_MAKEFILE (a.k.a gc.mak) instead of NT_MAKEFILE + to build this version. Note that this requires some files whose names + are more than 8 + 3 characters long. Thus you should unpack the tar file + so that long file names are preserved. To build the garbage collector + test with VC++ from the command line, use + + nmake /F ".\gc.mak" CFG="gctest - Win32 Release" + + This requires that the subdirectory gctest\Release exist. + The test program and DLL will reside in the Release directory. + + This version relies on the collector residing in a dll. + + This version currently supports incremental collection only if it is + enabled before any additional threads are created. + Version 4.13 attempts to fix some of the earlier problems, but there + may be other issues. If you need solid support for win32 threads, you + might check with Geodesic Systems. Their collector must be licensed, + but they have invested far more time in win32-specific issues. + + Hans + + Ivan V. Demakov's README for the Watcom port: + + The collector has been compiled with Watcom C 10.6 and 11.0. + It runs under win32, win32s, and even under msdos with dos4gw + dos-extender. It should also run under OS/2, though this isn't + tested. Under win32 the collector can be built either as dll + or as static library. + + Note that all compilations were done under Windows 95 or NT. + For unknown reason compiling under Windows 3.11 for NT (one + attempt has been made) leads to broken executables. + + Incremental collection is not supported. + + cord is not ported. + + Before compiling you may need to edit WCC_MAKEFILE to set target + platform, library type (dynamic or static), calling conventions, and + optimization options. + + To compile the collector and testing programs use the command: + wmake -f WCC_MAKEFILE + + All programs using gc should be compiled with 4-byte alignment. + For further explanations on this see comments about Borland. + + If gc compiled as dll, the macro ``GC_DLL'' should be defined before + including "gc.h" (for example, with -DGC_DLL compiler option). It's + important, otherwise resulting programs will not run. + + Ivan Demakov (email: ivan@tgrad.nsk.su) + + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/barrett_diagram gcc-3.1/boehm-gc/doc/barrett_diagram *** gcc-3.0.4/boehm-gc/doc/barrett_diagram Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/barrett_diagram Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,106 ---- + This is an ASCII diagram of the data structure used to check pointer + validity. It was provided by Dave Barrett , + and should be of use to others attempting to understand the code. + The data structure in GC4.X is essentially the same. -HB + + + + + Data Structure used by GC_base in gc3.7: + 21-Apr-94 + + + + + 63 LOG_TOP_SZ[11] LOG_BOTTOM_SZ[10] LOG_HBLKSIZE[13] + +------------------+----------------+------------------+------------------+ + p:| | TL_HASH(hi) | | HBLKDISPL(p) | + +------------------+----------------+------------------+------------------+ + \-----------------------HBLKPTR(p)-------------------/ + \------------hi-------------------/ + \______ ________/ \________ _______/ \________ _______/ + V V V + | | | + GC_top_index[] | | | + --- +--------------+ | | | + ^ | | | | | + | | | | | | + TOP +--------------+<--+ | | + _SZ +-<| [] | * | | + (items)| +--------------+ if 0 < bi< HBLKSIZE | | + | | | | then large object | | + | | | | starts at the bi'th | | + v | | | HBLK before p. | i | + --- | +--------------+ | (word- | + v | aligned) | + bi= |GET_BI(p){->hash_link}->key==hi | | + v | | + | (bottom_index) \ scratch_alloc'd | | + | ( struct bi ) / by get_index() | | + --- +->+--------------+ | | + ^ | | | | + ^ | | | | + BOTTOM | | ha=GET_HDR_ADDR(p) | | + _SZ(items)+--------------+<----------------------+ +-------+ + | +--<| index[] | | + | | +--------------+ GC_obj_map: v + | | | | from / +-+-+-----+-+-+-+-+ --- + v | | | GC_add < 0| | | | | | | | ^ + --- | +--------------+ _map_entry \ +-+-+-----+-+-+-+-+ | + | | asc_link | +-+-+-----+-+-+-+-+ MAXOBJSZ + | +--------------+ +-->| | | j | | | | | +1 + | | key | | +-+-+-----+-+-+-+-+ | + | +--------------+ | +-+-+-----+-+-+-+-+ | + | | hash_link | | | | | | | | | | v + | +--------------+ | +-+-+-----+-+-+-+-+ --- + | | |<--MAX_OFFSET--->| + | | (bytes) + HDR(p)| GC_find_header(p) | |<--MAP_ENTRIES-->| + | \ from | =HBLKSIZE/WORDSZ + | (hdr) (struct hblkhdr) / alloc_hdr() | (1024 on Alpha) + +-->+----------------------+ | (8/16 bits each) + GET_HDR(p)| word hb_sz (words) | | + +----------------------+ | + | struct hblk *hb_next | | + +----------------------+ | + |mark_proc hb_mark_proc| | + +----------------------+ | + | char * hb_map |>-------------+ + +----------------------+ + | ushort hb_obj_kind | + +----------------------+ + | hb_last_reclaimed | + --- +----------------------+ + ^ | | + MARK_BITS| hb_marks[] | *if hdr is free, hb_sz + DISCARD_WORDS + _SZ(words)| | is the size of a heap chunk (struct hblk) + v | | of at least MININCR*HBLKSIZE bytes (below), + --- +----------------------+ otherwise, size of each object in chunk. + + Dynamic data structures above are interleaved throughout the heap in blocks of + size MININCR * HBLKSIZE bytes as done by gc_scratch_alloc which cannot be + freed; free lists are used (e.g. alloc_hdr). HBLKs's below are collected. + + (struct hblk) + --- +----------------------+ < HBLKSIZE --- --- DISCARD_ + ^ |garbage[DISCARD_WORDS]| aligned ^ ^ HDR_BYTES WORDS + | | | | v (bytes) (words) + | +-----hb_body----------+ < WORDSZ | --- --- + | | | aligned | ^ ^ + | | Object 0 | | hb_sz | + | | | i |(word- (words)| + | | | (bytes)|aligned) v | + | + - - - - - - - - - - -+ --- | --- | + | | | ^ | ^ | + n * | | j (words) | hb_sz BODY_SZ + HBLKSIZE | Object 1 | v v | (words) + (bytes) | |--------------- v MAX_OFFSET + | + - - - - - - - - - - -+ --- (bytes) + | | | !All_INTERIOR_PTRS ^ | + | | | sets j only for hb_sz | + | | Object N | valid object offsets. | | + v | | All objects WORDSZ v v + --- +----------------------+ aligned. --- --- + + DISCARD_WORDS is normally zero. Indeed the collector has not been tested + with another value in ages. diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/debugging.html gcc-3.1/boehm-gc/doc/debugging.html *** gcc-3.0.4/boehm-gc/doc/debugging.html Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/debugging.html Tue Feb 12 04:37:55 2002 *************** *** 0 **** --- 1,291 ---- + + + Debugging Garbage Collector Related Problems + + +

Debugging Garbage Collector Related Problems

+ This page contains some hints on + debugging issues specific to + the Boehm-Demers-Weiser conservative garbage collector. + It applies both to debugging issues in client code that manifest themselves + as collector misbehavior, and to debugging the collector itself. +

+ If you suspect a bug in the collector itself, it is strongly recommended + that you try the latest collector release, even if it is labelled as "alpha", + before proceeding. +

Bus Errors and Segmentation Violations

+

+ If the fault occurred in GC_find_limit, or with incremental collection enabled, + this is probably normal. The collector installs handlers to take care of + these. You will not see these unless you are using a debugger. + Your debugger should allow you to continue. + It's often preferable to tell the debugger to ignore SIGBUS and SIGSEGV + ("handle SIGSEGV SIGBUS nostop noprint" in gdb, + "ignore SIGSEGV SIGBUS" in most versions of dbx) + and set a breakpoint in abort. + The collector will call abort if the signal had another cause, + and there was not other handler previously installed. +

+ We recommend debugging without incremental collection if possible. + (This applies directly to UNIX systems. + Debugging with incremental collection under win32 is worse. See README.win32.) +

+ If the application generates an unhandled SIGSEGV or equivalent, it may + often be easiest to set the environment variable GC_LOOP_ON_ABORT. On many + platforms, this will cause the collector to loop in a handler when the + SIGSEGV is encountered (or when the collector aborts for some other reason), + and a debugger can then be attached to the looping + process. This sidesteps common operating system problems related + to incomplete core files for multithreaded applications, etc. +

Other Signals

+ On most platforms, the multithreaded version of the collector needs one or + two other signals for internal use by the collector in stopping threads. + It is normally wise to tell the debugger to ignore these. On Linux, + the collector currently uses SIGPWR and SIGXCPU by default. +

Warning Messages About Needing to Allocate Blacklisted Blocks

+ The garbage collector generates warning messages of the form +
+ Needed to allocate blacklisted block at 0x...
+ 
+ when it needs to allocate a block at a location that it knows to be + referenced by a false pointer. These false pointers can be either permanent + (e.g. a static integer variable that never changes) or temporary. + In the latter case, the warning is largely spurious, and the block will + eventually be reclaimed normally. + In the former case, the program will still run correctly, but the block + will never be reclaimed. Unless the block is intended to be + permanent, the warning indicates a memory leak. +
    +
  1. Ignore these warnings while you are using GC_DEBUG. Some of the routines + mentioned below don't have debugging equivalents. (Alternatively, write + the missing routines and send them to me.) +
  2. Replace allocator calls that request large blocks with calls to + GC_malloc_ignore_off_page or + GC_malloc_atomic_ignore_off_page. You may want to set a + breakpoint in GC_default_warn_proc to help you identify such calls. + Make sure that a pointer to somewhere near the beginning of the resulting block + is maintained in a (preferably volatile) variable as long as + the block is needed. +
  3. + If the large blocks are allocated with realloc, we suggest instead allocating + them with something like the following. Note that the realloc size increment + should be fairly large (e.g. a factor of 3/2) for this to exhibit reasonable + performance. But we all know we should do that anyway. +
    + void * big_realloc(void *p, size_t new_size)
    + {
    +     size_t old_size = GC_size(p);
    +     void * result;
    +  
    +     if (new_size <= 10000) return(GC_realloc(p, new_size));
    +     if (new_size <= old_size) return(p);
    +     result = GC_malloc_ignore_off_page(new_size);
    +     if (result == 0) return(0);
    +     memcpy(result,p,old_size);
    +     GC_free(p);
    +     return(result);
    + }
    + 
    + +
  4. In the unlikely case that even relatively small object + (<20KB) allocations are triggering these warnings, then your address + space contains lots of "bogus pointers", i.e. values that appear to + be pointers but aren't. Usually this can be solved by using GC_malloc_atomic + or the routines in gc_typed.h to allocate large pointer-free regions of bitmaps, etc. Sometimes the problem can be solved with trivial changes of encoding + in certain values. It is possible, to identify the source of the bogus + pointers by building the collector with -DPRINT_BLACK_LIST, + which will cause it to print the "bogus pointers", along with their location. + +
  5. If you get only a fixed number of these warnings, you are probably only + introducing a bounded leak by ignoring them. If the data structures being + allocated are intended to be permanent, then it is also safe to ignore them. + The warnings can be turned off by calling GC_set_warn_proc with a procedure + that ignores these warnings (e.g. by doing absolutely nothing). +
+ +

The Collector References a Bad Address in GC_malloc

+ + This typically happens while the collector is trying to remove an entry from + its free list, and the free list pointer is bad because the free list link + in the last allocated object was bad. +

+ With > 99% probability, you wrote past the end of an allocated object. + Try setting GC_DEBUG before including gc.h and + allocating with GC_MALLOC. This will try to detect such + overwrite errors. + +

Unexpectedly Large Heap

+ + Unexpected heap growth can be due to one of the following: +
    +
  1. Data structures that are being unintentionally retained. This + is commonly caused by data structures that are no longer being used, + but were not cleared, or by caches growing without bounds. +
  2. Pointer misidentification. The garbage collector is interpreting + integers or other data as pointers and retaining the "referenced" + objects. +
  3. Heap fragmentation. This should never result in unbounded growth, + but it may account for larger heaps. This is most commonly caused + by allocation of large objects. On some platforms it can be reduced + by building with -DUSE_MUNMAP, which will cause the collector to unmap + memory corresponding to pages that have not been recently used. +
  4. Per object overhead. This is usually a relatively minor effect, but + it may be worth considering. If the collector recognizes interior + pointers, object sizes are increased, so that one-past-the-end pointers + are correctly recognized. The collector can be configured not to do this + (-DDONT_ADD_BYTE_AT_END). +

    + The collector rounds up object sizes so the result fits well into the + chunk size (HBLKSIZE, normally 4K on 32 bit machines, 8K + on 64 bit machines) used by the collector. Thus it may be worth avoiding + objects of size 2K + 1 (or 2K if a byte is being added at the end.) +

+ The last two cases can often be identified by looking at the output + of a call to GC_dump(). Among other things, it will print the + list of free heap blocks, and a very brief description of all chunks in + the heap, the object sizes they correspond to, and how many live objects + were found in the chunk at the last collection. +

+ Growing data structures can usually be identified by +

    +
  1. Building the collector with -DKEEP_BACK_PTRS, +
  2. Preferably using debugging allocation (defining GC_DEBUG + before including gc.h and allocating with GC_MALLOC), + so that objects will be identified by their allocation site, +
  3. Running the application long enough so + that most of the heap is composed of "leaked" memory, and +
  4. Then calling GC_generate_random_backtrace() from backptr.h + a few times to determine why some randomly sampled objects in the heap are + being retained. +
+

+ The same technique can often be used to identify problems with false + pointers, by noting whether the reference chains printed by + GC_generate_random_backtrace() involve any misidentified pointers. + An alternate technique is to build the collector with + -DPRINT_BLACK_LIST which will cause it to report values that + are almost, but not quite, look like heap pointers. It is very likely that + actual false pointers will come from similar sources. +

+ In the unlikely case that false pointers are an issue, it can usually + be resolved using one or more of the following techniques: +

    +
  1. Use GC_malloc_atomic for objects containing no pointers. + This is especially important for large arrays containing compressed data, + pseudo-random numbers, and the like. It is also likely to improve GC + performance, perhaps drastically so if the application is paging. +
  2. If you allocate large objects containing only + one or two pointers at the beginning, either try the typed allocation + primitives is gc_typed.h, or separate out the pointerfree component. +
  3. Consider using GC_malloc_ignore_off_page() + to allocate large objects. (See gc.h and above for details. + Large means > 100K in most environments.) +
+

Prematurely Reclaimed Objects

+ The usual symptom of this is a segmentation fault, or an obviously overwritten + value in a heap object. This should, of course, be impossible. In practice, + it may happen for reasons like the following: +
    +
  1. The collector did not intercept the creation of threads correctly in + a multithreaded application, e.g. because the client called + pthread_create without including gc.h, which redefines it. +
  2. The last pointer to an object in the garbage collected heap was stored + somewhere were the collector couldn't see it, e.g. in an + object allocated with system malloc, in certain types of + mmaped files, + or in some data structure visible only to the OS. (On some platforms, + thread-local storage is one of these.) +
  3. The last pointer to an object was somehow disguised, e.g. by + XORing it with another pointer. +
  4. Incorrect use of GC_malloc_atomic or typed allocation. +
  5. An incorrect GC_free call. +
  6. The client program overwrote an internal garbage collector data structure. +
  7. A garbage collector bug. +
  8. (Empirically less likely than any of the above.) A compiler optimization + that disguised the last pointer. +
+ The following relatively simple techniques should be tried first to narrow + down the problem: +
    +
  1. If you are using the incremental collector try turning it off for + debugging. +
  2. If you are using shared libraries, try linking statically. If that works, + ensure that DYNAMIC_LOADING is defined on your platform. +
  3. Try to reproduce the problem with fully debuggable unoptimized code. + This will eliminate the last possibility, as well as making debugging easier. +
  4. Try replacing any suspect typed allocation and GC_malloc_atomic + calls with calls to GC_malloc. +
  5. Try removing any GC_free calls (e.g. with a suitable + #define). +
  6. Rebuild the collector with -DGC_ASSERTIONS. +
  7. If the following works on your platform (i.e. if gctest still works + if you do this), try building the collector with + -DREDIRECT_MALLOC=GC_malloc_uncollectable. This will cause + the collector to scan memory allocated with malloc. +
+ If all else fails, you will have to attack this with a debugger. + Suggested steps: +
    +
  1. Call GC_dump() from the debugger around the time of the failure. Verify + that the collectors idea of the root set (i.e. static data regions which + it should scan for pointers) looks plausible. If not, i.e. if it doesn't + include some static variables, report this as + a collector bug. Be sure to describe your platform precisely, since this sort + of problem is nearly always very platform dependent. +
  2. Especially if the failure is not deterministic, try to isolate it to + a relatively small test case. +
  3. Set a break point in GC_finish_collection. This is a good + point to examine what has been marked, i.e. found reachable, by the + collector. +
  4. If the failure is deterministic, run the process + up to the last collection before the failure. + Note that the variable GC_gc_no counts collections and can be used + to set a conditional breakpoint in the right one. It is incremented just + before the call to GC_finish_collection. + If object p was prematurely recycled, it may be helpful to + look at *GC_find_header(p) at the failure point. + The hb_last_reclaimed field will identify the collection number + during which its block was last swept. +
  5. Verify that the offending object still has its correct contents at + this point. + The call GC_is_marked(p) from the debugger to verify that the + object has not been marked, and is about to be reclaimed. +
  6. Determine a path from a root, i.e. static variable, stack, or + register variable, + to the reclaimed object. Call GC_is_marked(q) for each object + q along the path, trying to locate the first unmarked object, say + r. +
  7. If r is pointed to by a static root, + verify that the location + pointing to it is part of the root set printed by GC_dump(). If it + is on the stack in the main (or only) thread, verify that + GC_stackbottom is set correctly to the base of the stack. If it is + in another thread stack, check the collector's thread data structure + (GC_thread[] on several platforms) to make sure that stack bounds + are set correctly. +
  8. If r is pointed to by heap object s, check that the + collector's layout description for s is such that the pointer field + will be scanned. Call *GC_find_header(s) to look at the descriptor + for the heap chunk. The hb_descr field specifies the layout + of objects in that chunk. See gc_mark.h for the meaning of the descriptor. + (If it's low order 2 bits are zero, then it is just the length of the + object prefix to be scanned. This form is always used for objects allocated + with GC_malloc or GC_malloc_atomic.) +
  9. If the failure is not deterministic, you may still be able to apply some + of the above technique at the point of failure. But remember that objects + allocated since the last collection will not have been marked, even if the + collector is functioning properly. On some platforms, the collector + can be configured to save call chains in objects for debugging. + Enabling this feature will also cause it to save the call stack at the + point of the last GC in GC_arrays._last_stack. +
  10. When looking at GC internal data structures remember that a number + of GC_xxx variables are really macro defined to + GC_arrays._xxx, so that + the collector can avoid scanning them. +
+ + + + + + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/gc.man gcc-3.1/boehm-gc/doc/gc.man *** gcc-3.0.4/boehm-gc/doc/gc.man Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/gc.man Fri Aug 17 18:30:49 2001 *************** *** 0 **** --- 1,80 ---- + .TH GC_MALLOC 1L "12 February 1996" + .SH NAME + GC_malloc, GC_malloc_atomic, GC_free, GC_realloc, GC_enable_incremental, GC_register_finalizer, GC_malloc_ignore_off_page, GC_malloc_atomic_ignore_off_page, GC_set_warn_proc \- Garbage collecting malloc replacement + .SH SYNOPSIS + #include "gc.h" + .br + # define malloc(n) GC_malloc(n) + .br + ... malloc(...) ... + .br + .sp + cc ... gc.a + .LP + .SH DESCRIPTION + .I GC_malloc + and + .I GC_free + are plug-in replacements for standard malloc and free. However, + .I + GC_malloc + will attempt to reclaim inaccessible space automatically by invoking a conservative garbage collector at appropriate points. The collector traverses all data structures accessible by following pointers from the machines registers, stack(s), data, and bss segments. Inaccessible structures will be reclaimed. A machine word is considered to be a valid pointer if it is an address inside an object allocated by + .I + GC_malloc + or friends. + .LP + See the documentation in the include file gc_cpp.h for an alternate, C++ specific interface to the garbage collector. + .LP + Unlike the standard implementations of malloc, + .I + GC_malloc + clears the newly allocated storage. + .I + GC_malloc_atomic + does not. Furthermore, it informs the collector that the resulting object will never contain any pointers, and should therefore not be scanned by the collector. + .LP + .I + GC_free + can be used to deallocate objects, but its use is optional, and generally discouraged. + .I + GC_realloc + has the standard realloc semantics. It preserves pointer-free-ness. + .I + GC_register_finalizer + allows for registration of functions that are invoked when an object becomes inaccessible. + .LP + The garbage collector tries to avoid allocating memory at locations that already appear to be referenced before allocation. (Such apparent ``pointers'' are usually large integers and the like that just happen to look like an address.) This may make it hard to allocate very large objects. An attempt to do so may generate a warning. + .LP + .I + GC_malloc_ignore_off_page + and + .I + GC_malloc_atomic_ignore_off_page + inform the collector that the client code will always maintain a pointer to near the beginning of the object (within the first 512 bytes), and that pointers beyond that can be ignored by the collector. This makes it much easier for the collector to place large objects. These are recommended for large object allocation. (Objects expected to be larger than about 100KBytes should be allocated this way.) + .LP + It is also possible to use the collector to find storage leaks in programs destined to be run with standard malloc/free. The collector can be compiled for thread-safe operation. Unlike standard malloc, it is safe to call malloc after a previous malloc call was interrupted by a signal, provided the original malloc call is not resumed. + .LP + The collector may, on rare occasion produce warning messages. On UNIX machines these appear on stderr. Warning messages can be filtered, redirected, or ignored with + .I + GC_set_warn_proc. + This is recommended for production code. See gc.h for details. + .LP + Debugging versions of many of the above routines are provided as macros. Their names are identical to the above, but consist of all capital letters. If GC_DEBUG is defined before gc.h is included, these routines do additional checking, and allow the leak detecting version of the collector to produce slightly more useful output. Without GC_DEBUG defined, they behave exactly like the lower-case versions. + .LP + On some machines, collection will be performed incrementally after a call to + .I + GC_enable_incremental. + This may temporarily write protect pages in the heap. See the README file for more information on how this interacts with system calls that write to the heap. + .LP + Other facilities not discussed here include limited facilities to support incremental collection on machines without appropriate VM support, provisions for providing more explicit object layout information to the garbage collector, more direct support for ``weak'' pointers, support for ``abortable'' garbage collections during idle time, etc. + .LP + .SH "SEE ALSO" + The README and gc.h files in the distribution. More detailed definitions of the functions exported by the collector are given there. (The above list is not complete.) + .LP + Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment", + \fISoftware Practice & Experience\fP, September 1988, pp. 807-820. + .LP + The malloc(3) man page. + .LP + .SH AUTHOR + Hans-J. Boehm (boehm@parc.xerox.com). Some of the code was written by others, most notably Alan Demers. diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/gcdescr.html gcc-3.1/boehm-gc/doc/gcdescr.html *** gcc-3.0.4/boehm-gc/doc/gcdescr.html Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/gcdescr.html Fri Aug 17 18:39:18 2001 *************** *** 0 **** --- 1,438 ---- + + + Conservative GC Algorithmic Overview + Hans-J. Boehm, Silicon Graphics + + +

This is under construction

+

Conservative GC Algorithmic Overview

+

+ This is a description of the algorithms and data structures used in our + conservative garbage collector. I expect the level of detail to increase + with time. For a survey of GC algorithms, see for example + Paul Wilson's + excellent paper. For an overview of the collector interface, + see here. +

+ This description is targeted primarily at someone trying to understand the + source code. It specifically refers to variable and function names. + It may also be useful for understanding the algorithms at a higher level. +

+ The description here assumes that the collector is used in default mode. + In particular, we assume that it used as a garbage collector, and not just + a leak detector. We initially assume that it is used in stop-the-world, + non-incremental mode, though the presence of the incremental collector + will be apparent in the design. + We assume the default finalization model, but the code affected by that + is very localized. +

Introduction

+ The garbage collector uses a modified mark-sweep algorithm. Conceptually + it operates roughly in four phases: + +
    + +
  1. + Preparation Clear all mark bits, indicating that all objects + are potentially unreachable. + +
  2. + Mark phase Marks all objects that can be reachable via chains of + pointers from variables. Normally the collector has no real information + about the location of pointer variables in the heap, so it + views all static data areas, stacks and registers as potentially containing + containing pointers. Any bit patterns that represent addresses inside + heap objects managed by the collector are viewed as pointers. + Unless the client program has made heap object layout information + available to the collector, any heap objects found to be reachable from + variables are again scanned similarly. + +
  3. + Sweep phase Scans the heap for inaccessible, and hence unmarked, + objects, and returns them to an appropriate free list for reuse. This is + not really a separate phase; even in non incremental mode this is operation + is usually performed on demand during an allocation that discovers an empty + free list. Thus the sweep phase is very unlikely to touch a page that + would not have been touched shortly thereafter anyway. + +
  4. + Finalization phase Unreachable objects which had been registered + for finalization are enqueued for finalization outside the collector. + +
+ +

+ The remaining sections describe the memory allocation data structures, + and then the last 3 collection phases in more detail. We conclude by + outlining some of the additional features implemented in the collector. + +

Allocation

+ The collector includes its own memory allocator. The allocator obtains + memory from the system in a platform-dependent way. Under UNIX, it + uses either malloc, sbrk, or mmap. +

+ Most static data used by the allocator, as well as that needed by the + rest of the garbage collector is stored inside the + _GC_arrays structure. + This allows the garbage collector to easily ignore the collectors own + data structures when it searches for root pointers. Other allocator + and collector internal data structures are allocated dynamically + with GC_scratch_alloc. GC_scratch_alloc does not + allow for deallocation, and is therefore used only for permanent data + structures. +

+ The allocator allocates objects of different kinds. + Different kinds are handled somewhat differently by certain parts + of the garbage collector. Certain kinds are scanned for pointers, + others are not. Some may have per-object type descriptors that + determine pointer locations. Or a specific kind may correspond + to one specific object layout. Two built-in kinds are uncollectable. + One (STUBBORN) is immutable without special precautions. + In spite of that, it is very likely that most applications currently + use at most two kinds: NORMAL and PTRFREE objects. +

+ The collector uses a two level allocator. A large block is defined to + be one larger than half of HBLKSIZE, which is a power of 2, + typically on the order of the page size. +

+ Large block sizes are rounded up to + the next multiple of HBLKSIZE and then allocated by + GC_allochblk. This uses roughly what Paul Wilson has termed + a "next fit" algorithm, i.e. first-fit with a rotating pointer. + The implementation does check for a better fitting immediately + adjacent block, which gives it somewhat better fragmentation characteristics. + I'm now convinced it should use a best fit algorithm. The actual + implementation of GC_allochblk + is significantly complicated by black-listing issues + (see below). +

+ Small blocks are allocated in blocks of size HBLKSIZE. + Each block is + dedicated to only one object size and kind. The allocator maintains + separate free lists for each size and kind of object. +

+ In order to avoid allocating blocks for too many distinct object sizes, + the collector normally does not directly allocate objects of every possible + request size. Instead request are rounded up to one of a smaller number + of allocated sizes, for which free lists are maintained. The exact + allocated sizes are computed on demand, but subject to the constraint + that they increase roughly in geometric progression. Thus objects + requested early in the execution are likely to be allocated with exactly + the requested size, subject to alignment constraints. + See GC_init_size_map for details. +

+ The actual size rounding operation during small object allocation is + implemented as a table lookup in GC_size_map. +

+ Both collector initialization and computation of allocated sizes are + handled carefully so that they do not slow down the small object fast + allocation path. An attempt to allocate before the collector is initialized, + or before the appropriate GC_size_map entry is computed, + will take the same path as an allocation attempt with an empty free list. + This results in a call to the slow path code (GC_generic_malloc_inner) + which performs the appropriate initialization checks. +

+ In non-incremental mode, we make a decision about whether to garbage collect + whenever an allocation would otherwise have failed with the current heap size. + If the total amount of allocation since the last collection is less than + the heap size divided by GC_free_space_divisor, we try to + expand the heap. Otherwise, we initiate a garbage collection. This ensures + that the amount of garbage collection work per allocated byte remains + constant. +

+ The above is in fat an oversimplification of the real heap expansion + heuristic, which adjusts slightly for root size and certain kinds of + fragmentation. In particular, programs with a large root set size and + little live heap memory will expand the heap to amortize the cost of + scanning the roots. +

+ Versions 5.x of the collector actually collect more frequently in + nonincremental mode. The large block allocator usually refuses to split + large heap blocks once the garbage collection threshold is + reached. This often has the effect of collecting well before the + heap fills up, thus reducing fragmentation and working set size at the + expense of GC time. 6.x will chose an intermediate strategy depending + on how much large object allocation has taken place in the past. + (If the collector is configured to unmap unused pages, versions 6.x + will use the 5.x strategy.) +

+ (It has been suggested that this should be adjusted so that we favor + expansion if the resulting heap still fits into physical memory. + In many cases, that would no doubt help. But it is tricky to do this + in a way that remains robust if multiple application are contending + for a single pool of physical memory.) + +

Mark phase

+ + The marker maintains an explicit stack of memory regions that are known + to be accessible, but that have not yet been searched for contained pointers. + Each stack entry contains the starting address of the block to be scanned, + as well as a descriptor of the block. If no layout information is + available for the block, then the descriptor is simply a length. + (For other possibilities, see gc_mark.h.) +

+ At the beginning of the mark phase, all root segments are pushed on the + stack by GC_push_roots. If ALL_INTERIOR_PTRS is not + defined, then stack roots require special treatment. In this case, the + normal marking code ignores interior pointers, but GC_push_all_stack + explicitly checks for interior pointers and pushes descriptors for target + objects. +

+ The marker is structured to allow incremental marking. + Each call to GC_mark_some performs a small amount of + work towards marking the heap. + It maintains + explicit state in the form of GC_mark_state, which + identifies a particular sub-phase. Some other pieces of state, most + notably the mark stack, identify how much work remains to be done + in each sub-phase. The normal progression of mark states for + a stop-the-world collection is: +

    +
  1. MS_INVALID indicating that there may be accessible unmarked + objects. In this case GC_objects_are_marked will simultaneously + be false, so the mark state is advanced to +
  2. MS_PUSH_UNCOLLECTABLE indicating that it suffices to push + uncollectable objects, roots, and then mark everything reachable from them. + Scan_ptr is advanced through the heap until all uncollectable + objects are pushed, and objects reachable from them are marked. + At that point, the next call to GC_mark_some calls + GC_push_roots to push the roots. It the advances the + mark state to +
  3. MS_ROOTS_PUSHED asserting that once the mark stack is + empty, all reachable objects are marked. Once in this state, we work + only on emptying the mark stack. Once this is completed, the state + changes to +
  4. MS_NONE indicating that reachable objects are marked. +
+ + The core mark routine GC_mark_from_mark_stack, is called + repeatedly by several of the sub-phases when the mark stack starts to fill + up. It is also called repeatedly in MS_ROOTS_PUSHED state + to empty the mark stack. + The routine is designed to only perform a limited amount of marking at + each call, so that it can also be used by the incremental collector. + It is fairly carefully tuned, since it usually consumes a large majority + of the garbage collection time. +

+ The marker correctly handles mark stack overflows. Whenever the mark stack + overflows, the mark state is reset to MS_INVALID. + Since there are already marked objects in the heap, + this eventually forces a complete + scan of the heap, searching for pointers, during which any unmarked objects + referenced by marked objects are again pushed on the mark stack. This + process is repeated until the mark phase completes without a stack overflow. + Each time the stack overflows, an attempt is made to grow the mark stack. + All pieces of the collector that push regions onto the mark stack have to be + careful to ensure forward progress, even in case of repeated mark stack + overflows. Every mark attempt results in additional marked objects. +

+ Each mark stack entry is processed by examining all candidate pointers + in the range described by the entry. If the region has no associated + type information, then this typically requires that each 4-byte aligned + quantity (8-byte aligned with 64-bit pointers) be considered a candidate + pointer. +

+ We determine whether a candidate pointer is actually the address of + a heap block. This is done in the following steps: + +

  • The candidate pointer is checked against rough heap bounds. + These heap bounds are maintained such that all actual heap objects + fall between them. In order to facilitate black-listing (see below) + we also include address regions that the heap is likely to expand into. + Most non-pointers fail this initial test. +
  • The candidate pointer is divided into two pieces; the most significant + bits identify a HBLKSIZE-sized page in the address space, and + the least significant bits specify an offset within that page. + (A hardware page may actually consist of multiple such pages. + HBLKSIZE is usually the page size divided by a small power of two.) +
  • + The page address part of the candidate pointer is looked up in a + table. + Each table entry contains either 0, indicating that the page is not part + of the garbage collected heap, a small integer n, indicating + that the page is part of large object, starting at least n pages + back, or a pointer to a descriptor for the page. In the first case, + the candidate pointer i not a true pointer and can be safely ignored. + In the last two cases, we can obtain a descriptor for the page containing + the beginning of the object. +
  • + The starting address of the referenced object is computed. + The page descriptor contains the size of the object(s) + in that page, the object kind, and the necessary mark bits for those + objects. The size information can be used to map the candidate pointer + to the object starting address. To accelerate this process, the page header + also contains a pointer to a precomputed map of page offsets to displacements + from the beginning of an object. The use of this map avoids a + potentially slow integer remainder operation in computing the object + start address. +
  • + The mark bit for the target object is checked and set. If the object + was previously unmarked, the object is pushed on the mark stack. + The descriptor is read from the page descriptor. (This is computed + from information GC_obj_kinds when the page is first allocated.) + +

    + At the end of the mark phase, mark bits for left-over free lists are cleared, + in case a free list was accidentally marked due to a stray pointer. + +

    Sweep phase

    + + At the end of the mark phase, all blocks in the heap are examined. + Unmarked large objects are immediately returned to the large object free list. + Each small object page is checked to see if all mark bits are clear. + If so, the entire page is returned to the large object free list. + Small object pages containing some reachable object are queued for later + sweeping. +

    + This initial sweep pass touches only block headers, not + the blocks themselves. Thus it does not require significant paging, even + if large sections of the heap are not in physical memory. +

    + Nonempty small object pages are swept when an allocation attempt + encounters an empty free list for that object size and kind. + Pages for the correct size and kind are repeatedly swept until at + least one empty block is found. Sweeping such a page involves + scanning the mark bit array in the page header, and building a free + list linked through the first words in the objects themselves. + This does involve touching the appropriate data page, but in most cases + it will be touched only just before it is used for allocation. + Hence any paging is essentially unavoidable. +

    + Except in the case of pointer-free objects, we maintain the invariant + that any object in a small object free list is cleared (except possibly + for the link field). Thus it becomes the burden of the small object + sweep routine to clear objects. This has the advantage that we can + easily recover from accidentally marking a free list, though that could + also be handled by other means. The collector currently spends a fair + amount of time clearing objects, and this approach should probably be + revisited. +

    + In most configurations, we use specialized sweep routines to handle common + small object sizes. Since we allocate one mark bit per word, it becomes + easier to examine the relevant mark bits if the object size divides + the word length evenly. We also suitably unroll the inner sweep loop + in each case. (It is conceivable that profile-based procedure cloning + in the compiler could make this unnecessary and counterproductive. I + know of no existing compiler to which this applies.) +

    + The sweeping of small object pages could be avoided completely at the expense + of examining mark bits directly in the allocator. This would probably + be more expensive, since each allocation call would have to reload + a large amount of state (e.g. next object address to be swept, position + in mark bit table) before it could do its work. The current scheme + keeps the allocator simple and allows useful optimizations in the sweeper. + +

    Finalization

    + Both GC_register_disappearing_link and + GC_register_finalizer add the request to a corresponding hash + table. The hash table is allocated out of collected memory, but + the reference to the finalizable object is hidden from the collector. + Currently finalization requests are processed non-incrementally at the + end of a mark cycle. +

    + The collector makes an initial pass over the table of finalizable objects, + pushing the contents of unmarked objects onto the mark stack. + After pushing each object, the marker is invoked to mark all objects + reachable from it. The object itself is not explicitly marked. + This assures that objects on which a finalizer depends are neither + collected nor finalized. +

    + If in the process of marking from an object the + object itself becomes marked, we have uncovered + a cycle involving the object. This usually results in a warning from the + collector. Such objects are not finalized, since it may be + unsafe to do so. See the more detailed + discussion of finalization semantics. +

    + Any objects remaining unmarked at the end of this process are added to + a queue of objects whose finalizers can be run. Depending on collector + configuration, finalizers are dequeued and run either implicitly during + allocation calls, or explicitly in response to a user request. +

    + The collector provides a mechanism for replacing the procedure that is + used to mark through objects. This is used both to provide support for + Java-style unordered finalization, and to ignore certain kinds of cycles, + e.g. those arising from C++ implementations of virtual inheritance. + +

    Generational Collection and Dirty Bits

    + We basically use the parallel and generational GC algorithm described in + "Mostly Parallel Garbage Collection", + by Boehm, Demers, and Shenker. +

    + The most significant modification is that + the collector always runs in the allocating thread. + There is no separate garbage collector thread. + If an allocation attempt either requests a large object, or encounters + an empty small object free list, and notices that there is a collection + in progress, it immediately performs a small amount of marking work + as described above. +

    + This change was made both because we wanted to easily accommodate + single-threaded environments, and because a separate GC thread requires + very careful control over the scheduler to prevent the mutator from + out-running the collector, and hence provoking unneeded heap growth. +

    + In incremental mode, the heap is always expanded when we encounter + insufficient space for an allocation. Garbage collection is triggered + whenever we notice that more than + GC_heap_size/2 * GC_free_space_divisor + bytes of allocation have taken place. + After GC_full_freq minor collections a major collection + is started. +

    + All collections initially run interrupted until a predetermined + amount of time (50 msecs by default) has expired. If this allows + the collection to complete entirely, we can avoid correcting + for data structure modifications during the collection. If it does + not complete, we return control to the mutator, and perform small + amounts of additional GC work during those later allocations that + cannot be satisfied from small object free lists. When marking completes, + the set of modified pages is retrieved, and we mark once again from + marked objects on those pages, this time with the mutator stopped. +

    + We keep track of modified pages using one of three distinct mechanisms: +

      +
    1. + Through explicit mutator cooperation. Currently this requires + the use of GC_malloc_stubborn. +
    2. + By write-protecting physical pages and catching write faults. This is + implemented for many Unix-like systems and for win32. It is not possible + in a few environments. +
    3. + By retrieving dirty bit information from /proc. (Currently only Sun's + Solaris supports this. Though this is considerably cleaner, performance + may actually be better with mprotect and signals.) +
    + +

    Thread support

    + We support several different threading models. Unfortunately Pthreads, + the only reasonably well standardized thread model, supports too narrow + an interface for conservative garbage collection. There appears to be + no portable way to allow the collector to coexist with various Pthreads + implementations. Hence we currently support only a few of the more + common Pthreads implementations. +

    + In particular, it is very difficult for the collector to stop all other + threads in the system and examine the register contents. This is currently + accomplished with very different mechanisms for different Pthreads + implementations. The Solaris implementation temporarily disables much + of the user-level threads implementation by stopping kernel-level threads + ("lwp"s). The Irix implementation sends signals to individual Pthreads + and has them wait in the signal handler. The Linux implementation + is similar in spirit to the Irix one. +

    + The Irix implementation uses + only documented Pthreads calls, but relies on extensions to their semantics, + notably the use of mutexes and condition variables from signal + handlers. The Linux implementation should be far closer to + portable, though impirically it is not completely portable. +

    + All implementations must + intercept thread creation and a few other thread-specific calls to allow + enumeration of threads and location of thread stacks. This is current + accomplished with # define's in gc.h, or optionally + by using ld's function call wrapping mechanism under Linux. +

    + Comments are appreciated. Please send mail to + boehm@acm.org + diff -Nrc3pad gcc-3.0.4/boehm-gc/doc/tree.html gcc-3.1/boehm-gc/doc/tree.html *** gcc-3.0.4/boehm-gc/doc/tree.html Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/doc/tree.html Fri Aug 17 18:39:18 2001 *************** *** 0 **** --- 1,198 ---- + + + Two-Level Tree Structure for Fast Pointer Lookup + Hans-J. Boehm, Silicon Graphics + + +

    Two-Level Tree Structure for Fast Pointer Lookup

    +

    + The conservative garbage collector described + here uses a 2-level tree + data structure to aid in fast pointer identification. + This data structure is described in a bit more detail here, since +

      +
    1. Variations of the data structure are more generally useful. +
    2. It appears to be hard to understand by reading the code. +
    3. Some other collectors appear to use inferior data structures to + solve the same problem. +
    4. It is central to fast collector operation. +
    + A candidate pointer is divided into three sections, the high, + middle, and low bits. The exact division between these + three groups of bits is dependent on the detailed collector configuration. +

    + The high and middle bits are used to look up an entry in the table described + here. The resulting table entry consists of either a block descriptor + (struct hblkhdr * or hdr *) + identifying the layout of objects in the block, or an indication that this + address range corresponds to the middle of a large block, together with a + hint for locating the actual block descriptor. Such a hint consist + of a displacement that can be subtracted from the middle bits of the candidate + pointer without leaving the object. +

    + In either case, the block descriptor (struct hblkhdr) + refers to a table of object starting addresses (the hb_map field). + The starting address table is indexed by the low bits if the candidate pointer. + The resulting entry contains a displacement to the beginning of the object, + or an indication that this cannot be a valid object pointer. + (If all interior pointer are recognized, pointers into large objects + are handled specially, as appropriate.) + +

    The Tree

    +

    + The rest of this discussion focuses on the two level data structure + used to map the high and middle bits to the block descriptor. +

    + The high bits are used as an index into the GC_top_index (really + GC_arrays._top_index) array. Each entry points to a + bottom_index data structure. This structure in turn consists + mostly of an array index indexed by the middle bits of + the candidate pointer. The index array contains the actual + hdr pointers. +

    + Thus a pointer lookup consists primarily of a handful of memory references, + and can be quite fast: +

      +
    1. The appropriate bottom_index pointer is looked up in + GC_top_index, based on the high bits of the candidate pointer. +
    2. The appropriate hdr pointer is looked up in the + bottom_index structure, based on the middle bits. +
    3. The block layout map pointer is retrieved from the hdr + structure. (This memory reference is necessary since we try to share + block layout maps.) +
    4. The displacement to the beginning of the object is retrieved from the + above map. +
    +

    + In order to conserve space, not all GC_top_index entries in fact + point to distinct bottom_index structures. If no address with + the corresponding high bits is part of the heap, then the entry points + to GC_all_nils, a single bottom_index structure consisting + only of NULL hdr pointers. +

    + Bottom_index structures contain slightly more information than + just hdr pointers. The asc_link field is used to link + all bottom_index structures in ascending order for fast traversal. + This list is pointed to be GC_all_bottom_indices. + It is maintained with the aid of key field that contains the + high bits corresponding to the bottom_index. + +

    64 bit addresses

    +

    + In the case of 64 bit addresses, this picture is complicated slightly + by the fact that one of the index structures would have to be huge to + cover the entire address space with a two level tree. We deal with this + by turning GC_top_index into a chained hash table, instead of + a simple array. This adds a hash_link field to the + bottom_index structure. +

    + The "hash function" consists of dropping the high bits. This is cheap to + compute, and guarantees that there will be no collisions if the heap + is contiguous and not excessively large. + +

    A picture

    +

    + The following is an ASCII diagram of the data structure. + This was contributed by Dave Barrett several years ago. +

    + 
    + 		Data Structure used by GC_base in gc3.7:
    + 			      21-Apr-94
    + 			 
    + 			
    + 
    + 
    +     63                  LOG_TOP_SZ[11]  LOG_BOTTOM_SZ[10]   LOG_HBLKSIZE[13]
    +    +------------------+----------------+------------------+------------------+
    +  p:|                  |   TL_HASH(hi)  |                  |   HBLKDISPL(p)   |
    +    +------------------+----------------+------------------+------------------+
    +     \-----------------------HBLKPTR(p)-------------------/
    +     \------------hi-------------------/ 
    +                       \______ ________/ \________ _______/ \________ _______/
    +                              V                   V                  V
    +                              |                   |                  |
    +            GC_top_index[]    |                   |                  | 
    +  ---      +--------------+   |                   |                  |  
    +   ^       |              |   |                   |                  |   
    +   |       |              |   |                   |                  |   
    +  TOP      +--------------+<--+                   |                  |      
    +  _SZ   +-<|      []      | *                     |                  |     
    + (items)|  +--------------+  if 0 < bi< HBLKSIZE  |                  |    
    +   |    |  |              | then large object     |                  |    
    +   |    |  |              | starts at the bi'th   |                  |    
    +   v    |  |              | HBLK before p.        |             i    |    
    +  ---   |  +--------------+                       |          (word-  |    
    +        v                                         |         aligned) |    
    +    bi= |GET_BI(p){->hash_link}->key==hi          |                  |   
    +        v                                         |                  |    
    +        |   (bottom_index)  \ scratch_alloc'd     |                  |    
    +        |   ( struct  bi )  / by get_index()      |                  |    
    +  ---   +->+--------------+                       |                  |    
    +   ^       |              |                       |                  |
    +   ^       |              |                       |                  |
    +  BOTTOM   |              |   ha=GET_HDR_ADDR(p)  |                  |
    + _SZ(items)+--------------+<----------------------+          +-------+
    +   |   +--<|   index[]    |                                  |         
    +   |   |   +--------------+                      GC_obj_map: v              
    +   |   |   |              |              from      / +-+-+-----+-+-+-+-+  --- 
    +   v   |   |              |              GC_add   < 0| | |     | | | | |   ^  
    +  ---  |   +--------------+             _map_entry \ +-+-+-----+-+-+-+-+   |  
    +       |   |   asc_link   |                          +-+-+-----+-+-+-+-+ MAXOBJSZ
    +       |   +--------------+                      +-->| | |  j  | | | | |  +1   
    +       |   |     key      |                      |   +-+-+-----+-+-+-+-+   |  
    +       |   +--------------+                      |   +-+-+-----+-+-+-+-+   | 
    +       |   |  hash_link   |                      |   | | |     | | | | |   v 
    +       |   +--------------+                      |   +-+-+-----+-+-+-+-+  ---
    +       |                                         |   |<--MAX_OFFSET--->|   
    +       |                                         |         (bytes)
    + HDR(p)| GC_find_header(p)                       |   |<--MAP_ENTRIES-->| 
    +       |                           \ from        |    =HBLKSIZE/WORDSZ   
    +       |    (hdr) (struct hblkhdr) / alloc_hdr() |    (1024 on Alpha)
    +       +-->+----------------------+              |    (8/16 bits each)
    + GET_HDR(p)| word   hb_sz (words) |              |          
    +           +----------------------+              |     
    +           | struct hblk *hb_next |              |
    +           +----------------------+              |       
    +           |mark_proc hb_mark_proc|              |
    +           +----------------------+              |
    +           | char * hb_map        |>-------------+
    +           +----------------------+           
    +           | ushort hb_obj_kind   |           
    +           +----------------------+           
    +           |   hb_last_reclaimed  |           
    +  ---      +----------------------+                
    +   ^       |                      |
    +  MARK_BITS|       hb_marks[]     | *if hdr is free, hb_sz + DISCARD_WORDS
    + _SZ(words)|                      |  is the size of a heap chunk (struct hblk)
    +   v       |                      |  of at least MININCR*HBLKSIZE bytes (below),
    +  ---      +----------------------+  otherwise, size of each object in chunk.
    + 
    + Dynamic data structures above are interleaved throughout the heap in blocks of 
    + size MININCR * HBLKSIZE bytes as done by gc_scratch_alloc which cannot be
    + freed; free lists are used (e.g. alloc_hdr).  HBLK's below are collected.
    + 
    + 	      (struct hblk)      
    +  ---      +----------------------+ < HBLKSIZE ---         ---          DISCARD_
    +   ^       |garbage[DISCARD_WORDS]|   aligned   ^           ^ HDR_BYTES WORDS
    +   |       |                      |             |           v (bytes)   (words)
    +   |       +-----hb_body----------+ < WORDSZ    |          ---   ---   
    +   |       |                      |   aligned   |           ^     ^
    +   |       |      Object 0        |             |           hb_sz |
    +   |       |                      |           i |(word-    (words)|
    +   |       |                      |      (bytes)|aligned)   v     |
    +   |       + - - - - - - - - - - -+ ---         |          ---    |
    +   |       |                      |  ^          |           ^     |
    +   n *     |                      |  j (words)  |          hb_sz BODY_SZ 
    +  HBLKSIZE |      Object 1        |  v          v           |   (words)
    +  (bytes)  |                      |---------------          v   MAX_OFFSET
    +   |       + - - - - - - - - - - -+                        ---  (bytes)
    +   |       |                      | !All_INTERIOR_PTRS      ^     |
    +   |       |                      | sets j only for       hb_sz   |
    +   |       |      Object N        | valid object offsets.   |     |
    +   v       |                      | All objects WORDSZ      v     v
    +  ---      +----------------------+ aligned.               ---   ---
    + 
    + DISCARD_WORDS is normally zero.  Indeed the collector has not been tested
    + with another value in ages.
    + 
    + diff -Nrc3pad gcc-3.0.4/boehm-gc/dyn_load.c gcc-3.1/boehm-gc/dyn_load.c *** gcc-3.0.4/boehm-gc/dyn_load.c Mon Jul 24 04:06:16 2000 --- gcc-3.1/boehm-gc/dyn_load.c Tue Apr 9 00:03:24 2002 *************** *** 26,40 **** * None of this is safe with dlclose and incremental collection. * But then not much of anything is safe in the presence of dlclose. */ ! #ifndef MACOS # include #endif ! #include "gc_priv.h" ! /* BTL: avoid circular redefinition of dlopen if SOLARIS_THREADS defined */ ! # if (defined(LINUX_THREADS) || defined(SOLARIS_THREADS) \ ! || defined(HPUX_THREADS) || defined(IRIX_THREADS)) && defined(dlopen) \ ! && !defined(USE_LD_WRAP) /* To support threads in Solaris, gc.h interposes on dlopen by */ /* defining "dlopen" to be "GC_dlopen", which is implemented below. */ /* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */ --- 26,43 ---- * None of this is safe with dlclose and incremental collection. * But then not much of anything is safe in the presence of dlclose. */ ! #if defined(__linux__) && !defined(_GNU_SOURCE) ! /* Can't test LINUX, since this must be define before other includes */ ! # define _GNU_SOURCE ! #endif ! #if !defined(MACOS) && !defined(_WIN32_WCE) # include #endif ! #include "private/gc_priv.h" ! /* BTL: avoid circular redefinition of dlopen if GC_SOLARIS_THREADS defined */ ! # if (defined(GC_PTHREADS) || defined(GC_SOLARIS_THREADS)) \ ! && defined(dlopen) && !defined(GC_USE_LD_WRAP) /* To support threads in Solaris, gc.h interposes on dlopen by */ /* defining "dlopen" to be "GC_dlopen", which is implemented below. */ /* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */ *************** *** 46,56 **** # undef GC_must_restore_redefined_dlopen # endif ! #if (defined(DYNAMIC_LOADING) || defined(MSWIN32)) && !defined(PCR) #if !defined(SUNOS4) && !defined(SUNOS5DL) && !defined(IRIX5) && \ ! !defined(MSWIN32) && !(defined(ALPHA) && defined(OSF1)) && \ !defined(HPUX) && !(defined(LINUX) && defined(__ELF__)) && \ ! !defined(RS6000) && !defined(SCO_ELF) --> We only know how to find data segments of dynamic libraries for the --> above. Additional SVR4 variants might not be too --> hard to add. --- 49,63 ---- # undef GC_must_restore_redefined_dlopen # endif ! #if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE)) \ ! && !defined(PCR) #if !defined(SUNOS4) && !defined(SUNOS5DL) && !defined(IRIX5) && \ ! !defined(MSWIN32) && !defined(MSWINCE) && \ ! !(defined(ALPHA) && defined(OSF1)) && \ !defined(HPUX) && !(defined(LINUX) && defined(__ELF__)) && \ ! !defined(RS6000) && !defined(SCO_ELF) && \ ! !(defined(FREEBSD) && defined(__ELF__)) && \ ! !(defined(NETBSD) && defined(__ELF__)) && !defined(HURD) --> We only know how to find data segments of dynamic libraries for the --> above. Additional SVR4 variants might not be too --> hard to add. *************** *** 72,77 **** --- 79,101 ---- # define l_name lm_name #endif + #if defined(LINUX) && defined(__ELF__) || defined(SCO_ELF) || \ + (defined(FREEBSD) && defined(__ELF__)) || \ + (defined(NETBSD) && defined(__ELF__)) || defined(HURD) + # include + # include + # include + #endif + + /* Newer versions of GNU/Linux define this macro. We + * define it similarly for any ELF systems that don't. */ + # ifndef ElfW + # if !defined(ELF_CLASS) || ELF_CLASS == ELFCLASS32 + # define ElfW(type) Elf32_##type + # else + # define ElfW(type) Elf64_##type + # endif + # endif #if defined(SUNOS5DL) && !defined(USE_PROC_FOR_LIBRARIES) *************** *** 82,92 **** static struct link_map * GC_FirstDLOpenedLinkMap() { ! extern Elf32_Dyn _DYNAMIC; ! Elf32_Dyn *dp; struct r_debug *r; static struct link_map * cachedResult = 0; ! static Elf32_Dyn *dynStructureAddr = 0; /* BTL: added to avoid Solaris 5.3 ld.so _DYNAMIC bug */ # ifdef SUNOS53_SHARED_LIB --- 106,116 ---- static struct link_map * GC_FirstDLOpenedLinkMap() { ! extern ElfW(Dyn) _DYNAMIC; ! ElfW(Dyn) *dp; struct r_debug *r; static struct link_map * cachedResult = 0; ! static ElfW(Dyn) *dynStructureAddr = 0; /* BTL: added to avoid Solaris 5.3 ld.so _DYNAMIC bug */ # ifdef SUNOS53_SHARED_LIB *************** GC_FirstDLOpenedLinkMap() *** 96,102 **** /* at program startup. */ if( dynStructureAddr == 0 ) { void* startupSyms = dlopen(0, RTLD_LAZY); ! dynStructureAddr = (Elf32_Dyn*)dlsym(startupSyms, "_DYNAMIC"); } # else dynStructureAddr = &_DYNAMIC; --- 120,126 ---- /* at program startup. */ if( dynStructureAddr == 0 ) { void* startupSyms = dlopen(0, RTLD_LAZY); ! dynStructureAddr = (ElfW(Dyn)*)dlsym(startupSyms, "_DYNAMIC"); } # else dynStructureAddr = &_DYNAMIC; *************** GC_FirstDLOpenedLinkMap() *** 107,113 **** } if( cachedResult == 0 ) { int tag; ! for( dp = ((Elf32_Dyn *)(&_DYNAMIC)); (tag = dp->d_tag) != 0; dp++ ) { if( tag == DT_DEBUG ) { struct link_map *lm = ((struct r_debug *)(dp->d_un.d_ptr))->r_map; --- 131,137 ---- } if( cachedResult == 0 ) { int tag; ! for( dp = ((ElfW(Dyn) *)(&_DYNAMIC)); (tag = dp->d_tag) != 0; dp++ ) { if( tag == DT_DEBUG ) { struct link_map *lm = ((struct r_debug *)(dp->d_un.d_ptr))->r_map; *************** GC_FirstDLOpenedLinkMap() *** 121,126 **** --- 145,155 ---- #endif /* SUNOS5DL ... */ + /* BTL: added to fix circular dlopen definition if GC_SOLARIS_THREADS defined */ + # if defined(GC_must_restore_redefined_dlopen) + # define dlopen GC_dlopen + # endif + #if defined(SUNOS4) && !defined(USE_PROC_FOR_LIBRARIES) #ifdef LINT *************** static ptr_t GC_first_common() *** 161,232 **** #endif /* SUNOS4 ... */ - # if defined(LINUX_THREADS) || defined(SOLARIS_THREADS) \ - || defined(HPUX_THREADS) || defined(IRIX_THREADS) - /* Make sure we're not in the middle of a collection, and make */ - /* sure we don't start any. Returns previous value of GC_dont_gc. */ - /* This is invoked prior to a dlopen call to avoid synchronization */ - /* issues. We can't just acquire the allocation lock, since startup */ - /* code in dlopen may try to allocate. */ - /* This solution risks heap growth in the presence of many dlopen */ - /* calls in either a multithreaded environment, or if the library */ - /* initialization code allocates substantial amounts of GC'ed memory. */ - /* But I don't know of a better solution. */ - /* This can still deadlock if the client explicitly starts a GC */ - /* during the dlopen. He shouldn't do that. */ - static GC_bool disable_gc_for_dlopen() - { - GC_bool result; - LOCK(); - result = GC_dont_gc; - while (GC_incremental && GC_collection_in_progress()) { - GC_collect_a_little_inner(1000); - } - GC_dont_gc = TRUE; - UNLOCK(); - return(result); - } - - /* Redefine dlopen to guarantee mutual exclusion with */ - /* GC_register_dynamic_libraries. */ - /* Should probably happen for other operating systems, too. */ - - #include - - #ifdef USE_LD_WRAP - void * __wrap_dlopen(const char *path, int mode) - #else - void * GC_dlopen(path, mode) - GC_CONST char * path; - int mode; - #endif - { - void * result; - GC_bool dont_gc_save; - - # ifndef USE_PROC_FOR_LIBRARIES - dont_gc_save = disable_gc_for_dlopen(); - # endif - # ifdef USE_LD_WRAP - result = __real_dlopen(path, mode); - # else - result = dlopen(path, mode); - # endif - # ifndef USE_PROC_FOR_LIBRARIES - GC_dont_gc = dont_gc_save; - # endif - return(result); - } - # endif /* SOLARIS_THREADS */ - - /* BTL: added to fix circular dlopen definition if SOLARIS_THREADS defined */ - # if defined(GC_must_restore_redefined_dlopen) - # define dlopen GC_dlopen - # endif - # if defined(SUNOS4) || defined(SUNOS5DL) /* Add dynamic library data sections to the root set. */ ! # if !defined(PCR) && !defined(SOLARIS_THREADS) && defined(THREADS) # ifndef SRC_M3 --> fix mutual exclusion with dlopen # endif /* We assume M3 programs don't call dlopen for now */ --- 190,198 ---- #endif /* SUNOS4 ... */ # if defined(SUNOS4) || defined(SUNOS5DL) /* Add dynamic library data sections to the root set. */ ! # if !defined(PCR) && !defined(GC_SOLARIS_THREADS) && defined(THREADS) # ifndef SRC_M3 --> fix mutual exclusion with dlopen # endif /* We assume M3 programs don't call dlopen for now */ *************** void GC_register_dynamic_libraries() *** 251,264 **** TRUE); # endif # ifdef SUNOS5DL ! Elf32_Ehdr * e; ! Elf32_Phdr * p; unsigned long offset; char * start; register int i; ! e = (Elf32_Ehdr *) lm->l_addr; ! p = ((Elf32_Phdr *)(((char *)(e)) + e->e_phoff)); offset = ((unsigned long)(lm->l_addr)); for( i = 0; i < (int)(e->e_phnum); ((i++),(p++)) ) { switch( p->p_type ) { --- 217,230 ---- TRUE); # endif # ifdef SUNOS5DL ! ElfW(Ehdr) * e; ! ElfW(Phdr) * p; unsigned long offset; char * start; register int i; ! e = (ElfW(Ehdr) *) lm->l_addr; ! p = ((ElfW(Phdr) *)(((char *)(e)) + e->e_phoff)); offset = ((unsigned long)(lm->l_addr)); for( i = 0; i < (int)(e->e_phnum); ((i++),(p++)) ) { switch( p->p_type ) { *************** void GC_register_dynamic_libraries() *** 297,329 **** # endif /* !USE_PROC ... */ # endif /* SUNOS */ ! #if defined(LINUX) && defined(__ELF__) || defined(SCO_ELF) /* Dynamic loading code for Linux running ELF. Somewhat tested on * Linux/x86, untested but hopefully should work on Linux/Alpha. * This code was derived from the Solaris/ELF support. Thanks to * whatever kind soul wrote that. - Patrick Bridges */ ! #include #include ! /* Newer versions of Linux/Alpha and Linux/x86 define this macro. We ! * define it for those older versions that don't. */ ! # ifndef ElfW ! # if !defined(ELF_CLASS) || ELF_CLASS == ELFCLASS32 ! # define ElfW(type) Elf32_##type ! # else ! # define ElfW(type) Elf64_##type ! # endif ! # endif static struct link_map * GC_FirstDLOpenedLinkMap() { - # ifdef __GNUC__ - # pragma weak _DYNAMIC - # endif - extern ElfW(Dyn) _DYNAMIC[]; ElfW(Dyn) *dp; struct r_debug *r; static struct link_map *cachedResult = 0; --- 263,542 ---- # endif /* !USE_PROC ... */ # endif /* SUNOS */ ! #if defined(LINUX) && defined(__ELF__) || defined(SCO_ELF) || \ ! (defined(FREEBSD) && defined(__ELF__)) || \ ! (defined(NETBSD) && defined(__ELF__)) || defined(HURD) ! ! ! #ifdef USE_PROC_FOR_LIBRARIES ! ! #include ! ! #include ! #include ! #include ! ! #define MAPS_BUF_SIZE (32*1024) ! ! extern ssize_t GC_repeat_read(int fd, char *buf, size_t count); ! /* Repeatedly read until buffer is filled, or EOF is encountered */ ! /* Defined in os_dep.c. */ ! ! static char *parse_map_entry(char *buf_ptr, word *start, word *end, ! char *prot_buf, unsigned int *maj_dev); ! ! void GC_register_dynamic_libraries() ! { ! int f; ! int result; ! char prot_buf[5]; ! int maps_size; ! char maps_temp[32768]; ! char *maps_buf; ! char *buf_ptr; ! int count; ! word start, end; ! unsigned int maj_dev, min_dev; ! word least_ha, greatest_ha; ! unsigned i; ! word datastart = (word)(DATASTART); ! ! /* Read /proc/self/maps */ ! /* Note that we may not allocate, and thus can't use stdio. */ ! f = open("/proc/self/maps", O_RDONLY); ! if (-1 == f) ABORT("Couldn't open /proc/self/maps"); ! /* stat() doesn't work for /proc/self/maps, so we have to ! read it to find out how large it is... */ ! maps_size = 0; ! do { ! result = GC_repeat_read(f, maps_temp, sizeof(maps_temp)); ! if (result <= 0) ABORT("Couldn't read /proc/self/maps"); ! maps_size += result; ! } while (result == sizeof(maps_temp)); ! ! if (maps_size > sizeof(maps_temp)) { ! /* If larger than our buffer, close and re-read it. */ ! close(f); ! f = open("/proc/self/maps", O_RDONLY); ! if (-1 == f) ABORT("Couldn't open /proc/self/maps"); ! maps_buf = alloca(maps_size); ! if (NULL == maps_buf) ABORT("/proc/self/maps alloca failed"); ! result = GC_repeat_read(f, maps_buf, maps_size); ! if (result <= 0) ABORT("Couldn't read /proc/self/maps"); ! } else { ! /* Otherwise use the fixed size buffer */ ! maps_buf = maps_temp; ! } ! ! close(f); ! maps_buf[result] = '\0'; ! buf_ptr = maps_buf; ! /* Compute heap bounds. Should be done by add_to_heap? */ ! least_ha = (word)(-1); ! greatest_ha = 0; ! for (i = 0; i < GC_n_heap_sects; ++i) { ! word sect_start = (word)GC_heap_sects[i].hs_start; ! word sect_end = sect_start + GC_heap_sects[i].hs_bytes; ! if (sect_start < least_ha) least_ha = sect_start; ! if (sect_end > greatest_ha) greatest_ha = sect_end; ! } ! if (greatest_ha < (word)GC_scratch_last_end_ptr) ! greatest_ha = (word)GC_scratch_last_end_ptr; ! for (;;) { ! ! buf_ptr = parse_map_entry(buf_ptr, &start, &end, prot_buf, &maj_dev); ! if (buf_ptr == NULL) return; ! ! if (prot_buf[1] == 'w') { ! /* This is a writable mapping. Add it to */ ! /* the root set unless it is already otherwise */ ! /* accounted for. */ ! if (start <= (word)GC_stackbottom && end >= (word)GC_stackbottom) { ! /* Stack mapping; discard */ ! continue; ! } ! if (start <= datastart && end > datastart && maj_dev != 0) { ! /* Main data segment; discard */ ! continue; ! } ! # ifdef THREADS ! if (GC_segment_is_thread_stack(start, end)) continue; ! # endif ! /* The rest of this assumes that there is no mapping */ ! /* spanning the beginning of the data segment, or extending */ ! /* beyond the entire heap at both ends. */ ! /* Empirically these assumptions hold. */ ! ! if (start < (word)DATAEND && end > (word)DATAEND) { ! /* Rld may use space at the end of the main data */ ! /* segment. Thus we add that in. */ ! start = (word)DATAEND; ! } ! if (start < least_ha && end > least_ha) { ! end = least_ha; ! } ! if (start < greatest_ha && end > greatest_ha) { ! start = greatest_ha; ! } ! if (start >= least_ha && end <= greatest_ha) continue; ! GC_add_roots_inner((char *)start, (char *)end, TRUE); ! } ! } ! } ! ! // ! // parse_map_entry parses an entry from /proc/self/maps so we can ! // locate all writable data segments that belong to shared libraries. ! // The format of one of these entries and the fields we care about ! // is as follows: ! // XXXXXXXX-XXXXXXXX r-xp 00000000 30:05 260537 name of mapping...\n ! // ^^^^^^^^ ^^^^^^^^ ^^^^ ^^ ! // start end prot maj_dev ! // 0 9 18 32 ! // ! // The parser is called with a pointer to the entry and the return value ! // is either NULL or is advanced to the next entry(the byte after the ! // trailing '\n'.) ! // ! #define OFFSET_MAP_START 0 ! #define OFFSET_MAP_END 9 ! #define OFFSET_MAP_PROT 18 ! #define OFFSET_MAP_MAJDEV 32 ! ! static char *parse_map_entry(char *buf_ptr, word *start, word *end, ! char *prot_buf, unsigned int *maj_dev) ! { ! int i; ! unsigned int val; ! char *tok; ! ! if (buf_ptr == NULL || *buf_ptr == '\0') { ! return NULL; ! } ! ! memcpy(prot_buf, buf_ptr+OFFSET_MAP_PROT, 4); // do the protections first ! prot_buf[4] = '\0'; ! ! if (prot_buf[1] == 'w') { // we can skip all of this if it's not writable ! ! tok = buf_ptr; ! buf_ptr[OFFSET_MAP_START+8] = '\0'; ! *start = strtoul(tok, NULL, 16); ! ! tok = buf_ptr+OFFSET_MAP_END; ! buf_ptr[OFFSET_MAP_END+8] = '\0'; ! *end = strtoul(tok, NULL, 16); ! ! buf_ptr += OFFSET_MAP_MAJDEV; ! tok = buf_ptr; ! while (*buf_ptr != ':') buf_ptr++; ! *buf_ptr++ = '\0'; ! *maj_dev = strtoul(tok, NULL, 16); ! } ! ! while (*buf_ptr && *buf_ptr++ != '\n'); ! ! return buf_ptr; ! } ! ! #endif /* USE_PROC_FOR_LIBRARIES */ ! ! #if !defined(USE_PROC_FOR_LIBRARIES) ! /* The following is the preferred way to walk dynamic libraries */ ! /* For glibc 2.2.4+. Unfortunately, it doesn't work for older */ ! /* versions. Thanks to Jakub Jelinek for most of the code. */ ! ! # if defined(LINUX) /* Are others OK here, too? */ \ ! && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \ ! || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG))) ! ! /* We have the header files for a glibc that includes dl_iterate_phdr. */ ! /* It may still not be available in the library on the target system. */ ! /* Thus we also treat it as a weak symbol. */ ! #define HAVE_DL_ITERATE_PHDR ! ! static int GC_register_dynlib_callback(info, size, ptr) ! struct dl_phdr_info * info; ! size_t size; ! void * ptr; ! { ! const ElfW(Phdr) * p; ! char * start; ! register int i; ! ! /* Make sure struct dl_phdr_info is at least as big as we need. */ ! if (size < offsetof (struct dl_phdr_info, dlpi_phnum) ! + sizeof (info->dlpi_phnum)) ! return -1; ! ! /* Skip the first object - it is the main program. */ ! if (*(int *)ptr == 0) ! { ! *(int *)ptr = 1; ! return 0; ! } ! ! p = info->dlpi_phdr; ! for( i = 0; i < (int)(info->dlpi_phnum); ((i++),(p++)) ) { ! switch( p->p_type ) { ! case PT_LOAD: ! { ! if( !(p->p_flags & PF_W) ) break; ! start = ((char *)(p->p_vaddr)) + info->dlpi_addr; ! GC_add_roots_inner(start, start + p->p_memsz, TRUE); ! } ! break; ! default: ! break; ! } ! } ! ! return 0; ! } ! ! /* Return TRUE if we succeed, FALSE if dl_iterate_phdr wasn't there. */ ! ! #pragma weak dl_iterate_phdr ! ! GC_bool GC_register_dynamic_libraries_dl_iterate_phdr() ! { ! int tmp = 0; ! ! if (dl_iterate_phdr) { ! dl_iterate_phdr(GC_register_dynlib_callback, &tmp); ! return TRUE; ! } else { ! return FALSE; ! } ! } ! ! # else /* !LINUX || version(glibc) < 2.2.4 */ /* Dynamic loading code for Linux running ELF. Somewhat tested on * Linux/x86, untested but hopefully should work on Linux/Alpha. * This code was derived from the Solaris/ELF support. Thanks to * whatever kind soul wrote that. - Patrick Bridges */ ! /* This doesn't necessarily work in all cases, e.g. with preloaded ! * dynamic libraries. */ ! ! #if defined(NETBSD) ! # include ! #else ! # include ! #endif #include ! # endif ! ! #ifdef __GNUC__ ! # pragma weak _DYNAMIC ! #endif ! extern ElfW(Dyn) _DYNAMIC[]; static struct link_map * GC_FirstDLOpenedLinkMap() { ElfW(Dyn) *dp; struct r_debug *r; static struct link_map *cachedResult = 0; *************** GC_FirstDLOpenedLinkMap() *** 348,356 **** void GC_register_dynamic_libraries() { ! struct link_map *lm = GC_FirstDLOpenedLinkMap(); for (lm = GC_FirstDLOpenedLinkMap(); lm != (struct link_map *) 0; lm = lm->l_next) { --- 561,575 ---- void GC_register_dynamic_libraries() { ! struct link_map *lm; + # ifdef HAVE_DL_ITERATE_PHDR + if (GC_register_dynamic_libraries_dl_iterate_phdr()) { + return; + } + # endif + lm = GC_FirstDLOpenedLinkMap(); for (lm = GC_FirstDLOpenedLinkMap(); lm != (struct link_map *) 0; lm = lm->l_next) { *************** void GC_register_dynamic_libraries() *** 379,402 **** } } ! #endif ! #if defined(IRIX5) || defined(USE_PROC_FOR_LIBRARIES) #include #include #include #include #include extern void * GC_roots_present(); /* The type is a lie, since the real type doesn't make sense here, */ /* and we only test for NULL. */ - #ifndef GC_scratch_last_end_ptr - extern ptr_t GC_scratch_last_end_ptr; /* End of GC_scratch_alloc arena */ - #endif - /* We use /proc to track down all parts of the address space that are */ /* mapped by the process, and throw out regions we know we shouldn't */ /* worry about. This may also work under other SVR4 variants. */ --- 598,623 ---- } } ! #endif /* !USE_PROC_FOR_LIBRARIES */ ! #endif /* LINUX */ ! ! #if defined(IRIX5) || (defined(USE_PROC_FOR_LIBRARIES) && !defined(LINUX)) #include #include #include #include #include + #include /* Only for the following test. */ + #ifndef _sigargs + # define IRIX6 + #endif extern void * GC_roots_present(); /* The type is a lie, since the real type doesn't make sense here, */ /* and we only test for NULL. */ /* We use /proc to track down all parts of the address space that are */ /* mapped by the process, and throw out regions we know we shouldn't */ /* worry about. This may also work under other SVR4 variants. */ *************** void GC_register_dynamic_libraries() *** 452,458 **** if ((flags & (MA_BREAK | MA_STACK | MA_PHYS)) != 0) goto irrelevant; if ((flags & (MA_READ | MA_WRITE)) != (MA_READ | MA_WRITE)) goto irrelevant; ! /* The latter test is empirically useless. Other than the */ /* main data and stack segments, everything appears to be */ /* mapped readable, writable, executable, and shared(!!). */ /* This makes no sense to me. - HB */ --- 673,680 ---- if ((flags & (MA_BREAK | MA_STACK | MA_PHYS)) != 0) goto irrelevant; if ((flags & (MA_READ | MA_WRITE)) != (MA_READ | MA_WRITE)) goto irrelevant; ! /* The latter test is empirically useless in very old Irix */ ! /* versions. Other than the */ /* main data and stack segments, everything appears to be */ /* mapped readable, writable, executable, and shared(!!). */ /* This makes no sense to me. - HB */ *************** void GC_register_dynamic_libraries() *** 465,471 **** # endif /* MMAP_STACKS */ limit = start + addr_map[i].pr_size; ! if (addr_map[i].pr_off == 0 && strncmp(start, ELFMAG, 4) == 0) { /* Discard text segments, i.e. 0-offset mappings against */ /* executable files which appear to have ELF headers. */ caddr_t arg; --- 687,697 ---- # endif /* MMAP_STACKS */ limit = start + addr_map[i].pr_size; ! /* The following seemed to be necessary for very old versions */ ! /* of Irix, but it has been reported to discard relevant */ ! /* segments under Irix 6.5. */ ! # ifndef IRIX6 ! if (addr_map[i].pr_off == 0 && strncmp(start, ELFMAG, 4) == 0) { /* Discard text segments, i.e. 0-offset mappings against */ /* executable files which appear to have ELF headers. */ caddr_t arg; *************** void GC_register_dynamic_libraries() *** 492,498 **** goto irrelevant; } } ! } GC_add_roots_inner(start, limit, TRUE); irrelevant: ; } --- 718,725 ---- goto irrelevant; } } ! } ! # endif /* !IRIX6 */ GC_add_roots_inner(start, limit, TRUE); irrelevant: ; } *************** void GC_register_dynamic_libraries() *** 504,510 **** # endif /* USE_PROC || IRIX5 */ ! # ifdef MSWIN32 # define WIN32_LEAN_AND_MEAN # define NOSERVICE --- 731,737 ---- # endif /* USE_PROC || IRIX5 */ ! # if defined(MSWIN32) || defined(MSWINCE) # define WIN32_LEAN_AND_MEAN # define NOSERVICE *************** void GC_register_dynamic_libraries() *** 513,598 **** /* We traverse the entire address space and register all segments */ /* that could possibly have been written to. */ - DWORD GC_allocation_granularity; extern GC_bool GC_is_heap_base (ptr_t p); ! # ifdef WIN32_THREADS extern void GC_get_next_stack(char *start, char **lo, char **hi); ! # endif ! ! void GC_cond_add_roots(char *base, char * limit) ! { ! char dummy; ! char * stack_top ! = (char *) ((word)(&dummy) & ~(GC_allocation_granularity-1)); ! if (base == limit) return; ! # ifdef WIN32_THREADS { ! char * curr_base = base; ! char * next_stack_lo; ! char * next_stack_hi; ! ! for(;;) { ! GC_get_next_stack(curr_base, &next_stack_lo, &next_stack_hi); ! if (next_stack_lo >= limit) break; ! GC_add_roots_inner(curr_base, next_stack_lo, TRUE); ! curr_base = next_stack_hi; ! } ! if (curr_base < limit) GC_add_roots_inner(curr_base, limit, TRUE); } ! # else ! if (limit > stack_top && base < GC_stackbottom) { ! /* Part of the stack; ignore it. */ ! return; ! } ! GC_add_roots_inner(base, limit, TRUE); ! # endif ! } ! ! extern GC_bool GC_win32s; void GC_register_dynamic_libraries() { MEMORY_BASIC_INFORMATION buf; - SYSTEM_INFO sysinfo; DWORD result; DWORD protect; LPVOID p; char * base; char * limit, * new_limit; ! ! if (GC_win32s) return; ! GetSystemInfo(&sysinfo); ! base = limit = p = sysinfo.lpMinimumApplicationAddress; ! GC_allocation_granularity = sysinfo.dwAllocationGranularity; ! while (p < sysinfo.lpMaximumApplicationAddress) { result = VirtualQuery(p, &buf, sizeof(buf)); ! if (result != sizeof(buf)) { ! ABORT("Weird VirtualQuery result"); ! } ! new_limit = (char *)p + buf.RegionSize; ! protect = buf.Protect; ! if (buf.State == MEM_COMMIT ! && (protect == PAGE_EXECUTE_READWRITE ! || protect == PAGE_READWRITE) ! && !GC_is_heap_base(buf.AllocationBase)) { ! if ((char *)p == limit) { ! limit = new_limit; ! } else { ! GC_cond_add_roots(base, limit); ! base = p; ! limit = new_limit; ! } ! } if (p > (LPVOID)new_limit /* overflow */) break; p = (LPVOID)new_limit; } GC_cond_add_roots(base, limit); } ! #endif /* MSWIN32 */ ! #if defined(ALPHA) && defined(OSF1) #include --- 740,836 ---- /* We traverse the entire address space and register all segments */ /* that could possibly have been written to. */ extern GC_bool GC_is_heap_base (ptr_t p); ! # ifdef GC_WIN32_THREADS extern void GC_get_next_stack(char *start, char **lo, char **hi); ! void GC_cond_add_roots(char *base, char * limit) { ! char * curr_base = base; ! char * next_stack_lo; ! char * next_stack_hi; ! ! if (base == limit) return; ! for(;;) { ! GC_get_next_stack(curr_base, &next_stack_lo, &next_stack_hi); ! if (next_stack_lo >= limit) break; ! GC_add_roots_inner(curr_base, next_stack_lo, TRUE); ! curr_base = next_stack_hi; ! } ! if (curr_base < limit) GC_add_roots_inner(curr_base, limit, TRUE); } ! # else ! void GC_cond_add_roots(char *base, char * limit) ! { ! char dummy; ! char * stack_top ! = (char *) ((word)(&dummy) & ~(GC_sysinfo.dwAllocationGranularity-1)); ! if (base == limit) return; ! if (limit > stack_top && base < GC_stackbottom) { ! /* Part of the stack; ignore it. */ ! return; ! } ! GC_add_roots_inner(base, limit, TRUE); ! } ! # endif ! ! # ifndef MSWINCE ! extern GC_bool GC_no_win32_dlls; ! # endif void GC_register_dynamic_libraries() { MEMORY_BASIC_INFORMATION buf; DWORD result; DWORD protect; LPVOID p; char * base; char * limit, * new_limit; ! ! # ifdef MSWIN32 ! if (GC_no_win32_dlls) return; ! # endif ! base = limit = p = GC_sysinfo.lpMinimumApplicationAddress; ! # if defined(MSWINCE) && !defined(_WIN32_WCE_EMULATION) ! /* Only the first 32 MB of address space belongs to the current process */ ! while (p < (LPVOID)0x02000000) { result = VirtualQuery(p, &buf, sizeof(buf)); ! if (result == 0) { ! /* Page is free; advance to the next possible allocation base */ ! new_limit = (char *) ! (((DWORD) p + GC_sysinfo.dwAllocationGranularity) ! & ~(GC_sysinfo.dwAllocationGranularity-1)); ! } else ! # else ! while (p < GC_sysinfo.lpMaximumApplicationAddress) { ! result = VirtualQuery(p, &buf, sizeof(buf)); ! # endif ! { ! if (result != sizeof(buf)) { ! ABORT("Weird VirtualQuery result"); ! } ! new_limit = (char *)p + buf.RegionSize; ! protect = buf.Protect; ! if (buf.State == MEM_COMMIT ! && (protect == PAGE_EXECUTE_READWRITE ! || protect == PAGE_READWRITE) ! && !GC_is_heap_base(buf.AllocationBase)) { ! if ((char *)p != limit) { ! GC_cond_add_roots(base, limit); ! base = p; ! } ! limit = new_limit; ! } ! } if (p > (LPVOID)new_limit /* overflow */) break; p = (LPVOID)new_limit; } GC_cond_add_roots(base, limit); } ! #endif /* MSWIN32 || MSWINCE */ ! #if defined(ALPHA) && defined(OSF1) #include *************** void GC_register_dynamic_libraries() *** 720,726 **** /* Check if this is the end of the list or if some error occured */ if (status != 0) { ! # ifdef HPUX_THREADS /* I've seen errno values of 0. The man page is not clear */ /* as to whether errno should get set on a -1 return. */ break; --- 958,964 ---- /* Check if this is the end of the list or if some error occured */ if (status != 0) { ! # ifdef GC_HPUX_THREADS /* I've seen errno values of 0. The man page is not clear */ /* as to whether errno should get set on a -1 return. */ break; diff -Nrc3pad gcc-3.0.4/boehm-gc/finalize.c gcc-3.1/boehm-gc/finalize.c *** gcc-3.0.4/boehm-gc/finalize.c Thu Apr 5 00:13:13 2001 --- gcc-3.1/boehm-gc/finalize.c Tue Feb 12 04:37:53 2002 *************** *** 14,21 **** */ /* Boehm, February 1, 1996 1:19 pm PST */ # define I_HIDE_POINTERS ! # include "gc_priv.h" ! # include "gc_mark.h" # ifdef FINALIZE_ON_DEMAND int GC_finalize_on_demand = 1; --- 14,20 ---- */ /* Boehm, February 1, 1996 1:19 pm PST */ # define I_HIDE_POINTERS ! # include "private/gc_pmark.h" # ifdef FINALIZE_ON_DEMAND int GC_finalize_on_demand = 1; *************** static signed_word log_fo_table_size = - *** 86,98 **** word GC_fo_entries = 0; ! # ifdef SRC_M3 ! void GC_push_finalizer_structures() { GC_push_all((ptr_t)(&dl_head), (ptr_t)(&dl_head) + sizeof(word)); GC_push_all((ptr_t)(&fo_head), (ptr_t)(&fo_head) + sizeof(word)); } - # endif /* Double the size of a hash table. *size_ptr is the log of its current */ /* size. May be a noop. */ --- 85,97 ---- word GC_fo_entries = 0; ! void GC_push_finalizer_structures GC_PROTO((void)) { GC_push_all((ptr_t)(&dl_head), (ptr_t)(&dl_head) + sizeof(word)); GC_push_all((ptr_t)(&fo_head), (ptr_t)(&fo_head) + sizeof(word)); + GC_push_all((ptr_t)(&GC_finalize_now), + (ptr_t)(&GC_finalize_now) + sizeof(word)); } /* Double the size of a hash table. *size_ptr is the log of its current */ /* size. May be a noop. */ *************** signed_word * log_size_ptr; *** 110,116 **** word old_size = ((log_old_size == -1)? 0: (1 << log_old_size)); register word new_size = 1 << log_new_size; struct hash_chain_entry **new_table = (struct hash_chain_entry **) ! GC_generic_malloc_inner_ignore_off_page( (size_t)new_size * sizeof(struct hash_chain_entry *), NORMAL); if (new_table == 0) { --- 109,115 ---- word old_size = ((log_old_size == -1)? 0: (1 << log_old_size)); register word new_size = 1 << log_new_size; struct hash_chain_entry **new_table = (struct hash_chain_entry **) ! GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE( (size_t)new_size * sizeof(struct hash_chain_entry *), NORMAL); if (new_table == 0) { *************** signed_word * log_size_ptr; *** 179,187 **** # endif GC_grow_table((struct hash_chain_entry ***)(&dl_head), &log_dl_table_size); ! # ifdef PRINTSTATS GC_printf1("Grew dl table to %lu entries\n", (unsigned long)(1 << log_dl_table_size)); # endif # ifndef THREADS ENABLE_SIGNALS(); --- 178,188 ---- # endif GC_grow_table((struct hash_chain_entry ***)(&dl_head), &log_dl_table_size); ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf1("Grew dl table to %lu entries\n", (unsigned long)(1 << log_dl_table_size)); + } # endif # ifndef THREADS ENABLE_SIGNALS(); *************** signed_word * log_size_ptr; *** 199,220 **** return(1); } } ! # ifdef THREADS ! new_dl = (struct disappearing_link *) ! GC_generic_malloc_inner(sizeof(struct disappearing_link),NORMAL); ! # else ! new_dl = (struct disappearing_link *) ! GC_malloc(sizeof(struct disappearing_link)); ! # endif ! if (new_dl != 0) { ! new_dl -> dl_hidden_obj = HIDE_POINTER(obj); ! new_dl -> dl_hidden_link = HIDE_POINTER(link); ! dl_set_next(new_dl, dl_head[index]); ! dl_head[index] = new_dl; ! GC_dl_entries++; ! } else { ! GC_finalization_failures++; } # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); --- 200,228 ---- return(1); } } ! new_dl = (struct disappearing_link *) ! GC_INTERNAL_MALLOC(sizeof(struct disappearing_link),NORMAL); ! if (0 == new_dl) { ! # ifdef THREADS ! UNLOCK(); ! ENABLE_SIGNALS(); ! # endif ! new_dl = GC_oom_fn(sizeof(struct disappearing_link)); ! if (0 == new_dl) { ! GC_finalization_failures++; ! return(0); ! } ! /* It's not likely we'll make it here, but ... */ ! # ifdef THREADS ! DISABLE_SIGNALS(); ! LOCK(); ! # endif } + new_dl -> dl_hidden_obj = HIDE_POINTER(obj); + new_dl -> dl_hidden_link = HIDE_POINTER(link); + dl_set_next(new_dl, dl_head[index]); + dl_head[index] = new_dl; + GC_dl_entries++; # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); *************** signed_word * log_size_ptr; *** 248,254 **** GC_dl_entries--; UNLOCK(); ENABLE_SIGNALS(); ! GC_free((GC_PTR)curr_dl); return(1); } prev_dl = curr_dl; --- 256,266 ---- GC_dl_entries--; UNLOCK(); ENABLE_SIGNALS(); ! # ifdef DBG_HDRS_ALL ! dl_set_next(curr_dl, 0); ! # else ! GC_free((GC_PTR)curr_dl); ! # endif return(1); } prev_dl = curr_dl; *************** ptr_t p; *** 283,289 **** ptr_t scan_limit; ptr_t target_limit = p + WORDS_TO_BYTES(hhdr -> hb_sz) - 1; ! if ((descr & DS_TAGS) == DS_LENGTH) { scan_limit = p + descr - sizeof(word); } else { scan_limit = target_limit + 1 - sizeof(word); --- 295,301 ---- ptr_t scan_limit; ptr_t target_limit = p + WORDS_TO_BYTES(hhdr -> hb_sz) - 1; ! if ((descr & GC_DS_TAGS) == GC_DS_LENGTH) { scan_limit = p + descr - sizeof(word); } else { scan_limit = target_limit + 1 - sizeof(word); *************** finalization_mark_proc * mp; *** 338,346 **** # endif GC_grow_table((struct hash_chain_entry ***)(&fo_head), &log_fo_table_size); ! # ifdef PRINTSTATS GC_printf1("Grew fo table to %lu entries\n", (unsigned long)(1 << log_fo_table_size)); # endif # ifndef THREADS ENABLE_SIGNALS(); --- 350,360 ---- # endif GC_grow_table((struct hash_chain_entry ***)(&fo_head), &log_fo_table_size); ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf1("Grew fo table to %lu entries\n", (unsigned long)(1 << log_fo_table_size)); + } # endif # ifndef THREADS ENABLE_SIGNALS(); *************** finalization_mark_proc * mp; *** 370,376 **** /* May not happen if we get a signal. But a high */ /* estimate will only make the table larger than */ /* necessary. */ ! # ifndef THREADS GC_free((GC_PTR)curr_fo); # endif } else { --- 384,390 ---- /* May not happen if we get a signal. But a high */ /* estimate will only make the table larger than */ /* necessary. */ ! # if !defined(THREADS) && !defined(DBG_HDRS_ALL) GC_free((GC_PTR)curr_fo); # endif } else { *************** finalization_mark_proc * mp; *** 406,440 **** GET_HDR(base, hhdr); if (0 == hhdr) { /* We won't collect it, hence finalizer wouldn't be run. */ - /* This is changed for gcj, but it will be in version 6.0 of the */ - /* standard collector distribution. It costs virtually nothing */ - /* here, but it's expensive to check in the hash synchronization */ - /* code, where it matters. -HB */ # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); # endif return; } ! # ifdef THREADS ! new_fo = (struct finalizable_object *) ! GC_generic_malloc_inner(sizeof(struct finalizable_object),NORMAL); ! # else ! new_fo = (struct finalizable_object *) ! GC_malloc(sizeof(struct finalizable_object)); ! # endif ! if (new_fo != 0) { ! new_fo -> fo_hidden_base = (word)HIDE_POINTER(base); ! new_fo -> fo_fn = fn; ! new_fo -> fo_client_data = (ptr_t)cd; ! new_fo -> fo_object_size = hhdr -> hb_sz; ! new_fo -> fo_mark_proc = mp; ! fo_set_next(new_fo, fo_head[index]); ! GC_fo_entries++; ! fo_head[index] = new_fo; ! } else { ! GC_finalization_failures++; } # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); --- 420,457 ---- GET_HDR(base, hhdr); if (0 == hhdr) { /* We won't collect it, hence finalizer wouldn't be run. */ # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); # endif return; } ! new_fo = (struct finalizable_object *) ! GC_INTERNAL_MALLOC(sizeof(struct finalizable_object),NORMAL); ! if (0 == new_fo) { ! # ifdef THREADS ! UNLOCK(); ! ENABLE_SIGNALS(); ! # endif ! new_fo = GC_oom_fn(sizeof(struct finalizable_object)); ! if (0 == new_fo) { ! GC_finalization_failures++; ! return; ! } ! /* It's not likely we'll make it here, but ... */ ! # ifdef THREADS ! DISABLE_SIGNALS(); ! LOCK(); ! # endif } + new_fo -> fo_hidden_base = (word)HIDE_POINTER(base); + new_fo -> fo_fn = fn; + new_fo -> fo_client_data = (ptr_t)cd; + new_fo -> fo_object_size = hhdr -> hb_sz; + new_fo -> fo_mark_proc = mp; + fo_set_next(new_fo, fo_head[index]); + GC_fo_entries++; + fo_head[index] = new_fo; # ifdef THREADS UNLOCK(); ENABLE_SIGNALS(); *************** finalization_mark_proc * mp; *** 492,497 **** --- 509,542 ---- ocd, GC_null_finalize_mark_proc); } + #ifndef NO_DEBUGGING + void GC_dump_finalization() + { + struct disappearing_link * curr_dl; + struct finalizable_object * curr_fo; + ptr_t real_ptr, real_link; + int dl_size = (log_dl_table_size == -1 ) ? 0 : (1 << log_dl_table_size); + int fo_size = (log_fo_table_size == -1 ) ? 0 : (1 << log_fo_table_size); + int i; + + GC_printf0("Disappearing links:\n"); + for (i = 0; i < dl_size; i++) { + for (curr_dl = dl_head[i]; curr_dl != 0; curr_dl = dl_next(curr_dl)) { + real_ptr = (ptr_t)REVEAL_POINTER(curr_dl -> dl_hidden_obj); + real_link = (ptr_t)REVEAL_POINTER(curr_dl -> dl_hidden_link); + GC_printf2("Object: 0x%lx, Link:0x%lx\n", real_ptr, real_link); + } + } + GC_printf0("Finalizers:\n"); + for (i = 0; i < fo_size; i++) { + for (curr_fo = fo_head[i]; curr_fo != 0; curr_fo = fo_next(curr_fo)) { + real_ptr = (ptr_t)REVEAL_POINTER(curr_fo -> fo_hidden_base); + GC_printf1("Finalizable object: 0x%lx\n", real_ptr); + } + } + } + #endif + /* Called with world stopped. Cause disappearing links to disappear, */ /* and invoke finalizers. */ void GC_finalize() *************** void GC_finalize() *** 529,537 **** } /* Mark all objects reachable via chains of 1 or more pointers */ /* from finalizable objects. */ ! # ifdef PRINTSTATS ! if (GC_mark_state != MS_NONE) ABORT("Bad mark state"); ! # endif for (i = 0; i < fo_size; i++) { for (curr_fo = fo_head[i]; curr_fo != 0; curr_fo = fo_next(curr_fo)) { real_ptr = (ptr_t)REVEAL_POINTER(curr_fo -> fo_hidden_base); --- 574,580 ---- } /* Mark all objects reachable via chains of 1 or more pointers */ /* from finalizable objects. */ ! GC_ASSERT(GC_mark_state == MS_NONE); for (i = 0; i < fo_size; i++) { for (curr_fo = fo_head[i]; curr_fo != 0; curr_fo = fo_next(curr_fo)) { real_ptr = (ptr_t)REVEAL_POINTER(curr_fo -> fo_hidden_base); *************** void GC_finalize() *** 574,584 **** GC_words_finalized += ALIGNED_WORDS(curr_fo -> fo_object_size) + ALIGNED_WORDS(sizeof(struct finalizable_object)); ! # ifdef PRINTSTATS ! if (!GC_is_marked((ptr_t)curr_fo)) { ! ABORT("GC_finalize: found accessible unmarked object\n"); ! } ! # endif curr_fo = next_fo; } else { prev_fo = curr_fo; --- 617,623 ---- GC_words_finalized += ALIGNED_WORDS(curr_fo -> fo_object_size) + ALIGNED_WORDS(sizeof(struct finalizable_object)); ! GC_ASSERT(GC_is_marked(GC_base((ptr_t)curr_fo))); curr_fo = next_fo; } else { prev_fo = curr_fo; *************** int GC_invoke_finalizers() *** 753,758 **** --- 792,816 ---- return count; } + void (* GC_finalizer_notifier)() = (void (*) GC_PROTO((void)))0; + + static GC_word last_finalizer_notification = 0; + + void GC_notify_or_invoke_finalizers GC_PROTO((void)) + { + if (GC_finalize_now == 0) return; + if (!GC_finalize_on_demand) { + (void) GC_invoke_finalizers(); + GC_ASSERT(GC_finalize_now == 0); + return; + } + if (GC_finalizer_notifier != (void (*) GC_PROTO((void)))0 + && last_finalizer_notification != GC_gc_no) { + last_finalizer_notification = GC_gc_no; + GC_finalizer_notifier(); + } + } + # ifdef __STDC__ GC_PTR GC_call_with_alloc_lock(GC_fn_type fn, GC_PTR client_data) *************** int GC_invoke_finalizers() *** 772,780 **** # endif result = (*fn)(client_data); # ifdef THREADS ! UNSET_LOCK_HOLDER(); UNLOCK(); ENABLE_SIGNALS(); # endif return(result); } --- 830,841 ---- # endif result = (*fn)(client_data); # ifdef THREADS ! # ifndef GC_ASSERTIONS ! UNSET_LOCK_HOLDER(); ! # endif /* o.w. UNLOCK() does it implicitly */ UNLOCK(); ENABLE_SIGNALS(); # endif return(result); } + diff -Nrc3pad gcc-3.0.4/boehm-gc/gc.h gcc-3.1/boehm-gc/gc.h *** gcc-3.0.4/boehm-gc/gc.h Tue Jun 20 01:04:58 2000 --- gcc-3.1/boehm-gc/gc.h Thu Jan 1 00:00:00 1970 *************** *** 1,804 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. - * Copyright 1996-1999 by Silicon Graphics. All rights reserved. - * Copyright 1999 by Hewlett-Packard Company. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - - /* - * Note that this defines a large number of tuning hooks, which can - * safely be ignored in nearly all cases. For normal use it suffices - * to call only GC_MALLOC and perhaps GC_REALLOC. - * For better performance, also look at GC_MALLOC_ATOMIC, and - * GC_enable_incremental. If you need an action to be performed - * immediately before an object is collected, look at GC_register_finalizer. - * If you are using Solaris threads, look at the end of this file. - * Everything else is best ignored unless you encounter performance - * problems. - */ - - #ifndef _GC_H - - # define _GC_H - # define __GC - # include - - #if defined(__CYGWIN32__) && defined(GC_USE_DLL) - #include "libgc_globals.h" - #endif - - #if defined(__MINGW32__) && defined(WIN32_THREADS) - # ifdef GC_BUILD - # define GC_API __declspec(dllexport) - # else - # define GC_API __declspec(dllimport) - # endif - #endif - - #if defined(_MSC_VER) && defined(_DLL) - # ifdef GC_BUILD - # define GC_API __declspec(dllexport) - # else - # define GC_API __declspec(dllimport) - # endif - #endif - - #if defined(__WATCOMC__) && defined(GC_DLL) - # ifdef GC_BUILD - # define GC_API extern __declspec(dllexport) - # else - # define GC_API extern __declspec(dllimport) - # endif - #endif - - #ifndef GC_API - #define GC_API extern - #endif - - # if defined(__STDC__) || defined(__cplusplus) - # define GC_PROTO(args) args - typedef void * GC_PTR; - # define GC_CONST const - # else - # define GC_PROTO(args) () - typedef char * GC_PTR; - # define GC_CONST - # endif - - # ifdef __cplusplus - extern "C" { - # endif - - - /* Define word and signed_word to be unsigned and signed types of the */ - /* size as char * or void *. There seems to be no way to do this */ - /* even semi-portably. The following is probably no better/worse */ - /* than almost anything else. */ - /* The ANSI standard suggests that size_t and ptr_diff_t might be */ - /* better choices. But those appear to have incorrect definitions */ - /* on may systems. Notably "typedef int size_t" seems to be both */ - /* frequent and WRONG. */ - typedef unsigned long GC_word; - typedef long GC_signed_word; - - /* Public read-only variables */ - - GC_API GC_word GC_gc_no;/* Counter incremented per collection. */ - /* Includes empty GCs at startup. */ - - - /* Public R/W variables */ - - GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested)); - /* When there is insufficient memory to satisfy */ - /* an allocation request, we return */ - /* (*GC_oom_fn)(). By default this just */ - /* returns 0. */ - /* If it returns, it must return 0 or a valid */ - /* pointer to a previously allocated heap */ - /* object. */ - - GC_API int GC_find_leak; - /* Do not actually garbage collect, but simply */ - /* report inaccessible memory that was not */ - /* deallocated with GC_free. Initial value */ - /* is determined by FIND_LEAK macro. */ - - GC_API int GC_quiet; /* Disable statistics output. Only matters if */ - /* collector has been compiled with statistics */ - /* enabled. This involves a performance cost, */ - /* and is thus not the default. */ - - GC_API int GC_finalize_on_demand; - /* If nonzero, finalizers will only be run in */ - /* response to an eplit GC_invoke_finalizers */ - /* call. The default is determined by whether */ - /* the FINALIZE_ON_DEMAND macro is defined */ - /* when the collector is built. */ - - GC_API int GC_java_finalization; - /* Mark objects reachable from finalizable */ - /* objects in a separate postpass. This makes */ - /* it a bit safer to use non-topologically- */ - /* ordered finalization. Default value is */ - /* determined by JAVA_FINALIZATION macro. */ - - GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */ - /* because it's not safe. */ - - GC_API int GC_dont_expand; - /* Dont expand heap unless explicitly requested */ - /* or forced to. */ - - GC_API int GC_use_entire_heap; - /* Causes the nonincremental collector to use the */ - /* entire heap before collecting. This was the only */ - /* option for GC versions < 5.0. This sometimes */ - /* results in more large block fragmentation, since */ - /* very larg blocks will tend to get broken up */ - /* during each GC cycle. It is likely to result in a */ - /* larger working set, but lower collection */ - /* frequencies, and hence fewer instructions executed */ - /* in the collector. */ - - GC_API int GC_full_freq; /* Number of partial collections between */ - /* full collections. Matters only if */ - /* GC_incremental is set. */ - /* Full collections are also triggered if */ - /* the collector detects a substantial */ - /* increase in the number of in-use heap */ - /* blocks. Values in the tens are now */ - /* perfectly reasonable, unlike for */ - /* earlier GC versions. */ - - GC_API GC_word GC_non_gc_bytes; - /* Bytes not considered candidates for collection. */ - /* Used only to control scheduling of collections. */ - - GC_API GC_word GC_free_space_divisor; - /* We try to make sure that we allocate at */ - /* least N/GC_free_space_divisor bytes between */ - /* collections, where N is the heap size plus */ - /* a rough estimate of the root set size. */ - /* Initially, GC_free_space_divisor = 4. */ - /* Increasing its value will use less space */ - /* but more collection time. Decreasing it */ - /* will appreciably decrease collection time */ - /* at the expense of space. */ - /* GC_free_space_divisor = 1 will effectively */ - /* disable collections. */ - - GC_API GC_word GC_max_retries; - /* The maximum number of GCs attempted before */ - /* reporting out of memory after heap */ - /* expansion fails. Initially 0. */ - - - GC_API char *GC_stackbottom; /* Cool end of user stack. */ - /* May be set in the client prior to */ - /* calling any GC_ routines. This */ - /* avoids some overhead, and */ - /* potentially some signals that can */ - /* confuse debuggers. Otherwise the */ - /* collector attempts to set it */ - /* automatically. */ - /* For multithreaded code, this is the */ - /* cold end of the stack for the */ - /* primordial thread. */ - - /* Public procedures */ - /* - * general purpose allocation routines, with roughly malloc calling conv. - * The atomic versions promise that no relevant pointers are contained - * in the object. The nonatomic versions guarantee that the new object - * is cleared. GC_malloc_stubborn promises that no changes to the object - * will occur after GC_end_stubborn_change has been called on the - * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object - * that is scanned for pointers to collectable objects, but is not itself - * collectable. GC_malloc_uncollectable and GC_free called on the resulting - * object implicitly update GC_non_gc_bytes appropriately. - */ - GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes)); - GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes)); - GC_API GC_PTR GC_malloc_uncollectable GC_PROTO((size_t size_in_bytes)); - GC_API GC_PTR GC_malloc_stubborn GC_PROTO((size_t size_in_bytes)); - - /* The following is only defined if the library has been suitably */ - /* compiled: */ - GC_API GC_PTR GC_malloc_atomic_uncollectable GC_PROTO((size_t size_in_bytes)); - - /* Explicitly deallocate an object. Dangerous if used incorrectly. */ - /* Requires a pointer to the base of an object. */ - /* If the argument is stubborn, it should not be changeable when freed. */ - /* An object should not be enable for finalization when it is */ - /* explicitly deallocated. */ - /* GC_free(0) is a no-op, as required by ANSI C for free. */ - GC_API void GC_free GC_PROTO((GC_PTR object_addr)); - - /* - * Stubborn objects may be changed only if the collector is explicitly informed. - * The collector is implicitly informed of coming change when such - * an object is first allocated. The following routines inform the - * collector that an object will no longer be changed, or that it will - * once again be changed. Only nonNIL pointer stores into the object - * are considered to be changes. The argument to GC_end_stubborn_change - * must be exacly the value returned by GC_malloc_stubborn or passed to - * GC_change_stubborn. (In the second case it may be an interior pointer - * within 512 bytes of the beginning of the objects.) - * There is a performance penalty for allowing more than - * one stubborn object to be changed at once, but it is acceptable to - * do so. The same applies to dropping stubborn objects that are still - * changeable. - */ - GC_API void GC_change_stubborn GC_PROTO((GC_PTR)); - GC_API void GC_end_stubborn_change GC_PROTO((GC_PTR)); - - /* Return a pointer to the base (lowest address) of an object given */ - /* a pointer to a location within the object. */ - /* Return 0 if displaced_pointer doesn't point to within a valid */ - /* object. */ - GC_API GC_PTR GC_base GC_PROTO((GC_PTR displaced_pointer)); - - /* Given a pointer to the base of an object, return its size in bytes. */ - /* The returned size may be slightly larger than what was originally */ - /* requested. */ - GC_API size_t GC_size GC_PROTO((GC_PTR object_addr)); - - /* For compatibility with C library. This is occasionally faster than */ - /* a malloc followed by a bcopy. But if you rely on that, either here */ - /* or with the standard C library, your code is broken. In my */ - /* opinion, it shouldn't have been invented, but now we're stuck. -HB */ - /* The resulting object has the same kind as the original. */ - /* If the argument is stubborn, the result will have changes enabled. */ - /* It is an error to have changes enabled for the original object. */ - /* Follows ANSI comventions for NULL old_object. */ - GC_API GC_PTR GC_realloc - GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes)); - - /* Explicitly increase the heap size. */ - /* Returns 0 on failure, 1 on success. */ - GC_API int GC_expand_hp GC_PROTO((size_t number_of_bytes)); - - /* Limit the heap size to n bytes. Useful when you're debugging, */ - /* especially on systems that don't handle running out of memory well. */ - /* n == 0 ==> unbounded. This is the default. */ - GC_API void GC_set_max_heap_size GC_PROTO((GC_word n)); - - /* Inform the collector that a certain section of statically allocated */ - /* memory contains no pointers to garbage collected memory. Thus it */ - /* need not be scanned. This is sometimes important if the application */ - /* maps large read/write files into the address space, which could be */ - /* mistaken for dynamic library data segments on some systems. */ - GC_API void GC_exclude_static_roots GC_PROTO((GC_PTR start, GC_PTR finish)); - - /* Clear the set of root segments. Wizards only. */ - GC_API void GC_clear_roots GC_PROTO((void)); - - /* Add a root segment. Wizards only. */ - GC_API void GC_add_roots GC_PROTO((char * low_address, - char * high_address_plus_1)); - - /* Add a displacement to the set of those considered valid by the */ - /* collector. GC_register_displacement(n) means that if p was returned */ - /* by GC_malloc, then (char *)p + n will be considered to be a valid */ - /* pointer to n. N must be small and less than the size of p. */ - /* (All pointers to the interior of objects from the stack are */ - /* considered valid in any case. This applies to heap objects and */ - /* static data.) */ - /* Preferably, this should be called before any other GC procedures. */ - /* Calling it later adds to the probability of excess memory */ - /* retention. */ - /* This is a no-op if the collector was compiled with recognition of */ - /* arbitrary interior pointers enabled, which is now the default. */ - GC_API void GC_register_displacement GC_PROTO((GC_word n)); - - /* The following version should be used if any debugging allocation is */ - /* being done. */ - GC_API void GC_debug_register_displacement GC_PROTO((GC_word n)); - - /* Explicitly trigger a full, world-stop collection. */ - GC_API void GC_gcollect GC_PROTO((void)); - - /* Trigger a full world-stopped collection. Abort the collection if */ - /* and when stop_func returns a nonzero value. Stop_func will be */ - /* called frequently, and should be reasonably fast. This works even */ - /* if virtual dirty bits, and hence incremental collection is not */ - /* available for this architecture. Collections can be aborted faster */ - /* than normal pause times for incremental collection. However, */ - /* aborted collections do no useful work; the next collection needs */ - /* to start from the beginning. */ - /* Return 0 if the collection was aborted, 1 if it succeeded. */ - typedef int (* GC_stop_func) GC_PROTO((void)); - GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func)); - - /* Return the number of bytes in the heap. Excludes collector private */ - /* data structures. Includes empty blocks and fragmentation loss. */ - /* Includes some pages that were allocated but never written. */ - GC_API size_t GC_get_heap_size GC_PROTO((void)); - - /* Return a lower bound on the number of free bytes in the heap. */ - GC_API size_t GC_get_free_bytes GC_PROTO((void)); - - /* Return the number of bytes allocated since the last collection. */ - GC_API size_t GC_get_bytes_since_gc GC_PROTO((void)); - - /* Enable incremental/generational collection. */ - /* Not advisable unless dirty bits are */ - /* available or most heap objects are */ - /* pointerfree(atomic) or immutable. */ - /* Don't use in leak finding mode. */ - /* Ignored if GC_dont_gc is true. */ - GC_API void GC_enable_incremental GC_PROTO((void)); - - /* Perform some garbage collection work, if appropriate. */ - /* Return 0 if there is no more work to be done. */ - /* Typically performs an amount of work corresponding roughly */ - /* to marking from one page. May do more work if further */ - /* progress requires it, e.g. if incremental collection is */ - /* disabled. It is reasonable to call this in a wait loop */ - /* until it returns 0. */ - GC_API int GC_collect_a_little GC_PROTO((void)); - - /* Allocate an object of size lb bytes. The client guarantees that */ - /* as long as the object is live, it will be referenced by a pointer */ - /* that points to somewhere within the first 256 bytes of the object. */ - /* (This should normally be declared volatile to prevent the compiler */ - /* from invalidating this assertion.) This routine is only useful */ - /* if a large array is being allocated. It reduces the chance of */ - /* accidentally retaining such an array as a result of scanning an */ - /* integer that happens to be an address inside the array. (Actually, */ - /* it reduces the chance of the allocator not finding space for such */ - /* an array, since it will try hard to avoid introducing such a false */ - /* reference.) On a SunOS 4.X or MS Windows system this is recommended */ - /* for arrays likely to be larger than 100K or so. For other systems, */ - /* or if the collector is not configured to recognize all interior */ - /* pointers, the threshold is normally much higher. */ - GC_API GC_PTR GC_malloc_ignore_off_page GC_PROTO((size_t lb)); - GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb)); - - #if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION >= 720 - # define GC_ADD_CALLER - # define GC_RETURN_ADDR (GC_word)__return_address - #endif - - #ifdef GC_ADD_CALLER - # define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__ - # define GC_EXTRA_PARAMS GC_word ra, GC_CONST char * s, int i - #else - # define GC_EXTRAS __FILE__, __LINE__ - # define GC_EXTRA_PARAMS GC_CONST char * s, int i - #endif - - /* Debugging (annotated) allocation. GC_gcollect will check */ - /* objects allocated in this way for overwrites, etc. */ - GC_API GC_PTR GC_debug_malloc - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API GC_PTR GC_debug_malloc_atomic - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API GC_PTR GC_debug_malloc_uncollectable - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API GC_PTR GC_debug_malloc_stubborn - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); - GC_API void GC_debug_free GC_PROTO((GC_PTR object_addr)); - GC_API GC_PTR GC_debug_realloc - GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes, - GC_EXTRA_PARAMS)); - - GC_API void GC_debug_change_stubborn GC_PROTO((GC_PTR)); - GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_PTR)); - # ifdef GC_DEBUG - # define GC_MALLOC(sz) GC_debug_malloc(sz, GC_EXTRAS) - # define GC_MALLOC_ATOMIC(sz) GC_debug_malloc_atomic(sz, GC_EXTRAS) - # define GC_MALLOC_UNCOLLECTABLE(sz) GC_debug_malloc_uncollectable(sz, \ - GC_EXTRAS) - # define GC_REALLOC(old, sz) GC_debug_realloc(old, sz, GC_EXTRAS) - # define GC_FREE(p) GC_debug_free(p) - # define GC_REGISTER_FINALIZER(p, f, d, of, od) \ - GC_debug_register_finalizer(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ - GC_debug_register_finalizer_ignore_self(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \ - GC_debug_register_finalizer_no_order(p, f, d, of, od) - # define GC_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS); - # define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p) - # define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p) - # define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \ - GC_general_register_disappearing_link(link, GC_base(obj)) - # define GC_REGISTER_DISPLACEMENT(n) GC_debug_register_displacement(n) - # else - # define GC_MALLOC(sz) GC_malloc(sz) - # define GC_MALLOC_ATOMIC(sz) GC_malloc_atomic(sz) - # define GC_MALLOC_UNCOLLECTABLE(sz) GC_malloc_uncollectable(sz) - # define GC_REALLOC(old, sz) GC_realloc(old, sz) - # define GC_FREE(p) GC_free(p) - # define GC_REGISTER_FINALIZER(p, f, d, of, od) \ - GC_register_finalizer(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ - GC_register_finalizer_ignore_self(p, f, d, of, od) - # define GC_REGISTER_FINALIZER_NO_ORDER(p, f, d, of, od) \ - GC_register_finalizer_no_order(p, f, d, of, od) - # define GC_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz) - # define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p) - # define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p) - # define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \ - GC_general_register_disappearing_link(link, obj) - # define GC_REGISTER_DISPLACEMENT(n) GC_register_displacement(n) - # endif - /* The following are included because they are often convenient, and */ - /* reduce the chance for a misspecifed size argument. But calls may */ - /* expand to something syntactically incorrect if t is a complicated */ - /* type expression. */ - # define GC_NEW(t) (t *)GC_MALLOC(sizeof (t)) - # define GC_NEW_ATOMIC(t) (t *)GC_MALLOC_ATOMIC(sizeof (t)) - # define GC_NEW_STUBBORN(t) (t *)GC_MALLOC_STUBBORN(sizeof (t)) - # define GC_NEW_UNCOLLECTABLE(t) (t *)GC_MALLOC_UNCOLLECTABLE(sizeof (t)) - - /* Finalization. Some of these primitives are grossly unsafe. */ - /* The idea is to make them both cheap, and sufficient to build */ - /* a safer layer, closer to PCedar finalization. */ - /* The interface represents my conclusions from a long discussion */ - /* with Alan Demers, Dan Greene, Carl Hauser, Barry Hayes, */ - /* Christian Jacobi, and Russ Atkinson. It's not perfect, and */ - /* probably nobody else agrees with it. Hans-J. Boehm 3/13/92 */ - typedef void (*GC_finalization_proc) - GC_PROTO((GC_PTR obj, GC_PTR client_data)); - - GC_API void GC_register_finalizer - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - GC_API void GC_debug_register_finalizer - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - /* When obj is no longer accessible, invoke */ - /* (*fn)(obj, cd). If a and b are inaccessible, and */ - /* a points to b (after disappearing links have been */ - /* made to disappear), then only a will be */ - /* finalized. (If this does not create any new */ - /* pointers to b, then b will be finalized after the */ - /* next collection.) Any finalizable object that */ - /* is reachable from itself by following one or more */ - /* pointers will not be finalized (or collected). */ - /* Thus cycles involving finalizable objects should */ - /* be avoided, or broken by disappearing links. */ - /* All but the last finalizer registered for an object */ - /* is ignored. */ - /* Finalization may be removed by passing 0 as fn. */ - /* Finalizers are implicitly unregistered just before */ - /* they are invoked. */ - /* The old finalizer and client data are stored in */ - /* *ofn and *ocd. */ - /* Fn is never invoked on an accessible object, */ - /* provided hidden pointers are converted to real */ - /* pointers only if the allocation lock is held, and */ - /* such conversions are not performed by finalization */ - /* routines. */ - /* If GC_register_finalizer is aborted as a result of */ - /* a signal, the object may be left with no */ - /* finalization, even if neither the old nor new */ - /* finalizer were NULL. */ - /* Obj should be the nonNULL starting address of an */ - /* object allocated by GC_malloc or friends. */ - /* Note that any garbage collectable object referenced */ - /* by cd will be considered accessible until the */ - /* finalizer is invoked. */ - - /* Another versions of the above follow. It ignores */ - /* self-cycles, i.e. pointers from a finalizable object to */ - /* itself. There is a stylistic argument that this is wrong, */ - /* but it's unavoidable for C++, since the compiler may */ - /* silently introduce these. It's also benign in that specific */ - /* case. */ - GC_API void GC_register_finalizer_ignore_self - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - GC_API void GC_debug_register_finalizer_ignore_self - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - - /* Another version of the above. It ignores all cycles. */ - /* It should probably only be used by Java implementations. */ - GC_API void GC_register_finalizer_no_order - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - GC_API void GC_debug_register_finalizer_no_order - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - - - /* The following routine may be used to break cycles between */ - /* finalizable objects, thus causing cyclic finalizable */ - /* objects to be finalized in the correct order. Standard */ - /* use involves calling GC_register_disappearing_link(&p), */ - /* where p is a pointer that is not followed by finalization */ - /* code, and should not be considered in determining */ - /* finalization order. */ - GC_API int GC_register_disappearing_link GC_PROTO((GC_PTR * /* link */)); - /* Link should point to a field of a heap allocated */ - /* object obj. *link will be cleared when obj is */ - /* found to be inaccessible. This happens BEFORE any */ - /* finalization code is invoked, and BEFORE any */ - /* decisions about finalization order are made. */ - /* This is useful in telling the finalizer that */ - /* some pointers are not essential for proper */ - /* finalization. This may avoid finalization cycles. */ - /* Note that obj may be resurrected by another */ - /* finalizer, and thus the clearing of *link may */ - /* be visible to non-finalization code. */ - /* There's an argument that an arbitrary action should */ - /* be allowed here, instead of just clearing a pointer. */ - /* But this causes problems if that action alters, or */ - /* examines connectivity. */ - /* Returns 1 if link was already registered, 0 */ - /* otherwise. */ - /* Only exists for backward compatibility. See below: */ - - GC_API int GC_general_register_disappearing_link - GC_PROTO((GC_PTR * /* link */, GC_PTR obj)); - /* A slight generalization of the above. *link is */ - /* cleared when obj first becomes inaccessible. This */ - /* can be used to implement weak pointers easily and */ - /* safely. Typically link will point to a location */ - /* holding a disguised pointer to obj. (A pointer */ - /* inside an "atomic" object is effectively */ - /* disguised.) In this way soft */ - /* pointers are broken before any object */ - /* reachable from them are finalized. Each link */ - /* May be registered only once, i.e. with one obj */ - /* value. This was added after a long email discussion */ - /* with John Ellis. */ - /* Obj must be a pointer to the first word of an object */ - /* we allocated. It is unsafe to explicitly deallocate */ - /* the object containing link. Explicitly deallocating */ - /* obj may or may not cause link to eventually be */ - /* cleared. */ - GC_API int GC_unregister_disappearing_link GC_PROTO((GC_PTR * /* link */)); - /* Returns 0 if link was not actually registered. */ - /* Undoes a registration by either of the above two */ - /* routines. */ - - /* Auxiliary fns to make finalization work correctly with displaced */ - /* pointers introduced by the debugging allocators. */ - GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data)); - GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data)); - - /* Returns !=0 if GC_invoke_finalizers has something to do. */ - GC_API int GC_should_invoke_finalizers GC_PROTO((void)); - - GC_API int GC_invoke_finalizers GC_PROTO((void)); - /* Run finalizers for all objects that are ready to */ - /* be finalized. Return the number of finalizers */ - /* that were run. Normally this is also called */ - /* implicitly during some allocations. If */ - /* GC-finalize_on_demand is nonzero, it must be called */ - /* explicitly. */ - - /* GC_set_warn_proc can be used to redirect or filter warning messages. */ - /* p may not be a NULL pointer. */ - typedef void (*GC_warn_proc) GC_PROTO((char *msg, GC_word arg)); - GC_API GC_warn_proc GC_set_warn_proc GC_PROTO((GC_warn_proc p)); - /* Returns old warning procedure. */ - - /* The following is intended to be used by a higher level */ - /* (e.g. cedar-like) finalization facility. It is expected */ - /* that finalization code will arrange for hidden pointers to */ - /* disappear. Otherwise objects can be accessed after they */ - /* have been collected. */ - /* Note that putting pointers in atomic objects or in */ - /* nonpointer slots of "typed" objects is equivalent to */ - /* disguising them in this way, and may have other advantages. */ - # if defined(I_HIDE_POINTERS) || defined(GC_I_HIDE_POINTERS) - typedef GC_word GC_hidden_pointer; - # define HIDE_POINTER(p) (~(GC_hidden_pointer)(p)) - # define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p))) - /* Converting a hidden pointer to a real pointer requires verifying */ - /* that the object still exists. This involves acquiring the */ - /* allocator lock to avoid a race with the collector. */ - # endif /* I_HIDE_POINTERS */ - - typedef GC_PTR (*GC_fn_type) GC_PROTO((GC_PTR client_data)); - GC_API GC_PTR GC_call_with_alloc_lock - GC_PROTO((GC_fn_type fn, GC_PTR client_data)); - - /* Check that p and q point to the same object. */ - /* Fail conspicuously if they don't. */ - /* Returns the first argument. */ - /* Succeeds if neither p nor q points to the heap. */ - /* May succeed if both p and q point to between heap objects. */ - GC_API GC_PTR GC_same_obj GC_PROTO((GC_PTR p, GC_PTR q)); - - /* Checked pointer pre- and post- increment operations. Note that */ - /* the second argument is in units of bytes, not multiples of the */ - /* object size. This should either be invoked from a macro, or the */ - /* call should be automatically generated. */ - GC_API GC_PTR GC_pre_incr GC_PROTO((GC_PTR *p, size_t how_much)); - GC_API GC_PTR GC_post_incr GC_PROTO((GC_PTR *p, size_t how_much)); - - /* Check that p is visible */ - /* to the collector as a possibly pointer containing location. */ - /* If it isn't fail conspicuously. */ - /* Returns the argument in all cases. May erroneously succeed */ - /* in hard cases. (This is intended for debugging use with */ - /* untyped allocations. The idea is that it should be possible, though */ - /* slow, to add such a call to all indirect pointer stores.) */ - /* Currently useless for multithreaded worlds. */ - GC_API GC_PTR GC_is_visible GC_PROTO((GC_PTR p)); - - /* Check that if p is a pointer to a heap page, then it points to */ - /* a valid displacement within a heap object. */ - /* Fail conspicuously if this property does not hold. */ - /* Uninteresting with ALL_INTERIOR_POINTERS. */ - /* Always returns its argument. */ - GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p)); - - /* Safer, but slow, pointer addition. Probably useful mainly with */ - /* a preprocessor. Useful only for heap pointers. */ - #ifdef GC_DEBUG - # define GC_PTR_ADD3(x, n, type_of_result) \ - ((type_of_result)GC_same_obj((x)+(n), (x))) - # define GC_PRE_INCR3(x, n, type_of_result) \ - ((type_of_result)GC_pre_incr(&(x), (n)*sizeof(*x)) - # define GC_POST_INCR2(x, type_of_result) \ - ((type_of_result)GC_post_incr(&(x), sizeof(*x)) - # ifdef __GNUC__ - # define GC_PTR_ADD(x, n) \ - GC_PTR_ADD3(x, n, typeof(x)) - # define GC_PRE_INCR(x, n) \ - GC_PRE_INCR3(x, n, typeof(x)) - # define GC_POST_INCR(x, n) \ - GC_POST_INCR3(x, typeof(x)) - # else - /* We can't do this right without typeof, which ANSI */ - /* decided was not sufficiently useful. Repeatedly */ - /* mentioning the arguments seems too dangerous to be */ - /* useful. So does not casting the result. */ - # define GC_PTR_ADD(x, n) ((x)+(n)) - # endif - #else /* !GC_DEBUG */ - # define GC_PTR_ADD3(x, n, type_of_result) ((x)+(n)) - # define GC_PTR_ADD(x, n) ((x)+(n)) - # define GC_PRE_INCR3(x, n, type_of_result) ((x) += (n)) - # define GC_PRE_INCR(x, n) ((x) += (n)) - # define GC_POST_INCR2(x, n, type_of_result) ((x)++) - # define GC_POST_INCR(x, n) ((x)++) - #endif - - /* Safer assignment of a pointer to a nonstack location. */ - #ifdef GC_DEBUG - # ifdef __STDC__ - # define GC_PTR_STORE(p, q) \ - (*(void **)GC_is_visible(p) = GC_is_valid_displacement(q)) - # else - # define GC_PTR_STORE(p, q) \ - (*(char **)GC_is_visible(p) = GC_is_valid_displacement(q)) - # endif - #else /* !GC_DEBUG */ - # define GC_PTR_STORE(p, q) *((p) = (q)) - #endif - - /* Fynctions called to report pointer checking errors */ - GC_API void (*GC_same_obj_print_proc) GC_PROTO((GC_PTR p, GC_PTR q)); - - GC_API void (*GC_is_valid_displacement_print_proc) - GC_PROTO((GC_PTR p)); - - GC_API void (*GC_is_visible_print_proc) - GC_PROTO((GC_PTR p)); - - #if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS) - # define SOLARIS_THREADS - #endif - - #ifdef SOLARIS_THREADS - /* We need to intercept calls to many of the threads primitives, so */ - /* that we can locate thread stacks and stop the world. */ - /* Note also that the collector cannot see thread specific data. */ - /* Thread specific data should generally consist of pointers to */ - /* uncollectable objects, which are deallocated using the destructor */ - /* facility in thr_keycreate. */ - # include - # include - int GC_thr_create(void *stack_base, size_t stack_size, - void *(*start_routine)(void *), void *arg, long flags, - thread_t *new_thread); - int GC_thr_join(thread_t wait_for, thread_t *departed, void **status); - int GC_thr_suspend(thread_t target_thread); - int GC_thr_continue(thread_t target_thread); - void * GC_dlopen(const char *path, int mode); - - # ifdef _SOLARIS_PTHREADS - # include - extern int GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void * (*thread_execp)(void *), void *arg); - extern int GC_pthread_join(pthread_t wait_for, void **status); - - # undef thread_t - - # define pthread_join GC_pthread_join - # define pthread_create GC_pthread_create - #endif - - # define thr_create GC_thr_create - # define thr_join GC_thr_join - # define thr_suspend GC_thr_suspend - # define thr_continue GC_thr_continue - # define dlopen GC_dlopen - - # endif /* SOLARIS_THREADS */ - - - #if !defined(USE_LD_WRAP) && \ - (defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS)) - /* We treat these similarly. */ - # include - # include - - int GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg); - int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); - int GC_pthread_join(pthread_t thread, void **retval); - - # define pthread_create GC_pthread_create - # define pthread_sigmask GC_pthread_sigmask - # define pthread_join GC_pthread_join - # define dlopen GC_dlopen - - #endif /* xxxxx_THREADS */ - - # if defined(PCR) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ - defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ - defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) - /* Any flavor of threads except SRC_M3. */ - /* This returns a list of objects, linked through their first */ - /* word. Its use can greatly reduce lock contention problems, since */ - /* the allocation lock can be acquired and released many fewer times. */ - /* lb must be large enough to hold the pointer field. */ - GC_PTR GC_malloc_many(size_t lb); - #define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */ - /* in returned list. */ - extern void GC_thr_init(); /* Needed for Solaris/X86 */ - - #endif /* THREADS && !SRC_M3 */ - - /* - * If you are planning on putting - * the collector in a SunOS 5 dynamic library, you need to call GC_INIT() - * from the statically loaded program section. - * This circumvents a Solaris 2.X (X<=4) linker bug. - */ - #if defined(sparc) || defined(__sparc) - # define GC_INIT() { extern end, etext; \ - GC_noop(&end, &etext); } - #else - # if defined(__CYGWIN32__) && defined(GC_USE_DLL) - /* - * Similarly gnu-win32 DLLs need explicit initialization - */ - # define GC_INIT() { GC_add_roots(DATASTART, DATAEND); } - # else - # define GC_INIT() - # endif - #endif - - #if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ - || defined(_WIN32) - /* win32S may not free all resources on process exit. */ - /* This explicitly deallocates the heap. */ - GC_API void GC_win32_free_heap (); - #endif - - #ifdef __cplusplus - } /* end of extern "C" */ - #endif - - #endif /* _GC_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc.mak gcc-3.1/boehm-gc/gc.mak *** gcc-3.0.4/boehm-gc/gc.mak Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/gc.mak Tue Oct 16 09:01:35 2001 *************** *** 1,5 **** # Microsoft Developer Studio Generated NMAKE File, Format Version 4.10 ! # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 --- 1,6 ---- # Microsoft Developer Studio Generated NMAKE File, Format Version 4.10 ! # This has been hand-edited way too many times. ! # A clean, manually generated makefile would be an improvement. # TARGTYPE "Win32 (x86) Application" 0x0101 # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 *************** CLEAN : *** 72,77 **** --- 73,80 ---- -@erase ".\Release\finalize.obj" -@erase ".\Release\finalize.sbr" -@erase ".\Release\gc.bsc" + -@erase ".\Release\gc_cpp.obj" + -@erase ".\Release\gc_cpp.sbr" -@erase ".\Release\gc.dll" -@erase ".\Release\gc.exp" -@erase ".\Release\gc.lib" *************** CLEAN : *** 111,120 **** CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D\ "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\Release/ CPP_SBRS=.\Release/ --- 114,123 ---- CPP=cl.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "SILENT" /D "GC_BUILD" /D\ "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "GC_WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\Release/ CPP_SBRS=.\Release/ *************** BSC32_SBRS= \ *** 155,160 **** --- 158,164 ---- ".\Release\dbg_mlc.sbr" \ ".\Release\dyn_load.sbr" \ ".\Release\finalize.sbr" \ + ".\Release\gc_cpp.sbr" \ ".\Release\headers.sbr" \ ".\Release\mach_dep.sbr" \ ".\Release\malloc.sbr" \ *************** LINK32_OBJS= \ *** 192,197 **** --- 196,202 ---- ".\Release\dbg_mlc.obj" \ ".\Release\dyn_load.obj" \ ".\Release\finalize.obj" \ + ".\Release\gc_cpp.obj" \ ".\Release\headers.obj" \ ".\Release\mach_dep.obj" \ ".\Release\malloc.obj" \ *************** CLEAN : *** 245,250 **** --- 250,257 ---- -@erase ".\Debug\dyn_load.sbr" -@erase ".\Debug\finalize.obj" -@erase ".\Debug\finalize.sbr" + -@erase ".\Debug\gc_cpp.obj" + -@erase ".\Debug\gc_cpp.sbr" -@erase ".\Debug\gc.bsc" -@erase ".\Debug\gc.dll" -@erase ".\Debug\gc.exp" *************** CLEAN : *** 289,298 **** CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "SILENT" /D "GC_BUILD"\ /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/"\ /Fd"$(INTDIR)/" /c CPP_OBJS=.\Debug/ CPP_SBRS=.\Debug/ --- 296,305 ---- CPP=cl.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I include /D "_DEBUG" /D "SILENT" /D "GC_BUILD" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I include /D "_DEBUG" /D "SILENT" /D "GC_BUILD"\ /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D\ ! "GC_WIN32_THREADS" /FR"$(INTDIR)/" /Fp"$(INTDIR)/gc.pch" /YX /Fo"$(INTDIR)/"\ /Fd"$(INTDIR)/" /c CPP_OBJS=.\Debug/ CPP_SBRS=.\Debug/ *************** BSC32_SBRS= \ *** 334,339 **** --- 341,347 ---- ".\Debug\dbg_mlc.sbr" \ ".\Debug\dyn_load.sbr" \ ".\Debug\finalize.sbr" \ + ".\Debug\gc_cpp.sbr" \ ".\Debug\headers.sbr" \ ".\Debug\mach_dep.sbr" \ ".\Debug\malloc.sbr" \ *************** LINK32_OBJS= \ *** 371,376 **** --- 379,385 ---- ".\Debug\dbg_mlc.obj" \ ".\Debug\dyn_load.obj" \ ".\Debug\finalize.obj" \ + ".\Debug\gc_cpp.obj" \ ".\Debug\headers.obj" \ ".\Debug\mach_dep.obj" \ ".\Debug\malloc.obj" \ *************** CLEAN : *** 416,426 **** "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ ! "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\gctest\Release/ CPP_SBRS=.\. --- 425,438 ---- "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + test.c : tests\test.c + copy tests\test.c test.c + CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I include /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ ! "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\gctest\Release/ CPP_SBRS=.\. *************** CLEAN : *** 504,512 **** CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\ ! /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "WIN32_THREADS" /FR"$(INTDIR)/"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\gctest\Debug/ CPP_SBRS=.\gctest\Debug/ --- 516,524 ---- CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c ! # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I include /D "_DEBUG" /D "WIN32" /D "_WINDOWS"\ ! /D "ALL_INTERIOR_POINTERS" /D "__STDC__" /D "GC_WIN32_THREADS" /FR"$(INTDIR)/"\ /Fp"$(INTDIR)/gctest.pch" /YX /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\gctest\Debug/ CPP_SBRS=.\gctest\Debug/ *************** CLEAN : *** 596,602 **** CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\cord\Release/ CPP_SBRS=.\. --- 608,614 ---- CPP=cl.exe # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "." /I include /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D\ "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX /Fo"$(INTDIR)/" /c CPP_OBJS=.\cord\Release/ CPP_SBRS=.\. *************** CLEAN : *** 688,694 **** CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D\ "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX\ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\cord\Debug/ --- 700,706 ---- CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /YX /c ! CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /I include /D "_DEBUG" /D "WIN32" /D\ "_WINDOWS" /D "ALL_INTERIOR_POINTERS" /Fp"$(INTDIR)/cord.pch" /YX\ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c CPP_OBJS=.\cord\Debug/ *************** LINK32_OBJS= \ *** 763,777 **** ################################################################################ # Begin Source File SOURCE=.\reclaim.c !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_RECLA=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ --- 775,839 ---- ################################################################################ # Begin Source File + SOURCE=.\gc_cpp.cpp + + !IF "$(CFG)" == "gc - Win32 Release" + + DEP_CPP_RECLA=\ + ".\include\private\gcconfig.h"\ + ".\include\gc.h"\ + ".\include\private\gc_hdrs.h"\ + ".\include\private\gc_priv.h"\ + ".\include\gc_cpp.h"\ + {$(INCLUDE)}"\sys\TYPES.H"\ + + NODEP_CPP_RECLA=\ + ".\th\PCR_Th.h"\ + ".\th\PCR_ThCrSec.h"\ + ".\th\PCR_ThCtl.h"\ + + + ".\Release\gc_cpp.obj" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + ".\Release\gc_cpp.sbr" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + + !ELSEIF "$(CFG)" == "gc - Win32 Debug" + + DEP_CPP_RECLA=\ + ".\include\private\gcconfig.h"\ + ".\include\gc.h"\ + ".\include\private\gc_hdrs.h"\ + ".\include\private\gc_priv.h"\ + ".\include\gc_cpp.h"\ + {$(INCLUDE)}"\sys\TYPES.H"\ + + NODEP_CPP_RECLA=\ + ".\th\PCR_Th.h"\ + ".\th\PCR_ThCrSec.h"\ + ".\th\PCR_ThCtl.h"\ + + + ".\Debug\gc_cpp.obj" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + ".\Debug\gc_cpp.sbr" : $(SOURCE) $(DEP_CPP_RECLA) "$(INTDIR)" + + + !ENDIF + + # End Source File + ################################################################################ + # Begin Source File + SOURCE=.\reclaim.c !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_RECLA=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ *************** NODEP_CPP_RECLA=\ *** 788,797 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_RECLA=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ --- 850,859 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_RECLA=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_RECLA=\ *************** NODEP_CPP_RECLA=\ *** 808,813 **** --- 870,876 ---- !ENDIF # End Source File + ################################################################################ # Begin Source File *************** SOURCE=.\os_dep.c *** 816,825 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OS_DE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 879,888 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OS_DE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** NODEP_CPP_OS_DE=\ *** 840,849 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OS_DE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 903,912 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OS_DE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** SOURCE=.\misc.c *** 872,881 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MISC_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ --- 935,944 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MISC_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ *************** NODEP_CPP_MISC_=\ *** 893,902 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MISC_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ --- 956,965 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MISC_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MISC_=\ *************** SOURCE=.\mark_rts.c *** 922,931 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ --- 985,994 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ *************** NODEP_CPP_MARK_=\ *** 942,951 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ --- 1005,1014 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_=\ *************** SOURCE=.\mach_dep.c *** 970,979 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MACH_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ --- 1033,1042 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MACH_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ *************** NODEP_CPP_MACH_=\ *** 990,999 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MACH_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ --- 1053,1062 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MACH_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MACH_=\ *************** SOURCE=.\headers.c *** 1018,1027 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_HEADE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ --- 1081,1090 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_HEADE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ *************** NODEP_CPP_HEADE=\ *** 1038,1047 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_HEADE=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ --- 1101,1110 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_HEADE=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_HEADE=\ *************** SOURCE=.\alloc.c *** 1066,1075 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLOC=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ --- 1129,1138 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLOC=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ *************** NODEP_CPP_ALLOC=\ *** 1086,1095 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLOC=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ --- 1149,1158 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLOC=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLOC=\ *************** SOURCE=.\allchblk.c *** 1114,1123 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLCH=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ --- 1177,1186 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_ALLCH=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ *************** NODEP_CPP_ALLCH=\ *** 1134,1143 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLCH=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ --- 1197,1206 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_ALLCH=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_ALLCH=\ *************** SOURCE=.\stubborn.c *** 1162,1171 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_STUBB=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ --- 1225,1234 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_STUBB=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ *************** NODEP_CPP_STUBB=\ *** 1182,1191 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_STUBB=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ --- 1245,1254 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_STUBB=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_STUBB=\ *************** SOURCE=.\obj_map.c *** 1210,1219 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OBJ_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ --- 1273,1282 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_OBJ_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ *************** NODEP_CPP_OBJ_M=\ *** 1230,1239 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OBJ_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ --- 1293,1302 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_OBJ_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_OBJ_M=\ *************** SOURCE=.\new_hblk.c *** 1258,1267 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_NEW_H=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ --- 1321,1330 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_NEW_H=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ *************** NODEP_CPP_NEW_H=\ *** 1278,1287 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_NEW_H=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ --- 1341,1350 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_NEW_H=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_NEW_H=\ *************** SOURCE=.\mark.c *** 1306,1316 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ --- 1369,1380 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MARK_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ *************** NODEP_CPP_MARK_C=\ *** 1327,1337 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ --- 1391,1402 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MARK_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MARK_C=\ *************** SOURCE=.\malloc.c *** 1356,1365 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLO=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ --- 1421,1430 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLO=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ *************** NODEP_CPP_MALLO=\ *** 1376,1385 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLO=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ --- 1441,1450 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLO=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLO=\ *************** SOURCE=.\mallocx.c *** 1404,1413 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLX=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ --- 1469,1478 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_MALLX=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ *************** NODEP_CPP_MALLX=\ *** 1424,1433 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLX=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ --- 1489,1498 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_MALLX=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_MALLX=\ *************** SOURCE=.\finalize.c *** 1452,1462 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_FINAL=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ --- 1517,1528 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_FINAL=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ *************** NODEP_CPP_FINAL=\ *** 1473,1483 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_FINAL=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ --- 1539,1550 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_FINAL=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_FINAL=\ *************** SOURCE=.\dbg_mlc.c *** 1502,1511 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DBG_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ --- 1569,1578 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DBG_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ *************** NODEP_CPP_DBG_M=\ *** 1522,1531 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DBG_M=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ --- 1589,1598 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DBG_M=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_DBG_M=\ *************** SOURCE=.\blacklst.c *** 1550,1559 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_BLACK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ --- 1617,1626 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_BLACK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ *************** NODEP_CPP_BLACK=\ *** 1570,1579 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_BLACK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ --- 1637,1646 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_BLACK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_BLACK=\ *************** SOURCE=.\typd_mlc.c *** 1598,1609 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_TYPD_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ ! ".\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ --- 1665,1677 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_TYPD_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ ! ".\include\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ *************** NODEP_CPP_TYPD_=\ *** 1620,1631 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_TYPD_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ ! ".\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ --- 1688,1700 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_TYPD_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ ! ".\include\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TYPD_=\ *************** SOURCE=.\ptr_chck.c *** 1650,1660 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_PTR_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ --- 1719,1730 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_PTR_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ *************** NODEP_CPP_PTR_C=\ *** 1671,1681 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_PTR_C=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_mark.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ --- 1741,1752 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_PTR_C=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_pmark.h"\ ! ".\include\gc_mark.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_PTR_C=\ *************** SOURCE=.\dyn_load.c *** 1700,1709 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DYN_L=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 1771,1780 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_DYN_L=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** NODEP_CPP_DYN_L=\ *** 1723,1732 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DYN_L=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ --- 1794,1803 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_DYN_L=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\STAT.H"\ {$(INCLUDE)}"\sys\TYPES.H"\ *************** SOURCE=.\win32_threads.c *** 1754,1763 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_WIN32=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ --- 1825,1834 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_WIN32=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ *************** NODEP_CPP_WIN32=\ *** 1774,1783 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_WIN32=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ --- 1845,1854 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_WIN32=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_WIN32=\ *************** SOURCE=.\checksums.c *** 1802,1811 **** !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_CHECK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ --- 1873,1882 ---- !IF "$(CFG)" == "gc - Win32 Release" DEP_CPP_CHECK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ *************** NODEP_CPP_CHECK=\ *** 1822,1831 **** !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_CHECK=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ --- 1893,1902 ---- !ELSEIF "$(CFG)" == "gc - Win32 Debug" DEP_CPP_CHECK=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_CHECK=\ *************** NODEP_CPP_CHECK=\ *** 1876,1888 **** ################################################################################ # Begin Source File ! SOURCE=.\test.c DEP_CPP_TEST_=\ ! ".\gcconfig.h"\ ! ".\gc.h"\ ! ".\gc_hdrs.h"\ ! ".\gc_priv.h"\ ! ".\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TEST_=\ --- 1947,1959 ---- ################################################################################ # Begin Source File ! SOURCE=.\tests\test.c DEP_CPP_TEST_=\ ! ".\include\private\gcconfig.h"\ ! ".\include\gc.h"\ ! ".\include\private\gc_hdrs.h"\ ! ".\include\private\gc_priv.h"\ ! ".\include\gc_typed.h"\ {$(INCLUDE)}"\sys\TYPES.H"\ NODEP_CPP_TEST_=\ *************** NODEP_CPP_TEST_=\ *** 1944,1956 **** SOURCE=.\cord\de_win.c DEP_CPP_DE_WI=\ ! ".\cord\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_DE_WI=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2015,2027 ---- SOURCE=.\cord\de_win.c DEP_CPP_DE_WI=\ ! ".\include\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_DE_WI=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" *************** NODEP_CPP_DE_WI=\ *** 1975,1987 **** SOURCE=.\cord\de.c DEP_CPP_DE_C2e=\ ! ".\cord\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_DE_C2e=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2046,2058 ---- SOURCE=.\cord\de.c DEP_CPP_DE_C2e=\ ! ".\include\cord.h"\ ".\cord\de_cmds.h"\ ".\cord\de_win.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_DE_C2e=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" *************** NODEP_CPP_DE_C2e=\ *** 2006,2017 **** SOURCE=.\cord\cordxtra.c DEP_CPP_CORDX=\ ! ".\cord\cord.h"\ ! ".\cord\ec.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_CORDX=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2077,2088 ---- SOURCE=.\cord\cordxtra.c DEP_CPP_CORDX=\ ! ".\include\cord.h"\ ! ".\include\ec.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_CORDX=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" *************** NODEP_CPP_CORDX=\ *** 2036,2046 **** SOURCE=.\cord\cordbscs.c DEP_CPP_CORDB=\ ! ".\cord\cord.h"\ ! ".\cord\private\cord_pos.h"\ NODEP_CPP_CORDB=\ ! ".\cord\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" --- 2107,2117 ---- SOURCE=.\cord\cordbscs.c DEP_CPP_CORDB=\ ! ".\include\cord.h"\ ! ".\include\private\cord_pos.h"\ NODEP_CPP_CORDB=\ ! ".\include\gc.h"\ !IF "$(CFG)" == "cord - Win32 Release" diff -Nrc3pad gcc-3.0.4/boehm-gc/gc.man gcc-3.1/boehm-gc/gc.man *** gcc-3.0.4/boehm-gc/gc.man Wed Jun 30 12:43:33 1999 --- gcc-3.1/boehm-gc/gc.man Thu Jan 1 00:00:00 1970 *************** *** 1,80 **** - .TH GC_MALLOC 1L "12 February 1996" - .SH NAME - GC_malloc, GC_malloc_atomic, GC_free, GC_realloc, GC_enable_incremental, GC_register_finalizer, GC_malloc_ignore_off_page, GC_malloc_atomic_ignore_off_page, GC_set_warn_proc \- Garbage collecting malloc replacement - .SH SYNOPSIS - #include "gc.h" - .br - # define malloc(n) GC_malloc(n) - .br - ... malloc(...) ... - .br - .sp - cc ... gc.a - .LP - .SH DESCRIPTION - .I GC_malloc - and - .I GC_free - are plug-in replacements for standard malloc and free. However, - .I - GC_malloc - will attempt to reclaim inaccessible space automatically by invoking a conservative garbage collector at appropriate points. The collector traverses all data structures accessible by following pointers from the machines registers, stack(s), data, and bss segments. Inaccessible structures will be reclaimed. A machine word is considered to be a valid pointer if it is an address inside an object allocated by - .I - GC_malloc - or friends. - .LP - See the documentation in the include file gc_cpp.h for an alternate, C++ specific interface to the garbage collector. - .LP - Unlike the standard implementations of malloc, - .I - GC_malloc - clears the newly allocated storage. - .I - GC_malloc_atomic - does not. Furthermore, it informs the collector that the resulting object will never contain any pointers, and should therefore not be scanned by the collector. - .LP - .I - GC_free - can be used to deallocate objects, but its use is optional, and generally discouraged. - .I - GC_realloc - has the standard realloc semantics. It preserves pointer-free-ness. - .I - GC_register_finalizer - allows for registration of functions that are invoked when an object becomes inaccessible. - .LP - The garbage collector tries to avoid allocating memory at locations that already appear to be referenced before allocation. (Such apparent ``pointers'' are usually large integers and the like that just happen to look like an address.) This may make it hard to allocate very large objects. An attempt to do so may generate a warning. - .LP - .I - GC_malloc_ignore_off_page - and - .I - GC_malloc_atomic_ignore_off_page - inform the collector that the client code will always maintain a pointer to near the beginning of the object (within the first 512 bytes), and that pointers beyond that can be ignored by the collector. This makes it much easier for the collector to place large objects. These are recommended for large object allocation. (Objects expected to be larger than about 100KBytes should be allocated this way.) - .LP - It is also possible to use the collector to find storage leaks in programs destined to be run with standard malloc/free. The collector can be compiled for thread-safe operation. Unlike standard malloc, it is safe to call malloc after a previous malloc call was interrupted by a signal, provided the original malloc call is not resumed. - .LP - The collector may, on rare occasion produce warning messages. On UNIX machines these appear on stderr. Warning messages can be filtered, redirected, or ignored with - .I - GC_set_warn_proc. - This is recommended for production code. See gc.h for details. - .LP - Debugging versions of many of the above routines are provided as macros. Their names are identical to the above, but consist of all capital letters. If GC_DEBUG is defined before gc.h is included, these routines do additional checking, and allow the leak detecting version of the collector to produce slightly more useful output. Without GC_DEBUG defined, they behave exactly like the lower-case versions. - .LP - On some machines, collection will be performed incrementally after a call to - .I - GC_enable_incremental. - This may temporarily write protect pages in the heap. See the README file for more information on how this interacts with system calls that write to the heap. - .LP - Other facilities not discussed here include limited facilities to support incremental collection on machines without appropriate VM support, provisions for providing more explicit object layout information to the garbage collector, more direct support for ``weak'' pointers, support for ``abortable'' garbage collections during idle time, etc. - .LP - .SH "SEE ALSO" - The README and gc.h files in the distribution. More detailed definitions of the functions exported by the collector are given there. (The above list is not complete.) - .LP - Boehm, H., and M. Weiser, "Garbage Collection in an Uncooperative Environment", - \fISoftware Practice & Experience\fP, September 1988, pp. 807-820. - .LP - The malloc(3) man page. - .LP - .SH AUTHOR - Hans-J. Boehm (boehm@parc.xerox.com). Some of the code was written by others, most notably Alan Demers. --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_alloc.h gcc-3.1/boehm-gc/gc_alloc.h *** gcc-3.0.4/boehm-gc/gc_alloc.h Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/gc_alloc.h Thu Jan 1 00:00:00 1970 *************** *** 1,380 **** - /* - * Copyright (c) 1996-1998 by Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - - // - // This is a C++ header file that is intended to replace the SGI STL - // alloc.h. This assumes SGI STL version < 3.0. - // - // This assumes the collector has been compiled with -DATOMIC_UNCOLLECTABLE - // and -DALL_INTERIOR_POINTERS. We also recommend - // -DREDIRECT_MALLOC=GC_uncollectable_malloc. - // - // Some of this could be faster in the explicit deallocation case. In particular, - // we spend too much time clearing objects on the free lists. That could be avoided. - // - // This uses template classes with static members, and hence does not work - // with g++ 2.7.2 and earlier. - // - - #include "gc.h" - - #ifndef GC_ALLOC_H - - #define GC_ALLOC_H - #define __ALLOC_H // Prevent inclusion of the default version. Ugly. - #define __SGI_STL_ALLOC_H - #define __SGI_STL_INTERNAL_ALLOC_H - - #ifndef __ALLOC - # define __ALLOC alloc - #endif - - #include - #include - - // The following is just replicated from the conventional SGI alloc.h: - - template - class simple_alloc { - - public: - static T *allocate(size_t n) - { return 0 == n? 0 : (T*) alloc::allocate(n * sizeof (T)); } - static T *allocate(void) - { return (T*) alloc::allocate(sizeof (T)); } - static void deallocate(T *p, size_t n) - { if (0 != n) alloc::deallocate(p, n * sizeof (T)); } - static void deallocate(T *p) - { alloc::deallocate(p, sizeof (T)); } - }; - - #include "gc.h" - - // The following need to match collector data structures. - // We can't include gc_priv.h, since that pulls in way too much stuff. - // This should eventually be factored out into another include file. - - extern "C" { - extern void ** const GC_objfreelist_ptr; - extern void ** const GC_aobjfreelist_ptr; - extern void ** const GC_uobjfreelist_ptr; - extern void ** const GC_auobjfreelist_ptr; - - extern void GC_incr_words_allocd(size_t words); - extern void GC_incr_mem_freed(size_t words); - - extern char * GC_generic_malloc_words_small(size_t word, int kind); - } - - // Object kinds; must match PTRFREE, NORMAL, UNCOLLECTABLE, and - // AUNCOLLECTABLE in gc_priv.h. - - enum { GC_PTRFREE = 0, GC_NORMAL = 1, GC_UNCOLLECTABLE = 2, - GC_AUNCOLLECTABLE = 3 }; - - enum { GC_max_fast_bytes = 255 }; - - enum { GC_bytes_per_word = sizeof(char *) }; - - enum { GC_byte_alignment = 8 }; - - enum { GC_word_alignment = GC_byte_alignment/GC_bytes_per_word }; - - inline void * &GC_obj_link(void * p) - { return *(void **)p; } - - // Compute a number of words >= n+1 bytes. - // The +1 allows for pointers one past the end. - inline size_t GC_round_up(size_t n) - { - return ((n + GC_byte_alignment)/GC_byte_alignment)*GC_word_alignment; - } - - // The same but don't allow for extra byte. - inline size_t GC_round_up_uncollectable(size_t n) - { - return ((n + GC_byte_alignment - 1)/GC_byte_alignment)*GC_word_alignment; - } - - template - class GC_aux_template { - public: - // File local count of allocated words. Occasionally this is - // added into the global count. A separate count is necessary since the - // real one must be updated with a procedure call. - static size_t GC_words_recently_allocd; - - // Same for uncollectable mmory. Not yet reflected in either - // GC_words_recently_allocd or GC_non_gc_bytes. - static size_t GC_uncollectable_words_recently_allocd; - - // Similar counter for explicitly deallocated memory. - static size_t GC_mem_recently_freed; - - // Again for uncollectable memory. - static size_t GC_uncollectable_mem_recently_freed; - - static void * GC_out_of_line_malloc(size_t nwords, int kind); - }; - - template - size_t GC_aux_template::GC_words_recently_allocd = 0; - - template - size_t GC_aux_template::GC_uncollectable_words_recently_allocd = 0; - - template - size_t GC_aux_template::GC_mem_recently_freed = 0; - - template - size_t GC_aux_template::GC_uncollectable_mem_recently_freed = 0; - - template - void * GC_aux_template::GC_out_of_line_malloc(size_t nwords, int kind) - { - GC_words_recently_allocd += GC_uncollectable_words_recently_allocd; - GC_non_gc_bytes += - GC_bytes_per_word * GC_uncollectable_words_recently_allocd; - GC_uncollectable_words_recently_allocd = 0; - - GC_mem_recently_freed += GC_uncollectable_mem_recently_freed; - GC_non_gc_bytes -= - GC_bytes_per_word * GC_uncollectable_mem_recently_freed; - GC_uncollectable_mem_recently_freed = 0; - - GC_incr_words_allocd(GC_words_recently_allocd); - GC_words_recently_allocd = 0; - - GC_incr_mem_freed(GC_mem_recently_freed); - GC_mem_recently_freed = 0; - - return GC_generic_malloc_words_small(nwords, kind); - } - - typedef GC_aux_template<0> GC_aux; - - // A fast, single-threaded, garbage-collected allocator - // We assume the first word will be immediately overwritten. - // In this version, deallocation is not a noop, and explicit - // deallocation is likely to help performance. - template - class single_client_gc_alloc_template { - public: - static void * allocate(size_t n) - { - size_t nwords = GC_round_up(n); - void ** flh; - void * op; - - if (n > GC_max_fast_bytes) return GC_malloc(n); - flh = GC_objfreelist_ptr + nwords; - if (0 == (op = *flh)) { - return GC_aux::GC_out_of_line_malloc(nwords, GC_NORMAL); - } - *flh = GC_obj_link(op); - GC_aux::GC_words_recently_allocd += nwords; - return op; - } - static void * ptr_free_allocate(size_t n) - { - size_t nwords = GC_round_up(n); - void ** flh; - void * op; - - if (n > GC_max_fast_bytes) return GC_malloc_atomic(n); - flh = GC_aobjfreelist_ptr + nwords; - if (0 == (op = *flh)) { - return GC_aux::GC_out_of_line_malloc(nwords, GC_PTRFREE); - } - *flh = GC_obj_link(op); - GC_aux::GC_words_recently_allocd += nwords; - return op; - } - static void deallocate(void *p, size_t n) - { - size_t nwords = GC_round_up(n); - void ** flh; - - if (n > GC_max_fast_bytes) { - GC_free(p); - } else { - flh = GC_objfreelist_ptr + nwords; - GC_obj_link(p) = *flh; - memset((char *)p + GC_bytes_per_word, 0, - GC_bytes_per_word * (nwords - 1)); - *flh = p; - GC_aux::GC_mem_recently_freed += nwords; - } - } - static void ptr_free_deallocate(void *p, size_t n) - { - size_t nwords = GC_round_up(n); - void ** flh; - - if (n > GC_max_fast_bytes) { - GC_free(p); - } else { - flh = GC_aobjfreelist_ptr + nwords; - GC_obj_link(p) = *flh; - *flh = p; - GC_aux::GC_mem_recently_freed += nwords; - } - } - }; - - typedef single_client_gc_alloc_template<0> single_client_gc_alloc; - - // Once more, for uncollectable objects. - template - class single_client_alloc_template { - public: - static void * allocate(size_t n) - { - size_t nwords = GC_round_up_uncollectable(n); - void ** flh; - void * op; - - if (n > GC_max_fast_bytes) return GC_malloc_uncollectable(n); - flh = GC_uobjfreelist_ptr + nwords; - if (0 == (op = *flh)) { - return GC_aux::GC_out_of_line_malloc(nwords, GC_UNCOLLECTABLE); - } - *flh = GC_obj_link(op); - GC_aux::GC_uncollectable_words_recently_allocd += nwords; - return op; - } - static void * ptr_free_allocate(size_t n) - { - size_t nwords = GC_round_up_uncollectable(n); - void ** flh; - void * op; - - if (n > GC_max_fast_bytes) return GC_malloc_atomic_uncollectable(n); - flh = GC_auobjfreelist_ptr + nwords; - if (0 == (op = *flh)) { - return GC_aux::GC_out_of_line_malloc(nwords, GC_AUNCOLLECTABLE); - } - *flh = GC_obj_link(op); - GC_aux::GC_uncollectable_words_recently_allocd += nwords; - return op; - } - static void deallocate(void *p, size_t n) - { - size_t nwords = GC_round_up_uncollectable(n); - void ** flh; - - if (n > GC_max_fast_bytes) { - GC_free(p); - } else { - flh = GC_uobjfreelist_ptr + nwords; - GC_obj_link(p) = *flh; - *flh = p; - GC_aux::GC_uncollectable_mem_recently_freed += nwords; - } - } - static void ptr_free_deallocate(void *p, size_t n) - { - size_t nwords = GC_round_up_uncollectable(n); - void ** flh; - - if (n > GC_max_fast_bytes) { - GC_free(p); - } else { - flh = GC_auobjfreelist_ptr + nwords; - GC_obj_link(p) = *flh; - *flh = p; - GC_aux::GC_uncollectable_mem_recently_freed += nwords; - } - } - }; - - typedef single_client_alloc_template<0> single_client_alloc; - - template < int dummy > - class gc_alloc_template { - public: - static void * allocate(size_t n) { return GC_malloc(n); } - static void * ptr_free_allocate(size_t n) - { return GC_malloc_atomic(n); } - static void deallocate(void *, size_t) { } - static void ptr_free_deallocate(void *, size_t) { } - }; - - typedef gc_alloc_template < 0 > gc_alloc; - - template < int dummy > - class alloc_template { - public: - static void * allocate(size_t n) { return GC_malloc_uncollectable(n); } - static void * ptr_free_allocate(size_t n) - { return GC_malloc_atomic_uncollectable(n); } - static void deallocate(void *p, size_t) { GC_free(p); } - static void ptr_free_deallocate(void *p, size_t) { GC_free(p); } - }; - - typedef alloc_template < 0 > alloc; - - #ifdef _SGI_SOURCE - - // We want to specialize simple_alloc so that it does the right thing - // for all pointerfree types. At the moment there is no portable way to - // even approximate that. The following approximation should work for - // SGI compilers, and perhaps some others. - - # define __GC_SPECIALIZE(T,alloc) \ - class simple_alloc { \ - public: \ - static T *allocate(size_t n) \ - { return 0 == n? 0 : \ - (T*) alloc::ptr_free_allocate(n * sizeof (T)); } \ - static T *allocate(void) \ - { return (T*) alloc::ptr_free_allocate(sizeof (T)); } \ - static void deallocate(T *p, size_t n) \ - { if (0 != n) alloc::ptr_free_deallocate(p, n * sizeof (T)); } \ - static void deallocate(T *p) \ - { alloc::ptr_free_deallocate(p, sizeof (T)); } \ - }; - - __GC_SPECIALIZE(char, gc_alloc) - __GC_SPECIALIZE(int, gc_alloc) - __GC_SPECIALIZE(unsigned, gc_alloc) - __GC_SPECIALIZE(float, gc_alloc) - __GC_SPECIALIZE(double, gc_alloc) - - __GC_SPECIALIZE(char, alloc) - __GC_SPECIALIZE(int, alloc) - __GC_SPECIALIZE(unsigned, alloc) - __GC_SPECIALIZE(float, alloc) - __GC_SPECIALIZE(double, alloc) - - __GC_SPECIALIZE(char, single_client_gc_alloc) - __GC_SPECIALIZE(int, single_client_gc_alloc) - __GC_SPECIALIZE(unsigned, single_client_gc_alloc) - __GC_SPECIALIZE(float, single_client_gc_alloc) - __GC_SPECIALIZE(double, single_client_gc_alloc) - - __GC_SPECIALIZE(char, single_client_alloc) - __GC_SPECIALIZE(int, single_client_alloc) - __GC_SPECIALIZE(unsigned, single_client_alloc) - __GC_SPECIALIZE(float, single_client_alloc) - __GC_SPECIALIZE(double, single_client_alloc) - - #ifdef __STL_USE_STD_ALLOCATORS - - ???copy stuff from stl_alloc.h or remove it to a different file ??? - - #endif /* __STL_USE_STD_ALLOCATORS */ - - #endif /* _SGI_SOURCE */ - - #endif /* GC_ALLOC_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_cpp.cc gcc-3.1/boehm-gc/gc_cpp.cc *** gcc-3.0.4/boehm-gc/gc_cpp.cc Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/gc_cpp.cc Fri Aug 17 18:30:45 2001 *************** Authors: John R. Ellis and Jesse Hull *** 26,52 **** #include "gc_cpp.h" void* operator new( size_t size ) { return GC_MALLOC_UNCOLLECTABLE( size );} void operator delete( void* obj ) { GC_FREE( obj );} - #ifdef _MSC_VER - // This new operator is used by VC++ in case of Debug builds ! - void* operator new( size_t size, - int ,//nBlockUse, - const char * szFileName, - int nLine - ) { - # ifndef GC_DEBUG - return GC_malloc_uncollectable( size ); - # else - return GC_debug_malloc_uncollectable(size, szFileName, nLine); - # endif - } - #endif - #ifdef OPERATOR_NEW_ARRAY void* operator new[]( size_t size ) { --- 26,39 ---- #include "gc_cpp.h" + #ifndef _MSC_VER + /* In the Visual C++ case, we moved this into the header. */ void* operator new( size_t size ) { return GC_MALLOC_UNCOLLECTABLE( size );} void operator delete( void* obj ) { GC_FREE( obj );} #ifdef OPERATOR_NEW_ARRAY void* operator new[]( size_t size ) { *************** void operator delete[]( void* obj ) { *** 57,60 **** --- 44,49 ---- #endif /* OPERATOR_NEW_ARRAY */ + #endif /* _MSC_VER */ + diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_cpp.cpp gcc-3.1/boehm-gc/gc_cpp.cpp *** gcc-3.0.4/boehm-gc/gc_cpp.cpp Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/gc_cpp.cpp Fri Aug 17 18:30:45 2001 *************** *** 0 **** --- 1,2 ---- + // Visual C++ seems to prefer a .cpp extension to .cc + #include "gc_cpp.cc" diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_cpp.h gcc-3.1/boehm-gc/gc_cpp.h *** gcc-3.0.4/boehm-gc/gc_cpp.h Sun May 7 00:43:49 2000 --- gcc-3.1/boehm-gc/gc_cpp.h Thu Jan 1 00:00:00 1970 *************** *** 1,299 **** - #ifndef GC_CPP_H - #define GC_CPP_H - /**************************************************************************** - Copyright (c) 1994 by Xerox Corporation. All rights reserved. - - THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - - Permission is hereby granted to use or copy this program for any - purpose, provided the above notices are retained on all copies. - Permission to modify the code and to distribute modified code is - granted, provided the above notices are retained, and a notice that - the code was modified is included with the above copyright notice. - **************************************************************************** - - C++ Interface to the Boehm Collector - - John R. Ellis and Jesse Hull - - This interface provides access to the Boehm collector. It provides - basic facilities similar to those described in "Safe, Efficient - Garbage Collection for C++", by John R. Elis and David L. Detlefs - (ftp://ftp.parc.xerox.com/pub/ellis/gc). - - All heap-allocated objects are either "collectable" or - "uncollectable". Programs must explicitly delete uncollectable - objects, whereas the garbage collector will automatically delete - collectable objects when it discovers them to be inaccessible. - Collectable objects may freely point at uncollectable objects and vice - versa. - - Objects allocated with the built-in "::operator new" are uncollectable. - - Objects derived from class "gc" are collectable. For example: - - class A: public gc {...}; - A* a = new A; // a is collectable. - - Collectable instances of non-class types can be allocated using the GC - (or UseGC) placement: - - typedef int A[ 10 ]; - A* a = new (GC) A; - - Uncollectable instances of classes derived from "gc" can be allocated - using the NoGC placement: - - class A: public gc {...}; - A* a = new (NoGC) A; // a is uncollectable. - - Both uncollectable and collectable objects can be explicitly deleted - with "delete", which invokes an object's destructors and frees its - storage immediately. - - A collectable object may have a clean-up function, which will be - invoked when the collector discovers the object to be inaccessible. - An object derived from "gc_cleanup" or containing a member derived - from "gc_cleanup" has a default clean-up function that invokes the - object's destructors. Explicit clean-up functions may be specified as - an additional placement argument: - - A* a = ::new (GC, MyCleanup) A; - - An object is considered "accessible" by the collector if it can be - reached by a path of pointers from static variables, automatic - variables of active functions, or from some object with clean-up - enabled; pointers from an object to itself are ignored. - - Thus, if objects A and B both have clean-up functions, and A points at - B, B is considered accessible. After A's clean-up is invoked and its - storage released, B will then become inaccessible and will have its - clean-up invoked. If A points at B and B points to A, forming a - cycle, then that's considered a storage leak, and neither will be - collectable. See the interface gc.h for low-level facilities for - handling such cycles of objects with clean-up. - - The collector cannot guarrantee that it will find all inaccessible - objects. In practice, it finds almost all of them. - - - Cautions: - - 1. Be sure the collector has been augmented with "make c++". - - 2. If your compiler supports the new "operator new[]" syntax, then - add -DOPERATOR_NEW_ARRAY to the Makefile. - - If your compiler doesn't support "operator new[]", beware that an - array of type T, where T is derived from "gc", may or may not be - allocated as a collectable object (it depends on the compiler). Use - the explicit GC placement to make the array collectable. For example: - - class A: public gc {...}; - A* a1 = new A[ 10 ]; // collectable or uncollectable? - A* a2 = new (GC) A[ 10 ]; // collectable - - 3. The destructors of collectable arrays of objects derived from - "gc_cleanup" will not be invoked properly. For example: - - class A: public gc_cleanup {...}; - A* a = new (GC) A[ 10 ]; // destructors not invoked correctly - - Typically, only the destructor for the first element of the array will - be invoked when the array is garbage-collected. To get all the - destructors of any array executed, you must supply an explicit - clean-up function: - - A* a = new (GC, MyCleanUp) A[ 10 ]; - - (Implementing clean-up of arrays correctly, portably, and in a way - that preserves the correct exception semantics requires a language - extension, e.g. the "gc" keyword.) - - 4. Compiler bugs: - - * Solaris 2's CC (SC3.0) doesn't implement t->~T() correctly, so the - destructors of classes derived from gc_cleanup won't be invoked. - You'll have to explicitly register a clean-up function with - new-placement syntax. - - * Evidently cfront 3.0 does not allow destructors to be explicitly - invoked using the ANSI-conforming syntax t->~T(). If you're using - cfront 3.0, you'll have to comment out the class gc_cleanup, which - uses explicit invocation. - - 5. GC name conflicts: - - Many other systems seem to use the identifier "GC" as an abbreviation - for "Graphics Context". Since version 5.0, GC placement has been replaced - by UseGC. GC is an alias for UseGC, unless GC_NAME_CONFLICT is defined. - - ****************************************************************************/ - - #include "gc.h" - - #ifndef THINK_CPLUS - #define _cdecl - #endif - - #if ! defined( OPERATOR_NEW_ARRAY ) \ - && (__BORLANDC__ >= 0x450 || (__GNUC__ >= 2 && __GNUC_MINOR__ >= 6) \ - || __WATCOMC__ >= 1050) - # define OPERATOR_NEW_ARRAY - #endif - - enum GCPlacement {UseGC, - #ifndef GC_NAME_CONFLICT - GC=UseGC, - #endif - NoGC, PointerFreeGC}; - - class gc {public: - inline void* operator new( size_t size ); - inline void* operator new( size_t size, GCPlacement gcp ); - inline void operator delete( void* obj ); - - #ifdef OPERATOR_NEW_ARRAY - inline void* operator new[]( size_t size ); - inline void* operator new[]( size_t size, GCPlacement gcp ); - inline void operator delete[]( void* obj ); - #endif /* OPERATOR_NEW_ARRAY */ - }; - /* - Instances of classes derived from "gc" will be allocated in the - collected heap by default, unless an explicit NoGC placement is - specified. */ - - class gc_cleanup: virtual public gc {public: - inline gc_cleanup(); - inline virtual ~gc_cleanup(); - private: - inline static void _cdecl cleanup( void* obj, void* clientData );}; - /* - Instances of classes derived from "gc_cleanup" will be allocated - in the collected heap by default. When the collector discovers an - inaccessible object derived from "gc_cleanup" or containing a - member derived from "gc_cleanup", its destructors will be - invoked. */ - - extern "C" {typedef void (*GCCleanUpFunc)( void* obj, void* clientData );} - - inline void* operator new( - size_t size, - GCPlacement gcp, - GCCleanUpFunc cleanup = 0, - void* clientData = 0 ); - /* - Allocates a collectable or uncollected object, according to the - value of "gcp". - - For collectable objects, if "cleanup" is non-null, then when the - allocated object "obj" becomes inaccessible, the collector will - invoke the function "cleanup( obj, clientData )" but will not - invoke the object's destructors. It is an error to explicitly - delete an object allocated with a non-null "cleanup". - - It is an error to specify a non-null "cleanup" with NoGC or for - classes derived from "gc_cleanup" or containing members derived - from "gc_cleanup". */ - - #ifdef OPERATOR_NEW_ARRAY - - inline void* operator new[]( - size_t size, - GCPlacement gcp, - GCCleanUpFunc cleanup = 0, - void* clientData = 0 ); - /* - The operator new for arrays, identical to the above. */ - - #endif /* OPERATOR_NEW_ARRAY */ - - /**************************************************************************** - - Inline implementation - - ****************************************************************************/ - - inline void* gc::operator new( size_t size ) { - return GC_MALLOC( size );} - - inline void* gc::operator new( size_t size, GCPlacement gcp ) { - if (gcp == UseGC) - return GC_MALLOC( size ); - else if (gcp == PointerFreeGC) - return GC_MALLOC_ATOMIC( size ); - else - return GC_MALLOC_UNCOLLECTABLE( size );} - - inline void gc::operator delete( void* obj ) { - GC_FREE( obj );} - - - #ifdef OPERATOR_NEW_ARRAY - - inline void* gc::operator new[]( size_t size ) { - return gc::operator new( size );} - - inline void* gc::operator new[]( size_t size, GCPlacement gcp ) { - return gc::operator new( size, gcp );} - - inline void gc::operator delete[]( void* obj ) { - gc::operator delete( obj );} - - #endif /* OPERATOR_NEW_ARRAY */ - - - inline gc_cleanup::~gc_cleanup() { - GC_REGISTER_FINALIZER_IGNORE_SELF( GC_base(this), 0, 0, 0, 0 );} - - inline void gc_cleanup::cleanup( void* obj, void* displ ) { - ((gc_cleanup*) ((char*) obj + (ptrdiff_t) displ))->~gc_cleanup();} - - inline gc_cleanup::gc_cleanup() { - GC_finalization_proc oldProc; - void* oldData; - void* base = GC_base( (void *) this ); - if (0 != base) { - GC_REGISTER_FINALIZER_IGNORE_SELF( - base, (GC_finalization_proc)cleanup, (void*) ((char*) this - (char*) base), - &oldProc, &oldData ); - if (0 != oldProc) { - GC_REGISTER_FINALIZER_IGNORE_SELF( base, oldProc, oldData, 0, 0 );}}} - - inline void* operator new( - size_t size, - GCPlacement gcp, - GCCleanUpFunc cleanup, - void* clientData ) - { - void* obj; - - if (gcp == UseGC) { - obj = GC_MALLOC( size ); - if (cleanup != 0) - GC_REGISTER_FINALIZER_IGNORE_SELF( - obj, cleanup, clientData, 0, 0 );} - else if (gcp == PointerFreeGC) { - obj = GC_MALLOC_ATOMIC( size );} - else { - obj = GC_MALLOC_UNCOLLECTABLE( size );}; - return obj;} - - - #ifdef OPERATOR_NEW_ARRAY - - inline void* operator new[]( - size_t size, - GCPlacement gcp, - GCCleanUpFunc cleanup, - void* clientData ) - { - return ::operator new( size, gcp, cleanup, clientData );} - - #endif /* OPERATOR_NEW_ARRAY */ - - - #endif /* GC_CPP_H */ - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_dlopen.c gcc-3.1/boehm-gc/gc_dlopen.c *** gcc-3.0.4/boehm-gc/gc_dlopen.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/gc_dlopen.c Tue Oct 16 09:01:35 2001 *************** *** 0 **** --- 1,95 ---- + /* + * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 1997 by Silicon Graphics. All rights reserved. + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + * Original author: Bill Janssen + * Heavily modified by Hans Boehm and others + */ + + /* + * This used to be in dyn_load.c. It was extracted into a separate file + * to avoid having to link against libdl.{a,so} if the client doesn't call + * dlopen. -HB + */ + + #include "private/gc_priv.h" + + # if defined(GC_PTHREADS) || defined(GC_SOLARIS_THREADS) + + # if defined(dlopen) && !defined(GC_USE_LD_WRAP) + /* To support various threads pkgs, gc.h interposes on dlopen by */ + /* defining "dlopen" to be "GC_dlopen", which is implemented below. */ + /* However, both GC_FirstDLOpenedLinkMap() and GC_dlopen() use the */ + /* real system dlopen() in their implementation. We first remove */ + /* gc.h's dlopen definition and restore it later, after GC_dlopen(). */ + # undef dlopen + # endif + + /* Make sure we're not in the middle of a collection, and make */ + /* sure we don't start any. Returns previous value of GC_dont_gc. */ + /* This is invoked prior to a dlopen call to avoid synchronization */ + /* issues. We can't just acquire the allocation lock, since startup */ + /* code in dlopen may try to allocate. */ + /* This solution risks heap growth in the presence of many dlopen */ + /* calls in either a multithreaded environment, or if the library */ + /* initialization code allocates substantial amounts of GC'ed memory. */ + /* But I don't know of a better solution. */ + /* This can still deadlock if the client explicitly starts a GC */ + /* during the dlopen. He shouldn't do that. */ + static GC_bool disable_gc_for_dlopen() + { + GC_bool result; + LOCK(); + result = GC_dont_gc; + while (GC_incremental && GC_collection_in_progress()) { + GC_collect_a_little_inner(1000); + } + GC_dont_gc = TRUE; + UNLOCK(); + return(result); + } + + /* Redefine dlopen to guarantee mutual exclusion with */ + /* GC_register_dynamic_libraries. */ + /* Should probably happen for other operating systems, too. */ + + #include + + #ifdef GC_USE_LD_WRAP + void * __wrap_dlopen(const char *path, int mode) + #else + void * GC_dlopen(path, mode) + GC_CONST char * path; + int mode; + #endif + { + void * result; + GC_bool dont_gc_save; + + # ifndef USE_PROC_FOR_LIBRARIES + dont_gc_save = disable_gc_for_dlopen(); + # endif + # ifdef GC_USE_LD_WRAP + result = (void *)__real_dlopen(path, mode); + # else + result = dlopen(path, mode); + # endif + # ifndef USE_PROC_FOR_LIBRARIES + GC_dont_gc = dont_gc_save; + # endif + return(result); + } + # endif /* GC_PTHREADS || GC_SOLARIS_THREADS ... */ + + + diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_hdrs.h gcc-3.1/boehm-gc/gc_hdrs.h *** gcc-3.0.4/boehm-gc/gc_hdrs.h Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/gc_hdrs.h Thu Jan 1 00:00:00 1970 *************** *** 1,303 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - /* Boehm, July 11, 1995 11:54 am PDT */ - # ifndef GC_HEADERS_H - # define GC_HEADERS_H - typedef struct hblkhdr hdr; - - # if CPP_WORDSZ != 32 && CPP_WORDSZ < 36 - --> Get a real machine. - # endif - - /* - * The 2 level tree data structure that is used to find block headers. - * If there are more than 32 bits in a pointer, the top level is a hash - * table. - * - * This defines HDR, GET_HDR, and SET_HDR, the main macros used to - * retrieve and set object headers. We also define some variants to - * retrieve 2 unrelated headers in interleaved fashion. This - * slightly improves scheduling. - * - * Since 5.0 alpha 5, we can also take advantage of a header lookup - * cache. This is a locally declared direct mapped cache, used inside - * the marker. The HC_GET_HDR and HC_GET_HDR2 macros use and maintain this - * cache. Assuming we get reasonable hit rates, this shaves a few - * memory references from each pointer validation. - */ - - # if CPP_WORDSZ > 32 - # define HASH_TL - # endif - - /* Define appropriate out-degrees for each of the two tree levels */ - # ifdef SMALL_CONFIG - # define LOG_BOTTOM_SZ 11 - /* Keep top index size reasonable with smaller blocks. */ - # else - # define LOG_BOTTOM_SZ 10 - # endif - # ifndef HASH_TL - # define LOG_TOP_SZ (WORDSZ - LOG_BOTTOM_SZ - LOG_HBLKSIZE) - # else - # define LOG_TOP_SZ 11 - # endif - # define TOP_SZ (1 << LOG_TOP_SZ) - # define BOTTOM_SZ (1 << LOG_BOTTOM_SZ) - - #ifndef SMALL_CONFIG - # define USE_HDR_CACHE - #endif - - /* #define COUNT_HDR_CACHE_HITS */ - - extern hdr * GC_invalid_header; /* header for an imaginary block */ - /* containing no objects. */ - - - /* Check whether p and corresponding hhdr point to long or invalid */ - /* object. If so, advance them to */ - /* beginning of block, or set hhdr to GC_invalid_header. */ - #define ADVANCE(p, hhdr, source) \ - if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { \ - p = GC_FIND_START(p, hhdr, (word)source); \ - if (p == 0) { \ - hhdr = GC_invalid_header; \ - } else { \ - hhdr = GC_find_header(p); \ - } \ - } - - #ifdef USE_HDR_CACHE - - # ifdef COUNT_HDR_CACHE_HITS - extern word GC_hdr_cache_hits; - extern word GC_hdr_cache_misses; - # define HC_HIT() ++GC_hdr_cache_hits - # define HC_MISS() ++GC_hdr_cache_misses - # else - # define HC_HIT() - # define HC_MISS() - # endif - - typedef struct hce { - word block_addr; /* right shifted by LOG_HBLKSIZE */ - hdr * hce_hdr; - } hdr_cache_entry; - - # define HDR_CACHE_SIZE 8 /* power of 2 */ - - # define DECLARE_HDR_CACHE \ - hdr_cache_entry hdr_cache[HDR_CACHE_SIZE] - - # define INIT_HDR_CACHE BZERO(hdr_cache, sizeof(hdr_cache)); - - # define HCE(h) hdr_cache + (((word)(h) >> LOG_HBLKSIZE) & (HDR_CACHE_SIZE-1)) - - # define HCE_VALID_FOR(hce,h) ((hce) -> block_addr == \ - ((word)(h) >> LOG_HBLKSIZE)) - - # define HCE_HDR(h) ((hce) -> hce_hdr) - - - /* Analogous to GET_HDR, except that in the case of large objects, it */ - /* Returns the header for the object beginning, and updates p. */ - /* Returns &GC_bad_header instead of 0. All of this saves a branch */ - /* in the fast path. */ - # define HC_GET_HDR(p, hhdr, source) \ - { \ - hdr_cache_entry * hce = HCE(p); \ - if (HCE_VALID_FOR(hce, p)) { \ - HC_HIT(); \ - hhdr = hce -> hce_hdr; \ - } else { \ - HC_MISS(); \ - GET_HDR(p, hhdr); \ - ADVANCE(p, hhdr, source); \ - hce -> block_addr = (word)(p) >> LOG_HBLKSIZE; \ - hce -> hce_hdr = hhdr; \ - } \ - } - - # define HC_GET_HDR2(p1, hhdr1, source1, p2, hhdr2, source2) \ - { \ - hdr_cache_entry * hce1 = HCE(p1); \ - hdr_cache_entry * hce2 = HCE(p2); \ - if (HCE_VALID_FOR(hce1, p1)) { \ - HC_HIT(); \ - hhdr1 = hce1 -> hce_hdr; \ - } else { \ - HC_MISS(); \ - GET_HDR(p1, hhdr1); \ - ADVANCE(p1, hhdr1, source1); \ - hce1 -> block_addr = (word)(p1) >> LOG_HBLKSIZE; \ - hce1 -> hce_hdr = hhdr1; \ - } \ - if (HCE_VALID_FOR(hce2, p2)) { \ - HC_HIT(); \ - hhdr2 = hce2 -> hce_hdr; \ - } else { \ - HC_MISS(); \ - GET_HDR(p2, hhdr2); \ - ADVANCE(p2, hhdr2, source2); \ - hce2 -> block_addr = (word)(p2) >> LOG_HBLKSIZE; \ - hce2 -> hce_hdr = hhdr2; \ - } \ - } - - #else /* !USE_HDR_CACHE */ - - # define DECLARE_HDR_CACHE - - # define INIT_HDR_CACHE - - # define HC_GET_HDR(p, hhdr, source) \ - { \ - GET_HDR(p, hhdr); \ - ADVANCE(p, hhdr, source); \ - } - - # define HC_GET_HDR2(p1, hhdr1, source1, p2, hhdr2, source2) \ - { \ - GET_HDR2(p1, hhdr1, p2, hhdr2); \ - ADVANCE(p1, hhdr1, source1); \ - ADVANCE(p2, hhdr2, source2); \ - } - - #endif - - typedef struct bi { - hdr * index[BOTTOM_SZ]; - /* - * The bottom level index contains one of three kinds of values: - * 0 means we're not responsible for this block, - * or this is a block other than the first one in a free block. - * 1 < (long)X <= MAX_JUMP means the block starts at least - * X * HBLKSIZE bytes before the current address. - * A valid pointer points to a hdr structure. (The above can't be - * valid pointers due to the GET_MEM return convention.) - */ - struct bi * asc_link; /* All indices are linked in */ - /* ascending order... */ - struct bi * desc_link; /* ... and in descending order. */ - word key; /* high order address bits. */ - # ifdef HASH_TL - struct bi * hash_link; /* Hash chain link. */ - # endif - } bottom_index; - - /* extern bottom_index GC_all_nils; - really part of GC_arrays */ - - /* extern bottom_index * GC_top_index []; - really part of GC_arrays */ - /* Each entry points to a bottom_index. */ - /* On a 32 bit machine, it points to */ - /* the index for a set of high order */ - /* bits equal to the index. For longer */ - /* addresses, we hash the high order */ - /* bits to compute the index in */ - /* GC_top_index, and each entry points */ - /* to a hash chain. */ - /* The last entry in each chain is */ - /* GC_all_nils. */ - - - # define MAX_JUMP (HBLKSIZE - 1) - - # define HDR_FROM_BI(bi, p) \ - ((bi)->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)]) - # ifndef HASH_TL - # define BI(p) (GC_top_index \ - [(word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE)]) - # define HDR_INNER(p) HDR_FROM_BI(BI(p),p) - # ifdef SMALL_CONFIG - # define HDR(p) GC_find_header((ptr_t)(p)) - # else - # define HDR(p) HDR_INNER(p) - # endif - # define GET_BI(p, bottom_indx) (bottom_indx) = BI(p) - # define GET_HDR(p, hhdr) (hhdr) = HDR(p) - # define SET_HDR(p, hhdr) HDR_INNER(p) = (hhdr) - # define GET_HDR_ADDR(p, ha) (ha) = &(HDR_INNER(p)) - # define GET_HDR2(p1, hhdr1, p2, hhdr2) \ - { GET_HDR(p1, hhdr1); GET_HDR(p2, hhdr2); } - # else /* hash */ - /* Hash function for tree top level */ - # define TL_HASH(hi) ((hi) & (TOP_SZ - 1)) - /* Set bottom_indx to point to the bottom index for address p */ - # define GET_BI(p, bottom_indx) \ - { \ - register word hi = \ - (word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE); \ - register bottom_index * _bi = GC_top_index[TL_HASH(hi)]; \ - \ - while (_bi -> key != hi && _bi != GC_all_nils) \ - _bi = _bi -> hash_link; \ - (bottom_indx) = _bi; \ - } - # define GET_HDR_ADDR(p, ha) \ - { \ - register bottom_index * bi; \ - \ - GET_BI(p, bi); \ - (ha) = &(HDR_FROM_BI(bi, p)); \ - } - # define GET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \ - (hhdr) = *_ha; } - # define SET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \ - *_ha = (hhdr); } - # define HDR(p) GC_find_header((ptr_t)(p)) - /* And some interleaved versions for two pointers at once. */ - /* This hopefully helps scheduling on processors like IA64. */ - # define GET_BI2(p1, bottom_indx1, p2, bottom_indx2) \ - { \ - register word hi1 = \ - (word)(p1) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE); \ - register word hi2 = \ - (word)(p2) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE); \ - register bottom_index * _bi1 = GC_top_index[TL_HASH(hi1)]; \ - register bottom_index * _bi2 = GC_top_index[TL_HASH(hi2)]; \ - \ - while (_bi1 -> key != hi1 && _bi1 != GC_all_nils) \ - _bi1 = _bi1 -> hash_link; \ - while (_bi2 -> key != hi2 && _bi2 != GC_all_nils) \ - _bi2 = _bi2 -> hash_link; \ - (bottom_indx1) = _bi1; \ - (bottom_indx2) = _bi2; \ - } - # define GET_HDR_ADDR2(p1, ha1, p2, ha2) \ - { \ - register bottom_index * bi1; \ - register bottom_index * bi2; \ - \ - GET_BI2(p1, bi1, p2, bi2); \ - (ha1) = &(HDR_FROM_BI(bi1, p1)); \ - (ha2) = &(HDR_FROM_BI(bi2, p2)); \ - } - # define GET_HDR2(p1, hhdr1, p2, hhdr2) \ - { register hdr ** _ha1; \ - register hdr ** _ha2; \ - GET_HDR_ADDR2(p1, _ha1, p2, _ha2); \ - (hhdr1) = *_ha1; \ - (hhdr2) = *_ha2; \ - } - # endif - - /* Is the result a forwarding address to someplace closer to the */ - /* beginning of the block or NIL? */ - # define IS_FORWARDING_ADDR_OR_NIL(hhdr) ((unsigned long) (hhdr) <= MAX_JUMP) - - /* Get an HBLKSIZE aligned address closer to the beginning of the block */ - /* h. Assumes hhdr == HDR(h) and IS_FORWARDING_ADDR(hhdr). */ - # define FORWARDED_ADDR(h, hhdr) ((struct hblk *)(h) - (unsigned long)(hhdr)) - # endif /* GC_HEADERS_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_mark.h gcc-3.1/boehm-gc/gc_mark.h *** gcc-3.0.4/boehm-gc/gc_mark.h Wed Aug 2 19:46:07 2000 --- gcc-3.1/boehm-gc/gc_mark.h Thu Jan 1 00:00:00 1970 *************** *** 1,346 **** - /* - * Copyright (c) 1991-1994, 2000 by Xerox Corporation. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - * - */ - /* Boehm, November 7, 1994 4:56 pm PST */ - - /* - * Declarations of mark stack. Needed by marker and client supplied mark - * routines. To be included after gc_priv.h. - */ - #ifndef GC_MARK_H - # define GC_MARK_H - - # ifdef KEEP_BACK_PTRS - # include "dbg_mlc.h" - # endif - - /* A client supplied mark procedure. Returns new mark stack pointer. */ - /* Primary effect should be to push new entries on the mark stack. */ - /* Mark stack pointer values are passed and returned explicitly. */ - /* Global variables decribing mark stack are not necessarily valid. */ - /* (This usually saves a few cycles by keeping things in registers.) */ - /* Assumed to scan about PROC_BYTES on average. If it needs to do */ - /* much more work than that, it should do it in smaller pieces by */ - /* pushing itself back on the mark stack. */ - /* Note that it should always do some work (defined as marking some */ - /* objects) before pushing more than one entry on the mark stack. */ - /* This is required to ensure termination in the event of mark stack */ - /* overflows. */ - /* This procedure is always called with at least one empty entry on the */ - /* mark stack. */ - /* Currently we require that mark procedures look for pointers in a */ - /* subset of the places the conservative marker would. It must be safe */ - /* to invoke the normal mark procedure instead. */ - # define PROC_BYTES 100 - /* The real declarations of the following are in gc_priv.h, so that */ - /* we can avoid scanning the following table. */ - /* - typedef struct ms_entry * (*mark_proc)( word * addr, - struct ms_entry *mark_stack_ptr, - struct ms_entry *mark_stack_limit, - word env ); - - # define LOG_MAX_MARK_PROCS 6 - # define MAX_MARK_PROCS (1 << LOG_MAX_MARK_PROCS) - extern mark_proc GC_mark_procs[MAX_MARK_PROCS]; - */ - - extern word GC_n_mark_procs; - - /* In a few cases it's necessary to assign statically known indices to */ - /* certain mark procs. Thus we reserve a few for well known clients. */ - /* (This is necessary if mark descriptors are compiler generated.) */ - #define GC_RESERVED_MARK_PROCS 8 - # define GCJ_RESERVED_MARK_PROC_INDEX 0 - - /* Object descriptors on mark stack or in objects. Low order two */ - /* bits are tags distinguishing among the following 4 possibilities */ - /* for the high order 30 bits. */ - #define DS_TAG_BITS 2 - #define DS_TAGS ((1 << DS_TAG_BITS) - 1) - #define DS_LENGTH 0 /* The entire word is a length in bytes that */ - /* must be a multiple of 4. */ - #define DS_BITMAP 1 /* 30 bits are a bitmap describing pointer */ - /* fields. The msb is 1 iff the first word */ - /* is a pointer. */ - /* (This unconventional ordering sometimes */ - /* makes the marker slightly faster.) */ - /* Zeroes indicate definite nonpointers. Ones */ - /* indicate possible pointers. */ - /* Only usable if pointers are word aligned. */ - # define BITMAP_BITS (WORDSZ - DS_TAG_BITS) - #define DS_PROC 2 - /* The objects referenced by this object can be */ - /* pushed on the mark stack by invoking */ - /* PROC(descr). ENV(descr) is passed as the */ - /* last argument. */ - # define PROC(descr) \ - (GC_mark_procs[((descr) >> DS_TAG_BITS) & (MAX_MARK_PROCS-1)]) - # define ENV(descr) \ - ((descr) >> (DS_TAG_BITS + LOG_MAX_MARK_PROCS)) - # define MAX_ENV \ - (((word)1 << (WORDSZ - DS_TAG_BITS - LOG_MAX_MARK_PROCS)) - 1) - # define MAKE_PROC(proc_index, env) \ - (((((env) << LOG_MAX_MARK_PROCS) | (proc_index)) << DS_TAG_BITS) \ - | DS_PROC) - #define DS_PER_OBJECT 3 /* The real descriptor is at the */ - /* byte displacement from the beginning of the */ - /* object given by descr & ~DS_TAGS */ - /* If the descriptor is negative, the real */ - /* descriptor is at (*) - */ - /* (descr & ~DS_TAGS) - INDIR_PER_OBJ_BIAS */ - /* The latter alternative can be used if each */ - /* object contains a type descriptor in the */ - /* first word. */ - #define INDIR_PER_OBJ_BIAS 0x10 - - typedef struct ms_entry { - word * mse_start; /* First word of object */ - word mse_descr; /* Descriptor; low order two bits are tags, */ - /* identifying the upper 30 bits as one of the */ - /* following: */ - } mse; - - extern word GC_mark_stack_size; - - extern mse * GC_mark_stack_top; - - extern mse * GC_mark_stack; - - #ifdef PRINT_BLACK_LIST - ptr_t GC_find_start(ptr_t, hdr*, word); - #else - ptr_t GC_find_start(ptr_t, hdr*); - #endif - - mse * GC_signal_mark_stack_overflow(mse *); - - # ifdef GATHERSTATS - # define ADD_TO_ATOMIC(sz) GC_atomic_in_use += (sz) - # define ADD_TO_COMPOSITE(sz) GC_composite_in_use += (sz) - # else - # define ADD_TO_ATOMIC(sz) - # define ADD_TO_COMPOSITE(sz) - # endif - - /* Push the object obj with corresponding heap block header hhdr onto */ - /* the mark stack. */ - # define PUSH_OBJ(obj, hhdr, mark_stack_top, mark_stack_limit) \ - { \ - register word _descr = (hhdr) -> hb_descr; \ - \ - if (_descr == 0) { \ - ADD_TO_ATOMIC((hhdr) -> hb_sz); \ - } else { \ - ADD_TO_COMPOSITE((hhdr) -> hb_sz); \ - mark_stack_top++; \ - if (mark_stack_top >= mark_stack_limit) { \ - mark_stack_top = GC_signal_mark_stack_overflow(mark_stack_top); \ - } \ - mark_stack_top -> mse_start = (obj); \ - mark_stack_top -> mse_descr = _descr; \ - } \ - } - - #ifdef PRINT_BLACK_LIST - # define GC_FIND_START(current, hhdr, source) \ - GC_find_start(current, hhdr, source) - #else - # define GC_FIND_START(current, hhdr, source) \ - GC_find_start(current, hhdr) - #endif - - /* Push the contents of current onto the mark stack if it is a valid */ - /* ptr to a currently unmarked object. Mark it. */ - /* If we assumed a standard-conforming compiler, we could probably */ - /* generate the exit_label transparently. */ - # define PUSH_CONTENTS(current, mark_stack_top, mark_stack_limit, \ - source, exit_label) \ - { \ - hdr * my_hhdr; \ - ptr_t my_current = current; \ - \ - GET_HDR(my_current, my_hhdr); \ - if (IS_FORWARDING_ADDR_OR_NIL(my_hhdr)) { \ - my_current = GC_FIND_START(my_current, my_hhdr, (word)source); \ - if (my_current == 0) goto exit_label; \ - my_hhdr = GC_find_header(my_current); \ - } \ - PUSH_CONTENTS_HDR(my_current, mark_stack_top, mark_stack_limit, \ - source, exit_label, my_hhdr); \ - exit_label: ; \ - } - - /* As above, but use header cache for header lookup. */ - # define HC_PUSH_CONTENTS(current, mark_stack_top, mark_stack_limit, \ - source, exit_label) \ - { \ - hdr * my_hhdr; \ - ptr_t my_current = current; \ - \ - HC_GET_HDR(my_current, my_hhdr, source); \ - PUSH_CONTENTS_HDR(my_current, mark_stack_top, mark_stack_limit, \ - source, exit_label, my_hhdr); \ - exit_label: ; \ - } - - /* As above, but deal with two pointers in interleaved fashion. */ - # define HC_PUSH_CONTENTS2(current1, current2, mark_stack_top, \ - mark_stack_limit, \ - source1, source2, exit_label1, exit_label2) \ - { \ - hdr * hhdr1; \ - ptr_t my_current1 = current1; \ - hdr * hhdr2; \ - ptr_t my_current2 = current2; \ - \ - HC_GET_HDR2(my_current1, hhdr1, source1, my_current2, hhdr2, source2); \ - PUSH_CONTENTS_HDR(my_current1, mark_stack_top, mark_stack_limit, \ - source1, exit_label1, hhdr1); \ - exit_label1: ; \ - if (0 != hhdr2) { \ - PUSH_CONTENTS_HDR(my_current2, mark_stack_top, mark_stack_limit, \ - source2, exit_label2, hhdr2); \ - } \ - exit_label2: ; \ - } - - # define PUSH_CONTENTS_HDR(current, mark_stack_top, mark_stack_limit, \ - source, exit_label, hhdr) \ - { \ - int displ; /* Displacement in block; first bytes, then words */ \ - map_entry_type map_entry; \ - \ - displ = HBLKDISPL(current); \ - map_entry = MAP_ENTRY((hhdr -> hb_map), displ); \ - if (map_entry == OBJ_INVALID) { \ - GC_ADD_TO_BLACK_LIST_NORMAL(current, source); goto exit_label; \ - } \ - displ = BYTES_TO_WORDS(displ); \ - displ -= map_entry; \ - \ - { \ - register word * mark_word_addr = hhdr -> hb_marks + divWORDSZ(displ); \ - register word mark_word = *mark_word_addr; \ - register word mark_bit = (word)1 << modWORDSZ(displ); \ - \ - if (mark_word & mark_bit) { \ - /* Mark bit is already set */ \ - goto exit_label; \ - } \ - GC_STORE_BACK_PTR((ptr_t)source, (ptr_t)HBLKPTR(current) \ - + WORDS_TO_BYTES(displ)); \ - *mark_word_addr = mark_word | mark_bit; \ - } \ - PUSH_OBJ(((word *)(HBLKPTR(current)) + displ), hhdr, \ - mark_stack_top, mark_stack_limit) \ - } - - #if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS) - # define PUSH_ONE_CHECKED(p, ip, source) \ - GC_push_one_checked(p, ip, (ptr_t)(source)) - #else - # define PUSH_ONE_CHECKED(p, ip, source) \ - GC_push_one_checked(p, ip) - #endif - - /* - * Push a single value onto mark stack. Mark from the object pointed to by p. - * P is considered valid even if it is an interior pointer. - * Previously marked objects are not pushed. Hence we make progress even - * if the mark stack overflows. - */ - # define GC_PUSH_ONE_STACK(p, source) \ - if ((ptr_t)(p) >= GC_least_plausible_heap_addr \ - && (ptr_t)(p) < GC_greatest_plausible_heap_addr) { \ - PUSH_ONE_CHECKED(p, TRUE, source); \ - } - - /* - * As above, but interior pointer recognition as for - * normal for heap pointers. - */ - # ifdef ALL_INTERIOR_POINTERS - # define AIP TRUE - # else - # define AIP FALSE - # endif - # define GC_PUSH_ONE_HEAP(p,source) \ - if ((ptr_t)(p) >= GC_least_plausible_heap_addr \ - && (ptr_t)(p) < GC_greatest_plausible_heap_addr) { \ - PUSH_ONE_CHECKED(p,AIP,source); \ - } - - /* - * Mark from one finalizable object using the specified - * mark proc. May not mark the object pointed to by - * real_ptr. That is the job of the caller, if appropriate - */ - # define GC_MARK_FO(real_ptr, mark_proc) \ - { \ - (*(mark_proc))(real_ptr); \ - while (!GC_mark_stack_empty()) GC_mark_from_mark_stack(); \ - if (GC_mark_state != MS_NONE) { \ - GC_set_mark_bit(real_ptr); \ - while (!GC_mark_some((ptr_t)0)); \ - } \ - } - - extern GC_bool GC_mark_stack_too_small; - /* We need a larger mark stack. May be */ - /* set by client supplied mark routines.*/ - - typedef int mark_state_t; /* Current state of marking, as follows:*/ - /* Used to remember where we are during */ - /* concurrent marking. */ - - /* We say something is dirty if it was */ - /* written since the last time we */ - /* retrieved dirty bits. We say it's */ - /* grungy if it was marked dirty in the */ - /* last set of bits we retrieved. */ - - /* Invariant I: all roots and marked */ - /* objects p are either dirty, or point */ - /* to objects q that are either marked */ - /* or a pointer to q appears in a range */ - /* on the mark stack. */ - - # define MS_NONE 0 /* No marking in progress. I holds. */ - /* Mark stack is empty. */ - - # define MS_PUSH_RESCUERS 1 /* Rescuing objects are currently */ - /* being pushed. I holds, except */ - /* that grungy roots may point to */ - /* unmarked objects, as may marked */ - /* grungy objects above scan_ptr. */ - - # define MS_PUSH_UNCOLLECTABLE 2 - /* I holds, except that marked */ - /* uncollectable objects above scan_ptr */ - /* may point to unmarked objects. */ - /* Roots may point to unmarked objects */ - - # define MS_ROOTS_PUSHED 3 /* I holds, mark stack may be nonempty */ - - # define MS_PARTIALLY_INVALID 4 /* I may not hold, e.g. because of M.S. */ - /* overflow. However marked heap */ - /* objects below scan_ptr point to */ - /* marked or stacked objects. */ - - # define MS_INVALID 5 /* I may not hold. */ - - extern mark_state_t GC_mark_state; - - #endif /* GC_MARK_H */ - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_priv.h gcc-3.1/boehm-gc/gc_priv.h *** gcc-3.0.4/boehm-gc/gc_priv.h Tue May 1 21:41:46 2001 --- gcc-3.1/boehm-gc/gc_priv.h Thu Jan 1 00:00:00 1970 *************** *** 1,1906 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. - * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. - * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. - * - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - /* Boehm, February 16, 1996 2:30 pm PST */ - - - # ifndef GC_PRIVATE_H - # define GC_PRIVATE_H - - #if defined(mips) && defined(SYSTYPE_BSD) && defined(sony_news) - /* sony RISC NEWS, NEWSOS 4 */ - # define BSD_TIME - /* typedef long ptrdiff_t; -- necessary on some really old systems */ - #endif - - #if defined(mips) && defined(SYSTYPE_BSD43) - /* MIPS RISCOS 4 */ - # define BSD_TIME - #endif - - #ifdef BSD_TIME - # include - # include - # include - #endif /* BSD_TIME */ - - # ifndef GC_H - # include "gc.h" - # endif - - typedef GC_word word; - typedef GC_signed_word signed_word; - - # ifndef GCCONFIG_H - # include "gcconfig.h" - # endif - - # ifndef HEADERS_H - # include "gc_hdrs.h" - # endif - - typedef int GC_bool; - # define TRUE 1 - # define FALSE 0 - - typedef char * ptr_t; /* A generic pointer to which we can add */ - /* byte displacements. */ - /* Preferably identical to caddr_t, if it */ - /* exists. */ - - #if defined(__STDC__) - # include - # if !(defined( sony_news ) ) - # include - # endif - # define VOLATILE volatile - #else - # ifdef MSWIN32 - # include - # endif - # define VOLATILE - #endif - - #define CONST GC_CONST - - #if 0 /* was once defined for AMIGA */ - # define GC_FAR __far - #else - # define GC_FAR - #endif - - - /*********************************/ - /* */ - /* Definitions for conservative */ - /* collector */ - /* */ - /*********************************/ - - /*********************************/ - /* */ - /* Easily changeable parameters */ - /* */ - /*********************************/ - - #define STUBBORN_ALLOC /* Define stubborn allocation primitives */ - #if defined(SRC_M3) || defined(SMALL_CONFIG) - # undef STUBBORN_ALLOC - #endif - - - /* #define ALL_INTERIOR_POINTERS */ - /* Forces all pointers into the interior of an */ - /* object to be considered valid. Also causes the */ - /* sizes of all objects to be inflated by at least */ - /* one byte. This should suffice to guarantee */ - /* that in the presence of a compiler that does */ - /* not perform garbage-collector-unsafe */ - /* optimizations, all portable, strictly ANSI */ - /* conforming C programs should be safely usable */ - /* with malloc replaced by GC_malloc and free */ - /* calls removed. There are several disadvantages: */ - /* 1. There are probably no interesting, portable, */ - /* strictly ANSI conforming C programs. */ - /* 2. This option makes it hard for the collector */ - /* to allocate space that is not ``pointed to'' */ - /* by integers, etc. Under SunOS 4.X with a */ - /* statically linked libc, we empiricaly */ - /* observed that it would be difficult to */ - /* allocate individual objects larger than 100K. */ - /* Even if only smaller objects are allocated, */ - /* more swap space is likely to be needed. */ - /* Fortunately, much of this will never be */ - /* touched. */ - /* If you can easily avoid using this option, do. */ - /* If not, try to keep individual objects small. */ - - #define PRINTSTATS /* Print garbage collection statistics */ - /* For less verbose output, undefine in reclaim.c */ - - #define PRINTTIMES /* Print the amount of time consumed by each garbage */ - /* collection. */ - - #define PRINTBLOCKS /* Print object sizes associated with heap blocks, */ - /* whether the objects are atomic or composite, and */ - /* whether or not the block was found to be empty */ - /* during the reclaim phase. Typically generates */ - /* about one screenful per garbage collection. */ - #undef PRINTBLOCKS - - #ifdef SILENT - # ifdef PRINTSTATS - # undef PRINTSTATS - # endif - # ifdef PRINTTIMES - # undef PRINTTIMES - # endif - # ifdef PRINTNBLOCKS - # undef PRINTNBLOCKS - # endif - #endif - - #if defined(PRINTSTATS) && !defined(GATHERSTATS) - # define GATHERSTATS - #endif - - #ifdef FINALIZE_ON_DEMAND - # define GC_INVOKE_FINALIZERS() - #else - # define GC_INVOKE_FINALIZERS() (void)GC_invoke_finalizers() - #endif - - #define MERGE_SIZES /* Round up some object sizes, so that fewer distinct */ - /* free lists are actually maintained. This applies */ - /* only to the top level routines in misc.c, not to */ - /* user generated code that calls GC_allocobj and */ - /* GC_allocaobj directly. */ - /* Slows down average programs slightly. May however */ - /* substantially reduce fragmentation if allocation */ - /* request sizes are widely scattered. */ - /* May save significant amounts of space for obj_map */ - /* entries. */ - - /* ALIGN_DOUBLE requires MERGE_SIZES at present. */ - # if defined(ALIGN_DOUBLE) && !defined(MERGE_SIZES) - # define MERGE_SIZES - # endif - - #if defined(ALL_INTERIOR_POINTERS) && !defined(DONT_ADD_BYTE_AT_END) - # define ADD_BYTE_AT_END - #endif - - - # ifndef LARGE_CONFIG - # define MINHINCR 16 /* Minimum heap increment, in blocks of HBLKSIZE */ - /* Must be multiple of largest page size. */ - # define MAXHINCR 512 /* Maximum heap increment, in blocks */ - # else - # define MINHINCR 64 - # define MAXHINCR 4096 - # endif - - # define TIME_LIMIT 50 /* We try to keep pause times from exceeding */ - /* this by much. In milliseconds. */ - - # define BL_LIMIT GC_black_list_spacing - /* If we need a block of N bytes, and we have */ - /* a block of N + BL_LIMIT bytes available, */ - /* and N > BL_LIMIT, */ - /* but all possible positions in it are */ - /* blacklisted, we just use it anyway (and */ - /* print a warning, if warnings are enabled). */ - /* This risks subsequently leaking the block */ - /* due to a false reference. But not using */ - /* the block risks unreasonable immediate */ - /* heap growth. */ - - /*********************************/ - /* */ - /* Stack saving for debugging */ - /* */ - /*********************************/ - - #ifdef SAVE_CALL_CHAIN - - /* - * Number of frames and arguments to save in objects allocated by - * debugging allocator. - */ - # define NFRAMES 6 /* Number of frames to save. Even for */ - /* alignment reasons. */ - # define NARGS 2 /* Mumber of arguments to save for each call. */ - - # define NEED_CALLINFO - - /* Fill in the pc and argument information for up to NFRAMES of my */ - /* callers. Ignore my frame and my callers frame. */ - void GC_save_callers (/* struct callinfo info[NFRAMES] */); - - void GC_print_callers (/* struct callinfo info[NFRAMES] */); - - #else - - # ifdef GC_ADD_CALLER - # define NFRAMES 1 - # define NARGS 0 - # define NEED_CALLINFO - # endif - - #endif - - #ifdef NEED_CALLINFO - struct callinfo { - word ci_pc; - # if NARGS > 0 - word ci_arg[NARGS]; /* bit-wise complement to avoid retention */ - # endif - # if defined(ALIGN_DOUBLE) && (NFRAMES * (NARGS + 1)) % 2 == 1 - /* Likely alignment problem. */ - word ci_dummy; - # endif - }; - #endif - - - /*********************************/ - /* */ - /* OS interface routines */ - /* */ - /*********************************/ - - #ifdef BSD_TIME - # undef CLOCK_TYPE - # undef GET_TIME - # undef MS_TIME_DIFF - # define CLOCK_TYPE struct timeval - # define GET_TIME(x) { struct rusage rusage; \ - getrusage (RUSAGE_SELF, &rusage); \ - x = rusage.ru_utime; } - # define MS_TIME_DIFF(a,b) ((double) (a.tv_sec - b.tv_sec) * 1000.0 \ - + (double) (a.tv_usec - b.tv_usec) / 1000.0) - #else /* !BSD_TIME */ - # ifdef MSWIN32 - # include - # include - # define CLOCK_TYPE DWORD - # define GET_TIME(x) x = GetTickCount() - # define MS_TIME_DIFF(a,b) ((long)((a)-(b))) - # else /* !MSWIN32, !BSD_TIME */ - # include - # if !defined(__STDC__) && defined(SPARC) && defined(SUNOS4) - clock_t clock(); /* Not in time.h, where it belongs */ - # endif - # if defined(FREEBSD) && !defined(CLOCKS_PER_SEC) - # include - # define CLOCKS_PER_SEC CLK_TCK - # endif - # if !defined(CLOCKS_PER_SEC) - # define CLOCKS_PER_SEC 1000000 - /* - * This is technically a bug in the implementation. ANSI requires that - * CLOCKS_PER_SEC be defined. But at least under SunOS4.1.1, it isn't. - * Also note that the combination of ANSI C and POSIX is incredibly gross - * here. The type clock_t is used by both clock() and times(). But on - * some machines these use different notions of a clock tick, CLOCKS_PER_SEC - * seems to apply only to clock. Hence we use it here. On many machines, - * including SunOS, clock actually uses units of microseconds (which are - * not really clock ticks). - */ - # endif - # define CLOCK_TYPE clock_t - # define GET_TIME(x) x = clock() - # define MS_TIME_DIFF(a,b) ((unsigned long) \ - (1000.0*(double)((a)-(b))/(double)CLOCKS_PER_SEC)) - # endif /* !MSWIN32 */ - #endif /* !BSD_TIME */ - - /* We use bzero and bcopy internally. They may not be available. */ - # if defined(SPARC) && defined(SUNOS4) - # define BCOPY_EXISTS - # endif - # if defined(M68K) && defined(AMIGA) - # define BCOPY_EXISTS - # endif - # if defined(M68K) && defined(NEXT) - # define BCOPY_EXISTS - # endif - # if defined(VAX) - # define BCOPY_EXISTS - # endif - # if defined(AMIGA) - # include - # define BCOPY_EXISTS - # endif - - # ifndef BCOPY_EXISTS - # include - # define BCOPY(x,y,n) memcpy(y, x, (size_t)(n)) - # define BZERO(x,n) memset(x, 0, (size_t)(n)) - # else - # define BCOPY(x,y,n) bcopy((char *)(x),(char *)(y),(int)(n)) - # define BZERO(x,n) bzero((char *)(x),(int)(n)) - # endif - - /* HBLKSIZE aligned allocation. 0 is taken to mean failure */ - /* space is assumed to be cleared. */ - /* In the case os USE_MMAP, the argument must also be a */ - /* physical page size. */ - /* GET_MEM is currently not assumed to retrieve 0 filled space, */ - /* though we should perhaps take advantage of the case in which */ - /* does. */ - # ifdef PCR - char * real_malloc(); - # define GET_MEM(bytes) HBLKPTR(real_malloc((size_t)bytes + GC_page_size) \ - + GC_page_size-1) - # else - # ifdef OS2 - void * os2_alloc(size_t bytes); - # define GET_MEM(bytes) HBLKPTR((ptr_t)os2_alloc((size_t)bytes \ - + GC_page_size) \ - + GC_page_size-1) - # else - # if defined(AMIGA) || defined(NEXT) || defined(MACOSX) || defined(DOS4GW) - # define GET_MEM(bytes) HBLKPTR((size_t) \ - calloc(1, (size_t)bytes + GC_page_size) \ - + GC_page_size-1) - # else - # ifdef MSWIN32 - extern ptr_t GC_win32_get_mem(); - # define GET_MEM(bytes) (struct hblk *)GC_win32_get_mem(bytes) - # else - # ifdef MACOS - # if defined(USE_TEMPORARY_MEMORY) - extern Ptr GC_MacTemporaryNewPtr(size_t size, - Boolean clearMemory); - # define GET_MEM(bytes) HBLKPTR( \ - GC_MacTemporaryNewPtr(bytes + GC_page_size, true) \ - + GC_page_size-1) - # else - # define GET_MEM(bytes) HBLKPTR( \ - NewPtrClear(bytes + GC_page_size) + GC_page_size-1) - # endif - # else - extern ptr_t GC_unix_get_mem(); - # define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes) - # endif - # endif - # endif - # endif - # endif - - /* - * Mutual exclusion between allocator/collector routines. - * Needed if there is more than one allocator thread. - * FASTLOCK() is assumed to try to acquire the lock in a cheap and - * dirty way that is acceptable for a few instructions, e.g. by - * inhibiting preemption. This is assumed to have succeeded only - * if a subsequent call to FASTLOCK_SUCCEEDED() returns TRUE. - * FASTUNLOCK() is called whether or not FASTLOCK_SUCCEEDED(). - * If signals cannot be tolerated with the FASTLOCK held, then - * FASTLOCK should disable signals. The code executed under - * FASTLOCK is otherwise immune to interruption, provided it is - * not restarted. - * DCL_LOCK_STATE declares any local variables needed by LOCK and UNLOCK - * and/or DISABLE_SIGNALS and ENABLE_SIGNALS and/or FASTLOCK. - * (There is currently no equivalent for FASTLOCK.) - */ - # ifdef THREADS - # ifdef PCR_OBSOLETE /* Faster, but broken with multiple lwp's */ - # include "th/PCR_Th.h" - # include "th/PCR_ThCrSec.h" - extern struct PCR_Th_MLRep GC_allocate_ml; - # define DCL_LOCK_STATE PCR_sigset_t GC_old_sig_mask - # define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml) - # define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) - # define FASTLOCK() PCR_ThCrSec_EnterSys() - /* Here we cheat (a lot): */ - # define FASTLOCK_SUCCEEDED() (*(int *)(&GC_allocate_ml) == 0) - /* TRUE if nobody currently holds the lock */ - # define FASTUNLOCK() PCR_ThCrSec_ExitSys() - # endif - # ifdef PCR - # include - # include - extern PCR_Th_ML GC_allocate_ml; - # define DCL_LOCK_STATE \ - PCR_ERes GC_fastLockRes; PCR_sigset_t GC_old_sig_mask - # define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml) - # define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) - # define FASTLOCK() (GC_fastLockRes = PCR_Th_ML_Try(&GC_allocate_ml)) - # define FASTLOCK_SUCCEEDED() (GC_fastLockRes == PCR_ERes_okay) - # define FASTUNLOCK() {\ - if( FASTLOCK_SUCCEEDED() ) PCR_Th_ML_Release(&GC_allocate_ml); } - # endif - # ifdef SRC_M3 - extern word RT0u__inCritical; - # define LOCK() RT0u__inCritical++ - # define UNLOCK() RT0u__inCritical-- - # endif - # ifdef SOLARIS_THREADS - # include - # include - extern mutex_t GC_allocate_ml; - # define LOCK() mutex_lock(&GC_allocate_ml); - # define UNLOCK() mutex_unlock(&GC_allocate_ml); - # endif - # if defined(LINUX_THREADS) - # if defined(I386)|| defined(POWERPC) || defined(ALPHA) || defined(IA64) \ - || defined(M68K) || defined(SPARC) - # include - # define USE_SPIN_LOCK - # if defined(I386) - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - /* Note: the "xchg" instruction does not need a "lock" prefix */ - __asm__ __volatile__("xchgl %0, %1" - : "=r"(oldval), "=m"(*(addr)) - : "0"(1), "m"(*(addr))); - return oldval; - } - # endif - # if defined(IA64) - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - __asm__ __volatile__("xchg4 %0=%1,%2" - : "=r"(oldval), "=m"(*addr) - : "r"(1), "1"(*addr)); - return oldval; - } - inline static void GC_clear(volatile unsigned int *addr) { - __asm__ __volatile__("st4.rel %0=r0" : "=m" (*addr)); - } - # define GC_CLEAR_DEFINED - # endif - # ifdef SPARC - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - - __asm__ __volatile__("ldstub %1,%0" - : "=r"(oldval), "=m"(*addr) - : "m"(*addr)); - return oldval; - } - # endif - # ifdef M68K - /* Contributed by Tony Mantler. I'm not sure how well it was */ - /* tested. */ - inline static int GC_test_and_set(volatile unsigned int *addr) { - char oldval; /* this must be no longer than 8 bits */ - - /* The return value is semi-phony. */ - /* 'tas' sets bit 7 while the return */ - /* value pretends bit 0 was set */ - __asm__ __volatile__( - "tas %1@; sne %0; negb %0" - : "=d" (oldval) - : "a" (addr)); - return oldval; - } - # endif - # if defined(POWERPC) - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - int temp = 1; // locked value - - __asm__ __volatile__( - "1:\tlwarx %0,0,%3\n" // load and reserve - "\tcmpwi %0, 0\n" // if load is - "\tbne 2f\n" // non-zero, return already set - "\tstwcx. %2,0,%1\n" // else store conditional - "\tbne- 1b\n" // retry if lost reservation - "2:\t\n" // oldval is zero if we set - : "=&r"(oldval), "=p"(addr) - : "r"(temp), "1"(addr) - : "memory"); - return (int)oldval; - } - inline static void GC_clear(volatile unsigned int *addr) { - __asm__ __volatile__("eieio"); - *(addr) = 0; - } - # define GC_CLEAR_DEFINED - # endif - # ifdef ALPHA - inline static int GC_test_and_set(volatile unsigned int * addr) - { - unsigned long oldvalue; - unsigned long temp; - - __asm__ __volatile__( - "1: ldl_l %0,%1\n" - " and %0,%3,%2\n" - " bne %2,2f\n" - " xor %0,%3,%0\n" - " stl_c %0,%1\n" - " beq %0,3f\n" - " mb\n" - "2:\n" - ".section .text2,\"ax\"\n" - "3: br 1b\n" - ".previous" - :"=&r" (temp), "=m" (*addr), "=&r" (oldvalue) - :"Ir" (1), "m" (*addr)); - - return oldvalue; - } - /* Should probably also define GC_clear, since it needs */ - /* a memory barrier ?? */ - # endif /* ALPHA */ - # ifdef ARM32 - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - /* SWP on ARM is very similar to XCHG on x86. Doesn't lock the - * bus because there are no SMP ARM machines. If/when there are, - * this code will likely need to be updated. */ - /* See linuxthreads/sysdeps/arm/pt-machine.h in glibc-2.1 */ - __asm__ __volatile__("swp %0, %1, [%2]" - : "=r"(oldval) - : "r"(1), "r"(addr)); - return oldval; - } - # endif - # ifndef GC_CLEAR_DEFINED - inline static void GC_clear(volatile unsigned int *addr) { - /* Try to discourage gcc from moving anything past this. */ - __asm__ __volatile__(" "); - *(addr) = 0; - } - # endif - - extern volatile unsigned int GC_allocate_lock; - extern pthread_t GC_lock_holder; - extern void GC_lock(void); - /* Allocation lock holder. Only set if acquired by client through */ - /* GC_call_with_alloc_lock. */ - # define SET_LOCK_HOLDER() GC_lock_holder = pthread_self() - # define NO_THREAD (pthread_t)(-1) - # define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD - # define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self())) - # define LOCK() \ - { if (GC_test_and_set(&GC_allocate_lock)) GC_lock(); } - # define UNLOCK() \ - GC_clear(&GC_allocate_lock) - extern VOLATILE GC_bool GC_collecting; - # define ENTER_GC() \ - { \ - GC_collecting = 1; \ - } - # define EXIT_GC() GC_collecting = 0; - # else /* LINUX_THREADS on hardware for which we don't know how */ - /* to do test and set. */ - # include - extern pthread_mutex_t GC_allocate_ml; - # define LOCK() pthread_mutex_lock(&GC_allocate_ml) - # define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml) - # endif - # endif /* LINUX_THREADS */ - # if defined(HPUX_THREADS) - # include - extern pthread_mutex_t GC_allocate_ml; - # define LOCK() pthread_mutex_lock(&GC_allocate_ml) - # define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml) - # endif - # if defined(IRIX_THREADS) || defined(IRIX_JDK_THREADS) - /* This may also eventually be appropriate for HPUX_THREADS */ - # include - # ifndef HPUX_THREADS - /* This probably should never be included, but I can't test */ - /* on Irix anymore. */ - # include - # endif - - # ifndef HPUX_THREADS - # if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64)) \ - || !defined(_COMPILER_VERSION) || _COMPILER_VERSION < 700 - # define GC_test_and_set(addr, v) test_and_set(addr,v) - # else - # define GC_test_and_set(addr, v) __test_and_set(addr,v) - # endif - # else - /* I couldn't find a way to do this inline on HP/UX */ - # endif - extern unsigned long GC_allocate_lock; - /* This is not a mutex because mutexes that obey the (optional) */ - /* POSIX scheduling rules are subject to convoys in high contention */ - /* applications. This is basically a spin lock. */ - extern pthread_t GC_lock_holder; - extern void GC_lock(void); - /* Allocation lock holder. Only set if acquired by client through */ - /* GC_call_with_alloc_lock. */ - # define SET_LOCK_HOLDER() GC_lock_holder = pthread_self() - # define NO_THREAD (pthread_t)(-1) - # define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD - # define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self())) - # ifdef HPUX_THREADS - # define LOCK() { if (!GC_test_and_clear(&GC_allocate_lock)) GC_lock(); } - /* The following is INCORRECT, since the memory model is too weak. */ - # define UNLOCK() { GC_noop1((word)&GC_allocate_lock); \ - *(volatile unsigned long *)(&GC_allocate_lock) = 1; } - # else - # define LOCK() { if (GC_test_and_set(&GC_allocate_lock, 1)) GC_lock(); } - # if __mips >= 3 && (defined (_ABIN32) || defined(_ABI64)) \ - && defined(_COMPILER_VERSION) && _COMPILER_VERSION >= 700 - # define UNLOCK() __lock_release(&GC_allocate_lock) - # else - /* The function call in the following should prevent the */ - /* compiler from moving assignments to below the UNLOCK. */ - /* This is probably not necessary for ucode or gcc 2.8. */ - /* It may be necessary for Ragnarok and future gcc */ - /* versions. */ - # define UNLOCK() { GC_noop1((word)&GC_allocate_lock); \ - *(volatile unsigned long *)(&GC_allocate_lock) = 0; } - # endif - # endif - extern VOLATILE GC_bool GC_collecting; - # define ENTER_GC() \ - { \ - GC_collecting = 1; \ - } - # define EXIT_GC() GC_collecting = 0; - # endif /* IRIX_THREADS || IRIX_JDK_THREADS */ - # ifdef WIN32_THREADS - # include - GC_API CRITICAL_SECTION GC_allocate_ml; - # define LOCK() EnterCriticalSection(&GC_allocate_ml); - # define UNLOCK() LeaveCriticalSection(&GC_allocate_ml); - # endif - # ifndef SET_LOCK_HOLDER - # define SET_LOCK_HOLDER() - # define UNSET_LOCK_HOLDER() - # define I_HOLD_LOCK() FALSE - /* Used on platforms were locks can be reacquired, */ - /* so it doesn't matter if we lie. */ - # endif - # else - # define LOCK() - # define UNLOCK() - # endif - # ifndef SET_LOCK_HOLDER - # define SET_LOCK_HOLDER() - # define UNSET_LOCK_HOLDER() - # define I_HOLD_LOCK() FALSE - /* Used on platforms were locks can be reacquired, */ - /* so it doesn't matter if we lie. */ - # endif - # ifndef ENTER_GC - # define ENTER_GC() - # define EXIT_GC() - # endif - - # ifndef DCL_LOCK_STATE - # define DCL_LOCK_STATE - # endif - # ifndef FASTLOCK - # define FASTLOCK() LOCK() - # define FASTLOCK_SUCCEEDED() TRUE - # define FASTUNLOCK() UNLOCK() - # endif - - /* Delay any interrupts or signals that may abort this thread. Data */ - /* structures are in a consistent state outside this pair of calls. */ - /* ANSI C allows both to be empty (though the standard isn't very */ - /* clear on that point). Standard malloc implementations are usually */ - /* neither interruptable nor thread-safe, and thus correspond to */ - /* empty definitions. */ - # ifdef PCR - # define DISABLE_SIGNALS() \ - PCR_Th_SetSigMask(PCR_allSigsBlocked,&GC_old_sig_mask) - # define ENABLE_SIGNALS() \ - PCR_Th_SetSigMask(&GC_old_sig_mask, NIL) - # else - # if defined(SRC_M3) || defined(AMIGA) || defined(SOLARIS_THREADS) \ - || defined(MSWIN32) || defined(MACOS) || defined(DJGPP) \ - || defined(NO_SIGNALS) || defined(IRIX_THREADS) \ - || defined(IRIX_JDK_THREADS) || defined(LINUX_THREADS) - /* Also useful for debugging. */ - /* Should probably use thr_sigsetmask for SOLARIS_THREADS. */ - # define DISABLE_SIGNALS() - # define ENABLE_SIGNALS() - # else - # define DISABLE_SIGNALS() GC_disable_signals() - void GC_disable_signals(); - # define ENABLE_SIGNALS() GC_enable_signals() - void GC_enable_signals(); - # endif - # endif - - /* - * Stop and restart mutator threads. - */ - # ifdef PCR - # include "th/PCR_ThCtl.h" - # define STOP_WORLD() \ - PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_stopNormal, \ - PCR_allSigsBlocked, \ - PCR_waitForever) - # define START_WORLD() \ - PCR_ThCtl_SetExclusiveMode(PCR_ThCtl_ExclusiveMode_null, \ - PCR_allSigsBlocked, \ - PCR_waitForever); - # else - # if defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \ - || defined(IRIX_THREADS) || defined(LINUX_THREADS) \ - || defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) - void GC_stop_world(); - void GC_start_world(); - # define STOP_WORLD() GC_stop_world() - # define START_WORLD() GC_start_world() - # else - # define STOP_WORLD() - # define START_WORLD() - # endif - # endif - - /* Abandon ship */ - # ifdef PCR - # define ABORT(s) PCR_Base_Panic(s) - # else - # ifdef SMALL_CONFIG - # define ABORT(msg) abort(); - # else - GC_API void GC_abort(); - # define ABORT(msg) GC_abort(msg); - # endif - # endif - - /* Exit abnormally, but without making a mess (e.g. out of memory) */ - # ifdef PCR - # define EXIT() PCR_Base_Exit(1,PCR_waitForever) - # else - # define EXIT() (void)exit(1) - # endif - - /* Print warning message, e.g. almost out of memory. */ - # define WARN(msg,arg) (*GC_current_warn_proc)(msg, (GC_word)(arg)) - extern GC_warn_proc GC_current_warn_proc; - - /*********************************/ - /* */ - /* Word-size-dependent defines */ - /* */ - /*********************************/ - - #if CPP_WORDSZ == 32 - # define WORDS_TO_BYTES(x) ((x)<<2) - # define BYTES_TO_WORDS(x) ((x)>>2) - # define LOGWL ((word)5) /* log[2] of CPP_WORDSZ */ - # define modWORDSZ(n) ((n) & 0x1f) /* n mod size of word */ - # if ALIGNMENT != 4 - # define UNALIGNED - # endif - #endif - - #if CPP_WORDSZ == 64 - # define WORDS_TO_BYTES(x) ((x)<<3) - # define BYTES_TO_WORDS(x) ((x)>>3) - # define LOGWL ((word)6) /* log[2] of CPP_WORDSZ */ - # define modWORDSZ(n) ((n) & 0x3f) /* n mod size of word */ - # if ALIGNMENT != 8 - # define UNALIGNED - # endif - #endif - - #define WORDSZ ((word)CPP_WORDSZ) - #define SIGNB ((word)1 << (WORDSZ-1)) - #define BYTES_PER_WORD ((word)(sizeof (word))) - #define ONES ((word)(-1)) - #define divWORDSZ(n) ((n) >> LOGWL) /* divide n by size of word */ - - /*********************/ - /* */ - /* Size Parameters */ - /* */ - /*********************/ - - /* heap block size, bytes. Should be power of 2 */ - - #ifndef HBLKSIZE - # ifdef SMALL_CONFIG - # define CPP_LOG_HBLKSIZE 10 - # else - # if CPP_WORDSZ == 32 - # define CPP_LOG_HBLKSIZE 12 - # else - # define CPP_LOG_HBLKSIZE 13 - # endif - # endif - #else - # if HBLKSIZE == 512 - # define CPP_LOG_HBLKSIZE 9 - # endif - # if HBLKSIZE == 1024 - # define CPP_LOG_HBLKSIZE 10 - # endif - # if HBLKSIZE == 2048 - # define CPP_LOG_HBLKSIZE 11 - # endif - # if HBLKSIZE == 4096 - # define CPP_LOG_HBLKSIZE 12 - # endif - # if HBLKSIZE == 8192 - # define CPP_LOG_HBLKSIZE 13 - # endif - # if HBLKSIZE == 16384 - # define CPP_LOG_HBLKSIZE 14 - # endif - # ifndef CPP_LOG_HBLKSIZE - --> fix HBLKSIZE - # endif - # undef HBLKSIZE - #endif - # define CPP_HBLKSIZE (1 << CPP_LOG_HBLKSIZE) - # define LOG_HBLKSIZE ((word)CPP_LOG_HBLKSIZE) - # define HBLKSIZE ((word)CPP_HBLKSIZE) - - - /* max size objects supported by freelist (larger objects may be */ - /* allocated, but less efficiently) */ - - #define CPP_MAXOBJSZ BYTES_TO_WORDS(CPP_HBLKSIZE/2) - #define MAXOBJSZ ((word)CPP_MAXOBJSZ) - - # define divHBLKSZ(n) ((n) >> LOG_HBLKSIZE) - - # define HBLK_PTR_DIFF(p,q) divHBLKSZ((ptr_t)p - (ptr_t)q) - /* Equivalent to subtracting 2 hblk pointers. */ - /* We do it this way because a compiler should */ - /* find it hard to use an integer division */ - /* instead of a shift. The bundled SunOS 4.1 */ - /* o.w. sometimes pessimizes the subtraction to */ - /* involve a call to .div. */ - - # define modHBLKSZ(n) ((n) & (HBLKSIZE-1)) - - # define HBLKPTR(objptr) ((struct hblk *)(((word) (objptr)) & ~(HBLKSIZE-1))) - - # define HBLKDISPL(objptr) (((word) (objptr)) & (HBLKSIZE-1)) - - /* Round up byte allocation requests to integral number of words, etc. */ - # ifdef ADD_BYTE_AT_END - # define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1)) - # ifdef ALIGN_DOUBLE - # define ALIGNED_WORDS(n) (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2)) & ~1) - # else - # define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n) - # endif - # define SMALL_OBJ(bytes) ((bytes) < WORDS_TO_BYTES(MAXOBJSZ)) - # define ADD_SLOP(bytes) ((bytes)+1) - # else - # define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + (WORDS_TO_BYTES(1) - 1)) - # ifdef ALIGN_DOUBLE - # define ALIGNED_WORDS(n) \ - (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2) - 1) & ~1) - # else - # define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n) - # endif - # define SMALL_OBJ(bytes) ((bytes) <= WORDS_TO_BYTES(MAXOBJSZ)) - # define ADD_SLOP(bytes) (bytes) - # endif - # ifndef MIN_WORDS - /* MIN_WORDS is the size of the smallest allocated object. */ - /* 1 and 2 are the only valid values. */ - /* 2 must be used if: */ - /* - GC_gcj_malloc can be used for objects of requested */ - /* size smaller than 2 words */ - # if defined(GC_GCJ_SUPPORT) - # define MIN_WORDS 2 /* Smallest allocated object. */ - # else - # define MIN_WORDS 1 - # endif - # endif - - - /* - * Hash table representation of sets of pages. This assumes it is - * OK to add spurious entries to sets. - * Used by black-listing code, and perhaps by dirty bit maintenance code. - */ - - # ifdef LARGE_CONFIG - # define LOG_PHT_ENTRIES 17 - # else - # define LOG_PHT_ENTRIES 14 /* Collisions are likely if heap grows */ - /* to more than 16K hblks = 64MB. */ - /* Each hash table occupies 2K bytes. */ - # endif - # define PHT_ENTRIES ((word)1 << LOG_PHT_ENTRIES) - # define PHT_SIZE (PHT_ENTRIES >> LOGWL) - typedef word page_hash_table[PHT_SIZE]; - - # define PHT_HASH(addr) ((((word)(addr)) >> LOG_HBLKSIZE) & (PHT_ENTRIES - 1)) - - # define get_pht_entry_from_index(bl, index) \ - (((bl)[divWORDSZ(index)] >> modWORDSZ(index)) & 1) - # define set_pht_entry_from_index(bl, index) \ - (bl)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index) - # define clear_pht_entry_from_index(bl, index) \ - (bl)[divWORDSZ(index)] &= ~((word)1 << modWORDSZ(index)) - - - - /********************************************/ - /* */ - /* H e a p B l o c k s */ - /* */ - /********************************************/ - - /* heap block header */ - #define HBLKMASK (HBLKSIZE-1) - - #define BITS_PER_HBLK (HBLKSIZE * 8) - - #define MARK_BITS_PER_HBLK (BITS_PER_HBLK/CPP_WORDSZ) - /* upper bound */ - /* We allocate 1 bit/word. Only the first word */ - /* in each object is actually marked. */ - - # ifdef ALIGN_DOUBLE - # define MARK_BITS_SZ (((MARK_BITS_PER_HBLK + 2*CPP_WORDSZ - 1) \ - / (2*CPP_WORDSZ))*2) - # else - # define MARK_BITS_SZ ((MARK_BITS_PER_HBLK + CPP_WORDSZ - 1)/CPP_WORDSZ) - # endif - /* Upper bound on number of mark words per heap block */ - - struct hblkhdr { - word hb_sz; /* If in use, size in words, of objects in the block. */ - /* if free, the size in bytes of the whole block */ - struct hblk * hb_next; /* Link field for hblk free list */ - /* and for lists of chunks waiting to be */ - /* reclaimed. */ - struct hblk * hb_prev; /* Backwards link for free list. */ - word hb_descr; /* object descriptor for marking. See */ - /* mark.h. */ - char* hb_map; /* A pointer to a pointer validity map of the block. */ - /* See GC_obj_map. */ - /* Valid for all blocks with headers. */ - /* Free blocks point to GC_invalid_map. */ - unsigned char hb_obj_kind; - /* Kind of objects in the block. Each kind */ - /* identifies a mark procedure and a set of */ - /* list headers. Sometimes called regions. */ - unsigned char hb_flags; - # define IGNORE_OFF_PAGE 1 /* Ignore pointers that do not */ - /* point to the first page of */ - /* this object. */ - # define WAS_UNMAPPED 2 /* This is a free block, which has */ - /* been unmapped from the address */ - /* space. */ - /* GC_remap must be invoked on it */ - /* before it can be reallocated. */ - /* Only set with USE_MUNMAP. */ - unsigned short hb_last_reclaimed; - /* Value of GC_gc_no when block was */ - /* last allocated or swept. May wrap. */ - /* For a free block, this is maintained */ - /* unly for USE_MUNMAP, and indicates */ - /* when the header was allocated, or */ - /* when the size of the block last */ - /* changed. */ - word hb_marks[MARK_BITS_SZ]; - /* Bit i in the array refers to the */ - /* object starting at the ith word (header */ - /* INCLUDED) in the heap block. */ - /* The lsb of word 0 is numbered 0. */ - /* Unused bits are invalid, and are */ - /* occasionally set, e.g for uncollectable */ - /* objects. */ - }; - - /* heap block body */ - - # define DISCARD_WORDS 0 - /* Number of words to be dropped at the beginning of each block */ - /* Must be a multiple of WORDSZ. May reasonably be nonzero */ - /* on machines that don't guarantee longword alignment of */ - /* pointers, so that the number of false hits is minimized. */ - /* 0 and WORDSZ are probably the only reasonable values. */ - - # define BODY_SZ ((HBLKSIZE-WORDS_TO_BYTES(DISCARD_WORDS))/sizeof(word)) - - struct hblk { - # if (DISCARD_WORDS != 0) - word garbage[DISCARD_WORDS]; - # endif - word hb_body[BODY_SZ]; - }; - - # define HDR_WORDS ((word)DISCARD_WORDS) - # define HDR_BYTES ((word)WORDS_TO_BYTES(DISCARD_WORDS)) - - # define OBJ_SZ_TO_BLOCKS(sz) \ - divHBLKSZ(HDR_BYTES + WORDS_TO_BYTES(sz) + HBLKSIZE-1) - /* Size of block (in units of HBLKSIZE) needed to hold objects of */ - /* given sz (in words). */ - - /* Object free list link */ - # define obj_link(p) (*(ptr_t *)(p)) - - /* The type of mark procedures. This really belongs in gc_mark.h. */ - /* But we put it here, so that we can avoid scanning the mark proc */ - /* table. */ - typedef struct ms_entry * (*mark_proc)(/* word * addr, - struct ms_entry *mark_stack_ptr, - struct ms_entry *mark_stack_limit, - word env */); - # define LOG_MAX_MARK_PROCS 6 - # define MAX_MARK_PROCS (1 << LOG_MAX_MARK_PROCS) - - /* Root sets. Logically private to mark_rts.c. But we don't want the */ - /* tables scanned, so we put them here. */ - /* MAX_ROOT_SETS is the maximum number of ranges that can be */ - /* registered as static roots. */ - # ifdef LARGE_CONFIG - # define MAX_ROOT_SETS 4096 - # else - # ifdef PCR - # define MAX_ROOT_SETS 1024 - # else - # ifdef MSWIN32 - # define MAX_ROOT_SETS 512 - /* Under NT, we add only written pages, which can result */ - /* in many small root sets. */ - # else - # define MAX_ROOT_SETS 64 - # endif - # endif - # endif - - # define MAX_EXCLUSIONS (MAX_ROOT_SETS/4) - /* Maximum number of segments that can be excluded from root sets. */ - - /* - * Data structure for excluded static roots. - */ - struct exclusion { - ptr_t e_start; - ptr_t e_end; - }; - - /* Data structure for list of root sets. */ - /* We keep a hash table, so that we can filter out duplicate additions. */ - /* Under Win32, we need to do a better job of filtering overlaps, so */ - /* we resort to sequential search, and pay the price. */ - struct roots { - ptr_t r_start; - ptr_t r_end; - # ifndef MSWIN32 - struct roots * r_next; - # endif - GC_bool r_tmp; - /* Delete before registering new dynamic libraries */ - }; - - #ifndef MSWIN32 - /* Size of hash table index to roots. */ - # define LOG_RT_SIZE 6 - # define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */ - #endif - - /* Lists of all heap blocks and free lists */ - /* as well as other random data structures */ - /* that should not be scanned by the */ - /* collector. */ - /* These are grouped together in a struct */ - /* so that they can be easily skipped by the */ - /* GC_mark routine. */ - /* The ordering is weird to make GC_malloc */ - /* faster by keeping the important fields */ - /* sufficiently close together that a */ - /* single load of a base register will do. */ - /* Scalars that could easily appear to */ - /* be pointers are also put here. */ - /* The main fields should precede any */ - /* conditionally included fields, so that */ - /* gc_inl.h will work even if a different set */ - /* of macros is defined when the client is */ - /* compiled. */ - - struct _GC_arrays { - word _heapsize; - word _max_heapsize; - word _requested_heapsize; /* Heap size due to explicit expansion */ - ptr_t _last_heap_addr; - ptr_t _prev_heap_addr; - word _large_free_bytes; - /* Total bytes contained in blocks on large object free */ - /* list. */ - word _words_allocd_before_gc; - /* Number of words allocated before this */ - /* collection cycle. */ - word _words_allocd; - /* Number of words allocated during this collection cycle */ - word _words_wasted; - /* Number of words wasted due to internal fragmentation */ - /* in large objects, or due to dropping blacklisted */ - /* blocks, since last gc. Approximate. */ - word _words_finalized; - /* Approximate number of words in objects (and headers) */ - /* That became ready for finalization in the last */ - /* collection. */ - word _non_gc_bytes_at_gc; - /* Number of explicitly managed bytes of storage */ - /* at last collection. */ - word _mem_freed; - /* Number of explicitly deallocated words of memory */ - /* since last collection. */ - ptr_t _scratch_end_ptr; - ptr_t _scratch_last_end_ptr; - /* Used by headers.c, and can easily appear to point to */ - /* heap. */ - mark_proc _mark_procs[MAX_MARK_PROCS]; - /* Table of user-defined mark procedures. There is */ - /* a small number of these, which can be referenced */ - /* by DS_PROC mark descriptors. See gc_mark.h. */ - ptr_t _objfreelist[MAXOBJSZ+1]; - /* free list for objects */ - ptr_t _aobjfreelist[MAXOBJSZ+1]; - /* free list for atomic objs */ - - ptr_t _uobjfreelist[MAXOBJSZ+1]; - /* uncollectable but traced objs */ - /* objects on this and auobjfreelist */ - /* are always marked, except during */ - /* garbage collections. */ - # ifdef ATOMIC_UNCOLLECTABLE - ptr_t _auobjfreelist[MAXOBJSZ+1]; - # endif - /* uncollectable but traced objs */ - - # ifdef GATHERSTATS - word _composite_in_use; - /* Number of words in accessible composite */ - /* objects. */ - word _atomic_in_use; - /* Number of words in accessible atomic */ - /* objects. */ - # endif - # ifdef USE_MUNMAP - word _unmapped_bytes; - # endif - # ifdef MERGE_SIZES - unsigned _size_map[WORDS_TO_BYTES(MAXOBJSZ+1)]; - /* Number of words to allocate for a given allocation request in */ - /* bytes. */ - # endif - - # ifdef STUBBORN_ALLOC - ptr_t _sobjfreelist[MAXOBJSZ+1]; - # endif - /* free list for immutable objects */ - ptr_t _obj_map[MAXOBJSZ+1]; - /* If not NIL, then a pointer to a map of valid */ - /* object addresses. _obj_map[sz][i] is j if the */ - /* address block_start+i is a valid pointer */ - /* to an object at */ - /* block_start+i&~3 - WORDS_TO_BYTES(j). */ - /* (If ALL_INTERIOR_POINTERS is defined, then */ - /* instead ((short *)(hb_map[sz])[i] is j if */ - /* block_start+WORDS_TO_BYTES(i) is in the */ - /* interior of an object starting at */ - /* block_start+WORDS_TO_BYTES(i-j)). */ - /* It is OBJ_INVALID if */ - /* block_start+WORDS_TO_BYTES(i) is not */ - /* valid as a pointer to an object. */ - /* We assume all values of j <= OBJ_INVALID. */ - /* The zeroth entry corresponds to large objects.*/ - # ifdef ALL_INTERIOR_POINTERS - # define map_entry_type short - # define OBJ_INVALID 0x7fff - # define MAP_ENTRY(map, bytes) \ - (((map_entry_type *)(map))[BYTES_TO_WORDS(bytes)]) - # define MAP_ENTRIES BYTES_TO_WORDS(HBLKSIZE) - # define MAP_SIZE (MAP_ENTRIES * sizeof(map_entry_type)) - # define OFFSET_VALID(displ) TRUE - # define CPP_MAX_OFFSET (HBLKSIZE - HDR_BYTES - 1) - # define MAX_OFFSET ((word)CPP_MAX_OFFSET) - # else - # define map_entry_type char - # define OBJ_INVALID 0x7f - # define MAP_ENTRY(map, bytes) \ - (map)[bytes] - # define MAP_ENTRIES HBLKSIZE - # define MAP_SIZE MAP_ENTRIES - # define CPP_MAX_OFFSET (WORDS_TO_BYTES(OBJ_INVALID) - 1) - # define MAX_OFFSET ((word)CPP_MAX_OFFSET) - # define VALID_OFFSET_SZ \ - (CPP_MAX_OFFSET > WORDS_TO_BYTES(CPP_MAXOBJSZ)? \ - CPP_MAX_OFFSET+1 \ - : WORDS_TO_BYTES(CPP_MAXOBJSZ)+1) - char _valid_offsets[VALID_OFFSET_SZ]; - /* GC_valid_offsets[i] == TRUE ==> i */ - /* is registered as a displacement. */ - # define OFFSET_VALID(displ) GC_valid_offsets[displ] - char _modws_valid_offsets[sizeof(word)]; - /* GC_valid_offsets[i] ==> */ - /* GC_modws_valid_offsets[i%sizeof(word)] */ - # endif - # ifdef STUBBORN_ALLOC - page_hash_table _changed_pages; - /* Stubborn object pages that were changes since last call to */ - /* GC_read_changed. */ - page_hash_table _prev_changed_pages; - /* Stubborn object pages that were changes before last call to */ - /* GC_read_changed. */ - # endif - # if defined(PROC_VDB) || defined(MPROTECT_VDB) - page_hash_table _grungy_pages; /* Pages that were dirty at last */ - /* GC_read_dirty. */ - # endif - # ifdef MPROTECT_VDB - VOLATILE page_hash_table _dirty_pages; - /* Pages dirtied since last GC_read_dirty. */ - # endif - # ifdef PROC_VDB - page_hash_table _written_pages; /* Pages ever dirtied */ - # endif - # ifdef LARGE_CONFIG - # if CPP_WORDSZ > 32 - # define MAX_HEAP_SECTS 4096 /* overflows at roughly 64 GB */ - # else - # define MAX_HEAP_SECTS 768 /* Separately added heap sections. */ - # endif - # else - # define MAX_HEAP_SECTS 256 - # endif - struct HeapSect { - ptr_t hs_start; word hs_bytes; - } _heap_sects[MAX_HEAP_SECTS]; - # ifdef MSWIN32 - ptr_t _heap_bases[MAX_HEAP_SECTS]; - /* Start address of memory regions obtained from kernel. */ - # endif - struct roots _static_roots[MAX_ROOT_SETS]; - # ifndef MSWIN32 - struct roots * _root_index[RT_SIZE]; - # endif - struct exclusion _excl_table[MAX_EXCLUSIONS]; - /* Block header index; see gc_headers.h */ - bottom_index * _all_nils; - bottom_index * _top_index [TOP_SZ]; - #ifdef SAVE_CALL_CHAIN - struct callinfo _last_stack[NFRAMES]; /* Stack at last garbage collection.*/ - /* Useful for debugging mysterious */ - /* object disappearances. */ - /* In the multithreaded case, we */ - /* currently only save the calling */ - /* stack. */ - #endif - }; - - GC_API GC_FAR struct _GC_arrays GC_arrays; - - # define GC_objfreelist GC_arrays._objfreelist - # define GC_aobjfreelist GC_arrays._aobjfreelist - # define GC_uobjfreelist GC_arrays._uobjfreelist - # ifdef ATOMIC_UNCOLLECTABLE - # define GC_auobjfreelist GC_arrays._auobjfreelist - # endif - # define GC_sobjfreelist GC_arrays._sobjfreelist - # define GC_valid_offsets GC_arrays._valid_offsets - # define GC_modws_valid_offsets GC_arrays._modws_valid_offsets - # ifdef STUBBORN_ALLOC - # define GC_changed_pages GC_arrays._changed_pages - # define GC_prev_changed_pages GC_arrays._prev_changed_pages - # endif - # define GC_obj_map GC_arrays._obj_map - # define GC_last_heap_addr GC_arrays._last_heap_addr - # define GC_prev_heap_addr GC_arrays._prev_heap_addr - # define GC_words_allocd GC_arrays._words_allocd - # define GC_words_wasted GC_arrays._words_wasted - # define GC_large_free_bytes GC_arrays._large_free_bytes - # define GC_words_finalized GC_arrays._words_finalized - # define GC_non_gc_bytes_at_gc GC_arrays._non_gc_bytes_at_gc - # define GC_mem_freed GC_arrays._mem_freed - # define GC_scratch_end_ptr GC_arrays._scratch_end_ptr - # define GC_scratch_last_end_ptr GC_arrays._scratch_last_end_ptr - # define GC_mark_procs GC_arrays._mark_procs - # define GC_heapsize GC_arrays._heapsize - # define GC_max_heapsize GC_arrays._max_heapsize - # define GC_requested_heapsize GC_arrays._requested_heapsize - # define GC_words_allocd_before_gc GC_arrays._words_allocd_before_gc - # define GC_heap_sects GC_arrays._heap_sects - # define GC_last_stack GC_arrays._last_stack - # ifdef USE_MUNMAP - # define GC_unmapped_bytes GC_arrays._unmapped_bytes - # endif - # ifdef MSWIN32 - # define GC_heap_bases GC_arrays._heap_bases - # endif - # define GC_static_roots GC_arrays._static_roots - # define GC_root_index GC_arrays._root_index - # define GC_excl_table GC_arrays._excl_table - # define GC_all_nils GC_arrays._all_nils - # define GC_top_index GC_arrays._top_index - # if defined(PROC_VDB) || defined(MPROTECT_VDB) - # define GC_grungy_pages GC_arrays._grungy_pages - # endif - # ifdef MPROTECT_VDB - # define GC_dirty_pages GC_arrays._dirty_pages - # endif - # ifdef PROC_VDB - # define GC_written_pages GC_arrays._written_pages - # endif - # ifdef GATHERSTATS - # define GC_composite_in_use GC_arrays._composite_in_use - # define GC_atomic_in_use GC_arrays._atomic_in_use - # endif - # ifdef MERGE_SIZES - # define GC_size_map GC_arrays._size_map - # endif - - # define beginGC_arrays ((ptr_t)(&GC_arrays)) - # define endGC_arrays (((ptr_t)(&GC_arrays)) + (sizeof GC_arrays)) - - #define USED_HEAP_SIZE (GC_heapsize - GC_large_free_bytes) - - /* Object kinds: */ - # define MAXOBJKINDS 16 - - extern struct obj_kind { - ptr_t *ok_freelist; /* Array of free listheaders for this kind of object */ - /* Point either to GC_arrays or to storage allocated */ - /* with GC_scratch_alloc. */ - struct hblk **ok_reclaim_list; - /* List headers for lists of blocks waiting to be */ - /* swept. */ - word ok_descriptor; /* Descriptor template for objects in this */ - /* block. */ - GC_bool ok_relocate_descr; - /* Add object size in bytes to descriptor */ - /* template to obtain descriptor. Otherwise */ - /* template is used as is. */ - GC_bool ok_init; /* Clear objects before putting them on the free list. */ - } GC_obj_kinds[MAXOBJKINDS]; - - # define endGC_obj_kinds (((ptr_t)(&GC_obj_kinds)) + (sizeof GC_obj_kinds)) - - # define end_gc_area ((ptr_t)endGC_arrays == (ptr_t)(&GC_obj_kinds) ? \ - endGC_obj_kinds : endGC_arrays) - - /* Predefined kinds: */ - # define PTRFREE 0 - # define NORMAL 1 - # define UNCOLLECTABLE 2 - # ifdef ATOMIC_UNCOLLECTABLE - # define AUNCOLLECTABLE 3 - # define STUBBORN 4 - # define IS_UNCOLLECTABLE(k) (((k) & ~1) == UNCOLLECTABLE) - # else - # define STUBBORN 3 - # define IS_UNCOLLECTABLE(k) ((k) == UNCOLLECTABLE) - # endif - - extern int GC_n_kinds; - - GC_API word GC_fo_entries; - - extern word GC_n_heap_sects; /* Number of separately added heap */ - /* sections. */ - - extern word GC_page_size; - - # ifdef MSWIN32 - extern word GC_n_heap_bases; /* See GC_heap_bases. */ - # endif - - extern word GC_total_stack_black_listed; - /* Number of bytes on stack blacklist. */ - - extern word GC_black_list_spacing; - /* Average number of bytes between blacklisted */ - /* blocks. Approximate. */ - /* Counts only blocks that are */ - /* "stack-blacklisted", i.e. that are */ - /* problematic in the interior of an object. */ - - extern char * GC_invalid_map; - /* Pointer to the nowhere valid hblk map */ - /* Blocks pointing to this map are free. */ - - extern struct hblk * GC_hblkfreelist[]; - /* List of completely empty heap blocks */ - /* Linked through hb_next field of */ - /* header structure associated with */ - /* block. */ - - extern GC_bool GC_is_initialized; /* GC_init() has been run. */ - - extern GC_bool GC_objects_are_marked; /* There are marked objects in */ - /* the heap. */ - - #ifndef SMALL_CONFIG - extern GC_bool GC_incremental; - /* Using incremental/generational collection. */ - #else - # define GC_incremental FALSE - /* Hopefully allow optimizer to remove some code. */ - #endif - - extern GC_bool GC_dirty_maintained; - /* Dirty bits are being maintained, */ - /* either for incremental collection, */ - /* or to limit the root set. */ - - extern word GC_root_size; /* Total size of registered root sections */ - - extern GC_bool GC_debugging_started; /* GC_debug_malloc has been called. */ - - extern ptr_t GC_least_plausible_heap_addr; - extern ptr_t GC_greatest_plausible_heap_addr; - /* Bounds on the heap. Guaranteed valid */ - /* Likely to include future heap expansion. */ - - /* Operations */ - # ifndef abs - # define abs(x) ((x) < 0? (-(x)) : (x)) - # endif - - - /* Marks are in a reserved area in */ - /* each heap block. Each word has one mark bit associated */ - /* with it. Only those corresponding to the beginning of an */ - /* object are used. */ - - - /* Mark bit operations */ - - /* - * Retrieve, set, clear the mark bit corresponding - * to the nth word in a given heap block. - * - * (Recall that bit n corresponds to object beginning at word n - * relative to the beginning of the block, including unused words) - */ - - # define mark_bit_from_hdr(hhdr,n) (((hhdr)->hb_marks[divWORDSZ(n)] \ - >> (modWORDSZ(n))) & (word)1) - # define set_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \ - |= (word)1 << modWORDSZ(n) - - # define clear_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \ - &= ~((word)1 << modWORDSZ(n)) - - /* Important internal collector routines */ - - ptr_t GC_approx_sp(); - - GC_bool GC_should_collect(); - - void GC_apply_to_all_blocks(/*fn, client_data*/); - /* Invoke fn(hbp, client_data) for each */ - /* allocated heap block. */ - struct hblk * GC_next_used_block(/* struct hblk * h */); - /* Return first in-use block >= h */ - struct hblk * GC_prev_block(/* struct hblk * h */); - /* Return last block <= h. Returned block */ - /* is managed by GC, but may or may not be in */ - /* use. */ - void GC_mark_init(); - void GC_clear_marks(); /* Clear mark bits for all heap objects. */ - void GC_invalidate_mark_state(); /* Tell the marker that marked */ - /* objects may point to unmarked */ - /* ones, and roots may point to */ - /* unmarked objects. */ - /* Reset mark stack. */ - void GC_mark_from_mark_stack(); /* Mark from everything on the mark stack. */ - /* Return after about one pages worth of */ - /* work. */ - GC_bool GC_mark_stack_empty(); - GC_bool GC_mark_some(/* cold_gc_frame */); - /* Perform about one pages worth of marking */ - /* work of whatever kind is needed. Returns */ - /* quickly if no collection is in progress. */ - /* Return TRUE if mark phase finished. */ - void GC_initiate_gc(); /* initiate collection. */ - /* If the mark state is invalid, this */ - /* becomes full colleection. Otherwise */ - /* it's partial. */ - void GC_push_all(/*b,t*/); /* Push everything in a range */ - /* onto mark stack. */ - void GC_push_dirty(/*b,t*/); /* Push all possibly changed */ - /* subintervals of [b,t) onto */ - /* mark stack. */ - #ifndef SMALL_CONFIG - void GC_push_conditional(/* ptr_t b, ptr_t t, GC_bool all*/); - #else - # define GC_push_conditional(b, t, all) GC_push_all(b, t) - #endif - /* Do either of the above, depending */ - /* on the third arg. */ - void GC_push_all_stack(/*b,t*/); /* As above, but consider */ - /* interior pointers as valid */ - void GC_push_all_eager(/*b,t*/); /* Same as GC_push_all_stack, but */ - /* ensures that stack is scanned */ - /* immediately, not just scheduled */ - /* for scanning. */ - #ifndef THREADS - void GC_push_all_stack_partially_eager(/* bottom, top, cold_gc_frame */); - /* Similar to GC_push_all_eager, but only the */ - /* part hotter than cold_gc_frame is scanned */ - /* immediately. Needed to endure that callee- */ - /* save registers are not missed. */ - #else - /* In the threads case, we push part of the current thread stack */ - /* with GC_push_all_eager when we push the registers. This gets the */ - /* callee-save registers that may disappear. The remainder of the */ - /* stacks are scheduled for scanning in *GC_push_other_roots, which */ - /* is thread-package-specific. */ - #endif - void GC_push_current_stack(/* ptr_t cold_gc_frame */); - /* Push enough of the current stack eagerly to */ - /* ensure that callee-save registers saved in */ - /* GC frames are scanned. */ - /* In the non-threads case, schedule entire */ - /* stack for scanning. */ - void GC_push_roots(/* GC_bool all, ptr_t cold_gc_frame */); - /* Push all or dirty roots. */ - extern void (*GC_push_other_roots)(); - /* Push system or application specific roots */ - /* onto the mark stack. In some environments */ - /* (e.g. threads environments) this is */ - /* predfined to be non-zero. A client supplied */ - /* replacement should also call the original */ - /* function. */ - extern void (*GC_start_call_back)(/* void */); - /* Called at start of full collections. */ - /* Not called if 0. Called with allocation */ - /* lock held. */ - /* 0 by default. */ - void GC_push_regs(); /* Push register contents onto mark stack. */ - /* If NURSERY is defined, the default push */ - /* action can be overridden with GC_push_proc */ - void GC_remark(); /* Mark from all marked objects. Used */ - /* only if we had to drop something. */ - - # ifdef NURSERY - extern void (*GC_push_proc)(ptr_t); - # endif - # if defined(MSWIN32) - void __cdecl GC_push_one(); - # else - void GC_push_one(/*p*/); /* If p points to an object, mark it */ - /* and push contents on the mark stack */ - # endif - void GC_push_one_checked(/*p*/); /* Ditto, omits plausibility test */ - void GC_push_marked(/* struct hblk h, hdr * hhdr */); - /* Push contents of all marked objects in h onto */ - /* mark stack. */ - #ifdef SMALL_CONFIG - # define GC_push_next_marked_dirty(h) GC_push_next_marked(h) - #else - struct hblk * GC_push_next_marked_dirty(/* h */); - /* Invoke GC_push_marked on next dirty block above h. */ - /* Return a pointer just past the end of this block. */ - #endif /* !SMALL_CONFIG */ - struct hblk * GC_push_next_marked(/* h */); - /* Ditto, but also mark from clean pages. */ - struct hblk * GC_push_next_marked_uncollectable(/* h */); - /* Ditto, but mark only from uncollectable pages. */ - GC_bool GC_stopped_mark(); /* Stop world and mark from all roots */ - /* and rescuers. */ - void GC_clear_hdr_marks(/* hhdr */); /* Clear the mark bits in a header */ - void GC_set_hdr_marks(/* hhdr */); /* Set the mark bits in a header */ - void GC_add_roots_inner(); - GC_bool GC_is_static_root(/* ptr_t p */); - /* Is the address p in one of the registered static */ - /* root sections? */ - void GC_register_dynamic_libraries(); - /* Add dynamic library data sections to the root set. */ - - /* Machine dependent startup routines */ - ptr_t GC_get_stack_base(); - void GC_register_data_segments(); - - /* Black listing: */ - void GC_bl_init(); - # ifndef ALL_INTERIOR_POINTERS - void GC_add_to_black_list_normal(word /* bits, maybe source */); - /* Register bits as a possible future false */ - /* reference from the heap or static data */ - # ifdef PRINT_BLACK_LIST - # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ - GC_add_to_black_list_normal((word) bits, source) - # else - # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ - GC_add_to_black_list_normal((word) bits) - # endif - # else - # ifdef PRINT_BLACK_LIST - # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ - GC_add_to_black_list_stack((word) bits, source) - # else - # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ - GC_add_to_black_list_stack((word) bits) - # endif - # endif - - void GC_add_to_black_list_stack(/* bits, maybe source */); - struct hblk * GC_is_black_listed(/* h, len */); - /* If there are likely to be false references */ - /* to a block starting at h of the indicated */ - /* length, then return the next plausible */ - /* starting location for h that might avoid */ - /* these false references. */ - void GC_promote_black_lists(); - /* Declare an end to a black listing phase. */ - void GC_unpromote_black_lists(); - /* Approximately undo the effect of the above. */ - /* This actually loses some information, but */ - /* only in a reasonably safe way. */ - word GC_number_stack_black_listed(/*struct hblk *start, struct hblk *endp1 */); - /* Return the number of (stack) blacklisted */ - /* blocks in the range for statistical */ - /* purposes. */ - - ptr_t GC_scratch_alloc(/*bytes*/); - /* GC internal memory allocation for */ - /* small objects. Deallocation is not */ - /* possible. */ - - /* Heap block layout maps: */ - void GC_invalidate_map(/* hdr */); - /* Remove the object map associated */ - /* with the block. This identifies */ - /* the block as invalid to the mark */ - /* routines. */ - GC_bool GC_add_map_entry(/*sz*/); - /* Add a heap block map for objects of */ - /* size sz to obj_map. */ - /* Return FALSE on failure. */ - void GC_register_displacement_inner(/*offset*/); - /* Version of GC_register_displacement */ - /* that assumes lock is already held */ - /* and signals are already disabled. */ - - /* hblk allocation: */ - void GC_new_hblk(/*size_in_words, kind*/); - /* Allocate a new heap block, and build */ - /* a free list in it. */ - struct hblk * GC_allochblk(/*size_in_words, kind*/); - /* Allocate a heap block, clear it if */ - /* for composite objects, inform */ - /* the marker that block is valid */ - /* for objects of indicated size. */ - /* sz < 0 ==> atomic. */ - void GC_freehblk(); /* Deallocate a heap block and mark it */ - /* as invalid. */ - - /* Misc GC: */ - void GC_init_inner(); - GC_bool GC_expand_hp_inner(); - void GC_start_reclaim(/*abort_if_found*/); - /* Restore unmarked objects to free */ - /* lists, or (if abort_if_found is */ - /* TRUE) report them. */ - /* Sweeping of small object pages is */ - /* largely deferred. */ - void GC_continue_reclaim(/*size, kind*/); - /* Sweep pages of the given size and */ - /* kind, as long as possible, and */ - /* as long as the corr. free list is */ - /* empty. */ - void GC_reclaim_or_delete_all(); - /* Arrange for all reclaim lists to be */ - /* empty. Judiciously choose between */ - /* sweeping and discarding each page. */ - GC_bool GC_reclaim_all(/* GC_stop_func f*/); - /* Reclaim all blocks. Abort (in a */ - /* consistent state) if f returns TRUE. */ - GC_bool GC_block_empty(/* hhdr */); /* Block completely unmarked? */ - GC_bool GC_never_stop_func(); /* Returns FALSE. */ - GC_bool GC_try_to_collect_inner(/* GC_stop_func f */); - /* Collect; caller must have acquired */ - /* lock and disabled signals. */ - /* Collection is aborted if f returns */ - /* TRUE. Returns TRUE if it completes */ - /* successfully. */ - # define GC_gcollect_inner() \ - (void) GC_try_to_collect_inner(GC_never_stop_func) - void GC_finish_collection(); /* Finish collection. Mark bits are */ - /* consistent and lock is still held. */ - GC_bool GC_collect_or_expand(/* needed_blocks */); - /* Collect or expand heap in an attempt */ - /* make the indicated number of free */ - /* blocks available. Should be called */ - /* until the blocks are available or */ - /* until it fails by returning FALSE. */ - GC_API void GC_init(); /* Initialize collector. */ - void GC_collect_a_little_inner(/* int n */); - /* Do n units worth of garbage */ - /* collection work, if appropriate. */ - /* A unit is an amount appropriate for */ - /* HBLKSIZE bytes of allocation. */ - ptr_t GC_generic_malloc(word bytes, int kind); - /* Allocate an object of the given */ - /* kind. By default, there are only */ - /* a few kinds: composite(pointerfree), */ - /* atomic, uncollectable, etc. */ - /* We claim it's possible for clever */ - /* client code that understands GC */ - /* internals to add more, e.g. to */ - /* communicate object layout info */ - /* to the collector. */ - ptr_t GC_generic_malloc_ignore_off_page(/* bytes, kind */); - /* As above, but pointers past the */ - /* first page of the resulting object */ - /* are ignored. */ - ptr_t GC_generic_malloc_inner(word bytes, int kind); - /* Ditto, but I already hold lock, etc. */ - ptr_t GC_generic_malloc_words_small GC_PROTO((size_t words, int kind)); - /* As above, but size in units of words */ - /* Bypasses MERGE_SIZES. Assumes */ - /* words <= MAXOBJSZ. */ - ptr_t GC_generic_malloc_inner_ignore_off_page(/* bytes, kind */); - /* Allocate an object, where */ - /* the client guarantees that there */ - /* will always be a pointer to the */ - /* beginning of the object while the */ - /* object is live. */ - ptr_t GC_allocobj(/* sz_inn_words, kind */); - /* Make the indicated */ - /* free list nonempty, and return its */ - /* head. */ - - void GC_init_headers(); - struct hblkhdr * GC_install_header(/*h*/); - /* Install a header for block h. */ - /* Return 0 on failure, or the header */ - /* otherwise. */ - GC_bool GC_install_counts(/*h, sz*/); - /* Set up forwarding counts for block */ - /* h of size sz. */ - /* Return FALSE on failure. */ - void GC_remove_header(/*h*/); - /* Remove the header for block h. */ - void GC_remove_counts(/*h, sz*/); - /* Remove forwarding counts for h. */ - hdr * GC_find_header(ptr_t /*p*/); /* Debugging only. */ - - void GC_finalize(); /* Perform all indicated finalization actions */ - /* on unmarked objects. */ - /* Unreachable finalizable objects are enqueued */ - /* for processing by GC_invoke_finalizers. */ - /* Invoked with lock. */ - - void GC_add_to_heap(/*p, bytes*/); - /* Add a HBLKSIZE aligned chunk to the heap. */ - - void GC_print_obj(/* ptr_t p */); - /* P points to somewhere inside an object with */ - /* debugging info. Print a human readable */ - /* description of the object to stderr. */ - extern void (*GC_check_heap)(); - /* Check that all objects in the heap with */ - /* debugging info are intact. Print */ - /* descriptions of any that are not. */ - extern void (*GC_print_heap_obj)(/* ptr_t p */); - /* If possible print s followed by a more */ - /* detailed description of the object */ - /* referred to by p. */ - - /* Memory unmapping: */ - #ifdef USE_MUNMAP - void GC_unmap_old(void); - void GC_merge_unmapped(void); - void GC_unmap(ptr_t start, word bytes); - void GC_remap(ptr_t start, word bytes); - void GC_unmap_gap(ptr_t start1, word bytes1, ptr_t start2, word bytes2); - #endif - - /* Virtual dirty bit implementation: */ - /* Each implementation exports the following: */ - void GC_read_dirty(); /* Retrieve dirty bits. */ - GC_bool GC_page_was_dirty(/* struct hblk * h */); - /* Read retrieved dirty bits. */ - GC_bool GC_page_was_ever_dirty(/* struct hblk * h */); - /* Could the page contain valid heap pointers? */ - void GC_is_fresh(/* struct hblk * h, word number_of_blocks */); - /* Assert the region currently contains no */ - /* valid pointers. */ - void GC_write_hint(/* struct hblk * h */); - /* h is about to be written. */ - void GC_dirty_init(); - - /* Slow/general mark bit manipulation: */ - GC_API GC_bool GC_is_marked(); - void GC_clear_mark_bit(); - void GC_set_mark_bit(); - - /* Stubborn objects: */ - void GC_read_changed(); /* Analogous to GC_read_dirty */ - GC_bool GC_page_was_changed(/* h */); /* Analogous to GC_page_was_dirty */ - void GC_clean_changing_list(); /* Collect obsolete changing list entries */ - void GC_stubborn_init(); - - /* Debugging print routines: */ - void GC_print_block_list(); - void GC_print_hblkfreelist(); - void GC_print_heap_sects(); - void GC_print_static_roots(); - void GC_dump(); - - #ifdef KEEP_BACK_PTRS - void GC_store_back_pointer(ptr_t source, ptr_t dest); - void GC_marked_for_finalization(ptr_t dest); - # define GC_STORE_BACK_PTR(source, dest) GC_store_back_pointer(source, dest) - # define GC_MARKED_FOR_FINALIZATION(dest) GC_marked_for_finalization(dest) - #else - # define GC_STORE_BACK_PTR(source, dest) - # define GC_MARKED_FOR_FINALIZATION(dest) - #endif - - /* Make arguments appear live to compiler */ - # ifdef __WATCOMC__ - void GC_noop(void*, ...); - # else - GC_API void GC_noop(); - # endif - - void GC_noop1 GC_PROTO((word)); - - /* Logging and diagnostic output: */ - GC_API void GC_printf GC_PROTO((char * format, long, long, long, long, long, long)); - /* A version of printf that doesn't allocate, */ - /* is restricted to long arguments, and */ - /* (unfortunately) doesn't use varargs for */ - /* portability. Restricted to 6 args and */ - /* 1K total output length. */ - /* (We use sprintf. Hopefully that doesn't */ - /* allocate for long arguments.) */ - # define GC_printf0(f) GC_printf(f, 0l, 0l, 0l, 0l, 0l, 0l) - # define GC_printf1(f,a) GC_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l) - # define GC_printf2(f,a,b) GC_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l) - # define GC_printf3(f,a,b,c) GC_printf(f, (long)a, (long)b, (long)c, 0l, 0l, 0l) - # define GC_printf4(f,a,b,c,d) GC_printf(f, (long)a, (long)b, (long)c, \ - (long)d, 0l, 0l) - # define GC_printf5(f,a,b,c,d,e) GC_printf(f, (long)a, (long)b, (long)c, \ - (long)d, (long)e, 0l) - # define GC_printf6(f,a,b,c,d,e,g) GC_printf(f, (long)a, (long)b, (long)c, \ - (long)d, (long)e, (long)g) - - void GC_err_printf(/* format, a, b, c, d, e, f */); - # define GC_err_printf0(f) GC_err_puts(f) - # define GC_err_printf1(f,a) GC_err_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l) - # define GC_err_printf2(f,a,b) GC_err_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l) - # define GC_err_printf3(f,a,b,c) GC_err_printf(f, (long)a, (long)b, (long)c, \ - 0l, 0l, 0l) - # define GC_err_printf4(f,a,b,c,d) GC_err_printf(f, (long)a, (long)b, \ - (long)c, (long)d, 0l, 0l) - # define GC_err_printf5(f,a,b,c,d,e) GC_err_printf(f, (long)a, (long)b, \ - (long)c, (long)d, \ - (long)e, 0l) - # define GC_err_printf6(f,a,b,c,d,e,g) GC_err_printf(f, (long)a, (long)b, \ - (long)c, (long)d, \ - (long)e, (long)g) - /* Ditto, writes to stderr. */ - - void GC_err_puts(/* char *s */); - /* Write s to stderr, don't buffer, don't add */ - /* newlines, don't ... */ - - - # ifdef GC_ASSERTIONS - # define GC_ASSERT(expr) if(!(expr)) {\ - GC_err_printf2("Assertion failure: %s:%ld\n", \ - __FILE__, (unsigned long)__LINE__); \ - ABORT("assertion failure"); } - # else - # define GC_ASSERT(expr) - # endif - - # endif /* GC_PRIVATE_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_private.h gcc-3.1/boehm-gc/gc_private.h *** gcc-3.0.4/boehm-gc/gc_private.h Wed Jun 30 12:43:43 1999 --- gcc-3.1/boehm-gc/gc_private.h Thu Jan 1 00:00:00 1970 *************** *** 1 **** - # include "gc_priv.h" --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gc_typed.h gcc-3.1/boehm-gc/gc_typed.h *** gcc-3.0.4/boehm-gc/gc_typed.h Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/gc_typed.h Thu Jan 1 00:00:00 1970 *************** *** 1,93 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. - * Copyright 1996 Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - /* - * Some simple primitives for allocation with explicit type information. - * Facilities for dynamic type inference may be added later. - * Should be used only for extremely performance critical applications, - * or if conservative collector leakage is otherwise a problem (unlikely). - * Note that this is implemented completely separately from the rest - * of the collector, and is not linked in unless referenced. - * This does not currently support GC_DEBUG in any interesting way. - */ - /* Boehm, May 19, 1994 2:13 pm PDT */ - - #ifndef _GC_TYPED_H - # define _GC_TYPED_H - # ifndef _GC_H - # include "gc.h" - # endif - - typedef GC_word * GC_bitmap; - /* The least significant bit of the first word is one if */ - /* the first word in the object may be a pointer. */ - - # define GC_get_bit(bm, index) \ - (((bm)[divWORDSZ(index)] >> modWORDSZ(index)) & 1) - # define GC_set_bit(bm, index) \ - (bm)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index) - - typedef GC_word GC_descr; - - GC_API GC_descr GC_make_descriptor GC_PROTO((GC_bitmap bm, size_t len)); - /* Return a type descriptor for the object whose layout */ - /* is described by the argument. */ - /* The least significant bit of the first word is one */ - /* if the first word in the object may be a pointer. */ - /* The second argument specifies the number of */ - /* meaningful bits in the bitmap. The actual object */ - /* may be larger (but not smaller). Any additional */ - /* words in the object are assumed not to contain */ - /* pointers. */ - /* Returns a conservative approximation in the */ - /* (unlikely) case of insufficient memory to build */ - /* the descriptor. Calls to GC_make_descriptor */ - /* may consume some amount of a finite resource. This */ - /* is intended to be called once per type, not once */ - /* per allocation. */ - - GC_API GC_PTR GC_malloc_explicitly_typed - GC_PROTO((size_t size_in_bytes, GC_descr d)); - /* Allocate an object whose layout is described by d. */ - /* The resulting object MAY NOT BE PASSED TO REALLOC. */ - /* The returned object is cleared. */ - - GC_API GC_PTR GC_malloc_explicitly_typed_ignore_off_page - GC_PROTO((size_t size_in_bytes, GC_descr d)); - - GC_API GC_PTR GC_calloc_explicitly_typed - GC_PROTO((size_t nelements, - size_t element_size_in_bytes, - GC_descr d)); - /* Allocate an array of nelements elements, each of the */ - /* given size, and with the given descriptor. */ - /* The elemnt size must be a multiple of the byte */ - /* alignment required for pointers. E.g. on a 32-bit */ - /* machine with 16-bit aligned pointers, size_in_bytes */ - /* must be a multiple of 2. */ - /* Returned object is cleared. */ - - #ifdef GC_DEBUG - # define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) GC_MALLOC(bytes) - # define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes) - #else - # define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) \ - GC_malloc_explicitly_typed(bytes, d) - # define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) \ - GC_calloc_explicitly_typed(n, bytes, d) - #endif /* !GC_DEBUG */ - - - #endif /* _GC_TYPED_H */ - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gcconfig.h gcc-3.1/boehm-gc/gcconfig.h *** gcc-3.0.4/boehm-gc/gcconfig.h Wed Sep 26 13:10:55 2001 --- gcc-3.1/boehm-gc/gcconfig.h Thu Jan 1 00:00:00 1970 *************** *** 1,1387 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1994, 2001 by Xerox Corporation. All rights reserved. - * Copyright (c) 1996 by Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - - #ifndef GCCONFIG_H - - # define GCCONFIG_H - - /* Machine dependent parameters. Some tuning parameters can be found */ - /* near the top of gc_private.h. */ - - /* Machine specific parts contributed by various people. See README file. */ - - /* First a unified test for Linux: */ - # if defined(linux) || defined(__linux__) - # define LINUX - # endif - - /* Determine the machine type: */ - # if defined(sun) && defined(mc68000) - # define M68K - # define SUNOS4 - # define mach_type_known - # endif - # if defined(hp9000s300) - # define M68K - # define HP - # define mach_type_known - # endif - # if defined(__OpenBSD__) && defined(m68k) - # define M68K - # define OPENBSD - # define mach_type_known - # endif - # if defined(__OpenBSD__) && defined(__sparc__) - # define SPARC - # define OPENBSD - # define mach_type_known - # endif - # if defined(__NetBSD__) && defined(m68k) - # define M68K - # define NETBSD - # define mach_type_known - # endif - # if defined(__NetBSD__) && defined(arm32) - # define ARM32 - # define NETBSD - # define mach_type_known - # endif - # if defined(vax) - # define VAX - # ifdef ultrix - # define ULTRIX - # else - # define BSD - # endif - # define mach_type_known - # endif - # if defined(mips) || defined(__mips) - # define MIPS - # if !defined(LINUX) - # if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__) - # define ULTRIX - # else - # if defined(_SYSTYPE_SVR4) || defined(SYSTYPE_SVR4) \ - || defined(__SYSTYPE_SVR4__) - # define IRIX5 /* or IRIX 6.X */ - # else - # define RISCOS /* or IRIX 4.X */ - # endif - # endif - # endif /* !LINUX */ - # define mach_type_known - # endif - # if defined(sequent) && defined(i386) - # define I386 - # define SEQUENT - # define mach_type_known - # endif - # if defined(sun) && defined(i386) - # define I386 - # define SUNOS5 - # define mach_type_known - # endif - # if (defined(__OS2__) || defined(__EMX__)) && defined(__32BIT__) - # define I386 - # define OS2 - # define mach_type_known - # endif - # if defined(ibm032) - # define RT - # define mach_type_known - # endif - # if defined(sun) && (defined(sparc) || defined(__sparc)) - # define SPARC - /* Test for SunOS 5.x */ - # include - # ifdef ECHRNG - # define SUNOS5 - # else - # define SUNOS4 - # endif - # define mach_type_known - # endif - # if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \ - && !defined(__OpenBSD__) - # define SPARC - # define DRSNX - # define mach_type_known - # endif - # if defined(_IBMR2) - # define RS6000 - # define mach_type_known - # endif - # if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386) - /* The above test may need refinement */ - # define I386 - # if defined(_SCO_ELF) - # define SCO_ELF - # else - # define SCO - # endif - # define mach_type_known - # endif - # if defined(_AUX_SOURCE) - # define M68K - # define SYSV - # define mach_type_known - # endif - # if defined(_PA_RISC1_0) || defined(_PA_RISC1_1) || defined(_PA_RISC2_0) \ - || defined(hppa) || defined(__hppa__) - # define HP_PA - # ifndef LINUX - # define HPUX - # endif - # define mach_type_known - # endif - # if defined(LINUX) && (defined(i386) || defined(__i386__)) - # define I386 - # define mach_type_known - # endif - # if defined(LINUX) && (defined(__ia64__) || defined(__ia64)) - # define IA64 - # define mach_type_known - # endif - # if defined(LINUX) && defined(powerpc) - # define POWERPC - # define mach_type_known - # endif - # if defined(LINUX) && defined(__mc68000__) - # define M68K - # define mach_type_known - # endif - # if defined(LINUX) && (defined(sparc) || defined(__sparc__)) - # define SPARC - # define mach_type_known - # endif - # if defined(LINUX) && defined(__arm__) - # define ARM32 - # define mach_type_known - # endif - # if defined(__alpha) || defined(__alpha__) - # define ALPHA - # if !defined(LINUX) - # define OSF1 /* a.k.a Digital Unix */ - # endif - # define mach_type_known - # endif - # if defined(_AMIGA) && !defined(AMIGA) - # define AMIGA - # endif - # ifdef AMIGA - # define M68K - # define mach_type_known - # endif - # if defined(THINK_C) || defined(__MWERKS__) && !defined(__powerc) - # define M68K - # define MACOS - # define mach_type_known - # endif - # if defined(__MWERKS__) && defined(__powerc) - # define POWERPC - # define MACOS - # define mach_type_known - # endif - # if defined(macosx) - # define MACOSX - # define POWERPC - # define mach_type_known - # endif - # if defined(NeXT) && defined(mc68000) - # define M68K - # define NEXT - # define mach_type_known - # endif - # if defined(NeXT) && defined(i386) - # define I386 - # define NEXT - # define mach_type_known - # endif - # if defined(__OpenBSD__) && defined(i386) - # define I386 - # define OPENBSD - # define mach_type_known - # endif - # if defined(__FreeBSD__) && defined(i386) - # define I386 - # define FREEBSD - # define mach_type_known - # endif - # if defined(__NetBSD__) && defined(i386) - # define I386 - # define NETBSD - # define mach_type_known - # endif - # if defined(bsdi) && defined(i386) - # define I386 - # define BSDI - # define mach_type_known - # endif - # if !defined(mach_type_known) && defined(__386BSD__) - # define I386 - # define THREE86BSD - # define mach_type_known - # endif - # if defined(_CX_UX) && defined(_M88K) - # define M88K - # define CX_UX - # define mach_type_known - # endif - # if defined(DGUX) - # define M88K - /* DGUX defined */ - # define mach_type_known - # endif - # if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ - || defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__) - # define I386 - # define MSWIN32 /* or Win32s */ - # define mach_type_known - # endif - # if defined(__DJGPP__) - # define I386 - # ifndef DJGPP - # define DJGPP /* MSDOS running the DJGPP port of GCC */ - # endif - # define mach_type_known - # endif - # if defined(__CYGWIN32__) || defined(__CYGWIN__) - # define I386 - # define CYGWIN32 - # define mach_type_known - # endif - # if defined(__MINGW32__) - # define I386 - # define MSWIN32 - # define mach_type_known - # endif - # if defined(__BORLANDC__) - # define I386 - # define MSWIN32 - # define mach_type_known - # endif - # if defined(_UTS) && !defined(mach_type_known) - # define S370 - # define UTS4 - # define mach_type_known - # endif - # if defined(__pj__) - # define PJ - # define mach_type_known - # endif - /* Ivan Demakov */ - # if defined(__WATCOMC__) && defined(__386__) - # define I386 - # if !defined(OS2) && !defined(MSWIN32) && !defined(DOS4GW) - # if defined(__OS2__) - # define OS2 - # else - # if defined(__WINDOWS_386__) || defined(__NT__) - # define MSWIN32 - # else - # define DOS4GW - # endif - # endif - # endif - # define mach_type_known - # endif - # if defined(__embedded__) && defined(PPC) - # define POWERPC - # define mach_type_known - # endif - - /* Feel free to add more clauses here */ - - /* Or manually define the machine type here. A machine type is */ - /* characterized by the architecture. Some */ - /* machine types are further subdivided by OS. */ - /* the macros ULTRIX, RISCOS, and BSD to distinguish. */ - /* Note that SGI IRIX is treated identically to RISCOS. */ - /* SYSV on an M68K actually means A/UX. */ - /* The distinction in these cases is usually the stack starting address */ - # ifndef mach_type_known - --> unknown machine type - # endif - /* Mapping is: M68K ==> Motorola 680X0 */ - /* (SUNOS4,HP,NEXT, and SYSV (A/UX), */ - /* MACOS and AMIGA variants) */ - /* I386 ==> Intel 386 */ - /* (SEQUENT, OS2, SCO, LINUX, NETBSD, */ - /* FREEBSD, THREE86BSD, MSWIN32, */ - /* BSDI,SUNOS5, NEXT, other variants) */ - /* NS32K ==> Encore Multimax */ - /* MIPS ==> R2000 or R3000 */ - /* (RISCOS, ULTRIX variants) */ - /* VAX ==> DEC VAX */ - /* (BSD, ULTRIX variants) */ - /* RS6000 ==> IBM RS/6000 AIX3.X */ - /* RT ==> IBM PC/RT */ - /* HP_PA ==> HP9000/700 & /800 */ - /* HP/UX */ - /* SPARC ==> SPARC v7/v8/v9 */ - /* (SUNOS4, SUNOS5, LINUX, */ - /* DRSNX variants) */ - /* ALPHA ==> DEC Alpha */ - /* (OSF1 and LINUX variants) */ - /* M88K ==> Motorola 88XX0 */ - /* (CX_UX and DGUX) */ - /* S370 ==> 370-like machine */ - /* running Amdahl UTS4 */ - /* ARM32 ==> Intel StrongARM */ - /* IA64 ==> Intel IA64 */ - /* (e.g. Itanium) */ - - - /* - * For each architecture and OS, the following need to be defined: - * - * CPP_WORD_SZ is a simple integer constant representing the word size. - * in bits. We assume byte addressibility, where a byte has 8 bits. - * We also assume CPP_WORD_SZ is either 32 or 64. - * (We care about the length of pointers, not hardware - * bus widths. Thus a 64 bit processor with a C compiler that uses - * 32 bit pointers should use CPP_WORD_SZ of 32, not 64. Default is 32.) - * - * MACH_TYPE is a string representation of the machine type. - * OS_TYPE is analogous for the OS. - * - * ALIGNMENT is the largest N, such that - * all pointer are guaranteed to be aligned on N byte boundaries. - * defining it to be 1 will always work, but perform poorly. - * - * DATASTART is the beginning of the data segment. - * On UNIX systems, the collector will scan the area between DATASTART - * and DATAEND for root pointers. - * - * DATAEND, if not &end. - * - * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice - * the pointer size. - * - * STACKBOTTOM is the cool end of the stack, which is usually the - * highest address in the stack. - * Under PCR or OS/2, we have other ways of finding thread stacks. - * For each machine, the following should: - * 1) define STACK_GROWS_UP if the stack grows toward higher addresses, and - * 2) define exactly one of - * STACKBOTTOM (should be defined to be an expression) - * HEURISTIC1 - * HEURISTIC2 - * If either of the last two macros are defined, then STACKBOTTOM is computed - * during collector startup using one of the following two heuristics: - * HEURISTIC1: Take an address inside GC_init's frame, and round it up to - * the next multiple of STACK_GRAN. - * HEURISTIC2: Take an address inside GC_init's frame, increment it repeatedly - * in small steps (decrement if STACK_GROWS_UP), and read the value - * at each location. Remember the value when the first - * Segmentation violation or Bus error is signalled. Round that - * to the nearest plausible page boundary, and use that instead - * of STACKBOTTOM. - * - * Gustavo Rodriguez-Rivera points out that on most (all?) Unix machines, - * the value of environ is a pointer that can serve as STACKBOTTOM. - * I expect that HEURISTIC2 can be replaced by this approach, which - * interferes far less with debugging. - * - * If no expression for STACKBOTTOM can be found, and neither of the above - * heuristics are usable, the collector can still be used with all of the above - * undefined, provided one of the following is done: - * 1) GC_mark_roots can be changed to somehow mark from the correct stack(s) - * without reference to STACKBOTTOM. This is appropriate for use in - * conjunction with thread packages, since there will be multiple stacks. - * (Allocating thread stacks in the heap, and treating them as ordinary - * heap data objects is also possible as a last resort. However, this is - * likely to introduce significant amounts of excess storage retention - * unless the dead parts of the thread stacks are periodically cleared.) - * 2) Client code may set GC_stackbottom before calling any GC_ routines. - * If the author of the client code controls the main program, this is - * easily accomplished by introducing a new main program, setting - * GC_stackbottom to the address of a local variable, and then calling - * the original main program. The new main program would read something - * like: - * - * # include "gc_private.h" - * - * main(argc, argv, envp) - * int argc; - * char **argv, **envp; - * { - * int dummy; - * - * GC_stackbottom = (ptr_t)(&dummy); - * return(real_main(argc, argv, envp)); - * } - * - * - * Each architecture may also define the style of virtual dirty bit - * implementation to be used: - * MPROTECT_VDB: Write protect the heap and catch faults. - * PROC_VDB: Use the SVR4 /proc primitives to read dirty bits. - * - * An architecture may define DYNAMIC_LOADING if dynamic_load.c - * defined GC_register_dynamic_libraries() for the architecture. - * - * An architecture may define PREFETCH(x) to preload the cache with *x. - * This defaults to a no-op. - * - * PREFETCH_FOR_WRITE(x) is used if *x is about to be written. - * - * An architecture may also define CLEAR_DOUBLE(x) to be a fast way to - * clear the two words at GC_malloc-aligned address x. By default, - * word stores of 0 are used instead. - */ - - - # define STACK_GRAN 0x1000000 - # ifdef M68K - # define MACH_TYPE "M68K" - # define ALIGNMENT 2 - # ifdef OPENBSD - # define OS_TYPE "OPENBSD" - # define HEURISTIC2 - extern char etext; - # define DATASTART ((ptr_t)(&etext)) - # endif - # ifdef NETBSD - # define OS_TYPE "NETBSD" - # define HEURISTIC2 - extern char etext; - # define DATASTART ((ptr_t)(&etext)) - # endif - # ifdef LINUX - # define OS_TYPE "LINUX" - # define STACKBOTTOM ((ptr_t)0xf0000000) - # define MPROTECT_VDB - # ifdef __ELF__ - # define DYNAMIC_LOADING - extern char **__environ; - # define DATASTART ((ptr_t)(&__environ)) - /* hideous kludge: __environ is the first */ - /* word in crt0.o, and delimits the start */ - /* of the data segment, no matter which */ - /* ld options were passed through. */ - /* We could use _etext instead, but that */ - /* would include .rodata, which may */ - /* contain large read-only data tables */ - /* that we'd rather not scan. */ - extern int _end; - # define DATAEND (&_end) - # else - extern int etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) - # endif - # endif - # ifdef SUNOS4 - # define OS_TYPE "SUNOS4" - extern char etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ffff) & ~0x1ffff)) - # define HEURISTIC1 /* differs */ - # define DYNAMIC_LOADING - # endif - # ifdef HP - # define OS_TYPE "HP" - extern char etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) - # define STACKBOTTOM ((ptr_t) 0xffeffffc) - /* empirically determined. seems to work. */ - # include - # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE) - # endif - # ifdef SYSV - # define OS_TYPE "SYSV" - extern etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \ - & ~0x3fffff) \ - +((word)&etext & 0x1fff)) - /* This only works for shared-text binaries with magic number 0413. - The other sorts of SysV binaries put the data at the end of the text, - in which case the default of &etext would work. Unfortunately, - handling both would require having the magic-number available. - -- Parag - */ - # define STACKBOTTOM ((ptr_t)0xFFFFFFFE) - /* The stack starts at the top of memory, but */ - /* 0x0 cannot be used as setjump_test complains */ - /* that the stack direction is incorrect. Two */ - /* bytes down from 0x0 should be safe enough. */ - /* --Parag */ - # include - # define GETPAGESIZE() PAGESIZE /* Is this still right? */ - # endif - # ifdef AMIGA - # define OS_TYPE "AMIGA" - /* STACKBOTTOM and DATASTART handled specially */ - /* in os_dep.c */ - # define DATAEND /* not needed */ - # define GETPAGESIZE() 4096 - # endif - # ifdef MACOS - # ifndef __LOWMEM__ - # include - # endif - # define OS_TYPE "MACOS" - /* see os_dep.c for details of global data segments. */ - # define STACKBOTTOM ((ptr_t) LMGetCurStackBase()) - # define DATAEND /* not needed */ - # define GETPAGESIZE() 4096 - # endif - # ifdef NEXT - # define OS_TYPE "NEXT" - # define DATASTART ((ptr_t) get_etext()) - # define STACKBOTTOM ((ptr_t) 0x4000000) - # define DATAEND /* not needed */ - # endif - # endif - - # ifdef POWERPC - # define MACH_TYPE "POWERPC" - # ifdef MACOS - # define ALIGNMENT 2 /* Still necessary? Could it be 4? */ - # ifndef __LOWMEM__ - # include - # endif - # define OS_TYPE "MACOS" - /* see os_dep.c for details of global data segments. */ - # define STACKBOTTOM ((ptr_t) LMGetCurStackBase()) - # define DATAEND /* not needed */ - # endif - # ifdef LINUX - # define ALIGNMENT 4 /* Guess. Can someone verify? */ - /* This was 2, but that didn't sound right. */ - # define OS_TYPE "LINUX" - # define HEURISTIC1 - # define DYNAMIC_LOADING - # undef STACK_GRAN - # define STACK_GRAN 0x10000000 - /* Stack usually starts at 0x80000000 */ - # define LINUX_DATA_START - extern int _end; - # define DATAEND (&_end) - # endif - # ifdef MACOSX - # define ALIGNMENT 4 - # define OS_TYPE "MACOSX" - # define DATASTART ((ptr_t) get_etext()) - # define STACKBOTTOM ((ptr_t) 0xc0000000) - # define DATAEND /* not needed */ - # endif - # ifdef __embedded__ - # define ALIGNMENT 4 - # define OS_TYPE "EMBEDDED" - extern void __end, __dso_handle; - # define DATASTART (&__dso_handle) /* OK, that's ugly. */ - # define DATAEND (&__end) - /* Stack starts at 0xE0000000 for the simulator. */ - # undef STACK_GRAN - # define STACK_GRAN 0x10000000 - # define HEURISTIC1 - # endif - # endif - - # ifdef VAX - # define MACH_TYPE "VAX" - # define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */ - extern char etext; - # define DATASTART ((ptr_t)(&etext)) - # ifdef BSD - # define OS_TYPE "BSD" - # define HEURISTIC1 - /* HEURISTIC2 may be OK, but it's hard to test. */ - # endif - # ifdef ULTRIX - # define OS_TYPE "ULTRIX" - # define STACKBOTTOM ((ptr_t) 0x7fffc800) - # endif - # endif - - # ifdef RT - # define MACH_TYPE "RT" - # define ALIGNMENT 4 - # define DATASTART ((ptr_t) 0x10000000) - # define STACKBOTTOM ((ptr_t) 0x1fffd800) - # endif - - # ifdef SPARC - # define MACH_TYPE "SPARC" - # if defined(__arch64__) || defined(__sparcv9) - # define ALIGNMENT 8 - # else - # define ALIGNMENT 4 /* Required by hardware */ - # endif - # define ALIGN_DOUBLE - extern int etext; - # ifdef SUNOS5 - # define OS_TYPE "SUNOS5" - extern int _etext; - extern int _end; - extern char * GC_SysVGetDataStart(); - # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext) - # define DATAEND (&_end) - # ifndef USE_MMAP - # define USE_MMAP - # endif - # ifdef USE_MMAP - # define HEAP_START (ptr_t)0x40000000 - # else - # define HEAP_START DATAEND - # endif - # define PROC_VDB - /* HEURISTIC1 reportedly no longer works under 2.7. Thus we */ - /* switched to HEURISTIC2, eventhough it creates some debugging */ - /* issues. */ - # define HEURISTIC2 - # include - # define GETPAGESIZE() sysconf(_SC_PAGESIZE) - /* getpagesize() appeared to be missing from at least one */ - /* Solaris 5.4 installation. Weird. */ - # define DYNAMIC_LOADING - # endif - # ifdef SUNOS4 - # define OS_TYPE "SUNOS4" - /* [If you have a weak stomach, don't read this.] */ - /* We would like to use: */ - /* # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1fff) & ~0x1fff)) */ - /* This fails occasionally, due to an ancient, but very */ - /* persistent ld bug. &etext is set 32 bytes too high. */ - /* We instead read the text segment size from the a.out */ - /* header, which happens to be mapped into our address space */ - /* at the start of the text segment. The detective work here */ - /* was done by Robert Ehrlich, Manuel Serrano, and Bernard */ - /* Serpette of INRIA. */ - /* This assumes ZMAGIC, i.e. demand-loadable executables. */ - # define TEXTSTART 0x2000 - # define DATASTART ((ptr_t)(*(int *)(TEXTSTART+0x4)+TEXTSTART)) - # define MPROTECT_VDB - # define HEURISTIC1 - # define DYNAMIC_LOADING - # endif - # ifdef DRSNX - # define CPP_WORDSZ 32 - # define OS_TYPE "DRSNX" - extern char * GC_SysVGetDataStart(); - extern int etext; - # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext) - # define MPROTECT_VDB - # define STACKBOTTOM ((ptr_t) 0xdfff0000) - # define DYNAMIC_LOADING - # endif - # ifdef LINUX - # define OS_TYPE "LINUX" - # ifdef __ELF__ - # define DYNAMIC_LOADING - # else - Linux Sparc/a.out not supported - # endif - extern int _etext; - extern int _end; - # define DATAEND (&_end) - # define SVR4 - # ifdef __arch64__ - # define STACKBOTTOM ((ptr_t) 0x80000000000ULL) - # define DATASTART (ptr_t)GC_SysVGetDataStart(0x100000, &_etext) - # define CPP_WORDSZ 64 - # else - # define STACKBOTTOM ((ptr_t) 0xf0000000) - # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext) - # endif - # endif - # ifdef OPENBSD - # define OS_TYPE "OPENBSD" - # define STACKBOTTOM ((ptr_t) 0xf8000000) - # define DATASTART ((ptr_t)(&etext)) - # endif - # endif - - # ifdef I386 - # define MACH_TYPE "I386" - # define ALIGNMENT 4 /* Appears to hold for all "32 bit" compilers */ - /* except Borland. The -a4 option fixes */ - /* Borland. */ - /* Ivan Demakov: For Watcom the option is -zp4. */ - # ifndef SMALL_CONFIG - # define ALIGN_DOUBLE /* Not strictly necessary, but may give speed */ - /* improvement on Pentiums. */ - # endif - # ifdef SEQUENT - # define OS_TYPE "SEQUENT" - extern int etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) - # define STACKBOTTOM ((ptr_t) 0x3ffff000) - # endif - # ifdef SUNOS5 - # define OS_TYPE "SUNOS5" - extern int _etext, _end; - extern char * GC_SysVGetDataStart(); - # define DATASTART GC_SysVGetDataStart(0x1000, &_etext) - # define DATAEND (&_end) - # include - # define STACKBOTTOM USRSTACK - /** At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */ - # ifdef SOLARIS25_PROC_VDB_BUG_FIXED - # define PROC_VDB - # endif - # define DYNAMIC_LOADING - # ifndef USE_MMAP - # define USE_MMAP - # endif - # ifdef USE_MMAP - # define HEAP_START (ptr_t)0x40000000 - # else - # define HEAP_START DATAEND - # endif - # endif - # ifdef SCO - # define OS_TYPE "SCO" - extern int etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \ - & ~0x3fffff) \ - +((word)&etext & 0xfff)) - # define STACKBOTTOM ((ptr_t) 0x7ffffffc) - # endif - # ifdef SCO_ELF - # define OS_TYPE "SCO_ELF" - extern int etext; - # define DATASTART ((ptr_t)(&etext)) - # define STACKBOTTOM ((ptr_t) 0x08048000) - # define DYNAMIC_LOADING - # define ELF_CLASS ELFCLASS32 - # endif - # ifdef LINUX - # define OS_TYPE "LINUX" - # define LINUX_STACKBOTTOM - # if 0 - # define HEURISTIC1 - # undef STACK_GRAN - # define STACK_GRAN 0x10000000 - /* STACKBOTTOM is usually 0xc0000000, but this changes with */ - /* different kernel configurations. In particular, systems */ - /* with 2GB physical memory will usually move the user */ - /* address space limit, and hence initial SP to 0x80000000. */ - # endif - # if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC) - /* libgcj: Linux threads don't interact well with the read() wrapper. - Not defining MPROTECT_VDB fixes this. */ - /* # define MPROTECT_VDB */ - # else - /* We seem to get random errors in incremental mode, */ - /* possibly because Linux threads is itself a malloc client */ - /* and can't deal with the signals. */ - # endif - # ifdef __ELF__ - # define DYNAMIC_LOADING - # ifdef UNDEFINED /* includes ro data */ - extern int _etext; - # define DATASTART ((ptr_t)((((word) (&_etext)) + 0xfff) & ~0xfff)) - # endif - # include - # if defined(__GLIBC__) && __GLIBC__ >= 2 - # define LINUX_DATA_START - # else - extern char **__environ; - # define DATASTART ((ptr_t)(&__environ)) - /* hideous kludge: __environ is the first */ - /* word in crt0.o, and delimits the start */ - /* of the data segment, no matter which */ - /* ld options were passed through. */ - /* We could use _etext instead, but that */ - /* would include .rodata, which may */ - /* contain large read-only data tables */ - /* that we'd rather not scan. */ - # endif - extern int _end; - # define DATAEND (&_end) - # else - extern int etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) - # endif - # ifdef USE_I686_PREFETCH - # define PREFETCH(x) \ - __asm__ __volatile__ (" prefetchnta %0": : "m"(*(char *)(x))) - /* Empirically prefetcht0 is much more effective at reducing */ - /* cache miss stalls for the targetted load instructions. But it */ - /* seems to interfere enough with other cache traffic that the net */ - /* result is worse than prefetchnta. */ - # if 0 - /* Using prefetches for write seems to have a slight negative */ - /* impact on performance, at least for a PIII/500. */ - # define PREFETCH_FOR_WRITE(x) \ - __asm__ __volatile__ (" prefetcht0 %0": : "m"(*(char *)(x))) - # endif - # endif - # ifdef USE_3DNOW_PREFETCH - # define PREFETCH(x) \ - __asm__ __volatile__ (" prefetch %0": : "m"(*(char *)(x))) - # define PREFETCH_FOR_WRITE(x) - __asm__ __volatile__ (" prefetchw %0": : "m"(*(char *)(x))) - # endif - # endif - # ifdef CYGWIN32 - # define OS_TYPE "CYGWIN32" - extern int _data_start__; - extern int _data_end__; - extern int _bss_start__; - extern int _bss_end__; - /* For binutils 2.9.1, we have */ - /* DATASTART = _data_start__ */ - /* DATAEND = _bss_end__ */ - /* whereas for some earlier versions it was */ - /* DATASTART = _bss_start__ */ - /* DATAEND = _data_end__ */ - /* To get it right for both, we take the */ - /* minumum/maximum of the two. */ - # define MAX(x,y) ((x) > (y) ? (x) : (y)) - # define MIN(x,y) ((x) < (y) ? (x) : (y)) - # define DATASTART ((ptr_t) MIN(&_data_start__, &_bss_start__)) - # define DATAEND ((ptr_t) MAX(&_data_end__, &_bss_end__)) - # undef STACK_GRAN - # define STACK_GRAN 0x10000 - # define HEURISTIC1 - # endif - # ifdef OS2 - # define OS_TYPE "OS2" - /* STACKBOTTOM and DATASTART are handled specially in */ - /* os_dep.c. OS2 actually has the right */ - /* system call! */ - # define DATAEND /* not needed */ - # endif - # ifdef MSWIN32 - # define OS_TYPE "MSWIN32" - /* STACKBOTTOM and DATASTART are handled specially in */ - /* os_dep.c. */ - # ifndef __WATCOMC__ - # define MPROTECT_VDB - # endif - # define DATAEND /* not needed */ - # endif - # ifdef DJGPP - # define OS_TYPE "DJGPP" - # include "stubinfo.h" - extern int etext; - extern int _stklen; - extern int __djgpp_stack_limit; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ff) & ~0x1ff)) - /* # define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \ - + _stklen)) */ - # define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen)) - /* This may not be right. */ - # endif - # ifdef OPENBSD - # define OS_TYPE "OPENBSD" - # endif - # ifdef FREEBSD - # define OS_TYPE "FREEBSD" - # define MPROTECT_VDB - # endif - # ifdef NETBSD - # define OS_TYPE "NETBSD" - # endif - # ifdef THREE86BSD - # define OS_TYPE "THREE86BSD" - # endif - # ifdef BSDI - # define OS_TYPE "BSDI" - # endif - # if defined(OPENBSD) || defined(FREEBSD) || defined(NETBSD) \ - || defined(THREE86BSD) || defined(BSDI) - # define HEURISTIC2 - extern char etext; - # define DATASTART ((ptr_t)(&etext)) - # endif - # ifdef NEXT - # define OS_TYPE "NEXT" - # define DATASTART ((ptr_t) get_etext()) - # define STACKBOTTOM ((ptr_t)0xc0000000) - # define DATAEND /* not needed */ - # endif - # ifdef DOS4GW - # define OS_TYPE "DOS4GW" - extern long __nullarea; - extern char _end; - extern char *_STACKTOP; - /* Depending on calling conventions Watcom C either precedes - or does not precedes with undescore names of C-variables. - Make sure startup code variables always have the same names. */ - #pragma aux __nullarea "*"; - #pragma aux _end "*"; - # define STACKBOTTOM ((ptr_t) _STACKTOP) - /* confused? me too. */ - # define DATASTART ((ptr_t) &__nullarea) - # define DATAEND ((ptr_t) &_end) - # endif - # endif - - # ifdef NS32K - # define MACH_TYPE "NS32K" - # define ALIGNMENT 4 - extern char **environ; - # define DATASTART ((ptr_t)(&environ)) - /* hideous kludge: environ is the first */ - /* word in crt0.o, and delimits the start */ - /* of the data segment, no matter which */ - /* ld options were passed through. */ - # define STACKBOTTOM ((ptr_t) 0xfffff000) /* for Encore */ - # endif - - # ifdef MIPS - # ifndef ECOS - # define MACH_TYPE "MIPS" - /* LIBGCJ LOCAL: respect predefined DATASTART_IS_ETEXT. */ - # ifdef DATASTART_IS_ETEXT - extern int _etext; - # define DATASTART ((ptr_t)(&_etext)) - # else - /* # define STACKBOTTOM ((ptr_t)0x7fff8000) sometimes also works. */ - # ifdef LINUX - /* This was developed for a linuxce style platform. Probably */ - /* needs to be tweaked for workstation class machines. */ - # define OS_TYPE "LINUX" - extern int __data_start; - # define DATASTART ((ptr_t)(&__data_start)) - # define ALIGNMENT 4 - # define USE_GENERIC_PUSH_REGS 1 - # define STACKBOTTOM 0x80000000 - /* In many cases, this should probably use LINUX_STACKBOTTOM */ - /* instead. But some kernel versions seem to give the wrong */ - /* value from /proc. */ - # endif /* Linux */ - # ifdef ULTRIX - # define HEURISTIC2 - # define DATASTART (ptr_t)0x10000000 - /* Could probably be slightly higher since */ - /* startup code allocates lots of stuff. */ - # define OS_TYPE "ULTRIX" - # define ALIGNMENT 4 - # endif - # ifdef RISCOS - # define HEURISTIC2 - # define DATASTART (ptr_t)0x10000000 - # define OS_TYPE "RISCOS" - # define ALIGNMENT 4 /* Required by hardware */ - # endif - # ifdef IRIX5 - # define HEURISTIC2 - extern int _fdata; - # define DATASTART ((ptr_t)(&_fdata)) - # ifdef USE_MMAP - # define HEAP_START (ptr_t)0x30000000 - # else - # define HEAP_START DATASTART - # endif - /* Lowest plausible heap address. */ - /* In the MMAP case, we map there. */ - /* In either case it is used to identify */ - /* heap sections so they're not */ - /* considered as roots. */ - # define OS_TYPE "IRIX5" - # define MPROTECT_VDB - # ifdef _MIPS_SZPTR - # define CPP_WORDSZ _MIPS_SZPTR - # define ALIGNMENT (_MIPS_SZPTR/8) - # if CPP_WORDSZ != 64 - # define ALIGN_DOUBLE - # endif - # else - # define ALIGNMENT 4 - # define ALIGN_DOUBLE - # endif - # define DYNAMIC_LOADING - # endif - # endif /* DATASTART_IS_ETEXT */ - # endif /* ECOS */ - # ifdef ECOS - extern char __ram_data_start; - extern char __ram_data_end; - # define MACH_TYPE "MIPS" - # define DATASTART (ptr_t)(&__ram_data_start) - # define DATAEND (ptr_t)(&__ram_data_end) - - # define HEURISTIC2 - # define ALIGNMENT 4 - # define ALIGN_DOUBLE - # endif /* ECOS */ - # endif - - # ifdef RS6000 - # define MACH_TYPE "RS6000" - # define ALIGNMENT 4 - # define DATASTART ((ptr_t)0x20000000) - extern int errno; - # define STACKBOTTOM ((ptr_t)((ulong)&errno)) - # define DYNAMIC_LOADING - /* For really old versions of AIX, this may have to be removed. */ - # endif - - # ifdef HP_PA - /* OS is assumed to be HP/UX */ - # define MACH_TYPE "HP_PA" - # define OS_TYPE "HPUX" - # ifdef __LP64__ - # define CPP_WORDSZ 64 - # define ALIGNMENT 8 - # else - # define CPP_WORDSZ 32 - # define ALIGNMENT 4 - # define ALIGN_DOUBLE - # endif - extern int __data_start; - # define DATASTART ((ptr_t)(&__data_start)) - # if 0 - /* The following appears to work for 7xx systems running HP/UX */ - /* 9.xx Furthermore, it might result in much faster */ - /* collections than HEURISTIC2, which may involve scanning */ - /* segments that directly precede the stack. It is not the */ - /* default, since it may not work on older machine/OS */ - /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */ - /* this.) */ - # define STACKBOTTOM ((ptr_t) 0x7b033000) /* from /etc/conf/h/param.h */ - # else - /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2 */ - /* to this. We'll probably do this on other platforms, too. */ - /* For now I'll use it where I can test it. */ - extern char ** environ; - # define STACKBOTTOM ((ptr_t)environ) - # endif - # define STACK_GROWS_UP - # define DYNAMIC_LOADING - # ifndef HPUX_THREADS - # define MPROTECT_VDB - # endif - # include - # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE) - # endif - - # ifdef ALPHA - # define MACH_TYPE "ALPHA" - # define ALIGNMENT 8 - # define USE_GENERIC_PUSH_REGS - /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */ - /* fp registers in some cases when the target is a 21264. The assembly */ - /* code doesn't handle that yet, and version dependencies make that a */ - /* bit tricky. Do the easy thing for now. */ - # ifdef OSF1 - # define OS_TYPE "OSF1" - # define DATASTART ((ptr_t) 0x140000000) - extern int _end; - # define DATAEND ((ptr_t) &_end) - # define HEURISTIC2 - /* Normally HEURISTIC2 is too conervative, since */ - /* the text segment immediately follows the stack. */ - /* Hence we give an upper pound. */ - extern int __start; - # define HEURISTIC2_LIMIT ((ptr_t)((word)(&__start) & ~(getpagesize()-1))) - # define CPP_WORDSZ 64 - # define MPROTECT_VDB - # define DYNAMIC_LOADING - # endif - # ifdef LINUX - # define OS_TYPE "LINUX" - # define CPP_WORDSZ 64 - # define STACKBOTTOM ((ptr_t) 0x120000000) - # ifdef __ELF__ - # define LINUX_DATA_START - # define DYNAMIC_LOADING - /* This doesn't work if the collector is in a dynamic library. */ - # else - # define DATASTART ((ptr_t) 0x140000000) - # endif - extern int _end; - # define DATAEND (&_end) - # undef MPROTECT_VDB - /* Has only been superficially tested. May not */ - /* work on all versions. */ - # endif - # endif - - # ifdef IA64 - # define MACH_TYPE "IA64" - # define ALIGN_DOUBLE - /* Requires 16 byte alignment for malloc */ - # define ALIGNMENT 8 - # define USE_GENERIC_PUSH_REGS - /* We need to get preserved registers in addition to register windows. */ - /* That's easiest to do with setjmp. */ - # ifdef HPUX - --> needs work - # endif - # ifdef LINUX - # define OS_TYPE "LINUX" - # define CPP_WORDSZ 64 - /* This should really be done through /proc, but that */ - /* requires we run on an IA64 kernel. */ - /* The following works on NUE and older kernels: */ - /* # define STACKBOTTOM ((ptr_t) 0xa000000000000000l) */ - /* This does not work on NUE: */ - # define LINUX_STACKBOTTOM - /* We also need the base address of the register stack */ - /* backing store. There should be a better way to get */ - /* this: */ - # define APPROX_BS_BASE ((word)GC_stackbottom-0x80000000) - /* We round to the next multiple of 1 MB, to compensate */ - /* for the fact that the stack base is displaced by */ - /* the environment, etc. */ - # define BACKING_STORE_BASE \ - (ptr_t)((APPROX_BS_BASE + 0xfffff) & ~0xfffff) - - # if 1 - # define SEARCH_FOR_DATA_START - # define DATASTART GC_data_start - # else - extern int data_start; - # define DATASTART ((ptr_t)(&data_start)) - # endif - # define DYNAMIC_LOADING - # define MPROTECT_VDB - /* Requires Linux 2.3.47 or later. */ - extern int _end; - # define DATAEND (&_end) - # define PREFETCH(x) \ - __asm__ (" lfetch [%0]": : "r"((void *)(x))) - # define PREFETCH_FOR_WRITE(x) \ - __asm__ (" lfetch.excl [%0]": : "r"((void *)(x))) - # define CLEAR_DOUBLE(x) \ - __asm__ (" stf.spill [%0]=f0": : "r"((void *)(x))) - # endif - # endif - - # ifdef M88K - # define MACH_TYPE "M88K" - # define ALIGNMENT 4 - # define ALIGN_DOUBLE - extern int etext; - # ifdef CX_UX - # define OS_TYPE "CX_UX" - # define DATASTART ((((word)&etext + 0x3fffff) & ~0x3fffff) + 0x10000) - # endif - # ifdef DGUX - # define OS_TYPE "DGUX" - extern char * GC_SysVGetDataStart(); - # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext) - # endif - # define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */ - # endif - - # ifdef S370 - # define MACH_TYPE "S370" - # define OS_TYPE "UTS4" - # define ALIGNMENT 4 /* Required by hardware */ - extern int etext; - extern int _etext; - extern int _end; - extern char * GC_SysVGetDataStart(); - # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext) - # define DATAEND (&_end) - # define HEURISTIC2 - # endif - - # if defined(PJ) - # define ALIGNMENT 4 - extern int _etext; - # define DATASTART ((ptr_t)(&_etext)) - # define HEURISTIC1 - # endif - - # ifdef ARM32 - # define CPP_WORDSZ 32 - # define MACH_TYPE "ARM32" - # define ALIGNMENT 4 - # ifdef NETBSD - # define OS_TYPE "NETBSD" - # define HEURISTIC2 - extern char etext; - # define DATASTART ((ptr_t)(&etext)) - # define USE_GENERIC_PUSH_REGS - # endif - # ifdef LINUX - # define OS_TYPE "LINUX" - # define HEURISTIC1 - # undef STACK_GRAN - # define STACK_GRAN 0x10000000 - # define USE_GENERIC_PUSH_REGS - # ifdef __ELF__ - # define DYNAMIC_LOADING - # include - # if defined(__GLIBC__) && __GLIBC__ >= 2 - # define LINUX_DATA_START - # else - extern char **__environ; - # define DATASTART ((ptr_t)(&__environ)) - /* hideous kludge: __environ is the first */ - /* word in crt0.o, and delimits the start */ - /* of the data segment, no matter which */ - /* ld options were passed through. */ - /* We could use _etext instead, but that */ - /* would include .rodata, which may */ - /* contain large read-only data tables */ - /* that we'd rather not scan. */ - # endif - extern int _end; - # define DATAEND (&_end) - # else - extern int etext; - # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) - # endif - # endif - #endif - - #ifdef LINUX_DATA_START - /* Some Linux distributions arrange to define __data_start. Some */ - /* define data_start as a weak symbol. The latter is technically */ - /* broken, since the user program may define data_start, in which */ - /* case we lose. Nonetheless, we try both, prefering __data_start. */ - /* We assume gcc. */ - # pragma weak __data_start - extern int __data_start; - # pragma weak data_start - extern int data_start; - # define DATASTART ((ptr_t)(&__data_start != 0? &__data_start : &data_start)) - #endif - - # ifndef STACK_GROWS_UP - # define STACK_GROWS_DOWN - # endif - - # ifndef CPP_WORDSZ - # define CPP_WORDSZ 32 - # endif - - # ifndef OS_TYPE - # define OS_TYPE "" - # endif - - # ifndef DATAEND - extern int end; - # define DATAEND (&end) - # endif - - # if defined(SVR4) && !defined(GETPAGESIZE) - # include - # define GETPAGESIZE() sysconf(_SC_PAGESIZE) - # endif - - # ifndef GETPAGESIZE - # if defined(SUNOS5) || defined(IRIX5) - # include - # endif - # define GETPAGESIZE() getpagesize() - # endif - - # if defined(SUNOS5) || defined(DRSNX) || defined(UTS4) - /* OS has SVR4 generic features. Probably others also qualify. */ - # define SVR4 - # endif - - # if defined(SUNOS5) || defined(DRSNX) - /* OS has SUNOS5 style semi-undocumented interface to dynamic */ - /* loader. */ - # define SUNOS5DL - /* OS has SUNOS5 style signal handlers. */ - # define SUNOS5SIGS - # endif - - # if defined(HPUX) - # define SUNOS5SIGS - # endif - - # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64 - -> bad word size - # endif - - # ifdef PCR - # undef DYNAMIC_LOADING - # undef STACKBOTTOM - # undef HEURISTIC1 - # undef HEURISTIC2 - # undef PROC_VDB - # undef MPROTECT_VDB - # define PCR_VDB - # endif - - # ifdef SRC_M3 - /* Postponed for now. */ - # undef PROC_VDB - # undef MPROTECT_VDB - # endif - - # ifdef SMALL_CONFIG - /* Presumably not worth the space it takes. */ - # undef PROC_VDB - # undef MPROTECT_VDB - # endif - - # ifdef USE_MUNMAP - # undef MPROTECT_VDB /* Can't deal with address space holes. */ - # endif - - # if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB) - # define DEFAULT_VDB - # endif - - # ifndef PREFETCH - # define PREFETCH(x) - # define NO_PREFETCH - # endif - - # ifndef PREFETCH_FOR_WRITE - # define PREFETCH_FOR_WRITE(x) - # define NO_PREFETCH_FOR_WRITE - # endif - - # ifndef CACHE_LINE_SIZE - # define CACHE_LINE_SIZE 32 /* Wild guess */ - # endif - - # ifndef CLEAR_DOUBLE - # define CLEAR_DOUBLE(x) \ - ((word*)x)[0] = 0; \ - ((word*)x)[1] = 0; - # endif /* CLEAR_DOUBLE */ - - # if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS) - # define SOLARIS_THREADS - # endif - # if defined(IRIX_THREADS) && !defined(IRIX5) - --> inconsistent configuration - # endif - # if defined(IRIX_JDK_THREADS) && !defined(IRIX5) - --> inconsistent configuration - # endif - # if defined(LINUX_THREADS) && !defined(LINUX) - --> inconsistent configuration - # endif - # if defined(SOLARIS_THREADS) && !defined(SUNOS5) - --> inconsistent configuration - # endif - # if defined(HPUX_THREADS) && !defined(HPUX) - --> inconsistent configuration - # endif - # if defined(PCR) || defined(SRC_M3) || \ - defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ - defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ - defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) - # define THREADS - # endif - - # if defined(HP_PA) || defined(M88K) || defined(POWERPC) \ - || (defined(I386) && defined(OS2)) || defined(UTS4) || defined(LINT) - /* Use setjmp based hack to mark from callee-save registers. */ - # define USE_GENERIC_PUSH_REGS - # endif - # if defined(SPARC) - # define SAVE_CALL_CHAIN - # define ASM_CLEAR_CODE /* Stack clearing is crucial, and we */ - /* include assembly code to do it well. */ - # endif - - # endif /* GCCONFIG_H */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/gcj_mlc.c gcc-3.1/boehm-gc/gcj_mlc.c *** gcc-3.0.4/boehm-gc/gcj_mlc.c Thu Apr 5 00:13:13 2001 --- gcc-3.1/boehm-gc/gcj_mlc.c Tue Feb 12 04:37:53 2002 *************** *** 17,29 **** #ifdef GC_GCJ_SUPPORT /* ! * This is an allocator interface tuned for gcj (the GNU/Cygnus static * java compiler). * * Each allocated object has a pointer in its first word to a vtable, * which for our purposes is simply a structure describing the type of * the object. ! * This descriptor structur contains a GC marking descriptor at offset * MARK_DESCR_OFFSET. * * It is hoped that this interface may also be useful for other systems, --- 17,29 ---- #ifdef GC_GCJ_SUPPORT /* ! * This is an allocator interface tuned for gcj (the GNU static * java compiler). * * Each allocated object has a pointer in its first word to a vtable, * which for our purposes is simply a structure describing the type of * the object. ! * This descriptor structure contains a GC marking descriptor at offset * MARK_DESCR_OFFSET. * * It is hoped that this interface may also be useful for other systems, *************** *** 36,45 **** * 3) FASTLOCK is not a significant win. */ ! #include "gc_priv.h" ! #include "gc_mark.h" ! #include "include/gc_gcj.h" ! #include "dbg_mlc.h" GC_bool GC_gcj_malloc_initialized = FALSE; --- 36,44 ---- * 3) FASTLOCK is not a significant win. */ ! #include "private/gc_pmark.h" ! #include "gc_gcj.h" ! #include "private/dbg_mlc.h" GC_bool GC_gcj_malloc_initialized = FALSE; *************** int GC_gcj_debug_kind; /* The kind of ob *** 51,64 **** ptr_t * GC_gcjobjfreelist; ptr_t * GC_gcjdebugobjfreelist; - void * GC_default_oom_action(void) { return 0; } - - void * (*GC_oom_action)(void) = GC_default_oom_action; - /* Caller does not hold allocation lock. */ ! void GC_init_gcj_malloc(int mp_index, void * /* really mark_proc */mp) { register int i; DCL_LOCK_STATE; GC_init(); /* In case it's not already done. */ --- 50,60 ---- ptr_t * GC_gcjobjfreelist; ptr_t * GC_gcjdebugobjfreelist; /* Caller does not hold allocation lock. */ ! void GC_init_gcj_malloc(int mp_index, void * /* really GC_mark_proc */mp) { register int i; + GC_bool ignore_gcj_info; DCL_LOCK_STATE; GC_init(); /* In case it's not already done. */ *************** void GC_init_gcj_malloc(int mp_index, vo *** 70,101 **** return; } GC_gcj_malloc_initialized = TRUE; ! GC_mark_procs[mp_index] = (mark_proc)mp; if (mp_index >= GC_n_mark_procs) ABORT("GC_init_gcj_malloc: bad index"); /* Set up object kind gcj-style indirect descriptor. */ GC_gcjobjfreelist = (ptr_t *) ! GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_gcjobjfreelist == 0) ABORT("Couldn't allocate GC_gcjobjfreelist"); BZERO(GC_gcjobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); GC_gcj_kind = GC_n_kinds++; GC_obj_kinds[GC_gcj_kind].ok_freelist = GC_gcjobjfreelist; GC_obj_kinds[GC_gcj_kind].ok_reclaim_list = 0; ! GC_obj_kinds[GC_gcj_kind].ok_descriptor = ! (((word)(-MARK_DESCR_OFFSET - INDIR_PER_OBJ_BIAS)) | DS_PER_OBJECT); ! GC_obj_kinds[GC_gcj_kind].ok_relocate_descr = FALSE; GC_obj_kinds[GC_gcj_kind].ok_init = TRUE; /* Set up object kind for objects that require mark proc call. */ GC_gcjdebugobjfreelist = (ptr_t *) ! GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_gcjdebugobjfreelist == 0) ABORT("Couldn't allocate GC_gcjdebugobjfreelist"); BZERO(GC_gcjdebugobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); GC_gcj_debug_kind = GC_n_kinds++; GC_obj_kinds[GC_gcj_debug_kind].ok_freelist = GC_gcjdebugobjfreelist; GC_obj_kinds[GC_gcj_debug_kind].ok_reclaim_list = 0; ! GC_obj_kinds[GC_gcj_debug_kind].ok_descriptor = ! MAKE_PROC(mp_index, 1 /* allocated with debug info */); ! GC_obj_kinds[GC_gcj_debug_kind].ok_relocate_descr = FALSE; GC_obj_kinds[GC_gcj_debug_kind].ok_init = TRUE; UNLOCK(); ENABLE_SIGNALS(); --- 66,116 ---- return; } GC_gcj_malloc_initialized = TRUE; ! ignore_gcj_info = (0 != GETENV("GC_IGNORE_GCJ_INFO")); ! # ifdef CONDPRINT ! if (GC_print_stats && ignore_gcj_info) { ! GC_printf0("Gcj-style type information is disabled!\n"); ! } ! # endif ! GC_mark_procs[mp_index] = (GC_mark_proc)mp; if (mp_index >= GC_n_mark_procs) ABORT("GC_init_gcj_malloc: bad index"); /* Set up object kind gcj-style indirect descriptor. */ GC_gcjobjfreelist = (ptr_t *) ! GC_INTERNAL_MALLOC((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_gcjobjfreelist == 0) ABORT("Couldn't allocate GC_gcjobjfreelist"); BZERO(GC_gcjobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); GC_gcj_kind = GC_n_kinds++; GC_obj_kinds[GC_gcj_kind].ok_freelist = GC_gcjobjfreelist; GC_obj_kinds[GC_gcj_kind].ok_reclaim_list = 0; ! if (ignore_gcj_info) { ! /* Use a simple length-based descriptor, thus forcing a fully */ ! /* conservative scan. */ ! GC_obj_kinds[GC_gcj_kind].ok_descriptor = (0 | GC_DS_LENGTH); ! GC_obj_kinds[GC_gcj_kind].ok_relocate_descr = TRUE; ! } else { ! GC_obj_kinds[GC_gcj_kind].ok_descriptor = ! (((word)(-MARK_DESCR_OFFSET - GC_INDIR_PER_OBJ_BIAS)) ! | GC_DS_PER_OBJECT); ! GC_obj_kinds[GC_gcj_kind].ok_relocate_descr = FALSE; ! } GC_obj_kinds[GC_gcj_kind].ok_init = TRUE; /* Set up object kind for objects that require mark proc call. */ GC_gcjdebugobjfreelist = (ptr_t *) ! GC_INTERNAL_MALLOC((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_gcjdebugobjfreelist == 0) ABORT("Couldn't allocate GC_gcjdebugobjfreelist"); BZERO(GC_gcjdebugobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); GC_gcj_debug_kind = GC_n_kinds++; GC_obj_kinds[GC_gcj_debug_kind].ok_freelist = GC_gcjdebugobjfreelist; GC_obj_kinds[GC_gcj_debug_kind].ok_reclaim_list = 0; ! if (ignore_gcj_info) { ! GC_obj_kinds[GC_gcj_kind].ok_descriptor = (0 | GC_DS_LENGTH); ! GC_obj_kinds[GC_gcj_kind].ok_relocate_descr = TRUE; ! } else { ! GC_obj_kinds[GC_gcj_debug_kind].ok_descriptor = ! GC_MAKE_PROC(mp_index, 1 /* allocated with debug info */); ! GC_obj_kinds[GC_gcj_debug_kind].ok_relocate_descr = FALSE; ! } GC_obj_kinds[GC_gcj_debug_kind].ok_init = TRUE; UNLOCK(); ENABLE_SIGNALS(); *************** register ptr_t * opp; *** 119,125 **** register word lw; DCL_LOCK_STATE; ! if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; # else --- 134,140 ---- register word lw; DCL_LOCK_STATE; ! if( EXPECT(SMALL_OBJ(lb), 1) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; # else *************** DCL_LOCK_STATE; *** 127,137 **** # endif opp = &(GC_gcjobjfreelist[lw]); LOCK(); ! if( (op = *opp) == 0 ) { op = (ptr_t)GENERAL_MALLOC((word)lb, GC_gcj_kind); if (0 == op) { UNLOCK(); ! return(GC_oom_action()); } # ifdef MERGE_SIZES lw = GC_size_map[lb]; /* May have been uninitialized. */ --- 142,153 ---- # endif opp = &(GC_gcjobjfreelist[lw]); LOCK(); ! op = *opp; ! if( EXPECT(op == 0, 0)) { op = (ptr_t)GENERAL_MALLOC((word)lb, GC_gcj_kind); if (0 == op) { UNLOCK(); ! return(GC_oom_fn(lb)); } # ifdef MERGE_SIZES lw = GC_size_map[lb]; /* May have been uninitialized. */ *************** DCL_LOCK_STATE; *** 147,153 **** op = (ptr_t)GENERAL_MALLOC((word)lb, GC_gcj_kind); if (0 == op) { UNLOCK(); ! return(GC_oom_action()); } *(void **)op = ptr_to_struct_containing_descr; UNLOCK(); --- 163,169 ---- op = (ptr_t)GENERAL_MALLOC((word)lb, GC_gcj_kind); if (0 == op) { UNLOCK(); ! return(GC_oom_fn(lb)); } *(void **)op = ptr_to_struct_containing_descr; UNLOCK(); *************** GC_PTR GC_debug_gcj_malloc(size_t lb, vo *** 174,180 **** (unsigned long) ptr_to_struct_containing_descr); GC_err_puts(s); GC_err_printf1(":%ld)\n", (unsigned long)i); ! return(GC_oom_action()); } *((void **)((ptr_t)result + sizeof(oh))) = ptr_to_struct_containing_descr; UNLOCK(); --- 190,196 ---- (unsigned long) ptr_to_struct_containing_descr); GC_err_puts(s); GC_err_printf1(":%ld)\n", (unsigned long)i); ! return(GC_oom_fn(lb)); } *((void **)((ptr_t)result + sizeof(oh))) = ptr_to_struct_containing_descr; UNLOCK(); *************** DCL_LOCK_STATE; *** 196,207 **** opp = &(GC_gcjobjfreelist[lw]); LOCK(); ! if( (op = *opp) == 0 ) { op = (ptr_t)GC_clear_stack( GC_generic_malloc_words_small_inner(lw, GC_gcj_kind)); if (0 == op) { UNLOCK(); ! return(GC_oom_action()); } } else { *opp = obj_link(op); --- 212,224 ---- opp = &(GC_gcjobjfreelist[lw]); LOCK(); ! op = *opp; ! if( EXPECT(op == 0, 0) ) { op = (ptr_t)GC_clear_stack( GC_generic_malloc_words_small_inner(lw, GC_gcj_kind)); if (0 == op) { UNLOCK(); ! return GC_oom_fn(WORDS_TO_BYTES(lw)); } } else { *opp = obj_link(op); *************** void * GC_debug_gcj_fast_malloc(size_t l *** 232,238 **** (unsigned long) ptr_to_struct_containing_descr); GC_err_puts(s); GC_err_printf1(":%ld)\n", (unsigned long)i); ! return(GC_oom_action()); } *((void **)((ptr_t)result + sizeof(oh))) = ptr_to_struct_containing_descr; UNLOCK(); --- 249,255 ---- (unsigned long) ptr_to_struct_containing_descr); GC_err_puts(s); GC_err_printf1(":%ld)\n", (unsigned long)i); ! return GC_oom_fn(WORDS_TO_BYTES(lw)); } *((void **)((ptr_t)result + sizeof(oh))) = ptr_to_struct_containing_descr; UNLOCK(); diff -Nrc3pad gcc-3.0.4/boehm-gc/gcname.c gcc-3.1/boehm-gc/gcname.c *** gcc-3.0.4/boehm-gc/gcname.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/gcname.c Fri Aug 17 18:39:16 2001 *************** *** 0 **** --- 1,13 ---- + #include + #include "version.h" + + int main() + { + if (GC_ALPHA_VERSION == GC_NOT_ALPHA) { + printf("gc%d.%d", GC_VERSION_MAJOR, GC_VERSION_MINOR); + } else { + printf("gc%d.%dalpha%d", GC_VERSION_MAJOR, + GC_VERSION_MINOR, GC_ALPHA_VERSION); + } + return 0; + } diff -Nrc3pad gcc-3.0.4/boehm-gc/headers.c gcc-3.1/boehm-gc/headers.c *** gcc-3.0.4/boehm-gc/headers.c Wed Apr 19 10:09:57 2000 --- gcc-3.1/boehm-gc/headers.c Fri Aug 17 18:30:45 2001 *************** *** 22,28 **** * level tree. */ ! # include "gc_priv.h" bottom_index * GC_all_bottom_indices = 0; /* Pointer to first (lowest addr) */ --- 22,28 ---- * level tree. */ ! # include "private/gc_priv.h" bottom_index * GC_all_bottom_indices = 0; /* Pointer to first (lowest addr) */ *************** register word sz; /* bytes */ *** 260,266 **** /* Apply fn to all allocated blocks */ /*VARARGS1*/ void GC_apply_to_all_blocks(fn, client_data) ! void (*fn)(/* struct hblk *h, word client_data */); word client_data; { register int j; --- 260,266 ---- /* Apply fn to all allocated blocks */ /*VARARGS1*/ void GC_apply_to_all_blocks(fn, client_data) ! void (*fn) GC_PROTO((struct hblk *h, word client_data)); word client_data; { register int j; diff -Nrc3pad gcc-3.0.4/boehm-gc/hpux_irix_threads.c gcc-3.1/boehm-gc/hpux_irix_threads.c *** gcc-3.0.4/boehm-gc/hpux_irix_threads.c Wed Apr 19 02:29:15 2000 --- gcc-3.1/boehm-gc/hpux_irix_threads.c Thu Jan 1 00:00:00 1970 *************** *** 1,746 **** - /* - * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. - * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. - * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - /* - * Support code for Irix (>=6.2) Pthreads. This relies on properties - * not guaranteed by the Pthread standard. It may or may not be portable - * to other implementations. - * - * This now also includes an initial attempt at thread support for - * HP/UX 11. - * - * Note that there is a lot of code duplication between linux_threads.c - * and hpux_irix_threads.c; any changes made here may need to be reflected - * there too. - */ - - # if defined(IRIX_THREADS) || defined(HPUX_THREADS) - - # if defined(HPUX_THREADS) - # include - # endif - - # include "gc_priv.h" - # include - # include - # include - # include - # include - # include - # include - - #undef pthread_create - #undef pthread_sigmask - #undef pthread_join - - void GC_thr_init(); - - #if 0 - void GC_print_sig_mask() - { - sigset_t blocked; - int i; - - if (pthread_sigmask(SIG_BLOCK, NULL, &blocked) != 0) - ABORT("pthread_sigmask"); - GC_printf0("Blocked: "); - for (i = 1; i <= MAXSIG; i++) { - if (sigismember(&blocked, i)) { GC_printf1("%ld ",(long) i); } - } - GC_printf0("\n"); - } - #endif - - /* We use the allocation lock to protect thread-related data structures. */ - - /* The set of all known threads. We intercept thread creation and */ - /* joins. We never actually create detached threads. We allocate all */ - /* new thread stacks ourselves. These allow us to maintain this */ - /* data structure. */ - /* Protected by GC_thr_lock. */ - /* Some of this should be declared volatile, but that's incosnsistent */ - /* with some library routine declarations. */ - typedef struct GC_Thread_Rep { - struct GC_Thread_Rep * next; /* More recently allocated threads */ - /* with a given pthread id come */ - /* first. (All but the first are */ - /* guaranteed to be dead, but we may */ - /* not yet have registered the join.) */ - pthread_t id; - word stop; - # define NOT_STOPPED 0 - # define PLEASE_STOP 1 - # define STOPPED 2 - word flags; - # define FINISHED 1 /* Thread has exited. */ - # define DETACHED 2 /* Thread is intended to be detached. */ - # define CLIENT_OWNS_STACK 4 - /* Stack was supplied by client. */ - ptr_t stack; - ptr_t stack_ptr; /* Valid only when stopped. */ - /* But must be within stack region at */ - /* all times. */ - size_t stack_size; /* 0 for original thread. */ - void * status; /* Used only to avoid premature */ - /* reclamation of any data it might */ - /* reference. */ - } * GC_thread; - - GC_thread GC_lookup_thread(pthread_t id); - - /* - * The only way to suspend threads given the pthread interface is to send - * signals. Unfortunately, this means we have to reserve - * a signal, and intercept client calls to change the signal mask. - */ - # define SIG_SUSPEND (SIGRTMIN + 6) - - pthread_mutex_t GC_suspend_lock = PTHREAD_MUTEX_INITIALIZER; - /* Number of threads stopped so far */ - pthread_cond_t GC_suspend_ack_cv = PTHREAD_COND_INITIALIZER; - pthread_cond_t GC_continue_cv = PTHREAD_COND_INITIALIZER; - - void GC_suspend_handler(int sig) - { - int dummy; - GC_thread me; - sigset_t all_sigs; - sigset_t old_sigs; - int i; - - if (sig != SIG_SUSPEND) ABORT("Bad signal in suspend_handler"); - me = GC_lookup_thread(pthread_self()); - /* The lookup here is safe, since I'm doing this on behalf */ - /* of a thread which holds the allocation lock in order */ - /* to stop the world. Thus concurrent modification of the */ - /* data structure is impossible. */ - if (PLEASE_STOP != me -> stop) { - /* Misdirected signal. */ - pthread_mutex_unlock(&GC_suspend_lock); - return; - } - pthread_mutex_lock(&GC_suspend_lock); - me -> stack_ptr = (ptr_t)(&dummy); - me -> stop = STOPPED; - pthread_cond_signal(&GC_suspend_ack_cv); - pthread_cond_wait(&GC_continue_cv, &GC_suspend_lock); - pthread_mutex_unlock(&GC_suspend_lock); - /* GC_printf1("Continuing 0x%x\n", pthread_self()); */ - } - - - GC_bool GC_thr_initialized = FALSE; - - size_t GC_min_stack_sz; - - size_t GC_page_sz; - - # define N_FREE_LISTS 25 - ptr_t GC_stack_free_lists[N_FREE_LISTS] = { 0 }; - /* GC_stack_free_lists[i] is free list for stacks of */ - /* size GC_min_stack_sz*2**i. */ - /* Free lists are linked through first word. */ - - /* Return a stack of size at least *stack_size. *stack_size is */ - /* replaced by the actual stack size. */ - /* Caller holds allocation lock. */ - ptr_t GC_stack_alloc(size_t * stack_size) - { - register size_t requested_sz = *stack_size; - register size_t search_sz = GC_min_stack_sz; - register int index = 0; /* = log2(search_sz/GC_min_stack_sz) */ - register ptr_t result; - - while (search_sz < requested_sz) { - search_sz *= 2; - index++; - } - if ((result = GC_stack_free_lists[index]) == 0 - && (result = GC_stack_free_lists[index+1]) != 0) { - /* Try next size up. */ - search_sz *= 2; index++; - } - if (result != 0) { - GC_stack_free_lists[index] = *(ptr_t *)result; - } else { - result = (ptr_t) GC_scratch_alloc(search_sz + 2*GC_page_sz); - result = (ptr_t)(((word)result + GC_page_sz) & ~(GC_page_sz - 1)); - /* Protect hottest page to detect overflow. */ - # ifdef STACK_GROWS_UP - /* mprotect(result + search_sz, GC_page_sz, PROT_NONE); */ - # else - /* mprotect(result, GC_page_sz, PROT_NONE); */ - result += GC_page_sz; - # endif - } - *stack_size = search_sz; - return(result); - } - - /* Caller holds allocation lock. */ - void GC_stack_free(ptr_t stack, size_t size) - { - register int index = 0; - register size_t search_sz = GC_min_stack_sz; - - while (search_sz < size) { - search_sz *= 2; - index++; - } - if (search_sz != size) ABORT("Bad stack size"); - *(ptr_t *)stack = GC_stack_free_lists[index]; - GC_stack_free_lists[index] = stack; - } - - - - # define THREAD_TABLE_SZ 128 /* Must be power of 2 */ - volatile GC_thread GC_threads[THREAD_TABLE_SZ]; - - /* Add a thread to GC_threads. We assume it wasn't already there. */ - /* Caller holds allocation lock. */ - GC_thread GC_new_thread(pthread_t id) - { - int hv = ((word)id) % THREAD_TABLE_SZ; - GC_thread result; - static struct GC_Thread_Rep first_thread; - static GC_bool first_thread_used = FALSE; - - if (!first_thread_used) { - result = &first_thread; - first_thread_used = TRUE; - /* Dont acquire allocation lock, since we may already hold it. */ - } else { - result = (struct GC_Thread_Rep *) - GC_generic_malloc_inner(sizeof(struct GC_Thread_Rep), NORMAL); - } - if (result == 0) return(0); - result -> id = id; - result -> next = GC_threads[hv]; - GC_threads[hv] = result; - /* result -> flags = 0; */ - /* result -> stop = 0; */ - return(result); - } - - /* Delete a thread from GC_threads. We assume it is there. */ - /* (The code intentionally traps if it wasn't.) */ - /* Caller holds allocation lock. */ - void GC_delete_thread(pthread_t id) - { - int hv = ((word)id) % THREAD_TABLE_SZ; - register GC_thread p = GC_threads[hv]; - register GC_thread prev = 0; - - while (!pthread_equal(p -> id, id)) { - prev = p; - p = p -> next; - } - if (prev == 0) { - GC_threads[hv] = p -> next; - } else { - prev -> next = p -> next; - } - } - - /* If a thread has been joined, but we have not yet */ - /* been notified, then there may be more than one thread */ - /* in the table with the same pthread id. */ - /* This is OK, but we need a way to delete a specific one. */ - void GC_delete_gc_thread(pthread_t id, GC_thread gc_id) - { - int hv = ((word)id) % THREAD_TABLE_SZ; - register GC_thread p = GC_threads[hv]; - register GC_thread prev = 0; - - while (p != gc_id) { - prev = p; - p = p -> next; - } - if (prev == 0) { - GC_threads[hv] = p -> next; - } else { - prev -> next = p -> next; - } - } - - /* Return a GC_thread corresponding to a given thread_t. */ - /* Returns 0 if it's not there. */ - /* Caller holds allocation lock or otherwise inhibits */ - /* updates. */ - /* If there is more than one thread with the given id we */ - /* return the most recent one. */ - GC_thread GC_lookup_thread(pthread_t id) - { - int hv = ((word)id) % THREAD_TABLE_SZ; - register GC_thread p = GC_threads[hv]; - - while (p != 0 && !pthread_equal(p -> id, id)) p = p -> next; - return(p); - } - - - /* Caller holds allocation lock. */ - void GC_stop_world() - { - pthread_t my_thread = pthread_self(); - register int i; - register GC_thread p; - register int result; - struct timespec timeout; - - for (i = 0; i < THREAD_TABLE_SZ; i++) { - for (p = GC_threads[i]; p != 0; p = p -> next) { - if (p -> id != my_thread) { - if (p -> flags & FINISHED) { - p -> stop = STOPPED; - continue; - } - p -> stop = PLEASE_STOP; - result = pthread_kill(p -> id, SIG_SUSPEND); - /* GC_printf1("Sent signal to 0x%x\n", p -> id); */ - switch(result) { - case ESRCH: - /* Not really there anymore. Possible? */ - p -> stop = STOPPED; - break; - case 0: - break; - default: - ABORT("pthread_kill failed"); - } - } - } - } - pthread_mutex_lock(&GC_suspend_lock); - for (i = 0; i < THREAD_TABLE_SZ; i++) { - for (p = GC_threads[i]; p != 0; p = p -> next) { - while (p -> id != my_thread && p -> stop != STOPPED) { - clock_gettime(CLOCK_REALTIME, &timeout); - timeout.tv_nsec += 50000000; /* 50 msecs */ - if (timeout.tv_nsec >= 1000000000) { - timeout.tv_nsec -= 1000000000; - ++timeout.tv_sec; - } - result = pthread_cond_timedwait(&GC_suspend_ack_cv, - &GC_suspend_lock, - &timeout); - if (result == ETIMEDOUT) { - /* Signal was lost or misdirected. Try again. */ - /* Duplicate signals should be benign. */ - result = pthread_kill(p -> id, SIG_SUSPEND); - } - } - } - } - pthread_mutex_unlock(&GC_suspend_lock); - /* GC_printf1("World stopped 0x%x\n", pthread_self()); */ - } - - /* Caller holds allocation lock. */ - void GC_start_world() - { - GC_thread p; - unsigned i; - - /* GC_printf0("World starting\n"); */ - for (i = 0; i < THREAD_TABLE_SZ; i++) { - for (p = GC_threads[i]; p != 0; p = p -> next) { - p -> stop = NOT_STOPPED; - } - } - pthread_mutex_lock(&GC_suspend_lock); - /* All other threads are at pthread_cond_wait in signal handler. */ - /* Otherwise we couldn't have acquired the lock. */ - pthread_mutex_unlock(&GC_suspend_lock); - pthread_cond_broadcast(&GC_continue_cv); - } - - # ifdef MMAP_STACKS - --> not really supported yet. - int GC_is_thread_stack(ptr_t addr) - { - register int i; - register GC_thread p; - - for (i = 0; i < THREAD_TABLE_SZ; i++) { - for (p = GC_threads[i]; p != 0; p = p -> next) { - if (p -> stack_size != 0) { - if (p -> stack <= addr && - addr < p -> stack + p -> stack_size) - return 1; - } - } - } - return 0; - } - # endif - - /* We hold allocation lock. Should do exactly the right thing if the */ - /* world is stopped. Should not fail if it isn't. */ - void GC_push_all_stacks() - { - register int i; - register GC_thread p; - register ptr_t sp = GC_approx_sp(); - register ptr_t hot, cold; - pthread_t me = pthread_self(); - - if (!GC_thr_initialized) GC_thr_init(); - /* GC_printf1("Pushing stacks from thread 0x%x\n", me); */ - for (i = 0; i < THREAD_TABLE_SZ; i++) { - for (p = GC_threads[i]; p != 0; p = p -> next) { - if (p -> flags & FINISHED) continue; - if (pthread_equal(p -> id, me)) { - hot = GC_approx_sp(); - } else { - hot = p -> stack_ptr; - } - if (p -> stack_size != 0) { - # ifdef STACK_GROWS_UP - cold = p -> stack; - # else - cold = p -> stack + p -> stack_size; - # endif - } else { - /* The original stack. */ - cold = GC_stackbottom; - } - # ifdef STACK_GROWS_UP - GC_push_all_stack(cold, hot); - # else - GC_push_all_stack(hot, cold); - # endif - } - } - } - - - /* We hold the allocation lock. */ - void GC_thr_init() - { - GC_thread t; - struct sigaction act; - - if (GC_thr_initialized) return; - GC_thr_initialized = TRUE; - GC_min_stack_sz = HBLKSIZE; - GC_page_sz = sysconf(_SC_PAGESIZE); - (void) sigaction(SIG_SUSPEND, 0, &act); - if (act.sa_handler != SIG_DFL) - ABORT("Previously installed SIG_SUSPEND handler"); - /* Install handler. */ - act.sa_handler = GC_suspend_handler; - act.sa_flags = SA_RESTART; - (void) sigemptyset(&act.sa_mask); - if (0 != sigaction(SIG_SUSPEND, &act, 0)) - ABORT("Failed to install SIG_SUSPEND handler"); - /* Add the initial thread, so we can stop it. */ - t = GC_new_thread(pthread_self()); - t -> stack_size = 0; - t -> stack_ptr = (ptr_t)(&t); - t -> flags = DETACHED; - } - - int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset) - { - sigset_t fudged_set; - - if (set != NULL && (how == SIG_BLOCK || how == SIG_SETMASK)) { - fudged_set = *set; - sigdelset(&fudged_set, SIG_SUSPEND); - set = &fudged_set; - } - return(pthread_sigmask(how, set, oset)); - } - - struct start_info { - void *(*start_routine)(void *); - void *arg; - word flags; - ptr_t stack; - size_t stack_size; - sem_t registered; /* 1 ==> in our thread table, but */ - /* parent hasn't yet noticed. */ - }; - - void GC_thread_exit_proc(void *arg) - { - GC_thread me; - - LOCK(); - me = GC_lookup_thread(pthread_self()); - if (me -> flags & DETACHED) { - GC_delete_thread(pthread_self()); - } else { - me -> flags |= FINISHED; - } - UNLOCK(); - } - - int GC_pthread_join(pthread_t thread, void **retval) - { - int result; - GC_thread thread_gc_id; - - LOCK(); - thread_gc_id = GC_lookup_thread(thread); - /* This is guaranteed to be the intended one, since the thread id */ - /* cant have been recycled by pthreads. */ - UNLOCK(); - result = pthread_join(thread, retval); - /* Some versions of the Irix pthreads library can erroneously */ - /* return EINTR when the call succeeds. */ - if (EINTR == result) result = 0; - LOCK(); - /* Here the pthread thread id may have been recycled. */ - GC_delete_gc_thread(thread, thread_gc_id); - UNLOCK(); - return result; - } - - void * GC_start_routine(void * arg) - { - struct start_info * si = arg; - void * result; - GC_thread me; - pthread_t my_pthread; - void *(*start)(void *); - void *start_arg; - - my_pthread = pthread_self(); - /* If a GC occurs before the thread is registered, that GC will */ - /* ignore this thread. That's fine, since it will block trying to */ - /* acquire the allocation lock, and won't yet hold interesting */ - /* pointers. */ - LOCK(); - /* We register the thread here instead of in the parent, so that */ - /* we don't need to hold the allocation lock during pthread_create. */ - /* Holding the allocation lock there would make REDIRECT_MALLOC */ - /* impossible. It probably still doesn't work, but we're a little */ - /* closer ... */ - /* This unfortunately means that we have to be careful the parent */ - /* doesn't try to do a pthread_join before we're registered. */ - me = GC_new_thread(my_pthread); - me -> flags = si -> flags; - me -> stack = si -> stack; - me -> stack_size = si -> stack_size; - me -> stack_ptr = (ptr_t)si -> stack + si -> stack_size - sizeof(word); - UNLOCK(); - start = si -> start_routine; - start_arg = si -> arg; - sem_post(&(si -> registered)); - pthread_cleanup_push(GC_thread_exit_proc, 0); - result = (*start)(start_arg); - me -> status = result; - me -> flags |= FINISHED; - pthread_cleanup_pop(1); - /* This involves acquiring the lock, ensuring that we can't exit */ - /* while a collection that thinks we're alive is trying to stop */ - /* us. */ - return(result); - } - - # ifdef HPUX_THREADS - /* pthread_attr_t is not a structure, thus a simple structure copy */ - /* won't work. */ - static void copy_attr(pthread_attr_t * pa_ptr, - const pthread_attr_t * source) { - int tmp; - size_t stmp; - void * vtmp; - struct sched_param sp_tmp; - pthread_spu_t ps_tmp; - (void) pthread_attr_init(pa_ptr); - (void) pthread_attr_getdetachstate(source, &tmp); - (void) pthread_attr_setdetachstate(pa_ptr, tmp); - (void) pthread_attr_getinheritsched(source, &tmp); - (void) pthread_attr_setinheritsched(pa_ptr, tmp); - (void) pthread_attr_getschedpolicy(source, &tmp); - (void) pthread_attr_setschedpolicy(pa_ptr, tmp); - (void) pthread_attr_getstacksize(source, &stmp); - (void) pthread_attr_setstacksize(pa_ptr, stmp); - (void) pthread_attr_getguardsize(source, &stmp); - (void) pthread_attr_setguardsize(pa_ptr, stmp); - (void) pthread_attr_getstackaddr(source, &vtmp); - (void) pthread_attr_setstackaddr(pa_ptr, vtmp); - (void) pthread_attr_getscope(source, &tmp); - (void) pthread_attr_setscope(pa_ptr, tmp); - (void) pthread_attr_getschedparam(source, &sp_tmp); - (void) pthread_attr_setschedparam(pa_ptr, &sp_tmp); - (void) pthread_attr_getprocessor_np(source, &ps_tmp, &tmp); - (void) pthread_attr_setprocessor_np(pa_ptr, ps_tmp, tmp); - } - # else - # define copy_attr(pa_ptr, source) *(pa_ptr) = *(source) - # endif - - int - GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg) - { - int result; - GC_thread t; - void * stack; - size_t stacksize; - pthread_attr_t new_attr; - int detachstate; - word my_flags = 0; - struct start_info * si = GC_malloc(sizeof(struct start_info)); - /* This is otherwise saved only in an area mmapped by the thread */ - /* library, which isn't visible to the collector. */ - - if (0 == si) return(ENOMEM); - if (0 != sem_init(&(si -> registered), 0, 0)) { - ABORT("sem_init failed"); - } - si -> start_routine = start_routine; - si -> arg = arg; - LOCK(); - if (!GC_thr_initialized) GC_thr_init(); - if (NULL == attr) { - stack = 0; - (void) pthread_attr_init(&new_attr); - } else { - copy_attr(&new_attr, attr); - pthread_attr_getstackaddr(&new_attr, &stack); - } - pthread_attr_getstacksize(&new_attr, &stacksize); - pthread_attr_getdetachstate(&new_attr, &detachstate); - if (stacksize < GC_min_stack_sz) ABORT("Stack too small"); - if (0 == stack) { - stack = (void *)GC_stack_alloc(&stacksize); - if (0 == stack) { - UNLOCK(); - return(ENOMEM); - } - pthread_attr_setstackaddr(&new_attr, stack); - } else { - my_flags |= CLIENT_OWNS_STACK; - } - if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED; - si -> flags = my_flags; - si -> stack = stack; - si -> stack_size = stacksize; - result = pthread_create(new_thread, &new_attr, GC_start_routine, si); - if (0 == new_thread && !(my_flags & CLIENT_OWNS_STACK)) { - GC_stack_free(stack, stacksize); - } - UNLOCK(); - /* Wait until child has been added to the thread table. */ - /* This also ensures that we hold onto si until the child is done */ - /* with it. Thus it doesn't matter whether it is otherwise */ - /* visible to the collector. */ - while (0 != sem_wait(&(si -> registered))) { - if (errno != EINTR) { - GC_printf1("Sem_wait: errno = %ld\n", (unsigned long) errno); - ABORT("sem_wait failed"); - } - } - sem_destroy(&(si -> registered)); - pthread_attr_destroy(&new_attr); /* Not a no-op under HPUX */ - return(result); - } - - #ifndef HPUX_THREADS - /* For now we use the pthreads locking primitives on HP/UX */ - - GC_bool GC_collecting = 0; /* A hint that we're in the collector and */ - /* holding the allocation lock for an */ - /* extended period. */ - - /* Reasonably fast spin locks. Basically the same implementation */ - /* as STL alloc.h. */ - - #define SLEEP_THRESHOLD 3 - - #ifdef HPUX - unsigned long GC_allocate_lock = 1; - # define GC_TRY_LOCK() GC_test_and_clear(&GC_allocate_lock) - # define GC_LOCK_TAKEN !GC_allocate_lock - #else - unsigned long GC_allocate_lock = 0; - # define GC_TRY_LOCK() !GC_test_and_set(&GC_allocate_lock,1) - # define GC_LOCK_TAKEN GC_allocate_lock - #endif - - void GC_lock() - { - # define low_spin_max 30 /* spin cycles if we suspect uniprocessor */ - # define high_spin_max 1000 /* spin cycles for multiprocessor */ - static unsigned spin_max = low_spin_max; - unsigned my_spin_max; - static unsigned last_spins = 0; - unsigned my_last_spins; - volatile unsigned junk; - # define PAUSE junk *= junk; junk *= junk; junk *= junk; junk *= junk - int i; - - if (GC_TRY_LOCK()) { - return; - } - junk = 0; - my_spin_max = spin_max; - my_last_spins = last_spins; - for (i = 0; i < my_spin_max; i++) { - if (GC_collecting) goto yield; - if (i < my_last_spins/2 || GC_LOCK_TAKEN) { - PAUSE; - continue; - } - if (GC_TRY_LOCK()) { - /* - * got it! - * Spinning worked. Thus we're probably not being scheduled - * against the other process with which we were contending. - * Thus it makes sense to spin longer the next time. - */ - last_spins = i; - spin_max = high_spin_max; - return; - } - } - /* We are probably being scheduled against the other process. Sleep. */ - spin_max = low_spin_max; - yield: - for (i = 0;; ++i) { - if (GC_TRY_LOCK()) { - return; - } - if (i < SLEEP_THRESHOLD) { - sched_yield(); - } else { - struct timespec ts; - - if (i > 26) i = 26; - /* Don't wait for more than about 60msecs, even */ - /* under extreme contention. */ - ts.tv_sec = 0; - ts.tv_nsec = 1 << i; - nanosleep(&ts, 0); - } - } - } - - #endif /* !HPUX_THREADS */ - - # else - - #ifndef LINT - int GC_no_Irix_threads; - #endif - - # endif /* IRIX_THREADS */ - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/ia64_save_regs_in_stack.s gcc-3.1/boehm-gc/ia64_save_regs_in_stack.s *** gcc-3.0.4/boehm-gc/ia64_save_regs_in_stack.s Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/ia64_save_regs_in_stack.s Mon Oct 15 04:58:00 2001 *************** *** 0 **** --- 1,12 ---- + .text + .align 16 + .global GC_save_regs_in_stack + .proc GC_save_regs_in_stack + GC_save_regs_in_stack: + .body + flushrs + ;; + mov r8=ar.bsp + br.ret.sptk.few rp + .endp GC_save_regs_in_stack + diff -Nrc3pad gcc-3.0.4/boehm-gc/if_mach.c gcc-3.1/boehm-gc/if_mach.c *** gcc-3.0.4/boehm-gc/if_mach.c Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/if_mach.c Fri Aug 17 18:30:45 2001 *************** *** 1,7 **** /* Conditionally execute a command based on machine and OS from gcconfig.h */ ! # include "gcconfig.h" # include int main(argc, argv, envp) int argc; --- 1,9 ---- /* Conditionally execute a command based on machine and OS from gcconfig.h */ ! # include "private/gcconfig.h" # include + # include + # include int main(argc, argv, envp) int argc; *************** char ** envp; *** 13,18 **** --- 15,21 ---- if (strcmp(OS_TYPE, "") != 0 && strcmp(argv[2], "") != 0 && strcmp(OS_TYPE, argv[2]) != 0) return(0); printf("^^^^Starting command^^^^\n"); + fflush(stdout); execvp(argv[3], argv+3); perror("Couldn't execute"); diff -Nrc3pad gcc-3.0.4/boehm-gc/if_not_there.c gcc-3.1/boehm-gc/if_not_there.c *** gcc-3.0.4/boehm-gc/if_not_there.c Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/if_not_there.c Fri Aug 17 18:30:45 2001 *************** *** 1,7 **** /* Conditionally execute a command based if the file argv[1] doesn't exist */ /* Except for execvp, we stick to ANSI C. */ ! # include "gcconfig.h" # include int main(argc, argv, envp) int argc; --- 1,9 ---- /* Conditionally execute a command based if the file argv[1] doesn't exist */ /* Except for execvp, we stick to ANSI C. */ ! # include "private/gcconfig.h" # include + # include + # include int main(argc, argv, envp) int argc; *************** char ** envp; *** 16,21 **** --- 18,24 ---- return(0); } printf("^^^^Starting command^^^^\n"); + fflush(stdout); execvp(argv[2], argv+2); exit(1); diff -Nrc3pad gcc-3.0.4/boehm-gc/include/Makefile.am gcc-3.1/boehm-gc/include/Makefile.am *** gcc-3.0.4/boehm-gc/include/Makefile.am Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/Makefile.am Wed Sep 12 01:57:03 2001 *************** *** 0 **** --- 1,7 ---- + AUTOMAKE_OPTIONS = foreign + + include_HEADERS = gc.h gc_backptr.h gc_local_alloc.h \ + gc_pthread_redirects.h gc_cpp.h + + + diff -Nrc3pad gcc-3.0.4/boehm-gc/include/Makefile.in gcc-3.1/boehm-gc/include/Makefile.in *** gcc-3.0.4/boehm-gc/include/Makefile.in Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/Makefile.in Tue Feb 12 04:37:56 2002 *************** *** 0 **** --- 1,251 ---- + # Makefile.in generated automatically by automake 1.4 from Makefile.am + + # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. + + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY, to the extent permitted by law; without + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + + + SHELL = @SHELL@ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ + prefix = @prefix@ + exec_prefix = @exec_prefix@ + + bindir = @bindir@ + sbindir = @sbindir@ + libexecdir = @libexecdir@ + datadir = @datadir@ + sysconfdir = @sysconfdir@ + sharedstatedir = @sharedstatedir@ + localstatedir = @localstatedir@ + libdir = @libdir@ + infodir = @infodir@ + mandir = @mandir@ + includedir = @includedir@ + oldincludedir = /usr/include + + DESTDIR = + + pkgdatadir = $(datadir)/@PACKAGE@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + + top_builddir = .. + + ACLOCAL = @ACLOCAL@ + AUTOCONF = @AUTOCONF@ + AUTOMAKE = @AUTOMAKE@ + AUTOHEADER = @AUTOHEADER@ + + INSTALL = @INSTALL@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_SCRIPT = @INSTALL_SCRIPT@ + transform = @program_transform_name@ + + NORMAL_INSTALL = : + PRE_INSTALL = : + POST_INSTALL = : + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : + build_alias = @build_alias@ + build_triplet = @build@ + host_alias = @host_alias@ + host_triplet = @host@ + target_alias = @target_alias@ + target_triplet = @target@ + AR = @AR@ + AS = @AS@ + CC = @CC@ + CPP = @CPP@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ + CXXINCLUDES = @CXXINCLUDES@ + DLLTOOL = @DLLTOOL@ + EXEEXT = @EXEEXT@ + EXTRA_TEST_LIBS = @EXTRA_TEST_LIBS@ + GCJ = @GCJ@ + GCJFLAGS = @GCJFLAGS@ + GC_CFLAGS = @GC_CFLAGS@ + INCLUDES = @INCLUDES@ + LIBTOOL = @LIBTOOL@ + LN_S = @LN_S@ + MAINT = @MAINT@ + MAKEINFO = @MAKEINFO@ + MY_CFLAGS = @MY_CFLAGS@ + OBJDUMP = @OBJDUMP@ + OBJEXT = @OBJEXT@ + PACKAGE = @PACKAGE@ + RANLIB = @RANLIB@ + STRIP = @STRIP@ + THREADLIBS = @THREADLIBS@ + VERSION = @VERSION@ + addobjs = @addobjs@ + gc_basedir = @gc_basedir@ + mkinstalldirs = @mkinstalldirs@ + target_all = @target_all@ + + AUTOMAKE_OPTIONS = foreign + + include_HEADERS = gc.h gc_backptr.h gc_local_alloc.h \ + gc_pthread_redirects.h gc_cpp.h + + CONFIG_CLEAN_FILES = + HEADERS = $(include_HEADERS) + + DIST_COMMON = Makefile.am Makefile.in + + + DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + + TAR = gtar + GZIP_ENV = --best + all: all-redirect + .SUFFIXES: + $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --cygnus include/Makefile + + Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + + install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(includedir) + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \ + done + + uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + list='$(include_HEADERS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(includedir)/$$p; \ + done + + tags: TAGS + + ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + + TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + + mostlyclean-tags: + + clean-tags: + + distclean-tags: + -rm -f TAGS ID + + maintainer-clean-tags: + + distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + + subdir = include + + distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + info-am: + info: info-am + dvi-am: + dvi: dvi-am + check-am: + check: check-am + installcheck-am: + installcheck: installcheck-am + install-info-am: + install-info: install-info-am + install-exec-am: + install-exec: install-exec-am + + install-data-am: install-includeHEADERS + install-data: install-data-am + + install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + install: install-am + uninstall-am: uninstall-includeHEADERS + uninstall: uninstall-am + all-am: Makefile $(HEADERS) + all-redirect: all-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install + installdirs: + $(mkinstalldirs) $(DESTDIR)$(includedir) + + + mostlyclean-generic: + + clean-generic: + + distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + + maintainer-clean-generic: + mostlyclean-am: mostlyclean-tags mostlyclean-generic + + mostlyclean: mostlyclean-am + + clean-am: clean-tags clean-generic mostlyclean-am + + clean: clean-am + + distclean-am: distclean-tags distclean-generic clean-am + -rm -f libtool + + distclean: distclean-am + + maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + + maintainer-clean: maintainer-clean-am + + .PHONY: uninstall-includeHEADERS install-includeHEADERS tags \ + mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \ + distdir info-am info dvi-am dvi check check-am installcheck-am \ + installcheck install-info-am install-info install-exec-am install-exec \ + install-data-am install-data install-am install uninstall-am uninstall \ + all-redirect all-am all installdirs mostlyclean-generic \ + distclean-generic clean-generic maintainer-clean-generic clean \ + mostlyclean distclean maintainer-clean + + + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff -Nrc3pad gcc-3.0.4/boehm-gc/include/backptr.h gcc-3.1/boehm-gc/include/backptr.h *** gcc-3.0.4/boehm-gc/include/backptr.h Wed Apr 19 02:29:16 2000 --- gcc-3.1/boehm-gc/include/backptr.h Thu Jan 1 00:00:00 1970 *************** *** 1,63 **** - /* - * This is a simple API to implement pointer back tracing, i.e. - * to answer questions such as "who is pointing to this" or - * "why is this object being retained by the collector" - * - * This API assumes that we have an ANSI C compiler. - * - * Most of these calls yield useful information on only after - * a garbage collection. Usually the client will first force - * a full collection and then gather information, preferably - * before much intervening allocation. - * - * The implementation of the interface is only about 99.9999% - * correct. It is intended to be good enough for profiling, - * but is not intended to be used with production code. - * - * Results are likely to be much more useful if all allocation is - * accomplished through the debugging allocators. - * - * The implementation idea is due to A. Demers. - */ - - /* Store information about the object referencing dest in *base_p */ - /* and *offset_p. */ - /* If multiple objects or roots point to dest, the one reported */ - /* will be the last on used by the garbage collector to trace the */ - /* object. */ - /* source is root ==> *base_p = address, *offset_p = 0 */ - /* source is heap object ==> *base_p != 0, *offset_p = offset */ - /* Returns 1 on success, 0 if source couldn't be determined. */ - /* Dest can be any address within a heap object. */ - typedef enum { GC_UNREFERENCED, /* No reference info available. */ - GC_NO_SPACE, /* Dest not allocated with debug alloc */ - GC_REFD_FROM_ROOT, /* Referenced directly by root *base_p */ - GC_REFD_FROM_REG, /* Referenced from a register, i.e. */ - /* a root without an address. */ - GC_REFD_FROM_HEAP, /* Referenced from another heap obj. */ - GC_FINALIZER_REFD /* Finalizable and hence accessible. */ - } GC_ref_kind; - - GC_ref_kind GC_get_back_ptr_info(void *dest, void **base_p, size_t *offset_p); - - /* Generate a random heap address. */ - /* The resulting address is in the heap, but */ - /* not necessarily inside a valid object. */ - void * GC_generate_random_heap_address(void); - - /* Generate a random address inside a valid marked heap object. */ - void * GC_generate_random_valid_address(void); - - /* Force a garbage collection and generate a backtrace from a */ - /* random heap address. */ - /* This uses the GC logging mechanism (GC_printf) to produce */ - /* output. It can often be called from a debugger. The */ - /* source in dbg_mlc.c also serves as a sample client. */ - void GC_generate_random_backtrace(void); - - /* Print a backtrace from a specific address. Used by the */ - /* above. The client should call GC_gcollect() immediately */ - /* before invocation. */ - void GC_print_backtrace(void *); - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc.h gcc-3.1/boehm-gc/include/gc.h *** gcc-3.0.4/boehm-gc/include/gc.h Mon Jun 19 23:42:00 2000 --- gcc-3.1/boehm-gc/include/gc.h Tue Feb 12 04:37:56 2002 *************** *** 29,42 **** #ifndef _GC_H # define _GC_H - # define __GC - # include ! #if defined(__CYGWIN32__) && defined(GC_USE_DLL) ! #include "libgc_globals.h" #endif ! #if defined(__MINGW32__) && defined(WIN32_THREADS) # ifdef GC_BUILD # define GC_API __declspec(dllexport) # else --- 29,92 ---- #ifndef _GC_H # define _GC_H ! /* ! * Some tests for old macros. These violate our namespace rules and will ! * disappear shortly. Use the GC_ names. ! */ ! #if defined(SOLARIS_THREADS) || defined(_SOLARIS_THREADS) ! # define GC_SOLARIS_THREADS ! #endif ! #if defined(_SOLARIS_PTHREADS) ! # define GC_SOLARIS_PTHREADS ! #endif ! #if defined(IRIX_THREADS) ! # define GC_IRIX_THREADS ! #endif ! #if defined(HPUX_THREADS) ! # define GC_HPUX_THREADS ! #endif ! #if defined(OSF1_THREADS) ! # define GC_OSF1_THREADS ! #endif ! #if defined(LINUX_THREADS) ! # define GC_LINUX_THREADS ! #endif ! #if defined(WIN32_THREADS) ! # define GC_WIN32_THREADS ! #endif ! #if defined(USE_LD_WRAP) ! # define GC_USE_LD_WRAP #endif ! #if !defined(_REENTRANT) && (defined(GC_SOLARIS_THREADS) \ ! || defined(GC_SOLARIS_PTHREADS) \ ! || defined(GC_HPUX_THREADS) \ ! || defined(GC_LINUX_THREADS)) ! # define _REENTRANT ! /* Better late than never. This fails if system headers that */ ! /* depend on this were previously included. */ ! #endif ! ! #if defined(GC_SOLARIS_PTHREADS) && !defined(GC_SOLARIS_THREADS) ! # define GC_SOLARIS_THREADS ! #endif ! ! # if defined(GC_SOLARIS_PTHREADS) || defined(GC_FREEBSD_THREADS) || \ ! defined(GC_IRIX_THREADS) || defined(GC_LINUX_THREADS) || \ ! defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS) ! # define GC_PTHREADS ! # endif ! ! # define __GC ! # include ! # ifdef _WIN32_WCE ! /* Yet more kluges for WinCE */ ! # include /* size_t is defined here */ ! typedef long ptrdiff_t; /* ptrdiff_t is not defined */ ! # endif ! ! #if defined(__MINGW32__) &&defined(_DLL) && !defined(GC_NOT_DLL) # ifdef GC_BUILD # define GC_API __declspec(dllexport) # else *************** *** 44,52 **** # endif #endif ! #if defined(_MSC_VER) && defined(_DLL) # ifdef GC_BUILD ! # define GC_API __declspec(dllexport) # else # define GC_API __declspec(dllimport) # endif --- 94,104 ---- # endif #endif ! #if (defined(__DMC__) || defined(_MSC_VER)) \ ! && (defined(_DLL) && !defined(GC_NOT_DLL) \ ! || defined(GC_DLL)) # ifdef GC_BUILD ! # define GC_API extern __declspec(dllexport) # else # define GC_API __declspec(dllimport) # endif *************** typedef long GC_signed_word; *** 94,99 **** --- 146,161 ---- GC_API GC_word GC_gc_no;/* Counter incremented per collection. */ /* Includes empty GCs at startup. */ + + GC_API int GC_parallel; /* GC is parallelized for performance on */ + /* multiprocessors. Currently set only */ + /* implicitly if collector is built with */ + /* -DPARALLEL_MARK and if either: */ + /* Env variable GC_NPROC is set to > 1, or */ + /* GC_NPROC is not set and this is an MP. */ + /* If GC_parallel is set, incremental */ + /* collection is aonly partially functional, */ + /* and may not be desirable. */ /* Public R/W variables */ *************** GC_API int GC_find_leak; *** 113,118 **** --- 175,192 ---- /* deallocated with GC_free. Initial value */ /* is determined by FIND_LEAK macro. */ + GC_API int GC_all_interior_pointers; + /* Arrange for pointers to object interiors to */ + /* be recognized as valid. May not be changed */ + /* after GC initialization. */ + /* Initial value is determined by */ + /* -DALL_INTERIOR_POINTERS. */ + /* Unless DONT_ADD_BYTE_AT_END is defined, this */ + /* also affects whether sizes are increased by */ + /* at least a byte to allow "off the end" */ + /* pointer recognition. */ + /* MUST BE 0 or 1. */ + GC_API int GC_quiet; /* Disable statistics output. Only matters if */ /* collector has been compiled with statistics */ /* enabled. This involves a performance cost, */ *************** GC_API int GC_quiet; /* Disable statisti *** 120,126 **** GC_API int GC_finalize_on_demand; /* If nonzero, finalizers will only be run in */ ! /* response to an eplit GC_invoke_finalizers */ /* call. The default is determined by whether */ /* the FINALIZE_ON_DEMAND macro is defined */ /* when the collector is built. */ --- 194,200 ---- GC_API int GC_finalize_on_demand; /* If nonzero, finalizers will only be run in */ ! /* response to an explicit GC_invoke_finalizers */ /* call. The default is determined by whether */ /* the FINALIZE_ON_DEMAND macro is defined */ /* when the collector is built. */ *************** GC_API int GC_java_finalization; *** 132,137 **** --- 206,220 ---- /* ordered finalization. Default value is */ /* determined by JAVA_FINALIZATION macro. */ + GC_API void (* GC_finalizer_notifier)(); + /* Invoked by the collector when there are */ + /* objects to be finalized. Invoked at most */ + /* once per GC cycle. Never invoked unless */ + /* GC_finalize_on_demand is set. */ + /* Typically this will notify a finalization */ + /* thread, which will call GC_invoke_finalizers */ + /* in response. */ + GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */ /* because it's not safe. */ *************** GC_API int GC_full_freq; /* Number of *** 163,168 **** --- 246,261 ---- GC_API GC_word GC_non_gc_bytes; /* Bytes not considered candidates for collection. */ /* Used only to control scheduling of collections. */ + /* Updated by GC_malloc_uncollectable and GC_free. */ + /* Wizards only. */ + + GC_API int GC_no_dls; + /* Don't register dynamic library data segments. */ + /* Wizards only. Should be used only if the */ + /* application explicitly registers all roots. */ + /* In Microsoft Windows environments, this will */ + /* usually also prevent registration of the */ + /* main data segment as part of the root set. */ GC_API GC_word GC_free_space_divisor; /* We try to make sure that we allocate at */ *************** GC_API char *GC_stackbottom; /* Cool end *** 193,201 **** /* automatically. */ /* For multithreaded code, this is the */ /* cold end of the stack for the */ ! /* primordial thread. */ /* Public procedures */ /* * general purpose allocation routines, with roughly malloc calling conv. * The atomic versions promise that no relevant pointers are contained --- 286,324 ---- /* automatically. */ /* For multithreaded code, this is the */ /* cold end of the stack for the */ ! /* primordial thread. */ + GC_API int GC_dont_precollect; /* Don't collect as part of */ + /* initialization. Should be set only */ + /* if the client wants a chance to */ + /* manually initialize the root set */ + /* before the first collection. */ + /* Interferes with blacklisting. */ + /* Wizards only. */ + /* Public procedures */ + + /* Initialize the collector. This is only required when using thread-local + * allocation, since unlike the regular allocation routines, GC_local_malloc + * is not self-initializing. If you use GC_local_malloc you should arrange + * to call this somehow (e.g. from a constructor) before doing any allocation. + */ + GC_API void GC_init GC_PROTO((void)); + + GC_API unsigned long GC_time_limit; + /* If incremental collection is enabled, */ + /* We try to terminate collections */ + /* after this many milliseconds. Not a */ + /* hard time bound. Setting this to */ + /* GC_TIME_UNLIMITED will essentially */ + /* disable incremental collection while */ + /* leaving generational collection */ + /* enabled. */ + # define GC_TIME_UNLIMITED 999999 + /* Setting GC_time_limit to this value */ + /* will disable the "pause time exceeded */ + /* tests. */ + /* * general purpose allocation routines, with roughly malloc calling conv. * The atomic versions promise that no relevant pointers are contained *************** GC_API char *GC_stackbottom; /* Cool end *** 204,211 **** * will occur after GC_end_stubborn_change has been called on the * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object * that is scanned for pointers to collectable objects, but is not itself ! * collectable. GC_malloc_uncollectable and GC_free called on the resulting * object implicitly update GC_non_gc_bytes appropriately. */ GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes)); GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes)); --- 327,339 ---- * will occur after GC_end_stubborn_change has been called on the * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object * that is scanned for pointers to collectable objects, but is not itself ! * collectable. The object is scanned even if it does not appear to ! * be reachable. GC_malloc_uncollectable and GC_free called on the resulting * object implicitly update GC_non_gc_bytes appropriately. + * + * Note that the GC_malloc_stubborn support is stubbed out by default + * starting in 6.0. GC_malloc_stubborn is an alias for GC_malloc unless + * the collector is built with STUBBORN_ALLOC defined. */ GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes)); GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes)); *************** GC_API void GC_end_stubborn_change GC_PR *** 244,249 **** --- 372,381 ---- /* Return a pointer to the base (lowest address) of an object given */ /* a pointer to a location within the object. */ + /* I.e. map an interior pointer to the corresponding bas pointer. */ + /* Note that with debugging allocation, this returns a pointer to the */ + /* actual base of the object, i.e. the debug information, not to */ + /* the base of the user object. */ /* Return 0 if displaced_pointer doesn't point to within a valid */ /* object. */ GC_API GC_PTR GC_base GC_PROTO((GC_PTR displaced_pointer)); *************** GC_API size_t GC_get_free_bytes GC_PROTO *** 331,344 **** --- 463,492 ---- /* Return the number of bytes allocated since the last collection. */ GC_API size_t GC_get_bytes_since_gc GC_PROTO((void)); + /* Return the total number of bytes allocated in this process. */ + /* Never decreases. */ + GC_API size_t GC_get_total_bytes GC_PROTO((void)); + /* Enable incremental/generational collection. */ /* Not advisable unless dirty bits are */ /* available or most heap objects are */ /* pointerfree(atomic) or immutable. */ /* Don't use in leak finding mode. */ /* Ignored if GC_dont_gc is true. */ + /* Only the generational piece of this is */ + /* functional if GC_parallel is TRUE. */ GC_API void GC_enable_incremental GC_PROTO((void)); + /* Does incremental mode write-protect pages? Returns zero or */ + /* more of the following, or'ed together: */ + #define GC_PROTECTS_POINTER_HEAP 1 /* May protect non-atomic objs. */ + #define GC_PROTECTS_PTRFREE_HEAP 2 + #define GC_PROTECTS_STATIC_DATA 4 /* Curently never. */ + #define GC_PROTECTS_STACK 8 /* Probably impractical. */ + + #define GC_PROTECTS_NONE 0 + GC_API int GC_incremental_protection_needs GC_PROTO((void)); + /* Perform some garbage collection work, if appropriate. */ /* Return 0 if there is no more work to be done. */ /* Typically performs an amount of work corresponding roughly */ *************** GC_API void GC_debug_register_finalizer *** 497,502 **** --- 645,652 ---- /* but it's unavoidable for C++, since the compiler may */ /* silently introduce these. It's also benign in that specific */ /* case. */ + /* Note that cd will still be viewed as accessible, even if it */ + /* refers to the object itself. */ GC_API void GC_register_finalizer_ignore_self GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, GC_finalization_proc *ofn, GC_PTR *ocd)); *************** GC_API void GC_debug_register_finalizer_ *** 505,511 **** GC_finalization_proc *ofn, GC_PTR *ocd)); /* Another version of the above. It ignores all cycles. */ ! /* It should probably only be used by Java implementations. */ GC_API void GC_register_finalizer_no_order GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, GC_finalization_proc *ofn, GC_PTR *ocd)); --- 655,663 ---- GC_finalization_proc *ofn, GC_PTR *ocd)); /* Another version of the above. It ignores all cycles. */ ! /* It should probably only be used by Java implementations. */ ! /* Note that cd will still be viewed as accessible, even if it */ ! /* refers to the object itself. */ GC_API void GC_register_finalizer_no_order GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, GC_finalization_proc *ofn, GC_PTR *ocd)); *************** GC_API GC_warn_proc GC_set_warn_proc GC_ *** 588,594 **** /* Returns old warning procedure. */ /* The following is intended to be used by a higher level */ ! /* (e.g. cedar-like) finalization facility. It is expected */ /* that finalization code will arrange for hidden pointers to */ /* disappear. Otherwise objects can be accessed after they */ /* have been collected. */ --- 740,746 ---- /* Returns old warning procedure. */ /* The following is intended to be used by a higher level */ ! /* (e.g. Java-like) finalization facility. It is expected */ /* that finalization code will arrange for hidden pointers to */ /* disappear. Otherwise objects can be accessed after they */ /* have been collected. */ *************** typedef GC_PTR (*GC_fn_type) GC_PROTO((G *** 608,613 **** --- 760,768 ---- GC_API GC_PTR GC_call_with_alloc_lock GC_PROTO((GC_fn_type fn, GC_PTR client_data)); + /* The following routines are primarily intended for use with a */ + /* preprocessor which inserts calls to check C pointer arithmetic. */ + /* Check that p and q point to the same object. */ /* Fail conspicuously if they don't. */ /* Returns the first argument. */ *************** GC_API GC_PTR GC_is_visible GC_PROTO((GC *** 635,641 **** /* Check that if p is a pointer to a heap page, then it points to */ /* a valid displacement within a heap object. */ /* Fail conspicuously if this property does not hold. */ ! /* Uninteresting with ALL_INTERIOR_POINTERS. */ /* Always returns its argument. */ GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p)); --- 790,796 ---- /* Check that if p is a pointer to a heap page, then it points to */ /* a valid displacement within a heap object. */ /* Fail conspicuously if this property does not hold. */ ! /* Uninteresting with GC_all_interior_pointers. */ /* Always returns its argument. */ GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p)); *************** GC_API GC_PTR GC_is_valid_displacement G *** 651,659 **** # ifdef __GNUC__ # define GC_PTR_ADD(x, n) \ GC_PTR_ADD3(x, n, typeof(x)) ! # define GC_PRE_INCR(x, n) \ GC_PRE_INCR3(x, n, typeof(x)) ! # define GC_POST_INCR(x, n) \ GC_POST_INCR3(x, typeof(x)) # else /* We can't do this right without typeof, which ANSI */ --- 806,814 ---- # ifdef __GNUC__ # define GC_PTR_ADD(x, n) \ GC_PTR_ADD3(x, n, typeof(x)) ! # define GC_PRE_INCR(x, n) \ GC_PRE_INCR3(x, n, typeof(x)) ! # define GC_POST_INCR(x, n) \ GC_POST_INCR3(x, typeof(x)) # else /* We can't do this right without typeof, which ANSI */ *************** GC_API void (*GC_is_valid_displacement_p *** 693,768 **** GC_API void (*GC_is_visible_print_proc) GC_PROTO((GC_PTR p)); - #if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS) - # define SOLARIS_THREADS - #endif - - #ifdef SOLARIS_THREADS - /* We need to intercept calls to many of the threads primitives, so */ - /* that we can locate thread stacks and stop the world. */ - /* Note also that the collector cannot see thread specific data. */ - /* Thread specific data should generally consist of pointers to */ - /* uncollectable objects, which are deallocated using the destructor */ - /* facility in thr_keycreate. */ - # include - # include - int GC_thr_create(void *stack_base, size_t stack_size, - void *(*start_routine)(void *), void *arg, long flags, - thread_t *new_thread); - int GC_thr_join(thread_t wait_for, thread_t *departed, void **status); - int GC_thr_suspend(thread_t target_thread); - int GC_thr_continue(thread_t target_thread); - void * GC_dlopen(const char *path, int mode); - - # ifdef _SOLARIS_PTHREADS - # include - extern int GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void * (*thread_execp)(void *), void *arg); - extern int GC_pthread_join(pthread_t wait_for, void **status); ! # undef thread_t ! # define pthread_join GC_pthread_join ! # define pthread_create GC_pthread_create #endif ! # define thr_create GC_thr_create ! # define thr_join GC_thr_join ! # define thr_suspend GC_thr_suspend ! # define thr_continue GC_thr_continue ! # define dlopen GC_dlopen ! ! # endif /* SOLARIS_THREADS */ ! ! ! #if !defined(USE_LD_WRAP) && \ ! (defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS)) ! /* We treat these similarly. */ ! # include ! # include ! ! int GC_pthread_create(pthread_t *new_thread, ! const pthread_attr_t *attr, ! void *(*start_routine)(void *), void *arg); ! int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); ! int GC_pthread_join(pthread_t thread, void **retval); ! ! # define pthread_create GC_pthread_create ! # define pthread_sigmask GC_pthread_sigmask ! # define pthread_join GC_pthread_join ! # define dlopen GC_dlopen ! ! #endif /* xxxxx_THREADS */ ! ! # if defined(PCR) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ ! defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ ! defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) /* Any flavor of threads except SRC_M3. */ /* This returns a list of objects, linked through their first */ /* word. Its use can greatly reduce lock contention problems, since */ /* the allocation lock can be acquired and released many fewer times. */ /* lb must be large enough to hold the pointer field. */ GC_PTR GC_malloc_many(size_t lb); #define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */ /* in returned list. */ --- 848,871 ---- GC_API void (*GC_is_visible_print_proc) GC_PROTO((GC_PTR p)); ! /* For pthread support, we generally need to intercept a number of */ ! /* thread library calls. We do that here by macro defining them. */ ! #if !defined(GC_USE_LD_WRAP) && \ ! (defined(GC_PTHREADS) || defined(GC_SOLARIS_THREADS)) ! # include "gc_pthread_redirects.h" #endif ! # if defined(PCR) || defined(GC_SOLARIS_THREADS) || \ ! defined(GC_PTHREADS) || defined(GC_WIN32_THREADS) /* Any flavor of threads except SRC_M3. */ /* This returns a list of objects, linked through their first */ /* word. Its use can greatly reduce lock contention problems, since */ /* the allocation lock can be acquired and released many fewer times. */ /* lb must be large enough to hold the pointer field. */ + /* It is used internally by gc_local_alloc.h, which provides a simpler */ + /* programming interface on Linux. */ GC_PTR GC_malloc_many(size_t lb); #define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */ /* in returned list. */ *************** extern void GC_thr_init(); /* Needed for *** 770,775 **** --- 873,909 ---- #endif /* THREADS && !SRC_M3 */ + #if defined(GC_WIN32_THREADS) + # include + + /* + * All threads must be created using GC_CreateThread, so that they will be + * recorded in the thread table. + */ + HANDLE WINAPI GC_CreateThread( + LPSECURITY_ATTRIBUTES lpThreadAttributes, + DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, + LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); + + # if defined(_WIN32_WCE) + /* + * win32_threads.c implements the real WinMain, which will start a new thread + * to call GC_WinMain after initializing the garbage collector. + */ + int WINAPI GC_WinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPWSTR lpCmdLine, + int nCmdShow ); + + # ifndef GC_BUILD + # define WinMain GC_WinMain + # define CreateThread GC_CreateThread + # endif + # endif /* defined(_WIN32_WCE) */ + + #endif /* defined(GC_WIN32_THREADS) */ + /* * If you are planning on putting * the collector in a SunOS 5 dynamic library, you need to call GC_INIT() *************** extern void GC_thr_init(); /* Needed for *** 780,786 **** # define GC_INIT() { extern end, etext; \ GC_noop(&end, &etext); } #else ! # if defined(__CYGWIN32__) && defined(GC_USE_DLL) /* * Similarly gnu-win32 DLLs need explicit initialization */ --- 914,920 ---- # define GC_INIT() { extern end, etext; \ GC_noop(&end, &etext); } #else ! # if (defined(__CYGWIN32__) && defined(GC_USE_DLL)) || defined (_AIX) /* * Similarly gnu-win32 DLLs need explicit initialization */ *************** extern void GC_thr_init(); /* Needed for *** 790,802 **** # endif #endif ! #if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ ! || defined(_WIN32) /* win32S may not free all resources on process exit. */ /* This explicitly deallocates the heap. */ GC_API void GC_win32_free_heap (); #endif #ifdef __cplusplus } /* end of extern "C" */ #endif --- 924,946 ---- # endif #endif ! #if !defined(_WIN32_WCE) \ ! && ((defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ ! || defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__)) /* win32S may not free all resources on process exit. */ /* This explicitly deallocates the heap. */ GC_API void GC_win32_free_heap (); #endif + #if ( defined(_AMIGA) && !defined(GC_AMIGA_MAKINGLIB) ) + /* Allocation really goes through GC_amiga_allocwrapper_do */ + # include "gc_amiga_redirects.h" + #endif + + #if defined(GC_REDIRECT_TO_LOCAL) && !defined(GC_LOCAL_ALLOC_H) + # include "gc_local_alloc.h" + #endif + #ifdef __cplusplus } /* end of extern "C" */ #endif diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_alloc.h gcc-3.1/boehm-gc/include/gc_alloc.h *** gcc-3.0.4/boehm-gc/include/gc_alloc.h Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/include/gc_alloc.h Fri Aug 17 18:30:50 2001 *************** *** 25,30 **** --- 25,33 ---- // This uses template classes with static members, and hence does not work // with g++ 2.7.2 and earlier. // + // This code assumes that the collector itself has been compiled with a + // compiler that defines __STDC__ . + // #include "gc.h" diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_amiga_redirects.h gcc-3.1/boehm-gc/include/gc_amiga_redirects.h *** gcc-3.0.4/boehm-gc/include/gc_amiga_redirects.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/gc_amiga_redirects.h Fri Aug 17 18:30:50 2001 *************** *** 0 **** --- 1,30 ---- + #ifndef GC_AMIGA_REDIRECTS_H + + # define GC_AMIGA_REDIRECTS_H + + # if ( defined(_AMIGA) && !defined(GC_AMIGA_MAKINGLIB) ) + extern void *GC_amiga_realloc(void *old_object,size_t new_size_in_bytes); + # define GC_realloc(a,b) GC_amiga_realloc(a,b) + extern void GC_amiga_set_toany(void (*func)(void)); + extern int GC_amiga_free_space_divisor_inc; + extern void *(*GC_amiga_allocwrapper_do) \ + (size_t size,void *(*AllocFunction)(size_t size2)); + # define GC_malloc(a) \ + (*GC_amiga_allocwrapper_do)(a,GC_malloc) + # define GC_malloc_atomic(a) \ + (*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic) + # define GC_malloc_uncollectable(a) \ + (*GC_amiga_allocwrapper_do)(a,GC_malloc_uncollectable) + # define GC_malloc_stubborn(a) \ + (*GC_amiga_allocwrapper_do)(a,GC_malloc_stubborn) + # define GC_malloc_atomic_uncollectable(a) \ + (*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_uncollectable) + # define GC_malloc_ignore_off_page(a) \ + (*GC_amiga_allocwrapper_do)(a,GC_malloc_ignore_off_page) + # define GC_malloc_atomic_ignore_off_page(a) \ + (*GC_amiga_allocwrapper_do)(a,GC_malloc_atomic_ignore_off_page) + # endif /* _AMIGA && !GC_AMIGA_MAKINGLIB */ + + #endif /* GC_AMIGA_REDIRECTS_H */ + + diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_backptr.h gcc-3.1/boehm-gc/include/gc_backptr.h *** gcc-3.0.4/boehm-gc/include/gc_backptr.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/gc_backptr.h Fri Aug 17 18:30:50 2001 *************** *** 0 **** --- 1,65 ---- + /* + * This is a simple API to implement pointer back tracing, i.e. + * to answer questions such as "who is pointing to this" or + * "why is this object being retained by the collector" + * + * This API assumes that we have an ANSI C compiler. + * + * Most of these calls yield useful information on only after + * a garbage collection. Usually the client will first force + * a full collection and then gather information, preferably + * before much intervening allocation. + * + * The implementation of the interface is only about 99.9999% + * correct. It is intended to be good enough for profiling, + * but is not intended to be used with production code. + * + * Results are likely to be much more useful if all allocation is + * accomplished through the debugging allocators. + * + * The implementation idea is due to A. Demers. + */ + + #ifndef GC_BACKPTR_H + #define GC_BACKPTR_H + /* Store information about the object referencing dest in *base_p */ + /* and *offset_p. */ + /* If multiple objects or roots point to dest, the one reported */ + /* will be the last on used by the garbage collector to trace the */ + /* object. */ + /* source is root ==> *base_p = address, *offset_p = 0 */ + /* source is heap object ==> *base_p != 0, *offset_p = offset */ + /* Returns 1 on success, 0 if source couldn't be determined. */ + /* Dest can be any address within a heap object. */ + typedef enum { GC_UNREFERENCED, /* No reference info available. */ + GC_NO_SPACE, /* Dest not allocated with debug alloc */ + GC_REFD_FROM_ROOT, /* Referenced directly by root *base_p */ + GC_REFD_FROM_REG, /* Referenced from a register, i.e. */ + /* a root without an address. */ + GC_REFD_FROM_HEAP, /* Referenced from another heap obj. */ + GC_FINALIZER_REFD /* Finalizable and hence accessible. */ + } GC_ref_kind; + + GC_ref_kind GC_get_back_ptr_info(void *dest, void **base_p, size_t *offset_p); + + /* Generate a random heap address. */ + /* The resulting address is in the heap, but */ + /* not necessarily inside a valid object. */ + void * GC_generate_random_heap_address(void); + + /* Generate a random address inside a valid marked heap object. */ + void * GC_generate_random_valid_address(void); + + /* Force a garbage collection and generate a backtrace from a */ + /* random heap address. */ + /* This uses the GC logging mechanism (GC_printf) to produce */ + /* output. It can often be called from a debugger. The */ + /* source in dbg_mlc.c also serves as a sample client. */ + void GC_generate_random_backtrace(void); + + /* Print a backtrace from a specific address. Used by the */ + /* above. The client should call GC_gcollect() immediately */ + /* before invocation. */ + void GC_print_backtrace(void *); + + #endif /* GC_BACKPTR_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_copy_descr.h gcc-3.1/boehm-gc/include/gc_copy_descr.h *** gcc-3.0.4/boehm-gc/include/gc_copy_descr.h Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/include/gc_copy_descr.h Thu Jan 1 00:00:00 1970 *************** *** 1,26 **** - - /* - * Copyright (c) 1999 by Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - /* Descriptor for allocation request. May be redefined by client. */ - typedef struct { - GC_word bitmap; /* Bitmap describing pointer locations. */ - /* High order bit correspond to 0th */ - /* word. 2 lsbs must be 0. */ - size_t length; /* In bytes, must be multiple of word */ - /* size. Must be >0, <= 512 */ - } * GC_copy_descriptor; - - /* The collector accesses descriptors only through these two macros. */ - #define GC_SIZE_FROM_DESCRIPTOR(d) ((d) -> length) - #define GC_BIT_MAP_FROM_DESCRIPTOR(d) ((d) -> bitmap) - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_cpp.h gcc-3.1/boehm-gc/include/gc_cpp.h *** gcc-3.0.4/boehm-gc/include/gc_cpp.h Sat May 6 23:59:01 2000 --- gcc-3.1/boehm-gc/include/gc_cpp.h Sat Aug 18 01:04:43 2001 *************** Cautions: *** 83,89 **** 1. Be sure the collector has been augmented with "make c++". 2. If your compiler supports the new "operator new[]" syntax, then ! add -DOPERATOR_NEW_ARRAY to the Makefile. If your compiler doesn't support "operator new[]", beware that an array of type T, where T is derived from "gc", may or may not be --- 83,89 ---- 1. Be sure the collector has been augmented with "make c++". 2. If your compiler supports the new "operator new[]" syntax, then ! add -DGC_OPERATOR_NEW_ARRAY to the Makefile. If your compiler doesn't support "operator new[]", beware that an array of type T, where T is derived from "gc", may or may not be *************** by UseGC. GC is an alias for UseGC, unl *** 137,146 **** #define _cdecl #endif ! #if ! defined( OPERATOR_NEW_ARRAY ) \ ! && (__BORLANDC__ >= 0x450 || (__GNUC__ >= 2 && __GNUC_MINOR__ >= 6) \ ! || __WATCOMC__ >= 1050) ! # define OPERATOR_NEW_ARRAY #endif enum GCPlacement {UseGC, --- 137,153 ---- #define _cdecl #endif ! #if ! defined( GC_NO_OPERATOR_NEW_ARRAY ) \ ! && !defined(_ENABLE_ARRAYNEW) /* Digimars */ \ ! && (defined(__BORLANDC__) && (__BORLANDC__ < 0x450) \ ! || (defined(__GNUC__) && \ ! (__GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 6)) \ ! || (defined(__WATCOMC__) && __WATCOMC__ < 1050)) ! # define GC_NO_OPERATOR_NEW_ARRAY ! #endif ! ! #if !defined(GC_NO_OPERATOR_NEW_ARRAY) && !defined(GC_OPERATOR_NEW_ARRAY) ! # define GC_OPERATOR_NEW_ARRAY #endif enum GCPlacement {UseGC, *************** class gc {public: *** 154,164 **** inline void* operator new( size_t size, GCPlacement gcp ); inline void operator delete( void* obj ); ! #ifdef OPERATOR_NEW_ARRAY inline void* operator new[]( size_t size ); inline void* operator new[]( size_t size, GCPlacement gcp ); inline void operator delete[]( void* obj ); ! #endif /* OPERATOR_NEW_ARRAY */ }; /* Instances of classes derived from "gc" will be allocated in the --- 161,171 ---- inline void* operator new( size_t size, GCPlacement gcp ); inline void operator delete( void* obj ); ! #ifdef GC_OPERATOR_NEW_ARRAY inline void* operator new[]( size_t size ); inline void* operator new[]( size_t size, GCPlacement gcp ); inline void operator delete[]( void* obj ); ! #endif /* GC_OPERATOR_NEW_ARRAY */ }; /* Instances of classes derived from "gc" will be allocated in the *************** private: *** 179,184 **** --- 186,197 ---- extern "C" {typedef void (*GCCleanUpFunc)( void* obj, void* clientData );} + #ifdef _MSC_VER + // Disable warning that "no matching operator delete found; memory will + // not be freed if initialization throws an exception" + # pragma warning(disable:4291) + #endif + inline void* operator new( size_t size, GCPlacement gcp, *************** inline void* operator new( *** 198,204 **** classes derived from "gc_cleanup" or containing members derived from "gc_cleanup". */ ! #ifdef OPERATOR_NEW_ARRAY inline void* operator new[]( size_t size, --- 211,260 ---- classes derived from "gc_cleanup" or containing members derived from "gc_cleanup". */ ! #ifdef GC_OPERATOR_NEW_ARRAY ! ! #ifdef _MSC_VER ! /** This ensures that the system default operator new[] doesn't get ! * undefined, which is what seems to happen on VC++ 6 for some reason ! * if we define a multi-argument operator new[]. ! * There seems to be really redirect new in this environment without ! * including this everywhere. ! */ ! inline void *operator new[]( size_t size ) ! { ! return GC_MALLOC_UNCOLLECTABLE( size ); ! } ! ! inline void operator delete[](void* obj) ! { ! GC_FREE(obj); ! }; ! ! inline void* operator new( size_t size) ! { ! return GC_MALLOC_UNCOLLECTABLE( size); ! }; ! ! inline void operator delete(void* obj) ! { ! GC_FREE(obj); ! }; ! ! ! // This new operator is used by VC++ in case of Debug builds ! ! inline void* operator new( size_t size, ! int ,//nBlockUse, ! const char * szFileName, ! int nLine ! ) { ! # ifndef GC_DEBUG ! return GC_malloc_uncollectable( size ); ! # else ! return GC_debug_malloc_uncollectable(size, szFileName, nLine); ! # endif ! } ! ! #endif /* _MSC_VER */ inline void* operator new[]( size_t size, *************** inline void* operator new[]( *** 208,214 **** /* The operator new for arrays, identical to the above. */ ! #endif /* OPERATOR_NEW_ARRAY */ /**************************************************************************** --- 264,270 ---- /* The operator new for arrays, identical to the above. */ ! #endif /* GC_OPERATOR_NEW_ARRAY */ /**************************************************************************** *************** inline void gc::operator delete( void* o *** 231,237 **** GC_FREE( obj );} ! #ifdef OPERATOR_NEW_ARRAY inline void* gc::operator new[]( size_t size ) { return gc::operator new( size );} --- 287,293 ---- GC_FREE( obj );} ! #ifdef GC_OPERATOR_NEW_ARRAY inline void* gc::operator new[]( size_t size ) { return gc::operator new( size );} *************** inline void* gc::operator new[]( size_t *** 242,248 **** inline void gc::operator delete[]( void* obj ) { gc::operator delete( obj );} ! #endif /* OPERATOR_NEW_ARRAY */ inline gc_cleanup::~gc_cleanup() { --- 298,304 ---- inline void gc::operator delete[]( void* obj ) { gc::operator delete( obj );} ! #endif /* GC_OPERATOR_NEW_ARRAY */ inline gc_cleanup::~gc_cleanup() { *************** inline gc_cleanup::gc_cleanup() { *** 256,266 **** void* oldData; void* base = GC_base( (void *) this ); if (0 != base) { ! GC_REGISTER_FINALIZER_IGNORE_SELF( base, (GC_finalization_proc)cleanup, (void*) ((char*) this - (char*) base), &oldProc, &oldData ); if (0 != oldProc) { ! GC_REGISTER_FINALIZER_IGNORE_SELF( base, oldProc, oldData, 0, 0 );}}} inline void* operator new( size_t size, --- 312,323 ---- void* oldData; void* base = GC_base( (void *) this ); if (0 != base) { ! // Don't call the debug version, since this is a real base address. ! GC_register_finalizer_ignore_self( base, (GC_finalization_proc)cleanup, (void*) ((char*) this - (char*) base), &oldProc, &oldData ); if (0 != oldProc) { ! GC_register_finalizer_ignore_self( base, oldProc, oldData, 0, 0 );}}} inline void* operator new( size_t size, *************** inline void* operator new( *** 282,288 **** return obj;} ! #ifdef OPERATOR_NEW_ARRAY inline void* operator new[]( size_t size, --- 339,345 ---- return obj;} ! #ifdef GC_OPERATOR_NEW_ARRAY inline void* operator new[]( size_t size, *************** inline void* operator new[]( *** 292,298 **** { return ::operator new( size, gcp, cleanup, clientData );} ! #endif /* OPERATOR_NEW_ARRAY */ #endif /* GC_CPP_H */ --- 349,355 ---- { return ::operator new( size, gcp, cleanup, clientData );} ! #endif /* GC_OPERATOR_NEW_ARRAY */ #endif /* GC_CPP_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_gcj.h gcc-3.1/boehm-gc/include/gc_gcj.h *** gcc-3.0.4/boehm-gc/include/gc_gcj.h Wed Apr 19 02:29:16 2000 --- gcc-3.1/boehm-gc/include/gc_gcj.h Tue Oct 16 09:01:38 2001 *************** *** 24,29 **** --- 24,33 ---- * may be marked by the mark procedure passed to GC_init_gcj_malloc. */ + #ifndef GC_GCJ_H + + #define GC_GCJ_H + #ifndef MARK_DESCR_OFFSET # define MARK_DESCR_OFFSET sizeof(word) #endif *************** *** 41,52 **** #endif /* The following allocators signal an out of memory condition with */ ! /* return GC_oom_action(); */ ! /* The default GC_oom_action returns 0. */ ! /* This functionality is currently restricted to the gcj allocators. */ ! /* We may want to extend it to the others. */ ! ! extern void * (*GC_oom_action)(void); /* The following function must be called before the gcj allocators */ /* can be invoked. */ --- 45,51 ---- #endif /* The following allocators signal an out of memory condition with */ ! /* return GC_oom_fn(bytes); */ /* The following function must be called before the gcj allocators */ /* can be invoked. */ *************** extern void * (*GC_oom_action)(void); *** 58,65 **** /* to use the same mark_proc for some of its generated mark descriptors.*/ /* In that case, it should use a different "environment" value to */ /* detect the presence or absence of the debug header. */ - - /* the debugging interface. */ /* Mp is really of type mark_proc, as defined in gc_mark.h. We don't */ /* want to include that here for namespace pollution reasons. */ extern void GC_init_gcj_malloc(int mp_index, void * /* really mark_proc */mp); --- 57,62 ---- *************** extern void * GC_debug_gcj_malloc(size_t *** 77,82 **** --- 74,82 ---- /* Similar to the above, but the size is in words, and we don't */ /* adjust it. The size is assumed to be such that it can be */ /* allocated as a small object. */ + /* Unless it is known that the collector is not configured */ + /* with USE_MARK_BYTES and unless it is known that the object */ + /* has weak alignment requirements, lw must be even. */ extern void * GC_gcj_fast_malloc(size_t lw, void * ptr_to_struct_containing_descr); extern void * GC_debug_gcj_fast_malloc(size_t lw, *************** extern void * GC_gcj_malloc_ignore_off_p *** 91,101 **** # ifdef GC_DEBUG # define GC_GCJ_MALLOC(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS) # define GC_GCJ_FAST_MALLOC(s,d) GC_debug_gcj_fast_malloc(s,d,GC_EXTRAS) ! # define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) GC_gcj_debug_malloc(s,d,GC_EXTRAS) # else # define GC_GCJ_MALLOC(s,d) GC_gcj_malloc(s,d) # define GC_GCJ_FAST_MALLOC(s,d) GC_gcj_fast_malloc(s,d) # define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) \ ! GC_gcj_debug_malloc_ignore_off_page(s,d) # endif --- 91,102 ---- # ifdef GC_DEBUG # define GC_GCJ_MALLOC(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS) # define GC_GCJ_FAST_MALLOC(s,d) GC_debug_gcj_fast_malloc(s,d,GC_EXTRAS) ! # define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS) # else # define GC_GCJ_MALLOC(s,d) GC_gcj_malloc(s,d) # define GC_GCJ_FAST_MALLOC(s,d) GC_gcj_fast_malloc(s,d) # define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) \ ! GC_gcj_malloc_ignore_off_page(s,d) # endif + #endif /* GC_GCJ_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_inl.h gcc-3.1/boehm-gc/include/gc_inl.h *** gcc-3.0.4/boehm-gc/include/gc_inl.h Wed Apr 7 14:56:06 1999 --- gcc-3.1/boehm-gc/include/gc_inl.h Fri Aug 17 18:30:50 2001 *************** *** 17,34 **** # include "private/gc_priv.h" # endif ! /* USE OF THIS FILE IS NOT RECOMMENDED unless the collector has been */ ! /* compiled without -DALL_INTERIOR_POINTERS or with */ /* -DDONT_ADD_BYTE_AT_END, or the specified size includes a pointerfree */ /* word at the end. In the standard collector configuration, */ /* the final word of each object may not be scanned. */ ! /* This is most useful for compilers that generate C. */ /* Manual use is hereby discouraged. */ /* Allocate n words (NOT BYTES). X is made to point to the result. */ /* It is assumed that n < MAXOBJSZ, and */ /* that n > 0. On machines requiring double word alignment of some */ ! /* data, we also assume that n is 1 or even. This bypasses the */ /* MERGE_SIZES mechanism. In order to minimize the number of distinct */ /* free lists that are maintained, the caller should ensure that a */ /* small number of distinct values of n are used. (The MERGE_SIZES */ --- 17,38 ---- # include "private/gc_priv.h" # endif ! /* USE OF THIS FILE IS NOT RECOMMENDED unless GC_all_interior_pointers */ ! /* is always set, or the collector has been built with */ /* -DDONT_ADD_BYTE_AT_END, or the specified size includes a pointerfree */ /* word at the end. In the standard collector configuration, */ /* the final word of each object may not be scanned. */ ! /* This iinterface is most useful for compilers that generate C. */ /* Manual use is hereby discouraged. */ /* Allocate n words (NOT BYTES). X is made to point to the result. */ /* It is assumed that n < MAXOBJSZ, and */ /* that n > 0. On machines requiring double word alignment of some */ ! /* data, we also assume that n is 1 or even. */ ! /* If the collector is built with -DUSE_MARK_BYTES or -DPARALLEL_MARK, */ ! /* the n = 1 case is also disallowed. */ ! /* Effectively this means that portable code should make sure n is even.*/ ! /* This bypasses the */ /* MERGE_SIZES mechanism. In order to minimize the number of distinct */ /* free lists that are maintained, the caller should ensure that a */ /* small number of distinct values of n are used. (The MERGE_SIZES */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_local_alloc.h gcc-3.1/boehm-gc/include/gc_local_alloc.h *** gcc-3.0.4/boehm-gc/include/gc_local_alloc.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/gc_local_alloc.h Fri Aug 17 18:30:50 2001 *************** *** 0 **** --- 1,85 ---- + /* + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + + /* + * Interface for thread local allocation. Memory obtained + * this way can be used by all threads, as though it were obtained + * from an allocator like GC_malloc. The difference is that GC_local_malloc + * counts the number of allocations of a given size from the current thread, + * and uses GC_malloc_many to perform the allocations once a threashold + * is exceeded. Thus far less synchronization may be needed. + * Allocation of known large objects should not use this interface. + * This interface is designed primarily for fast allocation of small + * objects on multiprocessors, e.g. for a JVM running on an MP server. + * + * If this file is included with GC_GCJ_SUPPORT defined, GCJ-style + * bitmap allocation primitives will also be included. + * + * If this file is included with GC_REDIRECT_TO_LOCAL defined, then + * GC_MALLOC, GC_MALLOC_ATOMIC, and possibly GC_GCJ_MALLOC will + * be redefined to use the thread local allocatoor. + * + * The interface is available only if the collector is built with + * -DTHREAD_LOCAL_ALLOC, which is currently supported only on Linux. + * + * The debugging allocators use standard, not thread-local allocation. + */ + + #ifndef GC_LOCAL_ALLOC_H + #define GC_LOCAL_ALLOC_H + + #ifndef _GC_H + # include "gc.h" + #endif + + #if defined(GC_GCJ_SUPPORT) && !defined(GC_GCJ_H) + # include "gc_gcj.h" + #endif + + /* We assume ANSI C for this interface. */ + + GC_PTR GC_local_malloc(size_t bytes); + + GC_PTR GC_local_malloc_atomic(size_t bytes); + + #if defined(GC_GCJ_SUPPORT) + GC_PTR GC_local_gcj_malloc(size_t bytes, + void * ptr_to_struct_containing_descr); + #endif + + # ifdef GC_DEBUG + # define GC_LOCAL_MALLOC(s) GC_debug_malloc(s,GC_EXTRAS) + # define GC_LOCAL_MALLOC_ATOMIC(s) GC_debug_malloc_atomic(s,GC_EXTRAS) + # ifdef GC_GCJ_SUPPORT + # define GC_LOCAL_GCJ_MALLOC(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS) + # endif + # else + # define GC_LOCAL_MALLOC(s) GC_local_malloc(s) + # define GC_LOCAL_MALLOC_ATOMIC(s) GC_local_malloc_atomic(s) + # ifdef GC_GCJ_SUPPORT + # define GC_LOCAL_GCJ_MALLOC(s,d) GC_local_gcj_malloc(s,d) + # endif + # endif + + # ifdef GC_REDIRECT_TO_LOCAL + # undef GC_MALLOC + # define GC_MALLOC(s) GC_LOCAL_MALLOC(s) + # undef GC_MALLOC_ATOMIC + # define GC_MALLOC_ATOMIC(s) GC_LOCAL_MALLOC_ATOMIC(s) + # ifdef GC_GCJ_SUPPORT + # undef GC_GCJ_MALLOC + # define GC_GCJ_MALLOC(s,d) GC_LOCAL_GCJ_MALLOC(s,d) + # endif + # endif + + #endif /* GC_LOCAL_ALLOC_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_mark.h gcc-3.1/boehm-gc/include/gc_mark.h *** gcc-3.0.4/boehm-gc/include/gc_mark.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/gc_mark.h Fri Aug 17 18:30:50 2001 *************** *** 0 **** --- 1,145 ---- + /* + * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 2001 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ + + /* + * This contains interfaces to the GC marker that are likely to be useful to + * clients that provide detailed heap layout information to the collector. + * This interface should not be used by normal C or C++ clients. + * It will be useful to runtimes for other languages. + * + * Note that this file is not "namespace-clean", i.e. it introduces names + * not prefixed with GC_, which may collide with the client's names. It + * should be included only in those few places that directly provide + * information to the collector. + */ + #ifndef GC_MARK_H + # define GC_MARK_H + + # ifndef GC_H + # include "gc.h" + # endif + + /* A client supplied mark procedure. Returns new mark stack pointer. */ + /* Primary effect should be to push new entries on the mark stack. */ + /* Mark stack pointer values are passed and returned explicitly. */ + /* Global variables decribing mark stack are not necessarily valid. */ + /* (This usually saves a few cycles by keeping things in registers.) */ + /* Assumed to scan about GC_PROC_BYTES on average. If it needs to do */ + /* much more work than that, it should do it in smaller pieces by */ + /* pushing itself back on the mark stack. */ + /* Note that it should always do some work (defined as marking some */ + /* objects) before pushing more than one entry on the mark stack. */ + /* This is required to ensure termination in the event of mark stack */ + /* overflows. */ + /* This procedure is always called with at least one empty entry on the */ + /* mark stack. */ + /* Currently we require that mark procedures look for pointers in a */ + /* subset of the places the conservative marker would. It must be safe */ + /* to invoke the normal mark procedure instead. */ + /* WARNING: Such a mark procedure may be invoked on an unused object */ + /* residing on a free list. Such objects are cleared, except for a */ + /* free list link field in the first word. Thus mark procedures may */ + /* not count on the presence of a type descriptor, and must handle this */ + /* case correctly somehow. */ + # define GC_PROC_BYTES 100 + struct GC_ms_entry; + typedef struct GC_ms_entry * (*GC_mark_proc) GC_PROTO(( + GC_word * addr, struct GC_ms_entry * mark_stack_ptr, + struct GC_ms_entry * mark_stack_limit, GC_word env)); + + # define GC_LOG_MAX_MARK_PROCS 6 + # define GC_MAX_MARK_PROCS (1 << GC_LOG_MAX_MARK_PROCS) + + /* In a few cases it's necessary to assign statically known indices to */ + /* certain mark procs. Thus we reserve a few for well known clients. */ + /* (This is necessary if mark descriptors are compiler generated.) */ + #define GC_RESERVED_MARK_PROCS 8 + # define GC_GCJ_RESERVED_MARK_PROC_INDEX 0 + + /* Object descriptors on mark stack or in objects. Low order two */ + /* bits are tags distinguishing among the following 4 possibilities */ + /* for the high order 30 bits. */ + #define GC_DS_TAG_BITS 2 + #define GC_DS_TAGS ((1 << GC_DS_TAG_BITS) - 1) + #define GC_DS_LENGTH 0 /* The entire word is a length in bytes that */ + /* must be a multiple of 4. */ + #define GC_DS_BITMAP 1 /* 30 (62) bits are a bitmap describing pointer */ + /* fields. The msb is 1 iff the first word */ + /* is a pointer. */ + /* (This unconventional ordering sometimes */ + /* makes the marker slightly faster.) */ + /* Zeroes indicate definite nonpointers. Ones */ + /* indicate possible pointers. */ + /* Only usable if pointers are word aligned. */ + #define GC_DS_PROC 2 + /* The objects referenced by this object can be */ + /* pushed on the mark stack by invoking */ + /* PROC(descr). ENV(descr) is passed as the */ + /* last argument. */ + # define GC_MAKE_PROC(proc_index, env) \ + (((((env) << GC_LOG_MAX_MARK_PROCS) \ + | (proc_index)) << GC_DS_TAG_BITS) | GC_DS_PROC) + #define GC_DS_PER_OBJECT 3 /* The real descriptor is at the */ + /* byte displacement from the beginning of the */ + /* object given by descr & ~DS_TAGS */ + /* If the descriptor is negative, the real */ + /* descriptor is at (*) - */ + /* (descr & ~DS_TAGS) - GC_INDIR_PER_OBJ_BIAS */ + /* The latter alternative can be used if each */ + /* object contains a type descriptor in the */ + /* first word. */ + /* Note that in multithreaded environments */ + /* per object descriptors maust be located in */ + /* either the first two or last two words of */ + /* the object, since only those are guaranteed */ + /* to be cleared while the allocation lock is */ + /* held. */ + #define GC_INDIR_PER_OBJ_BIAS 0x10 + + extern GC_PTR GC_least_plausible_heap_addr; + extern GC_PTR GC_greatest_plausible_heap_addr; + /* Bounds on the heap. Guaranteed valid */ + /* Likely to include future heap expansion. */ + + /* Handle nested references in a custom mark procedure. */ + /* Check if obj is a valid object. If so, ensure that it is marked. */ + /* If it was not previously marked, push its contents onto the mark */ + /* stack for future scanning. The object will then be scanned using */ + /* its mark descriptor. */ + /* Returns the new mark stack pointer. */ + /* Handles mark stack overflows correctly. */ + /* Since this marks first, it makes progress even if there are mark */ + /* stack overflows. */ + /* Src is the address of the pointer to obj, which is used only */ + /* for back pointer-based heap debugging. */ + /* It is strongly recommended that most objects be handled without mark */ + /* procedures, e.g. with bitmap descriptors, and that mark procedures */ + /* be reserved for exceptional cases. That will ensure that */ + /* performance of this call is not extremely performance critical. */ + /* (Otherwise we would need to inline GC_mark_and_push completely, */ + /* which would tie the client code to a fixed colllector version.) */ + struct GC_ms_entry *GC_mark_and_push + GC_PROTO((GC_PTR obj, + struct GC_ms_entry * mark_stack_ptr, + struct GC_ms_entry * mark_stack_limit, GC_PTR *src)); + + #define GC_MARK_AND_PUSH(obj, msp, lim, src) \ + (((GC_word)obj >= (GC_word)GC_least_plausible_heap_addr && \ + (GC_word)obj <= (GC_word)GC_greatest_plausible_heap_addr)? \ + GC_mark_and_push(obj, msp, lim, src) : \ + msp) + + #endif /* GC_MARK_H */ + diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_nursery.h gcc-3.1/boehm-gc/include/gc_nursery.h *** gcc-3.0.4/boehm-gc/include/gc_nursery.h Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/include/gc_nursery.h Thu Jan 1 00:00:00 1970 *************** *** 1,90 **** - - /* - * Copyright (c) 1999 by Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - - /* - * THIS IMPLEMENTATION FOR THIS INTERFACE IS INCOMPLETE. - * NONE OF THIS HAS BEEN TESTED. DO NOT USE. - * - * Comments on the interface are appreciated, especially from - * potential users of the interface. - * - * This is a Bartlett style copying collector for young objects. - * We assume for now that all objects allocated through this - * mechanism have pointers only in the first BITMAP_BITS words. - * (On a 32-bit machine, BITMAP_BITS is 30.) - * Objects allocated in this manner should be rarely referenced - * by objects not allocated either through this interface, or through - * the typed allocation interface. - * If this interface is used, we assume that type information provided - * through either this or the typed allocation interface is valid - * in a stronger sense: - * - * 1) No pointers are stored in fields not marked as such. - * (Otherwise it is only necessary that objects referenced by - * fields marked as nonpointers are also reachable via another - * path.) - * 2) Values stored in pointer fields are either not addresses in - * the heap, or they really are pointers. In the latter case, it - * is acceptable to move the object they refer to, and to update - * the pointer. - * - * GC_free may not be invoked on objects allocated with GC_copying_malloc. - * - * No extra space is added to the end of objects allocated through this - * interface. If the client needs to maintain pointers past the - * end, the size should be explicitly padded. - * - * We assume that calls to this will usually be compiler generated. - * Hence the interface is allowed to be a bit ugly in return for speed. - */ - - #include "gc_copy_descr.h" - - /* GC_copy_descr.h must define */ - /* GC_SIZE_FROM_DESCRIPTOR(descr) and */ - /* GC_BIT_MAP_FROM_DESCRIPTOR(descr). */ - /* It may either be the GC supplied version of the header file, or a */ - /* client specific one that derives the information from a client- */ - /* specific type descriptor. */ - - typedef GC_PTR GC_copy_alloc_state; - /* Current allocator state. */ - /* Multiple allocation states */ - /* may be used for concurrent */ - /* allocation, or to enhance */ - /* locality. */ - /* Should be treated as opaque. */ - - /* Allocate a memory block of size given in the descriptor, and with */ - /* pointer layout given by the descriptor. The resulting block may not */ - /* be cleared, and should immediately be initialized by the client. */ - /* (A concurrent GC may see an uninitialized pointer field. If it */ - /* points outside the nursery, that's fine. If it points inside, it */ - /* may retain an object, and be relocated. But that's also fine, since */ - /* the new value will be immediately overwritten. */ - /* This variant acquires the allocation lock, and uses a default */ - /* global allocation state. */ - GC_PTR GC_copying_malloc(GC_copy_descriptor); - - /* A variant of the above that does no locking on the fast path, */ - /* and passes an explicit pointer to an allocation state. */ - /* The allocation state is updated. */ - /* There will eventually need to be a macro or inline function version */ - /* of this. */ - GC_PTR GC_copying_malloc2(GC_copy_descriptor, GC_copy_alloc_state *); - - /* Initialize an allocation state so that it can be used for */ - /* allocation. This implicitly reserves a small section of the */ - /* nursery for use with this allocator. */ - void GC_init_copy_alloc_state(GC_copy_alloc_state *); --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/include/gc_pthread_redirects.h gcc-3.1/boehm-gc/include/gc_pthread_redirects.h *** gcc-3.0.4/boehm-gc/include/gc_pthread_redirects.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/gc_pthread_redirects.h Wed Oct 17 04:55:28 2001 *************** *** 0 **** --- 1,67 ---- + /* Our pthread support normally needs to intercept a number of thread */ + /* calls. We arrange to do that here, if appropriate. */ + + #ifndef GC_PTHREAD_REDIRECTS_H + + #define GC_PTHREAD_REDIRECTS_H + + #if defined(GC_SOLARIS_THREADS) + /* We need to intercept calls to many of the threads primitives, so */ + /* that we can locate thread stacks and stop the world. */ + /* Note also that the collector cannot see thread specific data. */ + /* Thread specific data should generally consist of pointers to */ + /* uncollectable objects (allocated with GC_malloc_uncollectable, */ + /* not the system malloc), which are deallocated using the destructor */ + /* facility in thr_keycreate. Alternatively, keep a redundant pointer */ + /* to thread specific data on the thread stack. */ + # include + int GC_thr_create(void *stack_base, size_t stack_size, + void *(*start_routine)(void *), void *arg, long flags, + thread_t *new_thread); + int GC_thr_join(thread_t wait_for, thread_t *departed, void **status); + int GC_thr_suspend(thread_t target_thread); + int GC_thr_continue(thread_t target_thread); + void * GC_dlopen(const char *path, int mode); + # define thr_create GC_thr_create + # define thr_join GC_thr_join + # define thr_suspend GC_thr_suspend + # define thr_continue GC_thr_continue + #endif /* GC_SOLARIS_THREADS */ + + #if defined(GC_SOLARIS_PTHREADS) + # include + # include + extern int GC_pthread_create(pthread_t *new_thread, + const pthread_attr_t *attr, + void * (*thread_execp)(void *), void *arg); + extern int GC_pthread_join(pthread_t wait_for, void **status); + # define pthread_join GC_pthread_join + # define pthread_create GC_pthread_create + #endif + + #if defined(GC_SOLARIS_PTHREADS) || defined(GC_SOLARIS_THREADS) + # define dlopen GC_dlopen + #endif /* SOLARIS_THREADS || SOLARIS_PTHREADS */ + + + #if !defined(GC_USE_LD_WRAP) && defined(GC_PTHREADS) && !defined(GC_SOLARIS_PTHREADS) + /* We treat these similarly. */ + # include + # include + + int GC_pthread_create(pthread_t *new_thread, + const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg); + int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); + int GC_pthread_join(pthread_t thread, void **retval); + int GC_pthread_detach(pthread_t thread); + + # define pthread_create GC_pthread_create + # define pthread_sigmask GC_pthread_sigmask + # define pthread_join GC_pthread_join + # define pthread_detach GC_pthread_detach + # define dlopen GC_dlopen + + #endif /* GC_xxxxx_THREADS */ + + #endif /* GC_PTHREAD_REDIRECTS_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/leak_detector.h gcc-3.1/boehm-gc/include/leak_detector.h *** gcc-3.0.4/boehm-gc/include/leak_detector.h Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/include/leak_detector.h Tue Feb 12 04:37:56 2002 *************** *** 1,7 **** #define GC_DEBUG #include "gc.h" #define malloc(n) GC_MALLOC(n) ! #define calloc(m,n) GC_MALLOC(m*n) #define free(p) GC_FREE(p) ! #define realloc(p,n) GC_REALLOC(n) #define CHECK_LEAKS() GC_gcollect() --- 1,7 ---- #define GC_DEBUG #include "gc.h" #define malloc(n) GC_MALLOC(n) ! #define calloc(m,n) GC_MALLOC((m)*(n)) #define free(p) GC_FREE(p) ! #define realloc(p,n) GC_REALLOC((p),(n)) #define CHECK_LEAKS() GC_gcollect() diff -Nrc3pad gcc-3.0.4/boehm-gc/include/new_gc_alloc.h gcc-3.1/boehm-gc/include/new_gc_alloc.h *** gcc-3.0.4/boehm-gc/include/new_gc_alloc.h Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/include/new_gc_alloc.h Tue Oct 16 09:01:38 2001 *************** *** 20,28 **** // It also doesn't yet understand the new header file names or // namespaces. // ! // This assumes the collector has been compiled with -DATOMIC_UNCOLLECTABLE ! // and -DALL_INTERIOR_POINTERS. We also recommend ! // -DREDIRECT_MALLOC=GC_uncollectable_malloc. // // Some of this could be faster in the explicit deallocation case. // In particular, we spend too much time clearing objects on the --- 20,28 ---- // It also doesn't yet understand the new header file names or // namespaces. // ! // This assumes the collector has been compiled with -DATOMIC_UNCOLLECTABLE. ! // The user should also consider -DREDIRECT_MALLOC=GC_uncollectable_malloc, ! // to ensure that object allocated through malloc are traced. // // Some of this could be faster in the explicit deallocation case. // In particular, we spend too much time clearing objects on the *************** *** 43,53 **** // problems. The argument for changing it is that the usual default // allocator is usually a very bad choice for a garbage collected environment.) // #ifndef GC_ALLOC_H #include "gc.h" ! #include #define GC_ALLOC_H --- 43,69 ---- // problems. The argument for changing it is that the usual default // allocator is usually a very bad choice for a garbage collected environment.) // + // This code assumes that the collector itself has been compiled with a + // compiler that defines __STDC__ . + // #ifndef GC_ALLOC_H #include "gc.h" ! ! #if (__GNUC__ < 3) ! # include // A more portable way to get stl_alloc.h . ! #else ! # include ! # ifndef __STL_BEGIN_NAMESPACE ! # define __STL_BEGIN_NAMESPACE namespace std { ! # define __STL_END_NAMESPACE }; ! # endif ! #ifndef __STL_USE_STD_ALLOCATORS ! #define __STL_USE_STD_ALLOCATORS ! #endif ! #endif ! #define GC_ALLOC_H *************** public: \ *** 337,342 **** --- 353,360 ---- { alloc::ptr_free_deallocate(p, sizeof (T)); } \ }; + __STL_BEGIN_NAMESPACE + __GC_SPECIALIZE(char, gc_alloc) __GC_SPECIALIZE(int, gc_alloc) __GC_SPECIALIZE(unsigned, gc_alloc) *************** __GC_SPECIALIZE(unsigned, single_client_ *** 361,366 **** --- 379,386 ---- __GC_SPECIALIZE(float, single_client_traceable_alloc) __GC_SPECIALIZE(double, single_client_traceable_alloc) + __STL_END_NAMESPACE + #ifdef __STL_USE_STD_ALLOCATORS __STL_BEGIN_NAMESPACE diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/dbg_mlc.h gcc-3.1/boehm-gc/include/private/dbg_mlc.h *** gcc-3.0.4/boehm-gc/include/private/dbg_mlc.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/private/dbg_mlc.h Tue Feb 12 04:37:57 2002 *************** *** 0 **** --- 1,168 ---- + /* + * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers + * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. + * Copyright (c) 1997 by Silicon Graphics. All rights reserved. + * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + + /* + * This is mostly an internal header file. Typical clients should + * not use it. Clients that define their own object kinds with + * debugging allocators will probably want to include this, however. + * No attempt is made to keep the namespace clean. This should not be + * included from header files that are frequently included by clients. + */ + + #ifndef _DBG_MLC_H + + #define _DBG_MLC_H + + # define I_HIDE_POINTERS + # include "gc_priv.h" + # ifdef KEEP_BACK_PTRS + # include "gc_backptr.h" + # endif + + #ifndef HIDE_POINTER + /* Gc.h was previously included, and hence the I_HIDE_POINTERS */ + /* definition had no effect. Repeat the gc.h definitions here to */ + /* get them anyway. */ + typedef GC_word GC_hidden_pointer; + # define HIDE_POINTER(p) (~(GC_hidden_pointer)(p)) + # define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p))) + #endif /* HIDE_POINTER */ + + # define START_FLAG ((word)0xfedcedcb) + # define END_FLAG ((word)0xbcdecdef) + /* Stored both one past the end of user object, and one before */ + /* the end of the object as seen by the allocator. */ + + # if defined(KEEP_BACK_PTRS) || defined(PRINT_BLACK_LIST) \ + || defined(MAKE_BACK_GRAPH) + /* Pointer "source"s that aren't real locations. */ + /* Used in oh_back_ptr fields and as "source" */ + /* argument to some marking functions. */ + # define NOT_MARKED (ptr_t)(0) + # define MARKED_FOR_FINALIZATION (ptr_t)(2) + /* Object was marked because it is finalizable. */ + # define MARKED_FROM_REGISTER (ptr_t)(4) + /* Object was marked from a rgister. Hence the */ + /* source of the reference doesn't have an address. */ + # endif /* KEEP_BACK_PTRS || PRINT_BLACK_LIST */ + + /* Object header */ + typedef struct { + # if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH) + /* We potentially keep two different kinds of back */ + /* pointers. KEEP_BACK_PTRS stores a single back */ + /* pointer in each reachable object to allow reporting */ + /* of why an object was retained. MAKE_BACK_GRAPH */ + /* builds a graph containing the inverse of all */ + /* "points-to" edges including those involving */ + /* objects that have just become unreachable. This */ + /* allows detection of growing chains of unreachable */ + /* objects. It may be possible to eventually combine */ + /* both, but for now we keep them separate. Both */ + /* kinds of back pointers are hidden using the */ + /* following macros. In both cases, the plain version */ + /* is constrained to have an least significant bit of 1,*/ + /* to allow it to be distinguished from a free list */ + /* link. This means the plain version must have an */ + /* lsb of 0. */ + /* Note that blocks dropped by black-listing will */ + /* also have the lsb clear once debugging has */ + /* started. */ + /* We're careful never to overwrite a value with lsb 0. */ + # if ALIGNMENT == 1 + /* Fudge back pointer to be even. */ + # define HIDE_BACK_PTR(p) HIDE_POINTER(~1 & (GC_word)(p)) + # else + # define HIDE_BACK_PTR(p) HIDE_POINTER(p) + # endif + + # ifdef KEEP_BACK_PTRS + GC_hidden_pointer oh_back_ptr; + # endif + # ifdef MAKE_BACK_GRAPH + GC_hidden_pointer oh_bg_ptr; + # endif + # if defined(ALIGN_DOUBLE) && \ + (defined(KEEP_BACK_PTRS) != defined(MAKE_BACK_GRAPH)) + word oh_dummy; + # endif + # endif + GC_CONST char * oh_string; /* object descriptor string */ + word oh_int; /* object descriptor integers */ + # ifdef NEED_CALLINFO + struct callinfo oh_ci[NFRAMES]; + # endif + # ifndef SHORT_DBG_HDRS + word oh_sz; /* Original malloc arg. */ + word oh_sf; /* start flag */ + # endif /* SHORT_DBG_HDRS */ + } oh; + /* The size of the above structure is assumed not to dealign things, */ + /* and to be a multiple of the word length. */ + + #ifdef SHORT_DBG_HDRS + # define DEBUG_BYTES (sizeof (oh)) + #else + /* Add space for END_FLAG, but use any extra space that was already */ + /* added to catch off-the-end pointers. */ + # define DEBUG_BYTES (sizeof (oh) + sizeof (word) - EXTRA_BYTES) + #endif + #define USR_PTR_FROM_BASE(p) ((ptr_t)(p) + sizeof(oh)) + + /* Round bytes to words without adding extra byte at end. */ + #define SIMPLE_ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1) - 1) + + #ifdef SAVE_CALL_CHAIN + # define ADD_CALL_CHAIN(base, ra) GC_save_callers(((oh *)(base)) -> oh_ci) + # define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci) + #else + # ifdef GC_ADD_CALLER + # define ADD_CALL_CHAIN(base, ra) ((oh *)(base)) -> oh_ci[0].ci_pc = (ra) + # define PRINT_CALL_CHAIN(base) GC_print_callers(((oh *)(base)) -> oh_ci) + # else + # define ADD_CALL_CHAIN(base, ra) + # define PRINT_CALL_CHAIN(base) + # endif + #endif + + # ifdef GC_ADD_CALLER + # define OPT_RA ra, + # else + # define OPT_RA + # endif + + + /* Check whether object with base pointer p has debugging info */ + /* p is assumed to point to a legitimate object in our part */ + /* of the heap. */ + #ifdef SHORT_DBG_HDRS + # define GC_has_other_debug_info(p) TRUE + #else + GC_bool GC_has_other_debug_info(/* p */); + #endif + + #if defined(KEEP_BACK_PTRS) || defined(MAKE_BACK_GRAPH) + # define GC_HAS_DEBUG_INFO(p) \ + ((*((word *)p) & 1) && GC_has_other_debug_info(p)) + #else + # define GC_HAS_DEBUG_INFO(p) GC_has_other_debug_info(p) + #endif + + /* Store debugging info into p. Return displaced pointer. */ + /* Assumes we don't hold allocation lock. */ + ptr_t GC_store_debug_info(/* p, sz, string, integer */); + + #endif /* _DBG_MLC_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/gc_hdrs.h gcc-3.1/boehm-gc/include/private/gc_hdrs.h *** gcc-3.0.4/boehm-gc/include/private/gc_hdrs.h Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/include/private/gc_hdrs.h Sat Aug 18 01:04:43 2001 *************** typedef struct hblkhdr hdr; *** 24,29 **** --- 24,38 ---- * The 2 level tree data structure that is used to find block headers. * If there are more than 32 bits in a pointer, the top level is a hash * table. + * + * This defines HDR, GET_HDR, and SET_HDR, the main macros used to + * retrieve and set object headers. + * + * Since 5.0 alpha 5, we can also take advantage of a header lookup + * cache. This is a locally declared direct mapped cache, used inside + * the marker. The HC_GET_HDR macro uses and maintains this + * cache. Assuming we get reasonable hit rates, this shaves a few + * memory references from each pointer validation. */ # if CPP_WORDSZ > 32 *************** typedef struct hblkhdr hdr; *** 45,50 **** --- 54,148 ---- # define TOP_SZ (1 << LOG_TOP_SZ) # define BOTTOM_SZ (1 << LOG_BOTTOM_SZ) + #ifndef SMALL_CONFIG + # define USE_HDR_CACHE + #endif + + /* #define COUNT_HDR_CACHE_HITS */ + + extern hdr * GC_invalid_header; /* header for an imaginary block */ + /* containing no objects. */ + + + /* Check whether p and corresponding hhdr point to long or invalid */ + /* object. If so, advance hhdr to */ + /* beginning of block, or set hhdr to GC_invalid_header. */ + #define ADVANCE(p, hhdr, source) \ + { \ + hdr * new_hdr = GC_invalid_header; \ + p = GC_FIND_START(p, hhdr, &new_hdr, (word)source); \ + hhdr = new_hdr; \ + } + + #ifdef USE_HDR_CACHE + + # ifdef COUNT_HDR_CACHE_HITS + extern word GC_hdr_cache_hits; + extern word GC_hdr_cache_misses; + # define HC_HIT() ++GC_hdr_cache_hits + # define HC_MISS() ++GC_hdr_cache_misses + # else + # define HC_HIT() + # define HC_MISS() + # endif + + typedef struct hce { + word block_addr; /* right shifted by LOG_HBLKSIZE */ + hdr * hce_hdr; + } hdr_cache_entry; + + # define HDR_CACHE_SIZE 8 /* power of 2 */ + + # define DECLARE_HDR_CACHE \ + hdr_cache_entry hdr_cache[HDR_CACHE_SIZE] + + # define INIT_HDR_CACHE BZERO(hdr_cache, sizeof(hdr_cache)); + + # define HCE(h) hdr_cache + (((word)(h) >> LOG_HBLKSIZE) & (HDR_CACHE_SIZE-1)) + + # define HCE_VALID_FOR(hce,h) ((hce) -> block_addr == \ + ((word)(h) >> LOG_HBLKSIZE)) + + # define HCE_HDR(h) ((hce) -> hce_hdr) + + + /* Analogous to GET_HDR, except that in the case of large objects, it */ + /* Returns the header for the object beginning, and updates p. */ + /* Returns &GC_bad_header instead of 0. All of this saves a branch */ + /* in the fast path. */ + # define HC_GET_HDR(p, hhdr, source) \ + { \ + hdr_cache_entry * hce = HCE(p); \ + if (HCE_VALID_FOR(hce, p)) { \ + HC_HIT(); \ + hhdr = hce -> hce_hdr; \ + } else { \ + HC_MISS(); \ + GET_HDR(p, hhdr); \ + if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { \ + ADVANCE(p, hhdr, source); \ + } else { \ + hce -> block_addr = (word)(p) >> LOG_HBLKSIZE; \ + hce -> hce_hdr = hhdr; \ + } \ + } \ + } + + #else /* !USE_HDR_CACHE */ + + # define DECLARE_HDR_CACHE + + # define INIT_HDR_CACHE + + # define HC_GET_HDR(p, hhdr, source) \ + { \ + GET_HDR(p, hhdr); \ + if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { \ + ADVANCE(p, hhdr, source); \ + } \ + } + #endif + typedef struct bi { hdr * index[BOTTOM_SZ]; /* diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/gc_locks.h gcc-3.1/boehm-gc/include/private/gc_locks.h *** gcc-3.0.4/boehm-gc/include/private/gc_locks.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/private/gc_locks.h Tue Oct 16 09:01:39 2001 *************** *** 0 **** --- 1,481 ---- + /* + * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers + * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. + * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. + * + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + + #ifndef GC_LOCKS_H + #define GC_LOCKS_H + + /* + * Mutual exclusion between allocator/collector routines. + * Needed if there is more than one allocator thread. + * FASTLOCK() is assumed to try to acquire the lock in a cheap and + * dirty way that is acceptable for a few instructions, e.g. by + * inhibiting preemption. This is assumed to have succeeded only + * if a subsequent call to FASTLOCK_SUCCEEDED() returns TRUE. + * FASTUNLOCK() is called whether or not FASTLOCK_SUCCEEDED(). + * If signals cannot be tolerated with the FASTLOCK held, then + * FASTLOCK should disable signals. The code executed under + * FASTLOCK is otherwise immune to interruption, provided it is + * not restarted. + * DCL_LOCK_STATE declares any local variables needed by LOCK and UNLOCK + * and/or DISABLE_SIGNALS and ENABLE_SIGNALS and/or FASTLOCK. + * (There is currently no equivalent for FASTLOCK.) + * + * In the PARALLEL_MARK case, we also need to define a number of + * other inline finctions here: + * GC_bool GC_compare_and_exchange( volatile GC_word *addr, + * GC_word old, GC_word new ) + * GC_word GC_atomic_add( volatile GC_word *addr, GC_word how_much ) + * void GC_memory_barrier( ) + * + */ + # ifdef THREADS + void GC_noop1 GC_PROTO((word)); + # ifdef PCR_OBSOLETE /* Faster, but broken with multiple lwp's */ + # include "th/PCR_Th.h" + # include "th/PCR_ThCrSec.h" + extern struct PCR_Th_MLRep GC_allocate_ml; + # define DCL_LOCK_STATE PCR_sigset_t GC_old_sig_mask + # define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml) + # define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) + # define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) + # define FASTLOCK() PCR_ThCrSec_EnterSys() + /* Here we cheat (a lot): */ + # define FASTLOCK_SUCCEEDED() (*(int *)(&GC_allocate_ml) == 0) + /* TRUE if nobody currently holds the lock */ + # define FASTUNLOCK() PCR_ThCrSec_ExitSys() + # endif + # ifdef PCR + # include + # include + extern PCR_Th_ML GC_allocate_ml; + # define DCL_LOCK_STATE \ + PCR_ERes GC_fastLockRes; PCR_sigset_t GC_old_sig_mask + # define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml) + # define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) + # define FASTLOCK() (GC_fastLockRes = PCR_Th_ML_Try(&GC_allocate_ml)) + # define FASTLOCK_SUCCEEDED() (GC_fastLockRes == PCR_ERes_okay) + # define FASTUNLOCK() {\ + if( FASTLOCK_SUCCEEDED() ) PCR_Th_ML_Release(&GC_allocate_ml); } + # endif + # ifdef SRC_M3 + extern GC_word RT0u__inCritical; + # define LOCK() RT0u__inCritical++ + # define UNLOCK() RT0u__inCritical-- + # endif + # ifdef GC_SOLARIS_THREADS + # include + # include + extern mutex_t GC_allocate_ml; + # define LOCK() mutex_lock(&GC_allocate_ml); + # define UNLOCK() mutex_unlock(&GC_allocate_ml); + # endif + + /* Try to define GC_TEST_AND_SET and a matching GC_CLEAR for spin lock */ + /* acquisition and release. We need this for correct operation of the */ + /* incremental GC. */ + # ifdef __GNUC__ + # if defined(I386) + inline static int GC_test_and_set(volatile unsigned int *addr) { + int oldval; + /* Note: the "xchg" instruction does not need a "lock" prefix */ + __asm__ __volatile__("xchgl %0, %1" + : "=r"(oldval), "=m"(*(addr)) + : "0"(1), "m"(*(addr)) : "memory"); + return oldval; + } + # define GC_TEST_AND_SET_DEFINED + # endif + # if defined(IA64) + inline static int GC_test_and_set(volatile unsigned int *addr) { + long oldval, n = 1; + __asm__ __volatile__("xchg4 %0=%1,%2" + : "=r"(oldval), "=m"(*addr) + : "r"(n), "1"(*addr) : "memory"); + return oldval; + } + # define GC_TEST_AND_SET_DEFINED + /* Should this handle post-increment addressing?? */ + inline static void GC_clear(volatile unsigned int *addr) { + __asm__ __volatile__("st4.rel %0=r0" : "=m" (*addr) : : "memory"); + } + # define GC_CLEAR_DEFINED + # endif + # ifdef SPARC + inline static int GC_test_and_set(volatile unsigned int *addr) { + int oldval; + + __asm__ __volatile__("ldstub %1,%0" + : "=r"(oldval), "=m"(*addr) + : "m"(*addr) : "memory"); + return oldval; + } + # define GC_TEST_AND_SET_DEFINED + # endif + # ifdef M68K + /* Contributed by Tony Mantler. I'm not sure how well it was */ + /* tested. */ + inline static int GC_test_and_set(volatile unsigned int *addr) { + char oldval; /* this must be no longer than 8 bits */ + + /* The return value is semi-phony. */ + /* 'tas' sets bit 7 while the return */ + /* value pretends bit 0 was set */ + __asm__ __volatile__( + "tas %1@; sne %0; negb %0" + : "=d" (oldval) + : "a" (addr) : "memory"); + return oldval; + } + # define GC_TEST_AND_SET_DEFINED + # endif + # if defined(POWERPC) + inline static int GC_test_and_set(volatile unsigned int *addr) { + int oldval; + int temp = 1; // locked value + + __asm__ __volatile__( + "1:\tlwarx %0,0,%3\n" // load and reserve + "\tcmpwi %0, 0\n" // if load is + "\tbne 2f\n" // non-zero, return already set + "\tstwcx. %2,0,%1\n" // else store conditional + "\tbne- 1b\n" // retry if lost reservation + "2:\t\n" // oldval is zero if we set + : "=&r"(oldval), "=p"(addr) + : "r"(temp), "1"(addr) + : "memory"); + return (int)oldval; + } + # define GC_TEST_AND_SET_DEFINED + inline static void GC_clear(volatile unsigned int *addr) { + __asm__ __volatile__("eieio" ::: "memory"); + *(addr) = 0; + } + # define GC_CLEAR_DEFINED + # endif + # if defined(ALPHA) + inline static int GC_test_and_set(volatile unsigned int * addr) + { + unsigned long oldvalue; + unsigned long temp; + + __asm__ __volatile__( + "1: ldl_l %0,%1\n" + " and %0,%3,%2\n" + " bne %2,2f\n" + " xor %0,%3,%0\n" + " stl_c %0,%1\n" + " beq %0,3f\n" + " mb\n" + "2:\n" + ".section .text2,\"ax\"\n" + "3: br 1b\n" + ".previous" + :"=&r" (temp), "=m" (*addr), "=&r" (oldvalue) + :"Ir" (1), "m" (*addr) + :"memory"); + + return oldvalue; + } + # define GC_TEST_AND_SET_DEFINED + /* Should probably also define GC_clear, since it needs */ + /* a memory barrier ?? */ + # endif /* ALPHA */ + # ifdef ARM32 + inline static int GC_test_and_set(volatile unsigned int *addr) { + int oldval; + /* SWP on ARM is very similar to XCHG on x86. Doesn't lock the + * bus because there are no SMP ARM machines. If/when there are, + * this code will likely need to be updated. */ + /* See linuxthreads/sysdeps/arm/pt-machine.h in glibc-2.1 */ + __asm__ __volatile__("swp %0, %1, [%2]" + : "=r"(oldval) + : "r"(1), "r"(addr) + : "memory"); + return oldval; + } + # define GC_TEST_AND_SET_DEFINED + # endif /* ARM32 */ + # endif /* __GNUC__ */ + # if (defined(ALPHA) && !defined(__GNUC__)) + # define GC_test_and_set(addr) __cxx_test_and_set_atomic(addr, 1) + # define GC_TEST_AND_SET_DEFINED + # endif + # if defined(MSWIN32) + # define GC_test_and_set(addr) InterlockedExchange((LPLONG)addr,1) + # define GC_TEST_AND_SET_DEFINED + # endif + # ifdef MIPS + # if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64)) \ + || !defined(_COMPILER_VERSION) || _COMPILER_VERSION < 700 + # define GC_test_and_set(addr, v) test_and_set(addr,v) + # else + # define GC_test_and_set(addr, v) __test_and_set(addr,v) + # define GC_clear(addr) __lock_release(addr); + # define GC_CLEAR_DEFINED + # endif + # define GC_TEST_AND_SET_DEFINED + # endif /* MIPS */ + # if 0 /* defined(HP_PA) */ + /* The official recommendation seems to be to not use ldcw from */ + /* user mode. Since multithreaded incremental collection doesn't */ + /* work anyway on HP_PA, this shouldn't be a major loss. */ + + /* "set" means 0 and "clear" means 1 here. */ + # define GC_test_and_set(addr) !GC_test_and_clear(addr); + # define GC_TEST_AND_SET_DEFINED + # define GC_clear(addr) GC_noop1((word)(addr)); *(volatile unsigned int *)addr = 1; + /* The above needs a memory barrier! */ + # define GC_CLEAR_DEFINED + # endif + # if defined(GC_TEST_AND_SET_DEFINED) && !defined(GC_CLEAR_DEFINED) + # ifdef __GNUC__ + inline static void GC_clear(volatile unsigned int *addr) { + /* Try to discourage gcc from moving anything past this. */ + __asm__ __volatile__(" " : : : "memory"); + *(addr) = 0; + } + # else + /* The function call in the following should prevent the */ + /* compiler from moving assignments to below the UNLOCK. */ + # define GC_clear(addr) GC_noop1((word)(addr)); \ + *((volatile unsigned int *)(addr)) = 0; + # endif + # define GC_CLEAR_DEFINED + # endif /* !GC_CLEAR_DEFINED */ + + # if !defined(GC_TEST_AND_SET_DEFINED) + # define USE_PTHREAD_LOCKS + # endif + + # if defined(GC_PTHREADS) && !defined(GC_SOLARIS_THREADS) \ + && !defined(GC_IRIX_THREADS) + # define NO_THREAD (pthread_t)(-1) + # include + # if defined(PARALLEL_MARK) + /* We need compare-and-swap to update mark bits, where it's */ + /* performance critical. If USE_MARK_BYTES is defined, it is */ + /* no longer needed for this purpose. However we use it in */ + /* either case to implement atomic fetch-and-add, though that's */ + /* less performance critical, and could perhaps be done with */ + /* a lock. */ + # if defined(GENERIC_COMPARE_AND_SWAP) + /* Probably not useful, except for debugging. */ + /* We do use GENERIC_COMPARE_AND_SWAP on PA_RISC, but we */ + /* minimize its use. */ + extern pthread_mutex_t GC_compare_and_swap_lock; + + /* Note that if GC_word updates are not atomic, a concurrent */ + /* reader should acquire GC_compare_and_swap_lock. On */ + /* currently supported platforms, such updates are atomic. */ + extern GC_bool GC_compare_and_exchange(volatile GC_word *addr, + GC_word old, GC_word new_val); + # endif /* GENERIC_COMPARE_AND_SWAP */ + # if defined(I386) + # if !defined(GENERIC_COMPARE_AND_SWAP) + /* Returns TRUE if the comparison succeeded. */ + inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr, + GC_word old, + GC_word new_val) + { + char result; + __asm__ __volatile__("lock; cmpxchgl %2, %0; setz %1" + : "=m"(*(addr)), "=r"(result) + : "r" (new_val), "0"(*(addr)), "a"(old) : "memory"); + return (GC_bool) result; + } + # endif /* !GENERIC_COMPARE_AND_SWAP */ + inline static void GC_memory_write_barrier() + { + /* We believe the processor ensures at least processor */ + /* consistent ordering. Thus a compiler barrier */ + /* should suffice. */ + __asm__ __volatile__("" : : : "memory"); + } + # endif /* I386 */ + # if defined(IA64) + # if !defined(GENERIC_COMPARE_AND_SWAP) + inline static GC_bool GC_compare_and_exchange(volatile GC_word *addr, + GC_word old, GC_word new_val) + { + unsigned long oldval; + __asm__ __volatile__("mov ar.ccv=%4 ;; cmpxchg8.rel %0=%1,%2,ar.ccv" + : "=r"(oldval), "=m"(*addr) + : "r"(new_val), "1"(*addr), "r"(old) : "memory"); + return (oldval == old); + } + # endif /* !GENERIC_COMPARE_AND_SWAP */ + # if 0 + /* Shouldn't be needed; we use volatile stores instead. */ + inline static void GC_memory_write_barrier() + { + __asm__ __volatile__("mf" : : : "memory"); + } + # endif /* 0 */ + # endif /* IA64 */ + # if !defined(GENERIC_COMPARE_AND_SWAP) + /* Returns the original value of *addr. */ + inline static GC_word GC_atomic_add(volatile GC_word *addr, + GC_word how_much) + { + GC_word old; + do { + old = *addr; + } while (!GC_compare_and_exchange(addr, old, old+how_much)); + return old; + } + # else /* GENERIC_COMPARE_AND_SWAP */ + /* So long as a GC_word can be atomically updated, it should */ + /* be OK to read *addr without a lock. */ + extern GC_word GC_atomic_add(volatile GC_word *addr, GC_word how_much); + # endif /* GENERIC_COMPARE_AND_SWAP */ + + # endif /* PARALLEL_MARK */ + + # if !defined(THREAD_LOCAL_ALLOC) && !defined(USE_PTHREAD_LOCKS) + /* In the THREAD_LOCAL_ALLOC case, the allocation lock tends to */ + /* be held for long periods, if it is held at all. Thus spinning */ + /* and sleeping for fixed periods are likely to result in */ + /* significant wasted time. We thus rely mostly on queued locks. */ + # define USE_SPIN_LOCK + extern volatile unsigned int GC_allocate_lock; + extern void GC_lock(void); + /* Allocation lock holder. Only set if acquired by client through */ + /* GC_call_with_alloc_lock. */ + # ifdef GC_ASSERTIONS + # define LOCK() \ + { if (GC_test_and_set(&GC_allocate_lock)) GC_lock(); \ + SET_LOCK_HOLDER(); } + # define UNLOCK() \ + { GC_ASSERT(I_HOLD_LOCK()); UNSET_LOCK_HOLDER(); \ + GC_clear(&GC_allocate_lock); } + # else + # define LOCK() \ + { if (GC_test_and_set(&GC_allocate_lock)) GC_lock(); } + # define UNLOCK() \ + GC_clear(&GC_allocate_lock) + # endif /* !GC_ASSERTIONS */ + # if 0 + /* Another alternative for OSF1 might be: */ + # include + extern msemaphore GC_allocate_semaphore; + # define LOCK() { if (msem_lock(&GC_allocate_semaphore, MSEM_IF_NOWAIT) \ + != 0) GC_lock(); else GC_allocate_lock = 1; } + /* The following is INCORRECT, since the memory model is too weak. */ + /* Is this true? Presumably msem_unlock has the right semantics? */ + /* - HB */ + # define UNLOCK() { GC_allocate_lock = 0; \ + msem_unlock(&GC_allocate_semaphore, 0); } + # endif /* 0 */ + # else /* THREAD_LOCAL_ALLOC || USE_PTHREAD_LOCKS */ + # ifndef USE_PTHREAD_LOCKS + # define USE_PTHREAD_LOCKS + # endif + # endif /* THREAD_LOCAL_ALLOC */ + # ifdef USE_PTHREAD_LOCKS + # include + extern pthread_mutex_t GC_allocate_ml; + # ifdef GC_ASSERTIONS + # define LOCK() \ + { GC_lock(); \ + SET_LOCK_HOLDER(); } + # define UNLOCK() \ + { GC_ASSERT(I_HOLD_LOCK()); UNSET_LOCK_HOLDER(); \ + pthread_mutex_unlock(&GC_allocate_ml); } + # else /* !GC_ASSERTIONS */ + # define LOCK() \ + { if (0 != pthread_mutex_trylock(&GC_allocate_ml)) GC_lock(); } + # define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml) + # endif /* !GC_ASSERTIONS */ + # endif /* USE_PTHREAD_LOCKS */ + # define SET_LOCK_HOLDER() GC_lock_holder = pthread_self() + # define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD + # define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self())) + extern VOLATILE GC_bool GC_collecting; + # define ENTER_GC() GC_collecting = 1; + # define EXIT_GC() GC_collecting = 0; + extern void GC_lock(void); + extern pthread_t GC_lock_holder; + # ifdef GC_ASSERTIONS + extern pthread_t GC_mark_lock_holder; + # endif + # endif /* GC_PTHREADS with linux_threads.c implementation */ + # if defined(GC_IRIX_THREADS) + # include + /* This probably should never be included, but I can't test */ + /* on Irix anymore. */ + # include + + extern unsigned long GC_allocate_lock; + /* This is not a mutex because mutexes that obey the (optional) */ + /* POSIX scheduling rules are subject to convoys in high contention */ + /* applications. This is basically a spin lock. */ + extern pthread_t GC_lock_holder; + extern void GC_lock(void); + /* Allocation lock holder. Only set if acquired by client through */ + /* GC_call_with_alloc_lock. */ + # define SET_LOCK_HOLDER() GC_lock_holder = pthread_self() + # define NO_THREAD (pthread_t)(-1) + # define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD + # define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self())) + # define LOCK() { if (GC_test_and_set(&GC_allocate_lock, 1)) GC_lock(); } + # define UNLOCK() GC_clear(&GC_allocate_lock); + extern VOLATILE GC_bool GC_collecting; + # define ENTER_GC() \ + { \ + GC_collecting = 1; \ + } + # define EXIT_GC() GC_collecting = 0; + # endif /* GC_IRIX_THREADS */ + # ifdef GC_WIN32_THREADS + # include + GC_API CRITICAL_SECTION GC_allocate_ml; + # define LOCK() EnterCriticalSection(&GC_allocate_ml); + # define UNLOCK() LeaveCriticalSection(&GC_allocate_ml); + # endif + # ifndef SET_LOCK_HOLDER + # define SET_LOCK_HOLDER() + # define UNSET_LOCK_HOLDER() + # define I_HOLD_LOCK() FALSE + /* Used on platforms were locks can be reacquired, */ + /* so it doesn't matter if we lie. */ + # endif + # else /* !THREADS */ + # define LOCK() + # define UNLOCK() + # endif /* !THREADS */ + # ifndef SET_LOCK_HOLDER + # define SET_LOCK_HOLDER() + # define UNSET_LOCK_HOLDER() + # define I_HOLD_LOCK() FALSE + /* Used on platforms were locks can be reacquired, */ + /* so it doesn't matter if we lie. */ + # endif + # ifndef ENTER_GC + # define ENTER_GC() + # define EXIT_GC() + # endif + + # ifndef DCL_LOCK_STATE + # define DCL_LOCK_STATE + # endif + # ifndef FASTLOCK + # define FASTLOCK() LOCK() + # define FASTLOCK_SUCCEEDED() TRUE + # define FASTUNLOCK() UNLOCK() + # endif + + #endif /* GC_LOCKS_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/gc_pmark.h gcc-3.1/boehm-gc/include/private/gc_pmark.h *** gcc-3.0.4/boehm-gc/include/private/gc_pmark.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/private/gc_pmark.h Tue Feb 12 04:37:57 2002 *************** *** 0 **** --- 1,388 ---- + /* + * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 2001 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + * + */ + + /* Private declarations of GC marker data structures and macros */ + + /* + * Declarations of mark stack. Needed by marker and client supplied mark + * routines. Transitively include gc_priv.h. + * (Note that gc_priv.h should not be included before this, since this + * includes dbg_mlc.h, which wants to include gc_priv.h AFTER defining + * I_HIDE_POINTERS.) + */ + #ifndef GC_PMARK_H + # define GC_PMARK_H + + # if defined(KEEP_BACK_PTRS) || defined(PRINT_BLACK_LIST) + # include "dbg_mlc.h" + # endif + # ifndef GC_MARK_H + # include "../gc_mark.h" + # endif + # ifndef GC_PRIVATE_H + # include "gc_priv.h" + # endif + + /* The real declarations of the following is in gc_priv.h, so that */ + /* we can avoid scanning the following table. */ + /* + extern mark_proc GC_mark_procs[MAX_MARK_PROCS]; + */ + + /* + * Mark descriptor stuff that should remain private for now, mostly + * because it's hard to export WORDSZ without including gcconfig.h. + */ + # define BITMAP_BITS (WORDSZ - GC_DS_TAG_BITS) + # define PROC(descr) \ + (GC_mark_procs[((descr) >> GC_DS_TAG_BITS) & (GC_MAX_MARK_PROCS-1)]) + # define ENV(descr) \ + ((descr) >> (GC_DS_TAG_BITS + GC_LOG_MAX_MARK_PROCS)) + # define MAX_ENV \ + (((word)1 << (WORDSZ - GC_DS_TAG_BITS - GC_LOG_MAX_MARK_PROCS)) - 1) + + + extern word GC_n_mark_procs; + + /* Number of mark stack entries to discard on overflow. */ + #define GC_MARK_STACK_DISCARDS (INITIAL_MARK_STACK_SIZE/8) + + typedef struct GC_ms_entry { + GC_word * mse_start; /* First word of object */ + GC_word mse_descr; /* Descriptor; low order two bits are tags, */ + /* identifying the upper 30 bits as one of the */ + /* following: */ + } mse; + + extern word GC_mark_stack_size; + + extern mse * GC_mark_stack_limit; + + #ifdef PARALLEL_MARK + extern mse * VOLATILE GC_mark_stack_top; + #else + extern mse * GC_mark_stack_top; + #endif + + extern mse * GC_mark_stack; + + #ifdef PARALLEL_MARK + /* + * Allow multiple threads to participate in the marking process. + * This works roughly as follows: + * The main mark stack never shrinks, but it can grow. + * + * The initiating threads holds the GC lock, and sets GC_help_wanted. + * + * Other threads: + * 1) update helper_count (while holding mark_lock.) + * 2) allocate a local mark stack + * repeatedly: + * 3) Steal a global mark stack entry by atomically replacing + * its descriptor with 0. + * 4) Copy it to the local stack. + * 5) Mark on the local stack until it is empty, or + * it may be profitable to copy it back. + * 6) If necessary, copy local stack to global one, + * holding mark lock. + * 7) Stop when the global mark stack is empty. + * 8) decrement helper_count (holding mark_lock). + * + * This is an experiment to see if we can do something along the lines + * of the University of Tokyo SGC in a less intrusive, though probably + * also less performant, way. + */ + void GC_do_parallel_mark(); + /* inititate parallel marking. */ + + extern GC_bool GC_help_wanted; /* Protected by mark lock */ + extern unsigned GC_helper_count; /* Number of running helpers. */ + /* Protected by mark lock */ + extern unsigned GC_active_count; /* Number of active helpers. */ + /* Protected by mark lock */ + /* May increase and decrease */ + /* within each mark cycle. But */ + /* once it returns to 0, it */ + /* stays zero for the cycle. */ + /* GC_mark_stack_top is also protected by mark lock. */ + extern mse * VOLATILE GC_first_nonempty; + /* Lowest entry on mark stack */ + /* that may be nonempty. */ + /* Updated only by initiating */ + /* thread. */ + /* + * GC_notify_all_marker() is used when GC_help_wanted is first set, + * when the last helper becomes inactive, + * when something is added to the global mark stack, and just after + * GC_mark_no is incremented. + * This could be split into multiple CVs (and probably should be to + * scale to really large numbers of processors.) + */ + #endif /* PARALLEL_MARK */ + + /* Return a pointer to within 1st page of object. */ + /* Set *new_hdr_p to corr. hdr. */ + #ifdef __STDC__ + # ifdef PRINT_BLACK_LIST + ptr_t GC_find_start(ptr_t current, hdr *hhdr, hdr **new_hdr_p, + ptr_t source); + # else + ptr_t GC_find_start(ptr_t current, hdr *hhdr, hdr **new_hdr_p); + # endif + #else + ptr_t GC_find_start(); + #endif + + mse *GC_signal_mark_stack_overflow(mse *msp); + + # ifdef GATHERSTATS + # define ADD_TO_ATOMIC(sz) GC_atomic_in_use += (sz) + # define ADD_TO_COMPOSITE(sz) GC_composite_in_use += (sz) + # else + # define ADD_TO_ATOMIC(sz) + # define ADD_TO_COMPOSITE(sz) + # endif + + /* Push the object obj with corresponding heap block header hhdr onto */ + /* the mark stack. */ + # define PUSH_OBJ(obj, hhdr, mark_stack_top, mark_stack_limit) \ + { \ + register word _descr = (hhdr) -> hb_descr; \ + \ + if (_descr == 0) { \ + ADD_TO_ATOMIC((hhdr) -> hb_sz); \ + } else { \ + ADD_TO_COMPOSITE((hhdr) -> hb_sz); \ + mark_stack_top++; \ + if (mark_stack_top >= mark_stack_limit) { \ + mark_stack_top = GC_signal_mark_stack_overflow(mark_stack_top); \ + } \ + mark_stack_top -> mse_start = (obj); \ + mark_stack_top -> mse_descr = _descr; \ + } \ + } + + #ifdef PRINT_BLACK_LIST + # define GC_FIND_START(current, hhdr, new_hdr_p, source) \ + GC_find_start(current, hhdr, new_hdr_p, source) + #else + # define GC_FIND_START(current, hhdr, new_hdr_p, source) \ + GC_find_start(current, hhdr, new_hdr_p) + #endif + + /* Push the contents of current onto the mark stack if it is a valid */ + /* ptr to a currently unmarked object. Mark it. */ + /* If we assumed a standard-conforming compiler, we could probably */ + /* generate the exit_label transparently. */ + # define PUSH_CONTENTS(current, mark_stack_top, mark_stack_limit, \ + source, exit_label) \ + { \ + hdr * my_hhdr; \ + ptr_t my_current = current; \ + \ + GET_HDR(my_current, my_hhdr); \ + if (IS_FORWARDING_ADDR_OR_NIL(my_hhdr)) { \ + hdr * new_hdr = GC_invalid_header; \ + my_current = GC_FIND_START(my_current, my_hhdr, \ + &new_hdr, (word)source); \ + my_hhdr = new_hdr; \ + } \ + PUSH_CONTENTS_HDR(my_current, mark_stack_top, mark_stack_limit, \ + source, exit_label, my_hhdr); \ + exit_label: ; \ + } + + /* As above, but use header cache for header lookup. */ + # define HC_PUSH_CONTENTS(current, mark_stack_top, mark_stack_limit, \ + source, exit_label) \ + { \ + hdr * my_hhdr; \ + ptr_t my_current = current; \ + \ + HC_GET_HDR(my_current, my_hhdr, source); \ + PUSH_CONTENTS_HDR(my_current, mark_stack_top, mark_stack_limit, \ + source, exit_label, my_hhdr); \ + exit_label: ; \ + } + + /* Set mark bit, exit if it was already set. */ + + # ifdef USE_MARK_BYTES + /* Unlike the mark bit case, there is a race here, and we may set */ + /* the bit twice in the concurrent case. This can result in the */ + /* object being pushed twice. But that's only a performance issue. */ + # define SET_MARK_BIT_EXIT_IF_SET(hhdr,displ,exit_label) \ + { \ + register VOLATILE char * mark_byte_addr = \ + hhdr -> hb_marks + ((displ) >> 1); \ + register char mark_byte = *mark_byte_addr; \ + \ + if (mark_byte) goto exit_label; \ + *mark_byte_addr = 1; \ + } + # else + # define SET_MARK_BIT_EXIT_IF_SET(hhdr,displ,exit_label) \ + { \ + register word * mark_word_addr = hhdr -> hb_marks + divWORDSZ(displ); \ + \ + OR_WORD_EXIT_IF_SET(mark_word_addr, (word)1 << modWORDSZ(displ), \ + exit_label); \ + } + # endif /* USE_MARK_BYTES */ + + /* If the mark bit corresponding to current is not set, set it, and */ + /* push the contents of the object on the mark stack. For a small */ + /* object we assume that current is the (possibly interior) pointer */ + /* to the object. For large objects we assume that current points */ + /* to somewhere inside the first page of the object. If */ + /* GC_all_interior_pointers is set, it may have been previously */ + /* adjusted to make that true. */ + # define PUSH_CONTENTS_HDR(current, mark_stack_top, mark_stack_limit, \ + source, exit_label, hhdr) \ + { \ + int displ; /* Displacement in block; first bytes, then words */ \ + int map_entry; \ + \ + displ = HBLKDISPL(current); \ + map_entry = MAP_ENTRY((hhdr -> hb_map), displ); \ + displ = BYTES_TO_WORDS(displ); \ + if (map_entry > CPP_MAX_OFFSET) { \ + if (map_entry == OFFSET_TOO_BIG) { \ + map_entry = displ % (hhdr -> hb_sz); \ + displ -= map_entry; \ + if (displ + (hhdr -> hb_sz) > BYTES_TO_WORDS(HBLKSIZE)) { \ + GC_ADD_TO_BLACK_LIST_NORMAL((word)current, source); \ + goto exit_label; \ + } \ + } else { \ + GC_ADD_TO_BLACK_LIST_NORMAL((word)current, source); goto exit_label; \ + } \ + } else { \ + displ -= map_entry; \ + } \ + GC_ASSERT(displ >= 0 && displ < MARK_BITS_PER_HBLK); \ + SET_MARK_BIT_EXIT_IF_SET(hhdr, displ, exit_label); \ + GC_STORE_BACK_PTR((ptr_t)source, (ptr_t)HBLKPTR(current) \ + + WORDS_TO_BYTES(displ)); \ + PUSH_OBJ(((word *)(HBLKPTR(current)) + displ), hhdr, \ + mark_stack_top, mark_stack_limit) \ + } + + #if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS) + # define PUSH_ONE_CHECKED_STACK(p, source) \ + GC_mark_and_push_stack(p, (ptr_t)(source)) + #else + # define PUSH_ONE_CHECKED_STACK(p, source) \ + GC_mark_and_push_stack(p) + #endif + + /* + * Push a single value onto mark stack. Mark from the object pointed to by p. + * P is considered valid even if it is an interior pointer. + * Previously marked objects are not pushed. Hence we make progress even + * if the mark stack overflows. + */ + # define GC_PUSH_ONE_STACK(p, source) \ + if ((ptr_t)(p) >= (ptr_t)GC_least_plausible_heap_addr \ + && (ptr_t)(p) < (ptr_t)GC_greatest_plausible_heap_addr) { \ + PUSH_ONE_CHECKED_STACK(p, source); \ + } + + /* + * As above, but interior pointer recognition as for + * normal for heap pointers. + */ + # define GC_PUSH_ONE_HEAP(p,source) \ + if ((ptr_t)(p) >= (ptr_t)GC_least_plausible_heap_addr \ + && (ptr_t)(p) < (ptr_t)GC_greatest_plausible_heap_addr) { \ + GC_mark_stack_top = GC_mark_and_push( \ + (GC_PTR)(p), GC_mark_stack_top, \ + GC_mark_stack_limit, (GC_PTR *)(source)); \ + } + + /* Mark starting at mark stack entry top (incl.) down to */ + /* mark stack entry bottom (incl.). Stop after performing */ + /* about one page worth of work. Return the new mark stack */ + /* top entry. */ + mse * GC_mark_from GC_PROTO((mse * top, mse * bottom, mse *limit)); + + #define MARK_FROM_MARK_STACK() \ + GC_mark_stack_top = GC_mark_from(GC_mark_stack_top, \ + GC_mark_stack, \ + GC_mark_stack + GC_mark_stack_size); + + /* + * Mark from one finalizable object using the specified + * mark proc. May not mark the object pointed to by + * real_ptr. That is the job of the caller, if appropriate + */ + # define GC_MARK_FO(real_ptr, mark_proc) \ + { \ + (*(mark_proc))(real_ptr); \ + while (!GC_mark_stack_empty()) MARK_FROM_MARK_STACK(); \ + if (GC_mark_state != MS_NONE) { \ + GC_set_mark_bit(real_ptr); \ + while (!GC_mark_some((ptr_t)0)) {} \ + } \ + } + + extern GC_bool GC_mark_stack_too_small; + /* We need a larger mark stack. May be */ + /* set by client supplied mark routines.*/ + + typedef int mark_state_t; /* Current state of marking, as follows:*/ + /* Used to remember where we are during */ + /* concurrent marking. */ + + /* We say something is dirty if it was */ + /* written since the last time we */ + /* retrieved dirty bits. We say it's */ + /* grungy if it was marked dirty in the */ + /* last set of bits we retrieved. */ + + /* Invariant I: all roots and marked */ + /* objects p are either dirty, or point */ + /* to objects q that are either marked */ + /* or a pointer to q appears in a range */ + /* on the mark stack. */ + + # define MS_NONE 0 /* No marking in progress. I holds. */ + /* Mark stack is empty. */ + + # define MS_PUSH_RESCUERS 1 /* Rescuing objects are currently */ + /* being pushed. I holds, except */ + /* that grungy roots may point to */ + /* unmarked objects, as may marked */ + /* grungy objects above scan_ptr. */ + + # define MS_PUSH_UNCOLLECTABLE 2 + /* I holds, except that marked */ + /* uncollectable objects above scan_ptr */ + /* may point to unmarked objects. */ + /* Roots may point to unmarked objects */ + + # define MS_ROOTS_PUSHED 3 /* I holds, mark stack may be nonempty */ + + # define MS_PARTIALLY_INVALID 4 /* I may not hold, e.g. because of M.S. */ + /* overflow. However marked heap */ + /* objects below scan_ptr point to */ + /* marked or stacked objects. */ + + # define MS_INVALID 5 /* I may not hold. */ + + extern mark_state_t GC_mark_state; + + #endif /* GC_PMARK_H */ + diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/gc_priv.h gcc-3.1/boehm-gc/include/private/gc_priv.h *** gcc-3.0.4/boehm-gc/include/private/gc_priv.h Sat May 6 23:59:01 2000 --- gcc-3.1/boehm-gc/include/private/gc_priv.h Tue Apr 9 00:03:24 2002 *************** *** 2,8 **** * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ! * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED --- 2,8 ---- * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ! * Copyright (c) 1999-2001 by Hewlett-Packard Company. All rights reserved. * * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED *************** *** 14,20 **** * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ - /* Boehm, February 16, 1996 2:30 pm PST */ # ifndef GC_PRIVATE_H --- 14,19 ---- *************** *** 41,56 **** # include "gc.h" # endif ! typedef GC_word word; ! typedef GC_signed_word signed_word; # ifndef GCCONFIG_H # include "gcconfig.h" # endif ! # ifndef HEADERS_H ! # include "gc_hdrs.h" ! # endif typedef int GC_bool; # define TRUE 1 --- 40,55 ---- # include "gc.h" # endif ! # ifndef GC_MARK_H ! # include "../gc_mark.h" ! # endif # ifndef GCCONFIG_H # include "gcconfig.h" # endif ! typedef GC_word word; ! typedef GC_signed_word signed_word; typedef int GC_bool; # define TRUE 1 *************** typedef char * ptr_t; /* A generic point *** 61,66 **** --- 60,69 ---- /* Preferably identical to caddr_t, if it */ /* exists. */ + # ifndef HEADERS_H + # include "gc_hdrs.h" + # endif + #if defined(__STDC__) # include # if !(defined( sony_news ) ) *************** typedef char * ptr_t; /* A generic point *** 74,82 **** # define VOLATILE #endif ! #define CONST GC_CONST ! #if 0 /* was once defined for AMIGA */ # define GC_FAR __far #else # define GC_FAR --- 77,107 ---- # define VOLATILE #endif ! #if 0 /* defined(__GNUC__) doesn't work yet */ ! # define EXPECT(expr, outcome) __builtin_expect(expr,outcome) ! /* Equivalent to (expr), but predict that usually (expr)==outcome. */ ! #else ! # define EXPECT(expr, outcome) (expr) ! #endif /* __GNUC__ */ ! # ifndef GC_LOCKS_H ! # include "gc_locks.h" ! # endif ! ! # ifdef STACK_GROWS_DOWN ! # define COOLER_THAN > ! # define HOTTER_THAN < ! # define MAKE_COOLER(x,y) if ((word)(x)+(y) > (word)(x)) {(x) += (y);} \ ! else {(x) = (word)ONES;} ! # define MAKE_HOTTER(x,y) (x) -= (y) ! # else ! # define COOLER_THAN < ! # define HOTTER_THAN > ! # define MAKE_COOLER(x,y) if ((word)(x)-(y) < (word)(x)) {(x) -= (y);} else {(x) = 0;} ! # define MAKE_HOTTER(x,y) (x) += (y) ! # endif ! ! #if defined(AMIGA) && defined(__SASC) # define GC_FAR __far #else # define GC_FAR *************** typedef char * ptr_t; /* A generic point *** 96,106 **** /* */ /*********************************/ ! #define STUBBORN_ALLOC /* Define stubborn allocation primitives */ ! #if defined(SRC_M3) || defined(SMALL_CONFIG) ! # undef STUBBORN_ALLOC ! #endif ! /* #define ALL_INTERIOR_POINTERS */ /* Forces all pointers into the interior of an */ --- 121,129 ---- /* */ /*********************************/ ! /* #define STUBBORN_ALLOC */ ! /* Enable stubborm allocation, and thus a limited */ ! /* form of incremental collection w/o dirty bits. */ /* #define ALL_INTERIOR_POINTERS */ /* Forces all pointers into the interior of an */ *************** typedef char * ptr_t; /* A generic point *** 127,132 **** --- 150,157 ---- /* touched. */ /* If you can easily avoid using this option, do. */ /* If not, try to keep individual objects small. */ + /* This is now really controlled at startup, */ + /* through GC_all_interior_pointers. */ #define PRINTSTATS /* Print garbage collection statistics */ /* For less verbose output, undefine in reclaim.c */ *************** typedef char * ptr_t; /* A generic point *** 157,168 **** # define GATHERSTATS #endif ! #ifdef FINALIZE_ON_DEMAND ! # define GC_INVOKE_FINALIZERS() ! #else ! # define GC_INVOKE_FINALIZERS() (void)GC_invoke_finalizers() #endif #define MERGE_SIZES /* Round up some object sizes, so that fewer distinct */ /* free lists are actually maintained. This applies */ /* only to the top level routines in misc.c, not to */ --- 182,193 ---- # define GATHERSTATS #endif ! #if defined(PRINTSTATS) || !defined(SMALL_CONFIG) ! # define CONDPRINT /* Print some things if GC_print_stats is set */ #endif + #define GC_INVOKE_FINALIZERS() GC_notify_or_invoke_finalizers() + #define MERGE_SIZES /* Round up some object sizes, so that fewer distinct */ /* free lists are actually maintained. This applies */ /* only to the top level routines in misc.c, not to */ *************** typedef char * ptr_t; /* A generic point *** 174,193 **** /* May save significant amounts of space for obj_map */ /* entries. */ /* ALIGN_DOUBLE requires MERGE_SIZES at present. */ # if defined(ALIGN_DOUBLE) && !defined(MERGE_SIZES) # define MERGE_SIZES # endif ! #if defined(ALL_INTERIOR_POINTERS) && !defined(DONT_ADD_BYTE_AT_END) ! # define ADD_BYTE_AT_END #endif # ifndef LARGE_CONFIG ! # define MINHINCR 16 /* Minimum heap increment, in blocks of HBLKSIZE */ ! /* Must be multiple of largest page size. */ ! # define MAXHINCR 512 /* Maximum heap increment, in blocks */ # else # define MINHINCR 64 # define MAXHINCR 4096 --- 199,232 ---- /* May save significant amounts of space for obj_map */ /* entries. */ + #if defined(USE_MARK_BYTES) && !defined(ALIGN_DOUBLE) + # define ALIGN_DOUBLE + /* We use one byte for every 2 words, which doesn't allow for */ + /* odd numbered words to have mark bits. */ + #endif + + #if defined(GC_GCJ_SUPPORT) && ALIGNMENT < 8 && !defined(ALIGN_DOUBLE) + /* GCJ's Hashtable synchronization code requires 64-bit alignment. */ + # define ALIGN_DOUBLE + #endif + + /* ALIGN_DOUBLE requires MERGE_SIZES at present. */ # if defined(ALIGN_DOUBLE) && !defined(MERGE_SIZES) # define MERGE_SIZES # endif ! #if !defined(DONT_ADD_BYTE_AT_END) ! # define EXTRA_BYTES GC_all_interior_pointers ! #else ! # define EXTRA_BYTES 0 #endif # ifndef LARGE_CONFIG ! # define MINHINCR 16 /* Minimum heap increment, in blocks of HBLKSIZE */ ! /* Must be multiple of largest page size. */ ! # define MAXHINCR 2048 /* Maximum heap increment, in blocks */ # else # define MINHINCR 64 # define MAXHINCR 4096 *************** typedef char * ptr_t; /* A generic point *** 216,250 **** #ifdef SAVE_CALL_CHAIN - /* - * Number of frames and arguments to save in objects allocated by - * debugging allocator. - */ - # define NFRAMES 6 /* Number of frames to save. Even for */ - /* alignment reasons. */ - # define NARGS 2 /* Mumber of arguments to save for each call. */ - - # define NEED_CALLINFO - /* Fill in the pc and argument information for up to NFRAMES of my */ /* callers. Ignore my frame and my callers frame. */ ! void GC_save_callers (/* struct callinfo info[NFRAMES] */); ! ! void GC_print_callers (/* struct callinfo info[NFRAMES] */); ! ! #else ! ! # ifdef GC_ADD_CALLER ! # define NFRAMES 1 ! # define NARGS 0 ! # define NEED_CALLINFO ! # endif #endif #ifdef NEED_CALLINFO struct callinfo { ! word ci_pc; # if NARGS > 0 word ci_arg[NARGS]; /* bit-wise complement to avoid retention */ # endif --- 255,272 ---- #ifdef SAVE_CALL_CHAIN /* Fill in the pc and argument information for up to NFRAMES of my */ /* callers. Ignore my frame and my callers frame. */ ! struct callinfo; ! void GC_save_callers GC_PROTO((struct callinfo info[NFRAMES])); ! ! void GC_print_callers GC_PROTO((struct callinfo info[NFRAMES])); #endif #ifdef NEED_CALLINFO struct callinfo { ! word ci_pc; /* Caller, not callee, pc */ # if NARGS > 0 word ci_arg[NARGS]; /* bit-wise complement to avoid retention */ # endif *************** void GC_print_callers (/* struct callinf *** 273,285 **** # define MS_TIME_DIFF(a,b) ((double) (a.tv_sec - b.tv_sec) * 1000.0 \ + (double) (a.tv_usec - b.tv_usec) / 1000.0) #else /* !BSD_TIME */ ! # ifdef MSWIN32 # include # include # define CLOCK_TYPE DWORD # define GET_TIME(x) x = GetTickCount() # define MS_TIME_DIFF(a,b) ((long)((a)-(b))) ! # else /* !MSWIN32, !BSD_TIME */ # include # if !defined(__STDC__) && defined(SPARC) && defined(SUNOS4) clock_t clock(); /* Not in time.h, where it belongs */ --- 295,307 ---- # define MS_TIME_DIFF(a,b) ((double) (a.tv_sec - b.tv_sec) * 1000.0 \ + (double) (a.tv_usec - b.tv_usec) / 1000.0) #else /* !BSD_TIME */ ! # if defined(MSWIN32) || defined(MSWINCE) # include # include # define CLOCK_TYPE DWORD # define GET_TIME(x) x = GetTickCount() # define MS_TIME_DIFF(a,b) ((long)((a)-(b))) ! # else /* !MSWIN32, !MSWINCE, !BSD_TIME */ # include # if !defined(__STDC__) && defined(SPARC) && defined(SUNOS4) clock_t clock(); /* Not in time.h, where it belongs */ *************** void GC_print_callers (/* struct callinf *** 325,330 **** --- 347,355 ---- # include # define BCOPY_EXISTS # endif + # if defined(MACOSX) + # define BCOPY_EXISTS + # endif # ifndef BCOPY_EXISTS # include *************** void GC_print_callers (/* struct callinf *** 342,347 **** --- 367,373 ---- /* GET_MEM is currently not assumed to retrieve 0 filled space, */ /* though we should perhaps take advantage of the case in which */ /* does. */ + struct hblk; /* See below. */ # ifdef PCR char * real_malloc(); # define GET_MEM(bytes) HBLKPTR(real_malloc((size_t)bytes + GC_page_size) \ *************** void GC_print_callers (/* struct callinf *** 353,359 **** + GC_page_size) \ + GC_page_size-1) # else ! # if defined(AMIGA) || defined(NEXT) || defined(MACOSX) || defined(DOS4GW) # define GET_MEM(bytes) HBLKPTR((size_t) \ calloc(1, (size_t)bytes + GC_page_size) \ + GC_page_size-1) --- 379,387 ---- + GC_page_size) \ + GC_page_size-1) # else ! # if defined(NEXT) || defined(MACOSX) || defined(DOS4GW) || \ ! (defined(AMIGA) && !defined(GC_AMIGA_FASTALLOC)) || \ ! (defined(SUNOS5) && !defined(USE_MMAP)) # define GET_MEM(bytes) HBLKPTR((size_t) \ calloc(1, (size_t)bytes + GC_page_size) \ + GC_page_size-1) *************** void GC_print_callers (/* struct callinf *** 374,703 **** NewPtrClear(bytes + GC_page_size) + GC_page_size-1) # endif # else ! extern ptr_t GC_unix_get_mem(); ! # define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes) # endif # endif # endif # endif # endif - /* - * Mutual exclusion between allocator/collector routines. - * Needed if there is more than one allocator thread. - * FASTLOCK() is assumed to try to acquire the lock in a cheap and - * dirty way that is acceptable for a few instructions, e.g. by - * inhibiting preemption. This is assumed to have succeeded only - * if a subsequent call to FASTLOCK_SUCCEEDED() returns TRUE. - * FASTUNLOCK() is called whether or not FASTLOCK_SUCCEEDED(). - * If signals cannot be tolerated with the FASTLOCK held, then - * FASTLOCK should disable signals. The code executed under - * FASTLOCK is otherwise immune to interruption, provided it is - * not restarted. - * DCL_LOCK_STATE declares any local variables needed by LOCK and UNLOCK - * and/or DISABLE_SIGNALS and ENABLE_SIGNALS and/or FASTLOCK. - * (There is currently no equivalent for FASTLOCK.) - */ - # ifdef THREADS - # ifdef PCR_OBSOLETE /* Faster, but broken with multiple lwp's */ - # include "th/PCR_Th.h" - # include "th/PCR_ThCrSec.h" - extern struct PCR_Th_MLRep GC_allocate_ml; - # define DCL_LOCK_STATE PCR_sigset_t GC_old_sig_mask - # define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml) - # define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) - # define FASTLOCK() PCR_ThCrSec_EnterSys() - /* Here we cheat (a lot): */ - # define FASTLOCK_SUCCEEDED() (*(int *)(&GC_allocate_ml) == 0) - /* TRUE if nobody currently holds the lock */ - # define FASTUNLOCK() PCR_ThCrSec_ExitSys() - # endif - # ifdef PCR - # include - # include - extern PCR_Th_ML GC_allocate_ml; - # define DCL_LOCK_STATE \ - PCR_ERes GC_fastLockRes; PCR_sigset_t GC_old_sig_mask - # define LOCK() PCR_Th_ML_Acquire(&GC_allocate_ml) - # define UNLOCK() PCR_Th_ML_Release(&GC_allocate_ml) - # define FASTLOCK() (GC_fastLockRes = PCR_Th_ML_Try(&GC_allocate_ml)) - # define FASTLOCK_SUCCEEDED() (GC_fastLockRes == PCR_ERes_okay) - # define FASTUNLOCK() {\ - if( FASTLOCK_SUCCEEDED() ) PCR_Th_ML_Release(&GC_allocate_ml); } - # endif - # ifdef SRC_M3 - extern word RT0u__inCritical; - # define LOCK() RT0u__inCritical++ - # define UNLOCK() RT0u__inCritical-- - # endif - # ifdef SOLARIS_THREADS - # include - # include - extern mutex_t GC_allocate_ml; - # define LOCK() mutex_lock(&GC_allocate_ml); - # define UNLOCK() mutex_unlock(&GC_allocate_ml); - # endif - # if defined(LINUX_THREADS) - # if defined(I386)|| defined(POWERPC) || defined(ALPHA) || defined(IA64) \ - || defined(M68K) - # include - # define USE_SPIN_LOCK - # if defined(I386) - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - /* Note: the "xchg" instruction does not need a "lock" prefix */ - __asm__ __volatile__("xchgl %0, %1" - : "=r"(oldval), "=m"(*(addr)) - : "0"(1), "m"(*(addr))); - return oldval; - } - # endif - # if defined(IA64) - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - __asm__ __volatile__("xchg4 %0=%1,%2" - : "=r"(oldval), "=m"(*addr) - : "r"(1), "1"(*addr)); - return oldval; - } - inline static void GC_clear(volatile unsigned int *addr) { - __asm__ __volatile__("st4.rel %0=r0" : "=m" (*addr)); - } - # define GC_CLEAR_DEFINED - # endif - # ifdef M68K - /* Contributed by Tony Mantler. I'm not sure how well it was */ - /* tested. */ - inline static int GC_test_and_set(volatile unsigned int *addr) { - char oldval; /* this must be no longer than 8 bits */ - - /* The return value is semi-phony. */ - /* 'tas' sets bit 7 while the return */ - /* value pretends bit 0 was set */ - __asm__ __volatile__( - "tas %1@; sne %0; negb %0" - : "=d" (oldval) - : "a" (addr)); - return oldval; - } - # endif - # if defined(POWERPC) - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - int temp = 1; // locked value - - __asm__ __volatile__( - "1:\tlwarx %0,0,%3\n" // load and reserve - "\tcmpwi %0, 0\n" // if load is - "\tbne 2f\n" // non-zero, return already set - "\tstwcx. %2,0,%1\n" // else store conditional - "\tbne- 1b\n" // retry if lost reservation - "2:\t\n" // oldval is zero if we set - : "=&r"(oldval), "=p"(addr) - : "r"(temp), "1"(addr) - : "memory"); - return (int)oldval; - } - inline static void GC_clear(volatile unsigned int *addr) { - __asm__ __volatile__("eieio"); - *(addr) = 0; - } - # define GC_CLEAR_DEFINED - # endif - # ifdef ALPHA - inline static int GC_test_and_set(volatile unsigned int * addr) - { - unsigned long oldvalue; - unsigned long temp; - - __asm__ __volatile__( - "1: ldl_l %0,%1\n" - " and %0,%3,%2\n" - " bne %2,2f\n" - " xor %0,%3,%0\n" - " stl_c %0,%1\n" - " beq %0,3f\n" - " mb\n" - "2:\n" - ".section .text2,\"ax\"\n" - "3: br 1b\n" - ".previous" - :"=&r" (temp), "=m" (*addr), "=&r" (oldvalue) - :"Ir" (1), "m" (*addr)); - - return oldvalue; - } - /* Should probably also define GC_clear, since it needs */ - /* a memory barrier ?? */ - # endif /* ALPHA */ - # ifdef ARM32 - inline static int GC_test_and_set(volatile unsigned int *addr) { - int oldval; - /* SWP on ARM is very similar to XCHG on x86. Doesn't lock the - * bus because there are no SMP ARM machines. If/when there are, - * this code will likely need to be updated. */ - /* See linuxthreads/sysdeps/arm/pt-machine.h in glibc-2.1 */ - __asm__ __volatile__("swp %0, %1, [%2]" - : "=r"(oldval) - : "r"(1), "r"(addr)); - return oldval; - } - # endif - # ifndef GC_CLEAR_DEFINED - inline static void GC_clear(volatile unsigned int *addr) { - /* Try to discourage gcc from moving anything past this. */ - __asm__ __volatile__(" "); - *(addr) = 0; - } - # endif - - extern volatile unsigned int GC_allocate_lock; - extern pthread_t GC_lock_holder; - extern void GC_lock(void); - /* Allocation lock holder. Only set if acquired by client through */ - /* GC_call_with_alloc_lock. */ - # define SET_LOCK_HOLDER() GC_lock_holder = pthread_self() - # define NO_THREAD (pthread_t)(-1) - # define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD - # define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self())) - # define LOCK() \ - { if (GC_test_and_set(&GC_allocate_lock)) GC_lock(); } - # define UNLOCK() \ - GC_clear(&GC_allocate_lock) - extern VOLATILE GC_bool GC_collecting; - # define ENTER_GC() \ - { \ - GC_collecting = 1; \ - } - # define EXIT_GC() GC_collecting = 0; - # else /* LINUX_THREADS on hardware for which we don't know how */ - /* to do test and set. */ - # include - extern pthread_mutex_t GC_allocate_ml; - # define LOCK() pthread_mutex_lock(&GC_allocate_ml) - # define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml) - # endif - # endif /* LINUX_THREADS */ - # if defined(HPUX_THREADS) - # include - extern pthread_mutex_t GC_allocate_ml; - # define LOCK() pthread_mutex_lock(&GC_allocate_ml) - # define UNLOCK() pthread_mutex_unlock(&GC_allocate_ml) - # endif - # if defined(IRIX_THREADS) || defined(IRIX_JDK_THREADS) - /* This may also eventually be appropriate for HPUX_THREADS */ - # include - # ifndef HPUX_THREADS - /* This probably should never be included, but I can't test */ - /* on Irix anymore. */ - # include - # endif - - # ifndef HPUX_THREADS - # if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64)) \ - || !defined(_COMPILER_VERSION) || _COMPILER_VERSION < 700 - # define GC_test_and_set(addr, v) test_and_set(addr,v) - # else - # define GC_test_and_set(addr, v) __test_and_set(addr,v) - # endif - # else - /* I couldn't find a way to do this inline on HP/UX */ - # endif - extern unsigned long GC_allocate_lock; - /* This is not a mutex because mutexes that obey the (optional) */ - /* POSIX scheduling rules are subject to convoys in high contention */ - /* applications. This is basically a spin lock. */ - extern pthread_t GC_lock_holder; - extern void GC_lock(void); - /* Allocation lock holder. Only set if acquired by client through */ - /* GC_call_with_alloc_lock. */ - # define SET_LOCK_HOLDER() GC_lock_holder = pthread_self() - # define NO_THREAD (pthread_t)(-1) - # define UNSET_LOCK_HOLDER() GC_lock_holder = NO_THREAD - # define I_HOLD_LOCK() (pthread_equal(GC_lock_holder, pthread_self())) - # ifdef HPUX_THREADS - # define LOCK() { if (!GC_test_and_clear(&GC_allocate_lock)) GC_lock(); } - /* The following is INCORRECT, since the memory model is too weak. */ - # define UNLOCK() { GC_noop1(&GC_allocate_lock); \ - *(volatile unsigned long *)(&GC_allocate_lock) = 1; } - # else - # define LOCK() { if (GC_test_and_set(&GC_allocate_lock, 1)) GC_lock(); } - # if __mips >= 3 && (defined (_ABIN32) || defined(_ABI64)) \ - && defined(_COMPILER_VERSION) && _COMPILER_VERSION >= 700 - # define UNLOCK() __lock_release(&GC_allocate_lock) - # else - /* The function call in the following should prevent the */ - /* compiler from moving assignments to below the UNLOCK. */ - /* This is probably not necessary for ucode or gcc 2.8. */ - /* It may be necessary for Ragnarok and future gcc */ - /* versions. */ - # define UNLOCK() { GC_noop1(&GC_allocate_lock); \ - *(volatile unsigned long *)(&GC_allocate_lock) = 0; } - # endif - # endif - extern VOLATILE GC_bool GC_collecting; - # define ENTER_GC() \ - { \ - GC_collecting = 1; \ - } - # define EXIT_GC() GC_collecting = 0; - # endif /* IRIX_THREADS || IRIX_JDK_THREADS */ - # ifdef WIN32_THREADS - # include - GC_API CRITICAL_SECTION GC_allocate_ml; - # define LOCK() EnterCriticalSection(&GC_allocate_ml); - # define UNLOCK() LeaveCriticalSection(&GC_allocate_ml); - # endif - # ifndef SET_LOCK_HOLDER - # define SET_LOCK_HOLDER() - # define UNSET_LOCK_HOLDER() - # define I_HOLD_LOCK() FALSE - /* Used on platforms were locks can be reacquired, */ - /* so it doesn't matter if we lie. */ - # endif - # else - # define LOCK() - # define UNLOCK() - # endif - # ifndef SET_LOCK_HOLDER - # define SET_LOCK_HOLDER() - # define UNSET_LOCK_HOLDER() - # define I_HOLD_LOCK() FALSE - /* Used on platforms were locks can be reacquired, */ - /* so it doesn't matter if we lie. */ - # endif - # ifndef ENTER_GC - # define ENTER_GC() - # define EXIT_GC() - # endif - - # ifndef DCL_LOCK_STATE - # define DCL_LOCK_STATE - # endif - # ifndef FASTLOCK - # define FASTLOCK() LOCK() - # define FASTLOCK_SUCCEEDED() TRUE - # define FASTUNLOCK() UNLOCK() - # endif - /* Delay any interrupts or signals that may abort this thread. Data */ /* structures are in a consistent state outside this pair of calls. */ /* ANSI C allows both to be empty (though the standard isn't very */ /* clear on that point). Standard malloc implementations are usually */ /* neither interruptable nor thread-safe, and thus correspond to */ /* empty definitions. */ # ifdef PCR # define DISABLE_SIGNALS() \ PCR_Th_SetSigMask(PCR_allSigsBlocked,&GC_old_sig_mask) # define ENABLE_SIGNALS() \ PCR_Th_SetSigMask(&GC_old_sig_mask, NIL) # else ! # if defined(SRC_M3) || defined(AMIGA) || defined(SOLARIS_THREADS) \ ! || defined(MSWIN32) || defined(MACOS) || defined(DJGPP) \ ! || defined(NO_SIGNALS) || defined(IRIX_THREADS) \ ! || defined(IRIX_JDK_THREADS) || defined(LINUX_THREADS) /* Also useful for debugging. */ ! /* Should probably use thr_sigsetmask for SOLARIS_THREADS. */ # define DISABLE_SIGNALS() # define ENABLE_SIGNALS() # else --- 402,448 ---- NewPtrClear(bytes + GC_page_size) + GC_page_size-1) # endif # else ! # ifdef MSWINCE ! extern ptr_t GC_wince_get_mem(); ! # define GET_MEM(bytes) (struct hblk *)GC_wince_get_mem(bytes) ! # else ! # if defined(AMIGA) && defined(GC_AMIGA_FASTALLOC) ! extern void *GC_amiga_get_mem(size_t size); ! define GET_MEM(bytes) HBLKPTR((size_t) \ ! GC_amiga_get_mem((size_t)bytes + GC_page_size) \ ! + GC_page_size-1) ! # else ! extern ptr_t GC_unix_get_mem(); ! # define GET_MEM(bytes) (struct hblk *)GC_unix_get_mem(bytes) ! # endif ! # endif # endif # endif # endif # endif # endif /* Delay any interrupts or signals that may abort this thread. Data */ /* structures are in a consistent state outside this pair of calls. */ /* ANSI C allows both to be empty (though the standard isn't very */ /* clear on that point). Standard malloc implementations are usually */ /* neither interruptable nor thread-safe, and thus correspond to */ /* empty definitions. */ + /* It probably doesn't make any sense to declare these to be nonempty */ + /* if the code is being optimized, since signal safety relies on some */ + /* ordering constraints that are typically not obeyed by optimizing */ + /* compilers. */ # ifdef PCR # define DISABLE_SIGNALS() \ PCR_Th_SetSigMask(PCR_allSigsBlocked,&GC_old_sig_mask) # define ENABLE_SIGNALS() \ PCR_Th_SetSigMask(&GC_old_sig_mask, NIL) # else ! # if defined(THREADS) || defined(AMIGA) \ ! || defined(MSWIN32) || defined(MSWINCE) || defined(MACOS) \ ! || defined(DJGPP) || defined(NO_SIGNALS) /* Also useful for debugging. */ ! /* Should probably use thr_sigsetmask for GC_SOLARIS_THREADS. */ # define DISABLE_SIGNALS() # define ENABLE_SIGNALS() # else *************** void GC_print_callers (/* struct callinf *** 722,730 **** PCR_allSigsBlocked, \ PCR_waitForever); # else ! # if defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \ ! || defined(IRIX_THREADS) || defined(LINUX_THREADS) \ ! || defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) void GC_stop_world(); void GC_start_world(); # define STOP_WORLD() GC_stop_world() --- 467,474 ---- PCR_allSigsBlocked, \ PCR_waitForever); # else ! # if defined(GC_SOLARIS_THREADS) || defined(GC_WIN32_THREADS) \ ! || defined(GC_PTHREADS) void GC_stop_world(); void GC_start_world(); # define STOP_WORLD() GC_stop_world() *************** void GC_print_callers (/* struct callinf *** 755,763 **** # endif /* Print warning message, e.g. almost out of memory. */ ! # define WARN(msg,arg) (*GC_current_warn_proc)(msg, (GC_word)(arg)) extern GC_warn_proc GC_current_warn_proc; /*********************************/ /* */ /* Word-size-dependent defines */ --- 499,514 ---- # endif /* Print warning message, e.g. almost out of memory. */ ! # define WARN(msg,arg) (*GC_current_warn_proc)("GC Warning: " msg, (GC_word)(arg)) extern GC_warn_proc GC_current_warn_proc; + /* Get environment entry */ + #if !defined(NO_GETENV) + # define GETENV(name) getenv(name) + #else + # define GETENV(name) 0 + #endif + /*********************************/ /* */ /* Word-size-dependent defines */ *************** extern GC_warn_proc GC_current_warn_proc *** 787,793 **** #define WORDSZ ((word)CPP_WORDSZ) #define SIGNB ((word)1 << (WORDSZ-1)) #define BYTES_PER_WORD ((word)(sizeof (word))) ! #define ONES ((word)(-1)) #define divWORDSZ(n) ((n) >> LOGWL) /* divide n by size of word */ /*********************/ --- 538,544 ---- #define WORDSZ ((word)CPP_WORDSZ) #define SIGNB ((word)1 << (WORDSZ-1)) #define BYTES_PER_WORD ((word)(sizeof (word))) ! #define ONES ((word)(signed_word)(-1)) #define divWORDSZ(n) ((n) >> LOGWL) /* divide n by size of word */ /*********************/ *************** extern GC_warn_proc GC_current_warn_proc *** 802,808 **** # ifdef SMALL_CONFIG # define CPP_LOG_HBLKSIZE 10 # else ! # if CPP_WORDSZ == 32 # define CPP_LOG_HBLKSIZE 12 # else # define CPP_LOG_HBLKSIZE 13 --- 553,560 ---- # ifdef SMALL_CONFIG # define CPP_LOG_HBLKSIZE 10 # else ! # if (CPP_WORDSZ == 32) || (defined(HPUX) && defined(HP_PA)) ! /* HPUX/PA seems to use 4K pages with the 64 bit ABI */ # define CPP_LOG_HBLKSIZE 12 # else # define CPP_LOG_HBLKSIZE 13 *************** extern GC_warn_proc GC_current_warn_proc *** 840,845 **** --- 592,599 ---- /* max size objects supported by freelist (larger objects may be */ /* allocated, but less efficiently) */ + #define CPP_MAXOBJBYTES (CPP_HBLKSIZE/2) + #define MAXOBJBYTES ((word)CPP_MAXOBJBYTES) #define CPP_MAXOBJSZ BYTES_TO_WORDS(CPP_HBLKSIZE/2) #define MAXOBJSZ ((word)CPP_MAXOBJSZ) *************** extern GC_warn_proc GC_current_warn_proc *** 860,884 **** # define HBLKDISPL(objptr) (((word) (objptr)) & (HBLKSIZE-1)) /* Round up byte allocation requests to integral number of words, etc. */ ! # ifdef ADD_BYTE_AT_END ! # define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + WORDS_TO_BYTES(1)) ! # ifdef ALIGN_DOUBLE ! # define ALIGNED_WORDS(n) (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2)) & ~1) ! # else ! # define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n) ! # endif ! # define SMALL_OBJ(bytes) ((bytes) < WORDS_TO_BYTES(MAXOBJSZ)) ! # define ADD_SLOP(bytes) ((bytes)+1) ! # else ! # define ROUNDED_UP_WORDS(n) BYTES_TO_WORDS((n) + (WORDS_TO_BYTES(1) - 1)) ! # ifdef ALIGN_DOUBLE # define ALIGNED_WORDS(n) \ ! (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2) - 1) & ~1) ! # else # define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n) # endif - # define SMALL_OBJ(bytes) ((bytes) <= WORDS_TO_BYTES(MAXOBJSZ)) - # define ADD_SLOP(bytes) (bytes) # endif --- 614,641 ---- # define HBLKDISPL(objptr) (((word) (objptr)) & (HBLKSIZE-1)) /* Round up byte allocation requests to integral number of words, etc. */ ! # define ROUNDED_UP_WORDS(n) \ ! BYTES_TO_WORDS((n) + (WORDS_TO_BYTES(1) - 1 + EXTRA_BYTES)) ! # ifdef ALIGN_DOUBLE # define ALIGNED_WORDS(n) \ ! (BYTES_TO_WORDS((n) + WORDS_TO_BYTES(2) - 1 + EXTRA_BYTES) & ~1) ! # else # define ALIGNED_WORDS(n) ROUNDED_UP_WORDS(n) + # endif + # define SMALL_OBJ(bytes) ((bytes) < (MAXOBJBYTES - EXTRA_BYTES)) + # define ADD_SLOP(bytes) ((bytes) + EXTRA_BYTES) + # ifndef MIN_WORDS + /* MIN_WORDS is the size of the smallest allocated object. */ + /* 1 and 2 are the only valid values. */ + /* 2 must be used if: */ + /* - GC_gcj_malloc can be used for objects of requested */ + /* size smaller than 2 words, or */ + /* - USE_MARK_BYTES is defined. */ + # if defined(USE_MARK_BYTES) || defined(GC_GCJ_SUPPORT) + # define MIN_WORDS 2 /* Smallest allocated object. */ + # else + # define MIN_WORDS 1 # endif # endif *************** extern GC_warn_proc GC_current_warn_proc *** 889,899 **** */ # ifdef LARGE_CONFIG ! # define LOG_PHT_ENTRIES 17 # else ! # define LOG_PHT_ENTRIES 14 /* Collisions are likely if heap grows */ ! /* to more than 16K hblks = 64MB. */ ! /* Each hash table occupies 2K bytes. */ # endif # define PHT_ENTRIES ((word)1 << LOG_PHT_ENTRIES) # define PHT_SIZE (PHT_ENTRIES >> LOGWL) --- 646,664 ---- */ # ifdef LARGE_CONFIG ! # define LOG_PHT_ENTRIES 19 /* Collisions likely at 512K blocks, */ ! /* which is >= 2GB. Each table takes */ ! /* 64KB. */ # else ! # ifdef SMALL_CONFIG ! # define LOG_PHT_ENTRIES 14 /* Collisions are likely if heap grows */ ! /* to more than 16K hblks = 64MB. */ ! /* Each hash table occupies 2K bytes. */ ! # else /* default "medium" configuration */ ! # define LOG_PHT_ENTRIES 16 /* Collisions are likely if heap grows */ ! /* to more than 16K hblks >= 256MB. */ ! /* Each hash table occupies 8K bytes. */ ! # endif # endif # define PHT_ENTRIES ((word)1 << LOG_PHT_ENTRIES) # define PHT_SIZE (PHT_ENTRIES >> LOGWL) *************** typedef word page_hash_table[PHT_SIZE]; *** 907,912 **** --- 672,681 ---- (bl)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index) # define clear_pht_entry_from_index(bl, index) \ (bl)[divWORDSZ(index)] &= ~((word)1 << modWORDSZ(index)) + /* And a dumb but thread-safe version of set_pht_entry_from_index. */ + /* This sets (many) extra bits. */ + # define set_pht_entry_from_index_safe(bl, index) \ + (bl)[divWORDSZ(index)] = ONES *************** typedef word page_hash_table[PHT_SIZE]; *** 919,938 **** /* heap block header */ #define HBLKMASK (HBLKSIZE-1) ! #define BITS_PER_HBLK (HBLKSIZE * 8) #define MARK_BITS_PER_HBLK (BITS_PER_HBLK/CPP_WORDSZ) /* upper bound */ ! /* We allocate 1 bit/word. Only the first word */ /* in each object is actually marked. */ ! # ifdef ALIGN_DOUBLE ! # define MARK_BITS_SZ (((MARK_BITS_PER_HBLK + 2*CPP_WORDSZ - 1) \ ! / (2*CPP_WORDSZ))*2) # else ! # define MARK_BITS_SZ ((MARK_BITS_PER_HBLK + CPP_WORDSZ - 1)/CPP_WORDSZ) # endif ! /* Upper bound on number of mark words per heap block */ struct hblkhdr { word hb_sz; /* If in use, size in words, of objects in the block. */ --- 688,715 ---- /* heap block header */ #define HBLKMASK (HBLKSIZE-1) ! #define BITS_PER_HBLK (CPP_HBLKSIZE * 8) #define MARK_BITS_PER_HBLK (BITS_PER_HBLK/CPP_WORDSZ) /* upper bound */ ! /* We allocate 1 bit/word, unless USE_MARK_BYTES */ ! /* is defined. Only the first word */ /* in each object is actually marked. */ ! # ifdef USE_MARK_BYTES ! # define MARK_BITS_SZ (MARK_BITS_PER_HBLK/2) ! /* Unlike the other case, this is in units of bytes. */ ! /* We actually allocate only every second mark bit, since we */ ! /* force all objects to be doubleword aligned. */ ! /* However, each mark bit is allocated as a byte. */ # else ! # define MARK_BITS_SZ (MARK_BITS_PER_HBLK/CPP_WORDSZ) # endif ! ! /* We maintain layout maps for heap blocks containing objects of a given */ ! /* size. Each entry in this map describes a byte offset and has the */ ! /* following type. */ ! typedef unsigned char map_entry_type; struct hblkhdr { word hb_sz; /* If in use, size in words, of objects in the block. */ *************** struct hblkhdr { *** 943,949 **** struct hblk * hb_prev; /* Backwards link for free list. */ word hb_descr; /* object descriptor for marking. See */ /* mark.h. */ ! char* hb_map; /* A pointer to a pointer validity map of the block. */ /* See GC_obj_map. */ /* Valid for all blocks with headers. */ /* Free blocks point to GC_invalid_map. */ --- 720,727 ---- struct hblk * hb_prev; /* Backwards link for free list. */ word hb_descr; /* object descriptor for marking. See */ /* mark.h. */ ! map_entry_type * hb_map; ! /* A pointer to a pointer validity map of the block. */ /* See GC_obj_map. */ /* Valid for all blocks with headers. */ /* Free blocks point to GC_invalid_map. */ *************** struct hblkhdr { *** 965,975 **** /* Value of GC_gc_no when block was */ /* last allocated or swept. May wrap. */ /* For a free block, this is maintained */ ! /* unly for USE_MUNMAP, and indicates */ /* when the header was allocated, or */ /* when the size of the block last */ /* changed. */ ! word hb_marks[MARK_BITS_SZ]; /* Bit i in the array refers to the */ /* object starting at the ith word (header */ /* INCLUDED) in the heap block. */ --- 743,762 ---- /* Value of GC_gc_no when block was */ /* last allocated or swept. May wrap. */ /* For a free block, this is maintained */ ! /* only for USE_MUNMAP, and indicates */ /* when the header was allocated, or */ /* when the size of the block last */ /* changed. */ ! # ifdef USE_MARK_BYTES ! union { ! char _hb_marks[MARK_BITS_SZ]; ! /* The i'th byte is 1 if the object */ ! /* starting at word 2i is marked, 0 o.w. */ ! word dummy; /* Force word alignment of mark bytes. */ ! } _mark_byte_union; ! # define hb_marks _mark_byte_union._hb_marks ! # else ! word hb_marks[MARK_BITS_SZ]; /* Bit i in the array refers to the */ /* object starting at the ith word (header */ /* INCLUDED) in the heap block. */ *************** struct hblkhdr { *** 977,1020 **** /* Unused bits are invalid, and are */ /* occasionally set, e.g for uncollectable */ /* objects. */ }; /* heap block body */ ! # define DISCARD_WORDS 0 ! /* Number of words to be dropped at the beginning of each block */ ! /* Must be a multiple of WORDSZ. May reasonably be nonzero */ ! /* on machines that don't guarantee longword alignment of */ ! /* pointers, so that the number of false hits is minimized. */ ! /* 0 and WORDSZ are probably the only reasonable values. */ ! ! # define BODY_SZ ((HBLKSIZE-WORDS_TO_BYTES(DISCARD_WORDS))/sizeof(word)) struct hblk { - # if (DISCARD_WORDS != 0) - word garbage[DISCARD_WORDS]; - # endif word hb_body[BODY_SZ]; }; ! # define HDR_WORDS ((word)DISCARD_WORDS) ! # define HDR_BYTES ((word)WORDS_TO_BYTES(DISCARD_WORDS)) # define OBJ_SZ_TO_BLOCKS(sz) \ ! divHBLKSZ(HDR_BYTES + WORDS_TO_BYTES(sz) + HBLKSIZE-1) /* Size of block (in units of HBLKSIZE) needed to hold objects of */ /* given sz (in words). */ /* Object free list link */ # define obj_link(p) (*(ptr_t *)(p)) - /* The type of mark procedures. This really belongs in gc_mark.h. */ - /* But we put it here, so that we can avoid scanning the mark proc */ - /* table. */ - typedef struct ms_entry * (*mark_proc)(/* word * addr, - struct ms_entry *mark_stack_ptr, - struct ms_entry *mark_stack_limit, - word env */); # define LOG_MAX_MARK_PROCS 6 # define MAX_MARK_PROCS (1 << LOG_MAX_MARK_PROCS) --- 764,790 ---- /* Unused bits are invalid, and are */ /* occasionally set, e.g for uncollectable */ /* objects. */ + # endif /* !USE_MARK_BYTES */ }; /* heap block body */ ! # define BODY_SZ (HBLKSIZE/sizeof(word)) struct hblk { word hb_body[BODY_SZ]; }; ! # define HBLK_IS_FREE(hdr) ((hdr) -> hb_map == GC_invalid_map) # define OBJ_SZ_TO_BLOCKS(sz) \ ! divHBLKSZ(WORDS_TO_BYTES(sz) + HBLKSIZE-1) /* Size of block (in units of HBLKSIZE) needed to hold objects of */ /* given sz (in words). */ /* Object free list link */ # define obj_link(p) (*(ptr_t *)(p)) # define LOG_MAX_MARK_PROCS 6 # define MAX_MARK_PROCS (1 << LOG_MAX_MARK_PROCS) *************** typedef struct ms_entry * (*mark_proc)(/ *** 1028,1039 **** # ifdef PCR # define MAX_ROOT_SETS 1024 # else ! # ifdef MSWIN32 ! # define MAX_ROOT_SETS 512 /* Under NT, we add only written pages, which can result */ /* in many small root sets. */ # else ! # define MAX_ROOT_SETS 64 # endif # endif # endif --- 798,809 ---- # ifdef PCR # define MAX_ROOT_SETS 1024 # else ! # if defined(MSWIN32) || defined(MSWINCE) ! # define MAX_ROOT_SETS 1024 /* Under NT, we add only written pages, which can result */ /* in many small root sets. */ # else ! # define MAX_ROOT_SETS 256 # endif # endif # endif *************** struct exclusion { *** 1056,1069 **** struct roots { ptr_t r_start; ptr_t r_end; ! # ifndef MSWIN32 struct roots * r_next; # endif GC_bool r_tmp; /* Delete before registering new dynamic libraries */ }; ! #ifndef MSWIN32 /* Size of hash table index to roots. */ # define LOG_RT_SIZE 6 # define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */ --- 826,839 ---- struct roots { ptr_t r_start; ptr_t r_end; ! # if !defined(MSWIN32) && !defined(MSWINCE) struct roots * r_next; # endif GC_bool r_tmp; /* Delete before registering new dynamic libraries */ }; ! #if !defined(MSWIN32) && !defined(MSWINCE) /* Size of hash table index to roots. */ # define LOG_RT_SIZE 6 # define RT_SIZE (1 << LOG_RT_SIZE) /* Power of 2, may be != MAX_ROOT_SETS */ *************** struct _GC_arrays { *** 1097,1107 **** word _large_free_bytes; /* Total bytes contained in blocks on large object free */ /* list. */ word _words_allocd_before_gc; /* Number of words allocated before this */ /* collection cycle. */ ! word _words_allocd; /* Number of words allocated during this collection cycle */ word _words_wasted; /* Number of words wasted due to internal fragmentation */ /* in large objects, or due to dropping blacklisted */ --- 867,888 ---- word _large_free_bytes; /* Total bytes contained in blocks on large object free */ /* list. */ + word _large_allocd_bytes; + /* Total number of bytes in allocated large objects blocks. */ + /* For the purposes of this counter and the next one only, a */ + /* large object is one that occupies a block of at least */ + /* 2*HBLKSIZE. */ + word _max_large_allocd_bytes; + /* Maximum number of bytes that were ever allocated in */ + /* large object blocks. This is used to help decide when it */ + /* is safe to split up a large block. */ word _words_allocd_before_gc; /* Number of words allocated before this */ /* collection cycle. */ ! # ifndef SEPARATE_GLOBALS ! word _words_allocd; /* Number of words allocated during this collection cycle */ + # endif word _words_wasted; /* Number of words wasted due to internal fragmentation */ /* in large objects, or due to dropping blacklisted */ *************** struct _GC_arrays { *** 1120,1133 **** ptr_t _scratch_last_end_ptr; /* Used by headers.c, and can easily appear to point to */ /* heap. */ ! mark_proc _mark_procs[MAX_MARK_PROCS]; /* Table of user-defined mark procedures. There is */ /* a small number of these, which can be referenced */ /* by DS_PROC mark descriptors. See gc_mark.h. */ ! ptr_t _objfreelist[MAXOBJSZ+1]; /* free list for objects */ ! ptr_t _aobjfreelist[MAXOBJSZ+1]; /* free list for atomic objs */ ptr_t _uobjfreelist[MAXOBJSZ+1]; /* uncollectable but traced objs */ --- 901,917 ---- ptr_t _scratch_last_end_ptr; /* Used by headers.c, and can easily appear to point to */ /* heap. */ ! GC_mark_proc _mark_procs[MAX_MARK_PROCS]; /* Table of user-defined mark procedures. There is */ /* a small number of these, which can be referenced */ /* by DS_PROC mark descriptors. See gc_mark.h. */ ! ! # ifndef SEPARATE_GLOBALS ! ptr_t _objfreelist[MAXOBJSZ+1]; /* free list for objects */ ! ptr_t _aobjfreelist[MAXOBJSZ+1]; /* free list for atomic objs */ + # endif ptr_t _uobjfreelist[MAXOBJSZ+1]; /* uncollectable but traced objs */ *************** struct _GC_arrays { *** 1160,1200 **** ptr_t _sobjfreelist[MAXOBJSZ+1]; # endif /* free list for immutable objects */ ! ptr_t _obj_map[MAXOBJSZ+1]; /* If not NIL, then a pointer to a map of valid */ /* object addresses. _obj_map[sz][i] is j if the */ /* address block_start+i is a valid pointer */ ! /* to an object at */ ! /* block_start+i&~3 - WORDS_TO_BYTES(j). */ ! /* (If ALL_INTERIOR_POINTERS is defined, then */ ! /* instead ((short *)(hb_map[sz])[i] is j if */ ! /* block_start+WORDS_TO_BYTES(i) is in the */ ! /* interior of an object starting at */ ! /* block_start+WORDS_TO_BYTES(i-j)). */ ! /* It is OBJ_INVALID if */ ! /* block_start+WORDS_TO_BYTES(i) is not */ ! /* valid as a pointer to an object. */ ! /* We assume all values of j <= OBJ_INVALID. */ ! /* The zeroth entry corresponds to large objects.*/ ! # ifdef ALL_INTERIOR_POINTERS ! # define map_entry_type short ! # define OBJ_INVALID 0x7fff ! # define MAP_ENTRY(map, bytes) \ ! (((map_entry_type *)(map))[BYTES_TO_WORDS(bytes)]) ! # define MAP_ENTRIES BYTES_TO_WORDS(HBLKSIZE) ! # define MAP_SIZE (MAP_ENTRIES * sizeof(map_entry_type)) ! # define OFFSET_VALID(displ) TRUE ! # define CPP_MAX_OFFSET (HBLKSIZE - HDR_BYTES - 1) ! # define MAX_OFFSET ((word)CPP_MAX_OFFSET) ! # else ! # define map_entry_type char ! # define OBJ_INVALID 0x7f ! # define MAP_ENTRY(map, bytes) \ ! (map)[bytes] ! # define MAP_ENTRIES HBLKSIZE ! # define MAP_SIZE MAP_ENTRIES ! # define CPP_MAX_OFFSET (WORDS_TO_BYTES(OBJ_INVALID) - 1) ! # define MAX_OFFSET ((word)CPP_MAX_OFFSET) # define VALID_OFFSET_SZ \ (CPP_MAX_OFFSET > WORDS_TO_BYTES(CPP_MAXOBJSZ)? \ CPP_MAX_OFFSET+1 \ --- 944,971 ---- ptr_t _sobjfreelist[MAXOBJSZ+1]; # endif /* free list for immutable objects */ ! map_entry_type * _obj_map[MAXOBJSZ+1]; /* If not NIL, then a pointer to a map of valid */ /* object addresses. _obj_map[sz][i] is j if the */ /* address block_start+i is a valid pointer */ ! /* to an object at block_start + */ ! /* WORDS_TO_BYTES(BYTES_TO_WORDS(i) - j) */ ! /* I.e. j is a word displacement from the */ ! /* object beginning. */ ! /* The entry is OBJ_INVALID if the corresponding */ ! /* address is not a valid pointer. It is */ ! /* OFFSET_TOO_BIG if the value j would be too */ ! /* large to fit in the entry. (Note that the */ ! /* size of these entries matters, both for */ ! /* space consumption and for cache utilization. */ ! # define OFFSET_TOO_BIG 0xfe ! # define OBJ_INVALID 0xff ! # define MAP_ENTRY(map, bytes) (map)[bytes] ! # define MAP_ENTRIES HBLKSIZE ! # define MAP_SIZE MAP_ENTRIES ! # define CPP_MAX_OFFSET (OFFSET_TOO_BIG - 1) ! # define MAX_OFFSET ((word)CPP_MAX_OFFSET) ! /* The following are used only if GC_all_interior_ptrs != 0 */ # define VALID_OFFSET_SZ \ (CPP_MAX_OFFSET > WORDS_TO_BYTES(CPP_MAXOBJSZ)? \ CPP_MAX_OFFSET+1 \ *************** struct _GC_arrays { *** 1202,1212 **** char _valid_offsets[VALID_OFFSET_SZ]; /* GC_valid_offsets[i] == TRUE ==> i */ /* is registered as a displacement. */ ! # define OFFSET_VALID(displ) GC_valid_offsets[displ] char _modws_valid_offsets[sizeof(word)]; /* GC_valid_offsets[i] ==> */ /* GC_modws_valid_offsets[i%sizeof(word)] */ - # endif # ifdef STUBBORN_ALLOC page_hash_table _changed_pages; /* Stubborn object pages that were changes since last call to */ --- 973,983 ---- char _valid_offsets[VALID_OFFSET_SZ]; /* GC_valid_offsets[i] == TRUE ==> i */ /* is registered as a displacement. */ ! # define OFFSET_VALID(displ) \ ! (GC_all_interior_pointers || GC_valid_offsets[displ]) char _modws_valid_offsets[sizeof(word)]; /* GC_valid_offsets[i] ==> */ /* GC_modws_valid_offsets[i%sizeof(word)] */ # ifdef STUBBORN_ALLOC page_hash_table _changed_pages; /* Stubborn object pages that were changes since last call to */ *************** struct _GC_arrays { *** 1233,1249 **** # define MAX_HEAP_SECTS 768 /* Separately added heap sections. */ # endif # else ! # define MAX_HEAP_SECTS 256 # endif struct HeapSect { ptr_t hs_start; word hs_bytes; } _heap_sects[MAX_HEAP_SECTS]; ! # ifdef MSWIN32 ptr_t _heap_bases[MAX_HEAP_SECTS]; /* Start address of memory regions obtained from kernel. */ # endif struct roots _static_roots[MAX_ROOT_SETS]; ! # ifndef MSWIN32 struct roots * _root_index[RT_SIZE]; # endif struct exclusion _excl_table[MAX_EXCLUSIONS]; --- 1004,1028 ---- # define MAX_HEAP_SECTS 768 /* Separately added heap sections. */ # endif # else ! # ifdef SMALL_CONFIG ! # define MAX_HEAP_SECTS 128 /* Roughly 1GB */ ! # else ! # define MAX_HEAP_SECTS 384 /* Roughly 3GB */ ! # endif # endif struct HeapSect { ptr_t hs_start; word hs_bytes; } _heap_sects[MAX_HEAP_SECTS]; ! # if defined(MSWIN32) || defined(MSWINCE) ptr_t _heap_bases[MAX_HEAP_SECTS]; /* Start address of memory regions obtained from kernel. */ # endif + # ifdef MSWINCE + word _heap_lengths[MAX_HEAP_SECTS]; + /* Commited lengths of memory regions obtained from kernel. */ + # endif struct roots _static_roots[MAX_ROOT_SETS]; ! # if !defined(MSWIN32) && !defined(MSWINCE) struct roots * _root_index[RT_SIZE]; # endif struct exclusion _excl_table[MAX_EXCLUSIONS]; *************** struct _GC_arrays { *** 1262,1269 **** GC_API GC_FAR struct _GC_arrays GC_arrays; ! # define GC_objfreelist GC_arrays._objfreelist ! # define GC_aobjfreelist GC_arrays._aobjfreelist # define GC_uobjfreelist GC_arrays._uobjfreelist # ifdef ATOMIC_UNCOLLECTABLE # define GC_auobjfreelist GC_arrays._auobjfreelist --- 1041,1051 ---- GC_API GC_FAR struct _GC_arrays GC_arrays; ! # ifndef SEPARATE_GLOBALS ! # define GC_objfreelist GC_arrays._objfreelist ! # define GC_aobjfreelist GC_arrays._aobjfreelist ! # define GC_words_allocd GC_arrays._words_allocd ! # endif # define GC_uobjfreelist GC_arrays._uobjfreelist # ifdef ATOMIC_UNCOLLECTABLE # define GC_auobjfreelist GC_arrays._auobjfreelist *************** GC_API GC_FAR struct _GC_arrays GC_array *** 1278,1286 **** # define GC_obj_map GC_arrays._obj_map # define GC_last_heap_addr GC_arrays._last_heap_addr # define GC_prev_heap_addr GC_arrays._prev_heap_addr - # define GC_words_allocd GC_arrays._words_allocd # define GC_words_wasted GC_arrays._words_wasted # define GC_large_free_bytes GC_arrays._large_free_bytes # define GC_words_finalized GC_arrays._words_finalized # define GC_non_gc_bytes_at_gc GC_arrays._non_gc_bytes_at_gc # define GC_mem_freed GC_arrays._mem_freed --- 1060,1069 ---- # define GC_obj_map GC_arrays._obj_map # define GC_last_heap_addr GC_arrays._last_heap_addr # define GC_prev_heap_addr GC_arrays._prev_heap_addr # define GC_words_wasted GC_arrays._words_wasted # define GC_large_free_bytes GC_arrays._large_free_bytes + # define GC_large_allocd_bytes GC_arrays._large_allocd_bytes + # define GC_max_large_allocd_bytes GC_arrays._max_large_allocd_bytes # define GC_words_finalized GC_arrays._words_finalized # define GC_non_gc_bytes_at_gc GC_arrays._non_gc_bytes_at_gc # define GC_mem_freed GC_arrays._mem_freed *************** GC_API GC_FAR struct _GC_arrays GC_array *** 1296,1304 **** # ifdef USE_MUNMAP # define GC_unmapped_bytes GC_arrays._unmapped_bytes # endif ! # ifdef MSWIN32 # define GC_heap_bases GC_arrays._heap_bases # endif # define GC_static_roots GC_arrays._static_roots # define GC_root_index GC_arrays._root_index # define GC_excl_table GC_arrays._excl_table --- 1079,1090 ---- # ifdef USE_MUNMAP # define GC_unmapped_bytes GC_arrays._unmapped_bytes # endif ! # if defined(MSWIN32) || defined(MSWINCE) # define GC_heap_bases GC_arrays._heap_bases # endif + # ifdef MSWINCE + # define GC_heap_lengths GC_arrays._heap_lengths + # endif # define GC_static_roots GC_arrays._static_roots # define GC_root_index GC_arrays._root_index # define GC_excl_table GC_arrays._excl_table *************** extern struct obj_kind { *** 1345,1354 **** GC_bool ok_init; /* Clear objects before putting them on the free list. */ } GC_obj_kinds[MAXOBJKINDS]; ! # define endGC_obj_kinds (((ptr_t)(&GC_obj_kinds)) + (sizeof GC_obj_kinds)) ! # define end_gc_area ((ptr_t)endGC_arrays == (ptr_t)(&GC_obj_kinds) ? \ ! endGC_obj_kinds : endGC_arrays) /* Predefined kinds: */ # define PTRFREE 0 --- 1131,1157 ---- GC_bool ok_init; /* Clear objects before putting them on the free list. */ } GC_obj_kinds[MAXOBJKINDS]; ! # define beginGC_obj_kinds ((ptr_t)(&GC_obj_kinds)) ! # define endGC_obj_kinds (beginGC_obj_kinds + (sizeof GC_obj_kinds)) ! /* Variables that used to be in GC_arrays, but need to be accessed by */ ! /* inline allocation code. If they were in GC_arrays, the inlined */ ! /* allocation code would include GC_arrays offsets (as it did), which */ ! /* introduce maintenance problems. */ ! ! #ifdef SEPARATE_GLOBALS ! word GC_words_allocd; ! /* Number of words allocated during this collection cycle */ ! ptr_t GC_objfreelist[MAXOBJSZ+1]; ! /* free list for NORMAL objects */ ! # define beginGC_objfreelist ((ptr_t)(&GC_objfreelist)) ! # define endGC_objfreelist (beginGC_objfreelist + sizeof(GC_objfreelist)) ! ! ptr_t GC_aobjfreelist[MAXOBJSZ+1]; ! /* free list for atomic (PTRFREE) objs */ ! # define beginGC_aobjfreelist ((ptr_t)(&GC_aobjfreelist)) ! # define endGC_aobjfreelist (beginGC_aobjfreelist + sizeof(GC_aobjfreelist)) ! #endif /* Predefined kinds: */ # define PTRFREE 0 *************** extern word GC_n_heap_sects; /* Number o *** 1372,1379 **** extern word GC_page_size; ! # ifdef MSWIN32 ! extern word GC_n_heap_bases; /* See GC_heap_bases. */ # endif extern word GC_total_stack_black_listed; --- 1175,1184 ---- extern word GC_page_size; ! # if defined(MSWIN32) || defined(MSWINCE) ! struct _SYSTEM_INFO; ! extern struct _SYSTEM_INFO GC_sysinfo; ! extern word GC_n_heap_bases; /* See GC_heap_bases. */ # endif extern word GC_total_stack_black_listed; *************** extern word GC_black_list_spacing; *** 1386,1392 **** /* "stack-blacklisted", i.e. that are */ /* problematic in the interior of an object. */ ! extern char * GC_invalid_map; /* Pointer to the nowhere valid hblk map */ /* Blocks pointing to this map are free. */ --- 1191,1197 ---- /* "stack-blacklisted", i.e. that are */ /* problematic in the interior of an object. */ ! extern map_entry_type * GC_invalid_map; /* Pointer to the nowhere valid hblk map */ /* Blocks pointing to this map are free. */ *************** extern word GC_root_size; /* Total size *** 1418,1428 **** extern GC_bool GC_debugging_started; /* GC_debug_malloc has been called. */ ! extern ptr_t GC_least_plausible_heap_addr; ! extern ptr_t GC_greatest_plausible_heap_addr; ! /* Bounds on the heap. Guaranteed valid */ ! /* Likely to include future heap expansion. */ ! /* Operations */ # ifndef abs # define abs(x) ((x) < 0? (-(x)) : (x)) --- 1223,1234 ---- extern GC_bool GC_debugging_started; /* GC_debug_malloc has been called. */ ! extern long GC_large_alloc_warn_interval; ! /* Interval between unsuppressed warnings. */ ! ! extern long GC_large_alloc_warn_suppressed; ! /* Number of warnings suppressed so far. */ ! /* Operations */ # ifndef abs # define abs(x) ((x) < 0? (-(x)) : (x)) *************** extern ptr_t GC_greatest_plausible_heap_ *** 1434,1439 **** --- 1240,1272 ---- /* with it. Only those corresponding to the beginning of an */ /* object are used. */ + /* Set mark bit correctly, even if mark bits may be concurrently */ + /* accessed. */ + #ifdef PARALLEL_MARK + # define OR_WORD(addr, bits) \ + { word old; \ + do { \ + old = *((volatile word *)addr); \ + } while (!GC_compare_and_exchange((addr), old, old | (bits))); \ + } + # define OR_WORD_EXIT_IF_SET(addr, bits, exit_label) \ + { word old; \ + word my_bits = (bits); \ + do { \ + old = *((volatile word *)addr); \ + if (old & my_bits) goto exit_label; \ + } while (!GC_compare_and_exchange((addr), old, old | my_bits)); \ + } + #else + # define OR_WORD(addr, bits) *(addr) |= (bits) + # define OR_WORD_EXIT_IF_SET(addr, bits, exit_label) \ + { \ + word old = *(addr); \ + word my_bits = (bits); \ + if (old & my_bits) goto exit_label; \ + *(addr) = (old | my_bits); \ + } + #endif /* Mark bit operations */ *************** extern ptr_t GC_greatest_plausible_heap_ *** 1445,1516 **** * relative to the beginning of the block, including unused words) */ # define mark_bit_from_hdr(hhdr,n) (((hhdr)->hb_marks[divWORDSZ(n)] \ >> (modWORDSZ(n))) & (word)1) ! # define set_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \ ! |= (word)1 << modWORDSZ(n) ! # define clear_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \ &= ~((word)1 << modWORDSZ(n)) /* Important internal collector routines */ ! ptr_t GC_approx_sp(); ! ! GC_bool GC_should_collect(); ! ! void GC_apply_to_all_blocks(/*fn, client_data*/); ! /* Invoke fn(hbp, client_data) for each */ ! /* allocated heap block. */ ! struct hblk * GC_next_used_block(/* struct hblk * h */); ! /* Return first in-use block >= h */ ! struct hblk * GC_prev_block(/* struct hblk * h */); ! /* Return last block <= h. Returned block */ ! /* is managed by GC, but may or may not be in */ /* use. */ ! void GC_mark_init(); ! void GC_clear_marks(); /* Clear mark bits for all heap objects. */ ! void GC_invalidate_mark_state(); /* Tell the marker that marked */ ! /* objects may point to unmarked */ ! /* ones, and roots may point to */ ! /* unmarked objects. */ ! /* Reset mark stack. */ ! void GC_mark_from_mark_stack(); /* Mark from everything on the mark stack. */ ! /* Return after about one pages worth of */ ! /* work. */ ! GC_bool GC_mark_stack_empty(); ! GC_bool GC_mark_some(/* cold_gc_frame */); ! /* Perform about one pages worth of marking */ ! /* work of whatever kind is needed. Returns */ ! /* quickly if no collection is in progress. */ ! /* Return TRUE if mark phase finished. */ ! void GC_initiate_gc(); /* initiate collection. */ ! /* If the mark state is invalid, this */ ! /* becomes full colleection. Otherwise */ ! /* it's partial. */ ! void GC_push_all(/*b,t*/); /* Push everything in a range */ ! /* onto mark stack. */ ! void GC_push_dirty(/*b,t*/); /* Push all possibly changed */ ! /* subintervals of [b,t) onto */ ! /* mark stack. */ #ifndef SMALL_CONFIG ! void GC_push_conditional(/* ptr_t b, ptr_t t, GC_bool all*/); #else # define GC_push_conditional(b, t, all) GC_push_all(b, t) #endif /* Do either of the above, depending */ /* on the third arg. */ ! void GC_push_all_stack(/*b,t*/); /* As above, but consider */ /* interior pointers as valid */ ! void GC_push_all_eager(/*b,t*/); /* Same as GC_push_all_stack, but */ /* ensures that stack is scanned */ /* immediately, not just scheduled */ /* for scanning. */ #ifndef THREADS ! void GC_push_all_stack_partially_eager(/* bottom, top, cold_gc_frame */); /* Similar to GC_push_all_eager, but only the */ /* part hotter than cold_gc_frame is scanned */ ! /* immediately. Needed to endure that callee- */ /* save registers are not missed. */ #else /* In the threads case, we push part of the current thread stack */ --- 1278,1364 ---- * relative to the beginning of the block, including unused words) */ + #ifdef USE_MARK_BYTES + # define mark_bit_from_hdr(hhdr,n) ((hhdr)->hb_marks[(n) >> 1]) + # define set_mark_bit_from_hdr(hhdr,n) ((hhdr)->hb_marks[(n)>>1]) = 1 + # define clear_mark_bit_from_hdr(hhdr,n) ((hhdr)->hb_marks[(n)>>1]) = 0 + #else /* !USE_MARK_BYTES */ # define mark_bit_from_hdr(hhdr,n) (((hhdr)->hb_marks[divWORDSZ(n)] \ >> (modWORDSZ(n))) & (word)1) ! # define set_mark_bit_from_hdr(hhdr,n) \ ! OR_WORD((hhdr)->hb_marks+divWORDSZ(n), \ ! (word)1 << modWORDSZ(n)) # define clear_mark_bit_from_hdr(hhdr,n) (hhdr)->hb_marks[divWORDSZ(n)] \ &= ~((word)1 << modWORDSZ(n)) + #endif /* !USE_MARK_BYTES */ /* Important internal collector routines */ ! ptr_t GC_approx_sp GC_PROTO((void)); ! ! GC_bool GC_should_collect GC_PROTO((void)); ! ! void GC_apply_to_all_blocks GC_PROTO(( \ ! void (*fn) GC_PROTO((struct hblk *h, word client_data)), \ ! word client_data)); ! /* Invoke fn(hbp, client_data) for each */ ! /* allocated heap block. */ ! struct hblk * GC_next_used_block GC_PROTO((struct hblk * h)); ! /* Return first in-use block >= h */ ! struct hblk * GC_prev_block GC_PROTO((struct hblk * h)); ! /* Return last block <= h. Returned block */ ! /* is managed by GC, but may or may not be in */ /* use. */ ! void GC_mark_init GC_PROTO((void)); ! void GC_clear_marks GC_PROTO((void)); /* Clear mark bits for all heap objects. */ ! void GC_invalidate_mark_state GC_PROTO((void)); ! /* Tell the marker that marked */ ! /* objects may point to unmarked */ ! /* ones, and roots may point to */ ! /* unmarked objects. */ ! /* Reset mark stack. */ ! GC_bool GC_mark_stack_empty GC_PROTO((void)); ! GC_bool GC_mark_some GC_PROTO((ptr_t cold_gc_frame)); ! /* Perform about one pages worth of marking */ ! /* work of whatever kind is needed. Returns */ ! /* quickly if no collection is in progress. */ ! /* Return TRUE if mark phase finished. */ ! void GC_initiate_gc GC_PROTO((void)); ! /* initiate collection. */ ! /* If the mark state is invalid, this */ ! /* becomes full colleection. Otherwise */ ! /* it's partial. */ ! void GC_push_all GC_PROTO((ptr_t bottom, ptr_t top)); ! /* Push everything in a range */ ! /* onto mark stack. */ ! void GC_push_selected GC_PROTO(( \ ! ptr_t bottom, \ ! ptr_t top, \ ! int (*dirty_fn) GC_PROTO((struct hblk *h)), \ ! void (*push_fn) GC_PROTO((ptr_t bottom, ptr_t top)) )); ! /* Push all pages h in [b,t) s.t. */ ! /* select_fn(h) != 0 onto mark stack. */ #ifndef SMALL_CONFIG ! void GC_push_conditional GC_PROTO((ptr_t b, ptr_t t, GC_bool all)); #else # define GC_push_conditional(b, t, all) GC_push_all(b, t) #endif /* Do either of the above, depending */ /* on the third arg. */ ! void GC_push_all_stack GC_PROTO((ptr_t b, ptr_t t)); ! /* As above, but consider */ /* interior pointers as valid */ ! void GC_push_all_eager GC_PROTO((ptr_t b, ptr_t t)); ! /* Same as GC_push_all_stack, but */ /* ensures that stack is scanned */ /* immediately, not just scheduled */ /* for scanning. */ #ifndef THREADS ! void GC_push_all_stack_partially_eager GC_PROTO(( \ ! ptr_t bottom, ptr_t top, ptr_t cold_gc_frame )); /* Similar to GC_push_all_eager, but only the */ /* part hotter than cold_gc_frame is scanned */ ! /* immediately. Needed to ensure that callee- */ /* save registers are not missed. */ #else /* In the threads case, we push part of the current thread stack */ *************** void GC_push_all_eager(/*b,t*/); /* S *** 1519,1687 **** /* stacks are scheduled for scanning in *GC_push_other_roots, which */ /* is thread-package-specific. */ #endif ! void GC_push_current_stack(/* ptr_t cold_gc_frame */); ! /* Push enough of the current stack eagerly to */ ! /* ensure that callee-save registers saved in */ ! /* GC frames are scanned. */ ! /* In the non-threads case, schedule entire */ ! /* stack for scanning. */ ! void GC_push_roots(/* GC_bool all, ptr_t cold_gc_frame */); ! /* Push all or dirty roots. */ ! extern void (*GC_push_other_roots)(); ! /* Push system or application specific roots */ ! /* onto the mark stack. In some environments */ ! /* (e.g. threads environments) this is */ ! /* predfined to be non-zero. A client supplied */ ! /* replacement should also call the original */ ! /* function. */ ! extern void (*GC_start_call_back)(/* void */); ! /* Called at start of full collections. */ ! /* Not called if 0. Called with allocation */ ! /* lock held. */ ! /* 0 by default. */ ! void GC_push_regs(); /* Push register contents onto mark stack. */ ! /* If NURSERY is defined, the default push */ ! /* action can be overridden with GC_push_proc */ ! void GC_remark(); /* Mark from all marked objects. Used */ ! /* only if we had to drop something. */ # ifdef NURSERY extern void (*GC_push_proc)(ptr_t); # endif ! # if defined(MSWIN32) ! void __cdecl GC_push_one(); # else ! void GC_push_one(/*p*/); /* If p points to an object, mark it */ /* and push contents on the mark stack */ # endif ! void GC_push_one_checked(/*p*/); /* Ditto, omits plausibility test */ ! void GC_push_marked(/* struct hblk h, hdr * hhdr */); /* Push contents of all marked objects in h onto */ /* mark stack. */ #ifdef SMALL_CONFIG # define GC_push_next_marked_dirty(h) GC_push_next_marked(h) #else ! struct hblk * GC_push_next_marked_dirty(/* h */); /* Invoke GC_push_marked on next dirty block above h. */ /* Return a pointer just past the end of this block. */ #endif /* !SMALL_CONFIG */ ! struct hblk * GC_push_next_marked(/* h */); ! /* Ditto, but also mark from clean pages. */ ! struct hblk * GC_push_next_marked_uncollectable(/* h */); ! /* Ditto, but mark only from uncollectable pages. */ ! GC_bool GC_stopped_mark(); /* Stop world and mark from all roots */ ! /* and rescuers. */ ! void GC_clear_hdr_marks(/* hhdr */); /* Clear the mark bits in a header */ ! void GC_set_hdr_marks(/* hhdr */); /* Set the mark bits in a header */ ! void GC_add_roots_inner(); ! GC_bool GC_is_static_root(/* ptr_t p */); ! /* Is the address p in one of the registered static */ /* root sections? */ ! void GC_register_dynamic_libraries(); ! /* Add dynamic library data sections to the root set. */ ! /* Machine dependent startup routines */ ! ptr_t GC_get_stack_base(); ! void GC_register_data_segments(); ! /* Black listing: */ ! void GC_bl_init(); ! # ifndef ALL_INTERIOR_POINTERS ! void GC_add_to_black_list_normal(/* bits, maybe source */); /* Register bits as a possible future false */ /* reference from the heap or static data */ - # ifdef PRINT_BLACK_LIST - # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ - GC_add_to_black_list_normal(bits, source) - # else # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ ! GC_add_to_black_list_normal(bits) ! # endif # else ! # ifdef PRINT_BLACK_LIST ! # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ ! GC_add_to_black_list_stack(bits, source) ! # else # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ ! GC_add_to_black_list_stack(bits) ! # endif # endif ! void GC_add_to_black_list_stack(/* bits, maybe source */); ! struct hblk * GC_is_black_listed(/* h, len */); ! /* If there are likely to be false references */ ! /* to a block starting at h of the indicated */ ! /* length, then return the next plausible */ ! /* starting location for h that might avoid */ ! /* these false references. */ ! void GC_promote_black_lists(); ! /* Declare an end to a black listing phase. */ ! void GC_unpromote_black_lists(); ! /* Approximately undo the effect of the above. */ ! /* This actually loses some information, but */ ! /* only in a reasonably safe way. */ ! word GC_number_stack_black_listed(/*struct hblk *start, struct hblk *endp1 */); ! /* Return the number of (stack) blacklisted */ ! /* blocks in the range for statistical */ ! /* purposes. */ ! ! ptr_t GC_scratch_alloc(/*bytes*/); ! /* GC internal memory allocation for */ ! /* small objects. Deallocation is not */ ! /* possible. */ ! /* Heap block layout maps: */ ! void GC_invalidate_map(/* hdr */); ! /* Remove the object map associated */ ! /* with the block. This identifies */ ! /* the block as invalid to the mark */ ! /* routines. */ ! GC_bool GC_add_map_entry(/*sz*/); ! /* Add a heap block map for objects of */ ! /* size sz to obj_map. */ ! /* Return FALSE on failure. */ ! void GC_register_displacement_inner(/*offset*/); ! /* Version of GC_register_displacement */ ! /* that assumes lock is already held */ ! /* and signals are already disabled. */ ! /* hblk allocation: */ ! void GC_new_hblk(/*size_in_words, kind*/); ! /* Allocate a new heap block, and build */ ! /* a free list in it. */ ! struct hblk * GC_allochblk(/*size_in_words, kind*/); ! /* Allocate a heap block, clear it if */ ! /* for composite objects, inform */ /* the marker that block is valid */ /* for objects of indicated size. */ ! /* sz < 0 ==> atomic. */ ! void GC_freehblk(); /* Deallocate a heap block and mark it */ ! /* as invalid. */ ! /* Misc GC: */ ! void GC_init_inner(); ! GC_bool GC_expand_hp_inner(); ! void GC_start_reclaim(/*abort_if_found*/); ! /* Restore unmarked objects to free */ ! /* lists, or (if abort_if_found is */ ! /* TRUE) report them. */ ! /* Sweeping of small object pages is */ ! /* largely deferred. */ ! void GC_continue_reclaim(/*size, kind*/); ! /* Sweep pages of the given size and */ ! /* kind, as long as possible, and */ ! /* as long as the corr. free list is */ ! /* empty. */ ! void GC_reclaim_or_delete_all(); ! /* Arrange for all reclaim lists to be */ ! /* empty. Judiciously choose between */ ! /* sweeping and discarding each page. */ ! GC_bool GC_reclaim_all(/* GC_stop_func f*/); ! /* Reclaim all blocks. Abort (in a */ ! /* consistent state) if f returns TRUE. */ ! GC_bool GC_block_empty(/* hhdr */); /* Block completely unmarked? */ ! GC_bool GC_never_stop_func(); /* Returns FALSE. */ ! GC_bool GC_try_to_collect_inner(/* GC_stop_func f */); /* Collect; caller must have acquired */ /* lock and disabled signals. */ /* Collection is aborted if f returns */ --- 1367,1606 ---- /* stacks are scheduled for scanning in *GC_push_other_roots, which */ /* is thread-package-specific. */ #endif ! void GC_push_current_stack GC_PROTO((ptr_t cold_gc_frame)); ! /* Push enough of the current stack eagerly to */ ! /* ensure that callee-save registers saved in */ ! /* GC frames are scanned. */ ! /* In the non-threads case, schedule entire */ ! /* stack for scanning. */ ! void GC_push_roots GC_PROTO((GC_bool all, ptr_t cold_gc_frame)); ! /* Push all or dirty roots. */ ! extern void (*GC_push_other_roots) GC_PROTO((void)); ! /* Push system or application specific roots */ ! /* onto the mark stack. In some environments */ ! /* (e.g. threads environments) this is */ ! /* predfined to be non-zero. A client supplied */ ! /* replacement should also call the original */ ! /* function. */ ! extern void GC_push_gc_structures GC_PROTO((void)); ! /* Push GC internal roots. These are normally */ ! /* included in the static data segment, and */ ! /* Thus implicitly pushed. But we must do this */ ! /* explicitly if normal root processing is */ ! /* disabled. Calls the following: */ ! extern void GC_push_finalizer_structures GC_PROTO((void)); ! extern void GC_push_stubborn_structures GC_PROTO((void)); ! # ifdef THREADS ! extern void GC_push_thread_structures GC_PROTO((void)); ! # endif ! extern void (*GC_start_call_back) GC_PROTO((void)); ! /* Called at start of full collections. */ ! /* Not called if 0. Called with allocation */ ! /* lock held. */ ! /* 0 by default. */ ! # if defined(USE_GENERIC_PUSH_REGS) ! void GC_generic_push_regs GC_PROTO((ptr_t cold_gc_frame)); ! # else ! void GC_push_regs GC_PROTO((void)); ! # endif ! /* Push register contents onto mark stack. */ ! /* If NURSERY is defined, the default push */ ! /* action can be overridden with GC_push_proc */ # ifdef NURSERY extern void (*GC_push_proc)(ptr_t); # endif ! # if defined(MSWIN32) || defined(MSWINCE) ! void __cdecl GC_push_one GC_PROTO((word p)); # else ! void GC_push_one GC_PROTO((word p)); ! /* If p points to an object, mark it */ /* and push contents on the mark stack */ + /* Pointer recognition test always */ + /* accepts interior pointers, i.e. this */ + /* is appropriate for pointers found on */ + /* stack. */ # endif ! # if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS) ! void GC_mark_and_push_stack GC_PROTO((word p, ptr_t source)); ! /* Ditto, omits plausibility test */ ! # else ! void GC_mark_and_push_stack GC_PROTO((word p)); ! # endif ! void GC_push_marked GC_PROTO((struct hblk * h, hdr * hhdr)); /* Push contents of all marked objects in h onto */ /* mark stack. */ #ifdef SMALL_CONFIG # define GC_push_next_marked_dirty(h) GC_push_next_marked(h) #else ! struct hblk * GC_push_next_marked_dirty GC_PROTO((struct hblk * h)); /* Invoke GC_push_marked on next dirty block above h. */ /* Return a pointer just past the end of this block. */ #endif /* !SMALL_CONFIG */ ! struct hblk * GC_push_next_marked GC_PROTO((struct hblk * h)); ! /* Ditto, but also mark from clean pages. */ ! struct hblk * GC_push_next_marked_uncollectable GC_PROTO((struct hblk * h)); ! /* Ditto, but mark only from uncollectable pages. */ ! GC_bool GC_stopped_mark GC_PROTO((GC_stop_func stop_func)); ! /* Stop world and mark from all roots */ ! /* and rescuers. */ ! void GC_clear_hdr_marks GC_PROTO((hdr * hhdr)); ! /* Clear the mark bits in a header */ ! void GC_set_hdr_marks GC_PROTO((hdr * hhdr)); ! /* Set the mark bits in a header */ ! void GC_set_fl_marks GC_PROTO((ptr_t p)); ! /* Set all mark bits associated with */ ! /* a free list. */ ! void GC_add_roots_inner GC_PROTO((char * b, char * e, GC_bool tmp)); ! GC_bool GC_is_static_root GC_PROTO((ptr_t p)); ! /* Is the address p in one of the registered static */ ! /* root sections? */ ! # if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) ! GC_bool GC_is_tmp_root GC_PROTO((ptr_t p)); ! /* Is the address p in one of the temporary static */ /* root sections? */ ! # endif ! void GC_register_dynamic_libraries GC_PROTO((void)); ! /* Add dynamic library data sections to the root set. */ ! /* Machine dependent startup routines */ ! ptr_t GC_get_stack_base GC_PROTO((void)); /* Cold end of stack */ ! #ifdef IA64 ! ptr_t GC_get_register_stack_base GC_PROTO((void)); ! /* Cold end of register stack. */ ! #endif ! void GC_register_data_segments GC_PROTO((void)); ! /* Black listing: */ ! void GC_bl_init GC_PROTO((void)); ! # ifdef PRINT_BLACK_LIST ! void GC_add_to_black_list_normal GC_PROTO((word p, ptr_t source)); /* Register bits as a possible future false */ /* reference from the heap or static data */ # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ ! if (GC_all_interior_pointers) { \ ! GC_add_to_black_list_stack(bits, (ptr_t)(source)); \ ! } else { \ ! GC_add_to_black_list_normal(bits, (ptr_t)(source)); \ ! } # else ! void GC_add_to_black_list_normal GC_PROTO((word p)); # define GC_ADD_TO_BLACK_LIST_NORMAL(bits, source) \ ! if (GC_all_interior_pointers) { \ ! GC_add_to_black_list_stack(bits); \ ! } else { \ ! GC_add_to_black_list_normal(bits); \ ! } # endif ! # ifdef PRINT_BLACK_LIST ! void GC_add_to_black_list_stack GC_PROTO((word p, ptr_t source)); ! # else ! void GC_add_to_black_list_stack GC_PROTO((word p)); ! # endif ! struct hblk * GC_is_black_listed GC_PROTO((struct hblk * h, word len)); ! /* If there are likely to be false references */ ! /* to a block starting at h of the indicated */ ! /* length, then return the next plausible */ ! /* starting location for h that might avoid */ ! /* these false references. */ ! void GC_promote_black_lists GC_PROTO((void)); ! /* Declare an end to a black listing phase. */ ! void GC_unpromote_black_lists GC_PROTO((void)); ! /* Approximately undo the effect of the above. */ ! /* This actually loses some information, but */ ! /* only in a reasonably safe way. */ ! word GC_number_stack_black_listed GC_PROTO(( \ ! struct hblk *start, struct hblk *endp1)); ! /* Return the number of (stack) blacklisted */ ! /* blocks in the range for statistical */ ! /* purposes. */ ! ! ptr_t GC_scratch_alloc GC_PROTO((word bytes)); ! /* GC internal memory allocation for */ ! /* small objects. Deallocation is not */ ! /* possible. */ ! /* Heap block layout maps: */ ! void GC_invalidate_map GC_PROTO((hdr * hhdr)); ! /* Remove the object map associated */ ! /* with the block. This identifies */ ! /* the block as invalid to the mark */ ! /* routines. */ ! GC_bool GC_add_map_entry GC_PROTO((word sz)); ! /* Add a heap block map for objects of */ ! /* size sz to obj_map. */ ! /* Return FALSE on failure. */ ! void GC_register_displacement_inner GC_PROTO((word offset)); ! /* Version of GC_register_displacement */ ! /* that assumes lock is already held */ ! /* and signals are already disabled. */ ! /* hblk allocation: */ ! void GC_new_hblk GC_PROTO((word size_in_words, int kind)); ! /* Allocate a new heap block, and build */ ! /* a free list in it. */ ! ! ptr_t GC_build_fl GC_PROTO((struct hblk *h, word sz, ! GC_bool clear, ptr_t list)); ! /* Build a free list for objects of */ ! /* size sz in block h. Append list to */ ! /* end of the free lists. Possibly */ ! /* clear objects on the list. Normally */ ! /* called by GC_new_hblk, but also */ ! /* called explicitly without GC lock. */ ! ! struct hblk * GC_allochblk GC_PROTO(( \ ! word size_in_words, int kind, unsigned flags)); ! /* Allocate a heap block, inform */ /* the marker that block is valid */ /* for objects of indicated size. */ ! ! ptr_t GC_alloc_large GC_PROTO((word lw, int k, unsigned flags)); ! /* Allocate a large block of size lw words. */ ! /* The block is not cleared. */ ! /* Flags is 0 or IGNORE_OFF_PAGE. */ ! /* Calls GC_allchblk to do the actual */ ! /* allocation, but also triggers GC and/or */ ! /* heap expansion as appropriate. */ ! /* Does not update GC_words_allocd, but does */ ! /* other accounting. */ ! ! ptr_t GC_alloc_large_and_clear GC_PROTO((word lw, int k, unsigned flags)); ! /* As above, but clear block if appropriate */ ! /* for kind k. */ ! ! void GC_freehblk GC_PROTO((struct hblk * p)); ! /* Deallocate a heap block and mark it */ ! /* as invalid. */ ! /* Misc GC: */ ! void GC_init_inner GC_PROTO((void)); ! GC_bool GC_expand_hp_inner GC_PROTO((word n)); ! void GC_start_reclaim GC_PROTO((int abort_if_found)); ! /* Restore unmarked objects to free */ ! /* lists, or (if abort_if_found is */ ! /* TRUE) report them. */ ! /* Sweeping of small object pages is */ ! /* largely deferred. */ ! void GC_continue_reclaim GC_PROTO((word sz, int kind)); ! /* Sweep pages of the given size and */ ! /* kind, as long as possible, and */ ! /* as long as the corr. free list is */ ! /* empty. */ ! void GC_reclaim_or_delete_all GC_PROTO((void)); ! /* Arrange for all reclaim lists to be */ ! /* empty. Judiciously choose between */ ! /* sweeping and discarding each page. */ ! GC_bool GC_reclaim_all GC_PROTO((GC_stop_func stop_func, GC_bool ignore_old)); ! /* Reclaim all blocks. Abort (in a */ ! /* consistent state) if f returns TRUE. */ ! GC_bool GC_block_empty GC_PROTO((hdr * hhdr)); ! /* Block completely unmarked? */ ! GC_bool GC_never_stop_func GC_PROTO((void)); ! /* Returns FALSE. */ ! GC_bool GC_try_to_collect_inner GC_PROTO((GC_stop_func f)); ! /* Collect; caller must have acquired */ /* lock and disabled signals. */ /* Collection is aborted if f returns */ *************** GC_bool GC_try_to_collect_inner(/* GC_st *** 1689,1776 **** /* successfully. */ # define GC_gcollect_inner() \ (void) GC_try_to_collect_inner(GC_never_stop_func) ! void GC_finish_collection(); /* Finish collection. Mark bits are */ ! /* consistent and lock is still held. */ ! GC_bool GC_collect_or_expand(/* needed_blocks */); ! /* Collect or expand heap in an attempt */ ! /* make the indicated number of free */ ! /* blocks available. Should be called */ ! /* until the blocks are available or */ ! /* until it fails by returning FALSE. */ ! GC_API void GC_init(); /* Initialize collector. */ ! void GC_collect_a_little_inner(/* int n */); ! /* Do n units worth of garbage */ ! /* collection work, if appropriate. */ ! /* A unit is an amount appropriate for */ ! /* HBLKSIZE bytes of allocation. */ ! ptr_t GC_generic_malloc(/* bytes, kind */); ! /* Allocate an object of the given */ ! /* kind. By default, there are only */ ! /* a few kinds: composite(pointerfree), */ /* atomic, uncollectable, etc. */ /* We claim it's possible for clever */ /* client code that understands GC */ /* internals to add more, e.g. to */ /* communicate object layout info */ /* to the collector. */ ! ptr_t GC_generic_malloc_ignore_off_page(/* bytes, kind */); ! /* As above, but pointers past the */ ! /* first page of the resulting object */ ! /* are ignored. */ ! ptr_t GC_generic_malloc_inner(/* bytes, kind */); ! /* Ditto, but I already hold lock, etc. */ ! ptr_t GC_generic_malloc_words_small GC_PROTO((size_t words, int kind)); ! /* As above, but size in units of words */ ! /* Bypasses MERGE_SIZES. Assumes */ ! /* words <= MAXOBJSZ. */ ! ptr_t GC_generic_malloc_inner_ignore_off_page(/* bytes, kind */); ! /* Allocate an object, where */ ! /* the client guarantees that there */ ! /* will always be a pointer to the */ ! /* beginning of the object while the */ ! /* object is live. */ ! ptr_t GC_allocobj(/* sz_inn_words, kind */); ! /* Make the indicated */ ! /* free list nonempty, and return its */ ! /* head. */ ! void GC_init_headers(); ! struct hblkhdr * GC_install_header(/*h*/); ! /* Install a header for block h. */ ! /* Return 0 on failure, or the header */ ! /* otherwise. */ ! GC_bool GC_install_counts(/*h, sz*/); ! /* Set up forwarding counts for block */ ! /* h of size sz. */ ! /* Return FALSE on failure. */ ! void GC_remove_header(/*h*/); ! /* Remove the header for block h. */ ! void GC_remove_counts(/*h, sz*/); ! /* Remove forwarding counts for h. */ ! hdr * GC_find_header(/*p*/); /* Debugging only. */ ! void GC_finalize(); /* Perform all indicated finalization actions */ ! /* on unmarked objects. */ ! /* Unreachable finalizable objects are enqueued */ ! /* for processing by GC_invoke_finalizers. */ ! /* Invoked with lock. */ ! ! void GC_add_to_heap(/*p, bytes*/); ! /* Add a HBLKSIZE aligned chunk to the heap. */ - void GC_print_obj(/* ptr_t p */); - /* P points to somewhere inside an object with */ - /* debugging info. Print a human readable */ - /* description of the object to stderr. */ - extern void (*GC_check_heap)(); - /* Check that all objects in the heap with */ - /* debugging info are intact. Print */ - /* descriptions of any that are not. */ - extern void (*GC_print_heap_obj)(/* ptr_t p */); - /* If possible print s followed by a more */ - /* detailed description of the object */ - /* referred to by p. */ - /* Memory unmapping: */ #ifdef USE_MUNMAP void GC_unmap_old(void); --- 1608,1739 ---- /* successfully. */ # define GC_gcollect_inner() \ (void) GC_try_to_collect_inner(GC_never_stop_func) ! void GC_finish_collection GC_PROTO((void)); ! /* Finish collection. Mark bits are */ ! /* consistent and lock is still held. */ ! GC_bool GC_collect_or_expand GC_PROTO(( \ ! word needed_blocks, GC_bool ignore_off_page)); ! /* Collect or expand heap in an attempt */ ! /* make the indicated number of free */ ! /* blocks available. Should be called */ ! /* until the blocks are available or */ ! /* until it fails by returning FALSE. */ ! ! #if defined(MSWIN32) || defined(MSWINCE) ! void GC_deinit GC_PROTO((void)); ! /* Free any resources allocated by */ ! /* GC_init */ ! #endif ! ! void GC_collect_a_little_inner GC_PROTO((int n)); ! /* Do n units worth of garbage */ ! /* collection work, if appropriate. */ ! /* A unit is an amount appropriate for */ ! /* HBLKSIZE bytes of allocation. */ ! ptr_t GC_generic_malloc GC_PROTO((word lb, int k)); ! /* Allocate an object of the given */ ! /* kind. By default, there are only */ ! /* a few kinds: composite(pointerfree), */ /* atomic, uncollectable, etc. */ /* We claim it's possible for clever */ /* client code that understands GC */ /* internals to add more, e.g. to */ /* communicate object layout info */ /* to the collector. */ ! ptr_t GC_generic_malloc_ignore_off_page GC_PROTO((size_t b, int k)); ! /* As above, but pointers past the */ ! /* first page of the resulting object */ ! /* are ignored. */ ! ptr_t GC_generic_malloc_inner GC_PROTO((word lb, int k)); ! /* Ditto, but I already hold lock, etc. */ ! ptr_t GC_generic_malloc_words_small GC_PROTO((size_t lw, int k)); ! /* As above, but size in units of words */ ! /* Bypasses MERGE_SIZES. Assumes */ ! /* words <= MAXOBJSZ. */ ! ptr_t GC_generic_malloc_inner_ignore_off_page GC_PROTO((size_t lb, int k)); ! /* Allocate an object, where */ ! /* the client guarantees that there */ ! /* will always be a pointer to the */ ! /* beginning of the object while the */ ! /* object is live. */ ! ptr_t GC_allocobj GC_PROTO((word sz, int kind)); ! /* Make the indicated */ ! /* free list nonempty, and return its */ ! /* head. */ ! ! void GC_init_headers GC_PROTO((void)); ! struct hblkhdr * GC_install_header GC_PROTO((struct hblk *h)); ! /* Install a header for block h. */ ! /* Return 0 on failure, or the header */ ! /* otherwise. */ ! GC_bool GC_install_counts GC_PROTO((struct hblk * h, word sz)); ! /* Set up forwarding counts for block */ ! /* h of size sz. */ ! /* Return FALSE on failure. */ ! void GC_remove_header GC_PROTO((struct hblk * h)); ! /* Remove the header for block h. */ ! void GC_remove_counts GC_PROTO((struct hblk * h, word sz)); ! /* Remove forwarding counts for h. */ ! hdr * GC_find_header GC_PROTO((ptr_t h)); /* Debugging only. */ ! ! void GC_finalize GC_PROTO((void)); ! /* Perform all indicated finalization actions */ ! /* on unmarked objects. */ ! /* Unreachable finalizable objects are enqueued */ ! /* for processing by GC_invoke_finalizers. */ ! /* Invoked with lock. */ ! void GC_notify_or_invoke_finalizers GC_PROTO((void)); ! /* If GC_finalize_on_demand is not set, invoke */ ! /* eligible finalizers. Otherwise: */ ! /* Call *GC_finalizer_notifier if there are */ ! /* finalizers to be run, and we haven't called */ ! /* this procedure yet this GC cycle. */ ! ! void GC_add_to_heap GC_PROTO((struct hblk *p, word bytes)); ! /* Add a HBLKSIZE aligned chunk to the heap. */ ! ! void GC_print_obj GC_PROTO((ptr_t p)); ! /* P points to somewhere inside an object with */ ! /* debugging info. Print a human readable */ ! /* description of the object to stderr. */ ! extern void (*GC_check_heap) GC_PROTO((void)); ! /* Check that all objects in the heap with */ ! /* debugging info are intact. Print */ ! /* descriptions of any that are not. */ ! extern void (*GC_print_heap_obj) GC_PROTO((ptr_t p)); ! /* If possible print s followed by a more */ ! /* detailed description of the object */ ! /* referred to by p. */ ! extern GC_bool GC_print_stats; /* Produce at least some logging output */ ! /* Set from environment variable. */ ! ! /* Macros used for collector internal allocation. */ ! /* These assume the collector lock is held. */ ! #ifdef DBG_HDRS_ALL ! extern GC_PTR GC_debug_generic_malloc_inner(size_t lb, int k); ! extern GC_PTR GC_debug_generic_malloc_inner_ignore_off_page(size_t lb, ! int k); ! # define GC_INTERNAL_MALLOC GC_debug_generic_malloc_inner ! # define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE \ ! GC_debug_generic_malloc_inner_ignore_off_page ! # ifdef THREADS ! # define GC_INTERNAL_FREE GC_debug_free_inner ! # else ! # define GC_INTERNAL_FREE GC_debug_free ! # endif ! #else ! # define GC_INTERNAL_MALLOC GC_generic_malloc_inner ! # define GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE \ ! GC_generic_malloc_inner_ignore_off_page ! # ifdef THREADS ! # define GC_INTERNAL_FREE GC_free_inner ! # else ! # define GC_INTERNAL_FREE GC_free ! # endif ! #endif /* Memory unmapping: */ #ifdef USE_MUNMAP void GC_unmap_old(void); *************** extern void (*GC_print_heap_obj)(/* ptr_ *** 1782,1816 **** /* Virtual dirty bit implementation: */ /* Each implementation exports the following: */ ! void GC_read_dirty(); /* Retrieve dirty bits. */ ! GC_bool GC_page_was_dirty(/* struct hblk * h */); ! /* Read retrieved dirty bits. */ ! GC_bool GC_page_was_ever_dirty(/* struct hblk * h */); ! /* Could the page contain valid heap pointers? */ ! void GC_is_fresh(/* struct hblk * h, word number_of_blocks */); ! /* Assert the region currently contains no */ ! /* valid pointers. */ ! void GC_write_hint(/* struct hblk * h */); ! /* h is about to be written. */ ! void GC_dirty_init(); ! /* Slow/general mark bit manipulation: */ ! GC_API GC_bool GC_is_marked(); ! void GC_clear_mark_bit(); ! void GC_set_mark_bit(); ! /* Stubborn objects: */ ! void GC_read_changed(); /* Analogous to GC_read_dirty */ ! GC_bool GC_page_was_changed(/* h */); /* Analogous to GC_page_was_dirty */ ! void GC_clean_changing_list(); /* Collect obsolete changing list entries */ ! void GC_stubborn_init(); ! /* Debugging print routines: */ ! void GC_print_block_list(); ! void GC_print_hblkfreelist(); ! void GC_print_heap_sects(); ! void GC_print_static_roots(); ! void GC_dump(); #ifdef KEEP_BACK_PTRS void GC_store_back_pointer(ptr_t source, ptr_t dest); --- 1745,1786 ---- /* Virtual dirty bit implementation: */ /* Each implementation exports the following: */ ! void GC_read_dirty GC_PROTO((void)); ! /* Retrieve dirty bits. */ ! GC_bool GC_page_was_dirty GC_PROTO((struct hblk *h)); ! /* Read retrieved dirty bits. */ ! GC_bool GC_page_was_ever_dirty GC_PROTO((struct hblk *h)); ! /* Could the page contain valid heap pointers? */ ! void GC_is_fresh GC_PROTO((struct hblk *h, word n)); ! /* Assert the region currently contains no */ ! /* valid pointers. */ ! void GC_remove_protection GC_PROTO((struct hblk *h, word nblocks, ! GC_bool pointerfree)); ! /* h is about to be writteni or allocated. Ensure */ ! /* that it's not write protected by the virtual */ ! /* dirty bit implementation. */ ! ! void GC_dirty_init GC_PROTO((void)); ! /* Slow/general mark bit manipulation: */ ! GC_API GC_bool GC_is_marked GC_PROTO((ptr_t p)); ! void GC_clear_mark_bit GC_PROTO((ptr_t p)); ! void GC_set_mark_bit GC_PROTO((ptr_t p)); ! /* Stubborn objects: */ ! void GC_read_changed GC_PROTO((void)); /* Analogous to GC_read_dirty */ ! GC_bool GC_page_was_changed GC_PROTO((struct hblk * h)); ! /* Analogous to GC_page_was_dirty */ ! void GC_clean_changing_list GC_PROTO((void)); ! /* Collect obsolete changing list entries */ ! void GC_stubborn_init GC_PROTO((void)); ! /* Debugging print routines: */ ! void GC_print_block_list GC_PROTO((void)); ! void GC_print_hblkfreelist GC_PROTO((void)); ! void GC_print_heap_sects GC_PROTO((void)); ! void GC_print_static_roots GC_PROTO((void)); ! void GC_dump GC_PROTO((void)); #ifdef KEEP_BACK_PTRS void GC_store_back_pointer(ptr_t source, ptr_t dest); *************** void GC_dump(); *** 1824,1838 **** /* Make arguments appear live to compiler */ # ifdef __WATCOMC__ ! void GC_noop(void*, ...); # else ! GC_API void GC_noop(); # endif ! void GC_noop1(/* word arg */); /* Logging and diagnostic output: */ ! GC_API void GC_printf GC_PROTO((char * format, long, long, long, long, long, long)); /* A version of printf that doesn't allocate, */ /* is restricted to long arguments, and */ /* (unfortunately) doesn't use varargs for */ --- 1794,1812 ---- /* Make arguments appear live to compiler */ # ifdef __WATCOMC__ ! void GC_noop(void*, ...); # else ! # ifdef __DMC__ ! GC_API void GC_noop(...); ! # else ! GC_API void GC_noop(); ! # endif # endif ! void GC_noop1 GC_PROTO((word)); /* Logging and diagnostic output: */ ! GC_API void GC_printf GC_PROTO((GC_CONST char * format, long, long, long, long, long, long)); /* A version of printf that doesn't allocate, */ /* is restricted to long arguments, and */ /* (unfortunately) doesn't use varargs for */ *************** GC_API void GC_printf GC_PROTO((char * f *** 1851,1857 **** # define GC_printf6(f,a,b,c,d,e,g) GC_printf(f, (long)a, (long)b, (long)c, \ (long)d, (long)e, (long)g) ! void GC_err_printf(/* format, a, b, c, d, e, f */); # define GC_err_printf0(f) GC_err_puts(f) # define GC_err_printf1(f,a) GC_err_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l) # define GC_err_printf2(f,a,b) GC_err_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l) --- 1825,1831 ---- # define GC_printf6(f,a,b,c,d,e,g) GC_printf(f, (long)a, (long)b, (long)c, \ (long)d, (long)e, (long)g) ! GC_API void GC_err_printf GC_PROTO((GC_CONST char * format, long, long, long, long, long, long)); # define GC_err_printf0(f) GC_err_puts(f) # define GC_err_printf1(f,a) GC_err_printf(f, (long)a, 0l, 0l, 0l, 0l, 0l) # define GC_err_printf2(f,a,b) GC_err_printf(f, (long)a, (long)b, 0l, 0l, 0l, 0l) *************** void GC_err_printf(/* format, a, b, c, d *** 1867,1884 **** (long)e, (long)g) /* Ditto, writes to stderr. */ ! void GC_err_puts(/* char *s */); /* Write s to stderr, don't buffer, don't add */ /* newlines, don't ... */ ! # ifdef GC_ASSERTIONS # define GC_ASSERT(expr) if(!(expr)) {\ GC_err_printf2("Assertion failure: %s:%ld\n", \ __FILE__, (unsigned long)__LINE__); \ ABORT("assertion failure"); } ! # else # define GC_ASSERT(expr) # endif # endif /* GC_PRIVATE_H */ --- 1841,1925 ---- (long)e, (long)g) /* Ditto, writes to stderr. */ ! void GC_err_puts GC_PROTO((GC_CONST char *s)); /* Write s to stderr, don't buffer, don't add */ /* newlines, don't ... */ + #if defined(LINUX) && !defined(SMALL_CONFIG) + void GC_err_write GC_PROTO((GC_CONST char *buf, size_t len)); + /* Write buf to stderr, don't buffer, don't add */ + /* newlines, don't ... */ + #endif + ! # ifdef GC_ASSERTIONS # define GC_ASSERT(expr) if(!(expr)) {\ GC_err_printf2("Assertion failure: %s:%ld\n", \ __FILE__, (unsigned long)__LINE__); \ ABORT("assertion failure"); } ! # else # define GC_ASSERT(expr) + # endif + + # if defined(PARALLEL_MARK) || defined(THREAD_LOCAL_ALLOC) + /* We need additional synchronization facilities from the thread */ + /* support. We believe these are less performance critical */ + /* than the main garbage collector lock; standard pthreads-based */ + /* implementations should be sufficient. */ + + /* The mark lock and condition variable. If the GC lock is also */ + /* acquired, the GC lock must be acquired first. The mark lock is */ + /* used to both protect some variables used by the parallel */ + /* marker, and to protect GC_fl_builder_count, below. */ + /* GC_notify_all_marker() is called when */ + /* the state of the parallel marker changes */ + /* in some significant way (see gc_mark.h for details). The */ + /* latter set of events includes incrementing GC_mark_no. */ + /* GC_notify_all_builder() is called when GC_fl_builder_count */ + /* reaches 0. */ + + extern void GC_acquire_mark_lock(); + extern void GC_release_mark_lock(); + extern void GC_notify_all_builder(); + /* extern void GC_wait_builder(); */ + extern void GC_wait_for_reclaim(); + + extern word GC_fl_builder_count; /* Protected by mark lock. */ + # endif /* PARALLEL_MARK || THREAD_LOCAL_ALLOC */ + # ifdef PARALLEL_MARK + extern void GC_notify_all_marker(); + extern void GC_wait_marker(); + extern word GC_mark_no; /* Protected by mark lock. */ + + extern void GC_help_marker(word my_mark_no); + /* Try to help out parallel marker for mark cycle */ + /* my_mark_no. Returns if the mark cycle finishes or */ + /* was already done, or there was nothing to do for */ + /* some other reason. */ + # endif /* PARALLEL_MARK */ + + # if defined(GC_PTHREADS) && !defined(GC_SOLARIS_THREADS) + /* We define the thread suspension signal here, so that we can refer */ + /* to it in the dirty bit implementation, if necessary. Ideally we */ + /* would allocate a (real-time ?) signal using the standard mechanism.*/ + /* unfortunately, there is no standard mechanism. (There is one */ + /* in Linux glibc, but it's not exported.) Thus we continue to use */ + /* the same hard-coded signals we've always used. */ + # if !defined(SIG_SUSPEND) + # if defined(GC_LINUX_THREADS) + # if defined(SPARC) && !defined(SIGPWR) + /* SPARC/Linux doesn't properly define SIGPWR in . + * It is aliased to SIGLOST in asm/signal.h, though. */ + # define SIG_SUSPEND SIGLOST + # else + /* Linuxthreads itself uses SIGUSR1 and SIGUSR2. */ + # define SIG_SUSPEND SIGPWR + # endif + # else /* !GC_LINUX_THREADS */ + # define SIG_SUSPEND _SIGRTMIN + 6 # endif + # endif /* !SIG_SUSPEND */ + + # endif # endif /* GC_PRIVATE_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/gcconfig.h gcc-3.1/boehm-gc/include/private/gcconfig.h *** gcc-3.0.4/boehm-gc/include/private/gcconfig.h Sat May 6 23:59:01 2000 --- gcc-3.1/boehm-gc/include/private/gcconfig.h Mon Apr 22 06:05:04 2002 *************** *** 2,7 **** --- 2,8 ---- * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996 by Silicon Graphics. All rights reserved. + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 27,33 **** --- 28,56 ---- # define LINUX # endif + /* And one for NetBSD: */ + # if defined(__NetBSD__) + # define NETBSD + # endif + + /* And one for OpenBSD: */ + # if defined(__OpenBSD__) + # define OPENBSD + # endif + + /* And one for FreeBSD: */ + # if defined(__FreeBSD__) + # define FREEBSD + # endif + /* Determine the machine type: */ + # if defined(__XSCALE__) + # define ARM32 + # if !defined(LINUX) + # define NOSYS + # define mach_type_known + # endif + # endif # if defined(sun) && defined(mc68000) # define M68K # define SUNOS4 *************** *** 38,61 **** # define HP # define mach_type_known # endif ! # if defined(__OpenBSD__) && defined(m68k) # define M68K - # define OPENBSD # define mach_type_known # endif ! # if defined(__OpenBSD__) && defined(__sparc__) # define SPARC - # define OPENBSD # define mach_type_known # endif ! # if defined(__NetBSD__) && defined(m68k) # define M68K - # define NETBSD # define mach_type_known # endif ! # if defined(__NetBSD__) && defined(arm32) # define ARM32 - # define NETBSD # define mach_type_known # endif # if defined(vax) --- 61,84 ---- # define HP # define mach_type_known # endif ! # if defined(OPENBSD) && defined(m68k) # define M68K # define mach_type_known # endif ! # if defined(OPENBSD) && defined(__sparc__) # define SPARC # define mach_type_known # endif ! # if defined(NETBSD) && defined(m68k) # define M68K # define mach_type_known # endif ! # if defined(NETBSD) && defined(__powerpc__) ! # define POWERPC ! # define mach_type_known ! # endif ! # if defined(NETBSD) && defined(__arm32__) # define ARM32 # define mach_type_known # endif # if defined(vax) *************** *** 67,75 **** # endif # define mach_type_known # endif ! # if defined(mips) || defined(__mips) # define MIPS ! # if !defined(LINUX) # if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__) # define ULTRIX # else --- 90,101 ---- # endif # define mach_type_known # endif ! # if defined(mips) || defined(__mips) || defined(_mips) # define MIPS ! # if defined(nec_ews) || defined(_nec_ews) ! # define EWS4800 ! # endif ! # if !defined(LINUX) && !defined(EWS4800) # if defined(ultrix) || defined(__ultrix) || defined(__NetBSD__) # define ULTRIX # else *************** *** 81,94 **** # endif # endif # endif /* !LINUX */ # define mach_type_known # endif ! # if defined(sequent) && defined(i386) # define I386 # define SEQUENT # define mach_type_known # endif ! # if defined(sun) && defined(i386) # define I386 # define SUNOS5 # define mach_type_known --- 107,123 ---- # endif # endif # endif /* !LINUX */ + # if defined(__NetBSD__) && defined(__MIPSEL__) + # undef ULTRIX + # endif # define mach_type_known # endif ! # if defined(sequent) && (defined(i386) || defined(__i386__)) # define I386 # define SEQUENT # define mach_type_known # endif ! # if defined(sun) && (defined(i386) || defined(__i386__)) # define I386 # define SUNOS5 # define mach_type_known *************** *** 114,120 **** # define mach_type_known # endif # if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \ ! && !defined(__OpenBSD__) # define SPARC # define DRSNX # define mach_type_known --- 143,149 ---- # define mach_type_known # endif # if defined(sparc) && defined(unix) && !defined(sun) && !defined(linux) \ ! && !defined(__OpenBSD__) && !(__NetBSD__) # define SPARC # define DRSNX # define mach_type_known *************** *** 123,128 **** --- 152,161 ---- # define RS6000 # define mach_type_known # endif + # if defined(__NetBSD__) && defined(__sparc__) + # define SPARC + # define mach_type_known + # endif # if defined(_M_XENIX) && defined(_M_SYSV) && defined(_M_I386) /* The above test may need refinement */ # define I386 *************** *** 146,151 **** --- 179,194 ---- # endif # define mach_type_known # endif + # if defined(__ia64) && defined(_HPUX_SOURCE) + # define IA64 + # define HPUX + # define mach_type_known + # endif + # if defined(__BEOS__) && defined(_X86_) + # define I386 + # define BEOS + # define mach_type_known + # endif # if defined(LINUX) && (defined(i386) || defined(__i386__)) # define I386 # define mach_type_known *************** *** 154,160 **** # define IA64 # define mach_type_known # endif ! # if defined(LINUX) && defined(powerpc) # define POWERPC # define mach_type_known # endif --- 197,203 ---- # define IA64 # define mach_type_known # endif ! # if defined(LINUX) && (defined(powerpc) || defined(__powerpc__)) # define POWERPC # define mach_type_known # endif *************** *** 166,178 **** # define SPARC # define mach_type_known # endif ! # if defined(LINUX) && defined(arm) # define ARM32 # define mach_type_known # endif # if defined(__alpha) || defined(__alpha__) # define ALPHA ! # if !defined(LINUX) # define OSF1 /* a.k.a Digital Unix */ # endif # define mach_type_known --- 209,225 ---- # define SPARC # define mach_type_known # endif ! # if defined(LINUX) && defined(__arm__) # define ARM32 # define mach_type_known # endif + # if defined(LINUX) && defined(__sh__) + # define SH + # define mach_type_known + # endif # if defined(__alpha) || defined(__alpha__) # define ALPHA ! # if !defined(LINUX) && !defined(NETBSD) && !defined(OPENBSD) && !defined(FREEBSD) # define OSF1 /* a.k.a Digital Unix */ # endif # define mach_type_known *************** *** 194,230 **** # define MACOS # define mach_type_known # endif ! # if defined(macosx) # define MACOSX # define POWERPC # define mach_type_known # endif # if defined(NeXT) && defined(mc68000) # define M68K # define NEXT # define mach_type_known # endif ! # if defined(NeXT) && defined(i386) # define I386 # define NEXT # define mach_type_known # endif ! # if defined(__OpenBSD__) && defined(i386) # define I386 # define OPENBSD # define mach_type_known # endif ! # if defined(__FreeBSD__) && defined(i386) # define I386 - # define FREEBSD # define mach_type_known # endif ! # if defined(__NetBSD__) && defined(i386) # define I386 - # define NETBSD # define mach_type_known # endif ! # if defined(bsdi) && defined(i386) # define I386 # define BSDI # define mach_type_known --- 241,281 ---- # define MACOS # define mach_type_known # endif ! # if defined(macosx) || \ ! defined(__APPLE__) && defined(__MACH__) && defined(__ppc__) # define MACOSX # define POWERPC # define mach_type_known # endif + # if defined(__APPLE__) && defined(__MACH__) && defined(__i386__) + # define MACOSX + # define I386 + --> Not really supported, but at least we recognize it. + # endif # if defined(NeXT) && defined(mc68000) # define M68K # define NEXT # define mach_type_known # endif ! # if defined(NeXT) && (defined(i386) || defined(__i386__)) # define I386 # define NEXT # define mach_type_known # endif ! # if defined(__OpenBSD__) && (defined(i386) || defined(__i386__)) # define I386 # define OPENBSD # define mach_type_known # endif ! # if defined(FREEBSD) && (defined(i386) || defined(__i386__)) # define I386 # define mach_type_known # endif ! # if defined(__NetBSD__) && (defined(i386) || defined(__i386__)) # define I386 # define mach_type_known # endif ! # if defined(bsdi) && (defined(i386) || defined(__i386__)) # define I386 # define BSDI # define mach_type_known *************** *** 244,254 **** /* DGUX defined */ # define mach_type_known # endif ! # if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ ! || defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__) ! # define I386 ! # define MSWIN32 /* or Win32s */ # define mach_type_known # endif # if defined(__DJGPP__) # define I386 --- 295,320 ---- /* DGUX defined */ # define mach_type_known # endif ! # if defined(_WIN32_WCE) ! /* SH3, SH4, MIPS already defined for corresponding architectures */ ! # if defined(SH3) || defined(SH4) ! # define SH ! # endif ! # if defined(x86) ! # define I386 ! # endif ! # if defined(ARM) ! # define ARM32 ! # endif ! # define MSWINCE # define mach_type_known + # else + # if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ + || defined(_WIN32) && !defined(__CYGWIN32__) && !defined(__CYGWIN__) + # define I386 + # define MSWIN32 /* or Win32s */ + # define mach_type_known + # endif # endif # if defined(__DJGPP__) # define I386 *************** *** 281,286 **** --- 347,357 ---- # define PJ # define mach_type_known # endif + # if defined(__embedded__) && defined(PPC) + # define POWERPC + # define NOSYS + # define mach_type_known + # endif /* Ivan Demakov */ # if defined(__WATCOMC__) && defined(__386__) # define I386 *************** *** 297,302 **** --- 368,385 ---- # endif # define mach_type_known # endif + # if defined(__s390__) && defined(LINUX) + # define S370 + # define mach_type_known + # endif + # if defined(__GNU__) + # if defined(__i386__) + /* The Debian Hurd running on generic PC */ + # define HURD + # define I386 + # define mach_type_known + # endif + # endif /* Feel free to add more clauses here */ *************** *** 325,333 **** /* RS6000 ==> IBM RS/6000 AIX3.X */ /* RT ==> IBM PC/RT */ /* HP_PA ==> HP9000/700 & /800 */ ! /* HP/UX */ ! /* SPARC ==> SPARC under SunOS */ ! /* (SUNOS4, SUNOS5, */ /* DRSNX variants) */ /* ALPHA ==> DEC Alpha */ /* (OSF1 and LINUX variants) */ --- 408,416 ---- /* RS6000 ==> IBM RS/6000 AIX3.X */ /* RT ==> IBM PC/RT */ /* HP_PA ==> HP9000/700 & /800 */ ! /* HP/UX, LINUX */ ! /* SPARC ==> SPARC v7/v8/v9 */ ! /* (SUNOS4, SUNOS5, LINUX, */ /* DRSNX variants) */ /* ALPHA ==> DEC Alpha */ /* (OSF1 and LINUX variants) */ *************** *** 335,343 **** /* (CX_UX and DGUX) */ /* S370 ==> 370-like machine */ /* running Amdahl UTS4 */ /* ARM32 ==> Intel StrongARM */ ! /* IA64 ==> Intel IA64 */ /* (e.g. Itanium) */ /* --- 418,432 ---- /* (CX_UX and DGUX) */ /* S370 ==> 370-like machine */ /* running Amdahl UTS4 */ + /* or a 390 running LINUX */ /* ARM32 ==> Intel StrongARM */ ! /* IA64 ==> Intel IPF */ /* (e.g. Itanium) */ + /* (LINUX and HPUX) */ + /* IA64_32 ==> IA64 w/32 bit ABI */ + /* (HPUX) */ + /* SH ==> Hitachi SuperH */ + /* (LINUX & MSWINCE) */ /* *************** *** 361,367 **** * On UNIX systems, the collector will scan the area between DATASTART * and DATAEND for root pointers. * ! * DATAEND, if not &end. * * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice * the pointer size. --- 450,461 ---- * On UNIX systems, the collector will scan the area between DATASTART * and DATAEND for root pointers. * ! * DATAEND, if not `end' where `end' is defined as ``extern int end[];''. ! * RTH suggests gaining access to linker script synth'd values with ! * this idiom instead of `&end' where `end' is defined as ``extern int end;'' . ! * Otherwise, ``GCC will assume these are in .sdata/.sbss'' and it will, e.g., ! * cause failures on alpha*-*-* with ``-msmall-data or -fpic'' or mips-*-* ! * without any special options. * * ALIGN_DOUBLE of GC_malloc should return blocks aligned to twice * the pointer size. *************** *** 389,395 **** * Gustavo Rodriguez-Rivera points out that on most (all?) Unix machines, * the value of environ is a pointer that can serve as STACKBOTTOM. * I expect that HEURISTIC2 can be replaced by this approach, which ! * interferes far less with debugging. * * If no expression for STACKBOTTOM can be found, and neither of the above * heuristics are usable, the collector can still be used with all of the above --- 483,491 ---- * Gustavo Rodriguez-Rivera points out that on most (all?) Unix machines, * the value of environ is a pointer that can serve as STACKBOTTOM. * I expect that HEURISTIC2 can be replaced by this approach, which ! * interferes far less with debugging. However it has the disadvantage ! * that it's confused by a putenv call before the collector is initialized. ! * This could be dealt with by intercepting putenv ... * * If no expression for STACKBOTTOM can be found, and neither of the above * heuristics are usable, the collector can still be used with all of the above *************** *** 439,444 **** --- 535,548 ---- * word stores of 0 are used instead. */ + /* If we are using a recent version of gcc, we can use __builtin_unwind_init() + * to push the relevant registers onto the stack. This generally makes + * USE_GENERIC_PUSH_REGS the preferred approach for marking from registers. + */ + # if defined(__GNUC__) && ((__GNUC__ >= 3) || \ + (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)) + # define HAVE_BUILTIN_UNWIND_INIT + # endif # define STACK_GRAN 0x1000000 # ifdef M68K *************** *** 447,469 **** # ifdef OPENBSD # define OS_TYPE "OPENBSD" # define HEURISTIC2 ! extern char etext; ! # define DATASTART ((ptr_t)(&etext)) # endif # ifdef NETBSD # define OS_TYPE "NETBSD" # define HEURISTIC2 ! extern char etext; ! # define DATASTART ((ptr_t)(&etext)) # endif # ifdef LINUX # define OS_TYPE "LINUX" # define STACKBOTTOM ((ptr_t)0xf0000000) ! # define MPROTECT_VDB # ifdef __ELF__ # define DYNAMIC_LOADING ! extern char **__environ; ! # define DATASTART ((ptr_t)(&__environ)) /* hideous kludge: __environ is the first */ /* word in crt0.o, and delimits the start */ /* of the data segment, no matter which */ --- 551,577 ---- # ifdef OPENBSD # define OS_TYPE "OPENBSD" # define HEURISTIC2 ! extern char etext[]; ! # define DATASTART ((ptr_t)(etext)) # endif # ifdef NETBSD # define OS_TYPE "NETBSD" # define HEURISTIC2 ! extern char etext[]; ! # define DATASTART ((ptr_t)(etext)) # endif # ifdef LINUX # define OS_TYPE "LINUX" # define STACKBOTTOM ((ptr_t)0xf0000000) ! /* # define MPROTECT_VDB - Reported to not work 9/17/01 */ # ifdef __ELF__ # define DYNAMIC_LOADING ! # include ! # if defined(__GLIBC__)&& __GLIBC__>=2 ! # define LINUX_DATA_START ! # else /* !GLIBC2 */ ! extern char **__environ; ! # define DATASTART ((ptr_t)(&__environ)) /* hideous kludge: __environ is the first */ /* word in crt0.o, and delimits the start */ /* of the data segment, no matter which */ *************** *** 472,495 **** /* would include .rodata, which may */ /* contain large read-only data tables */ /* that we'd rather not scan. */ ! extern int _end; ! # define DATAEND (&_end) # else ! extern int etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) # endif # endif # ifdef SUNOS4 # define OS_TYPE "SUNOS4" ! extern char etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ffff) & ~0x1ffff)) # define HEURISTIC1 /* differs */ # define DYNAMIC_LOADING # endif # ifdef HP # define OS_TYPE "HP" ! extern char etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) # define STACKBOTTOM ((ptr_t) 0xffeffffc) /* empirically determined. seems to work. */ # include --- 580,604 ---- /* would include .rodata, which may */ /* contain large read-only data tables */ /* that we'd rather not scan. */ ! # endif /* !GLIBC2 */ ! extern int _end[]; ! # define DATAEND (_end) # else ! extern int etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff)) # endif # endif # ifdef SUNOS4 # define OS_TYPE "SUNOS4" ! extern char etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0x1ffff) & ~0x1ffff)) # define HEURISTIC1 /* differs */ # define DYNAMIC_LOADING # endif # ifdef HP # define OS_TYPE "HP" ! extern char etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff)) # define STACKBOTTOM ((ptr_t) 0xffeffffc) /* empirically determined. seems to work. */ # include *************** *** 497,509 **** # endif # ifdef SYSV # define OS_TYPE "SYSV" ! extern etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \ & ~0x3fffff) \ ! +((word)&etext & 0x1fff)) /* This only works for shared-text binaries with magic number 0413. The other sorts of SysV binaries put the data at the end of the text, ! in which case the default of &etext would work. Unfortunately, handling both would require having the magic-number available. -- Parag */ --- 606,618 ---- # endif # ifdef SYSV # define OS_TYPE "SYSV" ! extern etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \ & ~0x3fffff) \ ! +((word)etext & 0x1fff)) /* This only works for shared-text binaries with magic number 0413. The other sorts of SysV binaries put the data at the end of the text, ! in which case the default of etext would work. Unfortunately, handling both would require having the magic-number available. -- Parag */ *************** *** 563,585 **** # define STACK_GRAN 0x10000000 /* Stack usually starts at 0x80000000 */ # define LINUX_DATA_START ! extern int _end; ! # define DATAEND (&_end) # endif # ifdef MACOSX # define ALIGNMENT 4 # define OS_TYPE "MACOSX" # define DATASTART ((ptr_t) get_etext()) # define STACKBOTTOM ((ptr_t) 0xc0000000) # define DATAEND /* not needed */ # endif # endif # ifdef VAX # define MACH_TYPE "VAX" # define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */ ! extern char etext; ! # define DATASTART ((ptr_t)(&etext)) # ifdef BSD # define OS_TYPE "BSD" # define HEURISTIC1 --- 672,717 ---- # define STACK_GRAN 0x10000000 /* Stack usually starts at 0x80000000 */ # define LINUX_DATA_START ! extern int _end[]; ! # define DATAEND (_end) # endif # ifdef MACOSX + /* There are reasons to suspect this may not be reliable. */ # define ALIGNMENT 4 # define OS_TYPE "MACOSX" # define DATASTART ((ptr_t) get_etext()) # define STACKBOTTOM ((ptr_t) 0xc0000000) # define DATAEND /* not needed */ + # define MPROTECT_VDB + # include + # define GETPAGESIZE() getpagesize() + # endif + # ifdef NETBSD + # define ALIGNMENT 4 + # define OS_TYPE "NETBSD" + # define HEURISTIC2 + extern char etext[]; + # define DATASTART GC_data_start + # define DYNAMIC_LOADING + # endif + # ifdef NOSYS + # define ALIGNMENT 4 + # define OS_TYPE "NOSYS" + extern void __end[], __dso_handle[]; + # define DATASTART (__dso_handle) /* OK, that's ugly. */ + # define DATAEND (__end) + /* Stack starts at 0xE0000000 for the simulator. */ + # undef STACK_GRAN + # define STACK_GRAN 0x10000000 + # define HEURISTIC1 # endif # endif # ifdef VAX # define MACH_TYPE "VAX" # define ALIGNMENT 4 /* Pointers are longword aligned by 4.2 C compiler */ ! extern char etext[]; ! # define DATASTART ((ptr_t)(etext)) # ifdef BSD # define OS_TYPE "BSD" # define HEURISTIC1 *************** *** 600,617 **** # ifdef SPARC # define MACH_TYPE "SPARC" ! # define ALIGNMENT 4 /* Required by hardware */ # define ALIGN_DOUBLE - extern int etext; # ifdef SUNOS5 # define OS_TYPE "SUNOS5" ! extern int _etext; ! extern int _end; extern char * GC_SysVGetDataStart(); ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext) ! # define DATAEND (&_end) ! # ifndef USE_MMAP # define USE_MMAP # endif # ifdef USE_MMAP # define HEAP_START (ptr_t)0x40000000 --- 732,759 ---- # ifdef SPARC # define MACH_TYPE "SPARC" ! # if defined(__arch64__) || defined(__sparcv9) ! # define ALIGNMENT 8 ! # define CPP_WORDSZ 64 ! # define ELF_CLASS ELFCLASS64 ! # else ! # define ALIGNMENT 4 /* Required by hardware */ ! # define CPP_WORDSZ 32 ! # endif # define ALIGN_DOUBLE # ifdef SUNOS5 # define OS_TYPE "SUNOS5" ! extern int _etext[]; ! extern int _end[]; extern char * GC_SysVGetDataStart(); ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext) ! # define DATAEND (_end) ! # if !defined(USE_MMAP) && defined(REDIRECT_MALLOC) # define USE_MMAP + /* Otherwise we now use calloc. Mmap may result in the */ + /* heap interleaved with thread stacks, which can result in */ + /* excessive blacklisting. Sbrk is unusable since it */ + /* doesn't interact correctly with the system malloc. */ # endif # ifdef USE_MMAP # define HEAP_START (ptr_t)0x40000000 *************** *** 619,628 **** # define HEAP_START DATAEND # endif # define PROC_VDB ! /* HEURISTIC1 reportedly no longer works under 2.7. Thus we */ ! /* switched to HEURISTIC2, eventhough it creates some debugging */ ! /* issues. */ ! # define HEURISTIC2 # include # define GETPAGESIZE() sysconf(_SC_PAGESIZE) /* getpagesize() appeared to be missing from at least one */ --- 761,778 ---- # define HEAP_START DATAEND # endif # define PROC_VDB ! /* HEURISTIC1 reportedly no longer works under 2.7. */ ! /* HEURISTIC2 probably works, but this appears to be preferable. */ ! /* Apparently USRSTACK is defined to be USERLIMIT, but in some */ ! /* installations that's undefined. We work around this with a */ ! /* gross hack: */ ! # include ! # ifdef USERLIMIT ! /* This should work everywhere, but doesn't. */ ! # define STACKBOTTOM USRSTACK ! # else ! # define HEURISTIC2 ! # endif # include # define GETPAGESIZE() sysconf(_SC_PAGESIZE) /* getpagesize() appeared to be missing from at least one */ *************** *** 633,641 **** # define OS_TYPE "SUNOS4" /* [If you have a weak stomach, don't read this.] */ /* We would like to use: */ ! /* # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1fff) & ~0x1fff)) */ /* This fails occasionally, due to an ancient, but very */ ! /* persistent ld bug. &etext is set 32 bytes too high. */ /* We instead read the text segment size from the a.out */ /* header, which happens to be mapped into our address space */ /* at the start of the text segment. The detective work here */ --- 783,791 ---- # define OS_TYPE "SUNOS4" /* [If you have a weak stomach, don't read this.] */ /* We would like to use: */ ! /* # define DATASTART ((ptr_t)((((word) (etext)) + 0x1fff) & ~0x1fff)) */ /* This fails occasionally, due to an ancient, but very */ ! /* persistent ld bug. etext is set 32 bytes too high. */ /* We instead read the text segment size from the a.out */ /* header, which happens to be mapped into our address space */ /* at the start of the text segment. The detective work here */ *************** *** 649,659 **** # define DYNAMIC_LOADING # endif # ifdef DRSNX - # define CPP_WORDSZ 32 # define OS_TYPE "DRSNX" extern char * GC_SysVGetDataStart(); ! extern int etext; ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext) # define MPROTECT_VDB # define STACKBOTTOM ((ptr_t) 0xdfff0000) # define DYNAMIC_LOADING --- 799,808 ---- # define DYNAMIC_LOADING # endif # ifdef DRSNX # define OS_TYPE "DRSNX" extern char * GC_SysVGetDataStart(); ! extern int etext[]; ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, etext) # define MPROTECT_VDB # define STACKBOTTOM ((ptr_t) 0xdfff0000) # define DYNAMIC_LOADING *************** *** 661,680 **** # ifdef LINUX # define OS_TYPE "LINUX" # ifdef __ELF__ - # define LINUX_DATA_START # define DYNAMIC_LOADING # else ! Linux Sparc non elf ? # endif ! extern int _end; ! # define DATAEND (&_end) # define SVR4 ! # define STACKBOTTOM ((ptr_t) 0xf0000000) # endif # ifdef OPENBSD # define OS_TYPE "OPENBSD" # define STACKBOTTOM ((ptr_t) 0xf8000000) ! # define DATASTART ((ptr_t)(&etext)) # endif # endif --- 810,848 ---- # ifdef LINUX # define OS_TYPE "LINUX" # ifdef __ELF__ # define DYNAMIC_LOADING # else ! Linux Sparc/a.out not supported # endif ! extern int _end[]; ! extern int _etext[]; ! # define DATAEND (_end) # define SVR4 ! # ifdef __arch64__ ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x100000, _etext) ! /* libc_stack_end is not set reliably for sparc64 */ ! # define STACKBOTTOM ((ptr_t) 0x80000000000) ! # else ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext) ! # define LINUX_STACKBOTTOM ! # endif # endif # ifdef OPENBSD # define OS_TYPE "OPENBSD" # define STACKBOTTOM ((ptr_t) 0xf8000000) ! extern int etext[]; ! # define DATASTART ((ptr_t)(etext)) ! # endif ! # ifdef NETBSD ! # define OS_TYPE "NETBSD" ! # define HEURISTIC2 ! # ifdef __ELF__ ! # define DATASTART GC_data_start ! # define DYNAMIC_LOADING ! # else ! extern char etext[]; ! # define DATASTART ((ptr_t)(etext)) ! # endif # endif # endif *************** *** 688,710 **** # define ALIGN_DOUBLE /* Not strictly necessary, but may give speed */ /* improvement on Pentiums. */ # endif # ifdef SEQUENT # define OS_TYPE "SEQUENT" ! extern int etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) # define STACKBOTTOM ((ptr_t) 0x3ffff000) # endif # ifdef SUNOS5 # define OS_TYPE "SUNOS5" ! extern int etext, _start; extern char * GC_SysVGetDataStart(); ! # define DATASTART GC_SysVGetDataStart(0x1000, &etext) ! # define STACKBOTTOM ((ptr_t)(&_start)) ! /** At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */ ! /*# define PROC_VDB*/ # define DYNAMIC_LOADING ! # ifndef USE_MMAP # define USE_MMAP # endif # ifdef USE_MMAP # define HEAP_START (ptr_t)0x40000000 --- 856,902 ---- # define ALIGN_DOUBLE /* Not strictly necessary, but may give speed */ /* improvement on Pentiums. */ # endif + # ifdef HAVE_BUILTIN_UNWIND_INIT + # define USE_GENERIC_PUSH_REGS + # endif # ifdef SEQUENT # define OS_TYPE "SEQUENT" ! extern int etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff)) # define STACKBOTTOM ((ptr_t) 0x3ffff000) # endif + # ifdef BEOS + # define OS_TYPE "BEOS" + # include + # define GETPAGESIZE() B_PAGE_SIZE + extern int etext[]; + # define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff)) + # endif # ifdef SUNOS5 # define OS_TYPE "SUNOS5" ! extern int _etext[], _end[]; extern char * GC_SysVGetDataStart(); ! # define DATASTART GC_SysVGetDataStart(0x1000, _etext) ! # define DATAEND (_end) ! /* # define STACKBOTTOM ((ptr_t)(_start)) worked through 2.7, */ ! /* but reportedly breaks under 2.8. It appears that the stack */ ! /* base is a property of the executable, so this should not break */ ! /* old executables. */ ! /* HEURISTIC2 probably works, but this appears to be preferable. */ ! # include ! # define STACKBOTTOM USRSTACK ! /* At least in Solaris 2.5, PROC_VDB gives wrong values for dirty bits. */ ! /* It appears to be fixed in 2.8 and 2.9. */ ! # ifdef SOLARIS25_PROC_VDB_BUG_FIXED ! # define PROC_VDB ! # endif # define DYNAMIC_LOADING ! # if !defined(USE_MMAP) && defined(REDIRECT_MALLOC) # define USE_MMAP + /* Otherwise we now use calloc. Mmap may result in the */ + /* heap interleaved with thread stacks, which can result in */ + /* excessive blacklisting. Sbrk is unusable since it */ + /* doesn't interact correctly with the system malloc. */ # endif # ifdef USE_MMAP # define HEAP_START (ptr_t)0x40000000 *************** *** 714,734 **** # endif # ifdef SCO # define OS_TYPE "SCO" ! extern int etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0x3fffff) \ & ~0x3fffff) \ ! +((word)&etext & 0xfff)) # define STACKBOTTOM ((ptr_t) 0x7ffffffc) # endif # ifdef SCO_ELF # define OS_TYPE "SCO_ELF" ! extern int etext; ! # define DATASTART ((ptr_t)(&etext)) # define STACKBOTTOM ((ptr_t) 0x08048000) # define DYNAMIC_LOADING # define ELF_CLASS ELFCLASS32 # endif # ifdef LINUX # define OS_TYPE "LINUX" # define LINUX_STACKBOTTOM # if 0 --- 906,930 ---- # endif # ifdef SCO # define OS_TYPE "SCO" ! extern int etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0x3fffff) \ & ~0x3fffff) \ ! +((word)etext & 0xfff)) # define STACKBOTTOM ((ptr_t) 0x7ffffffc) # endif # ifdef SCO_ELF # define OS_TYPE "SCO_ELF" ! extern int etext[]; ! # define DATASTART ((ptr_t)(etext)) # define STACKBOTTOM ((ptr_t) 0x08048000) # define DYNAMIC_LOADING # define ELF_CLASS ELFCLASS32 # endif # ifdef LINUX + # ifndef __GNUC__ + /* The Intel compiler doesn't like inline assembly */ + # define USE_GENERIC_PUSH_REGS + # endif # define OS_TYPE "LINUX" # define LINUX_STACKBOTTOM # if 0 *************** *** 740,746 **** /* with 2GB physical memory will usually move the user */ /* address space limit, and hence initial SP to 0x80000000. */ # endif ! # if !defined(LINUX_THREADS) || !defined(REDIRECT_MALLOC) # define MPROTECT_VDB # else /* We seem to get random errors in incremental mode, */ --- 936,942 ---- /* with 2GB physical memory will usually move the user */ /* address space limit, and hence initial SP to 0x80000000. */ # endif ! # if !defined(GC_LINUX_THREADS) || !defined(REDIRECT_MALLOC) # define MPROTECT_VDB # else /* We seem to get random errors in incremental mode, */ *************** *** 750,757 **** # ifdef __ELF__ # define DYNAMIC_LOADING # ifdef UNDEFINED /* includes ro data */ ! extern int _etext; ! # define DATASTART ((ptr_t)((((word) (&_etext)) + 0xfff) & ~0xfff)) # endif # include # if defined(__GLIBC__) && __GLIBC__ >= 2 --- 946,953 ---- # ifdef __ELF__ # define DYNAMIC_LOADING # ifdef UNDEFINED /* includes ro data */ ! extern int _etext[]; ! # define DATASTART ((ptr_t)((((word) (_etext)) + 0xfff) & ~0xfff)) # endif # include # if defined(__GLIBC__) && __GLIBC__ >= 2 *************** *** 768,778 **** /* contain large read-only data tables */ /* that we'd rather not scan. */ # endif ! extern int _end; ! # define DATAEND (&_end) # else ! extern int etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) # endif # ifdef USE_I686_PREFETCH # define PREFETCH(x) \ --- 964,974 ---- /* contain large read-only data tables */ /* that we'd rather not scan. */ # endif ! extern int _end[]; ! # define DATAEND (_end) # else ! extern int etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff)) # endif # ifdef USE_I686_PREFETCH # define PREFETCH(x) \ *************** *** 791,806 **** # ifdef USE_3DNOW_PREFETCH # define PREFETCH(x) \ __asm__ __volatile__ (" prefetch %0": : "m"(*(char *)(x))) ! # define PREFETCH_FOR_WRITE(x) __asm__ __volatile__ (" prefetchw %0": : "m"(*(char *)(x))) # endif # endif # ifdef CYGWIN32 # define OS_TYPE "CYGWIN32" ! extern int _data_start__; ! extern int _data_end__; ! extern int _bss_start__; ! extern int _bss_end__; /* For binutils 2.9.1, we have */ /* DATASTART = _data_start__ */ /* DATAEND = _bss_end__ */ --- 987,1002 ---- # ifdef USE_3DNOW_PREFETCH # define PREFETCH(x) \ __asm__ __volatile__ (" prefetch %0": : "m"(*(char *)(x))) ! # define PREFETCH_FOR_WRITE(x) \ __asm__ __volatile__ (" prefetchw %0": : "m"(*(char *)(x))) # endif # endif # ifdef CYGWIN32 # define OS_TYPE "CYGWIN32" ! extern int _data_start__[]; ! extern int _data_end__[]; ! extern int _bss_start__[]; ! extern int _bss_end__[]; /* For binutils 2.9.1, we have */ /* DATASTART = _data_start__ */ /* DATAEND = _bss_end__ */ *************** *** 811,818 **** /* minumum/maximum of the two. */ # define MAX(x,y) ((x) > (y) ? (x) : (y)) # define MIN(x,y) ((x) < (y) ? (x) : (y)) ! # define DATASTART ((ptr_t) MIN(&_data_start__, &_bss_start__)) ! # define DATAEND ((ptr_t) MAX(&_data_end__, &_bss_end__)) # undef STACK_GRAN # define STACK_GRAN 0x10000 # define HEURISTIC1 --- 1007,1014 ---- /* minumum/maximum of the two. */ # define MAX(x,y) ((x) > (y) ? (x) : (y)) # define MIN(x,y) ((x) < (y) ? (x) : (y)) ! # define DATASTART ((ptr_t) MIN(_data_start__, _bss_start__)) ! # define DATAEND ((ptr_t) MAX(_data_end__, _bss_end__)) # undef STACK_GRAN # define STACK_GRAN 0x10000 # define HEURISTIC1 *************** *** 823,828 **** --- 1019,1025 ---- /* os_dep.c. OS2 actually has the right */ /* system call! */ # define DATAEND /* not needed */ + # define USE_GENERIC_PUSH_REGS # endif # ifdef MSWIN32 # define OS_TYPE "MSWIN32" *************** *** 833,845 **** # endif # define DATAEND /* not needed */ # endif # ifdef DJGPP # define OS_TYPE "DJGPP" # include "stubinfo.h" ! extern int etext; extern int _stklen; extern int __djgpp_stack_limit; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0x1ff) & ~0x1ff)) /* # define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \ + _stklen)) */ # define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen)) --- 1030,1046 ---- # endif # define DATAEND /* not needed */ # endif + # ifdef MSWINCE + # define OS_TYPE "MSWINCE" + # define DATAEND /* not needed */ + # endif # ifdef DJGPP # define OS_TYPE "DJGPP" # include "stubinfo.h" ! extern int etext[]; extern int _stklen; extern int __djgpp_stack_limit; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0x1ff) & ~0x1ff)) /* # define STACKBOTTOM ((ptr_t)((word) _stubinfo + _stubinfo->size \ + _stklen)) */ # define STACKBOTTOM ((ptr_t)((word) __djgpp_stack_limit + _stklen)) *************** *** 850,859 **** # endif # ifdef FREEBSD # define OS_TYPE "FREEBSD" ! # define MPROTECT_VDB # endif # ifdef NETBSD # define OS_TYPE "NETBSD" # endif # ifdef THREE86BSD # define OS_TYPE "THREE86BSD" --- 1051,1081 ---- # endif # ifdef FREEBSD # define OS_TYPE "FREEBSD" ! # ifndef GC_FREEBSD_THREADS ! # define MPROTECT_VDB ! # endif ! # define SIG_SUSPEND SIGUSR1 ! # define SIG_THR_RESTART SIGUSR2 ! # define FREEBSD_STACKBOTTOM ! # ifdef __ELF__ ! # define DYNAMIC_LOADING ! # endif ! /* Handle unmapped hole i386*-*-freebsd[45]* may put between etext and edata. */ ! extern char etext[]; ! extern char edata[]; ! extern char end[]; ! # define NEED_FIND_LIMIT ! # define DATASTART ((ptr_t)(etext)) ! # define MIN(x,y) ((x) < (y) ? (x) : (y)) ! # define DATAEND (MIN (GC_find_limit (DATASTART, TRUE), DATASTART2)) ! # define DATASTART2 ((ptr_t)(edata)) ! # define DATAEND2 ((ptr_t)(end)) # endif # ifdef NETBSD # define OS_TYPE "NETBSD" + # ifdef __ELF__ + # define DYNAMIC_LOADING + # endif # endif # ifdef THREE86BSD # define OS_TYPE "THREE86BSD" *************** *** 861,871 **** # ifdef BSDI # define OS_TYPE "BSDI" # endif ! # if defined(OPENBSD) || defined(FREEBSD) || defined(NETBSD) \ || defined(THREE86BSD) || defined(BSDI) # define HEURISTIC2 ! extern char etext; ! # define DATASTART ((ptr_t)(&etext)) # endif # ifdef NEXT # define OS_TYPE "NEXT" --- 1083,1093 ---- # ifdef BSDI # define OS_TYPE "BSDI" # endif ! # if defined(OPENBSD) || defined(NETBSD) \ || defined(THREE86BSD) || defined(BSDI) # define HEURISTIC2 ! extern char etext[]; ! # define DATASTART ((ptr_t)(etext)) # endif # ifdef NEXT # define OS_TYPE "NEXT" *************** *** 888,893 **** --- 1110,1126 ---- # define DATASTART ((ptr_t) &__nullarea) # define DATAEND ((ptr_t) &_end) # endif + # ifdef HURD + # define OS_TYPE "HURD" + # define STACK_GROWS_DOWN + # define HEURISTIC2 + extern int __data_start[]; + # define DATASTART ( (ptr_t) (__data_start)) + extern int _end[]; + # define DATAEND ( (ptr_t) (_end)) + /* # define MPROTECT_VDB Not quite working yet? */ + # define DYNAMIC_LOADING + # endif # endif # ifdef NS32K *************** *** 904,923 **** # ifdef MIPS # define MACH_TYPE "MIPS" - /* # define STACKBOTTOM ((ptr_t)0x7fff8000) sometimes also works. */ # ifdef LINUX /* This was developed for a linuxce style platform. Probably */ /* needs to be tweaked for workstation class machines. */ # define OS_TYPE "LINUX" ! extern int __data_start; ! # define DATASTART ((ptr_t)(&__data_start)) # define ALIGNMENT 4 ! # define USE_GENERIC_PUSH_REGS 1 ! # define STACKBOTTOM 0x80000000 /* In many cases, this should probably use LINUX_STACKBOTTOM */ /* instead. But some kernel versions seem to give the wrong */ /* value from /proc. */ # endif /* Linux */ # ifdef ULTRIX # define HEURISTIC2 # define DATASTART (ptr_t)0x10000000 --- 1137,1179 ---- # ifdef MIPS # define MACH_TYPE "MIPS" # ifdef LINUX /* This was developed for a linuxce style platform. Probably */ /* needs to be tweaked for workstation class machines. */ # define OS_TYPE "LINUX" ! extern int __data_start[]; ! # define DATASTART ((ptr_t)(__data_start)) # define ALIGNMENT 4 ! # define USE_GENERIC_PUSH_REGS ! # define STACKBOTTOM ((ptr_t)0x7fff8000) ! /* Older toolchains may need 0x80000000. */ /* In many cases, this should probably use LINUX_STACKBOTTOM */ /* instead. But some kernel versions seem to give the wrong */ /* value from /proc. */ # endif /* Linux */ + # ifdef EWS4800 + # define HEURISTIC2 + # if defined(_MIPS_SZPTR) && (_MIPS_SZPTR == 64) + extern int _fdata[], _end[]; + # define DATASTART ((ptr_t)_fdata) + # define DATAEND ((ptr_t)_end) + # define CPP_WORDSZ _MIPS_SZPTR + # define ALIGNMENT (_MIPS_SZPTR/8) + # else + extern int etext[], edata[], end[]; + extern int _DYNAMIC_LINKING[], _gp[]; + # define DATASTART ((ptr_t)((((word)etext + 0x3ffff) & ~0x3ffff) \ + + ((word)etext & 0xffff))) + # define DATAEND (edata) + # define DATASTART2 (_DYNAMIC_LINKING \ + ? (ptr_t)(((word)_gp + 0x8000 + 0x3ffff) & ~0x3ffff) \ + : (ptr_t)edata) + # define DATAEND2 (end) + # define ALIGNMENT 4 + # endif + # define OS_TYPE "EWS4800" + # define USE_GENERIC_PUSH_REGS 1 + # endif # ifdef ULTRIX # define HEURISTIC2 # define DATASTART (ptr_t)0x10000000 *************** *** 934,941 **** # endif # ifdef IRIX5 # define HEURISTIC2 ! extern int _fdata; ! # define DATASTART ((ptr_t)(&_fdata)) # ifdef USE_MMAP # define HEAP_START (ptr_t)0x30000000 # else --- 1190,1197 ---- # endif # ifdef IRIX5 # define HEURISTIC2 ! extern int _fdata[]; ! # define DATASTART ((ptr_t)(_fdata)) # ifdef USE_MMAP # define HEAP_START (ptr_t)0x30000000 # else *************** *** 960,981 **** # endif # define DYNAMIC_LOADING # endif # endif # ifdef RS6000 # define MACH_TYPE "RS6000" ! # define ALIGNMENT 4 ! # define DATASTART ((ptr_t)0x20000000) extern int errno; # define STACKBOTTOM ((ptr_t)((ulong)&errno)) # define DYNAMIC_LOADING /* For really old versions of AIX, this may have to be removed. */ # endif # ifdef HP_PA - /* OS is assumed to be HP/UX */ # define MACH_TYPE "HP_PA" - # define OS_TYPE "HPUX" # ifdef __LP64__ # define CPP_WORDSZ 64 # define ALIGNMENT 8 --- 1216,1266 ---- # endif # define DYNAMIC_LOADING # endif + # ifdef MSWINCE + # define OS_TYPE "MSWINCE" + # define ALIGNMENT 4 + # define DATAEND /* not needed */ + # endif + # if defined(NETBSD) + /* This also checked for __MIPSEL__ . Why? NETBSD recognition */ + /* should be handled at the top of the file. */ + # define ALIGNMENT 4 + # define OS_TYPE "NETBSD" + # define HEURISTIC2 + # define USE_GENERIC_PUSH_REGS + # ifdef __ELF__ + extern int etext[]; + # define DATASTART GC_data_start + # define NEED_FIND_LIMIT + # define DYNAMIC_LOADING + # else + # define DATASTART ((ptr_t) 0x10000000) + # define STACKBOTTOM ((ptr_t) 0x7ffff000) + # endif /* _ELF_ */ + # endif # endif # ifdef RS6000 # define MACH_TYPE "RS6000" ! # ifdef __64BIT__ ! # define ALIGNMENT 8 ! # define CPP_WORDSZ 64 ! # else ! # define ALIGNMENT 4 ! # define CPP_WORDSZ 32 ! # endif ! extern int _data[], _end[]; ! # define DATASTART ((ptr_t)((ulong)_data)) ! # define DATAEND ((ptr_t)((ulong)_end)) extern int errno; # define STACKBOTTOM ((ptr_t)((ulong)&errno)) + # define USE_GENERIC_PUSH_REGS # define DYNAMIC_LOADING /* For really old versions of AIX, this may have to be removed. */ # endif # ifdef HP_PA # define MACH_TYPE "HP_PA" # ifdef __LP64__ # define CPP_WORDSZ 64 # define ALIGNMENT 8 *************** *** 984,992 **** # define ALIGNMENT 4 # define ALIGN_DOUBLE # endif ! extern int __data_start; ! # define DATASTART ((ptr_t)(&__data_start)) ! # if 0 /* The following appears to work for 7xx systems running HP/UX */ /* 9.xx Furthermore, it might result in much faster */ /* collections than HEURISTIC2, which may involve scanning */ --- 1269,1293 ---- # define ALIGNMENT 4 # define ALIGN_DOUBLE # endif ! # if !defined(GC_HPUX_THREADS) && !defined(GC_LINUX_THREADS) ! # ifndef LINUX /* For now. */ ! # define MPROTECT_VDB ! # endif ! # else ! # define GENERIC_COMPARE_AND_SWAP ! /* No compare-and-swap instruction. Use pthread mutexes */ ! /* when we absolutely have to. */ ! # ifdef PARALLEL_MARK ! # define USE_MARK_BYTES ! /* Minimize compare-and-swap usage. */ ! # endif ! # endif ! # define STACK_GROWS_UP ! # ifdef HPUX ! # define OS_TYPE "HPUX" ! extern int __data_start[]; ! # define DATASTART ((ptr_t)(__data_start)) ! # if 0 /* The following appears to work for 7xx systems running HP/UX */ /* 9.xx Furthermore, it might result in much faster */ /* collections than HEURISTIC2, which may involve scanning */ *************** *** 995,1035 **** /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */ /* this.) */ # define STACKBOTTOM ((ptr_t) 0x7b033000) /* from /etc/conf/h/param.h */ ! # else /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2 */ ! /* to this. We'll probably do this on other platforms, too. */ ! /* For now I'll use it where I can test it. */ extern char ** environ; # define STACKBOTTOM ((ptr_t)environ) ! # endif ! # define STACK_GROWS_UP ! # define DYNAMIC_LOADING ! # ifndef HPUX_THREADS ! # define MPROTECT_VDB ! # endif ! # include ! # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE) ! # endif # ifdef ALPHA # define MACH_TYPE "ALPHA" # define ALIGNMENT 8 ! # define USE_GENERIC_PUSH_REGS ! /* Gcc and probably the DEC/Compaq compiler spill pointers to preserved */ ! /* fp registers in some cases when the target is a 21264. The assembly */ ! /* code doesn't handle that yet, and version dependencies make that a */ ! /* bit tricky. Do the easy thing for now. */ # ifdef OSF1 # define OS_TYPE "OSF1" # define DATASTART ((ptr_t) 0x140000000) ! extern _end; ! # define DATAEND ((ptr_t) &_end) ! # define HEURISTIC2 /* Normally HEURISTIC2 is too conervative, since */ /* the text segment immediately follows the stack. */ /* Hence we give an upper pound. */ ! extern int __start; ! # define HEURISTIC2_LIMIT ((ptr_t)((word)(&__start) & ~(getpagesize()-1))) # define CPP_WORDSZ 64 # define MPROTECT_VDB # define DYNAMIC_LOADING --- 1296,1391 ---- /* combinations. (Thanks to Raymond X.T. Nijssen for uncovering */ /* this.) */ # define STACKBOTTOM ((ptr_t) 0x7b033000) /* from /etc/conf/h/param.h */ ! # else /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2 */ ! /* to this. Note that the GC must be initialized before the */ ! /* first putenv call. */ extern char ** environ; # define STACKBOTTOM ((ptr_t)environ) ! # endif ! # define DYNAMIC_LOADING ! # include ! # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE) ! # ifndef __GNUC__ ! # define PREFETCH(x) { \ ! register long addr = (long)(x); \ ! (void) _asm ("LDW", 0, 0, addr, 0); \ ! } ! # endif ! # endif /* HPUX */ ! # ifdef LINUX ! # define OS_TYPE "LINUX" ! # define LINUX_STACKBOTTOM ! # define DYNAMIC_LOADING ! # define LINUX_DATA_START ! extern int _end[]; ! # define DATAEND (_end) ! # endif /* LINUX */ ! # endif /* HP_PA */ # ifdef ALPHA # define MACH_TYPE "ALPHA" # define ALIGNMENT 8 ! # ifdef NETBSD ! # define OS_TYPE "NETBSD" ! # define HEURISTIC2 ! # define DATASTART GC_data_start ! # define ELFCLASS32 32 ! # define ELFCLASS64 64 ! # define ELF_CLASS ELFCLASS64 ! # define CPP_WORDSZ 64 ! # define DYNAMIC_LOADING ! # endif ! # ifdef OPENBSD ! # define OS_TYPE "OPENBSD" ! # define HEURISTIC2 ! # define CPP_WORDSZ 64 ! # ifdef __ELF__ /* since OpenBSD/Alpha 2.9 */ ! # define DATASTART GC_data_start ! # define ELFCLASS32 32 ! # define ELFCLASS64 64 ! # define ELF_CLASS ELFCLASS64 ! # else /* ECOFF, until OpenBSD/Alpha 2.7 */ ! # define DATASTART ((ptr_t) 0x140000000) ! # endif ! # endif ! # ifdef FREEBSD ! # define OS_TYPE "FREEBSD" ! /* MPROTECT_VDB is not yet supported at all on FreeBSD/alpha. */ ! # define SIG_SUSPEND SIGUSR1 ! # define SIG_THR_RESTART SIGUSR2 ! # define FREEBSD_STACKBOTTOM ! # ifdef __ELF__ ! # define DYNAMIC_LOADING ! # endif ! /* Handle unmapped hole alpha*-*-freebsd[45]* puts between etext and edata. */ ! extern char etext[]; ! extern char edata[]; ! extern char end[]; ! # define NEED_FIND_LIMIT ! # define DATASTART ((ptr_t)(etext)) ! # define DATAEND (GC_find_limit (DATASTART, TRUE)) ! # define DATASTART2 ((ptr_t)(edata)) ! # define DATAEND2 ((ptr_t)(end)) ! # define CPP_WORDSZ 64 ! # endif # ifdef OSF1 # define OS_TYPE "OSF1" # define DATASTART ((ptr_t) 0x140000000) ! extern int _end[]; ! # define DATAEND ((ptr_t) _end) ! extern char ** environ; ! /* round up from the value of environ to the nearest page boundary */ ! /* Probably breaks if putenv is called before collector */ ! /* initialization. */ ! # define STACKBOTTOM ((ptr_t)(((word)(environ) | (getpagesize()-1))+1)) ! /* # define HEURISTIC2 */ /* Normally HEURISTIC2 is too conervative, since */ /* the text segment immediately follows the stack. */ /* Hence we give an upper pound. */ ! /* This is currently unused, since we disabled HEURISTIC2 */ ! extern int __start[]; ! # define HEURISTIC2_LIMIT ((ptr_t)((word)(__start) & ~(getpagesize()-1))) # define CPP_WORDSZ 64 # define MPROTECT_VDB # define DYNAMIC_LOADING *************** *** 1039,1052 **** # define CPP_WORDSZ 64 # define STACKBOTTOM ((ptr_t) 0x120000000) # ifdef __ELF__ ! # define LINUX_DATA_START # define DYNAMIC_LOADING - /* This doesn't work if the collector is in a dynamic library. */ # else # define DATASTART ((ptr_t) 0x140000000) # endif ! extern int _end; ! # define DATAEND (&_end) # define MPROTECT_VDB /* Has only been superficially tested. May not */ /* work on all versions. */ --- 1395,1408 ---- # define CPP_WORDSZ 64 # define STACKBOTTOM ((ptr_t) 0x120000000) # ifdef __ELF__ ! # define SEARCH_FOR_DATA_START ! # define DATASTART GC_data_start # define DYNAMIC_LOADING # else # define DATASTART ((ptr_t) 0x140000000) # endif ! extern int _end[]; ! # define DATAEND (_end) # define MPROTECT_VDB /* Has only been superficially tested. May not */ /* work on all versions. */ *************** *** 1055,1097 **** # ifdef IA64 # define MACH_TYPE "IA64" - # define ALIGN_DOUBLE - /* Requires 16 byte alignment for malloc */ - # define ALIGNMENT 8 # define USE_GENERIC_PUSH_REGS ! /* We need to get preserved registers in addition to register windows. */ ! /* That's easiest to do with setjmp. */ # ifdef HPUX ! --> needs work # endif # ifdef LINUX # define OS_TYPE "LINUX" ! # define CPP_WORDSZ 64 ! /* This should really be done through /proc, but that */ ! /* requires we run on an IA64 kernel. */ ! # define STACKBOTTOM ((ptr_t) 0xa000000000000000l) /* We also need the base address of the register stack */ ! /* backing store. There is probably a better way to */ ! /* get that, too ... */ ! # define BACKING_STORE_BASE ((ptr_t) 0x9fffffff80000000l) ! # if 1 ! # define SEARCH_FOR_DATA_START ! # define DATASTART GC_data_start # else ! extern int data_start; ! # define DATASTART ((ptr_t)(&data_start)) ! # endif ! # define DYNAMIC_LOADING # define MPROTECT_VDB /* Requires Linux 2.3.47 or later. */ ! extern int _end; ! # define DATAEND (&_end) ! # define PREFETCH(x) \ ! __asm__ (" lfetch [%0]": : "r"((void *)(x))) ! # define PREFETCH_FOR_WRITE(x) \ ! __asm__ (" lfetch.excl [%0]": : "r"((void *)(x))) ! # define CLEAR_DOUBLE(x) \ ! __asm__ (" stf.spill [%0]=f0": : "r"((void *)(x))) # endif # endif --- 1411,1499 ---- # ifdef IA64 # define MACH_TYPE "IA64" # define USE_GENERIC_PUSH_REGS ! /* We need to get preserved registers in addition to register */ ! /* windows. That's easiest to do with setjmp. */ ! # ifdef PARALLEL_MARK ! # define USE_MARK_BYTES ! /* Compare-and-exchange is too expensive to use for */ ! /* setting mark bits. */ ! # endif # ifdef HPUX ! # ifdef _ILP32 ! # define CPP_WORDSZ 32 ! # define ALIGN_DOUBLE ! /* Requires 8 byte alignment for malloc */ ! # define ALIGNMENT 4 ! # else ! # ifndef _LP64 ! ---> unknown ABI ! # endif ! # define CPP_WORDSZ 64 ! # define ALIGN_DOUBLE ! /* Requires 16 byte alignment for malloc */ ! # define ALIGNMENT 8 ! # endif ! # define OS_TYPE "HPUX" ! extern int __data_start[]; ! # define DATASTART ((ptr_t)(__data_start)) ! /* Gustavo Rodriguez-Rivera suggested changing HEURISTIC2 */ ! /* to this. Note that the GC must be initialized before the */ ! /* first putenv call. */ ! extern char ** environ; ! # define STACKBOTTOM ((ptr_t)environ) ! # define DYNAMIC_LOADING ! # include ! # define GETPAGESIZE() sysconf(_SC_PAGE_SIZE) ! /* The following was empirically determined, and is probably */ ! /* not very robust. */ ! /* Note that the backing store base seems to be at a nice */ ! /* address minus one page. */ ! # define BACKING_STORE_DISPLACEMENT 0x1000000 ! # define BACKING_STORE_ALIGNMENT 0x1000 ! # define BACKING_STORE_BASE \ ! (ptr_t)(((word)GC_stackbottom - BACKING_STORE_DISPLACEMENT - 1) \ ! & ~(BACKING_STORE_ALIGNMENT - 1)) # endif # ifdef LINUX + # define CPP_WORDSZ 64 + # define ALIGN_DOUBLE + /* Requires 16 byte alignment for malloc */ + # define ALIGNMENT 8 # define OS_TYPE "LINUX" ! /* The following works on NUE and older kernels: */ ! /* # define STACKBOTTOM ((ptr_t) 0xa000000000000000l) */ ! /* This does not work on NUE: */ ! # define LINUX_STACKBOTTOM /* We also need the base address of the register stack */ ! /* backing store. This is computed in */ ! /* GC_linux_register_stack_base based on the following */ ! /* constants: */ ! # define BACKING_STORE_ALIGNMENT 0x100000 ! # define BACKING_STORE_DISPLACEMENT 0x80000000 ! extern char * GC_register_stackbottom; ! # define BACKING_STORE_BASE ((ptr_t)GC_register_stackbottom) ! # define SEARCH_FOR_DATA_START ! # define DATASTART GC_data_start ! # ifdef __GNUC__ ! # define DYNAMIC_LOADING # else ! /* In the Intel compiler environment, we seem to end up with */ ! /* statically linked executables and an undefined reference */ ! /* to _DYNAMIC */ ! # endif # define MPROTECT_VDB /* Requires Linux 2.3.47 or later. */ ! extern int _end[]; ! # define DATAEND (_end) ! # ifdef __GNUC__ ! # define PREFETCH(x) \ ! __asm__ (" lfetch [%0]": : "r"((void *)(x))) ! # define PREFETCH_FOR_WRITE(x) \ ! __asm__ (" lfetch.excl [%0]": : "r"((void *)(x))) ! # define CLEAR_DOUBLE(x) \ ! __asm__ (" stf.spill [%0]=f0": : "r"((void *)(x))) ! # endif # endif # endif *************** *** 1099,1134 **** # define MACH_TYPE "M88K" # define ALIGNMENT 4 # define ALIGN_DOUBLE ! extern int etext; # ifdef CX_UX # define OS_TYPE "CX_UX" ! # define DATASTART ((((word)&etext + 0x3fffff) & ~0x3fffff) + 0x10000) # endif # ifdef DGUX # define OS_TYPE "DGUX" extern char * GC_SysVGetDataStart(); ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &etext) # endif # define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */ # endif # ifdef S370 # define MACH_TYPE "S370" - # define OS_TYPE "UTS4" # define ALIGNMENT 4 /* Required by hardware */ ! extern int etext; ! extern int _etext; ! extern int _end; extern char * GC_SysVGetDataStart(); ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, &_etext) ! # define DATAEND (&_end) # define HEURISTIC2 # endif # if defined(PJ) # define ALIGNMENT 4 ! extern int _etext; ! # define DATASTART ((ptr_t)(&_etext)) # define HEURISTIC1 # endif --- 1501,1546 ---- # define MACH_TYPE "M88K" # define ALIGNMENT 4 # define ALIGN_DOUBLE ! extern int etext[]; # ifdef CX_UX # define OS_TYPE "CX_UX" ! # define DATASTART ((((word)etext + 0x3fffff) & ~0x3fffff) + 0x10000) # endif # ifdef DGUX # define OS_TYPE "DGUX" extern char * GC_SysVGetDataStart(); ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, etext) # endif # define STACKBOTTOM ((char*)0xf0000000) /* determined empirically */ # endif # ifdef S370 # define MACH_TYPE "S370" # define ALIGNMENT 4 /* Required by hardware */ ! # define USE_GENERIC_PUSH_REGS ! # ifdef UTS4 ! # define OS_TYPE "UTS4" ! extern int etext[]; ! extern int _etext[]; ! extern int _end[]; extern char * GC_SysVGetDataStart(); ! # define DATASTART (ptr_t)GC_SysVGetDataStart(0x10000, _etext) ! # define DATAEND (_end) # define HEURISTIC2 + # endif + # ifdef LINUX + # define OS_TYPE "LINUX" + # define HEURISTIC1 + # define DYNAMIC_LOADING + extern int __data_start[]; + # define DATASTART ((ptr_t)(__data_start)) + # endif # endif # if defined(PJ) # define ALIGNMENT 4 ! extern int _etext[]; ! # define DATASTART ((ptr_t)(_etext)) # define HEURISTIC1 # endif *************** *** 1139,1146 **** # ifdef NETBSD # define OS_TYPE "NETBSD" # define HEURISTIC2 ! extern char etext; ! # define DATASTART ((ptr_t)(&etext)) # define USE_GENERIC_PUSH_REGS # endif # ifdef LINUX --- 1551,1558 ---- # ifdef NETBSD # define OS_TYPE "NETBSD" # define HEURISTIC2 ! extern char etext[]; ! # define DATASTART ((ptr_t)(etext)) # define USE_GENERIC_PUSH_REGS # endif # ifdef LINUX *************** *** 1166,1180 **** /* contain large read-only data tables */ /* that we'd rather not scan. */ # endif ! extern int _end; ! # define DATAEND (&_end) # else ! extern int etext; ! # define DATASTART ((ptr_t)((((word) (&etext)) + 0xfff) & ~0xfff)) # endif # endif #endif #ifdef LINUX_DATA_START /* Some Linux distributions arrange to define __data_start. Some */ /* define data_start as a weak symbol. The latter is technically */ --- 1578,1630 ---- /* contain large read-only data tables */ /* that we'd rather not scan. */ # endif ! extern int _end[]; ! # define DATAEND (_end) # else ! extern int etext[]; ! # define DATASTART ((ptr_t)((((word) (etext)) + 0xfff) & ~0xfff)) # endif # endif + # ifdef MSWINCE + # define OS_TYPE "MSWINCE" + # define DATAEND /* not needed */ + # endif + # ifdef NOSYS + /* __data_start is usually defined in the target linker script. */ + extern int __data_start[]; + # define DATASTART (ptr_t)(__data_start) + # define USE_GENERIC_PUSH_REGS + /* __stack_base__ is set in newlib/libc/sys/arm/crt0.S */ + extern void *__stack_base__; + # define STACKBOTTOM ((ptr_t) (__stack_base__)) + # endif #endif + # ifdef SH + # define MACH_TYPE "SH" + # define ALIGNMENT 4 + # ifdef MSWINCE + # define OS_TYPE "MSWINCE" + # define DATAEND /* not needed */ + # endif + # ifdef LINUX + # define OS_TYPE "LINUX" + # define STACKBOTTOM ((ptr_t) 0x7c000000) + # define USE_GENERIC_PUSH_REGS + # define DYNAMIC_LOADING + # define LINUX_DATA_START + extern int _end[]; + # define DATAEND (_end) + # endif + # endif + + # ifdef SH4 + # define MACH_TYPE "SH4" + # define OS_TYPE "MSWINCE" + # define ALIGNMENT 4 + # define DATAEND /* not needed */ + # endif + #ifdef LINUX_DATA_START /* Some Linux distributions arrange to define __data_start. Some */ /* define data_start as a weak symbol. The latter is technically */ *************** *** 1182,1193 **** /* case we lose. Nonetheless, we try both, prefering __data_start. */ /* We assume gcc. */ # pragma weak __data_start ! extern int __data_start; # pragma weak data_start ! extern int data_start; ! # define DATASTART ((ptr_t)(&__data_start != 0? &__data_start : &data_start)) #endif # ifndef STACK_GROWS_UP # define STACK_GROWS_DOWN # endif --- 1632,1651 ---- /* case we lose. Nonetheless, we try both, prefering __data_start. */ /* We assume gcc. */ # pragma weak __data_start ! extern int __data_start[]; # pragma weak data_start ! extern int data_start[]; ! # define DATASTART ((ptr_t)(__data_start != 0? __data_start : data_start)) #endif + #if defined(LINUX) && defined(REDIRECT_MALLOC) + /* Rld appears to allocate some memory with its own allocator, and */ + /* some through malloc, which might be redirected. To make this */ + /* work with collectable memory, we have to scan memory allocated */ + /* by rld's internal malloc. */ + # define USE_PROC_FOR_LIBRARIES + #endif + # ifndef STACK_GROWS_UP # define STACK_GROWS_DOWN # endif *************** *** 1201,1208 **** # endif # ifndef DATAEND ! extern int end; ! # define DATAEND (&end) # endif # if defined(SVR4) && !defined(GETPAGESIZE) --- 1659,1666 ---- # endif # ifndef DATAEND ! extern int end[]; ! # define DATAEND (end) # endif # if defined(SVR4) && !defined(GETPAGESIZE) *************** *** 1234,1239 **** --- 1692,1703 ---- # define SUNOS5SIGS # endif + # if defined(SVR4) || defined(LINUX) || defined(IRIX) || defined(HPUX) \ + || defined(OPENBSD) || defined(NETBSD) || defined(FREEBSD) \ + || defined(BSD) || defined(_AIX) || defined(MACOSX) || defined(OSF1) + # define UNIX_LIKE /* Basic Unix-like system calls work. */ + # endif + # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64 -> bad word size # endif *************** *** 1264,1269 **** --- 1728,1737 ---- # undef MPROTECT_VDB /* Can't deal with address space holes. */ # endif + # ifdef PARALLEL_MARK + # undef MPROTECT_VDB /* For now. */ + # endif + # if !defined(PCR_VDB) && !defined(PROC_VDB) && !defined(MPROTECT_VDB) # define DEFAULT_VDB # endif *************** *** 1288,1327 **** ((word*)x)[1] = 0; # endif /* CLEAR_DOUBLE */ ! # if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS) ! # define SOLARIS_THREADS # endif ! # if defined(IRIX_THREADS) && !defined(IRIX5) --> inconsistent configuration # endif ! # if defined(IRIX_JDK_THREADS) && !defined(IRIX5) --> inconsistent configuration # endif ! # if defined(LINUX_THREADS) && !defined(LINUX) --> inconsistent configuration # endif ! # if defined(SOLARIS_THREADS) && !defined(SUNOS5) --> inconsistent configuration # endif ! # if defined(HPUX_THREADS) && !defined(HPUX) --> inconsistent configuration # endif # if defined(PCR) || defined(SRC_M3) || \ ! defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ ! defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ ! defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) # define THREADS # endif ! # if defined(HP_PA) || defined(M88K) || defined(POWERPC) \ ! || (defined(I386) && defined(OS2)) || defined(UTS4) || defined(LINT) ! /* Use setjmp based hack to mark from callee-save registers. */ # define USE_GENERIC_PUSH_REGS # endif ! # if defined(SPARC) && !defined(LINUX) ! # define SAVE_CALL_CHAIN # define ASM_CLEAR_CODE /* Stack clearing is crucial, and we */ /* include assembly code to do it well. */ # endif # endif /* GCCONFIG_H */ --- 1756,1861 ---- ((word*)x)[1] = 0; # endif /* CLEAR_DOUBLE */ ! /* Internally we use GC_SOLARIS_THREADS to test for either old or pthreads. */ ! # if defined(GC_SOLARIS_PTHREADS) && !defined(GC_SOLARIS_THREADS) ! # define GC_SOLARIS_THREADS # endif ! ! # if defined(GC_IRIX_THREADS) && !defined(IRIX5) --> inconsistent configuration # endif ! # if defined(GC_LINUX_THREADS) && !defined(LINUX) --> inconsistent configuration # endif ! # if defined(GC_SOLARIS_THREADS) && !defined(SUNOS5) --> inconsistent configuration # endif ! # if defined(GC_HPUX_THREADS) && !defined(HPUX) --> inconsistent configuration # endif ! # if defined(GC_WIN32_THREADS) && !defined(MSWIN32) ! /* Ideally CYGWIN32 should work, in addition to MSWIN32. I suspect */ ! /* the necessary code is mostly there, but nobody has actually made */ ! /* sure the right combination of pieces is compiled in, etc. */ --> inconsistent configuration # endif + # if defined(PCR) || defined(SRC_M3) || \ ! defined(GC_SOLARIS_THREADS) || defined(GC_WIN32_THREADS) || \ ! defined(GC_PTHREADS) # define THREADS # endif ! # if defined(HP_PA) || defined(M88K) || defined(POWERPC) && !defined(MACOSX) \ ! || defined(LINT) || defined(MSWINCE) \ ! || (defined(I386) && defined(__LCC__)) ! /* Use setjmp based hack to mark from callee-save registers. */ ! /* The define should move to the individual platform */ ! /* descriptions. */ # define USE_GENERIC_PUSH_REGS # endif ! ! # if defined(SPARC) # define ASM_CLEAR_CODE /* Stack clearing is crucial, and we */ /* include assembly code to do it well. */ # endif + /* Can we save call chain in objects for debugging? */ + /* SET NFRAMES (# of saved frames) and NARGS (#of args for each frame) */ + /* to reasonable values for the platform. */ + /* Set SAVE_CALL_CHAIN if we can. SAVE_CALL_COUNT can be specified at */ + /* build time, though we feel free to adjust it slightly. */ + /* Define NEED_CALLINFO if we either save the call stack or */ + /* GC_ADD_CALLER is defined. */ + #ifdef LINUX + # include + # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2 + # define HAVE_BUILTIN_BACKTRACE + # endif + #endif + + #if defined(SPARC) + # define CAN_SAVE_CALL_STACKS + # define CAN_SAVE_CALL_ARGS + #endif + #if defined(I386) && defined(LINUX) + /* SAVE_CALL_CHAIN is supported if the code is compiled to save */ + /* frame pointers by default, i.e. no -fomit-frame-pointer flag. */ + # define CAN_SAVE_CALL_STACKS + # define CAN_SAVE_CALL_ARGS + #endif + #if defined(HAVE_BUILTIN_BACKTRACE) && !defined(CAN_SAVE_CALL_STACKS) + # define CAN_SAVE_CALL_STACKS + #endif + + # if defined(SAVE_CALL_COUNT) && !defined(GC_ADD_CALLER) \ + && defined(CAN_SAVE_CALL_STACKS) + # define SAVE_CALL_CHAIN + # endif + # ifdef SAVE_CALL_CHAIN + # if defined(SAVE_CALL_NARGS) && defined(CAN_SAVE_CALL_ARGS) + # define NARGS SAVE_CALL_NARGS + # else + # define NARGS 0 /* Number of arguments to save for each call. */ + # endif + # endif + # ifdef SAVE_CALL_CHAIN + # ifndef SAVE_CALL_COUNT + # define NFRAMES 6 /* Number of frames to save. Even for */ + /* alignment reasons. */ + # else + # define NFRAMES ((SAVE_CALL_COUNT + 1) & ~1) + # endif + # define NEED_CALLINFO + # endif /* SAVE_CALL_CHAIN */ + # ifdef GC_ADD_CALLER + # define NFRAMES 1 + # define NARGS 0 + # define NEED_CALLINFO + # endif + + # if defined(MAKE_BACK_GRAPH) && !defined(DBG_HDRS_ALL) + # define DBG_HDRS_ALL + # endif + # endif /* GCCONFIG_H */ diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/solaris_threads.h gcc-3.1/boehm-gc/include/private/solaris_threads.h *** gcc-3.0.4/boehm-gc/include/private/solaris_threads.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/private/solaris_threads.h Tue Oct 23 23:21:39 2001 *************** *** 0 **** --- 1,34 ---- + #ifdef GC_SOLARIS_THREADS + + /* The set of all known threads. We intercept thread creation and */ + /* joins. We never actually create detached threads. We allocate all */ + /* new thread stacks ourselves. These allow us to maintain this */ + /* data structure. */ + /* Protected by GC_thr_lock. */ + /* Some of this should be declared volatile, but that's incosnsistent */ + /* with some library routine declarations. In particular, the */ + /* definition of cond_t doesn't mention volatile! */ + typedef struct GC_Thread_Rep { + struct GC_Thread_Rep * next; + thread_t id; + word flags; + # define FINISHED 1 /* Thread has exited. */ + # define DETACHED 2 /* Thread is intended to be detached. */ + # define CLIENT_OWNS_STACK 4 + /* Stack was supplied by client. */ + # define SUSPENDED 8 /* Currently suspended. */ + ptr_t stack; + size_t stack_size; + cond_t join_cv; + void * status; + } * GC_thread; + extern GC_thread GC_new_thread(thread_t id); + + extern GC_bool GC_thr_initialized; + extern volatile GC_thread GC_threads[]; + extern size_t GC_min_stack_sz; + extern size_t GC_page_sz; + extern void GC_thr_init(void); + + # endif /* GC_SOLARIS_THREADS */ + diff -Nrc3pad gcc-3.0.4/boehm-gc/include/private/specific.h gcc-3.1/boehm-gc/include/private/specific.h *** gcc-3.0.4/boehm-gc/include/private/specific.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/include/private/specific.h Fri Mar 29 22:33:35 2002 *************** *** 0 **** --- 1,95 ---- + /* + * This is a reimplementation of a subset of the pthread_getspecific/setspecific + * interface. This appears to outperform the standard linuxthreads one + * by a significant margin. + * The major restriction is that each thread may only make a single + * pthread_setspecific call on a single key. (The current data structure + * doesn't really require that. The restriction should be easily removable.) + * We don't currently support the destruction functions, though that + * could be done. + * We also currently assume that only one pthread_setspecific call + * can be executed at a time, though that assumption would be easy to remove + * by adding a lock. + */ + + #include + + /* Called during key creation or setspecific. */ + /* For the GC we already hold lock. */ + /* Currently allocated objects leak on thread exit. */ + /* That's hard to fix, but OK if we allocate garbage */ + /* collected memory. */ + #define MALLOC_CLEAR(n) GC_INTERNAL_MALLOC(n, NORMAL) + #define PREFIXED(name) GC_##name + + #define TS_CACHE_SIZE 1024 + #define CACHE_HASH(n) (((((long)n) >> 8) ^ (long)n) & (TS_CACHE_SIZE - 1)) + #define TS_HASH_SIZE 1024 + #define HASH(n) (((((long)n) >> 8) ^ (long)n) & (TS_HASH_SIZE - 1)) + + /* An entry describing a thread-specific value for a given thread. */ + /* All such accessible structures preserve the invariant that if either */ + /* thread is a valid pthread id or qtid is a valid "quick tread id" */ + /* for a thread, then value holds the corresponding thread specific */ + /* value. This invariant must be preserved at ALL times, since */ + /* asynchronous reads are allowed. */ + typedef struct thread_specific_entry { + unsigned long qtid; /* quick thread id, only for cache */ + void * value; + struct thread_specific_entry *next; + pthread_t thread; + } tse; + + + /* We represent each thread-specific datum as two tables. The first is */ + /* a cache, indexed by a "quick thread identifier". The "quick" thread */ + /* identifier is an easy to compute value, which is guaranteed to */ + /* determine the thread, though a thread may correspond to more than */ + /* one value. We typically use the address of a page in the stack. */ + /* The second is a hash table, indexed by pthread_self(). It is used */ + /* only as a backup. */ + + /* Return the "quick thread id". Default version. Assumes page size, */ + /* or at least thread stack separation, is at least 4K. */ + /* Must be defined so that it never returns 0. (Page 0 can't really */ + /* be part of any stack, since that would make 0 a valid stack pointer.)*/ + static __inline__ unsigned long quick_thread_id() { + int dummy; + return (unsigned long)(&dummy) >> 12; + } + + #define INVALID_QTID ((unsigned long)0) + #define INVALID_THREADID ((pthread_t)0) + + typedef struct thread_specific_data { + tse * volatile cache[TS_CACHE_SIZE]; + /* A faster index to the hash table */ + tse * hash[TS_HASH_SIZE]; + pthread_mutex_t lock; + } tsd; + + typedef tsd * PREFIXED(key_t); + + extern int PREFIXED(key_create) (tsd ** key_ptr, void (* destructor)(void *)); + + extern int PREFIXED(setspecific) (tsd * key, void * value); + + extern void PREFIXED(remove_specific) (tsd * key); + + /* An internal version of getspecific that assumes a cache miss. */ + void * PREFIXED(slow_getspecific) (tsd * key, unsigned long qtid, + tse * volatile * cache_entry); + + static __inline__ void * PREFIXED(getspecific) (tsd * key) { + long qtid = quick_thread_id(); + unsigned hash_val = CACHE_HASH(qtid); + tse * volatile * entry_ptr = key -> cache + hash_val; + tse * entry = *entry_ptr; /* Must be loaded only once. */ + if (entry -> qtid == qtid) { + GC_ASSERT(entry -> thread == pthread_self()); + return entry -> value; + } + return PREFIXED(slow_getspecific) (key, qtid, entry_ptr); + } + + diff -Nrc3pad gcc-3.0.4/boehm-gc/install-sh gcc-3.1/boehm-gc/install-sh *** gcc-3.0.4/boehm-gc/install-sh Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/install-sh Fri Aug 17 18:39:16 2001 *************** *** 0 **** --- 1,251 ---- + #!/bin/sh + # + # install - install a program, script, or datafile + # This comes from X11R5 (mit/util/scripts/install.sh). + # + # Copyright 1991 by the Massachusetts Institute of Technology + # + # Permission to use, copy, modify, distribute, and sell this software and its + # documentation for any purpose is hereby granted without fee, provided that + # the above copyright notice appear in all copies and that both that + # copyright notice and this permission notice appear in supporting + # documentation, and that the name of M.I.T. not be used in advertising or + # publicity pertaining to distribution of the software without specific, + # written prior permission. M.I.T. makes no representations about the + # suitability of this software for any purpose. It is provided "as is" + # without express or implied warranty. + # + # Calling this script install-sh is preferred over install.sh, to prevent + # `make' implicit rules from creating a file called install from it + # when there is no Makefile. + # + # This script is compatible with the BSD install script, but was written + # from scratch. It can only install one file at a time, a restriction + # shared with many OS's install programs. + + + # set DOITPROG to echo to test this script + + # Don't use :- since 4.3BSD and earlier shells don't like it. + doit="${DOITPROG-}" + + + # put in absolute paths if you don't have them in your path; or use env. vars. + + mvprog="${MVPROG-mv}" + cpprog="${CPPROG-cp}" + chmodprog="${CHMODPROG-chmod}" + chownprog="${CHOWNPROG-chown}" + chgrpprog="${CHGRPPROG-chgrp}" + stripprog="${STRIPPROG-strip}" + rmprog="${RMPROG-rm}" + mkdirprog="${MKDIRPROG-mkdir}" + + transformbasename="" + transform_arg="" + instcmd="$mvprog" + chmodcmd="$chmodprog 0755" + chowncmd="" + chgrpcmd="" + stripcmd="" + rmcmd="$rmprog -f" + mvcmd="$mvprog" + src="" + dst="" + dir_arg="" + + while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac + done + + if [ x"$src" = x ] + then + echo "install: no input file specified" + exit 1 + else + true + fi + + if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi + else + + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + + # If destination is a directory, append the input filename; if your system + # does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi + fi + + ## this sed command emulates the dirname command + dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + # this part is taken from Noah Friedman's mkinstalldirs script + + # Skip lots of stat calls in the usual case. + if [ ! -d "$dstdir" ]; then + defaultIFS=' + ' + IFS="${IFS-${defaultIFS}}" + + oIFS="${IFS}" + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS="${oIFS}" + + pathcomp='' + + while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" + done + fi + + if [ x"$dir_arg" != x ] + then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi + else + + # If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + + # Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + + # Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + + # and set any options; do chmod last to preserve setuid bits + + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + + # Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + + fi && + + + exit 0 diff -Nrc3pad gcc-3.0.4/boehm-gc/irix_threads.c gcc-3.1/boehm-gc/irix_threads.c *** gcc-3.0.4/boehm-gc/irix_threads.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/irix_threads.c Tue Feb 12 04:37:53 2002 *************** *** 0 **** --- 1,726 ---- + /* + * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. + * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. + * Copyright (c) 1999 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + /* + * Support code for Irix (>=6.2) Pthreads. This relies on properties + * not guaranteed by the Pthread standard. It may or may not be portable + * to other implementations. + * + * This now also includes an initial attempt at thread support for + * HP/UX 11. + * + * Note that there is a lot of code duplication between linux_threads.c + * and irix_threads.c; any changes made here may need to be reflected + * there too. + */ + + # if defined(GC_IRIX_THREADS) + + # include "private/gc_priv.h" + # include + # include + # include + # include + # include + # include + # include + + #undef pthread_create + #undef pthread_sigmask + #undef pthread_join + #undef pthread_detach + + void GC_thr_init(); + + #if 0 + void GC_print_sig_mask() + { + sigset_t blocked; + int i; + + if (pthread_sigmask(SIG_BLOCK, NULL, &blocked) != 0) + ABORT("pthread_sigmask"); + GC_printf0("Blocked: "); + for (i = 1; i <= MAXSIG; i++) { + if (sigismember(&blocked, i)) { GC_printf1("%ld ",(long) i); } + } + GC_printf0("\n"); + } + #endif + + /* We use the allocation lock to protect thread-related data structures. */ + + /* The set of all known threads. We intercept thread creation and */ + /* joins. We never actually create detached threads. We allocate all */ + /* new thread stacks ourselves. These allow us to maintain this */ + /* data structure. */ + /* Protected by GC_thr_lock. */ + /* Some of this should be declared volatile, but that's incosnsistent */ + /* with some library routine declarations. */ + typedef struct GC_Thread_Rep { + struct GC_Thread_Rep * next; /* More recently allocated threads */ + /* with a given pthread id come */ + /* first. (All but the first are */ + /* guaranteed to be dead, but we may */ + /* not yet have registered the join.) */ + pthread_t id; + word stop; + # define NOT_STOPPED 0 + # define PLEASE_STOP 1 + # define STOPPED 2 + word flags; + # define FINISHED 1 /* Thread has exited. */ + # define DETACHED 2 /* Thread is intended to be detached. */ + # define CLIENT_OWNS_STACK 4 + /* Stack was supplied by client. */ + ptr_t stack; + ptr_t stack_ptr; /* Valid only when stopped. */ + /* But must be within stack region at */ + /* all times. */ + size_t stack_size; /* 0 for original thread. */ + void * status; /* Used only to avoid premature */ + /* reclamation of any data it might */ + /* reference. */ + } * GC_thread; + + GC_thread GC_lookup_thread(pthread_t id); + + /* + * The only way to suspend threads given the pthread interface is to send + * signals. Unfortunately, this means we have to reserve + * a signal, and intercept client calls to change the signal mask. + * We use SIG_SUSPEND, defined in gc_priv.h. + */ + + pthread_mutex_t GC_suspend_lock = PTHREAD_MUTEX_INITIALIZER; + /* Number of threads stopped so far */ + pthread_cond_t GC_suspend_ack_cv = PTHREAD_COND_INITIALIZER; + pthread_cond_t GC_continue_cv = PTHREAD_COND_INITIALIZER; + + void GC_suspend_handler(int sig) + { + int dummy; + GC_thread me; + sigset_t all_sigs; + sigset_t old_sigs; + int i; + + if (sig != SIG_SUSPEND) ABORT("Bad signal in suspend_handler"); + me = GC_lookup_thread(pthread_self()); + /* The lookup here is safe, since I'm doing this on behalf */ + /* of a thread which holds the allocation lock in order */ + /* to stop the world. Thus concurrent modification of the */ + /* data structure is impossible. */ + if (PLEASE_STOP != me -> stop) { + /* Misdirected signal. */ + pthread_mutex_unlock(&GC_suspend_lock); + return; + } + pthread_mutex_lock(&GC_suspend_lock); + me -> stack_ptr = (ptr_t)(&dummy); + me -> stop = STOPPED; + pthread_cond_signal(&GC_suspend_ack_cv); + pthread_cond_wait(&GC_continue_cv, &GC_suspend_lock); + pthread_mutex_unlock(&GC_suspend_lock); + /* GC_printf1("Continuing 0x%x\n", pthread_self()); */ + } + + + GC_bool GC_thr_initialized = FALSE; + + size_t GC_min_stack_sz; + + # define N_FREE_LISTS 25 + ptr_t GC_stack_free_lists[N_FREE_LISTS] = { 0 }; + /* GC_stack_free_lists[i] is free list for stacks of */ + /* size GC_min_stack_sz*2**i. */ + /* Free lists are linked through first word. */ + + /* Return a stack of size at least *stack_size. *stack_size is */ + /* replaced by the actual stack size. */ + /* Caller holds allocation lock. */ + ptr_t GC_stack_alloc(size_t * stack_size) + { + register size_t requested_sz = *stack_size; + register size_t search_sz = GC_min_stack_sz; + register int index = 0; /* = log2(search_sz/GC_min_stack_sz) */ + register ptr_t result; + + while (search_sz < requested_sz) { + search_sz *= 2; + index++; + } + if ((result = GC_stack_free_lists[index]) == 0 + && (result = GC_stack_free_lists[index+1]) != 0) { + /* Try next size up. */ + search_sz *= 2; index++; + } + if (result != 0) { + GC_stack_free_lists[index] = *(ptr_t *)result; + } else { + result = (ptr_t) GC_scratch_alloc(search_sz + 2*GC_page_size); + result = (ptr_t)(((word)result + GC_page_size) & ~(GC_page_size - 1)); + /* Protect hottest page to detect overflow. */ + # ifdef STACK_GROWS_UP + /* mprotect(result + search_sz, GC_page_size, PROT_NONE); */ + # else + /* mprotect(result, GC_page_size, PROT_NONE); */ + result += GC_page_size; + # endif + } + *stack_size = search_sz; + return(result); + } + + /* Caller holds allocation lock. */ + void GC_stack_free(ptr_t stack, size_t size) + { + register int index = 0; + register size_t search_sz = GC_min_stack_sz; + + while (search_sz < size) { + search_sz *= 2; + index++; + } + if (search_sz != size) ABORT("Bad stack size"); + *(ptr_t *)stack = GC_stack_free_lists[index]; + GC_stack_free_lists[index] = stack; + } + + + + # define THREAD_TABLE_SZ 128 /* Must be power of 2 */ + volatile GC_thread GC_threads[THREAD_TABLE_SZ]; + + void GC_push_thread_structures GC_PROTO((void)) + { + GC_push_all((ptr_t)(GC_threads), (ptr_t)(GC_threads)+sizeof(GC_threads)); + } + + /* Add a thread to GC_threads. We assume it wasn't already there. */ + /* Caller holds allocation lock. */ + GC_thread GC_new_thread(pthread_t id) + { + int hv = ((word)id) % THREAD_TABLE_SZ; + GC_thread result; + static struct GC_Thread_Rep first_thread; + static GC_bool first_thread_used = FALSE; + + if (!first_thread_used) { + result = &first_thread; + first_thread_used = TRUE; + /* Dont acquire allocation lock, since we may already hold it. */ + } else { + result = (struct GC_Thread_Rep *) + GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL); + } + if (result == 0) return(0); + result -> id = id; + result -> next = GC_threads[hv]; + GC_threads[hv] = result; + /* result -> flags = 0; */ + /* result -> stop = 0; */ + return(result); + } + + /* Delete a thread from GC_threads. We assume it is there. */ + /* (The code intentionally traps if it wasn't.) */ + /* Caller holds allocation lock. */ + void GC_delete_thread(pthread_t id) + { + int hv = ((word)id) % THREAD_TABLE_SZ; + register GC_thread p = GC_threads[hv]; + register GC_thread prev = 0; + + while (!pthread_equal(p -> id, id)) { + prev = p; + p = p -> next; + } + if (prev == 0) { + GC_threads[hv] = p -> next; + } else { + prev -> next = p -> next; + } + } + + /* If a thread has been joined, but we have not yet */ + /* been notified, then there may be more than one thread */ + /* in the table with the same pthread id. */ + /* This is OK, but we need a way to delete a specific one. */ + void GC_delete_gc_thread(pthread_t id, GC_thread gc_id) + { + int hv = ((word)id) % THREAD_TABLE_SZ; + register GC_thread p = GC_threads[hv]; + register GC_thread prev = 0; + + while (p != gc_id) { + prev = p; + p = p -> next; + } + if (prev == 0) { + GC_threads[hv] = p -> next; + } else { + prev -> next = p -> next; + } + } + + /* Return a GC_thread corresponding to a given thread_t. */ + /* Returns 0 if it's not there. */ + /* Caller holds allocation lock or otherwise inhibits */ + /* updates. */ + /* If there is more than one thread with the given id we */ + /* return the most recent one. */ + GC_thread GC_lookup_thread(pthread_t id) + { + int hv = ((word)id) % THREAD_TABLE_SZ; + register GC_thread p = GC_threads[hv]; + + while (p != 0 && !pthread_equal(p -> id, id)) p = p -> next; + return(p); + } + + + /* Caller holds allocation lock. */ + void GC_stop_world() + { + pthread_t my_thread = pthread_self(); + register int i; + register GC_thread p; + register int result; + struct timespec timeout; + + for (i = 0; i < THREAD_TABLE_SZ; i++) { + for (p = GC_threads[i]; p != 0; p = p -> next) { + if (p -> id != my_thread) { + if (p -> flags & FINISHED) { + p -> stop = STOPPED; + continue; + } + p -> stop = PLEASE_STOP; + result = pthread_kill(p -> id, SIG_SUSPEND); + /* GC_printf1("Sent signal to 0x%x\n", p -> id); */ + switch(result) { + case ESRCH: + /* Not really there anymore. Possible? */ + p -> stop = STOPPED; + break; + case 0: + break; + default: + ABORT("pthread_kill failed"); + } + } + } + } + pthread_mutex_lock(&GC_suspend_lock); + for (i = 0; i < THREAD_TABLE_SZ; i++) { + for (p = GC_threads[i]; p != 0; p = p -> next) { + while (p -> id != my_thread && p -> stop != STOPPED) { + clock_gettime(CLOCK_REALTIME, &timeout); + timeout.tv_nsec += 50000000; /* 50 msecs */ + if (timeout.tv_nsec >= 1000000000) { + timeout.tv_nsec -= 1000000000; + ++timeout.tv_sec; + } + result = pthread_cond_timedwait(&GC_suspend_ack_cv, + &GC_suspend_lock, + &timeout); + if (result == ETIMEDOUT) { + /* Signal was lost or misdirected. Try again. */ + /* Duplicate signals should be benign. */ + result = pthread_kill(p -> id, SIG_SUSPEND); + } + } + } + } + pthread_mutex_unlock(&GC_suspend_lock); + /* GC_printf1("World stopped 0x%x\n", pthread_self()); */ + } + + /* Caller holds allocation lock. */ + void GC_start_world() + { + GC_thread p; + unsigned i; + + /* GC_printf0("World starting\n"); */ + for (i = 0; i < THREAD_TABLE_SZ; i++) { + for (p = GC_threads[i]; p != 0; p = p -> next) { + p -> stop = NOT_STOPPED; + } + } + pthread_mutex_lock(&GC_suspend_lock); + /* All other threads are at pthread_cond_wait in signal handler. */ + /* Otherwise we couldn't have acquired the lock. */ + pthread_mutex_unlock(&GC_suspend_lock); + pthread_cond_broadcast(&GC_continue_cv); + } + + # ifdef MMAP_STACKS + --> not really supported yet. + int GC_is_thread_stack(ptr_t addr) + { + register int i; + register GC_thread p; + + for (i = 0; i < THREAD_TABLE_SZ; i++) { + for (p = GC_threads[i]; p != 0; p = p -> next) { + if (p -> stack_size != 0) { + if (p -> stack <= addr && + addr < p -> stack + p -> stack_size) + return 1; + } + } + } + return 0; + } + # endif + + /* We hold allocation lock. Should do exactly the right thing if the */ + /* world is stopped. Should not fail if it isn't. */ + void GC_push_all_stacks() + { + register int i; + register GC_thread p; + register ptr_t sp = GC_approx_sp(); + register ptr_t hot, cold; + pthread_t me = pthread_self(); + + if (!GC_thr_initialized) GC_thr_init(); + /* GC_printf1("Pushing stacks from thread 0x%x\n", me); */ + for (i = 0; i < THREAD_TABLE_SZ; i++) { + for (p = GC_threads[i]; p != 0; p = p -> next) { + if (p -> flags & FINISHED) continue; + if (pthread_equal(p -> id, me)) { + hot = GC_approx_sp(); + } else { + hot = p -> stack_ptr; + } + if (p -> stack_size != 0) { + # ifdef STACK_GROWS_UP + cold = p -> stack; + # else + cold = p -> stack + p -> stack_size; + # endif + } else { + /* The original stack. */ + cold = GC_stackbottom; + } + # ifdef STACK_GROWS_UP + GC_push_all_stack(cold, hot); + # else + GC_push_all_stack(hot, cold); + # endif + } + } + } + + + /* We hold the allocation lock. */ + void GC_thr_init() + { + GC_thread t; + struct sigaction act; + + if (GC_thr_initialized) return; + GC_thr_initialized = TRUE; + GC_min_stack_sz = HBLKSIZE; + (void) sigaction(SIG_SUSPEND, 0, &act); + if (act.sa_handler != SIG_DFL) + ABORT("Previously installed SIG_SUSPEND handler"); + /* Install handler. */ + act.sa_handler = GC_suspend_handler; + act.sa_flags = SA_RESTART; + (void) sigemptyset(&act.sa_mask); + if (0 != sigaction(SIG_SUSPEND, &act, 0)) + ABORT("Failed to install SIG_SUSPEND handler"); + /* Add the initial thread, so we can stop it. */ + t = GC_new_thread(pthread_self()); + t -> stack_size = 0; + t -> stack_ptr = (ptr_t)(&t); + t -> flags = DETACHED; + } + + int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset) + { + sigset_t fudged_set; + + if (set != NULL && (how == SIG_BLOCK || how == SIG_SETMASK)) { + fudged_set = *set; + sigdelset(&fudged_set, SIG_SUSPEND); + set = &fudged_set; + } + return(pthread_sigmask(how, set, oset)); + } + + struct start_info { + void *(*start_routine)(void *); + void *arg; + word flags; + ptr_t stack; + size_t stack_size; + sem_t registered; /* 1 ==> in our thread table, but */ + /* parent hasn't yet noticed. */ + }; + + void GC_thread_exit_proc(void *arg) + { + GC_thread me; + + LOCK(); + me = GC_lookup_thread(pthread_self()); + if (me -> flags & DETACHED) { + GC_delete_thread(pthread_self()); + } else { + me -> flags |= FINISHED; + } + UNLOCK(); + } + + int GC_pthread_join(pthread_t thread, void **retval) + { + int result; + GC_thread thread_gc_id; + + LOCK(); + thread_gc_id = GC_lookup_thread(thread); + /* This is guaranteed to be the intended one, since the thread id */ + /* cant have been recycled by pthreads. */ + UNLOCK(); + result = pthread_join(thread, retval); + /* Some versions of the Irix pthreads library can erroneously */ + /* return EINTR when the call succeeds. */ + if (EINTR == result) result = 0; + if (result == 0) { + LOCK(); + /* Here the pthread thread id may have been recycled. */ + GC_delete_gc_thread(thread, thread_gc_id); + UNLOCK(); + } + return result; + } + + int GC_pthread_detach(pthread_t thread) + { + int result; + GC_thread thread_gc_id; + + LOCK(); + thread_gc_id = GC_lookup_thread(thread); + UNLOCK(); + result = REAL_FUNC(pthread_detach)(thread); + if (result == 0) { + LOCK(); + thread_gc_id -> flags |= DETACHED; + /* Here the pthread thread id may have been recycled. */ + if (thread_gc_id -> flags & FINISHED) { + GC_delete_gc_thread(thread, thread_gc_id); + } + UNLOCK(); + } + return result; + } + + void * GC_start_routine(void * arg) + { + struct start_info * si = arg; + void * result; + GC_thread me; + pthread_t my_pthread; + void *(*start)(void *); + void *start_arg; + + my_pthread = pthread_self(); + /* If a GC occurs before the thread is registered, that GC will */ + /* ignore this thread. That's fine, since it will block trying to */ + /* acquire the allocation lock, and won't yet hold interesting */ + /* pointers. */ + LOCK(); + /* We register the thread here instead of in the parent, so that */ + /* we don't need to hold the allocation lock during pthread_create. */ + /* Holding the allocation lock there would make REDIRECT_MALLOC */ + /* impossible. It probably still doesn't work, but we're a little */ + /* closer ... */ + /* This unfortunately means that we have to be careful the parent */ + /* doesn't try to do a pthread_join before we're registered. */ + me = GC_new_thread(my_pthread); + me -> flags = si -> flags; + me -> stack = si -> stack; + me -> stack_size = si -> stack_size; + me -> stack_ptr = (ptr_t)si -> stack + si -> stack_size - sizeof(word); + UNLOCK(); + start = si -> start_routine; + start_arg = si -> arg; + sem_post(&(si -> registered)); + pthread_cleanup_push(GC_thread_exit_proc, 0); + result = (*start)(start_arg); + me -> status = result; + me -> flags |= FINISHED; + pthread_cleanup_pop(1); + /* This involves acquiring the lock, ensuring that we can't exit */ + /* while a collection that thinks we're alive is trying to stop */ + /* us. */ + return(result); + } + + # define copy_attr(pa_ptr, source) *(pa_ptr) = *(source) + + int + GC_pthread_create(pthread_t *new_thread, + const pthread_attr_t *attr, + void *(*start_routine)(void *), void *arg) + { + int result; + GC_thread t; + void * stack; + size_t stacksize; + pthread_attr_t new_attr; + int detachstate; + word my_flags = 0; + struct start_info * si = GC_malloc(sizeof(struct start_info)); + /* This is otherwise saved only in an area mmapped by the thread */ + /* library, which isn't visible to the collector. */ + + if (0 == si) return(ENOMEM); + if (0 != sem_init(&(si -> registered), 0, 0)) { + ABORT("sem_init failed"); + } + si -> start_routine = start_routine; + si -> arg = arg; + LOCK(); + if (!GC_initialized) GC_init(); + if (NULL == attr) { + stack = 0; + (void) pthread_attr_init(&new_attr); + } else { + copy_attr(&new_attr, attr); + pthread_attr_getstackaddr(&new_attr, &stack); + } + pthread_attr_getstacksize(&new_attr, &stacksize); + pthread_attr_getdetachstate(&new_attr, &detachstate); + if (stacksize < GC_min_stack_sz) ABORT("Stack too small"); + if (0 == stack) { + stack = (void *)GC_stack_alloc(&stacksize); + if (0 == stack) { + UNLOCK(); + return(ENOMEM); + } + pthread_attr_setstackaddr(&new_attr, stack); + } else { + my_flags |= CLIENT_OWNS_STACK; + } + if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED; + si -> flags = my_flags; + si -> stack = stack; + si -> stack_size = stacksize; + result = pthread_create(new_thread, &new_attr, GC_start_routine, si); + if (0 == new_thread && !(my_flags & CLIENT_OWNS_STACK)) { + GC_stack_free(stack, stacksize); + } + UNLOCK(); + /* Wait until child has been added to the thread table. */ + /* This also ensures that we hold onto si until the child is done */ + /* with it. Thus it doesn't matter whether it is otherwise */ + /* visible to the collector. */ + while (0 != sem_wait(&(si -> registered))) { + if (errno != EINTR) { + GC_printf1("Sem_wait: errno = %ld\n", (unsigned long) errno); + ABORT("sem_wait failed"); + } + } + sem_destroy(&(si -> registered)); + pthread_attr_destroy(&new_attr); /* Probably unnecessary under Irix */ + return(result); + } + + VOLATILE GC_bool GC_collecting = 0; + /* A hint that we're in the collector and */ + /* holding the allocation lock for an */ + /* extended period. */ + + /* Reasonably fast spin locks. Basically the same implementation */ + /* as STL alloc.h. */ + + #define SLEEP_THRESHOLD 3 + + unsigned long GC_allocate_lock = 0; + # define GC_TRY_LOCK() !GC_test_and_set(&GC_allocate_lock,1) + # define GC_LOCK_TAKEN GC_allocate_lock + + void GC_lock() + { + # define low_spin_max 30 /* spin cycles if we suspect uniprocessor */ + # define high_spin_max 1000 /* spin cycles for multiprocessor */ + static unsigned spin_max = low_spin_max; + unsigned my_spin_max; + static unsigned last_spins = 0; + unsigned my_last_spins; + volatile unsigned junk; + # define PAUSE junk *= junk; junk *= junk; junk *= junk; junk *= junk + int i; + + if (GC_TRY_LOCK()) { + return; + } + junk = 0; + my_spin_max = spin_max; + my_last_spins = last_spins; + for (i = 0; i < my_spin_max; i++) { + if (GC_collecting) goto yield; + if (i < my_last_spins/2 || GC_LOCK_TAKEN) { + PAUSE; + continue; + } + if (GC_TRY_LOCK()) { + /* + * got it! + * Spinning worked. Thus we're probably not being scheduled + * against the other process with which we were contending. + * Thus it makes sense to spin longer the next time. + */ + last_spins = i; + spin_max = high_spin_max; + return; + } + } + /* We are probably being scheduled against the other process. Sleep. */ + spin_max = low_spin_max; + yield: + for (i = 0;; ++i) { + if (GC_TRY_LOCK()) { + return; + } + if (i < SLEEP_THRESHOLD) { + sched_yield(); + } else { + struct timespec ts; + + if (i > 26) i = 26; + /* Don't wait for more than about 60msecs, even */ + /* under extreme contention. */ + ts.tv_sec = 0; + ts.tv_nsec = 1 << i; + nanosleep(&ts, 0); + } + } + } + + # else + + #ifndef LINT + int GC_no_Irix_threads; + #endif + + # endif /* GC_IRIX_THREADS */ + diff -Nrc3pad gcc-3.0.4/boehm-gc/libtool.m4 gcc-3.1/boehm-gc/libtool.m4 *** gcc-3.0.4/boehm-gc/libtool.m4 Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/libtool.m4 Fri Aug 17 18:39:16 2001 *************** *** 0 **** --- 1,435 ---- + ## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*- + ## Copyright (C) 1996-1999 Free Software Foundation, Inc. + ## Originally by Gordon Matzigkeit , 1996 + ## + ## This program is free software; you can redistribute it and/or modify + ## it under the terms of the GNU General Public License as published by + ## the Free Software Foundation; either version 2 of the License, or + ## (at your option) any later version. + ## + ## This program is distributed in the hope that it will be useful, but + ## WITHOUT ANY WARRANTY; without even the implied warranty of + ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ## General Public License for more details. + ## + ## You should have received a copy of the GNU General Public License + ## along with this program; if not, write to the Free Software + ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + ## + ## As a special exception to the GNU General Public License, if you + ## distribute this file as part of a program that contains a + ## configuration script generated by Autoconf, you may include it under + ## the same distribution terms that you use for the rest of that program. + + # serial 40 AC_PROG_LIBTOOL + AC_DEFUN(AC_PROG_LIBTOOL, + [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + + # Save cache, so that ltconfig can load it + AC_CACHE_SAVE + + # Actually configure libtool. ac_aux_dir is where install-sh is found. + CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ + LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ + LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ + DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ + ${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ + $libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \ + || AC_MSG_ERROR([libtool configure failed]) + + # Reload cache, that may have been modified by ltconfig + AC_CACHE_LOAD + + # This can be used to rebuild libtool when needed + LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + + # Always use our own libtool. + LIBTOOL='$(SHELL) $(top_builddir)/libtool' + AC_SUBST(LIBTOOL)dnl + + # Redirect the config.log output again, so that the ltconfig log is not + # clobbered by the next message. + exec 5>>./config.log + ]) + + AC_DEFUN(AC_LIBTOOL_SETUP, + [AC_PREREQ(2.13)dnl + AC_REQUIRE([AC_ENABLE_SHARED])dnl + AC_REQUIRE([AC_ENABLE_STATIC])dnl + AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_CANONICAL_BUILD])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_PROG_LD])dnl + AC_REQUIRE([AC_PROG_NM])dnl + AC_REQUIRE([AC_PROG_LN_S])dnl + dnl + + case "$target" in + NONE) lt_target="$host" ;; + *) lt_target="$target" ;; + esac + + # Check for any special flags to pass to ltconfig. + # + # the following will cause an existing older ltconfig to fail, so + # we ignore this at the expense of the cache file... Checking this + # will just take longer ... bummer! + #libtool_flags="--cache-file=$cache_file" + # + test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" + test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" + test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" + test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" + test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" + ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], + [libtool_flags="$libtool_flags --enable-dlopen"]) + ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], + [libtool_flags="$libtool_flags --enable-win32-dll"]) + AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) + test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" + test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + + # Some flags need to be propagated to the compiler or linker for good + # libtool support. + case "$lt_target" in + *-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + + *-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + + ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], + [*-*-cygwin* | *-*-mingw*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) + esac + ]) + + # AC_LIBTOOL_DLOPEN - enable checks for dlopen support + AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + + # AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's + AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + + # AC_ENABLE_SHARED - implement the --enable-shared flag + # Usage: AC_ENABLE_SHARED[(DEFAULT)] + # Where DEFAULT is either `yes' or `no'. If omitted, it defaults to + # `yes'. + AC_DEFUN(AC_ENABLE_SHARED, [dnl + define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl + AC_ARG_ENABLE(shared, + changequote(<<, >>)dnl + << --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], + changequote([, ])dnl + [p=${PACKAGE-default} + case "$enableval" in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; + esac], + enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl + ]) + + # AC_DISABLE_SHARED - set the default shared flag to --disable-shared + AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_ENABLE_SHARED(no)]) + + # AC_ENABLE_STATIC - implement the --enable-static flag + # Usage: AC_ENABLE_STATIC[(DEFAULT)] + # Where DEFAULT is either `yes' or `no'. If omitted, it defaults to + # `yes'. + AC_DEFUN(AC_ENABLE_STATIC, [dnl + define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl + AC_ARG_ENABLE(static, + changequote(<<, >>)dnl + << --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], + changequote([, ])dnl + [p=${PACKAGE-default} + case "$enableval" in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; + esac], + enable_static=AC_ENABLE_STATIC_DEFAULT)dnl + ]) + + # AC_DISABLE_STATIC - set the default static flag to --disable-static + AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_ENABLE_STATIC(no)]) + + + # AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag + # Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] + # Where DEFAULT is either `yes' or `no'. If omitted, it defaults to + # `yes'. + AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl + define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl + AC_ARG_ENABLE(fast-install, + changequote(<<, >>)dnl + << --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], + changequote([, ])dnl + [p=${PACKAGE-default} + case "$enableval" in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; + esac], + enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl + ]) + + # AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install + AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_ENABLE_FAST_INSTALL(no)]) + + # AC_PROG_LD - find the path to the GNU or non-GNU linker + AC_DEFUN(AC_PROG_LD, + [AC_ARG_WITH(gnu-ld, + [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], + test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_CANONICAL_BUILD])dnl + ac_prog=ld + if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + changequote(,)dnl + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + changequote([,])dnl + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) + else + AC_MSG_CHECKING([for non-GNU ld]) + fi + AC_CACHE_VAL(ac_cv_path_LD, + [if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + else + ac_cv_path_LD="$LD" # Let the user override the test with a path. + fi]) + LD="$ac_cv_path_LD" + if test -n "$LD"; then + AC_MSG_RESULT($LD) + else + AC_MSG_RESULT(no) + fi + test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) + AC_PROG_LD_GNU + ]) + + AC_DEFUN(AC_PROG_LD_GNU, + [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, + [# I'd rather use --version here, but apparently some GNU ld's only accept -v. + if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes + else + ac_cv_prog_gnu_ld=no + fi]) + ]) + + # AC_PROG_NM - find the path to a BSD-compatible name lister + AC_DEFUN(AC_PROG_NM, + [AC_MSG_CHECKING([for BSD-compatible nm]) + AC_CACHE_VAL(ac_cv_path_NM, + [if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" + else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm + fi]) + NM="$ac_cv_path_NM" + AC_MSG_RESULT([$NM]) + ]) + + # AC_CHECK_LIBM - check for math library + AC_DEFUN(AC_CHECK_LIBM, + [AC_REQUIRE([AC_CANONICAL_HOST])dnl + LIBM= + case "$lt_target" in + *-*-beos* | *-*-cygwin*) + # These system don't have libm + ;; + *-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; + *) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; + esac + ]) + + # AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for + # the libltdl convenience library, adds --enable-ltdl-convenience to + # the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor + # is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed + # to be `${top_builddir}/libltdl'. Make sure you start DIR with + # '${top_builddir}/' (note the single quotes!) if your package is not + # flat, and, if you're not using automake, define top_builddir as + # appropriate in the Makefiles. + AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case "$enable_ltdl_convenience" in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) + ]) + + # AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for + # the libltdl installable library, and adds --enable-ltdl-install to + # the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor + # is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed + # to be `${top_builddir}/libltdl'. Make sure you start DIR with + # '${top_builddir}/' (note the single quotes!) if your package is not + # flat, and, if you're not using automake, define top_builddir as + # appropriate in the Makefiles. + # In the future, this macro may have to be called after AC_PROG_LIBTOOL. + AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi + ]) + + dnl old names + AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl + AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl + AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl + AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl + AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl + AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl + AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl + + dnl This is just to silence aclocal about the macro not being used + ifelse([AC_DISABLE_FAST_INSTALL])dnl diff -Nrc3pad gcc-3.0.4/boehm-gc/linux_threads.c gcc-3.1/boehm-gc/linux_threads.c *** gcc-3.0.4/boehm-gc/linux_threads.c Thu Apr 5 00:13:13 2001 --- gcc-3.1/boehm-gc/linux_threads.c Fri Mar 29 22:33:34 2002 *************** *** 2,7 **** --- 2,8 ---- * Copyright (c) 1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996 by Silicon Graphics. All rights reserved. * Copyright (c) 1998 by Fergus Henderson. All rights reserved. + * Copyright (c) 2000-2001 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 17,40 **** * thread package for Linux which is included in libc6. * * This code relies on implementation details of LinuxThreads, ! * (i.e. properties not guaranteed by the Pthread standard): ! * ! * - the function GC_linux_thread_top_of_stack(void) ! * relies on the way LinuxThreads lays out thread stacks ! * in the address space. * * Note that there is a lot of code duplication between linux_threads.c ! * and irix_threads.c; any changes made here may need to be reflected ! * there too. */ /* #define DEBUG_THREADS 1 */ /* ANSI C requires that a compilation unit contains something */ - # include "gc_priv.h" ! # if defined(LINUX_THREADS) # include # include # include --- 18,85 ---- * thread package for Linux which is included in libc6. * * This code relies on implementation details of LinuxThreads, ! * (i.e. properties not guaranteed by the Pthread standard), ! * though this version now does less of that than the other Pthreads ! * support code. * * Note that there is a lot of code duplication between linux_threads.c ! * and thread support for some of the other Posix platforms; any changes ! * made here may need to be reflected there too. ! */ ! /* ! * Linux_threads.c now also includes some code to support HPUX and ! * OSF1 (Compaq Tru64 Unix, really). The OSF1 support is not yet ! * functional. The OSF1 code is based on Eric Benson's ! * patch, though that was originally against hpux_irix_threads. The code ! * here is completely untested. With 0.0000001% probability, it might ! * actually work. ! * ! * Eric also suggested an alternate basis for a lock implementation in ! * his code: ! * + #elif defined(OSF1) ! * + unsigned long GC_allocate_lock = 0; ! * + msemaphore GC_allocate_semaphore; ! * + # define GC_TRY_LOCK() \ ! * + ((msem_lock(&GC_allocate_semaphore, MSEM_IF_NOWAIT) == 0) \ ! * + ? (GC_allocate_lock = 1) \ ! * + : 0) ! * + # define GC_LOCK_TAKEN GC_allocate_lock */ /* #define DEBUG_THREADS 1 */ /* ANSI C requires that a compilation unit contains something */ ! # include "gc.h" ! ! # if defined(GC_PTHREADS) && !defined(GC_SOLARIS_THREADS) \ ! && !defined(GC_IRIX_THREADS) ! ! # include "private/gc_priv.h" ! ! # if defined(GC_HPUX_THREADS) && !defined(USE_PTHREAD_SPECIFIC) \ ! && !defined(USE_HPUX_TLS) ! # define USE_HPUX_TLS ! # endif + # ifdef THREAD_LOCAL_ALLOC + # if !defined(USE_PTHREAD_SPECIFIC) && !defined(USE_HPUX_TLS) + # include "private/specific.h" + # endif + # if defined(USE_PTHREAD_SPECIFIC) + # define GC_getspecific pthread_getspecific + # define GC_setspecific pthread_setspecific + # define GC_key_create pthread_key_create + typedef pthread_key_t GC_key_t; + # endif + # if defined(USE_HPUX_TLS) + # define GC_getspecific(x) (x) + # define GC_setspecific(key, v) ((key) = (v), 0) + # define GC_key_create(key, d) 0 + typedef void * GC_key_t; + # endif + # endif + # include # include # include # include *************** *** 44,51 **** # include # include # include ! #ifdef USE_LD_WRAP # define WRAP_FUNC(f) __wrap_##f # define REAL_FUNC(f) __real_##f #else --- 89,103 ---- # include # include # include + # include + # include + # include ! #ifndef __GNUC__ ! # define __inline__ ! #endif ! ! #ifdef GC_USE_LD_WRAP # define WRAP_FUNC(f) __wrap_##f # define REAL_FUNC(f) __real_##f #else *************** *** 54,59 **** --- 106,112 ---- # undef pthread_create # undef pthread_sigmask # undef pthread_join + # undef pthread_detach #endif *************** void GC_print_sig_mask() *** 75,88 **** } #endif /* We use the allocation lock to protect thread-related data structures. */ /* The set of all known threads. We intercept thread creation and */ ! /* joins. We never actually create detached threads. We allocate all */ ! /* new thread stacks ourselves. These allow us to maintain this */ ! /* data structure. */ ! /* Protected by GC_thr_lock. */ ! /* Some of this should be declared volatile, but that's incosnsistent */ /* with some library routine declarations. */ typedef struct GC_Thread_Rep { struct GC_Thread_Rep * next; /* More recently allocated threads */ --- 128,140 ---- } #endif + /* We use the allocation lock to protect thread-related data structures. */ /* The set of all known threads. We intercept thread creation and */ ! /* joins. */ ! /* Protected by allocation/GC lock. */ ! /* Some of this should be declared volatile, but that's inconsistent */ /* with some library routine declarations. */ typedef struct GC_Thread_Rep { struct GC_Thread_Rep * next; /* More recently allocated threads */ *************** typedef struct GC_Thread_Rep { *** 91,101 **** /* guaranteed to be dead, but we may */ /* not yet have registered the join.) */ pthread_t id; ! word flags; # define FINISHED 1 /* Thread has exited. */ # define DETACHED 2 /* Thread is intended to be detached. */ # define MAIN_THREAD 4 /* True for the original thread only. */ ! ptr_t stack_end; /* Cold end of the stack. */ ptr_t stack_ptr; /* Valid only when stopped. */ # ifdef IA64 --- 143,159 ---- /* guaranteed to be dead, but we may */ /* not yet have registered the join.) */ pthread_t id; ! short flags; # define FINISHED 1 /* Thread has exited. */ # define DETACHED 2 /* Thread is intended to be detached. */ # define MAIN_THREAD 4 /* True for the original thread only. */ ! short thread_blocked; /* Protected by GC lock. */ ! /* Treated as a boolean value. If set, */ ! /* thread will acquire GC lock before */ ! /* doing any pointer manipulations, and */ ! /* has set its sp value. Thus it does */ ! /* not need to be sent a signal to stop */ ! /* it. */ ptr_t stack_end; /* Cold end of the stack. */ ptr_t stack_ptr; /* Valid only when stopped. */ # ifdef IA64 *************** typedef struct GC_Thread_Rep { *** 107,160 **** /* Used only to avoid premature */ /* reclamation of any data it might */ /* reference. */ } * GC_thread; GC_thread GC_lookup_thread(pthread_t id); /* ! * The only way to suspend threads given the pthread interface is to send ! * signals. We can't use SIGSTOP directly, because we need to get the ! * thread to save its stack pointer in the GC thread table before ! * suspending. So we have to reserve a signal of our own for this. ! * This means we have to intercept client calls to change the signal mask. ! * The linuxthreads package already uses SIGUSR1 and SIGUSR2, ! * so we need to reuse something else. I chose SIGPWR. ! * (Perhaps SIGUNUSED would be a better choice.) */ - #define SIG_SUSPEND SIGPWR ! #define SIG_RESTART SIGXCPU sem_t GC_suspend_ack_sem; /* - GC_linux_thread_top_of_stack() relies on implementation details of - LinuxThreads, namely that thread stacks are allocated on 2M boundaries - and grow to no more than 2M. To make sure that we're using LinuxThreads and not some other thread package, we generate a dummy reference to `pthread_kill_other_threads_np' (was `__pthread_initial_thread_bos' but that disappeared), which is a symbol defined in LinuxThreads, but (hopefully) not in other thread packages. */ void (*dummy_var_to_force_linux_threads)() = pthread_kill_other_threads_np; ! #define LINUX_THREADS_STACK_SIZE (2 * 1024 * 1024) ! static inline ptr_t GC_linux_thread_top_of_stack(void) { ! char *sp = GC_approx_sp(); ! ptr_t tos = (ptr_t) (((unsigned long)sp | (LINUX_THREADS_STACK_SIZE - 1)) + 1); ! #if DEBUG_THREADS ! GC_printf1("SP = %lx\n", (unsigned long)sp); ! GC_printf1("TOS = %lx\n", (unsigned long)tos); ! #endif ! return tos; } ! #if defined(SPARC) || defined(IA64) ! extern word GC_save_regs_in_stack(); ! #endif void GC_suspend_handler(int sig) { --- 165,575 ---- /* Used only to avoid premature */ /* reclamation of any data it might */ /* reference. */ + # ifdef THREAD_LOCAL_ALLOC + # if CPP_WORDSZ == 64 && defined(ALIGN_DOUBLE) + # define GRANULARITY 16 + # define NFREELISTS 49 + # else + # define GRANULARITY 8 + # define NFREELISTS 65 + # endif + /* The ith free list corresponds to size i*GRANULARITY */ + # define INDEX_FROM_BYTES(n) ((ADD_SLOP(n) + GRANULARITY - 1)/GRANULARITY) + # define BYTES_FROM_INDEX(i) ((i) * GRANULARITY - EXTRA_BYTES) + # define SMALL_ENOUGH(bytes) (ADD_SLOP(bytes) <= \ + (NFREELISTS-1)*GRANULARITY) + ptr_t ptrfree_freelists[NFREELISTS]; + ptr_t normal_freelists[NFREELISTS]; + # ifdef GC_GCJ_SUPPORT + ptr_t gcj_freelists[NFREELISTS]; + # endif + /* Free lists contain either a pointer or a small count */ + /* reflecting the number of granules allocated at that */ + /* size. */ + /* 0 ==> thread-local allocation in use, free list */ + /* empty. */ + /* > 0, <= DIRECT_GRANULES ==> Using global allocation, */ + /* too few objects of this size have been */ + /* allocated by this thread. */ + /* >= HBLKSIZE => pointer to nonempty free list. */ + /* > DIRECT_GRANULES, < HBLKSIZE ==> transition to */ + /* local alloc, equivalent to 0. */ + # define DIRECT_GRANULES (HBLKSIZE/GRANULARITY) + /* Don't use local free lists for up to this much */ + /* allocation. */ + # endif } * GC_thread; GC_thread GC_lookup_thread(pthread_t id); + static GC_bool parallel_initialized = FALSE; + + void GC_init_parallel(); + + # if defined(THREAD_LOCAL_ALLOC) && !defined(DBG_HDRS_ALL) + + /* We don't really support thread-local allocation with DBG_HDRS_ALL */ + + #ifdef USE_HPUX_TLS + __thread + #endif + GC_key_t GC_thread_key; + + static GC_bool keys_initialized; + + /* Recover the contents of the freelist array fl into the global one gfl.*/ + /* Note that the indexing scheme differs, in that gfl has finer size */ + /* resolution, even if not all entries are used. */ + /* We hold the allocator lock. */ + static void return_freelists(ptr_t *fl, ptr_t *gfl) + { + int i; + ptr_t q, *qptr; + size_t nwords; + + for (i = 1; i < NFREELISTS; ++i) { + nwords = i * (GRANULARITY/sizeof(word)); + qptr = fl + i; + q = *qptr; + if ((word)q >= HBLKSIZE) { + if (gfl[nwords] == 0) { + gfl[nwords] = q; + } else { + /* Concatenate: */ + for (; (word)q >= HBLKSIZE; qptr = &(obj_link(q)), q = *qptr); + GC_ASSERT(0 == q); + *qptr = gfl[nwords]; + gfl[nwords] = fl[i]; + } + } + /* Clear fl[i], since the thread structure may hang around. */ + /* Do it in a way that is likely to trap if we access it. */ + fl[i] = (ptr_t)HBLKSIZE; + } + } + + /* We statically allocate a single "size 0" object. It is linked to */ + /* itself, and is thus repeatedly reused for all size 0 allocation */ + /* requests. (Size 0 gcj allocation requests are incorrect, and */ + /* we arrange for those to fault asap.) */ + static ptr_t size_zero_object = (ptr_t)(&size_zero_object); + + /* Each thread structure must be initialized. */ + /* This call must be made from the new thread. */ + /* Caller holds allocation lock. */ + void GC_init_thread_local(GC_thread p) + { + int i; + + if (!keys_initialized) { + if (0 != GC_key_create(&GC_thread_key, 0)) { + ABORT("Failed to create key for local allocator"); + } + keys_initialized = TRUE; + } + if (0 != GC_setspecific(GC_thread_key, p)) { + ABORT("Failed to set thread specific allocation pointers"); + } + for (i = 1; i < NFREELISTS; ++i) { + p -> ptrfree_freelists[i] = (ptr_t)1; + p -> normal_freelists[i] = (ptr_t)1; + # ifdef GC_GCJ_SUPPORT + p -> gcj_freelists[i] = (ptr_t)1; + # endif + } + /* Set up the size 0 free lists. */ + p -> ptrfree_freelists[0] = (ptr_t)(&size_zero_object); + p -> normal_freelists[0] = (ptr_t)(&size_zero_object); + # ifdef GC_GCJ_SUPPORT + p -> gcj_freelists[0] = (ptr_t)(-1); + # endif + } + + #ifdef GC_GCJ_SUPPORT + extern ptr_t * GC_gcjobjfreelist; + #endif + + /* We hold the allocator lock. */ + void GC_destroy_thread_local(GC_thread p) + { + /* We currently only do this from the thread itself. */ + GC_ASSERT(GC_getspecific(GC_thread_key) == (void *)p); + return_freelists(p -> ptrfree_freelists, GC_aobjfreelist); + return_freelists(p -> normal_freelists, GC_objfreelist); + # ifdef GC_GCJ_SUPPORT + return_freelists(p -> gcj_freelists, GC_gcjobjfreelist); + # endif + } + + extern GC_PTR GC_generic_malloc_many(); + + GC_PTR GC_local_malloc(size_t bytes) + { + if (EXPECT(!SMALL_ENOUGH(bytes),0)) { + return(GC_malloc(bytes)); + } else { + int index = INDEX_FROM_BYTES(bytes); + ptr_t * my_fl; + ptr_t my_entry; + GC_key_t k = GC_thread_key; + void * tsd; + + # if defined(REDIRECT_MALLOC) && !defined(USE_PTHREAD_SPECIFIC) \ + || !defined(__GNUC__) + if (EXPECT(0 == k, 0)) { + /* This can happen if we get called when the world is */ + /* being initialized. Whether we can actually complete */ + /* the initialization then is unclear. */ + GC_init_parallel(); + k = GC_thread_key; + } + # endif + tsd = GC_getspecific(GC_thread_key); + # ifdef GC_ASSERTIONS + LOCK(); + GC_ASSERT(tsd == (void *)GC_lookup_thread(pthread_self())); + UNLOCK(); + # endif + my_fl = ((GC_thread)tsd) -> normal_freelists + index; + my_entry = *my_fl; + if (EXPECT((word)my_entry >= HBLKSIZE, 1)) { + ptr_t next = obj_link(my_entry); + GC_PTR result = (GC_PTR)my_entry; + *my_fl = next; + obj_link(my_entry) = 0; + PREFETCH_FOR_WRITE(next); + return result; + } else if ((word)my_entry - 1 < DIRECT_GRANULES) { + *my_fl = my_entry + index + 1; + return GC_malloc(bytes); + } else { + GC_generic_malloc_many(BYTES_FROM_INDEX(index), NORMAL, my_fl); + if (*my_fl == 0) return GC_oom_fn(bytes); + return GC_local_malloc(bytes); + } + } + } + + GC_PTR GC_local_malloc_atomic(size_t bytes) + { + if (EXPECT(!SMALL_ENOUGH(bytes), 0)) { + return(GC_malloc_atomic(bytes)); + } else { + int index = INDEX_FROM_BYTES(bytes); + ptr_t * my_fl = ((GC_thread)GC_getspecific(GC_thread_key)) + -> ptrfree_freelists + index; + ptr_t my_entry = *my_fl; + if (EXPECT((word)my_entry >= HBLKSIZE, 1)) { + GC_PTR result = (GC_PTR)my_entry; + *my_fl = obj_link(my_entry); + return result; + } else if ((word)my_entry - 1 < DIRECT_GRANULES) { + *my_fl = my_entry + index + 1; + return GC_malloc_atomic(bytes); + } else { + GC_generic_malloc_many(BYTES_FROM_INDEX(index), PTRFREE, my_fl); + /* *my_fl is updated while the collector is excluded; */ + /* the free list is always visible to the collector as */ + /* such. */ + if (*my_fl == 0) return GC_oom_fn(bytes); + return GC_local_malloc_atomic(bytes); + } + } + } + + #ifdef GC_GCJ_SUPPORT + + #include "include/gc_gcj.h" + + #ifdef GC_ASSERTIONS + extern GC_bool GC_gcj_malloc_initialized; + #endif + + extern int GC_gcj_kind; + + GC_PTR GC_local_gcj_malloc(size_t bytes, + void * ptr_to_struct_containing_descr) + { + GC_ASSERT(GC_gcj_malloc_initialized); + if (EXPECT(!SMALL_ENOUGH(bytes), 0)) { + return GC_gcj_malloc(bytes, ptr_to_struct_containing_descr); + } else { + int index = INDEX_FROM_BYTES(bytes); + ptr_t * my_fl = ((GC_thread)GC_getspecific(GC_thread_key)) + -> gcj_freelists + index; + ptr_t my_entry = *my_fl; + if (EXPECT((word)my_entry >= HBLKSIZE, 1)) { + GC_PTR result = (GC_PTR)my_entry; + GC_ASSERT(!GC_incremental); + /* We assert that any concurrent marker will stop us. */ + /* Thus it is impossible for a mark procedure to see the */ + /* allocation of the next object, but to see this object */ + /* still containing a free list pointer. Otherwise the */ + /* marker might find a random "mark descriptor". */ + *(volatile ptr_t *)my_fl = obj_link(my_entry); + /* We must update the freelist before we store the pointer. */ + /* Otherwise a GC at this point would see a corrupted */ + /* free list. */ + /* A memory barrier is probably never needed, since the */ + /* action of stopping this thread will cause prior writes */ + /* to complete. */ + GC_ASSERT(((void * volatile *)result)[1] == 0); + *(void * volatile *)result = ptr_to_struct_containing_descr; + return result; + } else if ((word)my_entry - 1 < DIRECT_GRANULES) { + *my_fl = my_entry + index + 1; + return GC_gcj_malloc(bytes, ptr_to_struct_containing_descr); + } else { + GC_generic_malloc_many(BYTES_FROM_INDEX(index), GC_gcj_kind, my_fl); + if (*my_fl == 0) return GC_oom_fn(bytes); + return GC_local_gcj_malloc(bytes, ptr_to_struct_containing_descr); + } + } + } + + #endif /* GC_GCJ_SUPPORT */ + + # else /* !THREAD_LOCAL_ALLOC && !DBG_HDRS_ALL */ + + # define GC_destroy_thread_local(t) + + # endif /* !THREAD_LOCAL_ALLOC */ + /* ! * We use signals to stop threads during GC. ! * ! * Suspended threads wait in signal handler for SIG_THR_RESTART. ! * That's more portable than semaphores or condition variables. ! * (We do use sem_post from a signal handler, but that should be portable.) ! * ! * The thread suspension signal SIG_SUSPEND is now defined in gc_priv.h. ! * Note that we can't just stop a thread; we need it to save its stack ! * pointer(s) and acknowledge. */ ! #ifndef SIG_THR_RESTART ! # if defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS) ! # define SIG_THR_RESTART _SIGRTMIN + 5 ! # else ! # define SIG_THR_RESTART SIGXCPU ! # endif ! #endif sem_t GC_suspend_ack_sem; + #if 0 /* To make sure that we're using LinuxThreads and not some other thread package, we generate a dummy reference to `pthread_kill_other_threads_np' (was `__pthread_initial_thread_bos' but that disappeared), which is a symbol defined in LinuxThreads, but (hopefully) not in other thread packages. + + We no longer do this, since this code is now portable enough that it might + actually work for something else. */ void (*dummy_var_to_force_linux_threads)() = pthread_kill_other_threads_np; + #endif /* 0 */ ! #if defined(SPARC) || defined(IA64) ! extern word GC_save_regs_in_stack(); ! #endif ! long GC_nprocs = 1; /* Number of processors. We may not have */ ! /* access to all of them, but this is as good */ ! /* a guess as any ... */ ! ! #ifdef PARALLEL_MARK ! ! # ifndef MAX_MARKERS ! # define MAX_MARKERS 16 ! # endif ! ! static ptr_t marker_sp[MAX_MARKERS] = {0}; ! ! void * GC_mark_thread(void * id) { ! word my_mark_no = 0; ! ! marker_sp[(word)id] = GC_approx_sp(); ! for (;; ++my_mark_no) { ! /* GC_mark_no is passed only to allow GC_help_marker to terminate */ ! /* promptly. This is important if it were called from the signal */ ! /* handler or from the GC lock acquisition code. Under Linux, it's */ ! /* not safe to call it from a signal handler, since it uses mutexes */ ! /* and condition variables. Since it is called only here, the */ ! /* argument is unnecessary. */ ! if (my_mark_no < GC_mark_no || my_mark_no > GC_mark_no + 2) { ! /* resynchronize if we get far off, e.g. because GC_mark_no */ ! /* wrapped. */ ! my_mark_no = GC_mark_no; ! } ! # ifdef DEBUG_THREADS ! GC_printf1("Starting mark helper for mark number %ld\n", my_mark_no); ! # endif ! GC_help_marker(my_mark_no); ! } } ! extern long GC_markers; /* Number of mark threads we would */ ! /* like to have. Includes the */ ! /* initiating thread. */ ! ! pthread_t GC_mark_threads[MAX_MARKERS]; ! ! #define PTHREAD_CREATE REAL_FUNC(pthread_create) ! ! static void start_mark_threads() ! { ! unsigned i; ! pthread_attr_t attr; ! ! if (GC_markers > MAX_MARKERS) { ! WARN("Limiting number of mark threads\n", 0); ! GC_markers = MAX_MARKERS; ! } ! if (0 != pthread_attr_init(&attr)) ABORT("pthread_attr_init failed"); ! ! if (0 != pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) ! ABORT("pthread_attr_setdetachstate failed"); ! ! # ifdef HPUX ! /* Default stack size is usually too small: fix it. */ ! /* Otherwise marker threads or GC may run out of */ ! /* space. */ ! # define MIN_STACK_SIZE (8*HBLKSIZE*sizeof(word)) ! { ! size_t old_size; ! int code; ! ! if (pthread_attr_getstacksize(&attr, &old_size) != 0) ! ABORT("pthread_attr_getstacksize failed\n"); ! if (old_size < MIN_STACK_SIZE) { ! if (pthread_attr_setstacksize(&attr, MIN_STACK_SIZE) != 0) ! ABORT("pthread_attr_setstacksize failed\n"); ! } ! } ! # endif /* HPUX */ ! # ifdef CONDPRINT ! if (GC_print_stats) { ! GC_printf1("Starting %ld marker threads\n", GC_markers - 1); ! } ! # endif ! for (i = 0; i < GC_markers - 1; ++i) { ! if (0 != PTHREAD_CREATE(GC_mark_threads + i, &attr, ! GC_mark_thread, (void *)(word)i)) { ! WARN("Marker thread creation failed, errno = %ld.\n", errno); ! } ! } ! } ! ! #else /* !PARALLEL_MARK */ ! ! static __inline__ void start_mark_threads() ! { ! } ! ! #endif /* !PARALLEL_MARK */ void GC_suspend_handler(int sig) { *************** void GC_suspend_handler(int sig) *** 165,170 **** --- 580,591 ---- sigset_t old_sigs; int i; sigset_t mask; + # ifdef PARALLEL_MARK + word my_mark_no = GC_mark_no; + /* Marker can't proceed until we acknowledge. Thus this is */ + /* guaranteed to be the mark_no correspending to our */ + /* suspension, i.e. the marker can't have incremented it yet. */ + # endif if (sig != SIG_SUSPEND) ABORT("Bad signal in suspend_handler"); *************** void GC_suspend_handler(int sig) *** 192,202 **** sem_post(&GC_suspend_ack_sem); /* Wait until that thread tells us to restart by sending */ ! /* this thread a SIG_RESTART signal. */ ! /* SIG_RESTART should be masked at this point. Thus there */ /* is no race. */ if (sigfillset(&mask) != 0) ABORT("sigfillset() failed"); ! if (sigdelset(&mask, SIG_RESTART) != 0) ABORT("sigdelset() failed"); # ifdef NO_SIGNALS if (sigdelset(&mask, SIGINT) != 0) ABORT("sigdelset() failed"); if (sigdelset(&mask, SIGQUIT) != 0) ABORT("sigdelset() failed"); --- 613,623 ---- sem_post(&GC_suspend_ack_sem); /* Wait until that thread tells us to restart by sending */ ! /* this thread a SIG_THR_RESTART signal. */ ! /* SIG_THR_RESTART should be masked at this point. Thus there */ /* is no race. */ if (sigfillset(&mask) != 0) ABORT("sigfillset() failed"); ! if (sigdelset(&mask, SIG_THR_RESTART) != 0) ABORT("sigdelset() failed"); # ifdef NO_SIGNALS if (sigdelset(&mask, SIGINT) != 0) ABORT("sigdelset() failed"); if (sigdelset(&mask, SIGQUIT) != 0) ABORT("sigdelset() failed"); *************** void GC_suspend_handler(int sig) *** 206,212 **** do { me->signal = 0; sigsuspend(&mask); /* Wait for signal */ ! } while (me->signal != SIG_RESTART); #if DEBUG_THREADS GC_printf1("Continuing 0x%x\n", my_thread); --- 627,633 ---- do { me->signal = 0; sigsuspend(&mask); /* Wait for signal */ ! } while (me->signal != SIG_THR_RESTART); #if DEBUG_THREADS GC_printf1("Continuing 0x%x\n", my_thread); *************** void GC_restart_handler(int sig) *** 217,231 **** { GC_thread me; ! if (sig != SIG_RESTART) ABORT("Bad signal in suspend_handler"); ! /* Let the GC_suspend_handler() know that we got a SIG_RESTART. */ /* The lookup here is safe, since I'm doing this on behalf */ /* of a thread which holds the allocation lock in order */ /* to stop the world. Thus concurrent modification of the */ /* data structure is impossible. */ me = GC_lookup_thread(pthread_self()); ! me->signal = SIG_RESTART; /* ** Note: even if we didn't do anything useful here, --- 638,652 ---- { GC_thread me; ! if (sig != SIG_THR_RESTART) ABORT("Bad signal in suspend_handler"); ! /* Let the GC_suspend_handler() know that we got a SIG_THR_RESTART. */ /* The lookup here is safe, since I'm doing this on behalf */ /* of a thread which holds the allocation lock in order */ /* to stop the world. Thus concurrent modification of the */ /* data structure is impossible. */ me = GC_lookup_thread(pthread_self()); ! me->signal = SIG_THR_RESTART; /* ** Note: even if we didn't do anything useful here, *************** void GC_restart_handler(int sig) *** 240,250 **** --- 661,717 ---- #endif } + /* Defining INSTALL_LOOPING_SEGV_HANDLER causes SIGSEGV and SIGBUS to */ + /* result in an infinite loop in a signal handler. This can be very */ + /* useful for debugging, since (as of RH7) gdb still seems to have */ + /* serious problems with threads. */ + #ifdef INSTALL_LOOPING_SEGV_HANDLER + void GC_looping_handler(int sig) + { + GC_printf3("Signal %ld in thread %lx, pid %ld\n", + sig, pthread_self(), getpid()); + for (;;); + } + #endif + GC_bool GC_thr_initialized = FALSE; # define THREAD_TABLE_SZ 128 /* Must be power of 2 */ volatile GC_thread GC_threads[THREAD_TABLE_SZ]; + void GC_push_thread_structures GC_PROTO((void)) + { + GC_push_all((ptr_t)(GC_threads), (ptr_t)(GC_threads)+sizeof(GC_threads)); + } + + #ifdef THREAD_LOCAL_ALLOC + /* We must explicitly mark ptrfree and gcj free lists, since the free */ + /* list links wouldn't otherwise be found. We also set them in the */ + /* normal free lists, since that involves touching less memory than if */ + /* we scanned them normally. */ + void GC_mark_thread_local_free_lists(void) + { + int i, j; + GC_thread p; + ptr_t q; + + for (i = 0; i < THREAD_TABLE_SZ; ++i) { + for (p = GC_threads[i]; 0 != p; p = p -> next) { + for (j = 1; j < NFREELISTS; ++j) { + q = p -> ptrfree_freelists[j]; + if ((word)q > HBLKSIZE) GC_set_fl_marks(q); + q = p -> normal_freelists[j]; + if ((word)q > HBLKSIZE) GC_set_fl_marks(q); + # ifdef GC_GCJ_SUPPORT + q = p -> gcj_freelists[j]; + if ((word)q > HBLKSIZE) GC_set_fl_marks(q); + # endif /* GC_GCJ_SUPPORT */ + } + } + } + } + #endif /* THREAD_LOCAL_ALLOC */ + /* Add a thread to GC_threads. We assume it wasn't already there. */ /* Caller holds allocation lock. */ GC_thread GC_new_thread(pthread_t id) *************** GC_thread GC_new_thread(pthread_t id) *** 257,272 **** if (!first_thread_used) { result = &first_thread; first_thread_used = TRUE; - /* Dont acquire allocation lock, since we may already hold it. */ } else { result = (struct GC_Thread_Rep *) ! GC_generic_malloc_inner(sizeof(struct GC_Thread_Rep), NORMAL); } if (result == 0) return(0); result -> id = id; result -> next = GC_threads[hv]; GC_threads[hv] = result; ! /* result -> flags = 0; */ return(result); } --- 724,738 ---- if (!first_thread_used) { result = &first_thread; first_thread_used = TRUE; } else { result = (struct GC_Thread_Rep *) ! GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL); } if (result == 0) return(0); result -> id = id; result -> next = GC_threads[hv]; GC_threads[hv] = result; ! GC_ASSERT(result -> flags == 0 && result -> thread_blocked == 0); return(result); } *************** void GC_delete_thread(pthread_t id) *** 288,293 **** --- 754,760 ---- } else { prev -> next = p -> next; } + GC_INTERNAL_FREE(p); } /* If a thread has been joined, but we have not yet */ *************** void GC_delete_gc_thread(pthread_t id, G *** 309,314 **** --- 776,782 ---- } else { prev -> next = p -> next; } + GC_INTERNAL_FREE(p); } /* Return a GC_thread corresponding to a given thread_t. */ *************** GC_thread GC_lookup_thread(pthread_t id) *** 326,331 **** --- 794,804 ---- return(p); } + /* There seems to be a very rare thread stopping problem. To help us */ + /* debug that, we save the ids of the stopping thread. */ + pthread_t GC_stopping_thread; + int GC_stopping_pid; + /* Caller holds allocation lock. */ void GC_stop_world() { *************** void GC_stop_world() *** 335,344 **** --- 808,829 ---- register int n_live_threads = 0; register int result; + GC_stopping_thread = my_thread; /* debugging only. */ + GC_stopping_pid = getpid(); /* debugging only. */ + /* Make sure all free list construction has stopped before we start. */ + /* No new construction can start, since free list construction is */ + /* required to acquire and release the GC lock before it starts, */ + /* and we have the lock. */ + # ifdef PARALLEL_MARK + GC_acquire_mark_lock(); + GC_ASSERT(GC_fl_builder_count == 0); + /* We should have previously waited for it to become zero. */ + # endif /* PARALLEL_MARK */ for (i = 0; i < THREAD_TABLE_SZ; i++) { for (p = GC_threads[i]; p != 0; p = p -> next) { if (p -> id != my_thread) { if (p -> flags & FINISHED) continue; + if (p -> thread_blocked) /* Will wait */ continue; n_live_threads++; #if DEBUG_THREADS GC_printf1("Sending suspend signal to 0x%x\n", p -> id); *************** void GC_stop_world() *** 358,371 **** } } for (i = 0; i < n_live_threads; i++) { ! sem_wait(&GC_suspend_ack_sem); } #if DEBUG_THREADS ! GC_printf1("World stopped 0x%x\n", pthread_self()); #endif } ! /* Caller holds allocation lock. */ void GC_start_world() { pthread_t my_thread = pthread_self(); --- 843,862 ---- } } for (i = 0; i < n_live_threads; i++) { ! if (0 != sem_wait(&GC_suspend_ack_sem)) ! ABORT("sem_wait in handler failed"); } + # ifdef PARALLEL_MARK + GC_release_mark_lock(); + # endif #if DEBUG_THREADS ! GC_printf1("World stopped 0x%x\n", pthread_self()); #endif + GC_stopping_thread = 0; /* debugging only */ } ! /* Caller holds allocation lock, and has held it continuously since */ ! /* the world stopped. */ void GC_start_world() { pthread_t my_thread = pthread_self(); *************** void GC_start_world() *** 382,392 **** for (p = GC_threads[i]; p != 0; p = p -> next) { if (p -> id != my_thread) { if (p -> flags & FINISHED) continue; n_live_threads++; #if DEBUG_THREADS GC_printf1("Sending restart signal to 0x%x\n", p -> id); #endif ! result = pthread_kill(p -> id, SIG_RESTART); switch(result) { case ESRCH: /* Not really there anymore. Possible? */ --- 873,884 ---- for (p = GC_threads[i]; p != 0; p = p -> next) { if (p -> id != my_thread) { if (p -> flags & FINISHED) continue; + if (p -> thread_blocked) continue; n_live_threads++; #if DEBUG_THREADS GC_printf1("Sending restart signal to 0x%x\n", p -> id); #endif ! result = pthread_kill(p -> id, SIG_THR_RESTART); switch(result) { case ESRCH: /* Not really there anymore. Possible? */ *************** void GC_start_world() *** 403,408 **** --- 895,901 ---- #if DEBUG_THREADS GC_printf0("World started\n"); #endif + GC_stopping_thread = 0; /* debugging only */ } # ifdef IA64 *************** void GC_push_all_stacks() *** 430,440 **** for (p = GC_threads[i]; p != 0; p = p -> next) { if (p -> flags & FINISHED) continue; if (pthread_equal(p -> id, me)) { ! # ifdef SPARC ! lo = (ptr_t)GC_save_regs_in_stack(); ! # else ! lo = GC_approx_sp(); ! # endif IF_IA64(bs_hi = (ptr_t)GC_save_regs_in_stack();) } else { lo = p -> stack_ptr; --- 923,933 ---- for (p = GC_threads[i]; p != 0; p = p -> next) { if (p -> flags & FINISHED) continue; if (pthread_equal(p -> id, me)) { ! # ifdef SPARC ! lo = (ptr_t)GC_save_regs_in_stack(); ! # else ! lo = GC_approx_sp(); ! # endif IF_IA64(bs_hi = (ptr_t)GC_save_regs_in_stack();) } else { lo = p -> stack_ptr; *************** void GC_push_all_stacks() *** 454,460 **** (unsigned long) lo, (unsigned long) hi); #endif if (0 == lo) ABORT("GC_push_all_stacks: sp not set!\n"); ! GC_push_all_stack(lo, hi); # ifdef IA64 if (pthread_equal(p -> id, me)) { GC_push_all_eager(bs_lo, bs_hi); --- 947,958 ---- (unsigned long) lo, (unsigned long) hi); #endif if (0 == lo) ABORT("GC_push_all_stacks: sp not set!\n"); ! # ifdef STACK_GROWS_UP ! /* We got them backwards! */ ! GC_push_all_stack(hi, lo); ! # else ! GC_push_all_stack(lo, hi); ! # endif # ifdef IA64 if (pthread_equal(p -> id, me)) { GC_push_all_eager(bs_lo, bs_hi); *************** void GC_push_all_stacks() *** 466,471 **** --- 964,1033 ---- } } + #ifdef USE_PROC_FOR_LIBRARIES + int GC_segment_is_thread_stack(ptr_t lo, ptr_t hi) + { + int i; + GC_thread p; + + # ifdef PARALLEL_MARK + for (i = 0; i < GC_markers; ++i) { + if (marker_sp[i] > lo & marker_sp[i] < hi) return 1; + } + # endif + for (i = 0; i < THREAD_TABLE_SZ; i++) { + for (p = GC_threads[i]; p != 0; p = p -> next) { + if (0 != p -> stack_end) { + # ifdef STACK_GROWS_UP + if (p -> stack_end >= lo && p -> stack_end < hi) return 1; + # else /* STACK_GROWS_DOWN */ + if (p -> stack_end > lo && p -> stack_end <= hi) return 1; + # endif + } + } + } + return 0; + } + #endif /* USE_PROC_FOR_LIBRARIES */ + + #ifdef GC_LINUX_THREADS + /* Return the number of processors, or i<= 0 if it can't be determined. */ + int GC_get_nprocs() + { + /* Should be "return sysconf(_SC_NPROCESSORS_ONLN);" but that */ + /* appears to be buggy in many cases. */ + /* We look for lines "cpu" in /proc/stat. */ + # define STAT_BUF_SIZE 4096 + # if defined(GC_USE_LD_WRAP) + # define STAT_READ __real_read + # else + # define STAT_READ read + # endif + char stat_buf[STAT_BUF_SIZE]; + int f; + char c; + word result = 1; + /* Some old kernels only have a single "cpu nnnn ..." */ + /* entry in /proc/stat. We identify those as */ + /* uniprocessors. */ + size_t i, len = 0; + + f = open("/proc/stat", O_RDONLY); + if (f < 0 || (len = STAT_READ(f, stat_buf, STAT_BUF_SIZE)) < 100) { + WARN("Couldn't read /proc/stat\n", 0); + return -1; + } + close(f); + for (i = 0; i < len - 100; ++i) { + if (stat_buf[i] == '\n' && stat_buf[i+1] == 'c' + && stat_buf[i+2] == 'p' && stat_buf[i+3] == 'u') { + int cpu_no = atoi(stat_buf + i + 4); + if (cpu_no >= result) result = cpu_no + 1; + } + } + return result; + } + #endif /* GC_LINUX_THREADS */ /* We hold the allocation lock. */ void GC_thr_init() *************** void GC_thr_init() *** 484,516 **** if (sigfillset(&act.sa_mask) != 0) { ABORT("sigfillset() failed"); } - # ifdef NO_SIGNALS if (sigdelset(&act.sa_mask, SIGINT) != 0 || sigdelset(&act.sa_mask, SIGQUIT != 0) ! || sigdelset(&act.sa_mask, SIGTERM != 0) ! || sigdelset(&act.sa_mask, SIGABRT != 0)) { ABORT("sigdelset() failed"); } # endif ! /* SIG_RESTART is unmasked by the handler when necessary. */ act.sa_handler = GC_suspend_handler; if (sigaction(SIG_SUSPEND, &act, NULL) != 0) { ABORT("Cannot set SIG_SUSPEND handler"); } act.sa_handler = GC_restart_handler; ! if (sigaction(SIG_RESTART, &act, NULL) != 0) { ! ABORT("Cannot set SIG_SUSPEND handler"); } /* Add the initial thread, so we can stop it. */ t = GC_new_thread(pthread_self()); t -> stack_ptr = (ptr_t)(&dummy); t -> flags = DETACHED | MAIN_THREAD; } int WRAP_FUNC(pthread_sigmask)(int how, const sigset_t *set, sigset_t *oset) { sigset_t fudged_set; --- 1046,1156 ---- if (sigfillset(&act.sa_mask) != 0) { ABORT("sigfillset() failed"); } # ifdef NO_SIGNALS if (sigdelset(&act.sa_mask, SIGINT) != 0 || sigdelset(&act.sa_mask, SIGQUIT != 0) ! || sigdelset(&act.sa_mask, SIGABRT != 0) ! || sigdelset(&act.sa_mask, SIGTERM != 0)) { ABORT("sigdelset() failed"); } # endif ! /* SIG_THR_RESTART is unmasked by the handler when necessary. */ act.sa_handler = GC_suspend_handler; if (sigaction(SIG_SUSPEND, &act, NULL) != 0) { ABORT("Cannot set SIG_SUSPEND handler"); } act.sa_handler = GC_restart_handler; ! if (sigaction(SIG_THR_RESTART, &act, NULL) != 0) { ! ABORT("Cannot set SIG_THR_RESTART handler"); } + # ifdef INSTALL_LOOPING_SEGV_HANDLER + act.sa_handler = GC_looping_handler; + if (sigaction(SIGSEGV, &act, NULL) != 0 + || sigaction(SIGBUS, &act, NULL) != 0) { + ABORT("Cannot set SIGSEGV or SIGBUS looping handler"); + } + # endif /* INSTALL_LOOPING_SEGV_HANDLER */ /* Add the initial thread, so we can stop it. */ t = GC_new_thread(pthread_self()); t -> stack_ptr = (ptr_t)(&dummy); t -> flags = DETACHED | MAIN_THREAD; + + /* Set GC_nprocs. */ + { + char * nprocs_string = GETENV("GC_NPROCS"); + GC_nprocs = -1; + if (nprocs_string != NULL) GC_nprocs = atoi(nprocs_string); + } + if (GC_nprocs <= 0) { + # if defined(GC_HPUX_THREADS) + GC_nprocs = pthread_num_processors_np(); + # endif + # if defined(GC_OSF1_THREADS) || defined(GC_FREEBSD_THREADS) + GC_nprocs = 1; + # endif + # if defined(GC_LINUX_THREADS) + GC_nprocs = GC_get_nprocs(); + # endif + } + if (GC_nprocs <= 0) { + WARN("GC_get_nprocs() returned %ld\n", GC_nprocs); + GC_nprocs = 2; + # ifdef PARALLEL_MARK + GC_markers = 1; + # endif + } else { + # ifdef PARALLEL_MARK + GC_markers = GC_nprocs; + # endif + } + # ifdef PARALLEL_MARK + # ifdef CONDPRINT + if (GC_print_stats) { + GC_printf2("Number of processors = %ld, " + "number of marker threads = %ld\n", GC_nprocs, GC_markers); + } + # endif + if (GC_markers == 1) { + GC_parallel = FALSE; + # ifdef CONDPRINT + if (GC_print_stats) { + GC_printf0("Single marker thread, turning off parallel marking\n"); + } + # endif + } else { + GC_parallel = TRUE; + } + # endif + } + + + /* Perform all initializations, including those that */ + /* may require allocation. */ + /* Called as constructor without allocation lock. */ + /* Must be called before a second thread is created. */ + /* Called without allocation lock. */ + void GC_init_parallel() + { + if (parallel_initialized) return; + parallel_initialized = TRUE; + /* GC_init() calls us back, so set flag first. */ + if (!GC_is_initialized) GC_init(); + /* If we are using a parallel marker, start the helper threads. */ + # ifdef PARALLEL_MARK + if (GC_parallel) start_mark_threads(); + # endif + /* Initialize thread local free lists if used. */ + # if defined(THREAD_LOCAL_ALLOC) && !defined(DBG_HDRS_ALL) + LOCK(); + GC_init_thread_local(GC_lookup_thread(pthread_self())); + UNLOCK(); + # endif } + int WRAP_FUNC(pthread_sigmask)(int how, const sigset_t *set, sigset_t *oset) { sigset_t fudged_set; *************** int WRAP_FUNC(pthread_sigmask)(int how, *** 523,528 **** --- 1163,1218 ---- return(REAL_FUNC(pthread_sigmask)(how, set, oset)); } + /* Wrappers for functions that are likely to block for an appreciable */ + /* length of time. Must be called in pairs, if at all. */ + /* Nothing much beyond the system call itself should be executed */ + /* between these. */ + + void GC_start_blocking(void) { + # define SP_SLOP 128 + GC_thread me; + LOCK(); + me = GC_lookup_thread(pthread_self()); + GC_ASSERT(!(me -> thread_blocked)); + # ifdef SPARC + me -> stack_ptr = (ptr_t)GC_save_regs_in_stack(); + # else + me -> stack_ptr = (ptr_t)GC_approx_sp(); + # endif + # ifdef IA64 + me -> backing_store_ptr = (ptr_t)GC_save_regs_in_stack() + SP_SLOP; + # endif + /* Add some slop to the stack pointer, since the wrapped call may */ + /* end up pushing more callee-save registers. */ + # ifdef STACK_GROWS_UP + me -> stack_ptr += SP_SLOP; + # else + me -> stack_ptr -= SP_SLOP; + # endif + me -> thread_blocked = TRUE; + UNLOCK(); + } + + GC_end_blocking(void) { + GC_thread me; + LOCK(); /* This will block if the world is stopped. */ + me = GC_lookup_thread(pthread_self()); + GC_ASSERT(me -> thread_blocked); + me -> thread_blocked = FALSE; + UNLOCK(); + } + + /* A wrapper for the standard C sleep function */ + int WRAP_FUNC(sleep) (unsigned int seconds) + { + int result; + + GC_start_blocking(); + result = REAL_FUNC(sleep)(seconds); + GC_end_blocking(); + return result; + } + struct start_info { void *(*start_routine)(void *); void *arg; *************** struct start_info { *** 531,549 **** /* parent hasn't yet noticed. */ }; ! void GC_thread_exit_proc(void *arg) { GC_thread me; - struct start_info * si = arg; LOCK(); me = GC_lookup_thread(pthread_self()); if (me -> flags & DETACHED) { GC_delete_thread(pthread_self()); } else { me -> flags |= FINISHED; } if (GC_incremental && GC_collection_in_progress()) { int old_gc_no = GC_gc_no; --- 1221,1247 ---- /* parent hasn't yet noticed. */ }; ! /* Called at thread exit. */ ! /* Never called for main thread. That's OK, since it */ ! /* results in at most a tiny one-time leak. And */ ! /* linuxthreads doesn't reclaim the main threads */ ! /* resources or id anyway. */ void GC_thread_exit_proc(void *arg) { GC_thread me; LOCK(); me = GC_lookup_thread(pthread_self()); + GC_destroy_thread_local(me); if (me -> flags & DETACHED) { GC_delete_thread(pthread_self()); } else { me -> flags |= FINISHED; } + # if defined(THREAD_LOCAL_ALLOC) && !defined(USE_PTHREAD_SPECIFIC) \ + && !defined(USE_HPUX_TLS) && !defined(DBG_HDRS_ALL) + GC_remove_specific(GC_thread_key); + # endif if (GC_incremental && GC_collection_in_progress()) { int old_gc_no = GC_gc_no; *************** int WRAP_FUNC(pthread_join)(pthread_t th *** 573,582 **** /* cant have been recycled by pthreads. */ UNLOCK(); result = REAL_FUNC(pthread_join)(thread, retval); LOCK(); ! /* Here the pthread thread id may have been recycled. */ ! GC_delete_gc_thread(thread, thread_gc_id); UNLOCK(); return result; } --- 1271,1315 ---- /* cant have been recycled by pthreads. */ UNLOCK(); result = REAL_FUNC(pthread_join)(thread, retval); + # if defined (GC_FREEBSD_THREADS) + /* On FreeBSD, the wrapped pthread_join() sometimes returns (what + appears to be) a spurious EINTR which caused the test and real code + to gratuitously fail. Having looked at system pthread library source + code, I see how this return code may be generated. In one path of + code, pthread_join() just returns the errno setting of the thread + being joined. This does not match the POSIX specification or the + local man pages thus I have taken the liberty to catch this one + spurious return value properly conditionalized on GC_FREEBSD_THREADS. */ + if (result == EINTR) result = 0; + # endif + if (result == 0) { + LOCK(); + /* Here the pthread thread id may have been recycled. */ + GC_delete_gc_thread(thread, thread_gc_id); + UNLOCK(); + } + return result; + } + + int + WRAP_FUNC(pthread_detach)(pthread_t thread) + { + int result; + GC_thread thread_gc_id; + LOCK(); ! thread_gc_id = GC_lookup_thread(thread); UNLOCK(); + result = REAL_FUNC(pthread_detach)(thread); + if (result == 0) { + LOCK(); + thread_gc_id -> flags |= DETACHED; + /* Here the pthread thread id may have been recycled. */ + if (thread_gc_id -> flags & FINISHED) { + GC_delete_gc_thread(thread, thread_gc_id); + } + UNLOCK(); + } return result; } *************** void * GC_start_routine(void * arg) *** 628,635 **** GC_printf1("start_routine = 0x%lx\n", start); # endif start_arg = si -> arg; ! sem_post(&(si -> registered)); ! pthread_cleanup_push(GC_thread_exit_proc, si); result = (*start)(start_arg); #if DEBUG_THREADS GC_printf1("Finishing thread 0x%x\n", pthread_self()); --- 1361,1374 ---- GC_printf1("start_routine = 0x%lx\n", start); # endif start_arg = si -> arg; ! sem_post(&(si -> registered)); /* Last action on si. */ ! /* OK to deallocate. */ ! pthread_cleanup_push(GC_thread_exit_proc, 0); ! # if defined(THREAD_LOCAL_ALLOC) && !defined(DBG_HDRS_ALL) ! LOCK(); ! GC_init_thread_local(me); ! UNLOCK(); ! # endif result = (*start)(start_arg); #if DEBUG_THREADS GC_printf1("Finishing thread 0x%x\n", pthread_self()); *************** WRAP_FUNC(pthread_create)(pthread_t *new *** 651,665 **** int result; GC_thread t; pthread_t my_new_thread; - void * stack; - size_t stacksize; - pthread_attr_t new_attr; int detachstate; word my_flags = 0; ! struct start_info * si = GC_malloc(sizeof(struct start_info)); /* This is otherwise saved only in an area mmapped by the thread */ /* library, which isn't visible to the collector. */ ! if (0 == si) return(ENOMEM); sem_init(&(si -> registered), 0, 0); si -> start_routine = start_routine; --- 1390,1405 ---- int result; GC_thread t; pthread_t my_new_thread; int detachstate; word my_flags = 0; ! struct start_info * si; /* This is otherwise saved only in an area mmapped by the thread */ /* library, which isn't visible to the collector. */ ! ! LOCK(); ! si = (struct start_info *)GC_INTERNAL_MALLOC(sizeof(struct start_info), NORMAL); ! UNLOCK(); ! if (!parallel_initialized) GC_init_parallel(); if (0 == si) return(ENOMEM); sem_init(&(si -> registered), 0, 0); si -> start_routine = start_routine; *************** WRAP_FUNC(pthread_create)(pthread_t *new *** 667,678 **** LOCK(); if (!GC_thr_initialized) GC_thr_init(); if (NULL == attr) { ! stack = 0; ! (void) pthread_attr_init(&new_attr); } else { ! new_attr = *attr; } - pthread_attr_getdetachstate(&new_attr, &detachstate); if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED; si -> flags = my_flags; UNLOCK(); --- 1407,1416 ---- LOCK(); if (!GC_thr_initialized) GC_thr_init(); if (NULL == attr) { ! detachstate = PTHREAD_CREATE_JOINABLE; } else { ! pthread_attr_getdetachstate(attr, &detachstate); } if (PTHREAD_CREATE_DETACHED == detachstate) my_flags |= DETACHED; si -> flags = my_flags; UNLOCK(); *************** WRAP_FUNC(pthread_create)(pthread_t *new *** 680,686 **** GC_printf1("About to start new thread from thread 0x%X\n", pthread_self()); # endif ! result = REAL_FUNC(pthread_create)(new_thread, &new_attr, GC_start_routine, si); # ifdef DEBUG_THREADS GC_printf1("Started thread 0x%X\n", *new_thread); # endif --- 1418,1424 ---- GC_printf1("About to start new thread from thread 0x%X\n", pthread_self()); # endif ! result = REAL_FUNC(pthread_create)(new_thread, attr, GC_start_routine, si); # ifdef DEBUG_THREADS GC_printf1("Started thread 0x%X\n", *new_thread); # endif *************** WRAP_FUNC(pthread_create)(pthread_t *new *** 688,707 **** /* This also ensures that we hold onto si until the child is done */ /* with it. Thus it doesn't matter whether it is otherwise */ /* visible to the collector. */ ! if (0 != sem_wait(&(si -> registered))) ABORT("sem_wait failed"); sem_destroy(&(si -> registered)); ! /* pthread_attr_destroy(&new_attr); */ ! /* pthread_attr_destroy(&new_attr); */ return(result); } ! #if defined(USE_SPIN_LOCK) VOLATILE GC_bool GC_collecting = 0; /* A hint that we're in the collector and */ /* holding the allocation lock for an */ /* extended period. */ /* Reasonably fast spin locks. Basically the same implementation */ /* as STL alloc.h. This isn't really the right way to do this. */ /* but until the POSIX scheduling mess gets straightened out ... */ --- 1426,1538 ---- /* This also ensures that we hold onto si until the child is done */ /* with it. Thus it doesn't matter whether it is otherwise */ /* visible to the collector. */ ! while (0 != sem_wait(&(si -> registered))) { ! if (EINTR != errno) ABORT("sem_wait failed"); ! } sem_destroy(&(si -> registered)); ! LOCK(); ! GC_INTERNAL_FREE(si); ! UNLOCK(); return(result); } ! #ifdef GENERIC_COMPARE_AND_SWAP ! pthread_mutex_t GC_compare_and_swap_lock = PTHREAD_MUTEX_INITIALIZER; ! ! GC_bool GC_compare_and_exchange(volatile GC_word *addr, ! GC_word old, GC_word new_val) ! { ! GC_bool result; ! pthread_mutex_lock(&GC_compare_and_swap_lock); ! if (*addr == old) { ! *addr = new_val; ! result = TRUE; ! } else { ! result = FALSE; ! } ! pthread_mutex_unlock(&GC_compare_and_swap_lock); ! return result; ! } ! ! GC_word GC_atomic_add(volatile GC_word *addr, GC_word how_much) ! { ! GC_word old; ! pthread_mutex_lock(&GC_compare_and_swap_lock); ! old = *addr; ! *addr = old + how_much; ! pthread_mutex_unlock(&GC_compare_and_swap_lock); ! return old; ! } ! ! #endif /* GENERIC_COMPARE_AND_SWAP */ ! /* Spend a few cycles in a way that can't introduce contention with */ ! /* othre threads. */ ! void GC_pause() ! { ! int i; ! volatile word dummy = 0; ! ! for (i = 0; i < 10; ++i) { ! # ifdef __GNUC__ ! __asm__ __volatile__ (" " : : : "memory"); ! # else ! /* Something that's unlikely to be optimized away. */ ! GC_noop(++dummy); ! # endif ! } ! } ! ! #define SPIN_MAX 1024 /* Maximum number of calls to GC_pause before */ ! /* give up. */ VOLATILE GC_bool GC_collecting = 0; /* A hint that we're in the collector and */ /* holding the allocation lock for an */ /* extended period. */ + #if !defined(USE_SPIN_LOCK) || defined(PARALLEL_MARK) + /* If we don't want to use the below spinlock implementation, either */ + /* because we don't have a GC_test_and_set implementation, or because */ + /* we don't want to risk sleeping, we can still try spinning on */ + /* pthread_mutex_trylock for a while. This appears to be very */ + /* beneficial in many cases. */ + /* I suspect that under high contention this is nearly always better */ + /* than the spin lock. But it's a bit slower on a uniprocessor. */ + /* Hence we still default to the spin lock. */ + /* This is also used to acquire the mark lock for the parallel */ + /* marker. */ + + /* Here we use a strict exponential backoff scheme. I don't know */ + /* whether that's better or worse than the above. We eventually */ + /* yield by calling pthread_mutex_lock(); it never makes sense to */ + /* explicitly sleep. */ + + void GC_generic_lock(pthread_mutex_t * lock) + { + unsigned pause_length = 1; + unsigned i; + + if (0 == pthread_mutex_trylock(lock)) return; + for (; pause_length <= SPIN_MAX; pause_length <<= 1) { + for (i = 0; i < pause_length; ++i) { + GC_pause(); + } + switch(pthread_mutex_trylock(lock)) { + case 0: + return; + case EBUSY: + break; + default: + ABORT("Unexpected error from pthread_mutex_trylock"); + } + } + pthread_mutex_lock(lock); + } + + #endif /* !USE_SPIN_LOCK || PARALLEL_MARK */ + + #if defined(USE_SPIN_LOCK) + /* Reasonably fast spin locks. Basically the same implementation */ /* as STL alloc.h. This isn't really the right way to do this. */ /* but until the POSIX scheduling mess gets straightened out ... */ *************** volatile unsigned int GC_allocate_lock = *** 712,736 **** void GC_lock() { # define low_spin_max 30 /* spin cycles if we suspect uniprocessor */ ! # define high_spin_max 1000 /* spin cycles for multiprocessor */ static unsigned spin_max = low_spin_max; unsigned my_spin_max; static unsigned last_spins = 0; unsigned my_last_spins; - volatile unsigned junk; - # define PAUSE junk *= junk; junk *= junk; junk *= junk; junk *= junk int i; if (!GC_test_and_set(&GC_allocate_lock)) { return; } - junk = 0; my_spin_max = spin_max; my_last_spins = last_spins; for (i = 0; i < my_spin_max; i++) { ! if (GC_collecting) goto yield; if (i < my_last_spins/2 || GC_allocate_lock) { ! PAUSE; continue; } if (!GC_test_and_set(&GC_allocate_lock)) { --- 1543,1564 ---- void GC_lock() { # define low_spin_max 30 /* spin cycles if we suspect uniprocessor */ ! # define high_spin_max SPIN_MAX /* spin cycles for multiprocessor */ static unsigned spin_max = low_spin_max; unsigned my_spin_max; static unsigned last_spins = 0; unsigned my_last_spins; int i; if (!GC_test_and_set(&GC_allocate_lock)) { return; } my_spin_max = spin_max; my_last_spins = last_spins; for (i = 0; i < my_spin_max; i++) { ! if (GC_collecting || GC_nprocs == 1) goto yield; if (i < my_last_spins/2 || GC_allocate_lock) { ! GC_pause(); continue; } if (!GC_test_and_set(&GC_allocate_lock)) { *************** yield: *** 760,767 **** } else { struct timespec ts; ! if (i > 26) i = 26; ! /* Don't wait for more than about 60msecs, even */ /* under extreme contention. */ ts.tv_sec = 0; ts.tv_nsec = 1 << i; --- 1588,1595 ---- } else { struct timespec ts; ! if (i > 24) i = 24; ! /* Don't wait for more than about 15msecs, even */ /* under extreme contention. */ ts.tv_sec = 0; ts.tv_nsec = 1 << i; *************** yield: *** 770,776 **** } } ! #endif /* known architecture */ ! # endif /* LINUX_THREADS */ --- 1598,1728 ---- } } ! #else /* !USE_SPINLOCK */ ! void GC_lock() ! { ! if (1 == GC_nprocs || GC_collecting) { ! pthread_mutex_lock(&GC_allocate_ml); ! } else { ! GC_generic_lock(&GC_allocate_ml); ! } ! } ! ! #endif /* !USE_SPINLOCK */ ! ! #if defined(PARALLEL_MARK) || defined(THREAD_LOCAL_ALLOC) ! ! #ifdef GC_ASSERTIONS ! pthread_t GC_mark_lock_holder = NO_THREAD; ! #endif ! ! #if 0 ! /* Ugly workaround for a linux threads bug in the final versions */ ! /* of glibc2.1. Pthread_mutex_trylock sets the mutex owner */ ! /* field even when it fails to acquire the mutex. This causes */ ! /* pthread_cond_wait to die. Remove for glibc2.2. */ ! /* According to the man page, we should use */ ! /* PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, but that isn't actually */ ! /* defined. */ ! static pthread_mutex_t mark_mutex = ! {0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, {0, 0}}; ! #else ! static pthread_mutex_t mark_mutex = PTHREAD_MUTEX_INITIALIZER; ! #endif ! ! static pthread_cond_t builder_cv = PTHREAD_COND_INITIALIZER; ! ! void GC_acquire_mark_lock() ! { ! /* ! if (pthread_mutex_lock(&mark_mutex) != 0) { ! ABORT("pthread_mutex_lock failed"); ! } ! */ ! GC_generic_lock(&mark_mutex); ! # ifdef GC_ASSERTIONS ! GC_mark_lock_holder = pthread_self(); ! # endif ! } ! ! void GC_release_mark_lock() ! { ! GC_ASSERT(GC_mark_lock_holder == pthread_self()); ! # ifdef GC_ASSERTIONS ! GC_mark_lock_holder = NO_THREAD; ! # endif ! if (pthread_mutex_unlock(&mark_mutex) != 0) { ! ABORT("pthread_mutex_unlock failed"); ! } ! } ! ! /* Collector must wait for a freelist builders for 2 reasons: */ ! /* 1) Mark bits may still be getting examined without lock. */ ! /* 2) Partial free lists referenced only by locals may not be scanned */ ! /* correctly, e.g. if they contain "pointer-free" objects, since the */ ! /* free-list link may be ignored. */ ! void GC_wait_builder() ! { ! GC_ASSERT(GC_mark_lock_holder == pthread_self()); ! # ifdef GC_ASSERTIONS ! GC_mark_lock_holder = NO_THREAD; ! # endif ! if (pthread_cond_wait(&builder_cv, &mark_mutex) != 0) { ! ABORT("pthread_cond_wait failed"); ! } ! GC_ASSERT(GC_mark_lock_holder == NO_THREAD); ! # ifdef GC_ASSERTIONS ! GC_mark_lock_holder = pthread_self(); ! # endif ! } ! ! void GC_wait_for_reclaim() ! { ! GC_acquire_mark_lock(); ! while (GC_fl_builder_count > 0) { ! GC_wait_builder(); ! } ! GC_release_mark_lock(); ! } ! ! void GC_notify_all_builder() ! { ! GC_ASSERT(GC_mark_lock_holder == pthread_self()); ! if (pthread_cond_broadcast(&builder_cv) != 0) { ! ABORT("pthread_cond_broadcast failed"); ! } ! } ! ! #endif /* PARALLEL_MARK || THREAD_LOCAL_ALLOC */ ! ! #ifdef PARALLEL_MARK ! ! static pthread_cond_t mark_cv = PTHREAD_COND_INITIALIZER; ! ! void GC_wait_marker() ! { ! GC_ASSERT(GC_mark_lock_holder == pthread_self()); ! # ifdef GC_ASSERTIONS ! GC_mark_lock_holder = NO_THREAD; ! # endif ! if (pthread_cond_wait(&mark_cv, &mark_mutex) != 0) { ! ABORT("pthread_cond_wait failed"); ! } ! GC_ASSERT(GC_mark_lock_holder == NO_THREAD); ! # ifdef GC_ASSERTIONS ! GC_mark_lock_holder = pthread_self(); ! # endif ! } ! ! void GC_notify_all_marker() ! { ! if (pthread_cond_broadcast(&mark_cv) != 0) { ! ABORT("pthread_cond_broadcast failed"); ! } ! } ! ! #endif /* PARALLEL_MARK */ ! ! # endif /* GC_LINUX_THREADS and friends */ diff -Nrc3pad gcc-3.0.4/boehm-gc/ltconfig gcc-3.1/boehm-gc/ltconfig *** gcc-3.0.4/boehm-gc/ltconfig Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/ltconfig Fri Aug 17 18:39:16 2001 *************** *** 0 **** --- 1,3078 ---- + #! /bin/sh + + # ltconfig - Create a system-specific libtool. + # Copyright (C) 1996-1999 Free Software Foundation, Inc. + # Originally by Gordon Matzigkeit , 1996 + # + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # A lot of this script is taken from autoconf-2.10. + + # Check that we are running under the correct shell. + SHELL=${CONFIG_SHELL-/bin/sh} + echo=echo + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell. + exec "$SHELL" "$0" --no-reexec ${1+"$@"} + fi + + if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null`} + case X$UNAME in + *-DOS) PATH_SEPARATOR=';' ;; + *) PATH_SEPARATOR=':' ;; + esac + fi + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. + if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then + break + fi + done + fi + + if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || + test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running ltconfig again with it. + ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf "%s\n"' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # Cool, printf works + : + elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi + fi + + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. + Xsed='sed -e s/^X//' + sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + + # Same as above, but do not quote variable references. + double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + + # Sed substitution to delay expansion of an escaped shell variable in a + # double_quote_subst'ed string. + delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + + # The name of this program. + progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` + + # Constants: + PROGRAM=ltconfig + PACKAGE=libtool + VERSION=1.3.4 + TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)" + ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' + ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' + rm="rm -f" + + help="Try \`$progname --help' for more information." + + # Global variables: + default_ofile=libtool + can_build_shared=yes + enable_shared=yes + # All known linkers require a `.a' archive for static linking (except M$VC, + # which needs '.lib'). + enable_static=yes + enable_fast_install=yes + enable_dlopen=unknown + enable_win32_dll=no + ltmain= + silent= + srcdir= + ac_config_guess= + ac_config_sub= + host= + nonopt= + ofile="$default_ofile" + verify_host=yes + with_gcc=no + with_gnu_ld=no + need_locks=yes + ac_ext=c + objext=o + libext=a + exeext= + cache_file= + + old_AR="$AR" + old_CC="$CC" + old_CFLAGS="$CFLAGS" + old_CPPFLAGS="$CPPFLAGS" + old_LDFLAGS="$LDFLAGS" + old_LD="$LD" + old_LN_S="$LN_S" + old_LIBS="$LIBS" + old_NM="$NM" + old_RANLIB="$RANLIB" + old_DLLTOOL="$DLLTOOL" + old_OBJDUMP="$OBJDUMP" + old_AS="$AS" + + # Parse the command line options. + args= + prev= + for option + do + case "$option" in + -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + eval "$prev=\$option" + prev= + continue + fi + + case "$option" in + --help) cat <&2 + echo "$help" 1>&2 + exit 1 + ;; + + *) + if test -z "$ltmain"; then + ltmain="$option" + elif test -z "$host"; then + # This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 + # if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then + # echo "$progname: warning \`$option' is not a valid host type" 1>&2 + # fi + host="$option" + else + echo "$progname: too many arguments" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + done + + if test -z "$ltmain"; then + echo "$progname: you must specify a LTMAIN file" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + if test ! -f "$ltmain"; then + echo "$progname: \`$ltmain' does not exist" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + # Quote any args containing shell metacharacters. + ltconfig_args= + for arg + do + case "$arg" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ltconfig_args="$ltconfig_args '$arg'" ;; + *) ltconfig_args="$ltconfig_args $arg" ;; + esac + done + + # A relevant subset of AC_INIT. + + # File descriptor usage: + # 0 standard input + # 1 file creation + # 2 errors and warnings + # 3 some systems may open it to /dev/tty + # 4 used on the Kubota Titan + # 5 compiler messages saved in config.log + # 6 checking for... messages and results + if test "$silent" = yes; then + exec 6>/dev/null + else + exec 6>&1 + fi + exec 5>>./config.log + + # NLS nuisances. + # Only set LANG and LC_ALL to C if already set. + # These must not be set unconditionally because not all systems understand + # e.g. LANG=C (notably SCO). + if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi + if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi + + if test -n "$cache_file" && test -r "$cache_file"; then + echo "loading cache $cache_file within ltconfig" + . $cache_file + fi + + if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' + ' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi + else + ac_n= ac_c='\c' ac_t= + fi + + if test -z "$srcdir"; then + # Assume the source directory is the same one as the path to LTMAIN. + srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` + test "$srcdir" = "$ltmain" && srcdir=. + fi + + trap "$rm conftest*; exit 1" 1 2 15 + if test "$verify_host" = yes; then + # Check for config.guess and config.sub. + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/config.guess; then + ac_aux_dir=$ac_dir + break + fi + done + if test -z "$ac_aux_dir"; then + echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 + echo "$help" 1>&2 + exit 1 + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + + # Make sure we can run config.sub. + if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : + else + echo "$progname: cannot run $ac_config_sub" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + echo $ac_n "checking host system type""... $ac_c" 1>&6 + + host_alias=$host + case "$host_alias" in + "") + if host_alias=`$SHELL $ac_config_guess`; then : + else + echo "$progname: cannot guess host type; you must specify one" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + host=`$SHELL $ac_config_sub $host_alias` + echo "$ac_t$host" 1>&6 + + # Make sure the host verified. + test -z "$host" && exit 1 + + elif test -z "$host"; then + echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 + echo "$help" 1>&2 + exit 1 + else + host_alias=$host + fi + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case "$host_os" in + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + + host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` + host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` + host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + case "$host_os" in + aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; + esac + + # Determine commands to create old-style static archives. + old_archive_cmds='$AR cru $oldlib$oldobjs' + old_postinstall_cmds='chmod 644 $oldlib' + old_postuninstall_cmds= + + # Set a sane default for `AR'. + test -z "$AR" && AR=ar + + # Set a sane default for `OBJDUMP'. + test -z "$OBJDUMP" && OBJDUMP=objdump + + # If RANLIB is not set, then run the test. + if test "${RANLIB+set}" != "set"; then + result=no + + echo $ac_n "checking for ranlib... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then + RANLIB="ranlib" + result="ranlib" + break + fi + done + IFS="$save_ifs" + + echo "$ac_t$result" 1>&6 + fi + + if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + fi + + # Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. + test -z "$DLLTOOL" && DLLTOOL=dlltool + test -z "$OBJDUMP" && OBJDUMP=objdump + test -z "$AS" && AS=as + + # Check to see if we are using GCC. + if test "$with_gcc" != yes || test -z "$CC"; then + # If CC is not set, then try to find GCC or a usable CC. + if test -z "$CC"; then + echo $ac_n "checking for gcc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then + CC="gcc" + break + fi + done + IFS="$save_ifs" + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". + if test -z "$CC"; then + echo $ac_n "checking for cc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + cc_rejected=no + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/cc || test -f $dir/cc$ac_exeext; then + if test "$dir/cc" = "/usr/ucb/cc"; then + cc_rejected=yes + continue + fi + CC="cc" + break + fi + done + IFS="$save_ifs" + if test $cc_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same name, so the bogon will be chosen + # first if we set CC to just the name; use the full file name. + shift + set dummy "$dir/cc" "$@" + shift + CC="$@" + fi + fi + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$CC"; then + echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Now see if the compiler is really GCC. + with_gcc=no + echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 + echo "$progname:581: checking whether we are using GNU C" >&5 + + $rm conftest.c + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + with_gcc=yes + fi + $rm conftest.c + echo "$ac_t$with_gcc" 1>&6 + fi + + # Allow CC to be a program name with arguments. + set dummy $CC + compiler="$2" + + echo $ac_n "checking for object suffix... $ac_c" 1>&6 + $rm conftest* + echo 'int i = 1;' > conftest.c + echo "$progname:603: checking for object suffix" >& 5 + if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; + *) objext=`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* + echo "$ac_t$objext" 1>&6 + + echo $ac_n "checking for executable suffix... $ac_c" 1>&6 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + ac_cv_exeext="no" + $rm conftest* + echo 'main () { return 0; }' > conftest.c + echo "$progname:629: checking for executable suffix" >& 5 + if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c | *.err | *.$objext ) ;; + *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* + fi + if test "X$ac_cv_exeext" = Xno; then + exeext="" + else + exeext="$ac_cv_exeext" + fi + echo "$ac_t$ac_cv_exeext" 1>&6 + + echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 + pic_flag= + special_shlib_compile_flags= + wl= + link_static_flag= + no_builtin_flag= + + if test "$with_gcc" = yes; then + wl='-Wl,' + link_static_flag='-static' + + case "$host_os" in + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # we not sure about C++ programs. + link_static_flag="$link_static_flag ${wl}-lC" + ;; + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + pic_flag='-m68020 -resident32 -malways-restore-a4' + ;; + sysv4*MP*) + if test -d /usr/nec; then + pic_flag=-Kconform_pic + fi + ;; + *) + pic_flag='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case "$host_os" in + aix3* | aix4*) + # All AIX code is PIC. + link_static_flag='-bnso -bI:/lib/syscalls.exp' + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better link_static_flag that works with the bundled CC? + wl='-Wl,' + link_static_flag="${wl}-a ${wl}archive" + pic_flag='+Z' + ;; + + irix5* | irix6*) + wl='-Wl,' + link_static_flag='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + wl='-Wl,' + link_static_flag='-non_shared' + ;; + + sco3.2v5*) + pic_flag='-Kpic' + link_static_flag='-dn' + special_shlib_compile_flags='-belf' + ;; + + solaris*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + sunos4*) + pic_flag='-PIC' + link_static_flag='-Bstatic' + wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + uts4*) + pic_flag='-pic' + link_static_flag='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec ;then + pic_flag='-Kconform_pic' + link_static_flag='-Bstatic' + fi + ;; + *) + can_build_shared=no + ;; + esac + fi + + if test -n "$pic_flag"; then + echo "$ac_t$pic_flag" 1>&6 + + # Check to make sure the pic_flag actually works. + echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $pic_flag -DPIC" + echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 + if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + case "$host_os" in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then they + # create non-PIC objects. So, if there were any warnings, we assume that + # PIC is not supported. + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + can_build_shared=no + pic_flag= + else + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + fi + ;; + *) + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + ;; + esac + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + can_build_shared=no + pic_flag= + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + else + echo "$ac_t"none 1>&6 + fi + + # Check to see if options -o and -c are simultaneously supported by compiler + echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + $rm conftest* + echo "int some_variable = 0;" > conftest.c + mkdir out + # According to Tom Tromey, Ian Lance Taylor reported there are C compilers + # that will create temporary files in the current directory regardless of + # the output directory. Thus, making CWD read-only will cause this test + # to fail, enabling locking or at least warning the user not to do parallel + # builds. + chmod -w . + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -o out/conftest2.o" + echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 + if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + echo "$ac_t"no 1>&6 + compiler_c_o=no + else + echo "$ac_t"yes 1>&6 + compiler_c_o=yes + fi + else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + compiler_c_o=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + chmod u+w . + $rm conftest* out/* + rmdir out + cd .. + rmdir conftest + $rm -r conftest 2>/dev/null + + if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 + if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_o_lo=no + else + echo "$ac_t"yes 1>&6 + compiler_o_lo=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_o_lo=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + else + compiler_o_lo=no + fi + + # Check to see if we can do hard links to lock some files if needed + hard_links="nottested" + if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$ac_t$hard_links" 1>&6 + $rm conftest* + if test "$hard_links" = no; then + echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 + need_locks=warn + fi + else + need_locks=no + fi + + if test "$with_gcc" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" + echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_rtti_exceptions=no + else + echo "$ac_t"yes 1>&6 + compiler_rtti_exceptions=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_rtti_exceptions=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi + + fi + + # Check for any special shared library compilation flags. + if test -n "$special_shlib_compile_flags"; then + echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : + else + echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 + can_build_shared=no + fi + fi + + echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 + $rm conftest* + echo 'main(){return(0);}' > conftest.c + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 + if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + echo "$ac_t$link_static_flag" 1>&6 + else + echo "$ac_t"none 1>&6 + link_static_flag= + fi + LDFLAGS="$save_LDFLAGS" + $rm conftest* + + if test -z "$LN_S"; then + # Check to see if we can use ln -s, or we need hard links. + echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 + $rm conftest.dat + if ln -s X conftest.dat 2>/dev/null; then + $rm conftest.dat + LN_S="ln -s" + else + LN_S=ln + fi + if test "$LN_S" = "ln -s"; then + echo "$ac_t"yes 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Make sure LD is an absolute path. + if test -z "$LD"; then + ac_prog=ld + if test "$with_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 + echo "$progname:991: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we are not using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld... $ac_c" 1>&6 + echo "$progname:1015: checking for GNU ld" >&5 + else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 + echo "$progname:1018: checking for non-GNU ld" >&5 + fi + + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + fi + + if test -n "$LD"; then + echo "$ac_t$LD" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$LD"; then + echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Check to see if it really is or is not GNU ld. + echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 + # I'd rather use --version here, but apparently some GNU ld's only accept -v. + if $LD -v 2>&1 &5; then + with_gnu_ld=yes + else + with_gnu_ld=no + fi + echo "$ac_t$with_gnu_ld" 1>&6 + + # See if the linker supports building shared libraries. + echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 + + allow_undefined_flag= + no_undefined_flag= + need_lib_prefix=unknown + need_version=unknown + # when you set need_version to no, make sure it does not cause -set_version + # flags to be left without arguments + archive_cmds= + archive_expsym_cmds= + old_archive_from_new_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + runpath_var= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an egrep regular expression of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + + case "$host_os" in + cygwin* | mingw*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$with_gcc" != yes; then + with_gnu_ld=no + fi + ;; + + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case "$host_os" in + aix3* | aix4*) + # On AIX, the GNU linker is very broken + ld_shlibs=no + cat <&2 + + *** Warning: the GNU linker, at least up to release 2.9.1, is reported + *** to be unable to reliably create shared libraries on AIX. + *** Therefore, libtool is disabling shared libraries support. If you + *** really care for shared libraries, you may want to modify your PATH + *** so that a non-GNU linker is found, and then restart. + + EOF + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' + + archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ + _lt_hint=1; + for symbol in `cat $export_symbols`; do + echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def; + _lt_hint=`expr 1 + \$_lt_hint`; + done~ + test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' + + old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' + # can we support soname and/or expsyms with a.out? -oliva + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + + *** Warning: The releases 2.8.* of the GNU linker cannot reliably + *** create shared libraries on Solaris systems. Therefore, libtool + *** is disabling shared libraries support. We urge you to upgrade GNU + *** binutils to release 2.9.1 or newer. Another option is to modify + *** your PATH or compiler configuration so that the native linker is + *** used, and then restart. + + EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case "$host_os" in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$with_gcc" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4*) + hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' + hardcode_libdir_separator=':' + if test "$with_gcc" = yes; then + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + shared_flag='-shared' + else + shared_flag='${wl}-bM:SRE' + hardcode_direct=yes + fi + allow_undefined_flag=' ${wl}-berok' + archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' + archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' + case "$host_os" in aix4.[01]|aix4.[01].*) + # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on + always_export_symbols=yes ;; + esac + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs' + fix_srcfile_path='`cygpath -w $srcfile`' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case "$host_os" in + hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$with_gcc" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF + fi + hardcode_libdir_flag_spec='${wl}-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + openbsd*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' + ;; + + osf3*) + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # As osf3* with the addition of the -msym flag + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case "$host_os" in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + unixware7*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + echo "$ac_t$ld_shlibs" 1>&6 + test "$ld_shlibs" = no && can_build_shared=no + + if test -z "$NM"; then + echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 + case "$NM" in + [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -p" + break + else + NM=${NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$NM" && NM=nm + ;; + esac + echo "$ac_t$NM" 1>&6 + fi + + # Check for command to grab the raw symbol name followed by C symbol from nm. + echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 + + # These are sane defaults that work on at least a few old systems. + # [They come from Ultrix. What could be older than Ultrix?!! ;)] + + # Character class describing NM global symbol codes. + symcode='[BCDEGRST]' + + # Regexp to match symbols that can be accessed directly from C. + sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + + # Transform the above into a raw symbol and a C symbol. + symxfrm='\1 \2\3 \3' + + # Transform an extracted symbol line into a proper C declaration + global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + + # Define system-specific variables. + case "$host_os" in + aix*) + symcode='[BCDT]' + ;; + cygwin* | mingw*) + symcode='[ABCDGISTW]' + ;; + hpux*) # Its linker distinguishes data from code symbols + global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" + ;; + irix*) + symcode='[BCDEGRST]' + ;; + solaris*) + symcode='[BDT]' + ;; + sysv4) + symcode='[DFNSTU]' + ;; + esac + + # If we're using GNU nm, then use its standard symbol codes. + if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' + fi + + # Try without a prefix undercore, then with it. + for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + $rm conftest* + cat > conftest.c <&5 + if { (eval echo $progname:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then + # Now try to grab the symbols. + nlist=conftest.nm + if { echo "$progname:1639: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then + + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.c + #ifdef __cplusplus + extern "C" { + #endif + + EOF + # Now generate the symbol file. + eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' + + cat <> conftest.c + #if defined (__STDC__) && __STDC__ + # define lt_ptr_t void * + #else + # define lt_ptr_t char * + # define const + #endif + + /* The mapping between symbol names and symbols. */ + const struct { + const char *name; + lt_ptr_t address; + } + lt_preloaded_symbols[] = + { + EOF + sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c + cat <<\EOF >> conftest.c + {0, (lt_ptr_t) 0} + }; + + #ifdef __cplusplus + } + #endif + EOF + # Now try linking the two files. + mv conftest.$objext conftstm.$objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo $progname:1691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + pipe_works=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + LIBS="$save_LIBS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + global_symbol_pipe= + fi + done + if test "$pipe_works" = yes; then + echo "${ac_t}ok" 1>&6 + else + echo "${ac_t}failed" 1>&6 + fi + + if test -z "$global_symbol_pipe"; then + global_symbol_to_cdecl= + fi + + # Check hardcoding attributes. + echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 + hardcode_action= + if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi + else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported + fi + echo "$ac_t$hardcode_action" 1>&6 + + + reload_flag= + reload_cmds='$LD$reload_flag -o $output$reload_objs' + echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 + # PORTME Some linkers may need a different reload flag. + reload_flag='-r' + echo "$ac_t$reload_flag" 1>&6 + test -n "$reload_flag" && reload_flag=" $reload_flag" + + # PORTME Fill in your ld.so characteristics + library_names_spec= + libname_spec='lib$name' + soname_spec= + postinstall_cmds= + postuninstall_cmds= + finish_cmds= + finish_eval= + shlibpath_var= + shlibpath_overrides_runpath=unknown + version_type=none + dynamic_linker="$host_os ld.so" + sys_lib_dlsearch_path_spec="/lib /usr/lib" + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + file_magic_cmd= + file_magic_test_file= + deplibs_check_method='unknown' + # Need to set the preceding variable on all platforms that support + # interlibrary dependencies. + # 'none' -- dependencies not supported. + # `unknown' -- same as none, but documents that we really don't know. + # 'pass_all' -- all dependencies passed with no checks. + # 'test_compile' -- check by making test program. + # 'file_magic [regex]' -- check by looking for files in library path + # which responds to the $file_magic_cmd with a given egrep regex. + # If you have `file' or equivalent on your system and you're not sure + # whether `pass_all' will *always* work, you probably want this one. + echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 + case "$host_os" in + aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + + aix4*) + version_type=linux + # AIX has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + # We preserve .a as extension for shared libraries though AIX4.2 + # and later linker supports .so + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' + shlibpath_var=LIBPATH + deplibs_check_method=pass_all + ;; + + amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + + beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + deplibs_check_method=pass_all + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + + cygwin* | mingw*) + version_type=windows + need_version=no + need_lib_prefix=no + if test "$with_gcc" = yes; then + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' + else + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + fi + dynamic_linker='Win32 ld.exe' + deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + file_magic_cmd='${OBJDUMP} -f' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + freebsd1*) + dynamic_linker=no + ;; + + freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case "$version_type" in + freebsd-elf*) + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + deplibs_check_method=unknown + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case "$host_os" in + freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + ;; + esac + ;; + + gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + + hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + + irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so.$major' + library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' + case "$host_os" in + irix5*) + libsuff= shlibsuff= + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case "$LD" in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib${libsuff}/libc.so*` + deplibs_check_method='pass_all' + ;; + + # No shared lib support for Linux oldld, aout, or coff. + linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + + # This must be Linux ELF. + linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + + if test -f /lib/ld.so.1; then + dynamic_linker='GNU ld.so' + else + # Only the GNU ld.so supports shared libraries on MkLinux. + case "$host_cpu" in + powerpc*) dynamic_linker=no ;; + *) dynamic_linker='Linux ld.so' ;; + esac + fi + ;; + + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + ;; + + openbsd*) + version_type=sunos + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + need_version=no + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + + os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + + osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method='file_magic COFF format alpha shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + deplibs_check_method='pass_all' + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + + sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + + solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" + file_magic_cmd=/usr/bin/file + file_magic_test_file=/lib/libc.so + ;; + + sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case "$host_vendor" in + ncr) + deplibs_check_method='pass_all' + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + esac + ;; + + uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + + dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + + *) + dynamic_linker=no + ;; + esac + echo "$ac_t$dynamic_linker" 1>&6 + test "$dynamic_linker" = no && can_build_shared=no + + # Report the final consequences. + echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 + + # Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in + # configure.in, otherwise build static only libraries. + case "$host_os" in + cygwin* | mingw* | os2*) + if test x$can_build_shared = xyes; then + test x$enable_win32_dll = xno && can_build_shared=no + echo "checking if package supports dlls... $can_build_shared" 1>&6 + fi + ;; + esac + + if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then + case "$deplibs_check_method" in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + + *** Warning: the command libtool uses to detect shared libraries, + *** $file_magic_cmd, produces output that libtool cannot recognize. + *** The result is that libtool may fail to recognize shared libraries + *** as such. This will affect the creation of libtool libraries that + *** depend on shared libraries, but programs linked with such libtool + *** libraries will work regardless of this problem. Nevertheless, you + *** may want to report the problem to your system manager and/or to + *** bug-libtool@gnu.org + + EOF + fi ;; + esac + fi + + echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case "$host_os" in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix4*) + test "$enable_shared" = yes && enable_static=no + ;; + esac + + echo "$ac_t$enable_shared" 1>&6 + + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + + echo "checking whether to build static libraries... $enable_static" 1>&6 + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no + elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless + fi + + echo $ac_n "checking for objdir... $ac_c" 1>&6 + rm -f .libs 2>/dev/null + mkdir .libs 2>/dev/null + if test -d .libs; then + objdir=.libs + else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs + fi + rmdir .libs 2>/dev/null + echo "$ac_t$objdir" 1>&6 + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown + else + if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then + lt_cv_dlopen=no lt_cv_dlopen_libs= + echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 + echo "$progname:2212: checking for dlopen in -ldl" >&5 + ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` + if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + ac_save_LIBS="$LIBS" + LIBS="-ldl $LIBS" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" + fi + rm -f conftest* + LIBS="$ac_save_LIBS" + + fi + if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" + else + echo "$ac_t""no" 1>&6 + echo $ac_n "checking for dlopen""... $ac_c" 1>&6 + echo "$progname:2252: checking for dlopen" >&5 + if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + #ifdef __cplusplus + extern "C" + #endif + char dlopen(); + + int main() { + + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_dlopen) || defined (__stub___dlopen) + choke me + #else + dlopen(); + #endif + + ; return 0; } + EOF + if { (eval echo $progname:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_dlopen=yes" + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_dlopen=no" + fi + rm -f conftest* + fi + if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" + else + echo "$ac_t""no" 1>&6 + echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 + echo "$progname:2299: checking for dld_link in -ldld" >&5 + ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` + if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + ac_save_LIBS="$LIBS" + LIBS="-ldld $LIBS" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" + fi + rm -f conftest* + LIBS="$ac_save_LIBS" + + fi + if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" + else + echo "$ac_t""no" 1>&6 + echo $ac_n "checking for shl_load""... $ac_c" 1>&6 + echo "$progname:2339: checking for shl_load" >&5 + if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + #ifdef __cplusplus + extern "C" + #endif + char shl_load(); + + int main() { + + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_shl_load) || defined (__stub___shl_load) + choke me + #else + shl_load(); + #endif + + ; return 0; } + EOF + if { (eval echo $progname:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shl_load=yes" + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shl_load=no" + fi + rm -f conftest* + fi + + if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" + else + echo "$ac_t""no" 1>&6 + echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 + echo "$progname:2387: checking for shl_load in -ldld" >&5 + ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` + if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + ac_save_LIBS="$LIBS" + LIBS="-ldld $LIBS" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" + fi + rm -f conftest* + LIBS="$ac_save_LIBS" + + fi + if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" + else + echo "$ac_t""no" 1>&6 + fi + + + fi + + + fi + + + fi + + + fi + + fi + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + fi + + case "$lt_cv_dlopen" in + dlopen) + for ac_hdr in dlfcn.h; do + ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` + echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 + echo "$progname:2452: checking for $ac_hdr" >&5 + if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + int fnord = 0; + EOF + ac_try="$ac_compile >/dev/null 2>conftest.out" + { (eval echo $progname:2462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" + else + echo "$ac_err" >&5 + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" + fi + rm -f conftest* + fi + if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + else + echo "$ac_t""no" 1>&6 + fi + done + + if test "x$ac_cv_header_dlfcn_h" = xyes; then + CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + fi + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 + echo "$progname:2490: checking whether a program can dlopen itself" >&5 + if test "${lt_cv_dlopen_self+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self=cross + else + cat > conftest.c < + #endif + + #include + + #ifdef RTLD_GLOBAL + # define LTDL_GLOBAL RTLD_GLOBAL + #else + # ifdef DL_GLOBAL + # define LTDL_GLOBAL DL_GLOBAL + # else + # define LTDL_GLOBAL 0 + # endif + #endif + + /* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ + #ifndef LTDL_LAZY_OR_NOW + # ifdef RTLD_LAZY + # define LTDL_LAZY_OR_NOW RTLD_LAZY + # else + # ifdef DL_LAZY + # define LTDL_LAZY_OR_NOW DL_LAZY + # else + # ifdef RTLD_NOW + # define LTDL_LAZY_OR_NOW RTLD_NOW + # else + # ifdef DL_NOW + # define LTDL_LAZY_OR_NOW DL_NOW + # else + # define LTDL_LAZY_OR_NOW 0 + # endif + # endif + # endif + # endif + #endif + + fnord() { int i=42;} + main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + + EOF + if { (eval echo $progname:2544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null + then + lt_cv_dlopen_self=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self=no + fi + rm -fr conftest* + fi + + fi + + echo "$ac_t""$lt_cv_dlopen_self" 1>&6 + + if test "$lt_cv_dlopen_self" = yes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 + echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5 + if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self_static=cross + else + cat > conftest.c < + #endif + + #include + + #ifdef RTLD_GLOBAL + # define LTDL_GLOBAL RTLD_GLOBAL + #else + # ifdef DL_GLOBAL + # define LTDL_GLOBAL DL_GLOBAL + # else + # define LTDL_GLOBAL 0 + # endif + #endif + + /* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ + #ifndef LTDL_LAZY_OR_NOW + # ifdef RTLD_LAZY + # define LTDL_LAZY_OR_NOW RTLD_LAZY + # else + # ifdef DL_LAZY + # define LTDL_LAZY_OR_NOW DL_LAZY + # else + # ifdef RTLD_NOW + # define LTDL_LAZY_OR_NOW RTLD_NOW + # else + # ifdef DL_NOW + # define LTDL_LAZY_OR_NOW DL_NOW + # else + # define LTDL_LAZY_OR_NOW 0 + # endif + # endif + # endif + # endif + #endif + + fnord() { int i=42;} + main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + + EOF + if { (eval echo $progname:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null + then + lt_cv_dlopen_self_static=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self_static=no + fi + rm -fr conftest* + fi + + fi + + echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 + fi + ;; + esac + + case "$lt_cv_dlopen_self" in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case "$lt_cv_dlopen_self_static" in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac + fi + + # Copy echo and quote the copy, instead of the original, because it is + # used later. + ltecho="$echo" + if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ltecho="$CONFIG_SHELL \$0 --fallback-echo" + fi + LTSHELL="$SHELL" + + LTCONFIG_VERSION="$VERSION" + + # Only quote variables if we're using ltmain.sh. + case "$ltmain" in + *.sh) + # Now quote all the things that may contain metacharacters. + for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ + AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ + file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case "$var" in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case "$ltecho" in + *'\$0 --fallback-echo"') + ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + + trap "$rm \"$ofile\"; exit 1" 1 2 15 + echo "creating $ofile" + $rm "$ofile" + cat < "$ofile" + #! $SHELL + + # `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. + # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) + # NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. + # + # Copyright (C) 1996-1999 Free Software Foundation, Inc. + # Originally by Gordon Matzigkeit , 1996 + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Sed that helps us avoid accidentally triggering echo(1) options like -n. + Xsed="sed -e s/^X//" + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. + if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + + ### BEGIN LIBTOOL CONFIG + EOF + cfgfile="$ofile" + ;; + + *) + # Double-quote the variables that need it (for aesthetics). + for var in old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do + eval "$var=\\\"\$var\\\"" + done + + # Just create a config file. + cfgfile="$ofile.cfg" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + echo "creating $cfgfile" + $rm "$cfgfile" + cat < "$cfgfile" + # `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. + # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) + EOF + ;; + esac + + cat <> "$cfgfile" + # Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + # + # CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ + # LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ + # NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ + # DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ + # $0$ltconfig_args + # + # Compiler and other test output produced by $progname, useful for + # debugging $progname, is in ./config.log if it exists. + + # The version of $progname that generated this script. + LTCONFIG_VERSION=$LTCONFIG_VERSION + + # Shell to use when invoking shell scripts. + SHELL=$LTSHELL + + # Whether or not to build shared libraries. + build_libtool_libs=$enable_shared + + # Whether or not to build static libraries. + build_old_libs=$enable_static + + # Whether or not to optimize for fast installation. + fast_install=$enable_fast_install + + # The host system. + host_alias=$host_alias + host=$host + + # An echo program that does not interpret backslashes. + echo=$ltecho + + # The archiver. + AR=$AR + + # The default C compiler. + CC=$CC + + # The linker used to build libraries. + LD=$LD + + # Whether we need hard or soft links. + LN_S=$LN_S + + # A BSD-compatible nm program. + NM=$NM + + # Used on cygwin: DLL creation program. + DLLTOOL="$DLLTOOL" + + # Used on cygwin: object dumper. + OBJDUMP="$OBJDUMP" + + # Used on cygwin: assembler. + AS="$AS" + + # The name of the directory that contains temporary libtool files. + objdir=$objdir + + # How to create reloadable object files. + reload_flag=$reload_flag + reload_cmds=$reload_cmds + + # How to pass a linker flag through the compiler. + wl=$wl + + # Object file suffix (normally "o"). + objext="$objext" + + # Old archive suffix (normally "a"). + libext="$libext" + + # Executable file suffix (normally ""). + exeext="$exeext" + + # Additional compiler flags for building library objects. + pic_flag=$pic_flag + + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$compiler_c_o + + # Can we write directly to a .lo ? + compiler_o_lo=$compiler_o_lo + + # Must we lock files when doing compilation ? + need_locks=$need_locks + + # Do we need the lib prefix for modules? + need_lib_prefix=$need_lib_prefix + + # Do we need a version for libraries? + need_version=$need_version + + # Whether dlopen is supported. + dlopen=$enable_dlopen + + # Whether dlopen of programs is supported. + dlopen_self=$enable_dlopen_self + + # Whether dlopen of statically linked programs is supported. + dlopen_self_static=$enable_dlopen_self_static + + # Compiler flag to prevent dynamic linking. + link_static_flag=$link_static_flag + + # Compiler flag to turn off builtin functions. + no_builtin_flag=$no_builtin_flag + + # Compiler flag to allow reflexive dlopens. + export_dynamic_flag_spec=$export_dynamic_flag_spec + + # Compiler flag to generate shared objects directly from archives. + whole_archive_flag_spec=$whole_archive_flag_spec + + # Compiler flag to generate thread-safe objects. + thread_safe_flag_spec=$thread_safe_flag_spec + + # Library versioning type. + version_type=$version_type + + # Format of library name prefix. + libname_spec=$libname_spec + + # List of archive names. First name is the real one, the rest are links. + # The last name is the one that the linker finds with -lNAME. + library_names_spec=$library_names_spec + + # The coded name of the library, if different from the real name. + soname_spec=$soname_spec + + # Commands used to build and install an old-style archive. + RANLIB=$RANLIB + old_archive_cmds=$old_archive_cmds + old_postinstall_cmds=$old_postinstall_cmds + old_postuninstall_cmds=$old_postuninstall_cmds + + # Create an old-style archive from a shared archive. + old_archive_from_new_cmds=$old_archive_from_new_cmds + + # Commands used to build and install a shared archive. + archive_cmds=$archive_cmds + archive_expsym_cmds=$archive_expsym_cmds + postinstall_cmds=$postinstall_cmds + postuninstall_cmds=$postuninstall_cmds + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$deplibs_check_method + + # Command to use when deplibs_check_method == file_magic. + file_magic_cmd=$file_magic_cmd + + # Flag that allows shared libraries with undefined symbols to be built. + allow_undefined_flag=$allow_undefined_flag + + # Flag that forces no undefined symbols. + no_undefined_flag=$no_undefined_flag + + # Commands used to finish a libtool library installation in a directory. + finish_cmds=$finish_cmds + + # Same as above, but a single script fragment to be evaled but not shown. + finish_eval=$finish_eval + + # Take the output of nm and produce a listing of raw symbols and C names. + global_symbol_pipe=$global_symbol_pipe + + # Transform the output of nm in a proper C declaration + global_symbol_to_cdecl=$global_symbol_to_cdecl + + # This is the shared library runtime path variable. + runpath_var=$runpath_var + + # This is the shared library path variable. + shlibpath_var=$shlibpath_var + + # Is shlibpath searched before the hard-coded library search path? + shlibpath_overrides_runpath=$shlibpath_overrides_runpath + + # How to hardcode a shared library path into an executable. + hardcode_action=$hardcode_action + + # Flag to hardcode \$libdir into a binary during linking. + # This must work even if \$libdir does not exist. + hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec + + # Whether we need a single -rpath flag with a separated argument. + hardcode_libdir_separator=$hardcode_libdir_separator + + # Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the + # resulting binary. + hardcode_direct=$hardcode_direct + + # Set to yes if using the -LDIR flag during linking hardcodes DIR into the + # resulting binary. + hardcode_minus_L=$hardcode_minus_L + + # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into + # the resulting binary. + hardcode_shlibpath_var=$hardcode_shlibpath_var + + # Compile-time system search path for libraries + sys_lib_search_path_spec=$sys_lib_search_path_spec + + # Run-time system search path for libraries + sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec + + # Fix the shell variable \$srcfile for the compiler. + fix_srcfile_path="$fix_srcfile_path" + + # Set to yes if exported symbols are required. + always_export_symbols=$always_export_symbols + + # The commands to list exported symbols. + export_symbols_cmds=$export_symbols_cmds + + # Symbols that should not be listed in the preloaded symbols. + exclude_expsyms=$exclude_expsyms + + # Symbols that must always be exported. + include_expsyms=$include_expsyms + + EOF + + case "$ltmain" in + *.sh) + echo '### END LIBTOOL CONFIG' >> "$ofile" + echo >> "$ofile" + case "$host_os" in + aix3*) + cat <<\EOF >> "$ofile" + + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + EOF + ;; + esac + + # Append the ltmain.sh script. + sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + + chmod +x "$ofile" + ;; + + *) + # Compile the libtool program. + echo "FIXME: would compile $ltmain" + ;; + esac + + test -n "$cache_file" || exit 0 + + # AC_CACHE_SAVE + trap '' 1 2 15 + cat > confcache <<\EOF + # This file is a shell script that caches the results of configure + # tests run on this system so they can be shared between configure + # scripts and configure runs. It is not useful on other systems. + # If it contains results you don't want to keep, you may remove or edit it. + # + # By default, configure uses ./config.cache as the cache file, + # creating it if it does not exist already. You can give configure + # the --cache-file=FILE option to use a different cache file; that is + # what configure does when it calls configure scripts in + # subdirectories, so they share the cache. + # Giving --cache-file=/dev/null disables caching, for debugging configure. + # config.status only pays attention to the cache file if you give it the + # --recheck option to rerun configure. + # + EOF + # The following way of writing the cache mishandles newlines in values, + # but we know of no workaround that is simple, portable, and efficient. + # So, don't put newlines in cache variables' values. + # Ultrix sh set writes to stderr and can't be redirected directly, + # and sets the high bit in the cache file unless we assign to the vars. + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache + if cmp -s $cache_file confcache; then + : + else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi + fi + rm -f confcache + + exit 0 + + # Local Variables: + # mode:shell-script + # sh-indentation:2 + # End: diff -Nrc3pad gcc-3.0.4/boehm-gc/ltmain.sh gcc-3.1/boehm-gc/ltmain.sh *** gcc-3.0.4/boehm-gc/ltmain.sh Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/ltmain.sh Fri Aug 17 18:39:16 2001 *************** *** 0 **** --- 1,4012 ---- + # ltmain.sh - Provide generalized library-building support services. + # NOTE: Changing this file will not affect anything until you rerun ltconfig. + # + # Copyright (C) 1996-1999 Free Software Foundation, Inc. + # Originally by Gordon Matzigkeit , 1996 + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + + # Check that we have a working $echo. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$0" --no-reexec ${1+"$@"} + fi + + if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + fi + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + fi + + # Global variables. + mode=$default_mode + nonopt= + prev= + prevopt= + run= + show="$echo" + show_help= + execute_dlfiles= + lo2o="s/\\.lo\$/.${objext}/" + o2lo="s/\\.${objext}\$/.lo/" + + # Parse our command line options once, thoroughly. + while test $# -gt 0 + do + arg="$1" + shift + + case "$arg" in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + execute_dlfiles) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + exit 0 + ;; + + --config) + sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac + done + + if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case "$mode" in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # Accept any command-line options. + case "$arg" in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + esac + + case "$user_target" in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly in scan + # sets, so we specify it separately. + case "$lastarg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case "$user_target" in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case "$libobj" in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case "$libobj" in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + echo "\ + *** ERROR, $lockfile exists and contains: + `cat $lockfile 2>/dev/null` + + This indicates that another process is trying to use the same + temporary object file, and libtool could not work around it because + your compiler does not support \`-c' and \`-o' together. If you + repeat this compilation, it may succeed, by chance, but you had better + avoid parallel builds (make -j) in this platform, or get a better + compiler." + + $run $rm $removelist + exit 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ + *** ERROR, $lockfile contains: + `cat $lockfile 2>/dev/null` + + but it should contain: + $srcfile + + This indicates that another process is trying to use the same + temporary object file, and libtool could not work around it because + your compiler does not support \`-c' and \`-o' together. If you + repeat this compilation, it may succeed, by chance, but you had better + avoid parallel builds (make -j) in this platform, or get a better + compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if test -z "$pic_flag" && test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` + libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + # Now arrange that obj and lo_libobj become the same file + $show "(cd $xdir && $LN_S $baseobj $libobj)" + if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + command="$base_compile $srcfile" + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ + *** ERROR, $lockfile contains: + `cat $lockfile 2>/dev/null` + + but it should contain: + $srcfile + + This indicates that another process is trying to use the same + temporary object file, and libtool could not work around it because + your compiler does not support \`-c' and \`-o' together. If you + repeat this compilation, it may succeed, by chance, but you had better + avoid parallel builds (make -j) in this platform, or get a better + compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed + if test x"$output_obj" != x"$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invokation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments + # /* ltdll.c starts here */ + # #define WIN32_LEAN_AND_MEAN + # #include + # #undef WIN32_LEAN_AND_MEAN + # #include + # + # #ifndef __CYGWIN__ + # # ifdef __CYGWIN32__ + # # define __CYGWIN__ __CYGWIN32__ + # # endif + # #endif + # + # #ifdef __cplusplus + # extern "C" { + # #endif + # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); + # #ifdef __cplusplus + # } + # #endif + # + # #ifdef __CYGWIN__ + # #include + # DECLARE_CYGWIN_DLL( DllMain ); + # #endif + # HINSTANCE __hDllInstance_base; + # + # BOOL APIENTRY + # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) + # { + # __hDllInstance_base = hInst; + # return TRUE; + # } + # /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments + # /* impgen.c starts here */ + # /* Copyright (C) 1999 Free Software Foundation, Inc. + # + # This file is part of GNU libtool. + # + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, + # but WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + # GNU General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + # */ + # + # #include /* for printf() */ + # #include /* for open(), lseek(), read() */ + # #include /* for O_RDONLY, O_BINARY */ + # #include /* for strdup() */ + # + # static unsigned int + # pe_get16 (fd, offset) + # int fd; + # int offset; + # { + # unsigned char b[2]; + # lseek (fd, offset, SEEK_SET); + # read (fd, b, 2); + # return b[0] + (b[1]<<8); + # } + # + # static unsigned int + # pe_get32 (fd, offset) + # int fd; + # int offset; + # { + # unsigned char b[4]; + # lseek (fd, offset, SEEK_SET); + # read (fd, b, 4); + # return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); + # } + # + # static unsigned int + # pe_as32 (ptr) + # void *ptr; + # { + # unsigned char *b = ptr; + # return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); + # } + # + # int + # main (argc, argv) + # int argc; + # char *argv[]; + # { + # int dll; + # unsigned long pe_header_offset, opthdr_ofs, num_entries, i; + # unsigned long export_rva, export_size, nsections, secptr, expptr; + # unsigned long name_rvas, nexp; + # unsigned char *expdata, *erva; + # char *filename, *dll_name; + # + # filename = argv[1]; + # + # dll = open(filename, O_RDONLY|O_BINARY); + # if (!dll) + # return 1; + # + # dll_name = filename; + # + # for (i=0; filename[i]; i++) + # if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') + # dll_name = filename + i +1; + # + # pe_header_offset = pe_get32 (dll, 0x3c); + # opthdr_ofs = pe_header_offset + 4 + 20; + # num_entries = pe_get32 (dll, opthdr_ofs + 92); + # + # if (num_entries < 1) /* no exports */ + # return 1; + # + # export_rva = pe_get32 (dll, opthdr_ofs + 96); + # export_size = pe_get32 (dll, opthdr_ofs + 100); + # nsections = pe_get16 (dll, pe_header_offset + 4 +2); + # secptr = (pe_header_offset + 4 + 20 + + # pe_get16 (dll, pe_header_offset + 4 + 16)); + # + # expptr = 0; + # for (i = 0; i < nsections; i++) + # { + # char sname[8]; + # unsigned long secptr1 = secptr + 40 * i; + # unsigned long vaddr = pe_get32 (dll, secptr1 + 12); + # unsigned long vsize = pe_get32 (dll, secptr1 + 16); + # unsigned long fptr = pe_get32 (dll, secptr1 + 20); + # lseek(dll, secptr1, SEEK_SET); + # read(dll, sname, 8); + # if (vaddr <= export_rva && vaddr+vsize > export_rva) + # { + # expptr = fptr + (export_rva - vaddr); + # if (export_rva + export_size > vaddr + vsize) + # export_size = vsize - (export_rva - vaddr); + # break; + # } + # } + # + # expdata = (unsigned char*)malloc(export_size); + # lseek (dll, expptr, SEEK_SET); + # read (dll, expdata, export_size); + # erva = expdata - export_rva; + # + # nexp = pe_as32 (expdata+24); + # name_rvas = pe_as32 (expdata+32); + # + # printf ("EXPORTS\n"); + # for (i = 0; i&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test $# -gt 0; do + arg="$1" + shift + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case "$prev" in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case "$arg" in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case "$arg" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -o) prev=output ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # We need an absolute path. + case "$dir" in + [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + *) + lib_linked=no + ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit 1 + fi + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + ;; + + *.la) + # Make sure we only generate libraries of the form `libNAME.la'. + case "$outputname" in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + # How the heck are we supposed to write a wrapper for a shared library? + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test $# -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + libext=al + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + dependency_libs="$deplibs" + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + current="$2" + revision="$3" + age="$4" + + # Check that each of the things are valid numbers. + case "$current" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test $loop != 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="sgi$major.$iface:$verstring" + done + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test $loop != 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case "$deplibs_check_method" in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behaviour. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | sed 's/.* -> //'` + case "$potliblink" in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | sed 10q \ + | egrep "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | + grep . >/dev/null; then + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + echo "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) in case we are running --disable-static + for obj in $libobjs; do + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + if test ! -f $xdir/$oldobj; then + $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" + $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? + fi + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + eval cmds=\"$export_symbols_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case "$output" in + *.lo) + if test -n "$objs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit 1 + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + $show "echo timestamp > $libobj" + $run eval "echo timestamp > $libobj" || exit $? + exit 0 + fi + + if test -n "$pic_flag"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$libobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + $show "(cd $xdir && $LN_S $oldobj $baseobj)" + $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + # Anything else should be a program. + *) + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + # Create the binary in the object directory, then wrap it. + if test ! -d $output_objdir; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case "$dlsyms" in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ + /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ + /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + + #ifdef __cplusplus + extern \"C\" { + #endif + + /* Prevent the only kind of declaration conflicts we can make. */ + #define lt_preloaded_symbols some_other_symbol + + /* External symbol declarations for the compiler. */\ + " + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`echo "$arg" | sed -e 's%^.*/%%'` + $run eval 'echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + + #undef lt_preloaded_symbols + + #if defined (__STDC__) && __STDC__ + # define lt_ptr_t void * + #else + # define lt_ptr_t char * + # define const + #endif + + /* The mapping between symbol names and symbols. */ + const struct { + const char *name; + lt_ptr_t address; + } + lt_preloaded_symbols[] = + {\ + " + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 0} + }; + + /* This works around a problem in FreeBSD linker */ + #ifdef FREEBSD_WORKAROUND + static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; + } + #endif + + #ifdef __cplusplus + } + #endif\ + " + fi + + pic_flag_for_symtable= + case "$host" in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case "$0" in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`echo $output|sed 's,.exe$,,'` ;; + esac + $rm $output + trap "$rm $output; exit 1" 1 2 15 + + $echo > $output "\ + #! $SHELL + + # $output - temporary wrapper script for $objdir/$outputname + # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP + # + # The $output program cannot be directly executed until all the libtool + # libraries that it depends on are installed. + # + # This wrapper script should never be moved out of the build directory. + # If it is, it will not operate correctly. + + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. + Xsed='sed -e 1s/^X//' + sed_quote_subst='$sed_quote_subst' + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. + if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + + relink_command=\"$relink_command\" + + # This environment variable determines our operation mode. + if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + link_against_libtool_libs='$link_against_libtool_libs' + else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ + " + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" + " + + if test "$fast_install" = yes; then + echo >> $output "\ + program=lt-'$outputname' + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if (cd \"\$thisdir\" && eval \$relink_command); then : + else + $rm \"\$progdir/\$file\" + exit 1 + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" + " + fi + + echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var + " + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH + " + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + " + case $host in + *-*-cygwin* | *-*-mingw | *-*-os2*) + # win32 systems need to use the prog path for dll + # lookup to work + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} + " + ;; + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} + " + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi + fi\ + " + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place in case we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$oldobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` + obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + $show "(cd $xdir && ${LN_S} $obj $baseobj)" + $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case "$output" in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $echo > $output "\ + # $outputname - a libtool library file + # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP + # + # Please DO NOT delete this file! + # It is necessary for linking the library. + + # The name that we can dlopen(3). + dlname='$dlname' + + # Names of this library. + library_names='$library_names' + + # The name of the static archive. + old_library='$old_library' + + # Libraries that this one depends upon. + dependency_libs='$dependency_libs' + + # Version information for $libname. + current=$current + age=$age + revision=$revision + + # Is this an already installed library? + installed=$installed + + # Directory that this library needs to be installed in: + libdir='$install_libdir'\ + " + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $? + ;; + esac + exit 0 + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case "$arg" in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test $# -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + fi + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case "$file" in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case "$file" in + *.a | *.lib) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + library_names= + old_library= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$realname $destdir/$realname" + $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $? + + if test $# -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case "$destfile" in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.o | *.obj) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + eval cmds=\"$finish_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit 0 + + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + echo " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + echo "See any operating system documentation about shared libraries for" + echo "more information, such as the ld(1) and ld.so(8) manual pages." + echo "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case "$file" in + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case "$file" in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved enviroment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit 0 + fi + ;; + + # libtool uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + fi # test -z "$show_help" + + # We need to display help for each of the modes. + case "$mode" in + "") $echo \ + "Usage: $modename [OPTION]... [MODE-ARG]... + + Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --version print version information + + MODE must be one of the following: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + + MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for + a more detailed description of MODE." + exit 0 + ;; + + compile) + $echo \ + "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + + Compile a source file into a libtool library object. + + This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -static always build a \`.o' file suitable for static linking + + COMPILE-COMMAND is a command to be used in creating a \`standard' object file + from the given SOURCEFILE. + + The output file name is determined by removing the directory component from + SOURCEFILE, then substituting the C source code suffix \`.c' with the + library object suffix, \`.lo'." + ;; + + execute) + $echo \ + "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + + Automatically set library path, then run a program. + + This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + + This mode sets the library path environment variable according to \`-dlopen' + flags. + + If any of the ARGS are libtool executable wrappers, then they are translated + into their corresponding uninstalled binary, and any of their required library + directories are added to the library path. + + Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $echo \ + "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + + Complete the installation of libtool libraries. + + Each LIBDIR is a directory that contains libtool libraries. + + The commands that this mode executes may require superuser privileges. Use + the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $echo \ + "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + + Install executables or libraries. + + INSTALL-COMMAND is the installation command. The first component should be + either the \`install' or \`cp' program. + + The rest of the components are interpreted as arguments to that command (only + BSD-compatible install options are recognized)." + ;; + + link) + $echo \ + "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + + Link object files or libraries together to form another library, or to + create an executable program. + + LINK-COMMAND is a command using the C compiler that you would use to create + a program from several object files. + + The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + + All other options (arguments beginning with \`-') are ignored. + + Every other argument is treated as a filename. Files ending in \`.la' are + treated as uninstalled libtool libraries, other files are standard or library + object files. + + If the OUTPUT-FILE ends in \`.la', then a libtool library is created, + only library objects (\`.lo' files) may be specified, and \`-rpath' is + required, except when creating a convenience library. + + If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created + using \`ar' and \`ranlib', or on Windows using \`lib'. + + If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file + is created, otherwise an executable program is created." + ;; + + uninstall) + $echo \ + "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + + Remove libraries from an installation directory. + + RM is the name of the program to use to delete files associated with each FILE + (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed + to RM. + + If FILE is a libtool library, all the files associated with it are deleted. + Otherwise, only FILE itself is deleted using RM." + ;; + + *) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + echo + $echo "Try \`$modename --help' for more information about other modes." + + exit 0 + + # Local Variables: + # mode:shell-script + # sh-indentation:2 + # End: diff -Nrc3pad gcc-3.0.4/boehm-gc/mach_dep.c gcc-3.1/boehm-gc/mach_dep.c *** gcc-3.0.4/boehm-gc/mach_dep.c Wed Sep 26 16:22:08 2001 --- gcc-3.1/boehm-gc/mach_dep.c Tue Feb 12 04:37:53 2002 *************** *** 12,18 **** * modified is included with the above copyright notice. */ /* Boehm, November 17, 1995 12:13 pm PST */ ! # include "gc_priv.h" # include # include # if defined(OS2) || defined(CX_UX) --- 12,18 ---- * modified is included with the above copyright notice. */ /* Boehm, November 17, 1995 12:13 pm PST */ ! # include "private/gc_priv.h" # include # include # if defined(OS2) || defined(CX_UX) *************** *** 21,27 **** # endif # ifdef AMIGA # ifndef __GNUC__ ! # include # else # include # endif --- 21,27 ---- # endif # ifdef AMIGA # ifndef __GNUC__ ! # include # else # include # endif *************** void GC_push_regs() *** 178,184 **** # else /* !__GNUC__ */ GC_push_one(getreg(REG_A2)); GC_push_one(getreg(REG_A3)); ! GC_push_one(getreg(REG_A4)); GC_push_one(getreg(REG_A5)); GC_push_one(getreg(REG_A6)); /* Skip stack pointer */ --- 178,187 ---- # else /* !__GNUC__ */ GC_push_one(getreg(REG_A2)); GC_push_one(getreg(REG_A3)); ! # ifndef __SASC ! /* Can probably be changed to #if 0 -Kjetil M. (a4=globals)*/ ! GC_push_one(getreg(REG_A4)); ! # endif GC_push_one(getreg(REG_A5)); GC_push_one(getreg(REG_A6)); /* Skip stack pointer */ *************** void GC_push_regs() *** 220,228 **** # if defined(I386) &&!defined(OS2) &&!defined(SVR4) \ && (defined(__MINGW32__) || !defined(MSWIN32)) \ && !defined(SCO) && !defined(SCO_ELF) \ ! && !(defined(LINUX) && defined(__ELF__)) \ && !(defined(FREEBSD) && defined(__ELF__)) \ ! && !defined(DOS4GW) /* I386 code, generic code does not appear to work */ /* It does appear to work under OS2, and asms dont */ /* This is used for some 38g UNIX variants and for CYGWIN32 */ --- 223,234 ---- # if defined(I386) &&!defined(OS2) &&!defined(SVR4) \ && (defined(__MINGW32__) || !defined(MSWIN32)) \ && !defined(SCO) && !defined(SCO_ELF) \ ! && !(defined(LINUX) && defined(__ELF__)) \ && !(defined(FREEBSD) && defined(__ELF__)) \ ! && !(defined(NETBSD) && defined(__ELF__)) \ ! && !(defined(OPENBSD) && defined(__ELF__)) \ ! && !(defined(BEOS) && defined(__ELF__)) \ ! && !defined(DOS4GW) && !defined(HURD) /* I386 code, generic code does not appear to work */ /* It does appear to work under OS2, and asms dont */ /* This is used for some 38g UNIX variants and for CYGWIN32 */ *************** void GC_push_regs() *** 236,242 **** # endif # if ( defined(I386) && defined(LINUX) && defined(__ELF__) ) \ ! || ( defined(I386) && defined(FREEBSD) && defined(__ELF__) ) /* This is modified for Linux with ELF (Note: _ELF_ only) */ /* This section handles FreeBSD with ELF. */ --- 242,251 ---- # endif # if ( defined(I386) && defined(LINUX) && defined(__ELF__) ) \ ! || ( defined(I386) && defined(FREEBSD) && defined(__ELF__) ) \ ! || ( defined(I386) && defined(NETBSD) && defined(__ELF__) ) \ ! || ( defined(I386) && defined(OPENBSD) && defined(__ELF__) ) \ ! || ( defined(I386) && defined(HURD) && defined(__ELF__) ) /* This is modified for Linux with ELF (Note: _ELF_ only) */ /* This section handles FreeBSD with ELF. */ *************** void GC_push_regs() *** 253,258 **** --- 262,278 ---- asm("pushl %ebx; call GC_push_one; addl $4,%esp"); # endif + # if ( defined(I386) && defined(BEOS) && defined(__ELF__) ) + /* As far as I can understand from */ + /* http://www.beunited.org/articles/jbq/nasm.shtml, */ + /* only ebp, esi, edi and ebx are not scratch. How MMX */ + /* etc. registers should be treated, I have no idea. */ + asm("pushl %ebp; call GC_push_one; addl $4,%esp"); + asm("pushl %esi; call GC_push_one; addl $4,%esp"); + asm("pushl %edi; call GC_push_one; addl $4,%esp"); + asm("pushl %ebx; call GC_push_one; addl $4,%esp"); + # endif + # if defined(I386) && defined(MSWIN32) && !defined(__MINGW32__) \ && !defined(USE_GENERIC) /* I386 code, Microsoft variant */ *************** void GC_push_regs() *** 281,298 **** # if defined(I386) && (defined(SVR4) || defined(SCO) || defined(SCO_ELF)) /* I386 code, SVR4 variant, generic code does not appear to work */ - # ifdef __GNUC__ - /* This is necessary to support PIC code. */ - # define call_push(REGNAME) \ - { register word reg __asm__( #REGNAME ); GC_push_one (reg); } - - # ifndef PIC - call_push(ebx) - # endif - call_push(ebp) - call_push(esi) - call_push(edi) - # else /* !__GNUC__ */ asm("pushl %eax"); asm("call GC_push_one"); asm("addl $4,%esp"); asm("pushl %ebx"); asm("call GC_push_one"); asm("addl $4,%esp"); asm("pushl %ecx"); asm("call GC_push_one"); asm("addl $4,%esp"); --- 301,306 ---- *************** void GC_push_regs() *** 300,306 **** asm("pushl %ebp"); asm("call GC_push_one"); asm("addl $4,%esp"); asm("pushl %esi"); asm("call GC_push_one"); asm("addl $4,%esp"); asm("pushl %edi"); asm("call GC_push_one"); asm("addl $4,%esp"); - # endif /* !__GNUC__ */ # endif # ifdef NS32K --- 308,313 ---- *************** void GC_push_regs() *** 385,392 **** # endif /* other machines... */ ! # if !(defined M68K) && !(defined VAX) && !(defined RT) ! # if !(defined SPARC) && !(defined I386) && !(defined NS32K) # if !defined(POWERPC) && !defined(UTS4) # if !defined(PJ) && !(defined(MIPS) && defined(LINUX)) --> bad news <-- --- 392,399 ---- # endif /* other machines... */ ! # if !defined(M68K) && !defined(VAX) && !defined(RT) ! # if !defined(SPARC) && !defined(I386) && !defined(NS32K) # if !defined(POWERPC) && !defined(UTS4) # if !defined(PJ) && !(defined(MIPS) && defined(LINUX)) --> bad news <-- *************** void GC_push_regs() *** 401,426 **** void GC_generic_push_regs(cold_gc_frame) ptr_t cold_gc_frame; { - /* Generic code */ - /* The idea is due to Parag Patel at HP. */ - /* We're not sure whether he would like */ - /* to be he acknowledged for it or not. */ { ! static jmp_buf regs; ! register word * i = (word *) regs; ! register ptr_t lim = (ptr_t)(regs) + (sizeof regs); ! /* Setjmp on Sun 3s doesn't clear all of the buffer. */ ! /* That tends to preserve garbage. Clear it. */ for (; (char *)i < lim; i++) { *i = 0; } ! # if defined(POWERPC) || defined(MSWIN32) || defined(UTS4) || defined(LINUX) ! (void) setjmp(regs); ! # else ! (void) _setjmp(regs); ! # endif ! # if defined(SPARC) || defined(IA64) /* On a register window machine, we need to save register */ /* contents on the stack for this to work. The setjmp */ /* is probably not needed on SPARC, since pointers are */ --- 408,442 ---- void GC_generic_push_regs(cold_gc_frame) ptr_t cold_gc_frame; { { ! # ifdef HAVE_BUILTIN_UNWIND_INIT ! /* This was suggested by Richard Henderson as the way to */ ! /* force callee-save registers and register windows onto */ ! /* the stack. */ ! __builtin_unwind_init(); ! # else /* !HAVE_BUILTIN_UNWIND_INIT */ ! /* Generic code */ ! /* The idea is due to Parag Patel at HP. */ ! /* We're not sure whether he would like */ ! /* to be he acknowledged for it or not. */ ! jmp_buf regs; ! register word * i = (word *) regs; ! register ptr_t lim = (ptr_t)(regs) + (sizeof regs); ! /* Setjmp doesn't always clear all of the buffer. */ ! /* That tends to preserve garbage. Clear it. */ for (; (char *)i < lim; i++) { *i = 0; } ! # if defined(POWERPC) || defined(MSWIN32) || defined(MSWINCE) \ ! || defined(UTS4) || defined(LINUX) || defined(EWS4800) ! (void) setjmp(regs); ! # else ! (void) _setjmp(regs); ! # endif ! # endif /* !HAVE_BUILTIN_UNWIND_INIT */ ! # if (defined(SPARC) && !defined(HAVE_BUILTIN_UNWIND_INIT)) \ ! || defined(IA64) /* On a register window machine, we need to save register */ /* contents on the stack for this to work. The setjmp */ /* is probably not needed on SPARC, since pointers are */ *************** ptr_t cold_gc_frame; *** 431,436 **** --- 447,456 ---- word GC_save_regs_in_stack(); GC_save_regs_ret_val = GC_save_regs_in_stack(); + /* On IA64 gcc, could use __builtin_ia64_flushrs() and */ + /* __builtin_ia64_flushrs(). The latter will be done */ + /* implicitly by __builtin_unwind_init() for gcc3.0.1 */ + /* and later. */ } # endif GC_push_current_stack(cold_gc_frame); *************** ptr_t cold_gc_frame; *** 451,465 **** asm("_GC_save_regs_in_stack:"); # endif # if defined(__arch64__) || defined(__sparcv9) ! asm(" save %sp,-128,%sp"); ! asm(" flushw"); ! asm(" ret"); ! asm(" restore %sp,2047+128,%o0"); # else ! asm(" ta 0x3 ! ST_FLUSH_WINDOWS"); ! asm(" retl"); ! asm(" mov %sp,%o0"); ! #endif # ifdef SVR4 asm(" .GC_save_regs_in_stack_end:"); asm(" .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack"); --- 471,485 ---- asm("_GC_save_regs_in_stack:"); # endif # if defined(__arch64__) || defined(__sparcv9) ! asm(" save %sp,-128,%sp"); ! asm(" flushw"); ! asm(" ret"); ! asm(" restore %sp,2047+128,%o0"); # else ! asm(" ta 0x3 ! ST_FLUSH_WINDOWS"); ! asm(" retl"); ! asm(" mov %sp,%o0"); ! # endif # ifdef SVR4 asm(" .GC_save_regs_in_stack_end:"); asm(" .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack"); *************** ptr_t cold_gc_frame; *** 472,478 **** /* On IA64, we also need to flush register windows. But they end */ /* up on the other side of the stack segment. */ /* Returns the backing store pointer for the register stack. */ ! # ifdef IA64 asm(" .text"); asm(" .psr abi64"); asm(" .psr lsb"); --- 492,502 ---- /* On IA64, we also need to flush register windows. But they end */ /* up on the other side of the stack segment. */ /* Returns the backing store pointer for the register stack. */ ! /* We now implement this as a separate assembly file, since inline */ ! /* assembly code here doesn't work with either the Intel or HP */ ! /* compilers. */ ! # if 0 ! # ifdef LINUX asm(" .text"); asm(" .psr abi64"); asm(" .psr lsb"); *************** ptr_t cold_gc_frame; *** 489,501 **** asm(" mov r8=ar.bsp"); asm(" br.ret.sptk.few rp"); asm(" .endp GC_save_regs_in_stack"); # endif /* GC_clear_stack_inner(arg, limit) clears stack area up to limit and */ /* returns arg. Stack clearing is crucial on SPARC, so we supply */ /* an assembly version that's more careful. Assumes limit is hotter */ /* than sp, and limit is 8 byte aligned. */ ! #if defined(ASM_CLEAR_CODE) && !defined(THREADS) #ifndef SPARC --> fix it #endif --- 513,546 ---- asm(" mov r8=ar.bsp"); asm(" br.ret.sptk.few rp"); asm(" .endp GC_save_regs_in_stack"); + # endif /* LINUX */ + # if 0 /* Other alternatives that don't work on HP/UX */ + word GC_save_regs_in_stack() { + # if USE_BUILTINS + __builtin_ia64_flushrs(); + return __builtin_ia64_bsp(); + # else + # ifdef HPUX + _asm(" flushrs"); + _asm(" ;;"); + _asm(" mov r8=ar.bsp"); + _asm(" br.ret.sptk.few rp"); + # else + asm(" flushrs"); + asm(" ;;"); + asm(" mov r8=ar.bsp"); + asm(" br.ret.sptk.few rp"); + # endif + # endif + } + # endif # endif /* GC_clear_stack_inner(arg, limit) clears stack area up to limit and */ /* returns arg. Stack clearing is crucial on SPARC, so we supply */ /* an assembly version that's more careful. Assumes limit is hotter */ /* than sp, and limit is 8 byte aligned. */ ! #if defined(ASM_CLEAR_CODE) #ifndef SPARC --> fix it #endif *************** ptr_t cold_gc_frame; *** 536,542 **** asm("add %o3,-8,%o3"); /* p -= 8 (delay slot) */ asm("retl"); asm("mov %o2,%sp"); /* Restore sp., delay slot */ ! #endif /* First argument = %o0 = return value */ # ifdef SVR4 asm(" .GC_clear_stack_inner_end:"); --- 581,587 ---- asm("add %o3,-8,%o3"); /* p -= 8 (delay slot) */ asm("retl"); asm("mov %o2,%sp"); /* Restore sp., delay slot */ ! #endif /* old SPARC */ /* First argument = %o0 = return value */ # ifdef SVR4 asm(" .GC_clear_stack_inner_end:"); diff -Nrc3pad gcc-3.0.4/boehm-gc/malloc.c gcc-3.1/boehm-gc/malloc.c *** gcc-3.0.4/boehm-gc/malloc.c Thu Apr 5 00:13:13 2001 --- gcc-3.1/boehm-gc/malloc.c Tue Feb 12 04:37:53 2002 *************** *** 1,6 **** --- 1,7 ---- /* * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 14,20 **** /* Boehm, February 7, 1996 4:32 pm PST */ #include ! #include "gc_priv.h" extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */ void GC_extend_size_map(); /* in misc.c. */ --- 15,21 ---- /* Boehm, February 7, 1996 4:32 pm PST */ #include ! #include "private/gc_priv.h" extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */ void GC_extend_size_map(); /* in misc.c. */ *************** register struct obj_kind * kind; *** 32,38 **** return(TRUE); } ! /* allocate lb bytes for an object of kind. */ /* Should not be used to directly to allocate */ /* objects such as STUBBORN objects that */ /* require special handling on allocation. */ --- 33,98 ---- return(TRUE); } ! /* Allocate a large block of size lw words. */ ! /* The block is not cleared. */ ! /* Flags is 0 or IGNORE_OFF_PAGE. */ ! ptr_t GC_alloc_large(lw, k, flags) ! word lw; ! int k; ! unsigned flags; ! { ! struct hblk * h; ! word n_blocks = OBJ_SZ_TO_BLOCKS(lw); ! ptr_t result; ! ! if (!GC_is_initialized) GC_init_inner(); ! /* Do our share of marking work */ ! if(GC_incremental && !GC_dont_gc) ! GC_collect_a_little_inner((int)n_blocks); ! h = GC_allochblk(lw, k, flags); ! # ifdef USE_MUNMAP ! if (0 == h) { ! GC_merge_unmapped(); ! h = GC_allochblk(lw, k, flags); ! } ! # endif ! while (0 == h && GC_collect_or_expand(n_blocks, (flags != 0))) { ! h = GC_allochblk(lw, k, flags); ! } ! if (h == 0) { ! result = 0; ! } else { ! int total_bytes = BYTES_TO_WORDS(n_blocks * HBLKSIZE); ! if (n_blocks > 1) { ! GC_large_allocd_bytes += n_blocks * HBLKSIZE; ! if (GC_large_allocd_bytes > GC_max_large_allocd_bytes) ! GC_max_large_allocd_bytes = GC_large_allocd_bytes; ! } ! result = (ptr_t) (h -> hb_body); ! GC_words_wasted += total_bytes - lw; ! } ! return result; ! } ! ! ! /* Allocate a large block of size lb bytes. Clear if appropriate. */ ! ptr_t GC_alloc_large_and_clear(lw, k, flags) ! word lw; ! int k; ! unsigned flags; ! { ! ptr_t result = GC_alloc_large(lw, k, flags); ! word n_blocks = OBJ_SZ_TO_BLOCKS(lw); ! ! if (0 == result) return 0; ! if (GC_debugging_started || GC_obj_kinds[k].ok_init) { ! /* Clear the whole block, in case of GC_realloc call. */ ! BZERO(result, n_blocks * HBLKSIZE); ! } ! return result; ! } ! ! /* allocate lb bytes for an object of kind k. */ /* Should not be used to directly to allocate */ /* objects such as STUBBORN objects that */ /* require special handling on allocation. */ *************** register ptr_t *opp; *** 88,123 **** *opp = obj_link(op); obj_link(op) = 0; } else { - register struct hblk * h; - register word n_blocks = divHBLKSZ(ADD_SLOP(lb) - + HDR_BYTES + HBLKSIZE-1); - - if (!GC_is_initialized) GC_init_inner(); - /* Do our share of marking work */ - if(GC_incremental && !GC_dont_gc) - GC_collect_a_little_inner((int)n_blocks); lw = ROUNDED_UP_WORDS(lb); ! h = GC_allochblk(lw, k, 0); ! # ifdef USE_MUNMAP ! if (0 == h) { ! GC_merge_unmapped(); ! h = GC_allochblk(lw, k, 0); ! } ! # endif ! while (0 == h && GC_collect_or_expand(n_blocks, FALSE)) { ! h = GC_allochblk(lw, k, 0); ! } ! if (h == 0) { ! op = 0; ! } else { ! op = (ptr_t) (h -> hb_body); ! GC_words_wasted += BYTES_TO_WORDS(n_blocks * HBLKSIZE) - lw; ! } } GC_words_allocd += lw; out: ! return((ptr_t)op); } ptr_t GC_generic_malloc(lb, k) --- 148,178 ---- *opp = obj_link(op); obj_link(op) = 0; } else { lw = ROUNDED_UP_WORDS(lb); ! op = (ptr_t)GC_alloc_large_and_clear(lw, k, 0); } GC_words_allocd += lw; out: ! return op; ! } ! ! /* Allocate a composite object of size n bytes. The caller guarantees */ ! /* that pointers past the first page are not relevant. Caller holds */ ! /* allocation lock. */ ! ptr_t GC_generic_malloc_inner_ignore_off_page(lb, k) ! register size_t lb; ! register int k; ! { ! register word lw; ! ptr_t op; ! ! if (lb <= HBLKSIZE) ! return(GC_generic_malloc_inner((word)lb, k)); ! lw = ROUNDED_UP_WORDS(lb); ! op = (ptr_t)GC_alloc_large_and_clear(lw, k, IGNORE_OFF_PAGE); ! GC_words_allocd += lw; ! return op; } ptr_t GC_generic_malloc(lb, k) *************** register int k; *** 128,138 **** DCL_LOCK_STATE; GC_INVOKE_FINALIZERS(); ! DISABLE_SIGNALS(); ! LOCK(); ! result = GC_generic_malloc_inner(lb, k); ! UNLOCK(); ! ENABLE_SIGNALS(); if (0 == result) { return((*GC_oom_fn)(lb)); } else { --- 183,225 ---- DCL_LOCK_STATE; GC_INVOKE_FINALIZERS(); ! if (SMALL_OBJ(lb)) { ! DISABLE_SIGNALS(); ! LOCK(); ! result = GC_generic_malloc_inner((word)lb, k); ! UNLOCK(); ! ENABLE_SIGNALS(); ! } else { ! word lw; ! word n_blocks; ! GC_bool init; ! lw = ROUNDED_UP_WORDS(lb); ! n_blocks = OBJ_SZ_TO_BLOCKS(lw); ! init = GC_obj_kinds[k].ok_init; ! DISABLE_SIGNALS(); ! LOCK(); ! result = (ptr_t)GC_alloc_large(lw, k, 0); ! if (0 != result) { ! if (GC_debugging_started) { ! BZERO(result, n_blocks * HBLKSIZE); ! } else { ! # ifdef THREADS ! /* Clear any memory that might be used for GC descriptors */ ! /* before we release the lock. */ ! ((word *)result)[0] = 0; ! ((word *)result)[1] = 0; ! ((word *)result)[lw-1] = 0; ! ((word *)result)[lw-2] = 0; ! # endif ! } ! } ! GC_words_allocd += lw; ! UNLOCK(); ! ENABLE_SIGNALS(); ! if (init & !GC_debugging_started && 0 != result) { ! BZERO(result, n_blocks * HBLKSIZE); ! } ! } if (0 == result) { return((*GC_oom_fn)(lb)); } else { *************** register ptr_t * opp; *** 159,165 **** register word lw; DCL_LOCK_STATE; ! if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; # else --- 246,252 ---- register word lw; DCL_LOCK_STATE; ! if( EXPECT(SMALL_OBJ(lb), 1) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; # else *************** DCL_LOCK_STATE; *** 167,173 **** # endif opp = &(GC_aobjfreelist[lw]); FASTLOCK(); ! if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { FASTUNLOCK(); return(GENERAL_MALLOC((word)lb, PTRFREE)); } --- 254,260 ---- # endif opp = &(GC_aobjfreelist[lw]); FASTLOCK(); ! if( EXPECT(!FASTLOCK_SUCCEEDED() || (op = *opp) == 0, 0) ) { FASTUNLOCK(); return(GENERAL_MALLOC((word)lb, PTRFREE)); } *************** register ptr_t *opp; *** 194,200 **** register word lw; DCL_LOCK_STATE; ! if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; # else --- 281,287 ---- register word lw; DCL_LOCK_STATE; ! if( EXPECT(SMALL_OBJ(lb), 1) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; # else *************** DCL_LOCK_STATE; *** 202,208 **** # endif opp = &(GC_objfreelist[lw]); FASTLOCK(); ! if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) { FASTUNLOCK(); return(GENERAL_MALLOC((word)lb, NORMAL)); } --- 289,295 ---- # endif opp = &(GC_objfreelist[lw]); FASTLOCK(); ! if( EXPECT(!FASTLOCK_SUCCEEDED() || (op = *opp) == 0, 0) ) { FASTUNLOCK(); return(GENERAL_MALLOC((word)lb, NORMAL)); } *************** DCL_LOCK_STATE; *** 228,234 **** /* It might help to manually inline the GC_malloc call here. */ /* But any decent compiler should reduce the extra procedure call */ /* to at most a jump instruction in this case. */ ! # if defined(I386) && defined(SOLARIS_THREADS) /* * Thread initialisation can call malloc before * we're ready for it. --- 315,321 ---- /* It might help to manually inline the GC_malloc call here. */ /* But any decent compiler should reduce the extra procedure call */ /* to at most a jump instruction in this case. */ ! # if defined(I386) && defined(GC_SOLARIS_THREADS) /* * Thread initialisation can call malloc before * we're ready for it. *************** DCL_LOCK_STATE; *** 237,244 **** * inopportune times. */ if (!GC_is_initialized) return sbrk(lb); ! # endif /* I386 && SOLARIS_THREADS */ ! return(REDIRECT_MALLOC(lb)); } # ifdef __STDC__ --- 324,331 ---- * inopportune times. */ if (!GC_is_initialized) return sbrk(lb); ! # endif /* I386 && GC_SOLARIS_THREADS */ ! return((GC_PTR)REDIRECT_MALLOC(lb)); } # ifdef __STDC__ *************** DCL_LOCK_STATE; *** 248,372 **** size_t n, lb; # endif { ! return(REDIRECT_MALLOC(n*lb)); } - # endif /* REDIRECT_MALLOC */ - - GC_PTR GC_generic_or_special_malloc(lb,knd) - word lb; - int knd; - { - switch(knd) { - # ifdef STUBBORN_ALLOC - case STUBBORN: - return(GC_malloc_stubborn((size_t)lb)); - # endif - case PTRFREE: - return(GC_malloc_atomic((size_t)lb)); - case NORMAL: - return(GC_malloc((size_t)lb)); - case UNCOLLECTABLE: - return(GC_malloc_uncollectable((size_t)lb)); - # ifdef ATOMIC_UNCOLLECTABLE - case AUNCOLLECTABLE: - return(GC_malloc_atomic_uncollectable((size_t)lb)); - # endif /* ATOMIC_UNCOLLECTABLE */ - default: - return(GC_generic_malloc(lb,knd)); - } - } - - - /* Change the size of the block pointed to by p to contain at least */ - /* lb bytes. The object may be (and quite likely will be) moved. */ - /* The kind (e.g. atomic) is the same as that of the old. */ - /* Shrinking of large blocks is not implemented well. */ - # ifdef __STDC__ - GC_PTR GC_realloc(GC_PTR p, size_t lb) - # else - GC_PTR GC_realloc(p,lb) - GC_PTR p; - size_t lb; - # endif - { - register struct hblk * h; - register hdr * hhdr; - register word sz; /* Current size in bytes */ - register word orig_sz; /* Original sz in bytes */ - int obj_kind; - - if (p == 0) return(GC_malloc(lb)); /* Required by ANSI */ - h = HBLKPTR(p); - hhdr = HDR(h); - sz = hhdr -> hb_sz; - obj_kind = hhdr -> hb_obj_kind; - sz = WORDS_TO_BYTES(sz); - orig_sz = sz; - - if (sz > WORDS_TO_BYTES(MAXOBJSZ)) { - /* Round it up to the next whole heap block */ - register word descr; - - sz = (sz+HDR_BYTES+HBLKSIZE-1) - & (~HBLKMASK); - sz -= HDR_BYTES; - hhdr -> hb_sz = BYTES_TO_WORDS(sz); - descr = GC_obj_kinds[obj_kind].ok_descriptor; - if (GC_obj_kinds[obj_kind].ok_relocate_descr) descr += sz; - hhdr -> hb_descr = descr; - if (IS_UNCOLLECTABLE(obj_kind)) GC_non_gc_bytes += (sz - orig_sz); - /* Extra area is already cleared by allochblk. */ - } - if (ADD_SLOP(lb) <= sz) { - if (lb >= (sz >> 1)) { - # ifdef STUBBORN_ALLOC - if (obj_kind == STUBBORN) GC_change_stubborn(p); - # endif - if (orig_sz > lb) { - /* Clear unneeded part of object to avoid bogus pointer */ - /* tracing. */ - /* Safe for stubborn objects. */ - BZERO(((ptr_t)p) + lb, orig_sz - lb); - } - return(p); - } else { - /* shrink */ - GC_PTR result = - GC_generic_or_special_malloc((word)lb, obj_kind); - - if (result == 0) return(0); - /* Could also return original object. But this */ - /* gives the client warning of imminent disaster. */ - BCOPY(p, result, lb); - # ifndef IGNORE_FREE - GC_free(p); - # endif - return(result); - } - } else { - /* grow */ - GC_PTR result = - GC_generic_or_special_malloc((word)lb, obj_kind); - - if (result == 0) return(0); - BCOPY(p, result, sz); - # ifndef IGNORE_FREE - GC_free(p); - # endif - return(result); - } - } ! # ifdef REDIRECT_MALLOC # ifdef __STDC__ ! GC_PTR realloc(GC_PTR p, size_t lb) # else ! GC_PTR realloc(p,lb) ! GC_PTR p; ! size_t lb; # endif { ! return(GC_realloc(p, lb)); } # endif /* REDIRECT_MALLOC */ --- 335,355 ---- size_t n, lb; # endif { ! return((GC_PTR)REDIRECT_MALLOC(n*lb)); } ! # include # ifdef __STDC__ ! char *strdup(const char *s) # else ! char *strdup(s) ! char *s; # endif { ! size_t len = strlen + 1; ! char * result = ((char *)REDIRECT_MALLOC(len+1)); ! BCOPY(s, result, len+1); ! return result; } # endif /* REDIRECT_MALLOC */ *************** int obj_kind; *** 391,405 **** h = HBLKPTR(p); hhdr = HDR(h); # if defined(REDIRECT_MALLOC) && \ ! (defined(SOLARIS_THREADS) || defined(LINUX_THREADS)) ! /* We have to redirect malloc calls during initialization. */ /* Don't try to deallocate that memory. */ if (0 == hhdr) return; # endif knd = hhdr -> hb_obj_kind; sz = hhdr -> hb_sz; ok = &GC_obj_kinds[knd]; ! if (sz <= MAXOBJSZ) { # ifdef THREADS DISABLE_SIGNALS(); LOCK(); --- 374,391 ---- h = HBLKPTR(p); hhdr = HDR(h); # if defined(REDIRECT_MALLOC) && \ ! (defined(GC_SOLARIS_THREADS) || defined(GC_LINUX_THREADS) \ ! || defined(__MINGW32__)) /* Should this be MSWIN32 in general? */ ! /* For Solaris, we have to redirect malloc calls during */ ! /* initialization. For the others, this seems to happen */ ! /* implicitly. */ /* Don't try to deallocate that memory. */ if (0 == hhdr) return; # endif knd = hhdr -> hb_obj_kind; sz = hhdr -> hb_sz; ok = &GC_obj_kinds[knd]; ! if (EXPECT((sz <= MAXOBJSZ), 1)) { # ifdef THREADS DISABLE_SIGNALS(); LOCK(); *************** int obj_kind; *** 432,437 **** --- 418,459 ---- } } + /* Explicitly deallocate an object p when we already hold lock. */ + /* Only used for internally allocated objects, so we can take some */ + /* shortcuts. */ + #ifdef THREADS + void GC_free_inner(GC_PTR p) + { + register struct hblk *h; + register hdr *hhdr; + register signed_word sz; + register ptr_t * flh; + register int knd; + register struct obj_kind * ok; + DCL_LOCK_STATE; + + h = HBLKPTR(p); + hhdr = HDR(h); + knd = hhdr -> hb_obj_kind; + sz = hhdr -> hb_sz; + ok = &GC_obj_kinds[knd]; + if (sz <= MAXOBJSZ) { + GC_mem_freed += sz; + if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= WORDS_TO_BYTES(sz); + if (ok -> ok_init) { + BZERO((word *)p + 1, WORDS_TO_BYTES(sz-1)); + } + flh = &(ok -> ok_freelist[sz]); + obj_link(p) = *flh; + *flh = (ptr_t)p; + } else { + GC_mem_freed += sz; + if (IS_UNCOLLECTABLE(knd)) GC_non_gc_bytes -= WORDS_TO_BYTES(sz); + GC_freehblk(h); + } + } + #endif /* THREADS */ + # ifdef REDIRECT_MALLOC # ifdef __STDC__ void free(GC_PTR p) diff -Nrc3pad gcc-3.0.4/boehm-gc/mallocx.c gcc-3.1/boehm-gc/mallocx.c *** gcc-3.0.4/boehm-gc/mallocx.c Wed Apr 19 10:09:58 2000 --- gcc-3.1/boehm-gc/mallocx.c Sat Aug 18 01:04:43 2001 *************** *** 2,7 **** --- 2,8 ---- * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. * Copyright (c) 1996 by Silicon Graphics. All rights reserved. + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 21,27 **** */ #include ! #include "gc_priv.h" extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */ void GC_extend_size_map(); /* in misc.c. */ --- 22,28 ---- */ #include ! #include "private/gc_priv.h" extern ptr_t GC_clear_stack(); /* in misc.c, behaves like identity */ void GC_extend_size_map(); /* in misc.c. */ *************** GC_bool GC_alloc_reclaim_list(); /* in m *** 30,98 **** /* Some externally visible but unadvertised variables to allow access to */ /* free lists from inlined allocators without including gc_priv.h */ /* or introducing dependencies on internal data structure layouts. */ ! ptr_t * CONST GC_objfreelist_ptr = GC_objfreelist; ! ptr_t * CONST GC_aobjfreelist_ptr = GC_aobjfreelist; ! ptr_t * CONST GC_uobjfreelist_ptr = GC_uobjfreelist; # ifdef ATOMIC_UNCOLLECTABLE ! ptr_t * CONST GC_auobjfreelist_ptr = GC_auobjfreelist; # endif ! /* Allocate a composite object of size n bytes. The caller guarantees */ ! /* that pointers past the first page are not relevant. Caller holds */ ! /* allocation lock. */ ! ptr_t GC_generic_malloc_inner_ignore_off_page(lb, k) ! register size_t lb; ! register int k; { ! register struct hblk * h; ! register word n_blocks; ! register word lw; ! register ptr_t op; ! if (lb <= HBLKSIZE) ! return(GC_generic_malloc_inner((word)lb, k)); ! n_blocks = divHBLKSZ(ADD_SLOP(lb) + HDR_BYTES + HBLKSIZE-1); ! if (!GC_is_initialized) GC_init_inner(); ! /* Do our share of marking work */ ! if(GC_incremental && !GC_dont_gc) ! GC_collect_a_little_inner((int)n_blocks); ! lw = ROUNDED_UP_WORDS(lb); ! h = GC_allochblk(lw, k, IGNORE_OFF_PAGE); ! # ifdef USE_MUNMAP ! if (0 == h) { ! GC_merge_unmapped(); ! h = GC_allochblk(lw, k, IGNORE_OFF_PAGE); ! } ! # endif ! while (0 == h && GC_collect_or_expand(n_blocks, TRUE)) { ! h = GC_allochblk(lw, k, IGNORE_OFF_PAGE); } ! if (h == 0) { ! op = 0; } else { ! op = (ptr_t) (h -> hb_body); ! GC_words_wasted += BYTES_TO_WORDS(n_blocks * HBLKSIZE) - lw; } - GC_words_allocd += lw; - return((ptr_t)op); } ptr_t GC_generic_malloc_ignore_off_page(lb, k) register size_t lb; register int k; { register ptr_t result; DCL_LOCK_STATE; GC_INVOKE_FINALIZERS(); DISABLE_SIGNALS(); LOCK(); ! result = GC_generic_malloc_inner_ignore_off_page(lb,k); UNLOCK(); ENABLE_SIGNALS(); if (0 == result) { return((*GC_oom_fn)(lb)); } else { return(result); } } --- 31,209 ---- /* Some externally visible but unadvertised variables to allow access to */ /* free lists from inlined allocators without including gc_priv.h */ /* or introducing dependencies on internal data structure layouts. */ ! ptr_t * GC_CONST GC_objfreelist_ptr = GC_objfreelist; ! ptr_t * GC_CONST GC_aobjfreelist_ptr = GC_aobjfreelist; ! ptr_t * GC_CONST GC_uobjfreelist_ptr = GC_uobjfreelist; # ifdef ATOMIC_UNCOLLECTABLE ! ptr_t * GC_CONST GC_auobjfreelist_ptr = GC_auobjfreelist; # endif ! ! GC_PTR GC_generic_or_special_malloc(lb,knd) ! word lb; ! int knd; { ! switch(knd) { ! # ifdef STUBBORN_ALLOC ! case STUBBORN: ! return(GC_malloc_stubborn((size_t)lb)); ! # endif ! case PTRFREE: ! return(GC_malloc_atomic((size_t)lb)); ! case NORMAL: ! return(GC_malloc((size_t)lb)); ! case UNCOLLECTABLE: ! return(GC_malloc_uncollectable((size_t)lb)); ! # ifdef ATOMIC_UNCOLLECTABLE ! case AUNCOLLECTABLE: ! return(GC_malloc_atomic_uncollectable((size_t)lb)); ! # endif /* ATOMIC_UNCOLLECTABLE */ ! default: ! return(GC_generic_malloc(lb,knd)); ! } ! } ! ! /* Change the size of the block pointed to by p to contain at least */ ! /* lb bytes. The object may be (and quite likely will be) moved. */ ! /* The kind (e.g. atomic) is the same as that of the old. */ ! /* Shrinking of large blocks is not implemented well. */ ! # ifdef __STDC__ ! GC_PTR GC_realloc(GC_PTR p, size_t lb) ! # else ! GC_PTR GC_realloc(p,lb) ! GC_PTR p; ! size_t lb; ! # endif ! { ! register struct hblk * h; ! register hdr * hhdr; ! register word sz; /* Current size in bytes */ ! register word orig_sz; /* Original sz in bytes */ ! int obj_kind; ! ! if (p == 0) return(GC_malloc(lb)); /* Required by ANSI */ ! h = HBLKPTR(p); ! hhdr = HDR(h); ! sz = hhdr -> hb_sz; ! obj_kind = hhdr -> hb_obj_kind; ! sz = WORDS_TO_BYTES(sz); ! orig_sz = sz; ! ! if (sz > MAXOBJBYTES) { ! /* Round it up to the next whole heap block */ ! register word descr; ! ! sz = (sz+HBLKSIZE-1) & (~HBLKMASK); ! hhdr -> hb_sz = BYTES_TO_WORDS(sz); ! descr = GC_obj_kinds[obj_kind].ok_descriptor; ! if (GC_obj_kinds[obj_kind].ok_relocate_descr) descr += sz; ! hhdr -> hb_descr = descr; ! if (IS_UNCOLLECTABLE(obj_kind)) GC_non_gc_bytes += (sz - orig_sz); ! /* Extra area is already cleared by GC_alloc_large_and_clear. */ } ! if (ADD_SLOP(lb) <= sz) { ! if (lb >= (sz >> 1)) { ! # ifdef STUBBORN_ALLOC ! if (obj_kind == STUBBORN) GC_change_stubborn(p); ! # endif ! if (orig_sz > lb) { ! /* Clear unneeded part of object to avoid bogus pointer */ ! /* tracing. */ ! /* Safe for stubborn objects. */ ! BZERO(((ptr_t)p) + lb, orig_sz - lb); ! } ! return(p); ! } else { ! /* shrink */ ! GC_PTR result = ! GC_generic_or_special_malloc((word)lb, obj_kind); ! ! if (result == 0) return(0); ! /* Could also return original object. But this */ ! /* gives the client warning of imminent disaster. */ ! BCOPY(p, result, lb); ! # ifndef IGNORE_FREE ! GC_free(p); ! # endif ! return(result); ! } } else { ! /* grow */ ! GC_PTR result = ! GC_generic_or_special_malloc((word)lb, obj_kind); ! ! if (result == 0) return(0); ! BCOPY(p, result, sz); ! # ifndef IGNORE_FREE ! GC_free(p); ! # endif ! return(result); } } + # if defined(REDIRECT_MALLOC) || defined(REDIRECT_REALLOC) + # ifdef __STDC__ + GC_PTR realloc(GC_PTR p, size_t lb) + # else + GC_PTR realloc(p,lb) + GC_PTR p; + size_t lb; + # endif + { + # ifdef REDIRECT_REALLOC + return(REDIRECT_REALLOC(p, lb)); + # else + return(GC_realloc(p, lb)); + # endif + } + # endif /* REDIRECT_MALLOC */ + + + /* The same thing, except caller does not hold allocation lock. */ + /* We avoid holding allocation lock while we clear memory. */ ptr_t GC_generic_malloc_ignore_off_page(lb, k) register size_t lb; register int k; { register ptr_t result; + word lw; + word n_blocks; + GC_bool init; DCL_LOCK_STATE; + if (SMALL_OBJ(lb)) + return(GC_generic_malloc((word)lb, k)); + lw = ROUNDED_UP_WORDS(lb); + n_blocks = OBJ_SZ_TO_BLOCKS(lw); + init = GC_obj_kinds[k].ok_init; GC_INVOKE_FINALIZERS(); DISABLE_SIGNALS(); LOCK(); ! result = (ptr_t)GC_alloc_large(lw, k, IGNORE_OFF_PAGE); ! if (0 != result) { ! if (GC_debugging_started) { ! BZERO(result, n_blocks * HBLKSIZE); ! } else { ! # ifdef THREADS ! /* Clear any memory that might be used for GC descriptors */ ! /* before we release the lock. */ ! ((word *)result)[0] = 0; ! ((word *)result)[1] = 0; ! ((word *)result)[lw-1] = 0; ! ((word *)result)[lw-2] = 0; ! # endif ! } ! } ! GC_words_allocd += lw; UNLOCK(); ENABLE_SIGNALS(); if (0 == result) { return((*GC_oom_fn)(lb)); } else { + if (init & !GC_debugging_started) { + BZERO(result, n_blocks * HBLKSIZE); + } return(result); } } *************** DCL_LOCK_STATE; *** 185,190 **** --- 296,319 ---- } #if defined(THREADS) && !defined(SRC_M3) + + extern signed_word GC_mem_found; /* Protected by GC lock. */ + + #ifdef PARALLEL_MARK + volatile signed_word GC_words_allocd_tmp = 0; + /* Number of words of memory allocated since */ + /* we released the GC lock. Instead of */ + /* reacquiring the GC lock just to add this in, */ + /* we add it in the next time we reacquire */ + /* the lock. (Atomically adding it doesn't */ + /* work, since we would have to atomically */ + /* update it in GC_malloc, which is too */ + /* expensive. */ + #endif /* PARALLEL_MARK */ + + /* See reclaim.c: */ + extern ptr_t GC_reclaim_generic(); + /* Return a list of 1 or more objects of the indicated size, linked */ /* through the first word in the object. This has the advantage that */ /* it acquires the allocation lock only once, and may greatly reduce */ *************** DCL_LOCK_STATE; *** 194,256 **** /* GC_malloc_many or friends to replenish it. (We do not round up */ /* object sizes, since a call indicates the intention to consume many */ /* objects of exactly this size.) */ /* Note that the client should usually clear the link field. */ ! ptr_t GC_generic_malloc_many(lb, k) register word lb; register int k; { ptr_t op; ! register ptr_t p; ptr_t *opp; word lw; ! register word my_words_allocd; DCL_LOCK_STATE; if (!SMALL_OBJ(lb)) { op = GC_generic_malloc(lb, k); if(0 != op) obj_link(op) = 0; ! return(op); } lw = ALIGNED_WORDS(lb); GC_INVOKE_FINALIZERS(); DISABLE_SIGNALS(); LOCK(); ! opp = &(GC_obj_kinds[k].ok_freelist[lw]); ! if( (op = *opp) == 0 ) { ! if (!GC_is_initialized) { ! GC_init_inner(); ! } ! op = GC_clear_stack(GC_allocobj(lw, k)); ! if (op == 0) { ! UNLOCK(); ! ENABLE_SIGNALS(); ! op = (*GC_oom_fn)(lb); ! if(0 != op) obj_link(op) = 0; ! return(op); ! } } ! *opp = 0; ! my_words_allocd = 0; ! for (p = op; p != 0; p = obj_link(p)) { ! my_words_allocd += lw; ! if (my_words_allocd >= BODY_SZ) { *opp = obj_link(p); obj_link(p) = 0; break; } } - GC_words_allocd += my_words_allocd; ! out: UNLOCK(); ENABLE_SIGNALS(); ! return(op); ! } ! void * GC_malloc_many(size_t lb) { ! return(GC_generic_malloc_many(lb, NORMAL)); } /* Note that the "atomic" version of this would be unsafe, since the */ --- 323,513 ---- /* GC_malloc_many or friends to replenish it. (We do not round up */ /* object sizes, since a call indicates the intention to consume many */ /* objects of exactly this size.) */ + /* We return the free-list by assigning it to *result, since it is */ + /* not safe to return, e.g. a linked list of pointer-free objects, */ + /* since the collector would not retain the entire list if it were */ + /* invoked just as we were returning. */ /* Note that the client should usually clear the link field. */ ! void GC_generic_malloc_many(lb, k, result) register word lb; register int k; + ptr_t *result; { ptr_t op; ! ptr_t p; ptr_t *opp; word lw; ! word my_words_allocd = 0; ! struct obj_kind * ok = &(GC_obj_kinds[k]); DCL_LOCK_STATE; + # if defined(GATHERSTATS) || defined(PARALLEL_MARK) + # define COUNT_ARG , &my_words_allocd + # else + # define COUNT_ARG + # define NEED_TO_COUNT + # endif if (!SMALL_OBJ(lb)) { op = GC_generic_malloc(lb, k); if(0 != op) obj_link(op) = 0; ! *result = op; ! return; } lw = ALIGNED_WORDS(lb); GC_INVOKE_FINALIZERS(); DISABLE_SIGNALS(); LOCK(); ! if (!GC_is_initialized) GC_init_inner(); ! /* Do our share of marking work */ ! if (GC_incremental && !GC_dont_gc) { ! ENTER_GC(); ! GC_collect_a_little_inner(1); ! EXIT_GC(); ! } ! /* First see if we can reclaim a page of objects waiting to be */ ! /* reclaimed. */ ! { ! struct hblk ** rlh = ok -> ok_reclaim_list; ! struct hblk * hbp; ! hdr * hhdr; ! ! rlh += lw; ! while ((hbp = *rlh) != 0) { ! hhdr = HDR(hbp); ! *rlh = hhdr -> hb_next; ! # ifdef PARALLEL_MARK ! { ! signed_word my_words_allocd_tmp = GC_words_allocd_tmp; ! ! GC_ASSERT(my_words_allocd_tmp >= 0); ! /* We only decrement it while holding the GC lock. */ ! /* Thus we can't accidentally adjust it down in more */ ! /* than one thread simultaneously. */ ! if (my_words_allocd_tmp != 0) { ! (void)GC_atomic_add( ! (volatile GC_word *)(&GC_words_allocd_tmp), ! (GC_word)(-my_words_allocd_tmp)); ! GC_words_allocd += my_words_allocd_tmp; ! } ! } ! GC_acquire_mark_lock(); ! ++ GC_fl_builder_count; ! UNLOCK(); ! ENABLE_SIGNALS(); ! GC_release_mark_lock(); ! # endif ! op = GC_reclaim_generic(hbp, hhdr, lw, ! ok -> ok_init, 0 COUNT_ARG); ! if (op != 0) { ! # ifdef NEED_TO_COUNT ! /* We are neither gathering statistics, nor marking in */ ! /* parallel. Thus GC_reclaim_generic doesn't count */ ! /* for us. */ ! for (p = op; p != 0; p = obj_link(p)) { ! my_words_allocd += lw; ! } ! # endif ! # if defined(GATHERSTATS) ! /* We also reclaimed memory, so we need to adjust */ ! /* that count. */ ! /* This should be atomic, so the results may be */ ! /* inaccurate. */ ! GC_mem_found += my_words_allocd; ! # endif ! # ifdef PARALLEL_MARK ! *result = op; ! (void)GC_atomic_add( ! (volatile GC_word *)(&GC_words_allocd_tmp), ! (GC_word)(my_words_allocd)); ! GC_acquire_mark_lock(); ! -- GC_fl_builder_count; ! if (GC_fl_builder_count == 0) GC_notify_all_builder(); ! GC_release_mark_lock(); ! (void) GC_clear_stack(0); ! return; ! # else ! GC_words_allocd += my_words_allocd; ! goto out; ! # endif ! } ! # ifdef PARALLEL_MARK ! GC_acquire_mark_lock(); ! -- GC_fl_builder_count; ! if (GC_fl_builder_count == 0) GC_notify_all_builder(); ! GC_release_mark_lock(); ! DISABLE_SIGNALS(); ! LOCK(); ! /* GC lock is needed for reclaim list access. We */ ! /* must decrement fl_builder_count before reaquiring GC */ ! /* lock. Hopefully this path is rare. */ ! # endif ! } } ! /* Next try to use prefix of global free list if there is one. */ ! /* We don't refill it, but we need to use it up before allocating */ ! /* a new block ourselves. */ ! opp = &(GC_obj_kinds[k].ok_freelist[lw]); ! if ( (op = *opp) != 0 ) { ! *opp = 0; ! my_words_allocd = 0; ! for (p = op; p != 0; p = obj_link(p)) { ! my_words_allocd += lw; ! if (my_words_allocd >= BODY_SZ) { *opp = obj_link(p); obj_link(p) = 0; break; + } } + GC_words_allocd += my_words_allocd; + goto out; + } + /* Next try to allocate a new block worth of objects of this size. */ + { + struct hblk *h = GC_allochblk(lw, k, 0); + if (h != 0) { + if (IS_UNCOLLECTABLE(k)) GC_set_hdr_marks(HDR(h)); + GC_words_allocd += BYTES_TO_WORDS(HBLKSIZE) + - BYTES_TO_WORDS(HBLKSIZE) % lw; + # ifdef PARALLEL_MARK + GC_acquire_mark_lock(); + ++ GC_fl_builder_count; + UNLOCK(); + ENABLE_SIGNALS(); + GC_release_mark_lock(); + # endif + + op = GC_build_fl(h, lw, ok -> ok_init, 0); + # ifdef PARALLEL_MARK + *result = op; + GC_acquire_mark_lock(); + -- GC_fl_builder_count; + if (GC_fl_builder_count == 0) GC_notify_all_builder(); + GC_release_mark_lock(); + (void) GC_clear_stack(0); + return; + # else + goto out; + # endif + } } ! /* As a last attempt, try allocating a single object. Note that */ ! /* this may trigger a collection or expand the heap. */ ! op = GC_generic_malloc_inner(lb, k); ! if (0 != op) obj_link(op) = 0; ! ! out: ! *result = op; UNLOCK(); ENABLE_SIGNALS(); ! (void) GC_clear_stack(0); } ! GC_PTR GC_malloc_many(size_t lb) { ! ptr_t result; ! GC_generic_malloc_many(lb, NORMAL, &result); ! return result; } /* Note that the "atomic" version of this would be unsafe, since the */ *************** DCL_LOCK_STATE; *** 272,282 **** if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES ! # ifdef ADD_BYTE_AT_END ! if (lb != 0) lb--; /* We don't need the extra byte, since this won't be */ /* collected anyway. */ - # endif lw = GC_size_map[lb]; # else lw = ALIGNED_WORDS(lb); --- 529,537 ---- if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES ! if (EXTRA_BYTES != 0 && lb != 0) lb--; /* We don't need the extra byte, since this won't be */ /* collected anyway. */ lw = GC_size_map[lb]; # else lw = ALIGNED_WORDS(lb); *************** DCL_LOCK_STATE; *** 338,348 **** if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES ! # ifdef ADD_BYTE_AT_END ! if (lb != 0) lb--; /* We don't need the extra byte, since this won't be */ /* collected anyway. */ - # endif lw = GC_size_map[lb]; # else lw = ALIGNED_WORDS(lb); --- 593,601 ---- if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES ! if (EXTRA_BYTES != 0 && lb != 0) lb--; /* We don't need the extra byte, since this won't be */ /* collected anyway. */ lw = GC_size_map[lb]; # else lw = ALIGNED_WORDS(lb); diff -Nrc3pad gcc-3.0.4/boehm-gc/mark.c gcc-3.1/boehm-gc/mark.c *** gcc-3.0.4/boehm-gc/mark.c Mon Sep 4 21:46:26 2000 --- gcc-3.1/boehm-gc/mark.c Fri Mar 29 22:33:34 2002 *************** *** 2,7 **** --- 2,8 ---- /* * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 16,23 **** # include ! # include "gc_priv.h" ! # include "gc_mark.h" /* We put this here to minimize the risk of inlining. */ /*VARARGS*/ --- 17,23 ---- # include ! # include "private/gc_pmark.h" /* We put this here to minimize the risk of inlining. */ /*VARARGS*/ *************** word GC_n_mark_procs = GC_RESERVED_MARK_ *** 46,70 **** /* It's done here, since we need to deal with mark descriptors. */ struct obj_kind GC_obj_kinds[MAXOBJKINDS] = { /* PTRFREE */ { &GC_aobjfreelist[0], 0 /* filled in dynamically */, ! 0 | DS_LENGTH, FALSE, FALSE }, /* NORMAL */ { &GC_objfreelist[0], 0, ! # if defined(ADD_BYTE_AT_END) && ALIGNMENT > DS_TAGS ! (word)(-ALIGNMENT) | DS_LENGTH, ! # else ! 0 | DS_LENGTH, ! # endif TRUE /* add length to descr */, TRUE }, /* UNCOLLECTABLE */ { &GC_uobjfreelist[0], 0, ! 0 | DS_LENGTH, TRUE /* add length to descr */, TRUE }, # ifdef ATOMIC_UNCOLLECTABLE /* AUNCOLLECTABLE */ { &GC_auobjfreelist[0], 0, ! 0 | DS_LENGTH, FALSE /* add length to descr */, FALSE }, # endif # ifdef STUBBORN_ALLOC /*STUBBORN*/ { &GC_sobjfreelist[0], 0, ! 0 | DS_LENGTH, TRUE /* add length to descr */, TRUE }, # endif }; --- 46,66 ---- /* It's done here, since we need to deal with mark descriptors. */ struct obj_kind GC_obj_kinds[MAXOBJKINDS] = { /* PTRFREE */ { &GC_aobjfreelist[0], 0 /* filled in dynamically */, ! 0 | GC_DS_LENGTH, FALSE, FALSE }, /* NORMAL */ { &GC_objfreelist[0], 0, ! 0 | GC_DS_LENGTH, /* Adjusted in GC_init_inner for EXTRA_BYTES */ TRUE /* add length to descr */, TRUE }, /* UNCOLLECTABLE */ { &GC_uobjfreelist[0], 0, ! 0 | GC_DS_LENGTH, TRUE /* add length to descr */, TRUE }, # ifdef ATOMIC_UNCOLLECTABLE /* AUNCOLLECTABLE */ { &GC_auobjfreelist[0], 0, ! 0 | GC_DS_LENGTH, FALSE /* add length to descr */, FALSE }, # endif # ifdef STUBBORN_ALLOC /*STUBBORN*/ { &GC_sobjfreelist[0], 0, ! 0 | GC_DS_LENGTH, TRUE /* add length to descr */, TRUE }, # endif }; *************** word GC_n_rescuing_pages; /* Number of d *** 104,112 **** mse * GC_mark_stack; word GC_mark_stack_size = 0; ! mse * GC_mark_stack_top; static struct hblk * scan_ptr; --- 100,114 ---- mse * GC_mark_stack; + mse * GC_mark_stack_limit; + word GC_mark_stack_size = 0; ! #ifdef PARALLEL_MARK ! mse * VOLATILE GC_mark_stack_top; ! #else ! mse * GC_mark_stack_top; ! #endif static struct hblk * scan_ptr; *************** GC_bool GC_collection_in_progress() *** 129,135 **** void GC_clear_hdr_marks(hhdr) register hdr * hhdr; { ! BZERO(hhdr -> hb_marks, MARK_BITS_SZ*sizeof(word)); } /* Set all mark bits in the header. Used for uncollectable blocks. */ --- 131,141 ---- void GC_clear_hdr_marks(hhdr) register hdr * hhdr; { ! # ifdef USE_MARK_BYTES ! BZERO(hhdr -> hb_marks, MARK_BITS_SZ); ! # else ! BZERO(hhdr -> hb_marks, MARK_BITS_SZ*sizeof(word)); ! # endif } /* Set all mark bits in the header. Used for uncollectable blocks. */ *************** register hdr * hhdr; *** 139,145 **** --- 145,155 ---- register int i; for (i = 0; i < MARK_BITS_SZ; ++i) { + # ifdef USE_MARK_BYTES + hhdr -> hb_marks[i] = 1; + # else hhdr -> hb_marks[i] = ONES; + # endif } } *************** register hdr * hhdr; *** 147,155 **** * Clear all mark bits associated with block h. */ /*ARGSUSED*/ ! static void clear_marks_for_block(h, dummy) ! struct hblk *h; ! word dummy; { register hdr * hhdr = HDR(h); --- 157,169 ---- * Clear all mark bits associated with block h. */ /*ARGSUSED*/ ! # if defined(__STDC__) || defined(__cplusplus) ! static void clear_marks_for_block(struct hblk *h, word dummy) ! # else ! static void clear_marks_for_block(h, dummy) ! struct hblk *h; ! word dummy; ! # endif { register hdr * hhdr = HDR(h); *************** void GC_initiate_gc() *** 227,235 **** if (GC_dirty_maintained) GC_check_dirty(); } # endif ! # ifdef GATHERSTATS ! GC_n_rescuing_pages = 0; ! # endif if (GC_mark_state == MS_NONE) { GC_mark_state = MS_PUSH_RESCUERS; } else if (GC_mark_state != MS_INVALID) { --- 241,247 ---- if (GC_dirty_maintained) GC_check_dirty(); } # endif ! GC_n_rescuing_pages = 0; if (GC_mark_state == MS_NONE) { GC_mark_state = MS_PUSH_RESCUERS; } else if (GC_mark_state != MS_INVALID) { *************** static void alloc_mark_stack(); *** 252,258 **** GC_bool GC_mark_some(cold_gc_frame) ptr_t cold_gc_frame; { ! #ifdef MSWIN32 /* Windows 98 appears to asynchronously create and remove writable */ /* memory mappings, for reasons we haven't yet understood. Since */ /* we look for writable regions to determine the root set, we may */ --- 264,270 ---- GC_bool GC_mark_some(cold_gc_frame) ptr_t cold_gc_frame; { ! #if defined(MSWIN32) && !defined(__GNUC__) /* Windows 98 appears to asynchronously create and remove writable */ /* memory mappings, for reasons we haven't yet understood. Since */ /* we look for writable regions to determine the root set, we may */ *************** ptr_t cold_gc_frame; *** 262,288 **** /* Note that this code should never generate an incremental GC write */ /* fault. */ __try { ! #endif switch(GC_mark_state) { case MS_NONE: return(FALSE); case MS_PUSH_RESCUERS: if (GC_mark_stack_top ! >= GC_mark_stack + GC_mark_stack_size ! - INITIAL_MARK_STACK_SIZE/2) { /* Go ahead and mark, even though that might cause us to */ /* see more marked dirty objects later on. Avoid this */ /* in the future. */ GC_mark_stack_too_small = TRUE; ! GC_mark_from_mark_stack(); return(FALSE); } else { scan_ptr = GC_push_next_marked_dirty(scan_ptr); if (scan_ptr == 0) { ! # ifdef PRINTSTATS GC_printf1("Marked from %lu dirty pages\n", (unsigned long)GC_n_rescuing_pages); # endif GC_push_roots(FALSE, cold_gc_frame); GC_objects_are_marked = TRUE; --- 274,301 ---- /* Note that this code should never generate an incremental GC write */ /* fault. */ __try { ! #endif /* defined(MSWIN32) && !defined(__GNUC__) */ switch(GC_mark_state) { case MS_NONE: return(FALSE); case MS_PUSH_RESCUERS: if (GC_mark_stack_top ! >= GC_mark_stack_limit - INITIAL_MARK_STACK_SIZE/2) { /* Go ahead and mark, even though that might cause us to */ /* see more marked dirty objects later on. Avoid this */ /* in the future. */ GC_mark_stack_too_small = TRUE; ! MARK_FROM_MARK_STACK(); return(FALSE); } else { scan_ptr = GC_push_next_marked_dirty(scan_ptr); if (scan_ptr == 0) { ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf1("Marked from %lu dirty pages\n", (unsigned long)GC_n_rescuing_pages); + } # endif GC_push_roots(FALSE, cold_gc_frame); GC_objects_are_marked = TRUE; *************** ptr_t cold_gc_frame; *** 295,302 **** case MS_PUSH_UNCOLLECTABLE: if (GC_mark_stack_top ! >= GC_mark_stack + INITIAL_MARK_STACK_SIZE/4) { ! GC_mark_from_mark_stack(); return(FALSE); } else { scan_ptr = GC_push_next_marked_uncollectable(scan_ptr); --- 308,320 ---- case MS_PUSH_UNCOLLECTABLE: if (GC_mark_stack_top ! >= GC_mark_stack + GC_mark_stack_size/4) { ! # ifdef PARALLEL_MARK ! /* Avoid this, since we don't parallelize the marker */ ! /* here. */ ! if (GC_parallel) GC_mark_stack_too_small = TRUE; ! # endif ! MARK_FROM_MARK_STACK(); return(FALSE); } else { scan_ptr = GC_push_next_marked_uncollectable(scan_ptr); *************** ptr_t cold_gc_frame; *** 311,318 **** return(FALSE); case MS_ROOTS_PUSHED: if (GC_mark_stack_top >= GC_mark_stack) { ! GC_mark_from_mark_stack(); return(FALSE); } else { GC_mark_state = MS_NONE; --- 329,360 ---- return(FALSE); case MS_ROOTS_PUSHED: + # ifdef PARALLEL_MARK + /* In the incremental GC case, this currently doesn't */ + /* quite do the right thing, since it runs to */ + /* completion. On the other hand, starting a */ + /* parallel marker is expensive, so perhaps it is */ + /* the right thing? */ + /* Eventually, incremental marking should run */ + /* asynchronously in multiple threads, without grabbing */ + /* the allocation lock. */ + if (GC_parallel) { + GC_do_parallel_mark(); + GC_ASSERT(GC_mark_stack_top < GC_first_nonempty); + GC_mark_stack_top = GC_mark_stack - 1; + if (GC_mark_stack_too_small) { + alloc_mark_stack(2*GC_mark_stack_size); + } + if (GC_mark_state == MS_ROOTS_PUSHED) { + GC_mark_state = MS_NONE; + return(TRUE); + } else { + return(FALSE); + } + } + # endif if (GC_mark_stack_top >= GC_mark_stack) { ! MARK_FROM_MARK_STACK(); return(FALSE); } else { GC_mark_state = MS_NONE; *************** ptr_t cold_gc_frame; *** 329,335 **** return(FALSE); } if (GC_mark_stack_top >= GC_mark_stack) { ! GC_mark_from_mark_stack(); return(FALSE); } if (scan_ptr == 0 && GC_mark_state == MS_INVALID) { --- 371,377 ---- return(FALSE); } if (GC_mark_stack_top >= GC_mark_stack) { ! MARK_FROM_MARK_STACK(); return(FALSE); } if (scan_ptr == 0 && GC_mark_state == MS_INVALID) { *************** ptr_t cold_gc_frame; *** 353,372 **** ABORT("GC_mark_some: bad state"); return(FALSE); } ! #ifdef MSWIN32 } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { ! # ifdef PRINTSTATS GC_printf0("Caught ACCESS_VIOLATION in marker. " "Memory mapping disappeared.\n"); ! # endif /* PRINTSTATS */ /* We have bad roots on the stack. Discard mark stack. */ /* Rescan from marked objects. Redetermine roots. */ GC_invalidate_mark_state(); scan_ptr = 0; return FALSE; } ! #endif /* MSWIN32 */ } --- 395,416 ---- ABORT("GC_mark_some: bad state"); return(FALSE); } ! #if defined(MSWIN32) && !defined(__GNUC__) } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf0("Caught ACCESS_VIOLATION in marker. " "Memory mapping disappeared.\n"); ! } ! # endif /* CONDPRINT */ /* We have bad roots on the stack. Discard mark stack. */ /* Rescan from marked objects. Redetermine roots. */ GC_invalidate_mark_state(); scan_ptr = 0; return FALSE; } ! #endif /* defined(MSWIN32) && !defined(__GNUC__) */ } *************** GC_bool GC_mark_stack_empty() *** 383,409 **** #endif /* Given a pointer to someplace other than a small object page or the */ ! /* first page of a large object, return a pointer either to the */ ! /* start of the large object or NIL. */ ! /* In the latter case black list the address current. */ ! /* Returns NIL without black listing if current points to a block */ ! /* with IGNORE_OFF_PAGE set. */ /*ARGSUSED*/ # ifdef PRINT_BLACK_LIST ! ptr_t GC_find_start(current, hhdr, source) ! word source; # else ! ptr_t GC_find_start(current, hhdr) # define source 0 # endif register ptr_t current; ! register hdr * hhdr; { ! # ifdef ALL_INTERIOR_POINTERS if (hhdr != 0) { register ptr_t orig = current; ! current = (ptr_t)HBLKPTR(current) + HDR_BYTES; do { current = current - HBLKSIZE*(word)hhdr; hhdr = HDR(current); --- 427,454 ---- #endif /* Given a pointer to someplace other than a small object page or the */ ! /* first page of a large object, either: */ ! /* - return a pointer to somewhere in the first page of the large */ ! /* object, if current points to a large object. */ ! /* In this case *hhdr is replaced with a pointer to the header */ ! /* for the large object. */ ! /* - just return current if it does not point to a large object. */ /*ARGSUSED*/ # ifdef PRINT_BLACK_LIST ! ptr_t GC_find_start(current, hhdr, new_hdr_p, source) ! ptr_t source; # else ! ptr_t GC_find_start(current, hhdr, new_hdr_p) # define source 0 # endif register ptr_t current; ! register hdr *hhdr, **new_hdr_p; { ! if (GC_all_interior_pointers) { if (hhdr != 0) { register ptr_t orig = current; ! current = (ptr_t)HBLKPTR(current); do { current = current - HBLKSIZE*(word)hhdr; hhdr = HDR(current); *************** register hdr * hhdr; *** 413,430 **** if ((word *)orig - (word *)current >= (ptrdiff_t)(hhdr->hb_sz)) { /* Pointer past the end of the block */ ! GC_ADD_TO_BLACK_LIST_NORMAL(orig, source); ! return(0); } return(current); } else { ! GC_ADD_TO_BLACK_LIST_NORMAL(current, source); ! return(0); } ! # else ! GC_ADD_TO_BLACK_LIST_NORMAL(current, source); ! return(0); ! # endif # undef source } --- 458,473 ---- if ((word *)orig - (word *)current >= (ptrdiff_t)(hhdr->hb_sz)) { /* Pointer past the end of the block */ ! return(orig); } + *new_hdr_p = hhdr; return(current); } else { ! return(current); } ! } else { ! return(current); ! } # undef source } *************** mse * msp; *** 439,452 **** { GC_mark_state = MS_INVALID; GC_mark_stack_too_small = TRUE; ! # ifdef PRINTSTATS GC_printf1("Mark stack overflow; current size = %lu entries\n", GC_mark_stack_size); ! # endif ! return(msp-INITIAL_MARK_STACK_SIZE/8); } - /* * Mark objects pointed to by the regions described by * mark stack entries between GC_mark_stack and GC_mark_stack_top, --- 482,496 ---- { GC_mark_state = MS_INVALID; GC_mark_stack_too_small = TRUE; ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf1("Mark stack overflow; current size = %lu entries\n", GC_mark_stack_size); ! } ! # endif ! return(msp - GC_MARK_STACK_DISCARDS); } /* * Mark objects pointed to by the regions described by * mark stack entries between GC_mark_stack and GC_mark_stack_top, *************** mse * msp; *** 461,471 **** * encoding, we optionally maintain a cache for the block address to * header mapping, we prefetch when an object is "grayed", etc. */ ! void GC_mark_from_mark_stack() { - mse * GC_mark_stack_reg = GC_mark_stack; - mse * GC_mark_stack_top_reg = GC_mark_stack_top; - mse * mark_stack_limit = &(GC_mark_stack[GC_mark_stack_size]); int credit = HBLKSIZE; /* Remaining credit for marking work */ register word * current_p; /* Pointer to current candidate ptr. */ register word current; /* Candidate pointer. */ --- 505,515 ---- * encoding, we optionally maintain a cache for the block address to * header mapping, we prefetch when an object is "grayed", etc. */ ! mse * GC_mark_from(mark_stack_top, mark_stack, mark_stack_limit) ! mse * mark_stack_top; ! mse * mark_stack; ! mse * mark_stack_limit; { int credit = HBLKSIZE; /* Remaining credit for marking work */ register word * current_p; /* Pointer to current candidate ptr. */ register word current; /* Candidate pointer. */ *************** void GC_mark_from_mark_stack() *** 481,525 **** GC_objects_are_marked = TRUE; INIT_HDR_CACHE; # ifdef OS2 /* Use untweaked version to circumvent compiler problem */ ! while (GC_mark_stack_top_reg >= GC_mark_stack_reg && credit >= 0) { # else ! while ((((ptr_t)GC_mark_stack_top_reg - (ptr_t)GC_mark_stack_reg) | credit) >= 0) { # endif ! current_p = GC_mark_stack_top_reg -> mse_start; ! descr = GC_mark_stack_top_reg -> mse_descr; retry: /* current_p and descr describe the current object. */ ! /* *GC_mark_stack_top_reg is vacant. */ /* The following is 0 only for small objects described by a simple */ /* length descriptor. For many applications this is the common */ /* case, so we try to detect it quickly. */ ! if (descr & ((~(WORDS_TO_BYTES(SPLIT_RANGE_WORDS) - 1)) | DS_TAGS)) { ! word tag = descr & DS_TAGS; switch(tag) { ! case DS_LENGTH: /* Large length. */ /* Process part of the range to avoid pushing too much on the */ /* stack. */ ! GC_mark_stack_top_reg -> mse_start = limit = current_p + SPLIT_RANGE_WORDS-1; ! GC_mark_stack_top_reg -> mse_descr = descr - WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1); /* Make sure that pointers overlapping the two ranges are */ /* considered. */ limit = (word *)((char *)limit + sizeof(word) - ALIGNMENT); break; ! case DS_BITMAP: ! GC_mark_stack_top_reg--; ! descr &= ~DS_TAGS; credit -= WORDS_TO_BYTES(WORDSZ/2); /* guess */ while (descr != 0) { if ((signed_word)descr < 0) { current = *current_p; if ((ptr_t)current >= least_ha && (ptr_t)current < greatest_ha) { PREFETCH(current); ! HC_PUSH_CONTENTS((ptr_t)current, GC_mark_stack_top_reg, mark_stack_limit, current_p, exit1); } } --- 525,586 ---- GC_objects_are_marked = TRUE; INIT_HDR_CACHE; # ifdef OS2 /* Use untweaked version to circumvent compiler problem */ ! while (mark_stack_top >= mark_stack && credit >= 0) { # else ! while ((((ptr_t)mark_stack_top - (ptr_t)mark_stack) | credit) >= 0) { # endif ! current_p = mark_stack_top -> mse_start; ! descr = mark_stack_top -> mse_descr; retry: /* current_p and descr describe the current object. */ ! /* *mark_stack_top is vacant. */ /* The following is 0 only for small objects described by a simple */ /* length descriptor. For many applications this is the common */ /* case, so we try to detect it quickly. */ ! if (descr & ((~(WORDS_TO_BYTES(SPLIT_RANGE_WORDS) - 1)) | GC_DS_TAGS)) { ! word tag = descr & GC_DS_TAGS; switch(tag) { ! case GC_DS_LENGTH: /* Large length. */ /* Process part of the range to avoid pushing too much on the */ /* stack. */ ! GC_ASSERT(descr < GC_greatest_plausible_heap_addr ! - GC_least_plausible_heap_addr); ! # ifdef PARALLEL_MARK ! # define SHARE_BYTES 2048 ! if (descr > SHARE_BYTES && GC_parallel ! && mark_stack_top < mark_stack_limit - 1) { ! int new_size = (descr/2) & ~(sizeof(word)-1); ! mark_stack_top -> mse_start = current_p; ! mark_stack_top -> mse_descr = new_size + sizeof(word); ! /* makes sure we handle */ ! /* misaligned pointers. */ ! mark_stack_top++; ! current_p = (word *) ((char *)current_p + new_size); ! descr -= new_size; ! goto retry; ! } ! # endif /* PARALLEL_MARK */ ! mark_stack_top -> mse_start = limit = current_p + SPLIT_RANGE_WORDS-1; ! mark_stack_top -> mse_descr = descr - WORDS_TO_BYTES(SPLIT_RANGE_WORDS-1); /* Make sure that pointers overlapping the two ranges are */ /* considered. */ limit = (word *)((char *)limit + sizeof(word) - ALIGNMENT); break; ! case GC_DS_BITMAP: ! mark_stack_top--; ! descr &= ~GC_DS_TAGS; credit -= WORDS_TO_BYTES(WORDSZ/2); /* guess */ while (descr != 0) { if ((signed_word)descr < 0) { current = *current_p; if ((ptr_t)current >= least_ha && (ptr_t)current < greatest_ha) { PREFETCH(current); ! HC_PUSH_CONTENTS((ptr_t)current, mark_stack_top, mark_stack_limit, current_p, exit1); } } *************** void GC_mark_from_mark_stack() *** 527,544 **** ++ current_p; } continue; ! case DS_PROC: ! GC_mark_stack_top_reg--; ! credit -= PROC_BYTES; ! GC_mark_stack_top_reg = (*PROC(descr)) ! (current_p, GC_mark_stack_top_reg, mark_stack_limit, ENV(descr)); continue; ! case DS_PER_OBJECT: if ((signed_word)descr >= 0) { /* Descriptor is in the object. */ ! descr = *(word *)((ptr_t)current_p + descr - DS_PER_OBJECT); } else { /* Descriptor is in type descriptor pointed to by first */ /* word in object. */ --- 588,605 ---- ++ current_p; } continue; ! case GC_DS_PROC: ! mark_stack_top--; ! credit -= GC_PROC_BYTES; ! mark_stack_top = (*PROC(descr)) ! (current_p, mark_stack_top, mark_stack_limit, ENV(descr)); continue; ! case GC_DS_PER_OBJECT: if ((signed_word)descr >= 0) { /* Descriptor is in the object. */ ! descr = *(word *)((ptr_t)current_p + descr - GC_DS_PER_OBJECT); } else { /* Descriptor is in type descriptor pointed to by first */ /* word in object. */ *************** void GC_mark_from_mark_stack() *** 552,570 **** /* object case explicitly. */ if (0 == type_descr) { /* Rarely executed. */ ! GC_mark_stack_top_reg--; continue; } descr = *(word *)(type_descr ! - (descr - (DS_PER_OBJECT - INDIR_PER_OBJ_BIAS))); } goto retry; } } else /* Small object with length descriptor */ { ! GC_mark_stack_top_reg--; limit = (word *)(((ptr_t)current_p) + (word)descr); } /* The simple case in which we're scanning a range. */ credit -= (ptr_t)limit - (ptr_t)current_p; limit -= 1; { --- 613,639 ---- /* object case explicitly. */ if (0 == type_descr) { /* Rarely executed. */ ! mark_stack_top--; continue; } descr = *(word *)(type_descr ! - (descr - (GC_DS_PER_OBJECT ! - GC_INDIR_PER_OBJ_BIAS))); ! } ! if (0 == descr) { ! /* Can happen either because we generated a 0 descriptor */ ! /* or we saw a pointer to a free object. */ ! mark_stack_top--; ! continue; } goto retry; } } else /* Small object with length descriptor */ { ! mark_stack_top--; limit = (word *)(((ptr_t)current_p) + (word)descr); } /* The simple case in which we're scanning a range. */ + GC_ASSERT(!((word)current_p & (ALIGNMENT-1))); credit -= (ptr_t)limit - (ptr_t)current_p; limit -= 1; { *************** void GC_mark_from_mark_stack() *** 581,586 **** --- 650,656 ---- /* for this loop is still not great. */ for(;;) { PREFETCH((ptr_t)limit - PREF_DIST*CACHE_LINE_SIZE); + GC_ASSERT(limit >= current_p); deferred = *limit; limit = (word *)((char *)limit - ALIGNMENT); if ((ptr_t)deferred >= least_ha && (ptr_t)deferred < greatest_ha) { *************** void GC_mark_from_mark_stack() *** 610,616 **** /* Prefetch the contents of the object we just pushed. It's */ /* likely we will need them soon. */ PREFETCH(current); ! HC_PUSH_CONTENTS((ptr_t)current, GC_mark_stack_top_reg, mark_stack_limit, current_p, exit2); } current_p = (word *)((char *)current_p + ALIGNMENT); --- 680,686 ---- /* Prefetch the contents of the object we just pushed. It's */ /* likely we will need them soon. */ PREFETCH(current); ! HC_PUSH_CONTENTS((ptr_t)current, mark_stack_top, mark_stack_limit, current_p, exit2); } current_p = (word *)((char *)current_p + ALIGNMENT); *************** void GC_mark_from_mark_stack() *** 620,646 **** /* We still need to mark the entry we previously prefetched. */ /* We alrady know that it passes the preliminary pointer */ /* validity test. */ ! HC_PUSH_CONTENTS((ptr_t)deferred, GC_mark_stack_top_reg, mark_stack_limit, current_p, exit4); next_object:; # endif } } ! GC_mark_stack_top = GC_mark_stack_top_reg; } /* Allocate or reallocate space for mark stack of size s words */ /* May silently fail. */ static void alloc_mark_stack(n) word n; { ! mse * new_stack = (mse *)GC_scratch_alloc(n * sizeof(struct ms_entry)); GC_mark_stack_too_small = FALSE; if (GC_mark_stack_size != 0) { if (new_stack != 0) { word displ = (word)GC_mark_stack & (GC_page_size - 1); ! signed_word size = GC_mark_stack_size * sizeof(struct ms_entry); /* Recycle old space */ if (0 != displ) displ = GC_page_size - displ; --- 690,1028 ---- /* We still need to mark the entry we previously prefetched. */ /* We alrady know that it passes the preliminary pointer */ /* validity test. */ ! HC_PUSH_CONTENTS((ptr_t)deferred, mark_stack_top, mark_stack_limit, current_p, exit4); next_object:; # endif } } ! return mark_stack_top; } + #ifdef PARALLEL_MARK + + /* We assume we have an ANSI C Compiler. */ + GC_bool GC_help_wanted = FALSE; + unsigned GC_helper_count = 0; + unsigned GC_active_count = 0; + mse * VOLATILE GC_first_nonempty; + word GC_mark_no = 0; + + #define LOCAL_MARK_STACK_SIZE HBLKSIZE + /* Under normal circumstances, this is big enough to guarantee */ + /* We don't overflow half of it in a single call to */ + /* GC_mark_from. */ + + + /* Steal mark stack entries starting at mse low into mark stack local */ + /* until we either steal mse high, or we have max entries. */ + /* Return a pointer to the top of the local mark stack. */ + /* *next is replaced by a pointer to the next unscanned mark stack */ + /* entry. */ + mse * GC_steal_mark_stack(mse * low, mse * high, mse * local, + unsigned max, mse **next) + { + mse *p; + mse *top = local - 1; + unsigned i = 0; + + GC_ASSERT(high >= low-1 && high - low + 1 <= GC_mark_stack_size); + for (p = low; p <= high && i <= max; ++p) { + word descr = *(volatile word *) &(p -> mse_descr); + if (descr != 0) { + *(volatile word *) &(p -> mse_descr) = 0; + ++top; + top -> mse_descr = descr; + top -> mse_start = p -> mse_start; + GC_ASSERT( top -> mse_descr & GC_DS_TAGS != GC_DS_LENGTH || + top -> mse_descr < GC_greatest_plausible_heap_addr + - GC_least_plausible_heap_addr); + /* There is no synchronization here. We assume that at */ + /* least one thread will see the original descriptor. */ + /* Otherwise we need a barrier. */ + /* More than one thread may get this entry, but that's only */ + /* a minor performance problem. */ + /* If this is a big object, count it as */ + /* size/256 + 1 objects. */ + ++i; + if ((descr & GC_DS_TAGS) == GC_DS_LENGTH) i += (descr >> 8); + } + } + *next = p; + return top; + } + + /* Copy back a local mark stack. */ + /* low and high are inclusive bounds. */ + void GC_return_mark_stack(mse * low, mse * high) + { + mse * my_top; + mse * my_start; + size_t stack_size; + + if (high < low) return; + stack_size = high - low + 1; + GC_acquire_mark_lock(); + my_top = GC_mark_stack_top; + my_start = my_top + 1; + if (my_start - GC_mark_stack + stack_size > GC_mark_stack_size) { + # ifdef CONDPRINT + if (GC_print_stats) { + GC_printf0("No room to copy back mark stack."); + } + # endif + GC_mark_state = MS_INVALID; + GC_mark_stack_too_small = TRUE; + /* We drop the local mark stack. We'll fix things later. */ + } else { + BCOPY(low, my_start, stack_size * sizeof(mse)); + GC_ASSERT(GC_mark_stack_top = my_top); + # if !defined(IA64) && !defined(HP_PA) + GC_memory_write_barrier(); + # endif + /* On IA64, the volatile write acts as a release barrier. */ + GC_mark_stack_top = my_top + stack_size; + } + GC_release_mark_lock(); + GC_notify_all_marker(); + } + + /* Mark from the local mark stack. */ + /* On return, the local mark stack is empty. */ + /* But this may be achieved by copying the */ + /* local mark stack back into the global one. */ + void GC_do_local_mark(mse *local_mark_stack, mse *local_top) + { + unsigned n; + # define N_LOCAL_ITERS 1 + + # ifdef GC_ASSERTIONS + /* Make sure we don't hold mark lock. */ + GC_acquire_mark_lock(); + GC_release_mark_lock(); + # endif + for (;;) { + for (n = 0; n < N_LOCAL_ITERS; ++n) { + local_top = GC_mark_from(local_top, local_mark_stack, + local_mark_stack + LOCAL_MARK_STACK_SIZE); + if (local_top < local_mark_stack) return; + if (local_top - local_mark_stack >= LOCAL_MARK_STACK_SIZE/2) { + GC_return_mark_stack(local_mark_stack, local_top); + return; + } + } + if (GC_mark_stack_top < GC_first_nonempty && + GC_active_count < GC_helper_count + && local_top > local_mark_stack + 1) { + /* Try to share the load, since the main stack is empty, */ + /* and helper threads are waiting for a refill. */ + /* The entries near the bottom of the stack are likely */ + /* to require more work. Thus we return those, eventhough */ + /* it's harder. */ + mse * p; + mse * new_bottom = local_mark_stack + + (local_top - local_mark_stack)/2; + GC_ASSERT(new_bottom > local_mark_stack + && new_bottom < local_top); + GC_return_mark_stack(local_mark_stack, new_bottom - 1); + memmove(local_mark_stack, new_bottom, + (local_top - new_bottom + 1) * sizeof(mse)); + local_top -= (new_bottom - local_mark_stack); + } + } + } + + #define ENTRIES_TO_GET 5 + + long GC_markers = 2; /* Normally changed by thread-library- */ + /* -specific code. */ + + /* Mark using the local mark stack until the global mark stack is empty */ + /* and there are no active workers. Update GC_first_nonempty to reflect */ + /* progress. */ + /* Caller does not hold mark lock. */ + /* Caller has already incremented GC_helper_count. We decrement it, */ + /* and maintain GC_active_count. */ + void GC_mark_local(mse *local_mark_stack, int id) + { + mse * my_first_nonempty; + + GC_acquire_mark_lock(); + GC_active_count++; + my_first_nonempty = GC_first_nonempty; + GC_ASSERT(GC_first_nonempty >= GC_mark_stack && + GC_first_nonempty <= GC_mark_stack_top + 1); + # ifdef PRINTSTATS + GC_printf1("Starting mark helper %lu\n", (unsigned long)id); + # endif + GC_release_mark_lock(); + for (;;) { + size_t n_on_stack; + size_t n_to_get; + mse *next; + mse * my_top; + mse * local_top; + mse * global_first_nonempty = GC_first_nonempty; + + GC_ASSERT(my_first_nonempty >= GC_mark_stack && + my_first_nonempty <= GC_mark_stack_top + 1); + GC_ASSERT(global_first_nonempty >= GC_mark_stack && + global_first_nonempty <= GC_mark_stack_top + 1); + if (my_first_nonempty < global_first_nonempty) { + my_first_nonempty = global_first_nonempty; + } else if (global_first_nonempty < my_first_nonempty) { + GC_compare_and_exchange((word *)(&GC_first_nonempty), + (word) global_first_nonempty, + (word) my_first_nonempty); + /* If this fails, we just go ahead, without updating */ + /* GC_first_nonempty. */ + } + /* Perhaps we should also update GC_first_nonempty, if it */ + /* is less. But that would require using atomic updates. */ + my_top = GC_mark_stack_top; + n_on_stack = my_top - my_first_nonempty + 1; + if (0 == n_on_stack) { + GC_acquire_mark_lock(); + my_top = GC_mark_stack_top; + n_on_stack = my_top - my_first_nonempty + 1; + if (0 == n_on_stack) { + GC_active_count--; + GC_ASSERT(GC_active_count <= GC_helper_count); + /* Other markers may redeposit objects */ + /* on the stack. */ + if (0 == GC_active_count) GC_notify_all_marker(); + while (GC_active_count > 0 + && GC_first_nonempty > GC_mark_stack_top) { + /* We will be notified if either GC_active_count */ + /* reaches zero, or if more objects are pushed on */ + /* the global mark stack. */ + GC_wait_marker(); + } + if (GC_active_count == 0 && + GC_first_nonempty > GC_mark_stack_top) { + GC_bool need_to_notify = FALSE; + /* The above conditions can't be falsified while we */ + /* hold the mark lock, since neither */ + /* GC_active_count nor GC_mark_stack_top can */ + /* change. GC_first_nonempty can only be */ + /* incremented asynchronously. Thus we know that */ + /* both conditions actually held simultaneously. */ + GC_helper_count--; + if (0 == GC_helper_count) need_to_notify = TRUE; + # ifdef PRINTSTATS + GC_printf1( + "Finished mark helper %lu\n", (unsigned long)id); + # endif + GC_release_mark_lock(); + if (need_to_notify) GC_notify_all_marker(); + return; + } + /* else there's something on the stack again, or */ + /* another helper may push something. */ + GC_active_count++; + GC_ASSERT(GC_active_count > 0); + GC_release_mark_lock(); + continue; + } else { + GC_release_mark_lock(); + } + } + n_to_get = ENTRIES_TO_GET; + if (n_on_stack < 2 * ENTRIES_TO_GET) n_to_get = 1; + local_top = GC_steal_mark_stack(my_first_nonempty, my_top, + local_mark_stack, n_to_get, + &my_first_nonempty); + GC_ASSERT(my_first_nonempty >= GC_mark_stack && + my_first_nonempty <= GC_mark_stack_top + 1); + GC_do_local_mark(local_mark_stack, local_top); + } + } + + /* Perform Parallel mark. */ + /* We hold the GC lock, not the mark lock. */ + /* Currently runs until the mark stack is */ + /* empty. */ + void GC_do_parallel_mark() + { + mse local_mark_stack[LOCAL_MARK_STACK_SIZE]; + mse * local_top; + mse * my_top; + + GC_acquire_mark_lock(); + GC_ASSERT(I_HOLD_LOCK()); + /* This could be a GC_ASSERT, but it seems safer to keep it on */ + /* all the time, especially since it's cheap. */ + if (GC_help_wanted || GC_active_count != 0 || GC_helper_count != 0) + ABORT("Tried to start parallel mark in bad state"); + # ifdef PRINTSTATS + GC_printf1("Starting marking for mark phase number %lu\n", + (unsigned long)GC_mark_no); + # endif + GC_first_nonempty = GC_mark_stack; + GC_active_count = 0; + GC_helper_count = 1; + GC_help_wanted = TRUE; + GC_release_mark_lock(); + GC_notify_all_marker(); + /* Wake up potential helpers. */ + GC_mark_local(local_mark_stack, 0); + GC_acquire_mark_lock(); + GC_help_wanted = FALSE; + /* Done; clean up. */ + while (GC_helper_count > 0) GC_wait_marker(); + /* GC_helper_count cannot be incremented while GC_help_wanted == FALSE */ + # ifdef PRINTSTATS + GC_printf1( + "Finished marking for mark phase number %lu\n", + (unsigned long)GC_mark_no); + # endif + GC_mark_no++; + GC_release_mark_lock(); + GC_notify_all_marker(); + } + + + /* Try to help out the marker, if it's running. */ + /* We do not hold the GC lock, but the requestor does. */ + void GC_help_marker(word my_mark_no) + { + mse local_mark_stack[LOCAL_MARK_STACK_SIZE]; + unsigned my_id; + mse * my_first_nonempty; + + if (!GC_parallel) return; + GC_acquire_mark_lock(); + while (GC_mark_no < my_mark_no + || !GC_help_wanted && GC_mark_no == my_mark_no) { + GC_wait_marker(); + } + my_id = GC_helper_count; + if (GC_mark_no != my_mark_no || my_id >= GC_markers) { + /* Second test is useful only if original threads can also */ + /* act as helpers. Under Linux they can't. */ + GC_release_mark_lock(); + return; + } + GC_helper_count = my_id + 1; + GC_release_mark_lock(); + GC_mark_local(local_mark_stack, my_id); + /* GC_mark_local decrements GC_helper_count. */ + } + + #endif /* PARALLEL_MARK */ + /* Allocate or reallocate space for mark stack of size s words */ /* May silently fail. */ static void alloc_mark_stack(n) word n; { ! mse * new_stack = (mse *)GC_scratch_alloc(n * sizeof(struct GC_ms_entry)); GC_mark_stack_too_small = FALSE; if (GC_mark_stack_size != 0) { if (new_stack != 0) { word displ = (word)GC_mark_stack & (GC_page_size - 1); ! signed_word size = GC_mark_stack_size * sizeof(struct GC_ms_entry); /* Recycle old space */ if (0 != displ) displ = GC_page_size - displ; *************** word n; *** 651,664 **** } GC_mark_stack = new_stack; GC_mark_stack_size = n; ! # ifdef PRINTSTATS GC_printf1("Grew mark stack to %lu frames\n", (unsigned long) GC_mark_stack_size); # endif } else { ! # ifdef PRINTSTATS GC_printf1("Failed to grow mark stack to %lu frames\n", (unsigned long) n); # endif } } else { --- 1033,1051 ---- } GC_mark_stack = new_stack; GC_mark_stack_size = n; ! GC_mark_stack_limit = new_stack + n; ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf1("Grew mark stack to %lu frames\n", (unsigned long) GC_mark_stack_size); + } # endif } else { ! # ifdef CONDPRINT ! if (GC_print_stats) { GC_printf1("Failed to grow mark stack to %lu frames\n", (unsigned long) n); + } # endif } } else { *************** word n; *** 668,673 **** --- 1055,1061 ---- } GC_mark_stack = new_stack; GC_mark_stack_size = n; + GC_mark_stack_limit = new_stack + n; } GC_mark_stack_top = GC_mark_stack-1; } *************** ptr_t top; *** 694,725 **** top = (ptr_t)(((word) top) & ~(ALIGNMENT-1)); if (top == 0 || bottom == top) return; GC_mark_stack_top++; ! if (GC_mark_stack_top >= GC_mark_stack + GC_mark_stack_size) { ABORT("unexpected mark stack overflow"); } length = top - bottom; ! # if DS_TAGS > ALIGNMENT - 1 ! length += DS_TAGS; ! length &= ~DS_TAGS; # endif GC_mark_stack_top -> mse_start = (word *)bottom; GC_mark_stack_top -> mse_descr = length; } /* ! * Analogous to the above, but push only those pages that may have been ! * dirtied. A block h is assumed dirty if dirty_fn(h) != 0. * We use push_fn to actually push the block. * Will not overflow mark stack if push_fn pushes a small fixed number * of entries. (This is invoked only if push_fn pushes a single entry, * or if it marks each object before pushing it, thus ensuring progress * in the event of a stack overflow.) */ ! void GC_push_dirty(bottom, top, dirty_fn, push_fn) ptr_t bottom; ptr_t top; ! int (*dirty_fn)(/* struct hblk * h */); ! void (*push_fn)(/* ptr_t bottom, ptr_t top */); { register struct hblk * h; --- 1082,1114 ---- top = (ptr_t)(((word) top) & ~(ALIGNMENT-1)); if (top == 0 || bottom == top) return; GC_mark_stack_top++; ! if (GC_mark_stack_top >= GC_mark_stack_limit) { ABORT("unexpected mark stack overflow"); } length = top - bottom; ! # if GC_DS_TAGS > ALIGNMENT - 1 ! length += GC_DS_TAGS; ! length &= ~GC_DS_TAGS; # endif GC_mark_stack_top -> mse_start = (word *)bottom; GC_mark_stack_top -> mse_descr = length; } /* ! * Analogous to the above, but push only those pages h with dirty_fn(h) != 0. * We use push_fn to actually push the block. + * Used both to selectively push dirty pages, or to push a block + * in piecemeal fashion, to allow for more marking concurrency. * Will not overflow mark stack if push_fn pushes a small fixed number * of entries. (This is invoked only if push_fn pushes a single entry, * or if it marks each object before pushing it, thus ensuring progress * in the event of a stack overflow.) */ ! void GC_push_selected(bottom, top, dirty_fn, push_fn) ptr_t bottom; ptr_t top; ! int (*dirty_fn) GC_PROTO((struct hblk * h)); ! void (*push_fn) GC_PROTO((ptr_t bottom, ptr_t top)); { register struct hblk * h; *************** void (*push_fn)(/* ptr_t bottom, ptr_t t *** 755,766 **** (*push_fn)((ptr_t)h, top); } } ! if (GC_mark_stack_top >= GC_mark_stack + GC_mark_stack_size) { ABORT("unexpected mark stack overflow"); } } # ifndef SMALL_CONFIG void GC_push_conditional(bottom, top, all) ptr_t bottom; ptr_t top; --- 1144,1166 ---- (*push_fn)((ptr_t)h, top); } } ! if (GC_mark_stack_top >= GC_mark_stack_limit) { ABORT("unexpected mark stack overflow"); } } # ifndef SMALL_CONFIG + + #ifdef PARALLEL_MARK + /* Break up root sections into page size chunks to better spread */ + /* out work. */ + GC_bool GC_true_func(struct hblk *h) { return TRUE; } + # define GC_PUSH_ALL(b,t) GC_push_selected(b,t,GC_true_func,GC_push_all); + #else + # define GC_PUSH_ALL(b,t) GC_push_all(b,t); + #endif + + void GC_push_conditional(bottom, top, all) ptr_t bottom; ptr_t top; *************** int all; *** 770,776 **** if (GC_dirty_maintained) { # ifdef PROC_VDB /* Pages that were never dirtied cannot contain pointers */ ! GC_push_dirty(bottom, top, GC_page_was_ever_dirty, GC_push_all); # else GC_push_all(bottom, top); # endif --- 1170,1176 ---- if (GC_dirty_maintained) { # ifdef PROC_VDB /* Pages that were never dirtied cannot contain pointers */ ! GC_push_selected(bottom, top, GC_page_was_ever_dirty, GC_push_all); # else GC_push_all(bottom, top); # endif *************** int all; *** 778,820 **** GC_push_all(bottom, top); } } else { ! GC_push_dirty(bottom, top, GC_page_was_dirty, GC_push_all); } } #endif ! # ifdef MSWIN32 void __cdecl GC_push_one(p) # else void GC_push_one(p) # endif word p; { - # ifdef NURSERY - if (0 != GC_push_proc) { - GC_push_proc(p); - return; - } - # endif GC_PUSH_ONE_STACK(p, MARKED_FROM_REGISTER); } # ifdef __STDC__ # define BASE(p) (word)GC_base((void *)(p)) # else # define BASE(p) (word)GC_base((char *)(p)) # endif ! /* As above, but argument passed preliminary test. */ # if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS) ! void GC_push_one_checked(p, interior_ptrs, source) ptr_t source; # else ! void GC_push_one_checked(p, interior_ptrs) # define source 0 # endif register word p; - register GC_bool interior_ptrs; { register word r; register hdr * hhdr; --- 1178,1231 ---- GC_push_all(bottom, top); } } else { ! GC_push_selected(bottom, top, GC_page_was_dirty, GC_push_all); } } #endif ! # if defined(MSWIN32) || defined(MSWINCE) void __cdecl GC_push_one(p) # else void GC_push_one(p) # endif word p; { GC_PUSH_ONE_STACK(p, MARKED_FROM_REGISTER); } + struct GC_ms_entry *GC_mark_and_push(obj, mark_stack_ptr, mark_stack_limit, src) + GC_PTR obj; + struct GC_ms_entry * mark_stack_ptr; + struct GC_ms_entry * mark_stack_limit; + GC_PTR *src; + { + PREFETCH(obj); + PUSH_CONTENTS(obj, mark_stack_ptr /* modified */, mark_stack_limit, src, + was_marked /* internally generated exit label */); + return mark_stack_ptr; + } + # ifdef __STDC__ # define BASE(p) (word)GC_base((void *)(p)) # else # define BASE(p) (word)GC_base((char *)(p)) # endif ! /* Mark and push (i.e. gray) a single object p onto the main */ ! /* mark stack. Consider p to be valid if it is an interior */ ! /* pointer. */ ! /* The object p has passed a preliminary pointer validity */ ! /* test, but we do not definitely know whether it is valid. */ ! /* Mark bits are NOT atomically updated. Thus this must be the */ ! /* only thread setting them. */ # if defined(PRINT_BLACK_LIST) || defined(KEEP_BACK_PTRS) ! void GC_mark_and_push_stack(p, source) ptr_t source; # else ! void GC_mark_and_push_stack(p) # define source 0 # endif register word p; { register word r; register hdr * hhdr; *************** register GC_bool interior_ptrs; *** 822,852 **** GET_HDR(p, hhdr); if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { ! if (hhdr != 0 && interior_ptrs) { r = BASE(p); hhdr = HDR(r); displ = BYTES_TO_WORDS(HBLKDISPL(r)); - } else { - hhdr = 0; } } else { register map_entry_type map_entry; displ = HBLKDISPL(p); map_entry = MAP_ENTRY((hhdr -> hb_map), displ); ! if (map_entry == OBJ_INVALID) { ! # ifndef ALL_INTERIOR_POINTERS ! if (interior_ptrs) { r = BASE(p); displ = BYTES_TO_WORDS(HBLKDISPL(r)); if (r == 0) hhdr = 0; ! } else { hhdr = 0; ! } ! # else ! /* map already reflects interior pointers */ ! hhdr = 0; ! # endif } else { displ = BYTES_TO_WORDS(displ); displ -= map_entry; --- 1233,1257 ---- GET_HDR(p, hhdr); if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { ! if (hhdr != 0) { r = BASE(p); hhdr = HDR(r); displ = BYTES_TO_WORDS(HBLKDISPL(r)); } } else { register map_entry_type map_entry; displ = HBLKDISPL(p); map_entry = MAP_ENTRY((hhdr -> hb_map), displ); ! if (map_entry >= MAX_OFFSET) { ! if (map_entry == OFFSET_TOO_BIG || !GC_all_interior_pointers) { r = BASE(p); displ = BYTES_TO_WORDS(HBLKDISPL(r)); if (r == 0) hhdr = 0; ! } else { ! /* Offset invalid, but map reflects interior pointers */ hhdr = 0; ! } } else { displ = BYTES_TO_WORDS(displ); displ -= map_entry; *************** register GC_bool interior_ptrs; *** 856,877 **** /* If hhdr != 0 then r == GC_base(p), only we did it faster. */ /* displ is the word index within the block. */ if (hhdr == 0) { ! if (interior_ptrs) { ! # ifdef PRINT_BLACK_LIST ! GC_add_to_black_list_stack(p, source); ! # else ! GC_add_to_black_list_stack(p); ! # endif ! } else { ! GC_ADD_TO_BLACK_LIST_NORMAL(p, source); ! # undef source /* In case we had to define it. */ ! } } else { if (!mark_bit_from_hdr(hhdr, displ)) { set_mark_bit_from_hdr(hhdr, displ); GC_STORE_BACK_PTR(source, (ptr_t)r); PUSH_OBJ((word *)r, hhdr, GC_mark_stack_top, ! &(GC_mark_stack[GC_mark_stack_size])); } } } --- 1261,1278 ---- /* If hhdr != 0 then r == GC_base(p), only we did it faster. */ /* displ is the word index within the block. */ if (hhdr == 0) { ! # ifdef PRINT_BLACK_LIST ! GC_add_to_black_list_stack(p, source); ! # else ! GC_add_to_black_list_stack(p); ! # endif ! # undef source /* In case we had to define it. */ } else { if (!mark_bit_from_hdr(hhdr, displ)) { set_mark_bit_from_hdr(hhdr, displ); GC_STORE_BACK_PTR(source, (ptr_t)r); PUSH_OBJ((word *)r, hhdr, GC_mark_stack_top, ! GC_mark_stack_limit); } } } *************** ptr_t bottom; *** 965,971 **** ptr_t top; ptr_t cold_gc_frame; { ! # ifdef ALL_INTERIOR_POINTERS # define EAGER_BYTES 1024 /* Push the hot end of the stack eagerly, so that register values */ /* saved inside GC frames are marked before they disappear. */ --- 1366,1372 ---- ptr_t top; ptr_t cold_gc_frame; { ! if (GC_all_interior_pointers) { # define EAGER_BYTES 1024 /* Push the hot end of the stack eagerly, so that register values */ /* saved inside GC frames are marked before they disappear. */ *************** ptr_t cold_gc_frame; *** 975,989 **** return; } # ifdef STACK_GROWS_DOWN - GC_push_all_eager(bottom, cold_gc_frame); GC_push_all(cold_gc_frame - sizeof(ptr_t), top); # else /* STACK_GROWS_UP */ - GC_push_all_eager(cold_gc_frame, top); GC_push_all(bottom, cold_gc_frame + sizeof(ptr_t)); # endif /* STACK_GROWS_UP */ ! # else GC_push_all_eager(bottom, top); ! # endif # ifdef TRACE_BUF GC_add_trace_entry("GC_push_all_stack", bottom, top); # endif --- 1376,1390 ---- return; } # ifdef STACK_GROWS_DOWN GC_push_all(cold_gc_frame - sizeof(ptr_t), top); + GC_push_all_eager(bottom, cold_gc_frame); # else /* STACK_GROWS_UP */ GC_push_all(bottom, cold_gc_frame + sizeof(ptr_t)); + GC_push_all_eager(cold_gc_frame, top); # endif /* STACK_GROWS_UP */ ! } else { GC_push_all_eager(bottom, top); ! } # ifdef TRACE_BUF GC_add_trace_entry("GC_push_all_stack", bottom, top); # endif *************** void GC_push_all_stack(bottom, top) *** 994,1014 **** ptr_t bottom; ptr_t top; { ! # ifdef ALL_INTERIOR_POINTERS GC_push_all(bottom, top); ! # else GC_push_all_eager(bottom, top); ! # endif } ! #ifndef SMALL_CONFIG /* Push all objects reachable from marked objects in the given block */ /* of size 1 objects. */ void GC_push_marked1(h, hhdr) struct hblk *h; register hdr * hhdr; { ! word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p; word *plim; register int i; --- 1395,1415 ---- ptr_t bottom; ptr_t top; { ! if (GC_all_interior_pointers) { GC_push_all(bottom, top); ! } else { GC_push_all_eager(bottom, top); ! } } ! #if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) /* Push all objects reachable from marked objects in the given block */ /* of size 1 objects. */ void GC_push_marked1(h, hhdr) struct hblk *h; register hdr * hhdr; { ! word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p; word *plim; register int i; *************** register hdr * hhdr; *** 1016,1021 **** --- 1417,1426 ---- register word mark_word; register ptr_t greatest_ha = GC_greatest_plausible_heap_addr; register ptr_t least_ha = GC_least_plausible_heap_addr; + register mse * mark_stack_top = GC_mark_stack_top; + register mse * mark_stack_limit = GC_mark_stack_limit; + # define GC_mark_stack_top mark_stack_top + # define GC_mark_stack_limit mark_stack_limit # define GC_greatest_plausible_heap_addr greatest_ha # define GC_least_plausible_heap_addr least_ha *************** register hdr * hhdr; *** 1038,1043 **** --- 1443,1451 ---- } # undef GC_greatest_plausible_heap_addr # undef GC_least_plausible_heap_addr + # undef GC_mark_stack_top + # undef GC_mark_stack_limit + GC_mark_stack_top = mark_stack_top; } *************** void GC_push_marked2(h, hhdr) *** 1049,1055 **** struct hblk *h; register hdr * hhdr; { ! word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p; word *plim; register int i; --- 1457,1463 ---- struct hblk *h; register hdr * hhdr; { ! word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p; word *plim; register int i; *************** register hdr * hhdr; *** 1057,1062 **** --- 1465,1474 ---- register word mark_word; register ptr_t greatest_ha = GC_greatest_plausible_heap_addr; register ptr_t least_ha = GC_least_plausible_heap_addr; + register mse * mark_stack_top = GC_mark_stack_top; + register mse * mark_stack_limit = GC_mark_stack_limit; + # define GC_mark_stack_top mark_stack_top + # define GC_mark_stack_limit mark_stack_limit # define GC_greatest_plausible_heap_addr greatest_ha # define GC_least_plausible_heap_addr least_ha *************** register hdr * hhdr; *** 1081,1086 **** --- 1493,1501 ---- } # undef GC_greatest_plausible_heap_addr # undef GC_least_plausible_heap_addr + # undef GC_mark_stack_top + # undef GC_mark_stack_limit + GC_mark_stack_top = mark_stack_top; } /* Push all objects reachable from marked objects in the given block */ *************** void GC_push_marked4(h, hhdr) *** 1091,1097 **** struct hblk *h; register hdr * hhdr; { ! word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p; word *plim; register int i; --- 1506,1512 ---- struct hblk *h; register hdr * hhdr; { ! word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p; word *plim; register int i; *************** register hdr * hhdr; *** 1099,1104 **** --- 1514,1523 ---- register word mark_word; register ptr_t greatest_ha = GC_greatest_plausible_heap_addr; register ptr_t least_ha = GC_least_plausible_heap_addr; + register mse * mark_stack_top = GC_mark_stack_top; + register mse * mark_stack_limit = GC_mark_stack_limit; + # define GC_mark_stack_top mark_stack_top + # define GC_mark_stack_limit mark_stack_limit # define GC_greatest_plausible_heap_addr greatest_ha # define GC_least_plausible_heap_addr least_ha *************** register hdr * hhdr; *** 1127,1132 **** --- 1546,1554 ---- } # undef GC_greatest_plausible_heap_addr # undef GC_least_plausible_heap_addr + # undef GC_mark_stack_top + # undef GC_mark_stack_limit + GC_mark_stack_top = mark_stack_top; } #endif /* UNALIGNED */ *************** register hdr * hhdr; *** 1144,1171 **** register int word_no; register word * lim; register mse * GC_mark_stack_top_reg; ! register mse * mark_stack_limit = &(GC_mark_stack[GC_mark_stack_size]); /* Some quick shortcuts: */ ! if ((0 | DS_LENGTH) == descr) return; if (GC_block_empty(hhdr)/* nothing marked */) return; ! # ifdef GATHERSTATS ! GC_n_rescuing_pages++; ! # endif GC_objects_are_marked = TRUE; if (sz > MAXOBJSZ) { ! lim = (word *)h + HDR_WORDS; } else { lim = (word *)(h + 1) - sz; } switch(sz) { ! # if !defined(SMALL_CONFIG) case 1: GC_push_marked1(h, hhdr); break; # endif ! # if !defined(SMALL_CONFIG) && !defined(UNALIGNED) case 2: GC_push_marked2(h, hhdr); break; --- 1566,1592 ---- register int word_no; register word * lim; register mse * GC_mark_stack_top_reg; ! register mse * mark_stack_limit = GC_mark_stack_limit; /* Some quick shortcuts: */ ! if ((0 | GC_DS_LENGTH) == descr) return; if (GC_block_empty(hhdr)/* nothing marked */) return; ! GC_n_rescuing_pages++; GC_objects_are_marked = TRUE; if (sz > MAXOBJSZ) { ! lim = (word *)h; } else { lim = (word *)(h + 1) - sz; } switch(sz) { ! # if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) case 1: GC_push_marked1(h, hhdr); break; # endif ! # if !defined(SMALL_CONFIG) && !defined(UNALIGNED) && \ ! !defined(USE_MARK_BYTES) case 2: GC_push_marked2(h, hhdr); break; *************** register hdr * hhdr; *** 1175,1182 **** # endif default: GC_mark_stack_top_reg = GC_mark_stack_top; ! for (p = (word *)h + HDR_WORDS, word_no = HDR_WORDS; p <= lim; ! p += sz, word_no += sz) { if (mark_bit_from_hdr(hhdr, word_no)) { /* Mark from fields inside the object */ PUSH_OBJ((word *)p, hhdr, GC_mark_stack_top_reg, mark_stack_limit); --- 1596,1602 ---- # endif default: GC_mark_stack_top_reg = GC_mark_stack_top; ! for (p = (word *)h, word_no = 0; p <= lim; p += sz, word_no += sz) { if (mark_bit_from_hdr(hhdr, word_no)) { /* Mark from fields inside the object */ PUSH_OBJ((word *)p, hhdr, GC_mark_stack_top_reg, mark_stack_limit); *************** register hdr * hhdr; *** 1203,1209 **** return(GC_page_was_dirty(h)); } else { register ptr_t p = (ptr_t)h; - sz += HDR_WORDS; sz = WORDS_TO_BYTES(sz); while (p < (ptr_t)h + sz) { if (GC_page_was_dirty((struct hblk *)p)) return(TRUE); --- 1623,1628 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/mark_rts.c gcc-3.1/boehm-gc/mark_rts.c *** gcc-3.0.4/boehm-gc/mark_rts.c Wed Apr 19 10:09:58 2000 --- gcc-3.1/boehm-gc/mark_rts.c Tue Feb 12 04:37:53 2002 *************** *** 11,19 **** * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ - /* Boehm, October 9, 1995 1:06 pm PDT */ # include ! # include "gc_priv.h" /* Data structure for list of root sets. */ /* We keep a hash table, so that we can filter out duplicate additions. */ --- 11,18 ---- * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ # include ! # include "private/gc_priv.h" /* Data structure for list of root sets. */ /* We keep a hash table, so that we can filter out duplicate additions. */ *************** *** 23,29 **** struct roots { ptr_t r_start; ptr_t r_end; ! # ifndef MSWIN32 struct roots * r_next; # endif GC_bool r_tmp; --- 22,28 ---- struct roots { ptr_t r_start; ptr_t r_end; ! # if !defined(MSWIN32) && !defined(MSWINCE) struct roots * r_next; # endif GC_bool r_tmp; *************** struct roots { *** 33,38 **** --- 32,39 ---- struct roots GC_static_roots[MAX_ROOT_SETS]; */ + int GC_no_dls = 0; /* Register dynamic library data segments. */ + static int n_root_sets = 0; /* GC_static_roots[0..n_root_sets) contains the valid root sets. */ *************** void GC_print_static_roots() *** 69,79 **** GC_bool GC_is_static_root(p) ptr_t p; { ! static int last_root_set = 0; register int i; ! if (p >= GC_static_roots[last_root_set].r_start && p < GC_static_roots[last_root_set].r_end) return(TRUE); for (i = 0; i < n_root_sets; i++) { if (p >= GC_static_roots[i].r_start --- 70,81 ---- GC_bool GC_is_static_root(p) ptr_t p; { ! static int last_root_set = MAX_ROOT_SETS; register int i; ! if (last_root_set < n_root_sets ! && p >= GC_static_roots[last_root_set].r_start && p < GC_static_roots[last_root_set].r_end) return(TRUE); for (i = 0; i < n_root_sets; i++) { if (p >= GC_static_roots[i].r_start *************** ptr_t p; *** 85,91 **** return(FALSE); } ! #ifndef MSWIN32 /* # define LOG_RT_SIZE 6 # define RT_SIZE (1 << LOG_RT_SIZE) -- Power of 2, may be != MAX_ROOT_SETS --- 87,93 ---- return(FALSE); } ! #if !defined(MSWIN32) && !defined(MSWINCE) /* # define LOG_RT_SIZE 6 # define RT_SIZE (1 << LOG_RT_SIZE) -- Power of 2, may be != MAX_ROOT_SETS *************** struct roots *p; *** 137,143 **** GC_root_index[h] = p; } ! # else /* MSWIN32 */ # define add_roots_to_index(p) --- 139,145 ---- GC_root_index[h] = p; } ! # else /* MSWIN32 || MSWINCE */ # define add_roots_to_index(p) *************** GC_bool tmp; *** 173,179 **** { struct roots * old; ! # ifdef MSWIN32 /* Spend the time to ensure that there are no overlapping */ /* or adjacent intervals. */ /* This could be done faster with e.g. a */ --- 175,181 ---- { struct roots * old; ! # if defined(MSWIN32) || defined(MSWINCE) /* Spend the time to ensure that there are no overlapping */ /* or adjacent intervals. */ /* This could be done faster with e.g. a */ *************** GC_bool tmp; *** 242,248 **** GC_static_roots[n_root_sets].r_start = (ptr_t)b; GC_static_roots[n_root_sets].r_end = (ptr_t)e; GC_static_roots[n_root_sets].r_tmp = tmp; ! # ifndef MSWIN32 GC_static_roots[n_root_sets].r_next = 0; # endif add_roots_to_index(GC_static_roots + n_root_sets); --- 244,250 ---- GC_static_roots[n_root_sets].r_start = (ptr_t)b; GC_static_roots[n_root_sets].r_end = (ptr_t)e; GC_static_roots[n_root_sets].r_tmp = tmp; ! # if !defined(MSWIN32) && !defined(MSWINCE) GC_static_roots[n_root_sets].r_next = 0; # endif add_roots_to_index(GC_static_roots + n_root_sets); *************** GC_bool tmp; *** 250,264 **** n_root_sets++; } void GC_clear_roots GC_PROTO((void)) { DCL_LOCK_STATE; DISABLE_SIGNALS(); LOCK(); n_root_sets = 0; GC_root_size = 0; ! # ifndef MSWIN32 { register int i; --- 252,269 ---- n_root_sets++; } + static GC_bool roots_were_cleared = FALSE; + void GC_clear_roots GC_PROTO((void)) { DCL_LOCK_STATE; DISABLE_SIGNALS(); LOCK(); + roots_were_cleared = TRUE; n_root_sets = 0; GC_root_size = 0; ! # if !defined(MSWIN32) && !defined(MSWINCE) { register int i; *************** void GC_remove_tmp_roots() *** 286,292 **** i++; } } ! # ifndef MSWIN32 { register int i; --- 291,297 ---- i++; } } ! # if !defined(MSWIN32) && !defined(MSWINCE) { register int i; *************** void GC_remove_tmp_roots() *** 298,308 **** } ptr_t GC_approx_sp() { word dummy; ! return((ptr_t)(&dummy)); } /* --- 303,343 ---- } + #if defined(MSWIN32) || defined(_WIN32_WCE_EMULATION) + /* Workaround for the OS mapping and unmapping behind our back: */ + /* Is the address p in one of the temporary static root sections? */ + GC_bool GC_is_tmp_root(p) + ptr_t p; + { + static int last_root_set = MAX_ROOT_SETS; + register int i; + + if (last_root_set < n_root_sets + && p >= GC_static_roots[last_root_set].r_start + && p < GC_static_roots[last_root_set].r_end) + return GC_static_roots[last_root_set].r_tmp; + for (i = 0; i < n_root_sets; i++) { + if (p >= GC_static_roots[i].r_start + && p < GC_static_roots[i].r_end) { + last_root_set = i; + return GC_static_roots[i].r_tmp; + } + } + return(FALSE); + } + #endif /* MSWIN32 || _WIN32_WCE_EMULATION */ + ptr_t GC_approx_sp() { word dummy; ! ! # ifdef _MSC_VER ! # pragma warning(disable:4172) ! # endif return((ptr_t)(&dummy)); + # ifdef _MSC_VER + # pragma warning(default:4172) + # endif } /* *************** ptr_t cold_gc_frame; *** 432,446 **** /* Previously set to backing store pointer. */ ptr_t bsp = (ptr_t) GC_save_regs_ret_val; ptr_t cold_gc_bs_pointer; ! # ifdef ALL_INTERIOR_POINTERS cold_gc_bs_pointer = bsp - 2048; if (cold_gc_bs_pointer < BACKING_STORE_BASE) { cold_gc_bs_pointer = BACKING_STORE_BASE; } ! GC_push_all(BACKING_STORE_BASE, cold_gc_bs_pointer); ! # else cold_gc_bs_pointer = BACKING_STORE_BASE; ! # endif GC_push_all_eager(cold_gc_bs_pointer, bsp); /* All values should be sufficiently aligned that we */ /* dont have to worry about the boundary. */ --- 467,482 ---- /* Previously set to backing store pointer. */ ptr_t bsp = (ptr_t) GC_save_regs_ret_val; ptr_t cold_gc_bs_pointer; ! if (GC_all_interior_pointers) { cold_gc_bs_pointer = bsp - 2048; if (cold_gc_bs_pointer < BACKING_STORE_BASE) { cold_gc_bs_pointer = BACKING_STORE_BASE; + } else { + GC_push_all_stack(BACKING_STORE_BASE, cold_gc_bs_pointer); } ! } else { cold_gc_bs_pointer = BACKING_STORE_BASE; ! } GC_push_all_eager(cold_gc_bs_pointer, bsp); /* All values should be sufficiently aligned that we */ /* dont have to worry about the boundary. */ *************** ptr_t cold_gc_frame; *** 454,459 **** --- 490,512 ---- } /* + * Push GC internal roots. Only called if there is some reason to believe + * these would not otherwise get registered. + */ + void GC_push_gc_structures GC_PROTO((void)) + { + GC_push_finalizer_structures(); + GC_push_stubborn_structures(); + # if defined(THREADS) + GC_push_thread_structures(); + # endif + } + + #ifdef THREAD_LOCAL_ALLOC + void GC_mark_thread_local_free_lists(); + #endif + + /* * Call the mark routines (GC_tl_push for a single pointer, GC_push_conditional * on groups of pointers) on every top level accessible pointer. * If all is FALSE, arrange to push only possibly altered values. *************** ptr_t cold_gc_frame; *** 469,493 **** register int i; /* - * push registers - i.e., call GC_push_one(r) for each - * register contents r. - */ - # ifdef USE_GENERIC_PUSH_REGS - GC_generic_push_regs(cold_gc_frame); - # else - GC_push_regs(); /* usually defined in machine_dep.c */ - # endif - - /* * Next push static data. This must happen early on, since it's * not robust against mark stack overflow. */ /* Reregister dynamic libraries, in case one got added. */ ! # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(PCR)) \ ! && !defined(SRC_M3) GC_remove_tmp_roots(); ! GC_register_dynamic_libraries(); # endif /* Mark everything in static data areas */ for (i = 0; i < n_root_sets; i++) { GC_push_conditional_with_exclusions( --- 522,539 ---- register int i; /* * Next push static data. This must happen early on, since it's * not robust against mark stack overflow. */ /* Reregister dynamic libraries, in case one got added. */ ! # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(MSWINCE) \ ! || defined(PCR)) && !defined(SRC_M3) GC_remove_tmp_roots(); ! if (!GC_no_dls) GC_register_dynamic_libraries(); ! # else ! GC_no_dls = TRUE; # endif + /* Mark everything in static data areas */ for (i = 0; i < n_root_sets; i++) { GC_push_conditional_with_exclusions( *************** ptr_t cold_gc_frame; *** 495,514 **** GC_static_roots[i].r_end, all); } /* ! * Now traverse stacks. */ ! # if !defined(USE_GENERIC_PUSH_REGS) GC_push_current_stack(cold_gc_frame); ! /* IN the threads case, this only pushes collector frames. */ ! /* In the USE_GENERIC_PUSH_REGS case, this is done inside */ ! /* GC_push_regs, so that we catch callee-save registers saved */ ! /* inside the GC_push_regs frame. */ ! /* In the case of linux threads on Ia64, the hot section of */ /* the main stack is marked here, but the register stack */ /* backing store is handled in the threads-specific code. */ # endif if (GC_push_other_roots != 0) (*GC_push_other_roots)(); /* In the threads case, this also pushes thread stacks. */ } --- 541,583 ---- GC_static_roots[i].r_end, all); } + /* Mark from GC internal roots if those might otherwise have */ + /* been excluded. */ + if (GC_no_dls || roots_were_cleared) { + GC_push_gc_structures(); + } + + /* Mark thread local free lists, even if their mark */ + /* descriptor excludes the link field. */ + # ifdef THREAD_LOCAL_ALLOC + GC_mark_thread_local_free_lists(); + # endif + /* ! * Now traverse stacks, and mark from register contents. ! * These must be done last, since they can legitimately overflow ! * the mark stack. */ ! # ifdef USE_GENERIC_PUSH_REGS ! GC_generic_push_regs(cold_gc_frame); ! /* Also pushes stack, so that we catch callee-save registers */ ! /* saved inside the GC_push_regs frame. */ ! # else ! /* ! * push registers - i.e., call GC_push_one(r) for each ! * register contents r. ! */ ! GC_push_regs(); /* usually defined in machine_dep.c */ GC_push_current_stack(cold_gc_frame); ! /* In the threads case, this only pushes collector frames. */ ! /* In the case of linux threads on IA64, the hot section of */ /* the main stack is marked here, but the register stack */ /* backing store is handled in the threads-specific code. */ # endif if (GC_push_other_roots != 0) (*GC_push_other_roots)(); /* In the threads case, this also pushes thread stacks. */ + /* Note that without interior pointer recognition lots */ + /* of stuff may have been pushed already, and this */ + /* should be careful about mark stack overflows. */ } diff -Nrc3pad gcc-3.0.4/boehm-gc/mips_sgi_mach_dep.S gcc-3.1/boehm-gc/mips_sgi_mach_dep.S *** gcc-3.0.4/boehm-gc/mips_sgi_mach_dep.S Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/mips_sgi_mach_dep.S Wed Feb 13 05:38:39 2002 *************** *** 0 **** --- 1,41 ---- + #include + #include + + # define call_push(x) move $4,x; jal GC_push_one + + .option pic2 + .text + /* Mark from machine registers that are saved by C compiler */ + # define FRAMESZ 32 + # define RAOFF FRAMESZ-SZREG + # define GPOFF FRAMESZ-(2*SZREG) + NESTED(GC_push_regs, FRAMESZ, ra) + .mask 0x80000000,-SZREG # inform debugger of saved ra loc + move t0,gp + SETUP_GPX(t8) + PTR_SUBU sp,FRAMESZ + # ifdef SETUP_GP64 + SETUP_GP64(GPOFF, GC_push_regs) + # endif + SAVE_GP(GPOFF) + REG_S ra,RAOFF(sp) + # if (_MIPS_SIM == _MIPS_SIM_ABI32) + call_push($2) + call_push($3) + # endif + call_push($16) + call_push($17) + call_push($18) + call_push($19) + call_push($20) + call_push($21) + call_push($22) + call_push($23) + call_push($30) + REG_L ra,RAOFF(sp) + # ifdef RESTORE_GP64 + RESTORE_GP64 + # endif + PTR_ADDU sp,FRAMESZ + j ra + .end GC_push_regs diff -Nrc3pad gcc-3.0.4/boehm-gc/mips_sgi_mach_dep.s gcc-3.1/boehm-gc/mips_sgi_mach_dep.s *** gcc-3.0.4/boehm-gc/mips_sgi_mach_dep.s Sat Jul 31 23:50:05 1999 --- gcc-3.1/boehm-gc/mips_sgi_mach_dep.s Thu Jan 1 00:00:00 1970 *************** *** 1,41 **** - #include - #include - - # define call_push(x) move $4,x; jal GC_push_one - - .option pic2 - .text - /* Mark from machine registers that are saved by C compiler */ - # define FRAMESZ 32 - # define RAOFF FRAMESZ-SZREG - # define GPOFF FRAMESZ-(2*SZREG) - NESTED(GC_push_regs, FRAMESZ, ra) - .mask 0x80000000,-SZREG # inform debugger of saved ra loc - move t0,gp - SETUP_GPX(t8) - PTR_SUBU sp,FRAMESZ - # ifdef SETUP_GP64 - SETUP_GP64(GPOFF, GC_push_regs) - # endif - SAVE_GP(GPOFF) - REG_S ra,RAOFF(sp) - # if (_MIPS_SIM == _MIPS_SIM_ABI32) - call_push($2) - call_push($3) - # endif - call_push($16) - call_push($17) - call_push($18) - call_push($19) - call_push($20) - call_push($21) - call_push($22) - call_push($23) - call_push($30) - REG_L ra,RAOFF(sp) - # ifdef RESTORE_GP64 - RESTORE_GP64 - # endif - PTR_ADDU sp,FRAMESZ - j ra - .end GC_push_regs --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/misc.c gcc-3.1/boehm-gc/misc.c *** gcc-3.0.4/boehm-gc/misc.c Wed Apr 18 04:50:57 2001 --- gcc-3.1/boehm-gc/misc.c Tue Apr 9 00:03:24 2002 *************** *** 1,6 **** --- 1,7 ---- /* * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 1999-2001 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 15,30 **** #include #include #define I_HIDE_POINTERS /* To make GC_call_with_alloc_lock visible */ ! #include "gc_priv.h" ! #ifdef SOLARIS_THREADS # include #endif ! #ifdef MSWIN32 # include #endif # ifdef THREADS --- 16,37 ---- #include + #include + #ifndef _WIN32_WCE #include + #endif #define I_HIDE_POINTERS /* To make GC_call_with_alloc_lock visible */ ! #include "private/gc_pmark.h" ! #ifdef GC_SOLARIS_THREADS # include #endif ! #if defined(MSWIN32) || defined(MSWINCE) ! # define WIN32_LEAN_AND_MEAN ! # define NOSERVICE # include + # include #endif # ifdef THREADS *************** *** 36,57 **** /* Critical section counter is defined in the M3 runtime */ /* That's all we use. */ # else ! # ifdef SOLARIS_THREADS mutex_t GC_allocate_ml; /* Implicitly initialized. */ # else ! # ifdef WIN32_THREADS ! GC_API CRITICAL_SECTION GC_allocate_ml; ! # else ! # if defined(IRIX_THREADS) || defined(IRIX_JDK_THREADS) \ ! || (defined(LINUX_THREADS) && defined(USE_SPIN_LOCK)) ! pthread_t GC_lock_holder = NO_THREAD; # else ! # if defined(HPUX_THREADS) \ ! || defined(LINUX_THREADS) && !defined(USE_SPIN_LOCK) pthread_mutex_t GC_allocate_ml = PTHREAD_MUTEX_INITIALIZER; ! # else --> declare allocator lock here - # endif # endif # endif # endif --- 43,69 ---- /* Critical section counter is defined in the M3 runtime */ /* That's all we use. */ # else ! # ifdef GC_SOLARIS_THREADS mutex_t GC_allocate_ml; /* Implicitly initialized. */ # else ! # ifdef GC_WIN32_THREADS ! # if !defined(GC_NOT_DLL) && (defined(_DLL) || defined(GC_DLL)) ! __declspec(dllexport) CRITICAL_SECTION GC_allocate_ml; # else ! CRITICAL_SECTION GC_allocate_ml; ! # endif ! # else ! # if defined(GC_PTHREADS) && !defined(GC_SOLARIS_THREADS) ! # if defined(USE_SPIN_LOCK) ! pthread_t GC_lock_holder = NO_THREAD; ! # else pthread_mutex_t GC_allocate_ml = PTHREAD_MUTEX_INITIALIZER; ! pthread_t GC_lock_holder = NO_THREAD; ! /* Used only for assertions, and to prevent */ ! /* recursive reentry in the system call wrapper. */ ! # endif ! # else --> declare allocator lock here # endif # endif # endif *************** *** 59,65 **** # endif # endif ! #ifdef ECOS #undef STACKBASE #endif --- 71,77 ---- # endif # endif ! #if defined(NOSYS) || defined(ECOS) #undef STACKBASE #endif *************** GC_FAR struct _GC_arrays GC_arrays /* = *** 69,90 **** GC_bool GC_debugging_started = FALSE; /* defined here so we don't have to load debug_malloc.o */ ! void (*GC_check_heap)() = (void (*)())0; ! void (*GC_start_call_back)() = (void (*)())0; ptr_t GC_stackbottom = 0; GC_bool GC_dont_gc = 0; GC_bool GC_quiet = 0; #ifdef FIND_LEAK int GC_find_leak = 1; #else int GC_find_leak = 0; #endif /*ARGSUSED*/ GC_PTR GC_default_oom_fn GC_PROTO((size_t bytes_requested)) { --- 81,124 ---- GC_bool GC_debugging_started = FALSE; /* defined here so we don't have to load debug_malloc.o */ ! void (*GC_check_heap) GC_PROTO((void)) = (void (*) GC_PROTO((void)))0; ! void (*GC_start_call_back) GC_PROTO((void)) = (void (*) GC_PROTO((void)))0; ptr_t GC_stackbottom = 0; + #ifdef IA64 + ptr_t GC_register_stackbottom = 0; + #endif + GC_bool GC_dont_gc = 0; + GC_bool GC_dont_precollect = 0; + GC_bool GC_quiet = 0; + GC_bool GC_print_stats = 0; + + GC_bool GC_print_back_height = 0; + #ifdef FIND_LEAK int GC_find_leak = 1; #else int GC_find_leak = 0; #endif + #ifdef ALL_INTERIOR_POINTERS + int GC_all_interior_pointers = 1; + #else + int GC_all_interior_pointers = 0; + #endif + + long GC_large_alloc_warn_interval = 5; + /* Interval between unsuppressed warnings. */ + + long GC_large_alloc_warn_suppressed = 0; + /* Number of warnings suppressed so far. */ + /*ARGSUSED*/ GC_PTR GC_default_oom_fn GC_PROTO((size_t bytes_requested)) { *************** extern signed_word GC_mem_found; *** 107,115 **** { register unsigned i; ! /* Map size 0 to something bigger. */ ! /* This avoids problems at lower levels. */ ! /* One word objects don't have to be 2 word aligned. */ for (i = 0; i < sizeof(word); i++) { GC_size_map[i] = MIN_WORDS; } --- 141,150 ---- { register unsigned i; ! /* Map size 0 to something bigger. */ ! /* This avoids problems at lower levels. */ ! /* One word objects don't have to be 2 word aligned, */ ! /* unless we're using mark bytes. */ for (i = 0; i < sizeof(word); i++) { GC_size_map[i] = MIN_WORDS; } *************** extern signed_word GC_mem_found; *** 119,129 **** GC_size_map[sizeof(word)] = ROUNDED_UP_WORDS(sizeof(word)); # endif for (i = sizeof(word) + 1; i <= 8 * sizeof(word); i++) { ! # ifdef ALIGN_DOUBLE ! GC_size_map[i] = (ROUNDED_UP_WORDS(i) + 1) & (~1); ! # else ! GC_size_map[i] = ROUNDED_UP_WORDS(i); ! # endif } for (i = 8*sizeof(word) + 1; i <= 16 * sizeof(word); i++) { GC_size_map[i] = (ROUNDED_UP_WORDS(i) + 1) & (~1); --- 154,160 ---- GC_size_map[sizeof(word)] = ROUNDED_UP_WORDS(sizeof(word)); # endif for (i = sizeof(word) + 1; i <= 8 * sizeof(word); i++) { ! GC_size_map[i] = ALIGNED_WORDS(i); } for (i = 8*sizeof(word) + 1; i <= 16 * sizeof(word); i++) { GC_size_map[i] = (ROUNDED_UP_WORDS(i) + 1) & (~1); *************** extern signed_word GC_mem_found; *** 186,195 **** # endif } byte_sz = WORDS_TO_BYTES(word_sz); ! # ifdef ADD_BYTE_AT_END /* We need one extra byte; don't fill in GC_size_map[byte_sz] */ byte_sz--; ! # endif for (j = low_limit; j <= byte_sz; j++) GC_size_map[j] = word_sz; } --- 217,226 ---- # endif } byte_sz = WORDS_TO_BYTES(word_sz); ! if (GC_all_interior_pointers) { /* We need one extra byte; don't fill in GC_size_map[byte_sz] */ byte_sz--; ! } for (j = low_limit; j <= byte_sz; j++) GC_size_map[j] = word_sz; } *************** extern signed_word GC_mem_found; *** 206,244 **** */ word GC_stack_last_cleared = 0; /* GC_no when we last did this */ # ifdef THREADS ! # define CLEAR_SIZE 512 ! # else ! # define CLEAR_SIZE 213 # endif # define DEGRADE_RATE 50 word GC_min_sp; /* Coolest stack pointer value from which we've */ /* already cleared the stack. */ - # ifdef STACK_GROWS_DOWN - # define COOLER_THAN > - # define HOTTER_THAN < - # define MAKE_COOLER(x,y) if ((word)(x)+(y) > (word)(x)) {(x) += (y);} \ - else {(x) = (word)ONES;} - # define MAKE_HOTTER(x,y) (x) -= (y) - # else - # define COOLER_THAN < - # define HOTTER_THAN > - # define MAKE_COOLER(x,y) if ((word)(x)-(y) < (word)(x)) {(x) -= (y);} else {(x) = 0;} - # define MAKE_HOTTER(x,y) (x) += (y) - # endif - word GC_high_water; /* "hottest" stack pointer value we have seen */ /* recently. Degrades over time. */ word GC_words_allocd_at_reset; ! #if defined(ASM_CLEAR_CODE) && !defined(THREADS) extern ptr_t GC_clear_stack_inner(); ! #endif ! ! #if !defined(ASM_CLEAR_CODE) && !defined(THREADS) /* Clear the stack up to about limit. Return arg. */ /*ARGSUSED*/ ptr_t GC_clear_stack_inner(arg, limit) --- 237,260 ---- */ word GC_stack_last_cleared = 0; /* GC_no when we last did this */ # ifdef THREADS ! # define BIG_CLEAR_SIZE 2048 /* Clear this much now and then. */ ! # define SMALL_CLEAR_SIZE 256 /* Clear this much every time. */ # endif + # define CLEAR_SIZE 213 /* Granularity for GC_clear_stack_inner */ # define DEGRADE_RATE 50 word GC_min_sp; /* Coolest stack pointer value from which we've */ /* already cleared the stack. */ word GC_high_water; /* "hottest" stack pointer value we have seen */ /* recently. Degrades over time. */ word GC_words_allocd_at_reset; ! #if defined(ASM_CLEAR_CODE) extern ptr_t GC_clear_stack_inner(); ! #else /* Clear the stack up to about limit. Return arg. */ /*ARGSUSED*/ ptr_t GC_clear_stack_inner(arg, limit) *************** ptr_t arg; *** 266,275 **** { register word sp = (word)GC_approx_sp(); /* Hotter than actual sp */ # ifdef THREADS ! word dummy[CLEAR_SIZE]; ! # else ! register word limit; # endif # define SLOP 400 /* Extra bytes we clear every time. This clears our own */ --- 282,294 ---- { register word sp = (word)GC_approx_sp(); /* Hotter than actual sp */ # ifdef THREADS ! word dummy[SMALL_CLEAR_SIZE]; ! static unsigned random_no = 0; ! /* Should be more random than it is ... */ ! /* Used to occasionally clear a bigger */ ! /* chunk. */ # endif + register word limit; # define SLOP 400 /* Extra bytes we clear every time. This clears our own */ *************** ptr_t arg; *** 287,293 **** /* thus more junk remains accessible, thus the heap gets */ /* larger ... */ # ifdef THREADS ! BZERO(dummy, CLEAR_SIZE*sizeof(word)); # else if (GC_gc_no > GC_stack_last_cleared) { /* Start things over, so we clear the entire stack again */ --- 306,321 ---- /* thus more junk remains accessible, thus the heap gets */ /* larger ... */ # ifdef THREADS ! if (++random_no % 13 == 0) { ! limit = sp; ! MAKE_HOTTER(limit, BIG_CLEAR_SIZE*sizeof(word)); ! limit &= ~0xf; /* Make it sufficiently aligned for assembly */ ! /* implementations of GC_clear_stack_inner. */ ! return GC_clear_stack_inner(arg, limit); ! } else { ! BZERO(dummy, SMALL_CLEAR_SIZE*sizeof(word)); ! return arg; ! } # else if (GC_gc_no > GC_stack_last_cleared) { /* Start things over, so we clear the entire stack again */ *************** ptr_t arg; *** 317,324 **** if (GC_min_sp HOTTER_THAN GC_high_water) GC_min_sp = GC_high_water; GC_words_allocd_at_reset = GC_words_allocd; } # endif - return(arg); } --- 345,352 ---- if (GC_min_sp HOTTER_THAN GC_high_water) GC_min_sp = GC_high_water; GC_words_allocd_at_reset = GC_words_allocd; } + return(arg); # endif } *************** ptr_t arg; *** 347,383 **** /* to the beginning. */ while (IS_FORWARDING_ADDR_OR_NIL(candidate_hdr)) { h = FORWARDED_ADDR(h,candidate_hdr); ! r = (word)h + HDR_BYTES; candidate_hdr = HDR(h); } if (candidate_hdr -> hb_map == GC_invalid_map) return(0); /* Make sure r points to the beginning of the object */ r &= ~(WORDS_TO_BYTES(1) - 1); { ! register int offset = (char *)r - (char *)(HBLKPTR(r)); register signed_word sz = candidate_hdr -> hb_sz; ! ! # ifdef ALL_INTERIOR_POINTERS ! register map_entry_type map_entry; ! ! map_entry = MAP_ENTRY((candidate_hdr -> hb_map), offset); ! if (map_entry == OBJ_INVALID) { ! return(0); ! } ! r -= WORDS_TO_BYTES(map_entry); ! limit = r + WORDS_TO_BYTES(sz); ! # else ! register int correction; ! offset = BYTES_TO_WORDS(offset - HDR_BYTES); ! correction = offset % sz; ! r -= (WORDS_TO_BYTES(correction)); ! limit = r + WORDS_TO_BYTES(sz); ! if (limit > (word)(h + 1) ! && sz <= BYTES_TO_WORDS(HBLKSIZE) - HDR_WORDS) { return(0); ! } ! # endif if ((word)p >= limit) return(0); } return((GC_PTR)r); --- 375,401 ---- /* to the beginning. */ while (IS_FORWARDING_ADDR_OR_NIL(candidate_hdr)) { h = FORWARDED_ADDR(h,candidate_hdr); ! r = (word)h; candidate_hdr = HDR(h); } if (candidate_hdr -> hb_map == GC_invalid_map) return(0); /* Make sure r points to the beginning of the object */ r &= ~(WORDS_TO_BYTES(1) - 1); { ! register int offset = HBLKDISPL(r); register signed_word sz = candidate_hdr -> hb_sz; ! register signed_word map_entry; ! map_entry = MAP_ENTRY((candidate_hdr -> hb_map), offset); ! if (map_entry > CPP_MAX_OFFSET) { ! map_entry = (signed_word)(BYTES_TO_WORDS(offset)) % sz; ! } ! r -= WORDS_TO_BYTES(map_entry); ! limit = r + WORDS_TO_BYTES(sz); ! if (limit > (word)(h + 1) ! && sz <= BYTES_TO_WORDS(HBLKSIZE)) { return(0); ! } if ((word)p >= limit) return(0); } return((GC_PTR)r); *************** ptr_t arg; *** 398,408 **** register hdr * hhdr = HDR(p); sz = WORDS_TO_BYTES(hhdr -> hb_sz); ! if (sz < 0) { ! return(-sz); ! } else { ! return(sz); ! } } size_t GC_get_heap_size GC_PROTO(()) --- 416,422 ---- register hdr * hhdr = HDR(p); sz = WORDS_TO_BYTES(hhdr -> hb_sz); ! return(sz); } size_t GC_get_heap_size GC_PROTO(()) *************** size_t GC_get_bytes_since_gc GC_PROTO(() *** 420,425 **** --- 434,444 ---- return ((size_t) WORDS_TO_BYTES(GC_words_allocd)); } + size_t GC_get_total_bytes GC_PROTO(()) + { + return ((size_t) WORDS_TO_BYTES(GC_words_allocd+GC_words_allocd_before_gc)); + } + GC_bool GC_is_initialized = FALSE; void GC_init() *************** void GC_init() *** 427,491 **** DCL_LOCK_STATE; DISABLE_SIGNALS(); LOCK(); GC_init_inner(); UNLOCK(); ENABLE_SIGNALS(); } #ifdef MSWIN32 ! extern void GC_init_win32(); #endif extern void GC_setpagesize(); void GC_init_inner() { ! # ifndef THREADS word dummy; # endif if (GC_is_initialized) return; - GC_setpagesize(); - GC_exclude_static_roots(beginGC_arrays, end_gc_area); # ifdef PRINTSTATS ! if ((ptr_t)endGC_arrays != (ptr_t)(&GC_obj_kinds)) { ! GC_printf0("Reordering linker, didn't exclude obj_kinds\n"); ! } # endif # ifdef MSWIN32 GC_init_win32(); # endif # if defined(SEARCH_FOR_DATA_START) - /* This doesn't really work if the collector is in a shared library. */ GC_init_linux_data_start(); # endif ! # ifdef SOLARIS_THREADS ! GC_thr_init(); ! /* We need dirty bits in order to find live stack sections. */ ! GC_dirty_init(); # endif ! # if defined(IRIX_THREADS) || defined(LINUX_THREADS) \ ! || defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) GC_thr_init(); # endif ! # if !defined(THREADS) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \ ! || defined(IRIX_THREADS) || defined(LINUX_THREADS) \ ! || defined(HPUX_THREADS) if (GC_stackbottom == 0) { GC_stackbottom = GC_get_stack_base(); } # endif ! if (sizeof (ptr_t) != sizeof(word)) { ! ABORT("sizeof (ptr_t) != sizeof(word)\n"); ! } ! if (sizeof (signed_word) != sizeof(word)) { ! ABORT("sizeof (signed_word) != sizeof(word)\n"); ! } ! if (sizeof (struct hblk) != HBLKSIZE) { ! ABORT("sizeof (struct hblk) != HBLKSIZE\n"); ! } # ifndef THREADS # if defined(STACK_GROWS_UP) && defined(STACK_GROWS_DOWN) ABORT( --- 446,601 ---- DCL_LOCK_STATE; DISABLE_SIGNALS(); + + #ifdef MSWIN32 + if (!GC_is_initialized) InitializeCriticalSection(&GC_allocate_ml); + #endif /* MSWIN32 */ + LOCK(); GC_init_inner(); UNLOCK(); ENABLE_SIGNALS(); + # if defined(PARALLEL_MARK) || defined(THREAD_LOCAL_ALLOC) + /* Make sure marker threads and started and thread local */ + /* allocation is initialized, in case we didn't get */ + /* called from GC_init_parallel(); */ + { + extern void GC_init_parallel(void); + GC_init_parallel(); + } + # endif /* PARALLEL_MARK || THREAD_LOCAL_ALLOC */ } + #if defined(MSWIN32) || defined(MSWINCE) + CRITICAL_SECTION GC_write_cs; + #endif + #ifdef MSWIN32 ! extern void GC_init_win32 GC_PROTO((void)); #endif extern void GC_setpagesize(); + #ifdef UNIX_LIKE + + extern void GC_set_and_save_fault_handler GC_PROTO((void (*handler)(int))); + + static void looping_handler(sig) + int sig; + { + GC_err_printf1("Caught signal %d: looping in handler\n", sig); + for(;;); + } + #endif + + #ifdef MSWIN32 + extern GC_bool GC_no_win32_dlls; + #else + # define GC_no_win32_dlls FALSE + #endif + void GC_init_inner() { ! # if !defined(THREADS) && defined(GC_ASSERTIONS) word dummy; # endif + word initial_heap_sz = (word)MINHINCR; if (GC_is_initialized) return; # ifdef PRINTSTATS ! GC_print_stats = 1; ! # endif ! # if defined(MSWIN32) || defined(MSWINCE) ! InitializeCriticalSection(&GC_write_cs); ! # endif ! ! if (0 != GETENV("GC_PRINT_STATS")) { ! GC_print_stats = 1; ! } ! if (0 != GETENV("GC_FIND_LEAK")) { ! GC_find_leak = 1; ! } ! if (0 != GETENV("GC_ALL_INTERIOR_POINTERS")) { ! GC_all_interior_pointers = 1; ! } ! if (0 != GETENV("GC_DONT_GC")) { ! GC_dont_gc = 1; ! } ! if (0 != GETENV("GC_PRINT_BACK_HEIGHT")) { ! GC_print_back_height = 1; ! } ! if (0 != GETENV("GC_NO_BLACKLIST_WARNING")) { ! GC_large_alloc_warn_interval = LONG_MAX; ! } ! { ! char * time_limit_string = GETENV("GC_PAUSE_TIME_TARGET"); ! if (0 != time_limit_string) { ! long time_limit = atol(time_limit_string); ! if (time_limit < 5) { ! WARN("GC_PAUSE_TIME_TARGET environment variable value too small " ! "or bad syntax: Ignoring\n", 0); ! } else { ! GC_time_limit = time_limit; ! } ! } ! } ! { ! char * interval_string = GETENV("GC_LARGE_ALLOC_WARN_INTERVAL"); ! if (0 != interval_string) { ! long interval = atol(interval_string); ! if (interval <= 0) { ! WARN("GC_LARGE_ALLOC_WARN_INTERVAL environment variable has " ! "bad value: Ignoring\n", 0); ! } else { ! GC_large_alloc_warn_interval = interval; ! } ! } ! } ! # ifdef UNIX_LIKE ! if (0 != GETENV("GC_LOOP_ON_ABORT")) { ! GC_set_and_save_fault_handler(looping_handler); ! } ! # endif ! /* Adjust normal object descriptor for extra allocation. */ ! if (ALIGNMENT > GC_DS_TAGS && EXTRA_BYTES != 0) { ! GC_obj_kinds[NORMAL].ok_descriptor = ((word)(-ALIGNMENT) | GC_DS_LENGTH); ! } ! GC_setpagesize(); ! GC_exclude_static_roots(beginGC_arrays, endGC_arrays); ! GC_exclude_static_roots(beginGC_obj_kinds, endGC_obj_kinds); ! # ifdef SEPARATE_GLOBALS ! GC_exclude_static_roots(beginGC_objfreelist, endGC_objfreelist); ! GC_exclude_static_roots(beginGC_aobjfreelist, endGC_aobjfreelist); # endif # ifdef MSWIN32 GC_init_win32(); # endif # if defined(SEARCH_FOR_DATA_START) GC_init_linux_data_start(); # endif ! # if (defined(NETBSD) || defined(OPENBSD)) && defined(__ELF__) ! GC_init_netbsd_elf(); # endif ! # if defined(GC_PTHREADS) || defined(GC_SOLARIS_THREADS) GC_thr_init(); # endif ! # ifdef GC_SOLARIS_THREADS ! /* We need dirty bits in order to find live stack sections. */ ! GC_dirty_init(); ! # endif ! # if !defined(THREADS) || defined(GC_PTHREADS) || defined(GC_WIN32_THREADS) \ ! || defined(GC_SOLARIS_THREADS) if (GC_stackbottom == 0) { GC_stackbottom = GC_get_stack_base(); + # if defined(LINUX) && defined(IA64) + GC_register_stackbottom = GC_get_register_stack_base(); + # endif } # endif ! GC_ASSERT(sizeof (ptr_t) == sizeof(word)); ! GC_ASSERT(sizeof (signed_word) == sizeof(word)); ! GC_ASSERT(sizeof (struct hblk) == HBLKSIZE); # ifndef THREADS # if defined(STACK_GROWS_UP) && defined(STACK_GROWS_DOWN) ABORT( *************** void GC_init_inner() *** 496,535 **** "One of STACK_GROWS_UP and STACK_GROWS_DOWN should be defd\n"); # endif # ifdef STACK_GROWS_DOWN ! if ((word)(&dummy) > (word)GC_stackbottom) { ! GC_err_printf0( ! "STACK_GROWS_DOWN is defd, but stack appears to grow up\n"); ! # ifndef UTS4 /* Compiler bug workaround */ ! GC_err_printf2("sp = 0x%lx, GC_stackbottom = 0x%lx\n", ! (unsigned long) (&dummy), ! (unsigned long) GC_stackbottom); ! # endif ! ABORT("stack direction 3\n"); ! } # else ! if ((word)(&dummy) < (word)GC_stackbottom) { ! GC_err_printf0( ! "STACK_GROWS_UP is defd, but stack appears to grow down\n"); ! GC_err_printf2("sp = 0x%lx, GC_stackbottom = 0x%lx\n", ! (unsigned long) (&dummy), ! (unsigned long) GC_stackbottom); ! ABORT("stack direction 4"); ! } # endif # endif # if !defined(_AUX_SOURCE) || defined(__GNUC__) ! if ((word)(-1) < (word)0) { ! GC_err_printf0("The type word should be an unsigned integer type\n"); ! GC_err_printf0("It appears to be signed\n"); ! ABORT("word"); ! } # endif ! if ((signed_word)(-1) >= (signed_word)0) { ! GC_err_printf0( ! "The type signed_word should be a signed integer type\n"); ! GC_err_printf0("It appears to be unsigned\n"); ! ABORT("signed_word"); ! } /* Add initial guess of root sets. Do this first, since sbrk(0) */ /* might be used. */ --- 606,621 ---- "One of STACK_GROWS_UP and STACK_GROWS_DOWN should be defd\n"); # endif # ifdef STACK_GROWS_DOWN ! GC_ASSERT((word)(&dummy) <= (word)GC_stackbottom); # else ! GC_ASSERT((word)(&dummy) >= (word)GC_stackbottom); # endif # endif # if !defined(_AUX_SOURCE) || defined(__GNUC__) ! GC_ASSERT((word)(-1) > (word)0); ! /* word should be unsigned */ # endif ! GC_ASSERT((signed_word)(-1) < (signed_word)0); /* Add initial guess of root sets. Do this first, since sbrk(0) */ /* might be used. */ *************** void GC_init_inner() *** 537,543 **** GC_init_headers(); GC_bl_init(); GC_mark_init(); ! if (!GC_expand_hp_inner((word)MINHINCR)) { GC_err_printf0("Can't start up: not enough memory\n"); EXIT(); } --- 623,640 ---- GC_init_headers(); GC_bl_init(); GC_mark_init(); ! { ! char * sz_str = GETENV("GC_INITIAL_HEAP_SIZE"); ! if (sz_str != NULL) { ! initial_heap_sz = atoi(sz_str); ! if (initial_heap_sz <= MINHINCR * HBLKSIZE) { ! WARN("Bad initial heap size %s - ignoring it.\n", ! sz_str); ! } ! initial_heap_sz = divHBLKSZ(initial_heap_sz); ! } ! } ! if (!GC_expand_hp_inner(initial_heap_sz)) { GC_err_printf0("Can't start up: not enough memory\n"); EXIT(); } *************** void GC_init_inner() *** 561,572 **** PCR_IL_Unlock(); GC_pcr_install(); # endif ! /* Get black list set up */ ! GC_gcollect_inner(); # ifdef STUBBORN_ALLOC GC_stubborn_init(); # endif - GC_is_initialized = TRUE; /* Convince lint that some things are used */ # ifdef LINT { --- 658,680 ---- PCR_IL_Unlock(); GC_pcr_install(); # endif ! # if !defined(SMALL_CONFIG) ! if (!GC_no_win32_dlls && 0 != GETENV("GC_ENABLE_INCREMENTAL")) { ! GC_ASSERT(!GC_incremental); ! GC_setpagesize(); ! # ifndef GC_SOLARIS_THREADS ! GC_dirty_init(); ! # endif ! GC_ASSERT(GC_words_allocd == 0) ! GC_incremental = TRUE; ! } ! # endif /* !SMALL_CONFIG */ ! /* Get black list set up and/or incrmental GC started */ ! if (!GC_dont_precollect || GC_incremental) GC_gcollect_inner(); ! GC_is_initialized = TRUE; # ifdef STUBBORN_ALLOC GC_stubborn_init(); # endif /* Convince lint that some things are used */ # ifdef LINT { *************** void GC_enable_incremental GC_PROTO(()) *** 595,614 **** LOCK(); if (GC_incremental) goto out; GC_setpagesize(); ! # ifdef MSWIN32 ! { ! extern GC_bool GC_is_win32s(); ! ! /* VirtualProtect is not functional under win32s. */ ! if (GC_is_win32s()) goto out; ! } ! # endif /* MSWIN32 */ ! # ifndef SOLARIS_THREADS GC_dirty_init(); # endif if (!GC_is_initialized) { GC_init_inner(); } if (GC_dont_gc) { /* Can't easily do it. */ UNLOCK(); --- 703,716 ---- LOCK(); if (GC_incremental) goto out; GC_setpagesize(); ! if (GC_no_win32_dlls) goto out; ! # ifndef GC_SOLARIS_THREADS GC_dirty_init(); # endif if (!GC_is_initialized) { GC_init_inner(); } + if (GC_incremental) goto out; if (GC_dont_gc) { /* Can't easily do it. */ UNLOCK(); *************** out: *** 631,655 **** } ! #ifdef MSWIN32 ! # define LOG_FILE "gc.log" ! HANDLE GC_stdout = 0, GC_stderr; ! int GC_tmp; ! DWORD GC_junk; ! void GC_set_files() { ! if (!GC_stdout) { ! GC_stdout = CreateFile(LOG_FILE, GENERIC_WRITE, ! FILE_SHARE_READ | FILE_SHARE_WRITE, ! NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, ! NULL); ! if (INVALID_HANDLE_VALUE == GC_stdout) ABORT("Open of log file failed"); ! } ! if (GC_stderr == 0) { ! GC_stderr = GC_stdout; ! } } #endif --- 733,773 ---- } ! #if defined(MSWIN32) || defined(MSWINCE) ! # define LOG_FILE _T("gc.log") ! HANDLE GC_stdout = 0; ! void GC_deinit() { ! if (GC_is_initialized) { ! DeleteCriticalSection(&GC_write_cs); ! } ! } ! ! int GC_write(buf, len) ! GC_CONST char * buf; ! size_t len; ! { ! BOOL tmp; ! DWORD written; ! if (len == 0) ! return 0; ! EnterCriticalSection(&GC_write_cs); ! if (GC_stdout == INVALID_HANDLE_VALUE) { ! return -1; ! } else if (GC_stdout == 0) { ! GC_stdout = CreateFile(LOG_FILE, GENERIC_WRITE, ! FILE_SHARE_READ | FILE_SHARE_WRITE, ! NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, ! NULL); ! if (GC_stdout == INVALID_HANDLE_VALUE) ABORT("Open of log file failed"); ! } ! tmp = WriteFile(GC_stdout, buf, len, &written, NULL); ! if (!tmp) ! DebugBreak(); ! LeaveCriticalSection(&GC_write_cs); ! return tmp ? (int)written : -1; } #endif *************** int GC_tmp; /* Should really be local . *** 670,676 **** } #endif ! #if !defined(OS2) && !defined(MACOS) && !defined(MSWIN32) int GC_stdout = 1; int GC_stderr = 2; # if !defined(AMIGA) --- 788,794 ---- } #endif ! #if !defined(OS2) && !defined(MACOS) && !defined(MSWIN32) && !defined(MSWINCE) int GC_stdout = 1; int GC_stderr = 2; # if !defined(AMIGA) *************** int GC_tmp; /* Should really be local . *** 678,694 **** # endif #endif ! #if !defined(MSWIN32) && !defined(OS2) && !defined(MACOS) && !defined(ECOS) int GC_write(fd, buf, len) int fd; ! char *buf; size_t len; { register int bytes_written = 0; register int result; while (bytes_written < len) { ! # ifdef SOLARIS_THREADS result = syscall(SYS_write, fd, buf + bytes_written, len - bytes_written); # else --- 796,813 ---- # endif #endif ! #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(OS2) \ ! && !defined(MACOS) && !defined(ECOS) && !defined(NOSYS) int GC_write(fd, buf, len) int fd; ! GC_CONST char *buf; size_t len; { register int bytes_written = 0; register int result; while (bytes_written < len) { ! # ifdef GC_SOLARIS_THREADS result = syscall(SYS_write, fd, buf + bytes_written, len - bytes_written); # else *************** size_t len; *** 701,707 **** } #endif /* UN*X */ ! #if defined(ECOS) int GC_write(fd, buf, len) { _Jv_diag_write (buf, len); --- 820,826 ---- } #endif /* UN*X */ ! #ifdef ECOS int GC_write(fd, buf, len) { _Jv_diag_write (buf, len); *************** int GC_write(fd, buf, len) *** 709,720 **** } #endif ! #ifdef MSWIN32 ! # define WRITE(f, buf, len) (GC_set_files(), \ ! GC_tmp = WriteFile((f), (buf), \ ! (len), &GC_junk, NULL),\ ! (GC_tmp? 1 : -1)) #else # if defined(OS2) || defined(MACOS) # define WRITE(f, buf, len) (GC_set_files(), \ --- 828,844 ---- } #endif + #ifdef NOSYS + int GC_write(fd, buf, len) + { + /* No writing. */ + return len; + } + #endif ! ! #if defined(MSWIN32) || defined(MSWINCE) ! # define WRITE(f, buf, len) GC_write(buf, len) #else # if defined(OS2) || defined(MACOS) # define WRITE(f, buf, len) (GC_set_files(), \ *************** int GC_write(fd, buf, len) *** 732,738 **** /* same size as long, and that the format conversions expect something */ /* of that size. */ void GC_printf(format, a, b, c, d, e, f) ! char * format; long a, b, c, d, e, f; { char buf[1025]; --- 856,862 ---- /* same size as long, and that the format conversions expect something */ /* of that size. */ void GC_printf(format, a, b, c, d, e, f) ! GC_CONST char * format; long a, b, c, d, e, f; { char buf[1025]; *************** long a, b, c, d, e, f; *** 745,751 **** } void GC_err_printf(format, a, b, c, d, e, f) ! char * format; long a, b, c, d, e, f; { char buf[1025]; --- 869,875 ---- } void GC_err_printf(format, a, b, c, d, e, f) ! GC_CONST char * format; long a, b, c, d, e, f; { char buf[1025]; *************** long a, b, c, d, e, f; *** 757,767 **** } void GC_err_puts(s) ! char *s; { if (WRITE(GC_stderr, s, strlen(s)) < 0) ABORT("write to stderr failed"); } # if defined(__STDC__) || defined(__cplusplus) void GC_default_warn_proc(char *msg, GC_word arg) # else --- 881,900 ---- } void GC_err_puts(s) ! GC_CONST char *s; { if (WRITE(GC_stderr, s, strlen(s)) < 0) ABORT("write to stderr failed"); } + #if defined(LINUX) && !defined(SMALL_CONFIG) + void GC_err_write(buf, len) + GC_CONST char *buf; + size_t len; + { + if (WRITE(GC_stderr, buf, len) < 0) ABORT("write to stderr failed"); + } + #endif + # if defined(__STDC__) || defined(__cplusplus) void GC_default_warn_proc(char *msg, GC_word arg) # else *************** GC_warn_proc GC_current_warn_proc = GC_d *** 794,808 **** #ifndef PCR void GC_abort(msg) ! char * msg; { ! GC_err_printf1("%s\n", msg); ! (void) abort(); } #endif #ifdef NEED_CALLINFO void GC_print_callers (info) struct callinfo info[NFRAMES]; { --- 927,964 ---- #ifndef PCR void GC_abort(msg) ! GC_CONST char * msg; { ! # if defined(MSWIN32) ! (void) MessageBoxA(NULL, msg, "Fatal error in gc", MB_ICONERROR|MB_OK); ! DebugBreak(); ! # else ! GC_err_printf1("%s\n", msg); ! # endif ! if (GETENV("GC_LOOP_ON_ABORT") != NULL) { ! /* In many cases it's easier to debug a running process. */ ! /* It's arguably nicer to sleep, but that makes it harder */ ! /* to look at the thread if the debugger doesn't know much */ ! /* about threads. */ ! for(;;) {} ! } ! # ifdef MSWIN32 ! DebugBreak(); ! # else ! (void) abort(); ! # endif } #endif #ifdef NEED_CALLINFO + #ifdef HAVE_BUILTIN_BACKTRACE + # include + # ifdef LINUX + # include + # endif + #endif + void GC_print_callers (info) struct callinfo info[NFRAMES]; { *************** struct callinfo info[NFRAMES]; *** 828,834 **** GC_err_printf0("\n"); } # endif ! GC_err_printf1("\t\t##PC##= 0x%X\n", info[i].ci_pc); } } --- 984,1056 ---- GC_err_printf0("\n"); } # endif ! # if defined(HAVE_BUILTIN_BACKTRACE) && !defined(REDIRECT_MALLOC) ! /* Unfortunately backtrace_symbols calls malloc, which makes */ ! /* it dangersous if that has been redirected. */ ! { ! char **sym_name = ! backtrace_symbols((void **)(&(info[i].ci_pc)), 1); ! char *name = sym_name[0]; ! GC_bool found_it = (strchr(name, '(') != 0); ! FILE *pipe; ! # ifdef LINUX ! if (!found_it) { ! # define EXE_SZ 100 ! static char exe_name[EXE_SZ]; ! # define CMD_SZ 200 ! char cmd_buf[CMD_SZ]; ! # define RESULT_SZ 200 ! static char result_buf[RESULT_SZ]; ! size_t result_len; ! static GC_bool found_exe_name = FALSE; ! static GC_bool will_fail = FALSE; ! int ret_code; ! /* Unfortunately, this is the common case for the */ ! /* main executable. */ ! /* Try to get it via a hairy and expensive scheme. */ ! /* First we get the name of the executable: */ ! if (will_fail) goto out; ! if (!found_exe_name) { ! ret_code = readlink("/proc/self/exe", exe_name, EXE_SZ); ! if (ret_code < 0 || ret_code >= EXE_SZ || exe_name[0] != '/') { ! will_fail = TRUE; /* Dont try again. */ ! goto out; ! } ! exe_name[ret_code] = '\0'; ! found_exe_name = TRUE; ! } ! /* Then we use popen to start addr2line -e */ ! /* There are faster ways to do this, but hopefully this */ ! /* isn't time critical. */ ! sprintf(cmd_buf, "/usr/bin/addr2line -e %s 0x%lx", exe_name, ! (unsigned long)info[i].ci_pc); ! pipe = popen(cmd_buf, "r"); ! if (pipe < 0 || fgets(result_buf, RESULT_SZ, pipe) == 0) { ! will_fail = TRUE; ! goto out; ! } ! result_len = strlen(result_buf); ! if (result_buf[result_len - 1] == '\n') --result_len; ! if (result_buf[0] == '?' ! || result_buf[result_len-2] == ':' ! && result_buf[result_len-1] == '0') ! goto out; ! if (result_len < RESULT_SZ - 25) { ! /* Add in hex address */ ! sprintf(result_buf + result_len, " [0x%lx]", ! (unsigned long)info[i].ci_pc); ! } ! name = result_buf; ! pclose(pipe); ! out: ! } ! # endif ! GC_err_printf1("\t\t%s\n", name); ! free(sym_name); ! } ! # else ! GC_err_printf1("\t\t##PC##= 0x%lx\n", info[i].ci_pc); ! # endif } } *************** void GC_dump() *** 860,863 **** GC_print_block_list(); } ! # endif /* NO_DEBUGGING */ --- 1082,1085 ---- GC_print_block_list(); } ! #endif /* NO_DEBUGGING */ diff -Nrc3pad gcc-3.0.4/boehm-gc/mkinstalldirs gcc-3.1/boehm-gc/mkinstalldirs *** gcc-3.0.4/boehm-gc/mkinstalldirs Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/mkinstalldirs Fri Aug 17 18:39:16 2001 *************** *** 0 **** --- 1,36 ---- + #! /bin/sh + # mkinstalldirs --- make directory hierarchy + # Author: Noah Friedman + # Created: 1993-05-16 + # Last modified: 1994-03-25 + # Public domain + + errstatus=0 + + for file in ${1+"$@"} ; do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d in ${1+"$@"} ; do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$? + fi + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + + pathcomp="$pathcomp/" + done + done + + exit $errstatus + + # mkinstalldirs ends here diff -Nrc3pad gcc-3.0.4/boehm-gc/new_hblk.c gcc-3.1/boehm-gc/new_hblk.c *** gcc-3.0.4/boehm-gc/new_hblk.c Wed Apr 19 10:09:58 2000 --- gcc-3.1/boehm-gc/new_hblk.c Tue Oct 16 09:01:35 2001 *************** *** 1,6 **** --- 1,7 ---- /* * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 19,25 **** # include ! # include "gc_priv.h" #ifndef SMALL_CONFIG /* --- 20,26 ---- # include ! # include "private/gc_priv.h" #ifndef SMALL_CONFIG /* *************** ptr_t GC_build_fl1(h, ofl) *** 30,36 **** struct hblk *h; ptr_t ofl; { ! register word * p = (word *)h; register word * lim = (word *)(h + 1); p[0] = (word)ofl; --- 31,37 ---- struct hblk *h; ptr_t ofl; { ! register word * p = h -> hb_body; register word * lim = (word *)(h + 1); p[0] = (word)ofl; *************** ptr_t GC_build_fl_clear2(h, ofl) *** 52,58 **** struct hblk *h; ptr_t ofl; { ! register word * p = (word *)h; register word * lim = (word *)(h + 1); p[0] = (word)ofl; --- 53,59 ---- struct hblk *h; ptr_t ofl; { ! register word * p = h -> hb_body; register word * lim = (word *)(h + 1); p[0] = (word)ofl; *************** ptr_t GC_build_fl_clear3(h, ofl) *** 74,80 **** struct hblk *h; ptr_t ofl; { ! register word * p = (word *)h; register word * lim = (word *)(h + 1) - 2; p[0] = (word)ofl; --- 75,81 ---- struct hblk *h; ptr_t ofl; { ! register word * p = h -> hb_body; register word * lim = (word *)(h + 1) - 2; p[0] = (word)ofl; *************** ptr_t GC_build_fl_clear4(h, ofl) *** 94,100 **** struct hblk *h; ptr_t ofl; { ! register word * p = (word *)h; register word * lim = (word *)(h + 1); p[0] = (word)ofl; --- 95,101 ---- struct hblk *h; ptr_t ofl; { ! register word * p = h -> hb_body; register word * lim = (word *)(h + 1); p[0] = (word)ofl; *************** ptr_t GC_build_fl2(h, ofl) *** 116,122 **** struct hblk *h; ptr_t ofl; { ! register word * p = (word *)h; register word * lim = (word *)(h + 1); p[0] = (word)ofl; --- 117,123 ---- struct hblk *h; ptr_t ofl; { ! register word * p = h -> hb_body; register word * lim = (word *)(h + 1); p[0] = (word)ofl; *************** ptr_t GC_build_fl4(h, ofl) *** 134,140 **** struct hblk *h; ptr_t ofl; { ! register word * p = (word *)h; register word * lim = (word *)(h + 1); p[0] = (word)ofl; --- 135,141 ---- struct hblk *h; ptr_t ofl; { ! register word * p = h -> hb_body; register word * lim = (word *)(h + 1); p[0] = (word)ofl; *************** ptr_t ofl; *** 150,220 **** #endif /* !SMALL_CONFIG */ - /* - * Allocate a new heapblock for small objects of size n. - * Add all of the heapblock's objects to the free list for objects - * of that size. - * Set all mark bits if objects are uncollectable. - * Will fail to do anything if we are out of memory. - */ - void GC_new_hblk(sz, kind) - register word sz; - int kind; - { - register word *p, - *prev; - word *last_object; /* points to last object in new hblk */ - register struct hblk *h; /* the new heap block */ - register GC_bool clear = GC_obj_kinds[kind].ok_init; - - # ifdef PRINTSTATS - if ((sizeof (struct hblk)) > HBLKSIZE) { - ABORT("HBLK SZ inconsistency"); - } - # endif - - /* Allocate a new heap block */ - h = GC_allochblk(sz, kind, 0); - if (h == 0) return; ! /* Mark all objects if appropriate. */ ! if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h)); ! PREFETCH_FOR_WRITE((char *)h); ! PREFETCH_FOR_WRITE((char *)h + 128); ! PREFETCH_FOR_WRITE((char *)h + 256); ! PREFETCH_FOR_WRITE((char *)h + 378); /* Handle small objects sizes more efficiently. For larger objects */ /* the difference is less significant. */ # ifndef SMALL_CONFIG switch (sz) { ! case 1: GC_obj_kinds[kind].ok_freelist[1] = ! GC_build_fl1(h, GC_obj_kinds[kind].ok_freelist[1]); ! return; case 2: if (clear) { ! GC_obj_kinds[kind].ok_freelist[2] = ! GC_build_fl_clear2(h, GC_obj_kinds[kind].ok_freelist[2]); } else { ! GC_obj_kinds[kind].ok_freelist[2] = ! GC_build_fl2(h, GC_obj_kinds[kind].ok_freelist[2]); } - return; case 3: if (clear) { ! GC_obj_kinds[kind].ok_freelist[3] = ! GC_build_fl_clear3(h, GC_obj_kinds[kind].ok_freelist[3]); ! return; } else { /* It's messy to do better than the default here. */ break; } case 4: if (clear) { ! GC_obj_kinds[kind].ok_freelist[4] = ! GC_build_fl_clear4(h, GC_obj_kinds[kind].ok_freelist[4]); } else { ! GC_obj_kinds[kind].ok_freelist[4] = ! GC_build_fl4(h, GC_obj_kinds[kind].ok_freelist[4]); } - return; default: break; } --- 151,201 ---- #endif /* !SMALL_CONFIG */ ! /* Build a free list for objects of size sz inside heap block h. */ ! /* Clear objects inside h if clear is set. Add list to the end of */ ! /* the free list we build. Return the new free list. */ ! /* This could be called without the main GC lock, if we ensure that */ ! /* there is no concurrent collection which might reclaim objects that */ ! /* we have not yet allocated. */ ! ptr_t GC_build_fl(h, sz, clear, list) ! struct hblk *h; ! word sz; ! GC_bool clear; ! ptr_t list; ! { ! word *p, *prev; ! word *last_object; /* points to last object in new hblk */ ! /* Do a few prefetches here, just because its cheap. */ ! /* If we were more serious about it, these should go inside */ ! /* the loops. But write prefetches usually don't seem to */ ! /* matter much. */ ! PREFETCH_FOR_WRITE((char *)h); ! PREFETCH_FOR_WRITE((char *)h + 128); ! PREFETCH_FOR_WRITE((char *)h + 256); ! PREFETCH_FOR_WRITE((char *)h + 378); /* Handle small objects sizes more efficiently. For larger objects */ /* the difference is less significant. */ # ifndef SMALL_CONFIG switch (sz) { ! case 1: return GC_build_fl1(h, list); case 2: if (clear) { ! return GC_build_fl_clear2(h, list); } else { ! return GC_build_fl2(h, list); } case 3: if (clear) { ! return GC_build_fl_clear3(h, list); } else { /* It's messy to do better than the default here. */ break; } case 4: if (clear) { ! return GC_build_fl_clear4(h, list); } else { ! return GC_build_fl4(h, list); } default: break; } *************** int kind; *** 243,249 **** * put p (which is now head of list of objects in *h) as first * pointer in the appropriate free list for this size. */ ! obj_link(h -> hb_body) = GC_obj_kinds[kind].ok_freelist[sz]; ! GC_obj_kinds[kind].ok_freelist[sz] = ((ptr_t)p); } --- 224,263 ---- * put p (which is now head of list of objects in *h) as first * pointer in the appropriate free list for this size. */ ! obj_link(h -> hb_body) = list; ! return ((ptr_t)p); ! } ! ! /* ! * Allocate a new heapblock for small objects of size n. ! * Add all of the heapblock's objects to the free list for objects ! * of that size. ! * Set all mark bits if objects are uncollectable. ! * Will fail to do anything if we are out of memory. ! */ ! void GC_new_hblk(sz, kind) ! register word sz; ! int kind; ! { ! register struct hblk *h; /* the new heap block */ ! register GC_bool clear = GC_obj_kinds[kind].ok_init; ! ! # ifdef PRINTSTATS ! if ((sizeof (struct hblk)) > HBLKSIZE) { ! ABORT("HBLK SZ inconsistency"); ! } ! # endif ! if (GC_debugging_started) clear = TRUE; ! ! /* Allocate a new heap block */ ! h = GC_allochblk(sz, kind, 0); ! if (h == 0) return; ! ! /* Mark all objects if appropriate. */ ! if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(HDR(h)); ! ! /* Build the free list */ ! GC_obj_kinds[kind].ok_freelist[sz] = ! GC_build_fl(h, sz, clear, GC_obj_kinds[kind].ok_freelist[sz]); } diff -Nrc3pad gcc-3.0.4/boehm-gc/nursery.c gcc-3.1/boehm-gc/nursery.c *** gcc-3.0.4/boehm-gc/nursery.c Mon Nov 1 20:48:52 1999 --- gcc-3.1/boehm-gc/nursery.c Thu Jan 1 00:00:00 1970 *************** *** 1,312 **** - /* - * Copyright (c) 1999 by Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - - #ifdef NURSERY - ??? This implementation is incomplete. If you are trying to - ??? compile this you are doing something wrong. - - #include "nursery.h" - - #define SCAN_STATICS_FOR_NURSERY - /* If this is not defined, the collector will not see */ - /* references from static data areas to the nursery. */ - - struct copy_obj { - ptr_t forward; /* Forwarding link for copied objects. */ - GC_copy_descriptor descr; /* Object descriptor */ - word data[1]; - } - - ptr_t GC_nursery_start; /* Start of nursery area. */ - /* Must be NURSERY_BLOCK_SIZE */ - /* aligned. */ - ptr_t GC_nursery_end; /* End of nursery area. */ - unsigned char * GC_nursery_map; - /* GC_nursery_map[i] != 0 if an object */ - /* starts on the ith 64-bit "word" of */ - /* nursery. This simple structure has */ - /* the advantage that */ - /* allocation is cheap. Lookup is */ - /* cheap for pointers to the head of */ - /* an object, which should be the */ - /* usual case. */ - # define NURSERY_MAP_NOT_START 0 /* Not start of object. */ - # define NURSERY_MAP_START 1 /* Start of object. */ - # define NURSERY_MAP_PINNED 2 /* Start of pinned obj. */ - - # ifdef ALIGN_DOUBLE - # define NURSERY_WORD_SIZE (2 * sizeof(word)) - # else - # define NURSERY_WORD_SIZE sizeof(word) - # endif - - # define NURSERY_BLOCK_SIZE (HBLKSIZE/2) - /* HBLKSIZE must be a multiple of NURSERY_BLOCK_SIZE */ - # define NURSERY_SIZE (1024 * NURSERY_BLOCK_SIZE) - - size_t GC_nursery_size = NURSERY_SIZE; - /* Must be multiple of NURSERY_BLOCK_SIZE */ - - size_t GC_nursery_blocks; /* Number of blocks in the nursery. */ - - unsigned GC_next_nursery_block; /* index of next block we will attempt */ - /* allocate from during this cycle. */ - /* If it is pinned, we won't actually */ - /* use it. */ - - unsigned short *GC_pinned; /* Number of pinned objects in ith */ - /* nursery block. */ - /* GC_pinned[i] != 0 if the ith nursery */ - /* block is pinned, and thus not used */ - /* for allocation. */ - - GC_copy_alloc_state global_alloc_state = (ptr_t)(-1); /* will overflow. */ - - /* Array of known rescuing pointers from the heap to the nursery. */ - ptr_t ** nursery_rescuers; - /* Pointer to one past the last slot in rescuer table */ - ptr_t ** nursery_rescuers_end; - /* Maximum number of known rescuing pointers. */ - # define MAX_NURSERY_RESCUERS 32*1024 - /* Add a rescuer to the list */ - # define ADD_NURSERY_RESCUER(p) \ - if (nursery_rescuers_end >= nursery_rescuers + MAX_NURSERY_RESCUERS) { \ - ABORT("Nursery recuers overflow"); /* Fix later !!! */ \ - } else { \ - *nursery_rescuers_end++ = p; \ - } - /* Remove rescuer at the given position in the table */ - # define REMOVE_RESCUER(p) \ - *p = *--nursery_rescuers_end - - /* Should be called with allocator lock held. */ - GC_nursery_init() { - GC_nursery_start = GET_MEM(GC_nursery_size); - GC_nursery_end = GC_nursery_start + GC_nursery_size; - GC_next_nursery_block = 0; - if (GC_nursery_start < GC_least_plausible_heap_addr) { - GC_least_plausible_heap_addr = GC_nursery_start; - } - if (GC_nursery_end > GC_greatest_plausible_heap_addr) { - GC_greatest_plausible_heap_addr = GC_nursery_end; - } - if (GC_nursery_start & (NURSERY_BLOCK_SIZE-1)) { - GC_err_printf1("Nursery area is misaligned!!"); - /* This should be impossible, since GET_MEM returns HBLKSIZE */ - /* aligned chunks, and that should be a multiple of */ - /* NURSERY_BLOCK_SIZE */ - ABORT("misaligned nursery"); - } - GC_nursery_map = GET_MEM(GC_nursery_size/NURSERY_WORD_SIZE); - /* Map is cleared a block at a time when we allocate from the block. */ - /* BZERO(GC_nursery_map, GC_nursery_size/NURSERY_WORD_SIZE); */ - GC_nursery_blocks = GC_nursery_size/NURSERY_BLOCK_SIZE; - GC_pinned = GC_scratch_alloc(GC_nursery_blocks * sizeof(unsigned short)); - BZERO(GC_pinned, GC_nursery_blocks); - nursery_rescuers = GET_MEM(MAX_NURSERY_RESCUERS * sizeof(ptr_t *)); - nursery_rescuers_end = nursery_rescuers; - if (0 == GC_nursery_start || 0 == GC_nursery_map || 0 == nursery_rescuers) - ABORT("Insufficient memory for nursery"); - } - - #define PIN_OBJ(p) \ - if (p >= GC_nursery_start && p < GC_nursery_end) { GC_pin_obj_checked(p); } - - /* Pin the object at p, if it's in the nursery. */ - void GC_pin_obj(ptr_t p) { - PIN_OBJ(p); - } - - void (*GC_push_proc)(ptr_t) = 0; - - /* Pin the object at p, which is known to be in the nursery. */ - void GC_pin_obj_checked(ptr_t p) { - unsigned offset = p - GC_nursery_start; - unsigned word_offset = BYTES_TO_WORDS(offset); - unsigned blockno = (current - GC_nursery_start)/NURSERY_BLOCK_SIZE; - while (GC_nursery_map[word_offset] == NURSERY_MAP_NOT_START) { - --word_offset; - } - if (GC_nursery_map[word_offset] != NURSERY_MAP_PINNED) { - GC_nursery_map[word_offset] = NURSERY_MAP_PINNED; - ++GC_pinned[blockno]; - ??Push object at GC_nursery_start + WORDS_TO_BYTES(word_offset) - ??onto mark stack. - } - } - - void GC_scan_region_for_nursery(ptr_t low, ptr_t high) { - # if CPP_WORDSZ/8 != ALIGNMENT - --> fix this - # endif - word * l = (word *)((word)low + ALIGNMENT - 1 & ~(ALIGNMENT - 1)); - word * h = (word *)((word)high & ~(ALIGNMENT - 1)); - word * p; - for (p = l; p < h; ++p) { - PIN_OBJ(p); - } - } - - /* Invoke GC_scan_region_for_nursery on ranges that are not excluded. */ - void GC_scan_region_for_nursery_with_exclusions(ptr_t bottom, ptr_t top) - { - struct exclusion * next; - ptr_t excl_start; - - while (bottom < top) { - next = GC_next_exclusion(bottom); - if (0 == next || (excl_start = next -> e_start) >= top) { - GC_scan_region_for_nursery(bottom, top); - return; - } - if (excl_start > bottom) - GC_scan_region_for_nursery(bottom, excl_start); - bottom = next -> e_end; - } - } - - - void GC_scan_stacks_for_nursery(void) { - # ifdef THREADS - --> fix this - # endif - # ifdef STACK_GROWS_DOWN - ptr_t stack_low = GC_approx_sp(); - ptr_t stack_high = GC_stackbottom; - # else - ptr_t stack_low = GC_stackbottom; - ptr_t stack_high = GC_approx_sp(); - # endif - GC_scan_region_for_nursery(stack_low, stack_high); - # ifdef IA64 - GC_scan_region_for_nursery(BACKING_STORE_BASE, - (ptr_t) GC_save_regs_ret_val); - # endif - } - - void GC_scan_roots_for_nursery(void) { - /* Scan registers. */ - /* Direct GC_push_one to call GC_pin_obj instead of marking */ - /* and pushing objects. */ - /* This is a bit ugly, but we don't have to touch the */ - /* platform-dependent code. */ - - void (*old_push_proc)(ptr_t) = GC_push_proc; - GC_push_proc = GC_pin_obj; - GC_push_regs(); - GC_push_proc = old_push_proc; - GC_scan_stacks_for_nursery(); - # ifdef SCAN_STATICS_FOR_NURSERY - # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(PCR)) \ - && !defined(SRC_M3) - GC_remove_tmp_roots(); - GC_register_dynamic_libraries(); - # endif - /* Mark everything in static data areas */ - for (i = 0; i < n_root_sets; i++) { - GC_scan_region_for_nursery_with_exclusions ( - GC_static_roots[i].r_start, - GC_static_roots[i].r_end); - } - # endif - } - - /* Array of known rescuing pointers from the heap to the nursery. */ - ptr_t ** nursery_rescuers; - - /* Caller holds allocation lock. */ - void GC_collect_nursery(void) { - int i; - ptr_t scan_ptr = 0; - STOP_WORLD; - for (i = 0; i < GC_nursery_blocks; ++i) GC_pinned[i] = 0; - GC_scan_roots_for_nursery(); - /* All objects referenced by roots are now pinned. */ - /* Their contents are described by */ - /* mark stack entries. */ - - /* Pin blocks corresponding to valid allocation states. */ - /* that probably happens automagically if the allocation */ - /* states are kept where we can see them. */ - /* It will take work if static roots are not scanned. */ - /* We want to do this both for correctness and to avoid */ - /* promoting very young objects. */ - - /* Somehow capture dirty bits. Update rescuers array to */ - /* reflect newly valid and invalid references from dirty */ - /* pages. Other references should remain valid, since the */ - /* referents should have been pinned. */ - - /* Traverse the old object heap. Pin objects in the */ - /* nursery that are ambiguously referenced, copy those */ - /* that are unambiguously referenced. */ - - /* Traverse objects in mark stack. */ - /* If referenced object is in pinned block, add contents */ - /* to mark stack. If referenced object is forwarded, */ - /* update pointer. Otherwise reallocate the object in the */ - /* old heap, copy its contents, and then enqueue its */ - /* contents in the mark stack. */ - START_WORLD; - } - - /* Initialize an allocation state so that it can be used for */ - /* allocation. This implicitly reserves a small section of the */ - /* nursery for use with this allocator. */ - /* Also called to replenish an allocator that has been */ - /* exhausted. */ - void GC_init_copy_alloc_state(GC_copy_alloc_state *) - unsigned next_block; - ptr_t block_addr; - LOCK(); - next_block = GC_next_nursery_block; - while(is_pinned[next_block] && next_block < GC_nursery_blocks) { - ++next_block; - } - if (next_block < GC_nursery_blocks) { - block_addr = GC_nursery_start + NURSERY_BLOCK_SIZE * next_block; - GC_next_nursery_block = next_block + 1; - BZERO(GC_nursery_map + next_block * - (NURSERY_BLOCK_SIZE/NURSERY_WORD_SIZE), - NURSERY_BLOCK_SIZE/NURSERY_WORD_SIZE); - *GC_copy_alloc_state = block_addr; - UNLOCK(); - } else { - GC_collect_nursery(); - GC_next_nursery_block = 0; - UNLOCK(); - get_new_block(s); - } - } - - GC_PTR GC_copying_malloc2(GC_copy_descriptor *d, GC_copy_alloc_state *s) { - size_t sz = GC_SIZE_FROM_DESCRIPTOR(d); - ptrdiff_t offset; - ptr_t result = *s; - ptr_t new = result + sz; - if (new & COPY_BLOCK_MASK <= result & COPY_BLOCK_MASK> { - GC_init_copy_alloc_state(s); - result = *s; - new = result + sz; - GC_ASSERT(new & COPY_BLOCK_MASK > result & COPY_BLOCK_MASK> - } - (struct copy_obj *)result -> descr = d; - (struct copy_obj *)result -> forward = 0; - offset = (result - GC_nursery_start)/NURSERY_WORD_SIZE; - GC_nursery_map[offset] = NURSERY_MAP_NOT_START; - } - - GC_PTR GC_copying_malloc(GC_copy_descriptor *d) { - } - - #endif /* NURSERY */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/obj_map.c gcc-3.1/boehm-gc/obj_map.c *** gcc-3.0.4/boehm-gc/obj_map.c Wed Jun 30 12:44:12 1999 --- gcc-3.1/boehm-gc/obj_map.c Fri Aug 17 18:30:46 2001 *************** *** 1,6 **** --- 1,7 ---- /* * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers * Copyright (c) 1991, 1992 by Xerox Corporation. All rights reserved. + * Copyright (c) 1999-2001 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 11,17 **** * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ - /* Boehm, October 9, 1995 1:09 pm PDT */ /* Routines for maintaining maps describing heap block * layouts for various object sizes. Allows fast pointer validity checks --- 12,17 ---- *************** *** 19,27 **** * with slow division. */ ! # include "gc_priv.h" ! char * GC_invalid_map = 0; /* Invalidate the object map associated with a block. Free blocks */ /* are identified by invalid maps. */ --- 19,27 ---- * with slow division. */ ! # include "private/gc_priv.h" ! map_entry_type * GC_invalid_map = 0; /* Invalidate the object map associated with a block. Free blocks */ /* are identified by invalid maps. */ *************** hdr *hhdr; *** 31,37 **** register int displ; if (GC_invalid_map == 0) { ! GC_invalid_map = GC_scratch_alloc(MAP_SIZE); if (GC_invalid_map == 0) { GC_err_printf0( "Cant initialize GC_invalid_map: insufficient memory\n"); --- 31,37 ---- register int displ; if (GC_invalid_map == 0) { ! GC_invalid_map = (map_entry_type *)GC_scratch_alloc(MAP_SIZE); if (GC_invalid_map == 0) { GC_err_printf0( "Cant initialize GC_invalid_map: insufficient memory\n"); *************** hdr *hhdr; *** 54,60 **** GC_word offset; # endif { - # ifndef ALL_INTERIOR_POINTERS DCL_LOCK_STATE; DISABLE_SIGNALS(); --- 54,59 ---- *************** hdr *hhdr; *** 62,100 **** GC_register_displacement_inner(offset); UNLOCK(); ENABLE_SIGNALS(); - # endif } void GC_register_displacement_inner(offset) word offset; { - # ifndef ALL_INTERIOR_POINTERS register unsigned i; ! if (offset > MAX_OFFSET) { ABORT("Bad argument to GC_register_displacement"); } if (!GC_valid_offsets[offset]) { GC_valid_offsets[offset] = TRUE; GC_modws_valid_offsets[offset % sizeof(word)] = TRUE; ! for (i = 0; i <= MAXOBJSZ; i++) { if (GC_obj_map[i] != 0) { if (i == 0) { ! GC_obj_map[i][offset + HDR_BYTES] = (char)BYTES_TO_WORDS(offset); } else { register unsigned j; register unsigned lb = WORDS_TO_BYTES(i); if (offset < lb) { ! for (j = offset + HDR_BYTES; j < HBLKSIZE; j += lb) { ! GC_obj_map[i][j] = (char)BYTES_TO_WORDS(offset); } } } } } } - # endif } --- 61,100 ---- GC_register_displacement_inner(offset); UNLOCK(); ENABLE_SIGNALS(); } void GC_register_displacement_inner(offset) word offset; { register unsigned i; + word map_entry = BYTES_TO_WORDS(offset); ! if (offset >= VALID_OFFSET_SZ) { ABORT("Bad argument to GC_register_displacement"); } + if (map_entry > MAX_OFFSET) map_entry = OFFSET_TOO_BIG; if (!GC_valid_offsets[offset]) { GC_valid_offsets[offset] = TRUE; GC_modws_valid_offsets[offset % sizeof(word)] = TRUE; ! if (!GC_all_interior_pointers) { ! for (i = 0; i <= MAXOBJSZ; i++) { if (GC_obj_map[i] != 0) { if (i == 0) { ! GC_obj_map[i][offset] = (map_entry_type)map_entry; } else { register unsigned j; register unsigned lb = WORDS_TO_BYTES(i); if (offset < lb) { ! for (j = offset; j < HBLKSIZE; j += lb) { ! GC_obj_map[i][j] = (map_entry_type)map_entry; } } } } + } } } } *************** word sz; *** 105,117 **** { register unsigned obj_start; register unsigned displ; ! register char * new_map; if (sz > MAXOBJSZ) sz = 0; if (GC_obj_map[sz] != 0) { return(TRUE); } ! new_map = GC_scratch_alloc(MAP_SIZE); if (new_map == 0) return(FALSE); # ifdef PRINTSTATS GC_printf1("Adding block map for size %lu\n", (unsigned long)sz); --- 105,118 ---- { register unsigned obj_start; register unsigned displ; ! register map_entry_type * new_map; ! word map_entry; if (sz > MAXOBJSZ) sz = 0; if (GC_obj_map[sz] != 0) { return(TRUE); } ! new_map = (map_entry_type *)GC_scratch_alloc(MAP_SIZE); if (new_map == 0) return(FALSE); # ifdef PRINTSTATS GC_printf1("Adding block map for size %lu\n", (unsigned long)sz); *************** word sz; *** 120,138 **** MAP_ENTRY(new_map,displ) = OBJ_INVALID; } if (sz == 0) { ! for(displ = 0; displ <= MAX_OFFSET; displ++) { if (OFFSET_VALID(displ)) { ! MAP_ENTRY(new_map,displ+HDR_BYTES) = BYTES_TO_WORDS(displ); } } } else { ! for (obj_start = HDR_BYTES; obj_start + WORDS_TO_BYTES(sz) <= HBLKSIZE; obj_start += WORDS_TO_BYTES(sz)) { for (displ = 0; displ < WORDS_TO_BYTES(sz); displ++) { if (OFFSET_VALID(displ)) { MAP_ENTRY(new_map, obj_start + displ) = ! BYTES_TO_WORDS(displ); } } } --- 121,143 ---- MAP_ENTRY(new_map,displ) = OBJ_INVALID; } if (sz == 0) { ! for(displ = 0; displ <= HBLKSIZE; displ++) { if (OFFSET_VALID(displ)) { ! map_entry = BYTES_TO_WORDS(displ); ! if (map_entry > MAX_OFFSET) map_entry = OFFSET_TOO_BIG; ! MAP_ENTRY(new_map,displ) = (map_entry_type)map_entry; } } } else { ! for (obj_start = 0; obj_start + WORDS_TO_BYTES(sz) <= HBLKSIZE; obj_start += WORDS_TO_BYTES(sz)) { for (displ = 0; displ < WORDS_TO_BYTES(sz); displ++) { if (OFFSET_VALID(displ)) { + map_entry = BYTES_TO_WORDS(displ); + if (map_entry > MAX_OFFSET) map_entry = OFFSET_TOO_BIG; MAP_ENTRY(new_map, obj_start + displ) = ! (map_entry_type)map_entry; } } } diff -Nrc3pad gcc-3.0.4/boehm-gc/os_dep.c gcc-3.1/boehm-gc/os_dep.c *** gcc-3.0.4/boehm-gc/os_dep.c Thu Apr 5 00:13:13 2001 --- gcc-3.1/boehm-gc/os_dep.c Wed Apr 10 01:18:07 2002 *************** *** 14,20 **** * modified is included with the above copyright notice. */ ! # include "gc_priv.h" # if defined(LINUX) && !defined(POWERPC) # include --- 14,20 ---- * modified is included with the above copyright notice. */ ! # include "private/gc_priv.h" # if defined(LINUX) && !defined(POWERPC) # include *************** *** 45,51 **** # endif /* 2 <= __GLIBC__ */ # endif # endif ! # if !defined(OS2) && !defined(PCR) && !defined(AMIGA) && !defined(MACOS) # include # if !defined(MSWIN32) && !defined(SUNOS4) # include --- 45,52 ---- # endif /* 2 <= __GLIBC__ */ # endif # endif ! # if !defined(OS2) && !defined(PCR) && !defined(AMIGA) && !defined(MACOS) \ ! && !defined(MSWINCE) # include # if !defined(MSWIN32) && !defined(SUNOS4) # include *************** *** 53,68 **** # endif # include ! # include /* Blatantly OS dependent routines, except for those that are related */ /* to dynamic loading. */ ! # if !defined(THREADS) && !defined(STACKBOTTOM) && defined(HEURISTIC2) # define NEED_FIND_LIMIT # endif ! # if defined(IRIX_THREADS) || defined(HPUX_THREADS) # define NEED_FIND_LIMIT # endif --- 54,73 ---- # endif # include ! # if defined(MSWINCE) ! # define SIGSEGV 0 /* value is irrelevant */ ! # else ! # include ! # endif /* Blatantly OS dependent routines, except for those that are related */ /* to dynamic loading. */ ! # if defined(HEURISTIC2) || defined(SEARCH_FOR_DATA_START) # define NEED_FIND_LIMIT # endif ! # if !defined(STACKBOTTOM) && defined(HEURISTIC2) # define NEED_FIND_LIMIT # endif *************** *** 70,82 **** # define NEED_FIND_LIMIT # endif ! # if (defined(SVR4) || defined(AUX) || defined(DGUX)) && !defined(PCR) ! # define NEED_FIND_LIMIT ! # endif ! ! # if defined(LINUX) && \ ! (defined(POWERPC) || defined(SPARC) || defined(ALPHA) || defined(IA64) \ ! || defined(MIPS)) # define NEED_FIND_LIMIT # endif --- 75,82 ---- # define NEED_FIND_LIMIT # endif ! # if (defined(SVR4) || defined(AUX) || defined(DGUX) \ ! || (defined(LINUX) && defined(SPARC))) && !defined(PCR) # define NEED_FIND_LIMIT # endif *************** *** 84,101 **** # include #endif ! #ifdef FREEBSD # include #endif #ifdef AMIGA ! # include ! # include ! # include ! # include #endif ! #ifdef MSWIN32 # define WIN32_LEAN_AND_MEAN # define NOSERVICE # include --- 84,100 ---- # include #endif ! #if defined(FREEBSD) && defined(I386) # include #endif #ifdef AMIGA ! # define GC_AMIGA_DEF ! # include "AmigaOS.c" ! # undef GC_AMIGA_DEF #endif ! #if defined(MSWIN32) || defined(MSWINCE) # define WIN32_LEAN_AND_MEAN # define NOSERVICE # include *************** *** 113,123 **** # include # include # include # include #endif ! #ifdef SUNOS5SIGS ! # include # undef setjmp # undef longjmp # define setjmp(env) sigsetjmp(env, 1) --- 112,127 ---- # include # include # include + #endif + + #ifdef UNIX_LIKE # include #endif ! #if defined(SUNOS5SIGS) || defined (HURD) || defined(LINUX) ! # ifdef SUNOS5SIGS ! # include ! # endif # undef setjmp # undef longjmp # define setjmp(env) sigsetjmp(env, 1) *************** *** 126,132 **** #endif #ifdef DJGPP ! /* Apparently necessary for djgpp 2.01. May casuse problems with */ /* other versions. */ typedef long unsigned int caddr_t; #endif --- 130,136 ---- #endif #ifdef DJGPP ! /* Apparently necessary for djgpp 2.01. May cause problems with */ /* other versions. */ typedef long unsigned int caddr_t; #endif *************** *** 151,161 **** # ifdef LINUX # pragma weak __data_start ! extern int __data_start; # pragma weak data_start ! extern int data_start; # endif /* LINUX */ ! extern int _end; ptr_t GC_data_start; --- 155,165 ---- # ifdef LINUX # pragma weak __data_start ! extern int __data_start[]; # pragma weak data_start ! extern int data_start[]; # endif /* LINUX */ ! extern int _end[]; ptr_t GC_data_start; *************** *** 165,180 **** # ifdef LINUX /* Try the easy approaches first: */ ! if (&__data_start != 0) { ! GC_data_start = (ptr_t)(&__data_start); return; } ! if (&data_start != 0) { ! GC_data_start = (ptr_t)(&data_start); return; } # endif /* LINUX */ ! GC_data_start = GC_find_limit((ptr_t)(&_end), FALSE); } #endif --- 169,184 ---- # ifdef LINUX /* Try the easy approaches first: */ ! if (__data_start != 0) { ! GC_data_start = (ptr_t)__data_start; return; } ! if (data_start != 0) { ! GC_data_start = (ptr_t)data_start; return; } # endif /* LINUX */ ! GC_data_start = GC_find_limit((ptr_t)_end, FALSE); } #endif *************** static void *tiny_sbrk(ptrdiff_t increme *** 211,216 **** --- 215,233 ---- #define sbrk tiny_sbrk # endif /* ECOS */ + #if (defined(NETBSD) || defined(OPENBSD)) && defined(__ELF__) + ptr_t GC_data_start; + + void GC_init_netbsd_elf() + { + extern ptr_t GC_find_limit(); + extern char **environ; + /* This may need to be environ, without the underscore, for */ + /* some versions. */ + GC_data_start = GC_find_limit((ptr_t)&environ, FALSE); + } + #endif + # ifdef OS2 # include *************** void GC_enable_signals(void) *** 315,324 **** # else # if !defined(PCR) && !defined(AMIGA) && !defined(MSWIN32) \ && !defined(MACOS) && !defined(DJGPP) && !defined(DOS4GW) \ ! && !defined(NO_SIGSET) ! # if defined(sigmask) && !defined(UTS4) /* Use the traditional BSD interface */ # define SIGSET_T int # define SIG_DEL(set, signal) (set) &= ~(sigmask(signal)) --- 332,342 ---- # else # if !defined(PCR) && !defined(AMIGA) && !defined(MSWIN32) \ + && !defined(MSWINCE) \ && !defined(MACOS) && !defined(DJGPP) && !defined(DOS4GW) \ ! && !defined(NOSYS) && !defined(ECOS) ! # if defined(sigmask) && !defined(UTS4) && !defined(HURD) /* Use the traditional BSD interface */ # define SIGSET_T int # define SIG_DEL(set, signal) (set) &= ~(sigmask(signal)) *************** void GC_enable_signals() *** 391,397 **** # endif /*!OS/2 */ /* Ivan Demakov: simplest way (to me) */ ! #if defined (DOS4GW) || defined (NO_SIGSET) void GC_disable_signals() { } void GC_enable_signals() { } #endif --- 409,415 ---- # endif /*!OS/2 */ /* Ivan Demakov: simplest way (to me) */ ! #if defined (DOS4GW) void GC_disable_signals() { } void GC_enable_signals() { } #endif *************** void GC_enable_signals() *** 399,411 **** /* Find the page size */ word GC_page_size; ! # ifdef MSWIN32 void GC_setpagesize() { ! SYSTEM_INFO sysinfo; ! ! GetSystemInfo(&sysinfo); ! GC_page_size = sysinfo.dwPageSize; } # else --- 417,427 ---- /* Find the page size */ word GC_page_size; ! # if defined(MSWIN32) || defined(MSWINCE) void GC_setpagesize() { ! GetSystemInfo(&GC_sysinfo); ! GC_page_size = GC_sysinfo.dwPageSize; } # else *************** word GC_page_size; *** 430,436 **** * With threads, GC_mark_roots needs to know how to do this. * Called with allocator lock held. */ ! # ifdef MSWIN32 # define is_writable(prot) ((prot) == PAGE_READWRITE \ || (prot) == PAGE_WRITECOPY \ || (prot) == PAGE_EXECUTE_READWRITE \ --- 446,452 ---- * With threads, GC_mark_roots needs to know how to do this. * Called with allocator lock held. */ ! # if defined(MSWIN32) || defined(MSWINCE) # define is_writable(prot) ((prot) == PAGE_READWRITE \ || (prot) == PAGE_WRITECOPY \ || (prot) == PAGE_EXECUTE_READWRITE \ *************** ptr_t GC_get_stack_base() *** 467,473 **** } ! # else # ifdef OS2 --- 483,499 ---- } ! # endif /* MS Windows */ ! ! # ifdef BEOS ! # include ! ptr_t GC_get_stack_base(){ ! thread_info th; ! get_thread_info(find_thread(NULL),&th); ! return th.stack_end; ! } ! # endif /* BEOS */ ! # ifdef OS2 *************** ptr_t GC_get_stack_base() *** 483,549 **** return((ptr_t)(ptib -> tib_pstacklimit)); } ! # else # ifdef AMIGA ! ptr_t GC_get_stack_base() ! { ! struct Process *proc = (struct Process*)SysBase->ThisTask; ! ! /* Reference: Amiga Guru Book Pages: 42,567,574 */ ! if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS ! && proc->pr_CLI != NULL) { ! /* first ULONG is StackSize */ ! /*longPtr = proc->pr_ReturnAddr; ! size = longPtr[0];*/ ! ! return (char *)proc->pr_ReturnAddr + sizeof(ULONG); ! } else { ! return (char *)proc->pr_Task.tc_SPUpper; ! } ! } ! ! #if 0 /* old version */ ! ptr_t GC_get_stack_base() ! { ! extern struct WBStartup *_WBenchMsg; ! extern long __base; ! extern long __stack; ! struct Task *task; ! struct Process *proc; ! struct CommandLineInterface *cli; ! long size; ! ! if ((task = FindTask(0)) == 0) { ! GC_err_puts("Cannot find own task structure\n"); ! ABORT("task missing"); ! } ! proc = (struct Process *)task; ! cli = BADDR(proc->pr_CLI); ! ! if (_WBenchMsg != 0 || cli == 0) { ! size = (char *)task->tc_SPUpper - (char *)task->tc_SPLower; ! } else { ! size = cli->cli_DefaultStack * 4; ! } ! return (ptr_t)(__base + GC_max(size, __stack)); ! } ! #endif /* 0 */ ! ! # else /* !AMIGA, !OS2, ... */ ! ! # ifdef NEED_FIND_LIMIT ! /* Some tools to implement HEURISTIC2 */ ! # define MIN_PAGE_SIZE 256 /* Smallest conceivable page size, bytes */ ! /* static */ jmp_buf GC_jmp_buf; ! ! /*ARGSUSED*/ ! void GC_fault_handler(sig) ! int sig; ! { ! longjmp(GC_jmp_buf, 1); ! } # ifdef __STDC__ typedef void (*handler)(int); --- 509,523 ---- return((ptr_t)(ptib -> tib_pstacklimit)); } ! # endif /* OS2 */ # ifdef AMIGA + # define GC_AMIGA_SB + # include "AmigaOS.c" + # undef GC_AMIGA_SB + # endif /* AMIGA */ ! # if defined(NEED_FIND_LIMIT) || defined(UNIX_LIKE) # ifdef __STDC__ typedef void (*handler)(int); *************** ptr_t GC_get_stack_base() *** 551,573 **** typedef void (*handler)(); # endif ! # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) static struct sigaction old_segv_act; ! # if defined(_sigargs) || defined(HPUX) /* !Irix6.x */ static struct sigaction old_bus_act; # endif # else static handler old_segv_handler, old_bus_handler; # endif ! void GC_setup_temporary_fault_handler() { ! # ifndef ECOS ! # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) struct sigaction act; ! act.sa_handler = GC_fault_handler; ! act.sa_flags = SA_RESTART | SA_NODEFER; /* The presence of SA_NODEFER represents yet another gross */ /* hack. Under Solaris 2.3, siglongjmp doesn't appear to */ /* interact correctly with -lthread. We hide the confusion */ --- 525,556 ---- typedef void (*handler)(); # endif ! # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) || defined(HURD) static struct sigaction old_segv_act; ! # if defined(_sigargs) /* !Irix6.x */ || defined(HPUX) || defined(HURD) static struct sigaction old_bus_act; # endif # else static handler old_segv_handler, old_bus_handler; # endif ! # ifdef __STDC__ ! void GC_set_and_save_fault_handler(handler h) ! # else ! void GC_set_and_save_fault_handler(h) ! handler h; ! # endif { ! # if defined(SUNOS5SIGS) || defined(IRIX5) \ ! || defined(OSF1) || defined(HURD) struct sigaction act; ! act.sa_handler = h; ! # ifdef SUNOS5SIGS ! act.sa_flags = SA_RESTART | SA_NODEFER; ! # else ! act.sa_flags = SA_RESTART; ! # endif /* The presence of SA_NODEFER represents yet another gross */ /* hack. Under Solaris 2.3, siglongjmp doesn't appear to */ /* interact correctly with -lthread. We hide the confusion */ *************** ptr_t GC_get_stack_base() *** 575,581 **** /* signal mask. */ (void) sigemptyset(&act.sa_mask); ! # ifdef IRIX_THREADS /* Older versions have a bug related to retrieving and */ /* and setting a handler at the same time. */ (void) sigaction(SIGSEGV, 0, &old_segv_act); --- 558,564 ---- /* signal mask. */ (void) sigemptyset(&act.sa_mask); ! # ifdef GC_IRIX_THREADS /* Older versions have a bug related to retrieving and */ /* and setting a handler at the same time. */ (void) sigaction(SIGSEGV, 0, &old_segv_act); *************** ptr_t GC_get_stack_base() *** 583,620 **** # else (void) sigaction(SIGSEGV, &act, &old_segv_act); # if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \ ! || defined(HPUX) /* Under Irix 5.x or HP/UX, we may get SIGBUS. */ /* Pthreads doesn't exist under Irix 5.x, so we */ /* don't have to worry in the threads case. */ (void) sigaction(SIGBUS, &act, &old_bus_act); # endif ! # endif /* IRIX_THREADS */ # else ! old_segv_handler = signal(SIGSEGV, GC_fault_handler); # ifdef SIGBUS ! old_bus_handler = signal(SIGBUS, GC_fault_handler); # endif # endif ! # endif /* ECOS */ } void GC_reset_fault_handler() { ! # ifndef ECOS ! # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) ! (void) sigaction(SIGSEGV, &old_segv_act, 0); ! # if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \ ! || defined(HPUX) ! (void) sigaction(SIGBUS, &old_bus_act, 0); ! # endif ! # else ! (void) signal(SIGSEGV, old_segv_handler); ! # ifdef SIGBUS ! (void) signal(SIGBUS, old_bus_handler); ! # endif ! # endif ! # endif /* ECOS */ } /* Return the first nonaddressible location > p (up) or */ --- 566,619 ---- # else (void) sigaction(SIGSEGV, &act, &old_segv_act); # if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \ ! || defined(HPUX) || defined(HURD) /* Under Irix 5.x or HP/UX, we may get SIGBUS. */ /* Pthreads doesn't exist under Irix 5.x, so we */ /* don't have to worry in the threads case. */ (void) sigaction(SIGBUS, &act, &old_bus_act); # endif ! # endif /* GC_IRIX_THREADS */ # else ! old_segv_handler = signal(SIGSEGV, h); # ifdef SIGBUS ! old_bus_handler = signal(SIGBUS, h); # endif # endif ! } ! # endif /* NEED_FIND_LIMIT || UNIX_LIKE */ ! ! # ifdef NEED_FIND_LIMIT ! /* Some tools to implement HEURISTIC2 */ ! # define MIN_PAGE_SIZE 256 /* Smallest conceivable page size, bytes */ ! /* static */ jmp_buf GC_jmp_buf; ! ! /*ARGSUSED*/ ! void GC_fault_handler(sig) ! int sig; ! { ! longjmp(GC_jmp_buf, 1); ! } ! ! void GC_setup_temporary_fault_handler() ! { ! GC_set_and_save_fault_handler(GC_fault_handler); } void GC_reset_fault_handler() { ! # if defined(SUNOS5SIGS) || defined(IRIX5) \ ! || defined(OSF1) || defined(HURD) ! (void) sigaction(SIGSEGV, &old_segv_act, 0); ! # if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \ ! || defined(HPUX) || defined(HURD) ! (void) sigaction(SIGBUS, &old_bus_act, 0); ! # endif ! # else ! (void) signal(SIGSEGV, old_segv_handler); ! # ifdef SIGBUS ! (void) signal(SIGBUS, old_bus_handler); ! # endif ! # endif } /* Return the first nonaddressible location > p (up) or */ *************** ptr_t GC_get_stack_base() *** 623,678 **** ptr_t p; GC_bool up; { ! # ifndef ECOS ! static VOLATILE ptr_t result; ! /* Needs to be static, since otherwise it may not be */ ! /* preserved across the longjmp. Can safely be */ ! /* static since it's only called once, with the */ ! /* allocation lock held. */ ! GC_setup_temporary_fault_handler(); ! if (setjmp(GC_jmp_buf) == 0) { ! result = (ptr_t)(((word)(p)) ! & ~(MIN_PAGE_SIZE-1)); ! for (;;) { ! if (up) { ! result += MIN_PAGE_SIZE; ! } else { ! result -= MIN_PAGE_SIZE; ! } ! GC_noop1((word)(*result)); ! } ! } ! GC_reset_fault_handler(); ! if (!up) { result += MIN_PAGE_SIZE; ! } ! return(result); ! # else /* ECOS */ ! abort(); ! # endif /* ECOS */ } # endif ! # ifndef ECOS #ifdef LINUX_STACKBOTTOM #include #include - #include # define STAT_SKIP 27 /* Number of fields preceding startstack */ /* field in /proc/self/stat */ ptr_t GC_linux_stack_base(void) { /* We read the stack base value from /proc/self/stat. We do this */ /* using direct I/O system calls in order to avoid calling malloc */ /* in case REDIRECT_MALLOC is defined. */ # define STAT_BUF_SIZE 4096 ! # ifdef USE_LD_WRAP # define STAT_READ __real_read # else # define STAT_READ read --- 622,703 ---- ptr_t p; GC_bool up; { ! static VOLATILE ptr_t result; ! /* Needs to be static, since otherwise it may not be */ ! /* preserved across the longjmp. Can safely be */ ! /* static since it's only called once, with the */ ! /* allocation lock held. */ ! GC_setup_temporary_fault_handler(); ! if (setjmp(GC_jmp_buf) == 0) { ! result = (ptr_t)(((word)(p)) ! & ~(MIN_PAGE_SIZE-1)); ! for (;;) { ! if (up) { result += MIN_PAGE_SIZE; ! } else { ! result -= MIN_PAGE_SIZE; ! } ! GC_noop1((word)(*result)); ! } ! } ! GC_reset_fault_handler(); ! if (!up) { ! result += MIN_PAGE_SIZE; ! } ! return(result); } # endif ! # if defined(ECOS) || defined(NOSYS) ! ptr_t GC_get_stack_base() ! { ! return STACKBOTTOM; ! } ! ! #else #ifdef LINUX_STACKBOTTOM #include #include # define STAT_SKIP 27 /* Number of fields preceding startstack */ /* field in /proc/self/stat */ + # pragma weak __libc_stack_end + extern ptr_t __libc_stack_end; + + # ifdef IA64 + # pragma weak __libc_ia64_register_backing_store_base + extern ptr_t __libc_ia64_register_backing_store_base; + + ptr_t GC_get_register_stack_base(void) + { + if (0 != &__libc_ia64_register_backing_store_base + && 0 != __libc_ia64_register_backing_store_base) { + /* Glibc 2.2.4 has a bug such that for dynamically linked */ + /* executables __libc_ia64_register_backing_store_base is */ + /* defined but ininitialized during constructor calls. */ + /* Hence we check for both nonzero address and value. */ + return __libc_ia64_register_backing_store_base; + } else { + word result = (word)GC_stackbottom - BACKING_STORE_DISPLACEMENT; + result += BACKING_STORE_ALIGNMENT - 1; + result &= ~(BACKING_STORE_ALIGNMENT - 1); + return (ptr_t)result; + } + } + # endif + ptr_t GC_linux_stack_base(void) { /* We read the stack base value from /proc/self/stat. We do this */ /* using direct I/O system calls in order to avoid calling malloc */ /* in case REDIRECT_MALLOC is defined. */ # define STAT_BUF_SIZE 4096 ! # if defined(GC_USE_LD_WRAP) # define STAT_READ __real_read # else # define STAT_READ read *************** ptr_t GC_get_stack_base() *** 683,688 **** --- 708,717 ---- word result = 0; size_t i, buf_offset = 0; + /* First try the easy way. This should work for glibc 2.2 */ + if (0 != &__libc_stack_end) { + return __libc_stack_end; + } f = open("/proc/self/stat", O_RDONLY); if (f < 0 || STAT_READ(f, stat_buf, STAT_BUF_SIZE) < 2 * STAT_SKIP) { ABORT("Couldn't read /proc/self/stat"); *************** ptr_t GC_get_stack_base() *** 707,712 **** --- 736,767 ---- #endif /* LINUX_STACKBOTTOM */ + #ifdef FREEBSD_STACKBOTTOM + + /* This uses an undocumented sysctl call, but at least one expert */ + /* believes it will stay. */ + + #include + #include + #include + + ptr_t GC_freebsd_stack_base(void) + { + int nm[2] = {CTL_KERN, KERN_USRSTACK}; + ptr_t base; + size_t len = sizeof(ptr_t); + int r = sysctl(nm, 2, &base, &len, NULL, 0); + + if (r) ABORT("Error getting stack base"); + + return base; + } + + #endif /* FREEBSD_STACKBOTTOM */ + + #if !defined(BEOS) && !defined(AMIGA) && !defined(MSWIN32) \ + && !defined(MSWINCE) && !defined(OS2) + ptr_t GC_get_stack_base() { word dummy; *************** ptr_t GC_get_stack_base() *** 714,723 **** # define STACKBOTTOM_ALIGNMENT_M1 ((word)STACK_GRAN - 1) - # if defined(STACKBASE) - extern ptr_t STACKBASE; - return(STACKBASE); - # else # ifdef STACKBOTTOM return(STACKBOTTOM); # else --- 769,774 ---- *************** ptr_t GC_get_stack_base() *** 734,739 **** --- 785,793 ---- # ifdef LINUX_STACKBOTTOM result = GC_linux_stack_base(); # endif + # ifdef FREEBSD_STACKBOTTOM + result = GC_freebsd_stack_base(); + # endif # ifdef HEURISTIC2 # ifdef STACK_GROWS_DOWN result = GC_find_limit((ptr_t)(&dummy), TRUE); *************** ptr_t GC_get_stack_base() *** 759,771 **** # endif return(result); # endif /* STACKBOTTOM */ - # endif /* STACKBASE */ } ! # endif /* ECOS */ ! # endif /* ! AMIGA */ ! # endif /* ! OS2 */ ! # endif /* ! MSWIN32 */ /* * Register static data segment(s) as roots. --- 813,822 ---- # endif return(result); # endif /* STACKBOTTOM */ } ! # endif /* NOSYS ECOS */ ! # endif /* ! AMIGA, !OS 2, ! MS Windows, !BEOS */ /* * Register static data segment(s) as roots. *************** void GC_register_data_segments() *** 865,871 **** } } ! # else # ifdef MSWIN32 /* Unfortunately, we have to handle win32s very differently from NT, */ --- 916,924 ---- } } ! # else /* !OS2 */ ! ! # if defined(MSWIN32) || defined(MSWINCE) # ifdef MSWIN32 /* Unfortunately, we have to handle win32s very differently from NT, */ *************** void GC_register_data_segments() *** 875,909 **** /* all real work is done by GC_register_dynamic_libraries. Under */ /* win32s, we cannot find the data segments associated with dll's. */ /* We rgister the main data segment here. */ ! GC_bool GC_win32s = FALSE; /* We're running under win32s. */ ! ! GC_bool GC_is_win32s() ! { ! DWORD v = GetVersion(); ! ! /* Check that this is not NT, and Windows major version <= 3 */ ! return ((v & 0x80000000) && (v & 0xff) <= 3); ! } void GC_init_win32() { ! GC_win32s = GC_is_win32s(); } ! /* Return the smallest address a such that VirtualQuery */ /* returns correct results for all addresses between a and start. */ /* Assumes VirtualQuery returns correct information for start. */ ptr_t GC_least_described_address(ptr_t start) { MEMORY_BASIC_INFORMATION buf; - SYSTEM_INFO sysinfo; DWORD result; LPVOID limit; ptr_t p; LPVOID q; ! GetSystemInfo(&sysinfo); ! limit = sysinfo.lpMinimumApplicationAddress; p = (ptr_t)((word)start & ~(GC_page_size - 1)); for (;;) { q = (LPVOID)(p - GC_page_size); --- 928,958 ---- /* all real work is done by GC_register_dynamic_libraries. Under */ /* win32s, we cannot find the data segments associated with dll's. */ /* We rgister the main data segment here. */ ! # ifdef __GCC__ ! GC_bool GC_no_win32_dlls = TRUE; /* GCC can't do SEH, so we can't use VirtualQuery */ ! # else ! GC_bool GC_no_win32_dlls = FALSE; ! # endif void GC_init_win32() { ! /* if we're running under win32s, assume that no DLLs will be loaded */ ! DWORD v = GetVersion(); ! GC_no_win32_dlls |= ((v & 0x80000000) && (v & 0xff) <= 3); } ! /* Return the smallest address a such that VirtualQuery */ /* returns correct results for all addresses between a and start. */ /* Assumes VirtualQuery returns correct information for start. */ ptr_t GC_least_described_address(ptr_t start) { MEMORY_BASIC_INFORMATION buf; DWORD result; LPVOID limit; ptr_t p; LPVOID q; ! limit = GC_sysinfo.lpMinimumApplicationAddress; p = (ptr_t)((word)start & ~(GC_page_size - 1)); for (;;) { q = (LPVOID)(p - GC_page_size); *************** void GC_register_data_segments() *** 914,919 **** --- 963,969 ---- } return(p); } + # endif /* Is p the start of either the malloc heap, or of one of our */ /* heap sections? */ *************** void GC_register_data_segments() *** 927,933 **** if (0 == malloc_heap_pointer) { MEMORY_BASIC_INFORMATION buf; ! register DWORD result = VirtualQuery(malloc(1), &buf, sizeof(buf)); if (result != sizeof(buf)) { ABORT("Weird VirtualQuery result"); --- 977,987 ---- if (0 == malloc_heap_pointer) { MEMORY_BASIC_INFORMATION buf; ! void *pTemp = malloc( 1 ); ! register DWORD result = VirtualQuery(pTemp, &buf, sizeof(buf)); ! ! free( pTemp ); ! if (result != sizeof(buf)) { ABORT("Weird VirtualQuery result"); *************** void GC_register_data_segments() *** 941,961 **** } return(FALSE); } ! void GC_register_root_section(ptr_t static_root) { MEMORY_BASIC_INFORMATION buf; - SYSTEM_INFO sysinfo; DWORD result; DWORD protect; LPVOID p; char * base; char * limit, * new_limit; ! if (!GC_win32s) return; p = base = limit = GC_least_described_address(static_root); ! GetSystemInfo(&sysinfo); ! while (p < sysinfo.lpMaximumApplicationAddress) { result = VirtualQuery(p, &buf, sizeof(buf)); if (result != sizeof(buf) || buf.AllocationBase == 0 || GC_is_heap_base(buf.AllocationBase)) break; --- 995,1014 ---- } return(FALSE); } ! ! # ifdef MSWIN32 void GC_register_root_section(ptr_t static_root) { MEMORY_BASIC_INFORMATION buf; DWORD result; DWORD protect; LPVOID p; char * base; char * limit, * new_limit; ! if (!GC_no_win32_dlls) return; p = base = limit = GC_least_described_address(static_root); ! while (p < GC_sysinfo.lpMaximumApplicationAddress) { result = VirtualQuery(p, &buf, sizeof(buf)); if (result != sizeof(buf) || buf.AllocationBase == 0 || GC_is_heap_base(buf.AllocationBase)) break; *************** void GC_register_data_segments() *** 976,1102 **** } if (base != limit) GC_add_roots_inner(base, limit, FALSE); } void GC_register_data_segments() { static char dummy; - GC_register_root_section((ptr_t)(&dummy)); - } - # else - # ifdef AMIGA - - void GC_register_data_segments() - { - struct Process *proc; - struct CommandLineInterface *cli; - BPTR myseglist; - ULONG *data; - - int num; - - - # ifdef __GNUC__ - ULONG dataSegSize; - GC_bool found_segment = FALSE; - extern char __data_size[]; - - dataSegSize=__data_size+8; - /* Can`t find the Location of __data_size, because - it`s possible that is it, inside the segment. */ - # endif - - proc= (struct Process*)SysBase->ThisTask; - - /* Reference: Amiga Guru Book Pages: 538ff,565,573 - and XOper.asm */ - if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS) { - if (proc->pr_CLI == NULL) { - myseglist = proc->pr_SegList; - } else { - /* ProcLoaded 'Loaded as a command: '*/ - cli = BADDR(proc->pr_CLI); - myseglist = cli->cli_Module; - } - } else { - ABORT("Not a Process."); - } - - if (myseglist == NULL) { - ABORT("Arrrgh.. can't find segments, aborting"); - } - - /* xoper hunks Shell Process */ - - num=0; - for (data = (ULONG *)BADDR(myseglist); data != NULL; - data = (ULONG *)BADDR(data[0])) { - if (((ULONG) GC_register_data_segments < (ULONG) &data[1]) || - ((ULONG) GC_register_data_segments > (ULONG) &data[1] + data[-1])) { - # ifdef __GNUC__ - if (dataSegSize == data[-1]) { - found_segment = TRUE; - } - # endif - GC_add_roots_inner((char *)&data[1], - ((char *)&data[1]) + data[-1], FALSE); - } - ++num; - } /* for */ - # ifdef __GNUC__ - if (!found_segment) { - ABORT("Can`t find correct Segments.\nSolution: Use an newer version of ixemul.library"); - } - # endif - } - - #if 0 /* old version */ - void GC_register_data_segments() - { - extern struct WBStartup *_WBenchMsg; - struct Process *proc; - struct CommandLineInterface *cli; - BPTR myseglist; - ULONG *data; - - if ( _WBenchMsg != 0 ) { - if ((myseglist = _WBenchMsg->sm_Segment) == 0) { - GC_err_puts("No seglist from workbench\n"); - return; - } - } else { - if ((proc = (struct Process *)FindTask(0)) == 0) { - GC_err_puts("Cannot find process structure\n"); - return; - } - if ((cli = BADDR(proc->pr_CLI)) == 0) { - GC_err_puts("No CLI\n"); - return; - } - if ((myseglist = cli->cli_Module) == 0) { - GC_err_puts("No seglist from CLI\n"); - return; - } - } - - for (data = (ULONG *)BADDR(myseglist); data != 0; - data = (ULONG *)BADDR(data[0])) { - # ifdef AMIGA_SKIP_SEG - if (((ULONG) GC_register_data_segments < (ULONG) &data[1]) || - ((ULONG) GC_register_data_segments > (ULONG) &data[1] + data[-1])) { - # else - { - # endif /* AMIGA_SKIP_SEG */ - GC_add_roots_inner((char *)&data[1], - ((char *)&data[1]) + data[-1], FALSE); - } - } } - #endif /* old version */ - ! # else # if (defined(SVR4) || defined(AUX) || defined(DGUX) \ || (defined(LINUX) && defined(SPARC))) && !defined(PCR) --- 1029,1045 ---- } if (base != limit) GC_add_roots_inner(base, limit, FALSE); } + #endif void GC_register_data_segments() { + # ifdef MSWIN32 static char dummy; GC_register_root_section((ptr_t)(&dummy)); # endif } ! # else /* !OS2 && !Windows */ # if (defined(SVR4) || defined(AUX) || defined(DGUX) \ || (defined(LINUX) && defined(SPARC))) && !defined(PCR) *************** int * etext_addr; *** 1133,1143 **** # endif void GC_register_data_segments() { # if !defined(PCR) && !defined(SRC_M3) && !defined(NEXT) && !defined(MACOS) \ && !defined(MACOSX) ! # if defined(REDIRECT_MALLOC) && defined(SOLARIS_THREADS) /* As of Solaris 2.3, the Solaris threads implementation */ /* allocates the data structure for the initial thread with */ /* sbrk at process startup. It needs to be scanned, so that */ --- 1076,1094 ---- # endif + #ifdef AMIGA + + # define GC_AMIGA_DS + # include "AmigaOS.c" + # undef GC_AMIGA_DS + + #else /* !OS2 && !Windows && !AMIGA */ + void GC_register_data_segments() { # if !defined(PCR) && !defined(SRC_M3) && !defined(NEXT) && !defined(MACOS) \ && !defined(MACOSX) ! # if defined(REDIRECT_MALLOC) && defined(GC_SOLARIS_THREADS) /* As of Solaris 2.3, the Solaris threads implementation */ /* allocates the data structure for the initial thread with */ /* sbrk at process startup. It needs to be scanned, so that */ *************** void GC_register_data_segments() *** 1148,1153 **** --- 1099,1107 ---- GC_add_roots_inner(DATASTART, (char *)sbrk(0), FALSE); # else GC_add_roots_inner(DATASTART, (char *)(DATAEND), FALSE); + # if defined(DATASTART2) + GC_add_roots_inner(DATASTART2, (char *)(DATAEND2), FALSE); + # endif # endif # endif # if !defined(PCR) && (defined(NEXT) || defined(MACOSX)) *************** void GC_register_data_segments() *** 1192,1206 **** } # endif /* ! AMIGA */ ! # endif /* ! MSWIN32 */ # endif /* ! OS2 */ /* * Auxiliary routines for obtaining memory from OS. */ ! # if !defined(OS2) && !defined(PCR) && !defined(AMIGA) \ ! && !defined(MSWIN32) && !defined(MACOS) && !defined(DOS4GW) # ifdef SUNOS4 extern caddr_t sbrk(); --- 1146,1161 ---- } # endif /* ! AMIGA */ ! # endif /* ! MSWIN32 && ! MSWINCE*/ # endif /* ! OS2 */ /* * Auxiliary routines for obtaining memory from OS. */ ! # if !defined(OS2) && !defined(PCR) && !defined(AMIGA) \ ! && !defined(MSWIN32) && !defined(MSWINCE) \ ! && !defined(MACOS) && !defined(DOS4GW) # ifdef SUNOS4 extern caddr_t sbrk(); *************** void GC_register_data_segments() *** 1211,1216 **** --- 1166,1172 ---- # define SBRK_ARG_T int # endif + # ifdef RS6000 /* The compiler seems to generate speculative reads one past the end of */ /* an allocated object. Hence we need to make sure that the page */ *************** word bytes; *** 1243,1249 **** #else /* Not RS6000 */ #if defined(USE_MMAP) ! /* Tested only under IRIX5 and Solaris 2 */ #ifdef USE_MMAP_FIXED # define GC_MMAP_FLAGS MAP_FIXED | MAP_PRIVATE --- 1199,1205 ---- #else /* Not RS6000 */ #if defined(USE_MMAP) ! /* Tested only under Linux, IRIX5 and Solaris 2 */ #ifdef USE_MMAP_FIXED # define GC_MMAP_FLAGS MAP_FIXED | MAP_PRIVATE *************** word bytes; *** 1253,1258 **** --- 1209,1218 ---- # define GC_MMAP_FLAGS MAP_PRIVATE #endif + #ifndef HEAP_START + # define HEAP_START 0 + #endif + ptr_t GC_unix_get_mem(bytes) word bytes; { *************** word bytes; *** 1271,1276 **** --- 1231,1248 ---- if (result == MAP_FAILED) return(0); last_addr = (ptr_t)result + bytes + GC_page_size - 1; last_addr = (ptr_t)((word)last_addr & ~(GC_page_size - 1)); + # if !defined(LINUX) + if (last_addr == 0) { + /* Oops. We got the end of the address space. This isn't */ + /* usable by arbitrary C code, since one-past-end pointers */ + /* don't work, so we discard it and try again. */ + munmap(result, (size_t)(-GC_page_size) - (size_t)result); + /* Leave last page mapped, so we can't repeat. */ + return GC_unix_get_mem(bytes); + } + # else + GC_ASSERT(last_addr != 0); + # endif return((ptr_t)result); } *************** void * os2_alloc(size_t bytes) *** 1324,1338 **** # endif /* OS2 */ # ifdef MSWIN32 word GC_n_heap_bases = 0; ptr_t GC_win32_get_mem(bytes) word bytes; { ptr_t result; ! ! if (GC_win32s) { /* VirtualAlloc doesn't like PAGE_EXECUTE_READWRITE. */ /* There are also unconfirmed rumors of other */ /* problems, so we dodge the issue. */ --- 1296,1321 ---- # endif /* OS2 */ + # if defined(MSWIN32) || defined(MSWINCE) + SYSTEM_INFO GC_sysinfo; + # endif + # ifdef MSWIN32 + + # ifdef USE_GLOBAL_ALLOC + # define GLOBAL_ALLOC_TEST 1 + # else + # define GLOBAL_ALLOC_TEST GC_no_win32_dlls + # endif + word GC_n_heap_bases = 0; ptr_t GC_win32_get_mem(bytes) word bytes; { ptr_t result; ! ! if (GLOBAL_ALLOC_TEST) { /* VirtualAlloc doesn't like PAGE_EXECUTE_READWRITE. */ /* There are also unconfirmed rumors of other */ /* problems, so we dodge the issue. */ *************** word bytes; *** 1353,1379 **** void GC_win32_free_heap () { ! if (GC_win32s) { while (GC_n_heap_bases > 0) { GlobalFree (GC_heap_bases[--GC_n_heap_bases]); GC_heap_bases[GC_n_heap_bases] = 0; } } } # endif #ifdef USE_MUNMAP ! /* For now, this only works on some Unix-like systems. If you */ ! /* have something else, don't define USE_MUNMAP. */ /* We assume ANSI C to support this feature. */ #include #include #include #include ! #include /* Compute a page aligned starting address for the unmap */ /* operation on a block of size bytes starting at start. */ --- 1336,1423 ---- void GC_win32_free_heap () { ! if (GC_no_win32_dlls) { while (GC_n_heap_bases > 0) { GlobalFree (GC_heap_bases[--GC_n_heap_bases]); GC_heap_bases[GC_n_heap_bases] = 0; } } } + # endif + + #ifdef AMIGA + # define GC_AMIGA_AM + # include "AmigaOS.c" + # undef GC_AMIGA_AM + #endif + + + # ifdef MSWINCE + word GC_n_heap_bases = 0; + + ptr_t GC_wince_get_mem(bytes) + word bytes; + { + ptr_t result; + word i; + + /* Round up allocation size to multiple of page size */ + bytes = (bytes + GC_page_size-1) & ~(GC_page_size-1); + + /* Try to find reserved, uncommitted pages */ + for (i = 0; i < GC_n_heap_bases; i++) { + if (((word)(-(signed_word)GC_heap_lengths[i]) + & (GC_sysinfo.dwAllocationGranularity-1)) + >= bytes) { + result = GC_heap_bases[i] + GC_heap_lengths[i]; + break; + } + } + + if (i == GC_n_heap_bases) { + /* Reserve more pages */ + word res_bytes = (bytes + GC_sysinfo.dwAllocationGranularity-1) + & ~(GC_sysinfo.dwAllocationGranularity-1); + result = (ptr_t) VirtualAlloc(NULL, res_bytes, + MEM_RESERVE | MEM_TOP_DOWN, + PAGE_EXECUTE_READWRITE); + if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result"); + /* If I read the documentation correctly, this can */ + /* only happen if HBLKSIZE > 64k or not a power of 2. */ + if (GC_n_heap_bases >= MAX_HEAP_SECTS) ABORT("Too many heap sections"); + GC_heap_bases[GC_n_heap_bases] = result; + GC_heap_lengths[GC_n_heap_bases] = 0; + GC_n_heap_bases++; + } + /* Commit pages */ + result = (ptr_t) VirtualAlloc(result, bytes, + MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + if (result != NULL) { + if (HBLKDISPL(result) != 0) ABORT("Bad VirtualAlloc result"); + GC_heap_lengths[i] += bytes; + } + return(result); + } # endif #ifdef USE_MUNMAP ! /* For now, this only works on Win32/WinCE and some Unix-like */ ! /* systems. If you have something else, don't define */ ! /* USE_MUNMAP. */ /* We assume ANSI C to support this feature. */ + + #if !defined(MSWIN32) && !defined(MSWINCE) + #include #include #include #include ! ! #endif /* Compute a page aligned starting address for the unmap */ /* operation on a block of size bytes starting at start. */ *************** ptr_t GC_unmap_end(ptr_t start, word byt *** 1397,1402 **** --- 1441,1454 ---- return end_addr; } + /* Under Win32/WinCE we commit (map) and decommit (unmap) */ + /* memory using VirtualAlloc and VirtualFree. These functions */ + /* work on individual allocations of virtual memory, made */ + /* previously using VirtualAlloc with the MEM_RESERVE flag. */ + /* The ranges we need to (de)commit may span several of these */ + /* allocations; therefore we use VirtualQuery to check */ + /* allocation lengths, and split up the range as necessary. */ + /* We assume that GC_remap is called on exactly the same range */ /* as a previous call to GC_unmap. It is safe to consistently */ /* round the endpoints in both places. */ *************** void GC_unmap(ptr_t start, word bytes) *** 1406,1413 **** ptr_t end_addr = GC_unmap_end(start, bytes); word len = end_addr - start_addr; if (0 == start_addr) return; ! if (munmap(start_addr, len) != 0) ABORT("munmap failed"); ! GC_unmapped_bytes += len; } --- 1458,1481 ---- ptr_t end_addr = GC_unmap_end(start, bytes); word len = end_addr - start_addr; if (0 == start_addr) return; ! # if defined(MSWIN32) || defined(MSWINCE) ! while (len != 0) { ! MEMORY_BASIC_INFORMATION mem_info; ! GC_word free_len; ! if (VirtualQuery(start_addr, &mem_info, sizeof(mem_info)) ! != sizeof(mem_info)) ! ABORT("Weird VirtualQuery result"); ! free_len = (len < mem_info.RegionSize) ? len : mem_info.RegionSize; ! if (!VirtualFree(start_addr, free_len, MEM_DECOMMIT)) ! ABORT("VirtualFree failed"); ! GC_unmapped_bytes += free_len; ! start_addr += free_len; ! len -= free_len; ! } ! # else ! if (munmap(start_addr, len) != 0) ABORT("munmap failed"); ! GC_unmapped_bytes += len; ! # endif } *************** void GC_remap(ptr_t start, word bytes) *** 1419,1432 **** word len = end_addr - start_addr; ptr_t result; ! if (-1 == zero_descr) zero_descr = open("/dev/zero", O_RDWR); ! if (0 == start_addr) return; ! result = mmap(start_addr, len, PROT_READ | PROT_WRITE | OPT_PROT_EXEC, ! MAP_FIXED | MAP_PRIVATE, zero_descr, 0); ! if (result != start_addr) { ! ABORT("mmap remapping failed"); ! } ! GC_unmapped_bytes -= len; } /* Two adjacent blocks have already been unmapped and are about to */ --- 1487,1521 ---- word len = end_addr - start_addr; ptr_t result; ! # if defined(MSWIN32) || defined(MSWINCE) ! if (0 == start_addr) return; ! while (len != 0) { ! MEMORY_BASIC_INFORMATION mem_info; ! GC_word alloc_len; ! if (VirtualQuery(start_addr, &mem_info, sizeof(mem_info)) ! != sizeof(mem_info)) ! ABORT("Weird VirtualQuery result"); ! alloc_len = (len < mem_info.RegionSize) ? len : mem_info.RegionSize; ! result = VirtualAlloc(start_addr, alloc_len, ! MEM_COMMIT, ! PAGE_EXECUTE_READWRITE); ! if (result != start_addr) { ! ABORT("VirtualAlloc remapping failed"); ! } ! GC_unmapped_bytes -= alloc_len; ! start_addr += alloc_len; ! len -= alloc_len; ! } ! # else ! if (-1 == zero_descr) zero_descr = open("/dev/zero", O_RDWR); ! if (0 == start_addr) return; ! result = mmap(start_addr, len, PROT_READ | PROT_WRITE | OPT_PROT_EXEC, ! MAP_FIXED | MAP_PRIVATE, zero_descr, 0); ! if (result != start_addr) { ! ABORT("mmap remapping failed"); ! } ! GC_unmapped_bytes -= len; ! # endif } /* Two adjacent blocks have already been unmapped and are about to */ *************** void GC_unmap_gap(ptr_t start1, word byt *** 1447,1462 **** if (0 == start2_addr) end_addr = GC_unmap_end(start1, bytes1 + bytes2); if (0 == start_addr) return; len = end_addr - start_addr; ! if (len != 0 && munmap(start_addr, len) != 0) ABORT("munmap failed"); ! GC_unmapped_bytes += len; } #endif /* USE_MUNMAP */ /* Routine for pushing any additional roots. In THREADS */ /* environment, this is also responsible for marking from */ ! /* thread stacks. In the SRC_M3 case, it also handles */ ! /* global variables. */ #ifndef THREADS void (*GC_push_other_roots)() = 0; #else /* THREADS */ --- 1536,1566 ---- if (0 == start2_addr) end_addr = GC_unmap_end(start1, bytes1 + bytes2); if (0 == start_addr) return; len = end_addr - start_addr; ! # if defined(MSWIN32) || defined(MSWINCE) ! while (len != 0) { ! MEMORY_BASIC_INFORMATION mem_info; ! GC_word free_len; ! if (VirtualQuery(start_addr, &mem_info, sizeof(mem_info)) ! != sizeof(mem_info)) ! ABORT("Weird VirtualQuery result"); ! free_len = (len < mem_info.RegionSize) ? len : mem_info.RegionSize; ! if (!VirtualFree(start_addr, free_len, MEM_DECOMMIT)) ! ABORT("VirtualFree failed"); ! GC_unmapped_bytes += free_len; ! start_addr += free_len; ! len -= free_len; ! } ! # else ! if (len != 0 && munmap(start_addr, len) != 0) ABORT("munmap failed"); ! GC_unmapped_bytes += len; ! # endif } #endif /* USE_MUNMAP */ /* Routine for pushing any additional roots. In THREADS */ /* environment, this is also responsible for marking from */ ! /* thread stacks. */ #ifndef THREADS void (*GC_push_other_roots)() = 0; #else /* THREADS */ *************** PCR_ERes GC_push_old_obj(void *p, size_t *** 1483,1489 **** } ! void GC_default_push_other_roots() { /* Traverse data allocated by previous memory managers. */ { --- 1587,1593 ---- } ! void GC_default_push_other_roots GC_PROTO((void)) { /* Traverse data allocated by previous memory managers. */ { *************** void GC_default_push_other_roots() *** 1511,1516 **** --- 1615,1624 ---- --> misconfigured # endif + void GC_push_thread_structures GC_PROTO((void)) + { + /* Not our responsibibility. */ + } extern void ThreadF__ProcessStacks(); *************** int dummy3; *** 1528,1564 **** { word q = *p; ! if ((ptr_t)(q) >= GC_least_plausible_heap_addr ! && (ptr_t)(q) < GC_greatest_plausible_heap_addr) { ! GC_push_one_checked(q,FALSE); ! } } /* M3 set equivalent to RTHeap.TracedRefTypes */ typedef struct { int elts[1]; } RefTypeSet; RefTypeSet GC_TracedRefTypes = {{0x1}}; ! /* From finalize.c */ ! extern void GC_push_finalizer_structures(); ! ! /* From stubborn.c: */ ! # ifdef STUBBORN_ALLOC ! extern GC_PTR * GC_changing_list_start; ! # endif ! ! ! void GC_default_push_other_roots() { ! /* Use the M3 provided routine for finding static roots. */ ! /* This is a bit dubious, since it presumes no C roots. */ ! /* We handle the collector roots explicitly. */ ! { ! # ifdef STUBBORN_ALLOC ! GC_push_one(GC_changing_list_start); ! # endif ! GC_push_finalizer_structures(); ! RTMain__GlobalMapProc(GC_m3_push_root, 0, GC_TracedRefTypes); ! } if (GC_words_allocd > 0) { ThreadF__ProcessStacks(GC_push_thread_stack); } --- 1636,1654 ---- { word q = *p; ! GC_PUSH_ONE_STACK(q, p); } /* M3 set equivalent to RTHeap.TracedRefTypes */ typedef struct { int elts[1]; } RefTypeSet; RefTypeSet GC_TracedRefTypes = {{0x1}}; ! void GC_default_push_other_roots GC_PROTO((void)) { ! /* Use the M3 provided routine for finding static roots. */ ! /* This is a bit dubious, since it presumes no C roots. */ ! /* We handle the collector roots explicitly in GC_push_roots */ ! RTMain__GlobalMapProc(GC_m3_push_root, 0, GC_TracedRefTypes); if (GC_words_allocd > 0) { ThreadF__ProcessStacks(GC_push_thread_stack); } *************** void GC_default_push_other_roots() *** 1568,1593 **** # endif /* SRC_M3 */ ! # if defined(SOLARIS_THREADS) || defined(WIN32_THREADS) \ ! || defined(IRIX_THREADS) || defined(LINUX_THREADS) \ ! || defined(IRIX_JDK_THREADS) || defined(HPUX_THREADS) extern void GC_push_all_stacks(); ! void GC_default_push_other_roots() { GC_push_all_stacks(); } ! # endif /* SOLARIS_THREADS || ... */ ! void (*GC_push_other_roots)() = GC_default_push_other_roots; ! #endif /* * Routines for accessing dirty bits on virtual pages. ! * We plan to eventaually implement four strategies for doing so: * DEFAULT_VDB: A simple dummy implementation that treats every page * as possibly dirty. This makes incremental collection * useless, but the implementation is still correct. --- 1658,1682 ---- # endif /* SRC_M3 */ ! # if defined(GC_SOLARIS_THREADS) || defined(GC_PTHREADS) || \ ! defined(GC_WIN32_THREADS) extern void GC_push_all_stacks(); ! void GC_default_push_other_roots GC_PROTO((void)) { GC_push_all_stacks(); } ! # endif /* GC_SOLARIS_THREADS || GC_PTHREADS */ ! void (*GC_push_other_roots) GC_PROTO((void)) = GC_default_push_other_roots; ! #endif /* THREADS */ /* * Routines for accessing dirty bits on virtual pages. ! * We plan to eventually implement four strategies for doing so: * DEFAULT_VDB: A simple dummy implementation that treats every page * as possibly dirty. This makes incremental collection * useless, but the implementation is still correct. *************** word n; *** 1660,1670 **** { } ! /* A call hints that h is about to be written. */ ! /* May speed up some dirty bit implementations. */ /*ARGSUSED*/ ! void GC_write_hint(h) struct hblk *h; { } --- 1749,1766 ---- { } ! /* A call that: */ ! /* I) hints that [h, h+nblocks) is about to be written. */ ! /* II) guarantees that protection is removed. */ ! /* (I) may speed up some dirty bit implementations. */ ! /* (II) may be essential if we need to ensure that */ ! /* pointer-free system call buffers in the heap are */ ! /* not protected. */ /*ARGSUSED*/ ! void GC_remove_protection(h, nblocks, is_ptrfree) struct hblk *h; + word nblocks; + GC_bool is_ptrfree; { } *************** struct hblk *h; *** 1690,1696 **** * not to work under a number of other systems. */ ! # ifndef MSWIN32 # include # include --- 1786,1792 ---- * not to work under a number of other systems. */ ! # if !defined(MSWIN32) && !defined(MSWINCE) # include # include *************** struct hblk *h; *** 1709,1715 **** # else ! # include static DWORD protect_junk; # define PROTECT(addr, len) \ --- 1805,1813 ---- # else ! # ifndef MSWINCE ! # include ! # endif static DWORD protect_junk; # define PROTECT(addr, len) \ *************** struct hblk *h; *** 1730,1736 **** #if defined(SUNOS4) || defined(FREEBSD) typedef void (* SIG_PF)(); #endif ! #if defined(SUNOS5SIGS) || defined(OSF1) || defined(LINUX) # ifdef __STDC__ typedef void (* SIG_PF)(int); # else --- 1828,1835 ---- #if defined(SUNOS4) || defined(FREEBSD) typedef void (* SIG_PF)(); #endif ! #if defined(SUNOS5SIGS) || defined(OSF1) || defined(LINUX) \ ! || defined(MACOSX) || defined(HURD) # ifdef __STDC__ typedef void (* SIG_PF)(int); # else *************** struct hblk *h; *** 1742,1749 **** # undef SIG_DFL # define SIG_DFL (LPTOP_LEVEL_EXCEPTION_FILTER) (-1) #endif ! #if defined(IRIX5) || defined(OSF1) typedef void (* REAL_SIG_PF)(int, int, struct sigcontext *); #endif #if defined(SUNOS5SIGS) --- 1841,1853 ---- # undef SIG_DFL # define SIG_DFL (LPTOP_LEVEL_EXCEPTION_FILTER) (-1) #endif + #if defined(MSWINCE) + typedef LONG (WINAPI *SIG_PF)(struct _EXCEPTION_POINTERS *); + # undef SIG_DFL + # define SIG_DFL (SIG_PF) (-1) + #endif ! #if defined(IRIX5) || defined(OSF1) || defined(HURD) typedef void (* REAL_SIG_PF)(int, int, struct sigcontext *); #endif #if defined(SUNOS5SIGS) *************** struct hblk *h; *** 1759,1774 **** # endif #endif #if defined(LINUX) ! # include ! # if (LINUX_VERSION_CODE >= 0x20100) && !defined(M68K) || defined(ALPHA) || defined(IA64) typedef struct sigcontext s_c; ! # else ! typedef struct sigcontext_struct s_c; ! # endif # if defined(ALPHA) || defined(M68K) typedef void (* REAL_SIG_PF)(int, int, s_c *); # else ! # if defined(IA64) typedef void (* REAL_SIG_PF)(int, siginfo_t *, s_c *); # else typedef void (* REAL_SIG_PF)(int, s_c); --- 1863,1882 ---- # endif #endif #if defined(LINUX) ! # if __GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 2 typedef struct sigcontext s_c; ! # else /* glibc < 2.2 */ ! # include ! # if (LINUX_VERSION_CODE >= 0x20100) && !defined(M68K) || defined(ALPHA) ! typedef struct sigcontext s_c; ! # else ! typedef struct sigcontext_struct s_c; ! # endif ! # endif /* glibc < 2.2 */ # if defined(ALPHA) || defined(M68K) typedef void (* REAL_SIG_PF)(int, int, s_c *); # else ! # if defined(IA64) || defined(HP_PA) typedef void (* REAL_SIG_PF)(int, siginfo_t *, s_c *); # else typedef void (* REAL_SIG_PF)(int, s_c); *************** struct hblk *h; *** 1789,1797 **** --- 1897,2080 ---- # endif /* !ALPHA */ # endif + # if defined(MACOSX) /* Should also test for PowerPC? */ + typedef void (* REAL_SIG_PF)(int, int, struct sigcontext *); + + /* Decodes the machine instruction which was responsible for the sending of the + SIGBUS signal. Sadly this is the only way to find the faulting address because + the signal handler doesn't get it directly from the kernel (although it is + available on the Mach level, but droppped by the BSD personality before it + calls our signal handler...) + This code should be able to deal correctly with all PPCs starting from the + 601 up to and including the G4s (including Velocity Engine). */ + #define EXTRACT_OP1(iw) (((iw) & 0xFC000000) >> 26) + #define EXTRACT_OP2(iw) (((iw) & 0x000007FE) >> 1) + #define EXTRACT_REGA(iw) (((iw) & 0x001F0000) >> 16) + #define EXTRACT_REGB(iw) (((iw) & 0x03E00000) >> 21) + #define EXTRACT_REGC(iw) (((iw) & 0x0000F800) >> 11) + #define EXTRACT_DISP(iw) ((short *) &(iw))[1] + + static char *get_fault_addr(struct sigcontext *scp) + { + unsigned int instr = *((unsigned int *) scp->sc_ir); + unsigned int * regs = &((unsigned int *) scp->sc_regs)[2]; + int disp = 0, tmp; + unsigned int baseA = 0, baseB = 0; + unsigned int addr, alignmask = 0xFFFFFFFF; + + #ifdef GC_DEBUG_DECODER + GC_err_printf1("Instruction: 0x%lx\n", instr); + GC_err_printf1("Opcode 1: d\n", (int)EXTRACT_OP1(instr)); + #endif + switch(EXTRACT_OP1(instr)) { + case 38: /* stb */ + case 39: /* stbu */ + case 54: /* stfd */ + case 55: /* stfdu */ + case 52: /* stfs */ + case 53: /* stfsu */ + case 44: /* sth */ + case 45: /* sthu */ + case 47: /* stmw */ + case 36: /* stw */ + case 37: /* stwu */ + tmp = EXTRACT_REGA(instr); + if(tmp > 0) + baseA = regs[tmp]; + disp = EXTRACT_DISP(instr); + break; + case 31: + #ifdef GC_DEBUG_DECODER + GC_err_printf1("Opcode 2: %d\n", (int)EXTRACT_OP2(instr)); + #endif + switch(EXTRACT_OP2(instr)) { + case 86: /* dcbf */ + case 54: /* dcbst */ + case 1014: /* dcbz */ + case 247: /* stbux */ + case 215: /* stbx */ + case 759: /* stfdux */ + case 727: /* stfdx */ + case 983: /* stfiwx */ + case 695: /* stfsux */ + case 663: /* stfsx */ + case 918: /* sthbrx */ + case 439: /* sthux */ + case 407: /* sthx */ + case 661: /* stswx */ + case 662: /* stwbrx */ + case 150: /* stwcx. */ + case 183: /* stwux */ + case 151: /* stwx */ + case 135: /* stvebx */ + case 167: /* stvehx */ + case 199: /* stvewx */ + case 231: /* stvx */ + case 487: /* stvxl */ + tmp = EXTRACT_REGA(instr); + if(tmp > 0) + baseA = regs[tmp]; + baseB = regs[EXTRACT_REGC(instr)]; + /* determine Altivec alignment mask */ + switch(EXTRACT_OP2(instr)) { + case 167: /* stvehx */ + alignmask = 0xFFFFFFFE; + break; + case 199: /* stvewx */ + alignmask = 0xFFFFFFFC; + break; + case 231: /* stvx */ + alignmask = 0xFFFFFFF0; + break; + case 487: /* stvxl */ + alignmask = 0xFFFFFFF0; + break; + } + break; + case 725: /* stswi */ + tmp = EXTRACT_REGA(instr); + if(tmp > 0) + baseA = regs[tmp]; + break; + default: /* ignore instruction */ + #ifdef GC_DEBUG_DECODER + GC_err_printf("Ignored by inner handler\n"); + #endif + return NULL; + break; + } + break; + default: /* ignore instruction */ + #ifdef GC_DEBUG_DECODER + GC_err_printf("Ignored by main handler\n"); + #endif + return NULL; + break; + } + + addr = (baseA + baseB) + disp; + addr &= alignmask; + #ifdef GC_DEBUG_DECODER + GC_err_printf1("BaseA: %d\n", baseA); + GC_err_printf1("BaseB: %d\n", baseB); + GC_err_printf1("Disp: %d\n", disp); + GC_err_printf1("Address: %d\n", addr); + #endif + return (char *)addr; + } + #endif /* MACOSX */ + SIG_PF GC_old_bus_handler; SIG_PF GC_old_segv_handler; /* Also old MSWIN32 ACCESS_VIOLATION filter */ + #ifdef THREADS + /* We need to lock around the bitmap update in the write fault handler */ + /* in order to avoid the risk of losing a bit. We do this with a */ + /* test-and-set spin lock if we know how to do that. Otherwise we */ + /* check whether we are already in the handler and use the dumb but */ + /* safe fallback algorithm of setting all bits in the word. */ + /* Contention should be very rare, so we do the minimum to handle it */ + /* correctly. */ + #ifdef GC_TEST_AND_SET_DEFINED + static VOLATILE unsigned int fault_handler_lock = 0; + void async_set_pht_entry_from_index(VOLATILE page_hash_table db, int index) { + while (GC_test_and_set(&fault_handler_lock)) {} + /* Could also revert to set_pht_entry_from_index_safe if initial */ + /* GC_test_and_set fails. */ + set_pht_entry_from_index(db, index); + GC_clear(&fault_handler_lock); + } + #else /* !GC_TEST_AND_SET_DEFINED */ + /* THIS IS INCORRECT! The dirty bit vector may be temporarily wrong, */ + /* just before we notice the conflict and correct it. We may end up */ + /* looking at it while it's wrong. But this requires contention */ + /* exactly when a GC is triggered, which seems far less likely to */ + /* fail than the old code, which had no reported failures. Thus we */ + /* leave it this way while we think of something better, or support */ + /* GC_test_and_set on the remaining platforms. */ + static VOLATILE word currently_updating = 0; + void async_set_pht_entry_from_index(VOLATILE page_hash_table db, int index) { + unsigned int update_dummy; + currently_updating = (word)(&update_dummy); + set_pht_entry_from_index(db, index); + /* If we get contention in the 10 or so instruction window here, */ + /* and we get stopped by a GC between the two updates, we lose! */ + if (currently_updating != (word)(&update_dummy)) { + set_pht_entry_from_index_safe(db, index); + /* We claim that if two threads concurrently try to update the */ + /* dirty bit vector, the first one to execute UPDATE_START */ + /* will see it changed when UPDATE_END is executed. (Note that */ + /* &update_dummy must differ in two distinct threads.) It */ + /* will then execute set_pht_entry_from_index_safe, thus */ + /* returning us to a safe state, though not soon enough. */ + } + } + #endif /* !GC_TEST_AND_SET_DEFINED */ + #else /* !THREADS */ + # define async_set_pht_entry_from_index(db, index) \ + set_pht_entry_from_index(db, index) + #endif /* !THREADS */ + /*ARGSUSED*/ # if defined (SUNOS4) || defined(FREEBSD) void GC_write_fault_handler(sig, code, scp, addr) *************** SIG_PF GC_old_segv_handler; /* Also old *** 1809,1830 **** # define CODE_OK (code == BUS_PAGE_FAULT) # endif # endif ! # if defined(IRIX5) || defined(OSF1) # include void GC_write_fault_handler(int sig, int code, struct sigcontext *scp) - # define SIG_OK (sig == SIGSEGV) # ifdef OSF1 # define CODE_OK (code == 2 /* experimentally determined */) # endif # ifdef IRIX5 # define CODE_OK (code == EACCES) # endif # endif # if defined(LINUX) # if defined(ALPHA) || defined(M68K) void GC_write_fault_handler(int sig, int code, s_c * sc) # else ! # if defined(IA64) void GC_write_fault_handler(int sig, siginfo_t * si, s_c * scp) # else void GC_write_fault_handler(int sig, s_c sc) --- 2092,2118 ---- # define CODE_OK (code == BUS_PAGE_FAULT) # endif # endif ! # if defined(IRIX5) || defined(OSF1) || defined(HURD) # include void GC_write_fault_handler(int sig, int code, struct sigcontext *scp) # ifdef OSF1 + # define SIG_OK (sig == SIGSEGV) # define CODE_OK (code == 2 /* experimentally determined */) # endif # ifdef IRIX5 + # define SIG_OK (sig == SIGSEGV) # define CODE_OK (code == EACCES) # endif + # ifdef HURD + # define SIG_OK (sig == SIGBUS || sig == SIGSEGV) + # define CODE_OK TRUE + # endif # endif # if defined(LINUX) # if defined(ALPHA) || defined(M68K) void GC_write_fault_handler(int sig, int code, s_c * sc) # else ! # if defined(IA64) || defined(HP_PA) void GC_write_fault_handler(int sig, siginfo_t * si, s_c * scp) # else void GC_write_fault_handler(int sig, s_c sc) *************** SIG_PF GC_old_segv_handler; /* Also old *** 1857,1871 **** # define CODE_OK (scp -> si_code == SEGV_ACCERR) # endif # endif ! # if defined(MSWIN32) LONG WINAPI GC_write_fault_handler(struct _EXCEPTION_POINTERS *exc_info) # define SIG_OK (exc_info -> ExceptionRecord -> ExceptionCode == \ ! EXCEPTION_ACCESS_VIOLATION) # define CODE_OK (exc_info -> ExceptionRecord -> ExceptionInformation[0] == 1) /* Write fault */ # endif { register unsigned i; # ifdef IRIX5 char * addr = (char *) (size_t) (scp -> sc_badvaddr); # endif --- 2145,2169 ---- # define CODE_OK (scp -> si_code == SEGV_ACCERR) # endif # endif ! ! # if defined(MACOSX) ! void GC_write_fault_handler(int sig, int code, struct sigcontext *scp) ! # define SIG_OK (sig == SIGBUS) ! # define CODE_OK (code == 0 /* experimentally determined */) ! # endif ! ! # if defined(MSWIN32) || defined(MSWINCE) LONG WINAPI GC_write_fault_handler(struct _EXCEPTION_POINTERS *exc_info) # define SIG_OK (exc_info -> ExceptionRecord -> ExceptionCode == \ ! STATUS_ACCESS_VIOLATION) # define CODE_OK (exc_info -> ExceptionRecord -> ExceptionInformation[0] == 1) /* Write fault */ # endif { register unsigned i; + # if defined(HURD) + char *addr = (char *) code; + # endif # ifdef IRIX5 char * addr = (char *) (size_t) (scp -> sc_badvaddr); # endif *************** SIG_PF GC_old_segv_handler; /* Also old *** 1882,1888 **** # if defined(M68K) char * addr = NULL; ! struct sigcontext *scp = (struct sigcontext *)(&sc); int format = (scp->sc_formatvec >> 12) & 0xf; unsigned long *framedata = (unsigned long *)(scp + 1); --- 2180,2186 ---- # if defined(M68K) char * addr = NULL; ! struct sigcontext *scp = (struct sigcontext *)(sc); int format = (scp->sc_formatvec >> 12) & 0xf; unsigned long *framedata = (unsigned long *)(scp + 1); *************** SIG_PF GC_old_segv_handler; /* Also old *** 1894,1899 **** --- 2192,2201 ---- } else if (format == 7) { /* 68040 */ ea = framedata[3]; + if (framedata[1] & 0x08000000) { + /* correct addr on misaligned access */ + ea = (ea+4095)&(~4095); + } } else if (format == 4) { /* 68060 */ ea = framedata[0]; *************** SIG_PF GC_old_segv_handler; /* Also old *** 1907,1913 **** # ifdef ALPHA char * addr = get_fault_addr(sc); # else ! # ifdef IA64 char * addr = si -> si_addr; /* I believe this is claimed to work on all platforms for */ /* Linux 2.3.47 and later. Hopefully we don't have to */ --- 2209,2215 ---- # ifdef ALPHA char * addr = get_fault_addr(sc); # else ! # if defined(IA64) || defined(HP_PA) char * addr = si -> si_addr; /* I believe this is claimed to work on all platforms for */ /* Linux 2.3.47 and later. Hopefully we don't have to */ *************** SIG_PF GC_old_segv_handler; /* Also old *** 1923,1929 **** # endif # endif # endif ! # if defined(MSWIN32) char * addr = (char *) (exc_info -> ExceptionRecord -> ExceptionInformation[1]); # define sig SIGSEGV --- 2225,2234 ---- # endif # endif # endif ! # if defined(MACOSX) ! char * addr = get_fault_addr(scp); ! # endif ! # if defined(MSWIN32) || defined(MSWINCE) char * addr = (char *) (exc_info -> ExceptionRecord -> ExceptionInformation[1]); # define sig SIGSEGV *************** SIG_PF GC_old_segv_handler; /* Also old *** 1955,1961 **** old_handler = GC_old_bus_handler; } if (old_handler == SIG_DFL) { ! # ifndef MSWIN32 GC_err_printf1("Segfault at 0x%lx\n", addr); ABORT("Unexpected bus error or segmentation fault"); # else --- 2260,2266 ---- old_handler = GC_old_bus_handler; } if (old_handler == SIG_DFL) { ! # if !defined(MSWIN32) && !defined(MSWINCE) GC_err_printf1("Segfault at 0x%lx\n", addr); ABORT("Unexpected bus error or segmentation fault"); # else *************** SIG_PF GC_old_segv_handler; /* Also old *** 1974,1980 **** # if defined(ALPHA) || defined(M68K) (*(REAL_SIG_PF)old_handler) (sig, code, sc); # else ! # if defined(IA64) (*(REAL_SIG_PF)old_handler) (sig, si, scp); # else (*(REAL_SIG_PF)old_handler) (sig, sc); --- 2279,2285 ---- # if defined(ALPHA) || defined(M68K) (*(REAL_SIG_PF)old_handler) (sig, code, sc); # else ! # if defined(IA64) || defined(HP_PA) (*(REAL_SIG_PF)old_handler) (sig, si, scp); # else (*(REAL_SIG_PF)old_handler) (sig, sc); *************** SIG_PF GC_old_segv_handler; /* Also old *** 1982,2015 **** # endif return; # endif ! # if defined (IRIX5) || defined(OSF1) (*(REAL_SIG_PF)old_handler) (sig, code, scp); return; # endif # ifdef MSWIN32 return((*old_handler)(exc_info)); # endif } } for (i = 0; i < divHBLKSZ(GC_page_size); i++) { register int index = PHT_HASH(h+i); ! set_pht_entry_from_index(GC_dirty_pages, index); } ! UNPROTECT(h, GC_page_size); ! # if defined(OSF1) || defined(LINUX) /* These reset the signal handler each time by default. */ signal(SIGSEGV, (SIG_PF) GC_write_fault_handler); # endif /* The write may not take place before dirty bits are read. */ /* But then we'll fault again ... */ ! # ifdef MSWIN32 return(EXCEPTION_CONTINUE_EXECUTION); # else return; # endif } ! #ifdef MSWIN32 return EXCEPTION_CONTINUE_SEARCH; #else GC_err_printf1("Segfault at 0x%lx\n", addr); --- 2287,2334 ---- # endif return; # endif ! # if defined (IRIX5) || defined(OSF1) || defined(HURD) (*(REAL_SIG_PF)old_handler) (sig, code, scp); return; # endif + # ifdef MACOSX + (*(REAL_SIG_PF)old_handler) (sig, code, scp); + # endif # ifdef MSWIN32 return((*old_handler)(exc_info)); # endif } } + UNPROTECT(h, GC_page_size); + /* We need to make sure that no collection occurs between */ + /* the UNPROTECT and the setting of the dirty bit. Otherwise */ + /* a write by a third thread might go unnoticed. Reversing */ + /* the order is just as bad, since we would end up unprotecting */ + /* a page in a GC cycle during which it's not marked. */ + /* Currently we do this by disabling the thread stopping */ + /* signals while this handler is running. An alternative might */ + /* be to record the fact that we're about to unprotect, or */ + /* have just unprotected a page in the GC's thread structure, */ + /* and then to have the thread stopping code set the dirty */ + /* flag, if necessary. */ for (i = 0; i < divHBLKSZ(GC_page_size); i++) { register int index = PHT_HASH(h+i); ! async_set_pht_entry_from_index(GC_dirty_pages, index); } ! # if defined(OSF1) /* These reset the signal handler each time by default. */ signal(SIGSEGV, (SIG_PF) GC_write_fault_handler); # endif /* The write may not take place before dirty bits are read. */ /* But then we'll fault again ... */ ! # if defined(MSWIN32) || defined(MSWINCE) return(EXCEPTION_CONTINUE_EXECUTION); # else return; # endif } ! #if defined(MSWIN32) || defined(MSWINCE) return EXCEPTION_CONTINUE_SEARCH; #else GC_err_printf1("Segfault at 0x%lx\n", addr); *************** SIG_PF GC_old_segv_handler; /* Also old *** 2019,2062 **** /* * We hold the allocation lock. We expect block h to be written ! * shortly. */ ! void GC_write_hint(h) struct hblk *h; { ! register struct hblk * h_trunc; ! register unsigned i; ! register GC_bool found_clean; if (!GC_dirty_maintained) return; h_trunc = (struct hblk *)((word)h & ~(GC_page_size-1)); found_clean = FALSE; ! for (i = 0; i < divHBLKSZ(GC_page_size); i++) { ! register int index = PHT_HASH(h_trunc+i); ! if (!get_pht_entry_from_index(GC_dirty_pages, index)) { ! found_clean = TRUE; ! set_pht_entry_from_index(GC_dirty_pages, index); } } ! if (found_clean) { ! UNPROTECT(h_trunc, GC_page_size); ! } } void GC_dirty_init() { ! #if defined(SUNOS5SIGS) || defined(IRIX5) /* || defined(OSF1) */ ! struct sigaction act, oldact; ! # ifdef IRIX5 act.sa_flags = SA_RESTART; ! act.sa_handler = GC_write_fault_handler; ! # else act.sa_flags = SA_RESTART | SA_SIGINFO; act.sa_sigaction = GC_write_fault_handler; # endif - (void)sigemptyset(&act.sa_mask); - #endif # ifdef PRINTSTATS GC_printf0("Inititalizing mprotect virtual dirty bit implementation\n"); # endif --- 2338,2401 ---- /* * We hold the allocation lock. We expect block h to be written ! * shortly. Ensure that all pages cvontaining any part of the n hblks ! * starting at h are no longer protected. If is_ptrfree is false, ! * also ensure that they will subsequently appear to be dirty. */ ! void GC_remove_protection(h, nblocks, is_ptrfree) struct hblk *h; + word nblocks; + GC_bool is_ptrfree; { ! struct hblk * h_trunc; /* Truncated to page boundary */ ! struct hblk * h_end; /* Page boundary following block end */ ! struct hblk * current; ! GC_bool found_clean; if (!GC_dirty_maintained) return; h_trunc = (struct hblk *)((word)h & ~(GC_page_size-1)); + h_end = (struct hblk *)(((word)(h + nblocks) + GC_page_size-1) + & ~(GC_page_size-1)); found_clean = FALSE; ! for (current = h_trunc; current < h_end; ++current) { ! int index = PHT_HASH(current); ! if (!is_ptrfree || current < h || current >= h + nblocks) { ! async_set_pht_entry_from_index(GC_dirty_pages, index); } } ! UNPROTECT(h_trunc, (ptr_t)h_end - (ptr_t)h_trunc); } void GC_dirty_init() { ! # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(LINUX) || \ ! defined(OSF1) || defined(HURD) ! struct sigaction act, oldact; ! /* We should probably specify SA_SIGINFO for Linux, and handle */ ! /* the different architectures more uniformly. */ ! # if defined(IRIX5) || defined(LINUX) || defined(OSF1) || defined(HURD) act.sa_flags = SA_RESTART; ! act.sa_handler = (SIG_PF)GC_write_fault_handler; ! # else act.sa_flags = SA_RESTART | SA_SIGINFO; act.sa_sigaction = GC_write_fault_handler; + # endif + (void)sigemptyset(&act.sa_mask); + # ifdef SIG_SUSPEND + /* Arrange to postpone SIG_SUSPEND while we're in a write fault */ + /* handler. This effectively makes the handler atomic w.r.t. */ + /* stopping the world for GC. */ + (void)sigaddset(&act.sa_mask, SIG_SUSPEND); + # endif /* SIG_SUSPEND */ + # endif + # if defined(MACOSX) + struct sigaction act, oldact; + + act.sa_flags = SA_RESTART; + act.sa_handler = GC_write_fault_handler; + sigemptyset(&act.sa_mask); # endif # ifdef PRINTSTATS GC_printf0("Inititalizing mprotect virtual dirty bit implementation\n"); # endif *************** void GC_dirty_init() *** 2077,2083 **** # endif } # endif ! # if defined(OSF1) || defined(SUNOS4) || defined(LINUX) GC_old_segv_handler = signal(SIGSEGV, (SIG_PF)GC_write_fault_handler); if (GC_old_segv_handler == SIG_IGN) { GC_err_printf0("Previously ignored segmentation violation!?"); --- 2416,2422 ---- # endif } # endif ! # if defined(SUNOS4) GC_old_segv_handler = signal(SIGSEGV, (SIG_PF)GC_write_fault_handler); if (GC_old_segv_handler == SIG_IGN) { GC_err_printf0("Previously ignored segmentation violation!?"); *************** void GC_dirty_init() *** 2089,2106 **** # endif } # endif ! # if defined(SUNOS5SIGS) || defined(IRIX5) ! # if defined(IRIX_THREADS) || defined(IRIX_JDK_THREADS) sigaction(SIGSEGV, 0, &oldact); sigaction(SIGSEGV, &act, 0); # else sigaction(SIGSEGV, &act, &oldact); # endif ! # if defined(_sigargs) /* This is Irix 5.x, not 6.x. Irix 5.x does not have */ /* sa_sigaction. */ GC_old_segv_handler = oldact.sa_handler; ! # else /* Irix 6.x or SUNOS5SIGS */ if (oldact.sa_flags & SA_SIGINFO) { GC_old_segv_handler = (SIG_PF)(oldact.sa_sigaction); } else { --- 2428,2447 ---- # endif } # endif ! # if defined(SUNOS5SIGS) || defined(IRIX5) || defined(LINUX) \ ! || defined(OSF1) || defined(HURD) ! /* SUNOS5SIGS includes HPUX */ ! # if defined(GC_IRIX_THREADS) sigaction(SIGSEGV, 0, &oldact); sigaction(SIGSEGV, &act, 0); # else sigaction(SIGSEGV, &act, &oldact); # endif ! # if defined(_sigargs) || defined(HURD) /* This is Irix 5.x, not 6.x. Irix 5.x does not have */ /* sa_sigaction. */ GC_old_segv_handler = oldact.sa_handler; ! # else /* Irix 6.x or SUNOS5SIGS or LINUX */ if (oldact.sa_flags & SA_SIGINFO) { GC_old_segv_handler = (SIG_PF)(oldact.sa_sigaction); } else { *************** void GC_dirty_init() *** 2116,2131 **** GC_err_printf0("Replaced other SIGSEGV handler\n"); # endif } ! # ifdef HPUX ! sigaction(SIGBUS, &act, &oldact); ! GC_old_bus_handler = oldact.sa_handler; ! if (GC_old_segv_handler != SIG_DFL) { ! # ifdef PRINTSTATS ! GC_err_printf0("Replaced other SIGBUS handler\n"); ! # endif ! } ! # endif ! # endif # if defined(MSWIN32) GC_old_segv_handler = SetUnhandledExceptionFilter(GC_write_fault_handler); if (GC_old_segv_handler != NULL) { --- 2457,2476 ---- GC_err_printf0("Replaced other SIGSEGV handler\n"); # endif } ! # endif ! # if defined(MACOSX) || defined(HPUX) || defined(LINUX) || defined(HURD) ! sigaction(SIGBUS, &act, &oldact); ! GC_old_bus_handler = oldact.sa_handler; ! if (GC_old_bus_handler == SIG_IGN) { ! GC_err_printf0("Previously ignored bus error!?"); ! GC_old_bus_handler = SIG_DFL; ! } ! if (GC_old_bus_handler != SIG_DFL) { ! # ifdef PRINTSTATS ! GC_err_printf0("Replaced other SIGBUS handler\n"); ! # endif ! } ! # endif /* MACOS || HPUX || LINUX */ # if defined(MSWIN32) GC_old_segv_handler = SetUnhandledExceptionFilter(GC_write_fault_handler); if (GC_old_segv_handler != NULL) { *************** void GC_dirty_init() *** 2138,2155 **** # endif } void GC_protect_heap() { ptr_t start; word len; unsigned i; ! for (i = 0; i < GC_n_heap_sects; i++) { start = GC_heap_sects[i].hs_start; len = GC_heap_sects[i].hs_bytes; ! PROTECT(start, len); } } --- 2483,2559 ---- # endif } + int GC_incremental_protection_needs() + { + if (GC_page_size == HBLKSIZE) { + return GC_PROTECTS_POINTER_HEAP; + } else { + return GC_PROTECTS_POINTER_HEAP | GC_PROTECTS_PTRFREE_HEAP; + } + } + #define HAVE_INCREMENTAL_PROTECTION_NEEDS + + #define IS_PTRFREE(hhdr) ((hhdr)->hb_descr == 0) + #define PAGE_ALIGNED(x) !((word)(x) & (GC_page_size - 1)) void GC_protect_heap() { ptr_t start; word len; + struct hblk * current; + struct hblk * current_start; /* Start of block to be protected. */ + struct hblk * limit; unsigned i; ! GC_bool protect_all = ! (0 != (GC_incremental_protection_needs() & GC_PROTECTS_PTRFREE_HEAP)); for (i = 0; i < GC_n_heap_sects; i++) { start = GC_heap_sects[i].hs_start; len = GC_heap_sects[i].hs_bytes; ! if (protect_all) { ! PROTECT(start, len); ! } else { ! GC_ASSERT(PAGE_ALIGNED(len)) ! GC_ASSERT(PAGE_ALIGNED(start)) ! current_start = current = (struct hblk *)start; ! limit = (struct hblk *)(start + len); ! while (current < limit) { ! hdr * hhdr; ! word nhblks; ! GC_bool is_ptrfree; ! ! GC_ASSERT(PAGE_ALIGNED(current)); ! GET_HDR(current, hhdr); ! if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { ! /* This can happen only if we're at the beginning of a */ ! /* heap segment, and a block spans heap segments. */ ! /* We will handle that block as part of the preceding */ ! /* segment. */ ! GC_ASSERT(current_start == current); ! current_start = ++current; ! continue; ! } ! if (HBLK_IS_FREE(hhdr)) { ! GC_ASSERT(PAGE_ALIGNED(hhdr -> hb_sz)); ! nhblks = divHBLKSZ(hhdr -> hb_sz); ! is_ptrfree = TRUE; /* dirty on alloc */ ! } else { ! nhblks = OBJ_SZ_TO_BLOCKS(hhdr -> hb_sz); ! is_ptrfree = IS_PTRFREE(hhdr); ! } ! if (is_ptrfree) { ! if (current_start < current) { ! PROTECT(current_start, (ptr_t)current - (ptr_t)current_start); ! } ! current_start = (current += nhblks); ! } else { ! current += nhblks; ! } ! } ! if (current_start < current) { ! PROTECT(current_start, (ptr_t)current - (ptr_t)current_start); ! } ! } } } *************** struct hblk * h; *** 2178,2192 **** * happens to work. * On other systems, SET_LOCK_HOLDER and friends must be suitably defined. */ void GC_begin_syscall() { ! if (!I_HOLD_LOCK()) LOCK(); } void GC_end_syscall() { ! if (!I_HOLD_LOCK()) UNLOCK(); } void GC_unprotect_range(addr, len) --- 2582,2604 ---- * happens to work. * On other systems, SET_LOCK_HOLDER and friends must be suitably defined. */ + + static GC_bool syscall_acquired_lock = FALSE; /* Protected by GC lock. */ void GC_begin_syscall() { ! if (!I_HOLD_LOCK()) { ! LOCK(); ! syscall_acquired_lock = TRUE; ! } } void GC_end_syscall() { ! if (syscall_acquired_lock) { ! syscall_acquired_lock = FALSE; ! UNLOCK(); ! } } void GC_unprotect_range(addr, len) *************** word len; *** 2198,2204 **** register struct hblk *h; ptr_t obj_start; ! if (!GC_incremental) return; obj_start = GC_base(addr); if (obj_start == 0) return; if (GC_base(addr + len - 1) != obj_start) { --- 2610,2616 ---- register struct hblk *h; ptr_t obj_start; ! if (!GC_dirty_maintained) return; obj_start = GC_base(addr); if (obj_start == 0) return; if (GC_base(addr + len - 1) != obj_start) { *************** word len; *** 2210,2225 **** for (h = start_block; h <= end_block; h++) { register word index = PHT_HASH(h); ! set_pht_entry_from_index(GC_dirty_pages, index); } UNPROTECT(start_block, ((ptr_t)end_block - (ptr_t)start_block) + HBLKSIZE); } ! #if !defined(MSWIN32) && !defined(LINUX_THREADS) ! /* Replacement for UNIX system call. */ ! /* Other calls that write to the heap */ ! /* should be handled similarly. */ # if defined(__STDC__) && !defined(SUNOS4) # include # include --- 2622,2642 ---- for (h = start_block; h <= end_block; h++) { register word index = PHT_HASH(h); ! async_set_pht_entry_from_index(GC_dirty_pages, index); } UNPROTECT(start_block, ((ptr_t)end_block - (ptr_t)start_block) + HBLKSIZE); } ! #if !defined(MSWIN32) && !defined(MSWINCE) && !defined(THREADS) \ ! && !defined(GC_USE_LD_WRAP) ! /* Replacement for UNIX system call. */ ! /* Other calls that write to the heap should be handled similarly. */ ! /* Note that this doesn't work well for blocking reads: It will hold */ ! /* tha allocation lock for the entur duration of the call. Multithreaded */ ! /* clients should really ensure that it won't block, either by setting */ ! /* the descriptor nonblocking, or by calling select or poll first, to */ ! /* make sure that input is available. */ # if defined(__STDC__) && !defined(SUNOS4) # include # include *************** word len; *** 2239,2245 **** GC_begin_syscall(); GC_unprotect_range(buf, (word)nbyte); ! # if defined(IRIX5) || defined(LINUX_THREADS) /* Indirect system call may not always be easily available. */ /* We could call _read, but that would interfere with the */ /* libpthread interception of read. */ --- 2656,2662 ---- GC_begin_syscall(); GC_unprotect_range(buf, (word)nbyte); ! # if defined(IRIX5) || defined(GC_LINUX_THREADS) /* Indirect system call may not always be easily available. */ /* We could call _read, but that would interfere with the */ /* libpthread interception of read. */ *************** word len; *** 2253,2269 **** result = readv(fd, &iov, 1); } # else ! /* The two zero args at the end of this list are because one ! IA-64 syscall() implementation actually requires six args ! to be passed, even though they aren't always used. */ ! result = syscall(SYS_read, fd, buf, nbyte, 0, 0); # endif GC_end_syscall(); return(result); } ! #endif /* !MSWIN32 && !LINUX */ ! #ifdef USE_LD_WRAP /* We use the GNU ld call wrapping facility. */ /* This requires that the linker be invoked with "--wrap read". */ /* This can be done by passing -Wl,"--wrap read" to gcc. */ --- 2670,2690 ---- result = readv(fd, &iov, 1); } # else ! # if defined(HURD) ! result = __read(fd, buf, nbyte); ! # else ! /* The two zero args at the end of this list are because one ! IA-64 syscall() implementation actually requires six args ! to be passed, even though they aren't always used. */ ! result = syscall(SYS_read, fd, buf, nbyte, 0, 0); ! # endif /* !HURD */ # endif GC_end_syscall(); return(result); } ! #endif /* !MSWIN32 && !MSWINCE && !GC_LINUX_THREADS */ ! #if defined(GC_USE_LD_WRAP) && !defined(THREADS) /* We use the GNU ld call wrapping facility. */ /* This requires that the linker be invoked with "--wrap read". */ /* This can be done by passing -Wl,"--wrap read" to gcc. */ *************** word n; *** 2300,2305 **** --- 2721,2733 ---- { } + # else /* !MPROTECT_VDB */ + + # ifdef GC_USE_LD_WRAP + ssize_t __wrap_read(int fd, void *buf, size_t nbyte) + { return __real_read(fd, buf, nbyte); } + # endif + # endif /* MPROTECT_VDB */ # ifdef PROC_VDB *************** word n; *** 2322,2334 **** #include #include #include - #include #define INITIAL_BUF_SZ 4096 word GC_proc_buf_size = INITIAL_BUF_SZ; char *GC_proc_buf; ! #ifdef SOLARIS_THREADS /* We don't have exact sp values for threads. So we count on */ /* occasionally declaring stack pages to be fresh. Thus we */ /* need a real implementation of GC_is_fresh. We can't clear */ --- 2750,2761 ---- #include #include #include #define INITIAL_BUF_SZ 4096 word GC_proc_buf_size = INITIAL_BUF_SZ; char *GC_proc_buf; ! #ifdef GC_SOLARIS_THREADS /* We don't have exact sp values for threads. So we count on */ /* occasionally declaring stack pages to be fresh. Thus we */ /* need a real implementation of GC_is_fresh. We can't clear */ *************** void GC_dirty_init() *** 2383,2389 **** ABORT("/proc ioctl failed"); } GC_proc_buf = GC_scratch_alloc(GC_proc_buf_size); ! # ifdef SOLARIS_THREADS GC_fresh_pages = (struct hblk **) GC_scratch_alloc(MAX_FRESH_PAGES * sizeof (struct hblk *)); if (GC_fresh_pages == 0) { --- 2810,2816 ---- ABORT("/proc ioctl failed"); } GC_proc_buf = GC_scratch_alloc(GC_proc_buf_size); ! # ifdef GC_SOLARIS_THREADS GC_fresh_pages = (struct hblk **) GC_scratch_alloc(MAX_FRESH_PAGES * sizeof (struct hblk *)); if (GC_fresh_pages == 0) { *************** void GC_dirty_init() *** 2396,2407 **** /* Ignore write hints. They don't help us here. */ /*ARGSUSED*/ ! void GC_write_hint(h) struct hblk *h; { } ! #ifdef SOLARIS_THREADS # define READ(fd,buf,nbytes) syscall(SYS_read, fd, buf, nbytes) #else # define READ(fd,buf,nbytes) read(fd, buf, nbytes) --- 2823,2836 ---- /* Ignore write hints. They don't help us here. */ /*ARGSUSED*/ ! void GC_remove_protection(h, nblocks, is_ptrfree) struct hblk *h; + word nblocks; + GC_bool is_ptrfree; { } ! #ifdef GC_SOLARIS_THREADS # define READ(fd,buf,nbytes) syscall(SYS_read, fd, buf, nbytes) #else # define READ(fd,buf,nbytes) read(fd, buf, nbytes) *************** int dummy; *** 2440,2446 **** /* Punt: */ memset(GC_grungy_pages, 0xff, sizeof (page_hash_table)); memset(GC_written_pages, 0xff, sizeof(page_hash_table)); ! # ifdef SOLARIS_THREADS BZERO(GC_fresh_pages, MAX_FRESH_PAGES * sizeof (struct hblk *)); # endif --- 2869,2875 ---- /* Punt: */ memset(GC_grungy_pages, 0xff, sizeof (page_hash_table)); memset(GC_written_pages, 0xff, sizeof(page_hash_table)); ! # ifdef GC_SOLARIS_THREADS BZERO(GC_fresh_pages, MAX_FRESH_PAGES * sizeof (struct hblk *)); # endif *************** int dummy; *** 2470,2476 **** register word index = PHT_HASH(h); set_pht_entry_from_index(GC_grungy_pages, index); ! # ifdef SOLARIS_THREADS { register int slot = FRESH_PAGE_SLOT(h); --- 2899,2905 ---- register word index = PHT_HASH(h); set_pht_entry_from_index(GC_grungy_pages, index); ! # ifdef GC_SOLARIS_THREADS { register int slot = FRESH_PAGE_SLOT(h); *************** int dummy; *** 2488,2494 **** } /* Update GC_written_pages. */ GC_or_pages(GC_written_pages, GC_grungy_pages); ! # ifdef SOLARIS_THREADS /* Make sure that old stacks are considered completely clean */ /* unless written again. */ GC_old_stacks_are_fresh(); --- 2917,2923 ---- } /* Update GC_written_pages. */ GC_or_pages(GC_written_pages, GC_grungy_pages); ! # ifdef GC_SOLARIS_THREADS /* Make sure that old stacks are considered completely clean */ /* unless written again. */ GC_old_stacks_are_fresh(); *************** struct hblk *h; *** 2504,2510 **** register GC_bool result; result = get_pht_entry_from_index(GC_grungy_pages, index); ! # ifdef SOLARIS_THREADS if (result && PAGE_IS_FRESH(h)) result = FALSE; /* This happens only if page was declared fresh since */ /* the read_dirty call, e.g. because it's in an unused */ --- 2933,2939 ---- register GC_bool result; result = get_pht_entry_from_index(GC_grungy_pages, index); ! # ifdef GC_SOLARIS_THREADS if (result && PAGE_IS_FRESH(h)) result = FALSE; /* This happens only if page was declared fresh since */ /* the read_dirty call, e.g. because it's in an unused */ *************** struct hblk *h; *** 2522,2528 **** register GC_bool result; result = get_pht_entry_from_index(GC_written_pages, index); ! # ifdef SOLARIS_THREADS if (result && PAGE_IS_FRESH(h)) result = FALSE; # endif return(result); --- 2951,2957 ---- register GC_bool result; result = get_pht_entry_from_index(GC_written_pages, index); ! # ifdef GC_SOLARIS_THREADS if (result && PAGE_IS_FRESH(h)) result = FALSE; # endif return(result); *************** word n; *** 2536,2542 **** register word index; ! # ifdef SOLARIS_THREADS register word i; if (GC_fresh_pages != 0) { --- 2965,2971 ---- register word index; ! # ifdef GC_SOLARIS_THREADS register word i; if (GC_fresh_pages != 0) { *************** struct hblk *h; *** 2605,2636 **** } /*ARGSUSED*/ ! void GC_write_hint(h) struct hblk *h; { ! PCR_VD_WriteProtectDisable(h, HBLKSIZE); ! PCR_VD_WriteProtectEnable(h, HBLKSIZE); } # endif /* PCR_VDB */ /* * Call stack save code for debugging. * Should probably be in mach_dep.c, but that requires reorganization. */ #if defined(SPARC) # if defined(LINUX) ! struct frame { long fr_local[8]; long fr_arg[6]; struct frame *fr_savfp; long fr_savpc; ! # ifndef __arch64__ ! char *fr_stret; ! # endif long fr_argd[6]; long fr_argx[0]; ! }; # else # if defined(SUNOS4) # include --- 3034,3090 ---- } /*ARGSUSED*/ ! void GC_remove_protection(h, nblocks, is_ptrfree) struct hblk *h; + word nblocks; + GC_bool is_ptrfree; { ! PCR_VD_WriteProtectDisable(h, nblocks*HBLKSIZE); ! PCR_VD_WriteProtectEnable(h, nblocks*HBLKSIZE); } # endif /* PCR_VDB */ + # ifndef HAVE_INCREMENTAL_PROTECTION_NEEDS + int GC_incremental_protection_needs() + { + return GC_PROTECTS_NONE; + } + # endif /* !HAVE_INCREMENTAL_PROTECTION_NEEDS */ + /* * Call stack save code for debugging. * Should probably be in mach_dep.c, but that requires reorganization. */ + + /* I suspect the following works for most X86 *nix variants, so */ + /* long as the frame pointer is explicitly stored. In the case of gcc, */ + /* compiler flags (e.g. -fomit-frame-pointer) determine whether it is. */ + #if defined(I386) && defined(LINUX) && defined(SAVE_CALL_CHAIN) + # include + + struct frame { + struct frame *fr_savfp; + long fr_savpc; + long fr_arg[NARGS]; /* All the arguments go here. */ + }; + #endif + #if defined(SPARC) # if defined(LINUX) ! # include ! ! struct frame { long fr_local[8]; long fr_arg[6]; struct frame *fr_savfp; long fr_savpc; ! # ifndef __arch64__ ! char *fr_stret; ! # endif long fr_argd[6]; long fr_argx[0]; ! }; # else # if defined(SUNOS4) # include *************** struct frame { *** 2638,2644 **** # if defined (DRSNX) # include # else ! # if defined(OPENBSD) # include # else # include --- 3092,3098 ---- # if defined (DRSNX) # include # else ! # if defined(OPENBSD) || defined(NETBSD) # include # else # include *************** struct frame { *** 2649,2660 **** # if NARGS > 6 --> We only know how to to get the first 6 arguments # endif #ifdef SAVE_CALL_CHAIN /* Fill in the pc and argument information for up to NFRAMES of my */ /* callers. Ignore my frame and my callers frame. */ ! #ifdef OPENBSD # define FR_SAVFP fr_fp # define FR_SAVPC fr_pc #else --- 3103,3144 ---- # if NARGS > 6 --> We only know how to to get the first 6 arguments # endif + #endif /* SPARC */ #ifdef SAVE_CALL_CHAIN /* Fill in the pc and argument information for up to NFRAMES of my */ /* callers. Ignore my frame and my callers frame. */ ! #ifdef LINUX ! # include ! # if __GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2 ! # define HAVE_BUILTIN_BACKTRACE ! # endif ! #endif ! ! #if NARGS == 0 && NFRAMES % 2 == 0 /* No padding */ \ ! && defined(HAVE_BUILTIN_BACKTRACE) ! ! #include ! ! void GC_save_callers (info) ! struct callinfo info[NFRAMES]; ! { ! void * tmp_info[NFRAMES + 1]; ! int npcs, i; ! # define IGNORE_FRAMES 1 ! ! /* We retrieve NFRAMES+1 pc values, but discard the first, since it */ ! /* points to our own frame. */ ! GC_ASSERT(sizeof(struct callinfo) == sizeof(void *)); ! npcs = backtrace((void **)tmp_info, NFRAMES + IGNORE_FRAMES); ! BCOPY(tmp_info+IGNORE_FRAMES, info, (npcs - IGNORE_FRAMES) * sizeof(void *)); ! for (i = npcs - IGNORE_FRAMES; i < NFRAMES; ++i) info[i].ci_pc = 0; ! } ! ! #else /* No builtin backtrace; do it ourselves */ ! ! #if (defined(OPENBSD) || defined(NETBSD)) && defined(SPARC) # define FR_SAVFP fr_fp # define FR_SAVPC fr_pc #else *************** struct frame { *** 2663,2671 **** #endif #if defined(SPARC) && (defined(__arch64__) || defined(__sparcv9)) ! #define BIAS 2047 #else ! #define BIAS 0 #endif void GC_save_callers (info) --- 3147,3155 ---- #endif #if defined(SPARC) && (defined(__arch64__) || defined(__sparcv9)) ! # define BIAS 2047 #else ! # define BIAS 0 #endif void GC_save_callers (info) *************** struct callinfo info[NFRAMES]; *** 2674,2698 **** struct frame *frame; struct frame *fp; int nframes = 0; ! word GC_save_regs_in_stack(); ! frame = (struct frame *) GC_save_regs_in_stack (); ! for (fp = (struct frame *)((long) frame -> FR_SAVFP + BIAS); ! fp != 0 && nframes < NFRAMES; fp = (struct frame *)((long) fp -> FR_SAVFP + BIAS), nframes++) { register int i; info[nframes].ci_pc = fp->FR_SAVPC; ! for (i = 0; i < NARGS; i++) { ! info[nframes].ci_arg[i] = ~(fp->fr_arg[i]); ! } } if (nframes < NFRAMES) info[nframes].ci_pc = 0; } #endif /* SAVE_CALL_CHAIN */ - #endif /* SPARC */ --- 3158,3242 ---- struct frame *frame; struct frame *fp; int nframes = 0; ! # ifdef I386 ! /* We assume this is turned on only with gcc as the compiler. */ ! asm("movl %%ebp,%0" : "=r"(frame)); ! fp = frame; ! # else ! word GC_save_regs_in_stack(); ! frame = (struct frame *) GC_save_regs_in_stack (); ! fp = (struct frame *)((long) frame -> FR_SAVFP + BIAS); ! #endif ! for (; (!(fp HOTTER_THAN frame) && !(GC_stackbottom HOTTER_THAN (ptr_t)fp) ! && (nframes < NFRAMES)); fp = (struct frame *)((long) fp -> FR_SAVFP + BIAS), nframes++) { register int i; info[nframes].ci_pc = fp->FR_SAVPC; ! # if NARGS > 0 ! for (i = 0; i < NARGS; i++) { ! info[nframes].ci_arg[i] = ~(fp->fr_arg[i]); ! } ! # endif /* NARGS > 0 */ } if (nframes < NFRAMES) info[nframes].ci_pc = 0; } + #endif /* No builtin backtrace */ + #endif /* SAVE_CALL_CHAIN */ + #if defined(LINUX) && defined(__ELF__) && \ + (!defined(SMALL_CONFIG) || defined(USE_PROC_FOR_LIBRARIES)) + #ifdef GC_USE_LD_WRAP + # define READ __real_read + #else + # define READ read + #endif + + + /* Repeatedly perform a read call until the buffer is filled or */ + /* we encounter EOF. */ + ssize_t GC_repeat_read(int fd, char *buf, size_t count) + { + ssize_t num_read = 0; + ssize_t result; + + while (num_read < count) { + result = READ(fd, buf + num_read, count - num_read); + if (result < 0) return result; + if (result == 0) break; + num_read += result; + } + return num_read; + } + #endif /* LINUX && ... */ + + + #if defined(LINUX) && defined(__ELF__) && !defined(SMALL_CONFIG) + + /* Dump /proc/self/maps to GC_stderr, to enable looking up names for + addresses in FIND_LEAK output. */ + + void GC_print_address_map() + { + int f; + int result; + char maps_temp[32768]; + GC_err_printf0("---------- Begin address map ----------\n"); + f = open("/proc/self/maps", O_RDONLY); + if (-1 == f) ABORT("Couldn't open /proc/self/maps"); + do { + result = GC_repeat_read(f, maps_temp, sizeof(maps_temp)); + if (result <= 0) ABORT("Couldn't read /proc/self/maps"); + GC_err_write(maps_temp, result); + } while (result == sizeof(maps_temp)); + + GC_err_printf0("---------- End address map ----------\n"); + } + + #endif diff -Nrc3pad gcc-3.0.4/boehm-gc/pc_excludes gcc-3.1/boehm-gc/pc_excludes *** gcc-3.0.4/boehm-gc/pc_excludes Wed Jun 30 12:44:15 1999 --- gcc-3.1/boehm-gc/pc_excludes Fri Aug 17 18:30:46 2001 *************** *** 1,4 **** --- 1,6 ---- solaris_threads.c + solaris_pthreads.c + irix_threads.c pcr_interface.c real_malloc.c mips_mach_dep.s *************** sparc_mach_dep.s *** 8,15 **** PCR-Makefile setjmp_t.c callprocs ! gc.man pc_excludes barrett_diagram include/gc_c++.h ! include/gc_inline.h \ No newline at end of file --- 10,21 ---- PCR-Makefile setjmp_t.c callprocs ! doc/gc.man pc_excludes barrett_diagram include/gc_c++.h ! include/gc_inline.h ! doc/README.hp ! doc/README.rs6000 ! doc/README.sgi ! diff -Nrc3pad gcc-3.0.4/boehm-gc/pcr_interface.c gcc-3.1/boehm-gc/pcr_interface.c *** gcc-3.0.4/boehm-gc/pcr_interface.c Wed Jun 30 12:44:16 1999 --- gcc-3.1/boehm-gc/pcr_interface.c Fri Aug 17 18:30:46 2001 *************** *** 10,17 **** * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ ! /* Boehm, February 7, 1996 11:09 am PST */ ! # include "gc_priv.h" # ifdef PCR /* --- 10,16 ---- * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ ! # include "private/gc_priv.h" # ifdef PCR /* *************** PCR_GC_Run(void) *** 170,173 **** --- 169,178 ---- return PCR_ERes_okay; } + void GC_push_thread_structures(void) + { + /* PCR doesn't work unless static roots are pushed. Can't get here. */ + ABORT("In GC_push_thread_structures()"); + } + # endif diff -Nrc3pad gcc-3.0.4/boehm-gc/powerpc_macosx_mach_dep.s gcc-3.1/boehm-gc/powerpc_macosx_mach_dep.s *** gcc-3.0.4/boehm-gc/powerpc_macosx_mach_dep.s Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/powerpc_macosx_mach_dep.s Sat Aug 18 01:04:43 2001 *************** *** 0 **** --- 1,95 ---- + + .text + + .set linkageArea,24 + .set params,4 + .set alignment,4 + + .set spaceToSave,linkageArea+params+alignment + .set spaceToSave8,spaceToSave+8 + + ; Mark from machine registers that are saved by C compiler + .globl _GC_push_regs + _GC_push_regs: + ; PROLOG + mflr r0 ; get return address + stw r0,8(r1) ; save return address + stwu r1,-spaceToSave(r1) ; skip over caller save area + ; + mr r3,r2 ; mark from r2. Well Im not really sure + ; that this is necessary or even the right + ; thing to do - at least it doesnt harm... + ; According to Apples docs it points to + ; the direct data area, whatever that is... + bl L_GC_push_one$stub + mr r3,r13 ; mark from r13-r31 + bl L_GC_push_one$stub + mr r3,r14 + bl L_GC_push_one$stub + mr r3,r15 + bl L_GC_push_one$stub + mr r3,r16 + bl L_GC_push_one$stub + mr r3,r17 + bl L_GC_push_one$stub + mr r3,r18 + bl L_GC_push_one$stub + mr r3,r19 + bl L_GC_push_one$stub + mr r3,r20 + bl L_GC_push_one$stub + mr r3,r21 + bl L_GC_push_one$stub + mr r3,r22 + bl L_GC_push_one$stub + mr r3,r23 + bl L_GC_push_one$stub + mr r3,r24 + bl L_GC_push_one$stub + mr r3,r25 + bl L_GC_push_one$stub + mr r3,r26 + bl L_GC_push_one$stub + mr r3,r27 + bl L_GC_push_one$stub + mr r3,r28 + bl L_GC_push_one$stub + mr r3,r29 + bl L_GC_push_one$stub + mr r3,r30 + bl L_GC_push_one$stub + mr r3,r31 + bl L_GC_push_one$stub + ; EPILOG + lwz r0,spaceToSave8(r1) ; get return address back + mtlr r0 ; reset link register + addic r1,r1,spaceToSave ; restore stack pointer + blr + + .data + .picsymbol_stub + L_GC_push_one$stub: + .indirect_symbol _GC_push_one + mflr r0 + bcl 20,31,L0$_GC_push_one + L0$_GC_push_one: + mflr r11 + addis r11,r11,ha16(L_GC_push_one$lazy_ptr-L0$_GC_push_one) + mtlr r0 + lwz r12,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)(r11) + mtctr r12 + addi r11,r11,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one) + bctr + .data + .lazy_symbol_pointer + L_GC_push_one$lazy_ptr: + .indirect_symbol _GC_push_one + .long dyld_stub_binding_helper + .non_lazy_symbol_pointer + L_GC_push_one$non_lazy_ptr: + .indirect_symbol _GC_push_one + .long 0 + + + + diff -Nrc3pad gcc-3.0.4/boehm-gc/ptr_chck.c gcc-3.1/boehm-gc/ptr_chck.c *** gcc-3.0.4/boehm-gc/ptr_chck.c Wed Jun 30 12:44:18 1999 --- gcc-3.1/boehm-gc/ptr_chck.c Fri Aug 17 18:30:46 2001 *************** *** 10,19 **** * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ - /* Boehm, September 19, 1995 1:26 pm PDT */ ! #include "gc_priv.h" ! #include "gc_mark.h" #ifdef __STDC__ void GC_default_same_obj_print_proc(GC_PTR p, GC_PTR q) --- 10,22 ---- * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ ! /* ! * These are checking routines calls to which could be inserted by a ! * preprocessor to validate C pointer arithmetic. ! */ ! ! #include "private/gc_pmark.h" #ifdef __STDC__ void GC_default_same_obj_print_proc(GC_PTR p, GC_PTR q) *************** void (*GC_same_obj_print_proc) GC_PROTO( *** 69,75 **** h = FORWARDED_ADDR(h, hhdr); hhdr = HDR(h); } ! limit = (ptr_t)((word *)h + HDR_WORDS + hhdr -> hb_sz); if ((ptr_t)p >= limit || (ptr_t)q >= limit || (ptr_t)q < (ptr_t)h ) { goto fail; } --- 72,78 ---- h = FORWARDED_ADDR(h, hhdr); hhdr = HDR(h); } ! limit = (ptr_t)((word *)h + hhdr -> hb_sz); if ((ptr_t)p >= limit || (ptr_t)q >= limit || (ptr_t)q < (ptr_t)h ) { goto fail; } *************** void (*GC_same_obj_print_proc) GC_PROTO( *** 83,110 **** goto fail; } } else { ! # ifdef ALL_INTERIOR_POINTERS ! register map_entry_type map_entry; ! register int pdispl; ! ! pdispl = HBLKDISPL(p); ! map_entry = MAP_ENTRY((hhdr -> hb_map), pdispl); ! if (map_entry == OBJ_INVALID) { ! goto fail; ! } else { ! base = (char *)((word)p & ~(WORDS_TO_BYTES(1) - 1)); ! base -= WORDS_TO_BYTES(map_entry); ! } ! # else ! register int offset = HBLKDISPL(p) - HDR_BYTES; ! register word correction = offset % sz; ! ! if (HBLKPTR(p) != HBLKPTR(q)) { ! /* The following computation otherwise fails in this case */ ! goto fail; ! } ! base = (ptr_t)p - correction; ! # endif limit = base + sz; } /* [base, limit) delimits the object containing p, if any. */ --- 86,104 ---- goto fail; } } else { ! register int map_entry; ! register int pdispl = HBLKDISPL(p); ! ! map_entry = MAP_ENTRY((hhdr -> hb_map), pdispl); ! if (map_entry > CPP_MAX_OFFSET) { ! map_entry = BYTES_TO_WORDS(pdispl) % BYTES_TO_WORDS(sz); ! if (HBLKPTR(p) != HBLKPTR(q)) goto fail; ! /* W/o this check, we might miss an error if */ ! /* q points to the first object on a page, and */ ! /* points just before the page. */ ! } ! base = (char *)((word)p & ~(WORDS_TO_BYTES(1) - 1)); ! base -= WORDS_TO_BYTES(map_entry); limit = base + sz; } /* [base, limit) delimits the object containing p, if any. */ *************** void (*GC_is_valid_displacement_print_pr *** 137,143 **** /* Check that if p is a pointer to a heap page, then it points to */ /* a valid displacement within a heap object. */ ! /* Uninteresting with ALL_INTERIOR_POINTERS. */ /* Always returns its argument. */ /* Note that we don't lock, since nothing relevant about the header */ /* should change while we have a valid object pointer to the block. */ --- 131,137 ---- /* Check that if p is a pointer to a heap page, then it points to */ /* a valid displacement within a heap object. */ ! /* Uninteresting with GC_all_interior_pointers. */ /* Always returns its argument. */ /* Note that we don't lock, since nothing relevant about the header */ /* should change while we have a valid object pointer to the block. */ *************** void (*GC_is_valid_displacement_print_pr *** 158,169 **** hhdr = HDR((word)p); if (hhdr == 0) return(p); h = HBLKPTR(p); ! # ifdef ALL_INTERIOR_POINTERS while (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { h = FORWARDED_ADDR(h, hhdr); hhdr = HDR(h); } ! # endif if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { goto fail; } --- 152,163 ---- hhdr = HDR((word)p); if (hhdr == 0) return(p); h = HBLKPTR(p); ! if (GC_all_interior_pointers) { while (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { h = FORWARDED_ADDR(h, hhdr); hhdr = HDR(h); } ! } if (IS_FORWARDING_ADDR_OR_NIL(hhdr)) { goto fail; } *************** ptr_t p; *** 252,258 **** if (GC_is_static_root(p)) return(p); /* Else do it again correctly: */ ! # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || defined(PCR)) \ && !defined(SRC_M3) DISABLE_SIGNALS(); GC_register_dynamic_libraries(); --- 246,253 ---- if (GC_is_static_root(p)) return(p); /* Else do it again correctly: */ ! # if (defined(DYNAMIC_LOADING) || defined(MSWIN32) || \ ! defined(MSWINCE) || defined(PCR)) \ && !defined(SRC_M3) DISABLE_SIGNALS(); GC_register_dynamic_libraries(); *************** ptr_t p; *** 270,292 **** if (HBLKPTR(base) != HBLKPTR(p)) hhdr = HDR((word)p); descr = hhdr -> hb_descr; retry: ! switch(descr & DS_TAGS) { ! case DS_LENGTH: if ((word)((ptr_t)p - (ptr_t)base) > (word)descr) goto fail; break; ! case DS_BITMAP: if ((ptr_t)p - (ptr_t)base >= WORDS_TO_BYTES(BITMAP_BITS) || ((word)p & (sizeof(word) - 1))) goto fail; if (!((1 << (WORDSZ - ((ptr_t)p - (ptr_t)base) - 1)) & descr)) goto fail; break; ! case DS_PROC: /* We could try to decipher this partially. */ /* For now we just punt. */ break; ! case DS_PER_OBJECT: ! descr = *(word *)((ptr_t)base + (descr & ~DS_TAGS)); goto retry; } return(p); --- 265,294 ---- if (HBLKPTR(base) != HBLKPTR(p)) hhdr = HDR((word)p); descr = hhdr -> hb_descr; retry: ! switch(descr & GC_DS_TAGS) { ! case GC_DS_LENGTH: if ((word)((ptr_t)p - (ptr_t)base) > (word)descr) goto fail; break; ! case GC_DS_BITMAP: if ((ptr_t)p - (ptr_t)base >= WORDS_TO_BYTES(BITMAP_BITS) || ((word)p & (sizeof(word) - 1))) goto fail; if (!((1 << (WORDSZ - ((ptr_t)p - (ptr_t)base) - 1)) & descr)) goto fail; break; ! case GC_DS_PROC: /* We could try to decipher this partially. */ /* For now we just punt. */ break; ! case GC_DS_PER_OBJECT: ! if ((signed_word)descr >= 0) { ! descr = *(word *)((ptr_t)base + (descr & ~GC_DS_TAGS)); ! } else { ! ptr_t type_descr = *(ptr_t *)base; ! descr = *(word *)(type_descr ! - (descr - (GC_DS_PER_OBJECT ! - GC_INDIR_PER_OBJ_BIAS))); ! } goto retry; } return(p); *************** size_t how_much; *** 305,313 **** GC_PTR initial = *p; GC_PTR result = GC_same_obj((GC_PTR)((word)initial + how_much), initial); ! # ifndef ALL_INTERIOR_POINTERS (void) GC_is_valid_displacement(result); ! # endif return (*p = result); } --- 307,315 ---- GC_PTR initial = *p; GC_PTR result = GC_same_obj((GC_PTR)((word)initial + how_much), initial); ! if (!GC_all_interior_pointers) { (void) GC_is_valid_displacement(result); ! } return (*p = result); } *************** size_t how_much; *** 318,326 **** GC_PTR initial = *p; GC_PTR result = GC_same_obj((GC_PTR)((word)initial + how_much), initial); ! # ifndef ALL_INTERIOR_POINTERS (void) GC_is_valid_displacement(result); ! # endif *p = result; return(initial); } --- 320,328 ---- GC_PTR initial = *p; GC_PTR result = GC_same_obj((GC_PTR)((word)initial + how_much), initial); ! if (!GC_all_interior_pointers) { (void) GC_is_valid_displacement(result); ! } *p = result; return(initial); } diff -Nrc3pad gcc-3.0.4/boehm-gc/reclaim.c gcc-3.1/boehm-gc/reclaim.c *** gcc-3.0.4/boehm-gc/reclaim.c Tue Jun 20 01:04:58 2000 --- gcc-3.1/boehm-gc/reclaim.c Fri Mar 29 22:33:34 2002 *************** *** 15,25 **** */ #include ! #include "gc_priv.h" signed_word GC_mem_found = 0; /* Number of words of memory reclaimed */ static void report_leak(p, sz) ptr_t p; word sz; --- 15,32 ---- */ #include ! #include "private/gc_priv.h" signed_word GC_mem_found = 0; /* Number of words of memory reclaimed */ + #if defined(PARALLEL_MARK) || defined(THREAD_LOCAL_ALLOC) + word GC_fl_builder_count = 0; + /* Number of threads currently building free lists without */ + /* holding GC lock. It is not safe to collect if this is */ + /* nonzero. */ + #endif /* PARALLEL_MARK */ + static void report_leak(p, sz) ptr_t p; word sz; *************** word sz; *** 54,62 **** GC_bool GC_block_empty(hhdr) register hdr * hhdr; { register word *p = (word *)(&(hhdr -> hb_marks[0])); register word * plim = ! (word *)(&(hhdr -> hb_marks[MARK_BITS_SZ])); while (p < plim) { if (*p++) return(FALSE); } --- 61,72 ---- GC_bool GC_block_empty(hhdr) register hdr * hhdr; { + /* We treat hb_marks as an array of words here, even if it is */ + /* actually an array of bytes. Since we only check for zero, there */ + /* are no endian-ness issues. */ register word *p = (word *)(&(hhdr -> hb_marks[0])); register word * plim = ! (word *)(&(hhdr -> hb_marks[MARK_BITS_SZ])); while (p < plim) { if (*p++) return(FALSE); } *************** register hdr * hhdr; *** 70,76 **** # define GC_block_nearly_full1(hhdr, pat1) DONT_KNOW # define GC_block_nearly_full3(hhdr, pat1, pat2) DONT_KNOW # define GC_block_nearly_full(hhdr) DONT_KNOW ! #else /* * Test whether nearly all of the mark words consist of the same --- 80,124 ---- # define GC_block_nearly_full1(hhdr, pat1) DONT_KNOW # define GC_block_nearly_full3(hhdr, pat1, pat2) DONT_KNOW # define GC_block_nearly_full(hhdr) DONT_KNOW ! #endif ! ! #if !defined(SMALL_CONFIG) && defined(USE_MARK_BYTES) ! ! # define GC_block_nearly_full1(hhdr, pat1) GC_block_nearly_full(hhdr) ! # define GC_block_nearly_full3(hhdr, pat1, pat2) GC_block_nearly_full(hhdr) ! ! ! GC_bool GC_block_nearly_full(hhdr) ! register hdr * hhdr; ! { ! /* We again treat hb_marks as an array of words, even though it */ ! /* isn't. We first sum up all the words, resulting in a word */ ! /* containing 4 or 8 separate partial sums. */ ! /* We then sum the bytes in the word of partial sums. */ ! /* This is still endian independant. This fails if the partial */ ! /* sums can overflow. */ ! # if (BYTES_TO_WORDS(MARK_BITS_SZ)) >= 256 ! --> potential overflow; fix the code ! # endif ! register word *p = (word *)(&(hhdr -> hb_marks[0])); ! register word * plim = ! (word *)(&(hhdr -> hb_marks[MARK_BITS_SZ])); ! word sum_vector = 0; ! unsigned sum; ! while (p < plim) { ! sum_vector += *p; ! ++p; ! } ! sum = 0; ! while (sum_vector > 0) { ! sum += sum_vector & 0xff; ! sum_vector >>= 8; ! } ! return (sum > BYTES_TO_WORDS(7*HBLKSIZE/8)/(hhdr -> hb_sz)); ! } ! #endif /* USE_MARK_BYTES */ ! ! #if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) /* * Test whether nearly all of the mark words consist of the same *************** hdr *hhdr; *** 139,146 **** # if CPP_WORDSZ != 32 && CPP_WORDSZ != 64 return DONT_KNOW; /* Shouldn't be used in any standard config. */ # endif - if (0 != HDR_WORDS) return DONT_KNOW; - /* Also shouldn't happen */ # if CPP_WORDSZ == 32 switch(sz) { case 1: --- 187,192 ---- *************** hdr *hhdr; *** 194,205 **** } # endif } ! #endif /* !SMALL_CONFIG */ ! # ifdef GATHERSTATS # define INCR_WORDS(sz) n_words_found += (sz) # else # define INCR_WORDS(sz) # endif /* * Restore unmarked small objects in h of size sz to the object --- 240,267 ---- } # endif } ! #endif /* !SMALL_CONFIG && !USE_MARK_BYTES */ ! /* We keep track of reclaimed memory if we are either asked to, or */ ! /* we are using the parallel marker. In the latter case, we assume */ ! /* that most allocation goes through GC_malloc_many for scalability. */ ! /* GC_malloc_many needs the count anyway. */ ! # if defined(GATHERSTATS) || defined(PARALLEL_MARK) # define INCR_WORDS(sz) n_words_found += (sz) + # define COUNT_PARAM , count + # define COUNT_ARG , count + # define COUNT_DECL signed_word * count; + # define NWORDS_DECL signed_word n_words_found = 0; + # define COUNT_UPDATE *count += n_words_found; + # define MEM_FOUND_ADDR , &GC_mem_found # else # define INCR_WORDS(sz) + # define COUNT_PARAM + # define COUNT_ARG + # define COUNT_DECL + # define NWORDS_DECL + # define COUNT_UPDATE + # define MEM_FOUND_ADDR # endif /* * Restore unmarked small objects in h of size sz to the object *************** hdr *hhdr; *** 207,226 **** * Clears unmarked objects. */ /*ARGSUSED*/ ! ptr_t GC_reclaim_clear(hbp, hhdr, sz, list) register struct hblk *hbp; /* ptr to current heap block */ register hdr * hhdr; register ptr_t list; register word sz; { register int word_no; register word *p, *q, *plim; ! # ifdef GATHERSTATS ! register int n_words_found = 0; ! # endif p = (word *)(hbp->hb_body); ! word_no = HDR_WORDS; plim = (word *)((((word)hbp) + HBLKSIZE) - WORDS_TO_BYTES(sz)); --- 269,288 ---- * Clears unmarked objects. */ /*ARGSUSED*/ ! ptr_t GC_reclaim_clear(hbp, hhdr, sz, list COUNT_PARAM) register struct hblk *hbp; /* ptr to current heap block */ register hdr * hhdr; register ptr_t list; register word sz; + COUNT_DECL { register int word_no; register word *p, *q, *plim; ! NWORDS_DECL + GC_ASSERT(hhdr == GC_find_header((ptr_t)hbp)); p = (word *)(hbp->hb_body); ! word_no = 0; plim = (word *)((((word)hbp) + HBLKSIZE) - WORDS_TO_BYTES(sz)); *************** register word sz; *** 235,271 **** list = ((ptr_t)p); /* Clear object, advance p to next object in the process */ q = p + sz; ! p++; /* Skip link field */ ! while (p < q) { *p++ = 0; ! } } word_no += sz; } ! # ifdef GATHERSTATS ! GC_mem_found += n_words_found; ! # endif return(list); } ! #ifndef SMALL_CONFIG /* * A special case for 2 word composite objects (e.g. cons cells): */ /*ARGSUSED*/ ! ptr_t GC_reclaim_clear2(hbp, hhdr, list) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; { ! register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p, *plim; - # ifdef GATHERSTATS - register int n_words_found = 0; - # endif register word mark_word; register int i; # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ --- 297,341 ---- list = ((ptr_t)p); /* Clear object, advance p to next object in the process */ q = p + sz; ! # ifdef USE_MARK_BYTES ! GC_ASSERT(!(sz & 1) ! && !((word)p & (2 * sizeof(word) - 1))); ! p[1] = 0; ! p += 2; ! while (p < q) { ! CLEAR_DOUBLE(p); ! p += 2; ! } ! # else ! p++; /* Skip link field */ ! while (p < q) { *p++ = 0; ! } ! # endif } word_no += sz; } ! COUNT_UPDATE return(list); } ! #if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) /* * A special case for 2 word composite objects (e.g. cons cells): */ /*ARGSUSED*/ ! ptr_t GC_reclaim_clear2(hbp, hhdr, list COUNT_PARAM) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; + COUNT_DECL { ! register word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p, *plim; register word mark_word; register int i; + NWORDS_DECL # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ *************** register ptr_t list; *** 289,297 **** mark_word >>= 8; } } ! # ifdef GATHERSTATS ! GC_mem_found += n_words_found; ! # endif return(list); # undef DO_OBJ } --- 359,365 ---- mark_word >>= 8; } } ! COUNT_UPDATE return(list); # undef DO_OBJ } *************** register ptr_t list; *** 300,316 **** * Another special case for 4 word composite objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_clear4(hbp, hhdr, list) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; { ! register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p, *plim; - # ifdef GATHERSTATS - register int n_words_found = 0; - # endif register word mark_word; # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ --- 368,383 ---- * Another special case for 4 word composite objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_clear4(hbp, hhdr, list COUNT_PARAM) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; + COUNT_DECL { ! register word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p, *plim; register word mark_word; + NWORDS_DECL # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ *************** register ptr_t list; *** 346,376 **** # endif p += WORDSZ; } ! # ifdef GATHERSTATS ! GC_mem_found += n_words_found; ! # endif return(list); # undef DO_OBJ } ! #endif /* !SMALL_CONFIG */ /* The same thing, but don't clear objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_uninit(hbp, hhdr, sz, list) register struct hblk *hbp; /* ptr to current heap block */ register hdr * hhdr; register ptr_t list; register word sz; { ! register int word_no; register word *p, *plim; ! # ifdef GATHERSTATS ! register int n_words_found = 0; ! # endif p = (word *)(hbp->hb_body); - word_no = HDR_WORDS; plim = (word *)((((word)hbp) + HBLKSIZE) - WORDS_TO_BYTES(sz)); --- 413,439 ---- # endif p += WORDSZ; } ! COUNT_UPDATE return(list); # undef DO_OBJ } ! #endif /* !SMALL_CONFIG && !USE_MARK_BYTES */ /* The same thing, but don't clear objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_uninit(hbp, hhdr, sz, list COUNT_PARAM) register struct hblk *hbp; /* ptr to current heap block */ register hdr * hhdr; register ptr_t list; register word sz; + COUNT_DECL { ! register int word_no = 0; register word *p, *plim; ! NWORDS_DECL p = (word *)(hbp->hb_body); plim = (word *)((((word)hbp) + HBLKSIZE) - WORDS_TO_BYTES(sz)); *************** register word sz; *** 385,393 **** p += sz; word_no += sz; } ! # ifdef GATHERSTATS ! GC_mem_found += n_words_found; ! # endif return(list); } --- 448,454 ---- p += sz; word_no += sz; } ! COUNT_UPDATE return(list); } *************** register struct hblk *hbp; /* ptr to cur *** 398,411 **** register hdr * hhdr; register word sz; { ! register int word_no; register word *p, *plim; # ifdef GATHERSTATS register int n_words_found = 0; # endif p = (word *)(hbp->hb_body); - word_no = HDR_WORDS; plim = (word *)((((word)hbp) + HBLKSIZE) - WORDS_TO_BYTES(sz)); --- 459,471 ---- register hdr * hhdr; register word sz; { ! register int word_no = 0; register word *p, *plim; # ifdef GATHERSTATS register int n_words_found = 0; # endif p = (word *)(hbp->hb_body); plim = (word *)((((word)hbp) + HBLKSIZE) - WORDS_TO_BYTES(sz)); *************** register word sz; *** 419,441 **** } } ! #ifndef SMALL_CONFIG /* * Another special case for 2 word atomic objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_uninit2(hbp, hhdr, list) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; { ! register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p, *plim; - # ifdef GATHERSTATS - register int n_words_found = 0; - # endif register word mark_word; register int i; # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ --- 479,500 ---- } } ! #if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) /* * Another special case for 2 word atomic objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_uninit2(hbp, hhdr, list COUNT_PARAM) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; + COUNT_DECL { ! register word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p, *plim; register word mark_word; register int i; + NWORDS_DECL # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ *************** register ptr_t list; *** 458,466 **** mark_word >>= 8; } } ! # ifdef GATHERSTATS ! GC_mem_found += n_words_found; ! # endif return(list); # undef DO_OBJ } --- 517,523 ---- mark_word >>= 8; } } ! COUNT_UPDATE return(list); # undef DO_OBJ } *************** register ptr_t list; *** 469,485 **** * Another special case for 4 word atomic objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_uninit4(hbp, hhdr, list) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; { ! register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p, *plim; - # ifdef GATHERSTATS - register int n_words_found = 0; - # endif register word mark_word; # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ --- 526,541 ---- * Another special case for 4 word atomic objects: */ /*ARGSUSED*/ ! ptr_t GC_reclaim_uninit4(hbp, hhdr, list COUNT_PARAM) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; + COUNT_DECL { ! register word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p, *plim; register word mark_word; + NWORDS_DECL # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ *************** register ptr_t list; *** 513,539 **** # endif p += WORDSZ; } ! # ifdef GATHERSTATS ! GC_mem_found += n_words_found; ! # endif return(list); # undef DO_OBJ } /* Finally the one word case, which never requires any clearing: */ /*ARGSUSED*/ ! ptr_t GC_reclaim1(hbp, hhdr, list) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; { ! register word * mark_word_addr = &(hhdr->hb_marks[divWORDSZ(HDR_WORDS)]); register word *p, *plim; - # ifdef GATHERSTATS - register int n_words_found = 0; - # endif register word mark_word; register int i; # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ --- 569,592 ---- # endif p += WORDSZ; } ! COUNT_UPDATE return(list); # undef DO_OBJ } /* Finally the one word case, which never requires any clearing: */ /*ARGSUSED*/ ! ptr_t GC_reclaim1(hbp, hhdr, list COUNT_PARAM) register struct hblk *hbp; /* ptr to current heap block */ hdr * hhdr; register ptr_t list; + COUNT_DECL { ! register word * mark_word_addr = &(hhdr->hb_marks[0]); register word *p, *plim; register word mark_word; register int i; + NWORDS_DECL # define DO_OBJ(start_displ) \ if (!(mark_word & ((word)1 << start_displ))) { \ p[start_displ] = (word)list; \ *************** register ptr_t list; *** 556,682 **** mark_word >>= 4; } } ! # ifdef GATHERSTATS ! GC_mem_found += n_words_found; ! # endif return(list); # undef DO_OBJ } ! #endif /* !SMALL_CONFIG */ /* ! * Restore unmarked small objects in the block pointed to by hbp ! * to the appropriate object free list. ! * If entirely empty blocks are to be completely deallocated, then ! * caller should perform that check. */ ! void GC_reclaim_small_nonempty_block(hbp, report_if_found) ! register struct hblk *hbp; /* ptr to current heap block */ ! int report_if_found; /* Abort if a reclaimable object is found */ { ! hdr * hhdr; ! word sz; /* size of objects in current block */ ! struct obj_kind * ok; ! ptr_t * flh; ! int kind; ! GC_bool full; ! ! hhdr = HDR(hbp); ! sz = hhdr -> hb_sz; ! hhdr -> hb_last_reclaimed = (unsigned short) GC_gc_no; ! kind = hhdr -> hb_obj_kind; ! ok = &GC_obj_kinds[kind]; ! flh = &(ok -> ok_freelist[sz]); ! if (report_if_found) { ! GC_reclaim_check(hbp, hhdr, sz); ! } else if (ok -> ok_init) { switch(sz) { ! # ifndef SMALL_CONFIG case 1: ! # if CPP_WORDSZ == 64 ! full = GC_block_nearly_full1(hhdr, 0xffffffffffffffffl); ! # else ! full = GC_block_nearly_full1(hhdr, 0xffffffffl); ! # endif ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! /* In the DONT_KNOW case, we let reclaim fault. */ ! *flh = GC_reclaim1(hbp, hhdr, *flh); break; case 2: ! # if CPP_WORDSZ == 64 ! full = GC_block_nearly_full1(hhdr, 0x5555555555555555l); ! # else ! full = GC_block_nearly_full1(hhdr, 0x55555555l); ! # endif ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! *flh = GC_reclaim_clear2(hbp, hhdr, *flh); break; case 4: ! # if CPP_WORDSZ == 64 ! full = GC_block_nearly_full1(hhdr, 0x1111111111111111l); ! # else ! full = GC_block_nearly_full1(hhdr, 0x11111111l); ! # endif ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! *flh = GC_reclaim_clear4(hbp, hhdr, *flh); break; ! # endif default: ! full = GC_block_nearly_full(hhdr); ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! *flh = GC_reclaim_clear(hbp, hhdr, sz, *flh); break; } } else { switch(sz) { ! # ifndef SMALL_CONFIG case 1: ! # if CPP_WORDSZ == 64 ! full = GC_block_nearly_full1(hhdr, 0xffffffffffffffffl); ! # else ! full = GC_block_nearly_full1(hhdr, 0xffffffffl); ! # endif ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! *flh = GC_reclaim1(hbp, hhdr, *flh); break; case 2: ! # if CPP_WORDSZ == 64 ! full = GC_block_nearly_full1(hhdr, 0x5555555555555555l); ! # else ! full = GC_block_nearly_full1(hhdr, 0x55555555l); ! # endif ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! *flh = GC_reclaim_uninit2(hbp, hhdr, *flh); break; case 4: ! # if CPP_WORDSZ == 64 ! full = GC_block_nearly_full1(hhdr, 0x1111111111111111l); ! # else ! full = GC_block_nearly_full1(hhdr, 0x11111111l); ! # endif ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! *flh = GC_reclaim_uninit4(hbp, hhdr, *flh); break; ! # endif default: ! full = GC_block_nearly_full(hhdr); ! if (TRUE == full) goto out; ! if (FALSE == full) GC_write_hint(hbp); ! *flh = GC_reclaim_uninit(hbp, hhdr, sz, *flh); break; } } ! out: ! if (IS_UNCOLLECTABLE(kind)) GC_set_hdr_marks(hhdr); } /* --- 609,705 ---- mark_word >>= 4; } } ! COUNT_UPDATE return(list); # undef DO_OBJ } ! #endif /* !SMALL_CONFIG && !USE_MARK_BYTES */ /* ! * Generic procedure to rebuild a free list in hbp. ! * Also called directly from GC_malloc_many. */ ! ptr_t GC_reclaim_generic(hbp, hhdr, sz, init, list COUNT_PARAM) ! struct hblk *hbp; /* ptr to current heap block */ ! hdr * hhdr; ! GC_bool init; ! ptr_t list; ! word sz; ! COUNT_DECL { ! ptr_t result = list; ! GC_ASSERT(GC_find_header((ptr_t)hbp) == hhdr); ! GC_remove_protection(hbp, 1, (hhdr)->hb_descr == 0 /* Pointer-free? */); ! if (init) { switch(sz) { ! # if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) case 1: ! /* We now issue the hint even if GC_nearly_full returned */ ! /* DONT_KNOW. */ ! result = GC_reclaim1(hbp, hhdr, list COUNT_ARG); break; case 2: ! result = GC_reclaim_clear2(hbp, hhdr, list COUNT_ARG); break; case 4: ! result = GC_reclaim_clear4(hbp, hhdr, list COUNT_ARG); break; ! # endif /* !SMALL_CONFIG && !USE_MARK_BYTES */ default: ! result = GC_reclaim_clear(hbp, hhdr, sz, list COUNT_ARG); break; } } else { + GC_ASSERT((hhdr)->hb_descr == 0 /* Pointer-free block */); switch(sz) { ! # if !defined(SMALL_CONFIG) && !defined(USE_MARK_BYTES) case 1: ! result = GC_reclaim1(hbp, hhdr, list COUNT_ARG); break; case 2: ! result = GC_reclaim_uninit2(hbp, hhdr, list COUNT_ARG); break; case 4: ! result = GC_reclaim_uninit4(hbp, hhdr, list COUNT_ARG); break; ! # endif /* !SMALL_CONFIG && !USE_MARK_BYTES */ default: ! result = GC_reclaim_uninit(hbp, hhdr, sz, list COUNT_ARG); break; } } ! if (IS_UNCOLLECTABLE(hhdr -> hb_obj_kind)) GC_set_hdr_marks(hhdr); ! return result; ! } ! ! /* ! * Restore unmarked small objects in the block pointed to by hbp ! * to the appropriate object free list. ! * If entirely empty blocks are to be completely deallocated, then ! * caller should perform that check. ! */ ! void GC_reclaim_small_nonempty_block(hbp, report_if_found COUNT_PARAM) ! register struct hblk *hbp; /* ptr to current heap block */ ! int report_if_found; /* Abort if a reclaimable object is found */ ! COUNT_DECL ! { ! hdr *hhdr = HDR(hbp); ! word sz = hhdr -> hb_sz; ! int kind = hhdr -> hb_obj_kind; ! struct obj_kind * ok = &GC_obj_kinds[kind]; ! ptr_t * flh = &(ok -> ok_freelist[sz]); ! ! hhdr -> hb_last_reclaimed = (unsigned short) GC_gc_no; ! ! if (report_if_found) { ! GC_reclaim_check(hbp, hhdr, sz); ! } else { ! *flh = GC_reclaim_generic(hbp, hhdr, sz, ! (ok -> ok_init || GC_debugging_started), ! *flh MEM_FOUND_ADDR); ! } } /* *************** out: *** 687,695 **** * If report_if_found is TRUE, then process any block immediately, and * simply report free objects; do not actually reclaim them. */ ! void GC_reclaim_block(hbp, report_if_found) ! register struct hblk *hbp; /* ptr to current heap block */ ! word report_if_found; /* Abort if a reclaimable object is found */ { register hdr * hhdr; register word sz; /* size of objects in current block */ --- 710,722 ---- * If report_if_found is TRUE, then process any block immediately, and * simply report free objects; do not actually reclaim them. */ ! # if defined(__STDC__) || defined(__cplusplus) ! void GC_reclaim_block(register struct hblk *hbp, word report_if_found) ! # else ! void GC_reclaim_block(hbp, report_if_found) ! register struct hblk *hbp; /* ptr to current heap block */ ! word report_if_found; /* Abort if a reclaimable object is found */ ! # endif { register hdr * hhdr; register word sz; /* size of objects in current block */ *************** word report_if_found; /* Abort if a rec *** 701,710 **** ok = &GC_obj_kinds[hhdr -> hb_obj_kind]; if( sz > MAXOBJSZ ) { /* 1 big object */ ! if( !mark_bit_from_hdr(hhdr, HDR_WORDS) ) { if (report_if_found) { ! FOUND_FREE(hbp, HDR_WORDS); } else { # ifdef GATHERSTATS GC_mem_found += sz; # endif --- 728,741 ---- ok = &GC_obj_kinds[hhdr -> hb_obj_kind]; if( sz > MAXOBJSZ ) { /* 1 big object */ ! if( !mark_bit_from_hdr(hhdr, 0) ) { if (report_if_found) { ! FOUND_FREE(hbp, 0); } else { + word blocks = OBJ_SZ_TO_BLOCKS(sz); + if (blocks > 1) { + GC_large_allocd_bytes -= blocks * HBLKSIZE; + } # ifdef GATHERSTATS GC_mem_found += sz; # endif *************** word report_if_found; /* Abort if a rec *** 714,731 **** } else { GC_bool empty = GC_block_empty(hhdr); if (report_if_found) { ! GC_reclaim_small_nonempty_block(hbp, (int)report_if_found); } else if (empty) { # ifdef GATHERSTATS GC_mem_found += BYTES_TO_WORDS(HBLKSIZE); # endif GC_freehblk(hbp); ! } else { /* group of smaller objects, enqueue the real work */ rlh = &(ok -> ok_reclaim_list[sz]); hhdr -> hb_next = *rlh; *rlh = hbp; ! } } } --- 745,767 ---- } else { GC_bool empty = GC_block_empty(hhdr); if (report_if_found) { ! GC_reclaim_small_nonempty_block(hbp, (int)report_if_found ! MEM_FOUND_ADDR); } else if (empty) { # ifdef GATHERSTATS GC_mem_found += BYTES_TO_WORDS(HBLKSIZE); # endif GC_freehblk(hbp); ! } else if (TRUE != GC_block_nearly_full(hhdr)){ /* group of smaller objects, enqueue the real work */ rlh = &(ok -> ok_reclaim_list[sz]); hhdr -> hb_next = *rlh; *rlh = hbp; ! } /* else not worth salvaging. */ ! /* We used to do the nearly_full check later, but we */ ! /* already have the right cache context here. Also */ ! /* doing it here avoids some silly lock contention in */ ! /* GC_malloc_many. */ } } *************** word report_if_found; /* Abort if a rec *** 733,740 **** /* Routines to gather and print heap block info */ /* intended for debugging. Otherwise should be called */ /* with lock. */ ! static size_t number_of_blocks; ! static size_t total_bytes; /* Number of set bits in a word. Not performance critical. */ static int set_bits(n) --- 769,797 ---- /* Routines to gather and print heap block info */ /* intended for debugging. Otherwise should be called */ /* with lock. */ ! ! struct Print_stats ! { ! size_t number_of_blocks; ! size_t total_bytes; ! }; ! ! #ifdef USE_MARK_BYTES ! ! /* Return the number of set mark bits in the given header */ ! int GC_n_set_marks(hhdr) ! hdr * hhdr; ! { ! register int result = 0; ! register int i; ! ! for (i = 0; i < MARK_BITS_SZ; i++) { ! result += hhdr -> hb_marks[i]; ! } ! return(result); ! } ! ! #else /* Number of set bits in a word. Not performance critical. */ static int set_bits(n) *************** hdr * hhdr; *** 763,799 **** return(result); } /*ARGSUSED*/ ! void GC_print_block_descr(h, dummy) ! struct hblk *h; ! word dummy; { register hdr * hhdr = HDR(h); register size_t bytes = WORDS_TO_BYTES(hhdr -> hb_sz); GC_printf3("(%lu:%lu,%lu)", (unsigned long)(hhdr -> hb_obj_kind), (unsigned long)bytes, (unsigned long)(GC_n_set_marks(hhdr))); ! bytes += HDR_BYTES + HBLKSIZE-1; bytes &= ~(HBLKSIZE-1); ! total_bytes += bytes; ! number_of_blocks++; } void GC_print_block_list() { GC_printf0("(kind(0=ptrfree,1=normal,2=unc.,3=stubborn):size_in_bytes, #_marks_set)\n"); ! number_of_blocks = 0; ! total_bytes = 0; ! GC_apply_to_all_blocks(GC_print_block_descr, (word)0); GC_printf2("\nblocks = %lu, bytes = %lu\n", ! (unsigned long)number_of_blocks, ! (unsigned long)total_bytes); } #endif /* NO_DEBUGGING */ /* * Perform GC_reclaim_block on the entire heap, after first clearing * small object free lists (if we are not just looking for leaks). */ --- 820,886 ---- return(result); } + #endif /* !USE_MARK_BYTES */ + /*ARGSUSED*/ ! # if defined(__STDC__) || defined(__cplusplus) ! void GC_print_block_descr(struct hblk *h, word dummy) ! # else ! void GC_print_block_descr(h, dummy) ! struct hblk *h; ! word dummy; ! # endif { register hdr * hhdr = HDR(h); register size_t bytes = WORDS_TO_BYTES(hhdr -> hb_sz); + struct Print_stats *ps; GC_printf3("(%lu:%lu,%lu)", (unsigned long)(hhdr -> hb_obj_kind), (unsigned long)bytes, (unsigned long)(GC_n_set_marks(hhdr))); ! bytes += HBLKSIZE-1; bytes &= ~(HBLKSIZE-1); ! ! ps = (struct Print_stats *)dummy; ! ps->total_bytes += bytes; ! ps->number_of_blocks++; } void GC_print_block_list() { + struct Print_stats pstats; + GC_printf0("(kind(0=ptrfree,1=normal,2=unc.,3=stubborn):size_in_bytes, #_marks_set)\n"); ! pstats.number_of_blocks = 0; ! pstats.total_bytes = 0; ! GC_apply_to_all_blocks(GC_print_block_descr, (word)&pstats); GC_printf2("\nblocks = %lu, bytes = %lu\n", ! (unsigned long)pstats.number_of_blocks, ! (unsigned long)pstats.total_bytes); } #endif /* NO_DEBUGGING */ /* + * Clear all obj_link pointers in the list of free objects *flp. + * Clear *flp. + * This must be done before dropping a list of free gcj-style objects, + * since may otherwise end up with dangling "descriptor" pointers. + * It may help for other pointer-containg objects. + */ + void GC_clear_fl_links(flp) + ptr_t *flp; + { + ptr_t next = *flp; + + while (0 != next) { + *flp = 0; + flp = &(obj_link(next)); + next = *flp; + } + } + + /* * Perform GC_reclaim_block on the entire heap, after first clearing * small object free lists (if we are not just looking for leaks). */ *************** int report_if_found; /* Abort if a GC_r *** 802,820 **** { int kind; /* Clear reclaim- and free-lists */ for (kind = 0; kind < GC_n_kinds; kind++) { ! register ptr_t *fop; ! register ptr_t *lim; ! register struct hblk ** rlp; ! register struct hblk ** rlim; ! register struct hblk ** rlist = GC_obj_kinds[kind].ok_reclaim_list; if (rlist == 0) continue; /* This kind not used. */ if (!report_if_found) { lim = &(GC_obj_kinds[kind].ok_freelist[MAXOBJSZ+1]); for( fop = GC_obj_kinds[kind].ok_freelist; fop < lim; fop++ ) { ! *fop = 0; } } /* otherwise free list objects are marked, */ /* and its safe to leave them */ --- 889,917 ---- { int kind; + # if defined(PARALLEL_MARK) || defined(THREAD_LOCAL_ALLOC) + GC_ASSERT(0 == GC_fl_builder_count); + # endif /* Clear reclaim- and free-lists */ for (kind = 0; kind < GC_n_kinds; kind++) { ! ptr_t *fop; ! ptr_t *lim; ! struct hblk ** rlp; ! struct hblk ** rlim; ! struct hblk ** rlist = GC_obj_kinds[kind].ok_reclaim_list; ! GC_bool should_clobber = (GC_obj_kinds[kind].ok_descriptor != 0); if (rlist == 0) continue; /* This kind not used. */ if (!report_if_found) { lim = &(GC_obj_kinds[kind].ok_freelist[MAXOBJSZ+1]); for( fop = GC_obj_kinds[kind].ok_freelist; fop < lim; fop++ ) { ! if (*fop != 0) { ! if (should_clobber) { ! GC_clear_fl_links(fop); ! } else { ! *fop = 0; ! } ! } } } /* otherwise free list objects are marked, */ /* and its safe to leave them */ *************** int report_if_found; /* Abort if a GC_r *** 838,843 **** --- 935,943 ---- /* so that you can convince yourself that it really is very stupid. */ GC_reclaim_all((GC_stop_func)0, FALSE); # endif + # if defined(PARALLEL_MARK) || defined(THREAD_LOCAL_ALLOC) + GC_ASSERT(0 == GC_fl_builder_count); + # endif } *************** int kind; *** 861,867 **** while ((hbp = *rlh) != 0) { hhdr = HDR(hbp); *rlh = hhdr -> hb_next; ! GC_reclaim_small_nonempty_block(hbp, FALSE); if (*flh != 0) break; } } --- 961,967 ---- while ((hbp = *rlh) != 0) { hhdr = HDR(hbp); *rlh = hhdr -> hb_next; ! GC_reclaim_small_nonempty_block(hbp, FALSE MEM_FOUND_ADDR); if (*flh != 0) break; } } *************** GC_bool ignore_old; *** 909,915 **** /* It's likely we'll need it this time, too */ /* It's been touched recently, so this */ /* shouldn't trigger paging. */ ! GC_reclaim_small_nonempty_block(hbp, FALSE); } } } --- 1009,1015 ---- /* It's likely we'll need it this time, too */ /* It's been touched recently, so this */ /* shouldn't trigger paging. */ ! GC_reclaim_small_nonempty_block(hbp, FALSE MEM_FOUND_ADDR); } } } diff -Nrc3pad gcc-3.0.4/boehm-gc/rs6000_mach_dep.s gcc-3.1/boehm-gc/rs6000_mach_dep.s *** gcc-3.0.4/boehm-gc/rs6000_mach_dep.s Wed Jun 30 12:44:26 1999 --- gcc-3.1/boehm-gc/rs6000_mach_dep.s Fri Jan 25 18:06:23 2002 *************** *** 1,4 **** - .csect .set r0,0 .set r1,1 .set r2,2 --- 1,3 ---- *************** *** 32,41 **** .set r30,30 .set r31,31 # Mark from machine registers that are saved by C compiler .globl .GC_push_regs .GC_push_regs: - .extern .GC_push_one stu r1,-64(r1) # reserve stack frame mflr r0 # save link register st r0,0x48(r1) --- 31,48 ---- .set r30,30 .set r31,31 + .extern .GC_push_one # Mark from machine registers that are saved by C compiler .globl .GC_push_regs + .csect .text[PR] + .align 2 + .globl GC_push_regs + .globl .GC_push_regs + .csect GC_push_regs[DS] + GC_push_regs: + .long .GC_push_regs, TOC[tc0], 0 + .csect .text[PR] .GC_push_regs: stu r1,-64(r1) # reserve stack frame mflr r0 # save link register st r0,0x48(r1) *************** *** 103,105 **** --- 110,114 ---- mtlr r0 ai r1,r1,64 br + .long 0 + .byte 0,0,0,0,0,0,0,0 diff -Nrc3pad gcc-3.0.4/boehm-gc/setjmp_t.c gcc-3.1/boehm-gc/setjmp_t.c *** gcc-3.0.4/boehm-gc/setjmp_t.c Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/setjmp_t.c Fri Aug 17 18:30:46 2001 *************** *** 10,16 **** * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. */ - /* Boehm, September 21, 1995 5:39 pm PDT */ /* Check whether setjmp actually saves registers in jmp_buf. */ /* If it doesn't, the generic mark_regs code won't work. */ --- 10,15 ---- *************** *** 21,31 **** /* recommended that this be run optimized. (If the machine */ /* has no callee-save registers, then the generic code is */ /* safe, but this will not be noticed by this piece of */ ! /* code.) */ #include #include #include ! #include "gcconfig.h" #ifdef OS2 /* GETPAGESIZE() is set to getpagesize() by default, but that */ --- 20,30 ---- /* recommended that this be run optimized. (If the machine */ /* has no callee-save registers, then the generic code is */ /* safe, but this will not be noticed by this piece of */ ! /* code.) This test appears to be far from perfect. */ #include #include #include ! #include "private/gcconfig.h" #ifdef OS2 /* GETPAGESIZE() is set to getpagesize() by default, but that */ diff -Nrc3pad gcc-3.0.4/boehm-gc/solaris_pthreads.c gcc-3.1/boehm-gc/solaris_pthreads.c *** gcc-3.0.4/boehm-gc/solaris_pthreads.c Wed Apr 19 10:09:58 2000 --- gcc-3.1/boehm-gc/solaris_pthreads.c Tue Feb 12 04:37:53 2002 *************** *** 17,24 **** */ /* Boehm, September 14, 1994 4:44 pm PDT */ ! # if defined(_SOLARIS_PTHREADS) ! # include "gc_priv.h" # include # include # include --- 17,24 ---- */ /* Boehm, September 14, 1994 4:44 pm PDT */ ! # if defined(GC_SOLARIS_PTHREADS) ! # include "private/gc_priv.h" # include # include # include *************** *** 35,41 **** # define _CLASSIC_XOPEN_TYPES # include # include ! # include "solaris_threads.h" # include #undef pthread_join --- 35,41 ---- # define _CLASSIC_XOPEN_TYPES # include # include ! # include "private/solaris_threads.h" # include #undef pthread_join *************** GC_pthread_create(pthread_t *new_thread, *** 88,95 **** } LOCK(); ! if (!GC_thr_initialized) { ! GC_thr_init(); } GC_multithreaded++; --- 88,95 ---- } LOCK(); ! if (!GC_is_initialized) { ! GC_init_inner(); } GC_multithreaded++; *************** GC_pthread_create(pthread_t *new_thread, *** 175,179 **** int GC_no_sunOS_pthreads; #endif ! # endif /* SOLARIS_THREADS */ --- 175,179 ---- int GC_no_sunOS_pthreads; #endif ! # endif /* GC_SOLARIS_PTHREADS */ diff -Nrc3pad gcc-3.0.4/boehm-gc/solaris_threads.c gcc-3.1/boehm-gc/solaris_threads.c *** gcc-3.0.4/boehm-gc/solaris_threads.c Wed Sep 26 13:10:56 2001 --- gcc-3.1/boehm-gc/solaris_threads.c Tue Feb 12 04:37:53 2002 *************** *** 16,25 **** */ /* Boehm, September 14, 1994 4:44 pm PDT */ ! # if defined(SOLARIS_THREADS) ! # include "gc_priv.h" ! # include "solaris_threads.h" # include # include # include --- 16,25 ---- */ /* Boehm, September 14, 1994 4:44 pm PDT */ ! # if defined(GC_SOLARIS_THREADS) || defined(GC_SOLARIS_PTHREADS) ! # include "private/gc_priv.h" ! # include "private/solaris_threads.h" # include # include # include *************** GC_bool GC_thr_initialized = FALSE; *** 414,420 **** size_t GC_min_stack_sz; - size_t GC_page_sz; /* * stack_head is stored at the top of free stacks --- 414,419 ---- *************** ptr_t GC_stack_alloc(size_t * stack_size *** 456,462 **** GC_stack_free_lists[index] = GC_stack_free_lists[index]->next; } else { #ifdef MMAP_STACKS ! base = (ptr_t)mmap(0, search_sz + GC_page_sz, PROT_READ|PROT_WRITE, MAP_PRIVATE |MAP_NORESERVE, GC_zfd, 0); if (base == (ptr_t)-1) --- 455,461 ---- GC_stack_free_lists[index] = GC_stack_free_lists[index]->next; } else { #ifdef MMAP_STACKS ! base = (ptr_t)mmap(0, search_sz + GC_page_size, PROT_READ|PROT_WRITE, MAP_PRIVATE |MAP_NORESERVE, GC_zfd, 0); if (base == (ptr_t)-1) *************** ptr_t GC_stack_alloc(size_t * stack_size *** 465,491 **** return NULL; } ! mprotect(base, GC_page_sz, PROT_NONE); ! /* Should this use divHBLKSZ(search_sz + GC_page_sz) ? -- cf */ GC_is_fresh((struct hblk *)base, divHBLKSZ(search_sz)); ! base += GC_page_sz; #else ! base = (ptr_t) GC_scratch_alloc(search_sz + 2*GC_page_sz); if (base == NULL) { *stack_size = 0; return NULL; } ! base = (ptr_t)(((word)base + GC_page_sz) & ~(GC_page_sz - 1)); /* Protect hottest page to detect overflow. */ # ifdef SOLARIS23_MPROTECT_BUG_FIXED ! mprotect(base, GC_page_sz, PROT_NONE); # endif GC_is_fresh((struct hblk *)base, divHBLKSZ(search_sz)); ! base += GC_page_sz; #endif } *stack_size = search_sz; --- 464,490 ---- return NULL; } ! mprotect(base, GC_page_size, PROT_NONE); ! /* Should this use divHBLKSZ(search_sz + GC_page_size) ? -- cf */ GC_is_fresh((struct hblk *)base, divHBLKSZ(search_sz)); ! base += GC_page_size; #else ! base = (ptr_t) GC_scratch_alloc(search_sz + 2*GC_page_size); if (base == NULL) { *stack_size = 0; return NULL; } ! base = (ptr_t)(((word)base + GC_page_size) & ~(GC_page_size - 1)); /* Protect hottest page to detect overflow. */ # ifdef SOLARIS23_MPROTECT_BUG_FIXED ! mprotect(base, GC_page_size, PROT_NONE); # endif GC_is_fresh((struct hblk *)base, divHBLKSZ(search_sz)); ! base += GC_page_size; #endif } *stack_size = search_sz; *************** void GC_old_stacks_are_fresh() *** 558,563 **** --- 557,567 ---- # define THREAD_TABLE_SZ 128 /* Must be power of 2 */ volatile GC_thread GC_threads[THREAD_TABLE_SZ]; + void GC_push_thread_structures GC_PROTO((void)) + { + GC_push_all((ptr_t)(GC_threads), (ptr_t)(GC_threads)+sizeof(GC_threads)); + } + /* Add a thread to GC_threads. We assume it wasn't already there. */ /* Caller holds allocation lock. */ GC_thread GC_new_thread(thread_t id) *************** GC_thread GC_new_thread(thread_t id) *** 573,579 **** /* Dont acquire allocation lock, since we may already hold it. */ } else { result = (struct GC_Thread_Rep *) ! GC_generic_malloc_inner(sizeof(struct GC_Thread_Rep), NORMAL); } if (result == 0) return(0); result -> id = id; --- 577,583 ---- /* Dont acquire allocation lock, since we may already hold it. */ } else { result = (struct GC_Thread_Rep *) ! GC_INTERNAL_MALLOC(sizeof(struct GC_Thread_Rep), NORMAL); } if (result == 0) return(0); result -> id = id; *************** void GC_my_stack_limits() *** 660,667 **** /* original thread */ /* Empirically, what should be the stack page with lowest */ /* address is actually inaccessible. */ ! stack_size = GC_get_orig_stack_size() - GC_page_sz; ! stack = GC_stackbottom - stack_size + GC_page_sz; } else { stack = me -> stack; } --- 664,671 ---- /* original thread */ /* Empirically, what should be the stack page with lowest */ /* address is actually inaccessible. */ ! stack_size = GC_get_orig_stack_size() - GC_page_size; ! stack = GC_stackbottom - stack_size + GC_page_size; } else { stack = me -> stack; } *************** void GC_push_all_stacks() *** 684,690 **** # define PUSH(bottom,top) \ if (GC_dirty_maintained) { \ ! GC_push_dirty((bottom), (top), GC_page_was_ever_dirty, \ GC_push_all_stack); \ } else { \ GC_push_all_stack((bottom), (top)); \ --- 688,694 ---- # define PUSH(bottom,top) \ if (GC_dirty_maintained) { \ ! GC_push_selected((bottom), (top), GC_page_was_ever_dirty, \ GC_push_all_stack); \ } else { \ GC_push_all_stack((bottom), (top)); \ *************** void GC_push_all_stacks() *** 699,705 **** top = p -> stack + p -> stack_size; } else { /* The original stack. */ ! bottom = GC_stackbottom - GC_get_orig_stack_size() + GC_page_sz; top = GC_stackbottom; } if ((word)sp > (word)bottom && (word)sp < (word)top) bottom = sp; --- 703,709 ---- top = p -> stack + p -> stack_size; } else { /* The original stack. */ ! bottom = GC_stackbottom - GC_get_orig_stack_size() + GC_page_size; top = GC_stackbottom; } if ((word)sp > (word)bottom && (word)sp < (word)top) bottom = sp; *************** int GC_is_thread_stack(ptr_t addr) *** 714,720 **** register int i; register GC_thread p; register ptr_t bottom, top; - struct rlimit rl; for (i = 0; i < THREAD_TABLE_SZ; i++) { for (p = GC_threads[i]; p != 0; p = p -> next) { --- 718,723 ---- *************** int GC_is_thread_stack(ptr_t addr) *** 725,730 **** --- 728,734 ---- } } } + return 0; } /* The only thread that ever really performs a thr_join. */ *************** void GC_thr_init(void) *** 784,790 **** GC_thr_initialized = TRUE; GC_min_stack_sz = ((thr_min_stack() + 32*1024 + HBLKSIZE-1) & ~(HBLKSIZE - 1)); - GC_page_sz = sysconf(_SC_PAGESIZE); #ifdef MMAP_STACKS GC_zfd = open("/dev/zero", O_RDONLY); if (GC_zfd == -1) --- 788,793 ---- *************** GC_thr_create(void *stack_base, size_t s *** 906,915 **** void * stack = stack_base; LOCK(); ! if (!GC_thr_initialized) ! { ! GC_thr_init(); ! } GC_multithreaded++; if (stack == 0) { if (stack_size == 0) stack_size = 1024*1024; --- 909,915 ---- void * stack = stack_base; LOCK(); ! if (!GC_is_initialized) GC_init_inner(); GC_multithreaded++; if (stack == 0) { if (stack_size == 0) stack_size = 1024*1024; *************** GC_thr_create(void *stack_base, size_t s *** 944,950 **** return(result); } ! # else /* SOLARIS_THREADS */ #ifndef LINT int GC_no_sunOS_threads; --- 944,950 ---- return(result); } ! # else /* !GC_SOLARIS_THREADS */ #ifndef LINT int GC_no_sunOS_threads; diff -Nrc3pad gcc-3.0.4/boehm-gc/solaris_threads.h gcc-3.1/boehm-gc/solaris_threads.h *** gcc-3.0.4/boehm-gc/solaris_threads.h Wed Jun 30 12:44:33 1999 --- gcc-3.1/boehm-gc/solaris_threads.h Thu Jan 1 00:00:00 1970 *************** *** 1,34 **** - #ifdef SOLARIS_THREADS - - /* The set of all known threads. We intercept thread creation and */ - /* joins. We never actually create detached threads. We allocate all */ - /* new thread stacks ourselves. These allow us to maintain this */ - /* data structure. */ - /* Protected by GC_thr_lock. */ - /* Some of this should be declared volatile, but that's incosnsistent */ - /* with some library routine declarations. In particular, the */ - /* definition of cond_t doesn't mention volatile! */ - typedef struct GC_Thread_Rep { - struct GC_Thread_Rep * next; - thread_t id; - word flags; - # define FINISHED 1 /* Thread has exited. */ - # define DETACHED 2 /* Thread is intended to be detached. */ - # define CLIENT_OWNS_STACK 4 - /* Stack was supplied by client. */ - # define SUSPENDED 8 /* Currently suspended. */ - ptr_t stack; - size_t stack_size; - cond_t join_cv; - void * status; - } * GC_thread; - extern GC_thread GC_new_thread(thread_t id); - - extern GC_bool GC_thr_initialized; - extern volatile GC_thread GC_threads[]; - extern size_t GC_min_stack_sz; - extern size_t GC_page_sz; - extern void GC_thr_init(void); - - # endif /* SOLARIS_THREADS */ - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/sparc_mach_dep.S gcc-3.1/boehm-gc/sparc_mach_dep.S *** gcc-3.0.4/boehm-gc/sparc_mach_dep.S Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/sparc_mach_dep.S Fri Feb 15 00:09:29 2002 *************** *** 0 **** --- 1,67 ---- + ! SPARCompiler 3.0 and later apparently no longer handles + ! asm outside functions. So we need a separate .s file + ! This is only set up for SunOS 5, not SunOS 4. + ! Assumes this is called before the stack contents are + ! examined. + + .seg "text" + .globl GC_save_regs_in_stack + .globl GC_push_regs + GC_save_regs_in_stack: + GC_push_regs: + #if defined(__arch64__) || defined(__sparcv9) + save %sp,-128,%sp + flushw + ret + restore %sp,2047+128,%o0 + #else /* 32 bit SPARC */ + ta 0x3 ! ST_FLUSH_WINDOWS + mov %sp,%o0 + retl + nop + #endif /* 32 bit SPARC */ + .GC_save_regs_in_stack_end: + .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack + + + .globl GC_clear_stack_inner + GC_clear_stack_inner: + #if defined(__arch64__) || defined(__sparcv9) + mov %sp,%o2 ! Save sp + add %sp,2047-8,%o3 ! p = sp+bias-8 + add %o1,-2047-192,%sp ! Move sp out of the way, + ! so that traps still work. + ! Includes some extra words + ! so we can be sloppy below. + loop: + stx %g0,[%o3] ! *(long *)p = 0 + cmp %o3,%o1 + bgu,pt %xcc, loop ! if (p > limit) goto loop + add %o3,-8,%o3 ! p -= 8 (delay slot) + retl + mov %o2,%sp ! Restore sp., delay slot + #else /* 32 bit SPARC */ + mov %sp,%o2 ! Save sp + add %sp,-8,%o3 ! p = sp-8 + clr %g1 ! [g0,g1] = 0 + add %o1,-0x60,%sp ! Move sp out of the way, + ! so that traps still work. + ! Includes some extra words + ! so we can be sloppy below. + loop: + std %g0,[%o3] ! *(long long *)p = 0 + cmp %o3,%o1 + bgu loop ! if (p > limit) goto loop + add %o3,-8,%o3 ! p -= 8 (delay slot) + retl + mov %o2,%sp ! Restore sp., delay slot + #endif /* 32 bit SPARC */ + .GC_clear_stack_inner_end: + .size GC_clear_stack_inner,.GC_clear_stack_inner_end-GC_clear_stack_inner + + + + + + + diff -Nrc3pad gcc-3.0.4/boehm-gc/sparc_mach_dep.s gcc-3.1/boehm-gc/sparc_mach_dep.s *** gcc-3.0.4/boehm-gc/sparc_mach_dep.s Mon Nov 1 23:15:51 1999 --- gcc-3.1/boehm-gc/sparc_mach_dep.s Thu Jan 1 00:00:00 1970 *************** *** 1,38 **** - ! SPARCompiler 3.0 and later apparently no longer handles - ! asm outside functions. So we need a separate .s file - ! This is only set up for SunOS 5, not SunOS 4. - ! Assumes this is called before the stack contents are - ! examined. - - .seg "text" - .globl GC_save_regs_in_stack - .globl GC_push_regs - GC_save_regs_in_stack: - GC_push_regs: - ta 0x3 ! ST_FLUSH_WINDOWS - mov %sp,%o0 - retl - nop - - .globl GC_clear_stack_inner - GC_clear_stack_inner: - mov %sp,%o2 ! Save sp - add %sp,-8,%o3 ! p = sp-8 - clr %g1 ! [g0,g1] = 0 - add %o1,-0x60,%sp ! Move sp out of the way, - ! so that traps still work. - ! Includes some extra words - ! so we can be sloppy below. - loop: - std %g0,[%o3] ! *(long long *)p = 0 - cmp %o3,%o1 - bgu loop ! if (p > limit) goto loop - add %o3,-8,%o3 ! p -= 8 (delay slot) - retl - mov %o2,%sp ! Restore sp., delay slot - - - - - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/sparc_netbsd_mach_dep.s gcc-3.1/boehm-gc/sparc_netbsd_mach_dep.s *** gcc-3.0.4/boehm-gc/sparc_netbsd_mach_dep.s Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/sparc_netbsd_mach_dep.s Fri Aug 17 18:30:46 2001 *************** *** 0 **** --- 1,34 ---- + ! SPARCompiler 3.0 and later apparently no longer handles + ! asm outside functions. So we need a separate .s file + ! This is only set up for SunOS 4. + ! Assumes this is called before the stack contents are + ! examined. + + #include "machine/asm.h" + + .seg "text" + .globl _C_LABEL(GC_save_regs_in_stack) + .globl _C_LABEL(GC_push_regs) + _C_LABEL(GC_save_regs_in_stack): + _C_LABEL(GC_push_regs): + ta 0x3 ! ST_FLUSH_WINDOWS + mov %sp,%o0 + retl + nop + + .globl _C_LABEL(GC_clear_stack_inner) + _C_LABEL(GC_clear_stack_inner): + mov %sp,%o2 ! Save sp + add %sp,-8,%o3 ! p = sp-8 + clr %g1 ! [g0,g1] = 0 + add %o1,-0x60,%sp ! Move sp out of the way, + ! so that traps still work. + ! Includes some extra words + ! so we can be sloppy below. + loop: + std %g0,[%o3] ! *(long long *)p = 0 + cmp %o3,%o1 + bgu loop ! if (p > limit) goto loop + add %o3,-8,%o3 ! p -= 8 (delay slot) + retl + mov %o2,%sp ! Restore sp., delay slot diff -Nrc3pad gcc-3.0.4/boehm-gc/specific.c gcc-3.1/boehm-gc/specific.c *** gcc-3.0.4/boehm-gc/specific.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/specific.c Fri Mar 29 22:33:34 2002 *************** *** 0 **** --- 1,127 ---- + /* + * Copyright (c) 2000 by Hewlett-Packard Company. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + + #if defined(GC_LINUX_THREADS) + + #include "private/gc_priv.h" /* For GC_compare_and_exchange, GC_memory_barrier */ + #include "private/specific.h" + + static tse invalid_tse = {INVALID_QTID, 0, 0, INVALID_THREADID}; + /* A thread-specific data entry which will never */ + /* appear valid to a reader. Used to fill in empty */ + /* cache entries to avoid a check for 0. */ + + int PREFIXED(key_create) (tsd ** key_ptr, void (* destructor)(void *)) { + int i; + tsd * result = (tsd *)MALLOC_CLEAR(sizeof (tsd)); + + /* A quick alignment check, since we need atomic stores */ + GC_ASSERT((unsigned long)(&invalid_tse.next) % sizeof(tse *) == 0); + if (0 == result) return ENOMEM; + pthread_mutex_init(&(result -> lock), NULL); + for (i = 0; i < TS_CACHE_SIZE; ++i) { + result -> cache[i] = &invalid_tse; + } + # ifdef GC_ASSERTIONS + for (i = 0; i < TS_HASH_SIZE; ++i) { + GC_ASSERT(result -> hash[i] == 0); + } + # endif + *key_ptr = result; + return 0; + } + + int PREFIXED(setspecific) (tsd * key, void * value) { + pthread_t self = pthread_self(); + int hash_val = HASH(self); + volatile tse * entry = (volatile tse *)MALLOC_CLEAR(sizeof (tse)); + + GC_ASSERT(self != INVALID_THREADID); + if (0 == entry) return ENOMEM; + pthread_mutex_lock(&(key -> lock)); + /* Could easily check for an existing entry here. */ + entry -> next = key -> hash[hash_val]; + entry -> thread = self; + entry -> value = value; + GC_ASSERT(entry -> qtid == INVALID_QTID); + /* There can only be one writer at a time, but this needs to be */ + /* atomic with respect to concurrent readers. */ + *(volatile tse **)(key -> hash + hash_val) = entry; + pthread_mutex_unlock(&(key -> lock)); + return 0; + } + + /* Remove thread-specific data for this thread. Should be called on */ + /* thread exit. */ + void PREFIXED(remove_specific) (tsd * key) { + pthread_t self = pthread_self(); + unsigned hash_val = HASH(self); + tse *entry; + tse **link = key -> hash + hash_val; + + pthread_mutex_lock(&(key -> lock)); + entry = *link; + while (entry != NULL && entry -> thread != self) { + link = &(entry -> next); + entry = *link; + } + /* Invalidate qtid field, since qtids may be reused, and a later */ + /* cache lookup could otherwise find this entry. */ + entry -> qtid = INVALID_QTID; + if (entry != NULL) { + *link = entry -> next; + /* Atomic! concurrent accesses still work. */ + /* They must, since readers don't lock. */ + /* We shouldn't need a volatile access here, */ + /* since both this and the preceding write */ + /* should become visible no later than */ + /* the pthread_mutex_unlock() call. */ + } + /* If we wanted to deallocate the entry, we'd first have to clear */ + /* any cache entries pointing to it. That probably requires */ + /* additional synchronization, since we can't prevent a concurrent */ + /* cache lookup, which should still be examining deallocated memory.*/ + /* This can only happen if the concurrent access is from another */ + /* thread, and hence has missed the cache, but still... */ + + /* With GC, we're done, since the pointers from the cache will */ + /* be overwritten, all local pointers to the entries will be */ + /* dropped, and the entry will then be reclaimed. */ + pthread_mutex_unlock(&(key -> lock)); + } + + /* Note that even the slow path doesn't lock. */ + void * PREFIXED(slow_getspecific) (tsd * key, unsigned long qtid, + tse * volatile * cache_ptr) { + pthread_t self = pthread_self(); + unsigned hash_val = HASH(self); + tse *entry = key -> hash[hash_val]; + + GC_ASSERT(qtid != INVALID_QTID); + while (entry != NULL && entry -> thread != self) { + entry = entry -> next; + } + if (entry == NULL) return NULL; + /* Set cache_entry. */ + entry -> qtid = qtid; + /* It's safe to do this asynchronously. Either value */ + /* is safe, though may produce spurious misses. */ + /* We're replacing one qtid with another one for the */ + /* same thread. */ + *cache_ptr = entry; + /* Again this is safe since pointer assignments are */ + /* presumed atomic, and either pointer is valid. */ + return entry -> value; + } + + #endif /* GC_LINUX_THREADS */ diff -Nrc3pad gcc-3.0.4/boehm-gc/stubborn.c gcc-3.1/boehm-gc/stubborn.c *** gcc-3.0.4/boehm-gc/stubborn.c Wed Jun 30 12:44:37 1999 --- gcc-3.1/boehm-gc/stubborn.c Fri Aug 17 18:30:46 2001 *************** *** 14,20 **** /* Boehm, July 31, 1995 5:02 pm PDT */ ! #include "gc_priv.h" # ifdef STUBBORN_ALLOC /* Stubborn object (hard to change, nearly immutable) allocation. */ --- 14,20 ---- /* Boehm, July 31, 1995 5:02 pm PDT */ ! #include "private/gc_priv.h" # ifdef STUBBORN_ALLOC /* Stubborn object (hard to change, nearly immutable) allocation. */ *************** extern ptr_t GC_clear_stack(); /* in mis *** 31,36 **** --- 31,42 ---- GC_PTR * GC_changing_list_start; + void GC_push_stubborn_structures GC_PROTO((void)) + { + GC_push_all((ptr_t)(&GC_changing_list_start), + (ptr_t)(&GC_changing_list_start) + sizeof(GC_PTR *)); + } + # ifdef THREADS VOLATILE GC_PTR * VOLATILE GC_changing_list_current; # else *************** void GC_stubborn_init() *** 50,56 **** # define INIT_SIZE 10 GC_changing_list_start = (GC_PTR *) ! GC_generic_malloc_inner( (word)(INIT_SIZE * sizeof(GC_PTR)), PTRFREE); BZERO(GC_changing_list_start, --- 56,62 ---- # define INIT_SIZE 10 GC_changing_list_start = (GC_PTR *) ! GC_INTERNAL_MALLOC( (word)(INIT_SIZE * sizeof(GC_PTR)), PTRFREE); BZERO(GC_changing_list_start, *************** GC_bool GC_compact_changing_list() *** 88,94 **** } if (2 * count > old_size) new_size = 2 * count; new_list = (GC_PTR *) ! GC_generic_malloc_inner( new_size * sizeof(GC_PTR), PTRFREE); /* PTRFREE is a lie. But we don't want the collector to */ /* consider these. We do want the list itself to be */ --- 94,100 ---- } if (2 * count > old_size) new_size = 2 * count; new_list = (GC_PTR *) ! GC_INTERNAL_MALLOC( new_size * sizeof(GC_PTR), PTRFREE); /* PTRFREE is a lie. But we don't want the collector to */ /* consider these. We do want the list itself to be */ *************** GC_PTR p; *** 313,317 **** --- 319,326 ---- { } + void GC_push_stubborn_structures GC_PROTO((void)) + { + } #endif diff -Nrc3pad gcc-3.0.4/boehm-gc/test.c gcc-3.1/boehm-gc/test.c *** gcc-3.0.4/boehm-gc/test.c Thu Apr 5 00:13:13 2001 --- gcc-3.1/boehm-gc/test.c Thu Jan 1 00:00:00 1970 *************** *** 1,1390 **** - /* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. - * Copyright (c) 1996 by Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - /* An incomplete test for the garbage collector. */ - /* Some more obscure entry points are not tested at all. */ - - # undef GC_BUILD - - # if defined(mips) && defined(SYSTYPE_BSD43) - /* MIPS RISCOS 4 */ - # else - # include - # endif - # include - # include /* Not normally used, but handy for debugging. */ - # include "gc.h" - # include "gc_typed.h" - # include "gc_priv.h" /* For output, locking, and some statistics */ - # include "gcconfig.h" - - # ifdef MSWIN32 - # include - # endif - - # ifdef PCR - # include "th/PCR_ThCrSec.h" - # include "th/PCR_Th.h" - # undef GC_printf0 - # define GC_printf0 printf - # undef GC_printf1 - # define GC_printf1 printf - # endif - - # ifdef SOLARIS_THREADS - # include - # include - # endif - - # if defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS) - # include - # endif - - # ifdef WIN32_THREADS - # include - static CRITICAL_SECTION incr_cs; - # endif - - # ifdef AMIGA - long __stack = 200000; - # endif - - # define FAIL (void)abort() - - /* AT_END may be defined to excercise the interior pointer test */ - /* if the collector is configured with ALL_INTERIOR_POINTERS. */ - /* As it stands, this test should succeed with either */ - /* configuration. In the FIND_LEAK configuration, it should */ - /* find lots of leaks, since we free almost nothing. */ - - struct SEXPR { - struct SEXPR * sexpr_car; - struct SEXPR * sexpr_cdr; - }; - - - typedef struct SEXPR * sexpr; - - # define INT_TO_SEXPR(x) ((sexpr)(unsigned long)(x)) - - # undef nil - # define nil (INT_TO_SEXPR(0)) - # define car(x) ((x) -> sexpr_car) - # define cdr(x) ((x) -> sexpr_cdr) - # define is_nil(x) ((x) == nil) - - - int extra_count = 0; /* Amount of space wasted in cons node */ - - /* Silly implementation of Lisp cons. Intentionally wastes lots of space */ - /* to test collector. */ - sexpr cons (x, y) - sexpr x; - sexpr y; - { - register sexpr r; - register int *p; - register int my_extra = extra_count; - - r = (sexpr) GC_MALLOC_STUBBORN(sizeof(struct SEXPR) + my_extra); - if (r == 0) { - (void)GC_printf0("Out of memory\n"); - exit(1); - } - for (p = (int *)r; - ((char *)p) < ((char *)r) + my_extra + sizeof(struct SEXPR); p++) { - if (*p) { - (void)GC_printf1("Found nonzero at 0x%lx - allocator is broken\n", - (unsigned long)p); - FAIL; - } - *p = 13; - } - # ifdef AT_END - r = (sexpr)((char *)r + (my_extra & ~7)); - # endif - r -> sexpr_car = x; - r -> sexpr_cdr = y; - my_extra++; - if ( my_extra >= 5000 ) { - extra_count = 0; - } else { - extra_count = my_extra; - } - GC_END_STUBBORN_CHANGE((char *)r); - return(r); - } - - sexpr small_cons (x, y) - sexpr x; - sexpr y; - { - register sexpr r; - - r = (sexpr) GC_MALLOC(sizeof(struct SEXPR)); - if (r == 0) { - (void)GC_printf0("Out of memory\n"); - exit(1); - } - r -> sexpr_car = x; - r -> sexpr_cdr = y; - return(r); - } - - sexpr small_cons_uncollectable (x, y) - sexpr x; - sexpr y; - { - register sexpr r; - - r = (sexpr) GC_MALLOC_UNCOLLECTABLE(sizeof(struct SEXPR)); - if (r == 0) { - (void)GC_printf0("Out of memory\n"); - exit(1); - } - r -> sexpr_car = x; - r -> sexpr_cdr = (sexpr)(~(unsigned long)y); - return(r); - } - - #ifdef GC_GCJ_SUPPORT - - #include "gc_mark.h" - #include "dbg_mlc.h" - #include "include/gc_gcj.h" - - /* The following struct emulates the vtable in gcj. */ - /* This assumes the default value of MARK_DESCR_OFFSET. */ - struct fake_vtable { - void * dummy; /* class pointer in real gcj. */ - size_t descr; - }; - - struct fake_vtable gcj_class_struct1 = { 0, sizeof(struct SEXPR) - + sizeof(struct fake_vtable *) }; - /* length based descriptor. */ - struct fake_vtable gcj_class_struct2 = - { 0, (3l << (CPP_WORDSZ - 3)) | DS_BITMAP}; - /* Bitmap based descriptor. */ - - struct ms_entry * fake_gcj_mark_proc(word * addr, - struct ms_entry *mark_stack_ptr, - struct ms_entry *mark_stack_limit, - word env ) - { - sexpr x; - if (1 == env) { - /* Object allocated with debug allocator. */ - addr = (word *)USR_PTR_FROM_BASE(addr); - } - x = (sexpr)(addr + 1); /* Skip the vtable pointer. */ - /* We could just call PUSH_CONTENTS directly here. But any real */ - /* real client would try to filter out the obvious misses. */ - if (0 != x -> sexpr_cdr) { - PUSH_CONTENTS((ptr_t)(x -> sexpr_cdr), mark_stack_ptr, - mark_stack_limit, &(x -> sexpr_cdr), exit1); - } - if ((ptr_t)(x -> sexpr_car) > GC_least_plausible_heap_addr) { - PUSH_CONTENTS((ptr_t)(x -> sexpr_car), mark_stack_ptr, - mark_stack_limit, &(x -> sexpr_car), exit2); - } - return(mark_stack_ptr); - } - - sexpr gcj_cons(x, y) - sexpr x; - sexpr y; - { - GC_word * r; - sexpr result; - static int count = 0; - - if (++count & 1) { - r = (GC_word *) GC_GCJ_FAST_MALLOC(3, &gcj_class_struct1); - } else { - r = (GC_word *) GC_GCJ_MALLOC(sizeof(struct SEXPR) - + sizeof(struct fake_vtable*), - &gcj_class_struct2); - } - if (r == 0) { - (void)GC_printf0("Out of memory\n"); - exit(1); - } - result = (sexpr)(r + 1); - result -> sexpr_car = x; - result -> sexpr_cdr = y; - return(result); - } - #endif - - /* Return reverse(x) concatenated with y */ - sexpr reverse1(x, y) - sexpr x, y; - { - if (is_nil(x)) { - return(y); - } else { - return( reverse1(cdr(x), cons(car(x), y)) ); - } - } - - sexpr reverse(x) - sexpr x; - { - return( reverse1(x, nil) ); - } - - sexpr ints(low, up) - int low, up; - { - if (low > up) { - return(nil); - } else { - return(small_cons(small_cons(INT_TO_SEXPR(low), nil), ints(low+1, up))); - } - } - - #ifdef GC_GCJ_SUPPORT - /* Return reverse(x) concatenated with y */ - sexpr gcj_reverse1(x, y) - sexpr x, y; - { - if (is_nil(x)) { - return(y); - } else { - return( gcj_reverse1(cdr(x), gcj_cons(car(x), y)) ); - } - } - - sexpr gcj_reverse(x) - sexpr x; - { - return( gcj_reverse1(x, nil) ); - } - - sexpr gcj_ints(low, up) - int low, up; - { - if (low > up) { - return(nil); - } else { - return(gcj_cons(gcj_cons(INT_TO_SEXPR(low), nil), gcj_ints(low+1, up))); - } - } - #endif /* GC_GCJ_SUPPORT */ - - /* To check uncollectable allocation we build lists with disguised cdr */ - /* pointers, and make sure they don't go away. */ - sexpr uncollectable_ints(low, up) - int low, up; - { - if (low > up) { - return(nil); - } else { - return(small_cons_uncollectable(small_cons(INT_TO_SEXPR(low), nil), - uncollectable_ints(low+1, up))); - } - } - - void check_ints(list, low, up) - sexpr list; - int low, up; - { - if ((int)(GC_word)(car(car(list))) != low) { - (void)GC_printf0( - "List reversal produced incorrect list - collector is broken\n"); - FAIL; - } - if (low == up) { - if (cdr(list) != nil) { - (void)GC_printf0("List too long - collector is broken\n"); - FAIL; - } - } else { - check_ints(cdr(list), low+1, up); - } - } - - # define UNCOLLECTABLE_CDR(x) (sexpr)(~(unsigned long)(cdr(x))) - - void check_uncollectable_ints(list, low, up) - sexpr list; - int low, up; - { - assert(GC_is_marked(list)); - if ((int)(GC_word)(car(car(list))) != low) { - (void)GC_printf0( - "Uncollectable list corrupted - collector is broken\n"); - FAIL; - } - if (low == up) { - if (UNCOLLECTABLE_CDR(list) != nil) { - (void)GC_printf0("Uncollectable list too long - collector is broken\n"); - FAIL; - } - } else { - check_uncollectable_ints(UNCOLLECTABLE_CDR(list), low+1, up); - } - } - - /* Not used, but useful for debugging: */ - void print_int_list(x) - sexpr x; - { - if (is_nil(x)) { - (void)GC_printf0("NIL\n"); - } else { - (void)GC_printf1("(%ld)", (long)(car(car(x)))); - if (!is_nil(cdr(x))) { - (void)GC_printf0(", "); - (void)print_int_list(cdr(x)); - } else { - (void)GC_printf0("\n"); - } - } - } - - /* Try to force a to be strangely aligned */ - struct { - char dummy; - sexpr aa; - } A; - #define a A.aa - - /* - * A tiny list reversal test to check thread creation. - */ - #ifdef THREADS - - # ifdef WIN32_THREADS - unsigned __stdcall tiny_reverse_test(void * arg) - # else - void * tiny_reverse_test(void * arg) - # endif - { - check_ints(reverse(reverse(ints(1,10))), 1, 10); - return 0; - } - - # if defined(IRIX_THREADS) || defined(LINUX_THREADS) \ - || defined(SOLARIS_PTHREADS) || defined(HPUX_THREADS) - void fork_a_thread() - { - pthread_t t; - int code; - if ((code = pthread_create(&t, 0, tiny_reverse_test, 0)) != 0) { - (void)GC_printf1("Small thread creation failed %lu\n", - (unsigned long)code); - FAIL; - } - if ((code = pthread_join(t, 0)) != 0) { - (void)GC_printf1("Small thread join failed %lu\n", - (unsigned long)code); - FAIL; - } - } - - # elif defined(WIN32_THREADS) - void fork_a_thread() - { - unsigned thread_id; - HANDLE h; - h = (HANDLE)_beginthreadex(NULL, 0, tiny_reverse_test, - 0, 0, &thread_id); - if (h == (HANDLE)-1) { - (void)GC_printf1("Small thread creation failed %lu\n", - (unsigned long)GetLastError()); - FAIL; - } - if (WaitForSingleObject(h, INFINITE) != WAIT_OBJECT_0) { - (void)GC_printf1("Small thread wait failed %lu\n", - (unsigned long)GetLastError()); - FAIL; - } - } - - /* # elif defined(SOLARIS_THREADS) */ - - # else - - # define fork_a_thread() - - # endif - - #else - - # define fork_a_thread() - - #endif - - /* - * Repeatedly reverse lists built out of very different sized cons cells. - * Check that we didn't lose anything. - */ - void reverse_test() - { - int i; - sexpr b; - sexpr c; - sexpr d; - sexpr e; - sexpr *f, *g, *h; - # if defined(MSWIN32) || defined(MACOS) - /* Win32S only allows 128K stacks */ - # define BIG 1000 - # else - # if defined PCR - /* PCR default stack is 100K. Stack frames are up to 120 bytes. */ - # define BIG 700 - # else - # define BIG 4500 - # endif - # endif - - A.dummy = 17; - a = ints(1, 49); - b = ints(1, 50); - c = ints(1, BIG); - d = uncollectable_ints(1, 100); - e = uncollectable_ints(1, 1); - /* Check that realloc updates object descriptors correctly */ - f = (sexpr *)GC_MALLOC(4 * sizeof(sexpr)); - f = (sexpr *)GC_REALLOC((GC_PTR)f, 6 * sizeof(sexpr)); - f[5] = ints(1,17); - g = (sexpr *)GC_MALLOC(513 * sizeof(sexpr)); - g = (sexpr *)GC_REALLOC((GC_PTR)g, 800 * sizeof(sexpr)); - g[799] = ints(1,18); - h = (sexpr *)GC_MALLOC(1025 * sizeof(sexpr)); - h = (sexpr *)GC_REALLOC((GC_PTR)h, 2000 * sizeof(sexpr)); - # ifdef GC_GCJ_SUPPORT - h[1999] = gcj_ints(1,200); - h[1999] = gcj_reverse(h[1999]); - # else - h[1999] = ints(1,200); - # endif - /* Try to force some collections and reuse of small list elements */ - for (i = 0; i < 10; i++) { - (void)ints(1, BIG); - } - /* Superficially test interior pointer recognition on stack */ - c = (sexpr)((char *)c + sizeof(char *)); - d = (sexpr)((char *)d + sizeof(char *)); - - # ifdef __STDC__ - GC_FREE((void *)e); - # else - GC_FREE((char *)e); - # endif - check_ints(b,1,50); - check_ints(a,1,49); - for (i = 0; i < 50; i++) { - check_ints(b,1,50); - b = reverse(reverse(b)); - } - check_ints(b,1,50); - check_ints(a,1,49); - for (i = 0; i < 60; i++) { - if (i % 10 == 0) fork_a_thread(); - /* This maintains the invariant that a always points to a list of */ - /* 49 integers. Thus this is thread safe without locks, */ - /* assuming atomic pointer assignments. */ - a = reverse(reverse(a)); - # if !defined(AT_END) && !defined(THREADS) - /* This is not thread safe, since realloc explicitly deallocates */ - if (i & 1) { - a = (sexpr)GC_REALLOC((GC_PTR)a, 500); - } else { - a = (sexpr)GC_REALLOC((GC_PTR)a, 8200); - } - # endif - } - check_ints(a,1,49); - check_ints(b,1,50); - c = (sexpr)((char *)c - sizeof(char *)); - d = (sexpr)((char *)d - sizeof(char *)); - check_ints(c,1,BIG); - check_uncollectable_ints(d, 1, 100); - check_ints(f[5], 1,17); - check_ints(g[799], 1,18); - # ifdef GC_GCJ_SUPPORT - h[1999] = gcj_reverse(h[1999]); - # endif - check_ints(h[1999], 1,200); - # ifndef THREADS - a = 0; - # endif - b = c = 0; - } - - /* - * The rest of this builds balanced binary trees, checks that they don't - * disappear, and tests finalization. - */ - typedef struct treenode { - int level; - struct treenode * lchild; - struct treenode * rchild; - } tn; - - int finalizable_count = 0; - int finalized_count = 0; - VOLATILE int dropped_something = 0; - - # ifdef __STDC__ - void finalizer(void * obj, void * client_data) - # else - void finalizer(obj, client_data) - char * obj; - char * client_data; - # endif - { - tn * t = (tn *)obj; - - # ifdef PCR - PCR_ThCrSec_EnterSys(); - # endif - # ifdef SOLARIS_THREADS - static mutex_t incr_lock; - mutex_lock(&incr_lock); - # endif - # if defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS) - static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock(&incr_lock); - # endif - # ifdef WIN32_THREADS - EnterCriticalSection(&incr_cs); - # endif - if ((int)(GC_word)client_data != t -> level) { - (void)GC_printf0("Wrong finalization data - collector is broken\n"); - FAIL; - } - finalized_count++; - # ifdef PCR - PCR_ThCrSec_ExitSys(); - # endif - # ifdef SOLARIS_THREADS - mutex_unlock(&incr_lock); - # endif - # if defined(IRIX_THREADS) || defined(LINUX_THREADS) || defined(HPUX_THREADS) - pthread_mutex_unlock(&incr_lock); - # endif - # ifdef WIN32_THREADS - LeaveCriticalSection(&incr_cs); - # endif - } - - size_t counter = 0; - - # define MAX_FINALIZED 8000 - - # if !defined(MACOS) - GC_FAR GC_word live_indicators[MAX_FINALIZED] = {0}; - #else - /* Too big for THINK_C. have to allocate it dynamically. */ - GC_word *live_indicators = 0; - #endif - - int live_indicators_count = 0; - - tn * mktree(n) - int n; - { - tn * result = (tn *)GC_MALLOC(sizeof(tn)); - - #if defined(MACOS) - /* get around static data limitations. */ - if (!live_indicators) - live_indicators = - (GC_word*)NewPtrClear(MAX_FINALIZED * sizeof(GC_word)); - if (!live_indicators) { - (void)GC_printf0("Out of memory\n"); - exit(1); - } - #endif - if (n == 0) return(0); - if (result == 0) { - (void)GC_printf0("Out of memory\n"); - exit(1); - } - result -> level = n; - result -> lchild = mktree(n-1); - result -> rchild = mktree(n-1); - if (counter++ % 17 == 0 && n >= 2) { - tn * tmp = result -> lchild -> rchild; - - result -> lchild -> rchild = result -> rchild -> lchild; - result -> rchild -> lchild = tmp; - } - if (counter++ % 119 == 0) { - int my_index; - - { - # ifdef PCR - PCR_ThCrSec_EnterSys(); - # endif - # ifdef SOLARIS_THREADS - static mutex_t incr_lock; - mutex_lock(&incr_lock); - # endif - # if defined(IRIX_THREADS) || defined(LINUX_THREADS) \ - || defined(HPUX_THREADS) - static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock(&incr_lock); - # endif - # ifdef WIN32_THREADS - EnterCriticalSection(&incr_cs); - # endif - /* Losing a count here causes erroneous report of failure. */ - finalizable_count++; - my_index = live_indicators_count++; - # ifdef PCR - PCR_ThCrSec_ExitSys(); - # endif - # ifdef SOLARIS_THREADS - mutex_unlock(&incr_lock); - # endif - # if defined(IRIX_THREADS) || defined(LINUX_THREADS) \ - || defined(HPUX_THREADS) - pthread_mutex_unlock(&incr_lock); - # endif - # ifdef WIN32_THREADS - LeaveCriticalSection(&incr_cs); - # endif - } - - GC_REGISTER_FINALIZER((GC_PTR)result, finalizer, (GC_PTR)(GC_word)n, - (GC_finalization_proc *)0, (GC_PTR *)0); - if (my_index >= MAX_FINALIZED) { - GC_printf0("live_indicators overflowed\n"); - FAIL; - } - live_indicators[my_index] = 13; - if (GC_GENERAL_REGISTER_DISAPPEARING_LINK( - (GC_PTR *)(&(live_indicators[my_index])), - (GC_PTR)result) != 0) { - GC_printf0("GC_general_register_disappearing_link failed\n"); - FAIL; - } - if (GC_unregister_disappearing_link( - (GC_PTR *) - (&(live_indicators[my_index]))) == 0) { - GC_printf0("GC_unregister_disappearing_link failed\n"); - FAIL; - } - if (GC_GENERAL_REGISTER_DISAPPEARING_LINK( - (GC_PTR *)(&(live_indicators[my_index])), - (GC_PTR)result) != 0) { - GC_printf0("GC_general_register_disappearing_link failed 2\n"); - FAIL; - } - } - return(result); - } - - void chktree(t,n) - tn *t; - int n; - { - if (n == 0 && t != 0) { - (void)GC_printf0("Clobbered a leaf - collector is broken\n"); - FAIL; - } - if (n == 0) return; - if (t -> level != n) { - (void)GC_printf1("Lost a node at level %lu - collector is broken\n", - (unsigned long)n); - FAIL; - } - if (counter++ % 373 == 0) (void) GC_MALLOC(counter%5001); - chktree(t -> lchild, n-1); - if (counter++ % 73 == 0) (void) GC_MALLOC(counter%373); - chktree(t -> rchild, n-1); - } - - # if defined(SOLARIS_THREADS) && !defined(_SOLARIS_PTHREADS) - thread_key_t fl_key; - - void * alloc8bytes() - { - # if defined(SMALL_CONFIG) || defined(GC_DEBUG) - return(GC_MALLOC(8)); - # else - void ** my_free_list_ptr; - void * my_free_list; - - if (thr_getspecific(fl_key, (void **)(&my_free_list_ptr)) != 0) { - (void)GC_printf0("thr_getspecific failed\n"); - FAIL; - } - if (my_free_list_ptr == 0) { - my_free_list_ptr = GC_NEW_UNCOLLECTABLE(void *); - if (thr_setspecific(fl_key, my_free_list_ptr) != 0) { - (void)GC_printf0("thr_setspecific failed\n"); - FAIL; - } - } - my_free_list = *my_free_list_ptr; - if (my_free_list == 0) { - my_free_list = GC_malloc_many(8); - if (my_free_list == 0) { - (void)GC_printf0("alloc8bytes out of memory\n"); - FAIL; - } - } - *my_free_list_ptr = GC_NEXT(my_free_list); - GC_NEXT(my_free_list) = 0; - return(my_free_list); - # endif - } - - #else - - # if defined(_SOLARIS_PTHREADS) || defined(IRIX_THREADS) \ - || defined(LINUX_THREADS) || defined(HPUX_THREADS) - pthread_key_t fl_key; - - void * alloc8bytes() - { - # ifdef SMALL_CONFIG - return(GC_malloc(8)); - # else - void ** my_free_list_ptr; - void * my_free_list; - - my_free_list_ptr = (void **)pthread_getspecific(fl_key); - if (my_free_list_ptr == 0) { - my_free_list_ptr = GC_NEW_UNCOLLECTABLE(void *); - if (pthread_setspecific(fl_key, my_free_list_ptr) != 0) { - (void)GC_printf0("pthread_setspecific failed\n"); - FAIL; - } - } - my_free_list = *my_free_list_ptr; - if (my_free_list == 0) { - my_free_list = GC_malloc_many(8); - if (my_free_list == 0) { - (void)GC_printf0("alloc8bytes out of memory\n"); - FAIL; - } - } - *my_free_list_ptr = GC_NEXT(my_free_list); - GC_NEXT(my_free_list) = 0; - return(my_free_list); - # endif - } - - # else - # define alloc8bytes() GC_MALLOC_ATOMIC(8) - # endif - #endif - - void alloc_small(n) - int n; - { - register int i; - - for (i = 0; i < n; i += 8) { - if (alloc8bytes() == 0) { - (void)GC_printf0("Out of memory\n"); - FAIL; - } - } - } - - # if defined(THREADS) && defined(GC_DEBUG) - # define TREE_HEIGHT 15 - # else - # define TREE_HEIGHT 16 - # endif - void tree_test() - { - tn * root; - register int i; - - root = mktree(TREE_HEIGHT); - alloc_small(5000000); - chktree(root, TREE_HEIGHT); - if (finalized_count && ! dropped_something) { - (void)GC_printf0("Premature finalization - collector is broken\n"); - FAIL; - } - dropped_something = 1; - GC_noop(root); /* Root needs to remain live until */ - /* dropped_something is set. */ - root = mktree(TREE_HEIGHT); - chktree(root, TREE_HEIGHT); - for (i = TREE_HEIGHT; i >= 0; i--) { - root = mktree(i); - chktree(root, i); - } - alloc_small(5000000); - } - - unsigned n_tests = 0; - - GC_word bm_huge[10] = { - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0x00ffffff, - }; - - - /* A very simple test of explicitly typed allocation */ - void typed_test() - { - GC_word * old, * new; - GC_word bm3 = 0x3; - GC_word bm2 = 0x2; - GC_word bm_large = 0xf7ff7fff; - GC_descr d1 = GC_make_descriptor(&bm3, 2); - GC_descr d2 = GC_make_descriptor(&bm2, 2); - # ifndef LINT - GC_descr dummy = GC_make_descriptor(&bm_large, 32); - # endif - GC_descr d3 = GC_make_descriptor(&bm_large, 32); - GC_descr d4 = GC_make_descriptor(bm_huge, 320); - GC_word * x = (GC_word *)GC_malloc_explicitly_typed(2000, d4); - register int i; - - old = 0; - for (i = 0; i < 4000; i++) { - new = (GC_word *) GC_malloc_explicitly_typed(4 * sizeof(GC_word), d1); - if (0 != new[0] || 0 != new[1]) { - GC_printf0("Bad initialization by GC_malloc_explicitly_typed\n"); - FAIL; - } - new[0] = 17; - new[1] = (GC_word)old; - old = new; - new = (GC_word *) GC_malloc_explicitly_typed(4 * sizeof(GC_word), d2); - new[0] = 17; - new[1] = (GC_word)old; - old = new; - new = (GC_word *) GC_malloc_explicitly_typed(33 * sizeof(GC_word), d3); - new[0] = 17; - new[1] = (GC_word)old; - old = new; - new = (GC_word *) GC_calloc_explicitly_typed(4, 2 * sizeof(GC_word), - d1); - new[0] = 17; - new[1] = (GC_word)old; - old = new; - if (i & 0xff) { - new = (GC_word *) GC_calloc_explicitly_typed(7, 3 * sizeof(GC_word), - d2); - } else { - new = (GC_word *) GC_calloc_explicitly_typed(1001, - 3 * sizeof(GC_word), - d2); - if (0 != new[0] || 0 != new[1]) { - GC_printf0("Bad initialization by GC_malloc_explicitly_typed\n"); - FAIL; - } - } - new[0] = 17; - new[1] = (GC_word)old; - old = new; - } - for (i = 0; i < 20000; i++) { - if (new[0] != 17) { - (void)GC_printf1("typed alloc failed at %lu\n", - (unsigned long)i); - FAIL; - } - new[0] = 0; - old = new; - new = (GC_word *)(old[1]); - } - GC_gcollect(); - GC_noop(x); - } - - int fail_count = 0; - - #ifndef __STDC__ - /*ARGSUSED*/ - void fail_proc1(x) - GC_PTR x; - { - fail_count++; - } - - #else - - /*ARGSUSED*/ - void fail_proc1(GC_PTR x) - { - fail_count++; - } - - #endif /* __STDC__ */ - - #ifdef THREADS - # define TEST_FAIL_COUNT(n) 1 - #else - # define TEST_FAIL_COUNT(n) (fail_count >= (n)) - #endif - - void run_one_test() - { - char *x; - # ifdef LINT - char *y = 0; - # else - char *y = (char *)(size_t)fail_proc1; - # endif - DCL_LOCK_STATE; - - # ifdef FIND_LEAK - (void)GC_printf0( - "This test program is not designed for leak detection mode\n"); - (void)GC_printf0("Expect lots of problems.\n"); - # endif - if (GC_size(GC_malloc(7)) != 8 && - GC_size(GC_malloc(7)) != MIN_WORDS * sizeof(GC_word) - || GC_size(GC_malloc(15)) != 16) { - (void)GC_printf0("GC_size produced unexpected results\n"); - FAIL; - } - if (GC_size(GC_malloc(0)) != MIN_WORDS * sizeof(GC_word)) { - (void)GC_printf0("GC_malloc(0) failed\n"); - FAIL; - } - if (GC_size(GC_malloc_uncollectable(0)) != MIN_WORDS * sizeof(GC_word)) { - (void)GC_printf0("GC_malloc_uncollectable(0) failed\n"); - FAIL; - } - GC_FREE(0); - GC_is_valid_displacement_print_proc = fail_proc1; - GC_is_visible_print_proc = fail_proc1; - x = GC_malloc(16); - if (GC_base(x + 13) != x) { - (void)GC_printf0("GC_base(heap ptr) produced incorrect result\n"); - FAIL; - } - # ifndef PCR - if (GC_base(y) != 0) { - (void)GC_printf0("GC_base(fn_ptr) produced incorrect result\n"); - FAIL; - } - # endif - if (GC_same_obj(x+5, x) != x + 5) { - (void)GC_printf0("GC_same_obj produced incorrect result\n"); - FAIL; - } - if (GC_is_visible(y) != y || GC_is_visible(x) != x) { - (void)GC_printf0("GC_is_visible produced incorrect result\n"); - FAIL; - } - if (!TEST_FAIL_COUNT(1)) { - # if!(defined(RS6000) || defined(POWERPC) || defined(IA64)) - /* ON RS6000s function pointers point to a descriptor in the */ - /* data segment, so there should have been no failures. */ - (void)GC_printf0("GC_is_visible produced wrong failure indication\n"); - FAIL; - # endif - } - if (GC_is_valid_displacement(y) != y - || GC_is_valid_displacement(x) != x - || GC_is_valid_displacement(x + 3) != x + 3) { - (void)GC_printf0( - "GC_is_valid_displacement produced incorrect result\n"); - FAIL; - } - # ifndef ALL_INTERIOR_POINTERS - # if defined(RS6000) || defined(POWERPC) - if (!TEST_FAIL_COUNT(1)) { - # else - if (!TEST_FAIL_COUNT(2)) { - # endif - (void)GC_printf0("GC_is_valid_displacement produced wrong failure indication\n"); - FAIL; - } - # endif - /* Test floating point alignment */ - *(double *)GC_MALLOC(sizeof(double)) = 1.0; - *(double *)GC_MALLOC(sizeof(double)) = 1.0; - # ifdef GC_GCJ_SUPPORT - GC_REGISTER_DISPLACEMENT(sizeof(struct fake_vtable *)); - GC_init_gcj_malloc(0, (void *)fake_gcj_mark_proc); - # endif - /* Repeated list reversal test. */ - reverse_test(); - # ifdef PRINTSTATS - GC_printf0("-------------Finished reverse_test\n"); - # endif - typed_test(); - # ifdef PRINTSTATS - GC_printf0("-------------Finished typed_test\n"); - # endif - tree_test(); - LOCK(); - n_tests++; - UNLOCK(); - /* GC_printf1("Finished %x\n", pthread_self()); */ - } - - void check_heap_stats() - { - unsigned long max_heap_sz; - register int i; - int still_live; - int late_finalize_count = 0; - - if (sizeof(char *) > 4) { - max_heap_sz = 15000000; - } else { - max_heap_sz = 11000000; - } - # ifdef GC_DEBUG - max_heap_sz *= 2; - # ifdef SPARC - max_heap_sz *= 2; - # endif - # endif - /* Garbage collect repeatedly so that all inaccessible objects */ - /* can be finalized. */ - while (GC_collect_a_little()) { } - for (i = 0; i < 16; i++) { - GC_gcollect(); - late_finalize_count += GC_invoke_finalizers(); - } - (void)GC_printf1("Completed %lu tests\n", (unsigned long)n_tests); - (void)GC_printf2("Finalized %lu/%lu objects - ", - (unsigned long)finalized_count, - (unsigned long)finalizable_count); - # ifdef FINALIZE_ON_DEMAND - if (finalized_count != late_finalize_count) { - (void)GC_printf0("Demand finalization error\n"); - FAIL; - } - # endif - if (finalized_count > finalizable_count - || finalized_count < finalizable_count/2) { - (void)GC_printf0("finalization is probably broken\n"); - FAIL; - } else { - (void)GC_printf0("finalization is probably ok\n"); - } - still_live = 0; - for (i = 0; i < MAX_FINALIZED; i++) { - if (live_indicators[i] != 0) { - still_live++; - } - } - i = finalizable_count - finalized_count - still_live; - if (0 != i) { - (void)GC_printf2 - ("%lu disappearing links remain and %lu more objects were not finalized\n", - (unsigned long) still_live, (unsigned long)i); - if (i > 10) { - GC_printf0("\tVery suspicious!\n"); - } else { - GC_printf0("\tSlightly suspicious, but probably OK.\n"); - } - } - (void)GC_printf1("Total number of bytes allocated is %lu\n", - (unsigned long) - WORDS_TO_BYTES(GC_words_allocd + GC_words_allocd_before_gc)); - (void)GC_printf1("Final heap size is %lu bytes\n", - (unsigned long)GC_get_heap_size()); - if (WORDS_TO_BYTES(GC_words_allocd + GC_words_allocd_before_gc) - < 33500000*n_tests) { - (void)GC_printf0("Incorrect execution - missed some allocations\n"); - FAIL; - } - if (GC_get_heap_size() > max_heap_sz*n_tests) { - (void)GC_printf0("Unexpected heap growth - collector may be broken\n"); - FAIL; - } - (void)GC_printf0("Collector appears to work\n"); - } - - #if defined(MACOS) - void SetMinimumStack(long minSize) - { - long newApplLimit; - - if (minSize > LMGetDefltStack()) - { - newApplLimit = (long) GetApplLimit() - - (minSize - LMGetDefltStack()); - SetApplLimit((Ptr) newApplLimit); - MaxApplZone(); - } - } - - #define cMinStackSpace (512L * 1024L) - - #endif - - #ifdef __STDC__ - void warn_proc(char *msg, GC_word p) - #else - void warn_proc(msg, p) - char *msg; - GC_word p; - #endif - { - GC_printf1(msg, (unsigned long)p); - FAIL; - } - - - #if !defined(PCR) && !defined(SOLARIS_THREADS) && !defined(WIN32_THREADS) \ - && !defined(IRIX_THREADS) && !defined(LINUX_THREADS) \ - && !defined(HPUX_THREADS) || defined(LINT) - #if defined(MSWIN32) && !defined(__MINGW32__) - int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int n) - #else - int main() - #endif - { - # if defined(DJGPP) - int dummy; - # endif - n_tests = 0; - - # if defined(DJGPP) - /* No good way to determine stack base from library; do it */ - /* manually on this platform. */ - GC_stackbottom = (GC_PTR)(&dummy); - # endif - # if defined(MACOS) - /* Make sure we have lots and lots of stack space. */ - SetMinimumStack(cMinStackSpace); - /* Cheat and let stdio initialize toolbox for us. */ - printf("Testing GC Macintosh port.\n"); - # endif - GC_INIT(); /* Only needed if gc is dynamic library. */ - (void) GC_set_warn_proc(warn_proc); - # if defined(MPROTECT_VDB) || defined(PROC_VDB) - GC_enable_incremental(); - (void) GC_printf0("Switched to incremental mode\n"); - # if defined(MPROTECT_VDB) - (void)GC_printf0("Emulating dirty bits with mprotect/signals\n"); - # else - (void)GC_printf0("Reading dirty bits from /proc\n"); - # endif - # endif - run_one_test(); - check_heap_stats(); - (void)fflush(stdout); - # ifdef LINT - /* Entry points we should be testing, but aren't. */ - /* Some can be tested by defining GC_DEBUG at the top of this file */ - /* This is a bit SunOS4 specific. */ - GC_noop(GC_expand_hp, GC_add_roots, GC_clear_roots, - GC_register_disappearing_link, - GC_register_finalizer_ignore_self, - GC_debug_register_displacement, - GC_print_obj, GC_debug_change_stubborn, - GC_debug_end_stubborn_change, GC_debug_malloc_uncollectable, - GC_debug_free, GC_debug_realloc, GC_generic_malloc_words_small, - GC_init, GC_make_closure, GC_debug_invoke_finalizer, - GC_page_was_ever_dirty, GC_is_fresh, - GC_malloc_ignore_off_page, GC_malloc_atomic_ignore_off_page, - GC_set_max_heap_size, GC_get_bytes_since_gc, - GC_pre_incr, GC_post_incr); - # endif - # ifdef MSWIN32 - GC_win32_free_heap(); - # endif - return(0); - } - # endif - - #ifdef WIN32_THREADS - - unsigned __stdcall thr_run_one_test(void *arg) - { - run_one_test(); - return 0; - } - - #define NTEST 2 - - int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int n) - { - # if NTEST > 0 - HANDLE h[NTEST]; - # endif - int i; - unsigned thread_id; - # if 0 - GC_enable_incremental(); - # endif - InitializeCriticalSection(&incr_cs); - (void) GC_set_warn_proc(warn_proc); - # if NTEST > 0 - for (i = 0; i < NTEST; i++) { - h[i] = (HANDLE)_beginthreadex(NULL, 0, thr_run_one_test, 0, 0, &thread_id); - if (h[i] == (HANDLE)-1) { - (void)GC_printf1("Thread creation failed %lu\n", (unsigned long)GetLastError()); - FAIL; - } - } - # endif /* NTEST > 0 */ - run_one_test(); - # if NTEST > 0 - for (i = 0; i < NTEST; i++) { - if (WaitForSingleObject(h[i], INFINITE) != WAIT_OBJECT_0) { - (void)GC_printf1("Thread wait failed %lu\n", (unsigned long)GetLastError()); - FAIL; - } - } - # endif /* NTEST > 0 */ - check_heap_stats(); - (void)fflush(stdout); - return(0); - } - - #endif /* WIN32_THREADS */ - - - #ifdef PCR - test() - { - PCR_Th_T * th1; - PCR_Th_T * th2; - int code; - - n_tests = 0; - /* GC_enable_incremental(); */ - (void) GC_set_warn_proc(warn_proc); - th1 = PCR_Th_Fork(run_one_test, 0); - th2 = PCR_Th_Fork(run_one_test, 0); - run_one_test(); - if (PCR_Th_T_Join(th1, &code, NIL, PCR_allSigsBlocked, PCR_waitForever) - != PCR_ERes_okay || code != 0) { - (void)GC_printf0("Thread 1 failed\n"); - } - if (PCR_Th_T_Join(th2, &code, NIL, PCR_allSigsBlocked, PCR_waitForever) - != PCR_ERes_okay || code != 0) { - (void)GC_printf0("Thread 2 failed\n"); - } - check_heap_stats(); - (void)fflush(stdout); - return(0); - } - #endif - - #if defined(SOLARIS_THREADS) || defined(IRIX_THREADS) \ - || defined(HPUX_THREADS) || defined(LINUX_THREADS) - void * thr_run_one_test(void * arg) - { - run_one_test(); - return(0); - } - - #ifdef GC_DEBUG - # define GC_free GC_debug_free - #endif - - #ifdef SOLARIS_THREADS - main() - { - thread_t th1; - thread_t th2; - int code; - - n_tests = 0; - GC_INIT(); /* Only needed if gc is dynamic library. */ - GC_enable_incremental(); - (void) GC_set_warn_proc(warn_proc); - if (thr_keycreate(&fl_key, GC_free) != 0) { - (void)GC_printf1("Key creation failed %lu\n", (unsigned long)code); - FAIL; - } - if ((code = thr_create(0, 1024*1024, thr_run_one_test, 0, 0, &th1)) != 0) { - (void)GC_printf1("Thread 1 creation failed %lu\n", (unsigned long)code); - FAIL; - } - if ((code = thr_create(0, 1024*1024, thr_run_one_test, 0, THR_NEW_LWP, &th2)) != 0) { - (void)GC_printf1("Thread 2 creation failed %lu\n", (unsigned long)code); - FAIL; - } - run_one_test(); - if ((code = thr_join(th1, 0, 0)) != 0) { - (void)GC_printf1("Thread 1 failed %lu\n", (unsigned long)code); - FAIL; - } - if (thr_join(th2, 0, 0) != 0) { - (void)GC_printf1("Thread 2 failed %lu\n", (unsigned long)code); - FAIL; - } - check_heap_stats(); - (void)fflush(stdout); - return(0); - } - #else /* pthreads */ - main() - { - pthread_t th1; - pthread_t th2; - pthread_attr_t attr; - int code; - - # ifdef IRIX_THREADS - /* Force a larger stack to be preallocated */ - /* Since the initial cant always grow later. */ - *((volatile char *)&code - 1024*1024) = 0; /* Require 1 Mb */ - # endif /* IRIX_THREADS */ - pthread_attr_init(&attr); - # if defined(IRIX_THREADS) || defined(HPUX_THREADS) - pthread_attr_setstacksize(&attr, 1000000); - # endif - n_tests = 0; - # ifdef MPROTECT_VDB - GC_enable_incremental(); - (void) GC_printf0("Switched to incremental mode\n"); - (void) GC_printf0("Emulating dirty bits with mprotect/signals\n"); - # endif - (void) GC_set_warn_proc(warn_proc); - if ((code = pthread_key_create(&fl_key, 0)) != 0) { - (void)GC_printf1("Key creation failed %lu\n", (unsigned long)code); - FAIL; - } - if ((code = pthread_create(&th1, &attr, thr_run_one_test, 0)) != 0) { - (void)GC_printf1("Thread 1 creation failed %lu\n", (unsigned long)code); - FAIL; - } - if ((code = pthread_create(&th2, &attr, thr_run_one_test, 0)) != 0) { - (void)GC_printf1("Thread 2 creation failed %lu\n", (unsigned long)code); - FAIL; - } - run_one_test(); - if ((code = pthread_join(th1, 0)) != 0) { - (void)GC_printf1("Thread 1 failed %lu\n", (unsigned long)code); - FAIL; - } - if (pthread_join(th2, 0) != 0) { - (void)GC_printf1("Thread 2 failed %lu\n", (unsigned long)code); - FAIL; - } - check_heap_stats(); - (void)fflush(stdout); - pthread_attr_destroy(&attr); - GC_printf1("Completed %d collections\n", GC_gc_no); - return(0); - } - #endif /* pthreads */ - #endif /* SOLARIS_THREADS || IRIX_THREADS || LINUX_THREADS || HPUX_THREADS */ --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/test_cpp.cc gcc-3.1/boehm-gc/test_cpp.cc *** gcc-3.0.4/boehm-gc/test_cpp.cc Wed Apr 19 10:09:58 2000 --- gcc-3.1/boehm-gc/test_cpp.cc Thu Jan 1 00:00:00 1970 *************** *** 1,271 **** - /**************************************************************************** - Copyright (c) 1994 by Xerox Corporation. All rights reserved. - - THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - - Permission is hereby granted to use or copy this program for any - purpose, provided the above notices are retained on all copies. - Permission to modify the code and to distribute modified code is - granted, provided the above notices are retained, and a notice that - the code was modified is included with the above copyright notice. - **************************************************************************** - Last modified on Mon Jul 10 21:06:03 PDT 1995 by ellis - modified on December 20, 1994 7:27 pm PST by boehm - - usage: test_cpp number-of-iterations - - This program tries to test the specific C++ functionality provided by - gc_c++.h that isn't tested by the more general test routines of the - collector. - - A recommended value for number-of-iterations is 10, which will take a - few minutes to complete. - - ***************************************************************************/ - - #include "gc_cpp.h" - #include - #include - #include - #ifndef __GNUC__ - # include "gc_alloc.h" - #endif - extern "C" { - #include "gc_priv.h" - } - #ifdef MSWIN32 - # include - #endif - #ifdef GC_NAME_CONFLICT - # define USE_GC UseGC - struct foo * GC; - #else - # define USE_GC GC - #endif - - - #define my_assert( e ) \ - if (! (e)) { \ - GC_printf1( "Assertion failure in " __FILE__ ", line %d: " #e "\n", \ - __LINE__ ); \ - exit( 1 ); } - - - class A {public: - /* An uncollectable class. */ - - A( int iArg ): i( iArg ) {} - void Test( int iArg ) { - my_assert( i == iArg );} - int i;}; - - - class B: public gc, public A {public: - /* A collectable class. */ - - B( int j ): A( j ) {} - ~B() { - my_assert( deleting );} - static void Deleting( int on ) { - deleting = on;} - static int deleting;}; - - int B::deleting = 0; - - - class C: public gc_cleanup, public A {public: - /* A collectable class with cleanup and virtual multiple inheritance. */ - - C( int levelArg ): A( levelArg ), level( levelArg ) { - nAllocated++; - if (level > 0) { - left = new C( level - 1 ); - right = new C( level - 1 );} - else { - left = right = 0;}} - ~C() { - this->A::Test( level ); - nFreed++; - my_assert( level == 0 ? - left == 0 && right == 0 : - level == left->level + 1 && level == right->level + 1 ); - left = right = 0; - level = -123456;} - static void Test() { - my_assert( nFreed <= nAllocated && nFreed >= .8 * nAllocated );} - - static int nFreed; - static int nAllocated; - int level; - C* left; - C* right;}; - - int C::nFreed = 0; - int C::nAllocated = 0; - - - class D: public gc {public: - /* A collectable class with a static member function to be used as - an explicit clean-up function supplied to ::new. */ - - D( int iArg ): i( iArg ) { - nAllocated++;} - static void CleanUp( void* obj, void* data ) { - D* self = (D*) obj; - nFreed++; - my_assert( self->i == (int) (long) data );} - static void Test() { - my_assert( nFreed >= .8 * nAllocated );} - - int i; - static int nFreed; - static int nAllocated;}; - - int D::nFreed = 0; - int D::nAllocated = 0; - - - class E: public gc_cleanup {public: - /* A collectable class with clean-up for use by F. */ - - E() { - nAllocated++;} - ~E() { - nFreed++;} - - static int nFreed; - static int nAllocated;}; - - int E::nFreed = 0; - int E::nAllocated = 0; - - - class F: public E {public: - /* A collectable class with clean-up, a base with clean-up, and a - member with clean-up. */ - - F() { - nAllocated++;} - ~F() { - nFreed++;} - static void Test() { - my_assert( nFreed >= .8 * nAllocated ); - my_assert( 2 * nFreed == E::nFreed );} - - E e; - static int nFreed; - static int nAllocated;}; - - int F::nFreed = 0; - int F::nAllocated = 0; - - - long Disguise( void* p ) { - return ~ (long) p;} - - void* Undisguise( long i ) { - return (void*) ~ i;} - - - #ifdef MSWIN32 - int APIENTRY WinMain( - HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int cmdShow ) - { - int argc; - char* argv[ 3 ]; - - for (argc = 1; argc < sizeof( argv ) / sizeof( argv[ 0 ] ); argc++) { - argv[ argc ] = strtok( argc == 1 ? cmd : 0, " \t" ); - if (0 == argv[ argc ]) break;} - - #else - # ifdef MACOS - int main() { - # else - int main( int argc, char* argv[] ) { - # endif - #endif - - # if defined(MACOS) // MacOS - char* argv_[] = {"test_cpp", "10"}; // doesn't - argv = argv_; // have a - argc = sizeof(argv_)/sizeof(argv_[0]); // commandline - # endif - int i, iters, n; - # if !defined(__GNUC__) && !defined(MACOS) - int *x = (int *)alloc::allocate(sizeof(int)); - - *x = 29; - x -= 3; - # endif - if (argc != 2 || (0 >= (n = atoi( argv[ 1 ] )))) { - GC_printf0( "usage: test_cpp number-of-iterations\n" ); - exit( 1 );} - - for (iters = 1; iters <= n; iters++) { - GC_printf1( "Starting iteration %d\n", iters ); - - /* Allocate some uncollectable As and disguise their pointers. - Later we'll check to see if the objects are still there. We're - checking to make sure these objects really are uncollectable. */ - long as[ 1000 ]; - long bs[ 1000 ]; - for (i = 0; i < 1000; i++) { - as[ i ] = Disguise( new (NoGC) A( i ) ); - bs[ i ] = Disguise( new (NoGC) B( i ) );} - - /* Allocate a fair number of finalizable Cs, Ds, and Fs. - Later we'll check to make sure they've gone away. */ - for (i = 0; i < 1000; i++) { - C* c = new C( 2 ); - C c1( 2 ); /* stack allocation should work too */ - D* d = ::new (USE_GC, D::CleanUp, (void*) i) D( i ); - F* f = new F; - if (0 == i % 10) delete c;} - - /* Allocate a very large number of collectable As and Bs and - drop the references to them immediately, forcing many - collections. */ - for (i = 0; i < 1000000; i++) { - A* a = new (USE_GC) A( i ); - B* b = new B( i ); - b = new (USE_GC) B( i ); - if (0 == i % 10) { - B::Deleting( 1 ); - delete b; - B::Deleting( 0 );} - # ifdef FINALIZE_ON_DEMAND - GC_invoke_finalizers(); - # endif - } - - /* Make sure the uncollectable As and Bs are still there. */ - for (i = 0; i < 1000; i++) { - A* a = (A*) Undisguise( as[ i ] ); - B* b = (B*) Undisguise( bs[ i ] ); - a->Test( i ); - delete a; - b->Test( i ); - B::Deleting( 1 ); - delete b; - B::Deleting( 0 ); - # ifdef FINALIZE_ON_DEMAND - GC_invoke_finalizers(); - # endif - - } - - /* Make sure most of the finalizable Cs, Ds, and Fs have - gone away. */ - C::Test(); - D::Test(); - F::Test();} - - # if !defined(__GNUC__) && !defined(MACOS) - my_assert (29 == x[3]); - # endif - GC_printf0( "The test appears to have succeeded.\n" ); - return( 0 );} - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/tests/leak_test.c gcc-3.1/boehm-gc/tests/leak_test.c *** gcc-3.0.4/boehm-gc/tests/leak_test.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/tests/leak_test.c Fri Aug 17 18:30:51 2001 *************** *** 0 **** --- 1,21 ---- + #include "leak_detector.h" + + main() { + int *p[10]; + int i; + GC_find_leak = 1; /* for new collect versions not compiled */ + /* with -DFIND_LEAK. */ + for (i = 0; i < 10; ++i) { + p[i] = malloc(sizeof(int)+i); + } + CHECK_LEAKS(); + for (i = 1; i < 10; ++i) { + free(p[i]); + } + for (i = 0; i < 9; ++i) { + p[i] = malloc(sizeof(int)+i); + } + CHECK_LEAKS(); + CHECK_LEAKS(); + CHECK_LEAKS(); + } diff -Nrc3pad gcc-3.0.4/boehm-gc/tests/test.c gcc-3.1/boehm-gc/tests/test.c *** gcc-3.0.4/boehm-gc/tests/test.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/tests/test.c Tue Feb 12 04:37:57 2002 *************** *** 0 **** --- 1,1667 ---- + /* + * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers + * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * Copyright (c) 1996 by Silicon Graphics. All rights reserved. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + /* An incomplete test for the garbage collector. */ + /* Some more obscure entry points are not tested at all. */ + /* This must be compiled with the same flags used to build the */ + /* GC. It uses GC internals to allow more precise results */ + /* checking for some of the tests. */ + + # undef GC_BUILD + + #if defined(DBG_HDRS_ALL) || defined(MAKE_BACK_GRAPH) + # define GC_DEBUG + #endif + + # if defined(mips) && defined(SYSTYPE_BSD43) + /* MIPS RISCOS 4 */ + # else + # include + # endif + # include + # ifdef _WIN32_WCE + # include + # define assert ASSERT + # else + # include /* Not normally used, but handy for debugging. */ + # endif + # include /* Not normally used, but handy for debugging. */ + # include "gc.h" + # include "gc_typed.h" + # ifdef THREAD_LOCAL_ALLOC + # include "gc_local_alloc.h" + # endif + # include "private/gc_priv.h" /* For output, locking, MIN_WORDS, */ + /* and some statistics. */ + # include "private/gcconfig.h" + + # if defined(MSWIN32) || defined(MSWINCE) + # include + # endif + + # ifdef PCR + # include "th/PCR_ThCrSec.h" + # include "th/PCR_Th.h" + # undef GC_printf0 + # define GC_printf0 printf + # undef GC_printf1 + # define GC_printf1 printf + # endif + + # if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) + # include + # include + # endif + + # if defined(GC_PTHREADS) + # include + # endif + + # ifdef GC_WIN32_THREADS + # ifndef MSWINCE + # include + # define GC_CreateThread(a,b,c,d,e,f) ((HANDLE) _beginthreadex(a,b,c,d,e,f)) + # endif + static CRITICAL_SECTION incr_cs; + # endif + + + /* Allocation Statistics */ + int stubborn_count = 0; + int uncollectable_count = 0; + int collectable_count = 0; + int atomic_count = 0; + int realloc_count = 0; + + #if defined(GC_AMIGA_FASTALLOC) && defined(AMIGA) + + extern void GC_amiga_free_all_mem(void); + void Amiga_Fail(void){GC_amiga_free_all_mem();abort();} + # define FAIL (void)Amiga_Fail() + void *GC_amiga_gctest_malloc_explicitly_typed(size_t lb, GC_descr d){ + void *ret=GC_malloc_explicitly_typed(lb,d); + if(ret==NULL){ + if(!GC_dont_gc){ + GC_gcollect(); + ret=GC_malloc_explicitly_typed(lb,d); + } + if(ret==NULL){ + GC_printf0("Out of memory, (typed allocations are not directly " + "supported with the GC_AMIGA_FASTALLOC option.)\n"); + FAIL; + } + } + return ret; + } + void *GC_amiga_gctest_calloc_explicitly_typed(size_t a,size_t lb, GC_descr d){ + void *ret=GC_calloc_explicitly_typed(a,lb,d); + if(ret==NULL){ + if(!GC_dont_gc){ + GC_gcollect(); + ret=GC_calloc_explicitly_typed(a,lb,d); + } + if(ret==NULL){ + GC_printf0("Out of memory, (typed allocations are not directly " + "supported with the GC_AMIGA_FASTALLOC option.)\n"); + FAIL; + } + } + return ret; + } + # define GC_malloc_explicitly_typed(a,b) GC_amiga_gctest_malloc_explicitly_typed(a,b) + # define GC_calloc_explicitly_typed(a,b,c) GC_amiga_gctest_calloc_explicitly_typed(a,b,c) + + #else /* !AMIGA_FASTALLOC */ + + # ifdef PCR + # define FAIL (void)abort() + # else + # ifdef MSWINCE + # define FAIL DebugBreak() + # else + # define FAIL GC_abort("Test failed"); + # endif + # endif + + #endif /* !AMIGA_FASTALLOC */ + + /* AT_END may be defined to exercise the interior pointer test */ + /* if the collector is configured with ALL_INTERIOR_POINTERS. */ + /* As it stands, this test should succeed with either */ + /* configuration. In the FIND_LEAK configuration, it should */ + /* find lots of leaks, since we free almost nothing. */ + + struct SEXPR { + struct SEXPR * sexpr_car; + struct SEXPR * sexpr_cdr; + }; + + + typedef struct SEXPR * sexpr; + + # define INT_TO_SEXPR(x) ((sexpr)(unsigned long)(x)) + + # undef nil + # define nil (INT_TO_SEXPR(0)) + # define car(x) ((x) -> sexpr_car) + # define cdr(x) ((x) -> sexpr_cdr) + # define is_nil(x) ((x) == nil) + + + int extra_count = 0; /* Amount of space wasted in cons node */ + + /* Silly implementation of Lisp cons. Intentionally wastes lots of space */ + /* to test collector. */ + # ifdef VERY_SMALL_CONFIG + # define cons small_cons + # else + sexpr cons (x, y) + sexpr x; + sexpr y; + { + register sexpr r; + register int *p; + register int my_extra = extra_count; + + stubborn_count++; + r = (sexpr) GC_MALLOC_STUBBORN(sizeof(struct SEXPR) + my_extra); + if (r == 0) { + (void)GC_printf0("Out of memory\n"); + exit(1); + } + for (p = (int *)r; + ((char *)p) < ((char *)r) + my_extra + sizeof(struct SEXPR); p++) { + if (*p) { + (void)GC_printf1("Found nonzero at 0x%lx - allocator is broken\n", + (unsigned long)p); + FAIL; + } + *p = 13; + } + # ifdef AT_END + r = (sexpr)((char *)r + (my_extra & ~7)); + # endif + r -> sexpr_car = x; + r -> sexpr_cdr = y; + my_extra++; + if ( my_extra >= 5000 ) { + extra_count = 0; + } else { + extra_count = my_extra; + } + GC_END_STUBBORN_CHANGE((char *)r); + return(r); + } + # endif + + sexpr small_cons (x, y) + sexpr x; + sexpr y; + { + register sexpr r; + + collectable_count++; + r = (sexpr) GC_MALLOC(sizeof(struct SEXPR)); + if (r == 0) { + (void)GC_printf0("Out of memory\n"); + exit(1); + } + r -> sexpr_car = x; + r -> sexpr_cdr = y; + return(r); + } + + sexpr small_cons_uncollectable (x, y) + sexpr x; + sexpr y; + { + register sexpr r; + + uncollectable_count++; + r = (sexpr) GC_MALLOC_UNCOLLECTABLE(sizeof(struct SEXPR)); + if (r == 0) { + (void)GC_printf0("Out of memory\n"); + exit(1); + } + r -> sexpr_car = x; + r -> sexpr_cdr = (sexpr)(~(unsigned long)y); + return(r); + } + + #ifdef GC_GCJ_SUPPORT + + #include "gc_mark.h" + #include "private/dbg_mlc.h" /* For USR_PTR_FROM_BASE */ + #include "gc_gcj.h" + + /* The following struct emulates the vtable in gcj. */ + /* This assumes the default value of MARK_DESCR_OFFSET. */ + struct fake_vtable { + void * dummy; /* class pointer in real gcj. */ + size_t descr; + }; + + struct fake_vtable gcj_class_struct1 = { 0, sizeof(struct SEXPR) + + sizeof(struct fake_vtable *) }; + /* length based descriptor. */ + struct fake_vtable gcj_class_struct2 = + { 0, (3l << (CPP_WORDSZ - 3)) | GC_DS_BITMAP}; + /* Bitmap based descriptor. */ + + struct GC_ms_entry * fake_gcj_mark_proc(word * addr, + struct GC_ms_entry *mark_stack_ptr, + struct GC_ms_entry *mark_stack_limit, + word env ) + { + sexpr x; + if (1 == env) { + /* Object allocated with debug allocator. */ + addr = (word *)USR_PTR_FROM_BASE(addr); + } + x = (sexpr)(addr + 1); /* Skip the vtable pointer. */ + mark_stack_ptr = GC_MARK_AND_PUSH( + (GC_PTR)(x -> sexpr_cdr), mark_stack_ptr, + mark_stack_limit, (GC_PTR *)&(x -> sexpr_cdr)); + mark_stack_ptr = GC_MARK_AND_PUSH( + (GC_PTR)(x -> sexpr_car), mark_stack_ptr, + mark_stack_limit, (GC_PTR *)&(x -> sexpr_car)); + return(mark_stack_ptr); + } + + sexpr gcj_cons(x, y) + sexpr x; + sexpr y; + { + GC_word * r; + sexpr result; + static int count = 0; + + if (++count & 1) { + # ifdef USE_MARK_BYTES + r = (GC_word *) GC_GCJ_FAST_MALLOC(4, &gcj_class_struct1); + # else + r = (GC_word *) GC_GCJ_FAST_MALLOC(3, &gcj_class_struct1); + # endif + } else { + r = (GC_word *) GC_GCJ_MALLOC(sizeof(struct SEXPR) + + sizeof(struct fake_vtable*), + &gcj_class_struct2); + } + if (r == 0) { + (void)GC_printf0("Out of memory\n"); + exit(1); + } + result = (sexpr)(r + 1); + result -> sexpr_car = x; + result -> sexpr_cdr = y; + return(result); + } + #endif + + /* Return reverse(x) concatenated with y */ + sexpr reverse1(x, y) + sexpr x, y; + { + if (is_nil(x)) { + return(y); + } else { + return( reverse1(cdr(x), cons(car(x), y)) ); + } + } + + sexpr reverse(x) + sexpr x; + { + return( reverse1(x, nil) ); + } + + sexpr ints(low, up) + int low, up; + { + if (low > up) { + return(nil); + } else { + return(small_cons(small_cons(INT_TO_SEXPR(low), nil), ints(low+1, up))); + } + } + + #ifdef GC_GCJ_SUPPORT + /* Return reverse(x) concatenated with y */ + sexpr gcj_reverse1(x, y) + sexpr x, y; + { + if (is_nil(x)) { + return(y); + } else { + return( gcj_reverse1(cdr(x), gcj_cons(car(x), y)) ); + } + } + + sexpr gcj_reverse(x) + sexpr x; + { + return( gcj_reverse1(x, nil) ); + } + + sexpr gcj_ints(low, up) + int low, up; + { + if (low > up) { + return(nil); + } else { + return(gcj_cons(gcj_cons(INT_TO_SEXPR(low), nil), gcj_ints(low+1, up))); + } + } + #endif /* GC_GCJ_SUPPORT */ + + /* To check uncollectable allocation we build lists with disguised cdr */ + /* pointers, and make sure they don't go away. */ + sexpr uncollectable_ints(low, up) + int low, up; + { + if (low > up) { + return(nil); + } else { + return(small_cons_uncollectable(small_cons(INT_TO_SEXPR(low), nil), + uncollectable_ints(low+1, up))); + } + } + + void check_ints(list, low, up) + sexpr list; + int low, up; + { + if ((int)(GC_word)(car(car(list))) != low) { + (void)GC_printf0( + "List reversal produced incorrect list - collector is broken\n"); + FAIL; + } + if (low == up) { + if (cdr(list) != nil) { + (void)GC_printf0("List too long - collector is broken\n"); + FAIL; + } + } else { + check_ints(cdr(list), low+1, up); + } + } + + # define UNCOLLECTABLE_CDR(x) (sexpr)(~(unsigned long)(cdr(x))) + + void check_uncollectable_ints(list, low, up) + sexpr list; + int low, up; + { + if ((int)(GC_word)(car(car(list))) != low) { + (void)GC_printf0( + "Uncollectable list corrupted - collector is broken\n"); + FAIL; + } + if (low == up) { + if (UNCOLLECTABLE_CDR(list) != nil) { + (void)GC_printf0("Uncollectable list too long - collector is broken\n"); + FAIL; + } + } else { + check_uncollectable_ints(UNCOLLECTABLE_CDR(list), low+1, up); + } + } + + /* Not used, but useful for debugging: */ + void print_int_list(x) + sexpr x; + { + if (is_nil(x)) { + (void)GC_printf0("NIL\n"); + } else { + (void)GC_printf1("(%ld)", (long)(car(car(x)))); + if (!is_nil(cdr(x))) { + (void)GC_printf0(", "); + (void)print_int_list(cdr(x)); + } else { + (void)GC_printf0("\n"); + } + } + } + + /* Try to force a to be strangely aligned */ + struct { + char dummy; + sexpr aa; + } A; + #define a A.aa + + /* + * A tiny list reversal test to check thread creation. + */ + #ifdef THREADS + + # ifdef GC_WIN32_THREADS + unsigned __stdcall tiny_reverse_test(void * arg) + # else + void * tiny_reverse_test(void * arg) + # endif + { + check_ints(reverse(reverse(ints(1,10))), 1, 10); + return 0; + } + + # if defined(GC_PTHREADS) + void fork_a_thread() + { + pthread_t t; + int code; + if ((code = pthread_create(&t, 0, tiny_reverse_test, 0)) != 0) { + (void)GC_printf1("Small thread creation failed %lu\n", + (unsigned long)code); + FAIL; + } + if ((code = pthread_join(t, 0)) != 0) { + (void)GC_printf1("Small thread join failed %lu\n", + (unsigned long)code); + FAIL; + } + } + + # elif defined(GC_WIN32_THREADS) + void fork_a_thread() + { + unsigned thread_id; + HANDLE h; + h = GC_CreateThread(NULL, 0, tiny_reverse_test, 0, 0, &thread_id); + if (h == (HANDLE)NULL) { + (void)GC_printf1("Small thread creation failed %lu\n", + (unsigned long)GetLastError()); + FAIL; + } + if (WaitForSingleObject(h, INFINITE) != WAIT_OBJECT_0) { + (void)GC_printf1("Small thread wait failed %lu\n", + (unsigned long)GetLastError()); + FAIL; + } + } + + /* # elif defined(GC_SOLARIS_THREADS) */ + + # else + + # define fork_a_thread() + + # endif + + #else + + # define fork_a_thread() + + #endif + + /* + * Repeatedly reverse lists built out of very different sized cons cells. + * Check that we didn't lose anything. + */ + void reverse_test() + { + int i; + sexpr b; + sexpr c; + sexpr d; + sexpr e; + sexpr *f, *g, *h; + # if defined(MSWIN32) || defined(MACOS) + /* Win32S only allows 128K stacks */ + # define BIG 1000 + # else + # if defined PCR + /* PCR default stack is 100K. Stack frames are up to 120 bytes. */ + # define BIG 700 + # else + # if defined MSWINCE + /* WinCE only allows 64K stacks */ + # define BIG 500 + # else + # if defined(OSF1) + /* OSF has limited stack space by default, and large frames. */ + # define BIG 200 + # else + # define BIG 4500 + # endif + # endif + # endif + # endif + + A.dummy = 17; + a = ints(1, 49); + b = ints(1, 50); + c = ints(1, BIG); + d = uncollectable_ints(1, 100); + e = uncollectable_ints(1, 1); + /* Check that realloc updates object descriptors correctly */ + collectable_count++; + f = (sexpr *)GC_MALLOC(4 * sizeof(sexpr)); + realloc_count++; + f = (sexpr *)GC_REALLOC((GC_PTR)f, 6 * sizeof(sexpr)); + f[5] = ints(1,17); + collectable_count++; + g = (sexpr *)GC_MALLOC(513 * sizeof(sexpr)); + realloc_count++; + g = (sexpr *)GC_REALLOC((GC_PTR)g, 800 * sizeof(sexpr)); + g[799] = ints(1,18); + collectable_count++; + h = (sexpr *)GC_MALLOC(1025 * sizeof(sexpr)); + realloc_count++; + h = (sexpr *)GC_REALLOC((GC_PTR)h, 2000 * sizeof(sexpr)); + # ifdef GC_GCJ_SUPPORT + h[1999] = gcj_ints(1,200); + h[1999] = gcj_reverse(h[1999]); + # else + h[1999] = ints(1,200); + # endif + /* Try to force some collections and reuse of small list elements */ + for (i = 0; i < 10; i++) { + (void)ints(1, BIG); + } + /* Superficially test interior pointer recognition on stack */ + c = (sexpr)((char *)c + sizeof(char *)); + d = (sexpr)((char *)d + sizeof(char *)); + + # ifdef __STDC__ + GC_FREE((void *)e); + # else + GC_FREE((char *)e); + # endif + check_ints(b,1,50); + check_ints(a,1,49); + for (i = 0; i < 50; i++) { + check_ints(b,1,50); + b = reverse(reverse(b)); + } + check_ints(b,1,50); + check_ints(a,1,49); + for (i = 0; i < 60; i++) { + if (i % 10 == 0) fork_a_thread(); + /* This maintains the invariant that a always points to a list of */ + /* 49 integers. Thus this is thread safe without locks, */ + /* assuming atomic pointer assignments. */ + a = reverse(reverse(a)); + # if !defined(AT_END) && !defined(THREADS) + /* This is not thread safe, since realloc explicitly deallocates */ + if (i & 1) { + a = (sexpr)GC_REALLOC((GC_PTR)a, 500); + } else { + a = (sexpr)GC_REALLOC((GC_PTR)a, 8200); + } + # endif + } + check_ints(a,1,49); + check_ints(b,1,50); + c = (sexpr)((char *)c - sizeof(char *)); + d = (sexpr)((char *)d - sizeof(char *)); + check_ints(c,1,BIG); + check_uncollectable_ints(d, 1, 100); + check_ints(f[5], 1,17); + check_ints(g[799], 1,18); + # ifdef GC_GCJ_SUPPORT + h[1999] = gcj_reverse(h[1999]); + # endif + check_ints(h[1999], 1,200); + # ifndef THREADS + a = 0; + # endif + b = c = 0; + } + + /* + * The rest of this builds balanced binary trees, checks that they don't + * disappear, and tests finalization. + */ + typedef struct treenode { + int level; + struct treenode * lchild; + struct treenode * rchild; + } tn; + + int finalizable_count = 0; + int finalized_count = 0; + VOLATILE int dropped_something = 0; + + # ifdef __STDC__ + void finalizer(void * obj, void * client_data) + # else + void finalizer(obj, client_data) + char * obj; + char * client_data; + # endif + { + tn * t = (tn *)obj; + + # ifdef PCR + PCR_ThCrSec_EnterSys(); + # endif + # if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) + static mutex_t incr_lock; + mutex_lock(&incr_lock); + # endif + # if defined(GC_PTHREADS) + static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_lock(&incr_lock); + # endif + # ifdef GC_WIN32_THREADS + EnterCriticalSection(&incr_cs); + # endif + if ((int)(GC_word)client_data != t -> level) { + (void)GC_printf0("Wrong finalization data - collector is broken\n"); + FAIL; + } + finalized_count++; + # ifdef PCR + PCR_ThCrSec_ExitSys(); + # endif + # if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) + mutex_unlock(&incr_lock); + # endif + # if defined(GC_PTHREADS) + pthread_mutex_unlock(&incr_lock); + # endif + # ifdef GC_WIN32_THREADS + LeaveCriticalSection(&incr_cs); + # endif + } + + size_t counter = 0; + + # define MAX_FINALIZED 8000 + + # if !defined(MACOS) + GC_FAR GC_word live_indicators[MAX_FINALIZED] = {0}; + #else + /* Too big for THINK_C. have to allocate it dynamically. */ + GC_word *live_indicators = 0; + #endif + + int live_indicators_count = 0; + + tn * mktree(n) + int n; + { + # ifdef THREAD_LOCAL_ALLOC + tn * result = (tn *)GC_LOCAL_MALLOC(sizeof(tn)); + # else + tn * result = (tn *)GC_MALLOC(sizeof(tn)); + # endif + + collectable_count++; + # ifdef THREAD_LOCAL_ALLOC + /* Minimally exercise thread local allocation */ + { + char * result = (char *)GC_LOCAL_MALLOC_ATOMIC(17); + memset(result, 'a', 17); + } + # endif /* THREAD_LOCAL_ALLOC */ + # if defined(MACOS) + /* get around static data limitations. */ + if (!live_indicators) + live_indicators = + (GC_word*)NewPtrClear(MAX_FINALIZED * sizeof(GC_word)); + if (!live_indicators) { + (void)GC_printf0("Out of memory\n"); + exit(1); + } + # endif + if (n == 0) return(0); + if (result == 0) { + (void)GC_printf0("Out of memory\n"); + exit(1); + } + result -> level = n; + result -> lchild = mktree(n-1); + result -> rchild = mktree(n-1); + if (counter++ % 17 == 0 && n >= 2) { + tn * tmp = result -> lchild -> rchild; + + result -> lchild -> rchild = result -> rchild -> lchild; + result -> rchild -> lchild = tmp; + } + if (counter++ % 119 == 0) { + int my_index; + + { + # ifdef PCR + PCR_ThCrSec_EnterSys(); + # endif + # if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) + static mutex_t incr_lock; + mutex_lock(&incr_lock); + # endif + # if defined(GC_PTHREADS) + static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_lock(&incr_lock); + # endif + # ifdef GC_WIN32_THREADS + EnterCriticalSection(&incr_cs); + # endif + /* Losing a count here causes erroneous report of failure. */ + finalizable_count++; + my_index = live_indicators_count++; + # ifdef PCR + PCR_ThCrSec_ExitSys(); + # endif + # if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) + mutex_unlock(&incr_lock); + # endif + # if defined(GC_PTHREADS) + pthread_mutex_unlock(&incr_lock); + # endif + # ifdef GC_WIN32_THREADS + LeaveCriticalSection(&incr_cs); + # endif + } + + GC_REGISTER_FINALIZER((GC_PTR)result, finalizer, (GC_PTR)(GC_word)n, + (GC_finalization_proc *)0, (GC_PTR *)0); + if (my_index >= MAX_FINALIZED) { + GC_printf0("live_indicators overflowed\n"); + FAIL; + } + live_indicators[my_index] = 13; + if (GC_GENERAL_REGISTER_DISAPPEARING_LINK( + (GC_PTR *)(&(live_indicators[my_index])), + (GC_PTR)result) != 0) { + GC_printf0("GC_general_register_disappearing_link failed\n"); + FAIL; + } + if (GC_unregister_disappearing_link( + (GC_PTR *) + (&(live_indicators[my_index]))) == 0) { + GC_printf0("GC_unregister_disappearing_link failed\n"); + FAIL; + } + if (GC_GENERAL_REGISTER_DISAPPEARING_LINK( + (GC_PTR *)(&(live_indicators[my_index])), + (GC_PTR)result) != 0) { + GC_printf0("GC_general_register_disappearing_link failed 2\n"); + FAIL; + } + } + return(result); + } + + void chktree(t,n) + tn *t; + int n; + { + if (n == 0 && t != 0) { + (void)GC_printf0("Clobbered a leaf - collector is broken\n"); + FAIL; + } + if (n == 0) return; + if (t -> level != n) { + (void)GC_printf1("Lost a node at level %lu - collector is broken\n", + (unsigned long)n); + FAIL; + } + if (counter++ % 373 == 0) { + collectable_count++; + (void) GC_MALLOC(counter%5001); + } + chktree(t -> lchild, n-1); + if (counter++ % 73 == 0) { + collectable_count++; + (void) GC_MALLOC(counter%373); + } + chktree(t -> rchild, n-1); + } + + # if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) + thread_key_t fl_key; + + void * alloc8bytes() + { + # if defined(SMALL_CONFIG) || defined(GC_DEBUG) + collectable_count++; + return(GC_MALLOC(8)); + # else + void ** my_free_list_ptr; + void * my_free_list; + + if (thr_getspecific(fl_key, (void **)(&my_free_list_ptr)) != 0) { + (void)GC_printf0("thr_getspecific failed\n"); + FAIL; + } + if (my_free_list_ptr == 0) { + uncollectable_count++; + my_free_list_ptr = GC_NEW_UNCOLLECTABLE(void *); + if (thr_setspecific(fl_key, my_free_list_ptr) != 0) { + (void)GC_printf0("thr_setspecific failed\n"); + FAIL; + } + } + my_free_list = *my_free_list_ptr; + if (my_free_list == 0) { + collectable_count++; + my_free_list = GC_malloc_many(8); + if (my_free_list == 0) { + (void)GC_printf0("alloc8bytes out of memory\n"); + FAIL; + } + } + *my_free_list_ptr = GC_NEXT(my_free_list); + GC_NEXT(my_free_list) = 0; + return(my_free_list); + # endif + } + + #else + + # if defined(GC_PTHREADS) + pthread_key_t fl_key; + + void * alloc8bytes() + { + # if defined(SMALL_CONFIG) || defined(GC_DEBUG) + collectable_count++; + return(GC_MALLOC(8)); + # else + void ** my_free_list_ptr; + void * my_free_list; + + my_free_list_ptr = (void **)pthread_getspecific(fl_key); + if (my_free_list_ptr == 0) { + uncollectable_count++; + my_free_list_ptr = GC_NEW_UNCOLLECTABLE(void *); + if (pthread_setspecific(fl_key, my_free_list_ptr) != 0) { + (void)GC_printf0("pthread_setspecific failed\n"); + FAIL; + } + } + my_free_list = *my_free_list_ptr; + if (my_free_list == 0) { + my_free_list = GC_malloc_many(8); + if (my_free_list == 0) { + (void)GC_printf0("alloc8bytes out of memory\n"); + FAIL; + } + } + *my_free_list_ptr = GC_NEXT(my_free_list); + GC_NEXT(my_free_list) = 0; + collectable_count++; + return(my_free_list); + # endif + } + + # else + # define alloc8bytes() GC_MALLOC_ATOMIC(8) + # endif + #endif + + void alloc_small(n) + int n; + { + register int i; + + for (i = 0; i < n; i += 8) { + atomic_count++; + if (alloc8bytes() == 0) { + (void)GC_printf0("Out of memory\n"); + FAIL; + } + } + } + + # if defined(THREADS) && defined(GC_DEBUG) + # ifdef VERY_SMALL_CONFIG + # define TREE_HEIGHT 12 + # else + # define TREE_HEIGHT 15 + # endif + # else + # ifdef VERY_SMALL_CONFIG + # define TREE_HEIGHT 13 + # else + # define TREE_HEIGHT 16 + # endif + # endif + void tree_test() + { + tn * root; + register int i; + + root = mktree(TREE_HEIGHT); + # ifndef VERY_SMALL_CONFIG + alloc_small(5000000); + # endif + chktree(root, TREE_HEIGHT); + if (finalized_count && ! dropped_something) { + (void)GC_printf0("Premature finalization - collector is broken\n"); + FAIL; + } + dropped_something = 1; + GC_noop(root); /* Root needs to remain live until */ + /* dropped_something is set. */ + root = mktree(TREE_HEIGHT); + chktree(root, TREE_HEIGHT); + for (i = TREE_HEIGHT; i >= 0; i--) { + root = mktree(i); + chktree(root, i); + } + # ifndef VERY_SMALL_CONFIG + alloc_small(5000000); + # endif + } + + unsigned n_tests = 0; + + GC_word bm_huge[10] = { + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0x00ffffff, + }; + + /* A very simple test of explicitly typed allocation */ + void typed_test() + { + GC_word * old, * new; + GC_word bm3 = 0x3; + GC_word bm2 = 0x2; + GC_word bm_large = 0xf7ff7fff; + GC_descr d1 = GC_make_descriptor(&bm3, 2); + GC_descr d2 = GC_make_descriptor(&bm2, 2); + # ifndef LINT + GC_descr dummy = GC_make_descriptor(&bm_large, 32); + # endif + GC_descr d3 = GC_make_descriptor(&bm_large, 32); + GC_descr d4 = GC_make_descriptor(bm_huge, 320); + GC_word * x = (GC_word *)GC_malloc_explicitly_typed(2000, d4); + register int i; + + collectable_count++; + old = 0; + for (i = 0; i < 4000; i++) { + collectable_count++; + new = (GC_word *) GC_malloc_explicitly_typed(4 * sizeof(GC_word), d1); + if (0 != new[0] || 0 != new[1]) { + GC_printf0("Bad initialization by GC_malloc_explicitly_typed\n"); + FAIL; + } + new[0] = 17; + new[1] = (GC_word)old; + old = new; + collectable_count++; + new = (GC_word *) GC_malloc_explicitly_typed(4 * sizeof(GC_word), d2); + new[0] = 17; + new[1] = (GC_word)old; + old = new; + collectable_count++; + new = (GC_word *) GC_malloc_explicitly_typed(33 * sizeof(GC_word), d3); + new[0] = 17; + new[1] = (GC_word)old; + old = new; + collectable_count++; + new = (GC_word *) GC_calloc_explicitly_typed(4, 2 * sizeof(GC_word), + d1); + new[0] = 17; + new[1] = (GC_word)old; + old = new; + collectable_count++; + if (i & 0xff) { + new = (GC_word *) GC_calloc_explicitly_typed(7, 3 * sizeof(GC_word), + d2); + } else { + new = (GC_word *) GC_calloc_explicitly_typed(1001, + 3 * sizeof(GC_word), + d2); + if (0 != new[0] || 0 != new[1]) { + GC_printf0("Bad initialization by GC_malloc_explicitly_typed\n"); + FAIL; + } + } + new[0] = 17; + new[1] = (GC_word)old; + old = new; + } + for (i = 0; i < 20000; i++) { + if (new[0] != 17) { + (void)GC_printf1("typed alloc failed at %lu\n", + (unsigned long)i); + FAIL; + } + new[0] = 0; + old = new; + new = (GC_word *)(old[1]); + } + GC_gcollect(); + GC_noop(x); + } + + int fail_count = 0; + + #ifndef __STDC__ + /*ARGSUSED*/ + void fail_proc1(x) + GC_PTR x; + { + fail_count++; + } + + #else + + /*ARGSUSED*/ + void fail_proc1(GC_PTR x) + { + fail_count++; + } + + #endif /* __STDC__ */ + + #ifdef THREADS + # define TEST_FAIL_COUNT(n) 1 + #else + # define TEST_FAIL_COUNT(n) (fail_count >= (n)) + #endif + + void run_one_test() + { + char *x; + # ifdef LINT + char *y = 0; + # else + char *y = (char *)(size_t)fail_proc1; + # endif + DCL_LOCK_STATE; + + # ifdef FIND_LEAK + (void)GC_printf0( + "This test program is not designed for leak detection mode\n"); + (void)GC_printf0("Expect lots of problems.\n"); + # endif + GC_FREE(0); + # ifndef DBG_HDRS_ALL + collectable_count += 3; + if (GC_size(GC_malloc(7)) != 8 && + GC_size(GC_malloc(7)) != MIN_WORDS * sizeof(GC_word) + || GC_size(GC_malloc(15)) != 16) { + (void)GC_printf0("GC_size produced unexpected results\n"); + FAIL; + } + collectable_count += 1; + if (GC_size(GC_malloc(0)) != MIN_WORDS * sizeof(GC_word)) { + (void)GC_printf1("GC_malloc(0) failed: GC_size returns %ld\n", + GC_size(GC_malloc(0))); + FAIL; + } + collectable_count += 1; + if (GC_size(GC_malloc_uncollectable(0)) != MIN_WORDS * sizeof(GC_word)) { + (void)GC_printf0("GC_malloc_uncollectable(0) failed\n"); + FAIL; + } + GC_is_valid_displacement_print_proc = fail_proc1; + GC_is_visible_print_proc = fail_proc1; + collectable_count += 1; + x = GC_malloc(16); + if (GC_base(x + 13) != x) { + (void)GC_printf0("GC_base(heap ptr) produced incorrect result\n"); + FAIL; + } + # ifndef PCR + if (GC_base(y) != 0) { + (void)GC_printf0("GC_base(fn_ptr) produced incorrect result\n"); + FAIL; + } + # endif + if (GC_same_obj(x+5, x) != x + 5) { + (void)GC_printf0("GC_same_obj produced incorrect result\n"); + FAIL; + } + if (GC_is_visible(y) != y || GC_is_visible(x) != x) { + (void)GC_printf0("GC_is_visible produced incorrect result\n"); + FAIL; + } + if (!TEST_FAIL_COUNT(1)) { + # if!(defined(RS6000) || defined(POWERPC) || defined(IA64)) + /* ON RS6000s function pointers point to a descriptor in the */ + /* data segment, so there should have been no failures. */ + (void)GC_printf0("GC_is_visible produced wrong failure indication\n"); + FAIL; + # endif + } + if (GC_is_valid_displacement(y) != y + || GC_is_valid_displacement(x) != x + || GC_is_valid_displacement(x + 3) != x + 3) { + (void)GC_printf0( + "GC_is_valid_displacement produced incorrect result\n"); + FAIL; + } + # ifndef ALL_INTERIOR_POINTERS + # if defined(RS6000) || defined(POWERPC) + if (!TEST_FAIL_COUNT(1)) { + # else + if (GC_all_interior_pointers && !TEST_FAIL_COUNT(1) + || !GC_all_interior_pointers && !TEST_FAIL_COUNT(2)) { + # endif + (void)GC_printf0("GC_is_valid_displacement produced wrong failure indication\n"); + FAIL; + } + # endif + # endif /* DBG_HDRS_ALL */ + /* Test floating point alignment */ + collectable_count += 2; + *(double *)GC_MALLOC(sizeof(double)) = 1.0; + *(double *)GC_MALLOC(sizeof(double)) = 1.0; + # ifdef GC_GCJ_SUPPORT + GC_REGISTER_DISPLACEMENT(sizeof(struct fake_vtable *)); + GC_init_gcj_malloc(0, (void *)fake_gcj_mark_proc); + # endif + /* Repeated list reversal test. */ + reverse_test(); + # ifdef PRINTSTATS + GC_printf0("-------------Finished reverse_test\n"); + # endif + # ifndef DBG_HDRS_ALL + typed_test(); + # ifdef PRINTSTATS + GC_printf0("-------------Finished typed_test\n"); + # endif + # endif /* DBG_HDRS_ALL */ + tree_test(); + LOCK(); + n_tests++; + UNLOCK(); + /* GC_printf1("Finished %x\n", pthread_self()); */ + } + + void check_heap_stats() + { + unsigned long max_heap_sz; + register int i; + int still_live; + int late_finalize_count = 0; + + # ifdef VERY_SMALL_CONFIG + /* these are something of a guess */ + if (sizeof(char *) > 4) { + max_heap_sz = 4500000; + } else { + max_heap_sz = 2800000; + } + # else + if (sizeof(char *) > 4) { + max_heap_sz = 15000000; + } else { + max_heap_sz = 11000000; + } + # endif + # ifdef GC_DEBUG + max_heap_sz *= 2; + # ifdef SAVE_CALL_CHAIN + max_heap_sz *= 3; + # ifdef SAVE_CALL_COUNT + max_heap_sz *= SAVE_CALL_COUNT/4; + # endif + # endif + # endif + /* Garbage collect repeatedly so that all inaccessible objects */ + /* can be finalized. */ + while (GC_collect_a_little()) { } + for (i = 0; i < 16; i++) { + GC_gcollect(); + late_finalize_count += GC_invoke_finalizers(); + } + (void)GC_printf1("Completed %lu tests\n", (unsigned long)n_tests); + (void)GC_printf1("Allocated %lu collectable objects\n", (unsigned long)collectable_count); + (void)GC_printf1("Allocated %lu uncollectable objects\n", (unsigned long)uncollectable_count); + (void)GC_printf1("Allocated %lu atomic objects\n", (unsigned long)atomic_count); + (void)GC_printf1("Allocated %lu stubborn objects\n", (unsigned long)stubborn_count); + (void)GC_printf2("Finalized %lu/%lu objects - ", + (unsigned long)finalized_count, + (unsigned long)finalizable_count); + # ifdef FINALIZE_ON_DEMAND + if (finalized_count != late_finalize_count) { + (void)GC_printf0("Demand finalization error\n"); + FAIL; + } + # endif + if (finalized_count > finalizable_count + || finalized_count < finalizable_count/2) { + (void)GC_printf0("finalization is probably broken\n"); + FAIL; + } else { + (void)GC_printf0("finalization is probably ok\n"); + } + still_live = 0; + for (i = 0; i < MAX_FINALIZED; i++) { + if (live_indicators[i] != 0) { + still_live++; + } + } + i = finalizable_count - finalized_count - still_live; + if (0 != i) { + (void)GC_printf2 + ("%lu disappearing links remain and %ld more objects were not finalized\n", + (unsigned long) still_live, (long)i); + if (i > 10) { + GC_printf0("\tVery suspicious!\n"); + } else { + GC_printf0("\tSlightly suspicious, but probably OK.\n"); + } + } + (void)GC_printf1("Total number of bytes allocated is %lu\n", + (unsigned long) + WORDS_TO_BYTES(GC_words_allocd + GC_words_allocd_before_gc)); + (void)GC_printf1("Final heap size is %lu bytes\n", + (unsigned long)GC_get_heap_size()); + if (WORDS_TO_BYTES(GC_words_allocd + GC_words_allocd_before_gc) + # ifdef VERY_SMALL_CONFIG + < 2700000*n_tests) { + # else + < 33500000*n_tests) { + # endif + (void)GC_printf0("Incorrect execution - missed some allocations\n"); + FAIL; + } + if (GC_get_heap_size() > max_heap_sz*n_tests) { + (void)GC_printf0("Unexpected heap growth - collector may be broken\n"); + FAIL; + } + (void)GC_printf0("Collector appears to work\n"); + } + + #if defined(MACOS) + void SetMinimumStack(long minSize) + { + long newApplLimit; + + if (minSize > LMGetDefltStack()) + { + newApplLimit = (long) GetApplLimit() + - (minSize - LMGetDefltStack()); + SetApplLimit((Ptr) newApplLimit); + MaxApplZone(); + } + } + + #define cMinStackSpace (512L * 1024L) + + #endif + + #ifdef __STDC__ + void warn_proc(char *msg, GC_word p) + #else + void warn_proc(msg, p) + char *msg; + GC_word p; + #endif + { + GC_printf1(msg, (unsigned long)p); + /*FAIL;*/ + } + + + #if !defined(PCR) && !defined(GC_SOLARIS_THREADS) \ + && !defined(GC_WIN32_THREADS) && !defined(GC_PTHREADS) \ + || defined(LINT) + #if defined(MSWIN32) && !defined(__MINGW32__) + int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prev, LPTSTR cmd, int n) + #else + int main() + #endif + { + # if defined(DJGPP) + int dummy; + # endif + n_tests = 0; + + # if defined(DJGPP) + /* No good way to determine stack base from library; do it */ + /* manually on this platform. */ + GC_stackbottom = (GC_PTR)(&dummy); + # endif + # if defined(MACOS) + /* Make sure we have lots and lots of stack space. */ + SetMinimumStack(cMinStackSpace); + /* Cheat and let stdio initialize toolbox for us. */ + printf("Testing GC Macintosh port.\n"); + # endif + GC_INIT(); /* Only needed if gc is dynamic library. */ + (void) GC_set_warn_proc(warn_proc); + # if (defined(MPROTECT_VDB) || defined(PROC_VDB)) && !defined(MAKE_BACK_GRAPH) + GC_enable_incremental(); + (void) GC_printf0("Switched to incremental mode\n"); + # if defined(MPROTECT_VDB) + (void)GC_printf0("Emulating dirty bits with mprotect/signals\n"); + # else + (void)GC_printf0("Reading dirty bits from /proc\n"); + # endif + # endif + run_one_test(); + check_heap_stats(); + # ifndef MSWINCE + (void)fflush(stdout); + # endif + # ifdef LINT + /* Entry points we should be testing, but aren't. */ + /* Some can be tested by defining GC_DEBUG at the top of this file */ + /* This is a bit SunOS4 specific. */ + GC_noop(GC_expand_hp, GC_add_roots, GC_clear_roots, + GC_register_disappearing_link, + GC_register_finalizer_ignore_self, + GC_debug_register_displacement, + GC_print_obj, GC_debug_change_stubborn, + GC_debug_end_stubborn_change, GC_debug_malloc_uncollectable, + GC_debug_free, GC_debug_realloc, GC_generic_malloc_words_small, + GC_init, GC_make_closure, GC_debug_invoke_finalizer, + GC_page_was_ever_dirty, GC_is_fresh, + GC_malloc_ignore_off_page, GC_malloc_atomic_ignore_off_page, + GC_set_max_heap_size, GC_get_bytes_since_gc, + GC_get_total_bytes, GC_pre_incr, GC_post_incr); + # endif + # ifdef MSWIN32 + GC_win32_free_heap(); + # endif + return(0); + } + # endif + + #ifdef GC_WIN32_THREADS + + unsigned __stdcall thr_run_one_test(void *arg) + { + run_one_test(); + return 0; + } + + #ifdef MSWINCE + HANDLE win_created_h; + HWND win_handle; + + LRESULT CALLBACK window_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + LRESULT ret = 0; + switch (uMsg) { + case WM_HIBERNATE: + GC_printf0("Received WM_HIBERNATE, calling GC_gcollect\n"); + GC_gcollect(); + break; + case WM_CLOSE: + GC_printf0("Received WM_CLOSE, closing window\n"); + DestroyWindow(hwnd); + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + default: + ret = DefWindowProc(hwnd, uMsg, wParam, lParam); + break; + } + return ret; + } + + unsigned __stdcall thr_window(void *arg) + { + WNDCLASS win_class = { + CS_NOCLOSE, + window_proc, + 0, + 0, + GetModuleHandle(NULL), + NULL, + NULL, + (HBRUSH)(COLOR_APPWORKSPACE+1), + NULL, + L"GCtestWindow" + }; + MSG msg; + + if (!RegisterClass(&win_class)) + FAIL; + + win_handle = CreateWindowEx( + 0, + L"GCtestWindow", + L"GCtest", + 0, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, + NULL, + GetModuleHandle(NULL), + NULL); + + if (win_handle == NULL) + FAIL; + + SetEvent(win_created_h); + + ShowWindow(win_handle, SW_SHOW); + UpdateWindow(win_handle); + + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return 0; + } + #endif + + #define NTEST 2 + + # ifdef MSWINCE + int APIENTRY GC_WinMain(HINSTANCE instance, HINSTANCE prev, LPWSTR cmd, int n) + # else + int APIENTRY WinMain(HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int n) + # endif + { + # if NTEST > 0 + HANDLE h[NTEST]; + int i; + # endif + # ifdef MSWINCE + HANDLE win_thr_h; + # endif + unsigned thread_id; + # if 0 + GC_enable_incremental(); + # endif + InitializeCriticalSection(&incr_cs); + (void) GC_set_warn_proc(warn_proc); + # ifdef MSWINCE + win_created_h = CreateEvent(NULL, FALSE, FALSE, NULL); + if (win_created_h == (HANDLE)NULL) { + (void)GC_printf1("Event creation failed %lu\n", (unsigned long)GetLastError()); + FAIL; + } + win_thr_h = GC_CreateThread(NULL, 0, thr_window, 0, 0, &thread_id); + if (win_thr_h == (HANDLE)NULL) { + (void)GC_printf1("Thread creation failed %lu\n", (unsigned long)GetLastError()); + FAIL; + } + if (WaitForSingleObject(win_created_h, INFINITE) != WAIT_OBJECT_0) + FAIL; + CloseHandle(win_created_h); + # endif + # if NTEST > 0 + for (i = 0; i < NTEST; i++) { + h[i] = GC_CreateThread(NULL, 0, thr_run_one_test, 0, 0, &thread_id); + if (h[i] == (HANDLE)NULL) { + (void)GC_printf1("Thread creation failed %lu\n", (unsigned long)GetLastError()); + FAIL; + } + } + # endif /* NTEST > 0 */ + run_one_test(); + # if NTEST > 0 + for (i = 0; i < NTEST; i++) { + if (WaitForSingleObject(h[i], INFINITE) != WAIT_OBJECT_0) { + (void)GC_printf1("Thread wait failed %lu\n", (unsigned long)GetLastError()); + FAIL; + } + } + # endif /* NTEST > 0 */ + # ifdef MSWINCE + PostMessage(win_handle, WM_CLOSE, 0, 0); + if (WaitForSingleObject(win_thr_h, INFINITE) != WAIT_OBJECT_0) + FAIL; + # endif + check_heap_stats(); + return(0); + } + + #endif /* GC_WIN32_THREADS */ + + + #ifdef PCR + test() + { + PCR_Th_T * th1; + PCR_Th_T * th2; + int code; + + n_tests = 0; + /* GC_enable_incremental(); */ + (void) GC_set_warn_proc(warn_proc); + th1 = PCR_Th_Fork(run_one_test, 0); + th2 = PCR_Th_Fork(run_one_test, 0); + run_one_test(); + if (PCR_Th_T_Join(th1, &code, NIL, PCR_allSigsBlocked, PCR_waitForever) + != PCR_ERes_okay || code != 0) { + (void)GC_printf0("Thread 1 failed\n"); + } + if (PCR_Th_T_Join(th2, &code, NIL, PCR_allSigsBlocked, PCR_waitForever) + != PCR_ERes_okay || code != 0) { + (void)GC_printf0("Thread 2 failed\n"); + } + check_heap_stats(); + return(0); + } + #endif + + #if defined(GC_SOLARIS_THREADS) || defined(GC_PTHREADS) + void * thr_run_one_test(void * arg) + { + run_one_test(); + return(0); + } + + #ifdef GC_DEBUG + # define GC_free GC_debug_free + #endif + + #if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) + main() + { + thread_t th1; + thread_t th2; + int code; + + n_tests = 0; + GC_INIT(); /* Only needed if gc is dynamic library. */ + # ifndef MAKE_BACK_GRAPH + GC_enable_incremental(); + # endif + (void) GC_set_warn_proc(warn_proc); + if (thr_keycreate(&fl_key, GC_free) != 0) { + (void)GC_printf1("Key creation failed %lu\n", (unsigned long)code); + FAIL; + } + if ((code = thr_create(0, 1024*1024, thr_run_one_test, 0, 0, &th1)) != 0) { + (void)GC_printf1("Thread 1 creation failed %lu\n", (unsigned long)code); + FAIL; + } + if ((code = thr_create(0, 1024*1024, thr_run_one_test, 0, THR_NEW_LWP, &th2)) != 0) { + (void)GC_printf1("Thread 2 creation failed %lu\n", (unsigned long)code); + FAIL; + } + run_one_test(); + if ((code = thr_join(th1, 0, 0)) != 0) { + (void)GC_printf1("Thread 1 failed %lu\n", (unsigned long)code); + FAIL; + } + if (thr_join(th2, 0, 0) != 0) { + (void)GC_printf1("Thread 2 failed %lu\n", (unsigned long)code); + FAIL; + } + check_heap_stats(); + (void)fflush(stdout); + return(0); + } + #else /* pthreads */ + + #ifndef GC_PTHREADS + --> bad news + #endif + + main() + { + pthread_t th1; + pthread_t th2; + pthread_attr_t attr; + int code; + + # ifdef GC_IRIX_THREADS + /* Force a larger stack to be preallocated */ + /* Since the initial cant always grow later. */ + *((volatile char *)&code - 1024*1024) = 0; /* Require 1 Mb */ + # endif /* GC_IRIX_THREADS */ + # if defined(GC_HPUX_THREADS) + /* Default stack size is too small, especially with the 64 bit ABI */ + /* Increase it. */ + if (pthread_default_stacksize_np(1024*1024, 0) != 0) { + (void)GC_printf0("pthread_default_stacksize_np failed.\n"); + } + # endif /* GC_HPUX_THREADS */ + pthread_attr_init(&attr); + # if defined(GC_IRIX_THREADS) || defined(GC_FREEBSD_THREADS) + pthread_attr_setstacksize(&attr, 1000000); + # endif + n_tests = 0; + # if defined(MPROTECT_VDB) && !defined(PARALLEL_MARK) &&!defined(REDIRECT_MALLOC) && !defined(MAKE_BACK_GRAPH) + GC_enable_incremental(); + (void) GC_printf0("Switched to incremental mode\n"); + (void) GC_printf0("Emulating dirty bits with mprotect/signals\n"); + # endif + (void) GC_set_warn_proc(warn_proc); + if ((code = pthread_key_create(&fl_key, 0)) != 0) { + (void)GC_printf1("Key creation failed %lu\n", (unsigned long)code); + FAIL; + } + if ((code = pthread_create(&th1, &attr, thr_run_one_test, 0)) != 0) { + (void)GC_printf1("Thread 1 creation failed %lu\n", (unsigned long)code); + FAIL; + } + if ((code = pthread_create(&th2, &attr, thr_run_one_test, 0)) != 0) { + (void)GC_printf1("Thread 2 creation failed %lu\n", (unsigned long)code); + FAIL; + } + run_one_test(); + if ((code = pthread_join(th1, 0)) != 0) { + (void)GC_printf1("Thread 1 failed %lu\n", (unsigned long)code); + FAIL; + } + if (pthread_join(th2, 0) != 0) { + (void)GC_printf1("Thread 2 failed %lu\n", (unsigned long)code); + FAIL; + } + check_heap_stats(); + (void)fflush(stdout); + pthread_attr_destroy(&attr); + GC_printf1("Completed %d collections\n", GC_gc_no); + return(0); + } + #endif /* GC_PTHREADS */ + #endif /* GC_SOLARIS_THREADS || GC_PTHREADS */ diff -Nrc3pad gcc-3.0.4/boehm-gc/tests/test_cpp.cc gcc-3.1/boehm-gc/tests/test_cpp.cc *** gcc-3.0.4/boehm-gc/tests/test_cpp.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/tests/test_cpp.cc Fri Aug 17 18:30:51 2001 *************** *** 0 **** --- 1,277 ---- + /**************************************************************************** + Copyright (c) 1994 by Xerox Corporation. All rights reserved. + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + Permission is hereby granted to use or copy this program for any + purpose, provided the above notices are retained on all copies. + Permission to modify the code and to distribute modified code is + granted, provided the above notices are retained, and a notice that + the code was modified is included with the above copyright notice. + **************************************************************************** + Last modified on Mon Jul 10 21:06:03 PDT 1995 by ellis + modified on December 20, 1994 7:27 pm PST by boehm + + usage: test_cpp number-of-iterations + + This program tries to test the specific C++ functionality provided by + gc_c++.h that isn't tested by the more general test routines of the + collector. + + A recommended value for number-of-iterations is 10, which will take a + few minutes to complete. + + ***************************************************************************/ + + #include "gc_cpp.h" + #include + #include + #include + #ifdef __GNUC__ + # include "new_gc_alloc.h" + #else + # include "gc_alloc.h" + #endif + extern "C" { + #include "private/gc_priv.h" + } + #ifdef MSWIN32 + # include + #endif + #ifdef GC_NAME_CONFLICT + # define USE_GC UseGC + struct foo * GC; + #else + # define USE_GC GC + #endif + + + #define my_assert( e ) \ + if (! (e)) { \ + GC_printf1( "Assertion failure in " __FILE__ ", line %d: " #e "\n", \ + __LINE__ ); \ + exit( 1 ); } + + + class A {public: + /* An uncollectable class. */ + + A( int iArg ): i( iArg ) {} + void Test( int iArg ) { + my_assert( i == iArg );} + int i;}; + + + class B: public gc, public A {public: + /* A collectable class. */ + + B( int j ): A( j ) {} + ~B() { + my_assert( deleting );} + static void Deleting( int on ) { + deleting = on;} + static int deleting;}; + + int B::deleting = 0; + + + class C: public gc_cleanup, public A {public: + /* A collectable class with cleanup and virtual multiple inheritance. */ + + C( int levelArg ): A( levelArg ), level( levelArg ) { + nAllocated++; + if (level > 0) { + left = new C( level - 1 ); + right = new C( level - 1 );} + else { + left = right = 0;}} + ~C() { + this->A::Test( level ); + nFreed++; + my_assert( level == 0 ? + left == 0 && right == 0 : + level == left->level + 1 && level == right->level + 1 ); + left = right = 0; + level = -123456;} + static void Test() { + my_assert( nFreed <= nAllocated && nFreed >= .8 * nAllocated );} + + static int nFreed; + static int nAllocated; + int level; + C* left; + C* right;}; + + int C::nFreed = 0; + int C::nAllocated = 0; + + + class D: public gc {public: + /* A collectable class with a static member function to be used as + an explicit clean-up function supplied to ::new. */ + + D( int iArg ): i( iArg ) { + nAllocated++;} + static void CleanUp( void* obj, void* data ) { + D* self = (D*) obj; + nFreed++; + my_assert( self->i == (int) (long) data );} + static void Test() { + my_assert( nFreed >= .8 * nAllocated );} + + int i; + static int nFreed; + static int nAllocated;}; + + int D::nFreed = 0; + int D::nAllocated = 0; + + + class E: public gc_cleanup {public: + /* A collectable class with clean-up for use by F. */ + + E() { + nAllocated++;} + ~E() { + nFreed++;} + + static int nFreed; + static int nAllocated;}; + + int E::nFreed = 0; + int E::nAllocated = 0; + + + class F: public E {public: + /* A collectable class with clean-up, a base with clean-up, and a + member with clean-up. */ + + F() { + nAllocated++;} + ~F() { + nFreed++;} + static void Test() { + my_assert( nFreed >= .8 * nAllocated ); + my_assert( 2 * nFreed == E::nFreed );} + + E e; + static int nFreed; + static int nAllocated;}; + + int F::nFreed = 0; + int F::nAllocated = 0; + + + long Disguise( void* p ) { + return ~ (long) p;} + + void* Undisguise( long i ) { + return (void*) ~ i;} + + + #ifdef MSWIN32 + int APIENTRY WinMain( + HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int cmdShow ) + { + int argc; + char* argv[ 3 ]; + + for (argc = 1; argc < sizeof( argv ) / sizeof( argv[ 0 ] ); argc++) { + argv[ argc ] = strtok( argc == 1 ? cmd : 0, " \t" ); + if (0 == argv[ argc ]) break;} + + #else + # ifdef MACOS + int main() { + # else + int main( int argc, char* argv[] ) { + # endif + #endif + + # if defined(MACOS) // MacOS + char* argv_[] = {"test_cpp", "10"}; // doesn't + argv = argv_; // have a + argc = sizeof(argv_)/sizeof(argv_[0]); // commandline + # endif + int i, iters, n; + # if !defined(MACOS) + # ifdef __GNUC__ + int *x = (int *)gc_alloc::allocate(sizeof(int)); + # else + int *x = (int *)alloc::allocate(sizeof(int)); + # endif + + *x = 29; + x -= 3; + # endif + if (argc != 2 || (0 >= (n = atoi( argv[ 1 ] )))) { + GC_printf0( "usage: test_cpp number-of-iterations\n" ); + exit( 1 );} + + for (iters = 1; iters <= n; iters++) { + GC_printf1( "Starting iteration %d\n", iters ); + + /* Allocate some uncollectable As and disguise their pointers. + Later we'll check to see if the objects are still there. We're + checking to make sure these objects really are uncollectable. */ + long as[ 1000 ]; + long bs[ 1000 ]; + for (i = 0; i < 1000; i++) { + as[ i ] = Disguise( new (NoGC) A( i ) ); + bs[ i ] = Disguise( new (NoGC) B( i ) );} + + /* Allocate a fair number of finalizable Cs, Ds, and Fs. + Later we'll check to make sure they've gone away. */ + for (i = 0; i < 1000; i++) { + C* c = new C( 2 ); + C c1( 2 ); /* stack allocation should work too */ + D* d = ::new (USE_GC, D::CleanUp, (void*)(long)i) D( i ); + F* f = new F; + if (0 == i % 10) delete c;} + + /* Allocate a very large number of collectable As and Bs and + drop the references to them immediately, forcing many + collections. */ + for (i = 0; i < 1000000; i++) { + A* a = new (USE_GC) A( i ); + B* b = new B( i ); + b = new (USE_GC) B( i ); + if (0 == i % 10) { + B::Deleting( 1 ); + delete b; + B::Deleting( 0 );} + # ifdef FINALIZE_ON_DEMAND + GC_invoke_finalizers(); + # endif + } + + /* Make sure the uncollectable As and Bs are still there. */ + for (i = 0; i < 1000; i++) { + A* a = (A*) Undisguise( as[ i ] ); + B* b = (B*) Undisguise( bs[ i ] ); + a->Test( i ); + delete a; + b->Test( i ); + B::Deleting( 1 ); + delete b; + B::Deleting( 0 ); + # ifdef FINALIZE_ON_DEMAND + GC_invoke_finalizers(); + # endif + + } + + /* Make sure most of the finalizable Cs, Ds, and Fs have + gone away. */ + C::Test(); + D::Test(); + F::Test();} + + # if !defined(__GNUC__) && !defined(MACOS) + my_assert (29 == x[3]); + # endif + GC_printf0( "The test appears to have succeeded.\n" ); + return( 0 );} + + diff -Nrc3pad gcc-3.0.4/boehm-gc/tests/thread_leak_test.c gcc-3.1/boehm-gc/tests/thread_leak_test.c *** gcc-3.0.4/boehm-gc/tests/thread_leak_test.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/tests/thread_leak_test.c Fri Aug 17 18:30:51 2001 *************** *** 0 **** --- 1,40 ---- + #define GC_LINUX_THREADS + #include "leak_detector.h" + #include + #include + + void * test(void * arg) { + int *p[10]; + int i; + GC_find_leak = 1; /* for new collect versions not compiled */ + /* with -DFIND_LEAK. */ + for (i = 0; i < 10; ++i) { + p[i] = malloc(sizeof(int)+i); + } + CHECK_LEAKS(); + for (i = 1; i < 10; ++i) { + free(p[i]); + } + } + + #define NTHREADS 5 + + main() { + int i; + pthread_t t[NTHREADS]; + int code; + + for (i = 0; i < NTHREADS; ++i) { + if ((code = pthread_create(t + i, 0, test, 0)) != 0) { + printf("Thread creation failed %d\n", code); + } + } + for (i = 0; i < NTHREADS; ++i) { + if ((code = pthread_join(t[i], 0)) != 0) { + printf("Thread join failed %lu\n", code); + } + } + CHECK_LEAKS(); + CHECK_LEAKS(); + CHECK_LEAKS(); + } diff -Nrc3pad gcc-3.0.4/boehm-gc/tests/trace_test.c gcc-3.1/boehm-gc/tests/trace_test.c *** gcc-3.0.4/boehm-gc/tests/trace_test.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/boehm-gc/tests/trace_test.c Fri Aug 17 18:30:51 2001 *************** *** 0 **** --- 1,28 ---- + #include + #define GC_DEBUG + #include "gc.h" + + struct treenode { + struct treenode *x; + struct treenode *y; + } * root[10]; + + struct treenode * mktree(int i) { + struct treenode * r = GC_MALLOC(sizeof(struct treenode)); + if (0 == i) return 0; + r -> x = mktree(i-1); + r -> y = mktree(i-1); + return r; + } + + main() + { + int i; + for (i = 0; i < 10; ++i) { + root[i] = mktree(12); + } + GC_generate_random_backtrace(); + GC_generate_random_backtrace(); + GC_generate_random_backtrace(); + GC_generate_random_backtrace(); + } diff -Nrc3pad gcc-3.0.4/boehm-gc/threadlibs.c gcc-3.1/boehm-gc/threadlibs.c *** gcc-3.0.4/boehm-gc/threadlibs.c Wed May 10 21:59:16 2000 --- gcc-3.1/boehm-gc/threadlibs.c Tue Feb 12 04:37:53 2002 *************** *** 1,24 **** ! # include "gcconfig.h" # include int main() { ! # if defined(LINUX_THREADS) ! # ifdef USE_LD_WRAP printf("-Wl,--wrap -Wl,read -Wl,--wrap -Wl,dlopen " "-Wl,--wrap -Wl,pthread_create -Wl,--wrap -Wl,pthread_join " ! "-Wl,--wrap -Wl,pthread_sigmask -lpthread -ldl\n"); ! # else ! printf("-lpthread -ldl\n"); ! # endif # endif ! # if defined(IRIX_THREADS) ! printf("-lpthread\n"); # endif ! # if defined(HPUX_THREADS) printf("-lpthread -lrt\n"); # endif ! # ifdef SOLARIS_THREADS printf("-lthread -ldl\n"); # endif return 0; --- 1,22 ---- ! # include "private/gcconfig.h" # include int main() { ! # if defined(GC_USE_LD_WRAP) printf("-Wl,--wrap -Wl,read -Wl,--wrap -Wl,dlopen " "-Wl,--wrap -Wl,pthread_create -Wl,--wrap -Wl,pthread_join " ! "-Wl,--wrap -Wl,pthread_detach " ! "-Wl,--wrap -Wl,pthread_sigmask -Wl,--wrap -Wl,sleep\n"); # endif ! # if defined(GC_LINUX_THREADS) || defined(GC_IRIX_THREADS) \ ! || defined(GC_FREEBSD_THREADS) || defined(GC_SOLARIS_PTHREADS) ! printf("-lpthread\n"); # endif ! # if defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS) printf("-lpthread -lrt\n"); # endif ! # if defined(GC_SOLARIS_THREADS) && !defined(GC_SOLARIS_PTHREADS) printf("-lthread -ldl\n"); # endif return 0; diff -Nrc3pad gcc-3.0.4/boehm-gc/typd_mlc.c gcc-3.1/boehm-gc/typd_mlc.c *** gcc-3.0.4/boehm-gc/typd_mlc.c Tue Jun 20 01:04:58 2000 --- gcc-3.1/boehm-gc/typd_mlc.c Fri Aug 17 18:30:46 2001 *************** *** 1,5 **** --- 1,6 ---- /* * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. + * opyright (c) 1999-2000 by Hewlett-Packard Company. All rights reserved. * * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. *************** *** 11,17 **** * modified is included with the above copyright notice. * */ - /* Boehm, July 31, 1995 5:02 pm PDT */ /* --- 12,17 ---- *************** *** 36,50 **** * since they are not accessible through the current interface. */ ! #include "gc_priv.h" ! #include "gc_mark.h" #include "gc_typed.h" ! # ifdef ADD_BYTE_AT_END ! # define EXTRA_BYTES (sizeof(word) - 1) ! # else ! # define EXTRA_BYTES (sizeof(word)) ! # endif GC_bool GC_explicit_typing_initialized = FALSE; --- 36,45 ---- * since they are not accessible through the current interface. */ ! #include "private/gc_pmark.h" #include "gc_typed.h" ! # define TYPD_EXTRA_BYTES (sizeof(word) - EXTRA_BYTES) GC_bool GC_explicit_typing_initialized = FALSE; *************** GC_descr GC_bm_table[WORDSZ/2]; *** 170,184 **** /* each of which is described by descriptor. */ /* The result is known to be short enough to fit into a bitmap */ /* descriptor. */ ! /* Descriptor is a DS_LENGTH or DS_BITMAP descriptor. */ GC_descr GC_double_descr(descriptor, nwords) register GC_descr descriptor; register word nwords; { ! if (descriptor & DS_TAGS == DS_LENGTH) { descriptor = GC_bm_table[BYTES_TO_WORDS((word)descriptor)]; }; ! descriptor |= (descriptor & ~DS_TAGS) >> nwords; return(descriptor); } --- 165,179 ---- /* each of which is described by descriptor. */ /* The result is known to be short enough to fit into a bitmap */ /* descriptor. */ ! /* Descriptor is a GC_DS_LENGTH or GC_DS_BITMAP descriptor. */ GC_descr GC_double_descr(descriptor, nwords) register GC_descr descriptor; register word nwords; { ! if ((descriptor & GC_DS_TAGS) == GC_DS_LENGTH) { descriptor = GC_bm_table[BYTES_TO_WORDS((word)descriptor)]; }; ! descriptor |= (descriptor & ~GC_DS_TAGS) >> nwords; return(descriptor); } *************** complex_descriptor * GC_make_sequence_de *** 196,202 **** /* is returned in *simple_d. */ /* If the result is NO_MEM, then */ /* we failed to allocate the descriptor. */ ! /* The implementation knows that DS_LENGTH is 0. */ /* *leaf, *complex_d, and *simple_d may be used as temporaries */ /* during the construction. */ # define COMPLEX 2 --- 191,197 ---- /* is returned in *simple_d. */ /* If the result is NO_MEM, then */ /* we failed to allocate the descriptor. */ ! /* The implementation knows that GC_DS_LENGTH is 0. */ /* *leaf, *complex_d, and *simple_d may be used as temporaries */ /* during the construction. */ # define COMPLEX 2 *************** struct LeafDescriptor * leaf; *** 216,222 **** /* For larger arrays, we try to combine descriptors of adjacent */ /* descriptors to speed up marking, and to reduce the amount */ /* of space needed on the mark stack. */ ! if ((descriptor & DS_TAGS) == DS_LENGTH) { if ((word)descriptor == size) { *simple_d = nelements * descriptor; return(SIMPLE); --- 211,217 ---- /* For larger arrays, we try to combine descriptors of adjacent */ /* descriptors to speed up marking, and to reduce the amount */ /* of space needed on the mark stack. */ ! if ((descriptor & GC_DS_TAGS) == GC_DS_LENGTH) { if ((word)descriptor == size) { *simple_d = nelements * descriptor; return(SIMPLE); *************** struct LeafDescriptor * leaf; *** 236,242 **** } } } else if (size <= BITMAP_BITS/2 ! && (descriptor & DS_TAGS) != DS_PROC && (size & (sizeof(word)-1)) == 0) { int result = GC_make_array_descriptor(nelements/2, 2*size, --- 231,237 ---- } } } else if (size <= BITMAP_BITS/2 ! && (descriptor & GC_DS_TAGS) != GC_DS_PROC && (size & (sizeof(word)-1)) == 0) { int result = GC_make_array_descriptor(nelements/2, 2*size, *************** ptr_t * GC_eobjfreelist; *** 343,351 **** ptr_t * GC_arobjfreelist; ! mse * GC_typed_mark_proc(); ! mse * GC_array_mark_proc(); GC_descr GC_generic_array_descr; --- 338,352 ---- ptr_t * GC_arobjfreelist; ! mse * GC_typed_mark_proc GC_PROTO((register word * addr, ! register mse * mark_stack_ptr, ! mse * mark_stack_limit, ! word env)); ! mse * GC_array_mark_proc GC_PROTO((register word * addr, ! register mse * mark_stack_ptr, ! mse * mark_stack_limit, ! word env)); GC_descr GC_generic_array_descr; *************** void GC_init_explicit_typing() *** 370,383 **** GC_explicit_typing_initialized = TRUE; /* Set up object kind with simple indirect descriptor. */ GC_eobjfreelist = (ptr_t *) ! GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_eobjfreelist == 0) ABORT("Couldn't allocate GC_eobjfreelist"); BZERO(GC_eobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); GC_explicit_kind = GC_n_kinds++; GC_obj_kinds[GC_explicit_kind].ok_freelist = GC_eobjfreelist; GC_obj_kinds[GC_explicit_kind].ok_reclaim_list = 0; GC_obj_kinds[GC_explicit_kind].ok_descriptor = ! (((word)WORDS_TO_BYTES(-1)) | DS_PER_OBJECT); GC_obj_kinds[GC_explicit_kind].ok_relocate_descr = TRUE; GC_obj_kinds[GC_explicit_kind].ok_init = TRUE; /* Descriptors are in the last word of the object. */ --- 371,384 ---- GC_explicit_typing_initialized = TRUE; /* Set up object kind with simple indirect descriptor. */ GC_eobjfreelist = (ptr_t *) ! GC_INTERNAL_MALLOC((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_eobjfreelist == 0) ABORT("Couldn't allocate GC_eobjfreelist"); BZERO(GC_eobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); GC_explicit_kind = GC_n_kinds++; GC_obj_kinds[GC_explicit_kind].ok_freelist = GC_eobjfreelist; GC_obj_kinds[GC_explicit_kind].ok_reclaim_list = 0; GC_obj_kinds[GC_explicit_kind].ok_descriptor = ! (((word)WORDS_TO_BYTES(-1)) | GC_DS_PER_OBJECT); GC_obj_kinds[GC_explicit_kind].ok_relocate_descr = TRUE; GC_obj_kinds[GC_explicit_kind].ok_init = TRUE; /* Descriptors are in the last word of the object. */ *************** void GC_init_explicit_typing() *** 387,393 **** /* Moving this up breaks DEC AXP compiler. */ /* Set up object kind with array descriptor. */ GC_arobjfreelist = (ptr_t *) ! GC_generic_malloc_inner((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_arobjfreelist == 0) ABORT("Couldn't allocate GC_arobjfreelist"); BZERO(GC_arobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); if (GC_n_mark_procs >= MAX_MARK_PROCS) --- 388,394 ---- /* Moving this up breaks DEC AXP compiler. */ /* Set up object kind with array descriptor. */ GC_arobjfreelist = (ptr_t *) ! GC_INTERNAL_MALLOC((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE); if (GC_arobjfreelist == 0) ABORT("Couldn't allocate GC_arobjfreelist"); BZERO(GC_arobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t)); if (GC_n_mark_procs >= MAX_MARK_PROCS) *************** void GC_init_explicit_typing() *** 399,424 **** GC_obj_kinds[GC_array_kind].ok_freelist = GC_arobjfreelist; GC_obj_kinds[GC_array_kind].ok_reclaim_list = 0; GC_obj_kinds[GC_array_kind].ok_descriptor = ! MAKE_PROC(GC_array_mark_proc_index, 0);; GC_obj_kinds[GC_array_kind].ok_relocate_descr = FALSE; GC_obj_kinds[GC_array_kind].ok_init = TRUE; /* Descriptors are in the last word of the object. */ GC_mark_procs[GC_array_mark_proc_index] = GC_array_mark_proc; for (i = 0; i < WORDSZ/2; i++) { GC_descr d = (((word)(-1)) >> (WORDSZ - i)) << (WORDSZ - i); ! d |= DS_BITMAP; GC_bm_table[i] = d; } ! GC_generic_array_descr = MAKE_PROC(GC_array_mark_proc_index, 0); UNLOCK(); ENABLE_SIGNALS(); } ! mse * GC_typed_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) ! register word * addr; ! register mse * mark_stack_ptr; ! mse * mark_stack_limit; ! word env; { register word bm = GC_ext_descriptors[env].ed_bitmap; register word * current_p = addr; --- 400,432 ---- GC_obj_kinds[GC_array_kind].ok_freelist = GC_arobjfreelist; GC_obj_kinds[GC_array_kind].ok_reclaim_list = 0; GC_obj_kinds[GC_array_kind].ok_descriptor = ! GC_MAKE_PROC(GC_array_mark_proc_index, 0);; GC_obj_kinds[GC_array_kind].ok_relocate_descr = FALSE; GC_obj_kinds[GC_array_kind].ok_init = TRUE; /* Descriptors are in the last word of the object. */ GC_mark_procs[GC_array_mark_proc_index] = GC_array_mark_proc; for (i = 0; i < WORDSZ/2; i++) { GC_descr d = (((word)(-1)) >> (WORDSZ - i)) << (WORDSZ - i); ! d |= GC_DS_BITMAP; GC_bm_table[i] = d; } ! GC_generic_array_descr = GC_MAKE_PROC(GC_array_mark_proc_index, 0); UNLOCK(); ENABLE_SIGNALS(); } ! # if defined(__STDC__) || defined(__cplusplus) ! mse * GC_typed_mark_proc(register word * addr, ! register mse * mark_stack_ptr, ! mse * mark_stack_limit, ! word env) ! # else ! mse * GC_typed_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) ! register word * addr; ! register mse * mark_stack_ptr; ! mse * mark_stack_limit; ! word env; ! # endif { register word bm = GC_ext_descriptors[env].ed_bitmap; register word * current_p = addr; *************** word env; *** 446,452 **** } mark_stack_ptr -> mse_start = addr + WORDSZ; mark_stack_ptr -> mse_descr = ! MAKE_PROC(GC_typed_mark_proc_index, env+1); } return(mark_stack_ptr); } --- 454,460 ---- } mark_stack_ptr -> mse_start = addr + WORDSZ; mark_stack_ptr -> mse_descr = ! GC_MAKE_PROC(GC_typed_mark_proc_index, env+1); } return(mark_stack_ptr); } *************** mse * msl; *** 533,543 **** } /*ARGSUSED*/ ! mse * GC_array_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) ! register word * addr; ! register mse * mark_stack_ptr; ! mse * mark_stack_limit; ! word env; { register hdr * hhdr = HDR(addr); register word sz = hhdr -> hb_sz; --- 541,558 ---- } /*ARGSUSED*/ ! # if defined(__STDC__) || defined(__cplusplus) ! mse * GC_array_mark_proc(register word * addr, ! register mse * mark_stack_ptr, ! mse * mark_stack_limit, ! word env) ! # else ! mse * GC_array_mark_proc(addr, mark_stack_ptr, mark_stack_limit, env) ! register word * addr; ! register mse * mark_stack_ptr; ! mse * mark_stack_limit; ! word env; ! # endif { register hdr * hhdr = HDR(addr); register word sz = hhdr -> hb_sz; *************** word env; *** 563,574 **** GC_mark_stack_too_small = TRUE; new_mark_stack_ptr = orig_mark_stack_ptr + 1; new_mark_stack_ptr -> mse_start = addr; ! new_mark_stack_ptr -> mse_descr = WORDS_TO_BYTES(sz) | DS_LENGTH; } else { /* Push descriptor itself */ new_mark_stack_ptr++; new_mark_stack_ptr -> mse_start = addr + sz - 1; ! new_mark_stack_ptr -> mse_descr = sizeof(word) | DS_LENGTH; } return(new_mark_stack_ptr); } --- 578,589 ---- GC_mark_stack_too_small = TRUE; new_mark_stack_ptr = orig_mark_stack_ptr + 1; new_mark_stack_ptr -> mse_start = addr; ! new_mark_stack_ptr -> mse_descr = WORDS_TO_BYTES(sz) | GC_DS_LENGTH; } else { /* Push descriptor itself */ new_mark_stack_ptr++; new_mark_stack_ptr -> mse_start = addr + sz - 1; ! new_mark_stack_ptr -> mse_descr = sizeof(word) | GC_DS_LENGTH; } return(new_mark_stack_ptr); } *************** word env; *** 600,606 **** } if (all_bits_set) { /* An initial section contains all pointers. Use length descriptor. */ ! return(WORDS_TO_BYTES(last_set_bit+1) | DS_LENGTH); } } # endif --- 615,621 ---- } if (all_bits_set) { /* An initial section contains all pointers. Use length descriptor. */ ! return(WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH); } } # endif *************** word env; *** 612,627 **** result >>= 1; if (GC_get_bit(bm, i)) result |= HIGH_BIT; } ! result |= DS_BITMAP; return(result); } else { signed_word index; index = GC_add_ext_descriptor(bm, (word)last_set_bit+1); ! if (index == -1) return(WORDS_TO_BYTES(last_set_bit+1) | DS_LENGTH); /* Out of memory: use conservative */ /* approximation. */ ! result = MAKE_PROC(GC_typed_mark_proc_index, (word)index); return(result); } } --- 627,642 ---- result >>= 1; if (GC_get_bit(bm, i)) result |= HIGH_BIT; } ! result |= GC_DS_BITMAP; return(result); } else { signed_word index; index = GC_add_ext_descriptor(bm, (word)last_set_bit+1); ! if (index == -1) return(WORDS_TO_BYTES(last_set_bit+1) | GC_DS_LENGTH); /* Out of memory: use conservative */ /* approximation. */ ! result = GC_MAKE_PROC(GC_typed_mark_proc_index, (word)index); return(result); } } *************** register ptr_t * opp; *** 647,653 **** register word lw; DCL_LOCK_STATE; ! lb += EXTRA_BYTES; if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; --- 662,668 ---- register word lw; DCL_LOCK_STATE; ! lb += TYPD_EXTRA_BYTES; if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; *************** register ptr_t * opp; *** 692,698 **** register word lw; DCL_LOCK_STATE; ! lb += EXTRA_BYTES; if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; --- 707,713 ---- register word lw; DCL_LOCK_STATE; ! lb += TYPD_EXTRA_BYTES; if( SMALL_OBJ(lb) ) { # ifdef MERGE_SIZES lw = GC_size_map[lb]; *************** DCL_LOCK_STATE; *** 750,760 **** case SIMPLE: return(GC_malloc_explicitly_typed(n*lb, simple_descr)); case LEAF: lb *= n; ! lb += sizeof(struct LeafDescriptor) + EXTRA_BYTES; break; case COMPLEX: lb *= n; ! lb += EXTRA_BYTES; break; } if( SMALL_OBJ(lb) ) { --- 765,775 ---- case SIMPLE: return(GC_malloc_explicitly_typed(n*lb, simple_descr)); case LEAF: lb *= n; ! lb += sizeof(struct LeafDescriptor) + TYPD_EXTRA_BYTES; break; case COMPLEX: lb *= n; ! lb += TYPD_EXTRA_BYTES; break; } if( SMALL_OBJ(lb) ) { diff -Nrc3pad gcc-3.0.4/boehm-gc/version.h gcc-3.1/boehm-gc/version.h *** gcc-3.0.4/boehm-gc/version.h Tue Jun 20 01:04:58 2000 --- gcc-3.1/boehm-gc/version.h Tue Feb 12 04:37:53 2002 *************** *** 1,6 **** ! #define GC_VERSION_MAJOR 5 #define GC_VERSION_MINOR 1 ! #define GC_ALPHA_VERSION GC_NOT_ALPHA # define GC_NOT_ALPHA 0xff --- 1,6 ---- ! #define GC_VERSION_MAJOR 6 #define GC_VERSION_MINOR 1 ! #define GC_ALPHA_VERSION 3 # define GC_NOT_ALPHA 0xff diff -Nrc3pad gcc-3.0.4/boehm-gc/weakpointer.h gcc-3.1/boehm-gc/weakpointer.h *** gcc-3.0.4/boehm-gc/weakpointer.h Wed Jun 30 12:44:47 1999 --- gcc-3.1/boehm-gc/weakpointer.h Thu Jan 1 00:00:00 1970 *************** *** 1,221 **** - #ifndef _weakpointer_h_ - #define _weakpointer_h_ - - /**************************************************************************** - - WeakPointer and CleanUp - - Copyright (c) 1991 by Xerox Corporation. All rights reserved. - - THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - - Permission is hereby granted to copy this code for any purpose, - provided the above notices are retained on all copies. - - Last modified on Mon Jul 17 18:16:01 PDT 1995 by ellis - - ****************************************************************************/ - - /**************************************************************************** - - WeakPointer - - A weak pointer is a pointer to a heap-allocated object that doesn't - prevent the object from being garbage collected. Weak pointers can be - used to track which objects haven't yet been reclaimed by the - collector. A weak pointer is deactivated when the collector discovers - its referent object is unreachable by normal pointers (reachability - and deactivation are defined more precisely below). A deactivated weak - pointer remains deactivated forever. - - ****************************************************************************/ - - - template< class T > class WeakPointer { - public: - - WeakPointer( T* t = 0 ) - /* Constructs a weak pointer for *t. t may be null. It is an error - if t is non-null and *t is not a collected object. */ - {impl = _WeakPointer_New( t );} - - T* Pointer() - /* wp.Pointer() returns a pointer to the referent object of wp or - null if wp has been deactivated (because its referent object - has been discovered unreachable by the collector). */ - {return (T*) _WeakPointer_Pointer( this->impl );} - - int operator==( WeakPointer< T > wp2 ) - /* Given weak pointers wp1 and wp2, if wp1 == wp2, then wp1 and - wp2 refer to the same object. If wp1 != wp2, then either wp1 - and wp2 don't refer to the same object, or if they do, one or - both of them has been deactivated. (Note: If objects t1 and t2 - are never made reachable by their clean-up functions, then - WeakPointer(t1) == WeakPointer(t2) if and only t1 == t2.) */ - {return _WeakPointer_Equal( this->impl, wp2.impl );} - - int Hash() - /* Returns a hash code suitable for use by multiplicative- and - division-based hash tables. If wp1 == wp2, then wp1.Hash() == - wp2.Hash(). */ - {return _WeakPointer_Hash( this->impl );} - - private: - void* impl; - }; - - /***************************************************************************** - - CleanUp - - A garbage-collected object can have an associated clean-up function - that will be invoked some time after the collector discovers the - object is unreachable via normal pointers. Clean-up functions can be - used to release resources such as open-file handles or window handles - when their containing objects become unreachable. If a C++ object has - a non-empty explicit destructor (i.e. it contains programmer-written - code), the destructor will be automatically registered as the object's - initial clean-up function. - - There is no guarantee that the collector will detect every unreachable - object (though it will find almost all of them). Clients should not - rely on clean-up to cause some action to occur immediately -- clean-up - is only a mechanism for improving resource usage. - - Every object with a clean-up function also has a clean-up queue. When - the collector finds the object is unreachable, it enqueues it on its - queue. The clean-up function is applied when the object is removed - from the queue. By default, objects are enqueued on the garbage - collector's queue, and the collector removes all objects from its - queue after each collection. If a client supplies another queue for - objects, it is his responsibility to remove objects (and cause their - functions to be called) by polling it periodically. - - Clean-up queues allow clean-up functions accessing global data to - synchronize with the main program. Garbage collection can occur at any - time, and clean-ups invoked by the collector might access data in an - inconsistent state. A client can control this by defining an explicit - queue for objects and polling it at safe points. - - The following definitions are used by the specification below: - - Given a pointer t to a collected object, the base object BO(t) is the - value returned by new when it created the object. (Because of multiple - inheritance, t and BO(t) may not be the same address.) - - A weak pointer wp references an object *t if BO(wp.Pointer()) == - BO(t). - - ***************************************************************************/ - - template< class T, class Data > class CleanUp { - public: - - static void Set( T* t, void c( Data* d, T* t ), Data* d = 0 ) - /* Sets the clean-up function of object BO(t) to be , - replacing any previously defined clean-up function for BO(t); c - and d can be null, but t cannot. Sets the clean-up queue for - BO(t) to be the collector's queue. When t is removed from its - clean-up queue, its clean-up will be applied by calling c(d, - t). It is an error if *t is not a collected object. */ - {_CleanUp_Set( t, c, d );} - - static void Call( T* t ) - /* Sets the new clean-up function for BO(t) to be null and, if the - old one is non-null, calls it immediately, even if BO(t) is - still reachable. Deactivates any weak pointers to BO(t). */ - {_CleanUp_Call( t );} - - class Queue {public: - Queue() - /* Constructs a new queue. */ - {this->head = _CleanUp_Queue_NewHead();} - - void Set( T* t ) - /* q.Set(t) sets the clean-up queue of BO(t) to be q. */ - {_CleanUp_Queue_Set( this->head, t );} - - int Call() - /* If q is non-empty, q.Call() removes the first object and - calls its clean-up function; does nothing if q is - empty. Returns true if there are more objects in the - queue. */ - {return _CleanUp_Queue_Call( this->head );} - - private: - void* head; - }; - }; - - /********************************************************************** - - Reachability and Clean-up - - An object O is reachable if it can be reached via a non-empty path of - normal pointers from the registers, stacks, global variables, or an - object with a non-null clean-up function (including O itself), - ignoring pointers from an object to itself. - - This definition of reachability ensures that if object B is accessible - from object A (and not vice versa) and if both A and B have clean-up - functions, then A will always be cleaned up before B. Note that as - long as an object with a clean-up function is contained in a cycle of - pointers, it will always be reachable and will never be cleaned up or - collected. - - When the collector finds an unreachable object with a null clean-up - function, it atomically deactivates all weak pointers referencing the - object and recycles its storage. If object B is accessible from object - A via a path of normal pointers, A will be discovered unreachable no - later than B, and a weak pointer to A will be deactivated no later - than a weak pointer to B. - - When the collector finds an unreachable object with a non-null - clean-up function, the collector atomically deactivates all weak - pointers referencing the object, redefines its clean-up function to be - null, and enqueues it on its clean-up queue. The object then becomes - reachable again and remains reachable at least until its clean-up - function executes. - - The clean-up function is assured that its argument is the only - accessible pointer to the object. Nothing prevents the function from - redefining the object's clean-up function or making the object - reachable again (for example, by storing the pointer in a global - variable). - - If the clean-up function does not make its object reachable again and - does not redefine its clean-up function, then the object will be - collected by a subsequent collection (because the object remains - unreachable and now has a null clean-up function). If the clean-up - function does make its object reachable again and a clean-up function - is subsequently redefined for the object, then the new clean-up - function will be invoked the next time the collector finds the object - unreachable. - - Note that a destructor for a collected object cannot safely redefine a - clean-up function for its object, since after the destructor executes, - the object has been destroyed into "raw memory". (In most - implementations, destroying an object mutates its vtbl.) - - Finally, note that calling delete t on a collected object first - deactivates any weak pointers to t and then invokes its clean-up - function (destructor). - - **********************************************************************/ - - extern "C" { - void* _WeakPointer_New( void* t ); - void* _WeakPointer_Pointer( void* wp ); - int _WeakPointer_Equal( void* wp1, void* wp2 ); - int _WeakPointer_Hash( void* wp ); - void _CleanUp_Set( void* t, void (*c)( void* d, void* t ), void* d ); - void _CleanUp_Call( void* t ); - void* _CleanUp_Queue_NewHead (); - void _CleanUp_Queue_Set( void* h, void* t ); - int _CleanUp_Queue_Call( void* h ); - } - - #endif /* _weakpointer_h_ */ - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/boehm-gc/win32_threads.c gcc-3.1/boehm-gc/win32_threads.c *** gcc-3.0.4/boehm-gc/win32_threads.c Wed Apr 19 10:09:58 2000 --- gcc-3.1/boehm-gc/win32_threads.c Tue Mar 12 18:31:12 2002 *************** *** 1,6 **** ! #ifdef WIN32_THREADS ! #include "gc_priv.h" #if 0 #define STRICT --- 1,6 ---- ! #if defined(GC_WIN32_THREADS) ! #include "private/gc_priv.h" #if 0 #define STRICT *************** volatile GC_bool GC_please_stop = FALSE; *** 24,29 **** --- 24,36 ---- volatile struct thread_entry thread_table[MAX_THREADS]; + void GC_push_thread_structures GC_PROTO((void)) + { + /* Unlike the other threads implementations, the thread table here */ + /* contains no pointers to the collectable heap. Thus we have */ + /* no private structures we need to preserve. */ + } + void GC_stop_world() { DWORD thread_id = GetCurrentThreadId(); *************** void GC_stop_world() *** 33,40 **** for (i = 0; i < MAX_THREADS; i++) if (thread_table[i].stack != 0 && thread_table[i].id != thread_id) { ! if (SuspendThread(thread_table[i].handle) == (DWORD)-1) ! ABORT("SuspendThread failed"); thread_table[i].suspended = TRUE; } } --- 40,67 ---- for (i = 0; i < MAX_THREADS; i++) if (thread_table[i].stack != 0 && thread_table[i].id != thread_id) { ! # ifdef MSWINCE ! /* SuspendThread will fail if thread is running kernel code */ ! while (SuspendThread(thread_table[i].handle) == (DWORD)-1) ! Sleep(10); ! # else ! /* Apparently the Windows 95 GetOpenFileName call creates */ ! /* a thread that does not properly get cleaned up, and */ ! /* SuspendThread on its descriptor may provoke a crash. */ ! /* This reduces the probability of that event, though it still */ ! /* appears there's a race here. */ ! DWORD exitCode; ! if (GetExitCodeThread(thread_table[i].handle,&exitCode) && ! exitCode != STILL_ACTIVE) { ! thread_table[i].stack = 0; ! thread_table[i].in_use = FALSE; ! CloseHandle(thread_table[i].handle); ! BZERO((void *)(&thread_table[i].context), sizeof(CONTEXT)); ! continue; ! } ! if (SuspendThread(thread_table[i].handle) == (DWORD)-1) ! ABORT("SuspendThread failed"); ! # endif thread_table[i].suspended = TRUE; } } *************** void GC_start_world() *** 53,58 **** --- 80,88 ---- GC_please_stop = FALSE; } + # ifdef _MSC_VER + # pragma warning(disable:4715) + # endif ptr_t GC_current_stackbottom() { DWORD thread_id = GetCurrentThreadId(); *************** ptr_t GC_current_stackbottom() *** 62,79 **** return thread_table[i].stack; ABORT("no thread table entry for current thread"); } ! static ptr_t GC_get_lo_stack_addr(ptr_t s) ! { ! ptr_t bottom; ! MEMORY_BASIC_INFORMATION info; ! VirtualQuery(s, &info, sizeof(info)); ! do { ! bottom = info.BaseAddress; ! VirtualQuery(bottom - 1, &info, sizeof(info)); ! } while ((info.Protect & PAGE_READWRITE) && !(info.Protect & PAGE_GUARD)); ! return(bottom); ! } void GC_push_all_stacks() { --- 92,121 ---- return thread_table[i].stack; ABORT("no thread table entry for current thread"); } + # ifdef _MSC_VER + # pragma warning(default:4715) + # endif ! # ifdef MSWINCE ! /* The VirtualQuery calls below won't work properly on WinCE, but */ ! /* since each stack is restricted to an aligned 64K region of */ ! /* virtual memory we can just take the next lowest multiple of 64K. */ ! # define GC_get_lo_stack_addr(s) \ ! ((ptr_t)(((DWORD)(s) - 1) & 0xFFFF0000)) ! # else ! static ptr_t GC_get_lo_stack_addr(ptr_t s) ! { ! ptr_t bottom; ! MEMORY_BASIC_INFORMATION info; ! VirtualQuery(s, &info, sizeof(info)); ! do { ! bottom = info.BaseAddress; ! VirtualQuery(bottom - 1, &info, sizeof(info)); ! } while ((info.Protect & PAGE_READWRITE) ! && !(info.Protect & PAGE_GUARD)); ! return(bottom); ! } ! # endif void GC_push_all_stacks() { *************** void GC_push_all_stacks() *** 83,105 **** if (thread_table[i].stack) { ptr_t bottom = GC_get_lo_stack_addr(thread_table[i].stack); if (thread_table[i].id == thread_id) ! GC_push_all_stack(&i, thread_table[i].stack); else { thread_table[i].context.ContextFlags = (CONTEXT_INTEGER|CONTEXT_CONTROL); if (!GetThreadContext(thread_table[i].handle, ! &thread_table[i].context)) ABORT("GetThreadContext failed"); ! if (thread_table[i].context.Esp >= (DWORD)thread_table[i].stack ! || thread_table[i].context.Esp < (DWORD)bottom) ! ABORT("Thread stack pointer out of range"); ! GC_push_one ((word) thread_table[i].context.Edi); ! GC_push_one ((word) thread_table[i].context.Esi); ! GC_push_one ((word) thread_table[i].context.Ebx); ! GC_push_one ((word) thread_table[i].context.Edx); ! GC_push_one ((word) thread_table[i].context.Ecx); ! GC_push_one ((word) thread_table[i].context.Eax); ! GC_push_all_stack(thread_table[i].context.Esp, thread_table[i].stack); } } } --- 125,310 ---- if (thread_table[i].stack) { ptr_t bottom = GC_get_lo_stack_addr(thread_table[i].stack); if (thread_table[i].id == thread_id) ! GC_push_all_stack((ptr_t)&i, thread_table[i].stack); else { thread_table[i].context.ContextFlags = (CONTEXT_INTEGER|CONTEXT_CONTROL); if (!GetThreadContext(thread_table[i].handle, ! /* cast away volatile qualifier */ ! (LPCONTEXT)&thread_table[i].context)) ABORT("GetThreadContext failed"); ! # ifdef I386 ! if (thread_table[i].context.Esp >= (DWORD)thread_table[i].stack ! || thread_table[i].context.Esp < (DWORD)bottom) ! ABORT("Thread stack pointer out of range"); ! GC_push_one ((word) thread_table[i].context.Edi); ! GC_push_one ((word) thread_table[i].context.Esi); ! GC_push_one ((word) thread_table[i].context.Ebp); ! GC_push_one ((word) thread_table[i].context.Ebx); ! GC_push_one ((word) thread_table[i].context.Edx); ! GC_push_one ((word) thread_table[i].context.Ecx); ! GC_push_one ((word) thread_table[i].context.Eax); ! GC_push_all_stack((char *) thread_table[i].context.Esp, ! thread_table[i].stack); ! # else ! # ifdef ARM32 ! if (thread_table[i].context.Sp >= (DWORD)thread_table[i].stack ! || thread_table[i].context.Sp < (DWORD)bottom) ! ABORT("Thread stack pointer out of range"); ! GC_push_one ((word) thread_table[i].context.R0); ! GC_push_one ((word) thread_table[i].context.R1); ! GC_push_one ((word) thread_table[i].context.R2); ! GC_push_one ((word) thread_table[i].context.R3); ! GC_push_one ((word) thread_table[i].context.R4); ! GC_push_one ((word) thread_table[i].context.R5); ! GC_push_one ((word) thread_table[i].context.R6); ! GC_push_one ((word) thread_table[i].context.R7); ! GC_push_one ((word) thread_table[i].context.R8); ! GC_push_one ((word) thread_table[i].context.R9); ! GC_push_one ((word) thread_table[i].context.R10); ! GC_push_one ((word) thread_table[i].context.R11); ! GC_push_one ((word) thread_table[i].context.R12); ! GC_push_all_stack((char *) thread_table[i].context.Sp, ! thread_table[i].stack); ! # else ! # ifdef SHx ! if (thread_table[i].context.R15 >= (DWORD)thread_table[i].stack ! || thread_table[i].context.R15 < (DWORD)bottom) ! ABORT("Thread stack pointer out of range"); ! GC_push_one ((word) thread_table[i].context.R0); ! GC_push_one ((word) thread_table[i].context.R1); ! GC_push_one ((word) thread_table[i].context.R2); ! GC_push_one ((word) thread_table[i].context.R3); ! GC_push_one ((word) thread_table[i].context.R4); ! GC_push_one ((word) thread_table[i].context.R5); ! GC_push_one ((word) thread_table[i].context.R6); ! GC_push_one ((word) thread_table[i].context.R7); ! GC_push_one ((word) thread_table[i].context.R8); ! GC_push_one ((word) thread_table[i].context.R9); ! GC_push_one ((word) thread_table[i].context.R10); ! GC_push_one ((word) thread_table[i].context.R11); ! GC_push_one ((word) thread_table[i].context.R12); ! GC_push_one ((word) thread_table[i].context.R13); ! GC_push_one ((word) thread_table[i].context.R14); ! GC_push_all_stack((char *) thread_table[i].context.R15, ! thread_table[i].stack); ! # else ! # ifdef MIPS ! if (thread_table[i].context.IntSp >= (DWORD)thread_table[i].stack ! || thread_table[i].context.IntSp < (DWORD)bottom) ! ABORT("Thread stack pointer out of range"); ! GC_push_one ((word) thread_table[i].context.IntAt); ! GC_push_one ((word) thread_table[i].context.IntV0); ! GC_push_one ((word) thread_table[i].context.IntV1); ! GC_push_one ((word) thread_table[i].context.IntA0); ! GC_push_one ((word) thread_table[i].context.IntA1); ! GC_push_one ((word) thread_table[i].context.IntA2); ! GC_push_one ((word) thread_table[i].context.IntA3); ! GC_push_one ((word) thread_table[i].context.IntT0); ! GC_push_one ((word) thread_table[i].context.IntT1); ! GC_push_one ((word) thread_table[i].context.IntT2); ! GC_push_one ((word) thread_table[i].context.IntT3); ! GC_push_one ((word) thread_table[i].context.IntT4); ! GC_push_one ((word) thread_table[i].context.IntT5); ! GC_push_one ((word) thread_table[i].context.IntT6); ! GC_push_one ((word) thread_table[i].context.IntT7); ! GC_push_one ((word) thread_table[i].context.IntS0); ! GC_push_one ((word) thread_table[i].context.IntS1); ! GC_push_one ((word) thread_table[i].context.IntS2); ! GC_push_one ((word) thread_table[i].context.IntS3); ! GC_push_one ((word) thread_table[i].context.IntS4); ! GC_push_one ((word) thread_table[i].context.IntS5); ! GC_push_one ((word) thread_table[i].context.IntS6); ! GC_push_one ((word) thread_table[i].context.IntS7); ! GC_push_one ((word) thread_table[i].context.IntT8); ! GC_push_one ((word) thread_table[i].context.IntT9); ! GC_push_one ((word) thread_table[i].context.IntK0); ! GC_push_one ((word) thread_table[i].context.IntK1); ! GC_push_one ((word) thread_table[i].context.IntS8); ! GC_push_all_stack((char *) thread_table[i].context.IntSp, ! thread_table[i].stack); ! # else ! # ifdef PPC ! if (thread_table[i].context.Gpr1 >= (DWORD)thread_table[i].stack ! || thread_table[i].context.Gpr1 < (DWORD)bottom) ! ABORT("Thread stack pointer out of range"); ! GC_push_one ((word) thread_table[i].context.Gpr0); ! /* Gpr1 is stack pointer */ ! /* Gpr2 is global pointer */ ! GC_push_one ((word) thread_table[i].context.Gpr3); ! GC_push_one ((word) thread_table[i].context.Gpr4); ! GC_push_one ((word) thread_table[i].context.Gpr5); ! GC_push_one ((word) thread_table[i].context.Gpr6); ! GC_push_one ((word) thread_table[i].context.Gpr7); ! GC_push_one ((word) thread_table[i].context.Gpr8); ! GC_push_one ((word) thread_table[i].context.Gpr9); ! GC_push_one ((word) thread_table[i].context.Gpr10); ! GC_push_one ((word) thread_table[i].context.Gpr11); ! GC_push_one ((word) thread_table[i].context.Gpr12); ! /* Gpr13 is reserved for the kernel */ ! GC_push_one ((word) thread_table[i].context.Gpr14); ! GC_push_one ((word) thread_table[i].context.Gpr15); ! GC_push_one ((word) thread_table[i].context.Gpr16); ! GC_push_one ((word) thread_table[i].context.Gpr17); ! GC_push_one ((word) thread_table[i].context.Gpr18); ! GC_push_one ((word) thread_table[i].context.Gpr19); ! GC_push_one ((word) thread_table[i].context.Gpr20); ! GC_push_one ((word) thread_table[i].context.Gpr21); ! GC_push_one ((word) thread_table[i].context.Gpr22); ! GC_push_one ((word) thread_table[i].context.Gpr23); ! GC_push_one ((word) thread_table[i].context.Gpr24); ! GC_push_one ((word) thread_table[i].context.Gpr25); ! GC_push_one ((word) thread_table[i].context.Gpr26); ! GC_push_one ((word) thread_table[i].context.Gpr27); ! GC_push_one ((word) thread_table[i].context.Gpr28); ! GC_push_one ((word) thread_table[i].context.Gpr29); ! GC_push_one ((word) thread_table[i].context.Gpr30); ! GC_push_one ((word) thread_table[i].context.Gpr31); ! GC_push_all_stack((char *) thread_table[i].context.Gpr1, ! thread_table[i].stack); ! # else ! # ifdef ALPHA ! if (thread_table[i].context.IntSp >= (DWORD)thread_table[i].stack ! || thread_table[i].context.IntSp < (DWORD)bottom) ! ABORT("Thread stack pointer out of range"); ! GC_push_one ((word) thread_table[i].context.IntV0); ! GC_push_one ((word) thread_table[i].context.IntT0); ! GC_push_one ((word) thread_table[i].context.IntT1); ! GC_push_one ((word) thread_table[i].context.IntT2); ! GC_push_one ((word) thread_table[i].context.IntT3); ! GC_push_one ((word) thread_table[i].context.IntT4); ! GC_push_one ((word) thread_table[i].context.IntT5); ! GC_push_one ((word) thread_table[i].context.IntT6); ! GC_push_one ((word) thread_table[i].context.IntT7); ! GC_push_one ((word) thread_table[i].context.IntS0); ! GC_push_one ((word) thread_table[i].context.IntS1); ! GC_push_one ((word) thread_table[i].context.IntS2); ! GC_push_one ((word) thread_table[i].context.IntS3); ! GC_push_one ((word) thread_table[i].context.IntS4); ! GC_push_one ((word) thread_table[i].context.IntS5); ! GC_push_one ((word) thread_table[i].context.IntFp); ! GC_push_one ((word) thread_table[i].context.IntA0); ! GC_push_one ((word) thread_table[i].context.IntA1); ! GC_push_one ((word) thread_table[i].context.IntA2); ! GC_push_one ((word) thread_table[i].context.IntA3); ! GC_push_one ((word) thread_table[i].context.IntA4); ! GC_push_one ((word) thread_table[i].context.IntA5); ! GC_push_one ((word) thread_table[i].context.IntT8); ! GC_push_one ((word) thread_table[i].context.IntT9); ! GC_push_one ((word) thread_table[i].context.IntT10); ! GC_push_one ((word) thread_table[i].context.IntT11); ! GC_push_one ((word) thread_table[i].context.IntT12); ! GC_push_one ((word) thread_table[i].context.IntAt); ! GC_push_all_stack((char *) thread_table[i].context.IntSp, ! thread_table[i].stack); ! # else ! --> architecture not supported ! # endif /* !ALPHA */ ! # endif /* !PPC */ ! # endif /* !MIPS */ ! # endif /* !SHx */ ! # endif /* !ARM32 */ ! # endif /* !I386 */ } } } *************** void GC_get_next_stack(char *start, char *** 126,131 **** --- 331,526 ---- if (*lo < start) *lo = start; } + #if !defined(MSWINCE) && !(defined(__MINGW32__) && !defined(_DLL)) + + HANDLE WINAPI GC_CreateThread( + LPSECURITY_ATTRIBUTES lpThreadAttributes, + DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, + LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ) + { + return CreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, + lpParameter, dwCreationFlags, lpThreadId); + } + + #else /* !defined(MSWINCE) && !(defined(__MINGW32__) && !defined(_DLL)) */ + + typedef struct { + HANDLE child_ready_h, parent_ready_h; + volatile struct thread_entry * entry; + LPTHREAD_START_ROUTINE start; + LPVOID param; + } thread_args; + + DWORD WINAPI thread_start(LPVOID arg); + + HANDLE WINAPI GC_CreateThread( + LPSECURITY_ATTRIBUTES lpThreadAttributes, + DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, + LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ) + { + HANDLE thread_h = NULL; + HANDLE child_ready_h, parent_ready_h; + + int i; + thread_args args; + + /* allocate thread slot */ + LOCK(); + for (i = 0; i != MAX_THREADS && thread_table[i].in_use; i++) + ; + if (i != MAX_THREADS) { + thread_table[i].in_use = TRUE; + } + UNLOCK(); + + if (i != MAX_THREADS) { + + /* create unnamed unsignalled events */ + if (child_ready_h = CreateEvent(NULL, FALSE, FALSE, NULL)) { + if (parent_ready_h = CreateEvent(NULL, FALSE, FALSE, NULL)) { + + /* set up thread arguments */ + args.child_ready_h = child_ready_h; + args.parent_ready_h = parent_ready_h; + args.entry = &thread_table[i]; + args.start = lpStartAddress; + args.param = lpParameter; + + thread_h = CreateThread(lpThreadAttributes, + dwStackSize, thread_start, + &args, + dwCreationFlags & ~CREATE_SUSPENDED, + lpThreadId); + + if (thread_h) { + + /* fill in ID and handle; tell child this is done */ + thread_table[i].id = *lpThreadId; + thread_table[i].handle = thread_h; + SetEvent (parent_ready_h); + + /* wait for child to fill in stack and copy args */ + WaitForSingleObject (child_ready_h, INFINITE); + + /* suspend the child if requested */ + if (dwCreationFlags & CREATE_SUSPENDED) + SuspendThread (thread_h); + + /* let child call given function now (or when resumed) */ + SetEvent (parent_ready_h); + + } else { + CloseHandle (parent_ready_h); + } + } + } + + CloseHandle (child_ready_h); + + if (thread_h == NULL) + thread_table[i].in_use = FALSE; + + } else { /* no thread slot found */ + SetLastError (ERROR_TOO_MANY_TCBS); + } + + return thread_h; + } + + static DWORD WINAPI thread_start(LPVOID arg) + { + DWORD ret = 0; + thread_args args = *(thread_args *)arg; + + /* wait for parent to fill in ID and handle */ + WaitForSingleObject (args.parent_ready_h, INFINITE); + ResetEvent (args.parent_ready_h); + + /* fill in stack; tell parent this is done */ + args.entry->stack = GC_get_stack_base(); + SetEvent (args.child_ready_h); + + /* wait for parent to tell us to go (in case it needs to suspend us) */ + WaitForSingleObject (args.parent_ready_h, INFINITE); + CloseHandle (args.parent_ready_h); + + /* Clear the thread entry even if we exit with an exception. */ + /* This is probably pointless, since an uncaught exception is */ + /* supposed to result in the process being killed. */ + #ifndef __GNUC__ + __try { + #endif /* __GNUC__ */ + ret = args.start (args.param); + #ifndef __GNUC__ + } __finally { + #endif /* __GNUC__ */ + LOCK(); + args.entry->stack = 0; + args.entry->in_use = FALSE; + /* cast away volatile qualifier */ + BZERO((void *) &args.entry->context, sizeof(CONTEXT)); + UNLOCK(); + #ifndef __GNUC__ + } + #endif /* __GNUC__ */ + + return ret; + } + #endif /* !defined(MSWINCE) && !(defined(__MINGW32__) && !defined(_DLL)) */ + + #ifdef MSWINCE + + typedef struct { + HINSTANCE hInstance; + HINSTANCE hPrevInstance; + LPWSTR lpCmdLine; + int nShowCmd; + } main_thread_args; + + DWORD WINAPI main_thread_start(LPVOID arg); + + int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPWSTR lpCmdLine, int nShowCmd) + { + DWORD exit_code = 1; + + main_thread_args args = { + hInstance, hPrevInstance, lpCmdLine, nShowCmd + }; + HANDLE thread_h; + DWORD thread_id; + + /* initialize everything */ + InitializeCriticalSection(&GC_allocate_ml); + GC_init(); + + /* start the main thread */ + thread_h = GC_CreateThread( + NULL, 0, main_thread_start, &args, 0, &thread_id); + + if (thread_h != NULL) + { + WaitForSingleObject (thread_h, INFINITE); + GetExitCodeThread (thread_h, &exit_code); + CloseHandle (thread_h); + } + + GC_deinit(); + DeleteCriticalSection(&GC_allocate_ml); + + return (int) exit_code; + } + + DWORD WINAPI main_thread_start(LPVOID arg) + { + main_thread_args * args = (main_thread_args *) arg; + + return (DWORD) GC_WinMain (args->hInstance, args->hPrevInstance, + args->lpCmdLine, args->nShowCmd); + } + + # else /* !MSWINCE */ + LONG WINAPI GC_write_fault_handler(struct _EXCEPTION_POINTERS *exc_info); /* *************** BOOL WINAPI DllMain(HINSTANCE inst, ULON *** 153,163 **** /* The following should be a noop according to the win32 */ /* documentation. There is empirical evidence that it */ /* isn't. - HB */ ! # ifndef SMALL_CONFIG if (GC_incremental) SetUnhandledExceptionFilter(GC_write_fault_handler); # endif ! for (i = 0; InterlockedExchange(&thread_table[i].in_use,1) != 0; i++) { /* Compare-and-swap would make this cleaner, but that's not */ /* supported before Windows 98 and NT 4.0. In Windows 2000, */ /* InterlockedExchange is supposed to be replaced by */ --- 548,561 ---- /* The following should be a noop according to the win32 */ /* documentation. There is empirical evidence that it */ /* isn't. - HB */ ! # ifdef MPROTECT_VDB if (GC_incremental) SetUnhandledExceptionFilter(GC_write_fault_handler); # endif ! for (i = 0; ! /* cast away volatile qualifier */ ! InterlockedExchange((LPLONG) &thread_table[i].in_use, 1) != 0; ! i++) { /* Compare-and-swap would make this cleaner, but that's not */ /* supported before Windows 98 and NT 4.0. In Windows 2000, */ /* InterlockedExchange is supposed to be replaced by */ *************** BOOL WINAPI DllMain(HINSTANCE inst, ULON *** 168,182 **** } thread_table[i].id = GetCurrentThreadId(); if (!DuplicateHandle(GetCurrentProcess(), ! GetCurrentThread(), GetCurrentProcess(), ! &thread_table[i].handle, 0, 0, DUPLICATE_SAME_ACCESS)) { ! DWORD last_error = GetLastError(); ! GC_printf1("Last error code: %lx\n", last_error); ! ABORT("DuplicateHandle failed"); } thread_table[i].stack = GC_get_stack_base(); /* If this thread is being created while we are trying to stop */ --- 566,581 ---- } thread_table[i].id = GetCurrentThreadId(); if (!DuplicateHandle(GetCurrentProcess(), ! GetCurrentThread(), GetCurrentProcess(), ! /* cast away volatile qualifier */ ! (HANDLE *) &thread_table[i].handle, 0, 0, DUPLICATE_SAME_ACCESS)) { ! DWORD last_error = GetLastError(); ! GC_printf1("Last error code: %lx\n", last_error); ! ABORT("DuplicateHandle failed"); } thread_table[i].stack = GC_get_stack_base(); /* If this thread is being created while we are trying to stop */ *************** BOOL WINAPI DllMain(HINSTANCE inst, ULON *** 185,211 **** while (GC_please_stop) Sleep(20); } break; - case DLL_PROCESS_DETACH: case DLL_THREAD_DETACH: { int i; DWORD thread_id = GetCurrentThreadId(); LOCK(); for (i = 0; ! thread_table[i].stack == 0 || thread_table[i].id != thread_id; ! i++) { ! if (i == MAX_THREADS - 1) ! ABORT("thread not found on detach"); } - thread_table[i].stack = 0; - thread_table[i].in_use = FALSE; - CloseHandle(thread_table[i].handle); - BZERO(&thread_table[i].context, sizeof(CONTEXT)); UNLOCK(); } break; } return TRUE; } ! #endif /* WIN32_THREADS */ --- 584,636 ---- while (GC_please_stop) Sleep(20); } break; case DLL_THREAD_DETACH: { int i; DWORD thread_id = GetCurrentThreadId(); LOCK(); for (i = 0; ! i < MAX_THREADS && ! (thread_table[i].stack == 0 || thread_table[i].id != thread_id); ! i++) {} ! if (i >= MAX_THREADS) { ! WARN("thread %ld not found on detach", (GC_word)thread_id); ! } else { ! thread_table[i].stack = 0; ! thread_table[i].in_use = FALSE; ! CloseHandle(thread_table[i].handle); ! /* cast away volatile qualifier */ ! BZERO((void *) &thread_table[i].context, sizeof(CONTEXT)); ! } ! UNLOCK(); ! } ! break; ! case DLL_PROCESS_DETACH: ! { ! int i; ! ! LOCK(); ! for (i = 0; i < MAX_THREADS; ++i) ! { ! if (thread_table[i].in_use) ! { ! thread_table[i].stack = 0; ! thread_table[i].in_use = FALSE; ! CloseHandle(thread_table[i].handle); ! BZERO((void *) &thread_table[i].context, sizeof(CONTEXT)); ! } } UNLOCK(); + + GC_deinit(); + DeleteCriticalSection(&GC_allocate_ml); } break; + } return TRUE; } ! # endif /* !MSWINCE */ ! ! #endif /* GC_WIN32_THREADS */ diff -Nrc3pad gcc-3.0.4/fastjar/ChangeLog gcc-3.1/fastjar/ChangeLog *** gcc-3.0.4/fastjar/ChangeLog Wed Feb 20 18:39:14 2002 --- gcc-3.1/fastjar/ChangeLog Wed May 15 02:15:21 2002 *************** *** 1,35 **** ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2001-12-20 Release Manager ! * GCC 3.0.3 Released. ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 20010617 Release Manager ! * GCC 3.0 Released. 2001-05-15 Per Bothner * Makefile.am (bin_PROGRAMS): Renamed from "fastjar" to "jar". 2001-01-21 Tom Tromey * Makefile.in: Rebuilt. --- 1,126 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-03-18 Bryce McKinlay ! * jartool.c (expand_options): Handle tar-style argument list with a ! leading "-". ! 2002-02-23 Anthony Green ! * jartool.c (main): Fix handling of -C. ! 2002-01-30 Tom Tromey ! * jartool.c (main): NULL-terminate new_argv. Pass 0 as argument ! to init_args. ! 2002-01-11 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (AUTOMAKE_OPTIONS): New macro. ! 2002-01-09 Tom Tromey ! For PR libgcj/5303: ! * jargrep.h: Removed RCS keywords. ! (GVERSION): Removed. ! * configure, Makefile.in, config.h.in: Rebuilt. ! * configure.in: Added AM_MAINTAINER_MODE. ! Don't look for getopt.h. Use `fastjar' as package name. ! * Makefile.am (INCLUDES): Look in ../include. ! (LIBIBERTY): New macro. ! (jar_LDADD): Use it. ! (jar_DEPENDENCIES): Likewise. ! (grepjar_LDADD): Likewise. ! (grepjar_DEPENDENCIES): Likewise. ! * jargrep.c: Removed RCS keywords. Always include getopt.h. ! (LONG_OPT): New macro. ! (OPT_HELP): Likewise. ! (main): Use getopt_long. Let getopt print invalid argument ! message. Handle --help. Use version(). ! (version): New function. ! (optarg, optind): Don't declare. ! (option_vec): New global. ! (help): New function. ! (Usage): Updated to GNU standards. ! * jartool.c: Removed RCS keywords. Include getopt.h. ! (LONG_OPT): New macro. ! (OPT_HELP): Likewise. ! (options): New global. ! (help): New function. ! (usage): Print a single line. ! (version): New function. ! (expand_options): New function. ! (main): Use getopt_long and expand_options. Fail if `-u' ! specified. Changed handling of -f, -m, -V options. ! (OPTION_STRING): New macro. ! (version_string): Removed. ! ! 2001-01-02 Craig Rodrigues ! ! PR bootstrap/5117 ! * configure.in (AC_CHECK_HEADERS): Check for stdlib.h. ! * Makefile.am: Move grepjar to bin_PROGRAMS. ! * config.h.in: Regenerated. ! * Makefile.in: Regenerated. ! * aclocal.m4: Regenerated. ! * stamp-h.in: Regenerated. ! * jargrep.c: Eliminate some signed/unsigned and default ! uninitialized warnings. Use HAVE_STDLIB_H instead of ! STDC_HEADERS macro. ! * jartool.c: Likewise. ! * compress.c: Likewise. ! ! 2001-09-17 Tom Tromey ! ! For PR java/4295: ! * aclocal.m4, configure, Makefile.in: Rebuilt. ! * configure.in: Added AC_EXEEXT. ! ! 2001-10-12 Bryce McKinlay ! ! * jatool.c (extract_jar): Account for null termination when determining ! whether to expand "filename". ! ! 2001-08-28 Alexandre Petit-Bianco ! ! * jartool.c (add_to_jar): Return 1 if `stat' initialy failed. ! Fixes PR java/3949. ! ! 2001-08-27 Tom Tromey ! ! * jartool.c (jarfile): Remove length limitation. ! (main): Use jt_strdup when initializing jarfile. ! ! 2001-07-04 Tom Tromey ! ! Modified from patch by Julian Hall : ! * jartool.c (errno): Conditionally declare. ! (O_BINARY): Conditionally define. ! (main): Use open, not creat. Use O_BINARY everywhere. ! (make_manifest): Use O_BINARY. ! (add_to_jar): Likewise. ! ! 2001-06-28 Tom Tromey ! ! * configure: Rebuilt. ! * configure.in: Accept --with-system-zlib. Fixes PR java/3441. 2001-05-15 Per Bothner * Makefile.am (bin_PROGRAMS): Renamed from "fastjar" to "jar". + 2001-05-03 John David Anglin + + * jartool.c (jt_strdup): New function. + (get_next_arg): Use jt_strdup instead of strdup. + 2001-01-21 Tom Tromey * Makefile.in: Rebuilt. diff -Nrc3pad gcc-3.0.4/fastjar/Makefile.am gcc-3.1/fastjar/Makefile.am *** gcc-3.0.4/fastjar/Makefile.am Thu May 17 17:15:11 2001 --- gcc-3.1/fastjar/Makefile.am Sun Jan 13 18:05:25 2002 *************** *** 1,5 **** --- 1,8 ---- # Process this with automake to create Makefile.in + ## We definitely don't want dependency tracking when using automake 1.4. + AUTOMAKE_OPTIONS = no-dependencies + # Work around what appears to be a GNU make bug handling MAKEFLAGS # values defined in terms of make variables, as is the case for CC and # friends when we are called from the top level Makefile. *************** AM_MAKEFLAGS = \ *** 38,52 **** "RANLIB=$(RANLIB)" \ "DESTDIR=$(DESTDIR)" ! INCLUDES = -I. -I$(top_srcdir) $(ZINCS) ! bin_PROGRAMS = jar ! EXTRA_PROGRAMS = grepjar ! jar_SOURCES = jartool.c dostime.c compress.c pushback.c jartool.h zipfile.h dostime.h compress.h pushback.h ! jar_LDADD = $(ZLIBS) ! jar_DEPENDENCIES = $(ZDEPS) ! grepjar_SOURCES = jargrep.c dostime.c compress.c pushback.c jartool.h zipfile.h dostime.h compress.h pushback.h ! grepjar_LDADD = $(ZLIBS) ! grepjar_DEPENDENCIES = $(ZDEPS) AM_CFLAGS = @fastjar_warn_cflags@ --- 41,59 ---- "RANLIB=$(RANLIB)" \ "DESTDIR=$(DESTDIR)" ! INCLUDES = -I. -I$(top_srcdir) $(ZINCS) -I$(top_srcdir)/../include ! LIBIBERTY = ../libiberty/libiberty.a ! ! bin_PROGRAMS = jar grepjar ! jar_SOURCES = jartool.c dostime.c compress.c pushback.c jartool.h \ ! zipfile.h dostime.h compress.h pushback.h ! jar_LDADD = $(ZLIBS) $(LIBIBERTY) ! jar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY) ! ! grepjar_SOURCES = jargrep.c dostime.c compress.c pushback.c jartool.h \ ! zipfile.h dostime.h compress.h pushback.h ! grepjar_LDADD = $(ZLIBS) $(LIBIBERTY) ! grepjar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY) AM_CFLAGS = @fastjar_warn_cflags@ diff -Nrc3pad gcc-3.0.4/fastjar/Makefile.in gcc-3.1/fastjar/Makefile.in *** gcc-3.0.4/fastjar/Makefile.in Wed Feb 20 19:40:48 2002 --- gcc-3.1/fastjar/Makefile.in Sun Jan 13 18:05:25 2002 *************** *** 12,21 **** # Process this with automake to create Makefile.in - # Work around what appears to be a GNU make bug handling MAKEFLAGS - # values defined in terms of make variables, as is the case for CC and - # friends when we are called from the top level Makefile. - SHELL = @SHELL@ --- 12,17 ---- *************** POST_UNINSTALL = : *** 66,71 **** --- 62,69 ---- CC = @CC@ CHMOD = @CHMOD@ CP = @CP@ + EXEEXT = @EXEEXT@ + MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ RM = @RM@ *************** ZINCS = @ZINCS@ *** 76,81 **** --- 74,84 ---- ZLIBS = @ZLIBS@ fastjar_warn_cflags = @fastjar_warn_cflags@ + AUTOMAKE_OPTIONS = no-dependencies + + # Work around what appears to be a GNU make bug handling MAKEFLAGS + # values defined in terms of make variables, as is the case for CC and + # friends when we are called from the top level Makefile. AM_MAKEFLAGS = \ "AR_FLAGS=$(AR_FLAGS)" \ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \ *************** AM_MAKEFLAGS = \ *** 112,133 **** "DESTDIR=$(DESTDIR)" ! INCLUDES = -I. -I$(top_srcdir) $(ZINCS) ! bin_PROGRAMS = jar ! EXTRA_PROGRAMS = grepjar ! jar_SOURCES = jartool.c dostime.c compress.c pushback.c jartool.h zipfile.h dostime.h compress.h pushback.h ! jar_LDADD = $(ZLIBS) ! jar_DEPENDENCIES = $(ZDEPS) ! grepjar_SOURCES = jargrep.c dostime.c compress.c pushback.c jartool.h zipfile.h dostime.h compress.h pushback.h ! grepjar_LDADD = $(ZLIBS) ! grepjar_DEPENDENCIES = $(ZDEPS) AM_CFLAGS = @fastjar_warn_cflags@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = install-defs.sh PROGRAMS = $(bin_PROGRAMS) --- 115,143 ---- "DESTDIR=$(DESTDIR)" ! INCLUDES = -I. -I$(top_srcdir) $(ZINCS) -I$(top_srcdir)/../include ! LIBIBERTY = ../libiberty/libiberty.a ! ! bin_PROGRAMS = jar grepjar ! jar_SOURCES = jartool.c dostime.c compress.c pushback.c jartool.h \ ! zipfile.h dostime.h compress.h pushback.h ! ! jar_LDADD = $(ZLIBS) $(LIBIBERTY) ! jar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY) ! ! grepjar_SOURCES = jargrep.c dostime.c compress.c pushback.c jartool.h \ ! zipfile.h dostime.h compress.h pushback.h ! ! grepjar_LDADD = $(ZLIBS) $(LIBIBERTY) ! grepjar_DEPENDENCIES = $(ZDEPS) $(LIBIBERTY) AM_CFLAGS = @fastjar_warn_cflags@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = install-defs.sh + bin_PROGRAMS = jar$(EXEEXT) grepjar$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) *************** DEFS = @DEFS@ -I. -I$(srcdir) -I. *** 135,144 **** CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ - grepjar_OBJECTS = jargrep.o dostime.o compress.o pushback.o - grepjar_LDFLAGS = jar_OBJECTS = jartool.o dostime.o compress.o pushback.o jar_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) --- 145,154 ---- CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ jar_OBJECTS = jartool.o dostime.o compress.o pushback.o jar_LDFLAGS = + grepjar_OBJECTS = jargrep.o dostime.o compress.o pushback.o + grepjar_LDFLAGS = CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) *************** DISTFILES = $(DIST_COMMON) $(SOURCES) $( *** 152,176 **** TAR = tar GZIP_ENV = --best ! SOURCES = $(grepjar_SOURCES) $(jar_SOURCES) ! OBJECTS = $(grepjar_OBJECTS) $(jar_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .s ! $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) ! cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status ! $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck ! $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h --- 162,186 ---- TAR = tar GZIP_ENV = --best ! SOURCES = $(jar_SOURCES) $(grepjar_SOURCES) ! OBJECTS = $(jar_OBJECTS) $(grepjar_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .o .s ! $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) ! cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status ! $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck ! $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h *************** stamp-h: $(srcdir)/config.h.in $(top_bui *** 183,189 **** && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null ! $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ --- 193,199 ---- && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null ! $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ *************** distclean-compile: *** 247,260 **** maintainer-clean-compile: ! grepjar: $(grepjar_OBJECTS) $(grepjar_DEPENDENCIES) ! @rm -f grepjar ! $(LINK) $(grepjar_LDFLAGS) $(grepjar_OBJECTS) $(grepjar_LDADD) $(LIBS) ! ! jar: $(jar_OBJECTS) $(jar_DEPENDENCIES) ! @rm -f jar $(LINK) $(jar_LDFLAGS) $(jar_OBJECTS) $(jar_LDADD) $(LIBS) tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) --- 257,270 ---- maintainer-clean-compile: ! jar$(EXEEXT): $(jar_OBJECTS) $(jar_DEPENDENCIES) ! @rm -f jar$(EXEEXT) $(LINK) $(jar_LDFLAGS) $(jar_OBJECTS) $(jar_LDADD) $(LIBS) + grepjar$(EXEEXT): $(grepjar_OBJECTS) $(grepjar_DEPENDENCIES) + @rm -f grepjar$(EXEEXT) + $(LINK) $(grepjar_LDFLAGS) $(grepjar_OBJECTS) $(grepjar_LDADD) $(LIBS) + tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) diff -Nrc3pad gcc-3.0.4/fastjar/aclocal.m4 gcc-3.1/fastjar/aclocal.m4 *** gcc-3.0.4/fastjar/aclocal.m4 Wed Feb 20 19:40:48 2002 --- gcc-3.1/fastjar/aclocal.m4 Wed Jan 9 23:22:20 2002 *************** for am_file in <<$1>>; do *** 125,127 **** --- 125,160 ---- done<<>>dnl>>) changequote([,]))]) + # Add --enable-maintainer-mode option to configure. + # From Jim Meyering + + # serial 1 + + AC_DEFUN(AM_MAINTAINER_MODE, + [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, + [ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT($USE_MAINTAINER_MODE) + AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl + ] + ) + + # Define a conditional. + + AC_DEFUN(AM_CONDITIONAL, + [AC_SUBST($1_TRUE) + AC_SUBST($1_FALSE) + if $2; then + $1_TRUE= + $1_FALSE='#' + else + $1_TRUE='#' + $1_FALSE= + fi]) + diff -Nrc3pad gcc-3.0.4/fastjar/compress.c gcc-3.1/fastjar/compress.c *** gcc-3.0.4/fastjar/compress.c Thu Dec 14 18:45:35 2000 --- gcc-3.1/fastjar/compress.c Thu Jan 3 04:57:56 2002 *************** *** 1,6 **** ! /* $Id: compress.c,v 1.2 2000/12/14 18:45:35 ghazi Exp $ $Log: compress.c,v $ Revision 1.2 2000/12/14 18:45:35 ghazi Warning fixes: --- 1,21 ---- ! /* $Id: compress.c,v 1.3 2002/01/03 04:57:56 rodrigc Exp $ $Log: compress.c,v $ + Revision 1.3 2002/01/03 04:57:56 rodrigc + 2001-01-02 Craig Rodrigues + + PR bootstrap/5117 + * configure.in (AC_CHECK_HEADERS): Check for stdlib.h. + * Makefile.am: Move grepjar to bin_PROGRAMS. + * config.h.in: Regenerated. + * Makefile.in: Regenerated. + * aclocal.m4: Regenerated. + * jargrep.c: Eliminate some signed/unsigned and default + uninitialized warnings. Use HAVE_STDLIB_H instead of + STDC_HEADERS macro. + * jartool.c: Likewise. + * compress.c: Likewise. + Revision 1.2 2000/12/14 18:45:35 ghazi Warning fixes: *************** int compress_file(int in_fd, int out_fd, *** 138,143 **** --- 153,159 ---- Bytef out_buff[RDSZ]; unsigned int rdamt, wramt; unsigned long tr = 0; + int rtval; rdamt = 0; *************** int compress_file(int in_fd, int out_fd, *** 153,166 **** /* If deflate is out of input, fill the input buffer for it */ if(zs.avail_in == 0 && zs.avail_out > 0){ ! if((rdamt = read(in_fd, in_buff, RDSZ)) == 0) break; ! if(rdamt == -1){ perror("read"); exit(1); } ! /* compute the CRC while we're at it */ ze->crc = crc32(ze->crc, in_buff, rdamt); --- 169,184 ---- /* If deflate is out of input, fill the input buffer for it */ if(zs.avail_in == 0 && zs.avail_out > 0){ ! if((rtval = read(in_fd, in_buff, RDSZ)) == 0) break; ! if(rtval == -1){ perror("read"); exit(1); } ! ! rdamt = rtval; ! /* compute the CRC while we're at it */ ze->crc = crc32(ze->crc, in_buff, rdamt); *************** int compress_file(int in_fd, int out_fd, *** 198,204 **** wramt = RDSZ - zs.avail_out; ! if(write(out_fd, out_buff, wramt) != wramt){ perror("write"); exit(1); } --- 216,222 ---- wramt = RDSZ - zs.avail_out; ! if(write(out_fd, out_buff, wramt) != (int)wramt){ perror("write"); exit(1); } *************** int compress_file(int in_fd, int out_fd, *** 212,218 **** while(deflate(&zs, Z_FINISH) == Z_OK){ wramt = RDSZ - zs.avail_out; ! if(write(out_fd, out_buff, wramt) != wramt){ perror("write"); exit(1); } --- 230,236 ---- while(deflate(&zs, Z_FINISH) == Z_OK){ wramt = RDSZ - zs.avail_out; ! if(write(out_fd, out_buff, wramt) != (int)wramt){ perror("write"); exit(1); } *************** int compress_file(int in_fd, int out_fd, *** 225,231 **** if(zs.avail_out != RDSZ){ wramt = RDSZ - zs.avail_out; ! if(write(out_fd, out_buff, wramt) != wramt){ perror("write"); exit(1); } --- 243,249 ---- if(zs.avail_out != RDSZ){ wramt = RDSZ - zs.avail_out; ! if(write(out_fd, out_buff, wramt) != (int)wramt){ perror("write"); exit(1); } *************** int inflate_file(pb_file *pbf, int out_f *** 289,295 **** if(zs.avail_in == 0){ if((rdamt = pb_read(pbf, in_buff, RDSZ)) == 0) break; ! else if(rdamt < 0){ perror("read"); exit(1); } --- 307,313 ---- if(zs.avail_in == 0){ if((rdamt = pb_read(pbf, in_buff, RDSZ)) == 0) break; ! else if((int)rdamt < 0){ perror("read"); exit(1); } *************** int inflate_file(pb_file *pbf, int out_f *** 315,321 **** if(out_fd >= 0) if(write(out_fd, out_buff, (RDSZ - zs.avail_out)) != ! (RDSZ - zs.avail_out)){ perror("write"); exit(1); } --- 333,339 ---- if(out_fd >= 0) if(write(out_fd, out_buff, (RDSZ - zs.avail_out)) != ! (int)(RDSZ - zs.avail_out)){ perror("write"); exit(1); } *************** int inflate_file(pb_file *pbf, int out_f *** 332,338 **** if(out_fd >= 0) if(write(out_fd, out_buff, (RDSZ - zs.avail_out)) != ! (RDSZ - zs.avail_out)){ perror("write"); exit(1); } --- 350,356 ---- if(out_fd >= 0) if(write(out_fd, out_buff, (RDSZ - zs.avail_out)) != ! (int)(RDSZ - zs.avail_out)){ perror("write"); exit(1); } diff -Nrc3pad gcc-3.0.4/fastjar/config.h.in gcc-3.1/fastjar/config.h.in *** gcc-3.0.4/fastjar/config.h.in Fri Dec 15 18:45:09 2000 --- gcc-3.1/fastjar/config.h.in Wed Jan 9 23:22:20 2002 *************** *** 34,45 **** /* Define if you have the header file. */ #undef HAVE_FCNTL_H - /* Define if you have the header file. */ - #undef HAVE_GETOPT_H - /* Define if you have the header file. */ #undef HAVE_NDIR_H /* Define if you have the header file. */ #undef HAVE_SYS_DIR_H --- 34,45 ---- /* Define if you have the header file. */ #undef HAVE_FCNTL_H /* Define if you have the header file. */ #undef HAVE_NDIR_H + /* Define if you have the header file. */ + #undef HAVE_STDLIB_H + /* Define if you have the header file. */ #undef HAVE_SYS_DIR_H diff -Nrc3pad gcc-3.0.4/fastjar/configure gcc-3.1/fastjar/configure *** gcc-3.0.4/fastjar/configure Wed Feb 20 19:40:48 2002 --- gcc-3.1/fastjar/configure Wed Jan 9 23:22:20 2002 *************** *** 11,16 **** --- 11,21 ---- ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: + ac_help="$ac_help + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer" + ac_help="$ac_help + --with-system-zlib use installed libz" # Initialize some variables set by options. # The variables have the same names as the options, with *************** ac_configure=$ac_aux_dir/configure # Thi *** 563,569 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:567: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 568,574 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:572: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_SCRIPT" && INSTALL_SCR *** 616,622 **** test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:620: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile --- 621,627 ---- test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:625: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile *************** test "$program_suffix" != NONE && *** 673,679 **** test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:677: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 678,684 ---- test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:682: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 700,706 **** fi ! PACKAGE=fastar VERSION=0.92-gcc --- 705,711 ---- fi ! PACKAGE=fastjar VERSION=0.92-gcc *************** EOF *** 719,725 **** missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:723: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 724,730 ---- missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:728: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 732,738 **** fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:736: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 737,743 ---- fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:741: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 745,751 **** fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:749: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 750,756 ---- fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:754: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 758,764 **** fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:762: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 763,769 ---- fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:767: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 771,777 **** fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:775: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 776,782 ---- fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:780: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** fi *** 791,797 **** # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:795: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 796,802 ---- # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:800: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -z "$CC"; then *** 821,827 **** # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:825: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 826,832 ---- # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:830: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 872,878 **** # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:876: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 877,883 ---- # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:881: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 904,910 **** fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ! echo "configure:908: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. --- 909,915 ---- fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ! echo "configure:913: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. *************** cross_compiling=$ac_cv_prog_cc_cross *** 915,926 **** cat > conftest.$ac_ext << EOF ! #line 919 "configure" #include "confdefs.h" main(){return(0);} EOF ! if { (eval echo configure:924: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then --- 920,931 ---- cat > conftest.$ac_ext << EOF ! #line 924 "configure" #include "confdefs.h" main(){return(0);} EOF ! if { (eval echo configure:929: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then *************** if test $ac_cv_prog_cc_works = no; then *** 946,957 **** { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ! echo "configure:950: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:955: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 951,962 ---- { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ! echo "configure:955: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:960: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 960,966 **** yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no --- 965,971 ---- yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:969: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no *************** ac_test_CFLAGS="${CFLAGS+set}" *** 979,985 **** ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:983: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 984,990 ---- ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:988: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1022,1028 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1026: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1027,1033 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1031: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_DATA" && INSTALL_DATA= *** 1077,1083 **** # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1081: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1082,1088 ---- # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1086: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_RM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1113,1119 **** # Extract the first word of "cp", so it can be a program name with args. set dummy cp; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1117: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_CP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1118,1124 ---- # Extract the first word of "cp", so it can be a program name with args. set dummy cp; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1122: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_CP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1149,1155 **** # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1153: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1154,1160 ---- # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1158: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1185,1191 **** # Extract the first word of "chmod", so it can be a program name with args. set dummy chmod; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1189: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_CHMOD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1190,1196 ---- # Extract the first word of "chmod", so it can be a program name with args. set dummy chmod; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1194: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_CHMOD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1218,1223 **** --- 1223,1347 ---- echo "$ac_t""no" 1>&6 fi + echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 + echo "configure:1228: checking for Cygwin environment" >&5 + if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_cygwin=yes + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_cygwin=no + fi + rm -f conftest* + rm -f conftest* + fi + + echo "$ac_t""$ac_cv_cygwin" 1>&6 + CYGWIN= + test "$ac_cv_cygwin" = yes && CYGWIN=yes + echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 + echo "configure:1261: checking for mingw32 environment" >&5 + if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_mingw32=yes + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_mingw32=no + fi + rm -f conftest* + rm -f conftest* + fi + + echo "$ac_t""$ac_cv_mingw32" 1>&6 + MINGW32= + test "$ac_cv_mingw32" = yes && MINGW32=yes + + + echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 + echo "configure:1292: checking for executable suffix" >&5 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + if test "$CYGWIN" = yes || test "$MINGW32" = yes; then + ac_cv_exeext=.exe + else + rm -f conftest* + echo 'int main () { return 0; }' > conftest.$ac_ext + ac_cv_exeext= + if { (eval echo configure:1302: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + for file in conftest.*; do + case $file in + *.c | *.o | *.obj | *.ilk | *.pdb) ;; + *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; + esac + done + else + { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; } + fi + rm -f conftest* + test x"${ac_cv_exeext}" = x && ac_cv_exeext=no + fi + fi + + EXEEXT="" + test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext} + echo "$ac_t""${ac_cv_exeext}" 1>&6 + ac_exeext=$EXEEXT + + + echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 + echo "configure:1324: checking whether to enable maintainer-specific portions of Makefiles" >&5 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. + if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval + else + USE_MAINTAINER_MODE=no + fi + + echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 + + + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' + else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= + fi + MAINT=$MAINTAINER_MODE_TRUE + + if test "$GCC" = yes; then fastjar_warn_cflags='-W -Wall -pedantic -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings' *************** for ac_hdr in dirent.h sys/ndir.h sys/di *** 1229,1240 **** do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 ! echo "configure:1233: checking for $ac_hdr that defines DIR" >&5 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_hdr> --- 1353,1364 ---- do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 ! echo "configure:1357: checking for $ac_hdr that defines DIR" >&5 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_hdr> *************** int main() { *** 1242,1248 **** DIR *dirp = 0; ; return 0; } EOF ! if { (eval echo configure:1246: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* eval "ac_cv_header_dirent_$ac_safe=yes" else --- 1366,1372 ---- DIR *dirp = 0; ; return 0; } EOF ! if { (eval echo configure:1370: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* eval "ac_cv_header_dirent_$ac_safe=yes" else *************** done *** 1267,1273 **** # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 ! echo "configure:1271: checking for opendir in -ldir" >&5 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1391,1397 ---- # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 ! echo "configure:1395: checking for opendir in -ldir" >&5 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 1275,1281 **** ac_save_LIBS="$LIBS" LIBS="-ldir $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 1410,1416 ---- opendir() ; return 0; } EOF ! if { (eval echo configure:1414: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 1308,1314 **** else echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 ! echo "configure:1312: checking for opendir in -lx" >&5 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1432,1438 ---- else echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 ! echo "configure:1436: checking for opendir in -lx" >&5 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 1316,1322 **** ac_save_LIBS="$LIBS" LIBS="-lx $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 1451,1457 ---- opendir() ; return 0; } EOF ! if { (eval echo configure:1455: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 1350,1356 **** fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:1354: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= --- 1474,1480 ---- fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:1478: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= *************** else *** 1365,1377 **** # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1375: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 1489,1501 ---- # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1499: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 1382,1394 **** rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1392: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 1506,1518 ---- rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1516: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 1399,1411 **** rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1409: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 1523,1535 ---- rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** fi *** 1430,1441 **** echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ! echo "configure:1434: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include --- 1554,1565 ---- echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ! echo "configure:1558: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include *************** else *** 1443,1449 **** #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1447: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 1567,1573 ---- #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1571: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** rm -f conftest* *** 1460,1466 **** if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 1584,1590 ---- if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** fi *** 1478,1484 **** if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 1602,1608 ---- if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** if test "$cross_compiling" = yes; then *** 1499,1505 **** : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') --- 1623,1629 ---- : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') *************** if (XOR (islower (i), ISLOWER (i)) || to *** 1510,1516 **** exit (0); } EOF ! if { (eval echo configure:1514: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else --- 1634,1640 ---- exit (0); } EOF ! if { (eval echo configure:1638: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else *************** EOF *** 1534,1545 **** fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 ! echo "configure:1538: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include --- 1658,1669 ---- fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 ! echo "configure:1662: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include *************** int main() { *** 1547,1553 **** struct tm *tp; tp->tm_sec; ; return 0; } EOF ! if { (eval echo configure:1551: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else --- 1671,1677 ---- struct tm *tp; tp->tm_sec; ; return 0; } EOF ! if { (eval echo configure:1675: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else *************** EOF *** 1567,1587 **** fi ! for ac_hdr in fcntl.h unistd.h sys/param.h getopt.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:1575: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1585: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 1691,1711 ---- fi ! for ac_hdr in fcntl.h unistd.h sys/param.h stdlib.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:1699: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:1709: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** done *** 1609,1620 **** echo $ac_n "checking for off_t""... $ac_c" 1>&6 ! echo "configure:1613: checking for off_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS --- 1733,1744 ---- echo $ac_n "checking for off_t""... $ac_c" 1>&6 ! echo "configure:1737: checking for off_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS *************** EOF *** 1642,1653 **** fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 ! echo "configure:1646: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include --- 1766,1777 ---- fi echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 ! echo "configure:1770: checking whether struct tm is in sys/time.h or time.h" >&5 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include *************** int main() { *** 1655,1661 **** struct tm *tp; tp->tm_sec; ; return 0; } EOF ! if { (eval echo configure:1659: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else --- 1779,1785 ---- struct tm *tp; tp->tm_sec; ; return 0; } EOF ! if { (eval echo configure:1783: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_struct_tm=time.h else *************** fi *** 1677,1683 **** echo $ac_n "checking size of char""... $ac_c" 1>&6 ! echo "configure:1681: checking size of char" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_char'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1801,1807 ---- echo $ac_n "checking size of char""... $ac_c" 1>&6 ! echo "configure:1805: checking size of char" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_char'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1685,1691 **** { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() --- 1809,1815 ---- { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() *************** main() *** 1696,1702 **** exit(0); } EOF ! if { (eval echo configure:1700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_char=`cat conftestval` else --- 1820,1826 ---- exit(0); } EOF ! if { (eval echo configure:1824: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_char=`cat conftestval` else *************** EOF *** 1716,1722 **** echo $ac_n "checking size of short""... $ac_c" 1>&6 ! echo "configure:1720: checking size of short" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1840,1846 ---- echo $ac_n "checking size of short""... $ac_c" 1>&6 ! echo "configure:1844: checking size of short" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1724,1730 **** { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() --- 1848,1854 ---- { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() *************** main() *** 1735,1741 **** exit(0); } EOF ! if { (eval echo configure:1739: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_short=`cat conftestval` else --- 1859,1865 ---- exit(0); } EOF ! if { (eval echo configure:1863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_short=`cat conftestval` else *************** EOF *** 1755,1761 **** echo $ac_n "checking size of int""... $ac_c" 1>&6 ! echo "configure:1759: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1879,1885 ---- echo $ac_n "checking size of int""... $ac_c" 1>&6 ! echo "configure:1883: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1763,1769 **** { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() --- 1887,1893 ---- { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() *************** main() *** 1774,1780 **** exit(0); } EOF ! if { (eval echo configure:1778: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else --- 1898,1904 ---- exit(0); } EOF ! if { (eval echo configure:1902: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_int=`cat conftestval` else *************** EOF *** 1794,1800 **** echo $ac_n "checking size of long""... $ac_c" 1>&6 ! echo "configure:1798: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1918,1924 ---- echo $ac_n "checking size of long""... $ac_c" 1>&6 ! echo "configure:1922: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1802,1808 **** { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() --- 1926,1932 ---- { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() *************** main() *** 1813,1819 **** exit(0); } EOF ! if { (eval echo configure:1817: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else --- 1937,1943 ---- exit(0); } EOF ! if { (eval echo configure:1941: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long=`cat conftestval` else *************** EOF *** 1833,1839 **** echo $ac_n "checking size of long long""... $ac_c" 1>&6 ! echo "configure:1837: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1957,1963 ---- echo $ac_n "checking size of long long""... $ac_c" 1>&6 ! echo "configure:1961: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1841,1847 **** { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() --- 1965,1971 ---- { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() *************** main() *** 1852,1858 **** exit(0); } EOF ! if { (eval echo configure:1856: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long=`cat conftestval` else --- 1976,1982 ---- exit(0); } EOF ! if { (eval echo configure:1980: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long=`cat conftestval` else *************** EOF *** 1873,1886 **** echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 ! echo "configure:1877: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext < #include --- 1997,2010 ---- echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 ! echo "configure:2001: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext < #include *************** int main() { *** 1891,1901 **** #endif ; return 0; } EOF ! if { (eval echo configure:1895: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext < #include --- 2015,2025 ---- #endif ; return 0; } EOF ! if { (eval echo configure:2019: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext < #include *************** int main() { *** 1906,1912 **** #endif ; return 0; } EOF ! if { (eval echo configure:1910: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else --- 2030,2036 ---- #endif ; return 0; } EOF ! if { (eval echo configure:2034: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else *************** if test "$cross_compiling" = yes; then *** 1926,1932 **** { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <&2; exit 1; } else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else --- 2063,2069 ---- exit (u.c[sizeof (long) - 1] == 1); } EOF ! if { (eval echo configure:2067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else *************** EOF *** 1963,1971 **** fi ! ZDEPS='$(top_builddir)/../zlib/libz.a' ! ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir" ! ZINCS='-I$(top_srcdir)/../zlib' --- 2087,2155 ---- fi ! # Check whether --with-system-zlib or --without-system-zlib was given. ! if test "${with_system_zlib+set}" = set; then ! withval="$with_system_zlib" ! : ! fi ! ! ! ZLIBS= ! ZDEPS= ! ZINCS= ! use_zlib=maybe ! if test "$with_system_zlib" = yes; then ! echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6 ! echo "configure:2104: checking for deflate in -lz" >&5 ! ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'` ! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ! echo $ac_n "(cached) $ac_c" 1>&6 ! else ! ac_save_LIBS="$LIBS" ! LIBS="-lz $LIBS" ! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ! rm -rf conftest* ! eval "ac_cv_lib_$ac_lib_var=yes" ! else ! echo "configure: failed program was:" >&5 ! cat conftest.$ac_ext >&5 ! rm -rf conftest* ! eval "ac_cv_lib_$ac_lib_var=no" ! fi ! rm -f conftest* ! LIBS="$ac_save_LIBS" ! ! fi ! if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ! echo "$ac_t""yes" 1>&6 ! ZLIBS=-lz ! else ! echo "$ac_t""no" 1>&6 ! use_zlib=no ! fi ! ! else ! use_zlib=no ! fi ! ! if test "$use_zlib" = no; then ! # Brain dead way to find tree's zlib. ! ZDEPS='$(top_builddir)/../zlib/libz.a' ! ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir" ! ZINCS='-I$(top_srcdir)/../zlib' ! fi *************** s%@RM@%$RM%g *** 2119,2124 **** --- 2303,2312 ---- s%@CP@%$CP%g s%@STRIP@%$STRIP%g s%@CHMOD@%$CHMOD%g + s%@EXEEXT@%$EXEEXT%g + s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g + s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g + s%@MAINT@%$MAINT%g s%@fastjar_warn_cflags@%$fastjar_warn_cflags%g s%@CPP@%$CPP%g s%@ZLIBS@%$ZLIBS%g diff -Nrc3pad gcc-3.0.4/fastjar/configure.in gcc-3.1/fastjar/configure.in *** gcc-3.0.4/fastjar/configure.in Fri Dec 15 18:45:09 2000 --- gcc-3.1/fastjar/configure.in Wed Jan 9 23:22:20 2002 *************** *** 1,6 **** dnl Process this file with autoconf to produce a configure script. AC_INIT(jartool.h) ! AM_INIT_AUTOMAKE(fastar, 0.92-gcc) AM_CONFIG_HEADER(config.h) dnl Checks for programs. --- 1,6 ---- dnl Process this file with autoconf to produce a configure script. AC_INIT(jartool.h) ! AM_INIT_AUTOMAKE(fastjar, 0.92-gcc) AM_CONFIG_HEADER(config.h) dnl Checks for programs. *************** AC_PATH_PROG(RM, rm, /bin/rm, $PATH:/bin *** 10,15 **** --- 10,18 ---- AC_PATH_PROG(CP, cp, /bin/cp, $PATH:/bin:/usr/bin:/usr/local/bin) AC_PATH_PROG(STRIP, strip, /usr/bin/strip, $PATH:/bin:/usr/bin:/usr/local/bin) AC_PATH_PROG(CHMOD, chmod, /bin/chmod, $PATH:/bin:/usr/bin:/usr/local/bin) + AC_EXEEXT + + AM_MAINTAINER_MODE dnl Add warning flags if we are using gcc. if test "$GCC" = yes; then *************** dnl Checks for header files. *** 21,27 **** AC_HEADER_DIRENT AC_HEADER_STDC AC_STRUCT_TM ! AC_CHECK_HEADERS(fcntl.h unistd.h sys/param.h getopt.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_TYPE_OFF_T --- 24,30 ---- AC_HEADER_DIRENT AC_HEADER_STDC AC_STRUCT_TM ! AC_CHECK_HEADERS(fcntl.h unistd.h sys/param.h stdlib.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_TYPE_OFF_T *************** AC_CHECK_SIZEOF(long long) *** 37,46 **** dnl Check byte order AC_C_BIGENDIAN ! dnl Brain dead check for tree's zlib ! ZDEPS='$(top_builddir)/../zlib/libz.a' ! ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir" ! ZINCS='-I$(top_srcdir)/../zlib' AC_SUBST(ZLIBS) AC_SUBST(ZDEPS) AC_SUBST(ZINCS) --- 40,64 ---- dnl Check byte order AC_C_BIGENDIAN ! AC_ARG_WITH(system-zlib, ! [ --with-system-zlib use installed libz]) ! ! ZLIBS= ! ZDEPS= ! ZINCS= ! use_zlib=maybe ! if test "$with_system_zlib" = yes; then ! AC_CHECK_LIB(z, deflate, ZLIBS=-lz, use_zlib=no) ! else ! use_zlib=no ! fi ! ! if test "$use_zlib" = no; then ! # Brain dead way to find tree's zlib. ! ZDEPS='$(top_builddir)/../zlib/libz.a' ! ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir" ! ZINCS='-I$(top_srcdir)/../zlib' ! fi AC_SUBST(ZLIBS) AC_SUBST(ZDEPS) AC_SUBST(ZINCS) diff -Nrc3pad gcc-3.0.4/fastjar/jargrep.c gcc-3.1/fastjar/jargrep.c *** gcc-3.0.4/fastjar/jargrep.c Fri Dec 15 18:45:09 2000 --- gcc-3.1/fastjar/jargrep.c Wed Jan 9 23:22:20 2002 *************** *** 1,5 **** --- 1,6 ---- /* jargrep.c - main functions for jargrep utility + Copyright (C) 2002 Free Software Foundation Copyright (C) 1999, 2000 Bryan Burns Copyright (C) 2000 Cory Hollingsworth *************** *** 21,29 **** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* $Id: jargrep.c,v 1.4 2000/12/15 18:45:09 tromey Exp $ - $Log: jargrep.c,v $ Revision 1.4 2000/12/15 18:45:09 tromey * jargrep.c: Include getopt.h if it exists. (optind): Declare. --- 22,45 ---- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* Id: jargrep.c,v 1.5 2002/01/03 04:57:56 rodrigc Exp ! ! Log: jargrep.c,v ! Revision 1.5 2002/01/03 04:57:56 rodrigc ! 2001-01-02 Craig Rodrigues ! ! PR bootstrap/5117 ! * configure.in (AC_CHECK_HEADERS): Check for stdlib.h. ! * Makefile.am: Move grepjar to bin_PROGRAMS. ! * config.h.in: Regenerated. ! * Makefile.in: Regenerated. ! * aclocal.m4: Regenerated. ! * jargrep.c: Eliminate some signed/unsigned and default ! uninitialized warnings. Use HAVE_STDLIB_H instead of ! STDC_HEADERS macro. ! * jartool.c: Likewise. ! * compress.c: Likewise. Revision 1.4 2000/12/15 18:45:09 tromey * jargrep.c: Include getopt.h if it exists. (optind): Declare. *************** will test some other platforms later. *** 96,102 **** #include #include #include ! #ifdef STDC_HEADERS #include #endif #include "jargrep.h" --- 112,118 ---- #include #include #include ! #ifdef HAVE_STDLIB_H #include #endif #include "jargrep.h" *************** will test some other platforms later. *** 105,118 **** #include "zipfile.h" #include "zlib.h" #include "compress.h" - #ifdef HAVE_GETOPT_H #include - #endif ! #define Usage "Usage: %s [-bcinsw] <-e regexp | regexp> file(s)\n" ! extern char *optarg; ! extern int optind; /* Function name: opt_valid --- 121,132 ---- #include "zipfile.h" #include "zlib.h" #include "compress.h" #include ! void version(void); ! void help(const char *name); ! #define Usage "Usage: %s [-bcinsw] <-e PATTERN | PATTERN> FILE ...\n" /* Function name: opt_valid *************** purpose: Verify the CRC matches that as *** 446,452 **** */ static void check_crc(pb_file *pbf, const char *stream, ub4 usize) { ! ub4 crc; ub4 lcrc; ub1 scratch[16]; --- 460,466 ---- */ static void check_crc(pb_file *pbf, const char *stream, ub4 usize) { ! ub4 crc=0; ub4 lcrc; ub1 scratch[16]; *************** static int cont_grep(regex_t *exp, regex *** 556,562 **** char *filename; char *str_stream; regmatch_t *match_array; ! regmatch_t *nl_offsets; if(pb_read(pbf, (file_header + 4), 26) != 26) { perror("read"); --- 570,576 ---- char *filename; char *str_stream; regmatch_t *match_array; ! regmatch_t *nl_offsets=0; if(pb_read(pbf, (file_header + 4), 26) != 26) { perror("read"); *************** static void jargrep(regex_t *exp, regex_ *** 632,637 **** --- 646,663 ---- } } + /* This is used to mark options with no short value. */ + #define LONG_OPT(Num) ((Num) + 128) + + #define OPT_HELP LONG_OPT (0) + + static const struct option option_vec[] = + { + { "help", no_argument, NULL, OPT_HELP }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, 0 } + }; + /* Funtion Name: main args: argc number of in coming args. *************** int main(int argc, char **argv) { *** 650,656 **** regex_t *nl_exp = NULL; char *regexpstr = NULL; ! while((c = getopt(argc, argv, "bce:insVw")) != -1) { switch(c) { case 'b': options |= JG_PRINT_BYTEOFFSET; --- 676,683 ---- regex_t *nl_exp = NULL; char *regexpstr = NULL; ! while((c = getopt_long(argc, argv, "bce:insVw", ! option_vec, NULL)) != -1) { switch(c) { case 'b': options |= JG_PRINT_BYTEOFFSET; *************** int main(int argc, char **argv) { *** 679,691 **** options |= JG_INVERT; break; case 'V': ! printf("%s\n", GVERSION); ! exit(0); case 'w': options |= JG_WORD_EXPRESSIONS; break; default: - fprintf(stderr, "Unknown option -%c\n", c); fprintf(stderr, Usage, argv[0]); exit(1); } --- 706,720 ---- options |= JG_INVERT; break; case 'V': ! version (); ! break; case 'w': options |= JG_WORD_EXPRESSIONS; break; + case OPT_HELP: + help(argv[0]); + break; default: fprintf(stderr, Usage, argv[0]); exit(1); } *************** int main(int argc, char **argv) { *** 726,728 **** --- 755,788 ---- return retval; } + + void help(const char *filename) + { + printf (Usage, filename); + printf ("\ + \n\ + Search files in a jar file for a pattern.\n\ + \n\ + -b print byte offset of match\n\ + -c print number of matches\n\ + -i compare case-insensitively\n\ + -n print line number of each match\n\ + -s suppress error messages\n\ + -w force PATTERN to match only whole words\n\ + -e PATTERN use PATTERN as regular exprssion\n\ + "); + + exit (0); + } + + void version () + { + printf("grepjar (%s) %s\n\n", PACKAGE, VERSION); + printf("Copyright 1999, 2000, 2001 Bryan Burns\n"); + printf("Copyright 2000 Cory Hollingsworth\n"); + printf("Copyright 2002 Free Software Foundation\n"); + printf("\ + This is free software; see the source for copying conditions. There is NO\n\ + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); + exit (0); + } diff -Nrc3pad gcc-3.0.4/fastjar/jargrep.h gcc-3.1/fastjar/jargrep.h *** gcc-3.0.4/fastjar/jargrep.h Sat Dec 9 03:08:23 2000 --- gcc-3.1/fastjar/jargrep.h Wed Jan 9 23:22:20 2002 *************** *** 1,5 **** --- 1,6 ---- /* jargrep.h - header file for jargrep utility + Copyright (C) 2002 Free Software Foundation Copyright (C) 2000 Cory Hollingsworth This program is free software; you can redistribute it and/or *************** *** 17,25 **** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - /*$Id: jargrep.h,v 1.1 2000/12/09 03:08:23 apbianco Exp $ - */ - #define JG_PRINT_BYTEOFFSET 0x00000001 #define JG_PRINT_COUNT 0x00000002 #define JG_IGNORE_CASE 0x00000004 --- 18,23 ---- *************** *** 27,31 **** #define JG_SUPRESS_ERROR 0x00000010 #define JG_INVERT 0x00000020 #define JG_WORD_EXPRESSIONS 0x00000040 - - #define GVERSION "jargrep version 0.1 (09/12/2000)" --- 25,27 ---- diff -Nrc3pad gcc-3.0.4/fastjar/jartool.c gcc-3.1/fastjar/jartool.c *** gcc-3.0.4/fastjar/jartool.c Thu Dec 28 21:47:37 2000 --- gcc-3.1/fastjar/jartool.c Mon Mar 18 11:08:59 2002 *************** *** 1,6 **** /* jartool.c - main functions for fastjar utility ! Copyright (C) 1999, 2000 Bryan Burns This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License --- 1,7 ---- /* jartool.c - main functions for fastjar utility ! Copyright (C) 2002 Free Software Foundation ! Copyright (C) 1999, 2000, 2001 Bryan Burns This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License *************** *** 17,25 **** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* $Id: jartool.c,v 1.4 2000/12/28 21:47:37 robertl Exp $ - $Log: jartool.c,v $ Revision 1.4 2000/12/28 21:47:37 robertl 2000-12-28 Robert Lipe --- 18,67 ---- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ! /* ! Revision 1.10 2002/01/03 04:57:56 rodrigc ! 2001-01-02 Craig Rodrigues ! ! PR bootstrap/5117 ! * configure.in (AC_CHECK_HEADERS): Check for stdlib.h. ! * Makefile.am: Move grepjar to bin_PROGRAMS. ! * config.h.in: Regenerated. ! * Makefile.in: Regenerated. ! * aclocal.m4: Regenerated. ! * jargrep.c: Eliminate some signed/unsigned and default ! uninitialized warnings. Use HAVE_STDLIB_H instead of ! STDC_HEADERS macro. ! * jartool.c: Likewise. ! * compress.c: Likewise. ! ! Revision 1.9 2001/10/12 00:49:42 bryce ! * jatool.c (extract_jar): Account for null termination when ! determining whether to expand "filename". ! ! Revision 1.8 2001/08/29 01:35:31 apbianco ! 2001-08-28 Alexandre Petit-Bianco ! ! * jartool.c (add_to_jar): Return 1 if `stat' initialy failed. ! Fixes PR java/3949. ! ! (http://gcc.gnu.org/ml/gcc-patches/2001-08/msg01641.html) ! ! Revision 1.7 2001/08/27 23:09:37 tromey ! * jartool.c (jarfile): Remove length limitation. ! (main): Use jt_strdup when initializing jarfile. ! ! Revision 1.6 2001/07/04 18:33:53 tromey ! Modified from patch by Julian Hall : ! * jartool.c (errno): Conditionally declare. ! (O_BINARY): Conditionally define. ! (main): Use open, not creat. Use O_BINARY everywhere. ! (make_manifest): Use O_BINARY. ! (add_to_jar): Likewise. ! ! Revision 1.5 2001/05/03 21:40:47 danglin ! * jartool.c (jt_strdup): New function. ! (get_next_arg): Use jt_strdup instead of strdup. Revision 1.4 2000/12/28 21:47:37 robertl 2000-12-28 Robert Lipe *************** *** 152,158 **** #include ! #ifdef STDC_HEADERS #include #endif --- 194,200 ---- #include ! #ifdef HAVE_STDLIB_H #include #endif *************** *** 189,194 **** --- 231,238 ---- #include #endif + #include + #include "jartool.h" #include "zipfile.h" #include "dostime.h" *************** *** 206,216 **** #endif ! static char version_string[] = VERSION; ! extern int errno; void usage(const char*); void add_entry(struct zipentry *); void init_headers(void); --- 250,266 ---- #endif ! #ifndef errno extern int errno; + #endif + + #ifndef O_BINARY + #define O_BINARY 0 + #endif void usage(const char*); + void help(const char *); + void version(void); void add_entry(struct zipentry *); void init_headers(void); *************** int create_central_header(int); *** 223,228 **** --- 273,280 ---- int make_manifest(int, const char*); static void init_args(char **, int); static char *get_next_arg (void); + static char *jt_strdup (char*); + static void expand_options (int *argcp, char ***argvp); /* global variables */ ub1 file_header[30]; *************** ub1 data_descriptor[16]; *** 230,236 **** int do_compress; int seekable; int verbose; ! char jarfile[256]; /* If non zero, then don't recurse in directory. Instead, add the directory entry and relie on an explicit list of files to populate --- 282,288 ---- int do_compress; int seekable; int verbose; ! char *jarfile; /* If non zero, then don't recurse in directory. Instead, add the directory entry and relie on an explicit list of files to populate *************** zipentry *ziptail; /* tail of the linked *** 246,264 **** int number_of_entries; /* number of entries in the linked list */ int main(int argc, char **argv){ ! char mfile[256]; int action = ACTION_NONE; int manifest = TRUE; ! int manifest_file = FALSE; ! int file = FALSE; ! int file_first = FALSE; ! int i, j; int jarfd = -1; do_compress = TRUE; verbose = FALSE; --- 298,334 ---- int number_of_entries; /* number of entries in the linked list */ + /* This is used to mark options with no short value. */ + #define LONG_OPT(Num) ((Num) + 128) + + #define OPT_HELP LONG_OPT (0) + + /* This holds all options. */ + #define OPTION_STRING "-ctxuvVf:m:C:0ME@" + + static const struct option options[] = + { + { "help", no_argument, NULL, OPT_HELP }, + { "version", no_argument, NULL, 'V' }, + { NULL, no_argument, NULL, 0 } + }; + int main(int argc, char **argv){ ! char *mfile = NULL; int action = ACTION_NONE; int manifest = TRUE; ! int opt; ! int j; int jarfd = -1; + /* These are used to collect file names and `-C' options for the + second pass through the command line. */ + int new_argc; + char **new_argv; + do_compress = TRUE; verbose = FALSE; *************** int main(int argc, char **argv){ *** 271,278 **** j = strlen(argv[1]); ! for(i = 0; i < j; i++){ ! switch(argv[1][i]){ case 'c': action = ACTION_CREATE; break; --- 341,360 ---- j = strlen(argv[1]); ! new_argc = 0; ! new_argv = (char **) malloc (argc * sizeof (char *)); ! ! expand_options (&argc, &argv); ! while ((opt = getopt_long (argc, argv, OPTION_STRING, ! options, NULL)) != -1) { ! switch(opt){ ! case 'C': ! new_argv[new_argc++] = (char *) "-C"; ! /* ... fall through ... */ ! case 1: ! /* File name or unparsed option, due to RETURN_IN_ORDER. */ ! new_argv[new_argc++] = optarg; ! break; case 'c': action = ACTION_CREATE; break; *************** int main(int argc, char **argv){ *** 289,305 **** verbose = TRUE; break; case 'V': ! printf("%s\n", version_string); exit(0); case 'f': ! file = TRUE; ! if(!manifest_file) ! file_first = TRUE; ! else ! file_first = FALSE; break; case 'm': ! manifest_file = TRUE; break; case '0': do_compress = FALSE; --- 371,383 ---- verbose = TRUE; break; case 'V': ! version(); exit(0); case 'f': ! jarfile = optarg; break; case 'm': ! mfile = optarg; break; case '0': do_compress = FALSE; *************** int main(int argc, char **argv){ *** 307,314 **** case 'M': manifest = FALSE; break; ! case '-': break; /* The following options aren't supported by the original jar tool. */ case 'E': use_explicit_list_only = TRUE; --- 385,395 ---- case 'M': manifest = FALSE; break; ! ! case OPT_HELP: ! help(argv[0]); break; + /* The following options aren't supported by the original jar tool. */ case 'E': use_explicit_list_only = TRUE; *************** int main(int argc, char **argv){ *** 317,332 **** read_names_from_stdin = TRUE; break; default: - fprintf(stderr, "Illegal option: %c\n", argv[1][i]); usage(argv[0]); } } if(action == ACTION_NONE){ fprintf(stderr, "One of options -{ctxu} must be specified.\n"); usage(argv[0]); } /* Verify unsupported combinations and warn of the use of non standard features */ if(verbose && use_explicit_list_only) --- 398,423 ---- read_names_from_stdin = TRUE; break; default: usage(argv[0]); } } + /* We might have seen `--'. In this case we want to make sure that + all following options are handled as file names. */ + while (optind < argc) + new_argv[new_argc++] = argv[optind++]; + new_argv[new_argc] = NULL; + if(action == ACTION_NONE){ fprintf(stderr, "One of options -{ctxu} must be specified.\n"); usage(argv[0]); } + if(action == ACTION_UPDATE){ + fprintf(stderr, "%s: `-u' mode unimplemented.\n", argv[0]); + exit(1); + } + /* Verify unsupported combinations and warn of the use of non standard features */ if(verbose && use_explicit_list_only) *************** int main(int argc, char **argv){ *** 339,372 **** usage(argv[0]); } - i = 2; - - /* get the jarfile and manifest file (if any) */ - if(file && file_first){ - if(i >= argc) - usage(argv[0]); - - strncpy(jarfile, argv[i++], 256); - } - if(manifest_file){ - if(i >= argc) - usage(argv[0]); - - strncpy(mfile, argv[i++], 256); - } - - if(file && !file_first){ - if(i >= argc) - usage(argv[0]); - - strncpy(jarfile, argv[i++], 256); - } - /* create the jarfile */ if(action == ACTION_CREATE){ ! if(file){ ! jarfd = creat(jarfile, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); ! if(jarfd < 0){ fprintf(stderr, "Error opening %s for writing!\n", jarfile); perror(jarfile); --- 430,441 ---- usage(argv[0]); } /* create the jarfile */ if(action == ACTION_CREATE){ ! if(jarfile){ ! jarfd = open(jarfile, O_CREAT | O_BINARY | O_WRONLY | O_TRUNC, ! S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); ! if(jarfd < 0){ fprintf(stderr, "Error opening %s for writing!\n", jarfile); perror(jarfile); *************** int main(int argc, char **argv){ *** 389,396 **** } } else if(action == ACTION_LIST || action == ACTION_EXTRACT){ ! if(file){ ! jarfd = open(jarfile, O_RDONLY); if(jarfd < 0){ fprintf(stderr, "Error opening %s for reading!\n", jarfile); --- 458,465 ---- } } else if(action == ACTION_LIST || action == ACTION_EXTRACT){ ! if(jarfile){ ! jarfd = open(jarfile, O_RDONLY | O_BINARY); if(jarfd < 0){ fprintf(stderr, "Error opening %s for reading!\n", jarfile); *************** int main(int argc, char **argv){ *** 411,418 **** const char *arg; init_headers(); ! if((action == ACTION_UPDATE) && file) { ! if((jarfd = open(jarfile, O_RDWR)) < 0) { fprintf(stderr, "Error opening %s for reading!\n", jarfile); perror(jarfile); exit(1); --- 480,487 ---- const char *arg; init_headers(); ! if((action == ACTION_UPDATE) && jarfile) { ! if((jarfd = open(jarfile, O_RDWR | O_BINARY)) < 0) { fprintf(stderr, "Error opening %s for reading!\n", jarfile); perror(jarfile); exit(1); *************** int main(int argc, char **argv){ *** 424,435 **** /* Add the META-INF/ directory and the manifest */ ! if(manifest && manifest_file) make_manifest(jarfd, mfile); else if(manifest) make_manifest(jarfd, NULL); ! init_args (argv, i); /* now we add the files to the archive */ while ((arg = get_next_arg ())){ --- 493,504 ---- /* Add the META-INF/ directory and the manifest */ ! if(manifest && mfile) make_manifest(jarfd, mfile); else if(manifest) make_manifest(jarfd, NULL); ! init_args (new_argv, 0); /* now we add the files to the archive */ while ((arg = get_next_arg ())){ *************** int main(int argc, char **argv){ *** 459,467 **** fprintf(stderr, "Error closing jar archive!\n"); } } else if(action == ACTION_LIST){ ! list_jar(jarfd, &argv[i], (argc - i)); } else if(action == ACTION_EXTRACT){ ! extract_jar(jarfd, &argv[i], (argc - i)); } exit(0); --- 528,536 ---- fprintf(stderr, "Error closing jar archive!\n"); } } else if(action == ACTION_LIST){ ! list_jar(jarfd, &new_argv[0], new_argc); } else if(action == ACTION_EXTRACT){ ! extract_jar(jarfd, &new_argv[0], new_argc); } exit(0); *************** get_next_arg () *** 536,542 **** if (pos) { s [pos] = '\0'; ! return strdup (s); } else return NULL; --- 605,611 ---- if (pos) { s [pos] = '\0'; ! return jt_strdup (s); } else return NULL; *************** int make_manifest(int jfd, const char *m *** 723,729 **** exit(1); } ! mfd = open(mf_name, O_RDONLY); if(mfd < 0){ fprintf(stderr, "Error opening %s.\n", mf_name); --- 792,798 ---- exit(1); } ! mfd = open(mf_name, O_RDONLY | O_BINARY); if(mfd < 0){ fprintf(stderr, "Error opening %s.\n", mf_name); *************** int add_to_jar(int fd, const char *new_d *** 779,784 **** --- 848,854 ---- if(stat_return == -1){ perror(file); + return 1; } else if(S_ISDIR(statbuf.st_mode)){ char *fullname; char *t_ptr; *************** int add_to_jar(int fd, const char *new_d *** 869,875 **** } else if(S_ISREG(statbuf.st_mode)){ int add_fd; ! add_fd = open(file, O_RDONLY); if(add_fd < 0){ fprintf(stderr, "Error opening %s.\n", file); return 0; --- 939,945 ---- } else if(S_ISREG(statbuf.st_mode)){ int add_fd; ! add_fd = open(file, O_RDONLY | O_BINARY); if(add_fd < 0){ fprintf(stderr, "Error opening %s.\n", file); return 0; *************** int extract_jar(int fd, char **files, in *** 1277,1283 **** #endif } ! if(filename_len < fnlen){ if(filename != NULL) free(filename); --- 1347,1353 ---- #endif } ! if(filename_len < fnlen + 1){ if(filename != NULL) free(filename); *************** int extract_jar(int fd, char **files, in *** 1411,1417 **** ze.crc = crc32(ze.crc, NULL, 0); /* initialize the crc */ ! while(out_a < csize){ rdamt = (in_a > RDSZ ? RDSZ : in_a); if(pb_read(&pbf, rd_buff, rdamt) != rdamt){ perror("read"); --- 1481,1487 ---- ze.crc = crc32(ze.crc, NULL, 0); /* initialize the crc */ ! while(out_a < (int)csize){ rdamt = (in_a > RDSZ ? RDSZ : in_a); if(pb_read(&pbf, rd_buff, rdamt) != rdamt){ perror("read"); *************** int list_jar(int fd, char **files, int f *** 1554,1560 **** /* printf("Central header offset = %d\n", tmp); */ ! if(lseek(fd, tmp, SEEK_SET) != tmp){ perror("lseek"); exit(1); } --- 1624,1630 ---- /* printf("Central header offset = %d\n", tmp); */ ! if(lseek(fd, tmp, SEEK_SET) != (int)tmp){ perror("lseek"); exit(1); } *************** int consume(pb_file *pbf, int amt){ *** 1793,1818 **** } void usage(const char *filename){ ! fprintf(stderr, "\ Usage: %s {ctxuV}[vfm0ME@] [jar-file] [manifest-file] [-C dir] files ...\n\ ! Options\n\ ! -c create new archive\n\ ! -t list table of contents for archive\n\ ! -x extract named (or all) files from archive\n\ ", filename); ! fprintf(stderr, "\ ! -u update existing archive\n\ ! -V display version information\n\ ! -v generate verbose output on standard output\n\ ! -f specify archive file name\n\ ! -m include manifest information from specified manifest file\n\ ! -0 store only; use no ZIP compression\n\ ! -M Do not create a manifest file for the entries\n\ ! -C change to the specified directory and include the following file\n\ ! -E don't include the files found in a directory\n\ ! -@ Read names from stdin\n\ "); ! fprintf(stderr, "\ If any file is a directory then it is processed recursively.\n\ The manifest file name and the archive file name needs to be specified\n\ in the same order the 'm' and 'f' flags are specified.\n\ --- 1863,1909 ---- } void usage(const char *filename){ ! fprintf(stderr, "Try `%s --help' for more information.\n", filename); ! exit (1); ! } ! ! void version () ! { ! printf("jar (%s) %s\n\n", PACKAGE, VERSION); ! printf("Copyright 1999, 2000, 2001 Bryan Burns\n"); ! printf("Copyright 2002 Free Software Foundation\n"); ! printf("\ ! This is free software; see the source for copying conditions. There is NO\n\ ! warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); ! exit (0); ! } ! ! void help(const char *filename) ! { ! printf("\ Usage: %s {ctxuV}[vfm0ME@] [jar-file] [manifest-file] [-C dir] files ...\n\ ! \n\ ! Store many files together in a single `jar' file.\n\ ! \n\ ! -c create new archive\n\ ! -t list table of contents for archive\n\ ! -x extract named (or all) files from archive\n\ ! -u update existing archive\n\ ", filename); ! printf("\n\ ! -@ read names from stdin\n\ ! -0 store only; use no ZIP compression\n\ ! -C DIR FILE change to the specified directory and include\n\ ! the following file\n\ ! -E don't include the files found in a directory\n\ ! -f FILE specify archive file name\n\ ! --help print this help, then exit\n\ ! -m FILE include manifest information from specified manifest file\n\ ! -M Do not create a manifest file for the entries\n\ ! -v generate verbose output on standard output\n\ ! -V, --version display version information\n\ "); ! printf("\n\ If any file is a directory then it is processed recursively.\n\ The manifest file name and the archive file name needs to be specified\n\ in the same order the 'm' and 'f' flags are specified.\n\ *************** Example 2: use an existing manifest file *** 1824,1828 **** jar cvfm classes.jar mymanifest -C foo/ .\n\ "); ! exit(1); } --- 1915,1997 ---- jar cvfm classes.jar mymanifest -C foo/ .\n\ "); ! exit(0); ! } ! ! static char * ! jt_strdup(s) ! char *s; ! { ! char *result = (char*)malloc(strlen(s) + 1); ! if (result == (char*)0) ! return (char*)0; ! strcpy(result, s); ! return result; ! } ! ! /* Convert "tar-style" first argument to a form expected by getopt. ! This idea and the code comes from GNU tar. This can allocate a new ! argument vector. This might leak some memory, but we don't care. */ ! static void ! expand_options (int *argcp, char ***argvp) ! { ! int argc = *argcp; ! char **argv = *argvp; ! ! /* Accept arguments with a leading "-" (eg "-cvf"), but don't do expansion ! if a long argument (like "--help") is detected. */ ! if (argc > 1 && argv[1][1] != '-') ! { ! char buf[3]; ! char **new_argv; ! int new_argc; ! int args_to_expand; ! char *p; ! char **in, **out; ! ! buf[0] = '-'; ! buf[2] = '\0'; ! ! args_to_expand = strlen (argv[1]); ! if (argv[1][0] == '-') ! --args_to_expand; ! ! new_argc = argc - 1 + args_to_expand; ! new_argv = (char **) malloc (new_argc * sizeof (char *)); ! in = argv; ! out = new_argv; ! ! *out++ = *in++; ! p = *in++; ! if (*p == '-') ! p++; ! while (*p != '\0') ! { ! char *opt; ! buf[1] = *p; ! *out++ = jt_strdup (buf); ! /* If the option takes an argument, move the next argument ! to just after this option. */ ! opt = strchr (OPTION_STRING, *p); ! if (opt && opt[1] == ':') ! { ! if (in < argv + argc) ! *out++ = *in++; ! else ! { ! fprintf(stderr, "%s: option `%s' requires an argument.\n", ! argv[0], buf); ! usage(argv[0]); ! } ! } ! ++p; ! } ! ! /* Copy remaining options. */ ! while (in < argv + argc) ! *out++ = *in++; ! ! *argcp = new_argc; ! *argvp = new_argv; ! } } diff -Nrc3pad gcc-3.0.4/fastjar/pushback.c gcc-3.1/fastjar/pushback.c *** gcc-3.0.4/fastjar/pushback.c Thu Dec 14 18:45:35 2000 --- gcc-3.1/fastjar/pushback.c Thu Jan 3 04:57:56 2002 *************** *** 1,6 **** ! /* $Id: pushback.c,v 1.2 2000/12/14 18:45:35 ghazi Exp $ $Log: pushback.c,v $ Revision 1.2 2000/12/14 18:45:35 ghazi Warning fixes: --- 1,21 ---- ! /* $Id: pushback.c,v 1.3 2002/01/03 04:57:56 rodrigc Exp $ $Log: pushback.c,v $ + Revision 1.3 2002/01/03 04:57:56 rodrigc + 2001-01-02 Craig Rodrigues + + PR bootstrap/5117 + * configure.in (AC_CHECK_HEADERS): Check for stdlib.h. + * Makefile.am: Move grepjar to bin_PROGRAMS. + * config.h.in: Regenerated. + * Makefile.in: Regenerated. + * aclocal.m4: Regenerated. + * jargrep.c: Eliminate some signed/unsigned and default + uninitialized warnings. Use HAVE_STDLIB_H instead of + STDC_HEADERS macro. + * jartool.c: Likewise. + * compress.c: Likewise. + Revision 1.2 2000/12/14 18:45:35 ghazi Warning fixes: *************** int pb_push(pb_file *pbf, void *buff, in *** 91,97 **** #endif /* determine how much we can take */ ! if((RDSZ - pbf->buff_amt) < amt) in_amt = RDSZ - pbf->buff_amt; else in_amt = amt; --- 106,112 ---- #endif /* determine how much we can take */ ! if((int)(RDSZ - pbf->buff_amt) < amt) in_amt = RDSZ - pbf->buff_amt; else in_amt = amt; *************** int pb_read(pb_file *pbf, void *buff, in *** 138,144 **** #endif /* calculate how much we can actually give the caller */ ! if( (amt - out_amt) < pbf->buff_amt ) tmp = (amt - out_amt); else tmp = pbf->buff_amt; --- 153,159 ---- #endif /* calculate how much we can actually give the caller */ ! if( (amt - out_amt) < (int)pbf->buff_amt ) tmp = (amt - out_amt); else tmp = pbf->buff_amt; diff -Nrc3pad gcc-3.0.4/gcc/java/.cvsignore gcc-3.1/gcc/java/.cvsignore *** gcc-3.0.4/gcc/java/.cvsignore Wed Jan 17 23:14:11 2001 --- gcc-3.1/gcc/java/.cvsignore Mon Apr 8 18:27:31 2002 *************** *** 1,3 **** --- 1,10 ---- parse.c parse-scan.c gcj.info* + gcj.1 + gcjh.1 + jv-scan.1 + jcf-dump.1 + gij.1 + jv-convert.1 + rmic.1 rmiregistry.1 diff -Nrc3pad gcc-3.0.4/gcc/java/ChangeLog gcc-3.1/gcc/java/ChangeLog *** gcc-3.0.4/gcc/java/ChangeLog Wed Feb 20 18:42:21 2002 --- gcc-3.1/gcc/java/ChangeLog Wed May 15 02:23:16 2002 *************** *** 1,19 **** ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2001-12-20 Release Manager ! * GCC 3.0.3 Released. 2001-11-30 Bryce McKinlay * class.c (add_interface_do): Set BINFO_VPTR_FIELD. 2001-11-27 Rainer Orth * jvspec.c (jvgenmain_spec): Cannot use %umain, breaks --- 1,974 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-04-24 Tom Tromey ! For PR java/6425: ! * parse.y (qualify_ambiguous_name) [case CALL_EXPR]: Always choose ! EXPR_WFL_QUALIFICATION of qual_wfl. ! ! 2002-04-23 Per Bothner ! ! * expr.c (PRE_JSR): Call NOTE_LABEL for return address. ! * java-tree.h (BCODE_RETURN_TARGET): Removed - never set. ! (BCODE_TARGET): Remove BCODE_RETURN_TARGET. ! ! Tue Apr 23 14:31:23 2002 Anthony Green ! ! * gcj.texi (Invoking rmiregistry): Fix rmiregistry command ! synopsis. ! ! 2002-04-23 Tom Tromey ! ! For PR java/6314: ! * jvspec.c (lang_specific_driver): Use --resource, not -R. Also ! recognize `-fcompile-resource='. ! * gcj.texi (Invoking gcj): Use --resource, not -R. Expanded text ! a bit. ! ! 2002-04-22 Alexandre Petit-Bianco ! ! * jcf-parse.c: (yyparse): Don't prepend "./" to relative ! paths. Fixes PR java/2791. ! ! 2002-04-19 Andrew Haley ! ! * jcf-write.c (push_long_const): lo, hi: New variables. ! Use rshift_double to extract the high part of a 64-bit long. ! Use WORD_TO_INT to extract the low part. ! ! * jcf-parse.c (get_constant): CONSTANT_Integer: Use an unsigned ! HOST_WIDE_INT for num. Use JPOOL_UINT to get it. ! CONSTANT_Double: Use JPOOL_UINT to get both halves of a double. ! ! 2002-04-18 Bryce McKinlay ! ! * class.c (make_class_data): Set DECL_ALIGN on static class data, ! for hash synchronization. ! * expr.c (java_expand_expr): Set DECL_ALIGN on static array objects. ! * decl.c (java_init_decl_processing): Don't set TYPE_ALIGN for ! class_type_node. ! ! 2002-04-16 Mark Wielaard ! ! * jcf-write.c (generate_bytecode_insns): Only write const_0 if not ! negative zero. ! ! 2002-04-16 Bryce McKinlay ! ! Fix for PR java/6294: ! * parse.h (INNER_INTERFACE_MODIFIERS): Allow ACC_PRIVATE for inner ! interfaces. ! ! 2002-04-15 Bryce McKinlay ! ! Fix for PR java/6085: ! * parse.y (patch_method_invocation): Always use build_access_to_thisn ! to get enclosing "this" argument for inner-class constructor ! invocation. Pass correct arguments to build_access_to_thisn. ! ! 2002-04-10 Andreas Jaeger ! ! * gcj.texi (Input Options): Fix extdirs patch. ! ! 2002-04-10 Anthony Green ! ! * jcf-path.c (jcf_path_init) : Clean up local extdirs declaration. ! ! 2002-04-09 Anthony Green ! ! * gcj.texi (Input Options): Add --extdirs documentation. ! * jcf-dump.c (OPT_extdirs): New macro. ! (options): Add extdirs option. ! (help): Describe --extdirs. ! (main): Handle OPT_extdirs. ! * gjavah.c (OPT_extdirs): New macro. ! (options): Add extdirs option. ! (help): Describe --extdirs. ! (main): Handle OPT_extdirs. ! * jcf-path.c (jcf_path_init): Add extdirs support. ! (jcf_path_extdirs_arg): New function. ! (extensions): New variable to hold extensions path entries. ! * jvspec.c: Remove -fextdirs= when compiling main(). ! * lang.c (java_decode_option): Handle -fextdirs=. ! * jcf.h (jcf_path_extdirs_arg): Declare new function. ! * Make-lang.in: Compile jcf-path with version info for use in ! identifying the appropriate libgcj.jar. ! ! 2002-04-08 Tom Tromey ! ! For PR libgcj/5303: ! * .cvsignore: Added rmic.1 and rmiregistry.1. ! * gcj.texi (Top): Link to new nodes. ! (Invoking rmic): New node. ! (Invoking rmiregistry): Likewise. ! * Make-lang.in (java.generated-manpages): Added rmic.1 and ! rmiregistry.1. ! (java.maintainer-clean): Likewise. ! ($(srcdir)/java/rmic.1): New target. ! ($(srcdir)/java/rmiregistry.1): Likewise. ! (java.install-man): Handle rmic.1 and rmiregistry.1. ! ! 2002-04-08 Bryce McKinlay ! ! * gcj.texi (Invocation): Update JvAttachCurrentThread documentation. ! Add note about handling uncaught exceptions. Add an exception handler ! to example. ! ! 2002-04-08 Bryce McKinlay ! ! * parse.y (resolve_qualified_expression_name): Clear "from_super" flag ! after using it to patch CALL_EXPR. ! ! 2002-04-08 Bryce McKinlay ! ! * gcj.texi (Invocation): Document CNI invocation API. ! ! 2002-04-05 Nic Ferrier ! ! * gcj.texi: @code{gcj} becomes @command{gcj}. ! @code{gcc} becomes @command{gcc}. ! GcjRaw changed to gnu.gcc.RawData. ! ! 2002-03-29 Martin Kahlert ! ! * parse.y (do_resolve_class): Fix infinite recursion. ! ! 2002-03-29 Tom Tromey ! ! * parse.y (check_inner_circular_reference): Ignore incomplete ! types. ! ! 2002-03-29 Martin Kahlert ! ! * lex.c (java_new_lexer): Alias "646" to DEFAULT_ENCODING. ! ! 2002-03-28 Tom Tromey ! ! * except.c (expand_end_java_handler): If the handler type is NULL, ! use java.lang.Throwable. Fixes PR java/5986. ! ! 2002-03-28 Alexandre Petit-Bianco ! ! Fix for PR java/4715: ! * jcf-parse.c (parse_source_file_3): New function. ! (read_class): Call it. ! (java_parse_file): Likewise. ! ! 2002-03-28 Bryce McKinlay ! ! * parse.y (resolve_package): Initialize "decl". ! (lookup_package_type): Remove unused function. ! ! 2002-03-28 Bryce McKinlay ! ! Fix for PR java/5993: ! * parse.y (resolve_package): Return the decl if resolution was ! successful. Don't special case "java.lang" and "java.lang.reflect" ! packages. Set type_name to the merged identifier. ! (resolved_qualified_expression_name): Print error using "name" if ! resolve_package returns NULL_TREE. ! ! 2002-03-27 Tom Tromey ! ! * expr.c (expand_invoke): Don't generate null pointer check if ! we're calling . ! ! 2002-03-27 Bryce McKinlay ! ! Fix for PR java/5850: ! * parse.y (lookup_field_wrapper): Call itself recursively for enclosing ! context if nothing was found in the current context. ! * expr.c (lookup_field): Don't look in enclosing contexts. ! ! 2002-03-26 Tom Tromey ! ! Fix for PR java/5942: ! * parse.y (init_src_parse): Added sanity check. ! * parse.h (struct parser_ctxt) [modifier_ctx]: Array has 12 ! elements, not 11. ! ! 2002-03-22 Mark Wielaard ! ! Fix for PR java/5368: ! * parse.y (resolve_qualified_expression_name): Use decl not field_decl ! when printing error message. ! ! 2002-03-22 Tom Tromey ! Andrew Haley ! ! * expr.c (build_field_ref): Don't build a check if the field is a ! member of `this'. ! ! 2002-03-21 Eric Blake ! ! Fix for PR java/6026: ! * lex.c (java_lex): Fix parsing of consecutive floats. ! ! 2002-03-21 Tom Tromey ! ! * parse.y (build_access_to_thisn): Stop when FROM is not an inner ! class. ! ! 2002-03-18 Alexandre Petit-Bianco ! ! * builtins.c (define_builtin): Do nothing if `type' is null. ! Fixes PR java/5876. ! ! 2002-03-18 Bryce McKinlay ! ! * parse.y (parser_check_super_interface): Fix error message ! grammar/order. ! ! 2002-03-17 Kaveh R. Ghazi ! ! * jcf-parse.c (get_constant): Delete unused variables. ! ! 2002-03-16 Bryce McKinlay ! ! * parse.y (craft_constructor): Return the constructor decl. ! (java_expand_classes): Update comments. ! (lookup_method_invoke): Call fix_constructors immediately for ! anonymous class. Fixes PR java/5935. ! ! 2002-03-15 Anthony Green ! ! * jcf-parse.c (yyparse): Don't emit class registration ! constructor when compiling resource files. ! ! 2002-03-12 Tom Tromey ! ! * jcf-parse.c (get_constant) [CONSTANT_String]: String values are ! UTF-8, not UCS-2. Fixes PR java/5923. ! ! 2002-03-12 Tom Tromey ! ! * parse.y (qualify_ambiguous_name): Handle case where QUAL_WFL is ! a call_expr wrapped in a convert. Fixes PR java/5848. ! ! 2002-03-12 Bryce McKinlay ! ! * jcf-write.c (write_classfile): Improve error strings. ! ! 2002-03-11 Eric Blake ! ! * lex.c: Adjust comments to GNU standards. ! ! 2002-03-11 Eric Blake ! ! Fix for PR java/5902: ! * lex.c (java_lex): Fix parsing of literals. ! ! 2002-03-11 Bryce McKinlay ! ! * parse.y (patch_assignment): Wrap the right-hand-side with a save_expr ! to prevent it getting evaluated twice in the store checking case. ! * expr.c (build_java_arraystore_check): Unwrap SAVE_EXPR's when ! examining OBJECT. ! ! 2002-03-09 Bryce McKinlay ! ! * decl.c (java_init_decl_processing): Make sure class_type_node ! alignment is not less than 64 bits if hash synchronization is enabled. ! ! 2002-03-08 Per Bothner ! ! * parse.y (java_complete_lhs): Check if patch_assignment ! returned an error-mark. ! ! * parse.y (try_builtin_assignconv): Don't special-case zero. ! ! 2002-03-08 Per Bothner ! ! Fix for PR java/5812. ! * expr.c (build_java_jsr): Take pc arguments, and do lookup_label ! here instead of in JSR macro. Likewise with load_type_state call. ! Do the latter on if the return_pc has been verified (the jsr returns). ! (JSR): Now just call build_java_jsr. ! ! 2002-03-05 David Billinghurst ! ! * builtins.c(cos_builtin): method_return_type ATTRIBUTE_UNUSED ! * builtins.c(sin_builtin): Likewise ! * builtins.c(sqrt_builtin): Likewise ! ! 2002-03-02 Per Bothner ! ! Make --CLASSPATH by a synonym for --classpath and -classpath. ! Implement --bootclasspath. ! * jcf-path.c (classpath_u): Rename static variable to classpath_user. ! (classpath_l): Remove. ! (jcf_path_CLASSPATH_arg): Remove. ! (jcf_path_bootclasspath_arg): New function. ! (jcf_path_seal): Simplify accordingly. ! ! * jcf.h (jcf_path_bootclasspath_arg): New declarations. ! (jcf_path_CLASSPATH): Remove declaration. ! * jvspec.c (jvgenmain_spec): Also accept -fbootclasspath*. ! (lang_specific_driver): Translate -bootclasspath. ! * lang-options.h: Add --bootclasspath. Update --CLASSPATH. ! * lang.c (decode_lang_options): Do jcf_path_init first. ! Handle -fCLASSPATH same as -fclasspath. Also process -fbootclasspath. ! * gjavah.c: Also handle --bootclasspath. ! Handle --CLASSPATH as a synonum for --classpath. ! * jcf-dump.c: Likewise. ! ! "." is not part of system path, but is the default for --classpath. ! * jcf-path.c (jcf_path_init): Don't add "." to sys_dirs. ! (jcf_path_seal): Add "." if no CLASSPATH specified. ! ! * gcj.texi: Document changes. ! ! 2002-03-01 Bryce McKinlay ! ! * expr.c (build_java_arraystore_check): Fix formatting. ! ! 2002-02-28 Alexandre Petit-Bianco ! ! Fix for PR java/5758, java/5632: ! * jcf-parse.c (load_class): Renamed local variable, consider `.' an ! inner-class separator too. ! * parse.y (do_resolve_class): New local `decl_result.' ! Progressively build a name for what can have been loaded. ! ! 2002-02-28 Bryce McKinlay ! ! * expr.c (java_array_data_offset): Removed function. ! (JAVA_ARRAY_LENGTH_OFFSET): Removed macro. ! (build_java_array_length_access): Obtain "length" value using a ! COMPONENT_REF, instead of INDIRECT_REF and arithmetic. ! (build_java_arrayaccess): Correct comment. Access "data" using a ! COMPONENT_REF, and return an ARRAY_REF instead of an INDIRECT_REF. ! (build_java_arraystore_check): New function. ! (expand_java_arraystore): Use build_java_arraystore_check. ! * parse.y (patch_assignment): Simplify code to insert a store check ! when lvalue is an ARRAY_REF. Use build_java_arraystore_check. ! * check-init.c (check_init): Update to reflect that an array length ! access is now a COMPONENT_REF. ! * gcj.texi (Code Generation): Improve documentation of ! -fno-bounds-check. Add documentation for -fno-store-check. ! * java-tree.h (flag_store_check): Declare. ! (build_java_arraystore_check): Declare. ! * lang.c (flag_store_check): Initialize to 1. ! (lang_f_options): Add store-check option. ! * jvspec.c: Don't pass store-check option to jvgenmain. ! * lang-options.h: Add help string for -fno-store-check. ! ! 2002-02-22 Tom Tromey ! ! Fix for PR java/2369: ! * jvspec.c (verify_class_name): New function. ! (lang_specific_driver): Call it. ! (JAVA_START_CHAR_P): New macro. ! (JAVA_PART_CHAR_P): Likewise. ! ! 2002-02-22 Per Bothner ! ! * class.c: Change vtable to be more compatible with g++ v3 abi. ! (get_dispatch_table): Prepend offset-to-top (always 0) and ! type_info pointer (currently unimplemented hence NULL) to vtable. ! Specifically, prepend offset-to-top and typeinfo ptr (currently null). ! (make_class_data): Variable dtable_start_offset is sizeof 2 pointers. ! Adjust vtable pointers by dtable_start_offse - i.e. skip new words. ! (build_dtable_decl): Add declarations for new fields. ! ! 2002-02-20 Per Bothner ! ! * parse.y (patch_method_invocation): Set CAN_COMPLETE_NORMALLY on call ! to finit$ (otherwise generate_bytecode_insns drops it). However, we ! don't need to set it on the COMPOUND_EXPR - the caller does that. ! ! 2002-02-20 Nic Ferrier ! ! * gcj.texi: Option `--classpath' becomes `--CLASSPATH.'Option ! `--CLASSPATH' becomes `--classpath.' ! * gjavah.c: Likewise. ! * jcf-dump.c: Likewise. ! * lang-options.h: Likewise. ! * lang.c: Likewise. ! * jcf-path.c: Updated comment. ! (jcf_path_classpath_arg): Renamed `jcf_path_CLASSPATH_arg.' ! (jcf_path_CLASSPATH_arg): Renamed `jcf_path_classpath_arg.' ! * jcf.h (jcf_path_CLASSPATH_arg): Ditto. ! (jcf_path_CLASSPATH_arg): Ditto. ! (classpath_u): Updated leading comment. ! ! 2002-02-20 Per Bothner ! ! * builtins.c (check_for_builtin): New function. ! (build_call_or_builtin): Remove. ! * java-tree.h: Update accordingly. ! * expr.c (expand_invoke): Use build + check_for_builtin instead ! of build_call_or_builtin. ! * parse.y (patch_invoke): Likewise. This avoids needlessly creating ! a new CALL_EXPR node, which means we don't lose the CALL_USING_SUPER ! flag (which had caused jcf-write to incorrectly emit invokevirtual). ! ! 2002-02-17 Tom Tromey ! ! * java-tree.h (TYPE_STRICTFP): New macro. ! (struct lang_type) [strictfp]: New field. ! (CLASS_STRICTFP): New macro. ! (METHOD_STRICTFP): New macro. ! (struct lang_decl) [strictfp]: New field. ! * parse.y (method_header): Disallow strictfp constructor or ! abstract method. ! (STRICT_TK): Move before MODIFIER_TK. ! * parse.h (CLASS_MODIFIERS): Added ACC_STRICT. ! (METHOD_MODIFIERS): Likewise. ! (INTERFACE_MODIFIERS): Likewise. ! * jcf-write.c (get_access_flags): Likewise. ! * class.c (set_class_decl_access_flags): Recognize ACC_STRICT. ! (add_method_1): Likewise. ! (get_access_flags_from_decl): Likewise. ! * jcf-dump.c (print_access_flags): Print in standard order. Also, ! recognize strictfp flag. ! * jcf.h (ACC_STRICT): New define. ! ! 2002-02-12 David Billinghurst ! ! * class.c(build_utf8_ref): Move declaration of decl_size ! ! 2002-02-07 Tom Tromey ! ! * gcj.texi (Input Options): --CLASSPATH does not suppress system ! path. ! ! 2002-02-04 Anthony Green ! ! * class.c (build_utf8_ref): Put UTF-8 constants into merged ! sections if available. ! ! 2002-02-04 Bryce McKinlay ! ! * parse.y (java_expand_classes): Fix typo in static field loop. ! ! 2002-02-02 Richard Henderson ! ! * class.c (add_field): Mark static fields external. ! (build_class_ref): Remove redundant set. ! * parse.y (java_expand_classes): Mark static fields of classes ! to be compiled as local. ! * jcf-parse.c (parse_class_file): Likewise. ! ! 2002-02-02 Nic Ferrier ! ! * gcj.texi (About CNI): New node. ! ! 2002-02-01 Craig Rodrigues ! ! PR java/5080 ! * jcf-parse.c : Check for HAVE_LOCALE_H before using ! setlocale() with LC_CTYPE as a parameter. ! * jv-scan.c: Same. ! ! 2002-01-31 Joseph S. Myers ! ! * gjavah.c (version), jcf-dump.c (version), jv-scan.c (version): ! Follow GNU Coding Standards for --version. ! ! 2002-01-28 Tom Tromey ! ! * expr.c (build_jni_stub): Ensure storage for `meth' is ! generated. ! * parse.y (java_complete_expand_methods): Set ! current_function_decl before building JNI stub. ! ! 2002-01-26 Andreas Tobler ! ! * gcc/java/builtins.c (sqrt_builtin): Use BUILT_IN_SQRT, not ! BUILT_IN_SQRTF. ! ! 2002-01-22 Tom Tromey ! ! * decl.c (java_init_decl_processing): Use add_predefined_file. ! Predefine RawData.java. ! (predef_filenames): Removed. ! (java_init_decl_processing): Don't register predef_filenames. ! * jcf-parse.c (add_predefined_file): New function. ! (predefined_filename_p): Rewrote. ! (predefined_filename_p): No longer static. ! * decl.c (java_init_decl_processing): Call initialize_builtins. ! * Make-lang.in (JAVA_OBJS): Added builtins.o. ! (java/builtins.o): New target. ! * builtins.c: New file. ! * parse.y (patch_invoke): Use build_call_or_builtin. ! * java-tree.h (build_call_or_builtin): Declare. ! (initialize_builtins): Declare. ! (java_set_exception_lang_code): Removed unused declaration. ! (PREDEF_FILENAMES_SIZE): Removed. ! (java_tree_index): Added JTI_PREDEF_FILENAMES. ! (predef_filenames): New define. ! (add_predefined_file): Declare. ! (predefined_filename_p): Declare. ! * expr.c (expand_invoke): Use build_call_or_builtin. ! ! 2002-01-22 Kaveh R. Ghazi ! ! * parse.y (patch_switch_statement): Fix format specifier. ! ! 2002-01-16 Tom Tromey ! ! More for PR java/5365: ! * gjavah.c (print_stub_or_jni): Cause exception to be thrown by ! default. ! (process_file): Generate include for ! java.lang.UnsupportedOperationExceptions. ! ! 2002-01-15 Andreas Jaeger ! ! * .cvsignore: Add man pages. ! ! 2002-01-15 Tom Tromey ! ! Fix for PR java/5365: ! * gjavah.c (process_file): Turn class name into a file name. ! ! 2002-01-14 Matthias Klose ! ! * gcj.texi: Fix whitespace and formatting errors in the ! synopsis of the man pages. Update copyright. ! ! 2002-01-14 Tom Tromey ! ! For PR libgcj/5303: ! * Make-lang.in (java.install-man): Handle jv-convert man page. ! (java.generated-manpages): Added jv-convert.1. ! (java.uninstall): Remove jv-convert.1. ! (java.maintainer-clean): Likewise. ! ($(srcdir)/java/jv-convert.1): New target. ! * gcj.texi (Top): Link to jv-convert node. ! (Individual utilities): Likewise. ! (Invoking jv-convert): New node. ! ! 2001-01-10 Jeff Sturm ! Martin Kahlert ! ! * jcf-parse.c (get_constant): Don't swap lo/hi for big ! endian targets when HOST_BITS_PER_WIDE_INT >= 64. ! ! 2002-01-03 Graham Stott ! ! * class.c (compile_resource_file): Update copyright date. ! Constify filename parameter. ! (java-tree.h): Update copyright date. ! (compile_resource_file): Constify filename parameter. ! ! 2002-01-03 Graham Stott ! ! * gcc/jcf-parse.c: Update copyright date. ! (yyparse): Constify resource_filename. ! ! 2002-01-02 Kaveh R. Ghazi ! ! * parse.y (src_parse_roots): Don't needlessly zero init. ! ! 2001-12-31 Tom Tromey ! ! * parse.y (dump_java_tree): New function. ! (source_end_java_method): Call it. ! (end_class_declaration): Likewise. ! * lang.c (java_decode_option): Call dump_switch_p. ! ! 2001-12-28 Tom Tromey ! ! * gen-table.pl: Don't process characters after \uffff. Added ! comment pointing to input file. ! ! 2001-12-28 Kaveh R. Ghazi ! ! * gen-table.pl: Const-ify output. Document the location of a ! suitable unicode input file. ! ! * chartables.h: Regenerate. ! ! 2001-12-26 Kaveh R. Ghazi ! ! * chartables.h: Const-ify. ! * gjavah.c (options): Likewise. ! * jcf-dump.c (options): Likewise. ! * jv-scan.c (options): Likewise. ! * lex.c (java_start_char_p, java_part_char_p): Likewise. ! * parse.y (binop_lookup): Likewise. ! ! 2001-12-23 Kaveh R. Ghazi ! ! * Make-lang.in (keyword.h): Pass -C to gperf to const-ify ! the static arrays that are output. ! * jvspec.c (jvgenmain_spec): Make static. ! * keyword.gperf (struct java_keyword, java_keyword): Const-ify. ! * keyword.h: Regenerate. ! * lang.c (string_option, process_option_with_no, lang_f_options, ! lang_W_options): Const-ify. ! * lex.c (java_lex): Likewise. ! ! 2001-12-21 Richard Henderson ! ! * boehm.c (PROCEDURE_OBJECT_DESCRIPTOR): Merge into .. ! (get_boehm_type_descriptor): ... here. Arrange for the ! TREE_TYPE to get set properly. ! ! 2001-12-21 Richard Henderson ! ! * class.c (compile_resource_file): Set TREE_PUBLIC on the constructor ! only if the target requires collect2. ! ! * class.c (build_class_ref): Mark _Jv_fooClass DECL_EXTERNAL. ! ! 2001-12-20 Tom Tromey ! ! For PR java/4509: ! * parse.y (java_complete_lhs) [COMPOUND_EXPR]: Correctly compute ! CAN_COMPLETE_NORMALLY for the node. ! * jcf-write.c (generate_bytecode_insns) [COMPOUND_EXPR]: Don't ! generate code for second branch if first branch can't complete ! normally. ! (generate_bytecode_insns) [LOOP_EXPR]: Don't generate `goto' to ! the loop head if the loop body can't complete normally. ! ! 2001-12-20 Tom Tromey ! ! For PR java/4766: ! * jcf-write.c (generate_bytecode_insns) [TRY_FINALLY_EXPR]: Handle ! case where `finally' clause can't complete normally. ! ! 2001-12-20 Tom Tromey ! ! Fixes PR java/5057: ! * parse.y (analyze_clinit_body): Added this_class parameter. ! Check for more cases where we must keep . ! (maybe_yank_clinit): Cleaned up flow control. ! ! 2001-12-20 Bryce McKinlay ! ! * decl.c (java_init_decl_processing): Don't initialize ! finit_leg_identifier_node. ! * java-tree.h (java_tree_index): Remove JTI_FINIT_LEG_IDENTIFIER_NODE. ! (finit_leg_identifier_node): Remove. ! (ID_FINIT_P): Don't check for JTI_FINIT_LEG_IDENTIFIER_NODE. ! ! 2001-12-20 Bryce McKinlay ! ! * mangle.c (mangle_member_name): Don't special-case for ! NO_DOLLAR_IN_LABEL. ! * mangle_name.c (unicode_mangling_length): Likewise. ! (append_unicode_mangled_name): Likewise. ! * parse.y (make_nested_class_name): Remove dead NO_DOLLAR_IN_LABEL ! code. ! ! 2001-12-20 Bryce McKinlay ! ! * expr.c (build_java_array_length_access): Don't force null pointer ! check unless flag_check_references is set. ! ! 2001-12-20 Tom Tromey ! ! Fix for PR java/3417: ! * parse.y (patch_assignment): Added special processing for ! `return'. ! (patch_return): Don't convert booleans to integers, and don't ! special-case `null'. ! ! 2001-12-20 Joseph S. Myers ! ! * config-lang.in (diff_excludes): Remove. ! ! 2001-12-17 Joseph S. Myers ! ! * gcj.texi: Update link to GCC manual. ! ! 2001-12-17 Tom Tromey ! ! * parse.y (link_nested_class_to_enclosing): Removed useless ! statement. ! ! 2001-12-16 Tom Tromey ! ! * mangle.c (mangle_method_decl): Never emit `C2' constructor. ! Fixes PR java/5088. ! ! 2001-12-16 Joseph S. Myers ! ! * ChangeLog, Make-lang.in, class.c, expr.c, gcj.texi, java-tree.h, ! jcf-parse.c, jcf-write.c, lex.c, parse.h, parse.y, verify.c: Fix ! spelling errors. ! ! 2001-12-16 Kaveh R. Ghazi ! ! * lex.c (java_read_unicode, java_lex): Use hex_p/hex_value. ! ! 2001-12-16 Bryce McKinlay ! ! * decl.c (java_init_decl_processing): Build otable_type correctly. ! otable_decl is an otable_type. ! ! 2001-12-15 Bryce McKinlay ! ! * java-tree.h (otable_methods, otable_decl, otable_syms_decl, ! otable_type, otable_ptr_type, method_symbol_type, ! method_symbols_array_type, method_symbols_array_ptr_type): New ! field/global tree definitions. ! (flag_indirect_dispatch): New flag. ! * decl.c (java_init_decl_processing): Initialize new otable and ! otable_syms type nodes and decls. Add new field "index" to ! method_type_node. ! * class.c (build_method_symbols_entry): New function. ! (make_method_value): Set "index" to to method's vtable index for ! virtual methods when indirect-dispatch is not used. ! (make_class_data): For indirect-dispatch, don't emit the dtable_decl, ! and set vtable_method_count to -1. Set otable and otable_syms field ! if indirect-dispatch is used and there was something to put in them. ! (build_method_symbols_entry): New function. ! (emit_offset_symbol_table): New function. ! * expr.c (get_offset_table_index): New function. ! (build_invokevirtual): Build array reference to otable at the index ! returned by get_offset_table_index, and use the result as the vtable ! offset. ! (build_invokeinterface): Similar. ! * jcf-parse.c (yyparse): If indirect-dispatch, call ! emit_offset_symbol_table at the end of compilation, after all classes ! have been generated. ! * jvspec.c: Don't pass findirect-dispatch to jvgenmain. ! * lang.c (flag_indirect_dispatch): Define. ! (lang_f_options): Add indirect-dispatch flag. ! ! 2001-12-14 Matthias Klose ! ! * gcj.texi: Markup for man page generation. Document missing ! options printed by --help. ! Terminate description of gij's -ms option with a dot. ! * Make-lang.in ($(srcdir)/java/*.1): New targets. ! (java.generated-manpages java.install-man, java.uninstall, ! java-maintainer-clean) Updated. ! ! 2001-12-14 Hans Boehm ! ! * class.c (get_dispatch_table): Fix java vtable layout ! for TARGET_VTABLE_USES_DESCRIPTORS. ! * decl.c (java_init_decl_processing): Initialize ! alloc_no_finalizer_node, finalize_identifier_node. ! * expr.c (class_has_finalize_method): New function. ! (expand_java_NEW): Generate calls for finalizer-free allocation. ! (build_invokevirtual): Fix java vtable layout for ! TARGET_VTABLE_USES_DESCRIPTORS. ! * java-tree.h (enum java_tree_index): New entries: ! JTI_ALLOC_NO_FINALIZER_NODE, JTI_FINALIZE_IDENTIFIER_NODE. ! (alloc_no_finalizer_node, finalize_deintifier_node): New macros. ! (class_has_finalize_method): declare. ! (HAS_FINALIZER_P): New macro. ! * parse.y (patch_invoke): Generate calls for finalizer-free ! allocation. ! ! 2001-12-12 Matthias Klose ! ! * Make-lang.in: JAVA_INSTALL_NAME, JAVA_CROSS_NAME: Remove ! whitespace at end of line. ! ! 2001-12-11 Tom Tromey ! ! * lex.c (java_init_lex): Define wfl_to_string as ! gnu.gcj.runtime.StringBuffer unless generating bytecode. ! ! 2001-12-11 Jeff Sturm ! ! * class.c (make_method_value): Use null_pointer_node to ! represent empty exception table. ! ! 2001-12-10 Tom Tromey ! ! * check-init.c (check_init) [SWITCH_EXPR]: Use SWITCH_HAS_DEFAULT. ! ! Mon Dec 10 06:09:57 2001 Douglas B. Rupp ! ! * Make-lang.in (jvspec.o): Add $(OUTPUT_OPTION). ! ! 2001-12-09 Per Bothner ! ! * check-init.c (current_switch_has_default): New static field. ! (check_init): Case DEFAULT_EXPR: Set current_switch_has_default. ! Case SWITCH_EXPR: Save/restore current_switch_has_default. If no ! DEFAULT_EXPR seen, simulate a default alternative that copies state. ! ! 2001-12-09 Tom Tromey ! ! * check-init.c (check_init): Don't allow pre- or post- increment ! or decrement of final variable. ! (final_assign_error): Minor error message rewording. ! ! 2001-12-08 Tom Tromey ! ! * java-tree.h: Fixed typo. ! ! * gjavah.c (decompile_method): Don't decompile to `return this' ! for static methods. ! ! * gjavah.c (cxx_keywords): Re-sorted. ! * lex.c (cxx_keywords): Re-sorted. ! ! * gjavah.c (HANDLE_METHOD): Set `decompiled' before doing anything ! else. ! ! * gjavah.c (print_namelet): Clear subnamelets. ! (HANDLE_METHOD): Set `method_printed' earlier. ! ! 2001-12-07 Tom Tromey ! ! * lang.c (lang_f_options): Added ! optimize-static-class-initialization. ! (java_decode_option): Removed special case. ! ! 2001-12-07 Per Bothner ! ! * check-init.c (check_init): Fix typo freeing memory twice. ! ! 2001-12-05 Per Bothner ! ! Restore support for static class initialization optimization. ! * java-tree.h (STATIC_CLASS_INIT_OPT_P): Re-enable. ! * check-init.c (check_int): At end of BLOCK handle initialization ! blocks, which used to be done in java_complete_expand_method but did ! not handle the case where check_for_initialization might allocate ! more than a word of bits. ! * decl.c (lang_make_tree): The smic field is now a tree. ! * expr.c (build_class_init): Set DECL_FUNCTION_INIT_TEST_CLASS field. ! * java-tree.h (DECL_FUNCTION_INIT_TEST_TABLE): New macro. ! ! * parse.y (emit_test_initialization): Combine hash_lookup calls. ! ! * java-tree.h (DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND): ! Change from a hash table to a list. ! (struct_lang_decl): Change field 'smic' to match. ! * class.c (add_method_1): Initialize ! DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND to null list. ! * parse.y (adjust_init_test_initialization): Removed - inlined into - ! (java_expand_method_bodies): -here, since 'smic' is now a list. ! (patch_invoke): Add to 'smic' list, instead of hash_lookup. ! ! * check-init.c (WORD_SIZE): Use BITS_PER_UNIT. ! ! * class.c (java_hash_compare_tree_node): Fix casts. ! ! 2001-12-04 Per Bothner ! ! * check-init.c: Handle definite unassignment to finals in addition ! to definite assignment. ! (loop_current_locals): New field. ! (num_current_locals, int start_current_locals, num_current_words): ! Make static. ! (SET_P, CLEAR_P, SET_BIT): Add needed but missing parentheses. ! (ASSIGNED_P, UNASSIGNED_P, SET_ASSIGNED, SET_UNASSIGNED, ! CLEAR_ASSIGNED, CLEAR_UNASSIGNED): New macros. ! (get_variable_decl, check_final_reassigned): New functions. ! (check_init, check_bool_init): Modify as needed for checking finals. ! (check_for_initialization): Take extra parameter and return void. ! Do extra start-up logic to check final fields for assignment. ! * parse.y (check_static_final_variable_assignment_flag, ! reset_static_final_variable_assignment_flag, check_final_assignment, ! check_final_variable_local_assignment_flag, ! reset_final_variable_indirect_assignment_flag, ! reset_final_variable_global_assignment_flag): Remove functions. ! (java_complete_expand_methods, outer_field_access_fix, ! patch_assignment): Remove no-longer used logic. ! * java-tree.h (DECL_FIELD_FINAL_IUD): Change usage and comments. ! * parse.y (register_fields, java_complete_tree): Update accordingly. ! ! * check-init.c (ALLOC_WORDS/FREE_WORDS): Use xmalloc/free, not alloca. ! (DECLARE_BUFFERS, RELEASE_BUFFERS, ALLOC_BUFFER, FREE_BUFFER): New. ! (check_cond_init, check_bool2_init): Use DECLARE_BUFFERS. ! ! * java-tree.h (STATIC_CLASS_INIT_OPT_P): Temporarily turn off. ! ! * java-tree.h (DECL FINAL): New bit-field. ! (METHOD_FINAL, FIELD_FINAL, CLASS_FINAL): Define as DECL_FINAL. ! (LOCAL_FINAL_P): Use DECL_FINAL rather than old LOCAL_FINAL. ! (DECL_INIT_CALLS_THIS): New macro. ! (struct lang_decl): New bit-field init_calls_this. ! (DECL_FUNCTION_ALL_FINAL_INITIALIZED, DECL_FIELD_FINAL_LIIC, ! DECL_FIELD_FINAL_IERR, LOCAL_FINAL, TYPE_HAS_FINAL_VARIABLE ! (DECL_BIT_INDEX): Change to use pointer_alias_set since we now ! use it for both local variables and final fields. ! (struct lang_decl_var): Remove bit-fields final_liic, final_ierr, ! and local_final. ! (struct lang_type): Remove hfv bit-field. ! (check_for_initialization): Change to return void. ! ! * java-tree.h (IS_ARRAY_LENGTH_ACCESS): New macros. ! * expr.c (build_java_array_length_access): Set IS_ARRAY_LENGTH_ACCESS. ! * check-init.c (final_assign_error): New helper function. ! (check_final_reassigned, check_init): Use it. ! (check_init): Also check IS_ARRAY_LENGTH_ACCESS for ARRAY.length. ! ! * java-tree.h (struct lang_decl, struct lang_decl_var): Change all ! bit-fields to unsigned. ! ! 2001-12-03 Per Bothner ! ! * parse.y (patch_binop): Minor constant folding. ! ! * parse.y (build_current_thisn): Shorter 'buffer'. ! ! 2001-12-03 Per Bothner ! ! * decl.c (complete_start_java_method): Now generate TRY_FINALLY_EXPR ! instead of CLEANUP_POINT_EXPR and WITH_CLEANUP_EXPR. ! * jcf-write.c (generate_bytecode_insns): Remove support for ! CLEANUP_POINT_EXPR and WITH_CLEANUP_EXPR as they are no longer used. ! * check-init.c (check_init): Likewise. ! ! 2001-12-03 Per Bothner ! ! * verify.c (subroutine_nesting): New function. ! (verify_jvm_instructions): Use it to fix logic for checking that ! we're done with the current subroutine. ! ! * verify.c (verify_jvm_instruction): For OPCODE_checkcast and ! OPCODE_instanceof use POP_TYPE macro for better diagnostics. ! ! 2001-12-03 Per Bothner ! ! * jcf.h: Fix obvious typo in comment. ! * typeck.c (build_null_signature): Add comment. ! ! 2001-12-03 Neil Booth ! ! * expr.c: Remove leading capital from diagnostic messages, as ! per GNU coding standards. ! * jcf-io.c: Similarly. ! * jcf-parse.c: Similarly. ! * jv-scan.c: Similarly. ! * jvspec.c: Similarly. ! * mangle.c: Similarly. ! ! 2001-12-02 Tang Ching-Hui ! Alexandre Petit-Bianco ! ! * expr.c (build_java_arrayaccess): Call save_expr on array for ! correct evaluation order, modified comment, fixed indentation. ! * parse.y: (patch_assignment): Correctly extract the array base ! from the tree generate by build_java_arrayaccess, added comments. ! (patch_array_ref): Remove SAVE_EXPR on ARRAY_REF. ! Fixes PR java/3096, PR java/3803, PR java/3965. ! ! 2001-12-01 Neil Booth ! ! * expr.c (expand_byte_code): Remove trailing periods from messages. ! * jcf-parse.c (load_class, jcf_parse): Similarly. ! * jcf-write.c (generate_classfile): Similarly. ! * lex.c (java_lex): Similarly. 2001-11-30 Bryce McKinlay * class.c (add_interface_do): Set BINFO_VPTR_FIELD. + 2001-11-29 Joseph S. Myers + + * Make-lang.in (java.generated-manpages): New dummy target. + 2001-11-27 Rainer Orth * jvspec.c (jvgenmain_spec): Cannot use %umain, breaks *************** *** 25,33 **** Strip `main' from classname. Fixes PR java/227. ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. 2001-09-21 Richard Henderson --- 980,1197 ---- Strip `main' from classname. Fixes PR java/227. ! 2001-11-18 Roger Sayle ! * parse.h (java_expand_switch): Remove old prototype. ! ! 2001-11-18 Tom Tromey ! ! Fix for PR java/1401: ! * jcf-write.c (generate_bytecode_insns) [binop]: Handle case where ! arg0 is null. ! (generate_bytecode_insns) [MODIFY_EXPR]: Handle `OP=' case ! correctly. ! ! 2001-11-18 Neil Booth ! ! * lang.c (finish_parse): Rename to java_finish. ! (LANG_HOOKS_FINISH, java_finish): New. ! ! 2001-11-15 Neil Booth ! ! * decl.c (init_decl_processing): Rename java_init_decl_processing. ! * java-tree.h: New prototype. ! * lang.c (java_init): Update prototype. Combine with old init_parse. ! ! 2001-11-13 Tom Tromey ! ! * gjavah.c (method_signature): New global. ! (HANDLE_METHOD): Set it. ! (decompile_return_statement): New function. ! (decompile_method): Use it. ! (print_method_info): Removed `synth' argument. ! ! 2001-11-09 Neil Booth ! ! * java-tree.h (java_set_yydebug): New. ! * jcf-parse.c (set_yydebug): Rename java_set_yydebug. ! * lang.c (LANG_HOOKS_SET_YYDEBUG): Override. ! (print_lang_decl, print_lang_type, print_lang_identifier, ! print_lang_statistics, lang_print_xnode): Remove. ! ! 2001-11-09 Neil Booth ! ! * jcf-parse.c (init_lex): Remove. ! * lang.c (language_string, lang_identify): Remove. ! (struct lang_hooks): Constify. ! (LANG_HOOKS_NAME): Override. ! (init_parse): Update. ! ! 2001-11-08 Andreas Franck ! ! * Make-lang.in (JAVA_INSTALL_NAME, JAVA_CROSS_NAME): Handle ! program_transform_name the way suggested by autoconf. ! (java.install-common): Also transform auxiliary program names with ! program_transform_name. ! ! 2001-11-08 Tom Tromey ! ! * parse.y (trap_overflow_corner_case): New rule. ! (unary_expression): Use it. ! * lex.c (java_init_lex): Don't set minus_seen. ! (yylex): Don't use minus_seen. Communicate overflow to parser for ! it to handle. ! (error_if_numeric_overflow): New function. ! * parse.h (minus_seen): Removed field. ! (JAVA_RADIX10_FLAG): New define. ! ! 2001-11-07 Tom Tromey ! ! Patch for PR java/1414: ! * parse.y (case_label_list): New global. ! (goal): Register case_label_list with GC. ! (java_complete_lhs): Save new case on case_label_list. ! (patch_switch_statement): Check for duplicate case labels. ! ! 2001-11-07 Alexandre Petit-Bianco ! ! * parse.y (patch_assignment): Removed unused third argument. ! (java_complete_lhs): Removed unused third argument to patch_assignment. ! ! 2001-11-06 Neil Booth ! ! * lang.c: Include langhooks-def.h. ! * Make-lang.in: Update. ! ! 2001-10-31 Zack Weinberg ! ! * Make-lang.in: Replace $(INTL_TARGETS) with po-generated. ! ! 2001-10-29 Bryce McKinlay ! ! * mangle.c (find_compression_record_match): Don't match compression ! records for package name elements unless they occur at the start of ! the name. Fix for PR java/4717. ! ! 2001-10-25 Bryce McKinlay ! ! * expr.c (expand_java_field_op): Don't special-case references to ! java.lang.PRIMTYPE.TYPE. ! (build_primtype_type_ref): Removed. ! * java-tree.h (build_primtype_type_ref): Remove prototype. ! * parse.y (maybe_build_primttype_type_ref): Removed. ! (complete_function_arguments): Don't special-case references to ! java.lang.PRIMTYPE.TYPE. ! (patch_assignment): Likewise. ! (array_constructor_check_entry): Likewise. ! ! 2001-10-24 Alexandre Petit-Bianco ! ! * mangle.c (static tree compression_table): Fixed leading comment. ! * parse.h (struct parser_ctxt): Fixed field comment. ! * parse.y (check_pkg_class_access): New prototype, fixed leading ! comment, new parameter used to emit error only if passed as true. ! (parse_check_super): Pass extra argument to check_pkg_class_access. ! (do_resolve_class): Likewise. ! (process_imports): Likewise. ! (read_import_dir): Fixed indentation. ! (find_in_imports_on_demand): New local class_type_name. Local ! node_to_use deleted. while loop changed into for loop. Report ! multiple definition only for accessible classes. Improved error ! message. ! (start_complete_expand_method): Local `ptr' removed. DECL_ARGUMENTS ! assigned to parameter list, fixed indentation. while loop changed ! into for loop, restore TREE_CHAIN on local `tem' before the next ! iteration. ! ! Tue Oct 23 14:02:17 2001 Richard Kenner ! ! * lang.c (lang_get_alias_set): Deleted. ! ! 2001-10-21 Kaveh R. Ghazi ! ! * gjavah.c (jni_print_char): Fix thinko in last change. ! ! * gjavah.c (jni_print_char, decode_signature_piece): Use ! safe-ctype macros and/or fold extra calls into fewer ones. ! * lex.c (java_read_unicode, java_lex): Likewise. ! * lex.h (JAVA_START_CHAR_P, JAVA_PART_CHAR_P, JAVA_ASCII_DIGIT, ! JAVA_ASCII_HEXDIGIT, JAVA_ASCII_LETTER): Likewise. ! * mangle_name.c (append_unicode_mangled_name, ! unicode_mangling_length): Likewise. ! ! 2001-10-17 Richard Henderson ! ! * Make-lang.in (java/lang.o): Depend on langhooks.h. ! ! 2001-10-15 Alexandre Petit-Bianco ! ! * lang.c (langhooks.h): Included. ! (LANG_HOOKS_INIT): Redefined. ! (LANG_HOOKS_INIT_OPTIONS): Likewise. ! (LANG_HOOKS_DECODE_OPTION): Likewise. ! (struct lang_hooks lang_hooks): New initialization. ! ! 2001-10-11 Per Bothner ! ! * parse.y (patch_synchronized_statement): Use a TRY_FINALLY_EXPR ! rather than a CLEANUP_POINT_EXPR/WITH_CLEANUP_EXPR pair. ! The former is simpler, and jcf-write.c handles it better. ! (java_complete_lhs): No longer need to handle CLEANUP_POINT_EXPR ! or WITH_CLEANUP_EXPR. ! * jcf-write.c: Revert Alex's change from 2000-10-18. It is no ! longer needed, as we already handle empty TRY_FINALLY_EXPR bodies fine. ! ! * parse.y (patch_if_else_statement): If the condition is constant, ! optimize away the test. ! ! 2001-10-09 Alexandre Petit-Bianco ! ! * parse.y (patch_cast): Call patch_string on the first operand of ! the incoming node, update it if necessary. Fixes PR java/4510. ! ! 2001-10-09 Bryce McKinlay ! ! * parse.y (find_as_inner_class): Don't disregard the enclosing scope ! when name qualifier matches a package name. ! ! 2001-10-08 Tom Tromey ! ! Fix for PR java/4489: ! * jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Always ! force a new label when computing `body_block'. ! ! 2001-10-07 Kaveh R. Ghazi ! ! * jcf-io.c (format_uint): Const-ify. ! * lang.c (java_tree_code_type, java_tree_code_length): Likewise. ! * lex.c (java_get_line_col): Likewise. ! * parse.y (build_incdec): Likewise. ! ! 2001-10-05 Alexandre Petit-Bianco ! ! * parse.y (register_incomplete_type): Set JDEP_SUPER to be given ! a NULL enclosing context if appropriate. Fixes PR java/4466. ! ! 2001-10-03 Alexandre Petit-Bianco ! ! * parse.y (patch_assignment): Use lvalue's original TYPE when ! building the final COMPOUND_EXPR. ! (try_reference_assignconv): Fixed leading comment. ! ! 2001-09-26 Alexandre Petit-Bianco ! ! * parse.y (check_final_variable_indirect_assignment): For ! COMPOUND_EXPR, return only if finals were found initialized ! properly, if not, keep on checking. ! (check_final_variable_global_assignment_flag): New local ! error_found, set when appropriate and used to decide whether to ! report uninitialized finals. Fixed typo in comment. ! ! 2001-09-22 Alexandre Petit-Bianco ! ! * decl.c (init_decl_processing): Fixed typo in predef_filenames ! last three initializations. Fixes PR java/4360. 2001-09-21 Richard Henderson *************** *** 35,51 **** (build_dtable_decl): Likewise. * expr.c (build_invokevirtual): Likewise. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. 2001-08-12 David Edelsohn ! Revert previous patch. 2001-08-02 Rainer Orth --- 1199,1634 ---- (build_dtable_decl): Likewise. * expr.c (build_invokevirtual): Likewise. ! 2001-09-20 Alexandre Petit-Bianco ! * parse.y (patch_method_invocation): Build class initialization ! when static finals are used to qualify method invocation. ! Fixes PR java/4366. ! 2001-09-19 Alexandre Petit-Bianco ! * parse.h: (WFL_STRIP_BRACKET): Re-written using ! build_type_name_from_array_name. ! (STRING_STRIP_BRACKETS): New macro. ! * parse.y (build_type_name_from_array_name): New function. ! (array_creation_expression:): Accumulate []s instead of [s. ! (cast_expression:): Accumulate []s instead of [s after cast type ! name. ! (build_array_from_name): Local string deleted, use ! build_type_name_from_array_name. ! (build_unresolved_array_type): Accumulate []s instead of [s after ! type name. ! (register_fields): Fixed comment. ! (resolve_class): Local name, base deleted, new locals tname and ! array_dims. Use build_type_name_from_array_name. Use array_dims to ! build array type. ! (purify_type_name): Use STRING_STRIP_BRACKETS. ! ! 2001-09-18 Andreas Jaeger ! ! * parse.y: Use VA_OPEN/VA_CLOSE/VA_FIXEDARG throughout. ! * jv-scan.c: Likewise. ! ! 2001-09-17 Alexandre Petit-Bianco ! ! * parse.y (patch_method_invocation): Inner class creation context ! check not enforced within constructors. Fixes PR java/1873. ! ! 2001-09-16 Tom Tromey ! ! * jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Call ! NOTE_PUSH for single-case push. Fixes PR java/4189. ! ! 2001-09-13 Alexandre Petit-Bianco ! ! * java-tree.h (TYPE_IMPORT_LIST): New macro. ! (TYPE_IMPORT_DEMAND_LIST): Likewise. ! (struct lang_type): New fields import_list and import_demand_list. ! * parse.y (java_complete_class): Initialize TYPE_IMPORT_LIST and ! TYPE_IMPORT_DEMAND_LIST with ctxp counterparts. ! (do_resolve_class): New local saved_enclosing_type, initialized, ! passed as parameter to find_in_imports and find_in_imports_on_demand. ! (find_in_imports): Added paramater enclosing_type, use its ! TYPE_IMPORT_LIST when applicable. ! (find_in_imports_on_demand): Added parameter enclosing_type, use ! its TYPE_IMPORT_DEMAND_LIST when applicable. Reorganized locals ! declaration and initialization. ! (fold_constant_for_init): Switch/restore current_class to the ! appropriate context. ! ! 2001-09-13 Mark Mitchell ! ! * verify.c (verify_jvm_instructions): Fix typo. ! ! 2001-09-13 Kaveh R. Ghazi ! ! * expr.c (expand_invoke): Const-ification. ! * parse.y (patch_method_invocation): Likewise. ! ! 2001-09-12 Kaveh R. Ghazi ! ! * gjavah.c (cxx_keywords): Const-ification. ! * keyword.gperf (java_keyword): Likewise. ! * lang.c (java_tree_code_name): Likewise. ! * lex.c (cxx_keywords): Likewise. ! * parse.y (java_parser_context_suspend, merge_string_cste): Likewise. ! ! 2001-09-11 Richard Henderson ! ! * parse.h (ctxp_for_generation): Mark extern. ! ! 2001-09-10 Richard Henderson ! ! * class.c (build_class_ref): Set DECL_EXTERNAL before make_decl_rtl. ! ! 2001-09-07 Matt Kraai ! ! * typeck.c (java_array_type_length, build_prim_array_type): ! Represent empty arrays by NULL index. ! ! 2001-09-06 Alexandre Petit-Bianco ! ! * java-tree.h (compile_resource_file): Grouped with other prototypes. ! * jvspec.c (lang_specific_driver): Removed unused local `ptr.' ! ! 2001-09-06 Anthony Green ! ! * class.c (O_BINARY): Define if necessary. ! (registerResource_libfunc): Declare. ! (init_class_processing): Initilize registerResource_libfunc. ! (compile_resource_file): New function. ! * java-tree.h (resource_name): Declare. ! (compile_resource_file): Declare. ! * jcf-parse.c (yyparse): Handle compiling java resource files. ! * lang.c (java_decode_option): Handle -fcompile-resource option. ! * jvspec.c (lang_specific_driver): Handle -R flag for compiling ! resource files. ! * gcj.texi (Code Generation): Add documentation for -R flag. ! ! 2001-09-05 Alexandre Petit-Bianco ! ! * jcf-write.c (generate_classfile): Issue an error in case of ! field/initial value mismatch. ! * parse.y (analyze_clinit_body): Keep if an array is ! being initialized and we're generating bytecode. ! (java_complete_lhs): In MODIFY_EXPR section: added comments, ! set DECL_INITIAL properly when appropriate. ! Fixes PR java/4230 ! Fixes PR java/4204 ! ! 2001-09-01 Per Bothner ! ! * parse.y (maybe_yank_clinit): A field without an initializer is not ! relevant. All initializers except static final and constant require ! , regardless of flag_emit_class_files. ! ! 2001-08-31 Per Bothner ! ! * class.c (set_constant_value): When not emiting class files, then a ! String ConstantValue is a utf8const_ptr_type. ! ! 2001-08-30 Per Bothner ! ! * jcf-write.c (generate_classfile): Check that field is primitive ! or string before emitting ConstantValue attribute. ! ! 2001-08-30 Per Bothner ! ! * parse.y (resolve_qualified_expression_name): If creating a ! COMPOUND_EXPR, set it's type correctly. ! ! 2001-08-30 Per Bothner ! ! * jcf-io.c (open_class): Set filename field. ! ! * jcf-parse,c (parse_class_file): Set current_function_decl ! for better error message when Code attribute is missing. ! ! * lang.c (put_decl_node, lang_print_error): Re-arrange for ! better diagnostics, especially for constructors. ! ! 2001-08-30 Per Bothner ! ! * jcf-write.c (generate_classfile): Don't write ConstantValue ! attribute if field is not final, for compatibility with jdk. ! ! * jcf-write.c (generate_classfile): Convert ConstantValue values ! to correct type. Work-around for front-end bug. ! * class.c (set_constant_value): Error if constant has wrong type. ! ! 2001-08-30 Per Bothner ! ! * jcf-dump.c (print_constant): Fix fencepost error so "Float" and ! "Double" are printed at verbosity 1. ! ! * jcf-dump.c (main): Disable flag_print_attributes if --javap. ! ! * jcf-dump.c (SPECIAL_IINC): Remove unneeded casts to long. ! ! 2001-08-30 Alexandre Petit-Bianco ! ! * parse.y (patch_assignment): Don't verify final re-assignment here. ! (java_complete_lhs): Verify assignments to finals calling ! patch_assignment. Verify re-assignments to finals before calling ! patch_assignment. ! ! 2001-08-29 Alexandre Petit-Bianco ! ! * parse.y (java_complete_lhs): Allow final locals in CASE_EXPRs. ! Fixes PR java/1413 ! ! 2001-08-28 Alexandre Petit-Bianco ! ! * lex.c (java_lex): new local found_hex_digits. Set and then used ! in test to reject invalid hexadecimal numbers. ! * parse.y (java_complete_tree): Prevent unwanted cast with ! initialized floating point finals. ! (patch_binop): Emit a warning when detecting a division by zero, ! mark result not constant, don't simplify non integer division. ! ! 2001-08-28 Per Bothner ! ! * jcf-write.c (generate_bytecode_insns): For increments and ! decrements just recurse to push constant. Improvement on Mark's patch. ! ! 2001-08-28 Mark Mitchell ! ! * jcf-write.c (generate_bytecode_insns): Generate an integer to ! real conversion for increments and decrements of reals. ! ! 2001-08-27 Alexandre Petit-Bianco ! ! * parse.y (resolve_qualified_expression_name): Handle unresolved ! qualified expressions, prevent numerical qualifiers, fixed typo. ! Fixes PR java/4141 ! ! 2001-08-24 Alexandre Petit-Bianco ! ! * parse.y (check_deprecation): Handle TYPE_DECL in a special case, ! don't report anything but deprecated class when marked so. Handle ! VAR_DECL. ! (patch_method_invocation): Check deprecation on methods and types. ! (patch_binop): code becomes an enum tree_code, added default: to ! switch to handle that. Detect division by zero, try to fold and ! return before using a subroutine. ! ! 2001-08-23 Alexandre Petit-Bianco ! ! * jcf-parse.c (yyparse): Set magic to 0, don't issue error for a ! file smaller than 4 bytes. ! * parse.y (check_inner_circular_reference): New function. ! (check_circular_reference): Likewise. ! (array_initializer:): Accept {,}. ! (java_check_circular_reference): Rewritten using ! check_circular_reference and check_inner_circular_reference. ! (java_complete_expand_method): Unconditionally save and restore ! the unpurged exception list. ! (build_dot_class_method_invocation): Unmangle signature parameter. ! ! 2001-08-21 Tom Tromey ! ! * decl.c (init_decl_processing): Add `throws' field to method ! descriptor. ! * class.c (make_method_value): Compute `throws' field for method. ! ! 2001-08-22 Alexandre Petit-Bianco ! ! * parse.y (resolve_inner_class): Keep local_enclosing to NULL if ! circularity is detected. ! (ctors_unchecked_throws_clause_p): Fixed leading comment. ! ! 2001-08-17 Richard Henderson ! ! * class.c (emit_register_classes): Add align parameter to ! call to assemble_integer. ! ! 2001-08-16 Alexandre Petit-Bianco ! ! * jcf-parse.c (load_class): New locals saved and class_loaded. If ! loading a class_or_name fails, try considering an innerclass name ! and load the enclosing context. ! * parse.y (resolve_inner_class): New function. ! (find_as_inner_class): Added leading comment. ! (register_incomplete_type): Keep the current context as enclosing ! context for JDEP_FIELD dependencies. ! (do_resolve_class): Locals new_class_decl and super initialized to ! NULL. Call resolve_inner_class, explore the enclosing context ! superclass if necessary. ! Fixes PR java/4007 ! ! 2001-08-16 Tom Tromey ! ! * jcf-dump.c (main): Updated for change to jcf_path_seal. ! * gjavah.c (main): Updated for change to jcf_path_seal. ! * lang.c (version_flag): New global. ! (java_decode_option): Recognize `-version'. ! (java_init): Update for change to jcf_path_seal. ! * jcf.h (jcf_path_seal): Added `print' argument. ! * jcf-path.c (jcf_path_seal): Added `print' argument. ! ! 2001-08-13 Zack Weinberg ! ! * Make-lang.in (java/decl.o): Update dependencies. ! * decl.c: Include libfuncs.h, don't include toplev.h. ! ! 2001-08-12 Alexandre Petit-Bianco ! ! * decl.c (init_decl_processing): exception_type_node, ! class_not_found_type_node, and no_class_def_found_type_node ! initialized. predef_filenames augmented accordingly. ! instinit_identifier_node initialized. ! * java-tree.def (INSTANCE_INITIALIZERS_EXPR): Entry removed. ! * java-tree.h (enum java_tree_index): New entries ! JTI_EXCEPTION_TYPE_NODE, JTI_CLASS_NOT_FOUND_TYPE_NODE, ! JTI_NO_CLASS_DEF_FOUND_TYPE_NODE, JTI_INSTINIT_IDENTIFIER_NODE. ! (exception_type_node): New macro. ! (class_not_found_type_node): Likewise. ! (no_class_def_found_type_node): Likewise. ! (instinit_identifier_node): Likewise. ! (PREDEF_FILENAMES_SIZE): Adjusted. ! (TYPE_HAS_FINAL_VARIABLE): Fixed typo. ! (struct lang_type): Fixed typo in bitfield name. ! (DECL_INSTINIT_P): New macro. ! (ID_INSTINIT_P): Likewise. ! * jcf-write.c (generate_classfile): instinit$ bears the Synthetic ! attribute. ! * parse.y (encapsulate_with_try_catch): New function. ! (generate_instinit): Likewise. ! (build_instinit_invocation): Likewise. ! (ctors_unchecked_throws_clause_p): Likewise. ! (add_instance_initializer): Deleted. ! (build_instance_initializer): Likewise. ! (in_instance_initializer): Likewise. ! (check_method_redefinition): instinit$ not to be verified. ! (java_complete_expand_methods): Generate instinit$, simplified code. ! (build_dot_class_method): Eliminated unnecessary locals. Use ! encapsulate_with_try_catch, removed unnecessary code. ! (fix_constructors): New local iii. Use build_instinit_invocation. ! (patch_method_invocation): Added comment. ! (maybe_use_access_method): Don't consider instinit$. ! (find_applicable_accessible_methods_list): Shorten the search for ! instinit$ too. ! (java_complete_lhs): case INSTANCE_INITIALIZERS_EXPR removed. ! (patch_return): Use DECL_INSTINIT_P instead of in_instance_initializer. ! (patch_throw_statement): Likewise. Fixed typo. 2001-08-12 David Edelsohn ! Revert: ! 2001-08-02 Rainer Orth ! * jvspec.c (jvgenmain_spec): Cannot use %umain, breaks ! ASM_FINAL_SPEC. ! (lang_specific_pre_link): Use set_input to set input_filename. ! Append `main' here. ! * jvgenmain.c (usage): Append literal `main' to CLASSNAME. ! (main): Fix definition. ! Strip `main' from classname. ! Fixes PR java/227. ! ! 2001-08-11 Zack Weinberg ! ! * lex.h: Don't include setjmp.h. Don't define ! SET_FLOAT_HANDLER or prototype set_float_handler. ! ! 2001-08-09 Alexandre Petit-Bianco ! ! * expr.c (java_lang_expand_expr): Call `expand_end_bindings' and ! `poplevel' in the right order. ! ! 2001-08-09 Richard Henderson ! ! * Make-lang.in (class.o): Depend on TARGET_H. ! * class.c (emit_register_classes): Use target hooks instead of ! assemble_constructor and assemble_destructor. ! ! 2001-08-08 Alexandre Petit-Bianco ! ! * check-init.c (flags.h): Include ! (check_init): Don't report uninitialized static class ! initialization flags, don't free bit index when doing static class ! initialization optimization. ! (check_for_initialization): Return type changed to `unsigned int.' ! (attach_initialized_static_class): New function. ! * class.c (add_method_1): Create the initialized static class ! table if necessary. ! (finish_class): Always emit deferred inline methods. ! * decl.c (emit_init_test_initialization): Moved to expr.c ! (complete_start_java_method): Don't traverse ! DECL_FUNCTION_INIT_TEST_TABLE. ! (lang_mark_tree): Mark hash tables in function decls. ! * expr.c (emit_init_test_initialization): Moved from decl.c. ! (build_class_init): Create LAG_DECL_SPECIFIC for the static class ! initialization flag, set DECL_CONTEXT and ! LOCAL_CLASS_INITIALIZATION_FLAG. ! (java_lang_expand_expr): Emit initialization code for static class ! initialized flags when entering block, if necessary. ! * gcj.texi (-fno-optimize-static-class-initialization): Documented. ! * java-tree.h (flag_optimize_sci): New global variable declaration. ! (DECL_FUNCTION_INITIALIZED_CLASS_TABLE): New macro. ! (DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND): Likewise. ! (LOCAL_FINAL_P): Fixed typo in comment. ! (FINAL_VARIABLE_P): Likewise. ! (LOCAL_CLASS_INITIALIZATIO_FLAG): New macro. ! (LOCAL_CLASS_INITIALIZATIO_FLAG_P): Likewise. ! (struct lang_decl): New fields `ict', `smic' and `cif.' ! (check_for_initialization): New returned value for global. ! (attach_initialized_static_class): New global function. ! (STATIC_CLASS_INIT_OPT_P): New macro. ! * lang-options.h (-fno-optimize-static-class-initialization): New flag. ! * lang.c (java_decode_option): Handle ! `-fno-optimize-static-class-initialization' ! * parse.y (start_complete_expand_method): New function. ! (java_expand_method_bodies): Likewise. ! (attach_init_test_initialization_flags): Likewise. ! (adjust_init_test_initialization): Likewise. ! (emit_test_initialization): Likewise. ! (java_complete_expand_methods): Nullify abstract and native method ! bodies. ! (java_complete_expand_method): New locals `fbody', `block_body' ! and `exception_copy.' Reorganized: directly return on empty method ! bodies, call `start_complete_expand_method', remember definitely ! initialized static class in function, don't expand method bodies. ! (java_expand_classes): Call `java_expand_method_bodies' before ! `finish_class' when compiling to native. ! (resolve_expression_name): Use `orig' after building outer class ! field access. ! (patch_invoke): Remember static method invokations. ! ! 2001-08-06 Richard Henderson ! ! * class.c (emit_register_classes): Pass a symbol_ref and priority ! to assemble_constructor. ! ! 2001-08-02 Alexandre Petit-Bianco ! ! * java-tree.h (all_class_filename): New macro. ! (enum java_tree_index): New enum `JTI_ALL_CLASS_FILENAME.' ! (BUILD_FILENAME_IDENTIFIER_NODE): Fixed leading comment. Link ! newly created IDENTIFIER_NODE to `all_class_filename.' ! ! 2001-08-01 Jeff Sturm ! ! * java-tree.h (BUILD_FILENAME_IDENTIFIER_NODE): ! Use ggc_add_tree_root to register roots. ! ! 2001-07-31 Alexandre Petit-Bianco ! ! * check-init.c (check_init): WITH_CLEANUP_EXPR node to use its ! second operand calling check_init. ! * decl.c (complete_start_java_method): Swaped second and third ! arguments while creating WITH_CLEANUP_EXPR node. ! * jcf-write.c (generate_bytecode_insns): Use second operand ! instead of third when handling WITH_CLEANUP_EXPR. ! * parse.y (java_complete_lhs): Expand second operand of ! WITH_CLEANUP_EXPR nodes. ! (patch_synchronized_statement): Swaped second and third arguments ! while creating WITH_CLEANUP_EXPR node. ! ! 2001-07-18 Alexandre Petit-Bianco ! ! * parse.y (create_interface): Avoid cyclic inheritance report when ! syntax error encountered during class definition. ! Fixes PR java/2956 2001-08-02 Rainer Orth *************** *** 67,97 **** * Make-lang.in (jc1$(exeext)): Link against LIBICONV. (jv-scan$(exeext)): Likewise. 2001-07-13 Tom Tromey * jvspec.c (jvgenmain_spec): Remove -ffilelist-file from cc1 invocation. 2001-07-04 Joseph S. Myers * gcj.texi: Use gpl.texi. * Make-lang.in ($(srcdir)/java/gcj.info, java/gcj.dvi): Update dependencies and use doc/include in search path. ! 2001-07-04 Jeffrey Oldham ! * jvgenmain.c (do_mangle_classname): End string constant with '\0'. ! 20010617 Release Manager ! * GCC 3.0 Released. ! 2001-06-07 Theodore Papadopoulo ! * Make-lang.in ($(srcdir)/java/gcj.info): Added dependencies on ! fdl.texi. ! (java/gcj.dvi): Use TEXI2DVI instead of custom tex calls. Create ! the dvi file in the java directory. 2001-06-04 Alexandre Petit-Bianco --- 1650,1822 ---- * Make-lang.in (jc1$(exeext)): Link against LIBICONV. (jv-scan$(exeext)): Likewise. + 2001-07-17 Alexandre Petit-Bianco + + * parse.h (INTERFACE_INNER_MODIFIERS): Disallow `private.' + * parse.y (check_class_interface_creation): Allow `private' if the + enclosing is not an interface. + (create_interface): Interface tagged public if the enclosing + context is an interface. + (create_class): Class tagged public if the enclosing context + is an interface. + Fixes PR java/2959 + + 2001-07-17 Alexandre Petit-Bianco + + * class.c (push_class): Set DECL_SIZE to `integer_zero_node.' + Fixes PR java/2665 + + 2001-07-14 Tim Josling + + * check-init.c (check_init): Remove references to EXPON_EXPR. + + 2001-07-13 Alexandre Petit-Bianco + + * parse.y (java_complete_lsh): Set CAN_COMPLETE_NORMALLY and unset + TREE_CONSTANT_OVERFLOW of CASE_EXPR value. + Fixes PR java/3602 + 2001-07-13 Tom Tromey * jvspec.c (jvgenmain_spec): Remove -ffilelist-file from cc1 invocation. + 2001-07-12 Alexandre Petit-Bianco + + * parse.y (patch_method_invocation): Don't override primary if one + is already provided, but let this$ be built. Fixed comment. + + 2001-07-12 Alexandre Petit-Bianco + + * parse.y (empty_statement:): Report empty statement error only + when found at class declaration level. + Fixes PR java/3635 + + 2001-07-12 Tom Tromey + + * expr.c (expand_load_internal): New function. + (LOAD_INTERNAL): Use it. + + 2001-07-11 Alexandre Petit-Bianco + + * parse.y (verify_constructor_super): Compare anonymous class ctor + args with `valid_method_invocation_conversion_p.' + Fixes PR java/3285 + + 2001-07-10 Alexandre Petit-Bianco + + * lang-specs.h: Forbit the use if `-femit-class-file{s}' without + `-fsyntax-only.' Fixes PR java/3248 + + 2001-07-10 Alexandre Petit-Bianco + + * jcf-io.c (find_class): Clarified error message. Fixes PR java/2603 + + 2001-07-10 Alexandre Petit-Bianco + + * parse.h (INNER_ENCLOSING_SCOPE_CHECK): No `this' is fine if the + current function is static. Fixes PR java/1970 + + 2001-07-09 Alexandre Petit-Bianco + + * parse.y (patch_method_invocation): Add enclosing context to ctor + calls if necessary. Fixes PR java/2953 + + 2001-07-09 Alexandre Petit-Bianco + + * parse.y (resolve_package): Abort if qualified expression member + isn't right. + (qualify_ambiguous_name): Don't qualify as type if `this' in use. + Fixes PR java/1391 + + 2001-07-07 Zack Weinberg + + * verify.c: Don't use // comments. + + 2001-07-05 Tom Tromey + + * lang.c (flag_assume_compiled): Removed. + * java-tree.h (flag_assume_compiled): Removed. + * lang-options.h: Removed -ffile-list-file, -fuse-boehm-gc, + -fhash-synchronization, -fuse-divide-subroutine, + -fcheck-references, -femit-class-file, -femit-class-files, + -fassume-compiled. Updated --encoding information. Changed + -foutput-class-dir to `-d'. + + 2001-07-04 Daniel Berlin + + * jcf-parse.c (parse_class_file): Add lineno parameter to + debug_start_source_file call. + 2001-07-04 Joseph S. Myers * gcj.texi: Use gpl.texi. * Make-lang.in ($(srcdir)/java/gcj.info, java/gcj.dvi): Update dependencies and use doc/include in search path. ! 2001-07-03 Jeff Sturm ! * parse.y (fix_constructors): Test if a CALL_EXPR invokes ! `this'. If so, don't build instance initializers. ! 2001-07-03 Alexandre Petit-Bianco ! * parse.y (resolve_expression_name): Improved error message for ! inner class cases. Fixes PR java/1958 ! 2001-06-28 Gabriel Dos Reis ! * lang.c: #include diagnostic.h ! (lang_print_error): Add a `diagnostic_context *' parameter. ! (java_dummy_print): Likewise. ! * Make-lang.in (JAVA_LEX_C): Depend on diagnostic.h ! ! 2001-06-27 Alexandre Petit-Bianco ! ! * jcf-parse.c (gcc_mark_jcf): Test for a finished JCF. ! * jcf.h (typedef struct JCF): New bitfield `finished.' ! (JCF_FINISH): Set `finished.' ! (JCF_ZERO): Reset `finished.' ! Fixes PR java/2633 ! ! 2001-06-27 Alexandre Petit-Bianco ! ! * parse.y (class_body_declaration:): Don't install empty instance ! initializers. ! Fixes PR java/1314 ! ! 2001-06-27 Alexandre Petit-Bianco ! ! * class.c (set_super_info): Call `set_class_decl_access_flags.' ! (set_class_decl_access_flags): New function. ! * java-tree.h (set_class_decl_access_flags): New prototype. ! * jcf-parse.c (handle_innerclass_attribute): Read and set access flags. ! (parse_class_file): New local `decl_max_locals.' Take wide types ! into account to compute DECL_MAX_LOCALS. ! * parse.y (type_import_on_demand_declaration:): Ignore duplicate ! imports on demand. ! ! 2001-06-22 Jan van Male ! ! * zipfile.h: Use GCC_JCF_H instead of JCF_H. ! ! 2001-06-20 Alexandre Petit-Bianco ! ! * class.c (java_hash_tree_node): Fixed indentation in leading comment. ! * parse.y (do_resolve_class): Moved comments out to leading comment ! section. Removed local `start', New local `_ht' and ! `circularity_hash.' Record `enclosing' in hash table and search ! it to detect circularity. Use `enclosing' as an argument to ! `lookup_cl.' Free the hash table when done. ! ! 2001-06-19 Tom Tromey ! ! * lex.c (java_read_char): Disallow invalid and overlong ! sequences. Fixes PR java/2319. ! ! 2001-06-05 Jeff Sturm ! ! * decl.c (create_primitive_vtable): Don't call make_decl_rtl. 2001-06-04 Alexandre Petit-Bianco *************** *** 118,123 **** --- 1843,1860 ---- handle `qual_wfl' by code. (maybe_build_primttype_type_ref): Test `wfl' code. + 2001-05-23 Theodore Papadopoulo + + * Make-lang.in ($(srcdir)/java/gcj.info): Added dependencies on + fdl.texi. + (java/gcj.dvi): Use TEXI2DVI instead of custom tex calls. Create + the dvi file in the java directory. + + 2001-05-25 Sam TH + + * gen-table.pl javaop.h jcf.h lex.h, + parse.h: Fix header include guards. + 2001-05-23 Joseph S. Myers * jv-scan.c (version): Update copyright year. *************** *** 127,133 **** * jcf-parse.c (read_class): If class is from .class or .zip file and it's already been read, don't push/pop parser context. ! 2001-05-17 Per Bothner * jvspec.c (lang_specific_pre_link): Re-arrange the linker command line so the jvgenmain-generated main program comes first. --- 1864,1870 ---- * jcf-parse.c (read_class): If class is from .class or .zip file and it's already been read, don't push/pop parser context. ! 2001-05-18 Per Bothner * jvspec.c (lang_specific_pre_link): Re-arrange the linker command line so the jvgenmain-generated main program comes first. *************** *** 149,188 **** * check-init.c (check_init): Check JAVA_EXC_OBJ_EXPR not EXC_PTR_EXPR. * jcf-write.c (generate_bytecode_insns): Likewise. - 2001-05-12 Richard Henderson - - EH merge from mainline: - * java-tree.h (throw_node): Define as a single member of - java_global_trees instead of a separate array. - (JTI_THROW_NODE): New. - * decl.c (throw_node): Don't declare. - (init_decl_processing): Init a scalar throw_node. - Don't register it for gc. - * check-init.c (check_init): Reference scalar throw_node. - * expr.c (build_java_athrow): Likewise. - * jcf-write.c (generate_bytecode_insns): Likewise. - * parse.h (BUILD_THROW): Likewise. - - * decl.c (end_java_method): Do not save and restore - flag_non_call_exceptions. - * parse.y (source_end_java_method): Likewise. - * lang.c (flag_exceptions): Don't declare. - (java_init_options): Set flag_non_call_exceptions. Set - flag_exceptions here ... - (java_init): ... not here. - - * lang.c (flag_new_exceptions): Don't declare it. - (java_init_options): Or set it. - - * expr.c, parse.h: Use USING_SJLJ_EXCEPTIONS instead of - exceptions_via_longjmp. - - 2001-05-12 Richard Henderson - - * decl.c (end_java_method): Rename asynchronous_exceptions to - flag_non_call_exceptions. - * parse.y (source_end_java_method): Likewise. - 2001-05-07 Alexandre Petit-Bianco * parse.y (build_unresolved_array_type): Set --- 1886,1891 ---- *************** *** 191,211 **** 2001-05-07 Alexandre Petit-Bianco ! * parse.y (fix_constructors): Removed unecessary assignment to local. Moved assignment to `this$', fixed comments and indentation. (build_wfl_wrap): Fixed indentation. Fixes PR java/2598, java/2579 and java/2658. 2000-05-02 Jeff Sturm * expr.c (build_class_init): Move MODIFY_EXPR outside of COND_EXPR. Remove variable `call'. ! 2001-05-03 Mo DeJong ! * lex.c (java_new_lexer): Call iconv_close on temp handle used to ! check for byte swap. 2001-05-01 Tom Tromey --- 1894,1919 ---- 2001-05-07 Alexandre Petit-Bianco ! * parse.y (fix_constructors): Removed unnecessary assignment to local. Moved assignment to `this$', fixed comments and indentation. (build_wfl_wrap): Fixed indentation. Fixes PR java/2598, java/2579 and java/2658. + 2001-05-03 Mo DeJong + + * lex.c (java_new_lexer): Call iconv_close on temp handle used to + check for byte swap. + 2000-05-02 Jeff Sturm * expr.c (build_class_init): Move MODIFY_EXPR outside of COND_EXPR. Remove variable `call'. ! 2001-05-02 Kaveh R. Ghazi ! * decl.c: NULL_PTR -> NULL. ! * jcf-write.c: Likewise. 2001-05-01 Tom Tromey *************** *** 216,221 **** --- 1924,1933 ---- 2001-05-01 Per Bothner + * parse.h (REGISTER_IMPORT): Use tree_cons instead of chainon. + + 2001-05-01 Per Bothner + * parse.y (java_pop_parser_context): The TREE_VALUE of a link in the import_list contains the name, not the TREE_PURPOSE. *************** *** 236,242 **** 2001-04-27 Bryce McKinlay * parse.y (do_resolve_class): Check for cyclic inheritance during ! inner class resolution. 2001-04-27 Per Bothner --- 1948,1954 ---- 2001-04-27 Bryce McKinlay * parse.y (do_resolve_class): Check for cyclic inheritance during ! inner class resolution. 2001-04-27 Per Bothner *************** *** 266,279 **** DECL_CONTEXT, instead use new find_methodref_with_class_index function. If context changed from interface to class, don't use invokeinterface. 2001-04-25 Alexandre Oliva * config-lang.in (target_libs): Copy from $libgcj_saved. ! 2001-04-23 Kaveh R. Ghazi ! * jvspec.c (lang_specific_driver): Use concat in lieu of ! xmalloc/sprintf. 2001-04-20 Per Bothner --- 1978,2003 ---- DECL_CONTEXT, instead use new find_methodref_with_class_index function. If context changed from interface to class, don't use invokeinterface. + 2001-04-25 Per Bothner + + * verify.c (verify_jvm_instructions): For field instructions, + check that field index is valid. For invoke instructions, check that + method index is valid. + 2001-04-25 Alexandre Oliva * config-lang.in (target_libs): Copy from $libgcj_saved. ! 2001-04-25 Bryce McKinlay ! * decl.c (init_decl_processing): Add new class "protectionDomain" ! field. ! * class.c (make_class_data): Set initial value for "protectionDomain". ! ! 2001-04-22 Kaveh R. Ghazi ! ! * jvspec.c (lang_specific_driver): Fix memory allocation ! deficit, by using concat in lieu of xmalloc/sprintf. 2001-04-20 Per Bothner *************** *** 289,294 **** --- 2013,2024 ---- (yyparse): Do layout_class and JCF_FINISh here instead, in pass 2. * parse.y: Don't need to set CLASS_LOADED_P for array types. + 2001-04-11 Kaveh R. Ghazi + + * Make-lang.in (java/boehm.o): Depend on toplev.h. + + * boehm.c: Include toplev.h. + 2001-04-06 Tom Tromey Alexandre Petit-Bianco *************** *** 326,349 **** Fixes PR java/1315. 2001-04-04 Alexandre Petit-Bianco ! * parse.y (resolve_qualified_expression_name): Pass field's DECL_CONTEXT to `not_accessible_p.' (not_accessible_p): Changed parameters order in `inherits_from_p' invokation. 2001-04-04 Per Bothner * java-tree.h (CONSTANT_VALUE_P): New macro. * jcf-write.c (generate_classfile): Use CONSTANT_VALUE_P. * parse.y (maybe_build_class_init_for_field): New static function. (resolve_expression_name, resolve_field_access): Use ! maybe_build_class_init_for_field instead of build_class_init This does not do the init if the field is compile-time-constant. (resolve_field_access): Simplify. * parse.y (fold_constant_for_init): Merge test into switch. 2001-03-30 Alexandre Petit-Bianco * parse-scan.y (array_type:): Rewritten. --- 2056,2095 ---- Fixes PR java/1315. 2001-04-04 Alexandre Petit-Bianco ! * parse.y (resolve_qualified_expression_name): Pass field's DECL_CONTEXT to `not_accessible_p.' (not_accessible_p): Changed parameters order in `inherits_from_p' invokation. + 2001-03-27 Andrew Haley + + * lang-options.h: Add flag_check_references. + 2001-04-04 Per Bothner * java-tree.h (CONSTANT_VALUE_P): New macro. * jcf-write.c (generate_classfile): Use CONSTANT_VALUE_P. * parse.y (maybe_build_class_init_for_field): New static function. (resolve_expression_name, resolve_field_access): Use ! maybe_build_class_init_for_field instead of build_class_init This does not do the init if the field is compile-time-constant. (resolve_field_access): Simplify. * parse.y (fold_constant_for_init): Merge test into switch. + 2001-04-03 Zack Weinberg + + * Make-lang.in (buffer.o, check-init.o, class.o): Don't depend + on gansidecl.h. + * buffer.c, jvgenmain.c: Don't include gansidecl.h. + + 2001-04-02 Zack Weinberg + + * expr.c (pop_type_0): Save the result of the first + lang_printable_name call in a scratch buffer, so it + won't be clobbered by the second call. + 2001-03-30 Alexandre Petit-Bianco * parse-scan.y (array_type:): Rewritten. *************** *** 362,367 **** --- 2108,2198 ---- (get_boehm_type_descriptor): Set type on returned value to be a pointer length integer. + 2001-03-28 Kaveh R. Ghazi + + * expr.c (pop_type_0): Call `concat' rather than building the + string manually. + (pop_type): Add format specifier in call to `error'. + + * parse.y (patch_method_invocation): Avoid casting away + const-ness. + + 2001-03-28 Jeffrey Oldham + + * jvgenmain.c (do_mangle_classname): End string constant with '\0'. + + 2001-03-28 Richard Henderson + + IA-64 ABI Exception Handling: + * Make-lang.in (except.o): Don't depend on eh-common.h. + * check-init.c (check_init): Handle EXC_PTR_EXPR. + * decl.c (init_decl_processing) [throw_node]: No _Jv_Sjlj_Throw. + [soft_exceptioninfo_call_node]: Remove. + [eh_personality_libfunc, lang_eh_runtime_type]: New. + (end_java_method): No emit_handlers. + * except.c (java_set_exception_lang_code): Remove. + (method_init_exceptions): Don't call it. + (prepare_eh_table_type): No CATCH_ALL_TYPE. + (build_exception_object_ref): New. + (expand_end_java_handler): Update for except.h name changes. + (emit_handlers, expand_resume_after_catch): Remove. + * expr.c (java_lang_expand_expr): Update for except.h name changes. + (process_jvm_instruction): Use build_exception_object_ref. + * java-tree.h (JTI_SOFT_EXCEPTIONINFO_CALL_NODE): Remove. + (soft_exceptioninfo_call_node): Remove. + (build_exception_object_ref): Declare. + * jcf-write.c (generate_bytecode_insns) [CALL_EXPR]: No + soft_exceptioninfo_call_node. Move processing ... + [EXC_PTR_EXPR]: ... here. + * parse.h (BUILD_ASSIGN_EXCEPTION_INFO): Remove dead code. + * parse.y (catch_clause_parameter): Use build_exception_object_ref. + (source_end_java_method): No java_set_exception_lang_code or + emit_handlers. + (build_dot_class_method): Use build_exception_object_ref. + (try_reference_assignconv): Check EXC_PTR_EXPR not + soft_exceptioninfo_call_node. + + 2001-03-28 Richard Henderson + + * java-tree.h (throw_node): Define as a single member of + java_global_trees instead of a separate array. + (JTI_THROW_NODE): New. + * decl.c (throw_node): Don't declare. + (init_decl_processing): Init a scalar throw_node. + Don't register it for gc. + * check-init.c (check_init): Reference scalar throw_node. + * expr.c (build_java_athrow): Likewise. + * jcf-write.c (generate_bytecode_insns): Likewise. + * parse.h (BUILD_THROW): Likewise. + + 2001-03-28 Richard Henderson + + * decl.c (end_java_method): Do not save and restore + flag_non_call_exceptions. + * parse.y (source_end_java_method): Likewise. + * lang.c (flag_exceptions): Don't declare. + (java_init_options): Set flag_non_call_exceptions. Set + flag_exceptions here ... + (java_init): ... not here. + + 2001-03-27 Richard Henderson + + * expr.c, parse.h: Use USING_SJLJ_EXCEPTIONS instead of + exceptions_via_longjmp. + + * lang.c (flag_new_exceptions): Don't declare it. + (java_init_options): Or set it. + + 2001-03-27 Richard Henderson + + * decl.c (end_java_method): Rename asynchronous_exceptions to + flag_non_call_exceptions. + * parse.y (source_end_java_method): Likewise. + + 2001-03-27 Kaveh R. Ghazi + + * Make-lang.in: Depend on $(SYSTEM_H), not system.h. + 2001-03-26 Mark Mitchell * parse.h (DECL_END_SOURCE_LINE): Don't rely on DECL_FRAME_SIZE. *************** *** 371,376 **** --- 2202,2215 ---- * parse.y (find_as_inner_class): Follow current package indications not to mistakingly load an unrelated class. + 2001-03-25 Kaveh R. Ghazi + + * constants.c (PUTN): Use memcpy, not bcopy. + + * lex.c (java_read_char): Use memmove, not bcopy. + + * parse.y (java_parser_context_resume): Use memcpy, not bcopy. + 2001-03-23 Per Bothner * verify.c (verify_jvm_instructions): Replace 3 pop_type by POP_TYPE *************** *** 384,389 **** --- 2223,2229 ---- However, do emit the following goto even if try_block is empty. Defer freeing exception_decl until after the finalizer, to make sure the local isn't reused in the finalizer. Fixes PR java/1208. + * parse.y (java_complete_lhs): If the try-clause is empty, just return the finally-clause and vice versa. *************** *** 407,412 **** --- 2247,2272 ---- (lang_f_options): New entry `force-classes-archive-check.' Fixes PR java/1213. + 2001-02-07 Andrew Haley + + * gcj.texi (Configure-time Options): Add -fcheck-references. + * expr.c (build_java_indirect_ref): New function. + (java_check_reference): New function. + (build_java_array_length_access): Use build_java_indirect_ref to + check for null references. + (build_java_arrayaccess): Likewise. + (build_get_class): Likewise. + (build_field_ref): Likewise. + (invoke_build_dtable): Likewise. + (build_invokeinterface): Likewise. + * lang.c (lang_f_options): Add flag_check_references. + * jvspec.c (jvgenmain_spec): Add flag_check_references. + * java-tree.h (flag_check_references): New variable. + * lang.c (flag_check_references): Likewise. + * parse.y (patch_invoke): Use java_check_reference. + (patch_assignment): Allow for extra nesting in + _Jv_CheckArrayStore. + 2001-03-23 Bryce McKinlay * gjavah.c (cxx_keywords): Update from the definitive list in cp/lex.c. *************** *** 420,433 **** 2001-03-21 Bryce McKinlay ! * gjavah.c (process_file): Mark interface definitions with "__attribute__ ((java_interface))". - 2001-03-22 Zack Weinberg - - * lang-specs.h: Add zero initializer for cpp_spec field to - all array elements. - 2001-03-21 Alexandre Petit-Bianco * class.c (layout_class): Fixed push_super_field's second --- 2280,2288 ---- 2001-03-21 Bryce McKinlay ! * gjavah.c (process_file): Mark interface definitions with "__attribute__ ((java_interface))". 2001-03-21 Alexandre Petit-Bianco * class.c (layout_class): Fixed push_super_field's second *************** *** 506,512 **** * class.c (build_static_field_ref): Call make_decl_rtl() after setting the DECL_EXTERNAL flag. ! 2001-03-17 Per Bothner * decl.c (clear_binding_level): Fix initializer (broke 03-15). --- 2361,2367 ---- * class.c (build_static_field_ref): Call make_decl_rtl() after setting the DECL_EXTERNAL flag. ! 2001-03-17 Per Bothner * decl.c (clear_binding_level): Fix initializer (broke 03-15). *************** *** 561,588 **** * mangle.c (mangle_record_type): Rename 'from_pointer' argument to 'for_pointer'. If this type is for a pointer (argument) mangling, ! don't surround the element with 'N..E' if the type name is unqualified. - 2001-03-15 Zack Weinberg - - * class.c, decl.c, java-tree.h: Replace all uses of 'boolean' with - 'bool'. - 2001-03-14 Mark Mitchell ! * class.c (build_static_field_ref): Likewise. (make_method_value): Likewise. (get_dispatch_table): Likewise. - 2001-03-14 Mark Mitchell - * decl.c (push_jvm_slot): Use COPY_DECL_RTL, DECL_RTL_SET_P, etc. 2001-03-07 Tom Tromey * config-lang.in (lang_requires): Define. 2001-03-05 Per Bothner Fix a problem where rest_of_decl_compilation applied to --- 2416,2442 ---- * mangle.c (mangle_record_type): Rename 'from_pointer' argument to 'for_pointer'. If this type is for a pointer (argument) mangling, ! don't surround the element with 'N..E' if the type name is unqualified. 2001-03-14 Mark Mitchell ! * class.c (build_static_field_ref): Use COPY_DECL_RTL, ! DECL_RTL_SET_P, etc. (make_method_value): Likewise. (get_dispatch_table): Likewise. * decl.c (push_jvm_slot): Use COPY_DECL_RTL, DECL_RTL_SET_P, etc. 2001-03-07 Tom Tromey * config-lang.in (lang_requires): Define. + 2001-03-07 Brad Lucier + + * typeck.c (convert): Check flag_unsafe_math_optimizations, + not flag_fast_math. + 2001-03-05 Per Bothner Fix a problem where rest_of_decl_compilation applied to *************** *** 593,598 **** --- 2447,2462 ---- (make_class_data): Define class_dtable_decl. * java-tree.h (JTI_CLASS_DTABLE_DECL, class_dtable_decl): Removed. + 2001-03-01 Zack Weinberg + + * java/class.c, java/decl.c, java/java-tree.h: Replace all + uses of 'boolean' with 'bool'. + + 2001-03-01 Zack Weinberg + + * lang-specs.h: Add zero initializer for cpp_spec field to all + array elements. + 2001-02-16 Per Bothner Handle compiling multiple input files at once, and @FILE syntax. *************** Fri Feb 23 15:28:39 2001 Richard Kenner *** 633,643 **** 2001-02-19 Bryce McKinlay ! * parse.y (parser_check_super_interface): Don't call check_pkg_class_access for an inner interface. ! (parser_check_super): Don't call check_pkg_class_access for inner class. ! (do_resolve_class): Simplify enclosing type loop. Don't call check_pkg_class_access if CL and DECL are not set. (find_in_imports_on_demand): Set DECL if class_type needed to be loaded. Don't call check_pkg_class_access for an inner class. --- 2497,2507 ---- 2001-02-19 Bryce McKinlay ! * parse.y (parser_check_super_interface): Don't call check_pkg_class_access for an inner interface. ! (parser_check_super): Don't call check_pkg_class_access for inner class. ! (do_resolve_class): Simplify enclosing type loop. Don't call check_pkg_class_access if CL and DECL are not set. (find_in_imports_on_demand): Set DECL if class_type needed to be loaded. Don't call check_pkg_class_access for an inner class. *************** Fri Feb 23 15:28:39 2001 Richard Kenner *** 659,670 **** * expr.c (build_instanceof): Check for arrays when trying fold to false. 2001-02-15 Bryce McKinlay * Make-lang.in (jvspec.o): Modify rule to match that of cp/g++spec.o. 2001-02-14 Tom Tromey ! Alexandre Petit-Bianco Fix for PR java/1261. * typeck.c (build_java_array_type): Add public `clone' method to --- 2523,2539 ---- * expr.c (build_instanceof): Check for arrays when trying fold to false. + 2001-02-15 Jim Meyering + + * Make-lang.in (java.install-common): Depend on `installdirs'. + (java.install-info): Likewise. + 2001-02-15 Bryce McKinlay * Make-lang.in (jvspec.o): Modify rule to match that of cp/g++spec.o. 2001-02-14 Tom Tromey ! Alexandre Petit-Bianco Fix for PR java/1261. * typeck.c (build_java_array_type): Add public `clone' method to *************** Fri Feb 23 15:28:39 2001 Richard Kenner *** 700,706 **** 2001-02-13 Alexandre Petit-Bianco * decl.c (classdollar_identifier_node): Initialize. ! * java-tree.h (enum java_tree_index): New entry `JTI_CLASSDOLLAR_IDENTIFIER_NODE.' (classdollar_identifier_node): New macro. (ID_CLASSDOLLAR_P): Likewise. --- 2569,2575 ---- 2001-02-13 Alexandre Petit-Bianco * decl.c (classdollar_identifier_node): Initialize. ! * java-tree.h (enum java_tree_index): New entry `JTI_CLASSDOLLAR_IDENTIFIER_NODE.' (classdollar_identifier_node): New macro. (ID_CLASSDOLLAR_P): Likewise. *************** Fri Feb 23 15:28:39 2001 Richard Kenner *** 734,740 **** * Make-lang.in (JAVA_OBJS): Added java/mangle_name.o (JVGENMAIN_OBJS): Likewise. ! * java-tree.h (append_gpp_mangled_name): New prototype. * jcf-parse.c (ggc_mark_jcf): Argument now `void *.' Removed cast calling `gcc_add_root.' * jvgenmain.c (mangle_obstack): New global, initialized. --- 2603,2609 ---- * Make-lang.in (JAVA_OBJS): Added java/mangle_name.o (JVGENMAIN_OBJS): Likewise. ! * java-tree.h (append_gpp_mangled_name): New prototype. * jcf-parse.c (ggc_mark_jcf): Argument now `void *.' Removed cast calling `gcc_add_root.' * jvgenmain.c (mangle_obstack): New global, initialized. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 852,858 **** * lex.c (java_get_line_col): Likewise. * jcf-parse.c (load_class): Make errors non-fatal. * lex.c (byteswap_init, need_byteswap): Only #ifdef HAVE_ICONV. ! 2001-02-01 Bryce McKinlay * jvgenmain.c (class_mangling_suffix): Remove unused string. --- 2721,2727 ---- * lex.c (java_get_line_col): Likewise. * jcf-parse.c (load_class): Make errors non-fatal. * lex.c (byteswap_init, need_byteswap): Only #ifdef HAVE_ICONV. ! 2001-02-01 Bryce McKinlay * jvgenmain.c (class_mangling_suffix): Remove unused string. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 955,961 **** * parse.y (lookup_package_type_and_set_next): Deleted. (resolve_package): Removed unnecessary code. (find_applicable_accessible_methods_list): `finit$' can't be ! inherited. * verify.c (pop_argument_types): Added missing prototype. 2001-01-23 Bryce McKinlay --- 2824,2830 ---- * parse.y (lookup_package_type_and_set_next): Deleted. (resolve_package): Removed unnecessary code. (find_applicable_accessible_methods_list): `finit$' can't be ! inherited. * verify.c (pop_argument_types): Added missing prototype. 2001-01-23 Bryce McKinlay *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1096,1102 **** * expr.c (expand_java_field_op): Assigning to a final field outside an initializer does not violate JVM spec, so should be warning, not error. (Sun's verifier does not complain - though MicroSoft's does.) ! 2001-01-12 Joseph S. Myers * gjavah.c (version), jcf-dump.c (version): Update copyright year --- 2965,2971 ---- * expr.c (expand_java_field_op): Assigning to a final field outside an initializer does not violate JVM spec, so should be warning, not error. (Sun's verifier does not complain - though MicroSoft's does.) ! 2001-01-12 Joseph S. Myers * gjavah.c (version), jcf-dump.c (version): Update copyright year *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1124,1130 **** * expr.c (build_known_method_def): Likewise. (build_jni_stub): Likewise. (java_lang_expand_expr): Likewise. ! 2001-01-10 Tom Tromey * jvspec.c (jvgenmain_spec): Omit -fencoding from cc1 invocation. --- 2993,2999 ---- * expr.c (build_known_method_def): Likewise. (build_jni_stub): Likewise. (java_lang_expand_expr): Likewise. ! 2001-01-10 Tom Tromey * jvspec.c (jvgenmain_spec): Omit -fencoding from cc1 invocation. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1141,1147 **** * parse.y (patch_method_invocation): Message tuned for constructors. (not_accessible_p): Grant `private' access from within enclosing contexts. ! 2001-01-07 Alexandre Petit-Bianco All files with updated copyright when applicable. --- 3010,3016 ---- * parse.y (patch_method_invocation): Message tuned for constructors. (not_accessible_p): Grant `private' access from within enclosing contexts. ! 2001-01-07 Alexandre Petit-Bianco All files with updated copyright when applicable. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1152,1158 **** (build_class_ref): Call `java_mangle_class_field' instead of `mangle_class_field.' (build_dtable_decl): Rewritten to call `java_mangle_vtable.' ! (layout_class): Call `java_mangle_decl' instead of `mangle_static_field.' (cxx_keywords): Initialized static array moved to `lex.c.' (layout_class_method): Changed leading comment. Simplified to --- 3021,3027 ---- (build_class_ref): Call `java_mangle_class_field' instead of `mangle_class_field.' (build_dtable_decl): Rewritten to call `java_mangle_vtable.' ! (layout_class): Call `java_mangle_decl' instead of `mangle_static_field.' (cxx_keywords): Initialized static array moved to `lex.c.' (layout_class_method): Changed leading comment. Simplified to *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1171,1177 **** * jvgenmain.c (main_method_prefix): Global variable removed. (main_method_suffix): Likewise. (do_mangle_classname): New function. ! (main): Call it. Format changed to accomodate new mangling scheme. * lex.c: (utf8_cmp): Conditionally prototyped. (cxx_keywords): Moved from class.c, conditionally defined. (utf8_cmp, cxx_keyword_p): Likewise. --- 3040,3046 ---- * jvgenmain.c (main_method_prefix): Global variable removed. (main_method_suffix): Likewise. (do_mangle_classname): New function. ! (main): Call it. Format changed to accommodate new mangling scheme. * lex.c: (utf8_cmp): Conditionally prototyped. (cxx_keywords): Moved from class.c, conditionally defined. (utf8_cmp, cxx_keyword_p): Likewise. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1191,1197 **** `emit_unicode_mangled_name.' Turned static. `mangle_obstack' replaces `obstack', removed from the parameter list. (append_gpp_mangled_name): Turned static. `mangle_obstack' ! replaces parameter `obstack', removed from the parameter list. Call `append_unicode_mangled_name' instead of `emit_unicode_mangled_name. (append_gpp_mangled_classtype): Removed. (compression_table, compression_next): New static variables. --- 3060,3066 ---- `emit_unicode_mangled_name.' Turned static. `mangle_obstack' replaces `obstack', removed from the parameter list. (append_gpp_mangled_name): Turned static. `mangle_obstack' ! replaces parameter `obstack', removed from the parameter list. Call `append_unicode_mangled_name' instead of `emit_unicode_mangled_name. (append_gpp_mangled_classtype): Removed. (compression_table, compression_next): New static variables. *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1209,1215 **** 2001-01-05 Bryce McKinlay From patha@softlab.ericsson.se: ! * parse.y (switch_label): Use build, not build1, to construct DEFAULT_EXPR. 2001-01-04 Neil Booth --- 3078,3084 ---- 2001-01-05 Bryce McKinlay From patha@softlab.ericsson.se: ! * parse.y (switch_label): Use build, not build1, to construct DEFAULT_EXPR. 2001-01-04 Neil Booth *************** Sun Feb 4 15:52:44 2001 Richard Kenner *** 1224,1239 **** Shorten primitive array allocation path: * decl.c (init_decl_processing): Use _Jv_NewPrimArray not _Jv_NewArray to create new primitive arrays. ! * expr.c (build_newarray): If generating native code, call soft_newarray_node with a reference to the primitive TYPE identifier instead of type_value. ! 2000-12-17 Bryce McKinlay Fix for PRs gcj/312 and gcj/253: * parse.y (valid_ref_assignconv_cast_p): Load classes for source and dest if they arn't already. ! * class.c (layout_class): Call maybe_layout_super_class on superinterfaces also, but only if compiling from bytecode. Fix for PR gcj/373: --- 3093,3108 ---- Shorten primitive array allocation path: * decl.c (init_decl_processing): Use _Jv_NewPrimArray not _Jv_NewArray to create new primitive arrays. ! * expr.c (build_newarray): If generating native code, call soft_newarray_node with a reference to the primitive TYPE identifier instead of type_value. ! 2000-12-17 Bryce McKinlay Fix for PRs gcj/312 and gcj/253: * parse.y (valid_ref_assignconv_cast_p): Load classes for source and dest if they arn't already. ! * class.c (layout_class): Call maybe_layout_super_class on superinterfaces also, but only if compiling from bytecode. Fix for PR gcj/373: *************** Thu Nov 23 02:19:14 2000 J"orn Rennecke *** 1742,1748 **** * jcf-parse.c (get_constant): Don't mess with obstacks. (read_class): Likewise. (jcf_parse): Likewise. ! * lex.c (expresion_obstack): Remove. (java_lex): Don't use obstack_free. * parse.h (exit_java_complete_class): Don't mess with obstacks. (MANGLE_OUTER_LOCAL_VARIABLE_NAME): Adjust. --- 3611,3617 ---- * jcf-parse.c (get_constant): Don't mess with obstacks. (read_class): Likewise. (jcf_parse): Likewise. ! * lex.c (expression_obstack): Remove. (java_lex): Don't use obstack_free. * parse.h (exit_java_complete_class): Don't mess with obstacks. (MANGLE_OUTER_LOCAL_VARIABLE_NAME): Adjust. *************** Thu Nov 23 02:19:14 2000 J"orn Rennecke *** 1752,1758 **** (add_inner_class_fields): Adjust calls to MANGLE_* macros. (lookup_field_wrapper): Likewise. (obtain_incomplete_type): Don't mess with obstacks. ! (build_alias_initializer_paramter_list): Adjust calls to MANGLE_* macros. (craft_constructor): Don't mess with obstacks. (safe_layout_class): Likewise. --- 3621,3627 ---- (add_inner_class_fields): Adjust calls to MANGLE_* macros. (lookup_field_wrapper): Likewise. (obtain_incomplete_type): Don't mess with obstacks. ! (build_alias_initializer_parameter_list): Adjust calls to MANGLE_* macros. (craft_constructor): Don't mess with obstacks. (safe_layout_class): Likewise. *************** Tue Oct 3 13:44:37 2000 Alexandre Peti *** 1857,1863 **** Wed Sep 13 16:06:52 2000 Alexandre Petit-Bianco * decl.c (give_name_to_locals): New local `code_offset'. Call ! `maybe_adjust_start_pc'. * expr.c (note_instructions): New function. (expand_byte_code): Don't collect insn starts here. (peek_opcode_at_pc): New function. --- 3726,3732 ---- Wed Sep 13 16:06:52 2000 Alexandre Petit-Bianco * decl.c (give_name_to_locals): New local `code_offset'. Call ! `maybe_adjust_start_pc'. * expr.c (note_instructions): New function. (expand_byte_code): Don't collect insn starts here. (peek_opcode_at_pc): New function. *************** Sun Aug 6 00:47:24 2000 Ovidiu Predesc *** 2291,2297 **** entering the function. `fprintf' format modified not to use INNER_QUALIFIER. (report_class_declaration): Assign `package_name' and ! `current_class' to NULL separatly. 2000-07-31 Alexandre Petit-Bianco --- 4160,4166 ---- entering the function. `fprintf' format modified not to use INNER_QUALIFIER. (report_class_declaration): Assign `package_name' and ! `current_class' to NULL separately. 2000-07-31 Alexandre Petit-Bianco *************** Sun Aug 6 00:47:24 2000 Ovidiu Predesc *** 2547,2553 **** 2000-06-25 Alexandre Petit-Bianco * parse.y (do_resolve_class): Minor optimiztion in the package ! list search. Removed unecessary test and return statement. (valid_ref_assignconv_cast_p): Order of arguments to enclosing_context_p fixed. --- 4416,4422 ---- 2000-06-25 Alexandre Petit-Bianco * parse.y (do_resolve_class): Minor optimiztion in the package ! list search. Removed unnecessary test and return statement. (valid_ref_assignconv_cast_p): Order of arguments to enclosing_context_p fixed. *************** Tue Jun 6 11:39:05 2000 Tom Tromey * class.c (get_dispatch_table): Build the vtable dummy entry list ! element with a null purpose. Fixed leading comment. (build_dtable_decl): Build an accurate dtable type when appropriate ! and use it. 2000-06-02 Richard Henderson --- 4555,4563 ---- Fri Jun 2 16:48:55 2000 Alexandre Petit-Bianco * class.c (get_dispatch_table): Build the vtable dummy entry list ! element with a null purpose. Fixed leading comment. (build_dtable_decl): Build an accurate dtable type when appropriate ! and use it. 2000-06-02 Richard Henderson *************** Fri Jun 2 16:48:55 2000 Alexandre Peti *** 2750,2761 **** Thu Apr 27 17:47:34 2000 Alexandre Petit-Bianco * jcf-parse.c (jcf_parse_source): Reset current_class and ! current_function_decl to NULL before parsing a new file. Thu Apr 27 17:25:33 2000 Alexandre Petit-Bianco * parse.y (block_end:): If the collected block doesn't feature a ! statement, insert an empty statement. 2000-04-17 Alexandre Petit-Bianco --- 4619,4630 ---- Thu Apr 27 17:47:34 2000 Alexandre Petit-Bianco * jcf-parse.c (jcf_parse_source): Reset current_class and ! current_function_decl to NULL before parsing a new file. Thu Apr 27 17:25:33 2000 Alexandre Petit-Bianco * parse.y (block_end:): If the collected block doesn't feature a ! statement, insert an empty statement. 2000-04-17 Alexandre Petit-Bianco *************** Thu Apr 27 17:25:33 2000 Alexandre Peti *** 2794,2800 **** Wed May 17 17:27:44 2000 Andrew Cagney * lang.c (lang_decode_option): Update -Wunused flags by calling ! set_Wunused. * decl.c (poplevel): Replace warn_unused with warn_unused_label. 2000-05-09 Zack Weinberg --- 4663,4669 ---- Wed May 17 17:27:44 2000 Andrew Cagney * lang.c (lang_decode_option): Update -Wunused flags by calling ! set_Wunused. * decl.c (poplevel): Replace warn_unused with warn_unused_label. 2000-05-09 Zack Weinberg *************** Wed May 17 17:27:44 2000 Andrew Cagney *** 2901,2907 **** Wed Apr 26 14:29:33 2000 Alexandre Petit-Bianco * decl.c (complete_start_java_method): Don't call _Jv_InitClass ! from 2000-04-26 Tom Tromey --- 4770,4776 ---- Wed Apr 26 14:29:33 2000 Alexandre Petit-Bianco * decl.c (complete_start_java_method): Don't call _Jv_InitClass ! from 2000-04-26 Tom Tromey *************** Wed Apr 26 14:29:33 2000 Alexandre Peti *** 2927,2937 **** Mon Apr 24 14:59:36 2000 Alexandre Petit-Bianco * parse.y (end_class_declaration): Reset the interface number ! counter. 2000-04-24 Alexandre Petit-Bianco ! * parse.y (source_start_java_method): Deleted unecessary code. (patch_method_invocation): Fixed comment. 2000-04-24 Robert Lipe --- 4796,4806 ---- Mon Apr 24 14:59:36 2000 Alexandre Petit-Bianco * parse.y (end_class_declaration): Reset the interface number ! counter. 2000-04-24 Alexandre Petit-Bianco ! * parse.y (source_start_java_method): Deleted unnecessary code. (patch_method_invocation): Fixed comment. 2000-04-24 Robert Lipe *************** Thu Apr 20 17:41:28 2000 Mo DeJong --- 4825,4832 ---- * parse.h (INTERFACE_INNER_MODIFIERS): New macro. * parse.y (check_class_interface_creation): Fixed comments. Select ! permitted modifiers for (inner) interfaces. Changed error message ! to report rejected modifiers used with local classes. 2000-04-20 Alexandre Petit-Bianco *************** Tue Mar 14 17:15:41 2000 Alexandre Peti *** 3281,3311 **** there are remaining qualifiers. Take into account `q' might have been cleared after re-qualification. * parse.y (patch_method_invocation): New local `resolved'. ! Section dealing with qualified expression rewritten to use ! resolve_field_access. Mon Mar 13 12:21:13 2000 Alexandre Petit-Bianco * parse.h (PUSH_CPC): Fixed indentation. (DEBUG_CPC): New macro. (SET_CPC_INITIALIZER_STMT, SET_CPC_STATIC_INITIALIZER_STMT, ! SET_CPC_INSTANCE_INITIALIZER_STMT): New macros. * parse.y (class_body_declaration:): Use ! SET_CPC_INSTANCE_INITIALIZER_STMT. (method_declaration:): Check for null current_function_decl. (static_initializer:): Use SET_CPC_STATIC_INITIALIZER_STMT. (java_parser_context_pop_initialized_field): Better handling of ! empty lists. (maybe_make_nested_class_name): Mark nested class name as ! qualified when necessary. (end_class_declaration): Don't call java_parse_context_resume when ! one or more error occured. (add_inner_class_fields): Use SET_CPC_INITIALIZER_STMT. (register_fields): Use SET_CPC_STATIC_INITIALIZER_STMT and ! SET_CPC_INITIALIZER_STMT. (method_header): Check for inner classes declaring static methods. (resolve_qualified_expression_name): Handle situation where `this' ! is implied. Mon Mar 13 11:36:51 2000 Hans Boehm --- 5150,5180 ---- there are remaining qualifiers. Take into account `q' might have been cleared after re-qualification. * parse.y (patch_method_invocation): New local `resolved'. ! Section dealing with qualified expression rewritten to use ! resolve_field_access. Mon Mar 13 12:21:13 2000 Alexandre Petit-Bianco * parse.h (PUSH_CPC): Fixed indentation. (DEBUG_CPC): New macro. (SET_CPC_INITIALIZER_STMT, SET_CPC_STATIC_INITIALIZER_STMT, ! SET_CPC_INSTANCE_INITIALIZER_STMT): New macros. * parse.y (class_body_declaration:): Use ! SET_CPC_INSTANCE_INITIALIZER_STMT. (method_declaration:): Check for null current_function_decl. (static_initializer:): Use SET_CPC_STATIC_INITIALIZER_STMT. (java_parser_context_pop_initialized_field): Better handling of ! empty lists. (maybe_make_nested_class_name): Mark nested class name as ! qualified when necessary. (end_class_declaration): Don't call java_parse_context_resume when ! one or more error occurred. (add_inner_class_fields): Use SET_CPC_INITIALIZER_STMT. (register_fields): Use SET_CPC_STATIC_INITIALIZER_STMT and ! SET_CPC_INITIALIZER_STMT. (method_header): Check for inner classes declaring static methods. (resolve_qualified_expression_name): Handle situation where `this' ! is implied. Mon Mar 13 11:36:51 2000 Hans Boehm *************** Mon Mar 6 18:07:07 2000 Richard Kenner *** 3389,3397 **** Thu Mar 2 15:18:33 2000 Alexandre Petit-Bianco * check-init.c (check_init): Removed dead code. Handle (blank) ! final variables. * parse.y (declare_local_variables): New local `final_p', set it ! and use it to initialize LOCAL_FINAL. (check_final_assignment): Only check FIELD_DECLs. 2000-02-17 Tom Tromey --- 5258,5266 ---- Thu Mar 2 15:18:33 2000 Alexandre Petit-Bianco * check-init.c (check_init): Removed dead code. Handle (blank) ! final variables. * parse.y (declare_local_variables): New local `final_p', set it ! and use it to initialize LOCAL_FINAL. (check_final_assignment): Only check FIELD_DECLs. 2000-02-17 Tom Tromey *************** Fri Feb 25 18:41:31 2000 Alexandre Peti *** 3488,3502 **** Fri Feb 25 18:47:25 2000 Alexandre Petit-Bianco * jcf-write.c (generate_bytecode_insns): TRY_FINALLY_EXPR: ! initialize locals to avoid warnings. Local `exception_type' moved into if statement. Fri Feb 25 18:00:37 2000 Alexandre Petit-Bianco * parse.y (resolve_expression_name): Use `orig' as a second ! argument to resolve_field_access. ! (resolve_field_access): Removed unecessary code when dealing with ! static fields. Wed Feb 23 17:41:50 2000 Alexandre Petit-Bianco --- 5357,5371 ---- Fri Feb 25 18:47:25 2000 Alexandre Petit-Bianco * jcf-write.c (generate_bytecode_insns): TRY_FINALLY_EXPR: ! initialize locals to avoid warnings. Local `exception_type' moved into if statement. Fri Feb 25 18:00:37 2000 Alexandre Petit-Bianco * parse.y (resolve_expression_name): Use `orig' as a second ! argument to resolve_field_access. ! (resolve_field_access): Removed unnecessary code when dealing with ! static fields. Wed Feb 23 17:41:50 2000 Alexandre Petit-Bianco *************** Wed Nov 03 02:16:00 PST 1999 Pekka Nika *** 3538,3544 **** * decl.c (INT_TYPE_SIZE): Define if necessary. (expand_java_return): Handle the case of a native integer smaller ! than a JVM integer. 2000-02-18 Martin von Loewis --- 5407,5413 ---- * decl.c (INT_TYPE_SIZE): Define if necessary. (expand_java_return): Handle the case of a native integer smaller ! than a JVM integer. 2000-02-18 Martin von Loewis *************** Wed Nov 03 02:16:00 PST 1999 Pekka Nika *** 3549,3555 **** Thu Feb 17 14:30:37 2000 Alexandre Petit-Bianco * jcf-write.c (generate_bytecode_insns): Don't generate empty ! `finally' clauses. Thu Feb 17 13:20:58 2000 Alexandre Petit-Bianco --- 5418,5424 ---- Thu Feb 17 14:30:37 2000 Alexandre Petit-Bianco * jcf-write.c (generate_bytecode_insns): Don't generate empty ! `finally' clauses. Thu Feb 17 13:20:58 2000 Alexandre Petit-Bianco *************** Thu Feb 17 13:20:58 2000 Alexandre Peti *** 3573,3583 **** 2000-02-15 Alexandre Petit-Bianco * parse.y (outer_field_access_p): Stop in time when outer contexts ! are exhausted. (resolve_qualified_expression_name): Properly qualify *everything* ! after a package.type to be resoled as expression names. (find_applicable_accessible_methods_list): Save/restore `class' to ! isolate it from a possible outer context search. 2000-02-15 Tom Tromey --- 5442,5452 ---- 2000-02-15 Alexandre Petit-Bianco * parse.y (outer_field_access_p): Stop in time when outer contexts ! are exhausted. (resolve_qualified_expression_name): Properly qualify *everything* ! after a package.type to be resoled as expression names. (find_applicable_accessible_methods_list): Save/restore `class' to ! isolate it from a possible outer context search. 2000-02-15 Tom Tromey *************** Sat Feb 12 04:34:04 2000 Alexandre Peti *** 3602,3608 **** * parse.y (outer_field_access_fix): First parameter now a tree node. Check for assignement to final. First argument to ! build_outer_field_access_fix modified to accomodate prototype. (build_outer_field_access): Don't check for assignment to final here. (java_complete_lhs): MODIFY_EXPR case: Check for `error_mark_node' --- 5471,5477 ---- * parse.y (outer_field_access_fix): First parameter now a tree node. Check for assignement to final. First argument to ! build_outer_field_access_fix modified to accommodate prototype. (build_outer_field_access): Don't check for assignment to final here. (java_complete_lhs): MODIFY_EXPR case: Check for `error_mark_node' *************** Sat Feb 12 04:34:04 2000 Alexandre Peti *** 3615,3652 **** Fri Feb 11 17:38:26 2000 Alexandre Petit-Bianco * parse.y (interface_declaration:): No longer tagged ! . Re-installed default action. (class_member_declaration:): Handle inner interfaces. (interface_member_declaration): Handle inner interfaces and ! classes. (create_interface): Push error if one seen. Suspend parsing ! context when processing an inner interface. (register_fields): Inner class static field limitations not to ! apply to inner interfaces. Thu Feb 10 22:07:35 2000 Alexandre Petit-Bianco * jcf-parse.c (load_class): Update `java_error_count' when a ! class' file can't be found. (parse.y): Avoid (byte)code generation when errors seen. Thu Feb 10 20:10:43 2000 Alexandre Petit-Bianco * parse.y (java_complete_lhs): Handle TRUNC_DIV_EXPR. Ensure `fatal' ! decodes a valid node. (patch_binop): Handle TRUNC_DIV_EXPR. Thu Feb 10 16:04:26 2000 Alexandre Petit-Bianco * parse.y (resolve_package): New local `acc'. Try to progressively ! build and guess a package and type name. Thu Feb 10 12:52:09 2000 Alexandre Petit-Bianco * parse.y (find_applicable_accessible_methods_list): Load and ! layout the search class if necessary. (java_complete_tree): Keep to original type of the folded initial ! value. 2000-02-09 Alexandre Petit-Bianco --- 5484,5521 ---- Fri Feb 11 17:38:26 2000 Alexandre Petit-Bianco * parse.y (interface_declaration:): No longer tagged ! . Re-installed default action. (class_member_declaration:): Handle inner interfaces. (interface_member_declaration): Handle inner interfaces and ! classes. (create_interface): Push error if one seen. Suspend parsing ! context when processing an inner interface. (register_fields): Inner class static field limitations not to ! apply to inner interfaces. Thu Feb 10 22:07:35 2000 Alexandre Petit-Bianco * jcf-parse.c (load_class): Update `java_error_count' when a ! class' file can't be found. (parse.y): Avoid (byte)code generation when errors seen. Thu Feb 10 20:10:43 2000 Alexandre Petit-Bianco * parse.y (java_complete_lhs): Handle TRUNC_DIV_EXPR. Ensure `fatal' ! decodes a valid node. (patch_binop): Handle TRUNC_DIV_EXPR. Thu Feb 10 16:04:26 2000 Alexandre Petit-Bianco * parse.y (resolve_package): New local `acc'. Try to progressively ! build and guess a package and type name. Thu Feb 10 12:52:09 2000 Alexandre Petit-Bianco * parse.y (find_applicable_accessible_methods_list): Load and ! layout the search class if necessary. (java_complete_tree): Keep to original type of the folded initial ! value. 2000-02-09 Alexandre Petit-Bianco *************** Thu Feb 3 20:23:19 2000 Alexandre Peti *** 3709,3719 **** * java-tree.h (FIELD_THISN): New macro. * jcf-write.c (append_synthetic_attribute): New function. (generate_classfile): Set "Synthetic" attribute on this$, ! val$ fields, access$ and $finit$ methods. Fixed indentation. * parse.y (add_inner_class_fields): Set FIELD_THISN for created ! this$ fields. (build_outer_field_access): Turned on access functions usage and ! generation when compiling to bytecode. (maybe_use_access_method): Likewise. 2000-01-25 Andrew Haley --- 5578,5588 ---- * java-tree.h (FIELD_THISN): New macro. * jcf-write.c (append_synthetic_attribute): New function. (generate_classfile): Set "Synthetic" attribute on this$, ! val$ fields, access$ and $finit$ methods. Fixed indentation. * parse.y (add_inner_class_fields): Set FIELD_THISN for created ! this$ fields. (build_outer_field_access): Turned on access functions usage and ! generation when compiling to bytecode. (maybe_use_access_method): Likewise. 2000-01-25 Andrew Haley *************** Tue Feb 1 14:59:35 2000 Alexandre Peti *** 3924,3952 **** Fri Jan 28 20:10:57 2000 Alexandre Petit-Bianco * java-tree.h (ARG_FINAL_P, FIELD_LOCAL_ALIAS, ! FIELD_LOCAL_ALIAS_USED): New macros. (DECL_FUNCTION_NAP): New macro. (struct lang_decl): New field `nap'. (TYPE_FINIT_STMT_LIST, TYPE_CLINIT_STMT_LIST): New macros. (struct lang_type): New fields `finit_stmt_list' and ! `clinit_stmt_list'. (CLASS_HAS_FINIT_P): Defined using TYPE_FINIT_STMT_LIST. * parse.h (MANGLE_OUTER_LOCAL_VARIABLE_NAME): New macro. (SKIP_THIS_AND_ARTIFICIAL_PARMS, MARK_FINAL_PARMS, ! UNMARK_FINAL_PARMS, CRAFTED_PARAM_LIST_FIXUP): New macros. (AIPL_FUNCTION_CREATION, AIPL_FUNCTION_COMPLETED_INVOCATION, ! AIPL_FUNCTION_INVOCATION_READY): New enum fields. (BUILD_THROW): Macro line separator re-indented. * parse.y (end_class_declaration): New function. (maybe_generate_pre_expand_clinit): New name for ! java_pre_expand_clinit. Create off TYPE_CLINIT_STMT_LIST, ! pre-expand static fields. (maybe_generate_clinit): Function deleted. (check_for_static_method_reference): Prototype's parameter list ! indented. (generate_finit): New name for maybe_generate_finit. Changed ! leading comment. Function rewritten to use ! TYPE_FINIT_STMT_LIST. Call build_alias_initializer_parameter_list. (build_alias_initializer_parameter_list): New function. (java_parser_context_pop_initialized_field): Likewise. (add_inner_class_fields): Likewise. --- 5793,5821 ---- Fri Jan 28 20:10:57 2000 Alexandre Petit-Bianco * java-tree.h (ARG_FINAL_P, FIELD_LOCAL_ALIAS, ! FIELD_LOCAL_ALIAS_USED): New macros. (DECL_FUNCTION_NAP): New macro. (struct lang_decl): New field `nap'. (TYPE_FINIT_STMT_LIST, TYPE_CLINIT_STMT_LIST): New macros. (struct lang_type): New fields `finit_stmt_list' and ! `clinit_stmt_list'. (CLASS_HAS_FINIT_P): Defined using TYPE_FINIT_STMT_LIST. * parse.h (MANGLE_OUTER_LOCAL_VARIABLE_NAME): New macro. (SKIP_THIS_AND_ARTIFICIAL_PARMS, MARK_FINAL_PARMS, ! UNMARK_FINAL_PARMS, CRAFTED_PARAM_LIST_FIXUP): New macros. (AIPL_FUNCTION_CREATION, AIPL_FUNCTION_COMPLETED_INVOCATION, ! AIPL_FUNCTION_INVOCATION_READY): New enum fields. (BUILD_THROW): Macro line separator re-indented. * parse.y (end_class_declaration): New function. (maybe_generate_pre_expand_clinit): New name for ! java_pre_expand_clinit. Create off TYPE_CLINIT_STMT_LIST, ! pre-expand static fields. (maybe_generate_clinit): Function deleted. (check_for_static_method_reference): Prototype's parameter list ! indented. (generate_finit): New name for maybe_generate_finit. Changed ! leading comment. Function rewritten to use ! TYPE_FINIT_STMT_LIST. Call build_alias_initializer_parameter_list. (build_alias_initializer_parameter_list): New function. (java_parser_context_pop_initialized_field): Likewise. (add_inner_class_fields): Likewise. *************** Fri Jan 28 20:10:57 2000 Alexandre Peti *** 3954,3960 **** (class_member_declaration:): Likewise. (formal_parameter_list:): Fixed typos. (formal_parameter:): Use ARG_FINAL_P to mark created tree list ! element. Improved error handling. (block_statement:): Call end_class_declaration. (anonymous_class_creation:): Likewise. (create_anonymous_class): Fixed comments. --- 5823,5829 ---- (class_member_declaration:): Likewise. (formal_parameter_list:): Fixed typos. (formal_parameter:): Use ARG_FINAL_P to mark created tree list ! element. Improved error handling. (block_statement:): Call end_class_declaration. (anonymous_class_creation:): Likewise. (create_anonymous_class): Fixed comments. *************** Fri Jan 28 20:10:57 2000 Alexandre Peti *** 3964,3988 **** (finish_method_declaration): Use UNMARK_FINAL_PARMS. (method_declarator): Propagate final argument flag. (craft_constructor): New local `artificial'. Call ! build_alias_initializer_parameter_list. Use ! CRAFTED_PARAM_LIST_FIXUP, assign DECL_FUNCTION_NAP. (source_start_java_method): Mark parm decls with LOCAL_FINAL if ! necessary. (complete_expand_class): Get rid of unused outer context local ! alias fields. (java_complete_expand_methods): Fixed leading ! comment. Generate/pre-expand first. Changed method ! expansion order to regular, $finit$, constructors, . (java_complete_expand_method): Set current_function_decl. (fix_constructors): Fix constructor parameter list to account for ! outer context local alias initializers. (verify_constructor_super): Use SKIP_THIS_AND_ARTIFICIAL_PARMS. (resolve_expression_name): Lookup outer context local aliases. New ! local `access', use it. (patch_method_invocation): Patch inner class ctor invocation with ! outer context local aliases initialization values. $finit$ ! invocation patching now includes things generated with ! build_alias_initializer_parameter_list. (argument_types_convertible): Use SKIP_THIS_AND_ARTIFICIAL_PARMS. (build_super_invocation): Likewise. (patch_assignment): Changed comment. --- 5833,5857 ---- (finish_method_declaration): Use UNMARK_FINAL_PARMS. (method_declarator): Propagate final argument flag. (craft_constructor): New local `artificial'. Call ! build_alias_initializer_parameter_list. Use ! CRAFTED_PARAM_LIST_FIXUP, assign DECL_FUNCTION_NAP. (source_start_java_method): Mark parm decls with LOCAL_FINAL if ! necessary. (complete_expand_class): Get rid of unused outer context local ! alias fields. (java_complete_expand_methods): Fixed leading ! comment. Generate/pre-expand first. Changed method ! expansion order to regular, $finit$, constructors, . (java_complete_expand_method): Set current_function_decl. (fix_constructors): Fix constructor parameter list to account for ! outer context local alias initializers. (verify_constructor_super): Use SKIP_THIS_AND_ARTIFICIAL_PARMS. (resolve_expression_name): Lookup outer context local aliases. New ! local `access', use it. (patch_method_invocation): Patch inner class ctor invocation with ! outer context local aliases initialization values. $finit$ ! invocation patching now includes things generated with ! build_alias_initializer_parameter_list. (argument_types_convertible): Use SKIP_THIS_AND_ARTIFICIAL_PARMS. (build_super_invocation): Likewise. (patch_assignment): Changed comment. *************** Fri Jan 14 18:03:41 2000 Alexandre Peti *** 4121,4127 **** * parse.h (enum jdep_code): New entry `JDEP_ANONYMOUS'. * parse.y (patch_anonymous_class): New function. (create_anonymous_class): Register incomplete type when the ! class/interface to extends/implement isn't known yet. (parser_check_super_interface): Simplify argument to CLASS_INTERFACE. (verify_constructor_super): Tuned error message. --- 5990,5996 ---- * parse.h (enum jdep_code): New entry `JDEP_ANONYMOUS'. * parse.y (patch_anonymous_class): New function. (create_anonymous_class): Register incomplete type when the ! class/interface to extends/implement isn't known yet. (parser_check_super_interface): Simplify argument to CLASS_INTERFACE. (verify_constructor_super): Tuned error message. *************** Fri Jan 14 00:14:24 2000 Alexandre Peti *** 4133,4171 **** (INNER_CLASS_TYPE_P): Fixed typo in leading comment. * parse.y (create_class): Added leading argument. (maybe_create_class_interface_decl, ! check_class_interface_creation): Likewise. (craft_constructor): New function. (verify_constructor_super): Added argument in prototype. (class_declaration:): Inserted leading argument. (for_begin:): Use FOR_LOOP_P. (anonymous_class_creation): Create WFL of the anonymous class to ! instantiate. Call build_new_invocation. Added comments. (check_class_interface_creation): Handle parameter `anonymous' in ! verbose mode class creation announce. (link_nested_class_to_enclosing): Exclude anonymous classes. (maybe_create_class_interface_decl): Don't set DECL_CONTEXT on ! anonymous class, even though they appear to have an enclosing ! context. (create_interface): Pass extra argument to ! check_class_interface_creation. (create_anonymous_class): Set ANONYMOUS_CLASS_P to 1. (create_class): Call check_class_interface_creation and ! maybe_create_class_interface_decl with extra new argument. Don't ! add private this$ to anonymous classes. (method_declarator): Insert hidden this$ to anonymous class ! constructors. (java_fix_constructors): Deleted code creating default ! constructor. Call craft_constructor instead. (java_check_regular_methods): Set `saw_constructor' to 1 for ! anonymous classes. (fix_constructors): Pass extra argument to verify_constructor_super. (verify_constructor_super): New local `sdecl', use it. Search for ! matching constructor (possibly featuring arguments) in super ! class. (lookup_method_invoke): Craft constructor according to arguments ! list when dealing with anonymous class constructors. (build_super_invocation): Pass arguments to anonymous class super ! constructors. (search_loop): Use FOR_LOOP_P. (labeled_block_contains_loop_p): Likewise. --- 6002,6040 ---- (INNER_CLASS_TYPE_P): Fixed typo in leading comment. * parse.y (create_class): Added leading argument. (maybe_create_class_interface_decl, ! check_class_interface_creation): Likewise. (craft_constructor): New function. (verify_constructor_super): Added argument in prototype. (class_declaration:): Inserted leading argument. (for_begin:): Use FOR_LOOP_P. (anonymous_class_creation): Create WFL of the anonymous class to ! instantiate. Call build_new_invocation. Added comments. (check_class_interface_creation): Handle parameter `anonymous' in ! verbose mode class creation announce. (link_nested_class_to_enclosing): Exclude anonymous classes. (maybe_create_class_interface_decl): Don't set DECL_CONTEXT on ! anonymous class, even though they appear to have an enclosing ! context. (create_interface): Pass extra argument to ! check_class_interface_creation. (create_anonymous_class): Set ANONYMOUS_CLASS_P to 1. (create_class): Call check_class_interface_creation and ! maybe_create_class_interface_decl with extra new argument. Don't ! add private this$ to anonymous classes. (method_declarator): Insert hidden this$ to anonymous class ! constructors. (java_fix_constructors): Deleted code creating default ! constructor. Call craft_constructor instead. (java_check_regular_methods): Set `saw_constructor' to 1 for ! anonymous classes. (fix_constructors): Pass extra argument to verify_constructor_super. (verify_constructor_super): New local `sdecl', use it. Search for ! matching constructor (possibly featuring arguments) in super ! class. (lookup_method_invoke): Craft constructor according to arguments ! list when dealing with anonymous class constructors. (build_super_invocation): Pass arguments to anonymous class super ! constructors. (search_loop): Use FOR_LOOP_P. (labeled_block_contains_loop_p): Likewise. *************** Wed Jan 12 00:38:47 2000 Alexandre Peti *** 4175,4207 **** (enclosing_context_p): New function. (get_access_flags_from_decl): Handle CLASS_STATIC. (maybe_layout_super_class): Extra first argument passed to ! do_resolve_class. (layout_class_method): Use ID_FINIT_P, DECL_CLINIT_P and ! ID_INIT_P. * decl.c (access0_identifier_node): New global. (init_decl_processing): access0_identifier_node initialized. (pushdecl): Set DECL_CONTEXT only on non type decls. * expr.c (lookup_field): Lookup inner class fields in enclosing ! contexts. (expand_invoke): Use ID_INIT_P. (expand_java_field_op): Use DECL_CLINIT_P. * java-tree.def (CLASS_LITERAL): New tree code. * java-tree.h (DECL_FUNCTION_ACCESS_DECL, ! DECL_FUNCTION_INNER_ACCESS, FIELD_INNER_ACCESS): New macros. (struct lang_decl): New field `inner_access'. (enclosing_context_p): Prototyped. (DECL_INIT_P, DECL_FINIT_P, DECL_CLINIT_P, ID_INIT_P, ID_FINIT_P, ! ID_CLINIT_P): New macros. (CLASS_STATIC): New macro. (CLASS_ACCESS0_GENERATED_P): New macro. (OUTER_FIELD_ACCESS_IDENTIFIER_P, INNER_CLASS_DECL_P, ! TOPLEVEL_CLASS_DECL_P, INNER_CLASS_TYPE_P, TOPLEVEL_CLASS_TYPE_P, ! INNER_CLASS_P): New macros. (DECL_INNER_CLASS_LIST): New macro. * jcf-parse.c (yyparse): Avoid the use of ANSI string ! concatenation. * jcf-write.c (generate_bytecode_insns): binop: Change the type of ! the shift value to int. Fixed typo in comment. * lex.c (inst_id, wpv_id): Initialize. * mangle.c (unicode_mangling_length): Take `$' into account. * parse.h (DRECOVER, RECOVER): Terminate properly. --- 6044,6076 ---- (enclosing_context_p): New function. (get_access_flags_from_decl): Handle CLASS_STATIC. (maybe_layout_super_class): Extra first argument passed to ! do_resolve_class. (layout_class_method): Use ID_FINIT_P, DECL_CLINIT_P and ! ID_INIT_P. * decl.c (access0_identifier_node): New global. (init_decl_processing): access0_identifier_node initialized. (pushdecl): Set DECL_CONTEXT only on non type decls. * expr.c (lookup_field): Lookup inner class fields in enclosing ! contexts. (expand_invoke): Use ID_INIT_P. (expand_java_field_op): Use DECL_CLINIT_P. * java-tree.def (CLASS_LITERAL): New tree code. * java-tree.h (DECL_FUNCTION_ACCESS_DECL, ! DECL_FUNCTION_INNER_ACCESS, FIELD_INNER_ACCESS): New macros. (struct lang_decl): New field `inner_access'. (enclosing_context_p): Prototyped. (DECL_INIT_P, DECL_FINIT_P, DECL_CLINIT_P, ID_INIT_P, ID_FINIT_P, ! ID_CLINIT_P): New macros. (CLASS_STATIC): New macro. (CLASS_ACCESS0_GENERATED_P): New macro. (OUTER_FIELD_ACCESS_IDENTIFIER_P, INNER_CLASS_DECL_P, ! TOPLEVEL_CLASS_DECL_P, INNER_CLASS_TYPE_P, TOPLEVEL_CLASS_TYPE_P, ! INNER_CLASS_P): New macros. (DECL_INNER_CLASS_LIST): New macro. * jcf-parse.c (yyparse): Avoid the use of ANSI string ! concatenation. * jcf-write.c (generate_bytecode_insns): binop: Change the type of ! the shift value to int. Fixed typo in comment. * lex.c (inst_id, wpv_id): Initialize. * mangle.c (unicode_mangling_length): Take `$' into account. * parse.h (DRECOVER, RECOVER): Terminate properly. *************** Wed Jan 12 00:38:47 2000 Alexandre Peti *** 4211,4349 **** (IS_CLINIT): Deleted (DECL_CLINIT_P replaces it.) (struct parser_ctxt): New fields `marker_beginning', `marked_end'. (GET_CPC_LIST, CPC_INNER_P, GET_CPC, GET_CPC_UN, GET_CPC_UN_MODE, ! GET_CPC_DECL_NODE, GET_ENCLOSING_CPC, GET_NEXT_ENCLOSING_CPC, ! GET_ENCLOSING_CPC_CONTEXT): New macros. (PUSH_CPC, PUSH_ERROR, POP_CPC): New macros. (do_resolve_class): Added extra argument in prototype. * parse.y (resolve_class): Added extra argument in prototype. (maybe_create_class_interface_decl): Likewise. (maybe_use_access_method, build_wfl_wrap): New functions. (java_complete_expand_classes, java_complete_expand_class): ! Likewise. (java_parser_context_push_initialized_field, ! java_parser_context_suspend, java_parser_context_resume): ! Likewise. (maybe_make_nested_class_name, make_nested_class_name, ! set_nested_class_simple_name_value, ! link_nested_class_to_enclosing, find_as_inner_class, ! find_as_inner_class_do, check_inner_class_redefinition, ! build_thisn_assign, build_current_thisn, build_access_to_thisn, ! maybe_build_thisn_access_method, build_outer_field_access, ! build_outer_field_access_methods, build_outer_field_access_expr, ! build_outer_method_access_method, build_new_access_id, ! build_outer_field_access_method, outer_field_access_p, ! outer_field_expanded_access_p, outer_field_access_fix, ! build_incomplete_class_ref, patch_incomplete_class_ref, ! create_anonymous_class): Likewise. (inst_id, wpv_id): New static global variables. (synchronized:): New rule, tagged . (type_declaration:): No longer tagged . Call POP_CPC in sub ! rules. (anonymous_class_creation:): New rule, tagged . (NEW_TK): Tagged . (type_literals, array_type_literal): New rules, tagged . (class_declaration:): Removed action when reducing by class_body: (class_body:): Set DECL_END_SOURCE_LINE and rule's returned value ! using GET_CPC in sub-rules. (class_member_declaration): Handle inner classes. (method_declaration): When reducing method_header:, reset ! current_function_decl when appropriate. (method_declarator:): Set the number of formal parameter to 0 for ! method declared without arguments. (constructor_declarator:): Likewise. (static_initializer:): List of elements kept in a list. (static:): Rule modifiers: replaces MODIFIER_TK. Enforce correct ! use of the keyword `static' for type declarations. (block_statement:): Handle inner class declarations. (primary_no_new_array:): Use type_literals:. Fixed comment. Handle ! type qualified `this'. (class_instance_creation_expression): Use anonymous_class_creation: to handle inner class instances creation. Handle qualified `new'. (something_dot_new): Added appropriate actions. (create_new_parser_context): New function. (java_push_parser_context, java_parser_context_save_global, ! java_parser_context_suspend): Use create_new_parser_context. (check_modifiers): Changed leading comment. (check_class_interface_creation): Handle interclasses. (add_superinterfaces): Fixed comment. (create_interface): Build qualified name from the raw_name instead ! of its matching WFL. Push the initialized fields list. raw_name added ! as an extra argument to maybe_create_class_interface_decl. (create_class): Build qualified name from the raw_name instead of ! its matching WFL. Removed assignment to current_parsed_class_un. Call PUSH_ERROR before returning an error. Suspend the current ! parser context when processing an inner class. Push the ! initialized fields list. raw_name added as an extra argument to ! maybe_create_class_interface_decl. Add the private this$ ! field. (duplicate_declaration_error_p): Use GET_CPC when calling find_field. (register_fields): Get the class type from GET_CPC and handle ! previous errors. Added code to handle the creation of static ! fields in inner classes. Initialized fields initialization ! statements kept in a list of lists. (maybe_generate_finit): Initialized fields initialization ! statements kept in a list of lists. Use GET_CPC. (maybe_generate_clinit): Likewise. (method_header): Use GET_CPC and GET_CPC_UN. (parser_qualified_classname): Handle inner classes. (register_incomplete_type): Set JDEP_ENCLOSING using GET_CPC. (java_fix_constructors): Hide pointer to enclosing context ! instance in constructor list when dealing with inner classes. (jdep_resolve_class): Call resolve_class with extra first argument ! JDEP_ENCLOSING. (resolve_class): Add enclosing context as a first extra argument ! to do_resolve_class. (do_resolve_class): Call find_as_inner_class. Handle WFLs ! properly. (resolve_no_layout): Extra argument added to resolve_class ! invocation. (reset_method_name): Use DECL_CLINIT_P, DECL_FINIT_P. (java_get_real_method_name): Use GET_CPC_UN. (check_abstract_method_definitions): Use DECL_CLINIT_P. (java_check_abstract_methods): Handle static method declared in ! inner classes by an error. (java_check_regular_methods): Use DECL_CLINIT_P. (source_start_java_method): Also set DECL_MAX_LOCALS. (create_artificial_method): Call java_parser_context_save_global ! and java_parser_context_restore_global instead of saving/restoring ! the context by hand. (expand_start_java_method): Improved verbose mode message. (java_complete_expand_methods): Fixed leading comment. Use ! DECL_CLINIT_P. (fix_constructors): Added assignment to this$ if necessary. (java_expand_classes): Call java_complete_expand_classes instead ! of java_complete_expand_methods. (make_qualified_primary): Simplified. (merge_qualified_name): Optimized for missing left or right parts. (resolve_expression_name): Handle access to outer class fields from ! interclasses. (resolve_qualified_expression_name): New macro ! RESTORE_THIS_AND_CURRENT_CLASS, used. Handle creation of inner ! classes. Report error on non appropriate qualification of ! `new'. Handle qualified `this'. (not_accessible_p): Allow access to outer class private fields from ! inner classes. (patch_method_invocation): Handle method invocations through ! access methods and inner class constructor invocations. (find_applicable_accessible_methods_list): Search enclosing ! contexts of an inner class. (search_applicable_methods_list): Fixed typo. (argument_types_convertible): Handle inner class constructors' ! hidden outer context reference argument. (qualify_ambiguous_name): Handle qualified `this'. (java_complete_lhs): Handle use of field accessed through ! artificial access methods in various cases of assignments. Handle ! CLASS_LITERAL node. (check_final_assignment): Use DECL_CLINIT_P. (valid_ref_assignconv_cast_p): Handle the destination being an ! enclosing context of the source. (patch_unaryop): Handle use of field accessed through artificial ! access methods. (patch_return): Use DECL_CLINIT_P. (patch_throw_statement): Use DECL_CLINIT_P. (check_thrown_exceptions): Use DECL_FINIT_P and DECL_INIT_P. * verify.c (verify_jvm_instructions): Use ID_CLINIT_P and ! ID_INIT_P. 2000-01-16 Anthony Green --- 6080,6218 ---- (IS_CLINIT): Deleted (DECL_CLINIT_P replaces it.) (struct parser_ctxt): New fields `marker_beginning', `marked_end'. (GET_CPC_LIST, CPC_INNER_P, GET_CPC, GET_CPC_UN, GET_CPC_UN_MODE, ! GET_CPC_DECL_NODE, GET_ENCLOSING_CPC, GET_NEXT_ENCLOSING_CPC, ! GET_ENCLOSING_CPC_CONTEXT): New macros. (PUSH_CPC, PUSH_ERROR, POP_CPC): New macros. (do_resolve_class): Added extra argument in prototype. * parse.y (resolve_class): Added extra argument in prototype. (maybe_create_class_interface_decl): Likewise. (maybe_use_access_method, build_wfl_wrap): New functions. (java_complete_expand_classes, java_complete_expand_class): ! Likewise. (java_parser_context_push_initialized_field, ! java_parser_context_suspend, java_parser_context_resume): ! Likewise. (maybe_make_nested_class_name, make_nested_class_name, ! set_nested_class_simple_name_value, ! link_nested_class_to_enclosing, find_as_inner_class, ! find_as_inner_class_do, check_inner_class_redefinition, ! build_thisn_assign, build_current_thisn, build_access_to_thisn, ! maybe_build_thisn_access_method, build_outer_field_access, ! build_outer_field_access_methods, build_outer_field_access_expr, ! build_outer_method_access_method, build_new_access_id, ! build_outer_field_access_method, outer_field_access_p, ! outer_field_expanded_access_p, outer_field_access_fix, ! build_incomplete_class_ref, patch_incomplete_class_ref, ! create_anonymous_class): Likewise. (inst_id, wpv_id): New static global variables. (synchronized:): New rule, tagged . (type_declaration:): No longer tagged . Call POP_CPC in sub ! rules. (anonymous_class_creation:): New rule, tagged . (NEW_TK): Tagged . (type_literals, array_type_literal): New rules, tagged . (class_declaration:): Removed action when reducing by class_body: (class_body:): Set DECL_END_SOURCE_LINE and rule's returned value ! using GET_CPC in sub-rules. (class_member_declaration): Handle inner classes. (method_declaration): When reducing method_header:, reset ! current_function_decl when appropriate. (method_declarator:): Set the number of formal parameter to 0 for ! method declared without arguments. (constructor_declarator:): Likewise. (static_initializer:): List of elements kept in a list. (static:): Rule modifiers: replaces MODIFIER_TK. Enforce correct ! use of the keyword `static' for type declarations. (block_statement:): Handle inner class declarations. (primary_no_new_array:): Use type_literals:. Fixed comment. Handle ! type qualified `this'. (class_instance_creation_expression): Use anonymous_class_creation: to handle inner class instances creation. Handle qualified `new'. (something_dot_new): Added appropriate actions. (create_new_parser_context): New function. (java_push_parser_context, java_parser_context_save_global, ! java_parser_context_suspend): Use create_new_parser_context. (check_modifiers): Changed leading comment. (check_class_interface_creation): Handle interclasses. (add_superinterfaces): Fixed comment. (create_interface): Build qualified name from the raw_name instead ! of its matching WFL. Push the initialized fields list. raw_name added ! as an extra argument to maybe_create_class_interface_decl. (create_class): Build qualified name from the raw_name instead of ! its matching WFL. Removed assignment to current_parsed_class_un. Call PUSH_ERROR before returning an error. Suspend the current ! parser context when processing an inner class. Push the ! initialized fields list. raw_name added as an extra argument to ! maybe_create_class_interface_decl. Add the private this$ ! field. (duplicate_declaration_error_p): Use GET_CPC when calling find_field. (register_fields): Get the class type from GET_CPC and handle ! previous errors. Added code to handle the creation of static ! fields in inner classes. Initialized fields initialization ! statements kept in a list of lists. (maybe_generate_finit): Initialized fields initialization ! statements kept in a list of lists. Use GET_CPC. (maybe_generate_clinit): Likewise. (method_header): Use GET_CPC and GET_CPC_UN. (parser_qualified_classname): Handle inner classes. (register_incomplete_type): Set JDEP_ENCLOSING using GET_CPC. (java_fix_constructors): Hide pointer to enclosing context ! instance in constructor list when dealing with inner classes. (jdep_resolve_class): Call resolve_class with extra first argument ! JDEP_ENCLOSING. (resolve_class): Add enclosing context as a first extra argument ! to do_resolve_class. (do_resolve_class): Call find_as_inner_class. Handle WFLs ! properly. (resolve_no_layout): Extra argument added to resolve_class ! invocation. (reset_method_name): Use DECL_CLINIT_P, DECL_FINIT_P. (java_get_real_method_name): Use GET_CPC_UN. (check_abstract_method_definitions): Use DECL_CLINIT_P. (java_check_abstract_methods): Handle static method declared in ! inner classes by an error. (java_check_regular_methods): Use DECL_CLINIT_P. (source_start_java_method): Also set DECL_MAX_LOCALS. (create_artificial_method): Call java_parser_context_save_global ! and java_parser_context_restore_global instead of saving/restoring ! the context by hand. (expand_start_java_method): Improved verbose mode message. (java_complete_expand_methods): Fixed leading comment. Use ! DECL_CLINIT_P. (fix_constructors): Added assignment to this$ if necessary. (java_expand_classes): Call java_complete_expand_classes instead ! of java_complete_expand_methods. (make_qualified_primary): Simplified. (merge_qualified_name): Optimized for missing left or right parts. (resolve_expression_name): Handle access to outer class fields from ! interclasses. (resolve_qualified_expression_name): New macro ! RESTORE_THIS_AND_CURRENT_CLASS, used. Handle creation of inner ! classes. Report error on non appropriate qualification of ! `new'. Handle qualified `this'. (not_accessible_p): Allow access to outer class private fields from ! inner classes. (patch_method_invocation): Handle method invocations through ! access methods and inner class constructor invocations. (find_applicable_accessible_methods_list): Search enclosing ! contexts of an inner class. (search_applicable_methods_list): Fixed typo. (argument_types_convertible): Handle inner class constructors' ! hidden outer context reference argument. (qualify_ambiguous_name): Handle qualified `this'. (java_complete_lhs): Handle use of field accessed through ! artificial access methods in various cases of assignments. Handle ! CLASS_LITERAL node. (check_final_assignment): Use DECL_CLINIT_P. (valid_ref_assignconv_cast_p): Handle the destination being an ! enclosing context of the source. (patch_unaryop): Handle use of field accessed through artificial ! access methods. (patch_return): Use DECL_CLINIT_P. (patch_throw_statement): Use DECL_CLINIT_P. (check_thrown_exceptions): Use DECL_FINIT_P and DECL_INIT_P. * verify.c (verify_jvm_instructions): Use ID_CLINIT_P and ! ID_INIT_P. 2000-01-16 Anthony Green *************** Thu Jan 6 00:54:10 2000 Alexandre Peti *** 4381,4389 **** * jcf-write.c (generate_bytecode_conditional): Fixed indentation in method invocation and typo in conditional expression. (generate_bytecode_insns): COND_EXPR can be part of a binop. Issue ! the appropriate NOTE_POP. * parse.y (patch_binop): Shift value mask to feature the right ! type. 1999-12-30 Kaveh R. Ghazi --- 6250,6258 ---- * jcf-write.c (generate_bytecode_conditional): Fixed indentation in method invocation and typo in conditional expression. (generate_bytecode_insns): COND_EXPR can be part of a binop. Issue ! the appropriate NOTE_POP. * parse.y (patch_binop): Shift value mask to feature the right ! type. 1999-12-30 Kaveh R. Ghazi *************** Fri Dec 24 00:25:29 1999 Alexandre Peti *** 4441,4471 **** (../jcf-dump$(exeext):): Link with gcc's errors.o (../gcjh$(exeext):): Likewise. * expr.c (expand_java_NEW): Layout the entire target type instead of ! laying out its methods only. (lookup_field): Layout the class after having loaded it. * java-tree.h (java_debug_context): Declared. * jcf-io.c (toplev.h): Included. (find_class): Removed assignment to jcf's outofsynch ! field. Force source file to be read if newer than its matching ! class file. Tweaked debug messages. * jcf-parse.c (jcf_out_of_synch): Deleted. (read_class): Call to jcf_out_of_synch removed. * jcf.h (typedef struct JCF): Field `outofsynch' deleted. (jcf_out_of_synch): Prototype deleted. * parse.h (struct parser_ctxt): `minus_seen', `java_error_flag', ! `deprecated' and `class_err': integer turned into bit fields. New bit fields `saved_data_ctx' and `saved_data'. Fixed comments. * parse.y (package_list): New global. (package_declaration:): Record newly parsed package name. (extra_ctxp_pushed_p): Static global deleted. (java_parser_context_save_global): Create buffer context for the ! purpose of saving globals, if necessary. (java_parser_context_restore_global): Pop context pushed for the ! purpose of saving globals, if necessary. (java_debug_context_do): New prototype and function. (java_debug_context): Likewise. (do_resolve_class): Use already parsed package names to qualify ! and lookup class candidate. (java_pre_expand_clinit): Removed unnecessary local variable. 1999-12-17 Tom Tromey --- 6310,6340 ---- (../jcf-dump$(exeext):): Link with gcc's errors.o (../gcjh$(exeext):): Likewise. * expr.c (expand_java_NEW): Layout the entire target type instead of ! laying out its methods only. (lookup_field): Layout the class after having loaded it. * java-tree.h (java_debug_context): Declared. * jcf-io.c (toplev.h): Included. (find_class): Removed assignment to jcf's outofsynch ! field. Force source file to be read if newer than its matching ! class file. Tweaked debug messages. * jcf-parse.c (jcf_out_of_synch): Deleted. (read_class): Call to jcf_out_of_synch removed. * jcf.h (typedef struct JCF): Field `outofsynch' deleted. (jcf_out_of_synch): Prototype deleted. * parse.h (struct parser_ctxt): `minus_seen', `java_error_flag', ! `deprecated' and `class_err': integer turned into bit fields. New bit fields `saved_data_ctx' and `saved_data'. Fixed comments. * parse.y (package_list): New global. (package_declaration:): Record newly parsed package name. (extra_ctxp_pushed_p): Static global deleted. (java_parser_context_save_global): Create buffer context for the ! purpose of saving globals, if necessary. (java_parser_context_restore_global): Pop context pushed for the ! purpose of saving globals, if necessary. (java_debug_context_do): New prototype and function. (java_debug_context): Likewise. (do_resolve_class): Use already parsed package names to qualify ! and lookup class candidate. (java_pre_expand_clinit): Removed unnecessary local variable. 1999-12-17 Tom Tromey *************** Fri Dec 24 00:25:29 1999 Alexandre Peti *** 4477,4485 **** Thu Dec 16 00:09:45 1999 Alexandre Petit-Bianco * expr.c (expand_invoke): Layout the loaded class before ! attempting to use it. (expand_java_field_op): Allow final field assignments to take ! place in $finit$. * typeck.c (convert): Return error_mark_node if expr is null. 1999-12-14 Alexandre Petit-Bianco --- 6346,6354 ---- Thu Dec 16 00:09:45 1999 Alexandre Petit-Bianco * expr.c (expand_invoke): Layout the loaded class before ! attempting to use it. (expand_java_field_op): Allow final field assignments to take ! place in $finit$. * typeck.c (convert): Return error_mark_node if expr is null. 1999-12-14 Alexandre Petit-Bianco *************** Fri Dec 10 21:53:45 1999 Alexandre Peti *** 4525,4532 **** Fri Dec 10 16:13:48 1999 Alexandre Petit-Bianco * parse.h (EXPR_WFL_QUALIFICATION): Temporary uses the third ! operand of a WFL, until the Java front-end gets fixed with regard ! to Mark Mitchell's gcc/tree.h patch (1999-12-04.) 1999-12-10 Andrew Haley --- 6394,6401 ---- Fri Dec 10 16:13:48 1999 Alexandre Petit-Bianco * parse.h (EXPR_WFL_QUALIFICATION): Temporary uses the third ! operand of a WFL, until the Java front-end gets fixed with regard ! to Mark Mitchell's gcc/tree.h patch (1999-12-04.) 1999-12-10 Andrew Haley *************** Wed Dec 1 04:25:06 1999 Alexandre Peti *** 4560,4566 **** Tue Nov 30 12:36:15 1999 Anthony Green * verify.c (verify_jvm_instructions): Create new return label ! chain if non existant (don't rely on the verified state of the jsr target.) Tue Nov 30 12:28:34 1999 Alexandre Petit-Bianco --- 6429,6435 ---- Tue Nov 30 12:36:15 1999 Anthony Green * verify.c (verify_jvm_instructions): Create new return label ! chain if non existent (don't rely on the verified state of the jsr target.) Tue Nov 30 12:28:34 1999 Alexandre Petit-Bianco *************** Tue Nov 23 17:29:40 1999 Alexandre Peti *** 4596,4602 **** Tue Nov 23 10:55:18 1999 Alexandre Petit-Bianco * parse.y (catch_clause_parameter:): Still set `$$' to NULL_TREE ! in case of error. Error message tuned. 1999-11-21 Anthony Green --- 6465,6471 ---- Tue Nov 23 10:55:18 1999 Alexandre Petit-Bianco * parse.y (catch_clause_parameter:): Still set `$$' to NULL_TREE ! in case of error. Error message tuned. 1999-11-21 Anthony Green *************** Tue Nov 23 10:55:18 1999 Alexandre Peti *** 4620,4631 **** Wed Nov 17 21:09:28 1999 Alexandre Petit-Bianco * class.c (layout_class): Always convert TYPE_SIZE_UNIT to ! int_type_node: that's what `_Jv_AllocObject' expects. Thu Nov 11 01:57:14 1999 Alexandre Petit-Bianco * parse.y (lookup_method_invoke): Use lang_printable_name to ! reliably build the type name during error report. Fixes PR gcj/97. 1999-11-09 Tom Tromey --- 6489,6500 ---- Wed Nov 17 21:09:28 1999 Alexandre Petit-Bianco * class.c (layout_class): Always convert TYPE_SIZE_UNIT to ! int_type_node: that's what `_Jv_AllocObject' expects. Thu Nov 11 01:57:14 1999 Alexandre Petit-Bianco * parse.y (lookup_method_invoke): Use lang_printable_name to ! reliably build the type name during error report. Fixes PR gcj/97. 1999-11-09 Tom Tromey *************** Thu Nov 11 01:57:14 1999 Alexandre Peti *** 4636,4644 **** Tue Nov 9 12:12:38 1999 Alexandre Petit-Bianco * parse.y (source_end_java_method): Resume permanent allocation, ! reversing Apr 27 1998 patch. (patch_string_cst): Pop obstacks after having pushed the permanent ! ones. 1999-11-05 Tom Tromey --- 6505,6513 ---- Tue Nov 9 12:12:38 1999 Alexandre Petit-Bianco * parse.y (source_end_java_method): Resume permanent allocation, ! reversing Apr 27 1998 patch. (patch_string_cst): Pop obstacks after having pushed the permanent ! ones. 1999-11-05 Tom Tromey *************** Wed Nov 3 15:20:02 MST 1999 Godmar Bac *** 4658,4672 **** Mon Nov 1 23:42:00 1999 Alexandre Petit-Bianco * parse.y (method_header:): Issue error message for rule `type ! error'. (synchronized:): Error report when not using synchronized. Mon Nov 1 01:32:48 1999 Alexandre Petit-Bianco * parse.y (resolve_qualified_expression_name): Prevent `this' from ! being used before the superclass constructor has been called. (complete_function_arguments): Use CALL_EXPLICIT_CONSTRUCTOR_P ! instead of `CALL_THIS_CONSTRUCTOR_P'. Sat Oct 30 21:35:13 1999 Todd T. Fries --- 6527,6541 ---- Mon Nov 1 23:42:00 1999 Alexandre Petit-Bianco * parse.y (method_header:): Issue error message for rule `type ! error'. (synchronized:): Error report when not using synchronized. Mon Nov 1 01:32:48 1999 Alexandre Petit-Bianco * parse.y (resolve_qualified_expression_name): Prevent `this' from ! being used before the superclass constructor has been called. (complete_function_arguments): Use CALL_EXPLICIT_CONSTRUCTOR_P ! instead of `CALL_THIS_CONSTRUCTOR_P'. Sat Oct 30 21:35:13 1999 Todd T. Fries *************** Sat Oct 30 21:35:13 1999 Todd T. Fries *** 4675,4686 **** Fri Oct 29 14:35:18 1999 Alexandre Petit-Bianco * class.c (add_method_1): Set DECL_INLINE to 1 for private, static ! and final method. Fri Oct 29 14:23:32 1999 Alexandre Petit-Bianco * parse.y (expression_statement:): Call function to report ! improper invocation of a constructor. (parse_ctor_invocation_error): New function. 1999-10-26 Mark Mitchell --- 6544,6555 ---- Fri Oct 29 14:35:18 1999 Alexandre Petit-Bianco * class.c (add_method_1): Set DECL_INLINE to 1 for private, static ! and final method. Fri Oct 29 14:23:32 1999 Alexandre Petit-Bianco * parse.y (expression_statement:): Call function to report ! improper invocation of a constructor. (parse_ctor_invocation_error): New function. 1999-10-26 Mark Mitchell *************** Thu Oct 21 01:27:31 1999 Alexandre Peti *** 4701,4710 **** Wed Oct 20 01:41:47 1999 Alexandre Petit-Bianco * parse.y (java_complete_tree): fold_constant_for_init to work on ! permanent_obstack. (java_complete_lhs): Likewise. (array_constructor_check_entry): Complete an initializer element ! on permanent_obstack. 1999-10-19 Tom Tromey --- 6570,6579 ---- Wed Oct 20 01:41:47 1999 Alexandre Petit-Bianco * parse.y (java_complete_tree): fold_constant_for_init to work on ! permanent_obstack. (java_complete_lhs): Likewise. (array_constructor_check_entry): Complete an initializer element ! on permanent_obstack. 1999-10-19 Tom Tromey *************** Tue Oct 12 22:28:10 1999 Alexandre Peti *** 4753,4759 **** where CHECK_PUT may fail for valid reasons. * jcf-write.c (UNSAFE_PUT1, UNSAFE_PUT2, UNSAFE_PUT3, ! UNSAFE_PUTN): New macros. 1999-10-04 Tom Tromey --- 6622,6628 ---- where CHECK_PUT may fail for valid reasons. * jcf-write.c (UNSAFE_PUT1, UNSAFE_PUT2, UNSAFE_PUT3, ! UNSAFE_PUTN): New macros. 1999-10-04 Tom Tromey *************** Tue Sep 14 16:24:19 1999 Alexandre Peti *** 4789,4809 **** * jcf-write.c (RELOCATION_VALUE_0): New macro. (RELOCATION_VALUE_1): Likewise. (emit_iinc, emit_reloc, push_constant1, push_constant2, ! push_in_const, push_long_const): Prototyped. (push_constant1): Argument `index' is of type HOST_WIDE_INT. (push_constant2): Likewise. (push_int_const): Cast find_constant1's integer arguments to `jword'. (find_constant_wide): Cast find_constant2's integer arguments to ! `jword'. (find_constant_index): Cast find_constant2's and find_constant2's ! integer arguments to `jword'. (emit_pop): Argument `value' is of type HOST_WIDE_INT. (emit_switch_reloc): Use RELOCATION_VALUE_0. (emit_if): Use RELOCATION_VALUE_1. (emit_goto): Likewise. (emit_jsr): Likewise. (generate_bytecode_insns): Use RELOCATION_VALUE_0. Cast second ! argument to push_long_const to HOST_WIDE_INT. 1999-09-15 Andreas Schwab --- 6658,6678 ---- * jcf-write.c (RELOCATION_VALUE_0): New macro. (RELOCATION_VALUE_1): Likewise. (emit_iinc, emit_reloc, push_constant1, push_constant2, ! push_in_const, push_long_const): Prototyped. (push_constant1): Argument `index' is of type HOST_WIDE_INT. (push_constant2): Likewise. (push_int_const): Cast find_constant1's integer arguments to `jword'. (find_constant_wide): Cast find_constant2's integer arguments to ! `jword'. (find_constant_index): Cast find_constant2's and find_constant2's ! integer arguments to `jword'. (emit_pop): Argument `value' is of type HOST_WIDE_INT. (emit_switch_reloc): Use RELOCATION_VALUE_0. (emit_if): Use RELOCATION_VALUE_1. (emit_goto): Likewise. (emit_jsr): Likewise. (generate_bytecode_insns): Use RELOCATION_VALUE_0. Cast second ! argument to push_long_const to HOST_WIDE_INT. 1999-09-15 Andreas Schwab *************** Tue Sep 14 16:24:19 1999 Alexandre Peti *** 4816,4822 **** Thu Sep 16 15:42:39 1999 Alexandre Petit-Bianco * parse.y (java_method_add_stmt): Test against GET_CURRENT_BLOCK ! instead of fndecl. 1999-09-16 Kaveh R. Ghazi --- 6685,6691 ---- Thu Sep 16 15:42:39 1999 Alexandre Petit-Bianco * parse.y (java_method_add_stmt): Test against GET_CURRENT_BLOCK ! instead of fndecl. 1999-09-16 Kaveh R. Ghazi *************** Sun Sep 12 23:30:09 1999 Kaveh R. Ghazi *** 4873,4884 **** Sat Sep 11 16:46:44 1999 Alexandre Petit-Bianco * parse.y (find_applicable_accessible_methods_list): Search ! abstract classes as interfaces. Thu Sep 9 17:33:28 1999 Alexandre Petit-Bianco * class.c (finish_class): We're now outside a valid method ! declaration. Tell the rest of gcc so. 1999-09-08 Bruce Korb autogen@linuxbox.com --- 6742,6753 ---- Sat Sep 11 16:46:44 1999 Alexandre Petit-Bianco * parse.y (find_applicable_accessible_methods_list): Search ! abstract classes as interfaces. Thu Sep 9 17:33:28 1999 Alexandre Petit-Bianco * class.c (finish_class): We're now outside a valid method ! declaration. Tell the rest of gcc so. 1999-09-08 Bruce Korb autogen@linuxbox.com *************** Fri Aug 27 23:31:57 1999 Jeffrey A Law *** 4974,4980 **** Thu Aug 26 09:10:58 1999 Alexandre Petit-Bianco * parse.y (lookup_cl): Changed leading comment. Now does its best ! to set the column number. (qualify_ambiguous_name): Take WFL wrappers into account. Wed Aug 25 15:37:15 1999 Gregg Townsend --- 6843,6849 ---- Thu Aug 26 09:10:58 1999 Alexandre Petit-Bianco * parse.y (lookup_cl): Changed leading comment. Now does its best ! to set the column number. (qualify_ambiguous_name): Take WFL wrappers into account. Wed Aug 25 15:37:15 1999 Gregg Townsend *************** Sun Aug 22 11:07:41 1999 Alexandre Peti *** 5052,5069 **** Thu Aug 19 10:26:18 1999 Alexandre Petit-Bianco * parse.y (method_header): Return a null pointer if the current ! class node is null. (finish_method_declaration): Return if the current function decl ! is null. (source_start_java_method): Likewise. (java_method_add_stmt): Likewise. Wed Aug 18 13:17:15 1999 Alexandre Petit-Bianco * class.c (emit_register_class): Removed unnecessary call to ! start_sequence. * parse.y (labeled_block_contains_loop_p): Removed unused local ! variable. Tue Aug 17 22:51:44 1999 Alexandre Petit-Bianco --- 6921,6938 ---- Thu Aug 19 10:26:18 1999 Alexandre Petit-Bianco * parse.y (method_header): Return a null pointer if the current ! class node is null. (finish_method_declaration): Return if the current function decl ! is null. (source_start_java_method): Likewise. (java_method_add_stmt): Likewise. Wed Aug 18 13:17:15 1999 Alexandre Petit-Bianco * class.c (emit_register_class): Removed unnecessary call to ! start_sequence. * parse.y (labeled_block_contains_loop_p): Removed unused local ! variable. Tue Aug 17 22:51:44 1999 Alexandre Petit-Bianco *************** Tue Jul 20 13:20:05 1999 Alexandre Peti *** 5349,5357 **** * parse.y (resolve_and_layout): Check methods only once. (resolve_qualified_expression_name): Verify thrown exceptions ! compatibility. (check_thrown_exceptions): Reject exceptions thrown in ! initializer. Error message tuned. 1999-07-14 Andrew Haley --- 7218,7226 ---- * parse.y (resolve_and_layout): Check methods only once. (resolve_qualified_expression_name): Verify thrown exceptions ! compatibility. (check_thrown_exceptions): Reject exceptions thrown in ! initializer. Error message tuned. 1999-07-14 Andrew Haley *************** Tue Jul 20 13:20:05 1999 Alexandre Peti *** 5361,5387 **** Sat Jul 3 22:26:32 1999 Alexandre Petit-Bianco * expr.c (force_evaluation_order): Save the COMPOUND_EXPR'ed ! CALL_EXPR, to avoid order of evaluation changes. Fri Jul 2 17:44:08 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Do not use ! IDENTIFIER_LOCAL_VALUE when name is a STRING_CST. Thu Jul 1 23:31:16 1999 Alexandre Petit-Bianco * check-init.c (check_init): Handle MAX_EXPR. * expr.c (force_evaluation_order): Force method call arguments to ! be evaluated in left-to-right order. * parse.y (qualify_ambiguous_name): Loop again to qualify ! NEW_ARRAY_EXPR properly. Wed Jun 30 17:27:58 1999 Alexandre Petit-Bianco * parse.y (patch_invoke): Resolve unresolved invoked method ! returned type. (qualify_ambiguous_name): STRING_CST to qualify expression for ! type name resolution. 1999-06-24 Andrew Haley --- 7230,7256 ---- Sat Jul 3 22:26:32 1999 Alexandre Petit-Bianco * expr.c (force_evaluation_order): Save the COMPOUND_EXPR'ed ! CALL_EXPR, to avoid order of evaluation changes. Fri Jul 2 17:44:08 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Do not use ! IDENTIFIER_LOCAL_VALUE when name is a STRING_CST. Thu Jul 1 23:31:16 1999 Alexandre Petit-Bianco * check-init.c (check_init): Handle MAX_EXPR. * expr.c (force_evaluation_order): Force method call arguments to ! be evaluated in left-to-right order. * parse.y (qualify_ambiguous_name): Loop again to qualify ! NEW_ARRAY_EXPR properly. Wed Jun 30 17:27:58 1999 Alexandre Petit-Bianco * parse.y (patch_invoke): Resolve unresolved invoked method ! returned type. (qualify_ambiguous_name): STRING_CST to qualify expression for ! type name resolution. 1999-06-24 Andrew Haley *************** Fri Jun 25 13:35:19 1999 Alexandre Peti *** 5397,5403 **** * parse.y (resolve_package): Fixed bogus return statement. (patch_method_invocation): Resolve method invocation beginning with ! a package name qualifier. 1999-06-25 Kaveh R. Ghazi --- 7266,7272 ---- * parse.y (resolve_package): Fixed bogus return statement. (patch_method_invocation): Resolve method invocation beginning with ! a package name qualifier. 1999-06-25 Kaveh R. Ghazi *************** Fri Jun 25 13:35:19 1999 Alexandre Peti *** 5409,5422 **** Thu Jun 24 13:12:15 1999 Alexandre Petit-Bianco * parse.y (java_complete_lhs): When doing cross referencing, don't ! try to keep file location on a WFL expanded as a CALL_EXPR. Wed Jun 23 14:37:15 1999 Alexandre Petit-Bianco * parse.y (finish_method_declaration): Insert a RETURN_EXPR when ! compiling to class file a void method with an empty method body. ! As a side effect, the bytecode backend will generate the ! appropriate `return' instruction. Tue Jun 22 20:43:49 1999 Alexandre Petit-Bianco --- 7278,7291 ---- Thu Jun 24 13:12:15 1999 Alexandre Petit-Bianco * parse.y (java_complete_lhs): When doing cross referencing, don't ! try to keep file location on a WFL expanded as a CALL_EXPR. Wed Jun 23 14:37:15 1999 Alexandre Petit-Bianco * parse.y (finish_method_declaration): Insert a RETURN_EXPR when ! compiling to class file a void method with an empty method body. ! As a side effect, the bytecode backend will generate the ! appropriate `return' instruction. Tue Jun 22 20:43:49 1999 Alexandre Petit-Bianco *************** Tue Jun 22 20:43:49 1999 Alexandre Peti *** 5446,5480 **** Mon Jun 14 13:13:39 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Reorganized the post ! evaluation of non WFL leading expression nodes. Fri Jun 11 21:37:18 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Handle ARRAY_REF after ! CONVERT_EXPR. Thu Jun 10 22:26:17 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Handle qualified expression ! beginning with a STRING_CST. Thu Jun 10 20:27:25 1999 Alexandre Petit-Bianco * parse.y (register_fields): Set DECL_INITIAL on both ! pre-initialized static and public fields. (resolve_field_access): Static field access expressions to always ! use pointer types. (qualify_ambiguous_name): Work out buried CALL_EXPR for proper ! qualification. CONVERT_EXPR to be resolved as an expression name. (java_complete_lhs): Identify and access qualified final ! initialized field in switch statement case expression. (fold_constant_for_init): Pre-initialized field decl constant to ! be folded. Mon Jun 7 16:09:51 1999 Alexandre Petit-Bianco * parse.y (note_possible_classname): Mark returned node with ! QUALIFIED_P only if the original class name contained a '/'. Sat Jun 5 11:46:59 1999 Anthony Green --- 7315,7349 ---- Mon Jun 14 13:13:39 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Reorganized the post ! evaluation of non WFL leading expression nodes. Fri Jun 11 21:37:18 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Handle ARRAY_REF after ! CONVERT_EXPR. Thu Jun 10 22:26:17 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Handle qualified expression ! beginning with a STRING_CST. Thu Jun 10 20:27:25 1999 Alexandre Petit-Bianco * parse.y (register_fields): Set DECL_INITIAL on both ! pre-initialized static and public fields. (resolve_field_access): Static field access expressions to always ! use pointer types. (qualify_ambiguous_name): Work out buried CALL_EXPR for proper ! qualification. CONVERT_EXPR to be resolved as an expression name. (java_complete_lhs): Identify and access qualified final ! initialized field in switch statement case expression. (fold_constant_for_init): Pre-initialized field decl constant to ! be folded. Mon Jun 7 16:09:51 1999 Alexandre Petit-Bianco * parse.y (note_possible_classname): Mark returned node with ! QUALIFIED_P only if the original class name contained a '/'. Sat Jun 5 11:46:59 1999 Anthony Green *************** Wed Jun 2 10:44:38 1999 Anthony Green *** 5491,5503 **** Wed Jun 2 10:41:24 1999 Anthony Green * expr.c (expand_byte_code): Fill unreachable bytecode regions ! with nops and process as usual in order to always set correct EH ! ranges. Emit detailed warnings about unreachable bytecodes. Wed Jun 2 10:35:13 1999 Anthony Green * class.c (build_utf8_ref): Mark cinit and utf8 tree nodes as ! constant. Fri May 28 18:22:45 1999 Alexandre Petit-Bianco --- 7360,7372 ---- Wed Jun 2 10:41:24 1999 Anthony Green * expr.c (expand_byte_code): Fill unreachable bytecode regions ! with nops and process as usual in order to always set correct EH ! ranges. Emit detailed warnings about unreachable bytecodes. Wed Jun 2 10:35:13 1999 Anthony Green * class.c (build_utf8_ref): Mark cinit and utf8 tree nodes as ! constant. Fri May 28 18:22:45 1999 Alexandre Petit-Bianco *************** Fri May 28 18:22:45 1999 Alexandre Peti *** 5507,5532 **** Fri May 28 11:34:05 1999 Alexandre Petit-Bianco * parse.y (fold_constant_for_init): Convert numerical constant ! values to the type of the assigned field. Thu May 27 19:57:40 1999 Alexandre Petit-Bianco * expr.c (lookup_field): Relaxed the test on class loading error ! detection. * parse.y (fold_constant_for_init): Enabeled old code. Wed May 26 18:06:02 1999 Alexandre Petit-Bianco * parse.y (valid_ref_assignconv_cast_p): Let `_Jv_CheckCast' ! decide the validity of the cast of a java.lang.Cloneable reference ! to an array. (patch_conditional_expr): Fixed first argument passed to ! binary_numeric_promotion. Wed May 26 15:33:06 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Take into account that a ! CONVERT_EXPR might specify a type as a WFL. Tue May 25 15:06:13 1999 Alexandre Petit-Bianco --- 7376,7401 ---- Fri May 28 11:34:05 1999 Alexandre Petit-Bianco * parse.y (fold_constant_for_init): Convert numerical constant ! values to the type of the assigned field. Thu May 27 19:57:40 1999 Alexandre Petit-Bianco * expr.c (lookup_field): Relaxed the test on class loading error ! detection. * parse.y (fold_constant_for_init): Enabeled old code. Wed May 26 18:06:02 1999 Alexandre Petit-Bianco * parse.y (valid_ref_assignconv_cast_p): Let `_Jv_CheckCast' ! decide the validity of the cast of a java.lang.Cloneable reference ! to an array. (patch_conditional_expr): Fixed first argument passed to ! binary_numeric_promotion. Wed May 26 15:33:06 1999 Alexandre Petit-Bianco * parse.y (qualify_ambiguous_name): Take into account that a ! CONVERT_EXPR might specify a type as a WFL. Tue May 25 15:06:13 1999 Alexandre Petit-Bianco *************** Mon May 24 13:26:00 1999 Alexandre Peti *** 5546,5558 **** Sat May 22 13:54:41 1999 Alexandre Petit-Bianco * parse.y (formal_parameter:): Construct argument tree list ! element even if a yet unsupported final parameter was encountered. Tue May 18 00:28:58 1999 Alexandre Petit-Bianco * parse.y (finish_method_declaration): Issue errors for native or ! abstract methods declared with a method body, as well as for non ! native or non abstract methods with no method body. 1999-05-19 Kaveh R. Ghazi --- 7415,7427 ---- Sat May 22 13:54:41 1999 Alexandre Petit-Bianco * parse.y (formal_parameter:): Construct argument tree list ! element even if a yet unsupported final parameter was encountered. Tue May 18 00:28:58 1999 Alexandre Petit-Bianco * parse.y (finish_method_declaration): Issue errors for native or ! abstract methods declared with a method body, as well as for non ! native or non abstract methods with no method body. 1999-05-19 Kaveh R. Ghazi *************** Mon May 17 19:20:24 1999 Alexandre Peti *** 5598,5610 **** * parse.y (constructor_block_end:): New rule, tagged . (constructor_body:): Use `constructor_block_end' instead of ! `block_end'. Mon May 17 18:01:40 1999 Alexandre Petit-Bianco * parse.y (statement_nsi:): Pop `for' statement block. (java_complete_lhs): Labeled blocks containing no statement are ! marked as completing normally. Fri May 14 12:31:08 1999 Alexandre Petit-Bianco --- 7467,7479 ---- * parse.y (constructor_block_end:): New rule, tagged . (constructor_body:): Use `constructor_block_end' instead of ! `block_end'. Mon May 17 18:01:40 1999 Alexandre Petit-Bianco * parse.y (statement_nsi:): Pop `for' statement block. (java_complete_lhs): Labeled blocks containing no statement are ! marked as completing normally. Fri May 14 12:31:08 1999 Alexandre Petit-Bianco *************** Fri May 14 12:31:08 1999 Alexandre Peti *** 5614,5629 **** Fri May 14 11:57:54 1999 Alexandre Petit-Bianco * check-init.c (check_init): Take into account that ! LABELED_BLOCK_STMT can be empty. Thu May 13 18:30:48 1999 Alexandre Petit-Bianco * parse.y (java_check_regular_methods): Warning check on not ! overriding methods with default access in other packages does not ! apply to `'. (java_complete_lhs): If block body is an empty_stmt_node, replace ! it by NULL_TREE. This prevents gcc from generating an irrelevant ! warning. Thu May 13 13:23:38 1999 Alexandre Petit-Bianco --- 7483,7498 ---- Fri May 14 11:57:54 1999 Alexandre Petit-Bianco * check-init.c (check_init): Take into account that ! LABELED_BLOCK_STMT can be empty. Thu May 13 18:30:48 1999 Alexandre Petit-Bianco * parse.y (java_check_regular_methods): Warning check on not ! overriding methods with default access in other packages does not ! apply to `'. (java_complete_lhs): If block body is an empty_stmt_node, replace ! it by NULL_TREE. This prevents gcc from generating an irrelevant ! warning. Thu May 13 13:23:38 1999 Alexandre Petit-Bianco *************** Thu May 13 13:23:38 1999 Alexandre Peti *** 5632,5652 **** * java-tree.h (do_not_fold): New global variable, declared. * parse.y (do_not_fold): New global variable, defined. (java_complete_expand_method): Set `do_not_fold' to the value of ! `flag_emit_xref'. When doing xrefs: copy the thrown exceptions, ! and reinstall them after them have been purged; do not check for ! initializations; do not issue missing return errors. (java_complete_lhs): Do not attempt to patch INSTANCEOF_EXPR nodes ! when doing xrefs. (patch_binop): Skip the fold part when doing xrefs. (build_string_concatenation): Skip the concatenation part when ! doing xrefs. (patch_synchronized_statement): Do not generate a try-finally when ! doing xrefs. (patch_throw_statement): When doing xrefs, do not call BUILD_THROW ! and keep the location where the throw was seen. * typeck.c (convert): When `do_not_fold' is set, do not attempt ! any treatment on the converted node an simply return a NOP_EXPR of ! the targeted type. * xref.c (xref_get_data): New function, defined. * xref.h (xref_get_data): New function, declared. (XREF_GET_DATA): Use xref_get_data. --- 7501,7521 ---- * java-tree.h (do_not_fold): New global variable, declared. * parse.y (do_not_fold): New global variable, defined. (java_complete_expand_method): Set `do_not_fold' to the value of ! `flag_emit_xref'. When doing xrefs: copy the thrown exceptions, ! and reinstall them after them have been purged; do not check for ! initializations; do not issue missing return errors. (java_complete_lhs): Do not attempt to patch INSTANCEOF_EXPR nodes ! when doing xrefs. (patch_binop): Skip the fold part when doing xrefs. (build_string_concatenation): Skip the concatenation part when ! doing xrefs. (patch_synchronized_statement): Do not generate a try-finally when ! doing xrefs. (patch_throw_statement): When doing xrefs, do not call BUILD_THROW ! and keep the location where the throw was seen. * typeck.c (convert): When `do_not_fold' is set, do not attempt ! any treatment on the converted node an simply return a NOP_EXPR of ! the targeted type. * xref.c (xref_get_data): New function, defined. * xref.h (xref_get_data): New function, declared. (XREF_GET_DATA): Use xref_get_data. *************** Tue May 11 11:46:36 1999 Dave Brolley *** 5740,5752 **** Fri Apr 30 17:54:40 1999 Alexandre Petit-Bianco * check-init.c (check_init): Exclude a case of error when doing ! xrefs. * class.c (layout_class_method): Don't generate the error message ! twice when compiling from source. * lang-options.h: Added `-Wredundant-modifers' and `-Wunusupported-jdk11' flags and help text. * lang.c (lang_decode_option): Added support for ! `-Wunsupported-jdk11' and `-Wredundant-modifiers'. flag_static_local_jdk11 and flag_redundant set accordingly. * lex.c (java_lex): Call BUILD_OPERATOR on CCB_TK. * parse.h (EXPR_WFL_ADD_COL): New macro. --- 7609,7621 ---- Fri Apr 30 17:54:40 1999 Alexandre Petit-Bianco * check-init.c (check_init): Exclude a case of error when doing ! xrefs. * class.c (layout_class_method): Don't generate the error message ! twice when compiling from source. * lang-options.h: Added `-Wredundant-modifers' and `-Wunusupported-jdk11' flags and help text. * lang.c (lang_decode_option): Added support for ! `-Wunsupported-jdk11' and `-Wredundant-modifiers'. flag_static_local_jdk11 and flag_redundant set accordingly. * lex.c (java_lex): Call BUILD_OPERATOR on CCB_TK. * parse.h (EXPR_WFL_ADD_COL): New macro. *************** Fri Apr 30 17:54:40 1999 Alexandre Peti *** 5755,5783 **** * parse.y (static_ref_err): New function, prototyped. (CCB_TK): Now tagged . (class_body:): Remember the location of the closing '}' of a class ! definition when doing xrefs. (block:): Likewise. (block_end:): Likewise. (create_class): Remember the location of the inherited class ! identifier when doing xrefs. (register_fields): Added test on first operand of `init' before ! testing it TREE_CODE. (method_header): Store the location of the class identifier in the ! class decl when doing xrefs. (finish_method_declaration): Don't combine first/last method line ! when doing xref. (java_check_regular_methods): Warning check on not overriding ! methods with default access on other packages move before check on ! static methods. Initialization of `aflags' also moved up. (resolve_expression_name): Call static_ref_err to report the error. (static_ref_err): New function, implemented. (resolve_field_access): Returned simplified static field access ! when doing xrefs. (resolve_qualified_expression_name): Check for illegal use of ! static fields in a non static context. Call static_ref_err to ! report error in various places. (java_complete_tree): Do not fold initialized static fields when ! doing xrefs. (java_complete_lhs): Likewise. 1999-04-29 Anthony Green --- 7624,7652 ---- * parse.y (static_ref_err): New function, prototyped. (CCB_TK): Now tagged . (class_body:): Remember the location of the closing '}' of a class ! definition when doing xrefs. (block:): Likewise. (block_end:): Likewise. (create_class): Remember the location of the inherited class ! identifier when doing xrefs. (register_fields): Added test on first operand of `init' before ! testing it TREE_CODE. (method_header): Store the location of the class identifier in the ! class decl when doing xrefs. (finish_method_declaration): Don't combine first/last method line ! when doing xref. (java_check_regular_methods): Warning check on not overriding ! methods with default access on other packages move before check on ! static methods. Initialization of `aflags' also moved up. (resolve_expression_name): Call static_ref_err to report the error. (static_ref_err): New function, implemented. (resolve_field_access): Returned simplified static field access ! when doing xrefs. (resolve_qualified_expression_name): Check for illegal use of ! static fields in a non static context. Call static_ref_err to ! report error in various places. (java_complete_tree): Do not fold initialized static fields when ! doing xrefs. (java_complete_lhs): Likewise. 1999-04-29 Anthony Green *************** Fri Apr 30 17:54:40 1999 Alexandre Peti *** 5789,5817 **** Sat Apr 24 16:50:19 1999 Alexandre Petit-Bianco * class.c (layout_class_method): Generate 's rtl for ! interfaces. * decl.c (complete_start_java_method): Don't call _Jv_InitClass ! for interfaces' . * expr.c (lookup_field): Search for fields in interfaces. (expand_invoke): Fixed indentation. (expand_java_field_op): Likewise. Use IS_CLINIT. * parse.h (JPRIMITIVE_TYPE_OR_VOID_P): Macro removed. (IS_CLINIT): New macro. * parse.y (type_declaration:): Call maybe_generate_clinit after an ! interface was parsed. (maybe_generate_clinit): Don't generate if the current class is an ! interface with only fields of primitive types. (reset_method_name): Use IS_CLINIT. (java_complete_expand_method): Expand when it exists for ! interfaces. Use IS_CLINIT. (resolve_expression_name): Use DECL_CONTEXT instead of ! current_class to build static field references. (java_complete_lhs): Use IS__CLINIT. Don't use SAVE_EXPR on ! ARRAY_REF when doing xreferencing. (check_final_assignment): Fixed typo in leading comment. Use ! IS_CLINIT. (patch_array_ref): Don't fully expand array references when ! xreferencing. (patch_return): Use IS_CLINIT. (patch_throw_statement): Likewise. --- 7658,7686 ---- Sat Apr 24 16:50:19 1999 Alexandre Petit-Bianco * class.c (layout_class_method): Generate 's rtl for ! interfaces. * decl.c (complete_start_java_method): Don't call _Jv_InitClass ! for interfaces' . * expr.c (lookup_field): Search for fields in interfaces. (expand_invoke): Fixed indentation. (expand_java_field_op): Likewise. Use IS_CLINIT. * parse.h (JPRIMITIVE_TYPE_OR_VOID_P): Macro removed. (IS_CLINIT): New macro. * parse.y (type_declaration:): Call maybe_generate_clinit after an ! interface was parsed. (maybe_generate_clinit): Don't generate if the current class is an ! interface with only fields of primitive types. (reset_method_name): Use IS_CLINIT. (java_complete_expand_method): Expand when it exists for ! interfaces. Use IS_CLINIT. (resolve_expression_name): Use DECL_CONTEXT instead of ! current_class to build static field references. (java_complete_lhs): Use IS__CLINIT. Don't use SAVE_EXPR on ! ARRAY_REF when doing xreferencing. (check_final_assignment): Fixed typo in leading comment. Use ! IS_CLINIT. (patch_array_ref): Don't fully expand array references when ! xreferencing. (patch_return): Use IS_CLINIT. (patch_throw_statement): Likewise. *************** Wed Apr 21 11:13:36 1999 Alexandre Peti *** 5823,5858 **** * decl.c (predef_filenames, predef_filenames_size): New globals (init_decl_processing): predef_filenames and predef_filenames_size ! initialized. * java-tree.h (predef_filenames, predef_filenames_size): Declared ! extern. * jcf-parse.c (predefined_filename_p): New function. (yyparse): Check that files on the command line are specified only ! once and issue a warning otherwise. * parse.h (JPRIMITIVE_TYPE_OR_VOID_P): New macro. * parse.y (source_end_java_method): Nullify NOP method bodies, to ! avoid a gcc warning with -W -Wall turned on. (java_expand_classes): Abort if errors were encountered. (java_complete_lhs): If the cross reference flag is set, wrap ! field DECL node around a WFL when resolving expression name. Mon Apr 19 14:44:48 1999 Alexandre Petit-Bianco * lang.c (lang_decode_option): Fixed returned value when parsing ! `-fxref=...' and `-Wall'. * parse.y (source_end_java_method): Do not generate code when ! flag_emit_xref is set. (resolve_expression_name): Do not build static field access when ! flag_emit_xref is set. (resolve_field_access): No special treatment on `length' when ! flag_emit_xref is set. Do not build qualified static field access ! when flag_emit_xref is set. (patch_invoke): Keep the method DECL as operand 0 of the CALL_EXPR ! when flag_emit_xref is set. (patch_assignment): Do not generate array store runtime check when ! flag_emit_xref is set. * xref.c (xref_flag_value): Fixed function declaration ! indentation. (xset_set_data): New function. * xref.h (xref_set_data): Added prototype for new function. (typedef struct xref_flag_table): New field data. --- 7692,7727 ---- * decl.c (predef_filenames, predef_filenames_size): New globals (init_decl_processing): predef_filenames and predef_filenames_size ! initialized. * java-tree.h (predef_filenames, predef_filenames_size): Declared ! extern. * jcf-parse.c (predefined_filename_p): New function. (yyparse): Check that files on the command line are specified only ! once and issue a warning otherwise. * parse.h (JPRIMITIVE_TYPE_OR_VOID_P): New macro. * parse.y (source_end_java_method): Nullify NOP method bodies, to ! avoid a gcc warning with -W -Wall turned on. (java_expand_classes): Abort if errors were encountered. (java_complete_lhs): If the cross reference flag is set, wrap ! field DECL node around a WFL when resolving expression name. Mon Apr 19 14:44:48 1999 Alexandre Petit-Bianco * lang.c (lang_decode_option): Fixed returned value when parsing ! `-fxref=...' and `-Wall'. * parse.y (source_end_java_method): Do not generate code when ! flag_emit_xref is set. (resolve_expression_name): Do not build static field access when ! flag_emit_xref is set. (resolve_field_access): No special treatment on `length' when ! flag_emit_xref is set. Do not build qualified static field access ! when flag_emit_xref is set. (patch_invoke): Keep the method DECL as operand 0 of the CALL_EXPR ! when flag_emit_xref is set. (patch_assignment): Do not generate array store runtime check when ! flag_emit_xref is set. * xref.c (xref_flag_value): Fixed function declaration ! indentation. (xset_set_data): New function. * xref.h (xref_set_data): Added prototype for new function. (typedef struct xref_flag_table): New field data. *************** Thu Apr 15 13:08:03 1999 Anthony Green *** 5873,5879 **** Mon Apr 12 18:27:32 1999 Alexandre Petit-Bianco * parse.y (patch_unaryop): Fixed ++/-- operator check on array ! references. Tue Apr 6 23:15:52 1999 Jeffrey A Law (law@cygnus.com) --- 7742,7748 ---- Mon Apr 12 18:27:32 1999 Alexandre Petit-Bianco * parse.y (patch_unaryop): Fixed ++/-- operator check on array ! references. Tue Apr 6 23:15:52 1999 Jeffrey A Law (law@cygnus.com) *************** Mon Apr 5 11:24:19 1999 Alexandre Peti *** 5936,5942 **** * parse.y (struct parser_ctxt *ctxp): Now global. (declare_local_variables): Use WFL compound value for the ! declaration source line value, when doing cross-referencing. 1999-03-31 Tom Tromey --- 7805,7811 ---- * parse.y (struct parser_ctxt *ctxp): Now global. (declare_local_variables): Use WFL compound value for the ! declaration source line value, when doing cross-referencing. 1999-03-31 Tom Tromey *************** Wed Mar 31 11:00:32 1999 Kaveh R. Ghazi *** 5960,5971 **** Tue Mar 30 11:31:53 1999 Alexandre Petit-Bianco * parse.y (patch_bc_statement): Fixed identation and a bogus ! `printf' format. Tue Mar 30 11:29:29 1999 Alexandre Petit-Bianco * parse.y (patch_assignment): Allow static variables in other ! classes to be assigned. Sun Mar 28 22:12:10 1999 Kaveh R. Ghazi --- 7829,7840 ---- Tue Mar 30 11:31:53 1999 Alexandre Petit-Bianco * parse.y (patch_bc_statement): Fixed identation and a bogus ! `printf' format. Tue Mar 30 11:29:29 1999 Alexandre Petit-Bianco * parse.y (patch_assignment): Allow static variables in other ! classes to be assigned. Sun Mar 28 22:12:10 1999 Kaveh R. Ghazi *************** Sun Mar 28 22:12:10 1999 Kaveh R. Ghazi *** 5982,5988 **** Sat Mar 27 15:49:18 1999 Per Bothner * parse.y (complete_loop_body): Rename to finish_loop_body. ! (complete_labeled_statement): Rename to finish_labeled_statement. (complete_for_loop): Rename to finish_for_loop. (complete_method_declaration): Rename to finish_method_declaration. --- 7851,7857 ---- Sat Mar 27 15:49:18 1999 Per Bothner * parse.y (complete_loop_body): Rename to finish_loop_body. ! (complete_labeled_statement): Rename to finish_labeled_statement. (complete_for_loop): Rename to finish_for_loop. (complete_method_declaration): Rename to finish_method_declaration. *************** Sat Mar 27 15:49:18 1999 Per Bothner < *** 5999,6012 **** Sat Mar 27 15:13:21 1999 Alexandre Petit-Bianco * parse.h (EXPR_WFL_GET_LINECOL): Set a line and column count ! using a WFL compound value. * parse.y (xref.h): Include. (maybe_create_class_interface_decl): Set DECL_SOURCE_LINE to the ! WFL compound value. (register_fields): Set WFL compound value to lineno if doing ! xrefs. (java_complete_expand_method): Call expand_xref if flag_emit_xref ! is set. * xref.c (system.h, jcf.h, parse.h, obstack.h): Include. * xref.h (expand_xref): Prototype renamed from xref_generate. --- 7868,7881 ---- Sat Mar 27 15:13:21 1999 Alexandre Petit-Bianco * parse.h (EXPR_WFL_GET_LINECOL): Set a line and column count ! using a WFL compound value. * parse.y (xref.h): Include. (maybe_create_class_interface_decl): Set DECL_SOURCE_LINE to the ! WFL compound value. (register_fields): Set WFL compound value to lineno if doing ! xrefs. (java_complete_expand_method): Call expand_xref if flag_emit_xref ! is set. * xref.c (system.h, jcf.h, parse.h, obstack.h): Include. * xref.h (expand_xref): Prototype renamed from xref_generate. *************** Sat Mar 27 14:16:32 1999 Alexandre Peti *** 6017,6036 **** * parse.y (current_static_block): New global variable. (method_body:): Define action. (complete_method_declaration): Set current_function_decl to NULL ! when work on the current method is done. (declare_local_variables): Use GET_CURRENT_BLOCK. (java_method_add_stmt): Likewise. (java_complete_expand_method): Disable the use of `this' when ! expanding . (enter_a_block): If no current method exist, use ! current_static_block to link static initializer blocks. (exit_block): Rewritten to use current_static_block when no current ! method decl exists. (lookup_name_in_blocks): Use GET_CURRENT_BLOCK. (patch_return): Forbid the use of `return' in static initializers. (patch_throw_statement): Fixed indentation. Issue specific error ! for uncaught thrown checked exception in static initializer ! blocks. Removed FIXME. 1999-03-25 Zack Weinberg --- 7886,7905 ---- * parse.y (current_static_block): New global variable. (method_body:): Define action. (complete_method_declaration): Set current_function_decl to NULL ! when work on the current method is done. (declare_local_variables): Use GET_CURRENT_BLOCK. (java_method_add_stmt): Likewise. (java_complete_expand_method): Disable the use of `this' when ! expanding . (enter_a_block): If no current method exist, use ! current_static_block to link static initializer blocks. (exit_block): Rewritten to use current_static_block when no current ! method decl exists. (lookup_name_in_blocks): Use GET_CURRENT_BLOCK. (patch_return): Forbid the use of `return' in static initializers. (patch_throw_statement): Fixed indentation. Issue specific error ! for uncaught thrown checked exception in static initializer ! blocks. Removed FIXME. 1999-03-25 Zack Weinberg *************** Sat Mar 27 14:16:32 1999 Alexandre Peti *** 6040,6047 **** Tue Mar 23 10:48:24 1999 Alexandre Petit-Bianco * parse.y (find_applicable_accessible_methods_list): When dealing ! with interface: ensure that a given interface or java.lang.Object ! are searched only once. Tue Mar 23 10:05:27 1999 Kaveh R. Ghazi --- 7909,7916 ---- Tue Mar 23 10:48:24 1999 Alexandre Petit-Bianco * parse.y (find_applicable_accessible_methods_list): When dealing ! with interface: ensure that a given interface or java.lang.Object ! are searched only once. Tue Mar 23 10:05:27 1999 Kaveh R. Ghazi *************** Mon Mar 22 20:14:26 1999 Alexandre Peti *** 6065,6071 **** * Changelog: Fixed 1999-03-22 typos. * lang.c (lang_decode_option): Fixed typo in error string in the ! XARG section. 1999-03-22 Alexandre Petit-Bianco --- 7934,7940 ---- * Changelog: Fixed 1999-03-22 typos. * lang.c (lang_decode_option): Fixed typo in error string in the ! XARG section. 1999-03-22 Alexandre Petit-Bianco *************** Sun Mar 21 08:30:30 1999 Kaveh R. Ghazi *** 6162,6168 **** write_chunks, adjust_typed_op, generate_bytecode_conditional, generate_bytecode_return, perform_relocations, init_jcf_state, init_jcf_method, release_jcf_state, generate_classfile): ! Add static prototype. (emit_unop): Mark parameter `type' with ATTRIBUTE_UNUSED. (make_class_file_name): Const-ify. --- 8031,8037 ---- write_chunks, adjust_typed_op, generate_bytecode_conditional, generate_bytecode_return, perform_relocations, init_jcf_state, init_jcf_method, release_jcf_state, generate_classfile): ! Add static prototype. (emit_unop): Mark parameter `type' with ATTRIBUTE_UNUSED. (make_class_file_name): Const-ify. *************** Sun Mar 21 08:30:30 1999 Kaveh R. Ghazi *** 6176,6183 **** * lang.c (lang_f_options): Const-ify. * lex.c (java_parse_escape_sequence): Add static prototype. ! (java_allocate_new_line): Match definition to existing static ! prototype. * mangle.c Include tree.h/java-tree.h. (unicode_mangling_length, emit_unicode_mangled_name, --- 8045,8052 ---- * lang.c (lang_f_options): Const-ify. * lex.c (java_parse_escape_sequence): Add static prototype. ! (java_allocate_new_line): Match definition to existing static ! prototype. * mangle.c Include tree.h/java-tree.h. (unicode_mangling_length, emit_unicode_mangled_name, *************** Sat Mar 13 18:16:34 1999 Per Bothner < *** 6269,6275 **** Fri Mar 12 19:42:55 1999 Kaveh R. Ghazi * constants.c (find_class_or_string_constant): Cast variable `j' ! to a `jword' when comparing against one. * expr.c (java_lang_expand_expr): Remove unused variables `has_finally_p' and `op0'. --- 8138,8144 ---- Fri Mar 12 19:42:55 1999 Kaveh R. Ghazi * constants.c (find_class_or_string_constant): Cast variable `j' ! to a `jword' when comparing against one. * expr.c (java_lang_expand_expr): Remove unused variables `has_finally_p' and `op0'. *************** Wed Mar 10 23:20:11 1999 Per Bothner < *** 6307,6314 **** Tue Mar 9 11:52:08 1999 Alexandre Petit-Bianco ! * parse.y (method_header): Don't set ACC_ABSTRACT flags on ! interfaces. Fri Mar 5 15:17:29 1999 Per Bothner --- 8176,8183 ---- Tue Mar 9 11:52:08 1999 Alexandre Petit-Bianco ! * parse.y (method_header): Don't set ACC_ABSTRACT flags on ! interfaces. Fri Mar 5 15:17:29 1999 Per Bothner *************** Sat Mar 6 11:17:16 1999 Kaveh R. Ghazi *** 6336,6342 **** (parse-scan.o): Depend on toplev.h. * class.c (make_method_value): Add prototype. Make it static. ! Remove unused second argument, caller changed. * expr.c (java_lang_expand_expr): Remove unused variable `return_label'. --- 8205,8211 ---- (parse-scan.o): Depend on toplev.h. * class.c (make_method_value): Add prototype. Make it static. ! Remove unused second argument, caller changed. * expr.c (java_lang_expand_expr): Remove unused variable `return_label'. *************** Fri Feb 19 13:00:56 1999 Per Bothner < *** 6507,6516 **** Wed Feb 17 15:47:20 1999 Alexandre Petit-Bianco * parse.y (check_pkg_class_access): Allow private class access ! within the same package. (strip_out_static_field_access_decl): New function. (patch_unaryop): Call strip_out_static_field_access_decl on ++/-- ! operator argument before testing its nature. Wed Feb 3 12:38:43 1999 Per Bothner --- 8376,8385 ---- Wed Feb 17 15:47:20 1999 Alexandre Petit-Bianco * parse.y (check_pkg_class_access): Allow private class access ! within the same package. (strip_out_static_field_access_decl): New function. (patch_unaryop): Call strip_out_static_field_access_decl on ++/-- ! operator argument before testing its nature. Wed Feb 3 12:38:43 1999 Per Bothner *************** Wed Feb 3 12:38:43 1999 Per Bothner < *** 6549,6556 **** Thu Feb 11 21:25:51 1999 Alexandre Petit-Bianco ! * parse.y (valid_builtin_assignconv_identity_widening_p): Got rid ! of an ancient workaround. Wed Feb 10 23:27:33 1999 Jeffrey A Law (law@cygnus.com) --- 8418,8425 ---- Thu Feb 11 21:25:51 1999 Alexandre Petit-Bianco ! * parse.y (valid_builtin_assignconv_identity_widening_p): Got rid ! of an ancient workaround. Wed Feb 10 23:27:33 1999 Jeffrey A Law (law@cygnus.com) *************** Tue Feb 9 19:31:09 1999 Alexandre Peti *** 6578,6588 **** * lex.c (java_lang_cloneable): Initialize. * parse.y (java_lang_cloneable): New static variable. (qualify_ambiguous_name): Take CONVERT_EXPR into account when ! doing one more qualification round. (valid_ref_assignconv_cast_p): Reject null source or ! destination. Allow an array to be cast into java.lang.Cloneable. (patch_cast): Swapped two first arguments to first call to ! valid_ref_assignconv_cast_p. Mon Feb 8 11:50:50 1999 Alexandre Petit-Bianco --- 8447,8457 ---- * lex.c (java_lang_cloneable): Initialize. * parse.y (java_lang_cloneable): New static variable. (qualify_ambiguous_name): Take CONVERT_EXPR into account when ! doing one more qualification round. (valid_ref_assignconv_cast_p): Reject null source or ! destination. Allow an array to be cast into java.lang.Cloneable. (patch_cast): Swapped two first arguments to first call to ! valid_ref_assignconv_cast_p. Mon Feb 8 11:50:50 1999 Alexandre Petit-Bianco *************** Tue Feb 2 19:49:12 1999 Jeffrey A Law *** 6618,6624 **** Tue Feb 2 20:04:50 1999 Kaveh R. Ghazi * jvspec.c (xmalloc): Fix the prototype to match the one obtained ! from libiberty.h Tue Feb 2 10:39:47 1999 Per Bothner --- 8487,8493 ---- Tue Feb 2 20:04:50 1999 Kaveh R. Ghazi * jvspec.c (xmalloc): Fix the prototype to match the one obtained ! from libiberty.h Tue Feb 2 10:39:47 1999 Per Bothner *************** Fri Jan 29 18:19:02 1999 Alexandre Peti *** 6646,6660 **** * lex.c (java_read_char): Fixed utf8 decoding. (java_unicode_2_utf8): Fixed utf8 encoding in the 0x800-0xffff ! range. * parse.y (valid_builtin_assignconv_identity_widening_p): Fixed ! comments. Local variable `all_primitive' is gone. Broadened ! acceptance of `0' to floating point targets. `long' can now be ! widened to `double' or `float'. (valid_method_invocation_conversion_p): Added leading ! comment. Fixed tabulation. (build_string_concatenation): Optimize out left or right empty ! string constants. Thu Jan 28 18:51:26 1999 Per Bothner --- 8515,8529 ---- * lex.c (java_read_char): Fixed utf8 decoding. (java_unicode_2_utf8): Fixed utf8 encoding in the 0x800-0xffff ! range. * parse.y (valid_builtin_assignconv_identity_widening_p): Fixed ! comments. Local variable `all_primitive' is gone. Broadened ! acceptance of `0' to floating point targets. `long' can now be ! widened to `double' or `float'. (valid_method_invocation_conversion_p): Added leading ! comment. Fixed tabulation. (build_string_concatenation): Optimize out left or right empty ! string constants. Thu Jan 28 18:51:26 1999 Per Bothner *************** Thu Jan 28 11:50:11 1999 Alexandre Peti *** 6707,6722 **** * jcf-parse.c (jcf_parse): Don't parse the same class file twice. * parse.y (patch_cast): Allow a boolean to be cast into a ! boolean. Wed Jan 27 10:19:29 1999 Alexandre Petit-Bianco * parse.y: (class_declaration:): Fixed indentation. (class_member_declaration:): Extra `;' after field declaration now ! accepted. (interface_declaration:): Removed debug messages in error reports. (patch_binop): Nodes created and returned inherit the orignal ! node's COMPOUND_ASSIGN_P flag value. (patch_cast): Fix cast from char to floating point. Mon Jan 25 17:39:19 1999 Andrew Haley --- 8576,8591 ---- * jcf-parse.c (jcf_parse): Don't parse the same class file twice. * parse.y (patch_cast): Allow a boolean to be cast into a ! boolean. Wed Jan 27 10:19:29 1999 Alexandre Petit-Bianco * parse.y: (class_declaration:): Fixed indentation. (class_member_declaration:): Extra `;' after field declaration now ! accepted. (interface_declaration:): Removed debug messages in error reports. (patch_binop): Nodes created and returned inherit the orignal ! node's COMPOUND_ASSIGN_P flag value. (patch_cast): Fix cast from char to floating point. Mon Jan 25 17:39:19 1999 Andrew Haley *************** Sat Jan 23 23:02:43 1999 Kaveh R. Ghazi *** 6837,6849 **** Thu Jan 21 16:00:06 1999 Andrew Haley * typeck.c (convert): Allow conversions to void type: some ! optimizations in gcc do this. Thu Jan 21 15:21:49 1999 Andrew Haley * typeck.c (convert_ieee_real_to_integer): New function. (convert): When not using fast-math and using hardware fp, convert ! an IEEE NaN to zero. 1999-01-18 Andrew Haley --- 8706,8718 ---- Thu Jan 21 16:00:06 1999 Andrew Haley * typeck.c (convert): Allow conversions to void type: some ! optimizations in gcc do this. Thu Jan 21 15:21:49 1999 Andrew Haley * typeck.c (convert_ieee_real_to_integer): New function. (convert): When not using fast-math and using hardware fp, convert ! an IEEE NaN to zero. 1999-01-18 Andrew Haley *************** Sun Jan 17 22:34:22 1999 Alexandre Peti *** 6857,6863 **** * parse.y (do_resolve_class): Removed unused locals. (read_import_dir): Likewise. (resolve_qualified_expression_name): Array creation ! expressions are valid primary expressions. (qualify_ambiguous_name): Likewise. (patch_synchronized_statement): Removed unused local. --- 8726,8732 ---- * parse.y (do_resolve_class): Removed unused locals. (read_import_dir): Likewise. (resolve_qualified_expression_name): Array creation ! expressions are valid primary expressions. (qualify_ambiguous_name): Likewise. (patch_synchronized_statement): Removed unused local. *************** Wed Jan 13 01:24:54 1999 Alexandre Peti *** 6910,6920 **** (dims:): Uses a stack to keep track of array dimensions. (cast_expression:): Use CURRENT_OSB. (find_expr_with_wfl): Return NULL if node found doesn't meet the ! conditions. (register_fields): Fixed typos in comment. (check_method_redefinition): Fixed comment indentation. (java_check_regular_methods): Set saved found wfl to NULL after ! having reinstalled it in the previously found DECL_NAME. Sun Jan 10 13:36:14 1999 Richard Henderson --- 8779,8789 ---- (dims:): Uses a stack to keep track of array dimensions. (cast_expression:): Use CURRENT_OSB. (find_expr_with_wfl): Return NULL if node found doesn't meet the ! conditions. (register_fields): Fixed typos in comment. (check_method_redefinition): Fixed comment indentation. (java_check_regular_methods): Set saved found wfl to NULL after ! having reinstalled it in the previously found DECL_NAME. Sun Jan 10 13:36:14 1999 Richard Henderson *************** Mon Dec 14 18:49:29 1998 Per Bothner < *** 7048,7054 **** * parse.y (fold_constant_for_init): New function. (resolve_expression_name): Don't replace static final ! constant-initialized fields by its value. (java_complete_lhs): New. Same as java_complete_tree, except does not replace static final constant-initialized fields by their values. (register_fields): If there is an initializer, set DECL_INITIAL and --- 8917,8923 ---- * parse.y (fold_constant_for_init): New function. (resolve_expression_name): Don't replace static final ! constant-initialized fields by its value. (java_complete_lhs): New. Same as java_complete_tree, except does not replace static final constant-initialized fields by their values. (register_fields): If there is an initializer, set DECL_INITIAL and *************** Sat Dec 12 20:13:19 1998 Per Bothner < *** 7116,7122 **** COMPONENT_REF - only to handle PRIMCLASS.TYPE. * parse.y (patch_synchronized_statement): Don't call monitorexit ! unless block CAN_COMPLETE_NORMALLY. Propagate that flag properly. * java-tree.h (DECL_LOCAL_STATIC_VALUE): Removed - no longer used. --- 8985,8991 ---- COMPONENT_REF - only to handle PRIMCLASS.TYPE. * parse.y (patch_synchronized_statement): Don't call monitorexit ! unless block CAN_COMPLETE_NORMALLY. Propagate that flag properly. * java-tree.h (DECL_LOCAL_STATIC_VALUE): Removed - no longer used. *************** Sat Dec 12 19:21:11 1998 Per Bothner < *** 7177,7183 **** Now is passed the actual array (pointer) type of the value. Set the type of the CONSTRUCTOR to be an ARRAY_TYPE. (patch_array_constructor): Removed - merged into patch_new_array_init. ! (java_complete_tree): Update patch_new_array_init. * jcf-write.c (find_constant_index): New function. (generate_bytecode_insns): Use find_constant_index. --- 9046,9052 ---- Now is passed the actual array (pointer) type of the value. Set the type of the CONSTRUCTOR to be an ARRAY_TYPE. (patch_array_constructor): Removed - merged into patch_new_array_init. ! (java_complete_tree): Update patch_new_array_init. * jcf-write.c (find_constant_index): New function. (generate_bytecode_insns): Use find_constant_index. *************** Sat Dec 12 19:21:11 1998 Per Bothner < *** 7193,7247 **** Thu Dec 10 20:00:54 1998 Alexandre Petit-Bianco * decl.c (long_zero_node, float_zero_node, double_zero_node): New ! global variables, initialized. * java-tree.h (long_zero_node, float_zero_node, double_zero_node): ! Declared new global variables. * lex.c (java_lex): Return long_zero_node, float_zero_node, ! double_zero_node, integer_zero_node upon direct matching. * parse.y (purify_type_name): Added function prototype. (duplicate_declaration_error_p): Consider new_type as potentially ! being a incomplete type. Use purify_type_name on type string. (method_header): saved_type: unused variable removed. Don't figure ! return type if method name is invalid. (java_complete_tree): Set CAN_COMPLETE_NORMALLY after `node' was ! processed by patch_unaryop. (patch_unaryop): Fixed typo in comment. Re-convert pre/post ! increment/decrement node into its original type after binary ! numeric promotion on its operands. Thu Dec 10 11:02:49 1998 Alexandre Petit-Bianco * parse.y (array_initializer:): Array init operand is NULL_TREE ! instead of a TREE_LIST of NULL_TREEs when parsing `{}'. `{,}' is ! now an error. Fixed indentation problems. (patch_string): Handle error_mark_node as an argument. (patch_new_array_init): Fixed indentation problems. (array_constructor_check_entry): Removed check on null wfl_value. ! Return an error if wfl_value's walk returns an error. Wed Dec 9 15:37:05 1998 Alexandre Petit-Bianco * java-tree.def (NEW_ARRAY_INIT): New Java tree code. * lex.c (java_lex): Remember column position before advancing one ! token. Retain location information on OCB_TK. * lex.h (typedef struct java_lc): Added new field. * parse.h (GET_SKIP_TYPE): New macro. (QUAL_DECL_TYPE): Redefined using GET_SKIP_TYPE. * parse.y (build_new_array_init, patch_new_array_init, ! patch_array_constructor, maybe_build_array_element_wfl, ! array_constructor_check_entry): New function prototypes. (switch_block:): Tagged . (OCB_TK): Tagged . (array_initializer:): Installed actions. (variable_initializer): Build location information on element if ! necessary. (switch_statement:): Fixed indentation typo. (switch_block:): Redefined default action. (java_complete_tree): Handle NEW_ARRAY_INIT in MODIFY_EXPR:. (patch_assignment): Removed duplicate code. (maybe_build_array_element_wfl, build_new_array_init, ! patch_new_array_init, patch_array_constructor, ! array_constructor_check_entry): New functions. Mon Dec 7 15:13:52 1998 Alexandre Petit-Bianco --- 9062,9116 ---- Thu Dec 10 20:00:54 1998 Alexandre Petit-Bianco * decl.c (long_zero_node, float_zero_node, double_zero_node): New ! global variables, initialized. * java-tree.h (long_zero_node, float_zero_node, double_zero_node): ! Declared new global variables. * lex.c (java_lex): Return long_zero_node, float_zero_node, ! double_zero_node, integer_zero_node upon direct matching. * parse.y (purify_type_name): Added function prototype. (duplicate_declaration_error_p): Consider new_type as potentially ! being a incomplete type. Use purify_type_name on type string. (method_header): saved_type: unused variable removed. Don't figure ! return type if method name is invalid. (java_complete_tree): Set CAN_COMPLETE_NORMALLY after `node' was ! processed by patch_unaryop. (patch_unaryop): Fixed typo in comment. Re-convert pre/post ! increment/decrement node into its original type after binary ! numeric promotion on its operands. Thu Dec 10 11:02:49 1998 Alexandre Petit-Bianco * parse.y (array_initializer:): Array init operand is NULL_TREE ! instead of a TREE_LIST of NULL_TREEs when parsing `{}'. `{,}' is ! now an error. Fixed indentation problems. (patch_string): Handle error_mark_node as an argument. (patch_new_array_init): Fixed indentation problems. (array_constructor_check_entry): Removed check on null wfl_value. ! Return an error if wfl_value's walk returns an error. Wed Dec 9 15:37:05 1998 Alexandre Petit-Bianco * java-tree.def (NEW_ARRAY_INIT): New Java tree code. * lex.c (java_lex): Remember column position before advancing one ! token. Retain location information on OCB_TK. * lex.h (typedef struct java_lc): Added new field. * parse.h (GET_SKIP_TYPE): New macro. (QUAL_DECL_TYPE): Redefined using GET_SKIP_TYPE. * parse.y (build_new_array_init, patch_new_array_init, ! patch_array_constructor, maybe_build_array_element_wfl, ! array_constructor_check_entry): New function prototypes. (switch_block:): Tagged . (OCB_TK): Tagged . (array_initializer:): Installed actions. (variable_initializer): Build location information on element if ! necessary. (switch_statement:): Fixed indentation typo. (switch_block:): Redefined default action. (java_complete_tree): Handle NEW_ARRAY_INIT in MODIFY_EXPR:. (patch_assignment): Removed duplicate code. (maybe_build_array_element_wfl, build_new_array_init, ! patch_new_array_init, patch_array_constructor, ! array_constructor_check_entry): New functions. Mon Dec 7 15:13:52 1998 Alexandre Petit-Bianco *************** Mon Dec 7 15:13:52 1998 Alexandre Peti *** 7250,7262 **** (array_initializer:): Defined actions. (variable_initializers:): Likewise. (resolve_qualified_expression_name): Use DECL_CONTEXT to build ! non-static field accesses. (patch_invoke): Fixed indentation typo. (java_complete_tree): Likewise. (build_labeled_block): Changed leading comment. Generate an error ! in case of duplicate loop labels. (patch_conditional_expr): Patch results of string concatenation ! operations. Sun Dec 6 13:45:00 1998 Per Bothner --- 9119,9131 ---- (array_initializer:): Defined actions. (variable_initializers:): Likewise. (resolve_qualified_expression_name): Use DECL_CONTEXT to build ! non-static field accesses. (patch_invoke): Fixed indentation typo. (java_complete_tree): Likewise. (build_labeled_block): Changed leading comment. Generate an error ! in case of duplicate loop labels. (patch_conditional_expr): Patch results of string concatenation ! operations. Sun Dec 6 13:45:00 1998 Per Bothner *************** Sun Dec 6 13:45:00 1998 Per Bothner < *** 7272,7278 **** * java-tree.h (CALL_USING_SUPER): New macro. * parse.y (patch_invoke): Remove im local variable. ! (patch_method_invocation, patch_invoke): Don't pass super parameter. (patch_invoke): Use CALL_USING_SUPER instead of from_super parameter. (resolve_qualified_expression_name): Maybe set CALL_USING_SUPER. --- 9141,9147 ---- * java-tree.h (CALL_USING_SUPER): New macro. * parse.y (patch_invoke): Remove im local variable. ! (patch_method_invocation, patch_invoke): Don't pass super parameter. (patch_invoke): Use CALL_USING_SUPER instead of from_super parameter. (resolve_qualified_expression_name): Maybe set CALL_USING_SUPER. *************** Sun Dec 6 13:21:18 1998 Per Bothner < *** 7299,7316 **** Thu Dec 3 17:11:12 1998 Alexandre Petit-Bianco * java-tree.h (java_layout_seen_class_methods): New function ! prototype. (LAYOUT_SEEN_CLASS_METHODS): Macro removed. * jcf-parse.c (parse_class_file): Call java_layout_seen_class_methods. * parse.h (PROMOTE_RECORD_IF_COMPLETE): New macro. * parse.y (method_declarator:): Defined action. (issue_warning_error_from_context): input_filename saved, set to ! the appropriate value and restored after java_error is called. (build_unresolved_array_type): Fixed comment. (register_fields): Use PROMOTE_RECORD_IF_COMPLETE. (method_header): Deal with return type the same way type are ! handled for fields and method's parameters and local variables ! types are handled. (check_method_redefinition): Removed extra CR. (declare_local_variables): Use PROMOTE_RECORD_IF_COMPLETE. (java_layout_seen_class_methods): New function. --- 9168,9185 ---- Thu Dec 3 17:11:12 1998 Alexandre Petit-Bianco * java-tree.h (java_layout_seen_class_methods): New function ! prototype. (LAYOUT_SEEN_CLASS_METHODS): Macro removed. * jcf-parse.c (parse_class_file): Call java_layout_seen_class_methods. * parse.h (PROMOTE_RECORD_IF_COMPLETE): New macro. * parse.y (method_declarator:): Defined action. (issue_warning_error_from_context): input_filename saved, set to ! the appropriate value and restored after java_error is called. (build_unresolved_array_type): Fixed comment. (register_fields): Use PROMOTE_RECORD_IF_COMPLETE. (method_header): Deal with return type the same way type are ! handled for fields and method's parameters and local variables ! types are handled. (check_method_redefinition): Removed extra CR. (declare_local_variables): Use PROMOTE_RECORD_IF_COMPLETE. (java_layout_seen_class_methods): New function. *************** Wed Dec 2 15:52:25 1998 Alexandre Peti *** 7331,7352 **** on constructors too. * parse.y (check_method_redefinition): Use TYPE_ARGUMENT_SIGNATURE. (patch_method_invocation): Define a primary when resolving an ! expression name. Augmented comment on code checking illegal `this' ! usage. Loosened it test by accepting NEW_CLASS_EXPR. Tue Dec 1 13:53:24 1998 Alexandre Petit-Bianco * class.c (layout_class_method): Don't report error on non-static ! overriding static if the method is private. * java-tree.h (finish_class): Prototype added. * lex.c (java_get_line_col): Handle col argument -2 value. * parse.h: All static method declarations moved to parse.y. * parse.y: Now contains all static method declarations previously ! found in parse.h. (find_expr_with_wfl, missing_return_error, ! unreachable_stmt_error): New functions. (java_get_real_method_name): Identify constructors bearing class ! names in source code compiled classes only. (java_complete_expand_methods): Call missing_return_error. (invocation_mode): Private methods invoked as static methods. (java_complete_tree): Call unreachable_stmt_error. --- 9200,9221 ---- on constructors too. * parse.y (check_method_redefinition): Use TYPE_ARGUMENT_SIGNATURE. (patch_method_invocation): Define a primary when resolving an ! expression name. Augmented comment on code checking illegal `this' ! usage. Loosened it test by accepting NEW_CLASS_EXPR. Tue Dec 1 13:53:24 1998 Alexandre Petit-Bianco * class.c (layout_class_method): Don't report error on non-static ! overriding static if the method is private. * java-tree.h (finish_class): Prototype added. * lex.c (java_get_line_col): Handle col argument -2 value. * parse.h: All static method declarations moved to parse.y. * parse.y: Now contains all static method declarations previously ! found in parse.h. (find_expr_with_wfl, missing_return_error, ! unreachable_stmt_error): New functions. (java_get_real_method_name): Identify constructors bearing class ! names in source code compiled classes only. (java_complete_expand_methods): Call missing_return_error. (invocation_mode): Private methods invoked as static methods. (java_complete_tree): Call unreachable_stmt_error. *************** Thu Nov 26 12:44:07 1998 Per Bothner < *** 7384,7390 **** soft_monitorenter_node, soft_monitorexit_node, throw_node. * jcf-write.c (generate_bytecode_insns): ! Handle pre/post-increment/decrement of long. * jcf-write.c (generate_bytecode_insns): Handle missing exception handler (finally for synchronized). --- 9253,9259 ---- soft_monitorenter_node, soft_monitorexit_node, throw_node. * jcf-write.c (generate_bytecode_insns): ! Handle pre/post-increment/decrement of long. * jcf-write.c (generate_bytecode_insns): Handle missing exception handler (finally for synchronized). *************** Wed Nov 25 00:50:58 1998 Marc Espie * (generate_classfile): Always write class access flag with ! ACC_SUPER set. Tue Nov 24 16:34:33 1998 Alexandre Petit-Bianco * class.c (maybe_layout_super_class): New function. (layout_class): Reorganized. Loop on class methods dispatched into ! a new function. Call maybe_layout_super_class. (layout_class_methods, layout_class_method): New functions. * expr.c (expand_java_NEW): Call layout_class_methods on loaded ! class. (expand_invoke): Likewise. * java-tree.h (all_class_list): New global variable declared. (layout_class_methods, layout_class_method): New function ! prototypes. (LAYOUT_SEEN_CLASS_METHODS): New macro. * jcf-parse.c (all_class_list): New global variable. (load_class): Extended what class_or_name can be. Use parser ! context mechanism to save globals before calling jcf_parse. (jcf_parse_source): Don't parse twice if HAS_BEEN_ALREADY_PARSED_P ! is set on the file name. (jcf_parse): Layout class methods when Object is loaded, otherwise ! record class in all_class_list for delayed method layout. (parse_class_file): Use LAYOUT_SEEN_CLASS_METHODS. * lang.c (put_decl_node): Decode into the decl context ! class name. * lex.c (java_allocate_new_line): Use xmalloc. * parse.h (INCOMPLETE_TYPE_P): Redefined to work with incomplete ! pointers, not TREE_LIST elements. (struct parser_ctxt): Fixed comment indentations, added comments ! and reordered some fields. (java_check_methods): Function prototype removed. * parse.y (java_push_parser_context): Use xmalloc. (java_parser_context_restore_global): Pop extra pushed ctxp only ! when there's nothing next. (maybe_create_class_interface_decl): Fixed comment, add new ! created class decl to all_class_list. (method_header): Use GET_REAL_TYPE on argument's types. (method_declarator): Use GET_REAL_TYPE, change type to the real ! type in TREE_LIST dependency node. Build argument list with the ! real type. (create_jdep_list): Use xmalloc. Removed allocation error message. (obtain_incomplete_type): Fixed leading comment. Broadened ! incoming argument meaning. (register_incomplete_type): Use xmalloc. Removed allocation error ! message. (safe_layout_class): Fixed leading comment. (jdep_resolve_class): Reversed if statement condition and switch ! if and else bodies. (resolve_and_layout): Fixed leading comment. Broadened incoming ! argument meaning. (complete_class_report_errors): New local variable name, for ! clarity. purify_type_name used for all error cases. (java_get_real_method_name): Stricter check on constructors. (java_check_regular_methods): Reverse methods list only if not ! already laid out. Layout artificial constructor. (java_check_methods): Deleted. (source_start_java_method): Obtain incomplete type for patchable ! method arguments. (java_layout_classes): Fixed leading comment. Use ! LAYOUT_SEEN_CLASS_METHODS, use a loop to check methods. Added else ! statement to layout operation, reuse LAYOUT_SEEN_CLASS_METHODS ! before returning. Fixed comments. (java_expand_classes): Check for errors up front. (patch_method_invocation): Class to search is resolved and laid ! out. Tue Nov 24 12:57:13 1998 Per Bothner --- 9297,9367 ---- Tue Nov 24 17:06:38 1998 Per Bothner * (generate_classfile): Always write class access flag with ! ACC_SUPER set. Tue Nov 24 16:34:33 1998 Alexandre Petit-Bianco * class.c (maybe_layout_super_class): New function. (layout_class): Reorganized. Loop on class methods dispatched into ! a new function. Call maybe_layout_super_class. (layout_class_methods, layout_class_method): New functions. * expr.c (expand_java_NEW): Call layout_class_methods on loaded ! class. (expand_invoke): Likewise. * java-tree.h (all_class_list): New global variable declared. (layout_class_methods, layout_class_method): New function ! prototypes. (LAYOUT_SEEN_CLASS_METHODS): New macro. * jcf-parse.c (all_class_list): New global variable. (load_class): Extended what class_or_name can be. Use parser ! context mechanism to save globals before calling jcf_parse. (jcf_parse_source): Don't parse twice if HAS_BEEN_ALREADY_PARSED_P ! is set on the file name. (jcf_parse): Layout class methods when Object is loaded, otherwise ! record class in all_class_list for delayed method layout. (parse_class_file): Use LAYOUT_SEEN_CLASS_METHODS. * lang.c (put_decl_node): Decode into the decl context ! class name. * lex.c (java_allocate_new_line): Use xmalloc. * parse.h (INCOMPLETE_TYPE_P): Redefined to work with incomplete ! pointers, not TREE_LIST elements. (struct parser_ctxt): Fixed comment indentations, added comments ! and reordered some fields. (java_check_methods): Function prototype removed. * parse.y (java_push_parser_context): Use xmalloc. (java_parser_context_restore_global): Pop extra pushed ctxp only ! when there's nothing next. (maybe_create_class_interface_decl): Fixed comment, add new ! created class decl to all_class_list. (method_header): Use GET_REAL_TYPE on argument's types. (method_declarator): Use GET_REAL_TYPE, change type to the real ! type in TREE_LIST dependency node. Build argument list with the ! real type. (create_jdep_list): Use xmalloc. Removed allocation error message. (obtain_incomplete_type): Fixed leading comment. Broadened ! incoming argument meaning. (register_incomplete_type): Use xmalloc. Removed allocation error ! message. (safe_layout_class): Fixed leading comment. (jdep_resolve_class): Reversed if statement condition and switch ! if and else bodies. (resolve_and_layout): Fixed leading comment. Broadened incoming ! argument meaning. (complete_class_report_errors): New local variable name, for ! clarity. purify_type_name used for all error cases. (java_get_real_method_name): Stricter check on constructors. (java_check_regular_methods): Reverse methods list only if not ! already laid out. Layout artificial constructor. (java_check_methods): Deleted. (source_start_java_method): Obtain incomplete type for patchable ! method arguments. (java_layout_classes): Fixed leading comment. Use ! LAYOUT_SEEN_CLASS_METHODS, use a loop to check methods. Added else ! statement to layout operation, reuse LAYOUT_SEEN_CLASS_METHODS ! before returning. Fixed comments. (java_expand_classes): Check for errors up front. (patch_method_invocation): Class to search is resolved and laid ! out. Tue Nov 24 12:57:13 1998 Per Bothner *************** Tue Nov 24 12:57:13 1998 Per Bothner < *** 7513,7519 **** Thu Nov 19 11:16:55 1998 Alexandre Petit-Bianco * jcf-parse.c (jcf_parse_source): Function returned type is ! void. Added prototype. (jcf_parse): Function returned type is void. (yyparse): Remove call to fclose on the last parsed file. --- 9382,9388 ---- Thu Nov 19 11:16:55 1998 Alexandre Petit-Bianco * jcf-parse.c (jcf_parse_source): Function returned type is ! void. Added prototype. (jcf_parse): Function returned type is void. (yyparse): Remove call to fclose on the last parsed file. *************** Wed Nov 18 23:54:53 1998 Alexandre Peti *** 7524,7640 **** * class.c (unmangle_classname): Set QUALIFIED_P when appropriate. (layout_class): Cope with methods featuring WFL in decl names. * decl.c (unqualified_object_id_node): New global variable, ! initialized. (build_decl_no_layout): Removed. * expr.c (build_primtype_type_ref): Handle Double. (java_lang_expand_expr): Fixed indentations. * java-tree.h (CLASS_METHOD_CHECKED_P): Flag deleted. (flag_wall, flag_redundant, flag_not_overriding, ! flag_static_local_jdk1_1, unqualified_object_id_node): Global ! variable declarations. (build_decl_no_layout): Removed prototype. (java_get_real_method_name): Added prototype. (IS_UNCHECKED_EXPRESSION_P): Renamed IS_UNCHECKED_EXCEPTION_P. (java_parse_abort_on_error): Macro now just returns. * jcf-parse.c (jcf_parse_source): Check fclose returned ! value. Call emit_register_classes if java_report_errors returns ! zero. * lanc.c (flag_wall, flag_redundant, flag_not_overriding, ! flag_static_local_jdk1_1): New integer flags. (lang_decode_option): New flags set here. * parse.h (GET_REAL_TYPE, GET_METHOD_NAME): New macros. (OBSOLETE_MODIFIER_WARNING): Issue error message conditionally to ! the flag_redundant variable. (SET_TYPE_FOR_RESOLUTION): Consider Object being java.lang.Object ! when parsing java.lang.Object class. (BUILD_MONITOR_ENTER, BUILD_MONITOR_EXIT): Added terminal ! NULL_TREE to build. (resolve_qualified_expression_name): Fixed indentation. (patch_array_ref): Changed prototype. (not_initialized_as_it_should_p): Prototype removed. (java_report_errors): Added function prototype. * parse.y (formal_parameter:): Changed error message for not yet ! supported final parameters. (class_type_list:): Set both PURPOSE and VALUE of created ! TREE_LIST to be class_type. (primary_no_new_array:): Handle class literals on primitive types. (parse_warning_context): Reinstalled correct force_error and ! do_warning flags setups. (java_report_errors): Changed prototype. Return java_error_count ! value. (variable_redefinition_error): Consider treating variable type as ! a fake pointer. (create_interface): Warn about redundant abstract modifier if ! flag_redundant is set. Changed error message. (lookup_field_wrapper): Save/restore globals before/after looking ! up field. (duplicate_declaration_error_p): Consider treating declaration ! type as a fake pointer. (register_fields): Extract real type from dependency node. Check ! for duplicate field declaration after type adjustment. Use ! DECL_INITIAL to store static final initialized values. (method_header): Extract real function type from dependency node. (check_abstract_method_header): Use GET_METHOD_NAME. (obtain_incomplete_type): Layout fake pointer type. (safe_layout_class): Don't try to check for methods before layout. (java_complete_class): Don't check for correct throws clause ! elements inheritance here. (resolve_and_layout): Broadened name parameter meaning. (reset_method_name): Use GET_METHOD_NAME. (java_get_real_method_name): New function. (java_check_regular_methods): Don't check methods in ! java.lang.Object. Verify lineage of throws clause elements. Use ! flag_no_overriding in warning report. (check_throws_clauses): Don't check if class was from ! bytecode. Use IS_UNCHECKED_EXCEPTION_P macro. (java_check_methods): Don't set CLASS_METHOD_CHECKED_P flag. (declare_local_variables): Use flag_static_local_jdk1_1 to report ! warning on unsupported final local variables. Use build_decl ! instead of build_decl_no_layout. Get real local variable type from ! dependency node. (source_start_java_method): Get real parameter type from ! dependency node. Call build_decl instead of build_decl_no_layout. (java_layout_classes): Reverse tree and layout type and class as ! required. Mark class as loaded when done. (resolve_field_access): Fixed indentation. Restricted condition ! leading to static field access code generation. Set field_type ! decl's TREE_TYPE if QUAL_DECL_TYPE not available. (resolve_qualified_expression_name): Initialize type_found to ! null. Handle static field resolved during qualification. Fixed ! layout on non primitive field decl types. (not_accessible_p): Fixed typo in comment. (patch_method_invocation): Resolve and layout class to search from ! type. (lookup_method_invoke): Keep integer constant 0 as is. Resolve and ! layout non primitive type, if necessary. Make method node only to ! report errors. (find_applicable_accessible_methods_list): Consider WFL'ed method ! decl names. Fixed indentation. (argument_types_convertible): Resolve and layout target type if ! necessary. (java_complete_tree): Fixed indentation problems. Rewrote ! CALL_EXPR thrown exceptions check. Re-installed further processing ! of the assignment in certain cases. (patch_assignment): Call maybe_build_primttype_type_ref to perform ! inlining on class literals. (valid_builtin_assignconv_identity_widening_p): Cope with constant ! 0 literal. (valid_method_invocation_conversion_p): Likewise. (patch_string): Temporary disable forbidden use of `this' in ! explicit constructor invocations when doing string concatenation ! within their scope. (patch_unaryop): Added comment. Reinstalled code to disable ! further check on assignment operation with cast expression RHS. (patch_switch_statement): Fixed indentation. (build_try_statement): Call build_decl instead of ! build_decl_no_layout. (patch_synchronized_statement): Likewise. (patch_throw_statement): Use IS_UNCHECKED_EXCEPTION_P instead of ! IS_UNCHECKED_EXPRESSION_P. (check_thrown_exceptions_do): Changed leading comment. Resolve and ! layout argument exception type. (purge_unchecked_exceptions): Use IS_UNCHECKED_EXCEPTION_P instead ! of IS_UNCHECKED_EXPRESSION_P. Wed Nov 18 14:21:48 1998 Anthony Green --- 9393,9509 ---- * class.c (unmangle_classname): Set QUALIFIED_P when appropriate. (layout_class): Cope with methods featuring WFL in decl names. * decl.c (unqualified_object_id_node): New global variable, ! initialized. (build_decl_no_layout): Removed. * expr.c (build_primtype_type_ref): Handle Double. (java_lang_expand_expr): Fixed indentations. * java-tree.h (CLASS_METHOD_CHECKED_P): Flag deleted. (flag_wall, flag_redundant, flag_not_overriding, ! flag_static_local_jdk1_1, unqualified_object_id_node): Global ! variable declarations. (build_decl_no_layout): Removed prototype. (java_get_real_method_name): Added prototype. (IS_UNCHECKED_EXPRESSION_P): Renamed IS_UNCHECKED_EXCEPTION_P. (java_parse_abort_on_error): Macro now just returns. * jcf-parse.c (jcf_parse_source): Check fclose returned ! value. Call emit_register_classes if java_report_errors returns ! zero. * lanc.c (flag_wall, flag_redundant, flag_not_overriding, ! flag_static_local_jdk1_1): New integer flags. (lang_decode_option): New flags set here. * parse.h (GET_REAL_TYPE, GET_METHOD_NAME): New macros. (OBSOLETE_MODIFIER_WARNING): Issue error message conditionally to ! the flag_redundant variable. (SET_TYPE_FOR_RESOLUTION): Consider Object being java.lang.Object ! when parsing java.lang.Object class. (BUILD_MONITOR_ENTER, BUILD_MONITOR_EXIT): Added terminal ! NULL_TREE to build. (resolve_qualified_expression_name): Fixed indentation. (patch_array_ref): Changed prototype. (not_initialized_as_it_should_p): Prototype removed. (java_report_errors): Added function prototype. * parse.y (formal_parameter:): Changed error message for not yet ! supported final parameters. (class_type_list:): Set both PURPOSE and VALUE of created ! TREE_LIST to be class_type. (primary_no_new_array:): Handle class literals on primitive types. (parse_warning_context): Reinstalled correct force_error and ! do_warning flags setups. (java_report_errors): Changed prototype. Return java_error_count ! value. (variable_redefinition_error): Consider treating variable type as ! a fake pointer. (create_interface): Warn about redundant abstract modifier if ! flag_redundant is set. Changed error message. (lookup_field_wrapper): Save/restore globals before/after looking ! up field. (duplicate_declaration_error_p): Consider treating declaration ! type as a fake pointer. (register_fields): Extract real type from dependency node. Check ! for duplicate field declaration after type adjustment. Use ! DECL_INITIAL to store static final initialized values. (method_header): Extract real function type from dependency node. (check_abstract_method_header): Use GET_METHOD_NAME. (obtain_incomplete_type): Layout fake pointer type. (safe_layout_class): Don't try to check for methods before layout. (java_complete_class): Don't check for correct throws clause ! elements inheritance here. (resolve_and_layout): Broadened name parameter meaning. (reset_method_name): Use GET_METHOD_NAME. (java_get_real_method_name): New function. (java_check_regular_methods): Don't check methods in ! java.lang.Object. Verify lineage of throws clause elements. Use ! flag_no_overriding in warning report. (check_throws_clauses): Don't check if class was from ! bytecode. Use IS_UNCHECKED_EXCEPTION_P macro. (java_check_methods): Don't set CLASS_METHOD_CHECKED_P flag. (declare_local_variables): Use flag_static_local_jdk1_1 to report ! warning on unsupported final local variables. Use build_decl ! instead of build_decl_no_layout. Get real local variable type from ! dependency node. (source_start_java_method): Get real parameter type from ! dependency node. Call build_decl instead of build_decl_no_layout. (java_layout_classes): Reverse tree and layout type and class as ! required. Mark class as loaded when done. (resolve_field_access): Fixed indentation. Restricted condition ! leading to static field access code generation. Set field_type ! decl's TREE_TYPE if QUAL_DECL_TYPE not available. (resolve_qualified_expression_name): Initialize type_found to ! null. Handle static field resolved during qualification. Fixed ! layout on non primitive field decl types. (not_accessible_p): Fixed typo in comment. (patch_method_invocation): Resolve and layout class to search from ! type. (lookup_method_invoke): Keep integer constant 0 as is. Resolve and ! layout non primitive type, if necessary. Make method node only to ! report errors. (find_applicable_accessible_methods_list): Consider WFL'ed method ! decl names. Fixed indentation. (argument_types_convertible): Resolve and layout target type if ! necessary. (java_complete_tree): Fixed indentation problems. Rewrote ! CALL_EXPR thrown exceptions check. Re-installed further processing ! of the assignment in certain cases. (patch_assignment): Call maybe_build_primttype_type_ref to perform ! inlining on class literals. (valid_builtin_assignconv_identity_widening_p): Cope with constant ! 0 literal. (valid_method_invocation_conversion_p): Likewise. (patch_string): Temporary disable forbidden use of `this' in ! explicit constructor invocations when doing string concatenation ! within their scope. (patch_unaryop): Added comment. Reinstalled code to disable ! further check on assignment operation with cast expression RHS. (patch_switch_statement): Fixed indentation. (build_try_statement): Call build_decl instead of ! build_decl_no_layout. (patch_synchronized_statement): Likewise. (patch_throw_statement): Use IS_UNCHECKED_EXCEPTION_P instead of ! IS_UNCHECKED_EXPRESSION_P. (check_thrown_exceptions_do): Changed leading comment. Resolve and ! layout argument exception type. (purge_unchecked_exceptions): Use IS_UNCHECKED_EXCEPTION_P instead ! of IS_UNCHECKED_EXPRESSION_P. Wed Nov 18 14:21:48 1998 Anthony Green *************** Wed Nov 11 19:08:52 1998 Per Bothner < *** 7801,7973 **** Tue Nov 10 12:34:03 1998 Alexandre Petit-Bianco * class.c (is_compiled_class): Call safe_layout_class for class ! compiled from source. * conver.h (convert_to_integer, convert_to_real, ! convert_to_pointer): Added prototypes. * decl.c (init_decl_processing): Non longer push the decls of ! `methodtable', `constants', `Class', `Field', `dispatchTable' ! `jexception' and `Method'. * expr.c (build_invokeinterface): New function. (expand_invoke): static variable CLASS_IDENT now in ! build_invokeinterface. Use build_invokeinterface. (expand_java_field_op): Moved code to inline ! java.lang.PRIMTYPE.TYPE into a function. (build_primtype_type_ref): New function. * java-tree.def (INSTANCEOF_EXPR): New tree code. * java-tree.h (CLASS_METHOD_CHECKED_P, METHOD_DEPRECATED, ! FIELD_DEPRECATED, CLASS_DEPRECATED): New flag macros. (DECL_CONSTRUCTOR_P): Fixed typo in comment. (DECL_LOCAL_STATIC_VALUE): New macro. (build_invokeinterface, build_primtype_type_ref): New function ! prototypes. (java_parse_abort_on_error): Macro rewritten. * jcf-parse.c (current_method): Add comment to declaration. (parse_zip_file_entries, process_zip_dir, void parse_source_file): ! Function prototypes fixed. (jcf_parse_source): push/pop parser context. save/restore global. (parse_source_file): Fixed leading comment. Now take a ! IDENTIFIER_NODE as an argument. Doesn't check methods, layout ! classes and pop the parser context anymore. (yyparse): Push parser context, save globals, parse the source ! file, restore globals and pop the parser context when processing a ! source file. * jcf.h (VERBOSE_SKELETON): Replaces SOURCE_FRONTEND_DEBUG define. * lex.c (java_parse_doc_section): New function. (java_lex): Call java_parse_doc_section when appropriate. Build an ! operator around INSTANCEOF_TK. * lex.h (java_lineterminator, java_sprint_unicode, ! java_unicode_2_utf8, java_lex_error, java_store_unicode): ! Prototypes rewritten. (java_parse_escape_sequence, java_letter_or_digit_p, ! java_parse_doc_section, java_parse_end_comment, java_get_unicode, ! java_read_unicode, java_store_unicode, java_read_char, ! java_allocate_new_line, java_unget_unicode, java_sneak_unicode): ! Added function prototypes. * parse.h (VERBOSE_SKELETON): Replaces SOURCE_FRONTEND_DEBUG ! define. (JNULLP_TYPE_P, CHECK_METHODS, CHECK_DEPRECATED, REGISTER_IMPORT): ! New macros (struct parser_ctxt): New fields: deprecated, ! current_parsed_class_un, gclass_list. (fix_method_argument_names, issue_warning_error_from_context, ! resolve_package, lookup_package_type): New function prototypes. (resolve_expression_name): Fixed function prototype. (find_applicable_accessible_methods_list): Fixed indentation, added extra argument in prototype. (check_final_assignment, build_null_of_type, check_deprecation, ! check_method_redefinition, reset_method_name, ! java_check_regular_methods, java_check_abstract_methods, ! maybe_build_primttype_type_ref): New function prototype. * parse.y (conver.h): Include. (INSTANCEOF_TK): Tagged . (single_type_import_declaration): Use REGISTER_IMPORT macro. (relational_expression:): Build binop for instanceof. (java_push_parser_context): Remember ctxp->gclass_list across ! contexts. (java_pop_parser_context): Simply return if no context ! exists. Remember gclass_list across contexts. (issue_warning_error_from_context): New function. (parse_error_context): Don't setup ctxp->elc here. Call ! issue_warning_error_from_context instead. (parse_warning_context): Likewise. (maybe_create_class_interface_decl): Removed DECL_ARTIFICIAL ! setup. Link new class/interface to ctxp->gclass_list. (add_superinterfaces): Register interface as incomplete if not ! loaded. (create_class): Remember class unqualified name in ! ctxp->current_parsed_class_un. Check class deprecation. (register_fields): Check field deprecation. Remember static final ! field value in DECL_LOCAL_STATIC_VALUE. Changed comment in part ! processing INIT. (method_header): New local variable ORIG_ARG. Use unqualified ! current class name for check on constructor errors. Promote return ! type if of record type. Argument list fix moved in ! fix_method_argument_names, called here. Check method deprecation. (fix_method_argument_names): New function. (method_declarator): Promote record typed arguments. (safe_layout_class): Check class methods before layout. (java_complete_class): Compute field layout when patched. (do_resolve_class): Try to load class after having it renamed ! after the package name. (get_printable_method_name): Use DECL_CONTEXT. (reset_method_name): New function. (check_method_redefinition): Use reset_method_name. (java_check_regular_methods): New local variable ! SAVED_FOUND_WFL. Temporarily reinstall overriding/hiding method ! names for error report. Check for compile-time error when method ! found has default (package) access. (java_check_abstract_methods): Now takes an interface DECL node as ! an argument. Also reinstall real name on unchecked ! overriding/hiding methods for error report. (java_check_methods): Fixed leading comment. Get classes to verify ! from ctxp->gclass_list. Use CHECK_METHODS macro and set ! CLASS_METHOD_CHECKED_P on class verification. (lookup_java_method2): Get real method name if necessary. (find_in_imports): Don't check package class access here. (resolve_package, lookup_package_type): New functions. (java_layout_classes): Fixed leading comment. Take classes to be ! laid out from ctxp->gclass_list. (java_complete_expand_methods): Don't expand native and abstract ! methods. (java_expand_classes): New function. (resolve_expression_name): Use additional argument ORIG. Retrieve ! values of static final field of primitive types. (resolve_field_access): Handles static final field of promotive ! type. (resolve_qualified_expression_name): Handle STRING_CST as ! primaries and package name resolution. Check deprecation on found ! decls. Set where_found and type_found on non static field resolved ! during qualification. Layout non primitive field decl types. (check_deprecation): New function. (maybe_access_field): Simplified. (patch_method_invocation_stmt): Local variable CLASS_TYPE ! removed. Reverse method's argument when primary is a type. Don't ! use CLASS_TYPE to report problems, use IDENTIFIER_WFL ! instead. Include abstract class in the list of class searchable ! for constructors. Use DECL_CONTEXT of found method for access ! checks. Check method deprecation. (patch_invoke): Pay extra care to NEW_CLASS_EXPR type call when ! converting arguments. Handle INVOKE_INTERFACE. (lookup_method_invoke): Search constructor using existing ! infrastructure (don't rely on lookup_java_constructor anymore). (find_applicable_accessible_methods_list): Extra argument flag ! LC. Now include constructor in the search. (qualify_ambiguous_name): Conditional expression are primaries. (not_initialized_as_it_should_p): static final are always ! initialized. (java_complete_tree): Pass extra NULL argument to ! resolve_expression_name. Stricter test to carry on patching ! assignments. New case for INSTANCEOF_EXPR. (complete_function_arguments): Inline PRIMTYPE.TYPE read access. (check_final_assignment, maybe_build_primttype_type_ref): New ! functions. (patch_assignment): Detect resolved static finals and carry normal ! assignment error check on them. Inline PRIMTYPE.TYPE read access. (try_builtin_assignconv): Access constant 0 on all primitive ! types. (valid_builtin_assignconv_identity_widening_p): Accept identical ! types. Accept all promoted type on int type. (valid_ref_assignconv_cast_p): Accept a null pointer to be ! assigned to a reference. (valid_method_invocation_conversion_p): Accept to check null ! pointers. (build_binop): Merge declaration and initialization of local ! variable BINOP. (patch_binop): New case for INSTANCEOF_EXPR. NE_EXPR to accept all ! numeric types. Improved validity test for qualify operators on ! references. (patch_unaryop): Broadened rejection test for PREDECREMENT_EXPR ! and PREINCREMENT_EXPR. Also detect resolved static finals of a ! primitive type and issue the appropriate error message. (resolve_type_during_patch): Mark class loaded when resolved. (patch_cast): Allow null to be cased to reference types. (build_null_of_type): New function. (patch_array_ref): Handle array on references correctly. (patch_return): Removed unused local variable MODIFY. Force ! boolean to be returned as integers. Allows null to be returned by ! a function returning a reference. * typeck.c (convert_to_integer, convert_to_real, ! convert_to_pointer): Prototypes moved to convert.h (lookup_argument_method): Use method real name, if necessary. 1998-10-30 Tom Tromey --- 9670,9842 ---- Tue Nov 10 12:34:03 1998 Alexandre Petit-Bianco * class.c (is_compiled_class): Call safe_layout_class for class ! compiled from source. * conver.h (convert_to_integer, convert_to_real, ! convert_to_pointer): Added prototypes. * decl.c (init_decl_processing): Non longer push the decls of ! `methodtable', `constants', `Class', `Field', `dispatchTable' ! `jexception' and `Method'. * expr.c (build_invokeinterface): New function. (expand_invoke): static variable CLASS_IDENT now in ! build_invokeinterface. Use build_invokeinterface. (expand_java_field_op): Moved code to inline ! java.lang.PRIMTYPE.TYPE into a function. (build_primtype_type_ref): New function. * java-tree.def (INSTANCEOF_EXPR): New tree code. * java-tree.h (CLASS_METHOD_CHECKED_P, METHOD_DEPRECATED, ! FIELD_DEPRECATED, CLASS_DEPRECATED): New flag macros. (DECL_CONSTRUCTOR_P): Fixed typo in comment. (DECL_LOCAL_STATIC_VALUE): New macro. (build_invokeinterface, build_primtype_type_ref): New function ! prototypes. (java_parse_abort_on_error): Macro rewritten. * jcf-parse.c (current_method): Add comment to declaration. (parse_zip_file_entries, process_zip_dir, void parse_source_file): ! Function prototypes fixed. (jcf_parse_source): push/pop parser context. save/restore global. (parse_source_file): Fixed leading comment. Now take a ! IDENTIFIER_NODE as an argument. Doesn't check methods, layout ! classes and pop the parser context anymore. (yyparse): Push parser context, save globals, parse the source ! file, restore globals and pop the parser context when processing a ! source file. * jcf.h (VERBOSE_SKELETON): Replaces SOURCE_FRONTEND_DEBUG define. * lex.c (java_parse_doc_section): New function. (java_lex): Call java_parse_doc_section when appropriate. Build an ! operator around INSTANCEOF_TK. * lex.h (java_lineterminator, java_sprint_unicode, ! java_unicode_2_utf8, java_lex_error, java_store_unicode): ! Prototypes rewritten. (java_parse_escape_sequence, java_letter_or_digit_p, ! java_parse_doc_section, java_parse_end_comment, java_get_unicode, ! java_read_unicode, java_store_unicode, java_read_char, ! java_allocate_new_line, java_unget_unicode, java_sneak_unicode): ! Added function prototypes. * parse.h (VERBOSE_SKELETON): Replaces SOURCE_FRONTEND_DEBUG ! define. (JNULLP_TYPE_P, CHECK_METHODS, CHECK_DEPRECATED, REGISTER_IMPORT): ! New macros (struct parser_ctxt): New fields: deprecated, ! current_parsed_class_un, gclass_list. (fix_method_argument_names, issue_warning_error_from_context, ! resolve_package, lookup_package_type): New function prototypes. (resolve_expression_name): Fixed function prototype. (find_applicable_accessible_methods_list): Fixed indentation, added extra argument in prototype. (check_final_assignment, build_null_of_type, check_deprecation, ! check_method_redefinition, reset_method_name, ! java_check_regular_methods, java_check_abstract_methods, ! maybe_build_primttype_type_ref): New function prototype. * parse.y (conver.h): Include. (INSTANCEOF_TK): Tagged . (single_type_import_declaration): Use REGISTER_IMPORT macro. (relational_expression:): Build binop for instanceof. (java_push_parser_context): Remember ctxp->gclass_list across ! contexts. (java_pop_parser_context): Simply return if no context ! exists. Remember gclass_list across contexts. (issue_warning_error_from_context): New function. (parse_error_context): Don't setup ctxp->elc here. Call ! issue_warning_error_from_context instead. (parse_warning_context): Likewise. (maybe_create_class_interface_decl): Removed DECL_ARTIFICIAL ! setup. Link new class/interface to ctxp->gclass_list. (add_superinterfaces): Register interface as incomplete if not ! loaded. (create_class): Remember class unqualified name in ! ctxp->current_parsed_class_un. Check class deprecation. (register_fields): Check field deprecation. Remember static final ! field value in DECL_LOCAL_STATIC_VALUE. Changed comment in part ! processing INIT. (method_header): New local variable ORIG_ARG. Use unqualified ! current class name for check on constructor errors. Promote return ! type if of record type. Argument list fix moved in ! fix_method_argument_names, called here. Check method deprecation. (fix_method_argument_names): New function. (method_declarator): Promote record typed arguments. (safe_layout_class): Check class methods before layout. (java_complete_class): Compute field layout when patched. (do_resolve_class): Try to load class after having it renamed ! after the package name. (get_printable_method_name): Use DECL_CONTEXT. (reset_method_name): New function. (check_method_redefinition): Use reset_method_name. (java_check_regular_methods): New local variable ! SAVED_FOUND_WFL. Temporarily reinstall overriding/hiding method ! names for error report. Check for compile-time error when method ! found has default (package) access. (java_check_abstract_methods): Now takes an interface DECL node as ! an argument. Also reinstall real name on unchecked ! overriding/hiding methods for error report. (java_check_methods): Fixed leading comment. Get classes to verify ! from ctxp->gclass_list. Use CHECK_METHODS macro and set ! CLASS_METHOD_CHECKED_P on class verification. (lookup_java_method2): Get real method name if necessary. (find_in_imports): Don't check package class access here. (resolve_package, lookup_package_type): New functions. (java_layout_classes): Fixed leading comment. Take classes to be ! laid out from ctxp->gclass_list. (java_complete_expand_methods): Don't expand native and abstract ! methods. (java_expand_classes): New function. (resolve_expression_name): Use additional argument ORIG. Retrieve ! values of static final field of primitive types. (resolve_field_access): Handles static final field of promotive ! type. (resolve_qualified_expression_name): Handle STRING_CST as ! primaries and package name resolution. Check deprecation on found ! decls. Set where_found and type_found on non static field resolved ! during qualification. Layout non primitive field decl types. (check_deprecation): New function. (maybe_access_field): Simplified. (patch_method_invocation_stmt): Local variable CLASS_TYPE ! removed. Reverse method's argument when primary is a type. Don't ! use CLASS_TYPE to report problems, use IDENTIFIER_WFL ! instead. Include abstract class in the list of class searchable ! for constructors. Use DECL_CONTEXT of found method for access ! checks. Check method deprecation. (patch_invoke): Pay extra care to NEW_CLASS_EXPR type call when ! converting arguments. Handle INVOKE_INTERFACE. (lookup_method_invoke): Search constructor using existing ! infrastructure (don't rely on lookup_java_constructor anymore). (find_applicable_accessible_methods_list): Extra argument flag ! LC. Now include constructor in the search. (qualify_ambiguous_name): Conditional expression are primaries. (not_initialized_as_it_should_p): static final are always ! initialized. (java_complete_tree): Pass extra NULL argument to ! resolve_expression_name. Stricter test to carry on patching ! assignments. New case for INSTANCEOF_EXPR. (complete_function_arguments): Inline PRIMTYPE.TYPE read access. (check_final_assignment, maybe_build_primttype_type_ref): New ! functions. (patch_assignment): Detect resolved static finals and carry normal ! assignment error check on them. Inline PRIMTYPE.TYPE read access. (try_builtin_assignconv): Access constant 0 on all primitive ! types. (valid_builtin_assignconv_identity_widening_p): Accept identical ! types. Accept all promoted type on int type. (valid_ref_assignconv_cast_p): Accept a null pointer to be ! assigned to a reference. (valid_method_invocation_conversion_p): Accept to check null ! pointers. (build_binop): Merge declaration and initialization of local ! variable BINOP. (patch_binop): New case for INSTANCEOF_EXPR. NE_EXPR to accept all ! numeric types. Improved validity test for qualify operators on ! references. (patch_unaryop): Broadened rejection test for PREDECREMENT_EXPR ! and PREINCREMENT_EXPR. Also detect resolved static finals of a ! primitive type and issue the appropriate error message. (resolve_type_during_patch): Mark class loaded when resolved. (patch_cast): Allow null to be cased to reference types. (build_null_of_type): New function. (patch_array_ref): Handle array on references correctly. (patch_return): Removed unused local variable MODIFY. Force ! boolean to be returned as integers. Allows null to be returned by ! a function returning a reference. * typeck.c (convert_to_integer, convert_to_real, ! convert_to_pointer): Prototypes moved to convert.h (lookup_argument_method): Use method real name, if necessary. 1998-10-30 Tom Tromey *************** Tue Nov 10 12:34:03 1998 Alexandre Peti *** 7983,7989 **** Wed Oct 28 08:03:31 1998 Alexandre Petit-Bianco * class.c (layout_class): Don't mangle , produce ! __finit instead. Don't verify artificial methods. * decl.c (finit_identifier_node): New declared global. (init_decl_processing): finit_identifier_node initialized. * java-tree.def (CONDITIONAL_EXPR): New Java tree code. --- 9852,9858 ---- Wed Oct 28 08:03:31 1998 Alexandre Petit-Bianco * class.c (layout_class): Don't mangle , produce ! __finit instead. Don't verify artificial methods. * decl.c (finit_identifier_node): New declared global. (init_decl_processing): finit_identifier_node initialized. * java-tree.def (CONDITIONAL_EXPR): New Java tree code. *************** Wed Oct 28 08:03:31 1998 Alexandre Peti *** 7992,8008 **** (DECL_CONSTRUCTOR_CALLS): Access macro to called_constructor. (CLASS_HAS_FINIT_P): New macro. (CALL_CONSTRUCTOR_P): Leading comment changed. Macro now checks ! explicit constructor invocation. (CALL_EXPLICIT_CONSTRUCTOR_P, CALL_THIS_CONSTRUCTOR_P, ! CALL_SUPER_CONSTRUCTOR_P): New macros. (write_classfile): Added prototype. * jcf-parse.c (jcf_parse_source): Parse and remember for ! generation if the file was seen on the command line. (parse_source_file): Don't write the class file here. (yyparse): Loop on files rewritten. Set current_jcf. (parse_zip_file_entries): Parse class file only if it was found. * lang.c (init_parse): Don't open command line provided filename ! here. (lang_parse): Don't set main_jcf anymore. * parse.h (ABSTRAC_CHECK): Capitalized arguments. (JCONSTRUCTOR_CHECK): New macro. --- 9861,9877 ---- (DECL_CONSTRUCTOR_CALLS): Access macro to called_constructor. (CLASS_HAS_FINIT_P): New macro. (CALL_CONSTRUCTOR_P): Leading comment changed. Macro now checks ! explicit constructor invocation. (CALL_EXPLICIT_CONSTRUCTOR_P, CALL_THIS_CONSTRUCTOR_P, ! CALL_SUPER_CONSTRUCTOR_P): New macros. (write_classfile): Added prototype. * jcf-parse.c (jcf_parse_source): Parse and remember for ! generation if the file was seen on the command line. (parse_source_file): Don't write the class file here. (yyparse): Loop on files rewritten. Set current_jcf. (parse_zip_file_entries): Parse class file only if it was found. * lang.c (init_parse): Don't open command line provided filename ! here. (lang_parse): Don't set main_jcf anymore. * parse.h (ABSTRAC_CHECK): Capitalized arguments. (JCONSTRUCTOR_CHECK): New macro. *************** Wed Oct 28 08:03:31 1998 Alexandre Peti *** 8014,8124 **** (patch_method_invocation_stmt): Prototype reflects added argument. (patch_invoke): Likewise. (complete_method_declaration, build_super_invocation, ! verify_constructor_circularity, ! build_this_super_qualified_invocation, get_printable_method_name, ! patch_conditional_expr, maybe_generate_finit, fix_constructors, ! verify_constructor_super, create_artificial_method, ! start_artificial_method_body, end_artificial_method_body, ! generate_field_initialization_code): New function prototypes. * parse.y: Fixed leading comment (constructor_header:, constructor_body:, block_end:): Rules tagged ! . (type_declaration:): Call maybe_generate_finit. (method_declaration:): Action for method_body: placed in new ! function complete_method_declaration, called here. (constructor_declaration:): Defined actions. Removed leading ! FIXME. (constructor_header:): New rule with action. (constructor_body:): Rule rewritten using block_begin: and ! block_end:. Defined actions. (constructor_declarator:, explicit_constructor_invocation:): ! Defined actions. (block:): Use new rules block_begin: block_end:. (block_begin:, block_end:): New rules and actions. (block_statements:): Fixed error message for explicit ! constructors. (method_invocation:): Call build_this_super_qualified_invocation ! if primary is `this' or `super' was seen. (conditional_expression:): Action defined. (extra_ctxp_pushed_p): New static global flag. (java_parser_context_save_global): Create parser context if ! necessary. Use extra_ctxp_pushed_p to remember it. (java_parser_context_restore_global): Pop extra parser context if ! one exists. (build_array_from_name): Array on primitive types are marked ! loaded. (register_fields): Restore new name in field initializer ! expression if type was altered. Non static fields initialized upon ! declaration marked initialized. (maybe_generate_finit): New function. (maybe_generate_clinit): Use create_artificial_method, ! start_artificial_method_body, end_artificial_method_body. Generate ! debug info for enclosed initialization statements. (method_header): Fixed leading comment. Check constructor ! flags. Detect constructor declarations and set DECL_CONSTRUCTOR_P ! accordingly. (complete_method_declaration, constructor_circularity_msg, ! verify_constructor_circularity): New functions. (get_printable_method_name): New function. (check_method_redefinition): Don't rename methods. Fix ! declared constructor names. Error message for ! constructors modified. (java_check_regular_methods): Local variable seen_constructor ! renamed saw_constructor. Skip verification on constructors. Create ! default constructor with create_artificial_method. (java_check_methods): Removed unnecessary empty line. (create_artificial_method, start_artificial_method_body, ! end_artificial_method_body): New functions. (java_layout_classes): Changed leading comment. Reverse fields ! list if necessary. Always layout java.lang.Object if being ! defined. (java_complete_expand_methods): Verify constructor circularity. (java_complete_expand_method): Call fix_constructor on ! constructors. Local variable no_ac_found removed. Restore ! bindings if method body expansion failed. (fix_constructors, verify_constructor_super, ! generate_field_initialization_code): New function. (java_expand_classes): Fixed leading comment. Write class file ! here. (resolve_expression_name): Check for illegal instance variable ! usage within the argument scope of an explicit constructor ! invocation. (resolve_qualified_expression_name): Pass extra from_super flag ! when invoking patch_method_invocation_stmt. New case for ! conditional expression when used as a primary. Check for error ! when acquiring super. (patch_method_invocation_stmt): Added extra argument super. New ! local variable is_static_flag. Set class_to_search according to ! the nature of the constructor invocation. Don't add `this' ! argument when expanding NEW_CLASS_EXPR. Check for illegal method ! invocation within the argument scope of explicit constructor ! invocation. Set is_static according to is_static_flag. Provide ! extra `super' argument to patch_invoke invocation. (patch_invoke): New argument from_super. Loop on arguments ! indentation fixed. Pass from_super to invocation_mode. New switch ! case INVOKE_SUPER. Fixed error message in switch default case. ! Don't use CALL_CONSTRUCTOR_P but rather a test on the tree node ! value. (invocation_mode): Return INVOKE_SUPER mode when appropriate. (lookup_method_invoke): Fixed prototypes in candidates list. Error ! message takes constructors into account. (find_applicable_accessible_methods_list): Fixed indentation. (qualify_ambiguous_name): Take explicit constructor invocation ! into account. Deal with a conditional expression as a primary to ! a method call. (java_complete_tree): Added local wfl_op3. New CONDITIONAL_EXPR ! case. Added extra argument to patch_method_invocation_stmt. ! Register calls made to explicit constructor `this'. Don't call ! save_expr in ARRAY_REF case when emitting class files. Check for ! illegal use of this when expanding explicit constructor invocation ! arguments. (complete_function_arguments): Set and reset parser context ! explicit_constructor_p field value when appropriate. (build_super_invocation, build_this_super_qualified_invocation): ! New functions. (patch_assignment): Fixed typo. (patch_unaryop): Check on final fields occurs only when a decl ! exits. (patch_return): Take constructors into account. (patch_conditional_expr): New function. * typeck.c (build_java_signature): Removed unnecessary empty line. --- 9883,9993 ---- (patch_method_invocation_stmt): Prototype reflects added argument. (patch_invoke): Likewise. (complete_method_declaration, build_super_invocation, ! verify_constructor_circularity, ! build_this_super_qualified_invocation, get_printable_method_name, ! patch_conditional_expr, maybe_generate_finit, fix_constructors, ! verify_constructor_super, create_artificial_method, ! start_artificial_method_body, end_artificial_method_body, ! generate_field_initialization_code): New function prototypes. * parse.y: Fixed leading comment (constructor_header:, constructor_body:, block_end:): Rules tagged ! . (type_declaration:): Call maybe_generate_finit. (method_declaration:): Action for method_body: placed in new ! function complete_method_declaration, called here. (constructor_declaration:): Defined actions. Removed leading ! FIXME. (constructor_header:): New rule with action. (constructor_body:): Rule rewritten using block_begin: and ! block_end:. Defined actions. (constructor_declarator:, explicit_constructor_invocation:): ! Defined actions. (block:): Use new rules block_begin: block_end:. (block_begin:, block_end:): New rules and actions. (block_statements:): Fixed error message for explicit ! constructors. (method_invocation:): Call build_this_super_qualified_invocation ! if primary is `this' or `super' was seen. (conditional_expression:): Action defined. (extra_ctxp_pushed_p): New static global flag. (java_parser_context_save_global): Create parser context if ! necessary. Use extra_ctxp_pushed_p to remember it. (java_parser_context_restore_global): Pop extra parser context if ! one exists. (build_array_from_name): Array on primitive types are marked ! loaded. (register_fields): Restore new name in field initializer ! expression if type was altered. Non static fields initialized upon ! declaration marked initialized. (maybe_generate_finit): New function. (maybe_generate_clinit): Use create_artificial_method, ! start_artificial_method_body, end_artificial_method_body. Generate ! debug info for enclosed initialization statements. (method_header): Fixed leading comment. Check constructor ! flags. Detect constructor declarations and set DECL_CONSTRUCTOR_P ! accordingly. (complete_method_declaration, constructor_circularity_msg, ! verify_constructor_circularity): New functions. (get_printable_method_name): New function. (check_method_redefinition): Don't rename methods. Fix ! declared constructor names. Error message for ! constructors modified. (java_check_regular_methods): Local variable seen_constructor ! renamed saw_constructor. Skip verification on constructors. Create ! default constructor with create_artificial_method. (java_check_methods): Removed unnecessary empty line. (create_artificial_method, start_artificial_method_body, ! end_artificial_method_body): New functions. (java_layout_classes): Changed leading comment. Reverse fields ! list if necessary. Always layout java.lang.Object if being ! defined. (java_complete_expand_methods): Verify constructor circularity. (java_complete_expand_method): Call fix_constructor on ! constructors. Local variable no_ac_found removed. Restore ! bindings if method body expansion failed. (fix_constructors, verify_constructor_super, ! generate_field_initialization_code): New function. (java_expand_classes): Fixed leading comment. Write class file ! here. (resolve_expression_name): Check for illegal instance variable ! usage within the argument scope of an explicit constructor ! invocation. (resolve_qualified_expression_name): Pass extra from_super flag ! when invoking patch_method_invocation_stmt. New case for ! conditional expression when used as a primary. Check for error ! when acquiring super. (patch_method_invocation_stmt): Added extra argument super. New ! local variable is_static_flag. Set class_to_search according to ! the nature of the constructor invocation. Don't add `this' ! argument when expanding NEW_CLASS_EXPR. Check for illegal method ! invocation within the argument scope of explicit constructor ! invocation. Set is_static according to is_static_flag. Provide ! extra `super' argument to patch_invoke invocation. (patch_invoke): New argument from_super. Loop on arguments ! indentation fixed. Pass from_super to invocation_mode. New switch ! case INVOKE_SUPER. Fixed error message in switch default case. ! Don't use CALL_CONSTRUCTOR_P but rather a test on the tree node ! value. (invocation_mode): Return INVOKE_SUPER mode when appropriate. (lookup_method_invoke): Fixed prototypes in candidates list. Error ! message takes constructors into account. (find_applicable_accessible_methods_list): Fixed indentation. (qualify_ambiguous_name): Take explicit constructor invocation ! into account. Deal with a conditional expression as a primary to ! a method call. (java_complete_tree): Added local wfl_op3. New CONDITIONAL_EXPR ! case. Added extra argument to patch_method_invocation_stmt. ! Register calls made to explicit constructor `this'. Don't call ! save_expr in ARRAY_REF case when emitting class files. Check for ! illegal use of this when expanding explicit constructor invocation ! arguments. (complete_function_arguments): Set and reset parser context ! explicit_constructor_p field value when appropriate. (build_super_invocation, build_this_super_qualified_invocation): ! New functions. (patch_assignment): Fixed typo. (patch_unaryop): Check on final fields occurs only when a decl ! exits. (patch_return): Take constructors into account. (patch_conditional_expr): New function. * typeck.c (build_java_signature): Removed unnecessary empty line. *************** Sun Oct 11 10:31:52 1998 Anthony Green *** 8256,8293 **** Wed Oct 21 07:54:11 1998 Alexandre Petit-Bianco * class.c (emit_register_classes): Renamed from ! emit_register_class. * java-tree.h (emit_register_classes): Prototype renamed from ! emit_register_class. * jcf-parse.c (yyparse): Call emit_register_classes once before ! returning. * parse.y (java_expand_classes): No longer register classes. Tue Oct 20 09:15:38 1998 Alexandre Petit-Bianco * class.c (is_compiled_class): New local variable ! seen_in_zip. Identify classes found in currently compiled source ! file(s). * decl.c (complete_start_java_method): Fixed typo. * java-tree.h (CLASS_FROM_CURRENTLY_COMPILED_SOURCE_P, ! HAS_BEEN_ALREADY_PARSED_P, IS_A_COMMAND_LINE_FILENAME_P): New macros. (CLASS_P): Moved around. (java_parse_abort_on_error): Macro moved from jcf-parse.c * jcf-parse.c (java_parse_abort_on_error): Macro moved to ! java-parse.h (jcf_parse_source): Changed leading comment. Removed unnecessary ! fclose and CLASS_FROM_SOURCE_P marking. (parse_source_file): New local variables remember_for_generation ! and filename. Mark parsed file name identifier node. Removed block ! executed when parse_only was null. Set remember_for_generation. Use it as an argument to java_pop_parser_context. (yyparse): New local variables several_files, list, next node and ! current_file_list. Split ampersand separated file names into ! current_file_list. Iterate through the list and parse accordingly. * parse.h (java_pop_parser_context): New function prototype. * parse.y (ctxp_for_generation): New static global variable. (java_pop_parser_context): New argument generate. Link popped ctxp ! to ctxp_for_generation list accordingly. (java_complete_expand_methods): Fixed indentation. (java_expand_classes): New function. --- 10125,10162 ---- Wed Oct 21 07:54:11 1998 Alexandre Petit-Bianco * class.c (emit_register_classes): Renamed from ! emit_register_class. * java-tree.h (emit_register_classes): Prototype renamed from ! emit_register_class. * jcf-parse.c (yyparse): Call emit_register_classes once before ! returning. * parse.y (java_expand_classes): No longer register classes. Tue Oct 20 09:15:38 1998 Alexandre Petit-Bianco * class.c (is_compiled_class): New local variable ! seen_in_zip. Identify classes found in currently compiled source ! file(s). * decl.c (complete_start_java_method): Fixed typo. * java-tree.h (CLASS_FROM_CURRENTLY_COMPILED_SOURCE_P, ! HAS_BEEN_ALREADY_PARSED_P, IS_A_COMMAND_LINE_FILENAME_P): New macros. (CLASS_P): Moved around. (java_parse_abort_on_error): Macro moved from jcf-parse.c * jcf-parse.c (java_parse_abort_on_error): Macro moved to ! java-parse.h (jcf_parse_source): Changed leading comment. Removed unnecessary ! fclose and CLASS_FROM_SOURCE_P marking. (parse_source_file): New local variables remember_for_generation ! and filename. Mark parsed file name identifier node. Removed block ! executed when parse_only was null. Set remember_for_generation. Use it as an argument to java_pop_parser_context. (yyparse): New local variables several_files, list, next node and ! current_file_list. Split ampersand separated file names into ! current_file_list. Iterate through the list and parse accordingly. * parse.h (java_pop_parser_context): New function prototype. * parse.y (ctxp_for_generation): New static global variable. (java_pop_parser_context): New argument generate. Link popped ctxp ! to ctxp_for_generation list accordingly. (java_complete_expand_methods): Fixed indentation. (java_expand_classes): New function. *************** Fri Oct 16 10:59:01 1998 Alexandre Peti *** 8301,8425 **** * lex.h (setjmp.h): Included. * parse.h (SET_TYPE_FOR_RESOLUTION): New macro. (duplicate_declaration_error_p): Renamed from ! duplicate_declaration_error. (build_array_from_name): New function prototype. * parse.y (setjmp.h): No longer included. (variable_declarator_id): Define action. (build_array_from_name): New function. (duplicate_declaration_error_p): Renamed from ! duplicate_declaration_error. Fixed leading comment. (register_fields): Main `for' loop reorganized. Uses ! SET_TYPE_FOR_RESOLUTION and build_array_from_name. (method_declarator): Uses SET_TYPE_FOR_RESOLUTION and call ! build_array_from_name. (resolve_class): Set CLASS_LOADED_P on newly build array dimension ! types. (read_import_dir): Don't try to skip `.' and `..'. (declare_local_variables): Uses SET_TYPE_FOR_RESOLUTION and ! build_array_from_name. Main `for' loop reorganized. (resolve_qualified_expression_name): When building access to a ! field, use the type where the field was found, not its own type. (maybe_access_field): Use field DECL_CONTEXT if the type where the ! field was found is null. (qualify_ambiguous_name): Sweep through all successive array ! dimensions. Wed Oct 14 18:21:29 1998 Alexandre Petit-Bianco * java-tree.h (pop_labeled_block, lang_printable_name, ! maybe_add_interface, set_super_info, get_access_flags_from_decl, ! interface_of_p, inherits_from_p, fix_classpath, ! complete_start_java_method, emit_handlers, init_outgoing_cpool, ! make_class_data, register_class, alloc_name_constant): New ! function prototypes. * lang.c (lang_decode_option): Set argc argument unused. Fixed ! indentation. Added cast to remove warning. (lang_printable_name): Set v argument unused. (lang_print_error): Added argument to lang_printable_name call. (java_dummy_print, print_lang_decl, print_lang_type, ! print_lang_identifier, lang_print_xnode): All argument marked ! unused. * lex.c (java_unget_unicode): Removed unnecessary argument. (java_allocate_new_line): Unused local variable is gone. (java_read_char): Added parenthesis in expressions to remove ! warnings. Added final return statement. (java_read_unicode): Added parenthesis in expression to remove ! warning. (java_parse_end_comment): Fixed java_unget_unicode invocation. (java_parse_escape_sequence): Likewise. (java_lex): Unused local variables are gone. Fixed ! java_unget_unicode invocation. * lex.h (set_float_handler): Prototype added when JC1_LITE not ! defined. * parse.h (ERROR_CANT_CONVERT_TO_BOOLEAN): Fixed ! lang_printable_name invocation in macro. (ERROR_CANT_CONVERT_TO_NUMERIC, ERROR_CAST_NEEDED_TO_INTEGRAL): ! Likewise. (duplicate_declaration_error): Suppressed unused argument in ! prototype. (identical_subpath_p): Function declaration is gone. (patch_invoke): Suppressed unused argument in prototype. (patch_cast, build_labeled_block, check_thrown_exceptions): ! Likewise. * parse.y (setjmp.h): Included (toplev.h): Likewise. (field_declaration:): Suppressed unused local (label_decl:): Fixed build_labeled_block invocation. (java_pop_parser_context): Put extra parenthesis around assignment ! in if. (yyerror): Suppressed unused local variables. (variable_redefinition_error): Fixed lang_printable_name ! invocation. (create_interface): Suppressed unused local variables. (create_class): Likewise. (duplicate_declaration_error): Suppressed unused argument. Fixed ! lang_printable_name invocation. (register_fields): Suppressed unused local variable. Fixed ! duplicate_declaration_error invocation. (method_header): Suppressed unused local variable. (method_declarator, parser_check_super): Likewise. (java_complete_class): Suppressed unused local variable. Fixed ! fatal error message. (complete_class_report_errors): Added default: in switch. (java_check_regular_methods): Fixed lang_printable_name ! invocations. (check_throws_clauses): Likewise. (java_check_abstract_methods): Suppressed unused local ! variable. Fixed lang_printable_name invocation. (read_import_entry): Added supplemental return statement. (read_import_dir): Suppressed unused local variables. (check_pkg_class_access, declare_local_variables): Likewise. (source_start_java_method): Suppressed unused extern variable ! declarations (expand_start_java_method): Suppressed unused extern and local ! variable declarations. (java_complete_expand_methods): Likewise. (java_complete_expand_method): Suppressed unused local variables. (make_qualified_name): Likewise. (resolve_qualified_expression_name): Added default: in ! switch. Fixed lang_printable_name invocation. (class_instance_creation_expression): Added parenthesis around ! expressions. (patch_method_invocation_stmt): Fixed lang_printable_name and ! patch_invoke invocations. (check_for_static_method_reference): Fixed lang_printable_name ! invocation. (patch_invoke): Suppressed unused arguments and local variables. (lookup_method_invoke): Suppressed unused local variables. (qualify_ambiguous_name): Added default: in switch. (identical_subpath_p): Function removed. (patch_assignment): Suppressed unused local variables. Suppressed ! unnecessary if statement. Fixed lang_printable_name invocations. (try_builtin_assignconv): Fixed lang_printable_name invocations. (valid_ref_assignconv_cast_p): Parenthesis around ! expression. Suppressed unused local variables. (build_binop): Suppressed unused local variables. fixed ! lang_printable_name invocations. (string_constant_concatenation): Suppressed unused local ! variables. (patch_unaryop): Fixed lang_printable_name invocation. (patch_cast): Suppressed unnecessary argument. Fixed ! lang_printable_name invocation. (patch_array_ref): Fixed lang_printable_name invocation. (patch_newarray, patch_return, patch_if_else_statement): Likewise. (build_labeled_block): Suppressed unused argument. --- 10170,10294 ---- * lex.h (setjmp.h): Included. * parse.h (SET_TYPE_FOR_RESOLUTION): New macro. (duplicate_declaration_error_p): Renamed from ! duplicate_declaration_error. (build_array_from_name): New function prototype. * parse.y (setjmp.h): No longer included. (variable_declarator_id): Define action. (build_array_from_name): New function. (duplicate_declaration_error_p): Renamed from ! duplicate_declaration_error. Fixed leading comment. (register_fields): Main `for' loop reorganized. Uses ! SET_TYPE_FOR_RESOLUTION and build_array_from_name. (method_declarator): Uses SET_TYPE_FOR_RESOLUTION and call ! build_array_from_name. (resolve_class): Set CLASS_LOADED_P on newly build array dimension ! types. (read_import_dir): Don't try to skip `.' and `..'. (declare_local_variables): Uses SET_TYPE_FOR_RESOLUTION and ! build_array_from_name. Main `for' loop reorganized. (resolve_qualified_expression_name): When building access to a ! field, use the type where the field was found, not its own type. (maybe_access_field): Use field DECL_CONTEXT if the type where the ! field was found is null. (qualify_ambiguous_name): Sweep through all successive array ! dimensions. Wed Oct 14 18:21:29 1998 Alexandre Petit-Bianco * java-tree.h (pop_labeled_block, lang_printable_name, ! maybe_add_interface, set_super_info, get_access_flags_from_decl, ! interface_of_p, inherits_from_p, fix_classpath, ! complete_start_java_method, emit_handlers, init_outgoing_cpool, ! make_class_data, register_class, alloc_name_constant): New ! function prototypes. * lang.c (lang_decode_option): Set argc argument unused. Fixed ! indentation. Added cast to remove warning. (lang_printable_name): Set v argument unused. (lang_print_error): Added argument to lang_printable_name call. (java_dummy_print, print_lang_decl, print_lang_type, ! print_lang_identifier, lang_print_xnode): All argument marked ! unused. * lex.c (java_unget_unicode): Removed unnecessary argument. (java_allocate_new_line): Unused local variable is gone. (java_read_char): Added parenthesis in expressions to remove ! warnings. Added final return statement. (java_read_unicode): Added parenthesis in expression to remove ! warning. (java_parse_end_comment): Fixed java_unget_unicode invocation. (java_parse_escape_sequence): Likewise. (java_lex): Unused local variables are gone. Fixed ! java_unget_unicode invocation. * lex.h (set_float_handler): Prototype added when JC1_LITE not ! defined. * parse.h (ERROR_CANT_CONVERT_TO_BOOLEAN): Fixed ! lang_printable_name invocation in macro. (ERROR_CANT_CONVERT_TO_NUMERIC, ERROR_CAST_NEEDED_TO_INTEGRAL): ! Likewise. (duplicate_declaration_error): Suppressed unused argument in ! prototype. (identical_subpath_p): Function declaration is gone. (patch_invoke): Suppressed unused argument in prototype. (patch_cast, build_labeled_block, check_thrown_exceptions): ! Likewise. * parse.y (setjmp.h): Included (toplev.h): Likewise. (field_declaration:): Suppressed unused local (label_decl:): Fixed build_labeled_block invocation. (java_pop_parser_context): Put extra parenthesis around assignment ! in if. (yyerror): Suppressed unused local variables. (variable_redefinition_error): Fixed lang_printable_name ! invocation. (create_interface): Suppressed unused local variables. (create_class): Likewise. (duplicate_declaration_error): Suppressed unused argument. Fixed ! lang_printable_name invocation. (register_fields): Suppressed unused local variable. Fixed ! duplicate_declaration_error invocation. (method_header): Suppressed unused local variable. (method_declarator, parser_check_super): Likewise. (java_complete_class): Suppressed unused local variable. Fixed ! fatal error message. (complete_class_report_errors): Added default: in switch. (java_check_regular_methods): Fixed lang_printable_name ! invocations. (check_throws_clauses): Likewise. (java_check_abstract_methods): Suppressed unused local ! variable. Fixed lang_printable_name invocation. (read_import_entry): Added supplemental return statement. (read_import_dir): Suppressed unused local variables. (check_pkg_class_access, declare_local_variables): Likewise. (source_start_java_method): Suppressed unused extern variable ! declarations (expand_start_java_method): Suppressed unused extern and local ! variable declarations. (java_complete_expand_methods): Likewise. (java_complete_expand_method): Suppressed unused local variables. (make_qualified_name): Likewise. (resolve_qualified_expression_name): Added default: in ! switch. Fixed lang_printable_name invocation. (class_instance_creation_expression): Added parenthesis around ! expressions. (patch_method_invocation_stmt): Fixed lang_printable_name and ! patch_invoke invocations. (check_for_static_method_reference): Fixed lang_printable_name ! invocation. (patch_invoke): Suppressed unused arguments and local variables. (lookup_method_invoke): Suppressed unused local variables. (qualify_ambiguous_name): Added default: in switch. (identical_subpath_p): Function removed. (patch_assignment): Suppressed unused local variables. Suppressed ! unnecessary if statement. Fixed lang_printable_name invocations. (try_builtin_assignconv): Fixed lang_printable_name invocations. (valid_ref_assignconv_cast_p): Parenthesis around ! expression. Suppressed unused local variables. (build_binop): Suppressed unused local variables. fixed ! lang_printable_name invocations. (string_constant_concatenation): Suppressed unused local ! variables. (patch_unaryop): Fixed lang_printable_name invocation. (patch_cast): Suppressed unnecessary argument. Fixed ! lang_printable_name invocation. (patch_array_ref): Fixed lang_printable_name invocation. (patch_newarray, patch_return, patch_if_else_statement): Likewise. (build_labeled_block): Suppressed unused argument. *************** Wed Oct 14 18:21:29 1998 Alexandre Peti *** 8432,8438 **** (patch_try_statement): Fixed lang_printable_name invocations. (patch_synchronized_statement, patch_throw_statement): Likewise. (check_thrown_exceptions): Fixed check_thrown_exceptions and ! lang_printable_name invocations. (check_thrown_exceptions_do): Suppressed unused argument. 1998-10-14 Tom Tromey --- 10301,10307 ---- (patch_try_statement): Fixed lang_printable_name invocations. (patch_synchronized_statement, patch_throw_statement): Likewise. (check_thrown_exceptions): Fixed check_thrown_exceptions and ! lang_printable_name invocations. (check_thrown_exceptions_do): Suppressed unused argument. 1998-10-14 Tom Tromey *************** Tue Oct 13 23:34:12 1998 Jeffrey A Law *** 8487,8500 **** Tue Oct 13 03:50:28 1998 Alexandre Petit-Bianco * decl.c (runtime_exception_type_node, error_exception_type_node): ! New global variables. (init_decl_processing): Initialized. * expr.c (java_lang_expand_expr): Set caught exception type to ! null if catch handler argument doesn't exit. * java-tree.def (SYNCHRONIZED_EXPR, THROW_EXPR): New Java specific ! tree codes. * java-tree.h (runtime_exception_type_node, ! error_exception_type_node): Global variables declared. (DECL_FUNCTION_THROWS): New macro. (DECL_FUNCTION_BODY): Modified comment. (DECL_SPECIFIC_COUNT): Likewise. --- 10356,10369 ---- Tue Oct 13 03:50:28 1998 Alexandre Petit-Bianco * decl.c (runtime_exception_type_node, error_exception_type_node): ! New global variables. (init_decl_processing): Initialized. * expr.c (java_lang_expand_expr): Set caught exception type to ! null if catch handler argument doesn't exit. * java-tree.def (SYNCHRONIZED_EXPR, THROW_EXPR): New Java specific ! tree codes. * java-tree.h (runtime_exception_type_node, ! error_exception_type_node): Global variables declared. (DECL_FUNCTION_THROWS): New macro. (DECL_FUNCTION_BODY): Modified comment. (DECL_SPECIFIC_COUNT): Likewise. *************** Tue Oct 13 03:50:28 1998 Alexandre Peti *** 8502,8565 **** (IS_UNCHECKED_EXPRESSION_P): New macro. * lex.c (java_lex): Generate location information for THROW_TK. * parse.h (PUSH_EXCEPTIONS, POP_EXCEPTIONS, IN_TRY_BLOCK_P, ! EXCEPTIONS_P): New macros. (enum jdep_code): New value JDEP_EXCEPTION. (BUILD_MONITOR_ENTER, BUILD_MONITOR_EXIT, ! BUILD_ASSIGN_EXCEPTION_INFO, BUILD_THROW, SET_WFL_OPERATOR, ! PATCH_METHOD_RETURN_ERROR): New macros. (patch_method_invocation_stmt): Added new argument to prototype. (patch_synchronized_statement, patch_throw_statement, ! check_thrown_exceptions, check_thrown_exceptions_do, ! purge_unchecked_exceptions, check_throws_clauses): New function ! prototypes. * parse.y Fixed typo in keyword section. (throw:): Rule tagged . (THROW_TK): Keyword tagged . (method_header:): Last argument to call to method_header passed ! from throws: rule. (throws:, class_type_list:, throw_statement:, ! synchronized_statement:, synchronized:): Defined actions. (method_header): New local variable current. Register exceptions ! from throws clause. (java_complete_tree): Complete and verify exceptions from throws ! clause. (complete_class_report_errors): Error message on exceptions not ! found (java_check_regular_methods): Fixed typo. Shortcut on private ! overriding methods. Changed error message on method ! redefinition. Check for throws clause compatibility. (check_throws_clauses): New function. (java_check_abstract_methods): Use DECL_NAME for wfl or current ! method. Changed error message on method redefinition. (currently_caught_type_list): New static variable. (java_complete_expand_methods): Purge unchecked exceptions from ! throws clause list. Call PUSH_EXCEPTIONS before walk and ! POP_EXCEPTIONS after. (resolve_qualified_expression_name): Pass new argument as NULL to ! patch_method_invocation_stmt. (patch_method_invocation_stmt): New argument ref_decl. Invoke ! PATCH_METHOD_RETURN_ERROR when returning with error. Reverse ! argument list when appropriate. Use new argument if non null to ! store selected method decl. (patch_invoke): Convert if necessary args of builtin types before ! forming CALL_EXPR. Argument list no longer reversed here. (invocation_mode): Treat final methods as static methods. (java_complete_tree): New cases for THROW_EXPR: and ! SYNCHRONIZED_EXPR:. Check thrown exceptions when completing ! function call. (complete_function_arguments): No more RECORD_TYPE ! conversion. Function parameter nodes no longer saved. (valid_ref_assignconv_cast_p): Avoid handling null type. (patch_binop): Fixed null constant reference handling. (build_try_statement): Use BUILD_ASSIGN_EXCEPTION_INFO and ! BUILD_THROW macros. (patch_try_statement): Fixed comments. Record caught types in ! list, push the list, expand try block and pop the list. (patch_synchronized_statement, patch_throw_statement, ! check_thrown_exceptions, check_thrown_exceptions_do, ! purge_unchecked_exceptions): New functions. * typeck.c (lookup_argument_method): Allow WFL in place of method ! DECL_NAME during method definition check 1998-10-09 Tom Tromey --- 10371,10434 ---- (IS_UNCHECKED_EXPRESSION_P): New macro. * lex.c (java_lex): Generate location information for THROW_TK. * parse.h (PUSH_EXCEPTIONS, POP_EXCEPTIONS, IN_TRY_BLOCK_P, ! EXCEPTIONS_P): New macros. (enum jdep_code): New value JDEP_EXCEPTION. (BUILD_MONITOR_ENTER, BUILD_MONITOR_EXIT, ! BUILD_ASSIGN_EXCEPTION_INFO, BUILD_THROW, SET_WFL_OPERATOR, ! PATCH_METHOD_RETURN_ERROR): New macros. (patch_method_invocation_stmt): Added new argument to prototype. (patch_synchronized_statement, patch_throw_statement, ! check_thrown_exceptions, check_thrown_exceptions_do, ! purge_unchecked_exceptions, check_throws_clauses): New function ! prototypes. * parse.y Fixed typo in keyword section. (throw:): Rule tagged . (THROW_TK): Keyword tagged . (method_header:): Last argument to call to method_header passed ! from throws: rule. (throws:, class_type_list:, throw_statement:, ! synchronized_statement:, synchronized:): Defined actions. (method_header): New local variable current. Register exceptions ! from throws clause. (java_complete_tree): Complete and verify exceptions from throws ! clause. (complete_class_report_errors): Error message on exceptions not ! found (java_check_regular_methods): Fixed typo. Shortcut on private ! overriding methods. Changed error message on method ! redefinition. Check for throws clause compatibility. (check_throws_clauses): New function. (java_check_abstract_methods): Use DECL_NAME for wfl or current ! method. Changed error message on method redefinition. (currently_caught_type_list): New static variable. (java_complete_expand_methods): Purge unchecked exceptions from ! throws clause list. Call PUSH_EXCEPTIONS before walk and ! POP_EXCEPTIONS after. (resolve_qualified_expression_name): Pass new argument as NULL to ! patch_method_invocation_stmt. (patch_method_invocation_stmt): New argument ref_decl. Invoke ! PATCH_METHOD_RETURN_ERROR when returning with error. Reverse ! argument list when appropriate. Use new argument if non null to ! store selected method decl. (patch_invoke): Convert if necessary args of builtin types before ! forming CALL_EXPR. Argument list no longer reversed here. (invocation_mode): Treat final methods as static methods. (java_complete_tree): New cases for THROW_EXPR: and ! SYNCHRONIZED_EXPR:. Check thrown exceptions when completing ! function call. (complete_function_arguments): No more RECORD_TYPE ! conversion. Function parameter nodes no longer saved. (valid_ref_assignconv_cast_p): Avoid handling null type. (patch_binop): Fixed null constant reference handling. (build_try_statement): Use BUILD_ASSIGN_EXCEPTION_INFO and ! BUILD_THROW macros. (patch_try_statement): Fixed comments. Record caught types in ! list, push the list, expand try block and pop the list. (patch_synchronized_statement, patch_throw_statement, ! check_thrown_exceptions, check_thrown_exceptions_do, ! purge_unchecked_exceptions): New functions. * typeck.c (lookup_argument_method): Allow WFL in place of method ! DECL_NAME during method definition check 1998-10-09 Tom Tromey *************** Fri Oct 2 17:22:52 1998 Alexandre Peti *** 8592,8644 **** * Makefile.in (lang.o:): Install dependency on java-tree.def. * decl.c (soft_exceptioninfo_call_node): New global variable. (init_decl_processing): Fixed indentation. soft_badarrayindex_node ! takes extra integer argument. soft_exceptioninfo_call_node ! initialized. * except.c (java_set_exception_lang_code): New function (method_init_exceptions): Called here. (prepare_eh_table_type): New function. (expand_end_java_handler): Called here. * expr.c (build_java_throw_out_of_bounds_exception): Now features ! one argument. Modified generation of call to ! soft_badarrayindex_node to use new argument. (build_java_arrayaccess): Pass faulty index value to ! build_java_throw_out_of_bounds_exception. (generate_name): New function. (java_lang_expand_expr): New local variables node, current, ! has_finally_p. Expand TRY_EXPR node. (process_jvm_instruction): Replace top of the stack with thrown ! object reference when entering exception handler. * java-tree.def (TRY_EXPR, CATCH_EXPR, FINALLY_EXPR): New Java ! specific tree codes. * java-tree.h (soft_exceptioninfo_call_node): Declaration of new ! global. (DECL_SPECIFIC_COUNT): New macro. (prepare_eh_table_type, java_set_exception_lang_code, ! generate_name): New function declarations. (match_java_method): Declaration deleted. (FINALLY_EXPR_LABEL, FINALLY_EXPR_BLOCK, CATCH_EXPR_GET_EXPR): New ! macros. * lex.c (TRY_TK, CATCH_TK): Generate location information. * parse.h (redefinition_error, refine_accessible_methods_list, ! can_cast_to_p): Function declaration removed. (classitf_redefinition_error, variable_redefinition_error, ! parse_jdk1_1_error, find_applicable_accessible_methods_list, ! find_most_specific_methods_list, argument_types_convertible, ! enter_a_block, valid_builtin_assignconv_identity_widening_p, ! valid_cast_to_p, valid_method_invocation_conversion_p, ! try_reference_assignconv, add_stmt_to_compound, ! build_jump_to_finally, build_tree_list, patch_try_statement, ! java_get_catch_block): New function declarations. * parse.y (string_buffer_type): Global variable deleted. (group_of_labels, catches, catch_clause, catch_clause_parameter, ! finally): Rules tagged . (TRY_TK, CATCH_TK): Token tagged . (class_body_declaration:, class_member_declaration:, ! formal_parameter:, explicit_constructor_invocation:, ! interface_member_declaration:, constant_declaration:, ! primary_no_new_array:, class_instance_creation_expression:, ! array_creation_expression:): Issue error on unsuported JDK1.1 ! features. (try_statement:, catches:, finally:): Define actions. (catch_clause_parameter): New rule. (catch_clause:): Use new rule catch_clause_parameter. --- 10461,10513 ---- * Makefile.in (lang.o:): Install dependency on java-tree.def. * decl.c (soft_exceptioninfo_call_node): New global variable. (init_decl_processing): Fixed indentation. soft_badarrayindex_node ! takes extra integer argument. soft_exceptioninfo_call_node ! initialized. * except.c (java_set_exception_lang_code): New function (method_init_exceptions): Called here. (prepare_eh_table_type): New function. (expand_end_java_handler): Called here. * expr.c (build_java_throw_out_of_bounds_exception): Now features ! one argument. Modified generation of call to ! soft_badarrayindex_node to use new argument. (build_java_arrayaccess): Pass faulty index value to ! build_java_throw_out_of_bounds_exception. (generate_name): New function. (java_lang_expand_expr): New local variables node, current, ! has_finally_p. Expand TRY_EXPR node. (process_jvm_instruction): Replace top of the stack with thrown ! object reference when entering exception handler. * java-tree.def (TRY_EXPR, CATCH_EXPR, FINALLY_EXPR): New Java ! specific tree codes. * java-tree.h (soft_exceptioninfo_call_node): Declaration of new ! global. (DECL_SPECIFIC_COUNT): New macro. (prepare_eh_table_type, java_set_exception_lang_code, ! generate_name): New function declarations. (match_java_method): Declaration deleted. (FINALLY_EXPR_LABEL, FINALLY_EXPR_BLOCK, CATCH_EXPR_GET_EXPR): New ! macros. * lex.c (TRY_TK, CATCH_TK): Generate location information. * parse.h (redefinition_error, refine_accessible_methods_list, ! can_cast_to_p): Function declaration removed. (classitf_redefinition_error, variable_redefinition_error, ! parse_jdk1_1_error, find_applicable_accessible_methods_list, ! find_most_specific_methods_list, argument_types_convertible, ! enter_a_block, valid_builtin_assignconv_identity_widening_p, ! valid_cast_to_p, valid_method_invocation_conversion_p, ! try_reference_assignconv, add_stmt_to_compound, ! build_jump_to_finally, build_tree_list, patch_try_statement, ! java_get_catch_block): New function declarations. * parse.y (string_buffer_type): Global variable deleted. (group_of_labels, catches, catch_clause, catch_clause_parameter, ! finally): Rules tagged . (TRY_TK, CATCH_TK): Token tagged . (class_body_declaration:, class_member_declaration:, ! formal_parameter:, explicit_constructor_invocation:, ! interface_member_declaration:, constant_declaration:, ! primary_no_new_array:, class_instance_creation_expression:, ! array_creation_expression:): Issue error on unsuported JDK1.1 ! features. (try_statement:, catches:, finally:): Define actions. (catch_clause_parameter): New rule. (catch_clause:): Use new rule catch_clause_parameter. *************** Fri Oct 2 17:22:52 1998 Alexandre Peti *** 8646,8687 **** (redefinition_error): Renamed classitf_redefinition_error. (variable_redefinition_error): New function. (check_class_interface_creation): Call ! classitf_redefinition_error. (java_complete_tree): Added error message on JDEP_TYPE: case. (complete_class_report_errors): Fixed indentation. (declare_local_variables): Call variable_redefinition_error. (source_end_java_method): Call java_set_exception_lang_code and ! emit_handlers where appropriate. (java_method_add_stmt): Call add_stmt_to_block. (add_stmt_to_block): New function. (lookup_method_invoke): Fixed outside comment. new local variable ! candicates. Call find_applicable_accessible_methods_list and ! find_most_specific_methods_list when searching for a ! method. Modified error report to list possible candidates when ! applicable. (find_applicable_accessible_methods_list, ! find_most_specific_methods_list, argument_types_convertible): New ! function. (refine_accessible_methods_list): Function deleted. (java_complete_tree): Handle TRY_EXPR. ARRAY_REF handling: save ! expr (if applicable) before calling patch_array_ref. (build_expr_block): Fixed BLOCK_EXPR_BODY assignment. (enter_block): Fixed comment. (enter_a_block): New function. (patch_assignment): Reorganized. Call try_reference_assignconv for ! references. Call valid_cast_to_p instead of can_cast_to_p. (try_reference_assignconv, ! valid_builtin_assignconv_identity_widening_p): New functions. (valid_ref_assignconv_cast_p): Fixed inverted test on CLASS_FINAL. (valid_cast_to_p, valid_method_invocation_conversion_p): New ! functions. (build_string_concatenation): Don't resolve StringBuffer. (patch_cast): Fixed inverted arguments. (patch_array_ref): Code to save array expr deleted. Call ! valid_cast_to_p instead of can_cast_to_p. (generate_labeled_block): Call generate_name. (build_jump_to_finally, build_try_statement, java_get_catch_block, ! patch_try_statement): New functions. * typeck.c (match_java_method): Function deleted. Fri Oct 2 13:48:36 1998 Anthony Green --- 10515,10556 ---- (redefinition_error): Renamed classitf_redefinition_error. (variable_redefinition_error): New function. (check_class_interface_creation): Call ! classitf_redefinition_error. (java_complete_tree): Added error message on JDEP_TYPE: case. (complete_class_report_errors): Fixed indentation. (declare_local_variables): Call variable_redefinition_error. (source_end_java_method): Call java_set_exception_lang_code and ! emit_handlers where appropriate. (java_method_add_stmt): Call add_stmt_to_block. (add_stmt_to_block): New function. (lookup_method_invoke): Fixed outside comment. new local variable ! candicates. Call find_applicable_accessible_methods_list and ! find_most_specific_methods_list when searching for a ! method. Modified error report to list possible candidates when ! applicable. (find_applicable_accessible_methods_list, ! find_most_specific_methods_list, argument_types_convertible): New ! function. (refine_accessible_methods_list): Function deleted. (java_complete_tree): Handle TRY_EXPR. ARRAY_REF handling: save ! expr (if applicable) before calling patch_array_ref. (build_expr_block): Fixed BLOCK_EXPR_BODY assignment. (enter_block): Fixed comment. (enter_a_block): New function. (patch_assignment): Reorganized. Call try_reference_assignconv for ! references. Call valid_cast_to_p instead of can_cast_to_p. (try_reference_assignconv, ! valid_builtin_assignconv_identity_widening_p): New functions. (valid_ref_assignconv_cast_p): Fixed inverted test on CLASS_FINAL. (valid_cast_to_p, valid_method_invocation_conversion_p): New ! functions. (build_string_concatenation): Don't resolve StringBuffer. (patch_cast): Fixed inverted arguments. (patch_array_ref): Code to save array expr deleted. Call ! valid_cast_to_p instead of can_cast_to_p. (generate_labeled_block): Call generate_name. (build_jump_to_finally, build_try_statement, java_get_catch_block, ! patch_try_statement): New functions. * typeck.c (match_java_method): Function deleted. Fri Oct 2 13:48:36 1998 Anthony Green *************** Thu Sep 24 12:20:35 1998 Per Bothner < *** 8726,8732 **** * parse.y: Add/remove promote_type calls as appropriate. * typeck.c (parse_signature_type): Returns POINTER_TYPE for objects. (parse_signature_string): Likewise. ! (build_java_array_type): Fix for now signature convenions. * lex.c (java_lex): Fix (from Alex) for JC1_LITE problem. --- 10595,10601 ---- * parse.y: Add/remove promote_type calls as appropriate. * typeck.c (parse_signature_type): Returns POINTER_TYPE for objects. (parse_signature_string): Likewise. ! (build_java_array_type): Fix for now signature convenions. * lex.c (java_lex): Fix (from Alex) for JC1_LITE problem. *************** Tue Sep 22 12:00:02 1998 Alexandre Peti *** 8740,8807 **** * expr.c (java_lang_expand_expr): New case for SWITCH_EXPR. * java-tree.def: Fixed DEFTREECODE third argument. (UNARY_PLUS_EXPR, NEW_ARRAY_EXPR, NEW_CLASS_EXPR, THIS_EXPR, ! CASE_EXPR, DEFAULT_EXPR): New tree codes for Java. * java-tree.h: (IS_CRAFTED_STRING_BUFFER_P): New macro. (JAVA_UNARY_PLUS_EXPR, JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, ! JAVA_THIS_EXPR): Now replaced by tree code definitions. (CALL_CONSTRUCTOR_P): Now uses NEW_CLASS_EXPR. * lang.c (java_tree_code_type, java_tree_code_length, ! java_tree_code_name): New arrays. (lang_init): Append Java tree node definitions to Gcc ones. * lex.c (expression_obstack): Declared as extern when JC1_LITE ! defined. (java_init_lex): Initialize wfl_append, wfl_string_buffer, ! wfl_to_string. (java_lex): Allow declaration of empty string constants. Retain ! location information on CASE_TK and DEFAULT_TK. * parse.h (JFLOAT_TYPE_P, JINTEGRAL_TYPE_P, JNUMERIC_TYPE_P, ! JPRIMITIVE_TYPE_P, JSTRING_TYPE_P, JSTRING_P, JREFERENCE_TYPE_P): ! Modified to be more robust. (BUILD_APPEND, BUILD_STRING_BUFFER): New macros. (build_new_invocation, try_builtin_assignconv, ! patch_switch_statement, string_constant_concatenation, ! build_string_concatenation, patch_string_cst, patch_string, ! java_expand_switch): New function declarations. * parse.y: Rules related to switch and EH tagged . (label_id): Set to NULL_TREE (wfl_string_buffer, wfl_append, wfl_to_string): New static global ! tree nodes. (this_or_super:): Fixed indentation. (statement:, statement_nsi:, statement_without_trailing_substatement:, ! statement_expression:): Removed call to RULE on all sub-rules. (switch_expression:, switch_labels:): New rules. (switch_statement:, switch_block:, switch_block_statement_groups:, ! switch_block_statement_group:, switch_labels:, switch_label:): ! Defined actions. (throw_statement:, synchronized_statement:, try_statement:): ! Defined temporary actions. (class_instance_creation_expression:): Call ! build_new_invocation. Fixed indentation. (field_access): Fixed indentation. (method_invocation): Likewise. (make_qualified_primary): Use THIS_EXPR. (resolve_qualified_expression_name): Use NEW_CLASS_EXPR. When ! resolving from SUPER, set *type_found. (qualify_ambiguous_name): Use NEW_CLASS_EXPR. (java_complete_tree): Removed unused local variable `location'. Case ! for SWITCH_EXPR, sharing code with LOOP_EXPR. Use NEW_ARRAY_EXPR, ! NEW_CLASS_EXPR, UNARY_PLUS_EXPR and THIS_EXPR. New string handling ! on MODIFY_EXPR: and all binary operator tree code cases. Removed ! STRING_CST: case. default: checks for patchable strings. (complete_function_arguments): Transform string constant or ! crafted StringBuffer if necessary. (build_method_invocation): Fixed comments. (build_new_invocation): New function. (patch_assignment): Call try_builtin_assignconv to figure a valid ! assignment conversion between builtin types. (try_builtin_assignconv): New function. (build_binop): Use URSHIFT_EXPR directly to call build. (operator_string): Use UNARY_PLUS_EXPR. (patch_binop): Use UNARY_PLUS_EXPR. Handle string concatenation ! operator. (do_merge_string_cste, merge_string_cste, ! string_constant_concatenation, build_string_concatenation, ! patch_string, patch_string_cst): New function. (build_unary_op): Use UNARY_PLUS_EXPR and CONVERT_EXPR. (patch_unaryop): Likewise. New test of valid ++/-- operands. (build_newarray_node): Use NEW_ARRAY_EXPR. --- 10609,10676 ---- * expr.c (java_lang_expand_expr): New case for SWITCH_EXPR. * java-tree.def: Fixed DEFTREECODE third argument. (UNARY_PLUS_EXPR, NEW_ARRAY_EXPR, NEW_CLASS_EXPR, THIS_EXPR, ! CASE_EXPR, DEFAULT_EXPR): New tree codes for Java. * java-tree.h: (IS_CRAFTED_STRING_BUFFER_P): New macro. (JAVA_UNARY_PLUS_EXPR, JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, ! JAVA_THIS_EXPR): Now replaced by tree code definitions. (CALL_CONSTRUCTOR_P): Now uses NEW_CLASS_EXPR. * lang.c (java_tree_code_type, java_tree_code_length, ! java_tree_code_name): New arrays. (lang_init): Append Java tree node definitions to Gcc ones. * lex.c (expression_obstack): Declared as extern when JC1_LITE ! defined. (java_init_lex): Initialize wfl_append, wfl_string_buffer, ! wfl_to_string. (java_lex): Allow declaration of empty string constants. Retain ! location information on CASE_TK and DEFAULT_TK. * parse.h (JFLOAT_TYPE_P, JINTEGRAL_TYPE_P, JNUMERIC_TYPE_P, ! JPRIMITIVE_TYPE_P, JSTRING_TYPE_P, JSTRING_P, JREFERENCE_TYPE_P): ! Modified to be more robust. (BUILD_APPEND, BUILD_STRING_BUFFER): New macros. (build_new_invocation, try_builtin_assignconv, ! patch_switch_statement, string_constant_concatenation, ! build_string_concatenation, patch_string_cst, patch_string, ! java_expand_switch): New function declarations. * parse.y: Rules related to switch and EH tagged . (label_id): Set to NULL_TREE (wfl_string_buffer, wfl_append, wfl_to_string): New static global ! tree nodes. (this_or_super:): Fixed indentation. (statement:, statement_nsi:, statement_without_trailing_substatement:, ! statement_expression:): Removed call to RULE on all sub-rules. (switch_expression:, switch_labels:): New rules. (switch_statement:, switch_block:, switch_block_statement_groups:, ! switch_block_statement_group:, switch_labels:, switch_label:): ! Defined actions. (throw_statement:, synchronized_statement:, try_statement:): ! Defined temporary actions. (class_instance_creation_expression:): Call ! build_new_invocation. Fixed indentation. (field_access): Fixed indentation. (method_invocation): Likewise. (make_qualified_primary): Use THIS_EXPR. (resolve_qualified_expression_name): Use NEW_CLASS_EXPR. When ! resolving from SUPER, set *type_found. (qualify_ambiguous_name): Use NEW_CLASS_EXPR. (java_complete_tree): Removed unused local variable `location'. Case ! for SWITCH_EXPR, sharing code with LOOP_EXPR. Use NEW_ARRAY_EXPR, ! NEW_CLASS_EXPR, UNARY_PLUS_EXPR and THIS_EXPR. New string handling ! on MODIFY_EXPR: and all binary operator tree code cases. Removed ! STRING_CST: case. default: checks for patchable strings. (complete_function_arguments): Transform string constant or ! crafted StringBuffer if necessary. (build_method_invocation): Fixed comments. (build_new_invocation): New function. (patch_assignment): Call try_builtin_assignconv to figure a valid ! assignment conversion between builtin types. (try_builtin_assignconv): New function. (build_binop): Use URSHIFT_EXPR directly to call build. (operator_string): Use UNARY_PLUS_EXPR. (patch_binop): Use UNARY_PLUS_EXPR. Handle string concatenation ! operator. (do_merge_string_cste, merge_string_cste, ! string_constant_concatenation, build_string_concatenation, ! patch_string, patch_string_cst): New function. (build_unary_op): Use UNARY_PLUS_EXPR and CONVERT_EXPR. (patch_unaryop): Likewise. New test of valid ++/-- operands. (build_newarray_node): Use NEW_ARRAY_EXPR. *************** Tue Sep 22 12:00:02 1998 Alexandre Peti *** 8811,8821 **** (complete_labeled_statement): Fixed related comment. (build_loop_body): Fixed comment. (build_bc_statement): Enable debug information on break/continue ! statements. (patch_bc_statement): Fixed typos. Handle SWITCH statement ! context. (patch_switch_statement, case_identity, java_expand_switch): New ! functions. Mon Sep 21 13:21:35 1998 Per Bothner --- 10680,10690 ---- (complete_labeled_statement): Fixed related comment. (build_loop_body): Fixed comment. (build_bc_statement): Enable debug information on break/continue ! statements. (patch_bc_statement): Fixed typos. Handle SWITCH statement ! context. (patch_switch_statement, case_identity, java_expand_switch): New ! functions. Mon Sep 21 13:21:35 1998 Per Bothner *************** Thu Sep 3 12:03:53 1998 Alexandre Peti *** 8954,8966 **** (build_debugable_stmt, complete_for_loop): New function prototypes. * parse.y: Fixed copyright assignment. (for_statement:): Call complete_for_loop. Set EXIT_EXPR to be ! size_zero_node when completing a loop with no exit condition. (for_statement_nsi:): Define action. (for_init:, for_update:): Return size_zero_node when empty. (declare_local_variables): Call build_debugable_stmt. (build_debugable_stmt): New function. (build_loop_body): Build debugable statement around loop ! condition part. (complete_loop_body): Take into account the debugable statement around the EXIT_EXPR. (complete_loop_body): New function. --- 10823,10835 ---- (build_debugable_stmt, complete_for_loop): New function prototypes. * parse.y: Fixed copyright assignment. (for_statement:): Call complete_for_loop. Set EXIT_EXPR to be ! size_zero_node when completing a loop with no exit condition. (for_statement_nsi:): Define action. (for_init:, for_update:): Return size_zero_node when empty. (declare_local_variables): Call build_debugable_stmt. (build_debugable_stmt): New function. (build_loop_body): Build debugable statement around loop ! condition part. (complete_loop_body): Take into account the debugable statement around the EXIT_EXPR. (complete_loop_body): New function. *************** Wed Sep 2 11:53:58 1998 Tom Tromey * parse-scan.y (report_main_declaration): Name of the class ! containing `main' can be a qualified name. Mon Aug 31 13:25:58 1998 Tom Tromey --- 10849,10855 ---- Wed Sep 2 11:28:35 1998 Alexandre Petit-Bianco * parse-scan.y (report_main_declaration): Name of the class ! containing `main' can be a qualified name. Mon Aug 31 13:25:58 1998 Tom Tromey *************** Thu Aug 27 02:28:27 1998 Alexandre Peti *** 8998,9043 **** (../jcf-dump$(exeext)): Was jcf-dump$(exeext) before. * config-lang.in (compilers): Removed gcj, gjavah from the list. * jcf-parse.c (parse_source_file): Call java_layout_classes and ! check for errors even if parse_only. * lex.c (java_init_lex): Reorganized and skip parts if JC1_LITE is ! defined. (yylex): New function. Uses java_lex body. (java_lex): Removed commented out statement. Remove local variable ! literal. Use SET_LVAL_NODE_TYPE and SET_LVAL_NODE where ! appropriate. Use macros FLOAT_TYPE_NODE, DOUBLE_TYPE_NODE, ! DCONST0, SET_FLOAT_HANDLER, SET_REAL_VALUE_ATOF, ! SET_LVAL_NODE_TYPE and GET_TYPE_PRECISION. Don't create STRING_CST ! if JC1_LITE is defined. Use BUILD_ID_WFL to build identifiers. Use ! SET_MODIFIER_CTX, SET_LVAL_NODE, BUILD_ID_WFL and GET_IDENTIFIER ! where appropriate. (java_lex_error): Empty if JC1_LITE is defined. (java_get_line_col): Return 0 if JC1_LITE is defined. * lex.h (JAVA_FLOAT_RANGE_ERROR, JAVA_INTEGRAL_RANGE_ERROR, ! SET_MODIFIER_CTX): Moved into the section containing the macros ! conditionally defined by JC1_LITE. (BUILD_OPERATOR,BUILD_OPERATOR2): Just return the TOKEN ! argument if JC1_LITE is defined. (HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, REAL_VALUE_ATOF, ! REAL_VALUE_ISINF, REAL_VALUE_ISNAN): Preset to values if JC1_LITE ! is defined. (DCONST0, SET_FLOAT_HANDLER, GET_IDENTIFIER, SET_REAL_VALUE_ATOF, ! FLOAT_TYPE, DOUBLE_TYPE, SET_MODIFIER_CTX, GET_TYPE_PRECISION, ! SET_LVAL_NODE, SET_LVAL_NODE_TYPE, BUILD_ID_WFL): New macros, set ! to different values according to JC1_LITE. * parse.h (int_fits_type_p, stabilize_reference): Prototype not ! declared if JC1_LITE set. (jdep_code, typedef struct _jdep, typedef struct _jdeplist): Not ! defined if JC1_LITE not set. (struct parser_ctx): Reorganized and skip the jc1 front end part ! if JC1_LITE set. (java_layout_classes): New function definition. (java_push_parser_context, java_init_lex, yyparse, yylex, ! yyerror): Prototype always declared. All other static function ! prototypes declared only if JC1_LITE is not set. * parse.y (yyparse, yylex, yyerror): No longer declared here. Now ! declared in parse.h. (java_layout_classes): New function. ! (java_complete_expand_methods): No longer layout the class here. * parse-scan.y: New file. * jv-scan.c: New file. --- 10867,10912 ---- (../jcf-dump$(exeext)): Was jcf-dump$(exeext) before. * config-lang.in (compilers): Removed gcj, gjavah from the list. * jcf-parse.c (parse_source_file): Call java_layout_classes and ! check for errors even if parse_only. * lex.c (java_init_lex): Reorganized and skip parts if JC1_LITE is ! defined. (yylex): New function. Uses java_lex body. (java_lex): Removed commented out statement. Remove local variable ! literal. Use SET_LVAL_NODE_TYPE and SET_LVAL_NODE where ! appropriate. Use macros FLOAT_TYPE_NODE, DOUBLE_TYPE_NODE, ! DCONST0, SET_FLOAT_HANDLER, SET_REAL_VALUE_ATOF, ! SET_LVAL_NODE_TYPE and GET_TYPE_PRECISION. Don't create STRING_CST ! if JC1_LITE is defined. Use BUILD_ID_WFL to build identifiers. Use ! SET_MODIFIER_CTX, SET_LVAL_NODE, BUILD_ID_WFL and GET_IDENTIFIER ! where appropriate. (java_lex_error): Empty if JC1_LITE is defined. (java_get_line_col): Return 0 if JC1_LITE is defined. * lex.h (JAVA_FLOAT_RANGE_ERROR, JAVA_INTEGRAL_RANGE_ERROR, ! SET_MODIFIER_CTX): Moved into the section containing the macros ! conditionally defined by JC1_LITE. (BUILD_OPERATOR,BUILD_OPERATOR2): Just return the TOKEN ! argument if JC1_LITE is defined. (HOST_BITS_PER_WIDE_INT, HOST_WIDE_INT, REAL_VALUE_ATOF, ! REAL_VALUE_ISINF, REAL_VALUE_ISNAN): Preset to values if JC1_LITE ! is defined. (DCONST0, SET_FLOAT_HANDLER, GET_IDENTIFIER, SET_REAL_VALUE_ATOF, ! FLOAT_TYPE, DOUBLE_TYPE, SET_MODIFIER_CTX, GET_TYPE_PRECISION, ! SET_LVAL_NODE, SET_LVAL_NODE_TYPE, BUILD_ID_WFL): New macros, set ! to different values according to JC1_LITE. * parse.h (int_fits_type_p, stabilize_reference): Prototype not ! declared if JC1_LITE set. (jdep_code, typedef struct _jdep, typedef struct _jdeplist): Not ! defined if JC1_LITE not set. (struct parser_ctx): Reorganized and skip the jc1 front end part ! if JC1_LITE set. (java_layout_classes): New function definition. (java_push_parser_context, java_init_lex, yyparse, yylex, ! yyerror): Prototype always declared. All other static function ! prototypes declared only if JC1_LITE is not set. * parse.y (yyparse, yylex, yyerror): No longer declared here. Now ! declared in parse.h. (java_layout_classes): New function. ! (java_complete_expand_methods): No longer layout the class here. * parse-scan.y: New file. * jv-scan.c: New file. *************** Thu Aug 20 14:24:47 1998 Per Bothner < *** 9081,9089 **** Wed Aug 19 17:57:07 1998 Warren Levy * decl.c (init_decl_processing): Use _Jv_NewObjectArray, not ! soft_anewarray; adjust args passed. * expr.c (build_anewarray): Adjust args for soft_anewarray_node to ! match _Jv_NewObjectArray. Wed Aug 19 09:33:23 1998 Alexandre Petit-Bianco --- 10950,10958 ---- Wed Aug 19 17:57:07 1998 Warren Levy * decl.c (init_decl_processing): Use _Jv_NewObjectArray, not ! soft_anewarray; adjust args passed. * expr.c (build_anewarray): Adjust args for soft_anewarray_node to ! match _Jv_NewObjectArray. Wed Aug 19 09:33:23 1998 Alexandre Petit-Bianco *************** Wed Aug 19 09:33:23 1998 Alexandre Peti *** 9091,9171 **** * expr.c (loopup_label): Call create_label_decl. (create_label_decl): New function. (java_lang_expand_expr): Call expand_start_bindings with argument ! set to zero. * java-tree.h Added space after PROTO in function declarations ! when necessary. (IS_FOR_LOOP_P, IS_BREAK_STMT_P): New macros. (create_label_decl, push_labeled_block): New function ! declarations. * lex.c (label_id): Initialize. (SUPER_TK, THIS_TK, RETURN_TK): Merged common actions in final ! switch. * parse.h Added space after PROTO in function declarations when ! necessary. (LOOP_EXPR_BODY_MAIN_BLOCK, LOOP_EXPR_BODY_UPDATE_BLOCK, ! LOOP_EXPR_BODY_CONDITION_EXPR, LOOP_EXPR_BODY_LABELED_BODY, ! LOOP_EXPR_BODY_BODY_EXPR, LOOP_HAS_LABEL_P, LOOP_HAS_LABEL_SKIP_P, ! PUSH_LABELED_BLOCK, POP_LABELED_BLOCK, PUSH_LOOP, POP_LOOP): New ! macros. (struct parser_ctxt): New fields current_loop, ! current_labeled_block. (build_if_else_statement, patch_if_else_statement, ! add_stmt_to_compound, patch_exit_expr, build_labeled_block, ! generate_labeled_block, complete_labeled_statement, ! build_bc_statement, patch_bc_statement, patch_loop_statement, ! build_new_loop, build_loop_body, complete_loop_body): New function ! declarations. * parse.y (java_warning_count): New global variable. (label_id): New static variable. (BREAK_TK, CONTINUE_TK): Token tagged . (block:): Return size_zero_node when block is empty. (empty_statement:): Return size_zero_node. (statement:): Implement supplemental action when for_statement: is ! reduced. (label_decl:): New rule. (labeled_statement:): Rewritten using label_decl. Actions ! implemented. (labeled_statement_nsi:): Likewise. (if_then_statement): Actions implemented. (while_expression): New rule. (while_statement:): Rewritten using while_expression. Actions ! implemented. (while_statement_nsi:): Likewise. (do_statement_begin:): New rule. (do_statement:): Rewritten using do_statement_begin. Actions ! implemented. (for_statement:): Rewritten using for_begin. Actions implemented. (for_statement_nsi:): Likewise. (for_header:, for_begin:): New rules. (for_init:): Actions implemented. (statement_expression_list:, break_statement:, ! continue_statement:): Likewise. (yyerror): Count number of issued warning(s). (java_report_errors): Report error(s) and/or warning(s). (java_complete_class): Use build_java_argument_signature to ! recompute completed method signature. (java_check_regular_methods): New locals method_wfl and aflags. ! Use method_wfl instead of lookup_cl during error reports. Fixed ! indentation and modified some error messages. Use ! lang_printable_name in method instead of the DECL_NAME. New code ! to issue warnings on methods not overriding corresponding methods ! private to a different package. (java_method_add_stmt): Call add_stmt_to_compound. (add_stmt_to_compound): New function. (java_complete_tree): Handle LABELED_BLOCK_EXPR, EXIT_BLOCK_EXPR, ! LOOP_EXPR, EXIT_EXPR and COND_EXPR. (build_if_else_statement, patch_if_else_statement, ! build_labeled_block, generate_labeled_block, ! complete_labeled_statement, build_new_loop, build_loop_body, ! complete_loop_body, patch_loop_statement, build_bc_statement, ! patch_bc_statement, patch_exit_expr): New functions. * typeck.c (build_java_signature): Build argument signature before ! enclosing it in between parenthesis. Mon Aug 17 17:44:24 1998 Warren Levy * Make-lang.in (JAVA_SRCS): Created for dependencies * Makefile.in ! (JAVA_OBJS): Added reminder comment Thu Aug 13 10:01:45 1998 Nick Clifton --- 10960,11040 ---- * expr.c (loopup_label): Call create_label_decl. (create_label_decl): New function. (java_lang_expand_expr): Call expand_start_bindings with argument ! set to zero. * java-tree.h Added space after PROTO in function declarations ! when necessary. (IS_FOR_LOOP_P, IS_BREAK_STMT_P): New macros. (create_label_decl, push_labeled_block): New function ! declarations. * lex.c (label_id): Initialize. (SUPER_TK, THIS_TK, RETURN_TK): Merged common actions in final ! switch. * parse.h Added space after PROTO in function declarations when ! necessary. (LOOP_EXPR_BODY_MAIN_BLOCK, LOOP_EXPR_BODY_UPDATE_BLOCK, ! LOOP_EXPR_BODY_CONDITION_EXPR, LOOP_EXPR_BODY_LABELED_BODY, ! LOOP_EXPR_BODY_BODY_EXPR, LOOP_HAS_LABEL_P, LOOP_HAS_LABEL_SKIP_P, ! PUSH_LABELED_BLOCK, POP_LABELED_BLOCK, PUSH_LOOP, POP_LOOP): New ! macros. (struct parser_ctxt): New fields current_loop, ! current_labeled_block. (build_if_else_statement, patch_if_else_statement, ! add_stmt_to_compound, patch_exit_expr, build_labeled_block, ! generate_labeled_block, complete_labeled_statement, ! build_bc_statement, patch_bc_statement, patch_loop_statement, ! build_new_loop, build_loop_body, complete_loop_body): New function ! declarations. * parse.y (java_warning_count): New global variable. (label_id): New static variable. (BREAK_TK, CONTINUE_TK): Token tagged . (block:): Return size_zero_node when block is empty. (empty_statement:): Return size_zero_node. (statement:): Implement supplemental action when for_statement: is ! reduced. (label_decl:): New rule. (labeled_statement:): Rewritten using label_decl. Actions ! implemented. (labeled_statement_nsi:): Likewise. (if_then_statement): Actions implemented. (while_expression): New rule. (while_statement:): Rewritten using while_expression. Actions ! implemented. (while_statement_nsi:): Likewise. (do_statement_begin:): New rule. (do_statement:): Rewritten using do_statement_begin. Actions ! implemented. (for_statement:): Rewritten using for_begin. Actions implemented. (for_statement_nsi:): Likewise. (for_header:, for_begin:): New rules. (for_init:): Actions implemented. (statement_expression_list:, break_statement:, ! continue_statement:): Likewise. (yyerror): Count number of issued warning(s). (java_report_errors): Report error(s) and/or warning(s). (java_complete_class): Use build_java_argument_signature to ! recompute completed method signature. (java_check_regular_methods): New locals method_wfl and aflags. ! Use method_wfl instead of lookup_cl during error reports. Fixed ! indentation and modified some error messages. Use ! lang_printable_name in method instead of the DECL_NAME. New code ! to issue warnings on methods not overriding corresponding methods ! private to a different package. (java_method_add_stmt): Call add_stmt_to_compound. (add_stmt_to_compound): New function. (java_complete_tree): Handle LABELED_BLOCK_EXPR, EXIT_BLOCK_EXPR, ! LOOP_EXPR, EXIT_EXPR and COND_EXPR. (build_if_else_statement, patch_if_else_statement, ! build_labeled_block, generate_labeled_block, ! complete_labeled_statement, build_new_loop, build_loop_body, ! complete_loop_body, patch_loop_statement, build_bc_statement, ! patch_bc_statement, patch_exit_expr): New functions. * typeck.c (build_java_signature): Build argument signature before ! enclosing it in between parenthesis. Mon Aug 17 17:44:24 1998 Warren Levy * Make-lang.in (JAVA_SRCS): Created for dependencies * Makefile.in ! (JAVA_OBJS): Added reminder comment Thu Aug 13 10:01:45 1998 Nick Clifton *************** Thu Aug 13 10:01:45 1998 Nick Clifton *** 9175,9185 **** Thu Aug 13 14:34:07 1998 Warren Levy * decl.c (init_decl_processing): Use _Jv_InitClass, not ! soft_initialise_class. Use _Jv_NewMultiArray, not ! soft_multianewarray. Use _Jv_ThrowBadArrayIndex, not ! soft_badarrayindex. Use _Jv_CheckCast, not soft_checkcast. Use ! _Jv_CheckArrayStore, not soft_checkarraystore. Use ! _Jv_LookupInterfaceMethod, not soft_lookupinterfacemethod. Wed Aug 12 14:23:13 1998 Per Bothner --- 11044,11054 ---- Thu Aug 13 14:34:07 1998 Warren Levy * decl.c (init_decl_processing): Use _Jv_InitClass, not ! soft_initialise_class. Use _Jv_NewMultiArray, not ! soft_multianewarray. Use _Jv_ThrowBadArrayIndex, not ! soft_badarrayindex. Use _Jv_CheckCast, not soft_checkcast. Use ! _Jv_CheckArrayStore, not soft_checkarraystore. Use ! _Jv_LookupInterfaceMethod, not soft_lookupinterfacemethod. Wed Aug 12 14:23:13 1998 Per Bothner *************** Wed Jul 29 13:19:03 1998 Alexandre Peti *** 9239,9283 **** * lex.c (java_init_lex): Initialize ctxp->package. * parse.h (struct parser_ctxt): package and package_len replaced ! by tree package, an identifier node. Field method_decl_list is ! gone. Fixed comments. (lookup_field_wrapper, merge_qualified_name, not_accessible, ! class_in_current_package): New function prototypes. * parse.y (array_type:): Set class loaded flag on primitive type ! arrays. (package_declaration:): Assign ctxp->package to the ! identifier node. (method_invocation:): Handle invocation of method qualified by ! `super'. (single_type_import_declaration:): Removed ambiguity check. (java_pop_parser_context): New local variable `next'. Reset and ! set IMPORT_CLASSFILE_NAME flags on current and previous import ! list. (java_accstring_lookup): Use new local macro COPY_RETURN. (lookup_field_wrapper): New function. (parser_qualified_classname): Use merge_qualified_name. (parser_check_super_interface): Broaden error message. (do_resolve_class): Check for qualified class name in the current ! compilation unit if appropriate. (process_imports): Check for already defined classes. (check_pkg_class_access): Got rid of call to ! get_access_flags_from_decl. (java_complete_expand_methods): Call safe_layout_class based on ! the current class size. (make_qualified_primary): Build a WFL qualification on primary if ! none exists. (merge_qualified_name): New function. (make_qualified_name): Use merge_qualified_name. (resolve_expression_name): Use safe_lookup_field. (resolve_field_access): Got rid of call to get_access_flags_from_decl. (resolve_qualified_expression_name): Likewise. Check on resolved ! element accessibility. (not_accessible_p, class_in_current_package): New functions. (maybe_access_field): Got rid of call to get_access_flags_from_decl. (patch_method_invocation_stmt): Merged common pieces. Check ! accessibility of invoked method. (check_for_static_method_reference): Add returned type in error ! message. (invocation_mode): Get rid of bogus check on PRIVATE methods. (refine_accessible_methods_list): Merged two conditions in test. (java_complete_class): Sanity check on stabilize_ref gone. --- 11108,11152 ---- * lex.c (java_init_lex): Initialize ctxp->package. * parse.h (struct parser_ctxt): package and package_len replaced ! by tree package, an identifier node. Field method_decl_list is ! gone. Fixed comments. (lookup_field_wrapper, merge_qualified_name, not_accessible, ! class_in_current_package): New function prototypes. * parse.y (array_type:): Set class loaded flag on primitive type ! arrays. (package_declaration:): Assign ctxp->package to the ! identifier node. (method_invocation:): Handle invocation of method qualified by ! `super'. (single_type_import_declaration:): Removed ambiguity check. (java_pop_parser_context): New local variable `next'. Reset and ! set IMPORT_CLASSFILE_NAME flags on current and previous import ! list. (java_accstring_lookup): Use new local macro COPY_RETURN. (lookup_field_wrapper): New function. (parser_qualified_classname): Use merge_qualified_name. (parser_check_super_interface): Broaden error message. (do_resolve_class): Check for qualified class name in the current ! compilation unit if appropriate. (process_imports): Check for already defined classes. (check_pkg_class_access): Got rid of call to ! get_access_flags_from_decl. (java_complete_expand_methods): Call safe_layout_class based on ! the current class size. (make_qualified_primary): Build a WFL qualification on primary if ! none exists. (merge_qualified_name): New function. (make_qualified_name): Use merge_qualified_name. (resolve_expression_name): Use safe_lookup_field. (resolve_field_access): Got rid of call to get_access_flags_from_decl. (resolve_qualified_expression_name): Likewise. Check on resolved ! element accessibility. (not_accessible_p, class_in_current_package): New functions. (maybe_access_field): Got rid of call to get_access_flags_from_decl. (patch_method_invocation_stmt): Merged common pieces. Check ! accessibility of invoked method. (check_for_static_method_reference): Add returned type in error ! message. (invocation_mode): Get rid of bogus check on PRIVATE methods. (refine_accessible_methods_list): Merged two conditions in test. (java_complete_class): Sanity check on stabilize_ref gone. *************** Thu Jul 23 15:28:24 1998 Per Bothner < *** 9356,9362 **** Wed Jul 22 15:47:30 1998 Per Bothner * jcf-write.c: Write out LineNumberTable attribute in .class file. ! (linenumber_buffer, linenumber_ptr, linenumber_limit): New statics. (put_linenumber): New function. (generate_bytecode_insns, generate_classfile): Write line numbers. --- 11225,11231 ---- Wed Jul 22 15:47:30 1998 Per Bothner * jcf-write.c: Write out LineNumberTable attribute in .class file. ! (linenumber_buffer, linenumber_ptr, linenumber_limit): New statics. (put_linenumber): New function. (generate_bytecode_insns, generate_classfile): Write line numbers. *************** Wed Jul 22 14:39:00 1998 Alexandre Peti *** 9364,9449 **** * java-tree.h (CALL_EXPR_FROM_PRIMARY_P): Changed in PRIMARY_P. (lookup_name, build_known_method_ref, build_class_init, ! build_invokevirtual, invoke_build_dtable, match_java_method, ! build_field_ref, pushdecl_force_head, build_java_binop, ! binary_numeric_promotion, build_decl_no_layout, ! build_java_arrayaccess, build_newarray, build_anewarray, ! build_java_array_length_access, build_java_arraynull_check): New ! extern function prototypes. (JAVA_UNARY_PLUS_EXPR, JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, ! JAVA_THIS_EXPR, CALL_CONSTRUCTOR_P): Macro definition moved in ! java-tree.h. * jcf-parse.c (init_outgoing_cpool): Set current_constant_pool_data_ref to NULL * jcf.h (jcf_out_of_synch): New extern function prototype. * parse.h: Static/global function implemented in parse.y ! prototyped and declarations moved at the end of the file. (DECL_P): Check that the argument isn't null. (JAVA_UNARY_PLUS_EXPR, JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, ! JAVA_THIS_EXPR): No longer defined here. See java-tree.h (QUAL_DECL_TYPE): New macro. (PARAMS): Macro definition removed. * parse.y: (yyparse, yyerror): Use PROTO instead of PARAMS. (return_statement:): Call build_return. (field_access:): Call make_qualified_primary in sub rule. (method_invocation:): Build method invocation and call ! make_qualified_primary when processing primaries. (java_complete_class): Set IDENTIFIER_SIGNATURE_TYPE by calling ! get_type_from_signature. (java_check_regular_method): Extra integer 0 argument when calling ! lookup_java_method2. (lookup_java_interface_method2): Extra method DECL argument when ! calling lookup_java_interface_method2. (java_method_add_stmt): Set TREE_SIDE_EFFECTS on newly created ! COMPOUND_EXPR node. (java_complete_expand_method): Layout current class iff not ! already done. Don't process interface's methods. (java_complete_expand_method): Use super class only if it ! exists. Use current class otherwise. (make_qualified_primary): New function. (resolve_expression_name): Process qualified expression or ! expression from primary the same way. (resolve_expression_name): Two last arguments to ! resolve_field_access are now NULL_TREEs. (resolve_field_access): New variable is_static. Local field must ! be DECLs. is_static computed on field DECLs only. Append code in ! where_found to the field access if necessary. Use QUAL_DECL_TYPE ! to initialize field_type. (resolve_qualified_expression_name): New local variable, ! previous_call_static and is_static. Handle primaries with function ! calls, casts, array references and `this'. `super' now handled as ! `(super_class)this'. Use is_static to clarify boolean expressions. ! Added code to handle case where a proper handle is required to ! access a field. Use QUAL_DECL_TYPE where applicable. (maybe_access_field): New function. (patch_method_invocation_stmt): New arguments primary, where, ! is_static. Branch of the test on CALL_EXPR_FROM_PRIMARY_P ! deleted. Use `where' as a type to search from if specified. Check ! for static method reference where forbidden. Append primary or ! current_this to the argument list if not calling constructor nor ! static methods. (check_for_static_method_reference): New function. (patch_invoke): Layout the class on which new is done if ! necessary. (lookup_method_invoke): Changed format to report errors on ! methods. (qualify_ambiguous_name): New local variable this_found. Now ! handle things from primaries. Method call are considered ! expression names. (identical_subpath_p): NULL_TREE arguments to breakdown_qualified ! changed into NULLs. (not_initialized_as_it_should_p): Comply with the new DECL_P. (java_complete_tree): New case fo RETURN_EXPR. Process function ! call arguments in separate function. (complete_function_arguments): New function. (build_method_invocation): Don't use CALL_EXPR_FROM_PRIMARY_P ! anymore. (patch_assignment): Take the return function slot into account as ! a RHS. Distinguish assignment from a return. (valid_ref_assignconv_cast_p): Use build_java_argument_signature ! when checking methods in interfaces. (resolve_type_during_patch): NULL argument to unresolve_type_p ! instead of NULL_TREE. (patch_newarray): Fixed typo in comment. (buid_this): Build a WFL with `kw_this' instead of a FIELD_DECL. (build_return, patch_return): New functions. --- 11233,11318 ---- * java-tree.h (CALL_EXPR_FROM_PRIMARY_P): Changed in PRIMARY_P. (lookup_name, build_known_method_ref, build_class_init, ! build_invokevirtual, invoke_build_dtable, match_java_method, ! build_field_ref, pushdecl_force_head, build_java_binop, ! binary_numeric_promotion, build_decl_no_layout, ! build_java_arrayaccess, build_newarray, build_anewarray, ! build_java_array_length_access, build_java_arraynull_check): New ! extern function prototypes. (JAVA_UNARY_PLUS_EXPR, JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, ! JAVA_THIS_EXPR, CALL_CONSTRUCTOR_P): Macro definition moved in ! java-tree.h. * jcf-parse.c (init_outgoing_cpool): Set current_constant_pool_data_ref to NULL * jcf.h (jcf_out_of_synch): New extern function prototype. * parse.h: Static/global function implemented in parse.y ! prototyped and declarations moved at the end of the file. (DECL_P): Check that the argument isn't null. (JAVA_UNARY_PLUS_EXPR, JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, ! JAVA_THIS_EXPR): No longer defined here. See java-tree.h (QUAL_DECL_TYPE): New macro. (PARAMS): Macro definition removed. * parse.y: (yyparse, yyerror): Use PROTO instead of PARAMS. (return_statement:): Call build_return. (field_access:): Call make_qualified_primary in sub rule. (method_invocation:): Build method invocation and call ! make_qualified_primary when processing primaries. (java_complete_class): Set IDENTIFIER_SIGNATURE_TYPE by calling ! get_type_from_signature. (java_check_regular_method): Extra integer 0 argument when calling ! lookup_java_method2. (lookup_java_interface_method2): Extra method DECL argument when ! calling lookup_java_interface_method2. (java_method_add_stmt): Set TREE_SIDE_EFFECTS on newly created ! COMPOUND_EXPR node. (java_complete_expand_method): Layout current class iff not ! already done. Don't process interface's methods. (java_complete_expand_method): Use super class only if it ! exists. Use current class otherwise. (make_qualified_primary): New function. (resolve_expression_name): Process qualified expression or ! expression from primary the same way. (resolve_expression_name): Two last arguments to ! resolve_field_access are now NULL_TREEs. (resolve_field_access): New variable is_static. Local field must ! be DECLs. is_static computed on field DECLs only. Append code in ! where_found to the field access if necessary. Use QUAL_DECL_TYPE ! to initialize field_type. (resolve_qualified_expression_name): New local variable, ! previous_call_static and is_static. Handle primaries with function ! calls, casts, array references and `this'. `super' now handled as ! `(super_class)this'. Use is_static to clarify boolean expressions. ! Added code to handle case where a proper handle is required to ! access a field. Use QUAL_DECL_TYPE where applicable. (maybe_access_field): New function. (patch_method_invocation_stmt): New arguments primary, where, ! is_static. Branch of the test on CALL_EXPR_FROM_PRIMARY_P ! deleted. Use `where' as a type to search from if specified. Check ! for static method reference where forbidden. Append primary or ! current_this to the argument list if not calling constructor nor ! static methods. (check_for_static_method_reference): New function. (patch_invoke): Layout the class on which new is done if ! necessary. (lookup_method_invoke): Changed format to report errors on ! methods. (qualify_ambiguous_name): New local variable this_found. Now ! handle things from primaries. Method call are considered ! expression names. (identical_subpath_p): NULL_TREE arguments to breakdown_qualified ! changed into NULLs. (not_initialized_as_it_should_p): Comply with the new DECL_P. (java_complete_tree): New case fo RETURN_EXPR. Process function ! call arguments in separate function. (complete_function_arguments): New function. (build_method_invocation): Don't use CALL_EXPR_FROM_PRIMARY_P ! anymore. (patch_assignment): Take the return function slot into account as ! a RHS. Distinguish assignment from a return. (valid_ref_assignconv_cast_p): Use build_java_argument_signature ! when checking methods in interfaces. (resolve_type_during_patch): NULL argument to unresolve_type_p ! instead of NULL_TREE. (patch_newarray): Fixed typo in comment. (buid_this): Build a WFL with `kw_this' instead of a FIELD_DECL. (build_return, patch_return): New functions. *************** Tue Jul 21 12:10:04 1998 Per Bothner < *** 9458,9467 **** (expand_invoke): Rename call to build_invoke_non_interface. * java-tree.h, parse.h: Update prototype. * parse.y, decl.c, jcf-parse.c: Suppress calls to back-end functions ! (such as expand_expr_stmt) if flag_emit_class_files. * jcf-write.c (RESERVE, OP1, OP2, OP4, NOTE_PUSH, NOTE_POP, STACK_TARGET, IGNORE_TARGET): New macros. ! (code_buffer, code_ptr, code_limit, code_S, code_SP_max): New globals. (generate_bytecode_insn): New function to generate method's bytecode. (generate_classfile): Node generate Code attribute for a method. (code_buffer_grow, push_constant1, push_constant2, push_int_const, --- 11327,11336 ---- (expand_invoke): Rename call to build_invoke_non_interface. * java-tree.h, parse.h: Update prototype. * parse.y, decl.c, jcf-parse.c: Suppress calls to back-end functions ! (such as expand_expr_stmt) if flag_emit_class_files. * jcf-write.c (RESERVE, OP1, OP2, OP4, NOTE_PUSH, NOTE_POP, STACK_TARGET, IGNORE_TARGET): New macros. ! (code_buffer, code_ptr, code_limit, code_S, code_SP_max): New globals. (generate_bytecode_insn): New function to generate method's bytecode. (generate_classfile): Node generate Code attribute for a method. (code_buffer_grow, push_constant1, push_constant2, push_int_const, *************** Fri Jul 17 09:48:51 1998 Tom Tromey * class.c (layout_class): Call to java_layout_parsed_class replace ! by safe_layout_class. * expr.c (build_java_array_length_access): Removed static storage ! class in the function definition. (build_java_arraynull_check): Likewise. Also fixed typos in two comments. * lex.c (java_init_lex): Initialize static global kw_length. (java_lex): Use BUILD_OPERATOR on RETURN_TK. * lex.h (JAVA_FLOAT_RANGE_ERROR): Add extra argument to ! java_lex_error. (JAVA_INTEGRAL_RANGE_ERROR): Likewise. * parse.h (resolve_no_layout): New static function declaration. (get_identifier_in_static): Declaration removed. (java_layout_parsed_class): Function name declaration changed to ! safe_layout_class. (build_newarray_node, patch_newarray, resolve_type_during_patch, ! not_initialized_as_it_should_p, build_this): New static function ! declarations. (pushdecl_force_head, build_java_binop, int_fits_type_p, ! binary_numeric_promotion, stabilize_reference, ! build_decl_no_layout, build_java_arrayaccess): Extern function ! declarations moved into their own section. (build_newarray, build_anewarray, build_java_array_length_access, ! build_java_arraynull_check): New extern function declarations. (UNARY_PLUS_EXPR): Macro renamed into JAVA_UNARY_PLUS_EXPR. (JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, JAVA_THIS_EXPR): New ! fake tree codes. (CALL_CONSTRUCTOR_P): New macro. * parse.y (kw_length): New static global tree node. (return_statement): Tagged . (RETURN_TK): Tagged . (variable_declarator_id:): Build variable declaration with an ! empty initialization value if a syntax error was found in the ! initialization part of the variable declaration. (statement_without_trailing_substatement:): return_statement: now ! uses the default rule. (return_statement:): Temporarily fixed to return NULL_TREE. (primary_no_new_array:): Call build_this when THIS_TK was parsed. (class_instance_creation_expression:): Class creation rules now ! call build_method_invocation upon reduction. (array_creation_expression:): Rules call build_newarray_node upon ! reduction. (dim_exprs:): Build a list of dimension expressions. (dim_expr:): Store location of the OSB_TK in the dimension ! expression node. (method_invocation:): Added a new error rule. (build_unresolved_array_type): WFL argument may also be an array ! on a primitive type. Name of the argument changed to reflect this. (method_declarator): Insert argument type at the beginning of the ! argument type list and later reverse the list. (unresolved_type_p): Argument 'returned' may be optionally ! NULL_TREE. (java_layout_class_from_source): Function renamed ! safe_layout_class. (resolve_and_layout): Now call resolve_no_layout and ! safe_layout_class. (resolve_no_layout): New function. (purify_type_name): New function. (complete_class_report_errors): Call purify_type_name during error ! report on a type not found. (process_imports): error_found local variable doesn't need to be ! initialized to zero. (declare_local_variables): New local type_wfl. Fixed typo in error ! message. type_wfl assigned to unresolved type and used to register ! incomplete type. Build a WFL around the variable initialization ! statement so that debug info can be generated on it. (source_start_java_method): Reverse argument list after they've ! been processed. (current_this): New static global variable. (java_complete_expand_methods): Set current_this when appropriate. (resolve_expression_name): Build correct static and non static ! field access bearing a simple name. (resolve_field_access): Resolve the length field of arrays. Handle ! f.m() cases. (patch_method_invocation_stmt): Set the type of the method ! invocation to error_mark_node. This value is later overridden by a ! valid type, if any. Don't handle qualified constructor invocation ! as qualified method invocation. Call lookup_method_invoke with its ! new flag. It's no longer necessary to access the selected method ! as the value of a tree list. Handle constructor invocation. (patch_invoke): Reverse argument list when invoking non interface ! methods. Insert call to new as the first argument of the ! constructor. (invocation_mode): Return a INVOKE_STATIC is the invoked method is ! defined within a final class. Return INVOKE_STATIC if the invoked ! method is a constructor. (lookup_method_invoke): New lc argument is a flag to indicate a ! constructor lookup. Now handle constructor lookup. Choose the most ! specific method in case several were matching the invocation ! requirements. Return a method decl instead of a tree list featuring ! one single method decl element. (refine_accessible_methods_list): New lc flag argument to ! indicate that a constructor is being looked up. (not_initialized_as_it_should_p): New function. (java_complete_tree): Now process fake tree codes ! JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR and JAVA_THIS_EXPR. Call ! save_expr on resolved function call arguments. Case on ! UNARY_PLUS_EXPR changed into a case on JAVA_UNARY_PLUS_EXPR. (patch_assignment): LHS can be a field access expression. When ! dealing with reference, lhs_type is the promoted type of the ! rhs_type, not the RHS. Use not_initialized_as_it_should_p where ! applicable. (operator_string): JAVA_UNARY_PLUS_EXPR replaces UNARY_PLUS_EXPR. (patch_binop): Use not_initialized_as_it_should_p where ! applicable. (build_unaryop): JAVA_UNARY_PLUS_EXPR replaces UNARY_PLUS_EXPR. (patch_unaryop): Likewise. And use not_initialized_as_it_should_p ! where applicable. (resolve_type_during_patch): New function. (patch_cast): Call resolve_type_during_patch to resolve type and ! report error accordingly. (patch_array_ref): Use not_initialized_as_it_should_p where ! applicable. Array base expression is saved before being ! used. Promote the type of an array elements if it contains non ! builtin types. (build_newarray_node, patch_newarray, build_this): New functions. Thu Jul 16 10:46:47 1998 Tom Tromey --- 11355,11474 ---- Thu Jul 16 15:29:20 1998 Alexandre Petit-Bianco * class.c (layout_class): Call to java_layout_parsed_class replace ! by safe_layout_class. * expr.c (build_java_array_length_access): Removed static storage ! class in the function definition. (build_java_arraynull_check): Likewise. Also fixed typos in two comments. * lex.c (java_init_lex): Initialize static global kw_length. (java_lex): Use BUILD_OPERATOR on RETURN_TK. * lex.h (JAVA_FLOAT_RANGE_ERROR): Add extra argument to ! java_lex_error. (JAVA_INTEGRAL_RANGE_ERROR): Likewise. * parse.h (resolve_no_layout): New static function declaration. (get_identifier_in_static): Declaration removed. (java_layout_parsed_class): Function name declaration changed to ! safe_layout_class. (build_newarray_node, patch_newarray, resolve_type_during_patch, ! not_initialized_as_it_should_p, build_this): New static function ! declarations. (pushdecl_force_head, build_java_binop, int_fits_type_p, ! binary_numeric_promotion, stabilize_reference, ! build_decl_no_layout, build_java_arrayaccess): Extern function ! declarations moved into their own section. (build_newarray, build_anewarray, build_java_array_length_access, ! build_java_arraynull_check): New extern function declarations. (UNARY_PLUS_EXPR): Macro renamed into JAVA_UNARY_PLUS_EXPR. (JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR, JAVA_THIS_EXPR): New ! fake tree codes. (CALL_CONSTRUCTOR_P): New macro. * parse.y (kw_length): New static global tree node. (return_statement): Tagged . (RETURN_TK): Tagged . (variable_declarator_id:): Build variable declaration with an ! empty initialization value if a syntax error was found in the ! initialization part of the variable declaration. (statement_without_trailing_substatement:): return_statement: now ! uses the default rule. (return_statement:): Temporarily fixed to return NULL_TREE. (primary_no_new_array:): Call build_this when THIS_TK was parsed. (class_instance_creation_expression:): Class creation rules now ! call build_method_invocation upon reduction. (array_creation_expression:): Rules call build_newarray_node upon ! reduction. (dim_exprs:): Build a list of dimension expressions. (dim_expr:): Store location of the OSB_TK in the dimension ! expression node. (method_invocation:): Added a new error rule. (build_unresolved_array_type): WFL argument may also be an array ! on a primitive type. Name of the argument changed to reflect this. (method_declarator): Insert argument type at the beginning of the ! argument type list and later reverse the list. (unresolved_type_p): Argument 'returned' may be optionally ! NULL_TREE. (java_layout_class_from_source): Function renamed ! safe_layout_class. (resolve_and_layout): Now call resolve_no_layout and ! safe_layout_class. (resolve_no_layout): New function. (purify_type_name): New function. (complete_class_report_errors): Call purify_type_name during error ! report on a type not found. (process_imports): error_found local variable doesn't need to be ! initialized to zero. (declare_local_variables): New local type_wfl. Fixed typo in error ! message. type_wfl assigned to unresolved type and used to register ! incomplete type. Build a WFL around the variable initialization ! statement so that debug info can be generated on it. (source_start_java_method): Reverse argument list after they've ! been processed. (current_this): New static global variable. (java_complete_expand_methods): Set current_this when appropriate. (resolve_expression_name): Build correct static and non static ! field access bearing a simple name. (resolve_field_access): Resolve the length field of arrays. Handle ! f.m() cases. (patch_method_invocation_stmt): Set the type of the method ! invocation to error_mark_node. This value is later overridden by a ! valid type, if any. Don't handle qualified constructor invocation ! as qualified method invocation. Call lookup_method_invoke with its ! new flag. It's no longer necessary to access the selected method ! as the value of a tree list. Handle constructor invocation. (patch_invoke): Reverse argument list when invoking non interface ! methods. Insert call to new as the first argument of the ! constructor. (invocation_mode): Return a INVOKE_STATIC is the invoked method is ! defined within a final class. Return INVOKE_STATIC if the invoked ! method is a constructor. (lookup_method_invoke): New lc argument is a flag to indicate a ! constructor lookup. Now handle constructor lookup. Choose the most ! specific method in case several were matching the invocation ! requirements. Return a method decl instead of a tree list featuring ! one single method decl element. (refine_accessible_methods_list): New lc flag argument to ! indicate that a constructor is being looked up. (not_initialized_as_it_should_p): New function. (java_complete_tree): Now process fake tree codes ! JAVA_NEW_ARRAY_EXPR, JAVA_NEW_CLASS_EXPR and JAVA_THIS_EXPR. Call ! save_expr on resolved function call arguments. Case on ! UNARY_PLUS_EXPR changed into a case on JAVA_UNARY_PLUS_EXPR. (patch_assignment): LHS can be a field access expression. When ! dealing with reference, lhs_type is the promoted type of the ! rhs_type, not the RHS. Use not_initialized_as_it_should_p where ! applicable. (operator_string): JAVA_UNARY_PLUS_EXPR replaces UNARY_PLUS_EXPR. (patch_binop): Use not_initialized_as_it_should_p where ! applicable. (build_unaryop): JAVA_UNARY_PLUS_EXPR replaces UNARY_PLUS_EXPR. (patch_unaryop): Likewise. And use not_initialized_as_it_should_p ! where applicable. (resolve_type_during_patch): New function. (patch_cast): Call resolve_type_during_patch to resolve type and ! report error accordingly. (patch_array_ref): Use not_initialized_as_it_should_p where ! applicable. Array base expression is saved before being ! used. Promote the type of an array elements if it contains non ! builtin types. (build_newarray_node, patch_newarray, build_this): New functions. Thu Jul 16 10:46:47 1998 Tom Tromey *************** Wed Jul 8 03:01:32 1998 Jeffrey A Law *** 9672,9690 **** Tue Jul 7 12:56:48 1998 Alexandre Petit-Bianco * lex.c (java_lex): Return 0 when we see an invalid character in ! the input. * lex.c (java_read_char): Specify extra argument when calling ! java_lex_error. (java_read_unicode, java_parse_end_comment, ! java_parse_escape_sequence): Likewise, (java_lex): Specify extra argument when calling ! java_lex_error. Test that IDs are beginning with a legal character ! for IDs. Handle invalid characters with an error message and a ! call to java_lex_error. (java_lex_error): Adjust column position by new argument ! `forward'. Issue an error even if in the middle of reporting an ! other error. 1998-07-07 Brendan Kehoe --- 11541,11559 ---- Tue Jul 7 12:56:48 1998 Alexandre Petit-Bianco * lex.c (java_lex): Return 0 when we see an invalid character in ! the input. * lex.c (java_read_char): Specify extra argument when calling ! java_lex_error. (java_read_unicode, java_parse_end_comment, ! java_parse_escape_sequence): Likewise, (java_lex): Specify extra argument when calling ! java_lex_error. Test that IDs are beginning with a legal character ! for IDs. Handle invalid characters with an error message and a ! call to java_lex_error. (java_lex_error): Adjust column position by new argument ! `forward'. Issue an error even if in the middle of reporting an ! other error. 1998-07-07 Brendan Kehoe *************** Tue Jul 7 09:38:38 1998 Tom Tromey * Makefile.in (JAVABISONFLAGS): Specific flag for bison when ! processing the jc1 grammar file. Prefix bison functions and ! variables with java_. (parse.c): Dependencies on parse.h and lex.h * expr.c (build_java_arrayaccess): Function now global. * java-tree.h: Comment reorganized to carry on previous ! classification effort. (RESOLVE_EXPRESSION_NAME_P, RESOLVE_PACKAGE_NAME_P, ! RESOLVE_TYPE_NAME_P): New flags on WFLs. * jcf-parse.c (parse_source_file): java_parse_source_file renamed ! java_parse (new prefix java_ generated by bison). (java_layout_parsed_class, java_register_parsed_class): Function ! call removed. (yyparse): Removed unnecessary call to init_outgoing_cpool. * lex.c (static tree wfl_op): Variable deleted. (java_init_lex): Initialize kw_super and kw_this. Initialize more ! ctxp fields to NULL_TREE. (java_lex): No longer create WFL for operators. Filename caching ! mechanism deleted. Call BUILD_OPERATOR for `.', '(', '['. Strings ! created as STRING_CST and later expanded. Removed extra argument ! to BUILD_OPERATOR and BUILD_OPERATOR2. Build operators for THIS ! and SUPER. (build_wfl_node): Removed code in comments. * lex.h (BUILD_OPERATOR, BUILD_OPERATOR2): No longer build a WFL but ! store token and location data in the current bison token. * parse.h: Removed pre-processor based symbol prefixes hack. Moved ! static/extern function declaration at the beginning of the file. (struct qualification): Data structure definition deleted. (RESOLVE_CHAIN_REMAINDER): Macro definition deleted. (qualify_ambiguous_name): Function declaration modified. Function ! now returns nothing. (build_array_ref, patch_array_ref, make_qualified_name, ! resolve_qualified_expression_name, maybe_generate_clinit, ! resolve_field_access): New static function declarations. (build_java_arrayaccess): New extern function declaration. (enum { RESOLVE_EXPRESION_NAME...}): Enum deleted. (CALL_EXPR_PRIMARY): Macro deleted. (EXPR_WFL_QUALIFICATION, QUAL_WFL, QUAL_RESOLUTION): New macros. (struct parser_ctxt): Field initialized_final ! removed. non_static_initialized, static_initialized: New fields. * parse.y (static tree kw_super, static tree kw_this): New global ! static. (%union): tree wfl field of operator member replaced by int ! location. WFLs are non longer created for operators. (OSB_TK, DOT_TK, THIS_TK, SUPER_TK): Tagged . (qualified_name:): Now calls make_qualified_name to build the ! identifier. (type_declaration:): Consider generating when class ! parsing completed. (variable_declarator:): Directly build an assignment node when the ! variable is initialized when declared. (this_or_super:): Build a WFL and set current location when THIS ! or SUPER are parsed. (expression_statement:): Wrap statement around a WFL. (primary_no_new_array:): Fixed typo. Changed value returned by ! THIS_TK because of its new type (temporary). (dim_exprs:): Temporary fix because of OSB_TK's new type. (field_access:): Build qualified name with SUPER. (method_invocation:): Fixed returned value because of SUPER's new ! type. (array_access:): Use OSB_TK location information. (post_increment_expression:, post_decrement_expression:, ! unary_expression:, pre_increment_expression:, ! pre_decrement_expression:, unary_expression_not_plus_minus:, ! cast_expression:, multiplicative_expression:, ! additive_expression:, shift_expression:, relational_expression:, ! equality_expression:, and_expression:, exclusive_or_expression:, ! inclusive_or_expression:, conditional_and_expression:, ! conditional_or_expression:, assignment:): Use new location/token ! information available on operators. (create_class): Set super_decl_type to NULL_TREE when processing ! java.lang.Object. (register_fields): Field initialization is now a MODIFY_EXPR ! node. Chain initialization code to the matching lists (according ! the the field declaration modifiers). (maybe_generate_clinit): New function. (method_header): Don't set method's DECL_NAME to a WFL when adding ! methods to java.lang.Object. (resolve_and_layout): Now can return NULL_TREE if the type ! resolution fails. Otherwise, return the class DECL instead of its ! TYPE. (check_method_redefinition): Don't patch method DECL_NAME if it ! belongs to java.lang.Object. (process_imports): Simply assign error_found to the value returned ! by check_pkg_class_access. (declare_local_variables): Don't use their init statements (if ! any) when parsing error were previously found. Reuse MODIFY_EXPR ! build during parsing as an init statement. (java_method_add_stmt): Now return the current method body. (java_layout_parsed_class, java_register_parsed_class): Functions ! removed. (java_complete_expand_methods): Initialize the constant pool on a ! per class basis. Layout the classes before expanding their method ! bodies. Don't try expand artificial constructor code if error were ! found. Make the classes data and register them if no error were ! found. (java_complete_expand_method): Retrieve an artificial constructor ! argument list before entering its body. Assign the top block to ! the artificial constructor function body and set types of declared ! blocks and compound statements to void. Walk method body if not an ! artificial constructor. (make_qualified_name, cut_identifier_in_qualified): New functions. (resolve_expression_name): Fixed comments. Save/restore the ! current class CLASS_LOADED_P flag value. Build non qualified ! static field access and handle qualified expression names. (resolve_field_access, resolve_qualified_expression_name): New ! functions. (patch_method_invocation_stmt): Use the new expression resolution ! scheme, calling resolve_field_access when the function call is ! resolved as an expression. (qualify_ambiguous_name): Function rewritten to work on qualified ! expression produced by make_qualified_name. (java_complete_tree): Promote type when function's argument are ! RECORD_TYPEs. While processing the MODIFY_EXPR case: don't patch ! the assignment to discover further errors if RHS is a expression ! name that fails to evaluate. Declare LHS initialized even though ! the assignment failed. Don't use the location variable and removed ! extra argument in patch function calls. Now handle the ARRAY_REF ! case and build internal string representation when STRING_CSTs are ! walked. (build_method_invocation): Don't wrap function call around a WFL. (build_assignment): Likewise. Use the operator location ! information. (patch_assignment): Handle array access LHSs. Handle error ! provenance, resulting in a better error report. (build_binop): Use op_location from operator as binop location ! information. (build_unaryop, build_incdec, build_cast): Likewise. (patch_binop): Extract location information from the node. Fixed ! typo in error message. (patch_unary_op): Extract location information from the node. (build_array_ref, patch_array_ref): New functions. --- 11588,11722 ---- Thu Jul 2 16:53:16 1998 Alexandre Petit-Bianco * Makefile.in (JAVABISONFLAGS): Specific flag for bison when ! processing the jc1 grammar file. Prefix bison functions and ! variables with java_. (parse.c): Dependencies on parse.h and lex.h * expr.c (build_java_arrayaccess): Function now global. * java-tree.h: Comment reorganized to carry on previous ! classification effort. (RESOLVE_EXPRESSION_NAME_P, RESOLVE_PACKAGE_NAME_P, ! RESOLVE_TYPE_NAME_P): New flags on WFLs. * jcf-parse.c (parse_source_file): java_parse_source_file renamed ! java_parse (new prefix java_ generated by bison). (java_layout_parsed_class, java_register_parsed_class): Function ! call removed. (yyparse): Removed unnecessary call to init_outgoing_cpool. * lex.c (static tree wfl_op): Variable deleted. (java_init_lex): Initialize kw_super and kw_this. Initialize more ! ctxp fields to NULL_TREE. (java_lex): No longer create WFL for operators. Filename caching ! mechanism deleted. Call BUILD_OPERATOR for `.', '(', '['. Strings ! created as STRING_CST and later expanded. Removed extra argument ! to BUILD_OPERATOR and BUILD_OPERATOR2. Build operators for THIS ! and SUPER. (build_wfl_node): Removed code in comments. * lex.h (BUILD_OPERATOR, BUILD_OPERATOR2): No longer build a WFL but ! store token and location data in the current bison token. * parse.h: Removed pre-processor based symbol prefixes hack. Moved ! static/extern function declaration at the beginning of the file. (struct qualification): Data structure definition deleted. (RESOLVE_CHAIN_REMAINDER): Macro definition deleted. (qualify_ambiguous_name): Function declaration modified. Function ! now returns nothing. (build_array_ref, patch_array_ref, make_qualified_name, ! resolve_qualified_expression_name, maybe_generate_clinit, ! resolve_field_access): New static function declarations. (build_java_arrayaccess): New extern function declaration. (enum { RESOLVE_EXPRESION_NAME...}): Enum deleted. (CALL_EXPR_PRIMARY): Macro deleted. (EXPR_WFL_QUALIFICATION, QUAL_WFL, QUAL_RESOLUTION): New macros. (struct parser_ctxt): Field initialized_final ! removed. non_static_initialized, static_initialized: New fields. * parse.y (static tree kw_super, static tree kw_this): New global ! static. (%union): tree wfl field of operator member replaced by int ! location. WFLs are non longer created for operators. (OSB_TK, DOT_TK, THIS_TK, SUPER_TK): Tagged . (qualified_name:): Now calls make_qualified_name to build the ! identifier. (type_declaration:): Consider generating when class ! parsing completed. (variable_declarator:): Directly build an assignment node when the ! variable is initialized when declared. (this_or_super:): Build a WFL and set current location when THIS ! or SUPER are parsed. (expression_statement:): Wrap statement around a WFL. (primary_no_new_array:): Fixed typo. Changed value returned by ! THIS_TK because of its new type (temporary). (dim_exprs:): Temporary fix because of OSB_TK's new type. (field_access:): Build qualified name with SUPER. (method_invocation:): Fixed returned value because of SUPER's new ! type. (array_access:): Use OSB_TK location information. (post_increment_expression:, post_decrement_expression:, ! unary_expression:, pre_increment_expression:, ! pre_decrement_expression:, unary_expression_not_plus_minus:, ! cast_expression:, multiplicative_expression:, ! additive_expression:, shift_expression:, relational_expression:, ! equality_expression:, and_expression:, exclusive_or_expression:, ! inclusive_or_expression:, conditional_and_expression:, ! conditional_or_expression:, assignment:): Use new location/token ! information available on operators. (create_class): Set super_decl_type to NULL_TREE when processing ! java.lang.Object. (register_fields): Field initialization is now a MODIFY_EXPR ! node. Chain initialization code to the matching lists (according ! the the field declaration modifiers). (maybe_generate_clinit): New function. (method_header): Don't set method's DECL_NAME to a WFL when adding ! methods to java.lang.Object. (resolve_and_layout): Now can return NULL_TREE if the type ! resolution fails. Otherwise, return the class DECL instead of its ! TYPE. (check_method_redefinition): Don't patch method DECL_NAME if it ! belongs to java.lang.Object. (process_imports): Simply assign error_found to the value returned ! by check_pkg_class_access. (declare_local_variables): Don't use their init statements (if ! any) when parsing error were previously found. Reuse MODIFY_EXPR ! build during parsing as an init statement. (java_method_add_stmt): Now return the current method body. (java_layout_parsed_class, java_register_parsed_class): Functions ! removed. (java_complete_expand_methods): Initialize the constant pool on a ! per class basis. Layout the classes before expanding their method ! bodies. Don't try expand artificial constructor code if error were ! found. Make the classes data and register them if no error were ! found. (java_complete_expand_method): Retrieve an artificial constructor ! argument list before entering its body. Assign the top block to ! the artificial constructor function body and set types of declared ! blocks and compound statements to void. Walk method body if not an ! artificial constructor. (make_qualified_name, cut_identifier_in_qualified): New functions. (resolve_expression_name): Fixed comments. Save/restore the ! current class CLASS_LOADED_P flag value. Build non qualified ! static field access and handle qualified expression names. (resolve_field_access, resolve_qualified_expression_name): New ! functions. (patch_method_invocation_stmt): Use the new expression resolution ! scheme, calling resolve_field_access when the function call is ! resolved as an expression. (qualify_ambiguous_name): Function rewritten to work on qualified ! expression produced by make_qualified_name. (java_complete_tree): Promote type when function's argument are ! RECORD_TYPEs. While processing the MODIFY_EXPR case: don't patch ! the assignment to discover further errors if RHS is a expression ! name that fails to evaluate. Declare LHS initialized even though ! the assignment failed. Don't use the location variable and removed ! extra argument in patch function calls. Now handle the ARRAY_REF ! case and build internal string representation when STRING_CSTs are ! walked. (build_method_invocation): Don't wrap function call around a WFL. (build_assignment): Likewise. Use the operator location ! information. (patch_assignment): Handle array access LHSs. Handle error ! provenance, resulting in a better error report. (build_binop): Use op_location from operator as binop location ! information. (build_unaryop, build_incdec, build_cast): Likewise. (patch_binop): Extract location information from the node. Fixed ! typo in error message. (patch_unary_op): Extract location information from the node. (build_array_ref, patch_array_ref): New functions. *************** Tue Jun 30 14:12:54 1998 Tom Tromey * java-tree.h (load_class): Add prototype. ! * class.c (is_compiled_class): Add missing arg to load_class. * expr.c (expand_java_NEW): Call load_class. * parse.y (process_import): Removed bogus use of void return value. --- 11735,11741 ---- Mon Jun 29 14:47:10 1998 Per Bothner * java-tree.h (load_class): Add prototype. ! * class.c (is_compiled_class): Add missing arg to load_class. * expr.c (expand_java_NEW): Call load_class. * parse.y (process_import): Removed bogus use of void return value. *************** Fri Jun 12 11:31:24 1998 Per Bothner < *** 9942,9951 **** find_utf8_constant, find_class_or_string_constant): New functions. * jcf-parse.c (load_class): Don't save/restore tree-constant_pool. ! (get_constant): Use current_jcf.cpool instead of tree_constant_pool. (give_name_to_class, get_class_constant): Likewise. * jcf-parse.c, java-tree.h (tree_constant_pool): Removed. ! (get_name_and_type_constant, get_ref_constant): Removed. * parse.h (parser_ctxt): Remove field tree_constant_pool. * parse.y: Don't save/restore tree_constant_pool. * verify.c (verify_jvm_instructions): Update for new approach. --- 11811,11820 ---- find_utf8_constant, find_class_or_string_constant): New functions. * jcf-parse.c (load_class): Don't save/restore tree-constant_pool. ! (get_constant): Use current_jcf.cpool instead of tree_constant_pool. (give_name_to_class, get_class_constant): Likewise. * jcf-parse.c, java-tree.h (tree_constant_pool): Removed. ! (get_name_and_type_constant, get_ref_constant): Removed. * parse.h (parser_ctxt): Remove field tree_constant_pool. * parse.y: Don't save/restore tree_constant_pool. * verify.c (verify_jvm_instructions): Update for new approach. *************** Fri Jun 12 11:31:24 1998 Per Bothner < *** 9963,9971 **** Wed Jun 10 17:34:42 1998 Alexandre Petit-Bianco * parse.h: New comment on the handling of unresolved type ! identifiers. JDEPs are now part of the jdep_code enum. (typedef struct jdep): Now use enum jdep_code or int, depending on ! availability. Both are narrowed down to an 8 bits bitfield. (CALL_EXPR_PRIMARY): Fixed comment. Wed Jun 10 10:54:39 1998 Tom Tromey --- 11832,11840 ---- Wed Jun 10 17:34:42 1998 Alexandre Petit-Bianco * parse.h: New comment on the handling of unresolved type ! identifiers. JDEPs are now part of the jdep_code enum. (typedef struct jdep): Now use enum jdep_code or int, depending on ! availability. Both are narrowed down to an 8 bits bitfield. (CALL_EXPR_PRIMARY): Fixed comment. Wed Jun 10 10:54:39 1998 Tom Tromey *************** Tue Jun 9 18:12:46 1998 Alexandre Peti *** 9992,10064 **** * ChangeLog: Fixed entries not compliant with the Gnu Coding Standard. * decl.c (build_decl_no_layout): New function. * expr.c (java_lang_expand_expr): Layout declarations found in ! blocks before they're pushed. * jcf-parse.c (load_class): Save current line when parsing class ! file. (parse_source_file): Register class before expanding their ! methods. * lang.c (put_decl_node): Produce `null' when `void *' is ! processed. * lex.c (static tree wfl_op): New static global, for error report ! on casts. (java_init_lex): wfl_operator and wfl_op initialized ! here. Filename caching added for wfl_op. Return wfl_op when `(' is ! parsed. * parse.h (build_unaryop, build_incdec, patch_unaryop, build_cast, ! patch_cast, valid_ref_assignconv_cast_p, can_cast_to_p, ! build_unresolved_array_type): New static function definitions. (build_decl_no_layout): New extern function declared. (OBSOLETE_MODIFIER_WARNING): Report error only if the WFL of the ! faulty modifier exists. (TYPE_INTERFACE_P, TYPE_CLASS_P): New macros. (ERROR_CAST_NEEDED_TO_INTEGRAL): Error message tuned. (UNARY_PLUS_EXPR): New fake operator. (struct parser_ctxt): New field osb_number. * parse.y (static tree wfl_operator): New static WFL for operator ! bound error messages. (DECR_TK, INCR_TK): Moved. (OP_TK): Tagged . (array_type:): Now call build_unresolved_array_type. (dim_expr:): Count the number of '[' seen. (post_increment_expression, post_decrement_expression, ! pre_increment_expression, pre_decrement_expression, ! unary_expression_not_plus_minus, unary_expression:): Actions are ! now building the corresponding unary expressions. (cast_expression:): Actions are now building cast expressions. (build_unresolved_array_type): New function. (create_interface): Reset the number of declared interfaces. (create_class): Likewise. (method_header): Methods declared within the scope of an interface ! are now implicitly set public and abstract. (java_complete_class): Variable's and parameter's type are patched ! with a promoted type. (declare_local_variables): Resolved non builtin types are promoted ! before being used to build a variable decl. Removed type patch ! posted on variable initialization statement. (source_start_java_method): Use build_decl_no_layout to build the ! decl of a parameter of incomplete type. (java_register_parsed_class): Process interfaces too. Call ! rest_of_decl_compilation on each processed class declarations. (java_complete_expand_methods): Don't attempt to expand things in ! interfaces. (java_complete_tree): Process CONVERT_EXPR, even though it always ! has a type. Propagate error_mark_node to node's type too. Promote ! method's call argument type and return error_mark_node if ! argument's completion didn't work. MODIFY_EXPR can have a WFL as a ! RHS. Fixed bug in the handling of bogus RHS of a fixed type. Now ! handle unary operator nodes. (build_assignment): Added comment. (print_int_node): New function. (patch_assignment): New second argument. New error handling. Use ! print_int_node. Handle references. Use can_cast_to_p to issue ! different error message according to the context and check upon ! the initialization of the RHS. (can_cast_to_p, valid_ref_assignconv_cast_p): New functions. (operator_string): Handle more operators. (patch_binop): No longer use a function static ! wfl_operator. Improved error message on shift distance. (build_unaryop, build_incdec, build_cast, patch_unaryop, ! patch_cast): New functions. Fri Jun 5 18:03:07 1998 Per Bothner --- 11861,11933 ---- * ChangeLog: Fixed entries not compliant with the Gnu Coding Standard. * decl.c (build_decl_no_layout): New function. * expr.c (java_lang_expand_expr): Layout declarations found in ! blocks before they're pushed. * jcf-parse.c (load_class): Save current line when parsing class ! file. (parse_source_file): Register class before expanding their ! methods. * lang.c (put_decl_node): Produce `null' when `void *' is ! processed. * lex.c (static tree wfl_op): New static global, for error report ! on casts. (java_init_lex): wfl_operator and wfl_op initialized ! here. Filename caching added for wfl_op. Return wfl_op when `(' is ! parsed. * parse.h (build_unaryop, build_incdec, patch_unaryop, build_cast, ! patch_cast, valid_ref_assignconv_cast_p, can_cast_to_p, ! build_unresolved_array_type): New static function definitions. (build_decl_no_layout): New extern function declared. (OBSOLETE_MODIFIER_WARNING): Report error only if the WFL of the ! faulty modifier exists. (TYPE_INTERFACE_P, TYPE_CLASS_P): New macros. (ERROR_CAST_NEEDED_TO_INTEGRAL): Error message tuned. (UNARY_PLUS_EXPR): New fake operator. (struct parser_ctxt): New field osb_number. * parse.y (static tree wfl_operator): New static WFL for operator ! bound error messages. (DECR_TK, INCR_TK): Moved. (OP_TK): Tagged . (array_type:): Now call build_unresolved_array_type. (dim_expr:): Count the number of '[' seen. (post_increment_expression, post_decrement_expression, ! pre_increment_expression, pre_decrement_expression, ! unary_expression_not_plus_minus, unary_expression:): Actions are ! now building the corresponding unary expressions. (cast_expression:): Actions are now building cast expressions. (build_unresolved_array_type): New function. (create_interface): Reset the number of declared interfaces. (create_class): Likewise. (method_header): Methods declared within the scope of an interface ! are now implicitly set public and abstract. (java_complete_class): Variable's and parameter's type are patched ! with a promoted type. (declare_local_variables): Resolved non builtin types are promoted ! before being used to build a variable decl. Removed type patch ! posted on variable initialization statement. (source_start_java_method): Use build_decl_no_layout to build the ! decl of a parameter of incomplete type. (java_register_parsed_class): Process interfaces too. Call ! rest_of_decl_compilation on each processed class declarations. (java_complete_expand_methods): Don't attempt to expand things in ! interfaces. (java_complete_tree): Process CONVERT_EXPR, even though it always ! has a type. Propagate error_mark_node to node's type too. Promote ! method's call argument type and return error_mark_node if ! argument's completion didn't work. MODIFY_EXPR can have a WFL as a ! RHS. Fixed bug in the handling of bogus RHS of a fixed type. Now ! handle unary operator nodes. (build_assignment): Added comment. (print_int_node): New function. (patch_assignment): New second argument. New error handling. Use ! print_int_node. Handle references. Use can_cast_to_p to issue ! different error message according to the context and check upon ! the initialization of the RHS. (can_cast_to_p, valid_ref_assignconv_cast_p): New functions. (operator_string): Handle more operators. (patch_binop): No longer use a function static ! wfl_operator. Improved error message on shift distance. (build_unaryop, build_incdec, build_cast, patch_unaryop, ! patch_cast): New functions. Fri Jun 5 18:03:07 1998 Per Bothner *************** Tue Jun 2 15:19:19 1998 Per Bothner < *** 10090,10122 **** Mon Jun 1 09:58:36 1998 Alexandre Petit-Bianco * expr.c (truthvalue_conversion): Convert integer and floating ! point value to their truth value. * lex.c (java_lex): Handle the `null' literal. * parse.h (JREFERENCE_TYPE_P, DECL_P): New macros. (ERROR_CANT_CONVERT_TO_BOOLEAN, ERROR_CANT_CONVERT_TO_NUMERIC, ! ERROR_CAST_NEEDED_TO_INTEGRAL, ERROR_VARIABLE_NOT_INITIALIZED): ! New macros. * parse.y: Reorganization/documentation on token declaration. (binop_lookup[]): New added new tree codes. (relational_expression): Build corresponding binary operators. (equality_expression, conditional_and_expression, ! conditional_or_expression): Likewise. (java_complete_class): Fix crash in debug message. (java_complete_tree): Check initialization of method call ! arguments. Further bogus node evaluation to detect more error ! during assignments. Handles more binary operators. (patch_assignment): Use DECL_P. (build_binop): Fix crash when using URSHIFT_EXPR, a Java only tree ! code. (operator_string): Handle more case. Compacted source. (patch_binop): Changed function comment. Checking for ! uninitialized first operand takes the compound assignment into ! account and uses DECL_P. Checking for uninitialized second operand ! delayed to routine's end. Use macros to issue type bound error ! messages and issue messages on both operands if their types are ! different. Force fixed type into node. Handle all binary ! operators. Wed May 27 10:30:31 1998 Alexandre Petit-Bianco --- 11959,11991 ---- Mon Jun 1 09:58:36 1998 Alexandre Petit-Bianco * expr.c (truthvalue_conversion): Convert integer and floating ! point value to their truth value. * lex.c (java_lex): Handle the `null' literal. * parse.h (JREFERENCE_TYPE_P, DECL_P): New macros. (ERROR_CANT_CONVERT_TO_BOOLEAN, ERROR_CANT_CONVERT_TO_NUMERIC, ! ERROR_CAST_NEEDED_TO_INTEGRAL, ERROR_VARIABLE_NOT_INITIALIZED): ! New macros. * parse.y: Reorganization/documentation on token declaration. (binop_lookup[]): New added new tree codes. (relational_expression): Build corresponding binary operators. (equality_expression, conditional_and_expression, ! conditional_or_expression): Likewise. (java_complete_class): Fix crash in debug message. (java_complete_tree): Check initialization of method call ! arguments. Further bogus node evaluation to detect more error ! during assignments. Handles more binary operators. (patch_assignment): Use DECL_P. (build_binop): Fix crash when using URSHIFT_EXPR, a Java only tree ! code. (operator_string): Handle more case. Compacted source. (patch_binop): Changed function comment. Checking for ! uninitialized first operand takes the compound assignment into ! account and uses DECL_P. Checking for uninitialized second operand ! delayed to routine's end. Use macros to issue type bound error ! messages and issue messages on both operands if their types are ! different. Force fixed type into node. Handle all binary ! operators. Wed May 27 10:30:31 1998 Alexandre Petit-Bianco *************** Wed May 27 10:30:31 1998 Alexandre Peti *** 10126,10179 **** * lex.h (BUILD_OPERATOR, BUILD_OPERATOR2): New macros. * parse.h (java_complete_tree): Changed returned type in prototype. (build_method_invocation, build_assignment, patch_assignment, ! patch_binop): New static function declarations. (JFLOAT_TYPE_P, JNUMERIC_TYPE_P, JPRIMITIVE_TYPE_P, JSTRING_P, ! BUILD_EXPR_WFL): New macros. * parse.y (enum tree_code binop_lookup[]): New static for token to ! TREE_CODE lookup. (%union): Parser union has new sub-structure `operator'. (ASSIGN_TK, MULT_ASSIGN_TK, DIV_ASSIGN_TK, REM_ASSIGN_TK, PLUS_ASSIGN_TK, MINUS_ASSIGN_TK, LS_ASSIGN_TK, SRS_ASSIGN_TK, ZRS_ASSIGN_TK, AND_ASSIGN_TK, XOR_ASSIGN_TK, OR_ASSIGN_TK, ASSIGN_ANY_TK): Tokens tagged `operator'. (EQ_TK, GTE_TK, ZRS_TK, SRS_TK, GT_TK, LTE_TK, LS_TK, BOOL_AND_TK, ! AND_TK, BOOL_OR_TK, OR_TK, INCR_TK, PLUS_TK, DECR_TK, MINUS_TK, ! MULT_TK, DIV_TK, XOR_TK, REM_TK, NEQ_TK, NEG_TK, REL_QM_TK, ! REL_CL_TK, NOT_TK, LT_TK): Tokens tagged `operator'. (assignment_operator:): Rule tagged `operator'. (expression_statement:): Re-installed default rule. (method_invocation:): Sub rules call build_method_invocation. (postfix_expression:): Don't attempt to resolve name here. Just ! return an ID. (multiplicative_expression:): Sub-rules build corresponding binop ! expression node. (additive_expression:, shift_expression:, and_expression:, ! exclusive_or_expression:, inclusive_or_expression:): Likewise. (assignment:): Sub rule invoke build_assignment. (assignment_operator:): Default rules on sub rules. (force_error): Added documentation on this variable. (declare_local_variables): Build initialization calling build_assignment. (expand_start_java_method): Removed unused rtx declaration. Mark ! arguments as already initialized. (java_method_add_stmt): Type of built COMPOUND_EXPR set to NULL. (java_complete_expand_methods): Don't process next method if ! completion of the previous one triggered errors. (java_complete_expand_method): Call source_end_java_method if no ! error were found during completion. (resolve_expression_name): Use IDENTIFIER_LOCAL_VALUE to retrieve ! locals declaratilon. Handle names found within a class. Return ! error_mark_node when things aren't found. (patch_method_invocation_stmt): Return error_mark_node on failures. (patch_invoke): Removed unused local. Return the correct node. (java_complete_tree): Now returns a value. The BLOCK section binds ! local identifiers and the type of a BLOCK is now void. Assign the ! result of operand completion on COMPOUND_EXPR. Assign the ! encapsulated node of a WFL to the result of its completion, except ! when the node is an identifier. Now handle MODIFY_EXPR and several ! binary operators. Return error_mark_node on errors. (build_method_invocation, build_assignment, patch_assignment, ! build_binop, operator_string, patch_binop): New functions. * typeck.c (binary_numeric_promotion): New function. Thu May 21 12:01:04 1998 Per Bothner --- 11995,12048 ---- * lex.h (BUILD_OPERATOR, BUILD_OPERATOR2): New macros. * parse.h (java_complete_tree): Changed returned type in prototype. (build_method_invocation, build_assignment, patch_assignment, ! patch_binop): New static function declarations. (JFLOAT_TYPE_P, JNUMERIC_TYPE_P, JPRIMITIVE_TYPE_P, JSTRING_P, ! BUILD_EXPR_WFL): New macros. * parse.y (enum tree_code binop_lookup[]): New static for token to ! TREE_CODE lookup. (%union): Parser union has new sub-structure `operator'. (ASSIGN_TK, MULT_ASSIGN_TK, DIV_ASSIGN_TK, REM_ASSIGN_TK, PLUS_ASSIGN_TK, MINUS_ASSIGN_TK, LS_ASSIGN_TK, SRS_ASSIGN_TK, ZRS_ASSIGN_TK, AND_ASSIGN_TK, XOR_ASSIGN_TK, OR_ASSIGN_TK, ASSIGN_ANY_TK): Tokens tagged `operator'. (EQ_TK, GTE_TK, ZRS_TK, SRS_TK, GT_TK, LTE_TK, LS_TK, BOOL_AND_TK, ! AND_TK, BOOL_OR_TK, OR_TK, INCR_TK, PLUS_TK, DECR_TK, MINUS_TK, ! MULT_TK, DIV_TK, XOR_TK, REM_TK, NEQ_TK, NEG_TK, REL_QM_TK, ! REL_CL_TK, NOT_TK, LT_TK): Tokens tagged `operator'. (assignment_operator:): Rule tagged `operator'. (expression_statement:): Re-installed default rule. (method_invocation:): Sub rules call build_method_invocation. (postfix_expression:): Don't attempt to resolve name here. Just ! return an ID. (multiplicative_expression:): Sub-rules build corresponding binop ! expression node. (additive_expression:, shift_expression:, and_expression:, ! exclusive_or_expression:, inclusive_or_expression:): Likewise. (assignment:): Sub rule invoke build_assignment. (assignment_operator:): Default rules on sub rules. (force_error): Added documentation on this variable. (declare_local_variables): Build initialization calling build_assignment. (expand_start_java_method): Removed unused rtx declaration. Mark ! arguments as already initialized. (java_method_add_stmt): Type of built COMPOUND_EXPR set to NULL. (java_complete_expand_methods): Don't process next method if ! completion of the previous one triggered errors. (java_complete_expand_method): Call source_end_java_method if no ! error were found during completion. (resolve_expression_name): Use IDENTIFIER_LOCAL_VALUE to retrieve ! locals declaratilon. Handle names found within a class. Return ! error_mark_node when things aren't found. (patch_method_invocation_stmt): Return error_mark_node on failures. (patch_invoke): Removed unused local. Return the correct node. (java_complete_tree): Now returns a value. The BLOCK section binds ! local identifiers and the type of a BLOCK is now void. Assign the ! result of operand completion on COMPOUND_EXPR. Assign the ! encapsulated node of a WFL to the result of its completion, except ! when the node is an identifier. Now handle MODIFY_EXPR and several ! binary operators. Return error_mark_node on errors. (build_method_invocation, build_assignment, patch_assignment, ! build_binop, operator_string, patch_binop): New functions. * typeck.c (binary_numeric_promotion): New function. Thu May 21 12:01:04 1998 Per Bothner *************** Thu May 12 13:44:27 1998 Alexandre Peti *** 10218,10385 **** * decl.c (pushdecl_force_head): New function. (pushlevel): Removed conditional printf. (complete_start_java_method): Don't enter local variable scope if ! function is compiled from source code. * expr.c: parse.h now included (java_lang_expand_expr): New function. * jcf-io.c (find_class): Use SOURCE_FRONTEND_DEBUG instead of ! printf. Terminate buffer when doing directories. * jcf-parse.c (parse_source_file): Call lang_init_source before ! parsing and before code generation. * jcf.h (SOURCE_FRONTEND_DEBUG): Macro redefined to conditionally ! use printf if the macro is defined. * lang.c (lang_init): Install lang_expand_expr hook on ! java_lang_expand_expr. (java_dummy_print): New function. (lang_init_source): New function. * lex.c (java_lex): Remember location of an opening brace at the ! second nesting level. (java_is_eol): Unget character seen after a CR if it is EOF. * parse.h: Now includes lex.h (SOURCE_FRONTEND_DEBUG): Macro redefined to conditionally use ! printf if the macro is defined. (expand_start_java_method, build_expr_block, enter_block, ! exit_block, lookup_name_in_blocks, maybe_absorb_scoping_blocks): ! New static function declarations. (pushdecl_force_head): New extern function declaration. (INCOMPLETE_TYPE_P): New macro. (JDEP_PARM, JDEP_TYPE): New entries in JDEPs enum. (BLOCK_CHAIN_DECL, BLOCK_EXPR_DECLS, BLOCK_EXPR_BODY, ! BLOCK_EXPR_ORIGIN): New macros. (DECL_SOURCE_LINE_MERGE, DECL_SOURCE_LINE_FIRST, ! DECL_SOURCE_LINE_LAST): New macros. (struct parser_ctxt): Removed field current_method_decl, redundant ! with the field current_function_decl. Added fields ! first_ccb_indent1 and pending_block. * parse.y (method_body, literal, INT_LIT_TK, FP_LIT_TK, ! BOOL_LIT_TK, CHAR_LIT_TK, STRING_LIT_TK, NULL_TK, VOID_TK): Rules ! tagged (SOURCE_FRONTEND_DEBUG): Used as macro accepting varargs. (compilation_unit:): Cosmetic on sub rule. (type_declaration:): Cosmetic on sub rules. Added an error rule. (variable_initializer:): Installed default rule on expression:. (method_declaration:): method_header: starts a new ! method. method_body: installs the function body, absorbs blocks ! emitted for temporary variable scopings, pops function's body block ! and merges function's last statement lineno in DECL_SOURCE_LINE. (method_body:): Installed default rules. (block:): Call enter_block when an opening brace is seen. Absorb ! scoping blocks and call exit_block when a closing brace is seen. (block_statement:): Cosmetic changes. (method_invocation:): Create WFL around CALL_EXPR node. (patch_stage): Added comment around definition. (method_header): Try to use first_ccb_indent1 as the first line of ! the method, so BP debug info are emitted at the first opening ! brace of the function. If the function has no body, use the ! location of the function's name. Override currently defined method ! name with the matching WFL so we can point redefinition errors ! using the location where the function's name was declared. (check_abstract_method_header): Interprets DECL_NAME as an ! identifier or as a WFL, accordingly. (java_complete_class): New cases for JDEP_TYPE and JDEP_PARM. (check_method_redefinition): Use DECL_NAME as a WFL. Extract ! location and name information out of it and reinstall DECL_NAME to ! its original identifier node value. (lookup_cl): Use DECL_SOURCE_LINE_FIRST (first line of the ! function's source code). (read_import_dir): Test the value returned by find_class and issue ! a fatal accordingly. (declare_local_variables): Push a new block for the scope of the ! new variable(s) if code has been already generated at that nesting ! level. Pinpoint redefinition errors using the variable id ! WFLs. Generate initialization code if necessary. If the variable ! type is incomplete, register a patch on its decl. (source_start_java_method): Rewritten. Define a new block for the ! function's parameters. Build parameter decl out of function's ! arguments and register them for a patch if their types are ! incomplete. (expand_start_java_method): Includes the part of ! source_start_java_method that was pushing the parameter decls and ! completing the method start code. (source_end_java_method): Removed call the expand_end_bindings and ! poplevel (already taken care of). Reinstall function's arguments ! and get function's last line of code before calling ! expand_function_end. (java_method_add_stmt): New comment before the function's ! code. Complement the second operand of the current COMPOUND_EXPR ! if necessary. (java_complete_expand_methods): Don't generate debug info on line ! zero when expanding a generated constructor. (java_complete_expand_method): Set start and end line numbers for ! a artificially generated constructor to one and manually call ! enter_block and exit_block when defining it. For all methods: ! expand function's start calling the new expand_start_java_method ! and invoke java_complete_tree on the effective method's body, if ! any. (resolve_expression_name): Now use lookup_name_in_blocks to search ! local variable decls and print out an error when variables are ! undefined. (patch_method_invocation_stmt): Inserted comment before the ! function's code. (lookup_method_invoke): Chain method's arguments using chainon ! with the current arg list as a second argument. Inserted missing ! IDENTIFIER_POINTER when reporting an error on methods not found. (refine_accessible_methods_list): Don't retain constructors. (patch_arguments): Function removed. (java_complete_tree): Inserted comment before the function's ! code. New case for BLOCKs. Moved the WFL case a bit ! further. Complete function's arguments. ! (build_expr_block, enter_block, exit_block, lookup_name_in_blocks, ! maybe_absorb_scoping_blocks): New functions. Mon Apr 27 10:50:05 1998 Alexandre Petit-Bianco * jcf-io.c (find_class): Reset jcf->java_source after JCF_ZERO, if ! previously set. * jcf-parse.c (parse_source_file, java_error_count): New forward ! and extern declarations. (java_parse_abort_on_error): Macro moved. (jcf_parse_source): fatal called if fopen fails. Now calls ! parse_source_file. (parse_source_file): New parse_only parameter. Reflects the ! elimination of the second pass. (yyparse): parse_source_file called with argument set to 0. * jcf.h (JCF_ZERO): Sets java_source to zero. * lex.c (java_init_lex): pass argument is gone. Function modified ! to be called once during the analysis of a file. (java_unget_unicode): Fixed typo in fatal message. (java_get_line_col): Likewise. (java_lval): Likewise. String literals no longer built during ! second pass. * lex.h (JAVA_COLUMN_DELTA): Take the tabulation character into ! account. * parse.h (MODIFIER_WFL): New macro. (parse_check_super, parser_check_super_interface): Now return int. (parser_chain_incomplete_item, not_builtin_p, ! complete_method_decl): Declarations removed. (build_method_invocation_stmt, build_invoke): Renamed using the ! `patch' instead of `build' (register-incomplete_type, obtain_incomplete_type, ! java_complete_tree, java_complete_expand_method, ! unresolved_type_p, create_jdep_list): New function declarations. (IC_TYPE, IC_DEPEND, DEPEND_DECL, DEPEND_WFL, BEGIN_ONLY_PASS, ! END_ONLY_PASS, ELSE_ONLY_PASS): Macro deleted. (jdep): New typedef on new struct _jdep. (JDEP_DECL, JDEP_DECL_WFL, JDEP_KIND, JDEP_SOLV, JDEP_WFL, ! JDEP_MISC, JDEP_APPLY_PATCH, JDEP_GET_PATCH, JDEP_CHAIN, ! JDEP_TO_REVOLVE, JDEP_RESOLVED_DECL, JDEP_RESOLVED, ! JDEP_RESOLVED_P): New macros. (JDEP_NO_PATCH, JDEP_SUPER, JDEP_FIELD, JDEP_METHOD, ! JDEP_METHOD_RETURN, JDEP_METHOD_END, JDEP_INTERFACE, ! JDEP_VARIABLE): New enum values and jdep kinds. (jdeplist): New typedef on struct _jdeplist. (CLASSD_FIRST, CLASSD_LAST, CLASSD_CHAIN, JDEP_INSERT): New ! macros. (CALL_EXPR_PRIMARY): New macro. (struct parser_ctxt): Fields java_pass, current_method_decl, ! method_decl_list deleted. New field jdeplist. (INCOMPLETE_P): Macro deleted. * parse.y (single_type_import_declaration:): Removed pass switch. (type_import_on_demand_declaration): Likewise. (field_declaration:): Removed pass switch on all sub rules. (class_declaration:): Call the complete_class_decl removed on ! class_body rules. (method_declaration:): Removed second pass switch. No longer chain ! methods decl when method_header reduced. (method_header:): Sub rules no longer depend on pass switch. (method_declarator:): Likewise. (method_body:): Likewise. --- 12087,12254 ---- * decl.c (pushdecl_force_head): New function. (pushlevel): Removed conditional printf. (complete_start_java_method): Don't enter local variable scope if ! function is compiled from source code. * expr.c: parse.h now included (java_lang_expand_expr): New function. * jcf-io.c (find_class): Use SOURCE_FRONTEND_DEBUG instead of ! printf. Terminate buffer when doing directories. * jcf-parse.c (parse_source_file): Call lang_init_source before ! parsing and before code generation. * jcf.h (SOURCE_FRONTEND_DEBUG): Macro redefined to conditionally ! use printf if the macro is defined. * lang.c (lang_init): Install lang_expand_expr hook on ! java_lang_expand_expr. (java_dummy_print): New function. (lang_init_source): New function. * lex.c (java_lex): Remember location of an opening brace at the ! second nesting level. (java_is_eol): Unget character seen after a CR if it is EOF. * parse.h: Now includes lex.h (SOURCE_FRONTEND_DEBUG): Macro redefined to conditionally use ! printf if the macro is defined. (expand_start_java_method, build_expr_block, enter_block, ! exit_block, lookup_name_in_blocks, maybe_absorb_scoping_blocks): ! New static function declarations. (pushdecl_force_head): New extern function declaration. (INCOMPLETE_TYPE_P): New macro. (JDEP_PARM, JDEP_TYPE): New entries in JDEPs enum. (BLOCK_CHAIN_DECL, BLOCK_EXPR_DECLS, BLOCK_EXPR_BODY, ! BLOCK_EXPR_ORIGIN): New macros. (DECL_SOURCE_LINE_MERGE, DECL_SOURCE_LINE_FIRST, ! DECL_SOURCE_LINE_LAST): New macros. (struct parser_ctxt): Removed field current_method_decl, redundant ! with the field current_function_decl. Added fields ! first_ccb_indent1 and pending_block. * parse.y (method_body, literal, INT_LIT_TK, FP_LIT_TK, ! BOOL_LIT_TK, CHAR_LIT_TK, STRING_LIT_TK, NULL_TK, VOID_TK): Rules ! tagged (SOURCE_FRONTEND_DEBUG): Used as macro accepting varargs. (compilation_unit:): Cosmetic on sub rule. (type_declaration:): Cosmetic on sub rules. Added an error rule. (variable_initializer:): Installed default rule on expression:. (method_declaration:): method_header: starts a new ! method. method_body: installs the function body, absorbs blocks ! emitted for temporary variable scopings, pops function's body block ! and merges function's last statement lineno in DECL_SOURCE_LINE. (method_body:): Installed default rules. (block:): Call enter_block when an opening brace is seen. Absorb ! scoping blocks and call exit_block when a closing brace is seen. (block_statement:): Cosmetic changes. (method_invocation:): Create WFL around CALL_EXPR node. (patch_stage): Added comment around definition. (method_header): Try to use first_ccb_indent1 as the first line of ! the method, so BP debug info are emitted at the first opening ! brace of the function. If the function has no body, use the ! location of the function's name. Override currently defined method ! name with the matching WFL so we can point redefinition errors ! using the location where the function's name was declared. (check_abstract_method_header): Interprets DECL_NAME as an ! identifier or as a WFL, accordingly. (java_complete_class): New cases for JDEP_TYPE and JDEP_PARM. (check_method_redefinition): Use DECL_NAME as a WFL. Extract ! location and name information out of it and reinstall DECL_NAME to ! its original identifier node value. (lookup_cl): Use DECL_SOURCE_LINE_FIRST (first line of the ! function's source code). (read_import_dir): Test the value returned by find_class and issue ! a fatal accordingly. (declare_local_variables): Push a new block for the scope of the ! new variable(s) if code has been already generated at that nesting ! level. Pinpoint redefinition errors using the variable id ! WFLs. Generate initialization code if necessary. If the variable ! type is incomplete, register a patch on its decl. (source_start_java_method): Rewritten. Define a new block for the ! function's parameters. Build parameter decl out of function's ! arguments and register them for a patch if their types are ! incomplete. (expand_start_java_method): Includes the part of ! source_start_java_method that was pushing the parameter decls and ! completing the method start code. (source_end_java_method): Removed call the expand_end_bindings and ! poplevel (already taken care of). Reinstall function's arguments ! and get function's last line of code before calling ! expand_function_end. (java_method_add_stmt): New comment before the function's ! code. Complement the second operand of the current COMPOUND_EXPR ! if necessary. (java_complete_expand_methods): Don't generate debug info on line ! zero when expanding a generated constructor. (java_complete_expand_method): Set start and end line numbers for ! a artificially generated constructor to one and manually call ! enter_block and exit_block when defining it. For all methods: ! expand function's start calling the new expand_start_java_method ! and invoke java_complete_tree on the effective method's body, if ! any. (resolve_expression_name): Now use lookup_name_in_blocks to search ! local variable decls and print out an error when variables are ! undefined. (patch_method_invocation_stmt): Inserted comment before the ! function's code. (lookup_method_invoke): Chain method's arguments using chainon ! with the current arg list as a second argument. Inserted missing ! IDENTIFIER_POINTER when reporting an error on methods not found. (refine_accessible_methods_list): Don't retain constructors. (patch_arguments): Function removed. (java_complete_tree): Inserted comment before the function's ! code. New case for BLOCKs. Moved the WFL case a bit ! further. Complete function's arguments. ! (build_expr_block, enter_block, exit_block, lookup_name_in_blocks, ! maybe_absorb_scoping_blocks): New functions. Mon Apr 27 10:50:05 1998 Alexandre Petit-Bianco * jcf-io.c (find_class): Reset jcf->java_source after JCF_ZERO, if ! previously set. * jcf-parse.c (parse_source_file, java_error_count): New forward ! and extern declarations. (java_parse_abort_on_error): Macro moved. (jcf_parse_source): fatal called if fopen fails. Now calls ! parse_source_file. (parse_source_file): New parse_only parameter. Reflects the ! elimination of the second pass. (yyparse): parse_source_file called with argument set to 0. * jcf.h (JCF_ZERO): Sets java_source to zero. * lex.c (java_init_lex): pass argument is gone. Function modified ! to be called once during the analysis of a file. (java_unget_unicode): Fixed typo in fatal message. (java_get_line_col): Likewise. (java_lval): Likewise. String literals no longer built during ! second pass. * lex.h (JAVA_COLUMN_DELTA): Take the tabulation character into ! account. * parse.h (MODIFIER_WFL): New macro. (parse_check_super, parser_check_super_interface): Now return int. (parser_chain_incomplete_item, not_builtin_p, ! complete_method_decl): Declarations removed. (build_method_invocation_stmt, build_invoke): Renamed using the ! `patch' instead of `build' (register-incomplete_type, obtain_incomplete_type, ! java_complete_tree, java_complete_expand_method, ! unresolved_type_p, create_jdep_list): New function declarations. (IC_TYPE, IC_DEPEND, DEPEND_DECL, DEPEND_WFL, BEGIN_ONLY_PASS, ! END_ONLY_PASS, ELSE_ONLY_PASS): Macro deleted. (jdep): New typedef on new struct _jdep. (JDEP_DECL, JDEP_DECL_WFL, JDEP_KIND, JDEP_SOLV, JDEP_WFL, ! JDEP_MISC, JDEP_APPLY_PATCH, JDEP_GET_PATCH, JDEP_CHAIN, ! JDEP_TO_REVOLVE, JDEP_RESOLVED_DECL, JDEP_RESOLVED, ! JDEP_RESOLVED_P): New macros. (JDEP_NO_PATCH, JDEP_SUPER, JDEP_FIELD, JDEP_METHOD, ! JDEP_METHOD_RETURN, JDEP_METHOD_END, JDEP_INTERFACE, ! JDEP_VARIABLE): New enum values and jdep kinds. (jdeplist): New typedef on struct _jdeplist. (CLASSD_FIRST, CLASSD_LAST, CLASSD_CHAIN, JDEP_INSERT): New ! macros. (CALL_EXPR_PRIMARY): New macro. (struct parser_ctxt): Fields java_pass, current_method_decl, ! method_decl_list deleted. New field jdeplist. (INCOMPLETE_P): Macro deleted. * parse.y (single_type_import_declaration:): Removed pass switch. (type_import_on_demand_declaration): Likewise. (field_declaration:): Removed pass switch on all sub rules. (class_declaration:): Call the complete_class_decl removed on ! class_body rules. (method_declaration:): Removed second pass switch. No longer chain ! methods decl when method_header reduced. (method_header:): Sub rules no longer depend on pass switch. (method_declarator:): Likewise. (method_body:): Likewise. *************** Mon Apr 27 10:50:05 1998 Alexandre Peti *** 10393,10466 **** (java_pop_parser_context): Free classd_list content. (yyerror): Call obstrack_grow0 to finalize error message. (check_class_interface_creation): Comment modified to reflect new ! returned value meaning. Removed second pass switch. Return 1 if an ! error was found, 0 otherwise. Adjust pointer on filename if a ! leading path separator was found. (maybe_create_class_interface_decl): Removed first pass switch ! when linking the class decl to the class_list. Install a new ! jdep_list for the class. (add_superinterfaces): List of unresolved interfaces is ! gone. Unresolved interfaces are directly added to the current ! dependencies list. (create_interface): Second pass shortcut removed. ctpx->modifier_ctx access through MODIFIER_WFL. (create_class): Second pass shortcut removed. Call to ! register_incomplete_type replaces the call to ! parser_chain_incomplete_item. (complete_class_decl): Function removed. (duplicate_declaration_error): New way of retrieving redeclared ! item type. (register_fields): Call to lookup_modifier_cl replaced by ! MODIFIER_WFL. New way of handling unresolved type, using ! unresolved_type_p and obtain_incomplete_type. register_incomplete_type replaces call to parser_chain_incomplete_item. (patch_stage): New static global variable. (method_header): New way of handling unresolved type, using ! unresolved_type_p and obtain_incomplete_type. patch_stage used to ! indicates that the method decl needs to be patched. (check_abstract_method_header): Call to lookup_modifier_cl ! replaced by MODIFIER_WFL. (method_declarator): Incomplete argument type are registered ! calling register_incomplete_type. Patch on the declared method is ! issued in that case. (unresolved_type_p): New function. (parser_check_super_interface): New comment to reflect function's ! modified returned type (int). Function and has a new argument ! this_wfl. Call to parse_error_context uses this_wfl instead of ! relying on lookup_cl. (parser_check_super): Comment reflects function's new returned ! type (int). Function returns non zero value on error. (create_jdep_list, reverse_jdep_list, obtain_incomplete_type, ! register_incomplete_type, jdep_resolve_class): New functions to ! handle incomplete types in declarations. (java_complete_class): Rewritten to work with the new incomplete ! type handling scheme. (complete_class_report_errors): Likewise. (complete_method_decl): Removed: it jobs is now handled by ! java_complete_class. (do_resolve_class): Class loaded in not already loaded and not ! found in Java source code. (java_check_regular_methods, java_check_abstract_methods): Don't ! call complete_method_decl anymore. (lookup_modifier_cl, not_builtin_p): Functions deleted. (read_import_dir): Got rid of the pass number dependency. (declare_local_variables): New handling of unresolved types (patch ! issued). (source_start_java_method): New parameter level. Function called ! with level set to 1 when argument types are potentially ! unresolved. Called to complete the job with level set to 2 once ! types are complete. (source_end_java_method): Call to permanent_allocation ! removed. Waiting to be replaced by a more suitable obstack ! management. (java_complete_expand_methods, java_complete_expand_method, ! java_expand_finals): New functions. (build_method_invocation_stmt): Renamed ! patch_method_invocation_stmt. Extracts function call expression ! (wfl) and arguments (args) from CALL_EXPR tree operands. (build_invoke): Renamed patch_invoke. Fixed typo in fatal ! call. Patch the function and argument operand of the CALL_EXPR ! tree argument. (patch_argument, java_complete_tree): New functions. Mon Apr 20 18:26:57 1998 Per Bothner --- 12262,12335 ---- (java_pop_parser_context): Free classd_list content. (yyerror): Call obstrack_grow0 to finalize error message. (check_class_interface_creation): Comment modified to reflect new ! returned value meaning. Removed second pass switch. Return 1 if an ! error was found, 0 otherwise. Adjust pointer on filename if a ! leading path separator was found. (maybe_create_class_interface_decl): Removed first pass switch ! when linking the class decl to the class_list. Install a new ! jdep_list for the class. (add_superinterfaces): List of unresolved interfaces is ! gone. Unresolved interfaces are directly added to the current ! dependencies list. (create_interface): Second pass shortcut removed. ctpx->modifier_ctx access through MODIFIER_WFL. (create_class): Second pass shortcut removed. Call to ! register_incomplete_type replaces the call to ! parser_chain_incomplete_item. (complete_class_decl): Function removed. (duplicate_declaration_error): New way of retrieving redeclared ! item type. (register_fields): Call to lookup_modifier_cl replaced by ! MODIFIER_WFL. New way of handling unresolved type, using ! unresolved_type_p and obtain_incomplete_type. register_incomplete_type replaces call to parser_chain_incomplete_item. (patch_stage): New static global variable. (method_header): New way of handling unresolved type, using ! unresolved_type_p and obtain_incomplete_type. patch_stage used to ! indicates that the method decl needs to be patched. (check_abstract_method_header): Call to lookup_modifier_cl ! replaced by MODIFIER_WFL. (method_declarator): Incomplete argument type are registered ! calling register_incomplete_type. Patch on the declared method is ! issued in that case. (unresolved_type_p): New function. (parser_check_super_interface): New comment to reflect function's ! modified returned type (int). Function and has a new argument ! this_wfl. Call to parse_error_context uses this_wfl instead of ! relying on lookup_cl. (parser_check_super): Comment reflects function's new returned ! type (int). Function returns non zero value on error. (create_jdep_list, reverse_jdep_list, obtain_incomplete_type, ! register_incomplete_type, jdep_resolve_class): New functions to ! handle incomplete types in declarations. (java_complete_class): Rewritten to work with the new incomplete ! type handling scheme. (complete_class_report_errors): Likewise. (complete_method_decl): Removed: it jobs is now handled by ! java_complete_class. (do_resolve_class): Class loaded in not already loaded and not ! found in Java source code. (java_check_regular_methods, java_check_abstract_methods): Don't ! call complete_method_decl anymore. (lookup_modifier_cl, not_builtin_p): Functions deleted. (read_import_dir): Got rid of the pass number dependency. (declare_local_variables): New handling of unresolved types (patch ! issued). (source_start_java_method): New parameter level. Function called ! with level set to 1 when argument types are potentially ! unresolved. Called to complete the job with level set to 2 once ! types are complete. (source_end_java_method): Call to permanent_allocation ! removed. Waiting to be replaced by a more suitable obstack ! management. (java_complete_expand_methods, java_complete_expand_method, ! java_expand_finals): New functions. (build_method_invocation_stmt): Renamed ! patch_method_invocation_stmt. Extracts function call expression ! (wfl) and arguments (args) from CALL_EXPR tree operands. (build_invoke): Renamed patch_invoke. Fixed typo in fatal ! call. Patch the function and argument operand of the CALL_EXPR ! tree argument. (patch_argument, java_complete_tree): New functions. Mon Apr 20 18:26:57 1998 Per Bothner *************** Mon Apr 20 18:26:57 1998 Per Bothner < *** 10486,10515 **** Tue Apr 14 15:59:54 1998 Alexandre Petit-Bianco * jcf-parse.c (load_class): Don't change input_filename before ! calling jcf_parse_source (but still do it before calling ! jcf_parse). (jcf_parse_source): Assign input_filename after having saved the ! parser context. * lex.c (java_init_lex): Chain a WFL node to the import on demand ! list. ctxp->modifier_ctx zeroed according to its new ! definition. ctxp->filename initialized. Removed JAVA_MODIFIER_CTX_UNMARK. (java_unget_unicode): Update the character based column position. (java_allocate_new_line): ref_count not used anymore. Always free ! ctxp->p_line. Initialize c_line->char_col to 0. (java_get_unicode): Update the character based column position. (java_lex): Use ctxp->elc to store current position in source ! file, at the beginning of the parsed token. Set modifier_ctx entry ! corresponding to the parse modifier to a WFL node. Return a WFL ! node when an identifier is parsed. (java_lex_error): Now uses ctxp->elc to store current position in ! source. (build_wfl_node, java_is_eol, java_get_line_col): New functions. * lex.h (build_wfl_node): New function definitions. (struct java_line): ref_count and next fields are gone. New field ! char_col. (JAVA_LINE_CHECK, JAVA_LINE_MARK, JAVA_LINE_CHAIN, ! JAVA_LINE_UNMARK, ID_NAME, ID_CL): Macro definitions deleted. (JAVA_COLUMN_DELTA): New macro. (java_lc): New typedef on new struct _java_lc. * parse.h (lookup_cl, lookup_modifier_cl): Changed returned types. --- 12355,12384 ---- Tue Apr 14 15:59:54 1998 Alexandre Petit-Bianco * jcf-parse.c (load_class): Don't change input_filename before ! calling jcf_parse_source (but still do it before calling ! jcf_parse). (jcf_parse_source): Assign input_filename after having saved the ! parser context. * lex.c (java_init_lex): Chain a WFL node to the import on demand ! list. ctxp->modifier_ctx zeroed according to its new ! definition. ctxp->filename initialized. Removed JAVA_MODIFIER_CTX_UNMARK. (java_unget_unicode): Update the character based column position. (java_allocate_new_line): ref_count not used anymore. Always free ! ctxp->p_line. Initialize c_line->char_col to 0. (java_get_unicode): Update the character based column position. (java_lex): Use ctxp->elc to store current position in source ! file, at the beginning of the parsed token. Set modifier_ctx entry ! corresponding to the parse modifier to a WFL node. Return a WFL ! node when an identifier is parsed. (java_lex_error): Now uses ctxp->elc to store current position in ! source. (build_wfl_node, java_is_eol, java_get_line_col): New functions. * lex.h (build_wfl_node): New function definitions. (struct java_line): ref_count and next fields are gone. New field ! char_col. (JAVA_LINE_CHECK, JAVA_LINE_MARK, JAVA_LINE_CHAIN, ! JAVA_LINE_UNMARK, ID_NAME, ID_CL): Macro definitions deleted. (JAVA_COLUMN_DELTA): New macro. (java_lc): New typedef on new struct _java_lc. * parse.h (lookup_cl, lookup_modifier_cl): Changed returned types. *************** Tue Apr 14 15:59:54 1998 Alexandre Peti *** 10522,10597 **** wrong modifier. (exit_java_complete_class): Removed a commented out statement. (struct parser_ctxt): Added comments on fields. modifier_ctx is ! now an array of tree nodes. Deleted fields line_list and ! e_line. New field elc, to replace e_line. * parse.y (array_type:): Build WFL node. (qualified_name:): Build a single WFL node out of two. Retain ! the location information of the first node in the resulting node. (package_declaration:): Use package name as a WFL node (single_type_import_declaration:): Use imported name as a WFL node. (type_import_on_demand_declaration:): Use root of the imported ! packages as a WFL node. (field_declaration:): Removed unused local variable cl. (method_declaration:): Don't call JAVA_MODIFIER_CTX_UNMARK. (yyerror): New static elc. Removed static error_line, error_pos. ! New local code_from_source. Save ctxp->elc into elc at the first ! pass. Call java_get_line_col to get a string of the line where ! the error occured. (debug_line): Removed static function. (parse_error_context, parse_warning_context): Parameter cl is now ! a WFL node. Use its value to initialize ctxp->elc. (redefinition_error): Parameter cl is now a WFL node. (parse_add_interface): New parameter wfl. No longer call ! lookup_cl, use wfl instead. (check_class_interface_creation): Parameter cl is now a WFL node. (maybe_create_class_interface_decl): Likewise. (add_superinterfaces): New function. (create_interface): Removed local cl, node, super_decl, ! super_decl_type. Function now uses id as a WFL node. Better ! warning/error report on obsolete or forbidden mix of ! modifiers. Now calls add_superinterfaces to register interfaces. (create_class): Removed local cl, node. Local variable id is used ! as a WFL node. Better error report on forbidden modifier ! mix. Uses add_superinterfaces to register interfaces. (find_field): Argument cl is now a WFL node. Now store the WFL ! node of a fields that needs to be checked for their ! initialization. (method_header): Local variable node non longer used. Local ! variable id replaces cl. (check_modifiers_consistency): Local variable cl is now a WFL ! node. (method_declarator): Local variable cl replaced by parameter id. (parser_qualified_name): Now uses parameter name as a WFL node. (parser_check_super_interface): New parameter wfl, for achieve ! greater accuracy during error reports. (parser_chain_incomplete_item): New parameter named location. Used, ! along the decl, to construct the incomplete item node. (java_complete_class): resolve_class now uses WFL node extracted ! from the incomplete item node. Macro IC_TYPE replaces TREE_PURPOSE where appropriate. (complete_method_decl): Unresolved function's argument types are WFL. (resolve_class): Parameter cl is now a WFL node. (resolve_and_layout): Likewise. (do_resolve_class): Likewise. Try first to use cl and then do the ! lookup on the decl when calling check_pkg_class_access. (complete_class_report_errors): Use IC_TYPE in place of ! TREE_PURPOSE where appropriate. Use DEPEND_WFL on dependency ! instead of doing a lookup over the decl. (java_check_final): Use WFL info from field tree list. (lookup_cl): Rewritten and returns a statically defined WFL node. (lookup_modifier_cl): Now uses information from WFL nodes. (process_imports): Likewise. (read_import_dir): name and cl arguments replaced by a single WFL ! node. Function modified accordingly. (find_in_imports_on_demand): Now uses WFL node. (check_pkg_class_access): cl argument is now a WFL node. (declare_local_variables): Fixed to use WFL nodes. (resolve_expression_name): Likewise. (build_method_invocation_stmt): name_combo argument renamed ! wfl. Function modified to use WFL nodes. (build_invoke): cl used as a WFL node when calling build_expr_wfl. (lookup_method_invoke): cl is now a WFL node. Added missing ! IDENTIFIER_POINTER to class type decl name. Tue Apr 14 15:23:29 1998 Dave Brolley --- 12391,12466 ---- wrong modifier. (exit_java_complete_class): Removed a commented out statement. (struct parser_ctxt): Added comments on fields. modifier_ctx is ! now an array of tree nodes. Deleted fields line_list and ! e_line. New field elc, to replace e_line. * parse.y (array_type:): Build WFL node. (qualified_name:): Build a single WFL node out of two. Retain ! the location information of the first node in the resulting node. (package_declaration:): Use package name as a WFL node (single_type_import_declaration:): Use imported name as a WFL node. (type_import_on_demand_declaration:): Use root of the imported ! packages as a WFL node. (field_declaration:): Removed unused local variable cl. (method_declaration:): Don't call JAVA_MODIFIER_CTX_UNMARK. (yyerror): New static elc. Removed static error_line, error_pos. ! New local code_from_source. Save ctxp->elc into elc at the first ! pass. Call java_get_line_col to get a string of the line where ! the error occurred. (debug_line): Removed static function. (parse_error_context, parse_warning_context): Parameter cl is now ! a WFL node. Use its value to initialize ctxp->elc. (redefinition_error): Parameter cl is now a WFL node. (parse_add_interface): New parameter wfl. No longer call ! lookup_cl, use wfl instead. (check_class_interface_creation): Parameter cl is now a WFL node. (maybe_create_class_interface_decl): Likewise. (add_superinterfaces): New function. (create_interface): Removed local cl, node, super_decl, ! super_decl_type. Function now uses id as a WFL node. Better ! warning/error report on obsolete or forbidden mix of ! modifiers. Now calls add_superinterfaces to register interfaces. (create_class): Removed local cl, node. Local variable id is used ! as a WFL node. Better error report on forbidden modifier ! mix. Uses add_superinterfaces to register interfaces. (find_field): Argument cl is now a WFL node. Now store the WFL ! node of a fields that needs to be checked for their ! initialization. (method_header): Local variable node non longer used. Local ! variable id replaces cl. (check_modifiers_consistency): Local variable cl is now a WFL ! node. (method_declarator): Local variable cl replaced by parameter id. (parser_qualified_name): Now uses parameter name as a WFL node. (parser_check_super_interface): New parameter wfl, for achieve ! greater accuracy during error reports. (parser_chain_incomplete_item): New parameter named location. Used, ! along the decl, to construct the incomplete item node. (java_complete_class): resolve_class now uses WFL node extracted ! from the incomplete item node. Macro IC_TYPE replaces TREE_PURPOSE where appropriate. (complete_method_decl): Unresolved function's argument types are WFL. (resolve_class): Parameter cl is now a WFL node. (resolve_and_layout): Likewise. (do_resolve_class): Likewise. Try first to use cl and then do the ! lookup on the decl when calling check_pkg_class_access. (complete_class_report_errors): Use IC_TYPE in place of ! TREE_PURPOSE where appropriate. Use DEPEND_WFL on dependency ! instead of doing a lookup over the decl. (java_check_final): Use WFL info from field tree list. (lookup_cl): Rewritten and returns a statically defined WFL node. (lookup_modifier_cl): Now uses information from WFL nodes. (process_imports): Likewise. (read_import_dir): name and cl arguments replaced by a single WFL ! node. Function modified accordingly. (find_in_imports_on_demand): Now uses WFL node. (check_pkg_class_access): cl argument is now a WFL node. (declare_local_variables): Fixed to use WFL nodes. (resolve_expression_name): Likewise. (build_method_invocation_stmt): name_combo argument renamed ! wfl. Function modified to use WFL nodes. (build_invoke): cl used as a WFL node when calling build_expr_wfl. (lookup_method_invoke): cl is now a WFL node. Added missing ! IDENTIFIER_POINTER to class type decl name. Tue Apr 14 15:23:29 1998 Dave Brolley *************** Thu Apr 9 16:10:56 1998 Alexandre Peti *** 10612,10638 **** (method_declaration:): Uses ctxp->parser_ccb_indent instead of pl. (block:): Likewise. (labeled_statement_nsi:): Generate debug info when reducing ! expression_statement:. (check_pkg_class_access): get_access_flags_from_decl invokation ! fixed for new CLASS_* flags location. (source_end_java_method): Save/restore parser context when ! entering/leaving this routine. Restore lineno to its right value ! before calling expand_end_bindings. (build_method_invocation_stmt): build_invoke called with the ! current line information. (build_invoke): New argument cl. Wrap the function call around a ! wfl node. (refine_accessible_methods_list): Changed comment, removed ! unnecessary code. * parse.h: Fixed typo in comments. (CLASS_OR_INTERFACE): Handle the new CLASS_* flags location. (JAVA_MAYBE_GENERATE_DEBUG_INFO): New macro. (struct parser_ctxt): New fields ccb_indent, last_ccb_indent1, ! parser_ccb_indent. * lex.c (java_lex): Record the last closing curly bracket of a ! function. * jcf-parse.c (jcf_parse_source): Now calls ! java_check_methods. Clarified comment, fixed typo. 1998-04-09 Dave Brolley --- 12481,12507 ---- (method_declaration:): Uses ctxp->parser_ccb_indent instead of pl. (block:): Likewise. (labeled_statement_nsi:): Generate debug info when reducing ! expression_statement:. (check_pkg_class_access): get_access_flags_from_decl invokation ! fixed for new CLASS_* flags location. (source_end_java_method): Save/restore parser context when ! entering/leaving this routine. Restore lineno to its right value ! before calling expand_end_bindings. (build_method_invocation_stmt): build_invoke called with the ! current line information. (build_invoke): New argument cl. Wrap the function call around a ! wfl node. (refine_accessible_methods_list): Changed comment, removed ! unnecessary code. * parse.h: Fixed typo in comments. (CLASS_OR_INTERFACE): Handle the new CLASS_* flags location. (JAVA_MAYBE_GENERATE_DEBUG_INFO): New macro. (struct parser_ctxt): New fields ccb_indent, last_ccb_indent1, ! parser_ccb_indent. * lex.c (java_lex): Record the last closing curly bracket of a ! function. * jcf-parse.c (jcf_parse_source): Now calls ! java_check_methods. Clarified comment, fixed typo. 1998-04-09 Dave Brolley *************** Fri Apr 3 13:22:41 1998 Per Bothner < *** 10667,10747 **** Thu Mar 19 16:59:16 1998 Alexandre Petit-Bianco * parse.y (build_method_invocation_stmt): Removed extra argument ! to build_invoke. Mon Mar 16 17:25:19 1998 Alexandre Petit-Bianco * expr.c (dtable_indent): Now static global. (expand_invoke): Now call invoke_build_dtable and ! build_invokevirtual. (invoke_build_dtable, build_invokevirtual): New functions. * jcf-io.c (find_class): Defer issuing a warning by setting ! jcf->outofsynch to 1. * jcf-parse.c (jcf_out_of_synch): New function. (load_class): Test this_jcf.outofsynch flag and call ! jcf_out_of_synch accordingly. * jcf.h: (typedef struct JCF): New flag outofsynch. Fixed typo in ! comment indentation. * lex.c (java_get_unicode): Fixed code indentation. (java_lex): Create string literal. Fixed typo. Removed several ! premature obstack_free. * parse.h: New enums for name resolution and invocation mode. (struct qualification): New data structure. (RESOLVE_CHAIN_REMAINDER, BUILD_PTR_FROM_NAME): New macros. (do_resolve_class, build_method_invocation_stmt, ! breakdown_qualified, qualify_ambiguous_name, resolve_and_layout, ! debug_line, identical_subpath_p, invocation_mode, ! refine_accessible_methods_list, build_invoke, ! lookup_method_invoke): New functions declared. (build_invokevirtual, invoke_build_dtable, match_java_method, ! build_field_ref, jcf_out_of_synch): New references to external ! functions. (struct parse_ctxt): Removed artificial_constructor field. * parse.y: (array_type:): Type defined for this rule. (class_type:): Installed default rule for interface_type:. (array_type:): Now build Java array type. (qualified_name:): Now use obstack_grow0. (method_declaration:): Skip the artificial constructor added to ! the list, if any. (abstract_method_declaration:): Execute the code only during pass 1. (block:): Installed default rule in block_statements:. (block_statement:): Add the statement to the method during pass 2. (statement_expression): Installed default rule for ! method_invocation:. (argument_list:): Added code to build the argument list. ! (method_invocation:): Added call to create the method invocation ! node. (yyerror): Now use obstack_grow0. Removed bogus obstack_free. (debug_line): New function for debug. (complete_class_decl): No longer do something during pass 1. (method_header): Use BUILD_PTR_FROM_NAME. (parser_qualified_classname): Use obstack_grow0. Removed bogus ! obstack_free. (parser_chain_incomplete_item): Use BUILD_PTR_FROM_NAME. Modified ! function's main comment. (java_complete_class): Set CLASS_LOADED_P on all fixed incomplete ! classes. (complete_method_decl): Use BUILD_PTR_FROM_NAME and promote types. (resolve_class): Now works with arrays. (do_resolve_class, resolve_and_layout): New functions. (java_check_regular_methods): Reverse method list before and after ! having processed it. No longer set ctxp->artificial_constructor. (read_import_dir): Test jcf->outofsynch and call jcf_out_of_synch ! accordingly. Fixed typo in issued error message. Now use ! obstack_grow0. (find_in_imports_on_demand): Now use obstack_grow0. (declare_local_variables): Use BUILD_PTR_FROM_NAME. (source_end_java_method): Call expand_expr_stmt instead of ! expand_expr. Calls it before calling expand_function_end. (java_method_add_stmt): Do nothing if errors were found during ! parsing. (java_layout_parsed_class): Set CLASS_LOADED_P and fixed typo. (build_method_invocation_stmt, build_invoke, invocation_mode, ! lookup_method_invoke, refine_accessible_methods_list, ! qualify_ambiguous_name, breakdown_qualified, identical_subpath_p): ! New functions. * typeck.c (build_java_signature): Properly end method signature ! if return type skipped. (match_java_method): New function. Mon Mar 16 10:40:47 1998 Per Bothner --- 12536,12616 ---- Thu Mar 19 16:59:16 1998 Alexandre Petit-Bianco * parse.y (build_method_invocation_stmt): Removed extra argument ! to build_invoke. Mon Mar 16 17:25:19 1998 Alexandre Petit-Bianco * expr.c (dtable_indent): Now static global. (expand_invoke): Now call invoke_build_dtable and ! build_invokevirtual. (invoke_build_dtable, build_invokevirtual): New functions. * jcf-io.c (find_class): Defer issuing a warning by setting ! jcf->outofsynch to 1. * jcf-parse.c (jcf_out_of_synch): New function. (load_class): Test this_jcf.outofsynch flag and call ! jcf_out_of_synch accordingly. * jcf.h: (typedef struct JCF): New flag outofsynch. Fixed typo in ! comment indentation. * lex.c (java_get_unicode): Fixed code indentation. (java_lex): Create string literal. Fixed typo. Removed several ! premature obstack_free. * parse.h: New enums for name resolution and invocation mode. (struct qualification): New data structure. (RESOLVE_CHAIN_REMAINDER, BUILD_PTR_FROM_NAME): New macros. (do_resolve_class, build_method_invocation_stmt, ! breakdown_qualified, qualify_ambiguous_name, resolve_and_layout, ! debug_line, identical_subpath_p, invocation_mode, ! refine_accessible_methods_list, build_invoke, ! lookup_method_invoke): New functions declared. (build_invokevirtual, invoke_build_dtable, match_java_method, ! build_field_ref, jcf_out_of_synch): New references to external ! functions. (struct parse_ctxt): Removed artificial_constructor field. * parse.y: (array_type:): Type defined for this rule. (class_type:): Installed default rule for interface_type:. (array_type:): Now build Java array type. (qualified_name:): Now use obstack_grow0. (method_declaration:): Skip the artificial constructor added to ! the list, if any. (abstract_method_declaration:): Execute the code only during pass 1. (block:): Installed default rule in block_statements:. (block_statement:): Add the statement to the method during pass 2. (statement_expression): Installed default rule for ! method_invocation:. (argument_list:): Added code to build the argument list. ! (method_invocation:): Added call to create the method invocation ! node. (yyerror): Now use obstack_grow0. Removed bogus obstack_free. (debug_line): New function for debug. (complete_class_decl): No longer do something during pass 1. (method_header): Use BUILD_PTR_FROM_NAME. (parser_qualified_classname): Use obstack_grow0. Removed bogus ! obstack_free. (parser_chain_incomplete_item): Use BUILD_PTR_FROM_NAME. Modified ! function's main comment. (java_complete_class): Set CLASS_LOADED_P on all fixed incomplete ! classes. (complete_method_decl): Use BUILD_PTR_FROM_NAME and promote types. (resolve_class): Now works with arrays. (do_resolve_class, resolve_and_layout): New functions. (java_check_regular_methods): Reverse method list before and after ! having processed it. No longer set ctxp->artificial_constructor. (read_import_dir): Test jcf->outofsynch and call jcf_out_of_synch ! accordingly. Fixed typo in issued error message. Now use ! obstack_grow0. (find_in_imports_on_demand): Now use obstack_grow0. (declare_local_variables): Use BUILD_PTR_FROM_NAME. (source_end_java_method): Call expand_expr_stmt instead of ! expand_expr. Calls it before calling expand_function_end. (java_method_add_stmt): Do nothing if errors were found during ! parsing. (java_layout_parsed_class): Set CLASS_LOADED_P and fixed typo. (build_method_invocation_stmt, build_invoke, invocation_mode, ! lookup_method_invoke, refine_accessible_methods_list, ! qualify_ambiguous_name, breakdown_qualified, identical_subpath_p): ! New functions. * typeck.c (build_java_signature): Properly end method signature ! if return type skipped. (match_java_method): New function. Mon Mar 16 10:40:47 1998 Per Bothner *************** Wed Feb 25 08:55:49 1998 Alexandre Peti *** 10756,10817 **** * java-tree.h (struct lang_decl): New field function_decl_body. (DECL_FUNCTION_BODY): New macro. * jcf-parse.c (jcf_parse_source): Deeper check before setting ! CLASS_FROM_SOURCE_P. (parse_source_file): Fixed typos. Call java_layout_parsed_class before starting pass 2. Call to java_generate_parsed_class replaced by java_register_parsed_class. * lex.c: Fixed typo in header. Some line width related formating. * lex.h: Some line width related formating. * parse.h (source_end_java_method, resolve_expression_name, ! complete_class_decl, maybe_create_class_interface_decl, ! check_class_interface_creation): New static function declarations. (java_layout_parsed_class, java_method_add_stmt): New function ! declarations. (struct parser_ctxt): Field mark_class_generate removed. New ! fields class_list and artificial_constructor. * parse.y: Fixed typo in header. (class_declaration:): Call complete_class_decl when class body ! parsed. (method_declaration:): Call source_end_java_method in pass 2 when the method body is defined. (postfix_expression:): Do expression name resolution on sub-rule ! name during pass 2. (create_class, create_interface): Merged common pieces. ! (check_class_interface_creation, maybe_create_class_interface_decl): New functions. (complete_class_decl): New function. (register_fields): Fixed line width related typo. (method_header): Correctly skip first argument when fixing ! argument line. Changed the loop. (java_check_circular_reference): Now use ctxp->class_list. (java_complete_class): Removed start/stop marking. (java_check_regular_methods): Now takes a class decl as an ! argument. Add default constructor if none were encountered. (java_check_methods): Now use ctxp->class_list. Changed call to ! java_check_regular_methods. (source_start_java_method): Set DECL_ARG_TYPE for each function ! arguments. (source_end_java_method, java_method_add_stmt): New functions. (java_generate_parsed_class): No longer exists. ! (java_layout_parsed_class, java_register_parsed_class): New functions. (resolve_expression_name): New function. Thu Feb 12 11:54:28 1998 Alexandre Petit-Bianco * jcf-parse.c: (parse_source_file): Check on errors after init lex. * lex.c: (java_init_lex): Defer ctxp->java_pass initialization ! until pass initializations are done. Call read_import_dir with ! pass set to 0. * parse.h: (lookup_modifier_cl): New function declared. (INTERFACE_FIELD_MODIFIERS): New macro. (OBSOLETE_MODIFIER_WARNING): New macro. * parse.y: (register_fields): Class type and current field name in ! local variables. Check modifier(s) if adding field(s) to an interface. (check_abstract_method_header): Now use OBSOLETE_MODIFIER_WARNING ! and report errors using the faulty modifier line context. (lookup_modifier_cl): New function. (read_import_dir): Detect and report default import processing ! failure. 1998-02-11 Brendan Kehoe --- 12625,12686 ---- * java-tree.h (struct lang_decl): New field function_decl_body. (DECL_FUNCTION_BODY): New macro. * jcf-parse.c (jcf_parse_source): Deeper check before setting ! CLASS_FROM_SOURCE_P. (parse_source_file): Fixed typos. Call java_layout_parsed_class before starting pass 2. Call to java_generate_parsed_class replaced by java_register_parsed_class. * lex.c: Fixed typo in header. Some line width related formating. * lex.h: Some line width related formating. * parse.h (source_end_java_method, resolve_expression_name, ! complete_class_decl, maybe_create_class_interface_decl, ! check_class_interface_creation): New static function declarations. (java_layout_parsed_class, java_method_add_stmt): New function ! declarations. (struct parser_ctxt): Field mark_class_generate removed. New ! fields class_list and artificial_constructor. * parse.y: Fixed typo in header. (class_declaration:): Call complete_class_decl when class body ! parsed. (method_declaration:): Call source_end_java_method in pass 2 when the method body is defined. (postfix_expression:): Do expression name resolution on sub-rule ! name during pass 2. (create_class, create_interface): Merged common pieces. ! (check_class_interface_creation, maybe_create_class_interface_decl): New functions. (complete_class_decl): New function. (register_fields): Fixed line width related typo. (method_header): Correctly skip first argument when fixing ! argument line. Changed the loop. (java_check_circular_reference): Now use ctxp->class_list. (java_complete_class): Removed start/stop marking. (java_check_regular_methods): Now takes a class decl as an ! argument. Add default constructor if none were encountered. (java_check_methods): Now use ctxp->class_list. Changed call to ! java_check_regular_methods. (source_start_java_method): Set DECL_ARG_TYPE for each function ! arguments. (source_end_java_method, java_method_add_stmt): New functions. (java_generate_parsed_class): No longer exists. ! (java_layout_parsed_class, java_register_parsed_class): New functions. (resolve_expression_name): New function. Thu Feb 12 11:54:28 1998 Alexandre Petit-Bianco * jcf-parse.c: (parse_source_file): Check on errors after init lex. * lex.c: (java_init_lex): Defer ctxp->java_pass initialization ! until pass initializations are done. Call read_import_dir with ! pass set to 0. * parse.h: (lookup_modifier_cl): New function declared. (INTERFACE_FIELD_MODIFIERS): New macro. (OBSOLETE_MODIFIER_WARNING): New macro. * parse.y: (register_fields): Class type and current field name in ! local variables. Check modifier(s) if adding field(s) to an interface. (check_abstract_method_header): Now use OBSOLETE_MODIFIER_WARNING ! and report errors using the faulty modifier line context. (lookup_modifier_cl): New function. (read_import_dir): Detect and report default import processing ! failure. 1998-02-11 Brendan Kehoe *************** Wed Feb 11 11:27:59 1998 Alexandre Peti *** 10830,10836 **** (layout_class): Likewise. (layout_class): Detect and lay out classes defined in source code. (interface_of_p, add_interface_do, may_add_interface): New ! function. (add_interface): Now use add_interface_do. (add_method_1): New function. (add_method): Now use add_method_1. --- 12699,12705 ---- (layout_class): Likewise. (layout_class): Detect and lay out classes defined in source code. (interface_of_p, add_interface_do, may_add_interface): New ! function. (add_interface): Now use add_interface_do. (add_method_1): New function. (add_method): Now use add_method_1. *************** Wed Feb 11 11:27:59 1998 Alexandre Peti *** 10840,10876 **** * expr.c (lookup_field): Call to load_class uses extra VERBOSE arg. (expand_invoke): Likewise and fixed typo. *gjava.c: (print_super_field): Use new argument to find_class ! DO_CLASS_FILE. (main): Likewise. *java-tree.h: (CLASS_FROM_SOURCE_P): New flag on RECORD_TYPE. ! (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P, IS_A_CLASSFILE_NAME, ! QUALIFIED_P, IS_AN_IMPORT_ON_DEMAND_P): New flags on ! IDENTIFIER_NODE. ! (CLASS_COMPLETE_P): New flag on TYPE_DECL. (add_method_1, push_class): New prototypes. *jcf-dump.c: find_class now uses new DO_CLASS_FILE argument. *jcf-io.c: (open_in_zip): jcf now stores a pointer to the Zip ! directory where the class was found. (find_class): New argument DO_CLASS_FILE. Function find_class ! modified accordingly. *jcf-parse.c: (fix_class_path): New function. (load_class): Use new VERBOSE argument. load_class now finds and ! loads/parses .class/.java files. Save read_state of current_jcf if necessary. (java_parser_abort_on_error): New macro. (jcf_parse_source, parse_source_file): New function. (jcf_parse): Fixed typo. (yyparse): Call parse_source_file () only. (process_zip_dir): Fixed typo, fix zdir->filename_length when ! writing the real class name back in the zip directory entry. (find_in_current_zip): IDENTIFIER_CLASS_VALUE may be null. (jcf_figure_file_type): Fixed bogus alloc and bcopy. *jcf.h: (typedef struct JCF): New fields java_source and zipd. (find_class): Prototype fixed. *lex.c: Added 1998 time stamp. Removed all static global variables, moved into the parser ! context data structure.. Now include unistd.h if SEEK_SET not ! defined. (java_init_lex): Rewritten. (java_sneak_unicode): Modified current unicode access in current line. (java_unget_unicode): Likewise. --- 12709,12745 ---- * expr.c (lookup_field): Call to load_class uses extra VERBOSE arg. (expand_invoke): Likewise and fixed typo. *gjava.c: (print_super_field): Use new argument to find_class ! DO_CLASS_FILE. (main): Likewise. *java-tree.h: (CLASS_FROM_SOURCE_P): New flag on RECORD_TYPE. ! (IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P, IS_A_CLASSFILE_NAME, ! QUALIFIED_P, IS_AN_IMPORT_ON_DEMAND_P): New flags on ! IDENTIFIER_NODE. ! (CLASS_COMPLETE_P): New flag on TYPE_DECL. (add_method_1, push_class): New prototypes. *jcf-dump.c: find_class now uses new DO_CLASS_FILE argument. *jcf-io.c: (open_in_zip): jcf now stores a pointer to the Zip ! directory where the class was found. (find_class): New argument DO_CLASS_FILE. Function find_class ! modified accordingly. *jcf-parse.c: (fix_class_path): New function. (load_class): Use new VERBOSE argument. load_class now finds and ! loads/parses .class/.java files. Save read_state of current_jcf if necessary. (java_parser_abort_on_error): New macro. (jcf_parse_source, parse_source_file): New function. (jcf_parse): Fixed typo. (yyparse): Call parse_source_file () only. (process_zip_dir): Fixed typo, fix zdir->filename_length when ! writing the real class name back in the zip directory entry. (find_in_current_zip): IDENTIFIER_CLASS_VALUE may be null. (jcf_figure_file_type): Fixed bogus alloc and bcopy. *jcf.h: (typedef struct JCF): New fields java_source and zipd. (find_class): Prototype fixed. *lex.c: Added 1998 time stamp. Removed all static global variables, moved into the parser ! context data structure.. Now include unistd.h if SEEK_SET not ! defined. (java_init_lex): Rewritten. (java_sneak_unicode): Modified current unicode access in current line. (java_unget_unicode): Likewise. *************** Wed Feb 11 11:27:59 1998 Alexandre Peti *** 10881,10952 **** (java_get_unicode): Now use the parser context. (java_lineterminator): Likewise. (java_lex): Now used java_lval argument (pointer to YYSTYPE), part ! of the reentrant parser implementation. Function now use the ! parser context data structure and java_lval. Fixed production of ! the float and double constant "out of range" error message. Fixed ! obstack use. Return integer value when hitting a modifier. Now ! return type for TRUE, FALSE and other predefined types. Return ! identifier as a TREE_LIST list containing the current line context ! as the TREE_VALUE sub-node. (java_unicode_2_utf8): Fixed typo in declaration. (java_lex_error): Now use the parser context data structure. *lex.h: Added 1998 time stamp. (struct java_line): New fields ref_count and next. (JAVA_LINE_CHECK, JAVA_LINE_MARK, JAVA_LINE_CHAIN, ! JAVA_LINE_UNMARK, ID_NAME, ID_CL): New macros. (JAVA_FLOAT_RANGE_ERROR, JAVA_INTEGRAL_RANGE_ERROR, UNGETC): Fixed. *parse.h: Added 1998 time stamp. (java_parse_source_file): Renamed from parse_source_file. (YYERROR_NOW, YYNOT_TWICE): Fixed. (CLASS_MODIFIERS, FIELD_MODIFIERS, METHOD_MODIFIERS, ! INTERFACE_MODIFIER, INTERFACE_METHOD_MODIFIERS, ! JAVA_MODIFIER_CTX_UNMARK, IC_DECL, IC_DEPEND, DEPEND_DECL, ! THIS_MODIFIER_ONLY, ABSTRACT_CHECK, BEGIN_ONLY_PASS, ! END_ONLY_PASS, ELSE_ONLY_PASS, exit_java_complete_class, ! CLASS_OR_INTERFACE, INCOMPLETE_P): New macros. (struct parser_ctxt): New data structure to keep the parser context. *parse.y: Added 1998 time stamp, got rid of static global variables. (java_error_count, ctxp): New global variables. (%union): New value field. (numeric_type, integral_type): Rules removed. (primitive_type): Rule defined to handle integral, float, double and ! boolean types. (qualified_name, package_declaration, ! single_type_import_declaration, type_import_on_demand_declaration, ! modifiers, class_declaration, super, interfaces, ! interface_type_list, class_body, field_declaration, ! field_declaration, variable_declarators, variable_declarator, ! variable_declarator_id, method_declaration, method_header, ! formal_parameter_list, formal_parameter, method_body, block, ! static, interface_declaration, extends_interfaces, ! abstract_method_declaration, local_variable_declarators): Rules now ! define actions. (force_error, do_warning): New global statics. (push_parser_context, parser_context_save_global, ! parser_context_restore_global, pop_parser_context): New functions. (yyerror): Now uses the global parser context. Fixed use of obstack. (parse_error, parse_error_context, parse_warning_context, ! java_accstring_lookup, redefinition_error, check_modifiers, ! parser_add_interface, create_interface, create_class, find_field, ! duplicate_declaration_error, register_fields, method_header, ! check_modifiers_consistency, check_abstract_method_header, ! method_declarator, parser_qualified_classname, ! parser_check_super_interface, parser_check_super, ! parser_chain_incomplete_item, java_check_circular_reference, ! layout_class_from_source, java_complete_class, ! complete_method_decl, resolve_class, complete_class_report_errors, ! java_check_final, check_method_redefinition, ! java_check_regular_methods, java_check_abstract_methods, ! java_check_methods, lookup_java_interface_method2, ! lookup_java_method2, lookup_cl, find_name_in_single_imports, ! process_imports, find_in_imports, read_import_entry, ! read_import_dir, find_in_imports_on_demand, ! check_pkg_class_access, not_builtin_p, declare_local_variables, ! source_start_java_method, java_generate_parsed_class): New ! functions. *typeck.c: (signature_include_return): New global variable. (build_java_signature): Use SIGNATURE_INCLUDE_RETURN figure whether ! to add the function returned type in the signature. 1998-02-09 Brendan Kehoe --- 12750,12821 ---- (java_get_unicode): Now use the parser context. (java_lineterminator): Likewise. (java_lex): Now used java_lval argument (pointer to YYSTYPE), part ! of the reentrant parser implementation. Function now use the ! parser context data structure and java_lval. Fixed production of ! the float and double constant "out of range" error message. Fixed ! obstack use. Return integer value when hitting a modifier. Now ! return type for TRUE, FALSE and other predefined types. Return ! identifier as a TREE_LIST list containing the current line context ! as the TREE_VALUE sub-node. (java_unicode_2_utf8): Fixed typo in declaration. (java_lex_error): Now use the parser context data structure. *lex.h: Added 1998 time stamp. (struct java_line): New fields ref_count and next. (JAVA_LINE_CHECK, JAVA_LINE_MARK, JAVA_LINE_CHAIN, ! JAVA_LINE_UNMARK, ID_NAME, ID_CL): New macros. (JAVA_FLOAT_RANGE_ERROR, JAVA_INTEGRAL_RANGE_ERROR, UNGETC): Fixed. *parse.h: Added 1998 time stamp. (java_parse_source_file): Renamed from parse_source_file. (YYERROR_NOW, YYNOT_TWICE): Fixed. (CLASS_MODIFIERS, FIELD_MODIFIERS, METHOD_MODIFIERS, ! INTERFACE_MODIFIER, INTERFACE_METHOD_MODIFIERS, ! JAVA_MODIFIER_CTX_UNMARK, IC_DECL, IC_DEPEND, DEPEND_DECL, ! THIS_MODIFIER_ONLY, ABSTRACT_CHECK, BEGIN_ONLY_PASS, ! END_ONLY_PASS, ELSE_ONLY_PASS, exit_java_complete_class, ! CLASS_OR_INTERFACE, INCOMPLETE_P): New macros. (struct parser_ctxt): New data structure to keep the parser context. *parse.y: Added 1998 time stamp, got rid of static global variables. (java_error_count, ctxp): New global variables. (%union): New value field. (numeric_type, integral_type): Rules removed. (primitive_type): Rule defined to handle integral, float, double and ! boolean types. (qualified_name, package_declaration, ! single_type_import_declaration, type_import_on_demand_declaration, ! modifiers, class_declaration, super, interfaces, ! interface_type_list, class_body, field_declaration, ! field_declaration, variable_declarators, variable_declarator, ! variable_declarator_id, method_declaration, method_header, ! formal_parameter_list, formal_parameter, method_body, block, ! static, interface_declaration, extends_interfaces, ! abstract_method_declaration, local_variable_declarators): Rules now ! define actions. (force_error, do_warning): New global statics. (push_parser_context, parser_context_save_global, ! parser_context_restore_global, pop_parser_context): New functions. (yyerror): Now uses the global parser context. Fixed use of obstack. (parse_error, parse_error_context, parse_warning_context, ! java_accstring_lookup, redefinition_error, check_modifiers, ! parser_add_interface, create_interface, create_class, find_field, ! duplicate_declaration_error, register_fields, method_header, ! check_modifiers_consistency, check_abstract_method_header, ! method_declarator, parser_qualified_classname, ! parser_check_super_interface, parser_check_super, ! parser_chain_incomplete_item, java_check_circular_reference, ! layout_class_from_source, java_complete_class, ! complete_method_decl, resolve_class, complete_class_report_errors, ! java_check_final, check_method_redefinition, ! java_check_regular_methods, java_check_abstract_methods, ! java_check_methods, lookup_java_interface_method2, ! lookup_java_method2, lookup_cl, find_name_in_single_imports, ! process_imports, find_in_imports, read_import_entry, ! read_import_dir, find_in_imports_on_demand, ! check_pkg_class_access, not_builtin_p, declare_local_variables, ! source_start_java_method, java_generate_parsed_class): New ! functions. *typeck.c: (signature_include_return): New global variable. (build_java_signature): Use SIGNATURE_INCLUDE_RETURN figure whether ! to add the function returned type in the signature. 1998-02-09 Brendan Kehoe *************** Fri Dec 12 19:18:42 1997 Per Bothner < *** 11015,11027 **** Thu Dec 4 13:22:59 1997 Alexandre Petit-Bianco * keyword.h: New file, output of keyword.gperf as processed by ! gperf. * lex.c (java_lex_init): Initialize java_error_flag. * parse.c (YYERROR_NOW): Uses java_error_flag. * parse.y: New static java_error_flag. Useless definition of ! buffer_error gone. * parse.y (java_error): Portable error recovery using ! java_error_flag (not yet completely tuned). 1997-12-04 Brendan Kehoe --- 12884,12896 ---- Thu Dec 4 13:22:59 1997 Alexandre Petit-Bianco * keyword.h: New file, output of keyword.gperf as processed by ! gperf. * lex.c (java_lex_init): Initialize java_error_flag. * parse.c (YYERROR_NOW): Uses java_error_flag. * parse.y: New static java_error_flag. Useless definition of ! buffer_error gone. * parse.y (java_error): Portable error recovery using ! java_error_flag (not yet completely tuned). 1997-12-04 Brendan Kehoe *************** Wed Dec 3 18:37:42 1997 Alexandre Peti *** 11031,11037 **** * Makefile.in: (JAVA_OBJS): New object jcf-parse.o. (parse.c, lex.c, keyword.h): New rules for Java source code ! front-end. * parse.c: Renamed into jcf-parse.c. * jcf-parse.c (yyparse): Invoke the parser to process Java source code. * keyword.gperf: New file, Java keywords. --- 12900,12906 ---- * Makefile.in: (JAVA_OBJS): New object jcf-parse.o. (parse.c, lex.c, keyword.h): New rules for Java source code ! front-end. * parse.c: Renamed into jcf-parse.c. * jcf-parse.c (yyparse): Invoke the parser to process Java source code. * keyword.gperf: New file, Java keywords. *************** Wed Oct 22 19:39:05 1997 Per Bothner < *** 11075,11082 **** Tue Oct 21 15:09:02 1997 Alexandre Petit-Bianco * parse.c (process_zip_dir): Skip ZIP entries not bearing the ! .class extension in their name and fix thing so we don't process ! them parse_zip_file_entries(). (parse_zip_file_entries): Cleaned unused local variables. Mon Oct 20 14:52:42 1997 Per Bothner --- 12944,12951 ---- Tue Oct 21 15:09:02 1997 Alexandre Petit-Bianco * parse.c (process_zip_dir): Skip ZIP entries not bearing the ! .class extension in their name and fix thing so we don't process ! them parse_zip_file_entries(). (parse_zip_file_entries): Cleaned unused local variables. Mon Oct 20 14:52:42 1997 Per Bothner *************** Mon Oct 20 14:52:42 1997 Per Bothner < *** 11091,11098 **** Mon Oct 20 13:40:41 1997 Alexandre Petit-Bianco * jcf-reader.c, parse.c: (parse_zip_file, process_zip_dir, ! find_in_current_zip, jcf_figure_file_type): Moved from ! jcf-reader.c to parse.c. * zextract.c: (read_zip_archive): takes file_comment_length possible field into account. --- 12960,12967 ---- Mon Oct 20 13:40:41 1997 Alexandre Petit-Bianco * jcf-reader.c, parse.c: (parse_zip_file, process_zip_dir, ! find_in_current_zip, jcf_figure_file_type): Moved from ! jcf-reader.c to parse.c. * zextract.c: (read_zip_archive): takes file_comment_length possible field into account. *************** Fri Oct 17 15:56:37 1997 Per Bothner < *** 11108,11114 **** * java-tree.h (PUSH_FIELD): Set DECL_ARTIFICIAL. * class.c (make_class_data): Don't build fields_decl if no fields. ! When building fields_decl, skip if DECL_ARTIFICAL. * expr.c (java_stack_swap): Update stack_type_map. * verify.c (merge_types): Handle array types better. --- 12977,12983 ---- * java-tree.h (PUSH_FIELD): Set DECL_ARTIFICIAL. * class.c (make_class_data): Don't build fields_decl if no fields. ! When building fields_decl, skip if DECL_ARTIFICIAL. * expr.c (java_stack_swap): Update stack_type_map. * verify.c (merge_types): Handle array types better. *************** Wed Oct 15 18:09:45 1997 Per Bothner < *** 11125,11158 **** Wed Oct 15 17:04:50 1997 Alexandre Petit-Bianco * class.c (append_gpp_mangled_type): Use function argument ! unpromoted type to generate mangled name. Mon Oct 13 16:52:55 1997 Alexandre Petit-Bianco * constants.c (build_constant_data_ref): Now uses current_class ! instead of main_class. (build_constants_constructor): Now uses current_class instead of ! main_class. * zipfile.h: (struct ZipFileCache): Now defined here. Declaration ! of the global variable SeepZipFiles done here. * zextract.c (read_zip_archive): extra_field optional field taken ! into account while computing the position of the class file in the ! archive. * verify.c (verify_jvm_instructions): Use current_jcf to search ! the constant pool. * parse.c (load_class): First search for the class to load in the ! current zip file. Saves current_jcf (restored before returning ! from that function). Don't call JCF_FINISH in the class was found ! in the current ZIP file. (jcf_parse): If the class was found in the current ZIP file, save ! its tree_constant_pool (for later reuse). (parse_class_file): New function. Process each method defined in ! the current class and record the class as to be later registered. (yyparse): Rewritten. Figure the type of the current file and switch accordingly. * lang.c: New global variable current_jcf. (lang_init): Removed compiling_from_source test (done later, in ! yyparse). Removed call the jcf_parse (). * jcf.h (JCF_ZIP, JCF_CLASS, JCF_SOURCE): New defined values. (typedef struct JCF): New fields seen_in_zip (to mark a class found in the current ZIP file) and zip_offset (offset to the class data in --- 12994,13027 ---- Wed Oct 15 17:04:50 1997 Alexandre Petit-Bianco * class.c (append_gpp_mangled_type): Use function argument ! unpromoted type to generate mangled name. Mon Oct 13 16:52:55 1997 Alexandre Petit-Bianco * constants.c (build_constant_data_ref): Now uses current_class ! instead of main_class. (build_constants_constructor): Now uses current_class instead of ! main_class. * zipfile.h: (struct ZipFileCache): Now defined here. Declaration ! of the global variable SeepZipFiles done here. * zextract.c (read_zip_archive): extra_field optional field taken ! into account while computing the position of the class file in the ! archive. * verify.c (verify_jvm_instructions): Use current_jcf to search ! the constant pool. * parse.c (load_class): First search for the class to load in the ! current zip file. Saves current_jcf (restored before returning ! from that function). Don't call JCF_FINISH in the class was found ! in the current ZIP file. (jcf_parse): If the class was found in the current ZIP file, save ! its tree_constant_pool (for later reuse). (parse_class_file): New function. Process each method defined in ! the current class and record the class as to be later registered. (yyparse): Rewritten. Figure the type of the current file and switch accordingly. * lang.c: New global variable current_jcf. (lang_init): Removed compiling_from_source test (done later, in ! yyparse). Removed call the jcf_parse (). * jcf.h (JCF_ZIP, JCF_CLASS, JCF_SOURCE): New defined values. (typedef struct JCF): New fields seen_in_zip (to mark a class found in the current ZIP file) and zip_offset (offset to the class data in *************** Mon Oct 13 16:52:55 1997 Alexandre Peti *** 11160,11188 **** * jcf-reader.c: zipfile.h included. localToFile: New ZipFileCache static global variable (parse_zip_file_entries): New function. Browse the current ZIP ! file directory and process each class found. (process_zip_dir): New function. Register each class found in the ! ZIP file directory. The class aren't parsed but a valid JCF is ! link to each of them. (find_in_current_zip): New function. Search for a class in the ! current ZIP file directory. If found, prepare the class so that it ! can be loaded. (jcf_figure_file_type): New function. Examine the file structure ! to figure a class file, a ZIP file. If none of these categories are ! matched, a source file is assumed. * jcf-io.c: Removed definition of ZipFileCache (moved in zipfile.h). ! SeenZipFile: New global variable. (open_in_zip): Use zipmember's length to accelerate the search for ! a member. If zipmember was NULL and zip file successfully read, ! return 0. * java-tree.h: New global variable current_jcf declared. Added ! declaration for current_constant_pool_tags, current_constant_pool_data, current_constant_pool_length, current_constant_pool_data_ref. (struct lang_type): Augmented with two fields. struct JCF *jcf (to ! store the JCF of classes seen in a zip file) and tree *constant_pool (to save a loaded class constant pool). current_class declared here. * expr.c (expand_invoke): Use current_jcf instead of main_jcf to ! retrieve method_ref_constant. (PUSHC): java_push_constant_from_pool now uses current_jcf. (OBJECT): get_class_constant now uses current_jcf. (ARRAY_NEW_PTR): get_class_constant now uses current_jcf. --- 13029,13057 ---- * jcf-reader.c: zipfile.h included. localToFile: New ZipFileCache static global variable (parse_zip_file_entries): New function. Browse the current ZIP ! file directory and process each class found. (process_zip_dir): New function. Register each class found in the ! ZIP file directory. The class aren't parsed but a valid JCF is ! link to each of them. (find_in_current_zip): New function. Search for a class in the ! current ZIP file directory. If found, prepare the class so that it ! can be loaded. (jcf_figure_file_type): New function. Examine the file structure ! to figure a class file, a ZIP file. If none of these categories are ! matched, a source file is assumed. * jcf-io.c: Removed definition of ZipFileCache (moved in zipfile.h). ! SeenZipFile: New global variable. (open_in_zip): Use zipmember's length to accelerate the search for ! a member. If zipmember was NULL and zip file successfully read, ! return 0. * java-tree.h: New global variable current_jcf declared. Added ! declaration for current_constant_pool_tags, current_constant_pool_data, current_constant_pool_length, current_constant_pool_data_ref. (struct lang_type): Augmented with two fields. struct JCF *jcf (to ! store the JCF of classes seen in a zip file) and tree *constant_pool (to save a loaded class constant pool). current_class declared here. * expr.c (expand_invoke): Use current_jcf instead of main_jcf to ! retrieve method_ref_constant. (PUSHC): java_push_constant_from_pool now uses current_jcf. (OBJECT): get_class_constant now uses current_jcf. (ARRAY_NEW_PTR): get_class_constant now uses current_jcf. *************** Mon Oct 13 16:52:55 1997 Alexandre Peti *** 11192,11198 **** * class.c: New static global variable registered_class. (register_class): New function. (emit_register_class): Modified to use registered_class instead of ! main_class (is_compiled_class): Now take into account class seen in the archive. Mon Oct 6 12:03:23 1997 Per Bothner --- 13061,13067 ---- * class.c: New static global variable registered_class. (register_class): New function. (emit_register_class): Modified to use registered_class instead of ! main_class (is_compiled_class): Now take into account class seen in the archive. Mon Oct 6 12:03:23 1997 Per Bothner *************** Mon Oct 6 12:03:23 1997 Per Bothner < *** 11210,11216 **** Wed Oct 1 11:26:10 1997 Alexandre Petit-Bianco * zextract.c (read_zip_archive): Now takes into account the ! extra_field field. * expr.c (can_widen_reference_to): Modified to handle sub-interfaces. Sat Sep 20 12:44:28 1997 Per Bothner --- 13079,13085 ---- Wed Oct 1 11:26:10 1997 Alexandre Petit-Bianco * zextract.c (read_zip_archive): Now takes into account the ! extra_field field. * expr.c (can_widen_reference_to): Modified to handle sub-interfaces. Sat Sep 20 12:44:28 1997 Per Bothner *************** Wed Sep 17 13:15:23 1997 Per Bothner < *** 11233,11271 **** Wed Sep 17 11:02:41 1997 Alexandre Petit-Bianco * typeck.c (build_java_array_type): Temporary use ! permanent_obstack to create the array 'length' field. * expr.c (lookup_label): Temporay use permanent_obstack to create ! label if not found. * class.c (push_super_field): Tempory use permanent_obstack. Mon Sep 15 11:33:31 1997 Alexandre Petit-Bianco * typeck.c (type_for_mode): Now handles double_type_node and ! float_type_node. * verify.c (verify_jvm_instructions): The instruction following ! the wide bytecode is checked. OPCODE_ret added to the list of ! wide. Thu Sep 11 19:45:18 1997 Alexandre Petit-Bianco * class.c (make_class): Temporary use permanent_obstack. Set the ! class CLASS_P field to 1. (push_class): Temporary use permanent_obstack. (set_super_info): Temporary use permanent_obstack. (add_method): Temporary use permanent_obstack, set ! METHOD_TRANSIENT(). (add_field): Temporary use permanent_obstack. Sets ! FIELD_VOLATILE() and FIELD_TRANSIENT(). (build_class_ref): Temporary use permanent_obstack if the class ! isn't compiled. (build_static_field_ref): Temporary use permanent_obstack when ! creating field's rtl. (get_access_flags_from_decl): Handle ACC_VOLATILE, ACC_TRANSIENT, ! ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT flags for methods and fields. Function finalized, as far as flag handling. (push_class_static_dummy_field): Temporary use permanent_obstack. (emit_register_class): Force generation of class registration at ! -O3 or deeper. * decl.c (end_java_method): Call permanent_allocation() before returning. * expr.c (can_widen_reference_to): Added comment to interface --- 13102,13140 ---- Wed Sep 17 11:02:41 1997 Alexandre Petit-Bianco * typeck.c (build_java_array_type): Temporary use ! permanent_obstack to create the array 'length' field. * expr.c (lookup_label): Temporay use permanent_obstack to create ! label if not found. * class.c (push_super_field): Tempory use permanent_obstack. Mon Sep 15 11:33:31 1997 Alexandre Petit-Bianco * typeck.c (type_for_mode): Now handles double_type_node and ! float_type_node. * verify.c (verify_jvm_instructions): The instruction following ! the wide bytecode is checked. OPCODE_ret added to the list of ! wide. Thu Sep 11 19:45:18 1997 Alexandre Petit-Bianco * class.c (make_class): Temporary use permanent_obstack. Set the ! class CLASS_P field to 1. (push_class): Temporary use permanent_obstack. (set_super_info): Temporary use permanent_obstack. (add_method): Temporary use permanent_obstack, set ! METHOD_TRANSIENT(). (add_field): Temporary use permanent_obstack. Sets ! FIELD_VOLATILE() and FIELD_TRANSIENT(). (build_class_ref): Temporary use permanent_obstack if the class ! isn't compiled. (build_static_field_ref): Temporary use permanent_obstack when ! creating field's rtl. (get_access_flags_from_decl): Handle ACC_VOLATILE, ACC_TRANSIENT, ! ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT flags for methods and fields. Function finalized, as far as flag handling. (push_class_static_dummy_field): Temporary use permanent_obstack. (emit_register_class): Force generation of class registration at ! -O3 or deeper. * decl.c (end_java_method): Call permanent_allocation() before returning. * expr.c (can_widen_reference_to): Added comment to interface *************** Thu Sep 11 19:45:18 1997 Alexandre Peti *** 11278,11291 **** (java_push_constant_from_pool): Temporary use permanent_obstack for CONSTANT_string * parse.c (get_ref_constant): Temporary use permanent_obstack to ! create constant references. (get_constant): Temporary use permanent_obstack to create constant. (load_class): Temporary use permanent_obstack to load class. (jcf_parse): Temporary use permanent_obstack to perform class layout. * typeck.c: (parse_signature_string): Temporary use permanent_obstack. (build_java_signature): Temporary use permanent_obstack. ! * verify.c: (verify_jvm_instruction): removed unecessary verification on ACC_SUPER flag. * java-tree.h (METHOD_NATIVE, METHOD_TRANSIENT): Defined. (FIELD_VOLATILE, FIELD_TRANSIENT): Defined. --- 13147,13160 ---- (java_push_constant_from_pool): Temporary use permanent_obstack for CONSTANT_string * parse.c (get_ref_constant): Temporary use permanent_obstack to ! create constant references. (get_constant): Temporary use permanent_obstack to create constant. (load_class): Temporary use permanent_obstack to load class. (jcf_parse): Temporary use permanent_obstack to perform class layout. * typeck.c: (parse_signature_string): Temporary use permanent_obstack. (build_java_signature): Temporary use permanent_obstack. ! * verify.c: (verify_jvm_instruction): removed unnecessary verification on ACC_SUPER flag. * java-tree.h (METHOD_NATIVE, METHOD_TRANSIENT): Defined. (FIELD_VOLATILE, FIELD_TRANSIENT): Defined. *************** Wed Sep 10 16:09:23 1997 Per Bothner < *** 11316,11322 **** (merge_types): Remove unneeded suuport for TYPE_UNUSED. (verify_jvm_instructions): Only reset prev_eh_ranges (to force re-checking possible handlers) after a store (less wasted work). ! Check for null handler (finally) before calling add_handler. Various changes to (finally?) correctly handle try/finally. 1997-09-09 Brendan Kehoe --- 13185,13191 ---- (merge_types): Remove unneeded suuport for TYPE_UNUSED. (verify_jvm_instructions): Only reset prev_eh_ranges (to force re-checking possible handlers) after a store (less wasted work). ! Check for null handler (finally) before calling add_handler. Various changes to (finally?) correctly handle try/finally. 1997-09-09 Brendan Kehoe *************** Wed Sep 3 16:13:23 1997 Per Bothner < *** 11344,11350 **** * except.c: Add skeleton for EH code-generation. * verify.c (merge_types): Treat all promoted integral types as equal. * constants.c (build_constants_constructor): To force creation of ! current_constant_pool_data_ref, call build_constant_data_ref. * javaop.def (lload): Fix typo. * jcf-dump.c (main): Clear filename to prevent possibly-bad free. --- 13213,13219 ---- * except.c: Add skeleton for EH code-generation. * verify.c (merge_types): Treat all promoted integral types as equal. * constants.c (build_constants_constructor): To force creation of ! current_constant_pool_data_ref, call build_constant_data_ref. * javaop.def (lload): Fix typo. * jcf-dump.c (main): Clear filename to prevent possibly-bad free. *************** Wed Aug 27 18:33:04 1997 Per Bothner < *** 11365,11382 **** Wed Aug 27 13:26:58 1997 Alexandre Petit-Bianco * expr.c (verify_jvm_instructions): Started a thorough ! verification of invoke* bytecodes. (expand_byte_code): flush quick stack if PC is the target of a ! branch. and undef RET (conflicting with config/i386/i386.h). (expand_java_arrayload): Fixed bogus cast, when Boolean type is ! used. (expand_invoke): Now handles invokeinterface and do more ! verification according to the bytecode. (lookup_field): Don't try to load the class if processing ! dtable_type. (can_widen_reference_to): Now handles interfaces. * decl.c (init_decl_processing): New global variable ! soft_lookupinterfacemethod_node, declared in java-tree.h. Call set_super_info on string_type_node. * java-tree.h (CLASS_INTERFACE, CLASS_ABSTRACT, CLASS_SUPER): Now defined. --- 13234,13251 ---- Wed Aug 27 13:26:58 1997 Alexandre Petit-Bianco * expr.c (verify_jvm_instructions): Started a thorough ! verification of invoke* bytecodes. (expand_byte_code): flush quick stack if PC is the target of a ! branch. and undef RET (conflicting with config/i386/i386.h). (expand_java_arrayload): Fixed bogus cast, when Boolean type is ! used. (expand_invoke): Now handles invokeinterface and do more ! verification according to the bytecode. (lookup_field): Don't try to load the class if processing ! dtable_type. (can_widen_reference_to): Now handles interfaces. * decl.c (init_decl_processing): New global variable ! soft_lookupinterfacemethod_node, declared in java-tree.h. Call set_super_info on string_type_node. * java-tree.h (CLASS_INTERFACE, CLASS_ABSTRACT, CLASS_SUPER): Now defined. *************** Tue Aug 5 12:21:27 1997 Alexandre Peti *** 11514,11520 **** (JAVA_ARRAY_LENGTH_OFFSET, JAVA_ARRAY_DATA_OFFSET): Modified to Use The Right Things. (pop_type): Accept CHAR/BYTE/BOOLEAN/SHORT promoted type as ! compatible with INT. BOOLEAN is made equivalent to BYTE. (OPCODE_athrow, OPCODE_aconst_null, OPCODE_ifnull, OPCODE_ifnonnull): Now supported. (build_java_athrow): New function. --- 13383,13389 ---- (JAVA_ARRAY_LENGTH_OFFSET, JAVA_ARRAY_DATA_OFFSET): Modified to Use The Right Things. (pop_type): Accept CHAR/BYTE/BOOLEAN/SHORT promoted type as ! compatible with INT. BOOLEAN is made equivalent to BYTE. (OPCODE_athrow, OPCODE_aconst_null, OPCODE_ifnull, OPCODE_ifnonnull): Now supported. (build_java_athrow): New function. *************** Tue May 6 22:08:24 1997 Per Bothner < *** 11666,11672 **** * java-opcodes.h: Use javaop.def to avoid duplicated list. * javaop.def: Rename invokevirt -> invokevirtual. * lang.c (use_handles): Removed. ! * parse.c: Add support for ConstantValue atribute. Handle nested loading of a class. (JPOOL_UTF): New. Tue Mar 11 20:11:05 1997 Per Bothner --- 13535,13541 ---- * java-opcodes.h: Use javaop.def to avoid duplicated list. * javaop.def: Rename invokevirt -> invokevirtual. * lang.c (use_handles): Removed. ! * parse.c: Add support for ConstantValue attribute. Handle nested loading of a class. (JPOOL_UTF): New. Tue Mar 11 20:11:05 1997 Per Bothner diff -Nrc3pad gcc-3.0.4/gcc/java/Make-lang.in gcc-3.1/gcc/java/Make-lang.in *** gcc-3.0.4/gcc/java/Make-lang.in Wed Jul 18 17:02:18 2001 --- gcc-3.1/gcc/java/Make-lang.in Wed Apr 10 13:08:58 2002 *************** *** 1,6 **** # Top level makefile fragment for the GNU compiler for the Java(TM) # language. ! # Copyright (C) 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. #This file is part of GNU CC. --- 1,6 ---- # Top level makefile fragment for the GNU compiler for the Java(TM) # language. ! # Copyright (C) 1996, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. #This file is part of GNU CC. *************** *** 42,51 **** # - define the names for selecting the language in LANGUAGES. # Actual names to use when installing a native compiler. ! JAVA_INSTALL_NAME = `t='$(program_transform_name)'; echo gcj | sed $$t` # Actual names to use when installing a cross-compiler. ! JAVA_CROSS_NAME = `t='$(program_transform_cross_name)'; echo gcj | sed $$t` GCJ = gcj --- 42,51 ---- # - define the names for selecting the language in LANGUAGES. # Actual names to use when installing a native compiler. ! JAVA_INSTALL_NAME = `echo gcj|sed '$(program_transform_name)'` # Actual names to use when installing a cross-compiler. ! JAVA_CROSS_NAME = `echo gcj|sed '$(program_transform_cross_name)'` GCJ = gcj *************** GCJ = gcj *** 53,70 **** java: jc1$(exeext) $(GCJ)$(exeext) jvgenmain$(exeext) \ gcjh$(exeext) jv-scan$(exeext) jcf-dump$(exeext) ! # Define the name of target independant tools to be installed in $(bindir) # Names are subject to changes JAVA_TARGET_INDEPENDENT_BIN_TOOLS = gcjh jv-scan jcf-dump # Tell GNU make to ignore these if they exist. .PHONY: java ! jvspec.o: $(srcdir)/java/jvspec.c system.h $(GCC_H) $(CONFIG_H) (SHLIB_LINK='$(SHLIB_LINK)' \ SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \ ! $(INCLUDES) $(srcdir)/java/jvspec.c) # Create the compiler driver for $(GCJ). $(GCJ)$(exeext): gcc.o jvspec.o version.o \ --- 53,70 ---- java: jc1$(exeext) $(GCJ)$(exeext) jvgenmain$(exeext) \ gcjh$(exeext) jv-scan$(exeext) jcf-dump$(exeext) ! # Define the name of target independent tools to be installed in $(bindir) # Names are subject to changes JAVA_TARGET_INDEPENDENT_BIN_TOOLS = gcjh jv-scan jcf-dump # Tell GNU make to ignore these if they exist. .PHONY: java ! jvspec.o: $(srcdir)/java/jvspec.c $(SYSTEM_H) $(GCC_H) $(CONFIG_H) (SHLIB_LINK='$(SHLIB_LINK)' \ SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \ ! $(INCLUDES) $(srcdir)/java/jvspec.c $(OUTPUT_OPTION)) # Create the compiler driver for $(GCJ). $(GCJ)$(exeext): gcc.o jvspec.o version.o \ *************** $(GCJ)-cross$(exeext): $(GCJ)$(exeext) *** 77,83 **** -rm -f $(GCJ)-cross$(exeext) cp $(GCJ)$(exeext) $(GCJ)-cross$(exeext) ! $(INTL_TARGETS): $(srcdir)/java/parse.c $(srcdir)/java/parse-scan.c $(srcdir)/java/parse.c: $(srcdir)/java/parse.y $(BISON) -t --name-prefix=java_ $(BISONFLAGS) \ --- 77,83 ---- -rm -f $(GCJ)-cross$(exeext) cp $(GCJ)$(exeext) $(GCJ)-cross$(exeext) ! po-generated: $(srcdir)/java/parse.c $(srcdir)/java/parse-scan.c $(srcdir)/java/parse.c: $(srcdir)/java/parse.y $(BISON) -t --name-prefix=java_ $(BISONFLAGS) \ *************** $(srcdir)/java/parse-scan.c: $(srcdir)/ *** 90,96 **** $(srcdir)/java/keyword.h: $(srcdir)/java/keyword.gperf (cd $(srcdir)/java || exit 1; \ ! gperf -L C -F ', 0' -p -t -j1 -i 1 -g -o -N java_keyword -k1,4,$$ \ keyword.gperf > k$$$$.h || { \ echo "Please update gperf from ftp://ftp.gnu.org/pub/gnu/gperf/" >&2; \ rm -f k$$$$.h; \ --- 90,96 ---- $(srcdir)/java/keyword.h: $(srcdir)/java/keyword.gperf (cd $(srcdir)/java || exit 1; \ ! gperf -L C -C -F ', 0' -p -t -j1 -i 1 -g -o -N java_keyword -k1,4,$$ \ keyword.gperf > k$$$$.h || { \ echo "Please update gperf from ftp://ftp.gnu.org/pub/gnu/gperf/" >&2; \ rm -f k$$$$.h; \ *************** $(srcdir)/java/keyword.h: $(srcdir)/java *** 101,107 **** JAVA_OBJS = java/parse.o java/class.o java/decl.o java/expr.o \ java/constants.o java/lang.o java/typeck.o java/except.o java/verify.o \ java/zextract.o java/jcf-io.o java/jcf-parse.o java/mangle.o \ ! java/mangle_name.o \ java/jcf-write.o java/buffer.o java/check-init.o java/jcf-depend.o \ java/jcf-path.o java/xref.o java/boehm.o mkdeps.o --- 101,107 ---- JAVA_OBJS = java/parse.o java/class.o java/decl.o java/expr.o \ java/constants.o java/lang.o java/typeck.o java/except.o java/verify.o \ java/zextract.o java/jcf-io.o java/jcf-parse.o java/mangle.o \ ! java/mangle_name.o java/builtins.o \ java/jcf-write.o java/buffer.o java/check-init.o java/jcf-depend.o \ java/jcf-path.o java/xref.o java/boehm.o mkdeps.o *************** java.rest.encap: *** 149,154 **** --- 149,158 ---- java.info: $(srcdir)/java/gcj.info java.dvi: java/gcj.dvi + java.generated-manpages: $(srcdir)/java/gcj.1 $(srcdir)/java/gcjh.1 \ + $(srcdir)/java/jv-scan.1 $(srcdir)/java/jcf-dump.1 \ + $(srcdir)/java/gij.1 $(srcdir)/java/jv-convert.1 \ + $(srcdir)/java/rmic.1 $(srcdir)/java/rmiregistry.1 # Install hooks: # jc1, gcj, jvgenmain, and gcjh are installed elsewhere as part *************** java.dvi: java/gcj.dvi *** 157,163 **** # Nothing to do here. java.install-normal: ! java.install-common: -if [ -f $(GCJ)$(exeext) ]; then \ if [ -f $(GCJ)-cross$(exeext) ]; then \ rm -f $(bindir)/$(JAVA_CROSS_NAME)$(exeext); \ --- 161,167 ---- # Nothing to do here. java.install-normal: ! java.install-common: installdirs -if [ -f $(GCJ)$(exeext) ]; then \ if [ -f $(GCJ)-cross$(exeext) ]; then \ rm -f $(bindir)/$(JAVA_CROSS_NAME)$(exeext); \ *************** java.install-common: *** 170,179 **** fi ; \ fi ; \ for tool in $(JAVA_TARGET_INDEPENDENT_BIN_TOOLS); do \ if [ -f $$tool$(exeext) ]; then \ ! rm -f $(bindir)/$$tool$(exeext); \ ! $(INSTALL_PROGRAM) $$tool$(exeext) $(bindir)/$$tool$(exeext); \ ! chmod a+x $(bindir)/$$tool$(exeext); \ fi ; \ done --- 174,184 ---- fi ; \ fi ; \ for tool in $(JAVA_TARGET_INDEPENDENT_BIN_TOOLS); do \ + tool_transformed_name=`echo $$tool|sed '$(program_transform_name)'`; \ if [ -f $$tool$(exeext) ]; then \ ! rm -f $(bindir)/$$tool_transformed_name$(exeext); \ ! $(INSTALL_PROGRAM) $$tool$(exeext) $(bindir)/$$tool_transformed_name$(exeext); \ ! chmod a+x $(bindir)/$$tool_transformed_name$(exeext); \ fi ; \ done *************** java.install-man: *** 182,189 **** java.uninstall: -rm -rf $(bindir)/$(JAVA_INSTALL_NAME)$(exeext) -rm -rf $(bindir)/$(JAVA_CROSS_NAME)$(exeext) ! java.install-info: if [ -f jc1$(exeext) ] ; then \ if [ -f $(srcdir)/java/gcj.info ]; then \ rm -f $(infodir)/gcj.info*; \ --- 187,201 ---- java.uninstall: -rm -rf $(bindir)/$(JAVA_INSTALL_NAME)$(exeext) -rm -rf $(bindir)/$(JAVA_CROSS_NAME)$(exeext) + -rm -rf $(man1dir)/$(JAVA_INSTALL_NAME)$(man1ext) + -rm -rf $(man1dir)/$(JAVA_CROSS_NAME)$(man1ext) + -rm -rf $(man1dir)/gcjh$(man1ext) + -rm -rf $(man1dir)/jv-scan$(man1ext) + -rm -rf $(man1dir)/jcf-dump$(man1ext) + -rm -rf $(man1dir)/gij$(man1ext) + -rm -rf $(man1dir)/jv-convert$(man1ext) ! java.install-info: installdirs if [ -f jc1$(exeext) ] ; then \ if [ -f $(srcdir)/java/gcj.info ]; then \ rm -f $(infodir)/gcj.info*; \ *************** java.distclean: *** 215,220 **** --- 227,238 ---- java.extraclean: java.maintainer-clean: -rm -f java/parse.c java/parse-scan.c java/parse.output java/y.tab.c + -rm -f $(srcdir)/java/gcj.1 $(srcdir)/java/gcjh.1 + -rm -f $(srcdir)/java/jv-scan.1 $(srcdir)/java/jcf-dump.1 + -rm -f $(srcdir)/java/gij.1 + -rm -f $(srcdir)/java/jv-convert.1 + -rm -f $(srcdir)/java/rmic.1 + -rm -f $(srcdir)/java/rmiregistry.1 # # Stage hooks: # The main makefile has already created stage?/java. *************** java.stage4: stage4-start *** 233,296 **** JAVA_TREE_H = $(TREE_H) java/java-tree.h java/java-tree.def JAVA_LEX_C = java/lex.c java/keyword.h java/chartables.h ! java/parse.o: java/parse.c java/jcf-reader.c $(CONFIG_H) system.h \ function.h $(JAVA_TREE_H) $(JAVA_LEX_C) java/parse.h java/lex.h $(GGC_H) ! java/jcf-dump.o: $(CONFIG_H) system.h $(JAVA_TREE_H) java/jcf-dump.c \ java/jcf-reader.c java/jcf.h java/javaop.h java/javaop.def version.h ! java/gjavah.o: $(CONFIG_H) system.h $(JAVA_TREE_H) java/gjavah.c \ java/jcf-reader.c java/jcf.h java/javaop.h version.h ! java/boehm.o: java/boehm.c $(CONFIG_H) system.h $(TREE_H) $(JAVA_TREE_H) \ ! java/parse.h ! java/buffer.o: java/buffer.c $(CONFIG_H) java/buffer.h gansidecl.h \ ! system.h toplev.h ! java/check-init.o: java/check-init.c $(CONFIG_H) gansidecl.h \ ! $(JAVA_TREE_H) system.h toplev.h java/class.o: java/class.c $(CONFIG_H) $(JAVA_TREE_H) $(RTL_H) java/jcf.h \ ! java/parse.h gansidecl.h toplev.h system.h output.h $(GGC_H) java/constants.o: java/constants.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! toplev.h system.h $(GGC_H) ! java/decl.o: java/decl.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! toplev.h system.h function.h gcc.h java/except.o: java/except.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h real.h \ $(RTL_H) java/javaop.h java/java-opcodes.h except.h java/java-except.h \ ! toplev.h system.h function.h java/expr.o: java/expr.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h real.h \ $(RTL_H) $(EXPR_H) java/javaop.h java/java-opcodes.h except.h \ java/java-except.h java/java-except.h java/parse.h toplev.h \ ! system.h $(GGC_H) ! java/jcf-depend.o: java/jcf-depend.c $(CONFIG_H) system.h java/jcf.h java/jcf-parse.o: java/jcf-parse.c $(CONFIG_H) $(JAVA_TREE_H) flags.h \ ! input.h java/java-except.h system.h toplev.h java/parse.h $(GGC_H) java/jcf-write.o: java/jcf-write.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! $(RTL_H) java/java-opcodes.h java/parse.h java/buffer.h system.h \ toplev.h $(GGC_H) ! java/jv-scan.o: java/jv-scan.c $(CONFIG_H) system.h version.h ! java/jvgenmain.o: java/jvgenmain.c $(CONFIG_H) $(JAVA_TREE_H) system.h java/lang.o: java/lang.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h input.h \ ! toplev.h system.h $(RTL_H) $(EXPR_H) ! java/mangle.o: java/mangle.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) system.h \ toplev.h $(GGC_H) java/mangle_name.o: java/mangle_name.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) \ ! system.h toplev.h $(GGC_H) ! java/parse-scan.o: $(CONFIG_H) system.h toplev.h $(JAVA_LEX_C) java/parse.h \ java/lex.h java/typeck.o: java/typeck.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! java/convert.h toplev.h system.h $(GGC_H) java/verify.o: java/verify.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! java/javaop.h java/java-opcodes.h java/java-except.h toplev.h system.h java/xref.o: java/xref.c java/xref.h $(CONFIG_H) $(JAVA_TREE_H) toplev.h \ ! system.h ! java/zextract.o: java/zextract.c $(CONFIG_H) system.h java/zipfile.h # jcf-io.o needs $(ZLIBINC) added to cflags. ! java/jcf-io.o: java/jcf-io.c $(CONFIG_H) system.h $(JAVA_TREE_H) $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(ZLIBINC) \ $(srcdir)/java/jcf-io.c $(OUTPUT_OPTION) # jcf-path.o needs a -D. ! java/jcf-path.o: java/jcf-path.c $(CONFIG_H) system.h java/jcf.h $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ ! -DLIBGCJ_ZIP_FILE='"$(prefix)/share/libgcj.jar"' \ $(srcdir)/java/jcf-path.c $(OUTPUT_OPTION) # Documentation --- 251,319 ---- JAVA_TREE_H = $(TREE_H) java/java-tree.h java/java-tree.def JAVA_LEX_C = java/lex.c java/keyword.h java/chartables.h ! java/parse.o: java/parse.c java/jcf-reader.c $(CONFIG_H) $(SYSTEM_H) \ function.h $(JAVA_TREE_H) $(JAVA_LEX_C) java/parse.h java/lex.h $(GGC_H) ! java/jcf-dump.o: $(CONFIG_H) $(SYSTEM_H) $(JAVA_TREE_H) java/jcf-dump.c \ java/jcf-reader.c java/jcf.h java/javaop.h java/javaop.def version.h ! java/gjavah.o: $(CONFIG_H) $(SYSTEM_H) $(JAVA_TREE_H) java/gjavah.c \ java/jcf-reader.c java/jcf.h java/javaop.h version.h ! java/boehm.o: java/boehm.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(JAVA_TREE_H) \ ! java/parse.h toplev.h ! java/buffer.o: java/buffer.c $(CONFIG_H) java/buffer.h $(SYSTEM_H) toplev.h ! java/builtins.o: java/builtins.c $(CONFIG_H) $(SYSTEM_H) $(JAVA_TREE_H) \ ! $(GGC_H) flags.h ! java/check-init.o: java/check-init.c $(CONFIG_H) \ ! $(JAVA_TREE_H) $(SYSTEM_H) toplev.h java/class.o: java/class.c $(CONFIG_H) $(JAVA_TREE_H) $(RTL_H) java/jcf.h \ ! java/parse.h toplev.h $(SYSTEM_H) output.h $(GGC_H) $(TARGET_H) function.h java/constants.o: java/constants.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! toplev.h $(SYSTEM_H) $(GGC_H) ! java/decl.o: java/decl.c $(CONFIG_H) $(JAVA_TREE_H) $(RTL_H) java/jcf.h \ ! toplev.h flags.h $(SYSTEM_H) function.h expr.h libfuncs.h except.h \ ! java/java-except.h $(GGC_H) java/except.o: java/except.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h real.h \ $(RTL_H) java/javaop.h java/java-opcodes.h except.h java/java-except.h \ ! toplev.h $(SYSTEM_H) function.h java/expr.o: java/expr.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h real.h \ $(RTL_H) $(EXPR_H) java/javaop.h java/java-opcodes.h except.h \ java/java-except.h java/java-except.h java/parse.h toplev.h \ ! $(SYSTEM_H) $(GGC_H) ! java/jcf-depend.o: java/jcf-depend.c $(CONFIG_H) $(SYSTEM_H) java/jcf.h java/jcf-parse.o: java/jcf-parse.c $(CONFIG_H) $(JAVA_TREE_H) flags.h \ ! input.h java/java-except.h $(SYSTEM_H) toplev.h java/parse.h $(GGC_H) \ ! debug.h java/jcf-write.o: java/jcf-write.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! $(RTL_H) java/java-opcodes.h java/parse.h java/buffer.h $(SYSTEM_H) \ toplev.h $(GGC_H) ! java/jv-scan.o: java/jv-scan.c $(CONFIG_H) $(SYSTEM_H) version.h ! java/jvgenmain.o: java/jvgenmain.c $(CONFIG_H) $(JAVA_TREE_H) $(SYSTEM_H) java/lang.o: java/lang.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h input.h \ ! toplev.h $(SYSTEM_H) $(RTL_H) $(EXPR_H) diagnostic.h langhooks.h \ ! langhooks-def.h ! java/mangle.o: java/mangle.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) $(SYSTEM_H) \ toplev.h $(GGC_H) java/mangle_name.o: java/mangle_name.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) \ ! $(SYSTEM_H) toplev.h $(GGC_H) ! java/parse-scan.o: $(CONFIG_H) $(SYSTEM_H) toplev.h $(JAVA_LEX_C) java/parse.h \ java/lex.h java/typeck.o: java/typeck.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! java/convert.h toplev.h $(SYSTEM_H) $(GGC_H) java/verify.o: java/verify.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \ ! java/javaop.h java/java-opcodes.h java/java-except.h toplev.h $(SYSTEM_H) java/xref.o: java/xref.c java/xref.h $(CONFIG_H) $(JAVA_TREE_H) toplev.h \ ! $(SYSTEM_H) ! java/zextract.o: java/zextract.c $(CONFIG_H) $(SYSTEM_H) java/zipfile.h # jcf-io.o needs $(ZLIBINC) added to cflags. ! java/jcf-io.o: java/jcf-io.c $(CONFIG_H) $(SYSTEM_H) $(JAVA_TREE_H) $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(ZLIBINC) \ $(srcdir)/java/jcf-io.c $(OUTPUT_OPTION) # jcf-path.o needs a -D. ! java/jcf-path.o: java/jcf-path.c $(CONFIG_H) $(SYSTEM_H) java/jcf.h $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ ! -DLIBGCJ_ZIP_FILE='"$(prefix)/share/java/libgcj-$(version).jar"' \ ! -DDEFAULT_TARGET_VERSION=\"$(version)\" \ $(srcdir)/java/jcf-path.c $(OUTPUT_OPTION) # Documentation *************** java/gcj.dvi: $(srcdir)/java/gcj.texi $( *** 305,307 **** --- 328,421 ---- $(srcdir)/doc/include/gpl.texi s=`cd $(srcdir); pwd`; export s; \ cd java && $(TEXI2DVI) -I $$s/doc/include $$s/java/gcj.texi + + $(srcdir)/java/gcj.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D gcj < $(srcdir)/java/gcj.texi > java/gcj.pod + ($(POD2MAN) --section=1 java/gcj.pod > java/gcj.1.T$$$$ && \ + mv -f java/gcj.1.T$$$$ $(srcdir)/java/gcj.1) || \ + (rm -f java/gcj.1.T$$$$ && exit 1) + rm -f java/gcj.pod + + $(srcdir)/java/gcjh.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D gcjh < $(srcdir)/java/gcj.texi > java/gcjh.pod + ($(POD2MAN) --section=1 java/gcjh.pod > java/gcjh.1.T$$$$ && \ + mv -f java/gcjh.1.T$$$$ $(srcdir)/java/gcjh.1) || \ + (rm -f java/gcjh.1.T$$$$ && exit 1) + rm -f java/gcjh.pod + + $(srcdir)/java/jv-scan.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D jv-scan < $(srcdir)/java/gcj.texi > java/jv-scan.pod + ($(POD2MAN) --section=1 java/jv-scan.pod > java/jv-scan.1.T$$$$ && \ + mv -f java/jv-scan.1.T$$$$ $(srcdir)/java/jv-scan.1) || \ + (rm -f java/jv-scan.1.T$$$$ && exit 1) + rm -f java/jv-scan.pod + + $(srcdir)/java/jcf-dump.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D jcf-dump < $(srcdir)/java/gcj.texi > java/jcf-dump.pod + ($(POD2MAN) --section=1 java/jcf-dump.pod > java/jcf-dump.1.T$$$$ && \ + mv -f java/jcf-dump.1.T$$$$ $(srcdir)/java/jcf-dump.1) || \ + (rm -f java/jcf-dump.1.T$$$$ && exit 1) + rm -f java/jcf-dump.pod + + $(srcdir)/java/gij.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D gij < $(srcdir)/java/gcj.texi > java/gij.pod + ($(POD2MAN) --section=1 java/gij.pod > java/gij.1.T$$$$ && \ + mv -f java/gij.1.T$$$$ $(srcdir)/java/gij.1) || \ + (rm -f java/gij.1.T$$$$ && exit 1) + rm -f java/gij.pod + + $(srcdir)/java/jv-convert.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D jv-convert < $(srcdir)/java/gcj.texi > java/jv-convert.pod + ($(POD2MAN) --section=1 java/jv-convert.pod > java/jv-convert.1.T$$$$ && \ + mv -f java/jv-convert.1.T$$$$ $(srcdir)/java/jv-convert.1) || \ + (rm -f java/jv-convert.1.T$$$$ && exit 1) + rm -f java/jv-convert.pod + + $(srcdir)/java/rmic.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D rmic < $(srcdir)/java/gcj.texi > java/rmic.pod + ($(POD2MAN) --section=1 java/rmic.pod > java/rmic.1.T$$$$ && \ + mv -f java/rmic.1.T$$$$ $(srcdir)/java/rmic.1) || \ + (rm -f java/rmic.1.T$$$$ && exit 1) + rm -f java/rmic.pod + + $(srcdir)/java/rmiregistry.1: $(srcdir)/java/gcj.texi + -$(TEXI2POD) -D rmiregistry < $(srcdir)/java/gcj.texi > java/rmiregistry.pod + ($(POD2MAN) --section=1 java/rmiregistry.pod > java/rmiregistry.1.T$$$$ && \ + mv -f java/rmiregistry.1.T$$$$ $(srcdir)/java/rmiregistry.1) || \ + (rm -f java/rmiregistry.1.T$$$$ && exit 1) + rm -f java/rmiregistry.pod + + # Install the man pages. + java.install-man: installdirs $(GENERATED_JAVA_MANPAGES) + -if [ -f $(GCJ)$(exeext) ]; then \ + if [ -f $(GCJ)-cross$(exeext) ]; then \ + rm -f $(man1dir)/$(JAVA_CROSS_NAME)$(man1ext); \ + $(INSTALL_DATA) $(srcdir)/java/gcj.1 $(man1dir)/$(JAVA_CROSS_NAME)$(man1ext); \ + chmod a-x $(man1dir)/$(JAVA_CROSS_NAME)$(man1ext); \ + else \ + rm -f $(man1dir)/$(JAVA_INSTALL_NAME)$(man1ext); \ + $(INSTALL_DATA) $(srcdir)/java/gcj.1 $(man1dir)/$(JAVA_INSTALL_NAME)$(man1ext); \ + chmod a-x $(man1dir)/$(JAVA_INSTALL_NAME)$(man1ext); \ + fi ; \ + fi + -rm -f $(man1dir)/gcjh$(man1ext) + -$(INSTALL_DATA) $(srcdir)/java/gcjh.1 $(man1dir)/gcjh$(man1ext) + -chmod a-x $(man1dir)/gcjh$(man1ext) + -rm -f $(man1dir)/jv-scan$(man1ext) + -$(INSTALL_DATA) $(srcdir)/java/jv-scan.1 $(man1dir)/jv-scan$(man1ext) + -chmod a-x $(man1dir)/jv-scan$(man1ext) + -rm -f $(man1dir)/jcf-dump$(man1ext) + -$(INSTALL_DATA) $(srcdir)/java/jcf-dump.1 $(man1dir)/jcf-dump$(man1ext) + -chmod a-x $(man1dir)/jcf-dump$(man1ext) + -rm -f $(man1dir)/gij$(man1ext) + -$(INSTALL_DATA) $(srcdir)/java/gij.1 $(man1dir)/gij$(man1ext) + -chmod a-x $(man1dir)/gij$(man1ext) + -rm -f $(man1dir)/jv-convert$(man1ext) + -$(INSTALL_DATA) $(srcdir)/java/jv-convert.1 $(man1dir)/jv-convert$(man1ext) + -chmod a-x $(man1dir)/jv-convert$(man1ext) + -rm -f $(man1dir)/rmic$(man1ext) + -$(INSTALL_DATA) $(srcdir)/java/rmic.1 $(man1dir)/rmic$(man1ext) + -chmod a-x $(man1dir)/rmic$(man1ext) + -rm -f $(man1dir)/rmiregistry$(man1ext) + -$(INSTALL_DATA) $(srcdir)/java/rmiregistry.1 $(man1dir)/rmiregistry$(man1ext) + -chmod a-x $(man1dir)/rmiregistry$(man1ext) diff -Nrc3pad gcc-3.0.4/gcc/java/boehm.c gcc-3.1/gcc/java/boehm.c *** gcc-3.0.4/gcc/java/boehm.c Tue Apr 3 17:35:08 2001 --- gcc-3.1/gcc/java/boehm.c Sat Dec 22 00:52:30 2001 *************** The Free Software Foundation is independ *** 30,35 **** --- 30,36 ---- #include "tree.h" #include "java-tree.h" #include "parse.h" + #include "toplev.h" static void mark_reference_fields PARAMS ((tree, unsigned HOST_WIDE_INT *, *************** static void set_bit PARAMS ((unsigned HO *** 42,55 **** unsigned HOST_WIDE_INT *, unsigned int)); - /* Compute a procedure-based object descriptor. We know that our - `kind' is 0, and `env' is likewise 0, so we have a simple - computation. From the GC sources: - (((((env) << LOG_MAX_MARK_PROCS) | (proc_index)) << DS_TAG_BITS) \ - | DS_PROC) - Here DS_PROC == 2. */ - #define PROCEDURE_OBJECT_DESCRIPTOR build_int_2 (2, 0) - /* Treat two HOST_WIDE_INT's as a contiguous bitmap, with bit 0 being the least significant. This function sets bit N in the bitmap. */ static void --- 43,48 ---- *************** get_boehm_type_descriptor (tree type) *** 166,172 **** /* If we have a type of unknown size, use a proc. */ if (int_size_in_bytes (type) == -1) ! return PROCEDURE_OBJECT_DESCRIPTOR; bit = POINTER_SIZE / BITS_PER_UNIT; /* The size of this node has to be known. And, we only support 32 --- 159,165 ---- /* If we have a type of unknown size, use a proc. */ if (int_size_in_bytes (type) == -1) ! goto procedure_object_descriptor; bit = POINTER_SIZE / BITS_PER_UNIT; /* The size of this node has to be known. And, we only support 32 *************** get_boehm_type_descriptor (tree type) *** 186,192 **** ubit = (unsigned int) bit; if (type == class_type_node) ! return PROCEDURE_OBJECT_DESCRIPTOR; field = TYPE_FIELDS (type); mark_reference_fields (field, &low, &high, ubit, --- 179,185 ---- ubit = (unsigned int) bit; if (type == class_type_node) ! goto procedure_object_descriptor; field = TYPE_FIELDS (type); mark_reference_fields (field, &low, &high, ubit, *************** get_boehm_type_descriptor (tree type) *** 226,232 **** value = build_int_2 (low, high); } else ! value = PROCEDURE_OBJECT_DESCRIPTOR; TREE_TYPE (value) = type_for_mode (ptr_mode, 1); return value; --- 219,234 ---- value = build_int_2 (low, high); } else ! { ! /* Compute a procedure-based object descriptor. We know that our ! `kind' is 0, and `env' is likewise 0, so we have a simple ! computation. From the GC sources: ! (((((env) << LOG_MAX_MARK_PROCS) | (proc_index)) << DS_TAG_BITS) \ ! | DS_PROC) ! Here DS_PROC == 2. */ ! procedure_object_descriptor: ! value = build_int_2 (2, 0); ! } TREE_TYPE (value) = type_for_mode (ptr_mode, 1); return value; diff -Nrc3pad gcc-3.0.4/gcc/java/buffer.c gcc-3.1/gcc/java/buffer.c *** gcc-3.0.4/gcc/java/buffer.c Wed Dec 16 21:19:52 1998 --- gcc-3.1/gcc/java/buffer.c Wed Apr 4 00:46:27 2001 *************** Boston, MA 02111-1307, USA. */ *** 22,28 **** #include "config.h" #include "system.h" - #include "gansidecl.h" #include "buffer.h" /* Grow BUFP so there is room for at least SIZE more bytes. */ --- 22,27 ---- diff -Nrc3pad gcc-3.0.4/gcc/java/builtins.c gcc-3.1/gcc/java/builtins.c *** gcc-3.0.4/gcc/java/builtins.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/builtins.c Mon Mar 18 19:33:49 2002 *************** *** 0 **** --- 1,353 ---- + /* Built-in and inline functions for gcj + Copyright (C) 2001 + Free Software Foundation, Inc. + + This file is part of GNU CC. + + GNU CC is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU CC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU CC; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Java and all Java-based marks are trademarks or registered trademarks + of Sun Microsystems, Inc. in the United States and other countries. + The Free Software Foundation is independent of Sun Microsystems, Inc. */ + + /* Written by Tom Tromey . */ + + #include "config.h" + #include "system.h" + #include "tree.h" + #include "ggc.h" + #include "flags.h" + + #include "java-tree.h" + + enum builtin_type + { + #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME, + #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME, + #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME, + #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME, + #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, + #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, + #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, + #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, + #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, + #define DEF_POINTER_TYPE(NAME, TYPE) NAME, + #include "builtin-types.def" + #undef DEF_PRIMITIVE_TYPE + #undef DEF_FUNCTION_TYPE_0 + #undef DEF_FUNCTION_TYPE_1 + #undef DEF_FUNCTION_TYPE_2 + #undef DEF_FUNCTION_TYPE_3 + #undef DEF_FUNCTION_TYPE_4 + #undef DEF_FUNCTION_TYPE_VAR_0 + #undef DEF_FUNCTION_TYPE_VAR_1 + #undef DEF_FUNCTION_TYPE_VAR_2 + #undef DEF_POINTER_TYPE + BT_LAST + }; + + static tree max_builtin PARAMS ((tree, tree)); + static tree min_builtin PARAMS ((tree, tree)); + static tree abs_builtin PARAMS ((tree, tree)); + static tree cos_builtin PARAMS ((tree, tree)); + static tree sin_builtin PARAMS ((tree, tree)); + static tree sqrt_builtin PARAMS ((tree, tree)); + + static tree build_function_call_expr PARAMS ((tree, tree)); + static void define_builtin PARAMS ((enum built_in_function, + const char *, + enum built_in_class, + tree, int)); + static tree define_builtin_type PARAMS ((int, int, int, int, int)); + + + + /* Functions of this type are used to inline a given call. Such a + function should either return an expression, if the call is to be + inlined, or NULL_TREE if a real call should be emitted. Arguments + are method return type and arguments to call. */ + typedef tree builtin_creator_function PARAMS ((tree, tree)); + + /* Hold a char*, before initialization, or a tree, after + initialization. */ + union string_or_tree + { + const char *s; + tree t; + }; + + /* Used to hold a single builtin record. */ + struct builtin_record + { + union string_or_tree class_name; + union string_or_tree method_name; + builtin_creator_function *creator; + }; + + static struct builtin_record java_builtins[] = + { + { { "java.lang.Math" }, { "min" }, min_builtin }, + { { "java.lang.Math" }, { "max" }, max_builtin }, + { { "java.lang.Math" }, { "abs" }, abs_builtin }, + { { "java.lang.Math" }, { "cos" }, cos_builtin }, + { { "java.lang.Math" }, { "sin" }, sin_builtin }, + { { "java.lang.Math" }, { "sqrt" }, sqrt_builtin }, + { { NULL }, { NULL }, NULL } + }; + + /* This is only used transiently, so we don't mark it as roots for the + GC. */ + static tree builtin_types[(int) BT_LAST]; + + + /* Internal functions which implement various builtin conversions. */ + + static tree + max_builtin (method_return_type, method_arguments) + tree method_return_type, method_arguments; + { + return build (MAX_EXPR, method_return_type, + TREE_VALUE (method_arguments), + TREE_VALUE (TREE_CHAIN (method_arguments))); + } + + static tree + min_builtin (method_return_type, method_arguments) + tree method_return_type, method_arguments; + { + return build (MIN_EXPR, method_return_type, + TREE_VALUE (method_arguments), + TREE_VALUE (TREE_CHAIN (method_arguments))); + } + + static tree + abs_builtin (method_return_type, method_arguments) + tree method_return_type, method_arguments; + { + return build1 (ABS_EXPR, method_return_type, + TREE_VALUE (method_arguments)); + } + + /* Mostly copied from ../builtins.c. */ + static tree + build_function_call_expr (tree fn, tree arglist) + { + tree call_expr; + + call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn); + call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)), + call_expr, arglist); + TREE_SIDE_EFFECTS (call_expr) = 1; + return call_expr; + } + + static tree + cos_builtin (method_return_type, method_arguments) + tree method_return_type ATTRIBUTE_UNUSED, method_arguments; + { + /* FIXME: this assumes that jdouble and double are the same. */ + tree fn = built_in_decls[BUILT_IN_COS]; + if (fn == NULL_TREE) + return NULL_TREE; + return build_function_call_expr (fn, method_arguments); + } + + static tree + sin_builtin (method_return_type, method_arguments) + tree method_return_type ATTRIBUTE_UNUSED, method_arguments; + { + /* FIXME: this assumes that jdouble and double are the same. */ + tree fn = built_in_decls[BUILT_IN_SIN]; + if (fn == NULL_TREE) + return NULL_TREE; + return build_function_call_expr (fn, method_arguments); + } + + static tree + sqrt_builtin (method_return_type, method_arguments) + tree method_return_type ATTRIBUTE_UNUSED, method_arguments; + { + /* FIXME: this assumes that jdouble and double are the same. */ + tree fn = built_in_decls[BUILT_IN_SQRT]; + if (fn == NULL_TREE) + return NULL_TREE; + return build_function_call_expr (fn, method_arguments); + } + + + + /* Define a single builtin. */ + static void + define_builtin (val, name, class, type, fallback_p) + enum built_in_function val; + const char *name; + enum built_in_class class; + tree type; + int fallback_p; + { + tree decl; + + if (! name || ! type) + return; + + if (strncmp (name, "__builtin_", strlen ("__builtin_")) != 0) + abort (); + decl = build_decl (FUNCTION_DECL, get_identifier (name), type); + DECL_EXTERNAL (decl) = 1; + TREE_PUBLIC (decl) = 1; + if (fallback_p) + SET_DECL_ASSEMBLER_NAME (decl, + get_identifier (name + strlen ("__builtin_"))); + make_decl_rtl (decl, NULL); + pushdecl (decl); + DECL_BUILT_IN_CLASS (decl) = class; + DECL_FUNCTION_CODE (decl) = val; + built_in_decls[val] = decl; + } + + /* Compute the type for a builtin. */ + static tree + define_builtin_type (ret, arg1, arg2, arg3, arg4) + int ret, arg1, arg2, arg3, arg4; + { + tree args; + + if (builtin_types[ret] == NULL_TREE) + return NULL_TREE; + + args = void_list_node; + + if (arg4 != -1) + { + if (builtin_types[arg4] == NULL_TREE) + return NULL_TREE; + args = tree_cons (NULL_TREE, builtin_types[arg4], args); + } + if (arg3 != -1) + { + if (builtin_types[arg3] == NULL_TREE) + return NULL_TREE; + args = tree_cons (NULL_TREE, builtin_types[arg3], args); + } + if (arg2 != -1) + { + if (builtin_types[arg2] == NULL_TREE) + return NULL_TREE; + args = tree_cons (NULL_TREE, builtin_types[arg2], args); + } + if (arg1 != -1) + { + if (builtin_types[arg1] == NULL_TREE) + return NULL_TREE; + args = tree_cons (NULL_TREE, builtin_types[arg1], args); + } + + return build_function_type (builtin_types[ret], args); + } + + + + /* Initialize the builtins. */ + void + initialize_builtins () + { + int i; + + for (i = 0; java_builtins[i].creator != NULL; ++i) + { + tree klass_id = get_identifier (java_builtins[i].class_name.s); + tree m = get_identifier (java_builtins[i].method_name.s); + + java_builtins[i].class_name.t = klass_id; + java_builtins[i].method_name.t = m; + ggc_add_tree_root (&java_builtins[i].class_name.t, 1); + ggc_add_tree_root (&java_builtins[i].method_name.t, 1); + } + + void_list_node = end_params_node; + + /* Work around C-specific junk in builtin-types.def. */ + #define intmax_type_node NULL_TREE + #define traditional_ptr_type_node NULL_TREE + #define traditional_cptr_type_node NULL_TREE + #define c_size_type_node NULL_TREE + #define const_string_type_node NULL_TREE + #define traditional_len_type_node NULL_TREE + #define va_list_ref_type_node NULL_TREE + #define va_list_arg_type_node NULL_TREE + #define flag_isoc99 0 + + #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \ + builtin_types[(int) ENUM] = VALUE; + #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \ + builtin_types[(int) ENUM] \ + = define_builtin_type (RETURN, -1, -1, -1, -1); + #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \ + builtin_types[(int) ENUM] \ + = define_builtin_type (RETURN, ARG1, -1, -1, -1); + #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \ + builtin_types[(int) ENUM] \ + = define_builtin_type (RETURN, ARG1, ARG2, -1, -1); + #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \ + builtin_types[(int) ENUM] \ + = define_builtin_type (RETURN, ARG1, ARG2, ARG3, -1); + #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \ + builtin_types[(int) ENUM] \ + = define_builtin_type (RETURN, ARG1, ARG2, ARG3, ARG4); + #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ + builtin_types[(int) ENUM] = NULL_TREE; + #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ + builtin_types[(int) ENUM] = NULL_TREE; + #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \ + builtin_types[(int) ENUM] = NULL_TREE; + #define DEF_POINTER_TYPE(ENUM, TYPE) \ + builtin_types[(int) ENUM] = NULL_TREE; + + #include "builtin-types.def" + + #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, \ + FALLBACK_P, NONANSI_P) \ + define_builtin (ENUM, NAME, CLASS, builtin_types[TYPE], FALLBACK_P); + #include "builtins.def" + } + + /* If the call matches a builtin, return the + appropriate builtin expression instead. */ + tree + check_for_builtin (method, call) + tree method; + tree call; + { + if (! flag_emit_class_files && optimize && TREE_CODE (call) == CALL_EXPR) + { + int i; + tree method_arguments = TREE_OPERAND (call, 1); + tree method_class = DECL_NAME (TYPE_NAME (DECL_CONTEXT (method))); + tree method_name = DECL_NAME (method); + tree method_return_type = TREE_TYPE (TREE_TYPE (method)); + + for (i = 0; java_builtins[i].creator != NULL; ++i) + { + if (method_class == java_builtins[i].class_name.t + && method_name == java_builtins[i].method_name.t) + { + return (*java_builtins[i].creator) (method_return_type, + method_arguments); + } + } + } + return call; + } diff -Nrc3pad gcc-3.0.4/gcc/java/chartables.h gcc-3.1/gcc/java/chartables.h *** gcc-3.0.4/gcc/java/chartables.h Wed Dec 13 22:47:13 2000 --- gcc-3.1/gcc/java/chartables.h Fri Dec 28 22:27:29 2001 *************** *** 1,13 **** /* This file is automatically generated. DO NOT EDIT! Instead, edit gen-table.pl and re-run. */ ! #ifndef CHARTABLES_H ! #define CHARTABLES_H #define LETTER_START 1 #define LETTER_PART 2 ! static char page0[256] = { (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), --- 1,13 ---- /* This file is automatically generated. DO NOT EDIT! Instead, edit gen-table.pl and re-run. */ ! #ifndef GCC_CHARTABLES_H ! #define GCC_CHARTABLES_H #define LETTER_START 1 #define LETTER_PART 2 ! static const char page0[256] = { (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), *************** static char page0[256] = { *** 87,93 **** (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START) }; ! static char page2[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 87,93 ---- (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START) }; ! static const char page2[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page2[256] = { *** 178,184 **** 0, 0 }; ! static char page3[256] = { (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), --- 178,184 ---- 0, 0 }; ! static const char page3[256] = { (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), *************** static char page3[256] = { *** 252,258 **** (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page4[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 252,258 ---- (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page4[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page4[256] = { *** 372,378 **** (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0 }; ! static char page5[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 372,378 ---- (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0 }; ! static const char page5[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page5[256] = { *** 443,449 **** 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page6[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 443,449 ---- 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page6[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page6[256] = { *** 530,536 **** (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), 0, 0, 0 }; ! static char page7[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 530,536 ---- (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), 0, 0, 0 }; ! static const char page7[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page7[256] = { *** 580,586 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page9[256] = { 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 580,586 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page9[256] = { 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page9[256] = { *** 659,665 **** 0, 0, 0, 0, 0, 0, 0 }; ! static char page10[256] = { 0, 0, (LETTER_PART), 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 659,665 ---- 0, 0, 0, 0, 0, 0, 0 }; ! static const char page10[256] = { 0, 0, (LETTER_PART), 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page10[256] = { *** 727,733 **** (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page11[256] = { 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 727,733 ---- (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page11[256] = { 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page11[256] = { *** 788,794 **** 0, 0, 0, 0, 0, 0 }; ! static char page12[256] = { 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 788,794 ---- 0, 0, 0, 0, 0, 0 }; ! static const char page12[256] = { 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page12[256] = { *** 859,865 **** 0, 0, 0, 0, 0, 0 }; ! static char page13[256] = { 0, 0, (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 859,865 ---- 0, 0, 0, 0, 0, 0 }; ! static const char page13[256] = { 0, 0, (LETTER_PART), (LETTER_PART), 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page13[256] = { *** 931,937 **** (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page14[256] = { 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 931,937 ---- (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page14[256] = { 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page14[256] = { *** 997,1003 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page15[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), --- 997,1003 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page15[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), *************** static char page15[256] = { *** 1046,1052 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page16[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1046,1052 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page16[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page16[256] = { *** 1120,1126 **** (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page17[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1120,1126 ---- (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page17[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page17[256] = { *** 1244,1250 **** 0 }; ! static char page18[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1244,1250 ---- 0 }; ! static const char page18[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page18[256] = { *** 1363,1369 **** (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START) }; ! static char page19[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1363,1369 ---- (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START) }; ! static const char page19[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page19[256] = { *** 1456,1462 **** (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page20[256] = { 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1456,1462 ---- (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page20[256] = { 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page20[256] = { *** 1587,1593 **** (LETTER_PART | LETTER_START) }; ! static char page22[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1587,1593 ---- (LETTER_PART | LETTER_START) }; ! static const char page22[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page22[256] = { *** 1701,1707 **** 0, 0, 0, 0, 0, 0 }; ! static char page23[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 1701,1707 ---- 0, 0, 0, 0, 0, 0 }; ! static const char page23[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page23[256] = { *** 1746,1752 **** 0, 0 }; ! static char page24[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, --- 1746,1752 ---- 0, 0 }; ! static const char page24[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, *************** static char page24[256] = { *** 1821,1827 **** 0 }; ! static char page30[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1821,1827 ---- 0 }; ! static const char page30[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page30[256] = { *** 1948,1954 **** 0 }; ! static char page31[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 1948,1954 ---- 0 }; ! static const char page31[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page31[256] = { *** 2060,2066 **** (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), 0, 0, 0 }; ! static char page32[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), --- 2060,2066 ---- (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), 0, 0, 0 }; ! static const char page32[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), *************** static char page32[256] = { *** 2088,2094 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page33[256] = { 0, 0, (LETTER_PART | LETTER_START), 0, 0, 0, 0, (LETTER_PART | LETTER_START), 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 2088,2094 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page33[256] = { 0, 0, (LETTER_PART | LETTER_START), 0, 0, 0, 0, (LETTER_PART | LETTER_START), 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page33[256] = { *** 2124,2130 **** 0, 0, 0, 0 }; ! static char page48[256] = { 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), --- 2124,2130 ---- 0, 0, 0, 0 }; ! static const char page48[256] = { 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), *************** static char page48[256] = { *** 2227,2233 **** (LETTER_PART | LETTER_START), 0 }; ! static char page49[256] = { 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 2227,2233 ---- (LETTER_PART | LETTER_START), 0 }; ! static const char page49[256] = { 0, 0, 0, 0, 0, (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page49[256] = { *** 2313,2319 **** 0, 0, 0, 0, 0, 0, 0 }; ! static char page52[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 2313,2319 ---- 0, 0, 0, 0, 0, 0, 0 }; ! static const char page52[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page52[256] = { *** 2327,2333 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page77[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 2327,2333 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page77[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page77[256] = { *** 2375,2381 **** (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START) }; ! static char page78[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 2375,2381 ---- (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START) }; ! static const char page78[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page78[256] = { *** 2389,2395 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page159[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 2389,2395 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page159[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page159[256] = { *** 2403,2409 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page164[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 2403,2409 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page164[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page164[256] = { *** 2508,2514 **** (LETTER_PART | LETTER_START) }; ! static char page172[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 2508,2514 ---- (LETTER_PART | LETTER_START) }; ! static const char page172[256] = { (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page172[256] = { *** 2522,2528 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page215[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 2522,2528 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page215[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page215[256] = { *** 2536,2542 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char page250[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 2536,2542 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char page250[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page250[256] = { *** 2571,2577 **** 0, 0, 0, 0, 0 }; ! static char page251[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 2571,2577 ---- 0, 0, 0, 0, 0 }; ! static const char page251[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page251[256] = { *** 2676,2682 **** (LETTER_PART | LETTER_START) }; ! static char page253[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), --- 2676,2682 ---- (LETTER_PART | LETTER_START) }; ! static const char page253[256] = { (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), *************** static char page253[256] = { *** 2777,2783 **** (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), 0, 0, 0, 0 }; ! static char page254[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, --- 2777,2783 ---- (LETTER_PART | LETTER_START), (LETTER_PART | LETTER_START), 0, 0, 0, 0 }; ! static const char page254[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *************** static char page254[256] = { *** 2858,2864 **** (LETTER_PART | LETTER_START), 0, 0, (LETTER_PART) }; ! static char page255[256] = { 0, 0, 0, 0, (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), --- 2858,2864 ---- (LETTER_PART | LETTER_START), 0, 0, (LETTER_PART) }; ! static const char page255[256] = { 0, 0, 0, 0, (LETTER_PART | LETTER_START), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), (LETTER_PART), *************** static char page255[256] = { *** 2950,2956 **** 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static char *type_table[256] = { page0, (char *) (LETTER_PART | LETTER_START), page2, --- 2950,2956 ---- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ! static const char *const type_table[256] = { page0, (char *) (LETTER_PART | LETTER_START), page2, *************** static char *type_table[256] = { *** 3209,3212 **** page255 }; ! #endif /* CHARTABLES_H */ --- 3209,3212 ---- page255 }; ! #endif /* ! GCC_CHARTABLES_H */ diff -Nrc3pad gcc-3.0.4/gcc/java/check-init.c gcc-3.1/gcc/java/check-init.c *** gcc-3.0.4/gcc/java/check-init.c Sun May 13 08:17:31 2001 --- gcc-3.1/gcc/java/check-init.c Thu Feb 28 11:42:09 2002 *************** *** 1,4 **** ! /* Code to test for "definitive assignment". Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify --- 1,4 ---- ! /* Code to test for "definitive [un]assignment". Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify *************** The Free Software Foundation is independ *** 25,36 **** #include "config.h" #include "system.h" #include "tree.h" #include "java-tree.h" #include "toplev.h" /* Needed for fatal. */ /* The basic idea is that we assign each local variable declaration ! an index, and then we pass around bitstrings, where the i'th bit ! is set if decl whose DECL_BIT_INDEX is i is definitely assigned. */ /* One segment of a bitstring. */ typedef unsigned int word; --- 25,39 ---- #include "config.h" #include "system.h" #include "tree.h" + #include "flags.h" /* Needed for optimize. */ #include "java-tree.h" #include "toplev.h" /* Needed for fatal. */ /* The basic idea is that we assign each local variable declaration ! and each blank final field an index, and then we pass around ! bitstrings, where the (2*i)'th bit is set if decl whose DECL_BIT_INDEX ! is i is definitely assigned, and the the (2*i=1)'th bit is set if ! decl whose DECL_BIT_INDEX is i is definitely unassigned */ /* One segment of a bitstring. */ typedef unsigned int word; *************** typedef unsigned int word; *** 39,45 **** typedef word *words; /* Number of locals variables currently active. */ ! int num_current_locals = 0; /* The index of the first local variable in the current block. --- 42,52 ---- typedef word *words; /* Number of locals variables currently active. */ ! static int num_current_locals = 0; ! ! /* The value of num_current_locals when we entered the closest ! enclosing LOOP_EXPR. */ ! static int loop_current_locals; /* The index of the first local variable in the current block. *************** int num_current_locals = 0; *** 61,69 **** even for methods with thousands of local variables, as long as most of them are initialized immediately after or in their declaration. */ ! int start_current_locals = 0; ! int num_current_words = 1; static tree wfl; --- 68,76 ---- even for methods with thousands of local variables, as long as most of them are initialized immediately after or in their declaration. */ ! static int start_current_locals = 0; ! static int num_current_words; static tree wfl; *************** static tree wfl; *** 89,95 **** #define INTERSECT(DST, SRC1, SRC2) \ INTERSECTN (DST, SRC1, SRC2, num_current_words) ! #define WORD_SIZE ((unsigned int)(sizeof(word) * 8)) static void check_bool_init PARAMS ((tree, words, words, words)); static void check_init PARAMS ((tree, words)); --- 96,102 ---- #define INTERSECT(DST, SRC1, SRC2) \ INTERSECTN (DST, SRC1, SRC2, num_current_words) ! #define WORD_SIZE ((unsigned int)(sizeof(word) * BITS_PER_UNIT)) static void check_bool_init PARAMS ((tree, words, words, words)); static void check_init PARAMS ((tree, words)); *************** static void check_cond_init PARAMS ((tre *** 97,124 **** static void check_bool2_init PARAMS ((enum tree_code, tree, tree, words, words, words)); struct alternatives; static void done_alternative PARAMS ((words, struct alternatives *)); - #if 0 #define ALLOC_WORDS(NUM) ((word*) xmalloc ((NUM) * sizeof (word))) #define FREE_WORDS(PTR) (free (PTR)) ! #else ! #define ALLOC_WORDS(NUM) ((word*)alloca ((NUM) * sizeof (word))) ! #define FREE_WORDS(PTR) ((void)0) ! #endif #define SET_P(WORDS, BIT) \ ! (WORDS[BIT / WORD_SIZE] & (1 << (BIT % WORD_SIZE))) #define CLEAR_BIT(WORDS, BIT) \ ! (WORDS[BIT / WORD_SIZE] &= ~ (1 << (BIT % WORD_SIZE))) #define SET_BIT(WORDS, BIT) \ ! (WORDS[BIT / WORD_SIZE] |= (1 << (BIT % WORD_SIZE))) #define WORDS_NEEDED(BITS) (((BITS)+(WORD_SIZE-1))/(WORD_SIZE)) /* Check a conditional form (TEST_EXP ? THEN_EXP : ELSE_EXP) for ! definite assignment. BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */ static void --- 104,223 ---- static void check_bool2_init PARAMS ((enum tree_code, tree, tree, words, words, words)); struct alternatives; static void done_alternative PARAMS ((words, struct alternatives *)); + static tree get_variable_decl PARAMS ((tree)); + static void final_assign_error PARAMS ((tree)); + static void check_final_reassigned PARAMS ((tree, words)); #define ALLOC_WORDS(NUM) ((word*) xmalloc ((NUM) * sizeof (word))) #define FREE_WORDS(PTR) (free (PTR)) ! ! /* DECLARE_BUFFERS is used to allocate NUMBUFFER bit sets, each of ! which is an array of length num_current_words number of words. ! Declares a new local variable BUFFER to hold the result (or rather ! a pointer to the first of the bit sets). In almost all cases ! num_current_words will be 1 or at most 2, so we try to stack ! allocate the arrays in that case, using a stack array ! named BUFFER##_short. Each DECLARE_BUFFERS must be matched by ! a corresponding RELEASE_BUFFERS to avoid memory leaks. */ ! ! #define DECLARE_BUFFERS(BUFFER, NUMBUFFERS) \ ! word BUFFER##_short[2 * NUMBUFFERS]; \ ! words BUFFER = ALLOC_BUFFER(BUFFER##_short, NUMBUFFERS * num_current_words) ! ! #define RELEASE_BUFFERS(BUFFER) \ ! FREE_BUFFER(BUFFER, BUFFER##_short) ! ! #define ALLOC_BUFFER(SHORTBUFFER, NUMWORDS) \ ! ((NUMWORDS) * sizeof(word) <= sizeof(SHORTBUFFER) ? SHORTBUFFER \ ! : ALLOC_WORDS(NUMWORDS)) ! ! #define FREE_BUFFER(BUFFER, SHORTBUFFER) \ ! if (BUFFER != SHORTBUFFER) FREE_WORDS(BUFFER) #define SET_P(WORDS, BIT) \ ! (WORDS[(BIT) / WORD_SIZE] & (1 << ((BIT) % WORD_SIZE))) #define CLEAR_BIT(WORDS, BIT) \ ! (WORDS[(BIT) / WORD_SIZE] &= ~ (1 << ((BIT) % WORD_SIZE))) #define SET_BIT(WORDS, BIT) \ ! (WORDS[(BIT) / WORD_SIZE] |= (1 << ((BIT) % WORD_SIZE))) #define WORDS_NEEDED(BITS) (((BITS)+(WORD_SIZE-1))/(WORD_SIZE)) + #define ASSIGNED_P(WORDS, BIT) SET_P(WORDS, 2 * (BIT)) + #define UNASSIGNED_P(WORDS, BIT) SET_P(WORDS, 2 * (BIT) + 1) + + #define SET_ASSIGNED(WORDS, INDEX) SET_BIT (WORDS, 2 * (INDEX)) + #define SET_UNASSIGNED(WORDS, INDEX) SET_BIT (WORDS, 2 * (INDEX) + 1) + + #define CLEAR_ASSIGNED(WORDS, INDEX) CLEAR_BIT (WORDS, 2 * (INDEX)) + #define CLEAR_UNASSIGNED(WORDS, INDEX) CLEAR_BIT (WORDS, 2 * (INDEX) + 1) + + /* Get the "interesting" declaration from a MODIFY_EXPR or COMPONENT_REF. + Return the declaration or NULL_TREE if no interesting declaration. */ + + static tree + get_variable_decl (exp) + tree exp; + { + if (TREE_CODE (exp) == VAR_DECL) + { + if (! TREE_STATIC (exp) || FIELD_FINAL (exp)) + return exp; + } + /* We only care about final parameters. */ + else if (TREE_CODE (exp) == PARM_DECL) + { + if (DECL_FINAL (exp)) + return exp; + } + /* See if exp is this.field. */ + else if (TREE_CODE (exp) == COMPONENT_REF) + { + tree op0 = TREE_OPERAND (exp, 0); + tree op1 = TREE_OPERAND (exp, 1); + tree mdecl = current_function_decl; + if (TREE_CODE (op0) == INDIRECT_REF + && TREE_CODE (op1) == FIELD_DECL + && ! METHOD_STATIC (mdecl) + && FIELD_FINAL (op1)) + { + op0 = TREE_OPERAND (op0, 0); + if (op0 == BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl))) + return op1; + } + } + return NULL_TREE; + } + + static void + final_assign_error (name) + tree name; + { + static const char format[] + = "can't reassign a value to the final variable '%s'"; + parse_error_context (wfl, format, IDENTIFIER_POINTER (name)); + } + + static void + check_final_reassigned (decl, before) + tree decl; + words before; + { + int index = DECL_BIT_INDEX (decl); + /* A final local already assigned or a final parameter + assigned must be reported as errors */ + if (DECL_FINAL (decl) && index != -2 + && (index < loop_current_locals /* I.e. -1, or outside current loop. */ + || ! UNASSIGNED_P (before, index))) + { + final_assign_error (DECL_NAME (decl)); + } + } + /* Check a conditional form (TEST_EXP ? THEN_EXP : ELSE_EXP) for ! definite [un]assignment. BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */ static void *************** check_cond_init (test_exp, then_exp, els *** 127,145 **** tree test_exp, then_exp, else_exp; words before, when_false, when_true; { ! words tmp = ALLOC_WORDS (6 * num_current_words); ! words test_false = tmp; ! words test_true = tmp + num_current_words; ! words then_false = tmp + 2 * num_current_words; ! words then_true = tmp + 3 * num_current_words; ! words else_false = tmp + 4 * num_current_words; ! words else_true = tmp + 5 * num_current_words; check_bool_init (test_exp, before, test_false, test_true); check_bool_init (then_exp, test_true, then_false, then_true); check_bool_init (else_exp, test_false, else_false, else_true); INTERSECT (when_false, then_false, else_false); INTERSECT (when_true, then_true, else_true); ! FREE_WORDS (tmp); } /* Check a boolean binary form CODE (EXP0, EXP1), --- 226,247 ---- tree test_exp, then_exp, else_exp; words before, when_false, when_true; { ! int save_start_current_locals = start_current_locals; ! DECLARE_BUFFERS(test_false, 6); ! words test_true = test_false + num_current_words; ! words then_false = test_true + num_current_words; ! words then_true = then_false + num_current_words; ! words else_false = then_true + num_current_words; ! words else_true = else_false + num_current_words; ! start_current_locals = num_current_locals; ! check_bool_init (test_exp, before, test_false, test_true); check_bool_init (then_exp, test_true, then_false, then_true); check_bool_init (else_exp, test_false, else_false, else_true); INTERSECT (when_false, then_false, else_false); INTERSECT (when_true, then_true, else_true); ! RELEASE_BUFFERS(test_false); ! start_current_locals = save_start_current_locals; } /* Check a boolean binary form CODE (EXP0, EXP1), *************** check_bool2_init (code, exp0, exp1, befo *** 151,158 **** enum tree_code code; tree exp0, exp1; words before, when_false, when_true; { ! word buf[4]; ! words tmp = num_current_words <= 1 ? buf : ALLOC_WORDS (4 * num_current_words); words when_false_0 = tmp; words when_false_1 = tmp+num_current_words; --- 253,260 ---- enum tree_code code; tree exp0, exp1; words before, when_false, when_true; { ! word buf[2*4]; ! words tmp = num_current_words <= 2 ? buf : ALLOC_WORDS (4 * num_current_words); words when_false_0 = tmp; words when_false_1 = tmp+num_current_words; *************** check_bool2_init (code, exp0, exp1, befo *** 203,214 **** FREE_WORDS (tmp); } ! /* Check a boolean expression EXP for definite assignment. ! BEFORE is the set of variables definitely assigned before the conditional. ! (This bitstring may be modified arbitrarily in this function.) ! On output, WHEN_FALSE is the set of variables definitely assigned after the conditional when the conditional is false. ! On output, WHEN_TRUE is the set of variables definitely assigned after the conditional when the conditional is true. (WHEN_FALSE and WHEN_TRUE are overwritten with initial values ignored.) (None of BEFORE, WHEN_FALSE, or WHEN_TRUE can overlap, as they may --- 305,316 ---- FREE_WORDS (tmp); } ! /* Check a boolean expression EXP for definite [un]assignment. ! BEFORE is the set of variables definitely [un]assigned before the ! conditional. (This bitstring may be modified arbitrarily in this function.) ! On output, WHEN_FALSE is the set of variables [un]definitely assigned after the conditional when the conditional is false. ! On output, WHEN_TRUE is the set of variables definitely [un]assigned after the conditional when the conditional is true. (WHEN_FALSE and WHEN_TRUE are overwritten with initial values ignored.) (None of BEFORE, WHEN_FALSE, or WHEN_TRUE can overlap, as they may *************** check_bool_init (exp, before, when_false *** 243,258 **** case MODIFY_EXPR: { tree tmp = TREE_OPERAND (exp, 0); ! if (TREE_CODE (tmp) == VAR_DECL && ! FIELD_STATIC (tmp)) { int index; check_bool_init (TREE_OPERAND (exp, 1), before, when_false, when_true); index = DECL_BIT_INDEX (tmp); if (index >= 0) { ! SET_BIT (when_false, index); ! SET_BIT (when_true, index); } break; } --- 345,363 ---- case MODIFY_EXPR: { tree tmp = TREE_OPERAND (exp, 0); ! if ((tmp = get_variable_decl (tmp)) != NULL_TREE) { int index; check_bool_init (TREE_OPERAND (exp, 1), before, when_false, when_true); + check_final_reassigned (tmp, before); index = DECL_BIT_INDEX (tmp); if (index >= 0) { ! SET_ASSIGNED (when_false, index); ! SET_ASSIGNED (when_true, index); ! CLEAR_UNASSIGNED (when_false, index); ! CLEAR_UNASSIGNED (when_true, index); } break; } *************** struct alternatives *** 324,329 **** --- 429,438 ---- struct alternatives * alternatives = NULL; + /* Begin handling a control flow branch. + BEFORE is the state of [un]assigned variables on entry. + CURRENT is a struct alt to manage the branch alternatives. */ + #define BEGIN_ALTERNATIVES(before, current) \ { \ current.saved = NULL; \ *************** struct alternatives * alternatives = NUL *** 337,351 **** start_current_locals = num_current_locals; \ } static void done_alternative (after, current) words after; struct alternatives *current; { INTERSECTN (current->combined, current->combined, after, ! WORDS_NEEDED (current->num_locals)); } #define END_ALTERNATIVES(after, current) \ { \ alternatives = current.outer; \ --- 446,468 ---- start_current_locals = num_current_locals; \ } + /* We have finished with one branch of branching control flow. + Store the [un]assigned state, merging (intersecting) it with the state + of previous alternative branches. */ + static void done_alternative (after, current) words after; struct alternatives *current; { INTERSECTN (current->combined, current->combined, after, ! WORDS_NEEDED (2 * current->num_locals)); } + /* Used when we done with a control flow branch and are all merged again. + * AFTER is the merged state of [un]assigned variables, + CURRENT is a struct alt that was passed to BEGIN_ALTERNATIVES. */ + #define END_ALTERNATIVES(after, current) \ { \ alternatives = current.outer; \ *************** check_init (exp, before) *** 367,405 **** switch (TREE_CODE (exp)) { case VAR_DECL: ! if (! FIELD_STATIC (exp) && DECL_NAME (exp) != NULL_TREE) { int index = DECL_BIT_INDEX (exp); ! if (index >= 0 && ! SET_P (before, index)) { parse_error_context (wfl, "Variable `%s' may not have been initialized", IDENTIFIER_POINTER (DECL_NAME (exp))); /* Suppress further errors. */ ! DECL_BIT_INDEX (exp) = -1; } } break; case MODIFY_EXPR: tmp = TREE_OPERAND (exp, 0); /* We're interested in variable declaration and parameter declaration when they're declared with the `final' modifier. */ ! if ((TREE_CODE (tmp) == VAR_DECL && ! FIELD_STATIC (tmp)) ! || (TREE_CODE (tmp) == PARM_DECL && LOCAL_FINAL_P (tmp))) { int index; check_init (TREE_OPERAND (exp, 1), before); index = DECL_BIT_INDEX (tmp); - /* A final local already assigned or a final parameter - assigned must be reported as errors */ - if (LOCAL_FINAL_P (tmp) - && (index == -1 || TREE_CODE (tmp) == PARM_DECL)) - parse_error_context (wfl, "Can't assign here a value to the `final' variable `%s'", IDENTIFIER_POINTER (DECL_NAME (tmp))); - if (index >= 0) ! SET_BIT (before, index); ! /* Minor optimization. See comment for start_current_locals. */ ! if (index >= start_current_locals && index == num_current_locals - 1) { num_current_locals--; --- 484,546 ---- switch (TREE_CODE (exp)) { case VAR_DECL: ! case PARM_DECL: ! if (! FIELD_STATIC (exp) && DECL_NAME (exp) != NULL_TREE ! && DECL_NAME (exp) != this_identifier_node) { int index = DECL_BIT_INDEX (exp); ! /* We don't want to report and mark as non initialized class ! initialization flags. */ ! if (! LOCAL_CLASS_INITIALIZATION_FLAG_P (exp) ! && index >= 0 && ! ASSIGNED_P (before, index)) { parse_error_context (wfl, "Variable `%s' may not have been initialized", IDENTIFIER_POINTER (DECL_NAME (exp))); /* Suppress further errors. */ ! DECL_BIT_INDEX (exp) = -2; } } break; + + case COMPONENT_REF: + check_init (TREE_OPERAND (exp, 0), before); + if ((tmp = get_variable_decl (exp)) != NULL_TREE) + { + int index = DECL_BIT_INDEX (tmp); + if (index >= 0 && ! ASSIGNED_P (before, index)) + { + parse_error_context + (wfl, "variable '%s' may not have been initialized", + IDENTIFIER_POINTER (DECL_NAME (tmp))); + /* Suppress further errors. */ + DECL_BIT_INDEX (tmp) = -2; + } + } + break; + case MODIFY_EXPR: tmp = TREE_OPERAND (exp, 0); /* We're interested in variable declaration and parameter declaration when they're declared with the `final' modifier. */ ! if ((tmp = get_variable_decl (tmp)) != NULL_TREE) { int index; check_init (TREE_OPERAND (exp, 1), before); + check_final_reassigned (tmp, before); index = DECL_BIT_INDEX (tmp); if (index >= 0) ! { ! SET_ASSIGNED (before, index); ! CLEAR_UNASSIGNED (before, index); ! } ! /* Minor optimization. See comment for start_current_locals. ! If we're optimizing for class initialization, we keep ! this information to check whether the variable is ! definitely assigned when once we checked the whole ! function. */ ! if (! STATIC_CLASS_INIT_OPT_P () /* FIXME */ ! && index >= start_current_locals && index == num_current_locals - 1) { num_current_locals--; *************** check_init (exp, before) *** 407,412 **** --- 548,569 ---- } break; } + else if (TREE_CODE (tmp = TREE_OPERAND (exp, 0)) == COMPONENT_REF) + { + tree decl; + check_init (tmp, before); + check_init (TREE_OPERAND (exp, 1), before); + decl = TREE_OPERAND (tmp, 1); + if (DECL_FINAL (decl)) + final_assign_error (DECL_NAME (decl)); + break; + } + else if (TREE_CODE (tmp) == COMPONENT_REF && IS_ARRAY_LENGTH_ACCESS (tmp)) + { + /* We can't emit a more specific message here, because when + compiling to bytecodes we don't get here. */ + final_assign_error (length_identifier_node); + } else goto binop; case BLOCK: *************** check_init (exp, before) *** 423,429 **** { DECL_BIT_INDEX (decl) = num_current_locals++; } ! words_needed = WORDS_NEEDED (num_current_locals); if (words_needed > num_current_words) { tmp = ALLOC_WORDS (words_needed); --- 580,586 ---- { DECL_BIT_INDEX (decl) = num_current_locals++; } ! words_needed = WORDS_NEEDED (2 * num_current_locals); if (words_needed > num_current_words) { tmp = ALLOC_WORDS (words_needed); *************** check_init (exp, before) *** 433,440 **** else tmp = before; for (i = start_current_locals; i < num_current_locals; i++) ! CLEAR_BIT (tmp, i); check_init (BLOCK_EXPR_BODY (exp), tmp); num_current_locals = start_current_locals; start_current_locals = save_start_current_locals; if (tmp != before) --- 590,618 ---- else tmp = before; for (i = start_current_locals; i < num_current_locals; i++) ! { ! CLEAR_ASSIGNED (tmp, i); ! SET_UNASSIGNED (tmp, i); ! } check_init (BLOCK_EXPR_BODY (exp), tmp); + + /* Re-set DECL_BIT_INDEX since it is also DECL_POINTER_ALIAS_SET. */ + for (decl = BLOCK_EXPR_DECLS (exp); + decl != NULL_TREE; decl = TREE_CHAIN (decl)) + { + if (LOCAL_CLASS_INITIALIZATION_FLAG_P (decl)) + { + int index = DECL_BIT_INDEX (decl); + tree fndecl = DECL_CONTEXT (decl); + if (fndecl && METHOD_STATIC (fndecl) + && (DECL_INITIAL (decl) == boolean_true_node + || (index >= 0 && ASSIGNED_P (tmp, index)))) + hash_lookup (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl), + DECL_FUNCTION_INIT_TEST_CLASS(decl), TRUE, NULL); + } + DECL_BIT_INDEX (decl) = -1; + } + num_current_locals = start_current_locals; start_current_locals = save_start_current_locals; if (tmp != before) *************** check_init (exp, before) *** 447,465 **** break; case LOOP_EXPR: { struct alternatives alt; BEGIN_ALTERNATIVES (before, alt); alt.block = exp; check_init (TREE_OPERAND (exp, 0), before); END_ALTERNATIVES (before, alt); return; } case EXIT_EXPR: { struct alternatives *alt = alternatives; ! words tmp = ALLOC_WORDS (2 * num_current_words); ! words when_true = tmp; ! words when_false = tmp + num_current_words; #ifdef ENABLE_JC1_CHECKING if (TREE_CODE (alt->block) != LOOP_EXPR) abort (); --- 625,657 ---- break; case LOOP_EXPR: { + /* The JLS 2nd edition discusses a complication determining + definite unassignment of loop statements. They define a + "hypothetical" analysis model. We do something much + simpler: We just disallow assignments inside loops to final + variables declared outside the loop. This means we may + disallow some contrived assignments that the JLS, but I + can't see how anything except a very contrived testcase (a + do-while whose condition is false?) would care. */ + struct alternatives alt; + int save_loop_current_locals = loop_current_locals; + int save_start_current_locals = start_current_locals; + loop_current_locals = num_current_locals; + start_current_locals = num_current_locals; BEGIN_ALTERNATIVES (before, alt); alt.block = exp; check_init (TREE_OPERAND (exp, 0), before); END_ALTERNATIVES (before, alt); + loop_current_locals = save_loop_current_locals; + start_current_locals = save_start_current_locals; return; } case EXIT_EXPR: { struct alternatives *alt = alternatives; ! DECLARE_BUFFERS(when_true, 2); ! words when_false = when_true + num_current_words; #ifdef ENABLE_JC1_CHECKING if (TREE_CODE (alt->block) != LOOP_EXPR) abort (); *************** check_init (exp, before) *** 467,473 **** check_bool_init (TREE_OPERAND (exp, 0), before, when_false, when_true); done_alternative (when_true, alt); COPY (before, when_false); ! FREE_WORDS (tmp); return; } case LABELED_BLOCK_EXPR: --- 659,665 ---- check_bool_init (TREE_OPERAND (exp, 0), before, when_false, when_true); done_alternative (when_true, alt); COPY (before, when_false); ! RELEASE_BUFFERS(when_true); return; } case LABELED_BLOCK_EXPR: *************** check_init (exp, before) *** 494,507 **** case SWITCH_EXPR: { struct alternatives alt; check_init (TREE_OPERAND (exp, 0), before); BEGIN_ALTERNATIVES (before, alt); ! alt.saved = ALLOC_WORDS (num_current_words); COPY (alt.saved, before); alt.block = exp; check_init (TREE_OPERAND (exp, 1), before); done_alternative (before, &alt); ! FREE_WORDS (alt.saved); END_ALTERNATIVES (before, alt); return; } --- 686,702 ---- case SWITCH_EXPR: { struct alternatives alt; + word buf[2]; check_init (TREE_OPERAND (exp, 0), before); BEGIN_ALTERNATIVES (before, alt); ! alt.saved = ALLOC_BUFFER(buf, num_current_words); COPY (alt.saved, before); alt.block = exp; check_init (TREE_OPERAND (exp, 1), before); done_alternative (before, &alt); ! if (! SWITCH_HAS_DEFAULT (exp)) ! done_alternative (alt.saved, &alt); ! FREE_BUFFER(alt.saved, buf); END_ALTERNATIVES (before, alt); return; } *************** check_init (exp, before) *** 512,552 **** struct alternatives *alt = alternatives; while (TREE_CODE (alt->block) != SWITCH_EXPR) alt = alt->outer; ! COPYN (before, alt->saved, WORDS_NEEDED (alt->num_locals)); for (i = alt->num_locals; i < num_current_locals; i++) ! CLEAR_BIT (before, i); break; } - case CLEANUP_POINT_EXPR: - { - struct alternatives alt; - BEGIN_ALTERNATIVES (before, alt); - CLEAR_ALL (alt.combined); - check_init (TREE_OPERAND (exp, 0), before); - UNION (alt.combined, alt.combined, before); - END_ALTERNATIVES (before, alt); - } - return; - case WITH_CLEANUP_EXPR: - { - struct alternatives *alt = alternatives; - #ifdef ENABLE_JC1_CHECKING - if (TREE_CODE (alt->block) != CLEANUP_POINT_EXPR) - abort (); - #endif - check_init (TREE_OPERAND (exp, 0), before); - UNION (alt->combined, alt->combined, before); - check_init (TREE_OPERAND (exp, 2), alt->combined); - return; - } - case TRY_EXPR: { tree try_clause = TREE_OPERAND (exp, 0); tree clause = TREE_OPERAND (exp, 1); ! words save = ALLOC_WORDS (num_current_words); ! words tmp = ALLOC_WORDS (num_current_words); struct alternatives alt; BEGIN_ALTERNATIVES (before, alt); COPY (save, before); --- 707,726 ---- struct alternatives *alt = alternatives; while (TREE_CODE (alt->block) != SWITCH_EXPR) alt = alt->outer; ! COPYN (before, alt->saved, WORDS_NEEDED (2 * alt->num_locals)); for (i = alt->num_locals; i < num_current_locals; i++) ! CLEAR_ASSIGNED (before, i); break; } case TRY_EXPR: { tree try_clause = TREE_OPERAND (exp, 0); tree clause = TREE_OPERAND (exp, 1); ! word buf[2*2]; ! words tmp = (num_current_words <= 2 ? buf ! : ALLOC_WORDS (2 * num_current_words)); ! words save = tmp + num_current_words; struct alternatives alt; BEGIN_ALTERNATIVES (before, alt); COPY (save, before); *************** check_init (exp, before) *** 560,579 **** check_init (catch_clause, tmp); done_alternative (tmp, &alt); } ! FREE_WORDS (tmp); ! FREE_WORDS (save); END_ALTERNATIVES (before, alt); } return; case TRY_FINALLY_EXPR: { ! words tmp = ALLOC_WORDS (num_current_words); COPY (tmp, before); check_init (TREE_OPERAND (exp, 0), before); check_init (TREE_OPERAND (exp, 1), tmp); UNION (before, before, tmp); ! FREE_WORDS (tmp); } return; --- 734,755 ---- check_init (catch_clause, tmp); done_alternative (tmp, &alt); } ! if (tmp != buf) ! { ! FREE_WORDS (tmp); ! } END_ALTERNATIVES (before, alt); } return; case TRY_FINALLY_EXPR: { ! DECLARE_BUFFERS(tmp, 1); COPY (tmp, before); check_init (TREE_OPERAND (exp, 0), before); check_init (TREE_OPERAND (exp, 1), tmp); UNION (before, before, tmp); ! RELEASE_BUFFERS(tmp); } return; *************** check_init (exp, before) *** 592,605 **** case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: { ! words tmp = ALLOC_WORDS (2 * num_current_words); ! words when_true = tmp; ! words when_false = tmp + num_current_words; check_bool_init (exp, before, when_false, when_true); INTERSECT (before, when_false, when_true); ! FREE_WORDS (tmp); } break; case UNARY_PLUS_EXPR: case NEGATE_EXPR: case TRUTH_AND_EXPR: --- 768,785 ---- case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: { ! DECLARE_BUFFERS(when_true, 2); ! words when_false = when_true + num_current_words; check_bool_init (exp, before, when_false, when_true); INTERSECT (before, when_false, when_true); ! RELEASE_BUFFERS(when_true); } break; + + case NOP_EXPR: + if (exp == empty_stmt_node) + break; + /* ... else fall through ... */ case UNARY_PLUS_EXPR: case NEGATE_EXPR: case TRUTH_AND_EXPR: *************** check_init (exp, before) *** 608,636 **** case TRUTH_NOT_EXPR: case BIT_NOT_EXPR: case CONVERT_EXPR: - case COMPONENT_REF: case BIT_FIELD_REF: - case NOP_EXPR: case FLOAT_EXPR: case FIX_TRUNC_EXPR: case INDIRECT_REF: case ADDR_EXPR: - case PREDECREMENT_EXPR: - case PREINCREMENT_EXPR: - case POSTDECREMENT_EXPR: - case POSTINCREMENT_EXPR: case NON_LVALUE_EXPR: case INSTANCEOF_EXPR: case FIX_CEIL_EXPR: case FIX_FLOOR_EXPR: case FIX_ROUND_EXPR: - case EXPON_EXPR: case ABS_EXPR: case FFS_EXPR: /* Avoid needless recursion. */ exp = TREE_OPERAND (exp, 0); goto again; case SAVE_EXPR: if (IS_INIT_CHECKED (exp)) return; --- 788,821 ---- case TRUTH_NOT_EXPR: case BIT_NOT_EXPR: case CONVERT_EXPR: case BIT_FIELD_REF: case FLOAT_EXPR: case FIX_TRUNC_EXPR: case INDIRECT_REF: case ADDR_EXPR: case NON_LVALUE_EXPR: case INSTANCEOF_EXPR: case FIX_CEIL_EXPR: case FIX_FLOOR_EXPR: case FIX_ROUND_EXPR: case ABS_EXPR: case FFS_EXPR: /* Avoid needless recursion. */ exp = TREE_OPERAND (exp, 0); goto again; + case PREDECREMENT_EXPR: + case PREINCREMENT_EXPR: + case POSTDECREMENT_EXPR: + case POSTINCREMENT_EXPR: + tmp = get_variable_decl (TREE_OPERAND (exp, 0)); + if (tmp != NULL_TREE && DECL_FINAL (tmp)) + final_assign_error (DECL_NAME (tmp)); + + /* Avoid needless recursion. */ + exp = TREE_OPERAND (exp, 0); + goto again; + case SAVE_EXPR: if (IS_INIT_CHECKED (exp)) return; *************** check_init (exp, before) *** 675,681 **** exp = TREE_OPERAND (exp, 1); goto again; - case PARM_DECL: case RESULT_DECL: case FUNCTION_DECL: case INTEGER_CST: --- 860,865 ---- *************** check_init (exp, before) *** 734,742 **** } void ! check_for_initialization (body) ! tree body; { ! word before = 0; ! check_init (body, &before); } --- 918,1025 ---- } void ! check_for_initialization (body, mdecl) ! tree body, mdecl; { ! tree decl; ! word buf[2]; ! words before = buf; ! tree owner = DECL_CONTEXT (mdecl); ! int is_static_method = METHOD_STATIC (mdecl); ! /* We don't need to check final fields of it it calls this(). */ ! int is_finit_method = DECL_FINIT_P (mdecl) || DECL_INSTINIT_P (mdecl); ! int is_init_method ! = (is_finit_method || DECL_CLINIT_P (mdecl) ! || (DECL_INIT_P (mdecl) && ! DECL_INIT_CALLS_THIS (mdecl))); ! ! start_current_locals = num_current_locals = 0; ! num_current_words = 2; ! ! if (is_init_method) ! { ! int words_needed, i; ! for (decl = TYPE_FIELDS (owner); ! decl != NULL_TREE; decl = TREE_CHAIN (decl)) ! { ! if (DECL_FINAL (decl) && FIELD_STATIC (decl) == is_static_method) ! { ! if (DECL_FIELD_FINAL_IUD (decl)) ! DECL_BIT_INDEX (decl) = -1; ! else ! DECL_BIT_INDEX (decl) = num_current_locals++; ! } ! } ! words_needed = WORDS_NEEDED (2 * num_current_locals); ! if (words_needed > 2) ! { ! num_current_words = words_needed; ! before = ALLOC_WORDS(words_needed); ! } ! i = 0; ! for (decl = TYPE_FIELDS (owner); ! decl != NULL_TREE; decl = TREE_CHAIN (decl)) ! { ! if (FIELD_FINAL (decl) && FIELD_STATIC (decl) == is_static_method) ! { ! if (! DECL_FIELD_FINAL_IUD (decl)) ! { ! CLEAR_ASSIGNED (before, i); ! SET_UNASSIGNED (before, i); ! i++; ! } ! } ! } ! ! } ! ! check_init (body, before); ! ! if (is_init_method) ! { ! for (decl = TYPE_FIELDS (owner); ! decl != NULL_TREE; decl = TREE_CHAIN (decl)) ! { ! if (FIELD_FINAL (decl) && FIELD_STATIC (decl) == is_static_method) ! { ! int index = DECL_BIT_INDEX (decl); ! if (index >= 0 && ! ASSIGNED_P (before, index)) ! { ! if (! is_finit_method) ! error_with_decl (decl, "final field '%s' may not have been initialized"); ! } ! else if (is_finit_method) ! DECL_FIELD_FINAL_IUD (decl) = 1; ! ! /* Re-set to initial state, since we later may use the ! same bit for DECL_POINTER_ALIAS_SET. */ ! DECL_BIT_INDEX (decl) = -1; ! } ! } ! } ! ! start_current_locals = num_current_locals = 0; ! } ! ! /* Call for every element in DECL_FUNCTION_INITIALIZED_CLASS_TABLE of ! a method to consider whether the type indirectly described by ENTRY ! is definitly initialized and thus remembered as such. */ ! ! bool ! attach_initialized_static_class (entry, ptr) ! struct hash_entry *entry; ! PTR ptr; ! { ! struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry; ! tree fndecl = DECL_CONTEXT (ite->init_test_decl); ! int index = DECL_BIT_INDEX (ite->init_test_decl); ! ! /* If the initializer flag has been definitly assigned (not taking ! into account its first mandatory assignment which has been ! already added but escaped analysis.) */ ! if (fndecl && METHOD_STATIC (fndecl) ! && (DECL_INITIAL (ite->init_test_decl) == boolean_true_node ! || (index >= 0 && ASSIGNED_P (((word *) ptr), index)))) ! hash_lookup (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl), ! entry->key, TRUE, NULL); ! return true; } diff -Nrc3pad gcc-3.0.4/gcc/java/class.c gcc-3.1/gcc/java/class.c *** gcc-3.0.4/gcc/java/class.c Fri Nov 30 11:47:22 2001 --- gcc-3.1/gcc/java/class.c Wed Apr 17 23:20:43 2002 *************** *** 1,5 **** /* Functions related to building classes and their related objects. ! Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,5 ---- /* Functions related to building classes and their related objects. ! Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU CC. *************** The Free Software Foundation is independ *** 36,42 **** --- 36,50 ---- #include "toplev.h" #include "output.h" #include "parse.h" + #include "function.h" #include "ggc.h" + #include "stdio.h" + #include "target.h" + + /* DOS brain-damage */ + #ifndef O_BINARY + #define O_BINARY 0 /* MS-DOS brain-damage */ + #endif static tree make_method_value PARAMS ((tree)); static tree build_java_method_type PARAMS ((tree, tree, int)); *************** static int assume_compiled PARAMS ((cons *** 50,56 **** --- 58,67 ---- static struct hash_entry *init_test_hash_newfunc PARAMS ((struct hash_entry *, struct hash_table *, hash_table_key)); + static tree build_method_symbols_entry PARAMS ((tree)); + static rtx registerClass_libfunc; + static rtx registerResource_libfunc; extern struct obstack permanent_obstack; struct obstack temporary_obstack; *************** push_class (class_type, class_name) *** 331,342 **** input_filename = IDENTIFIER_POINTER (source_name); lineno = 0; decl = build_decl (TYPE_DECL, class_name, class_type); input_filename = save_input_filename; lineno = save_lineno; signature = identifier_subst (class_name, "L", '.', '/', ";"); IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type); ! /* Setting DECL_ARTIFICAL forces dbxout.c to specific the type is both a typedef and in the struct name-space. We may want to re-visit this later, but for now it reduces the changes needed for gdb. */ DECL_ARTIFICIAL (decl) = 1; --- 342,357 ---- input_filename = IDENTIFIER_POINTER (source_name); lineno = 0; decl = build_decl (TYPE_DECL, class_name, class_type); + + /* dbxout needs a DECL_SIZE if in gstabs mode */ + DECL_SIZE (decl) = integer_zero_node; + input_filename = save_input_filename; lineno = save_lineno; signature = identifier_subst (class_name, "L", '.', '/', ";"); IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type); ! /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is both a typedef and in the struct name-space. We may want to re-visit this later, but for now it reduces the changes needed for gdb. */ DECL_ARTIFICIAL (decl) = 1; *************** set_super_info (access_flags, this_class *** 394,399 **** --- 409,422 ---- CLASS_HAS_SUPER (this_class) = 1; } + set_class_decl_access_flags (access_flags, class_decl); + } + + void + set_class_decl_access_flags (access_flags, class_decl) + int access_flags; + tree class_decl; + { if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1; if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1; if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1; *************** set_super_info (access_flags, this_class *** 402,407 **** --- 425,431 ---- if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1; if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1; if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1; + if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1; } /* Return length of inheritance chain of CLAS, where java.lang.Object is 0, *************** init_test_hash_newfunc (entry, table, st *** 619,627 **** return (struct hash_entry *) ret; } ! /* Hash table helpers. Also reused in find_applicable_accessible_methods_list ! (parse.y). The hash of a tree node is it's pointer value, ! comparison is direct. */ unsigned long java_hash_hash_tree_node (k) --- 643,651 ---- return (struct hash_entry *) ret; } ! /* Hash table helpers. Also reused in find_applicable_accessible_methods_list ! (parse.y). The hash of a tree node is its pointer value, comparison ! is direct. */ unsigned long java_hash_hash_tree_node (k) *************** java_hash_compare_tree_node (k1, k2) *** 635,641 **** hash_table_key k1; hash_table_key k2; { ! return ((char*) k1 == (char*) k2); } tree --- 659,665 ---- hash_table_key k1; hash_table_key k2; { ! return ((tree) k1 == (tree) k2); } tree *************** add_method_1 (handle_class, access_flags *** 661,669 **** --- 685,709 ---- init_test_hash_newfunc, java_hash_hash_tree_node, java_hash_compare_tree_node); + /* Initialize the initialized (static) class table. */ + if (access_flags & ACC_STATIC) + hash_table_init (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl), + init_test_hash_newfunc, java_hash_hash_tree_node, + java_hash_compare_tree_node); + + /* Initialize the static method invocation compound list */ + DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = NULL_TREE; + TREE_CHAIN (fndecl) = TYPE_METHODS (handle_class); TYPE_METHODS (handle_class) = fndecl; + /* Notice that this is a finalizer and update the class type + accordingly. This is used to optimize instance allocation. */ + if (name == finalize_identifier_node + && TREE_TYPE (function_type) == void_type_node + && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node) + HAS_FINALIZER_P (handle_class) = 1; + if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1; if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1; if (access_flags & ACC_PRIVATE) *************** add_method_1 (handle_class, access_flags *** 680,685 **** --- 720,726 ---- if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1; if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1; if (access_flags & ACC_TRANSIENT) METHOD_TRANSIENT (fndecl) = 1; + if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1; return fndecl; } *************** add_field (class, name, field_type, flag *** 734,740 **** --- 775,785 ---- /* Always make field externally visible. This is required so that native methods can always access the field. */ TREE_PUBLIC (field) = 1; + /* Considered external until we know what classes are being + compiled into this object file. */ + DECL_EXTERNAL (field) = 1; } + return field; } *************** set_constant_value (field, constant) *** 747,757 **** if (field == NULL_TREE) warning ("misplaced ConstantValue attribute (not in any field)"); else if (DECL_INITIAL (field) != NULL_TREE) ! warning ("duplicate ConstanValue atribute for field '%s'", IDENTIFIER_POINTER (DECL_NAME (field))); else { DECL_INITIAL (field) = constant; if (FIELD_FINAL (field)) DECL_FIELD_FINAL_IUD (field) = 1; } --- 792,810 ---- if (field == NULL_TREE) warning ("misplaced ConstantValue attribute (not in any field)"); else if (DECL_INITIAL (field) != NULL_TREE) ! warning ("duplicate ConstantValue attribute for field '%s'", IDENTIFIER_POINTER (DECL_NAME (field))); else { DECL_INITIAL (field) = constant; + if (TREE_TYPE (constant) != TREE_TYPE (field) + && ! (TREE_TYPE (constant) == int_type_node + && INTEGRAL_TYPE_P (TREE_TYPE (field)) + && TYPE_PRECISION (TREE_TYPE (field)) <= 32) + && ! (TREE_TYPE (constant) == utf8const_ptr_type + && TREE_TYPE (field) == string_ptr_type_node)) + error ("ConstantValue attribute of field '%s' has wrong type", + IDENTIFIER_POINTER (DECL_NAME (field))); if (FIELD_FINAL (field)) DECL_FIELD_FINAL_IUD (field) = 1; } *************** hashUtf8String (str, len) *** 799,804 **** --- 852,963 ---- return hash; } + /* Generate a byte array representing the contents of FILENAME. The + array is assigned a unique local symbol. The array represents a + compiled Java resource, which is accessed by the runtime using + NAME. */ + void + compile_resource_file (name, filename) + char *name; + const char *filename; + { + struct stat stat_buf; + int fd; + char *buffer; + char buf[60]; + tree rtype, field = NULL_TREE, data_type, rinit, data, decl; + static int Jr_count = 0; + + fd = open (filename, O_RDONLY | O_BINARY); + if (fd < 0) + { + perror ("Failed to read resource file"); + return; + } + if (fstat (fd, &stat_buf) != 0 + || ! S_ISREG (stat_buf.st_mode)) + { + perror ("Could not figure length of resource file"); + return; + } + buffer = xmalloc (strlen (name) + stat_buf.st_size); + strcpy (buffer, name); + read (fd, buffer + strlen (name), stat_buf.st_size); + close (fd); + data_type = build_prim_array_type (unsigned_byte_type_node, + strlen (name) + stat_buf.st_size); + rtype = make_node (RECORD_TYPE); + PUSH_FIELD (rtype, field, "name_length", unsigned_int_type_node); + PUSH_FIELD (rtype, field, "resource_length", unsigned_int_type_node); + PUSH_FIELD (rtype, field, "data", data_type); + FINISH_RECORD (rtype); + START_RECORD_CONSTRUCTOR (rinit, rtype); + PUSH_FIELD_VALUE (rinit, "name_length", + build_int_2 (strlen (name), 0)); + PUSH_FIELD_VALUE (rinit, "resource_length", + build_int_2 (stat_buf.st_size, 0)); + data = build_string (strlen(name) + stat_buf.st_size, buffer); + TREE_TYPE (data) = data_type; + PUSH_FIELD_VALUE (rinit, "data", data); + FINISH_RECORD_CONSTRUCTOR (rinit); + TREE_CONSTANT (rinit) = 1; + + /* Generate a unique-enough identifier. */ + sprintf(buf, "_Jr%d", ++Jr_count); + + decl = build_decl (VAR_DECL, get_identifier (buf), rtype); + TREE_STATIC (decl) = 1; + DECL_ARTIFICIAL (decl) = 1; + DECL_IGNORED_P (decl) = 1; + TREE_READONLY (decl) = 1; + TREE_THIS_VOLATILE (decl) = 0; + DECL_INITIAL (decl) = rinit; + layout_decl (decl, 0); + pushdecl (decl); + rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0); + make_decl_rtl (decl, (char*) 0); + assemble_variable (decl, 1, 0, 0); + + { + tree init_name = get_file_function_name ('I'); + tree init_type = build_function_type (void_type_node, end_params_node); + tree init_decl; + + init_decl = build_decl (FUNCTION_DECL, init_name, init_type); + SET_DECL_ASSEMBLER_NAME (init_decl, init_name); + TREE_STATIC (init_decl) = 1; + current_function_decl = init_decl; + DECL_RESULT (init_decl) = build_decl (RESULT_DECL, + NULL_TREE, void_type_node); + + /* It can be a static function as long as collect2 does not have + to scan the object file to find its ctor/dtor routine. */ + TREE_PUBLIC (init_decl) = ! targetm.have_ctors_dtors; + + pushlevel (0); + make_decl_rtl (init_decl, NULL); + init_function_start (init_decl, input_filename, 0); + expand_function_start (init_decl, 0); + + emit_library_call (registerResource_libfunc, 0, VOIDmode, 1, + gen_rtx (SYMBOL_REF, Pmode, buf), + Pmode); + + expand_function_end (input_filename, 0, 0); + poplevel (1, 0, 1); + { + /* Force generation, even with -O3 or deeper. Gross hack. FIXME */ + int saved_flag = flag_inline_functions; + flag_inline_functions = 0; + rest_of_compilation (init_decl); + flag_inline_functions = saved_flag; + } + current_function_decl = NULL_TREE; + (* targetm.asm_out.constructor) (XEXP (DECL_RTL (init_decl), 0), + DEFAULT_INIT_PRIORITY); + } + } + tree utf8_decl_list = NULL_TREE; tree *************** build_utf8_ref (name) *** 837,849 **** sprintf(buf, "_Utf%d", ++utf8_count); decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type); - /* FIXME get some way to force this into .text, not .data. */ TREE_STATIC (decl) = 1; DECL_ARTIFICIAL (decl) = 1; DECL_IGNORED_P (decl) = 1; TREE_READONLY (decl) = 1; TREE_THIS_VOLATILE (decl) = 0; DECL_INITIAL (decl) = cinit; TREE_CHAIN (decl) = utf8_decl_list; layout_decl (decl, 0); pushdecl (decl); --- 996,1024 ---- sprintf(buf, "_Utf%d", ++utf8_count); decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type); TREE_STATIC (decl) = 1; DECL_ARTIFICIAL (decl) = 1; DECL_IGNORED_P (decl) = 1; TREE_READONLY (decl) = 1; TREE_THIS_VOLATILE (decl) = 0; DECL_INITIAL (decl) = cinit; + #ifdef HAVE_GAS_SHF_MERGE + { + int decl_size; + /* Ensure decl_size is a multiple of utf8const_type's alignment. */ + decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1) + & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1); + if (flag_merge_constants && decl_size < 256) + { + char buf[32]; + int flags = (SECTION_OVERRIDE + | SECTION_MERGE | (SECTION_ENTSIZE & decl_size)); + sprintf (buf, ".rodata.jutf8.%d", decl_size); + named_section_flags (buf, flags); + DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf); + } + } + #endif TREE_CHAIN (decl) = utf8_decl_list; layout_decl (decl, 0); pushdecl (decl); *************** build_class_ref (type) *** 884,896 **** TREE_PUBLIC (decl) = 1; DECL_IGNORED_P (decl) = 1; DECL_ARTIFICIAL (decl) = 1; SET_DECL_ASSEMBLER_NAME (decl, java_mangle_class_field (&temporary_obstack, type)); make_decl_rtl (decl, NULL); pushdecl_top_level (decl); - if (is_compiled == 1) - DECL_EXTERNAL (decl) = 1; } } else --- 1059,1071 ---- TREE_PUBLIC (decl) = 1; DECL_IGNORED_P (decl) = 1; DECL_ARTIFICIAL (decl) = 1; + if (is_compiled == 1) + DECL_EXTERNAL (decl) = 1; SET_DECL_ASSEMBLER_NAME (decl, java_mangle_class_field (&temporary_obstack, type)); make_decl_rtl (decl, NULL); pushdecl_top_level (decl); } } else *************** build_class_ref (type) *** 940,949 **** decl = build_decl (VAR_DECL, decl_name, class_type_node); TREE_STATIC (decl) = 1; TREE_PUBLIC (decl) = 1; make_decl_rtl (decl, NULL); pushdecl_top_level (decl); - if (is_compiled == 1) - DECL_EXTERNAL (decl) = 1; } } --- 1115,1123 ---- decl = build_decl (VAR_DECL, decl_name, class_type_node); TREE_STATIC (decl) = 1; TREE_PUBLIC (decl) = 1; + DECL_EXTERNAL (decl) = 1; make_decl_rtl (decl, NULL); pushdecl_top_level (decl); } } *************** get_access_flags_from_decl (decl) *** 1051,1056 **** --- 1225,1232 ---- access_flags |= ACC_PRIVATE; if (CLASS_PROTECTED (decl)) access_flags |= ACC_PROTECTED; + if (CLASS_STRICTFP (decl)) + access_flags |= ACC_STRICT; return access_flags; } if (TREE_CODE (decl) == FUNCTION_DECL) *************** get_access_flags_from_decl (decl) *** 1073,1078 **** --- 1249,1256 ---- access_flags |= ACC_ABSTRACT; if (METHOD_TRANSIENT (decl)) access_flags |= ACC_TRANSIENT; + if (METHOD_STRICTFP (decl)) + access_flags |= ACC_STRICT; return access_flags; } abort (); *************** static tree *** 1127,1136 **** --- 1305,1322 ---- make_method_value (mdecl) tree mdecl; { + static int method_name_count = 0; tree minit; + tree index; tree code; #define ACC_TRANSLATED 0x4000 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED; + + if (!flag_indirect_dispatch && DECL_VINDEX (mdecl) != NULL_TREE) + index = DECL_VINDEX (mdecl); + else + index = integer_minus_one_node; + code = null_pointer_node; if (DECL_RTL_SET_P (mdecl)) code = build1 (ADDR_EXPR, nativecode_ptr_type_node, mdecl); *************** make_method_value (mdecl) *** 1148,1154 **** --- 1334,1379 ---- IDENTIFIER_LENGTH(signature))))); } PUSH_FIELD_VALUE (minit, "accflags", build_int_2 (accflags, 0)); + PUSH_FIELD_VALUE (minit, "index", index); PUSH_FIELD_VALUE (minit, "ncode", code); + + { + /* Compute the `throws' information for the method. */ + tree table = null_pointer_node; + if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE) + { + int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl)); + tree iter, type, array; + char buf[60]; + + table = tree_cons (NULL_TREE, table, NULL_TREE); + for (iter = DECL_FUNCTION_THROWS (mdecl); + iter != NULL_TREE; + iter = TREE_CHAIN (iter)) + { + tree sig = build_java_signature (TREE_VALUE (iter)); + tree utf8 + = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig), + IDENTIFIER_LENGTH (sig))); + table = tree_cons (NULL_TREE, utf8, table); + } + type = build_prim_array_type (ptr_type_node, length); + table = build (CONSTRUCTOR, type, NULL_TREE, table); + /* Compute something unique enough. */ + sprintf (buf, "_methods%d", method_name_count++); + array = build_decl (VAR_DECL, get_identifier (buf), type); + DECL_INITIAL (array) = table; + TREE_STATIC (array) = 1; + DECL_ARTIFICIAL (array) = 1; + DECL_IGNORED_P (array) = 1; + rest_of_decl_compilation (array, (char*) 0, 1, 0); + + table = build1 (ADDR_EXPR, ptr_type_node, array); + } + + PUSH_FIELD_VALUE (minit, "throws", table); + } + FINISH_RECORD_CONSTRUCTOR (minit); return minit; } *************** get_dispatch_table (type, this_class_add *** 1195,1200 **** --- 1420,1426 ---- tree list = NULL_TREE; int nvirtuals = TREE_VEC_LENGTH (vtable); int arraysize; + tree gc_descr; for (i = nvirtuals; --i >= 0; ) { *************** get_dispatch_table (type, this_class_add *** 1236,1252 **** using the Boehm GC we sometimes stash a GC type descriptor there. We set the PURPOSE to NULL_TREE not to interfere (reset) the emitted byte count during the output to the assembly file. */ ! for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j) ! list = tree_cons (NULL_TREE, null_pointer_node, list); ! list = tree_cons (NULL_TREE, get_boehm_type_descriptor (type), list); ! for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j) ! list = tree_cons (NULL_TREE, null_pointer_node, list); ! list = tree_cons (integer_zero_node, this_class_addr, list); ! arraysize = nvirtuals + 2; if (TARGET_VTABLE_USES_DESCRIPTORS) arraysize *= TARGET_VTABLE_USES_DESCRIPTORS; return build (CONSTRUCTOR, build_prim_array_type (nativecode_ptr_type_node, arraysize), NULL_TREE, list); --- 1462,1486 ---- using the Boehm GC we sometimes stash a GC type descriptor there. We set the PURPOSE to NULL_TREE not to interfere (reset) the emitted byte count during the output to the assembly file. */ ! /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra ! fake "function descriptor". It's first word is the is the class ! pointer, and subsequent words (usually one) contain the GC descriptor. ! In all other cases, we reserve two extra vtable slots. */ ! gc_descr = get_boehm_type_descriptor (type); ! list = tree_cons (NULL_TREE, gc_descr, list); ! for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j) ! list = tree_cons (NULL_TREE, gc_descr, list); ! list = tree_cons (NULL_TREE, this_class_addr, list); ! /** Pointer to type_info object (to be implemented), according to g++ ABI. */ ! list = tree_cons (NULL_TREE, null_pointer_node, list); ! /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */ ! list = tree_cons (integer_zero_node, null_pointer_node, list); ! arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2); if (TARGET_VTABLE_USES_DESCRIPTORS) arraysize *= TARGET_VTABLE_USES_DESCRIPTORS; + arraysize += 2; return build (CONSTRUCTOR, build_prim_array_type (nativecode_ptr_type_node, arraysize), NULL_TREE, list); *************** make_class_data (type) *** 1276,1281 **** --- 1510,1518 ---- tree interfaces = null_pointer_node; int interface_len = 0; tree type_decl = TYPE_NAME (type); + /** Offset from start of virtual function table declaration + to where objects actually point at, following new g++ ABI. */ + tree dtable_start_offset = build_int_2 (2 * POINTER_SIZE / BITS_PER_UNIT, 0); this_class_addr = build_class_ref (type); decl = TREE_OPERAND (this_class_addr, 0); *************** make_class_data (type) *** 1352,1358 **** rest_of_decl_compilation (methods_decl, (char*) 0, 1, 0); if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl))) ! && ! CLASS_INTERFACE (type_decl)) { tree dtable = get_dispatch_table (type, this_class_addr); dtable_decl = build_dtable_decl (type); --- 1589,1595 ---- rest_of_decl_compilation (methods_decl, (char*) 0, 1, 0); if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl))) ! && ! CLASS_INTERFACE (type_decl) && !flag_indirect_dispatch) { tree dtable = get_dispatch_table (type, this_class_addr); dtable_decl = build_dtable_decl (type); *************** make_class_data (type) *** 1429,1435 **** START_RECORD_CONSTRUCTOR (temp, object_type_node); PUSH_FIELD_VALUE (temp, "vtable", ! build1 (ADDR_EXPR, dtable_ptr_type, class_dtable_decl)); if (! flag_hash_synchronization) PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node); FINISH_RECORD_CONSTRUCTOR (temp); --- 1666,1674 ---- START_RECORD_CONSTRUCTOR (temp, object_type_node); PUSH_FIELD_VALUE (temp, "vtable", ! build (PLUS_EXPR, dtable_ptr_type, ! build1 (ADDR_EXPR, dtable_ptr_type, class_dtable_decl), ! dtable_start_offset)); if (! flag_hash_synchronization) PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node); FINISH_RECORD_CONSTRUCTOR (temp); *************** make_class_data (type) *** 1446,1452 **** PUSH_FIELD_VALUE (cons, "methods", build1 (ADDR_EXPR, method_ptr_type_node, methods_decl)); PUSH_FIELD_VALUE (cons, "method_count", build_int_2 (method_count, 0)); ! PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type)); PUSH_FIELD_VALUE (cons, "fields", fields_decl == NULL_TREE ? null_pointer_node : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl)); --- 1685,1696 ---- PUSH_FIELD_VALUE (cons, "methods", build1 (ADDR_EXPR, method_ptr_type_node, methods_decl)); PUSH_FIELD_VALUE (cons, "method_count", build_int_2 (method_count, 0)); ! ! if (flag_indirect_dispatch) ! PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node) ! else ! PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type)); ! PUSH_FIELD_VALUE (cons, "fields", fields_decl == NULL_TREE ? null_pointer_node : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl)); *************** make_class_data (type) *** 1454,1462 **** PUSH_FIELD_VALUE (cons, "field_count", build_int_2 (field_count, 0)); PUSH_FIELD_VALUE (cons, "static_field_count", build_int_2 (static_field_count, 0)); ! PUSH_FIELD_VALUE (cons, "vtable", ! dtable_decl == NULL_TREE ? null_pointer_node ! : build1 (ADDR_EXPR, dtable_ptr_type, dtable_decl)); PUSH_FIELD_VALUE (cons, "interfaces", interfaces); PUSH_FIELD_VALUE (cons, "loader", null_pointer_node); PUSH_FIELD_VALUE (cons, "interface_count", build_int_2 (interface_len, 0)); --- 1698,1726 ---- PUSH_FIELD_VALUE (cons, "field_count", build_int_2 (field_count, 0)); PUSH_FIELD_VALUE (cons, "static_field_count", build_int_2 (static_field_count, 0)); ! ! if (flag_indirect_dispatch) ! PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node) ! else ! PUSH_FIELD_VALUE (cons, "vtable", ! dtable_decl == NULL_TREE ? null_pointer_node ! : build (PLUS_EXPR, dtable_ptr_type, ! build1 (ADDR_EXPR, dtable_ptr_type, dtable_decl), ! dtable_start_offset)); ! ! if (otable_methods == NULL_TREE) ! { ! PUSH_FIELD_VALUE (cons, "otable", null_pointer_node); ! PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node); ! } ! else ! { ! PUSH_FIELD_VALUE (cons, "otable", ! build1 (ADDR_EXPR, otable_ptr_type, otable_decl)); ! PUSH_FIELD_VALUE (cons, "otable_syms", ! build1 (ADDR_EXPR, method_symbols_array_ptr_type, ! otable_syms_decl)); ! } PUSH_FIELD_VALUE (cons, "interfaces", interfaces); PUSH_FIELD_VALUE (cons, "loader", null_pointer_node); PUSH_FIELD_VALUE (cons, "interface_count", build_int_2 (interface_len, 0)); *************** make_class_data (type) *** 1467,1476 **** --- 1731,1746 ---- PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node); PUSH_FIELD_VALUE (cons, "idt", null_pointer_node); PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node); + PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node); FINISH_RECORD_CONSTRUCTOR (cons); DECL_INITIAL (decl) = cons; + + /* Hash synchronization requires at least 64-bit alignment. */ + if (flag_hash_synchronization && POINTER_SIZE < 64) + DECL_ALIGN (decl) = 64; + rest_of_decl_compilation (decl, (char*) 0, 1, 0); } *************** finish_class () *** 1499,1516 **** { if (! TREE_ASM_WRITTEN (method) && DECL_SAVED_INSNS (method) != 0) { ! /* It's a deferred inline method. Decide if we need to emit it. */ ! if (flag_keep_inline_functions ! || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (method)) ! || ! METHOD_PRIVATE (method) ! || saw_native_method) ! { ! output_inline_function (method); ! /* Scan the list again to see if there are any earlier ! methods to emit. */ ! method = type_methods; ! continue; ! } } method = TREE_CHAIN (method); } --- 1769,1779 ---- { if (! TREE_ASM_WRITTEN (method) && DECL_SAVED_INSNS (method) != 0) { ! output_inline_function (method); ! /* Scan the list again to see if there are any earlier ! methods to emit. */ ! method = type_methods; ! continue; } method = TREE_CHAIN (method); } *************** build_dtable_decl (type) *** 1581,1587 **** /* We need to build a new dtable type so that its size is uniquely computed when we're dealing with the class for real and not just faking it (like java.lang.Class during the initialization of the ! compiler.) We now we're not faking a class when CURRENT_CLASS is TYPE. */ if (current_class == type) { --- 1844,1850 ---- /* We need to build a new dtable type so that its size is uniquely computed when we're dealing with the class for real and not just faking it (like java.lang.Class during the initialization of the ! compiler.) We know we're not faking a class when CURRENT_CLASS is TYPE. */ if (current_class == type) { *************** build_dtable_decl (type) *** 1590,1595 **** --- 1853,1861 ---- dtype = make_node (RECORD_TYPE); + PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node); + PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node); + PUSH_FIELD (dtype, dummy, "class", class_ptr_type); for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n) { *************** register_class () *** 1904,1954 **** end = current; } ! /* Generate a function that gets called at start-up (static contructor) time, ! which calls registerClass for all the compiled classes. */ void emit_register_classes () { ! extern tree get_file_function_name PARAMS ((int)); ! tree init_name = get_file_function_name ('I'); ! tree init_type = build_function_type (void_type_node, end_params_node); ! tree init_decl; ! tree t; ! init_decl = build_decl (FUNCTION_DECL, init_name, init_type); ! SET_DECL_ASSEMBLER_NAME (init_decl, init_name); ! TREE_STATIC (init_decl) = 1; ! current_function_decl = init_decl; ! DECL_RESULT (init_decl) = build_decl(RESULT_DECL, NULL_TREE, void_type_node); ! /* DECL_EXTERNAL (init_decl) = 1;*/ ! TREE_PUBLIC (init_decl) = 1; ! pushlevel (0); ! make_decl_rtl (init_decl, NULL); ! init_function_start (init_decl, input_filename, 0); ! expand_function_start (init_decl, 0); ! for ( t = registered_class; t; t = TREE_CHAIN (t)) ! emit_library_call (registerClass_libfunc, 0, VOIDmode, 1, ! XEXP (DECL_RTL (t), 0), Pmode); ! expand_function_end (input_filename, 0, 0); ! poplevel (1, 0, 1); ! { ! /* Force generation, even with -O3 or deeper. Gross hack. FIXME */ ! int saved_flag = flag_inline_functions; ! flag_inline_functions = 0; ! rest_of_compilation (init_decl); ! flag_inline_functions = saved_flag; ! } ! current_function_decl = NULL_TREE; ! assemble_constructor (IDENTIFIER_POINTER (init_name)); } void init_class_processing () { registerClass_libfunc = gen_rtx (SYMBOL_REF, Pmode, "_Jv_RegisterClass"); ggc_add_tree_root (class_roots, sizeof (class_roots) / sizeof (tree)); fields_ident = get_identifier ("fields"); info_ident = get_identifier ("info"); --- 2170,2335 ---- end = current; } ! /* Emit something to register classes at start-up time. ! ! The preferred mechanism is through the .jcr section, which contain ! a list of pointers to classes which get registered during ! constructor invoction time. The fallback mechanism is to generate ! a `constructor' function which calls _Jv_RegisterClass for each ! class in this file. */ void emit_register_classes () { ! /* ??? This isn't quite the correct test. We also have to know ! that the target is using gcc's crtbegin/crtend objects rather ! than the ones that come with the operating system. */ ! if (SUPPORTS_WEAK && targetm.have_named_sections) ! { ! #ifdef JCR_SECTION_NAME ! tree t; ! named_section_flags (JCR_SECTION_NAME, SECTION_WRITE); ! assemble_align (POINTER_SIZE); ! for (t = registered_class; t; t = TREE_CHAIN (t)) ! assemble_integer (XEXP (DECL_RTL (t), 0), ! POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); ! #else ! abort (); ! #endif ! } ! else ! { ! extern tree get_file_function_name PARAMS ((int)); ! tree init_name = get_file_function_name ('I'); ! tree init_type = build_function_type (void_type_node, end_params_node); ! tree init_decl; ! tree t; ! ! init_decl = build_decl (FUNCTION_DECL, init_name, init_type); ! SET_DECL_ASSEMBLER_NAME (init_decl, init_name); ! TREE_STATIC (init_decl) = 1; ! current_function_decl = init_decl; ! DECL_RESULT (init_decl) = build_decl (RESULT_DECL, NULL_TREE, ! void_type_node); ! /* It can be a static function as long as collect2 does not have ! to scan the object file to find its ctor/dtor routine. */ ! TREE_PUBLIC (init_decl) = ! targetm.have_ctors_dtors; ! /* Suppress spurious warnings. */ ! TREE_USED (init_decl) = 1; ! pushlevel (0); ! make_decl_rtl (init_decl, NULL); ! init_function_start (init_decl, input_filename, 0); ! expand_function_start (init_decl, 0); ! ! /* Do not allow the function to be deferred. */ ! current_function_cannot_inline ! = "static constructors and destructors cannot be inlined"; ! ! for ( t = registered_class; t; t = TREE_CHAIN (t)) ! emit_library_call (registerClass_libfunc, 0, VOIDmode, 1, ! XEXP (DECL_RTL (t), 0), Pmode); ! ! expand_function_end (input_filename, 0, 0); ! poplevel (1, 0, 1); ! rest_of_compilation (init_decl); ! current_function_decl = NULL_TREE; ! ! if (targetm.have_ctors_dtors) ! (* targetm.asm_out.constructor) (XEXP (DECL_RTL (init_decl), 0), ! DEFAULT_INIT_PRIORITY); ! } ! } ! ! /* Make a method_symbol_type (_Jv_MethodSymbol) node for METHOD. */ ! ! tree ! build_method_symbols_entry (tree method) ! { ! tree clname, name, signature, method_symbol; ! ! clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (method)))); ! name = build_utf8_ref (DECL_NAME (method)); ! signature = build_java_signature (TREE_TYPE (method)); ! signature = build_utf8_ref (unmangle_classname ! (IDENTIFIER_POINTER (signature), ! IDENTIFIER_LENGTH (signature))); ! ! START_RECORD_CONSTRUCTOR (method_symbol, method_symbol_type); ! PUSH_FIELD_VALUE (method_symbol, "clname", clname); ! PUSH_FIELD_VALUE (method_symbol, "name", name); ! PUSH_FIELD_VALUE (method_symbol, "signature", signature); ! FINISH_RECORD_CONSTRUCTOR (method_symbol); ! TREE_CONSTANT (method_symbol) = 1; ! ! return method_symbol; ! } ! ! /* Emit the offset symbols table for indirect virtual dispatch. */ ! ! void ! emit_offset_symbol_table () ! { ! tree method_list, method, table, list, null_symbol; ! tree otable_bound, otable_array_type; ! int index; ! ! /* Only emit an offset table if this translation unit actually made virtual ! calls. */ ! if (otable_methods == NULL_TREE) ! return; ! ! /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */ ! index = 0; ! method_list = otable_methods; ! list = NULL_TREE; ! while (method_list != NULL_TREE) ! { ! method = TREE_VALUE (method_list); ! list = tree_cons (NULL_TREE, build_method_symbols_entry (method), list); ! method_list = TREE_CHAIN (method_list); ! index++; ! } ! ! /* Terminate the list with a "null" entry. */ ! START_RECORD_CONSTRUCTOR (null_symbol, method_symbol_type); ! PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node); ! PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node); ! PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node); ! FINISH_RECORD_CONSTRUCTOR (null_symbol); ! TREE_CONSTANT (null_symbol) = 1; ! list = tree_cons (NULL_TREE, null_symbol, list); ! ! /* Put the list in the right order and make it a constructor. */ ! list = nreverse (list); ! table = build (CONSTRUCTOR, method_symbols_array_type, NULL_TREE, list); ! ! /* Make it the initial value for otable_syms and emit the decl. */ ! DECL_INITIAL (otable_syms_decl) = table; ! DECL_ARTIFICIAL (otable_syms_decl) = 1; ! DECL_IGNORED_P (otable_syms_decl) = 1; ! rest_of_decl_compilation (otable_syms_decl, NULL, 1, 0); ! ! /* Now that its size is known, redefine otable as an uninitialized static ! array of INDEX + 1 integers. The extra entry is used by the runtime ! to track whether the otable has been initialized. */ ! otable_bound = build_index_type (build_int_2 (index, 0)); ! otable_array_type = build_array_type (integer_type_node, otable_bound); ! otable_decl = build_decl (VAR_DECL, get_identifier ("otable"), ! otable_array_type); ! TREE_STATIC (otable_decl) = 1; ! TREE_READONLY (otable_decl) = 1; ! rest_of_decl_compilation (otable_decl, NULL, 1, 0); } void init_class_processing () { registerClass_libfunc = gen_rtx (SYMBOL_REF, Pmode, "_Jv_RegisterClass"); + registerResource_libfunc = + gen_rtx (SYMBOL_REF, Pmode, "_Jv_RegisterResource"); ggc_add_tree_root (class_roots, sizeof (class_roots) / sizeof (tree)); fields_ident = get_identifier ("fields"); info_ident = get_identifier ("info"); diff -Nrc3pad gcc-3.0.4/gcc/java/config-lang.in gcc-3.1/gcc/java/config-lang.in *** gcc-3.0.4/gcc/java/config-lang.in Wed Apr 25 21:36:12 2001 --- gcc-3.1/gcc/java/config-lang.in Thu Dec 20 00:20:47 2001 *************** *** 29,35 **** # language - name of language as it would appear in $(LANGUAGES) # compilers - value to add to $(COMPILERS) # stagestuff - files to add to $(STAGESTUFF) - # diff_excludes - files to ignore when building diffs between two versions. language="java" --- 29,34 ---- diff -Nrc3pad gcc-3.0.4/gcc/java/constants.c gcc-3.1/gcc/java/constants.c *** gcc-3.0.4/gcc/java/constants.c Thu Apr 26 18:40:28 2001 --- gcc-3.1/gcc/java/constants.c Thu Apr 26 18:32:22 2001 *************** find_methodref_with_class_index (cpool, *** 222,228 **** #define PUT1(X) (*ptr++ = (X)) #define PUT2(X) (PUT1((X) >> 8), PUT1(X)) #define PUT4(X) (PUT2((X) >> 16), PUT2(X)) ! #define PUTN(P, N) (bcopy(P, ptr, N), ptr += (N)) /* Give the number of bytes needed in a .class file for the CPOOL constant pool. Includes the 2-byte constant_pool_count. */ --- 222,228 ---- #define PUT1(X) (*ptr++ = (X)) #define PUT2(X) (PUT1((X) >> 8), PUT1(X)) #define PUT4(X) (PUT2((X) >> 16), PUT2(X)) ! #define PUTN(P, N) (memcpy(ptr, (P), (N)), ptr += (N)) /* Give the number of bytes needed in a .class file for the CPOOL constant pool. Includes the 2-byte constant_pool_count. */ diff -Nrc3pad gcc-3.0.4/gcc/java/decl.c gcc-3.1/gcc/java/decl.c *** gcc-3.0.4/gcc/java/decl.c Sun May 13 07:10:21 2001 --- gcc-3.1/gcc/java/decl.c Wed Apr 17 23:20:43 2002 *************** The Free Software Foundation is independ *** 34,42 **** #include "flags.h" #include "java-tree.h" #include "jcf.h" - #include "toplev.h" #include "function.h" #include "expr.h" #include "except.h" #include "java-except.h" #include "ggc.h" --- 34,42 ---- #include "flags.h" #include "java-tree.h" #include "jcf.h" #include "function.h" #include "expr.h" + #include "libfuncs.h" #include "except.h" #include "java-except.h" #include "ggc.h" *************** static tree push_jvm_slot PARAMS ((int, *** 49,56 **** static tree lookup_name_current_level PARAMS ((tree)); static tree push_promoted_type PARAMS ((const char *, tree)); static struct binding_level *make_binding_level PARAMS ((void)); - static bool emit_init_test_initialization PARAMS ((struct hash_entry *, - hash_table_key)); static tree create_primitive_vtable PARAMS ((const char *)); static tree check_local_named_variable PARAMS ((tree, tree, int, int *)); static tree check_local_unnamed_variable PARAMS ((tree, tree, tree)); --- 49,54 ---- *************** push_jvm_slot (index, decl) *** 110,116 **** while (tmp != NULL_TREE) { if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp))) ! rtl = DECL_RTL (tmp); if (rtl != NULL) break; tmp = DECL_LOCAL_SLOT_CHAIN (tmp); --- 108,114 ---- while (tmp != NULL_TREE) { if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (tmp))) ! rtl = DECL_RTL_IF_SET (tmp); if (rtl != NULL) break; tmp = DECL_LOCAL_SLOT_CHAIN (tmp); *************** int flag_traditional; *** 329,336 **** tree java_global_trees[JTI_MAX]; - tree predef_filenames[PREDEF_FILENAMES_SIZE]; - /* Build (and pushdecl) a "promoted type" for all standard types shorter than int. */ --- 327,332 ---- *************** builtin_function (name, type, function_c *** 378,384 **** TREE_PUBLIC (decl) = 1; if (library_name) SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name)); ! make_decl_rtl (decl, NULL_PTR); pushdecl (decl); DECL_BUILT_IN_CLASS (decl) = class; DECL_FUNCTION_CODE (decl) = function_code; --- 374,380 ---- TREE_PUBLIC (decl) = 1; if (library_name) SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name)); ! make_decl_rtl (decl, NULL); pushdecl (decl); DECL_BUILT_IN_CLASS (decl) = class; DECL_FUNCTION_CODE (decl) = function_code; *************** create_primitive_vtable (name) *** 396,407 **** sprintf (buf, "_Jv_%sVTable", name); r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node); DECL_EXTERNAL (r) = 1; - make_decl_rtl (r, buf); return r; } void ! init_decl_processing () { register tree endlink; tree field = NULL_TREE; --- 392,402 ---- sprintf (buf, "_Jv_%sVTable", name); r = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node); DECL_EXTERNAL (r) = 1; return r; } void ! java_init_decl_processing () { register tree endlink; tree field = NULL_TREE; *************** init_decl_processing () *** 544,565 **** string_ptr_type_node = promote_type (string_type_node); class_type_node = lookup_class (get_identifier ("java.lang.Class")); throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable")); runtime_exception_type_node = lookup_class (get_identifier ("java.lang.RuntimeException")); error_exception_type_node = lookup_class (get_identifier ("java.lang.Error")); rawdata_ptr_type_node = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData"))); ! /* If you add to this section, don't forget to increase ! PREDEF_FILENAMES_SIZE. */ ! predef_filenames [0] = get_identifier ("java/lang/Class.java"); ! predef_filenames [1] = get_identifier ("java/lang/Error.java"); ! predef_filenames [2] = get_identifier ("java/lang/Object.java"); ! predef_filenames [3] = get_identifier ("java/lang/RuntimeException.java"); ! predef_filenames [4] = get_identifier ("java/lang/String.java"); ! predef_filenames [5] = get_identifier ("java/lang/Throwable.java"); ! predef_filenames [6] = get_identifier ("gnu/gcj/RawData.java"); methodtable_type = make_node (RECORD_TYPE); layout_type (methodtable_type); --- 539,568 ---- string_ptr_type_node = promote_type (string_type_node); class_type_node = lookup_class (get_identifier ("java.lang.Class")); throwable_type_node = lookup_class (get_identifier ("java.lang.Throwable")); + exception_type_node = lookup_class (get_identifier ("java.lang.Exception")); runtime_exception_type_node = lookup_class (get_identifier ("java.lang.RuntimeException")); error_exception_type_node = lookup_class (get_identifier ("java.lang.Error")); + class_not_found_type_node = + lookup_class (get_identifier ("java.lang.ClassNotFoundException")); + no_class_def_found_type_node = + lookup_class (get_identifier ("java.lang.NoClassDefFoundError")); + rawdata_ptr_type_node = promote_type (lookup_class (get_identifier ("gnu.gcj.RawData"))); ! add_predefined_file (get_identifier ("java/lang/Class.java")); ! add_predefined_file (get_identifier ("java/lang/Error.java")); ! add_predefined_file (get_identifier ("java/lang/Object.java")); ! add_predefined_file (get_identifier ("java/lang/RuntimeException.java")); ! add_predefined_file (get_identifier ("java/lang/String.java")); ! add_predefined_file (get_identifier ("java/lang/Throwable.java")); ! add_predefined_file (get_identifier ("gnu/gcj/RawData.java")); ! add_predefined_file (get_identifier ("java/lang/Exception.java")); ! add_predefined_file (get_identifier ("java/lang/ClassNotFoundException.java")); ! add_predefined_file (get_identifier ("java/lang/NoClassDefFoundError.java")); ! add_predefined_file (get_identifier ("gnu/gcj/RawData.java")); methodtable_type = make_node (RECORD_TYPE); layout_type (methodtable_type); *************** init_decl_processing () *** 569,582 **** TYPE_identifier_node = get_identifier ("TYPE"); init_identifier_node = get_identifier (""); clinit_identifier_node = get_identifier (""); - /* Legacy `$finit$' special method identifier. This needs to be - recognized as equivalent to `finit$' but isn't generated anymore. */ - finit_leg_identifier_node = get_identifier ("$finit$"); - /* The new `finit$' special method identifier. This one is now - generated in place of `$finit$'. */ finit_identifier_node = get_identifier ("finit$"); void_signature_node = get_identifier ("()V"); length_identifier_node = get_identifier ("length"); this_identifier_node = get_identifier ("this"); super_identifier_node = get_identifier ("super"); continue_identifier_node = get_identifier ("continue"); --- 572,582 ---- TYPE_identifier_node = get_identifier ("TYPE"); init_identifier_node = get_identifier (""); clinit_identifier_node = get_identifier (""); finit_identifier_node = get_identifier ("finit$"); + instinit_identifier_node = get_identifier ("instinit$"); void_signature_node = get_identifier ("()V"); length_identifier_node = get_identifier ("length"); + finalize_identifier_node = get_identifier ("finalize"); this_identifier_node = get_identifier ("this"); super_identifier_node = get_identifier ("super"); continue_identifier_node = get_identifier ("continue"); *************** init_decl_processing () *** 604,609 **** --- 604,637 ---- dtable_type = make_node (RECORD_TYPE); dtable_ptr_type = build_pointer_type (dtable_type); + one_elt_array_domain_type = build_index_type (integer_one_node); + otable_type = build_array_type (integer_type_node, + one_elt_array_domain_type); + otable_ptr_type = build_pointer_type (otable_type); + + method_symbol_type = make_node (RECORD_TYPE); + PUSH_FIELD (method_symbol_type, field, "clname", utf8const_ptr_type); + PUSH_FIELD (method_symbol_type, field, "name", utf8const_ptr_type); + PUSH_FIELD (method_symbol_type, field, "signature", utf8const_ptr_type); + FINISH_RECORD (method_symbol_type); + + method_symbols_array_type = build_array_type (method_symbol_type, + one_elt_array_domain_type); + method_symbols_array_ptr_type = build_pointer_type + (method_symbols_array_type); + + otable_decl = build_decl (VAR_DECL, get_identifier ("otable"), otable_type); + DECL_EXTERNAL (otable_decl) = 1; + TREE_STATIC (otable_decl) = 1; + TREE_READONLY (otable_decl) = 1; + pushdecl (otable_decl); + + otable_syms_decl = build_decl (VAR_DECL, get_identifier ("otable_syms"), + method_symbols_array_type); + TREE_STATIC (otable_syms_decl) = 1; + TREE_CONSTANT (otable_syms_decl) = 1; + pushdecl (otable_syms_decl); + PUSH_FIELD (object_type_node, field, "vtable", dtable_ptr_type); /* This isn't exactly true, but it is what we have in the source. There is an unresolved issue here, which is whether the vtable *************** init_decl_processing () *** 637,642 **** --- 665,673 ---- PUSH_FIELD (class_type_node, field, "field_count", short_type_node); PUSH_FIELD (class_type_node, field, "static_field_count", short_type_node); PUSH_FIELD (class_type_node, field, "vtable", dtable_ptr_type); + PUSH_FIELD (class_type_node, field, "otable", otable_ptr_type); + PUSH_FIELD (class_type_node, field, "otable_syms", + method_symbols_array_ptr_type); PUSH_FIELD (class_type_node, field, "interfaces", build_pointer_type (class_ptr_type)); PUSH_FIELD (class_type_node, field, "loader", ptr_type_node); *************** init_decl_processing () *** 647,655 **** --- 678,688 ---- PUSH_FIELD (class_type_node, field, "ancestors", ptr_type_node); PUSH_FIELD (class_type_node, field, "idt", ptr_type_node); PUSH_FIELD (class_type_node, field, "arrayclass", ptr_type_node); + PUSH_FIELD (class_type_node, field, "protectionDomain", ptr_type_node); for (t = TYPE_FIELDS (class_type_node); t != NULL_TREE; t = TREE_CHAIN (t)) FIELD_PRIVATE (t) = 1; push_super_field (class_type_node, object_type_node); + FINISH_RECORD (class_type_node); build_decl (TYPE_DECL, get_identifier ("Class"), class_type_node); *************** init_decl_processing () *** 669,675 **** FINISH_RECORD (field_type_node); build_decl (TYPE_DECL, get_identifier ("Field"), field_type_node); - one_elt_array_domain_type = build_index_type (integer_one_node); nativecode_ptr_array_type_node = build_array_type (nativecode_ptr_type_node, one_elt_array_domain_type); --- 702,707 ---- *************** init_decl_processing () *** 706,712 **** --- 738,746 ---- PUSH_FIELD (method_type_node, field, "name", utf8const_ptr_type); PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type); PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node); + PUSH_FIELD (method_type_node, field, "index", unsigned_short_type_node); PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node); + PUSH_FIELD (method_type_node, field, "throws", ptr_type_node); FINISH_RECORD (method_type_node); build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node); *************** init_decl_processing () *** 716,752 **** tree_cons (NULL_TREE, int_type_node, endlink)); alloc_object_node = builtin_function ("_Jv_AllocObject", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); DECL_IS_MALLOC (alloc_object_node) = 1; t = tree_cons (NULL_TREE, ptr_type_node, endlink); soft_initclass_node = builtin_function ("_Jv_InitClass", build_function_type (void_type_node, t), ! 0, NOT_BUILT_IN, ! NULL_PTR); throw_node = builtin_function ("_Jv_Throw", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); /* Mark throw_nodes as `noreturn' functions with side effects. */ TREE_THIS_VOLATILE (throw_node) = 1; TREE_SIDE_EFFECTS (throw_node) = 1; t = build_function_type (int_type_node, endlink); soft_monitorenter_node ! = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN, ! NULL_PTR); soft_monitorexit_node ! = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN, ! NULL_PTR); t = tree_cons (NULL_TREE, int_type_node, tree_cons (NULL_TREE, int_type_node, endlink)); soft_newarray_node = builtin_function ("_Jv_NewPrimArray", build_function_type(ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); DECL_IS_MALLOC (soft_newarray_node) = 1; t = tree_cons (NULL_TREE, int_type_node, --- 750,788 ---- tree_cons (NULL_TREE, int_type_node, endlink)); alloc_object_node = builtin_function ("_Jv_AllocObject", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); DECL_IS_MALLOC (alloc_object_node) = 1; + alloc_no_finalizer_node = + builtin_function ("_Jv_AllocObjectNoFinalizer", + build_function_type (ptr_type_node, t), + 0, NOT_BUILT_IN, NULL); + DECL_IS_MALLOC (alloc_no_finalizer_node) = 1; t = tree_cons (NULL_TREE, ptr_type_node, endlink); soft_initclass_node = builtin_function ("_Jv_InitClass", build_function_type (void_type_node, t), ! 0, NOT_BUILT_IN, NULL); throw_node = builtin_function ("_Jv_Throw", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); /* Mark throw_nodes as `noreturn' functions with side effects. */ TREE_THIS_VOLATILE (throw_node) = 1; TREE_SIDE_EFFECTS (throw_node) = 1; t = build_function_type (int_type_node, endlink); soft_monitorenter_node ! = builtin_function ("_Jv_MonitorEnter", t, 0, NOT_BUILT_IN, NULL); soft_monitorexit_node ! = builtin_function ("_Jv_MonitorExit", t, 0, NOT_BUILT_IN, NULL); t = tree_cons (NULL_TREE, int_type_node, tree_cons (NULL_TREE, int_type_node, endlink)); soft_newarray_node = builtin_function ("_Jv_NewPrimArray", build_function_type(ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); DECL_IS_MALLOC (soft_newarray_node) = 1; t = tree_cons (NULL_TREE, int_type_node, *************** init_decl_processing () *** 755,761 **** soft_anewarray_node = builtin_function ("_Jv_NewObjectArray", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); DECL_IS_MALLOC (soft_anewarray_node) = 1; t = tree_cons (NULL_TREE, ptr_type_node, --- 791,797 ---- soft_anewarray_node = builtin_function ("_Jv_NewObjectArray", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); DECL_IS_MALLOC (soft_anewarray_node) = 1; t = tree_cons (NULL_TREE, ptr_type_node, *************** init_decl_processing () *** 763,776 **** soft_multianewarray_node = builtin_function ("_Jv_NewMultiArray", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); DECL_IS_MALLOC (soft_multianewarray_node) = 1; t = build_function_type (void_type_node, tree_cons (NULL_TREE, int_type_node, endlink)); soft_badarrayindex_node = builtin_function ("_Jv_ThrowBadArrayIndex", t, ! 0, NOT_BUILT_IN, NULL_PTR); /* Mark soft_badarrayindex_node as a `noreturn' function with side effects. */ TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1; --- 799,812 ---- soft_multianewarray_node = builtin_function ("_Jv_NewMultiArray", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); DECL_IS_MALLOC (soft_multianewarray_node) = 1; t = build_function_type (void_type_node, tree_cons (NULL_TREE, int_type_node, endlink)); soft_badarrayindex_node = builtin_function ("_Jv_ThrowBadArrayIndex", t, ! 0, NOT_BUILT_IN, NULL); /* Mark soft_badarrayindex_node as a `noreturn' function with side effects. */ TREE_THIS_VOLATILE (soft_badarrayindex_node) = 1; *************** init_decl_processing () *** 779,785 **** soft_nullpointer_node = builtin_function ("_Jv_ThrowNullPointerException", build_function_type (void_type_node, endlink), ! 0, NOT_BUILT_IN, NULL_PTR); /* Mark soft_nullpointer_node as a `noreturn' function with side effects. */ TREE_THIS_VOLATILE (soft_nullpointer_node) = 1; --- 815,821 ---- soft_nullpointer_node = builtin_function ("_Jv_ThrowNullPointerException", build_function_type (void_type_node, endlink), ! 0, NOT_BUILT_IN, NULL); /* Mark soft_nullpointer_node as a `noreturn' function with side effects. */ TREE_THIS_VOLATILE (soft_nullpointer_node) = 1; *************** init_decl_processing () *** 790,815 **** soft_checkcast_node = builtin_function ("_Jv_CheckCast", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); t = tree_cons (NULL_TREE, object_ptr_type_node, tree_cons (NULL_TREE, class_ptr_type, endlink)); soft_instanceof_node = builtin_function ("_Jv_IsInstanceOf", build_function_type (boolean_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); t = tree_cons (NULL_TREE, object_ptr_type_node, tree_cons (NULL_TREE, object_ptr_type_node, endlink)); soft_checkarraystore_node = builtin_function ("_Jv_CheckArrayStore", build_function_type (void_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); t = tree_cons (NULL_TREE, ptr_type_node, tree_cons (NULL_TREE, ptr_type_node, tree_cons (NULL_TREE, int_type_node, endlink))); soft_lookupinterfacemethod_node = builtin_function ("_Jv_LookupInterfaceMethodIdx", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); t = tree_cons (NULL_TREE, object_ptr_type_node, tree_cons (NULL_TREE, ptr_type_node, --- 826,851 ---- soft_checkcast_node = builtin_function ("_Jv_CheckCast", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); t = tree_cons (NULL_TREE, object_ptr_type_node, tree_cons (NULL_TREE, class_ptr_type, endlink)); soft_instanceof_node = builtin_function ("_Jv_IsInstanceOf", build_function_type (boolean_type_node, t), ! 0, NOT_BUILT_IN, NULL); t = tree_cons (NULL_TREE, object_ptr_type_node, tree_cons (NULL_TREE, object_ptr_type_node, endlink)); soft_checkarraystore_node = builtin_function ("_Jv_CheckArrayStore", build_function_type (void_type_node, t), ! 0, NOT_BUILT_IN, NULL); t = tree_cons (NULL_TREE, ptr_type_node, tree_cons (NULL_TREE, ptr_type_node, tree_cons (NULL_TREE, int_type_node, endlink))); soft_lookupinterfacemethod_node = builtin_function ("_Jv_LookupInterfaceMethodIdx", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); t = tree_cons (NULL_TREE, object_ptr_type_node, tree_cons (NULL_TREE, ptr_type_node, *************** init_decl_processing () *** 817,832 **** soft_lookupjnimethod_node = builtin_function ("_Jv_LookupJNIMethod", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); t = tree_cons (NULL_TREE, ptr_type_node, endlink); soft_getjnienvnewframe_node = builtin_function ("_Jv_GetJNIEnvNewFrame", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); soft_jnipopsystemframe_node = builtin_function ("_Jv_JNI_PopSystemFrame", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); t = tree_cons (NULL_TREE, double_type_node, tree_cons (NULL_TREE, double_type_node, endlink)); --- 853,868 ---- soft_lookupjnimethod_node = builtin_function ("_Jv_LookupJNIMethod", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); t = tree_cons (NULL_TREE, ptr_type_node, endlink); soft_getjnienvnewframe_node = builtin_function ("_Jv_GetJNIEnvNewFrame", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); soft_jnipopsystemframe_node = builtin_function ("_Jv_JNI_PopSystemFrame", build_function_type (ptr_type_node, t), ! 0, NOT_BUILT_IN, NULL); t = tree_cons (NULL_TREE, double_type_node, tree_cons (NULL_TREE, double_type_node, endlink)); *************** init_decl_processing () *** 847,868 **** soft_idiv_node = builtin_function ("_Jv_divI", build_function_type (int_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); soft_irem_node = builtin_function ("_Jv_remI", build_function_type (int_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); soft_ldiv_node = builtin_function ("_Jv_divJ", build_function_type (long_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); soft_lrem_node = builtin_function ("_Jv_remJ", build_function_type (long_type_node, t), ! 0, NOT_BUILT_IN, NULL_PTR); /* Initialize variables for except.c. */ eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS --- 883,904 ---- soft_idiv_node = builtin_function ("_Jv_divI", build_function_type (int_type_node, t), ! 0, NOT_BUILT_IN, NULL); soft_irem_node = builtin_function ("_Jv_remI", build_function_type (int_type_node, t), ! 0, NOT_BUILT_IN, NULL); soft_ldiv_node = builtin_function ("_Jv_divJ", build_function_type (long_type_node, t), ! 0, NOT_BUILT_IN, NULL); soft_lrem_node = builtin_function ("_Jv_remJ", build_function_type (long_type_node, t), ! 0, NOT_BUILT_IN, NULL); /* Initialize variables for except.c. */ eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS *************** init_decl_processing () *** 875,884 **** /* Register nodes with the garbage collector. */ ggc_add_tree_root (java_global_trees, sizeof (java_global_trees) / sizeof (tree)); - ggc_add_tree_root (predef_filenames, - sizeof (predef_filenames) / sizeof (tree)); ggc_add_tree_root (&decl_map, 1); ggc_add_tree_root (&pending_local_decls, 1); } --- 911,920 ---- /* Register nodes with the garbage collector. */ ggc_add_tree_root (java_global_trees, sizeof (java_global_trees) / sizeof (tree)); ggc_add_tree_root (&decl_map, 1); ggc_add_tree_root (&pending_local_decls, 1); + + initialize_builtins (); } *************** build_result_decl (fndecl) *** 1642,1676 **** return (DECL_RESULT (fndecl) = build_decl (RESULT_DECL, NULL_TREE, restype)); } - /* Called for every element in DECL_FUNCTION_INIT_TEST_TABLE in order - to emit initialization code for each test flag. */ - - static bool - emit_init_test_initialization (entry, key) - struct hash_entry *entry; - hash_table_key key ATTRIBUTE_UNUSED; - { - struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry; - tree klass = build_class_ref ((tree) entry->key); - expand_decl (ite->init_test_decl); - - /* We initialize the class init check variable by looking at the - `state' field of the class to see if it is already initialized. - This makes things a bit faster if the class is already - initialized, which should be the common case. */ - expand_expr_stmt - (build (MODIFY_EXPR, boolean_type_node, - ite->init_test_decl, - build (GE_EXPR, boolean_type_node, - build (COMPONENT_REF, byte_type_node, - build1 (INDIRECT_REF, class_type_node, klass), - lookup_field (&class_type_node, - get_identifier ("state"))), - build_int_2 (JV_STATE_DONE, 0)))); - - return true; - } - void complete_start_java_method (fndecl) tree fndecl; --- 1678,1683 ---- *************** complete_start_java_method (fndecl) *** 1682,1692 **** /* Set up parameters and prepare for return, for the function. */ expand_function_start (fndecl, 0); - - /* Emit initialization code for test flags. */ - if (! always_initialize_class_p) - hash_traverse (&DECL_FUNCTION_INIT_TEST_TABLE (fndecl), - emit_init_test_initialization, 0); } #if 0 --- 1689,1694 ---- *************** complete_start_java_method (fndecl) *** 1740,1751 **** { tree function_body = DECL_FUNCTION_BODY (fndecl); tree body = BLOCK_EXPR_BODY (function_body); ! lock = build (WITH_CLEANUP_EXPR, void_type_node, ! enter, NULL_TREE, exit); ! TREE_SIDE_EFFECTS (lock) = 1; ! lock = build (COMPOUND_EXPR, TREE_TYPE (body), lock, body); ! TREE_SIDE_EFFECTS (lock) = 1; ! lock = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (body), lock); TREE_SIDE_EFFECTS (lock) = 1; BLOCK_EXPR_BODY (function_body) = lock; } --- 1742,1750 ---- { tree function_body = DECL_FUNCTION_BODY (fndecl); tree body = BLOCK_EXPR_BODY (function_body); ! lock = build (COMPOUND_EXPR, void_type_node, ! enter, ! build (TRY_FINALLY_EXPR, void_type_node, body, exit)); TREE_SIDE_EFFECTS (lock) = 1; BLOCK_EXPR_BODY (function_body) = lock; } *************** lang_mark_tree (t) *** 1874,1879 **** --- 1873,1881 ---- ggc_mark_tree (ld->function_decl_body); ggc_mark_tree (ld->called_constructor); ggc_mark_tree (ld->inner_access); + ggc_mark_tree_hash_table (&ld->init_test_table); + ggc_mark_tree_hash_table (&ld->ict); + ggc_mark_tree (ld->smic); } } else if (TYPE_P (t)) diff -Nrc3pad gcc-3.0.4/gcc/java/except.c gcc-3.1/gcc/java/except.c *** gcc-3.0.4/gcc/java/except.c Sun May 13 07:10:21 2001 --- gcc-3.1/gcc/java/except.c Fri Mar 29 00:41:17 2002 *************** *** 1,5 **** /* Handle exceptions for GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,5 ---- /* Handle exceptions for GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. This file is part of GNU CC. *************** expand_end_java_handler (range) *** 372,378 **** expand_start_all_catch (); for ( ; handler != NULL_TREE; handler = TREE_CHAIN (handler)) { ! expand_start_catch (TREE_PURPOSE (handler)); expand_goto (TREE_VALUE (handler)); expand_end_catch (); } --- 372,388 ---- expand_start_all_catch (); for ( ; handler != NULL_TREE; handler = TREE_CHAIN (handler)) { ! /* For bytecode we treat exceptions a little unusually. A ! `finally' clause looks like an ordinary exception handler for ! Throwable. The reason for this is that the bytecode has ! already expanded the finally logic, and we would have to do ! extra (and difficult) work to get this to look like a ! gcc-style finally clause. */ ! tree type = TREE_PURPOSE (handler); ! if (type == NULL) ! type = throwable_type_node; ! ! expand_start_catch (type); expand_goto (TREE_VALUE (handler)); expand_end_catch (); } diff -Nrc3pad gcc-3.0.4/gcc/java/expr.c gcc-3.1/gcc/java/expr.c *** gcc-3.0.4/gcc/java/expr.c Sat Sep 22 01:33:25 2001 --- gcc-3.1/gcc/java/expr.c Wed Apr 24 22:16:08 2002 *************** static tree pop_value PARAMS ((tree)); *** 48,54 **** static void java_stack_swap PARAMS ((void)); static void java_stack_dup PARAMS ((int, int)); static void build_java_athrow PARAMS ((tree)); ! static void build_java_jsr PARAMS ((tree, tree)); static void build_java_ret PARAMS ((tree)); static void expand_java_multianewarray PARAMS ((tree, int)); static void expand_java_arraystore PARAMS ((tree)); --- 48,54 ---- static void java_stack_swap PARAMS ((void)); static void java_stack_dup PARAMS ((int, int)); static void build_java_athrow PARAMS ((tree)); ! static void build_java_jsr PARAMS ((int, int)); static void build_java_ret PARAMS ((tree)); static void expand_java_multianewarray PARAMS ((tree, int)); static void expand_java_arraystore PARAMS ((tree)); *************** static void expand_java_array_length PAR *** 57,62 **** --- 57,63 ---- static tree build_java_monitor PARAMS ((tree, tree)); static void expand_java_pushc PARAMS ((int, tree)); static void expand_java_return PARAMS ((tree)); + static void expand_load_internal PARAMS ((int, tree, int)); static void expand_java_NEW PARAMS ((tree)); static void expand_java_INSTANCEOF PARAMS ((tree)); static void expand_java_CHECKCAST PARAMS ((tree)); *************** static void java_push_constant_from_pool *** 78,86 **** static void java_stack_pop PARAMS ((int)); static tree build_java_throw_out_of_bounds_exception PARAMS ((tree)); static tree build_java_check_indexed_type PARAMS ((tree, tree)); - static tree java_array_data_offset PARAMS ((tree)); static tree case_identity PARAMS ((tree, tree)); static unsigned char peek_opcode_at_pc PARAMS ((struct JCF *, int, int)); static tree operand_type[59]; extern struct obstack permanent_obstack; --- 79,89 ---- static void java_stack_pop PARAMS ((int)); static tree build_java_throw_out_of_bounds_exception PARAMS ((tree)); static tree build_java_check_indexed_type PARAMS ((tree, tree)); static tree case_identity PARAMS ((tree, tree)); static unsigned char peek_opcode_at_pc PARAMS ((struct JCF *, int, int)); + static bool emit_init_test_initialization PARAMS ((struct hash_entry *, + PTR ptr)); + static int get_offset_table_index PARAMS ((tree)); static tree operand_type[59]; extern struct obstack permanent_obstack; *************** pop_type_0 (type, messagep) *** 355,378 **** else if (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (type)))) return object_ptr_type_node; } { ! const char *str1 = "expected type '"; ! const char *str3 = "' but stack contains '"; ! const char *str5 = "'"; ! int len1 = strlen (str1); ! int len2 = strlen (lang_printable_name (type, 0)); ! int len3 = strlen (str3); ! int len4 = strlen (lang_printable_name (t, 0)); ! int len5 = strlen (str5); ! char *msg = xmalloc (len1 + len2 + len3 + len4 + len5 + 1); ! *messagep = msg; ! strcpy (msg, str1); msg += len1; ! strcpy (msg, lang_printable_name (type, 0)); msg += len2; ! strcpy (msg, str3); msg += len3; ! strcpy (msg, lang_printable_name (t, 0)); msg += len4; ! strcpy (msg, str5); ! return type; } } /* Pop a type from the type stack. --- 358,374 ---- else if (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (type)))) return object_ptr_type_node; } + + /* lang_printable_name uses a static buffer, so we must save the result + from calling it the first time. */ { ! char *temp = xstrdup (lang_printable_name (type, 0)); ! *messagep = concat ("expected type '", temp, ! "' but stack contains '", lang_printable_name (t, 0), ! "'", NULL); ! free (temp); } + return type; } /* Pop a type from the type stack. *************** pop_type (type) *** 387,393 **** type = pop_type_0 (type, &message); if (message != NULL) { ! error (message); free (message); } return type; --- 383,389 ---- type = pop_type_0 (type, &message); if (message != NULL) { ! error ("%s", message); free (message); } return type; *************** build_java_athrow (node) *** 611,625 **** /* Implementation for jsr/ret */ static void ! build_java_jsr (where, ret) ! tree where; ! tree ret; { tree ret_label = fold (build1 (ADDR_EXPR, return_address_type_node, ret)); push_value (ret_label); flush_quick_stack (); emit_jump (label_rtx (where)); expand_label (ret); } static void --- 607,624 ---- /* Implementation for jsr/ret */ static void ! build_java_jsr (target_pc, return_pc) ! int target_pc, return_pc; { + tree where = lookup_label (target_pc); + tree ret = lookup_label (return_pc); tree ret_label = fold (build1 (ADDR_EXPR, return_address_type_node, ret)); push_value (ret_label); flush_quick_stack (); emit_jump (label_rtx (where)); expand_label (ret); + if (instruction_bits [return_pc] & BCODE_VERIFIED) + load_type_state (ret); } static void *************** build_java_ret (location) *** 631,641 **** /* Implementation of operations on array: new, load, store, length */ - /* Array core info access macros */ - - #define JAVA_ARRAY_LENGTH_OFFSET(A) \ - byte_position (TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (TREE_TYPE (A))))) - tree decode_newarray_type (atype) int atype; --- 630,635 ---- *************** build_java_array_length_access (node) *** 702,707 **** --- 696,702 ---- tree node; { tree type = TREE_TYPE (node); + tree array_type = TREE_TYPE (type); HOST_WIDE_INT length; if (!is_array_type_p (type)) *************** build_java_array_length_access (node) *** 711,758 **** if (length >= 0) return build_int_2 (length, 0); ! return fold (build1 (INDIRECT_REF, ! int_type_node, ! fold (build (PLUS_EXPR, ptr_type_node, ! node, ! JAVA_ARRAY_LENGTH_OFFSET(node))))); } ! /* Optionally checks an array against the NULL pointer, eventually throwing a ! NullPointerException. It could replace signal handling, but tied to NULL. ! ARG1: the pointer to check, ARG2: the expression to use if ! the pointer is non-null and ARG3 the type that should be returned. */ ! tree ! build_java_arraynull_check (node, expr, type) ! tree node ATTRIBUTE_UNUSED; ! tree expr; ! tree type ATTRIBUTE_UNUSED; { ! #if 0 ! static int java_array_access_throws_null_exception = 0; ! node = ???; ! if (java_array_access_throws_null_exception) ! return (build (COND_EXPR, ! type, ! build (EQ_EXPR, int_type_node, node, null_pointer_node), ! build_java_athrow (node), expr )); ! else ! #endif ! return (expr); } ! static tree ! java_array_data_offset (array) ! tree array; ! { ! tree array_type = TREE_TYPE (TREE_TYPE (array)); ! tree data_fld = TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (array_type))); ! if (data_fld == NULL_TREE) ! return size_in_bytes (array_type); ! else ! return byte_position (data_fld); } /* Implement array indexing (either as l-value or r-value). --- 706,753 ---- if (length >= 0) return build_int_2 (length, 0); ! node = build (COMPONENT_REF, int_type_node, ! build_java_indirect_ref (array_type, node, ! flag_check_references), ! lookup_field (&array_type, get_identifier ("length"))); ! IS_ARRAY_LENGTH_ACCESS (node) = 1; ! return node; } ! /* Optionally checks a reference against the NULL pointer. ARG1: the ! expr, ARG2: we should check the reference. Don't generate extra ! checks if we're not generating code. */ ! tree ! java_check_reference (expr, check) ! tree expr; ! int check; { ! if (!flag_syntax_only && check) ! { ! tree cond; ! expr = save_expr (expr); ! cond = build (COND_EXPR, void_type_node, ! build (EQ_EXPR, boolean_type_node, expr, null_pointer_node), ! build (CALL_EXPR, void_type_node, ! build_address_of (soft_nullpointer_node), ! NULL_TREE, NULL_TREE), ! empty_stmt_node); ! expr = build (COMPOUND_EXPR, TREE_TYPE (expr), cond, expr); ! } ! ! return expr; } ! /* Reference an object: just like an INDIRECT_REF, but with checking. */ ! tree ! build_java_indirect_ref (type, expr, check) ! tree type; ! tree expr; ! int check; ! { ! return build1 (INDIRECT_REF, type, java_check_reference (expr, check)); } /* Implement array indexing (either as l-value or r-value). *************** tree *** 764,775 **** build_java_arrayaccess (array, type, index) tree array, type, index; { ! tree arith, node, throw = NULL_TREE; ! ! arith = fold (build (PLUS_EXPR, int_type_node, ! java_array_data_offset (array), ! fold (build (MULT_EXPR, int_type_node, ! index, size_in_bytes(type))))); if (flag_bounds_check) { --- 759,768 ---- build_java_arrayaccess (array, type, index) tree array, type, index; { ! tree node, throw = NULL_TREE; ! tree data_field; ! tree ref; ! tree array_type = TREE_TYPE (TREE_TYPE (array)); if (flag_bounds_check) { *************** build_java_arrayaccess (array, type, ind *** 793,806 **** } } ! node = build1 (INDIRECT_REF, type, ! fold (build (PLUS_EXPR, ptr_type_node, ! array, ! (throw ? build (COMPOUND_EXPR, int_type_node, ! throw, arith ) ! : arith)))); ! return (fold (build_java_arraynull_check (array, node, type))); } /* Makes sure that INDEXED_TYPE is appropriate. If not, make it from --- 786,875 ---- } } ! /* If checking bounds, wrap the index expr with a COMPOUND_EXPR in order ! to have the bounds check evaluated first. */ ! if (throw != NULL_TREE) ! index = build (COMPOUND_EXPR, int_type_node, throw, index); ! ! data_field = lookup_field (&array_type, get_identifier ("data")); ! ref = build (COMPONENT_REF, TREE_TYPE (data_field), ! build_java_indirect_ref (array_type, array, ! flag_check_references), ! data_field); ! ! node = build (ARRAY_REF, type, ref, index); ! return node; ! } ! ! /* Generate code to throw an ArrayStoreException if OBJECT is not assignable ! (at runtime) to an element of ARRAY. A NOP_EXPR is returned if it can ! determine that no check is required. */ ! ! tree ! build_java_arraystore_check (array, object) ! tree array; ! tree object; ! { ! tree check, element_type, source; ! tree array_type_p = TREE_TYPE (array); ! tree object_type = TYPE_NAME (TREE_TYPE (TREE_TYPE (object))); ! ! if (! is_array_type_p (array_type_p)) ! abort (); ! ! /* Get the TYPE_DECL for ARRAY's element type. */ ! element_type = TYPE_NAME (TREE_TYPE (TREE_TYPE (TREE_TYPE (array_type_p)))); ! ! if (TREE_CODE (element_type) != TYPE_DECL ! || TREE_CODE (object_type) != TYPE_DECL) ! abort (); ! ! if (!flag_store_check) ! return build1 (NOP_EXPR, array_type_p, array); ! ! /* No check is needed if the element type is final or is itself an array. ! Also check that element_type matches object_type, since in the bytecode ! compilation case element_type may be the actual element type of the arra ! rather than its declared type. */ ! if (element_type == object_type ! && (TYPE_ARRAY_P (TREE_TYPE (element_type)) ! || CLASS_FINAL (element_type))) ! return build1 (NOP_EXPR, array_type_p, array); ! ! /* OBJECT might be wrapped by a SAVE_EXPR. */ ! if (TREE_CODE (object) == SAVE_EXPR) ! source = TREE_OPERAND (object, 0); ! else ! source = object; ! ! /* Avoid the check if OBJECT was just loaded from the same array. */ ! if (TREE_CODE (source) == ARRAY_REF) ! { ! tree target; ! source = TREE_OPERAND (source, 0); /* COMPONENT_REF. */ ! source = TREE_OPERAND (source, 0); /* INDIRECT_REF. */ ! source = TREE_OPERAND (source, 0); /* Source array's DECL or SAVE_EXPR. */ ! if (TREE_CODE (source) == SAVE_EXPR) ! source = TREE_OPERAND (source, 0); ! ! target = array; ! if (TREE_CODE (target) == SAVE_EXPR) ! target = TREE_OPERAND (target, 0); ! ! if (source == target) ! return build1 (NOP_EXPR, array_type_p, array); ! } ! ! /* Build an invocation of _Jv_CheckArrayStore */ ! check = build (CALL_EXPR, void_type_node, ! build_address_of (soft_checkarraystore_node), ! tree_cons (NULL_TREE, array, ! build_tree_list (NULL_TREE, object)), ! NULL_TREE); ! TREE_SIDE_EFFECTS (check) = 1; ! ! return check; } /* Makes sure that INDEXED_TYPE is appropriate. If not, make it from *************** expand_java_arraystore (rhs_type_node) *** 956,967 **** if (TREE_CODE (rhs_type_node) == POINTER_TYPE) { ! tree check = build (CALL_EXPR, void_type_node, ! build_address_of (soft_checkarraystore_node), ! tree_cons (NULL_TREE, array, ! build_tree_list (NULL_TREE, rhs_node)), ! NULL_TREE); ! TREE_SIDE_EFFECTS (check) = 1; expand_expr_stmt (check); } --- 1025,1031 ---- if (TREE_CODE (rhs_type_node) == POINTER_TYPE) { ! tree check = build_java_arraystore_check (array, rhs_node); expand_expr_stmt (check); } *************** expand_java_array_length () *** 1008,1014 **** tree array = pop_value (ptr_type_node); tree length = build_java_array_length_access (array); ! push_value (build_java_arraynull_check (array, length, int_type_node)); } /* Emit code for the call to _Jv_Monitor{Enter,Exit}. CALL can be --- 1072,1078 ---- tree array = pop_value (ptr_type_node); tree length = build_java_array_length_access (array); ! push_value (length); } /* Emit code for the call to _Jv_Monitor{Enter,Exit}. CALL can be *************** expand_java_return (type) *** 1083,1088 **** --- 1147,1178 ---- } } + static void + expand_load_internal (index, type, pc) + int index; + tree type; + int pc; + { + tree copy; + tree var = find_local_variable (index, type, pc); + + /* Now VAR is the VAR_DECL (or PARM_DECL) that we are going to push + on the stack. If there is an assignment to this VAR_DECL between + the stack push and the use, then the wrong code could be + generated. To avoid this we create a new local and copy our + value into it. Then we push this new local on the stack. + Hopefully this all gets optimized out. */ + copy = build_decl (VAR_DECL, NULL_TREE, type); + DECL_CONTEXT (copy) = current_function_decl; + layout_decl (copy, 0); + DECL_REGISTER (copy) = 1; + expand_decl (copy); + MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (copy); + DECL_INITIAL (copy) = var; + expand_decl_init (copy); + push_value (copy); + } + tree build_address_of (value) tree value; *************** build_address_of (value) *** 1090,1104 **** return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (value)), value); } static void expand_java_NEW (type) tree type; { if (! CLASS_LOADED_P (type)) load_class (type, 1); safe_layout_class (type); push_value (build (CALL_EXPR, promote_type (type), ! build_address_of (alloc_object_node), tree_cons (NULL_TREE, build_class_ref (type), build_tree_list (NULL_TREE, size_in_bytes (type))), --- 1180,1210 ---- return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (value)), value); } + bool class_has_finalize_method (type) + tree type; + { + tree super = CLASSTYPE_SUPER (type); + + if (super == NULL_TREE) + return false; /* Every class with a real finalizer inherits */ + /* from java.lang.Object. */ + else + return HAS_FINALIZER_P (type) || class_has_finalize_method (super); + } + static void expand_java_NEW (type) tree type; { + tree alloc_node; + + alloc_node = (class_has_finalize_method (type) ? alloc_object_node + : alloc_no_finalizer_node); if (! CLASS_LOADED_P (type)) load_class (type, 1); safe_layout_class (type); push_value (build (CALL_EXPR, promote_type (type), ! build_address_of (alloc_node), tree_cons (NULL_TREE, build_class_ref (type), build_tree_list (NULL_TREE, size_in_bytes (type))), *************** build_get_class (value) *** 1118,1124 **** return build (COMPONENT_REF, class_ptr_type, build1 (INDIRECT_REF, dtable_type, build (COMPONENT_REF, dtable_ptr_type, ! build1 (INDIRECT_REF, object_type_node, value), vtable_field)), class_field); } --- 1224,1231 ---- return build (COMPONENT_REF, class_ptr_type, build1 (INDIRECT_REF, dtable_type, build (COMPONENT_REF, dtable_ptr_type, ! build_java_indirect_ref (object_type_node, value, ! flag_check_references), vtable_field)), class_field); } *************** lookup_field (typep, name) *** 1414,1429 **** if (DECL_NAME (field) == name) return field; - /* If *typep is an innerclass, lookup the field in its enclosing - contexts */ - if (INNER_CLASS_TYPE_P (*typep)) - { - tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (*typep))); - - if ((field = lookup_field (&outer_type, name))) - return field; - } - /* Process implemented interfaces. */ basetype_vec = TYPE_BINFO_BASETYPES (*typep); n = TREE_VEC_LENGTH (basetype_vec); --- 1521,1526 ---- *************** build_field_ref (self_value, self_class, *** 1479,1492 **** } else { tree base_handle_type = promote_type (base_class); if (base_handle_type != TREE_TYPE (self_value)) self_value = fold (build1 (NOP_EXPR, base_handle_type, self_value)); #ifdef JAVA_USE_HANDLES self_value = unhand_expr (self_value); #endif ! self_value = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (self_value)), ! self_value); return fold (build (COMPONENT_REF, TREE_TYPE (field_decl), self_value, field_decl)); } --- 1576,1593 ---- } else { + int check = (flag_check_references + && ! (DECL_P (self_value) + && DECL_NAME (self_value) == this_identifier_node)); + tree base_handle_type = promote_type (base_class); if (base_handle_type != TREE_TYPE (self_value)) self_value = fold (build1 (NOP_EXPR, base_handle_type, self_value)); #ifdef JAVA_USE_HANDLES self_value = unhand_expr (self_value); #endif ! self_value = build_java_indirect_ref (TREE_TYPE (TREE_TYPE (self_value)), ! self_value, check); return fold (build (COMPONENT_REF, TREE_TYPE (field_decl), self_value, field_decl)); } *************** build_class_init (clas, expr) *** 1679,1688 **** TRUE, NULL); if (ite->init_test_decl == 0) ! ite->init_test_decl = build_decl (VAR_DECL, NULL_TREE, ! boolean_type_node); ! /* Tell the check-init code to ignore this decl. */ ! DECL_BIT_INDEX(ite->init_test_decl) = -1; init = build (CALL_EXPR, void_type_node, build_address_of (soft_initclass_node), --- 1780,1799 ---- TRUE, NULL); if (ite->init_test_decl == 0) ! { ! /* Build a declaration and mark it as a flag used to track ! static class initializations. */ ! ite->init_test_decl = build_decl (VAR_DECL, NULL_TREE, ! boolean_type_node); ! MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (ite->init_test_decl); ! LOCAL_CLASS_INITIALIZATION_FLAG (ite->init_test_decl) = 1; ! DECL_CONTEXT (ite->init_test_decl) = current_function_decl; ! DECL_FUNCTION_INIT_TEST_CLASS (ite->init_test_decl) = clas; ! /* Tell the check-init code to ignore this decl when not ! optimizing class initialization. */ ! if (!STATIC_CLASS_INIT_OPT_P ()) ! DECL_BIT_INDEX(ite->init_test_decl) = -1; ! } init = build (CALL_EXPR, void_type_node, build_address_of (soft_initclass_node), *************** build_class_init (clas, expr) *** 1710,1716 **** } tree ! build_known_method_ref (method, method_type, self_type, method_signature, arg_list) tree method, method_type ATTRIBUTE_UNUSED, self_type, method_signature ATTRIBUTE_UNUSED, arg_list ATTRIBUTE_UNUSED; { --- 1821,1828 ---- } tree ! build_known_method_ref (method, method_type, self_type, ! method_signature, arg_list) tree method, method_type ATTRIBUTE_UNUSED, self_type, method_signature ATTRIBUTE_UNUSED, arg_list ATTRIBUTE_UNUSED; { *************** build_known_method_ref (method, method_t *** 1724,1736 **** { /* We don't know whether the method has been (statically) compiled. Compile this code to get a reference to the method's code: ! SELF_TYPE->methods[METHOD_INDEX].ncode ! This is guaranteed to work (assuming SELF_TYPE has been initialized), since if the method is not compiled yet, its ncode points to a trampoline that forces compilation. */ ! int method_index = 0; tree meth; tree ref = build_class_ref (self_type); --- 1836,1848 ---- { /* We don't know whether the method has been (statically) compiled. Compile this code to get a reference to the method's code: ! SELF_TYPE->methods[METHOD_INDEX].ncode ! This is guaranteed to work (assuming SELF_TYPE has been initialized), since if the method is not compiled yet, its ncode points to a trampoline that forces compilation. */ ! int method_index = 0; tree meth; tree ref = build_class_ref (self_type); *************** invoke_build_dtable (is_invoke_interface *** 1780,1792 **** if (dtable_ident == NULL_TREE) dtable_ident = get_identifier ("vtable"); ! dtable = build1 (INDIRECT_REF, object_type_node, objectref ); dtable = build (COMPONENT_REF, dtable_ptr_type, dtable, lookup_field (&object_type_node, dtable_ident)); return dtable; } tree build_invokevirtual (dtable, method) tree dtable, method; --- 1892,1939 ---- if (dtable_ident == NULL_TREE) dtable_ident = get_identifier ("vtable"); ! dtable = build_java_indirect_ref (object_type_node, objectref, ! flag_check_references); dtable = build (COMPONENT_REF, dtable_ptr_type, dtable, lookup_field (&object_type_node, dtable_ident)); return dtable; } + /* Determine the index in the virtual offset table (otable) for a call to + METHOD. If this method has not been seen before, it will be added to the + otable_methods. If it has, the existing otable slot will be reused. */ + + int + get_offset_table_index (method) + tree method; + { + int i = 1; + tree method_list; + + if (otable_methods == NULL_TREE) + { + otable_methods = build_tree_list (method, method); + return 1; + } + + method_list = otable_methods; + + while (1) + { + if (TREE_VALUE (method_list) == method) + return i; + i++; + if (TREE_CHAIN (method_list) == NULL_TREE) + break; + else + method_list = TREE_CHAIN (method_list); + } + + TREE_CHAIN (method_list) = build_tree_list (method, method); + return i; + } + tree build_invokevirtual (dtable, method) tree dtable, method; *************** build_invokevirtual (dtable, method) *** 1794,1810 **** tree func; tree nativecode_ptr_ptr_type_node = build_pointer_type (nativecode_ptr_type_node); ! tree method_index = convert (sizetype, DECL_VINDEX (method)); ! /* Add one to skip "class" field of dtable, and one to skip unused ! vtable entry (for C++ compatibility). */ ! method_index = size_binop (PLUS_EXPR, method_index, size_int (2)); ! method_index = size_binop (MULT_EXPR, method_index, ! TYPE_SIZE_UNIT (nativecode_ptr_ptr_type_node)); ! if (TARGET_VTABLE_USES_DESCRIPTORS) ! method_index = size_binop (MULT_EXPR, method_index, ! size_int (TARGET_VTABLE_USES_DESCRIPTORS)); func = fold (build (PLUS_EXPR, nativecode_ptr_ptr_type_node, dtable, convert (nativecode_ptr_ptr_type_node, method_index))); --- 1941,1973 ---- tree func; tree nativecode_ptr_ptr_type_node = build_pointer_type (nativecode_ptr_type_node); ! tree method_index; ! tree otable_index; ! if (flag_indirect_dispatch) ! { ! otable_index = build_int_2 (get_offset_table_index (method), 0); ! method_index = build (ARRAY_REF, integer_type_node, otable_decl, ! otable_index); ! } ! else ! { ! method_index = convert (sizetype, DECL_VINDEX (method)); ! if (TARGET_VTABLE_USES_DESCRIPTORS) ! /* Add one to skip bogus descriptor for class and GC descriptor. */ ! method_index = size_binop (PLUS_EXPR, method_index, size_int (1)); ! else ! /* Add 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */ ! method_index = size_binop (PLUS_EXPR, method_index, size_int (2)); ! ! method_index = size_binop (MULT_EXPR, method_index, ! TYPE_SIZE_UNIT (nativecode_ptr_ptr_type_node)); ! ! if (TARGET_VTABLE_USES_DESCRIPTORS) ! method_index = size_binop (MULT_EXPR, method_index, ! size_int (TARGET_VTABLE_USES_DESCRIPTORS)); ! } func = fold (build (PLUS_EXPR, nativecode_ptr_ptr_type_node, dtable, convert (nativecode_ptr_ptr_type_node, method_index))); *************** build_invokeinterface (dtable, method) *** 1826,1831 **** --- 1989,1995 ---- tree interface; tree idx; tree meth; + tree otable_index; int i; /* We expand invokeinterface here. _Jv_LookupInterfaceMethod() will *************** build_invokeinterface (dtable, method) *** 1838,1860 **** ggc_add_tree_root (&class_ident, 1); } ! dtable = build1 (INDIRECT_REF, dtable_type, dtable); dtable = build (COMPONENT_REF, class_ptr_type, dtable, lookup_field (&dtable_type, class_ident)); interface = DECL_CONTEXT (method); layout_class_methods (interface); ! i = 1; ! for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth), i++) { ! if (meth == method) ! { ! idx = build_int_2 (i, 0); ! break; } - if (meth == NULL_TREE) - abort (); } lookup_arg = tree_cons (NULL_TREE, dtable, --- 2002,2032 ---- ggc_add_tree_root (&class_ident, 1); } ! dtable = build_java_indirect_ref (dtable_type, dtable, flag_check_references); dtable = build (COMPONENT_REF, class_ptr_type, dtable, lookup_field (&dtable_type, class_ident)); interface = DECL_CONTEXT (method); layout_class_methods (interface); ! if (flag_indirect_dispatch) { ! otable_index = build_int_2 (get_offset_table_index (method), 0); ! idx = build (ARRAY_REF, integer_type_node, otable_decl, otable_index); ! } ! else ! { ! i = 1; ! for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth), i++) ! { ! if (meth == method) ! { ! idx = build_int_2 (i, 0); ! break; ! } ! if (meth == NULL_TREE) ! abort (); } } lookup_arg = tree_cons (NULL_TREE, dtable, *************** expand_invoke (opcode, method_ref_index, *** 1881,1890 **** tree method_name = COMPONENT_REF_NAME (¤t_jcf->cpool, method_ref_index); tree self_type = get_class_constant (current_jcf, COMPONENT_REF_CLASS_INDEX(¤t_jcf->cpool, method_ref_index)); ! const char *self_name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (self_type))); tree call, func, method, arg_list, method_type; ! tree cond = NULL_TREE; if (! CLASS_LOADED_P (self_type)) { --- 2053,2062 ---- tree method_name = COMPONENT_REF_NAME (¤t_jcf->cpool, method_ref_index); tree self_type = get_class_constant (current_jcf, COMPONENT_REF_CLASS_INDEX(¤t_jcf->cpool, method_ref_index)); ! const char *const self_name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (self_type))); tree call, func, method, arg_list, method_type; ! tree check = NULL_TREE; if (! CLASS_LOADED_P (self_type)) { *************** expand_invoke (opcode, method_ref_index, *** 1903,1909 **** method_name, method_signature); if (method == NULL_TREE) { ! error ("Class '%s' has no method named '%s' matching signature '%s'", self_name, IDENTIFIER_POINTER (method_name), IDENTIFIER_POINTER (method_signature)); --- 2075,2081 ---- method_name, method_signature); if (method == NULL_TREE) { ! error ("class '%s' has no method named '%s' matching signature '%s'", self_name, IDENTIFIER_POINTER (method_name), IDENTIFIER_POINTER (method_signature)); *************** expand_invoke (opcode, method_ref_index, *** 1961,1972 **** method's `this'. In other cases we just rely on an optimization pass to eliminate redundant checks. FIXME: Unfortunately there doesn't seem to be a way to determine ! what the current method is right now. */ /* We use a SAVE_EXPR here to make sure we only evaluate the new `self' expression once. */ tree save_arg = save_expr (TREE_VALUE (arg_list)); TREE_VALUE (arg_list) = save_arg; ! cond = build (EQ_EXPR, boolean_type_node, save_arg, null_pointer_node); func = build_known_method_ref (method, method_type, self_type, method_signature, arg_list); } --- 2133,2145 ---- method's `this'. In other cases we just rely on an optimization pass to eliminate redundant checks. FIXME: Unfortunately there doesn't seem to be a way to determine ! what the current method is right now. ! We do omit the check if we're calling . */ /* We use a SAVE_EXPR here to make sure we only evaluate the new `self' expression once. */ tree save_arg = save_expr (TREE_VALUE (arg_list)); TREE_VALUE (arg_list) = save_arg; ! check = java_check_reference (save_arg, ! DECL_INIT_P (method)); func = build_known_method_ref (method, method_type, self_type, method_signature, arg_list); } *************** expand_invoke (opcode, method_ref_index, *** 1980,2002 **** func = build_invokeinterface (dtable, method); } func = build1 (NOP_EXPR, build_pointer_type (method_type), func); call = build (CALL_EXPR, TREE_TYPE (method_type), func, arg_list, NULL_TREE); TREE_SIDE_EFFECTS (call) = 1; ! if (cond != NULL_TREE) { ! /* We have to make the `then' branch a compound expression to ! make the types turn out right. This seems bizarre. */ ! call = build (COND_EXPR, TREE_TYPE (call), cond, ! build (COMPOUND_EXPR, TREE_TYPE (call), ! build (CALL_EXPR, void_type_node, ! build_address_of (soft_nullpointer_node), ! NULL_TREE, NULL_TREE), ! (FLOAT_TYPE_P (TREE_TYPE (call)) ! ? build_real (TREE_TYPE (call), dconst0) ! : build1 (CONVERT_EXPR, TREE_TYPE (call), ! integer_zero_node))), ! call); TREE_SIDE_EFFECTS (call) = 1; } --- 2153,2166 ---- func = build_invokeinterface (dtable, method); } func = build1 (NOP_EXPR, build_pointer_type (method_type), func); + call = build (CALL_EXPR, TREE_TYPE (method_type), func, arg_list, NULL_TREE); TREE_SIDE_EFFECTS (call) = 1; + call = check_for_builtin (method, call); ! if (check != NULL_TREE) { ! call = build (COMPOUND_EXPR, TREE_TYPE (call), check, call); TREE_SIDE_EFFECTS (call) = 1; } *************** build_jni_stub (method) *** 2048,2055 **** TREE_PUBLIC (meth_var) = 0; DECL_EXTERNAL (meth_var) = 0; DECL_CONTEXT (meth_var) = method; make_decl_rtl (meth_var, NULL); ! meth_var = pushdecl_top_level (meth_var); /* One strange way that the front ends are different is that they store arguments differently. */ --- 2212,2224 ---- TREE_PUBLIC (meth_var) = 0; DECL_EXTERNAL (meth_var) = 0; DECL_CONTEXT (meth_var) = method; + DECL_ARTIFICIAL (meth_var) = 1; + DECL_INITIAL (meth_var) = null_pointer_node; + TREE_USED (meth_var) = 1; + chainon (env_var, meth_var); + layout_decl (meth_var, 0); make_decl_rtl (meth_var, NULL); ! rest_of_decl_compilation (meth_var, NULL, 0, 0); /* One strange way that the front ends are different is that they store arguments differently. */ *************** expand_java_field_op (is_static, is_putt *** 2214,2226 **** } else if (field_decl == NULL_TREE) { ! error ("Missing field '%s' in '%s'", IDENTIFIER_POINTER (field_name), self_name); is_error = 1; } else if (build_java_signature (TREE_TYPE (field_decl)) != field_signature) { ! error ("Mismatching signature for field '%s' in '%s'", IDENTIFIER_POINTER (field_name), self_name); is_error = 1; } --- 2383,2395 ---- } else if (field_decl == NULL_TREE) { ! error ("missing field '%s' in '%s'", IDENTIFIER_POINTER (field_name), self_name); is_error = 1; } else if (build_java_signature (TREE_TYPE (field_decl)) != field_signature) { ! error ("mismatching signature for field '%s' in '%s'", IDENTIFIER_POINTER (field_name), self_name); is_error = 1; } *************** expand_java_field_op (is_static, is_putt *** 2233,2254 **** return; } - /* Inline references to java.lang.PRIMTYPE.TYPE. - In addition to being a useful (minor) optimization, - this is also needed to avoid circularities in the implementation - of these fields in libjava. */ - if (field_name == TYPE_identifier_node && ! is_putting - && ! flag_emit_class_files && field_type == class_ptr_type - && strncmp (self_name, "java.lang.", 10) == 0) - { - tree typ = build_primtype_type_ref (self_name); - if (typ) - { - push_value (typ); - return; - } - } - field_ref = build_field_ref (field_ref, self_type, field_name); if (is_static) field_ref = build_class_init (self_type, field_ref); --- 2402,2407 ---- *************** expand_java_field_op (is_static, is_putt *** 2280,2317 **** push_value (field_ref); } - tree - build_primtype_type_ref (self_name) - const char *self_name; - { - const char *class_name = self_name+10; - tree typ; - if (strncmp(class_name, "Byte", 4) == 0) - typ = byte_type_node; - else if (strncmp(class_name, "Short", 5) == 0) - typ = short_type_node; - else if (strncmp(class_name, "Integer", 7) == 0) - typ = int_type_node; - else if (strncmp(class_name, "Long", 4) == 0) - typ = long_type_node; - else if (strncmp(class_name, "Float", 5) == 0) - typ = float_type_node; - else if (strncmp(class_name, "Double", 6) == 0) - typ = double_type_node; - else if (strncmp(class_name, "Boolean", 7) == 0) - typ = boolean_type_node; - else if (strncmp(class_name, "Char", 4) == 0) - typ = char_type_node; - else if (strncmp(class_name, "Void", 4) == 0) - typ = void_type_node; - else - typ = NULL_TREE; - if (typ != NULL_TREE) - return build_class_ref (typ); - else - return NULL_TREE; - } - void load_type_state (label) tree label; --- 2433,2438 ---- *************** load_type_state (label) *** 2325,2331 **** } /* Do the expansion of a Java switch. With Gcc, switches are front-end ! dependant things, but they rely on gcc routines. This function is placed here because it uses things defined locally in parse.y. */ static tree --- 2446,2452 ---- } /* Do the expansion of a Java switch. With Gcc, switches are front-end ! dependent things, but they rely on gcc routines. This function is placed here because it uses things defined locally in parse.y. */ static tree *************** java_lang_expand_expr (exp, target, tmod *** 2409,2414 **** --- 2530,2538 ---- DECL_INITIAL (init_decl) = value; DECL_IGNORED_P (init_decl) = 1; TREE_READONLY (init_decl) = 1; + /* Hash synchronization requires at least 64-bit alignment. */ + if (flag_hash_synchronization && POINTER_SIZE < 64) + DECL_ALIGN (init_decl) = 64; rest_of_decl_compilation (init_decl, NULL, 1, 0); TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (init_decl)) = 1; init = build1 (ADDR_EXPR, TREE_TYPE (exp), init_decl); *************** java_lang_expand_expr (exp, target, tmod *** 2437,2444 **** init = init_decl; } expand_assignment (build (COMPONENT_REF, TREE_TYPE (data_fld), ! build1 (INDIRECT_REF, array_type, ! array_decl), data_fld), init, 0, 0); return tmp; } case BLOCK: --- 2561,2569 ---- init = init_decl; } expand_assignment (build (COMPONENT_REF, TREE_TYPE (data_fld), ! build_java_indirect_ref (array_type, ! array_decl, flag_check_references), ! data_fld), init, 0, 0); return tmp; } case BLOCK: *************** java_lang_expand_expr (exp, target, tmod *** 2446,2461 **** --- 2571,2601 ---- { tree local; tree body = BLOCK_EXPR_BODY (exp); + /* Set to 1 or more when we found a static class + initialization flag. */ + int found_class_initialization_flag = 0; + pushlevel (2); /* 2 and above */ expand_start_bindings (0); local = BLOCK_EXPR_DECLS (exp); while (local) { tree next = TREE_CHAIN (local); + found_class_initialization_flag += + LOCAL_CLASS_INITIALIZATION_FLAG_P (local); layout_decl (local, 0); expand_decl (pushdecl (local)); local = next; } + + /* Emit initialization code for test flags if we saw one. */ + if (! always_initialize_class_p + && current_function_decl + && found_class_initialization_flag) + hash_traverse + (&DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), + emit_init_test_initialization, NULL); + /* Avoid deep recursion for long block. */ while (TREE_CODE (body) == COMPOUND_EXPR) { *************** java_lang_expand_expr (exp, target, tmod *** 2465,2472 **** } expand_expr (body, const0_rtx, VOIDmode, 0); emit_queue (); - poplevel (1, 1, 0); expand_end_bindings (getdecls (), 1, 0); return const0_rtx; } return const0_rtx; --- 2605,2612 ---- } expand_expr (body, const0_rtx, VOIDmode, 0); emit_queue (); expand_end_bindings (getdecls (), 1, 0); + poplevel (1, 1, 0); return const0_rtx; } return const0_rtx; *************** java_lang_expand_expr (exp, target, tmod *** 2525,2531 **** target, tmode, modifier); default: ! internal_error ("Can't expand %s", tree_code_name [TREE_CODE (exp)]); } } --- 2665,2671 ---- target, tmode, modifier); default: ! internal_error ("can't expand %s", tree_code_name [TREE_CODE (exp)]); } } *************** note_instructions (jcf, method) *** 2638,2643 **** --- 2778,2784 ---- if (!saw_index) NOTE_LABEL(oldpc + INT_temp); #define PRE_JSR(OPERAND_TYPE, OPERAND_VALUE) \ saw_index = 0; INT_temp = (OPERAND_VALUE); \ + NOTE_LABEL (PC); \ if (!saw_index) NOTE_LABEL(oldpc + INT_temp); #define PRE_RET(OPERAND_TYPE, OPERAND_VALUE) (void)(OPERAND_VALUE) *************** expand_byte_code (jcf, method) *** 2746,2752 **** if (dead_code_index != -1) { /* We've just reached the end of a region of dead code. */ ! warning ("Unreachable bytecode from %d to before %d.", dead_code_index, PC); dead_code_index = -1; } --- 2887,2893 ---- if (dead_code_index != -1) { /* We've just reached the end of a region of dead code. */ ! warning ("unreachable bytecode from %d to before %d", dead_code_index, PC); dead_code_index = -1; } *************** expand_byte_code (jcf, method) *** 2783,2789 **** if (dead_code_index != -1) { /* We've just reached the end of a region of dead code. */ ! warning ("Unreachable bytecode from %d to the end of the method.", dead_code_index); } } --- 2924,2930 ---- if (dead_code_index != -1) { /* We've just reached the end of a region of dead code. */ ! warning ("unreachable bytecode from %d to the end of the method", dead_code_index); } } *************** process_jvm_instruction (PC, byte_ops, l *** 2839,2851 **** build_java_ret (find_local_variable (index, ptr_type_node, oldpc)); \ } ! #define JSR(OPERAND_TYPE, OPERAND_VALUE) \ ! { \ ! tree where = lookup_label (oldpc+OPERAND_VALUE); \ ! tree ret = lookup_label (PC); \ ! build_java_jsr (where, ret); \ ! load_type_state (ret); \ ! } /* Push a constant onto the stack. */ #define PUSHC(OPERAND_TYPE, OPERAND_VALUE) \ --- 2980,2987 ---- build_java_ret (find_local_variable (index, ptr_type_node, oldpc)); \ } ! #define JSR(OPERAND_TYPE, OPERAND_VALUE) \ ! build_java_jsr (oldpc+OPERAND_VALUE, PC); /* Push a constant onto the stack. */ #define PUSHC(OPERAND_TYPE, OPERAND_VALUE) \ *************** process_jvm_instruction (PC, byte_ops, l *** 2855,2861 **** /* internal macro added for use by the WIDE case */ #define LOAD_INTERNAL(OPTYPE, OPVALUE) \ ! push_value (find_local_variable (OPVALUE, type_map[OPVALUE], oldpc)); /* Push local variable onto the opcode stack. */ #define LOAD(OPERAND_TYPE, OPERAND_VALUE) \ --- 2991,2997 ---- /* internal macro added for use by the WIDE case */ #define LOAD_INTERNAL(OPTYPE, OPVALUE) \ ! expand_load_internal (OPVALUE, type_map[OPVALUE], oldpc); /* Push local variable onto the opcode stack. */ #define LOAD(OPERAND_TYPE, OPERAND_VALUE) \ *************** force_evaluation_order (node) *** 3322,3324 **** --- 3458,3494 ---- } return node; } + + /* Called for every element in DECL_FUNCTION_INIT_TEST_TABLE of a + method in order to emit initialization code for each test flag. */ + + static bool + emit_init_test_initialization (entry, key) + struct hash_entry *entry; + hash_table_key key ATTRIBUTE_UNUSED; + { + struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry; + tree klass = build_class_ref ((tree) entry->key); + tree rhs; + + /* If the DECL_INITIAL of the test flag is set to true, it + means that the class is already initialized the time it + is in use. */ + if (DECL_INITIAL (ite->init_test_decl) == boolean_true_node) + rhs = boolean_true_node; + /* Otherwise, we initialize the class init check variable by looking + at the `state' field of the class to see if it is already + initialized. This makes things a bit faster if the class is + already initialized, which should be the common case. */ + else + rhs = build (GE_EXPR, boolean_type_node, + build (COMPONENT_REF, byte_type_node, + build1 (INDIRECT_REF, class_type_node, klass), + lookup_field (&class_type_node, + get_identifier ("state"))), + build_int_2 (JV_STATE_DONE, 0)); + + expand_expr_stmt (build (MODIFY_EXPR, boolean_type_node, + ite->init_test_decl, rhs)); + return true; + } diff -Nrc3pad gcc-3.0.4/gcc/java/gcj.1 gcc-3.1/gcc/java/gcj.1 *** gcc-3.0.4/gcc/java/gcj.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/gcj.1 Wed May 15 02:46:01 2002 *************** *** 0 **** --- 1,446 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:01 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "GCJ 1" + .TH GCJ 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + gcj \- Ahead-of-time compiler for the Java language + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + gcj [\fB\-I\fR\fIdir\fR...] [\fB\-d\fR \fIdir\fR...] + [\fB\*(--CLASSPATH\fR=\fIpath\fR] [\fB\*(--classpath\fR=\fIpath\fR] + [\fB\-f\fR\fIoption\fR...] [\fB\*(--encoding\fR=\fIname\fR] + [\fB\*(--main\fR=\fIclassname\fR] [\fB\-D\fR\fIname\fR[=\fIvalue\fR]...] + [\fB\-C\fR] [\fB\*(--resource\fR \fIresource-name\fR] [\fB\-d\fR \fIdirectory\fR] + [\fB\-W\fR\fIwarn\fR...] + \fIsourcefile\fR... + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + As \fBgcj\fR is just another front end to \fBgcc\fR, it supports many + of the same options as gcc. This manual only documents the + options specific to \fBgcj\fR. + .SH "OPTIONS" + .IX Header "OPTIONS" + .Sh "Input and output files" + .IX Subsection "Input and output files" + A \fBgcj\fR command is like a \fBgcc\fR command, in that it + consists of a number of options and file names. The following kinds + of input file names are supported: + .Ip "\fIfile\fR\fB.java\fR" 4 + .IX Item "file.java" + Java source files. + .Ip "\fIfile\fR\fB.class\fR" 4 + .IX Item "file.class" + Java bytecode files. + .Ip "\fIfile\fR\fB.zip\fR" 4 + .IX Item "file.zip" + .PD 0 + .Ip "\fIfile\fR\fB.jar\fR" 4 + .IX Item "file.jar" + .PD + An archive containing one or more \f(CW\*(C`.class\*(C'\fR files, all of + which are compiled. The archive may be compressed. + .Ip "\fB@\fR\fIfile\fR" 4 + .IX Item "@file" + A file containing a whitespace-separated list of input file names. + (Currently, these must all be \f(CW\*(C`.java\*(C'\fR source files, but that + may change.) + Each named file is compiled, just as if it had been on the command line. + .Ip "\fIlibrary\fR\fB.a\fR" 4 + .IX Item "library.a" + .PD 0 + .Ip "\fIlibrary\fR\fB.so\fR" 4 + .IX Item "library.so" + .Ip "\fB\-l\fR\fIlibname\fR" 4 + .IX Item "-llibname" + .PD + Libraries to use when linking. See the \fBgcc\fR manual. + .PP + You can specify more than one input file on the \fBgcj\fR command line, + in which case they will all be compiled. If you specify a + \&\f(CW\*(C`\-o \f(CI\s-1FILENAME\s0\f(CW\*(C'\fR + option, all the input files will be compiled together, producing a + single output file, named \fI\s-1FILENAME\s0\fR. + This is allowed even when using \f(CW\*(C`\-S\*(C'\fR or \f(CW\*(C`\-c\*(C'\fR, + but not when using \f(CW\*(C`\-C\*(C'\fR or \f(CW\*(C`\-\-resource\*(C'\fR. + (This is an extension beyond the what plain \fBgcc\fR allows.) + (If more than one input file is specified, all must currently + be \f(CW\*(C`.java\*(C'\fR files, though we hope to fix this.) + .Sh "Input Options" + .IX Subsection "Input Options" + \&\fBgcj\fR has options to control where it looks to find files it needs. + For instance, \fBgcj\fR might need to load a class that is referenced + by the file it has been asked to compile. Like other compilers for the + Java language, \fBgcj\fR has a notion of a \fIclass path\fR. There are + several options and environment variables which can be used to + manipulate the class path. When \fBgcj\fR looks for a given class, it + searches the class path looking for matching \fI.class\fR or + \&\fI.java\fR file. \fBgcj\fR comes with a built-in class path which + points at the installed \fIlibgcj.jar\fR, a file which contains all the + standard classes. + .PP + In the below, a directory or path component can refer either to an + actual directory on the filesystem, or to a \fI.zip\fR or \fI.jar\fR + file, which \fBgcj\fR will search as if it is a directory. + .Ip "\fB\-I\fR\fIdir\fR" 4 + .IX Item "-Idir" + All directories specified by \f(CW\*(C`\-I\*(C'\fR are kept in order and prepended + to the class path constructed from all the other options. Unless + compatibility with tools like \f(CW\*(C`javac\*(C'\fR is imported, we recommend + always using \f(CW\*(C`\-I\*(C'\fR instead of the other options for manipulating the + class path. + .Ip "\fB\*(--classpath=\fR\fIpath\fR" 4 + .IX Item "classpath=path" + This sets the class path to \fIpath\fR, a colon-separated list of paths + (on Windows-based systems, a semicolon-separate list of paths). + This does not override the builtin (``boot'') search path. + .Ip "\fB\*(--CLASSPATH=\fR\fIpath\fR" 4 + .IX Item "CLASSPATH=path" + Deprecated synonym for \f(CW\*(C`\-\-classpath\*(C'\fR. + .Ip "\fB\*(--bootclasspath=\fR\fIpath\fR" 4 + .IX Item "bootclasspath=path" + Where to find the standard builtin classes, such as \f(CW\*(C`java.lang.String\*(C'\fR. + .Ip "\fB\*(--extdirs=\fR\fIpath\fR" 4 + .IX Item "extdirs=path" + For each directory in the \fIpath\fR, place the contents of that + directory at the end of the class path. + .Ip "\fB\s-1CLASSPATH\s0\fR" 4 + .IX Item "CLASSPATH" + This is an environment variable which holds a list of paths. + .PP + The final class path is constructed like so: + .Ip "\(bu" 4 + First come all directories specified via \f(CW\*(C`\-I\*(C'\fR. + .Ip "\(bu" 4 + If \fB\*(--classpath\fR is specified, its value is appended. + Otherwise, if the \f(CW\*(C`CLASSPATH\*(C'\fR environment variable is specified, + then its value is appended. + Otherwise, the current directory (\f(CW\*(C`"."\*(C'\fR) is appended. + .Ip "\(bu" 4 + If \f(CW\*(C`\-\-bootclasspath\*(C'\fR was specified, append its value. + Otherwise, append the built-in system directory, \fIlibgcj.jar\fR. + .Ip "\(bu" 4 + Finaly, if \f(CW\*(C`\-\-extdirs\*(C'\fR was specified, append the contents of the + specified directories at the end of the class path. Otherwise, append + the contents of the built-in extdirs at \f(CW\*(C`$(prefix)/share/java/ext\*(C'\fR. + .PP + The classfile built by \fBgcj\fR for the class \f(CW\*(C`java.lang.Object\*(C'\fR + (and placed in \f(CW\*(C`libgcj.jar\*(C'\fR) contains a special zero length + attribute \f(CW\*(C`gnu.gcj.gcj\-compiled\*(C'\fR. The compiler looks for this + attribute when loading \f(CW\*(C`java.lang.Object\*(C'\fR and will report an error + if it isn't found, unless it compiles to bytecode (the option + \&\f(CW\*(C`\-fforce\-classes\-archive\-check\*(C'\fR can be used to override this + behavior in this particular case.) + .Ip "\fB\-fforce-classes-archive-check\fR" 4 + .IX Item "-fforce-classes-archive-check" + This forces the compiler to always check for the special zero length + attribute \f(CW\*(C`gnu.gcj.gcj\-compiled\*(C'\fR in \f(CW\*(C`java.lang.Object\*(C'\fR and + issue an error if it isn't found. + .Sh "Encodings" + .IX Subsection "Encodings" + The Java programming language uses Unicode throughout. In an effort to + integrate well with other locales, \fBgcj\fR allows \fI.java\fR files + to be written using almost any encoding. \fBgcj\fR knows how to + convert these encodings into its internal encoding at compile time. + .PP + You can use the \f(CW\*(C`\-\-encoding=\f(CI\s-1NAME\s0\f(CW\*(C'\fR option to specify an + encoding (of a particular character set) to use for source files. If + this is not specified, the default encoding comes from your current + locale. If your host system has insufficient locale support, then + \&\fBgcj\fR assumes the default encoding to be the \fB\s-1UTF-8\s0\fR encoding + of Unicode. + .PP + To implement \f(CW\*(C`\-\-encoding\*(C'\fR, \fBgcj\fR simply uses the host + platform's \f(CW\*(C`iconv\*(C'\fR conversion routine. This means that in practice + \&\fBgcj\fR is limited by the capabilities of the host platform. + .PP + The names allowed for the argument \f(CW\*(C`\-\-encoding\*(C'\fR vary from platform + to platform (since they are not standardized anywhere). However, + \&\fBgcj\fR implements the encoding named \fB\s-1UTF-8\s0\fR internally, so if + you choose to use this for your source files you can be assured that it + will work on every host. + .Sh "Warnings" + .IX Subsection "Warnings" + \&\fBgcj\fR implements several warnings. As with other generic + \&\fBgcc\fR warnings, if an option of the form \f(CW\*(C`\-Wfoo\*(C'\fR enables a + warning, then \f(CW\*(C`\-Wno\-foo\*(C'\fR will disable it. Here we've chosen to + document the form of the warning which will have an effect \*(-- the + default being the opposite of what is listed. + .Ip "\fB\-Wredundant-modifiers\fR" 4 + .IX Item "-Wredundant-modifiers" + With this flag, \fBgcj\fR will warn about redundant modifiers. For + instance, it will warn if an interface method is declared \f(CW\*(C`public\*(C'\fR. + .Ip "\fB\-Wextraneous-semicolon\fR" 4 + .IX Item "-Wextraneous-semicolon" + This causes \fBgcj\fR to warn about empty statements. Empty statements + have been deprecated. + .Ip "\fB\-Wno-out-of-date\fR" 4 + .IX Item "-Wno-out-of-date" + This option will cause \fBgcj\fR not to warn when a source file is + newer than its matching class file. By default \fBgcj\fR will warn + about this. + .Ip "\fB\-Wunused\fR" 4 + .IX Item "-Wunused" + This is the same as \fBgcc\fR's \f(CW\*(C`\-Wunused\*(C'\fR. + .Ip "\fB\-Wall\fR" 4 + .IX Item "-Wall" + This is the same as \f(CW\*(C`\-Wredundant\-modifiers \-Wextraneous\-semicolon + \&\-Wunused\*(C'\fR. + .Sh "Code Generation" + .IX Subsection "Code Generation" + In addition to the many \fBgcc\fR options controlling code generation, + \&\fBgcj\fR has several options specific to itself. + .Ip "\fB\*(--main=\fR\fI\s-1CLASSNAME\s0\fR" 4 + .IX Item "main=CLASSNAME" + This option is used when linking to specify the name of the class whose + \&\f(CW\*(C`main\*(C'\fR method should be invoked when the resulting executable is + run. [1] + .Ip "\fB\-D\fR\fIname\fR\fB[=\fR\fIvalue\fR\fB]\fR" 4 + .IX Item "-Dname[=value]" + This option can only be used with \f(CW\*(C`\-\-main\*(C'\fR. It defines a system + property named \fIname\fR with value \fIvalue\fR. If \fIvalue\fR is not + specified then it defaults to the empty string. These system properties + are initialized at the program's startup and can be retrieved at runtime + using the \f(CW\*(C`java.lang.System.getProperty\*(C'\fR method. + .Ip "\fB\-C\fR" 4 + .IX Item "-C" + This option is used to tell \fBgcj\fR to generate bytecode + (\fI.class\fR files) rather than object code. + .Ip "\fB\*(--resource\fR \fIresource-name\fR" 4 + .IX Item "resource resource-name" + This option is used to tell \fBgcj\fR to compile the contents of a + given file to object code so it may be accessed at runtime with the core + protocol handler as \fBcore:/\fR\fIresource-name\fR. Note that + \&\fIresource-name\fR is the name of the resource as found at runtime; for + instance, it could be used in a call to \f(CW\*(C`ResourceBundle.getBundle\*(C'\fR. + The actual file name to be compiled this way must be specified + separately. + .Ip "\fB\-d\fR \fIdirectory\fR" 4 + .IX Item "-d directory" + When used with \f(CW\*(C`\-C\*(C'\fR, this causes all generated \fI.class\fR files + to be put in the appropriate subdirectory of \fIdirectory\fR. By + default they will be put in subdirectories of the current working + directory. + .Ip "\fB\-fno-bounds-check\fR" 4 + .IX Item "-fno-bounds-check" + By default, \fBgcj\fR generates code which checks the bounds of all + array indexing operations. With this option, these checks are omitted, which + can improve performance for code that uses arrays extensively. Note that this + can result in unpredictable behavior if the code in question actually does + violate array bounds constraints. It is safe to use this option if you are + sure that your code will never throw an \f(CW\*(C`ArrayIndexOutOfBoundsException\*(C'\fR. + .Ip "\fB\-fno-store-check\fR" 4 + .IX Item "-fno-store-check" + Don't generate array store checks. When storing objects into arrays, a runtime + check is normally generated in order to ensure that the object is assignment + compatible with the component type of the array (which may not be known + at compile-time). With this option, these checks are omitted. This can + improve performance for code which stores objects into arrays frequently. + It is safe to use this option if you are sure your code will never throw an + \&\f(CW\*(C`ArrayStoreException\*(C'\fR. + .Ip "\fB\-fjni\fR" 4 + .IX Item "-fjni" + With \fBgcj\fR there are two options for writing native methods: \s-1CNI\s0 + and \s-1JNI\s0. By default \fBgcj\fR assumes you are using \s-1CNI\s0. If you are + compiling a class with native methods, and these methods are implemented + using \s-1JNI\s0, then you must use \f(CW\*(C`\-fjni\*(C'\fR. This option causes + \&\fBgcj\fR to generate stubs which will invoke the underlying \s-1JNI\s0 + methods. + .Ip "\fB\-fno-optimize-static-class-initialization\fR" 4 + .IX Item "-fno-optimize-static-class-initialization" + When the optimization level is greather or equal to \f(CW\*(C`\-O2\*(C'\fR, + \&\fBgcj\fR will try to optimize the way calls into the runtime are made + to initialize static classes upon their first use (this optimization + isn't carried out if \f(CW\*(C`\-C\*(C'\fR was specified.) When compiling to native + code, \f(CW\*(C`\-fno\-optimize\-static\-class\-initialization\*(C'\fR will turn this + optimization off, regardless of the optimization level in use. + .Sh "Configure-time Options" + .IX Subsection "Configure-time Options" + Some \fBgcj\fR code generations options affect the resulting \s-1ABI\s0, and + so can only be meaningfully given when \f(CW\*(C`libgcj\*(C'\fR, the runtime + package, is configured. \f(CW\*(C`libgcj\*(C'\fR puts the appropriate options from + this group into a \fBspec\fR file which is read by \fBgcj\fR. These + options are listed here for completeness; if you are using \f(CW\*(C`libgcj\*(C'\fR + then you won't want to touch these options. + .Ip "\fB\-fuse-boehm-gc\fR" 4 + .IX Item "-fuse-boehm-gc" + This enables the use of the Boehm \s-1GC\s0 bitmap marking code. In particular + this causes \fBgcj\fR to put an object marking descriptor into each + vtable. + .Ip "\fB\-fhash-synchronization\fR" 4 + .IX Item "-fhash-synchronization" + By default, synchronization data (the data used for \f(CW\*(C`synchronize\*(C'\fR, + \&\f(CW\*(C`wait\*(C'\fR, and \f(CW\*(C`notify\*(C'\fR) is pointed to by a word in each object. + With this option \fBgcj\fR assumes that this information is stored in a + hash table and not in the object itself. + .Ip "\fB\-fuse-divide-subroutine\fR" 4 + .IX Item "-fuse-divide-subroutine" + On some systems, a library routine is called to perform integer + division. This is required to get exception handling correct when + dividing by zero. + .Ip "\fB\-fcheck-references\fR" 4 + .IX Item "-fcheck-references" + On some systems it's necessary to insert inline checks whenever + accessing an object via a reference. On other systems you won't need + this because null pointer accesses are caught automatically by the + processor. + .SH "FOOTNOTES" + .IX Header "FOOTNOTES" + .Ip "1." 4 + The linker by default looks for a global function named + \&\f(CW\*(C`main\*(C'\fR. Since Java does not have global functions, and a + collection of Java classes may have more than one class with a + \&\f(CW\*(C`main\*(C'\fR method, you need to let the linker know which of those + \&\f(CW\*(C`main\*(C'\fR methods it should invoke when starting the application. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + \&\fIgcc\fR\|(1), \fIgcjh\fR\|(1), \fIgij\fR\|(1), \fIjv-scan\fR\|(1), \fIjcf-dump\fR\|(1), \fIgfdl\fR\|(7), + and the Info entries for \fIgcj\fR and \fIgcc\fR. + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/gcj.info gcc-3.1/gcc/java/gcj.info *** gcc-3.0.4/gcc/java/gcj.info Wed Feb 20 19:46:07 2002 --- gcc-3.1/gcc/java/gcj.info Wed May 15 02:45:53 2002 *************** *** 1,4 **** ! This is gcj.info, produced by makeinfo version 4.0b from gcj.texi. INFO-DIR-SECTION Programming START-INFO-DIR-ENTRY --- 1,4 ---- ! This is gcj.info, produced by makeinfo version 4.2 from gcj.texi. INFO-DIR-SECTION Programming START-INFO-DIR-ENTRY *************** START-INFO-DIR-ENTRY *** 14,22 **** * jcf-dump: (gcj)Invoking jcf-dump. Print information about Java class files * gij: (gcj)Invoking gij. GNU interpreter for Java bytecode END-INFO-DIR-ENTRY ! Copyright (C) 2001 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or --- 14,28 ---- * jcf-dump: (gcj)Invoking jcf-dump. Print information about Java class files * gij: (gcj)Invoking gij. GNU interpreter for Java bytecode + * jv-convert: (gcj)Invoking jv-convert. + Convert file from one encoding to another + * rmic: (gcj)Invoking rmic. + Generate stubs for Remote Method Invocation. + * rmiregistry: (gcj)Invoking rmiregistry. + The remote object registry. END-INFO-DIR-ENTRY ! Copyright (C) 2001, 2002 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or *************** software. Copies published by the Free *** 37,1312 **** funds for GNU development.  ! File: gcj.info, Node: Top, Next: Copying, Up: (dir) ! ! Introduction ! ************ ! ! This manual describes how to use `gcj', the GNU compiler for the ! Java programming language. `gcj' can generate both `.class' files and ! object files, and it can read both Java source code and `.class' files. ! ! * Menu: ! ! * Copying:: The GNU General Public License ! * GNU Free Documentation License:: ! How you can share and copy this manual ! * Invoking gcj:: Compiler options supported by `gcj' ! * Compatibility:: Compatibility between gcj and other tools for Java ! * Invoking gcjh:: Generate header files from class files ! * Invoking jv-scan:: Print information about source files ! * Invoking jcf-dump:: Print information about class files ! * Invoking gij:: Interpreting Java bytecodes ! * Resources:: Where to look for more information ! !  ! File: gcj.info, Node: Copying, Next: GNU Free Documentation License, Prev: Top, Up: Top ! ! GNU GENERAL PUBLIC LICENSE ! ************************** ! ! Version 2, June 1991 ! Copyright (C) 1989, 1991 Free Software Foundation, Inc. ! 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA ! ! Everyone is permitted to copy and distribute verbatim copies ! of this license document, but changing it is not allowed. ! ! Preamble ! ======== ! ! The licenses for most software are designed to take away your ! freedom to share and change it. By contrast, the GNU General Public ! License is intended to guarantee your freedom to share and change free ! software--to make sure the software is free for all its users. This ! General Public License applies to most of the Free Software ! Foundation's software and to any other program whose authors commit to ! using it. (Some other Free Software Foundation software is covered by ! the GNU Library General Public License instead.) You can apply it to ! your programs, too. ! ! When we speak of free software, we are referring to freedom, not ! price. Our General Public Licenses are designed to make sure that you ! have the freedom to distribute copies of free software (and charge for ! this service if you wish), that you receive source code or can get it ! if you want it, that you can change the software or use pieces of it in ! new free programs; and that you know you can do these things. ! ! To protect your rights, we need to make restrictions that forbid ! anyone to deny you these rights or to ask you to surrender the rights. ! These restrictions translate to certain responsibilities for you if you ! distribute copies of the software, or if you modify it. ! ! For example, if you distribute copies of such a program, whether ! gratis or for a fee, you must give the recipients all the rights that ! you have. You must make sure that they, too, receive or can get the ! source code. And you must show them these terms so they know their ! rights. ! ! We protect your rights with two steps: (1) copyright the software, ! and (2) offer you this license which gives you legal permission to copy, ! distribute and/or modify the software. ! ! Also, for each author's protection and ours, we want to make certain ! that everyone understands that there is no warranty for this free ! software. If the software is modified by someone else and passed on, we ! want its recipients to know that what they have is not the original, so ! that any problems introduced by others will not reflect on the original ! authors' reputations. ! ! Finally, any free program is threatened constantly by software ! patents. We wish to avoid the danger that redistributors of a free ! program will individually obtain patent licenses, in effect making the ! program proprietary. To prevent this, we have made it clear that any ! patent must be licensed for everyone's free use or not licensed at all. ! ! The precise terms and conditions for copying, distribution and ! modification follow. ! ! TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ! 0. This License applies to any program or other work which contains a ! notice placed by the copyright holder saying it may be distributed ! under the terms of this General Public License. The "Program", ! below, refers to any such program or work, and a "work based on ! the Program" means either the Program or any derivative work under ! copyright law: that is to say, a work containing the Program or a ! portion of it, either verbatim or with modifications and/or ! translated into another language. (Hereinafter, translation is ! included without limitation in the term "modification".) Each ! licensee is addressed as "you". ! ! Activities other than copying, distribution and modification are ! not covered by this License; they are outside its scope. The act ! of running the Program is not restricted, and the output from the ! Program is covered only if its contents constitute a work based on ! the Program (independent of having been made by running the ! Program). Whether that is true depends on what the Program does. ! ! 1. You may copy and distribute verbatim copies of the Program's ! source code as you receive it, in any medium, provided that you ! conspicuously and appropriately publish on each copy an appropriate ! copyright notice and disclaimer of warranty; keep intact all the ! notices that refer to this License and to the absence of any ! warranty; and give any other recipients of the Program a copy of ! this License along with the Program. ! ! You may charge a fee for the physical act of transferring a copy, ! and you may at your option offer warranty protection in exchange ! for a fee. ! ! 2. You may modify your copy or copies of the Program or any portion ! of it, thus forming a work based on the Program, and copy and ! distribute such modifications or work under the terms of Section 1 ! above, provided that you also meet all of these conditions: ! ! a. You must cause the modified files to carry prominent notices ! stating that you changed the files and the date of any change. ! ! b. You must cause any work that you distribute or publish, that ! in whole or in part contains or is derived from the Program ! or any part thereof, to be licensed as a whole at no charge ! to all third parties under the terms of this License. ! ! c. If the modified program normally reads commands interactively ! when run, you must cause it, when started running for such ! interactive use in the most ordinary way, to print or display ! an announcement including an appropriate copyright notice and ! a notice that there is no warranty (or else, saying that you ! provide a warranty) and that users may redistribute the ! program under these conditions, and telling the user how to ! view a copy of this License. (Exception: if the Program ! itself is interactive but does not normally print such an ! announcement, your work based on the Program is not required ! to print an announcement.) ! ! These requirements apply to the modified work as a whole. If ! identifiable sections of that work are not derived from the ! Program, and can be reasonably considered independent and separate ! works in themselves, then this License, and its terms, do not ! apply to those sections when you distribute them as separate ! works. But when you distribute the same sections as part of a ! whole which is a work based on the Program, the distribution of ! the whole must be on the terms of this License, whose permissions ! for other licensees extend to the entire whole, and thus to each ! and every part regardless of who wrote it. ! ! Thus, it is not the intent of this section to claim rights or ! contest your rights to work written entirely by you; rather, the ! intent is to exercise the right to control the distribution of ! derivative or collective works based on the Program. ! ! In addition, mere aggregation of another work not based on the ! Program with the Program (or with a work based on the Program) on ! a volume of a storage or distribution medium does not bring the ! other work under the scope of this License. ! ! 3. You may copy and distribute the Program (or a work based on it, ! under Section 2) in object code or executable form under the terms ! of Sections 1 and 2 above provided that you also do one of the ! following: ! ! a. Accompany it with the complete corresponding machine-readable ! source code, which must be distributed under the terms of ! Sections 1 and 2 above on a medium customarily used for ! software interchange; or, ! ! b. Accompany it with a written offer, valid for at least three ! years, to give any third party, for a charge no more than your ! cost of physically performing source distribution, a complete ! machine-readable copy of the corresponding source code, to be ! distributed under the terms of Sections 1 and 2 above on a ! medium customarily used for software interchange; or, ! ! c. Accompany it with the information you received as to the offer ! to distribute corresponding source code. (This alternative is ! allowed only for noncommercial distribution and only if you ! received the program in object code or executable form with ! such an offer, in accord with Subsection b above.) ! ! The source code for a work means the preferred form of the work for ! making modifications to it. For an executable work, complete ! source code means all the source code for all modules it contains, ! plus any associated interface definition files, plus the scripts ! used to control compilation and installation of the executable. ! However, as a special exception, the source code distributed need ! not include anything that is normally distributed (in either ! source or binary form) with the major components (compiler, ! kernel, and so on) of the operating system on which the executable ! runs, unless that component itself accompanies the executable. ! ! If distribution of executable or object code is made by offering ! access to copy from a designated place, then offering equivalent ! access to copy the source code from the same place counts as ! distribution of the source code, even though third parties are not ! compelled to copy the source along with the object code. ! ! 4. You may not copy, modify, sublicense, or distribute the Program ! except as expressly provided under this License. Any attempt ! otherwise to copy, modify, sublicense or distribute the Program is ! void, and will automatically terminate your rights under this ! License. However, parties who have received copies, or rights, ! from you under this License will not have their licenses ! terminated so long as such parties remain in full compliance. ! ! 5. You are not required to accept this License, since you have not ! signed it. However, nothing else grants you permission to modify ! or distribute the Program or its derivative works. These actions ! are prohibited by law if you do not accept this License. ! Therefore, by modifying or distributing the Program (or any work ! based on the Program), you indicate your acceptance of this ! License to do so, and all its terms and conditions for copying, ! distributing or modifying the Program or works based on it. ! ! 6. Each time you redistribute the Program (or any work based on the ! Program), the recipient automatically receives a license from the ! original licensor to copy, distribute or modify the Program ! subject to these terms and conditions. You may not impose any ! further restrictions on the recipients' exercise of the rights ! granted herein. You are not responsible for enforcing compliance ! by third parties to this License. ! ! 7. If, as a consequence of a court judgment or allegation of patent ! infringement or for any other reason (not limited to patent ! issues), conditions are imposed on you (whether by court order, ! agreement or otherwise) that contradict the conditions of this ! License, they do not excuse you from the conditions of this ! License. If you cannot distribute so as to satisfy simultaneously ! your obligations under this License and any other pertinent ! obligations, then as a consequence you may not distribute the ! Program at all. For example, if a patent license would not permit ! royalty-free redistribution of the Program by all those who ! receive copies directly or indirectly through you, then the only ! way you could satisfy both it and this License would be to refrain ! entirely from distribution of the Program. ! ! If any portion of this section is held invalid or unenforceable ! under any particular circumstance, the balance of the section is ! intended to apply and the section as a whole is intended to apply ! in other circumstances. ! ! It is not the purpose of this section to induce you to infringe any ! patents or other property right claims or to contest validity of ! any such claims; this section has the sole purpose of protecting ! the integrity of the free software distribution system, which is ! implemented by public license practices. Many people have made ! generous contributions to the wide range of software distributed ! through that system in reliance on consistent application of that ! system; it is up to the author/donor to decide if he or she is ! willing to distribute software through any other system and a ! licensee cannot impose that choice. ! ! This section is intended to make thoroughly clear what is believed ! to be a consequence of the rest of this License. ! ! 8. If the distribution and/or use of the Program is restricted in ! certain countries either by patents or by copyrighted interfaces, ! the original copyright holder who places the Program under this ! License may add an explicit geographical distribution limitation ! excluding those countries, so that distribution is permitted only ! in or among countries not thus excluded. In such case, this ! License incorporates the limitation as if written in the body of ! this License. ! ! 9. The Free Software Foundation may publish revised and/or new ! versions of the General Public License from time to time. Such ! new versions will be similar in spirit to the present version, but ! may differ in detail to address new problems or concerns. ! ! Each version is given a distinguishing version number. If the ! Program specifies a version number of this License which applies ! to it and "any later version", you have the option of following ! the terms and conditions either of that version or of any later ! version published by the Free Software Foundation. If the Program ! does not specify a version number of this License, you may choose ! any version ever published by the Free Software Foundation. ! ! 10. If you wish to incorporate parts of the Program into other free ! programs whose distribution conditions are different, write to the ! author to ask for permission. For software which is copyrighted ! by the Free Software Foundation, write to the Free Software ! Foundation; we sometimes make exceptions for this. Our decision ! will be guided by the two goals of preserving the free status of ! all derivatives of our free software and of promoting the sharing ! and reuse of software generally. ! ! NO WARRANTY ! ! 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO ! WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE ! LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ! HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT ! WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT ! NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND ! FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE ! QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ! PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY ! SERVICING, REPAIR OR CORRECTION. ! ! 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN ! WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY ! MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE ! LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, ! INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR ! INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ! DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU ! OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY ! OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ! ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ! ! END OF TERMS AND CONDITIONS ! ! How to Apply These Terms to Your New Programs ! ============================================= ! ! If you develop a new program, and you want it to be of the greatest ! possible use to the public, the best way to achieve this is to make it ! free software which everyone can redistribute and change under these ! terms. ! ! To do so, attach the following notices to the program. It is safest ! to attach them to the start of each source file to most effectively ! convey the exclusion of warranty; and each file should have at least ! the "copyright" line and a pointer to where the full notice is found. ! ! ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. ! Copyright (C) YEAR NAME OF AUTHOR ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2 of the License, or ! (at your option) any later version. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 59 Temple Place - Suite 330, ! Boston, MA 02111-1307, USA. ! ! Also add information on how to contact you by electronic and paper ! mail. ! ! If the program is interactive, make it output a short notice like ! this when it starts in an interactive mode: ! ! Gnomovision version 69, Copyright (C) YEAR NAME OF AUTHOR ! Gnomovision comes with ABSOLUTELY NO WARRANTY; for details ! type `show w'. ! This is free software, and you are welcome to redistribute it ! under certain conditions; type `show c' for details. ! ! The hypothetical commands `show w' and `show c' should show the ! appropriate parts of the General Public License. Of course, the ! commands you use may be called something other than `show w' and `show ! c'; they could even be mouse-clicks or menu items--whatever suits your ! program. ! ! You should also get your employer (if you work as a programmer) or ! your school, if any, to sign a "copyright disclaimer" for the program, ! if necessary. Here is a sample; alter the names: ! ! Yoyodyne, Inc., hereby disclaims all copyright interest in the program ! `Gnomovision' (which makes passes at compilers) written by James Hacker. ! ! SIGNATURE OF TY COON, 1 April 1989 ! Ty Coon, President of Vice ! ! This General Public License does not permit incorporating your ! program into proprietary programs. If your program is a subroutine ! library, you may consider it more useful to permit linking proprietary ! applications with the library. If this is what you want to do, use the ! GNU Library General Public License instead of this License. ! !  ! File: gcj.info, Node: GNU Free Documentation License, Next: Invoking gcj, Prev: Copying, Up: Top ! ! GNU Free Documentation License ! ****************************** ! ! Version 1.1, March 2000 ! Copyright (C) 2000 Free Software Foundation, Inc. ! 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA ! ! Everyone is permitted to copy and distribute verbatim copies ! of this license document, but changing it is not allowed. ! ! 0. PREAMBLE ! ! The purpose of this License is to make a manual, textbook, or other ! written document "free" in the sense of freedom: to assure everyone ! the effective freedom to copy and redistribute it, with or without ! modifying it, either commercially or noncommercially. Secondarily, ! this License preserves for the author and publisher a way to get ! credit for their work, while not being considered responsible for ! modifications made by others. ! ! This License is a kind of "copyleft", which means that derivative ! works of the document must themselves be free in the same sense. ! It complements the GNU General Public License, which is a copyleft ! license designed for free software. ! ! We have designed this License in order to use it for manuals for ! free software, because free software needs free documentation: a ! free program should come with manuals providing the same freedoms ! that the software does. But this License is not limited to ! software manuals; it can be used for any textual work, regardless ! of subject matter or whether it is published as a printed book. ! We recommend this License principally for works whose purpose is ! instruction or reference. ! ! 1. APPLICABILITY AND DEFINITIONS ! ! This License applies to any manual or other work that contains a ! notice placed by the copyright holder saying it can be distributed ! under the terms of this License. The "Document", below, refers to ! any such manual or work. Any member of the public is a licensee, ! and is addressed as "you". ! ! A "Modified Version" of the Document means any work containing the ! Document or a portion of it, either copied verbatim, or with ! modifications and/or translated into another language. ! ! A "Secondary Section" is a named appendix or a front-matter ! section of the Document that deals exclusively with the ! relationship of the publishers or authors of the Document to the ! Document's overall subject (or to related matters) and contains ! nothing that could fall directly within that overall subject. ! (For example, if the Document is in part a textbook of ! mathematics, a Secondary Section may not explain any mathematics.) ! The relationship could be a matter of historical connection with ! the subject or with related matters, or of legal, commercial, ! philosophical, ethical or political position regarding them. ! ! The "Invariant Sections" are certain Secondary Sections whose ! titles are designated, as being those of Invariant Sections, in ! the notice that says that the Document is released under this ! License. ! ! The "Cover Texts" are certain short passages of text that are ! listed, as Front-Cover Texts or Back-Cover Texts, in the notice ! that says that the Document is released under this License. ! ! A "Transparent" copy of the Document means a machine-readable copy, ! represented in a format whose specification is available to the ! general public, whose contents can be viewed and edited directly ! and straightforwardly with generic text editors or (for images ! composed of pixels) generic paint programs or (for drawings) some ! widely available drawing editor, and that is suitable for input to ! text formatters or for automatic translation to a variety of ! formats suitable for input to text formatters. A copy made in an ! otherwise Transparent file format whose markup has been designed ! to thwart or discourage subsequent modification by readers is not ! Transparent. A copy that is not "Transparent" is called "Opaque". ! ! Examples of suitable formats for Transparent copies include plain ! ASCII without markup, Texinfo input format, LaTeX input format, ! SGML or XML using a publicly available DTD, and ! standard-conforming simple HTML designed for human modification. ! Opaque formats include PostScript, PDF, proprietary formats that ! can be read and edited only by proprietary word processors, SGML ! or XML for which the DTD and/or processing tools are not generally ! available, and the machine-generated HTML produced by some word ! processors for output purposes only. ! ! The "Title Page" means, for a printed book, the title page itself, ! plus such following pages as are needed to hold, legibly, the ! material this License requires to appear in the title page. For ! works in formats which do not have any title page as such, "Title ! Page" means the text near the most prominent appearance of the ! work's title, preceding the beginning of the body of the text. ! ! 2. VERBATIM COPYING ! ! You may copy and distribute the Document in any medium, either ! commercially or noncommercially, provided that this License, the ! copyright notices, and the license notice saying this License ! applies to the Document are reproduced in all copies, and that you ! add no other conditions whatsoever to those of this License. You ! may not use technical measures to obstruct or control the reading ! or further copying of the copies you make or distribute. However, ! you may accept compensation in exchange for copies. If you ! distribute a large enough number of copies you must also follow ! the conditions in section 3. ! ! You may also lend copies, under the same conditions stated above, ! and you may publicly display copies. ! ! 3. COPYING IN QUANTITY ! ! If you publish printed copies of the Document numbering more than ! 100, and the Document's license notice requires Cover Texts, you ! must enclose the copies in covers that carry, clearly and legibly, ! all these Cover Texts: Front-Cover Texts on the front cover, and ! Back-Cover Texts on the back cover. Both covers must also clearly ! and legibly identify you as the publisher of these copies. The ! front cover must present the full title with all words of the ! title equally prominent and visible. You may add other material ! on the covers in addition. Copying with changes limited to the ! covers, as long as they preserve the title of the Document and ! satisfy these conditions, can be treated as verbatim copying in ! other respects. ! ! If the required texts for either cover are too voluminous to fit ! legibly, you should put the first ones listed (as many as fit ! reasonably) on the actual cover, and continue the rest onto ! adjacent pages. ! ! If you publish or distribute Opaque copies of the Document ! numbering more than 100, you must either include a ! machine-readable Transparent copy along with each Opaque copy, or ! state in or with each Opaque copy a publicly-accessible ! computer-network location containing a complete Transparent copy ! of the Document, free of added material, which the general ! network-using public has access to download anonymously at no ! charge using public-standard network protocols. If you use the ! latter option, you must take reasonably prudent steps, when you ! begin distribution of Opaque copies in quantity, to ensure that ! this Transparent copy will remain thus accessible at the stated ! location until at least one year after the last time you ! distribute an Opaque copy (directly or through your agents or ! retailers) of that edition to the public. ! ! It is requested, but not required, that you contact the authors of ! the Document well before redistributing any large number of ! copies, to give them a chance to provide you with an updated ! version of the Document. ! ! 4. MODIFICATIONS ! ! You may copy and distribute a Modified Version of the Document ! under the conditions of sections 2 and 3 above, provided that you ! release the Modified Version under precisely this License, with ! the Modified Version filling the role of the Document, thus ! licensing distribution and modification of the Modified Version to ! whoever possesses a copy of it. In addition, you must do these ! things in the Modified Version: ! ! A. Use in the Title Page (and on the covers, if any) a title ! distinct from that of the Document, and from those of ! previous versions (which should, if there were any, be listed ! in the History section of the Document). You may use the ! same title as a previous version if the original publisher of ! that version gives permission. ! ! B. List on the Title Page, as authors, one or more persons or ! entities responsible for authorship of the modifications in ! the Modified Version, together with at least five of the ! principal authors of the Document (all of its principal ! authors, if it has less than five). ! ! C. State on the Title page the name of the publisher of the ! Modified Version, as the publisher. ! ! D. Preserve all the copyright notices of the Document. ! ! E. Add an appropriate copyright notice for your modifications ! adjacent to the other copyright notices. ! ! F. Include, immediately after the copyright notices, a license ! notice giving the public permission to use the Modified ! Version under the terms of this License, in the form shown in ! the Addendum below. ! ! G. Preserve in that license notice the full lists of Invariant ! Sections and required Cover Texts given in the Document's ! license notice. ! ! H. Include an unaltered copy of this License. ! ! I. Preserve the section entitled "History", and its title, and ! add to it an item stating at least the title, year, new ! authors, and publisher of the Modified Version as given on ! the Title Page. If there is no section entitled "History" in ! the Document, create one stating the title, year, authors, ! and publisher of the Document as given on its Title Page, ! then add an item describing the Modified Version as stated in ! the previous sentence. ! ! J. Preserve the network location, if any, given in the Document ! for public access to a Transparent copy of the Document, and ! likewise the network locations given in the Document for ! previous versions it was based on. These may be placed in ! the "History" section. You may omit a network location for a ! work that was published at least four years before the ! Document itself, or if the original publisher of the version ! it refers to gives permission. ! ! K. In any section entitled "Acknowledgments" or "Dedications", ! preserve the section's title, and preserve in the section all ! the substance and tone of each of the contributor ! acknowledgments and/or dedications given therein. ! ! L. Preserve all the Invariant Sections of the Document, ! unaltered in their text and in their titles. Section numbers ! or the equivalent are not considered part of the section ! titles. ! ! M. Delete any section entitled "Endorsements". Such a section ! may not be included in the Modified Version. ! ! N. Do not retitle any existing section as "Endorsements" or to ! conflict in title with any Invariant Section. ! ! If the Modified Version includes new front-matter sections or ! appendices that qualify as Secondary Sections and contain no ! material copied from the Document, you may at your option ! designate some or all of these sections as invariant. To do this, ! add their titles to the list of Invariant Sections in the Modified ! Version's license notice. These titles must be distinct from any ! other section titles. ! ! You may add a section entitled "Endorsements", provided it contains ! nothing but endorsements of your Modified Version by various ! parties--for example, statements of peer review or that the text ! has been approved by an organization as the authoritative ! definition of a standard. ! ! You may add a passage of up to five words as a Front-Cover Text, ! and a passage of up to 25 words as a Back-Cover Text, to the end ! of the list of Cover Texts in the Modified Version. Only one ! passage of Front-Cover Text and one of Back-Cover Text may be ! added by (or through arrangements made by) any one entity. If the ! Document already includes a cover text for the same cover, ! previously added by you or by arrangement made by the same entity ! you are acting on behalf of, you may not add another; but you may ! replace the old one, on explicit permission from the previous ! publisher that added the old one. ! ! The author(s) and publisher(s) of the Document do not by this ! License give permission to use their names for publicity for or to ! assert or imply endorsement of any Modified Version. ! ! 5. COMBINING DOCUMENTS ! ! You may combine the Document with other documents released under ! this License, under the terms defined in section 4 above for ! modified versions, provided that you include in the combination ! all of the Invariant Sections of all of the original documents, ! unmodified, and list them all as Invariant Sections of your ! combined work in its license notice. ! ! The combined work need only contain one copy of this License, and ! multiple identical Invariant Sections may be replaced with a single ! copy. If there are multiple Invariant Sections with the same name ! but different contents, make the title of each such section unique ! by adding at the end of it, in parentheses, the name of the ! original author or publisher of that section if known, or else a ! unique number. Make the same adjustment to the section titles in ! the list of Invariant Sections in the license notice of the ! combined work. ! ! In the combination, you must combine any sections entitled ! "History" in the various original documents, forming one section ! entitled "History"; likewise combine any sections entitled ! "Acknowledgments", and any sections entitled "Dedications". You ! must delete all sections entitled "Endorsements." ! ! 6. COLLECTIONS OF DOCUMENTS ! ! You may make a collection consisting of the Document and other ! documents released under this License, and replace the individual ! copies of this License in the various documents with a single copy ! that is included in the collection, provided that you follow the ! rules of this License for verbatim copying of each of the ! documents in all other respects. ! ! You may extract a single document from such a collection, and ! distribute it individually under this License, provided you insert ! a copy of this License into the extracted document, and follow ! this License in all other respects regarding verbatim copying of ! that document. ! ! 7. AGGREGATION WITH INDEPENDENT WORKS ! ! A compilation of the Document or its derivatives with other ! separate and independent documents or works, in or on a volume of ! a storage or distribution medium, does not as a whole count as a ! Modified Version of the Document, provided no compilation ! copyright is claimed for the compilation. Such a compilation is ! called an "aggregate", and this License does not apply to the ! other self-contained works thus compiled with the Document, on ! account of their being thus compiled, if they are not themselves ! derivative works of the Document. ! ! If the Cover Text requirement of section 3 is applicable to these ! copies of the Document, then if the Document is less than one ! quarter of the entire aggregate, the Document's Cover Texts may be ! placed on covers that surround only the Document within the ! aggregate. Otherwise they must appear on covers around the whole ! aggregate. ! ! 8. TRANSLATION ! ! Translation is considered a kind of modification, so you may ! distribute translations of the Document under the terms of section ! 4. Replacing Invariant Sections with translations requires special ! permission from their copyright holders, but you may include ! translations of some or all Invariant Sections in addition to the ! original versions of these Invariant Sections. You may include a ! translation of this License provided that you also include the ! original English version of this License. In case of a ! disagreement between the translation and the original English ! version of this License, the original English version will prevail. ! ! 9. TERMINATION ! ! You may not copy, modify, sublicense, or distribute the Document ! except as expressly provided for under this License. Any other ! attempt to copy, modify, sublicense or distribute the Document is ! void, and will automatically terminate your rights under this ! License. However, parties who have received copies, or rights, ! from you under this License will not have their licenses ! terminated so long as such parties remain in full compliance. ! ! 10. FUTURE REVISIONS OF THIS LICENSE ! ! The Free Software Foundation may publish new, revised versions of ! the GNU Free Documentation License from time to time. Such new ! versions will be similar in spirit to the present version, but may ! differ in detail to address new problems or concerns. See ! `http://www.gnu.org/copyleft/'. ! ! Each version of the License is given a distinguishing version ! number. If the Document specifies that a particular numbered ! version of this License "or any later version" applies to it, you ! have the option of following the terms and conditions either of ! that specified version or of any later version that has been ! published (not as a draft) by the Free Software Foundation. If ! the Document does not specify a version number of this License, ! you may choose any version ever published (not as a draft) by the ! Free Software Foundation. ! ! ADDENDUM: How to use this License for your documents ! ==================================================== ! ! To use this License in a document you have written, include a copy of ! the License in the document and put the following copyright and license ! notices just after the title page: ! ! Copyright (C) YEAR YOUR NAME. ! Permission is granted to copy, distribute and/or modify this document ! under the terms of the GNU Free Documentation License, Version 1.1 ! or any later version published by the Free Software Foundation; ! with the Invariant Sections being LIST THEIR TITLES, with the ! Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. ! A copy of the license is included in the section entitled ``GNU ! Free Documentation License''. ! ! If you have no Invariant Sections, write "with no Invariant Sections" ! instead of saying which ones are invariant. If you have no Front-Cover ! Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being ! LIST"; likewise for Back-Cover Texts. ! ! If your document contains nontrivial examples of program code, we ! recommend releasing these examples in parallel under your choice of ! free software license, such as the GNU General Public License, to ! permit their use in free software. ! !  ! File: gcj.info, Node: Invoking gcj, Next: Compatibility, Prev: GNU Free Documentation License, Up: Top ! ! Invoking gcj ! ************ ! ! As `gcj' is just another front end to `gcc', it supports many of the ! same options as gcc. *Note Option Summary: (gcc)Option Summary. This ! manual only documents the options specific to `gcj'. ! ! * Menu: ! ! * Input and output files:: ! * Input Options:: How gcj finds files ! * Encodings:: Options controlling source file encoding ! * Warnings:: Options controlling warnings specific to gcj ! * Code Generation:: Options controlling the output of gcj ! * Configure-time Options:: Options you won't use ! !  ! File: gcj.info, Node: Input and output files, Next: Input Options, Up: Invoking gcj ! ! Input and output files ! ====================== ! ! A `gcj' command is like a `gcc' command, in that it consists of a ! number of options and file names. The following kinds of input file ! names are supported: ! ! `FILE.java' ! Java source files. ! ! `FILE.class' ! Java bytecode files. ! ! `FILE.zip' ! `FILE.jar' ! An archive containing one or more `.class' files, all of which are ! compiled. The archive may be compressed. ! ! `@FILE' ! A file containing a whitespace-separated list of input file names. ! (Currently, these must all be `.java' source files, but that may ! change.) Each named file is compiled, just as if it had been on ! the command line. ! ! `LIBRARY.a' ! `LIBRARY.so' ! `-lLIBNAME' ! Libraries to use when linking. See the `gcc' manual. ! ! You can specify more than one input file on the `gcj' command line, ! in which case they will all be compiled. If you specify a `-o FILENAME' ! option, all the input files will be compiled together, producing a ! single output file, named FILENAME. This is allowed even when using ! `-S' or `-c', but not when using `-C'. (This is an extension beyond ! the what plain `gcc' allows.) (If more than one input file is ! specified, all must currently be `.java' files, though we hope to fix ! this.) ! !  ! File: gcj.info, Node: Input Options, Next: Encodings, Prev: Input and output files, Up: Invoking gcj ! ! Input Options ! ============= ! ! `gcj' has options to control where it looks to find files it needs. ! For instance, `gcj' might need to load a class that is referenced by ! the file it has been asked to compile. Like other compilers for the ! Java language, `gcj' has a notion of a "class path". There are several ! options and environment variables which can be used to manipulate the ! class path. When `gcj' looks for a given class, it searches the class ! path looking for matching `.class' or `.java' file. `gcj' comes with a ! built-in class path which points at the installed `libgcj.jar', a file ! which contains all the standard classes. ! ! In the below, a directory or path component can refer either to an ! actual directory on the filesystem, or to a `.zip' or `.jar' file, ! which `gcj' will search as if it is a directory. ! ! `-IDIR' ! All directories specified by `-I' are kept in order and prepended ! to the class path constructed from all the other options. Unless ! compatibility with tools like `javac' is imported, we recommend ! always using `-I' instead of the other options for manipulating the ! class path. ! ! `--classpath=PATH' ! This sets the class path to PATH, a colon-separated list of paths ! (on Windows-based systems, a semicolon-separate list of paths). ! ! `--CLASSPATH=PATH' ! This sets the class path to PATH, a colon-separated list of paths ! (on Windows-based systems, a semicolon-separate list of paths). ! This differs from the `--classpath' option in that it also ! suppresses the built-in system path. ! ! `CLASSPATH' ! This is an environment variable which holds a list of paths. ! ! The final class path is constructed like so: ! ! * First come all directories specified via `-I'. ! ! * If `--classpath' is specified, its value is appended and processing ! stops. That is, `--classpath' suppresses all the options mentioned ! later in this list. ! ! * If `--CLASSPATH' is specified, its value is appended and the ! `CLASSPATH' environment variable is suppressed. ! ! * If the `CLASSPATH' environment variable is specified (and was not ! suppressed by `--CLASSPATH'), then its value is appended. ! ! * Finally, the built-in system directory, `libgcj.jar', is appended. ! ! The classfile built by `gcj' for the class `java.lang.Object' (and ! placed in `libgcj.jar') contains a special zero length attribute ! `gnu.gcj.gcj-compiled'. The compiler looks for this attribute when ! loading `java.lang.Object' and will report an error if it isn't found, ! unless it compiles to bytecode (the option ! `-fforce-classes-archive-check' can be used to overide this behavior in ! this particular case.) ! ! `-fforce-classes-archive-check' ! This forces the compiler to always check for the special zero ! length attribute `gnu.gcj.gcj-compiled' in `java.lang.Object' and ! issue an error if it isn't found. ! !  ! File: gcj.info, Node: Encodings, Next: Warnings, Prev: Input Options, Up: Invoking gcj ! ! Encodings ! ========= ! ! The Java programming language uses Unicode throughout. In an effort ! to integrate well with other locales, `gcj' allows `.java' files to be ! written using almost any encoding. `gcj' knows how to convert these ! encodings into its internal encoding at compile time. ! ! You can use the `--encoding=NAME' option to specify an encoding (of ! a particular character set) to use for source files. If this is not ! specified, the default encoding comes from your current locale. If ! your host system has insufficient locale support, then `gcj' assumes ! the default encoding to be the `UTF-8' encoding of Unicode. ! ! To implement `--encoding', `gcj' simply uses the host platform's ! `iconv' conversion routine. This means that in practice `gcj' is ! limited by the capabilities of the host platform. ! ! The names allowed for the argument `--encoding' vary from platform ! to platform (since they are not standardized anywhere). However, `gcj' ! implements the encoding named `UTF-8' internally, so if you choose to ! use this for your source files you can be assured that it will work on ! every host. ! !  ! File: gcj.info, Node: Warnings, Next: Code Generation, Prev: Encodings, Up: Invoking gcj ! ! Warnings ! ======== ! ! `gcj' implements several warnings. As with other generic `gcc' ! warnings, if an option of the form `-Wfoo' enables a warning, then ! `-Wno-foo' will disable it. Here we've chosen to document the form of ! the warning which will have an effect - the default being the opposite ! of what is listed. ! ! `-Wredundant-modifiers' ! With this flag, `gcj' will warn about redundant modifiers. For ! instance, it will warn if an interface method is declared `public'. ! ! `-Wextraneous-semicolon' ! This causes `gcj' to warn about empty statements. Empty statements ! have been deprecated. ! ! `-Wno-out-of-date' ! This option will cause `gcj' not to warn when a source file is ! newer than its matching class file. By default `gcj' will warn ! about this. ! ! `-Wunused' ! This is the same as `gcc''s `-Wunused'. ! ! `-Wall' ! This is the same as `-Wredundant-modifiers -Wextraneous-semicolon ! -Wunused'. ! !  ! File: gcj.info, Node: Code Generation, Next: Configure-time Options, Prev: Warnings, Up: Invoking gcj ! ! Code Generation ! =============== ! ! In addition to the many `gcc' options controlling code generation, ! `gcj' has several options specific to itself. ! ! `--main=CLASSNAME' ! This option is used when linking to specify the name of the class ! whose `main' method should be invoked when the resulting ! executable is run. (1) ! ! `-DNAME[=VALUE]' ! This option can only be used with `--main'. It defines a system ! property named NAME with value VALUE. If VALUE is not specified ! then it defaults to the empty string. These system properties are ! initialized at the program's startup and can be retrieved at ! runtime using the `java.lang.System.getProperty' method. ! ! `-C' ! This option is used to tell `gcj' to generate bytecode (`.class' ! files) rather than object code. ! ! `-d DIRECTORY' ! When used with `-C', this causes all generated `.class' files to ! be put in the appropriate subdirectory of DIRECTORY. By default ! they will be put in subdirectories of the current working ! directory. ! ! `-fno-bounds-check' ! By default, `gcj' generates code which checks the bounds of all ! array indexing operations. With this option, these checks are ! omitted. Note that this can result in unpredictable behavior if ! the code in question actually does violate array bounds ! constraints. ! ! `-fjni' ! With `gcj' there are two options for writing native methods: CNI ! and JNI. By default `gcj' assumes you are using CNI. If you are ! compiling a class with native methods, and these methods are ! implemented using JNI, then you must use `-fjni'. This option ! causes `gcj' to generate stubs which will invoke the underlying JNI ! methods. ! ! ---------- Footnotes ---------- ! ! (1) The linker by default looks for a global function named `main'. ! Since Java does not have global functions, and a collection of Java ! classes may have more than one class with a `main' method, you need to ! let the linker know which of those `main' methods it should invoke when ! starting the application. ! !  ! File: gcj.info, Node: Configure-time Options, Prev: Code Generation, Up: Invoking gcj ! ! Configure-time Options ! ====================== ! ! Some `gcj' code generations options affect the resulting ABI, and so ! can only be meaningfully given when `libgcj', the runtime package, is ! configured. `libgcj' puts the appropriate options from this group into ! a `spec' file which is read by `gcj'. These options are listed here ! for completeness; if you are using `libgcj' then you won't want to ! touch these options. ! ! `-fuse-boehm-gc' ! This enables the use of the Boehm GC bitmap marking code. In ! particular this causes `gcj' to put an object marking descriptor ! into each vtable. ! ! `-fhash-synchronization' ! By default, synchronization data (the data used for `synchronize', ! `wait', and `notify') is pointed to by a word in each object. ! With this option `gcj' assumes that this information is stored in a ! hash table and not in the object itself. ! ! `-fuse-divide-subroutine' ! On some systems, a library routine is called to perform integer ! division. This is required to get exception handling correct when ! dividing by zero. ! !  ! File: gcj.info, Node: Compatibility, Next: Invoking gcjh, Prev: Invoking gcj, Up: Top ! ! Compatibility with the Java Platform ! ************************************ ! ! As we believe it is important that the Java platform not be ! fragmented, `gcj' and `libgcj' try to conform to the relevant Java ! specifications. However, limited manpower and incomplete and unclear ! documentation work against us. So, there are caveats to using `gcj'. ! ! This list of compatibility issues is by no means complete. ! ! * `gcj' implements the JDK 1.1 language. It supports inner classes, ! though these are known to still be buggy. It does not yet support ! the Java 2 `strictfp' keyword (it recognizes the keyword but ! ignores it). ! ! * `libgcj' is largely compatible with the JDK 1.2 libraries. ! However, `libgcj' is missing many packages, most notably ! `java.awt'. There are also individual missing classes and methods. ! We currently do not have a list showing differences between ! `libgcj' and the Java 2 platform. ! ! * Sometimes the `libgcj' implementation of a method or class differs ! from the JDK implementation. This is not always a bug. Still, if ! it affects you, it probably makes sense to report it so that we ! can discuss the appropriate response. ! !  ! File: gcj.info, Node: Invoking gcjh, Next: Invoking jv-scan, Prev: Compatibility, Up: Top ! ! Invoking gcjh ! ************* ! ! The `gcjh' program is used to generate header files from class ! files. It can generate both CNI and JNI header files, as well as stub ! implementation files which can be used as a basis for implementing the ! required native methods. ! ! `-stubs' ! This causes `gcjh' to generate stub files instead of header files. ! By default the stub file will be named after the class, with a ! suffix of `.cc'. In JNI mode, the default output file will have ! the suffix `.c'. ! ! `-jni' ! This tells `gcjh' to generate a JNI header or stub. By default, ! CNI headers are generated. ! ! `-add TEXT' ! Inserts TEXT into the class body. This is ignored in JNI mode. ! ! `-append TEXT' ! Inserts TEXT into the header file after the class declaration. ! This is ignored in JNI mode. ! ! `-friend TEXT' ! Inserts TEXT into the class as a `friend' declaration. This is ! ignored in JNI mode. ! ! `-prepend TEXT' ! Inserts TEXT into the header file before the class declaration. ! This is ignored in JNI mode. ! ! `--classpath=PATH' ! `--CLASSPATH=PATH' ! `-IDIRECTORY' ! `-d DIRECTORY' ! `-o FILE' ! These options are all identical to the corresponding `gcj' options. ! ! `-o FILE' ! Sets the output file name. This cannot be used if there is more ! than one class on the command line. ! ! `-td DIRECTORY' ! Sets the name of the directory to use for temporary files. ! ! `--help' ! Print help about `gcjh' and exit. No further processing is done. ! ! `--version' ! Print version information for `gcjh' and exit. No further ! processing is done. ! ! All remaining options are considered to be names of classes. ! !  ! File: gcj.info, Node: Invoking jv-scan, Next: Invoking jcf-dump, Prev: Invoking gcjh, Up: Top ! ! Invoking jv-scan ! **************** ! ! The `jv-scan' program can be used to print information about a Java ! source file (`.java' file). ! ! `--complexity' ! This prints a complexity measure, related to cyclomatic ! complexity, for each input file. ! ! `--encoding=NAME' ! This works like the corresponding `gcj' option. ! ! `--print-main' ! This prints the name of the class in this file containing a `main' ! method. ! ! `--list-class' ! This lists the names of all classes defined in the input files. ! ! `--list-filename' ! If `--list-class' is given, this option causes `jv-scan' to also ! print the name of the file in which each class was found. ! ! `-o FILE' ! Print output to the named file. ! !  ! File: gcj.info, Node: Invoking jcf-dump, Next: Invoking gij, Prev: Invoking jv-scan, Up: Top ! ! Invoking jcf-dump ! ***************** ! ! This is a class file examiner, similar to `javap'. It will print ! information about a number of classes, which are specifed by class name ! or file name. ! ! `-c' ! Disassemble method bodies. By default method bodies are not ! printed. ! ! `--javap' ! Generate output in `javap' format. The implementation of this ! feature is very incomplete. ! ! `--classpath=PATH' ! `--CLASSPATH=PATH' ! `-IDIRECTORY' ! `-o FILE' ! These options as the same as the corresponding `gcj' options. ! !  ! File: gcj.info, Node: Invoking gij, Next: Resources, Prev: Invoking jcf-dump, Up: Top ! ! Invoking gij ! ************ ! ! `gij' is a Java bytecode interpreter included with `libgcj'. `gij' ! is not available on every platform; porting it requires a small amount ! of assembly programming which has not been done for all the targets ! supported by `gcj'. ! ! The primary argument to `gij' is the name of a class or, with ! `-jar', a jar file. Options before this argument are interpreted by ! `gij'; remaining options are passed to the interpreted program. ! ! If a class name is specified and this class does not have a `main' ! method with the appropriate signature (a `static void' method with a ! `String[]' as its sole argument), then `gij' will print an error and ! exit. ! ! If a jar file is specified then `gij' will use information in it to ! determine which class' `main' method will be invoked. ! ! `gij' will invoke the `main' method with all the remaining ! command-line options. ! ! Note that `gij' is not limited to interpreting code. Because ! `libgcj' includes a class loader which can dynamically load shared ! objects, it is possible to give `gij' the name of a class which has ! been compiled and put into a shared library on the class path. ! ! `-DNAME[=VALUE]' ! This defines a system property named NAME with value VALUE. If ! VALUE is not specified then it defaults to the empty string. ! These system properties are initialized at the program's startup ! and can be retrieved at runtime using the ! `java.lang.System.getProperty' method. ! ! `-ms=NUMBER' ! This sets the initial heap size ! ! `-mx=NUMBER' ! This sets the maximum heap size. ! ! `-jar' ! This indicates that the name passed to `gij' should be interpreted ! as the name of a jar file, not a class. ! !  ! File: gcj.info, Node: Resources, Prev: Invoking gij, Up: Top ! ! Resources ! ********* ! ! While writing `gcj' and `libgcj' we have, of course, relied heavily ! on documentation from Sun Microsystems. In particular we have used The ! Java Language Specification (both first and second editions), the Java ! Class Libraries (volumes one and two), and the Java Virtual Machine ! Specification. In addition we've used the online documentation at ! `http://java.sun.com/'. ! ! The current `gcj' home page is `http://gcc.gnu.org/java/'. ! ! For more information on gcc, see `http://gcc.gnu.org/'. ! ! Some `libgcj' testing is done using the Mauve test suite. This is a ! free software Java class library test suite which is being written ! because the JCK is not free. See `http://sources.redhat.com/mauve/' ! for more information. ! !  Tag Table: ! Node: Top1428 ! Node: Copying2257 ! Node: GNU Free Documentation License21460 ! Node: Invoking gcj41344 ! Node: Input and output files41995 ! Node: Input Options43342 ! Node: Encodings46312 ! Node: Warnings47513 ! Node: Code Generation48544 ! Ref: Code Generation-Footnote-150405 ! Node: Configure-time Options50714 ! Node: Compatibility51878 ! Node: Invoking gcjh53170 ! Node: Invoking jv-scan54915 ! Node: Invoking jcf-dump55724 ! Node: Invoking gij56345 ! Node: Resources58127  End Tag Table --- 43,89 ---- funds for GNU development.  ! Indirect: ! gcj.info-1: 1742 ! gcj.info-2: 49300  Tag Table: ! (Indirect) ! Node: Top1742 ! Node: Copying2826 ! Node: GNU Free Documentation License22029 ! Node: Invoking gcj41913 ! Node: Input and output files42564 ! Node: Input Options43927 ! Node: Encodings47068 ! Node: Warnings48269 ! Node: Code Generation49300 ! Ref: Code Generation-Footnote-152820 ! Node: Configure-time Options53129 ! Node: Compatibility54547 ! Node: Invoking gcjh55839 ! Node: Invoking jv-scan57895 ! Node: Invoking jcf-dump58793 ! Node: Invoking gij59564 ! Node: Invoking jv-convert61446 ! Node: Invoking rmic62516 ! Node: Invoking rmiregistry63891 ! Node: About CNI64302 ! Node: Basic concepts65585 ! Node: Packages68568 ! Node: Primitive types70880 ! Node: Interfaces72528 ! Node: Objects and Classes73437 ! Node: Class Initialization75598 ! Node: Object allocation77832 ! Node: Arrays78807 ! Node: Methods81394 ! Node: Strings84145 ! Node: Mixing with C++85613 ! Node: Exception Handling87496 ! Node: Synchronization89131 ! Node: Invocation91111 ! Node: Reflection95180 ! Node: Resources95632  End Tag Table diff -Nrc3pad gcc-3.0.4/gcc/java/gcj.info-1 gcc-3.1/gcc/java/gcj.info-1 *** gcc-3.0.4/gcc/java/gcj.info-1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/gcj.info-1 Wed May 15 02:45:53 2002 *************** *** 0 **** --- 1,1012 ---- + This is gcj.info, produced by makeinfo version 4.2 from gcj.texi. + + INFO-DIR-SECTION Programming + START-INFO-DIR-ENTRY + * Gcj: (gcj). Ahead-of-time compiler for the Java language + END-INFO-DIR-ENTRY + + INFO-DIR-SECTION Individual utilities + START-INFO-DIR-ENTRY + * gcjh: (gcj)Invoking gcjh. + Generate header files from Java class files + * jv-scan: (gcj)Invoking jv-scan. + Print information about Java source files + * jcf-dump: (gcj)Invoking jcf-dump. + Print information about Java class files + * gij: (gcj)Invoking gij. GNU interpreter for Java bytecode + * jv-convert: (gcj)Invoking jv-convert. + Convert file from one encoding to another + * rmic: (gcj)Invoking rmic. + Generate stubs for Remote Method Invocation. + * rmiregistry: (gcj)Invoking rmiregistry. + The remote object registry. + END-INFO-DIR-ENTRY + + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being "GNU General Public License", the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the section entitled + "GNU Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU + software. Copies published by the Free Software Foundation raise + funds for GNU development. + +  + File: gcj.info, Node: Top, Next: Copying, Up: (dir) + + Introduction + ************ + + This manual describes how to use `gcj', the GNU compiler for the + Java programming language. `gcj' can generate both `.class' files and + object files, and it can read both Java source code and `.class' files. + + * Menu: + + * Copying:: The GNU General Public License + * GNU Free Documentation License:: + How you can share and copy this manual + * Invoking gcj:: Compiler options supported by `gcj' + * Compatibility:: Compatibility between gcj and other tools for Java + * Invoking gcjh:: Generate header files from class files + * Invoking jv-scan:: Print information about source files + * Invoking jcf-dump:: Print information about class files + * Invoking gij:: Interpreting Java bytecodes + * Invoking jv-convert:: Converting from one encoding to another + * Invoking rmic:: Generate stubs for Remote Method Invocation. + * Invoking rmiregistry:: The remote object registry. + * About CNI:: Description of the Cygnus Native Interface + * Resources:: Where to look for more information + +  + File: gcj.info, Node: Copying, Next: GNU Free Documentation License, Prev: Top, Up: Top + + GNU GENERAL PUBLIC LICENSE + ************************** + + Version 2, June 1991 + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + ======== + + The licenses for most software are designed to take away your + freedom to share and change it. By contrast, the GNU General Public + License is intended to guarantee your freedom to share and change free + software--to make sure the software is free for all its users. This + General Public License applies to most of the Free Software + Foundation's software and to any other program whose authors commit to + using it. (Some other Free Software Foundation software is covered by + the GNU Library General Public License instead.) You can apply it to + your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + this service if you wish), that you receive source code or can get it + if you want it, that you can change the software or use pieces of it in + new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether + gratis or for a fee, you must give the recipients all the rights that + you have. You must make sure that they, too, receive or can get the + source code. And you must show them these terms so they know their + rights. + + We protect your rights with two steps: (1) copyright the software, + and (2) offer you this license which gives you legal permission to copy, + distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, we + want its recipients to know that what they have is not the original, so + that any problems introduced by others will not reflect on the original + authors' reputations. + + Finally, any free program is threatened constantly by software + patents. We wish to avoid the danger that redistributors of a free + program will individually obtain patent licenses, in effect making the + program proprietary. To prevent this, we have made it clear that any + patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and + modification follow. + + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", + below, refers to any such program or work, and a "work based on + the Program" means either the Program or any derivative work under + copyright law: that is to say, a work containing the Program or a + portion of it, either verbatim or with modifications and/or + translated into another language. (Hereinafter, translation is + included without limitation in the term "modification".) Each + licensee is addressed as "you". + + Activities other than copying, distribution and modification are + not covered by this License; they are outside its scope. The act + of running the Program is not restricted, and the output from the + Program is covered only if its contents constitute a work based on + the Program (independent of having been made by running the + Program). Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any + warranty; and give any other recipients of the Program a copy of + this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange + for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a. You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b. You must cause any work that you distribute or publish, that + in whole or in part contains or is derived from the Program + or any part thereof, to be licensed as a whole at no charge + to all third parties under the terms of this License. + + c. If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display + an announcement including an appropriate copyright notice and + a notice that there is no warranty (or else, saying that you + provide a warranty) and that users may redistribute the + program under these conditions, and telling the user how to + view a copy of this License. (Exception: if the Program + itself is interactive but does not normally print such an + announcement, your work based on the Program is not required + to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the + Program, and can be reasonably considered independent and separate + works in themselves, then this License, and its terms, do not + apply to those sections when you distribute them as separate + works. But when you distribute the same sections as part of a + whole which is a work based on the Program, the distribution of + the whole must be on the terms of this License, whose permissions + for other licensees extend to the entire whole, and thus to each + and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or + contest your rights to work written entirely by you; rather, the + intent is to exercise the right to control the distribution of + derivative or collective works based on the Program. + + In addition, mere aggregation of another work not based on the + Program with the Program (or with a work based on the Program) on + a volume of a storage or distribution medium does not bring the + other work under the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms + of Sections 1 and 2 above provided that you also do one of the + following: + + a. Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Sections 1 and 2 above on a medium customarily used for + software interchange; or, + + b. Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange; or, + + c. Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with + such an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete + source code means all the source code for all modules it contains, + plus any associated interface definition files, plus the scripts + used to control compilation and installation of the executable. + However, as a special exception, the source code distributed need + not include anything that is normally distributed (in either + source or binary form) with the major components (compiler, + kernel, and so on) of the operating system on which the executable + runs, unless that component itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, + from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify + or distribute the Program or its derivative works. These actions + are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Program (or any work + based on the Program), you indicate your acceptance of this + License to do so, and all its terms and conditions for copying, + distributing or modifying the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program + subject to these terms and conditions. You may not impose any + further restrictions on the recipients' exercise of the rights + granted herein. You are not responsible for enforcing compliance + by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent + issues), conditions are imposed on you (whether by court order, + agreement or otherwise) that contradict the conditions of this + License, they do not excuse you from the conditions of this + License. If you cannot distribute so as to satisfy simultaneously + your obligations under this License and any other pertinent + obligations, then as a consequence you may not distribute the + Program at all. For example, if a patent license would not permit + royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only + way you could satisfy both it and this License would be to refrain + entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable + under any particular circumstance, the balance of the section is + intended to apply and the section as a whole is intended to apply + in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of + any such claims; this section has the sole purpose of protecting + the integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is + willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed + to be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, + the original copyright holder who places the Program under this + License may add an explicit geographical distribution limitation + excluding those countries, so that distribution is permitted only + in or among countries not thus excluded. In such case, this + License incorporates the limitation as if written in the body of + this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies a version number of this License which applies + to it and "any later version", you have the option of following + the terms and conditions either of that version or of any later + version published by the Free Software Foundation. If the Program + does not specify a version number of this License, you may choose + any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted + by the Free Software Foundation, write to the Free Software + Foundation; we sometimes make exceptions for this. Our decision + will be guided by the two goals of preserving the free status of + all derivatives of our free software and of promoting the sharing + and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE + LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE + QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY + SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY + MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE + LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, + INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR + INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU + OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY + OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + ============================================= + + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these + terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + convey the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YEAR NAME OF AUTHOR + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Also add information on how to contact you by electronic and paper + mail. + + If the program is interactive, make it output a short notice like + this when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) YEAR NAME OF AUTHOR + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details + type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the + appropriate parts of the General Public License. Of course, the + commands you use may be called something other than `show w' and `show + c'; they could even be mouse-clicks or menu items--whatever suits your + program. + + You should also get your employer (if you work as a programmer) or + your school, if any, to sign a "copyright disclaimer" for the program, + if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + SIGNATURE OF TY COON, 1 April 1989 + Ty Coon, President of Vice + + This General Public License does not permit incorporating your + program into proprietary programs. If your program is a subroutine + library, you may consider it more useful to permit linking proprietary + applications with the library. If this is what you want to do, use the + GNU Library General Public License instead of this License. + +  + File: gcj.info, Node: GNU Free Documentation License, Next: Invoking gcj, Prev: Copying, Up: Top + + GNU Free Documentation License + ****************************** + + Version 1.1, March 2000 + Copyright (C) 2000 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + written document "free" in the sense of freedom: to assure everyone + the effective freedom to copy and redistribute it, with or without + modifying it, either commercially or noncommercially. Secondarily, + this License preserves for the author and publisher a way to get + credit for their work, while not being considered responsible for + modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. + We recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work that contains a + notice placed by the copyright holder saying it can be distributed + under the terms of this License. The "Document", below, refers to + any such manual or work. Any member of the public is a licensee, + and is addressed as "you". + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter + section of the Document that deals exclusively with the + relationship of the publishers or authors of the Document to the + Document's overall subject (or to related matters) and contains + nothing that could fall directly within that overall subject. + (For example, if the Document is in part a textbook of + mathematics, a Secondary Section may not explain any mathematics.) + The relationship could be a matter of historical connection with + the subject or with related matters, or of legal, commercial, + philosophical, ethical or political position regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in + the notice that says that the Document is released under this + License. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, whose contents can be viewed and edited directly + and straightforwardly with generic text editors or (for images + composed of pixels) generic paint programs or (for drawings) some + widely available drawing editor, and that is suitable for input to + text formatters or for automatic translation to a variety of + formats suitable for input to text formatters. A copy made in an + otherwise Transparent file format whose markup has been designed + to thwart or discourage subsequent modification by readers is not + Transparent. A copy that is not "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and + standard-conforming simple HTML designed for human modification. + Opaque formats include PostScript, PDF, proprietary formats that + can be read and edited only by proprietary word processors, SGML + or XML for which the DTD and/or processing tools are not generally + available, and the machine-generated HTML produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow + the conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies of the Document numbering more than + 100, and the Document's license notice requires Cover Texts, you + must enclose the copies in covers that carry, clearly and legibly, + all these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the + title equally prominent and visible. You may add other material + on the covers in addition. Copying with changes limited to the + covers, as long as they preserve the title of the Document and + satisfy these conditions, can be treated as verbatim copying in + other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a + machine-readable Transparent copy along with each Opaque copy, or + state in or with each Opaque copy a publicly-accessible + computer-network location containing a complete Transparent copy + of the Document, free of added material, which the general + network-using public has access to download anonymously at no + charge using public-standard network protocols. If you use the + latter option, you must take reasonably prudent steps, when you + begin distribution of Opaque copies in quantity, to ensure that + this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you + distribute an Opaque copy (directly or through your agents or + retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of + copies, to give them a chance to provide you with an updated + version of the Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with + the Modified Version filling the role of the Document, thus + licensing distribution and modification of the Modified Version to + whoever possesses a copy of it. In addition, you must do these + things in the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of + previous versions (which should, if there were any, be listed + in the History section of the Document). You may use the + same title as a previous version if the original publisher of + that version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has less than five). + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section entitled "History", and its title, and + add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on + the Title Page. If there is no section entitled "History" in + the Document, create one stating the title, year, authors, + and publisher of the Document as given on its Title Page, + then add an item describing the Modified Version as stated in + the previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in + the "History" section. You may omit a network location for a + work that was published at least four years before the + Document itself, or if the original publisher of the version + it refers to gives permission. + + K. In any section entitled "Acknowledgments" or "Dedications", + preserve the section's title, and preserve in the section all + the substance and tone of each of the contributor + acknowledgments and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section + titles. + + M. Delete any section entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section as "Endorsements" or to + conflict in title with any Invariant Section. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option + designate some or all of these sections as invariant. To do this, + add their titles to the list of Invariant Sections in the Modified + Version's license notice. These titles must be distinct from any + other section titles. + + You may add a section entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end + of the list of Cover Texts in the Modified Version. Only one + passage of Front-Cover Text and one of Back-Cover Text may be + added by (or through arrangements made by) any one entity. If the + Document already includes a cover text for the same cover, + previously added by you or by arrangement made by the same entity + you are acting on behalf of, you may not add another; but you may + replace the old one, on explicit permission from the previous + publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination + all of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections entitled + "History" in the various original documents, forming one section + entitled "History"; likewise combine any sections entitled + "Acknowledgments", and any sections entitled "Dedications". You + must delete all sections entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the + documents in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow + this License in all other respects regarding verbatim copying of + that document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, does not as a whole count as a + Modified Version of the Document, provided no compilation + copyright is claimed for the compilation. Such a compilation is + called an "aggregate", and this License does not apply to the + other self-contained works thus compiled with the Document, on + account of their being thus compiled, if they are not themselves + derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one + quarter of the entire aggregate, the Document's Cover Texts may be + placed on covers that surround only the Document within the + aggregate. Otherwise they must appear on covers around the whole + aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License provided that you also include the + original English version of this License. In case of a + disagreement between the translation and the original English + version of this License, the original English version will prevail. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided for under this License. Any other + attempt to copy, modify, sublicense or distribute the Document is + void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, + from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + `http://www.gnu.org/copyleft/'. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If + the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. + + ADDENDUM: How to use this License for your documents + ==================================================== + + To use this License in a document you have written, include a copy of + the License in the document and put the following copyright and license + notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 + or any later version published by the Free Software Foundation; + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have no Invariant Sections, write "with no Invariant Sections" + instead of saying which ones are invariant. If you have no Front-Cover + Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being + LIST"; likewise for Back-Cover Texts. + + If your document contains nontrivial examples of program code, we + recommend releasing these examples in parallel under your choice of + free software license, such as the GNU General Public License, to + permit their use in free software. + +  + File: gcj.info, Node: Invoking gcj, Next: Compatibility, Prev: GNU Free Documentation License, Up: Top + + Invoking gcj + ************ + + As `gcj' is just another front end to `gcc', it supports many of the + same options as gcc. *Note Option Summary: (gcc)Option Summary. This + manual only documents the options specific to `gcj'. + + * Menu: + + * Input and output files:: + * Input Options:: How gcj finds files + * Encodings:: Options controlling source file encoding + * Warnings:: Options controlling warnings specific to gcj + * Code Generation:: Options controlling the output of gcj + * Configure-time Options:: Options you won't use + +  + File: gcj.info, Node: Input and output files, Next: Input Options, Up: Invoking gcj + + Input and output files + ====================== + + A `gcj' command is like a `gcc' command, in that it consists of a + number of options and file names. The following kinds of input file + names are supported: + + `FILE.java' + Java source files. + + `FILE.class' + Java bytecode files. + + `FILE.zip' + `FILE.jar' + An archive containing one or more `.class' files, all of which are + compiled. The archive may be compressed. + + `@FILE' + A file containing a whitespace-separated list of input file names. + (Currently, these must all be `.java' source files, but that may + change.) Each named file is compiled, just as if it had been on + the command line. + + `LIBRARY.a' + `LIBRARY.so' + `-lLIBNAME' + Libraries to use when linking. See the `gcc' manual. + + You can specify more than one input file on the `gcj' command line, + in which case they will all be compiled. If you specify a `-o FILENAME' + option, all the input files will be compiled together, producing a + single output file, named FILENAME. This is allowed even when using + `-S' or `-c', but not when using `-C' or `--resource'. (This is an + extension beyond the what plain `gcc' allows.) (If more than one input + file is specified, all must currently be `.java' files, though we hope + to fix this.) + +  + File: gcj.info, Node: Input Options, Next: Encodings, Prev: Input and output files, Up: Invoking gcj + + Input Options + ============= + + `gcj' has options to control where it looks to find files it needs. + For instance, `gcj' might need to load a class that is referenced by + the file it has been asked to compile. Like other compilers for the + Java language, `gcj' has a notion of a "class path". There are several + options and environment variables which can be used to manipulate the + class path. When `gcj' looks for a given class, it searches the class + path looking for matching `.class' or `.java' file. `gcj' comes with a + built-in class path which points at the installed `libgcj.jar', a file + which contains all the standard classes. + + In the below, a directory or path component can refer either to an + actual directory on the filesystem, or to a `.zip' or `.jar' file, + which `gcj' will search as if it is a directory. + + `-IDIR' + All directories specified by `-I' are kept in order and prepended + to the class path constructed from all the other options. Unless + compatibility with tools like `javac' is imported, we recommend + always using `-I' instead of the other options for manipulating the + class path. + + `--classpath=PATH' + This sets the class path to PATH, a colon-separated list of paths + (on Windows-based systems, a semicolon-separate list of paths). + This does not override the builtin ("boot") search path. + + `--CLASSPATH=PATH' + Deprecated synonym for `--classpath'. + + `--bootclasspath=PATH' + Where to find the standard builtin classes, such as + `java.lang.String'. + + `--extdirs=PATH' + For each directory in the PATH, place the contents of that + directory at the end of the class path. + + `CLASSPATH' + This is an environment variable which holds a list of paths. + + The final class path is constructed like so: + + * First come all directories specified via `-I'. + + * If `--classpath' is specified, its value is appended. Otherwise, + if the `CLASSPATH' environment variable is specified, then its + value is appended. Otherwise, the current directory (`"."') is + appended. + + * If `--bootclasspath' was specified, append its value. Otherwise, + append the built-in system directory, `libgcj.jar'. + + * Finaly, if `--extdirs' was specified, append the contents of the + specified directories at the end of the class path. Otherwise, + append the contents of the built-in extdirs at + `$(prefix)/share/java/ext'. + + The classfile built by `gcj' for the class `java.lang.Object' (and + placed in `libgcj.jar') contains a special zero length attribute + `gnu.gcj.gcj-compiled'. The compiler looks for this attribute when + loading `java.lang.Object' and will report an error if it isn't found, + unless it compiles to bytecode (the option + `-fforce-classes-archive-check' can be used to override this behavior + in this particular case.) + + `-fforce-classes-archive-check' + This forces the compiler to always check for the special zero + length attribute `gnu.gcj.gcj-compiled' in `java.lang.Object' and + issue an error if it isn't found. + +  + File: gcj.info, Node: Encodings, Next: Warnings, Prev: Input Options, Up: Invoking gcj + + Encodings + ========= + + The Java programming language uses Unicode throughout. In an effort + to integrate well with other locales, `gcj' allows `.java' files to be + written using almost any encoding. `gcj' knows how to convert these + encodings into its internal encoding at compile time. + + You can use the `--encoding=NAME' option to specify an encoding (of + a particular character set) to use for source files. If this is not + specified, the default encoding comes from your current locale. If + your host system has insufficient locale support, then `gcj' assumes + the default encoding to be the `UTF-8' encoding of Unicode. + + To implement `--encoding', `gcj' simply uses the host platform's + `iconv' conversion routine. This means that in practice `gcj' is + limited by the capabilities of the host platform. + + The names allowed for the argument `--encoding' vary from platform + to platform (since they are not standardized anywhere). However, `gcj' + implements the encoding named `UTF-8' internally, so if you choose to + use this for your source files you can be assured that it will work on + every host. + +  + File: gcj.info, Node: Warnings, Next: Code Generation, Prev: Encodings, Up: Invoking gcj + + Warnings + ======== + + `gcj' implements several warnings. As with other generic `gcc' + warnings, if an option of the form `-Wfoo' enables a warning, then + `-Wno-foo' will disable it. Here we've chosen to document the form of + the warning which will have an effect - the default being the opposite + of what is listed. + + `-Wredundant-modifiers' + With this flag, `gcj' will warn about redundant modifiers. For + instance, it will warn if an interface method is declared `public'. + + `-Wextraneous-semicolon' + This causes `gcj' to warn about empty statements. Empty statements + have been deprecated. + + `-Wno-out-of-date' + This option will cause `gcj' not to warn when a source file is + newer than its matching class file. By default `gcj' will warn + about this. + + `-Wunused' + This is the same as `gcc''s `-Wunused'. + + `-Wall' + This is the same as `-Wredundant-modifiers -Wextraneous-semicolon + -Wunused'. + diff -Nrc3pad gcc-3.0.4/gcc/java/gcj.info-2 gcc-3.1/gcc/java/gcj.info-2 *** gcc-3.0.4/gcc/java/gcj.info-2 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/gcj.info-2 Wed May 15 02:45:53 2002 *************** *** 0 **** --- 1,1416 ---- + This is gcj.info, produced by makeinfo version 4.2 from gcj.texi. + + INFO-DIR-SECTION Programming + START-INFO-DIR-ENTRY + * Gcj: (gcj). Ahead-of-time compiler for the Java language + END-INFO-DIR-ENTRY + + INFO-DIR-SECTION Individual utilities + START-INFO-DIR-ENTRY + * gcjh: (gcj)Invoking gcjh. + Generate header files from Java class files + * jv-scan: (gcj)Invoking jv-scan. + Print information about Java source files + * jcf-dump: (gcj)Invoking jcf-dump. + Print information about Java class files + * gij: (gcj)Invoking gij. GNU interpreter for Java bytecode + * jv-convert: (gcj)Invoking jv-convert. + Convert file from one encoding to another + * rmic: (gcj)Invoking rmic. + Generate stubs for Remote Method Invocation. + * rmiregistry: (gcj)Invoking rmiregistry. + The remote object registry. + END-INFO-DIR-ENTRY + + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being "GNU General Public License", the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the section entitled + "GNU Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU + software. Copies published by the Free Software Foundation raise + funds for GNU development. + +  + File: gcj.info, Node: Code Generation, Next: Configure-time Options, Prev: Warnings, Up: Invoking gcj + + Code Generation + =============== + + In addition to the many `gcc' options controlling code generation, + `gcj' has several options specific to itself. + + `--main=CLASSNAME' + This option is used when linking to specify the name of the class + whose `main' method should be invoked when the resulting + executable is run. (1) + + `-DNAME[=VALUE]' + This option can only be used with `--main'. It defines a system + property named NAME with value VALUE. If VALUE is not specified + then it defaults to the empty string. These system properties are + initialized at the program's startup and can be retrieved at + runtime using the `java.lang.System.getProperty' method. + + `-C' + This option is used to tell `gcj' to generate bytecode (`.class' + files) rather than object code. + + `--resource RESOURCE-NAME' + This option is used to tell `gcj' to compile the contents of a + given file to object code so it may be accessed at runtime with + the core protocol handler as `core:/RESOURCE-NAME'. Note that + RESOURCE-NAME is the name of the resource as found at runtime; for + instance, it could be used in a call to `ResourceBundle.getBundle'. + The actual file name to be compiled this way must be specified + separately. + + `-d DIRECTORY' + When used with `-C', this causes all generated `.class' files to + be put in the appropriate subdirectory of DIRECTORY. By default + they will be put in subdirectories of the current working + directory. + + `-fno-bounds-check' + By default, `gcj' generates code which checks the bounds of all + array indexing operations. With this option, these checks are + omitted, which can improve performance for code that uses arrays + extensively. Note that this can result in unpredictable behavior + if the code in question actually does violate array bounds + constraints. It is safe to use this option if you are sure that + your code will never throw an `ArrayIndexOutOfBoundsException'. + + `-fno-store-check' + Don't generate array store checks. When storing objects into + arrays, a runtime check is normally generated in order to ensure + that the object is assignment compatible with the component type + of the array (which may not be known at compile-time). With this + option, these checks are omitted. This can improve performance + for code which stores objects into arrays frequently. It is safe + to use this option if you are sure your code will never throw an + `ArrayStoreException'. + + `-fjni' + With `gcj' there are two options for writing native methods: CNI + and JNI. By default `gcj' assumes you are using CNI. If you are + compiling a class with native methods, and these methods are + implemented using JNI, then you must use `-fjni'. This option + causes `gcj' to generate stubs which will invoke the underlying JNI + methods. + + `-fno-optimize-static-class-initialization' + When the optimization level is greather or equal to `-O2', `gcj' + will try to optimize the way calls into the runtime are made to + initialize static classes upon their first use (this optimization + isn't carried out if `-C' was specified.) When compiling to native + code, `-fno-optimize-static-class-initialization' will turn this + optimization off, regardless of the optimization level in use. + + ---------- Footnotes ---------- + + (1) The linker by default looks for a global function named `main'. + Since Java does not have global functions, and a collection of Java + classes may have more than one class with a `main' method, you need to + let the linker know which of those `main' methods it should invoke when + starting the application. + +  + File: gcj.info, Node: Configure-time Options, Prev: Code Generation, Up: Invoking gcj + + Configure-time Options + ====================== + + Some `gcj' code generations options affect the resulting ABI, and so + can only be meaningfully given when `libgcj', the runtime package, is + configured. `libgcj' puts the appropriate options from this group into + a `spec' file which is read by `gcj'. These options are listed here + for completeness; if you are using `libgcj' then you won't want to + touch these options. + + `-fuse-boehm-gc' + This enables the use of the Boehm GC bitmap marking code. In + particular this causes `gcj' to put an object marking descriptor + into each vtable. + + `-fhash-synchronization' + By default, synchronization data (the data used for `synchronize', + `wait', and `notify') is pointed to by a word in each object. + With this option `gcj' assumes that this information is stored in a + hash table and not in the object itself. + + `-fuse-divide-subroutine' + On some systems, a library routine is called to perform integer + division. This is required to get exception handling correct when + dividing by zero. + + `-fcheck-references' + On some systems it's necessary to insert inline checks whenever + accessing an object via a reference. On other systems you won't + need this because null pointer accesses are caught automatically + by the processor. + +  + File: gcj.info, Node: Compatibility, Next: Invoking gcjh, Prev: Invoking gcj, Up: Top + + Compatibility with the Java Platform + ************************************ + + As we believe it is important that the Java platform not be + fragmented, `gcj' and `libgcj' try to conform to the relevant Java + specifications. However, limited manpower and incomplete and unclear + documentation work against us. So, there are caveats to using `gcj'. + + This list of compatibility issues is by no means complete. + + * `gcj' implements the JDK 1.1 language. It supports inner classes, + though these are known to still be buggy. It does not yet support + the Java 2 `strictfp' keyword (it recognizes the keyword but + ignores it). + + * `libgcj' is largely compatible with the JDK 1.2 libraries. + However, `libgcj' is missing many packages, most notably + `java.awt'. There are also individual missing classes and methods. + We currently do not have a list showing differences between + `libgcj' and the Java 2 platform. + + * Sometimes the `libgcj' implementation of a method or class differs + from the JDK implementation. This is not always a bug. Still, if + it affects you, it probably makes sense to report it so that we + can discuss the appropriate response. + +  + File: gcj.info, Node: Invoking gcjh, Next: Invoking jv-scan, Prev: Compatibility, Up: Top + + Invoking gcjh + ************* + + The `gcjh' program is used to generate header files from class + files. It can generate both CNI and JNI header files, as well as stub + implementation files which can be used as a basis for implementing the + required native methods. + + `-stubs' + This causes `gcjh' to generate stub files instead of header files. + By default the stub file will be named after the class, with a + suffix of `.cc'. In JNI mode, the default output file will have + the suffix `.c'. + + `-jni' + This tells `gcjh' to generate a JNI header or stub. By default, + CNI headers are generated. + + `-add TEXT' + Inserts TEXT into the class body. This is ignored in JNI mode. + + `-append TEXT' + Inserts TEXT into the header file after the class declaration. + This is ignored in JNI mode. + + `-friend TEXT' + Inserts TEXT into the class as a `friend' declaration. This is + ignored in JNI mode. + + `-prepend TEXT' + Inserts TEXT into the header file before the class declaration. + This is ignored in JNI mode. + + `--classpath=PATH' + `--CLASSPATH=PATH' + `-IDIRECTORY' + `-d DIRECTORY' + `-o FILE' + These options are all identical to the corresponding `gcj' options. + + `-o FILE' + Sets the output file name. This cannot be used if there is more + than one class on the command line. + + `-td DIRECTORY' + Sets the name of the directory to use for temporary files. + + `-M' + Print all dependencies to stdout; suppress ordinary output. + + `-MM' + Print non-system dependencies to stdout; suppress ordinary output. + + `-MD' + Print all dependencies to stdout. + + `-MMD' + Print non-system dependencies to stdout. + + `--help' + Print help about `gcjh' and exit. No further processing is done. + + `--version' + Print version information for `gcjh' and exit. No further + processing is done. + + `-v, --verbose' + Print extra information while running. + + All remaining options are considered to be names of classes. + +  + File: gcj.info, Node: Invoking jv-scan, Next: Invoking jcf-dump, Prev: Invoking gcjh, Up: Top + + Invoking jv-scan + **************** + + The `jv-scan' program can be used to print information about a Java + source file (`.java' file). + + `--complexity' + This prints a complexity measure, related to cyclomatic + complexity, for each input file. + + `--encoding=NAME' + This works like the corresponding `gcj' option. + + `--print-main' + This prints the name of the class in this file containing a `main' + method. + + `--list-class' + This lists the names of all classes defined in the input files. + + `--list-filename' + If `--list-class' is given, this option causes `jv-scan' to also + print the name of the file in which each class was found. + + `-o FILE' + Print output to the named file. + + `--help' + Print help, then exit. + + `--version' + Print version number, then exit. + +  + File: gcj.info, Node: Invoking jcf-dump, Next: Invoking gij, Prev: Invoking jv-scan, Up: Top + + Invoking jcf-dump + ***************** + + This is a class file examiner, similar to `javap'. It will print + information about a number of classes, which are specifed by class name + or file name. + + `-c' + Disassemble method bodies. By default method bodies are not + printed. + + `--javap' + Generate output in `javap' format. The implementation of this + feature is very incomplete. + + `--classpath=PATH' + `--CLASSPATH=PATH' + `-IDIRECTORY' + `-o FILE' + These options as the same as the corresponding `gcj' options. + + `--help' + Print help, then exit. + + `--version' + Print version number, then exit. + + `-v, --verbose' + Print extra information while running. + +  + File: gcj.info, Node: Invoking gij, Next: Invoking jv-convert, Prev: Invoking jcf-dump, Up: Top + + Invoking gij + ************ + + `gij' is a Java bytecode interpreter included with `libgcj'. `gij' + is not available on every platform; porting it requires a small amount + of assembly programming which has not been done for all the targets + supported by `gcj'. + + The primary argument to `gij' is the name of a class or, with + `-jar', a jar file. Options before this argument are interpreted by + `gij'; remaining options are passed to the interpreted program. + + If a class name is specified and this class does not have a `main' + method with the appropriate signature (a `static void' method with a + `String[]' as its sole argument), then `gij' will print an error and + exit. + + If a jar file is specified then `gij' will use information in it to + determine which class' `main' method will be invoked. + + `gij' will invoke the `main' method with all the remaining + command-line options. + + Note that `gij' is not limited to interpreting code. Because + `libgcj' includes a class loader which can dynamically load shared + objects, it is possible to give `gij' the name of a class which has + been compiled and put into a shared library on the class path. + + `-DNAME[=VALUE]' + This defines a system property named NAME with value VALUE. If + VALUE is not specified then it defaults to the empty string. + These system properties are initialized at the program's startup + and can be retrieved at runtime using the + `java.lang.System.getProperty' method. + + `-ms=NUMBER' + This sets the initial heap size. + + `-mx=NUMBER' + This sets the maximum heap size. + + `-jar' + This indicates that the name passed to `gij' should be interpreted + as the name of a jar file, not a class. + + `--help' + Print help, then exit. + + `--version' + Print version number, then exit. + +  + File: gcj.info, Node: Invoking jv-convert, Next: Invoking rmic, Prev: Invoking gij, Up: Top + + Invoking jv-convert + ******************* + + `jv-convert' [`OPTION'] ... [INPUTFILE [OUTPUTFILE]] + + `jv-convert' is a utility included with `libgcj' which converts a + file from one encoding to another. It is similar to the Unix `iconv' + utility. + + The encodings supported by `jv-convert' are platform-dependent. + Currently there is no way to get a list of all supported encodings. + + `--encoding NAME' + `--from NAME' + Use NAME as the input encoding. The default is the current + locale's encoding. + + `--to NAME' + Use NAME as the output encoding. The default is the `JavaSrc' + encoding; this is ASCII with `\u' escapes for non-ASCII characters. + + `-i FILE' + Read from FILE. The default is to read from standard input. + + `-o FILE' + Write to FILE. The default is to write to standard output. + + `--reverse' + Swap the input and output encodings. + + `--help' + Print a help message, then exit. + + `--version' + Print version information, then exit. + +  + File: gcj.info, Node: Invoking rmic, Next: Invoking rmiregistry, Prev: Invoking jv-convert, Up: Top + + Invoking rmic + ************* + + `rmic' [`OPTION'] ... CLASS ... + + `rmic' is a utility included with `libgcj' which generates stubs for + remote objects. + + Note that this program isn't yet fully compatible with the JDK + `rmic'. Some options, such as `-classpath', are recognized but + currently ignored. We have left these options undocumented for now. + + Long options can also be given with a GNU-style leading `--'. For + instance, `--help' is accepted. + + `-keep' + `-keepgenerated' + By default, `rmic' deletes intermediate files. Either of these + options causes it not to delete such files. + + `-v1.1' + Cause `rmic' to create stubs and skeletons for the 1.1 protocol + version. + + `-vcompat' + Cause `rmic' to create stubs and skeletons compatible with both + the 1.1 and 1.2 protocol versions. This is the default. + + `-v1.2' + Cause `rmic' to create stubs and skeletons for the 1.2 protocol + version. + + `-nocompile' + Don't compile the generated files. + + `-verbose' + Print information about what `rmic' is doing. + + `-d DIRECTORY' + Put output files in DIRECTORY. By default the files are put in + the current working directory. + + `-help' + Print a help message, then exit. + + `-version' + Print version information, then exit. + +  + File: gcj.info, Node: Invoking rmiregistry, Next: About CNI, Prev: Invoking rmic, Up: Top + + Invoking rmiregistry + ******************** + + `rmiregistry' [`OPTION'] ... [PORT] + + `rmiregistry' starts a remote object registry on the current host. + If no port number is specified, then port 1099 is used. + + `--help' + Print a help message, then exit. + + `--version' + Print version information, then exit. + +  + File: gcj.info, Node: About CNI, Next: Resources, Prev: Invoking rmiregistry, Up: Top + + About CNI + ********* + + This documents CNI, the Cygnus Native Interface, which is is a + convenient way to write Java native methods using C++. This is a more + efficient, more convenient, but less portable alternative to the + standard JNI (Java Native Interface). + + * Menu: + + * Basic concepts:: Introduction to using CNI. + * Packages:: How packages are mapped to C++. + * Primitive types:: Handling Java types in C++. + * Interfaces:: How Java interfaces map to C++. + * Objects and Classes:: C++ and Java classes. + * Class Initialization:: How objects are initialized. + * Object allocation:: How to create Java objects in C++. + * Arrays:: Dealing with Java arrays in C++. + * Methods:: Java methods in C++. + * Strings:: Information about Java Strings. + * Mixing with C++:: How CNI can interoperate with C++. + * Exception Handling:: How exceptions are handled. + * Synchronization:: Synchronizing between Java and C++. + * Invocation:: Starting the Java runtime from C++. + * Reflection:: Using reflection from C++. + +  + File: gcj.info, Node: Basic concepts, Next: Packages, Up: About CNI + + Basic concepts + ============== + + In terms of languages features, Java is mostly a subset of C++. + Java has a few important extensions, plus a powerful standard class + library, but on the whole that does not change the basic similarity. + Java is a hybrid object-oriented language, with a few native types, in + addition to class types. It is class-based, where a class may have + static as well as per-object fields, and static as well as instance + methods. Non-static methods may be virtual, and may be overloaded. + Overloading is resolved at compile time by matching the actual argument + types against the parameter types. Virtual methods are implemented + using indirect calls through a dispatch table (virtual function table). + Objects are allocated on the heap, and initialized using a constructor + method. Classes are organized in a package hierarchy. + + All of the listed attributes are also true of C++, though C++ has + extra features (for example in C++ objects may be allocated not just on + the heap, but also statically or in a local stack frame). Because + `gcj' uses the same compiler technology as G++ (the GNU C++ compiler), + it is possible to make the intersection of the two languages use the + same ABI (object representation and calling conventions). The key idea + in CNI is that Java objects are C++ objects, and all Java classes are + C++ classes (but not the other way around). So the most important task + in integrating Java and C++ is to remove gratuitous incompatibilities. + + You write CNI code as a regular C++ source file. (You do have to use + a Java/CNI-aware C++ compiler, specifically a recent version of G++.) + + A CNI C++ source file must have: + + #include + + and then must include one header file for each Java class it uses, e.g.: + + #include + #include + #include + + These header files are automatically generated by `gcjh'. + + CNI provides some functions and macros to make using Java objects and + primitive types from C++ easier. In general, these CNI functions and + macros start with the `Jv' prefix, for example the function + `JvNewObjectArray'. This convention is used to avoid conflicts with + other libraries. Internal functions in CNI start with the prefix + `_Jv_'. You should not call these; if you find a need to, let us know + and we will try to come up with an alternate solution. (This manual + lists `_Jv_AllocBytes' as an example; CNI should instead provide a + `JvAllocBytes' function.) + + Limitations + ----------- + + Whilst a Java class is just a C++ class that doesn't mean that you + are freed from the shackles of Java, a CNI C++ class must adhere to the + rules of the Java programming language. + + For example: it is not possible to declare a method in a CNI class + that will take a C string (`char*') as an argument, or to declare a + member variable of some non-Java datatype. + +  + File: gcj.info, Node: Packages, Next: Primitive types, Prev: Basic concepts, Up: About CNI + + Packages + ======== + + The only global names in Java are class names, and packages. A + "package" can contain zero or more classes, and also zero or more + sub-packages. Every class belongs to either an unnamed package or a + package that has a hierarchical and globally unique name. + + A Java package is mapped to a C++ "namespace". The Java class + `java.lang.String' is in the package `java.lang', which is a + sub-package of `java'. The C++ equivalent is the class + `java::lang::String', which is in the namespace `java::lang' which is + in the namespace `java'. + + Here is how you could express this: + + (// Declare the class(es), possibly in a header file: + namespace java { + namespace lang { + class Object; + class String; + ... + } + } + + class java::lang::String : public java::lang::Object + { + ... + }; + + The `gcjh' tool automatically generates the nessary namespace + declarations. + + Leaving out package names + ------------------------- + + Always using the fully-qualified name of a java class can be + tiresomely verbose. Using the full qualified name also ties the code + to a single package making code changes necessary should the class move + from one package to another. The Java `package' declaration specifies + that the following class declarations are in the named package, without + having to explicitly name the full package qualifiers. The `package' + declaration can be followed by zero or more `import' declarations, which + allows either a single class or all the classes in a package to be + named by a simple identifier. C++ provides something similar with the + `using' declaration and directive. + + In Java: + + import PACKAGE-NAME.CLASS-NAME; + + allows the program text to refer to CLASS-NAME as a shorthand for the + fully qualified name: `PACKAGE-NAME.CLASS-NAME'. + + To achieve the same effect C++, you have to do this: + + using PACKAGE-NAME::CLASS-NAME; + + Java can also cause imports on demand, like this: + + import PACKAGE-NAME.*; + + Doing this allows any class from the package PACKAGE-NAME to be refered + to only by its class-name within the program text. + + The same effect can be achieved in C++ like this: + + using namespace PACKAGE-NAME; + +  + File: gcj.info, Node: Primitive types, Next: Interfaces, Prev: Packages, Up: About CNI + + Primitive types + =============== + + Java provides 8 "primitives" types which represent integers, floats, + characters and booleans (and also the void type). C++ has its own very + similar concrete types. Such types in C++ however are not always + implemented in the same way (an int might be 16, 32 or 64 bits for + example) so CNI provides a special C++ type for each primitive Java + type: + + *Java type* *C/C++ typename* *Description* + `char' `jchar' 16 bit Unicode character + `boolean' `jboolean' logical (true or false) values + `byte' `jbyte' 8-bit signed integer + `short' `jshort' 16 bit signed integer + `int' `jint' 32 bit signed integer + `long' `jlong' 64 bit signed integer + `float' `jfloat' 32 bit IEEE floating point number + `double' `jdouble' 64 bit IEEE floating point number + `void' `void' no value + + When refering to a Java type You should always use these C++ + typenames (e.g.: `jint') to avoid disappointment. + + Reference types associated with primitive types + ----------------------------------------------- + + In Java each primitive type has an associated reference type, e.g.: + `boolean' has an associated `java.lang.Boolean' class. In order to + make working with such classes easier GCJ provides the macro + `JvPrimClass': + + - macro: JvPrimClass type + Return a pointer to the `Class' object corresponding to the type + supplied. + + JvPrimClass(void) => java.lang.Void.TYPE + + +  + File: gcj.info, Node: Interfaces, Next: Objects and Classes, Prev: Primitive types, Up: About CNI + + Interfaces + ========== + + A Java class can "implement" zero or more "interfaces", in addition + to inheriting from a single base class. + + CNI allows CNI code to implement methods of interfaces. You can + also call methods through interface references, with some limitations. + + CNI doesn't understand interface inheritance at all yet. So, you + can only call an interface method when the declared type of the field + being called matches the interface which declares that method. The + workaround is to cast the interface reference to the right + superinterface. + + For example if you have: + + interface A + { + void a(); + } + + interface B extends A + { + void b(); + } + + and declare a variable of type `B' in C++, you can't call `a()' + unless you cast it to an `A' first. + +  + File: gcj.info, Node: Objects and Classes, Next: Class Initialization, Prev: Interfaces, Up: About CNI + + Objects and Classes + =================== + + Classes + ------- + + All Java classes are derived from `java.lang.Object'. C++ does not + have a unique root class, but we use the C++ class `java::lang::Object' + as the C++ version of the `java.lang.Object' Java class. All other + Java classes are mapped into corresponding C++ classes derived from + `java::lang::Object'. + + Interface inheritance (the `implements' keyword) is currently not + reflected in the C++ mapping. + + Object fields + ------------- + + Each object contains an object header, followed by the instance + fields of the class, in order. The object header consists of a single + pointer to a dispatch or virtual function table. (There may be extra + fields _in front of_ the object, for example for memory management, but + this is invisible to the application, and the reference to the object + points to the dispatch table pointer.) + + The fields are laid out in the same order, alignment, and size as in + C++. Specifically, 8-bite and 16-bit native types (`byte', `short', + `char', and `boolean') are _not_ widened to 32 bits. Note that the + Java VM does extend 8-bit and 16-bit types to 32 bits when on the VM + stack or temporary registers. + + If you include the `gcjh'-generated header for a class, you can + access fields of Java classes in the _natural_ way. For example, given + the following Java class: + + public class Int + { + public int i; + public Integer (int i) { this.i = i; } + public static zero = new Integer(0); + } + + you can write: + + #include ; + #include ; + + Int* + mult (Int *p, jint k) + { + if (k == 0) + return Int::zero; // Static member access. + return new Int(p->i * k); + } + + Access specifiers + ----------------- + + CNI does not strictly enforce the Java access specifiers, because + Java permissions cannot be directly mapped into C++ permission. + Private Java fields and methods are mapped to private C++ fields and + methods, but other fields and methods are mapped to public fields and + methods. + +  + File: gcj.info, Node: Class Initialization, Next: Object allocation, Prev: Objects and Classes, Up: About CNI + + Class Initialization + ==================== + + Java requires that each class be automatically initialized at the + time of the first active use. Initializing a class involves + initializing the static fields, running code in class initializer + methods, and initializing base classes. There may also be some + implementation specific actions, such as allocating `String' objects + corresponding to string literals in the code. + + The GCJ compiler inserts calls to `JvInitClass' at appropriate + places to ensure that a class is initialized when required. The C++ + compiler does not insert these calls automatically--it is the + programmer's responsibility to make sure classes are initialized. + However, this is fairly painless because of the conventions assumed by + the Java system. + + First, `libgcj' will make sure a class is initialized before an + instance of that object is created. This is one of the + responsibilities of the `new' operation. This is taken care of both in + Java code, and in C++ code. (When the G++ compiler sees a `new' of a + Java class, it will call a routine in `libgcj' to allocate the object, + and that routine will take care of initializing the class.) It follows + that you can access an instance field, or call an instance (non-static) + method and be safe in the knowledge that the class and all of its base + classes have been initialized. + + Invoking a static method is also safe. This is because the Java + compiler adds code to the start of a static method to make sure the + class is initialized. However, the C++ compiler does not add this + extra code. Hence, if you write a native static method using CNI, you + are responsible for calling `JvInitClass' before doing anything else in + the method (unless you are sure it is safe to leave it out). + + Accessing a static field also requires the class of the field to be + initialized. The Java compiler will generate code to call + `Jv_InitClass' before getting or setting the field. However, the C++ + compiler will not generate this extra code, so it is your + responsibility to make sure the class is initialized before you access + a static field from C++. + +  + File: gcj.info, Node: Object allocation, Next: Arrays, Prev: Class Initialization, Up: About CNI + + Object allocation + ================= + + New Java objects are allocated using a "class instance creation + expression", e.g.: + + new TYPE ( ... ) + + The same syntax is used in C++. The main difference is that C++ + objects have to be explicitly deleted; in Java they are automatically + deleted by the garbage collector. Using CNI, you can allocate a new + Java object using standard C++ syntax and the C++ compiler will allocate + memory from the garbage collector. If you have overloaded + constructors, the compiler will choose the correct one using standard + C++ overload resolution rules. + + For example: + + java::util::Hashtable *ht = new java::util::Hashtable(120); + + - Function: void* _Jv_AllocBytes (jsize SIZE) + Allocates SIZE bytes from the heap. The memory is not scanned by + the garbage collector but it freed if no references to it are + discovered. + +  + File: gcj.info, Node: Arrays, Next: Methods, Prev: Object allocation, Up: About CNI + + Arrays + ====== + + While in many ways Java is similar to C and C++, it is quite + different in its treatment of arrays. C arrays are based on the idea + of pointer arithmetic, which would be incompatible with Java's security + requirements. Java arrays are true objects (array types inherit from + `java.lang.Object'). An array-valued variable is one that contains a + reference (pointer) to an array object. + + Referencing a Java array in C++ code is done using the `JArray' + template, which as defined as follows: + + class __JArray : public java::lang::Object + { + public: + int length; + }; + + template + class JArray : public __JArray + { + T data[0]; + public: + T& operator[](jint i) { return data[i]; } + }; + + There are a number of `typedef's which correspond to `typedef's from + the JNI. Each is the type of an array holding objects of the relevant + type: + + typedef __JArray *jarray; + typedef JArray *jobjectArray; + typedef JArray *jbooleanArray; + typedef JArray *jbyteArray; + typedef JArray *jcharArray; + typedef JArray *jshortArray; + typedef JArray *jintArray; + typedef JArray *jlongArray; + typedef JArray *jfloatArray; + typedef JArray *jdoubleArray; + + - Method on template: T* elements (JArray ARRAY) + This template function can be used to get a pointer to the + elements of the `array'. For instance, you can fetch a pointer to + the integers that make up an `int[]' like so: + + extern jintArray foo; + jint *intp = elements (foo); + + The name of this function may change in the future. + + - Function: jobjectArray JvNewObjectArray (jsize LENGTH, jclass KLASS, + jobject INIT) + Here `klass' is the type of elements of the array and `init' is + the initial value put into every slot in the array. + + Creating arrays + --------------- + + For each primitive type there is a function which can be used to + create a new array of that type. The name of the function is of the + form: + + JvNewTYPEArray + + For example: + + JvNewBooleanArray + + can be used to create an array of Java primitive boolean types. + + The following function definition is the template for all such + functions: + + - Function: jbooleanArray JvNewBooleanArray (jint LENGTH) + Create's an array LENGTH indices long. + + - Function: jsize JvGetArrayLength (jarray ARRAY) + Returns the length of the ARRAY. + +  + File: gcj.info, Node: Methods, Next: Strings, Prev: Arrays, Up: About CNI + + Methods + ======= + + Java methods are mapped directly into C++ methods. The header files + generated by `gcjh' include the appropriate method definitions. + Basically, the generated methods have the same names and + _corresponding_ types as the Java methods, and are called in the + natural manner. + + Overloading + ----------- + + Both Java and C++ provide method overloading, where multiple methods + in a class have the same name, and the correct one is chosen (at + compile time) depending on the argument types. The rules for choosing + the correct method are (as expected) more complicated in C++ than in + Java, but given a set of overloaded methods generated by `gcjh' the C++ + compiler will choose the expected one. + + Common assemblers and linkers are not aware of C++ overloading, so + the standard implementation strategy is to encode the parameter types + of a method into its assembly-level name. This encoding is called + "mangling", and the encoded name is the "mangled name". The same + mechanism is used to implement Java overloading. For C++/Java + interoperability, it is important that both the Java and C++ compilers + use the _same_ encoding scheme. + + Static methods + -------------- + + Static Java methods are invoked in CNI using the standard C++ + syntax, using the `::' operator rather than the `.' operator. + + For example: + + jint i = java::lang::Math::round((jfloat) 2.3); + + C++ method definition syntax is used to define a static native method. + For example: + + #include + java::lang::Integer* + java::lang::Integer::getInteger(jstring str) + { + ... + } + + Object Constructors + ------------------- + + Constructors are called implicitly as part of object allocation + using the `new' operator. + + For example: + + java::lang::Integer *x = new java::lang::Integer(234); + + Java does not allow a constructor to be a native method. This + limitation can be coded round however because a constructor can _call_ + a native method. + + Instance methods + ---------------- + + Calling a Java instance method from a C++ CNI method is done using + the standard C++ syntax, e.g.: + + // First create the Java object. + java::lang::Integer *x = new java::lang::Integer(234); + // Now call a method. + jint prim_value = x->intValue(); + if (x->longValue == 0) + ... + + Defining a Java native instance method is also done the natural way: + + #include + + jdouble + java::lang:Integer::doubleValue() + { + return (jdouble) value; + } + + Interface methods + ----------------- + + In Java you can call a method using an interface reference. This is + supported, but not completly. *Note Interfaces::. + +  + File: gcj.info, Node: Strings, Next: Mixing with C++, Prev: Methods, Up: About CNI + + Strings + ======= + + CNI provides a number of utility functions for working with Java + Java `String' objects. The names and interfaces are analogous to those + of JNI. + + - Function: jstring JvNewString (const char* CHARS, jsize LEN) + Returns a Java `String' object with characters from the C string + CHARS up to the index LEN in that array. + + - Function: jstring JvNewStringLatin1 (const char* BYTES, jsize LEN) + Returns a Java `String' made up of LEN bytes from BYTES. + + - Function: jstring JvNewStringLatin1 (const char* BYTES) + As above but the length of the `String' is `strlen(BYTES)'. + + - Function: jstring JvNewStringUTF (const char* BYTES) + Returns a `String' which is made up of the UTF encoded characters + present in the C string BYTES. + + - Function: jchar* JvGetStringChars (jstring STR) + Returns a pointer to an array of characters making up the `String' + STR. + + - Function: int JvGetStringUTFLength (jstring STR) + Returns the number of bytes required to encode the contents of the + `String' STR in UTF-8. + + - Function: jsize JvGetStringUTFRegion (jstring STR, jsize START, + jsize LEN, char* BUF) + Puts the UTF-8 encoding of a region of the `String' STR into the + buffer `buf'. The region to fetch is marked by START and LEN. + + Note that BUF is a buffer, not a C string. It is _not_ null + terminated. + +  + File: gcj.info, Node: Mixing with C++, Next: Exception Handling, Prev: Strings, Up: About CNI + + Interoperating with C/C++ + ========================= + + Because CNI is designed to represent Java classes and methods it + cannot be mixed readily with C/C++ types. + + One important restriction is that Java classes cannot have non-Java + type instance or static variables and cannot have methods which take + non-Java types as arguments or return non-Java types. + + None of the following is possible with CNI: + + + class ::MyClass : public java::lang::Object + { + char* variable; // char* is not a valid Java type. + } + + + uint + ::SomeClass::someMethod (char *arg) + { + . + . + . + } // `uint' is not a valid Java type, neither is `char*' + + Of course, it is ok to use C/C++ types within the scope of a method: + + jint + ::SomeClass::otherMethod (jstring str) + { + char *arg = ... + . + . + . + } + + But this restriction can cause a problem so CNI includes the + `gnu.gcj.RawData' class. The `RawData' class is a "non-scanned + reference" type. In other words variables declared of type `RawData' + can contain any data and are not checked by the compiler in any way. + + This means that you can put C/C++ data structures (including classes) + in your CNI classes, as long as you use the appropriate cast. + + Here are some examples: + + + class ::MyClass : public java::lang::Object + { + gnu.gcj.RawData string; + + MyClass (); + gnu.gcj.RawData getText (); + void printText (); + } + + ::MyClass::MyClass () + { + char* text = ... + string = text; + } + + gnu.gcj.RawData + ::MyClass::getText () + { + return string; + } + + void + ::MyClass::printText () + { + printf("%s\n", (char*) string); + } + +  + File: gcj.info, Node: Exception Handling, Next: Synchronization, Prev: Mixing with C++, Up: About CNI + + Exception Handling + ================== + + While C++ and Java share a common exception handling framework, + things are not yet perfectly integrated. The main issue is that the + run-time type information facilities of the two languages are not + integrated. + + Still, things work fairly well. You can throw a Java exception from + C++ using the ordinary `throw' construct, and this exception can be + caught by Java code. Similarly, you can catch an exception thrown from + Java using the C++ `catch' construct. + + Here is an example: + + if (i >= count) + throw new java::lang::IndexOutOfBoundsException(); + + Normally, G++ will automatically detect when you are writing C++ + code that uses Java exceptions, and handle them appropriately. + However, if C++ code only needs to execute destructors when Java + exceptions are thrown through it, GCC will guess incorrectly. Sample + problematic code: + + struct S { ~S(); }; + + extern void bar(); // Is implemented in Java and may throw exceptions. + + void foo() + { + S s; + bar(); + } + + The usual effect of an incorrect guess is a link failure, + complaining of a missing routine called `__gxx_personality_v0'. + + You can inform the compiler that Java exceptions are to be used in a + translation unit, irrespective of what it might think, by writing + `#pragma GCC java_exceptions' at the head of the file. This `#pragma' + must appear before any functions that throw or catch exceptions, or run + destructors when exceptions are thrown through them. + +  + File: gcj.info, Node: Synchronization, Next: Invocation, Prev: Exception Handling, Up: About CNI + + Synchronization + =============== + + Each Java object has an implicit monitor. The Java VM uses the + instruction `monitorenter' to acquire and lock a monitor, and + `monitorexit' to release it. + + The corresponding CNI macros are `JvMonitorEnter' and + `JvMonitorExit' (JNI has similar methods `MonitorEnter' and + `MonitorExit'). + + The Java source language does not provide direct access to these + primitives. Instead, there is a `synchronized' statement that does an + implicit `monitorenter' before entry to the block, and does a + `monitorexit' on exit from the block. Note that the lock has to be + released even when the block is abnormally terminated by an exception, + which means there is an implicit `try finally' surrounding + synchronization locks. + + From C++, it makes sense to use a destructor to release a lock. CNI + defines the following utility class: + + class JvSynchronize() { + jobject obj; + JvSynchronize(jobject o) { obj = o; JvMonitorEnter(o); } + ~JvSynchronize() { JvMonitorExit(obj); } + }; + + So this Java code: + + synchronized (OBJ) + { + CODE + } + + might become this C++ code: + + { + JvSynchronize dummy (OBJ); + CODE; + } + + Java also has methods with the `synchronized' attribute. This is + equivalent to wrapping the entire method body in a `synchronized' + statement. (Alternatively, an implementation could require the caller + to do the synchronization. This is not practical for a compiler, + because each virtual method call would have to test at run-time if + synchronization is needed.) Since in `gcj' the `synchronized' + attribute is handled by the method implementation, it is up to the + programmer of a synchronized native method to handle the synchronization + (in the C++ implementation of the method). In otherwords, you need to + manually add `JvSynchronize' in a `native synchornized' method. + +  + File: gcj.info, Node: Invocation, Next: Reflection, Prev: Synchronization, Up: About CNI + + Invocation + ========== + + CNI permits C++ applications to make calls into Java classes, in + addition to allowing Java code to call into C++. Several functions, + known as the "invocation API", are provided to support this. + + - Function: jint JvCreateJavaVM (void* VM_ARGS) + Initializes the Java runtime. This function performs essential + initialization of the threads interface, garbage collector, + exception handling and other key aspects of the runtime. It must + be called once by an application with a non-Java `main()' + function, before any other Java or CNI calls are made. It is + safe, but not recommended, to call `JvCreateJavaVM()' more than + once provided it is only called from a single thread. The VMARGS + parameter can be used to specify initialization parameters for the + Java runtime. It may be `NULL'. This function returns `0' upon + success, or `-1' if the runtime is already initialized. + + _Note:_ In GCJ 3.1, the `vm_args' parameter is ignored. It may be + used in a future release. + + - Function: java::lang::Thread* JvAttachCurrentThread (jstring NAME, + java::lang::ThreadGroup* GROUP) + Registers an existing thread with the Java runtime. This must be + called once from each thread, before that thread makes any other + Java or CNI calls. It must be called after `JvCreateJavaVM'. NAME + specifies a name for the thread. It may be `NULL', in which case a + name will be generated. GROUP is the ThreadGroup in which this + thread will be a member. If it is `NULL', the thread will be a + member of the main thread group. The return value is the Java + `Thread' object that represents the thread. It is safe to call + `JvAttachCurrentThread()' more than once from the same thread. If + the thread is already attached, the call is ignored and the current + thread object is returned. + + - Function: jint JvDetachCurrentThread () + Unregisters a thread from the Java runtime. This should be called + by threads that were attached using `JvAttachCurrentThread()', + after they have finished making calls to Java code. This ensures + that any resources associated with the thread become eligible for + garbage collection. This function returns `0' upon success, or + `-1' if the current thread is not attached. + + Handling uncaught exceptions + ---------------------------- + + If an exception is thrown from Java code called using the invocation + API, and no handler for the exception can be found, the runtime will + abort the application. In order to make the application more robust, it + is recommended that code which uses the invocation API be wrapped by a + top-level try/catch block that catches all Java exceptions. + + Example + ------- + + The following code demonstrates the use of the invocation API. In + this example, the C++ application initializes the Java runtime and + attaches itself. The `java.lang.System' class is initialized in order to + access its `out' field, and a Java string is printed. Finally, the + thread is detached from the runtime once it has finished making Java + calls. Everything is wrapped with a try/catch block to provide a + default handler for any uncaught exceptions. + + The example can be compiled with `c++ test.cc -lgcj'. + + // test.cc + #include + #include + #include + #include + + int main(int argc, char *argv) + { + using namespace java::lang; + + try + { + JvCreateJavaVM(NULL); + JvAttachCurrentThread(NULL, NULL); + + String *message = JvNewStringLatin1("Hello from C++"); + JvInitClass(&System.class$); + System::out->println(message); + + JvDetachCurrentThread(); + } + catch (Throwable *t) + { + System::err->println(JvNewStringLatin1("Unhandled Java exception:")); + t->printStackTrace(); + } + } + +  + File: gcj.info, Node: Reflection, Prev: Invocation, Up: About CNI + + Reflection + ========== + + Reflection is possible with CNI code, it functions similarly to how + it functions with JNI. + + The types `jfieldID' and `jmethodID' are as in JNI. + + The functions: + + * `JvFromReflectedField', + + * `JvFromReflectedMethod', + + * `JvToReflectedField' + + * `JvToFromReflectedMethod' + + will be added shortly, as will other functions corresponding to JNI. + +  + File: gcj.info, Node: Resources, Prev: About CNI, Up: Top + + Resources + ********* + + While writing `gcj' and `libgcj' we have, of course, relied heavily + on documentation from Sun Microsystems. In particular we have used The + Java Language Specification (both first and second editions), the Java + Class Libraries (volumes one and two), and the Java Virtual Machine + Specification. In addition we've used the online documentation at + `http://java.sun.com/'. + + The current `gcj' home page is `http://gcc.gnu.org/java/'. + + For more information on gcc, see `http://gcc.gnu.org/'. + + Some `libgcj' testing is done using the Mauve test suite. This is a + free software Java class library test suite which is being written + because the JCK is not free. See `http://sources.redhat.com/mauve/' + for more information. + + diff -Nrc3pad gcc-3.0.4/gcc/java/gcj.texi gcc-3.1/gcc/java/gcj.texi *** gcc-3.0.4/gcc/java/gcj.texi Wed Jul 4 16:23:09 2001 --- gcc-3.1/gcc/java/gcj.texi Tue Apr 23 23:56:25 2002 *************** *** 8,19 **** @c the word ``Java'. @c When this manual is copyrighted. ! @set copyrights-gcj 2001 @c Versions ! @set version-gcc 3.0 @set which-gcj GCC-@value{version-gcc} @ifinfo @format @dircategory Programming --- 8,23 ---- @c the word ``Java'. @c When this manual is copyrighted. ! @set copyrights-gcj 2001, 2002 @c Versions ! @set version-gcc 3.1 @set which-gcj GCC-@value{version-gcc} + @macro gcctabopt{body} + @code{\body\} + @end macro + @ifinfo @format @dircategory Programming *************** *** 30,38 **** --- 34,49 ---- * jcf-dump: (gcj)Invoking jcf-dump. Print information about Java class files * gij: (gcj)Invoking gij. GNU interpreter for Java bytecode + * jv-convert: (gcj)Invoking jv-convert. + Convert file from one encoding to another + * rmic: (gcj)Invoking rmic. + Generate stubs for Remote Method Invocation. + * rmiregistry: (gcj)Invoking rmiregistry. + The remote object registry. @end direntry @end format + @c man begin COPYRIGHT Copyright (C) @value{copyrights-gcj} Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document *************** under the terms of the GNU Free Document *** 40,47 **** any later version published by the Free Software Foundation; with the Invariant Sections being ``GNU General Public License'', the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) ! (see below). A copy of the license is included in the section entitled ``GNU Free Documentation License''. (a) The FSF's Front-Cover Text is: --- 51,65 ---- any later version published by the Free Software Foundation; with the Invariant Sections being ``GNU General Public License'', the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) ! (see below). A copy of the license is included in the ! @c man end ! section entitled ``GNU Free Documentation License''. + @ignore + @c man begin COPYRIGHT + man page gfdl(7). + @c man end + @end ignore (a) The FSF's Front-Cover Text is: *************** texts being (a) (see below), and with th *** 93,113 **** @node Top @top Introduction ! This manual describes how to use @code{gcj}, the GNU compiler for the ! Java programming language. @code{gcj} can generate both @file{.class} files and object files, and it can read both Java source code and @file{.class} files. @menu ! * Copying:: The GNU General Public License * GNU Free Documentation License:: How you can share and copy this manual ! * Invoking gcj:: Compiler options supported by @code{gcj} * Compatibility:: Compatibility between gcj and other tools for Java * Invoking gcjh:: Generate header files from class files * Invoking jv-scan:: Print information about source files * Invoking jcf-dump:: Print information about class files * Invoking gij:: Interpreting Java bytecodes * Resources:: Where to look for more information @end menu --- 111,135 ---- @node Top @top Introduction ! This manual describes how to use @command{gcj}, the GNU compiler for the ! Java programming language. @command{gcj} can generate both @file{.class} files and object files, and it can read both Java source code and @file{.class} files. @menu ! * Copying:: The GNU General Public License * GNU Free Documentation License:: How you can share and copy this manual ! * Invoking gcj:: Compiler options supported by @command{gcj} * Compatibility:: Compatibility between gcj and other tools for Java * Invoking gcjh:: Generate header files from class files * Invoking jv-scan:: Print information about source files * Invoking jcf-dump:: Print information about class files * Invoking gij:: Interpreting Java bytecodes + * Invoking jv-convert:: Converting from one encoding to another + * Invoking rmic:: Generate stubs for Remote Method Invocation. + * Invoking rmiregistry:: The remote object registry. + * About CNI:: Description of the Cygnus Native Interface * Resources:: Where to look for more information @end menu *************** files and object files, and it can read *** 120,129 **** @node Invoking gcj @chapter Invoking gcj ! As @code{gcj} is just another front end to @code{gcc}, it supports many of the same options as gcc. @xref{Option Summary, , Option Summary, ! gcc, Using the GNU Compiler Collection}. This manual only documents the ! options specific to @code{gcj}. @menu * Input and output files:: --- 142,173 ---- @node Invoking gcj @chapter Invoking gcj ! @c man title gcj Ahead-of-time compiler for the Java language ! ! @ignore ! @c man begin SYNOPSIS gcj ! gcj [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}] ! [@option{--CLASSPATH}=@var{path}] [@option{--classpath}=@var{path}] ! [@option{-f}@var{option}@dots{}] [@option{--encoding}=@var{name}] ! [@option{--main}=@var{classname}] [@option{-D}@var{name}[=@var{value}]@dots{}] ! [@option{-C}] [@option{--resource} @var{resource-name}] [@option{-d} @var{directory}] ! [@option{-W}@var{warn}@dots{}] ! @var{sourcefile}@dots{} ! @c man end ! @c man begin SEEALSO gcj ! gcc(1), gcjh(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7), ! and the Info entries for @file{gcj} and @file{gcc}. ! @c man end ! @end ignore ! ! @c man begin DESCRIPTION gcj ! ! As @command{gcj} is just another front end to @command{gcc}, it supports many of the same options as gcc. @xref{Option Summary, , Option Summary, ! gcc, Using the GNU Compiler Collection (GCC)}. This manual only documents the ! options specific to @command{gcj}. ! ! @c man end @menu * Input and output files:: *************** options specific to @code{gcj}. *** 134,147 **** * Configure-time Options:: Options you won't use @end menu @node Input and output files @section Input and output files ! A @code{gcj} command is like a @code{gcc} command, in that it consists of a number of options and file names. The following kinds of input file names are supported: ! @table @code @item @var{file}.java Java source files. @item @var{file}.class --- 178,193 ---- * Configure-time Options:: Options you won't use @end menu + @c man begin OPTIONS gcj + @node Input and output files @section Input and output files ! A @command{gcj} command is like a @command{gcc} command, in that it consists of a number of options and file names. The following kinds of input file names are supported: ! @table @gcctabopt @item @var{file}.java Java source files. @item @var{file}.class *************** Each named file is compiled, just as if *** 158,174 **** @item @var{library}.a @itemx @var{library}.so @itemx -l@var{libname} ! Libraries to use when linking. See the @code{gcc} manual. @end table ! You can specify more than one input file on the @code{gcj} command line, in which case they will all be compiled. If you specify a @code{-o @var{FILENAME}} option, all the input files will be compiled together, producing a single output file, named @var{FILENAME}. This is allowed even when using @code{-S} or @code{-c}, ! but not when using @code{-C}. ! (This is an extension beyond the what plain @code{gcc} allows.) (If more than one input file is specified, all must currently be @code{.java} files, though we hope to fix this.) --- 204,220 ---- @item @var{library}.a @itemx @var{library}.so @itemx -l@var{libname} ! Libraries to use when linking. See the @command{gcc} manual. @end table ! You can specify more than one input file on the @command{gcj} command line, in which case they will all be compiled. If you specify a @code{-o @var{FILENAME}} option, all the input files will be compiled together, producing a single output file, named @var{FILENAME}. This is allowed even when using @code{-S} or @code{-c}, ! but not when using @code{-C} or @code{--resource}. ! (This is an extension beyond the what plain @command{gcc} allows.) (If more than one input file is specified, all must currently be @code{.java} files, though we hope to fix this.) *************** be @code{.java} files, though we hope to *** 177,198 **** @cindex class path ! @code{gcj} has options to control where it looks to find files it needs. ! For instance, @code{gcj} might need to load a class that is referenced by the file it has been asked to compile. Like other compilers for the ! Java language, @code{gcj} has a notion of a @dfn{class path}. There are several options and environment variables which can be used to ! manipulate the class path. When @code{gcj} looks for a given class, it searches the class path looking for matching @file{.class} or ! @file{.java} file. @code{gcj} comes with a built-in class path which points at the installed @file{libgcj.jar}, a file which contains all the standard classes. In the below, a directory or path component can refer either to an actual directory on the filesystem, or to a @file{.zip} or @file{.jar} ! file, which @code{gcj} will search as if it is a directory. ! @table @code @item -I@var{dir} All directories specified by @code{-I} are kept in order and prepended to the class path constructed from all the other options. Unless --- 223,244 ---- @cindex class path ! @command{gcj} has options to control where it looks to find files it needs. ! For instance, @command{gcj} might need to load a class that is referenced by the file it has been asked to compile. Like other compilers for the ! Java language, @command{gcj} has a notion of a @dfn{class path}. There are several options and environment variables which can be used to ! manipulate the class path. When @command{gcj} looks for a given class, it searches the class path looking for matching @file{.class} or ! @file{.java} file. @command{gcj} comes with a built-in class path which points at the installed @file{libgcj.jar}, a file which contains all the standard classes. In the below, a directory or path component can refer either to an actual directory on the filesystem, or to a @file{.zip} or @file{.jar} ! file, which @command{gcj} will search as if it is a directory. ! @table @gcctabopt @item -I@var{dir} All directories specified by @code{-I} are kept in order and prepended to the class path constructed from all the other options. Unless *************** class path. *** 203,214 **** @item --classpath=@var{path} This sets the class path to @var{path}, a colon-separated list of paths (on Windows-based systems, a semicolon-separate list of paths). @item --CLASSPATH=@var{path} ! This sets the class path to @var{path}, a colon-separated list of paths ! (on Windows-based systems, a semicolon-separate list of paths). This ! differs from the @code{--classpath} option in that it also suppresses ! the built-in system path. @item CLASSPATH This is an environment variable which holds a list of paths. --- 249,265 ---- @item --classpath=@var{path} This sets the class path to @var{path}, a colon-separated list of paths (on Windows-based systems, a semicolon-separate list of paths). + This does not override the builtin (``boot'') search path. @item --CLASSPATH=@var{path} ! Deprecated synonym for @code{--classpath}. ! ! @item --bootclasspath=@var{path} ! Where to find the standard builtin classes, such as @code{java.lang.String}. ! ! @item --extdirs=@var{path} ! For each directory in the @var{path}, place the contents of that ! directory at the end of the class path. @item CLASSPATH This is an environment variable which holds a list of paths. *************** The final class path is constructed like *** 221,251 **** First come all directories specified via @code{-I}. @item ! If @code{--classpath} is specified, its value is appended and processing ! stops. That is, @code{--classpath} suppresses all the options mentioned ! later in this list. ! ! @item ! If @code{--CLASSPATH} is specified, its value is appended and the ! @code{CLASSPATH} environment variable is suppressed. @item ! If the @code{CLASSPATH} environment variable is specified (and was not ! suppressed by @code{--CLASSPATH}), then its value is appended. @item ! Finally, the built-in system directory, @file{libgcj.jar}, is appended. @end itemize ! The classfile built by @code{gcj} for the class @code{java.lang.Object} (and placed in @code{libgcj.jar}) contains a special zero length attribute @code{gnu.gcj.gcj-compiled}. The compiler looks for this attribute when loading @code{java.lang.Object} and will report an error if it isn't found, unless it compiles to bytecode (the option ! @code{-fforce-classes-archive-check} can be used to overide this behavior in this particular case.) ! @table @code @item -fforce-classes-archive-check This forces the compiler to always check for the special zero length attribute @code{gnu.gcj.gcj-compiled} in @code{java.lang.Object} and --- 272,301 ---- First come all directories specified via @code{-I}. @item ! If @option{--classpath} is specified, its value is appended. ! Otherwise, if the @code{CLASSPATH} environment variable is specified, ! then its value is appended. ! Otherwise, the current directory (@code{"."}) is appended. @item ! If @code{--bootclasspath} was specified, append its value. ! Otherwise, append the built-in system directory, @file{libgcj.jar}. @item ! Finaly, if @code{--extdirs} was specified, append the contents of the ! specified directories at the end of the class path. Otherwise, append ! the contents of the built-in extdirs at @code{$(prefix)/share/java/ext}. @end itemize ! The classfile built by @command{gcj} for the class @code{java.lang.Object} (and placed in @code{libgcj.jar}) contains a special zero length attribute @code{gnu.gcj.gcj-compiled}. The compiler looks for this attribute when loading @code{java.lang.Object} and will report an error if it isn't found, unless it compiles to bytecode (the option ! @code{-fforce-classes-archive-check} can be used to override this behavior in this particular case.) ! @table @gcctabopt @item -fforce-classes-archive-check This forces the compiler to always check for the special zero length attribute @code{gnu.gcj.gcj-compiled} in @code{java.lang.Object} and *************** issue an error if it isn't found. *** 256,279 **** @section Encodings The Java programming language uses Unicode throughout. In an effort to ! integrate well with other locales, @code{gcj} allows @file{.java} files ! to be written using almost any encoding. @code{gcj} knows how to convert these encodings into its internal encoding at compile time. You can use the @code{--encoding=@var{NAME}} option to specify an encoding (of a particular character set) to use for source files. If this is not specified, the default encoding comes from your current locale. If your host system has insufficient locale support, then ! @code{gcj} assumes the default encoding to be the @samp{UTF-8} encoding of Unicode. ! To implement @code{--encoding}, @code{gcj} simply uses the host platform's @code{iconv} conversion routine. This means that in practice ! @code{gcj} is limited by the capabilities of the host platform. The names allowed for the argument @code{--encoding} vary from platform to platform (since they are not standardized anywhere). However, ! @code{gcj} implements the encoding named @samp{UTF-8} internally, so if you choose to use this for your source files you can be assured that it will work on every host. --- 306,329 ---- @section Encodings The Java programming language uses Unicode throughout. In an effort to ! integrate well with other locales, @command{gcj} allows @file{.java} files ! to be written using almost any encoding. @command{gcj} knows how to convert these encodings into its internal encoding at compile time. You can use the @code{--encoding=@var{NAME}} option to specify an encoding (of a particular character set) to use for source files. If this is not specified, the default encoding comes from your current locale. If your host system has insufficient locale support, then ! @command{gcj} assumes the default encoding to be the @samp{UTF-8} encoding of Unicode. ! To implement @code{--encoding}, @command{gcj} simply uses the host platform's @code{iconv} conversion routine. This means that in practice ! @command{gcj} is limited by the capabilities of the host platform. The names allowed for the argument @code{--encoding} vary from platform to platform (since they are not standardized anywhere). However, ! @command{gcj} implements the encoding named @samp{UTF-8} internally, so if you choose to use this for your source files you can be assured that it will work on every host. *************** will work on every host. *** 281,308 **** @node Warnings @section Warnings ! @code{gcj} implements several warnings. As with other generic ! @code{gcc} warnings, if an option of the form @code{-Wfoo} enables a warning, then @code{-Wno-foo} will disable it. Here we've chosen to document the form of the warning which will have an effect -- the default being the opposite of what is listed. ! @table @code @item -Wredundant-modifiers ! With this flag, @code{gcj} will warn about redundant modifiers. For instance, it will warn if an interface method is declared @code{public}. @item -Wextraneous-semicolon ! This causes @code{gcj} to warn about empty statements. Empty statements have been deprecated. @item -Wno-out-of-date ! This option will cause @code{gcj} not to warn when a source file is ! newer than its matching class file. By default @code{gcj} will warn about this. @item -Wunused ! This is the same as @code{gcc}'s @code{-Wunused}. @item -Wall This is the same as @code{-Wredundant-modifiers -Wextraneous-semicolon --- 331,358 ---- @node Warnings @section Warnings ! @command{gcj} implements several warnings. As with other generic ! @command{gcc} warnings, if an option of the form @code{-Wfoo} enables a warning, then @code{-Wno-foo} will disable it. Here we've chosen to document the form of the warning which will have an effect -- the default being the opposite of what is listed. ! @table @gcctabopt @item -Wredundant-modifiers ! With this flag, @command{gcj} will warn about redundant modifiers. For instance, it will warn if an interface method is declared @code{public}. @item -Wextraneous-semicolon ! This causes @command{gcj} to warn about empty statements. Empty statements have been deprecated. @item -Wno-out-of-date ! This option will cause @command{gcj} not to warn when a source file is ! newer than its matching class file. By default @command{gcj} will warn about this. @item -Wunused ! This is the same as @command{gcc}'s @code{-Wunused}. @item -Wall This is the same as @code{-Wredundant-modifiers -Wextraneous-semicolon *************** This is the same as @code{-Wredundant-mo *** 313,322 **** @node Code Generation @section Code Generation ! In addition to the many @code{gcc} options controlling code generation, ! @code{gcj} has several options specific to itself. ! @table @code @item --main=@var{CLASSNAME} This option is used when linking to specify the name of the class whose @code{main} method should be invoked when the resulting executable is --- 363,372 ---- @node Code Generation @section Code Generation ! In addition to the many @command{gcc} options controlling code generation, ! @command{gcj} has several options specific to itself. ! @table @gcctabopt @item --main=@var{CLASSNAME} This option is used when linking to specify the name of the class whose @code{main} method should be invoked when the resulting executable is *************** are initialized at the program's startup *** 334,342 **** using the @code{java.lang.System.getProperty} method. @item -C ! This option is used to tell @code{gcj} to generate bytecode (@file{.class} files) rather than object code. @item -d @var{directory} When used with @code{-C}, this causes all generated @file{.class} files to be put in the appropriate subdirectory of @var{directory}. By --- 384,401 ---- using the @code{java.lang.System.getProperty} method. @item -C ! This option is used to tell @command{gcj} to generate bytecode (@file{.class} files) rather than object code. + @item --resource @var{resource-name} + This option is used to tell @command{gcj} to compile the contents of a + given file to object code so it may be accessed at runtime with the core + protocol handler as @samp{core:/@var{resource-name}}. Note that + @var{resource-name} is the name of the resource as found at runtime; for + instance, it could be used in a call to @code{ResourceBundle.getBundle}. + The actual file name to be compiled this way must be specified + separately. + @item -d @var{directory} When used with @code{-C}, this causes all generated @file{.class} files to be put in the appropriate subdirectory of @var{directory}. By *************** default they will be put in subdirectori *** 344,407 **** directory. @item -fno-bounds-check ! By default, @code{gcj} generates code which checks the bounds of all ! array indexing operations. With this option, these checks are omitted. ! Note that this can result in unpredictable behavior if the code in ! question actually does violate array bounds constraints. @item -fjni ! With @code{gcj} there are two options for writing native methods: CNI ! and JNI. By default @code{gcj} assumes you are using CNI. If you are compiling a class with native methods, and these methods are implemented using JNI, then you must use @code{-fjni}. This option causes ! @code{gcj} to generate stubs which will invoke the underlying JNI methods. @end table @node Configure-time Options @section Configure-time Options ! Some @code{gcj} code generations options affect the resulting ABI, and so can only be meaningfully given when @code{libgcj}, the runtime package, is configured. @code{libgcj} puts the appropriate options from ! this group into a @samp{spec} file which is read by @code{gcj}. These options are listed here for completeness; if you are using @code{libgcj} then you won't want to touch these options. ! @table @code @item -fuse-boehm-gc This enables the use of the Boehm GC bitmap marking code. In particular ! this causes @code{gcj} to put an object marking descriptor into each vtable. @item -fhash-synchronization By default, synchronization data (the data used for @code{synchronize}, @code{wait}, and @code{notify}) is pointed to by a word in each object. ! With this option @code{gcj} assumes that this information is stored in a hash table and not in the object itself. @item -fuse-divide-subroutine On some systems, a library routine is called to perform integer division. This is required to get exception handling correct when dividing by zero. @end table @node Compatibility @chapter Compatibility with the Java Platform As we believe it is important that the Java platform not be fragmented, ! @code{gcj} and @code{libgcj} try to conform to the relevant Java specifications. However, limited manpower and incomplete and unclear documentation work against us. So, there are caveats to using ! @code{gcj}. This list of compatibility issues is by no means complete. @itemize @bullet @item ! @code{gcj} implements the JDK 1.1 language. It supports inner classes, though these are known to still be buggy. It does not yet support the Java 2 @code{strictfp} keyword (it recognizes the keyword but ignores it). --- 403,492 ---- directory. @item -fno-bounds-check ! By default, @command{gcj} generates code which checks the bounds of all ! array indexing operations. With this option, these checks are omitted, which ! can improve performance for code that uses arrays extensively. Note that this ! can result in unpredictable behavior if the code in question actually does ! violate array bounds constraints. It is safe to use this option if you are ! sure that your code will never throw an @code{ArrayIndexOutOfBoundsException}. ! ! @item -fno-store-check ! Don't generate array store checks. When storing objects into arrays, a runtime ! check is normally generated in order to ensure that the object is assignment ! compatible with the component type of the array (which may not be known ! at compile-time). With this option, these checks are omitted. This can ! improve performance for code which stores objects into arrays frequently. ! It is safe to use this option if you are sure your code will never throw an ! @code{ArrayStoreException}. @item -fjni ! With @command{gcj} there are two options for writing native methods: CNI ! and JNI@. By default @command{gcj} assumes you are using CNI@. If you are compiling a class with native methods, and these methods are implemented using JNI, then you must use @code{-fjni}. This option causes ! @command{gcj} to generate stubs which will invoke the underlying JNI methods. + + @item -fno-optimize-static-class-initialization + When the optimization level is greather or equal to @code{-O2}, + @command{gcj} will try to optimize the way calls into the runtime are made + to initialize static classes upon their first use (this optimization + isn't carried out if @code{-C} was specified.) When compiling to native + code, @code{-fno-optimize-static-class-initialization} will turn this + optimization off, regardless of the optimization level in use. @end table @node Configure-time Options @section Configure-time Options ! Some @command{gcj} code generations options affect the resulting ABI, and so can only be meaningfully given when @code{libgcj}, the runtime package, is configured. @code{libgcj} puts the appropriate options from ! this group into a @samp{spec} file which is read by @command{gcj}. These options are listed here for completeness; if you are using @code{libgcj} then you won't want to touch these options. ! @table @gcctabopt @item -fuse-boehm-gc This enables the use of the Boehm GC bitmap marking code. In particular ! this causes @command{gcj} to put an object marking descriptor into each vtable. @item -fhash-synchronization By default, synchronization data (the data used for @code{synchronize}, @code{wait}, and @code{notify}) is pointed to by a word in each object. ! With this option @command{gcj} assumes that this information is stored in a hash table and not in the object itself. @item -fuse-divide-subroutine On some systems, a library routine is called to perform integer division. This is required to get exception handling correct when dividing by zero. + + @item -fcheck-references + On some systems it's necessary to insert inline checks whenever + accessing an object via a reference. On other systems you won't need + this because null pointer accesses are caught automatically by the + processor. @end table + @c man end @node Compatibility @chapter Compatibility with the Java Platform As we believe it is important that the Java platform not be fragmented, ! @command{gcj} and @code{libgcj} try to conform to the relevant Java specifications. However, limited manpower and incomplete and unclear documentation work against us. So, there are caveats to using ! @command{gcj}. This list of compatibility issues is by no means complete. @itemize @bullet @item ! @command{gcj} implements the JDK 1.1 language. It supports inner classes, though these are known to still be buggy. It does not yet support the Java 2 @code{strictfp} keyword (it recognizes the keyword but ignores it). *************** the appropriate response. *** 424,435 **** @node Invoking gcjh @chapter Invoking gcjh The @code{gcjh} program is used to generate header files from class files. It can generate both CNI and JNI header files, as well as stub implementation files which can be used as a basis for implementing the required native methods. ! @table @code @item -stubs This causes @code{gcjh} to generate stub files instead of header files. By default the stub file will be named after the class, with a suffix of --- 509,546 ---- @node Invoking gcjh @chapter Invoking gcjh + @c man title gcjh generate header files from Java class files + + @c man begin DESCRIPTION gcjh + The @code{gcjh} program is used to generate header files from class files. It can generate both CNI and JNI header files, as well as stub implementation files which can be used as a basis for implementing the required native methods. ! @c man end ! ! @ignore ! @c man begin SYNOPSIS gcjh ! gcjh [@option{-stubs}] [@option{-jni}] ! [@option{-add} @var{text}] [@option{-append} @var{text}] [@option{-friend} @var{text}] ! [@option{-preprend} @var{text}] ! [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}] ! [@option{-I}@var{dir}@dots{}] [@option{-d} @var{dir}@dots{}] ! [@option{-o} @var{file}] [@option{-td} @var{dir}] ! [@option{-M}] [@option{-MM}] [@option{-MD}] [@option{-MMD}] ! [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}] ! @var{classname}@dots{} ! @c man end ! @c man begin SEEALSO gcjh ! gcc(1), gcj(1), gij(1), jv-scan(1), jcf-dump(1), gfdl(7), ! and the Info entries for @file{gcj} and @file{gcc}. ! @c man end ! @end ignore ! ! @c man begin OPTIONS gcjh ! ! @table @gcctabopt @item -stubs This causes @code{gcjh} to generate stub files instead of header files. By default the stub file will be named after the class, with a suffix of *************** This is ignored in JNI mode. *** 460,466 **** @itemx -I@var{directory} @itemx -d @var{directory} @itemx -o @var{file} ! These options are all identical to the corresponding @code{gcj} options. @item -o @var{file} Sets the output file name. This cannot be used if there is more than --- 571,577 ---- @itemx -I@var{directory} @itemx -d @var{directory} @itemx -o @var{file} ! These options are all identical to the corresponding @command{gcj} options. @item -o @var{file} Sets the output file name. This cannot be used if there is more than *************** one class on the command line. *** 469,498 **** @item -td @var{directory} Sets the name of the directory to use for temporary files. @item --help Print help about @code{gcjh} and exit. No further processing is done. @item --version Print version information for @code{gcjh} and exit. No further processing is done. @end table All remaining options are considered to be names of classes. @node Invoking jv-scan @chapter Invoking jv-scan The @code{jv-scan} program can be used to print information about a Java source file (@file{.java} file). ! @table @code @item --complexity This prints a complexity measure, related to cyclomatic complexity, for each input file. @item --encoding=@var{name} ! This works like the corresponding @code{gcj} option. @item --print-main This prints the name of the class in this file containing a @code{main} --- 580,646 ---- @item -td @var{directory} Sets the name of the directory to use for temporary files. + @item -M + Print all dependencies to stdout; suppress ordinary output. + + @item -MM + Print non-system dependencies to stdout; suppress ordinary output. + + @item -MD + Print all dependencies to stdout. + + @item -MMD + Print non-system dependencies to stdout. + @item --help Print help about @code{gcjh} and exit. No further processing is done. @item --version Print version information for @code{gcjh} and exit. No further processing is done. + + @item -v, --verbose + Print extra information while running. @end table All remaining options are considered to be names of classes. + @c man end @node Invoking jv-scan @chapter Invoking jv-scan + @c man title jv-scan print information about Java source file + + @c man begin DESCRIPTION jv-scan + The @code{jv-scan} program can be used to print information about a Java source file (@file{.java} file). ! @c man end ! ! @ignore ! @c man begin SYNOPSIS jv-scan ! jv-scan [@option{--complexity}] [@option{--encoding}=@var{name}] ! [@option{--print-main}] [@option{--list-class}] [@option{--list-filename}] ! [@option{--version}] [@option{--help}] ! [@option{-o} @var{file}] @var{inputfile}@dots{} ! @c man end ! @c man begin SEEALSO jv-scan ! gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7), ! and the Info entries for @file{gcj} and @file{gcc}. ! @c man end ! @end ignore ! ! @c man begin OPTIONS jv-scan ! ! @table @gcctabopt @item --complexity This prints a complexity measure, related to cyclomatic complexity, for each input file. @item --encoding=@var{name} ! This works like the corresponding @command{gcj} option. @item --print-main This prints the name of the class in this file containing a @code{main} *************** also print the name of the file in which *** 507,523 **** @item -o @var{file} Print output to the named file. @end table @node Invoking jcf-dump @chapter Invoking jcf-dump This is a class file examiner, similar to @code{javap}. It will print information about a number of classes, which are specifed by class name or file name. ! @table @code @item -c Disassemble method bodies. By default method bodies are not printed. --- 655,700 ---- @item -o @var{file} Print output to the named file. + + @item --help + Print help, then exit. + + @item --version + Print version number, then exit. @end table + @c man end @node Invoking jcf-dump @chapter Invoking jcf-dump + @c man title jcf-dump print information about Java class files + + @ignore + @c man begin SYNOPSIS jcf-dump + jcf-dump [@option{-c}] [@option{--javap}] + [@option{--classpath}=@var{path}] [@option{--CLASSPATH}=@var{path}] + [@option{-I}@var{dir}@dots{}] [@option{-o} @var{file}] + [@option{--version}] [@option{--help}] [@option{-v}] [@option{--verbose}] + @var{classname}@dots{} + @c man end + @c man begin SEEALSO jcf-dump + gcc(1), gcj(1), gcjh(1), gij(1), jcf-dump(1), gfdl(7), + and the Info entries for @file{gcj} and @file{gcc}. + @c man end + @end ignore + + @c man begin DESCRIPTION jcf-dump + This is a class file examiner, similar to @code{javap}. It will print information about a number of classes, which are specifed by class name or file name. ! @c man end ! ! @c man begin OPTIONS jcf-dump ! ! @table @gcctabopt @item -c Disassemble method bodies. By default method bodies are not printed. *************** feature is very incomplete. *** 529,545 **** @itemx --CLASSPATH=@var{path} @itemx -I@var{directory} @itemx -o @var{file} ! These options as the same as the corresponding @code{gcj} options. @end table @node Invoking gij @chapter Invoking gij @code{gij} is a Java bytecode interpreter included with @code{libgcj}. @code{gij} is not available on every platform; porting it requires a small amount of assembly programming which has not been done for all the ! targets supported by @code{gcj}. The primary argument to @code{gij} is the name of a class or, with @code{-jar}, a jar file. Options before this argument are interpreted --- 706,751 ---- @itemx --CLASSPATH=@var{path} @itemx -I@var{directory} @itemx -o @var{file} ! These options as the same as the corresponding @command{gcj} options. ! ! @item --help ! Print help, then exit. ! ! @item --version ! Print version number, then exit. ! ! @item -v, --verbose ! Print extra information while running. @end table + @c man end @node Invoking gij @chapter Invoking gij + @c man title gij GNU interpreter for Java bytecode + + @ignore + @c man begin SYNOPSIS gij + gij [@option{OPTION}] @dots{} @var{JARFILE} [@var{ARGS}@dots{}] + + gij [@option{-jar}] [@option{OPTION}] @dots{} @var{CLASS} [@var{ARGS}@dots{}] + [@option{-D}@var{name}[=@var{value}]@dots{}] + [@option{-ms=}@var{number}] [@option{-mx=}@var{number}] + [@option{--version}] [@option{--help}] + @c man end + @c man begin SEEALSO gij + gcc(1), gcj(1), gcjh(1), jv-scan(1), jcf-dump(1), gfdl(7), + and the Info entries for @file{gcj} and @file{gcc}. + @c man end + @end ignore + + @c man begin DESCRIPTION gij + @code{gij} is a Java bytecode interpreter included with @code{libgcj}. @code{gij} is not available on every platform; porting it requires a small amount of assembly programming which has not been done for all the ! targets supported by @command{gcj}. The primary argument to @code{gij} is the name of a class or, with @code{-jar}, a jar file. Options before this argument are interpreted *************** Note that @code{gij} is not limited to i *** 561,567 **** objects, it is possible to give @code{gij} the name of a class which has been compiled and put into a shared library on the class path. ! @table @code @item -D@var{name}[=@var{value}] This defines a system property named @var{name} with value @var{value}. If @var{value} is not specified then it defaults to the empty string. --- 767,777 ---- objects, it is possible to give @code{gij} the name of a class which has been compiled and put into a shared library on the class path. ! @c man end ! ! @c man begin OPTIONS gij ! ! @table @gcctabopt @item -D@var{name}[=@var{value}] This defines a system property named @var{name} with value @var{value}. If @var{value} is not specified then it defaults to the empty string. *************** be retrieved at runtime using the @code{ *** 570,576 **** method. @item -ms=@var{number} ! This sets the initial heap size @item -mx=@var{number} This sets the maximum heap size. --- 780,786 ---- method. @item -ms=@var{number} ! This sets the initial heap size. @item -mx=@var{number} This sets the maximum heap size. *************** This sets the maximum heap size. *** 578,597 **** @item -jar This indicates that the name passed to @code{gij} should be interpreted as the name of a jar file, not a class. @end table @node Resources @chapter Resources ! While writing @code{gcj} and @code{libgcj} we have, of course, relied heavily on documentation from Sun Microsystems. In particular we have used The Java Language Specification (both first and second editions), the Java Class Libraries (volumes one and two), and the Java Virtual Machine Specification. In addition we've used the online documentation at @uref{http://java.sun.com/}. ! The current @code{gcj} home page is @uref{http://gcc.gnu.org/java/}. For more information on gcc, see @uref{http://gcc.gnu.org/}. --- 788,1953 ---- @item -jar This indicates that the name passed to @code{gij} should be interpreted as the name of a jar file, not a class. + + @item --help + Print help, then exit. + + @item --version + Print version number, then exit. + @end table + + @c man end + + @node Invoking jv-convert + @chapter Invoking jv-convert + + @c man title jv-convert Convert file from one encoding to another + + @c man begin SYNOPSIS jv-convert + @command{jv-convert} [@option{OPTION}] @dots{} [@var{INPUTFILE} [@var{OUTPUTFILE}]] + @ignore + + [@option{--encoding} @var{name}] + [@option{--from} @var{name}] + [@option{--to} @var{name}] + [@option{-i} @var{file}] [@option{-o} @var{file}] + [@option{--reverse}] [@option{--help}] [@option{--version}] + @end ignore + @c man end + + @c man begin DESCRIPTION jv-convert + + @command{jv-convert} is a utility included with @code{libgcj} which + converts a file from one encoding to another. It is similar to the Unix + @command{iconv} utility. + + The encodings supported by @command{jv-convert} are platform-dependent. + Currently there is no way to get a list of all supported encodings. + + @c man end + + @c man begin OPTIONS jv-convert + + @table @gcctabopt + @item --encoding @var{name} + @itemx --from @var{name} + Use @var{name} as the input encoding. The default is the current + locale's encoding. + + @item --to @var{name} + Use @var{name} as the output encoding. The default is the + @code{JavaSrc} encoding; this is ASCII with @samp{\u} escapes for + non-ASCII characters. + + @item -i @var{file} + Read from @var{file}. The default is to read from standard input. + + @item -o @var{file} + Write to @var{file}. The default is to write to standard output. + + @item --reverse + Swap the input and output encodings. + + @item --help + Print a help message, then exit. + + @item --version + Print version information, then exit. @end table + @c man end + + @node Invoking rmic + @chapter Invoking rmic + + @c man title rmic Generate stubs for Remote Method Invocation + + @c man begin SYNOPSIS rmic + @command{rmic} [@option{OPTION}] @dots{} @var{class} @dots{} + @ignore + [@option{-keep}] + [@option{-keepgenerated}] + [@option{-v1.1}] + [@option{-vcompat}] + [@option{-v1.2}] + [@option{-nocompile}] + [@option{-verbose}] + [@option{-d} @var{directory}] + [@option{-help}] + [@option{-version}] + @end ignore + @c man end + + @c man begin DESCRIPTION rmic + + @command{rmic} is a utility included with @code{libgcj} which generates + stubs for remote objects. + + @c FIXME: Add real information here. + @c This really isn't much more than the --help output. + + Note that this program isn't yet fully compatible with the JDK + @command{rmic}. Some options, such as @option{-classpath}, are + recognized but currently ignored. We have left these options + undocumented for now. + + Long options can also be given with a GNU-style leading @samp{--}. For + instance, @option{--help} is accepted. + + @c man end + + @c man begin OPTIONS rmic + + @table @gcctabopt + @item -keep + @itemx -keepgenerated + By default, @command{rmic} deletes intermediate files. Either of these + options causes it not to delete such files. + + @item -v1.1 + Cause @command{rmic} to create stubs and skeletons for the 1.1 + protocol version. + + @item -vcompat + Cause @command{rmic} to create stubs and skeletons compatible with both + the 1.1 and 1.2 protocol versions. This is the default. + + @item -v1.2 + Cause @command{rmic} to create stubs and skeletons for the 1.2 + protocol version. + + @item -nocompile + Don't compile the generated files. + + @item -verbose + Print information about what @command{rmic} is doing. + + @item -d @var{directory} + Put output files in @var{directory}. By default the files are put in + the current working directory. + + @item -help + Print a help message, then exit. + + @item -version + Print version information, then exit. + @end table + + @c man end + + + @node Invoking rmiregistry + @chapter Invoking rmiregistry + + @c man title rmiregistry Remote object registry + + @c man begin SYNOPSIS rmiregistry + @command{rmiregistry} [@option{OPTION}] @dots{} [@var{port}] + @ignore + [@option{--help}] + [@option{--version}] + @end ignore + @c man end + + @c man begin DESCRIPTION rmiregistry + + @command{rmiregistry} starts a remote object registry on the current + host. If no port number is specified, then port 1099 is used. + + @c FIXME: Add real information here. + @c This really isn't much more than the --help output. + + @c man end + + @c man begin OPTIONS rmiregistry + + @table @gcctabopt + @item --help + Print a help message, then exit. + + @item --version + Print version information, then exit. + @end table + + @c man end + + + @node About CNI + @chapter About CNI + + This documents CNI, the Cygnus Native Interface, + which is is a convenient way to write Java native methods using C++. + This is a more efficient, more convenient, but less portable + alternative to the standard JNI (Java Native Interface). + + @menu + * Basic concepts:: Introduction to using CNI@. + * Packages:: How packages are mapped to C++. + * Primitive types:: Handling Java types in C++. + * Interfaces:: How Java interfaces map to C++. + * Objects and Classes:: C++ and Java classes. + * Class Initialization:: How objects are initialized. + * Object allocation:: How to create Java objects in C++. + * Arrays:: Dealing with Java arrays in C++. + * Methods:: Java methods in C++. + * Strings:: Information about Java Strings. + * Mixing with C++:: How CNI can interoperate with C++. + * Exception Handling:: How exceptions are handled. + * Synchronization:: Synchronizing between Java and C++. + * Invocation:: Starting the Java runtime from C++. + * Reflection:: Using reflection from C++. + @end menu + + + @node Basic concepts + @section Basic concepts + + In terms of languages features, Java is mostly a subset + of C++. Java has a few important extensions, plus a powerful standard + class library, but on the whole that does not change the basic similarity. + Java is a hybrid object-oriented language, with a few native types, + in addition to class types. It is class-based, where a class may have + static as well as per-object fields, and static as well as instance methods. + Non-static methods may be virtual, and may be overloaded. Overloading is + resolved at compile time by matching the actual argument types against + the parameter types. Virtual methods are implemented using indirect calls + through a dispatch table (virtual function table). Objects are + allocated on the heap, and initialized using a constructor method. + Classes are organized in a package hierarchy. + + All of the listed attributes are also true of C++, though C++ has + extra features (for example in C++ objects may be allocated not just + on the heap, but also statically or in a local stack frame). Because + @command{gcj} uses the same compiler technology as G++ (the GNU + C++ compiler), it is possible to make the intersection of the two + languages use the same ABI (object representation and calling + conventions). The key idea in CNI is that Java objects are C++ + objects, and all Java classes are C++ classes (but not the other way + around). So the most important task in integrating Java and C++ is to + remove gratuitous incompatibilities. + + You write CNI code as a regular C++ source file. (You do have to use + a Java/CNI-aware C++ compiler, specifically a recent version of G++.) + + @noindent A CNI C++ source file must have: + + @example + #include + @end example + + @noindent and then must include one header file for each Java class it uses, e.g.: + + @example + #include + #include + #include + @end example + + @noindent These header files are automatically generated by @code{gcjh}. + + + CNI provides some functions and macros to make using Java objects and + primitive types from C++ easier. In general, these CNI functions and + macros start with the @code{Jv} prefix, for example the function + @code{JvNewObjectArray}. This convention is used to avoid conflicts + with other libraries. Internal functions in CNI start with the prefix + @code{_Jv_}. You should not call these; if you find a need to, let us + know and we will try to come up with an alternate solution. (This + manual lists @code{_Jv_AllocBytes} as an example; CNI should instead + provide a @code{JvAllocBytes} function.) + + + @subsection Limitations + + Whilst a Java class is just a C++ class that doesn't mean that you are + freed from the shackles of Java, a @acronym{CNI} C++ class must adhere to the + rules of the Java programming language. + + For example: it is not possible to declare a method in a CNI class + that will take a C string (@code{char*}) as an argument, or to declare a + member variable of some non-Java datatype. + + + @node Packages + @section Packages + + The only global names in Java are class names, and packages. A + @dfn{package} can contain zero or more classes, and also zero or more + sub-packages. Every class belongs to either an unnamed package or a + package that has a hierarchical and globally unique name. + + A Java package is mapped to a C++ @dfn{namespace}. The Java class + @code{java.lang.String} is in the package @code{java.lang}, which is a + sub-package of @code{java}. The C++ equivalent is the class + @code{java::lang::String}, which is in the namespace @code{java::lang} + which is in the namespace @code{java}. + + @noindent Here is how you could express this: + + @example + (// @r{Declare the class(es), possibly in a header file:} + namespace java @{ + namespace lang @{ + class Object; + class String; + ... + @} + @} + + class java::lang::String : public java::lang::Object + @{ + ... + @}; + @end example + + @noindent The @code{gcjh} tool automatically generates the nessary namespace + declarations. + + + @subsection Leaving out package names + + Always using the fully-qualified name of a java class can be + tiresomely verbose. Using the full qualified name also ties the code + to a single package making code changes necessary should the class + move from one package to another. The Java @code{package} declaration + specifies that the following class declarations are in the named + package, without having to explicitly name the full package + qualifiers. The @code{package} declaration can be + followed by zero or more @code{import} declarations, which + allows either a single class or all the classes in a package to be + named by a simple identifier. C++ provides something similar with the + @code{using} declaration and directive. + + @noindent In Java: + + @example + import @var{package-name}.@var{class-name}; + @end example + + @noindent allows the program text to refer to @var{class-name} as a shorthand for + the fully qualified name: @code{@var{package-name}.@var{class-name}}. + + + @noindent To achieve the same effect C++, you have to do this: + + @example + using @var{package-name}::@var{class-name}; + @end example + + + @noindent Java can also cause imports on demand, like this: + + @example + import @var{package-name}.*; + @end example + + @noindent Doing this allows any class from the package @var{package-name} to be + refered to only by its class-name within the program text. + + + @noindent The same effect can be achieved in C++ like this: + + @example + using namespace @var{package-name}; + @end example + + + @node Primitive types + @section Primitive types + + Java provides 8 @dfn{primitives} types which represent integers, floats, + characters and booleans (and also the void type). C++ has its own + very similar concrete types. Such types in C++ however are not always + implemented in the same way (an int might be 16, 32 or 64 bits for example) + so CNI provides a special C++ type for each primitive Java type: + + @multitable @columnfractions .20 .25 .60 + @item @strong{Java type} @tab @strong{C/C++ typename} @tab @strong{Description} + @item @code{char} @tab @code{jchar} @tab 16 bit Unicode character + @item @code{boolean} @tab @code{jboolean} @tab logical (true or false) values + @item @code{byte} @tab @code{jbyte} @tab 8-bit signed integer + @item @code{short} @tab @code{jshort} @tab 16 bit signed integer + @item @code{int} @tab @code{jint} @tab 32 bit signed integer + @item @code{long} @tab @code{jlong} @tab 64 bit signed integer + @item @code{float} @tab @code{jfloat} @tab 32 bit IEEE floating point number + @item @code{double} @tab @code{jdouble} @tab 64 bit IEEE floating point number + @item @code{void} @tab @code{void} @tab no value + @end multitable + + When refering to a Java type You should always use these C++ typenames (e.g.: @code{jint}) + to avoid disappointment. + + + @subsection Reference types associated with primitive types + + In Java each primitive type has an associated reference type, + e.g.: @code{boolean} has an associated @code{java.lang.Boolean} class. + In order to make working with such classes easier GCJ provides the macro + @code{JvPrimClass}: + + @deffn macro JvPrimClass type + Return a pointer to the @code{Class} object corresponding to the type supplied. + + @example + JvPrimClass(void) @result{} java.lang.Void.TYPE + @end example + + @end deffn + + + @node Interfaces + @section Interfaces + + A Java class can @dfn{implement} zero or more + @dfn{interfaces}, in addition to inheriting from + a single base class. + + @acronym{CNI} allows CNI code to implement methods of interfaces. + You can also call methods through interface references, with some + limitations. + + @acronym{CNI} doesn't understand interface inheritance at all yet. So, + you can only call an interface method when the declared type of the + field being called matches the interface which declares that + method. The workaround is to cast the interface reference to the right + superinterface. + + For example if you have: + + @example + interface A + @{ + void a(); + @} + + interface B extends A + @{ + void b(); + @} + @end example + + and declare a variable of type @code{B} in C++, you can't call + @code{a()} unless you cast it to an @code{A} first. + + @node Objects and Classes + @section Objects and Classes + + @subsection Classes + + All Java classes are derived from @code{java.lang.Object}. C++ does + not have a unique root class, but we use the C++ class + @code{java::lang::Object} as the C++ version of the + @code{java.lang.Object} Java class. All other Java classes are mapped + into corresponding C++ classes derived from @code{java::lang::Object}. + + Interface inheritance (the @code{implements} keyword) is currently not + reflected in the C++ mapping. + + + @subsection Object fields + + Each object contains an object header, followed by the instance fields + of the class, in order. The object header consists of a single + pointer to a dispatch or virtual function table. (There may be extra + fields @emph{in front of} the object, for example for memory + management, but this is invisible to the application, and the + reference to the object points to the dispatch table pointer.) + + The fields are laid out in the same order, alignment, and size as in + C++. Specifically, 8-bite and 16-bit native types (@code{byte}, + @code{short}, @code{char}, and @code{boolean}) are @emph{not} widened + to 32 bits. Note that the Java VM does extend 8-bit and 16-bit types + to 32 bits when on the VM stack or temporary registers. + + If you include the @code{gcjh}-generated header for a + class, you can access fields of Java classes in the @emph{natural} + way. For example, given the following Java class: + + @example + public class Int + @{ + public int i; + public Integer (int i) @{ this.i = i; @} + public static zero = new Integer(0); + @} + @end example + + you can write: + + @example + #include ; + #include ; + + Int* + mult (Int *p, jint k) + @{ + if (k == 0) + return Int::zero; // @r{Static member access.} + return new Int(p->i * k); + @} + @end example + + + @subsection Access specifiers + + CNI does not strictly enforce the Java access + specifiers, because Java permissions cannot be directly mapped + into C++ permission. Private Java fields and methods are mapped + to private C++ fields and methods, but other fields and methods + are mapped to public fields and methods. + + + + @node Class Initialization + @section Class Initialization + + Java requires that each class be automatically initialized at the time + of the first active use. Initializing a class involves + initializing the static fields, running code in class initializer + methods, and initializing base classes. There may also be + some implementation specific actions, such as allocating + @code{String} objects corresponding to string literals in + the code. + + The GCJ compiler inserts calls to @code{JvInitClass} at appropriate + places to ensure that a class is initialized when required. The C++ + compiler does not insert these calls automatically---it is the + programmer's responsibility to make sure classes are initialized. + However, this is fairly painless because of the conventions assumed by + the Java system. + + First, @code{libgcj} will make sure a class is initialized + before an instance of that object is created. This is one + of the responsibilities of the @code{new} operation. This is + taken care of both in Java code, and in C++ code. (When the G++ + compiler sees a @code{new} of a Java class, it will call + a routine in @code{libgcj} to allocate the object, and that + routine will take care of initializing the class.) It follows that you can + access an instance field, or call an instance (non-static) + method and be safe in the knowledge that the class and all + of its base classes have been initialized. + + Invoking a static method is also safe. This is because the + Java compiler adds code to the start of a static method to make sure + the class is initialized. However, the C++ compiler does not + add this extra code. Hence, if you write a native static method + using CNI, you are responsible for calling @code{JvInitClass} + before doing anything else in the method (unless you are sure + it is safe to leave it out). + + Accessing a static field also requires the class of the + field to be initialized. The Java compiler will generate code + to call @code{Jv_InitClass} before getting or setting the field. + However, the C++ compiler will not generate this extra code, + so it is your responsibility to make sure the class is + initialized before you access a static field from C++. + + + @node Object allocation + @section Object allocation + + New Java objects are allocated using a + @dfn{class instance creation expression}, e.g.: + + @example + new @var{Type} ( ... ) + @end example + + The same syntax is used in C++. The main difference is that + C++ objects have to be explicitly deleted; in Java they are + automatically deleted by the garbage collector. + Using @acronym{CNI}, you can allocate a new Java object + using standard C++ syntax and the C++ compiler will allocate + memory from the garbage collector. If you have overloaded + constructors, the compiler will choose the correct one + using standard C++ overload resolution rules. + + @noindent For example: + + @example + java::util::Hashtable *ht = new java::util::Hashtable(120); + @end example + + @deftypefun void* _Jv_AllocBytes (jsize @var{size}) + Allocates @var{size} bytes from the heap. The memory is not scanned + by the garbage collector but it freed if no references to it are discovered. + @end deftypefun + + + @node Arrays + @section Arrays + + While in many ways Java is similar to C and C++, it is quite different + in its treatment of arrays. C arrays are based on the idea of pointer + arithmetic, which would be incompatible with Java's security + requirements. Java arrays are true objects (array types inherit from + @code{java.lang.Object}). An array-valued variable is one that + contains a reference (pointer) to an array object. + + Referencing a Java array in C++ code is done using the + @code{JArray} template, which as defined as follows: + + @example + class __JArray : public java::lang::Object + @{ + public: + int length; + @}; + + template + class JArray : public __JArray + @{ + T data[0]; + public: + T& operator[](jint i) @{ return data[i]; @} + @}; + @end example + + + There are a number of @code{typedef}s which correspond to @code{typedef}s + from the @acronym{JNI}. Each is the type of an array holding objects + of the relevant type: + + @example + typedef __JArray *jarray; + typedef JArray *jobjectArray; + typedef JArray *jbooleanArray; + typedef JArray *jbyteArray; + typedef JArray *jcharArray; + typedef JArray *jshortArray; + typedef JArray *jintArray; + typedef JArray *jlongArray; + typedef JArray *jfloatArray; + typedef JArray *jdoubleArray; + @end example + + + @deftypemethod {template} T* elements (JArray @var{array}) + This template function can be used to get a pointer to the elements of + the @code{array}. For instance, you can fetch a pointer to the + integers that make up an @code{int[]} like so: + + @example + extern jintArray foo; + jint *intp = elements (foo); + @end example + + The name of this function may change in the future. + @end deftypemethod + + + @deftypefun jobjectArray JvNewObjectArray (jsize @var{length}, jclass @var{klass}, jobject @var{init}) + Here @code{klass} is the type of elements of the array and + @code{init} is the initial value put into every slot in the array. + @end deftypefun + + + @subsection Creating arrays + + For each primitive type there is a function which can be used to + create a new array of that type. The name of the function is of the + form: + + @example + JvNew@var{Type}Array + @end example + + @noindent For example: + + @example + JvNewBooleanArray + @end example + + @noindent can be used to create an array of Java primitive boolean types. + + @noindent The following function definition is the template for all such functions: + + @deftypefun jbooleanArray JvNewBooleanArray (jint @var{length}) + Create's an array @var{length} indices long. + @end deftypefun + + @deftypefun jsize JvGetArrayLength (jarray @var{array}) + Returns the length of the @var{array}. + @end deftypefun + + + @node Methods + @section Methods + + Java methods are mapped directly into C++ methods. + The header files generated by @code{gcjh} + include the appropriate method definitions. + Basically, the generated methods have the same names and + @emph{corresponding} types as the Java methods, + and are called in the natural manner. + + @subsection Overloading + + Both Java and C++ provide method overloading, where multiple + methods in a class have the same name, and the correct one is chosen + (at compile time) depending on the argument types. + The rules for choosing the correct method are (as expected) more complicated + in C++ than in Java, but given a set of overloaded methods + generated by @code{gcjh} the C++ compiler will choose + the expected one. + + Common assemblers and linkers are not aware of C++ overloading, + so the standard implementation strategy is to encode the + parameter types of a method into its assembly-level name. + This encoding is called @dfn{mangling}, + and the encoded name is the @dfn{mangled name}. + The same mechanism is used to implement Java overloading. + For C++/Java interoperability, it is important that both the Java + and C++ compilers use the @emph{same} encoding scheme. + + @subsection Static methods + + Static Java methods are invoked in @acronym{CNI} using the standard + C++ syntax, using the @code{::} operator rather + than the @code{.} operator. + + @noindent For example: + + @example + jint i = java::lang::Math::round((jfloat) 2.3); + @end example + + @noindent C++ method definition syntax is used to define a static native method. + For example: + + @example + #include + java::lang::Integer* + java::lang::Integer::getInteger(jstring str) + @{ + ... + @} + @end example + + + @subsection Object Constructors + + Constructors are called implicitly as part of object allocation + using the @code{new} operator. + + @noindent For example: + + @example + java::lang::Integer *x = new java::lang::Integer(234); + @end example + + Java does not allow a constructor to be a native method. + This limitation can be coded round however because a constructor + can @emph{call} a native method. + + + @subsection Instance methods + + Calling a Java instance method from a C++ @acronym{CNI} method is done + using the standard C++ syntax, e.g.: + + @example + // @r{First create the Java object.} + java::lang::Integer *x = new java::lang::Integer(234); + // @r{Now call a method.} + jint prim_value = x->intValue(); + if (x->longValue == 0) + ... + @end example + + @noindent Defining a Java native instance method is also done the natural way: + + @example + #include + + jdouble + java::lang:Integer::doubleValue() + @{ + return (jdouble) value; + @} + @end example + + + @subsection Interface methods + + In Java you can call a method using an interface reference. This is + supported, but not completly. @xref{Interfaces}. + + + + + @node Strings + @section Strings + + @acronym{CNI} provides a number of utility functions for + working with Java Java @code{String} objects. + The names and interfaces are analogous to those of @acronym{JNI}. + + + @deftypefun jstring JvNewString (const char* @var{chars}, jsize @var{len}) + Returns a Java @code{String} object with characters from the C string + @var{chars} up to the index @var{len} in that array. + @end deftypefun + + @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes}, jsize @var{len}) + Returns a Java @code{String} made up of @var{len} bytes from @var{bytes}. + @end deftypefun + + + @deftypefun jstring JvNewStringLatin1 (const char* @var{bytes}) + As above but the length of the @code{String} is @code{strlen(@var{bytes})}. + @end deftypefun + + @deftypefun jstring JvNewStringUTF (const char* @var{bytes}) + Returns a @code{String} which is made up of the UTF encoded characters + present in the C string @var{bytes}. + @end deftypefun + + @deftypefun jchar* JvGetStringChars (jstring @var{str}) + Returns a pointer to an array of characters making up the @code{String} @var{str}. + @end deftypefun + + @deftypefun int JvGetStringUTFLength (jstring @var{str}) + Returns the number of bytes required to encode the contents of the + @code{String} @var{str} in UTF-8. + @end deftypefun + + @deftypefun jsize JvGetStringUTFRegion (jstring @var{str}, jsize @var{start}, jsize @var{len}, char* @var{buf}) + Puts the UTF-8 encoding of a region of the @code{String} @var{str} into + the buffer @code{buf}. The region to fetch is marked by @var{start} and @var{len}. + + Note that @var{buf} is a buffer, not a C string. It is @emph{not} + null terminated. + @end deftypefun + + + @node Mixing with C++ + @section Interoperating with C/C++ + + Because @acronym{CNI} is designed to represent Java classes and methods it + cannot be mixed readily with C/C++ types. + + One important restriction is that Java classes cannot have non-Java + type instance or static variables and cannot have methods which take + non-Java types as arguments or return non-Java types. + + @noindent None of the following is possible with CNI: + + @example + + class ::MyClass : public java::lang::Object + @{ + char* variable; // @r{char* is not a valid Java type.} + @} + + + uint + ::SomeClass::someMethod (char *arg) + @{ + . + . + . + @} // @r{@code{uint} is not a valid Java type, neither is @code{char*}} + @end example + + @noindent Of course, it is ok to use C/C++ types within the scope of a method: + + + @example + jint + ::SomeClass::otherMethod (jstring str) + @{ + char *arg = ... + . + . + . + @} + @end example + + But this restriction can cause a problem so @acronym{CNI} includes the + @code{gnu.gcj.RawData} class. The @code{RawData} class is a + @dfn{non-scanned reference} type. In other words variables declared + of type @code{RawData} can contain any data and are not checked by the + compiler in any way. + + This means that you can put C/C++ data structures (including classes) + in your @acronym{CNI} classes, as long as you use the appropriate cast. + + @noindent Here are some examples: + + @example + + class ::MyClass : public java::lang::Object + @{ + gnu.gcj.RawData string; + + MyClass (); + gnu.gcj.RawData getText (); + void printText (); + @} + + ::MyClass::MyClass () + @{ + char* text = ... + string = text; + @} + + gnu.gcj.RawData + ::MyClass::getText () + @{ + return string; + @} + + void + ::MyClass::printText () + @{ + printf("%s\n", (char*) string); + @} + @end example + + + @node Exception Handling + @section Exception Handling + + While C++ and Java share a common exception handling framework, + things are not yet perfectly integrated. The main issue is that the + run-time type information facilities of the two + languages are not integrated. + + Still, things work fairly well. You can throw a Java exception from + C++ using the ordinary @code{throw} construct, and this + exception can be caught by Java code. Similarly, you can catch an + exception thrown from Java using the C++ @code{catch} + construct. + + @noindent Here is an example: + + @example + if (i >= count) + throw new java::lang::IndexOutOfBoundsException(); + @end example + + Normally, G++ will automatically detect when you are writing C++ + code that uses Java exceptions, and handle them appropriately. + However, if C++ code only needs to execute destructors when Java + exceptions are thrown through it, GCC will guess incorrectly. Sample + problematic code: + + @example + struct S @{ ~S(); @}; + + extern void bar(); // @r{Is implemented in Java and may throw exceptions.} + + void foo() + @{ + S s; + bar(); + @} + @end example + + The usual effect of an incorrect guess is a link failure, complaining of + a missing routine called @code{__gxx_personality_v0}. + + You can inform the compiler that Java exceptions are to be used in a + translation unit, irrespective of what it might think, by writing + @code{#pragma GCC java_exceptions} at the head of the + file. This @code{#pragma} must appear before any + functions that throw or catch exceptions, or run destructors when + exceptions are thrown through them. + + @node Synchronization + @section Synchronization + + Each Java object has an implicit monitor. + The Java VM uses the instruction @code{monitorenter} to acquire + and lock a monitor, and @code{monitorexit} to release it. + + The corresponding CNI macros are @code{JvMonitorEnter} and + @code{JvMonitorExit} (JNI has similar methods @code{MonitorEnter} + and @code{MonitorExit}). + + + The Java source language does not provide direct access to these primitives. + Instead, there is a @code{synchronized} statement that does an + implicit @code{monitorenter} before entry to the block, + and does a @code{monitorexit} on exit from the block. + Note that the lock has to be released even when the block is abnormally + terminated by an exception, which means there is an implicit + @code{try finally} surrounding synchronization locks. + + From C++, it makes sense to use a destructor to release a lock. + @acronym{CNI} defines the following utility class: + + @example + class JvSynchronize() @{ + jobject obj; + JvSynchronize(jobject o) @{ obj = o; JvMonitorEnter(o); @} + ~JvSynchronize() @{ JvMonitorExit(obj); @} + @}; + @end example + + So this Java code: + + @example + synchronized (OBJ) + @{ + CODE + @} + @end example + + @noindent might become this C++ code: + + @example + @{ + JvSynchronize dummy (OBJ); + CODE; + @} + @end example + + Java also has methods with the @code{synchronized} attribute. + This is equivalent to wrapping the entire method body in a + @code{synchronized} statement. + (Alternatively, an implementation could require the caller to do + the synchronization. This is not practical for a compiler, because + each virtual method call would have to test at run-time if + synchronization is needed.) Since in @command{gcj} + the @code{synchronized} attribute is handled by the + method implementation, it is up to the programmer + of a synchronized native method to handle the synchronization + (in the C++ implementation of the method). + In otherwords, you need to manually add @code{JvSynchronize} + in a @code{native synchornized} method. + + @node Invocation + @section Invocation + + CNI permits C++ applications to make calls into Java classes, in addition to + allowing Java code to call into C++. Several functions, known as the + @dfn{invocation API}, are provided to support this. + + @deftypefun jint JvCreateJavaVM (void* @var{vm_args}) + Initializes the Java runtime. This function performs essential initialization + of the threads interface, garbage collector, exception handling and other key + aspects of the runtime. It must be called once by an application with + a non-Java @code{main()} function, before any other Java or CNI calls are made. + It is safe, but not recommended, to call @code{JvCreateJavaVM()} more than + once provided it is only called from a single thread. + The @var{vmargs} parameter can be used to specify initialization parameters + for the Java runtime. It may be @code{NULL}. + This function returns @code{0} upon success, or @code{-1} if the runtime is + already initialized. + + @emph{Note:} In GCJ 3.1, the @code{vm_args} parameter is ignored. It may be + used in a future release. + @end deftypefun + + @deftypefun java::lang::Thread* JvAttachCurrentThread (jstring @var{name}, java::lang::ThreadGroup* @var{group}) + Registers an existing thread with the Java runtime. This must be called once + from each thread, before that thread makes any other Java or CNI calls. It + must be called after @code{JvCreateJavaVM}. + @var{name} specifies a name for the thread. It may be @code{NULL}, in which + case a name will be generated. + @var{group} is the ThreadGroup in which this thread will be a member. If it + is @code{NULL}, the thread will be a member of the main thread group. + The return value is the Java @code{Thread} object that represents the thread. + It is safe to call @code{JvAttachCurrentThread()} more than once from the same + thread. If the thread is already attached, the call is ignored and the current + thread object is returned. + @end deftypefun + + @deftypefun jint JvDetachCurrentThread () + Unregisters a thread from the Java runtime. This should be called by threads + that were attached using @code{JvAttachCurrentThread()}, after they have + finished making calls to Java code. This ensures that any resources associated + with the thread become eligible for garbage collection. + This function returns @code{0} upon success, or @code{-1} if the current thread + is not attached. + @end deftypefun + + @subsection Handling uncaught exceptions + + If an exception is thrown from Java code called using the invocation API, and + no handler for the exception can be found, the runtime will abort the + application. In order to make the application more robust, it is recommended + that code which uses the invocation API be wrapped by a top-level try/catch + block that catches all Java exceptions. + + @subsection Example + + The following code demonstrates the use of the invocation API. In this + example, the C++ application initializes the Java runtime and attaches + itself. The @code{java.lang.System} class is initialized in order to + access its @code{out} field, and a Java string is printed. Finally, the thread + is detached from the runtime once it has finished making Java calls. Everything + is wrapped with a try/catch block to provide a default handler for any uncaught + exceptions. + + The example can be compiled with @command{c++ test.cc -lgcj}. + + @example + // test.cc + #include + #include + #include + #include + + int main(int argc, char *argv) + @{ + using namespace java::lang; + + try + @{ + JvCreateJavaVM(NULL); + JvAttachCurrentThread(NULL, NULL); + + String *message = JvNewStringLatin1("Hello from C++"); + JvInitClass(&System.class$); + System::out->println(message); + + JvDetachCurrentThread(); + @} + catch (Throwable *t) + @{ + System::err->println(JvNewStringLatin1("Unhandled Java exception:")); + t->printStackTrace(); + @} + @} + @end example + + @node Reflection + @section Reflection + + Reflection is possible with CNI code, it functions similarly to how it + functions with JNI@. + + @c clean this up... I mean, what are the types jfieldID and jmethodID in JNI? + The types @code{jfieldID} and @code{jmethodID} + are as in JNI@. + + @noindent The functions: + + @itemize + @item @code{JvFromReflectedField}, + @item @code{JvFromReflectedMethod}, + @item @code{JvToReflectedField} + @item @code{JvToFromReflectedMethod} + @end itemize + + @noindent will be added shortly, as will other functions corresponding to JNI@. + + @node Resources @chapter Resources ! While writing @command{gcj} and @code{libgcj} we have, of course, relied heavily on documentation from Sun Microsystems. In particular we have used The Java Language Specification (both first and second editions), the Java Class Libraries (volumes one and two), and the Java Virtual Machine Specification. In addition we've used the online documentation at @uref{http://java.sun.com/}. ! The current @command{gcj} home page is @uref{http://gcc.gnu.org/java/}. For more information on gcc, see @uref{http://gcc.gnu.org/}. diff -Nrc3pad gcc-3.0.4/gcc/java/gcjh.1 gcc-3.1/gcc/java/gcjh.1 *** gcc-3.0.4/gcc/java/gcjh.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/gcjh.1 Wed May 15 02:46:01 2002 *************** *** 0 **** --- 1,247 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:01 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "GCJH 1" + .TH GCJH 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + gcjh \- generate header files from Java class files + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + gcjh [\fB\-stubs\fR] [\fB\-jni\fR] + [\fB\-add\fR \fItext\fR] [\fB\-append\fR \fItext\fR] [\fB\-friend\fR \fItext\fR] + [\fB\-preprend\fR \fItext\fR] + [\fB\*(--classpath\fR=\fIpath\fR] [\fB\*(--CLASSPATH\fR=\fIpath\fR] + [\fB\-I\fR\fIdir\fR...] [\fB\-d\fR \fIdir\fR...] + [\fB\-o\fR \fIfile\fR] [\fB\-td\fR \fIdir\fR] + [\fB\-M\fR] [\fB\-MM\fR] [\fB\-MD\fR] [\fB\-MMD\fR] + [\fB\*(--version\fR] [\fB\*(--help\fR] [\fB\-v\fR] [\fB\*(--verbose\fR] + \fIclassname\fR... + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + The \f(CW\*(C`gcjh\*(C'\fR program is used to generate header files from class + files. It can generate both \s-1CNI\s0 and \s-1JNI\s0 header files, as well as stub + implementation files which can be used as a basis for implementing the + required native methods. + .SH "OPTIONS" + .IX Header "OPTIONS" + .Ip "\fB\-stubs\fR" 4 + .IX Item "-stubs" + This causes \f(CW\*(C`gcjh\*(C'\fR to generate stub files instead of header files. + By default the stub file will be named after the class, with a suffix of + \&\fB.cc\fR. In \s-1JNI\s0 mode, the default output file will have the suffix + \&\fB.c\fR. + .Ip "\fB\-jni\fR" 4 + .IX Item "-jni" + This tells \f(CW\*(C`gcjh\*(C'\fR to generate a \s-1JNI\s0 header or stub. By default, + \&\s-1CNI\s0 headers are generated. + .Ip "\fB\-add\fR \fItext\fR" 4 + .IX Item "-add text" + Inserts \fItext\fR into the class body. This is ignored in \s-1JNI\s0 mode. + .Ip "\fB\-append\fR \fItext\fR" 4 + .IX Item "-append text" + Inserts \fItext\fR into the header file after the class declaration. + This is ignored in \s-1JNI\s0 mode. + .Ip "\fB\-friend\fR \fItext\fR" 4 + .IX Item "-friend text" + Inserts \fItext\fR into the class as a \f(CW\*(C`friend\*(C'\fR declaration. + This is ignored in \s-1JNI\s0 mode. + .Ip "\fB\-prepend\fR \fItext\fR" 4 + .IX Item "-prepend text" + Inserts \fItext\fR into the header file before the class declaration. + This is ignored in \s-1JNI\s0 mode. + .Ip "\fB\*(--classpath=\fR\fIpath\fR" 4 + .IX Item "classpath=path" + .PD 0 + .Ip "\fB\*(--CLASSPATH=\fR\fIpath\fR" 4 + .IX Item "CLASSPATH=path" + .Ip "\fB\-I\fR\fIdirectory\fR" 4 + .IX Item "-Idirectory" + .Ip "\fB\-d\fR \fIdirectory\fR" 4 + .IX Item "-d directory" + .Ip "\fB\-o\fR \fIfile\fR" 4 + .IX Item "-o file" + .PD + These options are all identical to the corresponding \fBgcj\fR options. + .Ip "\fB\-o\fR \fIfile\fR" 4 + .IX Item "-o file" + Sets the output file name. This cannot be used if there is more than + one class on the command line. + .Ip "\fB\-td\fR \fIdirectory\fR" 4 + .IX Item "-td directory" + Sets the name of the directory to use for temporary files. + .Ip "\fB\-M\fR" 4 + .IX Item "-M" + Print all dependencies to stdout; suppress ordinary output. + .Ip "\fB\-MM\fR" 4 + .IX Item "-MM" + Print non-system dependencies to stdout; suppress ordinary output. + .Ip "\fB\-MD\fR" 4 + .IX Item "-MD" + Print all dependencies to stdout. + .Ip "\fB\-MMD\fR" 4 + .IX Item "-MMD" + Print non-system dependencies to stdout. + .Ip "\fB\*(--help\fR" 4 + .IX Item "help" + Print help about \f(CW\*(C`gcjh\*(C'\fR and exit. No further processing is done. + .Ip "\fB\*(--version\fR" 4 + .IX Item "version" + Print version information for \f(CW\*(C`gcjh\*(C'\fR and exit. No further + processing is done. + .Ip "\fB\-v, \-\-verbose\fR" 4 + .IX Item "-v, --verbose" + Print extra information while running. + .PP + All remaining options are considered to be names of classes. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + \&\fIgcc\fR\|(1), \fIgcj\fR\|(1), \fIgij\fR\|(1), \fIjv-scan\fR\|(1), \fIjcf-dump\fR\|(1), \fIgfdl\fR\|(7), + and the Info entries for \fIgcj\fR and \fIgcc\fR. + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/gen-table.pl gcc-3.1/gcc/java/gen-table.pl *** gcc-3.0.4/gcc/java/gen-table.pl Wed Dec 13 22:47:13 2000 --- gcc-3.1/gcc/java/gen-table.pl Sat Dec 29 04:31:10 2001 *************** *** 1,6 **** #! /usr/bin/perl ! # Copyright (C) 2000 Free Software Foundation # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by --- 1,6 ---- #! /usr/bin/perl ! # Copyright (C) 2000, 2001 Free Software Foundation # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by *************** *** 19,24 **** --- 19,32 ---- # gen-table.pl - Generate tables for gcj from Unicode data. # Usage: perl gen-table.pl DATA-FILE + # + # You can find the Unicode data file here: + # ftp://www.unicode.org/Public/3.0-Update1/UnicodeData-3.0.1.txt + # Please update this URL when this program is used with a more + # recent version of the table. Note that this table cannot be + # distributed with gcc. + # This program should not be re-run indiscriminately. Care must be + # taken that what it generates is in sync with the Java specification. # Names of fields in Unicode data table. $CODE = 0; *************** while () *** 76,81 **** --- 84,90 ---- } $code = hex ($fields[$CODE]); + last if $code > 0xffff; if ($code > $last_code + 1) { # Found a gap. *************** sub print_tables *** 183,201 **** print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; print OUT " Instead, edit gen-table.pl and re-run. */\n\n"; ! print OUT "#ifndef CHARTABLES_H\n"; ! print OUT "#define CHARTABLES_H\n\n"; print OUT "#define LETTER_START 1\n"; print OUT "#define LETTER_PART 2\n\n"; for ($count = 0; $count <= $last; $count += 256) { ! $row[$count / 256] = &print_row ($count, '(char *) ', 'char', 1, 'page'); } ! print OUT "static char *type_table[256] = {\n"; for ($count = 0; $count <= $last; $count += 256) { print OUT ",\n" if $count > 0; --- 192,210 ---- print OUT "/* This file is automatically generated. DO NOT EDIT!\n"; print OUT " Instead, edit gen-table.pl and re-run. */\n\n"; ! print OUT "#ifndef GCC_CHARTABLES_H\n"; ! print OUT "#define GCC_CHARTABLES_H\n\n"; print OUT "#define LETTER_START 1\n"; print OUT "#define LETTER_PART 2\n\n"; for ($count = 0; $count <= $last; $count += 256) { ! $row[$count / 256] = &print_row ($count, '(char *) ', 'const char', 1, 'page'); } ! print OUT "static const char *const type_table[256] = {\n"; for ($count = 0; $count <= $last; $count += 256) { print OUT ",\n" if $count > 0; *************** sub print_tables *** 204,210 **** } print OUT "\n};\n\n"; ! print OUT "#endif /* CHARTABLES_H */\n"; close (OUT); --- 213,219 ---- } print OUT "\n};\n\n"; ! print OUT "#endif /* ! GCC_CHARTABLES_H */\n"; close (OUT); diff -Nrc3pad gcc-3.0.4/gcc/java/gij.1 gcc-3.1/gcc/java/gij.1 *** gcc-3.0.4/gcc/java/gij.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/gij.1 Wed May 15 02:46:02 2002 *************** *** 0 **** --- 1,218 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:02 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "GIJ 1" + .TH GIJ 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + gij \- \s-1GNU\s0 interpreter for Java bytecode + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + gij [\fB\s-1OPTION\s0\fR] ... \fI\s-1JARFILE\s0\fR [\fI\s-1ARGS\s0\fR...] + .PP + gij [\fB\-jar\fR] [\fB\s-1OPTION\s0\fR] ... \fI\s-1CLASS\s0\fR [\fI\s-1ARGS\s0\fR...] + [\fB\-D\fR\fIname\fR[=\fIvalue\fR]...] + [\fB\-ms=\fR\fInumber\fR] [\fB\-mx=\fR\fInumber\fR] + [\fB\*(--version\fR] [\fB\*(--help\fR] + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + \&\f(CW\*(C`gij\*(C'\fR is a Java bytecode interpreter included with \f(CW\*(C`libgcj\*(C'\fR. + \&\f(CW\*(C`gij\*(C'\fR is not available on every platform; porting it requires a + small amount of assembly programming which has not been done for all the + targets supported by \fBgcj\fR. + .PP + The primary argument to \f(CW\*(C`gij\*(C'\fR is the name of a class or, with + \&\f(CW\*(C`\-jar\*(C'\fR, a jar file. Options before this argument are interpreted + by \f(CW\*(C`gij\*(C'\fR; remaining options are passed to the interpreted program. + .PP + If a class name is specified and this class does not have a \f(CW\*(C`main\*(C'\fR + method with the appropriate signature (a \f(CW\*(C`static void\*(C'\fR method with + a \f(CW\*(C`String[]\*(C'\fR as its sole argument), then \f(CW\*(C`gij\*(C'\fR will print an + error and exit. + .PP + If a jar file is specified then \f(CW\*(C`gij\*(C'\fR will use information in it to + determine which class' \f(CW\*(C`main\*(C'\fR method will be invoked. + .PP + \&\f(CW\*(C`gij\*(C'\fR will invoke the \f(CW\*(C`main\*(C'\fR method with all the remaining + command-line options. + .PP + Note that \f(CW\*(C`gij\*(C'\fR is not limited to interpreting code. Because + \&\f(CW\*(C`libgcj\*(C'\fR includes a class loader which can dynamically load shared + objects, it is possible to give \f(CW\*(C`gij\*(C'\fR the name of a class which has + been compiled and put into a shared library on the class path. + .SH "OPTIONS" + .IX Header "OPTIONS" + .Ip "\fB\-D\fR\fIname\fR\fB[=\fR\fIvalue\fR\fB]\fR" 4 + .IX Item "-Dname[=value]" + This defines a system property named \fIname\fR with value \fIvalue\fR. + If \fIvalue\fR is not specified then it defaults to the empty string. + These system properties are initialized at the program's startup and can + be retrieved at runtime using the \f(CW\*(C`java.lang.System.getProperty\*(C'\fR + method. + .Ip "\fB\-ms=\fR\fInumber\fR" 4 + .IX Item "-ms=number" + This sets the initial heap size. + .Ip "\fB\-mx=\fR\fInumber\fR" 4 + .IX Item "-mx=number" + This sets the maximum heap size. + .Ip "\fB\-jar\fR" 4 + .IX Item "-jar" + This indicates that the name passed to \f(CW\*(C`gij\*(C'\fR should be interpreted + as the name of a jar file, not a class. + .Ip "\fB\*(--help\fR" 4 + .IX Item "help" + Print help, then exit. + .Ip "\fB\*(--version\fR" 4 + .IX Item "version" + Print version number, then exit. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + \&\fIgcc\fR\|(1), \fIgcj\fR\|(1), \fIgcjh\fR\|(1), \fIjv-scan\fR\|(1), \fIjcf-dump\fR\|(1), \fIgfdl\fR\|(7), + and the Info entries for \fIgcj\fR and \fIgcc\fR. + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/gjavah.c gcc-3.1/gcc/java/gjavah.c *** gcc-3.0.4/gcc/java/gjavah.c Fri Mar 23 05:14:35 2001 --- gcc-3.1/gcc/java/gjavah.c Wed Apr 10 13:08:59 2002 *************** *** 1,7 **** /* Program to write C++-suitable header files from a Java(TM) .class file. This is similar to SUN's javah. ! Copyright (C) 1996, 1998, 1999, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by --- 1,7 ---- /* Program to write C++-suitable header files from a Java(TM) .class file. This is similar to SUN's javah. ! Copyright (C) 1996, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by *************** static struct method_name *method_name_l *** 120,126 **** static void print_field_info PARAMS ((FILE*, JCF*, int, int, JCF_u2)); static void print_mangled_classname PARAMS ((FILE*, JCF*, const char*, int)); static int print_cxx_classname PARAMS ((FILE*, const char*, JCF*, int)); ! static void print_method_info PARAMS ((FILE*, JCF*, int, int, JCF_u2, int)); static void print_c_decl PARAMS ((FILE*, JCF*, int, int, int, const char *, int)); static void print_stub_or_jni PARAMS ((FILE*, JCF*, int, int, int, --- 120,126 ---- static void print_field_info PARAMS ((FILE*, JCF*, int, int, JCF_u2)); static void print_mangled_classname PARAMS ((FILE*, JCF*, const char*, int)); static int print_cxx_classname PARAMS ((FILE*, const char*, JCF*, int)); ! static void print_method_info PARAMS ((FILE*, JCF*, int, int, JCF_u2)); static void print_c_decl PARAMS ((FILE*, JCF*, int, int, int, const char *, int)); static void print_stub_or_jni PARAMS ((FILE*, JCF*, int, int, int, *************** static void version PARAMS ((void)) ATTR *** 151,156 **** --- 151,157 ---- static int overloaded_jni_method_exists_p PARAMS ((const unsigned char *, int, const char *, int)); static void jni_print_char PARAMS ((FILE *, int)); + static void decompile_return_statement PARAMS ((FILE *, JCF *, int, int, int)); JCF_u2 current_field_name; JCF_u2 current_field_value; *************** static int method_declared = 0; *** 187,195 **** --- 188,201 ---- static int method_access = 0; static int method_printed = 0; static int method_synthetic = 0; + static int method_signature = 0; + #define HANDLE_METHOD(ACCESS_FLAGS, NAME, SIGNATURE, ATTRIBUTE_COUNT) \ { \ method_synthetic = 0; \ + method_printed = 0; \ + decompiled = 0; \ + method_signature = SIGNATURE; \ if (ATTRIBUTE_COUNT) \ method_synthetic = peek_attribute (jcf, ATTRIBUTE_COUNT, \ (const char *)"Synthetic", 9); \ *************** static int method_synthetic = 0; *** 204,218 **** } \ if (method_pass && !method_synthetic) \ { \ - decompiled = 0; method_printed = 0; \ if (out) \ print_method_info (out, jcf, NAME, SIGNATURE, \ ! ACCESS_FLAGS, method_synthetic); \ } \ else if (!method_synthetic) \ { \ print_method_info (NULL, jcf, NAME, SIGNATURE, \ ! ACCESS_FLAGS, method_synthetic); \ if (! stubs && ! flag_jni) \ add_class_decl (out, jcf, SIGNATURE); \ } \ --- 210,223 ---- } \ if (method_pass && !method_synthetic) \ { \ if (out) \ print_method_info (out, jcf, NAME, SIGNATURE, \ ! ACCESS_FLAGS); \ } \ else if (!method_synthetic) \ { \ print_method_info (NULL, jcf, NAME, SIGNATURE, \ ! ACCESS_FLAGS); \ if (! stubs && ! flag_jni) \ add_class_decl (out, jcf, SIGNATURE); \ } \ *************** jni_print_char (stream, ch) *** 287,295 **** fputs ("_3", stream); else if (ch == '/') fputs ("_", stream); ! else if ((ch >= '0' && ch <= '9') ! || (ch >= 'a' && ch <= 'z') ! || (ch >= 'A' && ch <= 'Z')) fputc (ch, stream); else { --- 292,298 ---- fputs ("_3", stream); else if (ch == '/') fputs ("_", stream); ! else if (ISALNUM (ch)) fputc (ch, stream); else { *************** utf8_cmp (str, length, name) *** 390,396 **** /* This is a sorted list of all C++ keywords. */ ! static const char *cxx_keywords[] = { "_Complex", "__alignof", --- 393,399 ---- /* This is a sorted list of all C++ keywords. */ ! static const char *const cxx_keywords[] = { "_Complex", "__alignof", *************** static const char *cxx_keywords[] = *** 421,429 **** "__typeof__", "__volatile", "__volatile__", - "asm", "and", "and_eq", "auto", "bitand", "bitor", --- 424,432 ---- "__typeof__", "__volatile", "__volatile__", "and", "and_eq", + "asm", "auto", "bitand", "bitor", *************** static const char *cxx_keywords[] = *** 483,490 **** "true", "try", "typedef", - "typename", "typeid", "typeof", "union", "unsigned", --- 486,493 ---- "true", "try", "typedef", "typeid", + "typename", "typeof", "union", "unsigned", *************** DEFUN(print_field_info, (stream, jcf, na *** 786,794 **** static void ! DEFUN(print_method_info, (stream, jcf, name_index, sig_index, flags, synth), FILE *stream AND JCF* jcf ! AND int name_index AND int sig_index AND JCF_u2 flags AND int synth) { const unsigned char *str; int length, is_init = 0; --- 789,797 ---- static void ! DEFUN(print_method_info, (stream, jcf, name_index, sig_index, flags), FILE *stream AND JCF* jcf ! AND int name_index AND int sig_index AND JCF_u2 flags) { const unsigned char *str; int length, is_init = 0; *************** DEFUN(print_method_info, (stream, jcf, n *** 801,810 **** str = JPOOL_UTF_DATA (jcf, name_index); length = JPOOL_UTF_LENGTH (jcf, name_index); - /* Ignore synthetic methods. */ - if (synth) - return; - if (str[0] == '<') { /* Ignore the internally generated method . However, --- 804,809 ---- *************** DEFUN(print_method_info, (stream, jcf, n *** 894,899 **** --- 893,1025 ---- free (override); } + /* A helper for the decompiler which prints a `return' statement where + the type is a reference type. If METHODTYPE and OBJECTTYPE are not + identical, we emit a cast. We do this because the C++ compiler + doesn't know that a reference can be cast to the type of an + interface it implements. METHODTYPE is the index of the method's + signature. NAMEINDEX is the index of the field name; -1 for + `this'. OBJECTTYPE is the index of the object's type. */ + static void + decompile_return_statement (out, jcf, methodtype, nameindex, objecttype) + FILE *out; + JCF *jcf; + int methodtype, nameindex, objecttype; + { + int cast = 0; + int obj_name_len, method_name_len; + const unsigned char *obj_data, *method_data; + + obj_name_len = JPOOL_UTF_LENGTH (jcf, objecttype); + obj_data = JPOOL_UTF_DATA (jcf, objecttype); + + method_name_len = JPOOL_UTF_LENGTH (jcf, methodtype); + method_data = JPOOL_UTF_DATA (jcf, methodtype); + + /* Skip forward to return type part of method. */ + while (*method_data != ')') + { + ++method_data; + --method_name_len; + } + /* Skip past `)'. */ + ++method_data; + --method_name_len; + + /* If we see an `L', skip it and the trailing `;'. */ + if (method_data[0] == 'L' && method_data[method_name_len - 1] == ';') + { + ++method_data; + method_name_len -= 2; + } + if (obj_data[0] == 'L' && obj_data[obj_name_len - 1] == ';') + { + ++obj_data; + obj_name_len -= 2; + } + + /* FIXME: if METHODTYPE is a superclass of OBJECTTYPE then we don't + need a cast. Right now there is no way to determine if this is + the case. */ + if (method_name_len != obj_name_len) + cast = 1; + else + { + int i; + for (i = 0; i < method_name_len; ++i) + { + if (method_data[i] != obj_data[i]) + { + cast = 1; + break; + } + } + } + + fputs (" { return ", out); + + if (cast) + { + int array_depth = 0; + const unsigned char *limit; + + fputs ("reinterpret_cast<", out); + + while (*method_data == '[') + { + ++method_data; + ++array_depth; + --method_name_len; + fputs ("JArray<", out); + } + + /* Leading space to avoid C++ digraphs. */ + fputs (" ::", out); + + /* If we see an `L', skip it and the trailing `;'. Only do this + if we've seen an array specification. If we don't have an + array then the `L' was stripped earlier. */ + if (array_depth && method_data[0] == 'L' + && method_data[method_name_len - 1] == ';') + { + ++method_data; + method_name_len -= 2; + } + + limit = method_data + method_name_len; + while (method_data < limit) + { + int ch = UTF8_GET (method_data, limit); + if (ch == '/') + fputs ("::", out); + else + jcf_print_char (out, ch); + } + fputs (" *", out); + + /* Close each array. */ + while (array_depth > 0) + { + fputs ("> *", out); + --array_depth; + } + + /* Close the cast. */ + fputs ("> (", out); + } + + if (nameindex == -1) + fputs ("this", out); + else + print_field_name (out, jcf, nameindex, 0); + + if (cast) + fputs (")", out); + + fputs ("; }", out); + } + + /* Try to decompile a method body. Right now we just try to handle a simple case that we can do. Expand as desired. */ static void *************** decompile_method (out, jcf, code_len) *** 920,943 **** || codes[4] == OPCODE_lreturn)) { /* Found code like `return FIELD'. */ - fputs (" { return ", out); index = (codes[2] << 8) | codes[3]; /* FIXME: ensure that tag is CONSTANT_Fieldref. */ - /* FIXME: ensure that the field's class is this class. */ name_and_type = JPOOL_USHORT2 (jcf, index); /* FIXME: ensure that tag is CONSTANT_NameAndType. */ name = JPOOL_USHORT1 (jcf, name_and_type); ! /* FIXME: flags. */ ! print_field_name (out, jcf, name, 0); ! fputs ("; }", out); decompiled = 1; } else if (code_len == 2 && codes[0] == OPCODE_aload_0 ! && codes[1] == OPCODE_areturn) { ! /* Found `return this'. */ ! fputs (" { return this; }", out); decompiled = 1; } else if (code_len == 1 && codes[0] == OPCODE_return) --- 1046,1077 ---- || codes[4] == OPCODE_lreturn)) { /* Found code like `return FIELD'. */ index = (codes[2] << 8) | codes[3]; /* FIXME: ensure that tag is CONSTANT_Fieldref. */ name_and_type = JPOOL_USHORT2 (jcf, index); /* FIXME: ensure that tag is CONSTANT_NameAndType. */ name = JPOOL_USHORT1 (jcf, name_and_type); ! if (codes[4] == OPCODE_areturn) ! decompile_return_statement (out, jcf, method_signature, ! name, JPOOL_USHORT2 (jcf, name_and_type)); ! else ! { ! fputs (" { return ", out); ! /* FIXME: flags. */ ! print_field_name (out, jcf, name, 0); ! fputs ("; }", out); ! } decompiled = 1; } else if (code_len == 2 && codes[0] == OPCODE_aload_0 ! && codes[1] == OPCODE_areturn ! /* We're going to generate `return this'. This only makes ! sense for non-static methods. */ ! && ! (method_access & ACC_STATIC)) { ! decompile_return_statement (out, jcf, method_signature, -1, ! JPOOL_USHORT1 (jcf, jcf->this_class)); decompiled = 1; } else if (code_len == 1 && codes[0] == OPCODE_return) *************** decode_signature_piece (stream, signatur *** 975,982 **** array_loop: for (signature++; (signature < limit ! && *signature >= '0' ! && *signature <= '9'); signature++) ; switch (*signature) { --- 1109,1115 ---- array_loop: for (signature++; (signature < limit ! && ISDIGIT (*signature)); signature++) ; switch (*signature) { *************** DEFUN(print_stub_or_jni, (stream, jcf, n *** 1370,1381 **** if (flag_jni) fputs ("\n{\n (*env)->FatalError (\"", stream); else ! fputs ("\n{\n JvFail (\"", stream); print_name_for_stub_or_jni (stream, jcf, name_index, signature_index, is_init, name_override, flags); ! fputs (" not implemented\");\n}\n\n", stream); } } } --- 1503,1515 ---- if (flag_jni) fputs ("\n{\n (*env)->FatalError (\"", stream); else ! fputs ("\n{\n throw new ::java::lang::UnsupportedOperationException (JvNewStringLatin1 (\"", stream); print_name_for_stub_or_jni (stream, jcf, name_index, signature_index, is_init, name_override, flags); ! fprintf (stream, " not implemented\")%s;\n}\n\n", ! flag_jni ? "" : ")"); } } } *************** print_namelet (out, name, depth) *** 1628,1633 **** --- 1762,1768 ---- print_namelet (out, c, depth + 2); c = next; } + name->subnamelets = NULL; if (name->name) { *************** DEFUN(process_file, (jcf, out), *** 1835,1846 **** { /* Strip off the ".class" portion of the name when printing the include file name. */ ! int len = strlen (jcf->classname); if (len > 6 && ! strcmp (&jcf->classname[len - 6], ".class")) len -= 6; ! print_include (out, jcf->classname, len); if (! flag_jni) ! print_include (out, "gcj/cni", -1); } } --- 1970,1993 ---- { /* Strip off the ".class" portion of the name when printing the include file name. */ ! char *name; ! int i, len = strlen (jcf->classname); if (len > 6 && ! strcmp (&jcf->classname[len - 6], ".class")) len -= 6; ! /* Turn the class name into a file name. */ ! name = xmalloc (len + 1); ! for (i = 0; i < len; ++i) ! name[i] = jcf->classname[i] == '.' ? '/' : jcf->classname[i]; ! name[i] = '\0'; ! print_include (out, name, len); ! free (name); ! if (! flag_jni) ! { ! print_include (out, "gcj/cni", -1); ! print_include (out, "java/lang/UnsupportedOperationException", ! -1); ! } } } *************** DEFUN(process_file, (jcf, out), *** 1954,1994 **** /* This is used to mark options with no short value. */ #define LONG_OPT(Num) ((Num) + 128) ! #define OPT_classpath LONG_OPT (0) ! #define OPT_CLASSPATH LONG_OPT (1) ! #define OPT_HELP LONG_OPT (2) ! #define OPT_TEMP LONG_OPT (3) ! #define OPT_VERSION LONG_OPT (4) ! #define OPT_PREPEND LONG_OPT (5) ! #define OPT_FRIEND LONG_OPT (6) ! #define OPT_ADD LONG_OPT (7) ! #define OPT_APPEND LONG_OPT (8) ! #define OPT_M LONG_OPT (9) ! #define OPT_MM LONG_OPT (10) ! #define OPT_MG LONG_OPT (11) ! #define OPT_MD LONG_OPT (12) ! #define OPT_MMD LONG_OPT (13) ! static struct option options[] = { ! { "classpath", required_argument, NULL, OPT_classpath }, ! { "CLASSPATH", required_argument, NULL, OPT_CLASSPATH }, ! { "help", no_argument, NULL, OPT_HELP }, ! { "stubs", no_argument, &stubs, 1 }, ! { "td", required_argument, NULL, OPT_TEMP }, ! { "verbose", no_argument, NULL, 'v' }, ! { "version", no_argument, NULL, OPT_VERSION }, ! { "prepend", required_argument, NULL, OPT_PREPEND }, ! { "friend", required_argument, NULL, OPT_FRIEND }, ! { "add", required_argument, NULL, OPT_ADD }, ! { "append", required_argument, NULL, OPT_APPEND }, ! { "M", no_argument, NULL, OPT_M }, ! { "MM", no_argument, NULL, OPT_MM }, ! { "MG", no_argument, NULL, OPT_MG }, ! { "MD", no_argument, NULL, OPT_MD }, ! { "MMD", no_argument, NULL, OPT_MMD }, ! { "jni", no_argument, &flag_jni, 1 }, ! { NULL, no_argument, NULL, 0 } }; static void --- 2101,2145 ---- /* This is used to mark options with no short value. */ #define LONG_OPT(Num) ((Num) + 128) ! #define OPT_classpath LONG_OPT (0) ! #define OPT_CLASSPATH OPT_classpath ! #define OPT_bootclasspath LONG_OPT (1) ! #define OPT_extdirs LONG_OPT (2) ! #define OPT_HELP LONG_OPT (3) ! #define OPT_TEMP LONG_OPT (4) ! #define OPT_VERSION LONG_OPT (5) ! #define OPT_PREPEND LONG_OPT (6) ! #define OPT_FRIEND LONG_OPT (7) ! #define OPT_ADD LONG_OPT (8) ! #define OPT_APPEND LONG_OPT (9) ! #define OPT_M LONG_OPT (10) ! #define OPT_MM LONG_OPT (11) ! #define OPT_MG LONG_OPT (12) ! #define OPT_MD LONG_OPT (13) ! #define OPT_MMD LONG_OPT (14) ! static const struct option options[] = { ! { "classpath", required_argument, NULL, OPT_classpath }, ! { "bootclasspath", required_argument, NULL, OPT_bootclasspath }, ! { "extdirs", required_argument, NULL, OPT_extdirs }, ! { "CLASSPATH", required_argument, NULL, OPT_CLASSPATH }, ! { "help", no_argument, NULL, OPT_HELP }, ! { "stubs", no_argument, &stubs, 1 }, ! { "td", required_argument, NULL, OPT_TEMP }, ! { "verbose", no_argument, NULL, 'v' }, ! { "version", no_argument, NULL, OPT_VERSION }, ! { "prepend", required_argument, NULL, OPT_PREPEND }, ! { "friend", required_argument, NULL, OPT_FRIEND }, ! { "add", required_argument, NULL, OPT_ADD }, ! { "append", required_argument, NULL, OPT_APPEND }, ! { "M", no_argument, NULL, OPT_M }, ! { "MM", no_argument, NULL, OPT_MM }, ! { "MG", no_argument, NULL, OPT_MG }, ! { "MD", no_argument, NULL, OPT_MD }, ! { "MMD", no_argument, NULL, OPT_MMD }, ! { "jni", no_argument, &flag_jni, 1 }, ! { NULL, no_argument, NULL, 0 } }; static void *************** help () *** 2012,2019 **** printf (" -prepend TEXT Insert TEXT before start of class\n"); printf ("\n"); printf (" --classpath PATH Set path to find .class files\n"); - printf (" --CLASSPATH PATH Set path to find .class files\n"); printf (" -IDIR Append directory to class path\n"); printf (" -d DIRECTORY Set output directory name\n"); printf (" -o FILE Set output file name\n"); printf (" -td DIRECTORY Set temporary directory name\n"); --- 2163,2171 ---- printf (" -prepend TEXT Insert TEXT before start of class\n"); printf ("\n"); printf (" --classpath PATH Set path to find .class files\n"); printf (" -IDIR Append directory to class path\n"); + printf (" --bootclasspath PATH Override built-in class path\n"); + printf (" --extdirs PATH Set extensions directory path\n"); printf (" -d DIRECTORY Set output directory name\n"); printf (" -o FILE Set output file name\n"); printf (" -td DIRECTORY Set temporary directory name\n"); *************** help () *** 2038,2045 **** static void version () { ! printf ("gcjh (%s)\n\n", version_string); ! printf ("Copyright (C) 2001 Free Software Foundation, Inc.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"); exit (0); --- 2190,2197 ---- static void version () { ! printf ("gcjh (GCC) %s\n\n", version_string); ! printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"); exit (0); *************** DEFUN(main, (argc, argv), *** 2093,2100 **** jcf_path_classpath_arg (optarg); break; ! case OPT_CLASSPATH: ! jcf_path_CLASSPATH_arg (optarg); break; case OPT_HELP: --- 2245,2256 ---- jcf_path_classpath_arg (optarg); break; ! case OPT_bootclasspath: ! jcf_path_bootclasspath_arg (optarg); ! break; ! ! case OPT_extdirs: ! jcf_path_extdirs_arg (optarg); break; case OPT_HELP: *************** DEFUN(main, (argc, argv), *** 2171,2177 **** usage (); } ! jcf_path_seal (); if (output_file && emit_dependencies) { --- 2327,2333 ---- usage (); } ! jcf_path_seal (verbose); if (output_file && emit_dependencies) { diff -Nrc3pad gcc-3.0.4/gcc/java/java-tree.def gcc-3.1/gcc/java/java-tree.def *** gcc-3.0.4/gcc/java/java-tree.def Sun May 13 08:17:31 2001 --- gcc-3.1/gcc/java/java-tree.def Fri Aug 17 21:07:07 2001 *************** DEFTREECODE (NEW_ARRAY_INIT, "new_array_ *** 88,99 **** reference from. */ DEFTREECODE (CLASS_LITERAL, "class_literal", '1', 1) - /* Instance initializer. - Operand 0 contains the intance initializer statement. This tree node - is used for context detection, so that special rules can be - enforced. */ - DEFTREECODE (INSTANCE_INITIALIZERS_EXPR, "instance_initializers_expr", '1', 1) - /* The Java object within the exception object from the runtime. */ DEFTREECODE (JAVA_EXC_OBJ_EXPR, "java_exc_obj_expr", 'e', 0) --- 88,93 ---- diff -Nrc3pad gcc-3.0.4/gcc/java/java-tree.h gcc-3.1/gcc/java/java-tree.h *** gcc-3.0.4/gcc/java/java-tree.h Sun May 13 07:10:22 2001 --- gcc-3.1/gcc/java/java-tree.h Wed Apr 24 22:16:08 2002 *************** *** 1,6 **** /* Definitions for parsing and type checking for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,7 ---- /* Definitions for parsing and type checking for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ! Free Software Foundation, Inc. This file is part of GNU CC. *************** struct JCF; *** 60,68 **** --- 61,71 ---- RESOLVE_PACKAGE_NAME_P (in EXPR_WITH_FILE_LOCATION) SWITCH_HAS_DEFAULT (in SWITCH_EXPR) ZIP_FILE_P (in TREE_LIST in current_file_list) + HAS_FINALIZER (in RECORD_TYPE) 4: IS_A_COMMAND_LINE_FILENAME_P (in IDENTIFIER_NODE) RESOLVE_TYPE_NAME_P (in EXPR_WITH_FILE_LOCATION) CALL_USING_SUPER (in CALL_EXPR) + IS_ARRAY_LENGTH_ACCESS (in INDIRECT_REF) 5: HAS_BEEN_ALREADY_PARSED_P (in IDENTIFIER_NODE) IS_BREAK_STMT_P (in EXPR_WITH_FILE_LOCATION) IS_CRAFTED_STRING_BUFFER_P (in CALL_EXPR) *************** struct JCF; *** 92,97 **** --- 95,101 ---- 3: METHOD_FINAL (in FUNCTION_DECL) FIELD_FINAL (in FIELD_DECL) CLASS_FINAL (in TYPE_DECL) + DECL_FINAL (in any decl) 4: METHOD_SYNCHRONIZED (in FUNCTION_DECL). LABEL_IN_SUBR (in LABEL_DECL) CLASS_INTERFACE (in TYPE_DECL) *************** extern int compiling_from_source; *** 135,144 **** #define all_class_list \ java_global_trees[JTI_ALL_CLASS_LIST] ! /* Nonzero if we should make is_compiled_class always return 1 for ! appropriate classes that we're referencing. */ ! extern int flag_assume_compiled; extern int flag_emit_class_files; --- 139,158 ---- #define all_class_list \ java_global_trees[JTI_ALL_CLASS_LIST] ! /* List of all class filenames seen so far. */ ! #define all_class_filename java_global_trees [JTI_ALL_CLASS_FILENAME] ! /* List of virtual method decls called in this translation unit, used to ! generate virtual method offset symbol table. */ ! #define otable_methods java_global_trees [JTI_OTABLE_METHODS] ! ! /* The virtual method offset table. This is emitted as uninitialized data of ! the required length, and filled out at run time during class linking. */ ! #define otable_decl java_global_trees [JTI_OTABLE_DECL] ! ! /* The virtual method offset symbol table. Used by the runtime to fill out the ! otable. */ ! #define otable_syms_decl java_global_trees [JTI_OTABLE_SYMS_DECL] extern int flag_emit_class_files; *************** extern int flag_emit_xref; *** 165,170 **** --- 179,187 ---- /* When doing xrefs, tell when not to fold. */ extern int do_not_fold; + /* Resource name. */ + extern char * resource_name; + /* Turned to 1 if -Wall was encountered. See lang.c for their meanings. */ extern int flag_wall; extern int flag_redundant; *************** extern int flag_use_boehm_gc; *** 185,190 **** --- 202,221 ---- object to its synchronization structure. */ extern int flag_hash_synchronization; + /* When non zero, generate checks for references to NULL. */ + extern int flag_check_references; + + /* Used through STATIC_CLASS_INIT_OPT_P to check whether static + initialization optimization should be performed. */ + extern int flag_optimize_sci; + + /* When non zero, use offset tables for virtual method calls + in order to improve binary compatibility. */ + extern int flag_indirect_dispatch; + + /* When zero, don't generate runtime array store checks. */ + extern int flag_store_check; + /* Encoding used for source files. */ extern const char *current_encoding; *************** enum java_tree_index *** 246,254 **** --- 277,288 ---- JTI_STRING_TYPE_NODE, JTI_STRING_PTR_TYPE_NODE, JTI_THROWABLE_TYPE_NODE, + JTI_EXCEPTION_TYPE_NODE, JTI_RUNTIME_EXCEPTION_TYPE_NODE, JTI_ERROR_EXCEPTION_TYPE_NODE, JTI_RAWDATA_PTR_TYPE_NODE, + JTI_CLASS_NOT_FOUND_TYPE_NODE, + JTI_NO_CLASS_DEF_FOUND_TYPE_NODE, JTI_BYTE_ARRAY_TYPE_NODE, JTI_SHORT_ARRAY_TYPE_NODE, *************** enum java_tree_index *** 273,281 **** JTI_INIT_IDENTIFIER_NODE, JTI_CLINIT_IDENTIFIER_NODE, JTI_FINIT_IDENTIFIER_NODE, ! JTI_FINIT_LEG_IDENTIFIER_NODE, JTI_VOID_SIGNATURE_NODE, JTI_LENGTH_IDENTIFIER_NODE, JTI_THIS_IDENTIFIER_NODE, JTI_SUPER_IDENTIFIER_NODE, JTI_CONTINUE_IDENTIFIER_NODE, --- 307,316 ---- JTI_INIT_IDENTIFIER_NODE, JTI_CLINIT_IDENTIFIER_NODE, JTI_FINIT_IDENTIFIER_NODE, ! JTI_INSTINIT_IDENTIFIER_NODE, JTI_VOID_SIGNATURE_NODE, JTI_LENGTH_IDENTIFIER_NODE, + JTI_FINALIZE_IDENTIFIER_NODE, JTI_THIS_IDENTIFIER_NODE, JTI_SUPER_IDENTIFIER_NODE, JTI_CONTINUE_IDENTIFIER_NODE, *************** enum java_tree_index *** 315,325 **** --- 350,366 ---- JTI_LINENUMBERS_TYPE, JTI_METHOD_TYPE_NODE, JTI_METHOD_PTR_TYPE_NODE, + JTI_OTABLE_TYPE, + JTI_OTABLE_PTR_TYPE, + JTI_METHOD_SYMBOL_TYPE, + JTI_METHOD_SYMBOLS_ARRAY_TYPE, + JTI_METHOD_SYMBOLS_ARRAY_PTR_TYPE, JTI_END_PARAMS_NODE, JTI_THROW_NODE, JTI_ALLOC_OBJECT_NODE, + JTI_ALLOC_NO_FINALIZER_NODE, JTI_SOFT_INSTANCEOF_NODE, JTI_SOFT_CHECKCAST_NODE, JTI_SOFT_INITCLASS_NODE, *************** enum java_tree_index *** 351,356 **** --- 392,404 ---- JTI_MAIN_CLASS, JTI_CURRENT_CLASS, JTI_ALL_CLASS_LIST, + JTI_ALL_CLASS_FILENAME, + + JTI_OTABLE_METHODS, + JTI_OTABLE_DECL, + JTI_OTABLE_SYMS_DECL, + + JTI_PREDEF_FILENAMES, JTI_MAX }; *************** extern tree java_global_trees[JTI_MAX]; *** 402,413 **** --- 450,467 ---- java_global_trees[JTI_STRING_PTR_TYPE_NODE] #define throwable_type_node \ java_global_trees[JTI_THROWABLE_TYPE_NODE] + #define exception_type_node \ + java_global_trees[JTI_EXCEPTION_TYPE_NODE] #define runtime_exception_type_node \ java_global_trees[JTI_RUNTIME_EXCEPTION_TYPE_NODE] #define error_exception_type_node \ java_global_trees[JTI_ERROR_EXCEPTION_TYPE_NODE] #define rawdata_ptr_type_node \ java_global_trees[JTI_RAWDATA_PTR_TYPE_NODE] + #define class_not_found_type_node \ + java_global_trees[JTI_CLASS_NOT_FOUND_TYPE_NODE] + #define no_class_def_found_type_node \ + java_global_trees[JTI_NO_CLASS_DEF_FOUND_TYPE_NODE] #define byte_array_type_node \ java_global_trees[JTI_BYTE_ARRAY_TYPE_NODE] *************** extern tree java_global_trees[JTI_MAX]; *** 455,466 **** java_global_trees[JTI_CLINIT_IDENTIFIER_NODE] /* "" */ #define finit_identifier_node \ java_global_trees[JTI_FINIT_IDENTIFIER_NODE] /* "finit$" */ ! #define finit_leg_identifier_node \ ! java_global_trees[JTI_FINIT_LEG_IDENTIFIER_NODE] /* "$finit$" */ #define void_signature_node \ java_global_trees[JTI_VOID_SIGNATURE_NODE] /* "()V" */ #define length_identifier_node \ java_global_trees[JTI_LENGTH_IDENTIFIER_NODE] /* "length" */ #define this_identifier_node \ java_global_trees[JTI_THIS_IDENTIFIER_NODE] /* "this" */ #define super_identifier_node \ --- 509,523 ---- java_global_trees[JTI_CLINIT_IDENTIFIER_NODE] /* "" */ #define finit_identifier_node \ java_global_trees[JTI_FINIT_IDENTIFIER_NODE] /* "finit$" */ ! /* FIXME "instinit$" and "finit$" should be merged */ ! #define instinit_identifier_node \ ! java_global_trees[JTI_INSTINIT_IDENTIFIER_NODE] /* "instinit$" */ #define void_signature_node \ java_global_trees[JTI_VOID_SIGNATURE_NODE] /* "()V" */ #define length_identifier_node \ java_global_trees[JTI_LENGTH_IDENTIFIER_NODE] /* "length" */ + #define finalize_identifier_node \ + java_global_trees[JTI_FINALIZE_IDENTIFIER_NODE] /* "finalize" */ #define this_identifier_node \ java_global_trees[JTI_THIS_IDENTIFIER_NODE] /* "this" */ #define super_identifier_node \ *************** extern tree java_global_trees[JTI_MAX]; *** 536,541 **** --- 593,608 ---- java_global_trees[JTI_METHOD_TYPE_NODE] #define method_ptr_type_node \ java_global_trees[JTI_METHOD_PTR_TYPE_NODE] + #define otable_type \ + java_global_trees[JTI_OTABLE_TYPE] + #define otable_ptr_type \ + java_global_trees[JTI_OTABLE_PTR_TYPE] + #define method_symbol_type \ + java_global_trees[JTI_METHOD_SYMBOL_TYPE] + #define method_symbols_array_type \ + java_global_trees[JTI_METHOD_SYMBOLS_ARRAY_TYPE] + #define method_symbols_array_ptr_type \ + java_global_trees[JTI_METHOD_SYMBOLS_ARRAY_PTR_TYPE] #define end_params_node \ java_global_trees[JTI_END_PARAMS_NODE] *************** extern tree java_global_trees[JTI_MAX]; *** 545,550 **** --- 612,619 ---- java_global_trees[JTI_THROW_NODE] #define alloc_object_node \ java_global_trees[JTI_ALLOC_OBJECT_NODE] + #define alloc_no_finalizer_node \ + java_global_trees[JTI_ALLOC_NO_FINALIZER_NODE] #define soft_instanceof_node \ java_global_trees[JTI_SOFT_INSTANCEOF_NODE] #define soft_checkcast_node \ *************** extern tree java_global_trees[JTI_MAX]; *** 592,599 **** #define nativecode_ptr_array_type_node \ java_global_trees[JTI_NATIVECODE_PTR_ARRAY_TYPE_NODE] ! #define PREDEF_FILENAMES_SIZE 7 ! extern tree predef_filenames[PREDEF_FILENAMES_SIZE]; #define nativecode_ptr_type_node ptr_type_node --- 661,668 ---- #define nativecode_ptr_array_type_node \ java_global_trees[JTI_NATIVECODE_PTR_ARRAY_TYPE_NODE] ! #define predef_filenames \ ! java_global_trees[JTI_PREDEF_FILENAMES] #define nativecode_ptr_type_node ptr_type_node *************** struct lang_identifier *** 620,626 **** }; /* Macros for access to language-specific slots in an identifier. */ ! /* UNless specifide, each of these slots contains a DECL node or null. */ /* This represents the value which the identifier has in the file-scope namespace. */ --- 689,695 ---- }; /* Macros for access to language-specific slots in an identifier. */ ! /* Unless specified, each of these slots contains a DECL node or null. */ /* This represents the value which the identifier has in the file-scope namespace. */ *************** struct lang_identifier *** 702,707 **** --- 771,789 ---- class has been initialized in this function, and FALSE otherwise. */ #define DECL_FUNCTION_INIT_TEST_TABLE(DECL) \ (DECL_LANG_SPECIFIC(DECL)->init_test_table) + /* If LOCAL_CLASS_INITIALIZATION_FLAG_P(decl), give class it initializes. */ + #define DECL_FUNCTION_INIT_TEST_CLASS(DECL) \ + (((struct lang_decl_var*)DECL_LANG_SPECIFIC(DECL))->slot_chain) + /* For each static function decl, itc contains a hash table whose + entries are keyed on class named that are definitively initialized + in DECL. */ + #define DECL_FUNCTION_INITIALIZED_CLASS_TABLE(DECL) \ + (DECL_LANG_SPECIFIC(DECL)->ict) + /* A list of all the static method calls in the method DECL (if optimizing). + Actually each TREE_VALUE points to a COMPONT_EXPR that wraps the + invoation so we can later patch it. */ + #define DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND(DECL) \ + (DECL_LANG_SPECIFIC(DECL)->smic) /* The Number of Artificial Parameters (NAP) DECL contains. this$ is excluded, because sometimes created as a parameter before the function decl exists. */ *************** struct lang_identifier *** 709,719 **** /* True if DECL is a synthetic ctor. */ #define DECL_FUNCTION_SYNTHETIC_CTOR(DECL) \ (DECL_LANG_SPECIFIC(DECL)->synthetic_ctor) - /* True if DECL initializes all its finals */ - #define DECL_FUNCTION_ALL_FINAL_INITIALIZED(DECL) \ - (DECL_LANG_SPECIFIC(DECL)->init_final) #define DECL_FIXED_CONSTRUCTOR_P(DECL) (DECL_LANG_SPECIFIC(DECL)->fixed_ctor) /* True when DECL aliases an outer context local variable. */ #define FIELD_LOCAL_ALIAS(DECL) DECL_LANG_FLAG_6 (DECL) --- 791,801 ---- /* True if DECL is a synthetic ctor. */ #define DECL_FUNCTION_SYNTHETIC_CTOR(DECL) \ (DECL_LANG_SPECIFIC(DECL)->synthetic_ctor) #define DECL_FIXED_CONSTRUCTOR_P(DECL) (DECL_LANG_SPECIFIC(DECL)->fixed_ctor) + /* A constructor that calls this. */ + #define DECL_INIT_CALLS_THIS(DECL) (DECL_LANG_SPECIFIC(DECL)->init_calls_this) + /* True when DECL aliases an outer context local variable. */ #define FIELD_LOCAL_ALIAS(DECL) DECL_LANG_FLAG_6 (DECL) *************** struct lang_identifier *** 793,823 **** /* Safely tests whether FIELD_INNER_ACCESS exists or not. */ #define FIELD_INNER_ACCESS_P(DECL) \ DECL_LANG_SPECIFIC (DECL) && FIELD_INNER_ACCESS (DECL) ! /* True if a final variable was initialized upon its declaration. */ #define DECL_FIELD_FINAL_IUD(NODE) \ (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->final_iud) - /* Set to true if a final variable is seen locally initialized on a - ctor. */ - #define DECL_FIELD_FINAL_LIIC(NODE) \ - (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->final_liic) - /* Set to true if an initialization error was already found with this - final variable. */ - #define DECL_FIELD_FINAL_IERR(NODE) \ - (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->final_ierr) /* The original WFL of a final variable. */ #define DECL_FIELD_FINAL_WFL(NODE) \ (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->wfl) ! /* True if NODE is a local final (as opposed to a final variable.) ! This macro accesses the flag to read or set it. */ ! #define LOCAL_FINAL(NODE) \ ! (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->local_final) ! /* True if NODE is a local final. */ ! #define LOCAL_FINAL_P(NODE) (DECL_LANG_SPECIFIC (NODE) && LOCAL_FINAL (NODE)) ! /* True if NODE is a final variable */ #define FINAL_VARIABLE_P(NODE) (FIELD_FINAL (NODE) && !FIELD_STATIC (NODE)) ! /* True if NODE is a class final variable */ #define CLASS_FINAL_VARIABLE_P(NODE) \ (FIELD_FINAL (NODE) && FIELD_STATIC (NODE)) /* Create a DECL_LANG_SPECIFIC if necessary. */ #define MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC(T) \ if (DECL_LANG_SPECIFIC (T) == NULL) \ --- 875,901 ---- /* Safely tests whether FIELD_INNER_ACCESS exists or not. */ #define FIELD_INNER_ACCESS_P(DECL) \ DECL_LANG_SPECIFIC (DECL) && FIELD_INNER_ACCESS (DECL) ! /* True if a final variable was initialized upon its declaration, ! or (if a field) in an initializer. Set after definite assignment. */ #define DECL_FIELD_FINAL_IUD(NODE) \ (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->final_iud) /* The original WFL of a final variable. */ #define DECL_FIELD_FINAL_WFL(NODE) \ (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->wfl) ! /* True if NODE is a local variable final. */ ! #define LOCAL_FINAL_P(NODE) (DECL_LANG_SPECIFIC (NODE) && DECL_FINAL (NODE)) ! /* True if NODE is a final field. */ #define FINAL_VARIABLE_P(NODE) (FIELD_FINAL (NODE) && !FIELD_STATIC (NODE)) ! /* True if NODE is a class final field. */ #define CLASS_FINAL_VARIABLE_P(NODE) \ (FIELD_FINAL (NODE) && FIELD_STATIC (NODE)) + /* True if NODE is a class initialization flag. This macro accesses + the flag to read or set it. */ + #define LOCAL_CLASS_INITIALIZATION_FLAG(NODE) \ + (((struct lang_decl_var*)DECL_LANG_SPECIFIC(NODE))->cif) + /* True if NODE is a class initialization flag. */ + #define LOCAL_CLASS_INITIALIZATION_FLAG_P(NODE) \ + (DECL_LANG_SPECIFIC (NODE) && LOCAL_CLASS_INITIALIZATION_FLAG(NODE)) /* Create a DECL_LANG_SPECIFIC if necessary. */ #define MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC(T) \ if (DECL_LANG_SPECIFIC (T) == NULL) \ *************** struct lang_identifier *** 836,843 **** /* For a local VAR_DECL, holds the index into a words bitstring that specifies if this decl is definitively assigned. ! A DECL_BIT_INDEX of -1 means we no longer care. */ ! #define DECL_BIT_INDEX(DECL) (DECL_CHECK (DECL)->decl.u2.i) /* DECL_LANG_SPECIFIC for FUNCTION_DECLs. */ struct lang_decl --- 914,922 ---- /* For a local VAR_DECL, holds the index into a words bitstring that specifies if this decl is definitively assigned. ! The value -1 means the variable has been definitely assigned (and not ! definitely unassigned). The value -2 means we already reported an error. */ ! #define DECL_BIT_INDEX(DECL) (DECL_CHECK (DECL)->decl.pointer_alias_set) /* DECL_LANG_SPECIFIC for FUNCTION_DECLs. */ struct lang_decl *************** struct lang_decl *** 856,868 **** list of other constructor it calls */ struct hash_table init_test_table; /* Class initialization test variables */ tree inner_access; /* The identifier of the access method used for invocation from inner classes */ int nap; /* Number of artificial parameters */ ! int native : 1; /* Nonzero if this is a native method */ ! int synthetic_ctor : 1; /* Nonzero if this is a synthetic ctor */ ! int init_final : 1; /* Nonzero all finals are initialized */ ! int fixed_ctor : 1; }; /* init_test_table hash table entry structure. */ --- 935,951 ---- list of other constructor it calls */ struct hash_table init_test_table; /* Class initialization test variables */ + struct hash_table ict; /* Initialized (static) Class Table */ + tree smic; /* Static method invocation compound */ tree inner_access; /* The identifier of the access method used for invocation from inner classes */ int nap; /* Number of artificial parameters */ ! unsigned int native : 1; /* Nonzero if this is a native method */ ! unsigned int synthetic_ctor : 1; /* Nonzero if this is a synthetic ctor */ ! unsigned int init_final : 1; /* Nonzero all finals are initialized */ ! unsigned int fixed_ctor : 1; ! unsigned int init_calls_this : 1; ! unsigned int strictfp : 1; }; /* init_test_table hash table entry structure. */ *************** struct lang_decl_var *** 882,891 **** tree slot_chain; tree am; /* Access method for this field (1.1) */ tree wfl; /* Original wfl */ ! int final_iud : 1; /* Final initialized upon declaration */ ! int final_liic : 1; /* Final locally initialized in ctors */ ! int final_ierr : 1; /* Initialization error already detected */ ! int local_final : 1; /* True if the decl is a local final */ }; /* Macro to access fields in `struct lang_type'. */ --- 965,972 ---- tree slot_chain; tree am; /* Access method for this field (1.1) */ tree wfl; /* Original wfl */ ! unsigned int final_iud : 1; /* Final initialized upon declaration */ ! unsigned int cif : 1; /* True: decl is a class initialization flag */ }; /* Macro to access fields in `struct lang_type'. */ *************** struct lang_decl_var *** 909,917 **** for non primitive types when compiling to bytecode. */ #define TYPE_DOT_CLASS(T) (TYPE_LANG_SPECIFIC(T)->dot_class) #define TYPE_PACKAGE_LIST(T) (TYPE_LANG_SPECIFIC(T)->package_list) #define TYPE_PRIVATE_INNER_CLASS(T) (TYPE_LANG_SPECIFIC(T)->pic) #define TYPE_PROTECTED_INNER_CLASS(T) (TYPE_LANG_SPECIFIC(T)->poic) ! #define TYPE_HAS_FINAL_VARIABLE(T) (TYPE_LANG_SPECIFIC(T)->afv) struct lang_type { --- 990,1000 ---- for non primitive types when compiling to bytecode. */ #define TYPE_DOT_CLASS(T) (TYPE_LANG_SPECIFIC(T)->dot_class) #define TYPE_PACKAGE_LIST(T) (TYPE_LANG_SPECIFIC(T)->package_list) + #define TYPE_IMPORT_LIST(T) (TYPE_LANG_SPECIFIC(T)->import_list) + #define TYPE_IMPORT_DEMAND_LIST(T) (TYPE_LANG_SPECIFIC(T)->import_demand_list) #define TYPE_PRIVATE_INNER_CLASS(T) (TYPE_LANG_SPECIFIC(T)->pic) #define TYPE_PROTECTED_INNER_CLASS(T) (TYPE_LANG_SPECIFIC(T)->poic) ! #define TYPE_STRICTFP(T) (TYPE_LANG_SPECIFIC(T)->strictfp) struct lang_type { *************** struct lang_type *** 919,925 **** struct JCF *jcf; struct CPool *cpool; tree cpool_data_ref; /* Cached */ ! tree finit_stmt_list; /* List of statements $finit$ will use */ tree clinit_stmt_list; /* List of statements will use */ tree ii_block; /* Instance initializer block */ tree dot_class; /* The decl of the `class$' function that --- 1002,1008 ---- struct JCF *jcf; struct CPool *cpool; tree cpool_data_ref; /* Cached */ ! tree finit_stmt_list; /* List of statements finit$ will use */ tree clinit_stmt_list; /* List of statements will use */ tree ii_block; /* Instance initializer block */ tree dot_class; /* The decl of the `class$' function that *************** struct lang_type *** 927,935 **** compiling to bytecode to implement .class */ tree package_list; /* List of package names, progressive */ unsigned pic:1; /* Private Inner Class. */ unsigned poic:1; /* Protected Inner Class. */ ! unsigned afv:1; /* Has final variables */ }; #ifdef JAVA_USE_HANDLES --- 1010,1020 ---- compiling to bytecode to implement .class */ tree package_list; /* List of package names, progressive */ + tree import_list; /* Imported types, in the CU of this class */ + tree import_demand_list; /* Imported types, in the CU of this class */ unsigned pic:1; /* Private Inner Class. */ unsigned poic:1; /* Protected Inner Class. */ ! unsigned strictfp:1; /* `strictfp' class. */ }; #ifdef JAVA_USE_HANDLES *************** struct lang_type *** 951,956 **** --- 1036,1042 ---- #define JCF_u4 unsigned long #define JCF_u2 unsigned short + extern void java_set_yydebug PARAMS ((int)); extern void add_assume_compiled PARAMS ((const char *, int)); extern tree lookup_class PARAMS ((tree)); extern tree lookup_java_constructor PARAMS ((tree, tree)); *************** extern tree build_dtable_decl PARAMS ((t *** 979,989 **** --- 1065,1077 ---- extern tree build_internal_class_name PARAMS ((tree)); extern tree build_constants_constructor PARAMS ((void)); extern tree build_ref_from_constant_pool PARAMS ((int)); + extern void compile_resource_file PARAMS ((char *, const char *)); extern tree build_utf8_ref PARAMS ((tree)); extern tree ident_subst PARAMS ((const char*, int, const char*, int, int, const char*)); extern tree identifier_subst PARAMS ((const tree, const char *, int, int, const char *)); + extern void java_init_decl_processing PARAMS ((void)); extern tree build_java_signature PARAMS ((tree)); extern tree build_java_argument_signature PARAMS ((tree)); extern void set_java_signature PARAMS ((tree, tree)); *************** extern HOST_WIDE_INT java_array_type_len *** 1005,1010 **** --- 1093,1101 ---- extern int read_class PARAMS ((tree)); extern void load_class PARAMS ((tree, int)); + extern tree check_for_builtin PARAMS ((tree, tree)); + extern void initialize_builtins PARAMS ((void)); + extern tree lookup_name PARAMS ((tree)); extern tree build_known_method_ref PARAMS ((tree, tree, tree, tree, tree)); extern tree build_class_init PARAMS ((tree, tree)); *************** extern tree build_java_binop PARAMS ((en *** 1018,1040 **** extern tree build_java_soft_divmod PARAMS ((enum tree_code, tree, tree, tree)); extern tree binary_numeric_promotion PARAMS ((tree, tree, tree *, tree *)); extern tree build_java_arrayaccess PARAMS ((tree, tree, tree)); extern tree build_newarray PARAMS ((int, tree)); extern tree build_anewarray PARAMS ((tree, tree)); extern tree build_new_array PARAMS ((tree, tree)); extern tree build_java_array_length_access PARAMS ((tree)); extern tree build_java_arraynull_check PARAMS ((tree, tree, tree)); extern tree build_get_class PARAMS ((tree)); extern tree build_instanceof PARAMS ((tree, tree)); extern tree create_label_decl PARAMS ((tree)); extern void push_labeled_block PARAMS ((tree)); extern tree prepare_eh_table_type PARAMS ((tree)); extern tree build_exception_object_ref PARAMS ((tree)); - extern void java_set_exception_lang_code PARAMS ((void)); extern tree generate_name PARAMS ((void)); extern void pop_labeled_block PARAMS ((void)); extern const char *lang_printable_name PARAMS ((tree, int)); extern tree maybe_add_interface PARAMS ((tree, tree)); extern void set_super_info PARAMS ((int, tree, tree, int)); extern int get_access_flags_from_decl PARAMS ((tree)); extern int interface_of_p PARAMS ((tree, tree)); extern int inherits_from_p PARAMS ((tree, tree)); --- 1109,1134 ---- extern tree build_java_soft_divmod PARAMS ((enum tree_code, tree, tree, tree)); extern tree binary_numeric_promotion PARAMS ((tree, tree, tree *, tree *)); extern tree build_java_arrayaccess PARAMS ((tree, tree, tree)); + extern tree build_java_arraystore_check PARAMS ((tree, tree)); extern tree build_newarray PARAMS ((int, tree)); extern tree build_anewarray PARAMS ((tree, tree)); extern tree build_new_array PARAMS ((tree, tree)); extern tree build_java_array_length_access PARAMS ((tree)); extern tree build_java_arraynull_check PARAMS ((tree, tree, tree)); + extern tree build_java_indirect_ref PARAMS ((tree, tree, int)); + extern tree java_check_reference PARAMS ((tree, int)); extern tree build_get_class PARAMS ((tree)); extern tree build_instanceof PARAMS ((tree, tree)); extern tree create_label_decl PARAMS ((tree)); extern void push_labeled_block PARAMS ((tree)); extern tree prepare_eh_table_type PARAMS ((tree)); extern tree build_exception_object_ref PARAMS ((tree)); extern tree generate_name PARAMS ((void)); extern void pop_labeled_block PARAMS ((void)); extern const char *lang_printable_name PARAMS ((tree, int)); extern tree maybe_add_interface PARAMS ((tree, tree)); extern void set_super_info PARAMS ((int, tree, tree, int)); + extern void set_class_decl_access_flags PARAMS ((int, tree)); extern int get_access_flags_from_decl PARAMS ((tree)); extern int interface_of_p PARAMS ((tree, tree)); extern int inherits_from_p PARAMS ((tree, tree)); *************** extern void make_class_data PARAMS ((tre *** 1048,1062 **** extern void register_class PARAMS ((void)); extern int alloc_name_constant PARAMS ((int, tree)); extern void emit_register_classes PARAMS ((void)); extern void lang_init_source PARAMS ((int)); extern void write_classfile PARAMS ((tree)); extern char *print_int_node PARAMS ((tree)); extern void parse_error_context PARAMS ((tree cl, const char *, ...)) ATTRIBUTE_PRINTF_2; - extern tree build_primtype_type_ref PARAMS ((const char *)); extern void finish_class PARAMS ((void)); extern void java_layout_seen_class_methods PARAMS ((void)); ! extern void check_for_initialization PARAMS ((tree)); extern tree pushdecl_top_level PARAMS ((tree)); extern int alloc_class_constant PARAMS ((tree)); --- 1142,1156 ---- extern void register_class PARAMS ((void)); extern int alloc_name_constant PARAMS ((int, tree)); extern void emit_register_classes PARAMS ((void)); + extern void emit_offset_symbol_table PARAMS ((void)); extern void lang_init_source PARAMS ((int)); extern void write_classfile PARAMS ((tree)); extern char *print_int_node PARAMS ((tree)); extern void parse_error_context PARAMS ((tree cl, const char *, ...)) ATTRIBUTE_PRINTF_2; extern void finish_class PARAMS ((void)); extern void java_layout_seen_class_methods PARAMS ((void)); ! extern void check_for_initialization PARAMS ((tree, tree)); extern tree pushdecl_top_level PARAMS ((tree)); extern int alloc_class_constant PARAMS ((tree)); *************** extern void java_debug_context PARAMS (( *** 1121,1129 **** --- 1215,1226 ---- extern void safe_layout_class PARAMS ((tree)); extern tree get_boehm_type_descriptor PARAMS ((tree)); + extern bool class_has_finalize_method PARAMS ((tree)); extern unsigned long java_hash_hash_tree_node PARAMS ((hash_table_key)); extern bool java_hash_compare_tree_node PARAMS ((hash_table_key, hash_table_key)); + extern bool attach_initialized_static_class PARAMS ((struct hash_entry *, + PTR)); extern void java_check_methods PARAMS ((tree)); extern void init_jcf_parse PARAMS((void)); extern void init_src_parse PARAMS((void)); *************** extern tree java_mangle_vtable PARAMS (( *** 1136,1141 **** --- 1233,1241 ---- extern const char *lang_printable_name_wls PARAMS ((tree, int)); extern void append_gpp_mangled_name PARAMS ((const char *, int)); + extern void add_predefined_file PARAMS ((tree)); + extern int predefined_filename_p PARAMS ((tree)); + /* We use ARGS_SIZE_RTX to indicate that gcc/expr.h has been included to declare `enum expand_modifier'. */ #if defined (TREE_CODE) && defined(RTX_CODE) && defined (HAVE_MACHINE_MODES) && defined (ARGS_SIZE_RTX) *************** struct rtx_def * java_lang_expand_expr P *** 1143,1159 **** enum expand_modifier)); #endif /* TREE_CODE && RTX_CODE && HAVE_MACHINE_MODES && ARGS_SIZE_RTX */ /* Access flags etc for a method (a FUNCTION_DECL): */ #define METHOD_PUBLIC(DECL) DECL_LANG_FLAG_1 (DECL) #define METHOD_PRIVATE(DECL) TREE_PRIVATE (DECL) #define METHOD_PROTECTED(DECL) TREE_PROTECTED (DECL) #define METHOD_STATIC(DECL) DECL_LANG_FLAG_2 (DECL) ! #define METHOD_FINAL(DECL) DECL_LANG_FLAG_3 (DECL) #define METHOD_SYNCHRONIZED(DECL) DECL_LANG_FLAG_4 (DECL) #define METHOD_NATIVE(DECL) (DECL_LANG_SPECIFIC(DECL)->native) #define METHOD_ABSTRACT(DECL) DECL_LANG_FLAG_5 (DECL) #define METHOD_TRANSIENT(DECL) DECL_LANG_FLAG_6 (DECL) #define JAVA_FILE_P(NODE) TREE_LANG_FLAG_2 (NODE) #define CLASS_FILE_P(NODE) TREE_LANG_FLAG_3 (NODE) --- 1243,1262 ---- enum expand_modifier)); #endif /* TREE_CODE && RTX_CODE && HAVE_MACHINE_MODES && ARGS_SIZE_RTX */ + #define DECL_FINAL(DECL) DECL_LANG_FLAG_3 (DECL) + /* Access flags etc for a method (a FUNCTION_DECL): */ #define METHOD_PUBLIC(DECL) DECL_LANG_FLAG_1 (DECL) #define METHOD_PRIVATE(DECL) TREE_PRIVATE (DECL) #define METHOD_PROTECTED(DECL) TREE_PROTECTED (DECL) #define METHOD_STATIC(DECL) DECL_LANG_FLAG_2 (DECL) ! #define METHOD_FINAL(DECL) DECL_FINAL (DECL) #define METHOD_SYNCHRONIZED(DECL) DECL_LANG_FLAG_4 (DECL) #define METHOD_NATIVE(DECL) (DECL_LANG_SPECIFIC(DECL)->native) #define METHOD_ABSTRACT(DECL) DECL_LANG_FLAG_5 (DECL) #define METHOD_TRANSIENT(DECL) DECL_LANG_FLAG_6 (DECL) + #define METHOD_STRICTFP(DECL) (DECL_LANG_SPECIFIC (DECL)->strictfp) #define JAVA_FILE_P(NODE) TREE_LANG_FLAG_2 (NODE) #define CLASS_FILE_P(NODE) TREE_LANG_FLAG_3 (NODE) *************** struct rtx_def * java_lang_expand_expr P *** 1166,1183 **** #define DECL_INIT_P(DECL) (ID_INIT_P (DECL_NAME (DECL))) #define DECL_FINIT_P(DECL) (ID_FINIT_P (DECL_NAME (DECL))) #define DECL_CLINIT_P(DECL) (ID_CLINIT_P (DECL_NAME (DECL))) /* Predicates on method identifiers. Kept close to other macros using them */ #define ID_INIT_P(ID) ((ID) == init_identifier_node) ! /* Match ID to either `$finit$' or `finit$', so that `$finit$' ! continues to be recognized as an equivalent to `finit$' which is ! now the prefered name used for the field initialization special ! method. */ ! #define ID_FINIT_P(ID) ((ID) == finit_identifier_node \ ! || (ID) == finit_leg_identifier_node) #define ID_CLINIT_P(ID) ((ID) == clinit_identifier_node) #define ID_CLASSDOLLAR_P(ID) ((ID) == classdollar_identifier_node) /* Access flags etc for a variable/field (a FIELD_DECL): */ --- 1269,1283 ---- #define DECL_INIT_P(DECL) (ID_INIT_P (DECL_NAME (DECL))) #define DECL_FINIT_P(DECL) (ID_FINIT_P (DECL_NAME (DECL))) #define DECL_CLINIT_P(DECL) (ID_CLINIT_P (DECL_NAME (DECL))) + #define DECL_INSTINIT_P(DECL) (ID_INSTINIT_P (DECL_NAME (DECL))) /* Predicates on method identifiers. Kept close to other macros using them */ #define ID_INIT_P(ID) ((ID) == init_identifier_node) ! #define ID_FINIT_P(ID) ((ID) == finit_identifier_node) #define ID_CLINIT_P(ID) ((ID) == clinit_identifier_node) #define ID_CLASSDOLLAR_P(ID) ((ID) == classdollar_identifier_node) + #define ID_INSTINIT_P(ID) ((ID) == instinit_identifier_node) /* Access flags etc for a variable/field (a FIELD_DECL): */ *************** struct rtx_def * java_lang_expand_expr P *** 1185,1204 **** #define FIELD_PROTECTED(DECL) TREE_PROTECTED (DECL) #define FIELD_PUBLIC(DECL) DECL_LANG_FLAG_1 (DECL) #define FIELD_STATIC(DECL) TREE_STATIC (DECL) ! #define FIELD_FINAL(DECL) DECL_LANG_FLAG_3 (DECL) #define FIELD_VOLATILE(DECL) DECL_LANG_FLAG_4 (DECL) #define FIELD_TRANSIENT(DECL) DECL_LANG_FLAG_5 (DECL) /* Access flags etc for a class (a TYPE_DECL): */ #define CLASS_PUBLIC(DECL) DECL_LANG_FLAG_1 (DECL) ! #define CLASS_FINAL(DECL) DECL_LANG_FLAG_3 (DECL) #define CLASS_INTERFACE(DECL) DECL_LANG_FLAG_4 (DECL) #define CLASS_ABSTRACT(DECL) DECL_LANG_FLAG_5 (DECL) #define CLASS_SUPER(DECL) DECL_LANG_FLAG_6 (DECL) #define CLASS_STATIC(DECL) DECL_LANG_FLAG_7 (DECL) #define CLASS_PRIVATE(DECL) (TYPE_PRIVATE_INNER_CLASS (TREE_TYPE (DECL))) #define CLASS_PROTECTED(DECL) (TYPE_PROTECTED_INNER_CLASS (TREE_TYPE (DECL))) /* @deprecated marker flag on methods, fields and classes */ --- 1285,1305 ---- #define FIELD_PROTECTED(DECL) TREE_PROTECTED (DECL) #define FIELD_PUBLIC(DECL) DECL_LANG_FLAG_1 (DECL) #define FIELD_STATIC(DECL) TREE_STATIC (DECL) ! #define FIELD_FINAL(DECL) DECL_FINAL (DECL) #define FIELD_VOLATILE(DECL) DECL_LANG_FLAG_4 (DECL) #define FIELD_TRANSIENT(DECL) DECL_LANG_FLAG_5 (DECL) /* Access flags etc for a class (a TYPE_DECL): */ #define CLASS_PUBLIC(DECL) DECL_LANG_FLAG_1 (DECL) ! #define CLASS_FINAL(DECL) DECL_FINAL (DECL) #define CLASS_INTERFACE(DECL) DECL_LANG_FLAG_4 (DECL) #define CLASS_ABSTRACT(DECL) DECL_LANG_FLAG_5 (DECL) #define CLASS_SUPER(DECL) DECL_LANG_FLAG_6 (DECL) #define CLASS_STATIC(DECL) DECL_LANG_FLAG_7 (DECL) #define CLASS_PRIVATE(DECL) (TYPE_PRIVATE_INNER_CLASS (TREE_TYPE (DECL))) #define CLASS_PROTECTED(DECL) (TYPE_PROTECTED_INNER_CLASS (TREE_TYPE (DECL))) + #define CLASS_STRICTFP(DECL) (TYPE_STRICTFP (TREE_TYPE (DECL))) /* @deprecated marker flag on methods, fields and classes */ *************** extern char *instruction_bits; *** 1226,1245 **** /* True iff the byte is the start of an instruction. */ #define BCODE_INSTRUCTION_START 1 ! /* True iff there is a jump to this location. */ #define BCODE_JUMP_TARGET 2 - /* True iff there is a return to this location. - (I.e. the preceedng instruction was a call.) */ - #define BCODE_RETURN_TARGET 4 - /* True iff this is the start of an exception handler. */ #define BCODE_EXCEPTION_TARGET 16 /* True iff there is a jump to this location (and it needs a label). */ ! #define BCODE_TARGET \ ! (BCODE_JUMP_TARGET|BCODE_RETURN_TARGET \ ! | BCODE_EXCEPTION_TARGET) /* True iff there is an entry in the linenumber table for this location. */ #define BCODE_HAS_LINENUMBER 32 --- 1327,1340 ---- /* True iff the byte is the start of an instruction. */ #define BCODE_INSTRUCTION_START 1 ! /* True iff there is a jump or a return to this location. */ #define BCODE_JUMP_TARGET 2 /* True iff this is the start of an exception handler. */ #define BCODE_EXCEPTION_TARGET 16 /* True iff there is a jump to this location (and it needs a label). */ ! #define BCODE_TARGET (BCODE_JUMP_TARGET| BCODE_EXCEPTION_TARGET) /* True iff there is an entry in the linenumber table for this location. */ #define BCODE_HAS_LINENUMBER 32 *************** extern tree *type_map; *** 1296,1301 **** --- 1391,1399 ---- /* True iff TYPE is a Java array type. */ #define TYPE_ARRAY_P(TYPE) TYPE_LANG_FLAG_1 (TYPE) + /* True for an INDIRECT_REF created from a 'ARRAY.length' operation. */ + #define IS_ARRAY_LENGTH_ACCESS(NODE) TREE_LANG_FLAG_4 (NODE) + /* If FUNCTION_TYPE or METHOD_TYPE: cache for build_java_argument_signature. */ #define TYPE_ARGUMENT_SIGNATURE(TYPE) TYPE_VFIELD(TYPE) *************** extern tree *type_map; *** 1322,1337 **** TYPE_LANG_FLAG_5 (TYPE) /* True if class TYPE is currently being laid out. Helps in detection ! of inheritance cycle occuring as a side effect of performing the layout of a class. */ #define CLASS_BEING_LAIDOUT(TYPE) TYPE_LANG_FLAG_6 (TYPE) /* True if class TYPE is currently being laid out. Helps in detection ! of inheritance cycle occuring as a side effect of performing the layout of a class. */ #define CLASS_BEING_LAIDOUT(TYPE) TYPE_LANG_FLAG_6 (TYPE) ! /* True if class TYPE has a field initializer $finit$ function */ #define CLASS_HAS_FINIT_P(TYPE) TYPE_FINIT_STMT_LIST (TYPE) /* True if identifier ID was seen while processing a single type import stmt */ --- 1420,1435 ---- TYPE_LANG_FLAG_5 (TYPE) /* True if class TYPE is currently being laid out. Helps in detection ! of inheritance cycle occurring as a side effect of performing the layout of a class. */ #define CLASS_BEING_LAIDOUT(TYPE) TYPE_LANG_FLAG_6 (TYPE) /* True if class TYPE is currently being laid out. Helps in detection ! of inheritance cycle occurring as a side effect of performing the layout of a class. */ #define CLASS_BEING_LAIDOUT(TYPE) TYPE_LANG_FLAG_6 (TYPE) ! /* True if class TYPE has a field initializer finit$ function */ #define CLASS_HAS_FINIT_P(TYPE) TYPE_FINIT_STMT_LIST (TYPE) /* True if identifier ID was seen while processing a single type import stmt */ *************** extern tree *type_map; *** 1370,1375 **** --- 1468,1477 ---- already checked (for redifitions, etc, see java_check_regular_methods.) */ #define CLASS_METHOD_CHECKED_P(EXPR) TREE_LANG_FLAG_2 (EXPR) + /* True if TYPE (a TREE_TYPE denoting a class type) was found to + feature a finalizer method. */ + #define HAS_FINALIZER_P(EXPR) TREE_LANG_FLAG_3 (EXPR) + /* True if EXPR (a WFL in that case) resolves into an expression name */ #define RESOLVE_EXPRESSION_NAME_P(WFL) TREE_LANG_FLAG_0 (WFL) *************** extern tree *type_map; *** 1451,1464 **** scope of TYPE_DECL. */ #define DECL_INNER_CLASS_LIST(NODE) DECL_INITIAL (NODE) ! /* Build a IDENTIFIER_POINTER for a file name we're considering. We ! need to register the root, but we're trying to register it only ! once. */ ! #define BUILD_FILENAME_IDENTIFIER_NODE(F, S) \ ! if (!((F) = maybe_get_identifier ((S)))) \ ! { \ ! (F) = get_identifier ((S)); \ ! ggc_mark_tree ((F)); \ } /* Add a FIELD_DECL to RECORD_TYPE RTYPE. --- 1553,1566 ---- scope of TYPE_DECL. */ #define DECL_INNER_CLASS_LIST(NODE) DECL_INITIAL (NODE) ! /* Build a IDENTIFIER_NODE for a file name we're considering. Since ! all_class_filename is a registered root, putting this identifier ! in a TREE_LIST it holds keeps this node alive. */ ! #define BUILD_FILENAME_IDENTIFIER_NODE(F, S) \ ! if (!((F) = maybe_get_identifier ((S)))) \ ! { \ ! (F) = get_identifier ((S)); \ ! tree_cons ((F), NULL_TREE, all_class_filename); \ } /* Add a FIELD_DECL to RECORD_TYPE RTYPE. *************** extern tree *type_map; *** 1554,1560 **** (inherits_from_p ((TYPE), runtime_exception_type_node) \ || inherits_from_p ((TYPE), error_exception_type_node)) ! extern int java_error_count; \ /* Make the current function where this macro is invoked report error messages and and return, if any */ --- 1656,1666 ---- (inherits_from_p ((TYPE), runtime_exception_type_node) \ || inherits_from_p ((TYPE), error_exception_type_node)) ! /* True when we can perform static class initialization optimization */ ! #define STATIC_CLASS_INIT_OPT_P() \ ! (flag_optimize_sci && (optimize >= 2) && ! flag_emit_class_files) ! ! extern int java_error_count; /* Make the current function where this macro is invoked report error messages and and return, if any */ diff -Nrc3pad gcc-3.0.4/gcc/java/javaop.h gcc-3.1/gcc/java/javaop.h *** gcc-3.0.4/gcc/java/javaop.h Tue Aug 29 16:12:59 2000 --- gcc-3.1/gcc/java/javaop.h Sat May 26 01:31:47 2001 *************** The Free Software Foundation is independ *** 23,30 **** /* Written by Per Bothner , February 1996. */ ! #ifndef JAVAOP_H ! #define JAVAOP_H typedef unsigned char uint8; #ifndef int16 --- 23,30 ---- /* Written by Per Bothner , February 1996. */ ! #ifndef GCC_JAVAOP_H ! #define GCC_JAVAOP_H typedef unsigned char uint8; #ifndef int16 *************** WORDS_TO_DOUBLE(jword hi, jword lo) *** 155,158 **** : ((PREFIX_CHAR) & 0x10) == 0 ? 3 \ : ((PREFIX_CHAR) & 0x08) == 0 ? 4 : 5) ! #endif /* !JAVAOP_H */ --- 155,158 ---- : ((PREFIX_CHAR) & 0x10) == 0 ? 3 \ : ((PREFIX_CHAR) & 0x08) == 0 ? 4 : 5) ! #endif /* ! GCC_JAVAOP_H */ diff -Nrc3pad gcc-3.0.4/gcc/java/jcf-dump.1 gcc-3.1/gcc/java/jcf-dump.1 *** gcc-3.0.4/gcc/java/jcf-dump.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/jcf-dump.1 Wed May 15 02:46:02 2002 *************** *** 0 **** --- 1,200 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:02 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "JCF-DUMP 1" + .TH JCF-DUMP 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + jcf-dump \- print information about Java class files + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + jcf-dump [\fB\-c\fR] [\fB\*(--javap\fR] + [\fB\*(--classpath\fR=\fIpath\fR] [\fB\*(--CLASSPATH\fR=\fIpath\fR] + [\fB\-I\fR\fIdir\fR...] [\fB\-o\fR \fIfile\fR] + [\fB\*(--version\fR] [\fB\*(--help\fR] [\fB\-v\fR] [\fB\*(--verbose\fR] + \fIclassname\fR... + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + This is a class file examiner, similar to \f(CW\*(C`javap\*(C'\fR. It will print + information about a number of classes, which are specifed by class name + or file name. + .SH "OPTIONS" + .IX Header "OPTIONS" + .Ip "\fB\-c\fR" 4 + .IX Item "-c" + Disassemble method bodies. By default method bodies are not printed. + .Ip "\fB\*(--javap\fR" 4 + .IX Item "javap" + Generate output in \f(CW\*(C`javap\*(C'\fR format. The implementation of this + feature is very incomplete. + .Ip "\fB\*(--classpath=\fR\fIpath\fR" 4 + .IX Item "classpath=path" + .PD 0 + .Ip "\fB\*(--CLASSPATH=\fR\fIpath\fR" 4 + .IX Item "CLASSPATH=path" + .Ip "\fB\-I\fR\fIdirectory\fR" 4 + .IX Item "-Idirectory" + .Ip "\fB\-o\fR \fIfile\fR" 4 + .IX Item "-o file" + .PD + These options as the same as the corresponding \fBgcj\fR options. + .Ip "\fB\*(--help\fR" 4 + .IX Item "help" + Print help, then exit. + .Ip "\fB\*(--version\fR" 4 + .IX Item "version" + Print version number, then exit. + .Ip "\fB\-v, \-\-verbose\fR" 4 + .IX Item "-v, --verbose" + Print extra information while running. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + \&\fIgcc\fR\|(1), \fIgcj\fR\|(1), \fIgcjh\fR\|(1), \fIgij\fR\|(1), \fIjcf-dump\fR\|(1), \fIgfdl\fR\|(7), + and the Info entries for \fIgcj\fR and \fIgcc\fR. + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/jcf-dump.c gcc-3.1/gcc/java/jcf-dump.c *** gcc-3.0.4/gcc/java/jcf-dump.c Fri Jan 12 17:28:23 2001 --- gcc-3.1/gcc/java/jcf-dump.c Wed Apr 10 13:09:00 2002 *************** *** 1,7 **** /* Program to dump out a Java(TM) .class file. Functionally similar to Sun's javap. ! Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by --- 1,7 ---- /* Program to dump out a Java(TM) .class file. Functionally similar to Sun's javap. ! Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by *************** DEFUN (print_access_flags, (stream, flag *** 363,370 **** --- 363,374 ---- if (flags & ACC_PUBLIC) fprintf (stream, " public"); if (flags & ACC_PRIVATE) fprintf (stream, " private"); if (flags & ACC_PROTECTED) fprintf (stream, " protected"); + if (flags & ACC_ABSTRACT) fprintf (stream, " abstract"); if (flags & ACC_STATIC) fprintf (stream, " static"); if (flags & ACC_FINAL) fprintf (stream, " final"); + if (flags & ACC_TRANSIENT) fprintf (stream, " transient"); + if (flags & ACC_VOLATILE) fprintf (stream, " volatile"); + if (flags & ACC_NATIVE) fprintf (stream, " native"); if (flags & ACC_SYNCHRONIZED) { if (context == 'c') *************** DEFUN (print_access_flags, (stream, flag *** 372,382 **** else fprintf (stream, " synchronized"); } - if (flags & ACC_VOLATILE) fprintf (stream, " volatile"); - if (flags & ACC_TRANSIENT) fprintf (stream, " transient"); - if (flags & ACC_NATIVE) fprintf (stream, " native"); if (flags & ACC_INTERFACE) fprintf (stream, " interface"); ! if (flags & ACC_ABSTRACT) fprintf (stream, " abstract"); } --- 376,383 ---- else fprintf (stream, " synchronized"); } if (flags & ACC_INTERFACE) fprintf (stream, " interface"); ! if (flags & ACC_STRICT) fprintf (stream, " strictfp"); } *************** DEFUN(print_constant, (out, jcf, index, *** 504,510 **** case CONSTANT_Float: { jfloat fnum = JPOOL_FLOAT (jcf, index); ! fprintf (out, "%s%.10g", verbosity > 1 ? "Float " : "", (double) fnum); if (verbosity > 1) fprintf (out, ", bits = 0x%08lx", (long) (* (int32 *) &fnum)); break; --- 505,511 ---- case CONSTANT_Float: { jfloat fnum = JPOOL_FLOAT (jcf, index); ! fprintf (out, "%s%.10g", verbosity > 0 ? "Float " : "", (double) fnum); if (verbosity > 1) fprintf (out, ", bits = 0x%08lx", (long) (* (int32 *) &fnum)); break; *************** DEFUN(print_constant, (out, jcf, index, *** 512,518 **** case CONSTANT_Double: { jdouble dnum = JPOOL_DOUBLE (jcf, index); ! fprintf (out, "%s%.20g", verbosity > 1 ? "Double " : "", dnum); if (verbosity > 1) { int32 hi, lo; --- 513,519 ---- case CONSTANT_Double: { jdouble dnum = JPOOL_DOUBLE (jcf, index); ! fprintf (out, "%s%.20g", verbosity > 0 ? "Double " : "", dnum); if (verbosity > 1) { int32 hi, lo; *************** DEFUN(process_class, (jcf), *** 772,793 **** /* This is used to mark options with no short value. */ #define LONG_OPT(Num) ((Num) + 128) ! #define OPT_classpath LONG_OPT (0) ! #define OPT_CLASSPATH LONG_OPT (1) ! #define OPT_HELP LONG_OPT (2) ! #define OPT_VERSION LONG_OPT (3) ! #define OPT_JAVAP LONG_OPT (4) ! static struct option options[] = { ! { "classpath", required_argument, NULL, OPT_classpath }, ! { "CLASSPATH", required_argument, NULL, OPT_CLASSPATH }, ! { "help", no_argument, NULL, OPT_HELP }, ! { "verbose", no_argument, NULL, 'v' }, ! { "version", no_argument, NULL, OPT_VERSION }, ! { "javap", no_argument, NULL, OPT_JAVAP }, ! { "print-main", no_argument, &flag_print_main, 1 }, ! { NULL, no_argument, NULL, 0 } }; static void --- 773,798 ---- /* This is used to mark options with no short value. */ #define LONG_OPT(Num) ((Num) + 128) ! #define OPT_classpath LONG_OPT (0) ! #define OPT_CLASSPATH OPT_classpath ! #define OPT_bootclasspath LONG_OPT (1) ! #define OPT_extdirs LONG_OPT (2) ! #define OPT_HELP LONG_OPT (3) ! #define OPT_VERSION LONG_OPT (4) ! #define OPT_JAVAP LONG_OPT (5) ! static const struct option options[] = { ! { "classpath", required_argument, NULL, OPT_classpath }, ! { "bootclasspath", required_argument, NULL, OPT_bootclasspath }, ! { "extdirs", required_argument, NULL, OPT_extdirs }, ! { "CLASSPATH", required_argument, NULL, OPT_CLASSPATH }, ! { "help", no_argument, NULL, OPT_HELP }, ! { "verbose", no_argument, NULL, 'v' }, ! { "version", no_argument, NULL, OPT_VERSION }, ! { "javap", no_argument, NULL, OPT_JAVAP }, ! { "print-main", no_argument, &flag_print_main, 1 }, ! { NULL, no_argument, NULL, 0 } }; static void *************** help () *** 806,813 **** printf (" --javap Generate output in `javap' format\n"); printf ("\n"); printf (" --classpath PATH Set path to find .class files\n"); - printf (" --CLASSPATH PATH Set path to find .class files\n"); printf (" -IDIR Append directory to class path\n"); printf (" -o FILE Set output file name\n"); printf ("\n"); printf (" --help Print this help, then exit\n"); --- 811,819 ---- printf (" --javap Generate output in `javap' format\n"); printf ("\n"); printf (" --classpath PATH Set path to find .class files\n"); printf (" -IDIR Append directory to class path\n"); + printf (" --bootclasspath PATH Override built-in class path\n"); + printf (" --extdirs PATH Set extensions directory path\n"); printf (" -o FILE Set output file name\n"); printf ("\n"); printf (" --help Print this help, then exit\n"); *************** help () *** 822,829 **** static void version () { ! printf ("jcf-dump (%s)\n\n", version_string); ! printf ("Copyright (C) 2001 Free Software Foundation, Inc.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"); exit (0); --- 828,835 ---- static void version () { ! printf ("jcf-dump (GCC) %s\n\n", version_string); ! printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"); exit (0); *************** DEFUN(main, (argc, argv), *** 874,881 **** jcf_path_classpath_arg (optarg); break; ! case OPT_CLASSPATH: ! jcf_path_CLASSPATH_arg (optarg); break; case OPT_HELP: --- 880,891 ---- jcf_path_classpath_arg (optarg); break; ! case OPT_bootclasspath: ! jcf_path_bootclasspath_arg (optarg); ! break; ! ! case OPT_extdirs: ! jcf_path_extdirs_arg (optarg); break; case OPT_HELP: *************** DEFUN(main, (argc, argv), *** 889,894 **** --- 899,905 ---- case OPT_JAVAP: flag_javap_compatible++; flag_print_constant_pool = 0; + flag_print_attributes = 0; break; default: *************** DEFUN(main, (argc, argv), *** 902,908 **** usage (); } ! jcf_path_seal (); if (flag_print_main) { --- 913,919 ---- usage (); } ! jcf_path_seal (verbose); if (flag_print_main) { *************** DEFUN(disassemble_method, (jcf, byte_ops *** 1201,1210 **** #define SPECIAL_IINC(OPERAND_TYPE) \ i = saw_wide ? IMMEDIATE_u2 : IMMEDIATE_u1; \ ! fprintf (out, " %ld", (long) i); \ ! INT_temp = saw_wide ? IMMEDIATE_s2 : IMMEDIATE_s1; \ saw_wide = 0; \ ! fprintf (out, " %ld", (long) INT_temp) #define SPECIAL_WIDE(OPERAND_TYPE) \ saw_wide = 1; --- 1212,1221 ---- #define SPECIAL_IINC(OPERAND_TYPE) \ i = saw_wide ? IMMEDIATE_u2 : IMMEDIATE_u1; \ ! fprintf (out, " %d", i); \ ! i = saw_wide ? IMMEDIATE_s2 : IMMEDIATE_s1; \ saw_wide = 0; \ ! fprintf (out, " %d", i) #define SPECIAL_WIDE(OPERAND_TYPE) \ saw_wide = 1; diff -Nrc3pad gcc-3.0.4/gcc/java/jcf-io.c gcc-3.1/gcc/java/jcf-io.c *** gcc-3.0.4/gcc/java/jcf-io.c Sun Apr 29 11:26:30 2001 --- gcc-3.1/gcc/java/jcf-io.c Mon Dec 3 19:13:40 2001 *************** DEFUN(open_class, (filename, jcf, stream *** 242,247 **** --- 242,248 ---- jcf->read_ptr = NULL; jcf->read_end = NULL; jcf->read_state = stream; + jcf->filename = filename; jcf->filbuf = jcf_filbuf_from_stdio; } else *************** DEFUN(find_class, (classname, classname_ *** 405,420 **** up no matter what. FIXME. */ if (! java && ! class && java_buf.st_mtime > class_buf.st_mtime) { - char *stripped_class_name = xstrdup (classname); - int i = strlen (stripped_class_name); - - while (stripped_class_name [i] != '.') - i--; - - stripped_class_name [i] = '\0'; if (flag_newer) ! warning ("Source file for class `%s' is newer than its matching class file. Source file used instead", stripped_class_name); ! free (stripped_class_name); class = -1; } --- 406,413 ---- up no matter what. FIXME. */ if (! java && ! class && java_buf.st_mtime > class_buf.st_mtime) { if (flag_newer) ! warning ("source file for class `%s' is newer than its matching class file. Source file `%s' used instead", classname, java_buffer); class = -1; } *************** DEFUN(jcf_print_utf8_replace, (stream, s *** 564,570 **** /* Check that all the cross-references in the constant pool are valid. Returns 0 on success. ! Otherwise, returns the index of the (first) invalid entry. */ int DEFUN(verify_constant_pool, (jcf), --- 557,565 ---- /* Check that all the cross-references in the constant pool are valid. Returns 0 on success. ! Otherwise, returns the index of the (first) invalid entry. ! Only checks internal consistency, but does not check that ! any classes, fields, or methods are valid.*/ int DEFUN(verify_constant_pool, (jcf), *************** DEFUN(format_uint, (buffer, value, base) *** 630,636 **** /* Note this code does not pretend to be optimized. */ do { int digit = value % base; ! static char digit_chars[] = "0123456789abcdefghijklmnopqrstuvwxyz"; *--buf_ptr = digit_chars[digit]; value /= base; } while (value != 0); --- 625,631 ---- /* Note this code does not pretend to be optimized. */ do { int digit = value % base; ! static const char digit_chars[] = "0123456789abcdefghijklmnopqrstuvwxyz"; *--buf_ptr = digit_chars[digit]; value /= base; } while (value != 0); diff -Nrc3pad gcc-3.0.4/gcc/java/jcf-parse.c gcc-3.1/gcc/java/jcf-parse.c *** gcc-3.0.4/gcc/java/jcf-parse.c Mon May 21 22:01:48 2001 --- gcc-3.1/gcc/java/jcf-parse.c Mon Apr 22 20:36:47 2002 *************** *** 1,5 **** /* Parser for Java(TM) .class files. ! Copyright (C) 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,6 ---- /* Parser for Java(TM) .class files. ! Copyright (C) 1996, 1998, 1999, 2000, 2001, 2002 ! Free Software Foundation, Inc. This file is part of GNU CC. *************** The Free Software Foundation is independ *** 35,40 **** --- 36,43 ---- #include "toplev.h" #include "parse.h" #include "ggc.h" + #include "debug.h" + #include "assert.h" #ifdef HAVE_LOCALE_H #include *************** static void parse_zip_file_entries PARAM *** 93,114 **** static void process_zip_dir PARAMS ((FILE *)); static void parse_source_file_1 PARAMS ((tree, FILE *)); static void parse_source_file_2 PARAMS ((void)); static void parse_class_file PARAMS ((void)); static void set_source_filename PARAMS ((JCF *, int)); - static int predefined_filename_p PARAMS ((tree)); static void ggc_mark_jcf PARAMS ((void**)); static void jcf_parse PARAMS ((struct JCF*)); static void load_inner_classes PARAMS ((tree)); /* Mark (for garbage collection) all the tree nodes that are ! referenced from JCF's constant pool table. */ static void ggc_mark_jcf (elt) void **elt; { JCF *jcf = *(JCF**) elt; ! if (jcf != NULL) { CPool *cpool = &jcf->cpool; int size = CPOOL_COUNT(cpool); --- 96,118 ---- static void process_zip_dir PARAMS ((FILE *)); static void parse_source_file_1 PARAMS ((tree, FILE *)); static void parse_source_file_2 PARAMS ((void)); + static void parse_source_file_3 PARAMS ((void)); static void parse_class_file PARAMS ((void)); static void set_source_filename PARAMS ((JCF *, int)); static void ggc_mark_jcf PARAMS ((void**)); static void jcf_parse PARAMS ((struct JCF*)); static void load_inner_classes PARAMS ((tree)); /* Mark (for garbage collection) all the tree nodes that are ! referenced from JCF's constant pool table. Do that only if the JCF ! hasn't been marked finished. */ static void ggc_mark_jcf (elt) void **elt; { JCF *jcf = *(JCF**) elt; ! if (jcf != NULL && !jcf->finished) { CPool *cpool = &jcf->cpool; int size = CPOOL_COUNT(cpool); *************** parse_signature (jcf, sig_index) *** 259,272 **** } void ! init_lex () ! { ! /* Make identifier nodes long enough for the language-specific slots. */ ! set_identifier_size (sizeof (struct lang_identifier)); ! } ! ! void ! set_yydebug (value) int value; { yydebug = value; --- 263,269 ---- } void ! java_set_yydebug (value) int value; { yydebug = value; *************** get_constant (jcf, index) *** 295,304 **** } case CONSTANT_Long: { ! jint num = JPOOL_INT (jcf, index); HOST_WIDE_INT lo, hi; lshift_double (num, 0, 32, 64, &lo, &hi, 0); ! num = JPOOL_INT (jcf, index+1) & 0xffffffff; add_double (lo, hi, num, 0, &lo, &hi); value = build_int_2 (lo, hi); TREE_TYPE (value) = long_type_node; --- 292,301 ---- } case CONSTANT_Long: { ! unsigned HOST_WIDE_INT num = JPOOL_UINT (jcf, index); HOST_WIDE_INT lo, hi; lshift_double (num, 0, 32, 64, &lo, &hi, 0); ! num = JPOOL_UINT (jcf, index+1); add_double (lo, hi, num, 0, &lo, &hi); value = build_int_2 (lo, hi); TREE_TYPE (value) = long_type_node; *************** get_constant (jcf, index) *** 325,335 **** HOST_WIDE_INT num[2]; REAL_VALUE_TYPE d; HOST_WIDE_INT lo, hi; ! num[0] = JPOOL_INT (jcf, index); lshift_double (num[0], 0, 32, 64, &lo, &hi, 0); ! num[0] = JPOOL_INT (jcf, index+1); add_double (lo, hi, num[0], 0, &lo, &hi); ! if (FLOAT_WORDS_BIG_ENDIAN) { num[0] = hi; num[1] = lo; --- 322,340 ---- HOST_WIDE_INT num[2]; REAL_VALUE_TYPE d; HOST_WIDE_INT lo, hi; ! num[0] = JPOOL_UINT (jcf, index); lshift_double (num[0], 0, 32, 64, &lo, &hi, 0); ! num[0] = JPOOL_UINT (jcf, index+1); add_double (lo, hi, num[0], 0, &lo, &hi); ! ! /* Since ereal_from_double expects an array of HOST_WIDE_INT ! in the target's format, we swap the elements for big endian ! targets, unless HOST_WIDE_INT is sufficiently large to ! contain a target double, in which case the 2nd element ! is ignored. ! ! FIXME: Is this always right for cross targets? */ ! if (FLOAT_WORDS_BIG_ENDIAN && sizeof(num[0]) < 8) { num[0] = hi; num[1] = lo; *************** get_constant (jcf, index) *** 358,373 **** tree name = get_name_constant (jcf, JPOOL_USHORT1 (jcf, index)); const char *utf8_ptr = IDENTIFIER_POINTER (name); int utf8_len = IDENTIFIER_LENGTH (name); - unsigned char *str_ptr; - unsigned char *str; const unsigned char *utf8; ! int i, str_len; ! /* Count the number of Unicode characters in the string, ! while checking for a malformed Utf8 string. */ utf8 = (const unsigned char *) utf8_ptr; i = utf8_len; - str_len = 0; while (i > 0) { int char_len = UT8_CHAR_LENGTH (*utf8); --- 363,374 ---- tree name = get_name_constant (jcf, JPOOL_USHORT1 (jcf, index)); const char *utf8_ptr = IDENTIFIER_POINTER (name); int utf8_len = IDENTIFIER_LENGTH (name); const unsigned char *utf8; ! int i; ! /* Check for a malformed Utf8 string. */ utf8 = (const unsigned char *) utf8_ptr; i = utf8_len; while (i > 0) { int char_len = UT8_CHAR_LENGTH (*utf8); *************** get_constant (jcf, index) *** 376,423 **** utf8 += char_len; i -= char_len; - str_len++; } ! /* Allocate a scratch buffer, convert the string to UCS2, and copy it ! into the new space. */ ! str_ptr = (unsigned char *) alloca (2 * str_len); ! str = str_ptr; ! utf8 = (const unsigned char *)utf8_ptr; ! ! for (i = 0; i < str_len; i++) ! { ! int char_value; ! int char_len = UT8_CHAR_LENGTH (*utf8); ! switch (char_len) ! { ! case 1: ! char_value = *utf8++; ! break; ! case 2: ! char_value = *utf8++ & 0x1F; ! char_value = (char_value << 6) | (*utf8++ & 0x3F); ! break; ! case 3: ! char_value = *utf8++ & 0x0F; ! char_value = (char_value << 6) | (*utf8++ & 0x3F); ! char_value = (char_value << 6) | (*utf8++ & 0x3F); ! break; ! default: ! goto bad; ! } ! if (BYTES_BIG_ENDIAN) ! { ! *str++ = char_value >> 8; ! *str++ = char_value & 0xFF; ! } ! else ! { ! *str++ = char_value & 0xFF; ! *str++ = char_value >> 8; ! } ! } ! value = build_string (str - str_ptr, str_ptr); TREE_TYPE (value) = build_pointer_type (string_type_node); } break; --- 377,386 ---- utf8 += char_len; i -= char_len; } ! /* Allocate a new string value. */ ! value = build_string (utf8_len, utf8_ptr); TREE_TYPE (value) = build_pointer_type (string_type_node); } break; *************** handle_innerclass_attribute (count, jcf) *** 465,470 **** --- 428,435 ---- /* Read inner_name_index. If the class we're dealing with is an annonymous class, it must be 0. */ int ini = JCF_readu2 (jcf); + /* Read the access flag. */ + int acc = JCF_readu2 (jcf); /* If icii is 0, don't try to read the class. */ if (icii >= 0) { *************** handle_innerclass_attribute (count, jcf) *** 475,487 **** { tree outer = TYPE_NAME (get_class_constant (jcf, ocii)); tree alias = (ini ? get_name_constant (jcf, ini) : NULL_TREE); DECL_CONTEXT (decl) = outer; DECL_INNER_CLASS_LIST (outer) = tree_cons (decl, alias, DECL_INNER_CLASS_LIST (outer)); CLASS_COMPLETE_P (decl) = 1; } } - JCF_SKIP (jcf, 2); } } --- 440,452 ---- { tree outer = TYPE_NAME (get_class_constant (jcf, ocii)); tree alias = (ini ? get_name_constant (jcf, ini) : NULL_TREE); + set_class_decl_access_flags (acc, decl); DECL_CONTEXT (decl) = outer; DECL_INNER_CLASS_LIST (outer) = tree_cons (decl, alias, DECL_INNER_CLASS_LIST (outer)); CLASS_COMPLETE_P (decl) = 1; } } } } *************** read_class (name) *** 601,606 **** --- 566,572 ---- fatal_io_error ("can't reopen %s", input_filename); parse_source_file_1 (file, finput); parse_source_file_2 (); + parse_source_file_3 (); if (fclose (finput)) fatal_io_error ("can't close %s", input_filename); } *************** load_class (class_or_name, verbose) *** 646,652 **** tree class_or_name; int verbose; { ! tree name; /* class_or_name can be the name of the class we want to load */ if (TREE_CODE (class_or_name) == IDENTIFIER_NODE) --- 612,619 ---- tree class_or_name; int verbose; { ! tree name, saved; ! int class_loaded; /* class_or_name can be the name of the class we want to load */ if (TREE_CODE (class_or_name) == IDENTIFIER_NODE) *************** load_class (class_or_name, verbose) *** 659,666 **** else name = DECL_NAME (TYPE_NAME (class_or_name)); ! if (read_class (name) == 0 && verbose) ! error ("Cannot find file for class %s.", IDENTIFIER_POINTER (name)); } /* Parse the .class file JCF. */ --- 626,656 ---- else name = DECL_NAME (TYPE_NAME (class_or_name)); ! saved = name; ! while (1) ! { ! char *separator; ! ! if ((class_loaded = read_class (name))) ! break; ! ! /* We failed loading name. Now consider that we might be looking ! for a inner class. */ ! if ((separator = strrchr (IDENTIFIER_POINTER (name), '$')) ! || (separator = strrchr (IDENTIFIER_POINTER (name), '.'))) ! { ! int c = *separator; ! *separator = '\0'; ! name = get_identifier (IDENTIFIER_POINTER (name)); ! *separator = c; ! } ! /* Otherwise, we failed, we bail. */ ! else ! break; ! } ! ! if (!class_loaded && verbose) ! error ("cannot find file for class %s", IDENTIFIER_POINTER (saved)); } /* Parse the .class file JCF. */ *************** jcf_parse (jcf) *** 728,734 **** -fforce-classes-archive-check was specified. */ if (!jcf->right_zip && (!flag_emit_class_files || flag_force_classes_archive_check)) ! fatal_error ("The `java.lang.Object' that was found in `%s' didn't have the special zero-length `gnu.gcj.gcj-compiled' attribute. This generally means that your classpath is incorrect set. Use `info gcj \"Input Options\"' to see the info page describing how to set the classpath.", jcf->filename); } else all_class_list = tree_cons (NULL_TREE, --- 718,724 ---- -fforce-classes-archive-check was specified. */ if (!jcf->right_zip && (!flag_emit_class_files || flag_force_classes_archive_check)) ! fatal_error ("the `java.lang.Object' that was found in `%s' didn't have the special zero-length `gnu.gcj.gcj-compiled' attribute. This generally means that your classpath is incorrectly set. Use `info gcj \"Input Options\"' to see the info page describing how to set the classpath", jcf->filename); } else all_class_list = tree_cons (NULL_TREE, *************** init_outgoing_cpool () *** 763,769 **** static void parse_class_file () { ! tree method; const char *save_input_filename = input_filename; int save_lineno = lineno; --- 753,759 ---- static void parse_class_file () { ! tree method, field; const char *save_input_filename = input_filename; int save_lineno = lineno; *************** parse_class_file () *** 771,785 **** input_filename = DECL_SOURCE_FILE (TYPE_NAME (current_class)); lineno = 0; ! debug_start_source_file (input_filename); init_outgoing_cpool (); /* Currently we always have to emit calls to _Jv_InitClass when compiling from class files. */ always_initialize_class_p = 1; ! for ( method = TYPE_METHODS (CLASS_TO_HANDLE_TYPE (current_class)); ! method != NULL_TREE; method = TREE_CHAIN (method)) { JCF *jcf = current_jcf; --- 761,780 ---- input_filename = DECL_SOURCE_FILE (TYPE_NAME (current_class)); lineno = 0; ! (*debug_hooks->start_source_file) (lineno, input_filename); init_outgoing_cpool (); /* Currently we always have to emit calls to _Jv_InitClass when compiling from class files. */ always_initialize_class_p = 1; ! for (field = TYPE_FIELDS (CLASS_TO_HANDLE_TYPE (current_class)); ! field != NULL_TREE; field = TREE_CHAIN (field)) ! if (FIELD_STATIC (field)) ! DECL_EXTERNAL (field) = 0; ! ! for (method = TYPE_METHODS (CLASS_TO_HANDLE_TYPE (current_class)); ! method != NULL_TREE; method = TREE_CHAIN (method)) { JCF *jcf = current_jcf; *************** parse_class_file () *** 788,797 **** if (METHOD_NATIVE (method)) { if (! flag_jni) continue; ! DECL_MAX_LOCALS (method) ! = list_length (TYPE_ARG_TYPES (TREE_TYPE (method))); start_java_method (method); give_name_to_locals (jcf); expand_expr_stmt (build_jni_stub (method)); --- 783,803 ---- if (METHOD_NATIVE (method)) { + tree arg; + int decl_max_locals; + if (! flag_jni) continue; ! /* We need to compute the DECL_MAX_LOCALS. We need to take ! the wide types into account too. */ ! for (arg = TYPE_ARG_TYPES (TREE_TYPE (method)), decl_max_locals = 0; ! arg != end_params_node; ! arg = TREE_CHAIN (arg), decl_max_locals += 1) ! { ! if (TREE_VALUE (arg) && TYPE_IS_WIDE (TREE_VALUE (arg))) ! decl_max_locals += 1; ! } ! DECL_MAX_LOCALS (method) = decl_max_locals; start_java_method (method); give_name_to_locals (jcf); expand_expr_stmt (build_jni_stub (method)); *************** parse_class_file () *** 801,806 **** --- 807,813 ---- if (DECL_CODE_OFFSET (method) == 0) { + current_function_decl = method; error ("missing Code attribute"); continue; } *************** parse_class_file () *** 846,852 **** finish_class (); ! debug_end_source_file (save_lineno); input_filename = save_input_filename; lineno = save_lineno; } --- 853,859 ---- finish_class (); ! (*debug_hooks->end_source_file) (save_lineno); input_filename = save_input_filename; lineno = save_lineno; } *************** parse_source_file_1 (file, finput) *** 869,881 **** /* There's no point in trying to find the current encoding unless we are going to do something intelligent with it -- hence the test for iconv. */ ! #ifdef HAVE_ICONV ! #ifdef HAVE_NL_LANGINFO setlocale (LC_CTYPE, ""); if (current_encoding == NULL) current_encoding = nl_langinfo (CODESET); ! #endif /* HAVE_NL_LANGINFO */ ! #endif /* HAVE_ICONV */ if (current_encoding == NULL || *current_encoding == '\0') current_encoding = DEFAULT_ENCODING; --- 876,886 ---- /* There's no point in trying to find the current encoding unless we are going to do something intelligent with it -- hence the test for iconv. */ ! #if defined (HAVE_LOCALE_H) && defined (HAVE_ICONV) && defined (HAVE_NL_LANGINFO) setlocale (LC_CTYPE, ""); if (current_encoding == NULL) current_encoding = nl_langinfo (CODESET); ! #endif if (current_encoding == NULL || *current_encoding == '\0') current_encoding = DEFAULT_ENCODING; *************** parse_source_file_2 () *** 895,900 **** --- 900,911 ---- int save_error_count = java_error_count; java_complete_class (); /* Parse unsatisfied class decl. */ java_parse_abort_on_error (); + } + + static void + parse_source_file_3 () + { + int save_error_count = java_error_count; java_check_circular_reference (); /* Check on circular references */ java_parse_abort_on_error (); java_fix_constructors (); /* Fix the constructors */ *************** parse_source_file_2 () *** 902,915 **** java_reorder_fields (); /* Reorder the fields */ } ! static int predefined_filename_p (node) tree node; { ! int i; ! for (i = 0; i < PREDEF_FILENAMES_SIZE; i++) ! if (predef_filenames [i] == node) ! return 1; return 0; } --- 913,936 ---- java_reorder_fields (); /* Reorder the fields */ } ! void ! add_predefined_file (name) ! tree name; ! { ! predef_filenames = tree_cons (NULL_TREE, name, predef_filenames); ! } ! ! int predefined_filename_p (node) tree node; { ! tree iter; ! ! for (iter = predef_filenames; iter != NULL_TREE; iter = TREE_CHAIN (iter)) ! { ! if (TREE_VALUE (iter) == node) ! return 1; ! } return 0; } *************** yyparse () *** 994,1002 **** int len = strlen (list); - if (*list != '/' && filename_count > 0) - obstack_grow (&temporary_obstack, "./", 2); - obstack_grow0 (&temporary_obstack, list, len); value = obstack_finish (&temporary_obstack); --- 1015,1020 ---- *************** yyparse () *** 1026,1032 **** { const char *saved_input_filename = input_filename; input_filename = value; ! warning ("source file seen twice on command line and will be compiled only once."); input_filename = saved_input_filename; } else --- 1044,1050 ---- { const char *saved_input_filename = input_filename; input_filename = value; ! warning ("source file seen twice on command line and will be compiled only once"); input_filename = saved_input_filename; } else *************** yyparse () *** 1044,1055 **** if (filename_count == 0) warning ("no input file specified"); current_jcf = main_jcf; current_file_list = nreverse (current_file_list); for (node = current_file_list; node; node = TREE_CHAIN (node)) { unsigned char magic_string[4]; ! uint32 magic; tree name = TREE_VALUE (node); /* Skip already parsed files */ --- 1062,1086 ---- if (filename_count == 0) warning ("no input file specified"); + if (resource_name) + { + const char *resource_filename; + + /* Only one resource file may be compiled at a time. */ + assert (TREE_CHAIN (current_file_list) == NULL); + + resource_filename = IDENTIFIER_POINTER (TREE_VALUE (current_file_list)); + compile_resource_file (resource_name, resource_filename); + + return 0; + } + current_jcf = main_jcf; current_file_list = nreverse (current_file_list); for (node = current_file_list; node; node = TREE_CHAIN (node)) { unsigned char magic_string[4]; ! uint32 magic = 0; tree name = TREE_VALUE (node); /* Skip already parsed files */ *************** yyparse () *** 1071,1081 **** input_filename = IDENTIFIER_POINTER (name); /* Figure what kind of file we're dealing with */ ! if (fread (magic_string, 1, 4, finput) != 4) ! fatal_io_error ("Premature end of input file %s", ! IDENTIFIER_POINTER (name)); ! fseek (finput, 0L, SEEK_SET); ! magic = GET_u4 (magic_string); if (magic == 0xcafebabe) { CLASS_FILE_P (node) = 1; --- 1102,1112 ---- input_filename = IDENTIFIER_POINTER (name); /* Figure what kind of file we're dealing with */ ! if (fread (magic_string, 1, 4, finput) == 4) ! { ! fseek (finput, 0L, SEEK_SET); ! magic = GET_u4 (magic_string); ! } if (magic == 0xcafebabe) { CLASS_FILE_P (node) = 1; *************** yyparse () *** 1121,1126 **** --- 1152,1164 ---- input_filename = ctxp->filename; parse_source_file_2 (); } + + for (ctxp = ctxp_for_generation; ctxp; ctxp = ctxp->next) + { + input_filename = ctxp->filename; + parse_source_file_3 (); + } + for (node = current_file_list; node; node = TREE_CHAIN (node)) { input_filename = IDENTIFIER_POINTER (TREE_VALUE (node)); *************** yyparse () *** 1138,1144 **** java_expand_classes (); if (!java_report_errors () && !flag_syntax_only) ! emit_register_classes (); return 0; } --- 1176,1186 ---- java_expand_classes (); if (!java_report_errors () && !flag_syntax_only) ! { ! emit_register_classes (); ! if (flag_indirect_dispatch) ! emit_offset_symbol_table (); ! } return 0; } *************** process_zip_dir (FILE *finput) *** 1206,1212 **** class_name_in_zip_dir = ZIPDIR_FILENAME (zdir); /* We choose to not to process entries with a zero size or entries ! not bearing the .class extention. */ if (!zdir->size || !zdir->filename_offset || strncmp (&class_name_in_zip_dir[zdir->filename_length-6], ".class", 6)) --- 1248,1254 ---- class_name_in_zip_dir = ZIPDIR_FILENAME (zdir); /* We choose to not to process entries with a zero size or entries ! not bearing the .class extension. */ if (!zdir->size || !zdir->filename_offset || strncmp (&class_name_in_zip_dir[zdir->filename_length-6], ".class", 6)) diff -Nrc3pad gcc-3.0.4/gcc/java/jcf-path.c gcc-3.1/gcc/java/jcf-path.c *** gcc-3.0.4/gcc/java/jcf-path.c Sun Dec 10 05:32:49 2000 --- gcc-3.1/gcc/java/jcf-path.c Wed Apr 10 15:23:05 2002 *************** *** 1,6 **** /* Handle CLASSPATH, -classpath, and path searching. ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by --- 1,6 ---- /* Handle CLASSPATH, -classpath, and path searching. ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by *************** The Free Software Foundation is independ *** 26,31 **** --- 26,33 ---- #include "config.h" #include "system.h" + #include + #include "jcf.h" /* Some boilerplate that really belongs in a header. */ *************** static void add_path PARAMS ((struct ent *** 71,78 **** built-in system directory (only libgcj.jar) CLASSPATH environment variable ! -CLASSPATH overrides CLASSPATH ! -classpath option - overrides CLASSPATH, -CLASSPATH, and built-in -I prepends path to list We implement this by keeping several path lists, and then simply --- 73,82 ---- built-in system directory (only libgcj.jar) CLASSPATH environment variable ! -classpath option overrides $CLASSPATH ! -CLASSPATH option is a synonym for -classpath (for compatibility) ! -bootclasspath overrides built-in ! -extdirs sets the extensions directory path (overrides built-in) -I prepends path to list We implement this by keeping several path lists, and then simply *************** static struct entry *include_dirs; *** 84,99 **** /* This holds the CLASSPATH environment variable. */ static struct entry *classpath_env; - /* This holds the -CLASSPATH command-line option. */ - static struct entry *classpath_u; - /* This holds the -classpath command-line option. */ ! static struct entry *classpath_l; /* This holds the default directories. Some of these will have the "system" flag set. */ static struct entry *sys_dirs; /* This is the sealed list. It is just a combination of other lists. */ static struct entry *sealed; --- 88,103 ---- /* This holds the CLASSPATH environment variable. */ static struct entry *classpath_env; /* This holds the -classpath command-line option. */ ! static struct entry *classpath_user; /* This holds the default directories. Some of these will have the "system" flag set. */ static struct entry *sys_dirs; + /* This holds the extensions path entries. */ + static struct entry *extensions; + /* This is the sealed list. It is just a combination of other lists. */ static struct entry *sealed; *************** add_path (entp, cp, is_system) *** 222,227 **** --- 226,233 ---- } } + static int init_done = 0; + /* Initialize the path module. */ void jcf_path_init () *************** jcf_path_init () *** 231,237 **** struct stat stat_b; int found = 0, len; ! add_entry (&sys_dirs, ".", 0); sep[0] = DIR_SEPARATOR; sep[1] = '\0'; --- 237,245 ---- struct stat stat_b; int found = 0, len; ! if (init_done) ! return; ! init_done = 1; sep[0] = DIR_SEPARATOR; sep[1] = '\0'; *************** jcf_path_init () *** 242,248 **** try = alloca (strlen (cp) + 50); /* The exec prefix can be something like /usr/local/bin/../lib/gcc-lib/. We want to change this ! into a pointer to the share directory. We support two configurations: one where prefix and exec-prefix are the same, and one where exec-prefix is `prefix/SOMETHING'. */ strcpy (try, cp); --- 250,256 ---- try = alloca (strlen (cp) + 50); /* The exec prefix can be something like /usr/local/bin/../lib/gcc-lib/. We want to change this ! into a pointer to the share/java directory. We support two configurations: one where prefix and exec-prefix are the same, and one where exec-prefix is `prefix/SOMETHING'. */ strcpy (try, cp); *************** jcf_path_init () *** 254,264 **** strcpy (try + len, "share"); strcat (try, sep); ! strcat (try, "libgcj.jar"); if (! stat (try, &stat_b)) { add_entry (&sys_dirs, try, 1); found = 1; } else { --- 262,281 ---- strcpy (try + len, "share"); strcat (try, sep); ! strcat (try, "java"); ! strcat (try, sep); ! strcat (try, "libgcj-" DEFAULT_TARGET_VERSION ".jar"); if (! stat (try, &stat_b)) { add_entry (&sys_dirs, try, 1); found = 1; + strcpy (&try[strlen (try) + - strlen ("libgcj-" DEFAULT_TARGET_VERSION ".jar")], + sep); + strcat (try, "ext"); + strcat (try, sep); + if (! stat (try, &stat_b)) + jcf_path_extdirs_arg (try); } else { *************** jcf_path_init () *** 266,305 **** strcat (try, sep); strcat (try, "share"); strcat (try, sep); ! strcat (try, "libgcj.jar"); if (! stat (try, &stat_b)) { add_entry (&sys_dirs, try, 1); found = 1; } } } if (! found) { /* Desperation: use the installed one. */ add_entry (&sys_dirs, LIBGCJ_ZIP_FILE, 1); } GET_ENV_PATH_LIST (cp, "CLASSPATH"); add_path (&classpath_env, cp, 0); } ! /* Call this when -classpath is seen on the command line. */ void jcf_path_classpath_arg (path) const char *path; { ! free_entry (&classpath_l); ! add_path (&classpath_l, path, 0); } ! /* Call this when -CLASSPATH is seen on the command line. */ void ! jcf_path_CLASSPATH_arg (path) const char *path; { ! free_entry (&classpath_u); ! add_path (&classpath_u, path, 0); } /* Call this when -I is seen on the command line. */ --- 283,410 ---- strcat (try, sep); strcat (try, "share"); strcat (try, sep); ! strcat (try, "java"); ! strcat (try, sep); ! strcat (try, "libgcj-" DEFAULT_TARGET_VERSION ".jar"); if (! stat (try, &stat_b)) { add_entry (&sys_dirs, try, 1); found = 1; + strcpy (&try[strlen (try) + - strlen ("libgcj-" DEFAULT_TARGET_VERSION ".jar")], + sep); + strcat (try, "ext"); + strcat (try, sep); + if (! stat (try, &stat_b)) + jcf_path_extdirs_arg (try); } } } if (! found) { /* Desperation: use the installed one. */ + char *extdirs; add_entry (&sys_dirs, LIBGCJ_ZIP_FILE, 1); + extdirs = (char *) alloca (strlen (LIBGCJ_ZIP_FILE)); + strcpy (extdirs, LIBGCJ_ZIP_FILE); + strcpy (&extdirs[strlen (LIBGCJ_ZIP_FILE) + - strlen ("libgcj-" DEFAULT_TARGET_VERSION ".jar")], + "ext"); + strcat (extdirs, sep); + if (! stat (extdirs, &stat_b)) + jcf_path_extdirs_arg (extdirs); } GET_ENV_PATH_LIST (cp, "CLASSPATH"); add_path (&classpath_env, cp, 0); } ! /* Call this when -classpath is seen on the command line. ! This overrides only the $CLASSPATH environment variable. ! */ void jcf_path_classpath_arg (path) const char *path; { ! free_entry (&classpath_user); ! add_path (&classpath_user, path, 0); } ! /* Call this when -bootclasspath is seen on the command line. ! */ void ! jcf_path_bootclasspath_arg (path) const char *path; { ! free_entry (&sys_dirs); ! add_path (&sys_dirs, path, 1); ! } ! ! /* Call this when -extdirs is seen on the command line. ! */ ! void ! jcf_path_extdirs_arg (cp) ! const char *cp; ! { ! const char *startp, *endp; ! ! free_entry (&extensions); ! ! if (cp) ! { ! char *buf = (char *) alloca (strlen (cp) + 3); ! startp = endp = cp; ! while (1) ! { ! if (! *endp || *endp == PATH_SEPARATOR) ! { ! if (endp == startp) ! return; ! ! strncpy (buf, startp, endp - startp); ! buf[endp - startp] = '\0'; ! ! { ! DIR *dirp = NULL; ! int dirname_length = strlen (buf); ! ! dirp = opendir (buf); ! if (dirp == NULL) ! return; ! ! for (;;) ! { ! struct dirent *direntp = readdir (dirp); ! ! if (!direntp) ! break; ! ! if (direntp->d_name[0] != '.') ! { ! char *name = ! (char *) alloca (dirname_length ! + strlen (direntp->d_name) + 2); ! strcpy (name, buf); ! if (name[dirname_length-1] != DIR_SEPARATOR) ! { ! name[dirname_length] = DIR_SEPARATOR; ! name[dirname_length+1] = 0; ! } ! strcat (name, direntp->d_name); ! add_entry (&extensions, name, 0); ! } ! } ! } ! ! if (! *endp) ! break; ! ++endp; ! startp = endp; ! } ! else ! ++endp; ! } ! } } /* Call this when -I is seen on the command line. */ *************** jcf_path_include_arg (path) *** 311,356 **** } /* We `seal' the path by linking everything into one big list. Then ! we provide a way to iterate through the sealed list. */ void ! jcf_path_seal () { - int do_system = 1; struct entry *secondary; sealed = include_dirs; include_dirs = NULL; ! if (classpath_l) ! { ! secondary = classpath_l; ! classpath_l = NULL; ! do_system = 0; ! } ! else if (classpath_u) { ! secondary = classpath_u; ! classpath_u = NULL; } else { secondary = classpath_env; classpath_env = NULL; } ! free_entry (&classpath_l); ! free_entry (&classpath_u); free_entry (&classpath_env); append_entry (&sealed, secondary); ! if (do_system) { ! append_entry (&sealed, sys_dirs); ! sys_dirs = NULL; } - else - free_entry (&sys_dirs); } void * --- 416,470 ---- } /* We `seal' the path by linking everything into one big list. Then ! we provide a way to iterate through the sealed list. If PRINT is ! true then we print the final class path to stderr. */ void ! jcf_path_seal (print) ! int print; { struct entry *secondary; sealed = include_dirs; include_dirs = NULL; ! if (classpath_user) { ! secondary = classpath_user; ! classpath_user = NULL; } else { + if (! classpath_env) + add_entry (&classpath_env, ".", 0); + secondary = classpath_env; classpath_env = NULL; } ! ! free_entry (&classpath_user); free_entry (&classpath_env); append_entry (&sealed, secondary); + append_entry (&sealed, sys_dirs); + append_entry (&sealed, extensions); + sys_dirs = NULL; + extensions = NULL; ! if (print) { ! struct entry *ent; ! fprintf (stderr, "Class path starts here:\n"); ! for (ent = sealed; ent; ent = ent->next) ! { ! fprintf (stderr, " %s", ent->name); ! if ((ent->flags & FLAG_SYSTEM)) ! fprintf (stderr, " (system)"); ! if ((ent->flags & FLAG_ZIP)) ! fprintf (stderr, " (zip)"); ! fprintf (stderr, "\n"); ! } } } void * diff -Nrc3pad gcc-3.0.4/gcc/java/jcf-write.c gcc-3.1/gcc/java/jcf-write.c *** gcc-3.0.4/gcc/java/jcf-write.c Tue Nov 20 04:40:04 2001 --- gcc-3.1/gcc/java/jcf-write.c Mon Apr 22 12:53:21 2002 *************** *** 1,5 **** /* Write out a Java(TM) class file. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,5 ---- /* Write out a Java(TM) class file. ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU CC. *************** The Free Software Foundation is independ *** 25,30 **** --- 25,31 ---- #include "system.h" #include "jcf.h" #include "tree.h" + #include "real.h" #include "java-tree.h" #include "obstack.h" #undef AND *************** char *jcf_write_base_directory = NULL; *** 57,63 **** /* Add a 1-byte instruction/operand I to bytecode.data, assuming space has already been RESERVE'd. */ ! #define OP1(I) (state->last_bc = *state->bytecode.ptr++ = (I), CHECK_OP(state)) /* Like OP1, but I is a 2-byte big endian integer. */ --- 58,64 ---- /* Add a 1-byte instruction/operand I to bytecode.data, assuming space has already been RESERVE'd. */ ! #define OP1(I) (*state->bytecode.ptr++ = (I), CHECK_OP(state)) /* Like OP1, but I is a 2-byte big endian integer. */ *************** struct chunk *** 105,118 **** to the beginning of the block. If (pc < 0), the jcf_block is not an actual block (i.e. it has no ! assocated code yet), but it is an undefined label. */ struct jcf_block { /* For blocks that that are defined, the next block (in pc order). For blocks that are not-yet-defined the end label of a LABELED_BLOCK_EXPR ! or a cleanup expression (from a WITH_CLEANUP_EXPR), this is the next (outer) such end label, in a stack headed by labeled_blocks in jcf_partial. */ struct jcf_block *next; --- 106,119 ---- to the beginning of the block. If (pc < 0), the jcf_block is not an actual block (i.e. it has no ! associated code yet), but it is an undefined label. */ struct jcf_block { /* For blocks that that are defined, the next block (in pc order). For blocks that are not-yet-defined the end label of a LABELED_BLOCK_EXPR ! or a cleanup expression (from a TRY_FINALLY_EXPR), this is the next (outer) such end label, in a stack headed by labeled_blocks in jcf_partial. */ struct jcf_block *next; *************** struct jcf_partial *** 275,282 **** /* Information about the current switch statement. */ struct jcf_switch_state *sw_state; - - enum java_opcode last_bc; /* The last emitted bytecode */ }; static void generate_bytecode_insns PARAMS ((tree, int, struct jcf_partial *)); --- 276,281 ---- *************** get_access_flags (decl) *** 687,692 **** --- 686,693 ---- if (ANONYMOUS_CLASS_P (TREE_TYPE (decl)) || LOCAL_CLASS_P (TREE_TYPE (decl))) flags |= ACC_PRIVATE; + if (CLASS_STRICTFP (decl)) + flags |= ACC_STRICT; } else abort (); *************** get_access_flags (decl) *** 701,706 **** --- 702,709 ---- flags |= ACC_SYNCHRONIZED; if (METHOD_ABSTRACT (decl)) flags |= ACC_ABSTRACT; + if (METHOD_STRICTFP (decl)) + flags |= ACC_STRICT; } if (isfield) { *************** push_long_const (lo, hi, state) *** 850,864 **** HOST_WIDE_INT lo, hi; struct jcf_partial *state; { ! if (hi == 0 && lo >= 0 && lo <= 1) { RESERVE(1); ! OP1(OPCODE_lconst_0 + lo); } ! else if ((hi == 0 && (jword)(lo & 0xFFFFFFFF) < 32768) ! || (hi == -1 && (lo & 0xFFFFFFFF) >= (jword)-32768)) { ! push_int_const (lo, state); RESERVE (1); OP1 (OPCODE_i2l); } --- 853,872 ---- HOST_WIDE_INT lo, hi; struct jcf_partial *state; { ! HOST_WIDE_INT highpart, dummy; ! jint lowpart = WORD_TO_INT (lo); ! ! rshift_double (lo, hi, 32, 64, &highpart, &dummy, 1); ! ! if (highpart == 0 && (lowpart == 0 || lowpart == 1)) { RESERVE(1); ! OP1(OPCODE_lconst_0 + lowpart); } ! else if ((highpart == 0 && lowpart > 0 && lowpart < 32768) ! || (highpart == -1 && lowpart < 0 && lowpart >= -32768)) { ! push_int_const (lowpart, state); RESERVE (1); OP1 (OPCODE_i2l); } *************** generate_bytecode_conditional (exp, true *** 1350,1356 **** abort (); } ! /* Call pending cleanups i.e. those for surrounding CLEANUP_POINT_EXPRs but only as far out as LIMIT (since we are about to jump to the emit label that is LIMIT). */ --- 1358,1364 ---- abort (); } ! /* Call pending cleanups i.e. those for surrounding TRY_FINALLY_EXPRs. but only as far out as LIMIT (since we are about to jump to the emit label that is LIMIT). */ *************** generate_bytecode_return (exp, state) *** 1406,1412 **** if (returns_void) { op = OPCODE_return; ! call_cleanups (NULL_PTR, state); } else { --- 1414,1420 ---- if (returns_void) { op = OPCODE_return; ! call_cleanups (NULL, state); } else { *************** generate_bytecode_return (exp, state) *** 1420,1426 **** localvar_alloc (state->return_value_decl, state); } emit_store (state->return_value_decl, state); ! call_cleanups (NULL_PTR, state); emit_load (state->return_value_decl, state); /* If we call localvar_free (state->return_value_decl, state), then we risk the save decl erroneously re-used in the --- 1428,1434 ---- localvar_alloc (state->return_value_decl, state); } emit_store (state->return_value_decl, state); ! call_cleanups (NULL, state); emit_load (state->return_value_decl, state); /* If we call localvar_free (state->return_value_decl, state), then we risk the save decl erroneously re-used in the *************** generate_bytecode_insns (exp, target, st *** 1442,1448 **** int target; struct jcf_partial *state; { ! tree type; enum java_opcode jopcode; int op; HOST_WIDE_INT value; --- 1450,1456 ---- int target; struct jcf_partial *state; { ! tree type, arg; enum java_opcode jopcode; int op; HOST_WIDE_INT value; *************** generate_bytecode_insns (exp, target, st *** 1483,1491 **** } } break; ! case COMPOUND_EXPR: generate_bytecode_insns (TREE_OPERAND (exp, 0), IGNORE_TARGET, state); ! generate_bytecode_insns (TREE_OPERAND (exp, 1), target, state); break; case EXPR_WITH_FILE_LOCATION: { --- 1491,1503 ---- } } break; ! case COMPOUND_EXPR: generate_bytecode_insns (TREE_OPERAND (exp, 0), IGNORE_TARGET, state); ! /* Normally the first operand to a COMPOUND_EXPR must complete ! normally. However, in the special case of a do-while ! statement this is not necessarily the case. */ ! if (CAN_COMPLETE_NORMALLY (TREE_OPERAND (exp, 0))) ! generate_bytecode_insns (TREE_OPERAND (exp, 1), target, state); break; case EXPR_WITH_FILE_LOCATION: { *************** generate_bytecode_insns (exp, target, st *** 1530,1536 **** { int prec = TYPE_PRECISION (type) >> 5; RESERVE(1); ! if (real_zerop (exp)) OP1 (prec == 1 ? OPCODE_fconst_0 : OPCODE_dconst_0); else if (real_onep (exp)) OP1 (prec == 1 ? OPCODE_fconst_1 : OPCODE_dconst_1); --- 1542,1548 ---- { int prec = TYPE_PRECISION (type) >> 5; RESERVE(1); ! if (real_zerop (exp) && ! REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (exp))) OP1 (prec == 1 ? OPCODE_fconst_0 : OPCODE_dconst_0); else if (real_onep (exp)) OP1 (prec == 1 ? OPCODE_fconst_1 : OPCODE_dconst_1); *************** generate_bytecode_insns (exp, target, st *** 1685,1692 **** 1. the switch_expression (the value used to select the correct case); 2. the switch_body; 3. the switch_instruction (the tableswitch/loopupswitch instruction.). ! After code generation, we will re-order then in the order 1, 3, 2. ! This is to avoid an extra GOTOs. */ struct jcf_switch_state sw_state; struct jcf_block *expression_last; /* Last block of the switch_expression. */ struct jcf_block *body_last; /* Last block of the switch_body. */ --- 1697,1704 ---- 1. the switch_expression (the value used to select the correct case); 2. the switch_body; 3. the switch_instruction (the tableswitch/loopupswitch instruction.). ! After code generation, we will re-order them in the order 1, 3, 2. ! This is to avoid any extra GOTOs. */ struct jcf_switch_state sw_state; struct jcf_block *expression_last; /* Last block of the switch_expression. */ struct jcf_block *body_last; /* Last block of the switch_body. */ *************** generate_bytecode_insns (exp, target, st *** 1701,1707 **** sw_state.default_label = NULL; generate_bytecode_insns (TREE_OPERAND (exp, 0), STACK_TARGET, state); expression_last = state->last_block; ! body_block = get_jcf_label_here (state); /* Force a new block here. */ generate_bytecode_insns (TREE_OPERAND (exp, 1), IGNORE_TARGET, state); body_last = state->last_block; --- 1713,1721 ---- sw_state.default_label = NULL; generate_bytecode_insns (TREE_OPERAND (exp, 0), STACK_TARGET, state); expression_last = state->last_block; ! /* Force a new block here. */ ! body_block = gen_jcf_label (state); ! define_jcf_label (body_block, state); generate_bytecode_insns (TREE_OPERAND (exp, 1), IGNORE_TARGET, state); body_last = state->last_block; *************** generate_bytecode_insns (exp, target, st *** 1720,1725 **** --- 1734,1740 ---- else { push_int_const (sw_state.cases->offset, state); + NOTE_PUSH (1); emit_if (sw_state.cases->label, OPCODE_if_icmpeq, OPCODE_if_icmpne, state); } *************** generate_bytecode_insns (exp, target, st *** 1756,1762 **** gap_start--; } relocs[gap_start++] = reloc; ! /* Note we don't check for duplicates. FIXME! */ } if (2 * sw_state.num_cases --- 1771,1778 ---- gap_start--; } relocs[gap_start++] = reloc; ! /* Note we don't check for duplicates. This is ! handled by the parser. */ } if (2 * sw_state.num_cases *************** generate_bytecode_insns (exp, target, st *** 1878,1884 **** { struct jcf_block *head_label = get_jcf_label_here (state); generate_bytecode_insns (body, IGNORE_TARGET, state); ! emit_goto (head_label, state); } } break; --- 1894,1901 ---- { struct jcf_block *head_label = get_jcf_label_here (state); generate_bytecode_insns (body, IGNORE_TARGET, state); ! if (CAN_COMPLETE_NORMALLY (body)) ! emit_goto (head_label, state); } } break; *************** generate_bytecode_insns (exp, target, st *** 1908,1913 **** --- 1925,1931 ---- case POSTINCREMENT_EXPR: value = 1; post_op = 1; goto increment; increment: + arg = TREE_OPERAND (exp, 1); exp = TREE_OPERAND (exp, 0); type = TREE_TYPE (exp); size = TYPE_IS_WIDE (type) ? 2 : 1; *************** generate_bytecode_insns (exp, target, st *** 1960,1971 **** /* Stack, if ARRAY_REF: ..., [result, ] array, index, oldvalue. */ /* Stack, if COMPONENT_REF: ..., [result, ] objectref, oldvalue. */ /* Stack, otherwise: ..., [result, ] oldvalue. */ ! if (size == 1) ! push_int_const (value, state); ! else ! push_long_const (value, (HOST_WIDE_INT)(value >= 0 ? 0 : -1), state); ! NOTE_PUSH (size); ! emit_binop (OPCODE_iadd + adjust_typed_op (type, 3), type, state); if (target != IGNORE_TARGET && ! post_op) emit_dup (size, offset, state); /* Stack, if ARRAY_REF: ..., [result, ] array, index, newvalue. */ --- 1978,1987 ---- /* Stack, if ARRAY_REF: ..., [result, ] array, index, oldvalue. */ /* Stack, if COMPONENT_REF: ..., [result, ] objectref, oldvalue. */ /* Stack, otherwise: ..., [result, ] oldvalue. */ ! generate_bytecode_insns (arg, STACK_TARGET, state); ! emit_binop ((value >= 0 ? OPCODE_iadd : OPCODE_isub) ! + adjust_typed_op (type, 3), ! type, state); if (target != IGNORE_TARGET && ! post_op) emit_dup (size, offset, state); /* Stack, if ARRAY_REF: ..., [result, ] array, index, newvalue. */ *************** generate_bytecode_insns (exp, target, st *** 2033,2038 **** --- 2049,2109 ---- } else offset = 0; + + /* If the rhs is a binary expression and the left operand is + `==' to the lhs then we have an OP= expression. In this + case we must do some special processing. */ + if (TREE_CODE_CLASS (TREE_CODE (rhs)) == '2' + && lhs == TREE_OPERAND (rhs, 0)) + { + if (TREE_CODE (lhs) == COMPONENT_REF) + { + tree field = TREE_OPERAND (lhs, 1); + if (! FIELD_STATIC (field)) + { + /* Duplicate the object reference so we can get + the field. */ + emit_dup (TYPE_IS_WIDE (field) ? 2 : 1, 0, state); + NOTE_POP (1); + } + field_op (field, (FIELD_STATIC (field) + ? OPCODE_getstatic + : OPCODE_getfield), + state); + + NOTE_PUSH (TYPE_IS_WIDE (TREE_TYPE (field)) ? 2 : 1); + } + else if (TREE_CODE (lhs) == VAR_DECL + || TREE_CODE (lhs) == PARM_DECL) + { + if (FIELD_STATIC (lhs)) + { + field_op (lhs, OPCODE_getstatic, state); + NOTE_PUSH (TYPE_IS_WIDE (TREE_TYPE (lhs)) ? 2 : 1); + } + else + emit_load (lhs, state); + } + else if (TREE_CODE (lhs) == ARRAY_REF) + { + /* Duplicate the array and index, which are on the + stack, so that we can load the old value. */ + emit_dup (2, 0, state); + NOTE_POP (2); + jopcode = OPCODE_iaload + adjust_typed_op (TREE_TYPE (lhs), 7); + RESERVE (1); + OP1 (jopcode); + NOTE_PUSH (TYPE_IS_WIDE (TREE_TYPE (lhs)) ? 2 : 1); + } + else + abort (); + + /* This function correctly handles the case where the LHS + of a binary expression is NULL_TREE. */ + rhs = build (TREE_CODE (rhs), TREE_TYPE (rhs), + NULL_TREE, TREE_OPERAND (rhs, 1)); + } + generate_bytecode_insns (rhs, STACK_TARGET, state); if (target != IGNORE_TARGET) emit_dup (TYPE_IS_WIDE (type) ? 2 : 1 , offset, state); *************** generate_bytecode_insns (exp, target, st *** 2111,2117 **** } else { ! generate_bytecode_insns (arg0, target, state); if (jopcode >= OPCODE_lshl && jopcode <= OPCODE_lushr) arg1 = convert (int_type_node, arg1); generate_bytecode_insns (arg1, target, state); --- 2182,2192 ---- } else { ! /* ARG0 will be NULL_TREE if we're handling an `OP=' ! expression. In this case the stack already holds the ! LHS. See the MODIFY_EXPR case. */ ! if (arg0 != NULL_TREE) ! generate_bytecode_insns (arg0, target, state); if (jopcode >= OPCODE_lshl && jopcode <= OPCODE_lushr) arg1 = convert (int_type_node, arg1); generate_bytecode_insns (arg1, target, state); *************** generate_bytecode_insns (exp, target, st *** 2165,2180 **** tree src = TREE_OPERAND (exp, 0); tree src_type = TREE_TYPE (src); tree dst_type = TREE_TYPE (exp); ! /* Detect the situation of compiling an empty synchronized ! block. A nop should be emitted in order to produce ! verifiable bytecode. */ ! if (exp == empty_stmt_node ! && state->last_bc == OPCODE_monitorenter ! && state->labeled_blocks ! && state->labeled_blocks->pc == PENDING_CLEANUP_PC) ! OP1 (OPCODE_nop); ! else ! generate_bytecode_insns (TREE_OPERAND (exp, 0), target, state); if (target == IGNORE_TARGET || src_type == dst_type) break; if (TREE_CODE (dst_type) == POINTER_TYPE) --- 2240,2246 ---- tree src = TREE_OPERAND (exp, 0); tree src_type = TREE_TYPE (src); tree dst_type = TREE_TYPE (exp); ! generate_bytecode_insns (TREE_OPERAND (exp, 0), target, state); if (target == IGNORE_TARGET || src_type == dst_type) break; if (TREE_CODE (dst_type) == POINTER_TYPE) *************** generate_bytecode_insns (exp, target, st *** 2228,2305 **** } break; - case CLEANUP_POINT_EXPR: - { - struct jcf_block *save_labeled_blocks = state->labeled_blocks; - int can_complete = CAN_COMPLETE_NORMALLY (TREE_OPERAND (exp, 0)); - generate_bytecode_insns (TREE_OPERAND (exp, 0), IGNORE_TARGET, state); - if (target != IGNORE_TARGET) - abort (); - while (state->labeled_blocks != save_labeled_blocks) - { - struct jcf_block *finished_label = NULL; - tree return_link; - tree exception_type = build_pointer_type (throwable_type_node); - tree exception_decl = build_decl (VAR_DECL, NULL_TREE, - exception_type); - struct jcf_block *end_label = get_jcf_label_here (state); - struct jcf_block *label = state->labeled_blocks; - struct jcf_handler *handler; - tree cleanup = label->u.labeled_block; - state->labeled_blocks = label->next; - state->num_finalizers--; - if (can_complete) - { - finished_label = gen_jcf_label (state); - emit_jsr (label, state); - emit_goto (finished_label, state); - if (! CAN_COMPLETE_NORMALLY (cleanup)) - can_complete = 0; - } - handler = alloc_handler (label->v.start_label, end_label, state); - handler->type = NULL_TREE; - localvar_alloc (exception_decl, state); - NOTE_PUSH (1); - emit_store (exception_decl, state); - emit_jsr (label, state); - emit_load (exception_decl, state); - RESERVE (1); - OP1 (OPCODE_athrow); - NOTE_POP (1); - - /* The finally block. */ - return_link = build_decl (VAR_DECL, NULL_TREE, - return_address_type_node); - define_jcf_label (label, state); - NOTE_PUSH (1); - localvar_alloc (return_link, state); - emit_store (return_link, state); - generate_bytecode_insns (cleanup, IGNORE_TARGET, state); - maybe_wide (OPCODE_ret, DECL_LOCAL_INDEX (return_link), state); - localvar_free (return_link, state); - localvar_free (exception_decl, state); - if (finished_label != NULL) - define_jcf_label (finished_label, state); - } - } - break; - - case WITH_CLEANUP_EXPR: - { - struct jcf_block *label; - generate_bytecode_insns (TREE_OPERAND (exp, 0), IGNORE_TARGET, state); - label = gen_jcf_label (state); - label->pc = PENDING_CLEANUP_PC; - label->next = state->labeled_blocks; - state->labeled_blocks = label; - state->num_finalizers++; - label->u.labeled_block = TREE_OPERAND (exp, 2); - label->v.start_label = get_jcf_label_here (state); - if (target != IGNORE_TARGET) - abort (); - } - break; - case TRY_EXPR: { tree try_clause = TREE_OPERAND (exp, 0); --- 2294,2299 ---- *************** generate_bytecode_insns (exp, target, st *** 2319,2325 **** { tree catch_clause = TREE_OPERAND (clause, 0); tree exception_decl = BLOCK_EXPR_DECLS (catch_clause); ! struct jcf_handler *handler = alloc_handler (start_label, end_label, state); if (exception_decl == NULL_TREE) handler->type = NULL_TREE; else --- 2313,2320 ---- { tree catch_clause = TREE_OPERAND (clause, 0); tree exception_decl = BLOCK_EXPR_DECLS (catch_clause); ! struct jcf_handler *handler = alloc_handler (start_label, ! end_label, state); if (exception_decl == NULL_TREE) handler->type = NULL_TREE; else *************** generate_bytecode_insns (exp, target, st *** 2332,2341 **** define_jcf_label (finished_label, state); } break; case TRY_FINALLY_EXPR: { ! struct jcf_block *finished_label, ! *finally_label, *start_label, *end_label; struct jcf_handler *handler; tree try_block = TREE_OPERAND (exp, 0); tree finally = TREE_OPERAND (exp, 1); --- 2327,2337 ---- define_jcf_label (finished_label, state); } break; + case TRY_FINALLY_EXPR: { ! struct jcf_block *finished_label = NULL; ! struct jcf_block *finally_label, *start_label, *end_label; struct jcf_handler *handler; tree try_block = TREE_OPERAND (exp, 0); tree finally = TREE_OPERAND (exp, 1); *************** generate_bytecode_insns (exp, target, st *** 2345,2359 **** finally_label = gen_jcf_label (state); start_label = get_jcf_label_here (state); ! finally_label->pc = PENDING_CLEANUP_PC; ! finally_label->next = state->labeled_blocks; ! state->labeled_blocks = finally_label; ! state->num_finalizers++; generate_bytecode_insns (try_block, target, state); ! if (state->labeled_blocks != finally_label) ! abort(); ! state->labeled_blocks = finally_label->next; end_label = get_jcf_label_here (state); if (end_label == start_label) --- 2341,2366 ---- finally_label = gen_jcf_label (state); start_label = get_jcf_label_here (state); ! /* If the `finally' clause can complete normally, we emit it ! as a subroutine and let the other clauses call it via ! `jsr'. If it can't complete normally, then we simply emit ! `goto's directly to it. */ ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! finally_label->pc = PENDING_CLEANUP_PC; ! finally_label->next = state->labeled_blocks; ! state->labeled_blocks = finally_label; ! state->num_finalizers++; ! } generate_bytecode_insns (try_block, target, state); ! ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! if (state->labeled_blocks != finally_label) ! abort(); ! state->labeled_blocks = finally_label->next; ! } end_label = get_jcf_label_here (state); if (end_label == start_label) *************** generate_bytecode_insns (exp, target, st *** 2364,2406 **** break; } ! return_link = build_decl (VAR_DECL, NULL_TREE, ! return_address_type_node); ! finished_label = gen_jcf_label (state); ! if (CAN_COMPLETE_NORMALLY (try_block)) { ! emit_jsr (finally_label, state); ! emit_goto (finished_label, state); } ! /* Handle exceptions. */ exception_type = build_pointer_type (throwable_type_node); ! exception_decl = build_decl (VAR_DECL, NULL_TREE, exception_type); ! localvar_alloc (return_link, state); handler = alloc_handler (start_label, end_label, state); handler->type = NULL_TREE; ! localvar_alloc (exception_decl, state); ! NOTE_PUSH (1); ! emit_store (exception_decl, state); ! emit_jsr (finally_label, state); ! emit_load (exception_decl, state); ! RESERVE (1); ! OP1 (OPCODE_athrow); ! NOTE_POP (1); ! /* The finally block. First save return PC into return_link. */ define_jcf_label (finally_label, state); ! NOTE_PUSH (1); ! emit_store (return_link, state); generate_bytecode_insns (finally, IGNORE_TARGET, state); ! maybe_wide (OPCODE_ret, DECL_LOCAL_INDEX (return_link), state); ! localvar_free (exception_decl, state); ! localvar_free (return_link, state); ! define_jcf_label (finished_label, state); } break; case THROW_EXPR: --- 2371,2445 ---- break; } ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! return_link = build_decl (VAR_DECL, NULL_TREE, ! return_address_type_node); ! finished_label = gen_jcf_label (state); ! } if (CAN_COMPLETE_NORMALLY (try_block)) { ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! emit_jsr (finally_label, state); ! emit_goto (finished_label, state); ! } ! else ! emit_goto (finally_label, state); } ! /* Handle exceptions. */ exception_type = build_pointer_type (throwable_type_node); ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! /* We're going to generate a subroutine, so we'll need to ! save and restore the exception around the `jsr'. */ ! exception_decl = build_decl (VAR_DECL, NULL_TREE, exception_type); ! localvar_alloc (return_link, state); ! } handler = alloc_handler (start_label, end_label, state); handler->type = NULL_TREE; ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! localvar_alloc (exception_decl, state); ! NOTE_PUSH (1); ! emit_store (exception_decl, state); ! emit_jsr (finally_label, state); ! emit_load (exception_decl, state); ! RESERVE (1); ! OP1 (OPCODE_athrow); ! NOTE_POP (1); ! } ! else ! { ! /* We're not generating a subroutine. In this case we can ! simply have the exception handler pop the exception and ! then fall through to the `finally' block. */ ! NOTE_PUSH (1); ! emit_pop (1, state); ! NOTE_POP (1); ! } ! /* The finally block. If we're generating a subroutine, first ! save return PC into return_link. Otherwise, just generate ! the code for the `finally' block. */ define_jcf_label (finally_label, state); ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! NOTE_PUSH (1); ! emit_store (return_link, state); ! } generate_bytecode_insns (finally, IGNORE_TARGET, state); ! if (CAN_COMPLETE_NORMALLY (finally)) ! { ! maybe_wide (OPCODE_ret, DECL_LOCAL_INDEX (return_link), state); ! localvar_free (exception_decl, state); ! localvar_free (return_link, state); ! define_jcf_label (finished_label, state); ! } } break; case THROW_EXPR: *************** perform_relocations (state) *** 2691,2697 **** /* new_ptr and old_ptr point into the old and new buffers, respectively. (If no relocations cause the buffer to grow, the buffer will be the same buffer, and new_ptr==old_ptr.) ! The bytes at higher adress have been copied and relocations handled; those at lower addresses remain to process. */ /* Lower old index of piece to be copied with no relocation. --- 2730,2736 ---- /* new_ptr and old_ptr point into the old and new buffers, respectively. (If no relocations cause the buffer to grow, the buffer will be the same buffer, and new_ptr==old_ptr.) ! The bytes at higher address have been copied and relocations handled; those at lower addresses remain to process. */ /* Lower old index of piece to be copied with no relocation. *************** generate_classfile (clas, state) *** 2885,2891 **** build_java_signature (TREE_TYPE (part))); PUT2(i); have_value = DECL_INITIAL (part) != NULL_TREE ! && FIELD_STATIC (part) && CONSTANT_VALUE_P (DECL_INITIAL (part)); if (have_value) attr_count++; --- 2924,2933 ---- build_java_signature (TREE_TYPE (part))); PUT2(i); have_value = DECL_INITIAL (part) != NULL_TREE ! && FIELD_STATIC (part) && CONSTANT_VALUE_P (DECL_INITIAL (part)) ! && FIELD_FINAL (part) ! && (JPRIMITIVE_TYPE_P (TREE_TYPE (part)) ! || TREE_TYPE (part) == string_ptr_type_node); if (have_value) attr_count++; *************** generate_classfile (clas, state) *** 2897,2902 **** --- 2939,2946 ---- { tree init = DECL_INITIAL (part); static tree ConstantValue_node = NULL_TREE; + if (TREE_TYPE (part) != TREE_TYPE (init)) + fatal_error ("field initializer type mismatch"); ptr = append_chunk (NULL, 8, state); if (ConstantValue_node == NULL_TREE) ConstantValue_node = get_identifier ("ConstantValue"); *************** generate_classfile (clas, state) *** 2935,2941 **** i = (body != NULL_TREE) + (DECL_FUNCTION_THROWS (part) != NULL_TREE); /* Make room for the Synthetic attribute (of zero length.) */ ! if (DECL_FINIT_P (part) || OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (part)) || TYPE_DOT_CLASS (clas) == part) { --- 2979,2986 ---- i = (body != NULL_TREE) + (DECL_FUNCTION_THROWS (part) != NULL_TREE); /* Make room for the Synthetic attribute (of zero length.) */ ! if (DECL_FINIT_P (part) ! || DECL_INSTINIT_P (part) || OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (part)) || TYPE_DOT_CLASS (clas) == part) { *************** write_classfile (clas) *** 3331,3344 **** { FILE *stream = fopen (class_file_name, "wb"); if (stream == NULL) ! fatal_io_error ("can't to open %s", class_file_name); jcf_dependency_add_target (class_file_name); init_jcf_state (state, work); chunks = generate_classfile (clas, state); write_chunks (stream, chunks); if (fclose (stream)) ! fatal_io_error ("can't close %s", class_file_name); free (class_file_name); } release_jcf_state (state); --- 3376,3389 ---- { FILE *stream = fopen (class_file_name, "wb"); if (stream == NULL) ! fatal_io_error ("can't open %s for writing", class_file_name); jcf_dependency_add_target (class_file_name); init_jcf_state (state, work); chunks = generate_classfile (clas, state); write_chunks (stream, chunks); if (fclose (stream)) ! fatal_io_error ("error closing %s", class_file_name); free (class_file_name); } release_jcf_state (state); diff -Nrc3pad gcc-3.0.4/gcc/java/jcf.h gcc-3.1/gcc/java/jcf.h *** gcc-3.0.4/gcc/java/jcf.h Fri Mar 23 19:43:45 2001 --- gcc-3.1/gcc/java/jcf.h Wed Apr 10 13:09:01 2002 *************** *** 1,6 **** /* Utility macros to read Java(TM) .class files and byte codes. ! Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by --- 1,6 ---- /* Utility macros to read Java(TM) .class files and byte codes. ! Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by *************** The Free Software Foundation is independ *** 23,30 **** /* Written by Per Bothner , February 1996. */ ! #ifndef JCF_H ! #define JCF_H #include "javaop.h" #ifndef DEFUN #if defined (__STDC__) --- 23,30 ---- /* Written by Per Bothner , February 1996. */ ! #ifndef GCC_JCF_H ! #define GCC_JCF_H #include "javaop.h" #ifndef DEFUN #if defined (__STDC__) *************** typedef struct JCF { *** 90,95 **** --- 90,96 ---- unsigned char *read_end; int java_source : 1; int right_zip : 1; + int finished : 1; jcf_filbuf_t filbuf; void *read_state; const char *filename; *************** typedef struct JCF { *** 144,150 **** CPOOL_FINISH(&(JCF)->cpool); \ if ((JCF)->buffer) FREE ((JCF)->buffer); \ if ((JCF)->filename) FREE ((char *) (JCF)->filename); \ ! if ((JCF)->classname) FREE ((char *) (JCF)->classname); } #define CPOOL_INIT(CPOOL) \ ((CPOOL)->capacity = 0, (CPOOL)->count = 0, (CPOOL)->tags = 0, (CPOOL)->data = 0) --- 145,152 ---- CPOOL_FINISH(&(JCF)->cpool); \ if ((JCF)->buffer) FREE ((JCF)->buffer); \ if ((JCF)->filename) FREE ((char *) (JCF)->filename); \ ! if ((JCF)->classname) FREE ((char *) (JCF)->classname); \ ! (JCF)->finished = 1; } #define CPOOL_INIT(CPOOL) \ ((CPOOL)->capacity = 0, (CPOOL)->count = 0, (CPOOL)->tags = 0, (CPOOL)->data = 0) *************** typedef struct JCF { *** 154,160 **** #define JCF_ZERO(JCF) \ ((JCF)->buffer = (JCF)->buffer_end = (JCF)->read_ptr = (JCF)->read_end = 0,\ (JCF)->read_state = 0, (JCF)->filename = (JCF)->classname = 0, \ ! CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0, (JCF)->zipd = 0) /* Given that PTR points to a 2-byte unsigned integer in network (big-endian) byte-order, return that integer. */ --- 156,163 ---- #define JCF_ZERO(JCF) \ ((JCF)->buffer = (JCF)->buffer_end = (JCF)->read_ptr = (JCF)->read_end = 0,\ (JCF)->read_state = 0, (JCF)->filename = (JCF)->classname = 0, \ ! CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0, (JCF)->zipd = 0, \ ! (JCF)->finished = 0) /* Given that PTR points to a 2-byte unsigned integer in network (big-endian) byte-order, return that integer. */ *************** typedef struct JCF { *** 204,209 **** --- 207,213 ---- #define ACC_NATIVE 0x0100 #define ACC_INTERFACE 0x0200 #define ACC_ABSTRACT 0x0400 + #define ACC_STRICT 0x0800 #define ACC_VISIBILITY (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED) *************** extern int jcf_unexpected_eof PARAMS ((J *** 230,236 **** /* Extract a character from a Java-style Utf8 string. * PTR points to the current character. * LIMIT points to the end of the Utf8 string. ! * PTR is incremented to point after the character thta gets returns. * On an error, -1 is returned. */ #define UTF8_GET(PTR, LIMIT) \ ((PTR) >= (LIMIT) ? -1 \ --- 234,240 ---- /* Extract a character from a Java-style Utf8 string. * PTR points to the current character. * LIMIT points to the end of the Utf8 string. ! * PTR is incremented to point after the character that gets returned. * On an error, -1 is returned. */ #define UTF8_GET(PTR, LIMIT) \ ((PTR) >= (LIMIT) ? -1 \ *************** extern void jcf_dependency_print_dummies *** 268,276 **** /* Declarations for path handling code. */ extern void jcf_path_init PARAMS ((void)); extern void jcf_path_classpath_arg PARAMS ((const char *)); ! extern void jcf_path_CLASSPATH_arg PARAMS ((const char *)); extern void jcf_path_include_arg PARAMS ((const char *)); ! extern void jcf_path_seal PARAMS ((void)); extern void *jcf_path_start PARAMS ((void)); extern void *jcf_path_next PARAMS ((void *)); extern char *jcf_path_name PARAMS ((void *)); --- 272,281 ---- /* Declarations for path handling code. */ extern void jcf_path_init PARAMS ((void)); extern void jcf_path_classpath_arg PARAMS ((const char *)); ! extern void jcf_path_bootclasspath_arg PARAMS ((const char *)); ! extern void jcf_path_extdirs_arg PARAMS ((const char *)); extern void jcf_path_include_arg PARAMS ((const char *)); ! extern void jcf_path_seal PARAMS ((int)); extern void *jcf_path_start PARAMS ((void)); extern void *jcf_path_next PARAMS ((void *)); extern char *jcf_path_name PARAMS ((void *)); *************** extern int jcf_path_is_zipfile PARAMS (( *** 278,281 **** extern int jcf_path_is_system PARAMS ((void *)); extern int jcf_path_max_len PARAMS ((void)); ! #endif --- 283,286 ---- extern int jcf_path_is_system PARAMS ((void *)); extern int jcf_path_max_len PARAMS ((void)); ! #endif /* ! GCC_JCF_H */ diff -Nrc3pad gcc-3.0.4/gcc/java/jv-convert.1 gcc-3.1/gcc/java/jv-convert.1 *** gcc-3.0.4/gcc/java/jv-convert.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/jv-convert.1 Wed May 15 02:46:02 2002 *************** *** 0 **** --- 1,198 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:02 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "JV-CONVERT 1" + .TH JV-CONVERT 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + jv-convert \- Convert file from one encoding to another + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + \&\fBjv-convert\fR [\fB\s-1OPTION\s0\fR] ... [\fI\s-1INPUTFILE\s0\fR [\fI\s-1OUTPUTFILE\s0\fR]] + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + \&\fBjv-convert\fR is a utility included with \f(CW\*(C`libgcj\*(C'\fR which + converts a file from one encoding to another. It is similar to the Unix + \&\fBiconv\fR utility. + .PP + The encodings supported by \fBjv-convert\fR are platform-dependent. + Currently there is no way to get a list of all supported encodings. + .SH "OPTIONS" + .IX Header "OPTIONS" + .Ip "\fB\*(--encoding\fR \fIname\fR" 4 + .IX Item "encoding name" + .PD 0 + .Ip "\fB\*(--from\fR \fIname\fR" 4 + .IX Item "from name" + .PD + Use \fIname\fR as the input encoding. The default is the current + locale's encoding. + .Ip "\fB\*(--to\fR \fIname\fR" 4 + .IX Item "to name" + Use \fIname\fR as the output encoding. The default is the + \&\f(CW\*(C`JavaSrc\*(C'\fR encoding; this is \s-1ASCII\s0 with \fB\eu\fR escapes for + non-ASCII characters. + .Ip "\fB\-i\fR \fIfile\fR" 4 + .IX Item "-i file" + Read from \fIfile\fR. The default is to read from standard input. + .Ip "\fB\-o\fR \fIfile\fR" 4 + .IX Item "-o file" + Write to \fIfile\fR. The default is to write to standard output. + .Ip "\fB\*(--reverse\fR" 4 + .IX Item "reverse" + Swap the input and output encodings. + .Ip "\fB\*(--help\fR" 4 + .IX Item "help" + Print a help message, then exit. + .Ip "\fB\*(--version\fR" 4 + .IX Item "version" + Print version information, then exit. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/jv-scan.1 gcc-3.1/gcc/java/jv-scan.1 *** gcc-3.0.4/gcc/java/jv-scan.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/jv-scan.1 Wed May 15 02:46:02 2002 *************** *** 0 **** --- 1,198 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:02 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "JV-SCAN 1" + .TH JV-SCAN 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + jv-scan \- print information about Java source file + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + jv-scan [\fB\*(--complexity\fR] [\fB\*(--encoding\fR=\fIname\fR] + [\fB\*(--print-main\fR] [\fB\*(--list-class\fR] [\fB\*(--list-filename\fR] + [\fB\*(--version\fR] [\fB\*(--help\fR] + [\fB\-o\fR \fIfile\fR] \fIinputfile\fR... + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + The \f(CW\*(C`jv\-scan\*(C'\fR program can be used to print information about a Java + source file (\fI.java\fR file). + .SH "OPTIONS" + .IX Header "OPTIONS" + .Ip "\fB\*(--complexity\fR" 4 + .IX Item "complexity" + This prints a complexity measure, related to cyclomatic complexity, for + each input file. + .Ip "\fB\*(--encoding=\fR\fIname\fR" 4 + .IX Item "encoding=name" + This works like the corresponding \fBgcj\fR option. + .Ip "\fB\*(--print-main\fR" 4 + .IX Item "print-main" + This prints the name of the class in this file containing a \f(CW\*(C`main\*(C'\fR + method. + .Ip "\fB\*(--list-class\fR" 4 + .IX Item "list-class" + This lists the names of all classes defined in the input files. + .Ip "\fB\*(--list-filename\fR" 4 + .IX Item "list-filename" + If \f(CW\*(C`\-\-list\-class\*(C'\fR is given, this option causes \f(CW\*(C`jv\-scan\*(C'\fR to + also print the name of the file in which each class was found. + .Ip "\fB\-o\fR \fIfile\fR" 4 + .IX Item "-o file" + Print output to the named file. + .Ip "\fB\*(--help\fR" 4 + .IX Item "help" + Print help, then exit. + .Ip "\fB\*(--version\fR" 4 + .IX Item "version" + Print version number, then exit. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + \&\fIgcc\fR\|(1), \fIgcj\fR\|(1), \fIgcjh\fR\|(1), \fIgij\fR\|(1), \fIjcf-dump\fR\|(1), \fIgfdl\fR\|(7), + and the Info entries for \fIgcj\fR and \fIgcc\fR. + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/jv-scan.c gcc-3.1/gcc/java/jv-scan.c *** gcc-3.0.4/gcc/java/jv-scan.c Wed May 23 18:12:39 2001 --- gcc-3.1/gcc/java/jv-scan.c Fri Feb 1 21:07:31 2002 *************** *** 1,5 **** /* Main for jv-scan ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. --- 1,5 ---- /* Main for jv-scan ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. *************** int pedantic = 0; *** 76,82 **** #define OPT_VERSION LONG_OPT (1) #define OPT_ENCODING LONG_OPT (2) ! static struct option options[] = { { "help", no_argument, NULL, OPT_HELP }, { "version", no_argument, NULL, OPT_VERSION }, --- 76,82 ---- #define OPT_VERSION LONG_OPT (1) #define OPT_ENCODING LONG_OPT (2) ! static const struct option options[] = { { "help", no_argument, NULL, OPT_HELP }, { "version", no_argument, NULL, OPT_VERSION }, *************** help () *** 118,125 **** static void version () { ! printf ("jv-scan (%s)\n\n", version_string); ! printf ("Copyright (C) 2001 Free Software Foundation, Inc.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"); exit (0); --- 118,125 ---- static void version () { ! printf ("jv-scan (GCC) %s\n\n", version_string); ! printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"); exit (0); *************** DEFUN (main, (argc, argv), *** 180,189 **** /* Check on bad usage */ if (flag_find_main + flag_dump_class + flag_complexity > 1) fatal_error ! ("Only one of `--print-main', `--list-class', and `--complexity' allowed"); if (output_file && !(out = fopen (output_file, "w"))) ! fatal_error ("Can't open output file `%s'", output_file); ft = ftell (out); --- 180,189 ---- /* Check on bad usage */ if (flag_find_main + flag_dump_class + flag_complexity > 1) fatal_error ! ("only one of `--print-main', `--list-class', and `--complexity' allowed"); if (output_file && !(out = fopen (output_file, "w"))) ! fatal_error ("can't open output file `%s'", output_file); ft = ftell (out); *************** DEFUN (main, (argc, argv), *** 199,211 **** /* There's no point in trying to find the current encoding unless we are going to do something intelligent with it -- hence the test for iconv. */ ! #ifdef HAVE_ICONV ! #ifdef HAVE_NL_LANGINFO setlocale (LC_CTYPE, ""); if (encoding == NULL) encoding = nl_langinfo (CODESET); ! #endif /* HAVE_NL_LANGINFO */ ! #endif /* HAVE_ICONV */ if (encoding == NULL || *encoding == '\0') encoding = DEFAULT_ENCODING; --- 199,209 ---- /* There's no point in trying to find the current encoding unless we are going to do something intelligent with it -- hence the test for iconv. */ ! #if defined (HAVE_LOCALE_H) && defined (HAVE_ICONV) && defined (HAVE_NL_LANGINFO) setlocale (LC_CTYPE, ""); if (encoding == NULL) encoding = nl_langinfo (CODESET); ! #endif if (encoding == NULL || *encoding == '\0') encoding = DEFAULT_ENCODING; *************** DEFUN (main, (argc, argv), *** 219,225 **** reset_report (); } else ! fatal_error ("File not found `%s'", argv [i]); } /* Flush and close */ --- 217,223 ---- reset_report (); } else ! fatal_error ("file not found `%s'", argv [i]); } /* Flush and close */ *************** DEFUN (main, (argc, argv), *** 239,280 **** void fatal_error VPARAMS ((const char *s, ...)) { ! #ifndef ANSI_PROTOTYPES ! const char *s; ! #endif ! va_list ap; ! ! VA_START (ap, s); ! ! #ifndef ANSI_PROTOTYPES ! s = va_arg (ap, const char *); ! #endif fprintf (stderr, "%s: error: ", exec_name); vfprintf (stderr, s, ap); fputc ('\n', stderr); ! va_end (ap); exit (1); } void warning VPARAMS ((const char *s, ...)) { ! #ifndef ANSI_PROTOTYPES ! const char *s; ! #endif ! va_list ap; ! ! VA_START (ap, s); ! ! #ifndef ANSI_PROTOTYPES ! s = va_arg (ap, const char *); ! #endif fprintf (stderr, "%s: warning: ", exec_name); vfprintf (stderr, s, ap); fputc ('\n', stderr); ! va_end (ap); } void --- 237,262 ---- void fatal_error VPARAMS ((const char *s, ...)) { ! VA_OPEN (ap, s); ! VA_FIXEDARG (ap, const char *, s); fprintf (stderr, "%s: error: ", exec_name); vfprintf (stderr, s, ap); fputc ('\n', stderr); ! VA_CLOSE (ap); exit (1); } void warning VPARAMS ((const char *s, ...)) { ! VA_OPEN (ap, s); ! VA_FIXEDARG (ap, const char *, s); fprintf (stderr, "%s: warning: ", exec_name); vfprintf (stderr, s, ap); fputc ('\n', stderr); ! VA_CLOSE (ap); } void diff -Nrc3pad gcc-3.0.4/gcc/java/jvgenmain.c gcc-3.1/gcc/java/jvgenmain.c *** gcc-3.0.4/gcc/java/jvgenmain.c Tue Nov 27 16:24:58 2001 --- gcc-3.1/gcc/java/jvgenmain.c Tue Nov 27 17:31:38 2001 *************** The Free Software Foundation is independ *** 27,33 **** #include "config.h" #include "system.h" #include "obstack.h" - #include "gansidecl.h" #include "jcf.h" #include "tree.h" #include "java-tree.h" --- 27,32 ---- diff -Nrc3pad gcc-3.0.4/gcc/java/jvspec.c gcc-3.1/gcc/java/jvspec.c *** gcc-3.0.4/gcc/java/jvspec.c Tue Nov 27 16:24:57 2001 --- gcc-3.1/gcc/java/jvspec.c Tue Apr 23 22:55:00 2002 *************** *** 1,6 **** ! /* Specific flags and argument handling of the front-end of the GNU compiler for the Java(TM) language. ! Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,6 ---- ! /* Specific flags and argument handling of the front-end of the GNU compiler for the Java(TM) language. ! Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU CC. *************** The Free Software Foundation is independ *** 42,49 **** --- 42,52 ---- #define ZIP_FILE_ARG (1<<5) /* True if this arg is @FILE - where FILE contains a list of filenames. */ #define INDIRECT_FILE_ARG (1<<6) + /* True if this arg is a resource file. */ + #define RESOURCE_FILE_ARG (1<<7) static char *find_spec_file PARAMS ((const char *)); + static int verify_class_name PARAMS ((const char *)); static const char *main_class_name = NULL; int lang_specific_extra_outfiles = 0; *************** int lang_specific_extra_outfiles = 0; *** 51,57 **** /* True if we should add -shared-libgcc to the command-line. */ int shared_libgcc = 1; ! const char jvgenmain_spec[] = "jvgenmain %{D*} %b %{!pipe:%u.i} |\n\ cc1 %{!pipe:%U.i} %1 \ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\ --- 54,60 ---- /* True if we should add -shared-libgcc to the command-line. */ int shared_libgcc = 1; ! static const char jvgenmain_spec[] = "jvgenmain %{D*} %b %{!pipe:%u.i} |\n\ cc1 %{!pipe:%U.i} %1 \ %{!Q:-quiet} -dumpbase %b.c %{d*} %{m*} %{a*}\ *************** const char jvgenmain_spec[] = *** 59,68 **** %{v:-version} %{pg:-p} %{p}\ %{= 0x00 && c <= 0x08) \ + || (c >= 0x0e && c <= 0x1b) \ + || c == 0x7f)) + + /* Verify that NAME is a valid Java class name that might contain + `main'. Return 0 on failure. */ + static int + verify_class_name (name) + const char *name; + { + /* FIXME: what encoding do we use for command-line arguments? For + now we assume plain ASCII, which of course is wrong. */ + while (*name) + { + int ch = *name++; + if (ch < 0 || ! JAVA_START_CHAR_P (ch)) + return 0; + while (*name) + { + ch = *name++; + if (ch < 0) + return 0; + /* We found a break between class names. Next character + must be an identifier start again. */ + if (ch == '.') + break; + if (! JAVA_PART_CHAR_P (ch)) + return 0; + } + } + + return 1; + } + void lang_specific_driver (in_argc, in_argv, in_added_libraries) int *in_argc; *************** lang_specific_driver (in_argc, in_argv, *** 163,169 **** int saw_libgcj ATTRIBUTE_UNUSED = 0; #endif ! /* Saw -C or -o option, respectively. */ int saw_C = 0; int saw_o = 0; --- 210,217 ---- int saw_libgcj ATTRIBUTE_UNUSED = 0; #endif ! /* Saw --resource, -C or -o options, respectively. */ ! int saw_resource = 0; int saw_C = 0; int saw_o = 0; *************** lang_specific_driver (in_argc, in_argv, *** 255,260 **** --- 303,317 ---- library = 0; will_link = 0; } + else if (strncmp (argv[i], "-fcompile-resource=", 19) == 0) + { + saw_resource = 1; + want_spec_file = 0; + if (library != 0) + --added; + library = 0; + will_link = 0; + } else if (argv[i][1] == 'D') saw_D = 1; else if (argv[i][1] == 'g') *************** lang_specific_driver (in_argc, in_argv, *** 272,277 **** --- 329,335 ---- quote = argv[i]; } else if (strcmp(argv[i], "-classpath") == 0 + || strcmp(argv[i], "-bootclasspath") == 0 || strcmp(argv[i], "-CLASSPATH") == 0) { quote = argv[i]; *************** lang_specific_driver (in_argc, in_argv, *** 323,328 **** --- 381,393 ---- continue; } + if (saw_resource) + { + args[i] |= RESOURCE_FILE_ARG; + last_input_index = i; + added += 2; /* for -xjava and -xnone */ + } + if (argv[i][0] == '@') { args[i] |= INDIRECT_FILE_ARG; *************** lang_specific_driver (in_argc, in_argv, *** 360,372 **** if (saw_D && ! main_class_name) fatal ("can't specify `-D' without `--main'\n"); num_args = argc + added; if (saw_C) { num_args += 3; if (class_files_count + zip_files_count > 0) { ! error ("Warning: already-compiled .class files ignored with -C"); num_args -= class_files_count + zip_files_count; class_files_count = 0; zip_files_count = 0; --- 425,445 ---- if (saw_D && ! main_class_name) fatal ("can't specify `-D' without `--main'\n"); + if (main_class_name && ! verify_class_name (main_class_name)) + fatal ("`%s' is not a valid class name", main_class_name); + num_args = argc + added; + if (saw_resource) + { + if (! saw_o) + fatal ("--resource requires -o"); + } if (saw_C) { num_args += 3; if (class_files_count + zip_files_count > 0) { ! error ("warning: already-compiled .class files ignored with -C"); num_args -= class_files_count + zip_files_count; class_files_count = 0; zip_files_count = 0; *************** lang_specific_driver (in_argc, in_argv, *** 433,439 **** --- 506,520 ---- if ((args[i] & PARAM_ARG) || i == 0) continue; + if ((args[i] & RESOURCE_FILE_ARG) != 0) + { + arglist[j++] = "-xjava"; + arglist[j++] = argv[i]; + arglist[j] = "-xnone"; + } + if (strcmp (argv[i], "-classpath") == 0 + || strcmp (argv[i], "-bootclasspath") == 0 || strcmp (argv[i], "-CLASSPATH") == 0) { arglist[j] = concat ("-f", argv[i]+1, "=", argv[i+1], NULL); diff -Nrc3pad gcc-3.0.4/gcc/java/keyword.gperf gcc-3.1/gcc/java/keyword.gperf *** gcc-3.0.4/gcc/java/keyword.gperf Mon Nov 20 22:37:22 2000 --- gcc-3.1/gcc/java/keyword.gperf Sun Dec 23 16:07:13 2001 *************** of Sun Microsystems, Inc. in the United *** 25,31 **** The Free Software Foundation is independent of Sun Microsystems, Inc. */ %} ! struct java_keyword { const char *name; int token; }; #ifdef __GNUC__ __inline #endif --- 25,31 ---- The Free Software Foundation is independent of Sun Microsystems, Inc. */ %} ! struct java_keyword { const char *const name; const int token; }; #ifdef __GNUC__ __inline #endif *************** static unsigned int hash PARAMS ((const *** 33,39 **** #ifdef __GNUC__ __inline #endif ! struct java_keyword *java_keyword PARAMS ((const char *, unsigned int)); %% abstract, ABSTRACT_TK default, DEFAULT_TK --- 33,39 ---- #ifdef __GNUC__ __inline #endif ! const struct java_keyword *java_keyword PARAMS ((const char *, unsigned int)); %% abstract, ABSTRACT_TK default, DEFAULT_TK diff -Nrc3pad gcc-3.0.4/gcc/java/keyword.h gcc-3.1/gcc/java/keyword.h *** gcc-3.0.4/gcc/java/keyword.h Mon Nov 20 22:37:22 2000 --- gcc-3.1/gcc/java/keyword.h Sun Dec 23 16:07:13 2001 *************** *** 1,5 **** ! /* C code produced by gperf version 2.7 */ ! /* Command-line: gperf -L C -F , 0 -p -t -j1 -i 1 -g -o -N java_keyword -k1,4,$ keyword.gperf */ /* Keyword definition for the GNU compiler for the Java(TM) language. Copyright (C) 1997, 1998 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) --- 1,5 ---- ! /* C code produced by gperf version 2.7.2 */ ! /* Command-line: gperf -L C -C -F ', 0' -p -t -j1 -i 1 -g -o -N java_keyword -k'1,4,$' keyword.gperf */ /* Keyword definition for the GNU compiler for the Java(TM) language. Copyright (C) 1997, 1998 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) *************** Java and all Java-based marks are tradem *** 25,31 **** of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ ! struct java_keyword { const char *name; int token; }; #ifdef __GNUC__ __inline #endif --- 25,31 ---- of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ ! struct java_keyword { const char *const name; const int token; }; #ifdef __GNUC__ __inline #endif *************** static unsigned int hash PARAMS ((const *** 33,39 **** #ifdef __GNUC__ __inline #endif ! struct java_keyword *java_keyword PARAMS ((const char *, unsigned int)); #define TOTAL_KEYWORDS 51 #define MIN_WORD_LENGTH 2 --- 33,39 ---- #ifdef __GNUC__ __inline #endif ! const struct java_keyword *java_keyword PARAMS ((const char *, unsigned int)); #define TOTAL_KEYWORDS 51 #define MIN_WORD_LENGTH 2 *************** struct java_keyword *java_keyword PARAMS *** 44,56 **** #ifdef __GNUC__ __inline #endif static unsigned int hash (str, len) register const char *str; register unsigned int len; { ! static unsigned char asso_values[] = { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, --- 44,60 ---- #ifdef __GNUC__ __inline + #else + #ifdef __cplusplus + inline + #endif #endif static unsigned int hash (str, len) register const char *str; register unsigned int len; { ! static const unsigned char asso_values[] = { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, *************** hash (str, len) *** 98,111 **** #ifdef __GNUC__ __inline #endif ! struct java_keyword * java_keyword (str, len) register const char *str; register unsigned int len; { ! static struct java_keyword wordlist[] = { ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"else", ELSE_TK}, {"true", TRUE_TK}, {"case", CASE_TK}, --- 102,116 ---- #ifdef __GNUC__ __inline #endif ! const struct java_keyword * java_keyword (str, len) register const char *str; register unsigned int len; { ! static const struct java_keyword wordlist[] = { ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, ! {"", 0}, {"else", ELSE_TK}, {"true", TRUE_TK}, {"case", CASE_TK}, *************** java_keyword (str, len) *** 163,174 **** {"instanceof", INSTANCEOF_TK}, {"", 0}, {"throw", THROW_TK}, ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"native", NATIVE_TK}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"import", IMPORT_TK}, ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"goto", GOTO_TK} }; --- 168,181 ---- {"instanceof", INSTANCEOF_TK}, {"", 0}, {"throw", THROW_TK}, ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, ! {"", 0}, {"native", NATIVE_TK}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"import", IMPORT_TK}, ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, ! {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"goto", GOTO_TK} }; diff -Nrc3pad gcc-3.0.4/gcc/java/lang-options.h gcc-3.1/gcc/java/lang-options.h *** gcc-3.0.4/gcc/java/lang-options.h Sat May 26 05:45:49 2001 --- gcc-3.1/gcc/java/lang-options.h Sun Mar 3 08:38:37 2002 *************** *** 1,5 **** /* Switch definitions for the GNU compiler for the Java(TM) language. ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,5 ---- /* Switch definitions for the GNU compiler for the Java(TM) language. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. *************** The Free Software Foundation is independ *** 28,69 **** DEFINE_LANG_NAME ("Java") { "-fbounds-check", "" }, ! { "-fno-bounds-check", N_("Disable automatic array bounds checking") }, ! { "-fassume-compiled", ! N_("Make is_compiled_class return 1") }, ! { "-fno-assume-compiled", "" }, ! { "-femit-class-file", "" }, ! { "-femit-class-files", ! N_("Dump class files to .class") }, ! { "-ffilelist-file", ! N_("input file is list of file names to compile") }, ! { "-fuse-boehm-gc", ! N_("Generate code for Boehm GC") }, ! { "-fhash-synchronization", ! N_("Don't put synchronization structure in each object") }, ! { "-fjni", N_("Assume native functions are implemented using JNI") }, ! { "--classpath", ! N_("Set class path and suppress system path") }, ! { "--CLASSPATH", N_("Set class path") }, ! { "--main", N_("Choose class whose main method should be used") }, ! { "--encoding", ! N_("Choose input encoding (default is UTF-8)") }, ! { "-I", N_("Add directory to class path") }, ! { "-foutput-class-dir", N_("Directory where class files should be written") }, - { "-fuse-divide-subroutine", "" }, - { "-fno-use-divide-subroutine", - N_("Use built-in instructions for division") }, { "-Wredundant-modifiers", N_("Warn if modifiers are specified when not necessary") }, ! { "-Wextraneous-semicolon", N_("Warn if deprecated empty statements are found") }, ! { "-Wout-of-date", N_("Warn if .class files are out of date") }, { "-fforce-classes-archive-check", N_("Always check for non gcj generated classes archives") }, --- 28,62 ---- DEFINE_LANG_NAME ("Java") { "-fbounds-check", "" }, ! { "-fno-bounds-check", N_("Disable automatic array bounds checking") }, ! { "-fno-store-check", ! N_("Disable assignability checks for stores into object arrays") }, ! { "-fjni", N_("Assume native functions are implemented using JNI") }, ! { "--bootclasspath", ! N_("Replace system path") }, ! { "--classpath", N_("Set class path") }, ! { "--CLASSPATH", ! N_("Set class path (deprecated: use --classpath instead)") }, ! { "--main", N_("Choose class whose main method should be used") }, ! { "--encoding", ! N_("Choose input encoding (default comes from locale)") }, ! { "-I", N_("Add directory to class path") }, ! { "-d", N_("Directory where class files should be written") }, { "-Wredundant-modifiers", N_("Warn if modifiers are specified when not necessary") }, ! { "-Wextraneous-semicolon", N_("Warn if deprecated empty statements are found") }, ! { "-Wout-of-date", N_("Warn if .class files are out of date") }, { "-fforce-classes-archive-check", N_("Always check for non gcj generated classes archives") }, + { "-fno-optimize-static-class-initialization", + N_("Never optimize static class initialization code") }, + { "-findirect-dispatch", + N_("Use offset tables for virtual method calls") }, diff -Nrc3pad gcc-3.0.4/gcc/java/lang-specs.h gcc-3.1/gcc/java/lang-specs.h *** gcc-3.0.4/gcc/java/lang-specs.h Thu Mar 22 19:16:20 2001 --- gcc-3.1/gcc/java/lang-specs.h Wed Jul 11 07:33:43 2001 *************** *** 1,5 **** /* Definitions for specs for the GNU compiler for the Java(TM) language. ! Copyright (C) 1996, 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU CC. --- 1,5 ---- /* Definitions for specs for the GNU compiler for the Java(TM) language. ! Copyright (C) 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. *************** The Free Software Foundation is independ *** 32,37 **** --- 32,39 ---- {"@java", "%{fjni:%{femit-class-files:%e-fjni and -femit-class-files are incompatible}}\ %{fjni:%{femit-class-file:%e-fjni and -femit-class-file are incompatible}}\ + %{femit-class-file:%{!fsyntax-only:%e-femit-class-file should used along with -fsyntax-only}}\ + %{femit-class-files:%{!fsyntax-only:%e-femit-class-file should used along with -fsyntax-only}}\ %{!E:jc1 %i %(jc1) %(cc1_options) %{+e*} %{I*}\ %{MD} %{MMD} %{M} %{MM} %{MA} %{MT*} %{MF*}\ %{!fsyntax-only:%(invoke_as)}}", 0}, diff -Nrc3pad gcc-3.0.4/gcc/java/lang.c gcc-3.1/gcc/java/lang.c *** gcc-3.0.4/gcc/java/lang.c Sat May 12 21:21:23 2001 --- gcc-3.1/gcc/java/lang.c Wed Apr 10 13:09:03 2002 *************** The Free Software Foundation is independ *** 34,63 **** #include "java-tree.h" #include "jcf.h" #include "toplev.h" #include "flags.h" #include "xref.h" #include "ggc.h" struct string_option { ! const char *string; ! int *variable; ! int on_value; }; ! static void java_init PARAMS ((void)); static void java_init_options PARAMS ((void)); static int java_decode_option PARAMS ((int, char **)); static void put_decl_string PARAMS ((const char *, int)); static void put_decl_node PARAMS ((tree)); ! static void java_dummy_print PARAMS ((const char *)); ! static void lang_print_error PARAMS ((const char *)); ! static int process_option_with_no PARAMS ((char *, ! struct string_option *, int)); ! #ifndef OBJECT_SUFFIX ! # define OBJECT_SUFFIX ".o" #endif /* Table indexed by tree code giving a string containing a character --- 34,67 ---- #include "java-tree.h" #include "jcf.h" #include "toplev.h" + #include "langhooks.h" + #include "langhooks-def.h" #include "flags.h" #include "xref.h" #include "ggc.h" + #include "diagnostic.h" struct string_option { ! const char *const string; ! int *const variable; ! const int on_value; }; ! static const char *java_init PARAMS ((const char *)); ! static void java_finish PARAMS ((void)); static void java_init_options PARAMS ((void)); static int java_decode_option PARAMS ((int, char **)); static void put_decl_string PARAMS ((const char *, int)); static void put_decl_node PARAMS ((tree)); ! static void java_dummy_print PARAMS ((diagnostic_context *, const char *)); ! static void lang_print_error PARAMS ((diagnostic_context *, const char *)); ! static int process_option_with_no PARAMS ((const char *, ! const struct string_option *, int)); ! #ifndef TARGET_OBJECT_SUFFIX ! # define TARGET_OBJECT_SUFFIX ".o" #endif /* Table indexed by tree code giving a string containing a character *************** static int process_option_with_no PARAMS *** 66,72 **** #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, ! char java_tree_code_type[] = { 'x', #include "java-tree.def" }; --- 70,76 ---- #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, ! static const char java_tree_code_type[] = { 'x', #include "java-tree.def" }; *************** char java_tree_code_type[] = { *** 78,84 **** #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, ! int java_tree_code_length[] = { 0, #include "java-tree.def" }; --- 82,88 ---- #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, ! static const int java_tree_code_length[] = { 0, #include "java-tree.def" }; *************** int java_tree_code_length[] = { *** 88,94 **** Used for printing out the tree and error messages. */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, ! const char *java_tree_code_name[] = { "@@dummy", #include "java-tree.def" }; --- 92,98 ---- Used for printing out the tree and error messages. */ #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, ! static const char *const java_tree_code_name[] = { "@@dummy", #include "java-tree.def" }; *************** const char *java_tree_code_name[] = { *** 96,107 **** int compiling_from_source; ! const char * const language_string = "GNU Java"; ! ! /* Nonzero if we should make is_compiled_class always return 1 for ! appropriate classes that we're referencing. */ ! ! int flag_assume_compiled = 1; int flag_emit_class_files = 0; --- 100,106 ---- int compiling_from_source; ! char * resource_name; int flag_emit_class_files = 0; *************** int flag_jni = 0; *** 138,143 **** --- 137,145 ---- file. */ int flag_newer = 1; + /* When non zero, generate checks for references to NULL. */ + int flag_check_references = 0; + /* The encoding of the source file. */ const char *current_encoding = NULL; *************** int flag_extraneous_semicolon; *** 147,159 **** /* When non zero, always check for a non gcj generated classes archive. */ int flag_force_classes_archive_check; /* Table of language-dependent -f options. STRING is the option name. VARIABLE is the address of the variable. ON_VALUE is the value to store in VARIABLE if `-fSTRING' is seen as an option. (If `-fno-STRING' is seen as an option, the opposite value is stored.) */ ! static struct string_option lang_f_options[] = { {"emit-class-file", &flag_emit_class_files, 1}, --- 149,175 ---- /* When non zero, always check for a non gcj generated classes archive. */ int flag_force_classes_archive_check; + /* When zero, don't optimize static class initialization. This flag shouldn't + be tested alone, use STATIC_CLASS_INITIALIZATION_OPTIMIZATION_P instead. */ + int flag_optimize_sci = 1; + + /* When non zero, use offset tables for virtual method calls + in order to improve binary compatibility. */ + int flag_indirect_dispatch = 0; + + /* When zero, don't generate runtime array store checks. */ + int flag_store_check = 1; + + /* When non zero, print extra version information. */ + static int version_flag = 0; + /* Table of language-dependent -f options. STRING is the option name. VARIABLE is the address of the variable. ON_VALUE is the value to store in VARIABLE if `-fSTRING' is seen as an option. (If `-fno-STRING' is seen as an option, the opposite value is stored.) */ ! static const struct string_option lang_f_options[] = { {"emit-class-file", &flag_emit_class_files, 1}, *************** lang_f_options[] = *** 163,172 **** {"use-boehm-gc", &flag_use_boehm_gc, 1}, {"hash-synchronization", &flag_hash_synchronization, 1}, {"jni", &flag_jni, 1}, ! {"force-classes-archive-check", &flag_force_classes_archive_check, 1} }; ! static struct string_option lang_W_options[] = { { "redundant-modifiers", &flag_redundant, 1 }, --- 179,192 ---- {"use-boehm-gc", &flag_use_boehm_gc, 1}, {"hash-synchronization", &flag_hash_synchronization, 1}, {"jni", &flag_jni, 1}, ! {"check-references", &flag_check_references, 1}, ! {"force-classes-archive-check", &flag_force_classes_archive_check, 1}, ! {"optimize-static-class-initialization", &flag_optimize_sci, 1 }, ! {"indirect-dispatch", &flag_indirect_dispatch, 1}, ! {"store-check", &flag_store_check, 1} }; ! static const struct string_option lang_W_options[] = { { "redundant-modifiers", &flag_redundant, 1 }, *************** lang_W_options[] = *** 177,183 **** JCF *current_jcf; /* Variable controlling how dependency tracking is enabled in ! init_parse. */ static int dependency_tracking = 0; /* Flag values for DEPENDENCY_TRACKING. */ --- 197,203 ---- JCF *current_jcf; /* Variable controlling how dependency tracking is enabled in ! java_init. */ static int dependency_tracking = 0; /* Flag values for DEPENDENCY_TRACKING. */ *************** static int dependency_tracking = 0; *** 186,204 **** #define DEPEND_TARGET_SET 4 #define DEPEND_FILE_ALREADY_SET 8 /* Each front end provides its own. */ ! struct lang_hooks lang_hooks = {java_init, ! NULL, /* java_finish */ ! java_init_options, ! java_decode_option, ! NULL /* post_options */}; /* Process an option that can accept a `no-' form. Return 1 if option found, 0 otherwise. */ static int process_option_with_no (p, table, table_size) ! char *p; ! struct string_option *table; int table_size; { int j; --- 206,233 ---- #define DEPEND_TARGET_SET 4 #define DEPEND_FILE_ALREADY_SET 8 + #undef LANG_HOOKS_NAME + #define LANG_HOOKS_NAME "GNU Java" + #undef LANG_HOOKS_INIT + #define LANG_HOOKS_INIT java_init + #undef LANG_HOOKS_FINISH + #define LANG_HOOKS_FINISH java_finish + #undef LANG_HOOKS_INIT_OPTIONS + #define LANG_HOOKS_INIT_OPTIONS java_init_options + #undef LANG_HOOKS_DECODE_OPTION + #define LANG_HOOKS_DECODE_OPTION java_decode_option + #undef LANG_HOOKS_SET_YYDEBUG + #define LANG_HOOKS_SET_YYDEBUG java_set_yydebug + /* Each front end provides its own. */ ! const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; /* Process an option that can accept a `no-' form. Return 1 if option found, 0 otherwise. */ static int process_option_with_no (p, table, table_size) ! const char *p; ! const struct string_option *table; int table_size; { int j; *************** java_decode_option (argc, argv) *** 232,237 **** --- 261,282 ---- { char *p = argv[0]; + jcf_path_init (); + + if (strcmp (p, "-version") == 0) + { + version_flag = 1; + /* We return 0 so that the caller can process this. */ + return 0; + } + + #define CLARG "-fcompile-resource=" + if (strncmp (p, CLARG, sizeof (CLARG) - 1) == 0) + { + resource_name = p + sizeof (CLARG) - 1; + return 1; + } + #undef CLARG #define CLARG "-fassume-compiled=" if (strncmp (p, CLARG, sizeof (CLARG) - 1) == 0) { *************** java_decode_option (argc, argv) *** 260,265 **** --- 305,317 ---- return 1; } #undef CLARG + #define CLARG "-fCLASSPATH=" + if (strncmp (p, CLARG, sizeof (CLARG) - 1) == 0) + { + jcf_path_classpath_arg (p + sizeof (CLARG) - 1); + return 1; + } + #undef CLARG #define CLARG "-fclasspath=" if (strncmp (p, CLARG, sizeof (CLARG) - 1) == 0) { *************** java_decode_option (argc, argv) *** 267,276 **** return 1; } #undef CLARG ! #define CLARG "-fCLASSPATH=" if (strncmp (p, CLARG, sizeof (CLARG) - 1) == 0) { ! jcf_path_CLASSPATH_arg (p + sizeof (CLARG) - 1); return 1; } #undef CLARG --- 319,335 ---- return 1; } #undef CLARG ! #define CLARG "-fbootclasspath=" if (strncmp (p, CLARG, sizeof (CLARG) - 1) == 0) { ! jcf_path_bootclasspath_arg (p + sizeof (CLARG) - 1); ! return 1; ! } ! #undef CLARG ! #define CLARG "-fextdirs=" ! if (strncmp (p, CLARG, sizeof (CLARG) - 1) == 0) ! { ! jcf_path_extdirs_arg (p + sizeof (CLARG) - 1); return 1; } #undef CLARG *************** java_decode_option (argc, argv) *** 301,308 **** P's value is the option sans `-f'. Search for it in the table of options. */ p += 2; ! return process_option_with_no (p, lang_f_options, ! ARRAY_SIZE (lang_f_options)); } if (strcmp (p, "-Wall") == 0) --- 360,369 ---- P's value is the option sans `-f'. Search for it in the table of options. */ p += 2; ! if (process_option_with_no (p, lang_f_options, ! ARRAY_SIZE (lang_f_options))) ! return 1; ! return dump_switch_p (p); } if (strcmp (p, "-Wall") == 0) *************** java_decode_option (argc, argv) *** 372,381 **** /* Global open file. */ FILE *finput; ! const char * ! init_parse (filename) const char *filename; { /* Open input file. */ if (filename == 0 || !strcmp (filename, "-")) --- 433,447 ---- /* Global open file. */ FILE *finput; ! static const char * ! java_init (filename) const char *filename; { + #if 0 + extern int flag_minimal_debug; + flag_minimal_debug = 0; + #endif + /* Open input file. */ if (filename == 0 || !strcmp (filename, "-")) *************** init_parse (filename) *** 404,410 **** else { char *buf = (char *) xmalloc (dot - filename + ! 3 + sizeof (OBJECT_SUFFIX)); strncpy (buf, filename, dot - filename); /* If emitting class files, we might have multiple --- 470,476 ---- else { char *buf = (char *) xmalloc (dot - filename + ! 3 + sizeof (TARGET_OBJECT_SUFFIX)); strncpy (buf, filename, dot - filename); /* If emitting class files, we might have multiple *************** init_parse (filename) *** 417,423 **** jcf_dependency_set_target (NULL); else { ! strcpy (buf + (dot - filename), OBJECT_SUFFIX); jcf_dependency_set_target (buf); } --- 483,489 ---- jcf_dependency_set_target (NULL); else { ! strcpy (buf + (dot - filename), TARGET_OBJECT_SUFFIX); jcf_dependency_set_target (buf); } *************** init_parse (filename) *** 437,449 **** } } ! init_lex (); return filename; } ! void ! finish_parse () { jcf_dependency_write (); } --- 503,537 ---- } } ! jcf_path_init (); ! jcf_path_seal (version_flag); ! ! decl_printable_name = lang_printable_name; ! print_error_function = lang_print_error; ! lang_expand_expr = java_lang_expand_expr; ! ! /* Append to Gcc tree node definition arrays */ ! ! memcpy (tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE, ! java_tree_code_type, ! (int)LAST_JAVA_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE); ! memcpy (tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE, ! java_tree_code_length, ! (LAST_JAVA_TREE_CODE - ! (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int)); ! memcpy (tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE, ! java_tree_code_name, ! (LAST_JAVA_TREE_CODE - ! (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *)); ! java_init_decl_processing (); ! ! using_eh_for_cleanups (); return filename; } ! static void ! java_finish () { jcf_dependency_write (); } *************** put_decl_node (node) *** 499,530 **** if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd' && DECL_NAME (node) != NULL_TREE) { ! /* We want to print the type the DECL belongs to. We don't do ! that when we handle constructors. */ ! if (TREE_CODE (node) == FUNCTION_DECL ! && ! DECL_CONSTRUCTOR_P (node) ! && ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node)) ! { ! put_decl_node (TYPE_NAME (DECL_CONTEXT (node))); ! put_decl_string (".", 1); ! } ! if (! DECL_CONSTRUCTOR_P (node)) ! put_decl_node (DECL_NAME (node)); ! if (TREE_CODE (node) == FUNCTION_DECL && TREE_TYPE (node) != NULL_TREE) { ! int i = 0; ! tree args = TYPE_ARG_TYPES (TREE_TYPE (node)); ! if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE) ! args = TREE_CHAIN (args); ! put_decl_string ("(", 1); ! for ( ; args != end_params_node; args = TREE_CHAIN (args), i++) { ! if (i > 0) ! put_decl_string (",", 1); ! put_decl_node (TREE_VALUE (args)); } - put_decl_string (")", 1); } } else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't' && TYPE_NAME (node) != NULL_TREE) --- 587,622 ---- if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd' && DECL_NAME (node) != NULL_TREE) { ! if (TREE_CODE (node) == FUNCTION_DECL) { ! /* We want to print the type the DECL belongs to. We don't do ! that when we handle constructors. */ ! if (! DECL_CONSTRUCTOR_P (node) ! && ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node)) { ! put_decl_node (TYPE_NAME (DECL_CONTEXT (node))); ! put_decl_string (".", 1); ! } ! if (! DECL_CONSTRUCTOR_P (node)) ! put_decl_node (DECL_NAME (node)); ! if (TREE_TYPE (node) != NULL_TREE) ! { ! int i = 0; ! tree args = TYPE_ARG_TYPES (TREE_TYPE (node)); ! if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE) ! args = TREE_CHAIN (args); ! put_decl_string ("(", 1); ! for ( ; args != end_params_node; args = TREE_CHAIN (args), i++) ! { ! if (i > 0) ! put_decl_string (",", 1); ! put_decl_node (TREE_VALUE (args)); ! } ! put_decl_string (")", 1); } } + else + put_decl_node (DECL_NAME (node)); } else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't' && TYPE_NAME (node) != NULL_TREE) *************** lang_printable_name_wls (decl, v) *** 588,594 **** is the value of the hook print_error_function, called from toplev.c. */ static void ! lang_print_error (file) const char *file; { static tree last_error_function_context = NULL_TREE; --- 680,687 ---- is the value of the hook print_error_function, called from toplev.c. */ static void ! lang_print_error (context, file) ! diagnostic_context *context __attribute__((__unused__)); const char *file; { static tree last_error_function_context = NULL_TREE; *************** lang_print_error (file) *** 624,630 **** else { const char *name = lang_printable_name (current_function_decl, 2); ! fprintf (stderr, "In method `%s':\n", name); } last_error_function = current_function_decl; --- 717,726 ---- else { const char *name = lang_printable_name (current_function_decl, 2); ! fprintf (stderr, "In %s `%s':\n", ! (DECL_CONSTRUCTOR_P (current_function_decl) ? "constructor" ! : "method"), ! name); } last_error_function = current_function_decl; *************** lang_print_error (file) *** 632,675 **** } - static void - java_init () - { - #if 0 - extern int flag_minimal_debug; - flag_minimal_debug = 0; - #endif - - jcf_path_init (); - jcf_path_seal (); - - decl_printable_name = lang_printable_name; - print_error_function = lang_print_error; - lang_expand_expr = java_lang_expand_expr; - - /* Append to Gcc tree node definition arrays */ - - memcpy (tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE, - java_tree_code_type, - (int)LAST_JAVA_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE); - memcpy (tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE, - java_tree_code_length, - (LAST_JAVA_TREE_CODE - - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int)); - memcpy (tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE, - java_tree_code_name, - (LAST_JAVA_TREE_CODE - - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *)); - - using_eh_for_cleanups (); - } - /* This doesn't do anything on purpose. It's used to satisfy the print_error_function hook we don't print error messages with bogus function prototypes. */ static void ! java_dummy_print (s) const char *s __attribute__ ((__unused__)); { } --- 728,740 ---- } /* This doesn't do anything on purpose. It's used to satisfy the print_error_function hook we don't print error messages with bogus function prototypes. */ static void ! java_dummy_print (c, s) ! diagnostic_context *c __attribute__ ((__unused__)); const char *s __attribute__ ((__unused__)); { } *************** java_init_options () *** 697,756 **** flag_exceptions = 1; flag_non_call_exceptions = 1; } - - const char * - lang_identify () - { - return "Java"; - } - - /* Hooks for print_node. */ - - void - print_lang_decl (file, node, indent) - FILE *file __attribute ((__unused__)); - tree node __attribute ((__unused__)); - int indent __attribute ((__unused__)); - { - } - - void - print_lang_type (file, node, indent) - FILE *file __attribute ((__unused__)); - tree node __attribute ((__unused__)); - int indent __attribute ((__unused__)); - { - } - - void - print_lang_identifier (file, node, indent) - FILE *file __attribute ((__unused__)); - tree node __attribute ((__unused__)); - int indent __attribute ((__unused__)); - { - } - - void - print_lang_statistics () - { - } - - /* used by print-tree.c */ - - void - lang_print_xnode (file, node, indent) - FILE *file __attribute ((__unused__)); - tree node __attribute ((__unused__)); - int indent __attribute ((__unused__)); - { - } - - /* Return the typed-based alias set for T, which may be an expression - or a type. Return -1 if we don't do anything special. */ - - HOST_WIDE_INT - lang_get_alias_set (t) - tree t ATTRIBUTE_UNUSED; - { - return -1; - } --- 762,764 ---- diff -Nrc3pad gcc-3.0.4/gcc/java/lex.c gcc-3.1/gcc/java/lex.c *** gcc-3.0.4/gcc/java/lex.c Wed Jul 18 17:02:18 2001 --- gcc-3.1/gcc/java/lex.c Fri Mar 29 19:31:09 2002 *************** *** 1,5 **** /* Language lexer for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. --- 1,5 ---- /* Language lexer for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. *************** The Free Software Foundation is independ *** 38,44 **** #include "flags.h" #include "chartables.h" ! /* Function declaration */ static char *java_sprint_unicode PARAMS ((struct java_line *, int)); static void java_unicode_2_utf8 PARAMS ((unicode_t)); static void java_lex_error PARAMS ((const char *, int)); --- 38,44 ---- #include "flags.h" #include "chartables.h" ! /* Function declarations. */ static char *java_sprint_unicode PARAMS ((struct java_line *, int)); static void java_unicode_2_utf8 PARAMS ((unicode_t)); static void java_lex_error PARAMS ((const char *, int)); *************** static int utf8_cmp PARAMS ((const unsig *** 66,71 **** --- 66,74 ---- #endif java_lexer *java_new_lexer PARAMS ((FILE *, const char *)); + #ifndef JC1_LITE + static void error_if_numeric_overflow PARAMS ((tree)); + #endif #ifdef HAVE_ICONV /* This is nonzero if we have initialized `need_byteswap'. */ *************** java_init_lex (finput, encoding) *** 115,121 **** wfl_append = build_expr_wfl (get_identifier ("append"), NULL, 0, 0); if (!wfl_string_buffer) wfl_string_buffer = ! build_expr_wfl (get_identifier ("java.lang.StringBuffer"), NULL, 0, 0); if (!wfl_to_string) wfl_to_string = build_expr_wfl (get_identifier ("toString"), NULL, 0, 0); --- 118,127 ---- wfl_append = build_expr_wfl (get_identifier ("append"), NULL, 0, 0); if (!wfl_string_buffer) wfl_string_buffer = ! build_expr_wfl (get_identifier (flag_emit_class_files ! ? "java.lang.StringBuffer" ! : "gnu.gcj.runtime.StringBuffer"), ! NULL, 0, 0); if (!wfl_to_string) wfl_to_string = build_expr_wfl (get_identifier ("toString"), NULL, 0, 0); *************** java_init_lex (finput, encoding) *** 132,138 **** ctxp->lineno = lineno = 0; ctxp->p_line = NULL; ctxp->c_line = NULL; - ctxp->minus_seen = 0; ctxp->java_error_flag = 0; ctxp->lexer = java_new_lexer (finput, encoding); } --- 138,143 ---- *************** java_allocate_new_line () *** 186,192 **** free (ctxp->p_line); } ctxp->p_line = ctxp->c_line; ! ctxp->c_line = NULL; /* Reallocated */ } if (!ctxp->c_line) --- 191,197 ---- free (ctxp->p_line); } ctxp->p_line = ctxp->c_line; ! ctxp->c_line = NULL; /* Reallocated. */ } if (!ctxp->c_line) *************** java_new_lexer (finput, encoding) *** 285,292 **** /* If iconv failed, use the internal decoder if the default encoding was requested. This code is used on platforms where iconv exists but is insufficient for our needs. For ! instance, on Solaris 2.5 iconv cannot handle UTF-8 or UCS-2. */ ! if (strcmp (encoding, DEFAULT_ENCODING)) enc_error = 1; #ifdef HAVE_ICONV else --- 290,302 ---- /* If iconv failed, use the internal decoder if the default encoding was requested. This code is used on platforms where iconv exists but is insufficient for our needs. For ! instance, on Solaris 2.5 iconv cannot handle UTF-8 or UCS-2. ! ! On Solaris the default encoding, as returned by nl_langinfo(), ! is `646' (aka ASCII), but the Solaris iconv_open() doesn't ! understand that. We work around that by pretending ! `646' to be the same as UTF-8. */ ! if (strcmp (encoding, DEFAULT_ENCODING) && strcmp (encoding, "646")) enc_error = 1; #ifdef HAVE_ICONV else *************** java_new_lexer (finput, encoding) *** 295,301 **** } if (enc_error) ! fatal_error ("unknown encoding: `%s'\nThis might mean that your locale's encoding is not supported\nby your system's iconv(3) implementation. If you aren't trying\nto use a particular encoding for your input file, try the\n`--encoding=UTF-8' option.", encoding); return lex; } --- 305,311 ---- } if (enc_error) ! fatal_error ("unknown encoding: `%s'\nThis might mean that your locale's encoding is not supported\nby your system's iconv(3) implementation. If you aren't trying\nto use a particular encoding for your input file, try the\n`--encoding=UTF-8' option", encoding); return lex; } *************** java_read_char (lex) *** 419,428 **** is in the middle of a character sequence. We just move the valid part of the buffer to the beginning to force a read. */ ! /* We use bcopy() because it should work for ! overlapping strings. Use memmove() instead... */ ! bcopy (&lex->buffer[lex->first], &lex->buffer[0], ! lex->last - lex->first); lex->last -= lex->first; lex->first = 0; } --- 429,436 ---- is in the middle of a character sequence. We just move the valid part of the buffer to the beginning to force a read. */ ! memmove (&lex->buffer[0], &lex->buffer[lex->first], ! lex->last - lex->first); lex->last -= lex->first; lex->first = 0; } *************** java_read_char (lex) *** 457,471 **** if (c == EOF) return UEOF; if (c < 128) ! return (unicode_t)c; else { if ((c & 0xe0) == 0xc0) { c1 = getc (lex->finput); if ((c1 & 0xc0) == 0x80) ! return (unicode_t)(((c &0x1f) << 6) + (c1 & 0x3f)); ! c = c1; } else if ((c & 0xf0) == 0xe0) { --- 465,485 ---- if (c == EOF) return UEOF; if (c < 128) ! return (unicode_t) c; else { if ((c & 0xe0) == 0xc0) { c1 = getc (lex->finput); if ((c1 & 0xc0) == 0x80) ! { ! unicode_t r = (unicode_t)(((c & 0x1f) << 6) + (c1 & 0x3f)); ! /* Check for valid 2-byte characters. We explicitly ! allow \0 because this encoding is common in the ! Java world. */ ! if (r == 0 || (r >= 0x80 && r <= 0x7ff)) ! return r; ! } } else if ((c & 0xf0) == 0xe0) { *************** java_read_char (lex) *** 474,489 **** { c2 = getc (lex->finput); if ((c2 & 0xc0) == 0x80) ! return (unicode_t)(((c & 0xf) << 12) + ! (( c1 & 0x3f) << 6) + (c2 & 0x3f)); ! else ! c = c2; } - else - c = c1; } ! /* We simply don't support invalid characters. */ java_lex_error ("malformed UTF-8 character", 0); } } --- 488,510 ---- { c2 = getc (lex->finput); if ((c2 & 0xc0) == 0x80) ! { ! unicode_t r = (unicode_t)(((c & 0xf) << 12) + ! (( c1 & 0x3f) << 6) ! + (c2 & 0x3f)); ! /* Check for valid 3-byte characters. ! Don't allow surrogate, \ufffe or \uffff. */ ! if (r >= 0x800 && r <= 0xffff ! && ! (r >= 0xd800 && r <= 0xdfff) ! && r != 0xfffe && r != 0xffff) ! return r; ! } } } ! /* We simply don't support invalid characters. We also ! don't support 4-, 5-, or 6-byte UTF-8 sequences, as these ! cannot be valid Java characters. */ java_lex_error ("malformed UTF-8 character", 0); } } *************** java_read_unicode (lex, unicode_escape_p *** 551,560 **** { if ((c = java_read_char (lex)) == UEOF) return UEOF; ! if (c >= '0' && c <= '9') ! unicode |= (unicode_t)((c-'0') << shift); ! else if ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) ! unicode |= (unicode_t)((10+(c | 0x20)-'a') << shift); else java_lex_error ("Non hex digit in Unicode escape sequence", 0); } --- 572,579 ---- { if ((c = java_read_char (lex)) == UEOF) return UEOF; ! if (hex_p (c)) ! unicode |= (unicode_t)(hex_value (c) << shift); else java_lex_error ("Non hex digit in Unicode escape sequence", 0); } *************** java_read_unicode_collapsing_terminators *** 592,598 **** static int java_get_unicode () { ! /* It's time to read a line when... */ if (!ctxp->c_line || ctxp->c_line->current == ctxp->c_line->size) { int c; --- 611,617 ---- static int java_get_unicode () { ! /* It's time to read a line when... */ if (!ctxp->c_line || ctxp->c_line->current == ctxp->c_line->size) { int c; *************** java_get_unicode () *** 635,641 **** } /* Parse the end of a C style comment. ! * C is the first character following the '/' and '*'. */ static void java_parse_end_comment (c) int c; --- 654,660 ---- } /* Parse the end of a C style comment. ! * C is the first character following the '/' and '*'. */ static void java_parse_end_comment (c) int c; *************** java_parse_end_comment (c) *** 655,661 **** return; case '/': return; ! case '*': /* reparse only '*' */ java_unget_unicode (); } } --- 674,680 ---- return; case '/': return; ! case '*': /* Reparse only '*'. */ java_unget_unicode (); } } *************** java_parse_doc_section (c) *** 691,699 **** java_lex_error ("Comment not terminated at end of input", 0); if (seen_star && (c == '/')) ! return 1; /* Goto step1 in caller */ ! /* We're parsing @deprecated */ if (valid_tag && (c == '@')) { char tag [11]; --- 710,718 ---- java_lex_error ("Comment not terminated at end of input", 0); if (seen_star && (c == '/')) ! return 1; /* Goto step1 in caller. */ ! /* We're parsing `@deprecated'. */ if (valid_tag && (c == '@')) { char tag [11]; *************** java_start_char_p (c) *** 724,730 **** unicode_t c; { unsigned int hi = c / 256; ! char *page = type_table[hi]; unsigned long val = (unsigned long) page; int flags; --- 743,749 ---- unicode_t c; { unsigned int hi = c / 256; ! const char *const page = type_table[hi]; unsigned long val = (unsigned long) page; int flags; *************** java_part_char_p (c) *** 744,750 **** unicode_t c; { unsigned int hi = c / 256; ! char *page = type_table[hi]; unsigned long val = (unsigned long) page; int flags; --- 763,769 ---- unicode_t c; { unsigned int hi = c / 256; ! const char *const page = type_table[hi]; unsigned long val = (unsigned long) page; int flags; *************** java_lex (java_lval) *** 900,906 **** /* Translation of the Unicode escape in the raw stream of Unicode characters. Takes care of line terminator. */ step1: ! /* Skip white spaces: SP, TAB and FF or ULT */ for (c = java_get_unicode (); c == '\n' || JAVA_WHITE_SPACE_P (c); c = java_get_unicode ()) if (c == '\n') --- 919,925 ---- /* Translation of the Unicode escape in the raw stream of Unicode characters. Takes care of line terminator. */ step1: ! /* Skip white spaces: SP, TAB and FF or ULT. */ for (c = java_get_unicode (); c == '\n' || JAVA_WHITE_SPACE_P (c); c = java_get_unicode ()) if (c == '\n') *************** java_lex (java_lval) *** 911,925 **** ctxp->elc.col = (ctxp->elc.col < 0 ? 0 : ctxp->elc.col); ! if (c == 0x1a) /* CTRL-Z */ { if ((c = java_get_unicode ()) == UEOF) ! return 0; /* Ok here */ else ! java_unget_unicode (); /* Caught later, at the end of the function */ } ! /* Handle EOF here */ ! if (c == UEOF) /* Should probably do something here... */ return 0; /* Take care of eventual comments. */ --- 930,945 ---- ctxp->elc.col = (ctxp->elc.col < 0 ? 0 : ctxp->elc.col); ! if (c == 0x1a) /* CTRL-Z. */ { if ((c = java_get_unicode ()) == UEOF) ! return 0; /* Ok here. */ else ! java_unget_unicode (); /* Caught later, at the end of the ! function. */ } ! /* Handle EOF here. */ ! if (c == UEOF) /* Should probably do something here... */ return 0; /* Take care of eventual comments. */ *************** java_lex (java_lval) *** 949,955 **** if ((c = java_get_unicode ()) == '*') { if ((c = java_get_unicode ()) == '/') ! goto step1; /* Empy documentation comment */ else if (java_parse_doc_section (c)) goto step1; } --- 969,975 ---- if ((c = java_get_unicode ()) == '*') { if ((c = java_get_unicode ()) == '/') ! goto step1; /* Empty documentation comment. */ else if (java_parse_doc_section (c)) goto step1; } *************** java_lex (java_lval) *** 970,991 **** if (ctxp->elc.col < 0) abort (); ! /* Numeric literals */ if (JAVA_ASCII_DIGIT (c) || (c == '.')) { ! /* This section of code is borrowed from gcc/c-lex.c */ #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2) int parts[TOTAL_PARTS]; HOST_WIDE_INT high, low; ! /* End borrowed section */ char literal_token [256]; int literal_index = 0, radix = 10, long_suffix = 0, overflow = 0, bytes; int i; #ifndef JC1_LITE int number_beginning = ctxp->c_line->current; #endif ! /* We might have a . separator instead of a FP like .[0-9]* */ if (c == '.') { unicode_t peep = java_sneak_unicode (); --- 990,1013 ---- if (ctxp->elc.col < 0) abort (); ! /* Numeric literals. */ if (JAVA_ASCII_DIGIT (c) || (c == '.')) { ! /* This section of code is borrowed from gcc/c-lex.c. */ #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2) int parts[TOTAL_PARTS]; HOST_WIDE_INT high, low; ! /* End borrowed section. */ char literal_token [256]; int literal_index = 0, radix = 10, long_suffix = 0, overflow = 0, bytes; + int found_hex_digits = 0, found_non_octal_digits = 0; int i; #ifndef JC1_LITE int number_beginning = ctxp->c_line->current; + tree value; #endif ! /* We might have a . separator instead of a FP like .[0-9]*. */ if (c == '.') { unicode_t peep = java_sneak_unicode (); *************** java_lex (java_lval) *** 1012,1024 **** radix = 8; else if (c == '.') { ! /* Push the '.' back and prepare for a FP parsing... */ java_unget_unicode (); c = '0'; } else { ! /* We have a zero literal: 0, 0{f,F}, 0{d,D} */ JAVA_LEX_LIT ("0", 10); switch (c) { --- 1034,1046 ---- radix = 8; else if (c == '.') { ! /* Push the '.' back and prepare for a FP parsing... */ java_unget_unicode (); c = '0'; } else { ! /* We have a zero literal: 0, 0{l,L}, 0{f,F}, 0{d,D}. */ JAVA_LEX_LIT ("0", 10); switch (c) { *************** java_lex (java_lval) *** 1040,1056 **** } /* Parse the first part of the literal, until we find something which is not a number. */ ! while ((radix == 10 && JAVA_ASCII_DIGIT (c)) || ! (radix == 16 && JAVA_ASCII_HEXDIGIT (c)) || ! (radix == 8 && JAVA_ASCII_OCTDIGIT (c))) { /* We store in a string (in case it turns out to be a FP) and in PARTS if we have to process a integer literal. */ ! int numeric = (RANGE (c, '0', '9') ? c-'0' : 10 +(c|0x20)-'a'); int count; literal_token [literal_index++] = c; ! /* This section of code if borrowed from gcc/c-lex.c */ for (count = 0; count < TOTAL_PARTS; count++) { parts[count] *= radix; --- 1062,1084 ---- } /* Parse the first part of the literal, until we find something which is not a number. */ ! while ((radix == 16 && JAVA_ASCII_HEXDIGIT (c)) || ! JAVA_ASCII_DIGIT (c)) { /* We store in a string (in case it turns out to be a FP) and in PARTS if we have to process a integer literal. */ ! int numeric = hex_value (c); int count; + /* Remember when we find a valid hexadecimal digit. */ + if (radix == 16) + found_hex_digits = 1; + /* Remember when we find an invalid octal digit. */ + else if (radix == 8 && !JAVA_ASCII_OCTDIGIT (c)) + found_non_octal_digits = 1; + literal_token [literal_index++] = c; ! /* This section of code if borrowed from gcc/c-lex.c. */ for (count = 0; count < TOTAL_PARTS; count++) { parts[count] *= radix; *************** java_lex (java_lval) *** 1076,1082 **** int seen_digit = (literal_index ? 1 : 0); int seen_exponent = 0; int fflag = 0; /* 1 for {f,F}, 0 for {d,D}. FP literal are ! double unless specified. */ /* It is ok if the radix is 8 because this just means we've seen a leading `0'. However, radix==16 is invalid. */ --- 1104,1110 ---- int seen_digit = (literal_index ? 1 : 0); int seen_exponent = 0; int fflag = 0; /* 1 for {f,F}, 0 for {d,D}. FP literal are ! double unless specified. */ /* It is ok if the radix is 8 because this just means we've seen a leading `0'. However, radix==16 is invalid. */ *************** java_lex (java_lval) *** 1102,1110 **** { if (stage < 2) { ! /* {E,e} must have seen at list a digit */ if (!seen_digit) ! java_lex_error ("Invalid FP literal", 0); seen_digit = 0; seen_exponent = 1; stage = 2; --- 1130,1139 ---- { if (stage < 2) { ! /* {E,e} must have seen at least a digit. */ if (!seen_digit) ! java_lex_error ! ("Invalid FP literal, mantissa must have digit", 0); seen_digit = 0; seen_exponent = 1; stage = 2; *************** java_lex (java_lval) *** 1117,1123 **** if ( c == 'f' || c == 'F' || c == 'd' || c == 'D') { fflag = ((c == 'd') || (c == 'D')) ? 0 : 1; ! stage = 4; /* So we fall through */ } if ((c=='-' || c =='+') && stage == 2) --- 1146,1152 ---- if ( c == 'f' || c == 'F' || c == 'd' || c == 'D') { fflag = ((c == 'd') || (c == 'D')) ? 0 : 1; ! stage = 4; /* So we fall through. */ } if ((c=='-' || c =='+') && stage == 2) *************** java_lex (java_lval) *** 1134,1139 **** --- 1163,1170 ---- { if (JAVA_ASCII_DIGIT (c)) seen_digit = 1; + if (stage == 2) + stage = 3; literal_token [literal_index++ ] = c; c = java_get_unicode (); } *************** java_lex (java_lval) *** 1142,1153 **** #ifndef JC1_LITE struct jpa_args a; #endif ! if (stage != 4) /* Don't push back fF/dD */ java_unget_unicode (); /* An exponent (if any) must have seen a digit. */ if (seen_exponent && !seen_digit) ! java_lex_error ("Invalid FP literal", 0); literal_token [literal_index] = '\0'; JAVA_LEX_LIT (literal_token, radix); --- 1173,1185 ---- #ifndef JC1_LITE struct jpa_args a; #endif ! if (stage != 4) /* Don't push back fF/dD. */ java_unget_unicode (); /* An exponent (if any) must have seen a digit. */ if (seen_exponent && !seen_digit) ! java_lex_error ! ("Invalid FP literal, exponent must have digit", 0); literal_token [literal_index] = '\0'; JAVA_LEX_LIT (literal_token, radix); *************** java_lex (java_lval) *** 1166,1190 **** #endif } } ! } /* JAVA_ASCCI_FPCHAR (c) */ /* Here we get back to converting the integral literal. */ ! if (c == 'L' || c == 'l') long_suffix = 1; - else if (radix == 16 && JAVA_ASCII_LETTER (c)) - java_lex_error ("Digit out of range in hexadecimal literal", 0); - else if (radix == 8 && JAVA_ASCII_DIGIT (c)) - java_lex_error ("Digit out of range in octal literal", 0); - else if (radix == 16 && !literal_index) - java_lex_error ("No digit specified for hexadecimal literal", 0); else java_unget_unicode (); #ifdef JAVA_LEX_DEBUG ! literal_token [literal_index] = '\0'; /* So JAVA_LEX_LIT is safe. */ JAVA_LEX_LIT (literal_token, radix); #endif ! /* This section of code is borrowed from gcc/c-lex.c */ if (!overflow) { bytes = GET_TYPE_PRECISION (long_type_node); --- 1198,1221 ---- #endif } } ! } /* JAVA_ASCII_FPCHAR (c) */ /* Here we get back to converting the integral literal. */ ! if (radix == 16 && ! found_hex_digits) ! java_lex_error ! ("0x must be followed by at least one hexadecimal digit", 0); ! else if (radix == 8 && found_non_octal_digits) ! java_lex_error ("Octal literal contains digit out of range", 0); ! else if (c == 'L' || c == 'l') long_suffix = 1; else java_unget_unicode (); #ifdef JAVA_LEX_DEBUG ! literal_token [literal_index] = '\0'; /* So JAVA_LEX_LIT is safe. */ JAVA_LEX_LIT (literal_token, radix); #endif ! /* This section of code is borrowed from gcc/c-lex.c. */ if (!overflow) { bytes = GET_TYPE_PRECISION (long_type_node); *************** java_lex (java_lval) *** 1205,1245 **** } /* End borrowed section. */ ! /* Range checking */ if (long_suffix) { /* 9223372036854775808L is valid if operand of a '-'. Otherwise 9223372036854775807L is the biggest `long' literal that can be ! expressed using a 10 radix. For other radixes, everything that ! fits withing 64 bits is OK. */ int hb = (high >> 31); ! if (overflow || (hb && low && radix == 10) || ! (hb && high & 0x7fffffff && radix == 10) || ! (hb && !(high & 0x7fffffff) && !ctxp->minus_seen && radix == 10)) JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `long' literal"); } else { /* 2147483648 is valid if operand of a '-'. Otherwise, 2147483647 is the biggest `int' literal that can be ! expressed using a 10 radix. For other radixes, everything that fits within 32 bits is OK. As all literals are ! signed, we sign extend here. */ int hb = (low >> 31) & 0x1; ! if (overflow || high || (hb && low & 0x7fffffff && radix == 10) || ! (hb && !(low & 0x7fffffff) && !ctxp->minus_seen && radix == 10)) JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `int' literal"); high = -hb; } ! ctxp->minus_seen = 0; SET_LVAL_NODE_TYPE (build_int_2 (low, high), ! (long_suffix ? long_type_node : int_type_node)); return INT_LIT_TK; } ! ctxp->minus_seen = 0; ! ! /* Character literals */ if (c == '\'') { int char_lit; --- 1236,1277 ---- } /* End borrowed section. */ ! /* Range checking. */ if (long_suffix) { /* 9223372036854775808L is valid if operand of a '-'. Otherwise 9223372036854775807L is the biggest `long' literal that can be ! expressed using a 10 radix. For other radices, everything that ! fits withing 64 bits is OK. */ int hb = (high >> 31); ! if (overflow || (hb && low && radix == 10) ! || (hb && high & 0x7fffffff && radix == 10)) JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `long' literal"); } else { /* 2147483648 is valid if operand of a '-'. Otherwise, 2147483647 is the biggest `int' literal that can be ! expressed using a 10 radix. For other radices, everything that fits within 32 bits is OK. As all literals are ! signed, we sign extend here. */ int hb = (low >> 31) & 0x1; ! if (overflow || high || (hb && low & 0x7fffffff && radix == 10)) JAVA_INTEGRAL_RANGE_ERROR ("Numeric overflow for `int' literal"); high = -hb; } ! #ifndef JC1_LITE ! value = build_int_2 (low, high); ! JAVA_RADIX10_FLAG (value) = radix == 10; ! SET_LVAL_NODE_TYPE (value, long_suffix ? long_type_node : int_type_node); ! #else SET_LVAL_NODE_TYPE (build_int_2 (low, high), ! long_suffix ? long_type_node : int_type_node); ! #endif return INT_LIT_TK; } ! /* Character literals. */ if (c == '\'') { int char_lit; *************** java_lex (java_lval) *** 1260,1273 **** java_lex_error ("Syntax error in character literal", 0); if (char_lit == JAVA_CHAR_ERROR) ! char_lit = 0; /* We silently convert it to zero */ JAVA_LEX_CHAR_LIT (char_lit); SET_LVAL_NODE_TYPE (build_int_2 (char_lit, 0), char_type_node); return CHAR_LIT_TK; } ! /* String literals */ if (c == '"') { int no_error; --- 1292,1305 ---- java_lex_error ("Syntax error in character literal", 0); if (char_lit == JAVA_CHAR_ERROR) ! char_lit = 0; /* We silently convert it to zero. */ JAVA_LEX_CHAR_LIT (char_lit); SET_LVAL_NODE_TYPE (build_int_2 (char_lit, 0), char_type_node); return CHAR_LIT_TK; } ! /* String literals. */ if (c == '"') { int no_error; *************** java_lex (java_lval) *** 1285,1294 **** } java_unicode_2_utf8 (c); } ! if (c == '\n' || c == UEOF) /* ULT */ { ! lineno--; /* Refer to the line the terminator was seen */ ! java_lex_error ("String not terminated at end of line.", 0); lineno++; } --- 1317,1326 ---- } java_unicode_2_utf8 (c); } ! if (c == '\n' || c == UEOF) /* ULT. */ { ! lineno--; /* Refer to the line where the terminator was seen. */ ! java_lex_error ("String not terminated at end of line", 0); lineno++; } *************** java_lex (java_lval) *** 1296,1302 **** string = obstack_finish (&temporary_obstack); #ifndef JC1_LITE if (!no_error || (c != '"')) ! java_lval->node = error_mark_node; /* Requires futher testing FIXME */ else java_lval->node = build_string (strlen (string), string); #endif --- 1328,1335 ---- string = obstack_finish (&temporary_obstack); #ifndef JC1_LITE if (!no_error || (c != '"')) ! java_lval->node = error_mark_node; /* FIXME: Requires futher ! testing. */ else java_lval->node = build_string (strlen (string), string); #endif *************** java_lex (java_lval) *** 1304,1310 **** return STRING_LIT_TK; } ! /* Separator */ switch (c) { case '(': --- 1337,1343 ---- return STRING_LIT_TK; } ! /* Separator. */ switch (c) { case '(': *************** java_lex (java_lval) *** 1343,1349 **** /* return DOT_TK; */ } ! /* Operators */ switch (c) { case '=': --- 1376,1382 ---- /* return DOT_TK; */ } ! /* Operators. */ switch (c) { case '=': *************** java_lex (java_lval) *** 1455,1461 **** BUILD_OPERATOR2 (MINUS_ASSIGN_TK); default: java_unget_unicode (); - ctxp->minus_seen = 1; BUILD_OPERATOR (MINUS_TK); } --- 1488,1493 ---- *************** java_lex (java_lval) *** 1524,1530 **** BUILD_OPERATOR (NOT_TK); } ! /* Keyword, boolean literal or null literal */ for (first_unicode = c, all_ascii = 1, ascii_index = 0; JAVA_PART_CHAR_P (c); c = java_get_unicode ()) { --- 1556,1562 ---- BUILD_OPERATOR (NOT_TK); } ! /* Keyword, boolean literal or null literal. */ for (first_unicode = c, all_ascii = 1, ascii_index = 0; JAVA_PART_CHAR_P (c); c = java_get_unicode ()) { *************** java_lex (java_lval) *** 1543,1549 **** this is an identifier (possibly not respecting formation rule). */ if (all_ascii) { ! struct java_keyword *kw; if ((kw=java_keyword (string, ascii_index))) { JAVA_LEX_KW (string); --- 1575,1581 ---- this is an identifier (possibly not respecting formation rule). */ if (all_ascii) { ! const struct java_keyword *kw; if ((kw=java_keyword (string, ascii_index))) { JAVA_LEX_KW (string); *************** java_lex (java_lval) *** 1580,1586 **** SET_LVAL_NODE (char_type_node); return INTEGRAL_TK; ! /* Keyword based literals */ case TRUE_TK: case FALSE_TK: SET_LVAL_NODE ((kw->token == TRUE_TK ? --- 1612,1618 ---- SET_LVAL_NODE (char_type_node); return INTEGRAL_TK; ! /* Keyword based literals. */ case TRUE_TK: case FALSE_TK: SET_LVAL_NODE ((kw->token == TRUE_TK ? *************** java_lex (java_lval) *** 1591,1597 **** return NULL_TK; /* Some keyword we want to retain information on the location ! they where found */ case CASE_TK: case DEFAULT_TK: case SUPER_TK: --- 1623,1629 ---- return NULL_TK; /* Some keyword we want to retain information on the location ! they where found. */ case CASE_TK: case DEFAULT_TK: case SUPER_TK: *************** java_lex (java_lval) *** 1611,1617 **** } } ! /* We may have an ID here */ if (JAVA_START_CHAR_P (first_unicode)) { JAVA_LEX_ID (string); --- 1643,1649 ---- } } ! /* We may have an ID here. */ if (JAVA_START_CHAR_P (first_unicode)) { JAVA_LEX_ID (string); *************** java_lex (java_lval) *** 1619,1625 **** return ID_TK; } ! /* Everything else is an invalid character in the input */ { char lex_error_buffer [128]; sprintf (lex_error_buffer, "Invalid character `%s' in input", --- 1651,1657 ---- return ID_TK; } ! /* Everything else is an invalid character in the input. */ { char lex_error_buffer [128]; sprintf (lex_error_buffer, "Invalid character `%s' in input", *************** java_lex (java_lval) *** 1629,1634 **** --- 1661,1697 ---- return 0; } + #ifndef JC1_LITE + /* This is called by the parser to see if an error should be generated + due to numeric overflow. This function only handles the particular + case of the largest negative value, and is only called in the case + where this value is not preceded by `-'. */ + static void + error_if_numeric_overflow (value) + tree value; + { + if (TREE_CODE (value) == INTEGER_CST && JAVA_RADIX10_FLAG (value)) + { + unsigned HOST_WIDE_INT lo, hi; + + lo = TREE_INT_CST_LOW (value); + hi = TREE_INT_CST_HIGH (value); + if (TREE_TYPE (value) == long_type_node) + { + int hb = (hi >> 31); + if (hb && !(hi & 0x7fffffff)) + java_lex_error ("Numeric overflow for `long' literal", 0); + } + else + { + int hb = (lo >> 31) & 0x1; + if (hb && !(lo & 0x7fffffff)) + java_lex_error ("Numeric overflow for `int' literal", 0); + } + } + } + #endif /* JC1_LITE */ + static void java_unicode_2_utf8 (unicode) unicode_t unicode; *************** java_unicode_2_utf8 (unicode) *** 1642,1648 **** obstack_1grow (&temporary_obstack, (unsigned char)(0x80 | (unicode & 0x3f))); } ! else /* Range 0x800-0xffff */ { obstack_1grow (&temporary_obstack, (unsigned char)(0xe0 | (unicode & 0xf000) >> 12)); --- 1705,1711 ---- obstack_1grow (&temporary_obstack, (unsigned char)(0x80 | (unicode & 0x3f))); } ! else /* Range 0x800-0xffff. */ { obstack_1grow (&temporary_obstack, (unsigned char)(0xe0 | (unicode & 0xf000) >> 12)); *************** build_wfl_node (node) *** 1659,1665 **** tree node; { node = build_expr_wfl (node, ctxp->filename, ctxp->elc.line, ctxp->elc.col); ! /* Prevent java_complete_lhs from short-circuiting node (if constant). */ TREE_TYPE (node) = NULL_TREE; return node; } --- 1722,1728 ---- tree node; { node = build_expr_wfl (node, ctxp->filename, ctxp->elc.line, ctxp->elc.col); ! /* Prevent java_complete_lhs from short-circuiting node (if constant). */ TREE_TYPE (node) = NULL_TREE; return node; } *************** java_lex_error (msg, forward) *** 1674,1680 **** ctxp->elc.line = ctxp->c_line->lineno; ctxp->elc.col = ctxp->c_line->char_col-1+forward; ! /* Might be caught in the middle of some error report */ ctxp->java_error_flag = 0; java_error (NULL); java_error (msg); --- 1737,1743 ---- ctxp->elc.line = ctxp->c_line->lineno; ctxp->elc.col = ctxp->c_line->char_col-1+forward; ! /* Might be caught in the middle of some error report. */ ctxp->java_error_flag = 0; java_error (NULL); java_error (msg); *************** java_get_line_col (filename, line, col) *** 1711,1721 **** #ifdef JC1_LITE return 0; #else ! /* Dumb implementation. Doesn't try to cache or optimize things. */ ! /* First line of the file is line 1, first column is 1 */ ! /* COL == -1 means, at the CR/LF in LINE */ ! /* COL == -2 means, at the first non space char in LINE */ FILE *fp; int c, ccol, cline = 1; --- 1774,1784 ---- #ifdef JC1_LITE return 0; #else ! /* Dumb implementation. Doesn't try to cache or optimize things. */ ! /* First line of the file is line 1, first column is 1. */ ! /* COL == -1 means, at the CR/LF in LINE. */ ! /* COL == -2 means, at the first non space char in LINE. */ FILE *fp; int c, ccol, cline = 1; *************** java_get_line_col (filename, line, col) *** 1731,1737 **** c = getc (fp); if (c == EOF) { ! static char msg[] = "<>"; obstack_grow (&temporary_obstack, msg, sizeof(msg)-1); goto have_line; } --- 1794,1800 ---- c = getc (fp); if (c == EOF) { ! static const char msg[] = "<>"; obstack_grow (&temporary_obstack, msg, sizeof(msg)-1); goto have_line; } *************** java_get_line_col (filename, line, col) *** 1739,1745 **** cline++; } ! /* Gather the chars of the current line in a buffer */ for (;;) { c = getc (fp); --- 1802,1808 ---- cline++; } ! /* Gather the chars of the current line in a buffer. */ for (;;) { c = getc (fp); *************** java_get_line_col (filename, line, col) *** 1764,1774 **** else first_non_space = 0; ! /* Place the '^' a the right position */ base = obstack_base (&temporary_obstack); for (ccol = 1; ccol <= col+3; ccol++) { ! /* Compute \t when reaching first_non_space */ char c = (first_non_space ? (base [ccol-1] == '\t' ? '\t' : ' ') : ' '); obstack_1grow (&temporary_obstack, c); --- 1827,1837 ---- else first_non_space = 0; ! /* Place the '^' a the right position. */ base = obstack_base (&temporary_obstack); for (ccol = 1; ccol <= col+3; ccol++) { ! /* Compute \t when reaching first_non_space. */ char c = (first_non_space ? (base [ccol-1] == '\t' ? '\t' : ' ') : ' '); obstack_1grow (&temporary_obstack, c); *************** utf8_cmp (str, length, name) *** 1802,1808 **** /* A sorted list of all C++ keywords. */ ! static const char *cxx_keywords[] = { "_Complex", "__alignof", --- 1865,1871 ---- /* A sorted list of all C++ keywords. */ ! static const char *const cxx_keywords[] = { "_Complex", "__alignof", *************** static const char *cxx_keywords[] = *** 1833,1841 **** "__typeof__", "__volatile", "__volatile__", - "asm", "and", "and_eq", "auto", "bitand", "bitor", --- 1896,1904 ---- "__typeof__", "__volatile", "__volatile__", "and", "and_eq", + "asm", "auto", "bitand", "bitor", *************** static const char *cxx_keywords[] = *** 1895,1902 **** "true", "try", "typedef", - "typename", "typeid", "typeof", "union", "unsigned", --- 1958,1965 ---- "true", "try", "typedef", "typeid", + "typename", "typeof", "union", "unsigned", *************** cxx_keyword_p (name, length) *** 1933,1940 **** if (r == 0) { int i; ! /* We've found a match if all the remaining characters are ! `$'. */ for (i = min_length; i < length && name[i] == '$'; ++i) ; if (i == length) --- 1996,2002 ---- if (r == 0) { int i; ! /* We've found a match if all the remaining characters are `$'. */ for (i = min_length; i < length && name[i] == '$'; ++i) ; if (i == length) diff -Nrc3pad gcc-3.0.4/gcc/java/lex.h gcc-3.1/gcc/java/lex.h *** gcc-3.0.4/gcc/java/lex.h Wed Jul 18 17:02:18 2001 --- gcc-3.1/gcc/java/lex.h Sun Oct 21 21:32:11 2001 *************** Java and all Java-based marks are tradem *** 23,32 **** of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ ! #ifndef JV_LEX_H ! #define JV_LEX_H ! ! #include /* set_float_handler argument uses it */ /* Extern global variables declarations */ extern FILE *finput; --- 23,30 ---- of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ ! #ifndef GCC_JAVA_LEX_H ! #define GCC_JAVA_LEX_H /* Extern global variables declarations */ extern FILE *finput; *************** extern void java_destroy_lexer PARAMS (( *** 172,178 **** #define DCONST0 0 #define REAL_VALUE_TYPE int - #define SET_FLOAT_HANDLER(H) #define GET_IDENTIFIER(S) xstrdup ((S)) #define REAL_VALUE_ATOF(LIT,MODE) 0 #define REAL_VALUE_ISINF(VALUE) 0 --- 170,175 ---- *************** extern void java_destroy_lexer PARAMS (( *** 192,199 **** #else - extern void set_float_handler PARAMS ((jmp_buf)); - #define SET_FLOAT_HANDLER(H) set_float_handler ((H)) #define DCONST0 dconst0 #define GET_IDENTIFIER(S) get_identifier ((S)) #define SET_REAL_VALUE_ATOF(TARGET,SOURCE) (TARGET) = (SOURCE) --- 189,194 ---- *************** extern void set_float_handler PARAMS ((j *** 255,291 **** #define RANGE(c, l, h) (((c) >= l && (c) <= h)) #define JAVA_WHITE_SPACE_P(c) (c == ' ' || c == '\t' || c == '\f') #define JAVA_START_CHAR_P(c) ((c < 128 \ ! && (RANGE (c, 'A', 'Z') \ ! || RANGE (c, 'a', 'z') \ ! || c == '_' \ ! || c == '$')) \ || (c >= 128 && java_start_char_p (c))) #define JAVA_PART_CHAR_P(c) ((c < 128 \ ! && (RANGE (c, 'A', 'Z') \ ! || RANGE (c, 'a', 'z') \ ! || RANGE (c, '0', '9') \ ! || c == '_' \ || c == '$' \ || c == 0x0000 \ || RANGE (c, 0x01, 0x08) \ || RANGE (c, 0x0e, 0x1b) \ || c == 0x7f)) \ || (c >= 128 && java_part_char_p (c))) ! #define JAVA_ASCII_DIGIT(c) RANGE (c, '0', '9') #define JAVA_ASCII_OCTDIGIT(c) RANGE (c, '0', '7') ! #define JAVA_ASCII_HEXDIGIT(c) (RANGE (c, '0', '9') || \ ! RANGE (c, 'a', 'f') || \ ! RANGE (c, 'A', 'F')) #define JAVA_ASCII_FPCHAR(c) (RANGE (c, 'd', 'f') || RANGE (c, 'D', 'F') || \ c == '.' || JAVA_ASCII_DIGIT (c)) #define JAVA_FP_SUFFIX(c) (c == 'D' || c == 'd' || c == 'f' || c == 'F') #define JAVA_FP_EXP(c) (c == 'E' || c == 'F') #define JAVA_FP_PM(c) (c == '-' || c == '+') ! #define JAVA_ASCII_LETTER(c) (RANGE (c, 'a', 'z') || RANGE (c, 'A', 'Z')) /* Constants */ #define JAVA_READ_BUFFER 256 #define JAVA_CHAR_ERROR -2 #define UEOF -1 ! #endif --- 250,278 ---- #define RANGE(c, l, h) (((c) >= l && (c) <= h)) #define JAVA_WHITE_SPACE_P(c) (c == ' ' || c == '\t' || c == '\f') #define JAVA_START_CHAR_P(c) ((c < 128 \ ! && (ISIDST (c) || c == '$')) \ || (c >= 128 && java_start_char_p (c))) #define JAVA_PART_CHAR_P(c) ((c < 128 \ ! && (ISIDNUM (c) \ || c == '$' \ || c == 0x0000 \ || RANGE (c, 0x01, 0x08) \ || RANGE (c, 0x0e, 0x1b) \ || c == 0x7f)) \ || (c >= 128 && java_part_char_p (c))) ! #define JAVA_ASCII_DIGIT(c) ISDIGIT (c) #define JAVA_ASCII_OCTDIGIT(c) RANGE (c, '0', '7') ! #define JAVA_ASCII_HEXDIGIT(c) ISXDIGIT (c) #define JAVA_ASCII_FPCHAR(c) (RANGE (c, 'd', 'f') || RANGE (c, 'D', 'F') || \ c == '.' || JAVA_ASCII_DIGIT (c)) #define JAVA_FP_SUFFIX(c) (c == 'D' || c == 'd' || c == 'f' || c == 'F') #define JAVA_FP_EXP(c) (c == 'E' || c == 'F') #define JAVA_FP_PM(c) (c == '-' || c == '+') ! #define JAVA_ASCII_LETTER(c) ISALPHA (c) /* Constants */ #define JAVA_READ_BUFFER 256 #define JAVA_CHAR_ERROR -2 #define UEOF -1 ! #endif /* ! GCC_JAVA_LEX_H */ diff -Nrc3pad gcc-3.0.4/gcc/java/mangle.c gcc-3.1/gcc/java/mangle.c *** gcc-3.0.4/gcc/java/mangle.c Sun Apr 29 11:26:30 2001 --- gcc-3.1/gcc/java/mangle.c Thu Dec 20 22:48:51 2001 *************** java_mangle_decl (obstack, decl) *** 82,88 **** mangle_method_decl (decl); break; default: ! internal_error ("Can't mangle %s", tree_code_name [TREE_CODE (decl)]); } return finish_mangling (); } --- 82,88 ---- mangle_method_decl (decl); break; default: ! internal_error ("can't mangle %s", tree_code_name [TREE_CODE (decl)]); } return finish_mangling (); } *************** mangle_method_decl (mdecl) *** 142,161 **** /* Mangle the name of the type that contains mdecl */ mangle_record_type (DECL_CONTEXT (mdecl), /* for_pointer = */ 0); ! /* Mangle the function name. There three cases ! - mdecl is java.lang.Object.Object(), use `C2' for its name ! (denotes a base object constructor.) - mdecl is a constructor, use `C1' for its name, (denotes a complete object constructor.) - mdecl is not a constructor, standard mangling is performed. We terminate the mangled function name with a `E'. */ if (ID_INIT_P (method_name)) ! { ! if (DECL_CONTEXT (mdecl) == object_type_node) ! obstack_grow (mangle_obstack, "C2", 2); ! else ! obstack_grow (mangle_obstack, "C1", 2); ! } else mangle_member_name (method_name); obstack_1grow (mangle_obstack, 'E'); --- 142,154 ---- /* Mangle the name of the type that contains mdecl */ mangle_record_type (DECL_CONTEXT (mdecl), /* for_pointer = */ 0); ! /* Mangle the function name. There are two cases: - mdecl is a constructor, use `C1' for its name, (denotes a complete object constructor.) - mdecl is not a constructor, standard mangling is performed. We terminate the mangled function name with a `E'. */ if (ID_INIT_P (method_name)) ! obstack_grow (mangle_obstack, "C1", 2); else mangle_member_name (method_name); obstack_1grow (mangle_obstack, 'E'); *************** mangle_member_name (name) *** 187,205 **** append_gpp_mangled_name (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)); ! /* If NAME happens to be a C++ keyword, add `$' or `.' or `_'. */ if (cxx_keyword_p (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name))) ! { ! #ifndef NO_DOLLAR_IN_LABEL ! obstack_1grow (mangle_obstack, '$'); ! #else /* NO_DOLLAR_IN_LABEL */ ! #ifndef NO_DOT_IN_LABEL ! obstack_1grow (mangle_obstack, '.'); ! #else /* NO_DOT_IN_LABEL */ ! obstack_1grow (mangle_obstack, '_'); ! #endif /* NO_DOT_IN_LABEL */ ! #endif /* NO_DOLLAR_IN_LABEL */ ! } } /* Append the mangled name of TYPE onto OBSTACK. */ --- 180,188 ---- append_gpp_mangled_name (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)); ! /* If NAME happens to be a C++ keyword, add `$'. */ if (cxx_keyword_p (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name))) ! obstack_1grow (mangle_obstack, '$'); } /* Append the mangled name of TYPE onto OBSTACK. */ *************** mangle_type (type) *** 255,261 **** /* The compression table is a vector that keeps track of things we've already seen, so they can be reused. For example, java.lang.Object ! Would generate three entries: two package names and a type. If java.lang.String is presented next, the java.lang will be matched against the first two entries (and kept for compression as S_0), and type String would be added to the table. See mangle_record_type. --- 238,244 ---- /* The compression table is a vector that keeps track of things we've already seen, so they can be reused. For example, java.lang.Object ! would generate three entries: two package names and a type. If java.lang.String is presented next, the java.lang will be matched against the first two entries (and kept for compression as S_0), and type String would be added to the table. See mangle_record_type. *************** find_compression_record_match (type, nex *** 327,334 **** --- 310,329 ---- { match = i = j; saved_current = current; + i++; break; } + else + { + /* We don't want to match an element that appears in the middle + of a package name, so skip forward to the next complete type name. + IDENTIFIER_NODEs are partial package names while RECORD_TYPEs + represent complete type names. */ + while (j < compression_next + && TREE_CODE (TREE_VEC_ELT (compression_table, j)) == + IDENTIFIER_NODE) + j++; + } } if (!next_current) diff -Nrc3pad gcc-3.0.4/gcc/java/mangle_name.c gcc-3.1/gcc/java/mangle_name.c *** gcc-3.0.4/gcc/java/mangle_name.c Fri Feb 9 20:29:08 2001 --- gcc-3.1/gcc/java/mangle_name.c Thu Dec 20 22:48:51 2001 *************** append_gpp_mangled_name (name, len) *** 72,79 **** /* Assuming (NAME, LEN) is a Utf8-encoded string, emit the string appropriately mangled (with Unicode escapes) to MANGLE_OBSTACK. Characters needing an escape are encoded `__UNN_' to `__UNNNN_', in ! which case `__U' will be mangled `__U_'. `$' is mangled `$' or ! __U24_ according to NO_DOLLAR_IN_LABEL. */ static void append_unicode_mangled_name (name, len) --- 72,78 ---- /* Assuming (NAME, LEN) is a Utf8-encoded string, emit the string appropriately mangled (with Unicode escapes) to MANGLE_OBSTACK. Characters needing an escape are encoded `__UNN_' to `__UNNNN_', in ! which case `__U' will be mangled `__U_'. */ static void append_unicode_mangled_name (name, len) *************** append_unicode_mangled_name (name, len) *** 87,98 **** { int ch = UTF8_GET(ptr, limit); ! if ((ch >= '0' && ch <= '9') ! #ifndef NO_DOLLAR_IN_LABEL ! || ch == '$' ! #endif ! || (ch >= 'a' && ch <= 'z') ! || (ch >= 'A' && ch <= 'Z' && ch != 'U')) obstack_1grow (mangle_obstack, ch); /* Everything else needs encoding */ else --- 86,92 ---- { int ch = UTF8_GET(ptr, limit); ! if ((ISALNUM (ch) && ch != 'U') || ch == '$') obstack_1grow (mangle_obstack, ch); /* Everything else needs encoding */ else *************** unicode_mangling_length (name, len) *** 149,160 **** if (ch < 0) error ("internal error - invalid Utf8 name"); ! if ((ch >= '0' && ch <= '9') ! #ifndef NO_DOLLAR_IN_LABEL ! || ch == '$' ! #endif ! || (ch >= 'a' && ch <= 'z') ! || (ch >= 'A' && ch <= 'Z' && ch != 'U')) num_chars++; /* Everything else needs encoding */ else --- 143,149 ---- if (ch < 0) error ("internal error - invalid Utf8 name"); ! if ((ISALNUM (ch) && ch != 'U') || ch == '$') num_chars++; /* Everything else needs encoding */ else diff -Nrc3pad gcc-3.0.4/gcc/java/parse-scan.c gcc-3.1/gcc/java/parse-scan.c *** gcc-3.0.4/gcc/java/parse-scan.c Wed Feb 20 19:42:15 2002 --- gcc-3.1/gcc/java/parse-scan.c Wed May 15 03:00:47 2002 *************** *** 1,5 **** ! /* A Bison parser, made from /home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y by GNU Bison version 1.28 */ #define YYBISON 1 /* Identify Bison output. */ --- 1,5 ---- ! /* A Bison parser, made from /home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y by GNU Bison version 1.28 */ #define YYBISON 1 /* Identify Bison output. */ *************** *** 113,119 **** #define BOOL_LIT_TK 363 #define NULL_TK 364 ! #line 37 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" #define JC1_LITE --- 113,119 ---- #define BOOL_LIT_TK 363 #define NULL_TK 364 ! #line 37 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" #define JC1_LITE *************** void report PARAMS ((void)); *** 189,201 **** #include "lex.h" #include "parse.h" ! #line 113 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" typedef union { char *node; struct method_declarator *declarator; int value; /* For modifiers */ } YYSTYPE; ! #line 119 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" #include "lex.c" #ifndef YYDEBUG --- 189,201 ---- #include "lex.h" #include "parse.h" ! #line 113 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" typedef union { char *node; struct method_declarator *declarator; int value; /* For modifiers */ } YYSTYPE; ! #line 119 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" #include "lex.c" #ifndef YYDEBUG *************** yyreduce: *** 1939,1990 **** switch (yyn) { case 10: ! #line 211 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { /* use preset global here. FIXME */ yyval.node = xstrdup ("int"); ; break;} case 11: ! #line 216 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { /* use preset global here. FIXME */ yyval.node = xstrdup ("double"); ; break;} case 12: ! #line 221 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { /* use preset global here. FIXME */ yyval.node = xstrdup ("boolean"); ; break;} case 18: ! #line 246 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { while (bracket_count-- > 0) yyval.node = concat ("[", yyvsp[-1].node, NULL); ; break;} case 19: ! #line 251 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { while (bracket_count-- > 0) yyval.node = concat ("[", yyvsp[-1].node, NULL); ; break;} case 23: ! #line 269 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { yyval.node = concat (yyvsp[-2].node, ".", yyvsp[0].node, NULL); ; break;} case 37: ! #line 301 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { package_name = yyvsp[-1].node; ; break;} case 45: ! #line 328 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { if (yyvsp[0].value == PUBLIC_TK) modifier_value++; --- 1939,1990 ---- switch (yyn) { case 10: ! #line 211 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { /* use preset global here. FIXME */ yyval.node = xstrdup ("int"); ; break;} case 11: ! #line 216 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { /* use preset global here. FIXME */ yyval.node = xstrdup ("double"); ; break;} case 12: ! #line 221 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { /* use preset global here. FIXME */ yyval.node = xstrdup ("boolean"); ; break;} case 18: ! #line 246 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { while (bracket_count-- > 0) yyval.node = concat ("[", yyvsp[-1].node, NULL); ; break;} case 19: ! #line 251 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { while (bracket_count-- > 0) yyval.node = concat ("[", yyvsp[-1].node, NULL); ; break;} case 23: ! #line 269 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { yyval.node = concat (yyvsp[-2].node, ".", yyvsp[0].node, NULL); ; break;} case 37: ! #line 301 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { package_name = yyvsp[-1].node; ; break;} case 45: ! #line 328 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { if (yyvsp[0].value == PUBLIC_TK) modifier_value++; *************** case 45: *** 1994,2000 **** ; break;} case 46: ! #line 336 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { if (yyvsp[0].value == PUBLIC_TK) modifier_value++; --- 1994,2000 ---- ; break;} case 46: ! #line 336 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { if (yyvsp[0].value == PUBLIC_TK) modifier_value++; *************** case 46: *** 2004,2068 **** ; break;} case 47: ! #line 348 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration(yyvsp[-2].node); modifier_value = 0; ; break;} case 49: ! #line 354 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration(yyvsp[-2].node); ; break;} case 55: ! #line 368 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 56: ! #line 370 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 57: ! #line 375 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 58: ! #line 377 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 70: ! #line 403 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 71: ! #line 405 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 76: ! #line 421 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { bracket_count = 0; USE_ABSORBER; ; break;} case 77: ! #line 423 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++bracket_count; ; break;} case 81: ! #line 438 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 83: ! #line 441 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 84: ! #line 443 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_main_declaration (yyvsp[-1].declarator); modifier_value = 0; ; break;} case 85: ! #line 451 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { struct method_declarator *d; NEW_METHOD_DECLARATOR (d, yyvsp[-2].node, NULL); --- 2004,2068 ---- ; break;} case 47: ! #line 348 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration(yyvsp[-2].node); modifier_value = 0; ; break;} case 49: ! #line 354 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration(yyvsp[-2].node); ; break;} case 55: ! #line 368 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 56: ! #line 370 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 57: ! #line 375 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 58: ! #line 377 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 70: ! #line 403 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 71: ! #line 405 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 76: ! #line 421 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { bracket_count = 0; USE_ABSORBER; ; break;} case 77: ! #line 423 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++bracket_count; ; break;} case 81: ! #line 438 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 83: ! #line 441 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 84: ! #line 443 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_main_declaration (yyvsp[-1].declarator); modifier_value = 0; ; break;} case 85: ! #line 451 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { struct method_declarator *d; NEW_METHOD_DECLARATOR (d, yyvsp[-2].node, NULL); *************** case 85: *** 2070,2076 **** ; break;} case 86: ! #line 457 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { struct method_declarator *d; NEW_METHOD_DECLARATOR (d, yyvsp[-3].node, yyvsp[-1].node); --- 2070,2076 ---- ; break;} case 86: ! #line 457 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { struct method_declarator *d; NEW_METHOD_DECLARATOR (d, yyvsp[-3].node, yyvsp[-1].node); *************** case 86: *** 2078,2090 **** ; break;} case 89: ! #line 468 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { yyval.node = concat (yyvsp[-2].node, ",", yyvsp[0].node, NULL); ; break;} case 90: ! #line 475 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; if (bracket_count) --- 2078,2090 ---- ; break;} case 89: ! #line 468 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { yyval.node = concat (yyvsp[-2].node, ",", yyvsp[0].node, NULL); ; break;} case 90: ! #line 475 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; if (bracket_count) *************** case 90: *** 2101,2107 **** ; break;} case 91: ! #line 490 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { if (bracket_count) { --- 2101,2107 ---- ; break;} case 91: ! #line 490 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { if (bracket_count) { *************** case 91: *** 2117,2327 **** ; break;} case 94: ! #line 511 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 95: ! #line 513 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 99: ! #line 528 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 101: ! #line 539 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 103: ! #line 544 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 104: ! #line 551 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 105: ! #line 553 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 112: ! #line 570 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 113: ! #line 572 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 116: ! #line 584 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[0].node); modifier_value = 0; ; break;} case 118: ! #line 587 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[0].node); modifier_value = 0; ; break;} case 120: ! #line 590 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[-1].node); modifier_value = 0; ; break;} case 122: ! #line 593 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[-1].node); modifier_value = 0; ; break;} case 126: ! #line 604 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 127: ! #line 606 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 150: ! #line 665 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 151: ! #line 667 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 175: ! #line 707 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 186: ! #line 735 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 187: ! #line 740 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 188: ! #line 745 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 196: ! #line 765 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 201: ! #line 780 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 205: ! #line 797 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 211: ! #line 815 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 222: ! #line 840 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 225: ! #line 849 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 228: ! #line 859 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 234: ! #line 874 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 235: ! #line 878 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 246: ! #line 900 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 247: ! #line 905 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 248: ! #line 907 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 249: ! #line 909 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 250: ! #line 911 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 258: ! #line 926 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration (NULL); ; break;} case 260: ! #line 929 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { report_class_declaration (NULL); ; break;} case 262: ! #line 935 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 276: ! #line 967 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { bracket_count = 1; ; break;} case 277: ! #line 969 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { bracket_count++; ; break;} case 280: ! #line 982 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ++complexity; ; break;} case 281: ! #line 984 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ++complexity; ; break;} case 282: ! #line 985 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 283: ! #line 986 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 284: ! #line 987 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 285: ! #line 988 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 286: ! #line 993 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 289: ! #line 1000 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 336: ! #line 1096 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 338: ! #line 1102 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 340: ! #line 1108 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { ++complexity; ; break;} case 344: ! #line 1122 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} } --- 2117,2327 ---- ; break;} case 94: ! #line 511 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 95: ! #line 513 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 99: ! #line 528 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 101: ! #line 539 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 103: ! #line 544 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 104: ! #line 551 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 105: ! #line 553 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 112: ! #line 570 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 113: ! #line 572 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 116: ! #line 584 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[0].node); modifier_value = 0; ; break;} case 118: ! #line 587 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[0].node); modifier_value = 0; ; break;} case 120: ! #line 590 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[-1].node); modifier_value = 0; ; break;} case 122: ! #line 593 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration (yyvsp[-1].node); modifier_value = 0; ; break;} case 126: ! #line 604 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 127: ! #line 606 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { pop_class_context (); ; break;} case 150: ! #line 665 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 151: ! #line 667 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { modifier_value = 0; ; break;} case 175: ! #line 707 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 186: ! #line 735 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 187: ! #line 740 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 188: ! #line 745 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 196: ! #line 765 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 201: ! #line 780 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 205: ! #line 797 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 211: ! #line 815 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 222: ! #line 840 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 225: ! #line 849 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 228: ! #line 859 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 234: ! #line 874 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 235: ! #line 878 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 246: ! #line 900 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 247: ! #line 905 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 248: ! #line 907 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 249: ! #line 909 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 250: ! #line 911 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 258: ! #line 926 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration (NULL); ; break;} case 260: ! #line 929 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { report_class_declaration (NULL); ; break;} case 262: ! #line 935 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 276: ! #line 967 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { bracket_count = 1; ; break;} case 277: ! #line 969 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { bracket_count++; ; break;} case 280: ! #line 982 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ++complexity; ; break;} case 281: ! #line 984 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ++complexity; ; break;} case 282: ! #line 985 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 283: ! #line 986 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 284: ! #line 987 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 285: ! #line 988 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 286: ! #line 993 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 289: ! #line 1000 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} case 336: ! #line 1096 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 338: ! #line 1102 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 340: ! #line 1108 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { ++complexity; ; break;} case 344: ! #line 1122 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" { USE_ABSORBER; ; break;} } *************** yyerrhandle: *** 2546,2552 **** } return 1; } ! #line 1140 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse-scan.y" /* Create a new parser context */ --- 2546,2552 ---- } return 1; } ! #line 1140 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse-scan.y" /* Create a new parser context */ diff -Nrc3pad gcc-3.0.4/gcc/java/parse.c gcc-3.1/gcc/java/parse.c *** gcc-3.0.4/gcc/java/parse.c Wed Feb 20 19:42:15 2002 --- gcc-3.1/gcc/java/parse.c Wed May 15 02:59:19 2002 *************** *** 1,5 **** ! /* A Bison parser, made from /home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y by GNU Bison version 1.28 */ #define YYBISON 1 /* Identify Bison output. */ --- 1,5 ---- ! /* A Bison parser, made from /home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y by GNU Bison version 1.28 */ #define YYBISON 1 /* Identify Bison output. */ *************** *** 52,59 **** #define NATIVE_TK 295 #define PAD_TK 296 #define ABSTRACT_TK 297 ! #define MODIFIER_TK 298 ! #define STRICT_TK 299 #define DECR_TK 300 #define INCR_TK 301 #define DEFAULT_TK 302 --- 52,59 ---- #define NATIVE_TK 295 #define PAD_TK 296 #define ABSTRACT_TK 297 ! #define STRICT_TK 298 ! #define MODIFIER_TK 299 #define DECR_TK 300 #define INCR_TK 301 #define DEFAULT_TK 302 *************** *** 120,126 **** #define BOOL_LIT_TK 363 #define NULL_TK 364 ! #line 48 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" #include "config.h" #include "system.h" --- 120,126 ---- #define BOOL_LIT_TK 363 #define NULL_TK 364 ! #line 48 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" #include "config.h" #include "system.h" *************** static tree parse_jdk1_1_error PARAMS (( *** 175,195 **** static void complete_class_report_errors PARAMS ((jdep *)); static int process_imports PARAMS ((void)); static void read_import_dir PARAMS ((tree)); ! static int find_in_imports_on_demand PARAMS ((tree)); ! static void find_in_imports PARAMS ((tree)); ! static void check_static_final_variable_assignment_flag PARAMS ((tree)); ! static void reset_static_final_variable_assignment_flag PARAMS ((tree)); ! static void check_final_variable_local_assignment_flag PARAMS ((tree, tree)); ! static void reset_final_variable_local_assignment_flag PARAMS ((tree)); ! static int check_final_variable_indirect_assignment PARAMS ((tree)); ! static void check_final_variable_global_assignment_flag PARAMS ((tree)); static void check_inner_class_access PARAMS ((tree, tree, tree)); ! static int check_pkg_class_access PARAMS ((tree, tree)); static void register_package PARAMS ((tree)); ! static tree resolve_package PARAMS ((tree, tree *)); ! static tree lookup_package_type PARAMS ((const char *, int)); static tree resolve_class PARAMS ((tree, tree, tree, tree)); static void declare_local_variables PARAMS ((int, tree, tree)); static void source_start_java_method PARAMS ((tree)); static void source_end_java_method PARAMS ((void)); static tree find_name_in_single_imports PARAMS ((tree)); --- 175,189 ---- static void complete_class_report_errors PARAMS ((jdep *)); static int process_imports PARAMS ((void)); static void read_import_dir PARAMS ((tree)); ! static int find_in_imports_on_demand PARAMS ((tree, tree)); ! static void find_in_imports PARAMS ((tree, tree)); static void check_inner_class_access PARAMS ((tree, tree, tree)); ! static int check_pkg_class_access PARAMS ((tree, tree, bool)); static void register_package PARAMS ((tree)); ! static tree resolve_package PARAMS ((tree, tree *, tree *)); static tree resolve_class PARAMS ((tree, tree, tree, tree)); static void declare_local_variables PARAMS ((int, tree, tree)); + static void dump_java_tree PARAMS ((enum tree_dump_index, tree)); static void source_start_java_method PARAMS ((tree)); static void source_end_java_method PARAMS ((void)); static tree find_name_in_single_imports PARAMS ((tree)); *************** static tree patch_invoke PARAMS ((tree, *** 217,229 **** static int maybe_use_access_method PARAMS ((int, tree *, tree *)); static tree lookup_method_invoke PARAMS ((int, tree, tree, tree, tree)); static tree register_incomplete_type PARAMS ((int, tree, tree, tree)); static tree obtain_incomplete_type PARAMS ((tree)); static tree java_complete_lhs PARAMS ((tree)); static tree java_complete_tree PARAMS ((tree)); static tree maybe_generate_pre_expand_clinit PARAMS ((tree)); ! static int analyze_clinit_body PARAMS ((tree)); static int maybe_yank_clinit PARAMS ((tree)); static void java_complete_expand_method PARAMS ((tree)); static int unresolved_type_p PARAMS ((tree, tree *)); static void create_jdep_list PARAMS ((struct parser_ctxt *)); static tree build_expr_block PARAMS ((tree, tree)); --- 211,227 ---- static int maybe_use_access_method PARAMS ((int, tree *, tree *)); static tree lookup_method_invoke PARAMS ((int, tree, tree, tree, tree)); static tree register_incomplete_type PARAMS ((int, tree, tree, tree)); + static tree check_inner_circular_reference PARAMS ((tree, tree)); + static tree check_circular_reference PARAMS ((tree)); static tree obtain_incomplete_type PARAMS ((tree)); static tree java_complete_lhs PARAMS ((tree)); static tree java_complete_tree PARAMS ((tree)); static tree maybe_generate_pre_expand_clinit PARAMS ((tree)); ! static int analyze_clinit_body PARAMS ((tree, tree)); static int maybe_yank_clinit PARAMS ((tree)); + static void start_complete_expand_method PARAMS ((tree)); static void java_complete_expand_method PARAMS ((tree)); + static void java_expand_method_bodies PARAMS ((tree)); static int unresolved_type_p PARAMS ((tree, tree *)); static void create_jdep_list PARAMS ((struct parser_ctxt *)); static tree build_expr_block PARAMS ((tree, tree)); *************** static tree build_method_invocation PARA *** 235,242 **** static tree build_new_invocation PARAMS ((tree, tree)); static tree build_assignment PARAMS ((int, int, tree, tree)); static tree build_binop PARAMS ((enum tree_code, int, tree, tree)); ! static int check_final_assignment PARAMS ((tree ,tree)); ! static tree patch_assignment PARAMS ((tree, tree, tree )); static tree patch_binop PARAMS ((tree, tree, tree)); static tree build_unaryop PARAMS ((int, int, tree)); static tree build_incdec PARAMS ((int, int, tree, int)); --- 233,239 ---- static tree build_new_invocation PARAMS ((tree, tree)); static tree build_assignment PARAMS ((int, int, tree, tree)); static tree build_binop PARAMS ((enum tree_code, int, tree, tree)); ! static tree patch_assignment PARAMS ((tree, tree)); static tree patch_binop PARAMS ((tree, tree, tree)); static tree build_unaryop PARAMS ((int, int, tree)); static tree build_incdec PARAMS ((int, int, tree, int)); *************** static int valid_method_invocation_conve *** 251,256 **** --- 248,254 ---- static tree try_builtin_assignconv PARAMS ((tree, tree, tree)); static tree try_reference_assignconv PARAMS ((tree, tree)); static tree build_unresolved_array_type PARAMS ((tree)); + static int build_type_name_from_array_name PARAMS ((tree, tree *)); static tree build_array_from_name PARAMS ((tree, tree, tree, tree *)); static tree build_array_ref PARAMS ((int, tree, tree)); static tree patch_array_ref PARAMS ((tree)); *************** static tree string_constant_concatenatio *** 295,300 **** --- 293,299 ---- static tree build_string_concatenation PARAMS ((tree, tree)); static tree patch_string_cst PARAMS ((tree)); static tree patch_string PARAMS ((tree)); + static tree encapsulate_with_try_catch PARAMS ((int, tree, tree, tree)); static tree build_try_statement PARAMS ((int, tree, tree)); static tree build_try_finally_statement PARAMS ((int, tree, tree)); static tree patch_try_statement PARAMS ((tree)); *************** static tree patch_throw_statement PARAMS *** 303,308 **** --- 302,308 ---- static void check_thrown_exceptions PARAMS ((int, tree)); static int check_thrown_exceptions_do PARAMS ((tree)); static void purge_unchecked_exceptions PARAMS ((tree)); + static bool ctors_unchecked_throws_clause_p PARAMS ((tree)); static void check_throws_clauses PARAMS ((tree, tree, tree)); static void finish_method_declaration PARAMS ((tree)); static tree build_super_invocation PARAMS ((tree)); *************** static tree build_this_super_qualified_i *** 313,324 **** static const char *get_printable_method_name PARAMS ((tree)); static tree patch_conditional_expr PARAMS ((tree, tree, tree)); static tree generate_finit PARAMS ((tree)); ! static void add_instance_initializer PARAMS ((tree)); ! static tree build_instance_initializer PARAMS ((tree)); static void fix_constructors PARAMS ((tree)); static tree build_alias_initializer_parameter_list PARAMS ((int, tree, tree, int *)); ! static void craft_constructor PARAMS ((tree, tree)); static int verify_constructor_super PARAMS ((tree)); static tree create_artificial_method PARAMS ((tree, int, tree, tree, tree)); static void start_artificial_method_body PARAMS ((tree)); --- 313,324 ---- static const char *get_printable_method_name PARAMS ((tree)); static tree patch_conditional_expr PARAMS ((tree, tree, tree)); static tree generate_finit PARAMS ((tree)); ! static tree generate_instinit PARAMS ((tree)); ! static tree build_instinit_invocation PARAMS ((tree)); static void fix_constructors PARAMS ((tree)); static tree build_alias_initializer_parameter_list PARAMS ((int, tree, tree, int *)); ! static tree craft_constructor PARAMS ((tree, tree)); static int verify_constructor_super PARAMS ((tree)); static tree create_artificial_method PARAMS ((tree, int, tree, tree, tree)); static void start_artificial_method_body PARAMS ((tree)); *************** static int check_method_redefinition PAR *** 327,333 **** static int check_method_types_complete PARAMS ((tree)); static void java_check_regular_methods PARAMS ((tree)); static void java_check_abstract_methods PARAMS ((tree)); - static tree maybe_build_primttype_type_ref PARAMS ((tree, tree)); static void unreachable_stmt_error PARAMS ((tree)); static tree find_expr_with_wfl PARAMS ((tree)); static void missing_return_error PARAMS ((tree)); --- 327,332 ---- *************** static tree maybe_make_nested_class_name *** 374,379 **** --- 373,380 ---- static void make_nested_class_name PARAMS ((tree)); static void set_nested_class_simple_name_value PARAMS ((tree, int)); static void link_nested_class_to_enclosing PARAMS ((void)); + static tree resolve_inner_class PARAMS ((struct hash_table *, tree, tree *, + tree *, tree)); static tree find_as_inner_class PARAMS ((tree, tree, tree)); static tree find_as_inner_class_do PARAMS ((tree, tree)); static int check_inner_class_redefinition PARAMS ((tree, tree)); *************** static void create_new_parser_context PA *** 408,413 **** --- 409,418 ---- static void mark_parser_ctxt PARAMS ((void *)); static tree maybe_build_class_init_for_field PARAMS ((tree, tree)); + static bool attach_init_test_initialization_flags PARAMS ((struct hash_entry *, + PTR)); + static bool emit_test_initialization PARAMS ((struct hash_entry *, PTR)); + /* Number of error found so far. */ int java_error_count; /* Number of warning found so far. */ *************** int do_not_fold; *** 417,425 **** /* Cyclic inheritance report, as it can be set by layout_class */ const char *cyclic_inheritance_report; - /* Tell when we're within an instance initializer */ - static int in_instance_initializer; - /* The current parser context */ struct parser_ctxt *ctxp; --- 422,427 ---- *************** struct parser_ctxt *ctxp_for_generation *** 431,437 **** covers both integral/floating point division. The code is changed once the type of both operator is worked out. */ ! static enum tree_code binop_lookup[19] = { PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR, LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR, --- 433,439 ---- covers both integral/floating point division. The code is changed once the type of both operator is worked out. */ ! static const enum tree_code binop_lookup[19] = { PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR, LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR, *************** static tree wpv_id; *** 480,493 **** /* The list of all packages we've seen so far */ static tree package_list = NULL_TREE; ! /* Hold THIS for the scope of the current public method decl. */ static tree current_this; /* Hold a list of catch clauses list. The first element of this list is the list of the catch clauses of the currently analysed try block. */ static tree currently_caught_type_list; ! static tree src_parse_roots[1] = { NULL_TREE }; /* All classes seen from source code */ #define gclass_list src_parse_roots[0] --- 482,502 ---- /* The list of all packages we've seen so far */ static tree package_list = NULL_TREE; ! /* Hold THIS for the scope of the current method decl. */ static tree current_this; /* Hold a list of catch clauses list. The first element of this list is the list of the catch clauses of the currently analysed try block. */ static tree currently_caught_type_list; ! /* This holds a linked list of all the case labels for the current ! switch statement. It is only used when checking to see if there ! are duplicate labels. FIXME: probably this should just be attached ! to the switch itself; then it could be referenced via ! `ctxp->current_loop'. */ ! static tree case_label_list; ! ! static tree src_parse_roots[1]; /* All classes seen from source code */ #define gclass_list src_parse_roots[0] *************** static tree src_parse_roots[1] = { NULL_ *** 509,515 **** } while (0) ! #line 437 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" typedef union { tree node; int sub_token; --- 518,524 ---- } while (0) ! #line 446 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" typedef union { tree node; int sub_token; *************** typedef union { *** 519,525 **** } operator; int value; } YYSTYPE; ! #line 447 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" #include "lex.c" #ifndef YYDEBUG --- 528,534 ---- } operator; int value; } YYSTYPE; ! #line 456 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" #include "lex.c" #ifndef YYDEBUG *************** typedef union { *** 536,546 **** ! #define YYFINAL 775 #define YYFLAG -32768 #define YYNTBASE 111 ! #define YYTRANSLATE(x) ((unsigned)(x) <= 364 ? yytranslate[x] : 273) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, --- 545,555 ---- ! #define YYFINAL 778 #define YYFLAG -32768 #define YYNTBASE 111 ! #define YYTRANSLATE(x) ((unsigned)(x) <= 364 ? yytranslate[x] : 274) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, *************** static const short yyprhs[] = { 0, *** 602,640 **** 460, 467, 469, 471, 472, 477, 478, 484, 485, 491, 492, 499, 503, 508, 511, 515, 518, 522, 525, 529, 531, 534, 536, 538, 540, 542, 544, 547, 550, 553, ! 557, 562, 564, 568, 572, 575, 579, 581, 583, 585, ! 588, 590, 592, 594, 597, 600, 604, 606, 608, 610, ! 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, ! 632, 634, 636, 638, 640, 642, 644, 646, 648, 650, ! 653, 656, 659, 662, 665, 668, 671, 674, 678, 683, ! 688, 694, 699, 705, 712, 720, 727, 729, 731, 733, ! 735, 737, 739, 741, 747, 750, 754, 759, 767, 775, ! 776, 780, 785, 788, 792, 798, 801, 805, 809, 814, ! 816, 819, 822, 824, 827, 831, 834, 837, 841, 844, ! 849, 852, 855, 859, 864, 867, 869, 877, 885, 892, ! 896, 902, 907, 915, 922, 925, 928, 932, 935, 936, ! 938, 940, 943, 944, 946, 948, 952, 956, 959, 963, ! 966, 970, 973, 977, 980, 984, 987, 991, 994, 998, ! 1002, 1005, 1009, 1015, 1021, 1024, 1029, 1033, 1035, 1039, ! 1043, 1048, 1051, 1053, 1056, 1059, 1064, 1067, 1071, 1076, ! 1079, 1082, 1084, 1086, 1088, 1090, 1094, 1096, 1098, 1100, ! 1102, 1104, 1108, 1112, 1116, 1120, 1124, 1128, 1132, 1136, ! 1140, 1146, 1151, 1153, 1158, 1164, 1170, 1177, 1181, 1185, ! 1190, 1196, 1199, 1203, 1204, 1212, 1213, 1220, 1224, 1228, ! 1230, 1234, 1238, 1242, 1246, 1251, 1256, 1261, 1266, 1270, ! 1274, 1276, 1279, 1283, 1287, 1290, 1293, 1297, 1301, 1305, ! 1309, 1312, 1316, 1321, 1327, 1334, 1340, 1347, 1352, 1357, ! 1362, 1367, 1371, 1376, 1380, 1385, 1387, 1389, 1391, 1393, ! 1396, 1399, 1401, 1403, 1406, 1409, 1411, 1414, 1417, 1420, ! 1423, 1426, 1429, 1431, 1434, 1437, 1439, 1442, 1445, 1451, ! 1456, 1461, 1467, 1472, 1475, 1481, 1486, 1492, 1494, 1498, ! 1502, 1506, 1510, 1514, 1518, 1520, 1524, 1528, 1532, 1536, ! 1538, 1542, 1546, 1550, 1554, 1558, 1562, 1564, 1568, 1572, ! 1576, 1580, 1584, 1588, 1592, 1596, 1600, 1604, 1606, 1610, ! 1614, 1618, 1622, 1624, 1628, 1632, 1634, 1638, 1642, 1644, ! 1648, 1652, 1654, 1658, 1662, 1664, 1668, 1672, 1674, 1680, ! 1685, 1689, 1695, 1697, 1699, 1703, 1707, 1709, 1711, 1713, ! 1715, 1717, 1719 }; static const short yyrhs[] = { -1, --- 611,649 ---- 460, 467, 469, 471, 472, 477, 478, 484, 485, 491, 492, 499, 503, 508, 511, 515, 518, 522, 525, 529, 531, 534, 536, 538, 540, 542, 544, 547, 550, 553, ! 557, 561, 566, 568, 572, 576, 579, 583, 585, 587, ! 589, 592, 594, 596, 598, 601, 604, 608, 610, 612, ! 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, ! 634, 636, 638, 640, 642, 644, 646, 648, 650, 652, ! 654, 657, 660, 663, 666, 669, 672, 675, 678, 682, ! 687, 692, 698, 703, 709, 716, 724, 731, 733, 735, ! 737, 739, 741, 743, 745, 751, 754, 758, 763, 771, ! 779, 780, 784, 789, 792, 796, 802, 805, 809, 813, ! 818, 820, 823, 826, 828, 831, 835, 838, 841, 845, ! 848, 853, 856, 859, 863, 868, 871, 873, 881, 889, ! 896, 900, 906, 911, 919, 926, 929, 932, 936, 939, ! 940, 942, 944, 947, 948, 950, 952, 956, 960, 963, ! 967, 970, 974, 977, 981, 984, 988, 991, 995, 998, ! 1002, 1006, 1009, 1013, 1019, 1025, 1028, 1033, 1037, 1039, ! 1043, 1047, 1052, 1055, 1057, 1060, 1063, 1068, 1071, 1075, ! 1080, 1083, 1086, 1088, 1090, 1092, 1094, 1098, 1100, 1102, ! 1104, 1106, 1108, 1112, 1116, 1120, 1124, 1128, 1132, 1136, ! 1140, 1144, 1150, 1155, 1157, 1162, 1168, 1174, 1181, 1185, ! 1189, 1194, 1200, 1203, 1207, 1208, 1216, 1217, 1224, 1228, ! 1232, 1234, 1238, 1242, 1246, 1250, 1255, 1260, 1265, 1270, ! 1274, 1278, 1280, 1283, 1287, 1291, 1294, 1297, 1301, 1305, ! 1309, 1313, 1316, 1320, 1325, 1331, 1338, 1344, 1351, 1356, ! 1361, 1366, 1371, 1375, 1380, 1384, 1389, 1391, 1393, 1395, ! 1397, 1400, 1403, 1405, 1407, 1410, 1412, 1415, 1417, 1420, ! 1423, 1426, 1429, 1432, 1435, 1437, 1440, 1443, 1445, 1448, ! 1451, 1457, 1462, 1467, 1473, 1478, 1481, 1487, 1492, 1498, ! 1500, 1504, 1508, 1512, 1516, 1520, 1524, 1526, 1530, 1534, ! 1538, 1542, 1544, 1548, 1552, 1556, 1560, 1564, 1568, 1570, ! 1574, 1578, 1582, 1586, 1590, 1594, 1598, 1602, 1606, 1610, ! 1612, 1616, 1620, 1624, 1628, 1630, 1634, 1638, 1640, 1644, ! 1648, 1650, 1654, 1658, 1660, 1664, 1668, 1670, 1674, 1678, ! 1680, 1686, 1691, 1695, 1701, 1703, 1705, 1709, 1713, 1715, ! 1717, 1719, 1721, 1723, 1725 }; static const short yyrhs[] = { -1, *************** static const short yyrhs[] = { -1, *** 651,657 **** 100, 0, 56, 1, 0, 56, 121, 1, 0, 56, 121, 102, 5, 100, 0, 56, 121, 102, 1, 0, 56, 121, 102, 5, 1, 0, 134, 0, 169, 0, ! 192, 0, 1, 0, 44, 0, 133, 44, 0, 0, 133, 68, 124, 137, 138, 135, 140, 0, 0, 68, 124, 137, 138, 136, 140, 0, 133, 68, 1, 0, 68, 1, 0, 68, 124, 1, 0, 133, 68, 124, --- 660,666 ---- 100, 0, 56, 1, 0, 56, 121, 1, 0, 56, 121, 102, 5, 100, 0, 56, 121, 102, 1, 0, 56, 121, 102, 5, 1, 0, 134, 0, 169, 0, ! 192, 0, 1, 0, 45, 0, 133, 45, 0, 0, 133, 68, 124, 137, 138, 135, 140, 0, 0, 68, 124, 137, 138, 136, 140, 0, 133, 68, 1, 0, 68, 1, 0, 68, 124, 1, 0, 133, 68, 124, *************** static const short yyrhs[] = { -1, *** 666,672 **** 0, 147, 93, 148, 0, 147, 93, 1, 0, 147, 93, 148, 1, 0, 124, 0, 147, 98, 99, 0, 124, 1, 0, 147, 98, 1, 0, 147, 99, 1, ! 0, 271, 0, 180, 0, 0, 151, 150, 158, 0, 151, 1, 0, 114, 152, 156, 0, 60, 152, 156, 0, 133, 114, 152, 156, 0, 133, 60, 152, 156, 0, 114, 1, 0, 133, 114, 1, 0, 60, 1, --- 675,681 ---- 0, 147, 93, 148, 0, 147, 93, 1, 0, 147, 93, 148, 1, 0, 124, 0, 147, 98, 99, 0, 124, 1, 0, 147, 98, 1, 0, 147, 99, 1, ! 0, 272, 0, 180, 0, 0, 151, 150, 158, 0, 151, 1, 0, 114, 152, 156, 0, 60, 152, 156, 0, 133, 114, 152, 156, 0, 133, 60, 152, 156, 0, 114, 1, 0, 133, 114, 1, 0, 60, 1, *************** static const short yyrhs[] = { -1, *** 693,872 **** 0, 96, 97, 0, 96, 176, 97, 0, 177, 0, 176, 177, 0, 178, 0, 179, 0, 134, 0, 169, 0, 144, 0, 151, 100, 0, 151, 1, 0, 96, ! 97, 0, 96, 181, 97, 0, 96, 181, 101, 97, ! 0, 148, 0, 181, 101, 148, 0, 181, 101, 1, ! 0, 96, 97, 0, 183, 185, 184, 0, 96, 0, ! 97, 0, 186, 0, 185, 186, 0, 187, 0, 189, ! 0, 134, 0, 188, 100, 0, 114, 145, 0, 155, ! 114, 145, 0, 191, 0, 194, 0, 198, 0, 199, ! 0, 210, 0, 214, 0, 191, 0, 195, 0, 200, ! 0, 211, 0, 215, 0, 182, 0, 192, 0, 196, ! 0, 201, 0, 213, 0, 221, 0, 222, 0, 223, ! 0, 225, 0, 224, 0, 227, 0, 100, 0, 124, ! 89, 0, 193, 189, 0, 124, 1, 0, 193, 190, ! 0, 197, 100, 0, 1, 100, 0, 1, 96, 0, ! 1, 97, 0, 168, 94, 1, 0, 168, 94, 95, ! 1, 0, 168, 94, 240, 1, 0, 168, 94, 240, ! 95, 1, 0, 121, 102, 66, 1, 0, 121, 102, ! 66, 94, 1, 0, 121, 102, 66, 94, 240, 1, ! 0, 121, 102, 66, 94, 240, 95, 1, 0, 121, ! 102, 66, 94, 95, 1, 0, 268, 0, 252, 0, ! 253, 0, 249, 0, 250, 0, 246, 0, 235, 0, ! 49, 94, 271, 95, 189, 0, 49, 1, 0, 49, ! 94, 1, 0, 49, 94, 271, 1, 0, 49, 94, ! 271, 95, 190, 57, 189, 0, 49, 94, 271, 95, ! 190, 57, 190, 0, 0, 203, 202, 204, 0, 69, ! 94, 271, 95, 0, 69, 1, 0, 69, 94, 1, ! 0, 69, 94, 271, 95, 1, 0, 96, 97, 0, ! 96, 207, 97, 0, 96, 205, 97, 0, 96, 205, ! 207, 97, 0, 206, 0, 205, 206, 0, 207, 185, ! 0, 208, 0, 207, 208, 0, 63, 272, 89, 0, ! 48, 89, 0, 63, 1, 0, 63, 272, 1, 0, ! 48, 1, 0, 67, 94, 271, 95, 0, 209, 189, ! 0, 67, 1, 0, 67, 94, 1, 0, 67, 94, ! 271, 1, 0, 209, 190, 0, 52, 0, 212, 189, ! 67, 94, 271, 95, 100, 0, 217, 100, 271, 100, ! 219, 95, 189, 0, 217, 100, 100, 219, 95, 189, ! 0, 217, 100, 1, 0, 217, 100, 271, 100, 1, ! 0, 217, 100, 100, 1, 0, 217, 100, 271, 100, ! 219, 95, 190, 0, 217, 100, 100, 219, 95, 190, ! 0, 72, 94, 0, 72, 1, 0, 72, 94, 1, ! 0, 216, 218, 0, 0, 220, 0, 188, 0, 220, ! 1, 0, 0, 220, 0, 197, 0, 220, 101, 197, ! 0, 220, 101, 1, 0, 55, 100, 0, 55, 124, ! 100, 0, 55, 1, 0, 55, 124, 1, 0, 74, ! 100, 0, 74, 124, 100, 0, 74, 1, 0, 74, ! 124, 1, 0, 59, 100, 0, 59, 271, 100, 0, ! 59, 1, 0, 59, 271, 1, 0, 50, 271, 100, ! 0, 50, 1, 0, 50, 271, 1, 0, 226, 94, ! 271, 95, 182, 0, 226, 94, 271, 95, 1, 0, ! 226, 1, 0, 226, 94, 1, 95, 0, 226, 94, ! 1, 0, 133, 0, 71, 182, 228, 0, 71, 182, ! 231, 0, 71, 182, 228, 231, 0, 71, 1, 0, ! 229, 0, 228, 229, 0, 230, 182, 0, 61, 94, ! 154, 95, 0, 61, 1, 0, 61, 94, 1, 0, ! 61, 94, 1, 95, 0, 65, 182, 0, 65, 1, ! 0, 233, 0, 241, 0, 113, 0, 77, 0, 94, ! 271, 95, 0, 235, 0, 245, 0, 246, 0, 247, ! 0, 234, 0, 121, 102, 77, 0, 94, 271, 1, ! 0, 121, 102, 1, 0, 115, 102, 1, 0, 60, ! 102, 1, 0, 121, 102, 68, 0, 120, 102, 68, ! 0, 115, 102, 68, 0, 60, 102, 68, 0, 73, ! 118, 94, 240, 95, 0, 73, 118, 94, 95, 0, ! 236, 0, 239, 124, 94, 95, 0, 239, 124, 94, ! 95, 140, 0, 239, 124, 94, 240, 95, 0, 239, ! 124, 94, 240, 95, 140, 0, 73, 1, 100, 0, ! 73, 118, 1, 0, 73, 118, 94, 1, 0, 73, ! 118, 94, 240, 1, 0, 239, 1, 0, 239, 124, ! 1, 0, 0, 73, 118, 94, 240, 95, 237, 140, ! 0, 0, 73, 118, 94, 95, 238, 140, 0, 121, ! 102, 73, 0, 232, 102, 73, 0, 271, 0, 240, ! 101, 271, 0, 240, 101, 1, 0, 73, 115, 242, ! 0, 73, 117, 242, 0, 73, 115, 242, 244, 0, ! 73, 117, 242, 244, 0, 73, 117, 244, 180, 0, ! 73, 115, 244, 180, 0, 73, 1, 99, 0, 73, ! 1, 98, 0, 243, 0, 242, 243, 0, 98, 271, ! 99, 0, 98, 271, 1, 0, 98, 1, 0, 98, ! 99, 0, 244, 98, 99, 0, 244, 98, 1, 0, ! 232, 102, 124, 0, 66, 102, 124, 0, 66, 1, ! 0, 121, 94, 95, 0, 121, 94, 240, 95, 0, ! 232, 102, 124, 94, 95, 0, 232, 102, 124, 94, ! 240, 95, 0, 66, 102, 124, 94, 95, 0, 66, ! 102, 124, 94, 240, 95, 0, 66, 102, 1, 95, ! 0, 66, 102, 1, 102, 0, 121, 98, 271, 99, ! 0, 233, 98, 271, 99, 0, 121, 98, 1, 0, ! 121, 98, 271, 1, 0, 233, 98, 1, 0, 233, ! 98, 271, 1, 0, 232, 0, 121, 0, 249, 0, ! 250, 0, 248, 47, 0, 248, 46, 0, 252, 0, ! 253, 0, 3, 251, 0, 4, 251, 0, 254, 0, ! 3, 1, 0, 4, 1, 0, 47, 251, 0, 47, ! 1, 0, 46, 251, 0, 46, 1, 0, 248, 0, ! 90, 251, 0, 91, 251, 0, 255, 0, 90, 1, ! 0, 91, 1, 0, 94, 115, 244, 95, 251, 0, ! 94, 115, 95, 251, 0, 94, 271, 95, 254, 0, ! 94, 121, 244, 95, 254, 0, 94, 115, 98, 1, ! 0, 94, 1, 0, 94, 115, 244, 95, 1, 0, ! 94, 115, 95, 1, 0, 94, 121, 244, 95, 1, ! 0, 251, 0, 256, 5, 251, 0, 256, 6, 251, ! 0, 256, 7, 251, 0, 256, 5, 1, 0, 256, ! 6, 1, 0, 256, 7, 1, 0, 256, 0, 257, ! 3, 256, 0, 257, 4, 256, 0, 257, 3, 1, ! 0, 257, 4, 1, 0, 257, 0, 258, 8, 257, ! 0, 258, 9, 257, 0, 258, 10, 257, 0, 258, ! 8, 1, 0, 258, 9, 1, 0, 258, 10, 1, ! 0, 258, 0, 259, 20, 258, 0, 259, 18, 258, ! 0, 259, 21, 258, 0, 259, 19, 258, 0, 259, ! 58, 116, 0, 259, 20, 1, 0, 259, 18, 1, ! 0, 259, 21, 1, 0, 259, 19, 1, 0, 259, ! 58, 1, 0, 259, 0, 260, 16, 259, 0, 260, ! 17, 259, 0, 260, 16, 1, 0, 260, 17, 1, ! 0, 260, 0, 261, 11, 260, 0, 261, 11, 1, ! 0, 261, 0, 262, 12, 261, 0, 262, 12, 1, ! 0, 262, 0, 263, 13, 262, 0, 263, 13, 1, ! 0, 263, 0, 264, 14, 263, 0, 264, 14, 1, ! 0, 264, 0, 265, 15, 264, 0, 265, 15, 1, ! 0, 265, 0, 265, 88, 271, 89, 266, 0, 265, ! 88, 89, 1, 0, 265, 88, 1, 0, 265, 88, ! 271, 89, 1, 0, 266, 0, 268, 0, 269, 270, ! 267, 0, 269, 270, 1, 0, 121, 0, 245, 0, ! 247, 0, 92, 0, 93, 0, 267, 0, 271, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, ! 597, 622, 626, 628, 629, 630, 631, 632, 636, 638, ! 641, 643, 644, 647, 649, 652, 656, 660, 664, 673, ! 684, 686, 689, 693, 698, 703, 705, 706, 707, 708, ! 709, 710, 711, 714, 719, 725, 727, 730, 736, 738, ! 742, 744, 747, 774, 776, 780, 793, 795, 799, 802, ! 804, 805, 815, 820, 835, 839, 839, 842, 842, 844, ! 846, 851, 855, 857, 859, 861, 865, 867, 869, 876, ! 882, 887, 891, 900, 910, 912, 915, 917, 918, 919, ! 926, 928, 929, 931, 933, 937, 940, 950, 953, 955, ! 959, 962, 969, 975, 983, 985, 987, 989, 999, 1003, ! 1005, 1009, 1020, 1021, 1025, 1028, 1030, 1032, 1034, 1039, ! 1041, 1043, 1045, 1052, 1058, 1060, 1069, 1071, 1075, 1080, ! 1085, 1089, 1094, 1099, 1104, 1111, 1121, 1123, 1125, 1129, ! 1132, 1134, 1138, 1140, 1144, 1153, 1169, 1176, 1179, 1182, ! 1186, 1192, 1196, 1205, 1207, 1209, 1213, 1218, 1225, 1233, ! 1235, 1239, 1246, 1256, 1260, 1260, 1263, 1263, 1266, 1266, ! 1269, 1269, 1271, 1275, 1281, 1286, 1288, 1292, 1295, 1299, ! 1301, 1304, 1306, 1307, 1309, 1313, 1317, 1323, 1328, 1331, ! 1333, 1337, 1343, 1347, 1352, 1361, 1365, 1370, 1384, 1386, ! 1389, 1391, 1393, 1400, 1404, 1407, 1411, 1413, 1414, 1415, ! 1416, 1417, 1421, 1423, 1424, 1425, 1426, 1430, 1432, 1433, ! 1434, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1444, 1456, ! 1467, 1470, 1474, 1481, 1491, 1496, 1501, 1506, 1508, 1513, ! 1515, 1520, 1522, 1524, 1526, 1528, 1532, 1534, 1535, 1536, ! 1537, 1538, 1539, 1542, 1548, 1550, 1552, 1556, 1561, 1566, ! 1572, 1582, 1588, 1590, 1592, 1599, 1602, 1604, 1606, 1610, ! 1612, 1615, 1619, 1621, 1624, 1631, 1637, 1639, 1641, 1645, ! 1653, 1656, 1658, 1660, 1664, 1669, 1678, 1683, 1690, 1697, ! 1699, 1701, 1705, 1708, 1717, 1724, 1726, 1730, 1743, 1745, ! 1751, 1757, 1761, 1763, 1767, 1770, 1772, 1776, 1779, 1781, ! 1783, 1787, 1790, 1792, 1794, 1798, 1801, 1803, 1805, 1809, ! 1815, 1817, 1821, 1828, 1830, 1832, 1834, 1838, 1850, 1853, ! 1855, 1860, 1864, 1866, 1873, 1881, 1898, 1900, 1905, 1909, ! 1912, 1917, 1919, 1922, 1924, 1926, 1928, 1929, 1930, 1931, ! 1932, 1936, 1941, 1943, 1945, 1947, 1951, 1954, 1956, 1958, ! 1965, 1968, 1970, 1974, 1980, 1981, 1987, 1988, 1990, 1992, ! 1994, 1996, 1998, 2007, 2011, 2041, 2044, 2058, 2061, 2065, ! 2071, 2076, 2080, 2083, 2085, 2087, 2091, 2101, 2110, 2112, ! 2116, 2119, 2123, 2134, 2136, 2144, 2171, 2173, 2177, 2182, ! 2188, 2192, 2195, 2197, 2208, 2219, 2224, 2233, 2235, 2239, ! 2242, 2244, 2249, 2254, 2259, 2266, 2268, 2269, 2270, 2273, ! 2278, 2283, 2285, 2286, 2288, 2290, 2291, 2293, 2297, 2300, ! 2304, 2307, 2311, 2313, 2315, 2317, 2318, 2320, 2324, 2333, ! 2335, 2337, 2350, 2352, 2357, 2359, 2361, 2365, 2367, 2372, ! 2377, 2382, 2384, 2386, 2390, 2392, 2397, 2402, 2404, 2408, ! 2410, 2415, 2420, 2425, 2427, 2429, 2433, 2435, 2440, 2445, ! 2450, 2455, 2457, 2459, 2461, 2463, 2465, 2469, 2471, 2476, ! 2481, 2483, 2487, 2489, 2494, 2498, 2500, 2505, 2509, 2511, ! 2516, 2520, 2522, 2527, 2531, 2533, 2538, 2542, 2544, 2549, ! 2555, 2557, 2561, 2563, 2566, 2569, 2576, 2578, 2579, 2582, ! 2584, 2587, 2591 }; #endif --- 702,882 ---- 0, 96, 97, 0, 96, 176, 97, 0, 177, 0, 176, 177, 0, 178, 0, 179, 0, 134, 0, 169, 0, 144, 0, 151, 100, 0, 151, 1, 0, 96, ! 97, 0, 96, 101, 97, 0, 96, 181, 97, 0, ! 96, 181, 101, 97, 0, 148, 0, 181, 101, 148, ! 0, 181, 101, 1, 0, 96, 97, 0, 183, 185, ! 184, 0, 96, 0, 97, 0, 186, 0, 185, 186, ! 0, 187, 0, 189, 0, 134, 0, 188, 100, 0, ! 114, 145, 0, 155, 114, 145, 0, 191, 0, 194, ! 0, 198, 0, 199, 0, 210, 0, 214, 0, 191, ! 0, 195, 0, 200, 0, 211, 0, 215, 0, 182, ! 0, 192, 0, 196, 0, 201, 0, 213, 0, 221, ! 0, 222, 0, 223, 0, 225, 0, 224, 0, 227, ! 0, 100, 0, 124, 89, 0, 193, 189, 0, 124, ! 1, 0, 193, 190, 0, 197, 100, 0, 1, 100, ! 0, 1, 96, 0, 1, 97, 0, 168, 94, 1, ! 0, 168, 94, 95, 1, 0, 168, 94, 240, 1, ! 0, 168, 94, 240, 95, 1, 0, 121, 102, 66, ! 1, 0, 121, 102, 66, 94, 1, 0, 121, 102, ! 66, 94, 240, 1, 0, 121, 102, 66, 94, 240, ! 95, 1, 0, 121, 102, 66, 94, 95, 1, 0, ! 269, 0, 253, 0, 254, 0, 249, 0, 250, 0, ! 246, 0, 235, 0, 49, 94, 272, 95, 189, 0, ! 49, 1, 0, 49, 94, 1, 0, 49, 94, 272, ! 1, 0, 49, 94, 272, 95, 190, 57, 189, 0, ! 49, 94, 272, 95, 190, 57, 190, 0, 0, 203, ! 202, 204, 0, 69, 94, 272, 95, 0, 69, 1, ! 0, 69, 94, 1, 0, 69, 94, 272, 95, 1, ! 0, 96, 97, 0, 96, 207, 97, 0, 96, 205, ! 97, 0, 96, 205, 207, 97, 0, 206, 0, 205, ! 206, 0, 207, 185, 0, 208, 0, 207, 208, 0, ! 63, 273, 89, 0, 48, 89, 0, 63, 1, 0, ! 63, 273, 1, 0, 48, 1, 0, 67, 94, 272, ! 95, 0, 209, 189, 0, 67, 1, 0, 67, 94, ! 1, 0, 67, 94, 272, 1, 0, 209, 190, 0, ! 52, 0, 212, 189, 67, 94, 272, 95, 100, 0, ! 217, 100, 272, 100, 219, 95, 189, 0, 217, 100, ! 100, 219, 95, 189, 0, 217, 100, 1, 0, 217, ! 100, 272, 100, 1, 0, 217, 100, 100, 1, 0, ! 217, 100, 272, 100, 219, 95, 190, 0, 217, 100, ! 100, 219, 95, 190, 0, 72, 94, 0, 72, 1, ! 0, 72, 94, 1, 0, 216, 218, 0, 0, 220, ! 0, 188, 0, 220, 1, 0, 0, 220, 0, 197, ! 0, 220, 101, 197, 0, 220, 101, 1, 0, 55, ! 100, 0, 55, 124, 100, 0, 55, 1, 0, 55, ! 124, 1, 0, 74, 100, 0, 74, 124, 100, 0, ! 74, 1, 0, 74, 124, 1, 0, 59, 100, 0, ! 59, 272, 100, 0, 59, 1, 0, 59, 272, 1, ! 0, 50, 272, 100, 0, 50, 1, 0, 50, 272, ! 1, 0, 226, 94, 272, 95, 182, 0, 226, 94, ! 272, 95, 1, 0, 226, 1, 0, 226, 94, 1, ! 95, 0, 226, 94, 1, 0, 133, 0, 71, 182, ! 228, 0, 71, 182, 231, 0, 71, 182, 228, 231, ! 0, 71, 1, 0, 229, 0, 228, 229, 0, 230, ! 182, 0, 61, 94, 154, 95, 0, 61, 1, 0, ! 61, 94, 1, 0, 61, 94, 1, 95, 0, 65, ! 182, 0, 65, 1, 0, 233, 0, 241, 0, 113, ! 0, 77, 0, 94, 272, 95, 0, 235, 0, 245, ! 0, 246, 0, 247, 0, 234, 0, 121, 102, 77, ! 0, 94, 272, 1, 0, 121, 102, 1, 0, 115, ! 102, 1, 0, 60, 102, 1, 0, 121, 102, 68, ! 0, 120, 102, 68, 0, 115, 102, 68, 0, 60, ! 102, 68, 0, 73, 118, 94, 240, 95, 0, 73, ! 118, 94, 95, 0, 236, 0, 239, 124, 94, 95, ! 0, 239, 124, 94, 95, 140, 0, 239, 124, 94, ! 240, 95, 0, 239, 124, 94, 240, 95, 140, 0, ! 73, 1, 100, 0, 73, 118, 1, 0, 73, 118, ! 94, 1, 0, 73, 118, 94, 240, 1, 0, 239, ! 1, 0, 239, 124, 1, 0, 0, 73, 118, 94, ! 240, 95, 237, 140, 0, 0, 73, 118, 94, 95, ! 238, 140, 0, 121, 102, 73, 0, 232, 102, 73, ! 0, 272, 0, 240, 101, 272, 0, 240, 101, 1, ! 0, 73, 115, 242, 0, 73, 117, 242, 0, 73, ! 115, 242, 244, 0, 73, 117, 242, 244, 0, 73, ! 117, 244, 180, 0, 73, 115, 244, 180, 0, 73, ! 1, 99, 0, 73, 1, 98, 0, 243, 0, 242, ! 243, 0, 98, 272, 99, 0, 98, 272, 1, 0, ! 98, 1, 0, 98, 99, 0, 244, 98, 99, 0, ! 244, 98, 1, 0, 232, 102, 124, 0, 66, 102, ! 124, 0, 66, 1, 0, 121, 94, 95, 0, 121, ! 94, 240, 95, 0, 232, 102, 124, 94, 95, 0, ! 232, 102, 124, 94, 240, 95, 0, 66, 102, 124, ! 94, 95, 0, 66, 102, 124, 94, 240, 95, 0, ! 66, 102, 1, 95, 0, 66, 102, 1, 102, 0, ! 121, 98, 272, 99, 0, 233, 98, 272, 99, 0, ! 121, 98, 1, 0, 121, 98, 272, 1, 0, 233, ! 98, 1, 0, 233, 98, 272, 1, 0, 232, 0, ! 121, 0, 249, 0, 250, 0, 248, 47, 0, 248, ! 46, 0, 253, 0, 254, 0, 3, 252, 0, 255, ! 0, 3, 1, 0, 251, 0, 4, 251, 0, 4, ! 1, 0, 47, 252, 0, 47, 1, 0, 46, 252, ! 0, 46, 1, 0, 248, 0, 90, 252, 0, 91, ! 252, 0, 256, 0, 90, 1, 0, 91, 1, 0, ! 94, 115, 244, 95, 252, 0, 94, 115, 95, 252, ! 0, 94, 272, 95, 255, 0, 94, 121, 244, 95, ! 255, 0, 94, 115, 98, 1, 0, 94, 1, 0, ! 94, 115, 244, 95, 1, 0, 94, 115, 95, 1, ! 0, 94, 121, 244, 95, 1, 0, 252, 0, 257, ! 5, 252, 0, 257, 6, 252, 0, 257, 7, 252, ! 0, 257, 5, 1, 0, 257, 6, 1, 0, 257, ! 7, 1, 0, 257, 0, 258, 3, 257, 0, 258, ! 4, 257, 0, 258, 3, 1, 0, 258, 4, 1, ! 0, 258, 0, 259, 8, 258, 0, 259, 9, 258, ! 0, 259, 10, 258, 0, 259, 8, 1, 0, 259, ! 9, 1, 0, 259, 10, 1, 0, 259, 0, 260, ! 20, 259, 0, 260, 18, 259, 0, 260, 21, 259, ! 0, 260, 19, 259, 0, 260, 58, 116, 0, 260, ! 20, 1, 0, 260, 18, 1, 0, 260, 21, 1, ! 0, 260, 19, 1, 0, 260, 58, 1, 0, 260, ! 0, 261, 16, 260, 0, 261, 17, 260, 0, 261, ! 16, 1, 0, 261, 17, 1, 0, 261, 0, 262, ! 11, 261, 0, 262, 11, 1, 0, 262, 0, 263, ! 12, 262, 0, 263, 12, 1, 0, 263, 0, 264, ! 13, 263, 0, 264, 13, 1, 0, 264, 0, 265, ! 14, 264, 0, 265, 14, 1, 0, 265, 0, 266, ! 15, 265, 0, 266, 15, 1, 0, 266, 0, 266, ! 88, 272, 89, 267, 0, 266, 88, 89, 1, 0, ! 266, 88, 1, 0, 266, 88, 272, 89, 1, 0, ! 267, 0, 269, 0, 270, 271, 268, 0, 270, 271, ! 1, 0, 121, 0, 245, 0, 247, 0, 92, 0, ! 93, 0, 268, 0, 272, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, ! 606, 632, 636, 638, 639, 640, 641, 642, 646, 648, ! 651, 653, 654, 657, 659, 662, 666, 670, 674, 683, ! 694, 696, 699, 703, 708, 713, 715, 716, 717, 718, ! 719, 720, 721, 724, 729, 735, 737, 740, 746, 748, ! 752, 754, 757, 784, 786, 790, 809, 811, 815, 818, ! 820, 821, 831, 836, 851, 855, 855, 858, 858, 860, ! 862, 867, 871, 873, 875, 877, 881, 883, 885, 892, ! 898, 903, 907, 916, 926, 928, 931, 933, 934, 935, ! 945, 947, 948, 950, 952, 956, 959, 969, 972, 974, ! 978, 981, 988, 994, 1002, 1004, 1006, 1008, 1018, 1022, ! 1024, 1028, 1039, 1040, 1044, 1047, 1049, 1051, 1053, 1058, ! 1060, 1062, 1064, 1071, 1077, 1079, 1088, 1090, 1094, 1099, ! 1104, 1108, 1113, 1118, 1123, 1130, 1140, 1142, 1144, 1148, ! 1151, 1153, 1157, 1159, 1163, 1172, 1188, 1195, 1198, 1201, ! 1205, 1211, 1215, 1224, 1226, 1228, 1232, 1237, 1244, 1252, ! 1254, 1258, 1265, 1275, 1279, 1279, 1282, 1282, 1285, 1285, ! 1288, 1288, 1290, 1294, 1300, 1305, 1307, 1311, 1314, 1318, ! 1320, 1323, 1325, 1326, 1328, 1332, 1336, 1342, 1347, 1350, ! 1352, 1354, 1358, 1364, 1368, 1373, 1382, 1386, 1391, 1405, ! 1407, 1410, 1412, 1414, 1421, 1425, 1428, 1432, 1434, 1435, ! 1436, 1437, 1438, 1442, 1444, 1445, 1446, 1447, 1451, 1453, ! 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, 1462, 1465, ! 1483, 1494, 1497, 1501, 1508, 1518, 1523, 1528, 1533, 1535, ! 1540, 1542, 1547, 1549, 1551, 1553, 1555, 1559, 1561, 1562, ! 1563, 1564, 1565, 1566, 1569, 1575, 1577, 1579, 1583, 1588, ! 1593, 1599, 1609, 1615, 1617, 1619, 1626, 1629, 1631, 1633, ! 1637, 1639, 1642, 1646, 1648, 1651, 1658, 1664, 1666, 1668, ! 1672, 1680, 1683, 1685, 1687, 1691, 1696, 1705, 1710, 1717, ! 1724, 1726, 1728, 1732, 1735, 1744, 1751, 1753, 1757, 1770, ! 1772, 1778, 1784, 1788, 1790, 1794, 1797, 1799, 1803, 1806, ! 1808, 1810, 1814, 1817, 1819, 1821, 1825, 1828, 1830, 1832, ! 1836, 1842, 1844, 1848, 1855, 1857, 1859, 1861, 1865, 1877, ! 1880, 1882, 1887, 1891, 1893, 1900, 1908, 1925, 1927, 1932, ! 1936, 1939, 1944, 1946, 1949, 1951, 1953, 1955, 1956, 1957, ! 1958, 1959, 1963, 1968, 1970, 1972, 1974, 1978, 1981, 1983, ! 1985, 1992, 1995, 1997, 2001, 2007, 2008, 2014, 2015, 2017, ! 2019, 2021, 2023, 2025, 2034, 2038, 2068, 2071, 2085, 2088, ! 2092, 2098, 2103, 2107, 2110, 2112, 2114, 2118, 2129, 2138, ! 2140, 2144, 2147, 2151, 2162, 2164, 2172, 2199, 2201, 2205, ! 2210, 2216, 2220, 2223, 2225, 2236, 2247, 2252, 2261, 2263, ! 2267, 2270, 2272, 2277, 2282, 2287, 2294, 2296, 2297, 2298, ! 2301, 2306, 2311, 2313, 2314, 2316, 2317, 2321, 2327, 2329, ! 2333, 2336, 2340, 2343, 2347, 2349, 2351, 2353, 2354, 2356, ! 2360, 2369, 2371, 2373, 2387, 2389, 2394, 2396, 2398, 2402, ! 2404, 2409, 2414, 2419, 2421, 2423, 2427, 2429, 2434, 2439, ! 2441, 2445, 2447, 2452, 2457, 2462, 2464, 2466, 2470, 2472, ! 2477, 2482, 2487, 2492, 2494, 2496, 2498, 2500, 2502, 2506, ! 2508, 2513, 2518, 2520, 2524, 2526, 2531, 2535, 2537, 2542, ! 2546, 2548, 2553, 2557, 2559, 2564, 2568, 2570, 2575, 2579, ! 2581, 2586, 2592, 2594, 2598, 2600, 2603, 2606, 2613, 2615, ! 2616, 2619, 2621, 2624, 2628 }; #endif *************** static const char * const yytname[] = { *** 880,886 **** "REM_ASSIGN_TK","LS_ASSIGN_TK","SRS_ASSIGN_TK","ZRS_ASSIGN_TK","AND_ASSIGN_TK", "XOR_ASSIGN_TK","OR_ASSIGN_TK","PUBLIC_TK","PRIVATE_TK","PROTECTED_TK","STATIC_TK", "FINAL_TK","SYNCHRONIZED_TK","VOLATILE_TK","TRANSIENT_TK","NATIVE_TK","PAD_TK", ! "ABSTRACT_TK","MODIFIER_TK","STRICT_TK","DECR_TK","INCR_TK","DEFAULT_TK","IF_TK", "THROW_TK","BOOLEAN_TK","DO_TK","IMPLEMENTS_TK","THROWS_TK","BREAK_TK","IMPORT_TK", "ELSE_TK","INSTANCEOF_TK","RETURN_TK","VOID_TK","CATCH_TK","INTERFACE_TK","CASE_TK", "EXTENDS_TK","FINALLY_TK","SUPER_TK","WHILE_TK","CLASS_TK","SWITCH_TK","CONST_TK", --- 890,896 ---- "REM_ASSIGN_TK","LS_ASSIGN_TK","SRS_ASSIGN_TK","ZRS_ASSIGN_TK","AND_ASSIGN_TK", "XOR_ASSIGN_TK","OR_ASSIGN_TK","PUBLIC_TK","PRIVATE_TK","PROTECTED_TK","STATIC_TK", "FINAL_TK","SYNCHRONIZED_TK","VOLATILE_TK","TRANSIENT_TK","NATIVE_TK","PAD_TK", ! "ABSTRACT_TK","STRICT_TK","MODIFIER_TK","DECR_TK","INCR_TK","DEFAULT_TK","IF_TK", "THROW_TK","BOOLEAN_TK","DO_TK","IMPLEMENTS_TK","THROWS_TK","BREAK_TK","IMPORT_TK", "ELSE_TK","INSTANCEOF_TK","RETURN_TK","VOID_TK","CATCH_TK","INTERFACE_TK","CASE_TK", "EXTENDS_TK","FINALLY_TK","SUPER_TK","WHILE_TK","CLASS_TK","SWITCH_TK","CONST_TK", *************** static const char * const yytname[] = { *** 919,930 **** "@11","@12","something_dot_new","argument_list","array_creation_expression", "dim_exprs","dim_expr","dims","field_access","method_invocation","array_access", "postfix_expression","post_increment_expression","post_decrement_expression", ! "unary_expression","pre_increment_expression","pre_decrement_expression","unary_expression_not_plus_minus", ! "cast_expression","multiplicative_expression","additive_expression","shift_expression", ! "relational_expression","equality_expression","and_expression","exclusive_or_expression", ! "inclusive_or_expression","conditional_and_expression","conditional_or_expression", ! "conditional_expression","assignment_expression","assignment","left_hand_side", ! "assignment_operator","expression","constant_expression", NULL }; #endif --- 929,940 ---- "@11","@12","something_dot_new","argument_list","array_creation_expression", "dim_exprs","dim_expr","dims","field_access","method_invocation","array_access", "postfix_expression","post_increment_expression","post_decrement_expression", ! "trap_overflow_corner_case","unary_expression","pre_increment_expression","pre_decrement_expression", ! "unary_expression_not_plus_minus","cast_expression","multiplicative_expression", ! "additive_expression","shift_expression","relational_expression","equality_expression", ! "and_expression","exclusive_or_expression","inclusive_or_expression","conditional_and_expression", ! "conditional_or_expression","conditional_expression","assignment_expression", ! "assignment","left_hand_side","assignment_operator","expression","constant_expression", NULL }; #endif *************** static const short yyr1[] = { 0, *** 947,985 **** 167, 168, 168, 170, 169, 171, 169, 172, 169, 173, 169, 169, 169, 174, 174, 174, 174, 175, 175, 176, 176, 177, 177, 177, 177, 178, 179, 179, 180, 180, ! 180, 181, 181, 181, 182, 182, 183, 184, 185, 185, ! 186, 186, 186, 187, 188, 188, 189, 189, 189, 189, ! 189, 189, 190, 190, 190, 190, 190, 191, 191, 191, ! 191, 191, 191, 191, 191, 191, 191, 191, 192, 193, ! 194, 194, 195, 196, 196, 196, 196, 196, 196, 196, ! 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, ! 197, 197, 197, 198, 198, 198, 198, 199, 200, 202, ! 201, 203, 203, 203, 203, 204, 204, 204, 204, 205, ! 205, 206, 207, 207, 208, 208, 208, 208, 208, 209, ! 210, 210, 210, 210, 211, 212, 213, 214, 214, 214, ! 214, 214, 215, 215, 216, 216, 216, 217, 218, 218, ! 218, 218, 219, 219, 220, 220, 220, 221, 221, 221, ! 221, 222, 222, 222, 222, 223, 223, 223, 223, 224, ! 224, 224, 225, 225, 225, 225, 225, 226, 227, 227, ! 227, 227, 228, 228, 229, 230, 230, 230, 230, 231, ! 231, 232, 232, 233, 233, 233, 233, 233, 233, 233, ! 233, 233, 233, 233, 233, 233, 234, 234, 234, 234, ! 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, ! 235, 235, 235, 237, 236, 238, 236, 239, 239, 240, ! 240, 240, 241, 241, 241, 241, 241, 241, 241, 241, ! 242, 242, 243, 243, 243, 244, 244, 244, 245, 245, ! 245, 246, 246, 246, 246, 246, 246, 246, 246, 247, ! 247, 247, 247, 247, 247, 248, 248, 248, 248, 249, ! 250, 251, 251, 251, 251, 251, 251, 251, 252, 252, ! 253, 253, 254, 254, 254, 254, 254, 254, 255, 255, ! 255, 255, 255, 255, 255, 255, 255, 256, 256, 256, ! 256, 256, 256, 256, 257, 257, 257, 257, 257, 258, ! 258, 258, 258, 258, 258, 258, 259, 259, 259, 259, ! 259, 259, 259, 259, 259, 259, 259, 260, 260, 260, ! 260, 260, 261, 261, 261, 262, 262, 262, 263, 263, ! 263, 264, 264, 264, 265, 265, 265, 266, 266, 266, ! 266, 266, 267, 267, 268, 268, 269, 269, 269, 270, ! 270, 271, 272 }; static const short yyr2[] = { 0, --- 957,995 ---- 167, 168, 168, 170, 169, 171, 169, 172, 169, 173, 169, 169, 169, 174, 174, 174, 174, 175, 175, 176, 176, 177, 177, 177, 177, 178, 179, 179, 180, 180, ! 180, 180, 181, 181, 181, 182, 182, 183, 184, 185, ! 185, 186, 186, 186, 187, 188, 188, 189, 189, 189, ! 189, 189, 189, 190, 190, 190, 190, 190, 191, 191, ! 191, 191, 191, 191, 191, 191, 191, 191, 191, 192, ! 193, 194, 194, 195, 196, 196, 196, 196, 196, 196, ! 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, ! 197, 197, 197, 197, 198, 198, 198, 198, 199, 200, ! 202, 201, 203, 203, 203, 203, 204, 204, 204, 204, ! 205, 205, 206, 207, 207, 208, 208, 208, 208, 208, ! 209, 210, 210, 210, 210, 211, 212, 213, 214, 214, ! 214, 214, 214, 215, 215, 216, 216, 216, 217, 218, ! 218, 218, 218, 219, 219, 220, 220, 220, 221, 221, ! 221, 221, 222, 222, 222, 222, 223, 223, 223, 223, ! 224, 224, 224, 225, 225, 225, 225, 225, 226, 227, ! 227, 227, 227, 228, 228, 229, 230, 230, 230, 230, ! 231, 231, 232, 232, 233, 233, 233, 233, 233, 233, ! 233, 233, 233, 233, 233, 233, 233, 234, 234, 234, ! 234, 235, 235, 235, 235, 235, 235, 235, 235, 235, ! 235, 235, 235, 235, 237, 236, 238, 236, 239, 239, ! 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, ! 241, 242, 242, 243, 243, 243, 244, 244, 244, 245, ! 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, ! 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, ! 249, 250, 251, 251, 251, 251, 251, 252, 252, 252, ! 253, 253, 254, 254, 255, 255, 255, 255, 255, 255, ! 256, 256, 256, 256, 256, 256, 256, 256, 256, 257, ! 257, 257, 257, 257, 257, 257, 258, 258, 258, 258, ! 258, 259, 259, 259, 259, 259, 259, 259, 260, 260, ! 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, ! 261, 261, 261, 261, 262, 262, 262, 263, 263, 263, ! 264, 264, 264, 265, 265, 265, 266, 266, 266, 267, ! 267, 267, 267, 267, 268, 268, 269, 269, 270, 270, ! 270, 271, 271, 272, 273 }; static const short yyr2[] = { 0, *************** static const short yyr2[] = { 0, *** 1001,1043 **** 6, 1, 1, 0, 4, 0, 5, 0, 5, 0, 6, 3, 4, 2, 3, 2, 3, 2, 3, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 3, ! 4, 1, 3, 3, 2, 3, 1, 1, 1, 2, ! 1, 1, 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ! 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, ! 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, ! 5, 4, 5, 6, 7, 6, 1, 1, 1, 1, ! 1, 1, 1, 5, 2, 3, 4, 7, 7, 0, ! 3, 4, 2, 3, 5, 2, 3, 3, 4, 1, ! 2, 2, 1, 2, 3, 2, 2, 3, 2, 4, ! 2, 2, 3, 4, 2, 1, 7, 7, 6, 3, ! 5, 4, 7, 6, 2, 2, 3, 2, 0, 1, ! 1, 2, 0, 1, 1, 3, 3, 2, 3, 2, ! 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, ! 2, 3, 5, 5, 2, 4, 3, 1, 3, 3, ! 4, 2, 1, 2, 2, 4, 2, 3, 4, 2, ! 2, 1, 1, 1, 1, 3, 1, 1, 1, 1, ! 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, ! 5, 4, 1, 4, 5, 5, 6, 3, 3, 4, ! 5, 2, 3, 0, 7, 0, 6, 3, 3, 1, ! 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, ! 1, 2, 3, 3, 2, 2, 3, 3, 3, 3, ! 2, 3, 4, 5, 6, 5, 6, 4, 4, 4, ! 4, 3, 4, 3, 4, 1, 1, 1, 1, 2, ! 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, ! 2, 2, 1, 2, 2, 1, 2, 2, 5, 4, ! 4, 5, 4, 2, 5, 4, 5, 1, 3, 3, ! 3, 3, 3, 3, 1, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, ! 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, ! 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, ! 3, 1, 3, 3, 1, 3, 3, 1, 5, 4, ! 3, 5, 1, 1, 3, 3, 1, 1, 1, 1, ! 1, 1, 1 }; static const short yydefact[] = { 1, ! 0, 52, 53, 0, 0, 0, 0, 219, 2, 0, 0, 0, 34, 41, 42, 36, 0, 49, 50, 51, 44, 25, 0, 21, 22, 23, 0, 60, 0, 39, 0, 0, 35, 37, 0, 0, 54, 0, 0, 45, --- 1011,1053 ---- 6, 1, 1, 0, 4, 0, 5, 0, 5, 0, 6, 3, 4, 2, 3, 2, 3, 2, 3, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 3, ! 3, 4, 1, 3, 3, 2, 3, 1, 1, 1, ! 2, 1, 1, 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ! 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ! 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, ! 4, 5, 4, 5, 6, 7, 6, 1, 1, 1, ! 1, 1, 1, 1, 5, 2, 3, 4, 7, 7, ! 0, 3, 4, 2, 3, 5, 2, 3, 3, 4, ! 1, 2, 2, 1, 2, 3, 2, 2, 3, 2, ! 4, 2, 2, 3, 4, 2, 1, 7, 7, 6, ! 3, 5, 4, 7, 6, 2, 2, 3, 2, 0, ! 1, 1, 2, 0, 1, 1, 3, 3, 2, 3, ! 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, ! 3, 2, 3, 5, 5, 2, 4, 3, 1, 3, ! 3, 4, 2, 1, 2, 2, 4, 2, 3, 4, ! 2, 2, 1, 1, 1, 1, 3, 1, 1, 1, ! 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, ! 3, 5, 4, 1, 4, 5, 5, 6, 3, 3, ! 4, 5, 2, 3, 0, 7, 0, 6, 3, 3, ! 1, 3, 3, 3, 3, 4, 4, 4, 4, 3, ! 3, 1, 2, 3, 3, 2, 2, 3, 3, 3, ! 3, 2, 3, 4, 5, 6, 5, 6, 4, 4, ! 4, 4, 3, 4, 3, 4, 1, 1, 1, 1, ! 2, 2, 1, 1, 2, 1, 2, 1, 2, 2, ! 2, 2, 2, 2, 1, 2, 2, 1, 2, 2, ! 5, 4, 4, 5, 4, 2, 5, 4, 5, 1, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, ! 3, 1, 3, 3, 3, 3, 3, 3, 1, 3, ! 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, ! 3, 3, 3, 3, 1, 3, 3, 1, 3, 3, ! 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, ! 5, 4, 3, 5, 1, 1, 3, 3, 1, 1, ! 1, 1, 1, 1, 1 }; static const short yydefact[] = { 1, ! 0, 52, 53, 0, 0, 0, 0, 220, 2, 0, 0, 0, 34, 41, 42, 36, 0, 49, 50, 51, 44, 25, 0, 21, 22, 23, 0, 60, 0, 39, 0, 0, 35, 37, 0, 0, 54, 0, 0, 45, *************** static const short yydefact[] = { 1, *** 1051,2021 **** 111, 0, 127, 109, 0, 0, 88, 91, 127, 0, 19, 20, 113, 0, 0, 178, 177, 169, 171, 0, 0, 58, 161, 0, 0, 0, 0, 106, 97, 86, ! 0, 0, 0, 0, 105, 386, 0, 112, 127, 110, ! 0, 127, 72, 71, 187, 73, 21, 0, 83, 0, 75, 77, 81, 82, 0, 78, 0, 79, 137, 127, 84, 80, 0, 85, 56, 117, 114, 0, 126, 0, 119, 0, 129, 130, 128, 118, 116, 90, 0, 89, ! 93, 0, 0, 0, 0, 0, 0, 0, 335, 0, ! 0, 0, 0, 7, 6, 3, 4, 5, 8, 334, ! 0, 0, 407, 0, 101, 406, 332, 341, 337, 353, ! 0, 333, 338, 339, 340, 423, 408, 409, 438, 412, ! 413, 416, 426, 445, 450, 457, 468, 473, 476, 479, ! 482, 485, 488, 493, 502, 494, 0, 100, 98, 96, ! 99, 388, 387, 108, 87, 107, 185, 0, 127, 74, ! 76, 104, 0, 135, 0, 139, 0, 0, 0, 276, ! 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, ! 0, 9, 15, 407, 0, 126, 193, 0, 0, 208, ! 0, 189, 191, 0, 192, 197, 209, 0, 198, 210, ! 0, 199, 200, 211, 250, 0, 201, 0, 212, 202, ! 289, 0, 213, 214, 215, 217, 216, 0, 218, 243, ! 242, 0, 240, 241, 238, 239, 237, 124, 122, 115, ! 0, 0, 0, 417, 407, 338, 340, 414, 418, 415, ! 422, 421, 420, 419, 0, 391, 0, 0, 0, 17, ! 0, 427, 424, 428, 425, 434, 0, 407, 0, 179, ! 182, 0, 0, 0, 0, 0, 0, 94, 0, 0, ! 362, 0, 411, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 500, 501, 0, 141, 0, ! 140, 134, 103, 133, 187, 138, 0, 226, 227, 225, ! 245, 0, 311, 0, 300, 298, 0, 308, 306, 0, ! 272, 0, 253, 0, 322, 0, 286, 0, 304, 302, ! 0, 0, 195, 0, 222, 220, 0, 0, 188, 186, ! 190, 194, 407, 318, 221, 224, 0, 271, 0, 407, ! 291, 295, 288, 0, 0, 315, 0, 121, 120, 125, ! 123, 132, 131, 346, 350, 0, 390, 380, 379, 358, ! 0, 373, 381, 0, 374, 0, 359, 0, 0, 0, ! 19, 20, 343, 336, 180, 0, 345, 349, 348, 392, ! 0, 370, 402, 0, 344, 347, 368, 342, 369, 389, ! 404, 0, 363, 0, 442, 439, 443, 440, 444, 441, ! 448, 446, 449, 447, 454, 451, 455, 452, 456, 453, ! 464, 459, 466, 461, 463, 458, 465, 460, 467, 0, ! 462, 471, 469, 472, 470, 475, 474, 478, 477, 481, ! 480, 484, 483, 487, 486, 491, 0, 0, 496, 495, ! 142, 407, 143, 0, 0, 147, 0, 246, 0, 312, ! 310, 301, 299, 309, 307, 273, 0, 254, 0, 0, ! 0, 319, 323, 0, 320, 287, 305, 303, 336, 0, ! 196, 228, 0, 0, 0, 251, 0, 292, 0, 280, ! 0, 0, 317, 0, 398, 399, 0, 385, 0, 382, ! 375, 378, 376, 377, 360, 352, 0, 436, 430, 433, ! 0, 0, 431, 184, 181, 183, 393, 0, 403, 400, ! 0, 405, 401, 354, 0, 490, 0, 0, 144, 0, ! 0, 145, 247, 0, 274, 270, 0, 327, 0, 331, ! 330, 324, 321, 325, 232, 0, 229, 230, 0, 0, ! 0, 256, 0, 260, 0, 263, 0, 297, 296, 282, ! 0, 294, 0, 316, 0, 396, 0, 384, 383, 0, ! 361, 351, 435, 429, 437, 432, 372, 371, 394, 0, ! 355, 356, 492, 489, 0, 146, 0, 0, 0, 244, ! 0, 197, 0, 204, 205, 0, 206, 207, 0, 255, ! 328, 0, 233, 0, 0, 231, 269, 266, 267, 503, ! 0, 258, 261, 0, 257, 0, 264, 0, 0, 281, ! 0, 314, 313, 397, 367, 0, 395, 357, 0, 148, ! 0, 0, 0, 223, 275, 0, 329, 326, 236, 234, ! 0, 268, 265, 259, 0, 279, 0, 365, 0, 0, ! 149, 0, 248, 0, 0, 235, 277, 278, 151, 0, ! 0, 0, 0, 150, 0, 0, 0, 0, 284, 0, ! 249, 283, 0, 0, 0 }; ! static const short yydefgoto[] = { 773, ! 1, 210, 281, 211, 87, 88, 70, 62, 212, 213, 24, 25, 26, 9, 10, 11, 12, 13, 14, 15, ! 16, 444, 287, 134, 107, 49, 72, 106, 132, 160, ! 161, 162, 93, 116, 117, 118, 214, 164, 263, 94, ! 113, 180, 181, 288, 138, 185, 403, 166, 167, 168, ! 265, 169, 170, 406, 553, 554, 289, 19, 45, 74, ! 67, 109, 46, 65, 96, 97, 98, 99, 215, 362, ! 290, 173, 556, 716, 292, 293, 294, 295, 691, 296, ! 297, 298, 299, 694, 300, 301, 302, 303, 695, 304, ! 447, 305, 586, 653, 654, 655, 656, 306, 307, 697, ! 308, 309, 310, 698, 311, 312, 453, 661, 662, 313, ! 314, 315, 316, 317, 318, 319, 572, 573, 574, 575, ! 216, 217, 218, 219, 220, 726, 670, 221, 491, 222, ! 472, 473, 122, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, ! 240, 241, 242, 243, 244, 245, 246, 247, 398, 492, ! 711 }; static const short yypact[] = {-32768, ! 726,-32768,-32768, 234, -60, 397, 456,-32768,-32768, 348, ! 228, 754,-32768,-32768,-32768,-32768, 908,-32768,-32768,-32768, ! -32768,-32768, 11,-32768,-32768,-32768, 357,-32768, 449,-32768, ! 48, 355,-32768,-32768, 791, 414,-32768, -60, 505,-32768, ! -32768, 504,-32768, 524, 7, -66,-32768, 540, 38,-32768, ! -32768, -60, 580, 366,-32768, 451,-32768, 49,-32768,-32768, ! -32768,-32768, 113, 1389,-32768, 558, 7,-32768,-32768, 311, ! 567,-32768,-32768, 7, -66,-32768, 38,-32768,-32768,-32768, ! 581,-32768,-32768,-32768, 589, 219,-32768,-32768,-32768, -51, ! 1082,-32768,-32768, 81,-32768, 1612,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 293, 244,-32768, 7,-32768, ! -32768, 362, -29,-32768, 119, -17,-32768, 626, -29, 401, ! 367, 367,-32768, 592, 599,-32768,-32768,-32768,-32768, 600, ! 1147,-32768,-32768, 244, 595, 615, 93,-32768,-32768,-32768, ! 616, 2107, 243, 525,-32768,-32768, 262,-32768, -29,-32768, ! 343, -29,-32768,-32768, 491,-32768, 501, 1041,-32768, 1264, ! -32768,-32768,-32768,-32768, 173,-32768, 443,-32768,-32768, 564, ! -32768,-32768, 1849,-32768,-32768,-32768,-32768, 643, 596, 433, ! -32768, 891,-32768,-32768, 546,-32768,-32768,-32768, 132,-32768, ! -32768, 2718, 2779, 2830, 2891, 553, 17, 586,-32768, 2942, ! 3003, 3054, 5044,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! 181, 561, 910, 40,-32768, 582, 598,-32768,-32768,-32768, ! 692,-32768, 804,-32768, 899, 948,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768, 778, 743, 836, 904, 984, 697, 748, ! 719, 753, 50,-32768,-32768,-32768, 935,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768, 885, 564,-32768, ! -32768,-32768, 383,-32768, 676,-32768, 808, 16, 3115,-32768, ! 72, 1293, 27, 106, 237, 324, 365, 239, 701, 5329, ! -60, 181, 561, 927, 573, 396,-32768, 891, 706,-32768, ! 1780,-32768,-32768, 693,-32768,-32768,-32768, 1918,-32768,-32768, ! 733,-32768,-32768,-32768,-32768, 1918,-32768, 1918,-32768,-32768, ! 5380, 736,-32768,-32768,-32768,-32768,-32768, 392,-32768, 465, ! 815, 948, 992, 1006,-32768,-32768,-32768,-32768, 958,-32768, ! 526, 712, 720,-32768, 833,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 21,-32768, 722, 816, 741, 741, ! 424,-32768,-32768,-32768,-32768,-32768, -39, 910, 108,-32768, ! -32768, 689, 28, 773, 5105, 2158, 700,-32768, 191, 3166, ! -32768, 441,-32768,-32768, 3227, 3278, 3339, 3390, 3451, 3502, ! 3563, 3614, 3675, 3726, 3787, 3838, 648, 3899, 3950, 4011, ! 4062, 4123, 4174, 4235, 2219,-32768,-32768, 4286,-32768, 445, ! -32768,-32768,-32768,-32768,-32768,-32768, 1780,-32768,-32768,-32768, ! -32768, 4347,-32768, 200,-32768,-32768, 222,-32768,-32768, 241, ! -32768, 4398,-32768, 4459,-32768, 759,-32768, 4846,-32768,-32768, ! 246, 399, 750, 738,-32768,-32768, -60, 2270,-32768,-32768, ! -32768,-32768, 1055, 596,-32768,-32768, 769,-32768, 818, 1038, ! -32768,-32768,-32768, 51, 2331,-32768, 4510,-32768,-32768,-32768, ! 958,-32768,-32768,-32768,-32768, -23, 777,-32768,-32768,-32768, ! 2382, 741,-32768, 475, 741, 475,-32768, 2443, 4571, 269, ! -24, 158,-32768, 1628,-32768, 2046,-32768,-32768,-32768,-32768, ! 471,-32768,-32768, 270,-32768,-32768,-32768,-32768,-32768, 788, ! -32768, 310,-32768, 5156,-32768,-32768,-32768,-32768,-32768,-32768, ! -32768, 778,-32768, 778,-32768, 743,-32768, 743,-32768, 743, ! -32768, 836,-32768, 836,-32768, 836,-32768, 836,-32768, 219, ! -32768,-32768, 904,-32768, 904,-32768, 984,-32768, 697,-32768, ! 748,-32768, 719,-32768, 753,-32768, 893, 829,-32768,-32768, ! -32768, 1080,-32768, 1780, 832,-32768, 1780,-32768, 412,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768, 435,-32768, 835, 444, ! 395, 759,-32768, 443,-32768,-32768,-32768,-32768,-32768, 450, ! 750,-32768, 939, 29, 711,-32768, 855,-32768, 5019,-32768, ! 4907, 851, 861, 863,-32768,-32768, 5217,-32768, 319,-32768, ! 367,-32768, 367,-32768,-32768, 867, 142,-32768,-32768,-32768, ! 4622, 964,-32768,-32768,-32768,-32768,-32768, 4683,-32768,-32768, ! 5268,-32768,-32768, 244, 569,-32768, 4734, 813,-32768, 1780, ! 2494,-32768,-32768, 1985,-32768,-32768, 425,-32768, 812,-32768, ! -32768,-32768,-32768,-32768,-32768, 2555,-32768,-32768, 966, 467, ! 4795,-32768, 755,-32768, 1504,-32768, 5329,-32768,-32768,-32768, ! 880, 878, 4958,-32768, 427,-32768, 605,-32768,-32768, 244, ! -32768, 886,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 650, ! -32768, 244,-32768,-32768, 466,-32768, 250, 144, 470,-32768, ! 930, 932, 1985,-32768,-32768, 1985,-32768,-32768, 884,-32768, ! 903, 911,-32768, 1008, 223,-32768,-32768,-32768,-32768,-32768, ! 473,-32768,-32768, 1581,-32768, 1711,-32768, 916, 1918,-32768, ! 918,-32768,-32768,-32768,-32768, 244,-32768,-32768, 2606,-32768, ! 254, 4347, 1918,-32768,-32768, 2667,-32768,-32768,-32768,-32768, ! 1015,-32768,-32768,-32768, 922,-32768, 1918,-32768, 257, 235, ! -32768, 436,-32768, 4907, 940,-32768,-32768,-32768,-32768, 259, ! 1985, 923, 4958,-32768, 975, 1985, 950, 1985,-32768, 1985, ! -32768,-32768, 1043, 1048,-32768 }; static const short yypgoto[] = {-32768, ! -32768,-32768, -54, 4, 677, -28, -134, 145, 150, -4, ! 801,-32768, 141,-32768, 1053, 934,-32768, 26,-32768,-32768, ! 901, 22, 621,-32768,-32768, 1010, 994,-32768, -128,-32768, ! 919,-32768, -105, -121, 946, -171, -198,-32768,-32768, -61, ! 125, 822, -330, -122, -104,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768, 936,-32768, -533,-32768, 674, 274,-32768,-32768, ! -32768,-32768, 1034, -21,-32768, 999,-32768,-32768, 129,-32768, ! -55, 825, 811, -159, -283,-32768, 793, -164, 177, -603, ! 857, -595,-32768,-32768,-32768, -300,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 446, 454, -636, -509,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, -269,-32768, -578, 797,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768, 539,-32768, 541, ! -32768,-32768,-32768, -5,-32768,-32768,-32768,-32768, -32,-32768, ! 764, 356, -6, 1118, 187, 1142, 330, 442, 521, -78, ! 532, 675, -475,-32768, 681, 654, 492, 673, 725, 727, ! 724, 729, 723,-32768, 493, 721, 699,-32768,-32768, 65, ! -32768 }; ! #define YYLAST 5490 static const short yytable[] = { 23, ! 459, 184, 31, 151, 361, 175, 329, 441, 613, 85, ! 452, 40, 182, 291, 145, 61, 411, 346, 717, 69, ! 629, 464, 17, 632, 136, 163, 22, 346, 487, 648, ! 692, 17, 17, 17, 66, 33, 125, 61, 693, 63, ! 368, 85, 61, 63, 254, 102, 120, 256, 50, 78, ! 52, 588, 108, 17, 163, 479, 17, 17, 480, 90, ! 33, 63, 363, 351, 394, 266, 63, 86, 137, 165, ! 611, 595, 415, 147, 17, 172, 85, 717, 596, 121, ! 178, 126, 140, 141, 721, 91, 90, 133, 465, 692, ! 71, 90, 692, 186, 86, 488, 686, 693, 165, 86, ! 693, 61, 64, 125, 172, 85, 421, 69, 483, 412, ! 41, 264, 42, 338, 340, 342, 344, 91, 347, 139, ! -153, 353, 355, 649, 696, 63, 90, 332, 347, 618, ! 90, 63, 139, 445, 86, 182, 676, 395, 86, -92, ! -92, 448, 671, 449, 648, 27, 29, 51, 79, 52, ! -290, 589, 158, 90, 401, 90, 179, 692, 22, 433, ! 461, 86, 692, 86, 692, 693, 692, 320, 284, 350, ! 693, 416, 693, 262, 693, 762, 282, 90, 54, 56, ! 127, 158, 59, 696, 767, 86, 696, 335, 335, 335, ! 335, 187, 59, 63, 286, 335, 335, 358, 463, 422, ! 560, 349, 484, 178, 121, 357, 248, 404, 182, 119, ! 101, -95, 135, 89, 52, 105, -95, -95, -95, -95, ! 426, 112, 562, 740, -95, 115, -95, -29, 2, -95, ! -95, -95, -95, 437, 21, 740, 672, 423, 731, 429, ! 89, 564, 618, 249, 618, 89, 577, 557, 149, 152, ! 647, 696, 612, 90, 706, 147, 696, 739, 696, 756, ! 696, 86, 252, 499, 112, 115, 359, 248, -102, 610, ! 619, 3, -102, 441, 154, 121, 178, 22, 120, 179, ! 89, 189, 363, 90, 89, 320, 284, 616, 659, 5, ! 452, 86, 320, 443, 282, 6, 506, 508, 510, 561, ! 320, 443, 320, 443, 69, 320, 450, 89, 702, 89, ! 622, 103, 286, 285, 282, 581, 120, 741, 189, 668, ! 22, 563, 283, 618, 425, 22, 90, 8, 63, 760, ! 424, 89, 179, 414, 86, 618, 420, 95, 430, 131, ! 565, 250, 474, 476, 432, 578, 441, -28, 2, 730, ! 481, 482, 179, 751, -32, 2, 759, 43, 764, 321, ! 253, 372, 452, -64, 699, 427, 73, 146, 620, 95, ! 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, ! 335, 335, 90, 335, 335, 335, 335, 335, 335, 335, ! 530, 3, 456, 130, 630, 640, -318, 28, 3, 483, ! 609, 320, 552, 4, 171, 584, -64, 89, 623, 5, ! 282, 417, 633, -31, 2, 6, 5, 669, 431, 155, ! 44, 189, 6, 699, 477, 700, 699, 722, 286, 44, ! 494, 285, 441, 171, 502, 635, 633, 89, 285, 37, ! 283, 503, 255, 141, 638, 607, 285, 8, 285, 47, ! 645, 76, -154, 452, 8, 135, 30, 3, 428, 548, ! 283, -156, 452, 39, 147, 601, 645, 707, 603, 690, ! 411, 625, 189, 742, 335, 5, 559, 321, 155, 335, ! 89, 6, 402, 22, 321, 457, 567, 467, 569, -318, ! 155, 699, 321, 579, 321, 681, 699, 321, 699, 146, ! 699, -63, 322, -63, 57, 55, 634, 59, 58, 500, ! -337, -337, 48, 8, 48, 641, 182, 478, 644, 592, ! -252, 594, 155, 121, 60, 251, 458, 330, 445, 636, ! 761, 448, 674, 331, 504, 599, 89, 639, 155, 551, ! 68, 725, 22, 646, -63, 331, -63, 285, 320, 284, ! 248, 320, 284, 728, 746, 708, 283, 282, 100, 729, ! 282, 743, -337, 732, 667, 617, -337, 104, 753, 3, ! 203, 618, 147, 435, 59, 286, 80, 189, 286, -33, ! 2, 111, 758, 320, 178, 320, 348, 257, 680, 114, ! 22, 22, 148, 321, 258, 176, 690, 748, 688, 150, ! 153, 746, 602, 753, 604, 758, 335, 335, 82, 723, ! 22, 83, 22, 705, 323, 183, 188, 136, -23, -23, ! 322, 18, 335, 3, 320, 284, 22, 322, 320, 443, ! 18, 18, 18, 282, 90, 322, 80, 322, 3, 37, ! 322, 5, 86, 328, 22, 80, 333, 6, 529, 320, ! 284, 286, 18, 22, 345, 18, 18, 320, 282, -23, ! 179, 436, 364, 682, -23, -23, -23, 22, 82, 618, ! -23, 83, 22, 18, -23, 22, 286, 82, 22, 8, ! 83, 22, 678, 369, 92, 22, 22, 320, 443, 177, ! 320, 443, 371, 324, 285, 370, 750, 285, 80, 724, ! 495, 22, 22, 283, 325, 618, 283, 390, 320, 284, ! 320, 284, 460, 320, 443, 710, 92, 282, 142, 282, ! 462, 718, 466, 143, 144, -26, 2, 320, 443, 22, ! 82, 392, 323, 83, 22, 286, 322, 286, 495, 323, ! 321, 320, 443, 321, 727, 378, 379, 323, 320, 323, ! 618, 159, 323, -27, 2, 320, 443, 320, 650, 391, ! 320, 443, 320, 443, 320, 443, 393, 496, 59, 3, ! 285, 405, 497, 651, 285, 321, 498, 321, 22, 283, ! 159, 4, 375, 376, 377, 485, 22, 5, 89, 486, ! -30, 2, 442, 6, -152, 285, 752, 3, 22, 438, ! 755, 7, 650, 580, 283, 496, 22, 652, 22, 4, ! 497, 324, 701, 495, 498, 5, 321, 651, 324, 570, ! 321, 6, 325, 571, 22, 8, 324, 600, 324, 325, ! 600, 324, 446, 285, 3, 455, 285, 325, 471, 325, ! 489, 321, 325, 380, 381, 382, 4, 326, 323, 321, ! 141, 712, 5, 8, 285, 3, 285, 20, 6, 285, ! -339, -339, 80, 283, 585, 283, 20, 20, 20, 734, ! 597, 327, 735, 285, 522, 524, 526, 528, 685, 321, ! 496, 621, 321, 322, 587, 497, 322, 285, 20, 498, ! 8, 20, 20, 626, 82, -498, -498, 83, 22, 22, ! 321, 285, 321, 408, 409, 321, 285, 410, 285, 20, ! 285, 34, -339, 468, 469, 470, -339, 627, 322, 321, ! 322, 383, 384, 385, 386, 631, 365, 324, 3, 637, ! 366, 157, 34, 321, 367, 80, 34, 765, 325, 647, ! 321, 80, 769, 32, 771, 36, 772, 321, 657, 321, ! 663, 37, 321, 34, 321, 664, 321, 665, 157, 322, ! 157, 387, -366, 322, 675, 326, 706, 82, 53, 38, ! 83, 22, 326, 82, 719, 39, 83, 22, 589, 399, ! 326, -364, 326, 736, 322, 326, 733, 174, -203, 327, ! -499, -499, 322, 373, 374, 323, 327, 737, 323, 388, ! 389, -497, -497, 365, 327, 738, 327, 366, 739, 327, ! 745, 367, 747, -16, 80, 756, 174, 766, -497, -497, ! 365, 757, 322, 196, 366, 322, 396, 397, 434, 197, ! 323, 768, 323, 516, 518, 520, 198, -408, -408, 763, ! 199, 123, 774, 322, 770, 322, 82, 775, 322, 83, ! 22, -409, -409, 200, 201, 143, 144, 202, 512, 514, ! 533, 535, 322, 531, 35, 77, 204, 205, 206, 207, ! 110, 323, 208, 209, 324, 323, 322, 324, 261, 400, ! 555, 326, 123, 322, 37, 325, 190, 75, 325, 407, ! 322, 80, 322, 259, 129, 322, 323, 322, 713, 322, ! 124, 440, 38, 451, 323, 327, 714, 454, 39, 324, ! 642, 324, 643, 475, 537, 541, 545, 539, 550, 684, ! 325, 543, 325, 82, -16, 37, 83, 22, 0, -497, ! -497, 365, 80, 0, 323, 366, -136, 323, 0, 367, ! 0, 124, 0, 38, 0, 0, -497, -497, 365, 39, ! 324, 0, 366, 0, 324, 323, 434, 323, 0, 0, ! 323, 325, 0, 0, 82, 325, -16, 83, 22, 0, ! 0, -497, -497, 365, 323, 324, 0, 366, 0, 0, ! 0, 628, 0, 324, 0, 0, 325, 0, 323, 0, ! 3, 0, 0, 0, 325, 323, 0, 80, 0, 0, ! 0, 0, 323, 0, 323, 0, 81, 323, 5, 323, ! 0, 323, 0, 324, 6, 0, 324, 0, 0, 0, ! 0, 0, 0, 0, 325, 0, 0, 325, 326, 82, ! 0, 326, 83, 22, 324, 0, 324, 0, 0, 324, ! 0, 0, 155, 156, 0, 325, 8, 325, 0, 0, ! 325, 0, 327, 324, 0, 327, 0, 0, 0, 0, ! 0, 0, 0, 326, 325, 326, 0, 324, 0, 0, ! 0, 0, 0, 0, 324, 0, 0, 0, 325, 0, ! 0, 324, 0, 324, 0, 325, 324, 327, 324, 327, ! 324, 0, 325, 418, 325, 192, 193, 325, 0, 325, ! 0, 325, 0, 0, 326, 0, 0, 3, 326, 336, ! 336, 336, 336, 0, 80, 0, 0, 336, 336, 0, ! 0, 0, 0, 81, 0, 5, 0, 0, 327, 326, ! 0, 6, 327, 337, 337, 337, 337, 326, 194, 195, ! 0, 337, 337, 80, 0, 0, 82, 0, 0, 83, ! 22, 0, 196, 327, 0, 0, 0, 0, 197, 155, ! 260, 327, 0, 8, 0, 198, 0, 326, 0, 199, ! 326, 0, 0, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 200, 201, 0, 0, 202, 0, 326, 0, ! 326, 327, 419, 326, 327, 204, 205, 206, 207, 0, ! 0, 208, 209, 0, 0, 0, 0, 326, 0, 0, ! 0, 0, 327, 0, 327, 0, 0, 327, 0, 0, ! 0, 326, 0, 0, 0, 0, 0, 0, 326, 0, ! 0, 327, 3, 0, 0, 326, 0, 326, 0, 80, ! 326, 0, 326, 0, 326, 327, 0, 0, 81, 0, ! 5, 0, 327, 0, 0, 0, 6, 0, 0, 327, ! 0, 327, 0, 0, 327, 0, 327, 0, 327, 0, ! 0, 82, 0, 0, 83, 22, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, ! 0, 0, 336, 336, 336, 336, 336, 336, 336, 336, ! 336, 336, 336, 336, 267, 336, 336, 336, 336, 336, ! 336, 336, 0, 0, 0, 0, 337, 337, 337, 337, ! 337, 337, 337, 337, 337, 337, 337, 337, 0, 337, ! 337, 337, 337, 337, 337, 337, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 3, 0, 194, ! 195, 650, 268, 269, 80, 270, 0, 0, 271, 0, ! 0, 0, 272, 196, 0, 0, 651, 0, 0, 273, ! 274, 6, 275, 0, 276, 277, 198, 278, 0, 0, ! 279, 267, 0, 0, 0, 0, 82, 0, 0, 83, ! 22, 0, 0, 0, 0, 0, 336, 280, 0, 155, ! 715, 336, 0, 8, 0, 0, 204, 205, 206, 207, ! 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, ! 337, 0, 0, 0, 3, 337, 194, 195, 650, 268, ! 269, 80, 270, 0, 0, 271, 0, 0, 0, 272, ! 196, 0, 0, 651, 0, 0, 273, 274, 6, 275, ! 0, 276, 277, 198, 278, 3, 0, 279, 0, 0, ! 0, 0, 80, 82, 0, 0, 83, 22, 0, 0, ! 0, 81, 0, 5, 280, 0, 155, 744, 80, 6, ! 8, 0, 0, 204, 205, 206, 207, 196, 0, 208, ! 209, 0, 0, 197, 82, 0, 0, 83, 22, 0, ! 198, 0, 0, 0, 199, 0, 0, 0, 128, 0, ! 82, 267, 0, 83, 22, 0, 0, 200, 201, 0, ! 0, 202, 0, 0, 0, 0, 0, 0, 336, 336, ! 204, 205, 206, 207, 0, 0, 208, 209, 0, 0, ! 0, 0, 0, 0, 336, 0, 0, 0, 0, 0, ! 0, 0, 337, 337, 3, 0, 194, 195, -262, 268, ! 269, 80, 270, 0, 0, 271, 0, 0, 337, 272, ! 196, 0, 0, -262, 0, 0, 273, 274, 6, 275, ! 267, 276, 277, 198, 278, 0, 0, 279, 0, 0, ! 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, ! 0, 0, 0, 0, 280, 0, 155, -262, 0, 0, ! 8, 0, 0, 204, 205, 206, 207, 0, 0, 208, ! 209, 0, 0, 3, 0, 194, 195, 0, 268, 269, ! 80, 270, 0, 0, 271, 0, 0, 0, 272, 196, ! 0, 0, 0, 0, 0, 273, 274, 6, 275, 267, ! 276, 277, 198, 278, 0, 0, 279, 0, 0, 0, ! 0, 0, 82, 0, 0, 83, 22, 0, 0, 0, ! 0, 0, 0, 280, 0, 155, 439, 0, 0, 8, ! 0, 0, 204, 205, 206, 207, 0, 0, 208, 209, ! 0, 0, 3, 0, 194, 195, 0, 268, 269, 80, ! 270, 0, 0, 271, 0, 0, 0, 272, 196, 0, ! 0, 0, 0, 0, 273, 274, 6, 275, 267, 276, ! 277, 198, 278, 0, 0, 279, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 0, 0, ! 0, 0, 280, 0, 155, 0, 0, 0, 8, 0, 0, 204, 205, 206, 207, 0, 0, 208, 209, 0, ! 0, 3, 0, 194, 195, 0, 268, 269, 80, 270, ! 0, 0, 271, 0, 0, 0, 272, 196, 0, 0, ! 0, 0, 0, 273, 274, 267, 275, 0, 276, 277, ! 198, 278, 0, 0, 279, 0, 0, 0, 0, 0, ! 82, 0, 0, 83, 22, 0, 0, 0, 0, 0, ! 0, 280, 0, 155, 0, 0, 0, 8, 0, 0, ! 204, 205, 206, 207, 0, 0, 208, 209, 3, 0, ! 194, 195, 0, 689, 269, 80, 270, 0, 0, 271, ! 0, 0, 0, 272, 196, 0, 614, 0, 192, 193, ! 273, 274, 0, 275, 0, 276, 277, 198, 278, 0, ! 0, 279, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 0, 0, 0, 0, 0, 280, 0, 155, 0, 0, 0, 8, 0, 0, 204, 205, 206, ! 207, 194, 195, 208, 209, 0, 80, 0, 0, 0, ! 0, 0, 0, 0, 0, 196, 0, 191, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, ! 0, 203, 615, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 493, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, ! 202, 0, 203, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 546, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 146, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 582, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, ! 0, 82, 0, 0, 83, 22, 0, 547, 200, 201, ! 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 590, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, ! 201, 0, 0, 202, 583, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 598, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, ! 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, ! 591, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 605, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, ! 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, ! 146, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 582, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 200, 201, 0, 0, 202, 606, 0, 194, ! 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 703, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, ! 22, 0, 0, 200, 201, 0, 0, 202, 687, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 703, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 0, 200, 201, 0, 0, 202, 704, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 590, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, ! 749, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 334, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, ! 202, 0, 0, 194, 195, 0, 754, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 339, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 341, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 343, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 352, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 354, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 356, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 413, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 501, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 505, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 507, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 509, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 511, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 513, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 515, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 517, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 519, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 521, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 523, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 525, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 527, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 532, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 534, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 536, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 538, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 540, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 542, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 544, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 549, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 558, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 566, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 568, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 593, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 608, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 673, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, ! 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 677, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, ! 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 683, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, ! 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, ! 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, ! 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 709, 0, 192, 193, 197, ! 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, ! 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, ! 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, ! 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 576, 0, 0, 0, ! 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, ! 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, ! 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 0, 200, 201, 0, 0, 202, -285, ! 0, -285, -285, 0, 0, 0, -285, 204, 205, 206, ! 207, 0, 0, 208, 209, -285, 0, 660, 0, 0, ! 0, -285, 0, 0, 0, 0, 0, 0, -285, 0, ! 0, 0, -285, 0, 0, 0, 0, 0, -285, 0, ! 0, -285, -285, 0, 0, 0, 0, 0, 0, -285, ! 0, 0, 0, 0, 0, -285, 0, 0, -285, -285, ! -285, -285, 194, 195, -285, -285, 0, 80, 720, 0, ! 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, ! 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, ! 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, ! 0, 0, 83, 22, 0, 0, 0, 0, 0, 0, ! 280, -293, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 658, ! 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, ! 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, ! 82, 0, 0, 83, 22, 0, 192, 193, 0, 0, ! 0, 280, -293, 0, 0, 0, 0, 0, 0, 0, ! 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, ! 0, 0, 0, 0, 197, 0, 0, 0, 0, 194, ! 195, 198, 0, 0, 80, 199, 0, 0, 0, 0, ! 0, 82, 0, 196, 83, 22, 0, 192, 193, 197, ! 0, 0, 280, 0, 0, 0, 198, 0, 0, 0, ! 199, 204, 205, 206, 207, 0, 82, 208, 209, 83, ! 22, 0, 0, 200, 201, 0, 0, 202, 0, 203, ! 360, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 0, 0, 192, 193, ! 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, ! 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, ! 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 0, 200, 201, 0, 0, 202, 490, ! 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 0, 0, 192, ! 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, ! 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, ! 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, ! 624, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 0, 0, ! 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, ! 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, ! 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, ! 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, ! 202, 666, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 0, ! 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, ! 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, ! 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, ! 0, 202, 679, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, ! 0, 0, 202, 3, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, ! 0, 0, 82, 0, 0, 83, 22, 0, 0, 0, ! 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, ! 0, 0, 204, 205, 206, 207, 0, 0, 208, 209 }; static const short yycheck[] = { 4, ! 331, 136, 7, 125, 203, 134, 178, 291, 484, 64, ! 311, 1, 135, 173, 119, 44, 1, 1, 655, 48, ! 554, 1, 1, 557, 54, 131, 87, 1, 1, 1, ! 634, 10, 11, 12, 101, 10, 91, 66, 634, 44, ! 1, 96, 71, 48, 149, 67, 98, 152, 1, 1, ! 102, 1, 74, 32, 160, 95, 35, 36, 98, 64, ! 35, 66, 102, 198, 15, 170, 71, 64, 98, 131, ! 95, 95, 1, 98, 53, 131, 131, 714, 102, 86, ! 135, 1, 100, 101, 663, 64, 91, 109, 68, 693, ! 53, 96, 696, 1, 91, 68, 630, 693, 160, 96, ! 696, 130, 96, 158, 160, 160, 1, 136, 1, 94, ! 100, 167, 102, 192, 193, 194, 195, 96, 102, 1, ! 94, 200, 201, 95, 634, 130, 131, 182, 102, 101, ! 135, 136, 1, 298, 131, 258, 612, 88, 135, 100, ! 101, 306, 1, 308, 1, 5, 6, 100, 100, 102, ! 100, 101, 131, 158, 259, 160, 135, 761, 87, 281, ! 332, 158, 766, 160, 768, 761, 770, 173, 173, 198, ! 766, 100, 768, 1, 770, 754, 173, 182, 38, 39, ! 100, 160, 42, 693, 763, 182, 696, 192, 193, 194, ! 195, 99, 52, 198, 173, 200, 201, 202, 333, 94, ! 1, 198, 95, 258, 211, 202, 142, 263, 331, 85, ! 66, 93, 94, 64, 102, 71, 98, 99, 100, 101, ! 276, 81, 1, 1, 93, 85, 95, 0, 1, 98, ! 99, 100, 101, 288, 1, 1, 95, 1, 95, 1, ! 91, 1, 101, 1, 101, 96, 1, 407, 124, 125, ! 1, 761, 95, 258, 1, 98, 766, 1, 768, 1, ! 770, 258, 1, 73, 124, 125, 202, 203, 96, 1, ! 1, 44, 100, 557, 130, 282, 331, 87, 98, 258, ! 131, 141, 102, 288, 135, 291, 291, 486, 589, 62, ! 591, 288, 298, 298, 291, 68, 375, 376, 377, 100, ! 306, 306, 308, 308, 333, 311, 311, 158, 639, 160, ! 1, 1, 291, 173, 311, 437, 98, 95, 178, 1, ! 87, 100, 173, 101, 1, 87, 331, 100, 333, 95, ! 94, 182, 311, 269, 331, 101, 272, 64, 100, 96, ! 100, 99, 349, 350, 280, 100, 630, 0, 1, 100, ! 357, 358, 331, 100, 0, 1, 100, 1, 100, 173, ! 99, 221, 663, 53, 634, 1, 1, 99, 99, 96, ! 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, ! 387, 44, 1, 101, 554, 1, 1, 1, 44, 1, ! 479, 407, 407, 56, 131, 438, 96, 258, 99, 62, ! 407, 271, 1, 0, 1, 68, 62, 99, 278, 96, ! 64, 281, 68, 693, 1, 1, 696, 1, 407, 64, ! 366, 291, 716, 160, 370, 1, 1, 288, 298, 44, ! 291, 1, 100, 101, 1, 478, 306, 100, 308, 1, ! 1, 1, 96, 754, 100, 94, 1, 44, 94, 395, ! 311, 96, 763, 68, 98, 472, 1, 1, 475, 634, ! 1, 504, 332, 1, 479, 62, 412, 291, 96, 484, ! 331, 68, 100, 87, 298, 94, 422, 347, 424, 94, ! 96, 761, 306, 95, 308, 624, 766, 311, 768, 99, ! 770, 53, 173, 53, 1, 1, 95, 367, 5, 369, ! 46, 47, 64, 100, 64, 571, 639, 94, 574, 455, ! 96, 457, 96, 530, 1, 1, 1, 95, 693, 95, ! 95, 696, 611, 101, 94, 471, 387, 94, 96, 95, ! 1, 670, 87, 94, 96, 101, 96, 407, 554, 554, ! 486, 557, 557, 682, 719, 89, 407, 554, 1, 94, ! 557, 89, 98, 94, 597, 95, 102, 1, 733, 44, ! 96, 101, 98, 1, 434, 554, 51, 437, 557, 0, ! 1, 1, 747, 589, 639, 591, 1, 97, 621, 1, ! 87, 87, 1, 407, 94, 1, 761, 726, 631, 1, ! 1, 766, 474, 768, 476, 770, 611, 612, 83, 665, ! 87, 86, 87, 646, 173, 1, 1, 54, 46, 47, ! 291, 1, 627, 44, 630, 630, 87, 298, 634, 634, ! 10, 11, 12, 630, 639, 306, 51, 308, 44, 44, ! 311, 62, 639, 1, 87, 51, 101, 68, 1, 655, ! 655, 630, 32, 87, 102, 35, 36, 663, 655, 87, ! 639, 89, 102, 95, 92, 93, 94, 87, 83, 101, ! 98, 86, 87, 53, 102, 87, 655, 83, 87, 100, ! 86, 87, 618, 102, 64, 87, 87, 693, 693, 95, ! 696, 696, 1, 173, 554, 98, 729, 557, 51, 95, ! 1, 87, 87, 554, 173, 101, 557, 11, 714, 714, ! 716, 716, 1, 719, 719, 651, 96, 714, 93, 716, ! 1, 657, 1, 98, 99, 0, 1, 733, 733, 87, ! 83, 13, 291, 86, 87, 714, 407, 716, 1, 298, ! 554, 747, 747, 557, 95, 3, 4, 306, 754, 308, ! 101, 131, 311, 0, 1, 761, 761, 763, 48, 12, ! 766, 766, 768, 768, 770, 770, 14, 68, 628, 44, ! 630, 96, 73, 63, 634, 589, 77, 591, 87, 630, ! 160, 56, 5, 6, 7, 97, 87, 62, 639, 101, ! 0, 1, 100, 68, 94, 655, 732, 44, 87, 94, ! 736, 76, 48, 66, 655, 68, 87, 97, 87, 56, ! 73, 291, 1, 1, 77, 62, 630, 63, 298, 61, ! 634, 68, 291, 65, 87, 100, 306, 472, 308, 298, ! 475, 311, 100, 693, 44, 100, 696, 306, 98, 308, ! 68, 655, 311, 8, 9, 10, 56, 173, 407, 663, ! 101, 97, 62, 100, 714, 44, 716, 1, 68, 719, ! 46, 47, 51, 714, 96, 716, 10, 11, 12, 693, ! 94, 173, 696, 733, 383, 384, 385, 386, 66, 693, ! 68, 94, 696, 554, 67, 73, 557, 747, 32, 77, ! 100, 35, 36, 1, 83, 92, 93, 86, 87, 87, ! 714, 761, 716, 96, 97, 719, 766, 100, 768, 53, ! 770, 11, 98, 98, 99, 100, 102, 89, 589, 733, ! 591, 18, 19, 20, 21, 94, 94, 407, 44, 95, ! 98, 131, 32, 747, 102, 51, 36, 761, 407, 1, ! 754, 51, 766, 10, 768, 12, 770, 761, 94, 763, ! 100, 44, 766, 53, 768, 95, 770, 95, 158, 630, ! 160, 58, 96, 634, 1, 291, 1, 83, 35, 62, ! 86, 87, 298, 83, 95, 68, 86, 87, 101, 95, ! 306, 96, 308, 100, 655, 311, 57, 131, 57, 291, ! 92, 93, 663, 46, 47, 554, 298, 95, 557, 16, ! 17, 92, 93, 94, 306, 95, 308, 98, 1, 311, ! 95, 102, 95, 87, 51, 1, 160, 95, 92, 93, ! 94, 100, 693, 60, 98, 696, 92, 93, 102, 66, ! 589, 57, 591, 380, 381, 382, 73, 46, 47, 100, ! 77, 1, 0, 714, 95, 716, 83, 0, 719, 86, ! 87, 46, 47, 90, 91, 98, 99, 94, 378, 379, ! 388, 389, 733, 387, 12, 56, 103, 104, 105, 106, ! 77, 630, 109, 110, 554, 634, 747, 557, 160, 258, ! 407, 407, 1, 754, 44, 554, 141, 54, 557, 265, ! 761, 51, 763, 158, 96, 766, 655, 768, 653, 770, ! 60, 291, 62, 311, 663, 407, 653, 311, 68, 589, ! 572, 591, 572, 350, 390, 392, 394, 391, 398, 627, ! 589, 393, 591, 83, 87, 44, 86, 87, -1, 92, ! 93, 94, 51, -1, 693, 98, 96, 696, -1, 102, ! -1, 60, -1, 62, -1, -1, 92, 93, 94, 68, ! 630, -1, 98, -1, 634, 714, 102, 716, -1, -1, ! 719, 630, -1, -1, 83, 634, 87, 86, 87, -1, ! -1, 92, 93, 94, 733, 655, -1, 98, -1, -1, ! -1, 102, -1, 663, -1, -1, 655, -1, 747, -1, ! 44, -1, -1, -1, 663, 754, -1, 51, -1, -1, ! -1, -1, 761, -1, 763, -1, 60, 766, 62, 768, ! -1, 770, -1, 693, 68, -1, 696, -1, -1, -1, ! -1, -1, -1, -1, 693, -1, -1, 696, 554, 83, ! -1, 557, 86, 87, 714, -1, 716, -1, -1, 719, ! -1, -1, 96, 97, -1, 714, 100, 716, -1, -1, ! 719, -1, 554, 733, -1, 557, -1, -1, -1, -1, ! -1, -1, -1, 589, 733, 591, -1, 747, -1, -1, ! -1, -1, -1, -1, 754, -1, -1, -1, 747, -1, ! -1, 761, -1, 763, -1, 754, 766, 589, 768, 591, ! 770, -1, 761, 1, 763, 3, 4, 766, -1, 768, ! -1, 770, -1, -1, 630, -1, -1, 44, 634, 192, ! 193, 194, 195, -1, 51, -1, -1, 200, 201, -1, ! -1, -1, -1, 60, -1, 62, -1, -1, 630, 655, ! -1, 68, 634, 192, 193, 194, 195, 663, 46, 47, ! -1, 200, 201, 51, -1, -1, 83, -1, -1, 86, ! 87, -1, 60, 655, -1, -1, -1, -1, 66, 96, ! 97, 663, -1, 100, -1, 73, -1, 693, -1, 77, ! 696, -1, -1, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, 90, 91, -1, -1, 94, -1, 714, -1, ! 716, 693, 100, 719, 696, 103, 104, 105, 106, -1, ! -1, 109, 110, -1, -1, -1, -1, 733, -1, -1, ! -1, -1, 714, -1, 716, -1, -1, 719, -1, -1, ! -1, 747, -1, -1, -1, -1, -1, -1, 754, -1, ! -1, 733, 44, -1, -1, 761, -1, 763, -1, 51, ! 766, -1, 768, -1, 770, 747, -1, -1, 60, -1, ! 62, -1, 754, -1, -1, -1, 68, -1, -1, 761, ! -1, 763, -1, -1, 766, -1, 768, -1, 770, -1, ! -1, 83, -1, -1, 86, 87, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 97, -1, -1, -1, -1, ! -1, -1, 375, 376, 377, 378, 379, 380, 381, 382, ! 383, 384, 385, 386, 1, 388, 389, 390, 391, 392, ! 393, 394, -1, -1, -1, -1, 375, 376, 377, 378, ! 379, 380, 381, 382, 383, 384, 385, 386, -1, 388, ! 389, 390, 391, 392, 393, 394, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, 44, -1, 46, 47, 48, 49, 50, 51, 52, -1, -1, 55, -1, ! -1, -1, 59, 60, -1, -1, 63, -1, -1, 66, ! 67, 68, 69, -1, 71, 72, 73, 74, -1, -1, ! 77, 1, -1, -1, -1, -1, 83, -1, -1, 86, ! 87, -1, -1, -1, -1, -1, 479, 94, -1, 96, ! 97, 484, -1, 100, -1, -1, 103, 104, 105, 106, ! -1, -1, 109, 110, -1, -1, -1, -1, -1, -1, ! 479, -1, -1, -1, 44, 484, 46, 47, 48, 49, ! 50, 51, 52, -1, -1, 55, -1, -1, -1, 59, ! 60, -1, -1, 63, -1, -1, 66, 67, 68, 69, ! -1, 71, 72, 73, 74, 44, -1, 77, -1, -1, ! -1, -1, 51, 83, -1, -1, 86, 87, -1, -1, ! -1, 60, -1, 62, 94, -1, 96, 97, 51, 68, ! 100, -1, -1, 103, 104, 105, 106, 60, -1, 109, ! 110, -1, -1, 66, 83, -1, -1, 86, 87, -1, ! 73, -1, -1, -1, 77, -1, -1, -1, 97, -1, ! 83, 1, -1, 86, 87, -1, -1, 90, 91, -1, ! -1, 94, -1, -1, -1, -1, -1, -1, 611, 612, ! 103, 104, 105, 106, -1, -1, 109, 110, -1, -1, ! -1, -1, -1, -1, 627, -1, -1, -1, -1, -1, ! -1, -1, 611, 612, 44, -1, 46, 47, 48, 49, ! 50, 51, 52, -1, -1, 55, -1, -1, 627, 59, ! 60, -1, -1, 63, -1, -1, 66, 67, 68, 69, ! 1, 71, 72, 73, 74, -1, -1, 77, -1, -1, ! -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, ! -1, -1, -1, -1, 94, -1, 96, 97, -1, -1, ! 100, -1, -1, 103, 104, 105, 106, -1, -1, 109, ! 110, -1, -1, 44, -1, 46, 47, -1, 49, 50, ! 51, 52, -1, -1, 55, -1, -1, -1, 59, 60, ! -1, -1, -1, -1, -1, 66, 67, 68, 69, 1, ! 71, 72, 73, 74, -1, -1, 77, -1, -1, -1, ! -1, -1, 83, -1, -1, 86, 87, -1, -1, -1, ! -1, -1, -1, 94, -1, 96, 97, -1, -1, 100, ! -1, -1, 103, 104, 105, 106, -1, -1, 109, 110, ! -1, -1, 44, -1, 46, 47, -1, 49, 50, 51, 52, -1, -1, 55, -1, -1, -1, 59, 60, -1, ! -1, -1, -1, -1, 66, 67, 68, 69, 1, 71, ! 72, 73, 74, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, -1, -1, ! -1, -1, 94, -1, 96, -1, -1, -1, 100, -1, -1, 103, 104, 105, 106, -1, -1, 109, 110, -1, ! -1, 44, -1, 46, 47, -1, 49, 50, 51, 52, ! -1, -1, 55, -1, -1, -1, 59, 60, -1, -1, ! -1, -1, -1, 66, 67, 1, 69, -1, 71, 72, ! 73, 74, -1, -1, 77, -1, -1, -1, -1, -1, ! 83, -1, -1, 86, 87, -1, -1, -1, -1, -1, ! -1, 94, -1, 96, -1, -1, -1, 100, -1, -1, ! 103, 104, 105, 106, -1, -1, 109, 110, 44, -1, 46, 47, -1, 49, 50, 51, 52, -1, -1, 55, ! -1, -1, -1, 59, 60, -1, 1, -1, 3, 4, ! 66, 67, -1, 69, -1, 71, 72, 73, 74, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, -1, -1, -1, -1, 94, -1, 96, -1, -1, -1, 100, -1, -1, 103, 104, 105, ! 106, 46, 47, 109, 110, -1, 51, -1, -1, -1, ! -1, -1, -1, -1, -1, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, ! -1, 96, 97, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, ! 94, -1, 96, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, --- 1061,2058 ---- 111, 0, 127, 109, 0, 0, 88, 91, 127, 0, 19, 20, 113, 0, 0, 178, 177, 169, 171, 0, 0, 58, 161, 0, 0, 0, 0, 106, 97, 86, ! 0, 0, 0, 0, 105, 387, 0, 112, 127, 110, ! 0, 127, 72, 71, 188, 73, 21, 0, 83, 0, 75, 77, 81, 82, 0, 78, 0, 79, 137, 127, 84, 80, 0, 85, 56, 117, 114, 0, 126, 0, 119, 0, 129, 130, 128, 118, 116, 90, 0, 89, ! 93, 0, 0, 0, 0, 0, 0, 0, 336, 0, ! 0, 0, 0, 7, 6, 3, 4, 5, 8, 335, ! 0, 0, 408, 0, 101, 407, 333, 342, 338, 354, ! 0, 334, 339, 340, 341, 425, 409, 410, 418, 440, ! 413, 414, 416, 428, 447, 452, 459, 470, 475, 478, ! 481, 484, 487, 490, 495, 504, 496, 0, 100, 98, ! 96, 99, 389, 388, 108, 87, 107, 186, 0, 127, ! 74, 76, 104, 0, 135, 0, 139, 0, 0, 0, ! 277, 0, 0, 0, 0, 0, 0, 0, 0, 336, ! 0, 0, 9, 15, 408, 0, 126, 194, 0, 0, ! 209, 0, 190, 192, 0, 193, 198, 210, 0, 199, ! 211, 0, 200, 201, 212, 251, 0, 202, 0, 213, ! 203, 290, 0, 214, 215, 216, 218, 217, 0, 219, ! 244, 243, 0, 241, 242, 239, 240, 238, 124, 122, ! 115, 0, 0, 0, 417, 408, 339, 341, 415, 420, ! 419, 424, 423, 422, 421, 0, 392, 0, 0, 0, ! 17, 0, 429, 426, 430, 427, 436, 0, 408, 0, ! 179, 0, 183, 0, 0, 0, 0, 0, 0, 94, ! 0, 0, 363, 0, 412, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 502, 503, 0, ! 141, 0, 140, 134, 103, 133, 188, 138, 0, 227, ! 228, 226, 246, 0, 312, 0, 301, 299, 0, 309, ! 307, 0, 273, 0, 254, 0, 323, 0, 287, 0, ! 305, 303, 0, 0, 196, 0, 223, 221, 0, 0, ! 189, 187, 191, 195, 408, 319, 222, 225, 0, 272, ! 0, 408, 292, 296, 289, 0, 0, 316, 0, 121, ! 120, 125, 123, 132, 131, 347, 351, 0, 391, 381, ! 380, 359, 0, 374, 382, 0, 375, 0, 360, 0, ! 0, 0, 19, 20, 344, 337, 180, 181, 0, 346, ! 350, 349, 393, 0, 371, 403, 0, 345, 348, 369, ! 343, 370, 390, 405, 0, 364, 0, 444, 441, 445, ! 442, 446, 443, 450, 448, 451, 449, 456, 453, 457, ! 454, 458, 455, 466, 461, 468, 463, 465, 460, 467, ! 462, 469, 0, 464, 473, 471, 474, 472, 477, 476, ! 480, 479, 483, 482, 486, 485, 489, 488, 493, 0, ! 0, 498, 497, 142, 408, 143, 0, 0, 147, 0, ! 247, 0, 313, 311, 302, 300, 310, 308, 274, 0, ! 255, 0, 0, 0, 320, 324, 0, 321, 288, 306, ! 304, 337, 0, 197, 229, 0, 0, 0, 252, 0, ! 293, 0, 281, 0, 0, 318, 0, 399, 400, 0, ! 386, 0, 383, 376, 379, 377, 378, 361, 353, 0, ! 438, 432, 435, 0, 0, 433, 185, 182, 184, 394, ! 0, 404, 401, 0, 406, 402, 355, 0, 492, 0, ! 0, 144, 0, 0, 145, 248, 0, 275, 271, 0, ! 328, 0, 332, 331, 325, 322, 326, 233, 0, 230, ! 231, 0, 0, 0, 257, 0, 261, 0, 264, 0, ! 298, 297, 283, 0, 295, 0, 317, 0, 397, 0, ! 385, 384, 0, 362, 352, 437, 431, 439, 434, 373, ! 372, 395, 0, 356, 357, 494, 491, 0, 146, 0, ! 0, 0, 245, 0, 198, 0, 205, 206, 0, 207, ! 208, 0, 256, 329, 0, 234, 0, 0, 232, 270, ! 267, 268, 505, 0, 259, 262, 0, 258, 0, 265, ! 0, 0, 282, 0, 315, 314, 398, 368, 0, 396, ! 358, 0, 148, 0, 0, 0, 224, 276, 0, 330, ! 327, 237, 235, 0, 269, 266, 260, 0, 280, 0, ! 366, 0, 0, 149, 0, 249, 0, 0, 236, 278, ! 279, 151, 0, 0, 0, 0, 150, 0, 0, 0, ! 0, 285, 0, 250, 284, 0, 0, 0 }; ! static const short yydefgoto[] = { 776, ! 1, 210, 282, 211, 87, 88, 70, 62, 212, 213, 24, 25, 26, 9, 10, 11, 12, 13, 14, 15, ! 16, 446, 288, 134, 107, 49, 72, 106, 132, 160, ! 161, 162, 93, 116, 117, 118, 214, 164, 264, 94, ! 113, 180, 181, 289, 138, 185, 405, 166, 167, 168, ! 266, 169, 170, 408, 556, 557, 290, 19, 45, 74, ! 67, 109, 46, 65, 96, 97, 98, 99, 215, 364, ! 291, 173, 559, 719, 293, 294, 295, 296, 694, 297, ! 298, 299, 300, 697, 301, 302, 303, 304, 698, 305, ! 449, 306, 589, 656, 657, 658, 659, 307, 308, 700, ! 309, 310, 311, 701, 312, 313, 455, 664, 665, 314, ! 315, 316, 317, 318, 319, 320, 575, 576, 577, 578, ! 216, 217, 218, 219, 220, 729, 673, 221, 494, 222, ! 474, 475, 122, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, ! 240, 241, 242, 243, 244, 245, 246, 247, 248, 400, ! 495, 714 }; static const short yypact[] = {-32768, ! 603,-32768,-32768, 367, -76, 436, 439,-32768,-32768, 666, ! 434, 810,-32768,-32768,-32768,-32768, 696,-32768,-32768,-32768, ! -32768,-32768, 13,-32768,-32768,-32768, 356,-32768, 349,-32768, ! 17, 582,-32768,-32768, 836, 590,-32768, -76, 459,-32768, ! -32768, 219,-32768, 463, -63, -48,-32768, 472, 38,-32768, ! -32768, -76, 686, 363,-32768, 357,-32768, 23,-32768,-32768, ! -32768,-32768, 115, 1586,-32768, 502, -63,-32768,-32768, 365, ! 505,-32768,-32768, -63, -48,-32768, 38,-32768,-32768,-32768, ! 515,-32768,-32768,-32768, 518, 136,-32768,-32768,-32768, 422, ! 1120,-32768,-32768, 50,-32768, 1593,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 151, 196,-32768, -63,-32768, ! -32768, 301, -29,-32768, 137, -55,-32768, 595, -29, 393, ! 400, 400,-32768, 520, 528,-32768,-32768,-32768,-32768, 530, ! 1277,-32768,-32768, 196, 729, 531, 58,-32768,-32768,-32768, ! 537, 1530, 172, 506,-32768,-32768, 202,-32768, -29,-32768, ! 348, -29,-32768,-32768, 418,-32768, 445, 640,-32768, 1355, ! -32768,-32768,-32768,-32768, 87,-32768, 517,-32768,-32768, 527, ! -32768,-32768, 1976,-32768,-32768,-32768,-32768, 541, 553, 478, ! -32768, 471,-32768,-32768, 538,-32768,-32768,-32768, 158,-32768, ! -32768, 2784, 1188, 2845, 2896, 540, 18, 485,-32768, 2957, ! 3008, 3069, 4998,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ! 449, 572, 967, 21,-32768, 575, 600,-32768,-32768,-32768, ! 543,-32768, 563,-32768, 697, 755,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 843, 775, 959, 993, 891, 694, ! 702, 727, 731, 11,-32768,-32768,-32768, 734,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 901, 527, ! -32768,-32768,-32768, 536,-32768, 647,-32768, 787, 249, 3120, ! -32768, 99, 2173, 16, 268, 277, 78, 328, 217, 656, ! 5283, -76, 449, 572, 960, 948, 406,-32768, 471, 659, ! -32768, 1907,-32768,-32768, 662,-32768,-32768,-32768, 2045,-32768, ! -32768, 670,-32768,-32768,-32768,-32768, 2045,-32768, 2045,-32768, ! -32768, 5334, 684,-32768,-32768,-32768,-32768,-32768, 332,-32768, ! 674, 815, 755, 869, 878,-32768,-32768,-32768,-32768, 849, ! -32768, 746, 564, 585,-32768, 679,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, 26,-32768, 586, 883, 742, ! 742, 352,-32768,-32768,-32768,-32768,-32768, 661, 967, 199, ! -32768, 690,-32768, 716, 27, 739, 5059, 2224, 803,-32768, ! -44, 3181,-32768, 369,-32768,-32768, 3232, 3293, 3344, 3405, ! 3456, 3517, 3568, 3629, 3680, 3741, 3792, 3853, 574, 3904, ! 3965, 4016, 4077, 4128, 4189, 4240, 2285,-32768,-32768, 4301, ! -32768, 493,-32768,-32768,-32768,-32768,-32768,-32768, 1907,-32768, ! -32768,-32768,-32768, 4352,-32768, 65,-32768,-32768, 84,-32768, ! -32768, 92,-32768, 4413,-32768, 4464,-32768, 757,-32768, 1469, ! -32768,-32768, 104, 212, 758, 732,-32768,-32768, -76, 2336, ! -32768,-32768,-32768,-32768, 1043, 553,-32768,-32768, 760,-32768, ! 796, 990,-32768,-32768,-32768, 35, 2397,-32768, 4525,-32768, ! -32768,-32768, 849,-32768,-32768,-32768,-32768, 246, 776,-32768, ! -32768,-32768, 2448, 742,-32768, -35, 742, -35,-32768, 2509, ! 4576, 220, -18, 195,-32768, 5359,-32768,-32768, 748,-32768, ! -32768,-32768,-32768, 568,-32768,-32768, 232,-32768,-32768,-32768, ! -32768,-32768, 781,-32768, 238,-32768, 5110,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 843,-32768, 843,-32768, 775,-32768, ! 775,-32768, 775,-32768, 959,-32768, 959,-32768, 959,-32768, ! 959,-32768, 136,-32768,-32768, 993,-32768, 993,-32768, 891, ! -32768, 694,-32768, 702,-32768, 727,-32768, 731,-32768, 885, ! 790,-32768,-32768,-32768, 1008,-32768, 1907, 795,-32768, 1907, ! -32768, 215,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 241, ! -32768, 801, 411, 89, 757,-32768, 517,-32768,-32768,-32768, ! -32768,-32768, 416, 758,-32768, 890, 159, 1,-32768, 806, ! -32768, 4973,-32768, 4861, 805, 825, 848,-32768,-32768, 5171, ! -32768, 240,-32768, 400,-32768, 400,-32768,-32768, 842, 166, ! -32768,-32768,-32768, 4637, 1021,-32768,-32768,-32768,-32768,-32768, ! 4688,-32768,-32768, 5222,-32768,-32768, 196, 624,-32768, 4749, ! 846,-32768, 1907, 2560,-32768,-32768, 2112,-32768,-32768, 105, ! -32768, 876,-32768,-32768,-32768,-32768,-32768,-32768, 2621,-32768, ! -32768, 944, 19, 4800,-32768, 428,-32768, 1684,-32768, 5283, ! -32768,-32768,-32768, 861, 863, 4912,-32768, 224,-32768, 634, ! -32768,-32768, 196,-32768, 874,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768, 643,-32768, 196,-32768,-32768, 424,-32768, 176, ! 167, 443,-32768, 920, 922, 2112,-32768,-32768, 2112,-32768, ! -32768, 892,-32768, 895, 909,-32768, 984, 169,-32768,-32768, ! -32768,-32768,-32768, 245,-32768,-32768, 1759,-32768, 1833,-32768, ! 915, 2045,-32768, 924,-32768,-32768,-32768,-32768, 196,-32768, ! -32768, 2672,-32768, 180, 4352, 2045,-32768,-32768, 2733,-32768, ! -32768,-32768,-32768, 1014,-32768,-32768,-32768, 917,-32768, 2045, ! -32768, 181, 171,-32768, 320,-32768, 4861, 923,-32768,-32768, ! -32768,-32768, 211, 2112, 925, 4912,-32768, 974, 2112, 937, ! 2112,-32768, 2112,-32768,-32768, 1038, 1044,-32768 }; static const short yypgoto[] = {-32768, ! -32768,-32768, -57, -49, 660, 10, -128, 353, 308, -4, ! 552,-32768, 124,-32768, 1033, 689,-32768, 440,-32768,-32768, ! 898, 20, 611,-32768,-32768, 992, 979,-32768, -133,-32768, ! 907,-32768, 339, -121, 933, -162, -190,-32768,-32768, 354, ! -28, 816, -326, -125, -81,-32768,-32768,-32768,-32768,-32768, ! -32768,-32768, 921,-32768, -149,-32768, 676, 305,-32768,-32768, ! -32768,-32768, 1032, -2,-32768, 994,-32768,-32768, 88,-32768, ! -119, 823, 799, -164, -287,-32768, 785, -195, 207, -473, ! 477, -422,-32768,-32768,-32768, -310,-32768,-32768,-32768,-32768, ! -32768,-32768,-32768,-32768, 447, 461, -430, -410,-32768,-32768, ! -32768,-32768,-32768,-32768,-32768, -302,-32768, -629, 793,-32768, ! -32768,-32768,-32768,-32768,-32768,-32768,-32768, 524,-32768, 545, ! -32768,-32768,-32768, 236,-32768,-32768,-32768,-32768, -405,-32768, ! 771, 157, -36, 1112, 307, 1317, 397, 476, 619, 930, ! -53, 630, 709, -463,-32768, 580, 615, 763, 584, 736, ! 745, 735, 737, 743,-32768, 510, 744, 893,-32768,-32768, ! -59,-32768 }; ! #define YYLAST 5469 static const short yytable[] = { 23, ! 175, 454, 31, 151, 443, 461, 85, 184, 292, 182, ! 22, 172, 363, 40, 86, 330, 347, 50, 347, 710, ! 17, 370, 616, 78, 136, 396, 466, 490, 502, 17, ! 17, 17, 64, 125, 587, 591, 724, 145, 85, 63, ! 172, 86, 22, 63, 140, 141, 86, 265, 653, 121, ! 126, 17, 66, 61, 17, 17, 119, 69, 186, 90, ! 203, 63, 147, 654, 102, 563, 63, 255, 137, 352, ! 257, 108, 17, 85, 610, 61, 614, 178, 427, 147, ! 61, 86, 249, 91, 565, 86, 90, 263, 267, 643, ! 71, 90, 567, 467, 491, 149, 152, 655, 397, 417, ! 125, 628, 85, 447, 580, 703, 133, 711, 86, -153, ! 86, 450, 41, 451, 42, 91, 51, 348, 52, 348, ! -92, -92, 79, 283, 333, 63, 90, 765, 27, 29, ! 90, 63, 86, 182, -291, 592, 770, 139, 339, 61, ! 343, 345, 360, 249, 406, 69, 354, 356, 350, 127, ! 158, 679, 358, 90, 179, 90, 187, 428, 139, 651, ! 435, 54, 56, 695, 564, 59, 674, 651, 285, 743, ! 463, 743, 250, 155, 121, 59, 650, 90, 403, 158, ! 709, 742, -102, 566, 155, 22, -102, 336, 336, 336, ! 336, 568, 287, 63, 670, 336, 336, 359, 418, 485, ! -253, 178, 253, 581, 112, 465, 182, 351, 115, 86, ! 416, 759, 485, 422, 696, 636, 52, 431, 683, 57, ! 613, 434, 695, 58, 725, 695, 699, 720, 691, -95, ! 135, 439, 622, 120, -95, -95, -95, -95, 625, 86, ! 671, 638, 283, 708, 560, 745, 121, 112, 115, 413, ! -95, 130, -95, 652, 90, -95, -95, -95, -95, 621, ! 675, 734, 283, 744, 189, 763, 621, 621, 423, 621, ! 251, 621, 443, 696, 178, 733, 696, 425, 179, 754, ! 762, 662, 86, 454, 90, 699, 720, 285, 699, 615, ! 695, 131, 147, 486, 445, 695, 286, 695, 619, 695, ! 254, 189, 445, 22, 445, 22, 582, 452, 497, 637, ! 767, 287, 505, 476, 478, 705, 432, 584, 146, 155, ! 636, 483, 484, 509, 511, 513, 753, 90, 429, 63, ! 623, 179, 458, 746, 702, 639, 626, 551, 672, 533, ! 598, 696, 414, 69, 374, 443, 696, 599, 696, 47, ! 696, 179, 479, 699, 562, 454, 43, 76, 699, 283, ! 699, 424, 699, 73, 570, 103, 572, 21, 95, 506, ! 426, 89, 336, 336, 336, 336, 336, 336, 336, 336, ! 336, 336, 336, 336, 90, 336, 336, 336, 336, 336, ! 336, 336, 633, 702, 135, 419, 702, 595, 89, 597, ! 95, -63, 433, 89, 555, 189, -319, 632, 321, -63, ! 635, 641, 48, 602, 764, 286, 648, -64, 101, 44, ! 48, 430, 286, 105, 648, 459, 44, 612, 287, 249, ! 286, 443, 286, -29, 2, 171, 28, 604, 89, 30, ! 606, 693, 89, 413, -63, 480, 454, 256, 141, 33, ! 37, -154, -63, 22, 644, 454, 189, 647, -156, 55, ! -64, 702, 507, 60, 171, 89, 702, 89, 702, 163, ! 702, 469, 68, 39, 33, 653, 336, 20, 3, 322, ! 284, 336, 154, 689, 165, 349, 20, 20, 20, 89, ! 654, 146, 59, 684, 503, 5, 121, 147, 163, -319, ! 447, 6, 100, 450, 642, 104, 252, 283, 20, 649, ! 283, 20, 20, 165, 258, 111, 182, 732, 114, 120, ! 148, 80, 22, 52, 715, 22, 749, 321, 150, 20, ! 153, 183, 286, 8, 321, 80, 735, 188, 259, 728, ! 756, 329, 321, 373, 321, 22, 120, 321, 726, 22, ! 365, 731, 285, 82, 761, 285, 83, 22, 22, 59, ! 677, 681, 189, 605, 462, 607, 89, 82, 693, 323, ! 83, 22, 331, 749, 532, 756, 287, 761, 332, 287, ! 136, -32, 2, 283, 178, 464, 468, 554, 22, -31, ! 2, 22, 86, 332, 713, 751, 89, 37, 322, 284, ! 721, 22, -26, 2, 22, 322, 22, 174, 283, 336, ! 336, 18, 155, 322, 22, 322, 22, 22, 322, 284, ! 18, 18, 18, 22, 80, 336, 3, 22, 285, 22, ! 603, 155, 445, 603, 3, 404, 174, 90, 334, 89, ! 123, 346, 18, 5, 321, 18, 18, 3, 324, 6, ! 22, 5, 287, 285, -500, -500, 82, 6, 4, 83, ! 22, 179, 620, 18, 5, -28, 2, 283, 621, 283, ! 6, 22, 22, 366, 92, 755, 371, 287, 7, 758, ! 286, 8, 157, 286, 37, -33, 2, 142, 323, 8, ! 80, 445, 143, 144, 445, 323, 89, 372, 32, 124, ! 36, 38, 8, 323, 392, 323, 92, 39, 323, 157, ! 3, 157, 285, 393, 285, 322, 284, 445, 685, -338, ! -338, 4, 82, 53, 621, 83, 22, 5, 727, 176, ! 3, 445, 498, 6, 621, -136, 287, 730, 287, 394, ! 37, 159, 407, 621, 395, 445, 460, 5, 617, -152, ! 192, 193, 440, 6, 59, 481, 286, 38, 482, 445, ! 286, 444, 365, 39, 445, 8, 445, 324, 445, 448, ! 159, -338, 367, 3, 324, -338, 368, 380, 381, 80, ! 369, 286, 324, 457, 324, 8, 487, 324, -501, -501, ! 3, 325, 321, 194, 195, 321, 80, 583, 80, 499, ! 375, 376, 326, 498, 500, 323, 492, 196, 501, -27, ! 2, 82, 488, 197, 83, 22, 489, 573, 22, 286, ! 198, 574, 286, 177, 199, 398, 399, 321, 82, 321, ! 82, 83, 22, 83, 22, -30, 2, 200, 201, 473, ! 286, 202, 286, 203, 618, 286, 498, 377, 378, 379, ! 204, 205, 206, 207, 3, 588, 208, 209, 141, 286, ! -340, -340, 590, 322, 284, 4, 322, 284, 321, 600, ! 499, 5, 321, 286, 624, 500, 704, 6, 630, 501, ! 3, 327, 410, 411, 324, 629, 412, 286, 634, 22, ! 650, 4, 286, 321, 286, 640, 286, 5, 322, 660, ! 322, 321, 737, 6, 666, 738, 390, 391, 34, 8, ! 325, 688, -340, 499, -409, -409, -340, 325, 500, 667, ! 3, 326, 501, -410, -410, 325, 80, 325, 326, 34, ! 325, 321, 22, 34, 321, 8, 326, -367, 326, 322, ! 284, 326, 668, 322, 709, 3, 143, 144, 437, 89, ! 34, 80, 321, 323, 321, 722, 323, 321, 82, 515, ! 517, 83, 22, 592, 322, 284, 382, 383, 384, -365, ! 768, 321, 322, 536, 538, 772, 736, 774, -204, 775, ! 470, 471, 472, 82, 742, 321, 83, 22, 323, 740, ! 323, 739, 321, -23, -23, 401, 519, 521, 523, 321, ! 327, 321, 322, 741, 321, 322, 321, 327, 321, 748, ! 385, 386, 387, 388, 759, 327, 760, 327, 750, 769, ! 327, 678, 766, 322, 284, 322, 284, 325, 322, 323, ! 771, 773, 324, 323, -23, 324, 438, 777, 326, -23, ! -23, -23, 322, 778, 35, -23, -16, 77, 534, -23, ! 389, -499, -499, 367, 323, 110, 322, 368, -499, -499, ! 367, 436, 323, 322, 368, 328, 262, 324, 369, 324, ! 322, 80, 322, 190, 402, 322, -16, 322, 260, 322, ! 196, -499, -499, 367, 558, 75, 197, 368, 409, 129, ! 442, 369, 323, 198, -16, 323, 453, 199, 645, -499, ! -499, 367, 716, 82, 456, 368, 83, 22, 324, 631, ! 200, 201, 324, 323, 202, 323, 717, 327, 323, 646, ! 123, 477, 341, 204, 205, 206, 207, 540, 544, 208, ! 209, 546, 323, 324, -499, -499, 367, 542, 548, 687, ! 368, 324, 0, 553, 436, 0, 323, 525, 527, 529, ! 531, 0, 0, 323, 0, 0, 0, 0, 0, 0, ! 323, 0, 323, 0, 37, 323, 0, 323, 0, 323, ! 80, 324, 0, 0, 324, 325, 0, 0, 325, 124, ! 0, 38, 0, 0, 328, 0, 326, 39, 340, 326, ! 192, 328, 324, 0, 324, 0, 0, 324, 0, 328, ! 0, 328, 82, 0, 328, 83, 22, 0, 0, 0, ! 325, 324, 325, 0, 0, 0, 0, 0, 0, 0, ! 0, 326, 0, 326, 0, 324, 0, 0, 0, 0, ! 0, 0, 324, 194, 195, 0, 0, 0, 80, 324, ! 0, 324, 0, 0, 324, 0, 324, 196, 324, 0, ! 0, 325, 0, 197, 0, 325, 0, 0, 0, 0, ! 198, 0, 326, 0, 199, 327, 326, 0, 327, 0, ! 82, 0, 0, 83, 22, 0, 325, 200, 201, 0, ! 0, 202, 0, 0, 325, 0, 0, 326, 0, 0, ! 204, 205, 206, 207, 0, 326, 208, 209, 0, 0, ! 327, 328, 327, 337, 337, 337, 337, 0, 0, 0, ! 0, 337, 337, 0, 325, 0, 0, 325, 0, 0, ! 0, 3, 0, 0, 0, 326, 0, 80, 326, 0, ! 0, 0, 0, 0, 0, 325, 81, 325, 5, 0, ! 325, 327, 0, 0, 6, 327, 326, 0, 326, 0, ! 0, 326, 0, 0, 325, 0, 0, 0, 0, 82, ! 0, 0, 83, 22, 0, 326, 327, 0, 325, 0, ! 0, 0, 155, 156, 327, 325, 8, 0, 0, 326, ! 0, 0, 325, 0, 325, 0, 326, 325, 0, 325, ! 0, 325, 0, 326, 0, 326, 0, 0, 326, 3, ! 326, 0, 326, 0, 327, 80, 0, 327, 0, 0, ! 0, 0, 0, 0, 81, 0, 5, 0, 0, 0, ! 0, 0, 6, 0, 0, 327, 0, 327, 0, 0, ! 327, 0, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 0, 327, 0, 0, 0, 0, 328, ! 155, 261, 328, 0, 8, 0, 0, 0, 327, 0, ! 0, 0, 0, 0, 0, 327, 0, 0, 0, 579, ! 0, 0, 327, 0, 327, 0, 0, 327, 0, 327, ! 0, 327, 0, 0, 328, 0, 328, 0, 337, 337, ! 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, ! 0, 337, 337, 337, 337, 337, 337, 337, 338, 338, ! 338, 338, 0, -286, -286, -286, 338, 338, 0, -286, ! 0, 0, 0, 0, 0, 328, 0, 0, -286, 328, ! 191, 0, 192, 193, -286, 0, 0, 0, 0, 0, ! 0, -286, 0, 0, 0, -286, 0, 0, 0, 0, ! 328, -286, 0, 0, -286, -286, 0, 0, 328, 0, ! 0, 0, -286, 0, 0, 0, 0, 0, -286, 0, ! 0, -286, -286, -286, -286, 194, 195, -286, -286, 0, ! 80, 0, 0, 0, 0, 0, 0, 0, 328, 196, ! 0, 328, 337, 0, 0, 197, 0, 337, 0, 0, ! 0, 0, 198, 0, 0, 0, 199, 0, 0, 328, ! 0, 328, 82, 0, 328, 83, 22, 0, 0, 200, ! 201, 0, 0, 202, 0, 203, 0, 0, 328, 0, ! 3, 0, 204, 205, 206, 207, 80, 3, 208, 209, ! 0, 0, 328, 80, 0, 81, 0, 5, 0, 328, ! 0, 0, 81, 6, 5, 0, 328, 0, 328, 0, ! 6, 328, 0, 328, 0, 328, 0, 0, 82, 0, ! 0, 83, 22, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 84, 0, 268, 0, 0, 0, 0, 128, ! 0, 0, 0, 338, 338, 338, 338, 338, 338, 338, ! 338, 338, 338, 338, 338, 0, 338, 338, 338, 338, ! 338, 338, 338, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 337, 337, 0, 3, 194, ! 195, 653, 269, 270, 80, 271, 0, 0, 272, 0, ! 0, 337, 273, 196, 0, 0, 654, 0, 0, 274, ! 275, 6, 276, 0, 277, 278, 198, 279, 0, 268, ! 280, 0, 0, 0, 0, 0, 82, 0, 0, 83, ! 22, 0, 0, 0, 0, 0, 0, 281, 0, 155, ! 718, 0, 0, 8, 0, 0, 204, 205, 206, 207, ! 0, 0, 208, 209, 0, 0, 0, 338, 0, 0, ! 0, 0, 338, 3, 194, 195, 653, 269, 270, 80, ! 271, 0, 0, 272, 0, 0, 0, 273, 196, 0, ! 0, 654, 0, 0, 274, 275, 6, 276, 0, 277, ! 278, 198, 279, 268, 0, 280, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 0, 0, ! 0, 0, 281, 0, 155, 747, 0, 0, 8, 0, 0, 204, 205, 206, 207, 0, 0, 208, 209, 0, ! 0, 0, 0, 0, 0, 0, 0, 3, 194, 195, ! -263, 269, 270, 80, 271, 0, 0, 272, 0, 0, ! 0, 273, 196, 0, 0, -263, 0, 0, 274, 275, ! 6, 276, 0, 277, 278, 198, 279, 268, 0, 280, ! 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 0, 0, 0, 0, 281, 0, 155, -263, ! 338, 338, 8, 0, 0, 204, 205, 206, 207, 0, ! 0, 208, 209, 0, 0, 0, 338, 0, 0, 0, ! 0, 3, 194, 195, 0, 269, 270, 80, 271, 0, ! 0, 272, 0, 0, 0, 273, 196, 0, 0, 0, ! 0, 0, 274, 275, 6, 276, 268, 277, 278, 198, ! 279, 0, 0, 280, 0, 0, 0, 0, 0, 82, ! 0, 0, 83, 22, 0, 0, 0, 0, 0, 0, ! 281, 0, 155, 441, 0, 0, 8, 0, 0, 204, ! 205, 206, 207, 0, 0, 208, 209, 0, 0, 0, ! 3, 194, 195, 0, 269, 270, 80, 271, 0, 0, ! 272, 0, 0, 0, 273, 196, 0, 0, 0, 0, ! 0, 274, 275, 6, 276, 268, 277, 278, 198, 279, ! 0, 0, 280, 0, 0, 0, 0, 0, 82, 0, ! 0, 83, 22, 0, 0, 0, 0, 0, 0, 281, ! 0, 155, 0, 0, 0, 8, 0, 0, 204, 205, ! 206, 207, 0, 0, 208, 209, 0, 0, 0, 3, ! 194, 195, 0, 269, 270, 80, 271, 0, 0, 272, ! 0, 0, 0, 273, 196, 0, 0, 0, 0, 0, ! 274, 275, 268, 276, 0, 277, 278, 198, 279, 0, ! 0, 280, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 0, 0, 0, 0, 0, 281, 0, 155, 0, 0, 0, 8, 0, 0, 204, 205, 206, ! 207, 0, 0, 208, 209, 0, 3, 194, 195, 0, ! 692, 270, 80, 271, 0, 0, 272, 0, 0, 0, ! 273, 196, 0, 420, 0, 192, 193, 274, 275, 0, ! 276, 0, 277, 278, 198, 279, 0, 0, 280, 0, ! 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, ! 0, 0, 0, 0, 0, 281, 0, 155, 0, 0, ! 0, 8, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 496, 0, 192, 193, 0, 0, ! 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, ! 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, ! 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, ! 195, 0, 421, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 549, 0, 192, 193, 197, ! 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, ! 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, ! 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, ! 0, 0, 146, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 585, 0, 192, 193, ! 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, ! 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, ! 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 550, 200, 201, 0, 0, 202, 0, ! 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 593, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, ! 586, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 601, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, ! 202, 0, 0, 194, 195, 0, 594, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 608, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 146, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 585, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, ! 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, ! 0, 0, 202, 609, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 706, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, ! 201, 0, 0, 202, 690, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 706, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, ! 200, 201, 0, 0, 202, 707, 0, 194, 195, 0, ! 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 593, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, ! 0, 200, 201, 0, 0, 202, 752, 0, 0, 0, ! 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 335, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, ! 195, 0, 757, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 342, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, ! 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 344, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, ! 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 353, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, ! 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 355, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, ! 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 357, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 415, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 504, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 508, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 510, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 512, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 514, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 516, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 518, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 520, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 522, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 524, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 526, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 528, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 530, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 535, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 537, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 539, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 541, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 543, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 545, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 547, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 552, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 561, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 569, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 571, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 596, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, ! 194, 195, 208, 209, 0, 80, 611, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, ! 207, 0, 0, 208, 209, 196, 0, 676, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, ! 206, 207, 194, 195, 208, 209, 0, 80, 680, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, ! 205, 206, 207, 0, 0, 208, 209, 196, 0, 686, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 712, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 663, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 723, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, ! 0, 0, 0, 0, 281, -294, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 661, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, ! 192, 193, 0, 0, 0, 281, -294, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, ! 0, 0, 0, 194, 195, 198, 0, 0, 80, 199, ! 0, 0, 0, 0, 0, 82, 0, 196, 83, 22, ! 0, 192, 193, 197, 0, 0, 281, 0, 0, 0, ! 198, 0, 0, 0, 199, 204, 205, 206, 207, 0, ! 82, 208, 209, 83, 22, 0, 0, 200, 201, 0, ! 0, 202, 0, 203, 361, 0, 0, 0, 362, 0, 204, 205, 206, 207, 194, 195, 208, 209, 0, 80, ! 0, 0, 192, 193, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, 201, ! 0, 0, 202, 493, 0, 194, 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, 209, 196, ! 0, 0, 0, 192, 193, 197, 0, 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, 0, ! 0, 0, 82, 0, 0, 83, 22, 0, 0, 200, ! 201, 0, 0, 202, 627, 0, 0, 0, 0, 0, ! 0, 0, 204, 205, 206, 207, 194, 195, 208, 209, ! 0, 80, 0, 0, 192, 193, 0, 0, 0, 0, ! 196, 0, 0, 0, 0, 0, 197, 0, 0, 0, ! 0, 0, 0, 198, 0, 0, 0, 199, 0, 0, ! 0, 0, 0, 82, 0, 0, 83, 22, 0, 0, ! 200, 201, 0, 0, 202, 669, 0, 194, 195, 0, ! 0, 0, 80, 204, 205, 206, 207, 0, 0, 208, ! 209, 196, 0, 0, 0, 192, 193, 197, 0, 0, ! 0, 0, 0, 0, 198, 0, 0, 0, 199, 0, ! 0, 0, 0, 0, 82, 0, 0, 83, 22, 0, ! 0, 200, 201, 0, 0, 202, 682, 0, 0, 0, ! 0, 0, 0, 0, 204, 205, 206, 207, 194, 195, ! 208, 209, 0, 80, 0, 0, 0, 0, 0, 0, ! 0, 0, 196, 0, 0, 0, 0, 0, 197, 0, ! 0, 0, 0, 0, 0, 198, 0, 0, 0, 199, ! 0, 0, 0, 0, 0, 82, 0, 0, 83, 22, ! 0, 0, 200, 201, 0, 0, 202, 0, 3, 194, ! 195, 0, 0, 0, 80, 204, 205, 206, 207, 0, ! 0, 208, 209, 196, 0, 0, 0, 0, 0, 197, ! 0, 0, 0, 0, 0, 0, 198, 0, 0, 80, ! 199, 0, 0, 0, 0, 0, 82, 0, 196, 83, ! 22, 0, 0, 0, 197, 0, 0, 281, 0, 0, ! 0, 198, 0, 0, 0, 199, 204, 205, 206, 207, ! 0, 82, 208, 209, 83, 22, 0, 0, 200, 201, ! 0, 0, 202, 0, 0, 0, 0, 0, 0, 0, ! 0, 204, 205, 206, 207, 0, 0, 208, 209 }; static const short yycheck[] = { 4, ! 134, 312, 7, 125, 292, 332, 64, 136, 173, 135, ! 87, 131, 203, 1, 64, 178, 1, 1, 1, 1, ! 1, 1, 486, 1, 54, 15, 1, 1, 73, 10, ! 11, 12, 96, 91, 440, 1, 666, 119, 96, 44, ! 160, 91, 87, 48, 100, 101, 96, 167, 48, 86, ! 1, 32, 101, 44, 35, 36, 85, 48, 1, 64, ! 96, 66, 98, 63, 67, 1, 71, 149, 98, 198, ! 152, 74, 53, 131, 480, 66, 95, 135, 1, 98, ! 71, 131, 142, 64, 1, 135, 91, 1, 170, 1, ! 53, 96, 1, 68, 68, 124, 125, 97, 88, 1, ! 158, 507, 160, 299, 1, 1, 109, 89, 158, 94, ! 160, 307, 100, 309, 102, 96, 100, 102, 102, 102, ! 100, 101, 100, 173, 182, 130, 131, 757, 5, 6, ! 135, 136, 182, 259, 100, 101, 766, 1, 192, 130, ! 194, 195, 202, 203, 264, 136, 200, 201, 198, 100, ! 131, 615, 202, 158, 135, 160, 99, 277, 1, 1, ! 282, 38, 39, 637, 100, 42, 1, 1, 173, 1, ! 333, 1, 1, 96, 211, 52, 1, 182, 260, 160, ! 1, 1, 96, 100, 96, 87, 100, 192, 193, 194, ! 195, 100, 173, 198, 600, 200, 201, 202, 100, 1, ! 96, 259, 1, 100, 81, 334, 332, 198, 85, 259, ! 270, 1, 1, 273, 637, 1, 102, 1, 624, 1, ! 1, 281, 696, 5, 1, 699, 637, 658, 634, 93, ! 94, 289, 1, 98, 98, 99, 100, 101, 1, 289, ! 1, 1, 292, 649, 409, 1, 283, 124, 125, 1, ! 93, 101, 95, 95, 259, 98, 99, 100, 101, 101, ! 95, 95, 312, 95, 141, 95, 101, 101, 1, 101, ! 99, 101, 560, 696, 332, 100, 699, 1, 259, 100, ! 100, 592, 332, 594, 289, 696, 717, 292, 699, 95, ! 764, 96, 98, 95, 299, 769, 173, 771, 489, 773, ! 99, 178, 307, 87, 309, 87, 95, 312, 368, 95, ! 100, 292, 372, 350, 351, 642, 100, 439, 99, 96, ! 1, 358, 359, 377, 378, 379, 732, 332, 1, 334, ! 99, 312, 1, 89, 637, 95, 99, 397, 99, 389, ! 95, 764, 94, 334, 221, 633, 769, 102, 771, 1, ! 773, 332, 1, 764, 414, 666, 1, 1, 769, 409, ! 771, 94, 773, 1, 424, 1, 426, 1, 64, 1, ! 94, 64, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, ! 395, 396, 557, 696, 94, 272, 699, 457, 91, 459, ! 96, 53, 279, 96, 409, 282, 1, 557, 173, 53, ! 560, 1, 64, 473, 95, 292, 1, 53, 66, 64, ! 64, 94, 299, 71, 1, 94, 64, 481, 409, 489, ! 307, 719, 309, 0, 1, 131, 1, 474, 131, 1, ! 477, 637, 135, 1, 96, 94, 757, 100, 101, 10, ! 45, 96, 96, 87, 574, 766, 333, 577, 96, 1, ! 96, 764, 94, 1, 160, 158, 769, 160, 771, 131, ! 773, 348, 1, 68, 35, 48, 481, 1, 45, 173, ! 173, 486, 130, 633, 131, 1, 10, 11, 12, 182, ! 63, 99, 369, 627, 371, 62, 533, 98, 160, 94, ! 696, 68, 1, 699, 94, 1, 1, 557, 32, 94, ! 560, 35, 36, 160, 97, 1, 642, 94, 1, 98, ! 1, 51, 87, 102, 97, 87, 722, 292, 1, 53, ! 1, 1, 409, 100, 299, 51, 94, 1, 94, 673, ! 736, 1, 307, 1, 309, 87, 98, 312, 668, 87, ! 102, 685, 557, 83, 750, 560, 86, 87, 87, 436, ! 614, 621, 439, 476, 1, 478, 259, 83, 764, 173, ! 86, 87, 95, 769, 1, 771, 557, 773, 101, 560, ! 54, 0, 1, 633, 642, 1, 1, 95, 87, 0, ! 1, 87, 642, 101, 654, 729, 289, 45, 292, 292, ! 660, 87, 0, 1, 87, 299, 87, 131, 658, 614, ! 615, 1, 96, 307, 87, 309, 87, 87, 312, 312, ! 10, 11, 12, 87, 51, 630, 45, 87, 633, 87, ! 474, 96, 637, 477, 45, 100, 160, 642, 101, 332, ! 1, 102, 32, 62, 409, 35, 36, 45, 173, 68, ! 87, 62, 633, 658, 92, 93, 83, 68, 56, 86, ! 87, 642, 95, 53, 62, 0, 1, 717, 101, 719, ! 68, 87, 87, 102, 64, 735, 102, 658, 76, 739, ! 557, 100, 131, 560, 45, 0, 1, 93, 292, 100, ! 51, 696, 98, 99, 699, 299, 389, 98, 10, 60, ! 12, 62, 100, 307, 11, 309, 96, 68, 312, 158, ! 45, 160, 717, 12, 719, 409, 409, 722, 95, 46, ! 47, 56, 83, 35, 101, 86, 87, 62, 95, 1, ! 45, 736, 1, 68, 101, 96, 717, 95, 719, 13, ! 45, 131, 96, 101, 14, 750, 1, 62, 1, 94, ! 3, 4, 94, 68, 631, 95, 633, 62, 98, 764, ! 637, 100, 102, 68, 769, 100, 771, 292, 773, 100, ! 160, 98, 94, 45, 299, 102, 98, 3, 4, 51, ! 102, 658, 307, 100, 309, 100, 97, 312, 92, 93, ! 45, 173, 557, 46, 47, 560, 51, 66, 51, 68, ! 46, 47, 173, 1, 73, 409, 68, 60, 77, 0, ! 1, 83, 97, 66, 86, 87, 101, 61, 87, 696, ! 73, 65, 699, 95, 77, 92, 93, 592, 83, 594, ! 83, 86, 87, 86, 87, 0, 1, 90, 91, 98, ! 717, 94, 719, 96, 97, 722, 1, 5, 6, 7, ! 103, 104, 105, 106, 45, 96, 109, 110, 101, 736, ! 46, 47, 67, 557, 557, 56, 560, 560, 633, 94, ! 68, 62, 637, 750, 94, 73, 1, 68, 89, 77, ! 45, 173, 96, 97, 409, 1, 100, 764, 94, 87, ! 1, 56, 769, 658, 771, 95, 773, 62, 592, 94, ! 594, 666, 696, 68, 100, 699, 16, 17, 11, 100, ! 292, 66, 98, 68, 46, 47, 102, 299, 73, 95, ! 45, 292, 77, 46, 47, 307, 51, 309, 299, 32, ! 312, 696, 87, 36, 699, 100, 307, 96, 309, 633, ! 633, 312, 95, 637, 1, 45, 98, 99, 1, 642, ! 53, 51, 717, 557, 719, 95, 560, 722, 83, 380, ! 381, 86, 87, 101, 658, 658, 8, 9, 10, 96, ! 764, 736, 666, 390, 391, 769, 57, 771, 57, 773, ! 98, 99, 100, 83, 1, 750, 86, 87, 592, 95, ! 594, 100, 757, 46, 47, 95, 382, 383, 384, 764, ! 292, 766, 696, 95, 769, 699, 771, 299, 773, 95, ! 18, 19, 20, 21, 1, 307, 100, 309, 95, 95, ! 312, 1, 100, 717, 717, 719, 719, 409, 722, 633, ! 57, 95, 557, 637, 87, 560, 89, 0, 409, 92, ! 93, 94, 736, 0, 12, 98, 87, 56, 389, 102, ! 58, 92, 93, 94, 658, 77, 750, 98, 92, 93, ! 94, 102, 666, 757, 98, 173, 160, 592, 102, 594, ! 764, 51, 766, 141, 259, 769, 87, 771, 158, 773, ! 60, 92, 93, 94, 409, 54, 66, 98, 266, 96, ! 292, 102, 696, 73, 87, 699, 312, 77, 575, 92, ! 93, 94, 656, 83, 312, 98, 86, 87, 633, 102, ! 90, 91, 637, 717, 94, 719, 656, 409, 722, 575, ! 1, 351, 193, 103, 104, 105, 106, 392, 394, 109, ! 110, 395, 736, 658, 92, 93, 94, 393, 396, 630, ! 98, 666, -1, 400, 102, -1, 750, 385, 386, 387, ! 388, -1, -1, 757, -1, -1, -1, -1, -1, -1, ! 764, -1, 766, -1, 45, 769, -1, 771, -1, 773, ! 51, 696, -1, -1, 699, 557, -1, -1, 560, 60, ! -1, 62, -1, -1, 292, -1, 557, 68, 1, 560, ! 3, 299, 717, -1, 719, -1, -1, 722, -1, 307, ! -1, 309, 83, -1, 312, 86, 87, -1, -1, -1, ! 592, 736, 594, -1, -1, -1, -1, -1, -1, -1, ! -1, 592, -1, 594, -1, 750, -1, -1, -1, -1, ! -1, -1, 757, 46, 47, -1, -1, -1, 51, 764, ! -1, 766, -1, -1, 769, -1, 771, 60, 773, -1, ! -1, 633, -1, 66, -1, 637, -1, -1, -1, -1, ! 73, -1, 633, -1, 77, 557, 637, -1, 560, -1, ! 83, -1, -1, 86, 87, -1, 658, 90, 91, -1, ! -1, 94, -1, -1, 666, -1, -1, 658, -1, -1, ! 103, 104, 105, 106, -1, 666, 109, 110, -1, -1, ! 592, 409, 594, 192, 193, 194, 195, -1, -1, -1, ! -1, 200, 201, -1, 696, -1, -1, 699, -1, -1, ! -1, 45, -1, -1, -1, 696, -1, 51, 699, -1, ! -1, -1, -1, -1, -1, 717, 60, 719, 62, -1, ! 722, 633, -1, -1, 68, 637, 717, -1, 719, -1, ! -1, 722, -1, -1, 736, -1, -1, -1, -1, 83, ! -1, -1, 86, 87, -1, 736, 658, -1, 750, -1, ! -1, -1, 96, 97, 666, 757, 100, -1, -1, 750, ! -1, -1, 764, -1, 766, -1, 757, 769, -1, 771, ! -1, 773, -1, 764, -1, 766, -1, -1, 769, 45, ! 771, -1, 773, -1, 696, 51, -1, 699, -1, -1, ! -1, -1, -1, -1, 60, -1, 62, -1, -1, -1, ! -1, -1, 68, -1, -1, 717, -1, 719, -1, -1, ! 722, -1, -1, -1, -1, -1, -1, 83, -1, -1, ! 86, 87, -1, -1, 736, -1, -1, -1, -1, 557, ! 96, 97, 560, -1, 100, -1, -1, -1, 750, -1, ! -1, -1, -1, -1, -1, 757, -1, -1, -1, 1, ! -1, -1, 764, -1, 766, -1, -1, 769, -1, 771, ! -1, 773, -1, -1, 592, -1, 594, -1, 377, 378, ! 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, ! -1, 390, 391, 392, 393, 394, 395, 396, 192, 193, ! 194, 195, -1, 45, 46, 47, 200, 201, -1, 51, ! -1, -1, -1, -1, -1, 633, -1, -1, 60, 637, ! 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, ! -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, ! 658, 83, -1, -1, 86, 87, -1, -1, 666, -1, ! -1, -1, 94, -1, -1, -1, -1, -1, 100, -1, ! -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, ! 51, -1, -1, -1, -1, -1, -1, -1, 696, 60, ! -1, 699, 481, -1, -1, 66, -1, 486, -1, -1, ! -1, -1, 73, -1, -1, -1, 77, -1, -1, 717, ! -1, 719, 83, -1, 722, 86, 87, -1, -1, 90, ! 91, -1, -1, 94, -1, 96, -1, -1, 736, -1, ! 45, -1, 103, 104, 105, 106, 51, 45, 109, 110, ! -1, -1, 750, 51, -1, 60, -1, 62, -1, 757, ! -1, -1, 60, 68, 62, -1, 764, -1, 766, -1, ! 68, 769, -1, 771, -1, 773, -1, -1, 83, -1, ! -1, 86, 87, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, 97, -1, 1, -1, -1, -1, -1, 97, ! -1, -1, -1, 377, 378, 379, 380, 381, 382, 383, ! 384, 385, 386, 387, 388, -1, 390, 391, 392, 393, ! 394, 395, 396, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, 614, 615, -1, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, 55, -1, ! -1, 630, 59, 60, -1, -1, 63, -1, -1, 66, ! 67, 68, 69, -1, 71, 72, 73, 74, -1, 1, ! 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, ! 87, -1, -1, -1, -1, -1, -1, 94, -1, 96, ! 97, -1, -1, 100, -1, -1, 103, 104, 105, 106, ! -1, -1, 109, 110, -1, -1, -1, 481, -1, -1, ! -1, -1, 486, 45, 46, 47, 48, 49, 50, 51, 52, -1, -1, 55, -1, -1, -1, 59, 60, -1, ! -1, 63, -1, -1, 66, 67, 68, 69, -1, 71, ! 72, 73, 74, 1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, -1, -1, ! -1, -1, 94, -1, 96, 97, -1, -1, 100, -1, -1, 103, 104, 105, 106, -1, -1, 109, 110, -1, ! -1, -1, -1, -1, -1, -1, -1, 45, 46, 47, ! 48, 49, 50, 51, 52, -1, -1, 55, -1, -1, ! -1, 59, 60, -1, -1, 63, -1, -1, 66, 67, ! 68, 69, -1, 71, 72, 73, 74, 1, -1, 77, ! -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, -1, -1, -1, -1, 94, -1, 96, 97, ! 614, 615, 100, -1, -1, 103, 104, 105, 106, -1, ! -1, 109, 110, -1, -1, -1, 630, -1, -1, -1, ! -1, 45, 46, 47, -1, 49, 50, 51, 52, -1, ! -1, 55, -1, -1, -1, 59, 60, -1, -1, -1, ! -1, -1, 66, 67, 68, 69, 1, 71, 72, 73, ! 74, -1, -1, 77, -1, -1, -1, -1, -1, 83, ! -1, -1, 86, 87, -1, -1, -1, -1, -1, -1, ! 94, -1, 96, 97, -1, -1, 100, -1, -1, 103, ! 104, 105, 106, -1, -1, 109, 110, -1, -1, -1, ! 45, 46, 47, -1, 49, 50, 51, 52, -1, -1, ! 55, -1, -1, -1, 59, 60, -1, -1, -1, -1, ! -1, 66, 67, 68, 69, 1, 71, 72, 73, 74, ! -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, ! -1, 86, 87, -1, -1, -1, -1, -1, -1, 94, ! -1, 96, -1, -1, -1, 100, -1, -1, 103, 104, ! 105, 106, -1, -1, 109, 110, -1, -1, -1, 45, 46, 47, -1, 49, 50, 51, 52, -1, -1, 55, ! -1, -1, -1, 59, 60, -1, -1, -1, -1, -1, ! 66, 67, 1, 69, -1, 71, 72, 73, 74, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, -1, -1, -1, -1, 94, -1, 96, -1, -1, -1, 100, -1, -1, 103, 104, 105, ! 106, -1, -1, 109, 110, -1, 45, 46, 47, -1, ! 49, 50, 51, 52, -1, -1, 55, -1, -1, -1, ! 59, 60, -1, 1, -1, 3, 4, 66, 67, -1, ! 69, -1, 71, 72, 73, 74, -1, -1, 77, -1, ! -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, ! -1, -1, -1, -1, -1, 94, -1, 96, -1, -1, ! -1, 100, -1, -1, 103, 104, 105, 106, 46, 47, ! 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, ! -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, ! -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, ! -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, 90, 91, -1, -1, 94, -1, -1, 46, ! 47, -1, 100, -1, 51, 103, 104, 105, 106, -1, ! -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, ! -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, ! 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, ! 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, ! -1, -1, 99, -1, -1, -1, 103, 104, 105, 106, ! 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, ! -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, ! 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, ! -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, ! 86, 87, -1, 89, 90, 91, -1, -1, 94, -1, ! -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, ! 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, ! 95, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, ! 94, -1, -1, 46, 47, -1, 100, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, *************** static const short yycheck[] = { 4, *** 2025,2032 **** 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, ! -1, 83, -1, -1, 86, 87, -1, 89, 90, 91, ! -1, -1, 94, -1, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, --- 2062,2069 ---- 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, ! -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, ! -1, -1, 94, 95, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, *************** static const short yycheck[] = { 4, *** 2037,2077 **** 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, ! 90, 91, -1, -1, 94, -1, -1, 46, 47, -1, ! 100, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, ! -1, 90, 91, -1, -1, 94, -1, -1, -1, -1, ! 99, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, 90, 91, -1, -1, 94, 95, -1, 46, ! 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, ! 87, -1, -1, 90, 91, -1, -1, 94, 95, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, ! 86, 87, -1, -1, 90, 91, -1, -1, 94, 95, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, ! 95, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, ! 94, -1, -1, 46, 47, -1, 100, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, --- 2074,2114 ---- 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, ! 90, 91, -1, -1, 94, 95, -1, 46, 47, -1, ! -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, ! -1, 90, 91, -1, -1, 94, 95, -1, -1, -1, ! -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, 90, 91, -1, -1, 94, -1, -1, 46, ! 47, -1, 100, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, ! 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, ! 86, 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, ! -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, ! 94, -1, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, *************** static const short yycheck[] = { 4, *** 2252,2349 **** -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, ! -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, ! -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, ! 90, 91, -1, -1, 94, -1, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, ! 110, 60, -1, 1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, ! -1, 90, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, ! 109, 110, -1, 51, 1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, ! -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, ! -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, 90, 91, -1, -1, 94, -1, -1, 46, ! 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, ! -1, 109, 110, 60, -1, 1, -1, 3, 4, 66, ! -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, ! 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, ! 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, ! -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, ! 46, 47, 109, 110, -1, 51, 1, -1, -1, -1, ! -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, ! 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, ! -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, ! 86, 87, -1, -1, 90, 91, -1, -1, 94, 44, ! -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, ! 106, -1, -1, 109, 110, 60, -1, 1, -1, -1, ! -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, ! -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, ! -1, 86, 87, -1, -1, -1, -1, -1, -1, 94, ! -1, -1, -1, -1, -1, 100, -1, -1, 103, 104, ! 105, 106, 46, 47, 109, 110, -1, 51, 1, -1, ! -1, -1, -1, -1, -1, -1, 60, -1, -1, -1, ! -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, ! -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, ! -1, -1, 86, 87, -1, -1, -1, -1, -1, -1, ! 94, 95, -1, 46, 47, -1, -1, -1, 51, 103, ! 104, 105, 106, -1, -1, 109, 110, 60, -1, 1, ! -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, ! 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, ! 83, -1, -1, 86, 87, -1, 3, 4, -1, -1, ! -1, 94, 95, -1, -1, -1, -1, -1, -1, -1, ! 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, ! -1, -1, -1, -1, -1, -1, -1, -1, 60, -1, ! -1, -1, -1, -1, 66, -1, -1, -1, -1, 46, ! 47, 73, -1, -1, 51, 77, -1, -1, -1, -1, ! -1, 83, -1, 60, 86, 87, -1, 3, 4, 66, ! -1, -1, 94, -1, -1, -1, 73, -1, -1, -1, ! 77, 103, 104, 105, 106, -1, 83, 109, 110, 86, ! 87, -1, -1, 90, 91, -1, -1, 94, -1, 96, ! 97, -1, -1, -1, -1, -1, 103, 104, 105, 106, ! 46, 47, 109, 110, -1, 51, -1, -1, 3, 4, ! -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, ! 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, ! -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, ! 86, 87, -1, -1, 90, 91, -1, -1, 94, 95, ! -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, ! 106, -1, -1, 109, 110, 60, -1, -1, -1, 3, ! 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, ! -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, ! -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, ! 95, -1, -1, -1, -1, -1, -1, -1, 103, 104, ! 105, 106, 46, 47, 109, 110, -1, 51, -1, -1, ! 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, ! -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, ! -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, ! -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, ! 94, 95, -1, 46, 47, -1, -1, -1, 51, 103, ! 104, 105, 106, -1, -1, 109, 110, 60, -1, -1, ! -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, ! 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, ! 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, ! -1, 94, 95, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, ! -1, -1, -1, -1, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, ! -1, -1, 94, 44, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, ! -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, ! -1, -1, 83, -1, -1, 86, 87, -1, -1, -1, ! -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, ! -1, -1, 103, 104, 105, 106, -1, -1, 109, 110 }; #define YYPURE 1 --- 2289,2355 ---- -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, ! -1, 1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, ! -1, 51, 1, -1, -1, -1, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, ! -1, -1, -1, -1, 94, 95, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, ! 110, 60, -1, 1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, ! 3, 4, -1, -1, -1, 94, 95, -1, -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, ! 109, 110, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, ! -1, -1, -1, 46, 47, 73, -1, -1, 51, 77, ! -1, -1, -1, -1, -1, 83, -1, 60, 86, 87, ! -1, 3, 4, 66, -1, -1, 94, -1, -1, -1, ! 73, -1, -1, -1, 77, 103, 104, 105, 106, -1, ! 83, 109, 110, 86, 87, -1, -1, 90, 91, -1, ! -1, 94, -1, 96, 97, -1, -1, -1, 101, -1, 103, 104, 105, 106, 46, 47, 109, 110, -1, 51, ! -1, -1, 3, 4, -1, -1, -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, 91, ! -1, -1, 94, 95, -1, 46, 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, 110, 60, ! -1, -1, -1, 3, 4, 66, -1, -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, -1, ! -1, -1, 83, -1, -1, 86, 87, -1, -1, 90, ! 91, -1, -1, 94, 95, -1, -1, -1, -1, -1, ! -1, -1, 103, 104, 105, 106, 46, 47, 109, 110, ! -1, 51, -1, -1, 3, 4, -1, -1, -1, -1, ! 60, -1, -1, -1, -1, -1, 66, -1, -1, -1, ! -1, -1, -1, 73, -1, -1, -1, 77, -1, -1, ! -1, -1, -1, 83, -1, -1, 86, 87, -1, -1, ! 90, 91, -1, -1, 94, 95, -1, 46, 47, -1, ! -1, -1, 51, 103, 104, 105, 106, -1, -1, 109, ! 110, 60, -1, -1, -1, 3, 4, 66, -1, -1, ! -1, -1, -1, -1, 73, -1, -1, -1, 77, -1, ! -1, -1, -1, -1, 83, -1, -1, 86, 87, -1, ! -1, 90, 91, -1, -1, 94, 95, -1, -1, -1, ! -1, -1, -1, -1, 103, 104, 105, 106, 46, 47, ! 109, 110, -1, 51, -1, -1, -1, -1, -1, -1, ! -1, -1, 60, -1, -1, -1, -1, -1, 66, -1, ! -1, -1, -1, -1, -1, 73, -1, -1, -1, 77, ! -1, -1, -1, -1, -1, 83, -1, -1, 86, 87, ! -1, -1, 90, 91, -1, -1, 94, -1, 45, 46, ! 47, -1, -1, -1, 51, 103, 104, 105, 106, -1, ! -1, 109, 110, 60, -1, -1, -1, -1, -1, 66, ! -1, -1, -1, -1, -1, -1, 73, -1, -1, 51, ! 77, -1, -1, -1, -1, -1, 83, -1, 60, 86, ! 87, -1, -1, -1, 66, -1, -1, 94, -1, -1, ! -1, 73, -1, -1, -1, 77, 103, 104, 105, 106, ! -1, 83, 109, 110, 86, 87, -1, -1, 90, 91, ! -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, ! -1, 103, 104, 105, 106, -1, -1, 109, 110 }; #define YYPURE 1 *************** yyreduce: *** 2891,2897 **** switch (yyn) { case 1: ! #line 598 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* Register static variables with the garbage collector. */ --- 2897,2903 ---- switch (yyn) { case 1: ! #line 607 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* Register static variables with the garbage collector. */ *************** case 1: *** 2908,2913 **** --- 2914,2920 ---- ggc_add_tree_root (&package_list, 1); ggc_add_tree_root (¤t_this, 1); ggc_add_tree_root (¤tly_caught_type_list, 1); + ggc_add_tree_root (&case_label_list, 1); ggc_add_root (&ctxp, 1, sizeof (struct parser_ctxt *), mark_parser_ctxt); *************** case 1: *** 2917,2927 **** ; break;} case 2: ! #line 622 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {; break;} case 19: ! #line 666 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { int osb = pop_current_osb (ctxp); tree t = build_java_array_type ((yyvsp[-1].node), -1); --- 2924,2934 ---- ; break;} case 2: ! #line 632 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {; break;} case 19: ! #line 676 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { int osb = pop_current_osb (ctxp); tree t = build_java_array_type ((yyvsp[-1].node), -1); *************** case 19: *** 2931,2937 **** ; break;} case 20: ! #line 674 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { int osb = pop_current_osb (ctxp); tree t = yyvsp[-1].node; --- 2938,2944 ---- ; break;} case 20: ! #line 684 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { int osb = pop_current_osb (ctxp); tree t = yyvsp[-1].node; *************** case 20: *** 2941,2982 **** ; break;} case 24: ! #line 695 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = make_qualified_name (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} case 26: ! #line 704 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = NULL;; break;} case 34: ! #line 716 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL; ; break;} case 35: ! #line 720 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL; ; break;} case 38: ! #line 732 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->package = EXPR_WFL_NODE (yyvsp[-1].node); register_package (ctxp->package); ; break;} case 39: ! #line 737 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing name"); RECOVER;; break;} case 40: ! #line 739 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 43: ! #line 749 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree name = EXPR_WFL_NODE (yyvsp[-1].node), last_name; int i = IDENTIFIER_LENGTH (name)-1; --- 2948,2989 ---- ; break;} case 24: ! #line 705 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = make_qualified_name (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} case 26: ! #line 714 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = NULL;; break;} case 34: ! #line 726 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL; ; break;} case 35: ! #line 730 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL; ; break;} case 38: ! #line 742 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->package = EXPR_WFL_NODE (yyvsp[-1].node); register_package (ctxp->package); ; break;} case 39: ! #line 747 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing name"); RECOVER;; break;} case 40: ! #line 749 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 43: ! #line 759 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree name = EXPR_WFL_NODE (yyvsp[-1].node), last_name; int i = IDENTIFIER_LENGTH (name)-1; *************** case 43: *** 3004,3022 **** ; break;} case 44: ! #line 775 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing name"); RECOVER;; break;} case 45: ! #line 777 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 46: ! #line 782 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree name = EXPR_WFL_NODE (yyvsp[-3].node); ! /* Don't import java.lang.* twice. */ ! if (name != java_lang_id) { read_import_dir (yyvsp[-3].node); ctxp->import_demand_list = --- 3011,3035 ---- ; break;} case 44: ! #line 785 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing name"); RECOVER;; break;} case 45: ! #line 787 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 46: ! #line 792 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree name = EXPR_WFL_NODE (yyvsp[-3].node); ! tree it; ! /* Search for duplicates. */ ! for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it)) ! if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name) ! break; ! /* Don't import the same thing more than once, just ignore ! duplicates (7.5.2) */ ! if (! it) { read_import_dir (yyvsp[-3].node); ctxp->import_demand_list = *************** case 46: *** 3026,3061 **** ; break;} case 47: ! #line 794 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'*' expected"); RECOVER;; break;} case 48: ! #line 796 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 49: ! #line 801 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { end_class_declaration (0); ; break;} case 50: ! #line 803 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { end_class_declaration (0); ; break;} case 52: ! #line 806 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { YYERROR_NOW; yyerror ("Class or interface declaration expected"); ; break;} case 53: ! #line 817 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.value = (1 << yyvsp[0].value); ; break;} case 54: ! #line 821 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { int acc = (1 << yyvsp[0].value); if (yyval.value & acc) --- 3039,3074 ---- ; break;} case 47: ! #line 810 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'*' expected"); RECOVER;; break;} case 48: ! #line 812 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 49: ! #line 817 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { end_class_declaration (0); ; break;} case 50: ! #line 819 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { end_class_declaration (0); ; break;} case 52: ! #line 822 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { YYERROR_NOW; yyerror ("Class or interface declaration expected"); ; break;} case 53: ! #line 833 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.value = (1 << yyvsp[0].value); ; break;} case 54: ! #line 837 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { int acc = (1 << yyvsp[0].value); if (yyval.value & acc) *************** case 54: *** 3069,3151 **** ; break;} case 55: ! #line 837 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_class (yyvsp[-4].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 57: ! #line 840 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_class (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 59: ! #line 843 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing class name"); RECOVER;; break;} case 60: ! #line 845 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing class name"); RECOVER;; break;} case 61: ! #line 847 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { if (!ctxp->class_err) yyerror ("'{' expected"); DRECOVER(class1); ; break;} case 62: ! #line 852 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER;; break;} case 63: ! #line 856 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL; ; break;} case 64: ! #line 858 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 65: ! #line 860 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'{' expected"); ctxp->class_err=1;; break;} case 66: ! #line 862 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing super class name"); ctxp->class_err=1;; break;} case 67: ! #line 866 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 68: ! #line 868 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 69: ! #line 870 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->class_err=1; yyerror ("Missing interface name"); ; break;} case 70: ! #line 878 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->interface_number = 1; yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 71: ! #line 883 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->interface_number++; yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE)); ; break;} case 72: ! #line 888 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing interface name"); RECOVER;; break;} case 73: ! #line 893 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* Store the location of the `}' when doing xrefs */ if (flag_emit_xref) --- 3082,3164 ---- ; break;} case 55: ! #line 853 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_class (yyvsp[-4].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 57: ! #line 856 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_class (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 59: ! #line 859 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing class name"); RECOVER;; break;} case 60: ! #line 861 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing class name"); RECOVER;; break;} case 61: ! #line 863 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { if (!ctxp->class_err) yyerror ("'{' expected"); DRECOVER(class1); ; break;} case 62: ! #line 868 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {if (!ctxp->class_err) yyerror ("'{' expected"); RECOVER;; break;} case 63: ! #line 872 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL; ; break;} case 64: ! #line 874 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 65: ! #line 876 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'{' expected"); ctxp->class_err=1;; break;} case 66: ! #line 878 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing super class name"); ctxp->class_err=1;; break;} case 67: ! #line 882 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 68: ! #line 884 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 69: ! #line 886 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->class_err=1; yyerror ("Missing interface name"); ; break;} case 70: ! #line 894 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->interface_number = 1; yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 71: ! #line 899 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->interface_number++; yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE)); ; break;} case 72: ! #line 904 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing interface name"); RECOVER;; break;} case 73: ! #line 909 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* Store the location of the `}' when doing xrefs */ if (flag_emit_xref) *************** case 73: *** 3155,3161 **** ; break;} case 74: ! #line 901 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* Store the location of the `}' when doing xrefs */ if (flag_emit_xref) --- 3168,3174 ---- ; break;} case 74: ! #line 917 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* Store the location of the `}' when doing xrefs */ if (flag_emit_xref) *************** case 74: *** 3165,3190 **** ; break;} case 80: ! #line 920 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ! TREE_CHAIN (yyvsp[0].node) = CPC_INSTANCE_INITIALIZER_STMT (ctxp); ! SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, yyvsp[0].node); ; break;} case 83: ! #line 930 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 84: ! #line 932 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 86: ! #line 939 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { register_fields (0, yyvsp[-2].node, yyvsp[-1].node); ; break;} case 87: ! #line 941 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { check_modifiers ("Illegal modifier `%s' for field declaration", --- 3178,3206 ---- ; break;} case 80: ! #line 936 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ! if (yyvsp[0].node != empty_stmt_node) ! { ! TREE_CHAIN (yyvsp[0].node) = CPC_INSTANCE_INITIALIZER_STMT (ctxp); ! SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, yyvsp[0].node); ! } ; break;} case 83: ! #line 949 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 84: ! #line 951 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 86: ! #line 958 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { register_fields (0, yyvsp[-2].node, yyvsp[-1].node); ; break;} case 87: ! #line 960 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { check_modifiers ("Illegal modifier `%s' for field declaration", *************** case 87: *** 3194,3212 **** ; break;} case 89: ! #line 954 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node); ; break;} case 90: ! #line 956 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 91: ! #line 961 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 92: ! #line 963 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { if (java_error_count) yyvsp[0].node = NULL_TREE; --- 3210,3228 ---- ; break;} case 89: ! #line 973 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node); ; break;} case 90: ! #line 975 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 91: ! #line 980 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 92: ! #line 982 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { if (java_error_count) yyvsp[0].node = NULL_TREE; *************** case 92: *** 3215,3221 **** ; break;} case 93: ! #line 970 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing variable initializer"); yyval.node = build_tree_list (yyvsp[-2].node, NULL_TREE); --- 3231,3237 ---- ; break;} case 93: ! #line 989 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing variable initializer"); yyval.node = build_tree_list (yyvsp[-2].node, NULL_TREE); *************** case 93: *** 3223,3229 **** ; break;} case 94: ! #line 976 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("';' expected"); yyval.node = build_tree_list (yyvsp[-3].node, NULL_TREE); --- 3239,3245 ---- ; break;} case 94: ! #line 995 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("';' expected"); yyval.node = build_tree_list (yyvsp[-3].node, NULL_TREE); *************** case 94: *** 3231,3245 **** ; break;} case 96: ! #line 986 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_unresolved_array_type (yyvsp[-2].node); ; break;} case 97: ! #line 988 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Invalid declaration"); DRECOVER(vdi);; break;} case 98: ! #line 990 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree node = java_lval.node; if (node && (TREE_CODE (node) == INTEGER_CST --- 3247,3261 ---- ; break;} case 96: ! #line 1005 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_unresolved_array_type (yyvsp[-2].node); ; break;} case 97: ! #line 1007 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Invalid declaration"); DRECOVER(vdi);; break;} case 98: ! #line 1009 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree node = java_lval.node; if (node && (TREE_CODE (node) == INTEGER_CST *************** case 98: *** 3251,3261 **** ; break;} case 99: ! #line 1000 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Unbalanced ']'"); DRECOVER(vdi);; break;} case 102: ! #line 1011 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { current_function_decl = yyvsp[0].node; if (current_function_decl --- 3267,3277 ---- ; break;} case 99: ! #line 1019 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Unbalanced ']'"); DRECOVER(vdi);; break;} case 102: ! #line 1030 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { current_function_decl = yyvsp[0].node; if (current_function_decl *************** case 102: *** 3266,3333 **** ; break;} case 103: ! #line 1020 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { finish_method_declaration (yyvsp[0].node); ; break;} case 104: ! #line 1022 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;; break;} case 105: ! #line 1027 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_header (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 106: ! #line 1029 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_header (0, void_type_node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 107: ! #line 1031 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_header (yyvsp[-3].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 108: ! #line 1033 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_header (yyvsp[-3].value, void_type_node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 109: ! #line 1035 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Invalid method declaration, method name required"); RECOVER; ; break;} case 110: ! #line 1040 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {RECOVER;; break;} case 111: ! #line 1042 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Identifier expected"); RECOVER;; break;} case 112: ! #line 1044 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Identifier expected"); RECOVER;; break;} case 113: ! #line 1046 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Invalid method declaration, return type required"); RECOVER; ; break;} case 114: ! #line 1054 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->formal_parameter_number = 0; yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE); ; break;} case 115: ! #line 1059 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 116: ! #line 1061 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { EXPR_WFL_LINECOL (wfl_operator) = yyvsp[-1].operator.location; TREE_PURPOSE (yyvsp[-2].node) = --- 3282,3349 ---- ; break;} case 103: ! #line 1039 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { finish_method_declaration (yyvsp[0].node); ; break;} case 104: ! #line 1041 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {YYNOT_TWICE yyerror ("'{' expected"); RECOVER;; break;} case 105: ! #line 1046 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_header (0, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 106: ! #line 1048 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_header (0, void_type_node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 107: ! #line 1050 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_header (yyvsp[-3].value, yyvsp[-2].node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 108: ! #line 1052 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_header (yyvsp[-3].value, void_type_node, yyvsp[-1].node, yyvsp[0].node); ; break;} case 109: ! #line 1054 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Invalid method declaration, method name required"); RECOVER; ; break;} case 110: ! #line 1059 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {RECOVER;; break;} case 111: ! #line 1061 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Identifier expected"); RECOVER;; break;} case 112: ! #line 1063 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Identifier expected"); RECOVER;; break;} case 113: ! #line 1065 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Invalid method declaration, return type required"); RECOVER; ; break;} case 114: ! #line 1073 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->formal_parameter_number = 0; yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE); ; break;} case 115: ! #line 1078 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 116: ! #line 1080 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { EXPR_WFL_LINECOL (wfl_operator) = yyvsp[-1].operator.location; TREE_PURPOSE (yyvsp[-2].node) = *************** case 116: *** 3338,3396 **** ; break;} case 117: ! #line 1070 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("')' expected"); DRECOVER(method_declarator);; break;} case 118: ! #line 1072 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("']' expected"); RECOVER;; break;} case 119: ! #line 1077 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->formal_parameter_number = 1; ; break;} case 120: ! #line 1081 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->formal_parameter_number += 1; yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node); ; break;} case 121: ! #line 1086 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing formal parameter term"); RECOVER; ; break;} case 122: ! #line 1091 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node); ; break;} case 123: ! #line 1095 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node); ARG_FINAL_P (yyval.node) = 1; ; break;} case 124: ! #line 1100 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing identifier"); RECOVER; yyval.node = NULL_TREE; ; break;} case 125: ! #line 1105 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing identifier"); RECOVER; yyval.node = NULL_TREE; ; break;} case 126: ! #line 1113 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { check_modifiers ("Illegal modifier `%s'. Only `final' was expected here", yyvsp[0].value, ACC_FINAL); --- 3354,3412 ---- ; break;} case 117: ! #line 1089 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("')' expected"); DRECOVER(method_declarator);; break;} case 118: ! #line 1091 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("']' expected"); RECOVER;; break;} case 119: ! #line 1096 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->formal_parameter_number = 1; ; break;} case 120: ! #line 1100 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->formal_parameter_number += 1; yyval.node = chainon (yyvsp[-2].node, yyvsp[0].node); ; break;} case 121: ! #line 1105 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing formal parameter term"); RECOVER; ; break;} case 122: ! #line 1110 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node); ; break;} case 123: ! #line 1114 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[-1].node); ARG_FINAL_P (yyval.node) = 1; ; break;} case 124: ! #line 1119 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing identifier"); RECOVER; yyval.node = NULL_TREE; ; break;} case 125: ! #line 1124 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing identifier"); RECOVER; yyval.node = NULL_TREE; ; break;} case 126: ! #line 1132 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { check_modifiers ("Illegal modifier `%s'. Only `final' was expected here", yyvsp[0].value, ACC_FINAL); *************** case 126: *** 3399,3433 **** ; break;} case 127: ! #line 1122 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 128: ! #line 1124 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 129: ! #line 1126 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing class type term"); RECOVER;; break;} case 130: ! #line 1131 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[0].node); ; break;} case 131: ! #line 1133 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = tree_cons (yyvsp[0].node, yyvsp[0].node, yyvsp[-2].node); ; break;} case 132: ! #line 1135 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing class type term"); RECOVER;; break;} case 134: ! #line 1140 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 135: ! #line 1146 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { TREE_CHAIN (yyvsp[0].node) = CPC_STATIC_INITIALIZER_STMT (ctxp); SET_CPC_STATIC_INITIALIZER_STMT (ctxp, yyvsp[0].node); --- 3415,3449 ---- ; break;} case 127: ! #line 1141 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 128: ! #line 1143 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 129: ! #line 1145 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing class type term"); RECOVER;; break;} case 130: ! #line 1150 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_tree_list (yyvsp[0].node, yyvsp[0].node); ; break;} case 131: ! #line 1152 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = tree_cons (yyvsp[0].node, yyvsp[0].node, yyvsp[-2].node); ; break;} case 132: ! #line 1154 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing class type term"); RECOVER;; break;} case 134: ! #line 1159 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 135: ! #line 1165 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { TREE_CHAIN (yyvsp[0].node) = CPC_STATIC_INITIALIZER_STMT (ctxp); SET_CPC_STATIC_INITIALIZER_STMT (ctxp, yyvsp[0].node); *************** case 135: *** 3435,3441 **** ; break;} case 136: ! #line 1155 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { check_modifiers ("Illegal modifier `%s' for static initializer", yyvsp[0].value, ACC_STATIC); /* Can't have a static initializer in an innerclass */ --- 3451,3457 ---- ; break;} case 136: ! #line 1174 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { check_modifiers ("Illegal modifier `%s' for static initializer", yyvsp[0].value, ACC_STATIC); /* Can't have a static initializer in an innerclass */ *************** case 136: *** 3449,3504 **** ; break;} case 137: ! #line 1171 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { current_function_decl = yyvsp[0].node; source_start_java_method (current_function_decl); ; break;} case 138: ! #line 1176 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { finish_method_declaration (yyvsp[0].node); ; break;} case 139: ! #line 1181 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_header (0, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ; break;} case 140: ! #line 1183 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_header (yyvsp[-2].value, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ; break;} case 141: ! #line 1188 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->formal_parameter_number = 0; yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE); ; break;} case 142: ! #line 1193 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 143: ! #line 1201 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { BLOCK_EXPR_BODY (yyvsp[0].node) = empty_stmt_node; yyval.node = yyvsp[0].node; ; break;} case 144: ! #line 1206 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 145: ! #line 1208 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 146: ! #line 1210 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 148: ! #line 1220 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-3].node, NULL_TREE); yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-3].node), yyval.node); --- 3465,3520 ---- ; break;} case 137: ! #line 1190 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { current_function_decl = yyvsp[0].node; source_start_java_method (current_function_decl); ; break;} case 138: ! #line 1195 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { finish_method_declaration (yyvsp[0].node); ; break;} case 139: ! #line 1200 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_header (0, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ; break;} case 140: ! #line 1202 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_header (yyvsp[-2].value, NULL_TREE, yyvsp[-1].node, yyvsp[0].node); ; break;} case 141: ! #line 1207 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->formal_parameter_number = 0; yyval.node = method_declarator (yyvsp[-2].node, NULL_TREE); ; break;} case 142: ! #line 1212 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = method_declarator (yyvsp[-3].node, yyvsp[-1].node); ; break;} case 143: ! #line 1220 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { BLOCK_EXPR_BODY (yyvsp[0].node) = empty_stmt_node; yyval.node = yyvsp[0].node; ; break;} case 144: ! #line 1225 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 145: ! #line 1227 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 146: ! #line 1229 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} case 148: ! #line 1239 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-3].node, NULL_TREE); yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-3].node), yyval.node); *************** case 148: *** 3506,3512 **** ; break;} case 149: ! #line 1226 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-4].node, yyvsp[-2].node); yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-4].node), yyval.node); --- 3522,3528 ---- ; break;} case 149: ! #line 1245 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-4].node, yyvsp[-2].node); yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-4].node), yyval.node); *************** case 149: *** 3514,3528 **** ; break;} case 150: ! #line 1234 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ; break;} case 151: ! #line 1236 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ; break;} case 152: ! #line 1241 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree wfl = build_wfl_node (this_identifier_node); EXPR_WFL_LINECOL (wfl) = yyvsp[0].operator.location; --- 3530,3544 ---- ; break;} case 150: ! #line 1253 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ; break;} case 151: ! #line 1255 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = parse_jdk1_1_error ("explicit constructor invocation"); ; break;} case 152: ! #line 1260 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree wfl = build_wfl_node (this_identifier_node); EXPR_WFL_LINECOL (wfl) = yyvsp[0].operator.location; *************** case 152: *** 3530,3536 **** ; break;} case 153: ! #line 1247 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree wfl = build_wfl_node (super_identifier_node); EXPR_WFL_LINECOL (wfl) = yyvsp[0].operator.location; --- 3546,3552 ---- ; break;} case 153: ! #line 1266 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree wfl = build_wfl_node (super_identifier_node); EXPR_WFL_LINECOL (wfl) = yyvsp[0].operator.location; *************** case 153: *** 3538,3646 **** ; break;} case 154: ! #line 1258 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_interface (0, yyvsp[0].node, NULL_TREE); ; break;} case 156: ! #line 1261 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_interface (yyvsp[-2].value, yyvsp[0].node, NULL_TREE); ; break;} case 158: ! #line 1264 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_interface (0, yyvsp[-1].node, yyvsp[0].node); ; break;} case 160: ! #line 1267 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_interface (yyvsp[-3].value, yyvsp[-1].node, yyvsp[0].node); ; break;} case 162: ! #line 1270 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 163: ! #line 1272 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 164: ! #line 1277 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->interface_number = 1; yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 165: ! #line 1282 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->interface_number++; yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE)); ; break;} case 166: ! #line 1287 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Invalid interface type"); RECOVER;; break;} case 167: ! #line 1289 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 168: ! #line 1294 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 169: ! #line 1296 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 174: ! #line 1308 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 175: ! #line 1310 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 177: ! #line 1319 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { check_abstract_method_header (yyvsp[-1].node); current_function_decl = NULL_TREE; /* FIXME ? */ ; break;} case 178: ! #line 1324 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 179: ! #line 1330 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_new_array_init (yyvsp[-1].operator.location, NULL_TREE); ; break;} case 180: ! #line 1332 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = build_new_array_init (yyvsp[-2].operator.location, yyvsp[-1].node); ; break;} case 181: ! #line 1334 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = build_new_array_init (yyvsp[-3].operator.location, yyvsp[-2].node); ; break;} case 182: ! #line 1339 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node), yyvsp[0].node, NULL_TREE); ; break;} ! case 183: ! #line 1344 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node), yyvsp[0].node, yyvsp[-2].node); ; break;} ! case 184: ! #line 1348 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 185: ! #line 1354 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* Store the location of the `}' when doing xrefs */ if (current_function_decl && flag_emit_xref) --- 3554,3666 ---- ; break;} case 154: ! #line 1277 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_interface (0, yyvsp[0].node, NULL_TREE); ; break;} case 156: ! #line 1280 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_interface (yyvsp[-2].value, yyvsp[0].node, NULL_TREE); ; break;} case 158: ! #line 1283 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_interface (0, yyvsp[-1].node, yyvsp[0].node); ; break;} case 160: ! #line 1286 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_interface (yyvsp[-3].value, yyvsp[-1].node, yyvsp[0].node); ; break;} case 162: ! #line 1289 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 163: ! #line 1291 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'{' expected"); RECOVER;; break;} case 164: ! #line 1296 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->interface_number = 1; yyval.node = build_tree_list (yyvsp[0].node, NULL_TREE); ; break;} case 165: ! #line 1301 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->interface_number++; yyval.node = chainon (yyvsp[-2].node, build_tree_list (yyvsp[0].node, NULL_TREE)); ; break;} case 166: ! #line 1306 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Invalid interface type"); RECOVER;; break;} case 167: ! #line 1308 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 168: ! #line 1313 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 169: ! #line 1315 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 174: ! #line 1327 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 175: ! #line 1329 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { end_class_declaration (1); ; break;} case 177: ! #line 1338 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { check_abstract_method_header (yyvsp[-1].node); current_function_decl = NULL_TREE; /* FIXME ? */ ; break;} case 178: ! #line 1343 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} case 179: ! #line 1349 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_new_array_init (yyvsp[-1].operator.location, NULL_TREE); ; break;} case 180: ! #line 1351 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_new_array_init (yyvsp[-2].operator.location, NULL_TREE); ; break;} case 181: ! #line 1353 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_new_array_init (yyvsp[-2].operator.location, yyvsp[-1].node); ; break;} case 182: ! #line 1355 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_new_array_init (yyvsp[-3].operator.location, yyvsp[-2].node); ; ! break;} ! case 183: ! #line 1360 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node), yyvsp[0].node, NULL_TREE); ; break;} ! case 184: ! #line 1365 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = tree_cons (maybe_build_array_element_wfl (yyvsp[0].node), yyvsp[0].node, yyvsp[-2].node); ; break;} ! case 185: ! #line 1369 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 186: ! #line 1375 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* Store the location of the `}' when doing xrefs */ if (current_function_decl && flag_emit_xref) *************** case 185: *** 3649,3664 **** yyval.node = empty_stmt_node; ; break;} ! case 186: ! #line 1362 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} ! case 187: ! #line 1367 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { enter_block (); ; break;} ! case 188: ! #line 1372 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { maybe_absorb_scoping_blocks (); /* Store the location of the `}' when doing xrefs */ --- 3669,3684 ---- yyval.node = empty_stmt_node; ; break;} ! case 187: ! #line 1383 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} ! case 188: ! #line 1388 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { enter_block (); ; break;} ! case 189: ! #line 1393 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { maybe_absorb_scoping_blocks (); /* Store the location of the `}' when doing xrefs */ *************** case 188: *** 3670,3706 **** BLOCK_SUBBLOCKS (yyval.node) = empty_stmt_node; ; break;} ! case 192: ! #line 1392 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { java_method_add_stmt (current_function_decl, yyvsp[0].node); ; break;} ! case 193: ! #line 1394 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1; end_class_declaration (1); ; break;} ! case 195: ! #line 1406 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { declare_local_variables (0, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 196: ! #line 1408 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { declare_local_variables (yyvsp[-2].value, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 202: ! #line 1418 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = exit_block (); ; break;} ! case 207: ! #line 1427 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = exit_block (); ; break;} ! case 219: ! #line 1446 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ! if (flag_extraneous_semicolon) { EXPR_WFL_SET_LINECOL (wfl_operator, lineno, -1); parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used"); --- 3690,3732 ---- BLOCK_SUBBLOCKS (yyval.node) = empty_stmt_node; ; break;} ! case 193: ! #line 1413 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { java_method_add_stmt (current_function_decl, yyvsp[0].node); ; break;} ! case 194: ! #line 1415 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { LOCAL_CLASS_P (TREE_TYPE (GET_CPC ())) = 1; end_class_declaration (1); ; break;} ! case 196: ! #line 1427 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { declare_local_variables (0, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 197: ! #line 1429 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { declare_local_variables (yyvsp[-2].value, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 203: ! #line 1439 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = exit_block (); ; break;} ! case 208: ! #line 1448 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = exit_block (); ; break;} ! case 220: ! #line 1467 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ! if (flag_extraneous_semicolon ! && ! current_static_block ! && (! current_function_decl || ! /* Verify we're not in a inner class declaration */ ! (GET_CPC () != TYPE_NAME ! (DECL_CONTEXT (current_function_decl))))) ! { EXPR_WFL_SET_LINECOL (wfl_operator, lineno, -1); parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used"); *************** case 219: *** 3708,3715 **** yyval.node = empty_stmt_node; ; break;} ! case 220: ! #line 1458 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_labeled_block (EXPR_WFL_LINECOL (yyvsp[-1].node), EXPR_WFL_NODE (yyvsp[-1].node)); --- 3734,3741 ---- yyval.node = empty_stmt_node; ; break;} ! case 221: ! #line 1485 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_labeled_block (EXPR_WFL_LINECOL (yyvsp[-1].node), EXPR_WFL_NODE (yyvsp[-1].node)); *************** case 220: *** 3718,3737 **** PUSH_LABELED_BLOCK (yyval.node); ; break;} ! case 221: ! #line 1469 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 222: ! #line 1471 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("':' expected"); RECOVER;; break;} ! case 223: ! #line 1476 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 224: ! #line 1483 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* We have a statement. Generate a WFL around it so we can debug it */ --- 3744,3763 ---- PUSH_LABELED_BLOCK (yyval.node); ; break;} ! case 222: ! #line 1496 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 223: ! #line 1498 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("':' expected"); RECOVER;; break;} ! case 224: ! #line 1503 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = finish_labeled_statement (yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 225: ! #line 1510 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* We have a statement. Generate a WFL around it so we can debug it */ *************** case 224: *** 3741,3964 **** yyval.node = JAVA_MAYBE_GENERATE_DEBUG_INFO (yyval.node); ; break;} ! case 225: ! #line 1492 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid expression statement"); DRECOVER (expr_stmt); ; break;} ! case 226: ! #line 1497 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid expression statement"); DRECOVER (expr_stmt); ; break;} ! case 227: ! #line 1502 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid expression statement"); DRECOVER (expr_stmt); ; break;} ! case 228: ! #line 1507 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 229: ! #line 1509 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { parse_ctor_invocation_error (); RECOVER; ; break;} ! case 230: ! #line 1514 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 231: ! #line 1516 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { parse_ctor_invocation_error (); RECOVER; ; break;} - case 232: - #line 1521 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("'(' expected"); RECOVER;; - break;} case 233: ! #line 1523 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("')' expected"); RECOVER;; break;} case 234: ! #line 1525 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 235: ! #line 1527 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("';' expected"); RECOVER;; break;} case 236: ! #line 1529 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 244: ! #line 1544 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_if_else_statement (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node, NULL_TREE); ; break;} - case 245: - #line 1549 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("'(' expected"); RECOVER;; - break;} case 246: ! #line 1551 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("Missing term"); RECOVER;; break;} case 247: ! #line 1553 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("')' expected"); RECOVER;; break;} case 248: ! #line 1558 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} case 249: ! #line 1563 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} case 250: ! #line 1568 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { enter_block (); ; break;} ! case 251: ! #line 1572 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* Make into "proper list" of COMPOUND_EXPRs. ! I.e. make the last statment also have its own COMPOUND_EXPR. */ maybe_absorb_scoping_blocks (); TREE_OPERAND (yyvsp[-2].node, 1) = exit_block (); yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-2].node), yyvsp[-2].node); ; break;} ! case 252: ! #line 1584 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build (SWITCH_EXPR, NULL_TREE, yyvsp[-1].node, NULL_TREE); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-2].operator.location; ; break;} - case 253: - #line 1589 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("'(' expected"); RECOVER;; - break;} case 254: ! #line 1591 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);; break;} case 255: ! #line 1593 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("'{' expected"); RECOVER;; break;} case 256: ! #line 1601 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = NULL_TREE; ; break;} case 257: ! #line 1603 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 258: ! #line 1605 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 259: ! #line 1607 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} ! case 265: ! #line 1626 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree lab = build1 (CASE_EXPR, NULL_TREE, yyvsp[-1].node); EXPR_WFL_LINECOL (lab) = yyvsp[-2].operator.location; java_method_add_stmt (current_function_decl, lab); ; break;} ! case 266: ! #line 1632 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree lab = build (DEFAULT_EXPR, NULL_TREE, NULL_TREE); EXPR_WFL_LINECOL (lab) = yyvsp[-1].operator.location; java_method_add_stmt (current_function_decl, lab); ; break;} - case 267: - #line 1638 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("Missing or invalid constant expression"); RECOVER;; - break;} case 268: ! #line 1640 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("':' expected"); RECOVER;; break;} case 269: ! #line 1642 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("':' expected"); RECOVER;; break;} case 270: ! #line 1647 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree body = build_loop_body (yyvsp[-2].operator.location, yyvsp[-1].node, 0); yyval.node = build_new_loop (body); ; break;} ! case 271: ! #line 1655 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ; break;} ! case 272: ! #line 1657 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;; break;} ! case 273: ! #line 1659 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term and ')' expected"); RECOVER;; break;} ! case 274: ! #line 1661 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 275: ! #line 1666 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ; break;} ! case 276: ! #line 1671 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree body = build_loop_body (0, NULL_TREE, 1); yyval.node = build_new_loop (body); ; break;} ! case 277: ! #line 1680 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = finish_loop_body (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[-5].node, 1); ; break;} ! case 278: ! #line 1685 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-4].node)) == 'c') yyvsp[-4].node = build_wfl_node (yyvsp[-4].node); yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 279: ! #line 1691 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); /* We have not condition, so we get rid of the EXIT_EXPR */ --- 3767,3990 ---- yyval.node = JAVA_MAYBE_GENERATE_DEBUG_INFO (yyval.node); ; break;} ! case 226: ! #line 1519 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid expression statement"); DRECOVER (expr_stmt); ; break;} ! case 227: ! #line 1524 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid expression statement"); DRECOVER (expr_stmt); ; break;} ! case 228: ! #line 1529 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid expression statement"); DRECOVER (expr_stmt); ; break;} ! case 229: ! #line 1534 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 230: ! #line 1536 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { parse_ctor_invocation_error (); RECOVER; ; break;} ! case 231: ! #line 1541 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 232: ! #line 1543 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { parse_ctor_invocation_error (); RECOVER; ; break;} case 233: ! #line 1548 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'(' expected"); RECOVER;; break;} case 234: ! #line 1550 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} case 235: ! #line 1552 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("')' expected"); RECOVER;; break;} case 236: ! #line 1554 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 237: ! #line 1556 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("';' expected"); RECOVER;; ! break;} ! case 245: ! #line 1571 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_if_else_statement (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node, NULL_TREE); ; break;} case 246: ! #line 1576 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'(' expected"); RECOVER;; break;} case 247: ! #line 1578 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Missing term"); RECOVER;; break;} case 248: ! #line 1580 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("')' expected"); RECOVER;; break;} case 249: ! #line 1585 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} case 250: ! #line 1590 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_if_else_statement (yyvsp[-5].operator.location, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; ! break;} ! case 251: ! #line 1595 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { enter_block (); ; break;} ! case 252: ! #line 1599 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* Make into "proper list" of COMPOUND_EXPRs. ! I.e. make the last statement also have its own COMPOUND_EXPR. */ maybe_absorb_scoping_blocks (); TREE_OPERAND (yyvsp[-2].node, 1) = exit_block (); yyval.node = build_debugable_stmt (EXPR_WFL_LINECOL (yyvsp[-2].node), yyvsp[-2].node); ; break;} ! case 253: ! #line 1611 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build (SWITCH_EXPR, NULL_TREE, yyvsp[-1].node, NULL_TREE); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-2].operator.location; ; break;} case 254: ! #line 1616 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'(' expected"); RECOVER;; break;} case 255: ! #line 1618 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Missing term or ')'"); DRECOVER(switch_statement);; break;} case 256: ! #line 1620 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'{' expected"); RECOVER;; break;} case 257: ! #line 1628 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 258: ! #line 1630 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} case 259: ! #line 1632 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = NULL_TREE; ; break;} ! case 260: ! #line 1634 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = NULL_TREE; ; ! break;} ! case 266: ! #line 1653 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree lab = build1 (CASE_EXPR, NULL_TREE, yyvsp[-1].node); EXPR_WFL_LINECOL (lab) = yyvsp[-2].operator.location; java_method_add_stmt (current_function_decl, lab); ; break;} ! case 267: ! #line 1659 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree lab = build (DEFAULT_EXPR, NULL_TREE, NULL_TREE); EXPR_WFL_LINECOL (lab) = yyvsp[-1].operator.location; java_method_add_stmt (current_function_decl, lab); ; break;} case 268: ! #line 1665 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Missing or invalid constant expression"); RECOVER;; break;} case 269: ! #line 1667 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("':' expected"); RECOVER;; break;} case 270: ! #line 1669 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("':' expected"); RECOVER;; ! break;} ! case 271: ! #line 1674 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree body = build_loop_body (yyvsp[-2].operator.location, yyvsp[-1].node, 0); yyval.node = build_new_loop (body); ; break;} ! case 272: ! #line 1682 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ; break;} ! case 273: ! #line 1684 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {YYERROR_NOW; yyerror ("'(' expected"); RECOVER;; break;} ! case 274: ! #line 1686 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term and ')' expected"); RECOVER;; break;} ! case 275: ! #line 1688 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 276: ! #line 1693 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = finish_loop_body (0, NULL_TREE, yyvsp[0].node, 0); ; break;} ! case 277: ! #line 1698 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree body = build_loop_body (0, NULL_TREE, 1); yyval.node = build_new_loop (body); ; break;} ! case 278: ! #line 1707 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = finish_loop_body (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[-5].node, 1); ; break;} ! case 279: ! #line 1712 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { if (TREE_CODE_CLASS (TREE_CODE (yyvsp[-4].node)) == 'c') yyvsp[-4].node = build_wfl_node (yyvsp[-4].node); yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 280: ! #line 1718 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); /* We have not condition, so we get rid of the EXIT_EXPR */ *************** case 279: *** 3966,3989 **** empty_stmt_node; ; break;} - case 280: - #line 1698 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("Invalid control expression"); RECOVER;; - break;} case 281: ! #line 1700 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("Invalid update expression"); RECOVER;; break;} case 282: ! #line 1702 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Invalid update expression"); RECOVER;; break;} case 283: ! #line 1707 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node);; break;} case 284: ! #line 1709 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); /* We have not condition, so we get rid of the EXIT_EXPR */ --- 3992,4015 ---- empty_stmt_node; ; break;} case 281: ! #line 1725 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Invalid control expression"); RECOVER;; break;} case 282: ! #line 1727 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Invalid update expression"); RECOVER;; break;} case 283: ! #line 1729 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Invalid update expression"); RECOVER;; break;} case 284: ! #line 1734 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = finish_for_loop (EXPR_WFL_LINECOL (yyvsp[-4].node), yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node);; ! break;} ! case 285: ! #line 1736 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = finish_for_loop (0, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); /* We have not condition, so we get rid of the EXIT_EXPR */ *************** case 284: *** 3991,4014 **** empty_stmt_node; ; break;} ! case 285: ! #line 1719 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* This scope defined for local variable that may be defined within the scope of the for loop */ enter_block (); ; break;} ! case 286: ! #line 1725 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'(' expected"); DRECOVER(for_1);; break;} ! case 287: ! #line 1727 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Invalid init statement"); RECOVER;; break;} ! case 288: ! #line 1732 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* We now declare the loop body. The loop is declared as a for loop. */ --- 4017,4040 ---- empty_stmt_node; ; break;} ! case 286: ! #line 1746 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* This scope defined for local variable that may be defined within the scope of the for loop */ enter_block (); ; break;} ! case 287: ! #line 1752 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'(' expected"); DRECOVER(for_1);; break;} ! case 288: ! #line 1754 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Invalid init statement"); RECOVER;; break;} ! case 289: ! #line 1759 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* We now declare the loop body. The loop is declared as a for loop. */ *************** case 288: *** 4020,4158 **** java_method_add_stmt (current_function_decl, yyval.node); ; break;} ! case 289: ! #line 1744 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = empty_stmt_node; ; break;} ! case 290: ! #line 1746 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* Init statement recorded within the previously defined block scope */ yyval.node = java_method_add_stmt (current_function_decl, yyvsp[0].node); ; break;} ! case 291: ! #line 1752 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* Local variable are recorded within the previously defined block scope */ yyval.node = NULL_TREE; ; break;} ! case 292: ! #line 1758 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); DRECOVER(for_init_1);; break;} ! case 293: ! #line 1762 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = empty_stmt_node;; break;} ! case 294: ! #line 1764 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_debugable_stmt (BUILD_LOCATION (), yyvsp[0].node); ; break;} ! case 295: ! #line 1769 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = add_stmt_to_compound (NULL_TREE, NULL_TREE, yyvsp[0].node); ; break;} ! case 296: ! #line 1771 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = add_stmt_to_compound (yyvsp[-2].node, NULL_TREE, yyvsp[0].node); ; break;} ! case 297: ! #line 1773 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 298: ! #line 1778 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-1].operator.location, 1, NULL_TREE); ; break;} ! case 299: ! #line 1780 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-2].operator.location, 1, yyvsp[-1].node); ; break;} ! case 300: ! #line 1782 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 301: ! #line 1784 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 302: ! #line 1789 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-1].operator.location, 0, NULL_TREE); ; break;} ! case 303: ! #line 1791 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-2].operator.location, 0, yyvsp[-1].node); ; break;} ! case 304: ! #line 1793 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 305: ! #line 1795 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 306: ! #line 1800 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_return (yyvsp[-1].operator.location, NULL_TREE); ; break;} ! case 307: ! #line 1802 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_return (yyvsp[-2].operator.location, yyvsp[-1].node); ; break;} ! case 308: ! #line 1804 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 309: ! #line 1806 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 310: ! #line 1811 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build1 (THROW_EXPR, NULL_TREE, yyvsp[-1].node); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-2].operator.location; ; break;} ! case 311: ! #line 1816 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 312: ! #line 1818 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 313: ! #line 1823 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build (SYNCHRONIZED_EXPR, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); EXPR_WFL_LINECOL (yyval.node) = EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK)); ; break;} - case 314: - #line 1829 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("'{' expected"); RECOVER;; - break;} case 315: ! #line 1831 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("'(' expected"); RECOVER;; break;} case 316: ! #line 1833 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("Missing term"); RECOVER;; break;} case 317: ! #line 1835 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 318: ! #line 1840 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { check_modifiers ( "Illegal modifier `%s'. Only `synchronized' was expected here", --- 4046,4184 ---- java_method_add_stmt (current_function_decl, yyval.node); ; break;} ! case 290: ! #line 1771 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = empty_stmt_node; ; break;} ! case 291: ! #line 1773 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* Init statement recorded within the previously defined block scope */ yyval.node = java_method_add_stmt (current_function_decl, yyvsp[0].node); ; break;} ! case 292: ! #line 1779 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* Local variable are recorded within the previously defined block scope */ yyval.node = NULL_TREE; ; break;} ! case 293: ! #line 1785 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); DRECOVER(for_init_1);; break;} ! case 294: ! #line 1789 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = empty_stmt_node;; break;} ! case 295: ! #line 1791 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_debugable_stmt (BUILD_LOCATION (), yyvsp[0].node); ; break;} ! case 296: ! #line 1796 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = add_stmt_to_compound (NULL_TREE, NULL_TREE, yyvsp[0].node); ; break;} ! case 297: ! #line 1798 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = add_stmt_to_compound (yyvsp[-2].node, NULL_TREE, yyvsp[0].node); ; break;} ! case 298: ! #line 1800 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 299: ! #line 1805 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-1].operator.location, 1, NULL_TREE); ; break;} ! case 300: ! #line 1807 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-2].operator.location, 1, yyvsp[-1].node); ; break;} ! case 301: ! #line 1809 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 302: ! #line 1811 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 303: ! #line 1816 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-1].operator.location, 0, NULL_TREE); ; break;} ! case 304: ! #line 1818 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_bc_statement (yyvsp[-2].operator.location, 0, yyvsp[-1].node); ; break;} ! case 305: ! #line 1820 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 306: ! #line 1822 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 307: ! #line 1827 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_return (yyvsp[-1].operator.location, NULL_TREE); ; break;} ! case 308: ! #line 1829 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_return (yyvsp[-2].operator.location, yyvsp[-1].node); ; break;} ! case 309: ! #line 1831 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 310: ! #line 1833 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 311: ! #line 1838 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build1 (THROW_EXPR, NULL_TREE, yyvsp[-1].node); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-2].operator.location; ; break;} ! case 312: ! #line 1843 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 313: ! #line 1845 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("';' expected"); RECOVER;; break;} ! case 314: ! #line 1850 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build (SYNCHRONIZED_EXPR, NULL_TREE, yyvsp[-2].node, yyvsp[0].node); EXPR_WFL_LINECOL (yyval.node) = EXPR_WFL_LINECOL (MODIFIER_WFL (SYNCHRONIZED_TK)); ; break;} case 315: ! #line 1856 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'{' expected"); RECOVER;; break;} case 316: ! #line 1858 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'(' expected"); RECOVER;; break;} case 317: ! #line 1860 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} case 318: ! #line 1862 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Missing term"); RECOVER;; ! break;} ! case 319: ! #line 1867 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { check_modifiers ( "Illegal modifier `%s'. Only `synchronized' was expected here", *************** case 318: *** 4162,4203 **** build_wfl_node (NULL_TREE); ; break;} ! case 319: ! #line 1852 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_try_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 320: ! #line 1854 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_try_finally_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 321: ! #line 1856 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_try_finally_statement (yyvsp[-3].operator.location, build_try_statement (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[-1].node), yyvsp[0].node); ; break;} ! case 322: ! #line 1861 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'{' expected"); DRECOVER (try_statement);; break;} ! case 324: ! #line 1867 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { TREE_CHAIN (yyvsp[0].node) = yyvsp[-1].node; yyval.node = yyvsp[0].node; ; break;} ! case 325: ! #line 1875 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { java_method_add_stmt (current_function_decl, yyvsp[0].node); exit_block (); yyval.node = yyvsp[-1].node; ; break;} ! case 326: ! #line 1883 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { /* We add a block to define a scope for formal_parameter (CCBP). The formal parameter is --- 4188,4229 ---- build_wfl_node (NULL_TREE); ; break;} ! case 320: ! #line 1879 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_try_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 321: ! #line 1881 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_try_finally_statement (yyvsp[-2].operator.location, yyvsp[-1].node, yyvsp[0].node); ; break;} ! case 322: ! #line 1883 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_try_finally_statement (yyvsp[-3].operator.location, build_try_statement (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[-1].node), yyvsp[0].node); ; break;} ! case 323: ! #line 1888 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'{' expected"); DRECOVER (try_statement);; break;} ! case 325: ! #line 1894 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { TREE_CHAIN (yyvsp[0].node) = yyvsp[-1].node; yyval.node = yyvsp[0].node; ; break;} ! case 326: ! #line 1902 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { java_method_add_stmt (current_function_decl, yyvsp[0].node); exit_block (); yyval.node = yyvsp[-1].node; ; break;} ! case 327: ! #line 1910 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { /* We add a block to define a scope for formal_parameter (CCBP). The formal parameter is *************** case 326: *** 4214,4346 **** EXPR_WFL_LINECOL (yyval.node) = yyvsp[-3].operator.location; ; break;} ! case 327: ! #line 1899 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'(' expected"); RECOVER; yyval.node = NULL_TREE;; break;} ! case 328: ! #line 1901 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing term or ')' expected"); RECOVER; yyval.node = NULL_TREE; ; break;} ! case 329: ! #line 1906 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; yyval.node = NULL_TREE;; break;} ! case 330: ! #line 1911 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} ! case 331: ! #line 1913 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'{' expected"); RECOVER; ; break;} ! case 335: ! #line 1925 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_this (yyvsp[0].operator.location); ; break;} ! case 336: ! #line 1927 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = yyvsp[-1].node;; break;} ! case 342: ! #line 1937 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree wfl = build_wfl_node (this_identifier_node); yyval.node = make_qualified_primary (yyvsp[-2].node, wfl, EXPR_WFL_LINECOL (yyvsp[-2].node)); ; break;} - case 343: - #line 1942 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("')' expected"); RECOVER;; - break;} case 344: ! #line 1944 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("'class' or 'this' expected" ); RECOVER;; break;} case 345: ! #line 1946 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("'class' expected" ); RECOVER;; break;} case 346: ! #line 1948 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'class' expected" ); RECOVER;; break;} case 347: ! #line 1953 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; break;} case 348: ! #line 1955 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; break;} case 349: ! #line 1957 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; break;} case 350: ! #line 1959 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, ! void_type_node); ; break;} ! case 351: ! #line 1967 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node); ; break;} ! case 352: ! #line 1969 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_new_invocation (yyvsp[-2].node, NULL_TREE); ; break;} ! case 354: ! #line 1975 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree ctor = build_new_invocation (yyvsp[-2].node, NULL_TREE); yyval.node = make_qualified_primary (yyvsp[-3].node, ctor, EXPR_WFL_LINECOL (yyvsp[-3].node)); ; break;} ! case 356: ! #line 1982 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree ctor = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node); yyval.node = make_qualified_primary (yyvsp[-4].node, ctor, EXPR_WFL_LINECOL (yyvsp[-4].node)); ; break;} ! case 358: ! #line 1989 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'(' expected"); DRECOVER(new_1);; break;} ! case 359: ! #line 1991 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'(' expected"); RECOVER;; break;} ! case 360: ! #line 1993 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("')' or term expected"); RECOVER;; break;} ! case 361: ! #line 1995 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 362: ! #line 1997 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;; break;} ! case 363: ! #line 1999 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'(' expected"); RECOVER;; break;} ! case 364: ! #line 2009 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_anonymous_class (yyvsp[-4].operator.location, yyvsp[-3].node); ; break;} ! case 365: ! #line 2011 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree id = build_wfl_node (DECL_NAME (GET_CPC ())); EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-5].node); --- 4240,4372 ---- EXPR_WFL_LINECOL (yyval.node) = yyvsp[-3].operator.location; ; break;} ! case 328: ! #line 1926 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'(' expected"); RECOVER; yyval.node = NULL_TREE;; break;} ! case 329: ! #line 1928 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing term or ')' expected"); RECOVER; yyval.node = NULL_TREE; ; break;} ! case 330: ! #line 1933 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; yyval.node = NULL_TREE;; break;} ! case 331: ! #line 1938 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[0].node; ; break;} ! case 332: ! #line 1940 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'{' expected"); RECOVER; ; break;} ! case 336: ! #line 1952 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_this (yyvsp[0].operator.location); ; break;} ! case 337: ! #line 1954 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = yyvsp[-1].node;; break;} ! case 343: ! #line 1964 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree wfl = build_wfl_node (this_identifier_node); yyval.node = make_qualified_primary (yyvsp[-2].node, wfl, EXPR_WFL_LINECOL (yyvsp[-2].node)); ; break;} case 344: ! #line 1969 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("')' expected"); RECOVER;; break;} case 345: ! #line 1971 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'class' or 'this' expected" ); RECOVER;; break;} case 346: ! #line 1973 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'class' expected" ); RECOVER;; break;} case 347: ! #line 1975 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("'class' expected" ); RECOVER;; break;} case 348: ! #line 1980 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; break;} case 349: ! #line 1982 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; break;} case 350: ! #line 1984 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, yyvsp[-2].node); ; ! break;} ! case 351: ! #line 1986 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_incomplete_class_ref (yyvsp[-1].operator.location, ! void_type_node); ; break;} ! case 352: ! #line 1994 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node); ; break;} ! case 353: ! #line 1996 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_new_invocation (yyvsp[-2].node, NULL_TREE); ; break;} ! case 355: ! #line 2002 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree ctor = build_new_invocation (yyvsp[-2].node, NULL_TREE); yyval.node = make_qualified_primary (yyvsp[-3].node, ctor, EXPR_WFL_LINECOL (yyvsp[-3].node)); ; break;} ! case 357: ! #line 2009 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree ctor = build_new_invocation (yyvsp[-3].node, yyvsp[-1].node); yyval.node = make_qualified_primary (yyvsp[-4].node, ctor, EXPR_WFL_LINECOL (yyvsp[-4].node)); ; break;} ! case 359: ! #line 2016 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'(' expected"); DRECOVER(new_1);; break;} ! case 360: ! #line 2018 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'(' expected"); RECOVER;; break;} ! case 361: ! #line 2020 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("')' or term expected"); RECOVER;; break;} ! case 362: ! #line 2022 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("')' expected"); RECOVER;; break;} ! case 363: ! #line 2024 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {YYERROR_NOW; yyerror ("Identifier expected"); RECOVER;; break;} ! case 364: ! #line 2026 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'(' expected"); RECOVER;; break;} ! case 365: ! #line 2036 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_anonymous_class (yyvsp[-4].operator.location, yyvsp[-3].node); ; break;} ! case 366: ! #line 2038 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree id = build_wfl_node (DECL_NAME (GET_CPC ())); EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-5].node); *************** case 365: *** 4372,4383 **** ; break;} ! case 366: ! #line 2042 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { create_anonymous_class (yyvsp[-3].operator.location, yyvsp[-2].node); ; break;} ! case 367: ! #line 2044 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree id = build_wfl_node (DECL_NAME (GET_CPC ())); EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-4].node); --- 4398,4409 ---- ; break;} ! case 367: ! #line 2069 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { create_anonymous_class (yyvsp[-3].operator.location, yyvsp[-2].node); ; break;} ! case 368: ! #line 2071 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree id = build_wfl_node (DECL_NAME (GET_CPC ())); EXPR_WFL_LINECOL (id) = EXPR_WFL_LINECOL (yyvsp[-4].node); *************** case 367: *** 4391,4452 **** yyval.node = build_new_invocation (id, NULL_TREE); ; break;} - case 368: - #line 2060 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - { yyval.node = yyvsp[-2].node; ; - break;} case 369: ! #line 2062 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = yyvsp[-2].node; ; break;} case 370: ! #line 2067 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, NULL_TREE); ctxp->formal_parameter_number = 1; ; break;} ! case 371: ! #line 2072 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { ctxp->formal_parameter_number += 1; yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyvsp[-2].node); ; break;} - case 372: - #line 2077 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - {yyerror ("Missing term"); RECOVER;; - break;} case 373: ! #line 2082 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ; break;} case 374: ! #line 2084 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ; break;} case 375: ! #line 2086 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, pop_current_osb (ctxp));; break;} case 376: ! #line 2088 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, pop_current_osb (ctxp));; break;} case 377: ! #line 2092 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { char *sig; int osb = pop_current_osb (ctxp); while (osb--) ! obstack_1grow (&temporary_obstack, '['); sig = obstack_finish (&temporary_obstack); yyval.node = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE, yyvsp[-2].node, get_identifier (sig), yyvsp[0].node); ; break;} ! case 378: ! #line 2102 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { int osb = pop_current_osb (ctxp); tree type = yyvsp[-2].node; --- 4417,4479 ---- yyval.node = build_new_invocation (id, NULL_TREE); ; break;} case 369: ! #line 2087 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = yyvsp[-2].node; ; break;} case 370: ! #line 2089 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = yyvsp[-2].node; ; ! break;} ! case 371: ! #line 2094 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, NULL_TREE); ctxp->formal_parameter_number = 1; ; break;} ! case 372: ! #line 2099 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { ctxp->formal_parameter_number += 1; yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyvsp[-2].node); ; break;} case 373: ! #line 2104 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Missing term"); RECOVER;; break;} case 374: ! #line 2109 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ; break;} case 375: ! #line 2111 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_newarray_node (yyvsp[-1].node, yyvsp[0].node, 0); ; break;} case 376: ! #line 2113 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, pop_current_osb (ctxp));; break;} case 377: ! #line 2115 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_newarray_node (yyvsp[-2].node, yyvsp[-1].node, pop_current_osb (ctxp));; ! break;} ! case 378: ! #line 2119 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { char *sig; int osb = pop_current_osb (ctxp); while (osb--) ! obstack_grow (&temporary_obstack, "[]", 2); ! obstack_1grow (&temporary_obstack, '\0'); sig = obstack_finish (&temporary_obstack); yyval.node = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE, yyvsp[-2].node, get_identifier (sig), yyvsp[0].node); ; break;} ! case 379: ! #line 2130 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { int osb = pop_current_osb (ctxp); tree type = yyvsp[-2].node; *************** case 378: *** 4456,4479 **** build_pointer_type (type), NULL_TREE, yyvsp[0].node); ; break;} ! case 379: ! #line 2111 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("'[' expected"); DRECOVER ("]");; break;} ! case 380: ! #line 2113 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("']' expected"); RECOVER;; break;} ! case 381: ! #line 2118 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_tree_list (NULL_TREE, yyvsp[0].node); ; break;} ! case 382: ! #line 2120 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyval.node); ; break;} ! case 383: ! #line 2125 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { if (JNUMERIC_TYPE_P (TREE_TYPE (yyvsp[-1].node))) { --- 4483,4506 ---- build_pointer_type (type), NULL_TREE, yyvsp[0].node); ; break;} ! case 380: ! #line 2139 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("'[' expected"); DRECOVER ("]");; break;} ! case 381: ! #line 2141 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("']' expected"); RECOVER;; break;} ! case 382: ! #line 2146 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_tree_list (NULL_TREE, yyvsp[0].node); ; break;} ! case 383: ! #line 2148 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = tree_cons (NULL_TREE, yyvsp[0].node, yyval.node); ; break;} ! case 384: ! #line 2153 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { if (JNUMERIC_TYPE_P (TREE_TYPE (yyvsp[-1].node))) { *************** case 383: *** 4484,4503 **** yyval.node = yyvsp[-1].node; ; break;} ! case 384: ! #line 2135 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("']' expected"); RECOVER;; break;} ! case 385: ! #line 2137 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing term"); yyerror ("']' expected"); RECOVER; ; break;} ! case 386: ! #line 2146 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { int allocate = 0; /* If not initialized, allocate memory for the osb --- 4511,4530 ---- yyval.node = yyvsp[-1].node; ; break;} ! case 385: ! #line 2163 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("']' expected"); RECOVER;; break;} ! case 386: ! #line 2165 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing term"); yyerror ("']' expected"); RECOVER; ; break;} ! case 387: ! #line 2174 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { int allocate = 0; /* If not initialized, allocate memory for the osb *************** case 386: *** 4524,4563 **** CURRENT_OSB (ctxp) = 1; ; break;} ! case 387: ! #line 2172 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { CURRENT_OSB (ctxp)++; ; break;} ! case 388: ! #line 2174 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("']' expected"); RECOVER;; break;} ! case 389: ! #line 2179 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = make_qualified_primary (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} ! case 390: ! #line 2183 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree super_wfl = build_wfl_node (super_identifier_node); EXPR_WFL_LINECOL (super_wfl) = yyvsp[-2].operator.location; yyval.node = make_qualified_name (super_wfl, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} ! case 391: ! #line 2189 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Field expected"); DRECOVER (super_field_acces);; break;} ! case 392: ! #line 2194 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-2].node, NULL_TREE); ; break;} ! case 393: ! #line 2196 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-3].node, yyvsp[-1].node); ; break;} ! case 394: ! #line 2198 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { if (TREE_CODE (yyvsp[-4].node) == THIS_EXPR) yyval.node = build_this_super_qualified_invocation --- 4551,4590 ---- CURRENT_OSB (ctxp) = 1; ; break;} ! case 388: ! #line 2200 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { CURRENT_OSB (ctxp)++; ; break;} ! case 389: ! #line 2202 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("']' expected"); RECOVER;; break;} ! case 390: ! #line 2207 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = make_qualified_primary (yyvsp[-2].node, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} ! case 391: ! #line 2211 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree super_wfl = build_wfl_node (super_identifier_node); EXPR_WFL_LINECOL (super_wfl) = yyvsp[-2].operator.location; yyval.node = make_qualified_name (super_wfl, yyvsp[0].node, yyvsp[-1].operator.location); ; break;} ! case 392: ! #line 2217 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Field expected"); DRECOVER (super_field_acces);; break;} ! case 393: ! #line 2222 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-2].node, NULL_TREE); ; break;} ! case 394: ! #line 2224 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_method_invocation (yyvsp[-3].node, yyvsp[-1].node); ; break;} ! case 395: ! #line 2226 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { if (TREE_CODE (yyvsp[-4].node) == THIS_EXPR) yyval.node = build_this_super_qualified_invocation *************** case 394: *** 4569,4576 **** } ; break;} ! case 395: ! #line 2209 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { if (TREE_CODE (yyvsp[-5].node) == THIS_EXPR) yyval.node = build_this_super_qualified_invocation --- 4596,4603 ---- } ; break;} ! case 396: ! #line 2237 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { if (TREE_CODE (yyvsp[-5].node) == THIS_EXPR) yyval.node = build_this_super_qualified_invocation *************** case 395: *** 4582,4703 **** } ; break;} ! case 396: ! #line 2220 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_this_super_qualified_invocation (0, yyvsp[-2].node, NULL_TREE, yyvsp[-4].operator.location, yyvsp[-3].operator.location); ; break;} ! case 397: ! #line 2225 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_this_super_qualified_invocation (0, yyvsp[-3].node, yyvsp[-1].node, yyvsp[-5].operator.location, yyvsp[-4].operator.location); ; break;} - case 398: - #line 2234 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - { yyerror ("'(' expected"); DRECOVER (method_invocation); ; - break;} case 399: ! #line 2236 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("'(' expected"); DRECOVER (method_invocation); ; break;} case 400: ! #line 2241 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! { yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ; break;} case 401: ! #line 2243 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ; break;} case 402: ! #line 2245 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing term and ']' expected"); DRECOVER(array_access); ; break;} ! case 403: ! #line 2250 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("']' expected"); DRECOVER(array_access); ; break;} ! case 404: ! #line 2255 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("Missing term and ']' expected"); DRECOVER(array_access); ; break;} ! case 405: ! #line 2260 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyerror ("']' expected"); DRECOVER(array_access); ; break;} - case 410: - #line 2275 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" - { yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ; - break;} case 411: ! #line 2280 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ; break;} ! case 414: ! #line 2287 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 415: ! #line 2289 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 417: ! #line 2292 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} case 418: ! #line 2294 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyerror ("Missing term"); RECOVER; break;} case 419: ! #line 2299 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ; break;} case 420: ! #line 2301 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} case 421: ! #line 2306 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ; break;} case 422: ! #line 2308 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} case 424: ! #line 2314 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" ! {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} ! case 425: ! #line 2316 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 427: ! #line 2319 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} ! case 428: ! #line 2321 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} ! case 429: ! #line 2326 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { tree type = yyvsp[-3].node; int osb = pop_current_osb (ctxp); --- 4609,4737 ---- } ; break;} ! case 397: ! #line 2248 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_this_super_qualified_invocation (0, yyvsp[-2].node, NULL_TREE, yyvsp[-4].operator.location, yyvsp[-3].operator.location); ; break;} ! case 398: ! #line 2253 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_this_super_qualified_invocation (0, yyvsp[-3].node, yyvsp[-1].node, yyvsp[-5].operator.location, yyvsp[-4].operator.location); ; break;} case 399: ! #line 2262 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("'(' expected"); DRECOVER (method_invocation); ; break;} case 400: ! #line 2264 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyerror ("'(' expected"); DRECOVER (method_invocation); ; break;} case 401: ! #line 2269 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ; break;} case 402: ! #line 2271 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_array_ref (yyvsp[-2].operator.location, yyvsp[-3].node, yyvsp[-1].node); ; ! break;} ! case 403: ! #line 2273 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing term and ']' expected"); DRECOVER(array_access); ; break;} ! case 404: ! #line 2278 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("']' expected"); DRECOVER(array_access); ; break;} ! case 405: ! #line 2283 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("Missing term and ']' expected"); DRECOVER(array_access); ; break;} ! case 406: ! #line 2288 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyerror ("']' expected"); DRECOVER(array_access); ; break;} case 411: ! #line 2303 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ; break;} ! case 412: ! #line 2308 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { yyval.node = build_incdec (yyvsp[0].operator.token, yyvsp[0].operator.location, yyvsp[-1].node, 1); ; break;} case 415: ! #line 2315 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 417: ! #line 2318 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} case 418: ! #line 2323 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! { ! error_if_numeric_overflow (yyvsp[0].node); ! yyval.node = yyvsp[0].node; ! ; break;} case 419: ! #line 2328 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 420: ! #line 2330 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} case 421: ! #line 2335 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ; break;} case 422: ! #line 2337 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} + case 423: + #line 2342 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" + {yyval.node = build_incdec (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node, 0); ; + break;} case 424: ! #line 2344 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyerror ("Missing term"); RECOVER; break;} ! case 426: ! #line 2350 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; break;} case 427: ! #line 2352 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" ! {yyval.node = build_unaryop (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[0].node); ; ! break;} ! case 429: ! #line 2355 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} ! case 430: ! #line 2357 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER; break;} ! case 431: ! #line 2362 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { tree type = yyvsp[-3].node; int osb = pop_current_osb (ctxp); *************** case 429: *** 4706,5003 **** yyval.node = build_cast (yyvsp[-4].operator.location, type, yyvsp[0].node); ; break;} ! case 430: ! #line 2334 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 431: ! #line 2336 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 432: ! #line 2338 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { const char *ptr; int osb = pop_current_osb (ctxp); while (osb--) ! obstack_1grow (&temporary_obstack, '['); ! obstack_grow0 (&temporary_obstack, ! IDENTIFIER_POINTER (EXPR_WFL_NODE (yyvsp[-3].node)), ! IDENTIFIER_LENGTH (EXPR_WFL_NODE (yyvsp[-3].node))); ptr = obstack_finish (&temporary_obstack); EXPR_WFL_NODE (yyvsp[-3].node) = get_identifier (ptr); yyval.node = build_cast (yyvsp[-4].operator.location, yyvsp[-3].node, yyvsp[0].node); ; break;} ! case 433: ! #line 2351 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("']' expected, invalid type expression");; break;} ! case 434: ! #line 2353 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER; RECOVER; ; break;} ! case 435: ! #line 2358 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 436: ! #line 2360 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 437: ! #line 2362 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 439: ! #line 2368 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 440: ! #line 2373 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 441: ! #line 2378 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 442: ! #line 2383 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 443: ! #line 2385 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 444: ! #line 2387 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 446: ! #line 2393 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 447: ! #line 2398 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 448: ! #line 2403 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 449: ! #line 2405 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 451: ! #line 2411 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 452: ! #line 2416 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 453: ! #line 2421 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 454: ! #line 2426 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 455: ! #line 2428 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 456: ! #line 2430 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 458: ! #line 2436 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 459: ! #line 2441 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 460: ! #line 2446 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 461: ! #line 2451 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 462: ! #line 2456 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (INSTANCEOF_EXPR, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 463: ! #line 2458 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 464: ! #line 2460 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 465: ! #line 2462 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 466: ! #line 2464 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 467: ! #line 2466 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Invalid reference type"); RECOVER;; break;} ! case 469: ! #line 2472 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 470: ! #line 2477 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 471: ! #line 2482 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 472: ! #line 2484 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 474: ! #line 2490 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 475: ! #line 2495 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 477: ! #line 2501 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 478: ! #line 2506 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 480: ! #line 2512 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 481: ! #line 2517 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 483: ! #line 2523 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 484: ! #line 2528 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 486: ! #line 2534 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 487: ! #line 2539 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 489: ! #line 2545 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build (CONDITIONAL_EXPR, NULL_TREE, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-3].operator.location; ; break;} ! case 490: ! #line 2550 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { YYERROR_NOW; yyerror ("Missing term"); DRECOVER (1); ; break;} ! case 491: ! #line 2556 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); DRECOVER (2);; break;} ! case 492: ! #line 2558 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" {yyerror ("Missing term"); DRECOVER (3);; break;} ! case 495: ! #line 2568 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { yyval.node = build_assignment (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 496: ! #line 2570 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Missing term"); DRECOVER (assign); --- 4740,5038 ---- yyval.node = build_cast (yyvsp[-4].operator.location, type, yyvsp[0].node); ; break;} ! case 432: ! #line 2370 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 433: ! #line 2372 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_cast (yyvsp[-3].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 434: ! #line 2374 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { const char *ptr; int osb = pop_current_osb (ctxp); + obstack_grow (&temporary_obstack, + IDENTIFIER_POINTER (EXPR_WFL_NODE (yyvsp[-3].node)), + IDENTIFIER_LENGTH (EXPR_WFL_NODE (yyvsp[-3].node))); while (osb--) ! obstack_grow (&temporary_obstack, "[]", 2); ! obstack_1grow (&temporary_obstack, '\0'); ptr = obstack_finish (&temporary_obstack); EXPR_WFL_NODE (yyvsp[-3].node) = get_identifier (ptr); yyval.node = build_cast (yyvsp[-4].operator.location, yyvsp[-3].node, yyvsp[0].node); ; break;} ! case 435: ! #line 2388 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("']' expected, invalid type expression");; break;} ! case 436: ! #line 2390 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Invalid type expression"); RECOVER; RECOVER; ; break;} ! case 437: ! #line 2395 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 438: ! #line 2397 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 439: ! #line 2399 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 441: ! #line 2405 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 442: ! #line 2410 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 443: ! #line 2415 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 444: ! #line 2420 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 445: ! #line 2422 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 446: ! #line 2424 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 448: ! #line 2430 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 449: ! #line 2435 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 450: ! #line 2440 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 451: ! #line 2442 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 453: ! #line 2448 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 454: ! #line 2453 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 455: ! #line 2458 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 456: ! #line 2463 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 457: ! #line 2465 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 458: ! #line 2467 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 460: ! #line 2473 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 461: ! #line 2478 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 462: ! #line 2483 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 463: ! #line 2488 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 464: ! #line 2493 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (INSTANCEOF_EXPR, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 465: ! #line 2495 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 466: ! #line 2497 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 467: ! #line 2499 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 468: ! #line 2501 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 469: ! #line 2503 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Invalid reference type"); RECOVER;; break;} ! case 471: ! #line 2509 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 472: ! #line 2514 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 473: ! #line 2519 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 474: ! #line 2521 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 476: ! #line 2527 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 477: ! #line 2532 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 479: ! #line 2538 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 480: ! #line 2543 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 482: ! #line 2549 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 483: ! #line 2554 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 485: ! #line 2560 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 486: ! #line 2565 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 488: ! #line 2571 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_binop (BINOP_LOOKUP (yyvsp[-1].operator.token), yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 489: ! #line 2576 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); RECOVER;; break;} ! case 491: ! #line 2582 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build (CONDITIONAL_EXPR, NULL_TREE, yyvsp[-4].node, yyvsp[-2].node, yyvsp[0].node); EXPR_WFL_LINECOL (yyval.node) = yyvsp[-3].operator.location; ; break;} ! case 492: ! #line 2587 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { YYERROR_NOW; yyerror ("Missing term"); DRECOVER (1); ; break;} ! case 493: ! #line 2593 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); DRECOVER (2);; break;} ! case 494: ! #line 2595 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" {yyerror ("Missing term"); DRECOVER (3);; break;} ! case 497: ! #line 2605 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { yyval.node = build_assignment (yyvsp[-1].operator.token, yyvsp[-1].operator.location, yyvsp[-2].node, yyvsp[0].node); ; break;} ! case 498: ! #line 2607 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" { YYNOT_TWICE yyerror ("Missing term"); DRECOVER (assign); *************** yyerrhandle: *** 5225,5231 **** } return 1; } ! #line 2595 "/home/mitchell/gcc-3.0.4/gcc-3.0.4/gcc/java/parse.y" /* Helper function to retrieve an OSB count. Should be used when the --- 5260,5266 ---- } return 1; } ! #line 2632 "/home/mitchell/gcc-3.1/gcc-3.1/gcc/java/parse.y" /* Helper function to retrieve an OSB count. Should be used when the *************** static void *** 5380,5386 **** java_parser_context_suspend () { /* This makes debugging through java_debug_context easier */ ! static const char *name = ""; /* Duplicate the previous context, use it to save the globals we're interested in */ --- 5415,5421 ---- java_parser_context_suspend () { /* This makes debugging through java_debug_context easier */ ! static const char *const name = ""; /* Duplicate the previous context, use it to save the globals we're interested in */ *************** java_parser_context_resume () *** 5421,5428 **** ctxp = restored; /* Re-installed the data for the parsing to carry on */ ! bcopy (&old->marker_begining, &ctxp->marker_begining, ! (size_t)(&ctxp->marker_end - &ctxp->marker_begining)); /* Buffer context can now be discarded */ free (saver); --- 5456,5463 ---- ctxp = restored; /* Re-installed the data for the parsing to carry on */ ! memcpy (&ctxp->marker_begining, &old->marker_begining, ! (size_t)(&ctxp->marker_end - &ctxp->marker_begining)); /* Buffer context can now be discarded */ free (saver); *************** issue_warning_error_from_context (cl, ms *** 5691,5709 **** void parse_error_context VPARAMS ((tree cl, const char *msg, ...)) { ! #ifndef ANSI_PROTOTYPES ! tree cl; ! const char *msg; ! #endif ! va_list ap; ! ! VA_START (ap, msg); ! #ifndef ANSI_PROTOTYPES ! cl = va_arg (ap, tree); ! msg = va_arg (ap, const char *); ! #endif issue_warning_error_from_context (cl, msg, ap); ! va_end (ap); } /* Issue a warning at a current source line CL */ --- 5726,5736 ---- void parse_error_context VPARAMS ((tree cl, const char *msg, ...)) { ! VA_OPEN (ap, msg); ! VA_FIXEDARG (ap, tree, cl); ! VA_FIXEDARG (ap, const char *, msg); issue_warning_error_from_context (cl, msg, ap); ! VA_CLOSE (ap); } /* Issue a warning at a current source line CL */ *************** parse_error_context VPARAMS ((tree cl, c *** 5711,5732 **** static void parse_warning_context VPARAMS ((tree cl, const char *msg, ...)) { ! #ifndef ANSI_PROTOTYPES ! tree cl; ! const char *msg; ! #endif ! va_list ap; ! ! VA_START (ap, msg); ! #ifndef ANSI_PROTOTYPES ! cl = va_arg (ap, tree); ! msg = va_arg (ap, const char *); ! #endif force_error = do_warning = 1; issue_warning_error_from_context (cl, msg, ap); do_warning = force_error = 0; ! va_end (ap); } static tree --- 5738,5751 ---- static void parse_warning_context VPARAMS ((tree cl, const char *msg, ...)) { ! VA_OPEN (ap, msg); ! VA_FIXEDARG (ap, tree, cl); ! VA_FIXEDARG (ap, const char *, msg); force_error = do_warning = 1; issue_warning_error_from_context (cl, msg, ap); do_warning = force_error = 0; ! VA_CLOSE (ap); } static tree *************** variable_redefinition_error (context, na *** 5876,5900 **** type_name, IDENTIFIER_POINTER (name), line); } static tree build_array_from_name (type, type_wfl, name, ret_name) tree type, type_wfl, name, *ret_name; { int more_dims = 0; - const char *string; /* Eventually get more dims */ ! string = IDENTIFIER_POINTER (name); ! while (string [more_dims] == '[') ! more_dims++; /* If we have, then craft a new type for this variable */ if (more_dims) { tree save = type; - name = get_identifier (&string [more_dims]); - /* If we have a pointer, use its type */ if (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); --- 5895,5936 ---- type_name, IDENTIFIER_POINTER (name), line); } + /* If ANAME is terminated with `[]', it indicates an array. This + function returns the number of `[]' found and if this number is + greater than zero, it extracts the array type name and places it in + the node pointed to by TRIMMED unless TRIMMED is null. */ + + static int + build_type_name_from_array_name (aname, trimmed) + tree aname; + tree *trimmed; + { + const char *name = IDENTIFIER_POINTER (aname); + int len = IDENTIFIER_LENGTH (aname); + int array_dims; + + STRING_STRIP_BRACKETS (name, len, array_dims); + + if (array_dims && trimmed) + *trimmed = get_identifier_with_length (name, len); + + return array_dims; + } + static tree build_array_from_name (type, type_wfl, name, ret_name) tree type, type_wfl, name, *ret_name; { int more_dims = 0; /* Eventually get more dims */ ! more_dims = build_type_name_from_array_name (name, &name); /* If we have, then craft a new type for this variable */ if (more_dims) { tree save = type; /* If we have a pointer, use its type */ if (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); *************** build_array_from_name (type, type_wfl, n *** 5911,5922 **** on adding dimensions) */ else if (type_wfl) { - int i = 0; type = type_wfl; ! string = IDENTIFIER_POINTER (TYPE_NAME (save)); ! while (string[i] == '[') ! ++i; ! more_dims += i; } /* Add all the dimensions */ --- 5947,5955 ---- on adding dimensions) */ else if (type_wfl) { type = type_wfl; ! more_dims += build_type_name_from_array_name (TYPE_NAME (save), ! NULL); } /* Add all the dimensions */ *************** build_unresolved_array_type (type_or_wfl *** 5949,5963 **** if (TREE_CODE (type_or_wfl) == RECORD_TYPE) return build_java_array_type (type_or_wfl, -1); ! obstack_1grow (&temporary_obstack, '['); ! obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)), IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl))); ptr = obstack_finish (&temporary_obstack); wfl = build_expr_wfl (get_identifier (ptr), ! EXPR_WFL_FILENAME (type_or_wfl), ! EXPR_WFL_LINENO (type_or_wfl), ! EXPR_WFL_COLNO (type_or_wfl)); /* Re-install the existing qualifications so that the type can be resolved properly. */ EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl); --- 5982,5996 ---- if (TREE_CODE (type_or_wfl) == RECORD_TYPE) return build_java_array_type (type_or_wfl, -1); ! obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)), IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl))); + obstack_grow0 (&temporary_obstack, "[]", 2); ptr = obstack_finish (&temporary_obstack); wfl = build_expr_wfl (get_identifier (ptr), ! EXPR_WFL_FILENAME (type_or_wfl), ! EXPR_WFL_LINENO (type_or_wfl), ! EXPR_WFL_COLNO (type_or_wfl)); /* Re-install the existing qualifications so that the type can be resolved properly. */ EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl); *************** check_class_interface_creation (is_inter *** 6069,6075 **** else { check_modifiers_consistency (flags); ! icaf = ACC_PRIVATE|ACC_PROTECTED; } } --- 6102,6110 ---- else { check_modifiers_consistency (flags); ! icaf = ACC_PROTECTED; ! if (! CLASS_INTERFACE (GET_CPC ())) ! icaf |= ACC_PRIVATE; } } *************** make_nested_class_name (cpc_list) *** 6108,6119 **** TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list))); obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)); - /* Why is NO_DOLLAR_IN_LABEL defined? */ - #if 0 - #ifdef NO_DOLLAR_IN_LABEL - internal_error ("Can't use '$' as a separator for inner classes"); - #endif - #endif obstack_1grow (&temporary_obstack, '$'); } --- 6143,6148 ---- *************** check_inner_class_redefinition (raw_name *** 6137,6142 **** --- 6166,6240 ---- return 0; } + /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail, + we remember ENCLOSING and SUPER. */ + + static tree + resolve_inner_class (circularity_hash, cl, enclosing, super, class_type) + struct hash_table *circularity_hash; + tree cl, *enclosing, *super, class_type; + { + tree local_enclosing = *enclosing; + tree local_super = NULL_TREE; + + while (local_enclosing) + { + tree intermediate, decl; + + hash_lookup (circularity_hash, + (const hash_table_key) local_enclosing, TRUE, NULL); + + if ((decl = find_as_inner_class (local_enclosing, class_type, cl))) + return decl; + + intermediate = local_enclosing; + /* Explore enclosing contexts. */ + while (INNER_CLASS_DECL_P (intermediate)) + { + intermediate = DECL_CONTEXT (intermediate); + if ((decl = find_as_inner_class (intermediate, class_type, cl))) + return decl; + } + + /* Now go to the upper classes, bail out if necessary. We will + analyze the returned SUPER and act accordingly (see + do_resolve_class.) */ + local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing)); + if (!local_super || local_super == object_type_node) + break; + + if (TREE_CODE (local_super) == POINTER_TYPE) + local_super = do_resolve_class (NULL, local_super, NULL, NULL); + else + local_super = TYPE_NAME (local_super); + + /* We may not have checked for circular inheritance yet, so do so + here to prevent an infinite loop. */ + if (hash_lookup (circularity_hash, + (const hash_table_key) local_super, FALSE, NULL)) + { + if (!cl) + cl = lookup_cl (local_enclosing); + + parse_error_context + (cl, "Cyclic inheritance involving %s", + IDENTIFIER_POINTER (DECL_NAME (local_enclosing))); + local_enclosing = NULL_TREE; + } + else + local_enclosing = local_super; + } + + /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */ + *super = local_super; + *enclosing = local_enclosing; + + return NULL_TREE; + } + + /* Within ENCLOSING, find a decl for NAME and return it. NAME can be + qualified. */ + static tree find_as_inner_class (enclosing, name, cl) tree enclosing, name, cl; *************** find_as_inner_class (enclosing, name, cl *** 6170,6187 **** acc = merge_qualified_name (acc, EXPR_WFL_NODE (TREE_PURPOSE (qual))); BUILD_PTR_FROM_NAME (ptr, acc); ! ! /* Don't try to resolve ACC as a class name if it follows ! the current package name. We don't want to pick something ! that's accidentally there: for example `a.b.c' in package ! `a.b' shouldn't trigger loading `a' if it's there by ! itself. */ ! if (ctxp->package ! && strstr (IDENTIFIER_POINTER (ctxp->package), ! IDENTIFIER_POINTER (acc))) ! decl = NULL; ! else ! decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl); } /* A NULL qual and a decl means that the search ended --- 6268,6274 ---- acc = merge_qualified_name (acc, EXPR_WFL_NODE (TREE_PURPOSE (qual))); BUILD_PTR_FROM_NAME (ptr, acc); ! decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl); } /* A NULL qual and a decl means that the search ended *************** find_as_inner_class (enclosing, name, cl *** 6195,6201 **** /* Otherwise, create a qual for the other part of the resolution. */ else qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE); ! return find_as_inner_class_do (qual, enclosing); } --- 6282,6288 ---- /* Otherwise, create a qual for the other part of the resolution. */ else qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE); ! return find_as_inner_class_do (qual, enclosing); } *************** link_nested_class_to_enclosing () *** 6254,6260 **** DECL_INNER_CLASS_LIST (enclosing) = tree_cons (GET_CPC (), GET_CPC_UN (), DECL_INNER_CLASS_LIST (enclosing)); - enclosing = enclosing; } } --- 6341,6346 ---- *************** create_interface (flags, id, super) *** 6357,6362 **** --- 6443,6453 ---- tree q_name = parser_qualified_classname (raw_name); tree decl = IDENTIFIER_CLASS_VALUE (q_name); + /* Certain syntax errors are making SUPER be like ID. Avoid this + case. */ + if (ctxp->class_err && id == super) + super = NULL; + EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */ /* Basic checks: scope, redefinition, modifiers */ *************** create_interface (flags, id, super) *** 6369,6375 **** /* Suspend the current parsing context if we're parsing an inner interface */ if (CPC_INNER_P ()) ! java_parser_context_suspend (); /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); --- 6460,6471 ---- /* Suspend the current parsing context if we're parsing an inner interface */ if (CPC_INNER_P ()) ! { ! java_parser_context_suspend (); ! /* Interface members are public. */ ! if (CLASS_INTERFACE (GET_CPC ())) ! flags |= ACC_PUBLIC; ! } /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); *************** create_interface (flags, id, super) *** 6381,6387 **** if ((flags & ACC_ABSTRACT) && flag_redundant) parse_warning_context (MODIFIER_WFL (ABSTRACT_TK), ! "Redundant use of `abstract' modifier. Interface `%s' is implicitely abstract", IDENTIFIER_POINTER (raw_name)); /* Create a new decl if DECL is NULL, otherwise fix it */ decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id); --- 6477,6483 ---- if ((flags & ACC_ABSTRACT) && flag_redundant) parse_warning_context (MODIFIER_WFL (ABSTRACT_TK), ! "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract", IDENTIFIER_POINTER (raw_name)); /* Create a new decl if DECL is NULL, otherwise fix it */ decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id); *************** create_class (flags, id, super, interfac *** 6489,6494 **** --- 6585,6595 ---- tree class_id, decl; tree super_decl_type; + /* Certain syntax errors are making SUPER be like ID. Avoid this + case. */ + if (ctxp->class_err && id == super) + super = NULL; + class_id = parser_qualified_classname (raw_name); decl = IDENTIFIER_CLASS_VALUE (class_id); EXPR_WFL_NODE (id) = class_id; *************** create_class (flags, id, super, interfac *** 6503,6509 **** /* Suspend the current parsing context if we're parsing an inner class or an anonymous class. */ if (CPC_INNER_P ()) ! java_parser_context_suspend (); /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); --- 6604,6616 ---- /* Suspend the current parsing context if we're parsing an inner class or an anonymous class. */ if (CPC_INNER_P ()) ! { ! java_parser_context_suspend (); ! /* Interface members are public. */ ! if (CLASS_INTERFACE (GET_CPC ())) ! flags |= ACC_PUBLIC; ! } ! /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); *************** static void *** 6581,6593 **** end_class_declaration (resume) int resume; { ! /* If an error occured, context weren't pushed and won't need to be popped by a resume. */ ! int no_error_occured = ctxp->next && GET_CPC () != error_mark_node; java_parser_context_pop_initialized_field (); POP_CPC (); ! if (resume && no_error_occured) java_parser_context_resume (); /* We're ending a class declaration, this is a good time to reset --- 6688,6703 ---- end_class_declaration (resume) int resume; { ! /* If an error occurred, context weren't pushed and won't need to be popped by a resume. */ ! int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node; ! ! if (GET_CPC () != error_mark_node) ! dump_java_tree (TDI_class, GET_CPC ()); java_parser_context_pop_initialized_field (); POP_CPC (); ! if (resume && no_error_occurred) java_parser_context_resume (); /* We're ending a class declaration, this is a good time to reset *************** lookup_field_wrapper (class, name) *** 6730,6735 **** --- 6840,6852 ---- decl = lookup_field (&type, name); } + /* If the field still hasn't been found, try the next enclosing context. */ + if (!decl && INNER_CLASS_TYPE_P (class)) + { + tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class))); + decl = lookup_field_wrapper (outer_type, name); + } + java_parser_context_restore_global (); return decl == error_mark_node ? NULL : decl; } *************** register_fields (flags, type, variable_l *** 6860,6873 **** /* If the field denotes a final instance variable, then we allocate a LANG_DECL_SPECIFIC part to keep track of its initialization. We also mark whether the field was ! initialized upon it's declaration. We don't do that if the created field is an alias to a final local. */ if (!ARG_FINAL_P (current) && (flags & ACC_FINAL)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl); DECL_FIELD_FINAL_WFL (field_decl) = cl; - if ((flags & ACC_STATIC) && init) - DECL_FIELD_FINAL_IUD (field_decl) = 1; } /* If the couple initializer/initialized is marked ARG_FINAL_P, --- 6977,6988 ---- /* If the field denotes a final instance variable, then we allocate a LANG_DECL_SPECIFIC part to keep track of its initialization. We also mark whether the field was ! initialized upon its declaration. We don't do that if the created field is an alias to a final local. */ if (!ARG_FINAL_P (current) && (flags & ACC_FINAL)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl); DECL_FIELD_FINAL_WFL (field_decl) = cl; } /* If the couple initializer/initialized is marked ARG_FINAL_P, *************** register_fields (flags, type, variable_l *** 6921,6927 **** /* Generate finit$, using the list of initialized fields to populate its body. finit$'s parameter(s) list is adjusted to include the one(s) used to initialized the field(s) caching outer context ! local(s). */ static tree generate_finit (class_type) --- 7036,7042 ---- /* Generate finit$, using the list of initialized fields to populate its body. finit$'s parameter(s) list is adjusted to include the one(s) used to initialized the field(s) caching outer context ! local(s). */ static tree generate_finit (class_type) *************** generate_finit (class_type) *** 6951,6979 **** return mdecl; } static tree ! build_instance_initializer (mdecl) ! tree mdecl; { - tree compound = NULL_TREE; - tree stmt_list = TYPE_II_STMT_LIST (DECL_CONTEXT (mdecl)); tree current; ! for (current = stmt_list; current; current = TREE_CHAIN (current)) compound = add_stmt_to_compound (compound, NULL_TREE, current); ! return compound; } ! static void ! add_instance_initializer (mdecl) ! tree mdecl; { ! tree compound = build_instance_initializer (mdecl); ! if (compound) ! java_method_add_stmt (mdecl, build1 (INSTANCE_INITIALIZERS_EXPR, ! NULL_TREE, compound)); } /* Shared accros method_declarator and method_header to remember the --- 7066,7136 ---- return mdecl; } + /* Generate a function to run the instance initialization code. The + private method is called `instinit$'. Unless we're dealing with an + anonymous class, we determine whether all ctors of CLASS_TYPE + declare a checked exception in their `throws' clause in order to + see whether it's necessary to encapsulate the instance initializer + statements in a try/catch/rethrow sequence. */ + static tree ! generate_instinit (class_type) ! tree class_type; { tree current; + tree compound = NULL_TREE; + tree parms = tree_cons (this_identifier_node, + build_pointer_type (class_type), end_params_node); + tree mdecl = create_artificial_method (class_type, ACC_PRIVATE, + void_type_node, + instinit_identifier_node, parms); ! layout_class_method (class_type, CLASSTYPE_SUPER (class_type), ! mdecl, NULL_TREE); ! ! /* Gather all the statements in a compound */ ! for (current = TYPE_II_STMT_LIST (class_type); ! current; current = TREE_CHAIN (current)) compound = add_stmt_to_compound (compound, NULL_TREE, current); ! /* We need to encapsulate COMPOUND by a try/catch statement to ! rethrow exceptions that might occur in the instance initializer. ! We do that only if all ctors of CLASS_TYPE are set to catch a ! checked exception. This doesn't apply to anonymous classes (since ! they don't have declared ctors.) */ ! if (!ANONYMOUS_CLASS_P (class_type) && ! ctors_unchecked_throws_clause_p (class_type)) ! { ! compound = encapsulate_with_try_catch (0, exception_type_node, compound, ! build1 (THROW_EXPR, NULL_TREE, ! build_wfl_node (wpv_id))); ! DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, ! exception_type_node); ! } ! ! start_artificial_method_body (mdecl); ! java_method_add_stmt (mdecl, compound); ! end_artificial_method_body (mdecl); ! ! return mdecl; } ! /* FIXME */ ! static tree ! build_instinit_invocation (class_type) ! tree class_type; { ! tree to_return = NULL_TREE; ! if (TYPE_II_STMT_LIST (class_type)) ! { ! tree parm = build_tree_list (NULL_TREE, ! build_wfl_node (this_identifier_node)); ! to_return = ! build_method_invocation (build_wfl_node (instinit_identifier_node), ! parm); ! } ! return to_return; } /* Shared accros method_declarator and method_header to remember the *************** method_header (flags, type, mdecl, throw *** 7024,7030 **** ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static"); ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final"); ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native"); ! ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED,id, "Synchronized"); if (!CLASS_ABSTRACT (TYPE_NAME (this_class)) && !CLASS_INTERFACE (TYPE_NAME (this_class))) parse_error_context --- 7181,7188 ---- ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static"); ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final"); ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native"); ! ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized"); ! ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp"); if (!CLASS_ABSTRACT (TYPE_NAME (this_class)) && !CLASS_INTERFACE (TYPE_NAME (this_class))) parse_error_context *************** method_header (flags, type, mdecl, throw *** 7050,7055 **** --- 7208,7214 ---- JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final"); JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native"); JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized"); + JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp"); } /* If we found error here, we don't consider it's OK to tread the method definition as a constructor, for the rest of this *************** parser_check_super_interface (super_decl *** 7549,7567 **** if (!CLASS_INTERFACE (super_decl)) { parse_error_context ! (this_wfl, "Can't use %s `%s' to implement/extend %s `%s'", ! (TYPE_ARRAY_P (super_type) ? "array" : "class"), ! IDENTIFIER_POINTER (DECL_NAME (super_decl)), (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ? ! "interface" : "class"), ! IDENTIFIER_POINTER (DECL_NAME (this_decl))); return 1; } /* Check top-level interface access. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && check_pkg_class_access (DECL_NAME (super_decl), lookup_cl (this_decl))) return 1; SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s", --- 7708,7727 ---- if (!CLASS_INTERFACE (super_decl)) { parse_error_context ! (this_wfl, "%s `%s' can't implement/extend %s `%s'", (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ? ! "Interface" : "Class"), ! IDENTIFIER_POINTER (DECL_NAME (this_decl)), ! (TYPE_ARRAY_P (super_type) ? "array" : "class"), ! IDENTIFIER_POINTER (DECL_NAME (super_decl))); return 1; } /* Check top-level interface access. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && check_pkg_class_access (DECL_NAME (super_decl), ! lookup_cl (this_decl), true)) return 1; SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s", *************** parser_check_super (super_decl, this_dec *** 7600,7606 **** /* Check top-level class scope. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && (check_pkg_class_access (DECL_NAME (super_decl), wfl))) return 1; SOURCE_FRONTEND_DEBUG (("Completing class %s with %s", --- 7760,7766 ---- /* Check top-level class scope. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true))) return 1; SOURCE_FRONTEND_DEBUG (("Completing class %s with %s", *************** register_incomplete_type (kind, wfl, dec *** 7682,7691 **** JDEP_MISC (new) = NULL_TREE; /* For some dependencies, set the enclosing class of the current class to be the enclosing context */ ! if ((kind == JDEP_SUPER || kind == JDEP_INTERFACE ! || kind == JDEP_ANONYMOUS || kind == JDEP_FIELD) && GET_ENCLOSING_CPC ()) JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ()); else JDEP_ENCLOSING (new) = GET_CPC (); JDEP_GET_PATCH (new) = (tree *)NULL; --- 7842,7853 ---- JDEP_MISC (new) = NULL_TREE; /* For some dependencies, set the enclosing class of the current class to be the enclosing context */ ! if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS) && GET_ENCLOSING_CPC ()) JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ()); + else if (kind == JDEP_SUPER) + JDEP_ENCLOSING (new) = (GET_ENCLOSING_CPC () ? + TREE_VALUE (GET_ENCLOSING_CPC ()) : NULL_TREE); else JDEP_ENCLOSING (new) = GET_CPC (); JDEP_GET_PATCH (new) = (tree *)NULL; *************** register_incomplete_type (kind, wfl, dec *** 7695,7700 **** --- 7857,7945 ---- return ptr; } + /* This checks for circular references with innerclasses. We start + from SOURCE and should never reach TARGET. Extended/implemented + types in SOURCE have their enclosing context checked not to reach + TARGET. When the last enclosing context of SOURCE is reached, its + extended/implemented types are also checked not to reach TARGET. + In case of error, WFL of the offending type is returned; NULL_TREE + otherwise. */ + + static tree + check_inner_circular_reference (source, target) + tree source; + tree target; + { + tree basetype_vec = TYPE_BINFO_BASETYPES (source); + tree ctx, cl; + int i; + + if (!basetype_vec) + return NULL_TREE; + + for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++) + { + tree su; + + /* We can end up with a NULL_TREE or an incomplete type here if + we encountered previous type resolution errors. It's safe to + simply ignore these cases. */ + if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE) + continue; + su = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)); + if (INCOMPLETE_TYPE_P (su)) + continue; + + if (inherits_from_p (su, target)) + return lookup_cl (TYPE_NAME (su)); + + for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx)) + { + /* An enclosing context shouldn't be TARGET */ + if (ctx == TYPE_NAME (target)) + return lookup_cl (TYPE_NAME (su)); + + /* When we reach the enclosing last context, start a check + on it, with the same target */ + if (! DECL_CONTEXT (ctx) && + (cl = check_inner_circular_reference (TREE_TYPE (ctx), target))) + return cl; + } + } + return NULL_TREE; + } + + /* Explore TYPE's `extends' clause member(s) and return the WFL of the + offending type if a circularity is detected. NULL_TREE is returned + otherwise. TYPE can be an interface or a class. */ + + static tree + check_circular_reference (type) + tree type; + { + tree basetype_vec = TYPE_BINFO_BASETYPES (type); + int i; + + if (!basetype_vec) + return NULL_TREE; + + if (! CLASS_INTERFACE (TYPE_NAME (type))) + { + if (inherits_from_p (CLASSTYPE_SUPER (type), type)) + return lookup_cl (TYPE_NAME (type)); + return NULL_TREE; + } + + for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++) + { + tree vec_elt = TREE_VEC_ELT (basetype_vec, i); + if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node + && interface_of_p (type, BINFO_TYPE (vec_elt))) + return lookup_cl (TYPE_NAME (BINFO_TYPE (vec_elt))); + } + return NULL_TREE; + } + void java_check_circular_reference () { *************** java_check_circular_reference () *** 7702,7731 **** for (current = ctxp->class_list; current; current = TREE_CHAIN (current)) { tree type = TREE_TYPE (current); ! if (CLASS_INTERFACE (current)) ! { ! /* Check all interfaces this class extends */ ! tree basetype_vec = TYPE_BINFO_BASETYPES (type); ! int n, i; ! if (!basetype_vec) ! return; ! n = TREE_VEC_LENGTH (basetype_vec); ! for (i = 0; i < n; i++) ! { ! tree vec_elt = TREE_VEC_ELT (basetype_vec, i); ! if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node ! && interface_of_p (type, BINFO_TYPE (vec_elt))) ! parse_error_context (lookup_cl (current), ! "Cyclic interface inheritance"); ! } ! } ! else ! if (inherits_from_p (CLASSTYPE_SUPER (type), type)) ! parse_error_context (lookup_cl (current), ! "Cyclic class inheritance%s", ! (cyclic_inheritance_report ? ! cyclic_inheritance_report : "")); } } --- 7947,7961 ---- for (current = ctxp->class_list; current; current = TREE_CHAIN (current)) { tree type = TREE_TYPE (current); ! tree cl; ! cl = check_circular_reference (type); ! if (! cl) ! cl = check_inner_circular_reference (type, type); ! if (cl) ! parse_error_context (cl, "Cyclic class inheritance%s", ! (cyclic_inheritance_report ? ! cyclic_inheritance_report : "")); } } *************** build_alias_initializer_parameter_list ( *** 7817,7823 **** where found. ARGS is non NULL when a special signature must be enforced. This is the case for anonymous classes. */ ! static void craft_constructor (class_decl, args) tree class_decl, args; { --- 8047,8053 ---- where found. ARGS is non NULL when a special signature must be enforced. This is the case for anonymous classes. */ ! static tree craft_constructor (class_decl, args) tree class_decl, args; { *************** craft_constructor (class_decl, args) *** 7866,7871 **** --- 8096,8102 ---- /* Now, mark the artificial parameters. */ DECL_FUNCTION_NAP (decl) = artificial; DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1; + return decl; } *************** java_complete_class () *** 7977,7982 **** --- 8208,8220 ---- cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd)) { jdep *dep; + + /* We keep the compilation unit imports in the class so that + they can be used later to resolve type dependencies that + aren't necessary to solve now. */ + TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list; + TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list; + for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep)) { tree decl; *************** java_complete_class () *** 8043,8049 **** tree mdecl = JDEP_DECL (dep), signature; /* Recompute and reset the signature, check first that all types are now defined. If they're not, ! dont build the signature. */ if (check_method_types_complete (mdecl)) { signature = build_java_signature (TREE_TYPE (mdecl)); --- 8281,8287 ---- tree mdecl = JDEP_DECL (dep), signature; /* Recompute and reset the signature, check first that all types are now defined. If they're not, ! don't build the signature. */ if (check_method_types_complete (mdecl)) { signature = build_java_signature (TREE_TYPE (mdecl)); *************** static tree *** 8102,8110 **** resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! const char *name = IDENTIFIER_POINTER (TYPE_NAME (class_type)); ! const char *base = name; tree resolved_type = TREE_TYPE (class_type); tree resolved_type_decl; if (resolved_type != NULL_TREE) --- 8340,8348 ---- resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! tree tname = TYPE_NAME (class_type); tree resolved_type = TREE_TYPE (class_type); + int array_dims = 0; tree resolved_type_decl; if (resolved_type != NULL_TREE) *************** resolve_class (enclosing, class_type, de *** 8122,8134 **** /* 1- Check to see if we have an array. If true, find what we really want to resolve */ ! while (name[0] == '[') ! name++; ! if (base != name) ! { ! TYPE_NAME (class_type) = get_identifier (name); ! WFL_STRIP_BRACKET (cl, cl); ! } /* 2- Resolve the bare type */ if (!(resolved_type_decl = do_resolve_class (enclosing, class_type, --- 8360,8368 ---- /* 1- Check to see if we have an array. If true, find what we really want to resolve */ ! if ((array_dims = build_type_name_from_array_name (tname, ! &TYPE_NAME (class_type)))) ! WFL_STRIP_BRACKET (cl, cl); /* 2- Resolve the bare type */ if (!(resolved_type_decl = do_resolve_class (enclosing, class_type, *************** resolve_class (enclosing, class_type, de *** 8137,8151 **** resolved_type = TREE_TYPE (resolved_type_decl); /* 3- If we have and array, reconstruct the array down to its nesting */ ! if (base != name) { ! while (base != name) ! { ! resolved_type = build_java_array_type (resolved_type, -1); ! name--; ! } ! /* A TYPE_NAME that is a TYPE_DECL was set in ! build_java_array_type, return it. */ resolved_type_decl = TYPE_NAME (resolved_type); } TREE_TYPE (class_type) = resolved_type; --- 8371,8380 ---- resolved_type = TREE_TYPE (resolved_type_decl); /* 3- If we have and array, reconstruct the array down to its nesting */ ! if (array_dims) { ! for (; array_dims; array_dims--) ! resolved_type = build_java_array_type (resolved_type, -1); resolved_type_decl = TYPE_NAME (resolved_type); } TREE_TYPE (class_type) = resolved_type; *************** resolve_class (enclosing, class_type, de *** 8153,8221 **** } /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL ! are used to report error messages. */ tree do_resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! tree new_class_decl, super, start; ! ! /* Do not try to replace TYPE_NAME (class_type) by a variable, since ! it is changed by find_in_imports{_on_demand} and (but it doesn't ! really matter) qualify_and_find */ ! /* 0- Search in the current class as an inner class */ ! start = enclosing; ! /* Maybe some code here should be added to load the class or something, at least if the class isn't an inner class and ended being loaded from class file. FIXME. */ while (enclosing) { ! tree intermediate; ! ! if ((new_class_decl = find_as_inner_class (enclosing, class_type, cl))) ! return new_class_decl; ! ! intermediate = enclosing; ! /* Explore enclosing contexts. */ ! while (INNER_CLASS_DECL_P (intermediate)) ! { ! intermediate = DECL_CONTEXT (intermediate); ! if ((new_class_decl = find_as_inner_class (intermediate, ! class_type, cl))) ! return new_class_decl; ! } ! ! /* Now go to the upper classes, bail out if necessary. */ ! super = CLASSTYPE_SUPER (TREE_TYPE (enclosing)); ! if (!super || super == object_type_node) ! break; ! if (TREE_CODE (super) == POINTER_TYPE) ! super = do_resolve_class (NULL, super, NULL, NULL); else ! super = TYPE_NAME (super); ! ! /* We may not have checked for circular inheritance yet, so do so ! here to prevent an infinite loop. */ ! if (super == start) ! { ! if (!cl) ! cl = lookup_cl (decl); ! ! parse_error_context ! (cl, "Cyclic inheritance involving %s", ! IDENTIFIER_POINTER (DECL_NAME (enclosing))); ! break; ! } ! enclosing = super; } /* 1- Check for the type in single imports. This will change TYPE_NAME() if something relevant is found */ ! find_in_imports (class_type); /* 2- And check for the type in the current compilation unit */ if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) --- 8382,8436 ---- } /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL ! are used to report error messages. Do not try to replace TYPE_NAME ! (class_type) by a variable, since it is changed by ! find_in_imports{_on_demand} and (but it doesn't really matter) ! qualify_and_find. */ tree do_resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! tree new_class_decl = NULL_TREE, super = NULL_TREE; ! tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE; ! tree decl_result; ! struct hash_table _ht, *circularity_hash = &_ht; ! /* This hash table is used to register the classes we're going ! through when searching the current class as an inner class, in ! order to detect circular references. Remember to free it before ! returning the section 0- of this function. */ ! hash_table_init (circularity_hash, hash_newfunc, ! java_hash_hash_tree_node, java_hash_compare_tree_node); ! /* 0- Search in the current class as an inner class. ! Maybe some code here should be added to load the class or something, at least if the class isn't an inner class and ended being loaded from class file. FIXME. */ while (enclosing) { ! new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing, ! &super, class_type); ! if (new_class_decl) ! break; ! /* If we haven't found anything because SUPER reached Object and ! ENCLOSING happens to be an innerclass, try the enclosing context. */ ! if ((!super || super == object_type_node) && ! enclosing && INNER_CLASS_DECL_P (enclosing)) ! enclosing = DECL_CONTEXT (enclosing); else ! enclosing = NULL_TREE; } + hash_table_free (circularity_hash); + + if (new_class_decl) + return new_class_decl; + /* 1- Check for the type in single imports. This will change TYPE_NAME() if something relevant is found */ ! find_in_imports (saved_enclosing_type, class_type); /* 2- And check for the type in the current compilation unit */ if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) *************** do_resolve_class (enclosing, class_type, *** 8237,8243 **** /* 4- Check the import on demands. Don't allow bar.baz to be imported from foo.* */ if (!QUALIFIED_P (TYPE_NAME (class_type))) ! if (find_in_imports_on_demand (class_type)) return NULL_TREE; /* If found in find_in_imports_on_demant, the type has already been --- 8452,8458 ---- /* 4- Check the import on demands. Don't allow bar.baz to be imported from foo.* */ if (!QUALIFIED_P (TYPE_NAME (class_type))) ! if (find_in_imports_on_demand (saved_enclosing_type, class_type)) return NULL_TREE; /* If found in find_in_imports_on_demant, the type has already been *************** do_resolve_class (enclosing, class_type, *** 8272,8283 **** by the caller. */ if (cl) { ! if (check_pkg_class_access (TYPE_NAME (class_type), cl)) return NULL_TREE; } ! /* 6- Last call for a resolution */ ! return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); } static tree --- 8487,8523 ---- by the caller. */ if (cl) { ! if (check_pkg_class_access (TYPE_NAME (class_type), cl, true)) return NULL_TREE; } ! /* 6- Last call for a resolution */ ! decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); ! ! /* The final lookup might have registered a.b.c into a.b$c If we ! failed at the first lookup, progressively change the name if ! applicable and use the matching DECL instead. */ ! if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type))) ! { ! char *separator; ! tree name = TYPE_NAME (class_type); ! char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1); ! ! strcpy (namebuffer, IDENTIFIER_POINTER (name)); ! ! do { ! ! /* Reach the last '.', and if applicable, replace it by a `$' and ! see if this exists as a type. */ ! if ((separator = strrchr (namebuffer, '.'))) ! { ! *separator = '$'; ! name = get_identifier (namebuffer); ! decl_result = IDENTIFIER_CLASS_VALUE (name); ! } ! } while (!decl_result && separator); ! } ! return decl_result; } static tree *************** resolve_no_layout (name, cl) *** 8380,8394 **** return decl; } ! /* Called when reporting errors. Skip leader '[' in a complex array ! type description that failed to be resolved. */ static const char * purify_type_name (name) const char *name; { ! while (*name && *name == '[') ! name++; return name; } --- 8620,8643 ---- return decl; } ! /* Called when reporting errors. Skip the '[]'s in a complex array ! type description that failed to be resolved. purify_type_name can't ! use an identifier tree. */ static const char * purify_type_name (name) const char *name; { ! int len = strlen (name); ! int bracket_found; ! ! STRING_STRIP_BRACKETS (name, len, bracket_found); ! if (bracket_found) ! { ! char *stripped_name = xmemdup (name, len, len+1); ! stripped_name [len] = '\0'; ! return stripped_name; ! } return name; } *************** check_method_redefinition (class, method *** 8491,8498 **** { tree redef, sig; ! /* There's no need to verify and finit$ */ ! if (DECL_CLINIT_P (method) || DECL_FINIT_P (method)) return 0; sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method)); --- 8740,8748 ---- { tree redef, sig; ! /* There's no need to verify and finit$ and instinit$ */ ! if (DECL_CLINIT_P (method) ! || DECL_FINIT_P (method) || DECL_INSTINIT_P (method)) return 0; sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method)); *************** java_check_methods (class_decl) *** 8680,8686 **** } /* Check all the methods of CLASS_DECL. Methods are first completed ! then checked according to regular method existance rules. If no constructor for CLASS_DECL were encountered, then build its declaration. */ --- 8930,8936 ---- } /* Check all the methods of CLASS_DECL. Methods are first completed ! then checked according to regular method existence rules. If no constructor for CLASS_DECL were encountered, then build its declaration. */ *************** process_imports () *** 9104,9110 **** QUALIFIED_P (to_be_found) = 1; load_class (to_be_found, 0); error_found = ! check_pkg_class_access (to_be_found, TREE_PURPOSE (import)); /* We found it, we can bail out */ if (IDENTIFIER_CLASS_VALUE (to_be_found)) --- 9354,9360 ---- QUALIFIED_P (to_be_found) = 1; load_class (to_be_found, 0); error_found = ! check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true); /* We found it, we can bail out */ if (IDENTIFIER_CLASS_VALUE (to_be_found)) *************** process_imports () *** 9138,9154 **** statement. */ static void ! find_in_imports (class_type) tree class_type; { ! tree import; ! ! for (import = ctxp->import_list; import; import = TREE_CHAIN (import)) ! if (TREE_VALUE (import) == TYPE_NAME (class_type)) ! { ! TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import)); ! QUALIFIED_P (TYPE_NAME (class_type)) = 1; ! } } static int --- 9388,9409 ---- statement. */ static void ! find_in_imports (enclosing_type, class_type) ! tree enclosing_type; tree class_type; { ! tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) : ! ctxp->import_list); ! while (import) ! { ! if (TREE_VALUE (import) == TYPE_NAME (class_type)) ! { ! TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import)); ! QUALIFIED_P (TYPE_NAME (class_type)) = 1; ! return; ! } ! import = TREE_CHAIN (import); ! } } static int *************** read_import_dir (wfl) *** 9188,9194 **** void *entry; struct buffer filename[1]; - if (IS_AN_IMPORT_ON_DEMAND_P (package_id)) return; IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1; --- 9443,9448 ---- *************** read_import_dir (wfl) *** 9279,9285 **** static int first = 1; if (first) { ! error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives.", package_name); java_error_count++; first = 0; } --- 9533,9539 ---- static int first = 1; if (first) { ! error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name); java_error_count++; first = 0; } *************** read_import_dir (wfl) *** 9293,9367 **** } /* Possibly find a type in the import on demands specified ! types. Returns 1 if an error occured, 0 otherwise. Run throught the entire list, to detected potential double definitions. */ static int ! find_in_imports_on_demand (class_type) tree class_type; { ! tree node, import, node_to_use = NULL_TREE; ! int seen_once = -1; tree cl = NULL_TREE; ! for (import = ctxp->import_demand_list; import; import = TREE_CHAIN (import)) { const char *id_name; obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))), IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import)))); obstack_1grow (&temporary_obstack, '.'); obstack_grow0 (&temporary_obstack, ! IDENTIFIER_POINTER (TYPE_NAME (class_type)), ! IDENTIFIER_LENGTH (TYPE_NAME (class_type))); id_name = obstack_finish (&temporary_obstack); ! node = maybe_get_identifier (id_name); ! if (node && IS_A_CLASSFILE_NAME (node)) { if (seen_once < 0) { cl = TREE_PURPOSE (import); seen_once = 1; - node_to_use = node; } ! else { seen_once++; parse_error_context ! (TREE_PURPOSE (import), "Type `%s' also potentially defined in package `%s'", ! IDENTIFIER_POINTER (TYPE_NAME (class_type)), ! IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import)))); } } } if (seen_once == 1) ! { ! /* Setup lineno so that it refers to the line of the import (in ! case we parse a class file and encounter errors */ ! tree decl; ! int saved_lineno = lineno; ! lineno = EXPR_WFL_LINENO (cl); ! TYPE_NAME (class_type) = node_to_use; ! QUALIFIED_P (TYPE_NAME (class_type)) = 1; ! decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); ! /* If there is no DECL set for the class or if the class isn't ! loaded and not seen in source yet, the load */ ! if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl)) ! && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))) ! { ! load_class (node_to_use, 0); ! decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); ! } ! lineno = saved_lineno; ! if (! INNER_CLASS_P (TREE_TYPE (decl))) ! return check_pkg_class_access (TYPE_NAME (class_type), cl); ! else ! /* 6.6.1: Inner classes are subject to member access rules. */ ! return 0; ! } else return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */ } --- 9547,9649 ---- } /* Possibly find a type in the import on demands specified ! types. Returns 1 if an error occurred, 0 otherwise. Run through the entire list, to detected potential double definitions. */ static int ! find_in_imports_on_demand (enclosing_type, class_type) ! tree enclosing_type; tree class_type; { ! tree class_type_name = TYPE_NAME (class_type); ! tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) : ! ctxp->import_demand_list); tree cl = NULL_TREE; + int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */ + int to_return = -1; /* -1 when not set, 0 or 1 otherwise */ + tree node; ! for (; import; import = TREE_CHAIN (import)) { + int saved_lineno = lineno; + int access_check; const char *id_name; + tree decl, type_name_copy; + obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))), IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import)))); obstack_1grow (&temporary_obstack, '.'); obstack_grow0 (&temporary_obstack, ! IDENTIFIER_POINTER (class_type_name), ! IDENTIFIER_LENGTH (class_type_name)); id_name = obstack_finish (&temporary_obstack); ! if (! (node = maybe_get_identifier (id_name))) ! continue; ! ! /* Setup lineno so that it refers to the line of the import (in ! case we parse a class file and encounter errors */ ! lineno = EXPR_WFL_LINENO (TREE_PURPOSE (import)); ! ! type_name_copy = TYPE_NAME (class_type); ! TYPE_NAME (class_type) = node; ! QUALIFIED_P (node) = 1; ! decl = IDENTIFIER_CLASS_VALUE (node); ! access_check = -1; ! /* If there is no DECL set for the class or if the class isn't ! loaded and not seen in source yet, then load */ ! if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl)) ! && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))) ! { ! load_class (node, 0); ! decl = IDENTIFIER_CLASS_VALUE (node); ! } ! if (decl && ! INNER_CLASS_P (TREE_TYPE (decl))) ! access_check = check_pkg_class_access (node, TREE_PURPOSE (import), ! false); ! else ! /* 6.6.1: Inner classes are subject to member access rules. */ ! access_check = 0; ! ! lineno = saved_lineno; ! ! /* If the loaded class is not accessible or couldn't be loaded, ! we restore the original TYPE_NAME and process the next ! import. */ ! if (access_check || !decl) ! { ! TYPE_NAME (class_type) = type_name_copy; ! continue; ! } ! ! /* If the loaded class is accessible, we keep a tab on it to ! detect and report multiple inclusions. */ ! if (IS_A_CLASSFILE_NAME (node)) { if (seen_once < 0) { cl = TREE_PURPOSE (import); seen_once = 1; } ! else if (seen_once >= 0) { + tree location = (cl ? cl : TREE_PURPOSE (import)); + tree package = (cl ? EXPR_WFL_NODE (cl) : + EXPR_WFL_NODE (TREE_PURPOSE (import))); seen_once++; parse_error_context ! (location, "Type `%s' also potentially defined in package `%s'", ! IDENTIFIER_POINTER (TYPE_NAME (class_type)), ! IDENTIFIER_POINTER (package)); } } + to_return = access_check; } if (seen_once == 1) ! return to_return; else return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */ } *************** register_package (name) *** 9391,9435 **** } static tree ! resolve_package (pkg, next) ! tree pkg, *next; { ! tree current, acc; ! tree type_name = NULL_TREE; ! const char *name = IDENTIFIER_POINTER (EXPR_WFL_NODE (pkg)); /* The trick is to determine when the package name stops and were the name of something contained in the package starts. Then we return a fully qualified name of what we want to get. */ - /* Do a quick search on well known package names */ - if (!strncmp (name, "java.lang.reflect", 17)) - { - *next = - TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg)))); - type_name = lookup_package_type (name, 17); - } - else if (!strncmp (name, "java.lang", 9)) - { - *next = TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg))); - type_name = lookup_package_type (name, 9); - } - - /* If we found something here, return */ - if (type_name) - return type_name; - *next = EXPR_WFL_QUALIFICATION (pkg); /* Try to progressively construct a type name */ if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION) ! for (acc = NULL_TREE, current = EXPR_WFL_QUALIFICATION (pkg); current; current = TREE_CHAIN (current)) { ! acc = merge_qualified_name (acc, EXPR_WFL_NODE (QUAL_WFL (current))); ! if ((type_name = resolve_no_layout (acc, NULL_TREE))) { - type_name = acc; /* resolve_package should be used in a loop, hence we point at this one to naturally process the next one at the next iteration. */ --- 9673,9704 ---- } static tree ! resolve_package (pkg, next, type_name) ! tree pkg, *next, *type_name; { ! tree current; ! tree decl = NULL_TREE; ! *type_name = NULL_TREE; /* The trick is to determine when the package name stops and were the name of something contained in the package starts. Then we return a fully qualified name of what we want to get. */ *next = EXPR_WFL_QUALIFICATION (pkg); /* Try to progressively construct a type name */ if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION) ! for (current = EXPR_WFL_QUALIFICATION (pkg); current; current = TREE_CHAIN (current)) { ! /* If we don't have what we're expecting, exit now. TYPE_NAME ! will be null and the error caught later. */ ! if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION) ! break; ! *type_name = ! merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current))); ! if ((decl = resolve_no_layout (*type_name, NULL_TREE))) { /* resolve_package should be used in a loop, hence we point at this one to naturally process the next one at the next iteration. */ *************** resolve_package (pkg, next) *** 9437,9458 **** break; } } ! return type_name; } - static tree - lookup_package_type (name, from) - const char *name; - int from; - { - char subname [128]; - const char *sub = &name[from+1]; - while (*sub != '.' && *sub) - sub++; - strncpy (subname, name, sub-name); - subname [sub-name] = '\0'; - return get_identifier (subname); - } /* Check accessibility of inner classes according to member access rules. DECL is the inner class, ENCLOSING_DECL is the class from which the --- 9706,9714 ---- break; } } ! return decl; } /* Check accessibility of inner classes according to member access rules. DECL is the inner class, ENCLOSING_DECL is the class from which the *************** check_inner_class_access (decl, enclosin *** 9533,9546 **** lang_printable_name (decl, 0), access); } ! /* Accessibility check for top-level classes. If CLASS_NAME is in a foreign ! package, it must be PUBLIC. Return 0 if no access violations were found, ! 1 otherwise. */ static int ! check_pkg_class_access (class_name, cl) tree class_name; tree cl; { tree type; --- 9789,9804 ---- lang_printable_name (decl, 0), access); } ! /* Accessibility check for top-level classes. If CLASS_NAME is in a ! foreign package, it must be PUBLIC. Return 0 if no access ! violations were found, 1 otherwise. If VERBOSE is true and an error ! was found, it is reported and accounted for. */ static int ! check_pkg_class_access (class_name, cl, verbose) tree class_name; tree cl; + bool verbose; { tree type; *************** check_pkg_class_access (class_name, cl) *** 9563,9572 **** /* Both in the same package. */ return 0; ! parse_error_context ! (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed", ! (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"), ! IDENTIFIER_POINTER (class_name)); return 1; } return 0; --- 9821,9831 ---- /* Both in the same package. */ return 0; ! if (verbose) ! parse_error_context ! (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed", ! (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"), ! IDENTIFIER_POINTER (class_name)); return 1; } return 0; *************** declare_local_variables (modifier, type, *** 9646,9652 **** will be entered */ decl = build_decl (VAR_DECL, name, real_type); MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); ! LOCAL_FINAL (decl) = final_p; BLOCK_CHAIN_DECL (decl); /* If doing xreferencing, replace the line number with the WFL --- 9905,9911 ---- will be entered */ decl = build_decl (VAR_DECL, name, real_type); MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); ! DECL_FINAL (decl) = final_p; BLOCK_CHAIN_DECL (decl); /* If doing xreferencing, replace the line number with the WFL *************** source_start_java_method (fndecl) *** 9721,9731 **** parm_decl = build_decl (PARM_DECL, name, type); /* Remember if a local variable was declared final (via its ! TREE_LIST of type/name.) Set LOCAL_FINAL accordingly. */ if (ARG_FINAL_P (tem)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl); ! LOCAL_FINAL (parm_decl) = 1; } BLOCK_CHAIN_DECL (parm_decl); --- 9980,9990 ---- parm_decl = build_decl (PARM_DECL, name, type); /* Remember if a local variable was declared final (via its ! TREE_LIST of type/name.) Set DECL_FINAL accordingly. */ if (ARG_FINAL_P (tem)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl); ! DECL_FINAL (parm_decl) = 1; } BLOCK_CHAIN_DECL (parm_decl); *************** create_artificial_method (class, flags, *** 9758,9764 **** return mdecl; } ! /* Starts the body if an artifical method. */ static void start_artificial_method_body (mdecl) --- 10017,10023 ---- return mdecl; } ! /* Starts the body if an artificial method. */ static void start_artificial_method_body (mdecl) *************** end_artificial_method_body (mdecl) *** 9782,9787 **** --- 10041,10064 ---- exit_block (); } + /* Dump a tree of some kind. This is a convenience wrapper for the + dump_* functions in tree-dump.c. */ + static void + dump_java_tree (phase, t) + enum tree_dump_index phase; + tree t; + { + FILE *stream; + int flags; + + stream = dump_begin (phase, &flags); + if (stream) + { + dump_node (t, flags, stream); + dump_end (phase, stream); + } + } + /* Terminate a function and expand its body. */ static void *************** source_end_java_method () *** 9801,9806 **** --- 10078,10087 ---- if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) == empty_stmt_node) BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE; + /* We've generated all the trees for this function, and it has been + patched. Dump it to a file if the user requested it. */ + dump_java_tree (TDI_original, fndecl); + /* Generate function's code */ if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) && ! flag_emit_class_files *************** java_reorder_fields () *** 9934,9940 **** } } } ! stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list)); } /* Layout the methods of all classes loaded in one way or another. --- 10215,10223 ---- } } } ! /* There are cases were gclass_list will be empty. */ ! if (gclass_list) ! stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list)); } /* Layout the methods of all classes loaded in one way or another. *************** static void *** 10025,10042 **** java_complete_expand_methods (class_decl) tree class_decl; { ! tree clinit, finit, decl, first_decl; current_class = TREE_TYPE (class_decl); - /* Find whether the class has final variables */ - for (decl = TYPE_FIELDS (current_class); decl; decl = TREE_CHAIN (decl)) - if (FIELD_FINAL (decl)) - { - TYPE_HAS_FINAL_VARIABLE (current_class) = 1; - break; - } - /* Initialize a new constant pool */ init_outgoing_cpool (); --- 10308,10317 ---- java_complete_expand_methods (class_decl) tree class_decl; { ! tree clinit, decl, first_decl; current_class = TREE_TYPE (class_decl); /* Initialize a new constant pool */ init_outgoing_cpool (); *************** java_complete_expand_methods (class_decl *** 10047,10059 **** first_decl = TYPE_METHODS (current_class); clinit = maybe_generate_pre_expand_clinit (current_class); ! /* Then generate finit$ (if we need to) because constructor will try to use it.*/ if (TYPE_FINIT_STMT_LIST (current_class)) ! { ! finit = generate_finit (current_class); ! java_complete_expand_method (finit); ! } /* Now do the constructors */ for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl)) --- 10322,10336 ---- first_decl = TYPE_METHODS (current_class); clinit = maybe_generate_pre_expand_clinit (current_class); ! /* Then generate finit$ (if we need to) because constructors will try to use it.*/ if (TYPE_FINIT_STMT_LIST (current_class)) ! java_complete_expand_method (generate_finit (current_class)); ! ! /* Then generate instinit$ (if we need to) because constructors will ! try to use it. */ ! if (TYPE_II_STMT_LIST (current_class)) ! java_complete_expand_method (generate_instinit (current_class)); /* Now do the constructors */ for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl)) *************** java_complete_expand_methods (class_decl *** 10069,10084 **** if (no_body) restore_line_number_status (1); - /* Reset the final local variable assignment flags */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - reset_final_variable_local_assignment_flag (current_class); - java_complete_expand_method (decl); - /* Check for missed out final variable assignment */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - check_final_variable_local_assignment_flag (current_class, decl); - if (no_body) restore_line_number_status (0); } --- 10346,10353 ---- *************** java_complete_expand_methods (class_decl *** 10086,10101 **** /* First, do the ordinary methods. */ for (decl = first_decl; decl; decl = TREE_CHAIN (decl)) { /* Skip abstract or native methods -- but do handle native methods when generating JNI stubs. */ ! if (METHOD_ABSTRACT (decl) ! || (! flag_jni && METHOD_NATIVE (decl)) ! || DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl)) ! continue; if (METHOD_NATIVE (decl)) { ! tree body = build_jni_stub (decl); BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body; } --- 10355,10377 ---- /* First, do the ordinary methods. */ for (decl = first_decl; decl; decl = TREE_CHAIN (decl)) { + /* Ctors aren't part of this batch. */ + if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl)) + continue; + /* Skip abstract or native methods -- but do handle native methods when generating JNI stubs. */ ! if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl))) ! { ! DECL_FUNCTION_BODY (decl) = NULL_TREE; ! continue; ! } if (METHOD_NATIVE (decl)) { ! tree body; ! current_function_decl = decl; ! body = build_jni_stub (decl); BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body; } *************** java_complete_expand_methods (class_decl *** 10105,10121 **** /* If there is indeed a , fully expand it now */ if (clinit) { - /* Reset the final local variable assignment flags */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - reset_static_final_variable_assignment_flag (current_class); /* Prevent the use of `this' inside */ ctxp->explicit_constructor_p = 1; java_complete_expand_method (clinit); ctxp->explicit_constructor_p = 0; - /* Check for missed out static final variable assignment */ - if (TYPE_HAS_FINAL_VARIABLE (current_class) - && !CLASS_INTERFACE (class_decl)) - check_static_final_variable_assignment_flag (current_class); } /* We might have generated a class$ that we now want to expand */ --- 10381,10390 ---- *************** java_complete_expand_methods (class_decl *** 10130,10144 **** && verify_constructor_circularity (decl, decl)) break; - /* Final check on the initialization of final variables. */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - { - check_final_variable_global_assignment_flag (current_class); - /* If we have an interface, check for uninitialized fields. */ - if (CLASS_INTERFACE (class_decl)) - check_static_final_variable_assignment_flag (current_class); - } - /* Save the constant pool. We'll need to restore it later. */ TYPE_CPOOL (current_class) = outgoing_cpool; } --- 10399,10404 ---- *************** maybe_generate_pre_expand_clinit (class_ *** 10207,10214 **** MODIFY_EXPR with a constant value. */ static int ! analyze_clinit_body (bbody) ! tree bbody; { while (bbody) switch (TREE_CODE (bbody)) --- 10467,10474 ---- MODIFY_EXPR with a constant value. */ static int ! analyze_clinit_body (this_class, bbody) ! tree this_class, bbody; { while (bbody) switch (TREE_CODE (bbody)) *************** analyze_clinit_body (bbody) *** 10222,10235 **** break; case COMPOUND_EXPR: ! if (analyze_clinit_body (TREE_OPERAND (bbody, 0))) return 1; bbody = TREE_OPERAND (bbody, 1); break; case MODIFY_EXPR: ! /* Return 0 if the operand is constant, 1 otherwise. */ ! return ! TREE_CONSTANT (TREE_OPERAND (bbody, 1)); default: return 1; --- 10482,10508 ---- break; case COMPOUND_EXPR: ! if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0))) return 1; bbody = TREE_OPERAND (bbody, 1); break; case MODIFY_EXPR: ! /* If we're generating to class file and we're dealing with an ! array initialization, we return 1 to keep */ ! if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT ! && flag_emit_class_files) ! return 1; ! ! /* There are a few cases where we're required to keep ! : ! - If this is an assignment whose operand is not constant, ! - If this is an assignment to a non-initialized field, ! - If this field is not a member of the current class. ! */ ! return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1)) ! || ! DECL_INITIAL (TREE_OPERAND (bbody, 0)) ! || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class); default: return 1; *************** maybe_yank_clinit (mdecl) *** 10248,10254 **** { tree type, current; tree fbody, bbody; - int found = 0; if (!DECL_CLINIT_P (mdecl)) return 0; --- 10521,10526 ---- *************** maybe_yank_clinit (mdecl) *** 10264,10270 **** return 0; if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node) return 0; ! type = DECL_CONTEXT (mdecl); current = TYPE_FIELDS (type); --- 10536,10542 ---- return 0; if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node) return 0; ! type = DECL_CONTEXT (mdecl); current = TYPE_FIELDS (type); *************** maybe_yank_clinit (mdecl) *** 10273,10312 **** { tree f_init; ! /* We're not interested in non static field */ if (!FIELD_STATIC (current)) continue; /* Anything that isn't String or a basic type is ruled out -- or if we know how to deal with it (when doing things natively) we should generated an empty so that SUID are computed correctly. */ if (! JSTRING_TYPE_P (TREE_TYPE (current)) && ! JNUMERIC_TYPE_P (TREE_TYPE (current))) ! break; ! ! f_init = DECL_INITIAL (current); ! /* If we're emitting native code, we want static final fields to ! have constant initializers. If we don't meet these ! conditions, we keep */ ! if (!flag_emit_class_files ! && !(FIELD_FINAL (current) && f_init && TREE_CONSTANT (f_init))) ! break; ! /* If we're emitting bytecode, we want static fields to have ! constant initializers or no initializer. If we don't meet ! these conditions, we keep */ ! if (flag_emit_class_files && f_init && !TREE_CONSTANT (f_init)) ! break; } /* Now we analyze the method body and look for something that isn't a MODIFY_EXPR */ ! if (bbody == empty_stmt_node) ! found = 0; ! else ! found = analyze_clinit_body (bbody); ! ! if (current || found) return 0; /* Get rid of in the class' list of methods */ --- 10545,10574 ---- { tree f_init; ! /* We're not interested in non-static fields. */ if (!FIELD_STATIC (current)) continue; + /* Nor in fields without initializers. */ + f_init = DECL_INITIAL (current); + if (f_init == NULL_TREE) + continue; + /* Anything that isn't String or a basic type is ruled out -- or if we know how to deal with it (when doing things natively) we should generated an empty so that SUID are computed correctly. */ if (! JSTRING_TYPE_P (TREE_TYPE (current)) && ! JNUMERIC_TYPE_P (TREE_TYPE (current))) ! return 0; ! ! if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init)) ! return 0; } /* Now we analyze the method body and look for something that isn't a MODIFY_EXPR */ ! if (bbody != empty_stmt_node && analyze_clinit_body (type, bbody)) return 0; /* Get rid of in the class' list of methods */ *************** maybe_yank_clinit (mdecl) *** 10324,10329 **** --- 10586,10625 ---- return 1; } + /* Install the argument from MDECL. Suitable to completion and + expansion of mdecl's body. */ + + static void + start_complete_expand_method (mdecl) + tree mdecl; + { + tree tem; + + pushlevel (1); /* Prepare for a parameter push */ + tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); + DECL_ARGUMENTS (mdecl) = tem; + + for (; tem; tem = TREE_CHAIN (tem)) + { + /* TREE_CHAIN (tem) will change after pushdecl. */ + tree next = TREE_CHAIN (tem); + tree type = TREE_TYPE (tem); + if (PROMOTE_PROTOTYPES + && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node) + && INTEGRAL_TYPE_P (type)) + type = integer_type_node; + DECL_ARG_TYPE (tem) = type; + layout_decl (tem, 0); + pushdecl (tem); + /* Re-install the next so that the list is kept and the loop + advances. */ + TREE_CHAIN (tem) = next; + } + pushdecl_force_head (DECL_ARGUMENTS (mdecl)); + lineno = DECL_SOURCE_LINE_FIRST (mdecl); + build_result_decl (mdecl); + } + /* Complete and expand a method. */ *************** static void *** 10331,10337 **** java_complete_expand_method (mdecl) tree mdecl; { ! int yank_clinit = 0; current_function_decl = mdecl; /* Fix constructors before expanding them */ --- 10627,10633 ---- java_complete_expand_method (mdecl) tree mdecl; { ! tree fbody, block_body, exception_copy; current_function_decl = mdecl; /* Fix constructors before expanding them */ *************** java_complete_expand_method (mdecl) *** 10339,10441 **** fix_constructors (mdecl); /* Expand functions that have a body */ ! if (DECL_FUNCTION_BODY (mdecl)) ! { ! tree fbody = DECL_FUNCTION_BODY (mdecl); ! tree block_body = BLOCK_EXPR_BODY (fbody); ! tree exception_copy = NULL_TREE; ! tree tem, *ptr; ! current_function_decl = mdecl; ! if (! quiet_flag) ! fprintf (stderr, " [%s.", ! lang_printable_name (DECL_CONTEXT (mdecl), 0)); ! announce_function (mdecl); ! if (! quiet_flag) ! fprintf (stderr, "]"); ! pushlevel (1); /* Prepare for a parameter push */ ! ptr = &DECL_ARGUMENTS (mdecl); ! tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); ! while (tem) { ! tree next = TREE_CHAIN (tem); ! tree type = TREE_TYPE (tem); ! if (PROMOTE_PROTOTYPES ! && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node) ! && INTEGRAL_TYPE_P (type)) ! type = integer_type_node; ! DECL_ARG_TYPE (tem) = type; ! layout_decl (tem, 0); ! pushdecl (tem); ! *ptr = tem; ! ptr = &TREE_CHAIN (tem); ! tem = next; } ! *ptr = NULL_TREE; ! pushdecl_force_head (DECL_ARGUMENTS (mdecl)); ! lineno = DECL_SOURCE_LINE_FIRST (mdecl); ! build_result_decl (mdecl); ! current_this ! = (!METHOD_STATIC (mdecl) ? ! BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE); ! /* Purge the `throws' list of unchecked exceptions. If we're ! doing xref, save a copy of the list and re-install it ! later. */ ! if (flag_emit_xref) ! exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl)); ! purge_unchecked_exceptions (mdecl); ! /* Install exceptions thrown with `throws' */ ! PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl)); ! if (block_body != NULL_TREE) ! { ! block_body = java_complete_tree (block_body); ! if (! flag_emit_xref && ! METHOD_NATIVE (mdecl)) ! check_for_initialization (block_body); ! ctxp->explicit_constructor_p = 0; ! } ! BLOCK_EXPR_BODY (fbody) = block_body; ! /* If we saw a return but couldn't evaluate it properly, we'll ! have an error_mark_node here. */ ! if (block_body != error_mark_node ! && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body)) ! && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE ! && !flag_emit_xref) ! missing_return_error (current_function_decl); ! /* Check wether we could just get rid of clinit, now the picture ! is complete. */ ! if (!(yank_clinit = maybe_yank_clinit (mdecl))) ! complete_start_java_method (mdecl); ! ! /* Don't go any further if we've found error(s) during the ! expansion */ ! if (!java_error_count && !yank_clinit) ! source_end_java_method (); ! else ! { ! if (java_error_count) ! pushdecl_force_head (DECL_ARGUMENTS (mdecl)); ! poplevel (1, 0, 1); } ! /* Pop the exceptions and sanity check */ ! POP_EXCEPTIONS(); ! if (currently_caught_type_list) ! abort (); ! if (flag_emit_xref) ! DECL_FUNCTION_THROWS (mdecl) = exception_copy; } } --- 10635,10784 ---- fix_constructors (mdecl); /* Expand functions that have a body */ ! if (!DECL_FUNCTION_BODY (mdecl)) ! return; ! fbody = DECL_FUNCTION_BODY (mdecl); ! block_body = BLOCK_EXPR_BODY (fbody); ! exception_copy = NULL_TREE; ! current_function_decl = mdecl; ! if (! quiet_flag) ! fprintf (stderr, " [%s.", ! lang_printable_name (DECL_CONTEXT (mdecl), 0)); ! announce_function (mdecl); ! if (! quiet_flag) ! fprintf (stderr, "]"); ! ! /* Prepare the function for tree completion */ ! start_complete_expand_method (mdecl); ! ! /* Install the current this */ ! current_this = (!METHOD_STATIC (mdecl) ? ! BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE); ! ! /* Purge the `throws' list of unchecked exceptions (we save a copy ! of the list and re-install it later.) */ ! exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl)); ! purge_unchecked_exceptions (mdecl); ! ! /* Install exceptions thrown with `throws' */ ! PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl)); ! ! if (block_body != NULL_TREE) ! { ! block_body = java_complete_tree (block_body); ! ! /* Before we check initialization, attached all class initialization ! variable to the block_body */ ! hash_traverse (&DECL_FUNCTION_INIT_TEST_TABLE (mdecl), ! attach_init_test_initialization_flags, block_body); ! ! if (! flag_emit_xref && ! METHOD_NATIVE (mdecl)) { ! check_for_initialization (block_body, mdecl); ! ! /* Go through all the flags marking the initialization of ! static variables and see whether they're definitively ! assigned, in which case the type is remembered as ! definitively initialized in MDECL. */ ! if (STATIC_CLASS_INIT_OPT_P ()) ! { ! /* Always register the context as properly initialized in ! MDECL. This used with caution helps removing extra ! initialization of self. */ ! if (METHOD_STATIC (mdecl)) ! hash_lookup (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl), ! (hash_table_key) DECL_CONTEXT (mdecl), ! TRUE, NULL); ! } } ! ctxp->explicit_constructor_p = 0; ! } ! ! BLOCK_EXPR_BODY (fbody) = block_body; ! ! /* If we saw a return but couldn't evaluate it properly, we'll have ! an error_mark_node here. */ ! if (block_body != error_mark_node ! && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body)) ! && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE ! && !flag_emit_xref) ! missing_return_error (current_function_decl); ! /* See if we can get rid of if MDECL happens to be */ ! maybe_yank_clinit (mdecl); ! /* Pop the current level, with special measures if we found errors. */ ! if (java_error_count) ! pushdecl_force_head (DECL_ARGUMENTS (mdecl)); ! poplevel (1, 0, 1); ! /* Pop the exceptions and sanity check */ ! POP_EXCEPTIONS(); ! if (currently_caught_type_list) ! abort (); ! /* Restore the copy of the list of exceptions if emitting xrefs. */ ! DECL_FUNCTION_THROWS (mdecl) = exception_copy; ! } ! /* For with each class for which there's code to generate. */ ! static void ! java_expand_method_bodies (class) ! tree class; ! { ! tree decl; ! for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl)) ! { ! if (!DECL_FUNCTION_BODY (decl)) ! continue; ! current_function_decl = decl; ! /* It's time to assign the variable flagging static class ! initialization based on which classes invoked static methods ! are definitely initializing. This should be flagged. */ ! if (STATIC_CLASS_INIT_OPT_P ()) ! { ! tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl); ! for (; list != NULL_TREE; list = TREE_CHAIN (list)) ! { ! /* Executed for each statement calling a static function. ! LIST is a TREE_LIST whose PURPOSE is the called function ! and VALUE is a compound whose second operand can be patched ! with static class initialization flag assignments. */ ! tree called_method = TREE_PURPOSE (list); ! tree compound = TREE_VALUE (list); ! tree assignment_compound_list ! = build_tree_list (called_method, NULL); ! /* For each class definitely initialized in ! CALLED_METHOD, fill ASSIGNMENT_COMPOUND with ! assignment to the class initialization flag. */ ! hash_traverse (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method), ! emit_test_initialization, ! assignment_compound_list); ! ! if (TREE_VALUE (assignment_compound_list)) ! TREE_OPERAND (compound, 1) ! = TREE_VALUE (assignment_compound_list); ! } } ! /* Prepare the function for RTL expansion */ ! start_complete_expand_method (decl); ! /* Expand function start, generate initialization flag ! assignment, and handle synchronized methods. */ ! complete_start_java_method (decl); ! ! /* Expand the rest of the function body and terminate ! expansion. */ ! source_end_java_method (); } } *************** outer_field_access_fix (wfl, node, rhs) *** 10595,10608 **** if (outer_field_expanded_access_p (node, &name, &arg_type, &arg)) { - /* At any rate, check whether we're trying to assign a value to - a final. */ - tree accessed = (JDECL_P (node) ? node : - (TREE_CODE (node) == COMPONENT_REF ? - TREE_OPERAND (node, 1) : node)); - if (check_final_assignment (accessed, wfl)) - return error_mark_node; - node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl), arg_type, name, arg, rhs); return java_complete_tree (node); --- 10938,10943 ---- *************** build_access_to_thisn (from, to, lc) *** 10832,10838 **** { tree access = NULL_TREE; ! while (from != to) { if (!access) { --- 11167,11173 ---- { tree access = NULL_TREE; ! while (from != to && PURE_INNER_CLASS_TYPE_P (from)) { if (!access) { *************** build_access_to_thisn (from, to, lc) *** 10852,10859 **** access = make_qualified_primary (cn, access, lc); } ! /* if FROM isn't an inter class, that's fine, we've done ! enough. What we're looking for can be accessed from there. */ from = DECL_CONTEXT (TYPE_NAME (from)); if (!from) break; --- 11187,11194 ---- access = make_qualified_primary (cn, access, lc); } ! /* If FROM isn't an inner class, that's fine, we've done enough. ! What we're looking for can be accessed from there. */ from = DECL_CONTEXT (TYPE_NAME (from)); if (!from) break; *************** build_current_thisn (type) *** 10922,10928 **** static int saved_type_i = 0; static int initialized_p; tree decl; ! char buffer [80]; int i = 0; /* Register SAVED_THISN and SAVED_TYPE with the garbage collector. */ --- 11257,11263 ---- static int saved_type_i = 0; static int initialized_p; tree decl; ! char buffer [24]; int i = 0; /* Register SAVED_THISN and SAVED_TYPE with the garbage collector. */ *************** build_dot_class_method (class) *** 10996,11004 **** #define BWF(S) build_wfl_node (get_identifier ((S))) #define MQN(X,Y) make_qualified_name ((X), (Y), 0) tree args, tmp, saved_current_function_decl, mdecl; ! tree stmt, throw_stmt, catch, catch_block, try_block; ! tree catch_clause_param; ! tree class_not_found_exception, no_class_def_found_error; static tree get_message_wfl, type_parm_wfl; --- 11331,11337 ---- #define BWF(S) build_wfl_node (get_identifier ((S))) #define MQN(X,Y) make_qualified_name ((X), (Y), 0) tree args, tmp, saved_current_function_decl, mdecl; ! tree stmt, throw_stmt; static tree get_message_wfl, type_parm_wfl; *************** build_dot_class_method (class) *** 11018,11050 **** /* Build the qualified name java.lang.Class.forName */ tmp = MQN (MQN (MQN (BWF ("java"), BWF ("lang")), BWF ("Class")), BWF ("forName")); ! ! /* For things we have to catch and throw */ ! class_not_found_exception = ! lookup_class (get_identifier ("java.lang.ClassNotFoundException")); ! no_class_def_found_error = ! lookup_class (get_identifier ("java.lang.NoClassDefFoundError")); ! load_class (class_not_found_exception, 1); ! load_class (no_class_def_found_error, 1); ! /* Create the "class$" function */ mdecl = create_artificial_method (class, ACC_STATIC, build_pointer_type (class_type_node), classdollar_identifier_node, args); ! DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, ! no_class_def_found_error); ! /* We start by building the try block. We need to build: return (java.lang.Class.forName (type)); */ stmt = build_method_invocation (tmp, build_tree_list (NULL_TREE, type_parm_wfl)); stmt = build_return (0, stmt); - /* Put it in a block. That's the try block */ - try_block = build_expr_block (stmt, NULL_TREE); /* Now onto the catch block. We start by building the expression ! throwing a new exception: ! throw new NoClassDefFoundError (_.getMessage); */ throw_stmt = make_qualified_name (build_wfl_node (wpv_id), get_message_wfl, 0); throw_stmt = build_method_invocation (throw_stmt, NULL_TREE); --- 11351,11374 ---- /* Build the qualified name java.lang.Class.forName */ tmp = MQN (MQN (MQN (BWF ("java"), BWF ("lang")), BWF ("Class")), BWF ("forName")); ! load_class (class_not_found_type_node, 1); ! load_class (no_class_def_found_type_node, 1); ! /* Create the "class$" function */ mdecl = create_artificial_method (class, ACC_STATIC, build_pointer_type (class_type_node), classdollar_identifier_node, args); ! DECL_FUNCTION_THROWS (mdecl) = ! build_tree_list (NULL_TREE, no_class_def_found_type_node); ! /* We start by building the try block. We need to build: return (java.lang.Class.forName (type)); */ stmt = build_method_invocation (tmp, build_tree_list (NULL_TREE, type_parm_wfl)); stmt = build_return (0, stmt); /* Now onto the catch block. We start by building the expression ! throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */ throw_stmt = make_qualified_name (build_wfl_node (wpv_id), get_message_wfl, 0); throw_stmt = build_method_invocation (throw_stmt, NULL_TREE); *************** build_dot_class_method (class) *** 11057,11083 **** /* Build the throw, (it's too early to use BUILD_THROW) */ throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt); ! /* Build the catch block to encapsulate all this. We begin by ! building an decl for the catch clause parameter and link it to ! newly created block, the catch block. */ ! catch_clause_param = ! build_decl (VAR_DECL, wpv_id, ! build_pointer_type (class_not_found_exception)); ! catch_block = build_expr_block (NULL_TREE, catch_clause_param); ! ! /* We initialize the variable with the exception handler. */ ! catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param, ! build (JAVA_EXC_OBJ_EXPR, ptr_type_node)); ! add_stmt_to_block (catch_block, NULL_TREE, catch); ! ! /* We add the statement throwing the new exception */ ! add_stmt_to_block (catch_block, NULL_TREE, throw_stmt); ! ! /* Build a catch expression for all this */ ! catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block); ! ! /* Build the try/catch sequence */ ! stmt = build_try_statement (0, try_block, catch_block); fix_method_argument_names (args, mdecl); layout_class_method (class, NULL_TREE, mdecl, NULL_TREE); --- 11381,11389 ---- /* Build the throw, (it's too early to use BUILD_THROW) */ throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt); ! /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */ ! stmt = encapsulate_with_try_catch (0, class_not_found_type_node, ! stmt, throw_stmt); fix_method_argument_names (args, mdecl); layout_class_method (class, NULL_TREE, mdecl, NULL_TREE); *************** build_dot_class_method_invocation (type) *** 11102,11107 **** --- 11408,11417 ---- else sig_id = DECL_NAME (TYPE_NAME (type)); + /* Ensure that the proper name separator is used */ + sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id), + IDENTIFIER_LENGTH (sig_id)); + s = build_string (IDENTIFIER_LENGTH (sig_id), IDENTIFIER_POINTER (sig_id)); return build_method_invocation (build_wfl_node (classdollar_identifier_node), *************** static void *** 11118,11123 **** --- 11428,11434 ---- fix_constructors (mdecl) tree mdecl; { + tree iii; /* Instance Initializer Invocation */ tree body = DECL_FUNCTION_BODY (mdecl); tree thisn_assign, compound = NULL_TREE; tree class_type = DECL_CONTEXT (mdecl); *************** fix_constructors (mdecl) *** 11159,11167 **** of that. */ java_method_add_stmt (mdecl, build_super_invocation (mdecl)); ! /* Insert the instance initializer block right here, after the ! super invocation. */ ! add_instance_initializer (mdecl); end_artificial_method_body (mdecl); } --- 11470,11478 ---- of that. */ java_method_add_stmt (mdecl, build_super_invocation (mdecl)); ! /* FIXME */ ! if ((iii = build_instinit_invocation (class_type))) ! java_method_add_stmt (mdecl, iii); end_artificial_method_body (mdecl); } *************** fix_constructors (mdecl) *** 11169,11183 **** else { int found = 0; tree found_call = NULL_TREE; tree main_block = BLOCK_EXPR_BODY (body); - tree ii; /* Instance Initializer */ while (body) switch (TREE_CODE (body)) { case CALL_EXPR: found = CALL_EXPLICIT_CONSTRUCTOR_P (body); body = NULL_TREE; break; case COMPOUND_EXPR: --- 11480,11496 ---- else { int found = 0; + int invokes_this = 0; tree found_call = NULL_TREE; tree main_block = BLOCK_EXPR_BODY (body); while (body) switch (TREE_CODE (body)) { case CALL_EXPR: found = CALL_EXPLICIT_CONSTRUCTOR_P (body); + if (CALL_THIS_CONSTRUCTOR_P (body)) + invokes_this = 1; body = NULL_TREE; break; case COMPOUND_EXPR: *************** fix_constructors (mdecl) *** 11211,11219 **** TREE_OPERAND (found_call, 0) = empty_stmt_node; } /* Insert the instance initializer block right after. */ ! if ((ii = build_instance_initializer (mdecl))) ! compound = add_stmt_to_compound (compound, NULL_TREE, ii); /* Fix the constructor main block if we're adding extra stmts */ if (compound) --- 11524,11534 ---- TREE_OPERAND (found_call, 0) = empty_stmt_node; } + DECL_INIT_CALLS_THIS (mdecl) = invokes_this; + /* Insert the instance initializer block right after. */ ! if (!invokes_this && (iii = build_instinit_invocation (class_type))) ! compound = add_stmt_to_compound (compound, NULL_TREE, iii); /* Fix the constructor main block if we're adding extra stmts */ if (compound) *************** verify_constructor_super (mdecl) *** 11257,11263 **** && m_arg_type != end_params_node); arg_type = TREE_CHAIN (arg_type), m_arg_type = TREE_CHAIN (m_arg_type)) ! if (TREE_VALUE (arg_type) != TREE_VALUE (m_arg_type)) break; if (arg_type == end_params_node && m_arg_type == end_params_node) --- 11572,11580 ---- && m_arg_type != end_params_node); arg_type = TREE_CHAIN (arg_type), m_arg_type = TREE_CHAIN (m_arg_type)) ! if (!valid_method_invocation_conversion_p ! (TREE_VALUE (arg_type), ! TREE_VALUE (m_arg_type))) break; if (arg_type == end_params_node && m_arg_type == end_params_node) *************** java_expand_classes () *** 11292,11299 **** java_layout_classes (); java_parse_abort_on_error (); ! cur_ctxp = ctxp_for_generation; ! for (; cur_ctxp; cur_ctxp = cur_ctxp->next) { ctxp = cur_ctxp; input_filename = ctxp->filename; --- 11609,11615 ---- java_layout_classes (); java_parse_abort_on_error (); ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { ctxp = cur_ctxp; input_filename = ctxp->filename; *************** java_expand_classes () *** 11303,11311 **** } input_filename = main_input_filename; ! /* Find anonymous classes and expand their constructor, now they ! have been fixed. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; --- 11619,11629 ---- } input_filename = main_input_filename; ! ! /* Find anonymous classes and expand their constructor. This extra pass is ! neccessary because the constructor itself is only generated when the ! method in which it is defined is expanded. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; *************** java_expand_classes () *** 11322,11328 **** restore_line_number_status (1); java_complete_expand_method (d); restore_line_number_status (0); ! break; /* We now there are no other ones */ } } } --- 11640,11646 ---- restore_line_number_status (1); java_complete_expand_method (d); restore_line_number_status (0); ! break; /* There is only one constructor. */ } } } *************** java_expand_classes () *** 11338,11344 **** return; /* Now things are stable, go for generation of the class data. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; --- 11656,11681 ---- return; /* Now things are stable, go for generation of the class data. */ ! ! /* We pessimistically marked all fields external until we knew ! what set of classes we were planning to compile. Now mark ! those that will be generated locally as not external. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) ! { ! tree current; ! ctxp = cur_ctxp; ! for (current = ctxp->class_list; current; current = TREE_CHAIN (current)) ! { ! tree class = TREE_TYPE (current); ! tree field; ! for (field = TYPE_FIELDS (class); field ; field = TREE_CHAIN (field)) ! if (FIELD_STATIC (field)) ! DECL_EXTERNAL (field) = 0; ! } ! } ! ! /* Compile the classes. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; *************** java_expand_classes () *** 11351,11357 **** if (flag_emit_xref) expand_xref (current_class); else if (! flag_syntax_only) ! finish_class (); } } } --- 11688,11697 ---- if (flag_emit_xref) expand_xref (current_class); else if (! flag_syntax_only) ! { ! java_expand_method_bodies (current_class); ! finish_class (); ! } } } } *************** resolve_expression_name (id, orig) *** 11531,11537 **** static_ref_err (id, DECL_NAME (decl), current_class); return error_mark_node; } ! return build_outer_field_access (id, decl); } /* Otherwise build what it takes to access the field */ --- 11871,11880 ---- static_ref_err (id, DECL_NAME (decl), current_class); return error_mark_node; } ! access = build_outer_field_access (id, decl); ! if (orig) ! *orig = access; ! return access; } /* Otherwise build what it takes to access the field */ *************** resolve_expression_name (id, orig) *** 11560,11567 **** } /* We've got an error here */ ! parse_error_context (id, "Undefined variable `%s'", ! IDENTIFIER_POINTER (name)); return error_mark_node; } --- 11903,11917 ---- } /* We've got an error here */ ! if (INNER_CLASS_TYPE_P (current_class)) ! parse_error_context (id, ! "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final", ! IDENTIFIER_POINTER (name), ! IDENTIFIER_POINTER (DECL_NAME ! (TYPE_NAME (current_class)))); ! else ! parse_error_context (id, "Undefined variable `%s'", ! IDENTIFIER_POINTER (name)); return error_mark_node; } *************** static_ref_err (wfl, field_id, class_typ *** 11577,11583 **** IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type)))); } ! /* 15.10.1 Field Acess Using a Primary and/or Expression Name. We return something suitable to generate the field access. We also return the field decl in FIELD_DECL and its type in FIELD_TYPE. If recipient's address can be null. */ --- 11927,11933 ---- IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type)))); } ! /* 15.10.1 Field Access Using a Primary and/or Expression Name. We return something suitable to generate the field access. We also return the field decl in FIELD_DECL and its type in FIELD_TYPE. If recipient's address can be null. */ *************** resolve_field_access (qual_wfl, field_de *** 11601,11608 **** && ! flag_emit_class_files && ! flag_emit_xref) { tree length = build_java_array_length_access (where_found); ! field_ref = ! build_java_arraynull_check (type_found, length, int_type_node); /* In case we're dealing with a static array, we need to initialize its class before the array length can be fetched. --- 11951,11957 ---- && ! flag_emit_class_files && ! flag_emit_xref) { tree length = build_java_array_length_access (where_found); ! field_ref = length; /* In case we're dealing with a static array, we need to initialize its class before the array length can be fetched. *************** resolve_qualified_expression_name (wfl, *** 11744,11749 **** --- 12093,12099 ---- *where_found = patch_method_invocation (qual_wfl, decl, type, from_super, &is_static, &ret_decl); + from_super = 0; if (*where_found == error_mark_node) { RESTORE_THIS_AND_CURRENT_CLASS; *************** resolve_qualified_expression_name (wfl, *** 11781,11787 **** forcoming function's argument. */ if (previous_call_static && is_static) { ! decl = build (COMPOUND_EXPR, type, decl, *where_found); TREE_SIDE_EFFECTS (decl) = 1; } else --- 12131,12138 ---- forcoming function's argument. */ if (previous_call_static && is_static) { ! decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found), ! decl, *where_found); TREE_SIDE_EFFECTS (decl) = 1; } else *************** resolve_qualified_expression_name (wfl, *** 11874,11880 **** parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called"); return 1; } ! /* We have to generate code for intermediate acess */ if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type) { *where_found = decl = current_this; --- 12225,12231 ---- parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called"); return 1; } ! /* We have to generate code for intermediate access */ if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type) { *where_found = decl = current_this; *************** resolve_qualified_expression_name (wfl, *** 11939,11949 **** assume a variable/class name was meant. */ if (RESOLVE_PACKAGE_NAME_P (qual_wfl)) { ! tree name = resolve_package (wfl, &q); ! if (name) { tree list; ! *where_found = decl = resolve_no_layout (name, qual_wfl); /* We want to be absolutely sure that the class is laid out. We're going to search something inside it. */ *type_found = type = TREE_TYPE (decl); --- 12290,12301 ---- assume a variable/class name was meant. */ if (RESOLVE_PACKAGE_NAME_P (qual_wfl)) { ! tree name; ! if ((decl = resolve_package (wfl, &q, &name))) { tree list; ! *where_found = decl; ! /* We want to be absolutely sure that the class is laid out. We're going to search something inside it. */ *type_found = type = TREE_TYPE (decl); *************** resolve_qualified_expression_name (wfl, *** 11973,11989 **** else parse_error_context (qual_wfl, "Undefined variable or class name: `%s'", ! IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl))); return 1; } } /* We have a type name. It's been already resolved when the expression was qualified. */ ! else if (RESOLVE_TYPE_NAME_P (qual_wfl)) { ! if (!(decl = QUAL_RESOLUTION (q))) ! return 1; /* Error reported already */ /* Sneak preview. If next we see a `new', we're facing a qualification with resulted in a type being selected --- 12325,12340 ---- else parse_error_context (qual_wfl, "Undefined variable or class name: `%s'", ! IDENTIFIER_POINTER (name)); return 1; } } /* We have a type name. It's been already resolved when the expression was qualified. */ ! else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q)) { ! decl = QUAL_RESOLUTION (q); /* Sneak preview. If next we see a `new', we're facing a qualification with resulted in a type being selected *************** resolve_qualified_expression_name (wfl, *** 12011,12017 **** type = TREE_TYPE (decl); from_type = 1; } ! /* We resolve and expression name */ else { tree field_decl = NULL_TREE; --- 12362,12368 ---- type = TREE_TYPE (decl); from_type = 1; } ! /* We resolve an expression name */ else { tree field_decl = NULL_TREE; *************** resolve_qualified_expression_name (wfl, *** 12047,12052 **** --- 12398,12413 ---- } } + /* Report and error if we're using a numerical litteral as a + qualifier. It can only be an INTEGER_CST. */ + else if (TREE_CODE (qual_wfl) == INTEGER_CST) + { + parse_error_context + (wfl, "Can't use type `%s' as a qualifier", + lang_printable_name (TREE_TYPE (qual_wfl), 0)); + return 1; + } + /* We have to search for a field, knowing the type of its container. The flag FROM_TYPE indicates that we resolved the last member of the expression as a type name, which *************** resolve_qualified_expression_name (wfl, *** 12064,12070 **** (qual_wfl, "Attempt to reference field `%s' in `%s %s'", IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)), lang_printable_name (type, 0), ! IDENTIFIER_POINTER (DECL_NAME (field_decl))); return 1; } --- 12425,12431 ---- (qual_wfl, "Attempt to reference field `%s' in `%s %s'", IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)), lang_printable_name (type, 0), ! IDENTIFIER_POINTER (DECL_NAME (decl))); return 1; } *************** not_accessible_p (reference, member, whe *** 12243,12249 **** if (where && !inherits_from_p (reference, where)) return 1; ! /* Otherwise, access is granted if occuring from the class where member is declared or a subclass of it. Find the right context to perform the check */ if (PURE_INNER_CLASS_TYPE_P (reference)) --- 12604,12610 ---- if (where && !inherits_from_p (reference, where)) return 1; ! /* Otherwise, access is granted if occurring from the class where member is declared or a subclass of it. Find the right context to perform the check */ if (PURE_INNER_CLASS_TYPE_P (reference)) *************** not_accessible_p (reference, member, whe *** 12272,12278 **** return 1; } ! /* Default access are permitted only when occuring within the package in which the type (REFERENCE) is declared. In other words, REFERENCE is defined in the current package */ if (ctxp->package) --- 12633,12639 ---- return 1; } ! /* Default access are permitted only when occurring within the package in which the type (REFERENCE) is declared. In other words, REFERENCE is defined in the current package */ if (ctxp->package) *************** check_deprecation (wfl, decl) *** 12301,12318 **** strcpy (the, "method"); break; case FIELD_DECL: strcpy (the, "field"); break; case TYPE_DECL: ! strcpy (the, "class"); ! break; default: abort (); } ! parse_warning_context ! (wfl, "The %s `%s' in class `%s' has been deprecated", ! the, lang_printable_name (decl, 0), ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))); } } --- 12662,12684 ---- strcpy (the, "method"); break; case FIELD_DECL: + case VAR_DECL: strcpy (the, "field"); break; case TYPE_DECL: ! parse_warning_context (wfl, "The class `%s' has been deprecated", ! IDENTIFIER_POINTER (DECL_NAME (decl))); ! return; default: abort (); } ! /* Don't issue a message if the context as been deprecated as a ! whole. */ ! if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl)))) ! parse_warning_context ! (wfl, "The %s `%s' in class `%s' has been deprecated", ! the, lang_printable_name (decl, 0), ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))); } } *************** patch_method_invocation (patch, primary, *** 12425,12430 **** --- 12791,12802 ---- qualify_ambiguous_name (wfl); resolved = resolve_field_access (wfl, NULL, NULL); + if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved) + && FIELD_FINAL (resolved) + && !inherits_from_p (DECL_CONTEXT (resolved), current_class) + && !flag_emit_class_files && !flag_emit_xref) + resolved = build_class_init (DECL_CONTEXT (resolved), resolved); + if (resolved == error_mark_node) PATCH_METHOD_RETURN_ERROR (); *************** patch_method_invocation (patch, primary, *** 12589,12595 **** /* Check for inner classes creation from illegal contexts */ if (lc && (INNER_CLASS_TYPE_P (class_to_search) && !CLASS_STATIC (TYPE_NAME (class_to_search))) ! && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)) { parse_error_context (wfl, "No enclosing instance for inner class `%s' is in scope%s", --- 12961,12968 ---- /* Check for inner classes creation from illegal contexts */ if (lc && (INNER_CLASS_TYPE_P (class_to_search) && !CLASS_STATIC (TYPE_NAME (class_to_search))) ! && INNER_ENCLOSING_SCOPE_CHECK (class_to_search) ! && !DECL_INIT_P (current_function_decl)) { parse_error_context (wfl, "No enclosing instance for inner class `%s' is in scope%s", *************** patch_method_invocation (patch, primary, *** 12623,12629 **** - LIST is non static. It's invocation is transformed from x(a1,....,an) into access$(this$,a1,...,an). - LIST is static. It's invocation is transformed from ! x(a1,....,an) into TYPEOF(this$).x(a1,....an). Of course, this$ can be abitrary complex, ranging from this$0 (the immediate outer context) to --- 12996,13002 ---- - LIST is non static. It's invocation is transformed from x(a1,....,an) into access$(this$,a1,...,an). - LIST is static. It's invocation is transformed from ! x(a1,....,an) into TYPE_OF(this$).x(a1,....an). Of course, this$ can be abitrary complex, ranging from this$0 (the immediate outer context) to *************** patch_method_invocation (patch, primary, *** 12633,12639 **** this_arg has to be moved into the (then generated) stub argument list. In the meantime, the selected function might have be replaced by a generated stub. */ ! if (maybe_use_access_method (is_super_init, &list, &this_arg)) { args = tree_cons (NULL_TREE, this_arg, args); this_arg = NULL_TREE; /* So it doesn't get chained twice */ --- 13006,13013 ---- this_arg has to be moved into the (then generated) stub argument list. In the meantime, the selected function might have be replaced by a generated stub. */ ! if (!primary && ! maybe_use_access_method (is_super_init, &list, &this_arg)) { args = tree_cons (NULL_TREE, this_arg, args); this_arg = NULL_TREE; /* So it doesn't get chained twice */ *************** patch_method_invocation (patch, primary, *** 12654,12665 **** /* Calls to clone() on array types are permitted as a special-case. */ && !is_array_clone_call) { ! char *fct_name = (char *) IDENTIFIER_POINTER (DECL_NAME (list)); ! char *access = java_accstring_lookup (get_access_flags_from_decl (list)); ! char *klass = (char *) IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list)))); ! char *refklass = (char *) IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))); ! char *what = (char *) (DECL_CONSTRUCTOR_P (list) ! ? "constructor" : "method"); /* FIXME: WFL yields the wrong message here but I don't know what else to use. */ parse_error_context (wfl, --- 13028,13042 ---- /* Calls to clone() on array types are permitted as a special-case. */ && !is_array_clone_call) { ! const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list)); ! const char *const access = ! java_accstring_lookup (get_access_flags_from_decl (list)); ! const char *const klass = ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list)))); ! const char *const refklass = ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))); ! const char *const what = (DECL_CONSTRUCTOR_P (list) ! ? "constructor" : "method"); /* FIXME: WFL yields the wrong message here but I don't know what else to use. */ parse_error_context (wfl, *************** patch_method_invocation (patch, primary, *** 12667,12673 **** access, what, klass, fct_name, refklass); PATCH_METHOD_RETURN_ERROR (); } ! check_deprecation (wfl, list); /* If invoking a innerclass constructor, there are hidden parameters to pass */ --- 13044,13056 ---- access, what, klass, fct_name, refklass); PATCH_METHOD_RETURN_ERROR (); } ! ! /* Deprecation check: check whether the method being invoked or the ! instance-being-created's type are deprecated. */ ! if (TREE_CODE (patch) == NEW_CLASS_EXPR) ! check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list))); ! else ! check_deprecation (wfl, list); /* If invoking a innerclass constructor, there are hidden parameters to pass */ *************** patch_method_invocation (patch, primary, *** 12714,12738 **** /* This handles the situation where a constructor invocation needs to have an enclosing context passed as a second parameter (the ! constructor is one of an inner class. We extract it from the ! current function. */ ! if (is_super_init && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list))) { ! tree enclosing_decl = DECL_CONTEXT (TYPE_NAME (current_class)); ! tree extra_arg; ! ! if (ANONYMOUS_CLASS_P (current_class) || !DECL_CONTEXT (enclosing_decl)) ! { ! extra_arg = DECL_FUNCTION_BODY (current_function_decl); ! extra_arg = TREE_CHAIN (BLOCK_EXPR_DECLS (extra_arg)); ! } ! else ! { ! tree dest = TREE_TYPE (DECL_CONTEXT (enclosing_decl)); ! extra_arg = ! build_access_to_thisn (TREE_TYPE (enclosing_decl), dest, 0); ! extra_arg = java_complete_tree (extra_arg); ! } args = tree_cons (NULL_TREE, extra_arg, args); } --- 13097,13111 ---- /* This handles the situation where a constructor invocation needs to have an enclosing context passed as a second parameter (the ! constructor is one of an inner class). */ ! if ((is_super_init || ! (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node)) ! && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list))) { ! tree dest = TYPE_NAME (DECL_CONTEXT (list)); ! tree extra_arg = ! build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0); ! extra_arg = java_complete_tree (extra_arg); args = tree_cons (NULL_TREE, extra_arg, args); } *************** patch_method_invocation (patch, primary, *** 12760,12765 **** --- 13133,13140 ---- if (ret_decl) *ret_decl = list; patch = patch_invoke (patch, list, args); + + /* Now is a good time to insert the call to finit$ */ if (is_super_init && CLASS_HAS_FINIT_P (current_class)) { tree finit_parms, finit_call; *************** patch_method_invocation (patch, primary, *** 12775,12783 **** /* Generate the code used to initialize fields declared with an initialization statement and build a compound statement along with the super constructor invocation. */ patch = build (COMPOUND_EXPR, void_type_node, patch, java_complete_tree (finit_call)); - CAN_COMPLETE_NORMALLY (patch) = 1; } return patch; } --- 13150,13158 ---- /* Generate the code used to initialize fields declared with an initialization statement and build a compound statement along with the super constructor invocation. */ + CAN_COMPLETE_NORMALLY (patch) = 1; patch = build (COMPOUND_EXPR, void_type_node, patch, java_complete_tree (finit_call)); } return patch; } *************** maybe_use_access_method (is_super_init, *** 12821,12827 **** if (is_super_init || DECL_CONTEXT (md) == current_class || !PURE_INNER_CLASS_TYPE_P (current_class) ! || DECL_FINIT_P (md)) return 0; /* If we're calling a method found in an enclosing class, generate --- 13196,13203 ---- if (is_super_init || DECL_CONTEXT (md) == current_class || !PURE_INNER_CLASS_TYPE_P (current_class) ! || DECL_FINIT_P (md) ! || DECL_INSTINIT_P (md)) return 0; /* If we're calling a method found in an enclosing class, generate *************** patch_invoke (patch, method, args) *** 12883,12889 **** { tree dtable, func; tree original_call, t, ta; ! tree cond = NULL_TREE; /* Last step for args: convert build-in types. If we're dealing with a new TYPE() type call, the first argument to the constructor --- 13259,13265 ---- { tree dtable, func; tree original_call, t, ta; ! tree check = NULL_TREE; /* Last step for args: convert build-in types. If we're dealing with a new TYPE() type call, the first argument to the constructor *************** patch_invoke (patch, method, args) *** 12907,12913 **** func = method; else { - tree signature = build_java_signature (TREE_TYPE (method)); switch (invocation_mode (method, CALL_USING_SUPER (patch))) { case INVOKE_VIRTUAL: --- 13283,13288 ---- *************** patch_invoke (patch, method, args) *** 12922,12941 **** optimization pass to eliminate redundant checks. */ if (TREE_VALUE (args) != current_this) { ! /* We use a SAVE_EXPR here to make sure we only evaluate the new `self' expression once. */ tree save_arg = save_expr (TREE_VALUE (args)); TREE_VALUE (args) = save_arg; ! cond = build (EQ_EXPR, boolean_type_node, save_arg, ! null_pointer_node); } /* Fall through. */ case INVOKE_SUPER: case INVOKE_STATIC: ! func = build_known_method_ref (method, TREE_TYPE (method), ! DECL_CONTEXT (method), ! signature, args); break; case INVOKE_INTERFACE: --- 13297,13318 ---- optimization pass to eliminate redundant checks. */ if (TREE_VALUE (args) != current_this) { ! /* We use a save_expr here to make sure we only evaluate the new `self' expression once. */ tree save_arg = save_expr (TREE_VALUE (args)); TREE_VALUE (args) = save_arg; ! check = java_check_reference (save_arg, 1); } /* Fall through. */ case INVOKE_SUPER: case INVOKE_STATIC: ! { ! tree signature = build_java_signature (TREE_TYPE (method)); ! func = build_known_method_ref (method, TREE_TYPE (method), ! DECL_CONTEXT (method), ! signature, args); ! } break; case INVOKE_INTERFACE: *************** patch_invoke (patch, method, args) *** 12954,12959 **** --- 13331,13337 ---- TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method)); TREE_OPERAND (patch, 0) = func; TREE_OPERAND (patch, 1) = args; + patch = check_for_builtin (method, patch); original_call = patch; /* We're processing a `new TYPE ()' form. New is called and its *************** patch_invoke (patch, method, args) *** 12965,12970 **** --- 13343,13350 ---- { tree class = DECL_CONTEXT (method); tree c1, saved_new, size, new; + tree alloc_node; + if (flag_emit_class_files || flag_emit_xref) { TREE_TYPE (patch) = build_pointer_type (class); *************** patch_invoke (patch, method, args) *** 12973,12980 **** if (!TYPE_SIZE (class)) safe_layout_class (class); size = size_in_bytes (class); new = build (CALL_EXPR, promote_type (class), ! build_address_of (alloc_object_node), tree_cons (NULL_TREE, build_class_ref (class), build_tree_list (NULL_TREE, size_in_bytes (class))), --- 13353,13363 ---- if (!TYPE_SIZE (class)) safe_layout_class (class); size = size_in_bytes (class); + alloc_node = + (class_has_finalize_method (class) ? alloc_object_node + : alloc_no_finalizer_node); new = build (CALL_EXPR, promote_type (class), ! build_address_of (alloc_node), tree_cons (NULL_TREE, build_class_ref (class), build_tree_list (NULL_TREE, size_in_bytes (class))), *************** patch_invoke (patch, method, args) *** 12987,13011 **** patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new); } ! /* If COND is set, then we are building a check to see if the object is NULL. */ ! if (cond != NULL_TREE) { ! /* We have to make the `then' branch a compound expression to ! make the types turn out right. This seems bizarre. */ ! patch = build (COND_EXPR, TREE_TYPE (patch), cond, ! build (COMPOUND_EXPR, TREE_TYPE (patch), ! build (CALL_EXPR, void_type_node, ! build_address_of (soft_nullpointer_node), ! NULL_TREE, NULL_TREE), ! (FLOAT_TYPE_P (TREE_TYPE (patch)) ! ? build_real (TREE_TYPE (patch), dconst0) ! : build1 (CONVERT_EXPR, TREE_TYPE (patch), ! integer_zero_node))), ! patch); TREE_SIDE_EFFECTS (patch) = 1; } return patch; } --- 13370,13407 ---- patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new); } ! /* If CHECK is set, then we are building a check to see if the object is NULL. */ ! if (check != NULL_TREE) { ! patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check, patch); TREE_SIDE_EFFECTS (patch) = 1; } + /* In order to be able to modify PATCH later, we SAVE_EXPR it and + put it as the first expression of a COMPOUND_EXPR. The second + expression being an empty statement to be later patched if + necessary. We remember a TREE_LIST (the PURPOSE is the method, + the VALUE is the compound) in a hashtable and return a + COMPOUND_EXPR built so that the result of the evaluation of the + original PATCH node is returned. */ + if (STATIC_CLASS_INIT_OPT_P () + && current_function_decl && METHOD_STATIC (method)) + { + tree list; + tree fndecl = current_function_decl; + tree save = save_expr (patch); + tree type = TREE_TYPE (patch); + + patch = build (COMPOUND_EXPR, type, save, empty_stmt_node); + list = tree_cons (method, patch, + DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl)); + + DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list; + + patch = build (COMPOUND_EXPR, type, patch, save); + } + return patch; } *************** lookup_method_invoke (lc, cl, class, nam *** 13071,13077 **** know the arguments' types. */ if (lc && ANONYMOUS_CLASS_P (class)) ! craft_constructor (TYPE_NAME (class), atl); /* Find all candidates and then refine the list, searching for the most specific method. */ --- 13467,13480 ---- know the arguments' types. */ if (lc && ANONYMOUS_CLASS_P (class)) ! { ! tree saved_current_class; ! tree mdecl = craft_constructor (TYPE_NAME (class), atl); ! saved_current_class = current_class; ! current_class = class; ! fix_constructors (mdecl); ! current_class = saved_current_class; ! } /* Find all candidates and then refine the list, searching for the most specific method. */ *************** find_applicable_accessible_methods_list *** 13180,13189 **** search_applicable_methods_list (lc, TYPE_METHODS (class), name, arglist, &list, &all_list); ! /* When looking finit$ or class$, we turn LC to 1 so that we ! only search in class. Note that we should have found something at this point. */ ! if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name)) { lc = 1; if (!list) --- 13583,13592 ---- search_applicable_methods_list (lc, TYPE_METHODS (class), name, arglist, &list, &all_list); ! /* When looking finit$, class$ or instinit$, we turn LC to 1 so ! that we only search in class. Note that we should have found something at this point. */ ! if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name)) { lc = 1; if (!list) *************** qualify_ambiguous_name (id) *** 13448,13454 **** { case CALL_EXPR: qual_wfl = TREE_OPERAND (qual_wfl, 0); ! if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION) { qual = EXPR_WFL_QUALIFICATION (qual_wfl); qual_wfl = QUAL_WFL (qual); --- 13851,13859 ---- { case CALL_EXPR: qual_wfl = TREE_OPERAND (qual_wfl, 0); ! if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION ! || (EXPR_WFL_QUALIFICATION (qual_wfl) ! && TREE_CODE (EXPR_WFL_QUALIFICATION (qual_wfl)) == TREE_LIST)) { qual = EXPR_WFL_QUALIFICATION (qual_wfl); qual_wfl = QUAL_WFL (qual); *************** qualify_ambiguous_name (id) *** 13492,13502 **** else if (code == INTEGER_CST) name = qual_wfl; ! else if (code == CONVERT_EXPR && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = TREE_OPERAND (qual_wfl, 0); ! else if ((code == ARRAY_REF || code == CALL_EXPR || code == MODIFY_EXPR) && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = EXPR_WFL_NODE (TREE_OPERAND (qual_wfl, 0)); --- 13897,13913 ---- else if (code == INTEGER_CST) name = qual_wfl; ! else if (code == CONVERT_EXPR && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = TREE_OPERAND (qual_wfl, 0); ! ! else if (code == CONVERT_EXPR ! && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == CALL_EXPR ! && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (qual_wfl, 0), 0)) ! == EXPR_WITH_FILE_LOCATION)) ! name = TREE_OPERAND (TREE_OPERAND (qual_wfl, 0), 0); ! else if ((code == ARRAY_REF || code == CALL_EXPR || code == MODIFY_EXPR) && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = EXPR_WFL_NODE (TREE_OPERAND (qual_wfl, 0)); *************** qualify_ambiguous_name (id) *** 13594,13602 **** of the compilation unit containing NAME, - NAME is declared by exactly on type-import-on-demand declaration of the compilation unit containing NAME. ! - NAME is actually a STRING_CST. */ ! else if (TREE_CODE (name) == STRING_CST || TREE_CODE (name) == INTEGER_CST ! || (decl = resolve_and_layout (name, NULL_TREE))) { RESOLVE_TYPE_NAME_P (qual_wfl) = 1; QUAL_RESOLUTION (qual) = decl; --- 14005,14016 ---- of the compilation unit containing NAME, - NAME is declared by exactly on type-import-on-demand declaration of the compilation unit containing NAME. ! - NAME is actually a STRING_CST. ! This can't happen if the expression was qualified by `this.' */ ! else if (! this_found && ! (TREE_CODE (name) == STRING_CST || ! TREE_CODE (name) == INTEGER_CST || ! (decl = resolve_and_layout (name, NULL_TREE)))) { RESOLVE_TYPE_NAME_P (qual_wfl) = 1; QUAL_RESOLUTION (qual) = decl; *************** java_complete_tree (node) *** 13716,13732 **** DECL_INITIAL (node) = value; if (value != NULL_TREE) { ! /* fold_constant_for_init sometimes widen the original type ! of the constant (i.e. byte to int.) It's not desirable, especially if NODE is a function argument. */ ! if (TREE_CODE (value) == INTEGER_CST && TREE_TYPE (node) != TREE_TYPE (value)) return convert (TREE_TYPE (node), value); else return value; } - else - DECL_FIELD_FINAL_IUD (node) = 0; } return node; } --- 14130,14145 ---- DECL_INITIAL (node) = value; if (value != NULL_TREE) { ! /* fold_constant_for_init sometimes widens the original type ! of the constant (i.e. byte to int). It's not desirable, especially if NODE is a function argument. */ ! if ((TREE_CODE (value) == INTEGER_CST ! || TREE_CODE (value) == REAL_CST) && TREE_TYPE (node) != TREE_TYPE (value)) return convert (TREE_TYPE (node), value); else return value; } } return node; } *************** java_complete_lhs (node) *** 13882,13902 **** TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0)); return node; - case CLEANUP_POINT_EXPR: - COMPLETE_CHECK_OP_0 (node); - TREE_TYPE (node) = void_type_node; - CAN_COMPLETE_NORMALLY (node) = - CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0)); - return node; - - case WITH_CLEANUP_EXPR: - COMPLETE_CHECK_OP_0 (node); - COMPLETE_CHECK_OP_2 (node); - CAN_COMPLETE_NORMALLY (node) = - CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0)); - TREE_TYPE (node) = void_type_node; - return node; - case LABELED_BLOCK_EXPR: PUSH_LABELED_BLOCK (node); if (LABELED_BLOCK_BODY (node)) --- 14295,14300 ---- *************** java_complete_lhs (node) *** 13934,13939 **** --- 14332,14340 ---- cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)), TREE_OPERAND (cn, 1)); } + /* Accept final locals too. */ + else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn)) + cn = fold_constant_for_init (DECL_INITIAL (cn), cn); if (!TREE_CONSTANT (cn) && !flag_emit_xref) { *************** java_complete_lhs (node) *** 13957,13966 **** } cn = fold (convert (int_type_node, cn)); ! /* Multiple instance of a case label bearing the same ! value is checked during code generation. The case ! expression is allright so far. */ if (TREE_CODE (cn) == VAR_DECL) cn = DECL_INITIAL (cn); TREE_OPERAND (node, 0) = cn; --- 14358,14372 ---- } cn = fold (convert (int_type_node, cn)); + TREE_CONSTANT_OVERFLOW (cn) = 0; + CAN_COMPLETE_NORMALLY (cn) = 1; ! /* Save the label on a list so that we can later check for ! duplicates. */ ! case_label_list = tree_cons (node, cn, case_label_list); ! ! /* Multiple instance of a case label bearing the same value is ! checked later. The case expression is all right so far. */ if (TREE_CODE (cn) == VAR_DECL) cn = DECL_INITIAL (cn); TREE_OPERAND (node, 0) = cn; *************** java_complete_lhs (node) *** 14072,14079 **** TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); if (TREE_OPERAND (node, 1) == error_mark_node) return error_mark_node; CAN_COMPLETE_NORMALLY (node) ! = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)); } TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1)); break; --- 14478,14489 ---- TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); if (TREE_OPERAND (node, 1) == error_mark_node) return error_mark_node; + /* Even though we might allow the case where the first + operand doesn't return normally, we still should compute + CAN_COMPLETE_NORMALLY correctly. */ CAN_COMPLETE_NORMALLY (node) ! = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0)) ! && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))); } TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1)); break; *************** java_complete_lhs (node) *** 14214,14230 **** value = fold_constant_for_init (nn, nn); ! if (value != NULL_TREE) { ! tree type = TREE_TYPE (value); ! if (JPRIMITIVE_TYPE_P (type) || ! (type == string_ptr_type_node && ! flag_emit_class_files)) ! return empty_stmt_node; } if (! flag_emit_class_files) DECL_INITIAL (nn) = NULL_TREE; - if (CLASS_FINAL_VARIABLE_P (nn)) - DECL_FIELD_FINAL_IUD (nn) = 0; } wfl_op2 = TREE_OPERAND (node, 1); --- 14624,14658 ---- value = fold_constant_for_init (nn, nn); ! /* When we have a primitype type, or a string and we're not ! emitting a class file, we actually don't want to generate ! anything for the assignment. */ ! if (value != NULL_TREE && ! (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) || ! (TREE_TYPE (value) == string_ptr_type_node && ! ! flag_emit_class_files))) { ! /* Prepare node for patch_assignment */ ! TREE_OPERAND (node, 1) = value; ! /* Call patch assignment to verify the assignment */ ! if (patch_assignment (node, wfl_op1) == error_mark_node) ! return error_mark_node; ! /* Set DECL_INITIAL properly (a conversion might have ! been decided by patch_assignment) and return the ! empty statement. */ ! else ! { ! tree patched = patch_string (TREE_OPERAND (node, 1)); ! if (patched) ! DECL_INITIAL (nn) = patched; ! else ! DECL_INITIAL (nn) = TREE_OPERAND (node, 1); ! DECL_FIELD_FINAL_IUD (nn) = 1; ! return empty_stmt_node; ! } } if (! flag_emit_class_files) DECL_INITIAL (nn) = NULL_TREE; } wfl_op2 = TREE_OPERAND (node, 1); *************** java_complete_lhs (node) *** 14302,14314 **** } else { ! node = patch_assignment (node, wfl_op1, wfl_op2); /* Reorganize the tree if necessary. */ if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node)) || JSTRING_P (TREE_TYPE (node)))) node = java_refold (node); } ! CAN_COMPLETE_NORMALLY (node) = 1; return node; --- 14730,14755 ---- } else { ! node = patch_assignment (node, wfl_op1); ! if (node == error_mark_node) ! return error_mark_node; /* Reorganize the tree if necessary. */ if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node)) || JSTRING_P (TREE_TYPE (node)))) node = java_refold (node); } ! ! /* Seek to set DECL_INITIAL to a proper value, since it might have ! undergone a conversion in patch_assignment. We do that only when ! it's necessary to have DECL_INITIAL properly set. */ ! nn = TREE_OPERAND (node, 0); ! if (TREE_CODE (nn) == VAR_DECL ! && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn)) ! && FIELD_STATIC (nn) && FIELD_FINAL (nn) ! && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn)) ! || TREE_TYPE (nn) == string_ptr_type_node)) ! DECL_INITIAL (nn) = TREE_OPERAND (node, 1); ! CAN_COMPLETE_NORMALLY (node) = 1; return node; *************** java_complete_lhs (node) *** 14459,14474 **** return error_mark_node; break; - case INSTANCE_INITIALIZERS_EXPR: - in_instance_initializer++; - node = java_complete_tree (TREE_OPERAND (node, 0)); - in_instance_initializer--; - if (node != error_mark_node) - TREE_TYPE (node) = void_type_node; - else - return error_mark_node; - break; - default: CAN_COMPLETE_NORMALLY (node) = 1; /* Ok: may be we have a STRING_CST or a crafted `StringBuffer' --- 14900,14905 ---- *************** complete_function_arguments (node) *** 14507,14514 **** `+' operator. Build `parm.toString()' and expand it. */ if ((temp = patch_string (parm))) parm = temp; - /* Inline PRIMTYPE.TYPE read access */ - parm = maybe_build_primttype_type_ref (parm, wfl); TREE_VALUE (cn) = parm; } --- 14938,14943 ---- *************** build_expr_block (body, decls) *** 14547,14553 **** return node; } ! /* Create a new function block and link it approriately to current function block chain */ static tree --- 14976,14982 ---- return node; } ! /* Create a new function block and link it appropriately to current function block chain */ static tree *************** print_int_node (node) *** 14785,15096 **** } - - /* This section of the code handle assignment check with FINAL - variables. */ - - static void - reset_static_final_variable_assignment_flag (class) - tree class; - { - tree field; - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (CLASS_FINAL_VARIABLE_P (field)) - DECL_FIELD_FINAL_LIIC (field) = 0; - } - - /* Figure whether all final static variable have been initialized. */ - - static void - check_static_final_variable_assignment_flag (class) - tree class; - { - tree field; - - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (CLASS_FINAL_VARIABLE_P (field) - && !DECL_FIELD_FINAL_IUD (field) && !DECL_FIELD_FINAL_LIIC (field)) - parse_error_context - (DECL_FIELD_FINAL_WFL (field), - "Blank static final variable `%s' may not have been initialized", - IDENTIFIER_POINTER (DECL_NAME (field))); - } - - /* This function marks all final variable locally unassigned. */ - - static void - reset_final_variable_local_assignment_flag (class) - tree class; - { - tree field; - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FINAL_VARIABLE_P (field)) - DECL_FIELD_FINAL_LIIC (field) = 0; - } - - /* Figure whether all final variables have beem initialized in MDECL - and mark MDECL accordingly. */ - - static void - check_final_variable_local_assignment_flag (class, mdecl) - tree class; - tree mdecl; - { - tree field; - int initialized = 0; - int non_initialized = 0; - - if (DECL_FUNCTION_SYNTHETIC_CTOR (mdecl)) - return; - - /* First find out whether all final variables or no final variable - are initialized in this ctor. We don't take into account final - variable that have been initialized upon declaration. */ - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FINAL_VARIABLE_P (field) && !DECL_FIELD_FINAL_IUD (field)) - { - if (DECL_FIELD_FINAL_LIIC (field)) - initialized++; - else - non_initialized++; - } - - /* There were no non initialized variable and no initialized variable. - This ctor is fine. */ - if (!non_initialized && !initialized) - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 1; - /* If no variables have been initialized, that fine. We'll check - later whether this ctor calls a constructor which initializes - them. We mark the ctor as not initializing all its finals. */ - else if (initialized == 0) - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 0; - /* If we have a mixed bag, then we have a problem. We need to report - all the variables we're not initializing. */ - else if (initialized && non_initialized) - { - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 0; - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FIELD_FINAL (field) - && !DECL_FIELD_FINAL_IUD (field) && !DECL_FIELD_FINAL_LIIC (field)) - { - parse_error_context - (lookup_cl (mdecl), - "Blank final variable `%s' may not have been initialized in this constructor", - IDENTIFIER_POINTER (DECL_NAME (field))); - DECL_FIELD_FINAL_IERR (field) = 1; - } - } - /* Otherwise we know this ctor is initializing all its final - variable. We mark it so. */ - else - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 1; - } - - /* This function recurses in a simple what through STMT and stops when - it finds a constructor call. It then verifies that the called - constructor initialized its final properly. Return 1 upon success, - 0 or -1 otherwise. */ - - static int - check_final_variable_indirect_assignment (stmt) - tree stmt; - { - int res; - switch (TREE_CODE (stmt)) - { - case EXPR_WITH_FILE_LOCATION: - return check_final_variable_indirect_assignment (EXPR_WFL_NODE (stmt)); - case COMPOUND_EXPR: - res = check_final_variable_indirect_assignment (TREE_OPERAND (stmt, 0)); - if (res) - return res; - return check_final_variable_indirect_assignment (TREE_OPERAND (stmt, 1)); - case SAVE_EXPR: - return check_final_variable_indirect_assignment (TREE_OPERAND (stmt, 0)); - case CALL_EXPR: - { - tree decl = TREE_OPERAND (stmt, 0); - tree fbody; - - if (TREE_CODE (decl) != FUNCTION_DECL) - decl = TREE_OPERAND (TREE_OPERAND (decl, 0), 0); - if (TREE_CODE (decl) != FUNCTION_DECL) - abort (); - if (DECL_FUNCTION_ALL_FINAL_INITIALIZED (decl)) - return 1; - if (DECL_FINIT_P (decl) || DECL_CONTEXT (decl) != current_class) - return -1; - fbody = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)); - if (fbody == error_mark_node) - return -1; - fbody = BLOCK_EXPR_BODY (fbody); - return check_final_variable_indirect_assignment (fbody); - } - default: - break; - } - return 0; - } - - /* This is the last chance to catch a final variable initialization - problem. This routine will report an error if a final variable was - never (globally) initialized and never reported as not having been - initialized properly. */ - - static void - check_final_variable_global_assignment_flag (class) - tree class; - { - tree field, mdecl; - int nnctor = 0; - - /* We go through all natural ctors and see whether they're - initializing all their final variables or not. */ - current_function_decl = NULL_TREE; /* For the error report. */ - for (mdecl = TYPE_METHODS (class); mdecl; mdecl = TREE_CHAIN (mdecl)) - if (DECL_CONSTRUCTOR_P (mdecl) && ! DECL_FUNCTION_SYNTHETIC_CTOR (mdecl)) - { - if (!DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl)) - { - /* It doesn't. Maybe it calls a constructor that initializes - them. find out. */ - tree fbody = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)); - if (fbody == error_mark_node) - continue; - fbody = BLOCK_EXPR_BODY (fbody); - if (check_final_variable_indirect_assignment (fbody) == 1) - { - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 1; - nnctor++; - } - else - parse_error_context - (lookup_cl (mdecl), - "Final variable initialization error in this constructor"); - } - else - nnctor++; - } - - /* Finally we catch final variables that never were initialized */ - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FINAL_VARIABLE_P (field) - /* If the field wasn't initialized upon declaration */ - && !DECL_FIELD_FINAL_IUD (field) - /* There wasn't natural ctor in which the field could have been - initialized */ - && !nnctor - /* If we never reported a problem with this field */ - && !DECL_FIELD_FINAL_IERR (field)) - { - current_function_decl = NULL; - parse_error_context - (DECL_FIELD_FINAL_WFL (field), - "Final variable `%s' hasn't been initialized upon its declaration", - IDENTIFIER_POINTER (DECL_NAME (field))); - } - - } - /* Return 1 if an assignment to a FINAL is attempted in a non suitable context. */ - static int - check_final_assignment (lvalue, wfl) - tree lvalue, wfl; - { - if (TREE_CODE (lvalue) != COMPONENT_REF && !JDECL_P (lvalue)) - return 0; - - if (TREE_CODE (lvalue) == COMPONENT_REF - && JDECL_P (TREE_OPERAND (lvalue, 1))) - lvalue = TREE_OPERAND (lvalue, 1); - - if (!FIELD_FINAL (lvalue)) - return 0; - - /* Now the logic. We can modify a final VARIABLE: - 1) in finit$, (its declaration was followed by an initialization,) - 2) consistently in each natural ctor, if it wasn't initialized in - finit$ or once in . In any other cases, an error should be - reported. */ - if (DECL_FINIT_P (current_function_decl)) - { - DECL_FIELD_FINAL_IUD (lvalue) = 1; - return 0; - } - - if (!DECL_FUNCTION_SYNTHETIC_CTOR (current_function_decl) - /* Only if it wasn't given a value upon initialization */ - && DECL_LANG_SPECIFIC (lvalue) && !DECL_FIELD_FINAL_IUD (lvalue) - /* If it was never assigned a value in this constructor */ - && !DECL_FIELD_FINAL_LIIC (lvalue)) - { - /* Turn the locally assigned flag on, it will be checked later - on to point out at discrepancies. */ - DECL_FIELD_FINAL_LIIC (lvalue) = 1; - if (DECL_CLINIT_P (current_function_decl)) - DECL_FIELD_FINAL_IUD (lvalue) = 1; - return 0; - } - - /* Other problems should be reported right away. */ - parse_error_context - (wfl, "Can't %sassign a value to the final variable `%s'", - (FIELD_STATIC (lvalue) ? "re" : ""), - IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl))); - - /* Note that static field can be initialized once and only once. */ - if (FIELD_STATIC (lvalue)) - DECL_FIELD_FINAL_IERR (lvalue) = 1; - - return 1; - } - - /* Inline references to java.lang.PRIMTYPE.TYPE when accessed in - read. This is needed to avoid circularities in the implementation - of these fields in libjava. */ - - static tree - maybe_build_primttype_type_ref (rhs, wfl) - tree rhs, wfl; - { - tree to_return = NULL_TREE; - tree rhs_type = TREE_TYPE (rhs); - if (TREE_CODE (rhs) == COMPOUND_EXPR) - { - tree n = TREE_OPERAND (rhs, 1); - if (TREE_CODE (n) == VAR_DECL - && DECL_NAME (n) == TYPE_identifier_node - && rhs_type == class_ptr_type - && TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION - && TREE_CODE (EXPR_WFL_NODE (wfl)) == IDENTIFIER_NODE) - { - const char *self_name = IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)); - if (!strncmp (self_name, "java.lang.", 10)) - to_return = build_primtype_type_ref (self_name); - } - } - return (to_return ? to_return : rhs ); - } - /* 15.25 Assignment operators. */ static tree ! patch_assignment (node, wfl_op1, wfl_op2) tree node; tree wfl_op1; - tree wfl_op2; { tree rhs = TREE_OPERAND (node, 1); tree lvalue = TREE_OPERAND (node, 0), llvalue; tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE; int error_found = 0; int lvalue_from_array = 0; ! ! /* Can't assign to a (blank) final. */ ! if (check_final_assignment (lvalue, wfl_op1)) ! error_found = 1; EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node); --- 15214,15235 ---- } /* Return 1 if an assignment to a FINAL is attempted in a non suitable context. */ /* 15.25 Assignment operators. */ static tree ! patch_assignment (node, wfl_op1) tree node; tree wfl_op1; { tree rhs = TREE_OPERAND (node, 1); tree lvalue = TREE_OPERAND (node, 0), llvalue; tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE; int error_found = 0; int lvalue_from_array = 0; ! int is_return = 0; EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node); *************** patch_assignment (node, wfl_op1, wfl_op2 *** 15099,15107 **** { lhs_type = TREE_TYPE (lvalue); } ! /* Or Lhs can be a array acccess. Should that be lvalue ? FIXME + ! comment on reason why */ ! else if (TREE_CODE (wfl_op1) == ARRAY_REF) { lhs_type = TREE_TYPE (lvalue); lvalue_from_array = 1; --- 15238,15245 ---- { lhs_type = TREE_TYPE (lvalue); } ! /* Or Lhs can be an array access. */ ! else if (TREE_CODE (lvalue) == ARRAY_REF) { lhs_type = TREE_TYPE (lvalue); lvalue_from_array = 1; *************** patch_assignment (node, wfl_op1, wfl_op2 *** 15111,15131 **** lhs_type = TREE_TYPE (lvalue); /* Or a function return slot */ else if (TREE_CODE (lvalue) == RESULT_DECL) ! lhs_type = TREE_TYPE (lvalue); /* Otherwise, we might want to try to write into an optimized static final, this is an of a different nature, reported further on. */ else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION && resolve_expression_name (wfl_op1, &llvalue)) { ! if (!error_found && check_final_assignment (llvalue, wfl_op1)) ! { ! /* What we should do instead is resetting the all the flags ! previously set, exchange lvalue for llvalue and continue. */ ! error_found = 1; ! return error_mark_node; ! } ! else ! lhs_type = TREE_TYPE (lvalue); } else { --- 15249,15269 ---- lhs_type = TREE_TYPE (lvalue); /* Or a function return slot */ else if (TREE_CODE (lvalue) == RESULT_DECL) ! { ! /* If the return type is an integral type, then we create the ! RESULT_DECL with a promoted type, but we need to do these ! checks against the unpromoted type to ensure type safety. So ! here we look at the real type, not the type of the decl we ! are modifying. */ ! lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl)); ! is_return = 1; ! } /* Otherwise, we might want to try to write into an optimized static final, this is an of a different nature, reported further on. */ else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION && resolve_expression_name (wfl_op1, &llvalue)) { ! lhs_type = TREE_TYPE (lvalue); } else { *************** patch_assignment (node, wfl_op1, wfl_op2 *** 15134,15139 **** --- 15272,15278 ---- } rhs_type = TREE_TYPE (rhs); + /* 5.1 Try the assignment conversion for builtin type. */ new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs); *************** patch_assignment (node, wfl_op1, wfl_op2 *** 15171,15177 **** wfl = wfl_operator; if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1))) strcpy (operation, "assignment"); ! else if (TREE_CODE (TREE_OPERAND (node, 0)) == RESULT_DECL) strcpy (operation, "`return'"); else strcpy (operation, "`='"); --- 15310,15316 ---- wfl = wfl_operator; if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1))) strcpy (operation, "assignment"); ! else if (is_return) strcpy (operation, "`return'"); else strcpy (operation, "`='"); *************** patch_assignment (node, wfl_op1, wfl_op2 *** 15188,15279 **** error_found = 1; } - /* Inline read access to java.lang.PRIMTYPE.TYPE */ - if (new_rhs) - new_rhs = maybe_build_primttype_type_ref (new_rhs, wfl_op2); - if (error_found) return error_mark_node; /* 10.10: Array Store Exception runtime check */ if (!flag_emit_class_files && !flag_emit_xref && lvalue_from_array && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type))) { ! tree check; ! tree base = lvalue; ! ! /* We need to retrieve the right argument for _Jv_CheckArrayStore */ ! if (TREE_CODE (lvalue) == COMPOUND_EXPR) ! base = TREE_OPERAND (lvalue, 0); ! else ! { ! tree op = TREE_OPERAND (base, 0); ! ! /* We can have a SAVE_EXPR here when doing String +=. */ ! if (TREE_CODE (op) == SAVE_EXPR) ! op = TREE_OPERAND (op, 0); ! if (flag_bounds_check) ! base = TREE_OPERAND (TREE_OPERAND (op, 1), 0); ! else ! base = TREE_OPERAND (op, 0); ! } ! ! /* Build the invocation of _Jv_CheckArrayStore */ new_rhs = save_expr (new_rhs); - check = build (CALL_EXPR, void_type_node, - build_address_of (soft_checkarraystore_node), - tree_cons (NULL_TREE, base, - build_tree_list (NULL_TREE, new_rhs)), - NULL_TREE); - TREE_SIDE_EFFECTS (check) = 1; ! /* We have to decide on an insertion point */ ! if (TREE_CODE (lvalue) == COMPOUND_EXPR) ! { ! tree t; ! if (flag_bounds_check) ! { ! t = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (lvalue, 1), 0), 0); ! TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (lvalue, 1), 0), 0) = ! build (COMPOUND_EXPR, void_type_node, t, check); ! } ! else ! TREE_OPERAND (lvalue, 1) = build (COMPOUND_EXPR, lhs_type, ! check, TREE_OPERAND (lvalue, 1)); ! } ! else if (flag_bounds_check) { ! tree hook = lvalue; ! tree compound = TREE_OPERAND (lvalue, 0); ! tree bound_check, new_compound; ! ! if (TREE_CODE (compound) == SAVE_EXPR) ! { ! compound = TREE_OPERAND (compound, 0); ! hook = TREE_OPERAND (hook, 0); ! } ! ! /* Find the array bound check, hook the original array access. */ ! bound_check = TREE_OPERAND (compound, 0); ! TREE_OPERAND (hook, 0) = TREE_OPERAND (compound, 1); ! ! /* Make sure the bound check will happen before the store check */ ! new_compound = ! build (COMPOUND_EXPR, void_type_node, bound_check, check); ! ! /* Re-assemble the augmented array access. */ ! lvalue = build (COMPOUND_EXPR, lhs_type, new_compound, lvalue); } else ! lvalue = build (COMPOUND_EXPR, lhs_type, check, lvalue); } /* Final locals can be used as case values in switch statement. Prepare them for this eventuality. */ if (TREE_CODE (lvalue) == VAR_DECL ! && LOCAL_FINAL_P (lvalue) && TREE_CONSTANT (new_rhs) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue)) && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue)) --- 15327,15378 ---- error_found = 1; } if (error_found) return error_mark_node; + /* If we're processing a `return' statement, promote the actual type + to the promoted type. */ + if (is_return) + new_rhs = convert (TREE_TYPE (lvalue), new_rhs); + /* 10.10: Array Store Exception runtime check */ if (!flag_emit_class_files && !flag_emit_xref && lvalue_from_array && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type))) { ! tree array, store_check, base, index_expr; ! ! /* Save RHS so that it doesn't get re-evaluated by the store check. */ new_rhs = save_expr (new_rhs); ! /* Get the INDIRECT_REF. */ ! array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0); ! /* Get the array pointer expr. */ ! array = TREE_OPERAND (array, 0); ! store_check = build_java_arraystore_check (array, new_rhs); ! ! index_expr = TREE_OPERAND (lvalue, 1); ! ! if (TREE_CODE (index_expr) == COMPOUND_EXPR) { ! /* A COMPOUND_EXPR here is a bounds check. The bounds check must ! happen before the store check, so prepare to insert the store ! check within the second operand of the existing COMPOUND_EXPR. */ ! base = index_expr; } else ! base = lvalue; ! ! index_expr = TREE_OPERAND (base, 1); ! TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr), ! store_check, index_expr); } /* Final locals can be used as case values in switch statement. Prepare them for this eventuality. */ if (TREE_CODE (lvalue) == VAR_DECL ! && DECL_FINAL (lvalue) && TREE_CONSTANT (new_rhs) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue)) && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue)) *************** patch_assignment (node, wfl_op1, wfl_op2 *** 15290,15298 **** } /* Check that type SOURCE can be cast into type DEST. If the cast ! can't occur at all, return 0 otherwise 1. This function is used to ! produce accurate error messages on the reasons why an assignment ! failed. */ static tree try_reference_assignconv (lhs_type, rhs) --- 15389,15396 ---- } /* Check that type SOURCE can be cast into type DEST. If the cast ! can't occur at all, return NULL; otherwise, return a possibly ! modified rhs. */ static tree try_reference_assignconv (lhs_type, rhs) *************** try_builtin_assignconv (wfl_op1, lhs_typ *** 15337,15348 **** new_rhs = rhs; } - /* Zero accepted everywhere */ - else if (TREE_CODE (rhs) == INTEGER_CST - && TREE_INT_CST_HIGH (rhs) == 0 && TREE_INT_CST_LOW (rhs) == 0 - && JPRIMITIVE_TYPE_P (rhs_type)) - new_rhs = convert (lhs_type, rhs); - /* 5.1.1 Try Identity Conversion, 5.1.2 Try Widening Primitive Conversion */ else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type)) --- 15435,15440 ---- *************** patch_binop (node, wfl_op1, wfl_op2) *** 15760,15766 **** tree op1_type = TREE_TYPE (op1); tree op2_type = TREE_TYPE (op2); tree prom_type = NULL_TREE, cn; ! int code = TREE_CODE (node); /* If 1, tell the routine that we have to return error_mark_node after checking for the initialization of the RHS */ --- 15852,15858 ---- tree op1_type = TREE_TYPE (op1); tree op2_type = TREE_TYPE (op2); tree prom_type = NULL_TREE, cn; ! enum tree_code code = TREE_CODE (node); /* If 1, tell the routine that we have to return error_mark_node after checking for the initialization of the RHS */ *************** patch_binop (node, wfl_op1, wfl_op2) *** 15806,15815 **** --- 15898,15932 ---- break; } prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2); + + /* Detect integral division by zero */ + if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR) + && TREE_CODE (prom_type) == INTEGER_TYPE + && (op2 == integer_zero_node || op2 == long_zero_node || + (TREE_CODE (op2) == INTEGER_CST && + ! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2)))) + { + parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown"); + TREE_CONSTANT (node) = 0; + } + /* Change the division operator if necessary */ if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE) TREE_SET_CODE (node, TRUNC_DIV_EXPR); + /* Before divisions as is disapear, try to simplify and bail if + applicable, otherwise we won't perform even simple + simplifications like (1-1)/3. We can't do that with floating + point number, folds can't handle them at this stage. */ + if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2) + && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2)) + { + TREE_TYPE (node) = prom_type; + node = fold (node); + if (TREE_CODE (node) != code) + return node; + } + if (TREE_CODE (prom_type) == INTEGER_TYPE && flag_use_divide_subroutine && ! flag_emit_class_files *************** patch_binop (node, wfl_op1, wfl_op2) *** 15887,15893 **** } /* Unary numeric promotion (5.6.1) is performed on each operand ! separatly */ op1 = do_unary_numeric_promotion (op1); op2 = do_unary_numeric_promotion (op2); --- 16004,16010 ---- } /* Unary numeric promotion (5.6.1) is performed on each operand ! separately */ op1 = do_unary_numeric_promotion (op1); op2 = do_unary_numeric_promotion (op2); *************** patch_binop (node, wfl_op1, wfl_op2) *** 16016,16021 **** --- 16133,16146 ---- error_found = 1; break; } + else if (integer_zerop (op1)) + { + return code == TRUTH_ANDIF_EXPR ? op1 : op2; + } + else if (integer_onep (op1)) + { + return code == TRUTH_ANDIF_EXPR ? op2 : op1; + } /* The type of the conditional operators is BOOLEAN */ prom_type = boolean_type_node; break; *************** patch_binop (node, wfl_op1, wfl_op2) *** 16097,16102 **** --- 16222,16229 ---- } prom_type = boolean_type_node; break; + default: + abort (); } if (error_found) *************** merge_string_cste (op1, op2, after) *** 16164,16172 **** /* Reasonable integer constant can be treated right away */ if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2)) { ! static const char *boolean_true = "true"; ! static const char *boolean_false = "false"; ! static const char *null_pointer = "null"; char ch[3]; const char *string; --- 16291,16299 ---- /* Reasonable integer constant can be treated right away */ if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2)) { ! static const char *const boolean_true = "true"; ! static const char *const boolean_false = "false"; ! static const char *const null_pointer = "null"; char ch[3]; const char *string; *************** build_incdec (op_token, op_location, op1 *** 16382,16388 **** tree op1; int is_post_p; { ! static enum tree_code lookup [2][2] = { { PREDECREMENT_EXPR, PREINCREMENT_EXPR, }, { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, }, --- 16509,16515 ---- tree op1; int is_post_p; { ! static const enum tree_code lookup [2][2] = { { PREDECREMENT_EXPR, PREINCREMENT_EXPR, }, { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, }, *************** patch_unaryop (node, wfl_op) *** 16503,16528 **** && TREE_OPERAND (decl, 1) && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF))) { - tree lvalue; - /* Before screaming, check that we're not in fact trying to - increment a optimized static final access, in which case - we issue an different error message. */ - if (!(TREE_CODE (wfl_op) == EXPR_WITH_FILE_LOCATION - && resolve_expression_name (wfl_op, &lvalue) - && check_final_assignment (lvalue, wfl_op))) - parse_error_context (wfl_operator, "Invalid argument to `%s'", - operator_string (node)); TREE_TYPE (node) = error_mark_node; error_found = 1; } - if (check_final_assignment (op, wfl_op)) - error_found = 1; - /* From now on, we know that op if a variable and that it has a valid wfl. We use wfl_op to locate errors related to the ++/-- operand. */ ! else if (!JNUMERIC_TYPE_P (op_type)) { parse_error_context (wfl_op, "Invalid argument type `%s' to `%s'", --- 16630,16643 ---- && TREE_OPERAND (decl, 1) && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF))) { TREE_TYPE (node) = error_mark_node; error_found = 1; } /* From now on, we know that op if a variable and that it has a valid wfl. We use wfl_op to locate errors related to the ++/-- operand. */ ! if (!JNUMERIC_TYPE_P (op_type)) { parse_error_context (wfl_op, "Invalid argument type `%s' to `%s'", *************** patch_cast (node, wfl_op) *** 16683,16692 **** tree wfl_op; { tree op = TREE_OPERAND (node, 0); - tree op_type = TREE_TYPE (op); tree cast_type = TREE_TYPE (node); char *t1; /* First resolve OP_TYPE if unresolved */ if (!(cast_type = resolve_type_during_patch (cast_type))) return error_mark_node; --- 16798,16812 ---- tree wfl_op; { tree op = TREE_OPERAND (node, 0); tree cast_type = TREE_TYPE (node); + tree patched, op_type; char *t1; + /* Some string patching might be necessary at this stage */ + if ((patched = patch_string (op))) + TREE_OPERAND (node, 0) = op = patched; + op_type = TREE_TYPE (op); + /* First resolve OP_TYPE if unresolved */ if (!(cast_type = resolve_type_during_patch (cast_type))) return error_mark_node; *************** patch_array_ref (node) *** 16834,16849 **** TREE_OPERAND (node, 1) = index; } else ! { ! /* The save_expr is for correct evaluation order. It would be cleaner ! to use force_evaluation_order (see comment there), but that is ! difficult when we also have to deal with bounds checking. */ ! if (TREE_SIDE_EFFECTS (index)) ! array = save_expr (array); ! node = build_java_arrayaccess (array, array_type, index); ! if (TREE_SIDE_EFFECTS (index)) ! node = build (COMPOUND_EXPR, array_type, array, node); ! } TREE_TYPE (node) = array_type; return node; } --- 16954,16960 ---- TREE_OPERAND (node, 1) = index; } else ! node = build_java_arrayaccess (array, array_type, index); TREE_TYPE (node) = array_type; return node; } *************** array_constructor_check_entry (type, ent *** 17090,17096 **** /* Check and report errors */ if (!new_value) { ! const char *msg = (!valid_cast_to_p (type_value, type) ? "Can't" : "Explicit cast needed to"); if (!array_type_string) array_type_string = xstrdup (lang_printable_name (type, 1)); --- 17201,17207 ---- /* Check and report errors */ if (!new_value) { ! const char *const msg = (!valid_cast_to_p (type_value, type) ? "Can't" : "Explicit cast needed to"); if (!array_type_string) array_type_string = xstrdup (lang_printable_name (type, 1)); *************** array_constructor_check_entry (type, ent *** 17101,17110 **** } if (new_value) ! { ! new_value = maybe_build_primttype_type_ref (new_value, wfl_value); ! TREE_VALUE (entry) = new_value; ! } if (array_type_string) free (array_type_string); --- 17212,17218 ---- } if (new_value) ! TREE_VALUE (entry) = new_value; if (array_type_string) free (array_type_string); *************** patch_return (node) *** 17164,17175 **** if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth))) error_found = 2; ! if (in_instance_initializer) error_found = 1; if (error_found) { ! if (in_instance_initializer) parse_error_context (wfl_operator, "`return' inside instance initializer"); --- 17272,17283 ---- if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth))) error_found = 2; ! if (DECL_INSTINIT_P (current_function_decl)) error_found = 1; if (error_found) { ! if (DECL_INSTINIT_P (current_function_decl)) parse_error_context (wfl_operator, "`return' inside instance initializer"); *************** patch_return (node) *** 17201,17218 **** tree exp = java_complete_tree (return_exp); tree modify, patched; - /* If the function returned value and EXP are booleans, EXP has - to be converted into the type of DECL_RESULT, which is integer - (see complete_start_java_method) */ - if (TREE_TYPE (exp) == boolean_type_node && - TREE_TYPE (TREE_TYPE (meth)) == boolean_type_node) - exp = convert_to_integer (TREE_TYPE (DECL_RESULT (meth)), exp); - - /* `null' can be assigned to a function returning a reference */ - if (JREFERENCE_TYPE_P (TREE_TYPE (TREE_TYPE (meth))) && - exp == null_pointer_node) - exp = build_null_of_type (TREE_TYPE (TREE_TYPE (meth))); - if ((patched = patch_string (exp))) exp = patched; --- 17309,17314 ---- *************** patch_if_else_statement (node) *** 17254,17259 **** --- 17350,17358 ---- tree node; { tree expression = TREE_OPERAND (node, 0); + int can_complete_normally + = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)) + | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2))); TREE_TYPE (node) = error_mark_node; EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node); *************** patch_if_else_statement (node) *** 17269,17279 **** return error_mark_node; } TREE_TYPE (node) = void_type_node; TREE_SIDE_EFFECTS (node) = 1; ! CAN_COMPLETE_NORMALLY (node) ! = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)) ! | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)); return node; } --- 17368,17389 ---- return error_mark_node; } + if (TREE_CODE (expression) == INTEGER_CST) + { + if (integer_zerop (expression)) + node = TREE_OPERAND (node, 2); + else + node = TREE_OPERAND (node, 1); + if (CAN_COMPLETE_NORMALLY (node) != can_complete_normally) + { + node = build (COMPOUND_EXPR, void_type_node, node, empty_stmt_node); + CAN_COMPLETE_NORMALLY (node) = can_complete_normally; + } + return node; + } TREE_TYPE (node) = void_type_node; TREE_SIDE_EFFECTS (node) = 1; ! CAN_COMPLETE_NORMALLY (node) = can_complete_normally; return node; } *************** build_new_loop (loop_body) *** 17353,17359 **** COMPOUND_EXPR (loop main body) EXIT_EXPR (this order is for while/for loops. LABELED_BLOCK_EXPR the order is reversed for do loops) ! LABEL_DECL (a continue occuring here branches at the BODY end of this labeled block) INCREMENT (if any) --- 17463,17469 ---- COMPOUND_EXPR (loop main body) EXIT_EXPR (this order is for while/for loops. LABELED_BLOCK_EXPR the order is reversed for do loops) ! LABEL_DECL (a continue occurring here branches at the BODY end of this labeled block) INCREMENT (if any) *************** patch_switch_statement (node) *** 17654,17659 **** --- 17764,17770 ---- tree node; { tree se = TREE_OPERAND (node, 0), se_type; + tree save, iter; /* Complete the switch expression */ se = TREE_OPERAND (node, 0) = java_complete_tree (se); *************** patch_switch_statement (node) *** 17671,17678 **** --- 17782,17824 ---- return error_mark_node; } + /* Save and restore the outer case label list. */ + save = case_label_list; + case_label_list = NULL_TREE; + TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); + /* See if we've found a duplicate label. We can't leave this until + code generation, because in `--syntax-only' and `-C' modes we + don't do ordinary code generation. */ + for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter)) + { + HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter)); + tree subiter; + for (subiter = TREE_CHAIN (iter); + subiter != NULL_TREE; + subiter = TREE_CHAIN (subiter)) + { + HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter)); + if (val == subval) + { + EXPR_WFL_LINECOL (wfl_operator) + = EXPR_WFL_LINECOL (TREE_PURPOSE (iter)); + /* The case_label_list is in reverse order, so print the + outer label first. */ + parse_error_context (wfl_operator, "duplicate case label: `" + HOST_WIDE_INT_PRINT_DEC "'", subval); + EXPR_WFL_LINECOL (wfl_operator) + = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter)); + parse_error_context (wfl_operator, "original label is here"); + + break; + } + } + } + + case_label_list = save; + /* Ready to return */ if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK) { *************** patch_switch_statement (node) *** 17689,17694 **** --- 17835,17873 ---- /* 14.18 The try/catch statements */ + /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause + catches TYPE and executes CATCH_STMTS. */ + + static tree + encapsulate_with_try_catch (location, type, try_stmts, catch_stmts) + int location; + tree type, try_stmts, catch_stmts; + { + tree try_block, catch_clause_param, catch_block, catch; + + /* First build a try block */ + try_block = build_expr_block (try_stmts, NULL_TREE); + + /* Build a catch block: we need a catch clause parameter */ + catch_clause_param = build_decl (VAR_DECL, + wpv_id, build_pointer_type (type)); + /* And a block */ + catch_block = build_expr_block (NULL_TREE, catch_clause_param); + + /* Initialize the variable and store in the block */ + catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param, + build (JAVA_EXC_OBJ_EXPR, ptr_type_node)); + add_stmt_to_block (catch_block, NULL_TREE, catch); + + /* Add the catch statements */ + add_stmt_to_block (catch_block, NULL_TREE, catch_stmts); + + /* Now we can build a CATCH_EXPR */ + catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block); + + return build_try_statement (location, try_block, catch_block); + } + static tree build_try_statement (location, try_block, catches) int location; *************** patch_synchronized_statement (node, wfl_ *** 17881,17893 **** CAN_COMPLETE_NORMALLY (exit) = 1; assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr); TREE_SIDE_EFFECTS (assignment) = 1; ! node = build1 (CLEANUP_POINT_EXPR, NULL_TREE, ! build (COMPOUND_EXPR, NULL_TREE, ! build (WITH_CLEANUP_EXPR, NULL_TREE, ! build (COMPOUND_EXPR, NULL_TREE, ! assignment, enter), ! NULL_TREE, exit), ! block)); node = build_expr_block (node, expr_decl); return java_complete_tree (node); --- 18060,18068 ---- CAN_COMPLETE_NORMALLY (exit) = 1; assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr); TREE_SIDE_EFFECTS (assignment) = 1; ! node = build (COMPOUND_EXPR, NULL_TREE, ! build (COMPOUND_EXPR, NULL_TREE, assignment, enter), ! build (TRY_FINALLY_EXPR, NULL_TREE, block, exit)); node = build_expr_block (node, expr_decl); return java_complete_tree (node); *************** patch_throw_statement (node, wfl_op1) *** 17923,17934 **** unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type)); SET_WFL_OPERATOR (wfl_operator, node, wfl_op1); ! /* An instance can't throw a checked excetion unless that exception ! is explicitely declared in the `throws' clause of each constructor. This doesn't apply to anonymous classes, since they don't have declared constructors. */ if (!unchecked_ok ! && in_instance_initializer && !ANONYMOUS_CLASS_P (current_class)) { tree current; for (current = TYPE_METHODS (current_class); current; --- 18098,18110 ---- unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type)); SET_WFL_OPERATOR (wfl_operator, node, wfl_op1); ! /* An instance can't throw a checked exception unless that exception ! is explicitly declared in the `throws' clause of each constructor. This doesn't apply to anonymous classes, since they don't have declared constructors. */ if (!unchecked_ok ! && DECL_INSTINIT_P (current_function_decl) ! && !ANONYMOUS_CLASS_P (current_class)) { tree current; for (current = TYPE_METHODS (current_class); current; *************** purge_unchecked_exceptions (mdecl) *** 18076,18081 **** --- 18252,18289 ---- DECL_FUNCTION_THROWS (mdecl) = new; } + /* This function goes over all of CLASS_TYPE ctors and checks whether + each of them features at least one unchecked exception in its + `throws' clause. If it's the case, it returns `true', `false' + otherwise. */ + + static bool + ctors_unchecked_throws_clause_p (class_type) + tree class_type; + { + tree current; + + for (current = TYPE_METHODS (class_type); current; + current = TREE_CHAIN (current)) + { + bool ctu = false; /* Ctor Throws Unchecked */ + if (DECL_CONSTRUCTOR_P (current)) + { + tree throws; + for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu; + throws = TREE_CHAIN (throws)) + if (inherits_from_p (TREE_VALUE (throws), exception_type_node)) + ctu = true; + } + /* We return false as we found one ctor that is unfit. */ + if (!ctu && DECL_CONSTRUCTOR_P (current)) + return false; + } + /* All ctors feature at least one unchecked exception in their + `throws' clause. */ + return true; + } + /* 15.24 Conditional Operator ?: */ static tree *************** fold_constant_for_init (node, context) *** 18302,18309 **** DECL_INITIAL (node) = NULL_TREE; val = fold_constant_for_init (val, node); DECL_INITIAL (node) = val; - if (!val && CLASS_FINAL_VARIABLE_P (node)) - DECL_FIELD_FINAL_IUD (node) = 0; return val; case EXPR_WITH_FILE_LOCATION: --- 18510,18515 ---- *************** fold_constant_for_init (node, context) *** 18325,18332 **** --- 18531,18544 ---- } else { + /* Install the proper context for the field resolution. + The prior context is restored once the name is + properly qualified. */ + tree saved_current_class = current_class; /* Wait until the USE_COMPONENT_REF re-write. FIXME. */ + current_class = DECL_CONTEXT (context); qualify_ambiguous_name (node); + current_class = saved_current_class; if (resolve_field_access (node, &decl, NULL) && decl != NULL_TREE) return fold_constant_for_init (decl, decl); *************** init_src_parse () *** 18412,18415 **** --- 18624,18708 ---- { /* Register roots with the garbage collector. */ ggc_add_tree_root (src_parse_roots, sizeof (src_parse_roots) / sizeof(tree)); + + /* Sanity check; we've been bit by this before. */ + if (sizeof (ctxp->modifier_ctx) / sizeof (tree) != + MODIFIER_TK - PUBLIC_TK) + abort (); + } + + + + /* This section deals with the functions that are called when tables + recording class initialization information are traversed. */ + + /* Attach to PTR (a block) the declaration found in ENTRY. */ + + static bool + attach_init_test_initialization_flags (entry, ptr) + struct hash_entry *entry; + PTR ptr; + { + tree block = (tree)ptr; + struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry; + + TREE_CHAIN (ite->init_test_decl) = BLOCK_EXPR_DECLS (block); + BLOCK_EXPR_DECLS (block) = ite->init_test_decl; + return true; + } + + /* This function is called for each classes that is known definitely + assigned when a given static method was called. This function + augments a compound expression (INFO) storing all assignment to + initialized static class flags if a flag already existed, otherwise + a new one is created. */ + + static bool + emit_test_initialization (entry, info) + struct hash_entry *entry; + PTR info; + { + tree l = (tree) info; + tree decl, init; + + struct init_test_hash_entry *ite = (struct init_test_hash_entry *) + hash_lookup (&DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), + entry->key, + current_function_decl != TREE_PURPOSE (l), NULL); + + /* If we haven't found a flag and we're dealing with self registered + with current_function_decl, then don't do anything. Self is + always added as definitely initialized but this information is + valid only if used outside the current function. */ + if (! ite) + return true; + + /* If we don't have a variable, create one and install it. */ + if (! ite->init_test_decl) + { + tree block; + + decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node); + MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); + LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1; + DECL_CONTEXT (decl) = current_function_decl; + DECL_INITIAL (decl) = boolean_true_node; + + /* The trick is to find the right context for it. */ + block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl)); + TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block); + BLOCK_EXPR_DECLS (block) = decl; + ite->init_test_decl = decl; + } + else + decl = ite->init_test_decl; + + /* Now simply augment the compound that holds all the assignments + pertaining to this method invocation. */ + init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node); + TREE_SIDE_EFFECTS (init) = 1; + TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init); + TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1; + + return true; } diff -Nrc3pad gcc-3.0.4/gcc/java/parse.h gcc-3.1/gcc/java/parse.h *** gcc-3.0.4/gcc/java/parse.h Sun May 13 07:10:22 2001 --- gcc-3.1/gcc/java/parse.h Wed Apr 17 08:24:44 2002 *************** *** 1,5 **** /* Language parser definitions for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. --- 1,5 ---- /* Language parser definitions for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. *************** Java and all Java-based marks are tradem *** 23,30 **** of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ ! #ifndef JV_LANG_H ! #define JV_LANG_H #include "lex.h" --- 23,30 ---- of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ ! #ifndef GCC_JAVA_PARSE_H ! #define GCC_JAVA_PARSE_H #include "lex.h" *************** extern tree stabilize_reference PARAMS ( *** 73,85 **** #define YYNOT_TWICE if (ctxp->prevent_ese != lineno) /* Accepted modifiers */ ! #define CLASS_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT|ACC_FINAL #define FIELD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_FINAL| \ ACC_STATIC|ACC_TRANSIENT|ACC_VOLATILE #define METHOD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_ABSTRACT| \ ! ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE ! #define INTERFACE_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT ! #define INTERFACE_INNER_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_ABSTRACT|ACC_STATIC #define INTERFACE_METHOD_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT #define INTERFACE_FIELD_MODIFIERS ACC_PUBLIC|ACC_STATIC|ACC_FINAL --- 73,87 ---- #define YYNOT_TWICE if (ctxp->prevent_ese != lineno) /* Accepted modifiers */ ! #define CLASS_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT|ACC_FINAL|ACC_STRICT #define FIELD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_FINAL| \ ACC_STATIC|ACC_TRANSIENT|ACC_VOLATILE #define METHOD_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_PRIVATE|ACC_ABSTRACT| \ ! ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE| \ ! ACC_STRICT ! #define INTERFACE_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT|ACC_STRICT ! #define INTERFACE_INNER_MODIFIERS ACC_PUBLIC|ACC_PROTECTED|ACC_ABSTRACT| \ ! ACC_STATIC|ACC_PRIVATE #define INTERFACE_METHOD_MODIFIERS ACC_PUBLIC|ACC_ABSTRACT #define INTERFACE_FIELD_MODIFIERS ACC_PUBLIC|ACC_STATIC|ACC_FINAL *************** extern tree stabilize_reference PARAMS ( *** 235,241 **** } /* Build the string parm$ and store in into the identifier N. This ! is used to contruct the name of hidden parameters used to initialize outer scope aliases. */ #define MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID(N, O) \ { \ --- 237,243 ---- } /* Build the string parm$ and store in into the identifier N. This ! is used to construct the name of hidden parameters used to initialize outer scope aliases. */ #define MANGLE_ALIAS_INITIALIZER_PARAMETER_NAME_ID(N, O) \ { \ *************** typedef struct _jdeplist { *** 562,585 **** } \ } ! #define WFL_STRIP_BRACKET(TARGET, TYPE) \ ! { \ ! tree __type = (TYPE); \ ! if (TYPE && TREE_CODE (TYPE) == EXPR_WITH_FILE_LOCATION) \ ! { \ ! tree _node = EXPR_WFL_NODE (TYPE); \ ! const char *_ptr = IDENTIFIER_POINTER (_node); \ ! const char *_ref = _ptr; \ ! while (_ptr[0] == '[') \ ! _ptr++; \ ! if (_ref != _ptr) \ ! { \ ! tree _new = copy_node (TYPE); \ ! EXPR_WFL_NODE (_new) = get_identifier (_ptr); \ ! __type = _new; \ ! } \ ! } \ ! (TARGET) = __type; \ } /* Promote a type if it won't be registered as a patch */ --- 564,597 ---- } \ } ! #define WFL_STRIP_BRACKET(TARGET, TYPE) \ ! { \ ! tree __type = (TYPE); \ ! if (TYPE && TREE_CODE (TYPE) == EXPR_WITH_FILE_LOCATION) \ ! { \ ! tree _node; \ ! if (build_type_name_from_array_name (EXPR_WFL_NODE (TYPE), &_node)) \ ! { \ ! tree _new = copy_node (TYPE); \ ! EXPR_WFL_NODE (_new) = _node; \ ! __type = _new; \ ! } \ ! } \ ! (TARGET) = __type; \ ! } ! ! /* If NAME contains one or more trailing []s, NAMELEN will be the ! adjusted to be the index of the last non bracket character in ! NAME. ARRAY_DIMS will contain the number of []s found. */ ! ! #define STRING_STRIP_BRACKETS(NAME, NAMELEN, ARRAY_DIMS) \ ! { \ ! ARRAY_DIMS = 0; \ ! while (NAMELEN >= 2 && (NAME)[NAMELEN - 1] == ']') \ ! { \ ! NAMELEN -= 2; \ ! (ARRAY_DIMS)++; \ ! } \ } /* Promote a type if it won't be registered as a patch */ *************** typedef struct _jdeplist { *** 704,711 **** #define REGISTER_IMPORT(WHOLE, NAME) \ { \ IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P ((NAME)) = 1; \ ! ctxp->import_list = chainon (ctxp->import_list, \ ! build_tree_list ((WHOLE), (NAME))); \ } /* Macro to access the osb (opening square bracket) count */ --- 716,722 ---- #define REGISTER_IMPORT(WHOLE, NAME) \ { \ IS_A_SINGLE_IMPORT_CLASSFILE_NAME_P ((NAME)) = 1; \ ! ctxp->import_list = tree_cons ((WHOLE), (NAME), ctxp->import_list); \ } /* Macro to access the osb (opening square bracket) count */ *************** struct parser_ctxt { *** 743,750 **** /* Indicates that a context already contains saved data and that the next save operation will require a new context to be created. */ unsigned saved_data:1; - /* Integral literal overflow */ - unsigned minus_seen:1; /* Report error when true */ unsigned java_error_flag:1; /* @deprecated tag seen */ --- 754,759 ---- *************** struct parser_ctxt { *** 754,760 **** /* This section is defined only if we compile jc1 */ #ifndef JC1_LITE ! tree modifier_ctx [11]; /* WFL of modifiers */ tree class_type; /* Current class */ tree function_decl; /* Current function decl, save/restore */ --- 763,769 ---- /* This section is defined only if we compile jc1 */ #ifndef JC1_LITE ! tree modifier_ctx [12]; /* WFL of modifiers */ tree class_type; /* Current class */ tree function_decl; /* Current function decl, save/restore */ *************** struct parser_ctxt { *** 776,782 **** tree non_static_initialized; /* List of non static initialized fields */ tree static_initialized; /* List of static non final initialized */ ! tree instance_initializers; /* List of instancei initializers stmts */ tree import_list; /* List of import */ tree import_demand_list; /* List of import on demand */ --- 785,791 ---- tree non_static_initialized; /* List of non static initialized fields */ tree static_initialized; /* List of static non final initialized */ ! tree instance_initializers; /* List of instance initializers stmts */ tree import_list; /* List of import */ tree import_demand_list; /* List of import on demand */ *************** struct parser_ctxt { *** 845,852 **** (TREE_TYPE (DECL_CONTEXT \ (TYPE_NAME (TREE_TYPE (TREE_TYPE (current_this))))),\ TREE_TYPE (DECL_CONTEXT (TYPE_NAME (T))))) \ ! /* We don't have a this. */ \ ! || !current_this)) /* Push macro. First argument to PUSH_CPC is a DECL_TYPE, second argument is the unqualified currently parsed class name. */ --- 854,864 ---- (TREE_TYPE (DECL_CONTEXT \ (TYPE_NAME (TREE_TYPE (TREE_TYPE (current_this))))),\ TREE_TYPE (DECL_CONTEXT (TYPE_NAME (T))))) \ ! /* We don't have a this, which is OK if the current function is \ ! static. */ \ ! || (!current_this \ ! && current_function_decl \ ! && ! METHOD_STATIC (current_function_decl)))) /* Push macro. First argument to PUSH_CPC is a DECL_TYPE, second argument is the unqualified currently parsed class name. */ *************** struct parser_ctxt { *** 902,907 **** --- 914,924 ---- if (CPC_INSTANCE_INITIALIZER_LIST(C)) \ TREE_PURPOSE (CPC_INSTANCE_INITIALIZER_LIST (C)) = (S); + /* This is used by the lexer to communicate with the parser. It is + set on an integer constant if the radix is 10, so that the parser + can correctly diagnose a numeric overflow. */ + #define JAVA_RADIX10_FLAG(NODE) TREE_LANG_FLAG_0(NODE) + #ifndef JC1_LITE void java_complete_class PARAMS ((void)); void java_check_circular_reference PARAMS ((void)); *************** void java_fix_constructors PARAMS ((void *** 909,915 **** void java_layout_classes PARAMS ((void)); void java_reorder_fields PARAMS ((void)); tree java_method_add_stmt PARAMS ((tree, tree)); - void java_expand_switch PARAMS ((tree)); int java_report_errors PARAMS ((void)); extern tree do_resolve_class PARAMS ((tree, tree, tree, tree)); #endif --- 926,931 ---- *************** ATTRIBUTE_NORETURN *** 932,936 **** extern void java_expand_classes PARAMS ((void)); extern struct parser_ctxt *ctxp; ! struct parser_ctxt *ctxp_for_generation; ! #endif --- 948,953 ---- extern void java_expand_classes PARAMS ((void)); extern struct parser_ctxt *ctxp; ! extern struct parser_ctxt *ctxp_for_generation; ! ! #endif /* ! GCC_JAVA_PARSE_H */ diff -Nrc3pad gcc-3.0.4/gcc/java/parse.y gcc-3.1/gcc/java/parse.y *** gcc-3.0.4/gcc/java/parse.y Sun Jun 10 18:42:07 2001 --- gcc-3.1/gcc/java/parse.y Thu Apr 25 01:08:29 2002 *************** *** 1,6 **** /* Source code parsing and tree node generation for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. --- 1,6 ---- /* Source code parsing and tree node generation for the GNU compiler for the Java(TM) language. ! Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is part of GNU CC. *************** static tree parse_jdk1_1_error PARAMS (( *** 99,119 **** static void complete_class_report_errors PARAMS ((jdep *)); static int process_imports PARAMS ((void)); static void read_import_dir PARAMS ((tree)); ! static int find_in_imports_on_demand PARAMS ((tree)); ! static void find_in_imports PARAMS ((tree)); ! static void check_static_final_variable_assignment_flag PARAMS ((tree)); ! static void reset_static_final_variable_assignment_flag PARAMS ((tree)); ! static void check_final_variable_local_assignment_flag PARAMS ((tree, tree)); ! static void reset_final_variable_local_assignment_flag PARAMS ((tree)); ! static int check_final_variable_indirect_assignment PARAMS ((tree)); ! static void check_final_variable_global_assignment_flag PARAMS ((tree)); static void check_inner_class_access PARAMS ((tree, tree, tree)); ! static int check_pkg_class_access PARAMS ((tree, tree)); static void register_package PARAMS ((tree)); ! static tree resolve_package PARAMS ((tree, tree *)); ! static tree lookup_package_type PARAMS ((const char *, int)); static tree resolve_class PARAMS ((tree, tree, tree, tree)); static void declare_local_variables PARAMS ((int, tree, tree)); static void source_start_java_method PARAMS ((tree)); static void source_end_java_method PARAMS ((void)); static tree find_name_in_single_imports PARAMS ((tree)); --- 99,113 ---- static void complete_class_report_errors PARAMS ((jdep *)); static int process_imports PARAMS ((void)); static void read_import_dir PARAMS ((tree)); ! static int find_in_imports_on_demand PARAMS ((tree, tree)); ! static void find_in_imports PARAMS ((tree, tree)); static void check_inner_class_access PARAMS ((tree, tree, tree)); ! static int check_pkg_class_access PARAMS ((tree, tree, bool)); static void register_package PARAMS ((tree)); ! static tree resolve_package PARAMS ((tree, tree *, tree *)); static tree resolve_class PARAMS ((tree, tree, tree, tree)); static void declare_local_variables PARAMS ((int, tree, tree)); + static void dump_java_tree PARAMS ((enum tree_dump_index, tree)); static void source_start_java_method PARAMS ((tree)); static void source_end_java_method PARAMS ((void)); static tree find_name_in_single_imports PARAMS ((tree)); *************** static tree patch_invoke PARAMS ((tree, *** 141,153 **** static int maybe_use_access_method PARAMS ((int, tree *, tree *)); static tree lookup_method_invoke PARAMS ((int, tree, tree, tree, tree)); static tree register_incomplete_type PARAMS ((int, tree, tree, tree)); static tree obtain_incomplete_type PARAMS ((tree)); static tree java_complete_lhs PARAMS ((tree)); static tree java_complete_tree PARAMS ((tree)); static tree maybe_generate_pre_expand_clinit PARAMS ((tree)); ! static int analyze_clinit_body PARAMS ((tree)); static int maybe_yank_clinit PARAMS ((tree)); static void java_complete_expand_method PARAMS ((tree)); static int unresolved_type_p PARAMS ((tree, tree *)); static void create_jdep_list PARAMS ((struct parser_ctxt *)); static tree build_expr_block PARAMS ((tree, tree)); --- 135,151 ---- static int maybe_use_access_method PARAMS ((int, tree *, tree *)); static tree lookup_method_invoke PARAMS ((int, tree, tree, tree, tree)); static tree register_incomplete_type PARAMS ((int, tree, tree, tree)); + static tree check_inner_circular_reference PARAMS ((tree, tree)); + static tree check_circular_reference PARAMS ((tree)); static tree obtain_incomplete_type PARAMS ((tree)); static tree java_complete_lhs PARAMS ((tree)); static tree java_complete_tree PARAMS ((tree)); static tree maybe_generate_pre_expand_clinit PARAMS ((tree)); ! static int analyze_clinit_body PARAMS ((tree, tree)); static int maybe_yank_clinit PARAMS ((tree)); + static void start_complete_expand_method PARAMS ((tree)); static void java_complete_expand_method PARAMS ((tree)); + static void java_expand_method_bodies PARAMS ((tree)); static int unresolved_type_p PARAMS ((tree, tree *)); static void create_jdep_list PARAMS ((struct parser_ctxt *)); static tree build_expr_block PARAMS ((tree, tree)); *************** static tree build_method_invocation PARA *** 159,166 **** static tree build_new_invocation PARAMS ((tree, tree)); static tree build_assignment PARAMS ((int, int, tree, tree)); static tree build_binop PARAMS ((enum tree_code, int, tree, tree)); ! static int check_final_assignment PARAMS ((tree ,tree)); ! static tree patch_assignment PARAMS ((tree, tree, tree )); static tree patch_binop PARAMS ((tree, tree, tree)); static tree build_unaryop PARAMS ((int, int, tree)); static tree build_incdec PARAMS ((int, int, tree, int)); --- 157,163 ---- static tree build_new_invocation PARAMS ((tree, tree)); static tree build_assignment PARAMS ((int, int, tree, tree)); static tree build_binop PARAMS ((enum tree_code, int, tree, tree)); ! static tree patch_assignment PARAMS ((tree, tree)); static tree patch_binop PARAMS ((tree, tree, tree)); static tree build_unaryop PARAMS ((int, int, tree)); static tree build_incdec PARAMS ((int, int, tree, int)); *************** static int valid_method_invocation_conve *** 175,180 **** --- 172,178 ---- static tree try_builtin_assignconv PARAMS ((tree, tree, tree)); static tree try_reference_assignconv PARAMS ((tree, tree)); static tree build_unresolved_array_type PARAMS ((tree)); + static int build_type_name_from_array_name PARAMS ((tree, tree *)); static tree build_array_from_name PARAMS ((tree, tree, tree, tree *)); static tree build_array_ref PARAMS ((int, tree, tree)); static tree patch_array_ref PARAMS ((tree)); *************** static tree string_constant_concatenatio *** 219,224 **** --- 217,223 ---- static tree build_string_concatenation PARAMS ((tree, tree)); static tree patch_string_cst PARAMS ((tree)); static tree patch_string PARAMS ((tree)); + static tree encapsulate_with_try_catch PARAMS ((int, tree, tree, tree)); static tree build_try_statement PARAMS ((int, tree, tree)); static tree build_try_finally_statement PARAMS ((int, tree, tree)); static tree patch_try_statement PARAMS ((tree)); *************** static tree patch_throw_statement PARAMS *** 227,232 **** --- 226,232 ---- static void check_thrown_exceptions PARAMS ((int, tree)); static int check_thrown_exceptions_do PARAMS ((tree)); static void purge_unchecked_exceptions PARAMS ((tree)); + static bool ctors_unchecked_throws_clause_p PARAMS ((tree)); static void check_throws_clauses PARAMS ((tree, tree, tree)); static void finish_method_declaration PARAMS ((tree)); static tree build_super_invocation PARAMS ((tree)); *************** static tree build_this_super_qualified_i *** 237,248 **** static const char *get_printable_method_name PARAMS ((tree)); static tree patch_conditional_expr PARAMS ((tree, tree, tree)); static tree generate_finit PARAMS ((tree)); ! static void add_instance_initializer PARAMS ((tree)); ! static tree build_instance_initializer PARAMS ((tree)); static void fix_constructors PARAMS ((tree)); static tree build_alias_initializer_parameter_list PARAMS ((int, tree, tree, int *)); ! static void craft_constructor PARAMS ((tree, tree)); static int verify_constructor_super PARAMS ((tree)); static tree create_artificial_method PARAMS ((tree, int, tree, tree, tree)); static void start_artificial_method_body PARAMS ((tree)); --- 237,248 ---- static const char *get_printable_method_name PARAMS ((tree)); static tree patch_conditional_expr PARAMS ((tree, tree, tree)); static tree generate_finit PARAMS ((tree)); ! static tree generate_instinit PARAMS ((tree)); ! static tree build_instinit_invocation PARAMS ((tree)); static void fix_constructors PARAMS ((tree)); static tree build_alias_initializer_parameter_list PARAMS ((int, tree, tree, int *)); ! static tree craft_constructor PARAMS ((tree, tree)); static int verify_constructor_super PARAMS ((tree)); static tree create_artificial_method PARAMS ((tree, int, tree, tree, tree)); static void start_artificial_method_body PARAMS ((tree)); *************** static int check_method_redefinition PAR *** 251,257 **** static int check_method_types_complete PARAMS ((tree)); static void java_check_regular_methods PARAMS ((tree)); static void java_check_abstract_methods PARAMS ((tree)); - static tree maybe_build_primttype_type_ref PARAMS ((tree, tree)); static void unreachable_stmt_error PARAMS ((tree)); static tree find_expr_with_wfl PARAMS ((tree)); static void missing_return_error PARAMS ((tree)); --- 251,256 ---- *************** static tree maybe_make_nested_class_name *** 298,303 **** --- 297,304 ---- static void make_nested_class_name PARAMS ((tree)); static void set_nested_class_simple_name_value PARAMS ((tree, int)); static void link_nested_class_to_enclosing PARAMS ((void)); + static tree resolve_inner_class PARAMS ((struct hash_table *, tree, tree *, + tree *, tree)); static tree find_as_inner_class PARAMS ((tree, tree, tree)); static tree find_as_inner_class_do PARAMS ((tree, tree)); static int check_inner_class_redefinition PARAMS ((tree, tree)); *************** static void create_new_parser_context PA *** 332,337 **** --- 333,342 ---- static void mark_parser_ctxt PARAMS ((void *)); static tree maybe_build_class_init_for_field PARAMS ((tree, tree)); + static bool attach_init_test_initialization_flags PARAMS ((struct hash_entry *, + PTR)); + static bool emit_test_initialization PARAMS ((struct hash_entry *, PTR)); + /* Number of error found so far. */ int java_error_count; /* Number of warning found so far. */ *************** int do_not_fold; *** 341,349 **** /* Cyclic inheritance report, as it can be set by layout_class */ const char *cyclic_inheritance_report; - /* Tell when we're within an instance initializer */ - static int in_instance_initializer; - /* The current parser context */ struct parser_ctxt *ctxp; --- 346,351 ---- *************** struct parser_ctxt *ctxp_for_generation *** 355,361 **** covers both integral/floating point division. The code is changed once the type of both operator is worked out. */ ! static enum tree_code binop_lookup[19] = { PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR, LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR, --- 357,363 ---- covers both integral/floating point division. The code is changed once the type of both operator is worked out. */ ! static const enum tree_code binop_lookup[19] = { PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, TRUNC_MOD_EXPR, LSHIFT_EXPR, RSHIFT_EXPR, URSHIFT_EXPR, *************** static tree wpv_id; *** 404,417 **** /* The list of all packages we've seen so far */ static tree package_list = NULL_TREE; ! /* Hold THIS for the scope of the current public method decl. */ static tree current_this; /* Hold a list of catch clauses list. The first element of this list is the list of the catch clauses of the currently analysed try block. */ static tree currently_caught_type_list; ! static tree src_parse_roots[1] = { NULL_TREE }; /* All classes seen from source code */ #define gclass_list src_parse_roots[0] --- 406,426 ---- /* The list of all packages we've seen so far */ static tree package_list = NULL_TREE; ! /* Hold THIS for the scope of the current method decl. */ static tree current_this; /* Hold a list of catch clauses list. The first element of this list is the list of the catch clauses of the currently analysed try block. */ static tree currently_caught_type_list; ! /* This holds a linked list of all the case labels for the current ! switch statement. It is only used when checking to see if there ! are duplicate labels. FIXME: probably this should just be attached ! to the switch itself; then it could be referenced via ! `ctxp->current_loop'. */ ! static tree case_label_list; ! ! static tree src_parse_roots[1]; /* All classes seen from source code */ #define gclass_list src_parse_roots[0] *************** static tree src_parse_roots[1] = { NULL_ *** 472,479 **** %token PUBLIC_TK PRIVATE_TK PROTECTED_TK %token STATIC_TK FINAL_TK SYNCHRONIZED_TK %token VOLATILE_TK TRANSIENT_TK NATIVE_TK ! %token PAD_TK ABSTRACT_TK MODIFIER_TK ! %token STRICT_TK /* Keep those two in order, too */ %token DECR_TK INCR_TK --- 481,488 ---- %token PUBLIC_TK PRIVATE_TK PROTECTED_TK %token STATIC_TK FINAL_TK SYNCHRONIZED_TK %token VOLATILE_TK TRANSIENT_TK NATIVE_TK ! %token PAD_TK ABSTRACT_TK STRICT_TK ! %token MODIFIER_TK /* Keep those two in order, too */ %token DECR_TK INCR_TK *************** static tree src_parse_roots[1] = { NULL_ *** 559,565 **** switch_statement synchronized_statement throw_statement try_statement switch_expression switch_block catches catch_clause catch_clause_parameter finally ! anonymous_class_creation %type return_statement break_statement continue_statement %type ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK --- 568,574 ---- switch_statement synchronized_statement throw_statement try_statement switch_expression switch_block catches catch_clause catch_clause_parameter finally ! anonymous_class_creation trap_overflow_corner_case %type return_statement break_statement continue_statement %type ASSIGN_TK MULT_ASSIGN_TK DIV_ASSIGN_TK *************** goal: *** 611,616 **** --- 620,626 ---- ggc_add_tree_root (&package_list, 1); ggc_add_tree_root (¤t_this, 1); ggc_add_tree_root (¤tly_caught_type_list, 1); + ggc_add_tree_root (&case_label_list, 1); ggc_add_root (&ctxp, 1, sizeof (struct parser_ctxt *), mark_parser_ctxt); *************** type_import_on_demand_declaration: *** 781,788 **** IMPORT_TK name DOT_TK MULT_TK SC_TK { tree name = EXPR_WFL_NODE ($2); ! /* Don't import java.lang.* twice. */ ! if (name != java_lang_id) { read_import_dir ($2); ctxp->import_demand_list = --- 791,804 ---- IMPORT_TK name DOT_TK MULT_TK SC_TK { tree name = EXPR_WFL_NODE ($2); ! tree it; ! /* Search for duplicates. */ ! for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it)) ! if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name) ! break; ! /* Don't import the same thing more than once, just ignore ! duplicates (7.5.2) */ ! if (! it) { read_import_dir ($2); ctxp->import_demand_list = *************** class_body_declaration: *** 918,925 **** | constructor_declaration | block /* Added, JDK1.1, instance initializer */ { ! TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp); ! SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1); } ; --- 934,944 ---- | constructor_declaration | block /* Added, JDK1.1, instance initializer */ { ! if ($1 != empty_stmt_node) ! { ! TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp); ! SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1); ! } } ; *************** abstract_method_declaration: *** 1328,1333 **** --- 1347,1354 ---- array_initializer: OCB_TK CCB_TK { $$ = build_new_array_init ($1.location, NULL_TREE); } + | OCB_TK C_TK CCB_TK + { $$ = build_new_array_init ($1.location, NULL_TREE); } | OCB_TK variable_initializers CCB_TK { $$ = build_new_array_init ($1.location, $2); } | OCB_TK variable_initializers C_TK CCB_TK *************** statement_without_trailing_substatement: *** 1444,1450 **** empty_statement: SC_TK { ! if (flag_extraneous_semicolon) { EXPR_WFL_SET_LINECOL (wfl_operator, lineno, -1); parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used"); --- 1465,1477 ---- empty_statement: SC_TK { ! if (flag_extraneous_semicolon ! && ! current_static_block ! && (! current_function_decl || ! /* Verify we're not in a inner class declaration */ ! (GET_CPC () != TYPE_NAME ! (DECL_CONTEXT (current_function_decl))))) ! { EXPR_WFL_SET_LINECOL (wfl_operator, lineno, -1); parse_warning_context (wfl_operator, "An empty declaration is a deprecated feature that should not be used"); *************** switch_statement: *** 1571,1577 **** switch_block { /* Make into "proper list" of COMPOUND_EXPRs. ! I.e. make the last statment also have its own COMPOUND_EXPR. */ maybe_absorb_scoping_blocks (); TREE_OPERAND ($1, 1) = exit_block (); --- 1598,1604 ---- switch_block { /* Make into "proper list" of COMPOUND_EXPRs. ! I.e. make the last statement also have its own COMPOUND_EXPR. */ maybe_absorb_scoping_blocks (); TREE_OPERAND ($1, 1) = exit_block (); *************** type_literals: *** 1958,1964 **** | VOID_TK DOT_TK CLASS_TK { $$ = build_incomplete_class_ref ($2.location, ! void_type_node); } ; --- 1985,1991 ---- | VOID_TK DOT_TK CLASS_TK { $$ = build_incomplete_class_ref ($2.location, ! void_type_node); } ; *************** array_creation_expression: *** 2093,2099 **** char *sig; int osb = pop_current_osb (ctxp); while (osb--) ! obstack_1grow (&temporary_obstack, '['); sig = obstack_finish (&temporary_obstack); $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE, $2, get_identifier (sig), $4); --- 2120,2127 ---- char *sig; int osb = pop_current_osb (ctxp); while (osb--) ! obstack_grow (&temporary_obstack, "[]", 2); ! obstack_1grow (&temporary_obstack, '\0'); sig = obstack_finish (&temporary_obstack); $$ = build (NEW_ANONYMOUS_ARRAY_EXPR, NULL_TREE, $2, get_identifier (sig), $4); *************** post_decrement_expression: *** 2280,2295 **** { $$ = build_incdec ($2.token, $2.location, $1, 1); } ; ! unary_expression: pre_increment_expression | pre_decrement_expression | PLUS_TK unary_expression {$$ = build_unaryop ($1.token, $1.location, $2); } - | MINUS_TK unary_expression - {$$ = build_unaryop ($1.token, $1.location, $2); } | unary_expression_not_plus_minus | PLUS_TK error {yyerror ("Missing term"); RECOVER} | MINUS_TK error {yyerror ("Missing term"); RECOVER} ; --- 2308,2331 ---- { $$ = build_incdec ($2.token, $2.location, $1, 1); } ; ! trap_overflow_corner_case: pre_increment_expression | pre_decrement_expression | PLUS_TK unary_expression {$$ = build_unaryop ($1.token, $1.location, $2); } | unary_expression_not_plus_minus | PLUS_TK error {yyerror ("Missing term"); RECOVER} + ; + + unary_expression: + trap_overflow_corner_case + { + error_if_numeric_overflow ($1); + $$ = $1; + } + | MINUS_TK trap_overflow_corner_case + {$$ = build_unaryop ($1.token, $1.location, $2); } | MINUS_TK error {yyerror ("Missing term"); RECOVER} ; *************** cast_expression: /* Error handling here *** 2338,2348 **** { const char *ptr; int osb = pop_current_osb (ctxp); while (osb--) ! obstack_1grow (&temporary_obstack, '['); ! obstack_grow0 (&temporary_obstack, ! IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)), ! IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2))); ptr = obstack_finish (&temporary_obstack); EXPR_WFL_NODE ($2) = get_identifier (ptr); $$ = build_cast ($1.location, $2, $5); --- 2374,2385 ---- { const char *ptr; int osb = pop_current_osb (ctxp); + obstack_grow (&temporary_obstack, + IDENTIFIER_POINTER (EXPR_WFL_NODE ($2)), + IDENTIFIER_LENGTH (EXPR_WFL_NODE ($2))); while (osb--) ! obstack_grow (&temporary_obstack, "[]", 2); ! obstack_1grow (&temporary_obstack, '\0'); ptr = obstack_finish (&temporary_obstack); EXPR_WFL_NODE ($2) = get_identifier (ptr); $$ = build_cast ($1.location, $2, $5); *************** static void *** 2746,2752 **** java_parser_context_suspend () { /* This makes debugging through java_debug_context easier */ ! static const char *name = ""; /* Duplicate the previous context, use it to save the globals we're interested in */ --- 2783,2789 ---- java_parser_context_suspend () { /* This makes debugging through java_debug_context easier */ ! static const char *const name = ""; /* Duplicate the previous context, use it to save the globals we're interested in */ *************** java_parser_context_resume () *** 2787,2794 **** ctxp = restored; /* Re-installed the data for the parsing to carry on */ ! bcopy (&old->marker_begining, &ctxp->marker_begining, ! (size_t)(&ctxp->marker_end - &ctxp->marker_begining)); /* Buffer context can now be discarded */ free (saver); --- 2824,2831 ---- ctxp = restored; /* Re-installed the data for the parsing to carry on */ ! memcpy (&ctxp->marker_begining, &old->marker_begining, ! (size_t)(&ctxp->marker_end - &ctxp->marker_begining)); /* Buffer context can now be discarded */ free (saver); *************** issue_warning_error_from_context (cl, ms *** 3057,3075 **** void parse_error_context VPARAMS ((tree cl, const char *msg, ...)) { ! #ifndef ANSI_PROTOTYPES ! tree cl; ! const char *msg; ! #endif ! va_list ap; ! ! VA_START (ap, msg); ! #ifndef ANSI_PROTOTYPES ! cl = va_arg (ap, tree); ! msg = va_arg (ap, const char *); ! #endif issue_warning_error_from_context (cl, msg, ap); ! va_end (ap); } /* Issue a warning at a current source line CL */ --- 3094,3104 ---- void parse_error_context VPARAMS ((tree cl, const char *msg, ...)) { ! VA_OPEN (ap, msg); ! VA_FIXEDARG (ap, tree, cl); ! VA_FIXEDARG (ap, const char *, msg); issue_warning_error_from_context (cl, msg, ap); ! VA_CLOSE (ap); } /* Issue a warning at a current source line CL */ *************** parse_error_context VPARAMS ((tree cl, c *** 3077,3098 **** static void parse_warning_context VPARAMS ((tree cl, const char *msg, ...)) { ! #ifndef ANSI_PROTOTYPES ! tree cl; ! const char *msg; ! #endif ! va_list ap; ! ! VA_START (ap, msg); ! #ifndef ANSI_PROTOTYPES ! cl = va_arg (ap, tree); ! msg = va_arg (ap, const char *); ! #endif force_error = do_warning = 1; issue_warning_error_from_context (cl, msg, ap); do_warning = force_error = 0; ! va_end (ap); } static tree --- 3106,3119 ---- static void parse_warning_context VPARAMS ((tree cl, const char *msg, ...)) { ! VA_OPEN (ap, msg); ! VA_FIXEDARG (ap, tree, cl); ! VA_FIXEDARG (ap, const char *, msg); force_error = do_warning = 1; issue_warning_error_from_context (cl, msg, ap); do_warning = force_error = 0; ! VA_CLOSE (ap); } static tree *************** variable_redefinition_error (context, na *** 3242,3266 **** type_name, IDENTIFIER_POINTER (name), line); } static tree build_array_from_name (type, type_wfl, name, ret_name) tree type, type_wfl, name, *ret_name; { int more_dims = 0; - const char *string; /* Eventually get more dims */ ! string = IDENTIFIER_POINTER (name); ! while (string [more_dims] == '[') ! more_dims++; /* If we have, then craft a new type for this variable */ if (more_dims) { tree save = type; - name = get_identifier (&string [more_dims]); - /* If we have a pointer, use its type */ if (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); --- 3263,3304 ---- type_name, IDENTIFIER_POINTER (name), line); } + /* If ANAME is terminated with `[]', it indicates an array. This + function returns the number of `[]' found and if this number is + greater than zero, it extracts the array type name and places it in + the node pointed to by TRIMMED unless TRIMMED is null. */ + + static int + build_type_name_from_array_name (aname, trimmed) + tree aname; + tree *trimmed; + { + const char *name = IDENTIFIER_POINTER (aname); + int len = IDENTIFIER_LENGTH (aname); + int array_dims; + + STRING_STRIP_BRACKETS (name, len, array_dims); + + if (array_dims && trimmed) + *trimmed = get_identifier_with_length (name, len); + + return array_dims; + } + static tree build_array_from_name (type, type_wfl, name, ret_name) tree type, type_wfl, name, *ret_name; { int more_dims = 0; /* Eventually get more dims */ ! more_dims = build_type_name_from_array_name (name, &name); /* If we have, then craft a new type for this variable */ if (more_dims) { tree save = type; /* If we have a pointer, use its type */ if (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); *************** build_array_from_name (type, type_wfl, n *** 3277,3288 **** on adding dimensions) */ else if (type_wfl) { - int i = 0; type = type_wfl; ! string = IDENTIFIER_POINTER (TYPE_NAME (save)); ! while (string[i] == '[') ! ++i; ! more_dims += i; } /* Add all the dimensions */ --- 3315,3323 ---- on adding dimensions) */ else if (type_wfl) { type = type_wfl; ! more_dims += build_type_name_from_array_name (TYPE_NAME (save), ! NULL); } /* Add all the dimensions */ *************** build_unresolved_array_type (type_or_wfl *** 3315,3329 **** if (TREE_CODE (type_or_wfl) == RECORD_TYPE) return build_java_array_type (type_or_wfl, -1); ! obstack_1grow (&temporary_obstack, '['); ! obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)), IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl))); ptr = obstack_finish (&temporary_obstack); wfl = build_expr_wfl (get_identifier (ptr), ! EXPR_WFL_FILENAME (type_or_wfl), ! EXPR_WFL_LINENO (type_or_wfl), ! EXPR_WFL_COLNO (type_or_wfl)); /* Re-install the existing qualifications so that the type can be resolved properly. */ EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl); --- 3350,3364 ---- if (TREE_CODE (type_or_wfl) == RECORD_TYPE) return build_java_array_type (type_or_wfl, -1); ! obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (type_or_wfl)), IDENTIFIER_LENGTH (EXPR_WFL_NODE (type_or_wfl))); + obstack_grow0 (&temporary_obstack, "[]", 2); ptr = obstack_finish (&temporary_obstack); wfl = build_expr_wfl (get_identifier (ptr), ! EXPR_WFL_FILENAME (type_or_wfl), ! EXPR_WFL_LINENO (type_or_wfl), ! EXPR_WFL_COLNO (type_or_wfl)); /* Re-install the existing qualifications so that the type can be resolved properly. */ EXPR_WFL_QUALIFICATION (wfl) = EXPR_WFL_QUALIFICATION (type_or_wfl); *************** check_class_interface_creation (is_inter *** 3435,3441 **** else { check_modifiers_consistency (flags); ! icaf = ACC_PRIVATE|ACC_PROTECTED; } } --- 3470,3478 ---- else { check_modifiers_consistency (flags); ! icaf = ACC_PROTECTED; ! if (! CLASS_INTERFACE (GET_CPC ())) ! icaf |= ACC_PRIVATE; } } *************** make_nested_class_name (cpc_list) *** 3474,3485 **** TREE_PURPOSE (cpc_list) : DECL_NAME (TREE_VALUE (cpc_list))); obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)); - /* Why is NO_DOLLAR_IN_LABEL defined? */ - #if 0 - #ifdef NO_DOLLAR_IN_LABEL - internal_error ("Can't use '$' as a separator for inner classes"); - #endif - #endif obstack_1grow (&temporary_obstack, '$'); } --- 3511,3516 ---- *************** check_inner_class_redefinition (raw_name *** 3503,3508 **** --- 3534,3608 ---- return 0; } + /* Tries to find a decl for CLASS_TYPE within ENCLOSING. If we fail, + we remember ENCLOSING and SUPER. */ + + static tree + resolve_inner_class (circularity_hash, cl, enclosing, super, class_type) + struct hash_table *circularity_hash; + tree cl, *enclosing, *super, class_type; + { + tree local_enclosing = *enclosing; + tree local_super = NULL_TREE; + + while (local_enclosing) + { + tree intermediate, decl; + + hash_lookup (circularity_hash, + (const hash_table_key) local_enclosing, TRUE, NULL); + + if ((decl = find_as_inner_class (local_enclosing, class_type, cl))) + return decl; + + intermediate = local_enclosing; + /* Explore enclosing contexts. */ + while (INNER_CLASS_DECL_P (intermediate)) + { + intermediate = DECL_CONTEXT (intermediate); + if ((decl = find_as_inner_class (intermediate, class_type, cl))) + return decl; + } + + /* Now go to the upper classes, bail out if necessary. We will + analyze the returned SUPER and act accordingly (see + do_resolve_class.) */ + local_super = CLASSTYPE_SUPER (TREE_TYPE (local_enclosing)); + if (!local_super || local_super == object_type_node) + break; + + if (TREE_CODE (local_super) == POINTER_TYPE) + local_super = do_resolve_class (NULL, local_super, NULL, NULL); + else + local_super = TYPE_NAME (local_super); + + /* We may not have checked for circular inheritance yet, so do so + here to prevent an infinite loop. */ + if (hash_lookup (circularity_hash, + (const hash_table_key) local_super, FALSE, NULL)) + { + if (!cl) + cl = lookup_cl (local_enclosing); + + parse_error_context + (cl, "Cyclic inheritance involving %s", + IDENTIFIER_POINTER (DECL_NAME (local_enclosing))); + local_enclosing = NULL_TREE; + } + else + local_enclosing = local_super; + } + + /* We failed. Return LOCAL_SUPER and LOCAL_ENCLOSING. */ + *super = local_super; + *enclosing = local_enclosing; + + return NULL_TREE; + } + + /* Within ENCLOSING, find a decl for NAME and return it. NAME can be + qualified. */ + static tree find_as_inner_class (enclosing, name, cl) tree enclosing, name, cl; *************** find_as_inner_class (enclosing, name, cl *** 3536,3553 **** acc = merge_qualified_name (acc, EXPR_WFL_NODE (TREE_PURPOSE (qual))); BUILD_PTR_FROM_NAME (ptr, acc); ! ! /* Don't try to resolve ACC as a class name if it follows ! the current package name. We don't want to pick something ! that's accidentally there: for example `a.b.c' in package ! `a.b' shouldn't trigger loading `a' if it's there by ! itself. */ ! if (ctxp->package ! && strstr (IDENTIFIER_POINTER (ctxp->package), ! IDENTIFIER_POINTER (acc))) ! decl = NULL; ! else ! decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl); } /* A NULL qual and a decl means that the search ended --- 3636,3642 ---- acc = merge_qualified_name (acc, EXPR_WFL_NODE (TREE_PURPOSE (qual))); BUILD_PTR_FROM_NAME (ptr, acc); ! decl = do_resolve_class (NULL_TREE, ptr, NULL_TREE, cl); } /* A NULL qual and a decl means that the search ended *************** find_as_inner_class (enclosing, name, cl *** 3561,3567 **** /* Otherwise, create a qual for the other part of the resolution. */ else qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE); ! return find_as_inner_class_do (qual, enclosing); } --- 3650,3656 ---- /* Otherwise, create a qual for the other part of the resolution. */ else qual = build_tree_list (build_expr_wfl (name, NULL, 0, 0), NULL_TREE); ! return find_as_inner_class_do (qual, enclosing); } *************** link_nested_class_to_enclosing () *** 3620,3626 **** DECL_INNER_CLASS_LIST (enclosing) = tree_cons (GET_CPC (), GET_CPC_UN (), DECL_INNER_CLASS_LIST (enclosing)); - enclosing = enclosing; } } --- 3709,3714 ---- *************** create_interface (flags, id, super) *** 3723,3728 **** --- 3811,3821 ---- tree q_name = parser_qualified_classname (raw_name); tree decl = IDENTIFIER_CLASS_VALUE (q_name); + /* Certain syntax errors are making SUPER be like ID. Avoid this + case. */ + if (ctxp->class_err && id == super) + super = NULL; + EXPR_WFL_NODE (id) = q_name; /* Keep source location, even if refined. */ /* Basic checks: scope, redefinition, modifiers */ *************** create_interface (flags, id, super) *** 3735,3741 **** /* Suspend the current parsing context if we're parsing an inner interface */ if (CPC_INNER_P ()) ! java_parser_context_suspend (); /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); --- 3828,3839 ---- /* Suspend the current parsing context if we're parsing an inner interface */ if (CPC_INNER_P ()) ! { ! java_parser_context_suspend (); ! /* Interface members are public. */ ! if (CLASS_INTERFACE (GET_CPC ())) ! flags |= ACC_PUBLIC; ! } /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); *************** create_interface (flags, id, super) *** 3747,3753 **** if ((flags & ACC_ABSTRACT) && flag_redundant) parse_warning_context (MODIFIER_WFL (ABSTRACT_TK), ! "Redundant use of `abstract' modifier. Interface `%s' is implicitely abstract", IDENTIFIER_POINTER (raw_name)); /* Create a new decl if DECL is NULL, otherwise fix it */ decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id); --- 3845,3851 ---- if ((flags & ACC_ABSTRACT) && flag_redundant) parse_warning_context (MODIFIER_WFL (ABSTRACT_TK), ! "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract", IDENTIFIER_POINTER (raw_name)); /* Create a new decl if DECL is NULL, otherwise fix it */ decl = maybe_create_class_interface_decl (decl, raw_name, q_name, id); *************** create_class (flags, id, super, interfac *** 3855,3860 **** --- 3953,3963 ---- tree class_id, decl; tree super_decl_type; + /* Certain syntax errors are making SUPER be like ID. Avoid this + case. */ + if (ctxp->class_err && id == super) + super = NULL; + class_id = parser_qualified_classname (raw_name); decl = IDENTIFIER_CLASS_VALUE (class_id); EXPR_WFL_NODE (id) = class_id; *************** create_class (flags, id, super, interfac *** 3869,3875 **** /* Suspend the current parsing context if we're parsing an inner class or an anonymous class. */ if (CPC_INNER_P ()) ! java_parser_context_suspend (); /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); --- 3972,3984 ---- /* Suspend the current parsing context if we're parsing an inner class or an anonymous class. */ if (CPC_INNER_P ()) ! { ! java_parser_context_suspend (); ! /* Interface members are public. */ ! if (CLASS_INTERFACE (GET_CPC ())) ! flags |= ACC_PUBLIC; ! } ! /* Push a new context for (static) initialized upon declaration fields */ java_parser_context_push_initialized_field (); *************** static void *** 3947,3959 **** end_class_declaration (resume) int resume; { ! /* If an error occured, context weren't pushed and won't need to be popped by a resume. */ ! int no_error_occured = ctxp->next && GET_CPC () != error_mark_node; java_parser_context_pop_initialized_field (); POP_CPC (); ! if (resume && no_error_occured) java_parser_context_resume (); /* We're ending a class declaration, this is a good time to reset --- 4056,4071 ---- end_class_declaration (resume) int resume; { ! /* If an error occurred, context weren't pushed and won't need to be popped by a resume. */ ! int no_error_occurred = ctxp->next && GET_CPC () != error_mark_node; ! ! if (GET_CPC () != error_mark_node) ! dump_java_tree (TDI_class, GET_CPC ()); java_parser_context_pop_initialized_field (); POP_CPC (); ! if (resume && no_error_occurred) java_parser_context_resume (); /* We're ending a class declaration, this is a good time to reset *************** lookup_field_wrapper (class, name) *** 4096,4101 **** --- 4208,4220 ---- decl = lookup_field (&type, name); } + /* If the field still hasn't been found, try the next enclosing context. */ + if (!decl && INNER_CLASS_TYPE_P (class)) + { + tree outer_type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (class))); + decl = lookup_field_wrapper (outer_type, name); + } + java_parser_context_restore_global (); return decl == error_mark_node ? NULL : decl; } *************** register_fields (flags, type, variable_l *** 4226,4239 **** /* If the field denotes a final instance variable, then we allocate a LANG_DECL_SPECIFIC part to keep track of its initialization. We also mark whether the field was ! initialized upon it's declaration. We don't do that if the created field is an alias to a final local. */ if (!ARG_FINAL_P (current) && (flags & ACC_FINAL)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl); DECL_FIELD_FINAL_WFL (field_decl) = cl; - if ((flags & ACC_STATIC) && init) - DECL_FIELD_FINAL_IUD (field_decl) = 1; } /* If the couple initializer/initialized is marked ARG_FINAL_P, --- 4345,4356 ---- /* If the field denotes a final instance variable, then we allocate a LANG_DECL_SPECIFIC part to keep track of its initialization. We also mark whether the field was ! initialized upon its declaration. We don't do that if the created field is an alias to a final local. */ if (!ARG_FINAL_P (current) && (flags & ACC_FINAL)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field_decl); DECL_FIELD_FINAL_WFL (field_decl) = cl; } /* If the couple initializer/initialized is marked ARG_FINAL_P, *************** register_fields (flags, type, variable_l *** 4287,4293 **** /* Generate finit$, using the list of initialized fields to populate its body. finit$'s parameter(s) list is adjusted to include the one(s) used to initialized the field(s) caching outer context ! local(s). */ static tree generate_finit (class_type) --- 4404,4410 ---- /* Generate finit$, using the list of initialized fields to populate its body. finit$'s parameter(s) list is adjusted to include the one(s) used to initialized the field(s) caching outer context ! local(s). */ static tree generate_finit (class_type) *************** generate_finit (class_type) *** 4317,4345 **** return mdecl; } static tree ! build_instance_initializer (mdecl) ! tree mdecl; { - tree compound = NULL_TREE; - tree stmt_list = TYPE_II_STMT_LIST (DECL_CONTEXT (mdecl)); tree current; ! for (current = stmt_list; current; current = TREE_CHAIN (current)) compound = add_stmt_to_compound (compound, NULL_TREE, current); ! return compound; } ! static void ! add_instance_initializer (mdecl) ! tree mdecl; { ! tree compound = build_instance_initializer (mdecl); ! if (compound) ! java_method_add_stmt (mdecl, build1 (INSTANCE_INITIALIZERS_EXPR, ! NULL_TREE, compound)); } /* Shared accros method_declarator and method_header to remember the --- 4434,4504 ---- return mdecl; } + /* Generate a function to run the instance initialization code. The + private method is called `instinit$'. Unless we're dealing with an + anonymous class, we determine whether all ctors of CLASS_TYPE + declare a checked exception in their `throws' clause in order to + see whether it's necessary to encapsulate the instance initializer + statements in a try/catch/rethrow sequence. */ + static tree ! generate_instinit (class_type) ! tree class_type; { tree current; + tree compound = NULL_TREE; + tree parms = tree_cons (this_identifier_node, + build_pointer_type (class_type), end_params_node); + tree mdecl = create_artificial_method (class_type, ACC_PRIVATE, + void_type_node, + instinit_identifier_node, parms); ! layout_class_method (class_type, CLASSTYPE_SUPER (class_type), ! mdecl, NULL_TREE); ! ! /* Gather all the statements in a compound */ ! for (current = TYPE_II_STMT_LIST (class_type); ! current; current = TREE_CHAIN (current)) compound = add_stmt_to_compound (compound, NULL_TREE, current); ! /* We need to encapsulate COMPOUND by a try/catch statement to ! rethrow exceptions that might occur in the instance initializer. ! We do that only if all ctors of CLASS_TYPE are set to catch a ! checked exception. This doesn't apply to anonymous classes (since ! they don't have declared ctors.) */ ! if (!ANONYMOUS_CLASS_P (class_type) && ! ctors_unchecked_throws_clause_p (class_type)) ! { ! compound = encapsulate_with_try_catch (0, exception_type_node, compound, ! build1 (THROW_EXPR, NULL_TREE, ! build_wfl_node (wpv_id))); ! DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, ! exception_type_node); ! } ! ! start_artificial_method_body (mdecl); ! java_method_add_stmt (mdecl, compound); ! end_artificial_method_body (mdecl); ! ! return mdecl; } ! /* FIXME */ ! static tree ! build_instinit_invocation (class_type) ! tree class_type; { ! tree to_return = NULL_TREE; ! if (TYPE_II_STMT_LIST (class_type)) ! { ! tree parm = build_tree_list (NULL_TREE, ! build_wfl_node (this_identifier_node)); ! to_return = ! build_method_invocation (build_wfl_node (instinit_identifier_node), ! parm); ! } ! return to_return; } /* Shared accros method_declarator and method_header to remember the *************** method_header (flags, type, mdecl, throw *** 4390,4396 **** ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static"); ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final"); ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native"); ! ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED,id, "Synchronized"); if (!CLASS_ABSTRACT (TYPE_NAME (this_class)) && !CLASS_INTERFACE (TYPE_NAME (this_class))) parse_error_context --- 4549,4556 ---- ABSTRACT_CHECK (flags, ACC_STATIC, id, "Static"); ABSTRACT_CHECK (flags, ACC_FINAL, id, "Final"); ABSTRACT_CHECK (flags, ACC_NATIVE, id, "Native"); ! ABSTRACT_CHECK (flags, ACC_SYNCHRONIZED, id, "Synchronized"); ! ABSTRACT_CHECK (flags, ACC_STRICT, id, "Strictfp"); if (!CLASS_ABSTRACT (TYPE_NAME (this_class)) && !CLASS_INTERFACE (TYPE_NAME (this_class))) parse_error_context *************** method_header (flags, type, mdecl, throw *** 4416,4421 **** --- 4576,4582 ---- JCONSTRUCTOR_CHECK (flags, ACC_FINAL, id, "final"); JCONSTRUCTOR_CHECK (flags, ACC_NATIVE, id, "native"); JCONSTRUCTOR_CHECK (flags, ACC_SYNCHRONIZED, id, "synchronized"); + JCONSTRUCTOR_CHECK (flags, ACC_STRICT, id, "strictfp"); } /* If we found error here, we don't consider it's OK to tread the method definition as a constructor, for the rest of this *************** parser_check_super_interface (super_decl *** 4915,4933 **** if (!CLASS_INTERFACE (super_decl)) { parse_error_context ! (this_wfl, "Can't use %s `%s' to implement/extend %s `%s'", ! (TYPE_ARRAY_P (super_type) ? "array" : "class"), ! IDENTIFIER_POINTER (DECL_NAME (super_decl)), (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ? ! "interface" : "class"), ! IDENTIFIER_POINTER (DECL_NAME (this_decl))); return 1; } /* Check top-level interface access. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && check_pkg_class_access (DECL_NAME (super_decl), lookup_cl (this_decl))) return 1; SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s", --- 5076,5095 ---- if (!CLASS_INTERFACE (super_decl)) { parse_error_context ! (this_wfl, "%s `%s' can't implement/extend %s `%s'", (CLASS_INTERFACE (TYPE_NAME (TREE_TYPE (this_decl))) ? ! "Interface" : "Class"), ! IDENTIFIER_POINTER (DECL_NAME (this_decl)), ! (TYPE_ARRAY_P (super_type) ? "array" : "class"), ! IDENTIFIER_POINTER (DECL_NAME (super_decl))); return 1; } /* Check top-level interface access. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && check_pkg_class_access (DECL_NAME (super_decl), ! lookup_cl (this_decl), true)) return 1; SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s", *************** parser_check_super (super_decl, this_dec *** 4966,4972 **** /* Check top-level class scope. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && (check_pkg_class_access (DECL_NAME (super_decl), wfl))) return 1; SOURCE_FRONTEND_DEBUG (("Completing class %s with %s", --- 5128,5134 ---- /* Check top-level class scope. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) ! && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true))) return 1; SOURCE_FRONTEND_DEBUG (("Completing class %s with %s", *************** register_incomplete_type (kind, wfl, dec *** 5048,5057 **** JDEP_MISC (new) = NULL_TREE; /* For some dependencies, set the enclosing class of the current class to be the enclosing context */ ! if ((kind == JDEP_SUPER || kind == JDEP_INTERFACE ! || kind == JDEP_ANONYMOUS || kind == JDEP_FIELD) && GET_ENCLOSING_CPC ()) JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ()); else JDEP_ENCLOSING (new) = GET_CPC (); JDEP_GET_PATCH (new) = (tree *)NULL; --- 5210,5221 ---- JDEP_MISC (new) = NULL_TREE; /* For some dependencies, set the enclosing class of the current class to be the enclosing context */ ! if ((kind == JDEP_INTERFACE || kind == JDEP_ANONYMOUS) && GET_ENCLOSING_CPC ()) JDEP_ENCLOSING (new) = TREE_VALUE (GET_ENCLOSING_CPC ()); + else if (kind == JDEP_SUPER) + JDEP_ENCLOSING (new) = (GET_ENCLOSING_CPC () ? + TREE_VALUE (GET_ENCLOSING_CPC ()) : NULL_TREE); else JDEP_ENCLOSING (new) = GET_CPC (); JDEP_GET_PATCH (new) = (tree *)NULL; *************** register_incomplete_type (kind, wfl, dec *** 5061,5066 **** --- 5225,5313 ---- return ptr; } + /* This checks for circular references with innerclasses. We start + from SOURCE and should never reach TARGET. Extended/implemented + types in SOURCE have their enclosing context checked not to reach + TARGET. When the last enclosing context of SOURCE is reached, its + extended/implemented types are also checked not to reach TARGET. + In case of error, WFL of the offending type is returned; NULL_TREE + otherwise. */ + + static tree + check_inner_circular_reference (source, target) + tree source; + tree target; + { + tree basetype_vec = TYPE_BINFO_BASETYPES (source); + tree ctx, cl; + int i; + + if (!basetype_vec) + return NULL_TREE; + + for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++) + { + tree su; + + /* We can end up with a NULL_TREE or an incomplete type here if + we encountered previous type resolution errors. It's safe to + simply ignore these cases. */ + if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE) + continue; + su = BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)); + if (INCOMPLETE_TYPE_P (su)) + continue; + + if (inherits_from_p (su, target)) + return lookup_cl (TYPE_NAME (su)); + + for (ctx = DECL_CONTEXT (TYPE_NAME (su)); ctx; ctx = DECL_CONTEXT (ctx)) + { + /* An enclosing context shouldn't be TARGET */ + if (ctx == TYPE_NAME (target)) + return lookup_cl (TYPE_NAME (su)); + + /* When we reach the enclosing last context, start a check + on it, with the same target */ + if (! DECL_CONTEXT (ctx) && + (cl = check_inner_circular_reference (TREE_TYPE (ctx), target))) + return cl; + } + } + return NULL_TREE; + } + + /* Explore TYPE's `extends' clause member(s) and return the WFL of the + offending type if a circularity is detected. NULL_TREE is returned + otherwise. TYPE can be an interface or a class. */ + + static tree + check_circular_reference (type) + tree type; + { + tree basetype_vec = TYPE_BINFO_BASETYPES (type); + int i; + + if (!basetype_vec) + return NULL_TREE; + + if (! CLASS_INTERFACE (TYPE_NAME (type))) + { + if (inherits_from_p (CLASSTYPE_SUPER (type), type)) + return lookup_cl (TYPE_NAME (type)); + return NULL_TREE; + } + + for (i = 0; i < TREE_VEC_LENGTH (basetype_vec); i++) + { + tree vec_elt = TREE_VEC_ELT (basetype_vec, i); + if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node + && interface_of_p (type, BINFO_TYPE (vec_elt))) + return lookup_cl (TYPE_NAME (BINFO_TYPE (vec_elt))); + } + return NULL_TREE; + } + void java_check_circular_reference () { *************** java_check_circular_reference () *** 5068,5097 **** for (current = ctxp->class_list; current; current = TREE_CHAIN (current)) { tree type = TREE_TYPE (current); ! if (CLASS_INTERFACE (current)) ! { ! /* Check all interfaces this class extends */ ! tree basetype_vec = TYPE_BINFO_BASETYPES (type); ! int n, i; ! if (!basetype_vec) ! return; ! n = TREE_VEC_LENGTH (basetype_vec); ! for (i = 0; i < n; i++) ! { ! tree vec_elt = TREE_VEC_ELT (basetype_vec, i); ! if (vec_elt && BINFO_TYPE (vec_elt) != object_type_node ! && interface_of_p (type, BINFO_TYPE (vec_elt))) ! parse_error_context (lookup_cl (current), ! "Cyclic interface inheritance"); ! } ! } ! else ! if (inherits_from_p (CLASSTYPE_SUPER (type), type)) ! parse_error_context (lookup_cl (current), ! "Cyclic class inheritance%s", ! (cyclic_inheritance_report ? ! cyclic_inheritance_report : "")); } } --- 5315,5329 ---- for (current = ctxp->class_list; current; current = TREE_CHAIN (current)) { tree type = TREE_TYPE (current); ! tree cl; ! cl = check_circular_reference (type); ! if (! cl) ! cl = check_inner_circular_reference (type, type); ! if (cl) ! parse_error_context (cl, "Cyclic class inheritance%s", ! (cyclic_inheritance_report ? ! cyclic_inheritance_report : "")); } } *************** build_alias_initializer_parameter_list ( *** 5183,5189 **** where found. ARGS is non NULL when a special signature must be enforced. This is the case for anonymous classes. */ ! static void craft_constructor (class_decl, args) tree class_decl, args; { --- 5415,5421 ---- where found. ARGS is non NULL when a special signature must be enforced. This is the case for anonymous classes. */ ! static tree craft_constructor (class_decl, args) tree class_decl, args; { *************** craft_constructor (class_decl, args) *** 5232,5237 **** --- 5464,5470 ---- /* Now, mark the artificial parameters. */ DECL_FUNCTION_NAP (decl) = artificial; DECL_FUNCTION_SYNTHETIC_CTOR (decl) = DECL_CONSTRUCTOR_P (decl) = 1; + return decl; } *************** java_complete_class () *** 5343,5348 **** --- 5576,5588 ---- cclass = TREE_CHAIN (cclass), cclassd = CLASSD_CHAIN (cclassd)) { jdep *dep; + + /* We keep the compilation unit imports in the class so that + they can be used later to resolve type dependencies that + aren't necessary to solve now. */ + TYPE_IMPORT_LIST (TREE_TYPE (cclass)) = ctxp->import_list; + TYPE_IMPORT_DEMAND_LIST (TREE_TYPE (cclass)) = ctxp->import_demand_list; + for (dep = CLASSD_FIRST (cclassd); dep; dep = JDEP_CHAIN (dep)) { tree decl; *************** java_complete_class () *** 5409,5415 **** tree mdecl = JDEP_DECL (dep), signature; /* Recompute and reset the signature, check first that all types are now defined. If they're not, ! dont build the signature. */ if (check_method_types_complete (mdecl)) { signature = build_java_signature (TREE_TYPE (mdecl)); --- 5649,5655 ---- tree mdecl = JDEP_DECL (dep), signature; /* Recompute and reset the signature, check first that all types are now defined. If they're not, ! don't build the signature. */ if (check_method_types_complete (mdecl)) { signature = build_java_signature (TREE_TYPE (mdecl)); *************** static tree *** 5468,5476 **** resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! const char *name = IDENTIFIER_POINTER (TYPE_NAME (class_type)); ! const char *base = name; tree resolved_type = TREE_TYPE (class_type); tree resolved_type_decl; if (resolved_type != NULL_TREE) --- 5708,5716 ---- resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! tree tname = TYPE_NAME (class_type); tree resolved_type = TREE_TYPE (class_type); + int array_dims = 0; tree resolved_type_decl; if (resolved_type != NULL_TREE) *************** resolve_class (enclosing, class_type, de *** 5488,5500 **** /* 1- Check to see if we have an array. If true, find what we really want to resolve */ ! while (name[0] == '[') ! name++; ! if (base != name) ! { ! TYPE_NAME (class_type) = get_identifier (name); ! WFL_STRIP_BRACKET (cl, cl); ! } /* 2- Resolve the bare type */ if (!(resolved_type_decl = do_resolve_class (enclosing, class_type, --- 5728,5736 ---- /* 1- Check to see if we have an array. If true, find what we really want to resolve */ ! if ((array_dims = build_type_name_from_array_name (tname, ! &TYPE_NAME (class_type)))) ! WFL_STRIP_BRACKET (cl, cl); /* 2- Resolve the bare type */ if (!(resolved_type_decl = do_resolve_class (enclosing, class_type, *************** resolve_class (enclosing, class_type, de *** 5503,5517 **** resolved_type = TREE_TYPE (resolved_type_decl); /* 3- If we have and array, reconstruct the array down to its nesting */ ! if (base != name) { ! while (base != name) ! { ! resolved_type = build_java_array_type (resolved_type, -1); ! name--; ! } ! /* A TYPE_NAME that is a TYPE_DECL was set in ! build_java_array_type, return it. */ resolved_type_decl = TYPE_NAME (resolved_type); } TREE_TYPE (class_type) = resolved_type; --- 5739,5748 ---- resolved_type = TREE_TYPE (resolved_type_decl); /* 3- If we have and array, reconstruct the array down to its nesting */ ! if (array_dims) { ! for (; array_dims; array_dims--) ! resolved_type = build_java_array_type (resolved_type, -1); resolved_type_decl = TYPE_NAME (resolved_type); } TREE_TYPE (class_type) = resolved_type; *************** resolve_class (enclosing, class_type, de *** 5519,5587 **** } /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL ! are used to report error messages. */ tree do_resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! tree new_class_decl, super, start; ! ! /* Do not try to replace TYPE_NAME (class_type) by a variable, since ! it is changed by find_in_imports{_on_demand} and (but it doesn't ! really matter) qualify_and_find */ ! /* 0- Search in the current class as an inner class */ ! start = enclosing; ! /* Maybe some code here should be added to load the class or something, at least if the class isn't an inner class and ended being loaded from class file. FIXME. */ while (enclosing) { ! tree intermediate; ! ! if ((new_class_decl = find_as_inner_class (enclosing, class_type, cl))) ! return new_class_decl; ! ! intermediate = enclosing; ! /* Explore enclosing contexts. */ ! while (INNER_CLASS_DECL_P (intermediate)) ! { ! intermediate = DECL_CONTEXT (intermediate); ! if ((new_class_decl = find_as_inner_class (intermediate, ! class_type, cl))) ! return new_class_decl; ! } ! ! /* Now go to the upper classes, bail out if necessary. */ ! super = CLASSTYPE_SUPER (TREE_TYPE (enclosing)); ! if (!super || super == object_type_node) ! break; ! if (TREE_CODE (super) == POINTER_TYPE) ! super = do_resolve_class (NULL, super, NULL, NULL); else ! super = TYPE_NAME (super); ! ! /* We may not have checked for circular inheritance yet, so do so ! here to prevent an infinite loop. */ ! if (super == start) ! { ! if (!cl) ! cl = lookup_cl (decl); ! ! parse_error_context ! (cl, "Cyclic inheritance involving %s", ! IDENTIFIER_POINTER (DECL_NAME (enclosing))); ! break; ! } ! enclosing = super; } /* 1- Check for the type in single imports. This will change TYPE_NAME() if something relevant is found */ ! find_in_imports (class_type); /* 2- And check for the type in the current compilation unit */ if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) --- 5750,5804 ---- } /* Effectively perform the resolution of class CLASS_TYPE. DECL or CL ! are used to report error messages. Do not try to replace TYPE_NAME ! (class_type) by a variable, since it is changed by ! find_in_imports{_on_demand} and (but it doesn't really matter) ! qualify_and_find. */ tree do_resolve_class (enclosing, class_type, decl, cl) tree enclosing, class_type, decl, cl; { ! tree new_class_decl = NULL_TREE, super = NULL_TREE; ! tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE; ! tree decl_result; ! struct hash_table _ht, *circularity_hash = &_ht; ! /* This hash table is used to register the classes we're going ! through when searching the current class as an inner class, in ! order to detect circular references. Remember to free it before ! returning the section 0- of this function. */ ! hash_table_init (circularity_hash, hash_newfunc, ! java_hash_hash_tree_node, java_hash_compare_tree_node); ! /* 0- Search in the current class as an inner class. ! Maybe some code here should be added to load the class or something, at least if the class isn't an inner class and ended being loaded from class file. FIXME. */ while (enclosing) { ! new_class_decl = resolve_inner_class (circularity_hash, cl, &enclosing, ! &super, class_type); ! if (new_class_decl) ! break; ! /* If we haven't found anything because SUPER reached Object and ! ENCLOSING happens to be an innerclass, try the enclosing context. */ ! if ((!super || super == object_type_node) && ! enclosing && INNER_CLASS_DECL_P (enclosing)) ! enclosing = DECL_CONTEXT (enclosing); else ! enclosing = NULL_TREE; } + hash_table_free (circularity_hash); + + if (new_class_decl) + return new_class_decl; + /* 1- Check for the type in single imports. This will change TYPE_NAME() if something relevant is found */ ! find_in_imports (saved_enclosing_type, class_type); /* 2- And check for the type in the current compilation unit */ if ((new_class_decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)))) *************** do_resolve_class (enclosing, class_type, *** 5603,5609 **** /* 4- Check the import on demands. Don't allow bar.baz to be imported from foo.* */ if (!QUALIFIED_P (TYPE_NAME (class_type))) ! if (find_in_imports_on_demand (class_type)) return NULL_TREE; /* If found in find_in_imports_on_demant, the type has already been --- 5820,5826 ---- /* 4- Check the import on demands. Don't allow bar.baz to be imported from foo.* */ if (!QUALIFIED_P (TYPE_NAME (class_type))) ! if (find_in_imports_on_demand (saved_enclosing_type, class_type)) return NULL_TREE; /* If found in find_in_imports_on_demant, the type has already been *************** do_resolve_class (enclosing, class_type, *** 5638,5649 **** by the caller. */ if (cl) { ! if (check_pkg_class_access (TYPE_NAME (class_type), cl)) return NULL_TREE; } ! /* 6- Last call for a resolution */ ! return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); } static tree --- 5855,5891 ---- by the caller. */ if (cl) { ! if (check_pkg_class_access (TYPE_NAME (class_type), cl, true)) return NULL_TREE; } ! /* 6- Last call for a resolution */ ! decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); ! ! /* The final lookup might have registered a.b.c into a.b$c If we ! failed at the first lookup, progressively change the name if ! applicable and use the matching DECL instead. */ ! if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type))) ! { ! char *separator; ! tree name = TYPE_NAME (class_type); ! char *namebuffer = alloca (IDENTIFIER_LENGTH (name) + 1); ! ! strcpy (namebuffer, IDENTIFIER_POINTER (name)); ! ! do { ! ! /* Reach the last '.', and if applicable, replace it by a `$' and ! see if this exists as a type. */ ! if ((separator = strrchr (namebuffer, '.'))) ! { ! *separator = '$'; ! name = get_identifier (namebuffer); ! decl_result = IDENTIFIER_CLASS_VALUE (name); ! } ! } while (!decl_result && separator); ! } ! return decl_result; } static tree *************** resolve_no_layout (name, cl) *** 5746,5760 **** return decl; } ! /* Called when reporting errors. Skip leader '[' in a complex array ! type description that failed to be resolved. */ static const char * purify_type_name (name) const char *name; { ! while (*name && *name == '[') ! name++; return name; } --- 5988,6011 ---- return decl; } ! /* Called when reporting errors. Skip the '[]'s in a complex array ! type description that failed to be resolved. purify_type_name can't ! use an identifier tree. */ static const char * purify_type_name (name) const char *name; { ! int len = strlen (name); ! int bracket_found; ! ! STRING_STRIP_BRACKETS (name, len, bracket_found); ! if (bracket_found) ! { ! char *stripped_name = xmemdup (name, len, len+1); ! stripped_name [len] = '\0'; ! return stripped_name; ! } return name; } *************** check_method_redefinition (class, method *** 5857,5864 **** { tree redef, sig; ! /* There's no need to verify and finit$ */ ! if (DECL_CLINIT_P (method) || DECL_FINIT_P (method)) return 0; sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method)); --- 6108,6116 ---- { tree redef, sig; ! /* There's no need to verify and finit$ and instinit$ */ ! if (DECL_CLINIT_P (method) ! || DECL_FINIT_P (method) || DECL_INSTINIT_P (method)) return 0; sig = TYPE_ARGUMENT_SIGNATURE (TREE_TYPE (method)); *************** java_check_methods (class_decl) *** 6046,6052 **** } /* Check all the methods of CLASS_DECL. Methods are first completed ! then checked according to regular method existance rules. If no constructor for CLASS_DECL were encountered, then build its declaration. */ --- 6298,6304 ---- } /* Check all the methods of CLASS_DECL. Methods are first completed ! then checked according to regular method existence rules. If no constructor for CLASS_DECL were encountered, then build its declaration. */ *************** process_imports () *** 6470,6476 **** QUALIFIED_P (to_be_found) = 1; load_class (to_be_found, 0); error_found = ! check_pkg_class_access (to_be_found, TREE_PURPOSE (import)); /* We found it, we can bail out */ if (IDENTIFIER_CLASS_VALUE (to_be_found)) --- 6722,6728 ---- QUALIFIED_P (to_be_found) = 1; load_class (to_be_found, 0); error_found = ! check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true); /* We found it, we can bail out */ if (IDENTIFIER_CLASS_VALUE (to_be_found)) *************** process_imports () *** 6504,6520 **** statement. */ static void ! find_in_imports (class_type) tree class_type; { ! tree import; ! ! for (import = ctxp->import_list; import; import = TREE_CHAIN (import)) ! if (TREE_VALUE (import) == TYPE_NAME (class_type)) ! { ! TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import)); ! QUALIFIED_P (TYPE_NAME (class_type)) = 1; ! } } static int --- 6756,6777 ---- statement. */ static void ! find_in_imports (enclosing_type, class_type) ! tree enclosing_type; tree class_type; { ! tree import = (enclosing_type ? TYPE_IMPORT_LIST (enclosing_type) : ! ctxp->import_list); ! while (import) ! { ! if (TREE_VALUE (import) == TYPE_NAME (class_type)) ! { ! TYPE_NAME (class_type) = EXPR_WFL_NODE (TREE_PURPOSE (import)); ! QUALIFIED_P (TYPE_NAME (class_type)) = 1; ! return; ! } ! import = TREE_CHAIN (import); ! } } static int *************** read_import_dir (wfl) *** 6554,6560 **** void *entry; struct buffer filename[1]; - if (IS_AN_IMPORT_ON_DEMAND_P (package_id)) return; IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1; --- 6811,6816 ---- *************** read_import_dir (wfl) *** 6645,6651 **** static int first = 1; if (first) { ! error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives.", package_name); java_error_count++; first = 0; } --- 6901,6907 ---- static int first = 1; if (first) { ! error ("Can't find default package `%s'. Check the CLASSPATH environment variable and the access to the archives", package_name); java_error_count++; first = 0; } *************** read_import_dir (wfl) *** 6659,6733 **** } /* Possibly find a type in the import on demands specified ! types. Returns 1 if an error occured, 0 otherwise. Run throught the entire list, to detected potential double definitions. */ static int ! find_in_imports_on_demand (class_type) tree class_type; { ! tree node, import, node_to_use = NULL_TREE; ! int seen_once = -1; tree cl = NULL_TREE; ! for (import = ctxp->import_demand_list; import; import = TREE_CHAIN (import)) { const char *id_name; obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))), IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import)))); obstack_1grow (&temporary_obstack, '.'); obstack_grow0 (&temporary_obstack, ! IDENTIFIER_POINTER (TYPE_NAME (class_type)), ! IDENTIFIER_LENGTH (TYPE_NAME (class_type))); id_name = obstack_finish (&temporary_obstack); ! node = maybe_get_identifier (id_name); ! if (node && IS_A_CLASSFILE_NAME (node)) { if (seen_once < 0) { cl = TREE_PURPOSE (import); seen_once = 1; - node_to_use = node; } ! else { seen_once++; parse_error_context ! (TREE_PURPOSE (import), "Type `%s' also potentially defined in package `%s'", ! IDENTIFIER_POINTER (TYPE_NAME (class_type)), ! IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import)))); } } } if (seen_once == 1) ! { ! /* Setup lineno so that it refers to the line of the import (in ! case we parse a class file and encounter errors */ ! tree decl; ! int saved_lineno = lineno; ! lineno = EXPR_WFL_LINENO (cl); ! TYPE_NAME (class_type) = node_to_use; ! QUALIFIED_P (TYPE_NAME (class_type)) = 1; ! decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); ! /* If there is no DECL set for the class or if the class isn't ! loaded and not seen in source yet, the load */ ! if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl)) ! && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))) ! { ! load_class (node_to_use, 0); ! decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); ! } ! lineno = saved_lineno; ! if (! INNER_CLASS_P (TREE_TYPE (decl))) ! return check_pkg_class_access (TYPE_NAME (class_type), cl); ! else ! /* 6.6.1: Inner classes are subject to member access rules. */ ! return 0; ! } else return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */ } --- 6915,7017 ---- } /* Possibly find a type in the import on demands specified ! types. Returns 1 if an error occurred, 0 otherwise. Run through the entire list, to detected potential double definitions. */ static int ! find_in_imports_on_demand (enclosing_type, class_type) ! tree enclosing_type; tree class_type; { ! tree class_type_name = TYPE_NAME (class_type); ! tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) : ! ctxp->import_demand_list); tree cl = NULL_TREE; + int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */ + int to_return = -1; /* -1 when not set, 0 or 1 otherwise */ + tree node; ! for (; import; import = TREE_CHAIN (import)) { + int saved_lineno = lineno; + int access_check; const char *id_name; + tree decl, type_name_copy; + obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))), IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import)))); obstack_1grow (&temporary_obstack, '.'); obstack_grow0 (&temporary_obstack, ! IDENTIFIER_POINTER (class_type_name), ! IDENTIFIER_LENGTH (class_type_name)); id_name = obstack_finish (&temporary_obstack); ! if (! (node = maybe_get_identifier (id_name))) ! continue; ! ! /* Setup lineno so that it refers to the line of the import (in ! case we parse a class file and encounter errors */ ! lineno = EXPR_WFL_LINENO (TREE_PURPOSE (import)); ! ! type_name_copy = TYPE_NAME (class_type); ! TYPE_NAME (class_type) = node; ! QUALIFIED_P (node) = 1; ! decl = IDENTIFIER_CLASS_VALUE (node); ! access_check = -1; ! /* If there is no DECL set for the class or if the class isn't ! loaded and not seen in source yet, then load */ ! if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl)) ! && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))) ! { ! load_class (node, 0); ! decl = IDENTIFIER_CLASS_VALUE (node); ! } ! if (decl && ! INNER_CLASS_P (TREE_TYPE (decl))) ! access_check = check_pkg_class_access (node, TREE_PURPOSE (import), ! false); ! else ! /* 6.6.1: Inner classes are subject to member access rules. */ ! access_check = 0; ! ! lineno = saved_lineno; ! ! /* If the loaded class is not accessible or couldn't be loaded, ! we restore the original TYPE_NAME and process the next ! import. */ ! if (access_check || !decl) ! { ! TYPE_NAME (class_type) = type_name_copy; ! continue; ! } ! ! /* If the loaded class is accessible, we keep a tab on it to ! detect and report multiple inclusions. */ ! if (IS_A_CLASSFILE_NAME (node)) { if (seen_once < 0) { cl = TREE_PURPOSE (import); seen_once = 1; } ! else if (seen_once >= 0) { + tree location = (cl ? cl : TREE_PURPOSE (import)); + tree package = (cl ? EXPR_WFL_NODE (cl) : + EXPR_WFL_NODE (TREE_PURPOSE (import))); seen_once++; parse_error_context ! (location, "Type `%s' also potentially defined in package `%s'", ! IDENTIFIER_POINTER (TYPE_NAME (class_type)), ! IDENTIFIER_POINTER (package)); } } + to_return = access_check; } if (seen_once == 1) ! return to_return; else return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */ } *************** register_package (name) *** 6757,6801 **** } static tree ! resolve_package (pkg, next) ! tree pkg, *next; { ! tree current, acc; ! tree type_name = NULL_TREE; ! const char *name = IDENTIFIER_POINTER (EXPR_WFL_NODE (pkg)); /* The trick is to determine when the package name stops and were the name of something contained in the package starts. Then we return a fully qualified name of what we want to get. */ - /* Do a quick search on well known package names */ - if (!strncmp (name, "java.lang.reflect", 17)) - { - *next = - TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg)))); - type_name = lookup_package_type (name, 17); - } - else if (!strncmp (name, "java.lang", 9)) - { - *next = TREE_CHAIN (TREE_CHAIN (EXPR_WFL_QUALIFICATION (pkg))); - type_name = lookup_package_type (name, 9); - } - - /* If we found something here, return */ - if (type_name) - return type_name; - *next = EXPR_WFL_QUALIFICATION (pkg); /* Try to progressively construct a type name */ if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION) ! for (acc = NULL_TREE, current = EXPR_WFL_QUALIFICATION (pkg); current; current = TREE_CHAIN (current)) { ! acc = merge_qualified_name (acc, EXPR_WFL_NODE (QUAL_WFL (current))); ! if ((type_name = resolve_no_layout (acc, NULL_TREE))) { - type_name = acc; /* resolve_package should be used in a loop, hence we point at this one to naturally process the next one at the next iteration. */ --- 7041,7072 ---- } static tree ! resolve_package (pkg, next, type_name) ! tree pkg, *next, *type_name; { ! tree current; ! tree decl = NULL_TREE; ! *type_name = NULL_TREE; /* The trick is to determine when the package name stops and were the name of something contained in the package starts. Then we return a fully qualified name of what we want to get. */ *next = EXPR_WFL_QUALIFICATION (pkg); /* Try to progressively construct a type name */ if (TREE_CODE (pkg) == EXPR_WITH_FILE_LOCATION) ! for (current = EXPR_WFL_QUALIFICATION (pkg); current; current = TREE_CHAIN (current)) { ! /* If we don't have what we're expecting, exit now. TYPE_NAME ! will be null and the error caught later. */ ! if (TREE_CODE (QUAL_WFL (current)) != EXPR_WITH_FILE_LOCATION) ! break; ! *type_name = ! merge_qualified_name (*type_name, EXPR_WFL_NODE (QUAL_WFL (current))); ! if ((decl = resolve_no_layout (*type_name, NULL_TREE))) { /* resolve_package should be used in a loop, hence we point at this one to naturally process the next one at the next iteration. */ *************** resolve_package (pkg, next) *** 6803,6824 **** break; } } ! return type_name; } - static tree - lookup_package_type (name, from) - const char *name; - int from; - { - char subname [128]; - const char *sub = &name[from+1]; - while (*sub != '.' && *sub) - sub++; - strncpy (subname, name, sub-name); - subname [sub-name] = '\0'; - return get_identifier (subname); - } /* Check accessibility of inner classes according to member access rules. DECL is the inner class, ENCLOSING_DECL is the class from which the --- 7074,7082 ---- break; } } ! return decl; } /* Check accessibility of inner classes according to member access rules. DECL is the inner class, ENCLOSING_DECL is the class from which the *************** check_inner_class_access (decl, enclosin *** 6899,6912 **** lang_printable_name (decl, 0), access); } ! /* Accessibility check for top-level classes. If CLASS_NAME is in a foreign ! package, it must be PUBLIC. Return 0 if no access violations were found, ! 1 otherwise. */ static int ! check_pkg_class_access (class_name, cl) tree class_name; tree cl; { tree type; --- 7157,7172 ---- lang_printable_name (decl, 0), access); } ! /* Accessibility check for top-level classes. If CLASS_NAME is in a ! foreign package, it must be PUBLIC. Return 0 if no access ! violations were found, 1 otherwise. If VERBOSE is true and an error ! was found, it is reported and accounted for. */ static int ! check_pkg_class_access (class_name, cl, verbose) tree class_name; tree cl; + bool verbose; { tree type; *************** check_pkg_class_access (class_name, cl) *** 6929,6938 **** /* Both in the same package. */ return 0; ! parse_error_context ! (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed", ! (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"), ! IDENTIFIER_POINTER (class_name)); return 1; } return 0; --- 7189,7199 ---- /* Both in the same package. */ return 0; ! if (verbose) ! parse_error_context ! (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed", ! (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"), ! IDENTIFIER_POINTER (class_name)); return 1; } return 0; *************** declare_local_variables (modifier, type, *** 7012,7018 **** will be entered */ decl = build_decl (VAR_DECL, name, real_type); MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); ! LOCAL_FINAL (decl) = final_p; BLOCK_CHAIN_DECL (decl); /* If doing xreferencing, replace the line number with the WFL --- 7273,7279 ---- will be entered */ decl = build_decl (VAR_DECL, name, real_type); MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); ! DECL_FINAL (decl) = final_p; BLOCK_CHAIN_DECL (decl); /* If doing xreferencing, replace the line number with the WFL *************** source_start_java_method (fndecl) *** 7087,7097 **** parm_decl = build_decl (PARM_DECL, name, type); /* Remember if a local variable was declared final (via its ! TREE_LIST of type/name.) Set LOCAL_FINAL accordingly. */ if (ARG_FINAL_P (tem)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl); ! LOCAL_FINAL (parm_decl) = 1; } BLOCK_CHAIN_DECL (parm_decl); --- 7348,7358 ---- parm_decl = build_decl (PARM_DECL, name, type); /* Remember if a local variable was declared final (via its ! TREE_LIST of type/name.) Set DECL_FINAL accordingly. */ if (ARG_FINAL_P (tem)) { MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (parm_decl); ! DECL_FINAL (parm_decl) = 1; } BLOCK_CHAIN_DECL (parm_decl); *************** create_artificial_method (class, flags, *** 7124,7130 **** return mdecl; } ! /* Starts the body if an artifical method. */ static void start_artificial_method_body (mdecl) --- 7385,7391 ---- return mdecl; } ! /* Starts the body if an artificial method. */ static void start_artificial_method_body (mdecl) *************** end_artificial_method_body (mdecl) *** 7148,7153 **** --- 7409,7432 ---- exit_block (); } + /* Dump a tree of some kind. This is a convenience wrapper for the + dump_* functions in tree-dump.c. */ + static void + dump_java_tree (phase, t) + enum tree_dump_index phase; + tree t; + { + FILE *stream; + int flags; + + stream = dump_begin (phase, &flags); + if (stream) + { + dump_node (t, flags, stream); + dump_end (phase, stream); + } + } + /* Terminate a function and expand its body. */ static void *************** source_end_java_method () *** 7167,7172 **** --- 7446,7455 ---- if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) == empty_stmt_node) BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) = NULL_TREE; + /* We've generated all the trees for this function, and it has been + patched. Dump it to a file if the user requested it. */ + dump_java_tree (TDI_original, fndecl); + /* Generate function's code */ if (BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (fndecl)) && ! flag_emit_class_files *************** java_reorder_fields () *** 7300,7306 **** } } } ! stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list)); } /* Layout the methods of all classes loaded in one way or another. --- 7583,7591 ---- } } } ! /* There are cases were gclass_list will be empty. */ ! if (gclass_list) ! stop_reordering = TREE_TYPE (TREE_VALUE (gclass_list)); } /* Layout the methods of all classes loaded in one way or another. *************** static void *** 7391,7408 **** java_complete_expand_methods (class_decl) tree class_decl; { ! tree clinit, finit, decl, first_decl; current_class = TREE_TYPE (class_decl); - /* Find whether the class has final variables */ - for (decl = TYPE_FIELDS (current_class); decl; decl = TREE_CHAIN (decl)) - if (FIELD_FINAL (decl)) - { - TYPE_HAS_FINAL_VARIABLE (current_class) = 1; - break; - } - /* Initialize a new constant pool */ init_outgoing_cpool (); --- 7676,7685 ---- java_complete_expand_methods (class_decl) tree class_decl; { ! tree clinit, decl, first_decl; current_class = TREE_TYPE (class_decl); /* Initialize a new constant pool */ init_outgoing_cpool (); *************** java_complete_expand_methods (class_decl *** 7413,7425 **** first_decl = TYPE_METHODS (current_class); clinit = maybe_generate_pre_expand_clinit (current_class); ! /* Then generate finit$ (if we need to) because constructor will try to use it.*/ if (TYPE_FINIT_STMT_LIST (current_class)) ! { ! finit = generate_finit (current_class); ! java_complete_expand_method (finit); ! } /* Now do the constructors */ for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl)) --- 7690,7704 ---- first_decl = TYPE_METHODS (current_class); clinit = maybe_generate_pre_expand_clinit (current_class); ! /* Then generate finit$ (if we need to) because constructors will try to use it.*/ if (TYPE_FINIT_STMT_LIST (current_class)) ! java_complete_expand_method (generate_finit (current_class)); ! ! /* Then generate instinit$ (if we need to) because constructors will ! try to use it. */ ! if (TYPE_II_STMT_LIST (current_class)) ! java_complete_expand_method (generate_instinit (current_class)); /* Now do the constructors */ for (decl = first_decl ; !java_error_count && decl; decl = TREE_CHAIN (decl)) *************** java_complete_expand_methods (class_decl *** 7435,7450 **** if (no_body) restore_line_number_status (1); - /* Reset the final local variable assignment flags */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - reset_final_variable_local_assignment_flag (current_class); - java_complete_expand_method (decl); - /* Check for missed out final variable assignment */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - check_final_variable_local_assignment_flag (current_class, decl); - if (no_body) restore_line_number_status (0); } --- 7714,7721 ---- *************** java_complete_expand_methods (class_decl *** 7452,7467 **** /* First, do the ordinary methods. */ for (decl = first_decl; decl; decl = TREE_CHAIN (decl)) { /* Skip abstract or native methods -- but do handle native methods when generating JNI stubs. */ ! if (METHOD_ABSTRACT (decl) ! || (! flag_jni && METHOD_NATIVE (decl)) ! || DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl)) ! continue; if (METHOD_NATIVE (decl)) { ! tree body = build_jni_stub (decl); BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body; } --- 7723,7745 ---- /* First, do the ordinary methods. */ for (decl = first_decl; decl; decl = TREE_CHAIN (decl)) { + /* Ctors aren't part of this batch. */ + if (DECL_CONSTRUCTOR_P (decl) || DECL_CLINIT_P (decl)) + continue; + /* Skip abstract or native methods -- but do handle native methods when generating JNI stubs. */ ! if (METHOD_ABSTRACT (decl) || (! flag_jni && METHOD_NATIVE (decl))) ! { ! DECL_FUNCTION_BODY (decl) = NULL_TREE; ! continue; ! } if (METHOD_NATIVE (decl)) { ! tree body; ! current_function_decl = decl; ! body = build_jni_stub (decl); BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)) = body; } *************** java_complete_expand_methods (class_decl *** 7471,7487 **** /* If there is indeed a , fully expand it now */ if (clinit) { - /* Reset the final local variable assignment flags */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - reset_static_final_variable_assignment_flag (current_class); /* Prevent the use of `this' inside */ ctxp->explicit_constructor_p = 1; java_complete_expand_method (clinit); ctxp->explicit_constructor_p = 0; - /* Check for missed out static final variable assignment */ - if (TYPE_HAS_FINAL_VARIABLE (current_class) - && !CLASS_INTERFACE (class_decl)) - check_static_final_variable_assignment_flag (current_class); } /* We might have generated a class$ that we now want to expand */ --- 7749,7758 ---- *************** java_complete_expand_methods (class_decl *** 7496,7510 **** && verify_constructor_circularity (decl, decl)) break; - /* Final check on the initialization of final variables. */ - if (TYPE_HAS_FINAL_VARIABLE (current_class)) - { - check_final_variable_global_assignment_flag (current_class); - /* If we have an interface, check for uninitialized fields. */ - if (CLASS_INTERFACE (class_decl)) - check_static_final_variable_assignment_flag (current_class); - } - /* Save the constant pool. We'll need to restore it later. */ TYPE_CPOOL (current_class) = outgoing_cpool; } --- 7767,7772 ---- *************** maybe_generate_pre_expand_clinit (class_ *** 7573,7580 **** MODIFY_EXPR with a constant value. */ static int ! analyze_clinit_body (bbody) ! tree bbody; { while (bbody) switch (TREE_CODE (bbody)) --- 7835,7842 ---- MODIFY_EXPR with a constant value. */ static int ! analyze_clinit_body (this_class, bbody) ! tree this_class, bbody; { while (bbody) switch (TREE_CODE (bbody)) *************** analyze_clinit_body (bbody) *** 7588,7601 **** break; case COMPOUND_EXPR: ! if (analyze_clinit_body (TREE_OPERAND (bbody, 0))) return 1; bbody = TREE_OPERAND (bbody, 1); break; case MODIFY_EXPR: ! /* Return 0 if the operand is constant, 1 otherwise. */ ! return ! TREE_CONSTANT (TREE_OPERAND (bbody, 1)); default: return 1; --- 7850,7876 ---- break; case COMPOUND_EXPR: ! if (analyze_clinit_body (this_class, TREE_OPERAND (bbody, 0))) return 1; bbody = TREE_OPERAND (bbody, 1); break; case MODIFY_EXPR: ! /* If we're generating to class file and we're dealing with an ! array initialization, we return 1 to keep */ ! if (TREE_CODE (TREE_OPERAND (bbody, 1)) == NEW_ARRAY_INIT ! && flag_emit_class_files) ! return 1; ! ! /* There are a few cases where we're required to keep ! : ! - If this is an assignment whose operand is not constant, ! - If this is an assignment to a non-initialized field, ! - If this field is not a member of the current class. ! */ ! return (! TREE_CONSTANT (TREE_OPERAND (bbody, 1)) ! || ! DECL_INITIAL (TREE_OPERAND (bbody, 0)) ! || DECL_CONTEXT (TREE_OPERAND (bbody, 0)) != this_class); default: return 1; *************** maybe_yank_clinit (mdecl) *** 7614,7620 **** { tree type, current; tree fbody, bbody; - int found = 0; if (!DECL_CLINIT_P (mdecl)) return 0; --- 7889,7894 ---- *************** maybe_yank_clinit (mdecl) *** 7630,7636 **** return 0; if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node) return 0; ! type = DECL_CONTEXT (mdecl); current = TYPE_FIELDS (type); --- 7904,7910 ---- return 0; if (bbody && ! flag_emit_class_files && bbody != empty_stmt_node) return 0; ! type = DECL_CONTEXT (mdecl); current = TYPE_FIELDS (type); *************** maybe_yank_clinit (mdecl) *** 7639,7678 **** { tree f_init; ! /* We're not interested in non static field */ if (!FIELD_STATIC (current)) continue; /* Anything that isn't String or a basic type is ruled out -- or if we know how to deal with it (when doing things natively) we should generated an empty so that SUID are computed correctly. */ if (! JSTRING_TYPE_P (TREE_TYPE (current)) && ! JNUMERIC_TYPE_P (TREE_TYPE (current))) ! break; ! ! f_init = DECL_INITIAL (current); ! /* If we're emitting native code, we want static final fields to ! have constant initializers. If we don't meet these ! conditions, we keep */ ! if (!flag_emit_class_files ! && !(FIELD_FINAL (current) && f_init && TREE_CONSTANT (f_init))) ! break; ! /* If we're emitting bytecode, we want static fields to have ! constant initializers or no initializer. If we don't meet ! these conditions, we keep */ ! if (flag_emit_class_files && f_init && !TREE_CONSTANT (f_init)) ! break; } /* Now we analyze the method body and look for something that isn't a MODIFY_EXPR */ ! if (bbody == empty_stmt_node) ! found = 0; ! else ! found = analyze_clinit_body (bbody); ! ! if (current || found) return 0; /* Get rid of in the class' list of methods */ --- 7913,7942 ---- { tree f_init; ! /* We're not interested in non-static fields. */ if (!FIELD_STATIC (current)) continue; + /* Nor in fields without initializers. */ + f_init = DECL_INITIAL (current); + if (f_init == NULL_TREE) + continue; + /* Anything that isn't String or a basic type is ruled out -- or if we know how to deal with it (when doing things natively) we should generated an empty so that SUID are computed correctly. */ if (! JSTRING_TYPE_P (TREE_TYPE (current)) && ! JNUMERIC_TYPE_P (TREE_TYPE (current))) ! return 0; ! ! if (! FIELD_FINAL (current) || ! TREE_CONSTANT (f_init)) ! return 0; } /* Now we analyze the method body and look for something that isn't a MODIFY_EXPR */ ! if (bbody != empty_stmt_node && analyze_clinit_body (type, bbody)) return 0; /* Get rid of in the class' list of methods */ *************** maybe_yank_clinit (mdecl) *** 7690,7695 **** --- 7954,7993 ---- return 1; } + /* Install the argument from MDECL. Suitable to completion and + expansion of mdecl's body. */ + + static void + start_complete_expand_method (mdecl) + tree mdecl; + { + tree tem; + + pushlevel (1); /* Prepare for a parameter push */ + tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); + DECL_ARGUMENTS (mdecl) = tem; + + for (; tem; tem = TREE_CHAIN (tem)) + { + /* TREE_CHAIN (tem) will change after pushdecl. */ + tree next = TREE_CHAIN (tem); + tree type = TREE_TYPE (tem); + if (PROMOTE_PROTOTYPES + && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node) + && INTEGRAL_TYPE_P (type)) + type = integer_type_node; + DECL_ARG_TYPE (tem) = type; + layout_decl (tem, 0); + pushdecl (tem); + /* Re-install the next so that the list is kept and the loop + advances. */ + TREE_CHAIN (tem) = next; + } + pushdecl_force_head (DECL_ARGUMENTS (mdecl)); + lineno = DECL_SOURCE_LINE_FIRST (mdecl); + build_result_decl (mdecl); + } + /* Complete and expand a method. */ *************** static void *** 7697,7703 **** java_complete_expand_method (mdecl) tree mdecl; { ! int yank_clinit = 0; current_function_decl = mdecl; /* Fix constructors before expanding them */ --- 7995,8001 ---- java_complete_expand_method (mdecl) tree mdecl; { ! tree fbody, block_body, exception_copy; current_function_decl = mdecl; /* Fix constructors before expanding them */ *************** java_complete_expand_method (mdecl) *** 7705,7807 **** fix_constructors (mdecl); /* Expand functions that have a body */ ! if (DECL_FUNCTION_BODY (mdecl)) ! { ! tree fbody = DECL_FUNCTION_BODY (mdecl); ! tree block_body = BLOCK_EXPR_BODY (fbody); ! tree exception_copy = NULL_TREE; ! tree tem, *ptr; ! current_function_decl = mdecl; ! if (! quiet_flag) ! fprintf (stderr, " [%s.", ! lang_printable_name (DECL_CONTEXT (mdecl), 0)); ! announce_function (mdecl); ! if (! quiet_flag) ! fprintf (stderr, "]"); ! pushlevel (1); /* Prepare for a parameter push */ ! ptr = &DECL_ARGUMENTS (mdecl); ! tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); ! while (tem) { ! tree next = TREE_CHAIN (tem); ! tree type = TREE_TYPE (tem); ! if (PROMOTE_PROTOTYPES ! && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node) ! && INTEGRAL_TYPE_P (type)) ! type = integer_type_node; ! DECL_ARG_TYPE (tem) = type; ! layout_decl (tem, 0); ! pushdecl (tem); ! *ptr = tem; ! ptr = &TREE_CHAIN (tem); ! tem = next; } ! *ptr = NULL_TREE; ! pushdecl_force_head (DECL_ARGUMENTS (mdecl)); ! lineno = DECL_SOURCE_LINE_FIRST (mdecl); ! build_result_decl (mdecl); ! current_this ! = (!METHOD_STATIC (mdecl) ? ! BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE); ! /* Purge the `throws' list of unchecked exceptions. If we're ! doing xref, save a copy of the list and re-install it ! later. */ ! if (flag_emit_xref) ! exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl)); ! purge_unchecked_exceptions (mdecl); ! /* Install exceptions thrown with `throws' */ ! PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl)); ! if (block_body != NULL_TREE) ! { ! block_body = java_complete_tree (block_body); ! if (! flag_emit_xref && ! METHOD_NATIVE (mdecl)) ! check_for_initialization (block_body); ! ctxp->explicit_constructor_p = 0; ! } ! BLOCK_EXPR_BODY (fbody) = block_body; ! /* If we saw a return but couldn't evaluate it properly, we'll ! have an error_mark_node here. */ ! if (block_body != error_mark_node ! && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body)) ! && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE ! && !flag_emit_xref) ! missing_return_error (current_function_decl); ! /* Check wether we could just get rid of clinit, now the picture ! is complete. */ ! if (!(yank_clinit = maybe_yank_clinit (mdecl))) ! complete_start_java_method (mdecl); ! ! /* Don't go any further if we've found error(s) during the ! expansion */ ! if (!java_error_count && !yank_clinit) ! source_end_java_method (); ! else ! { ! if (java_error_count) ! pushdecl_force_head (DECL_ARGUMENTS (mdecl)); ! poplevel (1, 0, 1); } ! /* Pop the exceptions and sanity check */ ! POP_EXCEPTIONS(); ! if (currently_caught_type_list) ! abort (); ! if (flag_emit_xref) ! DECL_FUNCTION_THROWS (mdecl) = exception_copy; } } --- 8003,8152 ---- fix_constructors (mdecl); /* Expand functions that have a body */ ! if (!DECL_FUNCTION_BODY (mdecl)) ! return; ! fbody = DECL_FUNCTION_BODY (mdecl); ! block_body = BLOCK_EXPR_BODY (fbody); ! exception_copy = NULL_TREE; ! current_function_decl = mdecl; ! if (! quiet_flag) ! fprintf (stderr, " [%s.", ! lang_printable_name (DECL_CONTEXT (mdecl), 0)); ! announce_function (mdecl); ! if (! quiet_flag) ! fprintf (stderr, "]"); ! ! /* Prepare the function for tree completion */ ! start_complete_expand_method (mdecl); ! ! /* Install the current this */ ! current_this = (!METHOD_STATIC (mdecl) ? ! BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (mdecl)) : NULL_TREE); ! ! /* Purge the `throws' list of unchecked exceptions (we save a copy ! of the list and re-install it later.) */ ! exception_copy = copy_list (DECL_FUNCTION_THROWS (mdecl)); ! purge_unchecked_exceptions (mdecl); ! ! /* Install exceptions thrown with `throws' */ ! PUSH_EXCEPTIONS (DECL_FUNCTION_THROWS (mdecl)); ! ! if (block_body != NULL_TREE) ! { ! block_body = java_complete_tree (block_body); ! ! /* Before we check initialization, attached all class initialization ! variable to the block_body */ ! hash_traverse (&DECL_FUNCTION_INIT_TEST_TABLE (mdecl), ! attach_init_test_initialization_flags, block_body); ! ! if (! flag_emit_xref && ! METHOD_NATIVE (mdecl)) { ! check_for_initialization (block_body, mdecl); ! ! /* Go through all the flags marking the initialization of ! static variables and see whether they're definitively ! assigned, in which case the type is remembered as ! definitively initialized in MDECL. */ ! if (STATIC_CLASS_INIT_OPT_P ()) ! { ! /* Always register the context as properly initialized in ! MDECL. This used with caution helps removing extra ! initialization of self. */ ! if (METHOD_STATIC (mdecl)) ! hash_lookup (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (mdecl), ! (hash_table_key) DECL_CONTEXT (mdecl), ! TRUE, NULL); ! } } ! ctxp->explicit_constructor_p = 0; ! } ! ! BLOCK_EXPR_BODY (fbody) = block_body; ! ! /* If we saw a return but couldn't evaluate it properly, we'll have ! an error_mark_node here. */ ! if (block_body != error_mark_node ! && (block_body == NULL_TREE || CAN_COMPLETE_NORMALLY (block_body)) ! && TREE_CODE (TREE_TYPE (TREE_TYPE (mdecl))) != VOID_TYPE ! && !flag_emit_xref) ! missing_return_error (current_function_decl); ! /* See if we can get rid of if MDECL happens to be */ ! maybe_yank_clinit (mdecl); ! /* Pop the current level, with special measures if we found errors. */ ! if (java_error_count) ! pushdecl_force_head (DECL_ARGUMENTS (mdecl)); ! poplevel (1, 0, 1); ! /* Pop the exceptions and sanity check */ ! POP_EXCEPTIONS(); ! if (currently_caught_type_list) ! abort (); ! /* Restore the copy of the list of exceptions if emitting xrefs. */ ! DECL_FUNCTION_THROWS (mdecl) = exception_copy; ! } ! /* For with each class for which there's code to generate. */ ! static void ! java_expand_method_bodies (class) ! tree class; ! { ! tree decl; ! for (decl = TYPE_METHODS (class); decl; decl = TREE_CHAIN (decl)) ! { ! if (!DECL_FUNCTION_BODY (decl)) ! continue; ! current_function_decl = decl; ! /* It's time to assign the variable flagging static class ! initialization based on which classes invoked static methods ! are definitely initializing. This should be flagged. */ ! if (STATIC_CLASS_INIT_OPT_P ()) ! { ! tree list = DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (decl); ! for (; list != NULL_TREE; list = TREE_CHAIN (list)) ! { ! /* Executed for each statement calling a static function. ! LIST is a TREE_LIST whose PURPOSE is the called function ! and VALUE is a compound whose second operand can be patched ! with static class initialization flag assignments. */ ! tree called_method = TREE_PURPOSE (list); ! tree compound = TREE_VALUE (list); ! tree assignment_compound_list ! = build_tree_list (called_method, NULL); ! /* For each class definitely initialized in ! CALLED_METHOD, fill ASSIGNMENT_COMPOUND with ! assignment to the class initialization flag. */ ! hash_traverse (&DECL_FUNCTION_INITIALIZED_CLASS_TABLE (called_method), ! emit_test_initialization, ! assignment_compound_list); ! ! if (TREE_VALUE (assignment_compound_list)) ! TREE_OPERAND (compound, 1) ! = TREE_VALUE (assignment_compound_list); ! } } ! /* Prepare the function for RTL expansion */ ! start_complete_expand_method (decl); ! /* Expand function start, generate initialization flag ! assignment, and handle synchronized methods. */ ! complete_start_java_method (decl); ! ! /* Expand the rest of the function body and terminate ! expansion. */ ! source_end_java_method (); } } *************** outer_field_access_fix (wfl, node, rhs) *** 7961,7974 **** if (outer_field_expanded_access_p (node, &name, &arg_type, &arg)) { - /* At any rate, check whether we're trying to assign a value to - a final. */ - tree accessed = (JDECL_P (node) ? node : - (TREE_CODE (node) == COMPONENT_REF ? - TREE_OPERAND (node, 1) : node)); - if (check_final_assignment (accessed, wfl)) - return error_mark_node; - node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl), arg_type, name, arg, rhs); return java_complete_tree (node); --- 8306,8311 ---- *************** build_access_to_thisn (from, to, lc) *** 8198,8204 **** { tree access = NULL_TREE; ! while (from != to) { if (!access) { --- 8535,8541 ---- { tree access = NULL_TREE; ! while (from != to && PURE_INNER_CLASS_TYPE_P (from)) { if (!access) { *************** build_access_to_thisn (from, to, lc) *** 8218,8225 **** access = make_qualified_primary (cn, access, lc); } ! /* if FROM isn't an inter class, that's fine, we've done ! enough. What we're looking for can be accessed from there. */ from = DECL_CONTEXT (TYPE_NAME (from)); if (!from) break; --- 8555,8562 ---- access = make_qualified_primary (cn, access, lc); } ! /* If FROM isn't an inner class, that's fine, we've done enough. ! What we're looking for can be accessed from there. */ from = DECL_CONTEXT (TYPE_NAME (from)); if (!from) break; *************** build_current_thisn (type) *** 8288,8294 **** static int saved_type_i = 0; static int initialized_p; tree decl; ! char buffer [80]; int i = 0; /* Register SAVED_THISN and SAVED_TYPE with the garbage collector. */ --- 8625,8631 ---- static int saved_type_i = 0; static int initialized_p; tree decl; ! char buffer [24]; int i = 0; /* Register SAVED_THISN and SAVED_TYPE with the garbage collector. */ *************** build_dot_class_method (class) *** 8362,8370 **** #define BWF(S) build_wfl_node (get_identifier ((S))) #define MQN(X,Y) make_qualified_name ((X), (Y), 0) tree args, tmp, saved_current_function_decl, mdecl; ! tree stmt, throw_stmt, catch, catch_block, try_block; ! tree catch_clause_param; ! tree class_not_found_exception, no_class_def_found_error; static tree get_message_wfl, type_parm_wfl; --- 8699,8705 ---- #define BWF(S) build_wfl_node (get_identifier ((S))) #define MQN(X,Y) make_qualified_name ((X), (Y), 0) tree args, tmp, saved_current_function_decl, mdecl; ! tree stmt, throw_stmt; static tree get_message_wfl, type_parm_wfl; *************** build_dot_class_method (class) *** 8384,8416 **** /* Build the qualified name java.lang.Class.forName */ tmp = MQN (MQN (MQN (BWF ("java"), BWF ("lang")), BWF ("Class")), BWF ("forName")); ! ! /* For things we have to catch and throw */ ! class_not_found_exception = ! lookup_class (get_identifier ("java.lang.ClassNotFoundException")); ! no_class_def_found_error = ! lookup_class (get_identifier ("java.lang.NoClassDefFoundError")); ! load_class (class_not_found_exception, 1); ! load_class (no_class_def_found_error, 1); ! /* Create the "class$" function */ mdecl = create_artificial_method (class, ACC_STATIC, build_pointer_type (class_type_node), classdollar_identifier_node, args); ! DECL_FUNCTION_THROWS (mdecl) = build_tree_list (NULL_TREE, ! no_class_def_found_error); ! /* We start by building the try block. We need to build: return (java.lang.Class.forName (type)); */ stmt = build_method_invocation (tmp, build_tree_list (NULL_TREE, type_parm_wfl)); stmt = build_return (0, stmt); - /* Put it in a block. That's the try block */ - try_block = build_expr_block (stmt, NULL_TREE); /* Now onto the catch block. We start by building the expression ! throwing a new exception: ! throw new NoClassDefFoundError (_.getMessage); */ throw_stmt = make_qualified_name (build_wfl_node (wpv_id), get_message_wfl, 0); throw_stmt = build_method_invocation (throw_stmt, NULL_TREE); --- 8719,8742 ---- /* Build the qualified name java.lang.Class.forName */ tmp = MQN (MQN (MQN (BWF ("java"), BWF ("lang")), BWF ("Class")), BWF ("forName")); ! load_class (class_not_found_type_node, 1); ! load_class (no_class_def_found_type_node, 1); ! /* Create the "class$" function */ mdecl = create_artificial_method (class, ACC_STATIC, build_pointer_type (class_type_node), classdollar_identifier_node, args); ! DECL_FUNCTION_THROWS (mdecl) = ! build_tree_list (NULL_TREE, no_class_def_found_type_node); ! /* We start by building the try block. We need to build: return (java.lang.Class.forName (type)); */ stmt = build_method_invocation (tmp, build_tree_list (NULL_TREE, type_parm_wfl)); stmt = build_return (0, stmt); /* Now onto the catch block. We start by building the expression ! throwing a new exception: throw new NoClassDefFoundError (_.getMessage) */ throw_stmt = make_qualified_name (build_wfl_node (wpv_id), get_message_wfl, 0); throw_stmt = build_method_invocation (throw_stmt, NULL_TREE); *************** build_dot_class_method (class) *** 8423,8449 **** /* Build the throw, (it's too early to use BUILD_THROW) */ throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt); ! /* Build the catch block to encapsulate all this. We begin by ! building an decl for the catch clause parameter and link it to ! newly created block, the catch block. */ ! catch_clause_param = ! build_decl (VAR_DECL, wpv_id, ! build_pointer_type (class_not_found_exception)); ! catch_block = build_expr_block (NULL_TREE, catch_clause_param); ! ! /* We initialize the variable with the exception handler. */ ! catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param, ! build (JAVA_EXC_OBJ_EXPR, ptr_type_node)); ! add_stmt_to_block (catch_block, NULL_TREE, catch); ! ! /* We add the statement throwing the new exception */ ! add_stmt_to_block (catch_block, NULL_TREE, throw_stmt); ! ! /* Build a catch expression for all this */ ! catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block); ! ! /* Build the try/catch sequence */ ! stmt = build_try_statement (0, try_block, catch_block); fix_method_argument_names (args, mdecl); layout_class_method (class, NULL_TREE, mdecl, NULL_TREE); --- 8749,8757 ---- /* Build the throw, (it's too early to use BUILD_THROW) */ throw_stmt = build1 (THROW_EXPR, NULL_TREE, throw_stmt); ! /* Encapsulate STMT in a try block. The catch clause executes THROW_STMT */ ! stmt = encapsulate_with_try_catch (0, class_not_found_type_node, ! stmt, throw_stmt); fix_method_argument_names (args, mdecl); layout_class_method (class, NULL_TREE, mdecl, NULL_TREE); *************** build_dot_class_method_invocation (type) *** 8468,8473 **** --- 8776,8785 ---- else sig_id = DECL_NAME (TYPE_NAME (type)); + /* Ensure that the proper name separator is used */ + sig_id = unmangle_classname (IDENTIFIER_POINTER (sig_id), + IDENTIFIER_LENGTH (sig_id)); + s = build_string (IDENTIFIER_LENGTH (sig_id), IDENTIFIER_POINTER (sig_id)); return build_method_invocation (build_wfl_node (classdollar_identifier_node), *************** static void *** 8484,8489 **** --- 8796,8802 ---- fix_constructors (mdecl) tree mdecl; { + tree iii; /* Instance Initializer Invocation */ tree body = DECL_FUNCTION_BODY (mdecl); tree thisn_assign, compound = NULL_TREE; tree class_type = DECL_CONTEXT (mdecl); *************** fix_constructors (mdecl) *** 8525,8533 **** of that. */ java_method_add_stmt (mdecl, build_super_invocation (mdecl)); ! /* Insert the instance initializer block right here, after the ! super invocation. */ ! add_instance_initializer (mdecl); end_artificial_method_body (mdecl); } --- 8838,8846 ---- of that. */ java_method_add_stmt (mdecl, build_super_invocation (mdecl)); ! /* FIXME */ ! if ((iii = build_instinit_invocation (class_type))) ! java_method_add_stmt (mdecl, iii); end_artificial_method_body (mdecl); } *************** fix_constructors (mdecl) *** 8535,8549 **** else { int found = 0; tree found_call = NULL_TREE; tree main_block = BLOCK_EXPR_BODY (body); - tree ii; /* Instance Initializer */ while (body) switch (TREE_CODE (body)) { case CALL_EXPR: found = CALL_EXPLICIT_CONSTRUCTOR_P (body); body = NULL_TREE; break; case COMPOUND_EXPR: --- 8848,8864 ---- else { int found = 0; + int invokes_this = 0; tree found_call = NULL_TREE; tree main_block = BLOCK_EXPR_BODY (body); while (body) switch (TREE_CODE (body)) { case CALL_EXPR: found = CALL_EXPLICIT_CONSTRUCTOR_P (body); + if (CALL_THIS_CONSTRUCTOR_P (body)) + invokes_this = 1; body = NULL_TREE; break; case COMPOUND_EXPR: *************** fix_constructors (mdecl) *** 8577,8585 **** TREE_OPERAND (found_call, 0) = empty_stmt_node; } /* Insert the instance initializer block right after. */ ! if ((ii = build_instance_initializer (mdecl))) ! compound = add_stmt_to_compound (compound, NULL_TREE, ii); /* Fix the constructor main block if we're adding extra stmts */ if (compound) --- 8892,8902 ---- TREE_OPERAND (found_call, 0) = empty_stmt_node; } + DECL_INIT_CALLS_THIS (mdecl) = invokes_this; + /* Insert the instance initializer block right after. */ ! if (!invokes_this && (iii = build_instinit_invocation (class_type))) ! compound = add_stmt_to_compound (compound, NULL_TREE, iii); /* Fix the constructor main block if we're adding extra stmts */ if (compound) *************** verify_constructor_super (mdecl) *** 8623,8629 **** && m_arg_type != end_params_node); arg_type = TREE_CHAIN (arg_type), m_arg_type = TREE_CHAIN (m_arg_type)) ! if (TREE_VALUE (arg_type) != TREE_VALUE (m_arg_type)) break; if (arg_type == end_params_node && m_arg_type == end_params_node) --- 8940,8948 ---- && m_arg_type != end_params_node); arg_type = TREE_CHAIN (arg_type), m_arg_type = TREE_CHAIN (m_arg_type)) ! if (!valid_method_invocation_conversion_p ! (TREE_VALUE (arg_type), ! TREE_VALUE (m_arg_type))) break; if (arg_type == end_params_node && m_arg_type == end_params_node) *************** java_expand_classes () *** 8658,8665 **** java_layout_classes (); java_parse_abort_on_error (); ! cur_ctxp = ctxp_for_generation; ! for (; cur_ctxp; cur_ctxp = cur_ctxp->next) { ctxp = cur_ctxp; input_filename = ctxp->filename; --- 8977,8983 ---- java_layout_classes (); java_parse_abort_on_error (); ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { ctxp = cur_ctxp; input_filename = ctxp->filename; *************** java_expand_classes () *** 8669,8677 **** } input_filename = main_input_filename; ! /* Find anonymous classes and expand their constructor, now they ! have been fixed. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; --- 8987,8997 ---- } input_filename = main_input_filename; ! ! /* Find anonymous classes and expand their constructor. This extra pass is ! neccessary because the constructor itself is only generated when the ! method in which it is defined is expanded. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; *************** java_expand_classes () *** 8688,8694 **** restore_line_number_status (1); java_complete_expand_method (d); restore_line_number_status (0); ! break; /* We now there are no other ones */ } } } --- 9008,9014 ---- restore_line_number_status (1); java_complete_expand_method (d); restore_line_number_status (0); ! break; /* There is only one constructor. */ } } } *************** java_expand_classes () *** 8704,8710 **** return; /* Now things are stable, go for generation of the class data. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; --- 9024,9049 ---- return; /* Now things are stable, go for generation of the class data. */ ! ! /* We pessimistically marked all fields external until we knew ! what set of classes we were planning to compile. Now mark ! those that will be generated locally as not external. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) ! { ! tree current; ! ctxp = cur_ctxp; ! for (current = ctxp->class_list; current; current = TREE_CHAIN (current)) ! { ! tree class = TREE_TYPE (current); ! tree field; ! for (field = TYPE_FIELDS (class); field ; field = TREE_CHAIN (field)) ! if (FIELD_STATIC (field)) ! DECL_EXTERNAL (field) = 0; ! } ! } ! ! /* Compile the classes. */ ! for (cur_ctxp = ctxp_for_generation; cur_ctxp; cur_ctxp = cur_ctxp->next) { tree current; ctxp = cur_ctxp; *************** java_expand_classes () *** 8717,8723 **** if (flag_emit_xref) expand_xref (current_class); else if (! flag_syntax_only) ! finish_class (); } } } --- 9056,9065 ---- if (flag_emit_xref) expand_xref (current_class); else if (! flag_syntax_only) ! { ! java_expand_method_bodies (current_class); ! finish_class (); ! } } } } *************** resolve_expression_name (id, orig) *** 8897,8903 **** static_ref_err (id, DECL_NAME (decl), current_class); return error_mark_node; } ! return build_outer_field_access (id, decl); } /* Otherwise build what it takes to access the field */ --- 9239,9248 ---- static_ref_err (id, DECL_NAME (decl), current_class); return error_mark_node; } ! access = build_outer_field_access (id, decl); ! if (orig) ! *orig = access; ! return access; } /* Otherwise build what it takes to access the field */ *************** resolve_expression_name (id, orig) *** 8926,8933 **** } /* We've got an error here */ ! parse_error_context (id, "Undefined variable `%s'", ! IDENTIFIER_POINTER (name)); return error_mark_node; } --- 9271,9285 ---- } /* We've got an error here */ ! if (INNER_CLASS_TYPE_P (current_class)) ! parse_error_context (id, ! "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final", ! IDENTIFIER_POINTER (name), ! IDENTIFIER_POINTER (DECL_NAME ! (TYPE_NAME (current_class)))); ! else ! parse_error_context (id, "Undefined variable `%s'", ! IDENTIFIER_POINTER (name)); return error_mark_node; } *************** static_ref_err (wfl, field_id, class_typ *** 8943,8949 **** IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type)))); } ! /* 15.10.1 Field Acess Using a Primary and/or Expression Name. We return something suitable to generate the field access. We also return the field decl in FIELD_DECL and its type in FIELD_TYPE. If recipient's address can be null. */ --- 9295,9301 ---- IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class_type)))); } ! /* 15.10.1 Field Access Using a Primary and/or Expression Name. We return something suitable to generate the field access. We also return the field decl in FIELD_DECL and its type in FIELD_TYPE. If recipient's address can be null. */ *************** resolve_field_access (qual_wfl, field_de *** 8967,8974 **** && ! flag_emit_class_files && ! flag_emit_xref) { tree length = build_java_array_length_access (where_found); ! field_ref = ! build_java_arraynull_check (type_found, length, int_type_node); /* In case we're dealing with a static array, we need to initialize its class before the array length can be fetched. --- 9319,9325 ---- && ! flag_emit_class_files && ! flag_emit_xref) { tree length = build_java_array_length_access (where_found); ! field_ref = length; /* In case we're dealing with a static array, we need to initialize its class before the array length can be fetched. *************** resolve_qualified_expression_name (wfl, *** 9110,9115 **** --- 9461,9467 ---- *where_found = patch_method_invocation (qual_wfl, decl, type, from_super, &is_static, &ret_decl); + from_super = 0; if (*where_found == error_mark_node) { RESTORE_THIS_AND_CURRENT_CLASS; *************** resolve_qualified_expression_name (wfl, *** 9147,9153 **** forcoming function's argument. */ if (previous_call_static && is_static) { ! decl = build (COMPOUND_EXPR, type, decl, *where_found); TREE_SIDE_EFFECTS (decl) = 1; } else --- 9499,9506 ---- forcoming function's argument. */ if (previous_call_static && is_static) { ! decl = build (COMPOUND_EXPR, TREE_TYPE (*where_found), ! decl, *where_found); TREE_SIDE_EFFECTS (decl) = 1; } else *************** resolve_qualified_expression_name (wfl, *** 9240,9246 **** parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called"); return 1; } ! /* We have to generate code for intermediate acess */ if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type) { *where_found = decl = current_this; --- 9593,9599 ---- parse_error_context (wfl, "Can't reference `this' before the superclass constructor has been called"); return 1; } ! /* We have to generate code for intermediate access */ if (!from_type || TREE_TYPE (TREE_TYPE (current_this)) == type) { *where_found = decl = current_this; *************** resolve_qualified_expression_name (wfl, *** 9305,9315 **** assume a variable/class name was meant. */ if (RESOLVE_PACKAGE_NAME_P (qual_wfl)) { ! tree name = resolve_package (wfl, &q); ! if (name) { tree list; ! *where_found = decl = resolve_no_layout (name, qual_wfl); /* We want to be absolutely sure that the class is laid out. We're going to search something inside it. */ *type_found = type = TREE_TYPE (decl); --- 9658,9669 ---- assume a variable/class name was meant. */ if (RESOLVE_PACKAGE_NAME_P (qual_wfl)) { ! tree name; ! if ((decl = resolve_package (wfl, &q, &name))) { tree list; ! *where_found = decl; ! /* We want to be absolutely sure that the class is laid out. We're going to search something inside it. */ *type_found = type = TREE_TYPE (decl); *************** resolve_qualified_expression_name (wfl, *** 9339,9355 **** else parse_error_context (qual_wfl, "Undefined variable or class name: `%s'", ! IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl))); return 1; } } /* We have a type name. It's been already resolved when the expression was qualified. */ ! else if (RESOLVE_TYPE_NAME_P (qual_wfl)) { ! if (!(decl = QUAL_RESOLUTION (q))) ! return 1; /* Error reported already */ /* Sneak preview. If next we see a `new', we're facing a qualification with resulted in a type being selected --- 9693,9708 ---- else parse_error_context (qual_wfl, "Undefined variable or class name: `%s'", ! IDENTIFIER_POINTER (name)); return 1; } } /* We have a type name. It's been already resolved when the expression was qualified. */ ! else if (RESOLVE_TYPE_NAME_P (qual_wfl) && QUAL_RESOLUTION (q)) { ! decl = QUAL_RESOLUTION (q); /* Sneak preview. If next we see a `new', we're facing a qualification with resulted in a type being selected *************** resolve_qualified_expression_name (wfl, *** 9377,9383 **** type = TREE_TYPE (decl); from_type = 1; } ! /* We resolve and expression name */ else { tree field_decl = NULL_TREE; --- 9730,9736 ---- type = TREE_TYPE (decl); from_type = 1; } ! /* We resolve an expression name */ else { tree field_decl = NULL_TREE; *************** resolve_qualified_expression_name (wfl, *** 9413,9418 **** --- 9766,9781 ---- } } + /* Report and error if we're using a numerical litteral as a + qualifier. It can only be an INTEGER_CST. */ + else if (TREE_CODE (qual_wfl) == INTEGER_CST) + { + parse_error_context + (wfl, "Can't use type `%s' as a qualifier", + lang_printable_name (TREE_TYPE (qual_wfl), 0)); + return 1; + } + /* We have to search for a field, knowing the type of its container. The flag FROM_TYPE indicates that we resolved the last member of the expression as a type name, which *************** resolve_qualified_expression_name (wfl, *** 9430,9436 **** (qual_wfl, "Attempt to reference field `%s' in `%s %s'", IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)), lang_printable_name (type, 0), ! IDENTIFIER_POINTER (DECL_NAME (field_decl))); return 1; } --- 9793,9799 ---- (qual_wfl, "Attempt to reference field `%s' in `%s %s'", IDENTIFIER_POINTER (EXPR_WFL_NODE (qual_wfl)), lang_printable_name (type, 0), ! IDENTIFIER_POINTER (DECL_NAME (decl))); return 1; } *************** not_accessible_p (reference, member, whe *** 9609,9615 **** if (where && !inherits_from_p (reference, where)) return 1; ! /* Otherwise, access is granted if occuring from the class where member is declared or a subclass of it. Find the right context to perform the check */ if (PURE_INNER_CLASS_TYPE_P (reference)) --- 9972,9978 ---- if (where && !inherits_from_p (reference, where)) return 1; ! /* Otherwise, access is granted if occurring from the class where member is declared or a subclass of it. Find the right context to perform the check */ if (PURE_INNER_CLASS_TYPE_P (reference)) *************** not_accessible_p (reference, member, whe *** 9638,9644 **** return 1; } ! /* Default access are permitted only when occuring within the package in which the type (REFERENCE) is declared. In other words, REFERENCE is defined in the current package */ if (ctxp->package) --- 10001,10007 ---- return 1; } ! /* Default access are permitted only when occurring within the package in which the type (REFERENCE) is declared. In other words, REFERENCE is defined in the current package */ if (ctxp->package) *************** check_deprecation (wfl, decl) *** 9667,9684 **** strcpy (the, "method"); break; case FIELD_DECL: strcpy (the, "field"); break; case TYPE_DECL: ! strcpy (the, "class"); ! break; default: abort (); } ! parse_warning_context ! (wfl, "The %s `%s' in class `%s' has been deprecated", ! the, lang_printable_name (decl, 0), ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))); } } --- 10030,10052 ---- strcpy (the, "method"); break; case FIELD_DECL: + case VAR_DECL: strcpy (the, "field"); break; case TYPE_DECL: ! parse_warning_context (wfl, "The class `%s' has been deprecated", ! IDENTIFIER_POINTER (DECL_NAME (decl))); ! return; default: abort (); } ! /* Don't issue a message if the context as been deprecated as a ! whole. */ ! if (! CLASS_DEPRECATED (TYPE_NAME (DECL_CONTEXT (decl)))) ! parse_warning_context ! (wfl, "The %s `%s' in class `%s' has been deprecated", ! the, lang_printable_name (decl, 0), ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))); } } *************** patch_method_invocation (patch, primary, *** 9791,9796 **** --- 10159,10170 ---- qualify_ambiguous_name (wfl); resolved = resolve_field_access (wfl, NULL, NULL); + if (TREE_CODE (resolved) == VAR_DECL && FIELD_STATIC (resolved) + && FIELD_FINAL (resolved) + && !inherits_from_p (DECL_CONTEXT (resolved), current_class) + && !flag_emit_class_files && !flag_emit_xref) + resolved = build_class_init (DECL_CONTEXT (resolved), resolved); + if (resolved == error_mark_node) PATCH_METHOD_RETURN_ERROR (); *************** patch_method_invocation (patch, primary, *** 9955,9961 **** /* Check for inner classes creation from illegal contexts */ if (lc && (INNER_CLASS_TYPE_P (class_to_search) && !CLASS_STATIC (TYPE_NAME (class_to_search))) ! && INNER_ENCLOSING_SCOPE_CHECK (class_to_search)) { parse_error_context (wfl, "No enclosing instance for inner class `%s' is in scope%s", --- 10329,10336 ---- /* Check for inner classes creation from illegal contexts */ if (lc && (INNER_CLASS_TYPE_P (class_to_search) && !CLASS_STATIC (TYPE_NAME (class_to_search))) ! && INNER_ENCLOSING_SCOPE_CHECK (class_to_search) ! && !DECL_INIT_P (current_function_decl)) { parse_error_context (wfl, "No enclosing instance for inner class `%s' is in scope%s", *************** patch_method_invocation (patch, primary, *** 9989,9995 **** - LIST is non static. It's invocation is transformed from x(a1,....,an) into access$(this$,a1,...,an). - LIST is static. It's invocation is transformed from ! x(a1,....,an) into TYPEOF(this$).x(a1,....an). Of course, this$ can be abitrary complex, ranging from this$0 (the immediate outer context) to --- 10364,10370 ---- - LIST is non static. It's invocation is transformed from x(a1,....,an) into access$(this$,a1,...,an). - LIST is static. It's invocation is transformed from ! x(a1,....,an) into TYPE_OF(this$).x(a1,....an). Of course, this$ can be abitrary complex, ranging from this$0 (the immediate outer context) to *************** patch_method_invocation (patch, primary, *** 9999,10005 **** this_arg has to be moved into the (then generated) stub argument list. In the meantime, the selected function might have be replaced by a generated stub. */ ! if (maybe_use_access_method (is_super_init, &list, &this_arg)) { args = tree_cons (NULL_TREE, this_arg, args); this_arg = NULL_TREE; /* So it doesn't get chained twice */ --- 10374,10381 ---- this_arg has to be moved into the (then generated) stub argument list. In the meantime, the selected function might have be replaced by a generated stub. */ ! if (!primary && ! maybe_use_access_method (is_super_init, &list, &this_arg)) { args = tree_cons (NULL_TREE, this_arg, args); this_arg = NULL_TREE; /* So it doesn't get chained twice */ *************** patch_method_invocation (patch, primary, *** 10020,10031 **** /* Calls to clone() on array types are permitted as a special-case. */ && !is_array_clone_call) { ! char *fct_name = (char *) IDENTIFIER_POINTER (DECL_NAME (list)); ! char *access = java_accstring_lookup (get_access_flags_from_decl (list)); ! char *klass = (char *) IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list)))); ! char *refklass = (char *) IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))); ! char *what = (char *) (DECL_CONSTRUCTOR_P (list) ! ? "constructor" : "method"); /* FIXME: WFL yields the wrong message here but I don't know what else to use. */ parse_error_context (wfl, --- 10396,10410 ---- /* Calls to clone() on array types are permitted as a special-case. */ && !is_array_clone_call) { ! const char *const fct_name = IDENTIFIER_POINTER (DECL_NAME (list)); ! const char *const access = ! java_accstring_lookup (get_access_flags_from_decl (list)); ! const char *const klass = ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (DECL_CONTEXT (list)))); ! const char *const refklass = ! IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))); ! const char *const what = (DECL_CONSTRUCTOR_P (list) ! ? "constructor" : "method"); /* FIXME: WFL yields the wrong message here but I don't know what else to use. */ parse_error_context (wfl, *************** patch_method_invocation (patch, primary, *** 10033,10039 **** access, what, klass, fct_name, refklass); PATCH_METHOD_RETURN_ERROR (); } ! check_deprecation (wfl, list); /* If invoking a innerclass constructor, there are hidden parameters to pass */ --- 10412,10424 ---- access, what, klass, fct_name, refklass); PATCH_METHOD_RETURN_ERROR (); } ! ! /* Deprecation check: check whether the method being invoked or the ! instance-being-created's type are deprecated. */ ! if (TREE_CODE (patch) == NEW_CLASS_EXPR) ! check_deprecation (wfl, TYPE_NAME (DECL_CONTEXT (list))); ! else ! check_deprecation (wfl, list); /* If invoking a innerclass constructor, there are hidden parameters to pass */ *************** patch_method_invocation (patch, primary, *** 10080,10104 **** /* This handles the situation where a constructor invocation needs to have an enclosing context passed as a second parameter (the ! constructor is one of an inner class. We extract it from the ! current function. */ ! if (is_super_init && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list))) { ! tree enclosing_decl = DECL_CONTEXT (TYPE_NAME (current_class)); ! tree extra_arg; ! ! if (ANONYMOUS_CLASS_P (current_class) || !DECL_CONTEXT (enclosing_decl)) ! { ! extra_arg = DECL_FUNCTION_BODY (current_function_decl); ! extra_arg = TREE_CHAIN (BLOCK_EXPR_DECLS (extra_arg)); ! } ! else ! { ! tree dest = TREE_TYPE (DECL_CONTEXT (enclosing_decl)); ! extra_arg = ! build_access_to_thisn (TREE_TYPE (enclosing_decl), dest, 0); ! extra_arg = java_complete_tree (extra_arg); ! } args = tree_cons (NULL_TREE, extra_arg, args); } --- 10465,10479 ---- /* This handles the situation where a constructor invocation needs to have an enclosing context passed as a second parameter (the ! constructor is one of an inner class). */ ! if ((is_super_init || ! (TREE_CODE (patch) == CALL_EXPR && name == this_identifier_node)) ! && PURE_INNER_CLASS_TYPE_P (DECL_CONTEXT (list))) { ! tree dest = TYPE_NAME (DECL_CONTEXT (list)); ! tree extra_arg = ! build_access_to_thisn (current_class, DECL_CONTEXT (dest), 0); ! extra_arg = java_complete_tree (extra_arg); args = tree_cons (NULL_TREE, extra_arg, args); } *************** patch_method_invocation (patch, primary, *** 10126,10131 **** --- 10501,10508 ---- if (ret_decl) *ret_decl = list; patch = patch_invoke (patch, list, args); + + /* Now is a good time to insert the call to finit$ */ if (is_super_init && CLASS_HAS_FINIT_P (current_class)) { tree finit_parms, finit_call; *************** patch_method_invocation (patch, primary, *** 10141,10149 **** /* Generate the code used to initialize fields declared with an initialization statement and build a compound statement along with the super constructor invocation. */ patch = build (COMPOUND_EXPR, void_type_node, patch, java_complete_tree (finit_call)); - CAN_COMPLETE_NORMALLY (patch) = 1; } return patch; } --- 10518,10526 ---- /* Generate the code used to initialize fields declared with an initialization statement and build a compound statement along with the super constructor invocation. */ + CAN_COMPLETE_NORMALLY (patch) = 1; patch = build (COMPOUND_EXPR, void_type_node, patch, java_complete_tree (finit_call)); } return patch; } *************** maybe_use_access_method (is_super_init, *** 10187,10193 **** if (is_super_init || DECL_CONTEXT (md) == current_class || !PURE_INNER_CLASS_TYPE_P (current_class) ! || DECL_FINIT_P (md)) return 0; /* If we're calling a method found in an enclosing class, generate --- 10564,10571 ---- if (is_super_init || DECL_CONTEXT (md) == current_class || !PURE_INNER_CLASS_TYPE_P (current_class) ! || DECL_FINIT_P (md) ! || DECL_INSTINIT_P (md)) return 0; /* If we're calling a method found in an enclosing class, generate *************** patch_invoke (patch, method, args) *** 10249,10255 **** { tree dtable, func; tree original_call, t, ta; ! tree cond = NULL_TREE; /* Last step for args: convert build-in types. If we're dealing with a new TYPE() type call, the first argument to the constructor --- 10627,10633 ---- { tree dtable, func; tree original_call, t, ta; ! tree check = NULL_TREE; /* Last step for args: convert build-in types. If we're dealing with a new TYPE() type call, the first argument to the constructor *************** patch_invoke (patch, method, args) *** 10273,10279 **** func = method; else { - tree signature = build_java_signature (TREE_TYPE (method)); switch (invocation_mode (method, CALL_USING_SUPER (patch))) { case INVOKE_VIRTUAL: --- 10651,10656 ---- *************** patch_invoke (patch, method, args) *** 10288,10307 **** optimization pass to eliminate redundant checks. */ if (TREE_VALUE (args) != current_this) { ! /* We use a SAVE_EXPR here to make sure we only evaluate the new `self' expression once. */ tree save_arg = save_expr (TREE_VALUE (args)); TREE_VALUE (args) = save_arg; ! cond = build (EQ_EXPR, boolean_type_node, save_arg, ! null_pointer_node); } /* Fall through. */ case INVOKE_SUPER: case INVOKE_STATIC: ! func = build_known_method_ref (method, TREE_TYPE (method), ! DECL_CONTEXT (method), ! signature, args); break; case INVOKE_INTERFACE: --- 10665,10686 ---- optimization pass to eliminate redundant checks. */ if (TREE_VALUE (args) != current_this) { ! /* We use a save_expr here to make sure we only evaluate the new `self' expression once. */ tree save_arg = save_expr (TREE_VALUE (args)); TREE_VALUE (args) = save_arg; ! check = java_check_reference (save_arg, 1); } /* Fall through. */ case INVOKE_SUPER: case INVOKE_STATIC: ! { ! tree signature = build_java_signature (TREE_TYPE (method)); ! func = build_known_method_ref (method, TREE_TYPE (method), ! DECL_CONTEXT (method), ! signature, args); ! } break; case INVOKE_INTERFACE: *************** patch_invoke (patch, method, args) *** 10320,10325 **** --- 10699,10705 ---- TREE_TYPE (patch) = TREE_TYPE (TREE_TYPE (method)); TREE_OPERAND (patch, 0) = func; TREE_OPERAND (patch, 1) = args; + patch = check_for_builtin (method, patch); original_call = patch; /* We're processing a `new TYPE ()' form. New is called and its *************** patch_invoke (patch, method, args) *** 10331,10336 **** --- 10711,10718 ---- { tree class = DECL_CONTEXT (method); tree c1, saved_new, size, new; + tree alloc_node; + if (flag_emit_class_files || flag_emit_xref) { TREE_TYPE (patch) = build_pointer_type (class); *************** patch_invoke (patch, method, args) *** 10339,10346 **** if (!TYPE_SIZE (class)) safe_layout_class (class); size = size_in_bytes (class); new = build (CALL_EXPR, promote_type (class), ! build_address_of (alloc_object_node), tree_cons (NULL_TREE, build_class_ref (class), build_tree_list (NULL_TREE, size_in_bytes (class))), --- 10721,10731 ---- if (!TYPE_SIZE (class)) safe_layout_class (class); size = size_in_bytes (class); + alloc_node = + (class_has_finalize_method (class) ? alloc_object_node + : alloc_no_finalizer_node); new = build (CALL_EXPR, promote_type (class), ! build_address_of (alloc_node), tree_cons (NULL_TREE, build_class_ref (class), build_tree_list (NULL_TREE, size_in_bytes (class))), *************** patch_invoke (patch, method, args) *** 10353,10377 **** patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new); } ! /* If COND is set, then we are building a check to see if the object is NULL. */ ! if (cond != NULL_TREE) { ! /* We have to make the `then' branch a compound expression to ! make the types turn out right. This seems bizarre. */ ! patch = build (COND_EXPR, TREE_TYPE (patch), cond, ! build (COMPOUND_EXPR, TREE_TYPE (patch), ! build (CALL_EXPR, void_type_node, ! build_address_of (soft_nullpointer_node), ! NULL_TREE, NULL_TREE), ! (FLOAT_TYPE_P (TREE_TYPE (patch)) ! ? build_real (TREE_TYPE (patch), dconst0) ! : build1 (CONVERT_EXPR, TREE_TYPE (patch), ! integer_zero_node))), ! patch); TREE_SIDE_EFFECTS (patch) = 1; } return patch; } --- 10738,10775 ---- patch = build (COMPOUND_EXPR, TREE_TYPE (new), patch, saved_new); } ! /* If CHECK is set, then we are building a check to see if the object is NULL. */ ! if (check != NULL_TREE) { ! patch = build (COMPOUND_EXPR, TREE_TYPE (patch), check, patch); TREE_SIDE_EFFECTS (patch) = 1; } + /* In order to be able to modify PATCH later, we SAVE_EXPR it and + put it as the first expression of a COMPOUND_EXPR. The second + expression being an empty statement to be later patched if + necessary. We remember a TREE_LIST (the PURPOSE is the method, + the VALUE is the compound) in a hashtable and return a + COMPOUND_EXPR built so that the result of the evaluation of the + original PATCH node is returned. */ + if (STATIC_CLASS_INIT_OPT_P () + && current_function_decl && METHOD_STATIC (method)) + { + tree list; + tree fndecl = current_function_decl; + tree save = save_expr (patch); + tree type = TREE_TYPE (patch); + + patch = build (COMPOUND_EXPR, type, save, empty_stmt_node); + list = tree_cons (method, patch, + DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl)); + + DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = list; + + patch = build (COMPOUND_EXPR, type, patch, save); + } + return patch; } *************** lookup_method_invoke (lc, cl, class, nam *** 10437,10443 **** know the arguments' types. */ if (lc && ANONYMOUS_CLASS_P (class)) ! craft_constructor (TYPE_NAME (class), atl); /* Find all candidates and then refine the list, searching for the most specific method. */ --- 10835,10848 ---- know the arguments' types. */ if (lc && ANONYMOUS_CLASS_P (class)) ! { ! tree saved_current_class; ! tree mdecl = craft_constructor (TYPE_NAME (class), atl); ! saved_current_class = current_class; ! current_class = class; ! fix_constructors (mdecl); ! current_class = saved_current_class; ! } /* Find all candidates and then refine the list, searching for the most specific method. */ *************** find_applicable_accessible_methods_list *** 10546,10555 **** search_applicable_methods_list (lc, TYPE_METHODS (class), name, arglist, &list, &all_list); ! /* When looking finit$ or class$, we turn LC to 1 so that we ! only search in class. Note that we should have found something at this point. */ ! if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name)) { lc = 1; if (!list) --- 10951,10960 ---- search_applicable_methods_list (lc, TYPE_METHODS (class), name, arglist, &list, &all_list); ! /* When looking finit$, class$ or instinit$, we turn LC to 1 so ! that we only search in class. Note that we should have found something at this point. */ ! if (ID_FINIT_P (name) || ID_CLASSDOLLAR_P (name) || ID_INSTINIT_P (name)) { lc = 1; if (!list) *************** qualify_ambiguous_name (id) *** 10814,10820 **** { case CALL_EXPR: qual_wfl = TREE_OPERAND (qual_wfl, 0); ! if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION) { qual = EXPR_WFL_QUALIFICATION (qual_wfl); qual_wfl = QUAL_WFL (qual); --- 11219,11227 ---- { case CALL_EXPR: qual_wfl = TREE_OPERAND (qual_wfl, 0); ! if (TREE_CODE (qual_wfl) != EXPR_WITH_FILE_LOCATION ! || (EXPR_WFL_QUALIFICATION (qual_wfl) ! && TREE_CODE (EXPR_WFL_QUALIFICATION (qual_wfl)) == TREE_LIST)) { qual = EXPR_WFL_QUALIFICATION (qual_wfl); qual_wfl = QUAL_WFL (qual); *************** qualify_ambiguous_name (id) *** 10858,10868 **** else if (code == INTEGER_CST) name = qual_wfl; ! else if (code == CONVERT_EXPR && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = TREE_OPERAND (qual_wfl, 0); ! else if ((code == ARRAY_REF || code == CALL_EXPR || code == MODIFY_EXPR) && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = EXPR_WFL_NODE (TREE_OPERAND (qual_wfl, 0)); --- 11265,11281 ---- else if (code == INTEGER_CST) name = qual_wfl; ! else if (code == CONVERT_EXPR && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = TREE_OPERAND (qual_wfl, 0); ! ! else if (code == CONVERT_EXPR ! && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == CALL_EXPR ! && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (qual_wfl, 0), 0)) ! == EXPR_WITH_FILE_LOCATION)) ! name = TREE_OPERAND (TREE_OPERAND (qual_wfl, 0), 0); ! else if ((code == ARRAY_REF || code == CALL_EXPR || code == MODIFY_EXPR) && TREE_CODE (TREE_OPERAND (qual_wfl, 0)) == EXPR_WITH_FILE_LOCATION) name = EXPR_WFL_NODE (TREE_OPERAND (qual_wfl, 0)); *************** qualify_ambiguous_name (id) *** 10960,10968 **** of the compilation unit containing NAME, - NAME is declared by exactly on type-import-on-demand declaration of the compilation unit containing NAME. ! - NAME is actually a STRING_CST. */ ! else if (TREE_CODE (name) == STRING_CST || TREE_CODE (name) == INTEGER_CST ! || (decl = resolve_and_layout (name, NULL_TREE))) { RESOLVE_TYPE_NAME_P (qual_wfl) = 1; QUAL_RESOLUTION (qual) = decl; --- 11373,11384 ---- of the compilation unit containing NAME, - NAME is declared by exactly on type-import-on-demand declaration of the compilation unit containing NAME. ! - NAME is actually a STRING_CST. ! This can't happen if the expression was qualified by `this.' */ ! else if (! this_found && ! (TREE_CODE (name) == STRING_CST || ! TREE_CODE (name) == INTEGER_CST || ! (decl = resolve_and_layout (name, NULL_TREE)))) { RESOLVE_TYPE_NAME_P (qual_wfl) = 1; QUAL_RESOLUTION (qual) = decl; *************** java_complete_tree (node) *** 11082,11098 **** DECL_INITIAL (node) = value; if (value != NULL_TREE) { ! /* fold_constant_for_init sometimes widen the original type ! of the constant (i.e. byte to int.) It's not desirable, especially if NODE is a function argument. */ ! if (TREE_CODE (value) == INTEGER_CST && TREE_TYPE (node) != TREE_TYPE (value)) return convert (TREE_TYPE (node), value); else return value; } - else - DECL_FIELD_FINAL_IUD (node) = 0; } return node; } --- 11498,11513 ---- DECL_INITIAL (node) = value; if (value != NULL_TREE) { ! /* fold_constant_for_init sometimes widens the original type ! of the constant (i.e. byte to int). It's not desirable, especially if NODE is a function argument. */ ! if ((TREE_CODE (value) == INTEGER_CST ! || TREE_CODE (value) == REAL_CST) && TREE_TYPE (node) != TREE_TYPE (value)) return convert (TREE_TYPE (node), value); else return value; } } return node; } *************** java_complete_lhs (node) *** 11248,11268 **** TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 0)); return node; - case CLEANUP_POINT_EXPR: - COMPLETE_CHECK_OP_0 (node); - TREE_TYPE (node) = void_type_node; - CAN_COMPLETE_NORMALLY (node) = - CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0)); - return node; - - case WITH_CLEANUP_EXPR: - COMPLETE_CHECK_OP_0 (node); - COMPLETE_CHECK_OP_2 (node); - CAN_COMPLETE_NORMALLY (node) = - CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0)); - TREE_TYPE (node) = void_type_node; - return node; - case LABELED_BLOCK_EXPR: PUSH_LABELED_BLOCK (node); if (LABELED_BLOCK_BODY (node)) --- 11663,11668 ---- *************** java_complete_lhs (node) *** 11300,11305 **** --- 11700,11708 ---- cn = fold_constant_for_init (DECL_INITIAL (TREE_OPERAND (cn, 1)), TREE_OPERAND (cn, 1)); } + /* Accept final locals too. */ + else if (TREE_CODE (cn) == VAR_DECL && DECL_FINAL (cn)) + cn = fold_constant_for_init (DECL_INITIAL (cn), cn); if (!TREE_CONSTANT (cn) && !flag_emit_xref) { *************** java_complete_lhs (node) *** 11323,11332 **** } cn = fold (convert (int_type_node, cn)); ! /* Multiple instance of a case label bearing the same ! value is checked during code generation. The case ! expression is allright so far. */ if (TREE_CODE (cn) == VAR_DECL) cn = DECL_INITIAL (cn); TREE_OPERAND (node, 0) = cn; --- 11726,11740 ---- } cn = fold (convert (int_type_node, cn)); + TREE_CONSTANT_OVERFLOW (cn) = 0; + CAN_COMPLETE_NORMALLY (cn) = 1; ! /* Save the label on a list so that we can later check for ! duplicates. */ ! case_label_list = tree_cons (node, cn, case_label_list); ! ! /* Multiple instance of a case label bearing the same value is ! checked later. The case expression is all right so far. */ if (TREE_CODE (cn) == VAR_DECL) cn = DECL_INITIAL (cn); TREE_OPERAND (node, 0) = cn; *************** java_complete_lhs (node) *** 11438,11445 **** TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); if (TREE_OPERAND (node, 1) == error_mark_node) return error_mark_node; CAN_COMPLETE_NORMALLY (node) ! = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)); } TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1)); break; --- 11846,11857 ---- TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); if (TREE_OPERAND (node, 1) == error_mark_node) return error_mark_node; + /* Even though we might allow the case where the first + operand doesn't return normally, we still should compute + CAN_COMPLETE_NORMALLY correctly. */ CAN_COMPLETE_NORMALLY (node) ! = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 0)) ! && CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1))); } TREE_TYPE (node) = TREE_TYPE (TREE_OPERAND (node, 1)); break; *************** java_complete_lhs (node) *** 11580,11596 **** value = fold_constant_for_init (nn, nn); ! if (value != NULL_TREE) { ! tree type = TREE_TYPE (value); ! if (JPRIMITIVE_TYPE_P (type) || ! (type == string_ptr_type_node && ! flag_emit_class_files)) ! return empty_stmt_node; } if (! flag_emit_class_files) DECL_INITIAL (nn) = NULL_TREE; - if (CLASS_FINAL_VARIABLE_P (nn)) - DECL_FIELD_FINAL_IUD (nn) = 0; } wfl_op2 = TREE_OPERAND (node, 1); --- 11992,12026 ---- value = fold_constant_for_init (nn, nn); ! /* When we have a primitype type, or a string and we're not ! emitting a class file, we actually don't want to generate ! anything for the assignment. */ ! if (value != NULL_TREE && ! (JPRIMITIVE_TYPE_P (TREE_TYPE (value)) || ! (TREE_TYPE (value) == string_ptr_type_node && ! ! flag_emit_class_files))) { ! /* Prepare node for patch_assignment */ ! TREE_OPERAND (node, 1) = value; ! /* Call patch assignment to verify the assignment */ ! if (patch_assignment (node, wfl_op1) == error_mark_node) ! return error_mark_node; ! /* Set DECL_INITIAL properly (a conversion might have ! been decided by patch_assignment) and return the ! empty statement. */ ! else ! { ! tree patched = patch_string (TREE_OPERAND (node, 1)); ! if (patched) ! DECL_INITIAL (nn) = patched; ! else ! DECL_INITIAL (nn) = TREE_OPERAND (node, 1); ! DECL_FIELD_FINAL_IUD (nn) = 1; ! return empty_stmt_node; ! } } if (! flag_emit_class_files) DECL_INITIAL (nn) = NULL_TREE; } wfl_op2 = TREE_OPERAND (node, 1); *************** java_complete_lhs (node) *** 11668,11680 **** } else { ! node = patch_assignment (node, wfl_op1, wfl_op2); /* Reorganize the tree if necessary. */ if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node)) || JSTRING_P (TREE_TYPE (node)))) node = java_refold (node); } ! CAN_COMPLETE_NORMALLY (node) = 1; return node; --- 12098,12123 ---- } else { ! node = patch_assignment (node, wfl_op1); ! if (node == error_mark_node) ! return error_mark_node; /* Reorganize the tree if necessary. */ if (flag && (!JREFERENCE_TYPE_P (TREE_TYPE (node)) || JSTRING_P (TREE_TYPE (node)))) node = java_refold (node); } ! ! /* Seek to set DECL_INITIAL to a proper value, since it might have ! undergone a conversion in patch_assignment. We do that only when ! it's necessary to have DECL_INITIAL properly set. */ ! nn = TREE_OPERAND (node, 0); ! if (TREE_CODE (nn) == VAR_DECL ! && DECL_INITIAL (nn) && CONSTANT_VALUE_P (DECL_INITIAL (nn)) ! && FIELD_STATIC (nn) && FIELD_FINAL (nn) ! && (JPRIMITIVE_TYPE_P (TREE_TYPE (nn)) ! || TREE_TYPE (nn) == string_ptr_type_node)) ! DECL_INITIAL (nn) = TREE_OPERAND (node, 1); ! CAN_COMPLETE_NORMALLY (node) = 1; return node; *************** java_complete_lhs (node) *** 11825,11840 **** return error_mark_node; break; - case INSTANCE_INITIALIZERS_EXPR: - in_instance_initializer++; - node = java_complete_tree (TREE_OPERAND (node, 0)); - in_instance_initializer--; - if (node != error_mark_node) - TREE_TYPE (node) = void_type_node; - else - return error_mark_node; - break; - default: CAN_COMPLETE_NORMALLY (node) = 1; /* Ok: may be we have a STRING_CST or a crafted `StringBuffer' --- 12268,12273 ---- *************** complete_function_arguments (node) *** 11873,11880 **** `+' operator. Build `parm.toString()' and expand it. */ if ((temp = patch_string (parm))) parm = temp; - /* Inline PRIMTYPE.TYPE read access */ - parm = maybe_build_primttype_type_ref (parm, wfl); TREE_VALUE (cn) = parm; } --- 12306,12311 ---- *************** build_expr_block (body, decls) *** 11913,11919 **** return node; } ! /* Create a new function block and link it approriately to current function block chain */ static tree --- 12344,12350 ---- return node; } ! /* Create a new function block and link it appropriately to current function block chain */ static tree *************** print_int_node (node) *** 12151,12462 **** } - - /* This section of the code handle assignment check with FINAL - variables. */ - - static void - reset_static_final_variable_assignment_flag (class) - tree class; - { - tree field; - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (CLASS_FINAL_VARIABLE_P (field)) - DECL_FIELD_FINAL_LIIC (field) = 0; - } - - /* Figure whether all final static variable have been initialized. */ - - static void - check_static_final_variable_assignment_flag (class) - tree class; - { - tree field; - - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (CLASS_FINAL_VARIABLE_P (field) - && !DECL_FIELD_FINAL_IUD (field) && !DECL_FIELD_FINAL_LIIC (field)) - parse_error_context - (DECL_FIELD_FINAL_WFL (field), - "Blank static final variable `%s' may not have been initialized", - IDENTIFIER_POINTER (DECL_NAME (field))); - } - - /* This function marks all final variable locally unassigned. */ - - static void - reset_final_variable_local_assignment_flag (class) - tree class; - { - tree field; - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FINAL_VARIABLE_P (field)) - DECL_FIELD_FINAL_LIIC (field) = 0; - } - - /* Figure whether all final variables have beem initialized in MDECL - and mark MDECL accordingly. */ - - static void - check_final_variable_local_assignment_flag (class, mdecl) - tree class; - tree mdecl; - { - tree field; - int initialized = 0; - int non_initialized = 0; - - if (DECL_FUNCTION_SYNTHETIC_CTOR (mdecl)) - return; - - /* First find out whether all final variables or no final variable - are initialized in this ctor. We don't take into account final - variable that have been initialized upon declaration. */ - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FINAL_VARIABLE_P (field) && !DECL_FIELD_FINAL_IUD (field)) - { - if (DECL_FIELD_FINAL_LIIC (field)) - initialized++; - else - non_initialized++; - } - - /* There were no non initialized variable and no initialized variable. - This ctor is fine. */ - if (!non_initialized && !initialized) - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 1; - /* If no variables have been initialized, that fine. We'll check - later whether this ctor calls a constructor which initializes - them. We mark the ctor as not initializing all its finals. */ - else if (initialized == 0) - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 0; - /* If we have a mixed bag, then we have a problem. We need to report - all the variables we're not initializing. */ - else if (initialized && non_initialized) - { - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 0; - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FIELD_FINAL (field) - && !DECL_FIELD_FINAL_IUD (field) && !DECL_FIELD_FINAL_LIIC (field)) - { - parse_error_context - (lookup_cl (mdecl), - "Blank final variable `%s' may not have been initialized in this constructor", - IDENTIFIER_POINTER (DECL_NAME (field))); - DECL_FIELD_FINAL_IERR (field) = 1; - } - } - /* Otherwise we know this ctor is initializing all its final - variable. We mark it so. */ - else - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 1; - } - - /* This function recurses in a simple what through STMT and stops when - it finds a constructor call. It then verifies that the called - constructor initialized its final properly. Return 1 upon success, - 0 or -1 otherwise. */ - - static int - check_final_variable_indirect_assignment (stmt) - tree stmt; - { - int res; - switch (TREE_CODE (stmt)) - { - case EXPR_WITH_FILE_LOCATION: - return check_final_variable_indirect_assignment (EXPR_WFL_NODE (stmt)); - case COMPOUND_EXPR: - res = check_final_variable_indirect_assignment (TREE_OPERAND (stmt, 0)); - if (res) - return res; - return check_final_variable_indirect_assignment (TREE_OPERAND (stmt, 1)); - case SAVE_EXPR: - return check_final_variable_indirect_assignment (TREE_OPERAND (stmt, 0)); - case CALL_EXPR: - { - tree decl = TREE_OPERAND (stmt, 0); - tree fbody; - - if (TREE_CODE (decl) != FUNCTION_DECL) - decl = TREE_OPERAND (TREE_OPERAND (decl, 0), 0); - if (TREE_CODE (decl) != FUNCTION_DECL) - abort (); - if (DECL_FUNCTION_ALL_FINAL_INITIALIZED (decl)) - return 1; - if (DECL_FINIT_P (decl) || DECL_CONTEXT (decl) != current_class) - return -1; - fbody = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (decl)); - if (fbody == error_mark_node) - return -1; - fbody = BLOCK_EXPR_BODY (fbody); - return check_final_variable_indirect_assignment (fbody); - } - default: - break; - } - return 0; - } - - /* This is the last chance to catch a final variable initialization - problem. This routine will report an error if a final variable was - never (globally) initialized and never reported as not having been - initialized properly. */ - - static void - check_final_variable_global_assignment_flag (class) - tree class; - { - tree field, mdecl; - int nnctor = 0; - - /* We go through all natural ctors and see whether they're - initializing all their final variables or not. */ - current_function_decl = NULL_TREE; /* For the error report. */ - for (mdecl = TYPE_METHODS (class); mdecl; mdecl = TREE_CHAIN (mdecl)) - if (DECL_CONSTRUCTOR_P (mdecl) && ! DECL_FUNCTION_SYNTHETIC_CTOR (mdecl)) - { - if (!DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl)) - { - /* It doesn't. Maybe it calls a constructor that initializes - them. find out. */ - tree fbody = BLOCK_EXPR_BODY (DECL_FUNCTION_BODY (mdecl)); - if (fbody == error_mark_node) - continue; - fbody = BLOCK_EXPR_BODY (fbody); - if (check_final_variable_indirect_assignment (fbody) == 1) - { - DECL_FUNCTION_ALL_FINAL_INITIALIZED (mdecl) = 1; - nnctor++; - } - else - parse_error_context - (lookup_cl (mdecl), - "Final variable initialization error in this constructor"); - } - else - nnctor++; - } - - /* Finally we catch final variables that never were initialized */ - for (field = TYPE_FIELDS (class); field; field = TREE_CHAIN (field)) - if (FINAL_VARIABLE_P (field) - /* If the field wasn't initialized upon declaration */ - && !DECL_FIELD_FINAL_IUD (field) - /* There wasn't natural ctor in which the field could have been - initialized */ - && !nnctor - /* If we never reported a problem with this field */ - && !DECL_FIELD_FINAL_IERR (field)) - { - current_function_decl = NULL; - parse_error_context - (DECL_FIELD_FINAL_WFL (field), - "Final variable `%s' hasn't been initialized upon its declaration", - IDENTIFIER_POINTER (DECL_NAME (field))); - } - - } - /* Return 1 if an assignment to a FINAL is attempted in a non suitable context. */ - static int - check_final_assignment (lvalue, wfl) - tree lvalue, wfl; - { - if (TREE_CODE (lvalue) != COMPONENT_REF && !JDECL_P (lvalue)) - return 0; - - if (TREE_CODE (lvalue) == COMPONENT_REF - && JDECL_P (TREE_OPERAND (lvalue, 1))) - lvalue = TREE_OPERAND (lvalue, 1); - - if (!FIELD_FINAL (lvalue)) - return 0; - - /* Now the logic. We can modify a final VARIABLE: - 1) in finit$, (its declaration was followed by an initialization,) - 2) consistently in each natural ctor, if it wasn't initialized in - finit$ or once in . In any other cases, an error should be - reported. */ - if (DECL_FINIT_P (current_function_decl)) - { - DECL_FIELD_FINAL_IUD (lvalue) = 1; - return 0; - } - - if (!DECL_FUNCTION_SYNTHETIC_CTOR (current_function_decl) - /* Only if it wasn't given a value upon initialization */ - && DECL_LANG_SPECIFIC (lvalue) && !DECL_FIELD_FINAL_IUD (lvalue) - /* If it was never assigned a value in this constructor */ - && !DECL_FIELD_FINAL_LIIC (lvalue)) - { - /* Turn the locally assigned flag on, it will be checked later - on to point out at discrepancies. */ - DECL_FIELD_FINAL_LIIC (lvalue) = 1; - if (DECL_CLINIT_P (current_function_decl)) - DECL_FIELD_FINAL_IUD (lvalue) = 1; - return 0; - } - - /* Other problems should be reported right away. */ - parse_error_context - (wfl, "Can't %sassign a value to the final variable `%s'", - (FIELD_STATIC (lvalue) ? "re" : ""), - IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl))); - - /* Note that static field can be initialized once and only once. */ - if (FIELD_STATIC (lvalue)) - DECL_FIELD_FINAL_IERR (lvalue) = 1; - - return 1; - } - - /* Inline references to java.lang.PRIMTYPE.TYPE when accessed in - read. This is needed to avoid circularities in the implementation - of these fields in libjava. */ - - static tree - maybe_build_primttype_type_ref (rhs, wfl) - tree rhs, wfl; - { - tree to_return = NULL_TREE; - tree rhs_type = TREE_TYPE (rhs); - if (TREE_CODE (rhs) == COMPOUND_EXPR) - { - tree n = TREE_OPERAND (rhs, 1); - if (TREE_CODE (n) == VAR_DECL - && DECL_NAME (n) == TYPE_identifier_node - && rhs_type == class_ptr_type - && TREE_CODE (wfl) == EXPR_WITH_FILE_LOCATION - && TREE_CODE (EXPR_WFL_NODE (wfl)) == IDENTIFIER_NODE) - { - const char *self_name = IDENTIFIER_POINTER (EXPR_WFL_NODE (wfl)); - if (!strncmp (self_name, "java.lang.", 10)) - to_return = build_primtype_type_ref (self_name); - } - } - return (to_return ? to_return : rhs ); - } - /* 15.25 Assignment operators. */ static tree ! patch_assignment (node, wfl_op1, wfl_op2) tree node; tree wfl_op1; - tree wfl_op2; { tree rhs = TREE_OPERAND (node, 1); tree lvalue = TREE_OPERAND (node, 0), llvalue; tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE; int error_found = 0; int lvalue_from_array = 0; ! ! /* Can't assign to a (blank) final. */ ! if (check_final_assignment (lvalue, wfl_op1)) ! error_found = 1; EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node); --- 12582,12603 ---- } /* Return 1 if an assignment to a FINAL is attempted in a non suitable context. */ /* 15.25 Assignment operators. */ static tree ! patch_assignment (node, wfl_op1) tree node; tree wfl_op1; { tree rhs = TREE_OPERAND (node, 1); tree lvalue = TREE_OPERAND (node, 0), llvalue; tree lhs_type = NULL_TREE, rhs_type, new_rhs = NULL_TREE; int error_found = 0; int lvalue_from_array = 0; ! int is_return = 0; EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node); *************** patch_assignment (node, wfl_op1, wfl_op2 *** 12465,12473 **** { lhs_type = TREE_TYPE (lvalue); } ! /* Or Lhs can be a array acccess. Should that be lvalue ? FIXME + ! comment on reason why */ ! else if (TREE_CODE (wfl_op1) == ARRAY_REF) { lhs_type = TREE_TYPE (lvalue); lvalue_from_array = 1; --- 12606,12613 ---- { lhs_type = TREE_TYPE (lvalue); } ! /* Or Lhs can be an array access. */ ! else if (TREE_CODE (lvalue) == ARRAY_REF) { lhs_type = TREE_TYPE (lvalue); lvalue_from_array = 1; *************** patch_assignment (node, wfl_op1, wfl_op2 *** 12477,12497 **** lhs_type = TREE_TYPE (lvalue); /* Or a function return slot */ else if (TREE_CODE (lvalue) == RESULT_DECL) ! lhs_type = TREE_TYPE (lvalue); /* Otherwise, we might want to try to write into an optimized static final, this is an of a different nature, reported further on. */ else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION && resolve_expression_name (wfl_op1, &llvalue)) { ! if (!error_found && check_final_assignment (llvalue, wfl_op1)) ! { ! /* What we should do instead is resetting the all the flags ! previously set, exchange lvalue for llvalue and continue. */ ! error_found = 1; ! return error_mark_node; ! } ! else ! lhs_type = TREE_TYPE (lvalue); } else { --- 12617,12637 ---- lhs_type = TREE_TYPE (lvalue); /* Or a function return slot */ else if (TREE_CODE (lvalue) == RESULT_DECL) ! { ! /* If the return type is an integral type, then we create the ! RESULT_DECL with a promoted type, but we need to do these ! checks against the unpromoted type to ensure type safety. So ! here we look at the real type, not the type of the decl we ! are modifying. */ ! lhs_type = TREE_TYPE (TREE_TYPE (current_function_decl)); ! is_return = 1; ! } /* Otherwise, we might want to try to write into an optimized static final, this is an of a different nature, reported further on. */ else if (TREE_CODE (wfl_op1) == EXPR_WITH_FILE_LOCATION && resolve_expression_name (wfl_op1, &llvalue)) { ! lhs_type = TREE_TYPE (lvalue); } else { *************** patch_assignment (node, wfl_op1, wfl_op2 *** 12500,12505 **** --- 12640,12646 ---- } rhs_type = TREE_TYPE (rhs); + /* 5.1 Try the assignment conversion for builtin type. */ new_rhs = try_builtin_assignconv (wfl_op1, lhs_type, rhs); *************** patch_assignment (node, wfl_op1, wfl_op2 *** 12537,12543 **** wfl = wfl_operator; if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1))) strcpy (operation, "assignment"); ! else if (TREE_CODE (TREE_OPERAND (node, 0)) == RESULT_DECL) strcpy (operation, "`return'"); else strcpy (operation, "`='"); --- 12678,12684 ---- wfl = wfl_operator; if (COMPOUND_ASSIGN_P (TREE_OPERAND (node, 1))) strcpy (operation, "assignment"); ! else if (is_return) strcpy (operation, "`return'"); else strcpy (operation, "`='"); *************** patch_assignment (node, wfl_op1, wfl_op2 *** 12554,12645 **** error_found = 1; } - /* Inline read access to java.lang.PRIMTYPE.TYPE */ - if (new_rhs) - new_rhs = maybe_build_primttype_type_ref (new_rhs, wfl_op2); - if (error_found) return error_mark_node; /* 10.10: Array Store Exception runtime check */ if (!flag_emit_class_files && !flag_emit_xref && lvalue_from_array && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type))) { ! tree check; ! tree base = lvalue; ! ! /* We need to retrieve the right argument for _Jv_CheckArrayStore */ ! if (TREE_CODE (lvalue) == COMPOUND_EXPR) ! base = TREE_OPERAND (lvalue, 0); ! else ! { ! tree op = TREE_OPERAND (base, 0); ! ! /* We can have a SAVE_EXPR here when doing String +=. */ ! if (TREE_CODE (op) == SAVE_EXPR) ! op = TREE_OPERAND (op, 0); ! if (flag_bounds_check) ! base = TREE_OPERAND (TREE_OPERAND (op, 1), 0); ! else ! base = TREE_OPERAND (op, 0); ! } ! ! /* Build the invocation of _Jv_CheckArrayStore */ new_rhs = save_expr (new_rhs); - check = build (CALL_EXPR, void_type_node, - build_address_of (soft_checkarraystore_node), - tree_cons (NULL_TREE, base, - build_tree_list (NULL_TREE, new_rhs)), - NULL_TREE); - TREE_SIDE_EFFECTS (check) = 1; ! /* We have to decide on an insertion point */ ! if (TREE_CODE (lvalue) == COMPOUND_EXPR) ! { ! tree t; ! if (flag_bounds_check) ! { ! t = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (lvalue, 1), 0), 0); ! TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (lvalue, 1), 0), 0) = ! build (COMPOUND_EXPR, void_type_node, t, check); ! } ! else ! TREE_OPERAND (lvalue, 1) = build (COMPOUND_EXPR, lhs_type, ! check, TREE_OPERAND (lvalue, 1)); ! } ! else if (flag_bounds_check) { ! tree hook = lvalue; ! tree compound = TREE_OPERAND (lvalue, 0); ! tree bound_check, new_compound; ! ! if (TREE_CODE (compound) == SAVE_EXPR) ! { ! compound = TREE_OPERAND (compound, 0); ! hook = TREE_OPERAND (hook, 0); ! } ! ! /* Find the array bound check, hook the original array access. */ ! bound_check = TREE_OPERAND (compound, 0); ! TREE_OPERAND (hook, 0) = TREE_OPERAND (compound, 1); ! ! /* Make sure the bound check will happen before the store check */ ! new_compound = ! build (COMPOUND_EXPR, void_type_node, bound_check, check); ! ! /* Re-assemble the augmented array access. */ ! lvalue = build (COMPOUND_EXPR, lhs_type, new_compound, lvalue); } else ! lvalue = build (COMPOUND_EXPR, lhs_type, check, lvalue); } /* Final locals can be used as case values in switch statement. Prepare them for this eventuality. */ if (TREE_CODE (lvalue) == VAR_DECL ! && LOCAL_FINAL_P (lvalue) && TREE_CONSTANT (new_rhs) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue)) && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue)) --- 12695,12746 ---- error_found = 1; } if (error_found) return error_mark_node; + /* If we're processing a `return' statement, promote the actual type + to the promoted type. */ + if (is_return) + new_rhs = convert (TREE_TYPE (lvalue), new_rhs); + /* 10.10: Array Store Exception runtime check */ if (!flag_emit_class_files && !flag_emit_xref && lvalue_from_array && JREFERENCE_TYPE_P (TYPE_ARRAY_ELEMENT (lhs_type))) { ! tree array, store_check, base, index_expr; ! ! /* Save RHS so that it doesn't get re-evaluated by the store check. */ new_rhs = save_expr (new_rhs); ! /* Get the INDIRECT_REF. */ ! array = TREE_OPERAND (TREE_OPERAND (lvalue, 0), 0); ! /* Get the array pointer expr. */ ! array = TREE_OPERAND (array, 0); ! store_check = build_java_arraystore_check (array, new_rhs); ! ! index_expr = TREE_OPERAND (lvalue, 1); ! ! if (TREE_CODE (index_expr) == COMPOUND_EXPR) { ! /* A COMPOUND_EXPR here is a bounds check. The bounds check must ! happen before the store check, so prepare to insert the store ! check within the second operand of the existing COMPOUND_EXPR. */ ! base = index_expr; } else ! base = lvalue; ! ! index_expr = TREE_OPERAND (base, 1); ! TREE_OPERAND (base, 1) = build (COMPOUND_EXPR, TREE_TYPE (index_expr), ! store_check, index_expr); } /* Final locals can be used as case values in switch statement. Prepare them for this eventuality. */ if (TREE_CODE (lvalue) == VAR_DECL ! && DECL_FINAL (lvalue) && TREE_CONSTANT (new_rhs) && IDENTIFIER_LOCAL_VALUE (DECL_NAME (lvalue)) && JINTEGRAL_TYPE_P (TREE_TYPE (lvalue)) *************** patch_assignment (node, wfl_op1, wfl_op2 *** 12656,12664 **** } /* Check that type SOURCE can be cast into type DEST. If the cast ! can't occur at all, return 0 otherwise 1. This function is used to ! produce accurate error messages on the reasons why an assignment ! failed. */ static tree try_reference_assignconv (lhs_type, rhs) --- 12757,12764 ---- } /* Check that type SOURCE can be cast into type DEST. If the cast ! can't occur at all, return NULL; otherwise, return a possibly ! modified rhs. */ static tree try_reference_assignconv (lhs_type, rhs) *************** try_builtin_assignconv (wfl_op1, lhs_typ *** 12703,12714 **** new_rhs = rhs; } - /* Zero accepted everywhere */ - else if (TREE_CODE (rhs) == INTEGER_CST - && TREE_INT_CST_HIGH (rhs) == 0 && TREE_INT_CST_LOW (rhs) == 0 - && JPRIMITIVE_TYPE_P (rhs_type)) - new_rhs = convert (lhs_type, rhs); - /* 5.1.1 Try Identity Conversion, 5.1.2 Try Widening Primitive Conversion */ else if (valid_builtin_assignconv_identity_widening_p (lhs_type, rhs_type)) --- 12803,12808 ---- *************** patch_binop (node, wfl_op1, wfl_op2) *** 13126,13132 **** tree op1_type = TREE_TYPE (op1); tree op2_type = TREE_TYPE (op2); tree prom_type = NULL_TREE, cn; ! int code = TREE_CODE (node); /* If 1, tell the routine that we have to return error_mark_node after checking for the initialization of the RHS */ --- 13220,13226 ---- tree op1_type = TREE_TYPE (op1); tree op2_type = TREE_TYPE (op2); tree prom_type = NULL_TREE, cn; ! enum tree_code code = TREE_CODE (node); /* If 1, tell the routine that we have to return error_mark_node after checking for the initialization of the RHS */ *************** patch_binop (node, wfl_op1, wfl_op2) *** 13172,13181 **** --- 13266,13300 ---- break; } prom_type = binary_numeric_promotion (op1_type, op2_type, &op1, &op2); + + /* Detect integral division by zero */ + if ((code == RDIV_EXPR || code == TRUNC_MOD_EXPR) + && TREE_CODE (prom_type) == INTEGER_TYPE + && (op2 == integer_zero_node || op2 == long_zero_node || + (TREE_CODE (op2) == INTEGER_CST && + ! TREE_INT_CST_LOW (op2) && ! TREE_INT_CST_HIGH (op2)))) + { + parse_warning_context (wfl_operator, "Evaluating this expression will result in an arithmetic exception being thrown"); + TREE_CONSTANT (node) = 0; + } + /* Change the division operator if necessary */ if (code == RDIV_EXPR && TREE_CODE (prom_type) == INTEGER_TYPE) TREE_SET_CODE (node, TRUNC_DIV_EXPR); + /* Before divisions as is disapear, try to simplify and bail if + applicable, otherwise we won't perform even simple + simplifications like (1-1)/3. We can't do that with floating + point number, folds can't handle them at this stage. */ + if (code == RDIV_EXPR && TREE_CONSTANT (op1) && TREE_CONSTANT (op2) + && JINTEGRAL_TYPE_P (op1) && JINTEGRAL_TYPE_P (op2)) + { + TREE_TYPE (node) = prom_type; + node = fold (node); + if (TREE_CODE (node) != code) + return node; + } + if (TREE_CODE (prom_type) == INTEGER_TYPE && flag_use_divide_subroutine && ! flag_emit_class_files *************** patch_binop (node, wfl_op1, wfl_op2) *** 13253,13259 **** } /* Unary numeric promotion (5.6.1) is performed on each operand ! separatly */ op1 = do_unary_numeric_promotion (op1); op2 = do_unary_numeric_promotion (op2); --- 13372,13378 ---- } /* Unary numeric promotion (5.6.1) is performed on each operand ! separately */ op1 = do_unary_numeric_promotion (op1); op2 = do_unary_numeric_promotion (op2); *************** patch_binop (node, wfl_op1, wfl_op2) *** 13382,13387 **** --- 13501,13514 ---- error_found = 1; break; } + else if (integer_zerop (op1)) + { + return code == TRUTH_ANDIF_EXPR ? op1 : op2; + } + else if (integer_onep (op1)) + { + return code == TRUTH_ANDIF_EXPR ? op2 : op1; + } /* The type of the conditional operators is BOOLEAN */ prom_type = boolean_type_node; break; *************** patch_binop (node, wfl_op1, wfl_op2) *** 13463,13468 **** --- 13590,13597 ---- } prom_type = boolean_type_node; break; + default: + abort (); } if (error_found) *************** merge_string_cste (op1, op2, after) *** 13530,13538 **** /* Reasonable integer constant can be treated right away */ if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2)) { ! static const char *boolean_true = "true"; ! static const char *boolean_false = "false"; ! static const char *null_pointer = "null"; char ch[3]; const char *string; --- 13659,13667 ---- /* Reasonable integer constant can be treated right away */ if (TREE_CODE (op2) == INTEGER_CST && !TREE_CONSTANT_OVERFLOW (op2)) { ! static const char *const boolean_true = "true"; ! static const char *const boolean_false = "false"; ! static const char *const null_pointer = "null"; char ch[3]; const char *string; *************** build_incdec (op_token, op_location, op1 *** 13748,13754 **** tree op1; int is_post_p; { ! static enum tree_code lookup [2][2] = { { PREDECREMENT_EXPR, PREINCREMENT_EXPR, }, { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, }, --- 13877,13883 ---- tree op1; int is_post_p; { ! static const enum tree_code lookup [2][2] = { { PREDECREMENT_EXPR, PREINCREMENT_EXPR, }, { POSTDECREMENT_EXPR, POSTINCREMENT_EXPR, }, *************** patch_unaryop (node, wfl_op) *** 13869,13894 **** && TREE_OPERAND (decl, 1) && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF))) { - tree lvalue; - /* Before screaming, check that we're not in fact trying to - increment a optimized static final access, in which case - we issue an different error message. */ - if (!(TREE_CODE (wfl_op) == EXPR_WITH_FILE_LOCATION - && resolve_expression_name (wfl_op, &lvalue) - && check_final_assignment (lvalue, wfl_op))) - parse_error_context (wfl_operator, "Invalid argument to `%s'", - operator_string (node)); TREE_TYPE (node) = error_mark_node; error_found = 1; } - if (check_final_assignment (op, wfl_op)) - error_found = 1; - /* From now on, we know that op if a variable and that it has a valid wfl. We use wfl_op to locate errors related to the ++/-- operand. */ ! else if (!JNUMERIC_TYPE_P (op_type)) { parse_error_context (wfl_op, "Invalid argument type `%s' to `%s'", --- 13998,14011 ---- && TREE_OPERAND (decl, 1) && (TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF))) { TREE_TYPE (node) = error_mark_node; error_found = 1; } /* From now on, we know that op if a variable and that it has a valid wfl. We use wfl_op to locate errors related to the ++/-- operand. */ ! if (!JNUMERIC_TYPE_P (op_type)) { parse_error_context (wfl_op, "Invalid argument type `%s' to `%s'", *************** patch_cast (node, wfl_op) *** 14049,14058 **** tree wfl_op; { tree op = TREE_OPERAND (node, 0); - tree op_type = TREE_TYPE (op); tree cast_type = TREE_TYPE (node); char *t1; /* First resolve OP_TYPE if unresolved */ if (!(cast_type = resolve_type_during_patch (cast_type))) return error_mark_node; --- 14166,14180 ---- tree wfl_op; { tree op = TREE_OPERAND (node, 0); tree cast_type = TREE_TYPE (node); + tree patched, op_type; char *t1; + /* Some string patching might be necessary at this stage */ + if ((patched = patch_string (op))) + TREE_OPERAND (node, 0) = op = patched; + op_type = TREE_TYPE (op); + /* First resolve OP_TYPE if unresolved */ if (!(cast_type = resolve_type_during_patch (cast_type))) return error_mark_node; *************** patch_array_ref (node) *** 14200,14215 **** TREE_OPERAND (node, 1) = index; } else ! { ! /* The save_expr is for correct evaluation order. It would be cleaner ! to use force_evaluation_order (see comment there), but that is ! difficult when we also have to deal with bounds checking. */ ! if (TREE_SIDE_EFFECTS (index)) ! array = save_expr (array); ! node = build_java_arrayaccess (array, array_type, index); ! if (TREE_SIDE_EFFECTS (index)) ! node = build (COMPOUND_EXPR, array_type, array, node); ! } TREE_TYPE (node) = array_type; return node; } --- 14322,14328 ---- TREE_OPERAND (node, 1) = index; } else ! node = build_java_arrayaccess (array, array_type, index); TREE_TYPE (node) = array_type; return node; } *************** array_constructor_check_entry (type, ent *** 14456,14462 **** /* Check and report errors */ if (!new_value) { ! const char *msg = (!valid_cast_to_p (type_value, type) ? "Can't" : "Explicit cast needed to"); if (!array_type_string) array_type_string = xstrdup (lang_printable_name (type, 1)); --- 14569,14575 ---- /* Check and report errors */ if (!new_value) { ! const char *const msg = (!valid_cast_to_p (type_value, type) ? "Can't" : "Explicit cast needed to"); if (!array_type_string) array_type_string = xstrdup (lang_printable_name (type, 1)); *************** array_constructor_check_entry (type, ent *** 14467,14476 **** } if (new_value) ! { ! new_value = maybe_build_primttype_type_ref (new_value, wfl_value); ! TREE_VALUE (entry) = new_value; ! } if (array_type_string) free (array_type_string); --- 14580,14586 ---- } if (new_value) ! TREE_VALUE (entry) = new_value; if (array_type_string) free (array_type_string); *************** patch_return (node) *** 14530,14541 **** if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth))) error_found = 2; ! if (in_instance_initializer) error_found = 1; if (error_found) { ! if (in_instance_initializer) parse_error_context (wfl_operator, "`return' inside instance initializer"); --- 14640,14651 ---- if (!return_exp && (mtype != void_type_node && !DECL_CONSTRUCTOR_P (meth))) error_found = 2; ! if (DECL_INSTINIT_P (current_function_decl)) error_found = 1; if (error_found) { ! if (DECL_INSTINIT_P (current_function_decl)) parse_error_context (wfl_operator, "`return' inside instance initializer"); *************** patch_return (node) *** 14567,14584 **** tree exp = java_complete_tree (return_exp); tree modify, patched; - /* If the function returned value and EXP are booleans, EXP has - to be converted into the type of DECL_RESULT, which is integer - (see complete_start_java_method) */ - if (TREE_TYPE (exp) == boolean_type_node && - TREE_TYPE (TREE_TYPE (meth)) == boolean_type_node) - exp = convert_to_integer (TREE_TYPE (DECL_RESULT (meth)), exp); - - /* `null' can be assigned to a function returning a reference */ - if (JREFERENCE_TYPE_P (TREE_TYPE (TREE_TYPE (meth))) && - exp == null_pointer_node) - exp = build_null_of_type (TREE_TYPE (TREE_TYPE (meth))); - if ((patched = patch_string (exp))) exp = patched; --- 14677,14682 ---- *************** patch_if_else_statement (node) *** 14620,14625 **** --- 14718,14726 ---- tree node; { tree expression = TREE_OPERAND (node, 0); + int can_complete_normally + = (CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)) + | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2))); TREE_TYPE (node) = error_mark_node; EXPR_WFL_LINECOL (wfl_operator) = EXPR_WFL_LINECOL (node); *************** patch_if_else_statement (node) *** 14635,14645 **** return error_mark_node; } TREE_TYPE (node) = void_type_node; TREE_SIDE_EFFECTS (node) = 1; ! CAN_COMPLETE_NORMALLY (node) ! = CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 1)) ! | CAN_COMPLETE_NORMALLY (TREE_OPERAND (node, 2)); return node; } --- 14736,14757 ---- return error_mark_node; } + if (TREE_CODE (expression) == INTEGER_CST) + { + if (integer_zerop (expression)) + node = TREE_OPERAND (node, 2); + else + node = TREE_OPERAND (node, 1); + if (CAN_COMPLETE_NORMALLY (node) != can_complete_normally) + { + node = build (COMPOUND_EXPR, void_type_node, node, empty_stmt_node); + CAN_COMPLETE_NORMALLY (node) = can_complete_normally; + } + return node; + } TREE_TYPE (node) = void_type_node; TREE_SIDE_EFFECTS (node) = 1; ! CAN_COMPLETE_NORMALLY (node) = can_complete_normally; return node; } *************** build_new_loop (loop_body) *** 14719,14725 **** COMPOUND_EXPR (loop main body) EXIT_EXPR (this order is for while/for loops. LABELED_BLOCK_EXPR the order is reversed for do loops) ! LABEL_DECL (a continue occuring here branches at the BODY end of this labeled block) INCREMENT (if any) --- 14831,14837 ---- COMPOUND_EXPR (loop main body) EXIT_EXPR (this order is for while/for loops. LABELED_BLOCK_EXPR the order is reversed for do loops) ! LABEL_DECL (a continue occurring here branches at the BODY end of this labeled block) INCREMENT (if any) *************** patch_switch_statement (node) *** 15020,15025 **** --- 15132,15138 ---- tree node; { tree se = TREE_OPERAND (node, 0), se_type; + tree save, iter; /* Complete the switch expression */ se = TREE_OPERAND (node, 0) = java_complete_tree (se); *************** patch_switch_statement (node) *** 15037,15044 **** --- 15150,15192 ---- return error_mark_node; } + /* Save and restore the outer case label list. */ + save = case_label_list; + case_label_list = NULL_TREE; + TREE_OPERAND (node, 1) = java_complete_tree (TREE_OPERAND (node, 1)); + /* See if we've found a duplicate label. We can't leave this until + code generation, because in `--syntax-only' and `-C' modes we + don't do ordinary code generation. */ + for (iter = case_label_list; iter != NULL_TREE; iter = TREE_CHAIN (iter)) + { + HOST_WIDE_INT val = TREE_INT_CST_LOW (TREE_VALUE (iter)); + tree subiter; + for (subiter = TREE_CHAIN (iter); + subiter != NULL_TREE; + subiter = TREE_CHAIN (subiter)) + { + HOST_WIDE_INT subval = TREE_INT_CST_LOW (TREE_VALUE (subiter)); + if (val == subval) + { + EXPR_WFL_LINECOL (wfl_operator) + = EXPR_WFL_LINECOL (TREE_PURPOSE (iter)); + /* The case_label_list is in reverse order, so print the + outer label first. */ + parse_error_context (wfl_operator, "duplicate case label: `" + HOST_WIDE_INT_PRINT_DEC "'", subval); + EXPR_WFL_LINECOL (wfl_operator) + = EXPR_WFL_LINECOL (TREE_PURPOSE (subiter)); + parse_error_context (wfl_operator, "original label is here"); + + break; + } + } + } + + case_label_list = save; + /* Ready to return */ if (TREE_CODE (TREE_OPERAND (node, 1)) == ERROR_MARK) { *************** patch_switch_statement (node) *** 15055,15060 **** --- 15203,15241 ---- /* 14.18 The try/catch statements */ + /* Encapsulate TRY_STMTS' in a try catch sequence. The catch clause + catches TYPE and executes CATCH_STMTS. */ + + static tree + encapsulate_with_try_catch (location, type, try_stmts, catch_stmts) + int location; + tree type, try_stmts, catch_stmts; + { + tree try_block, catch_clause_param, catch_block, catch; + + /* First build a try block */ + try_block = build_expr_block (try_stmts, NULL_TREE); + + /* Build a catch block: we need a catch clause parameter */ + catch_clause_param = build_decl (VAR_DECL, + wpv_id, build_pointer_type (type)); + /* And a block */ + catch_block = build_expr_block (NULL_TREE, catch_clause_param); + + /* Initialize the variable and store in the block */ + catch = build (MODIFY_EXPR, NULL_TREE, catch_clause_param, + build (JAVA_EXC_OBJ_EXPR, ptr_type_node)); + add_stmt_to_block (catch_block, NULL_TREE, catch); + + /* Add the catch statements */ + add_stmt_to_block (catch_block, NULL_TREE, catch_stmts); + + /* Now we can build a CATCH_EXPR */ + catch_block = build1 (CATCH_EXPR, NULL_TREE, catch_block); + + return build_try_statement (location, try_block, catch_block); + } + static tree build_try_statement (location, try_block, catches) int location; *************** patch_synchronized_statement (node, wfl_ *** 15247,15259 **** CAN_COMPLETE_NORMALLY (exit) = 1; assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr); TREE_SIDE_EFFECTS (assignment) = 1; ! node = build1 (CLEANUP_POINT_EXPR, NULL_TREE, ! build (COMPOUND_EXPR, NULL_TREE, ! build (WITH_CLEANUP_EXPR, NULL_TREE, ! build (COMPOUND_EXPR, NULL_TREE, ! assignment, enter), ! NULL_TREE, exit), ! block)); node = build_expr_block (node, expr_decl); return java_complete_tree (node); --- 15428,15436 ---- CAN_COMPLETE_NORMALLY (exit) = 1; assignment = build (MODIFY_EXPR, NULL_TREE, expr_decl, expr); TREE_SIDE_EFFECTS (assignment) = 1; ! node = build (COMPOUND_EXPR, NULL_TREE, ! build (COMPOUND_EXPR, NULL_TREE, assignment, enter), ! build (TRY_FINALLY_EXPR, NULL_TREE, block, exit)); node = build_expr_block (node, expr_decl); return java_complete_tree (node); *************** patch_throw_statement (node, wfl_op1) *** 15289,15300 **** unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type)); SET_WFL_OPERATOR (wfl_operator, node, wfl_op1); ! /* An instance can't throw a checked excetion unless that exception ! is explicitely declared in the `throws' clause of each constructor. This doesn't apply to anonymous classes, since they don't have declared constructors. */ if (!unchecked_ok ! && in_instance_initializer && !ANONYMOUS_CLASS_P (current_class)) { tree current; for (current = TYPE_METHODS (current_class); current; --- 15466,15478 ---- unchecked_ok = IS_UNCHECKED_EXCEPTION_P (TREE_TYPE (type)); SET_WFL_OPERATOR (wfl_operator, node, wfl_op1); ! /* An instance can't throw a checked exception unless that exception ! is explicitly declared in the `throws' clause of each constructor. This doesn't apply to anonymous classes, since they don't have declared constructors. */ if (!unchecked_ok ! && DECL_INSTINIT_P (current_function_decl) ! && !ANONYMOUS_CLASS_P (current_class)) { tree current; for (current = TYPE_METHODS (current_class); current; *************** purge_unchecked_exceptions (mdecl) *** 15442,15447 **** --- 15620,15657 ---- DECL_FUNCTION_THROWS (mdecl) = new; } + /* This function goes over all of CLASS_TYPE ctors and checks whether + each of them features at least one unchecked exception in its + `throws' clause. If it's the case, it returns `true', `false' + otherwise. */ + + static bool + ctors_unchecked_throws_clause_p (class_type) + tree class_type; + { + tree current; + + for (current = TYPE_METHODS (class_type); current; + current = TREE_CHAIN (current)) + { + bool ctu = false; /* Ctor Throws Unchecked */ + if (DECL_CONSTRUCTOR_P (current)) + { + tree throws; + for (throws = DECL_FUNCTION_THROWS (current); throws && !ctu; + throws = TREE_CHAIN (throws)) + if (inherits_from_p (TREE_VALUE (throws), exception_type_node)) + ctu = true; + } + /* We return false as we found one ctor that is unfit. */ + if (!ctu && DECL_CONSTRUCTOR_P (current)) + return false; + } + /* All ctors feature at least one unchecked exception in their + `throws' clause. */ + return true; + } + /* 15.24 Conditional Operator ?: */ static tree *************** fold_constant_for_init (node, context) *** 15668,15675 **** DECL_INITIAL (node) = NULL_TREE; val = fold_constant_for_init (val, node); DECL_INITIAL (node) = val; - if (!val && CLASS_FINAL_VARIABLE_P (node)) - DECL_FIELD_FINAL_IUD (node) = 0; return val; case EXPR_WITH_FILE_LOCATION: --- 15878,15883 ---- *************** fold_constant_for_init (node, context) *** 15691,15698 **** --- 15899,15912 ---- } else { + /* Install the proper context for the field resolution. + The prior context is restored once the name is + properly qualified. */ + tree saved_current_class = current_class; /* Wait until the USE_COMPONENT_REF re-write. FIXME. */ + current_class = DECL_CONTEXT (context); qualify_ambiguous_name (node); + current_class = saved_current_class; if (resolve_field_access (node, &decl, NULL) && decl != NULL_TREE) return fold_constant_for_init (decl, decl); *************** init_src_parse () *** 15778,15781 **** --- 15992,16076 ---- { /* Register roots with the garbage collector. */ ggc_add_tree_root (src_parse_roots, sizeof (src_parse_roots) / sizeof(tree)); + + /* Sanity check; we've been bit by this before. */ + if (sizeof (ctxp->modifier_ctx) / sizeof (tree) != + MODIFIER_TK - PUBLIC_TK) + abort (); + } + + + + /* This section deals with the functions that are called when tables + recording class initialization information are traversed. */ + + /* Attach to PTR (a block) the declaration found in ENTRY. */ + + static bool + attach_init_test_initialization_flags (entry, ptr) + struct hash_entry *entry; + PTR ptr; + { + tree block = (tree)ptr; + struct init_test_hash_entry *ite = (struct init_test_hash_entry *) entry; + + TREE_CHAIN (ite->init_test_decl) = BLOCK_EXPR_DECLS (block); + BLOCK_EXPR_DECLS (block) = ite->init_test_decl; + return true; + } + + /* This function is called for each classes that is known definitely + assigned when a given static method was called. This function + augments a compound expression (INFO) storing all assignment to + initialized static class flags if a flag already existed, otherwise + a new one is created. */ + + static bool + emit_test_initialization (entry, info) + struct hash_entry *entry; + PTR info; + { + tree l = (tree) info; + tree decl, init; + + struct init_test_hash_entry *ite = (struct init_test_hash_entry *) + hash_lookup (&DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), + entry->key, + current_function_decl != TREE_PURPOSE (l), NULL); + + /* If we haven't found a flag and we're dealing with self registered + with current_function_decl, then don't do anything. Self is + always added as definitely initialized but this information is + valid only if used outside the current function. */ + if (! ite) + return true; + + /* If we don't have a variable, create one and install it. */ + if (! ite->init_test_decl) + { + tree block; + + decl = build_decl (VAR_DECL, NULL_TREE, boolean_type_node); + MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); + LOCAL_CLASS_INITIALIZATION_FLAG (decl) = 1; + DECL_CONTEXT (decl) = current_function_decl; + DECL_INITIAL (decl) = boolean_true_node; + + /* The trick is to find the right context for it. */ + block = BLOCK_SUBBLOCKS (GET_CURRENT_BLOCK (current_function_decl)); + TREE_CHAIN (decl) = BLOCK_EXPR_DECLS (block); + BLOCK_EXPR_DECLS (block) = decl; + ite->init_test_decl = decl; + } + else + decl = ite->init_test_decl; + + /* Now simply augment the compound that holds all the assignments + pertaining to this method invocation. */ + init = build (MODIFY_EXPR, boolean_type_node, decl, boolean_true_node); + TREE_SIDE_EFFECTS (init) = 1; + TREE_VALUE (l) = add_stmt_to_compound (TREE_VALUE (l), void_type_node, init); + TREE_SIDE_EFFECTS (TREE_VALUE (l)) = 1; + + return true; } diff -Nrc3pad gcc-3.0.4/gcc/java/rmic.1 gcc-3.1/gcc/java/rmic.1 *** gcc-3.0.4/gcc/java/rmic.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/rmic.1 Wed May 15 02:46:03 2002 *************** *** 0 **** --- 1,210 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:03 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "RMIC 1" + .TH RMIC 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + rmic \- Generate stubs for Remote Method Invocation + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + \&\fBrmic\fR [\fB\s-1OPTION\s0\fR] ... \fIclass\fR ... + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + \&\fBrmic\fR is a utility included with \f(CW\*(C`libgcj\*(C'\fR which generates + stubs for remote objects. + .PP + Note that this program isn't yet fully compatible with the \s-1JDK\s0 + \&\fBrmic\fR. Some options, such as \fB\-classpath\fR, are + recognized but currently ignored. We have left these options + undocumented for now. + .PP + Long options can also be given with a GNU-style leading \fB\--\fR. For + instance, \fB\*(--help\fR is accepted. + .SH "OPTIONS" + .IX Header "OPTIONS" + .Ip "\fB\-keep\fR" 4 + .IX Item "-keep" + .PD 0 + .Ip "\fB\-keepgenerated\fR" 4 + .IX Item "-keepgenerated" + .PD + By default, \fBrmic\fR deletes intermediate files. Either of these + options causes it not to delete such files. + .Ip "\fB\-v1.1\fR" 4 + .IX Item "-v1.1" + Cause \fBrmic\fR to create stubs and skeletons for the 1.1 + protocol version. + .Ip "\fB\-vcompat\fR" 4 + .IX Item "-vcompat" + Cause \fBrmic\fR to create stubs and skeletons compatible with both + the 1.1 and 1.2 protocol versions. This is the default. + .Ip "\fB\-v1.2\fR" 4 + .IX Item "-v1.2" + Cause \fBrmic\fR to create stubs and skeletons for the 1.2 + protocol version. + .Ip "\fB\-nocompile\fR" 4 + .IX Item "-nocompile" + Don't compile the generated files. + .Ip "\fB\-verbose\fR" 4 + .IX Item "-verbose" + Print information about what \fBrmic\fR is doing. + .Ip "\fB\-d\fR \fIdirectory\fR" 4 + .IX Item "-d directory" + Put output files in \fIdirectory\fR. By default the files are put in + the current working directory. + .Ip "\fB\-help\fR" 4 + .IX Item "-help" + Print a help message, then exit. + .Ip "\fB\-version\fR" 4 + .IX Item "-version" + Print version information, then exit. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/rmiregistry.1 gcc-3.1/gcc/java/rmiregistry.1 *** gcc-3.0.4/gcc/java/rmiregistry.1 Thu Jan 1 00:00:00 1970 --- gcc-3.1/gcc/java/rmiregistry.1 Wed May 15 02:46:03 2002 *************** *** 0 **** --- 1,172 ---- + .\" Automatically generated by Pod::Man version 1.15 + .\" Wed May 15 02:46:03 2002 + .\" + .\" Standard preamble: + .\" ====================================================================== + .de Sh \" Subsection heading + .br + .if t .Sp + .ne 5 + .PP + \fB\\$1\fR + .PP + .. + .de Sp \" Vertical space (when we can't use .PP) + .if t .sp .5v + .if n .sp + .. + .de Ip \" List item + .br + .ie \\n(.$>=3 .ne \\$3 + .el .ne 3 + .IP "\\$1" \\$2 + .. + .de Vb \" Begin verbatim text + .ft CW + .nf + .ne \\$1 + .. + .de Ve \" End verbatim text + .ft R + + .fi + .. + .\" Set up some character translations and predefined strings. \*(-- will + .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left + .\" double quote, and \*(R" will give a right double quote. | will give a + .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used + .\" to do unbreakable dashes and therefore won't be available. \*(C` and + .\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> + .tr \(*W-|\(bv\*(Tr + .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' + .ie n \{\ + . ds -- \(*W- + . ds PI pi + . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch + . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch + . ds L" "" + . ds R" "" + . ds C` "" + . ds C' "" + 'br\} + .el\{\ + . ds -- \|\(em\| + . ds PI \(*p + . ds L" `` + . ds R" '' + 'br\} + .\" + .\" If the F register is turned on, we'll generate index entries on stderr + .\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and + .\" index entries marked with X<> in POD. Of course, you'll have to process + .\" the output yourself in some meaningful fashion. + .if \nF \{\ + . de IX + . tm Index:\\$1\t\\n%\t"\\$2" + .. + . nr % 0 + . rr F + .\} + .\" + .\" For nroff, turn off justification. Always turn off hyphenation; it + .\" makes way too many mistakes in technical documents. + .hy 0 + .if n .na + .\" + .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). + .\" Fear. Run. Save yourself. No user-serviceable parts. + .bd B 3 + . \" fudge factors for nroff and troff + .if n \{\ + . ds #H 0 + . ds #V .8m + . ds #F .3m + . ds #[ \f1 + . ds #] \fP + .\} + .if t \{\ + . ds #H ((1u-(\\\\n(.fu%2u))*.13m) + . ds #V .6m + . ds #F 0 + . ds #[ \& + . ds #] \& + .\} + . \" simple accents for nroff and troff + .if n \{\ + . ds ' \& + . ds ` \& + . ds ^ \& + . ds , \& + . ds ~ ~ + . ds / + .\} + .if t \{\ + . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" + . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' + . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' + . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' + . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' + . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' + .\} + . \" troff and (daisy-wheel) nroff accents + .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' + .ds 8 \h'\*(#H'\(*b\h'-\*(#H' + .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] + .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' + .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' + .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] + .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] + .ds ae a\h'-(\w'a'u*4/10)'e + .ds Ae A\h'-(\w'A'u*4/10)'E + . \" corrections for vroff + .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' + .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' + . \" for low resolution devices (crt and lpr) + .if \n(.H>23 .if \n(.V>19 \ + \{\ + . ds : e + . ds 8 ss + . ds o a + . ds d- d\h'-1'\(ga + . ds D- D\h'-1'\(hy + . ds th \o'bp' + . ds Th \o'LP' + . ds ae ae + . ds Ae AE + .\} + .rm #[ #] #H #V #F C + .\" ====================================================================== + .\" + .IX Title "RMIREGISTRY 1" + .TH RMIREGISTRY 1 "gcc-3.1" "2002-05-15" "GNU" + .UC + .SH "NAME" + rmiregistry \- Remote object registry + .SH "SYNOPSIS" + .IX Header "SYNOPSIS" + \&\fBrmiregistry\fR [\fB\s-1OPTION\s0\fR] ... [\fIport\fR] + .SH "DESCRIPTION" + .IX Header "DESCRIPTION" + \&\fBrmiregistry\fR starts a remote object registry on the current + host. If no port number is specified, then port 1099 is used. + .SH "OPTIONS" + .IX Header "OPTIONS" + .Ip "\fB\*(--help\fR" 4 + .IX Item "help" + Print a help message, then exit. + .Ip "\fB\*(--version\fR" 4 + .IX Item "version" + Print version information, then exit. + .SH "SEE ALSO" + .IX Header "SEE ALSO" + .SH "COPYRIGHT" + .IX Header "COPYRIGHT" + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + .PP + Permission is granted to copy, distribute and/or modify this document + under the terms of the \s-1GNU\s0 Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with the + Invariant Sections being ``\s-1GNU\s0 General Public License'', the Front-Cover + texts being (a) (see below), and with the Back-Cover Texts being (b) + (see below). A copy of the license is included in the + man page \fIgfdl\fR\|(7). diff -Nrc3pad gcc-3.0.4/gcc/java/typeck.c gcc-3.1/gcc/java/typeck.c *** gcc-3.0.4/gcc/java/typeck.c Sun Apr 29 11:26:30 2001 --- gcc-3.1/gcc/java/typeck.c Mon Dec 3 23:09:42 2001 *************** convert (type, expr) *** 133,139 **** return fold (convert_to_boolean (type, expr)); if (code == INTEGER_TYPE) { ! if (! flag_fast_math && ! flag_emit_class_files && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE && TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT) --- 133,139 ---- return fold (convert_to_boolean (type, expr)); if (code == INTEGER_TYPE) { ! if (! flag_unsafe_math_optimizations && ! flag_emit_class_files && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE && TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT) *************** java_array_type_length (array_type) *** 353,361 **** if (arfld != NULL_TREE) { tree index_type = TYPE_DOMAIN (TREE_TYPE (arfld)); ! tree high = TYPE_MAX_VALUE (index_type); ! if (TREE_CODE (high) == INTEGER_CST) ! return TREE_INT_CST_LOW (high) + 1; } return -1; } --- 353,364 ---- if (arfld != NULL_TREE) { tree index_type = TYPE_DOMAIN (TREE_TYPE (arfld)); ! if (index_type != NULL_TREE) ! { ! tree high = TYPE_MAX_VALUE (index_type); ! if (TREE_CODE (high) == INTEGER_CST) ! return TREE_INT_CST_LOW (high) + 1; ! } } return -1; } *************** build_prim_array_type (element_type, len *** 370,378 **** tree element_type; HOST_WIDE_INT length; { ! tree max_index = build_int_2 (length - 1, (0 == length ? -1 : 0)); ! TREE_TYPE (max_index) = sizetype; ! return build_array_type (element_type, build_index_type (max_index)); } /* Return a Java array type with a given ELEMENT_TYPE and LENGTH. --- 373,387 ---- tree element_type; HOST_WIDE_INT length; { ! tree index = NULL; ! ! if (length != -1) ! { ! tree max_index = build_int_2 (length - 1, (0 == length ? -1 : 0)); ! TREE_TYPE (max_index) = sizetype; ! index = build_index_type (max_index); ! } ! return build_array_type (element_type, index); } /* Return a Java array type with a given ELEMENT_TYPE and LENGTH. *************** get_type_from_signature (tree signature) *** 580,585 **** --- 589,596 ---- return type; } + /* Ignore signature and always return null. Used by has_method. */ + static tree build_null_signature (type) tree type ATTRIBUTE_UNUSED; diff -Nrc3pad gcc-3.0.4/gcc/java/verify.c gcc-3.1/gcc/java/verify.c *** gcc-3.0.4/gcc/java/verify.c Sun Apr 29 11:26:30 2001 --- gcc-3.1/gcc/java/verify.c Sun Dec 16 16:23:50 2001 *************** push_pending_label (target_label) *** 66,72 **** /* Note that TARGET_LABEL is a possible successor instruction. Merge the type state etc. ! Return NULL on sucess, or an error message on failure. */ static const char * check_pending_block (target_label) --- 66,72 ---- /* Note that TARGET_LABEL is a possible successor instruction. Merge the type state etc. ! Return NULL on success, or an error message on failure. */ static const char * check_pending_block (target_label) *************** check_pending_block (target_label) *** 104,109 **** --- 104,125 ---- return NULL; } + /* Count the number of nested jsr calls needed to reach LABEL. */ + + static int + subroutine_nesting (tree label) + { + int nesting = 0; + while (label != NULL_TREE && LABEL_IN_SUBR (label)) + { + if (! LABEL_IS_SUBR_START(label)) + label = LABEL_SUBR_START (label); + label = LABEL_SUBR_CONTEXT (label); + nesting++; + } + return nesting; + } + /* Return the "merged" types of TYPE1 and TYPE2. If either is primitive, the other must match (after promotion to int). For reference types, return the common super-class. *************** pop_argument_types (arg_types) *** 398,404 **** #define BCODE byte_ops /* Verify the bytecodes of the current method. ! Return 1 on sucess, 0 on failure. */ int verify_jvm_instructions (jcf, byte_ops, length) JCF* jcf; --- 414,420 ---- #define BCODE byte_ops /* Verify the bytecodes of the current method. ! Return 1 on success, 0 on failure. */ int verify_jvm_instructions (jcf, byte_ops, length) JCF* jcf; *************** verify_jvm_instructions (jcf, byte_ops, *** 497,507 **** if (current_subr && PC == INVALID_PC) { - tree caller = LABEL_SUBR_CONTEXT (current_subr); - if (pending_blocks == NULL_TREE ! || ! LABEL_IN_SUBR (pending_blocks) ! || LABEL_SUBR_START (pending_blocks) == caller) { int size = DECL_MAX_LOCALS(current_function_decl)+stack_pointer; tree ret_map = LABEL_RETURN_TYPE_STATE (current_subr); --- 513,521 ---- if (current_subr && PC == INVALID_PC) { if (pending_blocks == NULL_TREE ! || (subroutine_nesting (pending_blocks) ! < subroutine_nesting (current_subr))) { int size = DECL_MAX_LOCALS(current_function_decl)+stack_pointer; tree ret_map = LABEL_RETURN_TYPE_STATE (current_subr); *************** verify_jvm_instructions (jcf, byte_ops, *** 511,517 **** have returned to an earlier caller. Obviously a "ret" can only return one level, but a throw may return many levels.*/ ! current_subr = caller; if (RETURN_MAP_ADJUSTED (ret_map)) { --- 525,531 ---- have returned to an earlier caller. Obviously a "ret" can only return one level, but a throw may return many levels.*/ ! current_subr = LABEL_SUBR_CONTEXT (current_subr); if (RETURN_MAP_ADJUSTED (ret_map)) { *************** verify_jvm_instructions (jcf, byte_ops, *** 594,600 **** goto push_int; push_int: if (byte_ops[PC] == OPCODE_newarray ! || byte_ops[PC] == OPCODE_newarray) int_value = i; PUSH_TYPE (int_type_node); break; case OPCODE_lconst_0: case OPCODE_lconst_1: --- 608,614 ---- goto push_int; push_int: if (byte_ops[PC] == OPCODE_newarray ! || byte_ops[PC] == OPCODE_anewarray) int_value = i; PUSH_TYPE (int_type_node); break; case OPCODE_lconst_0: case OPCODE_lconst_1: *************** verify_jvm_instructions (jcf, byte_ops, *** 901,909 **** case OPCODE_putfield: is_putting = 1; is_static = 0; goto field; field: { ! int index = IMMEDIATE_u2; ! tree field_signature = COMPONENT_REF_SIGNATURE (¤t_jcf->cpool, index); ! tree field_type = get_type_from_signature (field_signature); if (is_putting) POP_TYPE (field_type, "incorrect type for field"); if (! is_static) --- 915,929 ---- case OPCODE_putfield: is_putting = 1; is_static = 0; goto field; field: { ! tree field_signature, field_type; ! index = IMMEDIATE_u2; ! if (index <= 0 || index >= JPOOL_SIZE(current_jcf)) ! VERIFICATION_ERROR_WITH_INDEX ("bad constant pool index %d"); ! if (JPOOL_TAG (current_jcf, index) != CONSTANT_Fieldref) ! VERIFICATION_ERROR ! ("field instruction does not reference a Fieldref"); ! field_signature = COMPONENT_REF_SIGNATURE (¤t_jcf->cpool, index); ! field_type = get_type_from_signature (field_signature); if (is_putting) POP_TYPE (field_type, "incorrect type for field"); if (! is_static) *************** verify_jvm_instructions (jcf, byte_ops, *** 959,965 **** index = IMMEDIATE_u2; goto ldc; ldc: if (index <= 0 || index >= JPOOL_SIZE(current_jcf)) ! VERIFICATION_ERROR ("bad constant pool index in ldc"); int_value = -1; switch (JPOOL_TAG (current_jcf, index) & ~CONSTANT_ResolvedFlag) { --- 979,985 ---- index = IMMEDIATE_u2; goto ldc; ldc: if (index <= 0 || index >= JPOOL_SIZE(current_jcf)) ! VERIFICATION_ERROR_WITH_INDEX ("bad constant pool index %d in ldc"); int_value = -1; switch (JPOOL_TAG (current_jcf, index) & ~CONSTANT_ResolvedFlag) { *************** verify_jvm_instructions (jcf, byte_ops, *** 988,1000 **** case OPCODE_invokestatic: case OPCODE_invokeinterface: { ! int index = IMMEDIATE_u2; ! tree sig = COMPONENT_REF_SIGNATURE (¤t_jcf->cpool, index); ! tree self_type = get_class_constant (current_jcf, COMPONENT_REF_CLASS_INDEX (¤t_jcf->cpool, index)); ! tree method_name = COMPONENT_REF_NAME (¤t_jcf->cpool, index); ! tree method_type; method_type = parse_signature_string (IDENTIFIER_POINTER (sig), IDENTIFIER_LENGTH (sig)); if (TREE_CODE (method_type) != FUNCTION_TYPE) --- 1008,1039 ---- case OPCODE_invokestatic: case OPCODE_invokeinterface: { ! tree sig, method_name, method_type, self_type; ! int self_is_interface, tag; ! index = IMMEDIATE_u2; ! if (index <= 0 || index >= JPOOL_SIZE(current_jcf)) ! VERIFICATION_ERROR_WITH_INDEX ! ("bad constant pool index %d for invoke"); ! tag = JPOOL_TAG (current_jcf, index); ! if (op_code == OPCODE_invokeinterface) ! { ! if (tag != CONSTANT_InterfaceMethodref) ! VERIFICATION_ERROR ! ("invokeinterface does not reference an InterfaceMethodref"); ! } ! else ! { ! if (tag != CONSTANT_Methodref) ! VERIFICATION_ERROR ("invoke does not reference a Methodref"); ! } ! sig = COMPONENT_REF_SIGNATURE (¤t_jcf->cpool, index); ! self_type = get_class_constant (current_jcf, COMPONENT_REF_CLASS_INDEX (¤t_jcf->cpool, index)); ! if (! CLASS_LOADED_P (self_type)) ! load_class (self_type, 1); ! self_is_interface = CLASS_INTERFACE (TYPE_NAME (self_type)); ! method_name = COMPONENT_REF_NAME (¤t_jcf->cpool, index); method_type = parse_signature_string (IDENTIFIER_POINTER (sig), IDENTIFIER_LENGTH (sig)); if (TREE_CODE (method_type) != FUNCTION_TYPE) *************** verify_jvm_instructions (jcf, byte_ops, *** 1027,1033 **** if (!nargs || notZero) VERIFICATION_ERROR ("invalid argument number in invokeinterface"); ! break; } } --- 1066,1079 ---- if (!nargs || notZero) VERIFICATION_ERROR ("invalid argument number in invokeinterface"); ! /* If we verify/resolve the constant pool, as we should, ! this test (and the one just following) are redundant. */ ! if (! self_is_interface) ! VERIFICATION_ERROR ("invokeinterface calls method not in interface"); ! break; ! default: ! if (self_is_interface) ! VERIFICATION_ERROR ("method in interface called"); } } *************** verify_jvm_instructions (jcf, byte_ops, *** 1142,1153 **** break; case OPCODE_checkcast: ! pop_type (ptr_type_node); type = get_class_constant (current_jcf, IMMEDIATE_u2); PUSH_TYPE (type); break; case OPCODE_instanceof: ! pop_type (ptr_type_node); get_class_constant (current_jcf, IMMEDIATE_u2); PUSH_TYPE (int_type_node); break; --- 1188,1201 ---- break; case OPCODE_checkcast: ! POP_TYPE (object_ptr_type_node, ! "checkcast operand is not a pointer"); type = get_class_constant (current_jcf, IMMEDIATE_u2); PUSH_TYPE (type); break; case OPCODE_instanceof: ! POP_TYPE (object_ptr_type_node, ! "instanceof operand is not a pointer"); get_class_constant (current_jcf, IMMEDIATE_u2); PUSH_TYPE (int_type_node); break; diff -Nrc3pad gcc-3.0.4/gcc/java/zipfile.h gcc-3.1/gcc/java/zipfile.h *** gcc-3.0.4/gcc/java/zipfile.h Mon Mar 19 17:20:02 2001 --- gcc-3.1/gcc/java/zipfile.h Sat Jun 23 16:22:20 2001 *************** extern struct ZipFile *SeenZipFiles; *** 60,66 **** extern ZipFile * opendir_in_zip PARAMS ((const char *, int)); extern int read_zip_archive PARAMS ((ZipFile *)); ! #ifdef JCF_H extern int read_zip_member PARAMS ((JCF*, ZipDirectory*, ZipFile *)); extern int open_in_zip PARAMS ((struct JCF *, const char *, const char *, int)); --- 60,66 ---- extern ZipFile * opendir_in_zip PARAMS ((const char *, int)); extern int read_zip_archive PARAMS ((ZipFile *)); ! #ifdef GCC_JCF_H extern int read_zip_member PARAMS ((JCF*, ZipDirectory*, ZipFile *)); extern int open_in_zip PARAMS ((struct JCF *, const char *, const char *, int)); diff -Nrc3pad gcc-3.0.4/libffi/ChangeLog gcc-3.1/libffi/ChangeLog *** gcc-3.0.4/libffi/ChangeLog Wed Feb 20 18:45:59 2002 --- gcc-3.1/libffi/ChangeLog Wed May 15 02:24:39 2002 *************** *** 1,22 **** ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2001-12-20 Release Manager ! * GCC 3.0.3 Released. ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. 2001-07-16 Rainer Orth --- 1,138 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-08 Alexandre Oliva ! * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at ! script entry, and set LD to it when configuring multilibs. ! * configure: Rebuilt. ! 2002-04-28 David S. Miller ! * configure.in, configure: Fix SPARC test in previous change. ! 2002-04-28 Jakub Jelinek ! * configure.in (HAVE_AS_SPARC_UA_PCREL): Check for working ! %r_disp32(). ! * src/sparc/v8.S: Use it. ! * src/sparc/v9.S: Likewise. ! * fficonfig.h.in: Rebuilt. ! * configure: Rebuilt. ! ! 2002-04-08 Hans Boehm ! ! * src/java_raw_api.c (ffi_java_raw_size): Handle FFI_TYPE_DOUBLE ! correctly. ! * src/ia64/unix.S: Add unwind information. Fix comments. ! Save sp in a way that's compatible with unwind info. ! (ffi_call_unix): Correctly restore sp in all cases. ! * src/ia64/ffi.c: Add, fix comments. ! ! 2002-04-08 Jakub Jelinek ! ! * src/sparc/v8.S: Make .eh_frame dependent on target word size. ! ! 2002-04-04 Jeff Sturm ! ! * src/sparc/v8.S: Add unwind info. ! * src/sparc/v9.S: Likewise. ! ! 2002-04-01 Loren J. Rittle ! ! * configure.in: Enable alpha*-*-freebsd*. ! * configure: Rebuilt. ! ! 2002-03-30 Krister Walfridsson ! ! * configure.in: Enable i*86-*-netbsdelf*. ! * configure: Rebuilt. ! ! 2002-03-29 David Billinghurst ! ! PR other/2620 ! * src/mips/n32.s: Delete ! * src/mips/o32.s: Delete ! ! 2002-03-17 Bryce McKinlay ! ! * Makefile.am: libfficonvenience -> libffi_convenience. ! * Makefile.in: Rebuilt. ! ! * Makefile.am: Define ffitest_OBJECTS. ! * Makefile.in: Rebuilt. ! ! 2002-03-07 Andreas Tobler ! David Edelsohn ! ! * Makefile.am (EXTRA_DIST): Add Darwin and AIX closure files. ! (TARGET_SRC_POWERPC_AIX): Add aix_closure.S. ! (TARGET_SRC_POWERPC_DARWIN): Add darwin_closure.S. ! * Makefile.in: Regenerate. ! * include/ffi.h.in: Add AIX and Darwin closure definitions. ! * src/powerpc/ffi_darwin.c (ffi_prep_closure): New function. ! (flush_icache, flush_range): New functions. ! (ffi_closure_helper_DARWIN): New function. ! * src/powerpc/aix_closure.S: New file. ! * src/powerpc/darwin_closure.S: New file. ! ! 2002-02-24 Jeff Sturm ! ! * include/ffi.h.in: Add typedef for ffi_arg. ! * src/ffitest.c (main): Declare rint with ffi_arg. ! ! 2002-02-21 Andreas Tobler ! ! * src/powerpc/ffi_darwin.c (ffi_prep_args): Skip appropriate ! number of GPRs for floating-point arguments. ! ! 2002-01-31 Anthony Green ! ! * configure: Rebuilt. ! * configure.in: Replace CHECK_SIZEOF and endian tests with ! cross-compiler friendly macros. ! * aclocal.m4 (AC_COMPILE_CHECK_SIZEOF, AC_C_BIGENDIAN_CROSS): New ! macros. ! ! 2002-01-18 David Edelsohn ! ! * src/powerpc/darwin.S (_ffi_call_AIX): New. ! * src/powerpc/aix.S (ffi_call_DARWIN): New. ! ! 2002-01-17 David Edelsohn ! ! * Makefile.am (EXTRA_DIST): Add Darwin and AIX files. ! (TARGET_SRC_POWERPC_AIX): New. ! (POWERPC_AIX): New stanza. ! * Makefile.in: Regenerate. ! * configure.in: Add AIX case. ! * configure: Regenerate. ! * include/ffi.h.in (ffi_abi): Add FFI_AIX. ! * src/powerpc/ffi_darwin.c (ffi_status): Use "long" to scale frame ! size. Fix "long double" support. ! (ffi_call): Add FFI_AIX case. ! * src/powerpc/aix.S: New. ! ! 2001-10-09 John Hornkvist ! ! Implement Darwin PowerPC ABI. ! * configure.in: Handle powerpc-*-darwin*. ! * Makefile.am: Set source files for POWERPC_DARWIN. ! * configure: Rebuilt. ! * Makefile.in: Rebuilt. ! * include/ffi.h.in: Define FFI_DARWIN and FFI_DEFAULT_ABI for ! POWERPC_DARWIN. ! * src/powerpc/darwin.S: New file. ! * src/powerpc/ffi_darwin.c: New file. ! ! 2001-10-07 Joseph S. Myers ! ! * src/x86/ffi.c: Fix spelling error of "separate" as "seperate". 2001-07-16 Rainer Orth *************** *** 37,65 **** * configure.in: Recognize sparc*-sun-* host. * configure: Regenerate. - 20010617 Release Manager - - * GCC 3.0 Released. - 2001-06-06 Andrew Haley ! * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. 2001-06-03 Andrew Haley ! * src/alpha/osf.S: Add unwind info. ! * src/powerpc/sysv.S: Add unwind info. ! * src/powerpc/ppc_closure.S: Likewise. 2001-05-06 Bryce McKinlay * configure.in: Remove warning about beta code. * configure: Rebuilt. ! 2001-04-25 Hans Boehm * src/ia64/unix.S: Restore stack pointer when returning from ffi_closure_UNIX. 2001-04-18 Jim Wilson --- 153,183 ---- * configure.in: Recognize sparc*-sun-* host. * configure: Regenerate. 2001-06-06 Andrew Haley ! * src/alpha/osf.S (__FRAME_BEGIN__): Conditionalize for ELF. 2001-06-03 Andrew Haley ! * src/alpha/osf.S: Add unwind info. ! * src/powerpc/sysv.S: Add unwind info. ! * src/powerpc/ppc_closure.S: Likewise. ! ! 2000-05-31 Jeff Sturm ! ! * configure.in: Fix AC_ARG_ENABLE usage. ! * configure: Rebuilt. 2001-05-06 Bryce McKinlay * configure.in: Remove warning about beta code. * configure: Rebuilt. ! 2001-04-25 Hans Boehm * src/ia64/unix.S: Restore stack pointer when returning from ffi_closure_UNIX. + * src/ia64/ffi.c: Fix typo in comment. 2001-04-18 Jim Wilson *************** *** 70,76 **** * Makefile.am: Make a libtool convenience library. * Makefile.in: Rebuilt. ! 2001-03-29 Bryce McKinlay * configure.in: Use different syntax for subdirectory creation. --- 188,194 ---- * Makefile.am: Make a libtool convenience library. * Makefile.in: Rebuilt. ! 2001-03-29 Bryce McKinlay * configure.in: Use different syntax for subdirectory creation. *************** *** 119,124 **** --- 237,263 ---- * Makefile.in: Rebuilt. * Makefile.am (ffitest_LDFLAGS): New macro. + 2001-03-02 Nick Clifton + + * include/ffi.h.in: Remove RCS ident string. + * include/ffi_mips.h: Remove RCS ident string. + * src/debug.c: Remove RCS ident string. + * src/ffitest.c: Remove RCS ident string. + * src/prep_cif.c: Remove RCS ident string. + * src/types.c: Remove RCS ident string. + * src/alpha/ffi.c: Remove RCS ident string. + * src/alpha/osf.S: Remove RCS ident string. + * src/arm/ffi.c: Remove RCS ident string. + * src/arm/sysv.S: Remove RCS ident string. + * src/mips/ffi.c: Remove RCS ident string. + * src/mips/n32.S: Remove RCS ident string. + * src/mips/o32.S: Remove RCS ident string. + * src/sparc/ffi.c: Remove RCS ident string. + * src/sparc/v8.S: Remove RCS ident string. + * src/sparc/v9.S: Remove RCS ident string. + * src/x86/ffi.c: Remove RCS ident string. + * src/x86/sysv.S: Remove RCS ident string. + 2001-02-08 Joseph S. Myers * include/ffi.h.in: Change sourceware.cygnus.com references to diff -Nrc3pad gcc-3.0.4/libffi/Makefile.am gcc-3.1/libffi/Makefile.am *** gcc-3.0.4/libffi/Makefile.am Thu Apr 12 09:27:03 2001 --- gcc-3.1/libffi/Makefile.am Sun Mar 17 01:04:48 2002 *************** EXTRA_DIST = LICENSE ChangeLog.v1 src/mi *** 11,17 **** src/alpha/ffi.c src/alpha/osf.S \ src/m68k/ffi.c src/m68k/sysv.S \ src/powerpc/ffi.c src/powerpc/sysv.S \ ! src/powerpc/ppc_closure.S src/powerpc/asm.h \ src/arm/ffi.c src/arm/sysv.S VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ --- 11,20 ---- src/alpha/ffi.c src/alpha/osf.S \ src/m68k/ffi.c src/m68k/sysv.S \ src/powerpc/ffi.c src/powerpc/sysv.S \ ! src/powerpc/ppc_closure.S src/powerpc/asm.h \ ! src/powerpc/ffi_darwin.c \ ! src/powerpc/darwin.S src/powerpc/aix.S \ ! src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ src/arm/ffi.c src/arm/sysv.S VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ *************** toolexeclibdir = $(toolexecdir)/lib$(MUL *** 80,90 **** endif toolexeclib_LTLIBRARIES = libffi.la ! noinst_LTLIBRARIES = libfficonvenience.la noinst_PROGRAMS = ffitest ! ffitest_SOURCES = src/ffitest.c ffitest_LDADD = libffi.la ffitest_LDFLAGS = -shared-libgcc --- 83,93 ---- endif toolexeclib_LTLIBRARIES = libffi.la ! noinst_LTLIBRARIES = libffi_convenience.la noinst_PROGRAMS = ffitest ! ffitest_OBJECTS = ffitest.lo ffitest_LDADD = libffi.la ffitest_LDFLAGS = -shared-libgcc *************** TARGET_SRC_ALPHA = src/alpha/ffi.c src/a *** 97,102 **** --- 100,107 ---- TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S + TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@) *************** libffi_la_common_SOURCES = src/debug.c s *** 105,147 **** src/raw_api.c src/java_raw_api.c if MIPS_GCC libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) endif if MIPS_SGI libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) endif if X86 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86) endif if X86_WIN32 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) endif if SPARC libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC) endif if ALPHA libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) endif if IA64 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) endif if M68K libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) endif if POWERPC libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) endif if ARM libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ! libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) endif AM_CFLAGS = -fexceptions --- 110,160 ---- src/raw_api.c src/java_raw_api.c if MIPS_GCC libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) endif if MIPS_SGI libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) endif if X86 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86) endif if X86_WIN32 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) endif if SPARC libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC) endif if ALPHA libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) endif if IA64 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) endif if M68K libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) endif if POWERPC libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) ! endif ! if POWERPC_AIX ! libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) ! endif ! if POWERPC_DARWIN ! libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) endif if ARM libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ! libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) endif AM_CFLAGS = -fexceptions diff -Nrc3pad gcc-3.0.4/libffi/Makefile.in gcc-3.1/libffi/Makefile.in *** gcc-3.0.4/libffi/Makefile.in Thu Apr 12 09:27:03 2001 --- gcc-3.1/libffi/Makefile.in Sun Mar 17 01:04:48 2002 *************** EXTRA_DIST = LICENSE ChangeLog.v1 src/mi *** 92,98 **** src/alpha/ffi.c src/alpha/osf.S \ src/m68k/ffi.c src/m68k/sysv.S \ src/powerpc/ffi.c src/powerpc/sysv.S \ ! src/powerpc/ppc_closure.S src/powerpc/asm.h \ src/arm/ffi.c src/arm/sysv.S --- 92,101 ---- src/alpha/ffi.c src/alpha/osf.S \ src/m68k/ffi.c src/m68k/sysv.S \ src/powerpc/ffi.c src/powerpc/sysv.S \ ! src/powerpc/ppc_closure.S src/powerpc/asm.h \ ! src/powerpc/ffi_darwin.c \ ! src/powerpc/darwin.S src/powerpc/aix.S \ ! src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ src/arm/ffi.c src/arm/sysv.S *************** MULTICLEAN = true *** 151,161 **** @USE_LIBDIR_FALSE@toolexecdir = @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) toolexeclib_LTLIBRARIES = libffi.la ! noinst_LTLIBRARIES = libfficonvenience.la noinst_PROGRAMS = ffitest ! ffitest_SOURCES = src/ffitest.c ffitest_LDADD = libffi.la ffitest_LDFLAGS = -shared-libgcc --- 154,164 ---- @USE_LIBDIR_FALSE@toolexecdir = @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) toolexeclib_LTLIBRARIES = libffi.la ! noinst_LTLIBRARIES = libffi_convenience.la noinst_PROGRAMS = ffitest ! ffitest_OBJECTS = ffitest.lo ffitest_LDADD = libffi.la ffitest_LDFLAGS = -shared-libgcc *************** TARGET_SRC_ALPHA = src/alpha/ffi.c src/a *** 168,173 **** --- 171,178 ---- TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S + TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \ *************** libffi_la_common_SOURCES = src/debug.c s *** 182,198 **** @IA64_TRUE@libffi_la_SOURCES = @IA64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) @M68K_TRUE@libffi_la_SOURCES = @M68K_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) @POWERPC_TRUE@libffi_la_SOURCES = @POWERPC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ! @MIPS_GCC_TRUE@libfficonvenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ! @MIPS_SGI_TRUE@libfficonvenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) ! @X86_TRUE@libfficonvenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) ! @X86_WIN32_TRUE@libfficonvenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) ! @SPARC_TRUE@libfficonvenience_la_SOURCES = @SPARC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC) ! @ALPHA_TRUE@libfficonvenience_la_SOURCES = @ALPHA_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) ! @IA64_TRUE@libfficonvenience_la_SOURCES = @IA64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) ! @M68K_TRUE@libfficonvenience_la_SOURCES = @M68K_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) ! @POWERPC_TRUE@libfficonvenience_la_SOURCES = @POWERPC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) ! @ARM_TRUE@libfficonvenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) AM_CFLAGS = -fexceptions --- 187,207 ---- @IA64_TRUE@libffi_la_SOURCES = @IA64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) @M68K_TRUE@libffi_la_SOURCES = @M68K_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) @POWERPC_TRUE@libffi_la_SOURCES = @POWERPC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) + @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) + @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ! @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ! @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) ! @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) ! @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) ! @SPARC_TRUE@libffi_convenience_la_SOURCES = @SPARC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SPARC) ! @ALPHA_TRUE@libffi_convenience_la_SOURCES = @ALPHA_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ALPHA) ! @IA64_TRUE@libffi_convenience_la_SOURCES = @IA64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_IA64) ! @M68K_TRUE@libffi_convenience_la_SOURCES = @M68K_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_M68K) ! @POWERPC_TRUE@libffi_convenience_la_SOURCES = @POWERPC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC) ! @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) ! @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) ! @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) AM_CFLAGS = -fexceptions *************** DEFS = @DEFS@ -I. -I$(srcdir) -I. *** 210,286 **** CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ ! libfficonvenience_la_LDFLAGS = ! libfficonvenience_la_LIBADD = ! @SPARC_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo ! @MIPS_SGI_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo \ ! @MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ ! @MIPS_SGI_TRUE@src/mips/n32.lo ! @IA64_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo ! @MIPS_GCC_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo \ @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ @MIPS_GCC_TRUE@src/mips/n32.lo ! @M68K_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo ! @ALPHA_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo ! @X86_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo ! @ARM_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo ! @POWERPC_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo \ @POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ @POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ @POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo ! @X86_WIN32_TRUE@libfficonvenience_la_OBJECTS = src/debug.lo \ ! @X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo libffi_la_LIBADD = - @SPARC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ - @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ - @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo - @MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ - @MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ - @MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo - @IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ - @IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ - @IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo @MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo ! @M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo @ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo @X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ @X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ @X86_TRUE@src/x86/sysv.lo @ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \ @ARM_TRUE@src/arm/ffi.lo @POWERPC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \ @POWERPC_TRUE@src/powerpc/ppc_closure.lo ! @X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo noinst_PROGRAMS = ffitest$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) - ffitest_OBJECTS = src/ffitest.$(OBJEXT) ffitest_DEPENDENCIES = libffi.la CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) --- 219,312 ---- CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ ! libffi_convenience_la_LDFLAGS = ! libffi_convenience_la_LIBADD = ! @MIPS_GCC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ @MIPS_GCC_TRUE@src/mips/n32.lo ! @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ! @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ ! @POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo ! @ALPHA_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ! @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo ! @IA64_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo ! @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ! @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ ! @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \ ! @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo ! @MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ! @MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ ! @MIPS_SGI_TRUE@src/mips/n32.lo ! @X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo ! @X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ! @X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo ! @ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo ! @SPARC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ! @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ! @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \ ! @SPARC_TRUE@src/sparc/v9.lo ! @POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ @POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ @POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ @POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo ! @M68K_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo libffi_la_LIBADD = @MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo ! @POWERPC_AIX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \ ! @POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo @ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo + @IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo + @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo + @MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo @X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ @X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ @X86_TRUE@src/x86/sysv.lo + @X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo @ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \ @ARM_TRUE@src/arm/ffi.lo + @SPARC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo @POWERPC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \ @POWERPC_TRUE@src/powerpc/ppc_closure.lo ! @M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ! @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ! @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo noinst_PROGRAMS = ffitest$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) ffitest_DEPENDENCIES = libffi.la CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) *************** DISTFILES = $(DIST_COMMON) $(SOURCES) $( *** 296,303 **** TAR = gtar GZIP_ENV = --best ! SOURCES = $(libfficonvenience_la_SOURCES) $(libffi_la_SOURCES) $(ffitest_SOURCES) ! OBJECTS = $(libfficonvenience_la_OBJECTS) $(libffi_la_OBJECTS) $(ffitest_OBJECTS) all: all-redirect .SUFFIXES: --- 322,329 ---- TAR = gtar GZIP_ENV = --best ! SOURCES = $(libffi_convenience_la_SOURCES) $(libffi_la_SOURCES) ! OBJECTS = $(libffi_convenience_la_OBJECTS) $(libffi_la_OBJECTS) all: all-redirect .SUFFIXES: *************** distclean-libtool: *** 405,412 **** maintainer-clean-libtool: ! libfficonvenience.la: $(libfficonvenience_la_OBJECTS) $(libfficonvenience_la_DEPENDENCIES) ! $(LINK) $(libfficonvenience_la_LDFLAGS) $(libfficonvenience_la_OBJECTS) $(libfficonvenience_la_LIBADD) $(LIBS) libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(LINK) -rpath $(toolexeclibdir) $(libffi_la_LDFLAGS) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) --- 431,438 ---- maintainer-clean-libtool: ! libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) ! $(LINK) $(libffi_convenience_la_LDFLAGS) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(LINK) -rpath $(toolexeclibdir) $(libffi_la_LDFLAGS) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) diff -Nrc3pad gcc-3.0.4/libffi/README gcc-3.1/libffi/README *** gcc-3.0.4/libffi/README Thu May 11 18:20:33 2000 --- gcc-3.1/libffi/README Tue Mar 12 22:35:54 2002 *************** Libffi has been ported to: *** 52,58 **** m68k - Linux (System V ABI) ! PowerPC - Linux (System V ABI) ARM - Linux (System V ABI) --- 52,58 ---- m68k - Linux (System V ABI) ! PowerPC - Linux (System V ABI, Darwin, AIX) ARM - Linux (System V ABI) *************** Sun's probably won't either. *** 67,73 **** If you port libffi to another platform, please let me know! I assume that some will be easy (x86 NetBSD), and others will be more difficult ! (HP, AIX). Installing libffi --- 67,73 ---- If you port libffi to another platform, please let me know! I assume that some will be easy (x86 NetBSD), and others will be more difficult ! (HP). Installing libffi diff -Nrc3pad gcc-3.0.4/libffi/aclocal.m4 gcc-3.1/libffi/aclocal.m4 *** gcc-3.0.4/libffi/aclocal.m4 Sun Sep 10 07:43:14 2000 --- gcc-3.1/libffi/aclocal.m4 Thu Jan 31 22:25:31 2002 *************** AC_DEFUN([AC_PROG_LIBTOOL],) *** 19,24 **** --- 19,120 ---- AC_SUBST(LIBTOOL) ]) + AC_DEFUN([AC_COMPILE_CHECK_SIZEOF], + [changequote(<<, >>)dnl + dnl The name to #define. + define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl + dnl The cache variable name. + define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl + changequote([, ])dnl + AC_MSG_CHECKING(size of $1) + AC_CACHE_VAL(AC_CV_NAME, + [for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence. + AC_TRY_COMPILE([#include "confdefs.h" + #include + $2 + ], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) + if test x$AC_CV_NAME != x ; then break; fi + done + ]) + if test x$AC_CV_NAME = x ; then + AC_MSG_ERROR([cannot determine a size for $1]) + fi + AC_MSG_RESULT($AC_CV_NAME) + AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) + undefine([AC_TYPE_NAME])dnl + undefine([AC_CV_NAME])dnl + ]) + + AC_DEFUN([AC_C_BIGENDIAN_CROSS], + [AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, + [ac_cv_c_bigendian=unknown + # See if sys/param.h defines the BYTE_ORDER macro. + AC_TRY_COMPILE([#include + #include ], [ + #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros + #endif], [# It does; now see whether it defined to BIG_ENDIAN or not. + AC_TRY_COMPILE([#include + #include ], [ + #if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) + if test $ac_cv_c_bigendian = unknown; then + AC_TRY_RUN([main () { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); + }], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, + [ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) + fi]) + if test $ac_cv_c_bigendian = unknown; then + AC_MSG_CHECKING(to probe for byte ordering) + [ + cat >conftest.c <&AC_FD_MSG + ac_cv_c_bigendian=yes + fi + if test `grep -l LiTTleEnDian conftest.o` ; then + echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG + if test $ac_cv_c_bigendian = yes ; then + ac_cv_c_bigendian=unknown; + else + ac_cv_c_bigendian=no + fi + fi + echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG + fi + fi + AC_MSG_RESULT($ac_cv_c_bigendian) + fi + if test $ac_cv_c_bigendian = yes; then + AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) + BYTEORDER=4321 + else + BYTEORDER=1234 + fi + AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) + if test $ac_cv_c_bigendian = unknown; then + AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) + fi + ]) + # Like AC_CONFIG_HEADER, but automatically create stamp file. AC_DEFUN(AM_CONFIG_HEADER, diff -Nrc3pad gcc-3.0.4/libffi/configure gcc-3.1/libffi/configure *** gcc-3.0.4/libffi/configure Mon Jun 25 19:57:42 2001 --- gcc-3.1/libffi/configure Wed May 8 04:25:49 2002 *************** program_suffix=NONE *** 53,58 **** --- 53,59 ---- program_transform_name=s,x,x, silent= site= + sitefile= srcdir= target=NONE verbose= *************** Configuration: *** 167,172 **** --- 168,174 ---- --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages + --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX *************** EOF *** 337,342 **** --- 339,349 ---- -site=* | --site=* | --sit=*) site="$ac_optarg" ;; + -site-file | --site-file | --site-fil | --site-fi | --site-f) + ac_prev=sitefile ;; + -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) + sitefile="$ac_optarg" ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) *************** fi *** 502,513 **** srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. ! if test -z "$CONFIG_SITE"; then ! if test "x$prefix" != xNONE; then ! CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ! else ! CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then --- 509,524 ---- srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. ! if test -z "$sitefile"; then ! if test -z "$CONFIG_SITE"; then ! if test "x$prefix" != xNONE; then ! CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ! else ! CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" ! fi fi + else + CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then *************** else *** 546,557 **** fi echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 ! echo "configure:550: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:561: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else --- 573,579 ---- return __CYGWIN__; ; return 0; } EOF ! if { (eval echo configure:577: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else *************** echo "$ac_t""$ac_cv_cygwin" 1>&6 *** 579,597 **** CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:583: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else --- 590,608 ---- CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:594: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else *************** test "$ac_cv_mingw32" = yes && MINGW32=y *** 612,617 **** --- 623,634 ---- + # This works around the fact that libtool configuration may change LD + # for this particular configuration, but some shells, instead of + # keeping the changes in LD private, export them just because LD is + # exported. + ORIGINAL_LD_FOR_MULTILIBS=$LD + # Check whether --enable-multilib or --disable-multilib was given. if test "${enable_multilib+set}" = set; then enableval="$enable_multilib" *************** else { echo "configure: error: can not r *** 662,668 **** fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:666: checking host system type" >&5 host_alias=$host case "$host_alias" in --- 679,685 ---- fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:683: checking host system type" >&5 host_alias=$host case "$host_alias" in *************** else *** 753,759 **** fi echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:757: checking build system type" >&5 build_alias=$build case "$build_alias" in --- 770,776 ---- fi echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:774: checking build system type" >&5 build_alias=$build case "$build_alias" in *************** echo "$ac_t""$build" 1>&6 *** 773,779 **** # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:777: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 790,796 ---- # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:794: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -z "$CC"; then *** 803,809 **** # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:807: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 820,826 ---- # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:824: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 854,860 **** # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:858: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 871,877 ---- # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:875: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 886,892 **** fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ! echo "configure:890: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. --- 903,909 ---- fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ! echo "configure:907: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. *************** cross_compiling=$ac_cv_prog_cc_cross *** 897,908 **** cat > conftest.$ac_ext << EOF ! #line 901 "configure" #include "confdefs.h" main(){return(0);} EOF ! if { (eval echo configure:906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then --- 914,925 ---- cat > conftest.$ac_ext << EOF ! #line 918 "configure" #include "confdefs.h" main(){return(0);} EOF ! if { (eval echo configure:923: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then *************** if test $ac_cv_prog_cc_works = no; then *** 928,939 **** { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ! echo "configure:932: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:937: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 945,956 ---- { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ! echo "configure:949: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:954: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 942,948 **** yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:946: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no --- 959,965 ---- yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:963: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no *************** ac_test_CFLAGS="${CFLAGS+set}" *** 961,967 **** ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:965: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 978,984 ---- ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:982: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** ac_prog=ld *** 1004,1010 **** if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1008: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw --- 1021,1027 ---- if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1025: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw *************** echo "configure:1008: checking for ld us *** 1034,1043 **** esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1038: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1041: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1051,1060 ---- esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1055: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1058: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 1072,1078 **** fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1076: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1089,1095 ---- fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1093: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** with_gnu_ld=$lt_cv_prog_gnu_ld *** 1089,1095 **** echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1093: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1106,1112 ---- echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1110: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** reload_flag=$lt_cv_ld_reload_flag *** 1101,1107 **** test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1105: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1118,1124 ---- test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1122: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** NM="$lt_cv_path_NM" *** 1139,1145 **** echo "$ac_t""$NM" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:1143: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1156,1162 ---- echo "$ac_t""$NM" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:1160: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1160,1166 **** fi echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1164: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1177,1183 ---- fi echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1181: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** file_magic_cmd=$lt_cv_file_magic_cmd *** 1324,1336 **** deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:1328: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:1334: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; --- 1341,1353 ---- deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:1345: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:1351: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; *************** ac_objext=$ac_cv_objext *** 1350,1356 **** echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1354: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1367,1373 ---- echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1371: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1360,1369 **** rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1364: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done --- 1377,1386 ---- rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1381: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj | *.ilk | *.pdb) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done *************** case $deplibs_check_method in *** 1393,1399 **** file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:1397: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1410,1416 ---- file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:1414: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1455,1461 **** if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:1459: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1472,1478 ---- if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:1476: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** esac *** 1526,1532 **** # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1530: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1543,1549 ---- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1547: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 1558,1564 **** # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1562: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1575,1581 ---- # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1579: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1593,1599 **** # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1597: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1610,1616 ---- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1614: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 1625,1631 **** # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1629: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1642,1648 ---- # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1646: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** test x"$pic_mode" = xno && libtool_flags *** 1692,1699 **** case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 1696 "configure"' > conftest.$ac_ext ! if { (eval echo configure:1697: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" --- 1709,1716 ---- case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 1713 "configure"' > conftest.$ac_ext ! if { (eval echo configure:1714: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" *************** case $host in *** 1714,1720 **** SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:1718: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1731,1737 ---- SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:1735: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** ac_link='${CC-cc} -o conftest${ac_exeext *** 1727,1740 **** cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else --- 1744,1757 ---- cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else *************** exec 5>>./config.log *** 1862,1868 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1866: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1879,1885 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1883: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_SCRIPT" && INSTALL_SCR *** 1915,1921 **** test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:1919: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile --- 1932,1938 ---- test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:1936: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile *************** test "$program_suffix" != NONE && *** 1972,1978 **** test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:1976: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1989,1995 ---- test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:1993: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** fi *** 2011,2017 **** missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:2015: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 2028,2034 ---- missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:2032: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 2024,2030 **** fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:2028: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 2041,2047 ---- fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:2045: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 2037,2043 **** fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:2041: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 2054,2060 ---- fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:2058: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 2050,2056 **** fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:2054: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 2067,2073 ---- fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:2071: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 2063,2069 **** fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:2067: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 2080,2086 ---- fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:2084: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** fi *** 2080,2086 **** echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:2084: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2097,2103 ---- echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:2101: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 2090,2099 **** rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:2094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done --- 2107,2116 ---- rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:2111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj | *.ilk | *.pdb) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done *************** echo "$ac_t""${ac_cv_exeext}" 1>&6 *** 2111,2117 **** ac_exeext=$EXEEXT echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:2115: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" --- 2128,2134 ---- ac_exeext=$EXEEXT echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:2132: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" *************** fi *** 2137,2143 **** # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2141: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2154,2160 ---- # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2158: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -z "$CC"; then *** 2167,2173 **** # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2171: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2184,2190 ---- # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2188: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 2218,2224 **** # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2222: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2235,2241 ---- # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2239: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 2250,2256 **** fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ! echo "configure:2254: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. --- 2267,2273 ---- fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ! echo "configure:2271: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. *************** cross_compiling=$ac_cv_prog_cc_cross *** 2261,2272 **** cat > conftest.$ac_ext << EOF ! #line 2265 "configure" #include "confdefs.h" main(){return(0);} EOF ! if { (eval echo configure:2270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then --- 2278,2289 ---- cat > conftest.$ac_ext << EOF ! #line 2282 "configure" #include "confdefs.h" main(){return(0);} EOF ! if { (eval echo configure:2287: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then *************** if test $ac_cv_prog_cc_works = no; then *** 2292,2303 **** { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ! echo "configure:2296: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:2301: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2309,2320 ---- { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ! echo "configure:2313: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:2318: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 2306,2312 **** yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2310: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no --- 2323,2329 ---- yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2327: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no *************** ac_test_CFLAGS="${CFLAGS+set}" *** 2325,2331 **** ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:2329: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2342,2348 ---- ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:2346: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** i*86-*-linux*) TARGET=X86; TARGETDIR=x86 *** 2369,2374 **** --- 2386,2392 ---- i*86-*-solaris*) TARGET=X86; TARGETDIR=x86;; i*86-*-beos*) TARGET=X86; TARGETDIR=x86;; i*86-*-freebsd*) TARGET=X86; TARGETDIR=x86;; + i*86-*-netbsdelf*) TARGET=X86; TARGETDIR=x86;; i*86-*-win32*) TARGET=X86_WIN32; TARGETDIR=x86;; i*86-*-cygwin*) TARGET=X86_WIN32; TARGETDIR=x86;; i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; *************** sparc-sun-4*) TARGET=SPARC; TARGETDIR=sp *** 2376,2386 **** sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; ! alpha*-*-linux* | alpha*-*-osf*) TARGET=ALPHA; TARGETDIR=alpha;; ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; esac --- 2394,2407 ---- sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; ! alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; esac *************** else *** 2471,2476 **** --- 2492,2515 ---- fi + if test x$TARGET = xPOWERPC_AIX; then + POWERPC_AIX_TRUE= + POWERPC_AIX_FALSE='#' + else + POWERPC_AIX_TRUE='#' + POWERPC_AIX_FALSE= + fi + + + if test x$TARGET = xPOWERPC_DARWIN; then + POWERPC_DARWIN_TRUE= + POWERPC_DARWIN_FALSE='#' + else + POWERPC_DARWIN_TRUE='#' + POWERPC_DARWIN_FALSE= + fi + + if test x$TARGET = xARM; then ARM_TRUE= ARM_FALSE='#' *************** else *** 2480,2486 **** fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:2484: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= --- 2519,2525 ---- fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:2523: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= *************** else *** 2495,2507 **** # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2505: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2534,2546 ---- # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2544: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2512,2524 **** rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2522: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2551,2563 ---- rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2561: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2529,2541 **** rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2539: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2568,2580 ---- rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2578: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** fi *** 2560,2571 **** echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ! echo "configure:2564: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include --- 2599,2610 ---- echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ! echo "configure:2603: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include *************** else *** 2573,2579 **** #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2577: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 2612,2618 ---- #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2616: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** rm -f conftest* *** 2590,2596 **** if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 2629,2635 ---- if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** fi *** 2608,2614 **** if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 2647,2653 ---- if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** if test "$cross_compiling" = yes; then *** 2629,2635 **** : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') --- 2668,2674 ---- : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') *************** if (XOR (islower (i), ISLOWER (i)) || to *** 2640,2646 **** exit (0); } EOF ! if { (eval echo configure:2644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else --- 2679,2685 ---- exit (0); } EOF ! if { (eval echo configure:2683: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else *************** fi *** 2666,2677 **** for ac_func in memcpy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:2670: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:2709: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 2733,2739 ---- ; return 0; } EOF ! if { (eval echo configure:2737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 2721,2739 **** # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 ! echo "configure:2725: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF ! if { (eval echo configure:2737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else --- 2760,2778 ---- # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 ! echo "configure:2764: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF ! if { (eval echo configure:2776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else *************** EOF *** 2754,2765 **** fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 ! echo "configure:2758: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:2797: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else --- 2826,2832 ---- char *p = (char *) alloca(1); ; return 0; } EOF ! if { (eval echo configure:2830: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else *************** EOF *** 2819,2830 **** echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 ! echo "configure:2823: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:2862: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 *** 2849,2860 **** if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:2853: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:2892: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 2916,2922 ---- ; return 0; } EOF ! if { (eval echo configure:2920: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 2904,2910 **** fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 ! echo "configure:2908: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2943,2949 ---- fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 ! echo "configure:2947: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 2912,2918 **** ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else --- 2970,2976 ---- exit (find_stack_direction() < 0); } EOF ! if { (eval echo configure:2974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else *************** fi *** 2954,2990 **** echo $ac_n "checking size of short""... $ac_c" 1>&6 ! echo "configure:2958: checking size of short" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(short)); ! exit(0); ! } EOF ! if { (eval echo configure:2977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_short=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_short=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_short" 1>&6 cat >> confdefs.h <&6 ! echo "configure:2997: checking size of short" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (short) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3013: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_short=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_short != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_short = x ; then + { echo "configure: error: cannot determine a size for short" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_short" 1>&6 cat >> confdefs.h <&6 ! echo "configure:2997: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(int)); ! exit(0); ! } EOF ! if { (eval echo configure:3016: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_int=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_int=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_int" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3036: checking size of int" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (int) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3052: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_int=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_int != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_int = x ; then + { echo "configure: error: cannot determine a size for int" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_int" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3036: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(long)); ! exit(0); ! } EOF ! if { (eval echo configure:3055: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_long=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_long=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_long" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3075: checking size of long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (long) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3091: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_long=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_long != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_long = x ; then + { echo "configure: error: cannot determine a size for long" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_long" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3075: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(long long)); ! exit(0); ! } EOF ! if { (eval echo configure:3094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_long_long=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_long_long=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_long_long" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3114: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (long long) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3130: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_long_long=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_long_long != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_long_long = x ; then + { echo "configure: error: cannot determine a size for long long" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_long_long" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3114: checking size of float" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(float)); ! exit(0); ! } EOF ! if { (eval echo configure:3133: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_float=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_float=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_float" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3153: checking size of float" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (float) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3169: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_float=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_float != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_float = x ; then + { echo "configure: error: cannot determine a size for float" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_float" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3153: checking size of double" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(double)); ! exit(0); ! } EOF ! if { (eval echo configure:3172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_double=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_double=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_double" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3192: checking size of double" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (double) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3208: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_double=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_double != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_double = x ; then + { echo "configure: error: cannot determine a size for double" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_double" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3192: checking size of long double" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(long double)); ! exit(0); ! } EOF ! if { (eval echo configure:3211: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_long_double=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_long_double=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_long_double" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3231: checking size of long double" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (long double) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3247: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_long_double=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_long_double != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_long_double = x ; then + { echo "configure: error: cannot determine a size for long double" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_long_double" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3232: checking size of void *" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(void *)); ! exit(0); ! } EOF ! if { (eval echo configure:3251: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_void_p=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_void_p=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_void_p" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3271: checking size of void *" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (void *) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:3287: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_void_p=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_void_p != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_void_p = x ; then + { echo "configure: error: cannot determine a size for void *" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_void_p" 1>&6 cat >> confdefs.h <&6 ! echo "configure:3271: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext < #include --- 3306,3319 ---- echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 ! echo "configure:3310: checking whether byte ordering is bigendian" >&5 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_cv_c_bigendian=unknown # See if sys/param.h defines the BYTE_ORDER macro. cat > conftest.$ac_ext < #include *************** int main() { *** 3285,3295 **** #endif ; return 0; } EOF ! if { (eval echo configure:3289: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext < #include --- 3324,3334 ---- #endif ; return 0; } EOF ! if { (eval echo configure:3328: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* # It does; now see whether it defined to BIG_ENDIAN or not. cat > conftest.$ac_ext < #include *************** int main() { *** 3300,3306 **** #endif ; return 0; } EOF ! if { (eval echo configure:3304: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else --- 3339,3345 ---- #endif ; return 0; } EOF ! if { (eval echo configure:3343: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_bigendian=yes else *************** fi *** 3317,3326 **** rm -f conftest* if test $ac_cv_c_bigendian = unknown; then if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else --- 3372,3378 ---- exit (u.c[sizeof (long) - 1] == 1); } EOF ! if { (eval echo configure:3376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_bigendian=no else *************** fi *** 3349,3361 **** --- 3388,3484 ---- fi echo "$ac_t""$ac_cv_c_bigendian" 1>&6 + if test $ac_cv_c_bigendian = unknown; then + echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6 + echo "configure:3394: checking to probe for byte ordering" >&5 + + cat >conftest.c <&6 + ac_cv_c_bigendian=yes + fi + if test `grep -l LiTTleEnDian conftest.o` ; then + echo $ac_n ' little endian probe OK, ' 1>&6 + if test $ac_cv_c_bigendian = yes ; then + ac_cv_c_bigendian=unknown; + else + ac_cv_c_bigendian=no + fi + fi + echo $ac_n 'guessing bigendian ... ' >&6 + fi + fi + echo "$ac_t""$ac_cv_c_bigendian" 1>&6 + fi if test $ac_cv_c_bigendian = yes; then cat >> confdefs.h <<\EOF #define WORDS_BIGENDIAN 1 EOF + BYTEORDER=4321 + else + BYTEORDER=1234 + fi + cat >> confdefs.h <&2; exit 1; } + fi + + + if test x$TARGET = xSPARC; then + echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6 + echo "configure:3444: checking assembler and linker support unaligned pc related relocs" >&5 + if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS -fpic" + LDFLAGS="$LDFLAGS -shared" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + libffi_cv_as_sparc_ua_pcrel=yes + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + libffi_cv_as_sparc_ua_pcrel=no + fi + rm -f conftest* + CFLAGS="$save_CFLAGS" + LDFLAGS="$save_LDFLAGS" fi + echo "$ac_t""$libffi_cv_as_sparc_ua_pcrel" 1>&6 + if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then + cat >> confdefs.h <<\EOF + #define HAVE_AS_SPARC_UA_PCREL 1 + EOF + + fi + fi *************** fi *** 3365,3404 **** # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" ! cat >> confdefs.h <<\EOF #define FFI_DEBUG 1 EOF fi ! # Check whether --enable-debug or --disable-debug was given. ! if test "${enable_debug+set}" = set; then ! enableval="$enable_debug" ! cat >> confdefs.h <<\EOF #define FFI_NO_STRUCTS 1 EOF fi ! # Check whether --enable-debug or --disable-debug was given. ! if test "${enable_debug+set}" = set; then ! enableval="$enable_debug" ! cat >> confdefs.h <<\EOF #define FFI_NO_RAW_API 1 EOF fi # Check whether --enable-purify-safety or --disable-purify-safety was given. if test "${enable_purify_safety+set}" = set; then enableval="$enable_purify_safety" ! cat >> confdefs.h <<\EOF #define USING_PURIFY 1 EOF fi --- 3488,3535 ---- # Check whether --enable-debug or --disable-debug was given. if test "${enable_debug+set}" = set; then enableval="$enable_debug" ! if test "$enable_debug" = "yes"; then ! cat >> confdefs.h <<\EOF #define FFI_DEBUG 1 EOF + fi fi ! # Check whether --enable-structs or --disable-structs was given. ! if test "${enable_structs+set}" = set; then ! enableval="$enable_structs" ! if test "$enable_structs" = "no"; then ! cat >> confdefs.h <<\EOF #define FFI_NO_STRUCTS 1 EOF + fi fi ! # Check whether --enable-raw-api or --disable-raw-api was given. ! if test "${enable_raw_api+set}" = set; then ! enableval="$enable_raw_api" ! if test "$enable_raw_api" = "no"; then ! cat >> confdefs.h <<\EOF #define FFI_NO_RAW_API 1 EOF + fi fi # Check whether --enable-purify-safety or --disable-purify-safety was given. if test "${enable_purify_safety+set}" = set; then enableval="$enable_purify_safety" ! if test "$enable_purify_safety" = "yes"; then ! cat >> confdefs.h <<\EOF #define USING_PURIFY 1 EOF + fi fi *************** s%@M68K_TRUE@%$M68K_TRUE%g *** 3601,3606 **** --- 3732,3741 ---- s%@M68K_FALSE@%$M68K_FALSE%g s%@POWERPC_TRUE@%$POWERPC_TRUE%g s%@POWERPC_FALSE@%$POWERPC_FALSE%g + s%@POWERPC_AIX_TRUE@%$POWERPC_AIX_TRUE%g + s%@POWERPC_AIX_FALSE@%$POWERPC_AIX_FALSE%g + s%@POWERPC_DARWIN_TRUE@%$POWERPC_DARWIN_TRUE%g + s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g s%@ARM_TRUE@%$ARM_TRUE%g s%@ARM_FALSE@%$ARM_FALSE%g s%@CPP@%$CPP%g *************** cat >> $CONFIG_STATUS <<\EOF *** 3842,3847 **** --- 3977,3983 ---- test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" ac_file=Makefile . ${libffi_basedir}/../config-ml.in fi diff -Nrc3pad gcc-3.0.4/libffi/configure.in gcc-3.1/libffi/configure.in *** gcc-3.0.4/libffi/configure.in Mon Jun 25 19:57:42 2001 --- gcc-3.1/libffi/configure.in Wed May 8 04:25:49 2002 *************** dnl Process this with autoconf to create *** 2,7 **** --- 2,13 ---- AC_INIT(fficonfig.h.in) AM_CONFIG_HEADER(fficonfig.h) + # This works around the fact that libtool configuration may change LD + # for this particular configuration, but some shells, instead of + # keeping the changes in LD private, export them just because LD is + # exported. + ORIGINAL_LD_FOR_MULTILIBS=$LD + dnl Default to --enable-multilib AC_ARG_ENABLE(multilib, [ --enable-multilib build many library versions (default)], *************** i*86-*-linux*) TARGET=X86; TARGETDIR=x86 *** 44,49 **** --- 50,56 ---- i*86-*-solaris*) TARGET=X86; TARGETDIR=x86;; i*86-*-beos*) TARGET=X86; TARGETDIR=x86;; i*86-*-freebsd*) TARGET=X86; TARGETDIR=x86;; + i*86-*-netbsdelf*) TARGET=X86; TARGETDIR=x86;; i*86-*-win32*) TARGET=X86_WIN32; TARGETDIR=x86;; i*86-*-cygwin*) TARGET=X86_WIN32; TARGETDIR=x86;; i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; *************** sparc-sun-4*) TARGET=SPARC; TARGETDIR=sp *** 51,61 **** sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; ! alpha*-*-linux* | alpha*-*-osf*) TARGET=ALPHA; TARGETDIR=alpha;; ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; esac --- 58,71 ---- sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; ! alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; esac *************** AM_CONDITIONAL(ALPHA, test x$TARGET = xA *** 72,77 **** --- 82,89 ---- AM_CONDITIONAL(IA64, test x$TARGET = xIA64) AM_CONDITIONAL(M68K, test x$TARGET = xM68K) AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC) + AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX) + AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN) AM_CONDITIONAL(ARM, test x$TARGET = xARM) AC_HEADER_STDC *************** AC_CHECK_FUNCS(memcpy) *** 79,108 **** AC_FUNC_ALLOCA dnl AC_CHECK_SIZEOF(char) ! AC_CHECK_SIZEOF(short) ! AC_CHECK_SIZEOF(int) ! AC_CHECK_SIZEOF(long) ! AC_CHECK_SIZEOF(long long) ! AC_CHECK_SIZEOF(float) ! AC_CHECK_SIZEOF(double) ! AC_CHECK_SIZEOF(long double) ! AC_CHECK_SIZEOF(void *) ! AC_C_BIGENDIAN AC_SUBST(TARGET) AC_SUBST(TARGETDIR) AC_SUBST(SHELL) ! AC_ARG_ENABLE(debug,[ --enable-debug debugging mode], AC_DEFINE(FFI_DEBUG)) ! AC_ARG_ENABLE(debug,[ --disable-structs omit code for struct support], AC_DEFINE(FFI_NO_STRUCTS)) ! AC_ARG_ENABLE(debug,[ --disable-raw-api make the raw api unavailable], AC_DEFINE(FFI_NO_RAW_API)) AC_ARG_ENABLE(purify-safety, ! [ --enable-purify-safety purify-safe mode], AC_DEFINE(USING_PURIFY)) AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host") --- 91,153 ---- AC_FUNC_ALLOCA dnl AC_CHECK_SIZEOF(char) ! AC_COMPILE_CHECK_SIZEOF(short) ! AC_COMPILE_CHECK_SIZEOF(int) ! AC_COMPILE_CHECK_SIZEOF(long) ! AC_COMPILE_CHECK_SIZEOF(long long) ! AC_COMPILE_CHECK_SIZEOF(float) ! AC_COMPILE_CHECK_SIZEOF(double) ! AC_COMPILE_CHECK_SIZEOF(long double) ! AC_COMPILE_CHECK_SIZEOF(void *) ! AC_C_BIGENDIAN_CROSS ! ! if test x$TARGET = xSPARC; then ! AC_CACHE_CHECK([assembler and linker support unaligned pc related relocs], ! libffi_cv_as_sparc_ua_pcrel, [ ! save_CFLAGS="$CFLAGS" ! save_LDFLAGS="$LDFLAGS" ! CFLAGS="$CFLAGS -fpic" ! LDFLAGS="$LDFLAGS -shared" ! AC_TRY_LINK([asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");],, ! [libffi_cv_as_sparc_ua_pcrel=yes], ! [libffi_cv_as_sparc_ua_pcrel=no]) ! CFLAGS="$save_CFLAGS" ! LDFLAGS="$save_LDFLAGS"]) ! if test "x$libffi_cv_as_sparc_ua_pcrel" = xyes; then ! AC_DEFINE(HAVE_AS_SPARC_UA_PCREL, 1, ! [Define if your assembler and linker support unaligned PC relative relocs.]) ! fi ! fi AC_SUBST(TARGET) AC_SUBST(TARGETDIR) AC_SUBST(SHELL) ! AC_ARG_ENABLE(debug, ! [ --enable-debug debugging mode], ! if test "$enable_debug" = "yes"; then ! AC_DEFINE(FFI_DEBUG) ! fi) ! AC_ARG_ENABLE(structs, ! [ --disable-structs omit code for struct support], ! if test "$enable_structs" = "no"; then ! AC_DEFINE(FFI_NO_STRUCTS) ! fi) ! AC_ARG_ENABLE(raw-api, ! [ --disable-raw-api make the raw api unavailable], ! if test "$enable_raw_api" = "no"; then ! AC_DEFINE(FFI_NO_RAW_API) ! fi) AC_ARG_ENABLE(purify-safety, ! [ --enable-purify-safety purify-safe mode], ! if test "$enable_purify_safety" = "yes"; then ! AC_DEFINE(USING_PURIFY) ! fi) AM_CONDITIONAL(USE_LIBDIR, test -z "$with_cross_host") *************** fi *** 115,120 **** --- 160,166 ---- AC_OUTPUT(include/Makefile include/ffi.h Makefile, [ if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" ac_file=Makefile . ${libffi_basedir}/../config-ml.in fi ], diff -Nrc3pad gcc-3.0.4/libffi/fficonfig.h.in gcc-3.1/libffi/fficonfig.h.in *** gcc-3.0.4/libffi/fficonfig.h.in Wed Sep 1 23:16:34 1999 --- gcc-3.1/libffi/fficonfig.h.in Sun Apr 28 20:12:04 2002 *************** *** 68,70 **** --- 68,73 ---- /* Define if you have the memcpy function. */ #undef HAVE_MEMCPY + + /* Define if your assembler and linker support unaligned PC relative relocs. */ + #undef HAVE_AS_SPARC_UA_PCREL diff -Nrc3pad gcc-3.0.4/libffi/include/Makefile.in gcc-3.1/libffi/include/Makefile.in *** gcc-3.0.4/libffi/include/Makefile.in Fri Mar 3 16:58:42 2000 --- gcc-3.1/libffi/include/Makefile.in Tue Oct 9 05:32:16 2001 *************** *** 1,4 **** ! # Makefile.in generated automatically by automake 1.4a from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation --- 1,4 ---- ! # Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation *************** *** 10,15 **** --- 10,16 ---- # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. + SHELL = @SHELL@ srcdir = @srcdir@ *************** AUTOMAKE = @AUTOMAKE@ *** 45,54 **** AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ ! INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ - INSTALL_STRIP_FLAG = transform = @program_transform_name@ NORMAL_INSTALL = : --- 46,54 ---- AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ ! INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : *************** host_alias = @host_alias@ *** 61,82 **** host_triplet = @host@ AS = @AS@ CC = @CC@ DLLTOOL = @DLLTOOL@ EXEEXT = @EXEEXT@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ OBJDUMP = @OBJDUMP@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SHELL = @SHELL@ TARGET = @TARGET@ TARGETDIR = @TARGETDIR@ VERSION = @VERSION@ libffi_basedir = @libffi_basedir@ - AUTOMAKE_OPTIONS = foreign EXTRA_DIST = ffi.h.in ffi_common.h ffi_mips.h --- 61,87 ---- host_triplet = @host@ AS = @AS@ CC = @CC@ + CXX = @CXX@ + CXXCPP = @CXXCPP@ DLLTOOL = @DLLTOOL@ EXEEXT = @EXEEXT@ + GCJ = @GCJ@ + GCJFLAGS = @GCJFLAGS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ OBJDUMP = @OBJDUMP@ + OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ SHELL = @SHELL@ + STRIP = @STRIP@ TARGET = @TARGET@ TARGETDIR = @TARGETDIR@ VERSION = @VERSION@ libffi_basedir = @libffi_basedir@ AUTOMAKE_OPTIONS = foreign EXTRA_DIST = ffi.h.in ffi_common.h ffi_mips.h *************** EXTRA_DIST = ffi.h.in ffi_common.h ffi_m *** 84,101 **** hackdir = $(includedir) hack_DATA = fficonfig.h ffi.h ffi_mips.h ! subdir = include ! mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../fficonfig.h CONFIG_CLEAN_FILES = ffi.h - DIST_SOURCES = DATA = $(hack_DATA) ! DIST_COMMON = $(hack_DATA) Makefile.am Makefile.in ffi.h.in ! DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) GZIP_ENV = --best all: all-redirect .SUFFIXES: --- 89,105 ---- hackdir = $(includedir) hack_DATA = fficonfig.h ffi.h ffi_mips.h ! mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs CONFIG_HEADER = ../fficonfig.h CONFIG_CLEAN_FILES = ffi.h DATA = $(hack_DATA) ! DIST_COMMON = Makefile.am Makefile.in ffi.h.in ! DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + TAR = gnutar GZIP_ENV = --best all: all-redirect .SUFFIXES: *************** install-hackDATA: $(hack_DATA) *** 113,130 **** @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(hackdir) @list='$(hack_DATA)'; for p in $$list; do \ ! if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ ! f="`echo $$p | sed -e 's|^.*/||'`"; \ ! echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(hackdir)/$$f"; \ ! $(INSTALL_DATA) $$d$$p $(DESTDIR)$(hackdir)/$$f; \ done uninstall-hackDATA: @$(NORMAL_UNINSTALL) ! @list='$(hack_DATA)'; for p in $$list; do \ ! f="`echo $$p | sed -e 's|^.*/||'`"; \ ! echo " rm -f $(DESTDIR)$(hackdir)/$$f"; \ ! rm -f $(DESTDIR)$(hackdir)/$$f; \ done tags: TAGS TAGS: --- 117,135 ---- @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(hackdir) @list='$(hack_DATA)'; for p in $$list; do \ ! if test -f $(srcdir)/$$p; then \ ! echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(hackdir)/$$p"; \ ! $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(hackdir)/$$p; \ ! else if test -f $$p; then \ ! echo " $(INSTALL_DATA) $$p $(DESTDIR)$(hackdir)/$$p"; \ ! $(INSTALL_DATA) $$p $(DESTDIR)$(hackdir)/$$p; \ ! fi; fi; \ done uninstall-hackDATA: @$(NORMAL_UNINSTALL) ! list='$(hack_DATA)'; for p in $$list; do \ ! rm -f $(DESTDIR)$(hackdir)/$$p; \ done tags: TAGS TAGS: *************** TAGS: *** 132,142 **** distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) distdir: $(DISTFILES) @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pR $$d/$$file $(distdir); \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ --- 137,154 ---- distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + subdir = include + distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign include/Makefile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ *************** uninstall: uninstall-am *** 165,171 **** all-am: Makefile $(DATA) all-redirect: all-am install-strip: ! $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(hackdir) --- 177,183 ---- all-am: Makefile $(DATA) all-redirect: all-am install-strip: ! $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(hackdir) *************** distclean-generic: *** 179,185 **** -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: - -rm -f Makefile.in mostlyclean-am: mostlyclean-generic mostlyclean: mostlyclean-am --- 191,196 ---- *************** maintainer-clean: maintainer-clean-am *** 202,209 **** .PHONY: uninstall-hackDATA install-hackDATA tags distdir info-am info \ dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ install-exec install-data-am install-data install-am install \ ! uninstall-am uninstall all-redirect all-am all install-strip \ ! installdirs mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean --- 213,220 ---- .PHONY: uninstall-hackDATA install-hackDATA tags distdir info-am info \ dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ install-exec install-data-am install-data install-am install \ ! uninstall-am uninstall all-redirect all-am all installdirs \ ! mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean diff -Nrc3pad gcc-3.0.4/libffi/include/ffi.h.in gcc-3.1/libffi/include/ffi.h.in *** gcc-3.0.4/libffi/include/ffi.h.in Tue Mar 27 00:58:23 2001 --- gcc-3.1/libffi/include/ffi.h.in Tue Mar 12 22:35:56 2002 *************** *** 1,7 **** /* -----------------------------------------------------------------*-C-*- ! libffi @VERSION@ - Copyright (c) 1996-1999 Cygnus Solutions ! ! $Id: ffi.h.in,v 1.7.2.2 2001/03/27 00:58:23 bryce Exp $ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the --- 1,5 ---- /* -----------------------------------------------------------------*-C-*- ! libffi @VERSION@ - Copyright (c) 1996-2002 Cygnus Solutions Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the *************** typedef enum ffi_abi { *** 235,240 **** --- 233,250 ---- FFI_DEFAULT_ABI = FFI_GCC_SYSV, #endif + #ifdef POWERPC_AIX + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_AIX, + #endif + + #ifdef POWERPC_DARWIN + FFI_AIX, + FFI_DARWIN, + FFI_DEFAULT_ABI = FFI_DARWIN, + #endif + /* ---- ARM --------------------- */ #ifdef ARM FFI_SYSV, *************** typedef struct { *** 297,302 **** --- 307,322 ---- } ffi_cif; + #if SIZEOF_ARG == 4 + typedef UINT32 ffi_arg; + #else + #if SIZEOF_ARG == 8 + typedef UINT64 ffi_arg; + #else + -- unsupported configuration + #endif + #endif + /* ---- Definitions for the raw API -------------------------------------- */ #if !FFI_NO_RAW_API *************** struct ffi_ia64_trampoline_struct { *** 392,397 **** --- 412,429 ---- #define FFI_TRAMPOLINE_SIZE 40 #define FFI_NATIVE_RAW_API 0 + #elif defined(POWERPC_DARWIN) + + #define FFI_CLOSURES 1 + #define FFI_TRAMPOLINE_SIZE 40 + #define FFI_NATIVE_RAW_API 0 + + #elif defined(POWERPC_AIX) + + #define FFI_CLOSURES 1 + #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ + #define FFI_NATIVE_RAW_API 0 + #else #define FFI_CLOSURES 0 *************** struct ffi_ia64_trampoline_struct { *** 399,404 **** --- 431,446 ---- #endif + #if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) + + struct ffi_aix_trampoline_struct { + void * code_pointer; /* Pointer to ffi_closure_ASM */ + void * toc; /* TOC */ + void * static_chain; /* Pointer to closure */ + }; + + #endif + #if FFI_CLOSURES diff -Nrc3pad gcc-3.0.4/libffi/include/ffi_mips.h gcc-3.1/libffi/include/ffi_mips.h *** gcc-3.0.4/libffi/include/ffi_mips.h Sun Aug 8 22:58:30 1999 --- gcc-3.1/libffi/include/ffi_mips.h Fri Mar 2 22:21:22 2001 *************** *** 3,10 **** MIPS FFI Definitions - $Id: ffi_mips.h,v 1.1 1999/08/08 22:58:30 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/alpha/ffi.c gcc-3.1/libffi/src/alpha/ffi.c *** gcc-3.0.4/libffi/src/alpha/ffi.c Mon Jul 16 16:51:30 2001 --- gcc-3.1/libffi/src/alpha/ffi.c Mon Jul 16 16:53:43 2001 *************** *** 3,10 **** Alpha Foreign Function Interface - $Id: ffi.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/arm/ffi.c gcc-3.1/libffi/src/arm/ffi.c *** gcc-3.0.4/libffi/src/arm/ffi.c Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/arm/ffi.c Fri Mar 2 22:21:23 2001 *************** *** 3,10 **** ARM Foreign Function Interface - $Id: ffi.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/arm/sysv.S gcc-3.1/libffi/src/arm/sysv.S *** gcc-3.0.4/libffi/src/arm/sysv.S Thu May 11 18:16:37 2000 --- gcc-3.1/libffi/src/arm/sysv.S Fri Mar 2 22:21:23 2001 *************** *** 3,10 **** ARM Foreign Function Interface - $Id: sysv.S,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/debug.c gcc-3.1/libffi/src/debug.c *** gcc-3.0.4/libffi/src/debug.c Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/debug.c Fri Mar 2 22:21:22 2001 *************** *** 1,8 **** /* ----------------------------------------------------------------------- debug.c - Copyright (c) 1996 Cygnus Solutions - $Id: debug.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 1,6 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/ffitest.c gcc-3.1/libffi/src/ffitest.c *** gcc-3.0.4/libffi/src/ffitest.c Tue Mar 27 00:58:23 2001 --- gcc-3.1/libffi/src/ffitest.c Sun Feb 24 17:31:45 2002 *************** *** 1,8 **** /* ----------------------------------------------------------------------- ffitest.c - Copyright (c) 1996, 1997, 1998 Cygnus Solutions - $Id: ffitest.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 1,6 ---- *************** int main(/*@unused@*/ int argc, /*@unuse *** 224,234 **** signed int si1; signed int si2; ! #if defined(ALPHA) || defined(IA64) || defined(SPARC64) || (defined(MIPS) && (_MIPS_SIM == _ABIN32)) ! long long rint; ! #else ! int rint; ! #endif long long rlonglong; ffi_type ts1_type; --- 222,228 ---- signed int si1; signed int si2; ! ffi_arg rint; long long rlonglong; ffi_type ts1_type; diff -Nrc3pad gcc-3.0.4/libffi/src/ia64/ffi.c gcc-3.1/libffi/src/ia64/ffi.c *** gcc-3.0.4/libffi/src/ia64/ffi.c Fri Feb 25 19:13:44 2000 --- gcc-3.1/libffi/src/ia64/ffi.c Mon Apr 8 22:31:16 2002 *************** *** 35,47 **** /* type long enough to hold an entire register. For now we use double. */ typedef double float80; ! /* The stack layout at call to ffi_prep_regs. Other_args will remain */ /* on the stack for the actual call. Everything else we be transferred */ /* to registers and popped by the assembly code. */ struct ia64_args { long scratch[2]; /* Two scratch words at top of stack. */ ! /* Allows sp to passed as arg pointer. */ void * r8_contents; /* Value to be passed in r8 */ long spare; /* Not used. */ float80 fp_regs[8]; /* Contents of 8 floating point argument */ --- 35,47 ---- /* type long enough to hold an entire register. For now we use double. */ typedef double float80; ! /* The stack layout at call to ffi_prep_args. Other_args will remain */ /* on the stack for the actual call. Everything else we be transferred */ /* to registers and popped by the assembly code. */ struct ia64_args { long scratch[2]; /* Two scratch words at top of stack. */ ! /* Allows sp to be passed as arg pointer. */ void * r8_contents; /* Value to be passed in r8 */ long spare; /* Not used. */ float80 fp_regs[8]; /* Contents of 8 floating point argument */ *************** static bool is_homogeneous_fp_aggregate( *** 123,129 **** } /* ffi_prep_args is called by the assembly routine once stack space ! has been allocated for the function's arguments. Returns nonzero if fp registers are used for arguments. */ static bool --- 123,130 ---- } /* ffi_prep_args is called by the assembly routine once stack space ! has been allocated for the function's arguments. It fills in ! the arguments in the structure referenced by stack. Returns nonzero if fp registers are used for arguments. */ static bool *************** ffi_prep_incoming_args_UNIX(struct ia64_ *** 463,469 **** */ /* ffi_closure_UNIX is an assembly routine, which copies the register */ ! /* state into s struct ia64_args, and the invokes */ /* ffi_closure_UNIX_inner. It also recovers the closure pointer */ /* from its fake gp pointer. */ void ffi_closure_UNIX(); --- 464,470 ---- */ /* ffi_closure_UNIX is an assembly routine, which copies the register */ ! /* state into a struct ia64_args, and then invokes */ /* ffi_closure_UNIX_inner. It also recovers the closure pointer */ /* from its fake gp pointer. */ void ffi_closure_UNIX(); *************** void ffi_closure_UNIX(); *** 473,479 **** #endif void ffi_closure_UNIX_inner (ffi_closure *closure, struct ia64_args * args) ! /* Hopefully declarint this as a varargs function will force all args */ /* to memory. */ { // this is our return value storage --- 474,480 ---- #endif void ffi_closure_UNIX_inner (ffi_closure *closure, struct ia64_args * args) ! /* Hopefully declaring this as a varargs function will force all args */ /* to memory. */ { // this is our return value storage diff -Nrc3pad gcc-3.0.4/libffi/src/ia64/unix.S gcc-3.1/libffi/src/ia64/unix.S *** gcc-3.0.4/libffi/src/ia64/unix.S Thu Apr 26 01:03:02 2001 --- gcc-3.1/libffi/src/ia64/unix.S Mon Apr 8 22:31:16 2002 *************** *** 42,54 **** #define FLOAT_SZ 8 /* in-memory size of fp operands */ .text .align 16 ! .global ffi_call_unix# ! .proc ffi_call_unix# ffi_call_unix: ! alloc loc0=ar.pfs,6,5,8,0 mov loc1=b0; sub sp=sp,bytes mov loc4=r1 /* Save gp */ ld8 r8=[callback],8 /* code address of callback */ --- 42,65 ---- #define FLOAT_SZ 8 /* in-memory size of fp operands */ + /* Allocate an ia64_args structure on the stack; call ffi_prep_args */ + /* to fill it in with argument values; copy those to the real */ + /* registers, leaving overflow arguments on the stack. Then call fn */ + /* and move the result from registers into *raddr. */ + .pred.safe_across_calls p1-p5,p16-p63 .text .align 16 ! .global ffi_call_unix ! .proc ffi_call_unix ffi_call_unix: ! .prologue ! .save ar.pfs,r38 /* loc0 */ ! alloc loc0=ar.pfs,6,6,8,0 ! .save rp,loc1 mov loc1=b0; + .vframe loc5 + mov loc5=sp; + .body sub sp=sp,bytes mov loc4=r1 /* Save gp */ ld8 r8=[callback],8 /* code address of callback */ *************** fp_done: *** 104,110 **** ;; ld8 r1=[fn] /* Set up gp */ mov b6=r8;; ! br.call.sptk.many b0 = b6 /* call ffi_prep_args */ /* Handle return value. */ cmp.eq p6,p0=0,raddr --- 115,121 ---- ;; ld8 r1=[fn] /* Set up gp */ mov b6=r8;; ! br.call.sptk.many b0 = b6 /* call fn */ /* Handle return value. */ cmp.eq p6,p0=0,raddr *************** fp_done: *** 126,131 **** --- 137,143 ---- (p8) stfs [raddr]=f8 (p9) stfd [raddr]=f8 ;; + .label_state 1 (p6) br.cond.dpnt.few handle_float_hfa (p7) br.cond.dpnt.few handle_double_hfa br done *************** done: *** 151,159 **** --- 163,175 ---- mov r1=loc4 /* Restore gp */ mov ar.pfs = loc0 mov b0 = loc1 + .restore sp + mov sp = loc5 br.ret.sptk.many b0 handle_double_hfa: + .body + .copy_state 1 /* Homogeneous floating point array of doubles is returned in */ /* registers f8-f15. Save one at a time to return area. */ and flags=0xf,flags /* Retrieve size */ *************** shfa2: add loc3=1*4,raddr *** 242,254 **** .endp ffi_call_unix .text .align 16 .global ffi_closure_UNIX .proc ffi_closure_UNIX ffi_closure_UNIX: ! alloc loc0=ar.pfs,8,2,2,0 mov loc1=b0 /* Retrieve closure pointer and real gp. */ mov out0=gp add gp=16,gp --- 258,276 ---- .endp ffi_call_unix + .pred.safe_across_calls p1-p5,p16-p63 .text .align 16 .global ffi_closure_UNIX .proc ffi_closure_UNIX ffi_closure_UNIX: ! .prologue ! .save ar.pfs,r40 /* loc0 */ ! alloc loc0=ar.pfs,8,3,2,0 ! .save rp,loc1 mov loc1=b0 + .vframe loc2 + mov loc2=sp /* Retrieve closure pointer and real gp. */ mov out0=gp add gp=16,gp *************** ffi_closure_UNIX: *** 295,301 **** ;; mov b0=loc1 mov ar.pfs=loc0 ! add sp=BASIC_ARGS_SZ,sp br.ret.sptk.many b0 .endp ffi_closure_UNIX --- 317,324 ---- ;; mov b0=loc1 mov ar.pfs=loc0 ! .restore sp ! mov sp=loc2 br.ret.sptk.many b0 .endp ffi_closure_UNIX diff -Nrc3pad gcc-3.0.4/libffi/src/java_raw_api.c gcc-3.1/libffi/src/java_raw_api.c *** gcc-3.0.4/libffi/src/java_raw_api.c Fri Feb 25 19:13:44 2000 --- gcc-3.1/libffi/src/java_raw_api.c Mon Apr 8 22:31:14 2002 *************** ffi_java_raw_size (ffi_cif *cif) *** 52,57 **** --- 52,58 ---- switch((*at) -> type) { case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: result += 2 * SIZEOF_ARG; break; case FFI_TYPE_STRUCT: diff -Nrc3pad gcc-3.0.4/libffi/src/mips/ffi.c gcc-3.1/libffi/src/mips/ffi.c *** gcc-3.0.4/libffi/src/mips/ffi.c Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/mips/ffi.c Fri Mar 2 22:21:23 2001 *************** *** 3,10 **** MIPS Foreign Function Interface - $Id: ffi.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/mips/n32.S gcc-3.1/libffi/src/mips/n32.S *** gcc-3.0.4/libffi/src/mips/n32.S Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/mips/n32.S Fri Mar 2 22:21:23 2001 *************** *** 3,10 **** MIPS Foreign Function Interface - $Id: n32.S,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/mips/n32.s gcc-3.1/libffi/src/mips/n32.s *** gcc-3.0.4/libffi/src/mips/n32.s Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/mips/n32.s Thu Jan 1 00:00:00 1970 *************** *** 1,14 **** - #include "n32.S" - - - - - - - - - - - - - --- 0 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/mips/o32.S gcc-3.1/libffi/src/mips/o32.S *** gcc-3.0.4/libffi/src/mips/o32.S Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/mips/o32.S Fri Mar 2 22:21:23 2001 *************** *** 3,10 **** MIPS Foreign Function Interface - $Id: o32.S,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/mips/o32.s gcc-3.1/libffi/src/mips/o32.s *** gcc-3.0.4/libffi/src/mips/o32.s Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/mips/o32.s Thu Jan 1 00:00:00 1970 *************** *** 1,2 **** - #include "o32.S" - --- 0 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/powerpc/aix.S gcc-3.1/libffi/src/powerpc/aix.S *** gcc-3.0.4/libffi/src/powerpc/aix.S Thu Jan 1 00:00:00 1970 --- gcc-3.1/libffi/src/powerpc/aix.S Fri Jan 18 18:41:11 2002 *************** *** 0 **** --- 1,224 ---- + /* ----------------------------------------------------------------------- + aix.S - Copyright (c) 2002 Free Software Foundation, Inc. + based on darwin.S by John Hornkvist + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + .set r0,0 + .set r1,1 + .set r2,2 + .set r3,3 + .set r4,4 + .set r5,5 + .set r6,6 + .set r7,7 + .set r8,8 + .set r9,9 + .set r10,10 + .set r11,11 + .set r12,12 + .set r13,13 + .set r14,14 + .set r15,15 + .set r16,16 + .set r17,17 + .set r18,18 + .set r19,19 + .set r20,20 + .set r21,21 + .set r22,22 + .set r23,23 + .set r24,24 + .set r25,25 + .set r26,26 + .set r27,27 + .set r28,28 + .set r29,29 + .set r30,30 + .set r31,31 + .set f0,0 + .set f1,1 + .set f2,2 + .set f3,3 + .set f4,4 + .set f5,5 + .set f6,6 + .set f7,7 + .set f8,8 + .set f9,9 + .set f10,10 + .set f11,11 + .set f12,12 + .set f13,13 + .set f14,14 + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + + #define LIBFFI_ASM + #include + #define JUMPTARGET(name) name + #define L(x) x + .file "aix.S" + .toc + .csect .text[PR] + .align 2 + .globl ffi_prep_args + + .csect .text[PR] + .align 2 + .globl ffi_call_AIX + .globl .ffi_call_AIX + .csect ffi_call_AIX[DS] + ffi_call_AIX: + .long .ffi_call_AIX, TOC[tc0], 0 + .csect .text[PR] + .ffi_call_AIX: + mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved... + /* Save the old stack pointer as AP. */ + mr r8,r1 + + /* Allocate the stack space we need. */ + stwux r1,r1,r4 + + /* Save registers we use. */ + mflr r9 + + stw r28,-16(r8) + stw r29,-12(r8) + stw r30, -8(r8) + stw r31, -4(r8) + + stw r9, 8(r8) + stw r2, 20(r1) + + /* Save arguments over call... */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + + lwz r2,4(r12) + lwz r12,0(r12) + mtctr r12 // r12 holds address of _ffi_prep_args + bctrl + lwz r2,20(r1) + + /* Now do the call. */ + lwz r12,0(r29) + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + stw r2,20(r1) + mtctr r12 + lwz r2,4(r29) + /* Load all those argument registers. */ + // We have set up a nice stack frame, just load it into registers. + lwz r3, 20+(1*4)(r1) + lwz r4, 20+(2*4)(r1) + lwz r5, 20+(3*4)(r1) + lwz r6, 20+(4*4)(r1) + nop + lwz r7, 20+(5*4)(r1) + lwz r8, 20+(6*4)(r1) + lwz r9, 20+(7*4)(r1) + lwz r10,20+(8*4)(r1) + + L1: + /* Load all the FP registers. */ + bf 6,L2 // 2f + 0x18 + lfd f1,-16-(13*8)(r28) + lfd f2,-16-(12*8)(r28) + lfd f3,-16-(11*8)(r28) + lfd f4,-16-(10*8)(r28) + nop + lfd f5,-16-(9*8)(r28) + lfd f6,-16-(8*8)(r28) + lfd f7,-16-(7*8)(r28) + lfd f8,-16-(6*8)(r28) + nop + lfd f9,-16-(5*8)(r28) + lfd f10,-16-(4*8)(r28) + lfd f11,-16-(3*8)(r28) + lfd f12,-16-(2*8)(r28) + nop + lfd f13,-16-(1*8)(r28) + + L2: + /* Make the call. */ + bctrl + lwz r2,20(r1) + + /* Now, deal with the return value. */ + mtcrf 0x01,r31 + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stw r3,0(r30) + bf 28,L(done_return_value) + stw r4,4(r30) + + /* Fall through... */ + + L(done_return_value): + /* Restore the registers we used and return. */ + lwz r9, 8(r28) + lwz r31, -4(r28) + mtlr r9 + lwz r30, -8(r28) + lwz r29,-12(r28) + lwz r28,-16(r28) + lwz r1,0(r1) + blr + + L(fp_return_value): + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + L(float_return_value): + stfs f1,0(r30) + b L(done_return_value) + .long 0 + .byte 0,0,0,1,128,4,0,0 + //END(ffi_call_AIX) + + .csect .text[PR] + .align 2 + .globl ffi_call_DARWIN + .globl .ffi_call_DARWIN + .csect ffi_call_DARWIN[DS] + ffi_call_DARWIN: + .long .ffi_call_DARWIN, TOC[tc0], 0 + .csect .text[PR] + .ffi_call_DARWIN: + blr + .long 0 + .byte 0,0,0,0,0,0,0,0 + //END(ffi_call_DARWIN) diff -Nrc3pad gcc-3.0.4/libffi/src/powerpc/aix_closure.S gcc-3.1/libffi/src/powerpc/aix_closure.S *** gcc-3.0.4/libffi/src/powerpc/aix_closure.S Thu Jan 1 00:00:00 1970 --- gcc-3.1/libffi/src/powerpc/aix_closure.S Tue Mar 12 22:35:56 2002 *************** *** 0 **** --- 1,251 ---- + /* ----------------------------------------------------------------------- + aix_closures.S - Copyright (c) 2002 Free Software Foundation, Inc. + based on darwin_closures.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + .set r0,0 + .set r1,1 + .set r2,2 + .set r3,3 + .set r4,4 + .set r5,5 + .set r6,6 + .set r7,7 + .set r8,8 + .set r9,9 + .set r10,10 + .set r11,11 + .set r12,12 + .set r13,13 + .set r14,14 + .set r15,15 + .set r16,16 + .set r17,17 + .set r18,18 + .set r19,19 + .set r20,20 + .set r21,21 + .set r22,22 + .set r23,23 + .set r24,24 + .set r25,25 + .set r26,26 + .set r27,27 + .set r28,28 + .set r29,29 + .set r30,30 + .set r31,31 + .set f0,0 + .set f1,1 + .set f2,2 + .set f3,3 + .set f4,4 + .set f5,5 + .set f6,6 + .set f7,7 + .set f8,8 + .set f9,9 + .set f10,10 + .set f11,11 + .set f12,12 + .set f13,13 + .set f14,14 + .set f15,15 + .set f16,16 + .set f17,17 + .set f18,18 + .set f19,19 + .set f20,20 + .set f21,21 + + #define LIBFFI_ASM + #define JUMPTARGET(name) name + #define L(x) x + .file "aix_closure.S" + .toc + LC..60: + .tc L..60[TC],L..60 + .csect .text[PR] + .align 2 + + .csect .text[PR] + .align 2 + .globl ffi_closure_ASM + .globl .ffi_closure_ASM + .csect ffi_closure_ASM[DS] + + ffi_closure_ASM: + .long .ffi_closure_ASM, TOC[tc0], 0 + .csect .text[PR] + .ffi_closure_ASM: + + mflr r0 /* extract return address */ + stw r0, 8(r1) /* save the return address */ + + /* 24 Bytes (Linkage Area) */ + /* 32 Bytes (params) */ + /* 104 Bytes (13*8 from FPR) */ + /* 4 Bytes (result) + /* 164 Bytes */ + + stwu r1,-164(r1) /* skip over caller save area */ + + /* we want to build up an area for the parameters passed */ + /* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) */ + /* in the parents outgoing area */ + stw r3, 188(r1) + stw r4, 192(r1) + stw r5, 196(r1) + stw r6, 200(r1) + stw r7, 204(r1) + stw r8, 208(r1) + stw r9, 212(r1) + stw r10, 216(r1) + + /* next save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 56(r1) + stfd f2, 64(r1) + stfd f3, 72(r1) + stfd f4, 80(r1) + stfd f5, 88(r1) + stfd f6, 96(r1) + stfd f7, 104(r1) + stfd f8, 112(r1) + stfd f9, 120(r1) + stfd f10, 128(r1) + stfd f11, 136(r1) + stfd f12, 144(r1) + stfd f13, 152(r1) + + /* set up registers for the routine that actually does the work */ + /* get the context pointer from the trampoline */ + mr r3,r11 + + /* now load up the pointer to the result storage */ + addi r4,r1,160 + + /* now load up the pointer to the saved gpr registers */ + addi r5,r1,188 + + /* now load up the pointer to the saved fpr registers */ + addi r6,r1,56 + + /* now load up the pointer to the outgoing parameter */ + /* stack in the previous frame */ + addi r7,r1,220 + + /* make the call */ + bl .ffi_closure_helper_DARWIN + nop + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ + addi r5,r1,160 /* get pointer to results area */ + lwz r4,LC..60(2) /* get address of jump table */ + slwi r3,r3,2 /* now multiply return type by 4 */ + lwzx r3,r4,r3 /* get the contents of that table value */ + add r3,r3,r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + + L..60: + .long L..44-L..60 /* FFI_TYPE_VOID */ + .long L..50-L..60 /* FFI_TYPE_INT */ + .long L..47-L..60 /* FFI_TYPE_FLOAT */ + .long L..46-L..60 /* FFI_TYPE_DOUBLE */ + .long L..46-L..60 /* FFI_TYPE_LONGDOUBLE */ + .long L..56-L..60 /* FFI_TYPE_UINT8 */ + .long L..55-L..60 /* FFI_TYPE_SINT8 */ + .long L..58-L..60 /* FFI_TYPE_UINT16 */ + .long L..57-L..60 /* FFI_TYPE_SINT16 */ + .long L..50-L..60 /* FFI_TYPE_UINT32 */ + .long L..50-L..60 /* FFI_TYPE_SINT32 */ + .long L..48-L..60 /* FFI_TYPE_UINT64 */ + .long L..48-L..60 /* FFI_TYPE_SINT64 */ + .long L..44-L..60 /* FFI_TYPE_STRUCT */ + .long L..50-L..60 /* FFI_TYPE_POINTER */ + + + /* case double */ + L..46: + lfd f1,0(r5) + b L..44 + + /* case float */ + L..47: + lfs f1,0(r5) + b L..44 + + /* case long long */ + L..48: + lwz r3,0(r5) + lwz r4,4(r5) + b L..44 + + /* case default / int32 / pointer */ + L..50: + lwz r3,0(r5) + b L..44 + + /* case signed int8 */ + L..55: + addi r5,r5,3 + lbz r3,0(r5) + slwi r3,r3,24 + srawi r3,r3,24 + b L..44 + + /* case unsigned int8 */ + L..56: + addi r5,r5,3 + lbz r3,0(r5) + b L..44 + + /* case signed int16 */ + L..57: + addi r5,r5,2 + lhz r3,0(r5) + extsh r3,r3 + b L..44 + + /* case unsigned int16 */ + L..58: + addi r5,r5,2 + lhz r3,0(r5) + + /* case void / done */ + L..44: + + addi r1,r1,164 /* restore stack pointer */ + lwz r0,8(r1) /* get return address */ + mtlr r0 /* reset link register */ + blr + + /* END(ffi_closure_ASM) */ diff -Nrc3pad gcc-3.0.4/libffi/src/powerpc/darwin.S gcc-3.1/libffi/src/powerpc/darwin.S *** gcc-3.0.4/libffi/src/powerpc/darwin.S Thu Jan 1 00:00:00 1970 --- gcc-3.1/libffi/src/powerpc/darwin.S Fri Jan 18 16:22:34 2002 *************** *** 0 **** --- 1,159 ---- + /* ----------------------------------------------------------------------- + darwin.S - Copyright (c) 2000 John Hornkvist + + PowerPC Assembly glue. + + $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + #define LIBFFI_ASM + #include + #define JUMPTARGET(name) name + #define L(x) x + .text + .align 2 + .globl _ffi_prep_args + + .text + .align 2 + .globl _ffi_call_DARWIN + .text + .align 2 + _ffi_call_DARWIN: + mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved... + /* Save the old stack pointer as AP. */ + mr r8,r1 + + /* Allocate the stack space we need. */ + stwux r1,r1,r4 + + /* Save registers we use. */ + mflr r9 + + stw r28,-16(r8) + stw r29,-12(r8) + stw r30, -8(r8) + stw r31, -4(r8) + + stw r9, 8(r8) + stw r2, 20(r1) + + /* Save arguments over call... */ + mr r31,r5 /* flags, */ + mr r30,r6 /* rvalue, */ + mr r29,r7 /* function address, */ + mr r28,r8 /* our AP. */ + + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 + + mtctr r12 // r12 holds address of _ffi_prep_args + bctrl + lwz r2,20(r1) + + /* Now do the call. */ + /* Set up cr1 with bits 4-7 of the flags. */ + mtcrf 0x40,r31 + /* Get the address to call into CTR. */ + mtctr r29 + /* Load all those argument registers. */ + // We have set up a nice stack frame, just load it into registers. + lwz r3, 20+(1*4)(r1) + lwz r4, 20+(2*4)(r1) + lwz r5, 20+(3*4)(r1) + lwz r6, 20+(4*4)(r1) + nop + lwz r7, 20+(5*4)(r1) + lwz r8, 20+(6*4)(r1) + lwz r9, 20+(7*4)(r1) + lwz r10,20+(8*4)(r1) + + L1: + /* Load all the FP registers. */ + bf 6,L2 // 2f + 0x18 + lfd f1,-16-(13*8)(r28) + lfd f2,-16-(12*8)(r28) + lfd f3,-16-(11*8)(r28) + lfd f4,-16-(10*8)(r28) + nop + lfd f5,-16-(9*8)(r28) + lfd f6,-16-(8*8)(r28) + lfd f7,-16-(7*8)(r28) + lfd f8,-16-(6*8)(r28) + nop + lfd f9,-16-(5*8)(r28) + lfd f10,-16-(4*8)(r28) + lfd f11,-16-(3*8)(r28) + lfd f12,-16-(2*8)(r28) + nop + lfd f13,-16-(1*8)(r28) + + L2: + mr r12,r29 // Put the target address in r12 as specified. + mtctr r12 + nop + nop + /* Make the call. */ + bctrl + + /* Now, deal with the return value. */ + mtcrf 0x01,r31 + + bt 30,L(done_return_value) + bt 29,L(fp_return_value) + stw r3,0(r30) + bf 28,L(done_return_value) + stw r4,4(r30) + + /* Fall through... */ + + L(done_return_value): + /* Restore the registers we used and return. */ + lwz r9, 8(r28) + lwz r31, -4(r28) + mtlr r9 + lwz r30, -8(r28) + lwz r29,-12(r28) + lwz r28,-16(r28) + lwz r1,0(r1) + blr + + L(fp_return_value): + bf 28,L(float_return_value) + stfd f1,0(r30) + b L(done_return_value) + L(float_return_value): + stfs f1,0(r30) + b L(done_return_value) + //END(_ffi_call_DARWIN) + + /* Provide a null definition of _ffi_call_AIX. */ + .text + .align 2 + .globl _ffi_call_AIX + .text + .align 2 + _ffi_call_AIX: + blr + //END(_ffi_call_AIX) + diff -Nrc3pad gcc-3.0.4/libffi/src/powerpc/darwin_closure.S gcc-3.1/libffi/src/powerpc/darwin_closure.S *** gcc-3.0.4/libffi/src/powerpc/darwin_closure.S Thu Jan 1 00:00:00 1970 --- gcc-3.1/libffi/src/powerpc/darwin_closure.S Tue Mar 12 22:35:56 2002 *************** *** 0 **** --- 1,189 ---- + /* ----------------------------------------------------------------------- + darwin_closures.S - Copyright (c) 2002 Free Software Foundation, Inc. + based on ppc_closures.S + + PowerPC Assembly glue. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + + #define LIBFFI_ASM + #define JUMPTARGET(name) name + #define L(x) x + .text + .globl _ffi_closure_helper_DARWIN + + .text + .align 2 + .globl _ffi_closure_ASM + + .text + .align 2 + _ffi_closure_ASM: + + mflr r0 /* extract return address */ + stw r0, 8(r1) /* save the return address */ + + /* 24 Bytes (Linkage Area) */ + /* 32 Bytes (outgoing parameter area, always reserved) */ + /* 104 Bytes (13*8 from FPR) */ + /* 4 Bytes (result) + /* 164 Bytes */ + + stwu r1,-164(r1) /* skip over caller save area */ + + /* we want to build up an area for the parameters passed */ + /* in registers (both floating point and integer) */ + + /* we store gpr 3 to gpr 10 (aligned to 4) */ + /* in the parents outgoing area */ + stw r3, 188(r1) + stw r4, 192(r1) + stw r5, 196(r1) + stw r6, 200(r1) + stw r7, 204(r1) + stw r8, 208(r1) + stw r9, 212(r1) + stw r10, 216(r1) + + /* we save fpr 1 to fpr 13 (aligned to 8) */ + stfd f1, 56(r1) + stfd f2, 64(r1) + stfd f3, 72(r1) + stfd f4, 80(r1) + stfd f5, 88(r1) + stfd f6, 96(r1) + stfd f7, 104(r1) + stfd f8, 112(r1) + stfd f9, 120(r1) + stfd f10, 128(r1) + stfd f11, 136(r1) + stfd f12, 144(r1) + stfd f13, 152(r1) + + /* set up registers for the routine that actually does the work */ + /* get the context pointer from the trampoline */ + mr r3,r11 + + /* now load up the pointer to the result storage */ + addi r4,r1,160 + + /* now load up the pointer to the saved gpr registers */ + addi r5,r1,188 + + /* now load up the pointer to the saved fpr registers */ + addi r6,r1,56 + + /* now load up the pointer to the outgoing parameter */ + /* stack in the previous frame */ + addi r7,r1,220 + + /* make the call */ + bl L(_ffi_closure_helper_DARWIN) + + /* now r3 contains the return type */ + /* so use it to look up in a table */ + /* so we know how to deal with each type */ + + /* look up the proper starting point in table */ + /* by using return type as offset */ + addi r5,r1,160 /* get pointer to results area */ + addis r4,0,ha16(.L60) /* get address of jump table */ + addi r4,r4,lo16(.L60) + slwi r3,r3,2 /* now multiply return type by 4 */ + lwzx r3,r4,r3 /* get the contents of that table value */ + add r3,r3,r4 /* add contents of table to table address */ + mtctr r3 + bctr /* jump to it */ + + .L60: + .long .L44-.L60 /* FFI_TYPE_VOID */ + .long .L50-.L60 /* FFI_TYPE_INT */ + .long .L47-.L60 /* FFI_TYPE_FLOAT */ + .long .L46-.L60 /* FFI_TYPE_DOUBLE */ + .long .L46-.L60 /* FFI_TYPE_LONGDOUBLE */ + .long .L56-.L60 /* FFI_TYPE_UINT8 */ + .long .L55-.L60 /* FFI_TYPE_SINT8 */ + .long .L58-.L60 /* FFI_TYPE_UINT16 */ + .long .L57-.L60 /* FFI_TYPE_SINT16 */ + .long .L50-.L60 /* FFI_TYPE_UINT32 */ + .long .L50-.L60 /* FFI_TYPE_SINT32 */ + .long .L48-.L60 /* FFI_TYPE_UINT64 */ + .long .L48-.L60 /* FFI_TYPE_SINT64 */ + .long .L44-.L60 /* FFI_TYPE_STRUCT */ + .long .L50-.L60 /* FFI_TYPE_POINTER */ + + + /* case double */ + .L46: + lfd f1,0(r5) + b .L44 + + /* case float */ + .L47: + lfs f1,0(r5) + b .L44 + + /* case long long */ + .L48: + lwz r3,0(r5) + lwz r4,4(r5) + b .L44 + + /* case default / int32 / pointer */ + .L50: + lwz r3,0(r5) + b .L44 + + /* case signed int8 */ + .L55: + addi r5,r5,3 + lbz r3,0(r5) + extsb r3,r3 + b .L44 + + /* case unsigned int8 */ + .L56: + addi r5,r5,3 + lbz r3,0(r5) + b .L44 + + /* case signed int16 */ + .L57: + addi r5,r5,2 + lhz r3,0(r5) + extsh r3,r3 + b .L44 + + /* case unsigned int16 */ + .L58: + addi r5,r5,2 + lhz r3,0(r5) + + /* case void / done */ + .L44: + + addi r1,r1,164 /* restore stack pointer */ + lwz r0,8(r1) /* get return address */ + mtlr r0 /* reset link register */ + blr + + /* END(ffi_closure_ASM) */ + diff -Nrc3pad gcc-3.0.4/libffi/src/powerpc/ffi_darwin.c gcc-3.1/libffi/src/powerpc/ffi_darwin.c *** gcc-3.0.4/libffi/src/powerpc/ffi_darwin.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/libffi/src/powerpc/ffi_darwin.c Tue Mar 12 22:35:56 2002 *************** *** 0 **** --- 1,711 ---- + /* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 1998 Geoffrey Keating + + PowerPC Foreign Function Interface + + Darwin ABI support (c) 2001 John Hornkvist + AIX ABI support (c) 2002 Free Software Foundation, Inc. + + $Id: ffi_darwin.c,v 1.3.2.1 2002/03/12 22:35:56 tromey Exp $ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + #include + #include + + #include + + extern void ffi_closure_ASM(void); + + enum { + /* The assembly depends on these exact flags. */ + FLAG_RETURNS_NOTHING = 1 << (31-30), /* These go in cr7 */ + FLAG_RETURNS_FP = 1 << (31-29), + FLAG_RETURNS_64BITS = 1 << (31-28), + + FLAG_ARG_NEEDS_COPY = 1 << (31- 7), + FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ + FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), + FLAG_RETVAL_REFERENCE = 1 << (31- 4) + }; + + /* About the DARWIN ABI. */ + enum { + NUM_GPR_ARG_REGISTERS = 8, + NUM_FPR_ARG_REGISTERS = 13 + }; + enum { ASM_NEEDS_REGISTERS = 4 }; + + /* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments. + + The stack layout we want looks like this: + + | Return address from ffi_call_DARWIN | higher addresses + |--------------------------------------------| + | Previous backchain pointer 4 | stack pointer here + |--------------------------------------------|<+ <<< on entry to + | Saved r28-r31 4*4 | | ffi_call_DARWIN + |--------------------------------------------| | + | Parameters (at least 8*4=32) | | + |--------------------------------------------| | + | Space for GPR2 4 | | + |--------------------------------------------| | stack | + | Reserved 2*4 | | grows | + |--------------------------------------------| | down V + | Space for callee's LR 4 | | + |--------------------------------------------| | lower addresses + | Saved CR 4 | | + |--------------------------------------------| | stack pointer here + | Current backchain pointer 4 |-/ during + |--------------------------------------------| <<< ffi_call_DARWIN + + */ + + /*@-exportheader@*/ + void ffi_prep_args(extended_cif *ecif, unsigned *const stack) + /*@=exportheader@*/ + { + const unsigned bytes = ecif->cif->bytes; + const unsigned flags = ecif->cif->flags; + + /* 'stacktop' points at the previous backchain pointer. */ + unsigned *const stacktop = stack + (ecif->cif->bytes / sizeof(unsigned)); + + /* 'fpr_base' points at the space for fpr1, and grows upwards as + we use FPR registers. */ + double *fpr_base = (double*) (stacktop - ASM_NEEDS_REGISTERS) - NUM_FPR_ARG_REGISTERS; + int fparg_count = 0; + + + /* 'next_arg' grows up as we put parameters in it. */ + unsigned *next_arg = stack + 6; // 6 reserved posistions. + + int i=ecif->cif->nargs; + double double_tmp; + float float_tmp; + void **p_argv = ecif->avalue; + unsigned gprvalue; + ffi_type** ptr = ecif->cif->arg_types; + + /* Check that everything starts aligned properly. */ + FFI_ASSERT(((unsigned)(char *)stack & 0xF) == 0); + FFI_ASSERT(((unsigned)(char *)stacktop & 0xF) == 0); + FFI_ASSERT((bytes & 0xF) == 0); + + /* Deal with return values that are actually pass-by-reference. */ + // Rule: + // Return values are referenced by r3, so r4 is the first parameter. + if (flags & FLAG_RETVAL_REFERENCE) + *next_arg++ = (unsigned)(char *)ecif->rvalue; + + /* Now for the arguments. */ + for (; + i > 0; + i--, ptr++, p_argv++) + { + switch ((*ptr)->type) + { + /* If a floating-point parameter appears before all of the general- + purpose registers are filled, the corresponding GPRs that match + the size of the floating-point parameter are skipped. */ + case FFI_TYPE_FLOAT: + double_tmp = *(float *)*p_argv; + if (fparg_count >= NUM_FPR_ARG_REGISTERS) + *(double *)next_arg = double_tmp; + else + *fpr_base++ = double_tmp; + next_arg++; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + case FFI_TYPE_DOUBLE: + double_tmp = *(double *)*p_argv; + if (fparg_count >= NUM_FPR_ARG_REGISTERS) + *(double *)next_arg = double_tmp; + else + *fpr_base++ = double_tmp; + next_arg += 2; + fparg_count++; + FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + *(long long *)next_arg = *(long long *)*p_argv; + next_arg+=2; + break; + case FFI_TYPE_UINT8: + gprvalue = *(unsigned char *)*p_argv; + goto putgpr; + case FFI_TYPE_SINT8: + gprvalue = *(signed char *)*p_argv; + goto putgpr; + case FFI_TYPE_UINT16: + gprvalue = *(unsigned short *)*p_argv; + goto putgpr; + case FFI_TYPE_SINT16: + gprvalue = *(signed short *)*p_argv; + goto putgpr; + + case FFI_TYPE_STRUCT: + + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + #endif + + memcpy((char*)next_arg, (char *)*p_argv, (*ptr)->size); + next_arg+=(((((*ptr)->size) + 3) & ~0x3)/4); + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + gprvalue = *(unsigned *)*p_argv; + putgpr: + *next_arg++ = gprvalue; + break; + default: + break; + } + } + + /* Check that we didn't overrun the stack... */ + //FFI_ASSERT(copy_space >= (char *)next_arg); + //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); + //FFI_ASSERT((unsigned *)fpr_base + // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); + //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); + } + + /* Perform machine dependent cif processing */ + ffi_status ffi_prep_cif_machdep(ffi_cif *cif) + { + /* All this is for the DARWIN ABI. */ + int i; + ffi_type **ptr; + unsigned bytes; + int fparg_count = 0, intarg_count = 0; + unsigned flags = 0; + unsigned struct_copy_size = 0; + + /* All the machine-independent calculation of cif->bytes will be wrong. + Redo the calculation for DARWIN. */ + + /* Space for the frame pointer, callee's LR, CR, etc, and for + the asm's temp regs. */ + + bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); + + /* Return value handling. The rules are as follows: + - 32-bit (or less) integer values are returned in gpr3; + - Structures of size <= 4 bytes also returned in gpr3; + - 64-bit integer values and structures between 5 and 8 bytes are returned + in gpr3 and gpr4; + - Single/double FP values are returned in fpr1; + - Long double FP (if not equivalent to double) values are returned in + fpr1 and fpr2; + - Larger structures values are allocated space and a pointer is passed + as the first argument. */ + switch (cif->rtype->type) + { + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + #endif + /* Fall through. */ + case FFI_TYPE_DOUBLE: + flags |= FLAG_RETURNS_64BITS; + /* Fall through. */ + case FFI_TYPE_FLOAT: + flags |= FLAG_RETURNS_FP; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags |= FLAG_RETURNS_64BITS; + break; + + case FFI_TYPE_STRUCT: + flags |= FLAG_RETVAL_REFERENCE; + flags |= FLAG_RETURNS_NOTHING; + intarg_count++; + break; + case FFI_TYPE_VOID: + flags |= FLAG_RETURNS_NOTHING; + break; + + default: + /* Returns 32-bit integer, or similar. Nothing to do here. */ + break; + } + + /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the + first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest + goes on the stack. Structures and long doubles (if not equivalent + to double) are passed as a pointer to a copy of the structure. + Stuff on the stack needs to keep proper alignment. */ + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + switch ((*ptr)->type) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + fparg_count++; + /* If this FP arg is going on the stack, it must be + 8-byte-aligned. */ + if (fparg_count > NUM_FPR_ARG_REGISTERS + && intarg_count%2 != 0) + intarg_count++; + break; + + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + /* 'long long' arguments are passed as two words, but + either both words must fit in registers or both go + on the stack. If they go on the stack, they must + be 8-byte-aligned. */ + if (intarg_count == NUM_GPR_ARG_REGISTERS-1 + || intarg_count >= NUM_GPR_ARG_REGISTERS && intarg_count%2 != 0) + intarg_count++; + intarg_count += 2; + break; + + case FFI_TYPE_STRUCT: + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + #endif + intarg_count+=(((*ptr)->size + 3) & ~0x3)/4; + break; + + default: + /* Everything else is passed as a 4-byte word in a GPR, either + the object itself or a pointer to it. */ + intarg_count++; + break; + } + } + + if (fparg_count != 0) + flags |= FLAG_FP_ARGUMENTS; + if (struct_copy_size != 0) + flags |= FLAG_ARG_NEEDS_COPY; + + /* Space for the FPR registers, if needed. */ + if (fparg_count != 0) + bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); + + /* Stack space. */ + if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) + bytes += (intarg_count + 2 * fparg_count) * sizeof(long); + else + bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); + + /* The stack space allocated needs to be a multiple of 16 bytes. */ + bytes = (bytes + 15) & ~0xF; + + cif->flags = flags; + cif->bytes = bytes; + + return FFI_OK; + } + + /*@-declundef@*/ + /*@-exportheader@*/ + extern void ffi_call_AIX(/*@out@*/ extended_cif *, + unsigned, unsigned, + /*@out@*/ unsigned *, + void (*fn)(), + void (*fn2)()); + extern void ffi_call_DARWIN(/*@out@*/ extended_cif *, + unsigned, unsigned, + /*@out@*/ unsigned *, + void (*fn)(), + void (*fn2)()); + /*@=declundef@*/ + /*@=exportheader@*/ + + void ffi_call(/*@dependent@*/ ffi_cif *cif, + void (*fn)(), + /*@out@*/ void *rvalue, + /*@dependent@*/ void **avalue) + { + extended_cif ecif; + + ecif.cif = cif; + ecif.avalue = avalue; + + /* If the return value is a struct and we don't have a return */ + /* value address then we need to make one */ + + if ((rvalue == NULL) && + (cif->rtype->type == FFI_TYPE_STRUCT)) + { + /*@-sysunrecog@*/ + ecif.rvalue = alloca(cif->rtype->size); + /*@=sysunrecog@*/ + } + else + ecif.rvalue = rvalue; + + switch (cif->abi) + { + case FFI_AIX: + /*@-usedef@*/ + ffi_call_AIX(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + case FFI_DARWIN: + /*@-usedef@*/ + ffi_call_DARWIN(&ecif, -cif->bytes, + cif->flags, ecif.rvalue, fn, ffi_prep_args); + /*@=usedef@*/ + break; + default: + FFI_ASSERT(0); + break; + } + } + + static void flush_icache(char *); + static void flush_range(char *, int); + + /* The layout of a function descriptor. A C function pointer really */ + /* points to one of these. */ + + typedef struct aix_fd_struct { + void *code_pointer; + void *toc; + } aix_fd; + + /* here I'd like to add the stack frame layout we use in darwin_closure.S + * and aix_clsoure.S + * + /* SP previous -> +---------------------------------------+ <--- child frame + | back chain to caller 4 | + +---------------------------------------+ 4 + | saved CR 4 | + +---------------------------------------+ 8 + | saved LR 4 | + +---------------------------------------+ 12 + | reserved for compilers 4 | + +---------------------------------------+ 16 + | reserved for binders 4 | + +---------------------------------------+ 20 + | saved TOC pointer 4 | + +---------------------------------------+ 24 + | always reserved 8*4=32 (revious GPRs)| + | according to the linkage convention | + | from AIX | + +---------------------------------------+ 56 + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | + +---------------------------------------+ 160 + | result area 4 | + SP current --> +---------------------------------------+ 164 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 168 + | saved CR 4 | + +---------------------------------------+ 172 + | saved LR 4 | + +---------------------------------------+ 176 + | reserved for compilers 4 | + +---------------------------------------+ 180 + | reserved for binders 4 | + +---------------------------------------+ 184 + | saved TOC pointer 4 | + +---------------------------------------+ 188 + | always reserved 8*4=32 we store our | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 220 + | PST area, overflow part | + +---------------------------------------+ xxx + | ???? | + +---------------------------------------+ xxx + + */ + ffi_status + ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data) + { + unsigned int *tramp; + struct ffi_aix_trampoline_struct *tramp_aix; + + switch (cif->abi) + { + case FFI_DARWIN: + + FFI_ASSERT (cif->abi == FFI_DARWIN); + + tramp = (unsigned int *) &closure->tramp[0]; + tramp[0] = 0x7c0802a6; /* mflr r0 */ + tramp[1] = 0x4800000d; /* bl 10 */ + tramp[4] = 0x7d6802a6; /* mflr r11 */ + tramp[5] = 0x818b0000; /* lwz r12,0(r11) /* function address */ + tramp[6] = 0x7c0803a6; /* mtlr r0 */ + tramp[7] = 0x7d8903a6; /* mtctr r12 */ + tramp[8] = 0x816b0004; /* lwz r11,4(r11) /* static chain */ + tramp[9] = 0x4e800420; /* bctr */ + *(void **) &tramp[2] = (void *)ffi_closure_ASM; /* function */ + *(void **) &tramp[3] = (void *)closure; /* context */ + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + /* Flush the icache. Only necessary on Darwin */ + flush_range(&closure->tramp[0],FFI_TRAMPOLINE_SIZE); + + break; + + case FFI_AIX: + + tramp_aix = (struct ffi_aix_trampoline_struct *) (closure->tramp); + aix_fd *fd = (aix_fd *)(void *)ffi_closure_ASM; + + FFI_ASSERT (cif->abi == FFI_AIX); + + tramp_aix->code_pointer = fd->code_pointer; + tramp_aix->toc = fd->toc; + tramp_aix->static_chain = closure; + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + default: + + FFI_ASSERT(0); + break; + } + return FFI_OK; + } + + static void + flush_icache(char *addr) + { + #ifndef _AIX + __asm__ volatile ( + "dcbf 0,%0;" + "sync;" + "icbi 0,%0;" + "sync;" + "isync;" + : : "r"(addr) : "memory"); + #endif + } + + static void + flush_range(char * addr1, int size) + { + #define MIN_LINE_SIZE 32 + int i; + for (i = 0; i < size; i += MIN_LINE_SIZE) + flush_icache(addr1+i); + flush_icache(addr1+size-1); + } + + int ffi_closure_helper_DARWIN (ffi_closure*, void*, unsigned long*, + unsigned long*, unsigned long*); + + /* Basically the trampoline invokes ffi_closure_ASM, and on + * entry, r11 holds the address of the closure. + * After storing the registers that could possibly contain + * parameters to be passed into the stack frame and setting + * up space for a return value, ffi_closure_ASM invokes the + * following helper function to do most of the work + */ + + int + ffi_closure_helper_DARWIN (ffi_closure* closure, void * rvalue, + unsigned long * pgr, unsigned long * pfr, + unsigned long * pst) + { + /* rvalue is the pointer to space for return value in closure assembly */ + /* pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM */ + /* pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM */ + /* pst is the pointer to outgoing parameter stack in original caller */ + + void ** avalue; + ffi_type ** arg_types; + long i, avn; + long nf; /* number of floating registers already used */ + long ng; /* number of general registers already used */ + ffi_cif * cif; + double temp; + + cif = closure->cif; + avalue = alloca(cif->nargs * sizeof(void *)); + + nf = 0; + ng = 0; + + /* Copy the caller's structure return value address so that the closure + returns the data directly to the caller. */ + if (cif->rtype->type == FFI_TYPE_STRUCT) + { + rvalue = (void *)pgr; + ng++; + pgr++; + } + + i = 0; + avn = cif->nargs; + arg_types = cif->arg_types; + + /* Grab the addresses of the arguments from the stack frame. */ + while (i < avn) + { + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + /* there are 8 gpr registers used to pass values */ + if (ng < 8) { + avalue[i] = (((char *)pgr)+3); + ng++; + pgr++; + } else { + avalue[i] = (((char *)pst)+3); + pst++; + } + break; + + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + /* there are 8 gpr registers used to pass values */ + if (ng < 8) { + avalue[i] = (((char *)pgr)+2); + ng++; + pgr++; + } else { + avalue[i] = (((char *)pst)+2); + pst++; + } + break; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_STRUCT: + /* there are 8 gpr registers used to pass values */ + if (ng < 8) { + avalue[i] = pgr; + ng++; + pgr++; + } else { + avalue[i] = pst; + pst++; + } + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + /* long long ints are passed in two gpr's if available or in + * the pst, one place is a bit odd, when a long long passes + * the boundary between gpr and pst area we have to increment + * the pst by one. + */ + if (ng < 7) { + avalue[i] = pgr; + ng+=2; + pgr+=2; + } else if (ng == 7) { + avalue[i] = pgr; + ng++; + pgr++; + pst++; + } else { + avalue[i] = pst; + pst+=2; + } + break; + + case FFI_TYPE_FLOAT: + /* a float value consumes a GPR + * + * there are 13 64bit floating point registers + */ + + if ((ng > 7) && (nf < 13)) { + pst++; + } + if (nf < 13) { + temp = *(double*)pfr; + *(float*)pfr = (float)temp; + avalue[i] = pfr; + nf++; + pfr+=2; + ng++; + pgr++; + + } else { + avalue[i] = pst; + nf++; + pst++; + } + break; + + case FFI_TYPE_DOUBLE: + /* a double value consumes two GPRs + * + * there are 13 64bit floating point registers + */ + + if ((ng == 7) && (nf < 13)) { + pst++; /* if only one gpr is left the double steals it */ + } else if ((ng > 7) && (nf < 13)) { + pst+=2; /* a double consumes two GPRs in Darwin/AIX */ + } + if (nf < 13) { + avalue[i] = pfr; + nf++; + pfr+=2; + ng+=2; + pgr+=2; + + } else { + avalue[i] = pst; + nf++; + pst+=2; + } + break; + + default: + FFI_ASSERT(0); + + } + + i++; + } + + (closure->fun) (cif, rvalue, avalue, closure->user_data); + + /* Tell ffi_closure_ASM to perform return type promotions. */ + return cif->rtype->type; + + } diff -Nrc3pad gcc-3.0.4/libffi/src/prep_cif.c gcc-3.1/libffi/src/prep_cif.c *** gcc-3.0.4/libffi/src/prep_cif.c Mon Apr 17 02:15:31 2000 --- gcc-3.1/libffi/src/prep_cif.c Fri Mar 2 22:21:22 2001 *************** *** 1,8 **** /* ----------------------------------------------------------------------- prep_cif.c - Copyright (c) 1996, 1998 Cygnus Solutions - $Id: prep_cif.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 1,6 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/sparc/ffi.c gcc-3.1/libffi/src/sparc/ffi.c *** gcc-3.0.4/libffi/src/sparc/ffi.c Mon Apr 17 02:15:32 2000 --- gcc-3.1/libffi/src/sparc/ffi.c Fri Mar 2 22:21:23 2001 *************** *** 3,10 **** Sparc Foreign Function Interface - $Id: ffi.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/sparc/v8.S gcc-3.1/libffi/src/sparc/v8.S *** gcc-3.0.4/libffi/src/sparc/v8.S Mon Apr 17 02:15:32 2000 --- gcc-3.1/libffi/src/sparc/v8.S Sun Apr 28 20:12:04 2002 *************** *** 3,10 **** Sparc Foreign Function Interface - $Id: v8.S,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- *************** *** 38,44 **** --- 36,44 ---- ffi_call_V8: _ffi_call_V8: + .LLFB1: save %sp, -STACKFRAME, %sp + .LLCFI0: sub %sp, %i2, %sp ! alloca() space in stack for frame to set up add %sp, STACKFRAME, %l0 ! %l0 has start of *************** longlong: *** 89,95 **** st %o1, [%i4+4] ret restore .ffi_call_V8_end: ! .size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8 --- 89,150 ---- st %o1, [%i4+4] ret restore + .LLFE1: .ffi_call_V8_end: ! .size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8 + #ifdef SPARC64 + #define WS 8 + #define nword xword + #define uanword uaxword + #else + #define WS 4 + #define nword long + #define uanword uaword + #endif + + .section ".eh_frame",#alloc,#write + .LLframe1: + .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry + .LLSCIE1: + .uaword 0x0 ! CIE Identifier Tag + .byte 0x1 ! CIE Version + .ascii "zR\0" ! CIE Augmentation + .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor + .byte 0x80-WS ! sleb128 -WS; CIE Data Alignment Factor + .byte 0xf ! CIE RA Column + .byte 0x1 ! uleb128 0x1; Augmentation size + #ifdef HAVE_AS_SPARC_UA_PCREL + .byte 0x1b ! FDE Encoding (pcrel sdata4) + #else + .byte 0x50 ! FDE Encoding (aligned absolute) + #endif + .byte 0xc ! DW_CFA_def_cfa + .byte 0xe ! uleb128 0xe + .byte 0x0 ! uleb128 0x0 + .align WS + .LLECIE1: + .LLSFDE1: + .uaword .LLEFDE1-.LLASFDE1 ! FDE Length + .LLASFDE1: + .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset + #ifdef HAVE_AS_SPARC_UA_PCREL + .uaword %r_disp32(.LLFB1) + .uaword .LLFE1-.LLFB1 ! FDE address range + #else + .align WS + .nword .LLFB1 + .uanword .LLFE1-.LLFB1 ! FDE address range + #endif + .byte 0x0 ! uleb128 0x0; Augmentation size + .byte 0x4 ! DW_CFA_advance_loc4 + .uaword .LLCFI0-.LLFB1 + .byte 0xd ! DW_CFA_def_cfa_register + .byte 0x1e ! uleb128 0x1e + .byte 0x2d ! DW_CFA_GNU_window_save + .byte 0x9 ! DW_CFA_register + .byte 0xf ! uleb128 0xf + .byte 0x1f ! uleb128 0x1f + .align WS + .LLEFDE1: diff -Nrc3pad gcc-3.0.4/libffi/src/sparc/v9.S gcc-3.1/libffi/src/sparc/v9.S *** gcc-3.0.4/libffi/src/sparc/v9.S Mon Apr 17 02:15:32 2000 --- gcc-3.1/libffi/src/sparc/v9.S Sun Apr 28 20:12:04 2002 *************** *** 3,10 **** Sparc 64bit Foreign Function Interface - $Id: v9.S,v 1.1 2000/04/17 02:15:32 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- *************** *** 43,49 **** --- 41,49 ---- ffi_call_V9: _ffi_call_V9: + .LLFB1: save %sp, -STACKFRAME, %sp + .LLCFI0: sub %sp, %i2, %sp ! alloca() space in stack for frame to set up add %sp, STACKFRAME+STACK_BIAS, %l0 ! %l0 has start of *************** dostruct: *** 120,127 **** std %f6, [%i4+56] ret restore .ffi_call_V9_end: ! .size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9 #endif --- 120,173 ---- std %f6, [%i4+56] ret restore + .LLFE1: .ffi_call_V9_end: ! .size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9 ! ! .section ".eh_frame",#alloc,#write ! .LLframe1: ! .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry ! .LLSCIE1: ! .uaword 0x0 ! CIE Identifier Tag ! .byte 0x1 ! CIE Version ! .ascii "zR\0" ! CIE Augmentation ! .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor ! .byte 0x78 ! sleb128 -8; CIE Data Alignment Factor ! .byte 0xf ! CIE RA Column ! .byte 0x1 ! uleb128 0x1; Augmentation size ! #ifdef HAVE_AS_SPARC_UA_PCREL ! .byte 0x1b ! FDE Encoding (pcrel sdata4) ! #else ! .byte 0x50 ! FDE Encoding (aligned absolute) ! #endif ! .byte 0xc ! DW_CFA_def_cfa ! .byte 0xe ! uleb128 0xe ! .byte 0xff,0xf ! uleb128 0x7ff ! .align 8 ! .LLECIE1: ! .LLSFDE1: ! .uaword .LLEFDE1-.LLASFDE1 ! FDE Length ! .LLASFDE1: ! .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset ! #ifdef HAVE_AS_SPARC_UA_PCREL ! .uaword %r_disp32(.LLFB1) ! .uaword .LLFE1-.LLFB1 ! FDE address range ! #else ! .align 8 ! .xword .LLFB1 ! .uaxword .LLFE1-.LLFB1 ! FDE address range ! #endif ! .byte 0x0 ! uleb128 0x0; Augmentation size ! .byte 0x4 ! DW_CFA_advance_loc4 ! .uaword .LLCFI0-.LLFB1 ! .byte 0xd ! DW_CFA_def_cfa_register ! .byte 0x1e ! uleb128 0x1e ! .byte 0x2d ! DW_CFA_GNU_window_save ! .byte 0x9 ! DW_CFA_register ! .byte 0xf ! uleb128 0xf ! .byte 0x1f ! uleb128 0x1f ! .align 8 ! .LLEFDE1: #endif diff -Nrc3pad gcc-3.0.4/libffi/src/types.c gcc-3.1/libffi/src/types.c *** gcc-3.0.4/libffi/src/types.c Tue Mar 27 00:58:23 2001 --- gcc-3.1/libffi/src/types.c Tue Mar 27 02:39:16 2001 *************** *** 3,10 **** Predefined ffi_types needed by libffi. - $Id: types.c,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/x86/ffi.c gcc-3.1/libffi/src/x86/ffi.c *** gcc-3.0.4/libffi/src/x86/ffi.c Sun Aug 8 13:27:19 1999 --- gcc-3.1/libffi/src/x86/ffi.c Sun Oct 7 18:02:45 2001 *************** *** 3,10 **** x86 Foreign Function Interface - $Id: ffi.c,v 1.3 1999/08/08 13:05:12 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- *************** ffi_prep_raw_closure (ffi_raw_closure* c *** 428,434 **** FFI_ASSERT (cif->abi == FFI_SYSV); // we currently don't support certain kinds of arguments for raw ! // closures. This should be implemented by a seperate assembly language // routine, since it would require argument processing, something we // don't do now for performance. --- 426,432 ---- FFI_ASSERT (cif->abi == FFI_SYSV); // we currently don't support certain kinds of arguments for raw ! // closures. This should be implemented by a separate assembly language // routine, since it would require argument processing, something we // don't do now for performance. diff -Nrc3pad gcc-3.0.4/libffi/src/x86/sysv.S gcc-3.1/libffi/src/x86/sysv.S *** gcc-3.0.4/libffi/src/x86/sysv.S Mon Jul 16 17:14:21 2001 --- gcc-3.1/libffi/src/x86/sysv.S Mon Jul 16 17:10:53 2001 *************** *** 3,10 **** X86 Foreign Function Interface - $Id: sysv.S,v 1.2 1999/08/04 18:00:05 green Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libffi/src/x86/win32.S gcc-3.1/libffi/src/x86/win32.S *** gcc-3.0.4/libffi/src/x86/win32.S Tue Mar 27 00:58:24 2001 --- gcc-3.1/libffi/src/x86/win32.S Tue Mar 27 02:39:16 2001 *************** *** 3,10 **** X86 Foreign Function Interface - $Id: win32.S,v 1.1.2.1 2001/03/27 00:58:24 bryce Exp $ - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ``Software''), to deal in the Software without restriction, including --- 3,8 ---- diff -Nrc3pad gcc-3.0.4/libjava/ChangeLog gcc-3.1/libjava/ChangeLog *** gcc-3.0.4/libjava/ChangeLog Wed Feb 20 18:46:29 2002 --- gcc-3.1/libjava/ChangeLog Wed May 15 02:25:00 2002 *************** *** 1,6465 **** ! 2002-02-20 Release Manager ! ! * GCC 3.0.4 Released. ! ! 2001-12-20 Release Manager ! ! * GCC 3.0.3 Released. ! ! 2001-11-23 Rainer Orth ! ! * configure: Regenerate. ! Fixes PR bootstrap/4116. ! ! 2001-09-17 Andreas Jaeger ! ! * jni.cc (array_from_valist): Use promoted types for va_arg. ! ! 2001-10-23 Release Manager ! ! * GCC 3.0.2 Released. ! ! 2001-10-16 Bryce McKinlay ! ! * name-finder.cc (_Jv_name_finder::lookup): Check for NULL dli_sname ! and dli_fname. ! ! 2001-10-03 Bryce McKinlay ! ! * resolve.cc (_Jv_PrepareClass): Fix typos in vtable layout. ! ! 2001-09-30 Bryce McKinlay ! ! * java/lang/natClass.cc (_Jv_IsAssignableFrom): Handle the case of ! an uninitialized target class. Revert patch of 2001-07-18. ! ! 2001-08-17 Tom Tromey ! ! * gnu/gcj/convert/IOConverter.java: Add `646' alias. ! ! 2001-06-15 Tom Tromey ! ! * jni.cc (_Jv_JNI_NewLocalRef): Search other frames. ! ! 2001-05-03 Tom Tromey ! ! * java/lang/natRuntime.cc (init): Call add_library on the program ! itself. ! (_Jv_FindSymbolInExecutable): Return NULL if no library on the ! list has the symbol. ! ! 2001-09-21 Richard Henderson ! ! * include/jvm.h (_Jv_VTable): Handle function descriptors for ia64; ! add get_method, set_method, vtable_elt_size, new_vtable. ! (_Jv_ArrayVTable): Derive from _Jv_VTable. ! * resolve.cc (_Jv_PrepareClass): Use new _Jv_VTable methods. ! * interpret.cc (_Jv_InterpMethod::continue1): Likewise. ! * java/lang/natClassLoader.cc (_Jv_NewArrayClass): Likewise. ! ! 2001-09-17 Jeff Sturm ! ! * gnu/gcj/convert/UnicodeToBytes.java (write): Write work buffer ! starting from zero offset. ! ! 2001-08-19 Release Manager ! ! * GCC 3.0.1 Released. ! ! 2001-08-19 Release Manager ! ! * GCC 3.0.1 Released. ! ! 2001-08-01 Rainer Orth ! ! * include/posix.h (_POSIX_PII_SOCKET): Define. ! * configure.in (HAVE_SOCKLEN_T): Define. ! * java/net/natPlainSocketImpl.cc [!HAVE_SOCKLEN_T]: Move socklen_t ! definition up. ! (_JV_accept): New function, avoids Tru64 UNIX accept macro. ! (java::net::PlainSocketImpl::accept): Use it. ! Fixes PRs libgcj/3694, libgcj/3696. ! ! * configure.in (HAVE_STRUCT_IPV6_MREQ): New test. ! * acconfig.h (HAVE_STRUCT_IPV6_MREQ): Provide template. ! * configure, include/config.h.in: Regenerate. ! * java/net/natPlainDatagramSocketImpl.cc (union McastReq): Use it. ! (mcastGrp): Likewise. ! (java::net::PlainDatagramSocketImpl::setOption): Guard against ! missing IPV6_MULTICAST_IF. ! Fixes PR libgcj/3694. ! ! 2001-07-31 Christian Iseli ! ! * Makefile.in: Rebuilt. ! * Makefile.am (GCJLINK): Added --tag=GCJ. ! (LIBLINK): Likewise. ! ! 2001-07-29 Mark Wielaard ! ! * HACKING: New documentation file. ! ! 2001-07-24 Rainer Orth ! ! * gnu/gcj/runtime/natFirstThread.cc (_JNI_OnLoad): New function. ! (JNI_OnLoad): Use it. ! (gnu::gcj::runtime::FirstThread::run): Check for _JNI_OnLoad, not ! NULL. ! ! 2001-07-24 Rainer Orth ! ! * Makefile.am (AM_MAKEFLAGS): Pass RUNTESTFLAGS. ! Makefile.in: Regenerate. ! ! 2001-07-18 Rainer Orth ! ! * java/net/natPlainDatagramSocketImpl.cc (mcastGrp): Use new RFC ! 2533 socket options IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP, falling ! back to old RFC 2133 variants if missing. ! ! 2001-07-18 Tom Tromey ! ! * java/io/natFileWin32.cc (_access): Renamed. ! (_stat): Likewise. ! * java/io/natFile.cc (_access): Renamed. ! (_stat): Likewise. ! * java/io/File.java (access, stat): Add leading `_' to name. ! Updated all callers. ! ! 2001-07-18 Martin Kahlert ! ! * java/lang/natClass.cc: Move calls of _Jv_InitClass from ! java::lang::Class::isAssignableFrom and java::lang::Class::isInstance ! into _Jv_IsAssignableFrom ! ! 2001-07-18 Tom Tromey ! ! For PR java/2812: ! * libgcj.spec.in (*lib): Added LIBICONV. ! * Makefile.am (GCJLINK): Added ICONV_LDFLAGS. ! (LIBLINK): Likewise. ! * configure: Rebuilt. ! * configure.in: Call AM_ICONV. Don't check for iconv function. ! * acinclude.m4 (AM_ICONV): New macro, from Bruno Haible. Then ! modified to generate ICONV_LDFLAGS. ! ! 2001-07-05 Tom Tromey ! ! For PR java/3562: ! * java/lang/Class.h (Class(void)): Now private. Removed ! implementation. From dmorsberger@sensysdl.com. ! ! 2001-07-02 Tom Tromey ! ! Fix for PR bootstrap/3281: ! * aclocal.m4, configure: Rebuilt. ! * acinclude.m4 (LIBGCJ_CONFIGURE): Don't set libgcj_flagbasedir. ! Correctly compute libgcj_basedir. ! (mkinstalldirs): Define and subst. ! ! 2001-07-02 Rainer Orth ! ! * configure.in (test for eh model): Fixed typo. ! * configure: Rebuilt. ! ! 20010617 Release Manager ! ! * GCC 3.0 Released. ! ! 2001-06-13 Tom Tromey ! ! * configure.host: Don't use -fno-use-divide-subroutine on x86. ! ! 2001-06-12 Tom Tromey ! ! * aclocal.m4, configure: Rebuilt. ! * acinclude.m4: Find configure.host in srcdir. ! ! 2001-06-10 Alexandre Petit-Bianco ! ! * exception.cc (cstdlib): Replaces stdlib.h. ! (_Jv_Throw): Use std::abort(). ! (PERSONALITY_FUNCTION): Likewise. ! ! 2001-06-08 Tom Tromey ! ! * configure: Rebuilt. ! * configure.in: Compute new aux dir using `pwd'. ! ! 2001-06-07 Tom Tromey ! ! For PR bootstrap/3075: ! * configure, aclocal.m4, Makefile.am: Rebuilt. ! * configure.in: Pass `--with-auxdir' to subdir configure. Don't ! call AC_CONFIG_AUX_DIR or AC_CANONICAL_SYSTEM. Look for unwind.h ! relative to libgcj_basedir. ! * acinclude.m4 ((LIBGCJ_CONFIGURE): Call AC_CONFIG_AUX_DIR and ! AC_CANONICAL_SYSTEM here. ! * Makefile.am (CONFIG_STATUS_DEPENDENCIES): Use srcdir, not ! libgcj_basedir. ! ($(extra_headers)): New target. ! ! 2001-05-31 Martin Kahlert ! Bryce McKinlay ! ! * java/lang/natClass.cc (_Jv_IsAssignableFrom): Ensure that ancestors ! table index is within allowed bounds. Ensure that we dont try to access ! class itable at a negative offset. Avoid an ancestor table lookup if ! source is a primitive type class. ! (isInstance): Remove redundant isPrimitive() check. ! ! 2001-05-31 Jeff Sturm ! ! * natFile.cc (get_entry): Removed functions. ! (performList): Call readdir or readdir_r if HAVE_READDIR_R defined. ! Allocate enough storage for d_name if using readdir_r. ! ! 2001-05-30 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am: Removed erroneous patch. ! ! 2001-05-29 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (AM_CXXFLAGS): Remove -fvtable-thunks. ! ! 2001-05-29 Andrew Haley ! ! * include/i386-signal.h (MAKE_THROW_FRAME): Don't fix up frame ! pointer: the dwarf unwinder in libgcc will do everything that's ! needed. ! (HANDLE_DIVIDE_OVERFLOW): Tidy. Don't mess with stack frames any ! more than we absolutely need to. ! * configure.host (EXCEPTIONSPEC): Remove libgcj_sjlj on Alpha. ! * configure.in (SIGNAL_HANDLER): Use include/dwarf2-signal.h on ! Alpha. ! (SIGNAL_HANDLER): Test "$enable_sjlj_exceptions", not ! "$libgcj_sjlj". ! * configure: Rebuilt. ! * include/dwarf2-signal.h (MAKE_THROW_FRAME): Adjust PC ! for Alpha. ! (SIGNAL_HANDLER): Use siginfo style handler. ! (INIT_SEGV): Likewise. ! (INIT_FPE): Likewise. ! * include/ppc-signal.h: Delete whole file. ! ! 2001-05-23 Jeff Sturm ! ! * java/net/natPlainDatagramSocketImpl.cc: Undefine bind if defined. ! (_Jv_bind): New static function. ! (bind): Use _Jv_bind. ! * java/net/natPlainSocketImpl.cc: Undefine bind, connect if defined. ! (_Jv_bind, _Jv_connect): New static functions. ! (bind): Use _Jv_bind. ! (connect): Use _Jv_connect. ! ! 2001-05-23 Joseph S. Myers ! ! * gij.cc (version): Update copyright year. ! ! 2001-05-22 Anthony Green ! ! * configure: Rebuilt. ! * configure.in: Tweak canadian cross test, and don't redefine GCJ ! for cross builds. ! ! 2001-05-21 Andrew Haley ! ! * configure.host (EXCEPTIONSPEC): Revert broken patch that removed ! sjlj on Alpha. ! ! 2001-05-21 Andrew Haley ! ! * include/dwarf2-signal.h: Correct copyright date. ! ! 2001-05-18 Andrew Haley ! ! * include/dwarf2-signal.h: New file. ! * configure.in (SYSDEP_SOURCES): Add dwarf2-signal.h for PPC. ! * configure.host (EXCEPTIONSPEC): Don't use sjlj on PPC. ! * configure: Rebuilt. ! ! 2001-05-19 Bryce McKinlay ! ! * include/jvm.h: Move "#pragma GCC java_exceptions" to ... ! * gcj/javaprims.h: ... here. ! * gnu/gcj/io/shs.cc: Add "#pragma GCC java_exceptions". ! ! 2001-05-19 Zack Weinberg ! ! * Makefile.am (libgcj_la_OBJECTS): Remove libsupc++convenience.la. ! * Makefile.in: Regenerate (by hand). ! * include/jvm.h: Add #pragma GCC java_exceptions at top of file. ! * doc/cni.sgml: Document #pragma GCC java_exceptions. ! ! * prims.cc (_Jv_ThisExecutable): Use _Jv_Malloc. ! * posix-threads.cc (_Jv_ThreadInitData): Use _Jv_Malloc. ! (_Jv_ThreadDestroyData): Use _Jv_Free. ! * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): ! Use _Jv_Malloc. ! ! 2001-05-18 Alexandre Petit-Bianco ! ! * include/posix-threads.h (_Jv_CondInit): `0' used in place of `NULL.' ! (_Jv_MutexInit): Likewise. ! ! 2001-05-17 Martin Kahlert ! ! * java/lang/natClass.cc (_Jv_FindIIndex): Fix an off by one error ! with length of ioffset table. ! (_Jv_IsAssignableFrom): Likewise. ! ! 2001-05-17 Per Bothner ! ! * Makefile.am (ZIP): The "fastjar" binary is now plain "jar". ! ! 2001-05-14 Andrew Haley ! ! * libgcj.spec.in (jc1): Add EXCEPTIONSPEC. ! * configure.host (EXCEPTIONSPEC): New. ! * configure.in (EXCEPTIONSPEC): New. ! * configure: Rebuilt. ! ! 2001-05-12 Richard Henderson ! ! EH merge from mainline: ! ! 2001-05-11 Richard Henderson ! * configure.in (ia64-*): Don't set SYSDEP_SOURCES. ! * java/lang/natThrowable.cc: Don't use __ia64_backtrace. ! ! 2001-05-11 Richard Henderson ! * exception.cc: Include unwind-pe.h. Remove all pointer ! encoding logic. ! ! 2001-04-02 Richard Henderson ! * configure.in (GCC_UNWIND_INCLUDE): Assume we're built within ! the same tree as gcc. ! * configure: Rebuilt. ! ! * exception.cc (_Jv_Throw): Clarify commentary. ! ! 2001-03-28 Richard Henderson ! * Makefile.am (GCC_UNWIND_INCLUDE): Rename from EH_COMMON_INCLUDE. ! (AM_CXXFLAGS): -fnon-call-exceptions not -fasynchronous-exceptions. ! Remove EXCEPTIONSPEC. ! * configure.host (libgcj_sjlj): Remove. ! * configure.in (EXCEPTIONSPEC): Remove. ! (enable-sjlj-exceptions): Detect if not specified. ! (GCC_UNWIND_INCLUDE): Rename from EH_COMMON_INCLUDE; change ! what header we're looking for. ! * libgcj.spec.in (jc1): Remove EXCEPTIONSPEC. ! * Makefile.in, configure: Regenerate. ! * exception.cc: Don't declare libgcc2 stuff. ! (java_eh_info, _Jv_type_matcher, _Jv_exception_info): Remove. ! (_Jv_eh_alloc, _Jv_eh_free, _Jv_setup_eh_info): Remove. ! (win32_get_restart_frame): Remove. ! (struct java_exception_header): New. ! (__gcj_exception_class): New. ! (get_exception_header_from_ue): New. ! (_Jv_Throw): Rewrite for IA-64 ABI unwind routines. ! (size_of_encoded_value, read_encoded_value): New. ! (read_uleb128, read_sleb128, parse_lsda_header): New. ! (get_ttype_entry, __gcj_personality_sj0): New. ! * gcj/javaprims.h (_Jv_Sjlj_Throw): Remove. ! ! 2001-05-06 Bryce McKinlay ! ! * gcj/javaprims.h: Rebuild CNI namespace. ! ! 2001-05-06 Bryce McKinlay ! ! * java/lang/Class.h (_Jv_Self): New union type. ! (Class): Manipulate vtable pointer via _Jv_Self union. Thanks to ! Jeff Sturm and Fergus Henderson. ! ! 2001-05-06 Bryce McKinlay ! ! Fix PR libgcj/2237: ! * java/io/ObjectStreamClass.java (setClass): Calculate ! serialVersionUID for local class and compare it against the UID ! from the Object Stream. Throw InvalidClassException upon mismatch. ! (setUID): Renamed to... ! (getClassUID): this. Return the calculated class UID rather than ! setting uid field directly. ! (getDefinedSUID): Removed. ! * java/io/ObjectInputStream.java (resolveClass): Use the ! three-argument Class.forName(). ! * java/io/InvalidClassException.java (toString): Don't include ! classname in result if it is null. ! ! 2001-05-06 Bryce McKinlay ! ! * java/lang/Class.h (forName): Add initialize parameter. Fixes ! declaration to comply with JDK spec. ! * java/lang/natClass.cc (forName): Correct declaration of the three-arg ! variant. Honour "initialize" flag. ! * java/lang/Class.java: Fix forName() declaration. ! * java/lang/ClassLoader.java (getParent): Now final. ! (findSystemClass): Now final. ! (getSystemResourceAsStream): Remove redundant "final" modifier. ! (getSystemResource): Remove redundant "final" modifier. ! (getResources): Now final. ! (getSystemClassLoader): Now non-native. ! * java/util/ResourceBundle.java (tryGetSomeBundle): Use the correct ! arguments for Class.forName(). ! * gnu/gcj/runtime/VMClassLoader.java (getVMClassLoader): Removed. ! (instance): Static initialize singleton. ! (findClass): Override this, not findSystemClass. ! * java/lang/natClassLoader.cc (findClass): Renamed from ! findSystemClass. Call the interpreter via URLClassLoader.findClass if ! loading class via dlopen fails. ! ! 2001-05-03 Martin Kahlert ! ! * jni.cc (_Jv_JNI_GetPrimitiveArrayRegion): Fixed bounds ! checking. ! (_Jv_JNI_SetPrimitiveArrayRegion): Likewise. ! ! 2001-05-02 Bryce McKinlay ! ! * doc/*.texi: Remove generated documentation. ! ! 2001-04-30 Matt Kraai ! ! * java/io/natFile.cc (performSetReadOnly): Fix #ifdef test. ! (performDelete): Fix #endif placement. ! ! 2001-04-27 Tom Tromey ! ! * jni.cc (_Jv_JNI_GetPrimitiveArrayRegion): Fixed bounds ! checking. ! (_Jv_JNI_SetPrimitiveArrayRegion): Likewise. ! ! 2001-04-27 Martin Kahlert ! ! * include/jni.h (struct JNINativeInterface): Fixed types in ! Get/Set*ArrayRegion declarations. ! (class _Jv_JNIEnv): Likewise. ! ! 2001-04-26 Alexandre Oliva ! ! * configure.in: Obtain THREADS with `gcc -v'. ! * configure: Rebuilt. ! ! 2001-04-25 Kaveh R. Ghazi ! ! * java/net/natInetAddress.cc (java::net::InetAddress::aton): ! Wrap use of inet_pton in HAVE_INET6. ! ! 2001-04-24 Alexandre Oliva ! ! * configure.in (CPPFLAGS): Added builddir and srcdir to CPPFLAGS ! for libtool tests. Pre-create gnu/classpath/Configuration.java. ! * configure: Rebuilt. ! ! 2001-04-20 Warren Levy ! ! * java/lang/natSystem.cc (getSystemTimeZone): Adjust for DST. ! * java/text/SimpleDateFormat.java ! (indexInArray): Removed private method. ! (processYear): Removed private method. ! (parseLenient): Removed private method. ! (parseLeadingZeros): Removed private method. ! (parseStrict): Removed private method. ! (expect): Added new private method. ! (parse): Reverted to pre-Classpath merge version with minor fixes. ! * java/util/natGregorianCalendar.cc (computeTime): Handle strict ! calendars. ! ! 2001-04-18 Warren Levy ! ! * java/util/TimeZone.java: Sync up with Classpath. Includes new ! and corrected SimpleTimeZone's for the timezones hash table. ! ! 2001-04-12 Bryce McKinlay ! ! * java/io/File.java (normalizePath): New private method. ! (File (String)): Use normalizePath(). ! (File (String, String)): Likewise. ! ! * Makefile.am (libffi_files): Removed. ! (libgcj.la): Link libffi as a convenience library instead of ! refering to its object files directly. ! * Makefile.in: Rebuilt. ! ! 2001-04-08 Per Bothner ! ! * java/lang/natString.cc (_Jv_NewStringUtf8Const): Register finalizer. ! Recalculate hash, since Utf8Const's hash is only 16 bits. ! ! * java/lang/natString.cc (_Jv_StringFindSlot, rehash): Use high-order ! bits of hash to calculate step for chaining. ! ! * java/lang/natString.cc (intern, _Jv_NewStringUtf8Const): Rehash ! when 2/3 full, rather than 3/4 full. ! ! 2001-04-06 Tom Tromey ! ! * jni.cc (wrap_value, wrap_value): Removed. ! (wrap_value): New specialization. ! (_Jv_JNI_PopLocalFrame): Update env->locals. ! ! 2001-04-05 Tom Tromey ! ! * libtool-version: Updated current. ! ! 2001-04-04 Andreas Jaeger ! ! * gcj/Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. ! * gcj/Makefile.in: Rebuilt. ! * Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. ! * Makefile.in: Rebuilt. ! * testsuite/Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. ! * testsuite/Makefile.in: Rebuild. ! * include/Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. ! * include/Makefile.in: Rebuild. ! ! 2001-04-02 Zack Weinberg ! ! * testsuite/lib/libjava.exp: Correct typo: 'output from source ! compiled test', not 'execution from source compiled test'. ! Use UNTESTED, not XFAIL, for tests which are not run because ! they depend on a previous test which failed. ! ! 2001-04-02 Marcus G. Daniels ! ! * jni.cc (wrap_value): New specialization. ! ! 2001-04-02 Tom Tromey ! ! * java/io/PrintStream.java (out): Removed field. Fixes PR ! java/2449. ! (write): Call flush, not out.flush, per spec. ! (close): Flush output stream, per spec. Handle ! InterruptedIOException. ! (checkError): Likewise. ! (flush, print, write): Handle InterruptedIOException per spec. ! (PrintStream): Don't create BufferedOutputStream. ! (work_bytes): New field. ! (writeChars): Use work_bytes. Don't assume `out' is a ! BufferedOutputStream. ! ! 2001-04-02 Torsten Rueger ! ! * java/text/MessageFormat.java (setLocale): Added missing `else'. ! For PR libgcj/2429. ! ! 2001-03-30 Tom Tromey ! ! * jni.cc (add_char): Correctly encode non-ascii characters. ! (add_char): Define even when INTERPRETER not defined. ! (mangled_name): Likewise. ! (_Jv_GetJNIEnvNewFrame): Likewise. ! (_Jv_LookupJNIMethod): Likewise. ! ! 2001-04-02 Bryce McKinlay ! ! * java/lang/natSystem.cc (init_properties): Revert yesterday's changes ! to "file.separator", "path.separator", and "java.io.tmpdir" property ! initialization. ! * java/io/File.java: Likewise. ! * java/io/natFile.cc (init_native): Likewise. ! * java/io/natFileWin32.cc (init_native): Likewise. ! 2001-04-01 Per Bothner ! * java/lang/natString.cc (intern): If string's data does not point to ! this String, make a fresh String that does. ! * java/lang/natString.cc (unintern): Replace by static function. ! * java/lang/String.java (unintern): Remove method. ! 2001-04-01 Per Bothner ! * DeflaterOutputStream.java (deflate): Loop while def.needsInput. ! (finish): def.deflate needs to be called in a loop. ! (inbuf, inbufLength): New private fields. ! (write(int)): Use inbuf. ! (write(byte[],int,int): Check if pending output in inbuf. ! * ZipOutputStream.java: Don't use Deflater if stored. ! Use a Checksum object directly, not via a CheckedOutputStream. ! (uncompressed_size): New field, ! (closeEntry): Only write data_directory if needed. ! (write): If STORED, write directly. ! Always update crc, and uncompressed_size. ! (write_entry): Fix lots of protocol erors. ! 2001-04-01 Bryce McKinlay ! 1.3-Compliant Implementation of java.io.File. ! * java/lang/natSystem.cc (init_properties): Get "file.separator", ! "path.separator", and "java.io.tmpdir" from the File class, instead ! of setting them explicitly. ! * java/io/File.java: Do not canonicalize paths for security manager ! checks. Call init_native() from static initializer. Do not pass path ! argument to native methods. New native method declarations. Some ! security manager checks moved to checkWrite(). ! (equals): Check file system case sensitivity and act appropriatly. ! (hashCode): Likewise. ! (isHidden): New method implemented. ! (performList): Changed prototype. Now takes a class argument specifying ! the class of the returned array: Strings or File objects. Also added ! FileFilter argument. ! (listFiles): New variants with "File" return type implemented. ! (createTempFile): Use createNewFile(). Use maxPathLen. ! (setReadOnly): New method implemented. ! (listRoots): Likewise. ! (compareTo): Likewise. ! (setLastModified): Likewise. ! (checkWrite): New method. ! (setPath): Removed. ! * java/io/natFile.cc: Various functions no longer take canonical path ! argument. ! (stat): Handle ISHIDDEN query. ! (isAbsolute): Remove WIN32 cruft. ! (performList): New arguments. Handle returning either File[] or String[] ! arrays. Check with FileFilter or FilenameFilter arguments as ! appropriate. Use an ArrayList, not a Vector, for the temporary list. ! (performSetReadOnly): New method implemented. ! (performListRoots): Likewise. ! (performSetLastModified): Likewise. ! (performCreate): Likewise. ! (init_native): New initialization function. ! * java/io/natFileWin32.cc: Various functions no longer take canonical ! path argument. ! (stat): Add FIXME about ISHIDDEN query. ! (performList): New arguments. Handle returning either File[] or String[] ! arrays. Check with FileFilter or FilenameFilter arguments as ! appropriate. Use an ArrayList, not a Vector, for the temporary list. ! (performSetReadOnly): New. Stubbed. ! (performListRoots): Likewise. ! (performSetLastModified): Likewise. ! (performCreate): Likewise. ! (init_native) New initialization function. ! * configure.in: Check for utime() and chmod(). * configure: Rebuilt. - * include/config.h.in: Rebuilt. - - 2001-03-27 Joerg Brunsmann - - * javax/naming/InitialContext.java (init): Fix typo. - (composeName): Remove unnecessary semicolon. - (addToEnvironment): Remove unnecessary semicolon. - (addToEnvironment): Use put() instead of add(). - - * javax/naming/InitialContext.java (InitialContext): - Make public. - (destroySubcontext): Method doesn't return a result. - * javax/naming/Context.java: Import java.util.Hashtable. - * javax/naming/Name.java: Import java.util.Enumeration. - - 2001-03-27 Bryce McKinlay - - * Makefile.am (libffi_files): Use $(shell) wrapper instead of back - quotes. - (libgcj.la): Echo the list of object files one at a time, using a - for loop. - (libgcjx.la): Likewise. - * Makefile.in: Rebuilt. - - 2001-03-27 Bryce McKinlay - - * Makefile.am (libffi_files): Use 'find' to pick up libffi libtool - objects in subdirectories. - * Makefile.in: Rebuilt. - - 2001-03-24 Bryce McKinlay - - * java/util/HashMap.java (HashMap): If 0 is given for initialCapacity - paramater, bump it to 1. - * java/util/Hashtable.java (Hashtable): Likewise. - - 2001-03-23 Kevin B Hendricks - - * configure.host: Enable interpreter for PPC. - - 2001-03-23 Per Bothner - - * java/lang/natDouble.cc (parseDouble): Cannot use errno to - check for errors, since we don't want to throw exception on - overflow/underflow. Instead, trim whitespace, and then check that - _strtod_r uses up all the rest of the string. - - * java/lang/natClass.cc (_Jv_IsAssignableFrom): Checking the - ancestors array is invalid for interfaces, so do that *after* - check that the target type is not an interface. - - 2000-03-23 Jeff Sturm - - * prims.cc (_Jv_FindClassFromSignature): Check return of - recursive call. Do not abort on invalid signature; return NULL - instead. - - 2001-03-22 Tom Tromey - - * jni.cc (_Jv_JNI_GetAnyFieldID): Handle unresolved fields. - * java/lang/reflect/natField.cc (getType): Use _Jv_ResolveField - unconditionally. - * include/jvm.h (_Jv_ResolveField): Declare. - * include/java-interp.h (_Jv_ResolveField): Don't declare. - * resolve.cc (_Jv_ResolveField): No longer conditional on - INTERPRETER. - - 2001-03-23 Bryce McKinlay - - Fix for PR libgcj/1736. Thanks to Robert Boehne and Alexandre Oliva - for libtool hacking. - * Makefile.am (libgcj.la): New explicit rule. Echo the list of objects - to a temporary file, then invoke libtool with the -objectlist - paramater. - (libgcjx.la): Likewise. - * Makefile.in: Rebuilt. - - 2001-03-22 Joerg Brunsmann - - * javax/naming/Context.java (SECURITY_CREDENTIALS): Fix typo. - - 2001-03-22 Marcus G. Daniels - - * jni.cc (add_char): Handle `.' like `/'. - - 2001-03-22 Bryce McKinlay ! * java/lang/reflect/Method.java (getExceptionTypes): Call getType() to ! initialize if exception_types is null. ! * java/lang/reflect/Constructor.java: Likewise. ! * java/lang/reflect/natConstructor.cc (getType): Initialize ! exception_types to an empty Object array. ! ! 2001-03-21 Tom Tromey ! * configure: Rebuilt. ! * configure.in (GCJFLAGS): Subst. * Makefile.in: Rebuilt. - * Makefile.am (jv_convert_LDFLAGS): Added -shared-libgcc. - (gij_LDFLAGS): Likewise. - (JC1FLAGS): Added GCJFLAGS and removed -g. ! * java/io/natFileDescriptorPosix.cc (open): Add O_CREAT in ! read/write case. Fixes PR libgcj/2338. ! ! 2001-03-19 Per Bothner ! ! * java/net/URLStreamHandler.java (parseURL): Fix bug which would ! "canonicalize" "../../xxx" to "/xxx". ! ! 2001-03-17 Tom Tromey ! ! * java/lang/natString.cc (rehash): Don't bother with memset; ! _Jv_AllocBytes returns zero'd memory. Use _Jv_AllocBytesChecked. ! Use UNMASK_PTR. ! (UNMASK_PTR): New macro. ! (intern): Unmask pointer before returning it. Register finalizer ! for the string. ! (unintern): Handle case where ! (MASK_PTR): New macro. ! (PTR_MAKSED): Likewise. ! (_Jv_NewStringUtf8Const): Use UNMASK_PTR. ! ! 2001-03-01 Andrew Haley ! ! * java/lang/natThrowable.cc (printRawStackTrace): Copy the ! stackTrace buffer to a correctly aligned pointer array. ! ! 2001-03-12 Bryce McKinlay ! * java/lang/Runtime.java (_exit): Declare new package-private native. ! * java/lang/natRuntime.cc (_exit): Implemented. Same as exit() but ! without a security manager check. ! (exit): Call _exit. ! * java/lang/System.java (setSecurityManager): If a security manager ! is already in place, call checkPermission. ! * java/lang/ThreadGroup.java (uncaughtException): If printStackTrace() ! throws an exception, try to deal with it gracefully. ! * prims.cc (JvRunMain): Call Runtime._exit to shutdown ! the runtime. ! * java/lang/ExceptionInInitializerError.java (printStackTrace): ! Only try to print the subordinate stack trace if "exception" is set. ! Print our class name first. ! 2001-03-08 Tom Tromey ! * java/io/ObjectStreamClass.java (setUID): Don't write interface ! info for array classes. ! Fixes PR libgcj/1971. ! 2001-03-06 Bryce McKinlay ! * java/util/TreeSet.java (writeObject): Use a for-loop instead of ! Iterator.hasNext(). ! 2001-03-05 Jochen Hoenicke ! * java/util/TreeMap.java (writeObject): Use defaultWriteObject() ! instead of the new JDK1.2 API. This is simpler and makes ! back-porting the classes to JDK1.1 trivial. ! (readObject): likewise. ! 2001-03-01 Per Bothner ! Changes merged from Kawa's gnu.math. ! * gnu/gcj/math/MPN.java (rshift0): New method handles zero shift count. ! (rshift(int[],int[],int,int): Removed - not needed. ! (gcd): Use rshift0 rather than rshift. ! * java/math/BigInteger.java (setShiftRight): Likewise. ! (divide): Simplify by using rshift0. ! (divide): Zero-extend results if high-order bit set. ! 2001-02-23 Per Bothner ! Change to sometimes include class name in ClassFormatError message. ! * defineclass.cc (_Jv_VerifyFieldSignature, _Jv_VerifyMethodSignature, ! _Jv_VerifyIdentifier, _Jv_VerifyClassName (two overlods)): Return ! boolean instead of throwing ClassFormatError on failure. ! (throw_class_format_error): Change static function to method. ! (_Jv_ClassReader): New inline methods verify_identifier, ! two overloads of verify_classname, verify_field_signature, and ! verify_method_signature ! * include/java-interp.h: Update declarations to return bool. ! * java/lang/natClassLoader.cc (defineClass0): Explicitly throw ! ClassFormatError since _Jv_VerifyClassName now returns bool. ! 2001-02-23 Per Bothner ! * java/lang/Throwable.java (CPlusPlusDemangler): Pass -s java to ! c++filt to select java-style output. ! 2001-02-27 Bryce McKinlay ! * libgcj.spec.in: Insert %(libgcc) before %(liborig) to fix static ! linking. ! 2001-02-22 Bryce McKinlay ! Fix for PR java/2040: ! * java/util/HashMap.java (HashMap): Don't throw exception for ! loadFactor > 1. Add exception messages. ! * java/util/Hashtable.java (Hashtable): Likewise. ! 2001-02-21 Bryce McKinlay - Disable libgcjx by default. - * configure.in: Add support for --enable-java-awt configure option. - Use --enable-java-awt=xlib to build the xlib peers (libgcjx). - * Makefile.am: Make libgcjx conditional on XLIB_AWT, instead of NO_X. - * Makefile.in: Rebuilt. * configure: Rebuilt. ! 2001-02-20 Tom Tromey ! ! * java/io/PipedWriter.java (flush): Throw exception if stream ! closed. ! * java/io/OutputStreamWriter.java (write): Throw exception if ! stream closed. ! (writeChars): Don't throw exception if stream closed. ! * java/io/CharArrayWriter.java (closed): New field. ! (close): Set it. ! (flush): Throw exception if stream closed. ! (reset): Synchronize on correct lock. Allow stream to be ! reopened. ! (toCharArray, toString, writeTo): Synchronize. ! (write): Throwe exception if stream closed. ! * java/io/BufferedWriter.java (close): Clear `buffer'. ! (flush): Throw IOException if stream is closed. ! (write): Likewise. ! ! 2001-02-16 Tom Tromey ! ! * java/lang/ThreadGroup.java (activeCount): Only include threads ! which are alive. ! (enumerate): Likewise. ! ! 2001-02-19 Bryce McKinlay ! ! * java/lang/Integer.java (getInteger): Return default argument if ! property is not set. Don't call decode with null argument. ! * java/lang/Long.java (getLong): Likewise. ! ! * java/io/CharArrayReader.java (CharArrayReader): Throw ! IllegalArgumentException if constructor arguments are illegal. ! (ready): Return false if no more characters can be read. ! * java/io/ByteArrayInputStream.java (ByteArrayInputStream): Likewise. ! ! 2001-02-16 Bryce McKinlay ! ! * java/util/TreeSet.java (clone): Made subclass safe, use ! super.clone(), not new. ! * java/util/TreeMap.java (clone): Likewise. ! ! * java/util/TreeMap.java (nil): Made non-final. ! (clone): Create new nil node for copy. ! ! * java/util/HashSet.java (clone): Made subclass safe, use ! super.clone(), not new. ! ! 2001-02-15 Anthony Green ! ! * defineclass.cc: Don't include alloca.h. ! (prepare_pool_entry): Convert alloca to __builtin_alloca. ! * interpret.cc (run_normal): Ditto. ! (continue1): Ditto. ! * java/lang/natDouble.cc (parseDouble): Ditto. ! ! 2001-02-15 Bryce McKinlay ! * java/util/TreeSet.java (clone): Call TreeMap.clone(), not ! Object.clone(). ! * java/util/Collections.java (ReverseComparator): New static class. ! (reverseOrder): Return static instance of ReverseComparator. ! * java/util/HashSet.java (clone): Remove try/catch. ! * java/util/AbstractSequentialList.java: Synchronize with Classpath. ! * java/util/Collection.java: Likewise. ! * java/util/Comparator.java: Likewise. ! * java/util/Dictionary.java: Likewise. ! * java/util/Iterator.java: Likewise. ! * java/util/ListIterator.java: Likewise. ! * java/util/Map.java: Likewise. ! * java/util/Set.java: Likewise. ! 2001-02-14 Bryce McKinlay ! * java/util/TreeMap.java: New file. ! * java/util/TreeSet.java: New file. ! * Makefile.am: Add TreeMap and TreeSet. Enable WeakHashMap. * Makefile.in: Rebuilt. ! * java/util/HashSet.java (clone): Use constructor instead of calling ! clone on itself. ! * java/util/SortedSet.java: Sync with classpath. ! * java/util/HashMap.java (hash): Use if statement instead of ternary, ! for clarity. ! ! * java/lang/natClass.cc (getSignature): Don't try to dereference ! param_types if it is null. Instead, take this to mean "no parameters". ! * java/lang/TreeMap.java (TreeIterator.next): Throw ! NoSuchElementException in preference to ConcurrentModificationException. ! (TreeIterator.remove): Throw IllegalStateException in preference to ! ConcurrentModificationException. ! (SubMap.firstKey): Do a better check for empty SubMap, and if it is, ! throw a NoSuchElementException. ! (SubMap.lastKey): Likewise. ! ! 2001-02-13 Tom Tromey ! ! * java/io/PipedReader.java (ready): Throw IOException if pipe ! closed. ! * java/io/FilterReader.java (close): Don't clear `in'. ! * java/io/CharArrayReader.java (mark): Throw IOException if stream ! closed. ! (read, ready, reset, skip): Added exception message. ! * java/io/BufferedReader.java (mark, reset, ready, read, skip): ! Perform checkStatus check inside synchronized block. ! ! 2001-02-13 Tom Tromey ! ! Fix for PR libgcj/1351: ! * posix.cc (_Jv_select): Throw InterruptedIOException if thread is ! interrupted. ! Include Thread.h and InterruptedIOException.h. ! ! 2001-02-13 Bryce McKinlay ! ! * java/io/BlockDataException.java: Removed. ! * java/io/ObjectInputStream.java (readObject): Throw ! StreamCorruptedException, not BlockDataException. ! * Makefile.am: Remove BlockDataException. ! * Makefile.in: Rebuild. ! 2001-02-12 Jeff Sturm Tom Tromey ! * interpret.cc (continue1): [insn_invokevirtual] Do an explicit ! null pointer check. ! ! 2001-02-15 Zack Weinberg ! ! * include/i386-signal.h: Adjust comment to match previous change. ! ! 2001-02-14 Andrew Haley ! ! * include/i386-signal.h (INIT_SEGV): Use a direct system call to ! set the handler. ! ! 2001-02-15 Bryce McKinlay ! ! * gnu/awt/j2d/DirectRasterGraphics.java (clone): Hoist to public. ! * gnu/awt/j2d/IntegerGraphicsState.java (setClip): Call ! Rectangle.clone(), not Object.clone(). ! ! 2001-02-13 Tom Tromey ! ! * gnu/awt/j2d/AbstractGraphicsState.java (clone): Made public. ! ! 2001-02-09 Tom Tromey ! ! * java/util/Timer.java: New version from Classpath. ! ! 2001-02-09 Bryce McKinlay ! ! * java/lang/Double.java (doubleToRawLongBits): Now native. ! * java/lang/Float.java (floatToRawIntBits): Likewise. ! * java/lang/natDouble.cc (doubleToRawLongBits): New method. ! * java/lang/natFloat.cc (floatToRawIntBits): Likewise. ! ! 2001-02-09 Alexandre Petit-Bianco ! ! * java/io/File.java (java.net): Imported. ! (getAbsoluteFile): Added. ! (getCanonicalPath): Likewise. ! (toURL): Likewise. ! ! 2001-02-08 Bryce McKinlay ! ! * java/lang/Byte.java: Remove redundant instanceof and null checks. ! * java/lang/Integer.java: Likewise. ! * java/lang/Long.java: Likewise. ! * java/lang/Short.java: Likewise. ! * java/lang/Double.java: Likewise. ! (doubleToRawLongBits): New method. ! * java/lang/Float.java: As above. ! (floatToRawIntBits): New method. ! ! * java/io/OutputStreamWriter.java: (flush, writeChars): Throw ! IOException if stream closed. ! ! 2001-02-08 Tom Tromey ! ! * java/lang/Float.java (parseFloat): New method. ! ! 2001-02-08 Tom Tromey ! ! From paul@dawa.demon.co.uk. Fix for PR libgcj/1913: ! * java/io/InputStreamReader.java (ready, read): Throw IOException ! if stream has been closed. ! ! 2001-02-08 Joseph S. Myers ! * README, gij.cc, java/lang/natClass.cc, java/lang/natSystem.cc: ! Change sources.redhat.com and sourceware.cygnus.com references to ! gcc.gnu.org. ! 2001-02-07 Tom Tromey ! Fix for PR libgcj/1906: ! * java/text/MessageFormat.java (setLocale): Use named class ! literals. ! (forName): Removed. ! (format(Object,StringBuffer,FieldPosition)): Special case if ! argument is an Object[]. ! 2001-02-07 Bryce McKinlay ! * java/util/Arrays.java: Removed "cmp" methods. ! (qsort): Don't use "cmp". ! (med3): Likewise. ! 2001-02-07 Mark Benvenuto ! * java/util/Arrays.java (qsort): Handle N value of 7 with insertion ! sort. Fix for PR java/1895. ! 2001-02-03 Jeff Sturm ! * configure.host: Use sjlj-exceptions for Alpha. ! 2001-02-03 Bryce McKinlay ! * libgcj.spec.in: Don't force static libgcc into the executable. ! * configure.in (FORCELIBGCCSPEC): Removed. * configure: Rebuilt. ! 2001-01-31 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (LTCXXCOMPILE): New macro. ! ! 2001-01-26 Andrew Haley ! ! (INIT_FPE): Use a direct system call to set the handler. ! ! 2001-01-27 Richard Henderson ! ! * configure.host (alpha*-*) [libgcj_flags]: Add -mieee. ! ! 2001-01-27 Tom Tromey ! ! * jni.cc (_Jv_JNIFunctions): Added comment for each entry in ! native interface structure. ! ! 2001-01-27 Bryce McKinlay ! ! * java/io/ObjectInputStream.java (read): AND byte with 0xff to make ! result unsigned. ! (read (byte[], int, int)): Only call readNextBlock() if the block ! buffer would actually be overrun. Increment blockDataPosition. ! (callReadMethod): Propagate exceptions from invocation target. ! * java/io/ObjectOutputStream.java (callWriteMethod): Propagate ! exceptions from invocation target. ! ! 2001-01-26 Tom Tromey ! ! * jni.cc (_Jv_JNI_GetAnyMethodID): Rewrite signature from external ! to internal representation. ! (_Jv_JNI_GetAnyFieldID): Likewise. Also, only use ! _Jv_FindClassFromSignature. ! ! 2001-01-26 Warren Levy ! ! * java/lang/natSystem.cc (getSystemTimeZone): Only use tm_gmtoff ! and timezone if they are available on the system. ! ! 2001-01-24 Tom Tromey ! ! * java/lang/sf_fabs.c: Use uint32_t, not __uint32_t. ! 2001-01-24 Tom Tromey * Makefile.in: Rebuilt. ! * Makefile.am (c_source_files): Added sf_fabs.c. ! * java/lang/sf_fabs.c: New file. ! ! 2001-01-19 Warren Levy ! ! * java/text/SimpleDateFormat.java (format): Compute hour for cases ! HOUR_OF_DAY1_FIELD (1-24), HOUR1_FIELD (1-12), and HOUR0_FIELD (0-11) ! correctly. Adjust properly from 0-23 clock hour. ! ! 2001-01-17 Mark Wielaard ! ! * java/bean/Beans.java (instantiate): enable Applet code from Classpath ! ! 2001-01-17 Bryce McKinlay ! ! * java/lang/Class.h (isInterface): Move implementation from ! natClass.cc. Declare inline. ! (Class): Add default constructor. ! * java/lang/Object.h: Update comments. ! * java/lang/natClass.cc (initializeClass): Use _Jv_InitClass to ! initialize superclass, saving a call if super is already initialized. ! ! 2001-01-16 Alexandre Petit-Bianco ! ! * prims.cc (init_prim_class): Deleted. ! (DECLARE_PRIM_TYPE): Rewritten. ! * java/lang/Class.h (stdio.h): Include removed. ! (stddef.h): Included. ! (java/lang/reflect/Modifier.h): Likewise. ! (Class): Contructor now takes arguments, initializes fields. ! (initializePrim): Prototype deleted. ! * java/lang/natClass.cc (initializePrim): Deleted. ! ! 2001-01-16 Warren Levy ! ! * java/math/BigInteger.java: Update Copyright year. ! ! 2001-01-16 Hans Boehm ! ! * java/math/BigInteger.java (setShiftRight): Only do negative shift ! if count != 0. ! ! 2001-01-14 Mark Wielaard ! * java/net/URLDecoder.java: Thanks Edgar Villanueva (edgarvil@home.com) ! (decode): Merge comments with Classpath, don't throw Exception ! ! 2001-01-12 Tom Tromey ! ! * gnu/awt/gtk/natGtkComponentPeer.cc (getLocationOnScreen): ! Wrote. ! (setCursor): Wrote. ! Include Cursor.h. ! * gnu/awt/gtk/natGtkLabelPeer.cc: New file. ! * gnu/awt/gtk/natGtkButtonPeer.cc: New file. ! * gnu/awt/gtk/gtkcommon.h (class _Jv_GdkThreadLock): New class. ! * gnu/awt/gtk/GtkLabelPeer.java: New file. ! * gnu/awt/gtk/GtkButtonPeer.java: New file. ! ! * java/lang/natSystem.cc: Include locale.h if it exists. * configure: Rebuilt. - * configure.in: Check for locale.h. - - 2001-01-11 Tom Tromey ! * java/awt/Cursor.java (Cursor(String)): Set type to custom. ! (Cursor(int), getPredefinedCursor): Throw exception if argument ! invalid. ! ! 2001-01-03 Tom Tromey ! ! * gnu/awt/gtk/natGtkComponentPeer.cc (setCursor): Wrote. ! (getLocationOnScreen): Wrote. ! ! 2001-01-11 Bryce McKinlay ! ! * Makefile.am: Re-enable dependencies. ! * Makefile.in: Rebuilt. ! ! 2001-01-10 Warren Levy ! ! * java/math/BigDecimal.java (divide): Fixed comment. ! ! 2001-01-10 Warren Levy ! ! Fix for PR libgcj/1596: ! * java/math/BigDecimal.java (divide): Check newScale for validity. ! Ensure that BigInteger.pow() is called with a non-negative value. ! (setScale (int)): New public method. ! (setScale (int,int)): New public method. ! ! 2001-01-09 Oskar Liljeblad ! ! Fix for PR libgcj/1338: ! * java/io/StreamTokenizer.java (nextToken): Handle // and /* before ! commentChar. Fixed typos in comments. ! ! 2001-01-08 Warren Levy ! ! Fix for PR libgcj/1411: ! * Makefile.am: Removed java/util/natTimeZone.cc. ! * Makefile.in: Rebuilt. ! * gnu/gcj/text/LocaleData_en_US.java (zoneStringsDefault): Added ! missing localized timezone names. ! * java/lang/System.java (getDefaultTimeZoneId): New private method. ! * java/lang/natSystem.cc (getSystemTimeZone): New private method. ! (init_properties): Set user.timezone property. ! * java/text/DateFormatSymbols.java (zoneStringsDefault): Added ! default timezone names; removed non-standard ones. Use standard ! ID names per JCL. ! * java/util/Date.java (toGMTString): Removed zoneGMT variable. ! (UTC): Ditto. ! * java/util/TimeZone.java: Add standard ID names per JCL; removed ! non-standard ones. ! (getDefaultTimeZoneId): Removed. ! (zoneGMT): Removed. ! * java/util/natTimeZone.cc: Removed. ! ! 2001-01-08 Bryce McKinlay ! ! * java/lang/Class.h (_Jv_InitClass): Use __builtin_expect. ! (_Jv_NewArrayClass): Renamed from _Jv_FindArrayClass. ! (_Jv_GetArrayClass): New inline function. ! (arrayclass): New field. ! * prims.cc (_Jv_NewObjectArray): Use _Jv_GetArrayClass. Don't use ! _Jv_GetArrayElementFromElementType. ! (_Jv_NewPrimArray): Ditto. ! (_Jv_PrimClass constructor): Initialize "depth", "ancestors", and ! "idt" for completeness. Initialze "arrayclass" using _Jv_NewArrayClass. ! Set Modifier::ABSTRACT. ! * java/lang/natClassLoader.cc (_Jv_NewClass): Initialize "arrayclass". ! (_Jv_NewArrayClass): Renamed from _Jv_FindArrayClass. Now void. ! Now synchronized. Array classes are now referenced from ! elementClass->arrayclass. Don't use _Jv_FindClassInCache. ! Set array classes' accessibility flags correctly. Optimize so that ! all array classes share the same IDT. ! * java/lang/reflect/natArray.cc (newInstance): Use _Jv_GetArrayClass. ! * java/lang/reflect/natMethod.cc (_Jv_GetTypesFromSignature): Ditto. ! * java/lang/natClass.cc (_getFields): Increment offset. Prevent fields ! in superclasses from overwriting classes own fields. ! (_Jv_IsAssignableFrom): Check for NULL source idt instead of calling ! Modifier::isAbstract(). ! (null_idt): New static field. ! (_Jv_PrepareConstantTimeTables): Optimize case where class implements ! no interfaces. ! (_Jv_IndexOf): Made inline. ! * boehm.cc (_Jv_MarkObj): Mark "arrayclass" field. ! ! 2001-01-08 Tom Tromey ! ! Fix for PR java/1586: ! * Makefile.in: Rebuilt. ! * Makefile.am (AUTOMAKE_OPTIONS): Added no-dependencies. ! ! 2001-01-08 Bryce McKinlay ! ! * Makefile.am: Use the new "-M -MF" option for generating dependencies ! from the c++ compiler. ! * Makefile.in: Rebuilt. ! ! 2001-01-07 Alexandre Petit-Bianco ! ! All files with updated copyright. ! * prims.cc (class _Jv_PrimClass): Removed. ! (init_prim_class): New function. ! (DECLARE_PRIM_TYPE): Rewritten. `java::lang::Class' replaces ! `_Jv_PrimClass' in primitive type declarations. Assign to the ! value returned by `init_prim_class.' ! * gcj/array.h: `java::lang::Class' replaces `_Jv_PrimClass' in ! primitive type declarations. ! (JvPrimClass): Cast to `jclass' removed. ! * java/lang/Class.h (Class): New constructor. ! (Class): New copy constructor. ! (initializePrim): New prototype. ! (_Jv_PrimClass): Field removed. ! * java/lang/Object.h (struct _JvObjectPrefix): New virtuals ! nacd_1 and nacd_2 (for compatibility with the new C++ ABI.) ! (class java::lang::Object): `finalize' moved up front. ! * java/lang/natClass.cc ! (isAssignableFrom): Turned outline. ! (isInstance): Likewise. ! (isInterface): Likewise, fixed indentation. ! (initializePrim): New function. ! ! 2001-01-07 Anthony Green ! ! * Makefile.am (texinfo): Add texinfo target for generating texinfo ! documentation. ! * Makefile.in: Rebuilt. ! ! * scripts/TexinfoDoclet.java: New file. ! ! * doc/java-applet.texi, doc/java-lang-reflect.texi, ! doc/java-awt-color.texi, doc/java-lang.texi, ! doc/java-awt-datatransfer.texi, doc/java-math.texi, ! doc/java-awt-event.texi, doc/java-net.texi, ! doc/java-awt-geom.texi, doc/java-security-spec.texi, ! doc/java-awt-image.texi, doc/java-security.texi, ! doc/java-awt-peer.texi, doc/java-sql.texi, doc/java-awt.texi, ! doc/java-text.texi, doc/java-beans-beancontext.texi, ! doc/java-util-jar.texi, doc/java-beans.texi, ! doc/java-util-zip.texi, doc/java-io.texi, doc/java-util.texi, ! doc/java-lang-ref.texi: New files. ! ! 2001-01-07 Anthony Green ! ! * java/net/URLConnection.java (setDoOutput): URLConnection's may ! be used for both input and output, so don't clear doInput. ! ! * java/lang/StringBuffer.java: Fix comments. ! ! 2001-01-06 Anthony Green ! ! * java/beans/PropertyDescriptor.java: Fix comment. ! * java/io/PushbackReader.java: Fix comment. ! * java/io/ObjectStreamClass.java: Fix comment. ! * java/io/DataInputStream.java: Fix comment. ! * java/io/PipedInputStream.java: Fix comments. ! * java/io/PipedReader.java: Fix comments. ! * java/sql/DatabaseMetaData.java: Fix comments. ! ! 2001-01-06 Bryce McKinlay ! ! * java/io/PipedReader: Synchronize on "lock" instead of this. ! ! 2001-01-05 Bryce McKinlay ! ! * java/lang/Thread.java: Update comment. ! ! * java/io/PipedInputStream: Rewrote to be simpler and more correct. ! * java/io/PipedOutputStream: Updated to match new PipedInputStream. ! * java/io/PipedReader: New implementation based on new ! PipedInputStream. ! * java/io/PipedWriter: Updated to match new PipedReader. ! ! 2001-01-03 Tom Tromey ! ! * java/awt/ScrollPane.java (setBlockIncrement): Throw error. ! (getViewportSize): Insets include scrollbar size. ! (doLayout): Finished. ! (getScrollPosition): Wrote. ! * java/awt/peer/ScrollPanePeer.java (setBlockIncrement): Removed. ! ! 2001-01-02 Tom Tromey ! ! * java/awt/ScrollPane.java: Wrote. ! * java/awt/peer/ScrollPanePeer.java (setBlockIncrement): New ! method. ! ! * java/awt/Panel.java (Panel()): Fixed. ! ! * java/awt/Component.java (isShowing): Return false if no peer ! exists, and true if component is visible and no parent exists. ! (getLocationOnScreen): Wrote. ! (getPreferredSize): Removed FIXME comment. ! (getMinimumSize): Likewise. ! (getAlignmentX, getAlignmentY): Wrote. ! (list): Wrote. ! (requestFocus): Wrote. ! (transferFocus): Wrote. ! (findNextFocusComponent): New method. ! (hasFocus()): Wrote. ! (checkImage): Wrote. ! (enableEvents): Call setEventMask on the peer. ! ! * java/awt/Container.java (list): Use super.list() to print self. ! (findNextFocusComponent): New method. ! (setLayout): Call invalidate. ! (findComponentAt): Wrote. ! ! 2000-12-30 Bryce McKinlay ! ! * Makefile.am (libgcj_la_LIBADD): Add $(THREADLIBS). This ensures that ! the correct versions of various linuxthreads functions get linked. ! * Makefile.in: Rebuilt. ! * java/lang/natThread.cc (finalize_native): New static function. Call ! _Jv_ThreadDestroyData. ! (initialize_native): Register finalizer for "data". ! * include/posix-threads.h (_Jv_ThreadInitData): New simpler prototype. ! (_Jv_ThreadDestroyData): New prototype. ! * include/win32-threads.h: Ditto. ! * include/no-threads.h: Ditto. ! * posix-threads.cc (_Jv_ThreadInitData): Implement new prototype. ! (_Jv_ThreadDestroyData): New function. Free native thread "data" and ! move mutex and condition variable destroy code from: ! (really_start): ...here. ! (_Jv_ThreadStart): Set PTHREAD_CREATE_DETACHED. ! * win32-threads.cc (_Jv_ThreadInitData): Implement new prototype. ! (_Jv_ThreadDestroyData): Implemented. ! * nogc.cc (_Jv_AllocObject): Use "void *" not "ptr_t". ! (_Jv_AllocArray): Ditto. ! ! 2000-12-27 Jeff Sturm ! ! * java/sql/DriverManager.java (getConnection): Don't set user/password ! properties if null. ! ! 2000-12-27 Warren Levy ! ! Fix for PR libgcj/1358: ! * java/lang/System.java: Update Copyright date properly. ! * java/util/Calendar.java: Fix typo in comment. ! (set): Set 24-hour clock hour instead of 12-hour clock hour. ! * java/util/GregorianCalendar.java (GregorianCalendar): Properly ! initialize times. Spec says to set H:M:S values to zero only if ! a date is given. ! * java/util/TimeZone.java (getDefaultDisplayName): Casts to char ! needed for evaluating numbers '0' to '9' in printouts of GMT offsets. ! * java/util/natGregorianCalendar.cc (computeTime): Properly handle ! timezones and GMT offsets, being careful to account for units of ! milliseconds vs. seconds. ! ! 2000-12-28 Bryce McKinlay ! ! * java/lang/natClass.cc (_Jv_IsAssignableFrom): Primitive TYPEs can ! not be assigned to Object. ! ! Fix for PR libgcj/1516: ! * java/lang/reflect/natMethod.cc (primitives): Remove void entry. ! Add boolean entry. ! (can_widen): Declared inline. Remove redundant checks for void ! arguments and char->short conversion. Add special case for boolean ! conversions. ! (ffi_type): Declared inline. ! (_Jv_CallAnyMethodA): Move unwrapping logic inside isPrimitive() block. ! ! 2000-12-26 Petter Reinholdtsen ! ! * java/sql/SQLWarning.java: Fixed typo in comment. ! ! 2000-12-26 Tom Tromey ! ! * java/awt/MenuItem.java (paramString): Now protected. ! ! * java/awt/MenuShortcut.java: Implements Serializable. ! ! * java/awt/MenuBar.java: Rewrote from scratch. ! * java/awt/MenuComponent.java (removeNotify): Wrote. ! Implements Serializable. ! * java/awt/GridBagConstraints.java (GridBagConstraints): New ! constructor. ! * java/awt/CheckboxMenuItem.java: Wrote. ! 2000-12-25 Tom Tromey ! * java/awt/MenuContainer.java: Fixed typo. ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added SystemColor.java. ! * java/awt/SystemColor.java: New file. ! * java/awt/Color.java (rgba): Now package-private. ! * java/awt/event/InputEvent.java (isAltGraphDown): New method. ! * java/awt/event/ContainerEvent.java (getContainer): Renamed from ! getComponent. ! * java/awt/MenuItem.java (addNotify): New method. ! (MenuItem(String,MenuShortcut)): New constructor. ! (setLabel): Notify peer of change. ! (setEnabled): Likewise. ! * java/awt/GridLayout.java (toString): New method. ! * java/awt/FlowLayout.java (LEADING, TRAILING): New constants. ! (FlowLayout): Check for LEADING and TRAILING. ! (setAlignment): Likewise. ! (layoutContainer): Handle component orientation. ! * java/awt/Component.java (orientatin): New field. ! (setComponentOrientation): Wrote. ! (getComponentOrientation): Wrote. ! * java/awt/Event.java (Event): Implements Serializable. ! (consumed): New field for serialization. ! * java/awt/Dimension.java (Dimension): Implements Serializable. ! * java/awt/Cursor.java (Cursor): Implements Serializable. ! * java/awt/Container.java (Container): No longer abstract. ! * java/awt/Choice.java: Wrote. ! * java/awt/Checkbox.java: Wrote. ! * java/awt/ItemSelectable.java: Documented. ! * java/awt/CheckboxGroup.java: Wrote. ! * java/awt/CardLayout.java (layoutContainer): Directly use fields ! in other classes. ! (getSize): Likewise. ! 2000-12-24 Jeff Sturm ! * java/io/FileDescriptor.java: Initialize fd to -1. ! Remove default constructor. ! 2000-12-23 Joseph S. Myers ! * java/lang/mprec.h: Change C9X reference to refer to C99. ! 2000-12-22 Bryce McKinlay ! * java/lang/Throwable.java (trace_enabled): New static field. ! * java/lang/natThrowable.cc (fillInStackTrace): Do nothing if ! trace_enabled not set. ! * prims.cc (main_init): Turn off trace_enabled while creating ! default exception objects. ! 2000-12-21 Tom Tromey ! * java/beans/PropertyChangeListener.java: Extends EventListener. ! * java/beans/VetoableChangeListener.java: Extends EventListener. ! * java/util/zip/Deflater.java (update, init): Now private. ! 2000-12-21 Bryce McKinlay ! * java/util/BasicMapEntry.java: Re-added. ! * java/util/HashMap.java (Entry): Extend BasicMapEntry. ! (putAll): Test for BasicMapEntry. ! * java/util/Hashtable.java (Entry): Extend BasicMapEntry. ! (putAll): Test for BasicMapEntry. ! Change references from `HashMap.Entry' to `Entry' in various places. ! * Makefile.am: Add BasicMapEntry.java. ! * Makefile.in: Rebuilt. ! 2000-12-18 Warren Levy ! * java/util/GregorianCalendar.java (GregorianCalendar): Constructors ! need to set timezone to a valid non-null value. Partial fix for ! PR 331. ! 2000-12-18 Bryce McKinlay ! * java/awt/Window.java (addNotify): Remove peer casting hack now that ! gcj/312 is fixed. ! * java/awt/Button.java (addNotify): Likewise. ! * java/awt/Label.java (addNotify): Likewise. ! * java/awt/Panel.java (addNotify): Likewise. ! * java/awt/Scrollbar.java (addNotify): Likewise. ! * java/awt/Component.java (processPaintEvent): Use peer not getPeer. ! Remove redundant null checks. ! 2000-12-18 Joseph S. Myers ! * COPYING: Update to current ! ftp://ftp.gnu.org/pub/gnu/Licenses/COPYING-2.0 (fixes references ! to 19yy as example year in copyright notice). ! 2000-12-18 Bryce McKinlay ! * java/util/zip/natInflater.cc (inflate): Treat Z_BUF_ERROR as ! end-of-stream if avail_in is 0. ! 2000-12-17 Bryce McKinlay ! * java/util/ArrayList.java (data): Declare transient. ! (serialPersistantFields): Removed. ! (readObject): Use defaultReadObject(), not readFields(). ! (writeObject): Use defaultWriteObject(), not writeFields(). ! 2000-12-17 Jeff Sturm ! * java/util/Hashtable.java (put): Remove `last' variable. ! Link new entry to head of list. ! * java/util/HashMap.java (put): Ditto. ! 2000-12-15 Tom Tromey ! * java/util/ResourceBundle.java (trySomeGetBundle): Pass class ! loader to Class.forName. ! 2000-12-14 Tom Tromey ! * java/util/ResourceBundle.java ! (getBundle(String,Locale,ClassLoader)): New method. ! (trySomeGetBundle): Added `loader' argument. ! (partialGetBundle): Likewise. ! * java/text/NumberFormat.java (groupingUsed, parseIntegerOnly, ! maximumFractionDigits, maximumIntegerDigits, ! minimumFractionDigits, minimumIntegerDigits): Now ! package-private. ! * java/lang/Thread.java (checkAccess): Now final. ! * java/lang/RuntimePermission.java: Class now final. ! * java/io/StringWriter.java (StringWriter(int)): Now public. ! * java/io/SerializablePermission.java (legal_names): Now private. ! * java/lang/Character.java: Updated UnicodeBlock constants. ! * scripts/blocks.pl: Special case private use and surrogate ! areas. Updated URL. ! 2000-12-12 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (GCJ_WITH_FLAGS): New macro, includes --encoding ! option. ! (GCJCOMPILE): Use it. ! (JAVAC): Likewise. ! 2000-12-11 Tom Tromey ! * gnu/gcj/runtime/FirstThread.java (Kcert, Kfile, Khttp, Kjar): ! New static final fields. ! * scripts/classes.pl (scan): Skip lines with leading `*'. ! Fix for PR libgcj/378. ! 2000-12-11 Bryce McKinlay ! * configure.in: Remove check for -fuse-divide-subroutine. * configure: Rebuilt. ! * java/util/Hashtable.java (Enumerator.nextElement): Initialize `e'. ! ! * gcj/javaprims.h: Rebuilt CNI namespace declarations. ! ! 2000-12-11 Bryce McKinlay ! ! * Makefile.am: Add HashSet.java and java/lang/ref classes. ! Remove BasicMapEntry.java and Bucket.java. ! * Makefile.in: Rebuilt. ! * java/util/HashMap.java: Rewritten. ! * java/util/HashSet.java: Imported from classpath. ! * java/util/WeakHashMap.java: Imported from classpath. ! * java/util/Hashtable.java: Rewritten based on new HashMap code. ! * java/util/Bucket.java: Deleted. ! * java/util/BasicMapEntry.java: Deleted. ! * java/util/Collections.java (search): Use a for-loop, not iterator ! hasNext(). ! (copy): Use a for-loop. Throw an IndexOutOfBoundsException if run out ! of elements in source. ! (max): Use a for-loop. ! (min): Ditto. ! (reverse): Keep track of positions instead of using Iterator's ! nextIndex() and previousIndex(). ! (shuffle(List)): Initialize defaultRandom if required using ! double-check thread safety idiom. Call two-argument shuffle method ! using defaultRandom. ! (defaultRandom): New field. ! (shuffle(List, Random)): Use a for-loop. Keep track of pos instead of ! using previousIndex() and nextIndex(). ! (singletonMap(iterator)): Use a HashMap.Entry, not BasicMapEntry. ! * java/util/AbstractCollection.java (toString): Use a StringBuffer. ! * java/util/AbstractMap.java (toString): Use StringBuffer. ! * java/lang/ref/PhantomReference.java: Imported from classpath. ! * java/lang/ref/SoftReference.java: Ditto. ! * java/lang/ref/Reference.java: Ditto. ! * java/lang/ref/WeakReference.java: Ditto. ! * java/lang/ref/ReferenceQueue.java: Ditto. ! ! 2000-12-10 Richard Henderson ! ! * configure.host: Recognize alpha*-*, not alphaev6-*. ! ! 2000-12-09 Anthony Green ! ! * configure.host: Enable interpreter for Alpha. ! ! 2000-12-09 Alexandre Petit-Bianco ! ! * Makefile.am (data_DATA): libgcj.jar replaces libgcj.zip. ! (ZIP): Points at fastjar instead of zip. ! (libgcj_la_DEPENDENCIES): libgcj.jar replaces libgcj.zip. ! (libgcj_la_LDFLAGS): Correctly point at libsupc++. ! (libgcjx_la_DEPENDENCIES): libgcj.jar replaces libgcj.zip. ! (libgcjx_la_LDFLAGS): Correctly point at libsupc++. ! ($(java_source_files:.java=.class):): libgcj.jar replaces libgcj.zip. ! ($(x_java_source_files:.java=.class):): Likewise. ! (libgcj.jar:): Replaces libgcj.zip:, builds libgcj.jar and uses ! fastar's flags. ! (CLEANFILES): libgcj.jar replaces libgcj.zip. ! (java/lang/ClassLoader.h:): Depends on libgcj.jar. ! (gnu/gcj/runtime/FirstThread.h:, java/lang/Thread.h:, ! java/lang/String.h:, java/lang/reflect/Constructor.h:, ! java/lang/reflect/Field.h:, java/lang/reflect/Method.h:, ! gnu/gcj/runtime/VMClassLoader.h:, ! java/io/ObjectInputStream$$GetField.h:, ! java/io/ObjectOutputStream$$PutField.h:, header-check:): Likewise. ! (Makefile.in): Rebuilt. ! ! 2000-12-08 Tom Tromey ! From Phil Edwards: ! * configure: Rebuilt. ! * configure.in: Use echo, not `:', to create .d files. ! 2000-12-08 Warren Levy ! * java/lang/StringBuffer.java (insert(int,char[])): Avoid ! NullPointerException so proper check of offset can be done. ! 2000-12-08 Warren Levy ! * java/io/FileInputStream.java (close): Check if the fd is valid. ! * java/io/RandomAccessFile.java (close): Ditto. ! * java/net/PlainDatagramSocketImpl.java (close): Ditto. ! * java/net/PlainSocketImpl.java (close): Ditto. ! 2000-12-06 Tom Tromey ! * java/awt/GridBagConstraints.java: Filled in values for static ! final fields. ! * java/util/BitSet.java: Updated copyright notice. ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new file. ! * java/awt/GridBagConstraints.java: New file. ! 2000-12-05 Tom Tromey ! * java/text/Collator.java (decomposeCharacter, decmp, strength): ! Now package-private, not protected. ! * java/text/DateFormatSymbols.java (equals): Now private. ! * java/text/DecimalFormatSymbols.java (safeGetChar): Now private. ! * java/util/BitSet.java: Class no longer final. ! 2000-12-04 Warren Levy ! * java/util/TimeZone.java (getAvailableIDs): Activated commented ! out code dependent on compiler and library changes. ! 2000-12-04 Warren Levy ! * java/io/FilePermission.java: Made class final per spec. ! * java/text/DecimalFormatSymbols.java (setCurrencySymbol): Changed ! method name to match spec (fixed typo). ! * java/util/LinkedList.java: Implements List. ! 2000-12-04 Bryce McKinlay ! * java/lang/natDouble.cc: Include fdlibm.h, not mprec.h. From ! Edgar Villanueva . ! 2000-12-03 Tom Tromey ! * java/awt/geom/Point2D.java: Added protected constructor. ! (equals): New method. ! (Float.setLocation(float,float)): New method. ! * java/awt/geom/Dimension2D.java: Added protected constructor. ! * java/awt/geom/AffineTransform.java: Made all constants public. ! (concatenate): Fixed typo in name. ! * java/awt/event/WindowAdapter.java: Class now abstract. ! * java/awt/event/KeyEvent.java (CHAR_UNDEFINED): Now final. ! * java/awt/event/FocusEvent.java: Extend ComponentEvent, not ! AWTEvent. ! * java/awt/AWTError.java: Extend Error, not ! IllegalStateException. ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new file. ! * java/awt/geom/RoundRectangle2D.java: New file. ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new file. ! * java/awt/FlowLayout.java: New file. ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new file. ! * java/awt/GridLayout.java: New file. ! 2000-12-02 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new files. ! * java/awt/CardLayout.java: New file. ! * java/awt/AWTPermission.java: New file. ! 2000-12-01 Tom Tromey ! * java/util/Vector.java (insertElementAt): Unconditionally ! increment elementCount. ! (removeRange): Clear unused slots in vector. ! 2000-12-02 Bryce McKinlay ! * java/lang/natMath.cc: Declare fabsf() function. ! * java/lang/mprec.h: Don't include math.h. ! * java/lang/dtoa.c: Include string.h. ! * java/lang/natString.cc (toLowerCase): Initialize `ch' to prevent ! compiler warning. ! From Adam Welc : ! * java/util/LinkedList.java (removeFirst): Update `first' field. ! Handle the last == first case. ! (removeLast): Update `last' field. Handle the last == first case. ! 2000-12-01 Warren Levy ! * Makefile.am: Added entries for new java.sql modules. ! * Makefile.in: Rebuilt. ! 2000-12-01 Warren Levy ! * mauve-libgcj: Turned on JDK1.2 and turned off tests for classes ! that aren't quite 1.2 compatible yet. ! 2000-11-30 Warren Levy ! * java/sql/Array.java: New file from classpath. ! * java/sql/BatchUpdateException.java: Ditto. ! * java/sql/Blob.java: Ditto. ! * java/sql/Clob.java: Ditto. ! * java/sql/Ref.java: Ditto. ! * java/sql/SQLData.java: Ditto. ! * java/sql/SQLInput.java: Ditto. ! * java/sql/SQLOutput.java: Ditto. ! * java/sql/Struct.java: Ditto. ! * java/sql/CallableStatement.java: Merged file from claspath. ! * java/sql/Connection.java: Ditto. ! * java/sql/DataTruncation.java: Ditto. ! * java/sql/DatabaseMetaData.java: Ditto. ! * java/sql/DriverManager.java: Ditto. ! * java/sql/PreparedStatement.java: Ditto. ! * java/sql/ResultSet.java: Ditto. ! * java/sql/ResultSetMetaData.java: Ditto. ! * java/sql/SQLException.java: Ditto. ! * java/sql/SQLWarning.java: Ditto. ! * java/sql/Statement.java: Ditto. ! * java/sql/Types.java: Ditto. ! 2000-11-29 Bryce McKinlay ! * java/lang/natSystem.cc (init_properties): Set user.language and ! user.region. ! * configure.in: Check for setlocale. * configure: Rebuilt. * include/config.h.in: Rebuilt. ! * java/util/zip/InflaterInputStream (read): Don't return -1 unless ! the infate() call didn't deliver any output. Throw a ZipException if ! the needsDictionary() call returns true. ! * java/io/ByteArrayInputStream (read): Remove redundant bounds checks. ! * java/io/InputStreamReader: Use the default buffer size for the ! contained BufferedInputStream. ! ! 2000-11-28 Warren Levy ! ! * java/text/DateFormatSymbols.java (zoneStringsDefault): Added ! more time zone entries. ! * java/text/SimpleDateFormat.java (format): Added case for ! TIMEZONE_FIELD. ! ! 2000-11-28 Bryce McKinlay ! ! * java/io/DataInputStream.java: Merge classpath docs. Call in.read() ! directly rather than read() in all cases. Make primitive read ! implementations more efficient, as defined in JDK online docs. ! (skipBytes): Behave like the JDK's implementation. ! * java/io/BufferedReader.java: Merge classpath docs. Check for a ! closed stream with checkStatus() whenever an IOException can be ! thrown. ! (checkStatus): New private method. ! ! 2000-11-27 Warren Levy ! ! * Makefile.am: Added natTimeZone.cc. ! * Makefile.in: Rebuilt. ! * gnu/gcj/text/LocaleData_en.java: Added DateFormat entries. ! * java/text/DateFormatSymbols.java (ampms): Made package private. ! (eras): Made package private. ! (months): Made package private. ! (shortMonths): Made package private. ! (shortWeekdays): Made package private. ! (weekdays): Made package private. ! (formatPrefixes): New private field. ! (localPatternCharsDefault): Made private. ! (dateFormats): New package private field. ! (timeFormats): New package private field. ! (formatsForKey): New private method. ! (DateFormatSymbols(Locale)): Set dateFormats and timeFormats. ! (DateFormatSymbols(DateFormatSymbols)): Ditto. ! * java/text/SimpleDateFormat.java: Merged with Classpath. ! * java/util/TimeZone.java: Merged with Classpath. ! * java/util/natTimeZone.cc: New file. ! ! 2000-11-27 Bryce McKinlay ! ! * java/util/Vector.java (ensureCapacity): Don't increment modCount. ! (addElement): Don't increment elementCount twice. Doh. ! * java/util/ArrayList.java (add): Only call ensureCapacity if the ! array needs to be expanded. ! (addAll): Ditto. ! * java/util/Collections.java (UnmodifiableCollection): Implement ! toString(). ! (UnmodifiableList): Throw UnsupportedOperationException from ! modification methods. Set `l' from the one-parameter constructor. ! (UnmodifiableMap): Implement toString(). ! (SynchronizedCollection): Ditto. ! (SynchronizedList): Set `l' from the one-parameter constructor. ! (SynchronizedSortedSet): Set `ss' from the one-parameter constructor. ! (SynchronizedMap): Implement toString(). ! ! Sun Nov 26 23:59:55 2000 Anthony Green ! ! * javax/naming/NameParser.java, ! javax/naming/directory/AttributeInUseException.java, ! javax/naming/directory/AttributeModificationException.java, ! javax/naming/directory/InvalidAttributeIdentifierException.java, ! javax/naming/directory/InvalidAttributesException.java, ! javax/naming/directory/InvalidAttributeValueException.java, ! javax/naming/directory/InvalidSearchControlsException.java, ! javax/naming/directory/InvalidSearchFilterException.java, ! javax/naming/directory/NoSuchAttributeException.java, ! javax/naming/directory/SchemaViolationException.java: New files. ! ! Sun Nov 26 22:35:53 2000 Anthony Green ! ! * javax/naming/InitialContext.java (rebind): Implement. ! (unbind): Implement. ! (rename): Implement. ! (list): Implement. ! (listBindings): Implement. ! (destroySubcontext): Implement. ! (createSubcontext): Implement. ! (lookupLink): Implement. ! (getNameParser): Implement. ! (composeName): Implement. ! (addToEnvironment): Implement. ! ! Sun Nov 26 21:30:25 2000 Anthony Green ! ! * javax/naming/AuthenticationException.java, ! javax/naming/AuthenticationNotSupportedException.java, ! javax/naming/CannotProceedException.java, ! javax/naming/CommunicationException.java, ! javax/naming/ConfigurationException.java, ! javax/naming/ContextNotEmptyException.java, ! javax/naming/InsufficientResourcesException.java, ! javax/naming/InterruptedNamingException.java, ! javax/naming/InvalidNameException.java, ! javax/naming/LimitExceededException.java, ! javax/naming/LinkException.java, ! javax/naming/LinkLoopException.java, ! javax/naming/MalformedLinkException.java, ! javax/naming/NameAlreadyBoundException.java, ! javax/naming/NameNotFoundException.java, ! javax/naming/NamingSecurityException.java, ! javax/naming/NoPermissionException.java, ! javax/naming/NotContextException.java, ! javax/naming/PartialResultException.java, ! javax/naming/ReferralException.java, ! javax/naming/ServiceUnavailableException.java, ! javax/naming/SizeLimitExceededException.java, ! javax/naming/TimeLimitExceededException.java: New files. ! ! * javax/naming/Name.java (clone): New method. ! (compareTo): New method. ! (isEmpty): New method. ! (getAll): New method. ! (getPrefix): New method. ! (getSuffix): New method. ! (startsWith): New method. ! (endsWith): New method. ! (addAll): New method. ! (addAll): New method. ! (add): New method. ! (add): New method. ! (remove): New method. ! ! * javax/naming/Context.java (lookup): New method. ! (rebind): New method. ! (unbind): New method. ! (rename): New method. ! (list): New method. ! (listBindings): New method. ! (destroySubcontext): New method. ! (createSubcontext): New method. ! (lookupLink): New method. ! (getNameParser): New method. ! (composeName): New method. ! (addToEnvironment): New method. ! (removeFromEnvironment): New method. ! (getEnvironment): New method. ! (close): New method. ! (getNameInNamespace): New method. ! ! * javax/naming/InitialContext.java (lookup): New method. ! (rebind): New method. ! (unbind): New method. ! (rename): New method. ! (list): New method. ! (listBindings): New method. ! (destroySubcontext): New method. ! (createSubcontext): New method. ! (lookupLink): New method. ! (getNameParser): New method. ! (composeName): New method. ! (addToEnvironment): New method. ! (removeFromEnvironment): New method. ! (getEnvironment): New method. ! (close): New method. ! (getNameInNamespace): New method. ! ! 2000-11-26 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (core_java_source_files): Added ! RuntimePermission.java. ! * java/lang/RuntimePermission.java: Imported from Classpath. ! * java/lang/Thread.java (getContextClassLoader): Now ! synchronized. Added security code. ! (setContextClassLoader): Likewise. ! ! * prims.cc (_Jv_NewObjectArray): Use const_cast to initialize ! length field of array. ! (_Jv_NewPrimArray): Likewise. ! * gcj/array.h (__JArray): `length' field now const. Added ! constructor. ! ! 2000-11-26 Anthony Green ! ! * javax/naming/spi/NamingManager.java, ! javax/naming/spi/ObjectFactory.java, ! javax/naming/spi/InitialContextFactory.java, ! javax/naming/spi/InitialContextFactoryBuilder.java, ! javax/naming/RefAddr.java, javax/naming/Reference.java, ! javax/naming/NamingException.java, javax/naming/Context.java, ! javax/naming/Referenceable.java, ! javax/naming/directory/InitialDirContext.java, ! javax/naming/directory/DirContext.java, ! javax/naming/directory/Attributes.java, ! javax/naming/directory/Attribute.java, ! javax/naming/StringRefAddr.java, ! javax/naming/NamingEnumeration.java, javax/naming/Name.java, ! javax/naming/InitialContext.java, ! javax/naming/NoInitialContextException.java: New files. ! ! 2000-11-25 Anthony Green ! ! * prims.cc (_Jv_NewObjectArray): Undo placement change. ! (_Jv_NewPrimArray): Likewise. ! * gcj/array.h (__JArray): Undo const change. Removed constructor. ! (class JArray): Removed constructor. ! ! * java/lang/Thread.java (context_class_loader): New private data. ! (getContextClassLoader): New method. ! (setContextClassLoader): New method. ! (Thread): Initialize context_class_loader. ! ! * java/net/URLClassLoader.java: Import java.util.Enumeration. ! (getResource): Rename to findResource. ! (findResource): New method. Used to be getResource. ! (getResourceAsStream): Deleted. ! (jarFileize): Extracted logic from URLClassLoader constructor into ! this new private method. ! (addURL): New protected method. ! (URLClassLoader): Call jarFileize. Use addElement instead of ! insertElementAt. ! (findResources): New method. ! ! * java/lang/ClassLoader.java: Import java.util.Enumeration. ! (getResource): Implement correct logic. ! (findResource): New method. ! (getResources): New method. ! (findClass): Create a ClassNotFoundException with the name of the ! class rather than nothing at all. ! (defineClass) Only throw ClassFormatError. ! ! * java/lang/Class.java (forName): New method. ! * java/lang/Class.h (forName): New method. ! * java/lang/natClass.cc (forName): New method. ! ! 2000-11-24 Bryce McKinlay ! ! * java/lang/System.java (setProperties): Only call init_properties() ! if properties is null. ! (getProperties): Ditto. ! (getProperty): Ditto. ! (setProperty): Call init_properties if properties are null. ! (prop_init): Remove field. ! * java/lang/natSystem.cc (init_properties): Synchronize the entire ! method. Check for null properties after synchronizing instead of ! prop_init flag. Set the properties field last for thread safety. ! ! * java/io/ObjectInputStream.java (ObjectInputStream): If DEBUG is set, ! test for gcj.dumpobjects property and enable object stream dumping ! if it is set. ! (dumpElement): No longer native. ! (dumpElementln): Ditto. ! (setDump): Do not define. ! * java/io/natObjectInputStream.cc (dumpElement): Removed. ! (dumpElementln): Removed. ! (setDump): Removed. ! ! 2000-11-24 Bryce McKinlay ! ! * configure: Rebuilt. ! * Makefile.in: Rebuilt. ! * Makefile.am (built_java_source_files): Add Configuration.java. ! * configure.in: Add Configuration.java to CONFIG_FILES. Set ! LIBGCJDEBUG substitution if --enable-libgcj-debug is specified. ! Create `gnu' directory in the build tree. ! * gnu/classpath/Configuration.java.in: New file. ! ! 2000-11-24 Tom Tromey ! ! * prims.cc (_Jv_NewObjectArray): Use placement new to create ! array. ! (_Jv_NewPrimArray): Likewise. ! Include . ! * gcj/array.h (__JArray): `length' field now const. Added ! constructor. ! (class JArray): Added constructor. ! ! 2000-11-23 Mark Wielaard ! ! * name-finder.cc (lookup): Check for a NULL _Jv_argv before attempting ! lookup. ! ! 2000-11-23 Bryce McKinlay ! ! * java/util/Vector.java: Improve exception messages. ! (Vector): Check initialCapacity for IllegalArgumentException. ! (tromToSize): Don't check for elementCount == elementData.length ! case. ! (toArray): Don't try to set null marker if target array is the same ! length as the vector. ! ! 2000-11-22 Bryce McKinlay ! ! * Makefile.in: Rebuilt. ! * Makefile.am (core_java_source_files): Added Collections.java. ! * java/util/List.java: Merged from classpath. ! * java/util/Vector.java: Ditto. ! * java/util/Collections.java: From classpath. ! * java/util/ArrayList.java (addAll(Collection)): Call ! addAll(int,Collection) instead of duplicating code. ! (indexOf): Clean up int initialization. ! (clear): Set cleared array entries to null, to allow garbage ! collection. ! * java/util/List.java: Minor formatting fixes. ! * java/util/SimpleTimeZone.java: ditto. ! ! 2000-11-18 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (core_java_source_files): Added new files. ! * java/lang/reflect/ReflectPermission.java: New class. ! * java/io/FileFilter.java: From Classpath ! * java/io/FilePermission.java: From Classpath. ! ! 2000-11-17 Tom Tromey ! ! * java/lang/reflect/AccessibleObject.java (isAccessible, ! setAccessible): Now public. ! ! * java/lang/natString.cc: Include Locale.h. ! (toUpperCase): Added `locale' argument. Handle locale ! sensitivity. ! (toLowerCase): Added `locale' argument. Handle locale ! sensitivity. ! (ESSET, CAPITAL_S, SMALL_I, CAPITAL_I_WITH_DOT, SMALL_DOTLESS_I, ! CAPITAL_I): New defines. ! * java/lang/String.java (CASE_INSENSITIVE_ORDER): Now public and ! final. ! Import Locale. ! (toUpperCase, toLowerCase): New methods. Variants which accept ! locale now native. ! ! * java/lang/ExceptionInInitializerError.java (printStackTrace): ! New methods. ! ! * java/util/PropertyPermission.java: Re-merged from Classpath. ! ! * java/text/RuleBasedCollator.java (getCollationElementIterator): ! New method. ! * java/text/StringCharacterIterator.java: Reindented. ! (setText): New method. ! ! 2000-11-17 Mark Wielaard ! ! Merge with Classpath (changes by Bryce McKinlay) ! * java/util/jar/*.java: Reformat all to unofficial standard coding ! style. No changes of substance. ! ! 2000-11-17 Mark Wielaard ! ! * java/util/zip/*.java: Javadoc updates. ! ! 2000-11-17 Tom Tromey ! ! * java/text/CollationKey.java: Implement Comparable. ! (compareTo(Object)): New method. ! * java/text/Collator.java (compare(Object,Object)): New method. ! Implement Comparator. ! ! * java/util/zip/InflaterInputStream.java (available): New method. ! (close): New method. ! (read, available, skip, fill): Throw exception if stream closed. ! * java/util/zip/ZipInputStream.java (read, skip, readFully, fill, ! getNextEntry): Throw exception if closed. ! ! 2000-11-16 Tom Tromey ! ! * java/io/PushbackReader.java: Merged with Classpath. ! * java/util/Arrays.java: Updated from Classpath. ! ! * scripts/blocks.pl: New file. ! * java/lang/Character.java (Subset): New class. ! (UnicodeBlock): New class. ! ! * java/lang/Math.java (toDegrees, toRadians): New methods. ! ! * java/lang/Float.java: Implement Comparable. ! (compareTo): New methods. ! * java/lang/Double.java: Implement Comparable. ! (compareTo): New methods. ! ! 2000-11-16 Warren Levy ! ! * java/beans/PropertyChangeSupport.java (propertyListeners): Made ! transient. ! (listeners): Made transient. ! (source): Renamed from 'bean'. ! (children): New field for serialization. ! (propertyChangeSupportSerializedDataVersion): Ditto. ! (serialVersionUID): Ditto. ! (writeObject): New serialization method. ! (readObject): New serialization method. ! * java/beans/VetoableChangeSupport.java (propertyListeners): Made ! transient. ! (listeners): Made transient. ! (source): Renamed from 'bean'. ! (children): New field for serialization. ! (vetoableChangeSupportSerializedDataVersion): Ditto. ! (serialVersionUID): Ditto. ! (writeObject): New serialization method. ! (readObject): New serialization method. ! * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Fixed assert ! to allow constructor to have a return type (i.e. the class that the ! constructor constructs). ! ! 2000-11-14 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (libgcj.zip): Fail immediately if compilation fails ! and -k not given. ! ! 2000-11-02 Warren Levy ! ! * java/io/ObjectInputStream.java (readObject): Added code to ! conditionally dump out the serialized data. ! Handle ENDBLOCKDATA case a bit more gracefully since the current ! behavior doesn't seem to work as expected. ! (readStreamHeader): Added code for serialized data dumper. ! (readNextBlock): Ditto. ! (readFields): Ditto. ! (dump): New private static field for turning on/off dumper. ! (setDump): New native method. ! (dumpElement): New native method. ! (dumpElementln): New native method. ! * java/io/natObjectInputStream.cc (setDump): New method. ! (dumpElement): New method. ! (dumpElementln): New method. ! ! 2000-11-02 Warren Levy ! ! * java/net/InetAddress.java (addr): Renamed from 'address'. ! (address): New field to match Serialized Form doc. ! (hostName): Renamed from 'hostname' to match Serialized Form doc. ! (family): New serialization field. ! (serialVersionUID): New field. ! (readObject): New method. ! (writeObject): New method. ! (getFamily): New native method. ! (InetAddress): Set family. ! * java/net/natInetAddress.cc (getFamily): New method. ! (addr): Renamed from 'address'. ! (hostName): Renamed from 'hostname' to match Serialized Form doc. ! * java/net/natPlainDatagramSocketImpl.cc (addr): Renamed from 'address'. ! * java/net/natPlainSocketImpl.cc (addr): Renamed from 'address'. ! ! 2000-11-03 Bryce McKinlay ! ! * java/util/AbstractList.java (SubList): Make it a top-level private ! class. ! * java/util/LinkedList.java (remove): Do update modCount and knownMod. ! (add): Ditto. ! * Makefile.am (ordinary_java_source_files): Add LinkedList.java. ! * Makefile.in: Rebuilt. ! ! 2000-11-02 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (install-exec-hook): Make `.la' link, not `.so' ! link. ! ! 2000-11-02 Bryce McKinlay ! ! * java/util/AbstractList.java (remove): Comment out modCount increment ! to work around compiler bug. ! (add): Ditto. ! ! 2000-11-02 Bryce McKinlay ! ! * java/util/AbstractList.java: Throw messages with ! IndexOutOfBoundsExceptions. ! (listIterator()): Call listIterator(0). ! (size): New field. Initialize to size(). ! (hasNext): Test position against size, not size(). ! (remove): Increment knownMod by one instead of resetting it from ! modCount. ! (add): Ditto. ! (SubList.upMod): Removed. ! (SubList.set): Don't call upMod() or update knownMod. ! (SubList.add(int,Object)): Increment modCount instead of caling upMod(). ! (SubList.remove): Ditto. ! (SubList.addAll): Don't call backingList.size(). Increment size from ! c.size(). ! (SubList.iterator): New method. Call listIterator(0). ! (SubList.listIterator): New method. Restore code to return an anonymous ! listIterator implementation (with some changes). ! * java/util/AbstractSequentialList.java: Throw messages with ! IndexOutOfBoundsExceptions. ! (addAll): Add a specnote. ! * java/util/ArrayList.java (removeRange): Get the math right. ! (addAll): Increment modCount _before_ creating iterator. ! * java/util/LinkedList.java: Rewritten, mostly. ! ! 2000-11-01 Tom Tromey ! ! * scripts/encodings.pl: Added `ASCII' alias. ! * Makefile.in: Rebuilt. ! * Makefile.am (convert_source_files): Added new files. ! * gnu/gcj/convert/Input_ASCII.java: New file. ! * gnu/gcj/convert/Output_ASCII.java: New file. ! * gnu/gcj/convert/Output_8859_1.java (write): Use `?' to represent ! out-of-range characters. ! * gnu/gcj/convert/natIconv.cc (iconv_init): New method. ! (read): Swap bytes if required. Treat `count' as character count, ! not byte count. ! (write): Likewise. Also, handle case where iconv fails on a given ! character. ! (init): Put encoding into exception. ! * gnu/gcj/convert/IOConverter.java (iconv_byte_swap): New global. ! (static): Call iconv_init. Rebuilt alias list. ! (iconv_init): New private method. ! ! 2000-11-01 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (install-exec-hook): Only make a single symlink, and ! remove the destination before making the link. ! * configure: Rebuilt. ! * configure.in: Call AC_PROG_LN_S. ! ! 2000-10-31 Warren Levy ! ! * jni.cc: Added include of java/lang/ThreadGroup.h. ! * gcj/javaprims.h: Removed Replaceable and Resolvable from namespace ! per change of 2000-10-05. ! ! 2000-10-30 Bryce McKinlay ! ! * java/util/BitSet.java: Updated @specnote. ! ! * java/io/Reader.java: Merge docs from classpath. ! (skip): Synchronize on `lock'. ! * java/io/FileReader.java: Import correct implementation from ! classpath. ! * java/io/StringReader.java: Merge docs from classpath. ! (ready): Throw IOException if stream is closed. ! ! 2000-10-29 Bryce McKinlay ! ! * java/util/AbstractCollection.java (addAll): Use size() instead of ! hasNext() in iterator loop. ! (clear): Ditto. ! (contains): Ditto. Simplify loop. ! (containsAll): Ditto. ! (remove): Ditto. ! (removeAll): Ditto. ! (retainAll): Ditto. ! (toArray): Ditto. ! (toString): Ditto. Use string concatenation operators, not ! StringBuffer. ! * java/util/AbstractList.java (addAll): Use size() instead of ! hasNext() in iterator loop. ! (equals): Ditto. ! (hashCode): Ditto. ! (indexOf): Ditto. Don't take null check outside of the loop. ! (iterator): Return an AbstractListItr instead of anonymous class. ! (lastIndexOf): Use a for loop bounded by size() instead of ! hasPrevious() in iterator loop. ! (listIterator): Return an AbstractListItr. ! (removeRange): Remove bounds checking code and docs. ! (AbstractListItr): New inner class. Code moved here from ! listIterator(). ! (SubList.iterator): Removed. Use default implementation from ! AbstractList instead. ! (SubList.listIterator): As above. ! * java/util/AbstractMap.java (clear): Use a for loop bounded by size() ! instead of hasNext() in iterator loop. ! (containsValue): Ditto. ! (equals): Ditto. ! (get): Ditto. ! (put): Ditto. ! (putAll): Ditto. ! (remove): Ditto. ! (toString): Ditto. Use string concatenation operators, not ! StringBuffer. ! * java/util/AbstractSequentialList.java (addAll): Use a for loop ! bounded by size() instead of hasNext() in iterator loop. ! * java/util/AbstractSet.java (hashCode): Don't catch exception as ! part of normal execution flow. Do an explicit null check instead. ! * java/util/ArrayList.java (_iSize): Rename to `size'. ! (_arData): Rename to `data'. ! (get): Check lower bounds also. Simplify IndexOutOfBoundsException ! message. ! (remove): Ditto. ! (removeRange): Make protected. Don't check bounds. ! (add): Check lower bounds also. Simplify IndexOutOfBoundsException ! message. ! (addAll (Collection)): Use a size-bounded for loop instead of hasNext() ! check. ! (addAll (int, Collection)): Check lower bounds. Simplify exception ! string. ! (clone): Clone the data array too. ! (indexOf): Inline doesEqual(). ! (lastIndexOf): Ditto. ! (clear): Don't set array data to null. ! (set): Check lower bounds. Simplify exception string. ! (toArray): Correct comment. ! (trimToSize): Don't update modCount, this is not a structural change. ! Add comment. ! ! * java/util/BitSet.java: Merged with classpath, new JDK 1.2 methods ! implemented. ! (toString): Declare `bit' as long, not int. ! (data): Made package-private, not private. ! ! 2000-10-27 Warren Levy ! ! * java/util/natGregorianCalendar.cc (computeFields): Set the isSet__ ! array elements to true. ! ! 2000-10-27 Warren Levy ! ! * Makefile.am: Added locale files from Classpath. ! * Makefile.in: Rebuilt. ! * gnu/java/locale/Calendar.java: New file. ! * gnu/java/locale/Calendar_de.java: New file. ! * gnu/java/locale/Calendar_en.java: New file. ! * gnu/java/locale/Calendar_nl.java: New file. ! * java/lang/ClassNotFoundException.java: Replaced with Classpath file. ! * java/math/BigDecimal.java (intVal): Renamed from 'num' for ! serialization compatibility. ! (scale): Made private. ! (serialVersionUID): New field. ! * java/math/BigInteger.java (ival): Made transient. ! (words): Made transient. ! (bitCount): New serialization field. ! (bitLength): Ditto. ! (firstNonzeroByteNum): Ditto. ! (lowestSetBit): Ditto. ! (magnitude): Ditto. ! (signum): Ditto. ! (serialVersionUID): New field. ! (readObject): New method. ! (writeObject): New method. ! * java/util/BitSet.java (serialVersionUID): New field. ! * java/util/Calendar.java: Replaced with Classpath file. ! * java/util/GregorianCalendar.java (GregorianCalendar): Pass result ! of getDefault() for TimeZone or Locale instead of passing nulls. ! * java/util/Locale.java (serialVersionUID): New field. ! (writeObject): New method. ! (readObject): New method. ! * java/util/SimpleTimeZone.java: Replaced with Classpath file. ! ! 2000-10-25 Bryce McKinlay ! ! * Makefile.am (GCJCOMPILE): Pass --tag=GCJ to libtool. ! (core_java_source_files): Put java.lang, java.io, and java.util here. ! (ordinary_java_source_files): Order so that core_java_source_files are ! built first. ! (java_source_files): Reorder so that special_java_source_files are ! built first. ! * configure.in: Don't pass -I flag to gcj. ! * Makefile.in: Rebuilt. ! * configure: Rebuilt. ! ! 2000-10-25 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (install-exec-hook): New target. ! ! 2000-10-24 Bryce McKinlay ! ! * java/util/EventObject.java: Merged from classpath. ! ! * java/lang/ThreadGroup.java (uncaughtException): Print thread name ! with stack dump. ! ! 2000-10-23 Alexandre Petit-Bianco ! * java/util/AbstractSet.java (equals): Re-installed original code. ! 2000-10-22 Rolf W. Rasmussen ! * Makefile.am: Added rules for libgcjx library. ! * Makefile.in: Rebuilt. ! * configure.in: Added check for X. * configure: Rebuilt. ! * gnu/awt/LightweightRedirector.java: New file. ! * gnu/awt/j2d/AbstractGraphicsState.java: New file. ! * gnu/awt/j2d/DirectRasterGraphics.java: New file. ! * gnu/awt/j2d/Graphics2DImpl.java: New file. ! * gnu/awt/j2d/IntegerGraphicsState.java: New file. ! * gnu/awt/j2d/MappedRaster.java: New file. ! * gnu/awt/xlib/XCanvasPeer.java: New file. ! * gnu/awt/xlib/XEventLoop.java: New file. ! * gnu/awt/xlib/XEventQueue.java: New file. ! * gnu/awt/xlib/XFontMetrics.java: New file. ! * gnu/awt/xlib/XFramePeer.java: New file. ! * gnu/awt/xlib/XGraphics.java: New file. ! * gnu/awt/xlib/XGraphicsConfiguration.java: New file. ! * gnu/awt/xlib/XPanelPeer.java: New file. ! * gnu/awt/xlib/XToolkit.java: New file. ! * gnu/gcj/xlib/Clip.java: New file. ! * gnu/gcj/xlib/Colormap.java: New file. ! * gnu/gcj/xlib/Display.java: New file. ! * gnu/gcj/xlib/Drawable.java: New file. ! * gnu/gcj/xlib/Font.java: New file. ! * gnu/gcj/xlib/GC.java: New file. ! * gnu/gcj/xlib/Pixmap.java: New file. ! * gnu/gcj/xlib/Screen.java: New file. ! * gnu/gcj/xlib/Visual.java: New file. ! * gnu/gcj/xlib/WMSizeHints.java: New file. ! * gnu/gcj/xlib/Window.java: New file. ! * gnu/gcj/xlib/WindowAttributes.java: New file. ! * gnu/gcj/xlib/XAnyEvent.java: New file. ! * gnu/gcj/xlib/XButtonEvent.java: New file. ! * gnu/gcj/xlib/XColor.java: New file. ! * gnu/gcj/xlib/XConfigureEvent.java: New file. ! * gnu/gcj/xlib/XConnectException.java: New file. ! * gnu/gcj/xlib/XEvent.java: New file. ! * gnu/gcj/xlib/XException.java: New file. ! * gnu/gcj/xlib/XExposeEvent.java: New file. ! * gnu/gcj/xlib/XID.java: New file. ! * gnu/gcj/xlib/XImage.java: New file. ! * gnu/gcj/xlib/XUnmapEvent.java: New file. ! * gnu/gcj/xlib/natClip.cc: New file. ! * gnu/gcj/xlib/natColormap.cc: New file. ! * gnu/gcj/xlib/natDisplay.cc: New file. ! * gnu/gcj/xlib/natDrawable.cc: New file. ! * gnu/gcj/xlib/natFont.cc: New file. ! * gnu/gcj/xlib/natGC.cc: New file. ! * gnu/gcj/xlib/natPixmap.cc: New file. ! * gnu/gcj/xlib/natScreen.cc: New file. ! * gnu/gcj/xlib/natVisual.cc: New file. ! * gnu/gcj/xlib/natWMSizeHints.cc: New file. ! * gnu/gcj/xlib/natWindow.cc: New file. ! * gnu/gcj/xlib/natWindowAttributes.cc: New file. ! * gnu/gcj/xlib/natXAnyEvent.cc: New file. ! * gnu/gcj/xlib/natXButtonEvent.cc: New file. ! * gnu/gcj/xlib/natXColor.cc: New file. ! * gnu/gcj/xlib/natXConfigureEvent.cc: New file. ! * gnu/gcj/xlib/natXException.cc: New file. ! * gnu/gcj/xlib/natXExposeEvent.cc: New file. ! * gnu/gcj/xlib/natXImage.cc: New file. ! * gnu/gcj/xlib/natXUnmapEvent.cc: New file. ! * java/awt/EventDispatchThread.java: Start thead on creation. ! ! 2000-10-20 Tom Tromey ! ! From Arno J. Klaassen: ! * interpret.cc: Include for alloca. ! * defineclass.cc: Include for alloca. ! * Makefile.in: Rebuilt. ! * Makefile.am: Include deps.mk. ! (GCJCOMPILE): Added -MD, -MT, and -MF. ! ($(javao_files)): Don't depend on libgcj.zip. ! (all-recursive): New target. ! (%.lo:%.cc): Do dependency tracking. ! ($(nat_headers)): Don't depend on libgcj.zip. ! * configure: Rebuilt. ! * configure.in: Make .d files and deps.mk. ! ! 2000-10-13 Bryce McKinlay ! ! * exception.cc: Don't #include "exception". ! (_Jv_eh_alloc): Call abort (), not terminate (), if malloc fails. ! ! * Makefile.am (libgcj_la_LDFLAGS): Link in libsupc++. ! * Makefile.in: Updated. ! ! 2000-10-11 Bryce McKinlay ! ! * java/awt/peer/ChoicePeer.java (addItem): Removed. ! * java/awt/peer/ComponentPeer.java (disable): Removed. ! (enable): Removed. ! (hide): Removed. ! (minimumSize): Removed. ! (preferredSize): Removed. ! (reshape): Removed. ! (show): Removed. ! * java/awt/peer/ListPeer.java (addItem): Removed. ! (clear): Removed. ! (minimumSize): Removed. ! (preferredSize): Removed. ! (setMultipleSelections): Removed. ! * java/awt/peer/MenuBarPeer.java (add): Renamed from addMenu. ! (remove): Renamed from removeMenu. ! * java/awt/peer/MenuItemPeer.java (disable): Removed. ! (enable): Removed. ! * java/awt/peer/MenuPeer.java (add): Renamed from addItem. ! (remove): Renamed from removeItem. ! * java/awt/peer/TextAreaPeer.java (insertText): Removed. ! (getMinimumSize): Removed. ! (getPreferredSize): Removed. ! (minimumSize): Removed. ! (preferredSize): Removed. ! (replaceText): Removed. ! * java/awt/peer/TextFieldPeer.java (minimumSize): Removed. ! (preferredSize): Removed. ! (getMinimumSize): Removed. ! (getPreferredSize): Removed. ! (setEchoCharacter): Removed. ! ! 2000-10-10 Warren Levy ! ! * gnu/gcj/text/LocaleData_en.java (monetarySeparator): Added. ! * java/sql/Date.java (serialVersionUID): New field. ! * java/sql/Time.java (serialVersionUID): New field. ! * java/sql/Timestamp.java (serialVersionUID): New field. ! * java/text/ChoiceFormat.java (serialVersionUID): New field. ! * java/text/DateFormat.java (getDateTimeInstance (int)): Removed. ! * java/text/DateFormatSymbols.java (serialVersionUID): New field. ! * java/text/DecimalFormat.java (serialVersionOnStream): New field. ! (readObject): New serialization method. ! * java/text/DecimalFormatSymbols.java (monetarySeparator): New field. ! (serialVersionOnStream): New field. ! (readObject): New serialization method. ! (getMonetaryDecimalSeparator): New method. ! (setMonetaryDecimalSeparator): New method. ! * java/text/NumberFormat.java (maxFractionDigits): New field. ! (maxIntegerDigits): New field. ! (minFractionDigits): New field. ! (minIntegerDigits): New field. ! (serialVersionOnStream): New field. ! (serialVersionUID): New field. ! (readObject): New serialization method. ! (writeObject): New serialization method. ! * java/text/SimpleDateFormat.java (defaultCenturyStart): Initialized. ! (serialVersionOnStream): New field. ! (serialVersionUID): New field. ! (readObject): New serialization method. ! ! 2000-10-09 Alexandre Oliva ! ! * configure.in (GCJ): Avoid bogus error message when looking for ! (and not finding) gcj in the build tree. ! * configure: Rebuilt. ! ! 2000-10-09 Tom Tromey ! ! * configure: Rebuilt. ! * configure.in: Include sys/types.h when checking for socklen_t. ! From Arno J. Klaassen. ! ! 2000-10-09 Bryce McKinlay ! ! * include/jvm.h: Enable __builtin_expect(). ! ! * name-finder.cc (lookup): Don't trust dladdr() if the address is from ! the main program. Fix for PR libgcj/341. ! ! 2000-10-07 Tom Tromey ! ! * java/util/Properties.java: Merged with Classpath version. ! ! 2000-10-05 Tom Tromey ! ! * java/lang/reflect/natField.cc (BooleanClass): Don't define. ! * java/lang/reflect/natArray.cc (BooleanClass): Don't define. ! * java/lang/Class.h (Object): Added `class$' field. ! * java/lang/Object.h (Object): Added `class$' field. ! * defineclass.cc (ClassClass): Use `class$' form. ! (ClassObject): Likewise. ! * resolve.cc (ClassObject): Use `class$' form. ! (ObjectClass): Likewise. ! * interpret.cc (ClassError): Removed. ! * java/net/natPlainDatagramSocketImpl.cc (BooleanClass): Use ! `class$' form. ! (IntegerClass): Likewise. ! * java/net/natPlainSocketImpl.cc (BooleanClass): Use `class$' ! form. ! * java/lang/natClassLoader.cc (CloneableClass): Use `class$' form. ! (ObjectClass, ClassClass, VMClassLoaderClass, ClassLoaderClass, ! SerializableClass): Likewise. ! Include Serializable.h, Cloneable.h. ! * java/lang/natSystem.cc (SystemClass): Removed. ! (init_properties): Use `class$' form. ! * java/lang/natObject.cc (CloneableClass): Removed. ! (clone): Use `class$' form. ! * java/lang/natClass.cc (CloneableClass): Use `class$' form. ! (ObjectClass, ErrorClass, ClassClass, MethodClass, FieldClass, ! ConstructorClass): Likewise. ! * java/lang/reflect/natMethod.cc (ObjectClass): Use `class$' form. ! (ClassClass, VoidClass, ByteClass, ShortClass, CharacterClass, ! IntegerClass, LongClass, FloatClass, DoubleClass): Likewise. ! * java/io/natObjectInputStream.cc (ObjectClass): Use `class$' ! form. ! (ClassClass): Likewise. ! * include/jvm.h (StringClass): Use `class$' form. ! * prims.cc (ObjectClass): Removed. ! (_Jv_RunMain): Use `class$' form. ! (_Jv_AllocObject): Likewise. ! * jni.cc (ClassClass): Use `class$' form. ! (ThrowableClass): Likewise. ! (ObjectClass): Likewise. ! (MethodClass): Likewise. ! (ThreadGroupClass): Likewise. ! (NativeThreadClass): Likewise. ! * boehm.cc (ObjectClass): Removed. ! (ClassClass): Removed. ! (_Jv_MarkObj): Use `class$' form. ! * gcj/field.h (JvFieldIsRef): Use `class$' form. ! Include RawData.h. ! 2000-10-05 Warren Levy ! * Makefile.am: Removed java/io/Replaceable.java and ! java/io/Resolvable.java. * Makefile.in: Rebuilt. - * gcj/javaprims.h: Removed Replaceable and Resolvable from java.io - namespace. - * java/io/ObjectInputStream.java (processResolution): Fixed typo - in method name. - (processResolution): Handle readResolve method via reflection with - removal of Resolvable interface. - * java/io/ObjectOutputStream.java (writeObject): Handle writeReplace - method via reflection with removal of Replaceable interface. - * java/io/Replaceable.java: Removed. - * java/io/Resolvable.java: Removed. - * java/security/Key.java (serialVersionUID): New field. - * java/security/Provider.java (serialVersionUID): New field. - * java/security/interfaces/DSAPrivateKey.java (serialVersionUID): - New field. - * java/security/interfaces/DSAPublicKey.java (serialVersionUID): - New field. - * java/sql/DataTruncation.java (serialVersionUID): New field. - * java/sql/SQLException.java (serialVersionUID): New field. - * java/sql/SQLWarning.java (serialVersionUID): New field. - * java/util/Date.java (serialVersionUID): New field. - (millis): Made transient. - (readObject): New method. - (writeObject): New method. - - 2000-10-05 Tom Tromey - - * gnu/gcj/convert/natIconv.cc (init): Terminate buffer. - - 2000-10-02 Bryce McKinlay - - * prims.cc (_Jv_argv, _Jv_argc): New fields. - (JvRunMain): Set _Jv_argv and _Jv_argc. - * java/awt/Component.java: Minor fixes. - * java/awt/Image.java (UndefinedProperty): Initialize final field. - * java/awt/Toolkit.java (systemEventQueue): Removed. - (getDefaultToolkit): Default to "gnu.awt.gtk.GtkToolkit". - * java/awt/Window.java (getToolkit): Don't call super. - * java/awt/image/BufferedImage.java: Fix definate assignment errors. - * java/awt/peer/ContainerPeer.java (insets): Remove unused method. - * gnu/awt/gtk/GtkComponentPeer.java: New file. - * gnu/awt/gtk/GtkContainerPeer.java: New file. - * gnu/awt/gtk/GtkFramePeer.java: New file. - * gnu/awt/gtk/GtkMainThread.java: New file. - * gnu/awt/gtk/GtkToolkit.java: New file. - * gnu/awt/gtk/GtkWindowPeer.java: New file. - * gnu/awt/gtk/gtkcommon.cc: New file. - * gnu/awt/gtk/gtkcommon.h: New file. - * gnu/awt/gtk/natGtkComponentPeer.cc: New file. - * gnu/awt/gtk/natGtkContainerPeer.cc: New file. - * gnu/awt/gtk/natGtkFramePeer.cc: New file. - * gnu/awt/gtk/natGtkMainThread.cc: New file. - * gnu/awt/gtk/natGtkToolkit.cc: New file. - * gnu/awt/gtk/natGtkWindowPeer.cc: New file. ! 2000-09-30 Tom Tromey ! ! * posix-threads.cc (_Jv_CondWait): Check to see if we are ! interrupted before modifying the cv's wait set. ! From Corey Minyard. ! ! 2000-09-30 Hans Boehm ! Bryce McKinlay ! ! Implement bitmap descriptor based marking for Boehm GC. ! * configure.in: Define JC1GCSPEC. Set it if boehm-gc is used. * configure: Rebuilt. ! * libgcj.spec.in: Pass JC1GCSPEC to jc1. ! * include/jvm.h (struct _Jv_VTable): New field `gc_descr'. New inline ! method get_finalizer(). ! (struct _Jv_ArrayVTable): Ditto. Declare method array with ! NUM_OBJECT_METHODS elements instead of NUM_OBJECT_METHODS + 1. ! (_Jv_AllocObj): Add new jclass parameter. ! (_Jv_AllocArray): Ditto. ! (_Jv_BuildGCDescr): New prototype. ! * prims.cc (_Jv_AllocObject): Rename parameter `c' to `klass'. Pass ! `klass' to _Jv_AllocObj. Don't set the new object's vtable. Use ! get_finalizer() instead of direct finalizer vtable offset. ! (_Jv_NewObjectArray): Rename parameter `clas' to `klass'. Pass ! `klass' to _Jv_AllocArray. Don't set the new array's vtable. ! (_Jv_NewPrimArray): Call _Jv_FindArrayClass before _Jv_AllocObj. Pass ! `klass' to _Jv_AllocObj. Don't set the new array's vtable. ! * resolve.cc (METHOD_NOT_THERE, METHOD_INACCESSIBLE): New #defines. ! (_Jv_ResolvePoolEntry): Use METHOD_NOT_THERE and METHOD_INACCESSIBLE. ! (_Jv_DetermineVTableIndex): Ditto. ! (_Jv_PrepareClass): Ditto. Remove offset-by-one adjustments from vtable ! calculations to account for new gc_descr field. ! * boehm.cc: #include gc_gcj.h. ! (obj_kind_x, obj_free_list): `#if 0'-ed away. ! (_Jv_MarkObj): Check that vtable doesn't point to a cleared object. ! New commentary from HB. Mark the classes vtable. ! (_Jv_MarkArray): Check that vtable doesn't point to a cleared object. ! (GC_DEFAULT_DESCR): New #define. ! (_Jv_BuildGCDescr): New function. Use GC_DEFAULT_DESCR, for now. ! (_Jv_AllocObj): New parameter `klass'. Use GC_GCJ_MALLOC (). ! (_Jv_AllocArray): New parameter `klass'. Allocate with GC_MALLOC and ! scan conservativly if size is less than min_heap_addr. Set vtable ! pointer of new object before returning. ! (_Jv_AllocBytes): Use GC_MALLOC_ATOMIC, not GC_GENERIC_MALLOC. ! (_Jv_InitGC): Call GC_init_gcj_malloc(). Don't set up marking and ! allocation for obj_kind_x. ! * nogc.cc (_Jv_BuildGCDescr): New function. Return 0. ! (_Jv_AllocObj): Set vtable on returned object. ! (_Jv_AllocArray): Ditto. ! * java/lang/Class.h (_Jv_NewObjectArray): No longer a friend. ! (_Jv_NewPrimArray): Ditto. ! (_Jv_AllocObj): Declare as a friend. ! (_Jv_AllocArray): Ditto. ! * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Copy gc_descr ! from &ObjectClass into new array class. Remove offset-by-one ! adjustments from `method' size calculations to account for gc_descr ! field. ! ! 2000-09-26 Tom Tromey ! ! * java/awt/Scrollbar.java (removeAdjustmentListener): Use ! `remove', not `add'. ! ! 2000-09-26 Alexandre Petit-Bianco ! ! * java/lang/natSystem.cc (file_encoding): Added return statement. ! 2000-09-14 Alexandre Oliva ! * Makefile.am: Re-work shell commands that exceeded command-line ! length limits. * Makefile.in: Rebuilt. ! * java/lang/natRuntime.cc (lt_preloaded_symbols): Define as `extern'. ! ! * defineclass.cc: Include alloca.h only if HAVE_ALLOCA_H. ! * java/lang/natDouble.cc: Likewise. ! * java/lang/reflect/natMethod.cc: Likewise. ! * interpret.cc: Likewise. Fix NULLCHECKs that tested a _Jv_word. ! ! 2000-09-13 Alexandre Oliva ! ! * configure.in (LIBDATASTARTSPEC): Use `%s' to search for ! libgcjdata.a. ! (GCJ): Support single-tree builds. Add -B`pwd`/ and -I$srcdir. ! * acinclude.m4: Arrange for automake to not bring in a new ! libtool.m4 for LT_AC_PROG_GCJ. AC_SUBST GCJ. ! * Makefile.am: Leave it up to automake to subst GCJ. ! * aclocal.m4, configure, Makefile.in: Rebuilt. ! ! 2000-09-13 Tom Tromey ! ! * java/lang/reflect/natArray.cc (BooleanClass): New define. ! (get): Ensure Boolean class is initialized. ! * java/lang/reflect/natField.cc (BooleanClass): New define. ! (get): Ensure Boolean class is initialized. ! ! 2000-09-13 Bryce McKinlay ! ! * java/lang/String.java (CASE_INSENSITIVE_ORDER): New static field. ! Initialize with anonymous class. ! (compareToIgnoreCase): New method. ! ! * java/lang/ThreadGroup.java (had_uncaught_exception): New field. ! (uncaughtException): Set had_uncaught_exception. ! * prims.cc (JvRunMain): Check value of had_uncaught_exception and ! exit with error status if set. ! (_Jv_RunMain): Ditto. ! ! 2000-09-12 Alexandre Oliva ! * configure: Rebuilt with new ../libtool.m4. ! 2000-09-11 Tom Tromey ! * java/lang/reflect/Field.java (toString): Don't rely on ! Class.toString. ! 2000-09-08 Tom Tromey ! * gnu/gcj/convert/BytesToUnicode.java (getDefaultDecoder): Let ! default decoder use iconv. ! * gnu/gcj/convert/UnicodeToBytes.java (getDefaultEncoder): ! Let default encoder use iconv. * configure: Rebuilt. ! * configure.in: Check for nl_langinfo and . ! * java/lang/natSystem.cc (file_encoding): New function. ! (DEFAULT_FILE_ENCODING): Define to file_encoding() if possible. ! ! 2000-09-10 Alexandre Oliva ! ! * acinclude.m4: Simplify the tests for CC and CXX. ! * aclocal.m4, configure: Rebuilt. ! ! * acinclude.m4: Include libtool macros from the source tree. ! * aclocal.m4, configure: Rebuilt. ! ! 2000-09-08 Warren Levy ! ! * java/beans/PropertyChangeEvent.java (serialVersionUID): Added. ! * java/beans/PropertyVetoException.java (serialVersionUID): Added. ! * java/io/File.java (writeObject): Added. ! (readObject): Added. ! (serialVersionUID): Added. ! * java/io/ObjectOutputStream.java (writeObject): Initialized ! fieldsAlreadyWritten before recursion rather than after. ! * java/io/ObjectStreamClass.java (serialVersionUID): Added. ! * java/io/OptionalDataException.java (serialVersionUID): Added. ! (OptionalDataException): Made package private. ! * java/io/SyncFailedException.java (SyncFailedException): Removed ! default constructor to match spec. ! * java/lang/Boolean.java (serialVersionUID): Added. ! * java/lang/Byte.java (serialVersionUID): Added. ! * java/lang/Character.java (serialVersionUID): Added. ! * java/lang/Double.java (serialVersionUID): Added. ! * java/lang/Float.java (serialVersionUID): Added. ! * java/lang/Integer.java (serialVersionUID): Added. ! * java/lang/Long.java (serialVersionUID): Added. ! * java/lang/Number.java (serialVersionUID): Added. ! * java/lang/Short.java (serialVersionUID): Added. ! * java/lang/String.java (serialVersionUID): Added. ! * java/lang/ThreadDeath.java (ThreadDeath): Removed constructor ! to match spec. ! * java/lang/reflect/InvocationTargetException.java ! (serialVersionUID): Added. ! * java/net/URL.java (handler): Made transient. ! (hashCode): Added field for serialization, per spec. and use ! cached value if available. ! (serialVersionUID): Added. ! (URL): Initialize hashCode. ! (set): Adjust hashCode. ! (readObject): New Method to initialize the protocol handler when ! deserializing. ! (writeObject): New method. ! * java/text/BreakIterator.java: Removed 'implements Serializable'. ! * java/text/Collator.java: Removed 'implements Serializable'. ! * java/util/GregorianCalendar.java (serialVersionUID): Added. ! * java/util/Properties.java (serialVersionUID): Added. ! * java/util/Random.java (serialVersionUID): Added. ! (seed): Made private. ! (nextNextGaussian): Made private. ! (haveNextNextGaussian): Made private. ! * java/util/Stack.java (serialVersionUID): Added. ! * java/util/TimeZone.java (serialVersionUID): Added. ! * java/util/Vector.java (serialVersionUID): Added. ! ! 2000-09-07 Bryce McKinlay ! ! * Makefile.am (Thread.h): Don't be friends with native threads ! functions. ! * Makefile.in: Rebuilt. ! * java/lang/Thread.java (interrupt_flag): Make package-private. ! ! 2000-09-06 Jeff Sturm ! ! * include/jvm.h (_Jv_HashCode): Cast object ptr to `unsigned long' ! to avoid long long division. ! ! 2000-09-06 Tom Tromey ! ! * java/lang/reflect/Constructor.java (toString): Use `getName' for ! parameter types. ! * java/lang/reflect/Method.java (toString): Use `getName' for ! return type. ! ! * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Accept null ! `args' if method takes no parameters. ! ! Fix for PR java.lang/339: ! * java/lang/natPosixProcess.cc (fail): New function. ! (cleanup): New function. ! (startProcess): Use them. Create pipe so child can communicate ! exec failure back to parent. ! ! 2000-09-05 Bryce McKinlay ! ! * java/net/natPlainDatagramSocketImpl.cc: Change various `JvThrow' ! calls to `throw'. ! (send): Undo last patch. Remove the label only. ! (mcastGrp): Ditto. ! * java/net/natPlainSocketImpl.cc: Change various `JvThrow' calls to ! `throw'. ! * java/net/natInetAdress.cc: Ditto. ! ! * java/net/natPlainDatagramSocketImpl.cc (mcastGrp): Fix typo. ! ! 2000-09-05 Tom Tromey ! ! * doc/cni.sgml: Updated from master copy. ! ! 2000-09-05 Bryce McKinlay ! ! * gnu/gcj/convert/natIconv.cc (read): Remove unused local. ! (write): Ditto. ! * gnu/gcj/runtime/FileDeleter.java (deleteOnExitNow): Check for null ! stack. Synchronize. ! * java/lang/fdlibm.h: #undef __P if previously defined. ! * java/lang/natSystem.cc (currentTimeMillis): Remove unused local. ! * java/net/natPlainDatagramSocketImpl.cc (send): Remove unreachable ! block. ! (mcastGrp): Ditto. ! ! 2000-09-04 Tom Tromey ! ! * java/util/zip/ZipFile.java (ZipFile): Delete file when opened in ! DELETE mode. ! ! 2000-09-04 Anthony Green ! ! Fix for PR java.io/203: ! * java/io/File.java (createTempFile): Obey directory argument. ! Use java.io.tmpdir if needed. Don't leave FileDescripators open. ! * java/lang/natSystem.cc (init_properties): Use TMPDIR environment ! variable to set java.io.tmpdir on non-WIN32 systems. ! ! 2000-09-04 Anthony Green ! ! * java/io/File.java (deleteOnExit): New method. ! * gnu/gcj/runtime/FileDeleter.java: New class. ! * java/lang/natRuntime.cc (exit): Call ! FileDeleter.deleteOnExitNow() ! * Makefile.am: Add FileDeleter.java. ! * Makefile.in: Rebuilt. ! ! 2000-09-02 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (GCJCOMPILE): Use -fclasspath, not the CLASSPATH ! environment variable. ! ! 2000-09-01 Andrew Haley ! ! * java/io/StreamTokenizer.java: Don't throw a ! NumberFormatException if a field is numeric as far as the ! StreamTokenizer is concerned but not as far as Double.valueOf() is ! concerned: return a zero instead. ! ! 2000-08-30 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (AM_CXXFLAGS): Added -fdollars-in-identifiers. ! ! 2000-08-28 Tom Tromey ! ! * gnu/gcj/awt/BitMaskExtent.java, gnu/gcj/awt/Buffers.java, ! gnu/gcj/awt/ComponentDataBlitOp.java, ! gnu/gcj/awt/GLightweightPeer.java, java/awt/Graphics2D.java, ! java/awt/RenderingHints.java, java/awt/color/ColorSpace.java, ! java/awt/color/ICC_ColorSpace.java, ! java/awt/color/ICC_Profile.java, ! java/awt/image/BufferedImage.java, java/awt/image/ColorModel.java, ! java/awt/image/ComponentColorModel.java, ! java/awt/image/ComponentSampleModel.java, ! java/awt/image/DataBuffer.java, ! java/awt/image/DataBufferByte.java, ! java/awt/image/DataBufferInt.java, ! java/awt/image/DataBufferUShort.java, ! java/awt/image/DirectColorModel.java, ! java/awt/image/IndexColorModel.java, ! java/awt/image/PackedColorModel.java, java/awt/image/Raster.java, ! java/awt/image/RasterOp.java, java/awt/image/SampleModel.java, ! java/awt/image/SinglePixelPackedSampleModel.java, ! java/awt/image/WritableRaster.java, java/util/zip/ZipFile.java: ! Removed Latin-1 copyright symbols. ! * java/util/zip/ZipFile.java: Indentation fixes. ! ! 2000-08-27 Mark Wielaard ! ! * java/util/zip/ZipFile.java: Implement OPEN_DELETE mode, new ! constructor, close can delete the file, finalize calls close. ! * java/util/jar/JarFile.java: Constructor that takes mode now ! calls super. ! ! 2000-08-27 Anthony Green ! ! * java/util/ArrayList.java, java/util/Timer.java, ! java/util/LinkedList.java, java/util/TimerTask.java, ! java/util/HashMap.java, java/util/AbstractMap.java, ! java/util/SortedMap.java, java/util/AbstractSequentialList.java, ! java/util/SortedSet.java: Imported from GNU Classpath. ! * Makefile.in: Rebuilt. ! * Makefile.am: Added new files. ! ! 2000-08-26 Anthony Green ! ! * Makefile.in: Rebuilt. ! * Makefile.am (java/lang/ClassLoader.h): Make _Jv_RunMain a ! friend. ! ! * prims.cc: Include ClassLoader.h. ! (_Jv_RunMain): When executing jar files, classpath must be the jar ! file only. Lose our reference to the system ClassLoader in order ! to get a new one with the correct classpath. ! * java/lang/natSystem.cc (init_properties): When executing a jar ! file, only use the jar file for java.class.path. ! ! * gnu/gcj/runtime/VMClassLoader.java: Use the canonical file name ! for bytecode archives. ! ! * gnu/gcj/runtime/FirstThread.java: Handle case where manifest ! exists, but not Main-Class. ! ! 2000-08-23 Mark Wielaard ! ! * java/util/zip/InflaterInputStream.java (read(byte[],int,int)): ! return -1 when fill() has no more data for the Inflater. ! ! 2000-08-23 Mark Wielaard ! ! * java/io/PrintWriter.java (print(String)): Don't catch IOException, ! write(String) already does. ! ! 2000-08-23 Alexandre Petit-Bianco ! ! * gnu/gcj/jni/NativeThread.java (NativeThread): Removed assignment ! to `alive_flag', call `init'. ! (init): New native method. ! * gnu/gcj/jni/natNativeThread.cc (init): New native method ! implementation. ! ! 2000-08-21 Mark Wielaard ! ! * Makefile.in: Rebuilt. ! * Makefile.am (java/lang/reflect/Constructor.h): Declare Class as ! a `friend class'. ! (java/lang/reflect/Field.h): Likewise. ! (java/lang/reflect/Method.h): Likewise. ! (gnu/gcj/runtime/VMClassLoader.h): Declare ClassLoader as a ! `friend class'. ! ! 2000-08-21 Tom Tromey ! ! * java/util/ResourceBundle.java (trySomeGetBundle): Removed ! debugging prints. ! ! Sun Aug 20 21:02:48 2000 Anthony Green ! ! * java/lang/natSystem.cc (init_properties): Change sourceware ! reference to sources.redhat.com. ! ! * include/java-props.h: Add _Jv_Jar_Class_Path. ! * prims.cc: Ditto. Set it from `gij -jar file' option. ! ! * java/lang/natSystem.cc (init_properties): Set java.class.path ! from ! {gij -jar file}:{CLASSPATH variable}:{-Djava.class.path= or .} ! ! * java/util/PropertyPermission.java: Import from GNU Classpath. ! * Makefile.in: Rebuilt. ! * Makefile.am: Add java/util/PropertyPermission.java. ! * java/lang/System.java: Add setProperty method. ! ! * gij.cc (main): Add -jar option to execute jar files. ! (help): Describe -jar option. ! * prims.cc (_Jv_RunMain): Add support for jar execution mode. ! * include/jvm.h: Add is_jar argument to _Jv_RunMain. ! * gnu/gcj/runtime/FirstThread.java (main): New method. ! ! * java/util/jar/Attributes.java: Correct comment spelling. ! ! 2000-08-20 Mark Wielaard ! ! * java/util/zip/Adler32.java: Make private variables really private ! * java/util/zip/CRC32.java: Make private variables really private ! * java/util/zip/CheckedInputStream.java: skip() could skip to much ! bytes ! * java/util/zip/InflaterInputStream.java: skip() could skip to ! much bytes ! * java/util/zip/ZipEntry.java: setCompressedSize() didn't check input ! * java/util/zip/ZipFile.java: size() new 1.2 method ! * java/util/zip/ZipInputStream.java: Use createZipEntry not new ! ZipEntry. since 1.2 available() always returns just 1 or 0 when ! closed ! ! Sun Aug 20 12:33:43 2000 Anthony Green ! ! * java/util/jar/JarFile.java: Don't call ! java.util.zip.ZipFile.getEntry twice. From Mark Wielaard ! . ! ! Sun Aug 20 09:51:48 2000 Anthony Green ! ! * java/net/URLClassLoader.java: Find the JarEntry via the JarFile. ! Read the entire contents of the class file, not just what is ! available(). ! ! * java/net/JarURLConnection.java: getEntry doesn't take any ! arguments. Return null if element is null. ! ! * java/util/zip/ZipFile.java (getInputStream): Read the compressed ! size from the archive, not the inflated size. ! ! * java/util/jar/JarFile.java (getEntry): Don't recurse. Call ! java.util.zip.ZipFile.getEntry. ! ! * gij.cc (help): Change sourceware reference to ! sources.redhat.com. ! ! 2000-08-19 Tom Tromey ! ! * java/util/zip/ZipInputStream.java (createZipEntry): ! Implemented. ! ! Sat Aug 19 11:00:53 2000 Anthony Green ! ! * java/util/jar/Attributes.java, java/util/jar/JarEntry.java, ! java/util/jar/JarException.java, java/util/jar/JarFile.java, ! java/util/jar/JarInputStream.java, ! java/util/jar/JarOutputStream.java, java/util/jar/Manifest.java, ! java/util/Set.java, java/util/Map.java, java/util/Bucket.java, ! java/util/AbstractSet.java, java/util/BasicMapEntry.java, ! java/security/cert/CRL.java, java/security/cert/CRLException.java, ! java/security/cert/Certificate.java, ! java/security/cert/CertificateEncodingException.java, ! java/security/cert/CertificateException.java, ! java/security/cert/CertificateExpiredException.java, ! java/security/cert/CertificateFactory.java, ! java/security/cert/CertificateFactorySpi.java, ! java/security/cert/CertificateNotYetValidException.java, ! java/security/cert/CertificateParsingException.java, ! java/security/cert/X509CRL.java, ! java/security/cert/X509CRLEntry.java, ! java/security/cert/X509Certificate.java, ! java/security/cert/X509Extension.java: Imported from Classpath. ! * java/util/Hashtable.java: Imported from Classpath. ! ! * java/util/zip/ZipInputStream.java: Create stub for ! createZipEntry. ! ! * gcj/javaprims.h: Updated class list. ! ! * Makefile.in, gcj/Makefile.in: Rebuilt. ! * Makefile.am (ordinary_java_source_files): Add these new classes. ! ! 2000-08-16 Rolf W. Rasmussen ! * gnu/gcj/awt/ComponentDataBlitOp.java: New file. ! * gnu/gcj/awt/GLightweightPeer.java: New file. ! * java/awt/BorderLayout.java: Implemented all methods. ! * java/awt/Button.java (actionListener, actionCommand): Renamed ! and modifier change. ! (addNotify): Call super. ! (dispatchEventImpl): New method. ! (getListeners): New method. ! (label): Made package-private, not private. ! * java/awt/Canvas.java: Implemented class body. ! * java/awt/Color.java (brighter): New method. ! (darker): New method. ! (hashCode): New method. ! * java/awt/Component.java (visible, enabled, eventMask): Set defaults. ! (getGraphicsConfiguration): Delegate to ! getGraphicsConfigurationImpl(). ! (getGraphicsConfigurationImpl): New method. ! (getToolkit): Only return value from peer if not null. ! (isDisplayable): Check with parent. ! (isShowing): No parent implies not showing. ! (getForeground): Check parent property if local is null. ! (getBackground): Likewise. ! (getFont): Likewise. ! (setForeground): Inform peer. ! (setBackground): Likewise ! (setLocale): Invalidate component. ! (getColorModel): Implemented. ! (setLocation): Invalidate, or ignore if no change. ! (setSize): Invalidate, or ignore if no change. ! (setBounds): Invalidate, or ignore if no change. ! (isOpaque): By default, heavyweight implies opaque. ! (isLightweight): Implemented. ! (getMaximumSize): Implemented. ! (doLayout): Implemented, NOP. ! (validate): Implemented, NOP. ! (invalidate): Only propagate to parent if parent was valid. ! (getGraphics): Implemented. ! (getFontMetrics): Implemented. ! (update): Implemented. ! (paintAll): Implemented. ! (repaint): Implemented all repaint methods. ! (print): Implemented. ! (printAll): Implemented. ! (createImage): Implemented. ! (dispatchEvent): Give the peer a chance to handle the event. ! (dispatchEventImpl): Dispatch paint events. ! (enableEvents): Lightweights enable events on parent component. ! (coalesceEvents): Coalesce paint events, and select event type ! using a switch. ! (coalescePaintEvents): New method. ! (processEvent): Fix unfortunate ordering of statements, and call ! correct method for MOUSE_CLICKED. ! (processPaintEvent): New method. ! (addNotify): Allow container to notify children before event ! mask is set in peer. ! (addNotifyContainerChildren): New method. ! (removeNotify): Visibility should not change on removeNotify. ! (paramString): Implemented. ! (list): Implemented two of the list methods. ! * Container (myInsets): Removed, insets are managed by peer. ! (getInsets): Query peer. ! (addImpl): Fix reparenting, enable events for lightweights, ! initialize component array. ! (validate): Call doLayout in validateTree() instead. ! (validateTree): Do nothing if already valid. Call beginValidate(), ! endValidate() on peer. Call validateTree() instead of validate() ! for children that are containers. Mark valid after validation of ! children. ! (setFont): Partial implementation. ! (paint): Implemented. ! (visitChildren): New method. ! (visitChild): New method. ! (update): Implemented. ! (print): Implemented. ! (paintComponents): Implemented. ! (printComponents): Consider translation and clipping. ! (getComponentAt): Ignore invisible children. Return this if no ! child match. ! (addNotify): Call super. ! (addNotifyContainerChildren): New method. ! (paramString): Implemented. ! (list): Implemented. ! * java/awt/EventQueue (invokeAndWait): Get system event queue the ! right way. ! (invokeLater): Likewise. ! (isDispatchThread): Likewise. ! * java/awt/FontMetrics (getLeading): Formula change. ! (getDescent): Consider leading also. ! (getMaxAscent): Default to getAscent(). ! (getMaxDescent): Default to getDescent. ! (getMaxAdvance): Return value signifying unknown. ! (charWidth): Both methods implemented. ! (charsWidth): Implemented. ! (bytesWidth): Implemented. ! (getWidths): Implemented. ! * java/awt/Frame.java (NORMAL, ICONIFIED, iconImage, isResizable, ! state): New fields. ! (Frame): Rearragend constuctor chaining to disallow null being ! passed as a graphics configuration. ! (getTitle): Return empty string if null. ! (dispose): Removed. ! (getIconImage): New method. ! (setIconImage): New method. ! (finalize): New method. ! (setMenuBar): Notify peer. ! (isResizable): New method. ! (setResizable): New method. ! (getState): New method. ! (getFont): Removed. ! (remove): Implemented. ! (removeNotify): New method. ! (getFrames): New method. ! * java/awt/Graphics.java: Implemented body of class. ! * java/awt/Graphics2D.java: New file. ! * java/awt/GraphicsConfiguration.java: Enabled part of the API. ! * java/awt/Image.java: Implemented body of class. ! * java/awt/Panel.java (Panel): Call correct super constructor. ! (addNotify): Implemented. ! * java/awt/Rectangle.java (isEmpty): Fixed reversed logic. ! * java/awt/RenderingHints.java: New file. ! * java/awt/Toolkit.java (createComponent): Implemented. ! (getSystemEventQueue): Delegate to getSystemEventQueueImpl(). ! * java/awt/Window.java (Window): Two new constructors. Reordered ! constructor chaining. ! (getGraphicsConfigurationImpl): New method. ! (finalize): Call super. ! (addNotify): Call super. ! (pack): Do layout stuff. ! (show): Ensure that peer exists and that component is valid. ! (dispose): Dispose owned children. ! (getOwner): Simplify code, casting null pointers is valid. ! (getGraphicsConfiguration): Ask peer if local value is null. ! * java/awt/event/ActionEvent.java (getActionCommand): Renamed from ! getcmd(). ! * java/awt/image/BufferedImage.java: New file. ! * java/awt/image/RasterOp.java: New file. ! * java/awt/peer/ComponentPeer.java (getGraphicsConfiguration): ! More powerfull replacement for getColorModel(). ! (getColorModel) Removed. ! (setEventMask) New method. ! * Makefile.am: Added new files. * Makefile.in: Rebuilt. ! 2000-08-15 Alexandre Petit-Bianco ! * java/lang/natClass.cc (finit_name): Initialized with `finit$'. ! (finit_leg_name): New global. ! (java::lang::Class::getDeclaredMethods): Test for `finit$' or ! `$finit$'. This is a backward compatibility hack. ! (java::lang::Class::_getMethods): Likewise. ! 2000-08-15 Andrew Haley ! * include/jvm.h (_Jv_HashCode): New hash code. ! 2000-08-15 Tom Tromey ! * java/io/ByteArrayOutputStream.java: Merged with Classpath. ! Sun Aug 13 19:53:01 2000 Anthony Green ! * THANKS: More thanks. ! 2000-08-10 Tom Tromey ! * java/net/natPlainSocketImpl.cc (bind): Don't go to error case ! when errno not set. ! (connect): Likewise. (accept): Likewise. ! (getOption): Likewise. ! * java/net/natPlainDatagramSocketImpl.cc (bind): Don't go to error ! case when errno not set. ! (peek): Likewise. ! (send): Likewise. ! (receive): Likewise. ! (mcastGrp): Likewise. ! (setOption): Likewise. ! (getOption): Likewise. ! ! 2000-08-10 Bryce McKinlay ! John Stracke ! ! * gnu/gcj/protocol/http/Connection.java (gotHeaders): Removed. ! (connect): Don't falsely claim HTTP/1.1 compliance. Call ! getHttpHeaders(). ! (disconnect): Don't unset connected flag. ! (getHeaderField (String)): Call connect() if not connected. ! (getHeaderField (int)): Ditto. ! (getHeaderFieldKey): Ditto. ! (getHttpHeaders): Don't call connect(). ! * java/net/HttpURLConnection.java (instanceFollowRedirects, ! gotResponseVals): New fields. ! (getResponseCode): Call getResponseVals() conditionally. ! (getResponseMessage): Ditto. ! (getResponseVals): Call connect(). Don't throw FileNotFoundException. ! ! 2000-08-09 Bryce McKinlay ! ! * Makefile.am: Move beans and applet classes to awt_java_source_files. ! * Makefile.in: Rebuilt. ! * java/awt/Color.java (getTransparency): New method. ! * java/awt/Component.java: Various updates. ! * java/awt/Container.java (removeNotify): Call super.removeNotify() ! after dealing with children. ! * java/awt/Toolkit.java (changeSupport): Renamed from pcsupport. ! * java/awt/Window.java: Various new methods and updates. ! * java/awt/color/ICC_Profile.java (getNumComponents): Cast profileID ! to int for switch. ! * java/awt/event/KeyEvent.java (paramString): Initialize `r'. ! * java/awt/event/WindowEvent.java (paramString): Ditto. ! * java/awt/geom/Dimension2D.java (clone): Wrap super call with ! try/catch block. ! * java/awt/geom/Point2D.java (clone): Ditto. ! * java/awt/geom/RectangularShape.java (clone): Ditto. ! * java/awt/image/ColorModel.java (bits, cspace, transparency, hasAlpha, ! isAlphaPremultiplied): Make package-private, not private. ! ! 2000-08-08 Tom Tromey ! ! * gnu/gcj/convert/Input_UTF8.java (read): Fixed handling of ! surrogate characters. ! * gnu/gcj/convert/Output_UTF8.java (standardUTF8): Default to ! true. ! (write): Correct handling of surrogate characters. ! ! 2000-08-07 Tom Tromey ! ! * java/lang/reflect/Method.java (hashCode): Use getName(). ! (toString): Likewise. ! * java/lang/reflect/natMethod.cc (getType): Initialize ! exception_types. ! ! * java/lang/reflect/Method.java (toString): Use Class.getName, not ! Class.toString. ! * java/lang/reflect/Field.java (toString): Correct formatting. ! From Corey Minyard. ! ! * java/io/PipedInputStream.java (read(byte[],int,int)): Mostly ! rewrote. ! (receive): Streamlined. ! ! 2000-08-05 Tom Tromey ! ! * java/io/PrintWriter.java: Merged comments from Classpath. ! (printlnUnsynchronized): Removed. ! (println()): Print the separator. ! (println): Call println(), not printlnUnsynchronized. ! (out): Now protected, to match spec. ! ! 2000-08-04 Tom Tromey ! ! * java/io/StreamTokenizer.java (TT_NONE): Now private. ! (nextToken): Handle backslashed newline. From Oskar Liljeblad. ! For PR java.io/301. ! ! 2000-08-03 Warren Levy ! ! * java/io/ObjectInputStream.java (readFields): Turn off ! readDataFromBlock while reading via GetField. ! (GetField$1.get(String, Object)): Pass Class of default value to ! getField. ! (getField): Allow for null default values. ! ! * java/io/ObjectOutputStream.java: Fixed typo in comment. ! (PutField$1.put): Fixed calls of checkType in most of the put ! methods to pass the correct parameter. ! (PutField$1.put(String, Object)): Allow for null value arg. ! (PutField$1.write): Turn off writeDataAsBlocks while writing via ! PutField. ! ! * java/io/ObjectStreamClass.java (serialPersistentFields): Fixed ! typo in spec'ed field name. ! (getSerialPersistentFields): Changed spelling of method to match ! the correct spelling of the spec'ed field name. ! ! 2000-08-03 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new files. ! ! 2000-08-03 Bryce McKinlay ! ! * Makefile.am: Add new AWT stubs. ! * java/awt/Canvas.java: New placeholder class. ! * java/awt/Checkbox.java: Ditto. ! * java/awt/CheckboxMenuItem.java: Ditto. ! * java/awt/Choice.java: Ditto. ! * java/awt/Dialog.java: Ditto. ! * java/awt/FileDialog.java: Ditto. ! * java/awt/List.java: Ditto. ! * java/awt/ScrollPane.java: Ditto. ! * java/awt/TextField.java: Ditto. ! * java/awt/datatransfer/Clipboard.java: Ditto. ! * java/awt/Component.java (treeLock): Now a static String. Add comment. ! * java/awt/MenuItem.java (MenuItem): Add default constructor. ! * java/awt/Toolkit.java: Added all methods from J2SE 1.3 API docs. ! Some commented out. Partially implemented. ! * java/awt/natToolkit.cc: Removed file. ! ! 2000-08-03 Bryce McKinlay ! ! * Makefile.am: Make inner class CNI headers depend on libgcj.zip only. ! Fixes "make -j" builds. ! * Makefile.in: Rebuild. ! ! 2000-08-02 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (libgcj_la_SOURCES): Added posix.cc. ! * java/net/natPlainSocketImpl.cc: Include posix.h. ! (accept): Use _Jv_select. ! * java/net/natPlainDatagramSocketImpl.cc: Include posix.h. ! (receive): Use _Jv_select. ! * java/io/natFileDescriptorPosix.cc: Include posix.h. ! (available): Use _Jv_select. ! * java/lang/natSystem.cc: Include posix.h. ! (currentTimeMillis): Use _Jv_gettimeofday. ! * include/posix.h: New file. ! * posix.cc: New file. ! ! * scripts/encodings.pl: New file. ! * Makefile.in: Rebuilt. ! * Makefile.am (convert_source_files): Added IOConverter.java. ! * gnu/gcj/convert/UnicodeToBytes.java (UnicodeToBytes): Extend ! IOConverter. ! (getDefaultDecodingClass): Canonicalize default encoding name. ! (getEncoder): Likewise. ! * gnu/gcj/convert/BytesToUnicode.java (BytesToUnicode): Extend ! IOConverter. ! (getDefaultDecodingClass): Canonicalize default encoding name. ! (getDecoder): Likewise. ! * gnu/gcj/convert/IOConverter.java: New file. ! ! 2000-08-02 Bryce McKinlay ! ! * interpret.cc (_Jv_InterpMethod::continue1): Type of `fun' changed ! to match C declaration in ffi.h. ! * Makefile.am: Add java/awt/Button.java. ! * Makefile.in: Rebuilt. ! ! 2000-07-29 Alexandre Petit-Bianco ! ! * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Type of the ! cast of the second argument to `ffi_raw_call' changed to match ! prototype. ! ! 2000-07-26 Alexandre Petit-Bianco ! ! * jni.cc (_Jv_JNIMethod::call): Type of the cast of the second ! argument to `ffi_raw_call' changed to match prototype. ! ! 2000-07-31 Bryce McKinlay ! ! * java/awt/Component.java (toString): Implemented. ! * java/awt/Container.java (addImpl): Remove FIXME. Only call ! dispatchEvent() to dispatch the event. ! (removeImpl): Ditto. ! ! 2000-07-30 Anthony Green ! ! * java/awt/Component.java: Add treeLock object. ! (getTreeLock): Implement. ! (isShowing): Implement. ! ! 2000-07-30 Tom Tromey ! ! * java/awt/BorderLayout.java (BorderLayout()): New constructor. ! ! * java/awt/Frame.java (Frame): Pass `null' to Window constructor. ! ! * java/awt/Window.java (addNotify): Wrote. ! (addWindowListener): Wrote. ! (getLocale): Wrote. ! (getWarningString): Wrote. ! (processEvent): Wrote. ! (processWindowEvent): Wrote. ! (removeWindowListener): Wrote. ! (show): Call validate(), setVisible(). ! (toBack): Wrote. ! (toFront): Wrote. ! ! * java/awt/Toolkit.java (createWindow): Declare. ! ! * java/awt/Frame.java (addNotify): Use getToolkit to find ! toolkit. ! ! * java/awt/Component.java (invalidate): Wrote. ! (isValid): Wrote. ! (getToolkit): Wrote. ! ! * java/awt/Container.java (addContainerListener): Removed ! unnecessary cast. ! (removeContainerListener): Likewise. ! (addImpl): Wrote. ! (add(Component)): Use it. ! (add(String,Component)): Likewise. ! (add(Component,int)): Likewise. ! (add(Component,Object)): Likewise. ! (add(Component,Object,int)): Likewise. ! (doLayout): Wrote. ! (getAlignmentX): Wrote. ! (getAlignmentY): Wrote. ! (getComponentAt): Wrote. ! (getMaximumSize): Wrote. ! (invalidate): Wrote. ! (list(PrintStream,int)): Wrote. ! (list(PrintWriter,int)): Wrote. ! (getMinimumSize): Wrote. ! (getPreferredSize): Wrote. ! (printComponents): Wrote. ! (processContainerEvent): Look at containerListener, not ! componentListener. ! (remove): Added event processing and peer destruction. ! (removeAll): Use remove. ! (removeNotify): Wrote. ! (validate): Wrote. ! (validateTree): Wrote. ! ! * java/awt/Scrollbar.java (addNotify): Do nothing if peer exists. ! * java/awt/Label.java (addNotify): Do nothing if peer exists. ! * java/awt/Container.java (addNotify): Don't create Container ! peer. ! * java/awt/Button.java (addNotify): Do nothing if peer exists. ! ! 2000-07-30 Tom Tromey ! ! * java/awt/Container.java (remove(int)): Wrote. ! (remove(Component)): Wrote. ! (add(Component)): Wrote. ! (add(Component,int)): Wrote. ! (removeAll): Wrote. ! (addNotify): Set our own peer. ! * java/awt/Scrollbar.java (listeners): Changed type. ! (Scrollbar): Don't initialize listeners. ! (addNotify): Wrote. ! (setValue): Call setValues. ! (setMinimum): Likewise. ! (setMaxPriority): Likewise. ! (setVisibleAmount): Likewise. ! (setValues): Wrote. ! (setUnitIncrement): Forward to peer. ! (setLineIncrement): Call setUnitIncrement. ! (setPageIncrement): Call setBlockIncrement. ! (setBlockIncrement): Forward to peer. ! (addAdjustmentListener): Rewrote. ! (removeAdjustmentListener): Rewrote. ! (processAdjustmentEvent): Rewrote. ! (paramString): Wrote. ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added Button.java. ! * java/awt/Button.java: New file. ! * java/awt/Toolkit.java (createLabel): Declare. ! (createButton): Likewise. ! (createScrollbar): Likewise. ! (createContainer): Likewise. ! * java/awt/Label.java (addNotify): Wrote. ! (setAlignment): Call setAlignment in the peer. ! (setText): Call setText in the peer. ! ! 2000-07-28 Warren Levy ! ! * java/io/ObjectOutputStream.java (writeObject): Per spec, call ! NotSerializableException with just the class name. ! ! 2000-07-26 Andrew Haley ! ! * interpret.cc (continue1): Insert missing break into switch. ! ! 2000-07-28 Warren Levy ! ! * java/io/ObjectStreamException.java: Made constructors protected. ! ! 2000-07-27 Tom Tromey ! ! * java/io/OutputStreamWriter.java (close): Only flush if not ! closed. ! ! 2000-07-27 Warren Levy ! ! * mauve-libgcj: Activated serialization tests. ! * gcj/field.h (getModifiers): Mask off unknown flags. ! * gnu/java/security/provider/SHA.java (munch): Reset buffer to 0 so ! spurious bits don't cause discrepancies. ! * java/io/ObjectOutputStream.java: Fixed typo in comment. ! * java/io/ObjectStreamClass.java: Fixed typos in comments. ! (lookup): Applied patch from Brian Jones to optimize. ! (hasClassInitializer): Call getDeclaredMethod instead of getMethod. ! * java/lang/Throwable.java (serialVersionUID): New field. ! * java/lang/reflect/Modifier.java (ALL_FLAGS): Preserve STRICT if used. ! * java/lang/reflect/natConstructor.cc (getModifiers): Mask off ! unknown flags. ! * java/lang/reflect/natMethod.cc: Ditto. ! * java/security/Key.java (serialVersionUID): Removed field for now. ! * java/security/interfaces/DSAPrivateKey.java (serialVersionUID): Ditto. ! * java/security/interfaces/DSAPublicKey.java (serialVersionUID): Ditto. ! ! 2000-07-22 Tom Tromey ! ! * java/awt/geom/RectangularShape.java (getPathIterator): ! Wrote. ! ! 2000-07-23 Rolf W. Rasmussen ! ! * libjava/java/awt/image/ColorModel.java: New file, replaces the ! stub libjava/java/awt/ColorModel.java which was located in the ! wrong package. ! * libjava/java/awt/image/ComponentColorModel.java: New file. ! * libjava/java/awt/image/ComponentSampleModel.java: New file. ! * libjava/java/awt/image/DataBuffer.java: New file. ! * libjava/java/awt/image/DataBufferByte.java: New file. ! * libjava/java/awt/image/DataBufferInt.java: New file. ! * libjava/java/awt/image/DataBufferUShort.java: New file. ! * libjava/java/awt/image/DirectColorModel.java: New file. ! * libjava/java/awt/image/PackedColorModel.java: New file. ! * libjava/java/awt/image/Raster.java: New file. ! * libjava/java/awt/image/SampleModel.java: New file. ! * libjava/java/awt/image/SinglePixelPackedSampleModel.java: New ! file. ! * libjava/java/awt/image/IndexColorModel.java: New file. ! * libjava/java/awt/image/ImageConsumer.java: Removed import of ! java.awt.ColorModel stub. ! ! * gnu/gcj/util/BitMaskExtent.java: New file, utility class. ! * gnu/gcj/util/Buffers.java: New file, utility class. ! ! * libjava/Makefile.am: Updated to include new files. ! * libjava/Makefile.in: Rebuilt. ! ! 2000-07-23 Oskar Liljeblad ! ! * java/io/StreamTokenizer.java: Merged with classpath. ! ! 2000-07-20 Tom Tromey ! ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Updated for new files. ! * java/awt/Adjustable.java (HORIZONTAL, VERTICAL): Set values. ! * java/awt/Label.java: New file. ! * java/awt/Rectangle.java (Rectangle): Extend Rectangle2D. ! (createIntersection, createUnion, getBounds2D): New methods. ! * java/awt/Scrollbar.java: New file. ! * java/awt/Shape.java: Updated to 1.2. ! * java/awt/geom/AffineTransform.java: New file. ! * java/awt/geom/Ellipse2D.java: New file. ! * java/awt/geom/NoninvertibleTransformException.java: New file. ! * java/awt/geom/PathIterator.java: New file. ! * java/awt/geom/Rectangle2D.java: New file. ! * java/awt/geom/RectangularShape.java: New file. ! * java/awt/geom/Point2D.java (Double, Float): New inner classes. ! * java/awt/geom/IllegalPathStateException.java: New file. ! ! * scripts/showval.java: New file. ! ! * scripts/classes.pl (scan): Print inner classes properly. ! * gcj/javaprims.h: Updated class list. ! ! * java/lang/natClassLoader.cc (_Jv_PrepareCompiledClass): Only ! initialize String fields for interpreted classes. Fixes bug ! reported by Hans Boehm. ! ! * java/io/File.java (getParentFile): New method, from Classpath ! via Oskar Liljeblad. ! ! * java/util/Vector.java (remove(Object)): Implemented. ! ! 2000-07-19 Jeff Sturm ! ! * java/lang/natThrowable.cc (fillInStackTrace): Check for ! zero return from backtrace(). ! ! 2000-07-15 Bryce McKinlay ! ! * java/awt/EventQueue.java (invokeAndWait): Call postEvent() within ! synchronized block. ! * java/awt/event/InvocationEvent (dispatch): Synchronize on notifier ! before calling notifyAll(). ! ! 2000-07-13 Bryce McKinlay ! ! Add missing files from last check-in: ! * java/awt/image/ImageConsumer.java: New file. ! * java/awt/image/ImageProducer.java: New file. ! * java/awt/image/ImageObserver.java: New file. ! ! 2000-07-12 Bryce McKinlay ! ! Merged implementation of java.applet from classpath: ! * java/applet/Applet.java: New file. ! * java/applet/AppletContext.java: New file. ! * java/applet/AppletStub.java: New file. ! * java/applet/AudioClip.java: New file. ! ! * Makefile.am: Added new java.applet classes. ! * Makefile.in: Rebuilt. ! ! 2000-07-12 Bryce McKinlay ! ! AWT Stuff: ! * java/util/ResourceBundle.java (getLocale): stub. ! * Makefile.am: Added new AWT classes. ! * Makefile.in: Rebuilt. ! * java/awt/AWTEvent.java: Add EVENT_MASK constants, isConsumed, ! constructors. Fix toString() and paramString(). ! * java/awt/AWTEventMulticaster.java: New class. Implemented. ! * java/awt/CheckboxGroup.java: New class. ! * java/awt/ColorModel.java: New class. ! * java/awt/Component.java: Added stubs for most methods. Implemented ! event dispatch. ! * java/awt/Container.java: ditto. ! * java/awt/ComponentOrientation.java: New class. Partly implemented. ! * java/awt/Cursor.java: ditto. ! * java/awt/Event.java: Fix paramString(). ! * java/awt/EventQueue.java: New class. Implemented. ! * java/awt/Font.java: Added additional stub methods. Implemented ! toString(). ! * java/awt/FontMetrics.java: New class. Stubbed. ! * java/awt/GraphicsConfiguration.java: New class. Complete, except for ! Java2D parts. ! * java/awt/Insets.java: New class. Implemented. ! * java/awt/Menu.java: Add new methods. Partially implemented. ! * java/awt/MenuItem.java: Add new methods and fields. Partially ! implemented. ! * java/awt/MenuShortcut.java: New class. Implemented. ! * java/awt/Panel.java: New class. Placeholder. ! * java/awt/PopupMenu.java: New class. Stubbed. ! * java/awt/Rectangle.java: New class. Implemented. ! * java/awt/Toolkit.java: Added getSystemEventQueue() stub. ! * java/awt/event/ActionEvent.java: Implement paramString(). ! * java/awt/event/AdjustmentEvent.java: Implement paramString(). ! * java/awt/event/ComponentEvent.java: Implement paramString(). ! * java/awt/event/ContainerEvent.java: Implement paramString(). ! * java/awt/event/FocusEvent.java: Implement paramString(). ! * java/awt/event/HierarchyBoundsAdapter.java: New class. ! * java/awt/event/HierarchyBoundsListener.java: New class. ! * java/awt/event/HierarchyEvent.java: New class. ! * java/awt/event/HierarchyListener.java: New class. ! * java/awt/event/InputMethodEvent.java: Implement paramString(). ! * java/awt/event/InvocationEvent.java: Implement paramString(). Throw ! exception if !catchExceptions. ! * java/awt/event/ItemEvent.java: Implement paramString(). ! * java/awt/event/KeyEvent.java: Implement paramString(). ! * java/awt/event/MouseEvent.java: Implement paramString(). ! * java/awt/event/PaintEvent.java: Implement paramString(). ! * java/awt/event/TextEvent.java: Implement paramString(). ! * java/awt/event/WindowEvent.java: Implement paramString(). ! ! AWT Peer interfaces: ! * java/awt/peer/ButtonPeer.java: New file. ! * java/awt/peer/ListPeer.java: New file. ! * java/awt/peer/CanvasPeer.java: New file. ! * java/awt/peer/MenuBarPeer.java: New file. ! * java/awt/peer/CheckboxMenuItemPeer.java: New file. ! * java/awt/peer/MenuComponentPeer.java: New file. ! * java/awt/peer/CheckboxPeer.java: New file. ! * java/awt/peer/MenuItemPeer.java: New file. ! * java/awt/peer/ChoicePeer.java: New file. ! * java/awt/peer/MenuPeer.java: New file. ! * java/awt/peer/ComponentPeer.java: Implemented. ! * java/awt/peer/PanelPeer.java: New file. ! * java/awt/peer/ContainerPeer.java: Implemented. ! * java/awt/peer/PopupMenuPeer.java: New file. ! * java/awt/peer/DialogPeer.java: New file. ! * java/awt/peer/ScrollPanePeer.java: New file. ! * java/awt/peer/FileDialogPeer.java: New file. ! * java/awt/peer/ScrollbarPeer.java: New file. ! * java/awt/peer/FontPeer.java: New file. ! * java/awt/peer/TextAreaPeer.java: New file. ! * java/awt/peer/FramePeer.java: Implemented. ! * java/awt/peer/TextComponentPeer.java: New file. ! * java/awt/peer/LabelPeer.java: New file. ! * java/awt/peer/TextFieldPeer.java: New file. ! * java/awt/peer/LightweightPeer.java: New file. ! * java/awt/peer/WindowPeer.java: Implemented. ! ! 2000-07-06 Tom Tromey ! ! * java/lang/natClassLoader.cc (_Jv_PrepareCompiledClass): ! Initialize static final String fields. ! ! 2000-07-03 Tom Tromey ! ! * java/io/PrintWriter.java (print): Call write(String), not ! print(String). See PR libgcj/277. ! (print(String)): Use write, not out.write. ! ! 2000-06-30 Tom Tromey ! ! * include/jni.h: Include . Fixes PR libgcj/270. ! ! 2000-06-27 Andrew Haley ! ! * java/io/File.java (createTempFile): Close the FileDescriptor ! used to create a temp file. Fixes some of PR 203. ! * java/io/natFileDescriptorPosix.cc (open): Call garbage ! collection if we run out of file handles. ! ! 2000-06-28 Warren Levy ! ! * gnu/java/security/provider/Gnu.java: New file. ! * gnu/java/security/provider/SHA.java: New file. ! * gnu/java/security/provider/SHA1PRNG.java: New file. ! * Makefile.am: Added the above files. ! * Makefile.in: Rebuilt. ! ! * java/io/ObjectStreamClass.java (setUID): Use Gnu SHA instead of SHS. ! ! 2000-06-28 Bryce McKinlay ! ! * java/lang/ThreadGroup.java: Added synchronized flag to many methods. ! (destroyed_flag): Removed. ! (isDestroyed, removeGroup, removeThread): Test for parent == null. ! (activeCount): Added spec note. ! ! 2000-06-27 Warren Levy ! ! * java/security/Principal.java: New file. ! * Makefile.am: Added Principal.java. ! * Makefile.in: Rebuilt. ! ! 2000-06-27 Rolf W. Rasmussen ! ! * java/awt/event/MouseEvent.java: Fixed coordinate space ! confusion. ! ! 2000-06-27 Tom Tromey ! ! * java/io/PushbackInputStream.java (read): If there are characters ! in the buffer, don't also call super.read(). ! * java/io/PushbackReader.java (read): If there are characters in ! the buffer, don't also call super.read(). ! ! * java/lang/Double.java (valueOf): Call parseDouble(). ! 2000-06-26 Warren Levy ! * java/beans/PropertyChangeEvent.java (oldVal): Renamed to oldValue. ! (newVal): Renamed to newValue. ! * java/beans/PropertyVetoException.java (changeEvent): Renamed to evt. ! * java/beans/beancontext/BeanContextServiceRevokedEvent.java ! (revokeNow): Renamed to invalidateRefs. ! * java/io/OptionalDataException.java: Updated FIXME. ! (eof): New placeholder field. ! (length); Ditto. ! * java/io/WriteAbortedException.java (message): Made transient. ! * java/lang/ClassNotFoundException.java: Updated comments for JDK 1.2. ! * java/lang/Throwable.java (stackTrace): Made transient. ! * java/net/InetAddress.java: Made Serializable. ! * java/security/KeyPair.java: Made Serializable. ! * java/security/Provider.java: Replaced with Classpath version that ! implements serialization and proper methods. ! * java/text/ChoiceFormat.java (strings): Renamed to choiceFormats. ! (limits): Renamed to choiceLimits. ! 2000-06-24 Tom Tromey ! * java/lang/natDouble.cc (parseDouble): Renamed from ! doubleValueOf. ! * java/lang/Double.java (parseDouble): Renamed from ! doubleValueOf. Now public. ! 2000-06-23 Andrew Haley ! * java/lang/ieeefp.h: Handle ia64, fr30, mcore. ! * java/lang/natThrowable.cc: On IA-64, use __ia64_backtrace. ! 2000-06-23 Tom Tromey ! * java/lang/reflect/natMethod.cc: Include . ! * java/lang/natDouble.cc: Always include . ! Fix for PR libgcj/267. ! 2000-06-21 Bryce McKinlay ! * java/lang/ThreadGroup.java (add(Thread)): Rename to addThread() to ! comply with classpath VM spec. ! (add(Group)): Rename to addGroup(). ! * java/lang/Thread.java (Thread): Use addThread(). ! * java/lang/natThread.cc (finish_): Use removeThread(). ! 2000-06-20 Bryce McKinlay ! * java/lang/ThreadGroup.java: Merged with classpath. ! * prims.cc (_Jv_RunMain): Don't use `main_group'. ! * gnu/gcj/runtime/FirstThread.java: Remove ThreadGroup constructor ! argument. ! * java/lang/Thread.java (Thread): Bootstrap initial thread from ! ThreadGroup.root if Thread.currentThread is null. Honour the ! ThreadGroup's max priority setting. ! 2000-06-18 Tom Tromey ! * java/lang/natClass.cc (forName): Removed dead code. Initialize ! returned class. For PR gcj/260. ! 2000-06-16 Tom Tromey ! Fix for PR libgcj/261: ! * include/win32-signal.h (MAKE_THROW_FRAME): Added `_exception' ! argument. ! * include/sparc-signal.h (MAKE_THROW_FRAME): Added `_exception' ! argument. (This is a patch from long ago that somehow went ! missing.) ! 2000-06-15 Tom Tromey ! * gnu/gcj/convert/natIconv.cc (iconv_adapter): New function. ! (read): Use it. ! (write): Likewise. ! 2000-06-15 Bryce McKinlay ! Fix for PR java.lang/258: ! * prims.cc (_Jv_PrimClass): Set state of primitive class to ! JV_STATE_DONE, to prevent accidental initialization. ! * java/lang/natClass.cc (_Jv_IsAssignableFrom): Call ! _Jv_InterfaceAssignableFrom if target is an interface and source is an ! interface or an abstract class. Remove redundant initializeClass calls. ! Remove duplicate if_idt test. ! (_Jv_InterfaceAssignableFrom): New function. ! * java/lang/Class.h (_Jv_InterfaceAssignableFrom): Prototype. ! 2000-05-31 Tom Tromey ! * prims.cc (DECLARE_PRIM_TYPE): Define a vtable as well. ! (_Jv_PrimClass): Set `methods' by calling _Jv_FindArrayClass. ! * include/jvm.h (struct _Jv_ArrayVTable): Declare. ! (NUM_OBJECT_METHODS): New define. ! * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Added ! `array_vtable' parameter. Added assertion. ! * java/lang/Class.h (_Jv_FindArrayClass): Added `array_vtable' ! parameter. ! 2000-05-31 Bryce McKinlay ! * gcj/cni.h: Include . ! * defineclass.cc: Include . ! * interpret.cc: Ditto. ! * gij.cc: Include . ! 2000-05-30 Tom Tromey ! * include/name-finder.h: Include . ! (_Jv_name_finder::pid): Now of type `pid_t'. ! (_Jv_name_finder::~_Jv_name_finder): Call waitpid(). ! * java/lang/Throwable.java (CPlusPlusDemangler.close): Call ! `proc.waitFor()'. ! 2000-05-24 Warren Levy ! * java/io/ObjectOutputStream.java (writeObject): Use component type ! when writing arrays. ! Fixed typo. ! 2000-05-20 Bryce McKinlay ! Fix for PR libgcj/226: ! * java/lang/Class.h (_Jv_InitClass): Don't call __builtin_expect, ! since this is an installed header. ! Fix for PR libgcj/228: ! * java/util/zip/ZipFile (getInputStream): Create inflater with ! nowrapper option. ! * java/util/zip/natInflater.cc (inflate): Throw zlib's error message ! with DataFormatException. ! 2000-05-20 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (hack1): Removed. ! (awto_files): Likewise. ! (libgcjawt_la_SOURCES): Likewise. ! (EXTRA_libgcjawt_la_SOURCES): Likewise. ! (libgcjawt_la_DEPENDENCIES): Likewise. ! (libgcjawt_la_LIBADD): Likewise. ! (libgcjawt_la_LDFLAGS): Likewise. ! (libgcjawt_la_LINK): Likewise. ! ($(awt_java_source_files:.java=.class)): Likewise. ! (libgcj.zip): Don't depend on AWT files. ! (MOSTLYCLEANFILES): Don't include AWT files. ! ($(awto_files)): Removed. ! (nat_headers): Removed AWT files. ! (cond_awt_java_source_files): Removed. ! (ordinary_java_source_files): Added awt_java_source_files. ! * libgcj.spec.in (*lib): Removed -lgcjawt. * configure: Rebuilt. - * configure.in: Removed --enable-java-awt option. - - 2000-05-20 Bryce McKinlay - - * java/util/zip/ZipEntry.java: Implement Cloneable, per JDK1.2 docs. - (ZipEntry): Copy the `name' field. - (clone): Implement JDK1.2 method. - (setCompressedSize): ditto. - (hashCode): ditto. - - 2000-05-19 Tom Tromey - - * java/io/BufferedWriter.java: Merged with Classpath. - * java/io/BufferedOutputStream.java: Merged with Classpath. - - 2000-05-16 Andrew Haley - - * sysdep/ia64.c (ia64_backtrace_helper): Pass NULL pointer to - build_ia64_frame_state. - * sysdep/ia64-frame.h (build_ia64_frame_state): Match with - defintion in gcc. - - 2000-05-15 Warren Levy - - * gnu/gcj/beans/BeanInfoEmbryo.java: Removed. - * gnu/gcj/beans/EmptyBeanInfo.java: Removed. - * gnu/gcj/beans/ExplicitBeanInfo.java: Removed. - * gnu/gcj/beans/IntrospectionIncubator.java: Removed. - * gnu/gcj/beans/editors/ColorEditor.java: Removed. - * gnu/gcj/beans/editors/FontEditor.java: Removed. - * gnu/gcj/beans/editors/NativeBooleanEditor.java: Removed. - * gnu/gcj/beans/editors/NativeByteEditor.java: Removed. - * gnu/gcj/beans/editors/NativeDoubleEditor.java: Removed. - * gnu/gcj/beans/editors/NativeFloatEditor.java: Removed. - * gnu/gcj/beans/editors/NativeIntEditor.java: Removed. - * gnu/gcj/beans/editors/NativeLongEditor.java: Removed. - * gnu/gcj/beans/editors/NativeShortEditor.java: Removed. - * gnu/gcj/beans/editors/StringEditor.java: Removed. - * gnu/gcj/beans/info/ComponentBeanInfo.java: Removed. - * gnu/gcj/io/ClassLoaderObjectInputStream.java: Removed. - * gnu/gcj/io/NullOutputStream.java: Removed. - * gnu/gcj/io/ObjectIdentityWrapper.java: Removed. - * gnu/gcj/lang/ArrayHelper.java: Removed. - * gnu/gcj/lang/ClassHelper.java: Removed. - * gnu/gcj/lang/reflect/TypeSignature.java: Removed. - - * gnu/java/beans/BeanInfoEmbryo.java: New file. - * gnu/java/beans/EmptyBeanInfo.java: New file. - * gnu/java/beans/ExplicitBeanInfo.java: New file. - * gnu/java/beans/IntrospectionIncubator.java: New file. - * gnu/java/beans/editors/ColorEditor.java: New file. - * gnu/java/beans/editors/FontEditor.java: New file. - * gnu/java/beans/editors/NativeBooleanEditor.java: New file. - * gnu/java/beans/editors/NativeByteEditor.java: New file. - * gnu/java/beans/editors/NativeDoubleEditor.java: New file. - * gnu/java/beans/editors/NativeFloatEditor.java: New file. - * gnu/java/beans/editors/NativeIntEditor.java: New file. - * gnu/java/beans/editors/NativeLongEditor.java: New file. - * gnu/java/beans/editors/NativeShortEditor.java: New file. - * gnu/java/beans/editors/StringEditor.java: New file. - * gnu/java/beans/info/ComponentBeanInfo.java: New file. - * gnu/java/io/ClassLoaderObjectInputStream.java: New file. - * gnu/java/io/NullOutputStream.java: New file. - * gnu/java/io/ObjectIdentityWrapper.java: New file. - * gnu/java/lang/ArrayHelper.java: New file. - * gnu/java/lang/ClassHelper.java: New file. - * gnu/java/lang/reflect/TypeSignature.java: New file. - - * Makefile.am: Updated for moving Classpath files from gnu/gcj - namespace back to the original Classpath gnu/java namespace. - * Makefile.in: Rebuilt. - - * java/beans/Beans.java: Namespace change. - * java/beans/EventSetDescriptor.java: Namespace change. - * java/beans/Introspector.java: Namespace change. - * java/beans/PropertyEditorManager.java: Namespace change. - * java/io/ObjectInputStream.java: Namespace change. - * java/io/ObjectOutputStream.java: Namespace change. - * java/io/ObjectStreamClass.java: Namespace change. - * java/io/ObjectStreamField.java: Namespace change. - - 2000-04-21 Warren Levy - - * java/io/ObjectInputStream.java: Reverted workarounds of 2000-04-13 - now that compiler patch is available. - Removed unneeded System.loadLibrary. - * java/io/ObjectOutputStream.java: Removed unneeded System.loadLibrary. - * java/io/ObjectStreamClass.java: Removed unneeded System.loadLibrary. - - 2000-04-19 Andrew Haley - - * java/lang/natClass.cc (_Jv_IsAssignableFrom): Make sure source - and target classes have been initialized. - - 2000-04-19 Andrew Haley - - * java/lang/String.java: implement Serializable, Comparable. - (compareTo (Object)): New method. - - 2000-04-19 Warren Levy - - * java/io/ObjectStreamClass.java (getDefinedSUID): Use getDeclaredField - instead of getField to retrieve non-public field. - (getSerialPersistantFields): Ditto. - - 2000-04-18 Warren Levy - - * mauve-libgcj: Turned off object serialization tests temporarily - due to compiler error. - - 2000-04-17 Warren Levy - - * java/io/ObjectInputStream.java (DEBUG): Disabled unused method - to avoid build problem. - (DEBUGln): Ditto. - * mauve-libgcj: Turned on object serialization tests. - - 2000-04-17 Tom Tromey - - * libgcj.spec.in (*lib): Added -lgcjawt. - - 2000-04-17 Andrew Haley - - * Makefile.am: Add new files: - gnu/gcj/io/SimpleSHSStream.java, gnu/gcj/io/natSimpleSHSStream.cc, - gnu/gcj/io/shs.cc. * Makefile.in: Rebuilt. ! * java/lang/natClass.cc (_Jv_IsAssignableFrom): Check for an ! interface that has no implementations. ! Check for an attempt to assign an abstract class to an interface. ! ! * java/io/ObjectStreamClass.java (setUID): Use a SimpleSHSStream ! if we fail to find MessageDigest.getInstance ("SHA"). ! ! * gnu/gcj/io/SimpleSHSStream.java: New file. ! * gnu/gcj/io/natSimpleSHSStream.java: New file. ! * gnu/gcj/io/shs.cc: New file. ! * gnu/gcj/io/shs.h: new file. ! ! * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Make arrays ! serializable. ! ! * gnu/gcj/lang/reflect/TypeSignature.java: Don't remove ! punctuation from the classname of an array element. ! ! * gcj/javaprims.h: Add SimpleDigestStream. ! ! 2000-04-17 Andrew Haley ! * java/lang/natClass.cc (getPrivateField): Make recursive calls ! to getPrivateField for superclasses. ! 2000-04-14 Andrew Haley ! * Makefile.am: Add new files: ! java/io/ObjectOutputStream$PutField.h, ! java/io/ObjectInputStream$GetField.h,java/io/natObjectInputStream.cc, ! java/io/natObjectOutputStream.cc * Makefile.in: Rebuilt. - * gcj/Makefile.in: Rebuilt. - * include/Makefile.in: Rebuilt. - * java/lang/Class.h (getPrivateField): New method. - (getPrivateMethod): Ditto. - Make java::io::ObjectOutputStream, java::io::ObjectInputStream, - and java::io::ObjectStreamClass our friends. - * java/lang/natClass.cc (getPrivateField): New method. - (getPrivateMethod): Ditto. - (_Jv_IsAssignableFrom): Return false for Interface with no IDT. - * gcj/javaprims.h: Add serialization classes. - * java/io/ObjectInputStream.java (setBooleanField): Rewrite in Java. - (setByteField): Ditto. - (setCharField): Ditto. - (setDoubleField): Ditto. - (setFloatField): Ditto. - (setIntField): Ditto. - (setLongField): Ditto. - (setShortField): Ditto. - (setObjectField): Ditto. - * java/io/ObjectOutputStream.java: (getBooleanField): Rewrite in - Java. - (getByteField): Ditto. - (getCharField): Ditto. - (getDoubleField): Ditto. - (getFloatField): Ditto. - (getIntField): Ditto. - (getLongField): Ditto. - (getShortField): Ditto. - (getObjectField): Ditto. - * java/io/ObjectStreamClass.java (hasClassInitializer): Rewrite in - Java. - (getSerialPersistantFields): Ditto. - (getDefinedSUID): Ditto. - * java/io/natObjectOutputStream.cc: New file. - * java/io/natObjectInputStream.cc: New file. - - 2000-04-13 Warren Levy ! * java/io/ObjectInputStream.java: Temporary workarounds for compiler ! problems. Revert to previous version to reproduce and when fixed. ! 2000-04-13 Warren Levy ! * gnu/gcj/io/ClassLoaderObjectInputStream.java: New file. ! * gnu/gcj/io/NullOutputStream.java: New file. ! * gnu/gcj/lang/reflect/TypeSignature.java: New file. ! * java/io/BlockDataException.java: New file. ! * java/io/Externalizable.java: New file. ! * java/io/InvalidClassException.java: New file. ! * java/io/InvalidObjectException.java: New file. ! * java/io/NotActiveException.java: New file. ! * java/io/NotSerializableException.java: New file. ! * java/io/ObjectInput.java: New file. ! * java/io/ObjectInputStream.java: New file. ! * java/io/ObjectInputValidation.java: New file. ! * java/io/ObjectOutput.java: New file. ! * java/io/ObjectOutputStream.java: New file. ! * java/io/ObjectStreamClass.java: New file. ! * java/io/ObjectStreamConstants.java: New file. ! * java/io/ObjectStreamField.java: New file. ! * java/io/Replaceable.java: New file. ! * java/io/Resolvable.java: New file. ! * java/io/SerializablePermission.java: New file. ! * java/io/WriteAbortedException.java: New file. ! * java/security/BasicPermission.java: New file. ! * java/security/DigestOutputStream.java: New file. ! * java/security/Guard.java: New file. ! * java/security/Permission.java: New file. ! * java/security/PermissionCollection.java: New file. ! * Makefile.am: Added above files. ! * Makefile.in: Rebuilt. ! * java/beans/Beans.java (instantiate): Activated serialization code. ! * java/lang/SecurityManager.java (checkPermission): New method. ! 2000-04-12 Warren Levy ! * gnu/gcj/beans/BeanInfoEmbryo.java: New file. ! * gnu/gcj/beans/EmptyBeanInfo.java: New file. ! * gnu/gcj/beans/ExplicitBeanInfo.java: New file. ! * gnu/gcj/beans/IntrospectionIncubator.java: New file. ! * gnu/gcj/beans/editors/ColorEditor.java: New file. ! * gnu/gcj/beans/editors/FontEditor.java: New file. ! * gnu/gcj/beans/editors/NativeBooleanEditor.java: New file. ! * gnu/gcj/beans/editors/NativeByteEditor.java: New file. ! * gnu/gcj/beans/editors/NativeDoubleEditor.java: New file. ! * gnu/gcj/beans/editors/NativeFloatEditor.java: New file. ! * gnu/gcj/beans/editors/NativeIntEditor.java: New file. ! * gnu/gcj/beans/editors/NativeLongEditor.java: New file. ! * gnu/gcj/beans/editors/NativeShortEditor.java: New file. ! * gnu/gcj/beans/editors/StringEditor.java: New file. ! * gnu/gcj/beans/info/ComponentBeanInfo.java: New file. ! * gnu/gcj/io/ObjectIdentityWrapper.java: New file. ! * gnu/gcj/lang/ArrayHelper.java: New file. ! * gnu/gcj/lang/ClassHelper.java: New file. ! * java/beans/BeanDescriptor.java: New file. ! * java/beans/BeanInfo.java: New file. ! * java/beans/Beans.java: New file. ! * java/beans/Customizer.java: New file. ! * java/beans/DesignMode.java: New file. ! * java/beans/EventSetDescriptor.java: New file. ! * java/beans/FeatureDescriptor.java: New file. ! * java/beans/IndexedPropertyDescriptor.java: New file. ! * java/beans/IntrospectionException.java: New file. ! * java/beans/Introspector.java: New file. ! * java/beans/MethodDescriptor.java: New file. ! * java/beans/ParameterDescriptor.java: New file. ! * java/beans/PropertyChangeEvent.java: New file. ! * java/beans/PropertyChangeListener.java: New file. ! * java/beans/PropertyChangeSupport.java: New file. ! * java/beans/PropertyDescriptor.java: New file. ! * java/beans/PropertyEditor.java: New file. ! * java/beans/PropertyEditorManager.java: New file. ! * java/beans/PropertyEditorSupport.java: New file. ! * java/beans/PropertyVetoException.java: New file. ! * java/beans/SimpleBeanInfo.java: New file. ! * java/beans/VetoableChangeListener.java: New file. ! * java/beans/VetoableChangeSupport.java: New file. ! * java/beans/Visibility.java: New file. ! * java/beans/beancontext/BeanContext.java: New file. ! * java/beans/beancontext/BeanContextChild.java: New file. ! * java/beans/beancontext/BeanContextChildComponentProxy.java: New file. ! * java/beans/beancontext/BeanContextChildSupport.java: New file. ! * java/beans/beancontext/BeanContextContainerProxy.java: New file. ! * java/beans/beancontext/BeanContextEvent.java: New file. ! * java/beans/beancontext/BeanContextMembershipEvent.java: New file. ! * java/beans/beancontext/BeanContextMembershipListener.java: New file. ! * java/beans/beancontext/BeanContextProxy.java: New file. ! * java/beans/beancontext/BeanContextServiceAvailableEvent.java: ! New file. ! * java/beans/beancontext/BeanContextServiceProvider.java: New file. ! * java/beans/beancontext/BeanContextServiceProviderBeanInfo.java: ! New file. ! * java/beans/beancontext/BeanContextServiceRevokedEvent.java: New file. ! * java/beans/beancontext/BeanContextServiceRevokedListener.java: ! New file. ! * java/beans/beancontext/BeanContextServices.java: New file. ! * java/beans/beancontext/BeanContextServicesListener.java: New file. ! * java/util/AbstractCollection.java: New file. ! * java/util/AbstractList.java: New file. ! * java/util/Arrays.java: New file. ! * Makefile.am: Added above files. ! * Makefile.in: Rebuilt. ! 2000-04-11 Warren Levy ! * java/awt/AWTError.java: New file. ! * java/awt/AWTEvent.java: New file. ! * java/awt/AWTException.java: New file. ! * java/awt/ActiveEvent.java: New file. ! * java/awt/Adjustable.java: New file. ! * java/awt/BorderLayout.java: New file. ! * java/awt/Color.java: New file. ! * java/awt/Component.java: New file. ! * java/awt/Container.java: New file. ! * java/awt/Dimension.java: New file. ! * java/awt/Event.java: New file. ! * java/awt/Font.java: New file. ! * java/awt/Frame.java: New file. ! * java/awt/Graphics.java: New file. ! * java/awt/IllegalComponentStateException.java: New file. ! * java/awt/Image.java: New file. ! * java/awt/ItemSelectable.java: New file. ! * java/awt/LayoutManager.java: New file. ! * java/awt/LayoutManager2.java: New file. ! * java/awt/Menu.java: New file. ! * java/awt/MenuBar.java: New file. ! * java/awt/MenuComponent.java: New file. ! * java/awt/MenuContainer.java: New file. ! * java/awt/MenuItem.java: New file. ! * java/awt/Paint.java: New file. ! * java/awt/PaintContext.java: New file. ! * java/awt/Point.java: New file. ! * java/awt/Rectangle.java: New file. ! * java/awt/Shape.java: New file. ! * java/awt/TextArea.java: New file. ! * java/awt/TextComponent.java: New file. ! * java/awt/Toolkit.java: New file. ! * java/awt/Transparency.java: New file. ! * java/awt/Window.java: New file. ! * java/awt/natToolkit.cc: New file. ! * java/awt/event/AWTEventListener.java: New file. ! * java/awt/event/ActionEvent.java: New file. ! * java/awt/event/ActionListener.java: New file. ! * java/awt/event/AdjustmentEvent.java: New file. ! * java/awt/event/AdjustmentListener.java: New file. ! * java/awt/event/ComponentAdapter.java: New file. ! * java/awt/event/ComponentEvent.java: New file. ! * java/awt/event/ComponentListener.java: New file. ! * java/awt/event/ContainerAdapter.java: New file. ! * java/awt/event/ContainerEvent.java: New file. ! * java/awt/event/ContainerListener.java: New file. ! * java/awt/event/FocusAdapter.java: New file. ! * java/awt/event/FocusEvent.java: New file. ! * java/awt/event/FocusListener.java: New file. ! * java/awt/event/InputEvent.java: New file. ! * java/awt/event/InputMethodEvent.java: New file. ! * java/awt/event/InputMethodListener.java: New file. ! * java/awt/event/InvocationEvent.java: New file. ! * java/awt/event/ItemEvent.java: New file. ! * java/awt/event/ItemListener.java: New file. ! * java/awt/event/KeyAdapter.java: New file. ! * java/awt/event/KeyEvent.java: New file. ! * java/awt/event/KeyListener.java: New file. ! * java/awt/event/MouseAdapter.java: New file. ! * java/awt/event/MouseEvent.java: New file. ! * java/awt/event/MouseListener.java: New file. ! * java/awt/event/MouseMotionAdapter.java: New file. ! * java/awt/event/MouseMotionListener.java: New file. ! * java/awt/event/PaintEvent.java: New file. ! * java/awt/event/TextEvent.java: New file. ! * java/awt/event/TextListener.java: New file. ! * java/awt/event/WindowAdapter.java: New file. ! * java/awt/event/WindowEvent.java: New file. ! * java/awt/event/WindowListener.java: New file. ! * java/awt/geom/Dimension2D.java: New file. ! * java/awt/geom/Point2D.java: New file. ! * java/awt/peer/ComponentPeer.java: New file. ! * java/awt/peer/ContainerPeer.java: New file. ! * java/awt/peer/FramePeer.java: New file. ! * java/awt/peer/WindowPeer.java: New file. ! * java/util/Collection.java: New file. ! * java/util/Comparator.java: New file. ! * java/util/Iterator.java: New file. ! * java/util/List.java: New file. ! * java/util/ListIterator.java: New file. ! * Makefile.am: Added above files. * Makefile.in: Rebuilt. ! 2000-04-10 Warren Levy ! ! * gnu/gcj/runtime/MethodInvocation.java: Fixed copyright. ! * java/lang/FirstThread.java: Ditto. ! * java/lang/StringBuffer.java: Ditto. ! * mauve-libgcj: Turned on java.math, java.sql and java.security tests. ! ! * gnu/gcj/math/MPN.java (rshift): Undid Boehm's patch of 03-14. ! Special case handled in java.math.BigInteger. ! * java/math/BigInteger.java (divide): Handle the special case when ! dividing by 1 and the high bit of the dividend is set. ! (setShiftRight): Handle case when count == 0. ! ! 2000-04-05 Andrew Haley ! ! * java/net/URL.java (setURLStreamHandler): Make "file" protocol a ! special case. ! ! 2000-04-05 Andrew Haley ! * sysdep/ia64.c (rse_address_add): Delete. ! (IS_NaT_COLLECTION_ADDR): Delete. ! (ia64_backtrace_helper): check for null unwind_info. ! * sysdep/ia64-frame.h: add calc_caller_bsp. ! * java/lang/natThrowable.cc (printRawStackTrace): Flush ! PrintWriter. ! * prims.cc (_Jv_divI): Use _Jv_ThrowSignal. ! (_Jv_remI): Likewise. ! (_Jv_divJ): Likewise. ! (_Jv_remJ): Likewise. ! * interpret.cc (continue1): Use divide subroutines to guarantee ! correct Java standard behaviour. ! Floating-point division should not abort; make it so. ! 2000-03-29 Tom Tromey ! * configure: Rebuilt. ! * configure.in: Test against `libgcj_sjlj', not ! `enable_sjlj_exceptions'. Rearranged code to allow SYSDEP_SOURCES ! to be set even when using sjlj. ! 2000-03-24 Andrew Haley ! * Makefile.am: Add file addr2name.awk. ! * Makefile.in: Rebuilt. ! * addr2name.awk: New file. ! * name-finder.cc (_Jv_name_finder): Call addr2name.awk to do name ! lookups on ia64. ! * java/lang/natThrowable.cc(printRawStackTrace): Don't print out a ! blank line. ! 2000-03-22 Andrew Haley ! * configure.host: Add -funwind-tables for IA64. ! * Makefile.am (c_source_files): Add SYSDEP_SORCES. * Makefile.in: Rebuilt. - * java/lang/natThrowable.cc (fillInStackTrace): Add ia64 case. - * sysdep/ia64.c: New file. - * sysdep/ia64-frame.h: New file. - * configure.in: Add sysdep/ia64.c for ia64. - * configure: Rebuilt. ! 2000-03-17 Andrew Haley ! * java/lang/natString.cc: Remove `register' keyword. ! interpret.cc: ditto. ! 2000-03-16 Andrew Haley ! * configure.host (ia64): Enable interpreter. ! 2000-03-14 Hans Boehm ! * gnu/gcj/math/MPN.java (rshift): Handle shift 32 specially. ! 2000-03-14 Andrew Haley ! * include/default-signal.h (MAKE_THROW_FRAME): Add arg ! `_exception'. ! 2000-03-10 Andrew Haley ! * java/lang/ieeefp.h: Import latest version from fdlibm. ! 2000-03-14 Andrew Haley ! * prims.cc (_Jv_ThrowSignal): New function. ! (catch_segv): Add arg `_exception' to MAKE_THROW_FRAME. ! (catch_fpe): Ditto. ! * include/sparc-signal.h (MAKE_THROW_FRAME): Ditto ! * include/i386-signal.h (MAKE_THROW_FRAME): Ditto. ! * include/ppc-signal.h: New file. ! 2000-05-18 Bryce McKinlay ! * java/lang/Thread.java: Declare `data' as Object, not RawData. ! * java/lang/natThread.java (initialize_native): Cast `data' to ! jobject. ! * gnu/gcj/RawData.java: Clarify documentation. ! From Gregory R. Warnes : ! * gnu/gcj/protocol/jar/Connection.java (getJarFile): Test for null ! `jarFile', not `jarFileURL'. ! 2000-05-15 Andrew Haley ! * include/ppc-signal.h: New file. ! 2000-05-11 Tom Tromey ! * java/util/zip/ZipInputStream.java (getNextEntry): When reading ! file headers, don't include `size' in the skip call. ! 2000-05-10 Bryce McKinlay ! * java/lang/StringBuffer.java (delete): Call arrayCopy() correctly. ! Avoid arrayCopy() call where possible. Update `count' _after_ calling ! arrayCopy(). ! (replace): Reimplemented. Fix javadoc. ! (reverse): Call ensureCapacity_unsynchronized(). ! (StringBuffer (String)): Use DEFAULT_CAPACITY. ! (replace): Calculate length for arraycopy() correctly. ! 2000-05-09 Tom Tromey ! * java/lang/StringBuffer.java (toString): Don't mark buffer as ! shared. ! (insert(int,char[],int,int): New method. ! (delete): New method from Classpath. ! (deleteCharAt): Likewise. ! (substring): Likewise. ! (shared): No longer private. ! Added JavaDoc comments from Classpath. ! * java/lang/String.java (String(StringBuffer)): Ensure `buffer' is ! shared. ! 2000-05-07 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (LIBLINK): New macro. ! (libgcj_la_LINK): Use it. ! (libgcjawt_la_LINK): Likewise. ! 2000-05-06 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (libgcj.zip): Don't pass -L to javac. ! 2000-05-05 Tom Tromey ! Fix for PR libgcj/220: ! * Makefile.in: Rebuilt. ! * Makefile.am (gij_LDFLAGS): Don't use libstdc++. ! (jv_convert_LDFLAGS): Likewise. ! (libgcj_la_LDFLAGS): Likewise. ! (GCJLINK): New macro. ! (jv_convert_LINK): Use it. ! (gij_LINK): Likewise. ! (libgcj_la_LINK): New macro. ! (libgcjawt_la_LINK): Likewise. ! 2000-05-04 Tom Tromey ! * gcj/field.h (JvFieldIsRef): Return false for gnu.gcj.RawData ! field. ! * boehm.cc (_Jv_MarkObj): Removed dead code. Use `STATIC', not ! `0x0008'. ! Include Modifier.h. ! 2000-05-05 Bryce McKinlay ! * java/lang/natClass.cc (isInstance): Use __builtin_expect. ! (_Jv_IsAssignableFrom): Ditto. ! (_Jv_IsInstanceOf): Ditto. ! (_Jv_CheckCast): Ditto. ! (_Jv_CheckArrayStore): Ditto. ! * java/lang/Class.h (_Jv_InitClass): Ditto. ! * java/lang/natObject.cc (_Jv_MonitorEnter): __builtin_expect `false', ! not `0'. ! (notify): Ditto. ! (notifyAll): Ditto. ! (wait): Ditto. ! (_Jv_MonitorExit): Ditto. ! * boehm.cc (_Jv_MarkObj): Ditto. ! (_Jv_MarkObj): Ditto. ! (_Jv_MarkArray): Ditto. ! * prims.cc (_Jv_AllocObject): Ditto. ! (_Jv_NewObjectArray): Ditto. ! (_Jv_NewPrimArray): Ditto. ! (_Jv_Malloc): Ditto. ! (_Jv_Realloc): Ditto. ! (_Jv_MallocUnchecked): Ditto. ! (_Jv_divI): Ditto. ! (_Jv_remI): Ditto. ! (_Jv_divJ): Ditto. ! (_Jv_remJ): Ditto. ! 2000-05-04 Tom Tromey ! * java/util/Locale.java (Locale): Don't explicitly check for ! null. ! * java/util/Hashtable.java (containsKey): Don't explicitly check ! for null. ! (get): Likewise. ! * java/util/BitSet.java (and, or, xor): Don't explicitly check for ! null. ! * java/util/zip/ZipEntry.java (ZipEntry): Don't explicitly check ! for null. ! * java/text/StringCharacterIterator.java ! (StringCharacterIterator): Don't check for null. ! * java/text/ChoiceFormat.java (setChoices): Don't explicitly check ! for null pointer. ! * java/net/MulticastSocket.java (joinGroup): Don't explicitly ! check for null pointer. ! (leaveGroup): Likewise. ! * java/net/DatagramPacket.java (DatagramPacket): Removed erroneous ! comment. ! (setData): Likewise. ! * java/lang/ThreadGroup.java (ThreadGroup): Don't explicitly check ! for `p==null'. ! 2000-04-28 Jakub Jelinek ! * Makefile.am (GCJCOMPILE, JCFLAGS, JF1CLAGS, jv_convert_LINK, ! gij_LINK, libgcj.zip, .java=.class): Move -L option out of FLAGS. ! (libgcj_la_LDFLAGS): Add -L../libstdc++ for in-gcc builds. ! (jv_convert_LDFLAGS, gij_LDFLAGS): Add `pwd`/../libstdc++ to ! -rpath for in-gcc builds. ! * Makefile.in: Rebuilt. ! 2000-04-28 Tom Tromey ! * libgcj.spec.in (*jc1): Added -fasynchronous-exceptions. ! Fix for PR gcj/218. ! 2000-04-28 Bryce McKinlay ! * libjava/java/lang/String.java (toString): Remove `final' hack. ! 2000-04-05 Tom Tromey ! Runtime support for PR gcj/2: ! * prims.cc (_Jv_ThrowNullPointerException): New function. ! * include/jvm.h (_Jv_ThrowNullPointerException): Declare. ! 2000-04-27 Bryce McKinlay ! * prims.cc (_Jv_NewObjectArray): Fix typo. ! 2000-04-26 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (AM_CXXFLAGS): Added -fasynchronous-exceptions. ! 2000-04-24 Jeff Sturm ! * gnu/gcj/runtime/natFirstThread.cc (run): Initialize class before ! calling main. ! 2000-04-22 Anthony Green ! * include/jvm.h (__builtin_expect): Define as unused for now. ! * java/lang/natObject.cc (_Jv_MonitorEnter): Add __builtin_expect. ! (notify): Ditto. ! (notifyAll): Ditto. ! (wait): Ditto. ! (_Jv_MonitorExit): Ditto. ! * boehm.cc (_Jv_MarkObj): Ditto. ! (_Jv_MarkObj): Ditto. ! (_Jv_MarkArray): Ditto. ! (_Jv_AllocBytes): Ditto. ! * prims.cc (_Jv_AllocObject): Ditto. ! (_Jv_NewObjectArray): Ditto. ! (_Jv_NewPrimArray): Ditto. ! (_Jv_Malloc): Ditto. ! (_Jv_Realloc): Ditto. ! (_Jv_MallocUnchecked): Ditto. ! (_Jv_divI): Ditto. ! (_Jv_remI): Ditto. ! (_Jv_divJ): Ditto. ! (_Jv_remJ): Ditto. ! * include/Makefile.in: Rebuilt. ! * include/Makefile.am (include_HEADERS): Add jvmpi.h. ! 2000-04-21 Tom Tromey ! * java/io/PipedInputStream.java, java/io/PipedOutputStream.java: ! Yet another new version from Classpath. ! Fix for PR libgcj/15: ! * java/util/natGregorianCalendar.cc (_REENTRANT, ! _POSIX_PTHREAD_SEMANTICS): Don't define. ! * java/net/natInetAddress.cc (_REENTRANT): Don't define. ! * java/lang/natSystem.cc (_REENTRANT, _POSIX_PTHREAD_SEMANTICS): ! Don't define. ! * java/io/natFile.cc (_REENTRANT, _POSIX_PTHREAD_SEMANTICS): Don't ! define. ! * configure: Rebuilt. ! * configure.in: If using POSIX threads, define _REENTRANT if ! needed. Define _POSIX_PTHREAD_SEMANTICS. Don't define ! GETHOSTBYNAME_R_NEEDS_REENTRANT. ! * java/io/PipedInputStream.java, java/io/PipedReader.java, ! java/io/PipedOutputStream.java, java/io/PipedWriter.java: New ! version from Classpath. ! Fix for PR libgcj/213: ! * Makefile.in: Rebuilt. ! * Makefile.am (gij_SOURCES): Added gij.cc. ! (EXTRA_gij_SOURCES): Removed. ! (gij_LDADD): Removed gij.lo. ! (gij_DEPENDENCIES): Likewise. ! ($(gij_OBJECTS)): Depend on nat_headers. ! * gnu/gcj/protocol/file/Handler.java (openConnection): Use ! `setURL', not `url.set'. ! 2000-04-20 Tom Tromey ! Fix for PR java.io/204: ! * java/io/PipedInputStream.java, java/io/PipedReader.java, ! java/io/PipedOutputStream.java, java/io/PipedWriter.java: Imported ! from Classpath. ! Fix for PR libgcj/212: ! * gcj/javaprims.h (_Jv_word, _Jv_word2): Removed definitions. ! * include/jvm.h (_Jv_word, _Jv_word2): Define. ! * java/lang/Class.h (_Jv_word): Declare. ! * jni.cc (_Jv_JNI_PopSystemFrame): Clear `env->ex'. ! 2000-04-19 Tom Tromey ! * jni.cc (_Jv_JNI_FindClass): Use system class loader if class ! doesn't have a loader. ! 2000-04-19 Bryce McKinlay ! * boehm.cc: (_Jv_MarkObj, _Jv_MarkArray): Cast pointers for ! MAYBE_MARK to ptr_t, for compatibility with new GC version. ! 2000-04-16 Bryce McKinlay ! * java/io/natFileDescriptorPosix.cc (open): Use mode 0666. Fix for PR ! libgcj/202. ! (available): Initialize `where' to prevent bogus compiler warning. ! 2000-04-12 Tom Tromey ! * java/lang/natString.cc (intern): Temporarily disable finalizer ! registration. ! * java/lang/natString.cc (unintern): Added `obj' argument. ! (intern): Register finalizer for string. ! * java/lang/String.java (unintern): Now static; added obj ! argument. ! 2000-04-11 Tom Tromey ! * java/util/Vector.java (VectorEnumeration): Now `final'. ! * java/util/Hashtable.java (HashtableEntry): Now `final'. ! (HashtableEnumeration): Likewise. ! * java/util/zip/ZipFile.java (ZipEnumeration): Now `final'. ! * java/text/RuleBasedCollator.java (RBCElement): Now `final'. ! 2000-04-10 Warren Levy ! * java/io/ObjectStreamException.java: New file. ! * java/io/OptionalDataException.java: New file. ! * java/io/StreamCorruptedException.java: New file. ! * java/math/BigDecimal.java: New file. ! * java/sql/CallableStatement.java: New file. ! * java/sql/Connection.java: New file. ! * java/sql/DataTruncation.java: New file. ! * java/sql/DatabaseMetaData.java: New file. ! * java/sql/Date.java: New file. ! * java/sql/Driver.java: New file. ! * java/sql/DriverManager.java: New file. ! * java/sql/DriverPropertyInfo.java: New file. ! * java/sql/PreparedStatement.java: New file. ! * java/sql/ResultSet.java: New file. ! * java/sql/ResultSetMetaData.java: New file. ! * java/sql/SQLException.java: New file. ! * java/sql/SQLWarning.java: New file. ! * java/sql/Statement.java: New file. ! * java/sql/Time.java: New file. ! * java/sql/Timestamp.java: New file. ! * java/sql/Types.java: New file. ! * Makefile.am: Added above new files. ! * Makefile.in: Rebuilt. ! * mauve-libgcj: Turned on java.math, java.sql and java.security tests. ! * java/net/MulticastSocket.java (MulticastSocket): Pass values a la ! DatagramSocket constructor instead of null. ! 2000-04-08 Anthony Green ! * include/posix-threads.h (_Jv_MutexUnlock): Replace ! _JV_NOT_OWNER. ! 2000-04-08 Anthony Green ! * posix-threads.cc (_Jv_MutexLock): Moved back to posix-threads.h. ! (_Jv_MutexUnlock): Ditto. ! * include/posix-threads.h (_Jv_MutexLock): From posix-threads.cc. ! (_Jv_MutexUnlock): Ditto. ! 2000-04-08 Anthony Green ! * java/lang/StringBuffer.java (ensureCapacity): Don't call Math::max. ! (ensureCapacity_unsynchronized): New private method. ! (append): Use ensureCapacity_unsynchronized. ! 2000-04-08 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new files. ! * java/awt/IllegalComponentStateException.java: New file. ! * java/awt/ItemSelectable.java: New file. ! * java/awt/event/WindowEvent.java: Finished. ! * java/awt/event/TextEvent.java: Finished. ! * java/awt/event/ContainerEvent.java: New file. ! * java/awt/Component.java (getX, getY): New methods. ! * java/awt/event/PaintEvent.java: New file. ! * java/awt/event/MouseEvent.java: New file. ! * java/awt/ActiveEvent.java: New file. ! * java/awt/event/KeyEvent.java: Finished. ! * java/awt/event/ItemEvent.java: New file. ! * java/awt/Adjustable.java: New file. ! * java/awt/event/InputMethodEvent.java: New file. ! * java/awt/event/InputEvent.java: Finished. ! * java/awt/event/FocusEvent.java: New file. ! * java/awt/event/MouseMotionAdapter.java: New file. ! * java/awt/event/MouseAdapter.java: New file. ! * java/awt/event/KeyAdapter.java: New file. ! * java/awt/event/FocusAdapter.java: New file. ! * java/awt/event/ContainerAdapter.java: New file. ! * java/awt/event/ComponentEvent.java: Finished. ! * java/awt/event/AdjustmentEvent.java: New file. ! * java/awt/event/ComponentAdapter.java: New file. ! * java/awt/event/ActionEvent.java: Finished. ! * java/awt/event/MouseMotionListener.java: New file. ! * java/awt/event/MouseListener.java: New file. ! * java/awt/event/ItemListener.java: New file. ! * java/awt/event/InputMethodListener.java: New file. ! * java/awt/event/ContainerListener.java: New file. ! * java/awt/event/FocusListener.java: New file. ! * java/awt/event/ComponentListener.java: New file. ! * java/awt/event/AWTEventListener.java: New file. ! * java/awt/event/AdjustmentListener.java: New file. ! 2000-04-08 Anthony Green ! * java/lang/natObject.cc (_Jv_MonitorEnter): Only perform null ! check when we have to. ! * gcj/array.h: Mark elements(JArray& x) and elements(JArray* ! x) as `inline'. ! * java/util/StringTokenizer.java: Minor optimization. Eliminates ! one method call. ! * java/util/Vector.java (VectorEnumeration.nextElement): Manually ! inline hasMoreElements. ! 2000-04-05 Tom Tromey * configure: Rebuilt. ! * configure.in: Recognize --enable-java-awt. ! (AWT): New conditional. ! * Makefile.in: Rebuilt. ! * Makefile.am (toolexeclib_LTLIBRARIES): Build libgcjawt.la if ! requested. ! (libgcjawt_la_SOURCES): New macro. ! (EXTRA_libgcjawt_la_SOURCES): Likewise. ! (libgcjawt_la_DEPENDENCIES): Likewise. ! (libgcjawt_la_LIBADD): Likewise. ! (libgcjawt_la_LDFLAGS): Likewise. ! (libgcj.zip): Depend on cond_java_awt_source_files ! (cond_awt_java_source_files): New macro. ! (MOSTLYCLEANFILES): Added awto_files. ! (awto_files): New macro. Use where javao_files used. ! (nat_headers): Use cond_awt_java_source_files. ! ! 2000-04-04 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added AWTException.java. ! * java/awt/AWTException.java: New file. ! 2000-04-03 Tom Tromey ! * include/jvm.h (_Jv_GetArrayElementFromElementType): More ! commentary from Alex. ! * Makefile.in: Rebuilt. ! * Makefile.am ($(javao_files)): Depend on libgcj.zip. ! From H.J. Lu. ! Sun Apr 2 08:27:18 2000 Anthony Green ! * configure: Rebuilt. ! * configure.in: Add --disable-jvmpi. * include/config.h.in: Rebuilt. ! * acconfig.h: Add ENABLE_JVMPI. ! ! * include/jvm.h: Declare _Jv_DisableGC and _Jv_EnableGC. ! (_Jv_JVMPI_Notify_OBJECT_ALLOC): New define. ! (_Jv_JVMPI_Notify_THREAD_END): New define. ! (_Jv_JVMPI_Notify_THREAD_END): New define. ! * prims.cc (_Jv_JVMPI_Notify_OBJECT_ALLOC): Declare. ! (_Jv_JVMPI_Notify_THREAD_END): Declare. ! (_Jv_JVMPI_Notify_THREAD_END): Declare. ! ! * prims.cc (_Jv_AllocObject): Generate JVMPI object allocation ! events. ! ! * java/lang/natThread.cc: Include JVMPI headers if necessary. ! (finish_): Generate JVMPI thread end events. ! (run_): Generate JVMPI thread start events. ! * gnu/gcj/runtime/natFirstThread.cc (run): Call JNI_OnLoad for any ! preloaded JNI library. ! Include JVMPI headers if necessary. ! (run): Generate JVMPI thread start events. ! ! * boehm.cc: Define GC_disable and GC_enable. ! (_Jv_DisableGC): New function. ! (_Jv_EnableGC): New function. ! (disable_gc_mutex): Declare. ! * nogc.cc (_Jv_DisableGC): New function. ! (_Jv_EnableGC): New function. ! * jni.cc (_Jv_JNI_GetEnv): Handle JVMPI interface requests. ! (_Jv_JVMPI_Interface): Define. ! (jvmpiEnableEvent): New function. ! (_Jv_JNI_Init): Initialize _Jv_JVMPI_Interface. ! * include/jvmpi.h: New file. ! 2000-03-27 Bryce McKinlay ! * Makefile.in: New #defines and friends for Thread.h. ! * Makefile.am: Ditto. ! * posix-threads.cc: (struct starter): Remove `object'. ! (_Jv_CondWait): Use interruptable condition variables and new ! recursive mutexes. New return codes on interrupt or non-ownership ! of mutex. ! (_Jv_CondNotify): Ditto. ! (_Jv_CondNotifyAll): Ditto. ! (_Jv_ThreadInterrupt): Set thread interrupt flag directly. Interrupt ! the target thread by signaling its wait condition. ! (_Jv_ThreadInitData): Set `thread_obj' in the thread data struct, ! not the starter struct. Initialize wait_mutex and wait_cond. ! (_Jv_MutexLock): New recursive mutex implementation. Moved from ! posix-threads.h. ! (_Jv_MutexUnlock): Ditto. ! (really_start): Set info->data->thread from pthread_self() to work ! around a race condition. Destroy wait_mutex and wait_cond when run() ! returns. ! * java/lang/Thread.java: (isInterrupted_): Renamed to overloaded ! `isInterrupted(boolean)'. Clear interrupted flag if clear_flag is ! set. ! startable_flag: New private field. ! (Thread): Initialize `startable_flag'. ! (toString): Check for null thread group. ! * java/lang/natThread.cc: (struct natThread): New fields ! `join_mutex', `join_cond'. Removed fields `joiner', `next'. ! (class locker): Removed. ! (initialize_native): Initialize `join_cond' and `join_mutex'. ! (interrupt): Now just calls _Jv_ThreadInterrupt(). ! (join): Simplified. Just wait on the target thread's join condition. ! (finish_): Remove join list code. Unset thread group. Signal ! potential joiners by notifying the dying threads join_cond. ! (start): Check for illegal restarts. ! * java/lang/natObject.cc: Check for return value of _Jv_CondWait and ! act appropriatly. ! * include/posix-threads.h: Remove all HAVE_RECURSIVE_MUTEX related ! #defines and #ifdefs. ! (struct _Jv_Thread_t): New fields `thread_obj', `wait_cond', ! `wait_mutex', `next'. ! (struct _Jv_ConditionVariable_t): Define as a struct instead of ! directly mapping to pthread_cond_t. ! (struct _Jv_Mutex_t): New recursive implementation. ! (_Jv_PthreadCheckMonitor): Reimplemented. Simple `owner' check. ! _Jv_HaveCondDestroy: Never define this for posix-threads. ! (_Jv_CondNotify): Remove inline implementation(s), prototype instead. ! (_Jv_CondNotifyAll): Ditto. ! (_Jv_MutexLock): Ditto. ! (_Jv_MutexUnlock): Ditto. ! (_Jv_MutexInit): Changed to reflect new mutex implementation. ! (_Jv_MutexDestroy): Ditto. ! (_Jv_CondDestroy): Removed. ! (_Jv_PthreadGetMutex): Removed. ! * include/win32-threads.h: (_Jv_CondNotify): Guess _JV_NOT_OWNER on an ! error. Add a FIXME about this. ! (_Jv_CondNotifyAll): Ditto. ! * win32-threads.cc: (_Jv_CondWait): Return 0 on a timeout. Guess ! _JV_NOT_OWNER on other errors. Add FIXME. ! 2000-03-26 Tom Tromey ! * jni.cc (_Jv_JNI_PopSystemFrame): If environment has exception ! set, throw it. ! (call): Don't throw exception here. ! 2000-03-26 Tom Tromey ! * java/lang/mprec.h: Use SIZEOF_VOID_P. ! * interpret.cc: Use SIZEOF_VOID_P. ! * include/java-cpool.h (_Jv_storeLong): Use SIZEOF_VOID_P. ! (_Jv_loadLong): Likewise. ! (_Jv_storeDouble): Likewise. * configure: Rebuilt. - * configure.in: Check size of void*. - - * resolve.cc (ncode): Use FFI_PREP_RAW_CLOSURE and FFI_RAW_SIZE. - - 2000-03-26 Hans Boehm - - * include/java-cpool.h (_Jv_storeLong, _Jv_loadLong, - _Jv_storeDouble, _Jv_loadDouble): Define differently on 64 bit - machine. - * java/lang/ieeefp.h: Define __IEEE_BIG_ENDIAN or - __IEEE_LITTLE_ENDIAN appropriately on IA64. - * java/lang/mprec.h: Don't define Pack_32 on 64 bit machine. - * javaprims.h (_Jv_word): Added `l' and `d' entries in 64 bit - case. - * resolve.cc (FFI_PREP_RAW_CLOSURE): New define. - (FFI_RAW_SIZE): Likewise. - (_Jv_InterpMethod::ncode): Use them. - * interpret.cc (PUSHL, PUSHD, POPL, POPD, LOADL, LOADD, STOREL, - STORED): Define differently on a 64 bit machine. - (continue1): Use ffi_java_raw_call when appropriate. - - 2000-03-24 Warren Levy - - * java/math/BigInteger.java(divide): Handle the special case when - dividing by 1 and the high bit of the dividend is set. - (setShiftRight): Handle case when count == 0. - - 2000-03-24 Warren Levy ! * java/awt/Font.java(isBold): Fix syntax error. ! (isItalic): ditto. ! * java/awt/Frame.java(postEvent): ditto. ! * java/awt/Menu.java(postEvent): ditto. ! * java/awt/MenuBar.java(postEvent): ditto. ! * java/awt/Toolkit.java(init): Included a stub. ! 2000-03-21 Bryce McKinlay ! * java/awt/Event.java: Add all the event type constants. ! (Event): Implemented constructors. ! (controlDown): Implemented. ! (metaDown): Implemented. ! (paramString): Stubbed. ! (shiftDown): Implemented. ! (toString): Implemented. ! (translate): Implemented. ! 2000-03-21 Bryce McKinlay ! * java/lang/natClass.cc (isInstance): Initialize `this'. ! (isAssignableFrom): Initialize `this' and `klass'. ! (_Jv_IsAssignableFrom): If an interface has no idt, it is not ! implemented by any loaded class, so return false. ! * java/lang/natClass.cc (isInstance): Use _Jv_IsAssignableFrom(), ! not Class.isAssignableFrom(). Use JV_CLASS, not getClass(). ! 2000-03-19 Warren Levy ! * java/awt/Color.java: Specified java.io for Serializable. ! * java/awt/Toolkit.java: Imported java.net.URL. ! 2000-03-19 Warren Levy ! * java/awt/Color.java: Rewrote to be more memory efficient (& compile). ! 2000-03-16 Warren Levy - * java/awt/Color.java: New file. - * java/awt/Graphics.java: New file. - * java/awt/Image.java: New file. - * java/awt/Paint.java: New file. - * java/awt/PaintContext.java: New file. - * java/awt/Transparency.java: New file. - * java/util/Collection.java: New file. - * java/util/Comparator.java: New file. - * java/util/Iterator.java: New file. - * java/util/List.java: New file. - * java/util/ListIterator.java: New file. - * Makefile.am: Added above new files. * Makefile.in: Rebuilt. ! * java/awt/Font.java (PLAIN): New field. ! (BOLD): New field. ! (ITALIC): New field. ! (ROMAN_BASELINE): New field. ! (CENTER_BASELINE): New field. ! (HANGING_BASELINE): New field. ! (name): New field. ! (style): New field. ! (size): New field. ! (pointSize): New field. ! (Font): Implemented constructor. ! (isPlain): Implemented method. ! (isBold): Implemented method. ! (isItalic): Implemented method. ! (getName): Implemented method. ! (getStyle): Implemented method. ! (getSize): Implemented method. ! (getSize2D): Implemented method. ! (decode): Stubbed. ! * java/awt/Frame.java (getFont): Stubbed. ! (postEvent): Stubbed. ! (remove): Stubbed. ! * java/awt/Menu.java (postEvent): Stubbed. ! * java/awt/MenuBar.java (getFont): Stubbed. ! (postEvent): Stubbed. ! * java/awt/Toolkit.java (getImage): Added abstract method. ! 2000-03-15 Tom Tromey ! * java/io/natFileDescriptorWin32.cc (winerr): Now static. ! * prims.cc (win32_exception_handler): Reformatted. ! * include/win32-threads.h (_Jv_HaveCondDestroy): New define. ! (_Jv_HaveMutexDestroy): Likewise. ! 2000-03-15 Jon Beniston ! * java/io/natFileDescriptorWin32.cc: New file. ! * java/io/natFileWin32.cc: New file. ! * java/net/natInetAddress.cc: Added conditional inclusion of ! Windows / Winsock headers. ! * java/net/natPlainDatagramSocketImpl.cc: Added conditional ! inclusion of Windows / Winsock headers. ! * java/net/natPlainSocketImpl.cc: Added conditional inclusion of ! Windows / Winsock headers. ! * include/win32-signal.h: New file. ! * include/win32-threads.h: New file. ! * win32-threads.cc: New file. ! * exception.cc (win32_get_restart_frame): New function. ! * prims.cc (win32_exception_handler): New function. ! (main_init) Performs Winsock initialisation. ! (main_init) Installs exeception handler. ! 2000-03-14 Tom Tromey ! * jni.cc (mangled_name): Fixed assertion. ! (JNI_GetCreatedJavaVMs): Don't comment out `buf_len' argument; ! turned assert into actual failure. ! 2000-03-09 Warren Levy ! * java/security/Key.java(serialVersionUID): Set to 0 for now. ! * java/security/interfaces/DSAPrivateKey.java(serialVersionUID): Ditto. ! * java/security/interfaces/DSAPublicKey.java(serialVersionUID): Ditto. ! 2000-03-09 Warren Levy ! * java/security/AlgorithmParameterGeneratorSpi.java: New file. ! * java/security/DigestException.java: New file. ! * java/security/GeneralSecurityException.java: New file. ! * java/security/InvalidAlgorithmParameterException.java: New file. ! * java/security/InvalidKeyException.java: New file. ! * java/security/InvalidParameterException.java: New file. ! * java/security/Key.java: New file. ! * java/security/KeyException.java: New file. ! * java/security/KeyPair.java: New file. ! * java/security/KeyPairGenerator.java: New file. ! * java/security/KeyPairGeneratorSpi.java: New file. ! * java/security/NoSuchProviderException.java: New file. ! * java/security/PrivateKey.java: New file. ! * java/security/Provider.java: New file. ! * java/security/PublicKey.java: New file. ! * java/security/SecureRandom.java: New file. ! * java/security/Security.java: New file. ! * java/security/Signature.java: New file. ! * java/security/SignatureException.java: New file. ! * java/security/interfaces/DSAKey.java: New file. ! * java/security/interfaces/DSAParams.java: New file. ! * java/security/interfaces/DSAPrivateKey.java: New file. ! * java/security/interfaces/DSAPublicKey.java: New file. ! * java/security/interfaces/RSAPrivateCrtKey.java: New file. ! * java/security/interfaces/RSAPrivateKey.java: New file. ! * java/security/interfaces/RSAPublicKey.java: New file. ! * java/security/spec/AlgorithmParameterSpec.java: New file. ! * java/security/spec/InvalidKeySpecException.java: New file. ! * java/security/spec/InvalidParameterSpecException.java: New file. ! * java/security/spec/KeySpec.java: New file. ! * java/security/spec/RSAPrivateCrtKeySpec.java: New file. ! * java/security/spec/RSAPrivateKeySpec.java: New file. ! * java/security/spec/RSAPublicKeySpec.java: New file. ! * Makefile.am: Added above java.security files. ! * Makefile.in: Rebuilt. ! * java/security/MessageDigest.java: Rewritten. ! * java/security/SecureClassLoader.java: Added JDK1.2 comment. ! 2000-03-09 Bryce McKinlay ! * README: Updated. ! 2000-03-09 Bryce McKinlay ! * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Call ! _Jv_PrepareConstantTimeTables. ! * java/lang/natClass.cc (_Jv_PrepareConstantTimeTables): Array ! classes should have an IDT, so don't return if klass is an array ! class. ! 2000-03-08 Tom Tromey ! * java/lang/reflect/natArray.cc (newInstance): Don't allow array ! of `void' to be created. ! 2000-03-08 Warren Levy ! * java/math/BigInteger.java(signum): Handle zero properly. ! 2000-03-07 Tom Tromey ! * All files: Updated copyright information. ! * COPYING: New file. ! * COPYING.LIB: Removed. ! * LIBGCJ_LICENSE: We now use GPL + special exception. ! 2000-03-07 Bryce McKinlay ! * resolve.cc (_Jv_SearchMethodInClass): New function. ! (_Jv_ResolvePoolEntry): Search superinterfaces for interface methods. ! * java/lang/Class.h (_Jv_SearchMethodInClass): New prototype. ! 2000-03-07 Bryce McKinlay ! * java/lang/Class.h (union _Jv_IDispatchTable): New declaration. ! (struct _Jv_ifaces): New declaration. ! JV_CLASS: New macro definition. ! (getComponentType): Relocate below isArray() for inlining. ! (getModifiers): Declare `inline'. ! (getSuperclass): Ditto. ! (isArray): Ditto. ! (isPrimitive): Ditto. ! (_Jv_IsAssignableFrom): New prototype. ! (_Jv_LookupInterfaceMethodIdx): New prototype. Predeclare with "C" ! linkage. ! (_Jv_InitClass): Move from natClass.cc. Declare `inline'. ! Check for JV_STATE_DONE before invoking initializeClass(). ! (_Jv_PrepareConstantTimeTables): New prototype. ! (_Jv_GetInterfaces): Ditto. ! (_Jv_GenerateITable): Ditto. ! (_Jv_GetMethodString): Ditto. ! (_Jv_AppendPartialITable): Ditto. ! (_Jv_FindIIndex): Ditto. ! depth, ancestors, idt: New class fields. ! * java/lang/natClass.cc (isAssignableFrom): Move functionality to ! inline function `_Jv_IsAssignableFrom'. Use that function. ! (isInstance): Declare `inline'. ! (initializeClass): Get lock on class before checking `state'. Unlock ! before calling resolveClass0. Call _Jv_PrepareConstantTimeTables with ! the lock held. ! (_Jv_LookupInterfaceMethod): Use _Jv_GetMessageString. ! (_Jv_IsAssignableFrom): New inline function. Test assignability using ! class->depth and ancestor table. ! (_Jv_IsInstanceOf): Use _Jv_IsAssignableFrom. ! (_Jv_CheckCast): Move from prims.cc. Use JV_CLASS and ! _Jv_IsAssignableFrom. ! (_Jv_CheckArrayStore): Ditto. ! (_Jv_LookupInterfaceMethodIdx): New function. ! INITIAL_IOFFSETS_LEN, INITIAL_IFACES_LEN: New #defines. ! (_Jv_PrepareConstantTimeTables): New function. ! (_Jv_IndexOf): Ditto. ! (_Jv_GetInterfaces): Ditto. ! (_Jv_GenerateITable): Ditto. ! (_Jv_GetMethodString): Ditto. ! (_Jv_AppendPartialITable): Ditto. ! iindex_mutex, iindex_mutex_initialized: New static fields. ! (_Jv_FindIIndex): New function. ! * java/lang/natClassLoader.cc (_Jv_NewClass): Set new jclass fields. ! * prims.cc (_Jv_CheckCast): Moved to natClass.cc. ! (_Jv_CheckArrayStore): Ditto. ! (JvNewCharArray, JvNewBooleanArray, JvNewByteArray, JvNewShortArray, ! JvNewIntArray, JvNewLongArray, JvNewFloatArray, JvNewDoubleArray): ! Moved to gcj/array.h. ! (_Jv_Realloc): New function. ! * gcj/cni.h: Move _Jv_PrimClass definitions to gcj/array.h. ! * gcj/array.h: _Jv_PrimClass definitions moved from gcj/cni.h. ! (JvNewCharArray, JvNewBooleanArray, JvNewByteArray, ! JvNewShortArray, JvNewIntArray, JvNewLongArray, JvNewFloatArray, ! JvNewDoubleArray): Implementations moved from prims.cc and ! declared `inline'. ! * gcj/javaprims.h (_Jv_Realloc): Prototype. ! * include/jvm.h (_Jv_LookupInterfaceMethodIdx): Prototype. ! 2000-03-06 Tom Tromey ! * jni.cc (MARK_NONE): New define. ! (MARK_USER): Likewise. ! (MARK_SYSTEM): Likewise. ! (struct _Jv_JNI_LocalFrame): Made `marker' bigger and `size' ! smaller. ! (_Jv_JNI_DeleteLocalRef): Use MARK_NONE in assert. ! (_Jv_JNI_EnsureLocalCapacity): Use MARK_NONE. ! (_Jv_JNI_PushLocalFrame): Use MARK_USER. ! (_Jv_JNI_PopLocalFrame): New version with additional `stop' ! argument. ! (call): Use MARK_SYSTEM. ! (_Jv_GetJNIEnvNewFrame): New function. ! (_Jv_LookupJNIMethod): New function. ! (_Jv_JNI_PopSystemFrame): New function. ! (call): Use _Jv_JNI_PopSystemFrame and _Jv_LookupJNIMethod. ! 2000-03-05 Tom Tromey ! Fix for PR libgcj/43: ! * include/Makefile.in: Rebuilt. ! * include/Makefile.am (include_HEADERS): New define. ! 2000-03-05 Anthony Green ! * gcj/javaprims.h ("Java"): Remove FirstThread. ! * configure.host: Fix __NO_MATH_INLNES botch. ! * Makefile.in: Rebuilt. ! * Makefile.am (nat_source_files): Move natFirstThread.cc. ! (gnu/gcj/runtime/FirstThread.h): Moved. ! (ordinary_java_source_files): Move FirstThread.java. ! * prims.cc: Deal with FirstThread movement. ! (JvRunMain): Ditto. ! (_Jv_RunMain): Ditto. ! * gnu/gcj/runtime/FirstThread.java: Moved from java/lang. ! * gnu/gcj/runtime/natFirstThread.cc: Ditto. ! 2000-03-05 Warren Levy ! * java/net/DatagramSocket.java(DatagramSocket(int,InetAddress)): ! Handle null addresses. ! 2000-03-04 Anthony Green ! * configure.host (libgcj_flags): Define __NO_MATH_INLINES. ! See PR gcj/151. ! 2000-03-04 Anthony Green ! * configure: Rebuilt. ! * configure.in (ZLIBTESTSPEC): New macro. ! (GCTESTSPEC): New macro. ! (LIBGCJTESTSPEC): New macro. ! * libgcj-test.spec.in: New file. ! 2000-03-02 Tom Tromey - * include/java-interp.h: Don't include MethodInvocation.h. - (class _Jv_InterpMethod): Don't make MethodInvocation a friend. * Makefile.in: Rebuilt. ! * Makefile.am (gnu/gcj/runtime/MethodInvocation.h): Removed. ! (ordinary_java_source_files): Don't mention ! MethodInvocation.java. ! * gnu/gcj/runtime/MethodInvocation.java: Removed. ! * interpret.cc (MethodInvocation::continue1): Removed. ! (run): Handle exceptions here. ! * java/lang/ClassLoader.java (defineClass1, defineClass2): ! Removed. ! * java/lang/natClassLoader.cc (defineClass0): Catch exceptions ! here. ! (defineClass2): Removed. ! ! * java/lang/reflect/Method.java (hack_trampoline, hack_call): ! Removed. ! * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Catch ! exceptions here. ! (hack_call): Removed. ! ! * java/lang/Class.h (Class): Removed hackRunInitializers, ! hackTrampoline. ! * java/lang/natClass.cc (hackRunInitializers): Removed. ! (initializeClass): Catch exceptions here. ! Include ExceptionInInitializerError.h. ! * java/lang/Class.java (hackTrampoline, hackRunInitializers): ! Removed. ! ! * java/lang/Object.h (Object): Don't mention hack12_6. ! * java/lang/natObject.cc (_Jv_FinalizeObject): Catch exceptions ! here. ! * java/lang/Object.java (hack12_6): Removed. ! ! * java/lang/natThread.cc (run_): Renamed. Catch exceptions here. ! (start): Use run_, not run__. ! * java/lang/Thread.java (run_): Renamed from run__; old run_ ! removed. ! ! * jni.cc (_Jv_JNI_FindClass): Handle exceptions. ! (_Jv_JNI_EnsureLocalCapacity): Likewise. ! (_Jv_JNI_DefineClass): Likewise. ! (_Jv_JNI_ThrowNew): Likewise. ! (_Jv_JNI_AllocObject): Likewise. ! (_Jv_JNI_GetAnyMethodID): Likewise. ! (_Jv_JNI_CallAnyMethodV): Likewise. ! (_Jv_JNI_CallAnyMethodA): Likewise. ! (_Jv_JNI_CallAnyVoidMethodV): Likewise. ! (_Jv_JNI_CallAnyVoidMethodA): Likewise. ! (_Jv_JNI_GetAnyFieldID): Likewise. ! (_Jv_JNI_NewString): Likewise. ! (_Jv_JNI_NewStringUTF): Likewise. ! (_Jv_JNI_GetStringUTFChars): Likewise. ! (_Jv_JNI_NewObjectArray): Likewise. ! (_Jv_JNI_NewPrimitiveArray): Likewise. ! (_Jv_JNI_GetPrimitiveArrayRegion): Likewise. ! (_Jv_JNI_GetStringRegion): Likewise. ! (_Jv_JNI_GetStringUTFRegion): Likewise. ! (_Jv_JNI_SetPrimitiveArrayRegion): Likewise. ! (_Jv_JNI_MonitorEnter): Likewise. ! (_Jv_JNI_MonitorExit): Likewise. ! (_Jv_JNI_ToReflectedField): Likewise. ! (_Jv_JNI_ToReflectedMethod): Likewise. ! (_Jv_JNI_RegisterNatives): Likewise. ! (_Jv_JNI_AttachCurrentThread): Likewise. ! (_Jv_JNI_DestroyJavaVM): Likewise. ! ! 2000-02-28 Mo DeJong ! ! * java/util/zip/ZipOutputStream.java(closeEntry) : Fixed ! error caused by the incorrect casting of a long to an int. ! ! 2000-02-28 Mo DeJong ! ! * java/util/zip/ZipOutputStream.java(write_entry) : Fixed ! SIGSEV caused by use of the wrong instance variable. ! ! 2000-02-27 Bryce McKinlay ! ! * java/io/File.java (File(String, String)): For dirPath, treat an ! empty String the same as `null'. ! ! 2000-02-26 Anthony Green ! ! * gnu/gcj/io/MimeTypes.java: Test for null. ! ! * jni.cc (_Jv_JNI_AttachCurrentThread): Minor cleanup. ! (JNI_GetCreatedJavaVMs): Remove compiler warning. ! ! * java/net/URLConnection.java: Update copyright notice. ! ! 2000-02-25 Tom Tromey ! ! * jni.cc (_Jv_JNI_RegisterNatives): Conditionalize body on ! `INTERPRETER'. ! ! 2000-02-25 Bryce McKinlay ! ! * java/net/URLConnection.java (initializeDateFormats): New ! private method. ! (getHeaderFieldDate): Call initializeDateFormats if required. ! locale, dateFormat1, dateFormat2, dateFormat3: Don't initialize ! these. ! Fix for PR libgcj/38. ! ! 2000-02-24 Warren Levy ! ! * java/math/BigInteger.java(ival): Made private. ! (words): Ditto. ! (neg): Ditto. ! ! 2000-02-20 Anthony Green * Makefile.in: Rebuilt. ! * Makefile.am (ordinary_java_source_files): Add ! gnu/gcj/io/DefaultMimeTypes.java and gnu/gcj/io/MimeTypes.java ! ! * scripts/MakeDefaultMimeTypes.java: New file. ! * scripts/mime.types: New file. ! * scripts/classes.pl: Moved from top level. ! * classes.pl: Moved to scripts directory. ! ! * java/net/URLConnection.java: Implement guessContentTypeFromName. ! ! * gnu/gcj/io/MimeTypes.java: New file. ! * gnu/gcj/io/DefaultMimeTypes.java: New file. ! ! 2000-02-20 Tom Tromey ! ! * boehm.cc (_Jv_AllocBytes): Clear returned memory. ! ! 2000-02-19 Bryce McKinlay ! ! * java/util/zip/ZipEntry.java (setCrc): Fix overflow. ! (setSize): ditto. ! ! 2000-02-18 Tom Tromey ! ! * include/jvm.h (_Jv_GetJavaVM): Declare. ! * include/java-interp.h (_Jv_GetFirstMethod): New function. ! (_Jv_MethodBase::get_method): New method. ! (_Jv_JNIMethod::set_function): New method. ! * jni.cc (_Jv_JNI_UnregisterNatives): New function. ! (_Jv_JNI_RegisterNatives): New function. ! (_Jv_JNIFunctions): Updated for new functions. ! (_Jv_GetJavaVM): New function. ! (_Jv_JNI_GetJavaVM): Use it. Now static. ! (_Jv_JNI_AttachCurrentThread): Create a new JNIEnv if this thread ! is already a Java thread but does not have a JNIEnv yet. ! ! * java/lang/natRuntime.cc (_load): Pass the JavaVM to the onload ! function. ! ! 2000-02-17 Tom Tromey ! ! * gcj/field.h (_Jv_Field::getClass): Don't use JvAssert. ! Fixes PR gcj/152. ! ! 2000-02-16 Tom Tromey ! ! * jni.cc (_Jv_JNI_CallStaticMethodV): Added some assertions. ! ! * jni.cc (_Jv_JNI_NewObjectV): Corrected assertion. ! (_Jv_JNI_NewObject): Likewise. ! (_Jv_JNI_NewObjectA): Likewise. ! (_Jv_JNI_CallAnyMethodV): In constructor case, pass correct value ! as "return" type to _Jv_CallAnyMethodA. ! (_Jv_JNI_CallAnyMethodA): Likewise. ! (_Jv_JNI_CallAnyVoidMethodV): Likewise. ! ! * jni.cc (_Jv_JNI_FindClass): Use ClassLoader.loadClass, not ! findClass. ! ! 2000-02-15 Tom Tromey ! ! * resolve.cc (ncode): Set args_raw_size. Compute jni_cif and ! jni_arg_types. ! (init_cif): Added `rtype_p' argument. ! * include/java-interp.h (class _Jv_MethodBase): Added ! args_raw_size. ! (class _Jv_InterpMethod): Removed args_raw_size. ! (class _Jv_JNIMethod): Added jni_cif and jni_arg_types fields. ! * jni.cc (call): Pass JNIEnv and (for static methods only) the ! class pointer as well as the ordinary arguments. ! ! * jni.cc (mangled_name): Skip leading `(' in signature. ! ! * jni.cc (add_char): Added missing `else'. ! ! * jni.cc (_Jv_JNI_AttachCurrentThread): Return error if malloc ! fails. ! ! 2000-02-15 Bryce McKinlay ! ! * NEWS: Updated. ! ! * java/lang/natRuntime.cc (_load): Include library path with ! exception message. ! ! * java/lang/natSystem.cc (init_properties): set java.lang.classpath ! property. ! ! * java/lang/natThread.cc (dumpStack): Removed. ! * java/lang/Thread.java (dumpStack): Implemented. ! ! 2000-02-15 Tom Tromey ! ! * java/lang/natRuntime.cc (_load): On Unix, prefix library name ! with `lib' for loadLibrary. Fixes PR gcj/150. ! ! 2000-02-14 Warren Levy ! ! * gnu/gcj/math/MPN.java(findLowestBit): Made methods public. ! ! * java/math/BigInteger.java(BigInteger(int,int,java.util.Random): ! New constructor. ! (min): Implemented. ! (max): Implemented. ! (modPow): Rewritten to not use the naive, slow, brute force approach. ! (isProbablePrime): Implemented. ! (testBit): Implemented. ! (flipBit): Implemented. ! (getLowestSetBit): Implemented. ! 2000-02-16 Anthony Green ! * configure.host: Use the same options for i386 and i486 as we do ! for i586 and i686. ! 2000-02-12 Tom Tromey ! * java/io/File.java (createTempFile): Use low bits from counter, ! not high bits. ! Fri Feb 11 19:48:08 2000 Anthony Green ! * THANKS: More thanks. ! 2000-02-11 Tom Tromey ! * interpret.cc (continue1): Use STOREA, not STOREI, to implement ! astore instruction. From Hans Boehm. ! 2000-02-11 Warren Levy ! * java/math/BigInteger.java(BigInteger(String, int)): New constructor. ! (BigInteger(String)): New constructor. ! (not): Rewritten using version from Kawa's BitOps class. ! (valueOf): New private methods from Kawa's BitOps class. ! (swappedOp): ditto. ! (bitOp): ditto. ! (setBitOp): ditto. ! (and): Implemented. ! (or): Implemented. ! (xor): Implemented. ! (andNot): Implemented. ! (clearBit): Implemented. ! (setBit): Implemented. ! (bitCount): Implemented. ! (toByteArray): Implemented. ! 2000-02-11 Tom Tromey ! * java/io/File.java (nextValue): Now synchronized. ! 2000-02-10 Tom Tromey ! * java/io/natFileDescriptorPosix.cc (open): Recognize EXCL flag. ! * java/io/FileDescriptor.java (EXCL): New static field. ! * java/io/File.java (tmpdir): New static field. ! (createTempFile): New method. ! (nextValue): New method. ! * java/lang/natSystem.cc (init_properties): Set java.io.tmpdir ! property. ! * include/jni.h (JNI_FALSE): Renamed from JNI_TRUE; oops. ! (jboolean): Declare as an attributed int, not a bool. ! (_Jv_func): Declare differently for C. ! * gnu/gcj/jni/natNativeThread.cc: New file. ! * gnu/gcj/jni/NativeThread.java: New file. ! * java/lang/Thread.java (data): Now a RawData. ! * include/jvm.h (_Jv_GetCurrentJNIEnv, _Jv_SetCurrentJNIEnv): ! Declare. ! * Makefile.in: Rebuilt. ! * Makefile.am (java/lang/Thread.h): New target. ! (ordinary_java_source_files): Added NativeThread.java. ! (nat_source_files): Added natNativeThread.cc. ! * java/lang/natThread.cc: Include ! (struct natThread): Added `jni_env' field. ! (_Jv_GetCurrentJNIEnv): New function. ! (_Jv_SetCurrentJNIEnv): Likewise. ! (initialize_native): Initialize jni_env. ! Include RawData.h. ! * jni.cc (ThreadGroupClass): New define. ! (_Jv_JNI_InvokeFunctions): New structure. ! (JNI_GetCreatedJavaVMs): New function. ! (the_vm): New global. ! (JNI_GetDefaultJavaVMInitArgs): New function. ! Include NativeThread.h. ! (NativeThreadClass): New define. ! (_Jv_JNI_EnsureLocalCapacity): Return JNI_ERR, not -1. ! (_Jv_JNI_DestroyJavaVM): New function. ! (_Jv_JNI_AttachCurrentThread): New function. ! (_Jv_JNI_DetachCurrentThread): New function. ! (_Jv_JNI_GetEnv): New function. ! (JNI_CreateJavaVM): New function. ! (_Jv_JNI_GetJavaVM): New function. ! (_Jv_JNIFunctions): Added entry for GetJavaVM. ! * include/jni.h (JavaVMAttachArgs): New structure. ! (JNI_EDETACHED): New define. ! (JNI_EVERSION): Likewise. ! (JavaVM): Define properly. ! (struct JNIInvokeInterface): New structure. ! (class _Jv_JavaVM): New class. ! (JNI_OnLoad, JNI_OnUnload): Declare. ! (JNI_GetDefaultJavaVMInitArgs, JNI_CreateJavaVM, ! JNI_GetCreatedJavaVMs): Declare. ! (JavaVMInitArgs): New typedef. ! (JavaVMOption): Likewise. ! (JNI_ERR): New define. ! (JNI_OK): Likewise. ! 2000-02-10 Andrew Haley ! * interpret.cc: Don't include fdlibm.h. ! Replace #if with #ifdef throughout. ! Declare extern __ieee754_fmod. ! (continue1): Remove op_getfield, op_getstatic, op_putfield, ! op_putstatic insns. ! * resolve.cc (_Jv_PrepareClass): Use imeth as method pointer. ! Search class hierarchy for superclass vtable. ! * java/lang/natClassLoader.cc (_Jv_UnregisterClass): Don't fall ! off the end of a pointer list. ! * java/lang/natThread.cc (stop): Don't abort, throw an exception ! instead. ! (suspend): Ditto. ! 2000-02-09 Tom Tromey ! * java/lang/natRuntime.cc (_load): Call add_library. ! (loadLibraryInternal): Likewise. ! * gnu/gcj/convert/natIconv.cc (Input_iconv::finalize): Call ! iconv_close when handle is not NULL. Thanks to Andrew Haley. ! (Output_iconv::finalize): Likewise. ! 2000-02-08 Tom Tromey ! * java/util/Properties.java (setProperty): New method. ! (store): New method. ! 2000-02-07 Tom Tromey ! * java/lang/Runtime.java (_load): Declare. ! (load, loadLibrary): Wrote in terms of _load. ! * java/lang/natRuntime.cc (load): Call JNI_OnLoad if it appears in ! library. ! (loadLibrary): Likewise. ! Include . ! (_load): New method. ! (loadLibrary, load): Removed. ! * jni.cc (ThrowableClass): New define. ! (_Jv_JNI_Throw): Check argument. ! (_Jv_JNI_ThrowNew): Likewise. ! (wrap_value): Don't wrap object if it is NULL. ! (_Jv_JNI_DefineClass): Use wrap_value. ! (_Jv_JNI_FindClass): Likewise. ! (_Jv_JNI_GetSuperclass): Likewise. ! (_Jv_JNI_ExceptionOccurred): Likewise. ! (_Jv_JNI_AllocObject): Likewise. ! (_Jv_JNI_GetObjectClass): Likewise. ! (_Jv_JNI_NewString): Likewise. ! (_Jv_JNI_NewStringUTF): Likewise. ! (_Jv_JNI_NewObjectArray): Likewise. ! (_Jv_JNI_GetObjectArrayElement): Likewise. ! (_Jv_JNI_NewPrimitiveArray): Likewise. ! (_Jv_JNI_ToReflectedField): Likewise. ! (_Jv_JNI_ToReflectedMethod): Likewise. ! (_Jv_JNI_AllocObject): Check argument. ! (_Jv_JNI_NewObjectV): Likewise. ! (_Jv_JNI_NewObject): Likewise. ! (_Jv_JNI_NewObjectA): Likewise. ! (_Jv_JNI_GetObjectClass): Likewise. ! (_Jv_JNI_GetField): Likewise. ! (_Jv_JNI_SetField): Likewise. ! * interpret.cc (PUSHL): Don't use expression statement. ! (PUSHD): Likewise. ! (LOADL): Likewise. ! (STOREL): Likewise. ! * jni.cc (add_char): Conditional on INTERPRETER. ! (mangled_name): Likewise. ! (call): Likewise. ! * include/java-interp.h (class _Jv_MethodBase): Conditional on ! INTERPRETER. ! (class _Jv_JNIMethod): Likewise. ! 2000-02-04 Warren Levy ! * Makefile.am: Added MPN.java and BigInteger.java. * Makefile.in: Rebuilt. ! * gnu/gcj/math/MPN.java: New file. From Kawa by Per Bothner ! . ! * java/math/BigInteger.java: New file. Based primarily on ! Kawa's IntNum.java by Per Bothner . ! ! 2000-02-04 Tom Tromey ! ! * defineclass.cc (handleMethodsBegin): Allocate _Jv_MethodBase ! pointers. ! (handleMethodsEnd): Fixed error messages. Create a _Jv_JNIMethod ! if the method is native. ! * resolve.cc (ncode): Don't handle native methods. ! (_Jv_JNIMethod::ncode): New method. ! (_Jv_PrepareClass): Handle native methods. ! * jni.cc (call): Renamed from _Jv_JNI_conversion_call. ! Include AbstractMethodError.h. ! (add_char): New function. ! (mangled_name): Likewise. ! * include/java-interp.h (class _Jv_JNIMethod): New class. ! (class _Jv_MethodBase): New class. ! (class _Jv_InterpMethod): Derive from _Jv_MethodBase. ! (_Jv_InterpClass): Changed `interpreted_methods' field to type ! `_Jv_MethodBase'. ! ! * include/jvm.h (_Jv_FindSymbolInExecutable): Declare. ! * java/lang/natRuntime.cc (libraries_size, libraries_count, ! libraries): New globals. ! (add_library): New function. ! (_Jv_FindSymbolInExecutable): New function. ! ! * java/lang/natClassLoader.cc (initiated_classes, loaded_classes): ! Now static. ! ! 2000-02-04 Andrew Haley ! ! * java/lang/Throwable.java (CPlusPlusDemangler): New class. ! (printStackTrace): Use a CPlusPlusDemangler to demangle names. ! * java/lang/natThrowable.cc (printRawStackTrace): Rename ! printStackTrace to printRawStackTrace. ! ! 2000-02-03 Tom Tromey ! * java/util/Calendar.java (toString): New method. ! * java/util/SimpleTimeZone.java (clone): New method. ! (toString): New method. ! * java/util/TimeZone.java (clone): New method. ! * java/text/SimpleDateFormat.java (clone): New method. ! * java/text/NumberFormat.java (clone): New method. ! (equals): New method. ! * java/text/Format.java (clone): New method. ! * java/text/DateFormatSymbols.java (DateFormatSymbols): New ! constructor. ! (clone): New method. ! * java/text/DateFormat.java (clone): New method. ! * java/text/Collator.java (clone): New method. ! 2000-02-03 Tom Tromey ! * java/io/PipedOutputStream.java (write(byte[], int, int)): New ! method. ! 2000-02-01 Tom Tromey ! * include/java-interp.h (_Jv_JNI_conversion_call): Declare. ! * resolve.cc (ncode): Use _Jv_JNI_conversion_call when ! constructing the closure if the function is native. ! * jni.cc (_Jv_JNI_conversion_call): Now returns `void'. No longer ! a template function, #if'd out, or static. ! Include . ! * include/jni.h (class _Jv_JNIEnv): Corrected calls using `...'. ! * include/jni.h (class _Jv_JNIEnv): Added all C++ inline methods. ! * jni.cc (_Jv_JNI_PopLocalFrame): Leave loop when `n == NULL'. ! (_Jv_JNI_conversion_call): _Jv_JNI_PopLocalFrame will never leave ! `locals == NULL'. ! (wrap_value): New function. ! (_Jv_JNI_CallAnyMethodV): Use it. ! (_Jv_JNI_CallAnyMethodA): Likewise. ! (_Jv_JNI_GetField): Use wrap_value; removed specialized version. ! (_Jv_JNI_GetStaticField): Likewise. ! * jni.cc (_Jv_JNI_GetField): Specialize for jobject. ! (_Jv_JNI_GetStaticField): Likewise. ! 2000-01-31 Tom Tromey ! * prims.cc (_Jv_MallocUnchecked): New function. ! (main_init): Call _Jv_JNI_Init. ! * include/jvm.h (_Jv_MallocUnchecked): Declare. ! (_Jv_JNI_Init): Declare. ! * jni.cc: Include Hashtable.h, OutOfMemoryError.h, Integer.h, ! . ! (_Jv_JNI_NewGlobalRef): New function. ! (_Jv_JNI_DeleteGlobalRef): New function. ! (_Jv_JNI_DeleteLocalRef): New function. ! (_Jv_JNI_conversion_call): Initialize and clear local reference ! frame. ! (_Jv_JNI_NewLocalRef): New function. ! (struct _Jv_JNI_LocalFrame): New structure. ! (_Jv_JNI_PushLocalFrame): New function. ! (_Jv_JNI_EnsureLocalCapacity): New function. ! (FRAME_SIZE): New define. ! (_Jv_JNI_GetStringChars): Mark string, not characters. ! (_Jv_JNI_ReleaseStringChars): Unmark string, not characters. ! (_Jv_JNI_GetPrimitiveArrayElements): Mark array, not elements. ! (_Jv_JNI_ReleasePrimitiveArrayElements): Unmark array, not ! elements. ! (_Jv_JNI_DefineClass): Make return value a local ref. ! (_Jv_JNI_FindClass): Likewise. ! (_Jv_JNI_GetSuperclass): Likewise. ! (_Jv_JNI_ExceptionOccurred): Likewise. ! (_Jv_JNI_AllocObject): Likewise. ! (_Jv_JNI_GetObjectClass): Likewise. ! (_Jv_JNI_CallAnyMethodV): Likewise. ! (_Jv_JNI_NewString): Likewise. ! (_Jv_JNI_NewStringUTF): Likewise. ! (_Jv_JNI_NewObjectArray): Likewise. ! (_Jv_JNI_GetObjectArrayElement): Likewise. ! (_Jv_JNI_ToReflectedField): Likewise. ! (_Jv_JNI_ToReflectedMethod): Likewise. ! (_Jv_JNIFunctions): Updated table for new functions. ! (_Jv_JNI_Init): New function. ! (mark_for_gc): Wrote. ! (unmark_for_gc): Wrote. ! * include/jni.h (struct JNINativeInterface): Removed name from ! PopLocalFrame parameter. ! (class _Jv_JNIEnv): Added `locals' field. ! Mon Jan 31 00:43:15 2000 Anthony Green ! * gnu/gcj/convert/natIconv.cc (read): Minor fixes. ! (write): Ditto. ! 2000-01-30 Tom Tromey ! * include/config.h.in: Rebuilt. ! * acconfig.h (HAVE_ICONV): Define. ! * configure: Rebuilt. ! * configure.in: Check for `iconv' function. ! * gnu/gcj/convert/BytesToUnicode.java (getDecoder): Try iconv if ! no specific encoder exists. ! * gnu/gcj/convert/UnicodeToBytes.java (getEncoder): Try iconv if ! no specific encoder exists. ! * Makefile.in: Rebuilt. ! * Makefile.am (convert_source_files): Mention Input_iconv.java and ! Output_iconv.java. ! (nat_source_files): Added natIconv.cc. ! * gnu/gcj/convert/natIconv.cc: New file. ! * gnu/gcj/convert/Input_iconv.java: New file. ! * gnu/gcj/convert/Output_iconv.java: New file. ! 2000-01-28 Tom Tromey ! * Makefile.in: Rebuilt. ! * Makefile.am (LIBFFIINCS): Added MULTIBUILDTOP. ! 2000-01-26 Tom Tromey - * gcj/method.h (JvNumMethods): Moved from Class.h. - (JvGetFirstMethod): Likewise. - * java/lang/Class.h (Object): Updated decl of - _Jv_JNI_ToReflectedField. - (Object): Added _Jv_JNI_ToReflectedMethod as a friend. * Makefile.in: Rebuilt. ! * Makefile.am (java/lang/reflect/Field.h): Added `jboolean' ! argument of _Jv_JNI_ToReflectedField. ! (java/lang/reflect/Constructor.h): Added _Jv_JNI_ToReflectedMethod ! as a friend. ! (java/lang/reflect/Method.h): Likewise. ! * include/jni.h (class _Jv_JNIEnv): Added `klass' member. Use ! __GCJ_JNI_IMPL__. ! (jweak): New typedef. ! (struct JNINativeInterface): Correctly declare remaining entries. ! * jni.cc: Include Class.h, ClassLoader.h. ! (_Jv_JNI_FindClass): New function. ! (_Jv_JNI_DefineClass): New function. ! (_Jv_JNI_conversion_call): New function. ! (_Jv_JNI_FindClass): Use current class loader to find class. ! (_Jv_JNI_ExceptionCheck): New function. ! (_Jv_JNI_FromReflectedField): Now static. ! (MethodClass): New define. ! (_Jv_JNI_FromReflectedMethod): New function. ! (_Jv_JNI_ToReflectedMethod): Likewise. ! Include Method.h. ! (_Jv_JNI_IsAssignableFrom): Renamed. ! (_Jv_JNI_GetStringRegion): New function. ! Include StringIndexOutOfBoundsException.h. ! (_Jv_JNI_GetStringUTFRegion): New function. ! (_Jv_JNIFunctions): Updated for new functions. ! (_Jv_JNI_GetPrimitiveArrayCritical): New function ! (_Jv_JNI_ReleasePrimitiveArrayCritical): Likewise. ! (_Jv_JNI_GetStringCritical): New function. ! (_Jv_JNI_ReleaseStringCritical): Likewise. ! (get_throwable): Removed. ! (GCJ_JV_JNIENV_FRIEND): Removed. ! (__GCJ_JNI_IMPL__): Define. ! Include method.h. ! ! * resolve.cc (get_ffi_type_from_signature): Handle case where ! boolean is an int. ! ! Tue Jan 25 08:51:16 2000 Tom Tromey ! ! * interpret.cc (run): Don't call println. ! Don't include PrintStream.h. ! ! * gcj/field.h (struct _Jv_Field): Use "jshort" as type for ! nameIndex. Use "jint" as type for boffset. ! * java/lang/Class.h (struct _Jv_Method): Made accflags a ! _Jv_ushort. ! (Class): Likewise. Also changed type of method_count, ! vtable_method_count, size_in_bytes, field_count, ! static_field_count, interface_count. ! * gcj/array.h (__JArray): Made `length' a const jsize, not an ! int. ! ! 2000-01-21 Tom Tromey ! ! * java/lang/reflect/natConstructor.cc (newInstance): Use ! _Jv_CallAnyMethodA. ! * include/jvm.h: Declare _Jv_CallAnyMethodA. ! * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Renamed ! from _Jv_CallNonvirtualMethodA. Changed interface; overloaded. ! Include . ! (COPY): Removed. ! (invoke): Use _Jv_CallAnyMethodA. ! (VAL): Redefined. ! * java/lang/Class.h (Class): Declare JvGetFirstStaticField, ! JvNumStaticFields, JvNumMethods, and JvGetFirstMethod as friend ! functions. ! (struct _Jv_Method): Added getNextMethod method. ! (JvNumMethods): New function. ! (JvGetFirstMethod): Likewise. ! * gcj/field.h (JvGetFirstStaticField): New function. ! (JvNumStaticFields): Likewise. ! (getNextField): Renamed from getNextInstanceField. ! (struct _Jv_Field): New method getClass. ! * jni.cc: Wrote many new functions. ! * include/jni.h (JNI_TRUE): Define. ! (JNI_FALSE): Likewise. ! (jobject, jclass, jstring, jarray, jthrowable, jobjectArray, ! jbyteArray, jshortArray, jintArray, jlongArray, jbooleanArray, ! jcharArray, jfloatArray, jdoubleArray): New typedefs. ! (jfieldID, jmethodID): Likewise. ! (JNI_COMMIT, JNI_ABORT): New defines. ! (JNINativeMethod): New struct. ! (struct JNINativeInterface): Correctly declared more entries. ! (class _Jv_JNIEnv): Added `ex' member. ! (JNI_VERSION_1_1): New define. ! (JNI_VERSION_1_2): Likewise. ! ! * boehm.cc (_Jv_MarkObj): Use getNextField, not ! getNextInstanceField. ! ! 2000-01-20 Tom Tromey ! ! * resolve.cc (StringClass): Removed. ! * defineclass.cc (StringClass): Removed. ! ! 2000-01-19 Bryce McKinlay ! ! * NEWS: updated. ! ! 2000-01-19 Tom Tromey ! ! * interpret.cc (PC_REGISTER_ASM): Removed. ! ! * java/lang/natThrowable.cc: Don't use `#pragma implementation'. ! From Bryce McKinlay. ! ! * All files: Updated copyright to reflect Cygnus purchase. ! ! 2000-01-18 Bryce McKinlay ! ! * configure: Rebuilt. ! * configure.in: Recognize --disable-interpreter. ! ! 2000-01-18 Andrew Haley ! ! * name-finder.cc (lookup): Check for dladdr function. ! acconfig.h (HAVE_DLADDR): Add. ! configure.in: Check for HAVE_DLADDR ! configure: Rebuilt. ! include/config.h.in: Rebuilt. ! ! 2000-01-17 Andrew Haley ! ! * prims.cc (_Jv_RunMain): Set the name of this executable. ! ! 2000-01-17 Tom Tromey ! ! * java/lang/natThrowable.cc (fillInStackTrace): Return `this' even ! when backtrace can't be computed. ! ! * configure: Rebuilt. ! * configure.in: Fixed typo in AC_CONFIG_SUBDIRS call. ! ! * java/lang/Runtime.java (loadLibraryInternal): Declare. ! * java/lang/natClassLoader.cc (_Jv_FindClass): Removed dead copy. ! (_Jv_FindClassInCache): Likewise. ! (_Jv_FindClass): Don't conditionalize body on INTERPRETER. ! (findSystemClass): Try to load class from compiled module. ! Include Runtime.h. ! * java/lang/natRuntime.cc (load): Use UTF-8 copy of filename. ! (loadLibrary): Likewise. ! (lt_preloaded_symbols): Define. ! (loadLibraryInternal): New method. ! * include/config.h.in: Rebuilt. ! * acconfig.h (USE_LTDL): Added. ! * Makefile.am (SUBDIRS): Added $(DIRLTDL). ! (INCLUDES): Added $(INCLTDL). ! (libgcj_la_DEPENDENCIES): Added $(LIBLTDL). ! (libgcj_la_LIBADD): Likewise. ! * aclocal.m4, configure: Rebuilt. ! * configure.in: Added libltdl support. ! ! 2000-01-15 Tom Tromey ! ! * prims.cc (_Jv_PrimClass): Use `JV_STATE_NOTHING', not `0'. ! ! 2000-01-14 Andrew Haley ! ! * java/lang/natThrowable.cc: New file. ! ! * java/lang/Throwable.java (fillInStackTrace): Make native. ! (printStackTrace): Call native method to do this. ! (Throwable): Call fillInStackTrace. ! (stackTrace): New variable. ! ! * include/jvm.h: Add _Jv_ThisExecutable functions. ! * prims.cc: (_Jv_execName): New variable. ! (catch_segv): Call fillInStackTrace. ! (catch_fpe): Ditto. ! (_Jv_ThisExecutable): New functions. ! (JvRunMain): Set the name of this executable. - * Makefile.am: Add java/lang/natThrowable.cc. - Add name-finder.cc. * Makefile.in: Rebuilt. ! * acconfig.h: Add HAVE_PROC_SELF_EXE. ! ! * configure.in: Force link with __frame_state_for in ! FORCELIBGCCSPEC. Add new checks for backtrace. ! * include/config.h.in: Rebuilt. ! ! * name-finder.cc: New file. ! * include/name-finder.h: New file. ! ! 2000-01-16 Anthony Green ! ! * java/lang/StringBuffer.java (StringBuffer): Don't special case ! null argument. ! ! 2000-01-16 Jeff Sturm ! ! * java/io/StreamTokenizer.java (nextToken): Avoid unread(TT_EOF). ! ! 2000-01-13 Tom Tromey ! ! * java/lang/natClassLoader.cc (_Jv_FindClass): Register `loader', ! not system loader, as initiating loader. ! ! 2000-01-11 Tom Tromey ! ! * java/lang/natSystem.cc (getpwuid_adaptor): New adaptor for ! HP/UX. From David Scott Urban. ! ! 2000-01-10 Jeff Sturm ! ! * java/lang/natMath.cc (pow): Cast args to `double', not ! `jdouble'. ! (atan2): Likewise. ! (IEEEremainder): Likewise. ! * java/lang/mprec.h: Don't wrap includes in `extern "C"'. ! * java/lang/fdlibm.h: Don't wrap includes in `extern "C"'. ! ! 2000-01-09 Anthony Green ! ! * java/lang/natString.cc (init): Test for overflow condition ! during out of bounds check. ! (getChars): Throw StringIndexOutOfBoundsException, not ! ArrayIndexOutOfBoundsException. ! (getBytes): Ditto. ! (regionMatches): Obey case option during string comparison. ! ! * configure.host (ligcj_interpreter): New variable. Enable ! interpreter by default on IA-32. ! * configure.in: Examine libgcj_interpreter. ! * configure: Rebuilt. ! ! 2000-01-07 Tom Tromey ! ! * mauve-libgcj: Don't disable ClassTest. ! ! * java/lang/natClass.cc (getClasses): Wrote. ! 2000-01-06 Tom Tromey ! * java/lang/natClass.cc (_getConstructors): Correctly check ! whether method name is the init name. ! (getMethod): Look at accflags on method in `klass', not `this'. ! 2000-01-05 Tom Tromey ! * java/lang/natClass.cc (getMethod): Compute offset relative to ! `klass's methods table, not `this's table. ! * java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA): ! In unwrapping/widening case, check whether `k' is null, not ! whether it is primitive. Initialize `num' from `argelts', not ! `paramelts'. Correct create and pass arguments to ffi_call. ! Don't let presence of `this' argument affect index used to look in ! argument arrays. ! (COPY): Set appropriate element in `values' vector. ! * java/lang/natClass.cc: Include . ! * java/lang/Class.h (_getMethods): Correctly declare as private, ! not public. ! * java/lang/Class.h (_getMethods): Declare. ! * java/lang/Class.java (_getMethods): Declare. ! * java/lang/natClass.cc (getDeclaringClass): Always return NULL. ! (getDeclaredClasses): Always return empty array. ! (_getMethods): New method. ! (getMethods): Wrote. ! (getDeclaredMethod): Return `rmethod'. ! (finit_name): New global. ! (getDeclaredMethods): Check for finit_name. ! (_getMethods): Likewise. ! (getMethod): Only return public methods. ! * java/lang/reflect/natMethod.cc (get_ffi_type): Test size of ! jboolean and select correct ffi type on that basis. ! (_Jv_CallNonvirtualMethodA): Handle `void' return type. ! Constructor call always has `void' return type. ! 2000-01-04 Tom Tromey ! * java/lang/Class.h (getSignature): Updated. ! * java/lang/Class.java (getSignature): Updated. ! * java/lang/natClass.cc (getSignature): Added `is_constructor' ! argument. ! (getConstructor): Ensure constructor is public. ! (_getConstructors): Check for public-ness of constructor when ! `declared' is false, not when it is true. ! 2000-01-04 Warren Levy ! * java/net/natPlainDatagramSocketImpl.cc (peek): Removed unnecesary ! comment. ! (receive): Set the sender's address in the DatagramPacket. ! 2000-01-04 Tom Tromey ! * java/lang/reflect/natConstructor.cc (newInstance): Pass ! declaring class as return_type argument to ! _Jv_CallNonvirtualMethodA. ! * java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA): In ! constructor case, create object and use it as `this' argument. ! * java/lang/Class.h (_getConstructors): Declare. ! (_getFields): Declare. ! * java/lang/Class.java (getConstructors): Wrote. ! (_getConstructors): New native method. ! (getDeclaredConstructors): Wrote. ! (_getFields): Declare new native method. ! * java/lang/natClass.cc (_Jv_LookupInterfaceMethod): Removed ! incorrect comment. ! (getMethod): Work correctly when class is primitive. ! (getDeclaredMethods): Likewise. Compute offset using `method', ! not `mptr'. ! (getDeclaredMethod): Likewise. ! (getConstructor): Wrote. ! (ConstructorClass): New define. ! (getDeclaredConstructor): Wrote. ! (_getConstructors): New method. ! (_getFields): New method. ! (getFields): Wrote. ! * Makefile.in: Rebuilt. ! * Makefile.am (AM_CXXFLAGS): Added -D_GNU_SOURCE. ! * prims.cc: Remove `#pragma implementation'. ! * gcj/array.h: Remove `#pragma interface'. - * prims.cc (_Jv_equaln): New function. - * java/lang/Class.java (getSignature): Declare. - * resolve.cc (_Jv_LookupDeclaredMethod): Moved to natClass.cc. - * java/lang/natClass.cc (_Jv_LookupDeclaredMethod): Moved from - resolve.cc. - (getSignature): New method. - (getDeclaredMethod): Wrote. - (getMethod): Wrote. - Include StringBuffer.h. - * java/lang/Class.h (Class): Added _Jv_FromReflectedConstructor - as a friend. Unconditionally declare _Jv_LookupDeclaredMethod as - a friend. - (getSignature): Declare. - * include/jvm.h (_Jv_GetTypesFromSignature): Declare. - (_Jv_equaln): Declare. - (_Jv_CallNonvirtualMethodA): Declare. - * Makefile.in: Rebuilt. - * Makefile.am (nat_source_files): Added natConstructor.cc. - (java/lang/reflect/Constructor.h): New target. - * java/lang/reflect/natConstructor.cc: New file. - * java/lang/reflect/Constructor.java (newInstance): Now native. - (declaringClass): Renamed from decl_class. - (offset): Renamed from index. - (getType): New native method. - (getModifiers): Now native. - (getParameterTypes): Call getType if required. - (hashCode): Include hash code from declaring class. - (modifiers): Removed. - (toString): Call getType if required. - * gcj/method.h (_Jv_FromReflectedConstructor): New function. - * java/lang/reflect/natMethod.cc (hack_call): New method. - Removed `#if 0' around FFI code. - Include . - (invoke): Use _Jv_CallNonvirtualMethodA. Throw - IllegalArgumentException when argument object and class disagree. - (_Jv_GetTypesFromSignature): New function. - (getType): Use it. - (ObjectClass): New define. - (_Jv_CallNonvirtualMethodA): New function. - * java/lang/reflect/Method.java (hack_trampoline): New method. - (hack_call): New native method. --- 1,2495 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-09 Jakub Jelinek ! * testsuite/lib/libjava.exp (libjava_arguments): Append all ! multilib dirs containing libgcc_s*.so.1 below gcc object dir to ! LD_LIBRARY_PATH. ! 2002-05-08 Alexandre Oliva ! * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at ! script entry, and set LD to it when configuring multilibs. * configure: Rebuilt. ! 2002-05-03 Alexandre Oliva ! Suggested by Rainer Orth ! * Makefile.am (jv_convert_LDADD): Bring -L.libs to the front. ! (gij_LDADD, rmic_LDADD, rmiregistry_LDADD): Likewise. * Makefile.in: Rebuilt. ! 2002-05-02 Hans Boehm ! * include/dwarf2-signal.h (INIT_SEGV, INIT_FPE for ia64): ! use sigaction instead of __libc_sigaction. ! 2002-05-02 Rainer Orth ! * testsuite/lib/libjava.exp (libjava_find_spec): New function. ! (libjava_init): Use it to find libgcj.spec. ! (libjava_arguments): Likewise. ! 2002-05-02 David S. Miller ! PR bootstrap/6525 ! * include/dwarf2-signal.h (INIT_SEGV, INIT_FPE): Don't use ! __libc_sigaction on Sparc. ! 2002-04-25 David S. Miller ! PR target/6422 ! * include/dwarf2-signal.h (MAKE_THROW_FRAME for sparc*): Set ! program counter to next program counter minus 8. Update ! comments in this macro to explain why. ! 2002-04-22 Tom Tromey ! * gnu/gcj/natCore.cc (create): Use __builtin_alloca, and compute ! correct length of UTF-8 encoded name. Strip leading `/'. ! (_Jv_RegisterResource): Use _Jv_Malloc. ! 2002-04-23 Adam Megacz ! * win32.cc, include/win32.cc (backtrace): Added this function ! because Win32 does not supply it. ! 2002-04-21 David S. Miller ! * include/dwarf2-signal.h (MAKE_THROW_FRAME, sparc32): Document ! magic instruction reading sequence. ! 2002-04-21 Mark Wielaard ! * mauve-libgcj: Don't run java.lang.ref tests since they are buggy. ! 2002-04-19 David S. Miller ! * include/dwarf2-signal.h (SIGNAL_HANDLER): Name siginfo_t pointer ! arg. ! (MAKE_THROW_FRAME): Define for 32-bit and 64-bit sparc. ! (INIT_SEGV, INIT_FPE): Use direct __libc_sigaction installation ! on Sparc too. ! * include/sparc-signal.h (FLUSH_REGISTER_WINDOWS): Define properly ! for 64-bit sparc. ! (MAKE_THROW_FRAME): Use long for sp/retaddr so 64-bit works. ! * sysdeps/sparc/locks.h: New file. ! * configure.in (SIGNAL_HANDLER): Set to include/sparc-signal.h ! on all sparc Solaris configurations. Set to ! include/dwarf2-signal.h on sparc Linux. ! * configure: Regenerate ! * configure.host (can_unwind_signal): sparc*-linux* can do it now. ! 2002-04-19 Hans Boehm * configure: Rebuilt. + * configure.in (backtrace): Function doesn't work on IA-64. ! 2002-04-17 Adam King ! * java/io/File.java (normalizePath): Add Win32 support for auto ! conversion of a '/' path separator to Win32's '\' separator. ! 2002-04-16 DJ Delorie ! * configure.in: Allow building in $srcdir. ! * configure: Regenerated. ! 2002-04-16 Tom Tromey ! Fix for PR libgcj/6081: * Makefile.in: Rebuilt. ! * Makefile.am (install-data-local): Use GNU make trick to avoid ! shell limit. ! 2002-04-16 Adam King Tom Tromey ! * java/io/natFileWin32.cc (performList): Return the correct array ! type. Don't duplicate the creation of a File since it's already ! done earlier in the method and the existing code would cause a ! ArrayStoreException. Don't use fixed-size array. ! (_access, _stat, attr, getCanonicalPath, performMkdir, ! performRenameTo): Don't use fixed-size array. ! (getCanonicalPath): Use throw, not _Jv_Throw. ! ! 2002-04-15 Mark Wielaard ! * java/lang/Integer.java (getInteger(String,Integer): Return def when ! nm is null or the empty String. ! 2002-04-14 Mark Wielaard ! * java/net/natPlainDatagramSocketImpl.cc (close): Set timeout to 0. ! * java/net/natSocketImpl.cc (close): Likewise. ! 2002-04-14 Mark Wielaard ! * gnu/gcj/protocol/http/Connection.java (usingProxy): return false. ! 2002-04-13 Adam King ! * java/lang/natDouble.cc (parseDouble): Allow a number to end with ! the f/F/d/D modifiers. ! 2002-04-11 Tom Tromey ! * win32.cc (_Jv_platform_initProperties): Fix spelling of _Jv_Free. ! 2002-04-11 Bryce McKinlay ! * configure.host: Set can_unwind_signal on hosts which support it. ! Don't set CHECKREFSPEC and DIVIDESPEC for FreeBSD. ! * configure.in: Set CHECKREFSPEC and DIVIDESPEC if not using SJLJ ! exceptions and can_unwind_signal isn't set. * configure: Rebuilt. + + 2002-04-11 Adam King + Tom Tromey ! * include/jvm.h (_Jv_ThrowBadArrayIndex, ! _Jv_ThrowNullPointerException): Mark as noreturn. ! * win32.cc (_Jv_platform_initProperties): Use _Jv_MallocUnchecked ! and _Jv_free. Correctly invoke GetTempPath(). Indentation ! fixes. ! 2002-04-09 Anthony Green + * Makefile.am (jardir, jar_DATA): Define (for libgcj.jar). + Create libgcj-@gcc_version@.jar instead of libgcj.jar. * Makefile.in: Rebuilt. ! * configure.in: Substitute gcc_version. * configure: Rebuilt. ! 2002-04-09 Tom Tromey ! * win32.cc (_Jv_platform_initProperties): Use GetTempPath. ! 2002-04-05 Adam Megacz ! * exception.cc (abort): added static modifier ! 2002-04-08 Alberto Biancardi ! Fix for PR libgcj/6187: ! * java/awt/geom/Point2D.java (distance): Call distanceSq, not ! distance. ! 2002-04-07 Mark Wielaard ! * java/util/AbstractMap.java (putAll): Use entrySet size. ! (toString): Explicitly use getKey() and getValue(). ! 2002-04-07 Mark Wielaard ! * java/util/Hashtable.java (contains): Remove NullPointer check. ! (containsValue): Add NullPointer check. ! (remove): Always throw NullPointerException when key is null. ! 2002-04-07 Adam King ! * java/lang/natSystem.cc (init_properties): Call new function ! _Jv_platform_initProperties. ! * win32.cc (_Jv_platform_initProperties): New function that adds Win32 ! support for the System properties os.name, os.arch, os.version, ! user.name, user.home, and user.dir. ! * include/posix.h, include/win32.h, posix.cc: New function ! _Jv_platform_initProperties. ! 2002-04-06 Mark Wielaard ! * java/lang/Character,java (isDefined): getType() != UNASSIGNED. ! 2002-04-06 Mark Wielaard ! * java/util/ArrayList.java (addAll(int,Collection)): System.arraycopy ! all of the remaining elements. ! * java/util/Vector.java (addAll(int,Collection)): Likewise. ! (removeRange): If toIndex == fromIndex do ! nothing, if toIndex < fromIndex throw IndexOutIfBoundsException. ! (removeAll): Always throw NullPointerException when collection is ! null. ! (retrainAll): Likewise. ! 2002-04-05 Mark Wielaard ! * java/util/ArrayList.java (removeRange): If toIndex == fromIndex do ! nothing, if toIndex < fromIndex throw IndexOutIfBoundsException. ! 2002-04-04 Adam Megacz ! * include/win32.h (_Jv_platform_close_on_exec): added inline ! modifier. ! 2002-04-04 Loren J. Rittle ! * configure.host: Add case statement to support generic port ! properties. Add *-*-freebsd* section. ! 2002-04-04 Mark Wielaard ! * mauve-libgcj: Add JLS1.0 and JLS1.1 tags, ignore Character.unicode ! test. ! * testsuite/libjava.mauve/xfails: Remove working tests DoubleTest, ! FloatTest and ObjectStreamClass. Add FAIL for Introspector.jdk11 tests ! that depend on awt code and BufferedByteOutputStream.interrupt. ! 2002-04-04 Bryce McKinlay ! * java/util/Arrays.java (qsort): Fix off-by-one errors and use of ! incorrect "hi" value when count > 40. ! 2002-04-03 Mark Wielaard ! * java/lang/reflect/Modifier.java (toString(int,StringBuffer)): Fix ! ordering. ! 2002-04-02 Mark Wielaard ! * java/lang/Long.java (getLong(String,Long)): Actually decode property ! value, not key. ! 2002-04-02 Tom Tromey ! * java/lang/natClassLoader.cc (findClass): Compare against `3', ! not `0'. ! 2002-04-02 Mark Wielaard ! * mauve-libgcj: add java.net.DatagramSocket.DatagramSocketTest2 to ! list of testsuite crashers. ! 2002-04-02 Bryce McKinlay ! * java/util/IdentityHashMap.java (put): Set new threshold correctly ! when resizing table. ! 2002-04-01 Loren J. Rittle ! * include/posix-threads.h: Support <.../pal.h> on FreeBSD/alpha. ! 2002-04-01 Mark Wielaard ! * java/util/BitSet.java (BitSet(int)): if nbits < 0 throw ! NegativeArraySizeException ! (clear(int)): Use sign extended shift. ! (flip(int)): Likewise. ! (get(int)): Likewise. ! (nextClearBit(int)): Likewise. ! (nextSetBit(int)): Likewise. ! (set(int)): Likewise. ! 2002-04-01 Mark Wielaard ! * java/lang/Integer.java (decode): Throw NullPointerException when ! argument is null. A minus sign can precede other leading characters. ! 2002-04-01 Mark Wielaard ! * mauve-libgcj: Add JDK1.3, JDK1.4, JLS1.2 tests, remove ignored tests ! that can be compiled now and add testsuite crashers to ignore list. ! 2002-03-31 Alexandre Oliva ! * libgcj.spec.in, libgcj-test.spec.in: Revert for now. ! * libgcj.spec.in: Override libgcc, not lib. ! * libgcj-test.spec.in: Likewise. ! 2002-03-29 Tom Tromey ! * java/net/natPlainDatagramSocketImpl.cc (close): New function. ! * java/net/natPlainSocketImpl.cc (close): Indentation fix. ! 2002-03-27 Jeff Sturm ! * java/net/PlainDatagramSocketImpl.java ! (close): Use native implementation. ! (finalize): New method. ! * java/net/PlainSocketImpl.java (finalize): New method. ! * java/net/natPlainDatagramSocketImpl.cc ! (java/io/FileDescriptor.h): Don't include. ! (close): Implement method here. ! (create): Don't assign fd. ! * java/net/natPlainSocketImpl.cc ! (java/io/FileDescriptor.h): Don't include. ! (create): Don't assign fd. ! (accept): Likewise. ! (close): Synchronize. ! 2002-03-25 Andrew Haley , Hans Boehm ! * include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64. ! (INIT_SEGV, INIT_FPE): Add versions that use __libc_sigaction ! instead of syscall on IA-64. ! Add FIXME comment. ! ! 2002-03-27 Anthony Green ! * libgcj.spec.in: Add CHECKREFSPEC. ! * configure.in: Ditto. ! * configure.host: Ditto. Check references for xscale-elf. * configure: Rebuilt. ! 2002-03-25 Hans Boehm ! * include/dwarf2-signal.h: Temporarily back out last change. ! 2002-03-25 Andrew Haley , Hans Boehm ! * configure.in, configure: enable dwarf2-exception-style ! exception handling on IA-64. ! * include/dwarf2-signal.h (MAKE_THROW_FRAME): Add for IA-64. ! (INIT_SEGV, INIT_FPE): Use __libc_sigaction instead of syscall. ! Add FIXME comment. ! ! 2002-03-25 Tom Tromey ! * Makefile.am (libgcj_la_LDFLAGS): Use THREADLDFLAGS. ! (jv_convert_LDFLAGS): Likewise. ! (gij_LDFLAGS): Likewise. ! (rmic_LDFLAGS): Likewise. ! (rmiregistry_LDFLAGS): Likewise. ! * configure.in (THREADLDFLAGS): New subst; set correctly for ! *BSD. ! 2002-03-25 Tom Tromey ! For PR libgcj/5303: ! * gnu/java/rmi/registry/RegistryImpl.java (main): Recognize --help ! and --version. ! (help): New method. ! (version): Likewise. ! * gnu/gcj/convert/Convert.java (version): Removed extraneous ! "GNU". ! * gnu/java/rmi/rmic/RMIC.java (parseOptions): Removed extraneous ! "GNU". ! 2002-03-24 Bryce McKinlay ! * java/io/PushbackReader.java: Reformat. ! * java/io/FileInputStream.java (skip): Call fd.getFilePointer() and ! calculate correct number of bytes skipped. ! Based on patch from Intel's ORP team: ! * java/io/PushbackInputStream.java (available): Calculate correct ! number of bytes in buffer. ! (read): Remove redundant bound check. Return bytes from both the ! buffer and the stream. ! 2002-03-24 Eric Blake ! * java/beans/IntrospectionException.java: Update to 1.4. ! * java/beans/PropertyVetoException.java: Ditto. ! 2002-03-24 Eric Blake ! * gnu/java/beans/BeanInfoEmbryo.java (hasMethod): Use ! Arrays.equals instead of ArrayHelper.equalsArray. ! 2002-03-24 C. Brian Jones ! * java/beans/Introspector.java: added new static final fields ! introduced in 1.2, lots of other updates remain to be done ! 2002-03-24 C. Brian Jones ! * java/beans/Introspector.java: reformatting ! 2002-03-24 C. Brian Jones ! * java/beans/Introspector.java: default beanInfoSearchPath will ! not include sun.beans.infos given we provide no such package and ! the API doesn't really require it; gnu.java.beans.info is the ! default. ! 2002-03-24 Mark Wielaard ! Thanks to Orp developers ! * gnu/java/beans/editors/NativeBooleanEditor.java (setAsText(String)): ! switch TRUE and FALSE return values. ! 2002-03-23 Tom Tromey ! * include/name-finder.h (_Jv_name_finder::myclose): New method. ! * name-finder.cc (_Jv_name_finder): Initialize file descriptors. ! 2002-03-23 Michael Smith ! * java/util/GregorianCalendar.java (minimums, maximums): Correct ! MONTH entry. Fixes PR libgcj/6045. ! 2002-03-23 Jeff Sturm ! * java/nat/natPlainSocketImpl.cc (write): Abort loop on error. ! 2002-03-20 Bryce McKinlay ! * posix-threads.cc (_Jv_ThreadSelf_out_of_line): Use write_barrier, ! not release_set. ! * sysdep/powerpc/locks.h (write_barrier): New function. ! * sysdep/i386/locks.h (write_barrier): New function. ! 2002-03-19 Martin Kahlert ! * include/jni.h Use correct C comments ! 2002-03-18 Tom Tromey ! * include/jni.h (JNIIMPORT): New macro. ! (JNIEXPORT): Likewise. ! (JNICALL): Likewise. ! 2002-03-18 Andrew Haley ! * include/i386-signal.h (old_i386_kernel_sigaction): New. ! INIT_SEGV: Use old_i386_kernel_sigaction. ! INIT_FP: Likewise. ! 2002-03-18 Bryce McKinlay ! * java/lang/natSystem.cc (init_properties): Update VM version ! properties. ! * configure.in: Set GCJVERSION. ! * acconfig.h: Add GCJVERSION. * configure: Rebuilt. * include/config.h.in: Rebuilt. ! 2002-03-17 Anthony Green ! * java/lang/ieeefp.h: Add ARM thumb support (copied from newlib). ! 2002-03-17 Bryce McKinlay ! Build a single libgcj.so, without separate gc and zlib libraries. ! * configure.in: Use convenience libraries for boehm-gc and zlib. Set ! SYS_ZLIBS if system zlib is used. * configure: Rebuilt. ! * Makefile.am: Use boehm-gc and zlib convenience libraries. * Makefile.in: Rebuilt. ! * libtool-version: Increment .so version number. ! 2002-03-16 Bryce McKinlay ! * Makefile.am: Use empty -classpath flag in addition to -bootclasspath. * Makefile.in: Rebuilt. ! 2002-03-15 Anthony Green ! * configure.host (FILE): New macro for specifing File ! implementation. * configure: Rebuilt. ! * configure.in: Use FILE. Define HAVE_TIME for newlib targets. ! 2002-03-15 Alexandre Oliva ! * Makefile.am (jv_convert_LDADD): Don't list libraries that are ! already implicitly brought in from libgcj.la. ! (gij_LDADD, rmic_LDADD, rmiregistry_LDADD): Likewise. * Makefile.in: Rebuilt. ! 2002-03-15 Eric Blake ! * THANKS: Fix punctuation, alphabetization. ! 2002-03-15 Tom Tromey ! Rainer Orth ! Fix for PR libgcj/5944. ! * gnu/gcj/io/shs.h: Define uint8_t and uint32_t. ! 2002-03-15 Anthony Green ! * configure.in (tool_include_dir): Define. * configure: Rebuilt. ! * gcj/Makefile.am: Install libgcj-config.h relative to ! tool_include_dir. ! * gcj/Makefile: Rebuilt. ! * gcj/libgcj-config.h: Add warning comment. ! * Makefile.am: Escape quotes in echo. * Makefile.in: Rebuilt. ! 2002-03-12 Andreas Tobler ! * configure.host (powerpc*-darwin*): Enable interpreter. ! 2002-03-10 Bryce McKinlay ! * include/posix.h: Add multiple include header protection. ! 2002-03-10 Adam Megacz ! * java/net/natPlainSocketImpl.cc: Removed #include "posix.h". ! 2002-03-10 Adam Megacz ! * java/net/natPlainSocketImpl.cc: Added #include . ! 2002-03-10 Tom Tromey ! * java/lang/Win32Process.java: Added comment. ! * include/posix.h (_Jv_platform_close_on_exec): New function. ! Include fcntl.h. ! * include/win32.h (_Jv_platform_close_on_exec): New function. ! * java/net/natPlainSocketImpl.cc (create): Set close-on-exec ! flag. (accept): Likewise. ! * java/net/natPlainDatagramSocketImpl.cc (create): Set ! close-on-exec flag. ! * java/io/natFileDescriptorPosix.cc (open): Set close-on-exec ! flag. ! 2002-03-09 Tom Tromey ! * verify.cc (state::NO_STACK): New constant. ! (state::is_unmerged_ret_state): Handle case where stacktop is ! NO_STACK. ! (state::merge): Handle NO_STACK merges. ! (handle_jsr_insn): Invalidate PC, and use special NO_STACK state ! for instruction following jsr. ! (stacktop, stackdepth): Removed unused variables. ! (pop_jump): Ignore case where all remaining states are skipped. ! 2002-03-09 Bryce McKinlay ! * java/awt/ImageMediaEntry: Removed. ! * java/awt/MediaEntry: Removed. ! 2002-03-09 Adam Megacz ! * java/io/natFileDescriptorWin32.cc (read): Return -1 if zero ! bytes read and no failure code returned. ! 2002-03-09 Bryce McKinlay ! Hashtable synchronization for PowerPC. ! * configure.in: Define SLOW_PTHREAD_SELF if configure.host set ! slow_pthread_self. Set up symlink for sysdeps directory. ! * configure: Rebuild. ! * configure.host: Document more shell variables. Set sysdeps_dir ! for most platforms. Set slow_pthread_self for i686. Set ! enable_hash_synchronization_default and slow_pthread_self for PowerPC. ! * posix-threads.cc (_Jv_ThreadSelf_out_of_line): Use release_set so ! that memory barrier is emitted where required. ! * prims.cc: 64-bit align static primitive class instances. ! * include/posix-threads.h (_Jv_ThreadSelf for SLOW_PTHREAD_SELF): Add ! read_barrier() to enforce ordering of reads. ! * sysdep/powerpc/locks.h: New file. Implementation of synchronization ! primitives for PowerPC. ! * sysdep/i386/locks.h: New file. Synchronization primitives for i386 ! moved from natObject.cc. ! * sysdep/alpha/locks.h: Likewise. ! * sysdep/ia64/locks.h: Likewise. ! * sysdep/generic/locks.h: Likewise. ! * java/lang/natObject.cc: Move thread synchronization primitives to ! system-dependent headers. ! 2002-03-09 Adam Megacz ! * win32.cc (_CRT_MT, __mingwthr_key_dtor) Added fake ! definitions to simulate -mthreads. ! 2002-03-09 Adam Megacz ! * win32.cc (_Jv_platform_gettimeofday) Cast 1000 to long long to ! avoid precision loss. ! 2002-03-09 Per Bothner ! * gnu/gcj/xlib/WindowAttributes.java Assign null to RawData, not 0. ! * gnu/gcj/xlib/XImage.java: Likewise. ! * gnu/gcj/xlib/XColor.java: Likewise. ! 2002-03-09 Adam Megacz ! * java/lang/Win32Process.java (ConcreteProcess): Now throws an ! IOException so that Throwable.printStackTrace fails correctly. ! 2002-03-08 Adam Megacz ! * java/net/natPlainSocketImpl.cc (read, write, close): Formatting ! fixed. ! ! 2002-03-09 Bryce McKinlay ! * posix.cc (_Jv_platform_gettimeofday): Make sure result doesn't get ! truncated to int. ! 2002-03-08 Tom Tromey ! * include/jni.h: Include stdio.h. ! 2002-03-08 Tom Tromey ! * posix.cc (internal_gettimeofday): New function. ! (_Jv_select): Use it. ! 2002-03-07 Adam Megacz ! * java/lang/natSystem.cc (currentTimeMillis): Now uses updated ! _Jv_platform_gettimeofday signature. ! ! 2002-03-07 Adam Megacz ! * win32.cc (_Jv_platform_gettimeofday): Now takes no args, ! returns jlong. Added implementation ! * posix.cc (_Jv_platform_gettimeofday): Now takes no args, ! returns jlong. ! * win32.h (_Jv_platform_gettimeofday): Now takes no args, ! returns jlong. ! * posix.h (_Jv_platform_gettimeofday): Now takes no args, ! returns jlong. ! * java/lang/natSystem.cc (currentTimeMillis): Now uses updated ! _Jv_platform_gettimeofday signature. ! 2002-03-07 Adam Megacz ! * java/net/natPlainSocketImpl.cc: Changed USE_WINSOCK to ! WIN32, and added thunks for read(), write(), and close(). ! * java/net/natPlainSocketImpl.cc (accept, read, read): ! Disabled timeouts on WIN32 pending discussion. ! 2002-03-07 Adam Megacz ! * java/io/FileDescriptor.java: Initialize in/out/err in init(). ! * java/io/natFileDescriptorWin32.cc (init()): Added function. ! * java/io/natFileDescriptorPosix.cc (init()): Added function. ! * java/io/natFileDescriptorEcos.cc (init()): Added function. ! 2002-03-07 Bryce McKinlay ! * java/net/natPlainSocketImpl.cc (_Jv_recv): Removed. ! (read): Call recv() directly, not _Jv_recv(). ! 2002-03-06 Tom Tromey ! * include/config.h.in: Rebuilt. * configure: Rebuilt. * Makefile.in: Rebuilt. ! 2002-03-06 Eric Blake ! * scripts/unicode-decomp.pl: Move from chartables.pl, and remove ! the code for generating include/java-chartables.h. ! * scripts/unicode-blocks.pl: Move from scripts/blocks.pl, and ! merge with Classpath. ! * scripts/unicode-muncher.pl: Copy from Classpath. ! * scritps/MakeCharTables.java: New file. ! * gnu/gcj/convert/Blocks-3.txt: New file. ! * gnu/gcj/convert/UnicodeData-3.0.0.txt: New file. ! * gnu/gcj/convert/UnicodeCharacterDatabase-3.0.0.html: New file. ! * gnu/java/lang/CharData.java: Copy from Classpath. ! * Makefile.am (ordinary_java_source_files): Add ! gnu/java/lang/CharData.java. ! * configure.in: Remove --enable-fast-character option. ! * java/lang/Character.java: Merge algorithms and Javadoc with ! Classpath. ! * java/lang/natCharacter.cc: Implement Unicode lookup table more ! efficiently. ! * include/java-chardecomp.h: Regenerate. ! * include/java-chartables.h: Regenerate. ! 2002-03-06 Bryce McKinlay ! * java/awt/MediaTracker.java: Implemented. ! * Makefile.am: Add MediaTracker. * Makefile.in: Rebuilt. ! 2002-03-05 Tom Tromey ! * java/lang/natPosixProcess.cc (fail): Removed. ! (startProcess): Simplified error-handling. Preserve ! LD_LIBRARY_PATH across exec. ! 2002-03-05 Tom Tromey ! * jni.cc (_Jv_LookupJNIMethod): Throw UnsatisfiedLinkError, not ! AbstractMethodError. ! 2002-03-04 Adam Megacz ! * java/net/natInetAddress.cc: Changed USE_WINSOCK to WIN32, added ! '#undef STRICT'. ! 2002-03-03 Bryce McKinlay ! * Makefile.am: Use -bootclasspath, not -CLASSPATH. * Makefile.in: Rebuilt. ! 2002-03-03 Mark Wielaard ! * java/util/Timer (TaskQueue.stop): set elements to zero. ! 2002-02-28 Anthony Green ! * java/lang/reflect/natMethod.cc (result): Add void* element. ! (_Jv_CallAnyMethodA): Handle FFI_TYPE_POINTER arguments. Move ! constructor test. ! 2002-02-26 Tom Tromey ! * java/lang/natSystem.cc (init_properties): Use __VERSION__. ! * gij.cc (version): Use __VERSION__. ! * include/config.h.in: Rebuilt. ! * acconfig.h (GCJVERSION): Removed. ! * configure: Rebuilt. ! * configure.in (GCJVERSION): Removed. ! 2002-02-26 Andreas Schwab ! * acinclude.m4 (LIB_AC_PROG_CXX): Use glibjava_CXX instead of ! glibcpp_CXX, since libjava uses even another CXX. ! * aclocal.m4, configure: Regenerated. ! 2002-02-26 Tom Tromey ! * java/lang/natPosixProcess.cc (startProcess): Use FD_CLOEXEC, not ! `1'. ! 2002-02-25 Bryce McKinlay ! * Makefile.am (GCJCOMPILE): Use -fCLASSPATH not -fclasspath. Fixes ! dependency tracking for .java files. * Makefile.in: Rebuilt. ! 2002-02-24 Adam Megacz ! * java/net/natPlainDatagramSocketImpl.cc: whops; removed 'make' ! typo. Sorry. ! 2002-02-24 Adam Megacz ! * java/net/natPlainDatagramSocketImpl.cc: Updated #includes ! for Win32, changed #ifdefs to check WIN32 instead of the ! (now-obsolete) USE_WINSOCK, and removed support for socket ! timeouts on Win32 pending further discussion. ! 2002-02-24 Adam Megacz ! * win32-threads.cc (_Jv_ThreadInitData): _Jv_Malloc instead of new ! * win32-threads.cc (_Jv_ThreadDestroyData): _Jv_Free instead of ! delete ! 2002-02-24 Adam Megacz ! * java/lang/Win32Process.java: Created a dummy class to allow ! build process to run to completion. ! 2002-02-24 Jeff Sturm ! * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): ! Define ffi_result union for ffi_call result. Cast ! ffi_result members to jvalue. ! ! 2002-02-23 Alexandre Oliva ! * Makefile.in, gcj/Makefile.in, include/Makefile.in: Rebuilt. ! * testsuite/Makefile.in: Likewise. ! 2002-02-20 Per Bothner ! * java/net/URL.java (getPath): New JDK 1.3 method. ! * java/net/URLStreamHandler.java (parseURL): ! It is wrong to prepend '/' to the file part of a relative url. ! * java/net/URLStreamHandler.java (parseURL): ! Minor optizations - append '/' rather than "/". ! * java/net/URLStreamHandler.java (parseURL): ! Don't canonicalize "xx/.." or "./" URLs - JDK doesn't. ! We probably should canonicalize for a context-relative url, though. ! * java/net/URL.java (sameFile): Delegate to URLStreamHandler. ! * java/net/URLStreamHandler.java (canonicalizeFilename): New helper. ! (sameFile): New method. Uses canonicalizeFilename. ! 2002-02-22 Tom Tromey ! * java/lang/natSystem.cc (init_properties): Include the `Inc.' in ! java.vendor and java.vm.vendor. ! * gnu/java/rmi/rmic/RMIC.java (parseOptions): Only print most ! recent copyright date. ! * gnu/gcj/convert/Convert.java (version): Print `Inc'. ! * gij.cc (version): Print `Inc'. ! 2002-02-22 Alexandre Oliva ! * acinclude.m4 (CXX): AC_SUBST it, instead of glibcpp_CXX. ! * aclocal.m4, configure: Rebuilt. ! 2002-02-20 Per Bothner ! * gnu/gcj/protocol/file/Connection.java (conect): Open the input ! and/or output streams immediately here, instead of using File.exists. ! (inputStream, outputStream): New fields to save open streams. ! (getInputStream, getOutputStream): Use already-opened streams. ! 2002-02-22 Alexandre Oliva ! * acinclude.m4 (LIB_AC_PROG_CXX): Copied from libstdc++-v3. ! Use it. ! * Makefile.am (LIBLINK): Use CXX (and its tag) for linking. ! * aclocal.m4, configure, Makefile.in: Rebuilt. ! 2002-02-19 Tom Tromey ! Fix for PR libgcj/5696: ! * verify.cc (is_assignable_from_slow): Never call ! _Jv_IsAssignableFrom. ! (verify_instructions_0): Added new debug statement. ! (state::print): Print information about whether local has ! changed. ! (state::merge): Don't call note_variable when merging locals. ! (state::set_exception): Removed old FIXME comment. ! 2002-02-18 Bryce McKinlay ! * java/net/natPlainDatagramSocketImpl.cc (bind): Call setsockopt to ! enable SO_BROADCAST. ! 2002-02-18 Jason Merrill ! * name-finder.cc (toHex): Use word mode, not long long. ! * gnu/gcj/convert/natIconv.cc (write): Avoid sign-compare warning. ! 2002-02-15 Tom Tromey ! Fix for PR libgcj/5695: ! * verify.cc (is_assignable_from_slow): Check to see if target is ! an Object before checking to see if source is an interface. ! (verify_instructions_0) [op_invokeinterface]: Handle case where ! we're making an interface call on Object. ! 2002-02-15 Bryce McKinlay ! * Makefile.in: Rebuilt with Eric's change below. ! * java/lang/natMath.cc (abs(jdouble), abs(jfloat), round(jfloat), ! round(jdouble), min(jfloat), max(jfloat), min(jdouble), min(jfloat)): ! Removed functions which are now implemented in Math.java. ! 2002-02-14 Eric Blake ! * gcj/javaprims.h (java::lang): Add java::lang::StrictMath. ! * Makefile.am (core_java_source_files): Add ! java/lang/StrictMath.java. ! * java/lang/Math.java: Merge with Classpath. ! * java/lang/StrictMath.java: New file - merge with Classpath. ! 2002-02-14 Mark Wielaard ! * java/math/BigInteger.java: import gnu.java.math.MPN not the whole ! package as a workaround for gcj 3.0.x ! 2002-02-14 Mark Wielaard ! * java/security/BasicPermission.java: extends with fully qualified ! classname as workaround for gcj 3.0.4. ! 2002-02-14 Eric Blake ! * java/net/DatagramSocketImpl.java (setOption, getOption): Work ! around gcj bug of wrong emitted qualifier for inherited method. ! * java/net/SocketImpl.java (setOption, getOption): Ditto. ! * java/util/WeakHashMap.java (WeakEntrySet): Add non-private ! constructor to reduce amount of emitted bytecode. While this ! happens to work around a jikes 1.15 bug, it is still a useful ! patch even for correct compilers. ! * java/rmi/server/RMIClassLoader.java (MyClassLoader): Ditto. ! * gnu/java/rmi/server/UnicastRemoteCall.java ! (DummyObjectOutputStream, DummyObjectInputStream): Ditto. ! 2002-02-14 Eric Blake ! * java/net/DatagramSocketImpl.java: Reformat (no code changes). ! * java/net/SocketImpl.java: Ditto. ! * java/rmi/server/RMIClassLoader.java: Ditto. ! * gnu/java/rmi/server/UnicastRemoteCall.java: Ditto. ! 2002-02-14 Mark Wielaard ! Thanks to Takashi Okamoto ! * java/util/Arrays.java (ArrayList.indexOf()): this.equals(). ! * java/util/Arrays.java (ArrayList.lastIndexOf()): Likewise. ! * java/util/WeakHashMap.java (WeakEntry.getEntry()): this.get(). ! 2002-02-13 Todd Stock ! Fix for PR libgcj/5670: ! * verify.cc (is_assignable_from_slow): If `source' is interface, ! recursively look for merge with `target'. ! 2002-02-14 Martin Kahlert ! * include/jni.h: Fix typo. ! 2002-02-13 Martin Kahlert ! * jni.cc (_Jv_JNI_AttachCurrentThread): env->locals assigned ! correctly. ! 2002-02-13 Todd Stock ! Fix for PR libgcj/5671: ! * verify.cc (state::merge): Handle case where we're merging ! against an interface. ! 2002-02-12 Tom Tromey ! * exception.cc (std::abort): Mark as noreturn. ! 2002-02-12 Adam Megacz ! * java/lang/Win32Process.java: Filled in a placeholder ! implementation so Win32 will build. ! 2002-02-12 Adam Megacz ! * java/io/natFilePosix.cc: Copied this from natFile.cc. ! * java/io/natFile.cc: Removed from repository. ! * configure.in: Added AC_LINK_FILES for natFile${PLATFORM}. ! 2002-02-12 Adam Megacz ! * win32.cc: Added two #includes to make win32.cc compile. ! 2002-02-12 Bryce McKinlay ! * boehm.cc (initialized, obj_kind_x, obj_free_list): Removed unused ! declarations. ! (_Jv_InitGC): Don't bother locking, as this is always called from a ! single-thread. Turn off GC_all_interior_pointers. Remove dead code. ! 2002-02-11 Adam Megacz ! * include/win32.h: Added _Jv_platform_gettimeofday. ! * win32.cc (_Jv_platform_gettimeofday): Added dummy function. ! 2002-02-11 Adam Megacz ! * java/io/natFileWin32.cc, java/io/natFileDescriptorWin32.cc: ! Added #undef STRICT to make windows.h and ! java/lang/reflect/Modifier.h cooperate. ! 2002-02-11 Adam Megacz ! * java/io/natFileWin32.cc: Created a placeholder class with lots ! of FIXMEs. ! 2002-02-11 Adam Megacz ! * exception.cc (_Jv_Throw, PERSONALITY_FUNCTION): Changed ! std::abort() to simply abort(). Also added "fake" std::abort() so ! we can #include unwind-pe.h without having to link against ! libstdc++-v3. ! 2002-02-10 Andreas Tobler ! * interpret.cc (continue1) [insn_f2l]: Use PUSHL, not PUSHI. ! 2002-02-08 Tom Tromey ! * interpret.cc (convert): New function. ! (continue1) [insn_d2i, insn_d2l, insn_f2i, insn_f2l]: Use ! convert. ! Include Long.h. ! 2002-02-08 Anthony Green ! * configure.host: Add support for xscale-elf embedded target. ! 2002-02-08 Martin Kahlert ! * jni.cc (_Jv_JNI_NewLocalRef): Make sure, that NULL frame is not ! dereferenced. ! (_Jv_JNI_AttachCurrentThread): Produce full featured env->locals ! frame. ! 2002-02-07 Tom Tromey ! * java/io/natFile.cc (_access): Use __builtin_alloca. ! (_stat): Likewise. ! (attr): Likewise. ! (getCanonicalPath): Likewise. ! (performList): Likewise. ! (performMkdir): Likewise. ! (performSetReadOnly): Likewise. ! (performRenameTo): Likewise. ! (performSetLastModified): Likewise. ! (performCreate): Likewise. ! (performDelete): Likewise. ! 2002-02-08 Bryce McKinlay ! * HACKING: Fix URL for the automake-gcj. ! 2002-02-07 Tom Tromey ! * java/lang/natThrowable.cc: Updated copyright. ! * java/io/natFileWin32.cc: Updated copyright. ! * java/io/natFileDescriptorWin32.cc: Updated copyright. ! * win32-threads.cc: Updated copyright. ! * name-finder.cc: Updated copyright. ! * include/name-finder.h: Updated copyright. ! * include/name-finder.h: Conditionally include sys/wait.h. ! * include/config.h.in: Rebuilt. ! * java/io/natFile.cc (_access): Don't stack-allocate buffer. ! Size buffer based on real size of string. ! (_stat): Likewise. ! (attr): Likewise. ! (getCanonicalPath): Likewise. ! (performList): Likewise. ! (performMkdir): Likewise. ! (performSetReadOnly): Likewise. ! (unixroot): Removed. ! (performRenameTo): Likewise. ! (performSetLastModified): Likewise. ! (performCreate): Likewise. ! (performDelete): Likewise. ! (performListRoots): Always return new array. ! * prims.cc (_Jv_CreateJavaVM): Call _Jv_platform_initialize. ! * win32.cc (win32_exception_handler): Now static. ! * include/win32.h (_Jv_platform_initialize): Declare. ! (win32_exception_handler): Don't declare. ! * java/lang/natSystem.cc (currentTimeMillis): Use ! _Jv_platform_gettimeofday. ! * posix.cc (_Jv_platform_gettimeofday): Renamed. ! (_Jv_select): Use new name. ! (_Jv_platform_initialize): New function. ! * include/posix.h (_Jv_platform_gettimeofday): Renamed from ! _Jv_gettimeofday. ! (_Jv_platform_initialize): Declare. * configure: Rebuilt. ! * configure.in: Removed unnecessary parens. ! 2002-02-06 Adam Megacz ! * configure.in: Changed mingw) to *mingw*). ! * win32.cc: Created this file. ! * win32.h: Created this file. ! * win32.cc, prims.cc, win32.h (win32_exception_handler): Moved ! win32_exception_handler from prims.cc to win32.cc, added ! header in win32.h. ! * prims.cc: removed some #ifdef-WIN32'd headers which are no ! longer needed now that we have platform.h ! 2002-02-06 Adam Megacz ! * gnu/gcj/io/shs.h, gnu/gcj/io/shs.cc, gnu/gcj/io/natSimpleSHSStream.cc: ! use uint_t instead of LONG and BYTE ! ! 2002-02-06 Adam Megacz ! * name-finder.h: don't #include sys/wait.h unless HAVE_SYS_WAIT_H ! ! 2002-02-06 Anthony Green ! * java/net/natPlainSocketImpl.cc: Fix DISABLE_JAVA_NET targets. ! Implement missing method stubs. ! java/net/natPlainDatagramSocketImpl.cc: Fix DISABLE_JAVA_NET ! targets. ! * java/lang/natSystem.cc (getSystemTimeZone): Some targets have no ! concept of timezones. ! (init_properties): Don't refer to _Jv_Environment_Properties ! when this feature is not available. * include/config.h.in: Rebuilt. ! * acconfig.h: Add DISABLE_MAIN_ARGS. ! * prims.cc (_Jv_RunMain): Use DISABLE_MAIN_ARGS. ! * configure: Rebuilt. ! * configure.in: Add --disable-main-args option. Test for ! opendir function. Replace AC_CHECK_SIZEOF with ! AC_COMPILE_CHECK_SIZEOF. ! * java/io/natFile.cc (performList): Check HAVE_OPENDIR. ! * aclocal.m4: Rebuilt. ! * acinclude.m4: Add AC_COMPILE_CHECK_SIZEOF. ! 2002-02-06 Tom Tromey ! * verify.cc (require_array_type): If argument is a null array of ! references, return null as the element type. ! 2002-02-06 Mark Wielaard ! * verify.cc (verify_instructions_0) [op_dup2]: Actually push the ! duplicate of a wide type. ! 2002-02-06 Tom Tromey ! * verify.cc (type::isnull): New method. ! (require_array_type): Handle case where array is null. ! (verify_instructions_0) [op_arraylength]: Likewise. ! 2002-02-05 Bryce McKinlay ! * configure.in: Set up PLATFORMOBJS not PLATFORM_SPECIFIC_SOURCES. ! Symlink PLATFORMH to platform.h. ! * Makefile.am (libgcj_la_DEPENDENCIES, libgcj_la_LIBADD): Add ! PLATFORMOBJS. ! * java/lang/natSystem.cc: #include platform.h not posix.h. ! * Makefile.in: Rebuilt with libgcj automake. * configure: Rebuilt. ! 2002-02-05 Richard Henderson ! * Makefile.in: Undo munging last change. ! 2002-02-04 Adam Megacz ! * win32.cc: Created it. ! * configure.in: Added PLATFORM_SPECIFIC_SOURCES, ! which is set to posix.cc or win32.cc. ! * Makefile.am: Updated it to use $(PLATFORM_SPECIFIC_SOURCES). ! ! 2002-02-04 Adam Megacz ! * configure.in: Corrected mingw case branches; added * before ! and after. ! 2002-02-04 Adam Megacz ! * configure.in: Add -lgdi32 -lwsock32 -lws2_32 to libgcj.spec ! if compiling for win32 ! 2002-02-04 Adam Megacz ! * win32-threads.cc: #undef STRICT after gc.h inclusion ! 2002-02-02 Tom Tromey * Makefile.in: Rebuilt. ! 2002-02-02 Jason Merrill ! * Makefile.am (clean-nat): New target. ! 2002-02-02 Tom Tromey ! * java/io/natFile.cc: Removed old "FIXME" comments. ! 2002-02-01 Tom Tromey ! * java/lang/natPosixProcess.cc (myclose): New function. ! (fail): Use it. ! (startProcess): Likewise. ! 2002-02-01 Adam Megacz ! * prims.cc: Added #undef STRICT after #include. ! ! 2002-02-01 Adam Megacz ! * prims.cc ! (_Jv_CreateJavaVM): We now use WIN32 instead of ! USE_WIN32_SIGNALLING and USE_WINSOCK. ! (win32_exception_handler): Now throws an exception out of ! the signal handler; assumes SJLJ. ! ! 2002-02-01 Adam Megacz ! * win32-threads.cc: ! (_Jv_CondWait, _Jv_CondNotify, _Jv_CondNotifyAll): Corrected ! wait() algorithm to make it safe. ! (ensure_condvar_initialized, _Jv_CondInit, _Jv_CondDestroy): ! Added lazy creation of Win32 Events for better performance ! (really_start): This now uses GC_CreateThread so boehm-gc ! knows about new threads even when statically linked. ! 2002-02-01 Adam Megacz ! * include/win32-threads.h (_Jv_ConditionVariable_t): Now a struct, to ! enable safer wait() algorithm. ! (_Jv_CondWait, _Jv_CondInit, _Jv_CondDestroy, _Jv_CondNotify, ! _Jv_CondNotifyAll): Implementations moved to win32-threads.cc. ! (_Jv_MutexInit, _Jv_HaveMutexDestroy, _Jv_MutexUnlock, ! _Jv_MutexLock, _Jv_ThreadYield): Reimplement using CRITICAL_SECTIONs ! instead of mutex. ! (_Jv_ThreadYield): Don't call Sleep(), because it crashes win98. ! 2002-02-01 Adam Megacz ! * configure.in: Added support for mingw. ! * java/lang/Win32Process.java: Created as empty file. ! * java/lang/natWin32Process.cc: Created as empty file. ! 2002-02-01 Craig Rodrigues ! PR java/4972 ! * aclocal.m4, acinclude.m4 (AM_ICONV): Put linking flags ! for libiconv in LIBICONV variable. ! * configure: Regenerated. ! 2002-01-31 Tom Tromey ! * verify.cc (state::enter_subroutine): New method. ! (handle_jsr_insn): Use it. ! (state::merge): When processing a `ret', correctly use ! subroutine's state to determine which local variables have ! changed. ! (push_exception_jump): Don't let stack overflow. ! 2002-01-31 Joseph S. Myers ! * gnu/gcj/convert/Convert.java: Only include one copyright year in ! --version output. ! 2002-01-30 Tom Tromey ! * java/net/natPlainSocketImpl.cc (_Jv_recv): Added template ! parameter for `recv' return type. ! * verify.cc (handle_ret_insn): Check for subroutine merge here... ! (state::merge): ... not here. ! (subr_entry_info): New structure. ! (entry_points): New field. ! (~_Jv_BytecodeVerifier): Correctly free jsr_ptrs. Free ! entry_points. ! 2002-01-29 Tom Tromey ! * java/awt/List.java (addNotify): Correctly check to see if peer ! does not exist. ! * java/awt/GridLayout.java (layoutContainer): Use number of rows ! to compute height of each cell, and number of columns to compute ! width of each cell. ! * java/awt/Window.java (getOwnedWindows): Don't return null. ! * java/awt/FlowLayout.java (layoutContainer): Set width and height ! of component. Increment x using horizontal gap, not vertical ! gap. ! 2002-01-28 Tom Tromey ! * verify.cc (class _Jv_BytecodeVerifier) [op_invokeinterface]: ! `nargs' byte is number of words, not number of arguments. ! 2002-01-27 Tom Tromey ! * java/awt/event/MouseEvent.java (modifiers): Removed field. ! (when): Likewise. ! * java/awt/event/InputEvent.java (modifiers, when): Now ! package-private. ! * verify.cc (class _Jv_BytecodeVerifier): Removed `FIXME' comment ! and to-do list. ! (state::merge): Use current class' class loader. ! (state::print): Print subroutine. ! (state::merge): Don't look at subroutine of unmerged `ret'. ! 2002-01-26 Andreas Tobler ! * nogc.cc: Remove warnings. ! (_Jv_GCRegisterDisappearingLink, _Jv_GCCanReclaimSoftReference): ! New functions. ! 2002-01-25 Bryce McKinlay ! * java/awt/image/MemoryImageSource.java (newPixels(byte[], ColorModel, ! int, int): Remove empty "if" statement to work around compiler bug. ! (newPixels(int[], ColorModel, int, int): Likewise. ! 2002-01-25 Per Bothner ! * verify.cc (verify_fail): Change from being a top-level function ! to e method of _Jv_BytecodeVerifier. Emit current method name. ! Pass the current verifier to type: and state: methods as needed, ! for better error messages, and for resolve. ! (resolve): Pass current class's loader for Class.forName and ! _Jv_FindClassFromSignature, rather than using the default loader. ! (various type: and state: methods): Take _Jv_BytecodeVerifier* arg. ! (get_type_val_for_signature): Make non-static. ! (various methods): Pass start_PC implicitly, not explicitly. ! 2002-01-25 Tom Tromey ! * java/awt/FlowLayout.java (layoutContainer): Correctly compute ! loop termination condition. ! * java/awt/GridLayout.java (getSize): Use `real_cols' to compute ! width. ! 2002-01-24 Tom Tromey ! * java/awt/Shape.java: Merged with Classpath. ! * java/awt/Scrollbar.java: Merged with Classpath. ! * java/awt/Container.java (addNotify): Unconditionally call ! addNotifyContainerChildren and superclass addNotify. ! * java/awt/image/ColorModel.java (getAlpha(Object)): Call ! getAlpha, not getBlue. ! 2002-01-25 Bryce McKinlay ! * java/lang/natObject.cc (X86 compare_and_swap): Use +m constraint. ! ! * java/awt/image/PixelGrabber.java (grabPixels()): Call grabPixels(0). ! (grabPixels(long)): Wait to be notified that the ImageProducer has ! completed. ! 2002-01-24 Per Bothner ! * verify.cc (is_assignable_from_slow): If target is an interface, ! we must still check the source's superclass before giving up. ! 2002-01-24 Tom Tromey ! * gnu/awt/xlib/XToolkit.java (getPrintJob): New stub method. ! 2002-01-23 Tom Tromey ! * java/awt/BorderLayout.java (addLayoutComponent): Added missing ! `else'. * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new files. ! * java/awt/Toolkit.java: Merged with Classpath. ! * java/awt/PrintGraphics.java: New file from Classpath. ! * java/awt/PrintJob.java: New file from Classpath. ! * java/awt/datatransfer/Clipboard.java: New file from Classpath. ! * java/awt/datatransfer/ClipboardOwner.java: New file from ! Classpath. ! * java/awt/datatransfer/DataFlavor.java: New file from Classpath. ! * java/awt/datatransfer/FlavorMap.java: New file from Classpath. ! * java/awt/datatransfer/MimeTypeParseException.java: New file from ! Classpath. ! * java/awt/datatransfer/StringSelection.java: New file from ! Classpath. ! * java/awt/datatransfer/SystemFlavorMap.java: New file from ! Classpath. ! * java/awt/datatransfer/Transferable.java: New file from ! Classpath. ! * java/awt/datatransfer/UnsupportedFlavorException.java: New file ! from Classpath. * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Added new files. ! * java/awt/image/AreaAveragingScaleFilter.java: New file from ! Classpath. ! * java/awt/image/CropImageFilter.java: New file from Classpath. ! * java/awt/image/FilteredImageSource.java: New file from ! Classpath. ! * java/awt/image/ImageFilter.java: New file from Classpath. ! * java/awt/image/MemoryImageSource.java: New file from Classpath. ! * java/awt/image/PixelGrabber.java: New file from Classpath. ! * java/awt/image/RGBImageFilter.java: New file from Classpath. ! * java/awt/image/ReplicateScaleFilter.java: New file from ! Classpath. ! * java/awt/image/ImageProducer.java: Replaced with Classpath ! version. ! * java/awt/image/ImageObserver.java: Replaced with Classpath ! version. ! * java/awt/image/ImageConsumer.java: Replaced with Classpath ! version. ! * java/awt/GridBagConstraints.java (clone): Catch ! CloneNotSupportedException. ! 2002-01-23 Per Bothner ! * java/lang/reflect/natField.cc (setAddr): New function. ! Calls getAddr and then checks that the field isn't final. ! (setBoolean. setChar, setByte, setShort, setInt, setLong, setFloat, ! setDouble, set): Use setAddr instead of getAddr, to check for FINAL. ! (set): Call setAddr before check that new value has right type, ! to better match specified semantics. ! 2002-01-22 Tom Tromey ! * java/awt/TextField.java: Replaced with Classpath version. ! * java/awt/TextArea.java: Replaced with Classpath version. ! * java/awt/TextComponent.java: Replaced with Classpath version. ! * java/awt/GridBagConstraints.java: Updated copyright. ! 2002-01-22 Mark Wielaard ! * java/awt/Adjustable.java java/awt/CheckboxMenuItem.java ! java/awt/Choice.java java/awt/Color.java java/awt/Cursor.java ! java/awt/Dialog.java java/awt/FileDialog.java ! java/awt/Font.java java/awt/FontMetrics.java ! java/awt/Image.java java/awt/ImageMediaEntry.java ! java/awt/Insets.java java/awt/List.java ! java/awt/MediaEntry.java java/awt/MediaTracker.java ! java/awt/Menu.java java/awt/MenuBar.java ! java/awt/MenuContainer.java java/awt/MenuShortcut.java ! java/awt/PaintContext.java java/awt/Panel.java ! java/awt/PopupMenu.java java/awt/SystemColor.java ! java/awt/peer/ButtonPeer.java java/awt/peer/CanvasPeer.java ! java/awt/peer/CheckboxMenuItemPeer.java ! java/awt/peer/CheckboxPeer.java java/awt/peer/ChoicePeer.java ! java/awt/peer/ComponentPeer.java ! java/awt/peer/ContainerPeer.java java/awt/peer/DialogPeer.java ! java/awt/peer/FileDialogPeer.java java/awt/peer/FontPeer.java ! java/awt/peer/FramePeer.java java/awt/peer/LabelPeer.java ! java/awt/peer/LightweightPeer.java java/awt/peer/ListPeer.java ! java/awt/peer/MenuBarPeer.java ! java/awt/peer/MenuComponentPeer.java ! java/awt/peer/MenuItemPeer.java java/awt/peer/MenuPeer.java ! java/awt/peer/PanelPeer.java java/awt/peer/PopupMenuPeer.java ! java/awt/peer/ScrollPanePeer.java ! java/awt/peer/ScrollbarPeer.java ! java/awt/peer/TextAreaPeer.java ! java/awt/peer/TextComponentPeer.java ! java/awt/peer/TextFieldPeer.java ! java/awt/peer/WindowPeer.java: Add license clarification. ! 2002-01-22 Mark Wielaard ! * LIBGCJ_LICENSE gnu/classpath/Configuration.java.in ! gnu/gcj/runtime/StringBuffer.java ! gnu/java/awt/BitMaskExtent.java gnu/java/awt/Buffers.java ! gnu/java/awt/ComponentDataBlitOp.java ! gnu/java/awt/GLightweightPeer.java ! gnu/java/beans/BeanInfoEmbryo.java ! gnu/java/beans/EmptyBeanInfo.java ! gnu/java/beans/ExplicitBeanInfo.java ! gnu/java/beans/IntrospectionIncubator.java ! gnu/java/beans/editors/ColorEditor.java ! gnu/java/beans/editors/FontEditor.java ! gnu/java/beans/editors/NativeBooleanEditor.java ! gnu/java/beans/editors/NativeByteEditor.java ! gnu/java/beans/editors/NativeDoubleEditor.java ! gnu/java/beans/editors/NativeFloatEditor.java ! gnu/java/beans/editors/NativeIntEditor.java ! gnu/java/beans/editors/NativeLongEditor.java ! gnu/java/beans/editors/NativeShortEditor.java ! gnu/java/beans/editors/StringEditor.java ! gnu/java/beans/info/ComponentBeanInfo.java ! gnu/java/io/ClassLoaderObjectInputStream.java ! gnu/java/io/NullOutputStream.java ! gnu/java/io/ObjectIdentityWrapper.java ! gnu/java/lang/ArrayHelper.java gnu/java/lang/ClassHelper.java ! gnu/java/lang/reflect/TypeSignature.java ! gnu/java/locale/Calendar.java gnu/java/locale/Calendar_de.java ! gnu/java/locale/Calendar_en.java ! gnu/java/locale/Calendar_nl.java ! gnu/java/locale/LocaleInformation.java ! gnu/java/locale/LocaleInformation_de.java ! gnu/java/locale/LocaleInformation_en.java ! gnu/java/locale/LocaleInformation_nl.java ! gnu/java/math/MPN.java gnu/java/rmi/dgc/DGCImpl.java ! gnu/java/rmi/registry/RegistryImpl.java ! gnu/java/rmi/rmic/Compile_gcj.java ! gnu/java/rmi/rmic/Compiler.java ! gnu/java/rmi/rmic/CompilerProcess.java ! gnu/java/rmi/rmic/RMIC.java ! gnu/java/rmi/rmic/TabbedWriter.java ! gnu/java/rmi/server/ProtocolConstants.java ! gnu/java/rmi/server/RMIDefaultSocketFactory.java ! gnu/java/rmi/server/RMIHashes.java ! gnu/java/rmi/server/RMIObjectInputStream.java ! gnu/java/rmi/server/RMIObjectOutputStream.java ! gnu/java/rmi/server/UnicastConnection.java ! gnu/java/rmi/server/UnicastConnectionManager.java ! gnu/java/rmi/server/UnicastRef.java ! gnu/java/rmi/server/UnicastRemoteCall.java ! gnu/java/rmi/server/UnicastRemoteStub.java ! gnu/java/rmi/server/UnicastServer.java ! gnu/java/rmi/server/UnicastServerRef.java ! gnu/java/security/provider/DefaultPolicy.java ! gnu/java/security/provider/Gnu.java ! gnu/java/security/provider/SHA.java ! gnu/java/security/provider/SHA1PRNG.java ! gnu/java/text/BaseBreakIterator.java ! gnu/java/text/CharacterBreakIterator.java ! gnu/java/text/LineBreakIterator.java ! gnu/java/text/SentenceBreakIterator.java ! gnu/java/text/WordBreakIterator.java ! gnu/java/util/DoubleEnumeration.java java/applet/Applet.java ! java/applet/AppletContext.java java/applet/AppletStub.java ! java/applet/AudioClip.java java/awt/AWTError.java ! java/awt/AWTEvent.java java/awt/AWTEventMulticaster.java ! java/awt/AWTException.java java/awt/AWTPermission.java ! java/awt/ActiveEvent.java java/awt/BorderLayout.java ! java/awt/Button.java java/awt/Canvas.java ! java/awt/CardLayout.java java/awt/Checkbox.java ! java/awt/CheckboxGroup.java java/awt/Component.java ! java/awt/ComponentOrientation.java java/awt/Container.java ! java/awt/Dimension.java java/awt/Event.java ! java/awt/EventDispatchThread.java java/awt/EventQueue.java ! java/awt/FlowLayout.java java/awt/Frame.java ! java/awt/Graphics.java java/awt/Graphics2D.java ! java/awt/GraphicsConfiguration.java java/awt/GridLayout.java ! java/awt/IllegalComponentStateException.java ! java/awt/ItemSelectable.java java/awt/Label.java ! java/awt/LayoutManager.java java/awt/LayoutManager2.java ! java/awt/MenuComponent.java java/awt/MenuItem.java ! java/awt/Paint.java java/awt/Point.java ! java/awt/Rectangle.java java/awt/RenderingHints.java ! java/awt/Transparency.java java/awt/Window.java ! java/awt/color/ColorSpace.java ! java/awt/color/ICC_ColorSpace.java ! java/awt/color/ICC_Profile.java ! java/awt/event/HierarchyBoundsAdapter.java ! java/awt/event/HierarchyBoundsListener.java ! java/awt/event/HierarchyEvent.java ! java/awt/event/HierarchyListener.java ! java/awt/geom/AffineTransform.java ! java/awt/geom/Dimension2D.java java/awt/geom/Ellipse2D.java ! java/awt/geom/IllegalPathStateException.java ! java/awt/geom/Line2D.java ! java/awt/geom/NoninvertibleTransformException.java ! java/awt/geom/PathIterator.java java/awt/geom/Point2D.java ! java/awt/geom/Rectangle2D.java ! java/awt/geom/RectangularShape.java ! java/awt/geom/RoundRectangle2D.java ! java/awt/image/BufferedImage.java ! java/awt/image/ColorModel.java ! java/awt/image/ComponentColorModel.java ! java/awt/image/ComponentSampleModel.java ! java/awt/image/DataBuffer.java ! java/awt/image/DataBufferByte.java ! java/awt/image/DataBufferInt.java ! java/awt/image/DataBufferUShort.java ! java/awt/image/DirectColorModel.java ! java/awt/image/PackedColorModel.java ! java/awt/image/Raster.java java/awt/image/RasterOp.java ! java/awt/image/SampleModel.java ! java/awt/image/SinglePixelPackedSampleModel.java ! java/awt/image/WritableRaster.java ! java/beans/AppletInitializer.java ! java/beans/BeanDescriptor.java java/beans/BeanInfo.java ! java/beans/Beans.java java/beans/Customizer.java ! java/beans/DesignMode.java java/beans/EventSetDescriptor.java ! java/beans/FeatureDescriptor.java ! java/beans/IndexedPropertyDescriptor.java ! java/beans/IntrospectionException.java ! java/beans/Introspector.java java/beans/MethodDescriptor.java ! java/beans/ParameterDescriptor.java ! java/beans/PropertyChangeEvent.java ! java/beans/PropertyChangeListener.java ! java/beans/PropertyChangeSupport.java ! java/beans/PropertyDescriptor.java ! java/beans/PropertyEditor.java ! java/beans/PropertyEditorManager.java ! java/beans/PropertyEditorSupport.java ! java/beans/PropertyVetoException.java ! java/beans/SimpleBeanInfo.java ! java/beans/VetoableChangeListener.java ! java/beans/VetoableChangeSupport.java ! java/beans/Visibility.java ! java/beans/beancontext/BeanContext.java ! java/beans/beancontext/BeanContextChild.java ! java/beans/beancontext/BeanContextChildComponentProxy.java ! java/beans/beancontext/BeanContextChildSupport.java ! java/beans/beancontext/BeanContextContainerProxy.java ! java/beans/beancontext/BeanContextEvent.java ! java/beans/beancontext/BeanContextMembershipEvent.java ! java/beans/beancontext/BeanContextMembershipListener.java ! java/beans/beancontext/BeanContextProxy.java ! java/beans/beancontext/BeanContextServiceAvailableEvent.java ! java/beans/beancontext/BeanContextServiceProvider.java ! java/beans/beancontext/BeanContextServiceProviderBeanInfo.java ! java/beans/beancontext/BeanContextServiceRevokedEvent.java ! java/beans/beancontext/BeanContextServiceRevokedListener.java ! java/beans/beancontext/BeanContextServices.java ! java/beans/beancontext/BeanContextServicesListener.java ! java/io/BufferedInputStream.java ! java/io/BufferedOutputStream.java java/io/BufferedReader.java ! java/io/BufferedWriter.java java/io/ByteArrayInputStream.java ! java/io/ByteArrayOutputStream.java ! java/io/CharArrayReader.java java/io/CharArrayWriter.java ! java/io/CharConversionException.java java/io/DataInput.java ! java/io/DataInputStream.java java/io/DataOutput.java ! java/io/EOFException.java java/io/Externalizable.java ! java/io/FileFilter.java java/io/FileNotFoundException.java ! java/io/FilePermission.java java/io/FileReader.java ! java/io/FileWriter.java java/io/FilenameFilter.java ! java/io/FilterInputStream.java java/io/FilterOutputStream.java ! java/io/FilterReader.java java/io/FilterWriter.java ! java/io/IOException.java java/io/InputStream.java ! java/io/InterruptedIOException.java ! java/io/InvalidClassException.java ! java/io/InvalidObjectException.java ! java/io/NotActiveException.java ! java/io/NotSerializableException.java java/io/ObjectInput.java ! java/io/ObjectInputStream.java ! java/io/ObjectInputValidation.java java/io/ObjectOutput.java ! java/io/ObjectOutputStream.java java/io/ObjectStreamClass.java ! java/io/ObjectStreamConstants.java ! java/io/ObjectStreamException.java ! java/io/ObjectStreamField.java ! java/io/OptionalDataException.java java/io/OutputStream.java ! java/io/PipedInputStream.java java/io/PipedOutputStream.java ! java/io/PipedReader.java java/io/PipedWriter.java ! java/io/PrintWriter.java java/io/PushbackInputStream.java ! java/io/PushbackReader.java java/io/Reader.java ! java/io/SequenceInputStream.java java/io/Serializable.java ! java/io/SerializablePermission.java ! java/io/StreamCorruptedException.java ! java/io/StreamTokenizer.java ! java/io/StringBufferInputStream.java java/io/StringReader.java ! java/io/StringWriter.java java/io/SyncFailedException.java ! java/io/UTFDataFormatException.java ! java/io/UnsupportedEncodingException.java ! java/io/WriteAbortedException.java java/io/Writer.java ! java/lang/AbstractMethodError.java ! java/lang/ArithmeticException.java ! java/lang/ArrayIndexOutOfBoundsException.java ! java/lang/ArrayStoreException.java java/lang/Boolean.java ! java/lang/Byte.java java/lang/CharSequence.java ! java/lang/ClassCastException.java ! java/lang/ClassCircularityError.java ! java/lang/ClassFormatError.java ! java/lang/ClassNotFoundException.java ! java/lang/CloneNotSupportedException.java ! java/lang/Cloneable.java java/lang/Comparable.java ! java/lang/Compiler.java java/lang/Double.java ! java/lang/Error.java java/lang/Exception.java ! java/lang/ExceptionInInitializerError.java ! java/lang/Float.java java/lang/IllegalAccessError.java ! java/lang/IllegalAccessException.java ! java/lang/IllegalArgumentException.java ! java/lang/IllegalMonitorStateException.java ! java/lang/IllegalStateException.java ! java/lang/IllegalThreadStateException.java ! java/lang/IncompatibleClassChangeError.java ! java/lang/IndexOutOfBoundsException.java ! java/lang/InheritableThreadLocal.java ! java/lang/InstantiationError.java ! java/lang/InstantiationException.java java/lang/Integer.java ! java/lang/InternalError.java ! java/lang/InterruptedException.java ! java/lang/LinkageError.java java/lang/Long.java ! java/lang/NegativeArraySizeException.java ! java/lang/NoClassDefFoundError.java ! java/lang/NoSuchFieldError.java ! java/lang/NoSuchFieldException.java ! java/lang/NoSuchMethodError.java ! java/lang/NoSuchMethodException.java ! java/lang/NullPointerException.java java/lang/Number.java ! java/lang/NumberFormatException.java ! java/lang/OutOfMemoryError.java java/lang/Package.java ! java/lang/Process.java java/lang/Runnable.java ! java/lang/RuntimeException.java ! java/lang/RuntimePermission.java ! java/lang/SecurityException.java ! java/lang/SecurityManager.java java/lang/Short.java ! java/lang/StackOverflowError.java java/lang/StringBuffer.java ! java/lang/StringIndexOutOfBoundsException.java ! java/lang/ThreadDeath.java java/lang/ThreadGroup.java ! java/lang/ThreadLocal.java java/lang/UnknownError.java ! java/lang/UnsatisfiedLinkError.java ! java/lang/UnsupportedClassVersionError.java ! java/lang/UnsupportedOperationException.java ! java/lang/VerifyError.java java/lang/VirtualMachineError.java ! java/lang/Void.java java/lang/ref/PhantomReference.java ! java/lang/ref/Reference.java java/lang/ref/ReferenceQueue.java ! java/lang/ref/SoftReference.java ! java/lang/ref/WeakReference.java ! java/lang/reflect/AccessibleObject.java ! java/lang/reflect/InvocationTargetException.java ! java/lang/reflect/Member.java java/lang/reflect/Modifier.java ! java/lang/reflect/ReflectPermission.java ! java/math/BigDecimal.java java/math/BigInteger.java ! java/net/Authenticator.java java/net/BindException.java ! java/net/ConnectException.java java/net/ContentHandler.java ! java/net/ContentHandlerFactory.java ! java/net/DatagramPacket.java java/net/DatagramSocketImpl.java ! java/net/FileNameMap.java java/net/MalformedURLException.java ! java/net/MulticastSocket.java java/net/NetPermission.java ! java/net/NoRouteToHostException.java ! java/net/PasswordAuthentication.java ! java/net/ProtocolException.java java/net/ServerSocket.java ! java/net/Socket.java java/net/SocketException.java ! java/net/SocketImpl.java java/net/SocketImplFactory.java ! java/net/SocketOptions.java java/net/SocketPermission.java ! java/net/URLDecoder.java java/net/URLEncoder.java ! java/net/URLStreamHandlerFactory.java ! java/net/UnknownHostException.java ! java/net/UnknownServiceException.java ! java/rmi/AccessException.java ! java/rmi/AlreadyBoundException.java ! java/rmi/ConnectException.java ! java/rmi/ConnectIOException.java ! java/rmi/MarshalException.java java/rmi/MarshalledObject.java ! java/rmi/Naming.java java/rmi/NoSuchObjectException.java ! java/rmi/NotBoundException.java ! java/rmi/RMISecurityException.java ! java/rmi/RMISecurityManager.java java/rmi/Remote.java ! java/rmi/RemoteException.java java/rmi/ServerError.java ! java/rmi/ServerException.java ! java/rmi/ServerRuntimeException.java ! java/rmi/StubNotFoundException.java ! java/rmi/UnexpectedException.java ! java/rmi/UnknownHostException.java ! java/rmi/UnmarshalException.java ! java/rmi/activation/Activatable.java ! java/rmi/activation/ActivateFailedException.java ! java/rmi/activation/ActivationDesc.java ! java/rmi/activation/ActivationException.java ! java/rmi/activation/ActivationGroup.java ! java/rmi/activation/ActivationGroupDesc.java ! java/rmi/activation/ActivationGroupID.java ! java/rmi/activation/ActivationID.java ! java/rmi/activation/ActivationInstantiator.java ! java/rmi/activation/ActivationMonitor.java ! java/rmi/activation/ActivationSystem.java ! java/rmi/activation/Activator.java ! java/rmi/activation/UnknownGroupException.java ! java/rmi/activation/UnknownObjectException.java ! java/rmi/dgc/DGC.java java/rmi/dgc/Lease.java ! java/rmi/dgc/VMID.java java/rmi/registry/LocateRegistry.java ! java/rmi/registry/Registry.java ! java/rmi/registry/RegistryHandler.java ! java/rmi/server/ExportException.java ! java/rmi/server/LoaderHandler.java ! java/rmi/server/LogStream.java java/rmi/server/ObjID.java ! java/rmi/server/Operation.java ! java/rmi/server/RMIClassLoader.java ! java/rmi/server/RMIClientSocketFactory.java ! java/rmi/server/RMIFailureHandler.java ! java/rmi/server/RMIServerSocketFactory.java ! java/rmi/server/RMISocketFactory.java ! java/rmi/server/RemoteCall.java ! java/rmi/server/RemoteObject.java ! java/rmi/server/RemoteRef.java ! java/rmi/server/RemoteServer.java ! java/rmi/server/RemoteStub.java ! java/rmi/server/ServerCloneException.java ! java/rmi/server/ServerNotActiveException.java ! java/rmi/server/ServerRef.java java/rmi/server/Skeleton.java ! java/rmi/server/SkeletonMismatchException.java ! java/rmi/server/SkeletonNotFoundException.java ! java/rmi/server/SocketSecurityException.java ! java/rmi/server/UID.java ! java/rmi/server/UnicastRemoteObject.java ! java/rmi/server/Unreferenced.java ! java/security/AccessControlContext.java ! java/security/AccessControlException.java ! java/security/AccessController.java ! java/security/AlgorithmParameterGenerator.java ! java/security/AlgorithmParameterGeneratorSpi.java ! java/security/AlgorithmParameters.java ! java/security/AlgorithmParametersSpi.java ! java/security/AllPermission.java ! java/security/BasicPermission.java ! java/security/Certificate.java java/security/CodeSource.java ! java/security/DigestException.java ! java/security/DigestInputStream.java ! java/security/DigestOutputStream.java ! java/security/DomainCombiner.java ! java/security/DummyKeyPairGenerator.java ! java/security/DummyMessageDigest.java ! java/security/DummySignature.java ! java/security/GeneralSecurityException.java ! java/security/Guard.java java/security/GuardedObject.java ! java/security/Identity.java java/security/IdentityScope.java ! java/security/InvalidAlgorithmParameterException.java ! java/security/InvalidKeyException.java ! java/security/InvalidParameterException.java ! java/security/Key.java java/security/KeyException.java ! java/security/KeyFactory.java java/security/KeyFactorySpi.java ! java/security/KeyManagementException.java ! java/security/KeyPair.java java/security/KeyPairGenerator.java ! java/security/KeyPairGeneratorSpi.java ! java/security/KeyStore.java ! java/security/KeyStoreException.java ! java/security/KeyStoreSpi.java ! java/security/MessageDigest.java ! java/security/MessageDigestSpi.java ! java/security/NoSuchAlgorithmException.java ! java/security/NoSuchProviderException.java ! java/security/Permission.java ! java/security/PermissionCollection.java ! java/security/Permissions.java java/security/Policy.java ! java/security/Principal.java java/security/PrivateKey.java ! java/security/PrivilegedAction.java ! java/security/PrivilegedActionException.java ! java/security/PrivilegedExceptionAction.java ! java/security/ProtectionDomain.java ! java/security/Provider.java ! java/security/ProviderException.java ! java/security/PublicKey.java ! java/security/SecureClassLoader.java ! java/security/SecureRandom.java ! java/security/SecureRandomSpi.java java/security/Security.java ! java/security/SecurityPermission.java ! java/security/Signature.java ! java/security/SignatureException.java ! java/security/SignatureSpi.java ! java/security/SignedObject.java java/security/Signer.java ! java/security/UnrecoverableKeyException.java ! java/security/UnresolvedPermission.java ! java/security/acl/Acl.java java/security/acl/AclEntry.java ! java/security/acl/AclNotFoundException.java ! java/security/acl/Group.java ! java/security/acl/LastOwnerException.java ! java/security/acl/NotOwnerException.java ! java/security/acl/Owner.java java/security/acl/Permission.java ! java/security/cert/CRL.java ! java/security/cert/CRLException.java ! java/security/cert/Certificate.java ! java/security/cert/CertificateEncodingException.java ! java/security/cert/CertificateException.java ! java/security/cert/CertificateExpiredException.java ! java/security/cert/CertificateFactory.java ! java/security/cert/CertificateFactorySpi.java ! java/security/cert/CertificateNotYetValidException.java ! java/security/cert/CertificateParsingException.java ! java/security/cert/X509CRL.java ! java/security/cert/X509CRLEntry.java ! java/security/cert/X509Certificate.java ! java/security/cert/X509Extension.java ! java/security/interfaces/DSAKey.java ! java/security/interfaces/DSAKeyPairGenerator.java ! java/security/interfaces/DSAParams.java ! java/security/interfaces/DSAPrivateKey.java ! java/security/interfaces/DSAPublicKey.java ! java/security/interfaces/RSAKey.java ! java/security/interfaces/RSAPrivateCrtKey.java ! java/security/interfaces/RSAPrivateKey.java ! java/security/interfaces/RSAPublicKey.java ! java/security/spec/AlgorithmParameterSpec.java ! java/security/spec/DSAParameterSpec.java ! java/security/spec/DSAPrivateKeySpec.java ! java/security/spec/DSAPublicKeySpec.java ! java/security/spec/EncodedKeySpec.java ! java/security/spec/InvalidKeySpecException.java ! java/security/spec/InvalidParameterSpecException.java ! java/security/spec/KeySpec.java ! java/security/spec/PKCS8EncodedKeySpec.java ! java/security/spec/RSAKeyGenParameterSpec.java ! java/security/spec/RSAPrivateCrtKeySpec.java ! java/security/spec/RSAPrivateKeySpec.java ! java/security/spec/RSAPublicKeySpec.java ! java/security/spec/X509EncodedKeySpec.java java/sql/Array.java ! java/sql/BatchUpdateException.java java/sql/Blob.java ! java/sql/CallableStatement.java java/sql/Clob.java ! java/sql/Connection.java java/sql/DataTruncation.java ! java/sql/DatabaseMetaData.java java/sql/Date.java ! java/sql/Driver.java java/sql/DriverManager.java ! java/sql/DriverPropertyInfo.java ! java/sql/PreparedStatement.java java/sql/Ref.java ! java/sql/ResultSet.java java/sql/ResultSetMetaData.java ! java/sql/SQLData.java java/sql/SQLException.java ! java/sql/SQLInput.java java/sql/SQLOutput.java ! java/sql/SQLWarning.java java/sql/Statement.java ! java/sql/Struct.java java/sql/Time.java ! java/sql/Timestamp.java java/sql/Types.java ! java/text/Annotation.java ! java/text/AttributedCharacterIterator.java ! java/text/AttributedString.java ! java/text/AttributedStringIterator.java ! java/text/BreakIterator.java java/text/CharacterIterator.java ! java/text/ChoiceFormat.java java/text/Collator.java ! java/text/DateFormat.java java/text/DateFormatSymbols.java ! java/text/DecimalFormat.java ! java/text/DecimalFormatSymbols.java ! java/text/FieldPosition.java java/text/Format.java ! java/text/MessageFormat.java java/text/NumberFormat.java ! java/text/ParseException.java java/text/ParsePosition.java ! java/text/SimpleDateFormat.java ! java/text/StringCharacterIterator.java ! java/util/AbstractCollection.java java/util/AbstractList.java ! java/util/AbstractMap.java ! java/util/AbstractSequentialList.java ! java/util/AbstractSet.java java/util/ArrayList.java ! java/util/Arrays.java java/util/BasicMapEntry.java ! java/util/BitSet.java java/util/Calendar.java ! java/util/Collection.java java/util/Collections.java ! java/util/Comparator.java ! java/util/ConcurrentModificationException.java ! java/util/Date.java java/util/Dictionary.java ! java/util/EmptyStackException.java java/util/Enumeration.java ! java/util/EventListener.java java/util/EventObject.java ! java/util/GregorianCalendar.java java/util/HashMap.java ! java/util/HashSet.java java/util/Hashtable.java ! java/util/IdentityHashMap.java java/util/Iterator.java ! java/util/LinkedHashMap.java java/util/LinkedHashSet.java ! java/util/LinkedList.java java/util/List.java ! java/util/ListIterator.java java/util/ListResourceBundle.java ! java/util/Locale.java java/util/Map.java ! java/util/MissingResourceException.java ! java/util/NoSuchElementException.java ! java/util/Observable.java java/util/Observer.java ! java/util/Properties.java java/util/PropertyPermission.java ! java/util/PropertyResourceBundle.java java/util/Random.java ! java/util/RandomAccess.java java/util/ResourceBundle.java ! java/util/Set.java java/util/SimpleTimeZone.java ! java/util/SortedMap.java java/util/SortedSet.java ! java/util/Stack.java java/util/StringTokenizer.java ! java/util/TimeZone.java java/util/Timer.java ! java/util/TimerTask.java ! java/util/TooManyListenersException.java ! java/util/TreeMap.java java/util/TreeSet.java ! java/util/Vector.java java/util/WeakHashMap.java ! java/util/jar/Attributes.java java/util/jar/JarEntry.java ! java/util/jar/JarException.java java/util/jar/JarFile.java ! java/util/jar/JarInputStream.java ! java/util/jar/JarOutputStream.java java/util/jar/Manifest.java ! java/util/zip/Adler32.java java/util/zip/CRC32.java ! java/util/zip/CheckedInputStream.java ! java/util/zip/CheckedOutputStream.java ! java/util/zip/Checksum.java ! java/util/zip/DataFormatException.java ! java/util/zip/Deflater.java ! java/util/zip/DeflaterOutputStream.java ! java/util/zip/GZIPInputStream.java ! java/util/zip/GZIPOutputStream.java ! java/util/zip/Inflater.java ! java/util/zip/InflaterInputStream.java ! java/util/zip/ZipConstants.java java/util/zip/ZipEntry.java ! java/util/zip/ZipException.java java/util/zip/ZipFile.java ! java/util/zip/ZipInputStream.java ! java/util/zip/ZipOutputStream.java ! javax/naming/BinaryRefAddr.java ! javax/naming/InvalidNameException.java javax/naming/Name.java ! javax/naming/NamingException.java javax/naming/RefAddr.java ! javax/naming/StringRefAddr.java: Add license clarification. ! 2002-01-22 Tom Tromey ! * java/awt/peer/ButtonPeer.java: Replace with Classpath version. ! * java/awt/peer/CanvasPeer.java: Replace with Classpath version. ! * java/awt/peer/CheckboxMenuItemPeer.java: Replace with Classpath ! version. ! * java/awt/peer/CheckboxPeer.java: Replace with Classpath version. ! * java/awt/peer/ChoicePeer.java: Replace with Classpath version. ! * java/awt/peer/ComponentPeer.java: Replace with Classpath version. ! * java/awt/peer/ContainerPeer.java: Replace with Classpath version. ! * java/awt/peer/DialogPeer.java: Replace with Classpath version. ! * java/awt/peer/FileDialogPeer.java: Replace with Classpath version. ! * java/awt/peer/FontPeer.java: Replace with Classpath version. ! * java/awt/peer/FramePeer.java: Replace with Classpath version. ! * java/awt/peer/LabelPeer.java: Replace with Classpath version. ! * java/awt/peer/LightweightPeer.java: Replace with Classpath version. ! * java/awt/peer/ListPeer.java: Replace with Classpath version. ! * java/awt/peer/MenuBarPeer.java: Replace with Classpath version. ! * java/awt/peer/MenuComponentPeer.java: Replace with Classpath version. ! * java/awt/peer/MenuItemPeer.java: Replace with Classpath version. ! * java/awt/peer/MenuPeer.java: Replace with Classpath version. ! * java/awt/peer/PanelPeer.java: Replace with Classpath version. ! * java/awt/peer/PopupMenuPeer.java: Replace with Classpath version. ! * java/awt/peer/ScrollPanePeer.java: Replace with Classpath version. ! * java/awt/peer/ScrollbarPeer.java: Replace with Classpath version. ! * java/awt/peer/TextAreaPeer.java: Replace with Classpath version. ! * java/awt/peer/TextComponentPeer.java: Replace with Classpath version. ! * java/awt/peer/TextFieldPeer.java: Replace with Classpath version. ! * java/awt/peer/WindowPeer.java: Replace with Classpath version. ! * gnu/awt/xlib/XPanelPeer.java (insets): New method. ! * gnu/awt/xlib/XCanvasPeer.java (show, hide): New methods. ! (minimumSize, preferredSize, reshape): Likewise. ! * gnu/awt/xlib/XFramePeer.java (insets, enable, disable, ! getColorModel): New methods. ! * java/awt/PopupMenu.java: Merged with Classpath. ! * java/awt/MenuBar.java: Merged with Classpath. ! * java/awt/SystemColor.java: Replace with Classpath version. ! * java/awt/Panel.java: Merged with Classpath. ! * java/awt/PaintContext.java: Updated copyright. ! * java/awt/MenuShortcut.java: Merged with Classpath. ! * java/awt/MenuContainer.java: Merged with Classpath. ! * java/awt/Menu.java: Merged with Classpath. ! * java/awt/MediaEntry.java: New file from Classpath. ! * java/awt/MediaTracker.java: New file from Classpath. ! * java/awt/List.java: Merged with Classpath version. ! * java/awt/Insets.java: Merged with Classpath version. ! * java/awt/ImageMediaEntry.java: New file from Classpath. ! * java/awt/Image.java: Replaced with Classpath version. ! * java/awt/FontMetrics.java: Merged with Classpath version. ! * java/awt/Cursor.java (getDefaultCursor): Use DEFAULT_CURSOR ! constant. ! * java/awt/Font.java: Merged with Classpath version. ! * java/awt/Dialog.java: Merged with Classpath version. ! * java/awt/Color.java: Merged with Classpath version. ! * java/awt/Choice.java: Merged with Classpath version. ! * java/awt/CheckboxMenuItem.java: Merged with Classpath version. ! * java/awt/Adjustable.java: Replace with Classpath version. ! * java/awt/MenuItem.java (paramString): Don't include class name ! or brackets. Call superclass paramString. ! * java/awt/MenuComponent.java (toString): Call paramString. ! (paramString): Compute string; don't call toString. ! * java/awt/Label.java (paramString): Don't include class name ! or brackets. Call superclass paramString. ! * java/awt/Checkbox.java (paramString): Don't include class name ! or brackets. Call superclass paramString. ! * java/awt/Button.java (paramString): Don't include class name or ! brackets. Call superclass paramString. ! * java/awt/MenuComponent.java (getTreeLock): Now protected. ! 2002-01-20 Andreas Schwab ! * java/net/natPlainSocketImpl.cc (_Jv_recv): Change return type of ! function and of parameter recv_func to ssize_t, as specified by ! POSIX. ! 2002-01-19 Per Bothner ! * java/util/zip/ZipOutputStream.java (putNextEntry): Clear ! uncompressed_size in readiness for next entry. ! 2002-01-18 Tom Tromey ! * java/net/natPlainSocketImpl.cc: Include ! IllegalArgumentException.h. ! (_Jv_recv): New template function. ! (BooleanClass): Removed. ! (read): Use _Jv_recv. ! (setOption): Use Boolean::class$. Throw exception if object is ! not Boolean or Integer. ! 2002-01-17 Tom Tromey ! * java/awt/MenuComponent.java: Merged with Classpath. ! * java/awt/MenuItem.java: Merged with Classpath. ! * java/awt/Button.java: Merged with Classpath. ! * java/awt/ActiveEvent.java: Updated copyright. ! * java/awt/AWTError.java: Replaced with Classpath version. ! * java/awt/AWTException.java: Replaced with Classpath version. ! * java/awt/IllegalComponentStateException.java: Replaced with ! Classpath version. ! 2002-01-16 Tom Tromey ! * java/awt/Canvas.java (serialVersionUID): New constant. ! Updated copyright. Added javadoc from Classpath. ! * java/awt/ItemSelectable.java: Replaced with Classpath version. ! * java/awt/CheckboxGroup.java: Merged with Classpath. ! * java/awt/Checkbox.java: Merged with Classpath. ! * java/awt/Dimension.java: Updated copyright. Added javadoc from ! Classpath. ! * java/awt/Point.java: Updated copyright. ! * java/awt/Point.java (toString): Use getClass().getName(). ! Added javadoc. ! * java/util/IdentityHashMap.java (IdentityHashMap): Removed ! commented code. ! (hash): Correctly compute initial value for `h'. ! * java/awt/Label.java: Merged with Classpath. ! 2002-01-15 Tom Tromey ! * java/awt/AWTPermission.java: Updated copyright. ! * java/awt/LayoutManager2.java: Merged with Classpath. ! * java/awt/LayoutManager.java: Merged with Classpath. ! * java/awt/GridLayout.java: Updated copyright and javadoc. ! (getSize): Use `parent.ncomponents'. Handle insets. ! (layoutContainer): Use `parent.ncomponents'. Handle case where ! there are fewer children than columns. Correctly compute size of ! each cell in the grid. Handle case where there isn't enough ! space. ! * java/awt/CardLayout.java (tab): Renamed from `map'. Updated ! all users. ! (gotoComponent): Use parent.ncomponents. Ensure child exists ! before calling setVisible() on it. Last item is `num - 1', not ! `num'. ! (layoutContainer): Hoist invariants out of loop. ! Start of AWT merge with Classpath: * Makefile.in: Rebuilt. ! * Makefile.am (awt_java_source_files): Reference files in ! gnu/java/awt, not gnu/gcj/awt. ! * java/awt/image/BufferedImage.java: Updated copyright. ! * java/awt/image/ComponentColorModel.java: Updated copyright. ! * java/awt/image/ComponentSampleModel.java: Updated copyright. ! * java/awt/image/DataBuffer.java: Updated copyright. ! * java/awt/image/DataBufferByte.java: Updated copyright. ! * java/awt/image/DataBufferInt.java: Updated copyright. ! * java/awt/image/DataBufferUShort.java: Updated copyright. ! * java/awt/image/IndexColorModel.java: Updated copyright. ! * java/awt/image/PackedColorModel.java: Updated copyright. ! * java/awt/image/Raster.java: Updated copyright. ! * java/awt/image/RasterOp.java: Updated copyright. ! * java/awt/image/SampleModel.java: Updated copyright. ! * java/awt/image/SinglePixelPackedSampleModel.java: Updated copyright. ! * java/awt/image/WritableRaster.java: Updated copyright. ! * java/awt/color/ColorSpace.java: Updated copyright. ! * java/awt/color/ICC_ColorSpace.java: Updated copyright ! * java/awt/color/ICC_Profile.java: Updated copyright. ! * java/awt/event/HierarchyBoundsAdapter.java: Updated copyright. ! * java/awt/event/HierarchyBoundsListener.java: Updated copyright. ! * java/awt/event/HierarchyEvent.java: Updated copyright. ! * java/awt/event/HierarchyListener.java: Updated copyright. ! * java/awt/geom/AffineTransform.java: Updated copyright. ! * java/awt/geom/Dimension2D.java: Updated copyright. ! * java/awt/geom/Ellipse2D.java: Updated copyright. ! * java/awt/geom/IllegalPathStateException.java: Updated copyright. ! * java/awt/geom/Line2D.java: Updated copyright. ! * java/awt/geom/NoninvertibleTransformException.java: Updated ! copyright. ! * java/awt/geom/PathIterator.java: Updated copyright. ! * java/awt/geom/Point2D.java: Updated copyright. ! * java/awt/geom/Rectangle2D.java: Updated copyright. ! * java/awt/geom/RectangularShape.java: Updated copyright. ! * java/awt/geom/RoundRectangle2D.java: Updated copyright. ! * java/awt/Toolkit.java: Updated import for file moves. ! * java/awt/Rectangle.java: Updated copyright; added javadoc from ! Classpath. ! (hashCode): New method from Classpath. ! * java/awt/Graphics2D.java: Updated copyright. ! * java/awt/Transparency.java: Updated copyright. ! * java/awt/Paint.java: Updated copyright. ! * java/awt/Graphics.java: New version from Classpath. ! * java/awt/EventDispatchThread.java: Updated copyright. ! * java/awt/CardLayout.java (layoutContainer): Don't skip invisible ! children. ! (gotoComponent): Wrap around on next/previous. ! * gnu/gcj/awt/BitMaskExtent.java: Removed. ! * gnu/gcj/awt/Buffers.java: Removed. ! * gnu/gcj/awt/ComponentDataBlitOp.java: Removed. ! * gnu/gcj/awt/GLightweightPeer.java: Removed. ! * gnu/java/awt/BitMaskExtent.java: Added. ! * gnu/java/awt/Buffers.java: Added. ! * gnu/java/awt/ComponentDataBlitOp.java: Added. ! * gnu/java/awt/GLightweightPeer.java: Added. ! * java/awt/geom/Line2D.java (clone): Ignore ! CloneNotSupportedException. ! * gnu/gcj/awt/GLightweightPeer.java (getColorModel): New method. ! * java/awt/Frame.java: Merged with Classpath. ! * java/awt/RenderingHints.java: Copyright update. ! * java/awt/Paint.java: Copyright update. ! * java/awt/image/DirectColorModel.java: Merged with Classpath. ! * java/awt/image/ColorModel.java: Merged with Classpath. ! * java/awt/Window.java (show): New Implementation from Classpath. ! (isShowing): Use super.isShowing(). ! * java/awt/EventQueue.java: Merged with Classpath. ! * java/awt/AWTEventMulticaster.java (save): Throw ! RuntimeException. ! (saveInternal): Likewise. ! * java/awt/AWTEvent.java: Now implements Serializable. ! * java/awt/Event.java: Copyright update. ! * java/awt/peer/ComponentPeer.java: Merged with Classpath. ! * java/awt/image/BufferedImage.java: Copyright update. ! * java/awt/GraphicsConfiguration.java: Copyright update. ! * java/awt/Component.java: (addNotify): Don't call ! addNotifyContainerChildren(). ! (addNotifyContainerChildren): Removed. ! (setPeer): New method from Classpath. ! (setTreeLock): Likewise. ! (setVisible): Rewrote. ! (show): Use it. ! (hide): Likewise. ! (validate): Set `valid'. ! (checkImage(Image,ImageObserver)): Implementation from Classpath. ! (createImage(ImageProducer)): Likewise. ! (prepareImage): Likewise. ! * java/awt/Container.java (addImpl): Handle case where constraint ! is not a String. Post event via system event queue. ! (remove): Post event via system event queue. ! (validateTree): Only validate child if it is invalid. ! (getAlignmentX): Call super method as default. ! (getAlignmentY): Likewise. ! (addContainerListener): Now synchronized. ! (removeContainerListener): Likewise. ! (addNotifyContainerChildren): Now private. ! * java/awt/ComponentOrientation.java: Updated copyright. Added ! @author. ! * java/awt/FlowLayout.java (serialVersionUID): New field. ! (setAlignment): Better exception message. ! (layoutContainer): Don't compute component's preferred size unless ! we're going to use it. ! * java/awt/BorderLayout.java (AFTER_LAST_LINE, AFTER_LINE_ENDS, ! BEFORE_FIRST_LINE, BEFORE_LINE_BEGINS): New constants. ! (firstLine, lastLine, firstItem, lastItem): New fields. ! (addLayoutComponent): Handle case where constraints is null. ! Also, handle relative locations. ! (removeLayoutComponent): Handle relative locations. ! (MIN, MAX, PREF): New constants. ! (calcCompSize): New method. ! (calcSize): New method. ! (minimumLayoutSize): Use it. ! (preferredLayoutSize): Likewise. ! (maximumLayoutSize): Likewise. ! (toString): Include more information. ! (setBounds): New method. ! (layoutContainer): Use libgcj implementation; extended to handle ! relative locations. ! 2002-01-15 Tom Tromey ! * java/lang/Float.java (equals): Preserve old code. ! * java/lang/Double.java (equals): Preserve old code. ! 2002-01-15 Eric Blake ! * java/lang/Double.java (equals, compare): Fix 0.0 vs. -0.0 math. ! * java/lang/Float.java (equals, compare): Ditto. ! 2002-01-13 Mark Wielaard ! * java/net/DatagramSocket.java (getReceiveBufferSize): new 1.2 method. ! * java/net/DatagramSocket.java (getSendBufferSize): Likewise. ! * java/net/DatagramSocket.java (setReceiveBufferSize): Likewise. ! * java/net/DatagramSocket.java (setSendBufferSize): Likewise. ! 2002-01-11 Mark Wielaard ! * java/net/InetAddress.java (ANY_IF): moved from ServerSocket. ! * java/net/DatagramSocket.java (DatagramSocket): use ANY_IF from ! InetAddress. ! * java/net/MulticastSocket.java (MulticastSocket): Likewise. ! * java/net/Socket.java: Merge with Classpath. ! * java/net/ServerSocket.java: Likewise. ! 2002-01-11 Chris Sears ! * interpret.cc (NULLARRAYCHECK): New macro. ! (SAVE_PC): Just store `pc'. ! (find_exception): Subtract one from `pc' here. ! (continue1) [insn_iaload, insn_laload, insn_faload, insn_daload, ! insn_aaload, insn_baload, insn_caload, insn_saload, insn_iastore, ! insn_lastore, insn_fastore, insn_dastore, insn_aastore, ! insn_bastore, insn_castore, insn_sastore]: Use NULLARRAYCHECK, and ! don't call SAVE_PC. ! (continue1) [insn_fdiv, insn_ddiv, insn_frem, insn_drem]: Don't ! call SAVE_PC. ! 2002-01-11 Tom Tromey ! * java/lang/natSystem.cc (init_properties): Only look for default ! locale if LC_MESSAGES is defined. ! * aclocal.m4, configure, include/config.h.in: Rebuilt. ! * configure.in: Call AM_LC_MESSAGES. ! * acinclude.m4 (AM_LC_MESSAGES): New macro. ! 2002-01-10 Tom Tromey ! For PR libgcj/5303: ! * gnu/java/rmi/rmic/RMIC.java (parseOptions): Handle --help and ! --version. Recognize GNU-style long options. Print GNU-style ! error messages. ! (usage): Print GNU-style help. Exit with status 0. ! (error): New method. ! (run): Print error message if no class names found. ! (main): Don't print usage on error. ! 2002-01-09 Tom Tromey ! * gnu/gcj/convert/Convert.java (version): Use java.vm.name ! property. ! (help, version): Use println(), not println(""). ! For PR libgcj/5303: ! * gnu/gcj/convert/Convert.java (error): Program is called ! `jv-convert'. Print GNU-style message. Exit with status 1, not ! -1. ! (main): Handle --help and --version. ! (help): New method. ! (version): Likewise. ! 2002-01-08 Tom Tromey * Makefile.in: Rebuilt. ! * Makefile.am (ordinary_java_source_files): Added new files. ! * gnu/java/locale/LocaleInformation.java: Extend ! LocaleInformation_en. ! * gnu/java/locale/LocaleInformation_en.java: Added zone strings ! and time/date formats. ! * gnu/java/locale/LocaleInformation_en_US.java: Now automatically ! generated. ! * gnu/java/locale/LocaleInformation_af_ZA.java: New file. ! * gnu/java/locale/LocaleInformation_ar_AE.java: New file. ! * gnu/java/locale/LocaleInformation_ar_BH.java: New file. ! * gnu/java/locale/LocaleInformation_ar_DZ.java: New file. ! * gnu/java/locale/LocaleInformation_ar_EG.java: New file. ! * gnu/java/locale/LocaleInformation_ar_IN.java: New file. ! * gnu/java/locale/LocaleInformation_ar_IQ.java: New file. ! * gnu/java/locale/LocaleInformation_ar_JO.java: New file. ! * gnu/java/locale/LocaleInformation_ar_KW.java: New file. ! * gnu/java/locale/LocaleInformation_ar_LB.java: New file. ! * gnu/java/locale/LocaleInformation_ar_LY.java: New file. ! * gnu/java/locale/LocaleInformation_ar_MA.java: New file. ! * gnu/java/locale/LocaleInformation_ar_OM.java: New file. ! * gnu/java/locale/LocaleInformation_ar_QA.java: New file. ! * gnu/java/locale/LocaleInformation_ar_SD.java: New file. ! * gnu/java/locale/LocaleInformation_ar_SY.java: New file. ! * gnu/java/locale/LocaleInformation_ar_TN.java: New file. ! * gnu/java/locale/LocaleInformation_ar_YE.java: New file. ! * gnu/java/locale/LocaleInformation_be_BY.java: New file. ! * gnu/java/locale/LocaleInformation_bn_IN.java: New file. ! * gnu/java/locale/LocaleInformation_br_FR.java: New file. ! * gnu/java/locale/LocaleInformation_bs_BA.java: New file. ! * gnu/java/locale/LocaleInformation_ca_ES.java: New file. ! * gnu/java/locale/LocaleInformation_cs_CZ.java: New file. ! * gnu/java/locale/LocaleInformation_cy_GB.java: New file. ! * gnu/java/locale/LocaleInformation_da_DK.java: New file. ! * gnu/java/locale/LocaleInformation_de_AT.java: New file. ! * gnu/java/locale/LocaleInformation_de_BE.java: New file. ! * gnu/java/locale/LocaleInformation_de_CH.java: New file. ! * gnu/java/locale/LocaleInformation_de_DE.java: New file. ! * gnu/java/locale/LocaleInformation_de_LU.java: New file. ! * gnu/java/locale/LocaleInformation_el_GR.java: New file. ! * gnu/java/locale/LocaleInformation_en_AU.java: New file. ! * gnu/java/locale/LocaleInformation_en_BW.java: New file. ! * gnu/java/locale/LocaleInformation_en_CA.java: New file. ! * gnu/java/locale/LocaleInformation_en_DK.java: New file. ! * gnu/java/locale/LocaleInformation_en_GB.java: New file. ! * gnu/java/locale/LocaleInformation_en_HK.java: New file. ! * gnu/java/locale/LocaleInformation_en_IE.java: New file. ! * gnu/java/locale/LocaleInformation_en_IN.java: New file. ! * gnu/java/locale/LocaleInformation_en_NZ.java: New file. ! * gnu/java/locale/LocaleInformation_en_PH.java: New file. ! * gnu/java/locale/LocaleInformation_en_SG.java: New file. ! * gnu/java/locale/LocaleInformation_en_ZA.java: New file. ! * gnu/java/locale/LocaleInformation_en_ZW.java: New file. ! * gnu/java/locale/LocaleInformation_es_AR.java: New file. ! * gnu/java/locale/LocaleInformation_es_BO.java: New file. ! * gnu/java/locale/LocaleInformation_es_CL.java: New file. ! * gnu/java/locale/LocaleInformation_es_CO.java: New file. ! * gnu/java/locale/LocaleInformation_es_CR.java: New file. ! * gnu/java/locale/LocaleInformation_es_DO.java: New file. ! * gnu/java/locale/LocaleInformation_es_EC.java: New file. ! * gnu/java/locale/LocaleInformation_es_ES.java: New file. ! * gnu/java/locale/LocaleInformation_es_GT.java: New file. ! * gnu/java/locale/LocaleInformation_es_HN.java: New file. ! * gnu/java/locale/LocaleInformation_es_MX.java: New file. ! * gnu/java/locale/LocaleInformation_es_NI.java: New file. ! * gnu/java/locale/LocaleInformation_es_PA.java: New file. ! * gnu/java/locale/LocaleInformation_es_PE.java: New file. ! * gnu/java/locale/LocaleInformation_es_PR.java: New file. ! * gnu/java/locale/LocaleInformation_es_PY.java: New file. ! * gnu/java/locale/LocaleInformation_es_SV.java: New file. ! * gnu/java/locale/LocaleInformation_es_US.java: New file. ! * gnu/java/locale/LocaleInformation_es_UY.java: New file. ! * gnu/java/locale/LocaleInformation_es_VE.java: New file. ! * gnu/java/locale/LocaleInformation_et_EE.java: New file. ! * gnu/java/locale/LocaleInformation_eu_ES.java: New file. ! * gnu/java/locale/LocaleInformation_fa_IR.java: New file. ! * gnu/java/locale/LocaleInformation_fi_FI.java: New file. ! * gnu/java/locale/LocaleInformation_fo_FO.java: New file. ! * gnu/java/locale/LocaleInformation_fr_BE.java: New file. ! * gnu/java/locale/LocaleInformation_fr_CA.java: New file. ! * gnu/java/locale/LocaleInformation_fr_CH.java: New file. ! * gnu/java/locale/LocaleInformation_fr_FR.java: New file. ! * gnu/java/locale/LocaleInformation_fr_LU.java: New file. ! * gnu/java/locale/LocaleInformation_ga_IE.java: New file. ! * gnu/java/locale/LocaleInformation_gd_GB.java: New file. ! * gnu/java/locale/LocaleInformation_gl_ES.java: New file. ! * gnu/java/locale/LocaleInformation_gv_GB.java: New file. ! * gnu/java/locale/LocaleInformation_he_IL.java: New file. ! * gnu/java/locale/LocaleInformation_hi_IN.java: New file. ! * gnu/java/locale/LocaleInformation_hr_HR.java: New file. ! * gnu/java/locale/LocaleInformation_hu_HU.java: New file. ! * gnu/java/locale/LocaleInformation_id_ID.java: New file. ! * gnu/java/locale/LocaleInformation_it_CH.java: New file. ! * gnu/java/locale/LocaleInformation_it_IT.java: New file. ! * gnu/java/locale/LocaleInformation_iw_IL.java: New file. ! * gnu/java/locale/LocaleInformation_ja_JP.java: New file. ! * gnu/java/locale/LocaleInformation_ka_GE.java: New file. ! * gnu/java/locale/LocaleInformation_kl_GL.java: New file. ! * gnu/java/locale/LocaleInformation_ko_KR.java: New file. ! * gnu/java/locale/LocaleInformation_kw_GB.java: New file. ! * gnu/java/locale/LocaleInformation_lt_LT.java: New file. ! * gnu/java/locale/LocaleInformation_lv_LV.java: New file. ! * gnu/java/locale/LocaleInformation_mi_NZ.java: New file. ! * gnu/java/locale/LocaleInformation_mk_MK.java: New file. ! * gnu/java/locale/LocaleInformation_mr_IN.java: New file. ! * gnu/java/locale/LocaleInformation_mt_MT.java: New file. ! * gnu/java/locale/LocaleInformation_nl_BE.java: New file. ! * gnu/java/locale/LocaleInformation_nl_NL.java: New file. ! * gnu/java/locale/LocaleInformation_nn_NO.java: New file. ! * gnu/java/locale/LocaleInformation_no_NO.java: New file. ! * gnu/java/locale/LocaleInformation_oc_FR.java: New file. ! * gnu/java/locale/LocaleInformation_pl_PL.java: New file. ! * gnu/java/locale/LocaleInformation_pt_BR.java: New file. ! * gnu/java/locale/LocaleInformation_pt_PT.java: New file. ! * gnu/java/locale/LocaleInformation_ro_RO.java: New file. ! * gnu/java/locale/LocaleInformation_ru_RU.java: New file. ! * gnu/java/locale/LocaleInformation_ru_UA.java: New file. ! * gnu/java/locale/LocaleInformation_se_NO.java: New file. ! * gnu/java/locale/LocaleInformation_sk_SK.java: New file. ! * gnu/java/locale/LocaleInformation_sl_SI.java: New file. ! * gnu/java/locale/LocaleInformation_sq_AL.java: New file. ! * gnu/java/locale/LocaleInformation_sr_YU.java: New file. ! * gnu/java/locale/LocaleInformation_sv_FI.java: New file. ! * gnu/java/locale/LocaleInformation_sv_SE.java: New file. ! * gnu/java/locale/LocaleInformation_ta_IN.java: New file. ! * gnu/java/locale/LocaleInformation_te_IN.java: New file. ! * gnu/java/locale/LocaleInformation_tg_TJ.java: New file. ! * gnu/java/locale/LocaleInformation_tl_PH.java: New file. ! * gnu/java/locale/LocaleInformation_tr_TR.java: New file. ! * gnu/java/locale/LocaleInformation_uk_UA.java: New file. ! * gnu/java/locale/LocaleInformation_ur_PK.java: New file. ! * gnu/java/locale/LocaleInformation_uz_UZ.java: New file. ! * gnu/java/locale/LocaleInformation_vi_VN.java: New file. ! * gnu/java/locale/LocaleInformation_yi_US.java: New file. ! * gnu/java/locale/LocaleInformation_zh_CN.java: New file. ! * gnu/java/locale/LocaleInformation_zh_HK.java: New file. ! * gnu/java/locale/LocaleInformation_zh_SG.java: New file. ! * gnu/java/locale/LocaleInformation_zh_TW.java: New file. ! For PR libgcj/5031: ! * java/lang/natSystem.cc (init_properties): Use LC_MESSAGES to ! choose default locale. * Makefile.in: Rebuilt. + * Makefile.am (jv_convert_LDADD): Removed convert_source_files. ! 2002-01-08 Nic Ferrier ! * java/net/natPlainSocketImpl.cc: Added timeout handling for ! sockets. ! (close): New function closes the socket. ! (write): New functions for output to socket. ! (read): New functions for reading from socket. ! * java/net/PlainSocketImpl.java: Glue for new timeout ! implementation. ! (write): Call the native impl. ! (read): Likewise. ! (getInputStream): Get a stream to read from the socket. ! (getOutputStream): Get a stream to write to the socket. ! 2002-01-08 Tom Tromey ! * resolve.cc (_Jv_PrepareClass): Enable verifier. ! 2002-01-07 Andreas Tobler ! * java/lang/reflect/natMethod.cc: Don't include alloca.h. ! (_Jv_CallAnyMethodA): Convert alloca to __builtin_alloca. ! 2002-01-08 Chris Sears ! * interpret.cc (ARRAYBOUNDSCHECK): New macro. ! (continue1) [insn_iaload, insn_laload, insn_faload, insn_daload, ! insn_aaload, insn_baload, insn_caload, insn_saload, insn_iastore, ! insn_lastore, insn_fastore, insn_dastore, insn_aastore, ! insn_bastore, insn_castore, insn_sastore]: Use it. ! (continue1) [insn_arraylength]: Check for null array. ! 2002-01-06 Andreas Tobler ! * configure, include/config.h.in: Rebuilt. ! * java/lang/natSystem.cc (getSystemTimeZone): Check HAVE_TM_ZONE. ! * configure.in: Call AC_STRUCT_TIMEZONE. ! 2002-01-02 Andreas Tobler ! * configure.host: Disable the interpreter for Darwin. ! 2002-01-04 Tom Tromey ! * java/lang/Thread.java (stop): No longer synchronized. ! (start): Likewise. ! 2002-01-02 Tom Tromey ! * java/lang/ieeefp.h: Fix bug in my hand-application of previous ! patch. ! 2002-1-1 Andrew Pinski ! * libjava/java/lang/ieeefp.h: Define __IEEE_BIG_ENDIAN for ! PPC Darwin, not for all of Darwin. diff -Nrc3pad gcc-3.0.4/libjava/ChangeLog-2001 gcc-3.1/libjava/ChangeLog-2001 *** gcc-3.0.4/libjava/ChangeLog-2001 Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/ChangeLog-2001 Tue Jan 22 00:20:23 2002 *************** *** 0 **** --- 1,9335 ---- + 2001-12-29 Andreas Tobler + + * libjava/java/lang/ieeefp.h: Define __IEEE_BIG_ENDIAN for + Darwin. + + 2001-12-21 Tom Tromey + + * java/io/ObjectInputStream.java (enableResolveObject): Use + correct security check. + * java/io/ObjectOutputStream.java (enableReplaceObject): Use + correct security check. + + Fix for PR java/5165: + * java/lang/natClassLoader.cc (_Jv_PrepareCompiledClass): + Convert any constant string field to a String; not just final + fields. + + Fix for PR libgcj/2428: + * java/lang/natClass.cc: Include RuntimePermission.h. + (getClassLoader): Define. + * java/lang/Class.h (Class.getClassLoader): Only declare. + + 2001-12-19 Tom Tromey + + * java/awt/FlowLayout.java (FlowLayout(), FlowLayout(int)): Set + gaps to 5. + (FlowLayout(int,int,int)): Use methods to set fields. + (getSize): Skip invisible components. + (layoutContainer): Skip invisible components. + + 2001-12-19 Bryce McKinlay + + * include/jvm.h (_Jv_BuildGCDescr): Declare unconditionally. + * nogc.cc (_Jv_BuildGCDescr): Define unconditionally. + * boehm.cc (_Jv_BuildGCDescr): Likewise. + + 2001-12-18 Tom Tromey + + * java/text/CollationElementIterator.java (secondaryOrder): Cast + result to `short'. + (tertiaryOrder): Likewise. + + 2001-12-16 Tom Tromey + + For PR libgcj/5103: + * include/jvm.h (__GCJ_JNI_IMPL__): Define. + * include/config.h.in: Rebuilt. + * configure: Rebuilt. + * configure.in: Define JV_HAVE_INTTYPES_H if inttypes.h found. + Added comment for HAVE_DLOPEN to avoid autoheader error. + * gcj/libgcj-config.h.in (JV_HAVE_INTTYPES_H): Added. + * include/jni.h: Include . Don't include + CNI-specific headers if we are compiling ordinary JNI code with a + C++ compiler. Include and JNIWeakRef.h when + appropriate. + * jni.cc: Don't include JNIWeakRef.h. + (__GCJ_JNI_IMPL__): Don't define. + + For PR java/5088: + * java/lang/natClassLoader.cc (_Jv_InitNewClassFields): New + function. + (_Jv_NewClass): Use it. + (defineClass0): Use it. + * prims.cc (_Jv_InitPrimClass): Adjust vtable here. + (_Jv_InitPrimClass): Use _Jv_InitNewClassFields. + (_Jv_NewArray): Don't abort; just throw exception. + Include InternalError.h. + * java/lang/Class.h (Class::Class): Declare, don't define. + (Class): Declare _Jv_InitNewClassFields as a friend. + (union _Jv_Self): Removed. + + * Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Removed old file; + added new file. + * gnu/java/math/MPN.java: New file. + * gnu/gcj/math/MPN.java: Removed. + * java/math/BigInteger.java: Merged with Classpath. + + 2001-12-16 Bryce McKinlay + + * java/io/DataOutputStream (write (byte[], int, int)): Update + "written" correctly. Fix from the ORP team. + + 2001-12-15 Bryce McKinlay + + * include/jvm.h (_Jv_VTable::idx_to_offset): New method. + * java/lang/natClassLoader.cc (_Jv_PrepareCompiledClass): Call + _Jv_MakeVTable and _Jv_LinkOffsetTable if needed. + * java/lang/Class.h (_Jv_Method): Add "index" field. + (_Jv_MethodSymbol): New struct type. + (_Jv_LinkOffsetTable, _Jv_LayoutVTableMethods, _Jv_SetVTableEntries, + _Jv_MakeVTable): Friends. + (otable, otable_syms): New Class fields. + * java/lang/natClass.cc (_Jv_LinkOffsetTable): New function. + (isVirtualMethod): New static function. + (_Jv_LayoutVTableMethods): New function. + (_Jv_SetVTableEntries): New function. + (_Jv_MakeVTable): New function. + + 2001-12-15 Bryce McKinlay + + * java/util/BitSet.java (and): Fix off-by-one bug, don't skip part of + the bitset. + (andNot): Likewise. + (xor): Likewise. + + 2001-12-15 Bryce McKinlay + + * java/util/LinkedList.java (LinkedListItr.add): Don't skip the next + entry. + + 2001-12-15 Eric Blake + + * java/util/TreeMap.java (removeNode): Fix bug in node removal. + + 2001-12-15 Bryce McKinlay + + * java/util/AbstractCollection.java (containsAll): Use size of the + correct collection for loop bound. + * java/util/AbstractList.java (iterator.next): Increment pos after + calling get on backing list. + (listIterator.next): Likewise. + * java/util/LinkedList.java (addLastEntry): Don't increment size before + checking for size == 0. + (addFirstEntry): Rearrange to match addLastEntry. + (add): Do not increment size before inserting the new entry. + + * java/util/AbstractCollection.java (addAll): Use size of the + correct collection for loop bound. + + 2001-12-15 Bryce McKinlay + + * java/util/AbstractSet.java (removeAll): Fix scoping thinko. + * java/util/HashMap.java (putAllInternal): Set size here. + * java/util/Hashtable.java (putAllInternal): New method. Copy contents + of a map efficiently without calling put() or putAll(). + (Hashtable (map)): Use putAllInternal. + (clone): Likewise. + + 2001-12-15 Eric Blake + + * java/util/Collections.java: + * java/util/Vector.java: + * java/util/WeakHashMap.java: Fix spelling errors. + + 2001-12-15 Eric Blake + + * java/util/AbstractCollection.java (removeAllInternal), + (retainAllInternal): Add hooks for use by ArrayList. + * java/util/AbstractList.java: Minor code updates. Fix some + scoping. + * java/util/AbstractMap.java: ditto + * java/util/ArrayList.java (readObject, writeObject): ditto + (removeAllInternal, retainAllInternal): Optimize. + * java/util/Arrays.java: ditto + * java/util/Collections.java: ditto. Change order of parameters + to equals(Object, Object) to match specs. + * java/util/Dictionary.java: Improve javadoc. + (Dictionary): Add explicit constructor. + * java/util/HashMap.java: Improve javadoc. Rearrange methods to + follow order in JDK. Cleanups related to recent code migration to + AbstractMap. Fix some scoping. + (entrySet): Cache the result. + (modCount): Ensure that this is updated correctly. + * java/util/HashSet.java: Improve javadoc. Fix some scoping. + (init): Add hooks for LinkedHashSet. + (map): Use "" instead of Boolean.TRUE in backing map. Use + package-private API where possible for less overhead. + (readObject, writeObject): Fix serialization. + * java/util/Hashtable.java: Improve javadoc. Fix some scoping. + (entrySet, keySet, values): Cache the result. + (modCount): Ensure that this is updated correctly. + (contains, remove): Fix NullPointer checking to match specs. + (class Enumeration): Make more like HashIterator. + * java/util/IdentityHashMap.java: Minor code updates. + (modCount): Ensure that this is updated correctly. + (readObject, writeObject): Fix serialization. + * java/util/LinkedHashMap.java: Minor code updates. Cleanups + related to recent code migration to AbstractMap. + * java/util/LinkedHashSet.java: New file. + * java/util/LinkedList.java: + (readObject, writeObject): Fix serialization. + * java/util/Makefile.am: List recently added files. + * java/util/Stack.java: Minor code updates. + * java/util/TreeMap.java: Improve javadoc. Overhaul the class to + be more efficient. Fix some scoping. Rearrange the methods. + (nil): Ensure that this can be thread-safe, and make it a static + final. Initialize it to be more useful as a sentinal node. + (Node): Specify color in constructor. + (deleteFixup, insertFixup): Improve comments and algorithm. + (fabricateTree): Redesign with less overhead. + (lowestGreaterThan): Add parameter first to make SubMap easier. + (removeNode): Patch hole where nil was being modified. Choose + predecessor instead of successor so in-place swap works. + (class VerifyResult, verifyTree, verifySub, verifyError): Remove + this dead code after verifying the class works. + (class SubMap): Rewrite several algorithms to avoid problems with + comparing nil. + * java/util/TreeSet.java: Improve javadoc. Fix some scoping. + (clone): Fix ClassCastException when cloning subSet(). + (readObject, writeObject): Fix serialization. + * java/util/WeakHashMap.java: Improve javadoc. Fix some scoping. + (NULL_KEY): Make it compare as null, for ease elsewhere. + (Class WeakEntry): Rename from Entry, to avoid shadowing + Map.Entry. Add missing toString. + (modCount): Ensure that this is updated correctly. + (clear, containsValue, keySet, putAll, values, WeakHashMap(Map)): + Add missing methods and constructor. + + 2001-12-15 Eric Blake + + * java/util/ArrayList.java (checkBoundExclusive), + (checkBoundInclusive): Rename from range??clusive, to match + AbstractList. + * java/util/LinkedList.java (checkBoundsExclusive), + (checkBoundsInclusive): ditto + * java/util/Vector.java (checkBoundExclusive), + (checkBoundInclusive): Move bounds checking into common methods. + + 2001-12-15 Eric Blake + + * java/util/AbstractList.java: + (modCount): Make sure it is updated in all needed places. + * java/util/ArrayList.java: Improve javadoc. Implements + RandomAccess. Add serialVersionUID. Reorder methods. + (modCount): Make sure it is updated in all needed places. + (rangeExclusive, rangeInclusive): Add common methods for bounds + check. + (isEmpty): Add missing method. + * java/util/Collections.java: (class SynchronizedList): Make + package visible. + * java/util/ConcurrentModificationException.java: Improve + javadoc. + * java/util/EmptyStackException.java: Improve javadoc. + * java/util/LinkedList.java: Improve javadoc. + (modCount): Make sure it is updated in all needed places. + (rangeExclusive, rangeInclusive): Add common methods for bounds + check. + * java/util/NoSuchElementException.java: Improve javadoc. + * java/util/Stack.java: Improve javadoc. Fix synchronization + issues. + (modCount): Make sure it is updated in all needed places. + * java/util/Vector.java: Improve javadoc. Fix synchronization + issues. Implements RandomAccess. Reorder methods. + (modCount): Make sure it is updated in all needed places. + (setSize): Fix according to specifications: this does not dictate + the backing array size. + (removeAll, retainAll): Faster implementations. + + 2001-12-15 Eric Blake + + * java/util/BitSet.java: Improve javadoc. + (cardinality(), clear(), clear(int, int), flip(int)), + (flip(int, int), get(int, int), intersects(BitSet), isEmpty()), + (nextClearBit(int), nextSetBit(int), set(int, boolean)), + (set(int, int), set(int, int, boolean)): Add new JDK 1.4 methods. + (clone): Fix so subclasses clone correctly. + + 2001-12-15 Eric Blake + + * java/util/AbstractCollection.java: Improve javadoc. + (AbstractCollection()): Make constructor protected. + (equals(Object, Object), hashCode(Object)): Add utility methods. + * java/util/AbstractList.java: Improve javadoc. + (AbstractList()): Make constructor protected. + (indexOf(Object)): Call listIterator(), not listIterator(int). + (iterator()): Follow Sun's requirement to not use listIterator(0). + (listIterator(int)): Make AbstractListItr anonymous. + (subList(int, int)): Add support for RandomAccess. + (SubList.add(int, Object), SubList.remove(Object)): Fix bug with + modCount tracking. + (SubList.addAll(Collection)): Add missing method. + (SubList.listIterator(int)): Fix bugs in indexing, modCount + tracking. + (class RandomAccessSubList): Add new class. + * java/util/AbstractMap.java: Improve javadoc. + (keys, values, KEYS, VALUES, ENTRIES): Consolidate common map + fields. + (AbstractMap()): Make constructor protected. + (equals(Object, Object), hashCode(Object)): Add utility methods. + (equals(Object)): Change algorithm to + entrySet().equals(m.entrySet()), as documented by Sun. + (keySet(), values()): Cache the collections. + * java/util/AbstractSequentialList.java: Improve javadoc. + (AbstractSequentialList()): Make constructor protected. + * java/util/AbstractSet.java: Improve javadoc. + (AbstractSet()): Make constructor protected. + (removeAll(Collection)): Add missing method. + * java/util/Arrays.java: Improve javadoc, rearrange method orders. + (defaultComparator): Remove, in favor of + Collections.compare(Object, Object, Comparator). + (binarySearch, equals, sort): Fix natural order comparison of + floats and doubles. Also improve Object comparison - when + comparator is null, use natural order. + (fill, sort): Add missing checks for IllegalArgumentException. + (sort, qsort): Fix sorting bugs, rework the code for more + legibility. + (mergeSort): Inline into sort(Object[], int, int, Comparator). + (class ArrayList): Rename from ListImpl, and make compatible with + JDK serialization. Add methods which more efficiently override + those of AbstractList. + * java/util/Collections: Improve javadoc. + (isSequential(List)): Add and use a method for deciding between + RandomAccess and sequential algorithms on lists. + (class Empty*, class Synchronized*, class Unmodifiable*): Make + compliant with JDK serializability. + (class Singleton*, class CopiesList, class RevereseComparator), + (class UnmodifiableMap.UnmodifiableEntrySet), + (class *RandomAccessList): New classes for serial compatibility. + (class Empty*, class Singleton*, class CopiesList): Add methods + which more efficiently override those of Abstract*. + (search): Inline into binarySearch(List, Object, Comparator). + (binarySearch): Make sequential search only do log(n) comparisons, + instead of n. + (copy(List, List)): Do bounds checking before starting. + (indexOfSubList, lastIndexOfSubList, list, replaceAll, rotate), + (swap): Add new JDK 1.4 methods. + (binarySearch, max, min, sort): Allow null comparator to represent + natural ordering. + (reverse(List)): Avoid unnecessary swap. + (shuffle(List, Random)): Do shuffle in-place for RandomAccess + lists. + (SingletonList.get): Fix logic bug. + (SingletonMap.entrySet): Make the entry immutable, and cache the + returned set. + (SynchronizedCollection, SynchronizedMap, UnmodifiableCollection), + (UnmodifiableMap): Detect null pointer in construction. + (SynchronizedMap, UnmodifiableMap): Cache collection views. + * java/util/BasicMapEntry: Improve javadoc. + + 2001-12-14 Hans Boehm + + * libjava/prims.cc: Some old cleanups. The collector now + handles test for out of memory. + + * libjava/prims.cc, libjava/gcj/javaprims.h: + (_Jv_AllocObjectNoInitNoFinalizer, _Jv_AllocObjectNoFinalizer): + New functions for finalizer-free allocation. + (jvmpi_notify_alloc): Became separate function. + + * libjava/java/lang/Object.h, libjava/include/jvm.h: Adjust for + revised vtable layout on IA64. With TARGET_VTABLE_USES_DESCRIPTORS, + there is only one extra descriptor. + + 2001-12-12 Tom Tromey + + * prims.cc (_Jv_RunMain): Use `using' to simplify code. Set + _Jv_Jar_Class_Path early. + + * jni.cc (call): Synchronize if required. + + * gij.cc (main): Clarify --help output. + + * gnu/gcj/runtime/StringBuffer.java + (ensureCapacity_unsynchronized): Ensure we always get at least + `minimumCapacity' characters in new buffer. + + 2001-12-11 Tom Tromey + + * java/lang/String.java (String): New constructor. + * gnu/gcj/runtime/natStringBuffer.cc: New file. + * gnu/gcj/runtime/StringBuffer.java: New file. + * Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Added + gnu/gcj/runtime/StringBuffer.java. + (nat_source_files): Added gnu/gcj/runtime/natStringBuffer.cc. + + 2001-12-10 Tom Tromey + + For PR libgcj/1147: + * prims.cc (JvConvertArgv): Convert using current locale's + encoding. + + 2001-12-10 Tom Tromey + + Fix for PR libgcj/5064. + * java/lang/natClassLoader.cc: Don't include stdio.h. + (_Jv_RegisterClassHookDefault): Don't use snprintf. + + 2001-12-09 Per Bothner + + * gnu/gcj/xlib/XImage.java (toString): Add missing initialization. + + 2001-12-09 Tom Tromey + + * resolve.cc (_Jv_PrepareClass): Verify method here... + * defineclass.cc (handleMethodsEnd): ... not here. + * verify.cc (_Jv_BytecodeVerifier::initialize_stack): New method. + (_Jv_BytecodeVerifier::verify_instructions_0) [op_return]: Ensure + there are no uninitialized objects. + (_Jv_BytecodeVerifier::state::this_type): New field. + (_Jv_BytecodeVerifier::state::state): Initialize this_type. + (_Jv_BytecodeVerifier::state::copy): Copy this_type. + (_Jv_BytecodeVerifier::state::merge): Merge this_type. + (_Jv_BytecodeVerifier::state::check_no_uninitialized_objects): + Handle this_type. + (_Jv_BytecodeVerifier::state::check_this_initialized): New + method. + (_Jv_BytecodeVerifier::state::set_initialized): Handle this_type. + (_Jv_BytecodeVerifier::state::set_this_type): New method. + (_Jv_BytecodeVerifier::verify_instructions_0) [op_putfield]: Allow + assignment to fields of `this' before another initializer is run. + + * Makefile.in: Rebuilt. + * Makefile.am (gnu/gcj/runtime/VMClassLoader.h): Use `::java'. + + 2001-12-08 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (java/lang/reflect/Method.h): ObjectInputStream now + a friend. + * java/lang/natClass.cc (getSignature): Only look at elements of + non-null parameters. + (getPrivateMethod): Removed old FIXME comment. + * java/io/natObjectInputStream.cc (allocateObject): Removed old + FIXME comment. + (callConstructor): Simply use `NULL' for value of parameters. + (ObjectClass): Removed. + (ClassClass): Likewise. + * java/io/ObjectInputStream.java (readObject): Fixed typo. + + * verify.cc (_Jv_BytecodeVerifier::is_assignable_from_slow): + Handle case of array whose component type is not prepared. + + 2001-12-07 Tom Tromey + + * java/lang/ClassLoader.java (defineClass): Rethrow any + LinkageError. + + * java/lang/ThreadGroup.java (uncaughtException): Print message to + System.err. Required by spec. + + * verify.cc (_Jv_BytecodeVerifier::branch_prepass): Set start_PC + earlier, for error handling. + (_Jv_BytecodeVerifier::note_branch_target): Fixed branch target + check. + + 2001-12-06 Tom Tromey + + * verify.cc (_Jv_BytecodeVerifier::FLAG_JSR_TARGET): Removed. + (_Jv_BytecodeVerifier::note_branch_target): Likewise. + + * verify.cc (_Jv_BytecodeVerifier::type_val): Added + unused_by_subroutine_type. + (_Jv_BytecodeVerifier::type::merge): Handle + unused_by_subroutine_type. + (_Jv_BytecodeVerifier::state::state): Added `ret_semantics' + argument. + (_Jv_BytecodeVerifier::state::copy): Likewise. + (_Jv_BytecodeVerifier::push_jump_merge): Pass `ret_semantics' to + state constructor. + (_Jv_BytecodeVerifier::state::is_unmerged_ret_state): New method. + (_Jv_BytecodeVerifier::pop_jump): Don't accept a jump which is + from an unmerged ret. + (_Jv_BytecodeVerifier::verify_instructions_0): Don't let an + unmerged ret state skip verification in the fall-through case. + (debug_print): New function. + (_Jv_BytecodeVerifier::type::print): New method. + (_Jv_BytecodeVerifier::state::print): New method. + (_Jv_BytecodeVerifier::push_jump_merge): Print state. + (_Jv_BytecodeVerifier::verify_instructions_0): Likewise. + (_Jv_BytecodeVerifier::get_variable): Don't call note_variable. + (_Jv_BytecodeVerifier::_Jv_BytecodeVerifier): Print debug + information. + + 2001-12-05 Tom Tromey + + * defineclass.cc (character): Removed. + (prepare_character): Removed. + (is_identifier_start): Use Character, not character. + (is_identifier_part): Likewise. + + 2001-12-04 Tom Tromey + + * verify.cc (_Jv_BytecodeVerifier::linked_utf8): New structure. + (_Jv_BytecodeVerifier::utf8_list): New field. + (_Jv_BytecodeVerifier::_Jv_BytecodeVerifier): Initialize it. + (_Jv_BytecodeVerifier::~_Jv_BytecodeVerifier): Free it. + (_Jv_BytecodeVerifier::make_utf8_const): New method. + (_Jv_BytecodeVerifier::get_one_type): Use it. + (_Jv_BytecodeVerifier::type::merge): When using local semantics, + if the destination type is already unsuitable then we didn't + change. + + * defineclass.cc (read_one_method_attribute): `end_pc' for an + exception can be equal to code length. + * verify.cc (_Jv_BytecodeVerifier::verify_instructions_0): Removed + `start_PC' from error invocation where it didn't make sense, and + updated error message. Use `copy' to copy a state. Only try to + merge current state with saved state when we've fallen through + from the previous instruction. + (_Jv_BytecodeVerifier::pop_ref_or_return): New method. + (_Jv_BytecodeVerifier::verify_instructions_0) [op_astore_0]: Use + pop_ref_or_return. + (_Jv_BytecodeVerifier::verify_instructions_0) [op_astore]: + Likewise. + (_Jv_BytecodeVerifier::push_jump_merge): Pass max_locals, not + max_stack, to merge. + (_Jv_BytecodeVerifier::verify_instructions_0): Likewise. + (_Jv_BytecodeVerifier::push_jump_merge): Merge from new state into + state at branch target, not vice versa. + (_Jv_BytecodeVerifier::branch_prepass): Allow end of exception to + be equal to code length. Removed redundant test to see if + exception start is after exception end. + (_Jv_BytecodeVerifier::verify_instructions_0): Type of argument to + `finally' is Throwable. + + 2001-12-04 Bryce McKinlay + + * Makefile.in: Rebuilt with automake-gcj. + + 2001-12-03 Tom Tromey + + * defineclass.cc (handleMethodsEnd): Invoke verifier here... + (handleCodeAttribute): ... not here. + * verify.cc (_Jv_BytecodeVerifier::state::state): Use `copy', not + structure assignment. + + 2001-12-02 Bryce McKinlay + + * Makefile.am (nat_files, x_nat_files): Make sure the dependencies + don't get deleted if compilation fails. + * Makefile.in: Rebuilt. + + 2001-11-30 Bryce McKinlay + + * Makefile.am (nat_headers, x_nat_headers): Depend on .class files, not + libgcj.jar. + (nat_files, x_nat_files): Build native files in subdirectories using + the same dependency options as the java files. + (gnu/gcj/runtime/FirstThread.h): Remove explicit rule and friend + declarations. + * configure.in: Put dependencies for .cc files in deps.mak. + * Makefile.in: Rebuilt. + * configure: Rebuilt. + + 2001-11-25 Tom Tromey + + Fix for PR libgcj/2024, plus other class name cleanups: + * include/jvm.h (_Jv_VerifyFieldSignature, + _Jv_VerifyMethodSignature, _Jv_VerifyClassName, + _Jv_VerifyIdentifier, _Jv_ClassNameSamePackage): Moved from ... + * include/java-interp.h: ... here. + * defineclass.cc (UTF8_PEEK): No longer conditional on + interpreter. + (_Jv_VerifyOne): Likewise. + (_Jv_VerifyFieldSignature): Likewise. + (_Jv_VerifyMethodSignature): Likewise. + (is_identifier_start): Likewise. + (is_identifier_part): Likewise. + (_Jv_VerifyIdentifier): Likewise. + (_Jv_VerifyClassName): Likewise. + (_Jv_VerifyClassName): Likewise. + (_Jv_ClassNameSamePackage): Likewise. + (_Jv_VerifyClassName): Fail if class name is too long. + * java/lang/natClassLoader.cc (_Jv_NewArrayClass): Disallow array + of void. + * java/lang/natClass.cc (forName): Check syntax of class name. + Include IllegalArgumentException.h. + + 2001-11-22 Tom Tromey + + * verify.cc (_Jv_BytecodeVerifier::branch_prepass): Use + java_opcode as type for switch. + [op_wide]: Likewise. + (_Jv_BytecodeVerifier::verify_instructions_0): Likewise. + [op_invokevirtual]: Likewise. + * include/java-insns.h (java_opcode): Give enum a name. + + 2001-11-25 Tom Tromey + + Fix for PR libgcj/4583: + * java/math/BigDecimal.java (BigDecimal(double)): Rewrote. + (BigDecimal(String)): Likewise. + + 2001-11-19 Tom Tromey + + * verify.cc (_Jv_BytecodeVerifier::branch_prepass) [op_iinc]: + Uses two operand bytes, not one. + [op_arraylength]: Has no operands in bytecode. + (_Jv_BytecodeVerifier::push_jump): Fixed call to + check_no_uninitialized_objects. + (_Jv_BytecodeVerifier::push_exception_jump): Likewise. + (_Jv_BytecodeVerifier::handle_ret_insn): Likewise. + (_Jv_BytecodeVerifier::handle_jsr_insn): Likewise. + + * verify.cc (_Jv_BytecodeVerifier::require_array_type): Special + case for boolean arrays. + + * verify.cc (_Jv_BytecodeVerifier::compute_jump): Put PC into + error message. + + * verify.cc (_Jv_BytecodeVerifier::verify_instructions_0) + [op_lshl, op_lshr, op_lushr]: Shift argument is an int, not a + long. + + 2001-11-18 Tom Tromey + + * verify.cc (type::to_array): New method. + (_Jv_BytecodeVerifier::verify_instructions_0) [op_anewarray]: + Construct new array type. + + * verify.cc (_Jv_BytecodeVerifier::branch_prepass) [op_sipush]: + Skip a short, not a byte. + [op_newarray]: Skip a byte, not a short. + + * verify.cc (_Jv_BytecodeVerifier::get_type_val_for_signature): + Added `B' case. + + * verify.cc (_Jv_BytecodeVerifier::get_ushort): Use `jint' for + temporary values. + (_Jv_BytecodeVerifier::get_short): Likewise. + (_Jv_BytecodeVerifier::get_int): Likewise. + (_Jv_BytecodeVerifier::check_return_type): Reverse ordering of + `compatible' call. + + * verify.cc (_Jv_BytecodeVerifier::pop_type): Put PC into error + message. + (_Jv_BytecodeVerifier::pop64): Likewise. + (_Jv_BytecodeVerifier::pop32): Likewise. + (_Jv_BytecodeVerifier::pop_raw): Likewise. + (_Jv_BytecodeVerifier::pop_type): Promote the match type. + (type::set_initialized): Only modify uninitialized types. + (type::set_uninitialized): Fix shadowing bug. Simplify code. + + * verify.cc: Include StringBuffer.h. + (verify_fail): Added pc argument. Use StringBuffer to construct + exception message. + (_Jv_BytecodeVerifier::verify_instructions_0): Put PC into error + message. + (_Jv_BytecodeVerifier::check_return_type): Likewise. + (_Jv_BytecodeVerifier::handle_field_or_method): Likewise. + (_Jv_BytecodeVerifier::check_constant): Likewise. + (_Jv_BytecodeVerifier::check_class_constant): Likewise. + (_Jv_BytecodeVerifier::check_pool_index): Likewise. + (_Jv_BytecodeVerifier::get_variable): Likewise. + (_Jv_BytecodeVerifier::branch_prepass): Likewise. Also, correctly + check exception handler endpoint. + (_Jv_BytecodeVerifier::verify_instructions_0): Correctly handle + wide arguments to current method. + (_Jv_BytecodeVerifier::check_wide_constant): New method. + (_Jv_BytecodeVerifier::verify_instructions_0) [op_ldc2_w]: Use + it. + + 2001-11-17 Anthony Green + + * jni.cc (unwrap): Fix test for wrapped objects. + + 2001-11-16 Tom Tromey + + * verify.cc (_Jv_BytecodeVerifier::check_field_constant): Handle + case where field has primitive type. + + * verify.cc (_Jv_BytecodeVerifier::is_assignable_from_slow): New + method. + (type::compatible): Use it. + (type::merge): Likewise. + (type::promote): Return a `type&'. + (get_one_type): Promote return value. + + Re-merge with Classpath, from Brian Jones: + * java/lang/Integer.java (getInteger): Attempt to decode the value + of the system property instead of the name of the system property. + (parseInt): Throw NumberFormatException explicitly in the case of + a null argument in keeping with JDK 1.3. + + 2001-11-16 Mark Wielaard + + * java/util/Timer.java (TaskQueue.isStopped): Remove method. + (Scheduler.run): Try to re-schedule task and ignore exception if + queue has been stopped. + + 2001-11-15 Tom Tromey + + * verify.cc (type::compatible): Use _Jv_IsAssignableFrom. + (type::merge): Likewise. + + 2001-11-14 Hans Boehm + + * java/lang/natString.cc: correct argument order for + _Jv_AllocPtrFreeObj + + 2001-11-14 Tom Tromey + + * verify.cc (class _Jv_BytecodeVerifier) [op_dup2]: Fixed logic. + [op_dup_x2]: Likewise. + [op_dup2_x1]: Likewise. + [op_dup2_x2]: Likewise. + (branch_prepass): Added `op_newarray' case. Updated unrecognized + instruction error. + (verify_instructions_0): Updated unrecognized instruction error. + + * java/lang/reflect/Constructor.java (toString): Use more + efficient form of Modifier.toString(). + + Re-merges with Classpath, from various people: + * java/lang/reflect/Modifier.java: Reindented. + (toString): Only trim trailing space if text was added to + StringBuffer. + * java/lang/reflect/ReflectPermission: Reindented. + + Re-merges with Classpath, from various people: + * java/lang/Double.java (parseDouble): Fixed ordering of + modifiers. + * java/lang/reflect/AccessibleObject.java: Javadoc, reindented. + * java/lang/reflect/Member.java: Reindented. + * java/util/ConcurrentModificationException.java: Javadoc + updates. + * java/util/EmptyStackException.java: Likewise. + * java/util/NoSuchElementException.java: Likewise. + + 2001-11-13 Tom Tromey + + Fix for PR libgcj/4859: + * java/util/Timer.java (TaskQueue.isStopped): New method. + (Scheduler.run): Don't re-schedule task if queue has been + stopped. + + 2001-11-07 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Added JNIWeakRef.java. + * jni.cc: Include JNIWeakRef.h. + (unwrap): New function. + (_Jv_JNI_DefineClass): Use it. + (_Jv_JNI_GetSuperclass): Likewise. + (_Jv_JNI_IsAssignableFrom): Likewise. + (_Jv_JNI_Throw): Likewise. + (_Jv_JNI_ThrowNew): Likewise. + (_Jv_JNI_IsSameObject): Likewise. + (_Jv_JNI_AllocObject): Likewise. + (_Jv_JNI_GetObjectClass): Likewise. + (_Jv_JNI_IsInstanceOf): Likewise. + (_Jv_JNI_GetAnyMethodID): Likewise. + (array_from_valist): Likewise. + (_Jv_JNI_CallAnyMethodV): Likewise. + (_Jv_JNI_CallAnyMethodA): Likewise. + (_Jv_JNI_CallAnyVoidMethodV): Likewise. + (_Jv_JNI_CallAnyVoidMethodA): Likewise. + (_Jv_JNI_CallStaticMethodV): Likewise. + (_Jv_JNI_CallStaticMethod): Likewise. + (_Jv_JNI_CallStaticMethodA): Likewise. + (_Jv_JNI_NewObjectV): Likewise. + (_Jv_JNI_NewObject): Likewise. + (_Jv_JNI_NewObjectA): Likewise. + (_Jv_JNI_GetField): Likewise. + (_Jv_JNI_SetField): Likewise. + (_Jv_JNI_GetAnyFieldID): Likewise. + (_Jv_JNI_SetStaticField): Likewise. + (_Jv_JNI_GetStringLength): Likewise. + (_Jv_JNI_GetStringChars): Likewise. + (_Jv_JNI_ReleaseStringChars): Likewise. + (_Jv_JNI_GetStringUTFLength): Likewise + (_Jv_JNI_GetStringUTFChars): Likewise. + (_Jv_JNI_GetStringRegion): Likewise. + (_Jv_JNI_GetStringUTFRegion): Likewise. + (_Jv_JNI_GetStringCritical): Likewise. + (_Jv_JNI_GetArrayLength): Likewise. + (_Jv_JNI_NewObjectArray): Likewise. + (_Jv_JNI_GetObjectArrayElement): Likewise. + (_Jv_JNI_SetObjectArrayElement): Likewise. + (_Jv_JNI_GetPrimitiveArrayElements): Likewise. + (_Jv_JNI_ReleasePrimitiveArrayElements): Likewise. + (_Jv_JNI_GetPrimitiveArrayRegion): Likewise. + (_Jv_JNI_SetPrimitiveArrayRegion): Likewise. + (_Jv_JNI_MonitorEnter): Likewise. + (_Jv_JNI_MonitorExit): Likewise. + (_Jv_JNI_ToReflectedField): Likewise. + (_Jv_JNI_FromReflectedField): Likewise. + (_Jv_JNI_ToReflectedMethod): Likewise. + (_Jv_JNI_FromReflectedMethod): Likewise. + (_Jv_JNI_NewGlobalRef): Likewise. + (_Jv_JNI_DeleteGlobalRef): Likewise. + (_Jv_JNI_DeleteLocalRef): Likewise. + (_Jv_JNI_NewLocalRef): Likewise. + (_Jv_JNI_NewWeakGlobalRef): New function. + (_Jv_JNI_DeleteWeakGlobalRef): Likewise. + (_Jv_JNIFunctions): Updated for new methods. + (NOT_IMPL): Removed. + * gnu/gcj/runtime/JNIWeakRef.java: New file. + + 2001-11-12 Bryce McKinlay + + * boehm.cc (_Jv_GCCanReclaimSoftReference): Fix warning. + + 2001-11-09 Jeff Sturm + + * verify.cc: Wrap in #ifdef INTERPRETER...#endif. + + 2001-11-07 Tom Tromey + + * verify.cc (skip_padding): Fail if padding byte is nonzero. + + 2001-11-06 Tom Tromey + + * HACKING: Make people commit their own patches. + + 2001-11-05 Tom Tromey + + * java/lang/Class.h (Class): Made _Jv_BytecodeVerifier a friend. + * Makefile.in: Rebuilt. + * Makefile.am (libgcj_la_SOURCES): Added verify.cc. + * verify.cc: New file. + * include/java-interp.h (_Jv_count_arguments): Declare. + (_Jv_VerifyMethod): Likewise. + (class _Jv_InterpMethod): Made _Jv_BytecodeVerifier a friend. + (class _Jv_InterpException): Likewise. + * resolve.cc (_Jv_count_arguments): Renamed from count_arguments. + No longer static. Updated callers. + * defineclass.cc (int_bits_to_float): Removed. + (long_bits_to_double): Likewise. + (prepare_pool_entry): Updated. + (handleCodeAttribute): Verify method (commented out for now). + + 2001-11-05 Bryce McKinlay + + * java/util/ResourceBundle.java (class Security): Now static. + + 2001-11-04 Bryce McKinlay + + * java/util/ResourceBundle.java (getClassContext): Removed. + (Security): New class, extends SecurityManger. + (getBundle): Use Security.getCallingClassLoader instead of + getClassContext. + * java/util/natResourceBundle.cc: Removed. + + 2001-11-03 Tom Tromey + + * defineclass.cc (handleClassBegin): Use Object::class$, not + Class::class$, when initializing interface superclass. + + 2001-11-02 Hans Boehm + + * java/util/natResourceBundle.cc:getClassContext: return + array of Class instead of array of ClassLoader. + + 2001-10-31 Joseph S. Myers + + * HACKING, gnu/gcj/xlib/Pixmap.java, gnu/gcj/xlib/XException.java, + gnu/java/rmi/rmic/RMIC.java, java/awt/Window.java, + java/awt/AWTEvent.java, java/io/ByteArrayOutputStream.java, + java/io/CharConversionException.java, + java/io/PipedInputStream.java, java/io/PipedReader.java, + java/io/PrintWriter.java, java/io/WriteAbortedException.java, + java/io/natFileWin32.cc, java/lang/Class.h, + java/lang/natClassLoader.cc, java/lang/natObject.cc, + java/lang/Package.java, java/net/BindException.java, + java/net/ConnectException.java, java/net/ProtocolException.java, + java/net/SocketException.java, + java/net/UnknownServiceException.java, + java/security/cert/X509Certificate.java, + java/security/interfaces/DSAKey.java, + java/security/SecureRandom.java, java/security/SignedObject.java, + java/sql/DatabaseMetaData.java, + java/text/DecimalFormatSymbols.java, + java/util/jar/Attributes.java, java/util/jar/JarEntry.java, + java/util/jar/JarInputStream.java, + java/util/jar/JarOutputStream.java, java/util/Calendar.java, + java/util/Collections.java, java/util/GregorianCalendar.java, + java/util/HashMap.java, java/util/List.java, + java/util/Properties.java, java/util/Timer.java, + java/util/Vector.java, java/util/WeakHashMap.java, + javax/naming/NamingException.java, + testsuite/libjava.lang/Thread_Wait.java, + org/xml/sax/helpers/DefaultHandler.java, + org/xml/sax/HandlerBase.java, org/xml/sax/SAXParseException.java, + ChangeLog, acinclude.m4, aclocal.m4, posix-threads.cc: Fix + spelling errors. + * configure: Regenerate. + + 2001-10-30 Bryce McKinlay + + * jni.cc (JNI_CreateJavaVM): Call _Jv_CreateJavaVM. Don't call + _Jv_JNI_Init. + + 2001-10-29 Tom Tromey + + * java/util/zip/GZIPOutputStream.java (write(int)): New method. + Fixes PR libgcj/4728. + + 2001-10-27 Tom Tromey + + * include/jni.h (struct JNINativeInterface) [GetStringLength]: + Returns jsize, not jint. + + 2001-10-26 Tom Tromey + + * java/util/zip/Adler32.java: Use correct class name. (Re-merge + from Classpath.) + + 2001-10-25 Bryce McKinlay + + * java/lang/VMClassLoader.java (getPrimitiveClass): Now native. Now + takes a jchar type-code argument, not a string. + * java/lang/natClassLoader.cc (VMClassLoader::getPrimitiveClass): + New method. Just call _Jv_FindClassFromSignature. + * java/lang/Boolean.java (TYPE): Initialize from + VMClassLoader.getPrimitiveClass using type-code. + * java/lang/Character.java (TYPE): Likewise. + * java/lang/Double.java (TYPE): Likewise. + * java/lang/Float.java (TYPE): Likewise. + * java/lang/Integer.java (TYPE): Likewise. + * java/lang/Long.java (TYPE): Likewise. + * java/lang/Short.java (TYPE): Likewise. + * java/lang/Void.java (TYPE): Likewise. + + 2001-10-25 Hans Boehm + + * include/boehm-gc.h: Call thread local allocation functions + if THREAD_LOCAL_ALLOC is defined. + + 2001-10-25 Bryce McKinlay + + * java/lang/natClassLoader.cc (_Jv_RegisterClassHookDefault): Use + snprintf, not asprintf. + + 2001-10-24 Loren J. Rittle + + * configure.in (case $THREADS): Add *-*-freebsd* configuration. + (HAVE_GETHOSTBYADDR_R): Create a valid, non-optimal + configuration when gethostbyaddr_r exists yet no prototype + exists in netdb.h. + * configure: Rebuilt. + * posix-threads.cc (INTR): Reuse path for LINUX_THREADS + with FREEBSD_THREADS. However, comment different reason. + + 2001-10-24 Tom Tromey + Warren Levy + + * Makefile.in: Rebuilt. + * Makefile.am (javax_source_files): New macro. + (ordinary_java_source_files): Added javax_source_files. + (libgcj.jar): Search javax for class files. + * javax/naming/LinkException.java (toString): Wrote. + (toString(boolean)): Likewise. + * javax/naming/ldap/InitialLdapContext.java: New file. + * javax/naming/directory/InitialDirContext.java: Wrote. + * javax/naming/spi/NamingManager.java (getPlusPath): Now has + package-private protection. + (getURLContext): Likewise. + (NamingManager): Likewise. + * javax/naming/spi/DirectoryManager.java: New file. + * javax/naming/directory/BasicAttributes.java: New file. + * javax/naming/directory/BasicAttribute.java: New file. + * javax/naming/spi/ResolveResult.java + (ResolveResult(Object,String)): Wrote. + (appendRemainingName): Uncommented body. + (appendRemainingComponent): Likewise. + * javax/naming/ldap/ControlFactory.java: New file. + * javax/naming/directory/AttributeModificationException.java + (toString): Wrote. + * javax/naming/spi/NamingManager.java (NamingManager): New + constructor. + (setInitialContextFactoryBuilder): Wrote. + (getInitialContext): Look in system properties for class name as + well. Use Class.forName(). + (getURLContext): Wrote. + (ofb): New field. + (setObjectFactoryBuilder): Wrote. + (getObjectInstance): Wrote. + (getContinuationContext): Wrote. + (getPlusPath): New private method. + (getStateToBind): Wrote. + * javax/naming/CannotProceedException.java: Added missing methods & + fields. + * javax/naming/LinkException.java: Added missing methods & fields. + * javax/naming/ReferralException.java (ReferralException): Made + constructor protected per spec. + Added missing abstract methods. + * javax/naming/directory/Attribute.java: Updated copyright. + * javax/naming/directory/AttributeModificationException.java: Ditto. + * javax/naming/directory/Attributes.java: Ditto. + * javax/naming/directory/DirContext.java: Ditto. + * javax/naming/spi/NamingManager.java: Ditto. + * javax/naming/spi/ResolveResult.java: Added comment. + * javax/naming/directory/Attribute.java: Added missing interface + methods. + * javax/naming/directory/AttributeModificationException.java: + Added missing methods & fields. + * javax/naming/directory/directory/Attributes.java: Added missing + interface methods. + * javax/naming/directory/SearchControls.java: Maded serialized fields + private. + * javax/naming/event/NamingEvent.java: Added comment. + * javax/naming/event/NamingExceptionEvent.java: Maded serialized field + private. + * javax/naming/ldap/UnsolicitedNotificationEvent.java: Maded + serialized field private. + * javax/naming/spi/NamingManager.java: Added missing field and stubbed + missing methods. + * javax/naming/directory/DirContext.java: Added missing interface + fields & methods. + * javax/naming/directory/InitialDirContext.java: Stubbed missing + methods. + * javax/naming/directory/ModificationItem.java: New class. + * javax/naming/directory/SearchResult.java: New class. + * javax/naming/directory/SearchControls.java: New class. + * javax/naming/event/EventContext.java: New class. + * javax/naming/event/EventDirContext.java: New class. + * javax/naming/event/NamespaceChangeListener.java: New class. + * javax/naming/event/NamingEvent.java: New class. + * javax/naming/event/NamingExceptionEvent.java: New class. + * javax/naming/event/NamingListener.java: New class. + * javax/naming/event/ObjectChangeListener.java: New class. + * javax/naming/ldap/Control.java: New class. + * javax/naming/ldap/ExtendedRequest.java: New class. + * javax/naming/ldap/ExtendedResponse.java: New class. + * javax/naming/ldap/HasControls.java: New class. + * javax/naming/ldap/LdapContext.java: New class. + * javax/naming/ldap/LdapReferralException.java: New class. + * javax/naming/ldap/UnsolicitedNotification.java: New class. + * javax/naming/ldap/UnsolicitedNotificationEvent.java: New class. + * javax/naming/ldap/UnsolicitedNotificationListener.java: New class. + * javax/naming/spi/DirObjectFactory.java: New class. + * javax/naming/spi/DirStateFactory.java: New class. + * javax/naming/spi/ObjectFactoryBuilder.java: New class. + * javax/naming/spi/ResolveResult.java: New class. + * javax/naming/spi/Resolver.java: New class. + * javax/naming/spi/StateFactory.java: New class. + * javax/naming/spi/ObjectFactory.java: Made an interface per spec. + * java/rmi/RemoteException.java: New class. + * javax/transaction/HeuristicCommitException.java: New class. + * javax/transaction/HeuristicMixedException.java: New class. + * javax/transaction/HeuristicRollbackException.java: New class. + * javax/transaction/NotSupportedException.java: New class. + * javax/transaction/RollbackException.java: New class. + * javax/transaction/Status.java: New class. + * javax/transaction/Synchronization.java: New class. + * javax/transaction/SystemException.java: New class. + * javax/transaction/Transaction.java: New class. + * javax/transaction/TransactionManager.java: New class. + * javax/transaction/UserTransaction.java: New class. + * javax/transaction/xa/XAException.java: Added public static fields. + * javax/transaction/xa/XAResource.java: New class. + * javax/transaction/xa/Xid.java: New class. + * javax/naming/CompoundName.java (CompoundName(String)): Reverse + elements if required. Handle case where quote is at end of + string. + * javax/naming/CompoundName.java (CompoundName(String)): Handle + text left at end of parsing. + (toString): Handle empty element at beginning. + * javax/naming/CompositeName.java (toString): Handle empty element + at beginning. + (CompositeName(String)): Handle text left at end of parsing. + Correctly compute boundary condition for quoting. + * javax/naming/CompoundName.java: New file. + * javax/naming/CompositeName.java: New file. + * javax/naming/Binding.java: New file. + * javax/naming/LinkRef.java: New file. + * javax/naming/NameClassPair.java: New file. + * javax/naming/Reference.java (addrs, classFactory, + classFactoryLocation): New fields. + (className): Now protected. + (Reference): New constructors. + (add): Now public. Implemented. + (get(String)): Likewise. + (add(int,RefAddr)): New method. + (clear): Likewise. + (clone): Likewise. + (equals): Likewise. + (get(int)): Likewise. + (getAll): Likewise. + (getFactoryClassLocation): Likewise. + (getFactoryClassName): Likewise. + (hashCode): Likewise. + (remove): Likewise. + (size): Likewise. + (toString): Likewise. + * javax/transaction/xa/XAException.java: New file. + * javax/transaction/TransactionRolledbackException.java: New file. + * javax/transaction/TransactionRequiredException.java: New file. + * javax/transaction/InvalidTransactionException.java: New file. + * javax/naming/directory/SchemaViolationException.java: Use + correct package. Import NamingException. + * javax/naming/directory/NoSuchAttributeException.java, + javax/naming/directory/InvalidSearchFilterException.java, + javax/naming/directory/InvalidSearchControlsException.java, + javax/naming/directory/InvalidAttributesException.java, + javax/naming/directory/InvalidAttributeValueException.java, + javax/naming/directory/InvalidAttributeIdentifierException.java, + javax/naming/directory/AttributeModificationException.java, + javax/naming/directory/AttributeInUseException.java: Likewise. + * javax/naming/directory/InitialDirContext.java (getAttributes): + Stub implementation. + * javax/naming/RefAddr.java (RefAddr): Reindented. + (equals): Renamed and reindented. + * javax/naming/BinaryRefAddr.java (equals): Renamed and + reindented. + + 2001-10-24 Tom Tromey + + * java/lang/reflect/Field.java: Made many methods private. + + * java/sql/Types.java (Types): New constructor. + + Tue Oct 23 23:52:18 2001 Anthony Green + + * gnu/gcj/runtime/natSharedLibLoader.cc: Only include dlfcn.h when + HAVE_DLOPEN. + + 2001-10-23 Tom Tromey + + * java/lang/reflect/Field.java (Field): New constructor. + * java/lang/ClassLoader.java (defineClass(String,byte[],int,int)): + Throw ClassFormatError. + + 2001-10-23 Tom Tromey + + * java/util/PropertyResourceBundle.java (handleGetObject): Now + public. + * java/util/ListResourceBundle.java (handleGetObject): Now public + and final, per spec. + + * java/io/BufferedWriter.java (localFlush): Don't synchronize. + + 2001-10-23 Bryce McKinlay + + * prims.cc (_Jv_Abort): Always print error message using fprintf, + don't try to allocate. + (_Jv_CreateJavaVM): Set gcj::runtimeInitialized. + * include/jvm.h (gcj::runtimeInitialized): New variable declaration. + * java/lang/natClassLoader.cc (_Jv_RegisterClassHookDefault): Handle + duplicate class registration with JvFail if the runtime hasn't been + initialized yet. + + * java/io/BufferedWriter (write (String, int, int)): Remove redundant + bounds checks. + (write (char[], int, int)): Likewise. + + 2001-10-22 Tom Tromey + + * java/util/GregorianCalendar.java (getGregorianChange): Removed + `date' argument. + + 2001-10-22 Bryce McKinlay + + * gnu/gcj/convert/JIS0208_to_Unicode.cc: Declare java_exceptions pragma. + * gnu/gcj/convert/JIS0212_to_Unicode.cc: Likewise. + * gnu/gcj/convert/Unicode_to_JIS.cc: Likewise. + * gnu/gcj/convert/gen-from-JIS.c: Put java_exceptions pragma in output + file. + + 2001-10-19 Mark Wielaard + + * java/lang/Double.java: More Classpath merging + (isInfinite): Don't use doubleToLongBits + (isNaN (Object)): return v != v + (initIDs): make native + * java/lang/Float.java: Ditto + (isInfinite): Don't use floatToIntBits + (isNaN (Object)): return v != v + * java/lang/natDouble.cc: add empty initIDs() + + 2001-10-19 Mark Wielaard + + * javax/naming/BinaryRefAddr.java: New file + * javax/naming/InitialContext.java: Compile fix + * javax/naming/InvalidNameException.java: Add comments + * javax/naming/Name.java: Ditto + * javax/naming/NamingException.java: Implement + * javax/naming/OperationNotSupportedException.java: Compile fix + * javax/naming/RefAddr.java: Implement + * javax/naming/StringRefAddr.java: Add comments and implement + * javax/naming/directory/InitialDirContext.java: Compile fix + + 2001-10-18 Tom Tromey + + * java/io/BufferedWriter.java (write(String,int,int)): Correctly + check bounds. + + * java/security/Security.java (loadProviders): Removed unused + `pname' variable. Don't create `File' object. Don't update + `providerCount'. + (providerCount): Removed. + (insertProviderAt): Don't use `providerCount'. + (addProvider(Provider,int)): Likewise. + (removeProvider): Likewise. + (addProvider(Provider)): Rewrote. + (getProviders): Rewrote. + (getProvider): Don't use `providerCount'. + + 2001-10-17 Tom Tromey + + * gnu/java/security/provider/SHA1PRNG.java (engineNextBytes): + Rewrote. + * java/security/SecureRandom.java (setSeed(long)): Don't set seed + if secureRandomSpi is not initialized. + + * Makefile.in: Rebuilt. + * Makefile.am (secdir): New macro. + (install-data-local): Install new data files. + * java/security/classpath.security: New file. + * java/security/libgcj.security: New file. + + * java/security/Security.java (loadProviders): Added `vendor' + argument. + Load both `classpath' and `java.vm.name' providers. + + 2001-10-17 Anthony Green + + * java/security/Security.java (loadProviders): Fix bug in how + providers are loaded. + + 2001-10-16 Tom Tromey + + * gcj/javaprims.h: Updated class list. + * java/util/Hashtable.java: Re-merged with Classpath. + + 2001-10-16 Bryce McKinlay + + * name-finder.cc (_Jv_name_finder::lookup): Check for NULL dli_sname. + + Eliminate use of C++ static constructors. + * interpret.cc: Remove static Utf8Consts. Use namespace gcj. + * jni.cc: Likewise. + * resolve.cc: Likewise. + * defineclass.cc: Likewise. + (_Jv_ClassReader::handleClassBegin): Synchronize call to + _Jv_RegisterClass. + * include/jvm.h (void_signature, clinit_name, init_name, finit_name): + Declare in namespace gcj. + * java/lang/Class.h (Class): Remove initialization for primitive + types. + (friend void _Jv_InitPrimClass): This is in prims.cc. + * prims.cc (_Jv_InitPrimClass): Do primitive type initialization + here instead. + (void_signature, clinit_name, init_name, finit_name): Define in + namespace gcj. + (_Jv_CreateJavaVM): Call _Jv_InitThreads, _Jv_InitGC, and + _Jv_InitializeSyncMutex from here. Initialize Utf8 constants. + Initialize primitive types. + * java/lang/natClassLoader.cc (_Jv_RegisterClasses): Don't call + initialization routines. Don't synchronize. + * java/lang/natRuntime.cc (_load): Synchronize on java.lang.Class + across dlopen call. + + 2001-10-15 Bryce McKinlay + + * java/util/HashMap.java (HashEntry.clone): Removed. + (HashMap(Map)): Use putAllInternal. + (clone): Likewise. + (putAllInternal): New method. Efficient counterpart to putAll which + does not call put(). + * java/util/LinkedHashMap.java (rethread): Removed. + (putAllInternal): New method. Clear "head" and "tail". + (addEntry): New argument "callRemove". Don't call removeEldestEntry() + if callRemove == false. + + * Makefile.am: Add new classes RandomAccess and LinkedHashMap. + * Makefile.in: Rebuilt. + + 2001-10-15 Eric Blake + + * java/util/Collection.java: Updated javadoc. + * java/util/Comparator.java: Updated javadoc. + * java/util/Enumeration.java: Updated javadoc. + * java/util/Iterator.java: Updated javadoc. + * java/util/List.java: Updated javadoc. + * java/util/ListIterator.java: Updated javadoc. + * java/util/Map.java: Updated javadoc. + * java/util/RandomAccess.java: New file. + * java/util/Set.java: Updated javadoc. + * java/util/SortedMap.java: Updated javadoc. + * java/util/SortedSet.java: Updated javadoc. + + 2001-10-15 Tom Tromey + + * java/lang/reflect/AccessibleObject.java (checkPermission): + Implemented. + Updated copyright information. + + 2001-10-15 Hans Boehm + + * java/lang/natObject.cc (heavy_lock): Moved fields + old_client_data, old_finalization_proc near beginning. + (heavy_lock_finalization_proc): Now inline; changed type of + argument. + (JV_SYNC_TABLE_SZ): Now 2048. + (mp): New global. + (spin): `mp' now global. + (heavy_lock_obj_finalization_proc): Updated to correctly handle + heavy lock finalization. + (remove_all_heavy): New function. + (maybe_remove_all_heavy): Likewise. + (_Jv_MonitorEnter): Throw exception if object is NULL. + (_Jv_MonitorExit): Likewise. Also, clear long lists of unlocked + heavy locks. + * include/jvm.h (_Jv_AllocTraceTwo): Declare. + * nogc.cc (_Jv_AllocTraceTwo): New function. + * boehm.cc (trace_two_vtable): New global. + (_Jv_AllocTraceTwo): New function. + + 2001-10-15 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new file. + * java/beans/AppletInitializer.java: New file. + + * java/net/SocketPermission.java (hostport, actions): Now + private. + + 2001-10-14 Mark Wielaard + + * java/lang/Double.java: Partial merge with Classpath + (TYPE): initialized through VMClassLoader.getPrimitiveClass() + (value): made final + (static): new static block to load native libary (not used in libgcj) + (Double (String)): call parseDouble() + (byteValue): removed, already defined in superclass Number + (shortValue): likewise + (valueOf (String)): call new Double(String) directly + (compare (double,double)): new 1.4 method + (compareTo (Double)): call new compare(double,double) method + (initIDs): new private method (not used in libgcj) + * java/lang/Float.java: Partial merge with Classpath + (TYPE): initialized through VMClassLoader.getPrimitiveClass() + (value): made final + (static): new static block to load native libary (not used in libgcj) + (Float (String)): call parseFloat() + (byteValue): removed, already defined in superclass Number + (shortValue): likewise + (valueOf (String)): call new Float(String) directly + (compare (float,float)): new 1.4 method + (compareTo (Float)): call new compare(double,double) method + + 2001-10-13 Tom Tromey + + * java/lang/SecurityManager.java (SecurityManager): Now public. + + * java/security/AccessController.java (checkPermission): Now + throws AccessControlException. + * java/security/AllPermission.java: Class now final. + * java/security/Permission.java (getName): Now final. + (name): Now private. + (equals): New abstract method. + * java/security/PermissionCollection.java (linesep): Now private. + * java/security/Permissions.java: Class now final. + * java/security/Security.java (Security): New private + constructor. + * java/security/UnresolvedPermission.java: Import + java.security.cert.Certificate. Class now final. + * java/security/acl/Group.java: Now extends Principal. + (isMember): Added Principal argument. + * java/security/spec/X509EncodedKeySpec.java (getFormat): Now + final. + * java/security/spec/PKCS8EncodedKeySpec.java (getFormat): Now + final. + + 2001-10-12 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (rmi_java_source_files): Added new files. + * gnu/java/rmi/rmic/RMIC.java (compile): Uncommented; fixed to use + new Compiler class. + * gnu/java/rmi/rmic/Makefile.am (EXTRA_DIST): Updated. + * gnu/java/rmi/rmic/Compile_gcj.java: New file. + * gnu/java/rmi/rmic/CompilerProcess.java: New file. + * gnu/java/rmi/rmic/Compiler.java: New file. + + 2001-10-11 Tom Tromey + + * configure: Rebuilt. + * configure.in: Recognize --disable-java-awt. + + 2001-10-10 Tom Tromey + + * gnu/gcj/runtime/natFinalizerThread.cc: New file. + * java/lang/natRuntime.cc: Include FinalizerThread.h. + (runFinalization): Call finalizerReady. + * nogc.cc (_Jv_GCInitializeFinalizers): New function. + * prims.cc: Include VirtualMachineError.h, FinalizerThread.h. + (_Jv_CreateJavaVM): Start the finalizer thread. + * no-threads.cc: Include InternalError.h. + (_Jv_ThreadStart): Throw InternalError. + (_Jv_ThreadInitData): Don't throw error if this is not the first + thread. + * Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Added + FinalizerThread.java. + (nat_source_files): Added natFinalizerThread.cc. + * include/jvm.h (_Jv_GCInitializeFinalizers): Declare. + * boehm.cc (_Jv_GCInitializeFinalizers): New function. + * gnu/gcj/runtime/FirstThread.java (run): Start finalizer thread. + * gnu/gcj/runtime/FinalizerThread.java: New file. + + 2001-10-09 Per Bothner + + * strtod.c (_strtod_r): Logic to check for missing digits + after exponent had 'else' attached to wrong 'if'. + + 2001-10-09 Mark Wielaard + + * java/net/SocketImpl.java: Merge with Classpath + + 2001-10-08 Mark Wielaard + + * java/net/DatagramSocketImpl.java: Merge with Classpath + + 2001-10-07 Mark Wielaard + + * java/net/URLDecoder.java: Remerge with Classpath + * java/net/URLEncoder.java: Merge with Classpath + + 2001-10-08 Tom Tromey + + Fix for PR libgcj/4481: + * java/io/File.java (getParent): Handle case where path is "/". + (normalizePath): Use correct string for UNC leader. + + 2001-10-06 Mark Wielaard + + * java/io/BufferedInputStream.java: Merge with Classpath + + 2001-10-07 Joseph S. Myers + + * defineclass.cc, java/awt/image/ColorModel.java, + java/awt/image/SampleModel.java, java/lang/Package.java, + java/security/cert/X509Extension.java: Fix spelling errors of + "separate" as "seperate", and corresponding spelling errors of + related words. + + 2001-10-05 Tom Tromey + + * java/text/DecimalFormat.java (format): Use localized minus sign + when generating exponent; never use `+'. Use floor to compute + exponent. + + 2001-10-05 Mark Wielaard + + * java/util/zip/Adler32.java: Merge with Classpath + * java/util/zip/CRC32.java: Ditto + * java/util/zip/Checksum.java: Ditto + * java/util/zip/DataFormatException.java: Ditto + * java/util/zip/ZipException.java: Ditto + + 2001-10-04 Martin Kahlert + + * jni.cc (_Jv_JNI_DeleteLocalRef): Use correct frame size + + 2001-10-04 Mark Wielaard + + * java/lang/reflect/Modifier.java: Merge with Classpath + + 2001-10-03 Mark Wielaard + + * java/io/SequenceInputStream.java: Merge with Classpath + * java/io/StringBufferInputStream.java: Ditto + * java/util/Collections.java: Remerge with Classpath + + 2001-10-03 Tom Tromey + + * java/lang/ref/natReference.cc (add_to_hash): Set n->next before + setting *link. + + 2001-10-03 Bryce McKinlay + + * resolve.cc (_Jv_PrepareClass): Fix typos in vtable layout. + * gij.cc (version): Use GCJVERSION. + + 2001-10-02 Mark Wielaard + + * Makefile.am (core_java_source_files): add InheritableThreadLocal + * Makefile.in: regenerate + * gcj/javaprims.h: ditto + * java/lang/InheritableThreadLocal.java: new class from Classpath + * java/lang/Thread.java Thread (Thread, ThreadGroup, Runnable, String): + call InheritableThreadLocal.newChildThread() + + 2001-10-01 Mark Wielaard + + * Makefile.am: Add new classes + (core_java_source_files): CharSequence + (ordinary_java_source_files): Authenticator, PasswordAuthentication + * Makefile.in: regenerate + * gcj/javaprims.h: ditto + * java/lang/CharSequence: new class from Classpath + * java/lang/String.java: implements CharSequence + (subSequence (int,int)): new method + * java/lang/SubString.java: implements CharSequence + (subSequence (int,int)): new method + remerge comments with Classpath + * java/net/Authenticator.java: new class from Classpath + * java/net/PasswordAuthentication.java: ditto + + 2001-10-01 Tom Tromey + + * gcj/javaprims.h: Rebuilt class list. + * boehm.cc (_Jv_GCRegisterDisappearingLink): New function. + (_Jv_GCCanReclaimSoftReference): New function. + * include/jvm.h (_Jv_GCRegisterDisappearingLink): Declare. + (_Jv_GCCanReclaimSoftReference): Declare. + * java/lang/ref/Reference.java (referent): Now a RawData. + (create): Renamed from `created'. Added object argument. + (Reference): Don't initialize `referent' here. + * Makefile.in: Rebuilt. + * Makefile.am (nat_source_files): Added new file. + * java/lang/ref/natReference.cc: New file. + + * prims.cc (_Jv_NewMultiArrayUnchecked): New method. + (_Jv_NewMultiArray): Use it. Check each array dimension. + (_Jv_NewMultiArray): Likewise. + * java/lang/reflect/natMethod.cc (can_widen): Nothing promotes to + `char'. + * java/lang/reflect/natArray.cc (newInstance): Throw + IllegalArgumentException if there are no dimensions. + + 2001-10-01 Mark Wielaard + + * java/io/FileWriter.java: Merge with Classpath. + * java/io/FilterInputStream.java: Ditto. + (mark): no longer synchronized + (reset): Likewise + * java/io/FilterOutputStream.java: Merge with Classpath. + * java/io/FilterReader.java: Ditto. + (mark): no longer synchronized + (reset): Likewise + * java/io/FilterWriter.java: Merge with Classpath. + * java/io/Writer.java: Ditto. + * java/lang/Compiler.java: Ditto. + * java/lang/Process.java: Ditto. + * java/lang/Void.java: Ditto. + * java/net/ContentHandler.java: Ditto. + * java/net/DatagramPacket.java: Ditto. + * java/net/MulticastSocket.java: Merge comments with Classpath. + + 2001-09-30 Mark Wielaard + + * java/io/DataInput.java: Merge with Classpath. + * java/io/DataOutput.java: Idem. + * java/io/FilenameFilter.java: Idem. + * java/io/Serializable.java: Idem. + * java/lang/Cloneable.java: Idem. + * java/lang/Comparable.java: Idem. + * java/lang/Runnable.java: Idem. + * java/lang/reflect/Member.java: Idem. + * java/net/ContentHandlerFactory.java: Idem. + * java/net/FileNameMap.java: Idem. + * java/net/SocketImplFactory.java: Idem. + * java/net/SocketOptions.java: Idem. + * java/net/URLStreamHandlerFactory.java: Idem. + + 2001-09-30 Bryce McKinlay + + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Handle the case of + an uninitialized target class. + + * gnu/gcj/protocol/file/Connection.java (connect): Throw + FileNotFoundException if appropriate. + * gnu/gcj/protocol/file/Handler.java (openConnection): Throw an + IOException if we got a file: url with a hostname. Comment out protocol + switch to ftp for now. + * java/net/URL.java (URL): Include protocol name in exception message + when handler can't be found. + + 2001-09-28 Per Bothner + + * gnu/gcj/runtime/SharedLibLoader.java: New class. + * gnu/gcj/runtime/natSharedLibLoader.cc: Native methods. + * Makefile.am: Update accordingly. + * configure.in: Add AC_CHECK_LIB for dlopen. + * include/config.h.in: Add HAVE_DLOPEN. + + 2001-09-29 Jeff Sturm + + * Makefile.am (libgcj_la_LDFLAGS): Added $(GCLIBS), $(ZLIBS). + * Makefile.in: Rebuilt. + + 2001-09-27 Tom Tromey + + * java/util/IdentityHashMap.java (containsKey): Use getHash. + (get): Likewise. + (put): Likewise. + (remove): Likewise. + (getHash): New method. + (tombstone, emptyslot): Now static final. + (put): Correctly determine when to rehash, and correctly rehash. + (containsKey, remove): Test against table length with `>='. + + 2001-09-26 Tom Tromey + + * gnu/classpath/Configuration.java.in (INIT_LOAD_LIBRARY): New + constant. + * java/io/StreamTokenizer.java, java/util/ResourceBundle.java: + Re-merged with Classpath. + + * java/io/DataInputStream.java (readChar): Use readFully. + (readInt): Likewise. + (readLong): Likewise. + (readShort): Likewise. + (readUnsignedShort): Likewise. + + 2001-09-24 Bryce McKinlay + + * java/lang/PosixProcess.java (exitValue): Implement here. Throw + IllegalThreadStateException if process hasn't exited yet. + * java/lang/natPosixProcess.cc (exitValue): Removed. + (waitFor): Only check thread interrupted status if waitpid() returned + an error. Use WIFEXITED and WEXITSTATUS to process process's exit + value. + + * java/security/cert/X509Extension.java: Merge from classpath. + + 2001-09-22 Anthony Green + + * java/security/DummyKeyPairGenerator.java (initialize): New + method (with AlgorithmParameterSpec argument). + + 2001-09-22 Anthony Green + + * java/security/spec/EncodedKeySpec.java: Implements KeySpec. + + * gnu/java/security/provider/SHA1PRNG.java: Extend from + SecureRandomSpi. + (engineNextBytes): Fix order of memory copies. + + 2001-09-21 Richard Henderson + + * include/jvm.h (_Jv_VTable): Handle function descriptors for ia64; + add get_method, set_method, vtable_elt_size, new_vtable. + (_Jv_ArrayVTable): Derive from _Jv_VTable. + * resolve.cc (_Jv_PrepareClass): Use new _Jv_VTable methods. + * interpret.cc (_Jv_InterpMethod::continue1): Likewise. + * java/lang/natClassLoader.cc (_Jv_NewArrayClass): Likewise. + + 2001-09-21 Richard Henderson + + * no-threads.cc (_Jv_ThreadStart): Remove names of unused arguments. + * java/lang/mprec.c (lo0bits): Fix paren typo. + + 2001-09-20 Bryce McKinlay + + * posix-threads.cc (_Jv_ThreadInterrupt): Re-enable interrupt of + blocking IO via pthread_kill(). + * java/io/natFileDescriptorPosix.cc (write (jint)): Check for thread + interrupted status flag only if ::write returned an error. + (write (jbyteArray, jint, jint): Likewise. + (read (jint)): Likewise. + (read (jbyteArray, jint, jint): Likewise. + + 2001-09-19 Anthony Green + + * gnu/gcj/protocol/file/Handler.java: Avoid NullPointerException + when host is null. + + 2001-09-17 Andreas Jaeger + + * jni.cc (array_from_valist): Use promoted types for va_arg. + + 2001-09-16 Anthony Green + + * gnu/java/locale/LocaleInformation.java: Extend + LocaleInformation_en_US, not LocaleInformation_en. + + 2001-09-16 Anthony Green + + * gnu/gcj/convert/IOConverter.java: Add support for iso8859_1. + + 2001-09-14 Tom Tromey + + * java/util/TimeZone.java: Updated list of timezones from + Classpath. + + * java/lang/CloneNotSupportedException.java: Re-merged with + Classpath. + + 2001-09-14 Bryce McKinlay + + * java/io/File.java (normalizePath): Use equals() not '==' for string + comparison. + + * java/util/Hashtable.java (Enumerator): Ensure that if + hasMoreElements() returns true, nextElement() will always return + something even if the table has been modified. + + 2001-09-12 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (class-check): New target. + + 2001-09-11 Tom Tromey + + * java/io/File.java (toURL): Use getAbsolutePath and `file://'. + + 2001-09-10 Tom Tromey + + * java/util/Properties.java (load): Correctly read \u sequences. + Report from Anthony Green. + + 2001-09-10 Manfred Hollstein + + * configure.in (LIBFFIINCS): Quote uses of $(top_srcdir) + and $(MULTIBUILDTOP). + * configure: Re-generate. + + 2001-09-10 Bryce McKinlay + + * include/jvm.h (_Jv_AllocRawObj): New prototype. + * boehm.cc (_Jv_AllocRawObj): Implement. + * nogc.cc (_Jv_AllocRawObj): Likewise. + * exception.cc (_Jv_Throw): Use _Jv_AllocRawObj, not GC_malloc. + + 2001-09-06 Anthony Green + + * java/util/ResourceBundle.java (tryLocalBundle): Eliminate + redundant method calls. + (emptyLocale): New private member. + (tryBundle): Use emptyLocale. Remove duplicate code. Only cache + exact matches. + + 2001-09-06 Tom Tromey + + * java/text/RuleBasedCollator.java (clone): Rewrote. + (RuleBasedCollator(RuleBasedCollator)): Removed. + * java/text/MessageFormat.java: Re-merged from Classpath. + * java/text/DecimalFormat.java: Re-merged from Classpath. + + 2001-09-06 Anthony Green + + * include/jvm.h: Declare _Jv_RegisterResource. + * gnu/gcj/Core.java, gnu/gcj/natCore.cc, + gnu/gcj/protocol/core/Connection.java, + gnu/gcj/protocol/core/Handler.java, + gnu/gcj/protocol/core/CoreInputStream.java, + gnu/gcj/protocol/core/natCoreInputStream.cc: New files. + * java/net/URL.java (setURLStreamHandler): Use + gnu.gcj.protocol.core.Handler for the core protocol. + * gnu/gcj/runtime/VMClassLoader.java (init): Add "core:/" to the + end of java.class.path. + * Makefile.am (ordinary_java_source_files): Add new java files. + (nat_source_files): Add new native code files. + * Makefile.in: Rebuilt. + + 2001-09-05 Tom Tromey + + * java/util/Properties.java: Re-merged from Classpath. + + From Eric Blake, via Classpath: + * java/lang/String.java (CaseInsensitiveComparator): New class. + (CASE_INSENSITIVE_ORDER): Use instance of CaseInsensitiveComparator. + + * java/util/Date.java: Re-merged with Classpath. + + * java/text/DateFormatSymbols.java: Re-merged with Classpath. + + 2001-09-05 Corey Minyard + Tom Tromey + + * java/lang/natClassLoader.cc: Include VirtualMachineError.h + (_Jv_RegisterClassHookDefault): Throw error if a class is + registered twice. + + 2001-09-05 Tom Tromey + + * java/lang/natSystem.cc (init_properties): Default locale is + en_US, not just en. + + 2001-09-05 Bryce McKinlay + + * java/text/MessageFormat.java (setLocale): Don't catch ParseException + here, DecimalFormat.applyPattern() does not throw it. + + 2001-09-04 Tom Tromey + + * java/util/AbstractMap.java: Re-merged with Classpath. + * java/util/IdentityHashMap.java: Re-merged with Classpath. + + * java/text/SimpleDateFormat.java: Re-merged with Classpath. + * gnu/gcj/text/LocaleData.java, gnu/gcj/text/LocaleData_en.java, + gnu/gcj/text/LocaleData_en_US.java: Removed. + * java/text/DateFormatSymbols.java (clone): Use Classpath + implementation. + (equals): Simplified. + (DateFormatSymbols): Look in gnu.java.locale for information. + (DateFormatSymbols(DateFormatSymbols)): Removed. + (safeGetResource): Removed. + (DateFormatSymbols): Throws MissingResourceException. + (ampmsDefault, erasDefault, localPatternCharsDefault, + monthsDefault, shortMonthsDefault, shortWeekdaysDefault, + weekdaysDefault, zoneStringsDefault): Removed. + * java/text/Collator.java (getAvailableLocales): Use modified + Classpath implementation. + (getInstance): Look in gnu.java.locale for information. + (clone): Rewrote. + * java/text/MessageFormat.java: Reindented. + (clone): Rewrote. + * java/text/FieldPosition.java: Merged with Classpath. + * java/text/ParsePosition.java: Merged with Classpath. + * java/text/Format.java: Merged with Classpath. + * java/text/StringCharacterIterator.java + (StringCharacterIterator(StringCharacterIterator,int,int)): New + constructor from Classpath. + * java/text/Annotation.java, + java/text/AttributedCharacterIterator.java, + java/text/AttributedString.java, + java/text/AttributedStringIterator.java: New from Classpath. + * java/text/CharacterIterator.java: Copied from Classpath. + * java/text/ChoiceFormat.java: Reindented. + (clone): Removed. + * gnu/java/text/BaseBreakIterator.java, + gnu/java/text/CharacterBreakIterator.java, + gnu/java/text/LineBreakIterator.java, + gnu/java/text/LocaleData_en.java, + gnu/java/text/LocaleData_en_US.java, + gnu/java/text/SentenceBreakIterator.java, + gnu/java/text/WordBreakIterator.java: Renamed from gnu/gcj/text/*. + * gnu/gcj/text/BaseBreakIterator.java (last): Advance past final + character. + * java/text/BreakIterator.java (getAvailableLocales): Use + Classpath implementation. + (getInstance): Look in gnu.java.locale for information. + (getCharacterInstance, getLineInstance, getSentenceInstance, + getWordInstance): Look in gnu.java.text for implementations. + * java/text/DecimalFormatSymbols.java: Reindented + (clone): Use Classpath implementation. + (DecimalFormatSymbols(DecimalFormatSymbols)): Removed. + (DecimalFormatSymbols(Locale)): Look in gnu.java.locale for + information. + * java/text/DateFormat.java: Merged with Classpath. + (getAvailableLocales): Use Classpath implementation. + (format(Object,StringBuffer,FieldPosition)): Minor cleanup. + (computeInstance): Look in gnu.java.locale for information. + * java/text/NumberFormat.java: Reindented. + (computeInstance): Look in gnu.java.locale for information. + (getAvailableLocales): Use implementation from Classpath. + (setMaximumIntegerDigits): Likewise. + (setMinimumIntegerDigits): Likewise. + (setMaximumFractionDigits): Likewise. + (clone): Removed. + * java/text/DecimalFormat.java: Reindented. + * gnu/java/locale/LocaleInformation_en.java: Copied from Classpath. + * gnu/java/locale/LocaleInformation_en_US.java: Copied from Classpath. + * Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Added all new files. + (ordinary_java_source_files): Renamed or removed gnu/gcj/text/*. + * java/security/spec/AlgorithmParameterSpec.java, + java/security/spec/KeySpec.java: Re-merged with Classpath. + + Fix for PR libgcj/4213: + * Makefile.am (ordinary_java_source_files): Added new file. + * gnu/gcj/text/LocaleData.java: New file. + + 2001-09-03 Tom Tromey + + * java/lang/reflect/natField.cc (set): Allow for case when the + value is null. Fixes PR libgcj/4208. + + * gcj/javaprims.h: Regenerated class list. + * java/lang/IllegalThreadStateException.java, + java/lang/InstantiationException.java: Minor comment tweaks to + satisfy libgcj `classes.pl' script. + + 2001-09-01 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added + UnsupportedClassVersionError. + * java/lang/UnsupportedClassVersionError.java: New file from + Classpath. + + * java/io/CharConversionException.java, java/io/EOFException.java, + java/io/FileNotFoundException.java, java/io/IOException.java, + java/io/InterruptedIOException.java, + java/io/ObjectStreamException.java, + java/io/OptionalDataException.java, + java/io/StreamCorruptedException.java, + java/io/SyncFailedException.java, + java/io/UTFDataFormatException.java, + java/io/UnsupportedEncodingException.java, + java/lang/AbstractMethodError.java, + java/lang/ArithmeticException.java, + java/lang/ArrayIndexOutOfBoundsException.java, + java/lang/ArrayStoreException.java, + java/lang/ClassCastException.java, + java/lang/ClassCircularityError.java, + java/lang/ClassFormatError.java, + java/lang/CloneNotSupportedException.java, java/lang/Error.java, + java/lang/Exception.java, + java/lang/ExceptionInInitializerError.java, + java/lang/IllegalAccessError.java, + java/lang/IllegalAccessException.java, + java/lang/IllegalArgumentException.java, + java/lang/IllegalMonitorStateException.java, + java/lang/IllegalStateException.java, + java/lang/IllegalThreadStateException.java, + java/lang/IncompatibleClassChangeError.java, + java/lang/IndexOutOfBoundsException.java, + java/lang/InstantiationError.java, + java/lang/InstantiationException.java, + java/lang/InternalError.java, java/lang/InterruptedException.java, + java/lang/LinkageError.java, + java/lang/NegativeArraySizeException.java, + java/lang/NoClassDefFoundError.java, + java/lang/NoSuchFieldError.java, + java/lang/NoSuchFieldException.java, + java/lang/NoSuchMethodError.java, + java/lang/NoSuchMethodException.java, + java/lang/NullPointerException.java, + java/lang/NumberFormatException.java, + java/lang/OutOfMemoryError.java, java/lang/RuntimeException.java, + java/lang/SecurityException.java, + java/lang/StackOverflowError.java, + java/lang/StringIndexOutOfBoundsException.java, + java/lang/ThreadDeath.java, java/lang/UnknownError.java, + java/lang/UnsatisfiedLinkError.java, + java/lang/UnsupportedOperationException.java, + java/lang/VerifyError.java, java/lang/VirtualMachineError.java, + java/lang/reflect/InvocationTargetException.java, + java/net/BindException.java, java/net/ConnectException.java, + java/net/MalformedURLException.java, + java/net/NoRouteToHostException.java, + java/net/ProtocolException.java, java/net/SocketException.java, + java/net/UnknownHostException.java, + java/net/UnknownServiceException.java, + java/text/ParseException.java: Copied from Classpath, thanks to + Mark Wielaard who did the merge. + + * java/lang/System.java (getProperty): Use single argument form of + SecurityManager.checkPropertyAccess. + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added VMSecurityManager. + * java/lang/VMSecurityManager.java: New file. + * java/lang/SecurityManager.java: Merged with Classpath. + + 2001-08-31 Per Bothner + + * gcj/javaprims.h (_Jv_RegisterClassHook): New extern declaration. + (_Jv_RegisterClassHookDefault): Likewise. + * java/lang/Class.h (_Jv_RegisterClassHookDefault): Declare as friend. + * java/lang/natClassLoader.cc (_Jv_RegisterClassHook): New variable. + (_Jv_RegisterClassHookDefault): New.function. + (_Jv_RegisterClasses): Call _Jv_RegisterClassHook. + + * java/lang/ClassLoader.java (system): Remove static field. + (getSystemClassLoader): Get gnu.gcj.runtime.VMClassLoader.instance + directly instead of using it to set the system field. + (loadClass): Use VMClassLoader.instance instead of system field. + (findSystemClass): Similar. + * prims.cc (_Jv_RunMain): Clear VMClassLoader::instance rather + than ClassLoader::system which no longer exists. + * java/lang/natClassLoader.java (_Jv_FindClass): Simplify. + + 2001-08-31 Tom Tromey + + * java/io/BufferedReader.java, java/io/ObjectInput.java, + java/io/ObjectInputValidation.java, java/io/ObjectOutput.java: + Re-merged with Classpath. + + Re-merge with Classpath: + * java/util/Comparator (equals): Added. + * java/io/PipedWriter.java (write): Changed argument to `int'. + + * java/io/FileDescriptor.java (FileDescriptor()): New + constructor. + * java/io/File.java (getAbsoluteFile): Doesn't throw IOException. + + * Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Removed + EnumerationChain, added DoubleEnumeration. + (nat_source_files): Added natResourceBundle.cc. + * java/util/natResourceBundle.cc: New file. + * gnu/java/util/DoubleEnumeration.java: New file. + * gnu/gcj/util/EnumerationChain.java: Removed. + * java/beans/VetoableChangeSupport.java: Merged with Classpath. + * java/util/ResourceBundle.java: Merged with Classpath. + * java/util/StringTokenizer.java: Merged with Classpath. + * java/util/Locale.java: Merged with Classpath. + * java/util/Random.java: Merged with Classpath. + * java/util/PropertyResourceBundle.java: Merged with Classpath. + * java/util/ListResourceBundle.java: Merged with Classpath. + * java/util/ConcurrentModificationException.java: Re-merged with + Classpath. + * java/util/EmptyStackException.java: Likewise. + * java/util/MissingResourceException.java: Likewise. + * java/util/NoSuchElementException.java: Likewise. + * java/util/TooManyListenersException.java: Likewise. + + * java/io/ByteArrayOutputStream.java: Re-merged with Classpath. + * java/io/OptionalDataException.java: Merged with Classpath. + + 2001-08-31 Jason Merrill + + * exception.cc (PERSONALITY_FUNCTION): Simplify + leb128 handling. + + 2001-08-31 Tom Tromey + + * java/io/ByteArrayInputStream.java: Merged with Classpath. + + 2001-08-30 Tom Tromey + + * java/io/BufferedReader.java: Re-merged with Classpath. + + 2001-08-28 Per Bothner + + * java/math/BigInteger.java (init(int,Random)): New method. + Move body of constructor (int,Random)) here. + Re-write it to avoid constructing unneeded temporaries. + ((int,int,Random)): Use new init method to avoid constructing + extra temporary BigIntegers. + + 2001-08-27 Tom Tromey + + * java/rmi/activation/Activatable.java, + java/rmi/activation/ActivateFailedException.java, + java/rmi/activation/ActivationDesc.java, + java/rmi/activation/ActivationException.java, + java/rmi/activation/ActivationGroup.java, + java/rmi/activation/ActivationGroupDesc.java, + java/rmi/activation/ActivationGroupID.java, + java/rmi/activation/ActivationID.java, + java/rmi/activation/ActivationInstantiator.java, + java/rmi/activation/ActivationMonitor.java, + java/rmi/activation/ActivationSystem.java, + java/rmi/activation/Activator.java, + java/rmi/activation/UnknownGroupException.java, + java/rmi/activation/UnknownObjectException.java, + java/rmi/AccessException.java, + java/rmi/AlreadyBoundException.java, + java/rmi/ConnectException.java, java/rmi/ConnectIOException.java, + java/rmi/MarshalException.java, java/rmi/MarshalledObject.java, + java/rmi/Naming.java, java/rmi/NoSuchObjectException.java, + java/rmi/NotBoundException.java, + java/rmi/RMISecurityException.java, + java/rmi/RMISecurityManager.java, java/rmi/Remote.java, + java/rmi/RemoteException.java, java/rmi/ServerError.java, + java/rmi/ServerException.java, + java/rmi/ServerRuntimeException.java, + java/rmi/StubNotFoundException.java, + java/rmi/UnexpectedException.java, + java/rmi/UnknownHostException.java, + java/rmi/UnmarshalException.java, java/rmi/dgc/DGC.java, + java/rmi/dgc/Lease.java, java/rmi/dgc/VMID.java, + java/rmi/registry/LocateRegistry.java, + java/rmi/registry/Registry.java, + java/rmi/registry/RegistryHandler.java, + java/rmi/server/ExportException.java, + java/rmi/server/LoaderHandler.java, + java/rmi/server/LogStream.java, java/rmi/server/ObjID.java, + java/rmi/server/Operation.java, + java/rmi/server/RMIClassLoader.java, + java/rmi/server/RMIClientSocketFactory.java, + java/rmi/server/RMIFailureHandler.java, + java/rmi/server/RMIServerSocketFactory.java, + java/rmi/server/RMISocketFactory.java, + java/rmi/server/RemoteCall.java, + java/rmi/server/RemoteObject.java, java/rmi/server/RemoteRef.java, + java/rmi/server/RemoteServer.java, + java/rmi/server/RemoteStub.java, + java/rmi/server/ServerCloneException.java, + java/rmi/server/ServerNotActiveException.java, + java/rmi/server/ServerRef.java, java/rmi/server/Skeleton.java, + java/rmi/server/SkeletonMismatchException.java, + java/rmi/server/SkeletonNotFoundException.java, + java/rmi/server/SocketSecurityException.java, + java/rmi/server/UID.java, + java/rmi/server/UnicastRemoteObject.java, + java/rmi/server/Unreferenced.java, gnu/java/rmi/dgc/DGCImpl.java, + gnu/java/rmi/dgc/DGCImpl_Skel.java, + gnu/java/rmi/dgc/DGCImpl_Stub.java, + gnu/java/rmi/registry/RegistryImpl.java, + gnu/java/rmi/registry/RegistryImpl_Skel.java, + gnu/java/rmi/registry/RegistryImpl_Stub.java, + gnu/java/rmi/rmic/RMIC.java, gnu/java/rmi/rmic/TabbedWriter.java, + gnu/java/rmi/server/ProtocolConstants.java, + gnu/java/rmi/server/RMIDefaultSocketFactory.java, + gnu/java/rmi/server/RMIHashes.java, + gnu/java/rmi/server/RMIObjectInputStream.java, + gnu/java/rmi/server/RMIObjectOutputStream.java, + gnu/java/rmi/server/UnicastConnection.java, + gnu/java/rmi/server/UnicastConnectionManager.java, + gnu/java/rmi/server/UnicastRef.java, + gnu/java/rmi/server/UnicastRemoteCall.java, + gnu/java/rmi/server/UnicastRemoteStub.java, + gnu/java/rmi/server/UnicastServer.java, + gnu/java/rmi/server/UnicastServerRef.java: RMI implementation from + Kaffe. Relabelled classes to fit into Classpath tree. + * Makefile.in: Rebuilt. + * Makefile.am (rmi_java_source_files): New macro. + (ordinary_java_source_files): Reference it. + (bin_PROGRAMS): Added rmic and rmiregistry. + (rmic_SOURCES): New macro. + (EXTRA_rmic_SOURCES): Likewise. + (rmic_LDFLAGS): Likewise. + (rmic_LINK): Likewise. + (rmic_LDADD): Likewise. + (rmic_DEPENDENCIES): Likewise. + (rmiregistry_SOURCES): New macro. + (EXTRA_rmiregistry_SOURCES): Likewise. + (rmiregistry_LDFLAGS): Likewise. + (rmiregistry_LINK): Likewise. + (rmiregistry_LDADD): Likewise. + (rmiregistry_DEPENDENCIES): Likewise. + + 2001-08-26 Bryce McKinlay + + * name-finder.cc (lookup): Ignore a null dli_fname from dladdr. + + * Makefile.am: New friends for java/lang/Thread.h. + * prims.cc (runFirst): Removed. + (JvRunMain): Merged into _Jv_RunMain. Now just calls that. + (_Jv_RunMain): Now takes either a klass or class name parameter. + Create a gnu.gcj.runtime.FirstThread and attach the native thread + to that, then run it using _Jv_ThreadRun. Remove special handling of + jar files, instead pass is_jar parameter through to FirstThread. + * gcj/javaprims.h: Add prototypes for _Jv_ThreadRun and new variant + of _Jv_AttachCurrentThread. + * gnu/gcj/runtime/FirstThread.java (FirstThread): Now extends Thread. + (run): New method. Take care of looking up main class manifest + attribute and calling forName if necessary. Then call call_main. + (call_main): New native method. + * gnu/gcj/runtime/natFirstThread.cc (call_main): New function, code + relocated from prims.cc. Look up and call main method. + * java/lang/Thread.java (run_): Removed. + * java/lang/natThread.cc (run_): Renamed to... + (_Jv_ThreadRun): this. JVMPI notification code moved to ... + (_Jv_NotifyThreadStart): here. New function. + (countStackFrames, destroy, resume, suspend, stop): Throw + UnsupportedOperationExceptions rather than JvFail'ing. + (_Jv_AttachCurrentThread): New variant takes a Thread argument. + Existing version wraps new variant. + + + 2001-08-23 Tom Tromey + + * java/lang/reflect/Field.java (toString): Use + Method.appendClassName. + * java/lang/reflect/Constructor.java (toString): Use + Method.appendClassName. + * java/lang/reflect/Method.java: Reindented. + (appendClassName): New method. + (toString): Use it. + * defineclass.cc (handleMethod ): Initialize `throws' field of + method. + (read_one_method_attribute): Handle Exceptions attribute. + * java/lang/reflect/natMethod.cc (ClassClass): Removed. + (ObjectClass): Removed. + (getType): Compute `exception_types'. + * java/lang/Class.h (struct _Jv_Method): Added `throws' field. + + 2001-08-21 Anthony Green + + * java/lang/natClassLoader.cc (findClass): Search for + lib-gnu-pkg-quux.so, not gnu-pkg-quux.so. + + 2001-08-21 Jeff Sturm + + * java/util/IdentityHashMap.java (get): Fix off-by-one error. + (put): Likewise. + + 2001-08-20 Tom Tromey + + * java/awt/GridBagConstraints.java: Removed comment. + + * jni.cc (nathash, nathash_count, nathash_size): New globals. + (DELETED_ENTRY): New define. + (hash): New function. + (nathash_find_slot): Likewise. + (natrehash): Likewise. + (nathash_add): Likewise. + (_Jv_JNI_RegisterNatives): No longer interpreter-specific. Use + nathash_add. + (nathash_find): New function. + (_Jv_LookupJNIMethod): Use it. Synchronize body. + (call): Synchronize around assignment. + + 2001-08-17 Jeff Sturm + + * gnu/gcj/convert/UnicodeToBytes.java (write): Write work buffer + starting from zero offset. + + 2001-08-17 Hans-J. Boehm + + * boehm.cc: Include gc_local_alloc.h if appropriate. + (GC_GENERIC_MALLOC): Don't define. + (MAYBE_MARK): Redefine for GC 6.0. + (_Jv_MarkObj): Mark class differently. + (_Jv_AllocArray): Use GC_generic_malloc. + + 2001-08-17 Mark J Roberts + + * java/math/BigInteger.java (randBytes): New method. + (BigInteger(int,Random)): Use randBytes. + + 2001-08-17 Tom Tromey + + * gnu/gcj/convert/IOConverter.java: Add `646' alias. + + 2001-08-17 Hans-J. Boehm + + * BigInteger.java: fix right shifts by nonzero multiples of 32. + + 2001-08-15 Tom Tromey + + * jni.cc: Include IdentityHashMap.h, not Hashtable.h. + (local_ref_table, global_ref_table): Now IdentityHashMap. + (_Jv_JNI_Init): Updated for new types. + (mark_for_gc): Likewise. + (unmark_for_gc): Likewise. + * gcj/javaprims.h: Rebuilt class list. + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added new file. + * java/util/IdentityHashMap.java: New file. + + * gnu/gcj/convert/natIconv.cc (read): Handle EINVAL and E2BIG + correctly. + + 2001-08-09 Tom Tromey + + * java/awt/image/SampleModel.java (getPixel): Set correct array + element. From Chris Meyer. + + 2001-08-10 Loren J. Rittle + + * java/lang/natObject.cc (is_mp): Protect use of _SC_NPROCESSORS_ONLN. + * gnu/gcj/convert/natIconv.cc (done): Use HAVE_ICONV. + + 2001-08-06 Tom Tromey + + * java/io/InputStreamReader.java (refill): Only call refill on + BufferedInputStream when appropriate constraints are met. + + 2001-08-05 Tom Tromey + + * java/io/StringWriter.java: Merged with Classpath. + * java/io/InputStream.java: Merged with Classpath. + * java/io/OutputStream.java: Merged with Classpath. + * java/io/PushbackInputStream.java: Merged with Classpath. + * java/io/CharArrayReader.java: Merged with Classpath. + * java/io/CharArrayWriter.java: Merged with Classpath. + + 2001-08-02 Tom Tromey + + * prims.cc (JNI_OnLoad): Don't declare. + (_JNI_OnLoad): Don't define. + (_Jv_CreateJavaVM): Don't handle JNI_OnLoad. + + 2001-08-02 Tom Tromey + + * java/io/RandomAccessFile.java (seek): Let seek go past end of + file. + (skipBytes): Don't fail if seeking past end of file. + * java/io/FileInputStream.java (skip): Don't fail if seeking past + end of file. + * java/io/natFileDescriptorWin32.cc (seek): Handle `eof_trunc' + argument. + * java/io/natFileDescriptorEcos.cc (seek): Handle `eof_trunc' + argument. + * java/io/natFileDescriptorPosix.cc (seek): Handle `eof_trunc' + argument. + * java/io/FileDescriptor.java (seek): Added `eof_trunc' argument. + + 2001-08-02 Martin Kahlert + + * jni.cc (JNI_CreateJavaVM): Call _Jv_JNI_Init in order + to initialize global_ref_table/local_ref_table. + + 2001-08-02 Tom Tromey + + * configure: Rebuilt. + * configure.in (THREADSPEC): Don't set THREADLIBS on Cygwin. From + David Billinghurst. + + 2001-08-01 Rainer Orth + + * include/posix.h (_POSIX_PII_SOCKET): Define. + * configure.in (HAVE_SOCKLEN_T): Define. + * java/net/natPlainSocketImpl.cc [!HAVE_SOCKLEN_T]: Move socklen_t + definition up. + (_JV_accept): New function, avoids Tru64 UNIX accept macro. + (java::net::PlainSocketImpl::accept): Use it. + Fixes PRs libgcj/3694, libgcj/3696. + + * configure.in (HAVE_STRUCT_IPV6_MREQ): New test. + * acconfig.h (HAVE_STRUCT_IPV6_MREQ): Provide template. + * configure, include/config.h.in: Regenerate. + * java/net/natPlainDatagramSocketImpl.cc (union McastReq): Use it. + (mcastGrp): Likewise. + (java::net::PlainDatagramSocketImpl::setOption): Guard against + missing IPV6_MULTICAST_IF. + Fixes PR libgcj/3694. + + 2001-08-01 Jeff Sturm + + * libgcj.spec.in: Pass -fkeep-inline-functions to jc1. + + 2001-07-30 Christian Iseli + + * Makefile.in: Rebuilt. + * Makefile.am (GCJLINK): Added --tag=GCJ. + (LIBLINK): Likewise. + + 2001-07-30 Tom Tromey + + * java/util/Date.java: Re-merged with Classpath. + + 2001-07-30 Jeff Sturm + + * java/net/natPlainDatagramSocketImpl.cc: Undefine bind if defined. + (_Jv_bind): New static function. + (bind): Use _Jv_bind. + * java/net/natPlainSocketImpl.cc: Undefine bind, connect if defined. + (_Jv_bind, _Jv_connect): New static functions. + (bind): Use _Jv_bind. + (connect): Use _Jv_connect. + + 2001-07-30 Tom Tromey + Corey Minyard + + * gnu/gcj/convert/natIconv.cc (done): New methods. + * gnu/gcj/convert/Output_iconv.java (done): New method. + * gnu/gcj/convert/Input_iconv.java (done): New method. + * gnu/gcj/convert/UnicodeToBytes.java (defaultEncodingClass): + Removed. + (getDefaultEncodingClass): Removed. + (getDefaultEncoder): Use getEncoder. + (done): New method. + (defaultEncoding, CACHE_SIZE, encoderCache, currCachePos): New + static fields. + * gnu/gcj/convert/BytesToUnicode.java (defaultDecodingClass): + Removed. + (defaultEncoding, CACHE_SIZE, decoderCache, currCachePos): New + static fields. + (getDefaultDecodingClass): Removed. + (getDefaultDecoder): Use getDecoder. + (getDecoder): Look up decoder in cache. + (done): New method. + * java/lang/natString.cc (init): Call `done' on converter. + (getBytes): Likewise. + + 2001-07-30 Tom Tromey + + * java/lang/Integer.java: Merged with Classpath. + + 2001-07-30 Bryce McKinlay + + * java/util/GregorianCalendar.java (GregorianCalendar): Call + setTimeInMillis() to set the default/current time. + + 2001-07-29 Mark Wielaard + + * HACKING: add description on updating namespace + + 2001-07-26 Bryce McKinlay + + * java/util/Calendar.java (set): Never recompute fields here. They + will already be set if someone set time explicitly, and it can cause + problems to do so. Don't invalidate AM_PM setting if HOUR is set. + * java/util/GregorianCalendar.java (computeTime): Don't ignore an + HOUR setting if AM_PM is set. Don't try to ensure the HOUR value is + sane. + * java/text/SimpleDateFormat.java (defaultCentury): New field. + (readObject): Call set2DigitYearStart if appropriate so that + defaultCentury is calculated. + (SimpleDateFormat): Don't bother clearing calendar here. Call + computeCenturyStart(). + (set2DigitYearStart): Calculate and set defaultCentury. + (format): Don't clone the calendar. Use "calendar" not "theCalendar" + everywhere. + (parse): Likewise. If the pattern is "y" or "yy" and it found exactly + 2 numeric digits, use the 80-20 heuristic to parse the value into a + default century based on defaultCenturyStart. + (computeCenturyStart): Rewritten. Call set2DigitYearStart(). + + 2001-07-25 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (libgcj.jar): Correctly fail when bytecode + compilation fails. + + 2001-07-24 Rainer Orth + + * prims.cc (_JNI_OnLoad): New function. + (JNI_OnLoad): Use it. + (_Jv_CreateJavaVM): Check for _JNI_OnLoad, not NULL. + + 2001-07-24 Rainer Orth + + * Makefile.am (AM_MAKEFLAGS): Pass RUNTESTFLAGS. + Makefile.in: Regenerate. + + 2001-07-24 Tom Tromey + + * java/lang/VMClassLoader.java (getPrimitiveClass): Return correct + type. + + 2001-07-23 Tom Tromey + + * gcj/javaprims.h: Rebuilt class list. + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added VMClassLoader. + * java/lang/VMClassLoader.java: New file. + * java/lang/Boolean.java: Merged with Classpath. + * java/lang/Byte.java: Merged with Classpath. + * java/lang/Integer.java: Merged with Classpath. + * java/lang/Long.java: Merged with Classpath. + * java/lang/Number.java: Merged with Classpath. + * java/lang/Short.java: Merged with Classpath. + + 2001-07-22 Jeff Sturm + + * configure.host: Enable hash synchronization for alpha*-*. + * include/posix-threads.h (_Jv_ThreadSelf): Added inline + function for alpha. + * java/lang/natObject.cc (compare_and_swap, release_set, + compare_and_swap_release): Added inline functions for alpha. + + 2001-07-18 Rainer Orth + + * java/net/natPlainDatagramSocketImpl.cc (mcastGrp): Use new RFC + 2533 socket options IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP, falling + back to old RFC 2133 variants if missing. + + 2001-07-18 Tom Tromey + + * java/io/natFileWin32.cc (_access): Renamed. + (_stat): Likewise. + * java/io/natFile.cc (_access): Renamed. + (_stat): Likewise. + * java/io/File.java (access, stat): Add leading `_' to name. + Updated all callers. + + 2001-07-18 Tom Tromey + + For PR java/2812: + * libgcj.spec.in (*lib): Added LIBICONV. + * configure: Rebuilt. + * configure.in: Call AM_ICONV. Don't check for iconv function. + Add parameters to JV_HASH_SYNCHRONIZATION define. + * acinclude.m4 (AM_ICONV): New macro, from Bruno Haible. + + 2001-07-17 Bryce McKinlay + + * java/util/LinkedList.java (clone): Clear the copy list with clear(), + not by setting its size field. + + 2001-07-13 Alexandre Petit-Bianco + + * include/i386-signal.h (HANDLE_DIVIDE_OVERFLOW): Removed unused + local `_ebp.' + + 2001-07-12 Tom Tromey + David Brownell + + Fix for PR libgcj/3426: + * gnu/gcj/convert/natIconv.cc: Include CharConversionException.h, + errno.h. + (read): Throw exception if character conversion fails. + * java/io/BufferedInputStream.java (refill): Now package-private. + * java/io/InputStreamReader.java (ready): Simplified. + (refill): New method. + (read): Use it. + + 2001-07-12 Tom Tromey + + Report from Henner Zeller: + * java/io/FileOutputStream.java (FileOutputStream): Throw + FileNotFoundException, not IOException. + + 2001-07-10 Anthony Green + + * Makefile.in: Rebuilt. + * Makefile.am: Add new files. + * org/w3c/dom/Attr.java, org/w3c/dom/CDATASection.java, + org/w3c/dom/CharacterData.java, org/w3c/dom/Comment.java, + org/w3c/dom/DOMException.java, org/w3c/dom/DOMImplementation.java, + org/w3c/dom/Document.java, org/w3c/dom/DocumentFragment.java, + org/w3c/dom/DocumentType.java, org/w3c/dom/Element.java, + org/w3c/dom/Entity.java, org/w3c/dom/EntityReference.java, + org/w3c/dom/NamedNodeMap.java, org/w3c/dom/Node.java, + org/w3c/dom/NodeList.java, org/w3c/dom/Notation.java, + org/w3c/dom/ProcessingInstruction.java, org/w3c/dom/Text.java, + org/w3c/dom/ranges/DocumentRange.java, + org/w3c/dom/ranges/Range.java, + org/w3c/dom/ranges/RangeException.java, + org/w3c/dom/traversal/DocumentTraversal.java, + org/w3c/dom/traversal/NodeFilter.java, + org/w3c/dom/traversal/NodeIterator.java, + org/w3c/dom/traversal/TreeWalker.java, + org/xml/sax/ext/DeclHandler.java, + org/xml/sax/ext/LexicalHandler.java, + org/xml/sax/helpers/AttributeListImpl.java, + org/xml/sax/helpers/AttributesImpl.java, + org/xml/sax/helpers/DefaultHandler.java, + org/xml/sax/helpers/LocatorImpl.java, + org/xml/sax/helpers/NamespaceSupport.java, + org/xml/sax/helpers/ParserAdapter.java, + org/xml/sax/helpers/ParserFactory.java, + org/xml/sax/helpers/XMLFilterImpl.java, + org/xml/sax/helpers/XMLReaderAdapter.java, + org/xml/sax/helpers/XMLReaderFactory.java, + org/xml/sax/AttributeList.java, org/xml/sax/Attributes.java, + org/xml/sax/ContentHandler.java, org/xml/sax/DTDHandler.java, + org/xml/sax/DocumentHandler.java, org/xml/sax/EntityResolver.java, + org/xml/sax/ErrorHandler.java, org/xml/sax/HandlerBase.java, + org/xml/sax/InputSource.java, org/xml/sax/Locator.java, + org/xml/sax/Parser.java, org/xml/sax/SAXException.java, + org/xml/sax/SAXNotRecognizedException.java, + org/xml/sax/SAXNotSupportedException.java, + org/xml/sax/SAXParseException.java, org/xml/sax/XMLFilter.java, + org/xml/sax/XMLReader.java: New files. + + 2001-07-10 Alexandre Petit-Bianco + + * Makefile.am: Added `java/lang/ThreadLocal.java'. + * Makefile.in: Regenerate. + * java/lang/ThreadLocal.java: Initial import. + + 2001-07-07 Jeff Sturm + + * Makefile.am (libgcj.jar): Don't recursively make + built_java_source_files. Avoid long command lines. + Don't change to $(srcdir) to invoke javac. + (libgcj.la, libgcjx.la); Avoid long command lines. + ($(nat_headers),$(x_nat_headers)): Depend on libgcj.jar. + * Makefile.in: Rebuilt. + + 2001-07-06 Andrew Haley + + * include/i386-signal.h: Don't do anything with unsigned divide + overflow except throw an exception. + + 2001-07-05 Tom Tromey + + For PR java/3562: + * java/lang/Class.h (Class(void)): Now private. Removed + implementation. From dmorsberger@sensysdl.com. + + 2001-07-02 Tom Tromey + + Fix for PR bootstrap/3281: + * aclocal.m4, configure: Rebuilt. + * acinclude.m4 (LIBGCJ_CONFIGURE): Don't set libgcj_flagbasedir. + Correctly compute libgcj_basedir. + (mkinstalldirs): Define and subst. + + 2001-07-01 Jeremy Nimmer + + For PR libgcj/3523: + * java/io/LineNumberReader.java (reset): Pass correct arguments to + countLines. + + 2001-06-27 Tom Tromey + + * gnu/gcj/convert/IOConverter.java: Manually maintained alias now + lowercase. + + 2001-06-25 Tom Tromey + + * scripts/encodings.pl: Generate lower-case names. Updated URL + for `character-sets' file. + * gnu/gcj/convert/IOConverter.java (canonicalize): Convert name to + lower case. + Rebuilt list of aliases. + + 2001-06-25 Tom Tromey + + * java/io/natFileDescriptorPosix.cc (open): Change error message + formatting. From David Brownell. + + 2001-06-21 Tom Tromey + + * include/java-interp.h (_Jv_InterpClass): Use JV_MARKOBJ_DECL. + From Corey Minyard. + + 2001-06-19 Mark J. Roberts + + * java/math/BigInteger.java (byteArrayToIntArray): Don't include + extraneous/malformed sign word. + + 2001-06-15 Tom Tromey + + * jni.cc (_Jv_JNI_NewLocalRef): Search other frames. + + 2001-06-15 Tom Tromey + + * java/lang/natRuntime.cc (_Jv_FindSymbolInExecutable): Return + NULL if no library on the list has the symbol. + (init): Call add_library on the program itself. + * prims.cc (JvRunMain): Initialize Runtime before searching for + `main'. + (_Jv_RunMain): Likewise. + + 2001-06-15 Tom Tromey + + * jni.cc (ClassClass): Removed; updated all users. + (ObjectClass): Likewise. + (ThrowableClass): Likewise. + (MethodClass): Likewise. + (ThreadGroupClass): Likewise. + (local_ref_table): Renamed from `ref_table'. + (global_ref_table): New global. + (_Jv_JNI_Init): Initialize both ref tables. + (mark_for_gc): Added `ref_table' parameter. + (unmark_for_gc): Likewise. Also, fail if we unreferenced too many + times. + (_Jv_JNI_NewGlobalRef): Updated for new mark function. + (_Jv_JNI_DeleteGlobalRef): Likewise. + (_Jv_JNI_DeleteLocalRef): Likewise. + (_Jv_JNI_NewLocalRef): Likewise. + (_Jv_JNI_PopLocalFrame): Likewise. + (_Jv_JNI_GetStringChars): Likewise. + (_Jv_JNI_ReleaseStringChars): Likewise. + (_Jv_JNI_GetPrimitiveArrayElements): Likewise. + (_Jv_JNI_ReleasePrimitiveArrayElements): Likewise. + + 2001-06-14 Tom Tromey + + Fix for PR libgcj/3144: + * java/util/Date.java: Merged with Classpath. + + 2001-06-12 Tom Tromey + + * aclocal.m4, configure: Rebuilt. + * acinclude.m4: Find configure.host in srcdir. + + 2001-06-07 Tom Tromey + + Fix for PR libgcj/3059: + * java/lang/natSystem.cc (init_properties): Define `java.home'. + * Makefile.in: Rebuilt. + * Makefile.am (AM_CXXFLAGS): Define PREFIX. + + 2001-06-10 Alexandre Petit-Bianco + + * exception.cc (cstdlib): Replaces stdlib.h. + (_Jv_Throw): Use std::abort(). + (PERSONALITY_FUNCTION): Likewise. + + 2001-06-09 Alexandre Oliva , Stephen L Moshier + + * acinclude.m4 (AC_EXEEXT): Work around in case it expands to + nothing, as in autoconf 2.50. + * aclocal.m4, configure: Rebuilt. + + 2001-06-08 Tom Tromey + + * configure: Rebuilt. + * configure.in: Compute new aux dir using `pwd'. + + 2001-06-07 Tom Tromey + + For PR bootstrap/3075: + * configure, aclocal.m4, Makefile.am: Rebuilt. + * configure.in: Pass `--with-auxdir' to subdir configure. Don't + call AC_CONFIG_AUX_DIR or AC_CANONICAL_SYSTEM. Look for unwind.h + relative to libgcj_basedir. + * acinclude.m4 ((LIBGCJ_CONFIGURE): Call AC_CONFIG_AUX_DIR and + AC_CANONICAL_SYSTEM here. + * Makefile.am (CONFIG_STATUS_DEPENDENCIES): Use srcdir, not + libgcj_basedir. + ($(extra_headers)): New target. + + 2001-06-05 Martin Kahlert + Bryce McKinlay + + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Ensure that ancestors + table index is within allowed bounds. Ensure that we don't try to access + class itable at a negative offset. Avoid an ancestor table lookup if + source is a primitive type class. + (isInstance): Remove redundant isPrimitive() check. + + 2001-06-04 Tom Tromey + + * java/security/PublicKey.java: Extend Key. + * java/security/PrivateKey.java: Extend Key. + + 2001-06-02 Anthony Green + + * java/lang/natRuntime.cc (_Jv_FindSymbolInExecutable): Provide an + alternate when USE_LTDL not defined. + + 2001-06-02 Anthony Green + + * configure: Rebuild. + * configure.in: Remove data_start hack. + * libgcj.spec.in: Ditto. + * Makefile.in: Rebuild. + * Makefile.am: Ditto. + * libgcjdata.c: Remove. + + 2001-06-02 Anthony Green + + * configure: Rebuild. + * configure.in (LIBFFIINCS, LIBFFI): Introduce. Add + --without-libffi option. Tweak --disable-java-net processing. + * Makefile.in: Rebuild. + * Makefile.am (LIBFFIINCS, LIBFFI): Use. + * include/config.h.in: Rebuild. + * acconfig.h (USE_LIBFFI): Define. + * java/lang/reflect/natMethod.c: Use USE_LIBFFI. + + 2001-06-02 Anthony Green + + * configure: Rebuilt. + * configure.in: Test for sigaction on native builds. + * prims.cc: Check HAVE_SIGACTION. + * include/config.h.in: Rebuilt. + + 2001-05-31 Jeff Sturm + + * natFile.cc (get_entry): Removed functions. + (performList): Call readdir or readdir_r if HAVE_READDIR_R defined. + Allocate enough storage for d_name if using readdir_r. + + 2001-05-31 Tom Tromey + + * java/io/natFileDescriptorPosix.cc (open): Allocate buffer to + correct size. + (write): Loop until write completes. From Corey Minyard. + + 2001-05-29 Laurent Guerby + + * java/awt/geom/Rectangle2D.java: fix doc typo. + + 2001-05-31 Tom Tromey + + * java/sql/DriverManager.java (getDrivers): Handle case where + driver's class loader is null. From Corey Minyard. + + 2001-05-29 Tom Tromey + + * include/jvm.h (_Jv_ThrowNoMemory): Mark as noreturn. + + * configure: Rebuilt. + * configure.in: Only add multilib support code if we just rebuilt + top-level Makefile. + + 2001-05-29 Andrew Haley + + * include/i386-signal.h (MAKE_THROW_FRAME): Don't fix up frame + pointer: the dwarf unwinder in libgcc will do everything that's + needed. + (HANDLE_DIVIDE_OVERFLOW): Tidy. Don't mess with stack frames any + more than we absolutely need to. + * configure.host (EXCEPTIONSPEC): Remove libgcj_sjlj on Alpha. + * configure.in (SIGNAL_HANDLER): Use include/dwarf2-signal.h on + Alpha. + (SIGNAL_HANDLER): Test "$enable_sjlj_exceptions", not + "$libgcj_sjlj". + * configure: Rebuilt. + * include/dwarf2-signal.h (MAKE_THROW_FRAME): Adjust PC + for Alpha. + (SIGNAL_HANDLER): Use siginfo style handler. + (INIT_SEGV): Likewise. + (INIT_FPE): Likewise. + * include/ppc-signal.h: Delete whole file. + + 2001-05-24 Tom Tromey + + * java/lang/natString.cc (init): Throw + ArrayIndexOutOfBoundsException. + (getChars): Likewise. + (getBytes): Likewise. + (valueOf): Likewise. + + * configure.in: Only allow hash synchronization when POSIX threads + are enabled. + * java/lang/natObject.cc (alloc_heavy): Properly find `init' field + of sync info object. + + 2001-05-23 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (AM_CXXFLAGS): Remove -fvtable-thunks. + + Revert patch of 2001-05-21: + * Makefile.am (libgcj_la_DEPENDENCIES): Removed nat_files. + (libgcj_la_LIBADD): Likewise. + (libgcjx_la_DEPENDENCIES): Removed x_nat_files. + (libgcjx_la_LIBADD): Likewise. + + * posix-threads.cc (_Jv_self_cache): Renamed from self_cache. + * gcj/Makefile.in: Rebuilt. + * gcj/Makefile.am (gcj_HEADERS): Added libgcj-config.h. + * gcj/javaprims.h: Include gcj/libgcj-config.h. + * gcj/libgcj-config.h.in: New file. + * libgcj.spec.in (*jc1): Added @HASH_SYNC_SPEC@. + * configure: Rebuilt. + * configure.in: Enable hash synchronization by default on some + platforms. + (HASH_SYNC_SPEC): New subst. + (AC_CONFIG_HEADER): Added gcj/libgcj-config.h. + Correctly use `test -z' instead of `test -n' in a couple places. + (JV_HASH_SYNCHRONIZATION): Use AC_DEFINE; don't add to + LIBGCJ_CXXFLAGS. + * configure.host (enable_java_net_default): Initialize. + (enable_hash_synchronization_default): New variable. + + 2001-05-23 Hans Boehm + + * boehm.cc (_Jv_MarkObj): Don't mark sync_info when hash + synchronization in use. + (_Jv_MarkArray): Likewise. + (_Jv_AllocBytes): Don't check return result. + (handle_out_of_memory): New function. + (_Jv_InitGC): Set GC_oom_fn. + (trace_one_vtable): New global. + (_Jv_AllocTraceOne): New function. + * configure.in: Added --enable-hash-synchronization. + * defineclass.cc, prims.cc, resolve.cc, java/lang/natString.cc, + java/net/natInetAddress.cc: Remove _Jv_AllocBytesChecked. + * nogc.cc (_Jv_AllocObj): Throw out-of-memory. + (_Jv_AllocArray): Likewise. + (_Jv_AllocBytes): Likewise. + (_Jv_AllocPtrFreeObject): New function. + (_Jv_AllocTraceOne): Likewise. + * posix-threads.cc (_Jv_ThreadRegister): Handle slow + pthread_self(). + (self_cache): New global. + (_Jv_ThreadSelf_out_of_line): New function. + * prims.cc (_Jv_AllocBytesChecked): Removed. + (_Jv_ThrowNoMemory): New function. + (_Jv_AllocObject): Don't check for null return from allocator. + (_Jv_NewObjectArray): Likewise. + (_Jv_AllocPtrFreeObject): New function. + (_Jv_NewPrimArray): Allocate pointer-free object if possible. + * include/javaprims.h (_Jv_AllocPtrFreeObject): Declare. + (_Jv_MonitorEnter, _Jv_MonitorExit): Don't return value. + * include/boehm-gc.h (_Jv_AllocObj): Define. + (_Jv_AllocPtrFreeObj): Define. + * include/jvm.h (_Jv_AllocPtrFreeObj): Declare. + (_Jv_ThrowNoMemory): Declare. + (_Jv_AllocTraceOne): Declare. + (_Jv_AllocBytesChecked): Removed. + * include/posix-threads.h (_Jv_MutexInit, _Jv_MutexLock, + _Jv_MutexUnlock): Handle LOCK_DEBUG. + (_Jv_ThreadSelf): Handle case where system pthread_self() is + slow. + * java/lang/Class.h (Class): Declare _Jv_AllocPtrFreeObj as + friend. + * java/lang/Object.h (sync_info): Conditional upon presence of + hash synchronization. + * java/lang/natObject.cc: Much new code to handle thin locks and + hash synchronization. + * java/lang/natString.cc (_Jv_AllocString): Allocate pointer-free + object if possible. + + 2001-05-23 Joseph S. Myers + + * gij.cc (version): Update copyright year. + + 2001-05-22 Anthony Green + + * configure.in: Tweak canadian cross test, and don't redefine GCJ + for cross builds. + + 2001-05-21 Per Bothner + + Implement invocation interface; don't create new thread for main. + * java/lang/Thread.java (gen_name): Make native. + ((Thread,THreadGroup,Runnable,String)): New private + constructor, used by other constructors, and _Jv_AttachCurrentThread. + * java/lang/natThread.cc (gen_name): New implementation. + (_Jv_AttachCurrentThread, _Jv_DetachCurrentThread): New. + * prims.cc (main_init): Removed, replaced by _Jv_CreateJavaVM. + (_Jv_CreateJavaVM): New runtime initialization procedure. + (runFirst): New proecdure - mostly code from old FirstThread::run. + (JvRunMain, _Jv_RunMain): Re-write to use new invocation code. + * gcj/cni.h (JvCreateJavaVM, JvAttachCurrentThread, + JvDetachCurrentThread): New inline wrappers. + * gcj/javaprims.h (_Jv_CreateJavaVM, _Jv_AttachCurrentThread, + _Jv_DetachCurrentThread): New declarations. + * gnu/gcj/runtime/FirstThread.java: Gutted. Now contains only ... + (getMain): new static method. + * gnu/gcj/runtime/natFirstThread.cc: Removed; run method replaced + by runFirst in prims.cc. + (java/lang/Thread.h): Update for new invocation interface. + * include/posix-threads.h (_Jv_ThreadRegister, + _Jv_ThreadUnRegister): New declarations. + * posix-threads.cc (_Jv_ThreadRegister, _Jv_ThreadUnRegister): New. + (really_start): Use new _Jv_ThreadRegister. + * include/no-threads.h (_Jv_ThreadInitData): No longer inline. + (_Jv_ThreadRegister, _Jv_ThreadUnRegister): New empty inlines. + * no-threads.cc (_Jv_ThreadInitData): Set _Jv_OnlyThread here. + Complain of called when _Jv_OnlyThread already set. + (_Jv_ThreadStart): Always JvFail. + * include/win32-threads.h (_Jv_Thread_t): New thread_obj field. + (_Jv_ThreadRegister, _Jv_ThreadUnRegister): New declarations. + * win32-threads.cc (struct starter): Remove objet field - + we use _Jv_Thread_t's new thread_obj field instead. + (_Jv_ThreadInitData): Set _Jv_Thread_t's thread_obj field. + (_Jv_ThreadRegister, _Jv_ThreadUnRegister): New. + (really_start): Use new _Jv_ThreadRegister. + * jni.cc (_Jv_JNI_AttachCurrentThread): Use _Jv_AttachCurrentThread. + (_Jv_JNI_DetachCurrentThread): Use _Jv_DetachCurrentThread. + * gnu/gcj/jni/NativeThread.java, gnu/gcj/jni/natNativeThread.cc: + Removed - no longer needed with new invocation interface. + * Makefile.am: Update for removed/added files. + + 2001-05-21 Per Bothner + + * Makefile.am (libgcj_la_DEPENDENCIES): Add $(nat_files). + (libgcj_la_LIBADD): Likewise. + (libgcjx_la_DEPENDENCIES, libgcjx_la_LIBADD): Add $(x_nat_files). + + 2001-05-21 Per Bothner + + * gcj/javaprims.h (_Jv_FormatInt): New declaration. + * java/lang/natString.cc (_JvFormatInt): New primitive, with logic + taken from old Integer.toString code. + (Integer::valueOf): Use _Jv_FormatInt. + * java/lang/Integer.java (toString): Just use call String.valueOf. + * java/lang/Long.java (toString): Fix typo in comment. + * java/lang/String.java (valueOf(int)): Make native. + * java/lang/StringBuffer.java (append(int)): Make native. + * java/lang/natStringBuffer.cc: New file, for append(jint). + * Makefile.am (nat_source_files): Add java/lang/natStringBuffer.cc. + + 2001-05-21 Tom Tromey + + * gnu/gcj/runtime/VMClassLoader.java (VMClassLoader): Now public. + + 2001-05-18 Andrew Haley + + * include/dwarf2-signal.h: New file. + * configure.in (SYSDEP_SOURCES): Add dwarf2-signal.h for PPC. + * configure.host (EXCEPTIONSPEC): Don't use sjlj on PPC. + * configure: Rebuilt. + + 2001-05-21 Bryce McKinlay + + * configure.in: Update boehm-gc include dir for new GC version. + * configure: Rebuilt. + * exception.cc: Only include . Remove TRUE/FALSE hacks and + extern "C" wrapper. + * boehm.cc: Update includes for new GC version. MAKE_PROC is now + GC_MAKE_PROC. mark_proc is now GC_mark_proc. + * posix-threads.cc: Only include . Don't need to wrap with + extern "C". + + 2001-05-18 Alexandre Petit-Bianco + + * include/posix-threads.h (_Jv_CondInit): `0' used in place of `NULL.' + (_Jv_MutexInit): Likewise. + + 2001-05-18 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added Polygon.java. + + 2001-05-18 Bryce McKinlay + + * include/jvm.h: Move "#pragma GCC java_exceptions" to ... + * gcj/javaprims.h: ... here. + * gnu/gcj/io/shs.cc: Add "#pragma GCC java_exceptions". + + 2001-05-17 Martin Kahlert + + * java/lang/natClass.cc (_Jv_FindIIndex): Fix an off by one error + with length of ioffset table. + (_Jv_IsAssignableFrom): Likewise. + + 2001-05-17 Per Bothner + + * Makefile.am (ZIP): The "fastjar" binary is now plain "jar". + + 2001-05-16 Tom Tromey + + * java/text/SimpleDateFormat.java (parse): Handle non-dst time + zones. + + 2001-05-15 Tom Tromey + + * java/util/GregorianCalendar.java (computeTime): Only call + getTimeZone() once. + + 2001-05-14 Tom Tromey + + * java/text/SimpleDateFormat.java (parse): Clear DST_OFFSET and + ZONE_OFFSET just before computing the time. + + 2001-05-12 Zack Weinberg + + * Makefile.am (libgcj_la_OBJECTS): Remove libsupc++convenience.la. + * Makefile.in: Regenerate (by hand). + * include/jvm.h: Add #pragma GCC java_exceptions at top of file. + * doc/cni.sgml: Document #pragma GCC java_exceptions. + + 2001-05-11 Richard Henderson + + * configure.in (ia64-*): Don't set SYSDEP_SOURCES. + * java/lang/natThrowable.cc: Don't use __ia64_backtrace. + + 2001-05-11 Richard Henderson + + * exception.cc: Include unwind-pe.h. Remove all pointer + encoding logic. + + 2001-05-10 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added Polygon.java. + * java/awt/Polygon.java: New file. + + * java/awt/geom/AffineTransform.java + (setToRotation(double,double,double)): New method. + (AffineTransform): Set type to TYPE_GENERAL_TRANSFORM. + (setToShear): Likewise. + + 2001-05-10 Tom Tromey + + * java/util/GregorianCalendar.java: Imported from Classpath. + * gnu/java/locale/LocaleInformation_nl.java: New file from + Classpath. + * gnu/java/locale/LocaleInformation_en.java: Likewise. + * gnu/java/locale/LocaleInformation_de.java: Likewise. + * gnu/java/locale/LocaleInformation.java: Likewise. + * natGregorianCalendar.cc: Removed. + * Makefile.in: Rebuilt. + * Makefile.am (nat_source_files): Removed + natGregorianCalendar.cc. + + 2001-05-10 Tom Tromey + + * java/text/SimpleDateFormat.java (computeCenturyStart): New + method. + (defaultCenturyStart): Use it. + (readObject): Likewise. + (SimpleDateFormat): Clear the calendar. Set the grouping on the + number format. + (parse): Copy the calendar before modifying it. Correctly handle + the time zone. + + * java/util/Calendar.java (clear): Set field value(s) to 0. + + 2001-05-10 Jeff Sturm + + * Calendar.java (get): Clear areFieldsSet if requested field + is not set. + (set): Unset fields that depend on new value. + + 2001-05-06 Bryce McKinlay + + * java/lang/Class.h (_Jv_Self): New union type. + (Class): Manipulate vtable pointer via _Jv_Self union. Thanks to + Jeff Sturm and Fergus Henderson. + + 2001-05-06 Bryce McKinlay + + * java/lang/ClassLoader.java: Remove dead code fragment. + + 2001-05-03 Martin Kahlert + + * jni.cc (_Jv_JNI_GetPrimitiveArrayRegion): Fixed bounds + checking. + (_Jv_JNI_SetPrimitiveArrayRegion): Likewise. + + 2001-04-30 Andrew Haley + + * libgcj.spec.in (jc1): Add EXCEPTIONSPEC. + * configure.host (EXCEPTIONSPEC): New. + * configure.in (EXCEPTIONSPEC): New. + * configure: Rebuilt. + + 2001-05-02 Bryce McKinlay + + * doc/*.texi: Remove generated documentation. + + 2001-04-30 Matt Kraai + + * java/io/natFile.cc (performSetReadOnly): Fix #ifdef test. + (performDelete): Fix #endif placement. + + 2001-04-27 Zack Weinberg + + * prims.cc (_Jv_ThisExecutable): Use _Jv_Malloc. + * posix-threads.cc (_Jv_ThreadInitData): Use _Jv_Malloc. + (_Jv_ThreadDestroyData): Use _Jv_Free. + * java/lang/natClassLoader.cc (_Jv_RegisterInitiatingLoader): + Use _Jv_Malloc. + + 2001-04-27 Tom Tromey + + * jni.cc (_Jv_JNI_GetPrimitiveArrayRegion): Fixed bounds + checking. + (_Jv_JNI_SetPrimitiveArrayRegion): Likewise. + + 2001-04-27 Martin Kahlert + + * include/jni.h (struct JNINativeInterface): Fixed types in + Get/Set*ArrayRegion declarations. + (class _Jv_JNIEnv): Likewise. + + 2001-04-26 Alexandre Oliva + + * configure.in: Obtain THREADS with `gcc -v'. + * configure: Rebuilt. + + 2001-04-25 Bryce McKinlay + + Fix PR libgcj/2237: + * java/io/ObjectStreamClass.java (setClass): Calculate + serialVersionUID for local class and compare it against the UID + from the Object Stream. Throw InvalidClassException upon mismatch. + (setUID): Renamed to... + (getClassUID): this. Return the calculated class UID rather than + setting uid field directly. + (getDefinedSUID): Removed. + * java/io/ObjectInputStream.java (resolveClass): Use the + three-argument Class.forName(). + * java/io/InvalidClassException (toString): Don't include classname in + result if it is null. + + 2001-04-25 Kaveh R. Ghazi + + * java/net/natInetAddress.cc (java::net::InetAddress::aton): + Wrap use of inet_pton in HAVE_INET6. + + 2001-04-25 Bryce McKinlay + + java.security merge and ClassLoader compliance fixes. + + * java/lang/Class.h (Class): Include ProtectionDomain.h. + New protectionDomain field. + (forName): Add initialize parameter. Fixes declaration to comply with + JDK spec. + * java/lang/natClass.cc (forName): Correct declaration of the three-arg + variant. Honour "initialize" flag. + (getProtectionDomain0): New method. + * java/lang/Class.java: Fix forName() declaration. + (getPackage): New method based on Classpath implementation. + (getProtectionDomain0): New native method decl. + (getProtectionDomain): New method. + * java/lang/ClassLoader.java (getParent): Now final. + (definedPackages): New field. + (getPackage): New. + (defineClass): New variant with protectionDomain argument. + (definePackage): New. + (getPackages): New. + (findSystemClass): Now final. + (getSystemResourceAsStream): Remove redundant "final" modifier. + (getSystemResource): Remove redundant "final" modifier. + (getResources): Now final. + (protectionDomainPermission): New static field. + (unknownProtectionDomain): Ditto. + (defaultProtectionDomain): Ditto. + (getSystemClassLoader): Now non-native. + * java/util/ResourceBundle.java (tryGetSomeBundle): Use the correct + arguments for Class.forName(). + * java/lang/Package.java: New file. + * gnu/gcj/runtime/VMClassLoader.java (getVMClassLoader): Removed. + (instance): Static initialize singleton. + (findClass): Override this, not findSystemClass. + * java/lang/natClassLoader.cc (defineClass0): Set class's + protectionDomain field as specified. + (getSystemClassLoader): Removed. + (findClass): Renamed from findSystemClass. Call the interpreter via + URLClassLoader.findClass if loading class via dlopen fails. + + * java/security/*.java: java.security import/merge with Classpath. + * java/security/acl/*.java: Likewise. + * java/security/interfaces/*.java: Likewise. + * java/security/spec/*.java: Likewise. + * java/net/NetPermission.java: Likewise. + * java/net/SocketPermission.java: Likewise. + * gnu/java/security/provider/DefaultPolicy.java: Likewise. + + * Makefile.am: Add new classes. + * Makefile.in: Rebuilt. + * gcj/javaprims.h: CNI namespace rebuild. + + 2001-04-24 Alexandre Oliva + + * configure.in (CPPFLAGS): Added builddir and srcdir to CPPFLAGS + for libtool tests. Pre-create gnu/classpath/Configuration.java. + * configure: Rebuilt. + + 2001-04-21 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added Line2D.java. + * java/awt/geom/Line2D.java: Wrote. + + * java/awt/Menu.java (addNotify): Wrote. + + * java/awt/PopupMenu.java (addNotify): Implemented. + (show): Likewise. + + * java/awt/Scrollbar.java (addNotify): Call super.addNotify. + * java/awt/List.java (addNotify): Call super.addNotify. + * java/awt/Label.java (addNotify): Call super.addNotify. + * java/awt/FileDialog.java (addNotify): Call super.addNotify. + * java/awt/Dialog.java (addNotify): Call super.addNotify. + * java/awt/Choice.java (addNotify): Call super.addNotify. + * java/awt/CheckboxMenuItem.java (addNotify): Call super.addNotify. + * java/awt/Checkbox.java (addNotify): Call super.addNotify. + + * java/awt/List.java (replaceItem): Notify peer. + + * java/awt/geom/Rectangle2D.java + (Float.setRect(float,float,float,float)): New method. + + * java/awt/event/ContainerEvent.java (getContainer): Now returns + Container. + + * java/awt/RenderingHints.java (Key): Class now public. + + * java/awt/Rectangle.java (Rectangle): Now implements + Serializable. + (getPathIterator): Removed. + + * java/awt/GraphicsConfiguration.java (GraphicsConfiguration): New + constructor. + + * java/awt/FileDialog.java: Wrote. + + * java/awt/EventQueue.java (isDispatchThread): Now public. + (invokeLater): Likewise. + + * java/awt/Component.java (setCursor): Update peer. + (getFontMetrics): Use peer. + + * java/awt/ComponentOrientation.java (ComponentOrientation): Class + now final. + + 2001-04-20 Tom Tromey + + * java/awt/List.java: Wrote. + * java/awt/Dialog.java: Wrote. + + 2001-04-20 Warren Levy + + * java/lang/natSystem.cc (getSystemTimeZone): Adjust for DST. + * java/text/SimpleDateFormat.java + (indexInArray): Removed private method. + (processYear): Removed private method. + (parseLenient): Removed private method. + (parseLeadingZeros): Removed private method. + (parseStrict): Removed private method. + (expect): Added new private method. + (parse): Reverted to pre-Classpath merge version with minor fixes. + * java/util/natGregorianCalendar.cc (computeTime): Handle strict + calendars. + + 2001-04-12 Bryce McKinlay + + * java/io/File.java (normalizePath): New private method. + (File (String)): Use normalizePath(). + (File (String, String)): Likewise. + + * Makefile.am (libffi_files): Removed. + (libgcj.la): Link libffi as a convenience library instead of + refering to its object files directly. + * Makefile.in: Rebuilt. + + 2001-04-08 Per Bothner + + * java/lang/natString.cc (_Jv_NewStringUtf8Const): Register finalizer. + Recalculate hash, since Utf8Const's hash is only 16 bits. + + * java/lang/natString.cc (_Jv_StringFindSlot, rehash): Use high-order + bits of hash to calculate step for chaining. + + * java/lang/natString.cc (intern, _Jv_NewStringUtf8Const): Rehash + when 2/3 full, rather than 3/4 full. + + 2001-04-06 Tom Tromey + + * jni.cc (wrap_value, wrap_value): Removed. + (wrap_value): New specialization. + (_Jv_JNI_PopLocalFrame): Update env->locals. + + 2001-04-05 Tom Tromey + + * libtool-version: Updated current. + + 2001-04-04 Andreas Jaeger + + * gcj/Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. + * gcj/Makefile.in: Rebuilt. + * Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. + * Makefile.in: Rebuilt. + * testsuite/Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. + * testsuite/Makefile.in: Rebuild. + * include/Makefile.am (AUTOMAKE_OPTIONS): Remove no-installinfo. + * include/Makefile.in: Rebuild. + + 2001-04-02 Zack Weinberg + + * testsuite/lib/libjava.exp: Correct typo: 'output from source + compiled test', not 'execution from source compiled test'. + Use UNTESTED, not XFAIL, for tests which are not run because + they depend on a previous test which failed. + + 2001-04-02 Richard Henderson + + * configure.in (GCC_UNWIND_INCLUDE): Assume we're built within + the same tree as gcc. + * configure: Rebuilt. + + * exception.cc (_Jv_Throw): Clarify commentary. + + 2001-04-02 Marcus G. Daniels + + * jni.cc (wrap_value): New specialization. + + 2001-04-02 Tom Tromey + + * java/io/PrintStream.java (out): Removed field. Fixes PR + java/2449. + (write): Call flush, not out.flush, per spec. + (close): Flush output stream, per spec. Handle + InterruptedIOException. + (checkError): Likewise. + (flush, print, write): Handle InterruptedIOException per spec. + (PrintStream): Don't create BufferedOutputStream. + (work_bytes): New field. + (writeChars): Use work_bytes. Don't assume `out' is a + BufferedOutputStream. + + 2001-04-02 Torsten Rueger + + * java/text/MessageFormat.java (setLocale): Added missing `else'. + For PR libgcj/2429. + + 2001-03-30 Tom Tromey + + * jni.cc (add_char): Correctly encode non-ascii characters. + (add_char): Define even when INTERPRETER not defined. + (mangled_name): Likewise. + (_Jv_GetJNIEnvNewFrame): Likewise. + (_Jv_LookupJNIMethod): Likewise. + + 2001-03-23 Kevin B Hendricks + + * configure.host: Enable interpreter for PPC. + + 2001-04-02 Bryce McKinlay + + * java/lang/natSystem.cc (init_properties): Revert yesterday's changes + to "file.separator", "path.separator", and "java.io.tmpdir" property + initialization. + * java/io/File.java: Likewise. + * java/io/natFile.cc (init_native): Likewise. + * java/io/natFileWin32.cc (init_native): Likewise. + + 2001-04-01 Per Bothner + + * java/lang/natString.cc (intern): If string's data does not point to + this String, make a fresh String that does. + + * java/lang/natString.cc (unintern): Replace by static function. + * java/lang/String.java (unintern): Remove method. + + 2001-04-01 Per Bothner + + * DeflaterOutputStream.java (deflate): Loop while def.needsInput. + (finish): def.deflate needs to be called in a loop. + (inbuf, inbufLength): New private fields. + (write(int)): Use inbuf. + (write(byte[],int,int): Check if pending output in inbuf. + * ZipOutputStream.java: Don't use Deflater if stored. + Use a Checksum object directly, not via a CheckedOutputStream. + (uncompressed_size): New field, + (closeEntry): Only write data_directory if needed. + (write): If STORED, write directly. + Always update crc, and uncompressed_size. + (write_entry): Fix lots of protocol erors. + + 2001-04-01 Bryce McKinlay + + 1.3-Compliant Implementation of java.io.File. + * java/lang/natSystem.cc (init_properties): Get "file.separator", + "path.separator", and "java.io.tmpdir" from the File class, instead + of setting them explicitly. + * java/io/File.java: Do not canonicalize paths for security manager + checks. Call init_native() from static initializer. Do not pass path + argument to native methods. New native method declarations. Some + security manager checks moved to checkWrite(). + (equals): Check file system case sensitivity and act appropriatly. + (hashCode): Likewise. + (isHidden): New method implemented. + (performList): Changed prototype. Now takes a class argument specifying + the class of the returned array: Strings or File objects. Also added + FileFilter argument. + (listFiles): New variants with "File" return type implemented. + (createTempFile): Use createNewFile(). Use maxPathLen. + (setReadOnly): New method implemented. + (listRoots): Likewise. + (compareTo): Likewise. + (setLastModified): Likewise. + (checkWrite): New method. + (setPath): Removed. + * java/io/natFile.cc: Various functions no longer take canonical path + argument. + (stat): Handle ISHIDDEN query. + (isAbsolute): Remove WIN32 cruft. + (performList): New arguments. Handle returning either File[] or String[] + arrays. Check with FileFilter or FilenameFilter arguments as + appropriate. Use an ArrayList, not a Vector, for the temporary list. + (performSetReadOnly): New method implemented. + (performListRoots): Likewise. + (performSetLastModified): Likewise. + (performCreate): Likewise. + (init_native): New initialization function. + * java/io/natFileWin32.cc: Various functions no longer take canonical + path argument. + (stat): Add FIXME about ISHIDDEN query. + (performList): New arguments. Handle returning either File[] or String[] + arrays. Check with FileFilter or FilenameFilter arguments as + appropriate. Use an ArrayList, not a Vector, for the temporary list. + (performSetReadOnly): New. Stubbed. + (performListRoots): Likewise. + (performSetLastModified): Likewise. + (performCreate): Likewise. + (init_native) New initialization function. + * configure.in: Check for utime() and chmod(). + * configure: Rebuilt. + * include/config.h.in: Rebuilt. + + Resolves PR libgcj/1759. + + 2001-03-28 Richard Henderson + + IA-64 ABI Exception Handling: + * Makefile.am (GCC_UNWIND_INCLUDE): Rename from EH_COMMON_INCLUDE. + (AM_CXXFLAGS): -fnon-call-exceptions not -fasynchronous-exceptions. + Remove EXCEPTIONSPEC. + * configure.host (libgcj_sjlj): Remove. + * configure.in (EXCEPTIONSPEC): Remove. + (enable-sjlj-exceptions): Detect if not specified. + (GCC_UNWIND_INCLUDE): Rename from EH_COMMON_INCLUDE; change + what header we're looking for. + * libgcj.spec.in (jc1): Remove EXCEPTIONSPEC. + * Makefile.in, configure: Regenerate. + * exception.cc: Don't declare libgcc2 stuff. + (java_eh_info, _Jv_type_matcher, _Jv_exception_info): Remove. + (_Jv_eh_alloc, _Jv_eh_free, _Jv_setup_eh_info): Remove. + (win32_get_restart_frame): Remove. + (struct java_exception_header): New. + (__gcj_exception_class): New. + (get_exception_header_from_ue): New. + (_Jv_Throw): Rewrite for IA-64 ABI unwind routines. + (size_of_encoded_value, read_encoded_value): New. + (read_uleb128, read_sleb128, parse_lsda_header): New. + (get_ttype_entry, __gcj_personality_sj0): New. + * gcj/javaprims.h (_Jv_Sjlj_Throw): Remove. + + 2001-03-27 Joerg Brunsmann + + * javax/naming/InitialContext.java (init): Fix typo. + (composeName): Remove unnecessary semicolon. + (addToEnvironment): Remove unnecessary semicolon. + (addToEnvironment): Use put() instead of add(). + + * javax/naming/InitialContext.java (InitialContext): + Make public. + (destroySubcontext): Method doesn't return a result. + * javax/naming/Context.java: Import java.util.Hashtable. + * javax/naming/Name.java: Import java.util.Enumeration. + + 2001-03-27 Bryce McKinlay + + * Makefile.am (libffi_files): Use 'find' to pick up libffi libtool + objects in subdirectories. + * Makefile.in: Rebuilt. + + 2001-03-25 Richard Henderson + + * exception.cc (java_eh_info): Make value type jthrowable. + (_Jv_type_matcher): Remove now unneeded cast. + (_Jv_Throw): Make argument type jthrowable. Munge name + for SJLJ_EXCEPTIONS here ... + * gcj/cni.h: ... not here. + (JvThrow): Remove. + * gcj/javaprims.h (_Jv_Throw, _Jv_Sjlj_Throw): Update declarations. + + * defineclass.cc, interpret.cc, jni.cc, posix-threads.cc, + prims.cc, resolve.cc, gnu/gcj/runtime/natFirstThread.cc, + gnu/gcj/xlib/natDrawable.cc, gnu/gcj/xlib/natFont.cc, + gnu/gcj/xlib/natWMSizeHints.cc, gnu/gcj/xlib/natWindowAttributes.cc, + gnu/gcj/xlib/natXImage.cc, java/io/natFile.cc, + java/io/natFileDescriptorEcos.cc, java/io/natFileDescriptorPosix.cc, + java/io/natFileDescriptorWin32.cc, java/io/natFileWin32.cc, + java/lang/natClass.cc, java/lang/natClassLoader.cc, + java/lang/natDouble.cc, java/lang/natObject.cc, + java/lang/natPosixProcess.cc, java/lang/natRuntime.cc, + java/lang/natString.cc, java/lang/natSystem.cc, + java/lang/natThread.cc, java/lang/reflect/natArray.cc, + java/lang/reflect/natConstructor.cc, java/lang/reflect/natField.cc, + java/lang/reflect/natMethod.cc, java/util/zip/natDeflater.cc, + java/util/zip/natInflater.cc: + Use throw, not JvThrow or _Jv_Throw. + + 2001-03-24 Bryce McKinlay + + * java/util/HashMap.java (HashMap): If 0 is given for initialCapacity + paramater, bump it to 1. + * java/util/Hashtable.java (Hashtable): Likewise. + + 2001-03-23 Per Bothner + + * java/lang/natDouble.cc (parseDouble): Cannot use errno to + check for errors, since we don't want to throw exception on + overflow/underflow. Instead, trim whitespace, and then check that + _strtod_r uses up all the rest of the string. + + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Checking the + ancestors array is invalid for interfaces, so do that *after* + check that the target type is not an interface. + + 2000-03-23 Jeff Sturm + + * prims.cc (_Jv_FindClassFromSignature): Check return of + recursive call. Do not abort on invalid signature; return NULL + instead. + + 2001-03-22 Tom Tromey + + * jni.cc (_Jv_JNI_GetAnyFieldID): Handle unresolved fields. + * java/lang/reflect/natField.cc (getType): Use _Jv_ResolveField + unconditionally. + * include/jvm.h (_Jv_ResolveField): Declare. + * include/java-interp.h (_Jv_ResolveField): Don't declare. + * resolve.cc (_Jv_ResolveField): No longer conditional on + INTERPRETER. + + 2001-03-23 Bryce McKinlay + + Fix for PR libgcj/1736. Thanks to Robert Boehne and Alexandre Oliva + for libtool hacking. + * Makefile.am (libgcj.la): New explicit rule. Echo the list of objects + to a temporary file, then invoke libtool with the -objectlist + paramater. + (libgcjx.la): Likewise. + * Makefile.in: Rebuilt. + + 2001-03-22 Joerg Brunsmann + + * javax/naming/Context.java (SECURITY_CREDENTIALS): Fix typo. + + 2001-03-22 Marcus G. Daniels + + * jni.cc (add_char): Handle `.' like `/'. + + 2001-03-22 Bryce McKinlay + + * java/lang/reflect/Method.java (getExceptionTypes): Call getType() to + initialize if exception_types is null. + * java/lang/reflect/Constructor.java: Likewise. + * java/lang/reflect/natConstructor.cc (getType): Initialize + exception_types to an empty Object array. + + 2001-03-21 Tom Tromey + + * configure: Rebuilt. + * configure.in (GCJFLAGS): Subst. + * Makefile.in: Rebuilt. + * Makefile.am (jv_convert_LDFLAGS): Added -shared-libgcc. + (gij_LDFLAGS): Likewise. + (JC1FLAGS): Added GCJFLAGS and removed -g. + + * java/io/natFileDescriptorPosix.cc (open): Add O_CREAT in + read/write case. Fixes PR libgcj/2338. + + 2001-03-20 Warren Levy + + * java/util/TimeZone.java: Sync up with Classpath. Includes new + and corrected SimpleTimeZone's for the timezones hash table. + + 2001-03-19 Per Bothner + + * java/net/URLStreamHandler.java (parseURL): Fix bug which would + "canonicalize" "../../xxx" to "/xxx". + + 2001-03-19 Mark Wielaard + + * java/util/ArrayList.java: Remove RCS keywords from comments + * java/util/BasicMapEntry.java: idem + * java/util/Dictionary.java: idem + * java/util/HashSet.java: idem + + * java/util/EventObject.java: reindent + * java/util/Properties.java: idem + * java/util/SortedMap.java: idem + + * java/util/Enumeration.java: Merge with Classpath + * java/util/EventListener.java: idem + * java/util/Observable.java: idem + * java/util/Observer.java: idem + * java/util/Stack.java: idem + + 2001-03-17 Tom Tromey + + * java/lang/natString.cc (rehash): Don't bother with memset; + _Jv_AllocBytes returns zero'd memory. Use _Jv_AllocBytesChecked. + Use UNMASK_PTR. + (UNMASK_PTR): New macro. + (intern): Unmask pointer before returning it. Register finalizer + for the string. + (unintern): Handle case where + (MASK_PTR): New macro. + (PTR_MAKSED): Likewise. + (_Jv_NewStringUtf8Const): Use UNMASK_PTR. + + 2001-03-01 Andrew Haley + + * java/lang/natThrowable.cc (printRawStackTrace): Copy the + stackTrace buffer to a correctly aligned pointer array. + + 2001-03-12 Bryce McKinlay + + * java/lang/Runtime.java (_exit): Declare new package-private native. + * java/lang/natRuntime.cc (_exit): Implemented. Same as exit() but + without a security manager check. + (exit): Call _exit after security check. + * prims.cc (JvRunMain): Call Runtime._exit to shutdown the runtime + "naturally". + * java/lang/System.java (setSecurityManager): If a security manager + is already in place, call checkPermission. + * java/lang/ThreadGroup.java (uncaughtException): If printStackTrace() + throws an exception, try to deal with it gracefully. + * java/lang/ExceptionInInitializerError.java (printStackTrace): + Only try to print the subordinate stack trace if "exception" is set. + Print our class name first. + + 2001-03-08 Tom Tromey + + * java/io/ObjectStreamClass.java (setUID): Don't write interface + info for array classes. + Fixes PR libgcj/1971. + + 2001-03-06 Bryce McKinlay + + * java/util/TreeSet.java (writeObject): Use a for-loop instead of + Iterator.hasNext(). + + 2001-03-05 Jochen Hoenicke + + * java/util/TreeMap.java (writeObject): Use defaultWriteObject() + instead of the new JDK1.2 API. This is simpler and makes + back-porting the classes to JDK1.1 trivial. + (readObject): likewise. + + 2001-03-01 Per Bothner + + Changes merged from Kawa's gnu.math. + * gnu/gcj/math/MPN.java (rshift0): New method handles zero shift count. + (rshift(int[],int[],int,int): Removed - not needed. + (gcd): Use rshift0 rather than rshift. + * java/math/BigInteger.java (setShiftRight): Likewise. + (divide): Simplify by using rshift0. + (divide): Zero-extend results if high-order bit set. + + 2001-02-27 Bryce McKinlay + + * libgcj.spec.in: Insert %(libgcc) before %(liborig) to fix static + linking. + + 2001-02-23 Per Bothner + + Change to sometimes include class name in ClassFormatError message. + * defineclass.cc (_Jv_VerifyFieldSignature, _Jv_VerifyMethodSignature, + _Jv_VerifyIdentifier, _Jv_VerifyClassName (two overlods)): Return + boolean instead of throwing ClassFormatError on failure. + (throw_class_format_error): Change static function to method. + (_Jv_ClassReader): New inline methods verify_identifier, + two overloads of verify_classname, verify_field_signature, and + verify_method_signature + * include/java-interp.h: Update declarations to return bool. + * java/lang/natClassLoader.cc (defineClass0): Explicitly throw + ClassFormatError since _Jv_VerifyClassName now returns bool. + + 2001-02-23 Per Bothner + + * java/lang/Throwable.java (CPlusPlusDemangler): Pass -s java to + c++filt to select java-style output. + + 2001-02-22 Bryce McKinlay + + Fix for PR java/2040: + * java/util/HashMap.java (HashMap): Don't throw exception for + loadFactor > 1. Add exception messages. + * java/util/Hashtable.java (Hashtable): Likewise. + + 2001-02-21 Bryce McKinlay + + Disable libgcjx by default. + * configure.in: Add support for --enable-java-awt configure option. + Use --enable-java-awt=xlib to build the xlib peers (libgcjx). + * Makefile.am: Make libgcjx conditional on XLIB_AWT, instead of NO_X. + * Makefile.in: Rebuilt. + * configure: Rebuilt. + + 2001-02-20 Tom Tromey + + * java/io/PipedWriter.java (flush): Throw exception if stream + closed. + * java/io/OutputStreamWriter.java (write): Throw exception if + stream closed. + (writeChars): Don't throw exception if stream closed. + * java/io/CharArrayWriter.java (closed): New field. + (close): Set it. + (flush): Throw exception if stream closed. + (reset): Synchronize on correct lock. Allow stream to be + reopened. + (toCharArray, toString, writeTo): Synchronize. + (write): Throwe exception if stream closed. + * java/io/BufferedWriter.java (close): Clear `buffer'. + (flush): Throw IOException if stream is closed. + (write): Likewise. + + 2001-02-16 Tom Tromey + + * java/lang/ThreadGroup.java (activeCount): Only include threads + which are alive. + (enumerate): Likewise. + + 2001-02-19 Bryce McKinlay + + * java/lang/Integer.java (getInteger): Return default argument if + property is not set. Don't call decode with null argument. + * java/lang/Long.java (getLong): Likewise. + + * java/io/CharArrayReader.java (CharArrayReader): Throw + IllegalArgumentException if constructor arguments are illegal. + (ready): Return false if no more characters can be read. + * java/io/ByteArrayInputStream.java (ByteArrayInputStream): Likewise. + + 2001-02-17 Mark Wielaard + + * java/util/TimerTask.java: New version from Classpath. + + 2001-02-17 Mark Wielaard + + Remerge with Classpath + (changes by Bryce McKinlay ) + * java/io/DataInputStream.java (readBoolean): Use convertToBoolean(). + (readByte): Use convertToByte(). + (readChar): Use convertToChar(). + (readInt): Use convertToInt(). + (readLong): Use convertToLong(). + (readShort): Use convertToShort(). + (readUnsignedByte): Use convertToUnsignedByte(). + (readUnsignedShort): Use convertToUnsignedShort(). + (readUTF): Use convertToUTF(). + + (convertToBoolean): Resurrected. + (convertToByte): Ditto. + (convertToChar): Ditto. + (convertToInt): Ditto. + (convertToLong): Ditto. + (convertToShort): Ditto. + (convertToUnsignedByte): Ditto. + (convertToUnsignedShort): Ditto. + (convertToUTF): Ditto. + + 2001-02-17 Mark Wielaard + + * HACKING: new file + + 2001-02-17 Mark Wielaard + + * java/io/DataInputStream.java: update copyright notice + * java/io/PrintWriter.java: idem + * java/io/Reader.java: idem + * java/io/StreamTokenizer.java: idem + * java/io/StringReader.java: idem + * java/lang/reflect/ReflectPermission.java: idem + + 2001-02-16 Bryce McKinlay + + * java/util/TreeSet.java (clone): Made subclass safe, use + super.clone(), not new. + * java/util/TreeMap.java (clone): Likewise. + + * java/util/TreeMap.java (nil): Made non-final. + (clone): Create new nil node for copy. + + * java/util/HashSet.java (clone): Made subclass safe, use + super.clone(), not new. + + 2001-02-14 Andrew Haley + + * include/i386-signal.h (INIT_SEGV): Use a direct system call to + set the handler. + + 2001-02-15 Anthony Green + + * defineclass.cc: Don't include alloca.h. + (prepare_pool_entry): Convert alloca to __builtin_alloca. + * interpret.cc (run_normal): Ditto. + (continue1): Ditto. + * java/lang/natDouble.cc (parseDouble): Ditto. + + 2001-02-15 Bryce McKinlay + + * java/util/TreeSet.java (clone): Call TreeMap.clone(), not + Object.clone(). + * java/util/Collections.java (ReverseComparator): New static class. + (reverseOrder): Return static instance of ReverseComparator. + + * gnu/awt/j2d/DirectRasterGraphics.java (clone): Hoist to public. + * gnu/awt/j2d/IntegerGraphicsState.java (setClip): Call + Rectangle.clone(), not Object.clone(). + + * java/util/HashSet.java (clone): Remove try/catch. + + * java/util/AbstractSequentialList.java: Synchronize with Classpath. + * java/util/Collection.java: Likewise. + * java/util/Comparator.java: Likewise. + * java/util/Dictionary.java: Likewise. + * java/util/Iterator.java: Likewise. + * java/util/ListIterator.java: Likewise. + * java/util/Map.java: Likewise. + * java/util/Set.java: Likewise. + + 2001-02-14 Bryce McKinlay + + * java/util/TreeMap.java: New file. + * java/util/TreeSet.java: New file. + * Makefile.am: Add TreeMap and TreeSet. Enable WeakHashMap. + * Makefile.in: Rebuilt. + * java/util/HashSet.java (clone): Use constructor instead of calling + clone on itself. + * java/util/SortedSet.java: Sync with classpath. + * java/util/HashMap.java (hash): Use if statement instead of ternary, + for clarity. + + * java/lang/natClass.cc (getSignature): Don't try to dereference + param_types if it is null. Instead, take this to mean "no parameters". + * java/lang/TreeMap.java (TreeIterator.next): Throw + NoSuchElementException in preference to ConcurrentModificationException. + (TreeIterator.remove): Throw IllegalStateException in preference to + ConcurrentModificationException. + (SubMap.firstKey): Do a better check for empty SubMap, and if it is, + throw a NoSuchElementException. + (SubMap.lastKey): Likewise. + + 2001-02-13 Tom Tromey + + * java/io/PipedReader.java (ready): Throw IOException if pipe + closed. + * java/io/FilterReader.java (close): Don't clear `in'. + * java/io/CharArrayReader.java (mark): Throw IOException if stream + closed. + (read, ready, reset, skip): Added exception message. + * java/io/BufferedReader.java (mark, reset, ready, read, skip): + Perform checkStatus check inside synchronized block. + + 2001-02-13 Tom Tromey + + * gnu/awt/j2d/AbstractGraphicsState.java (clone): Made public. + + 2001-02-13 Tom Tromey + + Fix for PR libgcj/1351: + * posix.cc (_Jv_select): Throw InterruptedIOException if thread is + interrupted. + Include Thread.h and InterruptedIOException.h. + + 2001-02-13 Bryce McKinlay + + * java/io/BlockDataException.java: Removed. + * java/io/ObjectInputStream.java (readObject): Throw + StreamCorruptedException, not BlockDataException. + * Makefile.am: Remove BlockDataException. + * Makefile.in: Rebuild. + + 2001-02-12 Jeff Sturm + Tom Tromey + + * interpret.cc (continue1): [insn_invokevirtual] Do an explicit + null pointer check. + + 2001-02-09 Tom Tromey + + * java/util/Timer.java: New version from Classpath. + + 2001-02-09 Bryce McKinlay + + * java/lang/Double.java (doubleToRawLongBits): Now native. + * java/lang/Float.java (floatToRawIntBits): Likewise. + * java/lang/natDouble.cc (doubleToRawLongBits): New method. + * java/lang/natFloat.cc (floatToRawIntBits): Likewise. + + 2001-02-09 Alexandre Petit-Bianco + + * java/io/File.java (java.net): Imported. + (getAbsoluteFile): Added. + (getCanonicalPath): Likewise. + (toURL): Likewise. + + 2001-02-08 Bryce McKinlay + + * java/lang/Byte.java: Remove redundant instanceof and null checks. + * java/lang/Integer.java: Likewise. + * java/lang/Long.java: Likewise. + * java/lang/Short.java: Likewise. + * java/lang/Double.java: Likewise. + (doubleToRawLongBits): New method. + * java/lang/Float.java: As above. + (floatToRawIntBits): New method. + + * java/io/OutputStreamWriter.java: (flush, writeChars): Throw + IOException if stream closed. + + 2001-02-08 Tom Tromey + + * java/lang/Float.java (parseFloat): New method. + + 2001-02-08 Tom Tromey + + From paul@dawa.demon.co.uk. Fix for PR libgcj/1913: + * java/io/InputStreamReader.java (ready, read): Throw IOException + if stream has been closed. + + 2001-02-08 Joseph S. Myers + + * README, gij.cc, java/lang/natClass.cc, java/lang/natSystem.cc: + Change sources.redhat.com and sourceware.cygnus.com references to + gcc.gnu.org. + + 2001-02-07 Tom Tromey + + Fix for PR libgcj/1906: + * java/text/MessageFormat.java (setLocale): Use named class + literals. + (forName): Removed. + (format(Object,StringBuffer,FieldPosition)): Special case if + argument is an Object[]. + + 2001-02-07 Bryce McKinlay + + * java/util/Arrays.java: Removed "cmp" methods. + (qsort): Don't use "cmp". + (med3): Likewise. + + 2001-02-07 Mark Benvenuto + + * java/util/Arrays.java (qsort): Handle N value of 7 with insertion + sort. Fix for PR java/1895. + + 2001-02-03 Jeff Sturm + + * configure.host: Use sjlj-exceptions for Alpha. + + 2001-02-03 Bryce McKinlay + + * libgcj.spec.in: Don't force static libgcc into the executable. + * configure.in (FORCELIBGCCSPEC): Removed. + * configure: Rebuilt. + + 2001-01-31 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (LTCXXCOMPILE): New macro. + + 2001-01-26 Andrew Haley + + (INIT_FPE): Use a direct system call to set the handler. + + 2001-01-27 Richard Henderson + + * configure.host (alpha*-*) [libgcj_flags]: Add -mieee. + + 2001-01-27 Tom Tromey + + * jni.cc (_Jv_JNIFunctions): Added comment for each entry in + native interface structure. + + 2001-01-27 Bryce McKinlay + + * java/io/ObjectInputStream.java (read): AND byte with 0xff to make + result unsigned. + (read (byte[], int, int)): Only call readNextBlock() if the block + buffer would actually be overrun. Increment blockDataPosition. + (callReadMethod): Propagate exceptions from invocation target. + * java/io/ObjectOutputStream.java (callWriteMethod): Propagate + exceptions from invocation target. + + 2001-01-26 Tom Tromey + + * jni.cc (_Jv_JNI_GetAnyMethodID): Rewrite signature from external + to internal representation. + (_Jv_JNI_GetAnyFieldID): Likewise. Also, only use + _Jv_FindClassFromSignature. + + 2001-01-26 Warren Levy + + * java/lang/natSystem.cc (getSystemTimeZone): Only use tm_gmtoff + and timezone if they are available on the system. + + 2001-01-24 Tom Tromey + + * java/lang/sf_fabs.c: Use uint32_t, not __uint32_t. + + 2001-01-24 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (c_source_files): Added sf_fabs.c. + * java/lang/sf_fabs.c: New file. + + 2001-01-19 Warren Levy + + * java/text/SimpleDateFormat.java (format): Compute hour for cases + HOUR_OF_DAY1_FIELD (1-24), HOUR1_FIELD (1-12), and HOUR0_FIELD (0-11) + correctly. Adjust properly from 0-23 clock hour. + + 2001-01-17 Mark Wielaard + + * java/bean/Beans.java (instantiate): enable Applet code from Classpath + + 2001-01-17 Bryce McKinlay + + * java/lang/Class.h (isInterface): Move implementation from + natClass.cc. Declare inline. + (Class): Add default constructor. + * java/lang/Object.h: Update comments. + * java/lang/natClass.cc (initializeClass): Use _Jv_InitClass to + initialize superclass, saving a call if super is already initialized. + + 2001-01-16 Alexandre Petit-Bianco + + * prims.cc (init_prim_class): Deleted. + (DECLARE_PRIM_TYPE): Rewritten. + * java/lang/Class.h (stdio.h): Include removed. + (stddef.h): Included. + (java/lang/reflect/Modifier.h): Likewise. + (Class): Contructor now takes arguments, initializes fields. + (initializePrim): Prototype deleted. + * java/lang/natClass.cc (initializePrim): Deleted. + + 2001-01-16 Warren Levy + + * java/math/BigInteger.java: Update Copyright year. + + 2001-01-16 Hans Boehm + + * java/math/BigInteger.java (setShiftRight): Only do negative shift + if count != 0. + + 2001-01-14 Mark Wielaard + * java/net/URLDecoder.java: Thanks Edgar Villanueva (edgarvil@home.com) + (decode): Merge comments with Classpath, don't throw Exception + + 2001-01-12 Tom Tromey + + * gnu/awt/gtk/natGtkComponentPeer.cc (getLocationOnScreen): + Wrote. + (setCursor): Wrote. + Include Cursor.h. + * gnu/awt/gtk/natGtkLabelPeer.cc: New file. + * gnu/awt/gtk/natGtkButtonPeer.cc: New file. + * gnu/awt/gtk/gtkcommon.h (class _Jv_GdkThreadLock): New class. + * gnu/awt/gtk/GtkLabelPeer.java: New file. + * gnu/awt/gtk/GtkButtonPeer.java: New file. + + * java/lang/natSystem.cc: Include locale.h if it exists. + * configure: Rebuilt. + * configure.in: Check for locale.h. + + 2001-01-11 Tom Tromey + + * java/awt/Cursor.java (Cursor(String)): Set type to custom. + (Cursor(int), getPredefinedCursor): Throw exception if argument + invalid. + + 2001-01-03 Tom Tromey + + * gnu/awt/gtk/natGtkComponentPeer.cc (setCursor): Wrote. + (getLocationOnScreen): Wrote. + + 2001-01-11 Bryce McKinlay + + * Makefile.am: Re-enable dependencies. + * Makefile.in: Rebuilt. + + 2001-01-10 Warren Levy + + * java/math/BigDecimal.java (divide): Fixed comment. + + 2001-01-10 Warren Levy + + Fix for PR libgcj/1596: + * java/math/BigDecimal.java (divide): Check newScale for validity. + Ensure that BigInteger.pow() is called with a non-negative value. + (setScale (int)): New public method. + (setScale (int,int)): New public method. + + 2001-01-09 Oskar Liljeblad + + Fix for PR libgcj/1338: + * java/io/StreamTokenizer.java (nextToken): Handle // and /* before + commentChar. Fixed typos in comments. + + 2001-01-08 Warren Levy + + Fix for PR libgcj/1411: + * Makefile.am: Removed java/util/natTimeZone.cc. + * Makefile.in: Rebuilt. + * gnu/gcj/text/LocaleData_en_US.java (zoneStringsDefault): Added + missing localized timezone names. + * java/lang/System.java (getDefaultTimeZoneId): New private method. + * java/lang/natSystem.cc (getSystemTimeZone): New private method. + (init_properties): Set user.timezone property. + * java/text/DateFormatSymbols.java (zoneStringsDefault): Added + default timezone names; removed non-standard ones. Use standard + ID names per JCL. + * java/util/Date.java (toGMTString): Removed zoneGMT variable. + (UTC): Ditto. + * java/util/TimeZone.java: Add standard ID names per JCL; removed + non-standard ones. + (getDefaultTimeZoneId): Removed. + (zoneGMT): Removed. + * java/util/natTimeZone.cc: Removed. + + 2001-01-08 Bryce McKinlay + + * java/lang/Class.h (_Jv_InitClass): Use __builtin_expect. + (_Jv_NewArrayClass): Renamed from _Jv_FindArrayClass. + (_Jv_GetArrayClass): New inline function. + (arrayclass): New field. + * prims.cc (_Jv_NewObjectArray): Use _Jv_GetArrayClass. Don't use + _Jv_GetArrayElementFromElementType. + (_Jv_NewPrimArray): Ditto. + (_Jv_PrimClass constructor): Initialize "depth", "ancestors", and + "idt" for completeness. Initialze "arrayclass" using _Jv_NewArrayClass. + Set Modifier::ABSTRACT. + * java/lang/natClassLoader.cc (_Jv_NewClass): Initialize "arrayclass". + (_Jv_NewArrayClass): Renamed from _Jv_FindArrayClass. Now void. + Now synchronized. Array classes are now referenced from + elementClass->arrayclass. Don't use _Jv_FindClassInCache. + Set array classes' accessibility flags correctly. Optimize so that + all array classes share the same IDT. + * java/lang/reflect/natArray.cc (newInstance): Use _Jv_GetArrayClass. + * java/lang/reflect/natMethod.cc (_Jv_GetTypesFromSignature): Ditto. + * java/lang/natClass.cc (_getFields): Increment offset. Prevent fields + in superclasses from overwriting classes own fields. + (_Jv_IsAssignableFrom): Check for NULL source idt instead of calling + Modifier::isAbstract(). + (null_idt): New static field. + (_Jv_PrepareConstantTimeTables): Optimize case where class implements + no interfaces. + (_Jv_IndexOf): Made inline. + * boehm.cc (_Jv_MarkObj): Mark "arrayclass" field. + + 2001-01-08 Tom Tromey + + Fix for PR java/1586: + * Makefile.in: Rebuilt. + * Makefile.am (AUTOMAKE_OPTIONS): Added no-dependencies. + + 2001-01-08 Bryce McKinlay + + * Makefile.am: Use the new "-M -MF" option for generating dependencies + from the c++ compiler. + * Makefile.in: Rebuilt. + + 2001-01-07 Alexandre Petit-Bianco + + All files with updated copyright. + * prims.cc (class _Jv_PrimClass): Removed. + (init_prim_class): New function. + (DECLARE_PRIM_TYPE): Rewritten. `java::lang::Class' replaces + `_Jv_PrimClass' in primitive type declarations. Assign to the + value returned by `init_prim_class.' + * gcj/array.h: `java::lang::Class' replaces `_Jv_PrimClass' in + primitive type declarations. + (JvPrimClass): Cast to `jclass' removed. + * java/lang/Class.h (Class): New constructor. + (Class): New copy constructor. + (initializePrim): New prototype. + (_Jv_PrimClass): Field removed. + * java/lang/Object.h (struct _JvObjectPrefix): New virtuals + nacd_1 and nacd_2 (for compatibility with the new C++ ABI.) + (class java::lang::Object): `finalize' moved up front. + * java/lang/natClass.cc + (isAssignableFrom): Turned outline. + (isInstance): Likewise. + (isInterface): Likewise, fixed indentation. + (initializePrim): New function. + + 2001-01-07 Anthony Green + + * Makefile.am (texinfo): Add texinfo target for generating texinfo + documentation. + * Makefile.in: Rebuilt. + + * scripts/TexinfoDoclet.java: New file. + + * doc/java-applet.texi, doc/java-lang-reflect.texi, + doc/java-awt-color.texi, doc/java-lang.texi, + doc/java-awt-datatransfer.texi, doc/java-math.texi, + doc/java-awt-event.texi, doc/java-net.texi, + doc/java-awt-geom.texi, doc/java-security-spec.texi, + doc/java-awt-image.texi, doc/java-security.texi, + doc/java-awt-peer.texi, doc/java-sql.texi, doc/java-awt.texi, + doc/java-text.texi, doc/java-beans-beancontext.texi, + doc/java-util-jar.texi, doc/java-beans.texi, + doc/java-util-zip.texi, doc/java-io.texi, doc/java-util.texi, + doc/java-lang-ref.texi: New files. + + 2001-01-07 Anthony Green + + * java/net/URLConnection.java (setDoOutput): URLConnection's may + be used for both input and output, so don't clear doInput. + + * java/lang/StringBuffer.java: Fix comments. + + 2001-01-06 Anthony Green + + * java/beans/PropertyDescriptor.java: Fix comment. + * java/io/PushbackReader.java: Fix comment. + * java/io/ObjectStreamClass.java: Fix comment. + * java/io/DataInputStream.java: Fix comment. + * java/io/PipedInputStream.java: Fix comments. + * java/io/PipedReader.java: Fix comments. + * java/sql/DatabaseMetaData.java: Fix comments. + + 2001-01-06 Bryce McKinlay + + * java/io/PipedReader: Synchronize on "lock" instead of this. + + 2001-01-05 Bryce McKinlay + + * java/lang/Thread.java: Update comment. + + * java/io/PipedInputStream: Rewrote to be simpler and more correct. + * java/io/PipedOutputStream: Updated to match new PipedInputStream. + * java/io/PipedReader: New implementation based on new + PipedInputStream. + * java/io/PipedWriter: Updated to match new PipedReader. + + 2001-01-03 Tom Tromey + + * java/awt/ScrollPane.java (setBlockIncrement): Throw error. + (getViewportSize): Insets include scrollbar size. + (doLayout): Finished. + (getScrollPosition): Wrote. + * java/awt/peer/ScrollPanePeer.java (setBlockIncrement): Removed. + + 2001-01-02 Tom Tromey + + * java/awt/ScrollPane.java: Wrote. + * java/awt/peer/ScrollPanePeer.java (setBlockIncrement): New + method. + + * java/awt/Panel.java (Panel()): Fixed. + + * java/awt/Component.java (isShowing): Return false if no peer + exists, and true if component is visible and no parent exists. + (getLocationOnScreen): Wrote. + (getPreferredSize): Removed FIXME comment. + (getMinimumSize): Likewise. + (getAlignmentX, getAlignmentY): Wrote. + (list): Wrote. + (requestFocus): Wrote. + (transferFocus): Wrote. + (findNextFocusComponent): New method. + (hasFocus()): Wrote. + (checkImage): Wrote. + (enableEvents): Call setEventMask on the peer. + + * java/awt/Container.java (list): Use super.list() to print self. + (findNextFocusComponent): New method. + (setLayout): Call invalidate. + (findComponentAt): Wrote. + + 2000-12-30 Bryce McKinlay + + * Makefile.am (libgcj_la_LIBADD): Add $(THREADLIBS). This ensures that + the correct versions of various linuxthreads functions get linked. + * Makefile.in: Rebuilt. + * java/lang/natThread.cc (finalize_native): New static function. Call + _Jv_ThreadDestroyData. + (initialize_native): Register finalizer for "data". + * include/posix-threads.h (_Jv_ThreadInitData): New simpler prototype. + (_Jv_ThreadDestroyData): New prototype. + * include/win32-threads.h: Ditto. + * include/no-threads.h: Ditto. + * posix-threads.cc (_Jv_ThreadInitData): Implement new prototype. + (_Jv_ThreadDestroyData): New function. Free native thread "data" and + move mutex and condition variable destroy code from: + (really_start): ...here. + (_Jv_ThreadStart): Set PTHREAD_CREATE_DETACHED. + * win32-threads.cc (_Jv_ThreadInitData): Implement new prototype. + (_Jv_ThreadDestroyData): Implemented. + * nogc.cc (_Jv_AllocObject): Use "void *" not "ptr_t". + (_Jv_AllocArray): Ditto. + + 2000-12-27 Jeff Sturm + + * java/sql/DriverManager.java (getConnection): Don't set user/password + properties if null. + + 2000-12-27 Warren Levy + + Fix for PR libgcj/1358: + * java/lang/System.java: Update Copyright date properly. + * java/util/Calendar.java: Fix typo in comment. + (set): Set 24-hour clock hour instead of 12-hour clock hour. + * java/util/GregorianCalendar.java (GregorianCalendar): Properly + initialize times. Spec says to set H:M:S values to zero only if + a date is given. + * java/util/TimeZone.java (getDefaultDisplayName): Casts to char + needed for evaluating numbers '0' to '9' in printouts of GMT offsets. + * java/util/natGregorianCalendar.cc (computeTime): Properly handle + timezones and GMT offsets, being careful to account for units of + milliseconds vs. seconds. + + 2000-12-28 Bryce McKinlay + + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Primitive TYPEs can + not be assigned to Object. + + Fix for PR libgcj/1516: + * java/lang/reflect/natMethod.cc (primitives): Remove void entry. + Add boolean entry. + (can_widen): Declared inline. Remove redundant checks for void + arguments and char->short conversion. Add special case for boolean + conversions. + (ffi_type): Declared inline. + (_Jv_CallAnyMethodA): Move unwrapping logic inside isPrimitive() block. + + 2000-12-26 Petter Reinholdtsen + + * java/sql/SQLWarning.java: Fixed typo in comment. + + 2000-12-26 Tom Tromey + + * java/awt/MenuItem.java (paramString): Now protected. + + * java/awt/MenuShortcut.java: Implements Serializable. + + * java/awt/MenuBar.java: Rewrote from scratch. + + * java/awt/MenuComponent.java (removeNotify): Wrote. + Implements Serializable. + + * java/awt/GridBagConstraints.java (GridBagConstraints): New + constructor. + + * java/awt/CheckboxMenuItem.java: Wrote. + + 2000-12-25 Tom Tromey + + * java/awt/MenuContainer.java: Fixed typo. + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added SystemColor.java. + * java/awt/SystemColor.java: New file. + + * java/awt/Color.java (rgba): Now package-private. + + * java/awt/event/InputEvent.java (isAltGraphDown): New method. + + * java/awt/event/ContainerEvent.java (getContainer): Renamed from + getComponent. + + * java/awt/MenuItem.java (addNotify): New method. + (MenuItem(String,MenuShortcut)): New constructor. + (setLabel): Notify peer of change. + (setEnabled): Likewise. + + * java/awt/GridLayout.java (toString): New method. + + * java/awt/FlowLayout.java (LEADING, TRAILING): New constants. + (FlowLayout): Check for LEADING and TRAILING. + (setAlignment): Likewise. + (layoutContainer): Handle component orientation. + + * java/awt/Component.java (orientatin): New field. + (setComponentOrientation): Wrote. + (getComponentOrientation): Wrote. + + * java/awt/Event.java (Event): Implements Serializable. + (consumed): New field for serialization. + * java/awt/Dimension.java (Dimension): Implements Serializable. + * java/awt/Cursor.java (Cursor): Implements Serializable. + * java/awt/Container.java (Container): No longer abstract. + + * java/awt/Choice.java: Wrote. + * java/awt/Checkbox.java: Wrote. + * java/awt/ItemSelectable.java: Documented. + * java/awt/CheckboxGroup.java: Wrote. + + * java/awt/CardLayout.java (layoutContainer): Directly use fields + in other classes. + (getSize): Likewise. + + 2000-12-24 Jeff Sturm + + * java/io/FileDescriptor.java: Initialize fd to -1. + Remove default constructor. + + 2000-12-23 Joseph S. Myers + + * java/lang/mprec.h: Change C9X reference to refer to C99. + + 2000-12-22 Bryce McKinlay + + * java/lang/Throwable.java (trace_enabled): New static field. + * java/lang/natThrowable.cc (fillInStackTrace): Do nothing if + trace_enabled not set. + * prims.cc (main_init): Turn off trace_enabled while creating + default exception objects. + + 2000-12-21 Tom Tromey + + * java/beans/PropertyChangeListener.java: Extends EventListener. + * java/beans/VetoableChangeListener.java: Extends EventListener. + + * java/util/zip/Deflater.java (update, init): Now private. + + 2000-12-21 Bryce McKinlay + + * java/util/BasicMapEntry.java: Re-added. + * java/util/HashMap.java (Entry): Extend BasicMapEntry. + (putAll): Test for BasicMapEntry. + * java/util/Hashtable.java (Entry): Extend BasicMapEntry. + (putAll): Test for BasicMapEntry. + Change references from `HashMap.Entry' to `Entry' in various places. + * Makefile.am: Add BasicMapEntry.java. + * Makefile.in: Rebuilt. + + 2000-12-18 Warren Levy + + * java/util/GregorianCalendar.java (GregorianCalendar): Constructors + need to set timezone to a valid non-null value. Partial fix for + PR 331. + + 2000-12-18 Bryce McKinlay + + * java/awt/Window.java (addNotify): Remove peer casting hack now that + gcj/312 is fixed. + * java/awt/Button.java (addNotify): Likewise. + * java/awt/Label.java (addNotify): Likewise. + * java/awt/Panel.java (addNotify): Likewise. + * java/awt/Scrollbar.java (addNotify): Likewise. + * java/awt/Component.java (processPaintEvent): Use peer not getPeer. + Remove redundant null checks. + + 2000-12-18 Joseph S. Myers + + * COPYING: Update to current + ftp://ftp.gnu.org/pub/gnu/Licenses/COPYING-2.0 (fixes references + to 19yy as example year in copyright notice). + + 2000-12-18 Bryce McKinlay + + * java/util/zip/natInflater.cc (inflate): Treat Z_BUF_ERROR as + end-of-stream if avail_in is 0. + + 2000-12-17 Bryce McKinlay + + * java/util/ArrayList.java (data): Declare transient. + (serialPersistantFields): Removed. + (readObject): Use defaultReadObject(), not readFields(). + (writeObject): Use defaultWriteObject(), not writeFields(). + + 2000-12-17 Jeff Sturm + + * java/util/Hashtable.java (put): Remove `last' variable. + Link new entry to head of list. + * java/util/HashMap.java (put): Ditto. + + 2000-12-15 Tom Tromey + + * java/util/ResourceBundle.java (trySomeGetBundle): Pass class + loader to Class.forName. + + 2000-12-14 Tom Tromey + + * java/util/ResourceBundle.java + (getBundle(String,Locale,ClassLoader)): New method. + (trySomeGetBundle): Added `loader' argument. + (partialGetBundle): Likewise. + + * java/text/NumberFormat.java (groupingUsed, parseIntegerOnly, + maximumFractionDigits, maximumIntegerDigits, + minimumFractionDigits, minimumIntegerDigits): Now + package-private. + + * java/lang/Thread.java (checkAccess): Now final. + + * java/lang/RuntimePermission.java: Class now final. + + * java/io/StringWriter.java (StringWriter(int)): Now public. + + * java/io/SerializablePermission.java (legal_names): Now private. + + * java/lang/Character.java: Updated UnicodeBlock constants. + * scripts/blocks.pl: Special case private use and surrogate + areas. Updated URL. + + 2000-12-12 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (GCJ_WITH_FLAGS): New macro, includes --encoding + option. + (GCJCOMPILE): Use it. + (JAVAC): Likewise. + + 2000-12-11 Tom Tromey + + * gnu/gcj/runtime/FirstThread.java (Kcert, Kfile, Khttp, Kjar): + New static final fields. + + * scripts/classes.pl (scan): Skip lines with leading `*'. + Fix for PR libgcj/378. + + 2000-12-11 Bryce McKinlay + + * configure.in: Remove check for -fuse-divide-subroutine. + * configure: Rebuilt. + + * java/util/Hashtable.java (Enumerator.nextElement): Initialize `e'. + + * gcj/javaprims.h: Rebuilt CNI namespace declarations. + + 2000-12-11 Bryce McKinlay + + * Makefile.am: Add HashSet.java and java/lang/ref classes. + Remove BasicMapEntry.java and Bucket.java. + * Makefile.in: Rebuilt. + * java/util/HashMap.java: Rewritten. + * java/util/HashSet.java: Imported from classpath. + * java/util/WeakHashMap.java: Imported from classpath. + * java/util/Hashtable.java: Rewritten based on new HashMap code. + * java/util/Bucket.java: Deleted. + * java/util/BasicMapEntry.java: Deleted. + * java/util/Collections.java (search): Use a for-loop, not iterator + hasNext(). + (copy): Use a for-loop. Throw an IndexOutOfBoundsException if run out + of elements in source. + (max): Use a for-loop. + (min): Ditto. + (reverse): Keep track of positions instead of using Iterator's + nextIndex() and previousIndex(). + (shuffle(List)): Initialize defaultRandom if required using + double-check thread safety idiom. Call two-argument shuffle method + using defaultRandom. + (defaultRandom): New field. + (shuffle(List, Random)): Use a for-loop. Keep track of pos instead of + using previousIndex() and nextIndex(). + (singletonMap(iterator)): Use a HashMap.Entry, not BasicMapEntry. + * java/util/AbstractCollection.java (toString): Use a StringBuffer. + * java/util/AbstractMap.java (toString): Use StringBuffer. + * java/lang/ref/PhantomReference.java: Imported from classpath. + * java/lang/ref/SoftReference.java: Ditto. + * java/lang/ref/Reference.java: Ditto. + * java/lang/ref/WeakReference.java: Ditto. + * java/lang/ref/ReferenceQueue.java: Ditto. + + 2000-12-10 Richard Henderson + + * configure.host: Recognize alpha*-*, not alphaev6-*. + + 2000-12-09 Anthony Green + + * configure.host: Enable interpreter for Alpha. + + 2000-12-09 Alexandre Petit-Bianco + + * Makefile.am (data_DATA): libgcj.jar replaces libgcj.zip. + (ZIP): Points at fastjar instead of zip. + (libgcj_la_DEPENDENCIES): libgcj.jar replaces libgcj.zip. + (libgcj_la_LDFLAGS): Correctly point at libsupc++. + (libgcjx_la_DEPENDENCIES): libgcj.jar replaces libgcj.zip. + (libgcjx_la_LDFLAGS): Correctly point at libsupc++. + ($(java_source_files:.java=.class):): libgcj.jar replaces libgcj.zip. + ($(x_java_source_files:.java=.class):): Likewise. + (libgcj.jar:): Replaces libgcj.zip:, builds libgcj.jar and uses + fastar's flags. + (CLEANFILES): libgcj.jar replaces libgcj.zip. + (java/lang/ClassLoader.h:): Depends on libgcj.jar. + (gnu/gcj/runtime/FirstThread.h:, java/lang/Thread.h:, + java/lang/String.h:, java/lang/reflect/Constructor.h:, + java/lang/reflect/Field.h:, java/lang/reflect/Method.h:, + gnu/gcj/runtime/VMClassLoader.h:, + java/io/ObjectInputStream$$GetField.h:, + java/io/ObjectOutputStream$$PutField.h:, header-check:): Likewise. + (Makefile.in): Rebuilt. + + 2000-12-08 Tom Tromey + + From Phil Edwards: + * configure: Rebuilt. + * configure.in: Use echo, not `:', to create .d files. + + 2000-12-08 Warren Levy + + * java/lang/StringBuffer.java (insert(int,char[])): Avoid + NullPointerException so proper check of offset can be done. + + 2000-12-08 Warren Levy + + * java/io/FileInputStream.java (close): Check if the fd is valid. + * java/io/RandomAccessFile.java (close): Ditto. + * java/net/PlainDatagramSocketImpl.java (close): Ditto. + * java/net/PlainSocketImpl.java (close): Ditto. + + 2000-12-06 Tom Tromey + + * java/awt/GridBagConstraints.java: Filled in values for static + final fields. + + * java/util/BitSet.java: Updated copyright notice. + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new file. + * java/awt/GridBagConstraints.java: New file. + + 2000-12-05 Tom Tromey + + * java/text/Collator.java (decomposeCharacter, decmp, strength): + Now package-private, not protected. + * java/text/DateFormatSymbols.java (equals): Now private. + * java/text/DecimalFormatSymbols.java (safeGetChar): Now private. + * java/util/BitSet.java: Class no longer final. + + 2000-12-04 Warren Levy + + * java/util/TimeZone.java (getAvailableIDs): Activated commented + out code dependent on compiler and library changes. + + 2000-12-04 Warren Levy + + * java/io/FilePermission.java: Made class final per spec. + * java/text/DecimalFormatSymbols.java (setCurrencySymbol): Changed + method name to match spec (fixed typo). + * java/util/LinkedList.java: Implements List. + + 2000-12-04 Bryce McKinlay + + * java/lang/natDouble.cc: Include fdlibm.h, not mprec.h. From + Edgar Villanueva . + + 2000-12-03 Tom Tromey + + * java/awt/geom/Point2D.java: Added protected constructor. + (equals): New method. + (Float.setLocation(float,float)): New method. + * java/awt/geom/Dimension2D.java: Added protected constructor. + * java/awt/geom/AffineTransform.java: Made all constants public. + (concatenate): Fixed typo in name. + * java/awt/event/WindowAdapter.java: Class now abstract. + * java/awt/event/KeyEvent.java (CHAR_UNDEFINED): Now final. + * java/awt/event/FocusEvent.java: Extend ComponentEvent, not + AWTEvent. + + * java/awt/AWTError.java: Extend Error, not + IllegalStateException. + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new file. + * java/awt/geom/RoundRectangle2D.java: New file. + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new file. + * java/awt/FlowLayout.java: New file. + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new file. + * java/awt/GridLayout.java: New file. + + 2000-12-02 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new files. + * java/awt/CardLayout.java: New file. + * java/awt/AWTPermission.java: New file. + + 2000-12-01 Tom Tromey + + * java/util/Vector.java (insertElementAt): Unconditionally + increment elementCount. + (removeRange): Clear unused slots in vector. + + 2000-12-02 Bryce McKinlay + + * java/lang/natMath.cc: Declare fabsf() function. + * java/lang/mprec.h: Don't include math.h. + * java/lang/dtoa.c: Include string.h. + * java/lang/natString.cc (toLowerCase): Initialize `ch' to prevent + compiler warning. + + From Adam Welc : + * java/util/LinkedList.java (removeFirst): Update `first' field. + Handle the last == first case. + (removeLast): Update `last' field. Handle the last == first case. + + 2000-12-01 Warren Levy + + * Makefile.am: Added entries for new java.sql modules. + * Makefile.in: Rebuilt. + + 2000-12-01 Warren Levy + + * mauve-libgcj: Turned on JDK1.2 and turned off tests for classes + that aren't quite 1.2 compatible yet. + + 2000-11-30 Warren Levy + + * java/sql/Array.java: New file from classpath. + * java/sql/BatchUpdateException.java: Ditto. + * java/sql/Blob.java: Ditto. + * java/sql/Clob.java: Ditto. + * java/sql/Ref.java: Ditto. + * java/sql/SQLData.java: Ditto. + * java/sql/SQLInput.java: Ditto. + * java/sql/SQLOutput.java: Ditto. + * java/sql/Struct.java: Ditto. + * java/sql/CallableStatement.java: Merged file from claspath. + * java/sql/Connection.java: Ditto. + * java/sql/DataTruncation.java: Ditto. + * java/sql/DatabaseMetaData.java: Ditto. + * java/sql/DriverManager.java: Ditto. + * java/sql/PreparedStatement.java: Ditto. + * java/sql/ResultSet.java: Ditto. + * java/sql/ResultSetMetaData.java: Ditto. + * java/sql/SQLException.java: Ditto. + * java/sql/SQLWarning.java: Ditto. + * java/sql/Statement.java: Ditto. + * java/sql/Types.java: Ditto. + + 2000-11-29 Bryce McKinlay + + * java/lang/natSystem.cc (init_properties): Set user.language and + user.region. + * configure.in: Check for setlocale. + * configure: Rebuilt. + * include/config.h.in: Rebuilt. + + * java/util/zip/InflaterInputStream (read): Don't return -1 unless + the infate() call didn't deliver any output. Throw a ZipException if + the needsDictionary() call returns true. + * java/io/ByteArrayInputStream (read): Remove redundant bounds checks. + * java/io/InputStreamReader: Use the default buffer size for the + contained BufferedInputStream. + + 2000-11-28 Warren Levy + + * java/text/DateFormatSymbols.java (zoneStringsDefault): Added + more time zone entries. + * java/text/SimpleDateFormat.java (format): Added case for + TIMEZONE_FIELD. + + 2000-11-28 Bryce McKinlay + + * java/io/DataInputStream.java: Merge classpath docs. Call in.read() + directly rather than read() in all cases. Make primitive read + implementations more efficient, as defined in JDK online docs. + (skipBytes): Behave like the JDK's implementation. + * java/io/BufferedReader.java: Merge classpath docs. Check for a + closed stream with checkStatus() whenever an IOException can be + thrown. + (checkStatus): New private method. + + 2000-11-27 Warren Levy + + * Makefile.am: Added natTimeZone.cc. + * Makefile.in: Rebuilt. + * gnu/gcj/text/LocaleData_en.java: Added DateFormat entries. + * java/text/DateFormatSymbols.java (ampms): Made package private. + (eras): Made package private. + (months): Made package private. + (shortMonths): Made package private. + (shortWeekdays): Made package private. + (weekdays): Made package private. + (formatPrefixes): New private field. + (localPatternCharsDefault): Made private. + (dateFormats): New package private field. + (timeFormats): New package private field. + (formatsForKey): New private method. + (DateFormatSymbols(Locale)): Set dateFormats and timeFormats. + (DateFormatSymbols(DateFormatSymbols)): Ditto. + * java/text/SimpleDateFormat.java: Merged with Classpath. + * java/util/TimeZone.java: Merged with Classpath. + * java/util/natTimeZone.cc: New file. + + 2000-11-27 Bryce McKinlay + + * java/util/Vector.java (ensureCapacity): Don't increment modCount. + (addElement): Don't increment elementCount twice. Doh. + * java/util/ArrayList.java (add): Only call ensureCapacity if the + array needs to be expanded. + (addAll): Ditto. + * java/util/Collections.java (UnmodifiableCollection): Implement + toString(). + (UnmodifiableList): Throw UnsupportedOperationException from + modification methods. Set `l' from the one-parameter constructor. + (UnmodifiableMap): Implement toString(). + (SynchronizedCollection): Ditto. + (SynchronizedList): Set `l' from the one-parameter constructor. + (SynchronizedSortedSet): Set `ss' from the one-parameter constructor. + (SynchronizedMap): Implement toString(). + + Sun Nov 26 23:59:55 2000 Anthony Green + + * javax/naming/NameParser.java, + javax/naming/directory/AttributeInUseException.java, + javax/naming/directory/AttributeModificationException.java, + javax/naming/directory/InvalidAttributeIdentifierException.java, + javax/naming/directory/InvalidAttributesException.java, + javax/naming/directory/InvalidAttributeValueException.java, + javax/naming/directory/InvalidSearchControlsException.java, + javax/naming/directory/InvalidSearchFilterException.java, + javax/naming/directory/NoSuchAttributeException.java, + javax/naming/directory/SchemaViolationException.java: New files. + + Sun Nov 26 22:35:53 2000 Anthony Green + + * javax/naming/InitialContext.java (rebind): Implement. + (unbind): Implement. + (rename): Implement. + (list): Implement. + (listBindings): Implement. + (destroySubcontext): Implement. + (createSubcontext): Implement. + (lookupLink): Implement. + (getNameParser): Implement. + (composeName): Implement. + (addToEnvironment): Implement. + + Sun Nov 26 21:30:25 2000 Anthony Green + + * javax/naming/AuthenticationException.java, + javax/naming/AuthenticationNotSupportedException.java, + javax/naming/CannotProceedException.java, + javax/naming/CommunicationException.java, + javax/naming/ConfigurationException.java, + javax/naming/ContextNotEmptyException.java, + javax/naming/InsufficientResourcesException.java, + javax/naming/InterruptedNamingException.java, + javax/naming/InvalidNameException.java, + javax/naming/LimitExceededException.java, + javax/naming/LinkException.java, + javax/naming/LinkLoopException.java, + javax/naming/MalformedLinkException.java, + javax/naming/NameAlreadyBoundException.java, + javax/naming/NameNotFoundException.java, + javax/naming/NamingSecurityException.java, + javax/naming/NoPermissionException.java, + javax/naming/NotContextException.java, + javax/naming/PartialResultException.java, + javax/naming/ReferralException.java, + javax/naming/ServiceUnavailableException.java, + javax/naming/SizeLimitExceededException.java, + javax/naming/TimeLimitExceededException.java: New files. + + * javax/naming/Name.java (clone): New method. + (compareTo): New method. + (isEmpty): New method. + (getAll): New method. + (getPrefix): New method. + (getSuffix): New method. + (startsWith): New method. + (endsWith): New method. + (addAll): New method. + (addAll): New method. + (add): New method. + (add): New method. + (remove): New method. + + * javax/naming/Context.java (lookup): New method. + (rebind): New method. + (unbind): New method. + (rename): New method. + (list): New method. + (listBindings): New method. + (destroySubcontext): New method. + (createSubcontext): New method. + (lookupLink): New method. + (getNameParser): New method. + (composeName): New method. + (addToEnvironment): New method. + (removeFromEnvironment): New method. + (getEnvironment): New method. + (close): New method. + (getNameInNamespace): New method. + + * javax/naming/InitialContext.java (lookup): New method. + (rebind): New method. + (unbind): New method. + (rename): New method. + (list): New method. + (listBindings): New method. + (destroySubcontext): New method. + (createSubcontext): New method. + (lookupLink): New method. + (getNameParser): New method. + (composeName): New method. + (addToEnvironment): New method. + (removeFromEnvironment): New method. + (getEnvironment): New method. + (close): New method. + (getNameInNamespace): New method. + + 2000-11-26 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added + RuntimePermission.java. + * java/lang/RuntimePermission.java: Imported from Classpath. + * java/lang/Thread.java (getContextClassLoader): Now + synchronized. Added security code. + (setContextClassLoader): Likewise. + + * prims.cc (_Jv_NewObjectArray): Use const_cast to initialize + length field of array. + (_Jv_NewPrimArray): Likewise. + * gcj/array.h (__JArray): `length' field now const. Added + constructor. + + 2000-11-26 Anthony Green + + * javax/naming/spi/NamingManager.java, + javax/naming/spi/ObjectFactory.java, + javax/naming/spi/InitialContextFactory.java, + javax/naming/spi/InitialContextFactoryBuilder.java, + javax/naming/RefAddr.java, javax/naming/Reference.java, + javax/naming/NamingException.java, javax/naming/Context.java, + javax/naming/Referenceable.java, + javax/naming/directory/InitialDirContext.java, + javax/naming/directory/DirContext.java, + javax/naming/directory/Attributes.java, + javax/naming/directory/Attribute.java, + javax/naming/StringRefAddr.java, + javax/naming/NamingEnumeration.java, javax/naming/Name.java, + javax/naming/InitialContext.java, + javax/naming/NoInitialContextException.java: New files. + + 2000-11-25 Anthony Green + + * prims.cc (_Jv_NewObjectArray): Undo placement change. + (_Jv_NewPrimArray): Likewise. + * gcj/array.h (__JArray): Undo const change. Removed constructor. + (class JArray): Removed constructor. + + * java/lang/Thread.java (context_class_loader): New private data. + (getContextClassLoader): New method. + (setContextClassLoader): New method. + (Thread): Initialize context_class_loader. + + * java/net/URLClassLoader.java: Import java.util.Enumeration. + (getResource): Rename to findResource. + (findResource): New method. Used to be getResource. + (getResourceAsStream): Deleted. + (jarFileize): Extracted logic from URLClassLoader constructor into + this new private method. + (addURL): New protected method. + (URLClassLoader): Call jarFileize. Use addElement instead of + insertElementAt. + (findResources): New method. + + * java/lang/ClassLoader.java: Import java.util.Enumeration. + (getResource): Implement correct logic. + (findResource): New method. + (getResources): New method. + (findClass): Create a ClassNotFoundException with the name of the + class rather than nothing at all. + (defineClass) Only throw ClassFormatError. + + * java/lang/Class.java (forName): New method. + * java/lang/Class.h (forName): New method. + * java/lang/natClass.cc (forName): New method. + + 2000-11-24 Bryce McKinlay + + * java/lang/System.java (setProperties): Only call init_properties() + if properties is null. + (getProperties): Ditto. + (getProperty): Ditto. + (setProperty): Call init_properties if properties are null. + (prop_init): Remove field. + * java/lang/natSystem.cc (init_properties): Synchronize the entire + method. Check for null properties after synchronizing instead of + prop_init flag. Set the properties field last for thread safety. + + * java/io/ObjectInputStream.java (ObjectInputStream): If DEBUG is set, + test for gcj.dumpobjects property and enable object stream dumping + if it is set. + (dumpElement): No longer native. + (dumpElementln): Ditto. + (setDump): Do not define. + * java/io/natObjectInputStream.cc (dumpElement): Removed. + (dumpElementln): Removed. + (setDump): Removed. + + 2000-11-24 Bryce McKinlay + + * configure: Rebuilt. + * Makefile.in: Rebuilt. + * Makefile.am (built_java_source_files): Add Configuration.java. + * configure.in: Add Configuration.java to CONFIG_FILES. Set + LIBGCJDEBUG substitution if --enable-libgcj-debug is specified. + Create `gnu' directory in the build tree. + * gnu/classpath/Configuration.java.in: New file. + + 2000-11-24 Tom Tromey + + * prims.cc (_Jv_NewObjectArray): Use placement new to create + array. + (_Jv_NewPrimArray): Likewise. + Include . + * gcj/array.h (__JArray): `length' field now const. Added + constructor. + (class JArray): Added constructor. + + 2000-11-23 Mark Wielaard + + * name-finder.cc (lookup): Check for a NULL _Jv_argv before attempting + lookup. + + 2000-11-23 Bryce McKinlay + + * java/util/Vector.java: Improve exception messages. + (Vector): Check initialCapacity for IllegalArgumentException. + (tromToSize): Don't check for elementCount == elementData.length + case. + (toArray): Don't try to set null marker if target array is the same + length as the vector. + + 2000-11-22 Bryce McKinlay + + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added Collections.java. + * java/util/List.java: Merged from classpath. + * java/util/Vector.java: Ditto. + * java/util/Collections.java: From classpath. + * java/util/ArrayList.java (addAll(Collection)): Call + addAll(int,Collection) instead of duplicating code. + (indexOf): Clean up int initialization. + (clear): Set cleared array entries to null, to allow garbage + collection. + * java/util/List.java: Minor formatting fixes. + * java/util/SimpleTimeZone.java: ditto. + + 2000-11-18 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (core_java_source_files): Added new files. + * java/lang/reflect/ReflectPermission.java: New class. + * java/io/FileFilter.java: From Classpath + * java/io/FilePermission.java: From Classpath. + + 2000-11-17 Tom Tromey + + * java/lang/reflect/AccessibleObject.java (isAccessible, + setAccessible): Now public. + + * java/lang/natString.cc: Include Locale.h. + (toUpperCase): Added `locale' argument. Handle locale + sensitivity. + (toLowerCase): Added `locale' argument. Handle locale + sensitivity. + (ESSET, CAPITAL_S, SMALL_I, CAPITAL_I_WITH_DOT, SMALL_DOTLESS_I, + CAPITAL_I): New defines. + * java/lang/String.java (CASE_INSENSITIVE_ORDER): Now public and + final. + Import Locale. + (toUpperCase, toLowerCase): New methods. Variants which accept + locale now native. + + * java/lang/ExceptionInInitializerError.java (printStackTrace): + New methods. + + * java/util/PropertyPermission.java: Re-merged from Classpath. + + * java/text/RuleBasedCollator.java (getCollationElementIterator): + New method. + * java/text/StringCharacterIterator.java: Reindented. + (setText): New method. + + 2000-11-17 Mark Wielaard + + Merge with Classpath (changes by Bryce McKinlay) + * java/util/jar/*.java: Reformat all to unofficial standard coding + style. No changes of substance. + + 2000-11-17 Mark Wielaard + + * java/util/zip/*.java: Javadoc updates. + + 2000-11-17 Tom Tromey + + * java/text/CollationKey.java: Implement Comparable. + (compareTo(Object)): New method. + * java/text/Collator.java (compare(Object,Object)): New method. + Implement Comparator. + + * java/util/zip/InflaterInputStream.java (available): New method. + (close): New method. + (read, available, skip, fill): Throw exception if stream closed. + * java/util/zip/ZipInputStream.java (read, skip, readFully, fill, + getNextEntry): Throw exception if closed. + + 2000-11-16 Tom Tromey + + * java/io/PushbackReader.java: Merged with Classpath. + * java/util/Arrays.java: Updated from Classpath. + + * scripts/blocks.pl: New file. + * java/lang/Character.java (Subset): New class. + (UnicodeBlock): New class. + + * java/lang/Math.java (toDegrees, toRadians): New methods. + + * java/lang/Float.java: Implement Comparable. + (compareTo): New methods. + * java/lang/Double.java: Implement Comparable. + (compareTo): New methods. + + 2000-11-16 Warren Levy + + * java/beans/PropertyChangeSupport.java (propertyListeners): Made + transient. + (listeners): Made transient. + (source): Renamed from 'bean'. + (children): New field for serialization. + (propertyChangeSupportSerializedDataVersion): Ditto. + (serialVersionUID): Ditto. + (writeObject): New serialization method. + (readObject): New serialization method. + * java/beans/VetoableChangeSupport.java (propertyListeners): Made + transient. + (listeners): Made transient. + (source): Renamed from 'bean'. + (children): New field for serialization. + (vetoableChangeSupportSerializedDataVersion): Ditto. + (serialVersionUID): Ditto. + (writeObject): New serialization method. + (readObject): New serialization method. + * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Fixed assert + to allow constructor to have a return type (i.e. the class that the + constructor constructs). + + 2000-11-14 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (libgcj.zip): Fail immediately if compilation fails + and -k not given. + + 2000-11-02 Warren Levy + + * java/io/ObjectInputStream.java (readObject): Added code to + conditionally dump out the serialized data. + Handle ENDBLOCKDATA case a bit more gracefully since the current + behavior doesn't seem to work as expected. + (readStreamHeader): Added code for serialized data dumper. + (readNextBlock): Ditto. + (readFields): Ditto. + (dump): New private static field for turning on/off dumper. + (setDump): New native method. + (dumpElement): New native method. + (dumpElementln): New native method. + * java/io/natObjectInputStream.cc (setDump): New method. + (dumpElement): New method. + (dumpElementln): New method. + + 2000-11-02 Warren Levy + + * java/net/InetAddress.java (addr): Renamed from 'address'. + (address): New field to match Serialized Form doc. + (hostName): Renamed from 'hostname' to match Serialized Form doc. + (family): New serialization field. + (serialVersionUID): New field. + (readObject): New method. + (writeObject): New method. + (getFamily): New native method. + (InetAddress): Set family. + * java/net/natInetAddress.cc (getFamily): New method. + (addr): Renamed from 'address'. + (hostName): Renamed from 'hostname' to match Serialized Form doc. + * java/net/natPlainDatagramSocketImpl.cc (addr): Renamed from 'address'. + * java/net/natPlainSocketImpl.cc (addr): Renamed from 'address'. + + 2000-11-03 Bryce McKinlay + + * java/util/AbstractList.java (SubList): Make it a top-level private + class. + * java/util/LinkedList.java (remove): Do update modCount and knownMod. + (add): Ditto. + * Makefile.am (ordinary_java_source_files): Add LinkedList.java. + * Makefile.in: Rebuilt. + + 2000-11-02 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (install-exec-hook): Make `.la' link, not `.so' + link. + + 2000-11-02 Bryce McKinlay + + * java/util/AbstractList.java (remove): Comment out modCount increment + to work around compiler bug. + (add): Ditto. + + 2000-11-02 Bryce McKinlay + + * java/util/AbstractList.java: Throw messages with + IndexOutOfBoundsExceptions. + (listIterator()): Call listIterator(0). + (size): New field. Initialize to size(). + (hasNext): Test position against size, not size(). + (remove): Increment knownMod by one instead of resetting it from + modCount. + (add): Ditto. + (SubList.upMod): Removed. + (SubList.set): Don't call upMod() or update knownMod. + (SubList.add(int,Object)): Increment modCount instead of caling upMod(). + (SubList.remove): Ditto. + (SubList.addAll): Don't call backingList.size(). Increment size from + c.size(). + (SubList.iterator): New method. Call listIterator(0). + (SubList.listIterator): New method. Restore code to return an anonymous + listIterator implementation (with some changes). + * java/util/AbstractSequentialList.java: Throw messages with + IndexOutOfBoundsExceptions. + (addAll): Add a specnote. + * java/util/ArrayList.java (removeRange): Get the math right. + (addAll): Increment modCount _before_ creating iterator. + * java/util/LinkedList.java: Rewritten, mostly. + + 2000-11-01 Tom Tromey + + * scripts/encodings.pl: Added `ASCII' alias. + * Makefile.in: Rebuilt. + * Makefile.am (convert_source_files): Added new files. + * gnu/gcj/convert/Input_ASCII.java: New file. + * gnu/gcj/convert/Output_ASCII.java: New file. + * gnu/gcj/convert/Output_8859_1.java (write): Use `?' to represent + out-of-range characters. + * gnu/gcj/convert/natIconv.cc (iconv_init): New method. + (read): Swap bytes if required. Treat `count' as character count, + not byte count. + (write): Likewise. Also, handle case where iconv fails on a given + character. + (init): Put encoding into exception. + * gnu/gcj/convert/IOConverter.java (iconv_byte_swap): New global. + (static): Call iconv_init. Rebuilt alias list. + (iconv_init): New private method. + + 2000-11-01 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (install-exec-hook): Only make a single symlink, and + remove the destination before making the link. + * configure: Rebuilt. + * configure.in: Call AC_PROG_LN_S. + + 2000-10-31 Warren Levy + + * jni.cc: Added include of java/lang/ThreadGroup.h. + * gcj/javaprims.h: Removed Replaceable and Resolvable from namespace + per change of 2000-10-05. + + 2000-10-30 Bryce McKinlay + + * java/util/BitSet.java: Updated @specnote. + + * java/io/Reader.java: Merge docs from classpath. + (skip): Synchronize on `lock'. + * java/io/FileReader.java: Import correct implementation from + classpath. + * java/io/StringReader.java: Merge docs from classpath. + (ready): Throw IOException if stream is closed. + + 2000-10-29 Bryce McKinlay + + * java/util/AbstractCollection.java (addAll): Use size() instead of + hasNext() in iterator loop. + (clear): Ditto. + (contains): Ditto. Simplify loop. + (containsAll): Ditto. + (remove): Ditto. + (removeAll): Ditto. + (retainAll): Ditto. + (toArray): Ditto. + (toString): Ditto. Use string concatenation operators, not + StringBuffer. + * java/util/AbstractList.java (addAll): Use size() instead of + hasNext() in iterator loop. + (equals): Ditto. + (hashCode): Ditto. + (indexOf): Ditto. Don't take null check outside of the loop. + (iterator): Return an AbstractListItr instead of anonymous class. + (lastIndexOf): Use a for loop bounded by size() instead of + hasPrevious() in iterator loop. + (listIterator): Return an AbstractListItr. + (removeRange): Remove bounds checking code and docs. + (AbstractListItr): New inner class. Code moved here from + listIterator(). + (SubList.iterator): Removed. Use default implementation from + AbstractList instead. + (SubList.listIterator): As above. + * java/util/AbstractMap.java (clear): Use a for loop bounded by size() + instead of hasNext() in iterator loop. + (containsValue): Ditto. + (equals): Ditto. + (get): Ditto. + (put): Ditto. + (putAll): Ditto. + (remove): Ditto. + (toString): Ditto. Use string concatenation operators, not + StringBuffer. + * java/util/AbstractSequentialList.java (addAll): Use a for loop + bounded by size() instead of hasNext() in iterator loop. + * java/util/AbstractSet.java (hashCode): Don't catch exception as + part of normal execution flow. Do an explicit null check instead. + * java/util/ArrayList.java (_iSize): Rename to `size'. + (_arData): Rename to `data'. + (get): Check lower bounds also. Simplify IndexOutOfBoundsException + message. + (remove): Ditto. + (removeRange): Make protected. Don't check bounds. + (add): Check lower bounds also. Simplify IndexOutOfBoundsException + message. + (addAll (Collection)): Use a size-bounded for loop instead of hasNext() + check. + (addAll (int, Collection)): Check lower bounds. Simplify exception + string. + (clone): Clone the data array too. + (indexOf): Inline doesEqual(). + (lastIndexOf): Ditto. + (clear): Don't set array data to null. + (set): Check lower bounds. Simplify exception string. + (toArray): Correct comment. + (trimToSize): Don't update modCount, this is not a structural change. + Add comment. + + * java/util/BitSet.java: Merged with classpath, new JDK 1.2 methods + implemented. + (toString): Declare `bit' as long, not int. + (data): Made package-private, not private. + + 2000-10-27 Warren Levy + + * java/util/natGregorianCalendar.cc (computeFields): Set the isSet__ + array elements to true. + + 2000-10-27 Warren Levy + + * Makefile.am: Added locale files from Classpath. + * Makefile.in: Rebuilt. + * gnu/java/locale/Calendar.java: New file. + * gnu/java/locale/Calendar_de.java: New file. + * gnu/java/locale/Calendar_en.java: New file. + * gnu/java/locale/Calendar_nl.java: New file. + * java/lang/ClassNotFoundException.java: Replaced with Classpath file. + * java/math/BigDecimal.java (intVal): Renamed from 'num' for + serialization compatibility. + (scale): Made private. + (serialVersionUID): New field. + * java/math/BigInteger.java (ival): Made transient. + (words): Made transient. + (bitCount): New serialization field. + (bitLength): Ditto. + (firstNonzeroByteNum): Ditto. + (lowestSetBit): Ditto. + (magnitude): Ditto. + (signum): Ditto. + (serialVersionUID): New field. + (readObject): New method. + (writeObject): New method. + * java/util/BitSet.java (serialVersionUID): New field. + * java/util/Calendar.java: Replaced with Classpath file. + * java/util/GregorianCalendar.java (GregorianCalendar): Pass result + of getDefault() for TimeZone or Locale instead of passing nulls. + * java/util/Locale.java (serialVersionUID): New field. + (writeObject): New method. + (readObject): New method. + * java/util/SimpleTimeZone.java: Replaced with Classpath file. + + 2000-10-25 Bryce McKinlay + + * Makefile.am (GCJCOMPILE): Pass --tag=GCJ to libtool. + (core_java_source_files): Put java.lang, java.io, and java.util here. + (ordinary_java_source_files): Order so that core_java_source_files are + built first. + (java_source_files): Reorder so that special_java_source_files are + built first. + * configure.in: Don't pass -I flag to gcj. + * Makefile.in: Rebuilt. + * configure: Rebuilt. + + 2000-10-25 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (install-exec-hook): New target. + + 2000-10-24 Bryce McKinlay + + * java/util/EventObject.java: Merged from classpath. + + * java/lang/ThreadGroup.java (uncaughtException): Print thread name + with stack dump. + + 2000-10-23 Alexandre Petit-Bianco + + * java/util/AbstractSet.java (equals): Re-installed original code. + + 2000-10-22 Rolf W. Rasmussen + + * Makefile.am: Added rules for libgcjx library. + * Makefile.in: Rebuilt. + * configure.in: Added check for X. + * configure: Rebuilt. + * gnu/awt/LightweightRedirector.java: New file. + * gnu/awt/j2d/AbstractGraphicsState.java: New file. + * gnu/awt/j2d/DirectRasterGraphics.java: New file. + * gnu/awt/j2d/Graphics2DImpl.java: New file. + * gnu/awt/j2d/IntegerGraphicsState.java: New file. + * gnu/awt/j2d/MappedRaster.java: New file. + * gnu/awt/xlib/XCanvasPeer.java: New file. + * gnu/awt/xlib/XEventLoop.java: New file. + * gnu/awt/xlib/XEventQueue.java: New file. + * gnu/awt/xlib/XFontMetrics.java: New file. + * gnu/awt/xlib/XFramePeer.java: New file. + * gnu/awt/xlib/XGraphics.java: New file. + * gnu/awt/xlib/XGraphicsConfiguration.java: New file. + * gnu/awt/xlib/XPanelPeer.java: New file. + * gnu/awt/xlib/XToolkit.java: New file. + * gnu/gcj/xlib/Clip.java: New file. + * gnu/gcj/xlib/Colormap.java: New file. + * gnu/gcj/xlib/Display.java: New file. + * gnu/gcj/xlib/Drawable.java: New file. + * gnu/gcj/xlib/Font.java: New file. + * gnu/gcj/xlib/GC.java: New file. + * gnu/gcj/xlib/Pixmap.java: New file. + * gnu/gcj/xlib/Screen.java: New file. + * gnu/gcj/xlib/Visual.java: New file. + * gnu/gcj/xlib/WMSizeHints.java: New file. + * gnu/gcj/xlib/Window.java: New file. + * gnu/gcj/xlib/WindowAttributes.java: New file. + * gnu/gcj/xlib/XAnyEvent.java: New file. + * gnu/gcj/xlib/XButtonEvent.java: New file. + * gnu/gcj/xlib/XColor.java: New file. + * gnu/gcj/xlib/XConfigureEvent.java: New file. + * gnu/gcj/xlib/XConnectException.java: New file. + * gnu/gcj/xlib/XEvent.java: New file. + * gnu/gcj/xlib/XException.java: New file. + * gnu/gcj/xlib/XExposeEvent.java: New file. + * gnu/gcj/xlib/XID.java: New file. + * gnu/gcj/xlib/XImage.java: New file. + * gnu/gcj/xlib/XUnmapEvent.java: New file. + * gnu/gcj/xlib/natClip.cc: New file. + * gnu/gcj/xlib/natColormap.cc: New file. + * gnu/gcj/xlib/natDisplay.cc: New file. + * gnu/gcj/xlib/natDrawable.cc: New file. + * gnu/gcj/xlib/natFont.cc: New file. + * gnu/gcj/xlib/natGC.cc: New file. + * gnu/gcj/xlib/natPixmap.cc: New file. + * gnu/gcj/xlib/natScreen.cc: New file. + * gnu/gcj/xlib/natVisual.cc: New file. + * gnu/gcj/xlib/natWMSizeHints.cc: New file. + * gnu/gcj/xlib/natWindow.cc: New file. + * gnu/gcj/xlib/natWindowAttributes.cc: New file. + * gnu/gcj/xlib/natXAnyEvent.cc: New file. + * gnu/gcj/xlib/natXButtonEvent.cc: New file. + * gnu/gcj/xlib/natXColor.cc: New file. + * gnu/gcj/xlib/natXConfigureEvent.cc: New file. + * gnu/gcj/xlib/natXException.cc: New file. + * gnu/gcj/xlib/natXExposeEvent.cc: New file. + * gnu/gcj/xlib/natXImage.cc: New file. + * gnu/gcj/xlib/natXUnmapEvent.cc: New file. + * java/awt/EventDispatchThread.java: Start thead on creation. + + 2000-10-20 Tom Tromey + + From Arno J. Klaassen: + * interpret.cc: Include for alloca. + * defineclass.cc: Include for alloca. + + * Makefile.in: Rebuilt. + * Makefile.am: Include deps.mk. + (GCJCOMPILE): Added -MD, -MT, and -MF. + ($(javao_files)): Don't depend on libgcj.zip. + (all-recursive): New target. + (%.lo:%.cc): Do dependency tracking. + ($(nat_headers)): Don't depend on libgcj.zip. + * configure: Rebuilt. + * configure.in: Make .d files and deps.mk. + + 2000-10-13 Bryce McKinlay + + * exception.cc: Don't #include "exception". + (_Jv_eh_alloc): Call abort (), not terminate (), if malloc fails. + + * Makefile.am (libgcj_la_LDFLAGS): Link in libsupc++. + * Makefile.in: Updated. + + 2000-10-11 Bryce McKinlay + + * java/awt/peer/ChoicePeer.java (addItem): Removed. + * java/awt/peer/ComponentPeer.java (disable): Removed. + (enable): Removed. + (hide): Removed. + (minimumSize): Removed. + (preferredSize): Removed. + (reshape): Removed. + (show): Removed. + * java/awt/peer/ListPeer.java (addItem): Removed. + (clear): Removed. + (minimumSize): Removed. + (preferredSize): Removed. + (setMultipleSelections): Removed. + * java/awt/peer/MenuBarPeer.java (add): Renamed from addMenu. + (remove): Renamed from removeMenu. + * java/awt/peer/MenuItemPeer.java (disable): Removed. + (enable): Removed. + * java/awt/peer/MenuPeer.java (add): Renamed from addItem. + (remove): Renamed from removeItem. + * java/awt/peer/TextAreaPeer.java (insertText): Removed. + (getMinimumSize): Removed. + (getPreferredSize): Removed. + (minimumSize): Removed. + (preferredSize): Removed. + (replaceText): Removed. + * java/awt/peer/TextFieldPeer.java (minimumSize): Removed. + (preferredSize): Removed. + (getMinimumSize): Removed. + (getPreferredSize): Removed. + (setEchoCharacter): Removed. + + 2000-10-10 Warren Levy + + * gnu/gcj/text/LocaleData_en.java (monetarySeparator): Added. + * java/sql/Date.java (serialVersionUID): New field. + * java/sql/Time.java (serialVersionUID): New field. + * java/sql/Timestamp.java (serialVersionUID): New field. + * java/text/ChoiceFormat.java (serialVersionUID): New field. + * java/text/DateFormat.java (getDateTimeInstance (int)): Removed. + * java/text/DateFormatSymbols.java (serialVersionUID): New field. + * java/text/DecimalFormat.java (serialVersionOnStream): New field. + (readObject): New serialization method. + * java/text/DecimalFormatSymbols.java (monetarySeparator): New field. + (serialVersionOnStream): New field. + (readObject): New serialization method. + (getMonetaryDecimalSeparator): New method. + (setMonetaryDecimalSeparator): New method. + * java/text/NumberFormat.java (maxFractionDigits): New field. + (maxIntegerDigits): New field. + (minFractionDigits): New field. + (minIntegerDigits): New field. + (serialVersionOnStream): New field. + (serialVersionUID): New field. + (readObject): New serialization method. + (writeObject): New serialization method. + * java/text/SimpleDateFormat.java (defaultCenturyStart): Initialized. + (serialVersionOnStream): New field. + (serialVersionUID): New field. + (readObject): New serialization method. + + 2000-10-09 Alexandre Oliva + + * configure.in (GCJ): Avoid bogus error message when looking for + (and not finding) gcj in the build tree. + * configure: Rebuilt. + + 2000-10-09 Tom Tromey + + * configure: Rebuilt. + * configure.in: Include sys/types.h when checking for socklen_t. + From Arno J. Klaassen. + + 2000-10-09 Bryce McKinlay + + * include/jvm.h: Enable __builtin_expect(). + + * name-finder.cc (lookup): Don't trust dladdr() if the address is from + the main program. Fix for PR libgcj/341. + + 2000-10-07 Tom Tromey + + * java/util/Properties.java: Merged with Classpath version. + + 2000-10-05 Tom Tromey + + * java/lang/reflect/natField.cc (BooleanClass): Don't define. + * java/lang/reflect/natArray.cc (BooleanClass): Don't define. + * java/lang/Class.h (Object): Added `class$' field. + * java/lang/Object.h (Object): Added `class$' field. + * defineclass.cc (ClassClass): Use `class$' form. + (ClassObject): Likewise. + * resolve.cc (ClassObject): Use `class$' form. + (ObjectClass): Likewise. + * interpret.cc (ClassError): Removed. + * java/net/natPlainDatagramSocketImpl.cc (BooleanClass): Use + `class$' form. + (IntegerClass): Likewise. + * java/net/natPlainSocketImpl.cc (BooleanClass): Use `class$' + form. + * java/lang/natClassLoader.cc (CloneableClass): Use `class$' form. + (ObjectClass, ClassClass, VMClassLoaderClass, ClassLoaderClass, + SerializableClass): Likewise. + Include Serializable.h, Cloneable.h. + * java/lang/natSystem.cc (SystemClass): Removed. + (init_properties): Use `class$' form. + * java/lang/natObject.cc (CloneableClass): Removed. + (clone): Use `class$' form. + * java/lang/natClass.cc (CloneableClass): Use `class$' form. + (ObjectClass, ErrorClass, ClassClass, MethodClass, FieldClass, + ConstructorClass): Likewise. + * java/lang/reflect/natMethod.cc (ObjectClass): Use `class$' form. + (ClassClass, VoidClass, ByteClass, ShortClass, CharacterClass, + IntegerClass, LongClass, FloatClass, DoubleClass): Likewise. + * java/io/natObjectInputStream.cc (ObjectClass): Use `class$' + form. + (ClassClass): Likewise. + * include/jvm.h (StringClass): Use `class$' form. + * prims.cc (ObjectClass): Removed. + (_Jv_RunMain): Use `class$' form. + (_Jv_AllocObject): Likewise. + * jni.cc (ClassClass): Use `class$' form. + (ThrowableClass): Likewise. + (ObjectClass): Likewise. + (MethodClass): Likewise. + (ThreadGroupClass): Likewise. + (NativeThreadClass): Likewise. + * boehm.cc (ObjectClass): Removed. + (ClassClass): Removed. + (_Jv_MarkObj): Use `class$' form. + * gcj/field.h (JvFieldIsRef): Use `class$' form. + Include RawData.h. + + 2000-10-05 Warren Levy + + * Makefile.am: Removed java/io/Replaceable.java and + java/io/Resolvable.java. + * Makefile.in: Rebuilt. + * gcj/javaprims.h: Removed Replaceable and Resolvable from java.io + namespace. + * java/io/ObjectInputStream.java (processResolution): Fixed typo + in method name. + (processResolution): Handle readResolve method via reflection with + removal of Resolvable interface. + * java/io/ObjectOutputStream.java (writeObject): Handle writeReplace + method via reflection with removal of Replaceable interface. + * java/io/Replaceable.java: Removed. + * java/io/Resolvable.java: Removed. + * java/security/Key.java (serialVersionUID): New field. + * java/security/Provider.java (serialVersionUID): New field. + * java/security/interfaces/DSAPrivateKey.java (serialVersionUID): + New field. + * java/security/interfaces/DSAPublicKey.java (serialVersionUID): + New field. + * java/sql/DataTruncation.java (serialVersionUID): New field. + * java/sql/SQLException.java (serialVersionUID): New field. + * java/sql/SQLWarning.java (serialVersionUID): New field. + * java/util/Date.java (serialVersionUID): New field. + (millis): Made transient. + (readObject): New method. + (writeObject): New method. + + 2000-10-05 Tom Tromey + + * gnu/gcj/convert/natIconv.cc (init): Terminate buffer. + + 2000-10-02 Bryce McKinlay + + * prims.cc (_Jv_argv, _Jv_argc): New fields. + (JvRunMain): Set _Jv_argv and _Jv_argc. + * java/awt/Component.java: Minor fixes. + * java/awt/Image.java (UndefinedProperty): Initialize final field. + * java/awt/Toolkit.java (systemEventQueue): Removed. + (getDefaultToolkit): Default to "gnu.awt.gtk.GtkToolkit". + * java/awt/Window.java (getToolkit): Don't call super. + * java/awt/image/BufferedImage.java: Fix definite assignment errors. + * java/awt/peer/ContainerPeer.java (insets): Remove unused method. + * gnu/awt/gtk/GtkComponentPeer.java: New file. + * gnu/awt/gtk/GtkContainerPeer.java: New file. + * gnu/awt/gtk/GtkFramePeer.java: New file. + * gnu/awt/gtk/GtkMainThread.java: New file. + * gnu/awt/gtk/GtkToolkit.java: New file. + * gnu/awt/gtk/GtkWindowPeer.java: New file. + * gnu/awt/gtk/gtkcommon.cc: New file. + * gnu/awt/gtk/gtkcommon.h: New file. + * gnu/awt/gtk/natGtkComponentPeer.cc: New file. + * gnu/awt/gtk/natGtkContainerPeer.cc: New file. + * gnu/awt/gtk/natGtkFramePeer.cc: New file. + * gnu/awt/gtk/natGtkMainThread.cc: New file. + * gnu/awt/gtk/natGtkToolkit.cc: New file. + * gnu/awt/gtk/natGtkWindowPeer.cc: New file. + + 2000-09-30 Tom Tromey + + * posix-threads.cc (_Jv_CondWait): Check to see if we are + interrupted before modifying the cv's wait set. + From Corey Minyard. + + 2000-09-30 Hans Boehm + Bryce McKinlay + + Implement bitmap descriptor based marking for Boehm GC. + + * configure.in: Define JC1GCSPEC. Set it if boehm-gc is used. + * configure: Rebuilt. + * libgcj.spec.in: Pass JC1GCSPEC to jc1. + * include/jvm.h (struct _Jv_VTable): New field `gc_descr'. New inline + method get_finalizer(). + (struct _Jv_ArrayVTable): Ditto. Declare method array with + NUM_OBJECT_METHODS elements instead of NUM_OBJECT_METHODS + 1. + (_Jv_AllocObj): Add new jclass parameter. + (_Jv_AllocArray): Ditto. + (_Jv_BuildGCDescr): New prototype. + * prims.cc (_Jv_AllocObject): Rename parameter `c' to `klass'. Pass + `klass' to _Jv_AllocObj. Don't set the new object's vtable. Use + get_finalizer() instead of direct finalizer vtable offset. + (_Jv_NewObjectArray): Rename parameter `clas' to `klass'. Pass + `klass' to _Jv_AllocArray. Don't set the new array's vtable. + (_Jv_NewPrimArray): Call _Jv_FindArrayClass before _Jv_AllocObj. Pass + `klass' to _Jv_AllocObj. Don't set the new array's vtable. + * resolve.cc (METHOD_NOT_THERE, METHOD_INACCESSIBLE): New #defines. + (_Jv_ResolvePoolEntry): Use METHOD_NOT_THERE and METHOD_INACCESSIBLE. + (_Jv_DetermineVTableIndex): Ditto. + (_Jv_PrepareClass): Ditto. Remove offset-by-one adjustments from vtable + calculations to account for new gc_descr field. + * boehm.cc: #include gc_gcj.h. + (obj_kind_x, obj_free_list): `#if 0'-ed away. + (_Jv_MarkObj): Check that vtable doesn't point to a cleared object. + New commentary from HB. Mark the classes vtable. + (_Jv_MarkArray): Check that vtable doesn't point to a cleared object. + (GC_DEFAULT_DESCR): New #define. + (_Jv_BuildGCDescr): New function. Use GC_DEFAULT_DESCR, for now. + (_Jv_AllocObj): New parameter `klass'. Use GC_GCJ_MALLOC (). + (_Jv_AllocArray): New parameter `klass'. Allocate with GC_MALLOC and + scan conservativly if size is less than min_heap_addr. Set vtable + pointer of new object before returning. + (_Jv_AllocBytes): Use GC_MALLOC_ATOMIC, not GC_GENERIC_MALLOC. + (_Jv_InitGC): Call GC_init_gcj_malloc(). Don't set up marking and + allocation for obj_kind_x. + * nogc.cc (_Jv_BuildGCDescr): New function. Return 0. + (_Jv_AllocObj): Set vtable on returned object. + (_Jv_AllocArray): Ditto. + * java/lang/Class.h (_Jv_NewObjectArray): No longer a friend. + (_Jv_NewPrimArray): Ditto. + (_Jv_AllocObj): Declare as a friend. + (_Jv_AllocArray): Ditto. + * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Copy gc_descr + from &ObjectClass into new array class. Remove offset-by-one + adjustments from `method' size calculations to account for gc_descr + field. + + 2000-09-26 Tom Tromey + + * java/awt/Scrollbar.java (removeAdjustmentListener): Use + `remove', not `add'. + + 2000-09-26 Alexandre Petit-Bianco + + * java/lang/natSystem.cc (file_encoding): Added return statement. + + 2000-09-14 Alexandre Oliva + + * Makefile.am: Re-work shell commands that exceeded command-line + length limits. + * Makefile.in: Rebuilt. + + * java/lang/natRuntime.cc (lt_preloaded_symbols): Define as `extern'. + + * defineclass.cc: Include alloca.h only if HAVE_ALLOCA_H. + * java/lang/natDouble.cc: Likewise. + * java/lang/reflect/natMethod.cc: Likewise. + * interpret.cc: Likewise. Fix NULLCHECKs that tested a _Jv_word. + + 2000-09-13 Alexandre Oliva + + * configure.in (LIBDATASTARTSPEC): Use `%s' to search for + libgcjdata.a. + (GCJ): Support single-tree builds. Add -B`pwd`/ and -I$srcdir. + * acinclude.m4: Arrange for automake to not bring in a new + libtool.m4 for LT_AC_PROG_GCJ. AC_SUBST GCJ. + * Makefile.am: Leave it up to automake to subst GCJ. + * aclocal.m4, configure, Makefile.in: Rebuilt. + + 2000-09-13 Tom Tromey + + * java/lang/reflect/natArray.cc (BooleanClass): New define. + (get): Ensure Boolean class is initialized. + * java/lang/reflect/natField.cc (BooleanClass): New define. + (get): Ensure Boolean class is initialized. + + 2000-09-13 Bryce McKinlay + + * java/lang/String.java (CASE_INSENSITIVE_ORDER): New static field. + Initialize with anonymous class. + (compareToIgnoreCase): New method. + + * java/lang/ThreadGroup.java (had_uncaught_exception): New field. + (uncaughtException): Set had_uncaught_exception. + * prims.cc (JvRunMain): Check value of had_uncaught_exception and + exit with error status if set. + (_Jv_RunMain): Ditto. + + 2000-09-12 Alexandre Oliva + + * configure: Rebuilt with new ../libtool.m4. + + 2000-09-11 Tom Tromey + + * java/lang/reflect/Field.java (toString): Don't rely on + Class.toString. + + 2000-09-08 Tom Tromey + + * gnu/gcj/convert/BytesToUnicode.java (getDefaultDecoder): Let + default decoder use iconv. + * gnu/gcj/convert/UnicodeToBytes.java (getDefaultEncoder): + Let default encoder use iconv. + * configure: Rebuilt. + * configure.in: Check for nl_langinfo and . + * java/lang/natSystem.cc (file_encoding): New function. + (DEFAULT_FILE_ENCODING): Define to file_encoding() if possible. + + 2000-09-10 Alexandre Oliva + + * acinclude.m4: Simplify the tests for CC and CXX. + * aclocal.m4, configure: Rebuilt. + + * acinclude.m4: Include libtool macros from the source tree. + * aclocal.m4, configure: Rebuilt. + + 2000-09-08 Warren Levy + + * java/beans/PropertyChangeEvent.java (serialVersionUID): Added. + * java/beans/PropertyVetoException.java (serialVersionUID): Added. + * java/io/File.java (writeObject): Added. + (readObject): Added. + (serialVersionUID): Added. + * java/io/ObjectOutputStream.java (writeObject): Initialized + fieldsAlreadyWritten before recursion rather than after. + * java/io/ObjectStreamClass.java (serialVersionUID): Added. + * java/io/OptionalDataException.java (serialVersionUID): Added. + (OptionalDataException): Made package private. + * java/io/SyncFailedException.java (SyncFailedException): Removed + default constructor to match spec. + * java/lang/Boolean.java (serialVersionUID): Added. + * java/lang/Byte.java (serialVersionUID): Added. + * java/lang/Character.java (serialVersionUID): Added. + * java/lang/Double.java (serialVersionUID): Added. + * java/lang/Float.java (serialVersionUID): Added. + * java/lang/Integer.java (serialVersionUID): Added. + * java/lang/Long.java (serialVersionUID): Added. + * java/lang/Number.java (serialVersionUID): Added. + * java/lang/Short.java (serialVersionUID): Added. + * java/lang/String.java (serialVersionUID): Added. + * java/lang/ThreadDeath.java (ThreadDeath): Removed constructor + to match spec. + * java/lang/reflect/InvocationTargetException.java + (serialVersionUID): Added. + * java/net/URL.java (handler): Made transient. + (hashCode): Added field for serialization, per spec. and use + cached value if available. + (serialVersionUID): Added. + (URL): Initialize hashCode. + (set): Adjust hashCode. + (readObject): New Method to initialize the protocol handler when + deserializing. + (writeObject): New method. + * java/text/BreakIterator.java: Removed 'implements Serializable'. + * java/text/Collator.java: Removed 'implements Serializable'. + * java/util/GregorianCalendar.java (serialVersionUID): Added. + * java/util/Properties.java (serialVersionUID): Added. + * java/util/Random.java (serialVersionUID): Added. + (seed): Made private. + (nextNextGaussian): Made private. + (haveNextNextGaussian): Made private. + * java/util/Stack.java (serialVersionUID): Added. + * java/util/TimeZone.java (serialVersionUID): Added. + * java/util/Vector.java (serialVersionUID): Added. + + 2000-09-07 Bryce McKinlay + + * Makefile.am (Thread.h): Don't be friends with native threads + functions. + * Makefile.in: Rebuilt. + * java/lang/Thread.java (interrupt_flag): Make package-private. + + 2000-09-06 Jeff Sturm + + * include/jvm.h (_Jv_HashCode): Cast object ptr to `unsigned long' + to avoid long long division. + + 2000-09-06 Tom Tromey + + * java/lang/reflect/Constructor.java (toString): Use `getName' for + parameter types. + * java/lang/reflect/Method.java (toString): Use `getName' for + return type. + + * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Accept null + `args' if method takes no parameters. + + Fix for PR java.lang/339: + * java/lang/natPosixProcess.cc (fail): New function. + (cleanup): New function. + (startProcess): Use them. Create pipe so child can communicate + exec failure back to parent. + + 2000-09-05 Bryce McKinlay + + * java/net/natPlainDatagramSocketImpl.cc: Change various `JvThrow' + calls to `throw'. + (send): Undo last patch. Remove the label only. + (mcastGrp): Ditto. + * java/net/natPlainSocketImpl.cc: Change various `JvThrow' calls to + `throw'. + * java/net/natInetAdress.cc: Ditto. + + * java/net/natPlainDatagramSocketImpl.cc (mcastGrp): Fix typo. + + 2000-09-05 Tom Tromey + + * doc/cni.sgml: Updated from master copy. + + 2000-09-05 Bryce McKinlay + + * gnu/gcj/convert/natIconv.cc (read): Remove unused local. + (write): Ditto. + * gnu/gcj/runtime/FileDeleter.java (deleteOnExitNow): Check for null + stack. Synchronize. + * java/lang/fdlibm.h: #undef __P if previously defined. + * java/lang/natSystem.cc (currentTimeMillis): Remove unused local. + * java/net/natPlainDatagramSocketImpl.cc (send): Remove unreachable + block. + (mcastGrp): Ditto. + + 2000-09-04 Tom Tromey + + * java/util/zip/ZipFile.java (ZipFile): Delete file when opened in + DELETE mode. + + 2000-09-04 Anthony Green + + Fix for PR java.io/203: + * java/io/File.java (createTempFile): Obey directory argument. + Use java.io.tmpdir if needed. Don't leave FileDescripators open. + * java/lang/natSystem.cc (init_properties): Use TMPDIR environment + variable to set java.io.tmpdir on non-WIN32 systems. + + 2000-09-04 Anthony Green + + * java/io/File.java (deleteOnExit): New method. + * gnu/gcj/runtime/FileDeleter.java: New class. + * java/lang/natRuntime.cc (exit): Call + FileDeleter.deleteOnExitNow() + * Makefile.am: Add FileDeleter.java. + * Makefile.in: Rebuilt. + + 2000-09-02 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (GCJCOMPILE): Use -fclasspath, not the CLASSPATH + environment variable. + + 2000-09-01 Andrew Haley + + * java/io/StreamTokenizer.java: Don't throw a + NumberFormatException if a field is numeric as far as the + StreamTokenizer is concerned but not as far as Double.valueOf() is + concerned: return a zero instead. + + 2000-08-30 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (AM_CXXFLAGS): Added -fdollars-in-identifiers. + + 2000-08-28 Tom Tromey + + * gnu/gcj/awt/BitMaskExtent.java, gnu/gcj/awt/Buffers.java, + gnu/gcj/awt/ComponentDataBlitOp.java, + gnu/gcj/awt/GLightweightPeer.java, java/awt/Graphics2D.java, + java/awt/RenderingHints.java, java/awt/color/ColorSpace.java, + java/awt/color/ICC_ColorSpace.java, + java/awt/color/ICC_Profile.java, + java/awt/image/BufferedImage.java, java/awt/image/ColorModel.java, + java/awt/image/ComponentColorModel.java, + java/awt/image/ComponentSampleModel.java, + java/awt/image/DataBuffer.java, + java/awt/image/DataBufferByte.java, + java/awt/image/DataBufferInt.java, + java/awt/image/DataBufferUShort.java, + java/awt/image/DirectColorModel.java, + java/awt/image/IndexColorModel.java, + java/awt/image/PackedColorModel.java, java/awt/image/Raster.java, + java/awt/image/RasterOp.java, java/awt/image/SampleModel.java, + java/awt/image/SinglePixelPackedSampleModel.java, + java/awt/image/WritableRaster.java, java/util/zip/ZipFile.java: + Removed Latin-1 copyright symbols. + * java/util/zip/ZipFile.java: Indentation fixes. + + 2000-08-27 Mark Wielaard + + * java/util/zip/ZipFile.java: Implement OPEN_DELETE mode, new + constructor, close can delete the file, finalize calls close. + * java/util/jar/JarFile.java: Constructor that takes mode now + calls super. + + 2000-08-27 Anthony Green + + * java/util/ArrayList.java, java/util/Timer.java, + java/util/LinkedList.java, java/util/TimerTask.java, + java/util/HashMap.java, java/util/AbstractMap.java, + java/util/SortedMap.java, java/util/AbstractSequentialList.java, + java/util/SortedSet.java: Imported from GNU Classpath. + * Makefile.in: Rebuilt. + * Makefile.am: Added new files. + + 2000-08-26 Anthony Green + + * Makefile.in: Rebuilt. + * Makefile.am (java/lang/ClassLoader.h): Make _Jv_RunMain a + friend. + + * prims.cc: Include ClassLoader.h. + (_Jv_RunMain): When executing jar files, classpath must be the jar + file only. Lose our reference to the system ClassLoader in order + to get a new one with the correct classpath. + * java/lang/natSystem.cc (init_properties): When executing a jar + file, only use the jar file for java.class.path. + + * gnu/gcj/runtime/VMClassLoader.java: Use the canonical file name + for bytecode archives. + + * gnu/gcj/runtime/FirstThread.java: Handle case where manifest + exists, but not Main-Class. + + 2000-08-23 Mark Wielaard + + * java/util/zip/InflaterInputStream.java (read(byte[],int,int)): + return -1 when fill() has no more data for the Inflater. + + 2000-08-23 Mark Wielaard + + * java/io/PrintWriter.java (print(String)): Don't catch IOException, + write(String) already does. + + 2000-08-23 Alexandre Petit-Bianco + + * gnu/gcj/jni/NativeThread.java (NativeThread): Removed assignment + to `alive_flag', call `init'. + (init): New native method. + * gnu/gcj/jni/natNativeThread.cc (init): New native method + implementation. + + 2000-08-21 Mark Wielaard + + * Makefile.in: Rebuilt. + * Makefile.am (java/lang/reflect/Constructor.h): Declare Class as + a `friend class'. + (java/lang/reflect/Field.h): Likewise. + (java/lang/reflect/Method.h): Likewise. + (gnu/gcj/runtime/VMClassLoader.h): Declare ClassLoader as a + `friend class'. + + 2000-08-21 Tom Tromey + + * java/util/ResourceBundle.java (trySomeGetBundle): Removed + debugging prints. + + Sun Aug 20 21:02:48 2000 Anthony Green + + * java/lang/natSystem.cc (init_properties): Change sourceware + reference to sources.redhat.com. + + * include/java-props.h: Add _Jv_Jar_Class_Path. + * prims.cc: Ditto. Set it from `gij -jar file' option. + + * java/lang/natSystem.cc (init_properties): Set java.class.path + from + {gij -jar file}:{CLASSPATH variable}:{-Djava.class.path= or .} + + * java/util/PropertyPermission.java: Import from GNU Classpath. + * Makefile.in: Rebuilt. + * Makefile.am: Add java/util/PropertyPermission.java. + * java/lang/System.java: Add setProperty method. + + * gij.cc (main): Add -jar option to execute jar files. + (help): Describe -jar option. + * prims.cc (_Jv_RunMain): Add support for jar execution mode. + * include/jvm.h: Add is_jar argument to _Jv_RunMain. + * gnu/gcj/runtime/FirstThread.java (main): New method. + + * java/util/jar/Attributes.java: Correct comment spelling. + + 2000-08-20 Mark Wielaard + + * java/util/zip/Adler32.java: Make private variables really private + * java/util/zip/CRC32.java: Make private variables really private + * java/util/zip/CheckedInputStream.java: skip() could skip to much + bytes + * java/util/zip/InflaterInputStream.java: skip() could skip to + much bytes + * java/util/zip/ZipEntry.java: setCompressedSize() didn't check input + * java/util/zip/ZipFile.java: size() new 1.2 method + * java/util/zip/ZipInputStream.java: Use createZipEntry not new + ZipEntry. since 1.2 available() always returns just 1 or 0 when + closed + + Sun Aug 20 12:33:43 2000 Anthony Green + + * java/util/jar/JarFile.java: Don't call + java.util.zip.ZipFile.getEntry twice. From Mark Wielaard + . + + Sun Aug 20 09:51:48 2000 Anthony Green + + * java/net/URLClassLoader.java: Find the JarEntry via the JarFile. + Read the entire contents of the class file, not just what is + available(). + + * java/net/JarURLConnection.java: getEntry doesn't take any + arguments. Return null if element is null. + + * java/util/zip/ZipFile.java (getInputStream): Read the compressed + size from the archive, not the inflated size. + + * java/util/jar/JarFile.java (getEntry): Don't recurse. Call + java.util.zip.ZipFile.getEntry. + + * gij.cc (help): Change sourceware reference to + sources.redhat.com. + + 2000-08-19 Tom Tromey + + * java/util/zip/ZipInputStream.java (createZipEntry): + Implemented. + + Sat Aug 19 11:00:53 2000 Anthony Green + + * java/util/jar/Attributes.java, java/util/jar/JarEntry.java, + java/util/jar/JarException.java, java/util/jar/JarFile.java, + java/util/jar/JarInputStream.java, + java/util/jar/JarOutputStream.java, java/util/jar/Manifest.java, + java/util/Set.java, java/util/Map.java, java/util/Bucket.java, + java/util/AbstractSet.java, java/util/BasicMapEntry.java, + java/security/cert/CRL.java, java/security/cert/CRLException.java, + java/security/cert/Certificate.java, + java/security/cert/CertificateEncodingException.java, + java/security/cert/CertificateException.java, + java/security/cert/CertificateExpiredException.java, + java/security/cert/CertificateFactory.java, + java/security/cert/CertificateFactorySpi.java, + java/security/cert/CertificateNotYetValidException.java, + java/security/cert/CertificateParsingException.java, + java/security/cert/X509CRL.java, + java/security/cert/X509CRLEntry.java, + java/security/cert/X509Certificate.java, + java/security/cert/X509Extension.java: Imported from Classpath. + * java/util/Hashtable.java: Imported from Classpath. + + * java/util/zip/ZipInputStream.java: Create stub for + createZipEntry. + + * gcj/javaprims.h: Updated class list. + + * Makefile.in, gcj/Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Add these new classes. + + 2000-08-16 Rolf W. Rasmussen + + * gnu/gcj/awt/ComponentDataBlitOp.java: New file. + * gnu/gcj/awt/GLightweightPeer.java: New file. + * java/awt/BorderLayout.java: Implemented all methods. + * java/awt/Button.java (actionListener, actionCommand): Renamed + and modifier change. + (addNotify): Call super. + (dispatchEventImpl): New method. + (getListeners): New method. + (label): Made package-private, not private. + * java/awt/Canvas.java: Implemented class body. + * java/awt/Color.java (brighter): New method. + (darker): New method. + (hashCode): New method. + * java/awt/Component.java (visible, enabled, eventMask): Set defaults. + (getGraphicsConfiguration): Delegate to + getGraphicsConfigurationImpl(). + (getGraphicsConfigurationImpl): New method. + (getToolkit): Only return value from peer if not null. + (isDisplayable): Check with parent. + (isShowing): No parent implies not showing. + (getForeground): Check parent property if local is null. + (getBackground): Likewise. + (getFont): Likewise. + (setForeground): Inform peer. + (setBackground): Likewise + (setLocale): Invalidate component. + (getColorModel): Implemented. + (setLocation): Invalidate, or ignore if no change. + (setSize): Invalidate, or ignore if no change. + (setBounds): Invalidate, or ignore if no change. + (isOpaque): By default, heavyweight implies opaque. + (isLightweight): Implemented. + (getMaximumSize): Implemented. + (doLayout): Implemented, NOP. + (validate): Implemented, NOP. + (invalidate): Only propagate to parent if parent was valid. + (getGraphics): Implemented. + (getFontMetrics): Implemented. + (update): Implemented. + (paintAll): Implemented. + (repaint): Implemented all repaint methods. + (print): Implemented. + (printAll): Implemented. + (createImage): Implemented. + (dispatchEvent): Give the peer a chance to handle the event. + (dispatchEventImpl): Dispatch paint events. + (enableEvents): Lightweights enable events on parent component. + (coalesceEvents): Coalesce paint events, and select event type + using a switch. + (coalescePaintEvents): New method. + (processEvent): Fix unfortunate ordering of statements, and call + correct method for MOUSE_CLICKED. + (processPaintEvent): New method. + (addNotify): Allow container to notify children before event + mask is set in peer. + (addNotifyContainerChildren): New method. + (removeNotify): Visibility should not change on removeNotify. + (paramString): Implemented. + (list): Implemented two of the list methods. + * Container (myInsets): Removed, insets are managed by peer. + (getInsets): Query peer. + (addImpl): Fix reparenting, enable events for lightweights, + initialize component array. + (validate): Call doLayout in validateTree() instead. + (validateTree): Do nothing if already valid. Call beginValidate(), + endValidate() on peer. Call validateTree() instead of validate() + for children that are containers. Mark valid after validation of + children. + (setFont): Partial implementation. + (paint): Implemented. + (visitChildren): New method. + (visitChild): New method. + (update): Implemented. + (print): Implemented. + (paintComponents): Implemented. + (printComponents): Consider translation and clipping. + (getComponentAt): Ignore invisible children. Return this if no + child match. + (addNotify): Call super. + (addNotifyContainerChildren): New method. + (paramString): Implemented. + (list): Implemented. + * java/awt/EventQueue (invokeAndWait): Get system event queue the + right way. + (invokeLater): Likewise. + (isDispatchThread): Likewise. + * java/awt/FontMetrics (getLeading): Formula change. + (getDescent): Consider leading also. + (getMaxAscent): Default to getAscent(). + (getMaxDescent): Default to getDescent. + (getMaxAdvance): Return value signifying unknown. + (charWidth): Both methods implemented. + (charsWidth): Implemented. + (bytesWidth): Implemented. + (getWidths): Implemented. + * java/awt/Frame.java (NORMAL, ICONIFIED, iconImage, isResizable, + state): New fields. + (Frame): Rearragend constuctor chaining to disallow null being + passed as a graphics configuration. + (getTitle): Return empty string if null. + (dispose): Removed. + (getIconImage): New method. + (setIconImage): New method. + (finalize): New method. + (setMenuBar): Notify peer. + (isResizable): New method. + (setResizable): New method. + (getState): New method. + (getFont): Removed. + (remove): Implemented. + (removeNotify): New method. + (getFrames): New method. + * java/awt/Graphics.java: Implemented body of class. + * java/awt/Graphics2D.java: New file. + * java/awt/GraphicsConfiguration.java: Enabled part of the API. + * java/awt/Image.java: Implemented body of class. + * java/awt/Panel.java (Panel): Call correct super constructor. + (addNotify): Implemented. + * java/awt/Rectangle.java (isEmpty): Fixed reversed logic. + * java/awt/RenderingHints.java: New file. + * java/awt/Toolkit.java (createComponent): Implemented. + (getSystemEventQueue): Delegate to getSystemEventQueueImpl(). + * java/awt/Window.java (Window): Two new constructors. Reordered + constructor chaining. + (getGraphicsConfigurationImpl): New method. + (finalize): Call super. + (addNotify): Call super. + (pack): Do layout stuff. + (show): Ensure that peer exists and that component is valid. + (dispose): Dispose owned children. + (getOwner): Simplify code, casting null pointers is valid. + (getGraphicsConfiguration): Ask peer if local value is null. + * java/awt/event/ActionEvent.java (getActionCommand): Renamed from + getcmd(). + * java/awt/image/BufferedImage.java: New file. + * java/awt/image/RasterOp.java: New file. + * java/awt/peer/ComponentPeer.java (getGraphicsConfiguration): + More powerful replacement for getColorModel(). + (getColorModel) Removed. + (setEventMask) New method. + * Makefile.am: Added new files. + * Makefile.in: Rebuilt. + + 2000-08-15 Alexandre Petit-Bianco + + * java/lang/natClass.cc (finit_name): Initialized with `finit$'. + (finit_leg_name): New global. + (java::lang::Class::getDeclaredMethods): Test for `finit$' or + `$finit$'. This is a backward compatibility hack. + (java::lang::Class::_getMethods): Likewise. + + 2000-08-15 Andrew Haley + + * include/jvm.h (_Jv_HashCode): New hash code. + + 2000-08-15 Tom Tromey + + * java/io/ByteArrayOutputStream.java: Merged with Classpath. + + Sun Aug 13 19:53:01 2000 Anthony Green + + * THANKS: More thanks. + + 2000-08-10 Tom Tromey + + * java/net/natPlainSocketImpl.cc (bind): Don't go to error case + when errno not set. + (connect): Likewise. + (accept): Likewise. + (getOption): Likewise. + * java/net/natPlainDatagramSocketImpl.cc (bind): Don't go to error + case when errno not set. + (peek): Likewise. + (send): Likewise. + (receive): Likewise. + (mcastGrp): Likewise. + (setOption): Likewise. + (getOption): Likewise. + + 2000-08-10 Bryce McKinlay + John Stracke + + * gnu/gcj/protocol/http/Connection.java (gotHeaders): Removed. + (connect): Don't falsely claim HTTP/1.1 compliance. Call + getHttpHeaders(). + (disconnect): Don't unset connected flag. + (getHeaderField (String)): Call connect() if not connected. + (getHeaderField (int)): Ditto. + (getHeaderFieldKey): Ditto. + (getHttpHeaders): Don't call connect(). + * java/net/HttpURLConnection.java (instanceFollowRedirects, + gotResponseVals): New fields. + (getResponseCode): Call getResponseVals() conditionally. + (getResponseMessage): Ditto. + (getResponseVals): Call connect(). Don't throw FileNotFoundException. + + 2000-08-09 Bryce McKinlay + + * Makefile.am: Move beans and applet classes to awt_java_source_files. + * Makefile.in: Rebuilt. + * java/awt/Color.java (getTransparency): New method. + * java/awt/Component.java: Various updates. + * java/awt/Container.java (removeNotify): Call super.removeNotify() + after dealing with children. + * java/awt/Toolkit.java (changeSupport): Renamed from pcsupport. + * java/awt/Window.java: Various new methods and updates. + * java/awt/color/ICC_Profile.java (getNumComponents): Cast profileID + to int for switch. + * java/awt/event/KeyEvent.java (paramString): Initialize `r'. + * java/awt/event/WindowEvent.java (paramString): Ditto. + * java/awt/geom/Dimension2D.java (clone): Wrap super call with + try/catch block. + * java/awt/geom/Point2D.java (clone): Ditto. + * java/awt/geom/RectangularShape.java (clone): Ditto. + * java/awt/image/ColorModel.java (bits, cspace, transparency, hasAlpha, + isAlphaPremultiplied): Make package-private, not private. + + 2000-08-08 Tom Tromey + + * gnu/gcj/convert/Input_UTF8.java (read): Fixed handling of + surrogate characters. + * gnu/gcj/convert/Output_UTF8.java (standardUTF8): Default to + true. + (write): Correct handling of surrogate characters. + + 2000-08-07 Tom Tromey + + * java/lang/reflect/Method.java (hashCode): Use getName(). + (toString): Likewise. + * java/lang/reflect/natMethod.cc (getType): Initialize + exception_types. + + * java/lang/reflect/Method.java (toString): Use Class.getName, not + Class.toString. + * java/lang/reflect/Field.java (toString): Correct formatting. + From Corey Minyard. + + * java/io/PipedInputStream.java (read(byte[],int,int)): Mostly + rewrote. + (receive): Streamlined. + + 2000-08-05 Tom Tromey + + * java/io/PrintWriter.java: Merged comments from Classpath. + (printlnUnsynchronized): Removed. + (println()): Print the separator. + (println): Call println(), not printlnUnsynchronized. + (out): Now protected, to match spec. + + 2000-08-04 Tom Tromey + + * java/io/StreamTokenizer.java (TT_NONE): Now private. + (nextToken): Handle backslashed newline. From Oskar Liljeblad. + For PR java.io/301. + + 2000-08-03 Warren Levy + + * java/io/ObjectInputStream.java (readFields): Turn off + readDataFromBlock while reading via GetField. + (GetField$1.get(String, Object)): Pass Class of default value to + getField. + (getField): Allow for null default values. + + * java/io/ObjectOutputStream.java: Fixed typo in comment. + (PutField$1.put): Fixed calls of checkType in most of the put + methods to pass the correct parameter. + (PutField$1.put(String, Object)): Allow for null value arg. + (PutField$1.write): Turn off writeDataAsBlocks while writing via + PutField. + + * java/io/ObjectStreamClass.java (serialPersistentFields): Fixed + typo in spec'ed field name. + (getSerialPersistentFields): Changed spelling of method to match + the correct spelling of the spec'ed field name. + + 2000-08-03 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new files. + + 2000-08-03 Bryce McKinlay + + * Makefile.am: Add new AWT stubs. + * java/awt/Canvas.java: New placeholder class. + * java/awt/Checkbox.java: Ditto. + * java/awt/CheckboxMenuItem.java: Ditto. + * java/awt/Choice.java: Ditto. + * java/awt/Dialog.java: Ditto. + * java/awt/FileDialog.java: Ditto. + * java/awt/List.java: Ditto. + * java/awt/ScrollPane.java: Ditto. + * java/awt/TextField.java: Ditto. + * java/awt/datatransfer/Clipboard.java: Ditto. + * java/awt/Component.java (treeLock): Now a static String. Add comment. + * java/awt/MenuItem.java (MenuItem): Add default constructor. + * java/awt/Toolkit.java: Added all methods from J2SE 1.3 API docs. + Some commented out. Partially implemented. + * java/awt/natToolkit.cc: Removed file. + + 2000-08-03 Bryce McKinlay + + * Makefile.am: Make inner class CNI headers depend on libgcj.zip only. + Fixes "make -j" builds. + * Makefile.in: Rebuild. + + 2000-08-02 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (libgcj_la_SOURCES): Added posix.cc. + * java/net/natPlainSocketImpl.cc: Include posix.h. + (accept): Use _Jv_select. + * java/net/natPlainDatagramSocketImpl.cc: Include posix.h. + (receive): Use _Jv_select. + * java/io/natFileDescriptorPosix.cc: Include posix.h. + (available): Use _Jv_select. + * java/lang/natSystem.cc: Include posix.h. + (currentTimeMillis): Use _Jv_gettimeofday. + * include/posix.h: New file. + * posix.cc: New file. + + * scripts/encodings.pl: New file. + * Makefile.in: Rebuilt. + * Makefile.am (convert_source_files): Added IOConverter.java. + * gnu/gcj/convert/UnicodeToBytes.java (UnicodeToBytes): Extend + IOConverter. + (getDefaultDecodingClass): Canonicalize default encoding name. + (getEncoder): Likewise. + * gnu/gcj/convert/BytesToUnicode.java (BytesToUnicode): Extend + IOConverter. + (getDefaultDecodingClass): Canonicalize default encoding name. + (getDecoder): Likewise. + * gnu/gcj/convert/IOConverter.java: New file. + + 2000-08-02 Bryce McKinlay + + * interpret.cc (_Jv_InterpMethod::continue1): Type of `fun' changed + to match C declaration in ffi.h. + * Makefile.am: Add java/awt/Button.java. + * Makefile.in: Rebuilt. + + 2000-07-29 Alexandre Petit-Bianco + + * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Type of the + cast of the second argument to `ffi_raw_call' changed to match + prototype. + + 2000-07-26 Alexandre Petit-Bianco + + * jni.cc (_Jv_JNIMethod::call): Type of the cast of the second + argument to `ffi_raw_call' changed to match prototype. + + 2000-07-31 Bryce McKinlay + + * java/awt/Component.java (toString): Implemented. + * java/awt/Container.java (addImpl): Remove FIXME. Only call + dispatchEvent() to dispatch the event. + (removeImpl): Ditto. + + 2000-07-30 Anthony Green + + * java/awt/Component.java: Add treeLock object. + (getTreeLock): Implement. + (isShowing): Implement. + + 2000-07-30 Tom Tromey + + * java/awt/BorderLayout.java (BorderLayout()): New constructor. + + * java/awt/Frame.java (Frame): Pass `null' to Window constructor. + + * java/awt/Window.java (addNotify): Wrote. + (addWindowListener): Wrote. + (getLocale): Wrote. + (getWarningString): Wrote. + (processEvent): Wrote. + (processWindowEvent): Wrote. + (removeWindowListener): Wrote. + (show): Call validate(), setVisible(). + (toBack): Wrote. + (toFront): Wrote. + + * java/awt/Toolkit.java (createWindow): Declare. + + * java/awt/Frame.java (addNotify): Use getToolkit to find + toolkit. + + * java/awt/Component.java (invalidate): Wrote. + (isValid): Wrote. + (getToolkit): Wrote. + + * java/awt/Container.java (addContainerListener): Removed + unnecessary cast. + (removeContainerListener): Likewise. + (addImpl): Wrote. + (add(Component)): Use it. + (add(String,Component)): Likewise. + (add(Component,int)): Likewise. + (add(Component,Object)): Likewise. + (add(Component,Object,int)): Likewise. + (doLayout): Wrote. + (getAlignmentX): Wrote. + (getAlignmentY): Wrote. + (getComponentAt): Wrote. + (getMaximumSize): Wrote. + (invalidate): Wrote. + (list(PrintStream,int)): Wrote. + (list(PrintWriter,int)): Wrote. + (getMinimumSize): Wrote. + (getPreferredSize): Wrote. + (printComponents): Wrote. + (processContainerEvent): Look at containerListener, not + componentListener. + (remove): Added event processing and peer destruction. + (removeAll): Use remove. + (removeNotify): Wrote. + (validate): Wrote. + (validateTree): Wrote. + + * java/awt/Scrollbar.java (addNotify): Do nothing if peer exists. + * java/awt/Label.java (addNotify): Do nothing if peer exists. + * java/awt/Container.java (addNotify): Don't create Container + peer. + * java/awt/Button.java (addNotify): Do nothing if peer exists. + + 2000-07-30 Tom Tromey + + * java/awt/Container.java (remove(int)): Wrote. + (remove(Component)): Wrote. + (add(Component)): Wrote. + (add(Component,int)): Wrote. + (removeAll): Wrote. + (addNotify): Set our own peer. + * java/awt/Scrollbar.java (listeners): Changed type. + (Scrollbar): Don't initialize listeners. + (addNotify): Wrote. + (setValue): Call setValues. + (setMinimum): Likewise. + (setMaxPriority): Likewise. + (setVisibleAmount): Likewise. + (setValues): Wrote. + (setUnitIncrement): Forward to peer. + (setLineIncrement): Call setUnitIncrement. + (setPageIncrement): Call setBlockIncrement. + (setBlockIncrement): Forward to peer. + (addAdjustmentListener): Rewrote. + (removeAdjustmentListener): Rewrote. + (processAdjustmentEvent): Rewrote. + (paramString): Wrote. + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added Button.java. + * java/awt/Button.java: New file. + * java/awt/Toolkit.java (createLabel): Declare. + (createButton): Likewise. + (createScrollbar): Likewise. + (createContainer): Likewise. + * java/awt/Label.java (addNotify): Wrote. + (setAlignment): Call setAlignment in the peer. + (setText): Call setText in the peer. + + 2000-07-28 Warren Levy + + * java/io/ObjectOutputStream.java (writeObject): Per spec, call + NotSerializableException with just the class name. + + 2000-07-26 Andrew Haley + + * interpret.cc (continue1): Insert missing break into switch. + + 2000-07-28 Warren Levy + + * java/io/ObjectStreamException.java: Made constructors protected. + + 2000-07-27 Tom Tromey + + * java/io/OutputStreamWriter.java (close): Only flush if not + closed. + + 2000-07-27 Warren Levy + + * mauve-libgcj: Activated serialization tests. + * gcj/field.h (getModifiers): Mask off unknown flags. + * gnu/java/security/provider/SHA.java (munch): Reset buffer to 0 so + spurious bits don't cause discrepancies. + * java/io/ObjectOutputStream.java: Fixed typo in comment. + * java/io/ObjectStreamClass.java: Fixed typos in comments. + (lookup): Applied patch from Brian Jones to optimize. + (hasClassInitializer): Call getDeclaredMethod instead of getMethod. + * java/lang/Throwable.java (serialVersionUID): New field. + * java/lang/reflect/Modifier.java (ALL_FLAGS): Preserve STRICT if used. + * java/lang/reflect/natConstructor.cc (getModifiers): Mask off + unknown flags. + * java/lang/reflect/natMethod.cc: Ditto. + * java/security/Key.java (serialVersionUID): Removed field for now. + * java/security/interfaces/DSAPrivateKey.java (serialVersionUID): Ditto. + * java/security/interfaces/DSAPublicKey.java (serialVersionUID): Ditto. + + 2000-07-22 Tom Tromey + + * java/awt/geom/RectangularShape.java (getPathIterator): + Wrote. + + 2000-07-23 Rolf W. Rasmussen + + * libjava/java/awt/image/ColorModel.java: New file, replaces the + stub libjava/java/awt/ColorModel.java which was located in the + wrong package. + * libjava/java/awt/image/ComponentColorModel.java: New file. + * libjava/java/awt/image/ComponentSampleModel.java: New file. + * libjava/java/awt/image/DataBuffer.java: New file. + * libjava/java/awt/image/DataBufferByte.java: New file. + * libjava/java/awt/image/DataBufferInt.java: New file. + * libjava/java/awt/image/DataBufferUShort.java: New file. + * libjava/java/awt/image/DirectColorModel.java: New file. + * libjava/java/awt/image/PackedColorModel.java: New file. + * libjava/java/awt/image/Raster.java: New file. + * libjava/java/awt/image/SampleModel.java: New file. + * libjava/java/awt/image/SinglePixelPackedSampleModel.java: New + file. + * libjava/java/awt/image/IndexColorModel.java: New file. + * libjava/java/awt/image/ImageConsumer.java: Removed import of + java.awt.ColorModel stub. + + * gnu/gcj/util/BitMaskExtent.java: New file, utility class. + * gnu/gcj/util/Buffers.java: New file, utility class. + + * libjava/Makefile.am: Updated to include new files. + * libjava/Makefile.in: Rebuilt. + + 2000-07-23 Oskar Liljeblad + + * java/io/StreamTokenizer.java: Merged with classpath. + + 2000-07-20 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Updated for new files. + * java/awt/Adjustable.java (HORIZONTAL, VERTICAL): Set values. + * java/awt/Label.java: New file. + * java/awt/Rectangle.java (Rectangle): Extend Rectangle2D. + (createIntersection, createUnion, getBounds2D): New methods. + * java/awt/Scrollbar.java: New file. + * java/awt/Shape.java: Updated to 1.2. + * java/awt/geom/AffineTransform.java: New file. + * java/awt/geom/Ellipse2D.java: New file. + * java/awt/geom/NoninvertibleTransformException.java: New file. + * java/awt/geom/PathIterator.java: New file. + * java/awt/geom/Rectangle2D.java: New file. + * java/awt/geom/RectangularShape.java: New file. + * java/awt/geom/Point2D.java (Double, Float): New inner classes. + * java/awt/geom/IllegalPathStateException.java: New file. + + * scripts/showval.java: New file. + + * scripts/classes.pl (scan): Print inner classes properly. + * gcj/javaprims.h: Updated class list. + + * java/lang/natClassLoader.cc (_Jv_PrepareCompiledClass): Only + initialize String fields for interpreted classes. Fixes bug + reported by Hans Boehm. + + * java/io/File.java (getParentFile): New method, from Classpath + via Oskar Liljeblad. + + * java/util/Vector.java (remove(Object)): Implemented. + + 2000-07-19 Jeff Sturm + + * java/lang/natThrowable.cc (fillInStackTrace): Check for + zero return from backtrace(). + + 2000-07-15 Bryce McKinlay + + * java/awt/EventQueue.java (invokeAndWait): Call postEvent() within + synchronized block. + * java/awt/event/InvocationEvent (dispatch): Synchronize on notifier + before calling notifyAll(). + + 2000-07-13 Bryce McKinlay + + Add missing files from last check-in: + * java/awt/image/ImageConsumer.java: New file. + * java/awt/image/ImageProducer.java: New file. + * java/awt/image/ImageObserver.java: New file. + + 2000-07-12 Bryce McKinlay + + Merged implementation of java.applet from classpath: + * java/applet/Applet.java: New file. + * java/applet/AppletContext.java: New file. + * java/applet/AppletStub.java: New file. + * java/applet/AudioClip.java: New file. + + * Makefile.am: Added new java.applet classes. + * Makefile.in: Rebuilt. + + 2000-07-12 Bryce McKinlay + + AWT Stuff: + * java/util/ResourceBundle.java (getLocale): stub. + * Makefile.am: Added new AWT classes. + * Makefile.in: Rebuilt. + * java/awt/AWTEvent.java: Add EVENT_MASK constants, isConsumed, + constructors. Fix toString() and paramString(). + * java/awt/AWTEventMulticaster.java: New class. Implemented. + * java/awt/CheckboxGroup.java: New class. + * java/awt/ColorModel.java: New class. + * java/awt/Component.java: Added stubs for most methods. Implemented + event dispatch. + * java/awt/Container.java: ditto. + * java/awt/ComponentOrientation.java: New class. Partly implemented. + * java/awt/Cursor.java: ditto. + * java/awt/Event.java: Fix paramString(). + * java/awt/EventQueue.java: New class. Implemented. + * java/awt/Font.java: Added additional stub methods. Implemented + toString(). + * java/awt/FontMetrics.java: New class. Stubbed. + * java/awt/GraphicsConfiguration.java: New class. Complete, except for + Java2D parts. + * java/awt/Insets.java: New class. Implemented. + * java/awt/Menu.java: Add new methods. Partially implemented. + * java/awt/MenuItem.java: Add new methods and fields. Partially + implemented. + * java/awt/MenuShortcut.java: New class. Implemented. + * java/awt/Panel.java: New class. Placeholder. + * java/awt/PopupMenu.java: New class. Stubbed. + * java/awt/Rectangle.java: New class. Implemented. + * java/awt/Toolkit.java: Added getSystemEventQueue() stub. + * java/awt/event/ActionEvent.java: Implement paramString(). + * java/awt/event/AdjustmentEvent.java: Implement paramString(). + * java/awt/event/ComponentEvent.java: Implement paramString(). + * java/awt/event/ContainerEvent.java: Implement paramString(). + * java/awt/event/FocusEvent.java: Implement paramString(). + * java/awt/event/HierarchyBoundsAdapter.java: New class. + * java/awt/event/HierarchyBoundsListener.java: New class. + * java/awt/event/HierarchyEvent.java: New class. + * java/awt/event/HierarchyListener.java: New class. + * java/awt/event/InputMethodEvent.java: Implement paramString(). + * java/awt/event/InvocationEvent.java: Implement paramString(). Throw + exception if !catchExceptions. + * java/awt/event/ItemEvent.java: Implement paramString(). + * java/awt/event/KeyEvent.java: Implement paramString(). + * java/awt/event/MouseEvent.java: Implement paramString(). + * java/awt/event/PaintEvent.java: Implement paramString(). + * java/awt/event/TextEvent.java: Implement paramString(). + * java/awt/event/WindowEvent.java: Implement paramString(). + + AWT Peer interfaces: + * java/awt/peer/ButtonPeer.java: New file. + * java/awt/peer/ListPeer.java: New file. + * java/awt/peer/CanvasPeer.java: New file. + * java/awt/peer/MenuBarPeer.java: New file. + * java/awt/peer/CheckboxMenuItemPeer.java: New file. + * java/awt/peer/MenuComponentPeer.java: New file. + * java/awt/peer/CheckboxPeer.java: New file. + * java/awt/peer/MenuItemPeer.java: New file. + * java/awt/peer/ChoicePeer.java: New file. + * java/awt/peer/MenuPeer.java: New file. + * java/awt/peer/ComponentPeer.java: Implemented. + * java/awt/peer/PanelPeer.java: New file. + * java/awt/peer/ContainerPeer.java: Implemented. + * java/awt/peer/PopupMenuPeer.java: New file. + * java/awt/peer/DialogPeer.java: New file. + * java/awt/peer/ScrollPanePeer.java: New file. + * java/awt/peer/FileDialogPeer.java: New file. + * java/awt/peer/ScrollbarPeer.java: New file. + * java/awt/peer/FontPeer.java: New file. + * java/awt/peer/TextAreaPeer.java: New file. + * java/awt/peer/FramePeer.java: Implemented. + * java/awt/peer/TextComponentPeer.java: New file. + * java/awt/peer/LabelPeer.java: New file. + * java/awt/peer/TextFieldPeer.java: New file. + * java/awt/peer/LightweightPeer.java: New file. + * java/awt/peer/WindowPeer.java: Implemented. + + 2000-07-06 Tom Tromey + + * java/lang/natClassLoader.cc (_Jv_PrepareCompiledClass): + Initialize static final String fields. + + 2000-07-03 Tom Tromey + + * java/io/PrintWriter.java (print): Call write(String), not + print(String). See PR libgcj/277. + (print(String)): Use write, not out.write. + + 2000-06-30 Tom Tromey + + * include/jni.h: Include . Fixes PR libgcj/270. + + 2000-06-27 Andrew Haley + + * java/io/File.java (createTempFile): Close the FileDescriptor + used to create a temp file. Fixes some of PR 203. + * java/io/natFileDescriptorPosix.cc (open): Call garbage + collection if we run out of file handles. + + 2000-06-28 Warren Levy + + * gnu/java/security/provider/Gnu.java: New file. + * gnu/java/security/provider/SHA.java: New file. + * gnu/java/security/provider/SHA1PRNG.java: New file. + * Makefile.am: Added the above files. + * Makefile.in: Rebuilt. + + * java/io/ObjectStreamClass.java (setUID): Use Gnu SHA instead of SHS. + + 2000-06-28 Bryce McKinlay + + * java/lang/ThreadGroup.java: Added synchronized flag to many methods. + (destroyed_flag): Removed. + (isDestroyed, removeGroup, removeThread): Test for parent == null. + (activeCount): Added spec note. + + 2000-06-27 Warren Levy + + * java/security/Principal.java: New file. + * Makefile.am: Added Principal.java. + * Makefile.in: Rebuilt. + + 2000-06-27 Rolf W. Rasmussen + + * java/awt/event/MouseEvent.java: Fixed coordinate space + confusion. + + 2000-06-27 Tom Tromey + + * java/io/PushbackInputStream.java (read): If there are characters + in the buffer, don't also call super.read(). + * java/io/PushbackReader.java (read): If there are characters in + the buffer, don't also call super.read(). + + * java/lang/Double.java (valueOf): Call parseDouble(). + + 2000-06-26 Warren Levy + + * java/beans/PropertyChangeEvent.java (oldVal): Renamed to oldValue. + (newVal): Renamed to newValue. + * java/beans/PropertyVetoException.java (changeEvent): Renamed to evt. + * java/beans/beancontext/BeanContextServiceRevokedEvent.java + (revokeNow): Renamed to invalidateRefs. + * java/io/OptionalDataException.java: Updated FIXME. + (eof): New placeholder field. + (length); Ditto. + * java/io/WriteAbortedException.java (message): Made transient. + * java/lang/ClassNotFoundException.java: Updated comments for JDK 1.2. + * java/lang/Throwable.java (stackTrace): Made transient. + * java/net/InetAddress.java: Made Serializable. + * java/security/KeyPair.java: Made Serializable. + * java/security/Provider.java: Replaced with Classpath version that + implements serialization and proper methods. + * java/text/ChoiceFormat.java (strings): Renamed to choiceFormats. + (limits): Renamed to choiceLimits. + + 2000-06-24 Tom Tromey + + * java/lang/natDouble.cc (parseDouble): Renamed from + doubleValueOf. + * java/lang/Double.java (parseDouble): Renamed from + doubleValueOf. Now public. + + 2000-06-23 Andrew Haley + + * java/lang/ieeefp.h: Handle ia64, fr30, mcore. + * java/lang/natThrowable.cc: On IA-64, use __ia64_backtrace. + + 2000-06-23 Tom Tromey + + * java/lang/reflect/natMethod.cc: Include . + * java/lang/natDouble.cc: Always include . + Fix for PR libgcj/267. + + 2000-06-21 Bryce McKinlay + + * java/lang/ThreadGroup.java (add(Thread)): Rename to addThread() to + comply with classpath VM spec. + (add(Group)): Rename to addGroup(). + * java/lang/Thread.java (Thread): Use addThread(). + * java/lang/natThread.cc (finish_): Use removeThread(). + + 2000-06-20 Bryce McKinlay + + * java/lang/ThreadGroup.java: Merged with classpath. + * prims.cc (_Jv_RunMain): Don't use `main_group'. + * gnu/gcj/runtime/FirstThread.java: Remove ThreadGroup constructor + argument. + * java/lang/Thread.java (Thread): Bootstrap initial thread from + ThreadGroup.root if Thread.currentThread is null. Honour the + ThreadGroup's max priority setting. + + 2000-06-18 Tom Tromey + + * java/lang/natClass.cc (forName): Removed dead code. Initialize + returned class. For PR gcj/260. + + 2000-06-16 Tom Tromey + + Fix for PR libgcj/261: + * include/win32-signal.h (MAKE_THROW_FRAME): Added `_exception' + argument. + * include/sparc-signal.h (MAKE_THROW_FRAME): Added `_exception' + argument. (This is a patch from long ago that somehow went + missing.) + + 2000-06-15 Tom Tromey + + * gnu/gcj/convert/natIconv.cc (iconv_adapter): New function. + (read): Use it. + (write): Likewise. + + 2000-06-15 Bryce McKinlay + + Fix for PR java.lang/258: + * prims.cc (_Jv_PrimClass): Set state of primitive class to + JV_STATE_DONE, to prevent accidental initialization. + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Call + _Jv_InterfaceAssignableFrom if target is an interface and source is an + interface or an abstract class. Remove redundant initializeClass calls. + Remove duplicate if_idt test. + (_Jv_InterfaceAssignableFrom): New function. + * java/lang/Class.h (_Jv_InterfaceAssignableFrom): Prototype. + + 2000-05-31 Tom Tromey + + * prims.cc (DECLARE_PRIM_TYPE): Define a vtable as well. + (_Jv_PrimClass): Set `methods' by calling _Jv_FindArrayClass. + * include/jvm.h (struct _Jv_ArrayVTable): Declare. + (NUM_OBJECT_METHODS): New define. + * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Added + `array_vtable' parameter. Added assertion. + * java/lang/Class.h (_Jv_FindArrayClass): Added `array_vtable' + parameter. + + 2000-05-31 Bryce McKinlay + + * gcj/cni.h: Include . + * defineclass.cc: Include . + * interpret.cc: Ditto. + * gij.cc: Include . + + 2000-05-30 Tom Tromey + + * include/name-finder.h: Include . + (_Jv_name_finder::pid): Now of type `pid_t'. + (_Jv_name_finder::~_Jv_name_finder): Call waitpid(). + * java/lang/Throwable.java (CPlusPlusDemangler.close): Call + `proc.waitFor()'. + + 2000-05-24 Warren Levy + + * java/io/ObjectOutputStream.java (writeObject): Use component type + when writing arrays. + Fixed typo. + + 2000-05-20 Bryce McKinlay + + Fix for PR libgcj/226: + * java/lang/Class.h (_Jv_InitClass): Don't call __builtin_expect, + since this is an installed header. + + Fix for PR libgcj/228: + * java/util/zip/ZipFile (getInputStream): Create inflater with + nowrapper option. + + * java/util/zip/natInflater.cc (inflate): Throw zlib's error message + with DataFormatException. + + 2000-05-20 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (hack1): Removed. + (awto_files): Likewise. + (libgcjawt_la_SOURCES): Likewise. + (EXTRA_libgcjawt_la_SOURCES): Likewise. + (libgcjawt_la_DEPENDENCIES): Likewise. + (libgcjawt_la_LIBADD): Likewise. + (libgcjawt_la_LDFLAGS): Likewise. + (libgcjawt_la_LINK): Likewise. + ($(awt_java_source_files:.java=.class)): Likewise. + (libgcj.zip): Don't depend on AWT files. + (MOSTLYCLEANFILES): Don't include AWT files. + ($(awto_files)): Removed. + (nat_headers): Removed AWT files. + (cond_awt_java_source_files): Removed. + (ordinary_java_source_files): Added awt_java_source_files. + * libgcj.spec.in (*lib): Removed -lgcjawt. + * configure: Rebuilt. + * configure.in: Removed --enable-java-awt option. + + 2000-05-20 Bryce McKinlay + + * java/util/zip/ZipEntry.java: Implement Cloneable, per JDK1.2 docs. + (ZipEntry): Copy the `name' field. + (clone): Implement JDK1.2 method. + (setCompressedSize): ditto. + (hashCode): ditto. + + 2000-05-19 Tom Tromey + + * java/io/BufferedWriter.java: Merged with Classpath. + * java/io/BufferedOutputStream.java: Merged with Classpath. + + 2000-05-16 Andrew Haley + + * sysdep/ia64.c (ia64_backtrace_helper): Pass NULL pointer to + build_ia64_frame_state. + * sysdep/ia64-frame.h (build_ia64_frame_state): Match with + defintion in gcc. + + 2000-05-15 Warren Levy + + * gnu/gcj/beans/BeanInfoEmbryo.java: Removed. + * gnu/gcj/beans/EmptyBeanInfo.java: Removed. + * gnu/gcj/beans/ExplicitBeanInfo.java: Removed. + * gnu/gcj/beans/IntrospectionIncubator.java: Removed. + * gnu/gcj/beans/editors/ColorEditor.java: Removed. + * gnu/gcj/beans/editors/FontEditor.java: Removed. + * gnu/gcj/beans/editors/NativeBooleanEditor.java: Removed. + * gnu/gcj/beans/editors/NativeByteEditor.java: Removed. + * gnu/gcj/beans/editors/NativeDoubleEditor.java: Removed. + * gnu/gcj/beans/editors/NativeFloatEditor.java: Removed. + * gnu/gcj/beans/editors/NativeIntEditor.java: Removed. + * gnu/gcj/beans/editors/NativeLongEditor.java: Removed. + * gnu/gcj/beans/editors/NativeShortEditor.java: Removed. + * gnu/gcj/beans/editors/StringEditor.java: Removed. + * gnu/gcj/beans/info/ComponentBeanInfo.java: Removed. + * gnu/gcj/io/ClassLoaderObjectInputStream.java: Removed. + * gnu/gcj/io/NullOutputStream.java: Removed. + * gnu/gcj/io/ObjectIdentityWrapper.java: Removed. + * gnu/gcj/lang/ArrayHelper.java: Removed. + * gnu/gcj/lang/ClassHelper.java: Removed. + * gnu/gcj/lang/reflect/TypeSignature.java: Removed. + + * gnu/java/beans/BeanInfoEmbryo.java: New file. + * gnu/java/beans/EmptyBeanInfo.java: New file. + * gnu/java/beans/ExplicitBeanInfo.java: New file. + * gnu/java/beans/IntrospectionIncubator.java: New file. + * gnu/java/beans/editors/ColorEditor.java: New file. + * gnu/java/beans/editors/FontEditor.java: New file. + * gnu/java/beans/editors/NativeBooleanEditor.java: New file. + * gnu/java/beans/editors/NativeByteEditor.java: New file. + * gnu/java/beans/editors/NativeDoubleEditor.java: New file. + * gnu/java/beans/editors/NativeFloatEditor.java: New file. + * gnu/java/beans/editors/NativeIntEditor.java: New file. + * gnu/java/beans/editors/NativeLongEditor.java: New file. + * gnu/java/beans/editors/NativeShortEditor.java: New file. + * gnu/java/beans/editors/StringEditor.java: New file. + * gnu/java/beans/info/ComponentBeanInfo.java: New file. + * gnu/java/io/ClassLoaderObjectInputStream.java: New file. + * gnu/java/io/NullOutputStream.java: New file. + * gnu/java/io/ObjectIdentityWrapper.java: New file. + * gnu/java/lang/ArrayHelper.java: New file. + * gnu/java/lang/ClassHelper.java: New file. + * gnu/java/lang/reflect/TypeSignature.java: New file. + + * Makefile.am: Updated for moving Classpath files from gnu/gcj + namespace back to the original Classpath gnu/java namespace. + * Makefile.in: Rebuilt. + + * java/beans/Beans.java: Namespace change. + * java/beans/EventSetDescriptor.java: Namespace change. + * java/beans/Introspector.java: Namespace change. + * java/beans/PropertyEditorManager.java: Namespace change. + * java/io/ObjectInputStream.java: Namespace change. + * java/io/ObjectOutputStream.java: Namespace change. + * java/io/ObjectStreamClass.java: Namespace change. + * java/io/ObjectStreamField.java: Namespace change. + + 2000-04-21 Warren Levy + + * java/io/ObjectInputStream.java: Reverted workarounds of 2000-04-13 + now that compiler patch is available. + Removed unneeded System.loadLibrary. + * java/io/ObjectOutputStream.java: Removed unneeded System.loadLibrary. + * java/io/ObjectStreamClass.java: Removed unneeded System.loadLibrary. + + 2000-04-19 Andrew Haley + + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Make sure source + and target classes have been initialized. + + 2000-04-19 Andrew Haley + + * java/lang/String.java: implement Serializable, Comparable. + (compareTo (Object)): New method. + + 2000-04-19 Warren Levy + + * java/io/ObjectStreamClass.java (getDefinedSUID): Use getDeclaredField + instead of getField to retrieve non-public field. + (getSerialPersistantFields): Ditto. + + 2000-04-18 Warren Levy + + * mauve-libgcj: Turned off object serialization tests temporarily + due to compiler error. + + 2000-04-17 Warren Levy + + * java/io/ObjectInputStream.java (DEBUG): Disabled unused method + to avoid build problem. + (DEBUGln): Ditto. + * mauve-libgcj: Turned on object serialization tests. + + 2000-04-17 Tom Tromey + + * libgcj.spec.in (*lib): Added -lgcjawt. + + 2000-04-17 Andrew Haley + + * Makefile.am: Add new files: + gnu/gcj/io/SimpleSHSStream.java, gnu/gcj/io/natSimpleSHSStream.cc, + gnu/gcj/io/shs.cc. + * Makefile.in: Rebuilt. + + * java/lang/natClass.cc (_Jv_IsAssignableFrom): Check for an + interface that has no implementations. + Check for an attempt to assign an abstract class to an interface. + + * java/io/ObjectStreamClass.java (setUID): Use a SimpleSHSStream + if we fail to find MessageDigest.getInstance ("SHA"). + + * gnu/gcj/io/SimpleSHSStream.java: New file. + * gnu/gcj/io/natSimpleSHSStream.java: New file. + * gnu/gcj/io/shs.cc: New file. + * gnu/gcj/io/shs.h: new file. + + * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Make arrays + serializable. + + * gnu/gcj/lang/reflect/TypeSignature.java: Don't remove + punctuation from the classname of an array element. + + * gcj/javaprims.h: Add SimpleDigestStream. + + 2000-04-17 Andrew Haley + + * java/lang/natClass.cc (getPrivateField): Make recursive calls + to getPrivateField for superclasses. + + 2000-04-14 Andrew Haley + + * Makefile.am: Add new files: + java/io/ObjectOutputStream$PutField.h, + java/io/ObjectInputStream$GetField.h,java/io/natObjectInputStream.cc, + java/io/natObjectOutputStream.cc + * Makefile.in: Rebuilt. + * gcj/Makefile.in: Rebuilt. + * include/Makefile.in: Rebuilt. + * java/lang/Class.h (getPrivateField): New method. + (getPrivateMethod): Ditto. + Make java::io::ObjectOutputStream, java::io::ObjectInputStream, + and java::io::ObjectStreamClass our friends. + * java/lang/natClass.cc (getPrivateField): New method. + (getPrivateMethod): Ditto. + (_Jv_IsAssignableFrom): Return false for Interface with no IDT. + * gcj/javaprims.h: Add serialization classes. + * java/io/ObjectInputStream.java (setBooleanField): Rewrite in Java. + (setByteField): Ditto. + (setCharField): Ditto. + (setDoubleField): Ditto. + (setFloatField): Ditto. + (setIntField): Ditto. + (setLongField): Ditto. + (setShortField): Ditto. + (setObjectField): Ditto. + * java/io/ObjectOutputStream.java: (getBooleanField): Rewrite in + Java. + (getByteField): Ditto. + (getCharField): Ditto. + (getDoubleField): Ditto. + (getFloatField): Ditto. + (getIntField): Ditto. + (getLongField): Ditto. + (getShortField): Ditto. + (getObjectField): Ditto. + * java/io/ObjectStreamClass.java (hasClassInitializer): Rewrite in + Java. + (getSerialPersistantFields): Ditto. + (getDefinedSUID): Ditto. + * java/io/natObjectOutputStream.cc: New file. + * java/io/natObjectInputStream.cc: New file. + + 2000-04-13 Warren Levy + + * java/io/ObjectInputStream.java: Temporary workarounds for compiler + problems. Revert to previous version to reproduce and when fixed. + + 2000-04-13 Warren Levy + + * gnu/gcj/io/ClassLoaderObjectInputStream.java: New file. + * gnu/gcj/io/NullOutputStream.java: New file. + * gnu/gcj/lang/reflect/TypeSignature.java: New file. + * java/io/BlockDataException.java: New file. + * java/io/Externalizable.java: New file. + * java/io/InvalidClassException.java: New file. + * java/io/InvalidObjectException.java: New file. + * java/io/NotActiveException.java: New file. + * java/io/NotSerializableException.java: New file. + * java/io/ObjectInput.java: New file. + * java/io/ObjectInputStream.java: New file. + * java/io/ObjectInputValidation.java: New file. + * java/io/ObjectOutput.java: New file. + * java/io/ObjectOutputStream.java: New file. + * java/io/ObjectStreamClass.java: New file. + * java/io/ObjectStreamConstants.java: New file. + * java/io/ObjectStreamField.java: New file. + * java/io/Replaceable.java: New file. + * java/io/Resolvable.java: New file. + * java/io/SerializablePermission.java: New file. + * java/io/WriteAbortedException.java: New file. + * java/security/BasicPermission.java: New file. + * java/security/DigestOutputStream.java: New file. + * java/security/Guard.java: New file. + * java/security/Permission.java: New file. + * java/security/PermissionCollection.java: New file. + * Makefile.am: Added above files. + * Makefile.in: Rebuilt. + + * java/beans/Beans.java (instantiate): Activated serialization code. + * java/lang/SecurityManager.java (checkPermission): New method. + + 2000-04-12 Warren Levy + + * gnu/gcj/beans/BeanInfoEmbryo.java: New file. + * gnu/gcj/beans/EmptyBeanInfo.java: New file. + * gnu/gcj/beans/ExplicitBeanInfo.java: New file. + * gnu/gcj/beans/IntrospectionIncubator.java: New file. + * gnu/gcj/beans/editors/ColorEditor.java: New file. + * gnu/gcj/beans/editors/FontEditor.java: New file. + * gnu/gcj/beans/editors/NativeBooleanEditor.java: New file. + * gnu/gcj/beans/editors/NativeByteEditor.java: New file. + * gnu/gcj/beans/editors/NativeDoubleEditor.java: New file. + * gnu/gcj/beans/editors/NativeFloatEditor.java: New file. + * gnu/gcj/beans/editors/NativeIntEditor.java: New file. + * gnu/gcj/beans/editors/NativeLongEditor.java: New file. + * gnu/gcj/beans/editors/NativeShortEditor.java: New file. + * gnu/gcj/beans/editors/StringEditor.java: New file. + * gnu/gcj/beans/info/ComponentBeanInfo.java: New file. + * gnu/gcj/io/ObjectIdentityWrapper.java: New file. + * gnu/gcj/lang/ArrayHelper.java: New file. + * gnu/gcj/lang/ClassHelper.java: New file. + * java/beans/BeanDescriptor.java: New file. + * java/beans/BeanInfo.java: New file. + * java/beans/Beans.java: New file. + * java/beans/Customizer.java: New file. + * java/beans/DesignMode.java: New file. + * java/beans/EventSetDescriptor.java: New file. + * java/beans/FeatureDescriptor.java: New file. + * java/beans/IndexedPropertyDescriptor.java: New file. + * java/beans/IntrospectionException.java: New file. + * java/beans/Introspector.java: New file. + * java/beans/MethodDescriptor.java: New file. + * java/beans/ParameterDescriptor.java: New file. + * java/beans/PropertyChangeEvent.java: New file. + * java/beans/PropertyChangeListener.java: New file. + * java/beans/PropertyChangeSupport.java: New file. + * java/beans/PropertyDescriptor.java: New file. + * java/beans/PropertyEditor.java: New file. + * java/beans/PropertyEditorManager.java: New file. + * java/beans/PropertyEditorSupport.java: New file. + * java/beans/PropertyVetoException.java: New file. + * java/beans/SimpleBeanInfo.java: New file. + * java/beans/VetoableChangeListener.java: New file. + * java/beans/VetoableChangeSupport.java: New file. + * java/beans/Visibility.java: New file. + * java/beans/beancontext/BeanContext.java: New file. + * java/beans/beancontext/BeanContextChild.java: New file. + * java/beans/beancontext/BeanContextChildComponentProxy.java: New file. + * java/beans/beancontext/BeanContextChildSupport.java: New file. + * java/beans/beancontext/BeanContextContainerProxy.java: New file. + * java/beans/beancontext/BeanContextEvent.java: New file. + * java/beans/beancontext/BeanContextMembershipEvent.java: New file. + * java/beans/beancontext/BeanContextMembershipListener.java: New file. + * java/beans/beancontext/BeanContextProxy.java: New file. + * java/beans/beancontext/BeanContextServiceAvailableEvent.java: + New file. + * java/beans/beancontext/BeanContextServiceProvider.java: New file. + * java/beans/beancontext/BeanContextServiceProviderBeanInfo.java: + New file. + * java/beans/beancontext/BeanContextServiceRevokedEvent.java: New file. + * java/beans/beancontext/BeanContextServiceRevokedListener.java: + New file. + * java/beans/beancontext/BeanContextServices.java: New file. + * java/beans/beancontext/BeanContextServicesListener.java: New file. + * java/util/AbstractCollection.java: New file. + * java/util/AbstractList.java: New file. + * java/util/Arrays.java: New file. + * Makefile.am: Added above files. + * Makefile.in: Rebuilt. + + 2000-04-11 Warren Levy + + * java/awt/AWTError.java: New file. + * java/awt/AWTEvent.java: New file. + * java/awt/AWTException.java: New file. + * java/awt/ActiveEvent.java: New file. + * java/awt/Adjustable.java: New file. + * java/awt/BorderLayout.java: New file. + * java/awt/Color.java: New file. + * java/awt/Component.java: New file. + * java/awt/Container.java: New file. + * java/awt/Dimension.java: New file. + * java/awt/Event.java: New file. + * java/awt/Font.java: New file. + * java/awt/Frame.java: New file. + * java/awt/Graphics.java: New file. + * java/awt/IllegalComponentStateException.java: New file. + * java/awt/Image.java: New file. + * java/awt/ItemSelectable.java: New file. + * java/awt/LayoutManager.java: New file. + * java/awt/LayoutManager2.java: New file. + * java/awt/Menu.java: New file. + * java/awt/MenuBar.java: New file. + * java/awt/MenuComponent.java: New file. + * java/awt/MenuContainer.java: New file. + * java/awt/MenuItem.java: New file. + * java/awt/Paint.java: New file. + * java/awt/PaintContext.java: New file. + * java/awt/Point.java: New file. + * java/awt/Rectangle.java: New file. + * java/awt/Shape.java: New file. + * java/awt/TextArea.java: New file. + * java/awt/TextComponent.java: New file. + * java/awt/Toolkit.java: New file. + * java/awt/Transparency.java: New file. + * java/awt/Window.java: New file. + * java/awt/natToolkit.cc: New file. + * java/awt/event/AWTEventListener.java: New file. + * java/awt/event/ActionEvent.java: New file. + * java/awt/event/ActionListener.java: New file. + * java/awt/event/AdjustmentEvent.java: New file. + * java/awt/event/AdjustmentListener.java: New file. + * java/awt/event/ComponentAdapter.java: New file. + * java/awt/event/ComponentEvent.java: New file. + * java/awt/event/ComponentListener.java: New file. + * java/awt/event/ContainerAdapter.java: New file. + * java/awt/event/ContainerEvent.java: New file. + * java/awt/event/ContainerListener.java: New file. + * java/awt/event/FocusAdapter.java: New file. + * java/awt/event/FocusEvent.java: New file. + * java/awt/event/FocusListener.java: New file. + * java/awt/event/InputEvent.java: New file. + * java/awt/event/InputMethodEvent.java: New file. + * java/awt/event/InputMethodListener.java: New file. + * java/awt/event/InvocationEvent.java: New file. + * java/awt/event/ItemEvent.java: New file. + * java/awt/event/ItemListener.java: New file. + * java/awt/event/KeyAdapter.java: New file. + * java/awt/event/KeyEvent.java: New file. + * java/awt/event/KeyListener.java: New file. + * java/awt/event/MouseAdapter.java: New file. + * java/awt/event/MouseEvent.java: New file. + * java/awt/event/MouseListener.java: New file. + * java/awt/event/MouseMotionAdapter.java: New file. + * java/awt/event/MouseMotionListener.java: New file. + * java/awt/event/PaintEvent.java: New file. + * java/awt/event/TextEvent.java: New file. + * java/awt/event/TextListener.java: New file. + * java/awt/event/WindowAdapter.java: New file. + * java/awt/event/WindowEvent.java: New file. + * java/awt/event/WindowListener.java: New file. + * java/awt/geom/Dimension2D.java: New file. + * java/awt/geom/Point2D.java: New file. + * java/awt/peer/ComponentPeer.java: New file. + * java/awt/peer/ContainerPeer.java: New file. + * java/awt/peer/FramePeer.java: New file. + * java/awt/peer/WindowPeer.java: New file. + * java/util/Collection.java: New file. + * java/util/Comparator.java: New file. + * java/util/Iterator.java: New file. + * java/util/List.java: New file. + * java/util/ListIterator.java: New file. + * Makefile.am: Added above files. + * Makefile.in: Rebuilt. + + 2000-04-10 Warren Levy + + * gnu/gcj/runtime/MethodInvocation.java: Fixed copyright. + * java/lang/FirstThread.java: Ditto. + * java/lang/StringBuffer.java: Ditto. + * mauve-libgcj: Turned on java.math, java.sql and java.security tests. + + * gnu/gcj/math/MPN.java (rshift): Undid Boehm's patch of 03-14. + Special case handled in java.math.BigInteger. + * java/math/BigInteger.java (divide): Handle the special case when + dividing by 1 and the high bit of the dividend is set. + (setShiftRight): Handle case when count == 0. + + 2000-04-05 Andrew Haley + + * java/net/URL.java (setURLStreamHandler): Make "file" protocol a + special case. + + 2000-04-05 Andrew Haley + + * sysdep/ia64.c (rse_address_add): Delete. + (IS_NaT_COLLECTION_ADDR): Delete. + (ia64_backtrace_helper): check for null unwind_info. + + * sysdep/ia64-frame.h: add calc_caller_bsp. + + * java/lang/natThrowable.cc (printRawStackTrace): Flush + PrintWriter. + + * prims.cc (_Jv_divI): Use _Jv_ThrowSignal. + (_Jv_remI): Likewise. + (_Jv_divJ): Likewise. + (_Jv_remJ): Likewise. + + * interpret.cc (continue1): Use divide subroutines to guarantee + correct Java standard behaviour. + Floating-point division should not abort; make it so. + + 2000-03-29 Tom Tromey + + * configure: Rebuilt. + * configure.in: Test against `libgcj_sjlj', not + `enable_sjlj_exceptions'. Rearranged code to allow SYSDEP_SOURCES + to be set even when using sjlj. + + 2000-03-24 Andrew Haley + + * Makefile.am: Add file addr2name.awk. + * Makefile.in: Rebuilt. + * addr2name.awk: New file. + * name-finder.cc (_Jv_name_finder): Call addr2name.awk to do name + lookups on ia64. + * java/lang/natThrowable.cc(printRawStackTrace): Don't print out a + blank line. + + 2000-03-22 Andrew Haley + + * configure.host: Add -funwind-tables for IA64. + * Makefile.am (c_source_files): Add SYSDEP_SORCES. + * Makefile.in: Rebuilt. + * java/lang/natThrowable.cc (fillInStackTrace): Add ia64 case. + * sysdep/ia64.c: New file. + * sysdep/ia64-frame.h: New file. + * configure.in: Add sysdep/ia64.c for ia64. + * configure: Rebuilt. + + 2000-03-17 Andrew Haley + + * java/lang/natString.cc: Remove `register' keyword. + interpret.cc: ditto. + + 2000-03-16 Andrew Haley + + * configure.host (ia64): Enable interpreter. + + 2000-03-14 Hans Boehm + + * gnu/gcj/math/MPN.java (rshift): Handle shift 32 specially. + + 2000-03-14 Andrew Haley + + * include/default-signal.h (MAKE_THROW_FRAME): Add arg + `_exception'. + + 2000-03-10 Andrew Haley + + * java/lang/ieeefp.h: Import latest version from fdlibm. + + 2000-03-14 Andrew Haley + + * prims.cc (_Jv_ThrowSignal): New function. + (catch_segv): Add arg `_exception' to MAKE_THROW_FRAME. + (catch_fpe): Ditto. + * include/sparc-signal.h (MAKE_THROW_FRAME): Ditto + * include/i386-signal.h (MAKE_THROW_FRAME): Ditto. + * include/ppc-signal.h: New file. + + 2000-05-18 Bryce McKinlay + + * java/lang/Thread.java: Declare `data' as Object, not RawData. + * java/lang/natThread.java (initialize_native): Cast `data' to + jobject. + * gnu/gcj/RawData.java: Clarify documentation. + + From Gregory R. Warnes : + * gnu/gcj/protocol/jar/Connection.java (getJarFile): Test for null + `jarFile', not `jarFileURL'. + + 2000-05-15 Andrew Haley + + * include/ppc-signal.h: New file. + + 2000-05-11 Tom Tromey + + * java/util/zip/ZipInputStream.java (getNextEntry): When reading + file headers, don't include `size' in the skip call. + + 2000-05-10 Bryce McKinlay + + * java/lang/StringBuffer.java (delete): Call arrayCopy() correctly. + Avoid arrayCopy() call where possible. Update `count' _after_ calling + arrayCopy(). + (replace): Reimplemented. Fix javadoc. + (reverse): Call ensureCapacity_unsynchronized(). + (StringBuffer (String)): Use DEFAULT_CAPACITY. + + (replace): Calculate length for arraycopy() correctly. + + 2000-05-09 Tom Tromey + + * java/lang/StringBuffer.java (toString): Don't mark buffer as + shared. + (insert(int,char[],int,int): New method. + (delete): New method from Classpath. + (deleteCharAt): Likewise. + (substring): Likewise. + (shared): No longer private. + Added JavaDoc comments from Classpath. + * java/lang/String.java (String(StringBuffer)): Ensure `buffer' is + shared. + + 2000-05-07 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (LIBLINK): New macro. + (libgcj_la_LINK): Use it. + (libgcjawt_la_LINK): Likewise. + + 2000-05-06 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (libgcj.zip): Don't pass -L to javac. + + 2000-05-05 Tom Tromey + + Fix for PR libgcj/220: + * Makefile.in: Rebuilt. + * Makefile.am (gij_LDFLAGS): Don't use libstdc++. + (jv_convert_LDFLAGS): Likewise. + (libgcj_la_LDFLAGS): Likewise. + (GCJLINK): New macro. + (jv_convert_LINK): Use it. + (gij_LINK): Likewise. + (libgcj_la_LINK): New macro. + (libgcjawt_la_LINK): Likewise. + + 2000-05-04 Tom Tromey + + * gcj/field.h (JvFieldIsRef): Return false for gnu.gcj.RawData + field. + * boehm.cc (_Jv_MarkObj): Removed dead code. Use `STATIC', not + `0x0008'. + Include Modifier.h. + + 2000-05-05 Bryce McKinlay + + * java/lang/natClass.cc (isInstance): Use __builtin_expect. + (_Jv_IsAssignableFrom): Ditto. + (_Jv_IsInstanceOf): Ditto. + (_Jv_CheckCast): Ditto. + (_Jv_CheckArrayStore): Ditto. + * java/lang/Class.h (_Jv_InitClass): Ditto. + * java/lang/natObject.cc (_Jv_MonitorEnter): __builtin_expect `false', + not `0'. + (notify): Ditto. + (notifyAll): Ditto. + (wait): Ditto. + (_Jv_MonitorExit): Ditto. + * boehm.cc (_Jv_MarkObj): Ditto. + (_Jv_MarkObj): Ditto. + (_Jv_MarkArray): Ditto. + * prims.cc (_Jv_AllocObject): Ditto. + (_Jv_NewObjectArray): Ditto. + (_Jv_NewPrimArray): Ditto. + (_Jv_Malloc): Ditto. + (_Jv_Realloc): Ditto. + (_Jv_MallocUnchecked): Ditto. + (_Jv_divI): Ditto. + (_Jv_remI): Ditto. + (_Jv_divJ): Ditto. + (_Jv_remJ): Ditto. + + 2000-05-04 Tom Tromey + + * java/util/Locale.java (Locale): Don't explicitly check for + null. + * java/util/Hashtable.java (containsKey): Don't explicitly check + for null. + (get): Likewise. + * java/util/BitSet.java (and, or, xor): Don't explicitly check for + null. + * java/util/zip/ZipEntry.java (ZipEntry): Don't explicitly check + for null. + * java/text/StringCharacterIterator.java + (StringCharacterIterator): Don't check for null. + * java/text/ChoiceFormat.java (setChoices): Don't explicitly check + for null pointer. + * java/net/MulticastSocket.java (joinGroup): Don't explicitly + check for null pointer. + (leaveGroup): Likewise. + * java/net/DatagramPacket.java (DatagramPacket): Removed erroneous + comment. + (setData): Likewise. + * java/lang/ThreadGroup.java (ThreadGroup): Don't explicitly check + for `p==null'. + + 2000-04-28 Jakub Jelinek + + * Makefile.am (GCJCOMPILE, JCFLAGS, JF1CLAGS, jv_convert_LINK, + gij_LINK, libgcj.zip, .java=.class): Move -L option out of FLAGS. + (libgcj_la_LDFLAGS): Add -L../libstdc++ for in-gcc builds. + (jv_convert_LDFLAGS, gij_LDFLAGS): Add `pwd`/../libstdc++ to + -rpath for in-gcc builds. + * Makefile.in: Rebuilt. + + 2000-04-28 Tom Tromey + + * libgcj.spec.in (*jc1): Added -fasynchronous-exceptions. + Fix for PR gcj/218. + + 2000-04-28 Bryce McKinlay + + * libjava/java/lang/String.java (toString): Remove `final' hack. + + 2000-04-05 Tom Tromey + + Runtime support for PR gcj/2: + * prims.cc (_Jv_ThrowNullPointerException): New function. + * include/jvm.h (_Jv_ThrowNullPointerException): Declare. + + 2000-04-27 Bryce McKinlay + + * prims.cc (_Jv_NewObjectArray): Fix typo. + + 2000-04-26 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (AM_CXXFLAGS): Added -fasynchronous-exceptions. + + 2000-04-24 Jeff Sturm + + * gnu/gcj/runtime/natFirstThread.cc (run): Initialize class before + calling main. + + 2000-04-22 Anthony Green + + * include/jvm.h (__builtin_expect): Define as unused for now. + * java/lang/natObject.cc (_Jv_MonitorEnter): Add __builtin_expect. + (notify): Ditto. + (notifyAll): Ditto. + (wait): Ditto. + (_Jv_MonitorExit): Ditto. + * boehm.cc (_Jv_MarkObj): Ditto. + (_Jv_MarkObj): Ditto. + (_Jv_MarkArray): Ditto. + (_Jv_AllocBytes): Ditto. + * prims.cc (_Jv_AllocObject): Ditto. + (_Jv_NewObjectArray): Ditto. + (_Jv_NewPrimArray): Ditto. + (_Jv_Malloc): Ditto. + (_Jv_Realloc): Ditto. + (_Jv_MallocUnchecked): Ditto. + (_Jv_divI): Ditto. + (_Jv_remI): Ditto. + (_Jv_divJ): Ditto. + (_Jv_remJ): Ditto. + + * include/Makefile.in: Rebuilt. + * include/Makefile.am (include_HEADERS): Add jvmpi.h. + + 2000-04-21 Tom Tromey + + * java/io/PipedInputStream.java, java/io/PipedOutputStream.java: + Yet another new version from Classpath. + + Fix for PR libgcj/15: + * java/util/natGregorianCalendar.cc (_REENTRANT, + _POSIX_PTHREAD_SEMANTICS): Don't define. + * java/net/natInetAddress.cc (_REENTRANT): Don't define. + * java/lang/natSystem.cc (_REENTRANT, _POSIX_PTHREAD_SEMANTICS): + Don't define. + * java/io/natFile.cc (_REENTRANT, _POSIX_PTHREAD_SEMANTICS): Don't + define. + * configure: Rebuilt. + * configure.in: If using POSIX threads, define _REENTRANT if + needed. Define _POSIX_PTHREAD_SEMANTICS. Don't define + GETHOSTBYNAME_R_NEEDS_REENTRANT. + + * java/io/PipedInputStream.java, java/io/PipedReader.java, + java/io/PipedOutputStream.java, java/io/PipedWriter.java: New + version from Classpath. + + Fix for PR libgcj/213: + * Makefile.in: Rebuilt. + * Makefile.am (gij_SOURCES): Added gij.cc. + (EXTRA_gij_SOURCES): Removed. + (gij_LDADD): Removed gij.lo. + (gij_DEPENDENCIES): Likewise. + ($(gij_OBJECTS)): Depend on nat_headers. + + * gnu/gcj/protocol/file/Handler.java (openConnection): Use + `setURL', not `url.set'. + + 2000-04-20 Tom Tromey + + Fix for PR java.io/204: + * java/io/PipedInputStream.java, java/io/PipedReader.java, + java/io/PipedOutputStream.java, java/io/PipedWriter.java: Imported + from Classpath. + + Fix for PR libgcj/212: + * gcj/javaprims.h (_Jv_word, _Jv_word2): Removed definitions. + * include/jvm.h (_Jv_word, _Jv_word2): Define. + * java/lang/Class.h (_Jv_word): Declare. + + * jni.cc (_Jv_JNI_PopSystemFrame): Clear `env->ex'. + + 2000-04-19 Tom Tromey + + * jni.cc (_Jv_JNI_FindClass): Use system class loader if class + doesn't have a loader. + + 2000-04-19 Bryce McKinlay + + * boehm.cc: (_Jv_MarkObj, _Jv_MarkArray): Cast pointers for + MAYBE_MARK to ptr_t, for compatibility with new GC version. + + 2000-04-16 Bryce McKinlay + + * java/io/natFileDescriptorPosix.cc (open): Use mode 0666. Fix for PR + libgcj/202. + (available): Initialize `where' to prevent bogus compiler warning. + + 2000-04-12 Tom Tromey + + * java/lang/natString.cc (intern): Temporarily disable finalizer + registration. + + * java/lang/natString.cc (unintern): Added `obj' argument. + (intern): Register finalizer for string. + * java/lang/String.java (unintern): Now static; added obj + argument. + + 2000-04-11 Tom Tromey + + * java/util/Vector.java (VectorEnumeration): Now `final'. + * java/util/Hashtable.java (HashtableEntry): Now `final'. + (HashtableEnumeration): Likewise. + * java/util/zip/ZipFile.java (ZipEnumeration): Now `final'. + * java/text/RuleBasedCollator.java (RBCElement): Now `final'. + + 2000-04-10 Warren Levy + + * java/io/ObjectStreamException.java: New file. + * java/io/OptionalDataException.java: New file. + * java/io/StreamCorruptedException.java: New file. + * java/math/BigDecimal.java: New file. + * java/sql/CallableStatement.java: New file. + * java/sql/Connection.java: New file. + * java/sql/DataTruncation.java: New file. + * java/sql/DatabaseMetaData.java: New file. + * java/sql/Date.java: New file. + * java/sql/Driver.java: New file. + * java/sql/DriverManager.java: New file. + * java/sql/DriverPropertyInfo.java: New file. + * java/sql/PreparedStatement.java: New file. + * java/sql/ResultSet.java: New file. + * java/sql/ResultSetMetaData.java: New file. + * java/sql/SQLException.java: New file. + * java/sql/SQLWarning.java: New file. + * java/sql/Statement.java: New file. + * java/sql/Time.java: New file. + * java/sql/Timestamp.java: New file. + * java/sql/Types.java: New file. + * Makefile.am: Added above new files. + * Makefile.in: Rebuilt. + + * mauve-libgcj: Turned on java.math, java.sql and java.security tests. + * java/net/MulticastSocket.java (MulticastSocket): Pass values a la + DatagramSocket constructor instead of null. + + 2000-04-08 Anthony Green + + * include/posix-threads.h (_Jv_MutexUnlock): Replace + _JV_NOT_OWNER. + + 2000-04-08 Anthony Green + + * posix-threads.cc (_Jv_MutexLock): Moved back to posix-threads.h. + (_Jv_MutexUnlock): Ditto. + * include/posix-threads.h (_Jv_MutexLock): From posix-threads.cc. + (_Jv_MutexUnlock): Ditto. + + 2000-04-08 Anthony Green + + * java/lang/StringBuffer.java (ensureCapacity): Don't call Math::max. + (ensureCapacity_unsynchronized): New private method. + (append): Use ensureCapacity_unsynchronized. + + 2000-04-08 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added new files. + * java/awt/IllegalComponentStateException.java: New file. + * java/awt/ItemSelectable.java: New file. + * java/awt/event/WindowEvent.java: Finished. + * java/awt/event/TextEvent.java: Finished. + * java/awt/event/ContainerEvent.java: New file. + * java/awt/Component.java (getX, getY): New methods. + * java/awt/event/PaintEvent.java: New file. + * java/awt/event/MouseEvent.java: New file. + * java/awt/ActiveEvent.java: New file. + * java/awt/event/KeyEvent.java: Finished. + * java/awt/event/ItemEvent.java: New file. + * java/awt/Adjustable.java: New file. + * java/awt/event/InputMethodEvent.java: New file. + * java/awt/event/InputEvent.java: Finished. + * java/awt/event/FocusEvent.java: New file. + * java/awt/event/MouseMotionAdapter.java: New file. + * java/awt/event/MouseAdapter.java: New file. + * java/awt/event/KeyAdapter.java: New file. + * java/awt/event/FocusAdapter.java: New file. + * java/awt/event/ContainerAdapter.java: New file. + * java/awt/event/ComponentEvent.java: Finished. + * java/awt/event/AdjustmentEvent.java: New file. + * java/awt/event/ComponentAdapter.java: New file. + * java/awt/event/ActionEvent.java: Finished. + * java/awt/event/MouseMotionListener.java: New file. + * java/awt/event/MouseListener.java: New file. + * java/awt/event/ItemListener.java: New file. + * java/awt/event/InputMethodListener.java: New file. + * java/awt/event/ContainerListener.java: New file. + * java/awt/event/FocusListener.java: New file. + * java/awt/event/ComponentListener.java: New file. + * java/awt/event/AWTEventListener.java: New file. + * java/awt/event/AdjustmentListener.java: New file. + + 2000-04-08 Anthony Green + + * java/lang/natObject.cc (_Jv_MonitorEnter): Only perform null + check when we have to. + + * gcj/array.h: Mark elements(JArray& x) and elements(JArray* + x) as `inline'. + + * java/util/StringTokenizer.java: Minor optimization. Eliminates + one method call. + + * java/util/Vector.java (VectorEnumeration.nextElement): Manually + inline hasMoreElements. + + 2000-04-05 Tom Tromey + + * configure: Rebuilt. + * configure.in: Recognize --enable-java-awt. + (AWT): New conditional. + * Makefile.in: Rebuilt. + * Makefile.am (toolexeclib_LTLIBRARIES): Build libgcjawt.la if + requested. + (libgcjawt_la_SOURCES): New macro. + (EXTRA_libgcjawt_la_SOURCES): Likewise. + (libgcjawt_la_DEPENDENCIES): Likewise. + (libgcjawt_la_LIBADD): Likewise. + (libgcjawt_la_LDFLAGS): Likewise. + (libgcj.zip): Depend on cond_java_awt_source_files + (cond_awt_java_source_files): New macro. + (MOSTLYCLEANFILES): Added awto_files. + (awto_files): New macro. Use where javao_files used. + (nat_headers): Use cond_awt_java_source_files. + + 2000-04-04 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (awt_java_source_files): Added AWTException.java. + * java/awt/AWTException.java: New file. + + 2000-04-03 Tom Tromey + + * include/jvm.h (_Jv_GetArrayElementFromElementType): More + commentary from Alex. + + * Makefile.in: Rebuilt. + * Makefile.am ($(javao_files)): Depend on libgcj.zip. + From H.J. Lu. + + Sun Apr 2 08:27:18 2000 Anthony Green + + * configure: Rebuilt. + * configure.in: Add --disable-jvmpi. + * include/config.h.in: Rebuilt. + * acconfig.h: Add ENABLE_JVMPI. + + * include/jvm.h: Declare _Jv_DisableGC and _Jv_EnableGC. + (_Jv_JVMPI_Notify_OBJECT_ALLOC): New define. + (_Jv_JVMPI_Notify_THREAD_END): New define. + (_Jv_JVMPI_Notify_THREAD_END): New define. + * prims.cc (_Jv_JVMPI_Notify_OBJECT_ALLOC): Declare. + (_Jv_JVMPI_Notify_THREAD_END): Declare. + (_Jv_JVMPI_Notify_THREAD_END): Declare. + + * prims.cc (_Jv_AllocObject): Generate JVMPI object allocation + events. + + * java/lang/natThread.cc: Include JVMPI headers if necessary. + (finish_): Generate JVMPI thread end events. + (run_): Generate JVMPI thread start events. + * gnu/gcj/runtime/natFirstThread.cc (run): Call JNI_OnLoad for any + preloaded JNI library. + Include JVMPI headers if necessary. + (run): Generate JVMPI thread start events. + + * boehm.cc: Define GC_disable and GC_enable. + (_Jv_DisableGC): New function. + (_Jv_EnableGC): New function. + (disable_gc_mutex): Declare. + * nogc.cc (_Jv_DisableGC): New function. + (_Jv_EnableGC): New function. + + * jni.cc (_Jv_JNI_GetEnv): Handle JVMPI interface requests. + (_Jv_JVMPI_Interface): Define. + (jvmpiEnableEvent): New function. + (_Jv_JNI_Init): Initialize _Jv_JVMPI_Interface. + + * include/jvmpi.h: New file. + + 2000-03-27 Bryce McKinlay + + * Makefile.in: New #defines and friends for Thread.h. + * Makefile.am: Ditto. + * posix-threads.cc: (struct starter): Remove `object'. + (_Jv_CondWait): Use interruptable condition variables and new + recursive mutexes. New return codes on interrupt or non-ownership + of mutex. + (_Jv_CondNotify): Ditto. + (_Jv_CondNotifyAll): Ditto. + (_Jv_ThreadInterrupt): Set thread interrupt flag directly. Interrupt + the target thread by signaling its wait condition. + (_Jv_ThreadInitData): Set `thread_obj' in the thread data struct, + not the starter struct. Initialize wait_mutex and wait_cond. + (_Jv_MutexLock): New recursive mutex implementation. Moved from + posix-threads.h. + (_Jv_MutexUnlock): Ditto. + (really_start): Set info->data->thread from pthread_self() to work + around a race condition. Destroy wait_mutex and wait_cond when run() + returns. + * java/lang/Thread.java: (isInterrupted_): Renamed to overloaded + `isInterrupted(boolean)'. Clear interrupted flag if clear_flag is + set. + startable_flag: New private field. + (Thread): Initialize `startable_flag'. + (toString): Check for null thread group. + * java/lang/natThread.cc: (struct natThread): New fields + `join_mutex', `join_cond'. Removed fields `joiner', `next'. + (class locker): Removed. + (initialize_native): Initialize `join_cond' and `join_mutex'. + (interrupt): Now just calls _Jv_ThreadInterrupt(). + (join): Simplified. Just wait on the target thread's join condition. + (finish_): Remove join list code. Unset thread group. Signal + potential joiners by notifying the dying threads join_cond. + (start): Check for illegal restarts. + * java/lang/natObject.cc: Check for return value of _Jv_CondWait and + act appropriatly. + * include/posix-threads.h: Remove all HAVE_RECURSIVE_MUTEX related + #defines and #ifdefs. + (struct _Jv_Thread_t): New fields `thread_obj', `wait_cond', + `wait_mutex', `next'. + (struct _Jv_ConditionVariable_t): Define as a struct instead of + directly mapping to pthread_cond_t. + (struct _Jv_Mutex_t): New recursive implementation. + (_Jv_PthreadCheckMonitor): Reimplemented. Simple `owner' check. + _Jv_HaveCondDestroy: Never define this for posix-threads. + (_Jv_CondNotify): Remove inline implementation(s), prototype instead. + (_Jv_CondNotifyAll): Ditto. + (_Jv_MutexLock): Ditto. + (_Jv_MutexUnlock): Ditto. + (_Jv_MutexInit): Changed to reflect new mutex implementation. + (_Jv_MutexDestroy): Ditto. + (_Jv_CondDestroy): Removed. + (_Jv_PthreadGetMutex): Removed. + * include/win32-threads.h: (_Jv_CondNotify): Guess _JV_NOT_OWNER on an + error. Add a FIXME about this. + (_Jv_CondNotifyAll): Ditto. + * win32-threads.cc: (_Jv_CondWait): Return 0 on a timeout. Guess + _JV_NOT_OWNER on other errors. Add FIXME. + + 2000-03-26 Tom Tromey + + * jni.cc (_Jv_JNI_PopSystemFrame): If environment has exception + set, throw it. + (call): Don't throw exception here. + + 2000-03-26 Tom Tromey + + * java/lang/mprec.h: Use SIZEOF_VOID_P. + * interpret.cc: Use SIZEOF_VOID_P. + * include/java-cpool.h (_Jv_storeLong): Use SIZEOF_VOID_P. + (_Jv_loadLong): Likewise. + (_Jv_storeDouble): Likewise. + * configure: Rebuilt. + * configure.in: Check size of void*. + + * resolve.cc (ncode): Use FFI_PREP_RAW_CLOSURE and FFI_RAW_SIZE. + + 2000-03-26 Hans Boehm + + * include/java-cpool.h (_Jv_storeLong, _Jv_loadLong, + _Jv_storeDouble, _Jv_loadDouble): Define differently on 64 bit + machine. + * java/lang/ieeefp.h: Define __IEEE_BIG_ENDIAN or + __IEEE_LITTLE_ENDIAN appropriately on IA64. + * java/lang/mprec.h: Don't define Pack_32 on 64 bit machine. + * javaprims.h (_Jv_word): Added `l' and `d' entries in 64 bit + case. + * resolve.cc (FFI_PREP_RAW_CLOSURE): New define. + (FFI_RAW_SIZE): Likewise. + (_Jv_InterpMethod::ncode): Use them. + * interpret.cc (PUSHL, PUSHD, POPL, POPD, LOADL, LOADD, STOREL, + STORED): Define differently on a 64 bit machine. + (continue1): Use ffi_java_raw_call when appropriate. + + 2000-03-24 Warren Levy + + * java/math/BigInteger.java(divide): Handle the special case when + dividing by 1 and the high bit of the dividend is set. + (setShiftRight): Handle case when count == 0. + + 2000-03-24 Warren Levy + + * java/awt/Font.java(isBold): Fix syntax error. + (isItalic): ditto. + * java/awt/Frame.java(postEvent): ditto. + * java/awt/Menu.java(postEvent): ditto. + * java/awt/MenuBar.java(postEvent): ditto. + * java/awt/Toolkit.java(init): Included a stub. + + 2000-03-21 Bryce McKinlay + + * java/awt/Event.java: Add all the event type constants. + (Event): Implemented constructors. + (controlDown): Implemented. + (metaDown): Implemented. + (paramString): Stubbed. + (shiftDown): Implemented. + (toString): Implemented. + (translate): Implemented. + + 2000-03-21 Bryce McKinlay + + * java/lang/natClass.cc (isInstance): Initialize `this'. + (isAssignableFrom): Initialize `this' and `klass'. + (_Jv_IsAssignableFrom): If an interface has no idt, it is not + implemented by any loaded class, so return false. + * java/lang/natClass.cc (isInstance): Use _Jv_IsAssignableFrom(), + not Class.isAssignableFrom(). Use JV_CLASS, not getClass(). + + 2000-03-19 Warren Levy + + * java/awt/Color.java: Specified java.io for Serializable. + * java/awt/Toolkit.java: Imported java.net.URL. + + 2000-03-19 Warren Levy + + * java/awt/Color.java: Rewrote to be more memory efficient (& compile). + + 2000-03-16 Warren Levy + + * java/awt/Color.java: New file. + * java/awt/Graphics.java: New file. + * java/awt/Image.java: New file. + * java/awt/Paint.java: New file. + * java/awt/PaintContext.java: New file. + * java/awt/Transparency.java: New file. + * java/util/Collection.java: New file. + * java/util/Comparator.java: New file. + * java/util/Iterator.java: New file. + * java/util/List.java: New file. + * java/util/ListIterator.java: New file. + * Makefile.am: Added above new files. + * Makefile.in: Rebuilt. + + * java/awt/Font.java (PLAIN): New field. + (BOLD): New field. + (ITALIC): New field. + (ROMAN_BASELINE): New field. + (CENTER_BASELINE): New field. + (HANGING_BASELINE): New field. + (name): New field. + (style): New field. + (size): New field. + (pointSize): New field. + (Font): Implemented constructor. + (isPlain): Implemented method. + (isBold): Implemented method. + (isItalic): Implemented method. + (getName): Implemented method. + (getStyle): Implemented method. + (getSize): Implemented method. + (getSize2D): Implemented method. + (decode): Stubbed. + * java/awt/Frame.java (getFont): Stubbed. + (postEvent): Stubbed. + (remove): Stubbed. + * java/awt/Menu.java (postEvent): Stubbed. + * java/awt/MenuBar.java (getFont): Stubbed. + (postEvent): Stubbed. + * java/awt/Toolkit.java (getImage): Added abstract method. + + 2000-03-15 Tom Tromey + + * java/io/natFileDescriptorWin32.cc (winerr): Now static. + + * prims.cc (win32_exception_handler): Reformatted. + + * include/win32-threads.h (_Jv_HaveCondDestroy): New define. + (_Jv_HaveMutexDestroy): Likewise. + + 2000-03-15 Jon Beniston + + * java/io/natFileDescriptorWin32.cc: New file. + * java/io/natFileWin32.cc: New file. + * java/net/natInetAddress.cc: Added conditional inclusion of + Windows / Winsock headers. + * java/net/natPlainDatagramSocketImpl.cc: Added conditional + inclusion of Windows / Winsock headers. + * java/net/natPlainSocketImpl.cc: Added conditional inclusion of + Windows / Winsock headers. + * include/win32-signal.h: New file. + * include/win32-threads.h: New file. + * win32-threads.cc: New file. + * exception.cc (win32_get_restart_frame): New function. + * prims.cc (win32_exception_handler): New function. + (main_init) Performs Winsock initialisation. + (main_init) Installs exeception handler. + + 2000-03-14 Tom Tromey + + * jni.cc (mangled_name): Fixed assertion. + (JNI_GetCreatedJavaVMs): Don't comment out `buf_len' argument; + turned assert into actual failure. + + 2000-03-09 Warren Levy + + * java/security/Key.java(serialVersionUID): Set to 0 for now. + * java/security/interfaces/DSAPrivateKey.java(serialVersionUID): Ditto. + * java/security/interfaces/DSAPublicKey.java(serialVersionUID): Ditto. + + 2000-03-09 Warren Levy + + * java/security/AlgorithmParameterGeneratorSpi.java: New file. + * java/security/DigestException.java: New file. + * java/security/GeneralSecurityException.java: New file. + * java/security/InvalidAlgorithmParameterException.java: New file. + * java/security/InvalidKeyException.java: New file. + * java/security/InvalidParameterException.java: New file. + * java/security/Key.java: New file. + * java/security/KeyException.java: New file. + * java/security/KeyPair.java: New file. + * java/security/KeyPairGenerator.java: New file. + * java/security/KeyPairGeneratorSpi.java: New file. + * java/security/NoSuchProviderException.java: New file. + * java/security/PrivateKey.java: New file. + * java/security/Provider.java: New file. + * java/security/PublicKey.java: New file. + * java/security/SecureRandom.java: New file. + * java/security/Security.java: New file. + * java/security/Signature.java: New file. + * java/security/SignatureException.java: New file. + * java/security/interfaces/DSAKey.java: New file. + * java/security/interfaces/DSAParams.java: New file. + * java/security/interfaces/DSAPrivateKey.java: New file. + * java/security/interfaces/DSAPublicKey.java: New file. + * java/security/interfaces/RSAPrivateCrtKey.java: New file. + * java/security/interfaces/RSAPrivateKey.java: New file. + * java/security/interfaces/RSAPublicKey.java: New file. + * java/security/spec/AlgorithmParameterSpec.java: New file. + * java/security/spec/InvalidKeySpecException.java: New file. + * java/security/spec/InvalidParameterSpecException.java: New file. + * java/security/spec/KeySpec.java: New file. + * java/security/spec/RSAPrivateCrtKeySpec.java: New file. + * java/security/spec/RSAPrivateKeySpec.java: New file. + * java/security/spec/RSAPublicKeySpec.java: New file. + * Makefile.am: Added above java.security files. + * Makefile.in: Rebuilt. + + * java/security/MessageDigest.java: Rewritten. + * java/security/SecureClassLoader.java: Added JDK1.2 comment. + + 2000-03-09 Bryce McKinlay + + * README: Updated. + + 2000-03-09 Bryce McKinlay + + * java/lang/natClassLoader.cc (_Jv_FindArrayClass): Call + _Jv_PrepareConstantTimeTables. + * java/lang/natClass.cc (_Jv_PrepareConstantTimeTables): Array + classes should have an IDT, so don't return if klass is an array + class. + + 2000-03-08 Tom Tromey + + * java/lang/reflect/natArray.cc (newInstance): Don't allow array + of `void' to be created. + + 2000-03-08 Warren Levy + + * java/math/BigInteger.java(signum): Handle zero properly. + + 2000-03-07 Tom Tromey + + * All files: Updated copyright information. + * COPYING: New file. + * COPYING.LIB: Removed. + * LIBGCJ_LICENSE: We now use GPL + special exception. + + 2000-03-07 Bryce McKinlay + + * resolve.cc (_Jv_SearchMethodInClass): New function. + (_Jv_ResolvePoolEntry): Search superinterfaces for interface methods. + * java/lang/Class.h (_Jv_SearchMethodInClass): New prototype. + + 2000-03-07 Bryce McKinlay + + * java/lang/Class.h (union _Jv_IDispatchTable): New declaration. + (struct _Jv_ifaces): New declaration. + JV_CLASS: New macro definition. + (getComponentType): Relocate below isArray() for inlining. + (getModifiers): Declare `inline'. + (getSuperclass): Ditto. + (isArray): Ditto. + (isPrimitive): Ditto. + (_Jv_IsAssignableFrom): New prototype. + (_Jv_LookupInterfaceMethodIdx): New prototype. Predeclare with "C" + linkage. + (_Jv_InitClass): Move from natClass.cc. Declare `inline'. + Check for JV_STATE_DONE before invoking initializeClass(). + (_Jv_PrepareConstantTimeTables): New prototype. + (_Jv_GetInterfaces): Ditto. + (_Jv_GenerateITable): Ditto. + (_Jv_GetMethodString): Ditto. + (_Jv_AppendPartialITable): Ditto. + (_Jv_FindIIndex): Ditto. + depth, ancestors, idt: New class fields. + + * java/lang/natClass.cc (isAssignableFrom): Move functionality to + inline function `_Jv_IsAssignableFrom'. Use that function. + (isInstance): Declare `inline'. + (initializeClass): Get lock on class before checking `state'. Unlock + before calling resolveClass0. Call _Jv_PrepareConstantTimeTables with + the lock held. + (_Jv_LookupInterfaceMethod): Use _Jv_GetMessageString. + (_Jv_IsAssignableFrom): New inline function. Test assignability using + class->depth and ancestor table. + (_Jv_IsInstanceOf): Use _Jv_IsAssignableFrom. + (_Jv_CheckCast): Move from prims.cc. Use JV_CLASS and + _Jv_IsAssignableFrom. + (_Jv_CheckArrayStore): Ditto. + (_Jv_LookupInterfaceMethodIdx): New function. + INITIAL_IOFFSETS_LEN, INITIAL_IFACES_LEN: New #defines. + (_Jv_PrepareConstantTimeTables): New function. + (_Jv_IndexOf): Ditto. + (_Jv_GetInterfaces): Ditto. + (_Jv_GenerateITable): Ditto. + (_Jv_GetMethodString): Ditto. + (_Jv_AppendPartialITable): Ditto. + iindex_mutex, iindex_mutex_initialized: New static fields. + (_Jv_FindIIndex): New function. + + * java/lang/natClassLoader.cc (_Jv_NewClass): Set new jclass fields. + + * prims.cc (_Jv_CheckCast): Moved to natClass.cc. + (_Jv_CheckArrayStore): Ditto. + (JvNewCharArray, JvNewBooleanArray, JvNewByteArray, JvNewShortArray, + JvNewIntArray, JvNewLongArray, JvNewFloatArray, JvNewDoubleArray): + Moved to gcj/array.h. + (_Jv_Realloc): New function. + + * gcj/cni.h: Move _Jv_PrimClass definitions to gcj/array.h. + + * gcj/array.h: _Jv_PrimClass definitions moved from gcj/cni.h. + (JvNewCharArray, JvNewBooleanArray, JvNewByteArray, + JvNewShortArray, JvNewIntArray, JvNewLongArray, JvNewFloatArray, + JvNewDoubleArray): Implementations moved from prims.cc and + declared `inline'. + + * gcj/javaprims.h (_Jv_Realloc): Prototype. + + * include/jvm.h (_Jv_LookupInterfaceMethodIdx): Prototype. + + 2000-03-06 Tom Tromey + + * jni.cc (MARK_NONE): New define. + (MARK_USER): Likewise. + (MARK_SYSTEM): Likewise. + (struct _Jv_JNI_LocalFrame): Made `marker' bigger and `size' + smaller. + (_Jv_JNI_DeleteLocalRef): Use MARK_NONE in assert. + (_Jv_JNI_EnsureLocalCapacity): Use MARK_NONE. + (_Jv_JNI_PushLocalFrame): Use MARK_USER. + (_Jv_JNI_PopLocalFrame): New version with additional `stop' + argument. + (call): Use MARK_SYSTEM. + (_Jv_GetJNIEnvNewFrame): New function. + (_Jv_LookupJNIMethod): New function. + (_Jv_JNI_PopSystemFrame): New function. + (call): Use _Jv_JNI_PopSystemFrame and _Jv_LookupJNIMethod. + + 2000-03-05 Tom Tromey + + Fix for PR libgcj/43: + * include/Makefile.in: Rebuilt. + * include/Makefile.am (include_HEADERS): New define. + + 2000-03-05 Anthony Green + + * gcj/javaprims.h ("Java"): Remove FirstThread. + + * configure.host: Fix __NO_MATH_INLNES botch. + + * Makefile.in: Rebuilt. + * Makefile.am (nat_source_files): Move natFirstThread.cc. + (gnu/gcj/runtime/FirstThread.h): Moved. + (ordinary_java_source_files): Move FirstThread.java. + * prims.cc: Deal with FirstThread movement. + (JvRunMain): Ditto. + (_Jv_RunMain): Ditto. + + * gnu/gcj/runtime/FirstThread.java: Moved from java/lang. + * gnu/gcj/runtime/natFirstThread.cc: Ditto. + + 2000-03-05 Warren Levy + + * java/net/DatagramSocket.java(DatagramSocket(int,InetAddress)): + Handle null addresses. + + 2000-03-04 Anthony Green + + * configure.host (libgcj_flags): Define __NO_MATH_INLINES. + See PR gcj/151. + + 2000-03-04 Anthony Green + + * configure: Rebuilt. + * configure.in (ZLIBTESTSPEC): New macro. + (GCTESTSPEC): New macro. + (LIBGCJTESTSPEC): New macro. + * libgcj-test.spec.in: New file. + + 2000-03-02 Tom Tromey + + * include/java-interp.h: Don't include MethodInvocation.h. + (class _Jv_InterpMethod): Don't make MethodInvocation a friend. + * Makefile.in: Rebuilt. + * Makefile.am (gnu/gcj/runtime/MethodInvocation.h): Removed. + (ordinary_java_source_files): Don't mention + MethodInvocation.java. + * gnu/gcj/runtime/MethodInvocation.java: Removed. + * interpret.cc (MethodInvocation::continue1): Removed. + (run): Handle exceptions here. + * java/lang/ClassLoader.java (defineClass1, defineClass2): + Removed. + * java/lang/natClassLoader.cc (defineClass0): Catch exceptions + here. + (defineClass2): Removed. + + * java/lang/reflect/Method.java (hack_trampoline, hack_call): + Removed. + * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Catch + exceptions here. + (hack_call): Removed. + + * java/lang/Class.h (Class): Removed hackRunInitializers, + hackTrampoline. + * java/lang/natClass.cc (hackRunInitializers): Removed. + (initializeClass): Catch exceptions here. + Include ExceptionInInitializerError.h. + * java/lang/Class.java (hackTrampoline, hackRunInitializers): + Removed. + + * java/lang/Object.h (Object): Don't mention hack12_6. + * java/lang/natObject.cc (_Jv_FinalizeObject): Catch exceptions + here. + * java/lang/Object.java (hack12_6): Removed. + + * java/lang/natThread.cc (run_): Renamed. Catch exceptions here. + (start): Use run_, not run__. + * java/lang/Thread.java (run_): Renamed from run__; old run_ + removed. + + * jni.cc (_Jv_JNI_FindClass): Handle exceptions. + (_Jv_JNI_EnsureLocalCapacity): Likewise. + (_Jv_JNI_DefineClass): Likewise. + (_Jv_JNI_ThrowNew): Likewise. + (_Jv_JNI_AllocObject): Likewise. + (_Jv_JNI_GetAnyMethodID): Likewise. + (_Jv_JNI_CallAnyMethodV): Likewise. + (_Jv_JNI_CallAnyMethodA): Likewise. + (_Jv_JNI_CallAnyVoidMethodV): Likewise. + (_Jv_JNI_CallAnyVoidMethodA): Likewise. + (_Jv_JNI_GetAnyFieldID): Likewise. + (_Jv_JNI_NewString): Likewise. + (_Jv_JNI_NewStringUTF): Likewise. + (_Jv_JNI_GetStringUTFChars): Likewise. + (_Jv_JNI_NewObjectArray): Likewise. + (_Jv_JNI_NewPrimitiveArray): Likewise. + (_Jv_JNI_GetPrimitiveArrayRegion): Likewise. + (_Jv_JNI_GetStringRegion): Likewise. + (_Jv_JNI_GetStringUTFRegion): Likewise. + (_Jv_JNI_SetPrimitiveArrayRegion): Likewise. + (_Jv_JNI_MonitorEnter): Likewise. + (_Jv_JNI_MonitorExit): Likewise. + (_Jv_JNI_ToReflectedField): Likewise. + (_Jv_JNI_ToReflectedMethod): Likewise. + (_Jv_JNI_RegisterNatives): Likewise. + (_Jv_JNI_AttachCurrentThread): Likewise. + (_Jv_JNI_DestroyJavaVM): Likewise. + + 2000-02-28 Mo DeJong + + * java/util/zip/ZipOutputStream.java(closeEntry) : Fixed + error caused by the incorrect casting of a long to an int. + + 2000-02-28 Mo DeJong + + * java/util/zip/ZipOutputStream.java(write_entry) : Fixed + SIGSEV caused by use of the wrong instance variable. + + 2000-02-27 Bryce McKinlay + + * java/io/File.java (File(String, String)): For dirPath, treat an + empty String the same as `null'. + + 2000-02-26 Anthony Green + + * gnu/gcj/io/MimeTypes.java: Test for null. + + * jni.cc (_Jv_JNI_AttachCurrentThread): Minor cleanup. + (JNI_GetCreatedJavaVMs): Remove compiler warning. + + * java/net/URLConnection.java: Update copyright notice. + + 2000-02-25 Tom Tromey + + * jni.cc (_Jv_JNI_RegisterNatives): Conditionalize body on + `INTERPRETER'. + + 2000-02-25 Bryce McKinlay + + * java/net/URLConnection.java (initializeDateFormats): New + private method. + (getHeaderFieldDate): Call initializeDateFormats if required. + locale, dateFormat1, dateFormat2, dateFormat3: Don't initialize + these. + Fix for PR libgcj/38. + + 2000-02-24 Warren Levy + + * java/math/BigInteger.java(ival): Made private. + (words): Ditto. + (neg): Ditto. + + 2000-02-20 Anthony Green + + * Makefile.in: Rebuilt. + * Makefile.am (ordinary_java_source_files): Add + gnu/gcj/io/DefaultMimeTypes.java and gnu/gcj/io/MimeTypes.java + + * scripts/MakeDefaultMimeTypes.java: New file. + * scripts/mime.types: New file. + * scripts/classes.pl: Moved from top level. + * classes.pl: Moved to scripts directory. + + * java/net/URLConnection.java: Implement guessContentTypeFromName. + + * gnu/gcj/io/MimeTypes.java: New file. + * gnu/gcj/io/DefaultMimeTypes.java: New file. + + 2000-02-20 Tom Tromey + + * boehm.cc (_Jv_AllocBytes): Clear returned memory. + + 2000-02-19 Bryce McKinlay + + * java/util/zip/ZipEntry.java (setCrc): Fix overflow. + (setSize): ditto. + + 2000-02-18 Tom Tromey + + * include/jvm.h (_Jv_GetJavaVM): Declare. + * include/java-interp.h (_Jv_GetFirstMethod): New function. + (_Jv_MethodBase::get_method): New method. + (_Jv_JNIMethod::set_function): New method. + * jni.cc (_Jv_JNI_UnregisterNatives): New function. + (_Jv_JNI_RegisterNatives): New function. + (_Jv_JNIFunctions): Updated for new functions. + (_Jv_GetJavaVM): New function. + (_Jv_JNI_GetJavaVM): Use it. Now static. + (_Jv_JNI_AttachCurrentThread): Create a new JNIEnv if this thread + is already a Java thread but does not have a JNIEnv yet. + + * java/lang/natRuntime.cc (_load): Pass the JavaVM to the onload + function. + + 2000-02-17 Tom Tromey + + * gcj/field.h (_Jv_Field::getClass): Don't use JvAssert. + Fixes PR gcj/152. + + 2000-02-16 Tom Tromey + + * jni.cc (_Jv_JNI_CallStaticMethodV): Added some assertions. + + * jni.cc (_Jv_JNI_NewObjectV): Corrected assertion. + (_Jv_JNI_NewObject): Likewise. + (_Jv_JNI_NewObjectA): Likewise. + (_Jv_JNI_CallAnyMethodV): In constructor case, pass correct value + as "return" type to _Jv_CallAnyMethodA. + (_Jv_JNI_CallAnyMethodA): Likewise. + (_Jv_JNI_CallAnyVoidMethodV): Likewise. + + * jni.cc (_Jv_JNI_FindClass): Use ClassLoader.loadClass, not + findClass. + + 2000-02-15 Tom Tromey + + * resolve.cc (ncode): Set args_raw_size. Compute jni_cif and + jni_arg_types. + (init_cif): Added `rtype_p' argument. + * include/java-interp.h (class _Jv_MethodBase): Added + args_raw_size. + (class _Jv_InterpMethod): Removed args_raw_size. + (class _Jv_JNIMethod): Added jni_cif and jni_arg_types fields. + * jni.cc (call): Pass JNIEnv and (for static methods only) the + class pointer as well as the ordinary arguments. + + * jni.cc (mangled_name): Skip leading `(' in signature. + + * jni.cc (add_char): Added missing `else'. + + * jni.cc (_Jv_JNI_AttachCurrentThread): Return error if malloc + fails. + + 2000-02-15 Bryce McKinlay + + * NEWS: Updated. + + * java/lang/natRuntime.cc (_load): Include library path with + exception message. + + * java/lang/natSystem.cc (init_properties): set java.lang.classpath + property. + + * java/lang/natThread.cc (dumpStack): Removed. + * java/lang/Thread.java (dumpStack): Implemented. + + 2000-02-15 Tom Tromey + + * java/lang/natRuntime.cc (_load): On Unix, prefix library name + with `lib' for loadLibrary. Fixes PR gcj/150. + + 2000-02-14 Warren Levy + + * gnu/gcj/math/MPN.java(findLowestBit): Made methods public. + + * java/math/BigInteger.java(BigInteger(int,int,java.util.Random): + New constructor. + (min): Implemented. + (max): Implemented. + (modPow): Rewritten to not use the naive, slow, brute force approach. + (isProbablePrime): Implemented. + (testBit): Implemented. + (flipBit): Implemented. + (getLowestSetBit): Implemented. + + 2000-02-16 Anthony Green + + * configure.host: Use the same options for i386 and i486 as we do + for i586 and i686. + + 2000-02-12 Tom Tromey + + * java/io/File.java (createTempFile): Use low bits from counter, + not high bits. + + Fri Feb 11 19:48:08 2000 Anthony Green + + * THANKS: More thanks. + + 2000-02-11 Tom Tromey + + * interpret.cc (continue1): Use STOREA, not STOREI, to implement + astore instruction. From Hans Boehm. + + 2000-02-11 Warren Levy + + * java/math/BigInteger.java(BigInteger(String, int)): New constructor. + (BigInteger(String)): New constructor. + (not): Rewritten using version from Kawa's BitOps class. + (valueOf): New private methods from Kawa's BitOps class. + (swappedOp): ditto. + (bitOp): ditto. + (setBitOp): ditto. + (and): Implemented. + (or): Implemented. + (xor): Implemented. + (andNot): Implemented. + (clearBit): Implemented. + (setBit): Implemented. + (bitCount): Implemented. + (toByteArray): Implemented. + + 2000-02-11 Tom Tromey + + * java/io/File.java (nextValue): Now synchronized. + + 2000-02-10 Tom Tromey + + * java/io/natFileDescriptorPosix.cc (open): Recognize EXCL flag. + * java/io/FileDescriptor.java (EXCL): New static field. + * java/io/File.java (tmpdir): New static field. + (createTempFile): New method. + (nextValue): New method. + * java/lang/natSystem.cc (init_properties): Set java.io.tmpdir + property. + + * include/jni.h (JNI_FALSE): Renamed from JNI_TRUE; oops. + (jboolean): Declare as an attributed int, not a bool. + (_Jv_func): Declare differently for C. + + * gnu/gcj/jni/natNativeThread.cc: New file. + * gnu/gcj/jni/NativeThread.java: New file. + * java/lang/Thread.java (data): Now a RawData. + * include/jvm.h (_Jv_GetCurrentJNIEnv, _Jv_SetCurrentJNIEnv): + Declare. + * Makefile.in: Rebuilt. + * Makefile.am (java/lang/Thread.h): New target. + (ordinary_java_source_files): Added NativeThread.java. + (nat_source_files): Added natNativeThread.cc. + * java/lang/natThread.cc: Include + (struct natThread): Added `jni_env' field. + (_Jv_GetCurrentJNIEnv): New function. + (_Jv_SetCurrentJNIEnv): Likewise. + (initialize_native): Initialize jni_env. + Include RawData.h. + * jni.cc (ThreadGroupClass): New define. + (_Jv_JNI_InvokeFunctions): New structure. + (JNI_GetCreatedJavaVMs): New function. + (the_vm): New global. + (JNI_GetDefaultJavaVMInitArgs): New function. + Include NativeThread.h. + (NativeThreadClass): New define. + (_Jv_JNI_EnsureLocalCapacity): Return JNI_ERR, not -1. + (_Jv_JNI_DestroyJavaVM): New function. + (_Jv_JNI_AttachCurrentThread): New function. + (_Jv_JNI_DetachCurrentThread): New function. + (_Jv_JNI_GetEnv): New function. + (JNI_CreateJavaVM): New function. + (_Jv_JNI_GetJavaVM): New function. + (_Jv_JNIFunctions): Added entry for GetJavaVM. + * include/jni.h (JavaVMAttachArgs): New structure. + (JNI_EDETACHED): New define. + (JNI_EVERSION): Likewise. + (JavaVM): Define properly. + (struct JNIInvokeInterface): New structure. + (class _Jv_JavaVM): New class. + (JNI_OnLoad, JNI_OnUnload): Declare. + (JNI_GetDefaultJavaVMInitArgs, JNI_CreateJavaVM, + JNI_GetCreatedJavaVMs): Declare. + (JavaVMInitArgs): New typedef. + (JavaVMOption): Likewise. + (JNI_ERR): New define. + (JNI_OK): Likewise. + + 2000-02-10 Andrew Haley + + * interpret.cc: Don't include fdlibm.h. + Replace #if with #ifdef throughout. + Declare extern __ieee754_fmod. + (continue1): Remove op_getfield, op_getstatic, op_putfield, + op_putstatic insns. + * resolve.cc (_Jv_PrepareClass): Use imeth as method pointer. + Search class hierarchy for superclass vtable. + + * java/lang/natClassLoader.cc (_Jv_UnregisterClass): Don't fall + off the end of a pointer list. + + * java/lang/natThread.cc (stop): Don't abort, throw an exception + instead. + (suspend): Ditto. + + 2000-02-09 Tom Tromey + + * java/lang/natRuntime.cc (_load): Call add_library. + (loadLibraryInternal): Likewise. + + * gnu/gcj/convert/natIconv.cc (Input_iconv::finalize): Call + iconv_close when handle is not NULL. Thanks to Andrew Haley. + (Output_iconv::finalize): Likewise. + + 2000-02-08 Tom Tromey + + * java/util/Properties.java (setProperty): New method. + (store): New method. + + 2000-02-07 Tom Tromey + + * java/lang/Runtime.java (_load): Declare. + (load, loadLibrary): Wrote in terms of _load. + * java/lang/natRuntime.cc (load): Call JNI_OnLoad if it appears in + library. + (loadLibrary): Likewise. + Include . + (_load): New method. + (loadLibrary, load): Removed. + + * jni.cc (ThrowableClass): New define. + (_Jv_JNI_Throw): Check argument. + (_Jv_JNI_ThrowNew): Likewise. + (wrap_value): Don't wrap object if it is NULL. + (_Jv_JNI_DefineClass): Use wrap_value. + (_Jv_JNI_FindClass): Likewise. + (_Jv_JNI_GetSuperclass): Likewise. + (_Jv_JNI_ExceptionOccurred): Likewise. + (_Jv_JNI_AllocObject): Likewise. + (_Jv_JNI_GetObjectClass): Likewise. + (_Jv_JNI_NewString): Likewise. + (_Jv_JNI_NewStringUTF): Likewise. + (_Jv_JNI_NewObjectArray): Likewise. + (_Jv_JNI_GetObjectArrayElement): Likewise. + (_Jv_JNI_NewPrimitiveArray): Likewise. + (_Jv_JNI_ToReflectedField): Likewise. + (_Jv_JNI_ToReflectedMethod): Likewise. + (_Jv_JNI_AllocObject): Check argument. + (_Jv_JNI_NewObjectV): Likewise. + (_Jv_JNI_NewObject): Likewise. + (_Jv_JNI_NewObjectA): Likewise. + (_Jv_JNI_GetObjectClass): Likewise. + (_Jv_JNI_GetField): Likewise. + (_Jv_JNI_SetField): Likewise. + + * interpret.cc (PUSHL): Don't use expression statement. + (PUSHD): Likewise. + (LOADL): Likewise. + (STOREL): Likewise. + + * jni.cc (add_char): Conditional on INTERPRETER. + (mangled_name): Likewise. + (call): Likewise. + * include/java-interp.h (class _Jv_MethodBase): Conditional on + INTERPRETER. + (class _Jv_JNIMethod): Likewise. + + 2000-02-04 Warren Levy + + * Makefile.am: Added MPN.java and BigInteger.java. + * Makefile.in: Rebuilt. + * gnu/gcj/math/MPN.java: New file. From Kawa by Per Bothner + . + * java/math/BigInteger.java: New file. Based primarily on + Kawa's IntNum.java by Per Bothner . + + 2000-02-04 Tom Tromey + + * defineclass.cc (handleMethodsBegin): Allocate _Jv_MethodBase + pointers. + (handleMethodsEnd): Fixed error messages. Create a _Jv_JNIMethod + if the method is native. + * resolve.cc (ncode): Don't handle native methods. + (_Jv_JNIMethod::ncode): New method. + (_Jv_PrepareClass): Handle native methods. + * jni.cc (call): Renamed from _Jv_JNI_conversion_call. + Include AbstractMethodError.h. + (add_char): New function. + (mangled_name): Likewise. + * include/java-interp.h (class _Jv_JNIMethod): New class. + (class _Jv_MethodBase): New class. + (class _Jv_InterpMethod): Derive from _Jv_MethodBase. + (_Jv_InterpClass): Changed `interpreted_methods' field to type + `_Jv_MethodBase'. + + * include/jvm.h (_Jv_FindSymbolInExecutable): Declare. + * java/lang/natRuntime.cc (libraries_size, libraries_count, + libraries): New globals. + (add_library): New function. + (_Jv_FindSymbolInExecutable): New function. + + * java/lang/natClassLoader.cc (initiated_classes, loaded_classes): + Now static. + + 2000-02-04 Andrew Haley + + * java/lang/Throwable.java (CPlusPlusDemangler): New class. + (printStackTrace): Use a CPlusPlusDemangler to demangle names. + * java/lang/natThrowable.cc (printRawStackTrace): Rename + printStackTrace to printRawStackTrace. + + 2000-02-03 Tom Tromey + + * java/util/Calendar.java (toString): New method. + * java/util/SimpleTimeZone.java (clone): New method. + (toString): New method. + * java/util/TimeZone.java (clone): New method. + * java/text/SimpleDateFormat.java (clone): New method. + * java/text/NumberFormat.java (clone): New method. + (equals): New method. + * java/text/Format.java (clone): New method. + * java/text/DateFormatSymbols.java (DateFormatSymbols): New + constructor. + (clone): New method. + * java/text/DateFormat.java (clone): New method. + * java/text/Collator.java (clone): New method. + + 2000-02-03 Tom Tromey + + * java/io/PipedOutputStream.java (write(byte[], int, int)): New + method. + + 2000-02-01 Tom Tromey + + * include/java-interp.h (_Jv_JNI_conversion_call): Declare. + * resolve.cc (ncode): Use _Jv_JNI_conversion_call when + constructing the closure if the function is native. + * jni.cc (_Jv_JNI_conversion_call): Now returns `void'. No longer + a template function, #if'd out, or static. + Include . + + * include/jni.h (class _Jv_JNIEnv): Corrected calls using `...'. + + * include/jni.h (class _Jv_JNIEnv): Added all C++ inline methods. + + * jni.cc (_Jv_JNI_PopLocalFrame): Leave loop when `n == NULL'. + (_Jv_JNI_conversion_call): _Jv_JNI_PopLocalFrame will never leave + `locals == NULL'. + (wrap_value): New function. + (_Jv_JNI_CallAnyMethodV): Use it. + (_Jv_JNI_CallAnyMethodA): Likewise. + (_Jv_JNI_GetField): Use wrap_value; removed specialized version. + (_Jv_JNI_GetStaticField): Likewise. + + * jni.cc (_Jv_JNI_GetField): Specialize for jobject. + (_Jv_JNI_GetStaticField): Likewise. + + 2000-01-31 Tom Tromey + + * prims.cc (_Jv_MallocUnchecked): New function. + (main_init): Call _Jv_JNI_Init. + * include/jvm.h (_Jv_MallocUnchecked): Declare. + (_Jv_JNI_Init): Declare. + * jni.cc: Include Hashtable.h, OutOfMemoryError.h, Integer.h, + . + (_Jv_JNI_NewGlobalRef): New function. + (_Jv_JNI_DeleteGlobalRef): New function. + (_Jv_JNI_DeleteLocalRef): New function. + (_Jv_JNI_conversion_call): Initialize and clear local reference + frame. + (_Jv_JNI_NewLocalRef): New function. + (struct _Jv_JNI_LocalFrame): New structure. + (_Jv_JNI_PushLocalFrame): New function. + (_Jv_JNI_EnsureLocalCapacity): New function. + (FRAME_SIZE): New define. + (_Jv_JNI_GetStringChars): Mark string, not characters. + (_Jv_JNI_ReleaseStringChars): Unmark string, not characters. + (_Jv_JNI_GetPrimitiveArrayElements): Mark array, not elements. + (_Jv_JNI_ReleasePrimitiveArrayElements): Unmark array, not + elements. + (_Jv_JNI_DefineClass): Make return value a local ref. + (_Jv_JNI_FindClass): Likewise. + (_Jv_JNI_GetSuperclass): Likewise. + (_Jv_JNI_ExceptionOccurred): Likewise. + (_Jv_JNI_AllocObject): Likewise. + (_Jv_JNI_GetObjectClass): Likewise. + (_Jv_JNI_CallAnyMethodV): Likewise. + (_Jv_JNI_NewString): Likewise. + (_Jv_JNI_NewStringUTF): Likewise. + (_Jv_JNI_NewObjectArray): Likewise. + (_Jv_JNI_GetObjectArrayElement): Likewise. + (_Jv_JNI_ToReflectedField): Likewise. + (_Jv_JNI_ToReflectedMethod): Likewise. + (_Jv_JNIFunctions): Updated table for new functions. + (_Jv_JNI_Init): New function. + (mark_for_gc): Wrote. + (unmark_for_gc): Wrote. + * include/jni.h (struct JNINativeInterface): Removed name from + PopLocalFrame parameter. + (class _Jv_JNIEnv): Added `locals' field. + + Mon Jan 31 00:43:15 2000 Anthony Green + + * gnu/gcj/convert/natIconv.cc (read): Minor fixes. + (write): Ditto. + + 2000-01-30 Tom Tromey + + * include/config.h.in: Rebuilt. + * acconfig.h (HAVE_ICONV): Define. + * configure: Rebuilt. + * configure.in: Check for `iconv' function. + * gnu/gcj/convert/BytesToUnicode.java (getDecoder): Try iconv if + no specific encoder exists. + * gnu/gcj/convert/UnicodeToBytes.java (getEncoder): Try iconv if + no specific encoder exists. + * Makefile.in: Rebuilt. + * Makefile.am (convert_source_files): Mention Input_iconv.java and + Output_iconv.java. + (nat_source_files): Added natIconv.cc. + * gnu/gcj/convert/natIconv.cc: New file. + * gnu/gcj/convert/Input_iconv.java: New file. + * gnu/gcj/convert/Output_iconv.java: New file. + + 2000-01-28 Tom Tromey + + * Makefile.in: Rebuilt. + * Makefile.am (LIBFFIINCS): Added MULTIBUILDTOP. + + 2000-01-26 Tom Tromey + + * gcj/method.h (JvNumMethods): Moved from Class.h. + (JvGetFirstMethod): Likewise. + * java/lang/Class.h (Object): Updated decl of + _Jv_JNI_ToReflectedField. + (Object): Added _Jv_JNI_ToReflectedMethod as a friend. + * Makefile.in: Rebuilt. + * Makefile.am (java/lang/reflect/Field.h): Added `jboolean' + argument of _Jv_JNI_ToReflectedField. + (java/lang/reflect/Constructor.h): Added _Jv_JNI_ToReflectedMethod + as a friend. + (java/lang/reflect/Method.h): Likewise. + * include/jni.h (class _Jv_JNIEnv): Added `klass' member. Use + __GCJ_JNI_IMPL__. + (jweak): New typedef. + (struct JNINativeInterface): Correctly declare remaining entries. + * jni.cc: Include Class.h, ClassLoader.h. + (_Jv_JNI_FindClass): New function. + (_Jv_JNI_DefineClass): New function. + (_Jv_JNI_conversion_call): New function. + (_Jv_JNI_FindClass): Use current class loader to find class. + (_Jv_JNI_ExceptionCheck): New function. + (_Jv_JNI_FromReflectedField): Now static. + (MethodClass): New define. + (_Jv_JNI_FromReflectedMethod): New function. + (_Jv_JNI_ToReflectedMethod): Likewise. + Include Method.h. + (_Jv_JNI_IsAssignableFrom): Renamed. + (_Jv_JNI_GetStringRegion): New function. + Include StringIndexOutOfBoundsException.h. + (_Jv_JNI_GetStringUTFRegion): New function. + (_Jv_JNIFunctions): Updated for new functions. + (_Jv_JNI_GetPrimitiveArrayCritical): New function + (_Jv_JNI_ReleasePrimitiveArrayCritical): Likewise. + (_Jv_JNI_GetStringCritical): New function. + (_Jv_JNI_ReleaseStringCritical): Likewise. + (get_throwable): Removed. + (GCJ_JV_JNIENV_FRIEND): Removed. + (__GCJ_JNI_IMPL__): Define. + Include method.h. + + * resolve.cc (get_ffi_type_from_signature): Handle case where + boolean is an int. + + Tue Jan 25 08:51:16 2000 Tom Tromey + + * interpret.cc (run): Don't call println. + Don't include PrintStream.h. + + * gcj/field.h (struct _Jv_Field): Use "jshort" as type for + nameIndex. Use "jint" as type for boffset. + * java/lang/Class.h (struct _Jv_Method): Made accflags a + _Jv_ushort. + (Class): Likewise. Also changed type of method_count, + vtable_method_count, size_in_bytes, field_count, + static_field_count, interface_count. + * gcj/array.h (__JArray): Made `length' a const jsize, not an + int. + + 2000-01-21 Tom Tromey + + * java/lang/reflect/natConstructor.cc (newInstance): Use + _Jv_CallAnyMethodA. + * include/jvm.h: Declare _Jv_CallAnyMethodA. + * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Renamed + from _Jv_CallNonvirtualMethodA. Changed interface; overloaded. + Include . + (COPY): Removed. + (invoke): Use _Jv_CallAnyMethodA. + (VAL): Redefined. + * java/lang/Class.h (Class): Declare JvGetFirstStaticField, + JvNumStaticFields, JvNumMethods, and JvGetFirstMethod as friend + functions. + (struct _Jv_Method): Added getNextMethod method. + (JvNumMethods): New function. + (JvGetFirstMethod): Likewise. + * gcj/field.h (JvGetFirstStaticField): New function. + (JvNumStaticFields): Likewise. + (getNextField): Renamed from getNextInstanceField. + (struct _Jv_Field): New method getClass. + * jni.cc: Wrote many new functions. + * include/jni.h (JNI_TRUE): Define. + (JNI_FALSE): Likewise. + (jobject, jclass, jstring, jarray, jthrowable, jobjectArray, + jbyteArray, jshortArray, jintArray, jlongArray, jbooleanArray, + jcharArray, jfloatArray, jdoubleArray): New typedefs. + (jfieldID, jmethodID): Likewise. + (JNI_COMMIT, JNI_ABORT): New defines. + (JNINativeMethod): New struct. + (struct JNINativeInterface): Correctly declared more entries. + (class _Jv_JNIEnv): Added `ex' member. + (JNI_VERSION_1_1): New define. + (JNI_VERSION_1_2): Likewise. + + * boehm.cc (_Jv_MarkObj): Use getNextField, not + getNextInstanceField. + + 2000-01-20 Tom Tromey + + * resolve.cc (StringClass): Removed. + * defineclass.cc (StringClass): Removed. + + 2000-01-19 Bryce McKinlay + + * NEWS: updated. + + 2000-01-19 Tom Tromey + + * interpret.cc (PC_REGISTER_ASM): Removed. + + * java/lang/natThrowable.cc: Don't use `#pragma implementation'. + From Bryce McKinlay. + + * All files: Updated copyright to reflect Cygnus purchase. + + 2000-01-18 Bryce McKinlay + + * configure: Rebuilt. + * configure.in: Recognize --disable-interpreter. + + 2000-01-18 Andrew Haley + + * name-finder.cc (lookup): Check for dladdr function. + acconfig.h (HAVE_DLADDR): Add. + configure.in: Check for HAVE_DLADDR + configure: Rebuilt. + include/config.h.in: Rebuilt. + + 2000-01-17 Andrew Haley + + * prims.cc (_Jv_RunMain): Set the name of this executable. + + 2000-01-17 Tom Tromey + + * java/lang/natThrowable.cc (fillInStackTrace): Return `this' even + when backtrace can't be computed. + + * configure: Rebuilt. + * configure.in: Fixed typo in AC_CONFIG_SUBDIRS call. + + * java/lang/Runtime.java (loadLibraryInternal): Declare. + * java/lang/natClassLoader.cc (_Jv_FindClass): Removed dead copy. + (_Jv_FindClassInCache): Likewise. + (_Jv_FindClass): Don't conditionalize body on INTERPRETER. + (findSystemClass): Try to load class from compiled module. + Include Runtime.h. + * java/lang/natRuntime.cc (load): Use UTF-8 copy of filename. + (loadLibrary): Likewise. + (lt_preloaded_symbols): Define. + (loadLibraryInternal): New method. + * include/config.h.in: Rebuilt. + * acconfig.h (USE_LTDL): Added. + * Makefile.am (SUBDIRS): Added $(DIRLTDL). + (INCLUDES): Added $(INCLTDL). + (libgcj_la_DEPENDENCIES): Added $(LIBLTDL). + (libgcj_la_LIBADD): Likewise. + * aclocal.m4, configure: Rebuilt. + * configure.in: Added libltdl support. + + 2000-01-15 Tom Tromey + + * prims.cc (_Jv_PrimClass): Use `JV_STATE_NOTHING', not `0'. + + 2000-01-14 Andrew Haley + + * java/lang/natThrowable.cc: New file. + + * java/lang/Throwable.java (fillInStackTrace): Make native. + (printStackTrace): Call native method to do this. + (Throwable): Call fillInStackTrace. + (stackTrace): New variable. + + * include/jvm.h: Add _Jv_ThisExecutable functions. + + * prims.cc: (_Jv_execName): New variable. + (catch_segv): Call fillInStackTrace. + (catch_fpe): Ditto. + (_Jv_ThisExecutable): New functions. + (JvRunMain): Set the name of this executable. + + * Makefile.am: Add java/lang/natThrowable.cc. + Add name-finder.cc. + * Makefile.in: Rebuilt. + + * acconfig.h: Add HAVE_PROC_SELF_EXE. + + * configure.in: Force link with __frame_state_for in + FORCELIBGCCSPEC. Add new checks for backtrace. + * include/config.h.in: Rebuilt. + + * name-finder.cc: New file. + * include/name-finder.h: New file. + + 2000-01-16 Anthony Green + + * java/lang/StringBuffer.java (StringBuffer): Don't special case + null argument. + + 2000-01-16 Jeff Sturm + + * java/io/StreamTokenizer.java (nextToken): Avoid unread(TT_EOF). + + 2000-01-13 Tom Tromey + + * java/lang/natClassLoader.cc (_Jv_FindClass): Register `loader', + not system loader, as initiating loader. + + 2000-01-11 Tom Tromey + + * java/lang/natSystem.cc (getpwuid_adaptor): New adaptor for + HP/UX. From David Scott Urban. + + 2000-01-10 Jeff Sturm + + * java/lang/natMath.cc (pow): Cast args to `double', not + `jdouble'. + (atan2): Likewise. + (IEEEremainder): Likewise. + * java/lang/mprec.h: Don't wrap includes in `extern "C"'. + * java/lang/fdlibm.h: Don't wrap includes in `extern "C"'. + + 2000-01-09 Anthony Green + + * java/lang/natString.cc (init): Test for overflow condition + during out of bounds check. + (getChars): Throw StringIndexOutOfBoundsException, not + ArrayIndexOutOfBoundsException. + (getBytes): Ditto. + (regionMatches): Obey case option during string comparison. + + * configure.host (ligcj_interpreter): New variable. Enable + interpreter by default on IA-32. + * configure.in: Examine libgcj_interpreter. + * configure: Rebuilt. + + 2000-01-07 Tom Tromey + + * mauve-libgcj: Don't disable ClassTest. + + * java/lang/natClass.cc (getClasses): Wrote. + + 2000-01-06 Tom Tromey + + * java/lang/natClass.cc (_getConstructors): Correctly check + whether method name is the init name. + (getMethod): Look at accflags on method in `klass', not `this'. + + 2000-01-05 Tom Tromey + + * java/lang/natClass.cc (getMethod): Compute offset relative to + `klass's methods table, not `this's table. + + * java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA): + In unwrapping/widening case, check whether `k' is null, not + whether it is primitive. Initialize `num' from `argelts', not + `paramelts'. Correct create and pass arguments to ffi_call. + Don't let presence of `this' argument affect index used to look in + argument arrays. + (COPY): Set appropriate element in `values' vector. + + * java/lang/natClass.cc: Include . + + * java/lang/Class.h (_getMethods): Correctly declare as private, + not public. + + * java/lang/Class.h (_getMethods): Declare. + * java/lang/Class.java (_getMethods): Declare. + * java/lang/natClass.cc (getDeclaringClass): Always return NULL. + (getDeclaredClasses): Always return empty array. + (_getMethods): New method. + (getMethods): Wrote. + (getDeclaredMethod): Return `rmethod'. + (finit_name): New global. + (getDeclaredMethods): Check for finit_name. + (_getMethods): Likewise. + (getMethod): Only return public methods. + + * java/lang/reflect/natMethod.cc (get_ffi_type): Test size of + jboolean and select correct ffi type on that basis. + (_Jv_CallNonvirtualMethodA): Handle `void' return type. + Constructor call always has `void' return type. + + 2000-01-04 Tom Tromey + + * java/lang/Class.h (getSignature): Updated. + * java/lang/Class.java (getSignature): Updated. + * java/lang/natClass.cc (getSignature): Added `is_constructor' + argument. + (getConstructor): Ensure constructor is public. + (_getConstructors): Check for public-ness of constructor when + `declared' is false, not when it is true. + + 2000-01-04 Warren Levy + + * java/net/natPlainDatagramSocketImpl.cc (peek): Removed unnecesary + comment. + (receive): Set the sender's address in the DatagramPacket. + + 2000-01-04 Tom Tromey + + * java/lang/reflect/natConstructor.cc (newInstance): Pass + declaring class as return_type argument to + _Jv_CallNonvirtualMethodA. + * java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA): In + constructor case, create object and use it as `this' argument. + * java/lang/Class.h (_getConstructors): Declare. + (_getFields): Declare. + * java/lang/Class.java (getConstructors): Wrote. + (_getConstructors): New native method. + (getDeclaredConstructors): Wrote. + (_getFields): Declare new native method. + * java/lang/natClass.cc (_Jv_LookupInterfaceMethod): Removed + incorrect comment. + (getMethod): Work correctly when class is primitive. + (getDeclaredMethods): Likewise. Compute offset using `method', + not `mptr'. + (getDeclaredMethod): Likewise. + (getConstructor): Wrote. + (ConstructorClass): New define. + (getDeclaredConstructor): Wrote. + (_getConstructors): New method. + (_getFields): New method. + (getFields): Wrote. + + * Makefile.in: Rebuilt. + * Makefile.am (AM_CXXFLAGS): Added -D_GNU_SOURCE. + + * prims.cc: Remove `#pragma implementation'. + * gcj/array.h: Remove `#pragma interface'. + + * prims.cc (_Jv_equaln): New function. + * java/lang/Class.java (getSignature): Declare. + * resolve.cc (_Jv_LookupDeclaredMethod): Moved to natClass.cc. + * java/lang/natClass.cc (_Jv_LookupDeclaredMethod): Moved from + resolve.cc. + (getSignature): New method. + (getDeclaredMethod): Wrote. + (getMethod): Wrote. + Include StringBuffer.h. + * java/lang/Class.h (Class): Added _Jv_FromReflectedConstructor + as a friend. Unconditionally declare _Jv_LookupDeclaredMethod as + a friend. + (getSignature): Declare. + * include/jvm.h (_Jv_GetTypesFromSignature): Declare. + (_Jv_equaln): Declare. + (_Jv_CallNonvirtualMethodA): Declare. + * Makefile.in: Rebuilt. + * Makefile.am (nat_source_files): Added natConstructor.cc. + (java/lang/reflect/Constructor.h): New target. + * java/lang/reflect/natConstructor.cc: New file. + * java/lang/reflect/Constructor.java (newInstance): Now native. + (declaringClass): Renamed from decl_class. + (offset): Renamed from index. + (getType): New native method. + (getModifiers): Now native. + (getParameterTypes): Call getType if required. + (hashCode): Include hash code from declaring class. + (modifiers): Removed. + (toString): Call getType if required. + * gcj/method.h (_Jv_FromReflectedConstructor): New function. + * java/lang/reflect/natMethod.cc (hack_call): New method. + Removed `#if 0' around FFI code. + Include . + (invoke): Use _Jv_CallNonvirtualMethodA. Throw + IllegalArgumentException when argument object and class disagree. + (_Jv_GetTypesFromSignature): New function. + (getType): Use it. + (ObjectClass): New define. + (_Jv_CallNonvirtualMethodA): New function. + * java/lang/reflect/Method.java (hack_trampoline): New method. + (hack_call): New native method. diff -Nrc3pad gcc-3.0.4/libjava/HACKING gcc-3.1/libjava/HACKING *** gcc-3.0.4/libjava/HACKING Sun Jul 29 10:11:17 2001 --- gcc-3.1/libjava/HACKING Fri Feb 8 01:22:47 2002 *************** efficient, cleanest) implementation of e *** 18,25 **** any conflicts created by the merge, and test the final result. The merged files can be recognized by the standard Classpath copyright ! comments at the top of the file. If you make changes to these files then ! you should also send a patch to the classpath mailinglist. --- 18,29 ---- any conflicts created by the merge, and test the final result. The merged files can be recognized by the standard Classpath copyright ! comments at the top of the file. If you make changes to these files ! then you should also check in the fix to Classpath. For small changes ! it may be easier to send a patch to the classpath mailinglist. For ! large changes, if you have direct write access to the libgcj tree, ! then you will also need to get a Classpath account and do the work ! yourself. *************** But note the following (thanks to Bryce *** 38,46 **** > Makefile? Yup, you need the magic libgcj automake ;-) ! ! Install that (dont worry, it should still work for other projects), add your files to the Makefile.am, then just type "automake" and it will regenerate the Makefile.in. Easy! --- 42,50 ---- > Makefile? Yup, you need the magic libgcj automake ;-) ! ! Install that (don't worry, it should still work for other projects), add your files to the Makefile.am, then just type "automake" and it will regenerate the Makefile.in. Easy! diff -Nrc3pad gcc-3.0.4/libjava/LIBGCJ_LICENSE gcc-3.1/libjava/LIBGCJ_LICENSE *** gcc-3.0.4/libjava/LIBGCJ_LICENSE Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/LIBGCJ_LICENSE Tue Jan 22 22:39:46 2002 *************** *** 1,14 **** ! March 7, 2000 The libgcj library is licensed under the terms of the GNU General ! Public License, with this special exception: ! As a special exception, if you link this library with other files ! to produce an executable, this library does not by itself cause ! the resulting executable to be covered by the GNU General Public ! License. This exception does not however invalidate any other ! reasons why the executable file might be covered by the GNU ! General Public License. You should have received a copy of the GNU General Public License along with libjava; see the file COPYING. If not, write to the --- 1,24 ---- ! Jan 21, 2002 The libgcj library is licensed under the terms of the GNU General ! Public License. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. You should have received a copy of the GNU General Public License along with libjava; see the file COPYING. If not, write to the diff -Nrc3pad gcc-3.0.4/libjava/Makefile.am gcc-3.1/libjava/Makefile.am *** gcc-3.0.4/libjava/Makefile.am Tue Jul 31 21:51:42 2001 --- gcc-3.1/libjava/Makefile.am Fri May 3 18:22:15 2002 *************** endif *** 31,46 **** toolexeclib_LTLIBRARIES = libgcj.la $(cond_x_ltlibrary) toolexeclib_DATA = libgcj.spec - data_DATA = libgcj.jar ! if NEEDS_DATA_START ! toolexeclib_LIBRARIES = libgcjdata.a ! libgcjdata_a_SOURCES = libgcjdata.c ! endif ## For now, only on native systems. FIXME. if NATIVE ! bin_PROGRAMS = jv-convert gij endif bin_SCRIPTS = addr2name.awk --- 31,46 ---- toolexeclib_LTLIBRARIES = libgcj.la $(cond_x_ltlibrary) toolexeclib_DATA = libgcj.spec ! jardir = $(datadir)/java ! jar_DATA = libgcj-@gcc_version@.jar ! ! ## FIXME: Using libdir violates GNU coding standards. ! secdir = $(libdir)/security ## For now, only on native systems. FIXME. if NATIVE ! bin_PROGRAMS = jv-convert gij rmic rmiregistry endif bin_SCRIPTS = addr2name.awk *************** ZIP = jar *** 63,72 **** endif GCJH = gcjh else # CANADIAN - ## JAVAC is set to `$(GCJ) -C'. However, JAVAC is run from the srcdir - ## (due to problems running it in builddir). In this case the obvious - ## definition of GCJ won't work; instead we resort to this ugly - ## definition that gives us absolute paths. GCJH = $(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT) ZIP = $(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT) endif # CANADIAN --- 63,68 ---- *************** endif # CANADIAN *** 75,85 **** ## compiles. GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8 ! GCJCOMPILE = $(LIBTOOL) --tag=GCJ --mode=compile $(GCJ_WITH_FLAGS) -fassume-compiled -fclasspath=$(here) -L$(here) $(JC1FLAGS) -MD -MT $@ -MF $(@:.lo=.d) -c ! GCJLINK = $(LIBTOOL) --tag=GCJ --mode=link $(GCJ) -L$(here) $(JC1FLAGS) \ ! $(ICONV_LDFLAGS) $(LDFLAGS) -o $@ ! LIBLINK = $(LIBTOOL) --tag=CC --mode=link $(CC) -L$(here) $(JC1FLAGS) \ ! $(ICONV_LDFLAGS) $(LDFLAGS) -o $@ ## We define this because otherwise libtool can be run with different ## values of `CXX' and will then get confused and fail to work. So, --- 71,79 ---- ## compiles. GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8 ! GCJCOMPILE = $(LIBTOOL) --tag=GCJ --mode=compile $(GCJ_WITH_FLAGS) -fclasspath= -fbootclasspath=$(here) $(JC1FLAGS) -MD -MT $@ -MF $(@:.lo=.d) -c ! GCJLINK = $(LIBTOOL) --tag=GCJ --mode=link $(GCJ) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ ! LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ ## We define this because otherwise libtool can be run with different ## values of `CXX' and will then get confused and fail to work. So, *************** WARNINGS = -W -Wall *** 97,103 **** AM_CXXFLAGS = -fno-rtti -fnon-call-exceptions \ ## Some systems don't allow `$' in identifiers by default, so we force it. -fdollars-in-identifiers \ ! @LIBGCJ_CXXFLAGS@ @X_CFLAGS@ $(WARNINGS) -D_GNU_SOURCE if USING_GCC AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS) else --- 91,98 ---- AM_CXXFLAGS = -fno-rtti -fnon-call-exceptions \ ## Some systems don't allow `$' in identifiers by default, so we force it. -fdollars-in-identifiers \ ! @LIBGCJ_CXXFLAGS@ @X_CFLAGS@ $(WARNINGS) -D_GNU_SOURCE \ ! -DPREFIX="\"$(prefix)\"" if USING_GCC AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS) else *************** endif *** 107,113 **** JCFLAGS = -g JC1FLAGS = @LIBGCJ_JAVAFLAGS@ $(GCJFLAGS) ! LIBFFIINCS = -I$(top_srcdir)/../libffi/include -I$(MULTIBUILDTOP)../libffi/include INCLUDES = -I$(top_srcdir) -Iinclude -I$(top_srcdir)/include \ $(GCINCS) $(THREADINCS) $(INCLTDL) \ --- 102,108 ---- JCFLAGS = -g JC1FLAGS = @LIBGCJ_JAVAFLAGS@ $(GCJFLAGS) ! LIBFFIINCS = @LIBFFIINCS@ INCLUDES = -I$(top_srcdir) -Iinclude -I$(top_srcdir)/include \ $(GCINCS) $(THREADINCS) $(INCLTDL) \ *************** javao_files = $(java_source_files:.java= *** 130,155 **** $(built_java_source_files:.java=.lo) x_javao_files = $(x_java_source_files:.java=.lo) ! libgcj_la_SOURCES = prims.cc posix.cc jni.cc exception.cc \ ! resolve.cc defineclass.cc interpret.cc name-finder.cc \ $(nat_source_files) EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \ $(c_source_files) $(java_source_files) $(built_java_source_files) ! libgcj_la_DEPENDENCIES = libgcj.jar $(javao_files) \ ! $(c_files) $(GCOBJS) $(THREADOBJS) $(LIBLTDL) libgcj_la_LIBADD = $(javao_files) $(c_files) $(GCOBJS) \ ! $(THREADOBJS) # Include THREADLIBS here to ensure that the correct version of # certain linuxthread functions get linked: ! libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLIBS) $(LIBLTDL) \ ## The mysterious backslash is consumed by make. -version-info `grep -v '^\#' $(srcdir)/libtool-version` libgcj_la_LINK = $(LIBLINK) libgcjx_la_SOURCES = $(x_nat_source_files) EXTRA_libgcjx_la_SOURCES = $(x_java_source_files) ! libgcjx_la_DEPENDENCIES = libgcj.jar $(x_javao_files) libgcjx_la_LIBADD = $(x_javao_files) libgcjx_la_LDFLAGS = @X_PRE_LIBS@ @X_LIBS@ -lX11 @X_EXTRA_LIBS@ \ -rpath $(toolexeclibdir) \ --- 125,153 ---- $(built_java_source_files:.java=.lo) x_javao_files = $(x_java_source_files:.java=.lo) ! libgcj_la_SOURCES = prims.cc jni.cc exception.cc \ ! resolve.cc defineclass.cc interpret.cc name-finder.cc verify.cc \ $(nat_source_files) EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \ + win32-threads.cc posix.cc win32.cc \ $(c_source_files) $(java_source_files) $(built_java_source_files) ! libgcj_la_DEPENDENCIES = libgcj-@gcc_version@.jar $(javao_files) \ ! $(c_files) $(GCOBJS) $(THREADOBJS) $(PLATFORMOBJS) $(LIBLTDL) \ ! $(LIBFFI) $(ZLIBS) $(GCLIBS) libgcj_la_LIBADD = $(javao_files) $(c_files) $(GCOBJS) \ ! $(THREADOBJS) $(PLATFORMOBJS) # Include THREADLIBS here to ensure that the correct version of # certain linuxthread functions get linked: ! libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(THREADLIBS) \ ! $(LIBLTDL) $(SYS_ZLIBS) \ ## The mysterious backslash is consumed by make. -version-info `grep -v '^\#' $(srcdir)/libtool-version` libgcj_la_LINK = $(LIBLINK) libgcjx_la_SOURCES = $(x_nat_source_files) EXTRA_libgcjx_la_SOURCES = $(x_java_source_files) ! libgcjx_la_DEPENDENCIES = libgcj-@gcc_version@.jar $(x_javao_files) libgcjx_la_LIBADD = $(x_javao_files) libgcjx_la_LDFLAGS = @X_PRE_LIBS@ @X_LIBS@ -lX11 @X_EXTRA_LIBS@ \ -rpath $(toolexeclibdir) \ *************** install-exec-hook: *** 171,193 **** ## a .java file with some other class which is caught. Note that we ## only want to create headers for those files which do not have ## hand-maintained headers. ! $(java_source_files:.java=.class): libgcj.jar ## The .class files for X will not be included in libgcj.jar, but the ## rule for libgcj.jar will cause all out-of-date .class files to be ## built. We need this to generate headers for the nat-files. ! $(x_java_source_files:.java=.class): libgcj.jar ! ! ## FIXME: this isn't really correct. ! $(built_java_source_files:.java=.class): $(built_java_source_files) ! ## This little nastiness is here so that the backquoted stuff in the ! ## GCJ definition can be correctly expanded, if required. ! @javac="$(JAVAC)"; \ ! for f in $?; do \ ! echo $$javac -L$(here) $(JCFLAGS) -classpath $(here):`cd $(srcdir) && /bin/pwd` -d $(here) $$f; \ ! $$javac -L$(here) $(JCFLAGS) -classpath $(here):`cd $(srcdir) && /bin/pwd` \ ! -d $(here) $$f; \ ! done ## We have the zip file depend on the java sources and not the class ## files, because we don't know the names of all the class files. --- 169,181 ---- ## a .java file with some other class which is caught. Note that we ## only want to create headers for those files which do not have ## hand-maintained headers. ! $(built_java_source_files:.java=.class): libgcj-@gcc_version@.jar ! $(java_source_files:.java=.class): libgcj-@gcc_version@.jar ## The .class files for X will not be included in libgcj.jar, but the ## rule for libgcj.jar will cause all out-of-date .class files to be ## built. We need this to generate headers for the nat-files. ! $(x_java_source_files:.java=.class): libgcj-@gcc_version@.jar ## We have the zip file depend on the java sources and not the class ## files, because we don't know the names of all the class files. *************** $(built_java_source_files:.java=.class): *** 195,229 **** ## up-to-date, and foo.class is removed, and bar.java is touched, then ## `make libgcj.jar' will not rebuilt foo.class. That's because ## libgcj.jar is not out-of-date with respect to foo.java. ! libgcj.jar: $(java_source_files) $(x_java_source_files) ## Create a list of all Java sources, without exceeding any shell limits. ! @: $(shell echo Creating list of files to compile...) $(shell rm -f tmp-list || :) $(shell touch tmp-list) $(foreach source,$(subst $(srcdir)/,,$?),$(shell echo $(source) >> tmp-list)) ! ## FIXME: this ought to depend on built_java_source_files, but right ! ## now it can't. Ugly. ! $(MAKE) $(built_java_source_files:.java=.class) ! ## This little nastiness is here so that the backquoted stuff in the ! ## GCJ definition can be correctly expanded, if required. @set fnord $(MAKEFLAGS); amf=$$2; fail=no; \ ! javac="$(JAVAC)"; dir=`/bin/pwd`; cd $(srcdir); \ ! for f in `cat $$dir/tmp-list`; do \ ! echo $$javac $(JCFLAGS) -classpath $(here):`/bin/pwd` -d $(here) $$f; \ ! $$javac $(JCFLAGS) -classpath $(here):`/bin/pwd` -d $(here) $$f \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes ;; *) exit 1;; esac; \ done; \ ! test "$$fail" = no ! -@rm -f tmp-list libgcj.jar ## Note that we explicitly want to include directory information. ! find java gnu -type d -o -type f -name '*.class' | \ sed -e '/\/\./d' -e '/\/xlib/d' | \ $(ZIP) cfM0E@ $@ MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files) $(x_javao_files) $(x_nat_files) $(x_nat_headers) ! CLEANFILES = tmp-list libgcj.jar clean-local: ## We just remove every .class file that was created. find . -name '*.class' -print | xargs rm -f SUFFIXES = .class .java .h .class.lo: --- 183,216 ---- ## up-to-date, and foo.class is removed, and bar.java is touched, then ## `make libgcj.jar' will not rebuilt foo.class. That's because ## libgcj.jar is not out-of-date with respect to foo.java. ! libgcj-@gcc_version@.jar: $(built_java_source_files) $(java_source_files) $(x_java_source_files) ## Create a list of all Java sources, without exceeding any shell limits. ! @: $(shell echo Creating list of files to compile...) $(shell rm -f tmp-list || :) $(shell touch tmp-list) $(foreach source,$?,$(shell echo $(source) >> tmp-list)) @set fnord $(MAKEFLAGS); amf=$$2; fail=no; \ ! javac="$(JAVAC)"; \ ! cat tmp-list | (while read f; do \ ! echo $$javac $(JCFLAGS) -classpath \'\' -bootclasspath $(here):$(srcdir) -d $(here) $$f; \ ! $$javac $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) $$f \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes ;; *) exit 1;; esac; \ done; \ ! test "$$fail" = no) ! -@rm -f tmp-list libgcj-@gcc_version@.jar ## Note that we explicitly want to include directory information. ! find java gnu javax org -type d -o -type f -name '*.class' | \ sed -e '/\/\./d' -e '/\/xlib/d' | \ $(ZIP) cfM0E@ $@ MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files) $(x_javao_files) $(x_nat_files) $(x_nat_headers) ! CLEANFILES = tmp-list libgcj-@gcc_version@.jar clean-local: ## We just remove every .class file that was created. find . -name '*.class' -print | xargs rm -f + # Just remove the objects from C++ sources, for testing the C++ compiler. + clean-nat: + rm -f $(nat_files) $(x_nat_files) + SUFFIXES = .class .java .h .class.lo: *************** SUFFIXES = .class .java .h *** 237,250 **** ## is a bug in automake), and it also won't put the .o files into ## subdirs. FIXME. $(nat_files) $(x_nat_files): %.lo: %.cc ! @echo '$(LTCXXCOMPILE) -c -o $@ $<'; \ ! $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c -o $@ $< ! @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ ! < .deps/$(*F).pp > .deps/$(*F).P; \ ! tr ' ' '\012' < .deps/$(*F).pp \ ! | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ ! >> .deps/$(*F).P; \ ! rm -f .deps/$(*F).pp ## FIXME: GNU make. $(c_files): %.lo: %.c --- 224,232 ---- ## is a bug in automake), and it also won't put the .o files into ## subdirs. FIXME. $(nat_files) $(x_nat_files): %.lo: %.cc ! @echo '$(LTCXXCOMPILE) -MD -MT $@ -MF $(@:.lo=.pp) -c -o $@ $<'; \ ! $(LTCXXCOMPILE) -MD -MT $@ -MF $(@:.lo=.pp) -c -o $@ $< ! @-mv $(@:.lo=.pp) $(@:.lo=.d) ## FIXME: GNU make. $(c_files): %.lo: %.c *************** $(javao_files) $(x_javao_files): %.lo: % *** 259,273 **** ## Pass the list of object files to libtool in a temporary file to ## avoid tripping platform command line length limits. libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES) ! @echo $(libgcj_la_OBJECTS) > libgcj.objectlist; ! @echo $(libgcj_la_LIBADD) >> libgcj.objectlist; $(libgcj_la_LINK) -objectlist libgcj.objectlist \ ! ../libffi/libfficonvenience.la \ -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS) libgcjx.la: $(libgcjx_la_OBJECTS) $(libgcjx_la_DEPENDENCIES) ! @echo $(libgcjx_la_OBJECTS) > libgcjx.objectlist; ! @echo $(libgcjx_la_LIBADD) >> libgcjx.objectlist; $(libgcjx_la_LINK) -objectlist libgcjx.objectlist \ -rpath $(toolexeclibdir) $(libgcjx_la_LDFLAGS) $(LIBS) --- 241,253 ---- ## Pass the list of object files to libtool in a temporary file to ## avoid tripping platform command line length limits. libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES) ! @: $(shell echo Creating list of files to link...) $(shell rm -f libgcj.objectlist || :) $(shell touch libgcj.objectlist) $(foreach object,$(libgcj_la_OBJECTS) $(libgcj_la_LIBADD),$(shell echo $(object) >> libgcj.objectlist)) $(libgcj_la_LINK) -objectlist libgcj.objectlist \ ! @GCLIBS@ @LIBFFI@ @ZLIBS@ \ -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS) libgcjx.la: $(libgcjx_la_OBJECTS) $(libgcjx_la_DEPENDENCIES) ! @: $(shell echo Creating list of files to link...) $(shell rm -f libgcjx.objectlist || :) $(shell touch libgcjx.objectlist) $(foreach object,$(libgcjx_la_OBJECTS) $(libgcjx_la_LIBADD),$(shell echo $(object) >> libgcjx.objectlist)) $(libgcjx_la_LINK) -objectlist libgcjx.objectlist \ -rpath $(toolexeclibdir) $(libgcjx_la_LDFLAGS) $(LIBS) *************** libgcjx.la: $(libgcjx_la_OBJECTS) $(libg *** 279,320 **** .class.h: ## FIXME: GNU make specific. ! $(GCJH) -classpath $(top_builddir) $(basename $<) ## Header files used when compiling some of the nat* files. ! nat_headers = $(ordinary_java_source_files:.java=.h) \ ! $(built_java_source_files:.java=.h) \ ! java/io/ObjectOutputStream$$PutField.h \ java/io/ObjectInputStream$$GetField.h x_nat_headers = $(x_java_source_files:.java=.h) ! java/lang/ClassLoader.h: java/lang/ClassLoader.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ ! -friend 'jclass _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader);' \ ! -friend 'void _Jv_RunMain (const char *name, int argc, const char **argv, bool is_jar);' \ ! $(basename $<) ! ## Our internal main program needs to be able to create a FirstThread. ! gnu/gcj/runtime/FirstThread.h: gnu/gcj/runtime/FirstThread.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ ! -friend 'void JvRunMain (jclass, int, const char **);' \ ! -friend 'void _Jv_RunMain (const char*, int, const char **);' \ $(basename $<) ! java/lang/Thread.h: java/lang/Thread.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -prepend 'class _Jv_JNIEnv;' \ - -prepend 'extern "Java" { namespace gnu { namespace gcj { namespace jni { class NativeThread; } } } };' \ -prepend '#define _JV_NOT_OWNER 1' \ -prepend '#define _JV_INTERRUPTED 2' \ -friend '_Jv_JNIEnv * _Jv_GetCurrentJNIEnv ();' \ -friend 'void _Jv_SetCurrentJNIEnv (_Jv_JNIEnv *env);' \ ! -friend 'class gnu::gcj::jni::NativeThread;' \ $(basename $<) ! java/lang/String.h: java/lang/String.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jchar* _Jv_GetStringChars (jstring str);' \ -friend 'jstring* _Jv_StringFindSlot (jchar*, jint, jint);' \ -friend 'jstring* _Jv_StringGetSlot (jstring);' \ --- 259,300 ---- .class.h: ## FIXME: GNU make specific. ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) $(basename $<) ## Header files used when compiling some of the nat* files. ! ordinary_nat_headers = $(ordinary_java_source_files:.java=.h) \ ! $(built_java_source_files:.java=.h) ! ! inner_nat_headers = java/io/ObjectOutputStream$$PutField.h \ java/io/ObjectInputStream$$GetField.h + nat_headers = $(ordinary_nat_headers) $(inner_nat_headers) + x_nat_headers = $(x_java_source_files:.java=.h) ! $(ordinary_nat_headers) $(x_nat_headers): %.h: %.class ! java/lang/ClassLoader.h: java/lang/ClassLoader.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ ! -friend 'jclass _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader);' \ ! -friend 'void _Jv_RunMain (jclass klass, const char *name, int argc, const char **argv, bool is_jar);' \ $(basename $<) ! java/lang/Thread.h: java/lang/Thread.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -prepend 'class _Jv_JNIEnv;' \ -prepend '#define _JV_NOT_OWNER 1' \ -prepend '#define _JV_INTERRUPTED 2' \ -friend '_Jv_JNIEnv * _Jv_GetCurrentJNIEnv ();' \ -friend 'void _Jv_SetCurrentJNIEnv (_Jv_JNIEnv *env);' \ ! -friend 'void _Jv_ThreadRun (java::lang::Thread* thread);' \ ! -friend 'jint _Jv_AttachCurrentThread(java::lang::Thread* thread);' \ ! -friend 'java::lang::Thread* _Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group);' \ ! -friend 'jint _Jv_DetachCurrentThread ();' \ $(basename $<) ! java/lang/String.h: java/lang/String.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jchar* _Jv_GetStringChars (jstring str);' \ -friend 'jstring* _Jv_StringFindSlot (jchar*, jint, jint);' \ -friend 'jstring* _Jv_StringGetSlot (jstring);' \ *************** java/lang/String.h: java/lang/String.cla *** 323,360 **** -friend 'jstring _Jv_AllocString (jsize);' \ $(basename $<) ! java/lang/reflect/Constructor.h: java/lang/reflect/Constructor.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);' \ -friend 'class java::lang::Class;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! java/lang/reflect/Field.h: java/lang/reflect/Field.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \ -friend 'jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv*, jclass, jfieldID, jboolean);' \ -friend 'class java::lang::Class;' \ $(basename $<) ! java/lang/reflect/Method.h: java/lang/reflect/Method.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);' \ -friend 'class java::lang::Class;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! gnu/gcj/runtime/VMClassLoader.h: gnu/gcj/runtime/VMClassLoader.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ ! -friend 'class java::lang::ClassLoader;' \ $(basename $<) ! java/io/ObjectInputStream$$GetField.h: libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ 'java/io/ObjectInputStream$$GetField' ! java/io/ObjectOutputStream$$PutField.h: libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ 'java/io/ObjectOutputStream$$PutField' ## Headers we maintain by hand and which we want to install. --- 303,341 ---- -friend 'jstring _Jv_AllocString (jsize);' \ $(basename $<) ! java/lang/reflect/Constructor.h: java/lang/reflect/Constructor.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);' \ -friend 'class java::lang::Class;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! java/lang/reflect/Field.h: java/lang/reflect/Field.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \ -friend 'jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv*, jclass, jfieldID, jboolean);' \ -friend 'class java::lang::Class;' \ $(basename $<) ! java/lang/reflect/Method.h: java/lang/reflect/Method.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);' \ -friend 'class java::lang::Class;' \ + -friend 'class java::io::ObjectInputStream;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! gnu/gcj/runtime/VMClassLoader.h: gnu/gcj/runtime/VMClassLoader.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ ! -friend 'class ::java::lang::ClassLoader;' \ $(basename $<) ! java/io/ObjectInputStream$$GetField.h: java/io/ObjectInputStream.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ 'java/io/ObjectInputStream$$GetField' ! java/io/ObjectOutputStream$$PutField.h: java/io/ObjectOutputStream.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ 'java/io/ObjectOutputStream$$PutField' ## Headers we maintain by hand and which we want to install. *************** $(extra_headers): *** 367,379 **** ## hand. install-data-local: $(PRE_INSTALL) ! @for f in $(nat_headers) $(extra_headers); do \ d="`echo $$f | sed -e 's,/[^/]*$$,,'`"; \ $(mkinstalldirs) $(DESTDIR)$(includedir)/$$d; \ if test -f $(srcdir)/$$f; then p=$(srcdir)/$$f; else p=$$f; fi; \ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f"; \ $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f; \ done ## ################################################################ --- 348,371 ---- ## hand. install-data-local: $(PRE_INSTALL) ! ## We use a GNU make trick here so that we don't go over the command ! ## length limit of some shells. ! @: $(shell echo Creating list of headers to install...) $(shell rm -f tmp-ilist || :) $(shell touch tmp-ilist) $(foreach hdr,$(nat_headers) $(extra_headers),$(shell echo $(hdr) >> tmp-ilist)) ! @cat tmp-ilist | while read f; do \ d="`echo $$f | sed -e 's,/[^/]*$$,,'`"; \ $(mkinstalldirs) $(DESTDIR)$(includedir)/$$d; \ if test -f $(srcdir)/$$f; then p=$(srcdir)/$$f; else p=$$f; fi; \ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f"; \ $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f; \ done + -@rm -f tmp-ilist + ## FIXME: the obvious approach using lib_DATA doesn't work with + ## automake 1.4. + $(mkinstalldirs) $(DESTDIR)$(secdir) + @for f in classpath.security libgcj.security; do \ + echo " $(INSTALL_DATA) $(srcdir)/java/security/$$f $(DESTDIR)$(secdir)/$$f"; \ + $(INSTALL_DATA) $(srcdir)/java/security/$$f $(DESTDIR)$(secdir)/$$f; \ + done ## ################################################################ *************** maintainer-check: libgcj.la *** 397,409 **** ## This rule can be used to see if the headers are more or less ## correct. ! header-check: libgcj.jar $(nat_headers) rm -f htest.cc; \ for h in $(nat_headers); do \ echo "#include \"$$h\"" >> htest.cc; \ done; \ $(CXXCOMPILE) -fsyntax-only htest.cc ## ################################################################ --- 389,410 ---- ## This rule can be used to see if the headers are more or less ## correct. ! header-check: libgcj-@gcc_version@.jar $(nat_headers) rm -f htest.cc; \ for h in $(nat_headers); do \ echo "#include \"$$h\"" >> htest.cc; \ done; \ $(CXXCOMPILE) -fsyntax-only htest.cc + ## This rule can be used to see if all the .class files verify + ## correctly. + class-check: libgcj-@gcc_version@.jar + @ok=0; find . -name '*.class' -print | fgrep -v testsuite | \ + while read f; do \ + echo "$(GCJ_WITH_FLAGS) --syntax-only $$f"; \ + if $(GCJ_WITH_FLAGS) --syntax-only $$f; then \ + :; else ok=1; fi; \ + done; exit $$ok ## ################################################################ *************** EXTRA_jv_convert_SOURCES = $(convert_sou *** 428,462 **** ## need this because we are explicitly using libtool to link using the ## `.la' file. jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ ! -rpath $(toolexeclibdir) -shared-libgcc jv_convert_LINK = $(GCJLINK) ! ## We explicitly link in the libraries we need. This way we don't ! ## need -nodefaultlibs, so we can still rely on gcj picking up the ! ## system libraries we need (via the specs file). ! ## We need the -L so that gcj can find libgcj with `-lgcj'. ! ## FIXME: should be _libs on some systems. ! jv_convert_LDADD = $(convert_source_files:.java=.lo) libgcj.la \ ! $(GCLIBS) $(THREADLIBS) $(ZLIBS) -L$(here)/.libs ## Depend on the spec file to make sure it is up to date before ## linking this program. jv_convert_DEPENDENCIES = $(convert_source_files:.java=.lo) \ ! $(GCDEPS) $(THREADDEPS) $(ZDEPS) libgcj.la libgcj.spec gij_SOURCES = gij.cc ## We need -nodefaultlibs because we want to avoid gcj's `-lgcj'. We ## need this because we are explicitly using libtool to link using the ## `.la' file. ! gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc gij_LINK = $(GCJLINK) ! ## We explicitly link in the libraries we need. This way we don't ! ## need -nodefaultlibs, so we can still rely on gcj picking up the ! ## system libraries we need (via the specs file). ! ## We need the -L so that gcj can find libgcj with `-lgcj'. ! ## FIXME: should be _libs on some systems. ! gij_LDADD = libgcj.la $(GCLIBS) $(THREADLIBS) $(ZLIBS) -L$(here)/.libs ## Depend on the spec file to make sure it is up to date before ## linking this program. ! gij_DEPENDENCIES = $(GCDEPS) $(THREADDEPS) $(ZDEPS) libgcj.la libgcj.spec # The Unicode consortium does not permit re-distributing the file JIS0201.TXT. # You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/. --- 429,484 ---- ## need this because we are explicitly using libtool to link using the ## `.la' file. jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ ! -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) jv_convert_LINK = $(GCJLINK) ! ## We don't explicitly link in the libraries we need; libgcj.la brings ! ## in all dependencies. We need the -L so that gcj can find libgcj ! ## with `-lgcj', but it must come first, otherwise the -L flags ! ## brought in from libgcj.la would cause the install directories to be ! ## searched before the build-tree ones, and we'd get errors because of ! ## different libraries with the same SONAME from picky linkers such as ! ## Solaris'. FIXME: should be _libs on some systems. ! jv_convert_LDADD = -L$(here)/.libs libgcj.la ## Depend on the spec file to make sure it is up to date before ## linking this program. jv_convert_DEPENDENCIES = $(convert_source_files:.java=.lo) \ ! libgcj.la libgcj.spec gij_SOURCES = gij.cc ## We need -nodefaultlibs because we want to avoid gcj's `-lgcj'. We ## need this because we are explicitly using libtool to link using the ## `.la' file. ! gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) gij_LINK = $(GCJLINK) ! ## See jv_convert_LDADD. ! gij_LDADD = -L$(here)/.libs libgcj.la ## Depend on the spec file to make sure it is up to date before ## linking this program. ! gij_DEPENDENCIES = libgcj.la libgcj.spec ! ! rmic_SOURCES = ! ## This is a dummy definition. ! EXTRA_rmic_SOURCES = $(rmi_java_source_files) ! rmic_LDFLAGS = --main=gnu.java.rmi.rmic.RMIC \ ! -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ! rmic_LINK = $(GCJLINK) ! ## See jv_convert_LDADD. ! rmic_LDADD = -L$(here)/.libs libgcj.la ! ## Depend on the spec file to make sure it is up to date before ! ## linking this program. ! rmic_DEPENDENCIES = libgcj.la libgcj.spec ! ! rmiregistry_SOURCES = ! ## This is a dummy definition. ! EXTRA_rmiregistry_SOURCES = $(rmi_java_source_files) ! rmiregistry_LDFLAGS = --main=gnu.java.rmi.registry.RegistryImpl \ ! -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ! rmiregistry_LINK = $(GCJLINK) ! ## See jv_convert_LDADD. ! rmiregistry_LDADD = -L$(here)/.libs libgcj.la ! ## Depend on the spec file to make sure it is up to date before ! ## linking this program. ! rmiregistry_DEPENDENCIES = libgcj.la libgcj.spec # The Unicode consortium does not permit re-distributing the file JIS0201.TXT. # You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/. *************** gnu/awt/j2d/DirectRasterGraphics.java \ *** 563,572 **** gnu/awt/j2d/Graphics2DImpl.java \ gnu/awt/j2d/IntegerGraphicsState.java \ gnu/awt/j2d/MappedRaster.java \ ! gnu/gcj/awt/BitMaskExtent.java \ ! gnu/gcj/awt/Buffers.java \ ! gnu/gcj/awt/ComponentDataBlitOp.java \ ! gnu/gcj/awt/GLightweightPeer.java \ gnu/java/beans/editors/ColorEditor.java \ gnu/java/beans/editors/FontEditor.java \ gnu/java/beans/editors/NativeBooleanEditor.java \ --- 585,594 ---- gnu/awt/j2d/Graphics2DImpl.java \ gnu/awt/j2d/IntegerGraphicsState.java \ gnu/awt/j2d/MappedRaster.java \ ! gnu/java/awt/BitMaskExtent.java \ ! gnu/java/awt/Buffers.java \ ! gnu/java/awt/ComponentDataBlitOp.java \ ! gnu/java/awt/GLightweightPeer.java \ gnu/java/beans/editors/ColorEditor.java \ gnu/java/beans/editors/FontEditor.java \ gnu/java/beans/editors/NativeBooleanEditor.java \ *************** java/awt/Label.java \ *** 629,634 **** --- 651,657 ---- java/awt/LayoutManager.java \ java/awt/LayoutManager2.java \ java/awt/List.java \ + java/awt/MediaTracker.java \ java/awt/Menu.java \ java/awt/MenuBar.java \ java/awt/MenuComponent.java \ *************** java/awt/Paint.java \ *** 639,645 **** --- 662,671 ---- java/awt/PaintContext.java \ java/awt/Panel.java \ java/awt/Point.java \ + java/awt/Polygon.java \ java/awt/PopupMenu.java \ + java/awt/PrintGraphics.java \ + java/awt/PrintJob.java \ java/awt/Rectangle.java \ java/awt/RenderingHints.java \ java/awt/ScrollPane.java \ *************** java/awt/color/ColorSpace.java \ *** 656,661 **** --- 682,695 ---- java/awt/color/ICC_ColorSpace.java \ java/awt/color/ICC_Profile.java \ java/awt/datatransfer/Clipboard.java \ + java/awt/datatransfer/ClipboardOwner.java \ + java/awt/datatransfer/DataFlavor.java \ + java/awt/datatransfer/FlavorMap.java \ + java/awt/datatransfer/MimeTypeParseException.java \ + java/awt/datatransfer/StringSelection.java \ + java/awt/datatransfer/SystemFlavorMap.java \ + java/awt/datatransfer/Transferable.java \ + java/awt/datatransfer/UnsupportedFlavorException.java \ java/awt/event/AWTEventListener.java \ java/awt/event/ActionEvent.java \ java/awt/event/ActionListener.java \ *************** java/awt/geom/AffineTransform.java \ *** 698,725 **** --- 732,768 ---- java/awt/geom/Dimension2D.java \ java/awt/geom/Ellipse2D.java \ java/awt/geom/IllegalPathStateException.java \ + java/awt/geom/Line2D.java \ java/awt/geom/NoninvertibleTransformException.java \ java/awt/geom/PathIterator.java \ java/awt/geom/Point2D.java \ java/awt/geom/Rectangle2D.java \ java/awt/geom/RectangularShape.java \ java/awt/geom/RoundRectangle2D.java \ + java/awt/image/AreaAveragingScaleFilter.java \ java/awt/image/BufferedImage.java \ java/awt/image/ColorModel.java \ java/awt/image/ComponentColorModel.java \ java/awt/image/ComponentSampleModel.java \ + java/awt/image/CropImageFilter.java \ java/awt/image/DataBuffer.java \ java/awt/image/DataBufferByte.java \ java/awt/image/DataBufferInt.java \ java/awt/image/DataBufferUShort.java \ java/awt/image/DirectColorModel.java \ + java/awt/image/FilteredImageSource.java \ java/awt/image/ImageConsumer.java \ + java/awt/image/ImageFilter.java \ java/awt/image/ImageObserver.java \ java/awt/image/ImageProducer.java \ java/awt/image/IndexColorModel.java \ + java/awt/image/MemoryImageSource.java \ java/awt/image/PackedColorModel.java \ + java/awt/image/PixelGrabber.java \ + java/awt/image/RGBImageFilter.java \ java/awt/image/Raster.java \ java/awt/image/RasterOp.java \ + java/awt/image/ReplicateScaleFilter.java \ java/awt/image/SampleModel.java \ java/awt/image/SinglePixelPackedSampleModel.java \ java/awt/image/WritableRaster.java \ *************** java/beans/beancontext/BeanContextServic *** 765,770 **** --- 808,814 ---- java/beans/beancontext/BeanContextServiceRevokedListener.java \ java/beans/beancontext/BeanContextServices.java \ java/beans/beancontext/BeanContextServicesListener.java \ + java/beans/AppletInitializer.java \ java/beans/BeanDescriptor.java \ java/beans/BeanInfo.java \ java/beans/Beans.java \ *************** java/beans/VetoableChangeListener.java \ *** 790,795 **** --- 834,1037 ---- java/beans/VetoableChangeSupport.java \ java/beans/Visibility.java + rmi_java_source_files = \ + java/rmi/activation/Activatable.java \ + java/rmi/activation/ActivateFailedException.java \ + java/rmi/activation/ActivationDesc.java \ + java/rmi/activation/ActivationException.java \ + java/rmi/activation/ActivationGroup.java \ + java/rmi/activation/ActivationGroupDesc.java \ + java/rmi/activation/ActivationGroupID.java \ + java/rmi/activation/ActivationID.java \ + java/rmi/activation/ActivationInstantiator.java \ + java/rmi/activation/ActivationMonitor.java \ + java/rmi/activation/ActivationSystem.java \ + java/rmi/activation/Activator.java \ + java/rmi/activation/UnknownGroupException.java \ + java/rmi/activation/UnknownObjectException.java \ + java/rmi/AccessException.java \ + java/rmi/AlreadyBoundException.java \ + java/rmi/ConnectException.java \ + java/rmi/ConnectIOException.java \ + java/rmi/MarshalException.java \ + java/rmi/MarshalledObject.java \ + java/rmi/Naming.java \ + java/rmi/NoSuchObjectException.java \ + java/rmi/NotBoundException.java \ + java/rmi/RMISecurityException.java \ + java/rmi/RMISecurityManager.java \ + java/rmi/Remote.java \ + java/rmi/RemoteException.java \ + java/rmi/ServerError.java \ + java/rmi/ServerException.java \ + java/rmi/ServerRuntimeException.java \ + java/rmi/StubNotFoundException.java \ + java/rmi/UnexpectedException.java \ + java/rmi/UnknownHostException.java \ + java/rmi/UnmarshalException.java \ + java/rmi/dgc/DGC.java \ + java/rmi/dgc/Lease.java \ + java/rmi/dgc/VMID.java \ + java/rmi/registry/LocateRegistry.java \ + java/rmi/registry/Registry.java \ + java/rmi/registry/RegistryHandler.java \ + java/rmi/server/ExportException.java \ + java/rmi/server/LoaderHandler.java \ + java/rmi/server/LogStream.java \ + java/rmi/server/ObjID.java \ + java/rmi/server/Operation.java \ + java/rmi/server/RMIClassLoader.java \ + java/rmi/server/RMIClientSocketFactory.java \ + java/rmi/server/RMIFailureHandler.java \ + java/rmi/server/RMIServerSocketFactory.java \ + java/rmi/server/RMISocketFactory.java \ + java/rmi/server/RemoteCall.java \ + java/rmi/server/RemoteObject.java \ + java/rmi/server/RemoteRef.java \ + java/rmi/server/RemoteServer.java \ + java/rmi/server/RemoteStub.java \ + java/rmi/server/ServerCloneException.java \ + java/rmi/server/ServerNotActiveException.java \ + java/rmi/server/ServerRef.java \ + java/rmi/server/Skeleton.java \ + java/rmi/server/SkeletonMismatchException.java \ + java/rmi/server/SkeletonNotFoundException.java \ + java/rmi/server/SocketSecurityException.java \ + java/rmi/server/UID.java \ + java/rmi/server/UnicastRemoteObject.java \ + java/rmi/server/Unreferenced.java \ + gnu/java/rmi/dgc/DGCImpl.java \ + gnu/java/rmi/dgc/DGCImpl_Skel.java \ + gnu/java/rmi/dgc/DGCImpl_Stub.java \ + gnu/java/rmi/registry/RegistryImpl.java \ + gnu/java/rmi/registry/RegistryImpl_Skel.java \ + gnu/java/rmi/registry/RegistryImpl_Stub.java \ + gnu/java/rmi/rmic/Compile_gcj.java \ + gnu/java/rmi/rmic/Compiler.java \ + gnu/java/rmi/rmic/CompilerProcess.java \ + gnu/java/rmi/rmic/RMIC.java \ + gnu/java/rmi/rmic/TabbedWriter.java \ + gnu/java/rmi/server/ProtocolConstants.java \ + gnu/java/rmi/server/RMIDefaultSocketFactory.java \ + gnu/java/rmi/server/RMIHashes.java \ + gnu/java/rmi/server/RMIObjectInputStream.java \ + gnu/java/rmi/server/RMIObjectOutputStream.java \ + gnu/java/rmi/server/UnicastConnection.java \ + gnu/java/rmi/server/UnicastConnectionManager.java \ + gnu/java/rmi/server/UnicastRef.java \ + gnu/java/rmi/server/UnicastRemoteCall.java \ + gnu/java/rmi/server/UnicastRemoteStub.java \ + gnu/java/rmi/server/UnicastServer.java \ + gnu/java/rmi/server/UnicastServerRef.java + + javax_source_files = \ + javax/naming/directory/Attribute.java \ + javax/naming/directory/AttributeInUseException.java \ + javax/naming/directory/AttributeModificationException.java \ + javax/naming/directory/Attributes.java \ + javax/naming/directory/DirContext.java \ + javax/naming/directory/InvalidAttributeIdentifierException.java \ + javax/naming/directory/InvalidAttributeValueException.java \ + javax/naming/directory/InvalidAttributesException.java \ + javax/naming/directory/InvalidSearchControlsException.java \ + javax/naming/directory/InvalidSearchFilterException.java \ + javax/naming/directory/NoSuchAttributeException.java \ + javax/naming/directory/SchemaViolationException.java \ + javax/naming/directory/BasicAttribute.java \ + javax/naming/directory/BasicAttributes.java \ + javax/naming/directory/ModificationItem.java \ + javax/naming/directory/SearchControls.java \ + javax/naming/directory/SearchResult.java \ + javax/naming/directory/InitialDirContext.java \ + javax/naming/AuthenticationException.java \ + javax/naming/AuthenticationNotSupportedException.java \ + javax/naming/CannotProceedException.java \ + javax/naming/CommunicationException.java \ + javax/naming/ConfigurationException.java \ + javax/naming/Context.java \ + javax/naming/ContextNotEmptyException.java \ + javax/naming/InsufficientResourcesException.java \ + javax/naming/InterruptedNamingException.java \ + javax/naming/BinaryRefAddr.java \ + javax/naming/LimitExceededException.java \ + javax/naming/LinkException.java \ + javax/naming/LinkLoopException.java \ + javax/naming/MalformedLinkException.java \ + javax/naming/Name.java \ + javax/naming/NameAlreadyBoundException.java \ + javax/naming/NameNotFoundException.java \ + javax/naming/NameParser.java \ + javax/naming/NamingEnumeration.java \ + javax/naming/InitialContext.java \ + javax/naming/NamingSecurityException.java \ + javax/naming/NoInitialContextException.java \ + javax/naming/NoPermissionException.java \ + javax/naming/NotContextException.java \ + javax/naming/NamingException.java \ + javax/naming/PartialResultException.java \ + javax/naming/event/EventContext.java \ + javax/naming/event/EventDirContext.java \ + javax/naming/event/NamespaceChangeListener.java \ + javax/naming/event/NamingEvent.java \ + javax/naming/event/NamingExceptionEvent.java \ + javax/naming/event/NamingListener.java \ + javax/naming/event/ObjectChangeListener.java \ + javax/naming/RefAddr.java \ + javax/naming/Reference.java \ + javax/naming/Referenceable.java \ + javax/naming/ReferralException.java \ + javax/naming/ServiceUnavailableException.java \ + javax/naming/SizeLimitExceededException.java \ + javax/naming/StringRefAddr.java \ + javax/naming/TimeLimitExceededException.java \ + javax/naming/spi/InitialContextFactory.java \ + javax/naming/spi/InitialContextFactoryBuilder.java \ + javax/naming/spi/NamingManager.java \ + javax/naming/spi/ObjectFactory.java \ + javax/naming/spi/Resolver.java \ + javax/naming/spi/DirObjectFactory.java \ + javax/naming/spi/DirStateFactory.java \ + javax/naming/spi/DirectoryManager.java \ + javax/naming/spi/ObjectFactoryBuilder.java \ + javax/naming/spi/ResolveResult.java \ + javax/naming/spi/StateFactory.java \ + javax/naming/InvalidNameException.java \ + javax/naming/Binding.java \ + javax/naming/CompositeName.java \ + javax/naming/CompoundName.java \ + javax/naming/LinkRef.java \ + javax/naming/NameClassPair.java \ + javax/naming/ldap/Control.java \ + javax/naming/ldap/ControlFactory.java \ + javax/naming/ldap/ExtendedRequest.java \ + javax/naming/ldap/ExtendedResponse.java \ + javax/naming/ldap/HasControls.java \ + javax/naming/ldap/InitialLdapContext.java \ + javax/naming/ldap/LdapContext.java \ + javax/naming/ldap/LdapReferralException.java \ + javax/naming/ldap/UnsolicitedNotification.java \ + javax/naming/ldap/UnsolicitedNotificationEvent.java \ + javax/naming/ldap/UnsolicitedNotificationListener.java \ + javax/naming/OperationNotSupportedException.java \ + javax/transaction/xa/XAException.java \ + javax/transaction/xa/XAResource.java \ + javax/transaction/xa/Xid.java \ + javax/transaction/HeuristicCommitException.java \ + javax/transaction/HeuristicMixedException.java \ + javax/transaction/HeuristicRollbackException.java \ + javax/transaction/InvalidTransactionException.java \ + javax/transaction/NotSupportedException.java \ + javax/transaction/RollbackException.java \ + javax/transaction/Status.java \ + javax/transaction/Synchronization.java \ + javax/transaction/SystemException.java \ + javax/transaction/Transaction.java \ + javax/transaction/TransactionManager.java \ + javax/transaction/TransactionRequiredException.java \ + javax/transaction/TransactionRolledbackException.java \ + javax/transaction/UserTransaction.java + + ## Java files which are created by configure and thus are in the build ## directory. built_java_source_files = java/lang/ConcreteProcess.java \ *************** java/lang/ArrayStoreException.java \ *** 806,811 **** --- 1048,1054 ---- java/lang/Boolean.java \ java/lang/Byte.java \ java/lang/Character.java \ + java/lang/CharSequence.java \ java/lang/ClassCastException.java \ java/lang/ClassCircularityError.java \ java/lang/ClassFormatError.java \ *************** java/lang/IllegalStateException.java \ *** 828,833 **** --- 1071,1077 ---- java/lang/IllegalThreadStateException.java \ java/lang/IncompatibleClassChangeError.java \ java/lang/IndexOutOfBoundsException.java \ + java/lang/InheritableThreadLocal.java \ java/lang/InstantiationError.java \ java/lang/InstantiationException.java \ java/lang/Integer.java \ *************** java/lang/NullPointerException.java \ *** 846,851 **** --- 1090,1096 ---- java/lang/Number.java \ java/lang/NumberFormatException.java \ java/lang/OutOfMemoryError.java \ + java/lang/Package.java \ java/lang/Process.java \ java/lang/Runnable.java \ java/lang/Runtime.java \ *************** java/lang/SecurityException.java \ *** 855,860 **** --- 1100,1106 ---- java/lang/SecurityManager.java \ java/lang/Short.java \ java/lang/StackOverflowError.java \ + java/lang/StrictMath.java \ java/lang/String.java \ java/lang/StringBuffer.java \ java/lang/StringIndexOutOfBoundsException.java \ *************** java/lang/System.java \ *** 862,873 **** --- 1108,1123 ---- java/lang/Thread.java \ java/lang/ThreadDeath.java \ java/lang/ThreadGroup.java \ + java/lang/ThreadLocal.java \ java/lang/Throwable.java \ java/lang/UnknownError.java \ java/lang/UnsatisfiedLinkError.java \ + java/lang/UnsupportedClassVersionError.java \ java/lang/UnsupportedOperationException.java \ java/lang/VerifyError.java \ java/lang/VirtualMachineError.java \ + java/lang/VMClassLoader.java \ + java/lang/VMSecurityManager.java \ java/lang/Void.java \ java/io/BufferedInputStream.java \ java/io/BufferedOutputStream.java \ *************** java/util/GregorianCalendar.java \ *** 967,974 **** --- 1217,1227 ---- java/util/HashMap.java \ java/util/HashSet.java \ java/util/Hashtable.java \ + java/util/IdentityHashMap.java \ java/util/Iterator.java \ java/util/LinkedList.java \ + java/util/LinkedHashMap.java \ + java/util/LinkedHashSet.java \ java/util/List.java \ java/util/ListIterator.java \ java/util/ListResourceBundle.java \ *************** java/util/Properties.java \ *** 982,987 **** --- 1235,1241 ---- java/util/PropertyPermission.java \ java/util/PropertyResourceBundle.java \ java/util/Random.java \ + java/util/RandomAccess.java \ java/util/ResourceBundle.java \ java/util/Set.java \ java/util/SimpleTimeZone.java \ *************** java/util/TooManyListenersException.java *** 998,1004 **** java/util/Vector.java \ java/util/WeakHashMap.java - ## List of all .java files to be compiled. Please keep this list ## alphabetical. Please put files from java/lang, java/io, and java/util ## into core_java_source_files. Please put files from gnu/gcj/convert --- 1252,1257 ---- *************** java/util/WeakHashMap.java *** 1006,1017 **** ## awt_java_source_files. If the .java file has a hand-maintained ## header, please list it in special_java_source_files. ordinary_java_source_files = $(core_java_source_files) \ gnu/gcj/RawData.java \ gnu/gcj/io/DefaultMimeTypes.java \ gnu/gcj/io/MimeTypes.java \ gnu/gcj/io/SimpleSHSStream.java \ ! gnu/gcj/jni/NativeThread.java \ ! gnu/gcj/math/MPN.java \ gnu/gcj/protocol/file/Connection.java \ gnu/gcj/protocol/file/Handler.java \ gnu/gcj/protocol/http/Connection.java \ --- 1259,1272 ---- ## awt_java_source_files. If the .java file has a hand-maintained ## header, please list it in special_java_source_files. ordinary_java_source_files = $(core_java_source_files) \ + gnu/gcj/Core.java \ gnu/gcj/RawData.java \ gnu/gcj/io/DefaultMimeTypes.java \ gnu/gcj/io/MimeTypes.java \ gnu/gcj/io/SimpleSHSStream.java \ ! gnu/gcj/protocol/core/Connection.java \ ! gnu/gcj/protocol/core/Handler.java \ ! gnu/gcj/protocol/core/CoreInputStream.java \ gnu/gcj/protocol/file/Connection.java \ gnu/gcj/protocol/file/Handler.java \ gnu/gcj/protocol/http/Connection.java \ *************** gnu/gcj/protocol/http/Handler.java \ *** 1019,1047 **** gnu/gcj/protocol/jar/Connection.java \ gnu/gcj/protocol/jar/Handler.java \ gnu/gcj/runtime/FileDeleter.java \ gnu/gcj/runtime/FirstThread.java \ gnu/gcj/runtime/VMClassLoader.java \ - gnu/gcj/text/BaseBreakIterator.java \ - gnu/gcj/text/CharacterBreakIterator.java \ - gnu/gcj/text/LineBreakIterator.java \ - gnu/gcj/text/LocaleData_en.java \ - gnu/gcj/text/LocaleData_en_US.java \ - gnu/gcj/text/SentenceBreakIterator.java \ - gnu/gcj/text/WordBreakIterator.java \ - gnu/gcj/util/EnumerationChain.java \ gnu/java/io/ClassLoaderObjectInputStream.java \ gnu/java/io/NullOutputStream.java \ gnu/java/io/ObjectIdentityWrapper.java \ gnu/java/lang/ArrayHelper.java \ gnu/java/lang/ClassHelper.java \ gnu/java/lang/reflect/TypeSignature.java \ gnu/java/locale/Calendar.java \ gnu/java/locale/Calendar_de.java \ gnu/java/locale/Calendar_en.java \ gnu/java/locale/Calendar_nl.java \ gnu/java/security/provider/Gnu.java \ gnu/java/security/provider/SHA.java \ gnu/java/security/provider/SHA1PRNG.java \ java/lang/ref/PhantomReference.java \ java/lang/ref/Reference.java \ java/lang/ref/ReferenceQueue.java \ --- 1274,1442 ---- gnu/gcj/protocol/jar/Connection.java \ gnu/gcj/protocol/jar/Handler.java \ gnu/gcj/runtime/FileDeleter.java \ + gnu/gcj/runtime/FinalizerThread.java \ gnu/gcj/runtime/FirstThread.java \ + gnu/gcj/runtime/JNIWeakRef.java \ + gnu/gcj/runtime/SharedLibLoader.java \ + gnu/gcj/runtime/StringBuffer.java \ gnu/gcj/runtime/VMClassLoader.java \ gnu/java/io/ClassLoaderObjectInputStream.java \ gnu/java/io/NullOutputStream.java \ gnu/java/io/ObjectIdentityWrapper.java \ gnu/java/lang/ArrayHelper.java \ gnu/java/lang/ClassHelper.java \ + gnu/java/lang/CharData.java \ gnu/java/lang/reflect/TypeSignature.java \ gnu/java/locale/Calendar.java \ gnu/java/locale/Calendar_de.java \ gnu/java/locale/Calendar_en.java \ gnu/java/locale/Calendar_nl.java \ + gnu/java/locale/LocaleInformation.java \ + gnu/java/locale/LocaleInformation_af_ZA.java \ + gnu/java/locale/LocaleInformation_ar_AE.java \ + gnu/java/locale/LocaleInformation_ar_BH.java \ + gnu/java/locale/LocaleInformation_ar_DZ.java \ + gnu/java/locale/LocaleInformation_ar_EG.java \ + gnu/java/locale/LocaleInformation_ar_IN.java \ + gnu/java/locale/LocaleInformation_ar_IQ.java \ + gnu/java/locale/LocaleInformation_ar_JO.java \ + gnu/java/locale/LocaleInformation_ar_KW.java \ + gnu/java/locale/LocaleInformation_ar_LB.java \ + gnu/java/locale/LocaleInformation_ar_LY.java \ + gnu/java/locale/LocaleInformation_ar_MA.java \ + gnu/java/locale/LocaleInformation_ar_OM.java \ + gnu/java/locale/LocaleInformation_ar_QA.java \ + gnu/java/locale/LocaleInformation_ar_SD.java \ + gnu/java/locale/LocaleInformation_ar_SY.java \ + gnu/java/locale/LocaleInformation_ar_TN.java \ + gnu/java/locale/LocaleInformation_ar_YE.java \ + gnu/java/locale/LocaleInformation_be_BY.java \ + gnu/java/locale/LocaleInformation_bn_IN.java \ + gnu/java/locale/LocaleInformation_br_FR.java \ + gnu/java/locale/LocaleInformation_bs_BA.java \ + gnu/java/locale/LocaleInformation_ca_ES.java \ + gnu/java/locale/LocaleInformation_cs_CZ.java \ + gnu/java/locale/LocaleInformation_cy_GB.java \ + gnu/java/locale/LocaleInformation_da_DK.java \ + gnu/java/locale/LocaleInformation_de.java \ + gnu/java/locale/LocaleInformation_de_AT.java \ + gnu/java/locale/LocaleInformation_de_BE.java \ + gnu/java/locale/LocaleInformation_de_CH.java \ + gnu/java/locale/LocaleInformation_de_DE.java \ + gnu/java/locale/LocaleInformation_de_LU.java \ + gnu/java/locale/LocaleInformation_el_GR.java \ + gnu/java/locale/LocaleInformation_en.java \ + gnu/java/locale/LocaleInformation_en_AU.java \ + gnu/java/locale/LocaleInformation_en_BW.java \ + gnu/java/locale/LocaleInformation_en_CA.java \ + gnu/java/locale/LocaleInformation_en_DK.java \ + gnu/java/locale/LocaleInformation_en_GB.java \ + gnu/java/locale/LocaleInformation_en_HK.java \ + gnu/java/locale/LocaleInformation_en_IE.java \ + gnu/java/locale/LocaleInformation_en_IN.java \ + gnu/java/locale/LocaleInformation_en_NZ.java \ + gnu/java/locale/LocaleInformation_en_PH.java \ + gnu/java/locale/LocaleInformation_en_SG.java \ + gnu/java/locale/LocaleInformation_en_US.java \ + gnu/java/locale/LocaleInformation_en_ZA.java \ + gnu/java/locale/LocaleInformation_en_ZW.java \ + gnu/java/locale/LocaleInformation_es_AR.java \ + gnu/java/locale/LocaleInformation_es_BO.java \ + gnu/java/locale/LocaleInformation_es_CL.java \ + gnu/java/locale/LocaleInformation_es_CO.java \ + gnu/java/locale/LocaleInformation_es_CR.java \ + gnu/java/locale/LocaleInformation_es_DO.java \ + gnu/java/locale/LocaleInformation_es_EC.java \ + gnu/java/locale/LocaleInformation_es_ES.java \ + gnu/java/locale/LocaleInformation_es_GT.java \ + gnu/java/locale/LocaleInformation_es_HN.java \ + gnu/java/locale/LocaleInformation_es_MX.java \ + gnu/java/locale/LocaleInformation_es_NI.java \ + gnu/java/locale/LocaleInformation_es_PA.java \ + gnu/java/locale/LocaleInformation_es_PE.java \ + gnu/java/locale/LocaleInformation_es_PR.java \ + gnu/java/locale/LocaleInformation_es_PY.java \ + gnu/java/locale/LocaleInformation_es_SV.java \ + gnu/java/locale/LocaleInformation_es_US.java \ + gnu/java/locale/LocaleInformation_es_UY.java \ + gnu/java/locale/LocaleInformation_es_VE.java \ + gnu/java/locale/LocaleInformation_et_EE.java \ + gnu/java/locale/LocaleInformation_eu_ES.java \ + gnu/java/locale/LocaleInformation_fa_IR.java \ + gnu/java/locale/LocaleInformation_fi_FI.java \ + gnu/java/locale/LocaleInformation_fo_FO.java \ + gnu/java/locale/LocaleInformation_fr_BE.java \ + gnu/java/locale/LocaleInformation_fr_CA.java \ + gnu/java/locale/LocaleInformation_fr_CH.java \ + gnu/java/locale/LocaleInformation_fr_FR.java \ + gnu/java/locale/LocaleInformation_fr_LU.java \ + gnu/java/locale/LocaleInformation_ga_IE.java \ + gnu/java/locale/LocaleInformation_gd_GB.java \ + gnu/java/locale/LocaleInformation_gl_ES.java \ + gnu/java/locale/LocaleInformation_gv_GB.java \ + gnu/java/locale/LocaleInformation_he_IL.java \ + gnu/java/locale/LocaleInformation_hi_IN.java \ + gnu/java/locale/LocaleInformation_hr_HR.java \ + gnu/java/locale/LocaleInformation_hu_HU.java \ + gnu/java/locale/LocaleInformation_id_ID.java \ + gnu/java/locale/LocaleInformation_it_CH.java \ + gnu/java/locale/LocaleInformation_it_IT.java \ + gnu/java/locale/LocaleInformation_iw_IL.java \ + gnu/java/locale/LocaleInformation_ja_JP.java \ + gnu/java/locale/LocaleInformation_ka_GE.java \ + gnu/java/locale/LocaleInformation_kl_GL.java \ + gnu/java/locale/LocaleInformation_ko_KR.java \ + gnu/java/locale/LocaleInformation_kw_GB.java \ + gnu/java/locale/LocaleInformation_lt_LT.java \ + gnu/java/locale/LocaleInformation_lv_LV.java \ + gnu/java/locale/LocaleInformation_mi_NZ.java \ + gnu/java/locale/LocaleInformation_mk_MK.java \ + gnu/java/locale/LocaleInformation_mr_IN.java \ + gnu/java/locale/LocaleInformation_mt_MT.java \ + gnu/java/locale/LocaleInformation_nl.java \ + gnu/java/locale/LocaleInformation_nl_BE.java \ + gnu/java/locale/LocaleInformation_nl_NL.java \ + gnu/java/locale/LocaleInformation_nn_NO.java \ + gnu/java/locale/LocaleInformation_no_NO.java \ + gnu/java/locale/LocaleInformation_oc_FR.java \ + gnu/java/locale/LocaleInformation_pl_PL.java \ + gnu/java/locale/LocaleInformation_pt_BR.java \ + gnu/java/locale/LocaleInformation_pt_PT.java \ + gnu/java/locale/LocaleInformation_ro_RO.java \ + gnu/java/locale/LocaleInformation_ru_RU.java \ + gnu/java/locale/LocaleInformation_ru_UA.java \ + gnu/java/locale/LocaleInformation_se_NO.java \ + gnu/java/locale/LocaleInformation_sk_SK.java \ + gnu/java/locale/LocaleInformation_sl_SI.java \ + gnu/java/locale/LocaleInformation_sq_AL.java \ + gnu/java/locale/LocaleInformation_sr_YU.java \ + gnu/java/locale/LocaleInformation_sv_FI.java \ + gnu/java/locale/LocaleInformation_sv_SE.java \ + gnu/java/locale/LocaleInformation_ta_IN.java \ + gnu/java/locale/LocaleInformation_te_IN.java \ + gnu/java/locale/LocaleInformation_tg_TJ.java \ + gnu/java/locale/LocaleInformation_tl_PH.java \ + gnu/java/locale/LocaleInformation_tr_TR.java \ + gnu/java/locale/LocaleInformation_uk_UA.java \ + gnu/java/locale/LocaleInformation_ur_PK.java \ + gnu/java/locale/LocaleInformation_uz_UZ.java \ + gnu/java/locale/LocaleInformation_vi_VN.java \ + gnu/java/locale/LocaleInformation_yi_US.java \ + gnu/java/locale/LocaleInformation_zh_CN.java \ + gnu/java/locale/LocaleInformation_zh_HK.java \ + gnu/java/locale/LocaleInformation_zh_SG.java \ + gnu/java/locale/LocaleInformation_zh_TW.java \ + gnu/java/math/MPN.java \ + gnu/java/security/provider/DefaultPolicy.java \ gnu/java/security/provider/Gnu.java \ gnu/java/security/provider/SHA.java \ gnu/java/security/provider/SHA1PRNG.java \ + gnu/java/text/BaseBreakIterator.java \ + gnu/java/text/CharacterBreakIterator.java \ + gnu/java/text/LineBreakIterator.java \ + gnu/java/text/SentenceBreakIterator.java \ + gnu/java/text/WordBreakIterator.java \ + gnu/java/util/DoubleEnumeration.java \ java/lang/ref/PhantomReference.java \ java/lang/ref/Reference.java \ java/lang/ref/ReferenceQueue.java \ *************** java/lang/reflect/Modifier.java \ *** 1058,1063 **** --- 1453,1459 ---- java/lang/reflect/ReflectPermission.java \ java/math/BigDecimal.java \ java/math/BigInteger.java \ + java/net/Authenticator.java \ java/net/BindException.java \ java/net/ConnectException.java \ java/net/ContentHandler.java \ *************** java/net/InetAddress.java \ *** 1071,1077 **** --- 1467,1475 ---- java/net/JarURLConnection.java \ java/net/MalformedURLException.java \ java/net/MulticastSocket.java \ + java/net/NetPermission.java \ java/net/NoRouteToHostException.java \ + java/net/PasswordAuthentication.java \ java/net/PlainDatagramSocketImpl.java \ java/net/PlainSocketImpl.java \ java/net/ProtocolException.java \ *************** java/net/SocketException.java \ *** 1081,1086 **** --- 1479,1485 ---- java/net/SocketImpl.java \ java/net/SocketImplFactory.java \ java/net/SocketOptions.java \ + java/net/SocketPermission.java \ java/net/URL.java \ java/net/URLClassLoader.java \ java/net/URLConnection.java \ *************** java/net/URLStreamHandler.java \ *** 1090,1123 **** java/net/URLStreamHandlerFactory.java \ java/net/UnknownHostException.java \ java/net/UnknownServiceException.java \ java/security/AlgorithmParameterGeneratorSpi.java \ java/security/BasicPermission.java \ java/security/DigestException.java \ java/security/DigestOutputStream.java \ java/security/GeneralSecurityException.java \ java/security/Guard.java \ java/security/InvalidAlgorithmParameterException.java \ java/security/InvalidKeyException.java \ java/security/InvalidParameterException.java \ java/security/Key.java \ ! java/security/KeyException.java \ ! java/security/KeyPair.java \ java/security/KeyPairGenerator.java \ java/security/KeyPairGeneratorSpi.java \ java/security/MessageDigest.java \ java/security/NoSuchAlgorithmException.java \ java/security/NoSuchProviderException.java \ java/security/Permission.java \ - java/security/PermissionCollection.java \ java/security/Principal.java \ java/security/PrivateKey.java \ java/security/Provider.java \ ! java/security/PublicKey.java \ java/security/SecureClassLoader.java \ ! java/security/SecureRandom.java \ java/security/Security.java \ java/security/Signature.java \ ! java/security/SignatureException.java \ java/security/cert/CRL.java \ java/security/cert/CRLException.java \ java/security/cert/Certificate.java \ --- 1489,1568 ---- java/net/URLStreamHandlerFactory.java \ java/net/UnknownHostException.java \ java/net/UnknownServiceException.java \ + java/security/AccessControlContext.java \ + java/security/AccessControlException.java \ + java/security/AccessController.java \ + java/security/AlgorithmParameterGenerator.java \ + java/security/AlgorithmParameters.java \ java/security/AlgorithmParameterGeneratorSpi.java \ + java/security/AlgorithmParametersSpi.java \ + java/security/AllPermission.java \ java/security/BasicPermission.java \ + java/security/Certificate.java \ + java/security/CodeSource.java \ java/security/DigestException.java \ java/security/DigestOutputStream.java \ + java/security/DummyKeyPairGenerator.java \ + java/security/DummySignature.java \ + java/security/DigestInputStream.java \ + java/security/DomainCombiner.java \ + java/security/DummyMessageDigest.java \ java/security/GeneralSecurityException.java \ java/security/Guard.java \ + java/security/GuardedObject.java \ + java/security/Identity.java \ + java/security/IdentityScope.java \ java/security/InvalidAlgorithmParameterException.java \ java/security/InvalidKeyException.java \ java/security/InvalidParameterException.java \ java/security/Key.java \ ! java/security/KeyFactorySpi.java \ java/security/KeyPairGenerator.java \ + java/security/KeyStoreException.java \ + java/security/KeyException.java \ + java/security/KeyManagementException.java \ java/security/KeyPairGeneratorSpi.java \ + java/security/KeyStoreSpi.java \ + java/security/KeyFactory.java \ + java/security/KeyPair.java \ + java/security/KeyStore.java \ java/security/MessageDigest.java \ + java/security/MessageDigestSpi.java \ java/security/NoSuchAlgorithmException.java \ java/security/NoSuchProviderException.java \ java/security/Permission.java \ java/security/Principal.java \ + java/security/PrivilegedExceptionAction.java \ + java/security/PublicKey.java \ + java/security/PermissionCollection.java \ java/security/PrivateKey.java \ + java/security/ProtectionDomain.java \ + java/security/Permissions.java \ + java/security/PrivilegedAction.java \ java/security/Provider.java \ ! java/security/Policy.java \ ! java/security/PrivilegedActionException.java \ ! java/security/ProviderException.java \ java/security/SecureClassLoader.java \ ! java/security/SecureRandomSpi.java \ ! java/security/SecurityPermission.java \ ! java/security/SignatureException.java \ ! java/security/SignedObject.java \ ! java/security/SecureRandom.java \ java/security/Security.java \ java/security/Signature.java \ ! java/security/SignatureSpi.java \ ! java/security/Signer.java \ ! java/security/UnrecoverableKeyException.java \ ! java/security/UnresolvedPermission.java \ ! java/security/acl/Acl.java \ ! java/security/acl/AclNotFoundException.java \ ! java/security/acl/LastOwnerException.java \ ! java/security/acl/Owner.java \ ! java/security/acl/AclEntry.java \ ! java/security/acl/Group.java \ ! java/security/acl/NotOwnerException.java \ ! java/security/acl/Permission.java \ java/security/cert/CRL.java \ java/security/cert/CRLException.java \ java/security/cert/Certificate.java \ *************** java/security/cert/X509CRLEntry.java \ *** 1133,1151 **** java/security/cert/X509Certificate.java \ java/security/cert/X509Extension.java \ java/security/interfaces/DSAKey.java \ ! java/security/interfaces/DSAParams.java \ java/security/interfaces/DSAPrivateKey.java \ java/security/interfaces/DSAPublicKey.java \ java/security/interfaces/RSAPrivateCrtKey.java \ java/security/interfaces/RSAPrivateKey.java \ java/security/interfaces/RSAPublicKey.java \ java/security/spec/AlgorithmParameterSpec.java \ ! java/security/spec/InvalidKeySpecException.java \ java/security/spec/InvalidParameterSpecException.java \ ! java/security/spec/KeySpec.java \ java/security/spec/RSAPrivateCrtKeySpec.java \ java/security/spec/RSAPrivateKeySpec.java \ java/security/spec/RSAPublicKeySpec.java \ java/sql/Array.java \ java/sql/BatchUpdateException.java \ java/sql/Blob.java \ --- 1578,1605 ---- java/security/cert/X509Certificate.java \ java/security/cert/X509Extension.java \ java/security/interfaces/DSAKey.java \ ! java/security/interfaces/DSAKeyPairGenerator.java \ ! java/security/interfaces/DSAParams.java \ java/security/interfaces/DSAPrivateKey.java \ java/security/interfaces/DSAPublicKey.java \ + java/security/interfaces/RSAKey.java \ java/security/interfaces/RSAPrivateCrtKey.java \ java/security/interfaces/RSAPrivateKey.java \ java/security/interfaces/RSAPublicKey.java \ java/security/spec/AlgorithmParameterSpec.java \ ! java/security/spec/DSAParameterSpec.java \ ! java/security/spec/DSAPrivateKeySpec.java \ ! java/security/spec/DSAPublicKeySpec.java \ ! java/security/spec/EncodedKeySpec.java \ ! java/security/spec/InvalidKeySpecException.java \ java/security/spec/InvalidParameterSpecException.java \ ! java/security/spec/KeySpec.java \ ! java/security/spec/PKCS8EncodedKeySpec.java \ ! java/security/spec/RSAKeyGenParameterSpec.java \ java/security/spec/RSAPrivateCrtKeySpec.java \ java/security/spec/RSAPrivateKeySpec.java \ java/security/spec/RSAPublicKeySpec.java \ + java/security/spec/X509EncodedKeySpec.java \ java/sql/Array.java \ java/sql/BatchUpdateException.java \ java/sql/Blob.java \ *************** java/sql/Struct.java \ *** 1172,1177 **** --- 1626,1635 ---- java/sql/Time.java \ java/sql/Timestamp.java \ java/sql/Types.java \ + java/text/Annotation.java \ + java/text/AttributedCharacterIterator.java \ + java/text/AttributedString.java \ + java/text/AttributedStringIterator.java \ java/text/BreakIterator.java \ java/text/CharacterIterator.java \ java/text/ChoiceFormat.java \ *************** java/util/zip/ZipException.java \ *** 1216,1223 **** java/util/zip/ZipFile.java \ java/util/zip/ZipInputStream.java \ java/util/zip/ZipOutputStream.java \ $(awt_java_source_files) \ ! $(convert_source_files) java_source_files = $(special_java_source_files) $(ordinary_java_source_files) --- 1674,1737 ---- java/util/zip/ZipFile.java \ java/util/zip/ZipInputStream.java \ java/util/zip/ZipOutputStream.java \ + org/w3c/dom/Attr.java \ + org/w3c/dom/CDATASection.java \ + org/w3c/dom/CharacterData.java \ + org/w3c/dom/Comment.java \ + org/w3c/dom/DOMException.java \ + org/w3c/dom/DOMImplementation.java \ + org/w3c/dom/Document.java \ + org/w3c/dom/DocumentFragment.java \ + org/w3c/dom/DocumentType.java \ + org/w3c/dom/Element.java \ + org/w3c/dom/Entity.java \ + org/w3c/dom/EntityReference.java \ + org/w3c/dom/NamedNodeMap.java \ + org/w3c/dom/Node.java \ + org/w3c/dom/NodeList.java \ + org/w3c/dom/Notation.java \ + org/w3c/dom/ProcessingInstruction.java \ + org/w3c/dom/Text.java \ + org/w3c/dom/ranges/DocumentRange.java \ + org/w3c/dom/ranges/Range.java \ + org/w3c/dom/ranges/RangeException.java \ + org/w3c/dom/traversal/DocumentTraversal.java \ + org/w3c/dom/traversal/NodeFilter.java \ + org/w3c/dom/traversal/NodeIterator.java \ + org/w3c/dom/traversal/TreeWalker.java \ + org/xml/sax/ext/DeclHandler.java \ + org/xml/sax/ext/LexicalHandler.java \ + org/xml/sax/helpers/AttributeListImpl.java \ + org/xml/sax/helpers/AttributesImpl.java \ + org/xml/sax/helpers/DefaultHandler.java \ + org/xml/sax/helpers/LocatorImpl.java \ + org/xml/sax/helpers/NamespaceSupport.java \ + org/xml/sax/helpers/ParserAdapter.java \ + org/xml/sax/helpers/ParserFactory.java \ + org/xml/sax/helpers/XMLFilterImpl.java \ + org/xml/sax/helpers/XMLReaderAdapter.java \ + org/xml/sax/helpers/XMLReaderFactory.java \ + org/xml/sax/AttributeList.java \ + org/xml/sax/Attributes.java \ + org/xml/sax/ContentHandler.java \ + org/xml/sax/DTDHandler.java \ + org/xml/sax/DocumentHandler.java \ + org/xml/sax/EntityResolver.java \ + org/xml/sax/ErrorHandler.java \ + org/xml/sax/HandlerBase.java \ + org/xml/sax/InputSource.java \ + org/xml/sax/Locator.java \ + org/xml/sax/Parser.java \ + org/xml/sax/SAXException.java \ + org/xml/sax/SAXNotRecognizedException.java \ + org/xml/sax/SAXNotSupportedException.java \ + org/xml/sax/SAXParseException.java \ + org/xml/sax/XMLFilter.java \ + org/xml/sax/XMLReader.java \ + $(rmi_java_source_files) \ $(awt_java_source_files) \ ! $(convert_source_files) \ ! $(javax_source_files) java_source_files = $(special_java_source_files) $(ordinary_java_source_files) *************** c_source_files = \ *** 1242,1247 **** --- 1756,1762 ---- ## This lists all the C++ source files in subdirectories. nat_source_files = \ + gnu/gcj/natCore.cc \ gnu/gcj/convert/JIS0208_to_Unicode.cc \ gnu/gcj/convert/JIS0212_to_Unicode.cc \ gnu/gcj/convert/Unicode_to_JIS.cc \ *************** gnu/gcj/convert/natOutput_EUCJIS.cc \ *** 1252,1259 **** gnu/gcj/convert/natOutput_SJIS.cc \ gnu/gcj/io/natSimpleSHSStream.cc \ gnu/gcj/io/shs.cc \ ! gnu/gcj/jni/natNativeThread.cc \ gnu/gcj/runtime/natFirstThread.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ --- 1767,1777 ---- gnu/gcj/convert/natOutput_SJIS.cc \ gnu/gcj/io/natSimpleSHSStream.cc \ gnu/gcj/io/shs.cc \ ! gnu/gcj/protocol/core/natCoreInputStream.cc \ ! gnu/gcj/runtime/natFinalizerThread.cc \ gnu/gcj/runtime/natFirstThread.cc \ + gnu/gcj/runtime/natSharedLibLoader.cc \ + gnu/gcj/runtime/natStringBuffer.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ *************** java/lang/natMath.cc \ *** 1268,1276 **** --- 1786,1796 ---- java/lang/natObject.cc \ java/lang/natRuntime.cc \ java/lang/natString.cc \ + java/lang/natStringBuffer.cc \ java/lang/natSystem.cc \ java/lang/natThread.cc \ java/lang/natThrowable.cc \ + java/lang/ref/natReference.cc \ java/lang/reflect/natArray.cc \ java/lang/reflect/natConstructor.cc \ java/lang/reflect/natField.cc \ *************** java/net/natInetAddress.cc \ *** 1279,1285 **** java/net/natPlainDatagramSocketImpl.cc \ java/net/natPlainSocketImpl.cc \ java/text/natCollator.cc \ - java/util/natGregorianCalendar.cc \ java/util/zip/natDeflater.cc \ java/util/zip/natInflater.cc --- 1799,1804 ---- *************** texinfo: TexinfoDoclet.class *** 1387,1395 **** -include deps.mk ## This is an evil hack to work around an automake limitation. We ! ## need to ensure that the built headers are built before we try to ! ## compile the C++ sources, but we can't make the .o files depend on ! ## the headers, because in that case we'll force a complete rebuild of ## the C++ code whenever any .java file is touched. all-recursive: $(nat_headers) $(x_nat_headers) --- 1906,1914 ---- -include deps.mk ## This is an evil hack to work around an automake limitation. We ! ## need to ensure that all CNI headers are built, not just the ones used ! ## internally by libgcj. We can't make the .o files depend on nat_headers, ! ## because in that case we'll force a complete rebuild of ## the C++ code whenever any .java file is touched. all-recursive: $(nat_headers) $(x_nat_headers) diff -Nrc3pad gcc-3.0.4/libjava/Makefile.in gcc-3.1/libjava/Makefile.in *** gcc-3.0.4/libjava/Makefile.in Wed Feb 20 19:40:48 2002 --- gcc-3.1/libjava/Makefile.in Wed May 15 02:40:18 2002 *************** AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ *** 67,72 **** --- 67,73 ---- AR = @AR@ AS = @AS@ CC = @CC@ + CHECKREFSPEC = @CHECKREFSPEC@ COMPPATH = @COMPPATH@ CXX = @CXX@ CXXCPP = @CXXCPP@ *************** GCLIBS = @GCLIBS@ *** 84,93 **** GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! ICONV_LDFLAGS = @ICONV_LDFLAGS@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBDATASTARTSPEC = @LIBDATASTARTSPEC@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ --- 85,94 ---- GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! HASH_SYNC_SPEC = @HASH_SYNC_SPEC@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBFFI = @LIBFFI@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ *************** OBJDUMP = @OBJDUMP@ *** 103,175 **** OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ - ZDEPS = @ZDEPS@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ AUTOMAKE_OPTIONS = foreign ! @TESTSUBDIR_TRUE@SUBDIRS = \ ! @TESTSUBDIR_TRUE@$(DIRLTDL) testsuite gcj include ! @TESTSUBDIR_FALSE@SUBDIRS = \ ! @TESTSUBDIR_FALSE@$(DIRLTDL) gcj include ! @USE_LIBDIR_TRUE@toolexeclibdir = \ ! @USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexeclibdir = \ ! @USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexecdir = \ ! @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) ! @XLIB_AWT_TRUE@cond_x_ltlibrary = \ ! @XLIB_AWT_TRUE@libgcjx.la ! @XLIB_AWT_FALSE@cond_x_ltlibrary = \ toolexeclib_LTLIBRARIES = libgcj.la $(cond_x_ltlibrary) toolexeclib_DATA = libgcj.spec - data_DATA = libgcj.jar ! @NEEDS_DATA_START_TRUE@toolexeclib_LIBRARIES = \ ! @NEEDS_DATA_START_TRUE@libgcjdata.a ! @NEEDS_DATA_START_TRUE@libgcjdata_a_SOURCES = \ ! @NEEDS_DATA_START_TRUE@libgcjdata.c ! @NATIVE_TRUE@bin_PROGRAMS = \ ! @NATIVE_TRUE@jv-convert gij bin_SCRIPTS = addr2name.awk ! @CANADIAN_TRUE@@NULL_TARGET_TRUE@ZIP = \ ! @CANADIAN_TRUE@@NULL_TARGET_TRUE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT) ! @CANADIAN_TRUE@@NULL_TARGET_FALSE@ZIP = \ ! @CANADIAN_TRUE@@NULL_TARGET_FALSE@jar ! @CANADIAN_FALSE@ZIP = \ ! @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT) ! @CANADIAN_TRUE@GCJH = \ ! @CANADIAN_TRUE@gcjh ! @CANADIAN_FALSE@GCJH = \ ! @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT) GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8 ! GCJCOMPILE = $(LIBTOOL) --tag=GCJ --mode=compile $(GCJ_WITH_FLAGS) -fassume-compiled -fclasspath=$(here) -L$(here) $(JC1FLAGS) -MD -MT $@ -MF $(@:.lo=.d) -c ! GCJLINK = $(LIBTOOL) --tag=GCJ --mode=link $(GCJ) -L$(here) $(JC1FLAGS) \ ! $(ICONV_LDFLAGS) $(LDFLAGS) -o $@ ! ! LIBLINK = $(LIBTOOL) --tag=CC --mode=link $(CC) -L$(here) $(JC1FLAGS) \ ! $(ICONV_LDFLAGS) $(LDFLAGS) -o $@ ! LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) --- 104,164 ---- OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ + PLATFORMOBJS = @PLATFORMOBJS@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ + SYS_ZLIBS = @SYS_ZLIBS@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ + THREADLDFLAGS = @THREADLDFLAGS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ + gcc_version = @gcc_version@ + glibjava_CXX = @glibjava_CXX@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ + tool_include_dir = @tool_include_dir@ AUTOMAKE_OPTIONS = foreign ! @TESTSUBDIR_TRUE@SUBDIRS = @TESTSUBDIR_TRUE@$(DIRLTDL) testsuite gcj include ! @TESTSUBDIR_FALSE@SUBDIRS = @TESTSUBDIR_FALSE@$(DIRLTDL) gcj include ! @USE_LIBDIR_TRUE@toolexeclibdir = @USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexeclibdir = @USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexecdir = @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) ! @XLIB_AWT_TRUE@cond_x_ltlibrary = @XLIB_AWT_TRUE@libgcjx.la ! @XLIB_AWT_FALSE@cond_x_ltlibrary = toolexeclib_LTLIBRARIES = libgcj.la $(cond_x_ltlibrary) toolexeclib_DATA = libgcj.spec ! jardir = $(datadir)/java ! jar_DATA = libgcj-@gcc_version@.jar ! secdir = $(libdir)/security ! ! @NATIVE_TRUE@bin_PROGRAMS = @NATIVE_TRUE@jv-convert gij rmic rmiregistry bin_SCRIPTS = addr2name.awk ! @CANADIAN_TRUE@@NULL_TARGET_TRUE@ZIP = @CANADIAN_TRUE@@NULL_TARGET_TRUE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT) ! @CANADIAN_TRUE@@NULL_TARGET_FALSE@ZIP = @CANADIAN_TRUE@@NULL_TARGET_FALSE@jar ! @CANADIAN_FALSE@ZIP = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/fastjar/jar$(EXEEXT) ! @CANADIAN_TRUE@GCJH = @CANADIAN_TRUE@gcjh ! @CANADIAN_FALSE@GCJH = @CANADIAN_FALSE@$(MULTIBUILDTOP)../$(COMPPATH)/gcc/gcjh$(EXEEXT) GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8 ! GCJCOMPILE = $(LIBTOOL) --tag=GCJ --mode=compile $(GCJ_WITH_FLAGS) -fclasspath= -fbootclasspath=$(here) $(JC1FLAGS) -MD -MT $@ -MF $(@:.lo=.d) -c ! GCJLINK = $(LIBTOOL) --tag=GCJ --mode=link $(GCJ) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ ! LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) $(LDFLAGS) -o $@ LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) *************** GCC_UNWIND_INCLUDE = @GCC_UNWIND_INCLUDE *** 180,196 **** WARNINGS = -W -Wall AM_CXXFLAGS = -fno-rtti -fnon-call-exceptions \ -fdollars-in-identifiers \ ! @LIBGCJ_CXXFLAGS@ @X_CFLAGS@ $(WARNINGS) -D_GNU_SOURCE ! @USING_GCC_TRUE@AM_CFLAGS = \ ! @USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS) ! @USING_GCC_FALSE@AM_CFLAGS = \ ! @USING_GCC_FALSE@@LIBGCJ_CFLAGS@ JCFLAGS = -g JC1FLAGS = @LIBGCJ_JAVAFLAGS@ $(GCJFLAGS) ! LIBFFIINCS = -I$(top_srcdir)/../libffi/include -I$(MULTIBUILDTOP)../libffi/include INCLUDES = -I$(top_srcdir) -Iinclude -I$(top_srcdir)/include \ $(GCINCS) $(THREADINCS) $(INCLTDL) \ --- 169,184 ---- WARNINGS = -W -Wall AM_CXXFLAGS = -fno-rtti -fnon-call-exceptions \ -fdollars-in-identifiers \ ! @LIBGCJ_CXXFLAGS@ @X_CFLAGS@ $(WARNINGS) -D_GNU_SOURCE \ ! -DPREFIX="\"$(prefix)\"" ! @USING_GCC_TRUE@AM_CFLAGS = @USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS) ! @USING_GCC_FALSE@AM_CFLAGS = @USING_GCC_FALSE@@LIBGCJ_CFLAGS@ JCFLAGS = -g JC1FLAGS = @LIBGCJ_JAVAFLAGS@ $(GCJFLAGS) ! LIBFFIINCS = @LIBFFIINCS@ INCLUDES = -I$(top_srcdir) -Iinclude -I$(top_srcdir)/include \ $(GCINCS) $(THREADINCS) $(INCLTDL) \ *************** javao_files = $(java_source_files:.java= *** 205,234 **** x_javao_files = $(x_java_source_files:.java=.lo) ! libgcj_la_SOURCES = prims.cc posix.cc jni.cc exception.cc \ ! resolve.cc defineclass.cc interpret.cc name-finder.cc \ $(nat_source_files) EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \ $(c_source_files) $(java_source_files) $(built_java_source_files) ! libgcj_la_DEPENDENCIES = libgcj.jar $(javao_files) \ ! $(c_files) $(GCOBJS) $(THREADOBJS) $(LIBLTDL) libgcj_la_LIBADD = $(javao_files) $(c_files) $(GCOBJS) \ ! $(THREADOBJS) # Include THREADLIBS here to ensure that the correct version of # certain linuxthread functions get linked: ! libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLIBS) $(LIBLTDL) \ -version-info `grep -v '^\#' $(srcdir)/libtool-version` libgcj_la_LINK = $(LIBLINK) libgcjx_la_SOURCES = $(x_nat_source_files) EXTRA_libgcjx_la_SOURCES = $(x_java_source_files) ! libgcjx_la_DEPENDENCIES = libgcj.jar $(x_javao_files) libgcjx_la_LIBADD = $(x_javao_files) libgcjx_la_LDFLAGS = @X_PRE_LIBS@ @X_LIBS@ -lX11 @X_EXTRA_LIBS@ \ -rpath $(toolexeclibdir) \ --- 193,225 ---- x_javao_files = $(x_java_source_files:.java=.lo) ! libgcj_la_SOURCES = prims.cc jni.cc exception.cc \ ! resolve.cc defineclass.cc interpret.cc name-finder.cc verify.cc \ $(nat_source_files) EXTRA_libgcj_la_SOURCES = boehm.cc nogc.cc posix-threads.cc no-threads.cc \ + win32-threads.cc posix.cc win32.cc \ $(c_source_files) $(java_source_files) $(built_java_source_files) ! libgcj_la_DEPENDENCIES = libgcj-@gcc_version@.jar $(javao_files) \ ! $(c_files) $(GCOBJS) $(THREADOBJS) $(PLATFORMOBJS) $(LIBLTDL) \ ! $(LIBFFI) $(ZLIBS) $(GCLIBS) libgcj_la_LIBADD = $(javao_files) $(c_files) $(GCOBJS) \ ! $(THREADOBJS) $(PLATFORMOBJS) # Include THREADLIBS here to ensure that the correct version of # certain linuxthread functions get linked: ! libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(THREADLIBS) \ ! $(LIBLTDL) $(SYS_ZLIBS) \ -version-info `grep -v '^\#' $(srcdir)/libtool-version` libgcj_la_LINK = $(LIBLINK) libgcjx_la_SOURCES = $(x_nat_source_files) EXTRA_libgcjx_la_SOURCES = $(x_java_source_files) ! libgcjx_la_DEPENDENCIES = libgcj-@gcc_version@.jar $(x_javao_files) libgcjx_la_LIBADD = $(x_javao_files) libgcjx_la_LDFLAGS = @X_PRE_LIBS@ @X_LIBS@ -lX11 @X_EXTRA_LIBS@ \ -rpath $(toolexeclibdir) \ *************** libgcjx_la_LDFLAGS = @X_PRE_LIBS@ @X_LIB *** 237,281 **** libgcjx_la_LINK = $(LIBLINK) MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files) $(x_javao_files) $(x_nat_files) $(x_nat_headers) ! CLEANFILES = tmp-list libgcj.jar SUFFIXES = .class .java .h ! nat_headers = $(ordinary_java_source_files:.java=.h) \ ! $(built_java_source_files:.java=.h) \ ! java/io/ObjectOutputStream$$PutField.h \ java/io/ObjectInputStream$$GetField.h x_nat_headers = $(x_java_source_files:.java=.h) extra_headers = java/lang/Object.h java/lang/Class.h NM = nm ! @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = \ ! @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@gen-from-JIS CONVERT_DIR = gnu/gcj/convert jv_convert_SOURCES = EXTRA_jv_convert_SOURCES = $(convert_source_files) jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ ! -rpath $(toolexeclibdir) -shared-libgcc jv_convert_LINK = $(GCJLINK) ! jv_convert_LDADD = $(convert_source_files:.java=.lo) libgcj.la \ ! $(GCLIBS) $(THREADLIBS) $(ZLIBS) -L$(here)/.libs ! jv_convert_DEPENDENCIES = $(convert_source_files:.java=.lo) \ ! $(GCDEPS) $(THREADDEPS) $(ZDEPS) libgcj.la libgcj.spec gij_SOURCES = gij.cc ! gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc gij_LINK = $(GCJLINK) ! gij_LDADD = libgcj.la $(GCLIBS) $(THREADLIBS) $(ZLIBS) -L$(here)/.libs ! gij_DEPENDENCIES = $(GCDEPS) $(THREADDEPS) $(ZDEPS) libgcj.la libgcj.spec gen_from_JIS_SOURCES = EXTRA_gen_from_JIS_SOURCES = $(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c \ --- 228,291 ---- libgcjx_la_LINK = $(LIBLINK) MOSTLYCLEANFILES = $(javao_files) $(nat_files) $(nat_headers) $(c_files) $(x_javao_files) $(x_nat_files) $(x_nat_headers) ! CLEANFILES = tmp-list libgcj-@gcc_version@.jar SUFFIXES = .class .java .h ! ordinary_nat_headers = $(ordinary_java_source_files:.java=.h) \ ! $(built_java_source_files:.java=.h) ! ! ! inner_nat_headers = java/io/ObjectOutputStream$$PutField.h \ java/io/ObjectInputStream$$GetField.h + nat_headers = $(ordinary_nat_headers) $(inner_nat_headers) + x_nat_headers = $(x_java_source_files:.java=.h) extra_headers = java/lang/Object.h java/lang/Class.h NM = nm ! @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@gen-from-JIS CONVERT_DIR = gnu/gcj/convert jv_convert_SOURCES = EXTRA_jv_convert_SOURCES = $(convert_source_files) jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \ ! -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) jv_convert_LINK = $(GCJLINK) ! jv_convert_LDADD = -L$(here)/.libs libgcj.la jv_convert_DEPENDENCIES = $(convert_source_files:.java=.lo) \ ! libgcj.la libgcj.spec gij_SOURCES = gij.cc ! gij_LDFLAGS = -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) gij_LINK = $(GCJLINK) ! gij_LDADD = -L$(here)/.libs libgcj.la ! gij_DEPENDENCIES = libgcj.la libgcj.spec ! ! rmic_SOURCES = ! EXTRA_rmic_SOURCES = $(rmi_java_source_files) ! rmic_LDFLAGS = --main=gnu.java.rmi.rmic.RMIC \ ! -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ! ! rmic_LINK = $(GCJLINK) ! rmic_LDADD = -L$(here)/.libs libgcj.la ! rmic_DEPENDENCIES = libgcj.la libgcj.spec ! ! rmiregistry_SOURCES = ! EXTRA_rmiregistry_SOURCES = $(rmi_java_source_files) ! rmiregistry_LDFLAGS = --main=gnu.java.rmi.registry.RegistryImpl \ ! -rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) ! ! rmiregistry_LINK = $(GCJLINK) ! rmiregistry_LDADD = -L$(here)/.libs libgcj.la ! rmiregistry_DEPENDENCIES = libgcj.la libgcj.spec gen_from_JIS_SOURCES = EXTRA_gen_from_JIS_SOURCES = $(srcdir)/$(CONVERT_DIR)/gen-from-JIS.c \ *************** gnu/awt/j2d/DirectRasterGraphics.java \ *** 319,328 **** gnu/awt/j2d/Graphics2DImpl.java \ gnu/awt/j2d/IntegerGraphicsState.java \ gnu/awt/j2d/MappedRaster.java \ ! gnu/gcj/awt/BitMaskExtent.java \ ! gnu/gcj/awt/Buffers.java \ ! gnu/gcj/awt/ComponentDataBlitOp.java \ ! gnu/gcj/awt/GLightweightPeer.java \ gnu/java/beans/editors/ColorEditor.java \ gnu/java/beans/editors/FontEditor.java \ gnu/java/beans/editors/NativeBooleanEditor.java \ --- 329,338 ---- gnu/awt/j2d/Graphics2DImpl.java \ gnu/awt/j2d/IntegerGraphicsState.java \ gnu/awt/j2d/MappedRaster.java \ ! gnu/java/awt/BitMaskExtent.java \ ! gnu/java/awt/Buffers.java \ ! gnu/java/awt/ComponentDataBlitOp.java \ ! gnu/java/awt/GLightweightPeer.java \ gnu/java/beans/editors/ColorEditor.java \ gnu/java/beans/editors/FontEditor.java \ gnu/java/beans/editors/NativeBooleanEditor.java \ *************** java/awt/Label.java \ *** 385,390 **** --- 395,401 ---- java/awt/LayoutManager.java \ java/awt/LayoutManager2.java \ java/awt/List.java \ + java/awt/MediaTracker.java \ java/awt/Menu.java \ java/awt/MenuBar.java \ java/awt/MenuComponent.java \ *************** java/awt/Paint.java \ *** 395,401 **** --- 406,415 ---- java/awt/PaintContext.java \ java/awt/Panel.java \ java/awt/Point.java \ + java/awt/Polygon.java \ java/awt/PopupMenu.java \ + java/awt/PrintGraphics.java \ + java/awt/PrintJob.java \ java/awt/Rectangle.java \ java/awt/RenderingHints.java \ java/awt/ScrollPane.java \ *************** java/awt/color/ColorSpace.java \ *** 412,417 **** --- 426,439 ---- java/awt/color/ICC_ColorSpace.java \ java/awt/color/ICC_Profile.java \ java/awt/datatransfer/Clipboard.java \ + java/awt/datatransfer/ClipboardOwner.java \ + java/awt/datatransfer/DataFlavor.java \ + java/awt/datatransfer/FlavorMap.java \ + java/awt/datatransfer/MimeTypeParseException.java \ + java/awt/datatransfer/StringSelection.java \ + java/awt/datatransfer/SystemFlavorMap.java \ + java/awt/datatransfer/Transferable.java \ + java/awt/datatransfer/UnsupportedFlavorException.java \ java/awt/event/AWTEventListener.java \ java/awt/event/ActionEvent.java \ java/awt/event/ActionListener.java \ *************** java/awt/geom/AffineTransform.java \ *** 454,481 **** --- 476,512 ---- java/awt/geom/Dimension2D.java \ java/awt/geom/Ellipse2D.java \ java/awt/geom/IllegalPathStateException.java \ + java/awt/geom/Line2D.java \ java/awt/geom/NoninvertibleTransformException.java \ java/awt/geom/PathIterator.java \ java/awt/geom/Point2D.java \ java/awt/geom/Rectangle2D.java \ java/awt/geom/RectangularShape.java \ java/awt/geom/RoundRectangle2D.java \ + java/awt/image/AreaAveragingScaleFilter.java \ java/awt/image/BufferedImage.java \ java/awt/image/ColorModel.java \ java/awt/image/ComponentColorModel.java \ java/awt/image/ComponentSampleModel.java \ + java/awt/image/CropImageFilter.java \ java/awt/image/DataBuffer.java \ java/awt/image/DataBufferByte.java \ java/awt/image/DataBufferInt.java \ java/awt/image/DataBufferUShort.java \ java/awt/image/DirectColorModel.java \ + java/awt/image/FilteredImageSource.java \ java/awt/image/ImageConsumer.java \ + java/awt/image/ImageFilter.java \ java/awt/image/ImageObserver.java \ java/awt/image/ImageProducer.java \ java/awt/image/IndexColorModel.java \ + java/awt/image/MemoryImageSource.java \ java/awt/image/PackedColorModel.java \ + java/awt/image/PixelGrabber.java \ + java/awt/image/RGBImageFilter.java \ java/awt/image/Raster.java \ java/awt/image/RasterOp.java \ + java/awt/image/ReplicateScaleFilter.java \ java/awt/image/SampleModel.java \ java/awt/image/SinglePixelPackedSampleModel.java \ java/awt/image/WritableRaster.java \ *************** java/beans/beancontext/BeanContextServic *** 521,526 **** --- 552,558 ---- java/beans/beancontext/BeanContextServiceRevokedListener.java \ java/beans/beancontext/BeanContextServices.java \ java/beans/beancontext/BeanContextServicesListener.java \ + java/beans/AppletInitializer.java \ java/beans/BeanDescriptor.java \ java/beans/BeanInfo.java \ java/beans/Beans.java \ *************** java/beans/VetoableChangeSupport.java \ *** 547,552 **** --- 579,783 ---- java/beans/Visibility.java + rmi_java_source_files = \ + java/rmi/activation/Activatable.java \ + java/rmi/activation/ActivateFailedException.java \ + java/rmi/activation/ActivationDesc.java \ + java/rmi/activation/ActivationException.java \ + java/rmi/activation/ActivationGroup.java \ + java/rmi/activation/ActivationGroupDesc.java \ + java/rmi/activation/ActivationGroupID.java \ + java/rmi/activation/ActivationID.java \ + java/rmi/activation/ActivationInstantiator.java \ + java/rmi/activation/ActivationMonitor.java \ + java/rmi/activation/ActivationSystem.java \ + java/rmi/activation/Activator.java \ + java/rmi/activation/UnknownGroupException.java \ + java/rmi/activation/UnknownObjectException.java \ + java/rmi/AccessException.java \ + java/rmi/AlreadyBoundException.java \ + java/rmi/ConnectException.java \ + java/rmi/ConnectIOException.java \ + java/rmi/MarshalException.java \ + java/rmi/MarshalledObject.java \ + java/rmi/Naming.java \ + java/rmi/NoSuchObjectException.java \ + java/rmi/NotBoundException.java \ + java/rmi/RMISecurityException.java \ + java/rmi/RMISecurityManager.java \ + java/rmi/Remote.java \ + java/rmi/RemoteException.java \ + java/rmi/ServerError.java \ + java/rmi/ServerException.java \ + java/rmi/ServerRuntimeException.java \ + java/rmi/StubNotFoundException.java \ + java/rmi/UnexpectedException.java \ + java/rmi/UnknownHostException.java \ + java/rmi/UnmarshalException.java \ + java/rmi/dgc/DGC.java \ + java/rmi/dgc/Lease.java \ + java/rmi/dgc/VMID.java \ + java/rmi/registry/LocateRegistry.java \ + java/rmi/registry/Registry.java \ + java/rmi/registry/RegistryHandler.java \ + java/rmi/server/ExportException.java \ + java/rmi/server/LoaderHandler.java \ + java/rmi/server/LogStream.java \ + java/rmi/server/ObjID.java \ + java/rmi/server/Operation.java \ + java/rmi/server/RMIClassLoader.java \ + java/rmi/server/RMIClientSocketFactory.java \ + java/rmi/server/RMIFailureHandler.java \ + java/rmi/server/RMIServerSocketFactory.java \ + java/rmi/server/RMISocketFactory.java \ + java/rmi/server/RemoteCall.java \ + java/rmi/server/RemoteObject.java \ + java/rmi/server/RemoteRef.java \ + java/rmi/server/RemoteServer.java \ + java/rmi/server/RemoteStub.java \ + java/rmi/server/ServerCloneException.java \ + java/rmi/server/ServerNotActiveException.java \ + java/rmi/server/ServerRef.java \ + java/rmi/server/Skeleton.java \ + java/rmi/server/SkeletonMismatchException.java \ + java/rmi/server/SkeletonNotFoundException.java \ + java/rmi/server/SocketSecurityException.java \ + java/rmi/server/UID.java \ + java/rmi/server/UnicastRemoteObject.java \ + java/rmi/server/Unreferenced.java \ + gnu/java/rmi/dgc/DGCImpl.java \ + gnu/java/rmi/dgc/DGCImpl_Skel.java \ + gnu/java/rmi/dgc/DGCImpl_Stub.java \ + gnu/java/rmi/registry/RegistryImpl.java \ + gnu/java/rmi/registry/RegistryImpl_Skel.java \ + gnu/java/rmi/registry/RegistryImpl_Stub.java \ + gnu/java/rmi/rmic/Compile_gcj.java \ + gnu/java/rmi/rmic/Compiler.java \ + gnu/java/rmi/rmic/CompilerProcess.java \ + gnu/java/rmi/rmic/RMIC.java \ + gnu/java/rmi/rmic/TabbedWriter.java \ + gnu/java/rmi/server/ProtocolConstants.java \ + gnu/java/rmi/server/RMIDefaultSocketFactory.java \ + gnu/java/rmi/server/RMIHashes.java \ + gnu/java/rmi/server/RMIObjectInputStream.java \ + gnu/java/rmi/server/RMIObjectOutputStream.java \ + gnu/java/rmi/server/UnicastConnection.java \ + gnu/java/rmi/server/UnicastConnectionManager.java \ + gnu/java/rmi/server/UnicastRef.java \ + gnu/java/rmi/server/UnicastRemoteCall.java \ + gnu/java/rmi/server/UnicastRemoteStub.java \ + gnu/java/rmi/server/UnicastServer.java \ + gnu/java/rmi/server/UnicastServerRef.java + + + javax_source_files = \ + javax/naming/directory/Attribute.java \ + javax/naming/directory/AttributeInUseException.java \ + javax/naming/directory/AttributeModificationException.java \ + javax/naming/directory/Attributes.java \ + javax/naming/directory/DirContext.java \ + javax/naming/directory/InvalidAttributeIdentifierException.java \ + javax/naming/directory/InvalidAttributeValueException.java \ + javax/naming/directory/InvalidAttributesException.java \ + javax/naming/directory/InvalidSearchControlsException.java \ + javax/naming/directory/InvalidSearchFilterException.java \ + javax/naming/directory/NoSuchAttributeException.java \ + javax/naming/directory/SchemaViolationException.java \ + javax/naming/directory/BasicAttribute.java \ + javax/naming/directory/BasicAttributes.java \ + javax/naming/directory/ModificationItem.java \ + javax/naming/directory/SearchControls.java \ + javax/naming/directory/SearchResult.java \ + javax/naming/directory/InitialDirContext.java \ + javax/naming/AuthenticationException.java \ + javax/naming/AuthenticationNotSupportedException.java \ + javax/naming/CannotProceedException.java \ + javax/naming/CommunicationException.java \ + javax/naming/ConfigurationException.java \ + javax/naming/Context.java \ + javax/naming/ContextNotEmptyException.java \ + javax/naming/InsufficientResourcesException.java \ + javax/naming/InterruptedNamingException.java \ + javax/naming/BinaryRefAddr.java \ + javax/naming/LimitExceededException.java \ + javax/naming/LinkException.java \ + javax/naming/LinkLoopException.java \ + javax/naming/MalformedLinkException.java \ + javax/naming/Name.java \ + javax/naming/NameAlreadyBoundException.java \ + javax/naming/NameNotFoundException.java \ + javax/naming/NameParser.java \ + javax/naming/NamingEnumeration.java \ + javax/naming/InitialContext.java \ + javax/naming/NamingSecurityException.java \ + javax/naming/NoInitialContextException.java \ + javax/naming/NoPermissionException.java \ + javax/naming/NotContextException.java \ + javax/naming/NamingException.java \ + javax/naming/PartialResultException.java \ + javax/naming/event/EventContext.java \ + javax/naming/event/EventDirContext.java \ + javax/naming/event/NamespaceChangeListener.java \ + javax/naming/event/NamingEvent.java \ + javax/naming/event/NamingExceptionEvent.java \ + javax/naming/event/NamingListener.java \ + javax/naming/event/ObjectChangeListener.java \ + javax/naming/RefAddr.java \ + javax/naming/Reference.java \ + javax/naming/Referenceable.java \ + javax/naming/ReferralException.java \ + javax/naming/ServiceUnavailableException.java \ + javax/naming/SizeLimitExceededException.java \ + javax/naming/StringRefAddr.java \ + javax/naming/TimeLimitExceededException.java \ + javax/naming/spi/InitialContextFactory.java \ + javax/naming/spi/InitialContextFactoryBuilder.java \ + javax/naming/spi/NamingManager.java \ + javax/naming/spi/ObjectFactory.java \ + javax/naming/spi/Resolver.java \ + javax/naming/spi/DirObjectFactory.java \ + javax/naming/spi/DirStateFactory.java \ + javax/naming/spi/DirectoryManager.java \ + javax/naming/spi/ObjectFactoryBuilder.java \ + javax/naming/spi/ResolveResult.java \ + javax/naming/spi/StateFactory.java \ + javax/naming/InvalidNameException.java \ + javax/naming/Binding.java \ + javax/naming/CompositeName.java \ + javax/naming/CompoundName.java \ + javax/naming/LinkRef.java \ + javax/naming/NameClassPair.java \ + javax/naming/ldap/Control.java \ + javax/naming/ldap/ControlFactory.java \ + javax/naming/ldap/ExtendedRequest.java \ + javax/naming/ldap/ExtendedResponse.java \ + javax/naming/ldap/HasControls.java \ + javax/naming/ldap/InitialLdapContext.java \ + javax/naming/ldap/LdapContext.java \ + javax/naming/ldap/LdapReferralException.java \ + javax/naming/ldap/UnsolicitedNotification.java \ + javax/naming/ldap/UnsolicitedNotificationEvent.java \ + javax/naming/ldap/UnsolicitedNotificationListener.java \ + javax/naming/OperationNotSupportedException.java \ + javax/transaction/xa/XAException.java \ + javax/transaction/xa/XAResource.java \ + javax/transaction/xa/Xid.java \ + javax/transaction/HeuristicCommitException.java \ + javax/transaction/HeuristicMixedException.java \ + javax/transaction/HeuristicRollbackException.java \ + javax/transaction/InvalidTransactionException.java \ + javax/transaction/NotSupportedException.java \ + javax/transaction/RollbackException.java \ + javax/transaction/Status.java \ + javax/transaction/Synchronization.java \ + javax/transaction/SystemException.java \ + javax/transaction/Transaction.java \ + javax/transaction/TransactionManager.java \ + javax/transaction/TransactionRequiredException.java \ + javax/transaction/TransactionRolledbackException.java \ + javax/transaction/UserTransaction.java + + built_java_source_files = java/lang/ConcreteProcess.java \ gnu/classpath/Configuration.java *************** java/lang/ArrayStoreException.java \ *** 559,564 **** --- 790,796 ---- java/lang/Boolean.java \ java/lang/Byte.java \ java/lang/Character.java \ + java/lang/CharSequence.java \ java/lang/ClassCastException.java \ java/lang/ClassCircularityError.java \ java/lang/ClassFormatError.java \ *************** java/lang/IllegalStateException.java \ *** 581,586 **** --- 813,819 ---- java/lang/IllegalThreadStateException.java \ java/lang/IncompatibleClassChangeError.java \ java/lang/IndexOutOfBoundsException.java \ + java/lang/InheritableThreadLocal.java \ java/lang/InstantiationError.java \ java/lang/InstantiationException.java \ java/lang/Integer.java \ *************** java/lang/NullPointerException.java \ *** 599,604 **** --- 832,838 ---- java/lang/Number.java \ java/lang/NumberFormatException.java \ java/lang/OutOfMemoryError.java \ + java/lang/Package.java \ java/lang/Process.java \ java/lang/Runnable.java \ java/lang/Runtime.java \ *************** java/lang/SecurityException.java \ *** 608,613 **** --- 842,848 ---- java/lang/SecurityManager.java \ java/lang/Short.java \ java/lang/StackOverflowError.java \ + java/lang/StrictMath.java \ java/lang/String.java \ java/lang/StringBuffer.java \ java/lang/StringIndexOutOfBoundsException.java \ *************** java/lang/System.java \ *** 615,626 **** --- 850,865 ---- java/lang/Thread.java \ java/lang/ThreadDeath.java \ java/lang/ThreadGroup.java \ + java/lang/ThreadLocal.java \ java/lang/Throwable.java \ java/lang/UnknownError.java \ java/lang/UnsatisfiedLinkError.java \ + java/lang/UnsupportedClassVersionError.java \ java/lang/UnsupportedOperationException.java \ java/lang/VerifyError.java \ java/lang/VirtualMachineError.java \ + java/lang/VMClassLoader.java \ + java/lang/VMSecurityManager.java \ java/lang/Void.java \ java/io/BufferedInputStream.java \ java/io/BufferedOutputStream.java \ *************** java/util/GregorianCalendar.java \ *** 720,727 **** --- 959,969 ---- java/util/HashMap.java \ java/util/HashSet.java \ java/util/Hashtable.java \ + java/util/IdentityHashMap.java \ java/util/Iterator.java \ java/util/LinkedList.java \ + java/util/LinkedHashMap.java \ + java/util/LinkedHashSet.java \ java/util/List.java \ java/util/ListIterator.java \ java/util/ListResourceBundle.java \ *************** java/util/Properties.java \ *** 735,740 **** --- 977,983 ---- java/util/PropertyPermission.java \ java/util/PropertyResourceBundle.java \ java/util/Random.java \ + java/util/RandomAccess.java \ java/util/ResourceBundle.java \ java/util/Set.java \ java/util/SimpleTimeZone.java \ *************** java/util/WeakHashMap.java *** 753,764 **** ordinary_java_source_files = $(core_java_source_files) \ gnu/gcj/RawData.java \ gnu/gcj/io/DefaultMimeTypes.java \ gnu/gcj/io/MimeTypes.java \ gnu/gcj/io/SimpleSHSStream.java \ ! gnu/gcj/jni/NativeThread.java \ ! gnu/gcj/math/MPN.java \ gnu/gcj/protocol/file/Connection.java \ gnu/gcj/protocol/file/Handler.java \ gnu/gcj/protocol/http/Connection.java \ --- 996,1009 ---- ordinary_java_source_files = $(core_java_source_files) \ + gnu/gcj/Core.java \ gnu/gcj/RawData.java \ gnu/gcj/io/DefaultMimeTypes.java \ gnu/gcj/io/MimeTypes.java \ gnu/gcj/io/SimpleSHSStream.java \ ! gnu/gcj/protocol/core/Connection.java \ ! gnu/gcj/protocol/core/Handler.java \ ! gnu/gcj/protocol/core/CoreInputStream.java \ gnu/gcj/protocol/file/Connection.java \ gnu/gcj/protocol/file/Handler.java \ gnu/gcj/protocol/http/Connection.java \ *************** gnu/gcj/protocol/http/Handler.java \ *** 766,794 **** gnu/gcj/protocol/jar/Connection.java \ gnu/gcj/protocol/jar/Handler.java \ gnu/gcj/runtime/FileDeleter.java \ gnu/gcj/runtime/FirstThread.java \ gnu/gcj/runtime/VMClassLoader.java \ - gnu/gcj/text/BaseBreakIterator.java \ - gnu/gcj/text/CharacterBreakIterator.java \ - gnu/gcj/text/LineBreakIterator.java \ - gnu/gcj/text/LocaleData_en.java \ - gnu/gcj/text/LocaleData_en_US.java \ - gnu/gcj/text/SentenceBreakIterator.java \ - gnu/gcj/text/WordBreakIterator.java \ - gnu/gcj/util/EnumerationChain.java \ gnu/java/io/ClassLoaderObjectInputStream.java \ gnu/java/io/NullOutputStream.java \ gnu/java/io/ObjectIdentityWrapper.java \ gnu/java/lang/ArrayHelper.java \ gnu/java/lang/ClassHelper.java \ gnu/java/lang/reflect/TypeSignature.java \ gnu/java/locale/Calendar.java \ gnu/java/locale/Calendar_de.java \ gnu/java/locale/Calendar_en.java \ gnu/java/locale/Calendar_nl.java \ gnu/java/security/provider/Gnu.java \ gnu/java/security/provider/SHA.java \ gnu/java/security/provider/SHA1PRNG.java \ java/lang/ref/PhantomReference.java \ java/lang/ref/Reference.java \ java/lang/ref/ReferenceQueue.java \ --- 1011,1179 ---- gnu/gcj/protocol/jar/Connection.java \ gnu/gcj/protocol/jar/Handler.java \ gnu/gcj/runtime/FileDeleter.java \ + gnu/gcj/runtime/FinalizerThread.java \ gnu/gcj/runtime/FirstThread.java \ + gnu/gcj/runtime/JNIWeakRef.java \ + gnu/gcj/runtime/SharedLibLoader.java \ + gnu/gcj/runtime/StringBuffer.java \ gnu/gcj/runtime/VMClassLoader.java \ gnu/java/io/ClassLoaderObjectInputStream.java \ gnu/java/io/NullOutputStream.java \ gnu/java/io/ObjectIdentityWrapper.java \ gnu/java/lang/ArrayHelper.java \ gnu/java/lang/ClassHelper.java \ + gnu/java/lang/CharData.java \ gnu/java/lang/reflect/TypeSignature.java \ gnu/java/locale/Calendar.java \ gnu/java/locale/Calendar_de.java \ gnu/java/locale/Calendar_en.java \ gnu/java/locale/Calendar_nl.java \ + gnu/java/locale/LocaleInformation.java \ + gnu/java/locale/LocaleInformation_af_ZA.java \ + gnu/java/locale/LocaleInformation_ar_AE.java \ + gnu/java/locale/LocaleInformation_ar_BH.java \ + gnu/java/locale/LocaleInformation_ar_DZ.java \ + gnu/java/locale/LocaleInformation_ar_EG.java \ + gnu/java/locale/LocaleInformation_ar_IN.java \ + gnu/java/locale/LocaleInformation_ar_IQ.java \ + gnu/java/locale/LocaleInformation_ar_JO.java \ + gnu/java/locale/LocaleInformation_ar_KW.java \ + gnu/java/locale/LocaleInformation_ar_LB.java \ + gnu/java/locale/LocaleInformation_ar_LY.java \ + gnu/java/locale/LocaleInformation_ar_MA.java \ + gnu/java/locale/LocaleInformation_ar_OM.java \ + gnu/java/locale/LocaleInformation_ar_QA.java \ + gnu/java/locale/LocaleInformation_ar_SD.java \ + gnu/java/locale/LocaleInformation_ar_SY.java \ + gnu/java/locale/LocaleInformation_ar_TN.java \ + gnu/java/locale/LocaleInformation_ar_YE.java \ + gnu/java/locale/LocaleInformation_be_BY.java \ + gnu/java/locale/LocaleInformation_bn_IN.java \ + gnu/java/locale/LocaleInformation_br_FR.java \ + gnu/java/locale/LocaleInformation_bs_BA.java \ + gnu/java/locale/LocaleInformation_ca_ES.java \ + gnu/java/locale/LocaleInformation_cs_CZ.java \ + gnu/java/locale/LocaleInformation_cy_GB.java \ + gnu/java/locale/LocaleInformation_da_DK.java \ + gnu/java/locale/LocaleInformation_de.java \ + gnu/java/locale/LocaleInformation_de_AT.java \ + gnu/java/locale/LocaleInformation_de_BE.java \ + gnu/java/locale/LocaleInformation_de_CH.java \ + gnu/java/locale/LocaleInformation_de_DE.java \ + gnu/java/locale/LocaleInformation_de_LU.java \ + gnu/java/locale/LocaleInformation_el_GR.java \ + gnu/java/locale/LocaleInformation_en.java \ + gnu/java/locale/LocaleInformation_en_AU.java \ + gnu/java/locale/LocaleInformation_en_BW.java \ + gnu/java/locale/LocaleInformation_en_CA.java \ + gnu/java/locale/LocaleInformation_en_DK.java \ + gnu/java/locale/LocaleInformation_en_GB.java \ + gnu/java/locale/LocaleInformation_en_HK.java \ + gnu/java/locale/LocaleInformation_en_IE.java \ + gnu/java/locale/LocaleInformation_en_IN.java \ + gnu/java/locale/LocaleInformation_en_NZ.java \ + gnu/java/locale/LocaleInformation_en_PH.java \ + gnu/java/locale/LocaleInformation_en_SG.java \ + gnu/java/locale/LocaleInformation_en_US.java \ + gnu/java/locale/LocaleInformation_en_ZA.java \ + gnu/java/locale/LocaleInformation_en_ZW.java \ + gnu/java/locale/LocaleInformation_es_AR.java \ + gnu/java/locale/LocaleInformation_es_BO.java \ + gnu/java/locale/LocaleInformation_es_CL.java \ + gnu/java/locale/LocaleInformation_es_CO.java \ + gnu/java/locale/LocaleInformation_es_CR.java \ + gnu/java/locale/LocaleInformation_es_DO.java \ + gnu/java/locale/LocaleInformation_es_EC.java \ + gnu/java/locale/LocaleInformation_es_ES.java \ + gnu/java/locale/LocaleInformation_es_GT.java \ + gnu/java/locale/LocaleInformation_es_HN.java \ + gnu/java/locale/LocaleInformation_es_MX.java \ + gnu/java/locale/LocaleInformation_es_NI.java \ + gnu/java/locale/LocaleInformation_es_PA.java \ + gnu/java/locale/LocaleInformation_es_PE.java \ + gnu/java/locale/LocaleInformation_es_PR.java \ + gnu/java/locale/LocaleInformation_es_PY.java \ + gnu/java/locale/LocaleInformation_es_SV.java \ + gnu/java/locale/LocaleInformation_es_US.java \ + gnu/java/locale/LocaleInformation_es_UY.java \ + gnu/java/locale/LocaleInformation_es_VE.java \ + gnu/java/locale/LocaleInformation_et_EE.java \ + gnu/java/locale/LocaleInformation_eu_ES.java \ + gnu/java/locale/LocaleInformation_fa_IR.java \ + gnu/java/locale/LocaleInformation_fi_FI.java \ + gnu/java/locale/LocaleInformation_fo_FO.java \ + gnu/java/locale/LocaleInformation_fr_BE.java \ + gnu/java/locale/LocaleInformation_fr_CA.java \ + gnu/java/locale/LocaleInformation_fr_CH.java \ + gnu/java/locale/LocaleInformation_fr_FR.java \ + gnu/java/locale/LocaleInformation_fr_LU.java \ + gnu/java/locale/LocaleInformation_ga_IE.java \ + gnu/java/locale/LocaleInformation_gd_GB.java \ + gnu/java/locale/LocaleInformation_gl_ES.java \ + gnu/java/locale/LocaleInformation_gv_GB.java \ + gnu/java/locale/LocaleInformation_he_IL.java \ + gnu/java/locale/LocaleInformation_hi_IN.java \ + gnu/java/locale/LocaleInformation_hr_HR.java \ + gnu/java/locale/LocaleInformation_hu_HU.java \ + gnu/java/locale/LocaleInformation_id_ID.java \ + gnu/java/locale/LocaleInformation_it_CH.java \ + gnu/java/locale/LocaleInformation_it_IT.java \ + gnu/java/locale/LocaleInformation_iw_IL.java \ + gnu/java/locale/LocaleInformation_ja_JP.java \ + gnu/java/locale/LocaleInformation_ka_GE.java \ + gnu/java/locale/LocaleInformation_kl_GL.java \ + gnu/java/locale/LocaleInformation_ko_KR.java \ + gnu/java/locale/LocaleInformation_kw_GB.java \ + gnu/java/locale/LocaleInformation_lt_LT.java \ + gnu/java/locale/LocaleInformation_lv_LV.java \ + gnu/java/locale/LocaleInformation_mi_NZ.java \ + gnu/java/locale/LocaleInformation_mk_MK.java \ + gnu/java/locale/LocaleInformation_mr_IN.java \ + gnu/java/locale/LocaleInformation_mt_MT.java \ + gnu/java/locale/LocaleInformation_nl.java \ + gnu/java/locale/LocaleInformation_nl_BE.java \ + gnu/java/locale/LocaleInformation_nl_NL.java \ + gnu/java/locale/LocaleInformation_nn_NO.java \ + gnu/java/locale/LocaleInformation_no_NO.java \ + gnu/java/locale/LocaleInformation_oc_FR.java \ + gnu/java/locale/LocaleInformation_pl_PL.java \ + gnu/java/locale/LocaleInformation_pt_BR.java \ + gnu/java/locale/LocaleInformation_pt_PT.java \ + gnu/java/locale/LocaleInformation_ro_RO.java \ + gnu/java/locale/LocaleInformation_ru_RU.java \ + gnu/java/locale/LocaleInformation_ru_UA.java \ + gnu/java/locale/LocaleInformation_se_NO.java \ + gnu/java/locale/LocaleInformation_sk_SK.java \ + gnu/java/locale/LocaleInformation_sl_SI.java \ + gnu/java/locale/LocaleInformation_sq_AL.java \ + gnu/java/locale/LocaleInformation_sr_YU.java \ + gnu/java/locale/LocaleInformation_sv_FI.java \ + gnu/java/locale/LocaleInformation_sv_SE.java \ + gnu/java/locale/LocaleInformation_ta_IN.java \ + gnu/java/locale/LocaleInformation_te_IN.java \ + gnu/java/locale/LocaleInformation_tg_TJ.java \ + gnu/java/locale/LocaleInformation_tl_PH.java \ + gnu/java/locale/LocaleInformation_tr_TR.java \ + gnu/java/locale/LocaleInformation_uk_UA.java \ + gnu/java/locale/LocaleInformation_ur_PK.java \ + gnu/java/locale/LocaleInformation_uz_UZ.java \ + gnu/java/locale/LocaleInformation_vi_VN.java \ + gnu/java/locale/LocaleInformation_yi_US.java \ + gnu/java/locale/LocaleInformation_zh_CN.java \ + gnu/java/locale/LocaleInformation_zh_HK.java \ + gnu/java/locale/LocaleInformation_zh_SG.java \ + gnu/java/locale/LocaleInformation_zh_TW.java \ + gnu/java/math/MPN.java \ + gnu/java/security/provider/DefaultPolicy.java \ gnu/java/security/provider/Gnu.java \ gnu/java/security/provider/SHA.java \ gnu/java/security/provider/SHA1PRNG.java \ + gnu/java/text/BaseBreakIterator.java \ + gnu/java/text/CharacterBreakIterator.java \ + gnu/java/text/LineBreakIterator.java \ + gnu/java/text/SentenceBreakIterator.java \ + gnu/java/text/WordBreakIterator.java \ + gnu/java/util/DoubleEnumeration.java \ java/lang/ref/PhantomReference.java \ java/lang/ref/Reference.java \ java/lang/ref/ReferenceQueue.java \ *************** java/lang/reflect/Modifier.java \ *** 805,810 **** --- 1190,1196 ---- java/lang/reflect/ReflectPermission.java \ java/math/BigDecimal.java \ java/math/BigInteger.java \ + java/net/Authenticator.java \ java/net/BindException.java \ java/net/ConnectException.java \ java/net/ContentHandler.java \ *************** java/net/InetAddress.java \ *** 818,824 **** --- 1204,1212 ---- java/net/JarURLConnection.java \ java/net/MalformedURLException.java \ java/net/MulticastSocket.java \ + java/net/NetPermission.java \ java/net/NoRouteToHostException.java \ + java/net/PasswordAuthentication.java \ java/net/PlainDatagramSocketImpl.java \ java/net/PlainSocketImpl.java \ java/net/ProtocolException.java \ *************** java/net/SocketException.java \ *** 828,833 **** --- 1216,1222 ---- java/net/SocketImpl.java \ java/net/SocketImplFactory.java \ java/net/SocketOptions.java \ + java/net/SocketPermission.java \ java/net/URL.java \ java/net/URLClassLoader.java \ java/net/URLConnection.java \ *************** java/net/URLStreamHandler.java \ *** 837,870 **** java/net/URLStreamHandlerFactory.java \ java/net/UnknownHostException.java \ java/net/UnknownServiceException.java \ java/security/AlgorithmParameterGeneratorSpi.java \ java/security/BasicPermission.java \ java/security/DigestException.java \ java/security/DigestOutputStream.java \ java/security/GeneralSecurityException.java \ java/security/Guard.java \ java/security/InvalidAlgorithmParameterException.java \ java/security/InvalidKeyException.java \ java/security/InvalidParameterException.java \ java/security/Key.java \ ! java/security/KeyException.java \ ! java/security/KeyPair.java \ java/security/KeyPairGenerator.java \ java/security/KeyPairGeneratorSpi.java \ java/security/MessageDigest.java \ java/security/NoSuchAlgorithmException.java \ java/security/NoSuchProviderException.java \ java/security/Permission.java \ - java/security/PermissionCollection.java \ java/security/Principal.java \ java/security/PrivateKey.java \ java/security/Provider.java \ ! java/security/PublicKey.java \ java/security/SecureClassLoader.java \ ! java/security/SecureRandom.java \ java/security/Security.java \ java/security/Signature.java \ ! java/security/SignatureException.java \ java/security/cert/CRL.java \ java/security/cert/CRLException.java \ java/security/cert/Certificate.java \ --- 1226,1305 ---- java/net/URLStreamHandlerFactory.java \ java/net/UnknownHostException.java \ java/net/UnknownServiceException.java \ + java/security/AccessControlContext.java \ + java/security/AccessControlException.java \ + java/security/AccessController.java \ + java/security/AlgorithmParameterGenerator.java \ + java/security/AlgorithmParameters.java \ java/security/AlgorithmParameterGeneratorSpi.java \ + java/security/AlgorithmParametersSpi.java \ + java/security/AllPermission.java \ java/security/BasicPermission.java \ + java/security/Certificate.java \ + java/security/CodeSource.java \ java/security/DigestException.java \ java/security/DigestOutputStream.java \ + java/security/DummyKeyPairGenerator.java \ + java/security/DummySignature.java \ + java/security/DigestInputStream.java \ + java/security/DomainCombiner.java \ + java/security/DummyMessageDigest.java \ java/security/GeneralSecurityException.java \ java/security/Guard.java \ + java/security/GuardedObject.java \ + java/security/Identity.java \ + java/security/IdentityScope.java \ java/security/InvalidAlgorithmParameterException.java \ java/security/InvalidKeyException.java \ java/security/InvalidParameterException.java \ java/security/Key.java \ ! java/security/KeyFactorySpi.java \ java/security/KeyPairGenerator.java \ + java/security/KeyStoreException.java \ + java/security/KeyException.java \ + java/security/KeyManagementException.java \ java/security/KeyPairGeneratorSpi.java \ + java/security/KeyStoreSpi.java \ + java/security/KeyFactory.java \ + java/security/KeyPair.java \ + java/security/KeyStore.java \ java/security/MessageDigest.java \ + java/security/MessageDigestSpi.java \ java/security/NoSuchAlgorithmException.java \ java/security/NoSuchProviderException.java \ java/security/Permission.java \ java/security/Principal.java \ + java/security/PrivilegedExceptionAction.java \ + java/security/PublicKey.java \ + java/security/PermissionCollection.java \ java/security/PrivateKey.java \ + java/security/ProtectionDomain.java \ + java/security/Permissions.java \ + java/security/PrivilegedAction.java \ java/security/Provider.java \ ! java/security/Policy.java \ ! java/security/PrivilegedActionException.java \ ! java/security/ProviderException.java \ java/security/SecureClassLoader.java \ ! java/security/SecureRandomSpi.java \ ! java/security/SecurityPermission.java \ ! java/security/SignatureException.java \ ! java/security/SignedObject.java \ ! java/security/SecureRandom.java \ java/security/Security.java \ java/security/Signature.java \ ! java/security/SignatureSpi.java \ ! java/security/Signer.java \ ! java/security/UnrecoverableKeyException.java \ ! java/security/UnresolvedPermission.java \ ! java/security/acl/Acl.java \ ! java/security/acl/AclNotFoundException.java \ ! java/security/acl/LastOwnerException.java \ ! java/security/acl/Owner.java \ ! java/security/acl/AclEntry.java \ ! java/security/acl/Group.java \ ! java/security/acl/NotOwnerException.java \ ! java/security/acl/Permission.java \ java/security/cert/CRL.java \ java/security/cert/CRLException.java \ java/security/cert/Certificate.java \ *************** java/security/cert/X509CRLEntry.java \ *** 880,898 **** java/security/cert/X509Certificate.java \ java/security/cert/X509Extension.java \ java/security/interfaces/DSAKey.java \ ! java/security/interfaces/DSAParams.java \ java/security/interfaces/DSAPrivateKey.java \ java/security/interfaces/DSAPublicKey.java \ java/security/interfaces/RSAPrivateCrtKey.java \ java/security/interfaces/RSAPrivateKey.java \ java/security/interfaces/RSAPublicKey.java \ java/security/spec/AlgorithmParameterSpec.java \ ! java/security/spec/InvalidKeySpecException.java \ java/security/spec/InvalidParameterSpecException.java \ ! java/security/spec/KeySpec.java \ java/security/spec/RSAPrivateCrtKeySpec.java \ java/security/spec/RSAPrivateKeySpec.java \ java/security/spec/RSAPublicKeySpec.java \ java/sql/Array.java \ java/sql/BatchUpdateException.java \ java/sql/Blob.java \ --- 1315,1342 ---- java/security/cert/X509Certificate.java \ java/security/cert/X509Extension.java \ java/security/interfaces/DSAKey.java \ ! java/security/interfaces/DSAKeyPairGenerator.java \ ! java/security/interfaces/DSAParams.java \ java/security/interfaces/DSAPrivateKey.java \ java/security/interfaces/DSAPublicKey.java \ + java/security/interfaces/RSAKey.java \ java/security/interfaces/RSAPrivateCrtKey.java \ java/security/interfaces/RSAPrivateKey.java \ java/security/interfaces/RSAPublicKey.java \ java/security/spec/AlgorithmParameterSpec.java \ ! java/security/spec/DSAParameterSpec.java \ ! java/security/spec/DSAPrivateKeySpec.java \ ! java/security/spec/DSAPublicKeySpec.java \ ! java/security/spec/EncodedKeySpec.java \ ! java/security/spec/InvalidKeySpecException.java \ java/security/spec/InvalidParameterSpecException.java \ ! java/security/spec/KeySpec.java \ ! java/security/spec/PKCS8EncodedKeySpec.java \ ! java/security/spec/RSAKeyGenParameterSpec.java \ java/security/spec/RSAPrivateCrtKeySpec.java \ java/security/spec/RSAPrivateKeySpec.java \ java/security/spec/RSAPublicKeySpec.java \ + java/security/spec/X509EncodedKeySpec.java \ java/sql/Array.java \ java/sql/BatchUpdateException.java \ java/sql/Blob.java \ *************** java/sql/Struct.java \ *** 919,924 **** --- 1363,1372 ---- java/sql/Time.java \ java/sql/Timestamp.java \ java/sql/Types.java \ + java/text/Annotation.java \ + java/text/AttributedCharacterIterator.java \ + java/text/AttributedString.java \ + java/text/AttributedStringIterator.java \ java/text/BreakIterator.java \ java/text/CharacterIterator.java \ java/text/ChoiceFormat.java \ *************** java/util/zip/ZipException.java \ *** 963,970 **** java/util/zip/ZipFile.java \ java/util/zip/ZipInputStream.java \ java/util/zip/ZipOutputStream.java \ $(awt_java_source_files) \ ! $(convert_source_files) java_source_files = $(special_java_source_files) $(ordinary_java_source_files) --- 1411,1474 ---- java/util/zip/ZipFile.java \ java/util/zip/ZipInputStream.java \ java/util/zip/ZipOutputStream.java \ + org/w3c/dom/Attr.java \ + org/w3c/dom/CDATASection.java \ + org/w3c/dom/CharacterData.java \ + org/w3c/dom/Comment.java \ + org/w3c/dom/DOMException.java \ + org/w3c/dom/DOMImplementation.java \ + org/w3c/dom/Document.java \ + org/w3c/dom/DocumentFragment.java \ + org/w3c/dom/DocumentType.java \ + org/w3c/dom/Element.java \ + org/w3c/dom/Entity.java \ + org/w3c/dom/EntityReference.java \ + org/w3c/dom/NamedNodeMap.java \ + org/w3c/dom/Node.java \ + org/w3c/dom/NodeList.java \ + org/w3c/dom/Notation.java \ + org/w3c/dom/ProcessingInstruction.java \ + org/w3c/dom/Text.java \ + org/w3c/dom/ranges/DocumentRange.java \ + org/w3c/dom/ranges/Range.java \ + org/w3c/dom/ranges/RangeException.java \ + org/w3c/dom/traversal/DocumentTraversal.java \ + org/w3c/dom/traversal/NodeFilter.java \ + org/w3c/dom/traversal/NodeIterator.java \ + org/w3c/dom/traversal/TreeWalker.java \ + org/xml/sax/ext/DeclHandler.java \ + org/xml/sax/ext/LexicalHandler.java \ + org/xml/sax/helpers/AttributeListImpl.java \ + org/xml/sax/helpers/AttributesImpl.java \ + org/xml/sax/helpers/DefaultHandler.java \ + org/xml/sax/helpers/LocatorImpl.java \ + org/xml/sax/helpers/NamespaceSupport.java \ + org/xml/sax/helpers/ParserAdapter.java \ + org/xml/sax/helpers/ParserFactory.java \ + org/xml/sax/helpers/XMLFilterImpl.java \ + org/xml/sax/helpers/XMLReaderAdapter.java \ + org/xml/sax/helpers/XMLReaderFactory.java \ + org/xml/sax/AttributeList.java \ + org/xml/sax/Attributes.java \ + org/xml/sax/ContentHandler.java \ + org/xml/sax/DTDHandler.java \ + org/xml/sax/DocumentHandler.java \ + org/xml/sax/EntityResolver.java \ + org/xml/sax/ErrorHandler.java \ + org/xml/sax/HandlerBase.java \ + org/xml/sax/InputSource.java \ + org/xml/sax/Locator.java \ + org/xml/sax/Parser.java \ + org/xml/sax/SAXException.java \ + org/xml/sax/SAXNotRecognizedException.java \ + org/xml/sax/SAXNotSupportedException.java \ + org/xml/sax/SAXParseException.java \ + org/xml/sax/XMLFilter.java \ + org/xml/sax/XMLReader.java \ + $(rmi_java_source_files) \ $(awt_java_source_files) \ ! $(convert_source_files) \ ! $(javax_source_files) java_source_files = $(special_java_source_files) $(ordinary_java_source_files) *************** c_source_files = \ *** 988,993 **** --- 1492,1498 ---- #java/awt/natToolkit.cc nat_source_files = \ + gnu/gcj/natCore.cc \ gnu/gcj/convert/JIS0208_to_Unicode.cc \ gnu/gcj/convert/JIS0212_to_Unicode.cc \ gnu/gcj/convert/Unicode_to_JIS.cc \ *************** gnu/gcj/convert/natOutput_EUCJIS.cc \ *** 998,1005 **** gnu/gcj/convert/natOutput_SJIS.cc \ gnu/gcj/io/natSimpleSHSStream.cc \ gnu/gcj/io/shs.cc \ ! gnu/gcj/jni/natNativeThread.cc \ gnu/gcj/runtime/natFirstThread.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ --- 1503,1513 ---- gnu/gcj/convert/natOutput_SJIS.cc \ gnu/gcj/io/natSimpleSHSStream.cc \ gnu/gcj/io/shs.cc \ ! gnu/gcj/protocol/core/natCoreInputStream.cc \ ! gnu/gcj/runtime/natFinalizerThread.cc \ gnu/gcj/runtime/natFirstThread.cc \ + gnu/gcj/runtime/natSharedLibLoader.cc \ + gnu/gcj/runtime/natStringBuffer.cc \ java/io/natFile.cc \ java/io/natFileDescriptor.cc \ java/io/natObjectInputStream.cc \ *************** java/lang/natMath.cc \ *** 1014,1022 **** --- 1522,1532 ---- java/lang/natObject.cc \ java/lang/natRuntime.cc \ java/lang/natString.cc \ + java/lang/natStringBuffer.cc \ java/lang/natSystem.cc \ java/lang/natThread.cc \ java/lang/natThrowable.cc \ + java/lang/ref/natReference.cc \ java/lang/reflect/natArray.cc \ java/lang/reflect/natConstructor.cc \ java/lang/reflect/natField.cc \ *************** java/net/natInetAddress.cc \ *** 1025,1031 **** java/net/natPlainDatagramSocketImpl.cc \ java/net/natPlainSocketImpl.cc \ java/text/natCollator.cc \ - java/util/natGregorianCalendar.cc \ java/util/zip/natDeflater.cc \ java/util/zip/natInflater.cc --- 1535,1540 ---- *************** MULTISUBDIR = *** 1140,1151 **** MULTIDO = true MULTICLEAN = true ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ! CONFIG_HEADER = ./include/config.h CONFIG_CLEAN_FILES = libgcj.spec libgcj-test.spec ! LIBRARIES = $(toolexeclib_LIBRARIES) ! DEFS = @DEFS@ -I. -I$(srcdir) -I./include CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ --- 1649,1660 ---- MULTIDO = true MULTICLEAN = true ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ! CONFIG_HEADER = ./include/config.h ./gcj/libgcj-config.h CONFIG_CLEAN_FILES = libgcj.spec libgcj-test.spec ! LTLIBRARIES = $(toolexeclib_LTLIBRARIES) ! DEFS = @DEFS@ -I. -I$(srcdir) -I./include -I./gcj CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ *************** X_CFLAGS = @X_CFLAGS@ *** 1153,1183 **** X_LIBS = @X_LIBS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ! libgcjdata_a_LIBADD = ! @NEEDS_DATA_START_TRUE@libgcjdata_a_OBJECTS = libgcjdata.$(OBJEXT) ! LTLIBRARIES = $(toolexeclib_LTLIBRARIES) ! ! libgcj_la_OBJECTS = prims.lo posix.lo jni.lo exception.lo resolve.lo \ ! defineclass.lo interpret.lo name-finder.lo \ gnu/gcj/convert/JIS0208_to_Unicode.lo \ gnu/gcj/convert/JIS0212_to_Unicode.lo gnu/gcj/convert/Unicode_to_JIS.lo \ gnu/gcj/convert/natIconv.lo gnu/gcj/convert/natInput_EUCJIS.lo \ gnu/gcj/convert/natInput_SJIS.lo gnu/gcj/convert/natOutput_EUCJIS.lo \ gnu/gcj/convert/natOutput_SJIS.lo gnu/gcj/io/natSimpleSHSStream.lo \ ! gnu/gcj/io/shs.lo gnu/gcj/jni/natNativeThread.lo \ ! gnu/gcj/runtime/natFirstThread.lo java/io/natFile.lo \ java/io/natFileDescriptor.lo java/io/natObjectInputStream.lo \ java/io/natObjectOutputStream.lo java/lang/natCharacter.lo \ java/lang/natClass.lo java/lang/natClassLoader.lo \ java/lang/natConcreteProcess.lo java/lang/natDouble.lo \ java/lang/natFloat.lo java/lang/natMath.lo java/lang/natObject.lo \ ! java/lang/natRuntime.lo java/lang/natString.lo java/lang/natSystem.lo \ java/lang/natThread.lo java/lang/natThrowable.lo \ ! java/lang/reflect/natArray.lo java/lang/reflect/natConstructor.lo \ ! java/lang/reflect/natField.lo java/lang/reflect/natMethod.lo \ ! java/net/natInetAddress.lo java/net/natPlainDatagramSocketImpl.lo \ ! java/net/natPlainSocketImpl.lo java/text/natCollator.lo \ ! java/util/natGregorianCalendar.lo java/util/zip/natDeflater.lo \ java/util/zip/natInflater.lo libgcjx_la_OBJECTS = gnu/gcj/xlib/natClip.lo \ gnu/gcj/xlib/natColormap.lo gnu/gcj/xlib/natDisplay.lo \ --- 1662,1691 ---- X_LIBS = @X_LIBS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ ! libgcj_la_OBJECTS = prims.lo jni.lo exception.lo resolve.lo \ ! defineclass.lo interpret.lo name-finder.lo verify.lo gnu/gcj/natCore.lo \ gnu/gcj/convert/JIS0208_to_Unicode.lo \ gnu/gcj/convert/JIS0212_to_Unicode.lo gnu/gcj/convert/Unicode_to_JIS.lo \ gnu/gcj/convert/natIconv.lo gnu/gcj/convert/natInput_EUCJIS.lo \ gnu/gcj/convert/natInput_SJIS.lo gnu/gcj/convert/natOutput_EUCJIS.lo \ gnu/gcj/convert/natOutput_SJIS.lo gnu/gcj/io/natSimpleSHSStream.lo \ ! gnu/gcj/io/shs.lo gnu/gcj/protocol/core/natCoreInputStream.lo \ ! gnu/gcj/runtime/natFinalizerThread.lo gnu/gcj/runtime/natFirstThread.lo \ ! gnu/gcj/runtime/natSharedLibLoader.lo \ ! gnu/gcj/runtime/natStringBuffer.lo java/io/natFile.lo \ java/io/natFileDescriptor.lo java/io/natObjectInputStream.lo \ java/io/natObjectOutputStream.lo java/lang/natCharacter.lo \ java/lang/natClass.lo java/lang/natClassLoader.lo \ java/lang/natConcreteProcess.lo java/lang/natDouble.lo \ java/lang/natFloat.lo java/lang/natMath.lo java/lang/natObject.lo \ ! java/lang/natRuntime.lo java/lang/natString.lo \ ! java/lang/natStringBuffer.lo java/lang/natSystem.lo \ java/lang/natThread.lo java/lang/natThrowable.lo \ ! java/lang/ref/natReference.lo java/lang/reflect/natArray.lo \ ! java/lang/reflect/natConstructor.lo java/lang/reflect/natField.lo \ ! java/lang/reflect/natMethod.lo java/net/natInetAddress.lo \ ! java/net/natPlainDatagramSocketImpl.lo java/net/natPlainSocketImpl.lo \ ! java/text/natCollator.lo java/util/zip/natDeflater.lo \ java/util/zip/natInflater.lo libgcjx_la_OBJECTS = gnu/gcj/xlib/natClip.lo \ gnu/gcj/xlib/natColormap.lo gnu/gcj/xlib/natDisplay.lo \ *************** gnu/gcj/xlib/natXButtonEvent.lo gnu/gcj/ *** 1190,1202 **** gnu/gcj/xlib/natXConfigureEvent.lo gnu/gcj/xlib/natXException.lo \ gnu/gcj/xlib/natXExposeEvent.lo gnu/gcj/xlib/natXImage.lo \ gnu/gcj/xlib/natXUnmapEvent.lo ! @NATIVE_TRUE@bin_PROGRAMS = jv-convert$(EXEEXT) gij$(EXEEXT) @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = \ @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@gen-from-JIS$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) jv_convert_OBJECTS = gij_OBJECTS = gij.$(OBJEXT) gen_from_JIS_OBJECTS = gen_from_JIS_LDFLAGS = SCRIPTS = $(bin_SCRIPTS) --- 1698,1713 ---- gnu/gcj/xlib/natXConfigureEvent.lo gnu/gcj/xlib/natXException.lo \ gnu/gcj/xlib/natXExposeEvent.lo gnu/gcj/xlib/natXImage.lo \ gnu/gcj/xlib/natXUnmapEvent.lo ! @NATIVE_TRUE@bin_PROGRAMS = jv-convert$(EXEEXT) gij$(EXEEXT) \ ! @NATIVE_TRUE@rmic$(EXEEXT) rmiregistry$(EXEEXT) @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@noinst_PROGRAMS = \ @NATIVE_TRUE@@MAINTAINER_MODE_TRUE@gen-from-JIS$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) jv_convert_OBJECTS = gij_OBJECTS = gij.$(OBJEXT) + rmic_OBJECTS = + rmiregistry_OBJECTS = gen_from_JIS_OBJECTS = gen_from_JIS_LDFLAGS = SCRIPTS = $(bin_SCRIPTS) *************** COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM *** 1210,1225 **** LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ ! DATA = $(data_DATA) $(toolexeclib_DATA) DIST_COMMON = README COPYING ChangeLog Makefile.am Makefile.in NEWS \ ! THANKS acinclude.m4 aclocal.m4 configure configure.in \ ! libgcj-test.spec.in libgcj.spec.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = tar GZIP_ENV = --best DIST_SUBDIRS = @DIRLTDL@ testsuite gcj include @DIRLTDL@ gcj include DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ --- 1721,1737 ---- LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ ! DATA = $(jar_DATA) $(toolexeclib_DATA) DIST_COMMON = README COPYING ChangeLog Makefile.am Makefile.in NEWS \ ! THANKS acconfig.h acinclude.m4 aclocal.m4 configure configure.in \ ! gcj/libgcj-config.h.in gcj/stamp-h2.in include/config.h.in \ ! include/stamp-h1.in libgcj-test.spec.in libgcj.spec.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = gtar GZIP_ENV = --best DIST_SUBDIRS = @DIRLTDL@ testsuite gcj include @DIRLTDL@ gcj include DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1236,1247 **** .deps/gnu/awt/xlib/XGraphics.P \ .deps/gnu/awt/xlib/XGraphicsConfiguration.P \ .deps/gnu/awt/xlib/XPanelPeer.P .deps/gnu/awt/xlib/XToolkit.P \ ! .deps/gnu/classpath/Configuration.P .deps/gnu/gcj/RawData.P \ ! .deps/gnu/gcj/awt/BitMaskExtent.P .deps/gnu/gcj/awt/Buffers.P \ ! .deps/gnu/gcj/awt/ComponentDataBlitOp.P \ ! .deps/gnu/gcj/awt/GLightweightPeer.P \ ! .deps/gnu/gcj/convert/BytesToUnicode.P .deps/gnu/gcj/convert/Convert.P \ ! .deps/gnu/gcj/convert/IOConverter.P \ .deps/gnu/gcj/convert/Input_8859_1.P \ .deps/gnu/gcj/convert/Input_ASCII.P \ .deps/gnu/gcj/convert/Input_EUCJIS.P \ --- 1748,1756 ---- .deps/gnu/awt/xlib/XGraphics.P \ .deps/gnu/awt/xlib/XGraphicsConfiguration.P \ .deps/gnu/awt/xlib/XPanelPeer.P .deps/gnu/awt/xlib/XToolkit.P \ ! .deps/gnu/classpath/Configuration.P .deps/gnu/gcj/Core.P \ ! .deps/gnu/gcj/RawData.P .deps/gnu/gcj/convert/BytesToUnicode.P \ ! .deps/gnu/gcj/convert/Convert.P .deps/gnu/gcj/convert/IOConverter.P \ .deps/gnu/gcj/convert/Input_8859_1.P \ .deps/gnu/gcj/convert/Input_ASCII.P \ .deps/gnu/gcj/convert/Input_EUCJIS.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1265,1288 **** .deps/gnu/gcj/io/DefaultMimeTypes.P .deps/gnu/gcj/io/MimeTypes.P \ .deps/gnu/gcj/io/SimpleSHSStream.P \ .deps/gnu/gcj/io/natSimpleSHSStream.P .deps/gnu/gcj/io/shs.P \ ! .deps/gnu/gcj/jni/NativeThread.P .deps/gnu/gcj/jni/natNativeThread.P \ ! .deps/gnu/gcj/math/MPN.P .deps/gnu/gcj/protocol/file/Connection.P \ .deps/gnu/gcj/protocol/file/Handler.P \ .deps/gnu/gcj/protocol/http/Connection.P \ .deps/gnu/gcj/protocol/http/Handler.P \ .deps/gnu/gcj/protocol/jar/Connection.P \ .deps/gnu/gcj/protocol/jar/Handler.P \ ! .deps/gnu/gcj/runtime/FileDeleter.P .deps/gnu/gcj/runtime/FirstThread.P \ .deps/gnu/gcj/runtime/VMClassLoader.P \ .deps/gnu/gcj/runtime/natFirstThread.P \ ! .deps/gnu/gcj/text/BaseBreakIterator.P \ ! .deps/gnu/gcj/text/CharacterBreakIterator.P \ ! .deps/gnu/gcj/text/LineBreakIterator.P \ ! .deps/gnu/gcj/text/LocaleData_en.P \ ! .deps/gnu/gcj/text/LocaleData_en_US.P \ ! .deps/gnu/gcj/text/SentenceBreakIterator.P \ ! .deps/gnu/gcj/text/WordBreakIterator.P \ ! .deps/gnu/gcj/util/EnumerationChain.P .deps/gnu/gcj/xlib/Clip.P \ .deps/gnu/gcj/xlib/Colormap.P .deps/gnu/gcj/xlib/Display.P \ .deps/gnu/gcj/xlib/Drawable.P .deps/gnu/gcj/xlib/Font.P \ .deps/gnu/gcj/xlib/GC.P .deps/gnu/gcj/xlib/Pixmap.P \ --- 1774,1799 ---- .deps/gnu/gcj/io/DefaultMimeTypes.P .deps/gnu/gcj/io/MimeTypes.P \ .deps/gnu/gcj/io/SimpleSHSStream.P \ .deps/gnu/gcj/io/natSimpleSHSStream.P .deps/gnu/gcj/io/shs.P \ ! .deps/gnu/gcj/natCore.P .deps/gnu/gcj/protocol/core/Connection.P \ ! .deps/gnu/gcj/protocol/core/CoreInputStream.P \ ! .deps/gnu/gcj/protocol/core/Handler.P \ ! .deps/gnu/gcj/protocol/core/natCoreInputStream.P \ ! .deps/gnu/gcj/protocol/file/Connection.P \ .deps/gnu/gcj/protocol/file/Handler.P \ .deps/gnu/gcj/protocol/http/Connection.P \ .deps/gnu/gcj/protocol/http/Handler.P \ .deps/gnu/gcj/protocol/jar/Connection.P \ .deps/gnu/gcj/protocol/jar/Handler.P \ ! .deps/gnu/gcj/runtime/FileDeleter.P \ ! .deps/gnu/gcj/runtime/FinalizerThread.P \ ! .deps/gnu/gcj/runtime/FirstThread.P .deps/gnu/gcj/runtime/JNIWeakRef.P \ ! .deps/gnu/gcj/runtime/SharedLibLoader.P \ ! .deps/gnu/gcj/runtime/StringBuffer.P \ .deps/gnu/gcj/runtime/VMClassLoader.P \ + .deps/gnu/gcj/runtime/natFinalizerThread.P \ .deps/gnu/gcj/runtime/natFirstThread.P \ ! .deps/gnu/gcj/runtime/natSharedLibLoader.P \ ! .deps/gnu/gcj/runtime/natStringBuffer.P .deps/gnu/gcj/xlib/Clip.P \ .deps/gnu/gcj/xlib/Colormap.P .deps/gnu/gcj/xlib/Display.P \ .deps/gnu/gcj/xlib/Drawable.P .deps/gnu/gcj/xlib/Font.P \ .deps/gnu/gcj/xlib/GC.P .deps/gnu/gcj/xlib/Pixmap.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1305,1310 **** --- 1816,1824 ---- .deps/gnu/gcj/xlib/natXColor.P .deps/gnu/gcj/xlib/natXConfigureEvent.P \ .deps/gnu/gcj/xlib/natXException.P .deps/gnu/gcj/xlib/natXExposeEvent.P \ .deps/gnu/gcj/xlib/natXImage.P .deps/gnu/gcj/xlib/natXUnmapEvent.P \ + .deps/gnu/java/awt/BitMaskExtent.P .deps/gnu/java/awt/Buffers.P \ + .deps/gnu/java/awt/ComponentDataBlitOp.P \ + .deps/gnu/java/awt/GLightweightPeer.P \ .deps/gnu/java/beans/BeanInfoEmbryo.P \ .deps/gnu/java/beans/EmptyBeanInfo.P \ .deps/gnu/java/beans/ExplicitBeanInfo.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1323,1335 **** .deps/gnu/java/io/ClassLoaderObjectInputStream.P \ .deps/gnu/java/io/NullOutputStream.P \ .deps/gnu/java/io/ObjectIdentityWrapper.P \ ! .deps/gnu/java/lang/ArrayHelper.P .deps/gnu/java/lang/ClassHelper.P \ .deps/gnu/java/lang/reflect/TypeSignature.P \ .deps/gnu/java/locale/Calendar.P .deps/gnu/java/locale/Calendar_de.P \ .deps/gnu/java/locale/Calendar_en.P .deps/gnu/java/locale/Calendar_nl.P \ .deps/gnu/java/security/provider/Gnu.P \ .deps/gnu/java/security/provider/SHA.P \ ! .deps/gnu/java/security/provider/SHA1PRNG.P .deps/interpret.P \ .deps/java/applet/Applet.P .deps/java/applet/AppletContext.P \ .deps/java/applet/AppletStub.P .deps/java/applet/AudioClip.P \ .deps/java/awt/AWTError.P .deps/java/awt/AWTEvent.P \ --- 1837,2014 ---- .deps/gnu/java/io/ClassLoaderObjectInputStream.P \ .deps/gnu/java/io/NullOutputStream.P \ .deps/gnu/java/io/ObjectIdentityWrapper.P \ ! .deps/gnu/java/lang/ArrayHelper.P .deps/gnu/java/lang/CharData.P \ ! .deps/gnu/java/lang/ClassHelper.P \ .deps/gnu/java/lang/reflect/TypeSignature.P \ .deps/gnu/java/locale/Calendar.P .deps/gnu/java/locale/Calendar_de.P \ .deps/gnu/java/locale/Calendar_en.P .deps/gnu/java/locale/Calendar_nl.P \ + .deps/gnu/java/locale/LocaleInformation.P \ + .deps/gnu/java/locale/LocaleInformation_af_ZA.P \ + .deps/gnu/java/locale/LocaleInformation_ar_AE.P \ + .deps/gnu/java/locale/LocaleInformation_ar_BH.P \ + .deps/gnu/java/locale/LocaleInformation_ar_DZ.P \ + .deps/gnu/java/locale/LocaleInformation_ar_EG.P \ + .deps/gnu/java/locale/LocaleInformation_ar_IN.P \ + .deps/gnu/java/locale/LocaleInformation_ar_IQ.P \ + .deps/gnu/java/locale/LocaleInformation_ar_JO.P \ + .deps/gnu/java/locale/LocaleInformation_ar_KW.P \ + .deps/gnu/java/locale/LocaleInformation_ar_LB.P \ + .deps/gnu/java/locale/LocaleInformation_ar_LY.P \ + .deps/gnu/java/locale/LocaleInformation_ar_MA.P \ + .deps/gnu/java/locale/LocaleInformation_ar_OM.P \ + .deps/gnu/java/locale/LocaleInformation_ar_QA.P \ + .deps/gnu/java/locale/LocaleInformation_ar_SD.P \ + .deps/gnu/java/locale/LocaleInformation_ar_SY.P \ + .deps/gnu/java/locale/LocaleInformation_ar_TN.P \ + .deps/gnu/java/locale/LocaleInformation_ar_YE.P \ + .deps/gnu/java/locale/LocaleInformation_be_BY.P \ + .deps/gnu/java/locale/LocaleInformation_bn_IN.P \ + .deps/gnu/java/locale/LocaleInformation_br_FR.P \ + .deps/gnu/java/locale/LocaleInformation_bs_BA.P \ + .deps/gnu/java/locale/LocaleInformation_ca_ES.P \ + .deps/gnu/java/locale/LocaleInformation_cs_CZ.P \ + .deps/gnu/java/locale/LocaleInformation_cy_GB.P \ + .deps/gnu/java/locale/LocaleInformation_da_DK.P \ + .deps/gnu/java/locale/LocaleInformation_de.P \ + .deps/gnu/java/locale/LocaleInformation_de_AT.P \ + .deps/gnu/java/locale/LocaleInformation_de_BE.P \ + .deps/gnu/java/locale/LocaleInformation_de_CH.P \ + .deps/gnu/java/locale/LocaleInformation_de_DE.P \ + .deps/gnu/java/locale/LocaleInformation_de_LU.P \ + .deps/gnu/java/locale/LocaleInformation_el_GR.P \ + .deps/gnu/java/locale/LocaleInformation_en.P \ + .deps/gnu/java/locale/LocaleInformation_en_AU.P \ + .deps/gnu/java/locale/LocaleInformation_en_BW.P \ + .deps/gnu/java/locale/LocaleInformation_en_CA.P \ + .deps/gnu/java/locale/LocaleInformation_en_DK.P \ + .deps/gnu/java/locale/LocaleInformation_en_GB.P \ + .deps/gnu/java/locale/LocaleInformation_en_HK.P \ + .deps/gnu/java/locale/LocaleInformation_en_IE.P \ + .deps/gnu/java/locale/LocaleInformation_en_IN.P \ + .deps/gnu/java/locale/LocaleInformation_en_NZ.P \ + .deps/gnu/java/locale/LocaleInformation_en_PH.P \ + .deps/gnu/java/locale/LocaleInformation_en_SG.P \ + .deps/gnu/java/locale/LocaleInformation_en_US.P \ + .deps/gnu/java/locale/LocaleInformation_en_ZA.P \ + .deps/gnu/java/locale/LocaleInformation_en_ZW.P \ + .deps/gnu/java/locale/LocaleInformation_es_AR.P \ + .deps/gnu/java/locale/LocaleInformation_es_BO.P \ + .deps/gnu/java/locale/LocaleInformation_es_CL.P \ + .deps/gnu/java/locale/LocaleInformation_es_CO.P \ + .deps/gnu/java/locale/LocaleInformation_es_CR.P \ + .deps/gnu/java/locale/LocaleInformation_es_DO.P \ + .deps/gnu/java/locale/LocaleInformation_es_EC.P \ + .deps/gnu/java/locale/LocaleInformation_es_ES.P \ + .deps/gnu/java/locale/LocaleInformation_es_GT.P \ + .deps/gnu/java/locale/LocaleInformation_es_HN.P \ + .deps/gnu/java/locale/LocaleInformation_es_MX.P \ + .deps/gnu/java/locale/LocaleInformation_es_NI.P \ + .deps/gnu/java/locale/LocaleInformation_es_PA.P \ + .deps/gnu/java/locale/LocaleInformation_es_PE.P \ + .deps/gnu/java/locale/LocaleInformation_es_PR.P \ + .deps/gnu/java/locale/LocaleInformation_es_PY.P \ + .deps/gnu/java/locale/LocaleInformation_es_SV.P \ + .deps/gnu/java/locale/LocaleInformation_es_US.P \ + .deps/gnu/java/locale/LocaleInformation_es_UY.P \ + .deps/gnu/java/locale/LocaleInformation_es_VE.P \ + .deps/gnu/java/locale/LocaleInformation_et_EE.P \ + .deps/gnu/java/locale/LocaleInformation_eu_ES.P \ + .deps/gnu/java/locale/LocaleInformation_fa_IR.P \ + .deps/gnu/java/locale/LocaleInformation_fi_FI.P \ + .deps/gnu/java/locale/LocaleInformation_fo_FO.P \ + .deps/gnu/java/locale/LocaleInformation_fr_BE.P \ + .deps/gnu/java/locale/LocaleInformation_fr_CA.P \ + .deps/gnu/java/locale/LocaleInformation_fr_CH.P \ + .deps/gnu/java/locale/LocaleInformation_fr_FR.P \ + .deps/gnu/java/locale/LocaleInformation_fr_LU.P \ + .deps/gnu/java/locale/LocaleInformation_ga_IE.P \ + .deps/gnu/java/locale/LocaleInformation_gd_GB.P \ + .deps/gnu/java/locale/LocaleInformation_gl_ES.P \ + .deps/gnu/java/locale/LocaleInformation_gv_GB.P \ + .deps/gnu/java/locale/LocaleInformation_he_IL.P \ + .deps/gnu/java/locale/LocaleInformation_hi_IN.P \ + .deps/gnu/java/locale/LocaleInformation_hr_HR.P \ + .deps/gnu/java/locale/LocaleInformation_hu_HU.P \ + .deps/gnu/java/locale/LocaleInformation_id_ID.P \ + .deps/gnu/java/locale/LocaleInformation_it_CH.P \ + .deps/gnu/java/locale/LocaleInformation_it_IT.P \ + .deps/gnu/java/locale/LocaleInformation_iw_IL.P \ + .deps/gnu/java/locale/LocaleInformation_ja_JP.P \ + .deps/gnu/java/locale/LocaleInformation_ka_GE.P \ + .deps/gnu/java/locale/LocaleInformation_kl_GL.P \ + .deps/gnu/java/locale/LocaleInformation_ko_KR.P \ + .deps/gnu/java/locale/LocaleInformation_kw_GB.P \ + .deps/gnu/java/locale/LocaleInformation_lt_LT.P \ + .deps/gnu/java/locale/LocaleInformation_lv_LV.P \ + .deps/gnu/java/locale/LocaleInformation_mi_NZ.P \ + .deps/gnu/java/locale/LocaleInformation_mk_MK.P \ + .deps/gnu/java/locale/LocaleInformation_mr_IN.P \ + .deps/gnu/java/locale/LocaleInformation_mt_MT.P \ + .deps/gnu/java/locale/LocaleInformation_nl.P \ + .deps/gnu/java/locale/LocaleInformation_nl_BE.P \ + .deps/gnu/java/locale/LocaleInformation_nl_NL.P \ + .deps/gnu/java/locale/LocaleInformation_nn_NO.P \ + .deps/gnu/java/locale/LocaleInformation_no_NO.P \ + .deps/gnu/java/locale/LocaleInformation_oc_FR.P \ + .deps/gnu/java/locale/LocaleInformation_pl_PL.P \ + .deps/gnu/java/locale/LocaleInformation_pt_BR.P \ + .deps/gnu/java/locale/LocaleInformation_pt_PT.P \ + .deps/gnu/java/locale/LocaleInformation_ro_RO.P \ + .deps/gnu/java/locale/LocaleInformation_ru_RU.P \ + .deps/gnu/java/locale/LocaleInformation_ru_UA.P \ + .deps/gnu/java/locale/LocaleInformation_se_NO.P \ + .deps/gnu/java/locale/LocaleInformation_sk_SK.P \ + .deps/gnu/java/locale/LocaleInformation_sl_SI.P \ + .deps/gnu/java/locale/LocaleInformation_sq_AL.P \ + .deps/gnu/java/locale/LocaleInformation_sr_YU.P \ + .deps/gnu/java/locale/LocaleInformation_sv_FI.P \ + .deps/gnu/java/locale/LocaleInformation_sv_SE.P \ + .deps/gnu/java/locale/LocaleInformation_ta_IN.P \ + .deps/gnu/java/locale/LocaleInformation_te_IN.P \ + .deps/gnu/java/locale/LocaleInformation_tg_TJ.P \ + .deps/gnu/java/locale/LocaleInformation_tl_PH.P \ + .deps/gnu/java/locale/LocaleInformation_tr_TR.P \ + .deps/gnu/java/locale/LocaleInformation_uk_UA.P \ + .deps/gnu/java/locale/LocaleInformation_ur_PK.P \ + .deps/gnu/java/locale/LocaleInformation_uz_UZ.P \ + .deps/gnu/java/locale/LocaleInformation_vi_VN.P \ + .deps/gnu/java/locale/LocaleInformation_yi_US.P \ + .deps/gnu/java/locale/LocaleInformation_zh_CN.P \ + .deps/gnu/java/locale/LocaleInformation_zh_HK.P \ + .deps/gnu/java/locale/LocaleInformation_zh_SG.P \ + .deps/gnu/java/locale/LocaleInformation_zh_TW.P \ + .deps/gnu/java/math/MPN.P .deps/gnu/java/rmi/dgc/DGCImpl.P \ + .deps/gnu/java/rmi/dgc/DGCImpl_Skel.P \ + .deps/gnu/java/rmi/dgc/DGCImpl_Stub.P \ + .deps/gnu/java/rmi/registry/RegistryImpl.P \ + .deps/gnu/java/rmi/registry/RegistryImpl_Skel.P \ + .deps/gnu/java/rmi/registry/RegistryImpl_Stub.P \ + .deps/gnu/java/rmi/rmic/Compile_gcj.P \ + .deps/gnu/java/rmi/rmic/Compiler.P \ + .deps/gnu/java/rmi/rmic/CompilerProcess.P \ + .deps/gnu/java/rmi/rmic/RMIC.P .deps/gnu/java/rmi/rmic/TabbedWriter.P \ + .deps/gnu/java/rmi/server/ProtocolConstants.P \ + .deps/gnu/java/rmi/server/RMIDefaultSocketFactory.P \ + .deps/gnu/java/rmi/server/RMIHashes.P \ + .deps/gnu/java/rmi/server/RMIObjectInputStream.P \ + .deps/gnu/java/rmi/server/RMIObjectOutputStream.P \ + .deps/gnu/java/rmi/server/UnicastConnection.P \ + .deps/gnu/java/rmi/server/UnicastConnectionManager.P \ + .deps/gnu/java/rmi/server/UnicastRef.P \ + .deps/gnu/java/rmi/server/UnicastRemoteCall.P \ + .deps/gnu/java/rmi/server/UnicastRemoteStub.P \ + .deps/gnu/java/rmi/server/UnicastServer.P \ + .deps/gnu/java/rmi/server/UnicastServerRef.P \ + .deps/gnu/java/security/provider/DefaultPolicy.P \ .deps/gnu/java/security/provider/Gnu.P \ .deps/gnu/java/security/provider/SHA.P \ ! .deps/gnu/java/security/provider/SHA1PRNG.P \ ! .deps/gnu/java/text/BaseBreakIterator.P \ ! .deps/gnu/java/text/CharacterBreakIterator.P \ ! .deps/gnu/java/text/LineBreakIterator.P \ ! .deps/gnu/java/text/SentenceBreakIterator.P \ ! .deps/gnu/java/text/WordBreakIterator.P \ ! .deps/gnu/java/util/DoubleEnumeration.P .deps/interpret.P \ .deps/java/applet/Applet.P .deps/java/applet/AppletContext.P \ .deps/java/applet/AppletStub.P .deps/java/applet/AudioClip.P \ .deps/java/awt/AWTError.P .deps/java/awt/AWTEvent.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1354,1365 **** .deps/java/awt/Insets.P .deps/java/awt/ItemSelectable.P \ .deps/java/awt/Label.P .deps/java/awt/LayoutManager.P \ .deps/java/awt/LayoutManager2.P .deps/java/awt/List.P \ ! .deps/java/awt/Menu.P .deps/java/awt/MenuBar.P \ ! .deps/java/awt/MenuComponent.P .deps/java/awt/MenuContainer.P \ ! .deps/java/awt/MenuItem.P .deps/java/awt/MenuShortcut.P \ ! .deps/java/awt/Paint.P .deps/java/awt/PaintContext.P \ ! .deps/java/awt/Panel.P .deps/java/awt/Point.P \ ! .deps/java/awt/PopupMenu.P .deps/java/awt/Rectangle.P \ .deps/java/awt/RenderingHints.P .deps/java/awt/ScrollPane.P \ .deps/java/awt/Scrollbar.P .deps/java/awt/Shape.P \ .deps/java/awt/SystemColor.P .deps/java/awt/TextArea.P \ --- 2033,2046 ---- .deps/java/awt/Insets.P .deps/java/awt/ItemSelectable.P \ .deps/java/awt/Label.P .deps/java/awt/LayoutManager.P \ .deps/java/awt/LayoutManager2.P .deps/java/awt/List.P \ ! .deps/java/awt/MediaTracker.P .deps/java/awt/Menu.P \ ! .deps/java/awt/MenuBar.P .deps/java/awt/MenuComponent.P \ ! .deps/java/awt/MenuContainer.P .deps/java/awt/MenuItem.P \ ! .deps/java/awt/MenuShortcut.P .deps/java/awt/Paint.P \ ! .deps/java/awt/PaintContext.P .deps/java/awt/Panel.P \ ! .deps/java/awt/Point.P .deps/java/awt/Polygon.P \ ! .deps/java/awt/PopupMenu.P .deps/java/awt/PrintGraphics.P \ ! .deps/java/awt/PrintJob.P .deps/java/awt/Rectangle.P \ .deps/java/awt/RenderingHints.P .deps/java/awt/ScrollPane.P \ .deps/java/awt/Scrollbar.P .deps/java/awt/Shape.P \ .deps/java/awt/SystemColor.P .deps/java/awt/TextArea.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1369,1374 **** --- 2050,2063 ---- .deps/java/awt/color/ICC_ColorSpace.P \ .deps/java/awt/color/ICC_Profile.P \ .deps/java/awt/datatransfer/Clipboard.P \ + .deps/java/awt/datatransfer/ClipboardOwner.P \ + .deps/java/awt/datatransfer/DataFlavor.P \ + .deps/java/awt/datatransfer/FlavorMap.P \ + .deps/java/awt/datatransfer/MimeTypeParseException.P \ + .deps/java/awt/datatransfer/StringSelection.P \ + .deps/java/awt/datatransfer/SystemFlavorMap.P \ + .deps/java/awt/datatransfer/Transferable.P \ + .deps/java/awt/datatransfer/UnsupportedFlavorException.P \ .deps/java/awt/event/AWTEventListener.P \ .deps/java/awt/event/ActionEvent.P \ .deps/java/awt/event/ActionListener.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1403,1426 **** .deps/java/awt/geom/AffineTransform.P .deps/java/awt/geom/Dimension2D.P \ .deps/java/awt/geom/Ellipse2D.P \ .deps/java/awt/geom/IllegalPathStateException.P \ .deps/java/awt/geom/NoninvertibleTransformException.P \ .deps/java/awt/geom/PathIterator.P .deps/java/awt/geom/Point2D.P \ .deps/java/awt/geom/Rectangle2D.P \ .deps/java/awt/geom/RectangularShape.P \ .deps/java/awt/geom/RoundRectangle2D.P \ .deps/java/awt/image/BufferedImage.P .deps/java/awt/image/ColorModel.P \ .deps/java/awt/image/ComponentColorModel.P \ .deps/java/awt/image/ComponentSampleModel.P \ .deps/java/awt/image/DataBuffer.P .deps/java/awt/image/DataBufferByte.P \ .deps/java/awt/image/DataBufferInt.P \ .deps/java/awt/image/DataBufferUShort.P \ .deps/java/awt/image/DirectColorModel.P \ ! .deps/java/awt/image/ImageConsumer.P \ .deps/java/awt/image/ImageObserver.P \ .deps/java/awt/image/ImageProducer.P \ .deps/java/awt/image/IndexColorModel.P \ ! .deps/java/awt/image/PackedColorModel.P .deps/java/awt/image/Raster.P \ ! .deps/java/awt/image/RasterOp.P .deps/java/awt/image/SampleModel.P \ .deps/java/awt/image/SinglePixelPackedSampleModel.P \ .deps/java/awt/image/WritableRaster.P .deps/java/awt/peer/ButtonPeer.P \ .deps/java/awt/peer/CanvasPeer.P \ --- 2092,2124 ---- .deps/java/awt/geom/AffineTransform.P .deps/java/awt/geom/Dimension2D.P \ .deps/java/awt/geom/Ellipse2D.P \ .deps/java/awt/geom/IllegalPathStateException.P \ + .deps/java/awt/geom/Line2D.P \ .deps/java/awt/geom/NoninvertibleTransformException.P \ .deps/java/awt/geom/PathIterator.P .deps/java/awt/geom/Point2D.P \ .deps/java/awt/geom/Rectangle2D.P \ .deps/java/awt/geom/RectangularShape.P \ .deps/java/awt/geom/RoundRectangle2D.P \ + .deps/java/awt/image/AreaAveragingScaleFilter.P \ .deps/java/awt/image/BufferedImage.P .deps/java/awt/image/ColorModel.P \ .deps/java/awt/image/ComponentColorModel.P \ .deps/java/awt/image/ComponentSampleModel.P \ + .deps/java/awt/image/CropImageFilter.P \ .deps/java/awt/image/DataBuffer.P .deps/java/awt/image/DataBufferByte.P \ .deps/java/awt/image/DataBufferInt.P \ .deps/java/awt/image/DataBufferUShort.P \ .deps/java/awt/image/DirectColorModel.P \ ! .deps/java/awt/image/FilteredImageSource.P \ ! .deps/java/awt/image/ImageConsumer.P .deps/java/awt/image/ImageFilter.P \ .deps/java/awt/image/ImageObserver.P \ .deps/java/awt/image/ImageProducer.P \ .deps/java/awt/image/IndexColorModel.P \ ! .deps/java/awt/image/MemoryImageSource.P \ ! .deps/java/awt/image/PackedColorModel.P \ ! .deps/java/awt/image/PixelGrabber.P \ ! .deps/java/awt/image/RGBImageFilter.P .deps/java/awt/image/Raster.P \ ! .deps/java/awt/image/RasterOp.P \ ! .deps/java/awt/image/ReplicateScaleFilter.P \ ! .deps/java/awt/image/SampleModel.P \ .deps/java/awt/image/SinglePixelPackedSampleModel.P \ .deps/java/awt/image/WritableRaster.P .deps/java/awt/peer/ButtonPeer.P \ .deps/java/awt/peer/CanvasPeer.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1438,1446 **** .deps/java/awt/peer/ScrollbarPeer.P .deps/java/awt/peer/TextAreaPeer.P \ .deps/java/awt/peer/TextComponentPeer.P \ .deps/java/awt/peer/TextFieldPeer.P .deps/java/awt/peer/WindowPeer.P \ ! .deps/java/beans/BeanDescriptor.P .deps/java/beans/BeanInfo.P \ ! .deps/java/beans/Beans.P .deps/java/beans/Customizer.P \ ! .deps/java/beans/DesignMode.P .deps/java/beans/EventSetDescriptor.P \ .deps/java/beans/FeatureDescriptor.P \ .deps/java/beans/IndexedPropertyDescriptor.P \ .deps/java/beans/IntrospectionException.P \ --- 2136,2145 ---- .deps/java/awt/peer/ScrollbarPeer.P .deps/java/awt/peer/TextAreaPeer.P \ .deps/java/awt/peer/TextComponentPeer.P \ .deps/java/awt/peer/TextFieldPeer.P .deps/java/awt/peer/WindowPeer.P \ ! .deps/java/beans/AppletInitializer.P .deps/java/beans/BeanDescriptor.P \ ! .deps/java/beans/BeanInfo.P .deps/java/beans/Beans.P \ ! .deps/java/beans/Customizer.P .deps/java/beans/DesignMode.P \ ! .deps/java/beans/EventSetDescriptor.P \ .deps/java/beans/FeatureDescriptor.P \ .deps/java/beans/IndexedPropertyDescriptor.P \ .deps/java/beans/IntrospectionException.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1521,1528 **** .deps/java/lang/ArithmeticException.P \ .deps/java/lang/ArrayIndexOutOfBoundsException.P \ .deps/java/lang/ArrayStoreException.P .deps/java/lang/Boolean.P \ ! .deps/java/lang/Byte.P .deps/java/lang/Character.P \ ! .deps/java/lang/Class.P .deps/java/lang/ClassCastException.P \ .deps/java/lang/ClassCircularityError.P \ .deps/java/lang/ClassFormatError.P .deps/java/lang/ClassLoader.P \ .deps/java/lang/ClassNotFoundException.P \ --- 2220,2228 ---- .deps/java/lang/ArithmeticException.P \ .deps/java/lang/ArrayIndexOutOfBoundsException.P \ .deps/java/lang/ArrayStoreException.P .deps/java/lang/Boolean.P \ ! .deps/java/lang/Byte.P .deps/java/lang/CharSequence.P \ ! .deps/java/lang/Character.P .deps/java/lang/Class.P \ ! .deps/java/lang/ClassCastException.P \ .deps/java/lang/ClassCircularityError.P \ .deps/java/lang/ClassFormatError.P .deps/java/lang/ClassLoader.P \ .deps/java/lang/ClassNotFoundException.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1540,1545 **** --- 2240,2246 ---- .deps/java/lang/IllegalThreadStateException.P \ .deps/java/lang/IncompatibleClassChangeError.P \ .deps/java/lang/IndexOutOfBoundsException.P \ + .deps/java/lang/InheritableThreadLocal.P \ .deps/java/lang/InstantiationError.P \ .deps/java/lang/InstantiationException.P .deps/java/lang/Integer.P \ .deps/java/lang/InternalError.P .deps/java/lang/InterruptedException.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1552,1569 **** .deps/java/lang/NoSuchMethodException.P \ .deps/java/lang/NullPointerException.P .deps/java/lang/Number.P \ .deps/java/lang/NumberFormatException.P .deps/java/lang/Object.P \ ! .deps/java/lang/OutOfMemoryError.P .deps/java/lang/Process.P \ ! .deps/java/lang/Runnable.P .deps/java/lang/Runtime.P \ ! .deps/java/lang/RuntimeException.P .deps/java/lang/RuntimePermission.P \ ! .deps/java/lang/SecurityException.P .deps/java/lang/SecurityManager.P \ ! .deps/java/lang/Short.P .deps/java/lang/StackOverflowError.P \ .deps/java/lang/String.P .deps/java/lang/StringBuffer.P \ .deps/java/lang/StringIndexOutOfBoundsException.P \ .deps/java/lang/System.P .deps/java/lang/Thread.P \ .deps/java/lang/ThreadDeath.P .deps/java/lang/ThreadGroup.P \ ! .deps/java/lang/Throwable.P .deps/java/lang/UnknownError.P \ ! .deps/java/lang/UnsatisfiedLinkError.P \ .deps/java/lang/UnsupportedOperationException.P \ .deps/java/lang/VerifyError.P .deps/java/lang/VirtualMachineError.P \ .deps/java/lang/Void.P .deps/java/lang/dtoa.P .deps/java/lang/e_acos.P \ .deps/java/lang/e_asin.P .deps/java/lang/e_atan2.P \ --- 2253,2273 ---- .deps/java/lang/NoSuchMethodException.P \ .deps/java/lang/NullPointerException.P .deps/java/lang/Number.P \ .deps/java/lang/NumberFormatException.P .deps/java/lang/Object.P \ ! .deps/java/lang/OutOfMemoryError.P .deps/java/lang/Package.P \ ! .deps/java/lang/Process.P .deps/java/lang/Runnable.P \ ! .deps/java/lang/Runtime.P .deps/java/lang/RuntimeException.P \ ! .deps/java/lang/RuntimePermission.P .deps/java/lang/SecurityException.P \ ! .deps/java/lang/SecurityManager.P .deps/java/lang/Short.P \ ! .deps/java/lang/StackOverflowError.P .deps/java/lang/StrictMath.P \ .deps/java/lang/String.P .deps/java/lang/StringBuffer.P \ .deps/java/lang/StringIndexOutOfBoundsException.P \ .deps/java/lang/System.P .deps/java/lang/Thread.P \ .deps/java/lang/ThreadDeath.P .deps/java/lang/ThreadGroup.P \ ! .deps/java/lang/ThreadLocal.P .deps/java/lang/Throwable.P \ ! .deps/java/lang/UnknownError.P .deps/java/lang/UnsatisfiedLinkError.P \ ! .deps/java/lang/UnsupportedClassVersionError.P \ .deps/java/lang/UnsupportedOperationException.P \ + .deps/java/lang/VMClassLoader.P .deps/java/lang/VMSecurityManager.P \ .deps/java/lang/VerifyError.P .deps/java/lang/VirtualMachineError.P \ .deps/java/lang/Void.P .deps/java/lang/dtoa.P .deps/java/lang/e_acos.P \ .deps/java/lang/e_asin.P .deps/java/lang/e_atan2.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1578,1587 **** .deps/java/lang/natDouble.P .deps/java/lang/natFloat.P \ .deps/java/lang/natMath.P .deps/java/lang/natObject.P \ .deps/java/lang/natRuntime.P .deps/java/lang/natString.P \ ! .deps/java/lang/natSystem.P .deps/java/lang/natThread.P \ ! .deps/java/lang/natThrowable.P .deps/java/lang/ref/PhantomReference.P \ ! .deps/java/lang/ref/Reference.P .deps/java/lang/ref/ReferenceQueue.P \ .deps/java/lang/ref/SoftReference.P .deps/java/lang/ref/WeakReference.P \ .deps/java/lang/reflect/AccessibleObject.P \ .deps/java/lang/reflect/Array.P .deps/java/lang/reflect/Constructor.P \ .deps/java/lang/reflect/Field.P \ --- 2282,2293 ---- .deps/java/lang/natDouble.P .deps/java/lang/natFloat.P \ .deps/java/lang/natMath.P .deps/java/lang/natObject.P \ .deps/java/lang/natRuntime.P .deps/java/lang/natString.P \ ! .deps/java/lang/natStringBuffer.P .deps/java/lang/natSystem.P \ ! .deps/java/lang/natThread.P .deps/java/lang/natThrowable.P \ ! .deps/java/lang/ref/PhantomReference.P .deps/java/lang/ref/Reference.P \ ! .deps/java/lang/ref/ReferenceQueue.P \ .deps/java/lang/ref/SoftReference.P .deps/java/lang/ref/WeakReference.P \ + .deps/java/lang/ref/natReference.P \ .deps/java/lang/reflect/AccessibleObject.P \ .deps/java/lang/reflect/Array.P .deps/java/lang/reflect/Constructor.P \ .deps/java/lang/reflect/Field.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1604,1655 **** .deps/java/lang/w_log.P .deps/java/lang/w_pow.P \ .deps/java/lang/w_remainder.P .deps/java/lang/w_sqrt.P \ .deps/java/math/BigDecimal.P .deps/java/math/BigInteger.P \ ! .deps/java/net/BindException.P .deps/java/net/ConnectException.P \ ! .deps/java/net/ContentHandler.P .deps/java/net/ContentHandlerFactory.P \ ! .deps/java/net/DatagramPacket.P .deps/java/net/DatagramSocket.P \ ! .deps/java/net/DatagramSocketImpl.P .deps/java/net/FileNameMap.P \ ! .deps/java/net/HttpURLConnection.P .deps/java/net/InetAddress.P \ ! .deps/java/net/JarURLConnection.P \ .deps/java/net/MalformedURLException.P .deps/java/net/MulticastSocket.P \ ! .deps/java/net/NoRouteToHostException.P \ .deps/java/net/PlainDatagramSocketImpl.P \ .deps/java/net/PlainSocketImpl.P .deps/java/net/ProtocolException.P \ .deps/java/net/ServerSocket.P .deps/java/net/Socket.P \ .deps/java/net/SocketException.P .deps/java/net/SocketImpl.P \ .deps/java/net/SocketImplFactory.P .deps/java/net/SocketOptions.P \ ! .deps/java/net/URL.P .deps/java/net/URLClassLoader.P \ ! .deps/java/net/URLConnection.P .deps/java/net/URLDecoder.P \ ! .deps/java/net/URLEncoder.P .deps/java/net/URLStreamHandler.P \ .deps/java/net/URLStreamHandlerFactory.P \ .deps/java/net/UnknownHostException.P \ .deps/java/net/UnknownServiceException.P \ .deps/java/net/natInetAddress.P \ .deps/java/net/natPlainDatagramSocketImpl.P \ ! .deps/java/net/natPlainSocketImpl.P \ .deps/java/security/AlgorithmParameterGeneratorSpi.P \ ! .deps/java/security/BasicPermission.P \ ! .deps/java/security/DigestException.P \ .deps/java/security/DigestOutputStream.P \ .deps/java/security/GeneralSecurityException.P \ ! .deps/java/security/Guard.P \ .deps/java/security/InvalidAlgorithmParameterException.P \ .deps/java/security/InvalidKeyException.P \ .deps/java/security/InvalidParameterException.P \ .deps/java/security/Key.P .deps/java/security/KeyException.P \ .deps/java/security/KeyPair.P .deps/java/security/KeyPairGenerator.P \ .deps/java/security/KeyPairGeneratorSpi.P \ ! .deps/java/security/MessageDigest.P \ .deps/java/security/NoSuchAlgorithmException.P \ .deps/java/security/NoSuchProviderException.P \ .deps/java/security/Permission.P \ .deps/java/security/PermissionCollection.P \ .deps/java/security/Principal.P .deps/java/security/PrivateKey.P \ ! .deps/java/security/Provider.P .deps/java/security/PublicKey.P \ .deps/java/security/SecureClassLoader.P \ ! .deps/java/security/SecureRandom.P .deps/java/security/Security.P \ .deps/java/security/Signature.P \ ! .deps/java/security/SignatureException.P .deps/java/security/cert/CRL.P \ ! .deps/java/security/cert/CRLException.P \ .deps/java/security/cert/Certificate.P \ .deps/java/security/cert/CertificateEncodingException.P \ .deps/java/security/cert/CertificateException.P \ --- 2310,2448 ---- .deps/java/lang/w_log.P .deps/java/lang/w_pow.P \ .deps/java/lang/w_remainder.P .deps/java/lang/w_sqrt.P \ .deps/java/math/BigDecimal.P .deps/java/math/BigInteger.P \ ! .deps/java/net/Authenticator.P .deps/java/net/BindException.P \ ! .deps/java/net/ConnectException.P .deps/java/net/ContentHandler.P \ ! .deps/java/net/ContentHandlerFactory.P .deps/java/net/DatagramPacket.P \ ! .deps/java/net/DatagramSocket.P .deps/java/net/DatagramSocketImpl.P \ ! .deps/java/net/FileNameMap.P .deps/java/net/HttpURLConnection.P \ ! .deps/java/net/InetAddress.P .deps/java/net/JarURLConnection.P \ .deps/java/net/MalformedURLException.P .deps/java/net/MulticastSocket.P \ ! .deps/java/net/NetPermission.P .deps/java/net/NoRouteToHostException.P \ ! .deps/java/net/PasswordAuthentication.P \ .deps/java/net/PlainDatagramSocketImpl.P \ .deps/java/net/PlainSocketImpl.P .deps/java/net/ProtocolException.P \ .deps/java/net/ServerSocket.P .deps/java/net/Socket.P \ .deps/java/net/SocketException.P .deps/java/net/SocketImpl.P \ .deps/java/net/SocketImplFactory.P .deps/java/net/SocketOptions.P \ ! .deps/java/net/SocketPermission.P .deps/java/net/URL.P \ ! .deps/java/net/URLClassLoader.P .deps/java/net/URLConnection.P \ ! .deps/java/net/URLDecoder.P .deps/java/net/URLEncoder.P \ ! .deps/java/net/URLStreamHandler.P \ .deps/java/net/URLStreamHandlerFactory.P \ .deps/java/net/UnknownHostException.P \ .deps/java/net/UnknownServiceException.P \ .deps/java/net/natInetAddress.P \ .deps/java/net/natPlainDatagramSocketImpl.P \ ! .deps/java/net/natPlainSocketImpl.P .deps/java/rmi/AccessException.P \ ! .deps/java/rmi/AlreadyBoundException.P \ ! .deps/java/rmi/ConnectException.P .deps/java/rmi/ConnectIOException.P \ ! .deps/java/rmi/MarshalException.P .deps/java/rmi/MarshalledObject.P \ ! .deps/java/rmi/Naming.P .deps/java/rmi/NoSuchObjectException.P \ ! .deps/java/rmi/NotBoundException.P \ ! .deps/java/rmi/RMISecurityException.P \ ! .deps/java/rmi/RMISecurityManager.P .deps/java/rmi/Remote.P \ ! .deps/java/rmi/RemoteException.P .deps/java/rmi/ServerError.P \ ! .deps/java/rmi/ServerException.P \ ! .deps/java/rmi/ServerRuntimeException.P \ ! .deps/java/rmi/StubNotFoundException.P \ ! .deps/java/rmi/UnexpectedException.P \ ! .deps/java/rmi/UnknownHostException.P \ ! .deps/java/rmi/UnmarshalException.P \ ! .deps/java/rmi/activation/Activatable.P \ ! .deps/java/rmi/activation/ActivateFailedException.P \ ! .deps/java/rmi/activation/ActivationDesc.P \ ! .deps/java/rmi/activation/ActivationException.P \ ! .deps/java/rmi/activation/ActivationGroup.P \ ! .deps/java/rmi/activation/ActivationGroupDesc.P \ ! .deps/java/rmi/activation/ActivationGroupID.P \ ! .deps/java/rmi/activation/ActivationID.P \ ! .deps/java/rmi/activation/ActivationInstantiator.P \ ! .deps/java/rmi/activation/ActivationMonitor.P \ ! .deps/java/rmi/activation/ActivationSystem.P \ ! .deps/java/rmi/activation/Activator.P \ ! .deps/java/rmi/activation/UnknownGroupException.P \ ! .deps/java/rmi/activation/UnknownObjectException.P \ ! .deps/java/rmi/dgc/DGC.P .deps/java/rmi/dgc/Lease.P \ ! .deps/java/rmi/dgc/VMID.P .deps/java/rmi/registry/LocateRegistry.P \ ! .deps/java/rmi/registry/Registry.P \ ! .deps/java/rmi/registry/RegistryHandler.P \ ! .deps/java/rmi/server/ExportException.P \ ! .deps/java/rmi/server/LoaderHandler.P .deps/java/rmi/server/LogStream.P \ ! .deps/java/rmi/server/ObjID.P .deps/java/rmi/server/Operation.P \ ! .deps/java/rmi/server/RMIClassLoader.P \ ! .deps/java/rmi/server/RMIClientSocketFactory.P \ ! .deps/java/rmi/server/RMIFailureHandler.P \ ! .deps/java/rmi/server/RMIServerSocketFactory.P \ ! .deps/java/rmi/server/RMISocketFactory.P \ ! .deps/java/rmi/server/RemoteCall.P .deps/java/rmi/server/RemoteObject.P \ ! .deps/java/rmi/server/RemoteRef.P .deps/java/rmi/server/RemoteServer.P \ ! .deps/java/rmi/server/RemoteStub.P \ ! .deps/java/rmi/server/ServerCloneException.P \ ! .deps/java/rmi/server/ServerNotActiveException.P \ ! .deps/java/rmi/server/ServerRef.P .deps/java/rmi/server/Skeleton.P \ ! .deps/java/rmi/server/SkeletonMismatchException.P \ ! .deps/java/rmi/server/SkeletonNotFoundException.P \ ! .deps/java/rmi/server/SocketSecurityException.P \ ! .deps/java/rmi/server/UID.P .deps/java/rmi/server/UnicastRemoteObject.P \ ! .deps/java/rmi/server/Unreferenced.P \ ! .deps/java/security/AccessControlContext.P \ ! .deps/java/security/AccessControlException.P \ ! .deps/java/security/AccessController.P \ ! .deps/java/security/AlgorithmParameterGenerator.P \ .deps/java/security/AlgorithmParameterGeneratorSpi.P \ ! .deps/java/security/AlgorithmParameters.P \ ! .deps/java/security/AlgorithmParametersSpi.P \ ! .deps/java/security/AllPermission.P \ ! .deps/java/security/BasicPermission.P .deps/java/security/Certificate.P \ ! .deps/java/security/CodeSource.P .deps/java/security/DigestException.P \ ! .deps/java/security/DigestInputStream.P \ .deps/java/security/DigestOutputStream.P \ + .deps/java/security/DomainCombiner.P \ + .deps/java/security/DummyKeyPairGenerator.P \ + .deps/java/security/DummyMessageDigest.P \ + .deps/java/security/DummySignature.P \ .deps/java/security/GeneralSecurityException.P \ ! .deps/java/security/Guard.P .deps/java/security/GuardedObject.P \ ! .deps/java/security/Identity.P .deps/java/security/IdentityScope.P \ .deps/java/security/InvalidAlgorithmParameterException.P \ .deps/java/security/InvalidKeyException.P \ .deps/java/security/InvalidParameterException.P \ .deps/java/security/Key.P .deps/java/security/KeyException.P \ + .deps/java/security/KeyFactory.P .deps/java/security/KeyFactorySpi.P \ + .deps/java/security/KeyManagementException.P \ .deps/java/security/KeyPair.P .deps/java/security/KeyPairGenerator.P \ .deps/java/security/KeyPairGeneratorSpi.P \ ! .deps/java/security/KeyStore.P .deps/java/security/KeyStoreException.P \ ! .deps/java/security/KeyStoreSpi.P .deps/java/security/MessageDigest.P \ ! .deps/java/security/MessageDigestSpi.P \ .deps/java/security/NoSuchAlgorithmException.P \ .deps/java/security/NoSuchProviderException.P \ .deps/java/security/Permission.P \ .deps/java/security/PermissionCollection.P \ + .deps/java/security/Permissions.P .deps/java/security/Policy.P \ .deps/java/security/Principal.P .deps/java/security/PrivateKey.P \ ! .deps/java/security/PrivilegedAction.P \ ! .deps/java/security/PrivilegedActionException.P \ ! .deps/java/security/PrivilegedExceptionAction.P \ ! .deps/java/security/ProtectionDomain.P .deps/java/security/Provider.P \ ! .deps/java/security/ProviderException.P .deps/java/security/PublicKey.P \ .deps/java/security/SecureClassLoader.P \ ! .deps/java/security/SecureRandom.P \ ! .deps/java/security/SecureRandomSpi.P .deps/java/security/Security.P \ ! .deps/java/security/SecurityPermission.P \ .deps/java/security/Signature.P \ ! .deps/java/security/SignatureException.P \ ! .deps/java/security/SignatureSpi.P .deps/java/security/SignedObject.P \ ! .deps/java/security/Signer.P \ ! .deps/java/security/UnrecoverableKeyException.P \ ! .deps/java/security/UnresolvedPermission.P \ ! .deps/java/security/acl/Acl.P .deps/java/security/acl/AclEntry.P \ ! .deps/java/security/acl/AclNotFoundException.P \ ! .deps/java/security/acl/Group.P \ ! .deps/java/security/acl/LastOwnerException.P \ ! .deps/java/security/acl/NotOwnerException.P \ ! .deps/java/security/acl/Owner.P .deps/java/security/acl/Permission.P \ ! .deps/java/security/cert/CRL.P .deps/java/security/cert/CRLException.P \ .deps/java/security/cert/Certificate.P \ .deps/java/security/cert/CertificateEncodingException.P \ .deps/java/security/cert/CertificateException.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1663,1681 **** .deps/java/security/cert/X509Certificate.P \ .deps/java/security/cert/X509Extension.P \ .deps/java/security/interfaces/DSAKey.P \ .deps/java/security/interfaces/DSAParams.P \ .deps/java/security/interfaces/DSAPrivateKey.P \ .deps/java/security/interfaces/DSAPublicKey.P \ .deps/java/security/interfaces/RSAPrivateCrtKey.P \ .deps/java/security/interfaces/RSAPrivateKey.P \ .deps/java/security/interfaces/RSAPublicKey.P \ .deps/java/security/spec/AlgorithmParameterSpec.P \ .deps/java/security/spec/InvalidKeySpecException.P \ .deps/java/security/spec/InvalidParameterSpecException.P \ .deps/java/security/spec/KeySpec.P \ .deps/java/security/spec/RSAPrivateCrtKeySpec.P \ .deps/java/security/spec/RSAPrivateKeySpec.P \ ! .deps/java/security/spec/RSAPublicKeySpec.P .deps/java/sql/Array.P \ .deps/java/sql/BatchUpdateException.P .deps/java/sql/Blob.P \ .deps/java/sql/CallableStatement.P .deps/java/sql/Clob.P \ .deps/java/sql/Connection.P .deps/java/sql/DataTruncation.P \ --- 2456,2483 ---- .deps/java/security/cert/X509Certificate.P \ .deps/java/security/cert/X509Extension.P \ .deps/java/security/interfaces/DSAKey.P \ + .deps/java/security/interfaces/DSAKeyPairGenerator.P \ .deps/java/security/interfaces/DSAParams.P \ .deps/java/security/interfaces/DSAPrivateKey.P \ .deps/java/security/interfaces/DSAPublicKey.P \ + .deps/java/security/interfaces/RSAKey.P \ .deps/java/security/interfaces/RSAPrivateCrtKey.P \ .deps/java/security/interfaces/RSAPrivateKey.P \ .deps/java/security/interfaces/RSAPublicKey.P \ .deps/java/security/spec/AlgorithmParameterSpec.P \ + .deps/java/security/spec/DSAParameterSpec.P \ + .deps/java/security/spec/DSAPrivateKeySpec.P \ + .deps/java/security/spec/DSAPublicKeySpec.P \ + .deps/java/security/spec/EncodedKeySpec.P \ .deps/java/security/spec/InvalidKeySpecException.P \ .deps/java/security/spec/InvalidParameterSpecException.P \ .deps/java/security/spec/KeySpec.P \ + .deps/java/security/spec/PKCS8EncodedKeySpec.P \ + .deps/java/security/spec/RSAKeyGenParameterSpec.P \ .deps/java/security/spec/RSAPrivateCrtKeySpec.P \ .deps/java/security/spec/RSAPrivateKeySpec.P \ ! .deps/java/security/spec/RSAPublicKeySpec.P \ ! .deps/java/security/spec/X509EncodedKeySpec.P .deps/java/sql/Array.P \ .deps/java/sql/BatchUpdateException.P .deps/java/sql/Blob.P \ .deps/java/sql/CallableStatement.P .deps/java/sql/Clob.P \ .deps/java/sql/Connection.P .deps/java/sql/DataTruncation.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1688,1693 **** --- 2490,2499 ---- .deps/java/sql/SQLOutput.P .deps/java/sql/SQLWarning.P \ .deps/java/sql/Statement.P .deps/java/sql/Struct.P \ .deps/java/sql/Time.P .deps/java/sql/Timestamp.P .deps/java/sql/Types.P \ + .deps/java/text/Annotation.P \ + .deps/java/text/AttributedCharacterIterator.P \ + .deps/java/text/AttributedString.P \ + .deps/java/text/AttributedStringIterator.P \ .deps/java/text/BreakIterator.P .deps/java/text/CharacterIterator.P \ .deps/java/text/ChoiceFormat.P \ .deps/java/text/CollationElementIterator.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1712,1738 **** .deps/java/util/EventListener.P .deps/java/util/EventObject.P \ .deps/java/util/GregorianCalendar.P .deps/java/util/HashMap.P \ .deps/java/util/HashSet.P .deps/java/util/Hashtable.P \ ! .deps/java/util/Iterator.P .deps/java/util/LinkedList.P \ ! .deps/java/util/List.P .deps/java/util/ListIterator.P \ ! .deps/java/util/ListResourceBundle.P .deps/java/util/Locale.P \ ! .deps/java/util/Map.P .deps/java/util/MissingResourceException.P \ .deps/java/util/NoSuchElementException.P .deps/java/util/Observable.P \ .deps/java/util/Observer.P .deps/java/util/Properties.P \ .deps/java/util/PropertyPermission.P \ .deps/java/util/PropertyResourceBundle.P .deps/java/util/Random.P \ ! .deps/java/util/ResourceBundle.P .deps/java/util/Set.P \ ! .deps/java/util/SimpleTimeZone.P .deps/java/util/SortedMap.P \ ! .deps/java/util/SortedSet.P .deps/java/util/Stack.P \ ! .deps/java/util/StringTokenizer.P .deps/java/util/TimeZone.P \ ! .deps/java/util/Timer.P .deps/java/util/TimerTask.P \ ! .deps/java/util/TooManyListenersException.P .deps/java/util/TreeMap.P \ ! .deps/java/util/TreeSet.P .deps/java/util/Vector.P \ ! .deps/java/util/WeakHashMap.P .deps/java/util/jar/Attributes.P \ ! .deps/java/util/jar/JarEntry.P .deps/java/util/jar/JarException.P \ ! .deps/java/util/jar/JarFile.P .deps/java/util/jar/JarInputStream.P \ .deps/java/util/jar/JarOutputStream.P .deps/java/util/jar/Manifest.P \ ! .deps/java/util/natGregorianCalendar.P .deps/java/util/zip/Adler32.P \ ! .deps/java/util/zip/CRC32.P .deps/java/util/zip/CheckedInputStream.P \ .deps/java/util/zip/CheckedOutputStream.P \ .deps/java/util/zip/Checksum.P \ .deps/java/util/zip/DataFormatException.P \ --- 2518,2547 ---- .deps/java/util/EventListener.P .deps/java/util/EventObject.P \ .deps/java/util/GregorianCalendar.P .deps/java/util/HashMap.P \ .deps/java/util/HashSet.P .deps/java/util/Hashtable.P \ ! .deps/java/util/IdentityHashMap.P .deps/java/util/Iterator.P \ ! .deps/java/util/LinkedHashMap.P .deps/java/util/LinkedHashSet.P \ ! .deps/java/util/LinkedList.P .deps/java/util/List.P \ ! .deps/java/util/ListIterator.P .deps/java/util/ListResourceBundle.P \ ! .deps/java/util/Locale.P .deps/java/util/Map.P \ ! .deps/java/util/MissingResourceException.P \ .deps/java/util/NoSuchElementException.P .deps/java/util/Observable.P \ .deps/java/util/Observer.P .deps/java/util/Properties.P \ .deps/java/util/PropertyPermission.P \ .deps/java/util/PropertyResourceBundle.P .deps/java/util/Random.P \ ! .deps/java/util/RandomAccess.P .deps/java/util/ResourceBundle.P \ ! .deps/java/util/Set.P .deps/java/util/SimpleTimeZone.P \ ! .deps/java/util/SortedMap.P .deps/java/util/SortedSet.P \ ! .deps/java/util/Stack.P .deps/java/util/StringTokenizer.P \ ! .deps/java/util/TimeZone.P .deps/java/util/Timer.P \ ! .deps/java/util/TimerTask.P .deps/java/util/TooManyListenersException.P \ ! .deps/java/util/TreeMap.P .deps/java/util/TreeSet.P \ ! .deps/java/util/Vector.P .deps/java/util/WeakHashMap.P \ ! .deps/java/util/jar/Attributes.P .deps/java/util/jar/JarEntry.P \ ! .deps/java/util/jar/JarException.P .deps/java/util/jar/JarFile.P \ ! .deps/java/util/jar/JarInputStream.P \ .deps/java/util/jar/JarOutputStream.P .deps/java/util/jar/Manifest.P \ ! .deps/java/util/zip/Adler32.P .deps/java/util/zip/CRC32.P \ ! .deps/java/util/zip/CheckedInputStream.P \ .deps/java/util/zip/CheckedOutputStream.P \ .deps/java/util/zip/Checksum.P \ .deps/java/util/zip/DataFormatException.P \ *************** DEP_FILES = .deps/$(srcdir)/$(CONVERT_D *** 1745,1755 **** .deps/java/util/zip/ZipException.P .deps/java/util/zip/ZipFile.P \ .deps/java/util/zip/ZipInputStream.P \ .deps/java/util/zip/ZipOutputStream.P .deps/java/util/zip/natDeflater.P \ ! .deps/java/util/zip/natInflater.P .deps/jni.P .deps/libgcjdata.P \ ! .deps/name-finder.P .deps/no-threads.P .deps/nogc.P \ ! .deps/posix-threads.P .deps/posix.P .deps/prims.P .deps/resolve.P ! SOURCES = $(libgcjdata_a_SOURCES) $(libgcj_la_SOURCES) $(EXTRA_libgcj_la_SOURCES) $(libgcjx_la_SOURCES) $(EXTRA_libgcjx_la_SOURCES) $(jv_convert_SOURCES) $(EXTRA_jv_convert_SOURCES) $(gij_SOURCES) $(gen_from_JIS_SOURCES) $(EXTRA_gen_from_JIS_SOURCES) ! OBJECTS = $(libgcjdata_a_OBJECTS) $(libgcj_la_OBJECTS) $(libgcjx_la_OBJECTS) $(jv_convert_OBJECTS) $(gij_OBJECTS) $(gen_from_JIS_OBJECTS) all: all-redirect .SUFFIXES: --- 2554,2699 ---- .deps/java/util/zip/ZipException.P .deps/java/util/zip/ZipFile.P \ .deps/java/util/zip/ZipInputStream.P \ .deps/java/util/zip/ZipOutputStream.P .deps/java/util/zip/natDeflater.P \ ! .deps/java/util/zip/natInflater.P \ ! .deps/javax/naming/AuthenticationException.P \ ! .deps/javax/naming/AuthenticationNotSupportedException.P \ ! .deps/javax/naming/BinaryRefAddr.P .deps/javax/naming/Binding.P \ ! .deps/javax/naming/CannotProceedException.P \ ! .deps/javax/naming/CommunicationException.P \ ! .deps/javax/naming/CompositeName.P .deps/javax/naming/CompoundName.P \ ! .deps/javax/naming/ConfigurationException.P \ ! .deps/javax/naming/Context.P \ ! .deps/javax/naming/ContextNotEmptyException.P \ ! .deps/javax/naming/InitialContext.P \ ! .deps/javax/naming/InsufficientResourcesException.P \ ! .deps/javax/naming/InterruptedNamingException.P \ ! .deps/javax/naming/InvalidNameException.P \ ! .deps/javax/naming/LimitExceededException.P \ ! .deps/javax/naming/LinkException.P \ ! .deps/javax/naming/LinkLoopException.P .deps/javax/naming/LinkRef.P \ ! .deps/javax/naming/MalformedLinkException.P .deps/javax/naming/Name.P \ ! .deps/javax/naming/NameAlreadyBoundException.P \ ! .deps/javax/naming/NameClassPair.P \ ! .deps/javax/naming/NameNotFoundException.P \ ! .deps/javax/naming/NameParser.P .deps/javax/naming/NamingEnumeration.P \ ! .deps/javax/naming/NamingException.P \ ! .deps/javax/naming/NamingSecurityException.P \ ! .deps/javax/naming/NoInitialContextException.P \ ! .deps/javax/naming/NoPermissionException.P \ ! .deps/javax/naming/NotContextException.P \ ! .deps/javax/naming/OperationNotSupportedException.P \ ! .deps/javax/naming/PartialResultException.P \ ! .deps/javax/naming/RefAddr.P .deps/javax/naming/Reference.P \ ! .deps/javax/naming/Referenceable.P \ ! .deps/javax/naming/ReferralException.P \ ! .deps/javax/naming/ServiceUnavailableException.P \ ! .deps/javax/naming/SizeLimitExceededException.P \ ! .deps/javax/naming/StringRefAddr.P \ ! .deps/javax/naming/TimeLimitExceededException.P \ ! .deps/javax/naming/directory/Attribute.P \ ! .deps/javax/naming/directory/AttributeInUseException.P \ ! .deps/javax/naming/directory/AttributeModificationException.P \ ! .deps/javax/naming/directory/Attributes.P \ ! .deps/javax/naming/directory/BasicAttribute.P \ ! .deps/javax/naming/directory/BasicAttributes.P \ ! .deps/javax/naming/directory/DirContext.P \ ! .deps/javax/naming/directory/InitialDirContext.P \ ! .deps/javax/naming/directory/InvalidAttributeIdentifierException.P \ ! .deps/javax/naming/directory/InvalidAttributeValueException.P \ ! .deps/javax/naming/directory/InvalidAttributesException.P \ ! .deps/javax/naming/directory/InvalidSearchControlsException.P \ ! .deps/javax/naming/directory/InvalidSearchFilterException.P \ ! .deps/javax/naming/directory/ModificationItem.P \ ! .deps/javax/naming/directory/NoSuchAttributeException.P \ ! .deps/javax/naming/directory/SchemaViolationException.P \ ! .deps/javax/naming/directory/SearchControls.P \ ! .deps/javax/naming/directory/SearchResult.P \ ! .deps/javax/naming/event/EventContext.P \ ! .deps/javax/naming/event/EventDirContext.P \ ! .deps/javax/naming/event/NamespaceChangeListener.P \ ! .deps/javax/naming/event/NamingEvent.P \ ! .deps/javax/naming/event/NamingExceptionEvent.P \ ! .deps/javax/naming/event/NamingListener.P \ ! .deps/javax/naming/event/ObjectChangeListener.P \ ! .deps/javax/naming/ldap/Control.P \ ! .deps/javax/naming/ldap/ControlFactory.P \ ! .deps/javax/naming/ldap/ExtendedRequest.P \ ! .deps/javax/naming/ldap/ExtendedResponse.P \ ! .deps/javax/naming/ldap/HasControls.P \ ! .deps/javax/naming/ldap/InitialLdapContext.P \ ! .deps/javax/naming/ldap/LdapContext.P \ ! .deps/javax/naming/ldap/LdapReferralException.P \ ! .deps/javax/naming/ldap/UnsolicitedNotification.P \ ! .deps/javax/naming/ldap/UnsolicitedNotificationEvent.P \ ! .deps/javax/naming/ldap/UnsolicitedNotificationListener.P \ ! .deps/javax/naming/spi/DirObjectFactory.P \ ! .deps/javax/naming/spi/DirStateFactory.P \ ! .deps/javax/naming/spi/DirectoryManager.P \ ! .deps/javax/naming/spi/InitialContextFactory.P \ ! .deps/javax/naming/spi/InitialContextFactoryBuilder.P \ ! .deps/javax/naming/spi/NamingManager.P \ ! .deps/javax/naming/spi/ObjectFactory.P \ ! .deps/javax/naming/spi/ObjectFactoryBuilder.P \ ! .deps/javax/naming/spi/ResolveResult.P \ ! .deps/javax/naming/spi/Resolver.P .deps/javax/naming/spi/StateFactory.P \ ! .deps/javax/transaction/HeuristicCommitException.P \ ! .deps/javax/transaction/HeuristicMixedException.P \ ! .deps/javax/transaction/HeuristicRollbackException.P \ ! .deps/javax/transaction/InvalidTransactionException.P \ ! .deps/javax/transaction/NotSupportedException.P \ ! .deps/javax/transaction/RollbackException.P \ ! .deps/javax/transaction/Status.P \ ! .deps/javax/transaction/Synchronization.P \ ! .deps/javax/transaction/SystemException.P \ ! .deps/javax/transaction/Transaction.P \ ! .deps/javax/transaction/TransactionManager.P \ ! .deps/javax/transaction/TransactionRequiredException.P \ ! .deps/javax/transaction/TransactionRolledbackException.P \ ! .deps/javax/transaction/UserTransaction.P \ ! .deps/javax/transaction/xa/XAException.P \ ! .deps/javax/transaction/xa/XAResource.P \ ! .deps/javax/transaction/xa/Xid.P .deps/jni.P .deps/name-finder.P \ ! .deps/no-threads.P .deps/nogc.P .deps/org/w3c/dom/Attr.P \ ! .deps/org/w3c/dom/CDATASection.P .deps/org/w3c/dom/CharacterData.P \ ! .deps/org/w3c/dom/Comment.P .deps/org/w3c/dom/DOMException.P \ ! .deps/org/w3c/dom/DOMImplementation.P .deps/org/w3c/dom/Document.P \ ! .deps/org/w3c/dom/DocumentFragment.P .deps/org/w3c/dom/DocumentType.P \ ! .deps/org/w3c/dom/Element.P .deps/org/w3c/dom/Entity.P \ ! .deps/org/w3c/dom/EntityReference.P .deps/org/w3c/dom/NamedNodeMap.P \ ! .deps/org/w3c/dom/Node.P .deps/org/w3c/dom/NodeList.P \ ! .deps/org/w3c/dom/Notation.P .deps/org/w3c/dom/ProcessingInstruction.P \ ! .deps/org/w3c/dom/Text.P .deps/org/w3c/dom/ranges/DocumentRange.P \ ! .deps/org/w3c/dom/ranges/Range.P \ ! .deps/org/w3c/dom/ranges/RangeException.P \ ! .deps/org/w3c/dom/traversal/DocumentTraversal.P \ ! .deps/org/w3c/dom/traversal/NodeFilter.P \ ! .deps/org/w3c/dom/traversal/NodeIterator.P \ ! .deps/org/w3c/dom/traversal/TreeWalker.P \ ! .deps/org/xml/sax/AttributeList.P .deps/org/xml/sax/Attributes.P \ ! .deps/org/xml/sax/ContentHandler.P .deps/org/xml/sax/DTDHandler.P \ ! .deps/org/xml/sax/DocumentHandler.P .deps/org/xml/sax/EntityResolver.P \ ! .deps/org/xml/sax/ErrorHandler.P .deps/org/xml/sax/HandlerBase.P \ ! .deps/org/xml/sax/InputSource.P .deps/org/xml/sax/Locator.P \ ! .deps/org/xml/sax/Parser.P .deps/org/xml/sax/SAXException.P \ ! .deps/org/xml/sax/SAXNotRecognizedException.P \ ! .deps/org/xml/sax/SAXNotSupportedException.P \ ! .deps/org/xml/sax/SAXParseException.P .deps/org/xml/sax/XMLFilter.P \ ! .deps/org/xml/sax/XMLReader.P .deps/org/xml/sax/ext/DeclHandler.P \ ! .deps/org/xml/sax/ext/LexicalHandler.P \ ! .deps/org/xml/sax/helpers/AttributeListImpl.P \ ! .deps/org/xml/sax/helpers/AttributesImpl.P \ ! .deps/org/xml/sax/helpers/DefaultHandler.P \ ! .deps/org/xml/sax/helpers/LocatorImpl.P \ ! .deps/org/xml/sax/helpers/NamespaceSupport.P \ ! .deps/org/xml/sax/helpers/ParserAdapter.P \ ! .deps/org/xml/sax/helpers/ParserFactory.P \ ! .deps/org/xml/sax/helpers/XMLFilterImpl.P \ ! .deps/org/xml/sax/helpers/XMLReaderAdapter.P \ ! .deps/org/xml/sax/helpers/XMLReaderFactory.P .deps/posix-threads.P \ ! .deps/posix.P .deps/prims.P .deps/resolve.P .deps/verify.P \ ! .deps/win32-threads.P .deps/win32.P ! SOURCES = $(libgcj_la_SOURCES) $(EXTRA_libgcj_la_SOURCES) $(libgcjx_la_SOURCES) $(EXTRA_libgcjx_la_SOURCES) $(jv_convert_SOURCES) $(EXTRA_jv_convert_SOURCES) $(gij_SOURCES) $(rmic_SOURCES) $(EXTRA_rmic_SOURCES) $(rmiregistry_SOURCES) $(EXTRA_rmiregistry_SOURCES) $(gen_from_JIS_SOURCES) $(EXTRA_gen_from_JIS_SOURCES) ! OBJECTS = $(libgcj_la_OBJECTS) $(libgcjx_la_OBJECTS) $(jv_convert_OBJECTS) $(gij_OBJECTS) $(rmic_OBJECTS) $(rmiregistry_OBJECTS) $(gen_from_JIS_OBJECTS) all: all-redirect .SUFFIXES: *************** config.status: $(srcdir)/configure $(CON *** 1768,1808 **** $(SHELL) ./config.status --recheck $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) libgcj.spec: $(top_builddir)/config.status libgcj.spec.in cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status libgcj-test.spec: $(top_builddir)/config.status libgcj-test.spec.in cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status ! mostlyclean-toolexeclibLIBRARIES: ! clean-toolexeclibLIBRARIES: ! -test -z "$(toolexeclib_LIBRARIES)" || rm -f $(toolexeclib_LIBRARIES) ! distclean-toolexeclibLIBRARIES: ! maintainer-clean-toolexeclibLIBRARIES: ! install-toolexeclibLIBRARIES: $(toolexeclib_LIBRARIES) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) ! @list='$(toolexeclib_LIBRARIES)'; for p in $$list; do \ ! if test -f $$p; then \ ! echo " $(INSTALL_DATA) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \ ! $(INSTALL_DATA) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \ ! else :; fi; \ ! done ! @$(POST_INSTALL) ! @list='$(toolexeclib_LIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ ! echo " $(RANLIB) $(DESTDIR)$(toolexeclibdir)/$$p"; \ ! $(RANLIB) $(DESTDIR)$(toolexeclibdir)/$$p; \ else :; fi; \ done ! uninstall-toolexeclibLIBRARIES: @$(NORMAL_UNINSTALL) ! list='$(toolexeclib_LIBRARIES)'; for p in $$list; do \ ! rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \ done # FIXME: We should only use cygpath when building on Windows, --- 2712,2792 ---- $(SHELL) ./config.status --recheck $(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) + + include/config.h: include/stamp-h1 + @if test ! -f $@; then \ + rm -f include/stamp-h1; \ + $(MAKE) include/stamp-h1; \ + else :; fi + include/stamp-h1: $(srcdir)/include/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=include/config.h \ + $(SHELL) ./config.status + @echo timestamp > include/stamp-h1 2> /dev/null + $(srcdir)/include/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/include/stamp-h1.in + @if test ! -f $@; then \ + rm -f $(srcdir)/include/stamp-h1.in; \ + $(MAKE) $(srcdir)/include/stamp-h1.in; \ + else :; fi + $(srcdir)/include/stamp-h1.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/include/stamp-h1.in 2> /dev/null + + gcj/libgcj-config.h: gcj/stamp-h2 + @if test ! -f $@; then \ + rm -f gcj/stamp-h2; \ + $(MAKE) gcj/stamp-h2; \ + else :; fi + gcj/stamp-h2: $(srcdir)/gcj/libgcj-config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=gcj/libgcj-config.h \ + $(SHELL) ./config.status + @echo timestamp > gcj/stamp-h2 2> /dev/null + $(srcdir)/gcj/libgcj-config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/gcj/stamp-h2.in + @if test ! -f $@; then \ + rm -f $(srcdir)/gcj/stamp-h2.in; \ + $(MAKE) $(srcdir)/gcj/stamp-h2.in; \ + else :; fi + $(srcdir)/gcj/stamp-h2.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/gcj/stamp-h2.in 2> /dev/null + + mostlyclean-hdr: + + clean-hdr: + + distclean-hdr: + -rm -f include/config.h gcj/libgcj-config.h + + maintainer-clean-hdr: libgcj.spec: $(top_builddir)/config.status libgcj.spec.in cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status libgcj-test.spec: $(top_builddir)/config.status libgcj-test.spec.in cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status ! mostlyclean-toolexeclibLTLIBRARIES: ! clean-toolexeclibLTLIBRARIES: ! -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) ! distclean-toolexeclibLTLIBRARIES: ! maintainer-clean-toolexeclibLTLIBRARIES: ! install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) ! @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ ! echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \ ! $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \ else :; fi; \ done ! uninstall-toolexeclibLTLIBRARIES: @$(NORMAL_UNINSTALL) ! list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ ! $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \ done # FIXME: We should only use cygpath when building on Windows, *************** distclean-libtool: *** 1843,1878 **** maintainer-clean-libtool: - libgcjdata.a: $(libgcjdata_a_OBJECTS) $(libgcjdata_a_DEPENDENCIES) - -rm -f libgcjdata.a - $(AR) cru libgcjdata.a $(libgcjdata_a_OBJECTS) $(libgcjdata_a_LIBADD) - $(RANLIB) libgcjdata.a - - mostlyclean-toolexeclibLTLIBRARIES: - - clean-toolexeclibLTLIBRARIES: - -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) - - distclean-toolexeclibLTLIBRARIES: - - maintainer-clean-toolexeclibLTLIBRARIES: - - install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) - @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ - if test -f $$p; then \ - echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \ - $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \ - else :; fi; \ - done - - uninstall-toolexeclibLTLIBRARIES: - @$(NORMAL_UNINSTALL) - list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \ - done - mostlyclean-binPROGRAMS: clean-binPROGRAMS: --- 2827,2832 ---- *************** gij$(EXEEXT): $(gij_OBJECTS) $(gij_DEPEN *** 1915,1920 **** --- 2869,2882 ---- @rm -f gij$(EXEEXT) $(gij_LINK) $(gij_LDFLAGS) $(gij_OBJECTS) $(gij_LDADD) $(LIBS) + rmic$(EXEEXT): $(rmic_OBJECTS) $(rmic_DEPENDENCIES) + @rm -f rmic$(EXEEXT) + $(rmic_LINK) $(rmic_LDFLAGS) $(rmic_OBJECTS) $(rmic_LDADD) $(LIBS) + + rmiregistry$(EXEEXT): $(rmiregistry_OBJECTS) $(rmiregistry_DEPENDENCIES) + @rm -f rmiregistry$(EXEEXT) + $(rmiregistry_LINK) $(rmiregistry_LDFLAGS) $(rmiregistry_OBJECTS) $(rmiregistry_LDADD) $(LIBS) + gen-from-JIS$(EXEEXT): $(gen_from_JIS_OBJECTS) $(gen_from_JIS_DEPENDENCIES) @rm -f gen-from-JIS$(EXEEXT) $(LINK) $(gen_from_JIS_LDFLAGS) $(gen_from_JIS_OBJECTS) $(gen_from_JIS_LDADD) $(LIBS) *************** uninstall-binSCRIPTS: *** 1944,1966 **** .cc.lo: $(LTCXXCOMPILE) -c $< ! install-dataDATA: $(data_DATA) @$(NORMAL_INSTALL) ! $(mkinstalldirs) $(DESTDIR)$(datadir) ! @list='$(data_DATA)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ ! echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(datadir)/$$p"; \ ! $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(datadir)/$$p; \ else if test -f $$p; then \ ! echo " $(INSTALL_DATA) $$p $(DESTDIR)$(datadir)/$$p"; \ ! $(INSTALL_DATA) $$p $(DESTDIR)$(datadir)/$$p; \ fi; fi; \ done ! uninstall-dataDATA: @$(NORMAL_UNINSTALL) ! list='$(data_DATA)'; for p in $$list; do \ ! rm -f $(DESTDIR)$(datadir)/$$p; \ done install-toolexeclibDATA: $(toolexeclib_DATA) --- 2906,2928 ---- .cc.lo: $(LTCXXCOMPILE) -c $< ! install-jarDATA: $(jar_DATA) @$(NORMAL_INSTALL) ! $(mkinstalldirs) $(DESTDIR)$(jardir) ! @list='$(jar_DATA)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ ! echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(jardir)/$$p"; \ ! $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(jardir)/$$p; \ else if test -f $$p; then \ ! echo " $(INSTALL_DATA) $$p $(DESTDIR)$(jardir)/$$p"; \ ! $(INSTALL_DATA) $$p $(DESTDIR)$(jardir)/$$p; \ fi; fi; \ done ! uninstall-jarDATA: @$(NORMAL_UNINSTALL) ! list='$(jar_DATA)'; for p in $$list; do \ ! rm -f $(DESTDIR)$(jardir)/$$p; \ done install-toolexeclibDATA: $(toolexeclib_DATA) *************** distdir: $(DISTFILES) *** 2117,2123 **** @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ --- 3079,3085 ---- @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ *************** check-am: all-am *** 2193,2226 **** check: check-recursive installcheck-am: installcheck: installcheck-recursive ! install-exec-am: install-toolexeclibLIBRARIES \ ! install-toolexeclibLTLIBRARIES install-binPROGRAMS \ install-binSCRIPTS install-toolexeclibDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-exec: install-exec-recursive ! install-data-am: install-dataDATA install-data-local install-data: install-data-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-recursive ! uninstall-am: uninstall-toolexeclibLIBRARIES \ ! uninstall-toolexeclibLTLIBRARIES uninstall-binPROGRAMS \ ! uninstall-binSCRIPTS uninstall-dataDATA \ uninstall-toolexeclibDATA uninstall: uninstall-recursive ! all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) \ ! $(DATA) all-redirect: all-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: installdirs-recursive installdirs-am: ! $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) \ ! $(DESTDIR)$(toolexeclibdir) $(DESTDIR)$(bindir) \ ! $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \ $(DESTDIR)$(toolexeclibdir) --- 3155,3184 ---- check: check-recursive installcheck-am: installcheck: installcheck-recursive ! install-exec-am: install-toolexeclibLTLIBRARIES install-binPROGRAMS \ install-binSCRIPTS install-toolexeclibDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-exec: install-exec-recursive ! install-data-am: install-jarDATA install-data-local install-data: install-data-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-recursive ! uninstall-am: uninstall-toolexeclibLTLIBRARIES uninstall-binPROGRAMS \ ! uninstall-binSCRIPTS uninstall-jarDATA \ uninstall-toolexeclibDATA uninstall: uninstall-recursive ! all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) all-redirect: all-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: installdirs-recursive installdirs-am: ! $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) $(DESTDIR)$(bindir) \ ! $(DESTDIR)$(bindir) $(DESTDIR)$(jardir) \ $(DESTDIR)$(toolexeclibdir) *************** distclean-generic: *** 2235,2256 **** -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: ! mostlyclean-am: mostlyclean-toolexeclibLIBRARIES mostlyclean-compile \ ! mostlyclean-libtool mostlyclean-toolexeclibLTLIBRARIES \ mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \ mostlyclean-tags mostlyclean-depend mostlyclean-generic mostlyclean: mostlyclean-recursive ! clean-am: clean-toolexeclibLIBRARIES clean-compile clean-libtool \ ! clean-toolexeclibLTLIBRARIES clean-binPROGRAMS \ ! clean-noinstPROGRAMS clean-tags clean-depend \ ! clean-generic mostlyclean-am clean-local clean: clean-recursive ! distclean-am: distclean-toolexeclibLIBRARIES distclean-compile \ ! distclean-libtool distclean-toolexeclibLTLIBRARIES \ distclean-binPROGRAMS distclean-noinstPROGRAMS \ distclean-tags distclean-depend distclean-generic \ clean-am --- 3193,3214 ---- -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: ! mostlyclean-am: mostlyclean-hdr mostlyclean-toolexeclibLTLIBRARIES \ ! mostlyclean-compile mostlyclean-libtool \ mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \ mostlyclean-tags mostlyclean-depend mostlyclean-generic mostlyclean: mostlyclean-recursive ! clean-am: clean-hdr clean-toolexeclibLTLIBRARIES clean-compile \ ! clean-libtool clean-binPROGRAMS clean-noinstPROGRAMS \ ! clean-tags clean-depend clean-generic mostlyclean-am \ ! clean-local clean: clean-recursive ! distclean-am: distclean-hdr distclean-toolexeclibLTLIBRARIES \ ! distclean-compile distclean-libtool \ distclean-binPROGRAMS distclean-noinstPROGRAMS \ distclean-tags distclean-depend distclean-generic \ clean-am *************** distclean-am: distclean-toolexeclibLIBR *** 2259,2267 **** distclean: distclean-recursive -rm -f config.status ! maintainer-clean-am: maintainer-clean-toolexeclibLIBRARIES \ ! maintainer-clean-compile maintainer-clean-libtool \ maintainer-clean-toolexeclibLTLIBRARIES \ maintainer-clean-binPROGRAMS \ maintainer-clean-noinstPROGRAMS maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ --- 3217,3225 ---- distclean: distclean-recursive -rm -f config.status ! maintainer-clean-am: maintainer-clean-hdr \ maintainer-clean-toolexeclibLTLIBRARIES \ + maintainer-clean-compile maintainer-clean-libtool \ maintainer-clean-binPROGRAMS \ maintainer-clean-noinstPROGRAMS maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ *************** maintainer-clean-am: maintainer-clean-t *** 2272,2296 **** maintainer-clean: maintainer-clean-recursive -rm -f config.status ! .PHONY: mostlyclean-toolexeclibLIBRARIES distclean-toolexeclibLIBRARIES \ ! clean-toolexeclibLIBRARIES maintainer-clean-toolexeclibLIBRARIES \ ! uninstall-toolexeclibLIBRARIES install-toolexeclibLIBRARIES \ ! mostlyclean-compile distclean-compile clean-compile \ ! maintainer-clean-compile mostlyclean-libtool distclean-libtool \ ! clean-libtool maintainer-clean-libtool \ mostlyclean-toolexeclibLTLIBRARIES distclean-toolexeclibLTLIBRARIES \ clean-toolexeclibLTLIBRARIES maintainer-clean-toolexeclibLTLIBRARIES \ uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES \ ! mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ ! maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ ! mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \ ! clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ ! uninstall-binSCRIPTS install-binSCRIPTS uninstall-dataDATA \ ! install-dataDATA uninstall-toolexeclibDATA install-toolexeclibDATA \ ! install-data-recursive uninstall-data-recursive install-exec-recursive \ ! uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ ! all-recursive check-recursive installcheck-recursive info-recursive \ ! dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ distclean-tags clean-tags maintainer-clean-tags distdir \ mostlyclean-depend distclean-depend clean-depend \ --- 3230,3252 ---- maintainer-clean: maintainer-clean-recursive -rm -f config.status ! .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ mostlyclean-toolexeclibLTLIBRARIES distclean-toolexeclibLTLIBRARIES \ clean-toolexeclibLTLIBRARIES maintainer-clean-toolexeclibLTLIBRARIES \ uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES \ ! mostlyclean-compile distclean-compile clean-compile \ ! maintainer-clean-compile mostlyclean-libtool distclean-libtool \ ! clean-libtool maintainer-clean-libtool mostlyclean-binPROGRAMS \ ! distclean-binPROGRAMS clean-binPROGRAMS maintainer-clean-binPROGRAMS \ ! uninstall-binPROGRAMS install-binPROGRAMS mostlyclean-noinstPROGRAMS \ ! distclean-noinstPROGRAMS clean-noinstPROGRAMS \ ! maintainer-clean-noinstPROGRAMS uninstall-binSCRIPTS install-binSCRIPTS \ ! uninstall-jarDATA install-jarDATA uninstall-toolexeclibDATA \ ! install-toolexeclibDATA install-data-recursive uninstall-data-recursive \ ! install-exec-recursive uninstall-exec-recursive installdirs-recursive \ ! uninstalldirs-recursive all-recursive check-recursive \ ! installcheck-recursive info-recursive dvi-recursive \ ! mostlyclean-recursive distclean-recursive clean-recursive \ maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ distclean-tags clean-tags maintainer-clean-tags distdir \ mostlyclean-depend distclean-depend clean-depend \ *************** install-exec-hook: *** 2309,2345 **** $(LN_S) libgcjx.la gnu-awt-xlib.la; \ fi ! $(java_source_files:.java=.class): libgcj.jar ! ! $(x_java_source_files:.java=.class): libgcj.jar ! $(built_java_source_files:.java=.class): $(built_java_source_files) ! @javac="$(JAVAC)"; \ ! for f in $?; do \ ! echo $$javac -L$(here) $(JCFLAGS) -classpath $(here):`cd $(srcdir) && /bin/pwd` -d $(here) $$f; \ ! $$javac -L$(here) $(JCFLAGS) -classpath $(here):`cd $(srcdir) && /bin/pwd` \ ! -d $(here) $$f; \ ! done ! libgcj.jar: $(java_source_files) $(x_java_source_files) ! @: $(shell echo Creating list of files to compile...) $(shell rm -f tmp-list || :) $(shell touch tmp-list) $(foreach source,$(subst $(srcdir)/,,$?),$(shell echo $(source) >> tmp-list)) ! $(MAKE) $(built_java_source_files:.java=.class) @set fnord $(MAKEFLAGS); amf=$$2; fail=no; \ ! javac="$(JAVAC)"; dir=`/bin/pwd`; cd $(srcdir); \ ! for f in `cat $$dir/tmp-list`; do \ ! echo $$javac $(JCFLAGS) -classpath $(here):`/bin/pwd` -d $(here) $$f; \ ! $$javac $(JCFLAGS) -classpath $(here):`/bin/pwd` -d $(here) $$f \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes ;; *) exit 1;; esac; \ done; \ ! test "$$fail" = no ! -@rm -f tmp-list libgcj.jar ! find java gnu -type d -o -type f -name '*.class' | \ sed -e '/\/\./d' -e '/\/xlib/d' | \ $(ZIP) cfM0E@ $@ clean-local: find . -name '*.class' -print | xargs rm -f .class.lo: $(GCJCOMPILE) -o $@ $< --- 3265,3297 ---- $(LN_S) libgcjx.la gnu-awt-xlib.la; \ fi ! $(built_java_source_files:.java=.class): libgcj-@gcc_version@.jar ! $(java_source_files:.java=.class): libgcj-@gcc_version@.jar ! $(x_java_source_files:.java=.class): libgcj-@gcc_version@.jar ! libgcj-@gcc_version@.jar: $(built_java_source_files) $(java_source_files) $(x_java_source_files) ! @: $(shell echo Creating list of files to compile...) $(shell rm -f tmp-list || :) $(shell touch tmp-list) $(foreach source,$?,$(shell echo $(source) >> tmp-list)) @set fnord $(MAKEFLAGS); amf=$$2; fail=no; \ ! javac="$(JAVAC)"; \ ! cat tmp-list | (while read f; do \ ! echo $$javac $(JCFLAGS) -classpath \'\' -bootclasspath $(here):$(srcdir) -d $(here) $$f; \ ! $$javac $(JCFLAGS) -classpath '' -bootclasspath $(here):$(srcdir) -d $(here) $$f \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes ;; *) exit 1;; esac; \ done; \ ! test "$$fail" = no) ! -@rm -f tmp-list libgcj-@gcc_version@.jar ! find java gnu javax org -type d -o -type f -name '*.class' | \ sed -e '/\/\./d' -e '/\/xlib/d' | \ $(ZIP) cfM0E@ $@ clean-local: find . -name '*.class' -print | xargs rm -f + # Just remove the objects from C++ sources, for testing the C++ compiler. + clean-nat: + rm -f $(nat_files) $(x_nat_files) + .class.lo: $(GCJCOMPILE) -o $@ $< *************** clean-local: *** 2347,2360 **** $(GCJCOMPILE) -o $@ $< $(nat_files) $(x_nat_files): %.lo: %.cc ! @echo '$(LTCXXCOMPILE) -c -o $@ $<'; \ ! $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c -o $@ $< ! @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ ! < .deps/$(*F).pp > .deps/$(*F).P; \ ! tr ' ' '\012' < .deps/$(*F).pp \ ! | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ ! >> .deps/$(*F).P; \ ! rm -f .deps/$(*F).pp $(c_files): %.lo: %.c $(LTCOMPILE) -c -o $@ $< --- 3299,3307 ---- $(GCJCOMPILE) -o $@ $< $(nat_files) $(x_nat_files): %.lo: %.cc ! @echo '$(LTCXXCOMPILE) -MD -MT $@ -MF $(@:.lo=.pp) -c -o $@ $<'; \ ! $(LTCXXCOMPILE) -MD -MT $@ -MF $(@:.lo=.pp) -c -o $@ $< ! @-mv $(@:.lo=.pp) $(@:.lo=.d) $(c_files): %.lo: %.c $(LTCOMPILE) -c -o $@ $< *************** $(javao_files) $(x_javao_files): %.lo: % *** 2365,2410 **** $(GCJCOMPILE) -o $@ $< libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES) ! @echo $(libgcj_la_OBJECTS) > libgcj.objectlist; ! @echo $(libgcj_la_LIBADD) >> libgcj.objectlist; $(libgcj_la_LINK) -objectlist libgcj.objectlist \ ! ../libffi/libfficonvenience.la \ -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS) libgcjx.la: $(libgcjx_la_OBJECTS) $(libgcjx_la_DEPENDENCIES) ! @echo $(libgcjx_la_OBJECTS) > libgcjx.objectlist; ! @echo $(libgcjx_la_LIBADD) >> libgcjx.objectlist; $(libgcjx_la_LINK) -objectlist libgcjx.objectlist \ -rpath $(toolexeclibdir) $(libgcjx_la_LDFLAGS) $(LIBS) .class.h: ! $(GCJH) -classpath $(top_builddir) $(basename $<) ! java/lang/ClassLoader.h: java/lang/ClassLoader.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ ! -friend 'jclass _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader);' \ ! -friend 'void _Jv_RunMain (const char *name, int argc, const char **argv, bool is_jar);' \ ! $(basename $<) ! gnu/gcj/runtime/FirstThread.h: gnu/gcj/runtime/FirstThread.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ ! -friend 'void JvRunMain (jclass, int, const char **);' \ ! -friend 'void _Jv_RunMain (const char*, int, const char **);' \ $(basename $<) ! java/lang/Thread.h: java/lang/Thread.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -prepend 'class _Jv_JNIEnv;' \ - -prepend 'extern "Java" { namespace gnu { namespace gcj { namespace jni { class NativeThread; } } } };' \ -prepend '#define _JV_NOT_OWNER 1' \ -prepend '#define _JV_INTERRUPTED 2' \ -friend '_Jv_JNIEnv * _Jv_GetCurrentJNIEnv ();' \ -friend 'void _Jv_SetCurrentJNIEnv (_Jv_JNIEnv *env);' \ ! -friend 'class gnu::gcj::jni::NativeThread;' \ $(basename $<) ! java/lang/String.h: java/lang/String.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jchar* _Jv_GetStringChars (jstring str);' \ -friend 'jstring* _Jv_StringFindSlot (jchar*, jint, jint);' \ -friend 'jstring* _Jv_StringGetSlot (jstring);' \ --- 3312,3353 ---- $(GCJCOMPILE) -o $@ $< libgcj.la: $(libgcj_la_OBJECTS) $(libgcj_la_DEPENDENCIES) ! @: $(shell echo Creating list of files to link...) $(shell rm -f libgcj.objectlist || :) $(shell touch libgcj.objectlist) $(foreach object,$(libgcj_la_OBJECTS) $(libgcj_la_LIBADD),$(shell echo $(object) >> libgcj.objectlist)) $(libgcj_la_LINK) -objectlist libgcj.objectlist \ ! @GCLIBS@ @LIBFFI@ @ZLIBS@ \ -rpath $(toolexeclibdir) $(libgcj_la_LDFLAGS) $(LIBS) libgcjx.la: $(libgcjx_la_OBJECTS) $(libgcjx_la_DEPENDENCIES) ! @: $(shell echo Creating list of files to link...) $(shell rm -f libgcjx.objectlist || :) $(shell touch libgcjx.objectlist) $(foreach object,$(libgcjx_la_OBJECTS) $(libgcjx_la_LIBADD),$(shell echo $(object) >> libgcjx.objectlist)) $(libgcjx_la_LINK) -objectlist libgcjx.objectlist \ -rpath $(toolexeclibdir) $(libgcjx_la_LDFLAGS) $(LIBS) .class.h: ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) $(basename $<) ! $(ordinary_nat_headers) $(x_nat_headers): %.h: %.class ! java/lang/ClassLoader.h: java/lang/ClassLoader.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ ! -friend 'jclass _Jv_FindClass (_Jv_Utf8Const *name, java::lang::ClassLoader *loader);' \ ! -friend 'void _Jv_RunMain (jclass klass, const char *name, int argc, const char **argv, bool is_jar);' \ $(basename $<) ! java/lang/Thread.h: java/lang/Thread.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -prepend 'class _Jv_JNIEnv;' \ -prepend '#define _JV_NOT_OWNER 1' \ -prepend '#define _JV_INTERRUPTED 2' \ -friend '_Jv_JNIEnv * _Jv_GetCurrentJNIEnv ();' \ -friend 'void _Jv_SetCurrentJNIEnv (_Jv_JNIEnv *env);' \ ! -friend 'void _Jv_ThreadRun (java::lang::Thread* thread);' \ ! -friend 'jint _Jv_AttachCurrentThread(java::lang::Thread* thread);' \ ! -friend 'java::lang::Thread* _Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group);' \ ! -friend 'jint _Jv_DetachCurrentThread ();' \ $(basename $<) ! java/lang/String.h: java/lang/String.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jchar* _Jv_GetStringChars (jstring str);' \ -friend 'jstring* _Jv_StringFindSlot (jchar*, jint, jint);' \ -friend 'jstring* _Jv_StringGetSlot (jstring);' \ *************** java/lang/String.h: java/lang/String.cla *** 2413,2450 **** -friend 'jstring _Jv_AllocString (jsize);' \ $(basename $<) ! java/lang/reflect/Constructor.h: java/lang/reflect/Constructor.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);' \ -friend 'class java::lang::Class;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! java/lang/reflect/Field.h: java/lang/reflect/Field.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \ -friend 'jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv*, jclass, jfieldID, jboolean);' \ -friend 'class java::lang::Class;' \ $(basename $<) ! java/lang/reflect/Method.h: java/lang/reflect/Method.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);' \ -friend 'class java::lang::Class;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! gnu/gcj/runtime/VMClassLoader.h: gnu/gcj/runtime/VMClassLoader.class libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ ! -friend 'class java::lang::ClassLoader;' \ $(basename $<) ! java/io/ObjectInputStream$$GetField.h: libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ 'java/io/ObjectInputStream$$GetField' ! java/io/ObjectOutputStream$$PutField.h: libgcj.jar ! $(GCJH) -classpath $(top_builddir) \ 'java/io/ObjectOutputStream$$PutField' $(extra_headers): --- 3356,3394 ---- -friend 'jstring _Jv_AllocString (jsize);' \ $(basename $<) ! java/lang/reflect/Constructor.h: java/lang/reflect/Constructor.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);' \ -friend 'class java::lang::Class;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! java/lang/reflect/Field.h: java/lang/reflect/Field.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \ -friend 'jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv*, jclass, jfieldID, jboolean);' \ -friend 'class java::lang::Class;' \ $(basename $<) ! java/lang/reflect/Method.h: java/lang/reflect/Method.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ -friend 'jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);' \ -friend 'class java::lang::Class;' \ + -friend 'class java::io::ObjectInputStream;' \ -friend 'jobject _Jv_JNI_ToReflectedMethod (_Jv_JNIEnv *, jclass, jmethodID, jboolean);' \ $(basename $<) ! gnu/gcj/runtime/VMClassLoader.h: gnu/gcj/runtime/VMClassLoader.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ ! -friend 'class ::java::lang::ClassLoader;' \ $(basename $<) ! java/io/ObjectInputStream$$GetField.h: java/io/ObjectInputStream.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ 'java/io/ObjectInputStream$$GetField' ! java/io/ObjectOutputStream$$PutField.h: java/io/ObjectOutputStream.class ! $(GCJH) -classpath '' -bootclasspath $(top_builddir) \ 'java/io/ObjectOutputStream$$PutField' $(extra_headers): *************** $(extra_headers): *** 2452,2464 **** install-data-local: $(PRE_INSTALL) ! @for f in $(nat_headers) $(extra_headers); do \ d="`echo $$f | sed -e 's,/[^/]*$$,,'`"; \ $(mkinstalldirs) $(DESTDIR)$(includedir)/$$d; \ if test -f $(srcdir)/$$f; then p=$(srcdir)/$$f; else p=$$f; fi; \ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f"; \ $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f; \ done maintainer-check: libgcj.la $(NM) .libs/libgcj.a | grep ' T ' \ --- 3396,3415 ---- install-data-local: $(PRE_INSTALL) ! @: $(shell echo Creating list of headers to install...) $(shell rm -f tmp-ilist || :) $(shell touch tmp-ilist) $(foreach hdr,$(nat_headers) $(extra_headers),$(shell echo $(hdr) >> tmp-ilist)) ! @cat tmp-ilist | while read f; do \ d="`echo $$f | sed -e 's,/[^/]*$$,,'`"; \ $(mkinstalldirs) $(DESTDIR)$(includedir)/$$d; \ if test -f $(srcdir)/$$f; then p=$(srcdir)/$$f; else p=$$f; fi; \ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f"; \ $(INSTALL_DATA) $$p $(DESTDIR)$(includedir)/$$f; \ done + -@rm -f tmp-ilist + $(mkinstalldirs) $(DESTDIR)$(secdir) + @for f in classpath.security libgcj.security; do \ + echo " $(INSTALL_DATA) $(srcdir)/java/security/$$f $(DESTDIR)$(secdir)/$$f"; \ + $(INSTALL_DATA) $(srcdir)/java/security/$$f $(DESTDIR)$(secdir)/$$f; \ + done maintainer-check: libgcj.la $(NM) .libs/libgcj.a | grep ' T ' \ *************** maintainer-check: libgcj.la *** 2466,2478 **** | grep -v 'Jv' \ | grep -v 'terminate__Fv' | grep -v 'unexpected__Fv' ! header-check: libgcj.jar $(nat_headers) rm -f htest.cc; \ for h in $(nat_headers); do \ echo "#include \"$$h\"" >> htest.cc; \ done; \ $(CXXCOMPILE) -fsyntax-only htest.cc # The Unicode consortium does not permit re-distributing the file JIS0201.TXT. # You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/. --- 3417,3437 ---- | grep -v 'Jv' \ | grep -v 'terminate__Fv' | grep -v 'unexpected__Fv' ! header-check: libgcj-@gcc_version@.jar $(nat_headers) rm -f htest.cc; \ for h in $(nat_headers); do \ echo "#include \"$$h\"" >> htest.cc; \ done; \ $(CXXCOMPILE) -fsyntax-only htest.cc + class-check: libgcj-@gcc_version@.jar + @ok=0; find . -name '*.class' -print | fgrep -v testsuite | \ + while read f; do \ + echo "$(GCJ_WITH_FLAGS) --syntax-only $$f"; \ + if $(GCJ_WITH_FLAGS) --syntax-only $$f; then \ + :; else ok=1; fi; \ + done; exit $$ok + # The Unicode consortium does not permit re-distributing the file JIS0201.TXT. # You can get it from ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/. diff -Nrc3pad gcc-3.0.4/libjava/THANKS gcc-3.1/libjava/THANKS *** gcc-3.0.4/libjava/THANKS Wed Jun 13 17:44:55 2001 --- gcc-3.1/libjava/THANKS Fri Mar 15 22:34:40 2002 *************** Godmar Back for his improvements and enc *** 8,18 **** Scott Bambrough for help porting the compiler. Jon Beniston for his Win32 port. Geoff Berry for his object serialization work and various patches. Hans-J. Boehm for his garbage collector, IA-64 libffi port, and other work. Per Bothner for dreaming up, designing and implementing much of gcj. Joerg Brunsmann for compiler hacking and help with the FAQ. - Glenn Chambers for help with the FAQ. Steve Chamberlain for config fixes and the picoJava port. John-Marc Chandonia for various library patches. Eric Christopher for his porting help and clean-ups. The GNU Classpath project for all of their merged runtime code. --- 8,19 ---- Scott Bambrough for help porting the compiler. Jon Beniston for his Win32 port. Geoff Berry for his object serialization work and various patches. + Eric Blake for helping to make gcj and libgcj conform to the specifications. Hans-J. Boehm for his garbage collector, IA-64 libffi port, and other work. Per Bothner for dreaming up, designing and implementing much of gcj. Joerg Brunsmann for compiler hacking and help with the FAQ. Steve Chamberlain for config fixes and the picoJava port. + Glenn Chambers for help with the FAQ. John-Marc Chandonia for various library patches. Eric Christopher for his porting help and clean-ups. The GNU Classpath project for all of their merged runtime code. *************** Anthony Green for various contributions. *** 24,38 **** Stu Grossman for gdb hacking, allowing us to debug our code. Andrew Haley for his amazing compiler and library efforts. Jakub Jelinek for improving the build system. Oskar Liljeblad for hacking on AWT and his many bug reports and patches. Bryce McKinlay for numerous gcj and libgcj fixes and improvements. Jason Molenda for establishing the project infrastructure on sources.redhat.com. Mike Moreton for his various patches. Alexandre Oliva for all of this porting and testing efforts. - Kresten Krab Thorup for his fantastic bytecode interpreter. - Warren Levy for his tremendous library work. - All of the Mauve project contributors, for test code. Rainer Orth for configuration clean-ups and porting help. Alexandre Petit-Bianco for implementing much of the compiler, and continued maintainership. --- 25,39 ---- Stu Grossman for gdb hacking, allowing us to debug our code. Andrew Haley for his amazing compiler and library efforts. Jakub Jelinek for improving the build system. + Warren Levy for his tremendous library work. Oskar Liljeblad for hacking on AWT and his many bug reports and patches. + All of the Mauve project contributors, for test code. Bryce McKinlay for numerous gcj and libgcj fixes and improvements. + Adam Megacz for his work on the Win32 port. Jason Molenda for establishing the project infrastructure on sources.redhat.com. Mike Moreton for his various patches. Alexandre Oliva for all of this porting and testing efforts. Rainer Orth for configuration clean-ups and porting help. Alexandre Petit-Bianco for implementing much of the compiler, and continued maintainership. *************** Bradley Schatz for his work on the FAQ. *** 41,51 **** --- 42,56 ---- Jason Schroeder for jcf-dump patches. John Stracke for his HTTP protocol fixes. Jeff Sturm for porting help, bug fixes, and encouragement. + Kresten Krab Thorup for his fantastic bytecode interpreter. + Andreas Tobler for his work porting libgcj to Darwin. Tom Tromey for his many contributions and libgcj maintainership. Matt Welsh for help with Linux Threads. Urban Widmark for help fixing java.io. + Mark Wielaard for new library code and his work integrating with Classpath. Gilles Zunino for help porting to Irix. + We'd also like to thank the folks who have contributed time and energy in testing GCJ: *************** Charles-Antoine Gauthier *** 69,79 **** Simon Gornall Fred Gray John Griffin Phil Hargett Bryan W. Headley Kevin B. Hendricks - Patrik Hagglund - Amancio Hasty Joep Jansen David Kidd Tobias Kuipers --- 74,84 ---- Simon Gornall Fred Gray John Griffin + Patrik Hagglund Phil Hargett + Amancio Hasty Bryan W. Headley Kevin B. Hendricks Joep Jansen David Kidd Tobias Kuipers *************** Tim Souder *** 96,102 **** Adam Sulmicki Frederik Warg Gregory Warnes - Mark Wielaard David E. Young Thank you all! --- 101,106 ---- diff -Nrc3pad gcc-3.0.4/libjava/acconfig.h gcc-3.1/libjava/acconfig.h *** gcc-3.0.4/libjava/acconfig.h Wed Aug 1 17:49:13 2001 --- gcc-3.1/libjava/acconfig.h Mon Mar 18 06:30:23 2002 *************** *** 92,97 **** --- 92,101 ---- /* Define to version of GCJ in use. */ #undef GCJVERSION + /* Define if if the synchronization code should try to avoid pthread_self + calls by caching thread IDs in a hashtable. */ + #undef SLOW_PTHREAD_SELF + /* Define if you have the appropriate function. */ #undef HAVE_ACCESS #undef HAVE_STAT *************** *** 116,125 **** --- 120,135 ---- /* Define if java.net native functions should be stubbed out. */ #undef DISABLE_JAVA_NET + /* Define if we're to use libffi. */ + #undef USE_LIBFFI + /* Define if system properties shouldn't be read from getenv("GCJ_PROPERTIES"). */ #undef DISABLE_GETENV_PROPERTIES + /* Define if we should ignore arguments to main(). */ + #undef DISABLE_MAIN_ARGS + /* Define if using setjmp/longjmp exceptions. */ #undef SJLJ_EXCEPTIONS *************** *** 129,134 **** --- 139,147 ---- /* Define if you have dladdr() */ #undef HAVE_DLADDR + /* Define if tzname is missing. */ + #undef NO_TZNAME + /* Define if getuid() and friends are missing. */ #undef NO_GETUID diff -Nrc3pad gcc-3.0.4/libjava/acinclude.m4 gcc-3.1/libjava/acinclude.m4 *** gcc-3.0.4/libjava/acinclude.m4 Wed Jul 18 16:56:32 2001 --- gcc-3.1/libjava/acinclude.m4 Wed Feb 27 02:22:33 2002 *************** *** 1,3 **** --- 1,29 ---- + AC_DEFUN([AC_COMPILE_CHECK_SIZEOF], + [changequote(<<, >>)dnl + dnl The name to #define. + define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl + dnl The cache variable name. + define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl + changequote([, ])dnl + AC_MSG_CHECKING(size of $1) + AC_CACHE_VAL(AC_CV_NAME, + [for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence. + AC_TRY_COMPILE([#include "confdefs.h" + #include + $2 + ], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) + if test x$AC_CV_NAME != x ; then break; fi + done + ]) + if test x$AC_CV_NAME = x ; then + AC_MSG_ERROR([cannot determine a size for $1]) + fi + AC_MSG_RESULT($AC_CV_NAME) + AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) + undefine([AC_TYPE_NAME])dnl + undefine([AC_CV_NAME])dnl + ]) + AC_DEFUN(LIBGCJ_CONFIGURE, [ dnl Default to --enable-multilib *************** AC_ARG_ENABLE(multilib, *** 9,15 **** *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;; esac], [multilib=yes])dnl ! dnl We may get other options which we dont document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir # When building with srcdir == objdir, links to the source files will --- 35,41 ---- *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;; esac], [multilib=yes])dnl ! dnl We may get other options which we don't document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir # When building with srcdir == objdir, links to the source files will *************** define([AC_PROG_CC_WORKS],[]) *** 54,67 **** define([AC_PROG_CXX_WORKS],[]) AC_PROG_CC ! AC_PROG_CXX dnl version is pulled out to make it a bit easier to change using sed. version=0.0.7 dnl Still use "libjava" here to placate dejagnu. AM_INIT_AUTOMAKE(libjava, $version) ! # AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we dont # run it explicitly here, it will be run implicitly before # LIBGCJ_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. --- 80,136 ---- define([AC_PROG_CXX_WORKS],[]) AC_PROG_CC ! ! # We use the libstdc++-v3 version of LIB_AC_PROG_CXX, but use ! # glibjava_CXX instead of glibcpp_CXX. That's because we're passed a ! # different definition of CXX than other directories, since we don't ! # depend on libstdc++-v3 having already been built. ! AC_DEFUN(LIB_AC_PROG_CXX, ! [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl ! dnl Fool anybody using AC_PROG_CXX. ! AC_PROVIDE([AC_PROG_CXX]) ! # Use glibjava_CXX so that we do not cause CXX to be cached with the ! # flags that come in CXX while configuring libjava. They're different ! # from those used for all other target libraries. If CXX is set in ! # the environment, respect that here. ! glibjava_CXX=$CXX ! AC_CHECK_PROGS(glibjava_CXX, $CCC c++ g++ gcc CC cxx cc++, gcc) ! AC_SUBST(CXX) ! CXX=$glibjava_CXX ! test -z "$glibjava_CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH]) ! ! AC_PROG_CXX_GNU ! ! if test $ac_cv_prog_gxx = yes; then ! GXX=yes ! dnl Check whether -g works, even if CXXFLAGS is set, in case the package ! dnl plays around with CXXFLAGS (such as to build both debugging and ! dnl normal versions of a library), tasteless as that idea is. ! ac_test_CXXFLAGS="${CXXFLAGS+set}" ! ac_save_CXXFLAGS="$CXXFLAGS" ! CXXFLAGS= ! AC_PROG_CXX_G ! if test "$ac_test_CXXFLAGS" = set; then ! CXXFLAGS="$ac_save_CXXFLAGS" ! elif test $ac_cv_prog_cxx_g = yes; then ! CXXFLAGS="-g -O2" ! else ! CXXFLAGS="-O2" ! fi ! else ! GXX= ! test "${CXXFLAGS+set}" = set || CXXFLAGS="-g" ! fi ! ]) ! ! LIB_AC_PROG_CXX dnl version is pulled out to make it a bit easier to change using sed. version=0.0.7 dnl Still use "libjava" here to placate dejagnu. AM_INIT_AUTOMAKE(libjava, $version) ! # AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't # run it explicitly here, it will be run implicitly before # LIBGCJ_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. *************** AM_MAINTAINER_MODE *** 80,88 **** # need to use $(EXEEXT). Moreover, the test for EXEEXT normally # fails, because we are probably configuring with a cross compiler # which cant create executables. So we include AC_EXEEXT to keep ! # automake happy, but we dont execute it, since we dont care about # the result. if false; then AC_EXEEXT fi --- 149,161 ---- # need to use $(EXEEXT). Moreover, the test for EXEEXT normally # fails, because we are probably configuring with a cross compiler # which cant create executables. So we include AC_EXEEXT to keep ! # automake happy, but we don't execute it, since we don't care about # the result. if false; then + # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands + # to nothing, so nothing would remain between `then' and `fi' if it + # were not for the `:' below. + : AC_EXEEXT fi *************** AC_DEFUN([AM_ICONV], *** 127,144 **** dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). ! ICONV_LDFLAGS= AC_ARG_WITH([libiconv-prefix], [ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib], [ for dir in `echo "$withval" | tr : ' '`; do if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi ! if test -d $dir/lib; then ! LDFLAGS="$LDFLAGS -L$dir/lib" ! ICONV_LDFLAGS=-L$dir/lib ! fi done ]) - AC_SUBST(ICONV_LDFLAGS) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" --- 200,213 ---- dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). ! am_cv_lib_iconv_ldpath= AC_ARG_WITH([libiconv-prefix], [ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib], [ for dir in `echo "$withval" | tr : ' '`; do if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi ! if test -d $dir/lib; then am_cv_lib_iconv_ldpath="-L$dir/lib"; fi done ]) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" *************** AC_DEFUN([AM_ICONV], *** 151,157 **** am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" ! LIBS="$LIBS -liconv" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); --- 220,226 ---- am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" ! LIBS="$LIBS $am_cv_libiconv_ldpath -liconv" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); *************** size_t iconv(); *** 188,194 **** fi LIBICONV= if test "$am_cv_lib_iconv" = yes; then ! LIBICONV="-liconv" fi AC_SUBST(LIBICONV) ]) --- 257,288 ---- fi LIBICONV= if test "$am_cv_lib_iconv" = yes; then ! LIBICONV="$am_cv_lib_iconv_ldpath -liconv" fi AC_SUBST(LIBICONV) ]) + + # Check whether LC_MESSAGES is available in . + # Ulrich Drepper , 1995. + # + # This file can be copied and used freely without restrictions. It can + # be used in projects which are not available under the GNU General Public + # License or the GNU Library General Public License but which still want + # to provide support for the GNU gettext functionality. + # Please note that the actual code of the GNU gettext library is covered + # by the GNU Library General Public License, and the rest of the GNU + # gettext package package is covered by the GNU General Public License. + # They are *not* in the public domain. + + # serial 2 + + AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) diff -Nrc3pad gcc-3.0.4/libjava/aclocal.m4 gcc-3.1/libjava/aclocal.m4 *** gcc-3.0.4/libjava/aclocal.m4 Wed Feb 20 19:40:48 2002 --- gcc-3.1/libjava/aclocal.m4 Wed May 15 02:40:18 2002 *************** dnl but WITHOUT ANY WARRANTY, to the ext *** 10,15 **** --- 10,41 ---- dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A dnl PARTICULAR PURPOSE. + AC_DEFUN([AC_COMPILE_CHECK_SIZEOF], + [changequote(<<, >>)dnl + dnl The name to #define. + define(<>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl + dnl The cache variable name. + define(<>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl + changequote([, ])dnl + AC_MSG_CHECKING(size of $1) + AC_CACHE_VAL(AC_CV_NAME, + [for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence. + AC_TRY_COMPILE([#include "confdefs.h" + #include + $2 + ], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) + if test x$AC_CV_NAME != x ; then break; fi + done + ]) + if test x$AC_CV_NAME = x ; then + AC_MSG_ERROR([cannot determine a size for $1]) + fi + AC_MSG_RESULT($AC_CV_NAME) + AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) + undefine([AC_TYPE_NAME])dnl + undefine([AC_CV_NAME])dnl + ]) + AC_DEFUN(LIBGCJ_CONFIGURE, [ dnl Default to --enable-multilib *************** AC_ARG_ENABLE(multilib, *** 21,27 **** *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;; esac], [multilib=yes])dnl ! dnl We may get other options which we dont document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir # When building with srcdir == objdir, links to the source files will --- 47,53 ---- *) AC_MSG_ERROR(bad value ${enableval} for multilib option) ;; esac], [multilib=yes])dnl ! dnl We may get other options which we don't document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir # When building with srcdir == objdir, links to the source files will *************** define([AC_PROG_CC_WORKS],[]) *** 66,79 **** define([AC_PROG_CXX_WORKS],[]) AC_PROG_CC ! AC_PROG_CXX dnl version is pulled out to make it a bit easier to change using sed. version=0.0.7 dnl Still use "libjava" here to placate dejagnu. AM_INIT_AUTOMAKE(libjava, $version) ! # AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we dont # run it explicitly here, it will be run implicitly before # LIBGCJ_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. --- 92,148 ---- define([AC_PROG_CXX_WORKS],[]) AC_PROG_CC ! ! # We use the libstdc++-v3 version of LIB_AC_PROG_CXX, but use ! # glibjava_CXX instead of glibcpp_CXX. That's because we're passed a ! # different definition of CXX than other directories, since we don't ! # depend on libstdc++-v3 having already been built. ! AC_DEFUN(LIB_AC_PROG_CXX, ! [AC_BEFORE([$0], [AC_PROG_CXXCPP])dnl ! dnl Fool anybody using AC_PROG_CXX. ! AC_PROVIDE([AC_PROG_CXX]) ! # Use glibjava_CXX so that we do not cause CXX to be cached with the ! # flags that come in CXX while configuring libjava. They're different ! # from those used for all other target libraries. If CXX is set in ! # the environment, respect that here. ! glibjava_CXX=$CXX ! AC_CHECK_PROGS(glibjava_CXX, $CCC c++ g++ gcc CC cxx cc++, gcc) ! AC_SUBST(CXX) ! CXX=$glibjava_CXX ! test -z "$glibjava_CXX" && AC_MSG_ERROR([no acceptable c++ found in \$PATH]) ! ! AC_PROG_CXX_GNU ! ! if test $ac_cv_prog_gxx = yes; then ! GXX=yes ! dnl Check whether -g works, even if CXXFLAGS is set, in case the package ! dnl plays around with CXXFLAGS (such as to build both debugging and ! dnl normal versions of a library), tasteless as that idea is. ! ac_test_CXXFLAGS="${CXXFLAGS+set}" ! ac_save_CXXFLAGS="$CXXFLAGS" ! CXXFLAGS= ! AC_PROG_CXX_G ! if test "$ac_test_CXXFLAGS" = set; then ! CXXFLAGS="$ac_save_CXXFLAGS" ! elif test $ac_cv_prog_cxx_g = yes; then ! CXXFLAGS="-g -O2" ! else ! CXXFLAGS="-O2" ! fi ! else ! GXX= ! test "${CXXFLAGS+set}" = set || CXXFLAGS="-g" ! fi ! ]) ! ! LIB_AC_PROG_CXX dnl version is pulled out to make it a bit easier to change using sed. version=0.0.7 dnl Still use "libjava" here to placate dejagnu. AM_INIT_AUTOMAKE(libjava, $version) ! # AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't # run it explicitly here, it will be run implicitly before # LIBGCJ_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. *************** AM_MAINTAINER_MODE *** 92,100 **** # need to use $(EXEEXT). Moreover, the test for EXEEXT normally # fails, because we are probably configuring with a cross compiler # which cant create executables. So we include AC_EXEEXT to keep ! # automake happy, but we dont execute it, since we dont care about # the result. if false; then AC_EXEEXT fi --- 161,173 ---- # need to use $(EXEEXT). Moreover, the test for EXEEXT normally # fails, because we are probably configuring with a cross compiler # which cant create executables. So we include AC_EXEEXT to keep ! # automake happy, but we don't execute it, since we don't care about # the result. if false; then + # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands + # to nothing, so nothing would remain between `then' and `fi' if it + # were not for the `:' below. + : AC_EXEEXT fi *************** AC_DEFUN([AM_ICONV], *** 139,156 **** dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). ! ICONV_LDFLAGS= AC_ARG_WITH([libiconv-prefix], [ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib], [ for dir in `echo "$withval" | tr : ' '`; do if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi ! if test -d $dir/lib; then ! LDFLAGS="$LDFLAGS -L$dir/lib" ! ICONV_LDFLAGS=-L$dir/lib ! fi done ]) - AC_SUBST(ICONV_LDFLAGS) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" --- 212,225 ---- dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). ! am_cv_lib_iconv_ldpath= AC_ARG_WITH([libiconv-prefix], [ --with-libiconv-prefix=DIR search for libiconv in DIR/include and DIR/lib], [ for dir in `echo "$withval" | tr : ' '`; do if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi ! if test -d $dir/lib; then am_cv_lib_iconv_ldpath="-L$dir/lib"; fi done ]) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" *************** AC_DEFUN([AM_ICONV], *** 163,169 **** am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" ! LIBS="$LIBS -liconv" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); --- 232,238 ---- am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" ! LIBS="$LIBS $am_cv_libiconv_ldpath -liconv" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); *************** size_t iconv(); *** 200,210 **** fi LIBICONV= if test "$am_cv_lib_iconv" = yes; then ! LIBICONV="-liconv" fi AC_SUBST(LIBICONV) ]) # Do all the work for Automake. This macro actually does too much -- # some checks are only needed if your package does certain things. # But this isn't really a big deal. --- 269,304 ---- fi LIBICONV= if test "$am_cv_lib_iconv" = yes; then ! LIBICONV="$am_cv_lib_iconv_ldpath -liconv" fi AC_SUBST(LIBICONV) ]) + # Check whether LC_MESSAGES is available in . + # Ulrich Drepper , 1995. + # + # This file can be copied and used freely without restrictions. It can + # be used in projects which are not available under the GNU General Public + # License or the GNU Library General Public License but which still want + # to provide support for the GNU gettext functionality. + # Please note that the actual code of the GNU gettext library is covered + # by the GNU Library General Public License, and the rest of the GNU + # gettext package package is covered by the GNU General Public License. + # They are *not* in the public domain. + + # serial 2 + + AC_DEFUN([AM_LC_MESSAGES], + [if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) + # Do all the work for Automake. This macro actually does too much -- # some checks are only needed if your package does certain things. # But this isn't really a big deal. diff -Nrc3pad gcc-3.0.4/libjava/boehm.cc gcc-3.1/libjava/boehm.cc *** gcc-3.0.4/libjava/boehm.cc Mon Jan 8 23:28:55 2001 --- gcc-3.1/libjava/boehm.cc Tue Feb 12 04:14:52 2002 *************** *** 1,6 **** // boehm.cc - interface between libjava and Boehm GC. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // boehm.cc - interface between libjava and Boehm GC. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 26,66 **** extern "C" { ! #include ! #include ! #include // These aren't declared in any Boehm GC header. void GC_finalize_all (void); ptr_t GC_debug_generic_malloc (size_t size, int k, GC_EXTRA_PARAMS); }; - // FIXME: this should probably be defined in some GC header. - #ifdef GC_DEBUG - # define GC_GENERIC_MALLOC(Size, Type) \ - GC_debug_generic_malloc (Size, Type, GC_EXTRAS) - #else - # define GC_GENERIC_MALLOC(Size, Type) GC_generic_malloc (Size, Type) - #endif - // We must check for plausibility ourselves. #define MAYBE_MARK(Obj, Top, Limit, Source, Exit) \ ! if ((ptr_t) (Obj) >= GC_least_plausible_heap_addr \ ! && (ptr_t) (Obj) <= GC_greatest_plausible_heap_addr) \ ! PUSH_CONTENTS (Obj, Top, Limit, Source, Exit) ! ! ! ! // Nonzero if this module has been initialized. ! static int initialized = 0; ! ! #if 0 ! // `kind' index used when allocating Java objects. ! static int obj_kind_x; ! ! // Freelist used for Java objects. ! static ptr_t *obj_free_list; ! #endif /* 0 */ // `kind' index used when allocating Java arrays. static int array_kind_x; --- 26,47 ---- extern "C" { ! #include ! #include ! ! #ifdef THREAD_LOCAL_ALLOC ! # define GC_REDIRECT_TO_LOCAL ! # include ! #endif // These aren't declared in any Boehm GC header. void GC_finalize_all (void); ptr_t GC_debug_generic_malloc (size_t size, int k, GC_EXTRA_PARAMS); }; // We must check for plausibility ourselves. #define MAYBE_MARK(Obj, Top, Limit, Source, Exit) \ ! Top=GC_MARK_AND_PUSH((GC_PTR)Obj, Top, Limit, (GC_PTR *)Source) // `kind' index used when allocating Java arrays. static int array_kind_x; *************** _Jv_MarkObj (void *addr, void *msp, void *** 97,106 **** if (__builtin_expect (! dt || !(dt -> get_finalizer()), false)) return mark_stack_ptr; jclass klass = dt->clas; ! // Every object has a sync_info pointer. ! ptr_t p = (ptr_t) obj->sync_info; ! MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o1label); // Mark the object's class. p = (ptr_t) klass; MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o2label); --- 78,90 ---- if (__builtin_expect (! dt || !(dt -> get_finalizer()), false)) return mark_stack_ptr; jclass klass = dt->clas; + ptr_t p; ! # ifndef JV_HASH_SYNCHRONIZATION ! // Every object has a sync_info pointer. ! p = (ptr_t) obj->sync_info; ! MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o1label); ! # endif // Mark the object's class. p = (ptr_t) klass; MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o2label); *************** _Jv_MarkArray (void *addr, void *msp, vo *** 300,312 **** if (__builtin_expect (! dt || !(dt -> get_finalizer()), false)) return mark_stack_ptr; jclass klass = dt->clas; ! // Every object has a sync_info pointer. ! ptr_t p = (ptr_t) array->sync_info; ! MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, array, e1label); // Mark the object's class. p = (ptr_t) klass; ! MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, obj, o2label); for (int i = 0; i < JvGetArrayLength (array); ++i) { --- 284,299 ---- if (__builtin_expect (! dt || !(dt -> get_finalizer()), false)) return mark_stack_ptr; jclass klass = dt->clas; + ptr_t p; ! # ifndef JV_HASH_SYNCHRONIZATION ! // Every object has a sync_info pointer. ! p = (ptr_t) array->sync_info; ! MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, array, e1label); ! # endif // Mark the object's class. p = (ptr_t) klass; ! MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, &(dt -> clas), o2label); for (int i = 0; i < JvGetArrayLength (array); ++i) { *************** _Jv_MarkArray (void *addr, void *msp, vo *** 318,343 **** return mark_stack_ptr; } ! // Return GC descriptor for interpreted class ! #ifdef INTERPRETER ! // We assume that the gcj mark proc has index 0. This is a dubious assumption, // since another one could be registered first. But the compiler also // knows this, so in that case everything else will break, too. ! #define GCJ_DEFAULT_DESCR MAKE_PROC(GCJ_RESERVED_MARK_PROC_INDEX,0) void * ! _Jv_BuildGCDescr(jclass klass) { /* FIXME: We should really look at the class and build the descriptor. */ return (void *)(GCJ_DEFAULT_DESCR); } - #endif ! // Allocate space for a new Java object. void * ! _Jv_AllocObj (jsize size, jclass klass) { ! return GC_GCJ_MALLOC (size, klass->vtable); } // Allocate space for a new Java array. --- 305,334 ---- return mark_stack_ptr; } ! // Generate a GC marking descriptor for a class. ! // // We assume that the gcj mark proc has index 0. This is a dubious assumption, // since another one could be registered first. But the compiler also // knows this, so in that case everything else will break, too. ! #define GCJ_DEFAULT_DESCR GC_MAKE_PROC(GC_GCJ_RESERVED_MARK_PROC_INDEX,0) void * ! _Jv_BuildGCDescr(jclass) { /* FIXME: We should really look at the class and build the descriptor. */ return (void *)(GCJ_DEFAULT_DESCR); } ! // Allocate some space that is known to be pointer-free. void * ! _Jv_AllocBytes (jsize size) { ! void *r = GC_MALLOC_ATOMIC (size); ! // We have to explicitly zero memory here, as the GC doesn't ! // guarantee that PTRFREE allocations are zeroed. Note that we ! // don't have to do this for other allocation types because we set ! // the `ok_init' flag in the type descriptor. ! memset (r, 0, size); ! return r; } // Allocate space for a new Java array. *************** _Jv_AllocArray (jsize size, jclass klass *** 362,385 **** if (size < min_heap_addr) obj = GC_MALLOC(size); else ! obj = GC_GENERIC_MALLOC (size, array_kind_x); #endif *((_Jv_VTable **) obj) = klass->vtable; return obj; } ! // Allocate some space that is known to be pointer-free. void * ! _Jv_AllocBytes (jsize size) { ! void *r = GC_MALLOC_ATOMIC (size); ! // We have to explicitly zero memory here, as the GC doesn't ! // guarantee that PTRFREE allocations are zeroed. Note that we ! // don't have to do this for other allocation types because we set ! // the `ok_init' flag in the type descriptor. ! if (__builtin_expect (r != NULL, !NULL)) ! memset (r, 0, size); ! return r; } static void --- 353,370 ---- if (size < min_heap_addr) obj = GC_MALLOC(size); else ! obj = GC_generic_malloc (size, array_kind_x); #endif *((_Jv_VTable **) obj) = klass->vtable; return obj; } ! /* Allocate space for a new non-Java object, which does not have the usual ! Java object header but may contain pointers to other GC'ed objects. */ void * ! _Jv_AllocRawObj (jsize size) { ! return (void *) GC_MALLOC (size); } static void *************** _Jv_EnableGC (void) *** 462,490 **** _Jv_MutexUnlock (&disable_gc_mutex); } void _Jv_InitGC (void) { int proc; - DCL_LOCK_STATE; ! DISABLE_SIGNALS (); ! LOCK (); ! ! if (initialized) ! { ! UNLOCK (); ! ENABLE_SIGNALS (); ! return; ! } ! initialized = 1; ! UNLOCK (); // Configure the collector to use the bitmap marking descriptors that we // stash in the class vtable. GC_init_gcj_malloc (0, (void *) _Jv_MarkObj); ! LOCK (); GC_java_finalization = 1; // We use a different mark procedure for object arrays. This code --- 447,473 ---- _Jv_MutexUnlock (&disable_gc_mutex); } + static void * handle_out_of_memory(size_t) + { + _Jv_ThrowNoMemory(); + } + void _Jv_InitGC (void) { int proc; ! // Ignore pointers that do not point to the start of an object. ! GC_all_interior_pointers = 0; // Configure the collector to use the bitmap marking descriptors that we // stash in the class vtable. GC_init_gcj_malloc (0, (void *) _Jv_MarkObj); ! // Cause an out of memory error to be thrown from the allocators, ! // instead of returning 0. This is cheaper than checking on allocation. ! GC_oom_fn = handle_out_of_memory; ! GC_java_finalization = 1; // We use a different mark procedure for object arrays. This code *************** _Jv_InitGC (void) *** 496,572 **** memset (array_free_list, 0, (MAXOBJSZ + 1) * sizeof (ptr_t)); proc = GC_n_mark_procs++; ! GC_mark_procs[proc] = (mark_proc) _Jv_MarkArray; array_kind_x = GC_n_kinds++; GC_obj_kinds[array_kind_x].ok_freelist = array_free_list; GC_obj_kinds[array_kind_x].ok_reclaim_list = 0; ! GC_obj_kinds[array_kind_x].ok_descriptor = MAKE_PROC (proc, 0); GC_obj_kinds[array_kind_x].ok_relocate_descr = FALSE; GC_obj_kinds[array_kind_x].ok_init = TRUE; _Jv_MutexInit (&disable_gc_mutex); - - UNLOCK (); - ENABLE_SIGNALS (); } ! #if 0 ! void ! _Jv_InitGC (void) ! { ! int proc; ! DCL_LOCK_STATE; ! ! DISABLE_SIGNALS (); ! LOCK (); ! ! if (initialized) ! { ! UNLOCK (); ! ENABLE_SIGNALS (); ! return; ! } ! initialized = 1; ! GC_java_finalization = 1; ! // Set up state for marking and allocation of Java objects. ! obj_free_list = (ptr_t *) GC_generic_malloc_inner ((MAXOBJSZ + 1) ! * sizeof (ptr_t), ! PTRFREE); ! memset (obj_free_list, 0, (MAXOBJSZ + 1) * sizeof (ptr_t)); ! proc = GC_n_mark_procs++; ! GC_mark_procs[proc] = (mark_proc) _Jv_MarkObj; ! obj_kind_x = GC_n_kinds++; ! GC_obj_kinds[obj_kind_x].ok_freelist = obj_free_list; ! GC_obj_kinds[obj_kind_x].ok_reclaim_list = 0; ! GC_obj_kinds[obj_kind_x].ok_descriptor = MAKE_PROC (proc, 0); ! GC_obj_kinds[obj_kind_x].ok_relocate_descr = FALSE; ! GC_obj_kinds[obj_kind_x].ok_init = TRUE; ! // Set up state for marking and allocation of arrays of Java ! // objects. ! array_free_list = (ptr_t *) GC_generic_malloc_inner ((MAXOBJSZ + 1) ! * sizeof (ptr_t), ! PTRFREE); ! memset (array_free_list, 0, (MAXOBJSZ + 1) * sizeof (ptr_t)); ! proc = GC_n_mark_procs++; ! GC_mark_procs[proc] = (mark_proc) _Jv_MarkArray; ! array_kind_x = GC_n_kinds++; ! GC_obj_kinds[array_kind_x].ok_freelist = array_free_list; ! GC_obj_kinds[array_kind_x].ok_reclaim_list = 0; ! GC_obj_kinds[array_kind_x].ok_descriptor = MAKE_PROC (proc, 0); ! GC_obj_kinds[array_kind_x].ok_relocate_descr = FALSE; ! GC_obj_kinds[array_kind_x].ok_init = TRUE; ! _Jv_MutexInit (&disable_gc_mutex); ! UNLOCK (); ! ENABLE_SIGNALS (); } - #endif /* 0 */ --- 479,552 ---- memset (array_free_list, 0, (MAXOBJSZ + 1) * sizeof (ptr_t)); proc = GC_n_mark_procs++; ! GC_mark_procs[proc] = (GC_mark_proc) _Jv_MarkArray; array_kind_x = GC_n_kinds++; GC_obj_kinds[array_kind_x].ok_freelist = array_free_list; GC_obj_kinds[array_kind_x].ok_reclaim_list = 0; ! GC_obj_kinds[array_kind_x].ok_descriptor = GC_MAKE_PROC (proc, 0); GC_obj_kinds[array_kind_x].ok_relocate_descr = FALSE; GC_obj_kinds[array_kind_x].ok_init = TRUE; _Jv_MutexInit (&disable_gc_mutex); } ! #ifdef JV_HASH_SYNCHRONIZATION ! // Allocate an object with a fake vtable pointer, which causes only ! // the first field (beyond the fake vtable pointer) to be traced. ! // Eventually this should probably be generalized. ! static _Jv_VTable trace_one_vtable = { ! 0, // class pointer ! (void *)(2 * sizeof(void *)), ! // descriptor; scan 2 words incl. vtable ptr. ! // Least significant bits must be zero to ! // identify this as a length descriptor ! {0} // First method ! }; ! void * ! _Jv_AllocTraceOne (jsize size /* includes vtable slot */) ! { ! return GC_GCJ_MALLOC (size, &trace_one_vtable); ! } ! // Ditto for two words. ! // the first field (beyond the fake vtable pointer) to be traced. ! // Eventually this should probably be generalized. ! static _Jv_VTable trace_two_vtable = ! { ! 0, // class pointer ! (void *)(3 * sizeof(void *)), ! // descriptor; scan 3 words incl. vtable ptr. ! {0} // First method ! }; ! void * ! _Jv_AllocTraceTwo (jsize size /* includes vtable slot */) ! { ! return GC_GCJ_MALLOC (size, &trace_two_vtable); ! } ! #endif /* JV_HASH_SYNCHRONIZATION */ ! void ! _Jv_GCInitializeFinalizers (void (*notifier) (void)) ! { ! GC_finalize_on_demand = 1; ! GC_finalizer_notifier = notifier; ! } ! void ! _Jv_GCRegisterDisappearingLink (jobject *objp) ! { ! GC_general_register_disappearing_link ((GC_PTR *) objp, (GC_PTR) *objp); ! } ! jboolean ! _Jv_GCCanReclaimSoftReference (jobject) ! { ! // For now, always reclaim soft references. FIXME. ! return true; } diff -Nrc3pad gcc-3.0.4/libjava/chartables.pl gcc-3.1/libjava/chartables.pl *** gcc-3.0.4/libjava/chartables.pl Wed Jan 19 18:39:23 2000 --- gcc-3.1/libjava/chartables.pl Thu Jan 1 00:00:00 1970 *************** *** 1,965 **** - # chartables.pl - A perl program to generate tables for use by the - # Character class. - - # Copyright (C) 1998, 1999 Red Hat, Inc. - # - # This file is part of libjava. - # - # This software is copyrighted work licensed under the terms of the - # Libjava License. Please consult the file "LIBJAVA_LICENSE" for - # details. - - # This program requires a `unidata.txt' file of the form distributed - # on the Unicode 2.0 CD ROM. Or, get it more conveniently here: - # ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData-Latest.txt - # Version `2.1.8' of this file was last used to update the Character class. - - # Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - # "The Java Language Specification", ISBN 0-201-63451-1 - # plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - - # Usage: perl chartables.pl [-n] UnicodeData-VERSION.txt - # If this exits with nonzero status, then you must investigate the - # cause of the problem. - # Diagnostics and other information to stderr. - # This creates the new include/java-chartables.h and - # include/java-chardecomp.h files directly. - # With -n, the files are not created, but all processing - # still occurs. - - # Fields in the table. - $CODE = 0; - $NAME = 1; - $CATEGORY = 2; - $DECOMPOSITION = 5; - $DECIMAL = 6; - $DIGIT = 7; - $NUMERIC = 8; - $UPPERCASE = 12; - $LOWERCASE = 13; - $TITLECASE = 14; - - # A special case. - $TAMIL_DIGIT_ONE = 0x0be7; - $TAMIL_DIGIT_NINE = 0x0bef; - - # These are endpoints of legitimate gaps in the tables. - $CJK_IDEOGRAPH_END = 0x9fa5; - $HANGUL_END = 0xd7a3; - $HIGH_SURROGATE_END = 0xdb7f; - $PRIVATE_HIGH_SURROGATE_END = 0xdbff; - $LOW_SURROGATE_END = 0xdfff; - $PRIVATE_END = 0xf8ff; - - %title_to_upper = (); - %title_to_lower = (); - %numerics = (); - %name = (); - - @digit_start = (); - @digit_end = (); - - @space_start = (); - @space_end = (); - - # @letter_start = (); - # @letter_end = (); - - @all_start = (); - @all_end = (); - @all_cats = (); - - @upper_start = (); - @upper_end = (); - @upper_map = (); - %upper_anom = (); - - @lower_start = (); - @lower_end = (); - @lower_map = (); - %lower_anom = (); - - @attributes = (); - - # There are a few characters which actually need two attributes. - # These are special-cased. - $ROMAN_START = 0x2160; - $ROMAN_END = 0x217f; - %second_attributes = (); - - $prevcode = -1; - $status = 0; - - %category_map = - ( - 'Mn' => 'NON_SPACING_MARK', - 'Mc' => 'COMBINING_SPACING_MARK', - 'Me' => 'ENCLOSING_MARK', - 'Nd' => 'DECIMAL_DIGIT_NUMBER', - 'Nl' => 'LETTER_NUMBER', - 'No' => 'OTHER_NUMBER', - 'Zs' => 'SPACE_SEPARATOR', - 'Zl' => 'LINE_SEPARATOR', - 'Zp' => 'PARAGRAPH_SEPARATOR', - 'Cc' => 'CONTROL', - 'Cf' => 'FORMAT', - 'Cs' => 'SURROGATE', - 'Co' => 'PRIVATE_USE', - 'Cn' => 'UNASSIGNED', - 'Lu' => 'UPPERCASE_LETTER', - 'Ll' => 'LOWERCASE_LETTER', - 'Lt' => 'TITLECASE_LETTER', - 'Lm' => 'MODIFIER_LETTER', - 'Lo' => 'OTHER_LETTER', - 'Pc' => 'CONNECTOR_PUNCTUATION', - 'Pd' => 'DASH_PUNCTUATION', - 'Ps' => 'START_PUNCTUATION', - 'Pe' => 'END_PUNCTUATION', - 'Pi' => 'START_PUNCTUATION', - 'Pf' => 'END_PUNCTUATION', - 'Po' => 'OTHER_PUNCTUATION', - 'Sm' => 'MATH_SYMBOL', - 'Sc' => 'CURRENCY_SYMBOL', - 'Sk' => 'MODIFIER_SYMBOL', - 'So' => 'OTHER_SYMBOL' - ); - - # These maps characters to their decompositions. - %canonical_decomposition = (); - %full_decomposition = (); - - - # Handle `-n' and open output files. - local ($f1, $f2) = ('include/java-chartables.h', - 'include/java-chardecomp.h'); - if ($ARGV[0] eq '-n') - { - shift @ARGV; - $f1 = '/dev/null'; - $f2 = '/dev/null'; - } - - open (CHARTABLE, "> $f1"); - open (DECOMP, "> $f2"); - - # Process the Unicode file. - while (<>) - { - chop; - # Specify a limit for split so that we pick up trailing fields. - # We make the limit larger than we need, to catch the case where - # there are extra fields. - @fields = split (';', $_, 30); - # Convert code to number. - $ncode = hex ($fields[$CODE]); - - if ($#fields != 14) - { - print STDERR ("Entry for \\u", $fields[$CODE], - " has wrong number of fields: ", $#fields, "\n"); - } - - $name{$fields[$CODE]} = $fields[$NAME]; - - # If we've found a gap in the table, fill it in. - if ($ncode != $prevcode + 1) - { - &process_gap (*fields, $prevcode, $ncode); - } - - &process_char (*fields, $ncode); - - $prevcode = $ncode; - } - - if ($prevcode != 0xffff) - { - # Setting of `fields' parameter doesn't matter here. - &process_gap (*fields, $prevcode, 0x10000); - } - - print CHARTABLE "// java-chartables.h - Character tables for java.lang.Character -*- c++ -*-\n\n"; - print CHARTABLE "#ifndef __JAVA_CHARTABLES_H__\n"; - print CHARTABLE "#define __JAVA_CHARTABLES_H__\n\n"; - print CHARTABLE "// These tables are automatically generated by the chartables.pl\n"; - print CHARTABLE "// script. DO NOT EDIT the tables. Instead, fix the script\n"; - print CHARTABLE "// and run it again.\n\n"; - print CHARTABLE "// This file should only be included by natCharacter.cc\n\n"; - - - $bytes = 0; - - # Titlecase mapping tables. - if ($#title_to_lower != $#title_to_upper) - { - # If this fails we need to reimplement toTitleCase. - print STDERR "titlecase mappings have different sizes\n"; - $status = 1; - } - # Also ensure that the tables are entirely parallel. - foreach $key (sort keys %title_to_lower) - { - if (! defined $title_to_upper{$key}) - { - print STDERR "titlecase mappings have different entries\n"; - $status = 1; - } - } - &print_single_map ("title_to_lower_table", %title_to_lower); - &print_single_map ("title_to_upper_table", %title_to_upper); - - print CHARTABLE "#ifdef COMPACT_CHARACTER\n\n"; - - printf CHARTABLE "#define TAMIL_DIGIT_ONE 0x%04x\n\n", $TAMIL_DIGIT_ONE; - - # All numeric values. - &print_numerics; - - # Digits only. - &print_block ("digit_table", *digit_start, *digit_end); - - # Space characters. - &print_block ("space_table", *space_start, *space_end); - - # Letters. We used to generate a separate letter table. But this - # doesn't really seem worthwhile. Simply using `all_table' saves us - # about 800 bytes, and only adds 3 table probes to isLetter. - # &print_block ("letter_table", *letter_start, *letter_end); - - # Case tables. - &print_case_table ("upper", *upper_start, *upper_end, *upper_map, *upper_anom); - &print_case_table ("lower", *lower_start, *lower_end, *lower_map, *lower_anom); - - # Everything else. - &print_all_block (*all_start, *all_end, *all_cats); - - print CHARTABLE "#else /* COMPACT_CHARACTER */\n\n"; - - printf CHARTABLE "#define ROMAN_START 0x%04x\n", $ROMAN_START; - printf CHARTABLE "#define ROMAN_END 0x%04x\n\n", $ROMAN_END; - - &print_fast_tables (*all_start, *all_end, *all_cats, - *attributes, *second_attributes); - - print CHARTABLE "#endif /* COMPACT_CHARACTER */\n\n"; - - print CHARTABLE "#endif /* __JAVA_CHARTABLES_H__ */\n"; - - printf STDERR "Approximately %d bytes of data generated (compact case)\n", - $bytes; - - - # Now generate decomposition tables. - printf DECOMP "// java-chardecomp.h - Decomposition character tables -*- c++ -*-\n\n"; - printf DECOMP "#ifndef __JAVA_CHARDECOMP_H__\n"; - printf DECOMP "#define __JAVA_CHARDECOMP_H__\n\n"; - print DECOMP "// These tables are automatically generated by the chartables.pl\n"; - print DECOMP "// script. DO NOT EDIT the tables. Instead, fix the script\n"; - print DECOMP "// and run it again.\n\n"; - print DECOMP "// This file should only be included by natCollator.cc\n\n"; - - print DECOMP "struct decomp_entry\n{\n"; - print DECOMP " jchar key;\n"; - print DECOMP " const char *value;\n"; - print DECOMP "};\n\n"; - - &write_decompositions; - - printf DECOMP "#endif /* __JAVA_CHARDECOMP_H__ */\n"; - - - close (CHARTABLE); - close (DECOMP); - - exit $status; - - - # Process a gap in the space. - sub process_gap - { - local (*fields, $prevcode, $ncode) = @_; - local (@gap_fields, $i); - - if ($ncode == $CJK_IDEOGRAPH_END - || $ncode == $HANGUL_END - || $ncode == $HIGH_SURROGATE_END - || $ncode == $PRIVATE_HIGH_SURROGATE_END - || $ncode == $LOW_SURROGATE_END - || $ncode == $PRIVATE_END) - { - # The characters in the gap we just found are known to - # have the same properties as the character at the end of - # the gap. - @gap_fields = @fields; - } - else - { - # This prints too much to be enabled. - # print STDERR "Gap found at \\u", $fields[$CODE], "\n"; - @gap_fields = ('', '', 'Cn', '', '', '', '', '', '', '', '', - '', '', '', ''); - } - - for ($i = $prevcode + 1; $i < $ncode; ++$i) - { - $gap_fields[$CODE] = sprintf ("%04x", $i); - $gap_fields[$NAME] = "CHARACTER " . $gap_fields[$CODE]; - &process_char (*gap_fields, $i); - } - } - - # Process a single character. - sub process_char - { - local (*fields, $ncode) = @_; - - if ($fields[$DECOMPOSITION] ne '') - { - &add_decomposition ($ncode, $fields[$DECOMPOSITION]); - } - - # If this is a titlecase character, mark it. - if ($fields[$CATEGORY] eq 'Lt') - { - $title_to_upper{$fields[$CODE]} = $fields[$UPPERCASE]; - $title_to_lower{$fields[$CODE]} = $fields[$LOWERCASE]; - } - else - { - # For upper and lower case mappings, we try to build compact - # tables that map range onto range. We specifically want to - # avoid titlecase characters. Java specifies a range check to - # make sure the character is not between 0x2000 and 0x2fff. - # We avoid that here because we need to generate table entries - # -- toLower and toUpper still work in that range. - if ($fields[$UPPERCASE] eq '' - && ($fields[$LOWERCASE] ne '' - || $fields[$NAME] =~ /CAPITAL (LETTER|LIGATURE)/)) - { - if ($fields[$LOWERCASE] ne '') - { - &update_case_block (*upper_start, *upper_end, *upper_map, - $fields[$CODE], $fields[$LOWERCASE]); - &set_attribute ($ncode, hex ($fields[$LOWERCASE])); - } - else - { - $upper_anom{$fields[$CODE]} = 1; - } - } - elsif ($fields[$LOWERCASE] ne '') - { - print STDERR ("Java missed upper case char \\u", - $fields[$CODE], "\n"); - } - elsif ($fields[$CATEGORY] eq 'Lu') - { - # This case is for letters which are marked as upper case - # but for which there is no lower case equivalent. For - # instance, LATIN LETTER YR. - } - - if ($fields[$LOWERCASE] eq '' - && ($fields[$UPPERCASE] ne '' - || $fields[$NAME] =~ /SMALL (LETTER|LIGATURE)/)) - { - if ($fields[$UPPERCASE] ne '') - { - &update_case_block (*lower_start, *lower_end, *lower_map, - $fields[$CODE], $fields[$UPPERCASE]); - &set_attribute ($ncode, hex ($fields[$UPPERCASE])); - } - else - { - $lower_anom{$fields[$CODE]} = 1; - } - } - elsif ($fields[$UPPERCASE] ne '') - { - print STDERR ("Java missed lower case char \\u", - $fields[$CODE], "\n"); - } - elsif ($fields[$CATEGORY] eq 'Ll') - { - # This case is for letters which are marked as lower case - # but for which there is no upper case equivalent. For - # instance, FEMININE ORDINAL INDICATOR. - } - } - - - # If we have a non-decimal numeric value, add it to the list. - if ($fields[$CATEGORY] eq 'Nd' - && ($ncode < 0x2000 || $ncode > 0x2fff) - && $fields[$NAME] =~ /DIGIT/) - { - # This is a digit character that is handled elsewhere. - } - elsif ($fields[$DIGIT] ne '' || $fields[$NUMERIC] ne '') - { - # Do a simple check. - if ($fields[$DECIMAL] ne '') - { - # This catches bugs in an earlier implementation of - # chartables.pl. Now it is here for historical interest - # only. - # print STDERR ("Character \u", $fields[$CODE], - # " would have been missed as digit\n"); - } - - local ($val) = $fields[$DIGIT]; - $val = $fields[$NUMERIC] if $val eq ''; - local ($ok) = 1; - - # If we have a value which is not a positive integer, then we - # set the value to -2 to make life easier for - # Character.getNumericValue. - if ($val !~ m/^[0-9]+$/) - { - if ($fields[$CATEGORY] ne 'Nl' - && $fields[$CATEGORY] ne 'No') - { - # This shows a few errors in the Unicode table. These - # characters have a missing Numeric field, and the `N' - # for the mirrored field shows up there instead. I - # reported these characters to errata@unicode.org on - # Thu Sep 10 1998. They said it will be fixed in the - # 2.1.6 release of the tables. - print STDERR ("Character \u", $fields[$CODE], - " has value but is not numeric; val = '", - $val, "'\n"); - # We skip these. - $ok = 0; - } - $val = "-2"; - } - - if ($ok) - { - $numerics{$fields[$CODE]} = $val; - &set_attribute ($ncode, $val); - } - } - - # We build a table that lists ranges of ordinary decimal values. - # At each step we make sure that the digits are in the correct - # order, with no holes, as this is assumed by Character. If this - # fails, reimplementation is required. This implementation - # dovetails nicely with the Java Spec, which has strange rules for - # what constitutes a decimal value. In particular the Unicode - # name must contain the word `DIGIT'. The spec doesn't directly - # say that digits must have type `Nd' (or that their value must an - # integer), but that can be inferred from the list of digits in - # the book(s). Currently the only Unicode characters whose name - # includes `DIGIT' which would not fit are the Tibetan "half" - # digits. - if ($fields[$CATEGORY] eq 'Nd') - { - if (($ncode < 0x2000 || $ncode > 0x2fff) - && $fields[$NAME] =~ /DIGIT/) - { - &update_digit_block (*digit_start, *digit_end, $fields[$CODE], - $fields[$DECIMAL]); - &set_attribute ($ncode, $fields[$DECIMAL]); - } - else - { - # If this fails then Character.getType will fail. We - # assume that things in `digit_table' are the only - # category `Nd' characters. - print STDERR ("Character \u", $fields[$CODE], - " is class Nd but not in digit table\n"); - $status = 1; - } - } - - # Keep track of space characters. - if ($fields[$CATEGORY] =~ /Z[slp]/) - { - &update_block (*space_start, *space_end, $fields[$CODE]); - } - - # Keep track of letters. - # if ($fields[$CATEGORY] =~ /L[ultmo]/) - # { - # &update_letter_block (*letter_start, *letter_end, $fields[$CODE], - # $fields[$CATEGORY]); - # } - - # Keep track of all characters. You might think we wouldn't have - # to do this for uppercase letters, or other characters we already - # "classify". The problem is that this classification is - # different. E.g., \u216f is uppercase by Java rules, but is a - # LETTER_NUMBER here. - &update_all_block (*all_start, *all_end, *all_cats, - $fields[$CODE], $fields[$CATEGORY]); - } - - - # Called to add a new decomposition. - sub add_decomposition - { - local ($ncode, $value) = @_; - local ($is_full) = 0; - local ($first) = 1; - local (@decomp) = (); - - foreach (split (' ', $value)) - { - if ($first && /^\<.*\>$/) - { - $is_full = 1; - } - else - { - push (@decomp, hex ($_)); - } - $first = 0; - } - - # We pack the value into a string because this means we can stick - # with Perl 4 features. - local ($s) = pack "I*", @decomp; - if ($is_full) - { - $full_decomposition{$ncode} = $s; - } - else - { - $canonical_decomposition{$ncode} = $s; - } - } - - # Write a single decomposition table. - sub write_single_decomposition - { - local ($name, $is_canon, %table) = @_; - - printf DECOMP "static const decomp_entry ${name}_decomposition[] =\n{\n"; - - local ($key, @expansion, $char); - local ($first_line) = 1; - - for ($key = 0; $key <= 65535; ++$key) - { - next if ! defined $table{$key}; - - printf DECOMP ",\n" - unless $first_line; - $first_line = 0; - - printf DECOMP " { 0x%04x, \"", $key; - - # We represent the expansion as a series of bytes, terminated - # with a double nul. This is ugly, but relatively - # space-efficient. Most expansions are short, but there are a - # few that are very long (e.g. \uFDFA). This means that if we - # chose a fixed-space representation we would waste a lot of - # space. - @expansion = unpack "I*", $table{$key}; - foreach $char (@expansion) - { - printf DECOMP "\\x%02x\\x%02x", ($char / 256), ($char % 256); - } - - printf DECOMP "\" }"; - } - - printf DECOMP "\n};\n\n"; - } - - sub write_decompositions - { - &write_single_decomposition ('canonical', 1, %canonical_decomposition); - &write_single_decomposition ('full', 0, %full_decomposition); - } - - # We represent a block of characters with a pair of lists. This - # function updates the pair to account for the new character. Returns - # 1 if we added to the old block, 0 otherwise. - sub update_block - { - local (*start, *end, $char) = @_; - - local ($nchar) = hex ($char); - local ($count) = $#end; - if ($count >= 0 && $end[$count] == $nchar - 1) - { - ++$end[$count]; - return 1; - } - else - { - ++$count; - $start[$count] = $nchar; - $end[$count] = $nchar; - } - return 0; - } - - # Return true if we will be appending this character to the end of the - # existing block. - sub block_append_p - { - local (*end, $char) = @_; - return $#end >= 0 && $end[$#end] == $char - 1; - } - - # This updates the digit block. This table is much like an ordinary - # block, but it has an extra constraint. - sub update_digit_block - { - local (*start, *end, $char, $value) = @_; - - &update_block ($start, $end, $char); - local ($nchar) = hex ($char); - - # We want to make sure that the new digit's value is correct for - # its place in the block. However, we special-case Tamil digits, - # since Tamil does not have a digit `0'. - local ($count) = $#start; - if (($nchar < $TAMIL_DIGIT_ONE || $nchar > $TAMIL_DIGIT_NINE) - && $nchar - $start[$count] != $value) - { - # If this fails then Character.digit_value will be wrong. - print STDERR "Character \\u", $char, " violates digit constraint\n"; - $status = 1; - } - } - - # Update letter table. We could be smart about avoiding upper or - # lower case letters, but it is much simpler to just track them all. - sub update_letter_block - { - local (*start, *end, $char, $category) = @_; - - &update_block (*start, *end, $char); - } - - # Update `all' table. This table holds all the characters we don't - # already categorize for other reasons. FIXME: if a given type has - # very few characters, we should just inline the code. E.g., there is - # only one paragraph separator. - sub update_all_block - { - local (*start, *end, *cats, $char, $category) = @_; - - local ($nchar) = hex ($char); - local ($count) = $#end; - if ($count >= 0 - && $end[$count] == $nchar - 1 - && $cats[$count] eq $category) - { - ++$end[$count]; - } - else - { - ++$count; - $start[$count] = $nchar; - $end[$count] = $nchar; - $cats[$count] = $category; - } - } - - # Update a case table. We handle case tables specially because we - # want to map (e.g.) a block of uppercase characters directly onto the - # corresponding block of lowercase characters. Therefore we generate - # a new entry when the block would no longer map directly. - sub update_case_block - { - local (*start, *end, *map, $char, $mapchar) = @_; - - local ($nchar) = hex ($char); - local ($nmap) = hex ($mapchar); - - local ($count) = $#end; - if ($count >= 0 - && $end[$count] == $nchar - 1 - && $nchar - $start[$count] == $nmap - $map[$count]) - { - ++$end[$count]; - } - else - { - ++$count; - $start[$count] = $nchar; - $end[$count] = $nchar; - $map[$count] = $nmap; - } - } - - # Set the attribute value for the character. Each character can have - # only one attribute. - sub set_attribute - { - local ($ncode, $attr) = @_; - - if ($attributes{$ncode} ne '' && $attributes{$ncode} ne $attr) - { - if ($ncode >= $ROMAN_START && $ncode <= $ROMAN_END) - { - $second_attributes{$ncode} = $attr; - } - else - { - printf STDERR "character \\u%04x already has attribute\n", $ncode; - } - } - # Attributes can be interpreted as unsigned in some situations, - # so we check against 65535. This could cause errors -- we need - # to check the interpretation here. - elsif ($attr < -32768 || $attr > 65535) - { - printf STDERR "attribute out of range for character \\u%04x\n", $ncode; - } - else - { - $attributes{$ncode} = $attr; - } - } - - - # Print a block table. - sub print_block - { - local ($title, *start, *end) = @_; - - print CHARTABLE "static const jchar ", $title, "[][2] =\n"; - print CHARTABLE " {\n"; - - local ($i) = 0; - while ($i <= $#start) - { - print CHARTABLE " { "; - &print_char ($start[$i]); - print CHARTABLE ", "; - &print_char ($end[$i]); - print CHARTABLE " }"; - print CHARTABLE "," if ($i != $#start); - print CHARTABLE "\n"; - ++$i; - $bytes += 4; # Two bytes per char. - } - - print CHARTABLE " };\n\n"; - } - - # Print the numerics table. - sub print_numerics - { - local ($i, $key, $count, @keys); - - $i = 0; - @keys = sort keys %numerics; - $count = @keys; - - print CHARTABLE "static const jchar numeric_table[] =\n"; - print CHARTABLE " { "; - foreach $key (@keys) - { - &print_char (hex ($key)); - ++$i; - print CHARTABLE ", " if $i < $count; - # Print 5 per line. - print CHARTABLE "\n " if ($i % 5 == 0); - $bytes += 2; # One character. - } - print CHARTABLE " };\n\n"; - - print CHARTABLE "static const jshort numeric_value[] =\n"; - print CHARTABLE " { "; - $i = 0; - foreach $key (@keys) - { - print CHARTABLE $numerics{$key}; - if ($numerics{$key} > 32767 || $numerics{$key} < -32768) - { - # This means our generated type info is incorrect. We - # could just detect and work around this here, but I'm - # lazy. - print STDERR "numeric value won't fit in a short\n"; - $status = 1; - } - ++$i; - print CHARTABLE ", " if $i < $count; - # Print 10 per line. - print CHARTABLE "\n " if ($i % 10 == 0); - $bytes += 2; # One short. - } - print CHARTABLE " };\n\n"; - } - - # Print a table that maps one single letter onto another. It assumes - # the map is index by char code. - sub print_single_map - { - local ($title, %map) = @_; - - local (@keys) = sort keys %map; - $num = @keys; - print CHARTABLE "static const jchar ", $title, "[][2] =\n"; - print CHARTABLE " {\n"; - $i = 0; - for $key (@keys) - { - print CHARTABLE " { "; - &print_char (hex ($key)); - print CHARTABLE ", "; - &print_char (hex ($map{$key})); - print CHARTABLE " }"; - ++$i; - if ($i < $num) - { - print CHARTABLE ","; - } - else - { - print CHARTABLE " "; - } - print CHARTABLE " // ", $name{$key}, "\n"; - $bytes += 4; # Two bytes per char. - } - print CHARTABLE " };\n\n"; - } - - # Print the `all' block. - sub print_all_block - { - local (*start, *end, *cats) = @_; - - &print_block ("all_table", *start, *end); - - local ($i) = 0; - local ($sum) = 0; - while ($i <= $#start) - { - $sum += $end[$i] - $start[$i] + 1; - ++$i; - } - # We do this computation just to make sure it isn't cheaper to - # simply list all the characters individually. - printf STDERR ("all_table encodes %d characters in %d entries\n", - $sum, $#start + 1); - - print CHARTABLE "static const jbyte category_table[] =\n"; - print CHARTABLE " { "; - - $i = 0; - while ($i <= $#cats) - { - if ($i > 0 && $cats[$i] eq $cats[$i - 1]) - { - # This isn't an error. We can have a duplicate because - # two ranges are not adjacent while the intervening - # characters are left out of the table for other reasons. - # We could exploit this to make the table a little smaller. - # printf STDERR "Duplicate all entry at \\u%04x\n", $start[$i]; - } - print CHARTABLE 'java::lang::Character::', $category_map{$cats[$i]}; - print CHARTABLE ", " if ($i < $#cats); - ++$i; - print CHARTABLE "\n "; - ++$bytes; - } - print CHARTABLE " };\n\n"; - } - - # Print case table. - sub print_case_table - { - local ($title, *start, *end, *map, *anomalous) = @_; - - &print_block ($title . '_case_table', *start, *end); - - print CHARTABLE "static const jchar ", $title, "_case_map_table[] =\n"; - print CHARTABLE " { "; - - local ($i) = 0; - while ($i <= $#map) - { - &print_char ($map[$i]); - print CHARTABLE ", " if $i < $#map; - ++$i; - print CHARTABLE "\n " if $i % 5 == 0; - $bytes += 2; - } - print CHARTABLE " };\n"; - - - local ($key, @keys); - @keys = sort keys %anomalous; - - if ($title eq 'upper') - { - if ($#keys >= 0) - { - # If these are found we need to change Character.isUpperCase. - print STDERR "Found anomalous upper case characters\n"; - $status = 1; - } - } - else - { - print CHARTABLE "\n"; - print CHARTABLE "static const jchar ", $title, "_anomalous_table[] =\n"; - print CHARTABLE " { "; - $i = 0; - foreach $key (@keys) - { - &print_char (hex ($key)); - print CHARTABLE ", " if $i < $#keys; - ++$i; - print CHARTABLE "\n " if $i % 5 == 0; - $bytes += 2; - } - print CHARTABLE " };\n"; - } - - print CHARTABLE "\n"; - } - - # Print the type table and attributes table for the fast version. - sub print_fast_tables - { - local (*start, *end, *cats, *atts, *second_atts) = @_; - - print CHARTABLE "static const jbyte type_table[] =\n{ "; - - local ($i, $j); - for ($i = 0; $i <= $#cats; ++$i) - { - for ($j = $start[$i]; $j <= $end[$i]; ++$j) - { - print CHARTABLE 'java::lang::Character::', $category_map{$cats[$i]}; - print CHARTABLE "," if ($i < $#cats || $j < $end[$i]); - print CHARTABLE "\n "; - } - } - print CHARTABLE "\n };\n\n"; - - print CHARTABLE "static const jshort attribute_table[] =\n{ "; - for ($i = 0; $i <= 0xffff; ++$i) - { - $atts{$i} = 0 if ! defined $atts{$i}; - print CHARTABLE $atts{$i}; - print CHARTABLE ", " if $i < 0xffff; - print CHARTABLE "\n " if $i % 5 == 1; - } - print CHARTABLE "\n };\n\n"; - - print CHARTABLE "static const jshort secondary_attribute_table[] =\n{ "; - for ($i = $ROMAN_START; $i <= $ROMAN_END; ++$i) - { - print CHARTABLE $second_atts{$i}; - print CHARTABLE ", " if $i < $ROMAN_END; - print CHARTABLE "\n " if $i % 5 == 1; - } - print CHARTABLE "\n };\n\n"; - } - - # Print a character constant. - sub print_char - { - local ($ncode) = @_; - printf CHARTABLE "0x%04x", $ncode; - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/configure gcc-3.1/libjava/configure *** gcc-3.0.4/libjava/configure Wed Feb 20 19:40:48 2002 --- gcc-3.1/libjava/configure Wed May 15 02:40:18 2002 *************** ac_help="$ac_help *** 34,44 **** ac_help="$ac_help --with-pic try to use only PIC/non-PIC objects [default=use both]" ac_help="$ac_help - --enable-fast-character prefer speed over size for Character" - ac_help="$ac_help --disable-getenv-properties don't set system properties from GCJ_PROPERTIES" ac_help="$ac_help --enable-libgcj-debug enable runtime debugging code" ac_help="$ac_help --enable-interpreter enable interpreter" --- 34,45 ---- ac_help="$ac_help --with-pic try to use only PIC/non-PIC objects [default=use both]" ac_help="$ac_help --disable-getenv-properties don't set system properties from GCJ_PROPERTIES" ac_help="$ac_help + --enable-hash-synchronization + Use global hash table for monitor locks" + ac_help="$ac_help --enable-libgcj-debug enable runtime debugging code" ac_help="$ac_help --enable-interpreter enable interpreter" *************** ac_help="$ac_help *** 47,52 **** --- 48,55 ---- ac_help="$ac_help --disable-java-net disable java.net" ac_help="$ac_help + --without-libffi don't use libffi" + ac_help="$ac_help --disable-jvmpi disable JVMPI support" ac_help="$ac_help --with-ecos enable runtime eCos target support" *************** program_suffix=NONE *** 77,82 **** --- 80,86 ---- program_transform_name=s,x,x, silent= site= + sitefile= srcdir= target=NONE verbose= *************** Configuration: *** 191,196 **** --- 195,201 ---- --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages + --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX *************** EOF *** 361,366 **** --- 366,376 ---- -site=* | --site=* | --sit=*) site="$ac_optarg" ;; + -site-file | --site-file | --site-fil | --site-fi | --site-f) + ac_prev=sitefile ;; + -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) + sitefile="$ac_optarg" ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) *************** fi *** 526,537 **** srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. ! if test -z "$CONFIG_SITE"; then ! if test "x$prefix" != xNONE; then ! CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ! else ! CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then --- 536,551 ---- srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. ! if test -z "$sitefile"; then ! if test -z "$CONFIG_SITE"; then ! if test "x$prefix" != xNONE; then ! CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ! else ! CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" ! fi fi + else + CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then *************** fi *** 571,578 **** echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:576: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 585,598 ---- + # This works around the fact that libtool configuration may change LD + # for this particular configuration, but some shells, instead of + # keeping the changes in LD private, export them just because LD is + # exported. + ORIGINAL_LD_FOR_MULTILIBS=$LD + echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:596: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 618,624 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:622: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 638,644 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:642: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_SCRIPT" && INSTALL_SCR *** 671,677 **** test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:675: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile --- 691,697 ---- test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:695: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile *************** test "$program_suffix" != NONE && *** 728,734 **** test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:732: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 748,754 ---- test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:752: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 761,772 **** fi echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 ! echo "configure:765: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:785: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else --- 797,803 ---- return __CYGWIN__; ; return 0; } EOF ! if { (eval echo configure:801: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else *************** echo "$ac_t""$ac_cv_cygwin" 1>&6 *** 794,812 **** CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:798: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else --- 814,832 ---- CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:818: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else *************** else { echo "configure: error: can not r *** 933,939 **** fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:937: checking host system type" >&5 host_alias=$host case "$host_alias" in --- 953,959 ---- fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:957: checking host system type" >&5 host_alias=$host case "$host_alias" in *************** host_os=`echo $host | sed 's/^\([^-]*\)- *** 954,960 **** echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 ! echo "configure:958: checking target system type" >&5 target_alias=$target case "$target_alias" in --- 974,980 ---- echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 ! echo "configure:978: checking target system type" >&5 target_alias=$target case "$target_alias" in *************** target_os=`echo $target | sed 's/^\([^-] *** 972,978 **** echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:976: checking build system type" >&5 build_alias=$build case "$build_alias" in --- 992,998 ---- echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:996: checking build system type" >&5 build_alias=$build case "$build_alias" in *************** test "$host_alias" != "$target_alias" && *** 1001,1007 **** # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1005: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1021,1027 ---- # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1025: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -z "$CC"; then *** 1031,1037 **** # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1035: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1051,1057 ---- # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1055: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1082,1088 **** # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1086: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1102,1108 ---- # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1106: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1115,1121 **** echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:1119: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1135,1141 ---- echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:1139: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1124,1130 **** yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1128: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no --- 1144,1150 ---- yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1148: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no *************** ac_test_CFLAGS="${CFLAGS+set}" *** 1143,1149 **** ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:1147: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1163,1169 ---- ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:1167: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1174,1218 **** fi fi ! for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1183: checking for $ac_word" >&5 ! if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test -n "$CXX"; then ! ac_cv_prog_CXX="$CXX" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ! ac_cv_prog_CXX="$ac_prog" break fi done IFS="$ac_save_ifs" fi fi ! CXX="$ac_cv_prog_CXX" ! if test -n "$CXX"; then ! echo "$ac_t""$CXX" 1>&6 else echo "$ac_t""no" 1>&6 fi ! test -n "$CXX" && break done ! test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 ! echo "configure:1216: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1194,1253 ---- fi fi ! ! # We use the libstdc++-v3 version of LIB_AC_PROG_CXX, but use ! # glibjava_CXX instead of glibcpp_CXX. That's because we're passed a ! # different definition of CXX than other directories, since we don't ! # depend on libstdc++-v3 having already been built. ! ! ! ! # Use glibjava_CXX so that we do not cause CXX to be cached with the ! # flags that come in CXX while configuring libjava. They're different ! # from those used for all other target libraries. If CXX is set in ! # the environment, respect that here. ! glibjava_CXX=$CXX ! for ac_prog in $CCC c++ g++ gcc CC cxx cc++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1216: checking for $ac_word" >&5 ! if eval "test \"`echo '$''{'ac_cv_prog_glibjava_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test -n "$glibjava_CXX"; then ! ac_cv_prog_glibjava_CXX="$glibjava_CXX" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ! ac_cv_prog_glibjava_CXX="$ac_prog" break fi done IFS="$ac_save_ifs" fi fi ! glibjava_CXX="$ac_cv_prog_glibjava_CXX" ! if test -n "$glibjava_CXX"; then ! echo "$ac_t""$glibjava_CXX" 1>&6 else echo "$ac_t""no" 1>&6 fi ! test -n "$glibjava_CXX" && break done ! test -n "$glibjava_CXX" || glibjava_CXX="gcc" + CXX=$glibjava_CXX + test -z "$glibjava_CXX" && { echo "configure: error: no acceptable c++ found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 ! echo "configure:1251: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1221,1227 **** yes; #endif EOF ! if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1225: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no --- 1256,1262 ---- yes; #endif EOF ! if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1260: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no *************** echo "$ac_t""$ac_cv_prog_gxx" 1>&6 *** 1232,1246 **** if test $ac_cv_prog_gxx = yes; then GXX=yes ! else ! GXX= ! fi ! ! ac_test_CXXFLAGS="${CXXFLAGS+set}" ! ac_save_CXXFLAGS="$CXXFLAGS" ! CXXFLAGS= ! echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 ! echo "configure:1244: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1267,1277 ---- if test $ac_cv_prog_gxx = yes; then GXX=yes ! ac_test_CXXFLAGS="${CXXFLAGS+set}" ! ac_save_CXXFLAGS="$CXXFLAGS" ! CXXFLAGS= ! echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 ! echo "configure:1275: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** rm -f conftest* *** 1255,1274 **** fi echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 ! if test "$ac_test_CXXFLAGS" = set; then ! CXXFLAGS="$ac_save_CXXFLAGS" ! elif test $ac_cv_prog_cxx_g = yes; then ! if test "$GXX" = yes; then CXXFLAGS="-g -O2" else - CXXFLAGS="-g" - fi - else - if test "$GXX" = yes; then CXXFLAGS="-O2" - else - CXXFLAGS= fi fi --- 1286,1301 ---- fi echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 ! if test "$ac_test_CXXFLAGS" = set; then ! CXXFLAGS="$ac_save_CXXFLAGS" ! elif test $ac_cv_prog_cxx_g = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-O2" fi + else + GXX= + test "${CXXFLAGS+set}" = set || CXXFLAGS="-g" fi *************** EOF *** 1293,1299 **** missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:1297: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1320,1326 ---- missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:1324: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 1306,1312 **** fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:1310: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1333,1339 ---- fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:1337: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 1319,1325 **** fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:1323: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1346,1352 ---- fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:1350: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 1332,1338 **** fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:1336: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1359,1365 ---- fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:1363: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 1345,1351 **** fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:1349: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 1372,1378 ---- fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:1376: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** fi *** 1359,1370 **** ! # AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we dont # run it explicitly here, it will be run implicitly before # LIBGCJ_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:1368: checking build system type" >&5 build_alias=$build case "$build_alias" in --- 1386,1397 ---- ! # AC_CHECK_TOOL does AC_REQUIRE (AC_CANONICAL_BUILD). If we don't # run it explicitly here, it will be run implicitly before # LIBGCJ_CONFIGURE, which doesn't work because that means that it will # be run before AC_CANONICAL_HOST. echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:1395: checking build system type" >&5 build_alias=$build case "$build_alias" in *************** echo "$ac_t""$build" 1>&6 *** 1385,1391 **** # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1389: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1412,1418 ---- # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1416: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1417,1423 **** # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1421: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1444,1450 ---- # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1448: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1449,1455 **** # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1453: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1476,1482 ---- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1480: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 1481,1487 **** # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1485: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1508,1514 ---- # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1512: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1526,1532 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1530: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1553,1559 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:1557: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_DATA" && INSTALL_DATA= *** 1580,1586 **** echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:1584: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" --- 1607,1613 ---- echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:1611: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" *************** fi *** 1608,1620 **** # need to use $(EXEEXT). Moreover, the test for EXEEXT normally # fails, because we are probably configuring with a cross compiler # which cant create executables. So we include AC_EXEEXT to keep ! # automake happy, but we dont execute it, since we dont care about # the result. if false; then echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1618: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1635,1651 ---- # need to use $(EXEEXT). Moreover, the test for EXEEXT normally # fails, because we are probably configuring with a cross compiler # which cant create executables. So we include AC_EXEEXT to keep ! # automake happy, but we don't execute it, since we don't care about # the result. if false; then + # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands + # to nothing, so nothing would remain between `then' and `fi' if it + # were not for the `:' below. + : echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1649: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1624,1633 **** rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1628: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done --- 1655,1664 ---- rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in ! *.c | *.o | *.obj | *.ilk | *.pdb) ;; *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;; esac done *************** ac_prog=ld *** 1775,1781 **** if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1779: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw --- 1806,1812 ---- if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1810: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw *************** echo "configure:1779: checking for ld us *** 1805,1814 **** esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1809: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1812: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1836,1845 ---- esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1840: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1843: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 1843,1849 **** fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1847: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1874,1880 ---- fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1878: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** with_gnu_ld=$lt_cv_prog_gnu_ld *** 1860,1866 **** echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1864: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1891,1897 ---- echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1895: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** reload_flag=$lt_cv_ld_reload_flag *** 1872,1878 **** test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1876: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1903,1909 ---- test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1907: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** NM="$lt_cv_path_NM" *** 1910,1916 **** echo "$ac_t""$NM" 1>&6 echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1914: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1941,1947 ---- echo "$ac_t""$NM" 1>&6 echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1945: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** file_magic_cmd=$lt_cv_file_magic_cmd *** 2074,2086 **** deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:2078: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:2084: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; --- 2105,2117 ---- deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:2109: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:2115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; *************** case $deplibs_check_method in *** 2104,2110 **** file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:2108: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2135,2141 ---- file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:2139: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 2166,2172 **** if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:2170: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2197,2203 ---- if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:2201: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** esac *** 2237,2243 **** # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2241: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2268,2274 ---- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2272: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 2269,2275 **** # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2273: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2300,2306 ---- # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2304: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 2304,2310 **** # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2308: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2335,2341 ---- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2339: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 2336,2342 **** # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2340: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2367,2373 ---- # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:2371: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** test x"$pic_mode" = xno && libtool_flags *** 2403,2410 **** case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 2407 "configure"' > conftest.$ac_ext ! if { (eval echo configure:2408: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" --- 2434,2441 ---- case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 2438 "configure"' > conftest.$ac_ext ! if { (eval echo configure:2439: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" *************** case $host in *** 2425,2431 **** SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:2429: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2456,2462 ---- SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:2460: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** ac_link='${CC-cc} -o conftest${ac_exeext *** 2438,2451 **** cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else --- 2469,2482 ---- cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else *************** echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6 *** 2475,2481 **** esac echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 ! echo "configure:2479: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 2506,2512 ---- esac echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 ! echo "configure:2510: checking how to run the C++ preprocessor" >&5 if test -z "$CXXCPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** ac_link='${CXX-g++} -o conftest${ac_exee *** 2488,2499 **** cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2497: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2519,2530 ---- cross_compiling=$ac_cv_prog_cxx_cross CXXCPP="${CXX-g++} -E" cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2528: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2645,2663 **** TESTSUBDIR_FALSE= fi - # Check whether --enable-fast-character or --disable-fast-character was given. - if test "${enable_fast_character+set}" = set; then - enableval="$enable_fast_character" - # Nothing - - else - cat >> confdefs.h <<\EOF - #define COMPACT_CHARACTER 1 - EOF - - fi - - # Check whether --enable-getenv-properties or --disable-getenv-properties was given. if test "${enable_getenv_properties+set}" = set; then enableval="$enable_getenv_properties" --- 2676,2681 ---- *************** if test "${enable_getenv_properties+set} *** 2665,2671 **** fi ! if test -n "$enable_getenv_properties"; then enable_getenv_properties=${enable_getenv_properties_default-yes} fi if test "$enable_getenv_properties" = no; then --- 2683,2689 ---- fi ! if test -z "$enable_getenv_properties"; then enable_getenv_properties=${enable_getenv_properties_default-yes} fi if test "$enable_getenv_properties" = no; then *************** EOF *** 2675,2680 **** --- 2693,2728 ---- fi + if test -z "$enable_main_args"; then + enable_main_args=${enable_main_args_default-yes} + fi + if test "$enable_main_args" = no; then + cat >> confdefs.h <<\EOF + #define DISABLE_MAIN_ARGS 1 + EOF + + fi + + + # Check whether --enable-hash-synchronization or --disable-hash-synchronization was given. + if test "${enable_hash_synchronization+set}" = set; then + enableval="$enable_hash_synchronization" + : + fi + + + if test -z "$enable_hash_synchronization"; then + enable_hash_synchronization=$enable_hash_synchronization_default + fi + + if test "${slow_pthread_self}" = "yes"; then + cat >> confdefs.h <<\EOF + #define SLOW_PTHREAD_SELF 1 + EOF + + fi + + LIBGCJDEBUG="false" # Check whether --enable-libgcj-debug or --disable-libgcj-debug was given. *************** EOF *** 2710,2716 **** fi echo $ac_n "checking for exception model to use""... $ac_c" 1>&6 ! echo "configure:2714: checking for exception model to use" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. --- 2758,2764 ---- fi echo $ac_n "checking for exception model to use""... $ac_c" 1>&6 ! echo "configure:2762: checking for exception model to use" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. *************** if test "${enable_sjlj_exceptions+set}" *** 2725,2731 **** : else cat > conftest.$ac_ext << EOF ! #line 2729 "configure" struct S { ~S(); }; void bar(); void foo() --- 2773,2779 ---- : else cat > conftest.$ac_ext << EOF ! #line 2777 "configure" struct S { ~S(); }; void bar(); void foo() *************** void foo() *** 2736,2742 **** EOF old_CXXFLAGS="$CXXFLAGS" CXXFLAGS=-S ! if { (eval echo configure:2740: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then enable_sjlj_exceptions=yes elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then --- 2784,2790 ---- EOF old_CXXFLAGS="$CXXFLAGS" CXXFLAGS=-S ! if { (eval echo configure:2788: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if grep _Unwind_SjLj_Resume conftest.s >/dev/null 2>&1 ; then enable_sjlj_exceptions=yes elif grep _Unwind_Resume conftest.s >/dev/null 2>&1 ; then *************** cross_compiling=$ac_cv_prog_cc_cross *** 2767,2797 **** echo "$ac_t""$ac_exception_model_name" 1>&6 ! echo $ac_n "checking for data_start""... $ac_c" 1>&6 ! echo "configure:2772: checking for data_start" >&5 ! LIBDATASTARTSPEC= ! NEEDS_DATA_START= ! cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ! rm -rf conftest* ! echo "$ac_t""found it" 1>&6 ! else ! echo "configure: failed program was:" >&5 ! cat conftest.$ac_ext >&5 ! rm -rf conftest* ! LIBDATASTARTSPEC="-u data_start libgcjdata.a%s" ! NEEDS_DATA_START=yes ! echo "$ac_t""missing" 1>&6 fi - rm -f conftest* - # Check whether --enable-java-net or --disable-java-net was given. if test "${enable_java_net+set}" = set; then --- 2815,2827 ---- echo "$ac_t""$ac_exception_model_name" 1>&6 ! # If we are non using SJLJ exceptions, and this host does not have support ! # for unwinding from a signal handler, enable checked dereferences and divides. ! if test $can_unwind_signal = no && test $enable_sjlj_exceptions = no; then ! CHECKREFSPEC=-fcheck-references ! DIVIDESPEC=-fuse-divide-subroutine ! EXCEPTIONSPEC= fi # Check whether --enable-java-net or --disable-java-net was given. if test "${enable_java_net+set}" = set; then *************** if test "${enable_java_net+set}" = set; *** 2800,2806 **** fi ! if test -n "$enable_java_net"; then enable_java_net=${enable_java_net_default-yes} fi if test "$enable_java_net" = no; then --- 2830,2836 ---- fi ! if test -z "$enable_java_net"; then enable_java_net=${enable_java_net_default-yes} fi if test "$enable_java_net" = no; then *************** EOF *** 2810,2815 **** --- 2840,2867 ---- fi + # Check whether --with-libffi or --without-libffi was given. + if test "${with_libffi+set}" = set; then + withval="$with_libffi" + : + else + with_libffi=${with_libffi_default-yes} + fi + + + LIBFFI= + LIBFFIINCS= + if test "$with_libffi" != no; then + cat >> confdefs.h <<\EOF + #define USE_LIBFFI 1 + EOF + + LIBFFI=../libffi/libffi_convenience.la + LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I$(MULTIBUILDTOP)../libffi/include' + fi + + + # Check whether --enable-jvmpi or --disable-jvmpi was given. if test "${enable_jvmpi+set}" = set; then enableval="$enable_jvmpi" *************** EOF *** 2824,2830 **** fi ! TARGET_ECOS="no" # Check whether --with-ecos or --without-ecos was given. if test "${with_ecos+set}" = set; then withval="$with_ecos" --- 2876,2882 ---- fi ! TARGET_ECOS=${PROCESS-"no"} # Check whether --with-ecos or --without-ecos was given. if test "${with_ecos+set}" = set; then withval="$with_ecos" *************** if test "${with_ecos+set}" = set; then *** 2833,2855 **** fi case "$TARGET_ECOS" in ! no) ! FILE_DESCRIPTOR=natFileDescriptorPosix.cc ! PROCESS=${PROCESS-Posix} ;; *) ! FILE_DESCRIPTOR=natFileDescriptorEcos.cc ! PROCESS=Ecos cat >> confdefs.h <<\EOF #define ECOS 1 EOF ;; esac echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:2853: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= --- 2885,2920 ---- fi + PLATFORMOBJS= case "$TARGET_ECOS" in ! no) case "$host" in ! *mingw*) ! PLATFORM=Win32 ! PLATFORMOBJS=win32.lo ! PLATFORMH=win32.h ! ;; ! *) ! PLATFORM=Posix ! PLATFORMOBJS=posix.lo ! PLATFORMH=posix.h ! ;; ! esac ;; *) ! PLATFORM=Ecos cat >> confdefs.h <<\EOF #define ECOS 1 EOF + PLATFORMOBJS=posix.lo + PLATFORMH=posix.h ;; esac + + echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:2918: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= *************** else *** 2864,2876 **** # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2874: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2929,2941 ---- # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2939: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2881,2893 **** rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2891: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2946,2958 ---- rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2898,2910 **** rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2908: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2963,2975 ---- rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2973: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** fi *** 2929,2935 **** echo "$ac_t""$CPP" 1>&6 cat > conftest.$ac_ext < EOF --- 2994,3000 ---- echo "$ac_t""$CPP" 1>&6 cat > conftest.$ac_ext < EOF *************** fi *** 2944,2950 **** rm -f conftest* cat > conftest.$ac_ext < EOF --- 3009,3015 ---- rm -f conftest* cat > conftest.$ac_ext < EOF *************** fi *** 2959,2965 **** rm -f conftest* cat > conftest.$ac_ext < EOF --- 3024,3030 ---- rm -f conftest* cat > conftest.$ac_ext < EOF *************** fi *** 2974,2980 **** rm -f conftest* cat > conftest.$ac_ext < EOF --- 3039,3045 ---- rm -f conftest* cat > conftest.$ac_ext < EOF *************** rm -f conftest* *** 2991,2997 **** cat > conftest.$ac_ext < EOF --- 3056,3062 ---- cat > conftest.$ac_ext < EOF *************** fi *** 3006,3012 **** rm -f conftest* cat > conftest.$ac_ext < EOF --- 3071,3077 ---- rm -f conftest* cat > conftest.$ac_ext < EOF *************** test -d java/io || mkdir java/io *** 3026,3036 **** test -d gnu || mkdir gnu test -d java/lang || mkdir java/lang ! SYSTEMSPEC= LIBGCJTESTSPEC="-L`pwd`/.libs -rpath `pwd`/.libs" --- 3091,3109 ---- test -d gnu || mkdir gnu + test -d java/lang || mkdir java/lang ! case "${host}" in ! *mingw*) ! SYSTEMSPEC="-lgdi32 -lwsock32 -lws2_32" ! ;; ! *) ! SYSTEMSPEC= ! ;; ! esac LIBGCJTESTSPEC="-L`pwd`/.libs -rpath `pwd`/.libs" *************** ZLIBTESTSPEC= *** 3050,3056 **** libsubdir=.libs echo $ac_n "checking for garbage collector to use""... $ac_c" 1>&6 ! echo "configure:3054: checking for garbage collector to use" >&5 # Check whether --enable-java-gc or --disable-java-gc was given. if test "${enable_java_gc+set}" = set; then enableval="$enable_java_gc" --- 3123,3129 ---- libsubdir=.libs echo $ac_n "checking for garbage collector to use""... $ac_c" 1>&6 ! echo "configure:3127: checking for garbage collector to use" >&5 # Check whether --enable-java-gc or --disable-java-gc was given. if test "${enable_java_gc+set}" = set; then enableval="$enable_java_gc" *************** GCTESTSPEC= *** 3070,3083 **** case "$GC" in boehm) echo "$ac_t""boehm" 1>&6 ! GCDEPS='$(top_builddir)/../boehm-gc/libgcjgc.la' ! # We include the path to the boehm-gc build directory. ! # See Makefile.am to understand why. ! GCLIBS="$GCDEPS -L\$(here)/../boehm-gc/$libsubdir" ! GCINCS='-I$(top_srcdir)/../boehm-gc -I$(top_builddir)/../boehm-gc' ! GCSPEC='-lgcjgc' JC1GCSPEC='-fuse-boehm-gc' GCTESTSPEC="-L`pwd`/../boehm-gc/.libs -rpath `pwd`/../boehm-gc/.libs" GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`" GCOBJS=boehm.lo GCHDR=boehm-gc.h --- 3143,3153 ---- case "$GC" in boehm) echo "$ac_t""boehm" 1>&6 ! GCLIBS=../boehm-gc/libgcjgc_convenience.la ! GCINCS='-I$(top_srcdir)/../boehm-gc/include' JC1GCSPEC='-fuse-boehm-gc' GCTESTSPEC="-L`pwd`/../boehm-gc/.libs -rpath `pwd`/../boehm-gc/.libs" + GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`" GCOBJS=boehm.lo GCHDR=boehm-gc.h *************** esac *** 3106,3112 **** echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6 ! echo "configure:3110: checking for thread model used by GCC" >&5 THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'` echo "$ac_t""$THREADS" 1>&6 --- 3176,3182 ---- echo $ac_n "checking for thread model used by GCC""... $ac_c" 1>&6 ! echo "configure:3180: checking for thread model used by GCC" >&5 THREADS=`$CC -v 2>&1 | sed -n 's/^Thread model: //p'` echo "$ac_t""$THREADS" 1>&6 *************** EOF *** 3125,3131 **** ;; esac ;; ! decosf1 | irix | mach | os2 | solaris | win32 | dce | vxworks) { echo "configure: error: thread package $THREADS not yet supported" 1>&2; exit 1; } ;; *) --- 3195,3203 ---- ;; esac ;; ! win32) ! ;; ! decosf1 | irix | mach | os2 | solaris | dce | vxworks) { echo "configure: error: thread package $THREADS not yet supported" 1>&2; exit 1; } ;; *) *************** EOF *** 3133,3138 **** --- 3205,3211 ---- ;; esac + THREADLDFLAGS= THREADLIBS= THREADINCS= THREADDEPS= *************** THREADH= *** 3141,3148 **** THREADSPEC= case "$THREADS" in posix) ! THREADLIBS=-lpthread ! THREADSPEC=-lpthread THREADOBJS=posix-threads.lo THREADH=posix-threads.h # MIT pthreads doesn't seem to have the mutexattr functions. --- 3214,3249 ---- THREADSPEC= case "$THREADS" in posix) ! case "$host" in ! *-*-cygwin*) ! # Don't set THREADLIBS here. Cygwin doesn't have -lpthread. ! ;; ! ! *-*-freebsd[1234]*) ! ! # Before FreeBSD 5, it didn't have -lpthread (or any library which ! # merely adds pthread_* functions) but it does have a -pthread switch ! # which is required at link-time to select -lc_r *instead* of -lc. ! THREADLDFLAGS=-pthread ! # Don't set THREADSPEC here as might be expected since -pthread is ! # not processed when found within a spec file, it must come from ! # the command line. For now, the user must provide the -pthread ! # switch to link code compiled with gcj. In future, consider adding ! # support for weak references to pthread_* functions ala gthr.h API. ! THREADSPEC='%{!pthread: %eUnder this configuration, the user must provide -pthread when linking.}' ! ;; ! *-*-freebsd*) ! # FreeBSD 5 implements a model much closer to other modern UNIX ! # which support threads. However, it still does not support ! # -lpthread. ! THREADLDFLAGS=-pthread ! THREADSPEC=-lc_r ! ;; ! *) ! THREADLIBS=-lpthread ! THREADSPEC=-lpthread ! ;; ! esac THREADOBJS=posix-threads.lo THREADH=posix-threads.h # MIT pthreads doesn't seem to have the mutexattr functions. *************** EOF *** 3167,3172 **** --- 3268,3278 ---- ;; + win32) + THREADOBJS=win32-threads.lo + THREADH=win32-threads.h + ;; + none) THREADOBJS=no-threads.lo THREADH=no-threads.h *************** esac *** 3180,3185 **** --- 3286,3307 ---- + if test -d sysdep; then true; else mkdir sysdep; fi + + + HASH_SYNC_SPEC= + # Hash synchronization is only useful with posix threads right now. + if test "$enable_hash_synchronization" = yes && test "$THREADS" = "posix"; then + HASH_SYNC_SPEC=-fhash-synchronization + cat >> confdefs.h <<\EOF + #define JV_HASH_SYNCHRONIZATION 1 + EOF + + fi + + + + if test "$GCC" = yes; then USING_GCC_TRUE= *************** CANADIAN=no *** 3193,3211 **** NULL_TARGET=no NATIVE=yes ! # Find unwind.h and support headers. If we're in the tree with ! # gcc, then look there. Otherwise look in compat-include. If all else ! # fails, just hope the user has set things up somehow. ! echo "probing $srcdir/../gcc/unwind.h" ! if test -r $libgcj_basedir/../gcc/unwind.h; then ! GCC_UNWIND_INCLUDE='-I$(libgcj_basedir)/../gcc' ! else ! if test -d $srcdir/../compat-include; then ! GCC_UNWIND_INCLUDE='-I$(top_srcdir)/../compat-include' ! else ! GCC_UNWIND_INCLUDE= ! fi ! fi if test -n "${with_cross_host}"; then # We are being configured with a cross compiler. AC_REPLACE_FUNCS --- 3315,3330 ---- NULL_TARGET=no NATIVE=yes ! # We're in the tree with gcc, and need to include some of its headers. ! GCC_UNWIND_INCLUDE='-I$(libgcj_basedir)/../gcc' ! ! # Figure out where generated headers like libgcj-config.h get installed. ! gcc_version_trigger=${libgcj_basedir}/../gcc/version.c ! gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'` ! gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'` ! tool_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include ! ! if test -n "${with_cross_host}"; then # We are being configured with a cross compiler. AC_REPLACE_FUNCS *************** EOF *** 3227,3232 **** --- 3346,3355 ---- EOF cat >> confdefs.h <<\EOF + #define HAVE_TIME 1 + EOF + + cat >> confdefs.h <<\EOF #define HAVE_GMTIME_R 1 EOF *************** EOF *** 3248,3256 **** EOF - ZLIBSPEC=-lzgcj - ZLIBTESTSPEC="-L`pwd`/../zlib/.libs -rpath `pwd`/../zlib/.libs" - # If Canadian cross, then don't pick up tools from the build # directory. if test x"$build" != x"$with_cross_host" && x"$build" != x"$target"; then --- 3371,3376 ---- *************** EOF *** 3260,3274 **** fi NATIVE=no else ! for ac_func in strerror ioctl select fstat open fsync sleep do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3267: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:3387: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 3411,3417 ---- ; return 0; } EOF ! if { (eval echo configure:3415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 3318,3329 **** for ac_func in gmtime_r localtime_r readdir_r getpwuid_r getcwd do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3322: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:3442: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 3466,3472 ---- ; return 0; } EOF ! if { (eval echo configure:3470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 3373,3384 **** for ac_func in access stat mkdir rename rmdir unlink realpath utime chmod do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3377: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:3497: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 3521,3527 ---- ; return 0; } EOF ! if { (eval echo configure:3525: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 3428,3439 **** for ac_func in nl_langinfo setlocale do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3432: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:3552: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 3576,3582 ---- ; return 0; } EOF ! if { (eval echo configure:3580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 3483,3494 **** for ac_func in inet_aton inet_addr do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3487: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:3607: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 3631,3637 ---- ; return 0; } EOF ! if { (eval echo configure:3635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 3538,3549 **** for ac_func in inet_pton uname inet_ntoa do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3542: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:3662: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 3686,3692 ---- ; return 0; } EOF ! if { (eval echo configure:3690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** else *** 3590,3604 **** fi done ! for ac_func in backtrace fork execvp pipe do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3597: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:3717: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 3741,3747 ---- ; return 0; } EOF ! if { (eval echo configure:3745: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 3649,3665 **** do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:3653: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:3663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 3769,3785 ---- do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:3773: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:3783: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** else *** 3685,3692 **** fi done echo $ac_n "checking for dladdr in -ldl""... $ac_c" 1>&6 ! echo "configure:3690: checking for dladdr in -ldl" >&5 ac_lib_var=`echo dl'_'dladdr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 3805,3873 ---- fi done + echo $ac_n "checking for backtrace""... $ac_c" 1>&6 + echo "configure:3810: checking for backtrace" >&5 + if eval "test \"`echo '$''{'ac_cv_func_backtrace'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + /* Override any gcc2 internal prototype to avoid an error. */ + /* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ + char backtrace(); + + int main() { + + /* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ + #if defined (__stub_backtrace) || defined (__stub___backtrace) + choke me + #else + backtrace(); + #endif + + ; return 0; } + EOF + if { (eval echo configure:3838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_backtrace=yes" + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_backtrace=no" + fi + rm -f conftest* + fi + + if eval "test \"`echo '$ac_cv_func_'backtrace`\" = yes"; then + echo "$ac_t""yes" 1>&6 + + case "$host" in + ia64-*-linux*) + # Has broken backtrace() + ;; + *) + cat >> confdefs.h <<\EOF + #define HAVE_BACKTRACE 1 + EOF + + ;; + esac + + else + echo "$ac_t""no" 1>&6 + fi + + echo $ac_n "checking for dladdr in -ldl""... $ac_c" 1>&6 ! echo "configure:3871: checking for dladdr in -ldl" >&5 ac_lib_var=`echo dl'_'dladdr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 3694,3700 **** ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 3886,3892 ---- dladdr() ; return 0; } EOF ! if { (eval echo configure:3890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** do *** 3734,3740 **** ac_safe=`echo "$ac_file" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_file""... $ac_c" 1>&6 ! echo "configure:3738: checking for $ac_file" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 3915,3921 ---- ac_safe=`echo "$ac_file" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_file""... $ac_c" 1>&6 ! echo "configure:3919: checking for $ac_file" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** done *** 3768,3792 **** ! ICONV_LDFLAGS= # Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then withval="$with_libiconv_prefix" for dir in `echo "$withval" | tr : ' '`; do if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi ! if test -d $dir/lib; then ! LDFLAGS="$LDFLAGS -L$dir/lib" ! ICONV_LDFLAGS=-L$dir/lib ! fi done fi - echo $ac_n "checking for iconv""... $ac_c" 1>&6 ! echo "configure:3790: checking for iconv" >&5 if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 3949,3969 ---- ! am_cv_lib_iconv_ldpath= # Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then withval="$with_libiconv_prefix" for dir in `echo "$withval" | tr : ' '`; do if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi ! if test -d $dir/lib; then am_cv_lib_iconv_ldpath="-L$dir/lib"; fi done fi echo $ac_n "checking for iconv""... $ac_c" 1>&6 ! echo "configure:3967: checking for iconv" >&5 if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 3794,3800 **** am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat > conftest.$ac_ext < #include --- 3971,3977 ---- am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat > conftest.$ac_ext < #include *************** iconv_t cd = iconv_open("",""); *** 3804,3810 **** iconv_close(cd); ; return 0; } EOF ! if { (eval echo configure:3808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* am_cv_func_iconv=yes else --- 3981,3987 ---- iconv_close(cd); ; return 0; } EOF ! if { (eval echo configure:3985: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* am_cv_func_iconv=yes else *************** fi *** 3814,3822 **** rm -f conftest* if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" ! LIBS="$LIBS -liconv" cat > conftest.$ac_ext < #include --- 3991,3999 ---- rm -f conftest* if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" ! LIBS="$LIBS $am_cv_libiconv_ldpath -liconv" cat > conftest.$ac_ext < #include *************** iconv_t cd = iconv_open("",""); *** 3826,3832 **** iconv_close(cd); ; return 0; } EOF ! if { (eval echo configure:3830: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* am_cv_lib_iconv=yes am_cv_func_iconv=yes --- 4003,4009 ---- iconv_close(cd); ; return 0; } EOF ! if { (eval echo configure:4007: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* am_cv_lib_iconv=yes am_cv_func_iconv=yes *************** echo "$ac_t""$am_cv_func_iconv" 1>&6 *** 3847,3859 **** EOF echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6 ! echo "configure:3851: checking for iconv declaration" >&5 if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < --- 4024,4036 ---- EOF echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6 ! echo "configure:4028: checking for iconv declaration" >&5 if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < *************** int main() { *** 3872,3878 **** ; return 0; } EOF ! if { (eval echo configure:3876: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* am_cv_proto_iconv_arg1="" else --- 4049,4055 ---- ; return 0; } EOF ! if { (eval echo configure:4053: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* am_cv_proto_iconv_arg1="" else *************** EOF *** 3895,3914 **** fi LIBICONV= if test "$am_cv_lib_iconv" = yes; then ! LIBICONV="-liconv" fi for ac_func in gethostbyname_r do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:3907: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 + echo "configure:4082: checking for LC_MESSAGES" >&5 + if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + int main() { + return LC_MESSAGES + ; return 0; } + EOF + if { (eval echo configure:4094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + am_cv_val_LC_MESSAGES=yes + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + am_cv_val_LC_MESSAGES=no + fi + rm -f conftest* + fi + + echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 + if test $am_cv_val_LC_MESSAGES = yes; then + cat >> confdefs.h <<\EOF + #define HAVE_LC_MESSAGES 1 + EOF + + fi + fi + echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 + echo "configure:4115: checking whether struct tm is in sys/time.h or time.h" >&5 + if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + #include + int main() { + struct tm *tp; tp->tm_sec; + ; return 0; } + EOF + if { (eval echo configure:4128: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_struct_tm=time.h + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_struct_tm=sys/time.h + fi + rm -f conftest* + fi + + echo "$ac_t""$ac_cv_struct_tm" 1>&6 + if test $ac_cv_struct_tm = sys/time.h; then + cat >> confdefs.h <<\EOF + #define TM_IN_SYS_TIME 1 + EOF + + fi + + echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6 + echo "configure:4149: checking for tm_zone in struct tm" >&5 + if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + #include <$ac_cv_struct_tm> + int main() { + struct tm tm; tm.tm_zone; + ; return 0; } + EOF + if { (eval echo configure:4162: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_struct_tm_zone=yes + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_struct_tm_zone=no + fi + rm -f conftest* + fi + + echo "$ac_t""$ac_cv_struct_tm_zone" 1>&6 + if test "$ac_cv_struct_tm_zone" = yes; then + cat >> confdefs.h <<\EOF + #define HAVE_TM_ZONE 1 + EOF + + else + echo $ac_n "checking for tzname""... $ac_c" 1>&6 + echo "configure:4182: checking for tzname" >&5 + if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + #ifndef tzname /* For SGI. */ + extern char *tzname[]; /* RS6000 and others reject char **tzname. */ + #endif + int main() { + atoi(*tzname); + ; return 0; } + EOF + if { (eval echo configure:4197: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_var_tzname=yes + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_var_tzname=no + fi + rm -f conftest* + fi + + echo "$ac_t""$ac_cv_var_tzname" 1>&6 + if test $ac_cv_var_tzname = yes; then + cat >> confdefs.h <<\EOF + #define HAVE_TZNAME 1 + EOF + + fi + fi + for ac_func in gethostbyname_r do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4222: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4246,4252 ---- ; return 0; } EOF ! if { (eval echo configure:4250: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** EOF *** 3958,3964 **** # We look for the one that returns `int'. # Hopefully this check is robust enough. cat > conftest.$ac_ext < EOF --- 4273,4279 ---- # We look for the one that returns `int'. # Hopefully this check is robust enough. cat > conftest.$ac_ext < EOF *************** rm -f conftest* *** 3978,3984 **** *" -D_REENTRANT "*) ;; *) echo $ac_n "checking whether gethostbyname_r declaration requires -D_REENTRANT""... $ac_c" 1>&6 ! echo "configure:3982: checking whether gethostbyname_r declaration requires -D_REENTRANT" >&5 if eval "test \"`echo '$''{'libjava_cv_gethostbyname_r_needs_reentrant'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 4293,4299 ---- *" -D_REENTRANT "*) ;; *) echo $ac_n "checking whether gethostbyname_r declaration requires -D_REENTRANT""... $ac_c" 1>&6 ! echo "configure:4297: checking whether gethostbyname_r declaration requires -D_REENTRANT" >&5 if eval "test \"`echo '$''{'libjava_cv_gethostbyname_r_needs_reentrant'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** ac_link='${CXX-g++} -o conftest${ac_exee *** 3991,4004 **** cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext < int main() { gethostbyname_r("", 0, 0); ; return 0; } EOF ! if { (eval echo configure:4002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libjava_cv_gethostbyname_r_needs_reentrant=no else --- 4306,4319 ---- cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext < int main() { gethostbyname_r("", 0, 0); ; return 0; } EOF ! if { (eval echo configure:4317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libjava_cv_gethostbyname_r_needs_reentrant=no else *************** else *** 4008,4021 **** CPPFLAGS_SAVE="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -D_REENTRANT" cat > conftest.$ac_ext < int main() { gethostbyname_r("", 0, 0); ; return 0; } EOF ! if { (eval echo configure:4019: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libjava_cv_gethostbyname_r_needs_reentrant=yes else --- 4323,4336 ---- CPPFLAGS_SAVE="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -D_REENTRANT" cat > conftest.$ac_ext < int main() { gethostbyname_r("", 0, 0); ; return 0; } EOF ! if { (eval echo configure:4334: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libjava_cv_gethostbyname_r_needs_reentrant=yes else *************** EOF *** 4050,4061 **** esac echo $ac_n "checking for struct hostent_data""... $ac_c" 1>&6 ! echo "configure:4054: checking for struct hostent_data" >&5 if eval "test \"`echo '$''{'libjava_cv_struct_hostent_data'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:4369: checking for struct hostent_data" >&5 if eval "test \"`echo '$''{'libjava_cv_struct_hostent_data'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libjava_cv_struct_hostent_data=yes else --- 4381,4387 ---- struct hostent_data data; ; return 0; } EOF ! if { (eval echo configure:4385: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libjava_cv_struct_hostent_data=yes else *************** fi *** 4092,4106 **** done for ac_func in gethostbyaddr_r do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4099: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < conftest.$ac_ext < + EOF + if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "gethostbyaddr_r" >/dev/null 2>&1; then + rm -rf conftest* + for ac_func in gethostbyaddr_r do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4428: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4452,4458 ---- ; return 0; } EOF ! if { (eval echo configure:4456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** EOF *** 4150,4156 **** # We look for the one that returns `int'. # Hopefully this check is robust enough. cat > conftest.$ac_ext < EOF --- 4479,4485 ---- # We look for the one that returns `int'. # Hopefully this check is robust enough. cat > conftest.$ac_ext < EOF *************** else *** 4170,4185 **** fi done for ac_func in gethostname do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4178: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:4510: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4534,4540 ---- ; return 0; } EOF ! if { (eval echo configure:4538: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** EOF *** 4226,4232 **** EOF cat > conftest.$ac_ext < EOF --- 4558,4564 ---- EOF cat > conftest.$ac_ext < EOF *************** done *** 4257,4268 **** for ac_func in pthread_mutexattr_settype pthread_mutexattr_setkind_np do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4261: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:4593: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4617,4623 ---- ; return 0; } EOF ! if { (eval echo configure:4621: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 4315,4326 **** for ac_func in sched_yield do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4319: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:4651: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4675,4681 ---- ; return 0; } EOF ! if { (eval echo configure:4679: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** EOF *** 4365,4371 **** else echo "$ac_t""no" 1>&6 echo $ac_n "checking for sched_yield in -lrt""... $ac_c" 1>&6 ! echo "configure:4369: checking for sched_yield in -lrt" >&5 ac_lib_var=`echo rt'_'sched_yield | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 4697,4703 ---- else echo "$ac_t""no" 1>&6 echo $ac_n "checking for sched_yield in -lrt""... $ac_c" 1>&6 ! echo "configure:4701: checking for sched_yield in -lrt" >&5 ac_lib_var=`echo rt'_'sched_yield | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 4373,4379 **** ac_save_LIBS="$LIBS" LIBS="-lrt $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 4716,4722 ---- sched_yield() ; return 0; } EOF ! if { (eval echo configure:4720: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** else *** 4410,4416 **** echo "$ac_t""no" 1>&6 echo $ac_n "checking for sched_yield in -lposix4""... $ac_c" 1>&6 ! echo "configure:4414: checking for sched_yield in -lposix4" >&5 ac_lib_var=`echo posix4'_'sched_yield | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 4742,4748 ---- echo "$ac_t""no" 1>&6 echo $ac_n "checking for sched_yield in -lposix4""... $ac_c" 1>&6 ! echo "configure:4746: checking for sched_yield in -lposix4" >&5 ac_lib_var=`echo posix4'_'sched_yield | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 4418,4424 **** ac_save_LIBS="$LIBS" LIBS="-lposix4 $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 4761,4767 ---- sched_yield() ; return 0; } EOF ! if { (eval echo configure:4765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** done *** 4465,4471 **** # We can save a little space at runtime if the mutex has m_count # or __m_count. This is a nice hack for Linux. cat > conftest.$ac_ext < int main() { --- 4797,4803 ---- # We can save a little space at runtime if the mutex has m_count # or __m_count. This is a nice hack for Linux. cat > conftest.$ac_ext < int main() { *************** int main() { *** 4474,4480 **** ; return 0; } EOF ! if { (eval echo configure:4478: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define PTHREAD_MUTEX_HAVE_M_COUNT 1 --- 4806,4812 ---- ; return 0; } EOF ! if { (eval echo configure:4810: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define PTHREAD_MUTEX_HAVE_M_COUNT 1 *************** else *** 4486,4492 **** rm -rf conftest* cat > conftest.$ac_ext < int main() { --- 4818,4824 ---- rm -rf conftest* cat > conftest.$ac_ext < int main() { *************** int main() { *** 4495,4501 **** ; return 0; } EOF ! if { (eval echo configure:4499: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define PTHREAD_MUTEX_HAVE___M_COUNT 1 --- 4827,4833 ---- ; return 0; } EOF ! if { (eval echo configure:4831: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define PTHREAD_MUTEX_HAVE___M_COUNT 1 *************** rm -f conftest* *** 4515,4526 **** for ac_func in gettimeofday time ftime do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4519: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:4851: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4875,4881 ---- ; return 0; } EOF ! if { (eval echo configure:4879: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 4574,4585 **** for ac_func in memmove do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4578: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:4910: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4934,4940 ---- ; return 0; } EOF ! if { (eval echo configure:4938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 4632,4643 **** for ac_func in memcpy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:4636: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:4968: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 4992,4998 ---- ; return 0; } EOF ! if { (eval echo configure:4996: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 4688,4693 **** --- 5020,5070 ---- { echo "configure: error: memcpy is required" 1>&2; exit 1; } fi + echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 + echo "configure:5025: checking for dlopen in -ldl" >&5 + ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` + if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + ac_save_LIBS="$LIBS" + LIBS="-ldl $LIBS" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" + fi + rm -f conftest* + LIBS="$ac_save_LIBS" + + fi + if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + + cat >> confdefs.h <<\EOF + #define HAVE_DLOPEN 1 + EOF + + else + echo "$ac_t""no" 1>&6 + fi + + # Some library-finding code we stole from Tcl. #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. *************** done *** 4708,4714 **** #-------------------------------------------------------------------- echo $ac_n "checking for socket libraries""... $ac_c" 1>&6 ! echo "configure:4712: checking for socket libraries" >&5 if eval "test \"`echo '$''{'gcj_cv_lib_sockets'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 5085,5091 ---- #-------------------------------------------------------------------- echo $ac_n "checking for socket libraries""... $ac_c" 1>&6 ! echo "configure:5089: checking for socket libraries" >&5 if eval "test \"`echo '$''{'gcj_cv_lib_sockets'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 4716,4727 **** gcj_checkBoth=0 unset ac_cv_func_connect echo $ac_n "checking for connect""... $ac_c" 1>&6 ! echo "configure:4720: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:5097: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else --- 5121,5127 ---- ; return 0; } EOF ! if { (eval echo configure:5125: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else *************** fi *** 4767,4773 **** if test "$gcj_checkSocket" = 1; then unset ac_cv_func_connect echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6 ! echo "configure:4771: checking for main in -lsocket" >&5 ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 5144,5150 ---- if test "$gcj_checkSocket" = 1; then unset ac_cv_func_connect echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6 ! echo "configure:5148: checking for main in -lsocket" >&5 ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 4775,4788 **** ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 5152,5165 ---- ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 4809,4820 **** LIBS="$LIBS -lsocket -lnsl" unset ac_cv_func_accept echo $ac_n "checking for accept""... $ac_c" 1>&6 ! echo "configure:4813: checking for accept" >&5 if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:5190: checking for accept" >&5 if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_accept=yes" else --- 5214,5220 ---- ; return 0; } EOF ! if { (eval echo configure:5218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_accept=yes" else *************** fi *** 4864,4875 **** gcj_oldLibs=$LIBS LIBS="$LIBS $gcj_cv_lib_sockets" echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 ! echo "configure:4868: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:5245: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else --- 5269,5275 ---- ; return 0; } EOF ! if { (eval echo configure:5273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else *************** if eval "test \"`echo '$ac_cv_func_'geth *** 4910,4916 **** else echo "$ac_t""no" 1>&6 echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6 ! echo "configure:4914: checking for main in -lnsl" >&5 ac_lib_var=`echo nsl'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 5287,5293 ---- else echo "$ac_t""no" 1>&6 echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6 ! echo "configure:5291: checking for main in -lnsl" >&5 ac_lib_var=`echo nsl'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 4918,4931 **** ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 5295,5308 ---- ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** echo "$ac_t""$gcj_cv_lib_sockets" 1>&6 *** 4957,4963 **** if test "$with_system_zlib" = yes; then echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6 ! echo "configure:4961: checking for deflate in -lz" >&5 ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 5334,5340 ---- if test "$with_system_zlib" = yes; then echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6 ! echo "configure:5338: checking for deflate in -lz" >&5 ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 4965,4971 **** ac_save_LIBS="$LIBS" LIBS="-lz $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 5353,5359 ---- deflate() ; return 0; } EOF ! if { (eval echo configure:5357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** if eval "test \"`echo '$ac_cv_lib_'$ac_l *** 4994,5012 **** ZLIBSPEC=-lz else echo "$ac_t""no" 1>&6 ! ZLIBSPEC=-lzgcj fi - else - ZLIBSPEC=-lzgcj - ZLIBTESTSPEC="-L`pwd`/../zlib/.libs -rpath `pwd`/../zlib/.libs" fi # On Solaris, and maybe other architectures, the Boehm collector # requires -ldl. if test "$GC" = boehm; then echo $ac_n "checking for main in -ldl""... $ac_c" 1>&6 ! echo "configure:5010: checking for main in -ldl" >&5 ac_lib_var=`echo dl'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 5371,5386 ---- ZLIBSPEC=-lz else echo "$ac_t""no" 1>&6 ! ZLIBSPEC= fi fi # On Solaris, and maybe other architectures, the Boehm collector # requires -ldl. if test "$GC" = boehm; then echo $ac_n "checking for main in -ldl""... $ac_c" 1>&6 ! echo "configure:5384: checking for main in -ldl" >&5 ac_lib_var=`echo dl'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 5014,5027 **** ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 5388,5401 ---- ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 5087,5093 **** # Extract the first word of "${ac_tool_prefix}gcj", so it can be a program name with args. set dummy ${ac_tool_prefix}gcj; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:5091: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_GCJ'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 5461,5467 ---- # Extract the first word of "${ac_tool_prefix}gcj", so it can be a program name with args. set dummy ${ac_tool_prefix}gcj; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:5465: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_GCJ'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 5119,5125 **** # Extract the first word of "gcj", so it can be a program name with args. set dummy gcj; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:5123: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_GCJ'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 5493,5499 ---- # Extract the first word of "gcj", so it can be a program name with args. set dummy gcj; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:5497: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_GCJ'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** exec 5>>./config.log *** 5181,5217 **** CPPFLAGS=$GCJ_SAVE_CPPFLAGS echo $ac_n "checking size of void *""... $ac_c" 1>&6 ! echo "configure:5185: checking size of void *" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! if test "$cross_compiling" = yes; then ! { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } ! else cat > conftest.$ac_ext < ! main() ! { ! FILE *f=fopen("conftestval", "w"); ! if (!f) exit(1); ! fprintf(f, "%d\n", sizeof(void *)); ! exit(0); ! } EOF ! if { (eval echo configure:5204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ! then ! ac_cv_sizeof_void_p=`cat conftestval` else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_sizeof_void_p=0 fi ! rm -fr conftest* fi fi echo "$ac_t""$ac_cv_sizeof_void_p" 1>&6 cat >> confdefs.h <&6 ! echo "configure:5559: checking size of void *" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ! for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. cat > conftest.$ac_ext < ! ! ! int main() { ! switch (0) case 0: case (sizeof (void *) == $ac_size):; ! ; return 0; } EOF ! if { (eval echo configure:5575: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ! rm -rf conftest* ! ac_cv_sizeof_void_p=$ac_size else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 fi ! rm -f conftest* ! if test x$ac_cv_sizeof_void_p != x ; then break; fi ! done ! fi + if test x$ac_cv_sizeof_void_p = x ; then + { echo "configure: error: cannot determine a size for void *" 1>&2; exit 1; } fi echo "$ac_t""$ac_cv_sizeof_void_p" 1>&6 cat >> confdefs.h <> confdefs.h <&6 ! echo "configure:5302: checking for g++ -ffloat-store bug" >&5 save_CFLAGS="$CFLAGS" CFLAGS="-x c++ -O2 -ffloat-store" cat > conftest.$ac_ext < int main() { ; return 0; } EOF ! if { (eval echo configure:5313: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""no" 1>&6 else --- 5660,5691 ---- fi ! # Determine gcj version number. + gcjversion=`$GCJ -v 2>&1 | sed -n 's/^.*version \([^ ]*\).*$/\1/p'` + GCJVERSION=$gcjversion + cat >> confdefs.h <&6 ! echo "configure:5678: checking for g++ -ffloat-store bug" >&5 save_CFLAGS="$CFLAGS" CFLAGS="-x c++ -O2 -ffloat-store" cat > conftest.$ac_ext < int main() { ; return 0; } EOF ! if { (eval echo configure:5689: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""no" 1>&6 else *************** fi *** 5325,5345 **** rm -f conftest* CFLAGS="$save_CFLAGS" ! for ac_hdr in unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h inttypes.h stdint.h langinfo.h locale.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:5333: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:5343: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 5701,5721 ---- rm -f conftest* CFLAGS="$save_CFLAGS" ! for ac_hdr in unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h stdint.h langinfo.h locale.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:5709: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:5719: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** for ac_hdr in dirent.h *** 5369,5385 **** do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:5373: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:5383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 5745,5801 ---- do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:5749: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:5759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ! ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ! if test -z "$ac_err"; then ! rm -rf conftest* ! eval "ac_cv_header_$ac_safe=yes" ! else ! echo "$ac_err" >&5 ! echo "configure: failed program was:" >&5 ! cat conftest.$ac_ext >&5 ! rm -rf conftest* ! eval "ac_cv_header_$ac_safe=no" ! fi ! rm -f conftest* ! fi ! if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ! echo "$ac_t""yes" 1>&6 ! ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ! cat >> confdefs.h <&6 ! fi ! done ! ! for ac_hdr in inttypes.h ! do ! ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ! echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:5789: checking for $ac_hdr" >&5 ! if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ! echo $ac_n "(cached) $ac_c" 1>&6 ! else ! cat > conftest.$ac_ext < ! EOF ! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:5799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** if eval "test \"`echo '$ac_cv_header_'$a *** 5400,5418 **** #define $ac_tr_hdr 1 EOF else echo "$ac_t""no" 1>&6 fi done echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ! echo "configure:5411: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include --- 5816,5885 ---- #define $ac_tr_hdr 1 EOF + cat >> confdefs.h <<\EOF + #define HAVE_INTTYPES_H 1 + EOF + + cat >> confdefs.h <<\EOF + #define JV_HAVE_INTTYPES_H 1 + EOF + + else echo "$ac_t""no" 1>&6 fi done + echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 + echo "configure:5835: checking for sys/wait.h that is POSIX.1 compatible" >&5 + if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext < + #include + #ifndef WEXITSTATUS + #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) + #endif + #ifndef WIFEXITED + #define WIFEXITED(stat_val) (((stat_val) & 255) == 0) + #endif + int main() { + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; return 0; } + EOF + if { (eval echo configure:5856: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_sys_wait_h=yes + else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_sys_wait_h=no + fi + rm -f conftest* + fi + + echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6 + if test $ac_cv_header_sys_wait_h = yes; then + cat >> confdefs.h <<\EOF + #define HAVE_SYS_WAIT_H 1 + EOF + + fi + echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 ! echo "configure:5878: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include *************** else *** 5420,5426 **** #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:5424: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 5887,5893 ---- #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:5891: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** rm -f conftest* *** 5437,5443 **** if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 5904,5910 ---- if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** fi *** 5455,5461 **** if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF --- 5922,5928 ---- if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF *************** if test "$cross_compiling" = yes; then *** 5476,5482 **** : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') --- 5943,5949 ---- : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') *************** if (XOR (islower (i), ISLOWER (i)) || to *** 5487,5493 **** exit (0); } EOF ! if { (eval echo configure:5491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else --- 5954,5960 ---- exit (0); } EOF ! if { (eval echo configure:5958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else *************** EOF *** 5511,5522 **** fi echo $ac_n "checking for ssize_t""... $ac_c" 1>&6 ! echo "configure:5515: checking for ssize_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS --- 5978,5989 ---- fi echo $ac_n "checking for ssize_t""... $ac_c" 1>&6 ! echo "configure:5982: checking for ssize_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS *************** fi *** 5545,5553 **** echo $ac_n "checking for in_addr_t""... $ac_c" 1>&6 ! echo "configure:5549: checking for in_addr_t" >&5 cat > conftest.$ac_ext < #if STDC_HEADERS --- 6012,6020 ---- echo $ac_n "checking for in_addr_t""... $ac_c" 1>&6 ! echo "configure:6016: checking for in_addr_t" >&5 cat > conftest.$ac_ext < #if STDC_HEADERS *************** int main() { *** 5561,5567 **** in_addr_t foo; ; return 0; } EOF ! if { (eval echo configure:5565: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_IN_ADDR_T 1 --- 6028,6034 ---- in_addr_t foo; ; return 0; } EOF ! if { (eval echo configure:6032: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_IN_ADDR_T 1 *************** fi *** 5577,5592 **** rm -f conftest* echo $ac_n "checking whether struct ip_mreq is in netinet/in.h""... $ac_c" 1>&6 ! echo "configure:5581: checking whether struct ip_mreq is in netinet/in.h" >&5 cat > conftest.$ac_ext < int main() { struct ip_mreq mreq; ; return 0; } EOF ! if { (eval echo configure:5590: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_STRUCT_IP_MREQ 1 --- 6044,6059 ---- rm -f conftest* echo $ac_n "checking whether struct ip_mreq is in netinet/in.h""... $ac_c" 1>&6 ! echo "configure:6048: checking whether struct ip_mreq is in netinet/in.h" >&5 cat > conftest.$ac_ext < int main() { struct ip_mreq mreq; ; return 0; } EOF ! if { (eval echo configure:6057: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_STRUCT_IP_MREQ 1 *************** fi *** 5602,5617 **** rm -f conftest* echo $ac_n "checking whether struct ipv6_mreq is in netinet/in.h""... $ac_c" 1>&6 ! echo "configure:5606: checking whether struct ipv6_mreq is in netinet/in.h" >&5 cat > conftest.$ac_ext < int main() { struct ipv6_mreq mreq6; ; return 0; } EOF ! if { (eval echo configure:5615: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_STRUCT_IPV6_MREQ 1 --- 6069,6084 ---- rm -f conftest* echo $ac_n "checking whether struct ipv6_mreq is in netinet/in.h""... $ac_c" 1>&6 ! echo "configure:6073: checking whether struct ipv6_mreq is in netinet/in.h" >&5 cat > conftest.$ac_ext < int main() { struct ipv6_mreq mreq6; ; return 0; } EOF ! if { (eval echo configure:6082: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_STRUCT_IPV6_MREQ 1 *************** fi *** 5627,5642 **** rm -f conftest* echo $ac_n "checking whether struct sockaddr_in6 is in netinet/in.h""... $ac_c" 1>&6 ! echo "configure:5631: checking whether struct sockaddr_in6 is in netinet/in.h" >&5 cat > conftest.$ac_ext < int main() { struct sockaddr_in6 addr6; ; return 0; } EOF ! if { (eval echo configure:5640: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_INET6 1 --- 6094,6109 ---- rm -f conftest* echo $ac_n "checking whether struct sockaddr_in6 is in netinet/in.h""... $ac_c" 1>&6 ! echo "configure:6098: checking whether struct sockaddr_in6 is in netinet/in.h" >&5 cat > conftest.$ac_ext < int main() { struct sockaddr_in6 addr6; ; return 0; } EOF ! if { (eval echo configure:6107: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_INET6 1 *************** fi *** 5652,5660 **** rm -f conftest* echo $ac_n "checking for socklen_t in sys/socket.h""... $ac_c" 1>&6 ! echo "configure:5656: checking for socklen_t in sys/socket.h" >&5 cat > conftest.$ac_ext < --- 6119,6127 ---- rm -f conftest* echo $ac_n "checking for socklen_t in sys/socket.h""... $ac_c" 1>&6 ! echo "configure:6123: checking for socklen_t in sys/socket.h" >&5 cat > conftest.$ac_ext < *************** int main() { *** 5663,5669 **** socklen_t x = 5; ; return 0; } EOF ! if { (eval echo configure:5667: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_SOCKLEN_T 1 --- 6130,6136 ---- socklen_t x = 5; ; return 0; } EOF ! if { (eval echo configure:6134: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_SOCKLEN_T 1 *************** fi *** 5679,5694 **** rm -f conftest* echo $ac_n "checking for tm_gmtoff in struct tm""... $ac_c" 1>&6 ! echo "configure:5683: checking for tm_gmtoff in struct tm" >&5 cat > conftest.$ac_ext < int main() { struct tm tim; tim.tm_gmtoff = 0; ; return 0; } EOF ! if { (eval echo configure:5692: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define STRUCT_TM_HAS_GMTOFF 1 --- 6146,6161 ---- rm -f conftest* echo $ac_n "checking for tm_gmtoff in struct tm""... $ac_c" 1>&6 ! echo "configure:6150: checking for tm_gmtoff in struct tm" >&5 cat > conftest.$ac_ext < int main() { struct tm tim; tim.tm_gmtoff = 0; ; return 0; } EOF ! if { (eval echo configure:6159: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define STRUCT_TM_HAS_GMTOFF 1 *************** else *** 5701,5716 **** rm -rf conftest* echo "$ac_t""no" 1>&6 echo $ac_n "checking for global timezone variable""... $ac_c" 1>&6 ! echo "configure:5705: checking for global timezone variable" >&5 cat > conftest.$ac_ext < int main() { long z2 = timezone; ; return 0; } EOF ! if { (eval echo configure:5714: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TIMEZONE 1 --- 6168,6183 ---- rm -rf conftest* echo "$ac_t""no" 1>&6 echo $ac_n "checking for global timezone variable""... $ac_c" 1>&6 ! echo "configure:6172: checking for global timezone variable" >&5 cat > conftest.$ac_ext < int main() { long z2 = timezone; ; return 0; } EOF ! if { (eval echo configure:6181: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_TIMEZONE 1 *************** rm -f conftest* *** 5730,5748 **** # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 ! echo "configure:5734: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF ! if { (eval echo configure:5746: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else --- 6197,6215 ---- # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 ! echo "configure:6201: checking for working alloca.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { char *p = alloca(2 * sizeof(int)); ; return 0; } EOF ! if { (eval echo configure:6213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_header_alloca_h=yes else *************** EOF *** 5763,5774 **** fi echo $ac_n "checking for alloca""... $ac_c" 1>&6 ! echo "configure:5767: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:6234: checking for alloca" >&5 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else --- 6263,6269 ---- char *p = (char *) alloca(1); ; return 0; } EOF ! if { (eval echo configure:6267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_func_alloca_works=yes else *************** EOF *** 5828,5839 **** echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 ! echo "configure:5832: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:6299: checking whether alloca needs Cray hooks" >&5 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 *** 5858,5869 **** if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:5862: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:6329: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 6353,6359 ---- ; return 0; } EOF ! if { (eval echo configure:6357: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 5913,5919 **** fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 ! echo "configure:5917: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 6380,6386 ---- fi echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 ! echo "configure:6384: checking stack direction for C alloca" >&5 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 5921,5927 **** ac_cv_c_stack_direction=0 else cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else --- 6407,6413 ---- exit (find_stack_direction() < 0); } EOF ! if { (eval echo configure:6411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_c_stack_direction=1 else *************** do *** 5967,5973 **** # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:5971: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_PERL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 6434,6440 ---- # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:6438: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_PERL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** case "${host}" in *** 6004,6022 **** i?86-*-linux*) SIGNAL_HANDLER=include/i386-signal.h ;; ! sparc-sun-solaris*) SIGNAL_HANDLER=include/sparc-signal.h ;; # ia64-*) # SYSDEP_SOURCES=sysdep/ia64.c # test -d sysdep || mkdir sysdep # ;; powerpc-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; alpha*-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; *) SIGNAL_HANDLER=include/default-signal.h ;; --- 6471,6498 ---- i?86-*-linux*) SIGNAL_HANDLER=include/i386-signal.h ;; ! sparc*-sun-solaris*) SIGNAL_HANDLER=include/sparc-signal.h ;; # ia64-*) # SYSDEP_SOURCES=sysdep/ia64.c # test -d sysdep || mkdir sysdep # ;; + ia64-*-linux*) + SIGNAL_HANDLER=include/dwarf2-signal.h + ;; powerpc-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; alpha*-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; + sparc*-*-linux*) + SIGNAL_HANDLER=include/dwarf2-signal.h + ;; + *mingw*) + SIGNAL_HANDLER=include/win32-signal.h + ;; *) SIGNAL_HANDLER=include/default-signal.h ;; *************** fi *** 6042,6048 **** # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 ! echo "configure:6046: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then --- 6518,6524 ---- # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 ! echo "configure:6522: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then *************** if test "$ac_x_includes" = NO; then *** 6104,6115 **** # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:6113: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 6580,6591 ---- # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:6589: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** if test "$ac_x_libraries" = NO; then *** 6178,6191 **** ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. --- 6654,6667 ---- ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. *************** else *** 6291,6307 **** case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 ! echo "configure:6295: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_nospace=yes else --- 6767,6783 ---- case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 ! echo "configure:6771: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_nospace=yes else *************** rm -f conftest* *** 6317,6330 **** else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_space=yes else --- 6793,6806 ---- else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_R_space=yes else *************** rm -f conftest* *** 6356,6362 **** # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 ! echo "configure:6360: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 6832,6838 ---- # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 ! echo "configure:6836: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 6364,6370 **** ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 6851,6857 ---- dnet_ntoa() ; return 0; } EOF ! if { (eval echo configure:6855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 6397,6403 **** if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 ! echo "configure:6401: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 6873,6879 ---- if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 ! echo "configure:6877: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 6405,6411 **** ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 6892,6898 ---- dnet_ntoa() ; return 0; } EOF ! if { (eval echo configure:6896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 6445,6456 **** # The nsl library prevents programs from opening the X display # on Irix 5.2, according to dickey@clark.net. echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 ! echo "configure:6449: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:6925: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else --- 6949,6955 ---- ; return 0; } EOF ! if { (eval echo configure:6953: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else *************** fi *** 6494,6500 **** if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 ! echo "configure:6498: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 6970,6976 ---- if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 ! echo "configure:6974: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 6502,6508 **** ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 6989,6995 ---- gethostbyname() ; return 0; } EOF ! if { (eval echo configure:6993: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 6543,6554 **** # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 ! echo "configure:6547: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:7023: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else --- 7047,7053 ---- ; return 0; } EOF ! if { (eval echo configure:7051: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_connect=yes" else *************** fi *** 6592,6598 **** if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 ! echo "configure:6596: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 7068,7074 ---- if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 ! echo "configure:7072: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 6600,6606 **** ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 7087,7093 ---- connect() ; return 0; } EOF ! if { (eval echo configure:7091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 6635,6646 **** # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 ! echo "configure:6639: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:7115: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_remove=yes" else --- 7139,7145 ---- ; return 0; } EOF ! if { (eval echo configure:7143: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_remove=yes" else *************** fi *** 6684,6690 **** if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 ! echo "configure:6688: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 7160,7166 ---- if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 ! echo "configure:7164: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 6692,6698 **** ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 7179,7185 ---- remove() ; return 0; } EOF ! if { (eval echo configure:7183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 6727,6738 **** # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 ! echo "configure:6731: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:7207: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else --- 7231,7237 ---- ; return 0; } EOF ! if { (eval echo configure:7235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else *************** fi *** 6776,6782 **** if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 ! echo "configure:6780: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 7252,7258 ---- if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 ! echo "configure:7256: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 6784,6790 **** ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 7271,7277 ---- shmat() ; return 0; } EOF ! if { (eval echo configure:7275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** fi *** 6828,6834 **** # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 ! echo "configure:6832: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 7304,7310 ---- # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 ! echo "configure:7308: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 6836,6842 **** ac_save_LIBS="$LIBS" LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 7323,7329 ---- IceConnectionNumber() ; return 0; } EOF ! if { (eval echo configure:7327: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** for peer in $peerlibs ; do *** 6896,6901 **** --- 7372,7382 ---- gtk) # Nothing, yet... ;; + no) + use_xlib_awt= + use_gtk_awt= + break + ;; *) echo "*** unrecognised argument \"${peer}\" for --enable-java-awt" 1>&2 exit 1 *************** done *** 7029,7035 **** ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" ! trap 'rm -fr `echo "Makefile libgcj.spec libgcj-test.spec gnu/classpath/Configuration.java gcj/Makefile include/Makefile testsuite/Makefile include/config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi --- 7778,7784 ---- if test "${CONFIG_HEADERS+set}" != set; then EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi *************** fi; done *** 7378,7385 **** EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF --- 7866,7873 ---- EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF *************** CXX="${CXX}" *** 7435,7460 **** EOF cat >> $CONFIG_STATUS <<\EOF ! test -z "$CONFIG_HEADERS" || echo timestamp > include/stamp-h ! if test -n "$CONFIG_FILES"; then ! ac_file=Makefile . ${libgcj_basedir}/../config-ml.in ! fi # Make subdirectories and `.d' files. Look in both srcdir and # builddir for the .java files. h=`pwd` : > deps.mk ! ( (cd $srcdir && find . -name '*.java' -print) ; ! find . -name '*.java' -print) | \ fgrep -v testsuite | \ ! sed -e 's/\.java/.d/' | \ while read f; do echo "include $f" >> deps.mk test -f $f || { d=`echo $f | sed -e 's,/[^/]*$,,'` ! $libgcj_basedir/../mkinstalldirs $d echo > $f } done --- 7923,7962 ---- EOF cat >> $CONFIG_STATUS <<\EOF ! am_indx=1 ! for am_file in include/config.h gcj/libgcj-config.h; do ! case " $CONFIG_HEADERS " in ! *" $am_file "*) ! echo timestamp > `echo $am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx ! ;; ! esac ! am_indx=`expr "$am_indx" + 1` ! done ! # Only add multilib support code if we just rebuilt top-level Makefile. ! case " $CONFIG_FILES " in ! *" Makefile "*) ! LD="${ORIGINAL_LD_FOR_MULTILIBS}" ! ac_file=Makefile . ${libgcj_basedir}/../config-ml.in ! ;; ! esac # Make subdirectories and `.d' files. Look in both srcdir and # builddir for the .java files. h=`pwd` : > deps.mk ! ( (cd $srcdir && find . \( -name '*.java' -o -name '*.cc' \) -print) ; ! find . \( -name '*.java' -o -name '*.cc' \) -print) | \ fgrep -v testsuite | \ ! sed -e 's/\.java/.d/'\;'s/\.cc/.d/' | \ while read f; do echo "include $f" >> deps.mk test -f $f || { d=`echo $f | sed -e 's,/[^/]*$,,'` ! if test ! -d $d; then ! $libgcj_basedir/../mkinstalldirs $d ! fi; echo > $f } done diff -Nrc3pad gcc-3.0.4/libjava/configure.host gcc-3.1/libjava/configure.host *** gcc-3.0.4/libjava/configure.host Wed Jun 13 20:56:26 2001 --- gcc-3.1/libjava/configure.host Sun Apr 21 09:35:59 2002 *************** *** 18,29 **** --- 18,44 ---- # libgcj_cflags Special CFLAGS to use when building # libgcj_cxxflags Special CXXFLAGS to use when building # libgcj_javaflags Special JAVAFLAGS to use when building + # libgcj_interpreter If the bytecode interpreter supports this platform. + # enable_java_net_default If java.net native code should be enabled by + # default. + # enable_hash_synchronization_default If hash synchronization should be + # enabled by default. + # sysdeps_dir Directory containing system-dependent headers + # slow_pthread_self The synchronization code should try to avoid + # pthread_self calls by caching thread IDs in a hashtable + # can_unwind_signal Set to "yes" if the EH unwinder supports throwing + # from a signal handler. libgcj_flags= libgcj_cflags= libgcj_cxxflags= libgcj_javaflags= libgcj_interpreter= + enable_java_net_default=yes + enable_hash_synchronization_default=no + sysdeps_dir=generic + slow_pthread_self= + can_unwind_signal=no case "${target_optspace}:${host}" in yes:*) *************** echo "$target" *** 46,52 **** --- 61,69 ---- DIVIDESPEC=-fuse-divide-subroutine EXCEPTIONSPEC=-fnon-call-exceptions + CHECKREFSPEC= + # This case statement supports per-CPU defaults. case "${host}" in mips-tx39-*|mipstx39-unknown-*) libgcj_flags="${libgcj_flags} -G 0" *************** case "${host}" in *** 54,80 **** --- 71,140 ---- AM_RUNTESTFLAGS="--target_board=jmr3904-sim" # Use "Ecos" processes since they are a no-op. PROCESS=Ecos + FILE=Posix enable_java_net_default=no enable_getenv_properties_default=no ;; i686-*|i586-*|i486-*|i386-*) + sysdeps_dir=i386 libgcj_flags="${libgcj_flags} -ffloat-store" libgcj_interpreter=yes libgcj_cxxflags="-D__NO_MATH_INLINES" libgcj_cflags="-D__NO_MATH_INLINES" + DIVIDESPEC=-fno-use-divide-subroutine + enable_hash_synchronization_default=yes + slow_pthread_self=yes ;; alpha*-*) + sysdeps_dir=alpha libgcj_flags="${libgcj_flags} -mieee" libgcj_interpreter=yes + enable_hash_synchronization_default=yes ;; powerpc*-*) + sysdeps_dir=powerpc libgcj_interpreter=yes + enable_hash_synchronization_default=yes + slow_pthread_self=yes ;; sparc-*) ;; ia64-*) + sysdeps_dir=ia64 libgcj_flags="${libgcj_flags} -funwind-tables" libgcj_interpreter=yes + enable_hash_synchronization_default=yes + ;; + xscale*-elf) + with_libffi_default=no + PROCESS=Ecos + FILE=Posix + CHECKREFSPEC=-fcheck-references + EXCEPTIONSPEC= + enable_java_net_default=no + enable_getenv_properties_default=no + enable_main_args_default=no + ;; + esac + + # This case statement supports generic port properties and may refine + # the above per-CPU defaults. Note: If your OS implements + # MD_FALLBACK_FRAME_STATE_FOR, then you want to set can_unwind_signal + # here. + case "${host}" in + i[34567]86*-linux* | \ + powerpc*-linux* | \ + alpha*-linux* | \ + sparc*-linux* | \ + ia64-*) + can_unwind_signal=yes + ;; + *-*-darwin*) + enable_hash_synchronization_default=no + slow_pthread_self= + ;; + *-*-freebsd*) + slow_pthread_self= ;; esac diff -Nrc3pad gcc-3.0.4/libjava/configure.in gcc-3.1/libjava/configure.in *** gcc-3.0.4/libjava/configure.in Wed Aug 1 17:49:13 2001 --- gcc-3.1/libjava/configure.in Wed May 8 04:26:24 2002 *************** *** 1,6 **** --- 1,12 ---- dnl Process this with autoconf to create configure AC_INIT(java/lang/System.java) + # This works around the fact that libtool configuration may change LD + # for this particular configuration, but some shells, instead of + # keeping the changes in LD private, export them just because LD is + # exported. + ORIGINAL_LD_FOR_MULTILIBS=$LD + AC_PROG_LN_S dnl We use these options to decide which functions to include. *************** AC_ARG_WITH(cross-host, *** 12,18 **** LIBGCJ_CONFIGURE(.) ! AM_CONFIG_HEADER(include/config.h) # Only use libltdl for native builds. if test -z "${with_cross_host}"; then --- 18,24 ---- LIBGCJ_CONFIGURE(.) ! AM_CONFIG_HEADER(include/config.h gcj/libgcj-config.h) # Only use libltdl for native builds. if test -z "${with_cross_host}"; then *************** AC_SUBST(COMPPATH) *** 42,54 **** dnl The -no-testsuite modules omit the test subdir. AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite) - dnl See whether the user prefers size or speed for Character. - dnl The default is size. - AC_ARG_ENABLE(fast-character, - [ --enable-fast-character prefer speed over size for Character], - # Nothing - , AC_DEFINE(COMPACT_CHARACTER)) - dnl Should the runtime set system properties by examining the dnl environment variable GCJ_PROPERTIES? AC_ARG_ENABLE(getenv-properties, --- 48,53 ---- *************** AC_ARG_ENABLE(getenv-properties, *** 56,68 **** don't set system properties from GCJ_PROPERTIES]) dnl Whether GCJ_PROPERTIES is used depends on the target. ! if test -n "$enable_getenv_properties"; then enable_getenv_properties=${enable_getenv_properties_default-yes} fi if test "$enable_getenv_properties" = no; then AC_DEFINE(DISABLE_GETENV_PROPERTIES) fi dnl See if the user has requested runtime debugging. LIBGCJDEBUG="false" AC_SUBST(LIBGCJDEBUG) --- 55,94 ---- don't set system properties from GCJ_PROPERTIES]) dnl Whether GCJ_PROPERTIES is used depends on the target. ! if test -z "$enable_getenv_properties"; then enable_getenv_properties=${enable_getenv_properties_default-yes} fi if test "$enable_getenv_properties" = no; then AC_DEFINE(DISABLE_GETENV_PROPERTIES) fi + dnl Whether we should use arguments to main() + if test -z "$enable_main_args"; then + enable_main_args=${enable_main_args_default-yes} + fi + if test "$enable_main_args" = no; then + AC_DEFINE(DISABLE_MAIN_ARGS) + fi + + + dnl Should we use hashtable-based synchronization? + dnl Currently works only for Linux X86/ia64 + dnl Typically faster and more space-efficient + AC_ARG_ENABLE(hash-synchronization, + [ --enable-hash-synchronization + Use global hash table for monitor locks]) + + if test -z "$enable_hash_synchronization"; then + enable_hash_synchronization=$enable_hash_synchronization_default + fi + + dnl configure.host sets slow_pthread_self if the synchronization code should + dnl try to avoid pthread_self calls by caching thread IDs in a hashtable. + if test "${slow_pthread_self}" = "yes"; then + AC_DEFINE(SLOW_PTHREAD_SELF) + fi + + dnl See if the user has requested runtime debugging. LIBGCJDEBUG="false" AC_SUBST(LIBGCJDEBUG) *************** fi *** 133,147 **** AC_LANG_RESTORE AC_MSG_RESULT($ac_exception_model_name) ! AC_MSG_CHECKING([for data_start]) ! LIBDATASTARTSPEC= ! NEEDS_DATA_START= ! AC_TRY_LINK([extern int data_start;], [return ((int) &data_start);], ! [AC_MSG_RESULT(found it)], ! [LIBDATASTARTSPEC="-u data_start libgcjdata.a%s" ! NEEDS_DATA_START=yes ! AC_MSG_RESULT(missing)]) ! AC_SUBST(LIBDATASTARTSPEC) dnl See if the user wants to disable java.net. This is the mildly dnl ugly way that we admit that target-side configuration sucks. --- 159,171 ---- AC_LANG_RESTORE AC_MSG_RESULT($ac_exception_model_name) ! # If we are non using SJLJ exceptions, and this host does not have support ! # for unwinding from a signal handler, enable checked dereferences and divides. ! if test $can_unwind_signal = no && test $enable_sjlj_exceptions = no; then ! CHECKREFSPEC=-fcheck-references ! DIVIDESPEC=-fuse-divide-subroutine ! EXCEPTIONSPEC= ! fi dnl See if the user wants to disable java.net. This is the mildly dnl ugly way that we admit that target-side configuration sucks. *************** AC_ARG_ENABLE(java-net, *** 149,161 **** [ --disable-java-net disable java.net]) dnl Whether java.net is built by default can depend on the target. ! if test -n "$enable_java_net"; then enable_java_net=${enable_java_net_default-yes} fi if test "$enable_java_net" = no; then AC_DEFINE(DISABLE_JAVA_NET) fi dnl See if the user wants to disable JVMPI support. AC_ARG_ENABLE(jvmpi, [ --disable-jvmpi disable JVMPI support]) --- 173,201 ---- [ --disable-java-net disable java.net]) dnl Whether java.net is built by default can depend on the target. ! if test -z "$enable_java_net"; then enable_java_net=${enable_java_net_default-yes} fi if test "$enable_java_net" = no; then AC_DEFINE(DISABLE_JAVA_NET) fi + dnl See if the user wants to configure without libffi. Some + dnl architectures don't support it, and default values are set in + dnl configure.host. + AC_ARG_WITH(libffi, + [ --without-libffi don't use libffi],,with_libffi=${with_libffi_default-yes}) + + LIBFFI= + LIBFFIINCS= + if test "$with_libffi" != no; then + AC_DEFINE(USE_LIBFFI) + LIBFFI=../libffi/libffi_convenience.la + LIBFFIINCS='-I$(top_srcdir)/../libffi/include -I$(MULTIBUILDTOP)../libffi/include' + fi + AC_SUBST(LIBFFI) + AC_SUBST(LIBFFIINCS) + dnl See if the user wants to disable JVMPI support. AC_ARG_ENABLE(jvmpi, [ --disable-jvmpi disable JVMPI support]) *************** dnl If the target is an eCos system, use *** 168,190 **** dnl I/O routines. dnl FIXME: this should not be a local option but a global target dnl system; at present there is no eCos target. ! TARGET_ECOS="no" AC_ARG_WITH(ecos, [ --with-ecos enable runtime eCos target support], TARGET_ECOS="$with_ecos" ) case "$TARGET_ECOS" in ! no) ! FILE_DESCRIPTOR=natFileDescriptorPosix.cc ! PROCESS=${PROCESS-Posix} ;; *) ! FILE_DESCRIPTOR=natFileDescriptorEcos.cc ! PROCESS=Ecos AC_DEFINE(ECOS) ;; esac AC_EGREP_HEADER(uint32_t, stdint.h, AC_DEFINE(HAVE_INT32_DEFINED)) AC_EGREP_HEADER(uint32_t, inttypes.h, AC_DEFINE(HAVE_INT32_DEFINED)) --- 208,243 ---- dnl I/O routines. dnl FIXME: this should not be a local option but a global target dnl system; at present there is no eCos target. ! TARGET_ECOS=${PROCESS-"no"} AC_ARG_WITH(ecos, [ --with-ecos enable runtime eCos target support], TARGET_ECOS="$with_ecos" ) + PLATFORMOBJS= case "$TARGET_ECOS" in ! no) case "$host" in ! *mingw*) ! PLATFORM=Win32 ! PLATFORMOBJS=win32.lo ! PLATFORMH=win32.h ! ;; ! *) ! PLATFORM=Posix ! PLATFORMOBJS=posix.lo ! PLATFORMH=posix.h ! ;; ! esac ;; *) ! PLATFORM=Ecos AC_DEFINE(ECOS) + PLATFORMOBJS=posix.lo + PLATFORMH=posix.h ;; esac + AC_SUBST(PLATFORMOBJS) + AC_LINK_FILES(include/$PLATFORMH, include/platform.h) AC_EGREP_HEADER(uint32_t, stdint.h, AC_DEFINE(HAVE_INT32_DEFINED)) AC_EGREP_HEADER(uint32_t, inttypes.h, AC_DEFINE(HAVE_INT32_DEFINED)) *************** dnl to create the link will fail. *** 202,215 **** test -d java || mkdir java test -d java/io || mkdir java/io test -d gnu || mkdir gnu ! AC_LINK_FILES(java/io/$FILE_DESCRIPTOR, java/io/natFileDescriptor.cc) dnl Likewise for ConcreteProcess.java and natConcreteProcess.cc. test -d java/lang || mkdir java/lang ! AC_LINK_FILES(java/lang/${PROCESS}Process.java, java/lang/ConcreteProcess.java) ! AC_LINK_FILES(java/lang/nat${PROCESS}Process.cc, java/lang/natConcreteProcess.cc) ! SYSTEMSPEC= AC_SUBST(SYSTEMSPEC) LIBGCJTESTSPEC="-L`pwd`/.libs -rpath `pwd`/.libs" --- 255,276 ---- test -d java || mkdir java test -d java/io || mkdir java/io test -d gnu || mkdir gnu ! AC_LINK_FILES(java/io/natFile${FILE-${PLATFORM}}.cc, java/io/natFile.cc) ! AC_LINK_FILES(java/io/natFileDescriptor${FILE-${PLATFORM}}.cc, java/io/natFileDescriptor.cc) dnl Likewise for ConcreteProcess.java and natConcreteProcess.cc. test -d java/lang || mkdir java/lang ! AC_LINK_FILES(java/lang/${PLATFORM}Process.java, java/lang/ConcreteProcess.java) ! AC_LINK_FILES(java/lang/nat${PLATFORM}Process.cc, java/lang/natConcreteProcess.cc) ! case "${host}" in ! *mingw*) ! SYSTEMSPEC="-lgdi32 -lwsock32 -lws2_32" ! ;; ! *) ! SYSTEMSPEC= ! ;; ! esac AC_SUBST(SYSTEMSPEC) LIBGCJTESTSPEC="-L`pwd`/.libs -rpath `pwd`/.libs" *************** GCTESTSPEC= *** 243,256 **** case "$GC" in boehm) AC_MSG_RESULT(boehm) ! GCDEPS='$(top_builddir)/../boehm-gc/libgcjgc.la' ! # We include the path to the boehm-gc build directory. ! # See Makefile.am to understand why. ! GCLIBS="$GCDEPS -L\$(here)/../boehm-gc/$libsubdir" ! GCINCS='-I$(top_srcdir)/../boehm-gc -I$(top_builddir)/../boehm-gc' ! GCSPEC='-lgcjgc' JC1GCSPEC='-fuse-boehm-gc' GCTESTSPEC="-L`pwd`/../boehm-gc/.libs -rpath `pwd`/../boehm-gc/.libs" dnl We also want to pick up some cpp flags required when including dnl boehm-config.h. Yuck. GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`" --- 304,314 ---- case "$GC" in boehm) AC_MSG_RESULT(boehm) ! GCLIBS=../boehm-gc/libgcjgc_convenience.la ! GCINCS='-I$(top_srcdir)/../boehm-gc/include' JC1GCSPEC='-fuse-boehm-gc' GCTESTSPEC="-L`pwd`/../boehm-gc/.libs -rpath `pwd`/../boehm-gc/.libs" + dnl We also want to pick up some cpp flags required when including dnl boehm-config.h. Yuck. GCINCS="$GCINCS `cat ../boehm-gc/boehm-cflags`" *************** case "$THREADS" in *** 294,300 **** ;; esac ;; ! decosf1 | irix | mach | os2 | solaris | win32 | dce | vxworks) AC_MSG_ERROR(thread package $THREADS not yet supported) ;; *) --- 352,360 ---- ;; esac ;; ! win32) ! ;; ! decosf1 | irix | mach | os2 | solaris | dce | vxworks) AC_MSG_ERROR(thread package $THREADS not yet supported) ;; *) *************** case "$THREADS" in *** 302,307 **** --- 362,368 ---- ;; esac + THREADLDFLAGS= THREADLIBS= THREADINCS= THREADDEPS= *************** THREADH= *** 310,317 **** THREADSPEC= case "$THREADS" in posix) ! THREADLIBS=-lpthread ! THREADSPEC=-lpthread THREADOBJS=posix-threads.lo THREADH=posix-threads.h # MIT pthreads doesn't seem to have the mutexattr functions. --- 371,406 ---- THREADSPEC= case "$THREADS" in posix) ! case "$host" in ! *-*-cygwin*) ! # Don't set THREADLIBS here. Cygwin doesn't have -lpthread. ! ;; ! changequote(<<,>>) ! *-*-freebsd[1234]*) ! changequote([,]) ! # Before FreeBSD 5, it didn't have -lpthread (or any library which ! # merely adds pthread_* functions) but it does have a -pthread switch ! # which is required at link-time to select -lc_r *instead* of -lc. ! THREADLDFLAGS=-pthread ! # Don't set THREADSPEC here as might be expected since -pthread is ! # not processed when found within a spec file, it must come from ! # the command line. For now, the user must provide the -pthread ! # switch to link code compiled with gcj. In future, consider adding ! # support for weak references to pthread_* functions ala gthr.h API. ! THREADSPEC='%{!pthread: %eUnder this configuration, the user must provide -pthread when linking.}' ! ;; ! *-*-freebsd*) ! # FreeBSD 5 implements a model much closer to other modern UNIX ! # which support threads. However, it still does not support ! # -lpthread. ! THREADLDFLAGS=-pthread ! THREADSPEC=-lc_r ! ;; ! *) ! THREADLIBS=-lpthread ! THREADSPEC=-lpthread ! ;; ! esac THREADOBJS=posix-threads.lo THREADH=posix-threads.h # MIT pthreads doesn't seem to have the mutexattr functions. *************** case "$THREADS" in *** 327,332 **** --- 416,426 ---- AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Required define if using POSIX threads]) ;; + win32) + THREADOBJS=win32-threads.lo + THREADH=win32-threads.h + ;; + none) THREADOBJS=no-threads.lo THREADH=no-threads.h *************** AC_SUBST(THREADINCS) *** 338,343 **** --- 432,450 ---- AC_SUBST(THREADDEPS) AC_SUBST(THREADOBJS) AC_SUBST(THREADSPEC) + AC_SUBST(THREADLDFLAGS) + + if test -d sysdep; then true; else mkdir sysdep; fi + AC_LINK_FILES(sysdep/$sysdeps_dir/locks.h, sysdep/locks.h) + + HASH_SYNC_SPEC= + # Hash synchronization is only useful with posix threads right now. + if test "$enable_hash_synchronization" = yes && test "$THREADS" = "posix"; then + HASH_SYNC_SPEC=-fhash-synchronization + AC_DEFINE(JV_HASH_SYNCHRONIZATION, 1, [Define if hash synchronization is in use]) + fi + AC_SUBST(HASH_SYNC_SPEC) + AM_CONDITIONAL(USING_GCC, test "$GCC" = yes) *************** CANADIAN=no *** 345,363 **** NULL_TARGET=no NATIVE=yes ! # Find unwind.h and support headers. If we're in the tree with ! # gcc, then look there. Otherwise look in compat-include. If all else ! # fails, just hope the user has set things up somehow. ! echo "probing $srcdir/../gcc/unwind.h" ! if test -r $libgcj_basedir/../gcc/unwind.h; then ! GCC_UNWIND_INCLUDE='-I$(libgcj_basedir)/../gcc' ! else ! if test -d $srcdir/../compat-include; then ! GCC_UNWIND_INCLUDE='-I$(top_srcdir)/../compat-include' ! else ! GCC_UNWIND_INCLUDE= ! fi ! fi if test -n "${with_cross_host}"; then # We are being configured with a cross compiler. AC_REPLACE_FUNCS --- 452,469 ---- NULL_TARGET=no NATIVE=yes ! # We're in the tree with gcc, and need to include some of its headers. ! GCC_UNWIND_INCLUDE='-I$(libgcj_basedir)/../gcc' ! ! # Figure out where generated headers like libgcj-config.h get installed. ! changequote(,)dnl ! gcc_version_trigger=${libgcj_basedir}/../gcc/version.c ! gcc_version_full=`grep version_string ${gcc_version_trigger} | sed -e 's/.*\"\([^\"]*\)\".*/\1/'` ! gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'` ! tool_include_dir='$(libdir)/gcc-lib/$(target_alias)/'${gcc_version}/include ! changequote([,])dnl ! AC_SUBST(tool_include_dir) ! AC_SUBST(gcc_version) if test -n "${with_cross_host}"; then # We are being configured with a cross compiler. AC_REPLACE_FUNCS *************** if test -n "${with_cross_host}"; then *** 369,374 **** --- 475,481 ---- AC_DEFINE(HAVE_MEMMOVE) AC_DEFINE(HAVE_MEMCPY) AC_DEFINE(HAVE_STRERROR) + AC_DEFINE(HAVE_TIME) AC_DEFINE(HAVE_GMTIME_R) AC_DEFINE(HAVE_LOCALTIME_R) dnl This is only for POSIX threads. *************** if test -n "${with_cross_host}"; then *** 379,387 **** dnl Assume we do not have getuid and friends. AC_DEFINE(NO_GETUID) - ZLIBSPEC=-lzgcj - ZLIBTESTSPEC="-L`pwd`/../zlib/.libs -rpath `pwd`/../zlib/.libs" - # If Canadian cross, then don't pick up tools from the build # directory. if test x"$build" != x"$with_cross_host" && x"$build" != x"$target"; then --- 486,491 ---- *************** if test -n "${with_cross_host}"; then *** 391,410 **** fi NATIVE=no else ! AC_CHECK_FUNCS(strerror ioctl select fstat open fsync sleep) AC_CHECK_FUNCS(gmtime_r localtime_r readdir_r getpwuid_r getcwd) AC_CHECK_FUNCS(access stat mkdir rename rmdir unlink realpath utime chmod) AC_CHECK_FUNCS(nl_langinfo setlocale) AC_CHECK_FUNCS(inet_aton inet_addr, break) AC_CHECK_FUNCS(inet_pton uname inet_ntoa) ! AC_CHECK_FUNCS(backtrace fork execvp pipe) AC_CHECK_HEADERS(execinfo.h unistd.h dlfcn.h) AC_CHECK_LIB(dl, dladdr, [ AC_DEFINE(HAVE_DLADDR)]) AC_CHECK_FILES(/proc/self/exe, [ AC_DEFINE(HAVE_PROC_SELF_EXE)]) AM_ICONV AC_CHECK_FUNCS(gethostbyname_r, [ AC_DEFINE(HAVE_GETHOSTBYNAME_R) --- 495,527 ---- fi NATIVE=no else ! AC_CHECK_FUNCS(strerror ioctl select fstat open fsync sleep opendir) AC_CHECK_FUNCS(gmtime_r localtime_r readdir_r getpwuid_r getcwd) AC_CHECK_FUNCS(access stat mkdir rename rmdir unlink realpath utime chmod) AC_CHECK_FUNCS(nl_langinfo setlocale) AC_CHECK_FUNCS(inet_aton inet_addr, break) AC_CHECK_FUNCS(inet_pton uname inet_ntoa) ! AC_CHECK_FUNCS(fork execvp pipe sigaction) AC_CHECK_HEADERS(execinfo.h unistd.h dlfcn.h) + AC_CHECK_FUNC(backtrace, [ + case "$host" in + ia64-*-linux*) + # Has broken backtrace() + ;; + *) + AC_DEFINE(HAVE_BACKTRACE) + ;; + esac + ]) + AC_CHECK_LIB(dl, dladdr, [ AC_DEFINE(HAVE_DLADDR)]) AC_CHECK_FILES(/proc/self/exe, [ AC_DEFINE(HAVE_PROC_SELF_EXE)]) AM_ICONV + AM_LC_MESSAGES + AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gethostbyname_r, [ AC_DEFINE(HAVE_GETHOSTBYNAME_R) *************** else *** 455,467 **** fi ]) AC_CHECK_FUNCS(gethostbyaddr_r, [ AC_DEFINE(HAVE_GETHOSTBYADDR_R) # There are two different kinds of gethostbyaddr_r. # We look for the one that returns `int'. # Hopefully this check is robust enough. AC_EGREP_HEADER(int.*gethostbyaddr_r, netdb.h, [ ! AC_DEFINE(GETHOSTBYADDR_R_RETURNS_INT)])]) AC_CHECK_FUNCS(gethostname, [ AC_DEFINE(HAVE_GETHOSTNAME) --- 572,590 ---- fi ]) + # FIXME: libjava source code expects to find a prototype for + # gethostbyaddr_r in netdb.h. The outer check ensures that + # HAVE_GETHOSTBYADDR_R will not be defined if the prototype fails + # to exist where expected. (The root issue: AC_CHECK_FUNCS assumes C + # linkage check is enough, yet C++ code requires proper prototypes.) + AC_EGREP_HEADER(gethostbyaddr_r, netdb.h, [ AC_CHECK_FUNCS(gethostbyaddr_r, [ AC_DEFINE(HAVE_GETHOSTBYADDR_R) # There are two different kinds of gethostbyaddr_r. # We look for the one that returns `int'. # Hopefully this check is robust enough. AC_EGREP_HEADER(int.*gethostbyaddr_r, netdb.h, [ ! AC_DEFINE(GETHOSTBYADDR_R_RETURNS_INT)])])]) AC_CHECK_FUNCS(gethostname, [ AC_DEFINE(HAVE_GETHOSTNAME) *************** else *** 516,521 **** --- 639,647 ---- AC_MSG_ERROR([memcpy is required]) fi + AC_CHECK_LIB(dl, dlopen, [ + AC_DEFINE(HAVE_DLOPEN, 1, [Define if dlopen is available])]) + # Some library-finding code we stole from Tcl. #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. *************** else *** 567,576 **** SYSTEMSPEC="$SYSTEMSPEC $gcj_cv_lib_sockets" if test "$with_system_zlib" = yes; then ! AC_CHECK_LIB(z, deflate, ZLIBSPEC=-lz, ZLIBSPEC=-lzgcj) ! else ! ZLIBSPEC=-lzgcj ! ZLIBTESTSPEC="-L`pwd`/../zlib/.libs -rpath `pwd`/../zlib/.libs" fi # On Solaris, and maybe other architectures, the Boehm collector --- 693,699 ---- SYSTEMSPEC="$SYSTEMSPEC $gcj_cv_lib_sockets" if test "$with_system_zlib" = yes; then ! AC_CHECK_LIB(z, deflate, ZLIBSPEC=-lz, ZLIBSPEC=) fi # On Solaris, and maybe other architectures, the Boehm collector *************** LT_AC_PROG_GCJ *** 624,648 **** CPPFLAGS=$GCJ_SAVE_CPPFLAGS ! dnl FIXME: cross compilation ! AC_CHECK_SIZEOF(void *) ZLIBS= ! ZDEPS= ZINCS= ! if test "x$ZLIBSPEC" = "x-lzgcj"; then ! # We include the path to the zlib build directory. ! # See Makefile.am to understand why. ! ZDEPS='$(top_builddir)/../zlib/libzgcj.la' ! ZLIBS="$ZDEPS -L\$(here)/../zlib/$libsubdir" ZINCS='-I$(top_srcdir)/../zlib' else ! ZLIBS="$ZLIBSPEC" fi AC_SUBST(ZLIBS) ! AC_SUBST(ZDEPS) AC_SUBST(ZINCS) AC_SUBST(DIVIDESPEC) AC_SUBST(EXCEPTIONSPEC) AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes) --- 747,771 ---- CPPFLAGS=$GCJ_SAVE_CPPFLAGS ! AC_COMPILE_CHECK_SIZEOF(void *) ZLIBS= ! SYS_ZLIBS= ZINCS= ! ! if test -z "$ZLIBSPEC"; then ! # Use zlib from the GCC tree. ZINCS='-I$(top_srcdir)/../zlib' + ZLIBS=../zlib/libzgcj_convenience.la else ! # System's zlib. ! SYS_ZLIBS="$ZLIBSPEC" fi AC_SUBST(ZLIBS) ! AC_SUBST(SYS_ZLIBS) AC_SUBST(ZINCS) AC_SUBST(DIVIDESPEC) + AC_SUBST(CHECKREFSPEC) AC_SUBST(EXCEPTIONSPEC) AM_CONDITIONAL(CANADIAN, test "$CANADIAN" = yes) *************** AM_CONDITIONAL(USE_LIBDIR, test -z "$wit *** 652,665 **** AM_CONDITIONAL(NEEDS_DATA_START, test "$NEEDS_DATA_START" = yes && test "$NATIVE" = yes) AC_SUBST(GCC_UNWIND_INCLUDE) # Determine gcj version number. changequote(<<,>>) ! gcjvers="`$GCJ -v 2>&1 | sed -n 's/^.*version \([^ ]*\).*$/\1/p'`" changequote([,]) ! AC_DEFINE_UNQUOTED(GCJVERSION, "$gcjvers") AC_SUBST(GCJVERSION) ! ! AC_SUBST(AM_RUNTESTFLAGS) dnl Work around a g++ bug. Reported to gcc-bugs@gcc.gnu.org on Jan 22, 2000. AC_MSG_CHECKING([for g++ -ffloat-store bug]) --- 775,789 ---- AM_CONDITIONAL(NEEDS_DATA_START, test "$NEEDS_DATA_START" = yes && test "$NATIVE" = yes) AC_SUBST(GCC_UNWIND_INCLUDE) + AC_SUBST(AM_RUNTESTFLAGS) + # Determine gcj version number. changequote(<<,>>) ! gcjversion=`$GCJ -v 2>&1 | sed -n 's/^.*version \([^ ]*\).*$/\1/p'` changequote([,]) ! GCJVERSION=$gcjversion AC_SUBST(GCJVERSION) ! AC_DEFINE_UNQUOTED(GCJVERSION, "$GCJVERSION", [Short GCJ version]) dnl Work around a g++ bug. Reported to gcc-bugs@gcc.gnu.org on Jan 22, 2000. AC_MSG_CHECKING([for g++ -ffloat-store bug]) *************** CFLAGS="$save_CFLAGS" *** 674,683 **** dnl We check for sys/filio.h because Solaris 2.5 defines FIONREAD there. dnl On that system, sys/ioctl.h will not include sys/filio.h unless dnl BSD_COMP is defined; just including sys/filio.h is simpler. ! AC_CHECK_HEADERS(unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h inttypes.h stdint.h langinfo.h locale.h) dnl We avoid AC_HEADER_DIRENT since we really only care about dirent.h dnl for now. If you change this, you also must update natFile.cc. AC_CHECK_HEADERS(dirent.h) AC_CHECK_TYPE([ssize_t], [int]) --- 798,812 ---- dnl We check for sys/filio.h because Solaris 2.5 defines FIONREAD there. dnl On that system, sys/ioctl.h will not include sys/filio.h unless dnl BSD_COMP is defined; just including sys/filio.h is simpler. ! AC_CHECK_HEADERS(unistd.h bstring.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h stdint.h langinfo.h locale.h) dnl We avoid AC_HEADER_DIRENT since we really only care about dirent.h dnl for now. If you change this, you also must update natFile.cc. AC_CHECK_HEADERS(dirent.h) + AC_CHECK_HEADERS(inttypes.h, [ + AC_DEFINE(HAVE_INTTYPES_H, 1, [Define if is available]) + AC_DEFINE(JV_HAVE_INTTYPES_H, 1, [Define if is available]) + ]) + AC_HEADER_SYS_WAIT AC_CHECK_TYPE([ssize_t], [int]) *************** case "${host}" in *** 744,762 **** i?86-*-linux*) SIGNAL_HANDLER=include/i386-signal.h ;; ! sparc-sun-solaris*) SIGNAL_HANDLER=include/sparc-signal.h ;; # ia64-*) # SYSDEP_SOURCES=sysdep/ia64.c # test -d sysdep || mkdir sysdep # ;; powerpc-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; alpha*-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; *) SIGNAL_HANDLER=include/default-signal.h ;; --- 873,900 ---- i?86-*-linux*) SIGNAL_HANDLER=include/i386-signal.h ;; ! sparc*-sun-solaris*) SIGNAL_HANDLER=include/sparc-signal.h ;; # ia64-*) # SYSDEP_SOURCES=sysdep/ia64.c # test -d sysdep || mkdir sysdep # ;; + ia64-*-linux*) + SIGNAL_HANDLER=include/dwarf2-signal.h + ;; powerpc-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; alpha*-*-linux*) SIGNAL_HANDLER=include/dwarf2-signal.h ;; + sparc*-*-linux*) + SIGNAL_HANDLER=include/dwarf2-signal.h + ;; + *mingw*) + SIGNAL_HANDLER=include/win32-signal.h + ;; *) SIGNAL_HANDLER=include/default-signal.h ;; *************** for peer in $peerlibs ; do *** 800,805 **** --- 938,948 ---- gtk) # Nothing, yet... ;; + no) + use_xlib_awt= + use_gtk_awt= + break + ;; *) echo "*** unrecognised argument \"${peer}\" for --enable-java-awt" 1>&2 exit 1 *************** AC_SUBST(here) *** 817,841 **** AC_SUBST(GCJFLAGS) AC_OUTPUT(Makefile libgcj.spec libgcj-test.spec gnu/classpath/Configuration.java gcj/Makefile include/Makefile testsuite/Makefile, ! [if test -n "$CONFIG_FILES"; then ! ac_file=Makefile . ${libgcj_basedir}/../config-ml.in ! fi # Make subdirectories and `.d' files. Look in both srcdir and # builddir for the .java files. h=`pwd` : > deps.mk ! ( (cd $srcdir && find . -name '*.java' -print) ; ! find . -name '*.java' -print) | \ fgrep -v testsuite | \ ! sed -e 's/\.java/.d/' | \ while read f; do echo "include $f" >> deps.mk test -f $f || { changequote(<<,>>) d=`echo $f | sed -e 's,/[^/]*$,,'` changequote([,]) ! $libgcj_basedir/../mkinstalldirs $d echo > $f } done --- 960,990 ---- AC_SUBST(GCJFLAGS) AC_OUTPUT(Makefile libgcj.spec libgcj-test.spec gnu/classpath/Configuration.java gcj/Makefile include/Makefile testsuite/Makefile, ! [# Only add multilib support code if we just rebuilt top-level Makefile. ! case " $CONFIG_FILES " in ! *" Makefile "*) ! LD="${ORIGINAL_LD_FOR_MULTILIBS}" ! ac_file=Makefile . ${libgcj_basedir}/../config-ml.in ! ;; ! esac # Make subdirectories and `.d' files. Look in both srcdir and # builddir for the .java files. h=`pwd` : > deps.mk ! ( (cd $srcdir && find . \( -name '*.java' -o -name '*.cc' \) -print) ; ! find . \( -name '*.java' -o -name '*.cc' \) -print) | \ fgrep -v testsuite | \ ! sed -e 's/\.java/.d/'\;'s/\.cc/.d/' | \ while read f; do echo "include $f" >> deps.mk test -f $f || { changequote(<<,>>) d=`echo $f | sed -e 's,/[^/]*$,,'` changequote([,]) ! if test ! -d $d; then ! $libgcj_basedir/../mkinstalldirs $d ! fi; echo > $f } done diff -Nrc3pad gcc-3.0.4/libjava/defineclass.cc gcc-3.1/libjava/defineclass.cc *** gcc-3.0.4/libjava/defineclass.cc Sat Mar 3 07:27:58 2001 --- gcc-3.1/libjava/defineclass.cc Mon Dec 10 01:18:30 2001 *************** *** 1,6 **** // defineclass.cc - defining a class from .class format. ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // defineclass.cc - defining a class from .class format. ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 22,29 **** #include - #ifdef INTERPRETER - #include #include #include --- 22,27 ---- *************** details. */ *** 41,52 **** #include #include ! // we don't verify method names that match these. ! static _Jv_Utf8Const *clinit_name = _Jv_makeUtf8Const ("", 8); ! static _Jv_Utf8Const *init_name = _Jv_makeUtf8Const ("", 6); ! // these go in some seperate functions, to avoid having _Jv_InitClass // inserted all over the place. static void throw_internal_error (char *msg) __attribute__ ((__noreturn__)); --- 39,49 ---- #include #include ! using namespace gcj; + #ifdef INTERPRETER ! // these go in some separate functions, to avoid having _Jv_InitClass // inserted all over the place. static void throw_internal_error (char *msg) __attribute__ ((__noreturn__)); *************** static void throw_incompatible_class_cha *** 61,69 **** static void throw_class_circularity_error (jstring msg) __attribute__ ((__noreturn__)); - static jdouble long_bits_to_double (jlong); - static jfloat int_bits_to_float (jint); - /** * We define class reading using a class. It is practical, since then * the entire class-reader can be a friend of class Class (it needs to --- 58,63 ---- *************** struct _Jv_ClassReader { *** 274,303 **** */ }; - /* This is used for the isJavaIdentifierStart & isJavaIdentifierPart - methods, so we avoid doing _Jv_InitClass all the time */ - - static const java::lang::Character *character = 0; - static void prepare_character (); - void _Jv_DefineClass (jclass klass, jbyteArray data, jint offset, jint length) { - if (character == 0) - prepare_character (); - _Jv_ClassReader reader (klass, data, offset, length); reader.parse(); /* that's it! */ } - /** put it after _Jv_DefineClass, so it doesn't get inlined */ - static void prepare_character () - { - character = new java::lang::Character ('!'); - } - /** This section defines the parsing/scanning of the class data */ --- 268,282 ---- *************** _Jv_ClassReader::parse () *** 360,367 **** void _Jv_ClassReader::read_constpool () { ! tags = (unsigned char*) _Jv_AllocBytesChecked (pool_count); ! offsets = (unsigned int *) _Jv_AllocBytesChecked (sizeof (int) * pool_count) ; /** first, we scan the constant pool, collecting tags and offsets */ --- 339,346 ---- void _Jv_ClassReader::read_constpool () { ! tags = (unsigned char*) _Jv_AllocBytes (pool_count); ! offsets = (unsigned int *) _Jv_AllocBytes (sizeof (int) * pool_count) ; /** first, we scan the constant pool, collecting tags and offsets */ *************** void _Jv_ClassReader::read_methods () *** 506,515 **** check_tag (name_index, JV_CONSTANT_Utf8); prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8); ! handleMethod (i, access_flags, name_index, descriptor_index); ! for (int j = 0; j < attributes_count; j++) { read_one_method_attribute (i); --- 485,494 ---- check_tag (name_index, JV_CONSTANT_Utf8); prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8); ! handleMethod (i, access_flags, name_index, descriptor_index); ! for (int j = 0; j < attributes_count; j++) { read_one_method_attribute (i); *************** void _Jv_ClassReader::read_one_method_at *** 526,535 **** if (is_attribute_name (name, "Exceptions")) { ! /* we ignore this for now */ ! skip (length); } ! else if (is_attribute_name (name, "Code")) { int start_off = pos; --- 505,546 ---- if (is_attribute_name (name, "Exceptions")) { ! _Jv_Method *method = reinterpret_cast<_Jv_Method *> ! (&def->methods[method_index]); ! if (method->throws != NULL) ! throw_class_format_error ("only one Exceptions attribute allowed per method"); ! ! int num_exceptions = read2u (); ! // We use malloc here because the GC won't scan the method ! // objects. FIXME this means a memory leak if we GC a class. ! // (Currently we never do.) ! _Jv_Utf8Const **exceptions = ! (_Jv_Utf8Const **) _Jv_Malloc ((num_exceptions + 1) * sizeof (_Jv_Utf8Const *)); ! ! int out = 0; ! _Jv_word *pool_data = def->constants.data; ! for (int i = 0; i < num_exceptions; ++i) ! { ! try ! { ! int ndx = read2u (); ! // JLS 2nd Ed. 4.7.5 requires that the tag not be 0. ! if (ndx != 0) ! { ! check_tag (ndx, JV_CONSTANT_Class); ! exceptions[out++] = pool_data[ndx].utf8; ! } ! } ! catch (java::lang::Throwable *exc) ! { ! _Jv_Free (exceptions); ! throw exc; ! } ! } ! exceptions[out] = NULL; ! method->throws = exceptions; } ! else if (is_attribute_name (name, "Code")) { int start_off = pos; *************** void _Jv_ClassReader::read_one_method_at *** 556,562 **** if (start_pc > end_pc || start_pc < 0 ! || end_pc >= code_length || handler_pc >= code_length) throw_class_format_error ("erroneous exception handler info"); --- 567,575 ---- if (start_pc > end_pc || start_pc < 0 ! // END_PC can be equal to CODE_LENGTH. ! // See JVM Spec 4.7.4. ! || end_pc > code_length || handler_pc >= code_length) throw_class_format_error ("erroneous exception handler info"); *************** void _Jv_ClassReader::handleConstantPool *** 625,633 **** /** now, we actually define the class' constant pool */ // the pool is scanned explicitly by the collector ! jbyte *pool_tags = (jbyte*) _Jv_AllocBytesChecked (pool_count); _Jv_word *pool_data ! = (_Jv_word*) _Jv_AllocBytesChecked (pool_count * sizeof (_Jv_word)); def->constants.tags = pool_tags; def->constants.data = pool_data; --- 638,646 ---- /** now, we actually define the class' constant pool */ // the pool is scanned explicitly by the collector ! jbyte *pool_tags = (jbyte*) _Jv_AllocBytes (pool_count); _Jv_word *pool_data ! = (_Jv_word*) _Jv_AllocBytes (pool_count * sizeof (_Jv_word)); def->constants.tags = pool_tags; def->constants.data = pool_data; *************** _Jv_ClassReader::prepare_pool_entry (int *** 797,803 **** case JV_CONSTANT_Float: { ! jfloat f = int_bits_to_float ((jint) get4 (this_data)); _Jv_storeFloat (&pool_data[index], f); pool_tags[index] = JV_CONSTANT_Float; } --- 810,816 ---- case JV_CONSTANT_Float: { ! jfloat f = java::lang::Float::intBitsToFloat ((jint) get4 (this_data)); _Jv_storeFloat (&pool_data[index], f); pool_tags[index] = JV_CONSTANT_Float; } *************** _Jv_ClassReader::prepare_pool_entry (int *** 813,819 **** case JV_CONSTANT_Double: { ! jdouble d = long_bits_to_double ((jlong) get8 (this_data)); _Jv_storeDouble (&pool_data[index], d); pool_tags[index] = JV_CONSTANT_Double; } --- 826,833 ---- case JV_CONSTANT_Double: { ! jdouble d ! = java::lang::Double::longBitsToDouble ((jlong) get8 (this_data)); _Jv_storeDouble (&pool_data[index], d); pool_tags[index] = JV_CONSTANT_Double; } *************** _Jv_ClassReader::handleClassBegin *** 886,897 **** // interfaces have java.lang.Object as super. if (access_flags & Modifier::INTERFACE) { ! def->superclass = (jclass)&java::lang::Class::class$; } // FIXME: Consider this carefully! else if (!_Jv_equalUtf8Consts (def->name, ! java::lang::Class::class$.name)) { throw_no_class_def_found_error ("loading java.lang.Object"); } --- 900,911 ---- // interfaces have java.lang.Object as super. if (access_flags & Modifier::INTERFACE) { ! def->superclass = (jclass)&java::lang::Object::class$; } // FIXME: Consider this carefully! else if (!_Jv_equalUtf8Consts (def->name, ! java::lang::Object::class$.name)) { throw_no_class_def_found_error ("loading java.lang.Object"); } *************** _Jv_ClassReader::handleClassBegin *** 902,908 **** // to include references to this class. def->state = JV_STATE_PRELOADING; ! _Jv_RegisterClass (def); if (super_class != 0) { --- 916,926 ---- // to include references to this class. def->state = JV_STATE_PRELOADING; ! ! { ! JvSynchronize sync (&java::lang::Class::class$); ! _Jv_RegisterClass (def); ! } if (super_class != 0) { *************** _Jv_ClassReader::handleClassBegin *** 922,928 **** pool_data[super_class].clazz = the_super; pool_tags[super_class] = JV_CONSTANT_ResolvedClass; } ! // now we've come past the circularity problem, we can // now say that we're loading... --- 940,946 ---- pool_data[super_class].clazz = the_super; pool_tags[super_class] = JV_CONSTANT_ResolvedClass; } ! // now we've come past the circularity problem, we can // now say that we're loading... *************** _Jv_ClassReader::checkExtends (jclass su *** 965,971 **** void _Jv_ClassReader::handleInterfacesBegin (int count) { ! def->interfaces = (jclass*) _Jv_AllocBytesChecked (count*sizeof (jclass)); def->interface_count = count; } --- 983,989 ---- void _Jv_ClassReader::handleInterfacesBegin (int count) { ! def->interfaces = (jclass*) _Jv_AllocBytes (count*sizeof (jclass)); def->interface_count = count; } *************** _Jv_ClassReader::checkImplements (jclass *** 1032,1041 **** void _Jv_ClassReader::handleFieldsBegin (int count) { def->fields = (_Jv_Field*) ! _Jv_AllocBytesChecked (count * sizeof (_Jv_Field)); def->field_count = count; def->field_initializers = (_Jv_ushort*) ! _Jv_AllocBytesChecked (count * sizeof (_Jv_ushort)); for (int i = 0; i < count; i++) def->field_initializers[i] = (_Jv_ushort) 0; } --- 1050,1059 ---- void _Jv_ClassReader::handleFieldsBegin (int count) { def->fields = (_Jv_Field*) ! _Jv_AllocBytes (count * sizeof (_Jv_Field)); def->field_count = count; def->field_initializers = (_Jv_ushort*) ! _Jv_AllocBytes (count * sizeof (_Jv_ushort)); for (int i = 0; i < count; i++) def->field_initializers[i] = (_Jv_ushort) 0; } *************** void *** 1172,1182 **** _Jv_ClassReader::handleMethodsBegin (int count) { def->methods = (_Jv_Method*) ! _Jv_AllocBytesChecked (sizeof (_Jv_Method)*count); def->interpreted_methods ! = (_Jv_MethodBase **) _Jv_AllocBytesChecked (sizeof (_Jv_MethodBase *) ! * count); for (int i = 0; i < count; i++) def->interpreted_methods[i] = 0; --- 1190,1200 ---- _Jv_ClassReader::handleMethodsBegin (int count) { def->methods = (_Jv_Method*) ! _Jv_AllocBytes (sizeof (_Jv_Method)*count); def->interpreted_methods ! = (_Jv_MethodBase **) _Jv_AllocBytes (sizeof (_Jv_MethodBase *) ! * count); for (int i = 0; i < count; i++) def->interpreted_methods[i] = 0; *************** void _Jv_ClassReader::handleMethod *** 1206,1211 **** --- 1224,1230 ---- // intialize... method->ncode = 0; + method->throws = NULL; if (verify) { *************** void _Jv_ClassReader::handleCodeAttribut *** 1235,1241 **** { int size = _Jv_InterpMethod::size (exc_table_length, code_length); _Jv_InterpMethod *method = ! (_Jv_InterpMethod*) (_Jv_AllocBytesChecked (size)); method->max_stack = max_stack; method->max_locals = max_locals; --- 1254,1260 ---- { int size = _Jv_InterpMethod::size (exc_table_length, code_length); _Jv_InterpMethod *method = ! (_Jv_InterpMethod*) (_Jv_AllocBytes (size)); method->max_stack = max_stack; method->max_locals = max_locals; *************** void _Jv_ClassReader::handleCodeAttribut *** 1248,1257 **** memcpy ((void*) method->bytecode (), (void*) (bytes+code_start), code_length); - - def->interpreted_methods[method_index] = method; ! /* that's all we do for now */ } void _Jv_ClassReader::handleExceptionTableEntry --- 1267,1274 ---- memcpy ((void*) method->bytecode (), (void*) (bytes+code_start), code_length); ! def->interpreted_methods[method_index] = method; } void _Jv_ClassReader::handleExceptionTableEntry *************** void _Jv_ClassReader::handleMethodsEnd ( *** 1282,1288 **** else { _Jv_JNIMethod *m = (_Jv_JNIMethod *) ! _Jv_AllocBytesChecked (sizeof (_Jv_JNIMethod)); m->defining_class = def; m->self = method; m->function = NULL; --- 1299,1305 ---- else { _Jv_JNIMethod *m = (_Jv_JNIMethod *) ! _Jv_AllocBytes (sizeof (_Jv_JNIMethod)); m->defining_class = def; m->self = method; m->function = NULL; *************** void _Jv_ClassReader::handleMethodsEnd ( *** 1300,1306 **** throw_class_format_error ("method with no code"); } } - } void _Jv_ClassReader::throw_class_format_error (char *msg) --- 1317,1322 ---- *************** void _Jv_ClassReader::throw_class_format *** 1334,1339 **** --- 1350,1399 ---- ::throw_class_format_error (str); } + /** Here we define the exceptions that can be thrown */ + + static void + throw_no_class_def_found_error (jstring msg) + { + throw (msg + ? new java::lang::NoClassDefFoundError (msg) + : new java::lang::NoClassDefFoundError); + } + + static void + throw_no_class_def_found_error (char *msg) + { + throw_no_class_def_found_error (JvNewStringLatin1 (msg)); + } + + static void + throw_class_format_error (jstring msg) + { + throw (msg + ? new java::lang::ClassFormatError (msg) + : new java::lang::ClassFormatError); + } + + static void + throw_internal_error (char *msg) + { + throw new java::lang::InternalError (JvNewStringLatin1 (msg)); + } + + static void throw_incompatible_class_change_error (jstring msg) + { + throw new java::lang::IncompatibleClassChangeError (msg); + } + + static void throw_class_circularity_error (jstring msg) + { + throw new java::lang::ClassCircularityError (msg); + } + + #endif /* INTERPRETER */ + + + /** This section takes care of verifying integrity of identifiers, signatures, field ddescriptors, and class names */ *************** void _Jv_ClassReader::throw_class_format *** 1342,1348 **** int xxch = UTF8_GET(PTR,LIMIT); \ PTR = xxkeep; xxch; }) ! /* verify one element of a type descriptor or signature */ static unsigned char* _Jv_VerifyOne (unsigned char* ptr, unsigned char* limit, bool void_ok) { --- 1402,1408 ---- int xxch = UTF8_GET(PTR,LIMIT); \ PTR = xxkeep; xxch; }) ! /* Verify one element of a type descriptor or signature. */ static unsigned char* _Jv_VerifyOne (unsigned char* ptr, unsigned char* limit, bool void_ok) { *************** _Jv_VerifyOne (unsigned char* ptr, unsig *** 1354,1360 **** switch (ch) { case 'V': ! if (! void_ok) return 0; case 'S': case 'B': case 'I': case 'J': case 'Z': case 'C': case 'F': case 'D': --- 1414,1421 ---- switch (ch) { case 'V': ! if (! void_ok) ! return 0; case 'S': case 'B': case 'I': case 'J': case 'Z': case 'C': case 'F': case 'D': *************** _Jv_VerifyOne (unsigned char* ptr, unsig *** 1363,1378 **** case 'L': { unsigned char *start = ptr, *end; ! do { ! if (ptr > limit) ! return 0; ! ! end = ptr; ! ! if ((ch = UTF8_GET (ptr, limit)) == -1) ! return 0; ! ! } while (ch != ';'); if (! _Jv_VerifyClassName (start, (unsigned short) (end-start))) return 0; } --- 1424,1441 ---- case 'L': { unsigned char *start = ptr, *end; ! do ! { ! if (ptr > limit) ! return 0; ! ! end = ptr; ! ! if ((ch = UTF8_GET (ptr, limit)) == -1) ! return 0; ! ! } ! while (ch != ';'); if (! _Jv_VerifyClassName (start, (unsigned short) (end-start))) return 0; } *************** _Jv_VerifyOne (unsigned char* ptr, unsig *** 1381,1398 **** case '[': return _Jv_VerifyOne (ptr, limit, false); break; ! default: return 0; } return ptr; - } ! ! /** verification and loading procedures **/ ! bool _Jv_VerifyFieldSignature (_Jv_Utf8Const*sig) { --- 1444,1458 ---- case '[': return _Jv_VerifyOne (ptr, limit, false); break; ! default: return 0; } return ptr; } ! /* Verification and loading procedures. */ bool _Jv_VerifyFieldSignature (_Jv_Utf8Const*sig) { *************** _Jv_VerifyMethodSignature (_Jv_Utf8Const *** 1415,1421 **** while (ptr && UTF8_PEEK (ptr, limit) != ')') ptr = _Jv_VerifyOne (ptr, limit, false); ! if (UTF8_GET (ptr, limit) != ')') return false; --- 1475,1481 ---- while (ptr && UTF8_PEEK (ptr, limit) != ')') ptr = _Jv_VerifyOne (ptr, limit, false); ! if (UTF8_GET (ptr, limit) != ')') return false; *************** _Jv_VerifyMethodSignature (_Jv_Utf8Const *** 1425,1433 **** return ptr == limit; } ! /* we try to avoid calling the Character methods all the time, ! in fact, they will only be called for non-standard things */ ! static __inline__ int is_identifier_start (int c) { --- 1485,1492 ---- return ptr == limit; } ! /* We try to avoid calling the Character methods all the time, in ! fact, they will only be called for non-standard things. */ static __inline__ int is_identifier_start (int c) { *************** is_identifier_start (int c) *** 1440,1446 **** if (ch == 0x5FU) /* _ */ return 1; ! return character->isJavaIdentifierStart ((jchar) ch); } static __inline__ int --- 1499,1505 ---- if (ch == 0x5FU) /* _ */ return 1; ! return java::lang::Character::isJavaIdentifierStart ((jchar) ch); } static __inline__ int *************** is_identifier_part (int c) *** 1457,1463 **** if (ch == 0x5FU || ch == 0x24U) /* _ $ */ return 1; ! return character->isJavaIdentifierStart ((jchar) ch); } bool --- 1516,1522 ---- if (ch == 0x5FU || ch == 0x24U) /* _ $ */ return 1; ! return java::lang::Character::isJavaIdentifierStart ((jchar) ch); } bool *************** _Jv_VerifyClassName (unsigned char* ptr, *** 1488,1494 **** if ('[' == UTF8_PEEK (ptr, limit)) { ! if (! _Jv_VerifyOne (++ptr, limit, false)) return false; else return true; --- 1547,1556 ---- if ('[' == UTF8_PEEK (ptr, limit)) { ! unsigned char *end = _Jv_VerifyOne (++ptr, limit, false); ! // _Jv_VerifyOne must leave us looking at the terminating nul ! // byte. ! if (! end || *end) return false; else return true; *************** _Jv_VerifyClassName (_Jv_Utf8Const *name *** 1520,1528 **** (_Jv_ushort) name->length); } ! /** returns true, if name1 and name2 represents classes in the same ! package. */ ! bool _Jv_ClassNameSamePackage (_Jv_Utf8Const *name1, _Jv_Utf8Const *name2) { --- 1582,1589 ---- (_Jv_ushort) name->length); } ! /* Returns true, if NAME1 and NAME2 represent classes in the same ! package. */ bool _Jv_ClassNameSamePackage (_Jv_Utf8Const *name1, _Jv_Utf8Const *name2) { *************** _Jv_ClassNameSamePackage (_Jv_Utf8Const *** 1537,1558 **** if (ch1 == '.') last1 = ptr1; ! else if (ch1 == -1) return false; } ! // now the length of name1's package name is len int len = last1 - (unsigned char*) name1->data; ! // if this is longer than name2, then we're off if (len > name2->length) return false; ! // then compare the first len bytes for equality if (memcmp ((void*) name1->data, (void*) name2->data, len) == 0) { ! // check that there are no .'s after position len in name2 unsigned char* ptr2 = (unsigned char*) name2->data + len; unsigned char* limit2 = --- 1598,1619 ---- if (ch1 == '.') last1 = ptr1; ! else if (ch1 == -1) return false; } ! // Now the length of NAME1's package name is LEN. int len = last1 - (unsigned char*) name1->data; ! // If this is longer than NAME2, then we're off. if (len > name2->length) return false; ! // Then compare the first len bytes for equality. if (memcmp ((void*) name1->data, (void*) name2->data, len) == 0) { ! // Check that there are no .'s after position LEN in NAME2. unsigned char* ptr2 = (unsigned char*) name2->data + len; unsigned char* limit2 = *************** _Jv_ClassNameSamePackage (_Jv_Utf8Const *** 1568,1628 **** } return false; } - - - - /** Here we define the exceptions that can be thrown */ - - static void - throw_no_class_def_found_error (jstring msg) - { - if (msg == 0) - JvThrow (new java::lang::NoClassDefFoundError); - else - JvThrow (new java::lang::NoClassDefFoundError (msg)); - } - - static void - throw_no_class_def_found_error (char *msg) - { - throw_no_class_def_found_error (JvNewStringLatin1 (msg)); - } - - static void - throw_class_format_error (jstring msg) - { - if (msg == 0) - JvThrow (new java::lang::ClassFormatError); - else - JvThrow (new java::lang::ClassFormatError (msg)); - } - - static void - throw_internal_error (char *msg) - { - JvThrow - (new java::lang::InternalError (JvNewStringLatin1 (msg))); - } - - static jfloat int_bits_to_float (jint value) - { - return java::lang::Float::intBitsToFloat (value); - } - - static jdouble long_bits_to_double (jlong value) - { - return java::lang::Double::longBitsToDouble (value); - } - - static void throw_incompatible_class_change_error (jstring msg) - { - JvThrow (new java::lang::IncompatibleClassChangeError (msg)); - } - - static void throw_class_circularity_error (jstring msg) - { - JvThrow (new java::lang::ClassCircularityError (msg)); - } - - #endif /* INTERPRETER */ - --- 1629,1631 ---- diff -Nrc3pad gcc-3.0.4/libjava/exception.cc gcc-3.1/libjava/exception.cc *** gcc-3.0.4/libjava/exception.cc Sun Jun 10 20:58:43 2001 --- gcc-3.1/libjava/exception.cc Mon Apr 8 20:40:35 2002 *************** *** 1,6 **** // Functions for Exception Support for Java. ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // Functions for Exception Support for Java. ! /* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 11,39 **** #include #include ! #include #include #include #include #include ! #include "unwind.h" ! ! ! // More nastiness: the GC wants to define TRUE and FALSE. We don't ! // need the Java definitions (themselves a hack), so we undefine them. ! #undef TRUE ! #undef FALSE ! ! extern "C" { ! #include ! #include ! #include ! }; - struct alignment_test_struct { char space; --- 11,36 ---- #include #include ! #include #include #include #include #include ! // unwind-pe.h uses std::abort(), but sometimes we compile libjava ! // without libstdc++-v3. The following hack forces it to use ! // stdlib.h's abort(). ! namespace std { ! static __attribute__ ((__noreturn__)) void ! abort () ! { ! ::abort (); ! } ! } ! #include "unwind.h" struct alignment_test_struct { char space; *************** get_exception_header_from_ue (_Unwind_Ex *** 84,92 **** extern "C" void _Jv_Throw (jthrowable value) { - /* FIXME: Use the proper API to the collector. */ java_exception_header *xh ! = static_cast(GC_malloc (sizeof (*xh))); if (value == NULL) value = new java::lang::NullPointerException (); --- 81,88 ---- extern "C" void _Jv_Throw (jthrowable value) { java_exception_header *xh ! = static_cast(_Jv_AllocRawObj (sizeof (*xh))); if (value == NULL) value = new java::lang::NullPointerException (); *************** _Jv_Throw (jthrowable value) *** 111,117 **** recover. As is the way of such things, almost certainly we will have crashed before now, rather than actually being able to diagnose the problem. */ ! std::abort (); } --- 107,113 ---- recover. As is the way of such things, almost certainly we will have crashed before now, rather than actually being able to diagnose the problem. */ ! abort(); } *************** static const unsigned char * *** 131,137 **** parse_lsda_header (_Unwind_Context *context, const unsigned char *p, lsda_header_info *info) { ! _Unwind_Ptr tmp; unsigned char lpstart_encoding; info->Start = (context ? _Unwind_GetRegionStart (context) : 0); --- 127,133 ---- parse_lsda_header (_Unwind_Context *context, const unsigned char *p, lsda_header_info *info) { ! _Unwind_Word tmp; unsigned char lpstart_encoding; info->Start = (context ? _Unwind_GetRegionStart (context) : 0); *************** PERSONALITY_FUNCTION (int version, *** 247,253 **** return _URC_CONTINUE_UNWIND; else { ! _Unwind_Ptr cs_lp, cs_action; do { p = read_uleb128 (p, &cs_lp); --- 243,249 ---- return _URC_CONTINUE_UNWIND; else { ! _Unwind_Word cs_lp, cs_action; do { p = read_uleb128 (p, &cs_lp); *************** PERSONALITY_FUNCTION (int version, *** 266,272 **** // Search the call-site table for the action associated with this IP. while (p < info.action_table) { ! _Unwind_Ptr cs_start, cs_len, cs_lp, cs_action; // Note that all call-site encodings are "absolute" displacements. p = read_encoded_value (0, info.call_site_encoding, p, &cs_start); --- 262,269 ---- // Search the call-site table for the action associated with this IP. while (p < info.action_table) { ! _Unwind_Ptr cs_start, cs_len, cs_lp; ! _Unwind_Word cs_action; // Note that all call-site encodings are "absolute" displacements. p = read_encoded_value (0, info.call_site_encoding, p, &cs_start); *************** PERSONALITY_FUNCTION (int version, *** 312,326 **** else { // Otherwise we have a catch handler. ! signed long ar_filter, ar_disp; while (1) { - _Unwind_Ptr tmp; - p = action_record; ! p = read_sleb128 (p, &tmp); ar_filter = tmp; ! read_sleb128 (p, &tmp); ar_disp = tmp; if (ar_filter == 0) { --- 309,321 ---- else { // Otherwise we have a catch handler. ! _Unwind_Sword ar_filter, ar_disp; while (1) { p = action_record; ! p = read_sleb128 (p, &ar_filter); ! read_sleb128 (p, &ar_disp); if (ar_filter == 0) { *************** PERSONALITY_FUNCTION (int version, *** 359,365 **** // ??? Perhaps better to make them an index into a table // of null-terminated strings instead of playing games // with Utf8Const+1 as above. ! std::abort (); } if (ar_disp == 0) --- 354,360 ---- // ??? Perhaps better to make them an index into a table // of null-terminated strings instead of playing games // with Utf8Const+1 as above. ! abort (); } if (ar_disp == 0) diff -Nrc3pad gcc-3.0.4/libjava/gcj/Makefile.am gcc-3.1/libjava/gcj/Makefile.am *** gcc-3.0.4/libjava/gcj/Makefile.am Wed Apr 4 23:35:58 2001 --- gcc-3.1/libjava/gcj/Makefile.am Fri Mar 15 16:56:05 2002 *************** AUTOMAKE_OPTIONS = foreign *** 4,6 **** --- 4,9 ---- gcjdir = $(includedir)/gcj gcj_HEADERS = array.h cni.h field.h javaprims.h method.h + + toolgcjdir = @tool_include_dir@/gcj + toolgcj_HEADERS = libgcj-config.h diff -Nrc3pad gcc-3.0.4/libjava/gcj/Makefile.in gcc-3.1/libjava/gcj/Makefile.in *** gcc-3.0.4/libjava/gcj/Makefile.in Wed Jul 18 16:56:41 2001 --- gcc-3.1/libjava/gcj/Makefile.in Wed Apr 10 13:10:14 2002 *************** *** 1,6 **** ! # Makefile.in generated automatically by automake 1.4 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. --- 1,6 ---- ! # Makefile.in generated automatically by automake 1.4-p5 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. *************** AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ *** 67,72 **** --- 67,73 ---- AR = @AR@ AS = @AS@ CC = @CC@ + CHECKREFSPEC = @CHECKREFSPEC@ COMPPATH = @COMPPATH@ CXX = @CXX@ CXXCPP = @CXXCPP@ *************** GCLIBS = @GCLIBS@ *** 85,94 **** GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! ICONV_LDFLAGS = @ICONV_LDFLAGS@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBDATASTARTSPEC = @LIBDATASTARTSPEC@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ --- 86,96 ---- GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! HASH_SYNC_SPEC = @HASH_SYNC_SPEC@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBFFI = @LIBFFI@ ! LIBFFIINCS = @LIBFFIINCS@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ *************** OBJDUMP = @OBJDUMP@ *** 104,142 **** OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ - ZDEPS = @ZDEPS@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ AUTOMAKE_OPTIONS = foreign gcjdir = $(includedir)/gcj gcj_HEADERS = array.h cni.h field.h javaprims.h method.h ! CONFIG_HEADER = ../include/config.h CONFIG_CLEAN_FILES = ! HEADERS = $(gcj_HEADERS) ! DIST_COMMON = Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: --- 106,152 ---- OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ + PLATFORMOBJS = @PLATFORMOBJS@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ + SYS_ZLIBS = @SYS_ZLIBS@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ + THREADLDFLAGS = @THREADLDFLAGS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ + gcc_version = @gcc_version@ + glibjava_CXX = @glibjava_CXX@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ + tool_include_dir = @tool_include_dir@ AUTOMAKE_OPTIONS = foreign gcjdir = $(includedir)/gcj gcj_HEADERS = array.h cni.h field.h javaprims.h method.h ! ! toolgcjdir = @tool_include_dir@/gcj ! toolgcj_HEADERS = libgcj-config.h ! CONFIG_HEADER = ../include/config.h libgcj-config.h CONFIG_CLEAN_FILES = ! HEADERS = $(gcj_HEADERS) $(toolgcj_HEADERS) ! DIST_COMMON = ./stamp-h2.in Makefile.am Makefile.in libgcj-config.h.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = gtar GZIP_ENV = --best all: all-redirect .SUFFIXES: *************** Makefile: $(srcdir)/Makefile.in $(top_b *** 148,153 **** --- 158,191 ---- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + libgcj-config.h: stamp-h2 + @if test ! -f $@; then \ + rm -f stamp-h2; \ + $(MAKE) stamp-h2; \ + else :; fi + stamp-h2: $(srcdir)/libgcj-config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=gcj/libgcj-config.h \ + $(SHELL) ./config.status + @echo timestamp > stamp-h2 2> /dev/null + $(srcdir)/libgcj-config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h2.in + @if test ! -f $@; then \ + rm -f $(srcdir)/stamp-h2.in; \ + $(MAKE) $(srcdir)/stamp-h2.in; \ + else :; fi + $(srcdir)/stamp-h2.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/stamp-h2.in 2> /dev/null + + mostlyclean-hdr: + + clean-hdr: + + distclean-hdr: + -rm -f libgcj-config.h + + maintainer-clean-hdr: + install-gcjHEADERS: $(gcj_HEADERS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(gcjdir) *************** uninstall-gcjHEADERS: *** 163,168 **** --- 201,221 ---- rm -f $(DESTDIR)$(gcjdir)/$$p; \ done + install-toolgcjHEADERS: $(toolgcj_HEADERS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(toolgcjdir) + @list='$(toolgcj_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(toolgcjdir)/$$p"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(toolgcjdir)/$$p; \ + done + + uninstall-toolgcjHEADERS: + @$(NORMAL_UNINSTALL) + list='$(toolgcj_HEADERS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(toolgcjdir)/$$p; \ + done + tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) *************** ID: $(HEADERS) $(SOURCES) $(LISP) *** 173,187 **** here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) ! TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ ! test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ ! || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: --- 226,240 ---- here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) ! TAGS: $(HEADERS) $(SOURCES) libgcj-config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ ! test -z "$(ETAGS_ARGS)libgcj-config.h.in$$unique$(LISP)$$tags" \ ! || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags libgcj-config.h.in $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: *************** distdir: $(DISTFILES) *** 205,211 **** @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ --- 258,264 ---- @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ *************** check-am: all-am *** 220,242 **** check: check-am installcheck-am: installcheck: installcheck-am install-exec-am: install-exec: install-exec-am ! install-data-am: install-gcjHEADERS install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am ! uninstall-am: uninstall-gcjHEADERS uninstall: uninstall-am ! all-am: Makefile $(HEADERS) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: ! $(mkinstalldirs) $(DESTDIR)$(gcjdir) mostlyclean-generic: --- 273,298 ---- check: check-am installcheck-am: installcheck: installcheck-am + all-recursive-am: libgcj-config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + install-exec-am: install-exec: install-exec-am ! install-data-am: install-gcjHEADERS install-toolgcjHEADERS install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am ! uninstall-am: uninstall-gcjHEADERS uninstall-toolgcjHEADERS uninstall: uninstall-am ! all-am: Makefile $(HEADERS) libgcj-config.h all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: ! $(mkinstalldirs) $(DESTDIR)$(gcjdir) $(DESTDIR)$(toolgcjdir) mostlyclean-generic: *************** distclean-generic: *** 248,276 **** -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: ! mostlyclean-am: mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am ! clean-am: clean-tags clean-generic mostlyclean-am clean: clean-am ! distclean-am: distclean-tags distclean-generic clean-am -rm -f libtool distclean: distclean-am ! maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \ ! distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am ! .PHONY: uninstall-gcjHEADERS install-gcjHEADERS tags mostlyclean-tags \ ! distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ ! dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ install-exec install-data-am install-data install-am install \ uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ --- 304,334 ---- -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: ! mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am ! clean-am: clean-hdr clean-tags clean-generic mostlyclean-am clean: clean-am ! distclean-am: distclean-hdr distclean-tags distclean-generic clean-am -rm -f libtool distclean: distclean-am ! maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ ! maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am ! .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ ! uninstall-gcjHEADERS install-gcjHEADERS uninstall-toolgcjHEADERS \ ! install-toolgcjHEADERS tags mostlyclean-tags distclean-tags clean-tags \ ! maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \ ! installcheck-am installcheck all-recursive-am install-exec-am \ install-exec install-data-am install-data install-am install \ uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ diff -Nrc3pad gcc-3.0.4/libjava/gcj/cni.h gcc-3.1/libjava/gcj/cni.h *** gcc-3.0.4/libjava/gcj/cni.h Sun May 13 07:10:25 2001 --- gcc-3.1/libjava/gcj/cni.h Tue May 22 06:47:48 2001 *************** public: *** 106,119 **** { _Jv_MonitorExit (obj); } }; - // Throw some exception. - extern void JvThrow (jobject obj) __attribute__ ((__noreturn__)); - extern inline void - JvThrow (jobject obj) - { - _Jv_Throw ((jthrowable) obj); - } - /* Call malloc, but throw exception if insufficient memory. */ extern inline void * JvMalloc (jsize size) --- 106,111 ---- *************** JvFree (void *ptr) *** 126,129 **** --- 118,139 ---- { return _Jv_Free (ptr); } + + extern inline jint + JvCreateJavaVM (void* vm_args) + { + return _Jv_CreateJavaVM (vm_args); + } + + extern inline java::lang::Thread* + JvAttachCurrentThread (jstring name, java::lang::ThreadGroup* group) + { + return _Jv_AttachCurrentThread (name, group); + } + + extern inline jint + JvDetachCurrentThread (void) + { + return _Jv_DetachCurrentThread (); + } #endif /* __GCJ_CNI_H__ */ diff -Nrc3pad gcc-3.0.4/libjava/gcj/javaprims.h gcc-3.1/libjava/gcj/javaprims.h *** gcc-3.0.4/libjava/gcj/javaprims.h Sun May 20 16:24:41 2001 --- gcc-3.1/libjava/gcj/javaprims.h Fri Feb 15 03:21:47 2002 *************** *** 1,6 **** // javaprims.h - Main external header file for libgcj. -*- c++ -*- ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // javaprims.h - Main external header file for libgcj. -*- c++ -*- ! /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 14,19 **** --- 14,21 ---- // Force C++ compiler to use Java-style exceptions. #pragma GCC java_exceptions + #include + // FIXME: this is a hack until we get a proper gcjh. // It is needed to work around system header files that define TRUE // and FALSE. *************** extern "Java" *** 132,137 **** --- 134,140 ---- class Boolean; class Byte; class CPlusPlusDemangler; + class CharSequence; class Character; class Character$Subset; class Character$UnicodeBlock; *************** extern "Java" *** 159,164 **** --- 162,168 ---- class IllegalThreadStateException; class IncompatibleClassChangeError; class IndexOutOfBoundsException; + class InheritableThreadLocal; class InstantiationError; class InstantiationException; class Integer; *************** extern "Java" *** 178,203 **** --- 182,216 ---- class NumberFormatException; class Object; class OutOfMemoryError; + class Package; class Process; class Runnable; class Runtime; class RuntimeException; class RuntimePermission; + class SecurityContext; class SecurityException; class SecurityManager; class Short; class StackOverflowError; + class StrictMath; class String; + class String$CaseInsensitiveComparator; class StringBuffer; class StringIndexOutOfBoundsException; class System; class Thread; class ThreadDeath; class ThreadGroup; + class ThreadLocal; + class ThreadLocal$Value; class Throwable; class UnknownError; class UnsatisfiedLinkError; + class UnsupportedClassVersionError; class UnsupportedOperationException; + class VMClassLoader; + class VMSecurityManager; class VerifyError; class VirtualMachineError; class Void; *************** extern "Java" *** 267,280 **** class EventObject; class GregorianCalendar; class HashMap; ! class HashMap$Entry; class HashMap$HashIterator; class HashSet; class Hashtable; - class Hashtable$Entry; class Hashtable$Enumerator; class Hashtable$HashIterator; class Iterator; class LinkedList; class LinkedList$Entry; class LinkedList$LinkedListItr; --- 280,297 ---- class EventObject; class GregorianCalendar; class HashMap; ! class HashMap$HashEntry; class HashMap$HashIterator; class HashSet; class Hashtable; class Hashtable$Enumerator; + class Hashtable$HashEntry; class Hashtable$HashIterator; + class IdentityHashMap; + class IdentityHashMap$IdentityIterator; class Iterator; + class LinkedHashMap; + class LinkedHashMap$LinkedHashEntry; class LinkedList; class LinkedList$Entry; class LinkedList$LinkedListItr; *************** extern "Java" *** 284,289 **** --- 301,307 ---- class Locale; class Map; class Map$Entry; + class Map$Map; class MissingResourceException; class NoSuchElementException; class Observable; *************** extern "Java" *** 292,297 **** --- 310,316 ---- class PropertyPermission; class PropertyResourceBundle; class Random; + class RandomAccess; class ResourceBundle; class Set; class SimpleTimeZone; *************** typedef struct _Jv_Field *jfieldID; *** 366,387 **** typedef struct _Jv_Method *jmethodID; extern "C" jobject _Jv_AllocObject (jclass, jint) __attribute__((__malloc__)); extern "C" jboolean _Jv_IsInstanceOf(jobject, jclass); extern "C" jstring _Jv_AllocString(jsize) __attribute__((__malloc__)); extern "C" jstring _Jv_NewString (const jchar*, jsize) __attribute__((__malloc__)); extern "C" jchar* _Jv_GetStringChars (jstring str); ! extern "C" jint _Jv_MonitorEnter (jobject); ! extern "C" jint _Jv_MonitorExit (jobject); extern "C" jstring _Jv_NewStringLatin1(const char*, jsize) __attribute__((__malloc__)); extern "C" jsize _Jv_GetStringUTFLength (jstring); extern "C" jsize _Jv_GetStringUTFRegion (jstring, jsize, jsize, char *); extern "C" void _Jv_Throw (jthrowable) __attribute__ ((__noreturn__)); extern "C" void* _Jv_Malloc (jsize) __attribute__((__malloc__)); extern "C" void* _Jv_Realloc (void *, jsize); extern "C" void _Jv_Free (void*); typedef unsigned short _Jv_ushort __attribute__((__mode__(__HI__))); typedef unsigned int _Jv_uint __attribute__((__mode__(__SI__))); --- 385,431 ---- typedef struct _Jv_Method *jmethodID; extern "C" jobject _Jv_AllocObject (jclass, jint) __attribute__((__malloc__)); + extern "C" jobject _Jv_AllocObjectNoFinalizer (jclass, jint) __attribute__((__malloc__)); + extern "C" jobject _Jv_AllocObjectNoInitNoFinalizer (jclass, jint) __attribute__((__malloc__)); + #ifdef JV_HASH_SYNCHRONIZATION + extern "C" jobject _Jv_AllocPtrFreeObject (jclass, jint) + __attribute__((__malloc__)); + #else + // Collector still needs to scan sync_info + static inline jobject _Jv_AllocPtrFreeObject (jclass klass, jint sz) + { + return _Jv_AllocObject(klass, sz); + } + #endif extern "C" jboolean _Jv_IsInstanceOf(jobject, jclass); extern "C" jstring _Jv_AllocString(jsize) __attribute__((__malloc__)); extern "C" jstring _Jv_NewString (const jchar*, jsize) __attribute__((__malloc__)); + extern jint _Jv_FormatInt (jchar* bufend, jint num); extern "C" jchar* _Jv_GetStringChars (jstring str); ! extern "C" void _Jv_MonitorEnter (jobject); ! extern "C" void _Jv_MonitorExit (jobject); extern "C" jstring _Jv_NewStringLatin1(const char*, jsize) __attribute__((__malloc__)); extern "C" jsize _Jv_GetStringUTFLength (jstring); extern "C" jsize _Jv_GetStringUTFRegion (jstring, jsize, jsize, char *); + extern jint _Jv_CreateJavaVM (void* /*vm_args*/); + + void + _Jv_ThreadRun (java::lang::Thread* thread); + jint + _Jv_AttachCurrentThread(java::lang::Thread* thread); + extern "C" java::lang::Thread* + _Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group); + extern "C" jint _Jv_DetachCurrentThread (void); + extern "C" void _Jv_Throw (jthrowable) __attribute__ ((__noreturn__)); extern "C" void* _Jv_Malloc (jsize) __attribute__((__malloc__)); extern "C" void* _Jv_Realloc (void *, jsize); extern "C" void _Jv_Free (void*); + extern void (*_Jv_RegisterClassHook) (jclass cl); + extern "C" void _Jv_RegisterClassHookDefault (jclass); typedef unsigned short _Jv_ushort __attribute__((__mode__(__HI__))); typedef unsigned int _Jv_uint __attribute__((__mode__(__SI__))); *************** struct _Jv_Utf8Const *** 393,396 **** --- 437,441 ---- char data[1]; /* In Utf8 format, with final '\0'. */ }; + #endif /* __JAVAPRIMS_H__ */ diff -Nrc3pad gcc-3.0.4/libjava/gcj/libgcj-config.h.in gcc-3.1/libjava/gcj/libgcj-config.h.in *** gcc-3.0.4/libjava/gcj/libgcj-config.h.in Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gcj/libgcj-config.h.in Fri Mar 15 16:56:05 2002 *************** *** 0 **** --- 1,13 ---- + /* The header file derived from this file is installed in a target and + compiler version specific directory. Do not add definitions which + are intended to be different for different multilibs, as we do not + currently have a mechanism to support this. + + Also be sure to use safely named macros, as this file will be + included in user code. */ + + /* Define if hash synchronization is in use. */ + #undef JV_HASH_SYNCHRONIZATION + + /* Define if is available. */ + #undef JV_HAVE_INTTYPES_H diff -Nrc3pad gcc-3.0.4/libjava/gij.cc gcc-3.1/libjava/gij.cc *** gcc-3.0.4/libjava/gij.cc Wed May 23 18:12:41 2001 --- gcc-3.1/libjava/gij.cc Wed Feb 27 05:37:40 2002 *************** *** 1,4 **** ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** help () *** 40,47 **** static void version () { ! printf ("gij (GNU libgcj) version %s\n\n", VERSION); ! printf ("Copyright (C) 2001 Free Software Foundation.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); exit (0); --- 40,47 ---- static void version () { ! printf ("gij (GNU libgcj) version %s\n\n", __VERSION__); ! printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n"); printf ("This is free software; see the source for copying conditions. There is NO\n"); printf ("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"); exit (0); *************** main (int argc, const char **argv) *** 129,140 **** if (argc - i < 1) { fprintf (stderr, "Usage: gij [OPTION] ... CLASS [ARGS] ...\n"); ! fprintf (stderr, " to interpret Java bytecodes, or\n"); fprintf (stderr, " gij -jar [OPTION] ... JARFILE [ARGS] ...\n"); fprintf (stderr, " to execute a jar file\n"); fprintf (stderr, "Try `gij --help' for more information.\n"); exit (1); } ! _Jv_RunMain (argv[i], argc - i, argv + i, jar_mode); } --- 129,140 ---- if (argc - i < 1) { fprintf (stderr, "Usage: gij [OPTION] ... CLASS [ARGS] ...\n"); ! fprintf (stderr, " to invoke CLASS.main, or\n"); fprintf (stderr, " gij -jar [OPTION] ... JARFILE [ARGS] ...\n"); fprintf (stderr, " to execute a jar file\n"); fprintf (stderr, "Try `gij --help' for more information.\n"); exit (1); } ! _Jv_RunMain (NULL, argv[i], argc - i, argv + i, jar_mode); } diff -Nrc3pad gcc-3.0.4/libjava/gnu/awt/xlib/XCanvasPeer.java gcc-3.1/libjava/gnu/awt/xlib/XCanvasPeer.java *** gcc-3.0.4/libjava/gnu/awt/xlib/XCanvasPeer.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/awt/xlib/XCanvasPeer.java Tue Jan 22 22:03:00 2002 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation This file is part of libgcj. *************** public class XCanvasPeer implements Canv *** 230,235 **** --- 230,240 ---- throw new UnsupportedOperationException("FIXME, not implemented"); } + public ColorModel getColorModel () + { + return null; + } + public Graphics getGraphics() { DirectRasterGraphics gfxDevice = new XGraphics(window, config); *************** public class XCanvasPeer implements Canv *** 251,261 **** --- 256,276 ---- return MIN_SIZE; } + public Dimension minimumSize () + { + return getMinimumSize (); + } + public Dimension getPreferredSize () { return component.getSize(); } + public Dimension preferredSize () + { + return getPreferredSize(); + } + public Toolkit getToolkit() { return getXToolkit(); *************** public class XCanvasPeer implements Canv *** 318,323 **** --- 333,343 ---- ensureFlush(); } + public void reshape (int x, int y, int width, int height) + { + setBounds (x, y, width, height); + } + public void setCursor(Cursor cursor) { throw new UnsupportedOperationException("FIXME, not implemented"); *************** public class XCanvasPeer implements Canv *** 328,333 **** --- 348,363 ---- throw new UnsupportedOperationException("FIXME, not implemented"); } + public void enable () + { + setEnabled (true); + } + + public void disable () + { + setEnabled (false); + } + public void setEventMask(long eventMask) { WindowAttributes attributes = new WindowAttributes(); *************** public class XCanvasPeer implements Canv *** 371,376 **** --- 401,416 ---- } } + public void show () + { + setVisible (true); + } + + public void hide () + { + setVisible (false); + } + static class DoMap implements Runnable { Window window; diff -Nrc3pad gcc-3.0.4/libjava/gnu/awt/xlib/XFramePeer.java gcc-3.1/libjava/gnu/awt/xlib/XFramePeer.java *** gcc-3.0.4/libjava/gnu/awt/xlib/XFramePeer.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/awt/xlib/XFramePeer.java Tue Jan 22 22:03:01 2002 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation This file is part of libgcj. *************** public class XFramePeer extends XCanvasP *** 93,98 **** --- 93,103 ---- return (Insets) INSETS_0_PROTOTYPE.clone(); } + public Insets insets () + { + return getInsets (); + } + public void beginValidate() { } diff -Nrc3pad gcc-3.0.4/libjava/gnu/awt/xlib/XGraphicsConfiguration.java gcc-3.1/libjava/gnu/awt/xlib/XGraphicsConfiguration.java *** gcc-3.0.4/libjava/gnu/awt/xlib/XGraphicsConfiguration.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/awt/xlib/XGraphicsConfiguration.java Wed Jan 16 04:21:31 2002 *************** import gnu.gcj.xlib.Colormap; *** 26,32 **** import gnu.gcj.xlib.XColor; import gnu.gcj.xlib.Screen; import gnu.gcj.xlib.Display; ! import gnu.gcj.awt.Buffers; import java.util.Hashtable; public class XGraphicsConfiguration extends GraphicsConfiguration --- 26,32 ---- import gnu.gcj.xlib.XColor; import gnu.gcj.xlib.Screen; import gnu.gcj.xlib.Display; ! import gnu.java.awt.Buffers; import java.util.Hashtable; public class XGraphicsConfiguration extends GraphicsConfiguration diff -Nrc3pad gcc-3.0.4/libjava/gnu/awt/xlib/XPanelPeer.java gcc-3.1/libjava/gnu/awt/xlib/XPanelPeer.java *** gcc-3.0.4/libjava/gnu/awt/xlib/XPanelPeer.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/awt/xlib/XPanelPeer.java Tue Jan 22 22:03:01 2002 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation This file is part of libgcj. *************** public class XPanelPeer extends XCanvasP *** 40,45 **** --- 40,50 ---- return (Insets) INSETS_0_PROTOTYPE.clone(); } + public Insets insets() + { + return getInsets(); + } + public void beginValidate() { // NOP diff -Nrc3pad gcc-3.0.4/libjava/gnu/awt/xlib/XToolkit.java gcc-3.1/libjava/gnu/awt/xlib/XToolkit.java *** gcc-3.0.4/libjava/gnu/awt/xlib/XToolkit.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/awt/xlib/XToolkit.java Thu Jan 24 16:44:37 2002 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation This file is part of libgcj. *************** import java.awt.image.ImageProducer; *** 14,19 **** --- 14,20 ---- import java.awt.image.ImageObserver; import java.net.*; import java.awt.datatransfer.Clipboard; + import java.util.Properties; import gnu.gcj.xlib.Display; import gnu.gcj.xlib.Screen; *************** public class XToolkit extends Toolkit *** 292,297 **** --- 293,303 ---- return queue; } + public PrintJob getPrintJob (Frame frame, String title, Properties props) + { + return null; // FIXME + } + XGraphicsConfiguration getDefaultXGraphicsConfiguration() { if (defaultConfig == null) diff -Nrc3pad gcc-3.0.4/libjava/gnu/classpath/Configuration.java.in gcc-3.1/libjava/gnu/classpath/Configuration.java.in *** gcc-3.0.4/libjava/gnu/classpath/Configuration.java.in Sun Nov 26 01:48:04 2000 --- gcc-3.1/libjava/gnu/classpath/Configuration.java.in Tue Jan 22 22:39:47 2002 *************** *** 1,14 **** ! // This file defines compile-time constants that can be accessed by java code. ! // It is pre-processed by configure. package gnu.classpath; public interface Configuration { // The value of DEBUG is substituted according to whether the // "--enable-libgcj-debug" argument was passed to configure. Code // which is made conditional based on the value of this flag will // be removed by the optimizer in a non-debug build. - boolean DEBUG = @LIBGCJDEBUG@; } --- 1,54 ---- ! /* gnu.classpath.Configuration ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.classpath; + /** + * This file defines compile-time constants that can be accessed by + * java code. It is pre-processed by configure. + */ public interface Configuration { // The value of DEBUG is substituted according to whether the // "--enable-libgcj-debug" argument was passed to configure. Code // which is made conditional based on the value of this flag will // be removed by the optimizer in a non-debug build. boolean DEBUG = @LIBGCJDEBUG@; + + // For libgcj we never load the JNI libraries. + boolean INIT_LOAD_LIBRARY = false; } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/Core.java gcc-3.1/libjava/gnu/gcj/Core.java *** gcc-3.0.4/libjava/gnu/gcj/Core.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/Core.java Thu Sep 6 22:32:53 2001 *************** *** 0 **** --- 1,18 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package gnu.gcj; + + public class Core + { + public native static Core create (String name) throws java.io.IOException; + + public RawData ptr; + public int length; + } + diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/awt/BitMaskExtent.java gcc-3.1/libjava/gnu/gcj/awt/BitMaskExtent.java *** gcc-3.0.4/libjava/gnu/gcj/awt/BitMaskExtent.java Tue Aug 29 03:23:56 2000 --- gcc-3.1/libjava/gnu/gcj/awt/BitMaskExtent.java Thu Jan 1 00:00:00 1970 *************** *** 1,51 **** - /* Copyright (C) 2000 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.awt; - - /** - * Simple transparent utility class that can be used to perform bit - * mask extent calculations. - */ - public final class BitMaskExtent - { - /** The number of the least significant bit of the bit mask extent. */ - public byte leastSignificantBit; - - /** The number of bits in the bit mask extent. */ - public byte bitWidth; - - /** - * Set the bit mask. This will calculate and set the leastSignificantBit - * and bitWidth fields. - * - * @see #leastSignificantBit - * @see #bitWidth - */ - public void setMask(long mask) - { - leastSignificantBit = 0; - bitWidth = 0; - if (mask == 0) return; - long shiftMask = mask; - for (; (shiftMask&1) == 0; shiftMask >>>=1) leastSignificantBit++; - for (; (shiftMask&1) != 0; shiftMask >>>=1) bitWidth++; - - if (shiftMask != 0) - throw new IllegalArgumentException("mask must be continuous"); - } - - /** - * Calculate the bit mask based on the values of the - * leastSignificantBit and bitWidth fields. - */ - public long toMask() - { - return ((1< - */ - public class ComponentDataBlitOp implements RasterOp - { - public static ComponentDataBlitOp INSTANCE = new ComponentDataBlitOp(); - - public WritableRaster filter(Raster src, WritableRaster dest) - { - if (dest == null) - dest = createCompatibleDestRaster(src); - - DataBuffer srcDB = src.getDataBuffer(); - DataBuffer destDB = dest.getDataBuffer(); - - ComponentSampleModel srcSM = (ComponentSampleModel) src.getSampleModel(); - ComponentSampleModel destSM = (ComponentSampleModel) dest.getSampleModel(); - - - // Calculate offset to data in the underlying arrays: - - int srcScanlineStride = srcSM.getScanlineStride(); - int destScanlineStride = destSM.getScanlineStride(); - int srcX = src.getMinX() - src.getSampleModelTranslateX(); - int srcY = src.getMinY() - src.getSampleModelTranslateY(); - int destX = dest.getMinX() - dest.getSampleModelTranslateX(); - int destY = dest.getMinY() - dest.getSampleModelTranslateY(); - - int numBands = srcSM.getNumBands(); - - /* We can't use getOffset(x, y) from the sample model since we - don't want the band offset added in. */ - - int srcOffset = - numBands*srcX + srcScanlineStride*srcY + // from sample model - srcDB.getOffset(); // from data buffer - - int destOffset = - numBands*destX + destScanlineStride*destY + // from sample model - destDB.getOffset(); // from data buffer - - // Determine how much, and how many times to blit. - - int rowSize = src.getWidth()*numBands; - int h = src.getHeight(); - - if ((rowSize == srcScanlineStride) && - (rowSize == destScanlineStride)) - { - // collapse scan line blits to one large blit. - rowSize *= h; - h = 1; - } - - - // Do blitting - - Object srcArray = Buffers.getData(srcDB); - Object destArray = Buffers.getData(destDB); - - for (int yd = 0; yd - */ - public class GLightweightPeer implements LightweightPeer - { - public static final GLightweightPeer INSTANCE = new GLightweightPeer(); - - public GLightweightPeer() {} - - // -------- java.awt.peer.ComponentPeer implementation: - - public int checkImage(Image img, int width, int height, ImageObserver o) - { - return 0; - } - - public Image createImage(ImageProducer prod) - { - return null; - } - - public Image createImage(int width, int height) - { - return null; - } - - public void disable() {} - - public void dispose() {} - - public void enable() {} - - public GraphicsConfiguration getGraphicsConfiguration() - { - return null; - } - - public FontMetrics getFontMetrics(Font f) - { - return null; - } - - public Graphics getGraphics() - { - return null; - } - - public Point getLocationOnScreen() - { - return null; - } - - public Dimension getMinimumSize() - { - return null; - } - - public Dimension getPreferredSize() - { - return null; - } - - public Toolkit getToolkit() - { - return null; - } - - public void handleEvent(AWTEvent e) {} - - public void hide() {} - - public boolean isFocusTraversable() - { - return false; - } - - public Dimension minimumSize() - { - return null; - } - - public Dimension preferredSize() - { - return null; - } - - public void paint(Graphics graphics) {} - - public boolean prepareImage(Image img, int width, int height, - ImageObserver o) - { - return false; - } - - public void print(Graphics graphics) {} - - public void repaint(long tm, int x, int y, int width, int height) {} - - public void requestFocus() {} - - public void reshape(int x, int y, int width, int height) {} - - public void setBackground(Color color) {} - - public void setBounds(int x, int y, int width, int height) {} - - public void setCursor(Cursor cursor) {} - - public void setEnabled(boolean enabled) {} - - public void setEventMask(long eventMask) {} - - public void setFont(Font font) {} - - public void setForeground(Color color) {} - - public void setVisible(boolean visible) {} - - public void show() {} - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/Blocks-3.txt gcc-3.1/libjava/gnu/gcj/convert/Blocks-3.txt *** gcc-3.0.4/libjava/gnu/gcj/convert/Blocks-3.txt Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/convert/Blocks-3.txt Wed Mar 6 19:12:45 2002 *************** *** 0 **** --- 1,90 ---- + # Start Code; End Code; Block Name + 0000; 007F; Basic Latin + 0080; 00FF; Latin-1 Supplement + 0100; 017F; Latin Extended-A + 0180; 024F; Latin Extended-B + 0250; 02AF; IPA Extensions + 02B0; 02FF; Spacing Modifier Letters + 0300; 036F; Combining Diacritical Marks + 0370; 03FF; Greek + 0400; 04FF; Cyrillic + 0530; 058F; Armenian + 0590; 05FF; Hebrew + 0600; 06FF; Arabic + 0700; 074F; Syriac + 0780; 07BF; Thaana + 0900; 097F; Devanagari + 0980; 09FF; Bengali + 0A00; 0A7F; Gurmukhi + 0A80; 0AFF; Gujarati + 0B00; 0B7F; Oriya + 0B80; 0BFF; Tamil + 0C00; 0C7F; Telugu + 0C80; 0CFF; Kannada + 0D00; 0D7F; Malayalam + 0D80; 0DFF; Sinhala + 0E00; 0E7F; Thai + 0E80; 0EFF; Lao + 0F00; 0FFF; Tibetan + 1000; 109F; Myanmar + 10A0; 10FF; Georgian + 1100; 11FF; Hangul Jamo + 1200; 137F; Ethiopic + 13A0; 13FF; Cherokee + 1400; 167F; Unified Canadian Aboriginal Syllabics + 1680; 169F; Ogham + 16A0; 16FF; Runic + 1780; 17FF; Khmer + 1800; 18AF; Mongolian + 1E00; 1EFF; Latin Extended Additional + 1F00; 1FFF; Greek Extended + 2000; 206F; General Punctuation + 2070; 209F; Superscripts and Subscripts + 20A0; 20CF; Currency Symbols + 20D0; 20FF; Combining Marks for Symbols + 2100; 214F; Letterlike Symbols + 2150; 218F; Number Forms + 2190; 21FF; Arrows + 2200; 22FF; Mathematical Operators + 2300; 23FF; Miscellaneous Technical + 2400; 243F; Control Pictures + 2440; 245F; Optical Character Recognition + 2460; 24FF; Enclosed Alphanumerics + 2500; 257F; Box Drawing + 2580; 259F; Block Elements + 25A0; 25FF; Geometric Shapes + 2600; 26FF; Miscellaneous Symbols + 2700; 27BF; Dingbats + 2800; 28FF; Braille Patterns + 2E80; 2EFF; CJK Radicals Supplement + 2F00; 2FDF; Kangxi Radicals + 2FF0; 2FFF; Ideographic Description Characters + 3000; 303F; CJK Symbols and Punctuation + 3040; 309F; Hiragana + 30A0; 30FF; Katakana + 3100; 312F; Bopomofo + 3130; 318F; Hangul Compatibility Jamo + 3190; 319F; Kanbun + 31A0; 31BF; Bopomofo Extended + 3200; 32FF; Enclosed CJK Letters and Months + 3300; 33FF; CJK Compatibility + 3400; 4DB5; CJK Unified Ideographs Extension A + 4E00; 9FFF; CJK Unified Ideographs + A000; A48F; Yi Syllables + A490; A4CF; Yi Radicals + AC00; D7A3; Hangul Syllables + D800; DB7F; High Surrogates + DB80; DBFF; High Private Use Surrogates + DC00; DFFF; Low Surrogates + E000; F8FF; Private Use + F900; FAFF; CJK Compatibility Ideographs + FB00; FB4F; Alphabetic Presentation Forms + FB50; FDFF; Arabic Presentation Forms-A + FE20; FE2F; Combining Half Marks + FE30; FE4F; CJK Compatibility Forms + FE50; FE6F; Small Form Variants + FE70; FEFE; Arabic Presentation Forms-B + FEFF; FEFF; Specials + FF00; FFEF; Halfwidth and Fullwidth Forms + FFF0; FFFD; Specials + diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/BytesToUnicode.java gcc-3.1/libjava/gnu/gcj/convert/BytesToUnicode.java *** gcc-3.0.4/libjava/gnu/gcj/convert/BytesToUnicode.java Mon Sep 11 00:35:51 2000 --- gcc-3.1/libjava/gnu/gcj/convert/BytesToUnicode.java Mon Jul 30 20:24:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** public abstract class BytesToUnicode ext *** 18,44 **** /** End of valid bytes in buffer. */ public int inlength; ! static Class defaultDecodingClass; ! static synchronized void getDefaultDecodingClass() ! { ! // Test (defaultDecodingClass == null) again in case of race condition. ! if (defaultDecodingClass == null) ! { ! String encoding = canonicalize (System.getProperty("file.encoding")); ! String className = "gnu.gcj.convert.Input_"+encoding; ! try ! { ! defaultDecodingClass = Class.forName(className); ! } ! catch (ClassNotFoundException ex) ! { ! throw new NoClassDefFoundError("missing default encoding " ! + encoding + " (class " ! + className + " not found)"); ! } ! } ! } public abstract String getName(); --- 18,37 ---- /** End of valid bytes in buffer. */ public int inlength; ! // The name of the default encoding. ! static String defaultEncoding; ! /* These keep a small cache of decoders for reuse. The array holds ! the actual decoders. The currCachePos is the next value we are ! going to replace in the cache. We don't just throw the data away ! if the cache is full, because if the cache filled up with stuff ! we don't need then the cache would be worthless. We instead ! circulate through the cache the implement kind of an LRU ! algorithm. */ ! private static final int CACHE_SIZE = 4; // A power of 2 for speed ! private static BytesToUnicode[] decoderCache ! = new BytesToUnicode[CACHE_SIZE]; ! private static int currCachePos = 0; public abstract String getName(); *************** public abstract class BytesToUnicode ext *** 46,65 **** { try { ! if (defaultDecodingClass == null) ! getDefaultDecodingClass(); ! return (BytesToUnicode) defaultDecodingClass.newInstance(); } catch (Throwable ex) { ! try ! { ! return new Input_iconv (System.getProperty ("file.encoding")); ! } ! catch (Throwable ex2) ! { ! return new Input_8859_1(); ! } } } --- 39,71 ---- { try { ! synchronized (BytesToUnicode.class) ! { ! if (defaultEncoding == null) ! { ! String encoding ! = canonicalize (System.getProperty("file.encoding", ! "8859_1")); ! String className = "gnu.gcj.convert.Input_" + encoding; ! try ! { ! Class defaultDecodingClass = Class.forName(className); ! defaultEncoding = encoding; ! } ! catch (ClassNotFoundException ex) ! { ! throw new NoClassDefFoundError("missing default encoding " ! + encoding + " (class " ! + className ! + " not found)"); ! } ! } ! } ! return getDecoder (defaultEncoding); } catch (Throwable ex) { ! return new Input_8859_1(); } } *************** public abstract class BytesToUnicode ext *** 67,72 **** --- 73,96 ---- public static BytesToUnicode getDecoder (String encoding) throws java.io.UnsupportedEncodingException { + /* First hunt in our cache to see if we have a decoder that is + already allocated. */ + synchronized (BytesToUnicode.class) + { + int i; + for (i = 0; i < decoderCache.length; ++i) + { + if (decoderCache[i] != null + && encoding.equals(decoderCache[i].getName ())) + { + BytesToUnicode rv = decoderCache[i]; + decoderCache[i] = null; + return rv; + } + } + } + + // It's not in the cache, so now we have to do real work. String className = "gnu.gcj.convert.Input_" + canonicalize (encoding); Class decodingClass; try *************** public abstract class BytesToUnicode ext *** 120,123 **** --- 144,165 ---- * of the length parameter for a read request). */ public abstract int read (char[] outbuffer, int outpos, int count); + + /** Indicate that the converter is resuable. + * This class keeps track of converters on a per-encoding basis. + * When done with an encoder you may call this method to indicate + * that it can be reused later. + */ + public void done () + { + synchronized (BytesToUnicode.class) + { + this.inbuffer = null; + this.inpos = 0; + this.inlength = 0; + + decoderCache[currCachePos] = this; + currCachePos = (currCachePos + 1) % CACHE_SIZE; + } + } } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/Convert.java gcc-3.1/libjava/gnu/gcj/convert/Convert.java *** gcc-3.0.4/libjava/gnu/gcj/convert/Convert.java Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/gnu/gcj/convert/Convert.java Mon Mar 25 22:15:16 2002 *************** *** 1,4 **** ! /* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1999, 2002 Free Software Foundation This file is part of libgcj. *************** public class Convert *** 13,23 **** { static void error (String message) { ! System.err.print("convert: "); System.err.println(message); ! System.err.println("Usage: convert [--from srcEncoding] [--to dstEncoding]"); ! System.err.println(" [inputfile [outputfile]]"); ! System.exit(-1); } static void missing (String arg) --- 13,54 ---- { static void error (String message) { ! System.err.print("jv-convert: "); System.err.println(message); ! System.err.println("Try `jv-convert --help' for more information."); ! System.exit(1); ! } ! ! static void help () ! { ! System.out.println("Usage: jv-convert [OPTIONS] [INPUTFILE [OUTPUTFILE]]"); ! System.out.println(); ! System.out.println("Convert from one encoding to another."); ! System.out.println(); ! System.out.println(" --encoding FROM"); ! System.out.println(" --from FROM use FROM as source encoding name"); ! System.out.println(" --to TO use TO as target encoding name"); ! System.out.println(" -i FILE read from FILE"); ! System.out.println(" -o FILE print output to FILE"); ! System.out.println(" --reverse swap FROM and TO encodings"); ! System.out.println(" --help print this help, then exit"); ! System.out.println(" --version print version number, then exit"); ! System.out.println(); ! System.out.println("`-' as a file name argument can be used to refer to stdin or stdout."); ! System.exit(0); ! } ! ! static void version () ! { ! System.out.println("jv-convert (" ! + System.getProperty("java.vm.name") ! + ") " ! + System.getProperty("java.vm.version")); ! System.out.println(); ! System.out.println("Copyright (C) 2002 Free Software Foundation, Inc."); ! System.out.println("This is free software; see the source for copying conditions. There is NO"); ! System.out.println("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."); ! System.exit(0); } static void missing (String arg) *************** public class Convert *** 66,71 **** --- 97,110 ---- { reverse = true; } + else if (arg.equals("-help") || arg.equals("--help")) + { + help (); + } + else if (arg.equals("-version") || arg.equals("--version")) + { + version (); + } else if (arg.equals("-")) { switch (seenNames) *************** public class Convert *** 143,149 **** } catch (java.io.IOException ex) { ! System.err.print("convert exception: "); System.err.println(ex); System.exit(-1); } --- 182,188 ---- } catch (java.io.IOException ex) { ! System.err.print("jv-convert exception: "); System.err.println(ex); System.exit(-1); } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/IOConverter.java gcc-3.1/libjava/gnu/gcj/convert/IOConverter.java *** gcc-3.0.4/libjava/gnu/gcj/convert/IOConverter.java Sat Sep 29 06:07:30 2001 --- gcc-3.1/libjava/gnu/gcj/convert/IOConverter.java Mon Sep 17 02:28:53 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** public abstract class IOConverter *** 26,32 **** { // Manually maintained aliases. Note that the value must be our // canonical name. ! hash.put ("ISO-Latin-1", "8859_1"); // On Solaris the default encoding, as returned by nl_langinfo(), // is `646' (aka ASCII), but the Solaris iconv_open() doesn't // understand that. We work around the problem by adding an --- 26,33 ---- { // Manually maintained aliases. Note that the value must be our // canonical name. ! hash.put ("iso-latin-1", "8859_1"); ! hash.put ("iso8859_1", "8859_1"); // On Solaris the default encoding, as returned by nl_langinfo(), // is `646' (aka ASCII), but the Solaris iconv_open() doesn't // understand that. We work around the problem by adding an *************** public abstract class IOConverter *** 34,66 **** hash.put ("646", "ASCII"); // All aliases after this point are automatically generated by the // `encodings.pl' script. Run it to make any corrections. ! hash.put ("ANSI_X3.4-1968", "ASCII"); hash.put ("iso-ir-6", "ASCII"); ! hash.put ("ANSI_X3.4-1986", "ASCII"); ! hash.put ("ISO_646.irv:1991", "ASCII"); ! hash.put ("ASCII", "ASCII"); ! hash.put ("ISO646-US", "ASCII"); ! hash.put ("US-ASCII", "ASCII"); hash.put ("us", "ASCII"); ! hash.put ("IBM367", "ASCII"); hash.put ("cp367", "ASCII"); ! hash.put ("csASCII", "ASCII"); ! hash.put ("ISO_8859-1:1987", "8859_1"); hash.put ("iso-ir-100", "8859_1"); ! hash.put ("ISO_8859-1", "8859_1"); ! hash.put ("ISO-8859-1", "8859_1"); hash.put ("latin1", "8859_1"); hash.put ("l1", "8859_1"); ! hash.put ("IBM819", "8859_1"); ! hash.put ("CP819", "8859_1"); ! hash.put ("csISOLatin1", "8859_1"); ! hash.put ("UTF-8", "UTF8"); ! hash.put ("Shift_JIS", "SJIS"); ! hash.put ("MS_Kanji", "SJIS"); ! hash.put ("csShiftJIS", "SJIS"); ! hash.put ("Extended_UNIX_Code_Packed_Format_for_Japanese", "EUCJIS"); ! hash.put ("csEUCPkdFmtJapanese", "EUCJIS"); ! hash.put ("EUC-JP", "EUCJIS"); iconv_byte_swap = iconv_init (); } --- 35,68 ---- hash.put ("646", "ASCII"); // All aliases after this point are automatically generated by the // `encodings.pl' script. Run it to make any corrections. ! hash.put ("ansi_x3.4-1968", "ASCII"); hash.put ("iso-ir-6", "ASCII"); ! hash.put ("ansi_x3.4-1986", "ASCII"); ! hash.put ("iso_646.irv:1991", "ASCII"); ! hash.put ("ascii", "ASCII"); ! hash.put ("iso646-us", "ASCII"); ! hash.put ("us-ascii", "ASCII"); hash.put ("us", "ASCII"); ! hash.put ("ibm367", "ASCII"); hash.put ("cp367", "ASCII"); ! hash.put ("csascii", "ASCII"); ! hash.put ("iso_8859-1:1987", "8859_1"); hash.put ("iso-ir-100", "8859_1"); ! hash.put ("iso_8859-1", "8859_1"); ! hash.put ("iso-8859-1", "8859_1"); hash.put ("latin1", "8859_1"); hash.put ("l1", "8859_1"); ! hash.put ("ibm819", "8859_1"); ! hash.put ("cp819", "8859_1"); ! hash.put ("csisolatin1", "8859_1"); ! hash.put ("utf-8", "UTF8"); ! hash.put ("none", "UTF8"); ! hash.put ("shift_jis", "SJIS"); ! hash.put ("ms_kanji", "SJIS"); ! hash.put ("csshiftjis", "SJIS"); ! hash.put ("extended_unix_code_packed_format_for_japanese", "EUCJIS"); ! hash.put ("cseucpkdfmtjapanese", "EUCJIS"); ! hash.put ("euc-jp", "EUCJIS"); iconv_byte_swap = iconv_init (); } *************** public abstract class IOConverter *** 70,76 **** // Turn an alias into the canonical form. protected static final String canonicalize (String name) { ! String c = (String) hash.get (name); return c == null ? name : c; } } --- 72,78 ---- // Turn an alias into the canonical form. protected static final String canonicalize (String name) { ! String c = (String) hash.get (name.toLowerCase ()); return c == null ? name : c; } } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/Input_iconv.java gcc-3.1/libjava/gnu/gcj/convert/Input_iconv.java *** gcc-3.0.4/libjava/gnu/gcj/convert/Input_iconv.java Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/gnu/gcj/convert/Input_iconv.java Mon Jul 30 20:24:18 2001 *************** *** 1,6 **** // Input_iconv.java -- Java side of iconv() reader. ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // Input_iconv.java -- Java side of iconv() reader. ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** public class Input_iconv extends BytesTo *** 33,38 **** --- 33,39 ---- private native void init (String encoding) throws UnsupportedEncodingException; public native int read (char[] outbuffer, int outpos, int count); + public native void done (); // The encoding we're using. private String encoding; diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/JIS0208_to_Unicode.cc gcc-3.1/libjava/gnu/gcj/convert/JIS0208_to_Unicode.cc *** gcc-3.0.4/libjava/gnu/gcj/convert/JIS0208_to_Unicode.cc Wed Apr 7 14:52:33 1999 --- gcc-3.1/libjava/gnu/gcj/convert/JIS0208_to_Unicode.cc Mon Oct 22 05:38:24 2001 *************** *** 1,4 **** --- 1,5 ---- /* This file is automatically generated from JIS0208.TXT. */ + #pragma GCC java_exceptions unsigned short JIS0208_to_Unicode[84][94] = { /* 1st byte: 33 */ { /* 2nd byte: 33 */ 0x3000, diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/JIS0212_to_Unicode.cc gcc-3.1/libjava/gnu/gcj/convert/JIS0212_to_Unicode.cc *** gcc-3.0.4/libjava/gnu/gcj/convert/JIS0212_to_Unicode.cc Wed Apr 7 14:52:33 1999 --- gcc-3.1/libjava/gnu/gcj/convert/JIS0212_to_Unicode.cc Mon Oct 22 05:38:25 2001 *************** *** 1,4 **** --- 1,5 ---- /* This file is automatically generated from JIS0212.TXT. */ + #pragma GCC java_exceptions unsigned short JIS0212_to_Unicode[76][94] = { /* 1st byte: 34 */ { 0, diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/Output_iconv.java gcc-3.1/libjava/gnu/gcj/convert/Output_iconv.java *** gcc-3.0.4/libjava/gnu/gcj/convert/Output_iconv.java Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/gnu/gcj/convert/Output_iconv.java Mon Jul 30 20:24:18 2001 *************** *** 1,6 **** // Output_iconv.java -- Java side of iconv() writer. ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // Output_iconv.java -- Java side of iconv() writer. ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** public class Output_iconv extends Unicod *** 33,38 **** --- 33,39 ---- private native void init (String encoding) throws UnsupportedEncodingException; public native int write (char[] inbuffer, int inpos, int count); + public native void done (); // The encoding we're using. private String encoding; diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/UnicodeCharacterDatabase-3.0.0.html gcc-3.1/libjava/gnu/gcj/convert/UnicodeCharacterDatabase-3.0.0.html *** gcc-3.0.4/libjava/gnu/gcj/convert/UnicodeCharacterDatabase-3.0.0.html Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/convert/UnicodeCharacterDatabase-3.0.0.html Wed Mar 6 19:12:46 2002 *************** *** 0 **** --- 1,345 ---- + + + + + + + + + + + + + + + + + + + Unicode Character Database + + + + + + + + + +

    UNICODE CHARACTER DATABASE
    + Version 3.0.0

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Revision3.0.0
    AuthorsMark Davis and Ken Whistler
    Date1999-09-11
    This Versionftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html
    Previous Versionn/a
    Latest Versionftp://ftp.unicode.org/Public/3.0-Update/UnicodeCharacterDatabase-3.0.0.html
    + +

    Copyright © 1995-1999 Unicode, Inc. All Rights reserved.

    + +

    Disclaimer

    + +

    The Unicode Character Database is provided as is by Unicode, Inc. No claims + + are made as to fitness for any particular purpose. No warranties of any kind are + + expressed or implied. The recipient agrees to determine applicability of + + information provided. If this file has been purchased on magnetic or optical + + media from Unicode, Inc., the sole remedy for any claim will be exchange of + + defective media within 90 days of receipt.

    + +

    This disclaimer is applicable for all other data files accompanying the + + Unicode Character Database, some of which have been compiled by the Unicode + + Consortium, and some of which have been supplied by other sources.

    + +

    Limitations on Rights to Redistribute This Data

    + +

    Recipient is granted the right to make copies in any form for internal + + distribution and to freely use the information supplied in the creation of + + products supporting the UnicodeTM Standard. The files in the Unicode + + Character Database can be redistributed to third parties or other organizations + + (whether for profit or not) as long as this notice and the disclaimer notice are + + retained. Information can be extracted from these files and used in + + documentation or programs, as long as there is an accompanying notice indicating + + the source.

    + +

    Introduction

    + +

    The Unicode Character Database is a set of files that define the Unicode + + character properties and internal mappings. For more information about character + + properties and mappings, see The + + Unicode Standard.

    + +

    The Unicode Character Database has been updated to reflect Version 3.0 of the + + Unicode Standard, with many characters added to those published in Version 2.0. + + A number of corrections have also been made to case mappings or other errors in + + the database noted since the publication of Version 2.0. Normative bidirectional + + properties have also been modified to reflect decisions of the Unicode Technical + + Committee.

    + +

    For more information on versions of the Unicode Standard and how to reference + + them, see http://www.unicode.org/unicode/standard/versions/.

    + +

    Conformance

    + +

    Character properties may be either normative or informative. Normative + + means that implementations that claim conformance to the Unicode Standard (at a + + particular version) and which make use of a particular property or field must + + follow the specifications of the standard for that property or field in order to + + be conformant. The term normative when applied to a property or field of + + the Unicode Character Database, does not mean that the value of that + + field will never change. Corrections and extensions to the standard in the + + future may require minor changes to normative values, even though the Unicode + + Technical Committee strives to minimize such changes. An informative property + + or field is strongly recommended, but a conformant implementation is free to use + + or change such values as it may require while still being conformant to the + + standard. Particular implementations may choose to override the properties and + + mappings that are not normative. In that case, it is up to the implementer to + + establish a protocol to convey that information.

    + +

    Files

    + +

    The following summarizes the files in the Unicode Character Database.  For + + more information about these files, see the referenced technical report or + + section of Unicode Standard, Version 3.0.

    + +

    UnicodeData.txt (Chapter 4) + +

      + +
    • The main file in the Unicode Character Database.
    • + +
    • For detailed information on the format, see UnicodeData.html. + + This file also characterizes which properties are normative and which are + + informative.
    • + +
    + +

    PropList.txt (Chapter 4) + +

      + +
    • Additional informative properties list: Alphabetic, Ideographic, + + and Mathematical, among others.
    • + +
    + +

    SpecialCasing.txt (Chapter 4) + +

      + +
    • List of informative special casing properties, including one-to-many + + mappings such as SHARP S => "SS", and locale-specific mappings, + + such as for Turkish dotless i.
    • + +
    + +

    Blocks.txt (Chapter 14) + +

      + +
    • List of normative block names.
    • + +
    + +

    Jamo.txt (Chapter 4) + +

      + +
    • List of normative Jamo short names, used in deriving HANGUL SYLLABLE names + + algorithmically.
    • + +
    + +

    ArabicShaping.txt (Section 8.2) + +

      + +
    • Basic Arabic and Syriac character shaping properties, such as initial, + + medial and final shapes. These properties are normative for minimal shaping + + of Arabic and Syriac.
    • + +
    + +

    NamesList.txt (Chapter 14) + +

      + +
    • This file duplicates some of the material in the UnicodeData file, and + + adds informative annotations uses in the character charts, as printed in the + + Unicode Standard.
    • + +
    • Note: The information in NamesList.txt and Index.txt files matches + + the appropriate version of the book. Changes in the Unicode Character + + Database since then may not be reflected in these files, since they are + + primarily of archival interest.
    • + +
    + +

    Index.txt (Chapter 14) + +

      + +
    • Informative index to Unicode characters, as printed in the Unicode + + Standard
    • + +
    • Note: The information in NamesList.txt and Index.txt files matches + + the appropriate version of the book. Changes in the Unicode Character + + Database since then may not be reflected in these files, since they are + + primarily of archival interest.
    • + +
    + +

    CompositionExclusions.txt (UTR#15 + + Unicode Normalization Forms) + +

      + +
    • Normative properties for normalization.
    • + +
    + +

    LineBreak.txt (UTR + + #14: Line Breaking Properties) + +

      + +
    • Normative and informative properties for line breaking. To see which + + properties are informative and which are normative, consult UTR#14.
    • + +
    + +

    EastAsianWidth.txt (UTR + + #11: East Asian Character Width) + +

      + +
    • Informative properties for determining the choice of wide vs. narrow + + glyphs in East Asian contexts.
    • + +
    + +

    diffXvY.txt + +

      + +
    • Mechanically-generated informative files containing accumulated + + differences between successive versions of UnicodeData.txt
    • + +
    + + + + + + + + + diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/UnicodeData-3.0.0.txt gcc-3.1/libjava/gnu/gcj/convert/UnicodeData-3.0.0.txt *** gcc-3.0.4/libjava/gnu/gcj/convert/UnicodeData-3.0.0.txt Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/convert/UnicodeData-3.0.0.txt Wed Mar 6 19:12:46 2002 *************** *** 0 **** --- 1,10617 ---- + 0000;;Cc;0;BN;;;;;N;NULL;;;; + 0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; + 0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; + 0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; + 0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; + 0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; + 0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; + 0007;;Cc;0;BN;;;;;N;BELL;;;; + 0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; + 0009;;Cc;0;S;;;;;N;HORIZONTAL TABULATION;;;; + 000A;;Cc;0;B;;;;;N;LINE FEED;;;; + 000B;;Cc;0;S;;;;;N;VERTICAL TABULATION;;;; + 000C;;Cc;0;WS;;;;;N;FORM FEED;;;; + 000D;;Cc;0;B;;;;;N;CARRIAGE RETURN;;;; + 000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; + 000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; + 0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; + 0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; + 0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; + 0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; + 0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; + 0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; + 0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; + 0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; + 0018;;Cc;0;BN;;;;;N;CANCEL;;;; + 0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; + 001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; + 001B;;Cc;0;BN;;;;;N;ESCAPE;;;; + 001C;;Cc;0;B;;;;;N;FILE SEPARATOR;;;; + 001D;;Cc;0;B;;;;;N;GROUP SEPARATOR;;;; + 001E;;Cc;0;B;;;;;N;RECORD SEPARATOR;;;; + 001F;;Cc;0;S;;;;;N;UNIT SEPARATOR;;;; + 0020;SPACE;Zs;0;WS;;;;;N;;;;; + 0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; + 0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; + 0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; + 0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; + 0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; + 0026;AMPERSAND;Po;0;ON;;;;;N;;;;; + 0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; + 0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; + 0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; + 002A;ASTERISK;Po;0;ON;;;;;N;;;;; + 002B;PLUS SIGN;Sm;0;ET;;;;;N;;;;; + 002C;COMMA;Po;0;CS;;;;;N;;;;; + 002D;HYPHEN-MINUS;Pd;0;ET;;;;;N;;;;; + 002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; + 002F;SOLIDUS;Po;0;ES;;;;;N;SLASH;;;; + 0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; + 0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; + 0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; + 0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; + 0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; + 0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; + 0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; + 0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; + 0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; + 0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; + 003A;COLON;Po;0;CS;;;;;N;;;;; + 003B;SEMICOLON;Po;0;ON;;;;;N;;;;; + 003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; + 003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; + 003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; + 003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; + 0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; + 0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; + 0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; + 0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; + 0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; + 0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; + 0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; + 0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; + 0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; + 0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; + 004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; + 004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; + 004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; + 004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; + 004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; + 004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; + 0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; + 0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; + 0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; + 0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; + 0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; + 0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; + 0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; + 0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; + 0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; + 0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; + 005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; + 005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; + 005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; + 005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; + 005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; + 005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; + 0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; + 0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 + 0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 + 0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 + 0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 + 0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 + 0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 + 0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 + 0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 + 0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 + 006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A + 006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B + 006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C + 006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D + 006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E + 006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F + 0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 + 0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 + 0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 + 0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 + 0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 + 0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 + 0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 + 0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 + 0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 + 0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 + 007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A + 007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; + 007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; + 007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; + 007E;TILDE;Sm;0;ON;;;;;N;;;;; + 007F;;Cc;0;BN;;;;;N;DELETE;;;; + 0080;;Cc;0;BN;;;;;N;;;;; + 0081;;Cc;0;BN;;;;;N;;;;; + 0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; + 0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; + 0084;;Cc;0;BN;;;;;N;INDEX;;;; + 0085;;Cc;0;B;;;;;N;NEXT LINE;;;; + 0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; + 0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; + 0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; + 0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; + 008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; + 008B;;Cc;0;BN;;;;;N;PARTIAL LINE DOWN;;;; + 008C;;Cc;0;BN;;;;;N;PARTIAL LINE UP;;;; + 008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; + 008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; + 008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; + 0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; + 0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; + 0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; + 0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; + 0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; + 0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; + 0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; + 0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; + 0098;;Cc;0;BN;;;;;N;START OF STRING;;;; + 0099;;Cc;0;BN;;;;;N;;;;; + 009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; + 009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; + 009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; + 009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; + 009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; + 009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; + 00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; + 00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; + 00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; + 00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; + 00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; + 00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; + 00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; + 00A7;SECTION SIGN;So;0;ON;;;;;N;;;;; + 00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; + 00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; + 00AA;FEMININE ORDINAL INDICATOR;Ll;0;L; 0061;;;;N;;;;; + 00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;*;;; + 00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; + 00AD;SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; + 00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; + 00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; + 00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; + 00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; + 00B2;SUPERSCRIPT TWO;No;0;EN; 0032;2;2;2;N;SUPERSCRIPT DIGIT TWO;;;; + 00B3;SUPERSCRIPT THREE;No;0;EN; 0033;3;3;3;N;SUPERSCRIPT DIGIT THREE;;;; + 00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; + 00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C + 00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; + 00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; + 00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; + 00B9;SUPERSCRIPT ONE;No;0;EN; 0031;1;1;1;N;SUPERSCRIPT DIGIT ONE;;;; + 00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L; 006F;;;;N;;;;; + 00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;*;;; + 00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; + 00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; + 00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; + 00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; + 00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; + 00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; + 00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; + 00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; + 00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; + 00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; + 00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;ash *;;00E6; + 00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; + 00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; + 00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; + 00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; + 00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; + 00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; + 00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; + 00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; + 00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; + 00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;Icelandic;;00F0; + 00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; + 00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; + 00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; + 00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; + 00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; + 00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; + 00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; + 00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; + 00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; + 00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; + 00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; + 00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; + 00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; + 00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;Icelandic;;00FE; + 00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;German;;; + 00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 + 00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 + 00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 + 00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 + 00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 + 00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 + 00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;ash *;00C6;;00C6 + 00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 + 00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 + 00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 + 00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA + 00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB + 00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC + 00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD + 00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE + 00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF + 00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;Icelandic;00D0;;00D0 + 00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 + 00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 + 00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 + 00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 + 00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 + 00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 + 00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; + 00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 + 00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 + 00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA + 00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB + 00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC + 00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD + 00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;Icelandic;00DE;;00DE + 00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 + 0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; + 0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 + 0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; + 0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 + 0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; + 0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 + 0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; + 0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 + 0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; + 0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 + 010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; + 010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A + 010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; + 010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C + 010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; + 010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E + 0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; + 0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 + 0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; + 0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 + 0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; + 0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 + 0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; + 0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 + 0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; + 0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 + 011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; + 011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A + 011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; + 011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C + 011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; + 011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E + 0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; + 0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 + 0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; + 0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 + 0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; + 0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 + 0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; + 0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 + 0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; + 0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 + 012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; + 012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A + 012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; + 012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C + 012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; + 012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E + 0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; + 0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 + 0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; + 0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 + 0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; + 0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 + 0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; + 0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 + 0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;Greenlandic;;; + 0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; + 013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 + 013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; + 013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B + 013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; + 013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D + 013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; + 0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F + 0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; + 0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 + 0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; + 0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 + 0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; + 0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 + 0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; + 0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 + 0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; + 014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;Sami;;014B; + 014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;Sami;014A;;014A + 014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; + 014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C + 014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; + 014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E + 0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; + 0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 + 0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; + 0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 + 0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; + 0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 + 0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; + 0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 + 0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; + 0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 + 015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; + 015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A + 015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; + 015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C + 015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;*;;015F; + 015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;*;015E;;015E + 0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; + 0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 + 0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;*;;0163; + 0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;*;0162;;0162 + 0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; + 0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 + 0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; + 0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 + 0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; + 0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 + 016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; + 016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A + 016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; + 016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C + 016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; + 016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E + 0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; + 0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 + 0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; + 0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 + 0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; + 0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 + 0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; + 0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 + 0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; + 0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; + 017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 + 017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; + 017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B + 017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; + 017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D + 017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 + 0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;;; + 0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; + 0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; + 0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 + 0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; + 0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 + 0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; + 0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; + 0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 + 0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;*;;0256; + 018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; + 018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; + 018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B + 018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; + 018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; + 018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; + 0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; + 0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; + 0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 + 0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; + 0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; + 0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;hwair;01F6;;01F6 + 0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; + 0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; + 0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; + 0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 + 019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;;; + 019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; + 019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; + 019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; + 019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;;; + 019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;*;;0275; + 01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; + 01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 + 01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;gha;;01A3; + 01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;gha;01A2;;01A2 + 01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; + 01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 + 01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; + 01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; + 01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 + 01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; + 01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; + 01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; + 01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; + 01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC + 01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; + 01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; + 01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF + 01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; + 01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; + 01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; + 01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 + 01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; + 01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 + 01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; + 01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; + 01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 + 01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; + 01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; + 01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; + 01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC + 01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; + 01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 + 01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; + 01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; + 01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; + 01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; + 01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 + 01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6; + 01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 + 01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 + 01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9; + 01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 + 01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB + 01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC; + 01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB + 01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; + 01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD + 01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; + 01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF + 01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; + 01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 + 01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; + 01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 + 01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; + 01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 + 01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; + 01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 + 01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; + 01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 + 01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; + 01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB + 01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E + 01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; + 01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE + 01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; + 01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 + 01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;ash *;;01E3; + 01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;ash *;01E2;;01E2 + 01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; + 01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 + 01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; + 01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 + 01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; + 01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 + 01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; + 01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA + 01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; + 01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC + 01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; + 01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE + 01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; + 01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 + 01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3; + 01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 + 01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; + 01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 + 01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; + 01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; + 01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; + 01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 + 01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; + 01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA + 01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;ash *;;01FD; + 01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;ash *;01FC;;01FC + 01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; + 01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE + 0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; + 0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 + 0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; + 0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 + 0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; + 0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 + 0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; + 0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 + 0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; + 0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 + 020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; + 020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A + 020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; + 020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C + 020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; + 020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E + 0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; + 0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 + 0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; + 0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 + 0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; + 0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 + 0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; + 0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 + 0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;*;;0219; + 0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;*;0218;;0218 + 021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;*;;021B; + 021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;*;021A;;021A + 021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; + 021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C + 021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; + 021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E + 0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; + 0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 + 0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; + 0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 + 0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; + 0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 + 0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; + 0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 + 022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; + 022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A + 022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; + 022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C + 022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; + 022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E + 0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; + 0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 + 0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; + 0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 + 0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;;; + 0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;;; + 0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;;; + 0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 + 0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 + 0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; + 0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 + 0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A + 0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; + 0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F + 025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; + 025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 + 025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;; + 025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; + 025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; + 025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; + 0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 + 0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;; + 0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; + 0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 + 0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; + 0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;; + 0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;; + 0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; + 0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 + 0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 + 026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; + 026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; + 026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;; + 026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; + 026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; + 026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C + 0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; + 0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;;; + 0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D + 0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; + 0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; + 0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F + 0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; + 0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; + 0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; + 0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; + 027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; + 027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; + 027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; + 027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;;; + 027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; + 027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; + 0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 + 0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; + 0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; + 0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 + 0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; + 0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; + 0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; + 0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;; + 0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE + 0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;;; + 028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 + 028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 + 028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;;; + 028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; + 028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; + 028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; + 0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; + 0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; + 0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 + 0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; + 0294;LATIN LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;;; + 0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; + 0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; + 0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; + 0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; + 0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; + 029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; + 029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; + 029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; + 029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; + 029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;; + 029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; + 02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; + 02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; + 02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; + 02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; + 02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; + 02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; + 02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; + 02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; + 02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; + 02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; + 02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; + 02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; + 02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; + 02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; + 02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; + 02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; + 02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; + 02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; + 02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; + 02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; + 02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; + 02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; + 02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; + 02B9;MODIFIER LETTER PRIME;Sk;0;ON;;;;;N;;;;; + 02BA;MODIFIER LETTER DOUBLE PRIME;Sk;0;ON;;;;;N;;;;; + 02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; + 02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; + 02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; + 02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; + 02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; + 02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; + 02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; + 02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; + 02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; + 02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; + 02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; + 02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; + 02C7;CARON;Sk;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;; + 02C8;MODIFIER LETTER VERTICAL LINE;Sk;0;ON;;;;;N;;;;; + 02C9;MODIFIER LETTER MACRON;Sk;0;ON;;;;;N;;Mandarin Chinese first tone;;; + 02CA;MODIFIER LETTER ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;; + 02CB;MODIFIER LETTER GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;; + 02CC;MODIFIER LETTER LOW VERTICAL LINE;Sk;0;ON;;;;;N;;;;; + 02CD;MODIFIER LETTER LOW MACRON;Sk;0;ON;;;;;N;;;;; + 02CE;MODIFIER LETTER LOW GRAVE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; + 02CF;MODIFIER LETTER LOW ACUTE ACCENT;Sk;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; + 02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; + 02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; + 02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; + 02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; + 02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; + 02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; + 02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; + 02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; + 02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; + 02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;Mandarin Chinese light tone;;; + 02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; + 02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; + 02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; + 02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; + 02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; + 02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; + 02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; + 02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; + 02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; + 02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; + 02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; + 02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; + 02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; + 02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; + 02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; + 02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; + 02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; + 02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; + 02EC;MODIFIER LETTER VOICING;Sk;0;ON;;;;;N;;;;; + 02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; + 02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; + 0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;Varia;;; + 0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;Oxia;;; + 0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; + 0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; + 0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; + 0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; + 0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;Vrachy;;; + 0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; + 0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;Dialytika;;; + 0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; + 030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; + 030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; + 030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; + 030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;Tonos;;; + 030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; + 030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; + 0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; + 0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; + 0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; + 0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;Psili;;; + 0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;Dasia;;; + 0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; + 0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; + 0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; + 0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; + 0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; + 031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; + 031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; + 031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; + 031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; + 031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; + 031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; + 0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; + 0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; + 0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; + 0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; + 0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; + 0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; + 0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; + 0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; + 0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; + 0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; + 032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; + 032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; + 032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; + 032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; + 032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; + 032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; + 0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; + 0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; + 0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; + 0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; + 0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; + 0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; + 0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; + 0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; + 0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; + 0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; + 033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; + 033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; + 033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; + 033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; + 033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; + 033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; + 0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;Vietnamese;;; + 0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;Vietnamese;;; + 0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; + 0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; + 0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; + 0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 + 0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; + 0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; + 0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; + 0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; + 034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; + 034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; + 034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; + 034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; + 034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; + 0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; + 0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; + 0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; + 0374;GREEK NUMERAL SIGN;Sk;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;Dexia keraia;;; + 0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;Aristeri keraia;;; + 037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; + 037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;Erotimatiko;;; + 0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; + 0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; + 0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; + 0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; + 0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; + 0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; + 038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; + 038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; + 038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; + 038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; + 0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; + 0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; + 0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; + 0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; + 0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; + 0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; + 0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; + 0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; + 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; + 0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; + 039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; + 039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; + 039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; + 039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; + 039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; + 039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; + 03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; + 03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; + 03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; + 03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; + 03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; + 03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; + 03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; + 03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; + 03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; + 03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; + 03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; + 03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 + 03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 + 03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 + 03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A + 03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; + 03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 + 03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 + 03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 + 03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 + 03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 + 03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 + 03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 + 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 + 03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 + 03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A + 03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B + 03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C + 03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D + 03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E + 03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F + 03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 + 03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 + 03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 + 03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 + 03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 + 03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 + 03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 + 03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 + 03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 + 03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 + 03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA + 03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB + 03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C + 03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E + 03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F + 03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 + 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 + 03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; + 03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; + 03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; + 03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 + 03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 + 03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;;; + 03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; + 03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA + 03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; + 03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC + 03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; + 03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE + 03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; + 03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 + 03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; + 03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 + 03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; + 03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 + 03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; + 03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 + 03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; + 03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 + 03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; + 03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA + 03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; + 03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC + 03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; + 03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE + 03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A + 03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 + 03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03A3;;03A3 + 03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;; + 0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; + 0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; + 0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;Serbocroatian;;0452; + 0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; + 0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; + 0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; + 0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; + 0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;Ukrainian;;0457; + 0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; + 0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; + 040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; + 040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;Serbocroatian;;045B; + 040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; + 040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; + 040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;Byelorussian;;045E; + 040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; + 0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; + 0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; + 0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; + 0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; + 0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; + 0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; + 0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; + 0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; + 0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; + 0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; + 041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; + 041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; + 041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; + 041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; + 041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; + 041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; + 0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; + 0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; + 0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; + 0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; + 0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; + 0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; + 0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; + 0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; + 0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; + 0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; + 042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; + 042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; + 042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; + 042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; + 042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; + 042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; + 0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 + 0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 + 0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 + 0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 + 0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 + 0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 + 0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 + 0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 + 0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 + 0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 + 043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A + 043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B + 043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C + 043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D + 043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E + 043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F + 0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 + 0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 + 0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 + 0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 + 0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 + 0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 + 0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 + 0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 + 0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 + 0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 + 044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A + 044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B + 044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C + 044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D + 044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E + 044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F + 0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 + 0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 + 0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;Serbocroatian;0402;;0402 + 0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 + 0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 + 0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 + 0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 + 0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;Ukrainian;0407;;0407 + 0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 + 0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 + 045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A + 045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;Serbocroatian;040B;;040B + 045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C + 045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D + 045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;Byelorussian;040E;;040E + 045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F + 0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; + 0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 + 0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; + 0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 + 0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; + 0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 + 0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; + 0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 + 0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; + 0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 + 046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; + 046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A + 046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; + 046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C + 046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; + 046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E + 0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; + 0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 + 0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; + 0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 + 0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; + 0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 + 0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; + 0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 + 0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; + 0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 + 047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; + 047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A + 047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; + 047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C + 047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; + 047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E + 0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; + 0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 + 0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; + 0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; + 0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; + 0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; + 0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; + 0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; + 0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; + 048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; + 048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C + 048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; + 048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E + 0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; + 0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 + 0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; + 0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 + 0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; + 0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 + 0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; + 0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 + 0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; + 0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 + 049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; + 049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A + 049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; + 049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C + 049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; + 049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E + 04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; + 04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 + 04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; + 04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 + 04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; + 04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 + 04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;Abkhasian;;04A7; + 04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;Abkhasian;04A6;;04A6 + 04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; + 04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 + 04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; + 04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA + 04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; + 04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC + 04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; + 04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE + 04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; + 04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 + 04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; + 04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 + 04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;Abkhasian;;04B5; + 04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;Abkhasian;04B4;;04B4 + 04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; + 04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 + 04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; + 04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 + 04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; + 04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA + 04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; + 04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC + 04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; + 04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE + 04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;; + 04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; + 04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 + 04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; + 04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 + 04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; + 04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 + 04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; + 04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB + 04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; + 04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 + 04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; + 04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 + 04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; + 04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 + 04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; + 04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 + 04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; + 04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 + 04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; + 04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA + 04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; + 04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC + 04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; + 04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE + 04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; + 04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 + 04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; + 04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 + 04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; + 04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 + 04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; + 04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 + 04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; + 04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 + 04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; + 04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA + 04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; + 04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC + 04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; + 04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE + 04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; + 04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 + 04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; + 04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 + 04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; + 04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 + 04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; + 04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 + 0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; + 0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; + 0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; + 0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; + 0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; + 0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; + 0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; + 0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; + 0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; + 053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; + 053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; + 053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; + 053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; + 053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; + 053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; + 0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; + 0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; + 0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; + 0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; + 0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; + 0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; + 0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; + 0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; + 0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; + 0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; + 054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; + 054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; + 054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; + 054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; + 054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; + 054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; + 0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; + 0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; + 0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; + 0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; + 0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; + 0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; + 0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; + 0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; + 055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; + 055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; + 055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; + 055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; + 055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; + 055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; + 0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 + 0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 + 0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 + 0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 + 0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 + 0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 + 0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 + 0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 + 0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 + 056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A + 056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B + 056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C + 056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D + 056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E + 056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F + 0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 + 0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 + 0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 + 0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 + 0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 + 0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 + 0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 + 0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 + 0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 + 0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 + 057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A + 057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B + 057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C + 057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D + 057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E + 057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F + 0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 + 0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 + 0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 + 0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 + 0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 + 0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 + 0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 + 0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; + 0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; + 058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; + 0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; + 0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; + 0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; + 0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; + 0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; + 0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;*;;; + 0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; + 0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;*;;; + 0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; + 059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; + 059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; + 059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; + 059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; + 059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; + 059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; + 05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; + 05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; + 05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; + 05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; + 05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;*;;; + 05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; + 05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; + 05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;*;;; + 05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; + 05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;*;;; + 05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; + 05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; + 05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; + 05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; + 05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; + 05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; + 05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; + 05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; + 05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; + 05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; + 05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; + 05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; + 05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; + 05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; + 05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; + 05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; + 05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;or shuruq;;; + 05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;*;;; + 05BE;HEBREW PUNCTUATION MAQAF;Po;0;R;;;;;N;;;;; + 05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; + 05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;*;;; + 05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; + 05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; + 05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;*;;; + 05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; + 05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; + 05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; + 05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; + 05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; + 05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; + 05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; + 05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; + 05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; + 05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; + 05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; + 05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; + 05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; + 05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; + 05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; + 05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; + 05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; + 05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; + 05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; + 05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; + 05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; + 05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; + 05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; + 05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; + 05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; + 05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; + 05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; + 05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; + 05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; + 05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; + 05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; + 05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; + 05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; + 060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; + 061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; + 061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; + 0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; + 0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; + 0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; + 0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; + 0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; + 0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; + 0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; + 0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; + 0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; + 062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; + 062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; + 062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; + 062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; + 062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; + 062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; + 0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; + 0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; + 0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; + 0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; + 0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; + 0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; + 0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; + 0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; + 0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; + 0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; + 063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; + 0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; + 0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; + 0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; + 0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; + 0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; + 0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; + 0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; + 0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; + 0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; + 0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; + 064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; + 064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; + 064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; + 064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; + 064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; + 064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; + 0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; + 0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; + 0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; + 0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; + 0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; + 0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; + 0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; + 0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; + 0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; + 0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; + 0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; + 0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; + 0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; + 0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; + 0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; + 0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; + 066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; + 066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; + 066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; + 066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; + 0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; + 0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; + 0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; + 0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; + 0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; + 0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; + 0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; + 0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; + 0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; + 0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; + 067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; + 067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; + 067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; + 067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; + 067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; + 067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; + 0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; + 0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; + 0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; + 0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; + 0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; + 0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; + 0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; + 0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; + 0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; + 0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; + 068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; + 068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; + 068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; + 068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; + 068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; + 068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; + 0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; + 0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; + 0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; + 0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; + 0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; + 0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; + 0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; + 0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; + 0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; + 069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; + 069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; + 069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; + 069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; + 06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; + 06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; + 06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; + 06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; + 06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; + 06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; + 06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; + 06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; + 06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; + 06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; + 06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; + 06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; + 06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;*;;; + 06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; + 06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; + 06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; + 06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; + 06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; + 06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; + 06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; + 06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; + 06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; + 06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; + 06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; + 06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; + 06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; + 06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; + 06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; + 06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; + 06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; + 06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; + 06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; + 06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; + 06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; + 06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; + 06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; + 06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; + 06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; + 06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; + 06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; + 06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; + 06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; + 06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;*;;; + 06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; + 06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; + 06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; + 06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; + 06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; + 06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; + 06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; + 06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; + 06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; + 06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; + 06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; + 06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; + 06DD;ARABIC END OF AYAH;Me;0;NSM;;;;;N;;;;; + 06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;; + 06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; + 06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; + 06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; + 06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; + 06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; + 06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; + 06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; + 06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; + 06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; + 06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; + 06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; + 06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; + 06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; + 06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; + 06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; + 06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; + 06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; + 06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; + 06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; + 06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; + 06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; + 06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; + 06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; + 06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; + 06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; + 06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; + 06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; + 06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; + 06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; + 06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; + 0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; + 0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; + 0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; + 0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; + 0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; + 0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; + 0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; + 0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; + 0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; + 0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; + 070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; + 070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; + 070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; + 070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; + 070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;; + 0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; + 0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; + 0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; + 0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; + 0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; + 0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; + 0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; + 0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; + 0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; + 0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; + 071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; + 071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; + 071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; + 071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; + 071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; + 071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; + 0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; + 0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; + 0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; + 0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; + 0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; + 0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; + 0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; + 0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; + 0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; + 0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; + 072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; + 072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; + 072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; + 0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; + 0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; + 0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; + 0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; + 0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; + 0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; + 0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; + 0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; + 0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; + 0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; + 073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; + 073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; + 073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; + 073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; + 073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; + 073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; + 0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; + 0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; + 0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; + 0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; + 0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; + 0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; + 0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; + 0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; + 0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; + 0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; + 074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; + 0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; + 0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; + 0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; + 0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; + 0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; + 0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; + 0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; + 0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; + 0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; + 0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; + 078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; + 078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; + 078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; + 078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; + 078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; + 078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; + 0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; + 0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; + 0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; + 0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; + 0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; + 0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; + 0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; + 0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; + 0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; + 0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; + 079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; + 079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; + 079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; + 079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; + 079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; + 079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; + 07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; + 07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; + 07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; + 07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; + 07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; + 07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; + 07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; + 07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; + 07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; + 07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; + 07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; + 07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; + 07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; + 07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; + 07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; + 07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; + 07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; + 0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; + 0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; + 0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; + 0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; + 0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; + 0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; + 0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; + 090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; + 090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; + 090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; + 090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; + 090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; + 0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; + 0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; + 0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; + 0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; + 0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; + 0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; + 0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; + 0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; + 0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; + 0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; + 091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; + 091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; + 091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; + 091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; + 091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; + 091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; + 0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; + 0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; + 0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; + 0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; + 0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; + 0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; + 0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; + 0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; + 0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; + 0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; + 092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; + 092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; + 092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; + 092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; + 092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; + 092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; + 0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; + 0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; + 0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; + 0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; + 0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; + 0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; + 0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; + 0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; + 0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; + 0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; + 093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; + 093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; + 093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; + 0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; + 0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; + 0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; + 0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; + 0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; + 0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; + 0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; + 0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; + 094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; + 094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; + 094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; + 094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; + 0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; + 0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; + 0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; + 0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; + 0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; + 0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; + 095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; + 095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; + 095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; + 095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; + 095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; + 095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; + 0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; + 0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; + 0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; + 0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; + 0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; + 0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; + 0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; + 0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; + 0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; + 0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; + 0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; + 0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; + 0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; + 098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; + 098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; + 098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; + 0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; + 0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; + 0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; + 0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; + 0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; + 0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; + 0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; + 0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; + 099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; + 099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; + 099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; + 099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; + 099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; + 099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; + 09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; + 09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; + 09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; + 09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; + 09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; + 09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; + 09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; + 09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; + 09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; + 09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; + 09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; + 09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; + 09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; + 09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; + 09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; + 09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; + 09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; + 09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; + 09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; + 09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; + 09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; + 09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; + 09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; + 09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; + 09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; + 09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; + 09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; + 09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; + 09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; + 09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; + 09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; + 09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; + 09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; + 09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; + 09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; + 09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; + 09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; + 09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;Assamese;;; + 09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;Assamese;;; + 09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; + 09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; + 09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1;N;;;;; + 09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;2;N;;;;; + 09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3;N;;;;; + 09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;4;N;;;;; + 09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;;N;;;;; + 09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; + 09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; + 0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; + 0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; + 0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; + 0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; + 0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; + 0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; + 0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; + 0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; + 0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; + 0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; + 0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; + 0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; + 0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; + 0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; + 0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; + 0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; + 0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; + 0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; + 0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; + 0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; + 0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; + 0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; + 0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; + 0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; + 0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; + 0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; + 0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; + 0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; + 0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; + 0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; + 0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; + 0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; + 0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; + 0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; + 0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; + 0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; + 0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; + 0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; + 0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; + 0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; + 0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; + 0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; + 0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; + 0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; + 0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; + 0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; + 0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; + 0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; + 0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; + 0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; + 0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; + 0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; + 0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; + 0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; + 0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; + 0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; + 0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; + 0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; + 0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; + 0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; + 0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; + 0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; + 0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; + 0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; + 0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; + 0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; + 0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; + 0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; + 0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; + 0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; + 0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; + 0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; + 0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; + 0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; + 0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; + 0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; + 0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; + 0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; + 0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; + 0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; + 0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; + 0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; + 0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; + 0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; + 0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; + 0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; + 0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; + 0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; + 0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; + 0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; + 0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; + 0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; + 0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; + 0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; + 0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; + 0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; + 0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; + 0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; + 0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; + 0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; + 0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; + 0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; + 0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; + 0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; + 0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; + 0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; + 0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; + 0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; + 0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; + 0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; + 0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; + 0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; + 0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; + 0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; + 0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; + 0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; + 0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; + 0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; + 0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; + 0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; + 0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; + 0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; + 0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; + 0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; + 0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; + 0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; + 0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; + 0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; + 0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; + 0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; + 0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; + 0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; + 0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; + 0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; + 0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; + 0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; + 0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; + 0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; + 0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; + 0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; + 0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; + 0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; + 0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; + 0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; + 0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; + 0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; + 0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; + 0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; + 0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; + 0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; + 0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; + 0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; + 0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; + 0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; + 0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; + 0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; + 0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; + 0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; + 0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; + 0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; + 0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; + 0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; + 0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; + 0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; + 0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; + 0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; + 0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; + 0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; + 0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; + 0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; + 0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; + 0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; + 0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; + 0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; + 0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; + 0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; + 0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; + 0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; + 0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; + 0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; + 0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; + 0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; + 0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; + 0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; + 0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; + 0B83;TAMIL SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; + 0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; + 0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; + 0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; + 0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; + 0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; + 0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; + 0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; + 0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; + 0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; + 0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; + 0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; + 0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; + 0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; + 0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; + 0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; + 0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; + 0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; + 0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; + 0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; + 0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; + 0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; + 0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; + 0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; + 0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; + 0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; + 0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; + 0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; + 0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; + 0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; + 0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; + 0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; + 0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; + 0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; + 0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; + 0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; + 0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; + 0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; + 0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; + 0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; + 0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; + 0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; + 0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; + 0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; + 0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; + 0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; + 0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; + 0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; + 0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; + 0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; + 0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; + 0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; + 0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; + 0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; + 0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; + 0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; + 0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; + 0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; + 0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; + 0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; + 0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; + 0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; + 0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; + 0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; + 0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; + 0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; + 0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; + 0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; + 0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; + 0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; + 0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; + 0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; + 0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; + 0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; + 0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; + 0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; + 0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; + 0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; + 0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; + 0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; + 0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; + 0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; + 0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; + 0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; + 0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; + 0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; + 0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; + 0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; + 0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; + 0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; + 0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; + 0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; + 0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; + 0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; + 0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; + 0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; + 0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; + 0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; + 0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; + 0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; + 0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; + 0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; + 0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; + 0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; + 0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; + 0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; + 0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; + 0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; + 0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; + 0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; + 0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; + 0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; + 0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; + 0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; + 0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; + 0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; + 0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; + 0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; + 0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; + 0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; + 0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; + 0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; + 0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; + 0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; + 0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; + 0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; + 0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; + 0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; + 0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; + 0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; + 0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; + 0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; + 0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; + 0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; + 0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; + 0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; + 0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; + 0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; + 0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; + 0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; + 0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; + 0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; + 0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; + 0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; + 0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; + 0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; + 0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; + 0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; + 0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; + 0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; + 0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; + 0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; + 0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; + 0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; + 0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; + 0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; + 0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; + 0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; + 0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; + 0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; + 0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; + 0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; + 0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; + 0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 0CBF;KANNADA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; + 0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; + 0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; + 0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; + 0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; + 0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; + 0CC6;KANNADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; + 0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; + 0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; + 0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; + 0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; + 0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; + 0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; + 0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; + 0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; + 0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; + 0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; + 0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; + 0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; + 0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; + 0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; + 0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; + 0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; + 0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; + 0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; + 0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; + 0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; + 0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; + 0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; + 0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; + 0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; + 0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; + 0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; + 0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; + 0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; + 0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; + 0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; + 0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; + 0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; + 0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; + 0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; + 0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; + 0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; + 0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; + 0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; + 0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; + 0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; + 0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; + 0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; + 0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; + 0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; + 0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; + 0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; + 0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; + 0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; + 0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; + 0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; + 0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; + 0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; + 0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; + 0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; + 0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; + 0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; + 0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; + 0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; + 0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; + 0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; + 0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; + 0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; + 0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; + 0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; + 0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; + 0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; + 0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; + 0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; + 0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; + 0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; + 0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; + 0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; + 0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; + 0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; + 0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; + 0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; + 0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; + 0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; + 0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; + 0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; + 0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; + 0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; + 0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; + 0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; + 0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; + 0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; + 0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; + 0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; + 0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; + 0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; + 0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; + 0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; + 0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; + 0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; + 0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; + 0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; + 0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; + 0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; + 0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; + 0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; + 0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; + 0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; + 0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; + 0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; + 0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; + 0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; + 0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; + 0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; + 0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; + 0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; + 0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; + 0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; + 0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; + 0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; + 0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; + 0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; + 0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; + 0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; + 0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; + 0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; + 0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; + 0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; + 0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; + 0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; + 0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; + 0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; + 0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; + 0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; + 0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; + 0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; + 0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; + 0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; + 0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; + 0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; + 0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; + 0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; + 0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; + 0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; + 0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; + 0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; + 0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; + 0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; + 0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; + 0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; + 0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; + 0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; + 0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; + 0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; + 0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; + 0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; + 0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; + 0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; + 0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; + 0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; + 0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; + 0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; + 0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; + 0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; + 0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; + 0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; + 0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; + 0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; + 0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; + 0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; + 0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; + 0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; + 0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; + 0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; + 0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; + 0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; + 0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; + 0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; + 0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; + 0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; + 0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; + 0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; + 0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; + 0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; + 0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; + 0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; + 0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; + 0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; + 0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; + 0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; + 0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; + 0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; + 0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; + 0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; + 0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; + 0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; + 0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; + 0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; + 0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; + 0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; + 0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; + 0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; + 0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;paiyan noi;;; + 0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; + 0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; + 0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; + 0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; + 0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; + 0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; + 0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; + 0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;sara uue;;; + 0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; + 0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; + 0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; + 0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; + 0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; + 0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; + 0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; + 0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;sara ai mai muan;;; + 0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;sara ai mai malai;;; + 0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;lakkhang yao;;; + 0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;mai yamok;;; + 0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;mai taikhu;;; + 0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; + 0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; + 0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; + 0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; + 0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; + 0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;nikkhahit;;; + 0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; + 0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; + 0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; + 0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; + 0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; + 0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; + 0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; + 0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; + 0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; + 0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; + 0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; + 0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; + 0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; + 0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; + 0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; + 0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; + 0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; + 0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; + 0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; + 0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; + 0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; + 0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; + 0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; + 0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; + 0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; + 0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; + 0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; + 0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; + 0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; + 0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; + 0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; + 0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; + 0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; + 0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; + 0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; + 0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; + 0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; + 0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; + 0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; + 0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; + 0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; + 0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; + 0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; + 0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; + 0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; + 0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; + 0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; + 0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; + 0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; + 0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; + 0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; + 0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; + 0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; + 0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; + 0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; + 0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; + 0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; + 0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; + 0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; + 0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; + 0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;ter yik go a thung;;; + 0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;ter yik go wum nam chey ma;;; + 0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;ter yik go wum ter tsek ma;;; + 0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;yik go dun ma;;; + 0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;yik go kab ma;;; + 0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;yik go pur shey ma;;; + 0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;yik go tsek shey ma;;; + 0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;drul shey;;; + 0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;kur yik go;;; + 0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;ka sho yik go;;; + 0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;tsek;;; + 0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;tsek tar;;; + 0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;shey;;; + 0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;nyi shey;;; + 0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;tsek shey;;; + 0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;nyi tsek shey;;; + 0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;rinchen pung shey;;; + 0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;gya tram shey;;; + 0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;dzu ta me long chen;;; + 0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;ter tsek;;; + 0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;che ta;;; + 0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;hlak ta;;; + 0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;trachen char ta;;; + 0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;kyu pa;;; + 0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;dong tsu;;; + 0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;deka chig;;; + 0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;deka nyi;;; + 0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;deka sum;;; + 0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;dena chig;;; + 0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;dena nyi;;; + 0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;deka dena;;; + 0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;;N;;;;; + 0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;;N;;;;; + 0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;;N;;;;; + 0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;;N;;;;; + 0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;;N;;;;; + 0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;;N;;;;; + 0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;;N;;;;; + 0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;;N;;;;; + 0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;;N;;;;; + 0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;;N;;;;; + 0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;du ta;;; + 0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;nge zung nyi da;;; + 0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;dzu ta shi mig chen;;; + 0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;nge zung gor ta;;; + 0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;che go;;; + 0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;tsa tru;;; + 0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;N;;gug ta yun;;; + 0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;N;;gug ta ye;;; + 0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;N;TIBETAN LEFT BRACE;ang kang yun;;; + 0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;N;TIBETAN RIGHT BRACE;ang kang ye;;; + 0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;yar tse;;; + 0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;mar tse;;; + 0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; + 0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; + 0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; + 0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; + 0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; + 0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; + 0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; + 0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; + 0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; + 0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; + 0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; + 0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; + 0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; + 0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; + 0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; + 0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; + 0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; + 0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; + 0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; + 0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; + 0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; + 0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; + 0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; + 0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; + 0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; + 0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; + 0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; + 0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; + 0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; + 0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; + 0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; + 0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; + 0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; + 0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;*;;; + 0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; + 0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; + 0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; + 0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; + 0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; + 0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; + 0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; + 0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;*;;; + 0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; + 0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; + 0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; + 0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; + 0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; + 0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; + 0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; + 0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; + 0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; + 0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; + 0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; + 0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; + 0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; + 0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;je su nga ro;;; + 0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;nam chey;;; + 0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; + 0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; + 0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;nyi da na da;;; + 0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;nan de;;; + 0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; + 0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; + 0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;ji ta;;; + 0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;yang ta;;; + 0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;che tsa chen;;; + 0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;chu chen;;; + 0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;tru chen ging;;; + 0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;tru me ging;;; + 0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; + 0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; + 0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; + 0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; + 0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; + 0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; + 0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; + 0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; + 0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; + 0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; + 0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; + 0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; + 0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; + 0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; + 0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; + 0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; + 0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; + 0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; + 0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; + 0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; + 0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; + 0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; + 0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; + 0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; + 0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; + 0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; + 0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; + 0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; + 0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;*;;; + 0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; + 0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; + 0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; + 0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;*;;; + 0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;*;;; + 0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; + 0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; + 0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; + 0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; + 0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; + 0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; + 0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; + 0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;*;;; + 0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;*;;; + 0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;*;;; + 0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;kuruka;;; + 0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;kuruka shi mik chen;;; + 0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; + 0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; + 0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;chang tyu;;; + 0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;bub chey;;; + 0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;drilbu;;; + 0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;dorje;;; + 0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;pema den;;; + 0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;dorje gya dram;;; + 0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;phurba;;; + 0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;norbu;;; + 0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;norbu nyi khyi;;; + 0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;norbu sum khyi;;; + 0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;norbu shi khyi;;; + 0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; + 1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; + 1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; + 1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; + 1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; + 1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; + 1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; + 1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; + 1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; + 1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; + 1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; + 100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; + 100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; + 100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; + 100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; + 100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; + 100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; + 1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; + 1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; + 1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; + 1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; + 1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; + 1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; + 1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; + 1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; + 1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; + 1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; + 101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; + 101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; + 101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; + 101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; + 101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; + 101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; + 1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; + 1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; + 1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; + 1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; + 1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; + 1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; + 1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; + 1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; + 102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; + 102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; + 102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; + 102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; + 1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; + 1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; + 1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; + 1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; + 1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; + 1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; + 104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; + 104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; + 104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; + 104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; + 104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; + 1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; + 1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; + 1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; + 1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; + 1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; + 1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; + 1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; + 1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; + 1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; + 1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; + 10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;; + 10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;; + 10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;; + 10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;; + 10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;; + 10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;; + 10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;; + 10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;; + 10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;; + 10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;; + 10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;; + 10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;; + 10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;; + 10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;; + 10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;; + 10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;; + 10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;; + 10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; + 10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; + 10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; + 10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; + 10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; + 10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; + 10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; + 10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; + 10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; + 10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; + 10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; + 10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; + 10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; + 10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; + 10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; + 10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; + 10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; + 10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; + 10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; + 10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; + 10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; + 10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; + 10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; + 10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; + 10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; + 10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; + 10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; + 10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; + 10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; + 10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; + 10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; + 10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; + 10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; + 10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; + 10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; + 10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; + 10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; + 10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; + 10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; + 10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; + 1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; + 1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; + 1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; + 1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; + 1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;dd *;;; + 1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;r *;;; + 1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; + 1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; + 1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;bb *;;; + 1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;s *;;; + 110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; + 110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; + 110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; + 110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;jj *;;; + 110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; + 110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; + 1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; + 1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; + 1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; + 1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; + 1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; + 1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; + 1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; + 1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; + 1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; + 1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; + 111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; + 111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; + 111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; + 111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; + 111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; + 111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; + 1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; + 1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; + 1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; + 1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; + 1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; + 1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; + 1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; + 1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; + 1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; + 1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; + 112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; + 112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; + 112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; + 112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; + 112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; + 112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; + 1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; + 1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; + 1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; + 1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; + 1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; + 1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; + 1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; + 1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; + 1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; + 1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; + 113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; + 113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; + 113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; + 113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; + 113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; + 113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; + 1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; + 1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; + 1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; + 1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; + 1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; + 1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; + 1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; + 1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; + 1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; + 1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; + 114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; + 114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; + 114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; + 114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; + 114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; + 114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; + 1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; + 1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; + 1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; + 1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; + 1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; + 1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; + 1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; + 1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; + 1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; + 1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; + 115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; + 1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; + 1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; + 1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; + 1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; + 1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; + 1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; + 1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; + 1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; + 1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; + 1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; + 116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; + 116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; + 116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; + 116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; + 116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; + 116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; + 1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; + 1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; + 1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; + 1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; + 1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; + 1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; + 1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; + 1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; + 1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; + 1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; + 117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; + 117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; + 117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; + 117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; + 117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; + 117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; + 1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; + 1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; + 1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; + 1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; + 1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; + 1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; + 1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; + 1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; + 1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; + 1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; + 118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; + 118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; + 118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; + 118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; + 118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; + 118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; + 1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; + 1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; + 1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; + 1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; + 1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; + 1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; + 1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; + 1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; + 1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; + 1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; + 119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; + 119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; + 119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; + 119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; + 119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; + 119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; + 11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; + 11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; + 11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; + 11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;g *;;; + 11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;gg *;;; + 11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;gs *;;; + 11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;n *;;; + 11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;nj *;;; + 11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;nh *;;; + 11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;d *;;; + 11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;l *;;; + 11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;lg *;;; + 11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;lm *;;; + 11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;lb *;;; + 11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;ls *;;; + 11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;lt *;;; + 11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;lp *;;; + 11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;lh *;;; + 11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;m *;;; + 11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;b *;;; + 11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;bs *;;; + 11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;s *;;; + 11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;ss *;;; + 11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;ng *;;; + 11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;j *;;; + 11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;c *;;; + 11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;k *;;; + 11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;t *;;; + 11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;p *;;; + 11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;h *;;; + 11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; + 11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; + 11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; + 11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; + 11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; + 11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; + 11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; + 11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; + 11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; + 11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; + 11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; + 11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; + 11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; + 11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; + 11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; + 11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; + 11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; + 11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; + 11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; + 11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; + 11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; + 11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; + 11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; + 11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; + 11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; + 11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; + 11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; + 11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; + 11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; + 11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; + 11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; + 11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; + 11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; + 11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; + 11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; + 11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; + 11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; + 11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; + 11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; + 11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; + 11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; + 11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; + 11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; + 11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; + 11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; + 11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; + 11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; + 11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; + 11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; + 11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; + 11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; + 11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; + 11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; + 11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; + 11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; + 1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; + 1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; + 1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; + 1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; + 1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; + 1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; + 1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; + 1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; + 1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; + 120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; + 120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; + 120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; + 120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; + 120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; + 120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; + 1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; + 1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; + 1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; + 1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; + 1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; + 1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; + 1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; + 1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; + 1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; + 1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; + 121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; + 121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; + 121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; + 121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; + 121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; + 121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; + 1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; + 1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; + 1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; + 1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; + 1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; + 1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; + 1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; + 1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; + 1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; + 1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; + 122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; + 122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; + 122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; + 122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; + 122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; + 122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; + 1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; + 1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; + 1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; + 1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; + 1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; + 1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; + 1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; + 1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; + 1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; + 1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; + 123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; + 123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; + 123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; + 123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; + 123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; + 123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; + 1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; + 1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; + 1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; + 1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; + 1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; + 1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; + 1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; + 1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; + 124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; + 124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; + 124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; + 124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; + 1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; + 1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; + 1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; + 1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; + 1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; + 1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; + 1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; + 1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; + 125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; + 125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; + 125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; + 125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; + 1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; + 1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; + 1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; + 1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; + 1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; + 1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; + 1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; + 1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; + 1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; + 1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; + 126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; + 126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; + 126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; + 126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; + 126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; + 126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; + 1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; + 1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; + 1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; + 1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; + 1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; + 1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; + 1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; + 1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; + 1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; + 1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; + 127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; + 127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; + 127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; + 127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; + 127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; + 127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; + 1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; + 1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; + 1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; + 1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; + 1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; + 1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; + 1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; + 1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; + 128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; + 128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; + 128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; + 128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; + 1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; + 1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; + 1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; + 1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; + 1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; + 1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; + 1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; + 1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; + 1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; + 1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; + 129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; + 129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; + 129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; + 129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; + 129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; + 129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; + 12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; + 12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; + 12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; + 12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; + 12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; + 12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; + 12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; + 12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; + 12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; + 12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; + 12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; + 12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; + 12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; + 12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; + 12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; + 12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; + 12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; + 12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; + 12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; + 12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; + 12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; + 12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; + 12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; + 12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; + 12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; + 12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; + 12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; + 12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; + 12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; + 12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; + 12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; + 12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; + 12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; + 12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; + 12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; + 12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; + 12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; + 12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; + 12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; + 12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; + 12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; + 12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; + 12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; + 12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; + 12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; + 12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; + 12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; + 12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; + 12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; + 12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; + 12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; + 12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; + 12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; + 12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; + 12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; + 12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; + 12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; + 12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; + 12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; + 12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; + 12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; + 12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; + 12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; + 12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; + 12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; + 12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; + 12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; + 12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; + 12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; + 12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; + 12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; + 12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; + 12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; + 12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; + 12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; + 12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; + 12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; + 12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; + 12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; + 12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; + 12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; + 12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; + 12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; + 12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; + 12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; + 1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; + 1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; + 1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; + 1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; + 1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; + 1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; + 1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; + 1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; + 1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; + 1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; + 130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; + 130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; + 130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; + 130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; + 130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; + 1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; + 1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; + 1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; + 1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; + 1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; + 1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; + 1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; + 131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; + 131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; + 131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; + 131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; + 131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; + 1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; + 1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; + 1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; + 1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; + 1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; + 1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; + 1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; + 1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; + 1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; + 1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; + 132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; + 132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; + 132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; + 132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; + 132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; + 132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; + 1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; + 1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; + 1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; + 1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; + 1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; + 1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; + 1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; + 1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; + 1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; + 1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; + 133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; + 133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; + 133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; + 133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; + 133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; + 133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; + 1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; + 1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; + 1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; + 1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; + 1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; + 1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; + 1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; + 1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; + 1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; + 134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; + 134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; + 134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; + 134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; + 134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; + 134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; + 1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; + 1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; + 1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; + 1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; + 1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; + 1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; + 1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; + 1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; + 1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; + 1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; + 135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; + 1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; + 1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; + 1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; + 1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; + 1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; + 1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; + 1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; + 1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; + 1369;ETHIOPIC DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 136A;ETHIOPIC DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 136B;ETHIOPIC DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 136C;ETHIOPIC DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 136D;ETHIOPIC DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 136E;ETHIOPIC DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 136F;ETHIOPIC DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 1370;ETHIOPIC DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 1371;ETHIOPIC DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; + 1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; + 1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; + 1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; + 1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; + 1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; + 1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; + 1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; + 137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; + 137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; + 137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; + 13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; + 13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; + 13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; + 13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; + 13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; + 13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; + 13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; + 13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; + 13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; + 13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; + 13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; + 13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; + 13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; + 13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; + 13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; + 13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; + 13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; + 13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; + 13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; + 13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; + 13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; + 13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; + 13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; + 13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; + 13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; + 13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; + 13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; + 13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; + 13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; + 13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; + 13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; + 13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; + 13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; + 13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; + 13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; + 13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; + 13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; + 13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; + 13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; + 13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; + 13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; + 13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; + 13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; + 13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; + 13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; + 13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; + 13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; + 13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; + 13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; + 13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; + 13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; + 13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; + 13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; + 13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; + 13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; + 13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; + 13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; + 13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; + 13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; + 13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; + 13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; + 13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; + 13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; + 13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; + 13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; + 13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; + 13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; + 13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; + 13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; + 13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; + 13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; + 13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; + 13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; + 13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; + 13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; + 13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; + 13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; + 13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; + 13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; + 13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; + 13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; + 13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; + 13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; + 13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; + 13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; + 1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; + 1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; + 1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; + 1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; + 1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; + 1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; + 1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; + 1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; + 1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; + 140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; + 140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; + 140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; + 140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; + 140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; + 140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; + 1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; + 1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; + 1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; + 1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; + 1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; + 1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; + 1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; + 1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; + 1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; + 1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; + 141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; + 141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; + 141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; + 141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; + 141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; + 141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; + 1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; + 1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; + 1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; + 1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; + 1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; + 1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; + 1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; + 1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; + 1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; + 1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; + 142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; + 142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; + 142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; + 142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; + 142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; + 142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; + 1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; + 1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; + 1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; + 1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; + 1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; + 1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; + 1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; + 1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; + 1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; + 1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; + 143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; + 143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; + 143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; + 143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; + 143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; + 143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; + 1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; + 1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; + 1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; + 1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; + 1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; + 1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; + 1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; + 1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; + 1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; + 1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; + 144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; + 144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; + 144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; + 144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; + 144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; + 144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; + 1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; + 1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; + 1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; + 1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; + 1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; + 1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; + 1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; + 1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; + 1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; + 1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; + 145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; + 145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; + 145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; + 145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; + 145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; + 145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; + 1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; + 1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; + 1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; + 1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; + 1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; + 1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; + 1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; + 1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; + 1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; + 1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; + 146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; + 146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; + 146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; + 146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; + 146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; + 146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; + 1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; + 1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; + 1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; + 1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; + 1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; + 1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; + 1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; + 1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; + 1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; + 1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; + 147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; + 147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; + 147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; + 147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; + 147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; + 147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; + 1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; + 1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; + 1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; + 1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; + 1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; + 1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; + 1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; + 1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; + 1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; + 1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; + 148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; + 148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; + 148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; + 148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; + 148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; + 148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; + 1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; + 1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; + 1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; + 1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; + 1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; + 1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; + 1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; + 1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; + 1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; + 1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; + 149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; + 149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; + 149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; + 149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; + 149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; + 149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; + 14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; + 14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; + 14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; + 14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; + 14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; + 14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; + 14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; + 14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; + 14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; + 14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; + 14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; + 14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; + 14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; + 14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; + 14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; + 14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; + 14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; + 14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; + 14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; + 14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; + 14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; + 14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; + 14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; + 14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; + 14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; + 14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; + 14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; + 14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; + 14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; + 14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; + 14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; + 14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; + 14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; + 14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; + 14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; + 14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; + 14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; + 14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; + 14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; + 14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; + 14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; + 14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; + 14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; + 14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; + 14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; + 14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; + 14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; + 14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; + 14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; + 14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; + 14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; + 14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; + 14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; + 14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; + 14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; + 14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; + 14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; + 14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; + 14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; + 14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; + 14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; + 14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; + 14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; + 14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; + 14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; + 14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; + 14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; + 14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; + 14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; + 14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; + 14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; + 14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; + 14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; + 14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; + 14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; + 14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; + 14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; + 14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; + 14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; + 14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; + 14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; + 14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; + 14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; + 14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; + 14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; + 14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; + 14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; + 14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; + 14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; + 14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; + 14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; + 14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; + 14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; + 14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; + 14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; + 14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; + 1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; + 1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; + 1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; + 1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; + 1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; + 1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; + 1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; + 1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; + 1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; + 1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; + 150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; + 150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; + 150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; + 150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; + 150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; + 150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; + 1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; + 1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; + 1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; + 1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; + 1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; + 1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; + 1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; + 1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; + 1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; + 1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; + 151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; + 151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; + 151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; + 151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; + 151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; + 151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; + 1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; + 1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; + 1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; + 1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; + 1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; + 1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; + 1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; + 1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; + 1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; + 1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; + 152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; + 152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; + 152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; + 152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; + 152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; + 152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; + 1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; + 1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; + 1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; + 1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; + 1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; + 1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; + 1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; + 1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; + 1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; + 1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; + 153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; + 153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; + 153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; + 153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; + 153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; + 153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; + 1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; + 1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; + 1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; + 1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; + 1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; + 1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; + 1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; + 1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; + 1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; + 1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; + 154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; + 154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; + 154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; + 154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; + 154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; + 154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; + 1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; + 1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; + 1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; + 1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; + 1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; + 1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; + 1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; + 1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; + 1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; + 1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; + 155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; + 155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; + 155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; + 155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; + 155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; + 155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; + 1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; + 1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; + 1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; + 1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; + 1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; + 1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; + 1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; + 1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; + 1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; + 1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; + 156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; + 156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; + 156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; + 156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; + 156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; + 156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; + 1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; + 1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; + 1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; + 1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; + 1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; + 1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; + 1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; + 1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; + 1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; + 1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; + 157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; + 157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; + 157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; + 157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; + 157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; + 157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; + 1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; + 1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; + 1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; + 1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; + 1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; + 1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; + 1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; + 1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; + 1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; + 1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; + 158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; + 158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; + 158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; + 158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; + 158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; + 158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; + 1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; + 1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; + 1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; + 1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; + 1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; + 1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; + 1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; + 1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; + 1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; + 1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; + 159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; + 159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; + 159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; + 159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; + 159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; + 159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; + 15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; + 15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; + 15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; + 15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; + 15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; + 15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; + 15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; + 15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; + 15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; + 15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; + 15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; + 15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; + 15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; + 15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; + 15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; + 15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; + 15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; + 15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; + 15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; + 15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; + 15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; + 15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; + 15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; + 15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; + 15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; + 15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; + 15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; + 15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; + 15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; + 15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; + 15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; + 15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; + 15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; + 15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; + 15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; + 15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; + 15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; + 15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; + 15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; + 15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; + 15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; + 15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; + 15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; + 15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; + 15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; + 15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; + 15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; + 15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; + 15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; + 15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; + 15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; + 15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; + 15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; + 15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; + 15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; + 15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; + 15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; + 15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; + 15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; + 15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; + 15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; + 15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; + 15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; + 15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; + 15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; + 15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; + 15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; + 15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; + 15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; + 15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; + 15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; + 15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; + 15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; + 15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; + 15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; + 15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; + 15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; + 15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; + 15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; + 15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; + 15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; + 15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; + 15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; + 15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; + 15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; + 15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; + 15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; + 15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; + 15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; + 15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; + 15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; + 15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; + 15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; + 15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; + 15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; + 15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; + 1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; + 1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; + 1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; + 1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; + 1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; + 1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; + 1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; + 1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; + 1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; + 1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; + 160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; + 160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; + 160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; + 160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; + 160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; + 160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; + 1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; + 1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; + 1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; + 1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; + 1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; + 1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; + 1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; + 1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; + 1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; + 1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; + 161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; + 161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; + 161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; + 161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; + 161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; + 161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; + 1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; + 1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; + 1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; + 1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; + 1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; + 1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; + 1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; + 1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; + 1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; + 1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; + 162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; + 162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; + 162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; + 162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; + 162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; + 162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; + 1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; + 1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; + 1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; + 1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; + 1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; + 1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; + 1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; + 1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; + 1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; + 1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; + 163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; + 163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; + 163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; + 163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; + 163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; + 163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; + 1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; + 1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; + 1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; + 1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; + 1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; + 1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; + 1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; + 1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; + 1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; + 1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; + 164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; + 164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; + 164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; + 164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; + 164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; + 164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; + 1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; + 1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; + 1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; + 1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; + 1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; + 1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; + 1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; + 1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; + 1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; + 1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; + 165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; + 165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; + 165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; + 165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; + 165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; + 165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; + 1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; + 1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; + 1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; + 1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; + 1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; + 1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; + 1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; + 1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; + 1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; + 1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; + 166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; + 166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; + 166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; + 166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; + 166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; + 166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; + 1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; + 1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; + 1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; + 1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; + 1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; + 1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; + 1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; + 1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; + 1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; + 1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; + 1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; + 1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; + 1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; + 1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; + 1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; + 1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; + 1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; + 168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; + 168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; + 168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; + 168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; + 168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; + 168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; + 1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; + 1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; + 1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; + 1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; + 1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; + 1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; + 1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; + 1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; + 1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; + 1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; + 169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; + 169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;N;;;;; + 169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;N;;;;; + 16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; + 16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; + 16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; + 16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; + 16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; + 16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; + 16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; + 16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; + 16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; + 16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; + 16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; + 16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; + 16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; + 16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; + 16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; + 16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; + 16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; + 16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; + 16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; + 16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; + 16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; + 16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; + 16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; + 16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; + 16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; + 16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; + 16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; + 16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; + 16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; + 16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; + 16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; + 16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; + 16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; + 16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; + 16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; + 16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; + 16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; + 16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; + 16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; + 16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; + 16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; + 16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; + 16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; + 16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; + 16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; + 16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; + 16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; + 16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; + 16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; + 16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; + 16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; + 16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; + 16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; + 16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; + 16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; + 16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; + 16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; + 16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; + 16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; + 16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; + 16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; + 16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; + 16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; + 16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; + 16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; + 16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; + 16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; + 16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; + 16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; + 16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; + 16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; + 16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; + 16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; + 16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; + 16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; + 16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; + 16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; + 16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; + 16EE;RUNIC ARLAUG SYMBOL;No;0;L;;;;17;N;;golden number 17;;; + 16EF;RUNIC TVIMADUR SYMBOL;No;0;L;;;;18;N;;golden number 18;;; + 16F0;RUNIC BELGTHOR SYMBOL;No;0;L;;;;19;N;;golden number 19;;; + 1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; + 1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; + 1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; + 1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; + 1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; + 1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; + 1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; + 1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; + 1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; + 1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; + 178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; + 178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; + 178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; + 178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; + 178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; + 178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; + 1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; + 1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; + 1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; + 1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; + 1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; + 1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; + 1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; + 1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; + 1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; + 1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; + 179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; + 179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; + 179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; + 179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; + 179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; + 179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; + 17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; + 17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; + 17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; + 17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; + 17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; + 17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; + 17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; + 17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; + 17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; + 17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; + 17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; + 17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; + 17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; + 17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; + 17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; + 17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; + 17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; + 17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; + 17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; + 17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; + 17B4;KHMER VOWEL INHERENT AQ;Mc;0;L;;;;;N;;;;; + 17B5;KHMER VOWEL INHERENT AA;Mc;0;L;;;;;N;;;;; + 17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + 17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; + 17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; + 17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; + 17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; + 17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; + 17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; + 17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; + 17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; + 17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; + 17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; + 17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; + 17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; + 17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; + 17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; + 17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; + 17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; + 17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; + 17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; + 17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; + 17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; + 17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; + 17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; + 17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; + 17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; + 17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; + 17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; + 17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; + 17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; + 17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; + 17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; + 17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; + 17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; + 17D7;KHMER SIGN LEK TOO;Po;0;L;;;;;N;;;;; + 17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; + 17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; + 17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; + 17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; + 17DC;KHMER SIGN AVAKRAHASANYA;Po;0;L;;;;;N;;;;; + 17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; + 1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; + 1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; + 1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; + 1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; + 1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; + 1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; + 1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; + 1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; + 1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; + 180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; + 180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Cf;0;BN;;;;;N;;;;; + 180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Cf;0;BN;;;;;N;;;;; + 180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Cf;0;BN;;;;;N;;;;; + 180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; + 1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; + 1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; + 1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; + 1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; + 1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; + 1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; + 1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; + 1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; + 1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; + 1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; + 1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; + 1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; + 1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; + 1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; + 1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; + 1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; + 1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; + 1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; + 1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; + 1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; + 182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; + 182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; + 182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; + 182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; + 182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; + 182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; + 1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; + 1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; + 1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; + 1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; + 1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; + 1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; + 1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; + 1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; + 1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; + 1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; + 183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; + 183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; + 183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; + 183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; + 183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; + 183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; + 1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; + 1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; + 1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; + 1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; + 1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; + 1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; + 1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; + 1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; + 1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; + 1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; + 184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; + 184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; + 184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; + 184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; + 184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; + 184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; + 1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; + 1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; + 1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; + 1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; + 1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; + 1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; + 1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; + 1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; + 1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; + 1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; + 185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; + 185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; + 185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; + 185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; + 185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; + 185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; + 1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; + 1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; + 1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; + 1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; + 1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; + 1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; + 1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; + 1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; + 1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; + 1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; + 186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; + 186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; + 186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; + 186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; + 186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; + 186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; + 1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; + 1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; + 1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; + 1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; + 1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; + 1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; + 1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; + 1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; + 1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; + 1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; + 1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; + 1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; + 1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; + 1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; + 1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; + 1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; + 1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; + 1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; + 188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; + 188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; + 188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; + 188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; + 188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; + 188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; + 1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; + 1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; + 1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; + 1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; + 1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; + 1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; + 1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; + 1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; + 1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; + 1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; + 189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; + 189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; + 189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; + 189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; + 189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; + 189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; + 18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; + 18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; + 18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; + 18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; + 18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; + 18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; + 18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; + 18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; + 18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; + 18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; + 1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; + 1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 + 1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; + 1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 + 1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; + 1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 + 1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; + 1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 + 1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; + 1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 + 1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; + 1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A + 1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; + 1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C + 1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; + 1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E + 1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; + 1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 + 1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; + 1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 + 1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; + 1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 + 1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; + 1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 + 1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; + 1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 + 1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; + 1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A + 1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; + 1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C + 1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; + 1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E + 1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; + 1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 + 1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; + 1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 + 1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; + 1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 + 1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; + 1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 + 1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; + 1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 + 1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; + 1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A + 1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; + 1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C + 1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; + 1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E + 1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; + 1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 + 1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; + 1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 + 1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; + 1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 + 1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; + 1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 + 1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; + 1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 + 1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; + 1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A + 1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; + 1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C + 1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; + 1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E + 1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; + 1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 + 1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; + 1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 + 1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; + 1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 + 1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; + 1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 + 1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; + 1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 + 1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; + 1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A + 1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; + 1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C + 1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; + 1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E + 1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; + 1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 + 1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; + 1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 + 1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; + 1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 + 1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; + 1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 + 1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; + 1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 + 1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; + 1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A + 1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; + 1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C + 1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; + 1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E + 1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; + 1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 + 1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; + 1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 + 1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; + 1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 + 1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; + 1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 + 1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; + 1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 + 1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; + 1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A + 1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; + 1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C + 1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; + 1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E + 1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; + 1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 + 1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; + 1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 + 1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; + 1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 + 1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; + 1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 + 1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; + 1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 + 1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; + 1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A + 1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; + 1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C + 1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; + 1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E + 1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; + 1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 + 1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; + 1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 + 1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; + 1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 + 1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; + 1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 + 1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; + 1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 + 1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; + 1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A + 1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; + 1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C + 1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; + 1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E + 1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; + 1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 + 1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; + 1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 + 1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; + 1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 + 1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; + 1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; + 1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; + 1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; + 1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; + 1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 + 1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; + 1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 + 1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; + 1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 + 1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; + 1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 + 1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; + 1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 + 1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; + 1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 + 1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; + 1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA + 1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; + 1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC + 1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; + 1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE + 1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; + 1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 + 1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; + 1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 + 1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; + 1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 + 1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; + 1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 + 1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; + 1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 + 1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; + 1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA + 1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; + 1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC + 1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; + 1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE + 1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; + 1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 + 1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; + 1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 + 1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; + 1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 + 1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; + 1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 + 1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; + 1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 + 1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; + 1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA + 1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; + 1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC + 1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; + 1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE + 1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; + 1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 + 1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; + 1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 + 1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; + 1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 + 1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; + 1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 + 1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; + 1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 + 1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; + 1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA + 1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; + 1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC + 1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; + 1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE + 1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; + 1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 + 1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; + 1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 + 1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; + 1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 + 1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; + 1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 + 1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; + 1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 + 1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; + 1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA + 1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; + 1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC + 1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; + 1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE + 1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; + 1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 + 1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; + 1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 + 1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; + 1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 + 1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; + 1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 + 1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; + 1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 + 1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 + 1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 + 1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A + 1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B + 1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C + 1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D + 1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E + 1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F + 1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; + 1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; + 1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; + 1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; + 1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; + 1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; + 1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; + 1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; + 1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 + 1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 + 1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A + 1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B + 1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C + 1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D + 1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; + 1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; + 1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; + 1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; + 1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; + 1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; + 1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 + 1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 + 1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A + 1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B + 1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C + 1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D + 1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E + 1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F + 1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; + 1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; + 1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; + 1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; + 1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; + 1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; + 1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; + 1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; + 1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 + 1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 + 1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A + 1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B + 1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C + 1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D + 1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E + 1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F + 1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; + 1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; + 1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; + 1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; + 1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; + 1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; + 1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; + 1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; + 1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 + 1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 + 1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A + 1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B + 1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C + 1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D + 1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; + 1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; + 1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; + 1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; + 1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; + 1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; + 1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; + 1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 + 1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; + 1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B + 1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; + 1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D + 1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; + 1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F + 1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; + 1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; + 1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; + 1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; + 1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 + 1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 + 1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A + 1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B + 1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C + 1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D + 1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E + 1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F + 1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; + 1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; + 1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; + 1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; + 1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; + 1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; + 1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; + 1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; + 1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA + 1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB + 1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 + 1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 + 1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA + 1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB + 1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA + 1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB + 1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 + 1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 + 1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA + 1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB + 1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA + 1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB + 1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 + 1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 + 1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A + 1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B + 1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C + 1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D + 1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E + 1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F + 1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; + 1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; + 1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; + 1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; + 1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; + 1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; + 1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; + 1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; + 1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 + 1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 + 1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A + 1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B + 1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C + 1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D + 1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E + 1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F + 1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; + 1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; + 1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; + 1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; + 1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; + 1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; + 1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; + 1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; + 1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 + 1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 + 1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA + 1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB + 1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC + 1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD + 1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE + 1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF + 1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; + 1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; + 1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; + 1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; + 1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; + 1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; + 1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; + 1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; + 1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 + 1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 + 1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; + 1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC + 1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; + 1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; + 1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; + 1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; + 1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; + 1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; + 1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; + 1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; + 1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; + 1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 + 1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; + 1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; + 1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; + 1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; + 1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC + 1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; + 1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; + 1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; + 1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; + 1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; + 1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; + 1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; + 1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; + 1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; + 1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; + 1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; + 1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 + 1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 + 1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; + 1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; + 1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; + 1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; + 1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; + 1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; + 1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; + 1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; + 1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; + 1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; + 1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; + 1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 + 1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 + 1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; + 1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; + 1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; + 1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC + 1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; + 1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; + 1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; + 1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; + 1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; + 1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; + 1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; + 1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; + 1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; + 1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; + 1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; + 1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC + 1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; + 1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; + 1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; + 1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; + 1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; + 1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; + 1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; + 1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; + 1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; + 1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; + 2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; + 2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; + 2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; + 200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; + 200B;ZERO WIDTH SPACE;Zs;0;BN;;;;;N;;;;; + 200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; + 200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; + 200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; + 200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; + 2010;HYPHEN;Pd;0;ON;;;;;N;;;;; + 2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; + 2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; + 2013;EN DASH;Pd;0;ON;;;;;N;;;;; + 2014;EM DASH;Pd;0;ON;;;;;N;;;;; + 2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; + 2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; + 2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; + 2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; + 2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; + 201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; + 201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; + 201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; + 201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; + 201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; + 201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; + 2020;DAGGER;Po;0;ON;;;;;N;;;;; + 2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; + 2022;BULLET;Po;0;ON;;;;;N;;;;; + 2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; + 2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; + 2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; + 2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; + 2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; + 2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; + 2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; + 202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; + 202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; + 202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; + 202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; + 202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; + 202F;NARROW NO-BREAK SPACE;Zs;0;WS; 0020;;;;N;;;;; + 2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; + 2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; + 2032;PRIME;Po;0;ET;;;;;N;;;;; + 2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; + 2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; + 2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; + 2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; + 2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; + 2038;CARET;Po;0;ON;;;;;N;;;;; + 2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; + 203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; + 203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; + 203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; + 203D;INTERROBANG;Po;0;ON;;;;;N;;;;; + 203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; + 203F;UNDERTIE;Pc;0;ON;;;;;N;;Enotikon;;; + 2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; + 2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; + 2042;ASTERISM;Po;0;ON;;;;;N;;;;; + 2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; + 2044;FRACTION SLASH;Sm;0;ON;;;;;N;;;;; + 2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; + 2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; + 2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; + 2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; + 204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; + 204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; + 204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; + 204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; + 206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; + 206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; + 206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; + 206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; + 206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; + 206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; + 2070;SUPERSCRIPT ZERO;No;0;EN; 0030;0;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; + 2074;SUPERSCRIPT FOUR;No;0;EN; 0034;4;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; + 2075;SUPERSCRIPT FIVE;No;0;EN; 0035;5;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; + 2076;SUPERSCRIPT SIX;No;0;EN; 0036;6;6;6;N;SUPERSCRIPT DIGIT SIX;;;; + 2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;7;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; + 2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;8;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; + 2079;SUPERSCRIPT NINE;No;0;EN; 0039;9;9;9;N;SUPERSCRIPT DIGIT NINE;;;; + 207A;SUPERSCRIPT PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; + 207B;SUPERSCRIPT MINUS;Sm;0;ET; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; + 207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; + 207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; + 207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; + 207F;SUPERSCRIPT LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;;; + 2080;SUBSCRIPT ZERO;No;0;EN; 0030;0;0;0;N;SUBSCRIPT DIGIT ZERO;;;; + 2081;SUBSCRIPT ONE;No;0;EN; 0031;1;1;1;N;SUBSCRIPT DIGIT ONE;;;; + 2082;SUBSCRIPT TWO;No;0;EN; 0032;2;2;2;N;SUBSCRIPT DIGIT TWO;;;; + 2083;SUBSCRIPT THREE;No;0;EN; 0033;3;3;3;N;SUBSCRIPT DIGIT THREE;;;; + 2084;SUBSCRIPT FOUR;No;0;EN; 0034;4;4;4;N;SUBSCRIPT DIGIT FOUR;;;; + 2085;SUBSCRIPT FIVE;No;0;EN; 0035;5;5;5;N;SUBSCRIPT DIGIT FIVE;;;; + 2086;SUBSCRIPT SIX;No;0;EN; 0036;6;6;6;N;SUBSCRIPT DIGIT SIX;;;; + 2087;SUBSCRIPT SEVEN;No;0;EN; 0037;7;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; + 2088;SUBSCRIPT EIGHT;No;0;EN; 0038;8;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; + 2089;SUBSCRIPT NINE;No;0;EN; 0039;9;9;9;N;SUBSCRIPT DIGIT NINE;;;; + 208A;SUBSCRIPT PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; + 208B;SUBSCRIPT MINUS;Sm;0;ET; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; + 208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; + 208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; + 208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; + 20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; + 20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; + 20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; + 20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; + 20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; + 20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; + 20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; + 20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; + 20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; + 20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; + 20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; + 20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; + 20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; + 20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; + 20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; + 20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; + 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; + 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; + 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; + 20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; + 20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; + 20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; + 20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; + 20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; + 20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; + 20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; + 20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; + 20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; + 20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; + 20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; + 20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; + 20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; + 20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; + 20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; + 20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; + 20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; + 2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; + 2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; + 2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; + 2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; + 2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; + 2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; + 2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; + 2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; + 2108;SCRUPLE;So;0;ON;;;;;N;;;;; + 2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; + 210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; + 210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; + 210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; + 210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; + 210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; + 210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; + 2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; + 2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; + 2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; + 2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; + 2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; + 2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; + 2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; + 2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; + 2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;; + 2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; + 211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; + 211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; + 211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; + 211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; + 211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; + 211F;RESPONSE;So;0;ON;;;;;N;;;;; + 2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; + 2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; + 2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; + 2123;VERSICLE;So;0;ON;;;;;N;;;;; + 2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; + 2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; + 2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; + 2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; + 2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; + 2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; + 212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; + 212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; + 212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; + 212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; + 212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; + 212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; + 2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; + 2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; + 2132;TURNED CAPITAL F;So;0;ON;;;;;N;TURNED F;;;; + 2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; + 2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; + 2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; + 2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; + 2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; + 2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; + 2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; + 213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; + 2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; + 2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; + 2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; + 2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; + 2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; + 2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; + 2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; + 215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; + 215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; + 215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; + 215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; + 215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; + 215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; + 2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; + 2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; + 2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; + 2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; + 2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; + 2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; + 2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; + 2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; + 2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; + 2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; + 216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; + 216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; + 216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; + 216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; + 216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; + 216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; + 2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 + 2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 + 2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 + 2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 + 2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 + 2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 + 2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 + 2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 + 2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 + 2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 + 217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A + 217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B + 217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C + 217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D + 217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E + 217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F + 2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; + 2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; + 2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; + 2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Nl;0;L;;;;;N;;;;; + 2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; + 2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; + 2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; + 2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; + 2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; + 2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; + 2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; + 2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; + 2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; + 2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; + 219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; + 219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; + 219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; + 219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; + 219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; + 219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; + 21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; + 21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; + 21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; + 21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; + 21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; + 21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; + 21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; + 21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; + 21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; + 21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; + 21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; + 21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; + 21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; + 21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; + 21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; + 21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; + 21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; + 21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; + 21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; + 21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; + 21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; + 21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; + 21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; + 21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; + 21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; + 21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; + 21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; + 21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; + 21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; + 21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; + 21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; + 21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; + 21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; + 21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; + 21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; + 21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; + 21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; + 21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; + 21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; + 21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; + 21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; + 21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; + 21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; + 21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; + 21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; + 21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; + 21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; + 21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; + 21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; + 21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; + 21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; + 21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; + 21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; + 21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; + 21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; + 21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; + 21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; + 21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; + 21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; + 21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; + 21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; + 21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; + 21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; + 21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; + 21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; + 21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; + 21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; + 21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; + 21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; + 21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; + 21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; + 21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; + 21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; + 21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; + 21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; + 21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; + 21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; + 21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; + 21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; + 21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; + 21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; + 21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; + 21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; + 21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; + 2200;FOR ALL;Sm;0;ON;;;;;N;;;;; + 2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; + 2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; + 2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; + 2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; + 2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; + 2206;INCREMENT;Sm;0;ON;;;;;N;;;;; + 2207;NABLA;Sm;0;ON;;;;;N;;;;; + 2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; + 2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; + 220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; + 220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; + 220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; + 220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; + 220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; + 220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; + 2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; + 2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; + 2212;MINUS SIGN;Sm;0;ET;;;;;N;;;;; + 2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; + 2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; + 2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; + 2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; + 2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; + 2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; + 2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; + 221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; + 221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; + 221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; + 221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; + 221E;INFINITY;Sm;0;ON;;;;;N;;;;; + 221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; + 2220;ANGLE;Sm;0;ON;;;;;Y;;;;; + 2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; + 2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; + 2223;DIVIDES;Sm;0;ON;;;;;N;;;;; + 2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; + 2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; + 2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; + 2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; + 2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; + 2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; + 222A;UNION;Sm;0;ON;;;;;N;;;;; + 222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; + 222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; + 222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; + 222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; + 222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; + 2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; + 2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; + 2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; + 2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; + 2234;THEREFORE;Sm;0;ON;;;;;N;;;;; + 2235;BECAUSE;Sm;0;ON;;;;;N;;;;; + 2236;RATIO;Sm;0;ON;;;;;N;;;;; + 2237;PROPORTION;Sm;0;ON;;;;;N;;;;; + 2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; + 2239;EXCESS;Sm;0;ON;;;;;Y;;;;; + 223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; + 223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; + 223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; + 223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;lazy S;;; + 223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; + 223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; + 2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; + 2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; + 2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; + 2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; + 2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; + 2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; + 224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; + 224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; + 224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; + 224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; + 2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; + 2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; + 2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; + 2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; + 2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; + 2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; + 2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; + 2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; + 2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; + 225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; + 225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; + 225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; + 225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; + 225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; + 225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; + 2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; + 2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; + 2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; + 2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; + 2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; + 2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; + 2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; + 2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; + 2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; + 226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; + 226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; + 226C;BETWEEN;Sm;0;ON;;;;;N;;;;; + 226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; + 226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; + 226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; + 2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; + 2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; + 2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; + 2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; + 2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; + 2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; + 2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; + 2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; + 2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; + 2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; + 227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; + 227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; + 227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; + 227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; + 2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; + 2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; + 2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; + 2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; + 2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; + 2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; + 2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; + 2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; + 228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; + 228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; + 228C;MULTISET;Sm;0;ON;;;;;Y;;;;; + 228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; + 228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; + 228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; + 2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; + 2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; + 2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; + 2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; + 2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; + 2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; + 2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; + 2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; + 229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; + 229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; + 229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; + 229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; + 229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; + 229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; + 22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; + 22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; + 22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; + 22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; + 22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; + 22A5;UP TACK;Sm;0;ON;;;;;N;;;;; + 22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; + 22A7;MODELS;Sm;0;ON;;;;;Y;;;;; + 22A8;TRUE;Sm;0;ON;;;;;Y;;;;; + 22A9;FORCES;Sm;0;ON;;;;;Y;;;;; + 22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; + 22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; + 22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; + 22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; + 22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; + 22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; + 22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; + 22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; + 22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; + 22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; + 22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; + 22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; + 22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; + 22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; + 22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; + 22BB;XOR;Sm;0;ON;;;;;N;;;;; + 22BC;NAND;Sm;0;ON;;;;;N;;;;; + 22BD;NOR;Sm;0;ON;;;;;N;;;;; + 22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; + 22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; + 22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; + 22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; + 22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; + 22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; + 22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; + 22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; + 22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; + 22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; + 22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; + 22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; + 22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; + 22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; + 22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; + 22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; + 22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; + 22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; + 22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; + 22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; + 22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; + 22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; + 22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; + 22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; + 22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; + 22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; + 22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; + 22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; + 22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; + 22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; + 22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; + 22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; + 22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; + 22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; + 22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; + 22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; + 22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; + 22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; + 22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; + 22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; + 22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; + 22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; + 22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; + 22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; + 22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; + 22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; + 22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; + 22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; + 22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; + 22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; + 22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; + 2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; + 2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; + 2302;HOUSE;So;0;ON;;;;;N;;;;; + 2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; + 2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; + 2305;PROJECTIVE;So;0;ON;;;;;N;;;;; + 2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; + 2307;WAVY LINE;So;0;ON;;;;;N;;;;; + 2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;; + 2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;; + 230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;; + 230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;; + 230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; + 230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; + 230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; + 230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; + 2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; + 2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; + 2312;ARC;So;0;ON;;;;;N;;;;; + 2313;SEGMENT;So;0;ON;;;;;N;;;;; + 2314;SECTOR;So;0;ON;;;;;N;;;;; + 2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; + 2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; + 2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; + 2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; + 2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; + 231A;WATCH;So;0;ON;;;;;N;;;;; + 231B;HOURGLASS;So;0;ON;;;;;N;;;;; + 231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; + 231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; + 231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; + 231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; + 2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; + 2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; + 2322;FROWN;So;0;ON;;;;;N;;;;; + 2323;SMILE;So;0;ON;;;;;N;;;;; + 2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; + 2325;OPTION KEY;So;0;ON;;;;;N;;;;; + 2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; + 2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; + 2328;KEYBOARD;So;0;ON;;;;;N;;;;; + 2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; + 232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; + 232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; + 232C;BENZENE RING;So;0;ON;;;;;N;;;;; + 232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; + 232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; + 232F;SYMMETRY;So;0;ON;;;;;N;;;;; + 2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; + 2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; + 2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; + 2333;SLOPE;So;0;ON;;;;;N;;;;; + 2334;COUNTERBORE;So;0;ON;;;;;N;;;;; + 2335;COUNTERSINK;So;0;ON;;;;;N;;;;; + 2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; + 2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; + 2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; + 2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; + 233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; + 233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; + 233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; + 233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; + 233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; + 233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; + 2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; + 2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; + 2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; + 2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; + 2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; + 2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; + 2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; + 2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; + 2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; + 2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; + 234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;*;;; + 234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; + 234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; + 234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; + 234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;*;;; + 234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; + 2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; + 2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;*;;; + 2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; + 2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; + 2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; + 2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;*;;; + 2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; + 2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; + 2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; + 2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; + 235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; + 235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; + 235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; + 235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; + 235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; + 235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; + 2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; + 2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;*;;; + 2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; + 2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; + 2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; + 2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; + 2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; + 2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; + 2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; + 2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; + 236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; + 236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; + 236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; + 236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; + 236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; + 236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; + 2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; + 2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; + 2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; + 2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; + 2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; + 2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; + 2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; + 2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; + 2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; + 2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; + 237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; + 237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; + 237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; + 237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; + 237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; + 2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; + 2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; + 2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; + 2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; + 2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; + 2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; + 2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; + 2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; + 2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; + 2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;pause;;; + 238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;break;;; + 238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;escape;;; + 238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; + 238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; + 238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; + 238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; + 2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; + 2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; + 2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; + 2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; + 2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; + 2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; + 2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; + 2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; + 2398;NEXT PAGE;So;0;ON;;;;;N;;;;; + 2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; + 239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; + 2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; + 2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; + 2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; + 2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; + 2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; + 2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; + 2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; + 2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; + 2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; + 2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; + 240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; + 240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; + 240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; + 240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; + 240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; + 240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; + 2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; + 2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; + 2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; + 2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; + 2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; + 2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; + 2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; + 2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; + 2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; + 2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; + 241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; + 241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; + 241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; + 241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; + 241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; + 241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; + 2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; + 2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; + 2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; + 2423;OPEN BOX;So;0;ON;;;;;N;;;;; + 2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; + 2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; + 2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; + 2440;OCR HOOK;So;0;ON;;;;;N;;;;; + 2441;OCR CHAIR;So;0;ON;;;;;N;;;;; + 2442;OCR FORK;So;0;ON;;;;;N;;;;; + 2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; + 2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; + 2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; + 2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; + 2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; + 2448;OCR DASH;So;0;ON;;;;;N;;;;; + 2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; + 244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; + 2460;CIRCLED DIGIT ONE;No;0;EN; 0031;;1;1;N;;;;; + 2461;CIRCLED DIGIT TWO;No;0;EN; 0032;;2;2;N;;;;; + 2462;CIRCLED DIGIT THREE;No;0;EN; 0033;;3;3;N;;;;; + 2463;CIRCLED DIGIT FOUR;No;0;EN; 0034;;4;4;N;;;;; + 2464;CIRCLED DIGIT FIVE;No;0;EN; 0035;;5;5;N;;;;; + 2465;CIRCLED DIGIT SIX;No;0;EN; 0036;;6;6;N;;;;; + 2466;CIRCLED DIGIT SEVEN;No;0;EN; 0037;;7;7;N;;;;; + 2467;CIRCLED DIGIT EIGHT;No;0;EN; 0038;;8;8;N;;;;; + 2468;CIRCLED DIGIT NINE;No;0;EN; 0039;;9;9;N;;;;; + 2469;CIRCLED NUMBER TEN;No;0;EN; 0031 0030;;;10;N;;;;; + 246A;CIRCLED NUMBER ELEVEN;No;0;EN; 0031 0031;;;11;N;;;;; + 246B;CIRCLED NUMBER TWELVE;No;0;EN; 0031 0032;;;12;N;;;;; + 246C;CIRCLED NUMBER THIRTEEN;No;0;EN; 0031 0033;;;13;N;;;;; + 246D;CIRCLED NUMBER FOURTEEN;No;0;EN; 0031 0034;;;14;N;;;;; + 246E;CIRCLED NUMBER FIFTEEN;No;0;EN; 0031 0035;;;15;N;;;;; + 246F;CIRCLED NUMBER SIXTEEN;No;0;EN; 0031 0036;;;16;N;;;;; + 2470;CIRCLED NUMBER SEVENTEEN;No;0;EN; 0031 0037;;;17;N;;;;; + 2471;CIRCLED NUMBER EIGHTEEN;No;0;EN; 0031 0038;;;18;N;;;;; + 2472;CIRCLED NUMBER NINETEEN;No;0;EN; 0031 0039;;;19;N;;;;; + 2473;CIRCLED NUMBER TWENTY;No;0;EN; 0032 0030;;;20;N;;;;; + 2474;PARENTHESIZED DIGIT ONE;No;0;EN; 0028 0031 0029;;1;1;N;;;;; + 2475;PARENTHESIZED DIGIT TWO;No;0;EN; 0028 0032 0029;;2;2;N;;;;; + 2476;PARENTHESIZED DIGIT THREE;No;0;EN; 0028 0033 0029;;3;3;N;;;;; + 2477;PARENTHESIZED DIGIT FOUR;No;0;EN; 0028 0034 0029;;4;4;N;;;;; + 2478;PARENTHESIZED DIGIT FIVE;No;0;EN; 0028 0035 0029;;5;5;N;;;;; + 2479;PARENTHESIZED DIGIT SIX;No;0;EN; 0028 0036 0029;;6;6;N;;;;; + 247A;PARENTHESIZED DIGIT SEVEN;No;0;EN; 0028 0037 0029;;7;7;N;;;;; + 247B;PARENTHESIZED DIGIT EIGHT;No;0;EN; 0028 0038 0029;;8;8;N;;;;; + 247C;PARENTHESIZED DIGIT NINE;No;0;EN; 0028 0039 0029;;9;9;N;;;;; + 247D;PARENTHESIZED NUMBER TEN;No;0;EN; 0028 0031 0030 0029;;;10;N;;;;; + 247E;PARENTHESIZED NUMBER ELEVEN;No;0;EN; 0028 0031 0031 0029;;;11;N;;;;; + 247F;PARENTHESIZED NUMBER TWELVE;No;0;EN; 0028 0031 0032 0029;;;12;N;;;;; + 2480;PARENTHESIZED NUMBER THIRTEEN;No;0;EN; 0028 0031 0033 0029;;;13;N;;;;; + 2481;PARENTHESIZED NUMBER FOURTEEN;No;0;EN; 0028 0031 0034 0029;;;14;N;;;;; + 2482;PARENTHESIZED NUMBER FIFTEEN;No;0;EN; 0028 0031 0035 0029;;;15;N;;;;; + 2483;PARENTHESIZED NUMBER SIXTEEN;No;0;EN; 0028 0031 0036 0029;;;16;N;;;;; + 2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;EN; 0028 0031 0037 0029;;;17;N;;;;; + 2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;EN; 0028 0031 0038 0029;;;18;N;;;;; + 2486;PARENTHESIZED NUMBER NINETEEN;No;0;EN; 0028 0031 0039 0029;;;19;N;;;;; + 2487;PARENTHESIZED NUMBER TWENTY;No;0;EN; 0028 0032 0030 0029;;;20;N;;;;; + 2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; + 2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; + 248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; + 248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; + 248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; + 248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; + 248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; + 248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; + 2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; + 2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; + 2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; + 2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; + 2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; + 2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; + 2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; + 2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; + 2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; + 2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; + 249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; + 249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; + 249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; + 249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; + 249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; + 249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; + 24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; + 24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; + 24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; + 24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; + 24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; + 24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; + 24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; + 24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; + 24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; + 24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; + 24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; + 24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; + 24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; + 24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; + 24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; + 24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; + 24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; + 24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; + 24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; + 24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; + 24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; + 24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; + 24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; + 24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; + 24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; + 24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; + 24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; + 24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; + 24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; + 24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; + 24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; + 24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; + 24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; + 24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; + 24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; + 24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; + 24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; + 24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; + 24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; + 24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; + 24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; + 24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; + 24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; + 24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; + 24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; + 24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; + 24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; + 24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; + 24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 + 24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 + 24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 + 24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 + 24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA + 24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB + 24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC + 24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD + 24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE + 24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF + 24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 + 24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 + 24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 + 24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 + 24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 + 24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 + 24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 + 24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 + 24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 + 24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 + 24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA + 24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB + 24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC + 24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD + 24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE + 24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF + 24EA;CIRCLED DIGIT ZERO;No;0;EN; 0030;;0;0;N;;;;; + 2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; + 2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; + 2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; + 2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; + 2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; + 2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; + 2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; + 2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; + 2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; + 2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; + 250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; + 250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; + 250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; + 250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; + 250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; + 250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; + 2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; + 2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; + 2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; + 2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; + 2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; + 2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; + 2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; + 2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; + 2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; + 2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; + 251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; + 251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; + 251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; + 251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; + 251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; + 251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; + 2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; + 2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; + 2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; + 2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; + 2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; + 2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; + 2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; + 2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; + 2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; + 2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; + 252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; + 252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; + 252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; + 252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; + 252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; + 252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; + 2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; + 2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; + 2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; + 2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; + 2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; + 2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; + 2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; + 2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; + 2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; + 2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; + 253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; + 253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; + 253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; + 253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; + 253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; + 253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; + 2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; + 2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; + 2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; + 2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; + 2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; + 2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; + 2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; + 2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; + 2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; + 2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; + 254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; + 254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; + 254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; + 254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; + 254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; + 254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; + 2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; + 2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; + 2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; + 2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; + 2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; + 2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; + 2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; + 2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; + 2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; + 2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; + 255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; + 255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; + 255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; + 255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; + 255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; + 255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; + 2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; + 2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; + 2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; + 2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; + 2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; + 2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; + 2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; + 2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; + 2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; + 2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; + 256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; + 256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; + 256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; + 256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; + 256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; + 256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; + 2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; + 2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; + 2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; + 2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; + 2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; + 2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; + 2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; + 2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; + 2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; + 2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; + 257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; + 257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; + 257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; + 257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; + 257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; + 257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; + 2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; + 2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; + 2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; + 2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; + 2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; + 2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; + 2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; + 2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; + 2588;FULL BLOCK;So;0;ON;;;;;N;;;;; + 2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; + 258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; + 258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; + 258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; + 258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; + 258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; + 258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; + 2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; + 2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; + 2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; + 2593;DARK SHADE;So;0;ON;;;;;N;;;;; + 2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; + 2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; + 25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; + 25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; + 25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; + 25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; + 25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; + 25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; + 25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; + 25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; + 25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; + 25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; + 25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; + 25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; + 25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; + 25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; + 25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; + 25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; + 25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; + 25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; + 25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; + 25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; + 25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; + 25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; + 25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; + 25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; + 25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; + 25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; + 25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; + 25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; + 25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; + 25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; + 25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; + 25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; + 25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; + 25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; + 25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; + 25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; + 25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; + 25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; + 25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; + 25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; + 25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; + 25C9;FISHEYE;So;0;ON;;;;;N;;;;; + 25CA;LOZENGE;So;0;ON;;;;;N;;;;; + 25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; + 25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; + 25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; + 25CE;BULLSEYE;So;0;ON;;;;;N;;;;; + 25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; + 25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; + 25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; + 25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; + 25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; + 25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; + 25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; + 25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; + 25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; + 25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; + 25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; + 25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; + 25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; + 25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; + 25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; + 25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; + 25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; + 25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; + 25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; + 25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; + 25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; + 25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; + 25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; + 25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; + 25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; + 25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; + 25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; + 25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; + 25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; + 25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; + 25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; + 25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; + 25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; + 25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; + 25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; + 25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; + 25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; + 25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; + 25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; + 25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; + 25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; + 2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; + 2601;CLOUD;So;0;ON;;;;;N;;;;; + 2602;UMBRELLA;So;0;ON;;;;;N;;;;; + 2603;SNOWMAN;So;0;ON;;;;;N;;;;; + 2604;COMET;So;0;ON;;;;;N;;;;; + 2605;BLACK STAR;So;0;ON;;;;;N;;;;; + 2606;WHITE STAR;So;0;ON;;;;;N;;;;; + 2607;LIGHTNING;So;0;ON;;;;;N;;;;; + 2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; + 2609;SUN;So;0;ON;;;;;N;;;;; + 260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; + 260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; + 260C;CONJUNCTION;So;0;ON;;;;;N;;;;; + 260D;OPPOSITION;So;0;ON;;;;;N;;;;; + 260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; + 260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; + 2610;BALLOT BOX;So;0;ON;;;;;N;;;;; + 2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; + 2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; + 2613;SALTIRE;So;0;ON;;;;;N;;;;; + 2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; + 261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; + 261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; + 261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; + 261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; + 261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; + 261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; + 2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; + 2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; + 2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; + 2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; + 2624;CADUCEUS;So;0;ON;;;;;N;;;;; + 2625;ANKH;So;0;ON;;;;;N;;;;; + 2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; + 2627;CHI RHO;So;0;ON;;;;;N;;;;; + 2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; + 2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; + 262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; + 262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; + 262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; + 262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; + 262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; + 262F;YIN YANG;So;0;ON;;;;;N;;;;; + 2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; + 2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; + 2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; + 2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; + 2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; + 2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; + 2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; + 2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; + 2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; + 2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; + 263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; + 263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; + 263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; + 263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; + 263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; + 263F;MERCURY;So;0;ON;;;;;N;;;;; + 2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; + 2641;EARTH;So;0;ON;;;;;N;;;;; + 2642;MALE SIGN;So;0;ON;;;;;N;;;;; + 2643;JUPITER;So;0;ON;;;;;N;;;;; + 2644;SATURN;So;0;ON;;;;;N;;;;; + 2645;URANUS;So;0;ON;;;;;N;;;;; + 2646;NEPTUNE;So;0;ON;;;;;N;;;;; + 2647;PLUTO;So;0;ON;;;;;N;;;;; + 2648;ARIES;So;0;ON;;;;;N;;;;; + 2649;TAURUS;So;0;ON;;;;;N;;;;; + 264A;GEMINI;So;0;ON;;;;;N;;;;; + 264B;CANCER;So;0;ON;;;;;N;;;;; + 264C;LEO;So;0;ON;;;;;N;;;;; + 264D;VIRGO;So;0;ON;;;;;N;;;;; + 264E;LIBRA;So;0;ON;;;;;N;;;;; + 264F;SCORPIUS;So;0;ON;;;;;N;;;;; + 2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; + 2651;CAPRICORN;So;0;ON;;;;;N;;;;; + 2652;AQUARIUS;So;0;ON;;;;;N;;;;; + 2653;PISCES;So;0;ON;;;;;N;;;;; + 2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; + 2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; + 2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; + 2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; + 2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; + 2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; + 265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; + 265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; + 265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; + 265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; + 265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; + 265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; + 2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; + 2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; + 2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; + 2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; + 2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; + 2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; + 2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; + 2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; + 2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; + 2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; + 266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; + 266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; + 266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; + 266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; + 266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; + 266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; + 2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; + 2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; + 2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; + 2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; + 2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; + 2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; + 2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; + 2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; + 2708;AIRPLANE;So;0;ON;;;;;N;;;;; + 2709;ENVELOPE;So;0;ON;;;;;N;;;;; + 270C;VICTORY HAND;So;0;ON;;;;;N;;;;; + 270D;WRITING HAND;So;0;ON;;;;;N;;;;; + 270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; + 270F;PENCIL;So;0;ON;;;;;N;;;;; + 2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; + 2711;WHITE NIB;So;0;ON;;;;;N;;;;; + 2712;BLACK NIB;So;0;ON;;;;;N;;;;; + 2713;CHECK MARK;So;0;ON;;;;;N;;;;; + 2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; + 2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; + 2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; + 2717;BALLOT X;So;0;ON;;;;;N;;;;; + 2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; + 2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; + 271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; + 271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; + 271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; + 271D;LATIN CROSS;So;0;ON;;;;;N;;;;; + 271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; + 271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; + 2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; + 2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; + 2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; + 2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; + 2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; + 272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; + 272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; + 272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; + 272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; + 272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; + 272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; + 2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; + 2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; + 2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; + 2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; + 2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; + 2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; + 2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; + 2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; + 2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; + 273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; + 273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; + 273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; + 273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; + 2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; + 2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; + 2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; + 2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; + 2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; + 2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; + 2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; + 2747;SPARKLE;So;0;ON;;;;;N;;;;; + 2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; + 2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; + 274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; + 274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; + 274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; + 274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; + 2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; + 2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; + 2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; + 2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; + 2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; + 2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; + 275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; + 275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; + 275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; + 275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; + 275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; + 2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; + 2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; + 2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; + 2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; + 2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; + 2766;FLORAL HEART;So;0;ON;;;;;N;;;;; + 2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; + 2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; + 2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; + 2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; + 2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; + 277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; + 277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; + 277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; + 277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; + 277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; + 277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; + 2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; + 2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; + 2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; + 2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; + 2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; + 2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; + 2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; + 2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; + 2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; + 2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; + 278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; + 278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; + 278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; + 278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; + 278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; + 278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; + 2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; + 2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; + 2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; + 2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; + 2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; + 2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; + 2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; + 279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; + 279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; + 279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; + 279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; + 279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; + 279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; + 27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; + 27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; + 27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; + 27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; + 27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; + 27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; + 27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; + 27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; + 27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; + 27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; + 27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; + 27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; + 27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; + 27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; + 27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; + 27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; + 27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; + 27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; + 27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; + 27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; + 27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; + 27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; + 27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; + 27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; + 27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; + 27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; + 27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; + 27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; + 27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; + 27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; + 2800;BRAILLE PATTERN BLANK;So;0;ON;;;;;N;;;;; + 2801;BRAILLE PATTERN DOTS-1;So;0;ON;;;;;N;;;;; + 2802;BRAILLE PATTERN DOTS-2;So;0;ON;;;;;N;;;;; + 2803;BRAILLE PATTERN DOTS-12;So;0;ON;;;;;N;;;;; + 2804;BRAILLE PATTERN DOTS-3;So;0;ON;;;;;N;;;;; + 2805;BRAILLE PATTERN DOTS-13;So;0;ON;;;;;N;;;;; + 2806;BRAILLE PATTERN DOTS-23;So;0;ON;;;;;N;;;;; + 2807;BRAILLE PATTERN DOTS-123;So;0;ON;;;;;N;;;;; + 2808;BRAILLE PATTERN DOTS-4;So;0;ON;;;;;N;;;;; + 2809;BRAILLE PATTERN DOTS-14;So;0;ON;;;;;N;;;;; + 280A;BRAILLE PATTERN DOTS-24;So;0;ON;;;;;N;;;;; + 280B;BRAILLE PATTERN DOTS-124;So;0;ON;;;;;N;;;;; + 280C;BRAILLE PATTERN DOTS-34;So;0;ON;;;;;N;;;;; + 280D;BRAILLE PATTERN DOTS-134;So;0;ON;;;;;N;;;;; + 280E;BRAILLE PATTERN DOTS-234;So;0;ON;;;;;N;;;;; + 280F;BRAILLE PATTERN DOTS-1234;So;0;ON;;;;;N;;;;; + 2810;BRAILLE PATTERN DOTS-5;So;0;ON;;;;;N;;;;; + 2811;BRAILLE PATTERN DOTS-15;So;0;ON;;;;;N;;;;; + 2812;BRAILLE PATTERN DOTS-25;So;0;ON;;;;;N;;;;; + 2813;BRAILLE PATTERN DOTS-125;So;0;ON;;;;;N;;;;; + 2814;BRAILLE PATTERN DOTS-35;So;0;ON;;;;;N;;;;; + 2815;BRAILLE PATTERN DOTS-135;So;0;ON;;;;;N;;;;; + 2816;BRAILLE PATTERN DOTS-235;So;0;ON;;;;;N;;;;; + 2817;BRAILLE PATTERN DOTS-1235;So;0;ON;;;;;N;;;;; + 2818;BRAILLE PATTERN DOTS-45;So;0;ON;;;;;N;;;;; + 2819;BRAILLE PATTERN DOTS-145;So;0;ON;;;;;N;;;;; + 281A;BRAILLE PATTERN DOTS-245;So;0;ON;;;;;N;;;;; + 281B;BRAILLE PATTERN DOTS-1245;So;0;ON;;;;;N;;;;; + 281C;BRAILLE PATTERN DOTS-345;So;0;ON;;;;;N;;;;; + 281D;BRAILLE PATTERN DOTS-1345;So;0;ON;;;;;N;;;;; + 281E;BRAILLE PATTERN DOTS-2345;So;0;ON;;;;;N;;;;; + 281F;BRAILLE PATTERN DOTS-12345;So;0;ON;;;;;N;;;;; + 2820;BRAILLE PATTERN DOTS-6;So;0;ON;;;;;N;;;;; + 2821;BRAILLE PATTERN DOTS-16;So;0;ON;;;;;N;;;;; + 2822;BRAILLE PATTERN DOTS-26;So;0;ON;;;;;N;;;;; + 2823;BRAILLE PATTERN DOTS-126;So;0;ON;;;;;N;;;;; + 2824;BRAILLE PATTERN DOTS-36;So;0;ON;;;;;N;;;;; + 2825;BRAILLE PATTERN DOTS-136;So;0;ON;;;;;N;;;;; + 2826;BRAILLE PATTERN DOTS-236;So;0;ON;;;;;N;;;;; + 2827;BRAILLE PATTERN DOTS-1236;So;0;ON;;;;;N;;;;; + 2828;BRAILLE PATTERN DOTS-46;So;0;ON;;;;;N;;;;; + 2829;BRAILLE PATTERN DOTS-146;So;0;ON;;;;;N;;;;; + 282A;BRAILLE PATTERN DOTS-246;So;0;ON;;;;;N;;;;; + 282B;BRAILLE PATTERN DOTS-1246;So;0;ON;;;;;N;;;;; + 282C;BRAILLE PATTERN DOTS-346;So;0;ON;;;;;N;;;;; + 282D;BRAILLE PATTERN DOTS-1346;So;0;ON;;;;;N;;;;; + 282E;BRAILLE PATTERN DOTS-2346;So;0;ON;;;;;N;;;;; + 282F;BRAILLE PATTERN DOTS-12346;So;0;ON;;;;;N;;;;; + 2830;BRAILLE PATTERN DOTS-56;So;0;ON;;;;;N;;;;; + 2831;BRAILLE PATTERN DOTS-156;So;0;ON;;;;;N;;;;; + 2832;BRAILLE PATTERN DOTS-256;So;0;ON;;;;;N;;;;; + 2833;BRAILLE PATTERN DOTS-1256;So;0;ON;;;;;N;;;;; + 2834;BRAILLE PATTERN DOTS-356;So;0;ON;;;;;N;;;;; + 2835;BRAILLE PATTERN DOTS-1356;So;0;ON;;;;;N;;;;; + 2836;BRAILLE PATTERN DOTS-2356;So;0;ON;;;;;N;;;;; + 2837;BRAILLE PATTERN DOTS-12356;So;0;ON;;;;;N;;;;; + 2838;BRAILLE PATTERN DOTS-456;So;0;ON;;;;;N;;;;; + 2839;BRAILLE PATTERN DOTS-1456;So;0;ON;;;;;N;;;;; + 283A;BRAILLE PATTERN DOTS-2456;So;0;ON;;;;;N;;;;; + 283B;BRAILLE PATTERN DOTS-12456;So;0;ON;;;;;N;;;;; + 283C;BRAILLE PATTERN DOTS-3456;So;0;ON;;;;;N;;;;; + 283D;BRAILLE PATTERN DOTS-13456;So;0;ON;;;;;N;;;;; + 283E;BRAILLE PATTERN DOTS-23456;So;0;ON;;;;;N;;;;; + 283F;BRAILLE PATTERN DOTS-123456;So;0;ON;;;;;N;;;;; + 2840;BRAILLE PATTERN DOTS-7;So;0;ON;;;;;N;;;;; + 2841;BRAILLE PATTERN DOTS-17;So;0;ON;;;;;N;;;;; + 2842;BRAILLE PATTERN DOTS-27;So;0;ON;;;;;N;;;;; + 2843;BRAILLE PATTERN DOTS-127;So;0;ON;;;;;N;;;;; + 2844;BRAILLE PATTERN DOTS-37;So;0;ON;;;;;N;;;;; + 2845;BRAILLE PATTERN DOTS-137;So;0;ON;;;;;N;;;;; + 2846;BRAILLE PATTERN DOTS-237;So;0;ON;;;;;N;;;;; + 2847;BRAILLE PATTERN DOTS-1237;So;0;ON;;;;;N;;;;; + 2848;BRAILLE PATTERN DOTS-47;So;0;ON;;;;;N;;;;; + 2849;BRAILLE PATTERN DOTS-147;So;0;ON;;;;;N;;;;; + 284A;BRAILLE PATTERN DOTS-247;So;0;ON;;;;;N;;;;; + 284B;BRAILLE PATTERN DOTS-1247;So;0;ON;;;;;N;;;;; + 284C;BRAILLE PATTERN DOTS-347;So;0;ON;;;;;N;;;;; + 284D;BRAILLE PATTERN DOTS-1347;So;0;ON;;;;;N;;;;; + 284E;BRAILLE PATTERN DOTS-2347;So;0;ON;;;;;N;;;;; + 284F;BRAILLE PATTERN DOTS-12347;So;0;ON;;;;;N;;;;; + 2850;BRAILLE PATTERN DOTS-57;So;0;ON;;;;;N;;;;; + 2851;BRAILLE PATTERN DOTS-157;So;0;ON;;;;;N;;;;; + 2852;BRAILLE PATTERN DOTS-257;So;0;ON;;;;;N;;;;; + 2853;BRAILLE PATTERN DOTS-1257;So;0;ON;;;;;N;;;;; + 2854;BRAILLE PATTERN DOTS-357;So;0;ON;;;;;N;;;;; + 2855;BRAILLE PATTERN DOTS-1357;So;0;ON;;;;;N;;;;; + 2856;BRAILLE PATTERN DOTS-2357;So;0;ON;;;;;N;;;;; + 2857;BRAILLE PATTERN DOTS-12357;So;0;ON;;;;;N;;;;; + 2858;BRAILLE PATTERN DOTS-457;So;0;ON;;;;;N;;;;; + 2859;BRAILLE PATTERN DOTS-1457;So;0;ON;;;;;N;;;;; + 285A;BRAILLE PATTERN DOTS-2457;So;0;ON;;;;;N;;;;; + 285B;BRAILLE PATTERN DOTS-12457;So;0;ON;;;;;N;;;;; + 285C;BRAILLE PATTERN DOTS-3457;So;0;ON;;;;;N;;;;; + 285D;BRAILLE PATTERN DOTS-13457;So;0;ON;;;;;N;;;;; + 285E;BRAILLE PATTERN DOTS-23457;So;0;ON;;;;;N;;;;; + 285F;BRAILLE PATTERN DOTS-123457;So;0;ON;;;;;N;;;;; + 2860;BRAILLE PATTERN DOTS-67;So;0;ON;;;;;N;;;;; + 2861;BRAILLE PATTERN DOTS-167;So;0;ON;;;;;N;;;;; + 2862;BRAILLE PATTERN DOTS-267;So;0;ON;;;;;N;;;;; + 2863;BRAILLE PATTERN DOTS-1267;So;0;ON;;;;;N;;;;; + 2864;BRAILLE PATTERN DOTS-367;So;0;ON;;;;;N;;;;; + 2865;BRAILLE PATTERN DOTS-1367;So;0;ON;;;;;N;;;;; + 2866;BRAILLE PATTERN DOTS-2367;So;0;ON;;;;;N;;;;; + 2867;BRAILLE PATTERN DOTS-12367;So;0;ON;;;;;N;;;;; + 2868;BRAILLE PATTERN DOTS-467;So;0;ON;;;;;N;;;;; + 2869;BRAILLE PATTERN DOTS-1467;So;0;ON;;;;;N;;;;; + 286A;BRAILLE PATTERN DOTS-2467;So;0;ON;;;;;N;;;;; + 286B;BRAILLE PATTERN DOTS-12467;So;0;ON;;;;;N;;;;; + 286C;BRAILLE PATTERN DOTS-3467;So;0;ON;;;;;N;;;;; + 286D;BRAILLE PATTERN DOTS-13467;So;0;ON;;;;;N;;;;; + 286E;BRAILLE PATTERN DOTS-23467;So;0;ON;;;;;N;;;;; + 286F;BRAILLE PATTERN DOTS-123467;So;0;ON;;;;;N;;;;; + 2870;BRAILLE PATTERN DOTS-567;So;0;ON;;;;;N;;;;; + 2871;BRAILLE PATTERN DOTS-1567;So;0;ON;;;;;N;;;;; + 2872;BRAILLE PATTERN DOTS-2567;So;0;ON;;;;;N;;;;; + 2873;BRAILLE PATTERN DOTS-12567;So;0;ON;;;;;N;;;;; + 2874;BRAILLE PATTERN DOTS-3567;So;0;ON;;;;;N;;;;; + 2875;BRAILLE PATTERN DOTS-13567;So;0;ON;;;;;N;;;;; + 2876;BRAILLE PATTERN DOTS-23567;So;0;ON;;;;;N;;;;; + 2877;BRAILLE PATTERN DOTS-123567;So;0;ON;;;;;N;;;;; + 2878;BRAILLE PATTERN DOTS-4567;So;0;ON;;;;;N;;;;; + 2879;BRAILLE PATTERN DOTS-14567;So;0;ON;;;;;N;;;;; + 287A;BRAILLE PATTERN DOTS-24567;So;0;ON;;;;;N;;;;; + 287B;BRAILLE PATTERN DOTS-124567;So;0;ON;;;;;N;;;;; + 287C;BRAILLE PATTERN DOTS-34567;So;0;ON;;;;;N;;;;; + 287D;BRAILLE PATTERN DOTS-134567;So;0;ON;;;;;N;;;;; + 287E;BRAILLE PATTERN DOTS-234567;So;0;ON;;;;;N;;;;; + 287F;BRAILLE PATTERN DOTS-1234567;So;0;ON;;;;;N;;;;; + 2880;BRAILLE PATTERN DOTS-8;So;0;ON;;;;;N;;;;; + 2881;BRAILLE PATTERN DOTS-18;So;0;ON;;;;;N;;;;; + 2882;BRAILLE PATTERN DOTS-28;So;0;ON;;;;;N;;;;; + 2883;BRAILLE PATTERN DOTS-128;So;0;ON;;;;;N;;;;; + 2884;BRAILLE PATTERN DOTS-38;So;0;ON;;;;;N;;;;; + 2885;BRAILLE PATTERN DOTS-138;So;0;ON;;;;;N;;;;; + 2886;BRAILLE PATTERN DOTS-238;So;0;ON;;;;;N;;;;; + 2887;BRAILLE PATTERN DOTS-1238;So;0;ON;;;;;N;;;;; + 2888;BRAILLE PATTERN DOTS-48;So;0;ON;;;;;N;;;;; + 2889;BRAILLE PATTERN DOTS-148;So;0;ON;;;;;N;;;;; + 288A;BRAILLE PATTERN DOTS-248;So;0;ON;;;;;N;;;;; + 288B;BRAILLE PATTERN DOTS-1248;So;0;ON;;;;;N;;;;; + 288C;BRAILLE PATTERN DOTS-348;So;0;ON;;;;;N;;;;; + 288D;BRAILLE PATTERN DOTS-1348;So;0;ON;;;;;N;;;;; + 288E;BRAILLE PATTERN DOTS-2348;So;0;ON;;;;;N;;;;; + 288F;BRAILLE PATTERN DOTS-12348;So;0;ON;;;;;N;;;;; + 2890;BRAILLE PATTERN DOTS-58;So;0;ON;;;;;N;;;;; + 2891;BRAILLE PATTERN DOTS-158;So;0;ON;;;;;N;;;;; + 2892;BRAILLE PATTERN DOTS-258;So;0;ON;;;;;N;;;;; + 2893;BRAILLE PATTERN DOTS-1258;So;0;ON;;;;;N;;;;; + 2894;BRAILLE PATTERN DOTS-358;So;0;ON;;;;;N;;;;; + 2895;BRAILLE PATTERN DOTS-1358;So;0;ON;;;;;N;;;;; + 2896;BRAILLE PATTERN DOTS-2358;So;0;ON;;;;;N;;;;; + 2897;BRAILLE PATTERN DOTS-12358;So;0;ON;;;;;N;;;;; + 2898;BRAILLE PATTERN DOTS-458;So;0;ON;;;;;N;;;;; + 2899;BRAILLE PATTERN DOTS-1458;So;0;ON;;;;;N;;;;; + 289A;BRAILLE PATTERN DOTS-2458;So;0;ON;;;;;N;;;;; + 289B;BRAILLE PATTERN DOTS-12458;So;0;ON;;;;;N;;;;; + 289C;BRAILLE PATTERN DOTS-3458;So;0;ON;;;;;N;;;;; + 289D;BRAILLE PATTERN DOTS-13458;So;0;ON;;;;;N;;;;; + 289E;BRAILLE PATTERN DOTS-23458;So;0;ON;;;;;N;;;;; + 289F;BRAILLE PATTERN DOTS-123458;So;0;ON;;;;;N;;;;; + 28A0;BRAILLE PATTERN DOTS-68;So;0;ON;;;;;N;;;;; + 28A1;BRAILLE PATTERN DOTS-168;So;0;ON;;;;;N;;;;; + 28A2;BRAILLE PATTERN DOTS-268;So;0;ON;;;;;N;;;;; + 28A3;BRAILLE PATTERN DOTS-1268;So;0;ON;;;;;N;;;;; + 28A4;BRAILLE PATTERN DOTS-368;So;0;ON;;;;;N;;;;; + 28A5;BRAILLE PATTERN DOTS-1368;So;0;ON;;;;;N;;;;; + 28A6;BRAILLE PATTERN DOTS-2368;So;0;ON;;;;;N;;;;; + 28A7;BRAILLE PATTERN DOTS-12368;So;0;ON;;;;;N;;;;; + 28A8;BRAILLE PATTERN DOTS-468;So;0;ON;;;;;N;;;;; + 28A9;BRAILLE PATTERN DOTS-1468;So;0;ON;;;;;N;;;;; + 28AA;BRAILLE PATTERN DOTS-2468;So;0;ON;;;;;N;;;;; + 28AB;BRAILLE PATTERN DOTS-12468;So;0;ON;;;;;N;;;;; + 28AC;BRAILLE PATTERN DOTS-3468;So;0;ON;;;;;N;;;;; + 28AD;BRAILLE PATTERN DOTS-13468;So;0;ON;;;;;N;;;;; + 28AE;BRAILLE PATTERN DOTS-23468;So;0;ON;;;;;N;;;;; + 28AF;BRAILLE PATTERN DOTS-123468;So;0;ON;;;;;N;;;;; + 28B0;BRAILLE PATTERN DOTS-568;So;0;ON;;;;;N;;;;; + 28B1;BRAILLE PATTERN DOTS-1568;So;0;ON;;;;;N;;;;; + 28B2;BRAILLE PATTERN DOTS-2568;So;0;ON;;;;;N;;;;; + 28B3;BRAILLE PATTERN DOTS-12568;So;0;ON;;;;;N;;;;; + 28B4;BRAILLE PATTERN DOTS-3568;So;0;ON;;;;;N;;;;; + 28B5;BRAILLE PATTERN DOTS-13568;So;0;ON;;;;;N;;;;; + 28B6;BRAILLE PATTERN DOTS-23568;So;0;ON;;;;;N;;;;; + 28B7;BRAILLE PATTERN DOTS-123568;So;0;ON;;;;;N;;;;; + 28B8;BRAILLE PATTERN DOTS-4568;So;0;ON;;;;;N;;;;; + 28B9;BRAILLE PATTERN DOTS-14568;So;0;ON;;;;;N;;;;; + 28BA;BRAILLE PATTERN DOTS-24568;So;0;ON;;;;;N;;;;; + 28BB;BRAILLE PATTERN DOTS-124568;So;0;ON;;;;;N;;;;; + 28BC;BRAILLE PATTERN DOTS-34568;So;0;ON;;;;;N;;;;; + 28BD;BRAILLE PATTERN DOTS-134568;So;0;ON;;;;;N;;;;; + 28BE;BRAILLE PATTERN DOTS-234568;So;0;ON;;;;;N;;;;; + 28BF;BRAILLE PATTERN DOTS-1234568;So;0;ON;;;;;N;;;;; + 28C0;BRAILLE PATTERN DOTS-78;So;0;ON;;;;;N;;;;; + 28C1;BRAILLE PATTERN DOTS-178;So;0;ON;;;;;N;;;;; + 28C2;BRAILLE PATTERN DOTS-278;So;0;ON;;;;;N;;;;; + 28C3;BRAILLE PATTERN DOTS-1278;So;0;ON;;;;;N;;;;; + 28C4;BRAILLE PATTERN DOTS-378;So;0;ON;;;;;N;;;;; + 28C5;BRAILLE PATTERN DOTS-1378;So;0;ON;;;;;N;;;;; + 28C6;BRAILLE PATTERN DOTS-2378;So;0;ON;;;;;N;;;;; + 28C7;BRAILLE PATTERN DOTS-12378;So;0;ON;;;;;N;;;;; + 28C8;BRAILLE PATTERN DOTS-478;So;0;ON;;;;;N;;;;; + 28C9;BRAILLE PATTERN DOTS-1478;So;0;ON;;;;;N;;;;; + 28CA;BRAILLE PATTERN DOTS-2478;So;0;ON;;;;;N;;;;; + 28CB;BRAILLE PATTERN DOTS-12478;So;0;ON;;;;;N;;;;; + 28CC;BRAILLE PATTERN DOTS-3478;So;0;ON;;;;;N;;;;; + 28CD;BRAILLE PATTERN DOTS-13478;So;0;ON;;;;;N;;;;; + 28CE;BRAILLE PATTERN DOTS-23478;So;0;ON;;;;;N;;;;; + 28CF;BRAILLE PATTERN DOTS-123478;So;0;ON;;;;;N;;;;; + 28D0;BRAILLE PATTERN DOTS-578;So;0;ON;;;;;N;;;;; + 28D1;BRAILLE PATTERN DOTS-1578;So;0;ON;;;;;N;;;;; + 28D2;BRAILLE PATTERN DOTS-2578;So;0;ON;;;;;N;;;;; + 28D3;BRAILLE PATTERN DOTS-12578;So;0;ON;;;;;N;;;;; + 28D4;BRAILLE PATTERN DOTS-3578;So;0;ON;;;;;N;;;;; + 28D5;BRAILLE PATTERN DOTS-13578;So;0;ON;;;;;N;;;;; + 28D6;BRAILLE PATTERN DOTS-23578;So;0;ON;;;;;N;;;;; + 28D7;BRAILLE PATTERN DOTS-123578;So;0;ON;;;;;N;;;;; + 28D8;BRAILLE PATTERN DOTS-4578;So;0;ON;;;;;N;;;;; + 28D9;BRAILLE PATTERN DOTS-14578;So;0;ON;;;;;N;;;;; + 28DA;BRAILLE PATTERN DOTS-24578;So;0;ON;;;;;N;;;;; + 28DB;BRAILLE PATTERN DOTS-124578;So;0;ON;;;;;N;;;;; + 28DC;BRAILLE PATTERN DOTS-34578;So;0;ON;;;;;N;;;;; + 28DD;BRAILLE PATTERN DOTS-134578;So;0;ON;;;;;N;;;;; + 28DE;BRAILLE PATTERN DOTS-234578;So;0;ON;;;;;N;;;;; + 28DF;BRAILLE PATTERN DOTS-1234578;So;0;ON;;;;;N;;;;; + 28E0;BRAILLE PATTERN DOTS-678;So;0;ON;;;;;N;;;;; + 28E1;BRAILLE PATTERN DOTS-1678;So;0;ON;;;;;N;;;;; + 28E2;BRAILLE PATTERN DOTS-2678;So;0;ON;;;;;N;;;;; + 28E3;BRAILLE PATTERN DOTS-12678;So;0;ON;;;;;N;;;;; + 28E4;BRAILLE PATTERN DOTS-3678;So;0;ON;;;;;N;;;;; + 28E5;BRAILLE PATTERN DOTS-13678;So;0;ON;;;;;N;;;;; + 28E6;BRAILLE PATTERN DOTS-23678;So;0;ON;;;;;N;;;;; + 28E7;BRAILLE PATTERN DOTS-123678;So;0;ON;;;;;N;;;;; + 28E8;BRAILLE PATTERN DOTS-4678;So;0;ON;;;;;N;;;;; + 28E9;BRAILLE PATTERN DOTS-14678;So;0;ON;;;;;N;;;;; + 28EA;BRAILLE PATTERN DOTS-24678;So;0;ON;;;;;N;;;;; + 28EB;BRAILLE PATTERN DOTS-124678;So;0;ON;;;;;N;;;;; + 28EC;BRAILLE PATTERN DOTS-34678;So;0;ON;;;;;N;;;;; + 28ED;BRAILLE PATTERN DOTS-134678;So;0;ON;;;;;N;;;;; + 28EE;BRAILLE PATTERN DOTS-234678;So;0;ON;;;;;N;;;;; + 28EF;BRAILLE PATTERN DOTS-1234678;So;0;ON;;;;;N;;;;; + 28F0;BRAILLE PATTERN DOTS-5678;So;0;ON;;;;;N;;;;; + 28F1;BRAILLE PATTERN DOTS-15678;So;0;ON;;;;;N;;;;; + 28F2;BRAILLE PATTERN DOTS-25678;So;0;ON;;;;;N;;;;; + 28F3;BRAILLE PATTERN DOTS-125678;So;0;ON;;;;;N;;;;; + 28F4;BRAILLE PATTERN DOTS-35678;So;0;ON;;;;;N;;;;; + 28F5;BRAILLE PATTERN DOTS-135678;So;0;ON;;;;;N;;;;; + 28F6;BRAILLE PATTERN DOTS-235678;So;0;ON;;;;;N;;;;; + 28F7;BRAILLE PATTERN DOTS-1235678;So;0;ON;;;;;N;;;;; + 28F8;BRAILLE PATTERN DOTS-45678;So;0;ON;;;;;N;;;;; + 28F9;BRAILLE PATTERN DOTS-145678;So;0;ON;;;;;N;;;;; + 28FA;BRAILLE PATTERN DOTS-245678;So;0;ON;;;;;N;;;;; + 28FB;BRAILLE PATTERN DOTS-1245678;So;0;ON;;;;;N;;;;; + 28FC;BRAILLE PATTERN DOTS-345678;So;0;ON;;;;;N;;;;; + 28FD;BRAILLE PATTERN DOTS-1345678;So;0;ON;;;;;N;;;;; + 28FE;BRAILLE PATTERN DOTS-2345678;So;0;ON;;;;;N;;;;; + 28FF;BRAILLE PATTERN DOTS-12345678;So;0;ON;;;;;N;;;;; + 2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; + 2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; + 2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; + 2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; + 2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; + 2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; + 2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; + 2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; + 2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; + 2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; + 2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; + 2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; + 2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; + 2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; + 2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; + 2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; + 2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; + 2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; + 2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; + 2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; + 2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; + 2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; + 2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; + 2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; + 2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; + 2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; + 2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; + 2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; + 2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; + 2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; + 2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; + 2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; + 2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; + 2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; + 2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; + 2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; + 2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; + 2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; + 2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; + 2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; + 2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; + 2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; + 2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; + 2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; + 2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; + 2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; + 2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; + 2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; + 2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; + 2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; + 2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; + 2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; + 2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; + 2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; + 2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; + 2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; + 2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; + 2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; + 2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; + 2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; + 2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; + 2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; + 2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; + 2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; + 2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; + 2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; + 2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; + 2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; + 2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; + 2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; + 2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; + 2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; + 2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; + 2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; + 2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; + 2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; + 2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; + 2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; + 2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; + 2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; + 2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; + 2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; + 2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; + 2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; + 2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; + 2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; + 2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; + 2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; + 2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; + 2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; + 2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; + 2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; + 2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; + 2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; + 2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; + 2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; + 2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; + 2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; + 2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; + 2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; + 2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; + 2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; + 2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; + 2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; + 2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; + 2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; + 2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; + 2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; + 2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; + 2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; + 2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; + 2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; + 2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; + 2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; + 2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; + 2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; + 2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; + 2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; + 2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; + 2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; + 2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; + 2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; + 2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; + 2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; + 2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; + 2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; + 2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; + 2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; + 2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; + 2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; + 2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; + 2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; + 2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; + 2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; + 2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; + 2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; + 2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; + 2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; + 2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; + 2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; + 2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; + 2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; + 2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; + 2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; + 2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; + 2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; + 2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; + 2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; + 2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; + 2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; + 2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; + 2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; + 2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; + 2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; + 2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; + 2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; + 2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; + 2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; + 2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; + 2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; + 2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; + 2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; + 2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; + 2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; + 2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; + 2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; + 2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; + 2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; + 2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; + 2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; + 2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; + 2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; + 2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; + 2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; + 2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; + 2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; + 2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; + 2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; + 2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; + 2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; + 2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; + 2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; + 2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; + 2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; + 2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; + 2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; + 2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; + 2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; + 2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; + 2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; + 2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; + 2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; + 2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; + 2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; + 2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; + 2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; + 2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; + 2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; + 2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; + 2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; + 2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; + 2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; + 2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; + 2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; + 2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; + 2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; + 2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; + 2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; + 2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; + 2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; + 2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; + 2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; + 2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; + 2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; + 2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; + 2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; + 2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; + 2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; + 2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; + 2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; + 2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; + 2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; + 2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; + 2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; + 2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; + 2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; + 2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; + 2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; + 2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; + 2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; + 2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; + 2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; + 2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; + 2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; + 2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; + 2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; + 2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; + 2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; + 2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; + 2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; + 2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; + 2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; + 2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; + 2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; + 2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; + 2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; + 2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; + 2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; + 2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; + 2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; + 2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; + 2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; + 2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; + 2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; + 2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; + 2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; + 2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; + 2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; + 2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; + 2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; + 2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; + 2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; + 2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; + 2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; + 2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; + 2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; + 2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; + 2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; + 2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; + 2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; + 2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; + 2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; + 2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; + 2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; + 2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; + 2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; + 2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; + 2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; + 2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; + 2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; + 2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; + 2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; + 2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; + 2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; + 2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; + 2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; + 2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; + 2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; + 2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; + 2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; + 2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; + 2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; + 2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; + 2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; + 2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; + 2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; + 2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; + 2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; + 2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; + 2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; + 2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; + 2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; + 2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; + 2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; + 2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; + 2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; + 2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; + 2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; + 2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; + 2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; + 2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; + 2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; + 2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; + 2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; + 2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; + 2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; + 2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; + 2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; + 2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; + 2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; + 2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; + 2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; + 2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; + 2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; + 2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; + 2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; + 2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; + 2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; + 2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; + 2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; + 2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; + 2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; + 2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; + 2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; + 2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; + 2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; + 2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; + 2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; + 2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; + 2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; + 2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; + 3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; + 3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; + 3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; + 3003;DITTO MARK;Po;0;ON;;;;;N;;;;; + 3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; + 3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; + 3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; + 3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; + 3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; + 3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; + 300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; + 300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; + 300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; + 300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; + 300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; + 300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; + 3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; + 3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; + 3012;POSTAL MARK;So;0;ON;;;;;N;;;;; + 3013;GETA MARK;So;0;ON;;;;;N;;;;; + 3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; + 3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; + 3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; + 3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; + 3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; + 3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; + 301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; + 301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; + 301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; + 301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; + 301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; + 301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; + 3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; + 3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; + 3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; + 3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; + 3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; + 3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; + 3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; + 3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; + 3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; + 3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; + 302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; + 302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; + 302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; + 302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; + 302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; + 302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; + 3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; + 3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; + 3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; + 3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; + 3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; + 3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; + 3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; + 3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; + 3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; + 3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; + 303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; + 303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; + 303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; + 3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; + 3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; + 3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; + 3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; + 3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; + 3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; + 3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; + 3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; + 3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; + 304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; + 304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; + 304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; + 304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; + 304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; + 304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; + 3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; + 3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; + 3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; + 3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; + 3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; + 3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; + 3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; + 3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; + 3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; + 3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; + 305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; + 305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; + 305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; + 305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; + 305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; + 305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; + 3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; + 3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; + 3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; + 3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; + 3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; + 3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; + 3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; + 3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; + 3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; + 3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; + 306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; + 306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; + 306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; + 306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; + 306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; + 306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; + 3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; + 3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; + 3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; + 3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; + 3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; + 3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; + 3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; + 3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; + 3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; + 3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; + 307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; + 307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; + 307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; + 307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; + 307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; + 307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; + 3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; + 3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; + 3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; + 3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; + 3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; + 3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; + 3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; + 3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; + 3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; + 3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; + 308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; + 308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; + 308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; + 308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; + 308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; + 308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; + 3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; + 3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; + 3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; + 3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; + 3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; + 3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; + 309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; + 309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; + 309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; + 309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; + 309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; + 30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; + 30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; + 30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; + 30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; + 30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; + 30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; + 30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; + 30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; + 30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; + 30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; + 30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; + 30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; + 30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; + 30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; + 30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; + 30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; + 30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; + 30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; + 30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; + 30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; + 30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; + 30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; + 30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; + 30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; + 30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; + 30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; + 30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; + 30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; + 30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; + 30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; + 30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; + 30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; + 30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; + 30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; + 30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; + 30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; + 30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; + 30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; + 30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; + 30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; + 30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; + 30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; + 30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; + 30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; + 30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; + 30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; + 30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; + 30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; + 30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; + 30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; + 30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; + 30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; + 30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; + 30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; + 30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; + 30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; + 30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; + 30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; + 30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; + 30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; + 30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; + 30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; + 30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; + 30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; + 30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; + 30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; + 30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; + 30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; + 30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; + 30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; + 30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; + 30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; + 30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; + 30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; + 30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; + 30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; + 30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; + 30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; + 30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; + 30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; + 30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; + 30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; + 30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; + 30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; + 30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; + 30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; + 30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; + 30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; + 30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; + 30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; + 30FB;KATAKANA MIDDLE DOT;Pc;0;ON;;;;;N;;;;; + 30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; + 30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; + 30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; + 3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; + 3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; + 3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; + 3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; + 3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; + 310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; + 310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; + 310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; + 310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; + 310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; + 310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; + 3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; + 3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; + 3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; + 3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; + 3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; + 3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; + 3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; + 3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; + 3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; + 3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; + 311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; + 311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; + 311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; + 311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; + 311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; + 311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; + 3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; + 3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; + 3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; + 3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; + 3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; + 3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; + 3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; + 3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; + 3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; + 3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; + 312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; + 312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; + 312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; + 3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; + 3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; + 3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; + 3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; + 3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; + 3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; + 3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; + 3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; + 3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; + 313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; + 313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; + 313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; + 313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; + 313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; + 313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; + 3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; + 3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; + 3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; + 3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; + 3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; + 3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; + 3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; + 3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; + 3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; + 3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; + 314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; + 314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; + 314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; + 314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; + 314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; + 314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; + 3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; + 3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; + 3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; + 3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; + 3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; + 3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; + 3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; + 3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; + 3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; + 3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; + 315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; + 315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; + 315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; + 315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; + 315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; + 315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; + 3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; + 3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; + 3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; + 3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; + 3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; + 3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; + 3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; + 3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; + 3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; + 3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; + 316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; + 316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; + 316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; + 316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; + 316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; + 316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; + 3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; + 3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; + 3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; + 3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; + 3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; + 3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; + 3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; + 3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; + 3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; + 3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; + 317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; + 317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; + 317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; + 317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; + 317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; + 317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; + 3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; + 3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; + 3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; + 3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; + 3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; + 3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; + 3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; + 3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; + 3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; + 3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; + 318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; + 318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; + 318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; + 318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; + 318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; + 3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;Kanbun Tateten;;; + 3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;Kaeriten;;; + 3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;;N;KAERITEN ITI;Kaeriten;;; + 3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;;N;KAERITEN NI;Kaeriten;;; + 3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;;N;KAERITEN SAN;Kaeriten;;; + 3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;;N;KAERITEN SI;Kaeriten;;; + 3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;Kaeriten;;; + 3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;Kaeriten;;; + 3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;Kaeriten;;; + 3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;Kaeriten;;; + 319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;Kaeriten;;; + 319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;Kaeriten;;; + 319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;Kaeriten;;; + 319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;Kaeriten;;; + 319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;Kaeriten;;; + 319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;Kaeriten;;; + 31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; + 31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; + 31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; + 31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; + 31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; + 31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; + 31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; + 31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; + 31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; + 31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; + 31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; + 31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; + 31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; + 31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; + 31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; + 31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; + 31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; + 31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; + 31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; + 31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; + 31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; + 31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; + 31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; + 31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; + 3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; + 3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; + 3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; + 3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; + 3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; + 3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; + 3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; + 3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; + 3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; + 3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; + 320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; + 320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; + 320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; + 320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; + 320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; + 320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; + 3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; + 3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; + 3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; + 3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; + 3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; + 3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; + 3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; + 3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; + 3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; + 3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; + 321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; + 321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; + 321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; + 3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;;N;;;;; + 3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;;N;;;;; + 3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;;N;;;;; + 3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;;N;;;;; + 3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;;N;;;;; + 3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;;N;;;;; + 3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;;N;;;;; + 3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;;N;;;;; + 3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;;N;;;;; + 3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;;N;;;;; + 322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; + 322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; + 322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; + 322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; + 322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; + 322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; + 3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; + 3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; + 3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; + 3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; + 3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; + 3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; + 3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; + 3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; + 3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; + 3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; + 323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; + 323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; + 323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; + 323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; + 323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; + 323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; + 3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; + 3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; + 3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; + 3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; + 3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; + 3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; + 3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; + 3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; + 3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; + 3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; + 3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; + 3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; + 3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; + 3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; + 326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; + 326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; + 326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; + 326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; + 326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; + 326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; + 3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; + 3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; + 3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; + 3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; + 3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; + 3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; + 3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; + 3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; + 3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; + 3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; + 327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; + 327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; + 327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; + 3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; + 3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; + 3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; + 3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; + 3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; + 3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; + 3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; + 3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; + 3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; + 3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; + 328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; + 328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; + 328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; + 328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; + 328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; + 328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; + 3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; + 3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; + 3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; + 3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; + 3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; + 3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; + 3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; + 3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; + 3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; + 3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; + 329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; + 329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; + 329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; + 329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; + 329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; + 329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; + 32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; + 32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; + 32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; + 32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; + 32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; + 32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; + 32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; + 32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; + 32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; + 32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; + 32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; + 32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; + 32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; + 32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; + 32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; + 32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; + 32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; + 32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; + 32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; + 32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; + 32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; + 32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; + 32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; + 32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; + 32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; + 32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; + 32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; + 32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; + 32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; + 32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; + 32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; + 32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; + 32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; + 32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; + 32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; + 32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; + 32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; + 32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; + 32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; + 32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; + 32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; + 32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; + 32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; + 32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; + 32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; + 32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; + 32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; + 32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; + 32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; + 32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; + 32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; + 32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; + 32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; + 32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; + 32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; + 32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; + 32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; + 32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; + 32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; + 32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; + 32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; + 32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; + 32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; + 32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; + 32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; + 32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; + 32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; + 32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; + 32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; + 32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; + 32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; + 32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; + 32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; + 32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; + 32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; + 32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; + 3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; + 3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; + 3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; + 3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; + 3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; + 3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; + 3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; + 3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; + 3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; + 3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; + 330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; + 330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; + 330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; + 330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; + 330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; + 330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; + 3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; + 3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; + 3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; + 3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; + 3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; + 3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; + 3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; + 3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; + 3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; + 3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; + 331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; + 331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; + 331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; + 331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; + 331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; + 331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; + 3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; + 3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; + 3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; + 3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; + 3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; + 3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; + 3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; + 3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; + 3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; + 3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; + 332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; + 332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; + 332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; + 332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; + 332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; + 332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; + 3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; + 3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; + 3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; + 3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; + 3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; + 3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; + 3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; + 3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; + 3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; + 3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; + 333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; + 333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; + 333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; + 333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; + 333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; + 333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; + 3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; + 3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; + 3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; + 3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; + 3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; + 3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; + 3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; + 3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; + 3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; + 3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; + 334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; + 334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; + 334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; + 334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; + 334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; + 334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; + 3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; + 3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; + 3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; + 3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; + 3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; + 3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; + 3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; + 3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; + 3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; + 3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; + 335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; + 335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; + 335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; + 335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; + 335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; + 335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; + 3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; + 3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; + 3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; + 3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; + 3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; + 3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; + 3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; + 3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; + 3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; + 3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; + 336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; + 336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; + 336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; + 336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; + 336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; + 336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; + 3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; + 3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; + 3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; + 3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; + 3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; + 3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; + 3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; + 337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; + 337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; + 337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; + 337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; + 337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; + 3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; + 3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; + 3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; + 3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; + 3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; + 3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; + 3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; + 3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; + 3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; + 3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; + 338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; + 338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; + 338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; + 338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; + 338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; + 338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; + 3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; + 3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; + 3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; + 3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; + 3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; + 3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; + 3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; + 3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; + 3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; + 3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; + 339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; + 339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; + 339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; + 339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; + 339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; + 339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; + 33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; + 33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; + 33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; + 33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; + 33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; + 33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; + 33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; + 33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; + 33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; + 33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; + 33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; + 33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; + 33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; + 33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; + 33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; + 33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; + 33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; + 33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; + 33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; + 33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; + 33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; + 33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; + 33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; + 33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; + 33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; + 33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; + 33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; + 33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; + 33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; + 33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; + 33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; + 33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; + 33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; + 33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; + 33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; + 33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; + 33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; + 33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; + 33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; + 33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; + 33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; + 33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; + 33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; + 33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; + 33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; + 33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; + 33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; + 33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; + 33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; + 33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; + 33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; + 33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; + 33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; + 33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; + 33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; + 33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; + 33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; + 33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; + 33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; + 33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; + 33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; + 33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; + 33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; + 33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; + 33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; + 33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; + 33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; + 33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; + 33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; + 33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; + 33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; + 33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; + 33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; + 33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; + 33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; + 33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; + 33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; + 33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; + 33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; + 33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; + 33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; + 33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; + 33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; + 33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; + 33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; + 33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; + 33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; + 33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; + 33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; + 33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; + 33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; + 33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; + 33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; + 3400;;Lo;0;L;;;;;N;;;;; + 4DB5;;Lo;0;L;;;;;N;;;;; + 4E00;;Lo;0;L;;;;;N;;;;; + 9FA5;;Lo;0;L;;;;;N;;;;; + A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; + A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; + A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; + A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; + A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; + A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; + A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; + A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; + A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; + A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; + A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; + A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; + A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; + A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; + A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; + A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; + A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; + A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; + A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; + A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; + A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; + A015;YI SYLLABLE WU;Lo;0;L;;;;;N;;;;; + A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; + A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; + A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; + A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; + A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; + A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; + A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; + A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; + A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; + A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; + A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; + A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; + A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; + A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; + A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; + A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; + A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; + A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; + A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; + A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; + A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; + A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; + A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; + A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; + A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; + A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; + A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; + A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; + A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; + A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; + A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; + A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; + A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; + A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; + A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; + A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; + A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; + A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; + A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; + A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; + A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; + A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; + A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; + A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; + A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; + A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; + A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; + A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; + A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; + A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; + A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; + A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; + A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; + A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; + A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; + A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; + A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; + A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; + A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; + A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; + A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; + A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; + A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; + A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; + A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; + A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; + A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; + A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; + A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; + A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; + A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; + A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; + A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; + A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; + A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; + A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; + A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; + A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; + A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; + A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; + A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; + A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; + A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; + A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; + A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; + A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; + A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; + A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; + A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; + A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; + A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; + A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; + A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; + A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; + A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; + A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; + A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; + A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; + A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; + A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; + A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; + A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; + A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; + A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; + A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; + A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; + A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; + A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; + A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; + A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; + A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; + A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; + A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; + A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; + A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; + A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; + A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; + A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; + A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; + A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; + A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; + A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; + A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; + A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; + A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; + A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; + A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; + A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; + A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; + A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; + A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; + A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; + A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; + A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; + A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; + A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; + A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; + A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; + A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; + A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; + A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; + A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; + A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; + A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; + A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; + A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; + A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; + A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; + A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; + A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; + A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; + A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; + A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; + A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; + A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; + A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; + A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; + A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; + A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; + A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; + A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; + A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; + A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; + A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; + A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; + A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; + A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; + A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; + A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; + A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; + A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; + A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; + A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; + A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; + A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; + A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; + A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; + A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; + A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; + A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; + A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; + A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; + A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; + A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; + A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; + A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; + A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; + A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; + A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; + A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; + A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; + A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; + A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; + A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; + A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; + A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; + A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; + A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; + A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; + A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; + A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; + A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; + A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; + A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; + A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; + A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; + A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; + A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; + A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; + A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; + A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; + A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; + A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; + A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; + A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; + A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; + A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; + A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; + A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; + A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; + A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; + A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; + A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; + A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; + A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; + A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; + A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; + A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; + A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; + A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; + A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; + A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; + A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; + A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; + A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; + A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; + A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; + A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; + A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; + A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; + A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; + A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; + A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; + A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; + A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; + A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; + A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; + A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; + A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; + A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; + A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; + A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; + A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; + A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; + A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; + A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; + A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; + A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; + A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; + A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; + A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; + A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; + A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; + A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; + A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; + A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; + A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; + A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; + A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; + A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; + A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; + A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; + A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; + A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; + A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; + A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; + A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; + A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; + A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; + A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; + A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; + A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; + A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; + A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; + A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; + A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; + A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; + A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; + A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; + A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; + A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; + A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; + A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; + A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; + A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; + A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; + A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; + A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; + A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; + A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; + A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; + A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; + A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; + A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; + A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; + A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; + A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; + A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; + A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; + A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; + A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; + A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; + A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; + A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; + A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; + A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; + A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; + A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; + A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; + A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; + A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; + A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; + A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; + A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; + A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; + A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; + A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; + A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; + A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; + A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; + A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; + A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; + A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; + A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; + A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; + A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; + A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; + A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; + A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; + A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; + A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; + A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; + A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; + A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; + A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; + A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; + A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; + A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; + A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; + A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; + A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; + A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; + A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; + A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; + A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; + A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; + A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; + A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; + A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; + A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; + A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; + A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; + A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; + A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; + A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; + A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; + A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; + A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; + A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; + A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; + A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; + A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; + A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; + A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; + A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; + A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; + A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; + A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; + A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; + A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; + A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; + A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; + A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; + A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; + A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; + A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; + A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; + A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; + A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; + A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; + A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; + A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; + A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; + A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; + A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; + A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; + A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; + A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; + A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; + A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; + A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; + A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; + A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; + A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; + A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; + A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; + A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; + A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; + A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; + A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; + A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; + A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; + A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; + A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; + A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; + A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; + A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; + A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; + A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; + A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; + A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; + A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; + A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; + A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; + A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; + A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; + A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; + A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; + A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; + A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; + A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; + A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; + A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; + A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; + A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; + A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; + A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; + A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; + A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; + A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; + A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; + A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; + A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; + A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; + A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; + A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; + A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; + A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; + A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; + A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; + A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; + A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; + A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; + A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; + A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; + A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; + A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; + A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; + A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; + A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; + A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; + A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; + A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; + A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; + A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; + A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; + A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; + A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; + A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; + A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; + A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; + A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; + A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; + A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; + A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; + A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; + A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; + A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; + A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; + A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; + A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; + A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; + A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; + A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; + A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; + A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; + A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; + A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; + A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; + A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; + A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; + A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; + A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; + A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; + A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; + A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; + A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; + A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; + A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; + A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; + A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; + A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; + A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; + A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; + A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; + A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; + A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; + A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; + A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; + A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; + A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; + A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; + A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; + A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; + A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; + A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; + A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; + A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; + A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; + A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; + A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; + A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; + A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; + A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; + A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; + A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; + A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; + A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; + A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; + A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; + A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; + A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; + A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; + A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; + A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; + A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; + A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; + A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; + A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; + A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; + A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; + A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; + A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; + A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; + A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; + A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; + A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; + A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; + A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; + A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; + A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; + A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; + A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; + A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; + A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; + A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; + A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; + A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; + A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; + A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; + A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; + A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; + A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; + A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; + A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; + A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; + A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; + A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; + A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; + A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; + A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; + A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; + A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; + A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; + A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; + A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; + A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; + A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; + A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; + A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; + A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; + A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; + A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; + A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; + A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; + A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; + A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; + A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; + A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; + A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; + A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; + A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; + A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; + A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; + A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; + A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; + A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; + A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; + A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; + A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; + A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; + A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; + A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; + A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; + A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; + A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; + A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; + A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; + A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; + A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; + A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; + A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; + A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; + A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; + A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; + A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; + A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; + A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; + A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; + A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; + A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; + A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; + A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; + A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; + A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; + A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; + A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; + A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; + A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; + A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; + A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; + A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; + A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; + A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; + A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; + A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; + A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; + A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; + A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; + A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; + A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; + A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; + A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; + A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; + A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; + A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; + A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; + A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; + A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; + A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; + A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; + A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; + A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; + A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; + A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; + A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; + A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; + A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; + A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; + A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; + A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; + A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; + A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; + A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; + A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; + A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; + A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; + A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; + A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; + A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; + A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; + A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; + A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; + A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; + A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; + A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; + A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; + A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; + A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; + A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; + A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; + A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; + A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; + A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; + A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; + A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; + A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; + A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; + A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; + A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; + A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; + A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; + A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; + A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; + A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; + A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; + A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; + A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; + A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; + A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; + A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; + A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; + A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; + A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; + A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; + A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; + A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; + A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; + A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; + A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; + A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; + A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; + A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; + A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; + A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; + A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; + A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; + A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; + A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; + A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; + A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; + A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; + A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; + A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; + A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; + A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; + A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; + A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; + A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; + A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; + A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; + A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; + A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; + A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; + A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; + A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; + A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; + A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; + A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; + A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; + A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; + A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; + A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; + A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; + A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; + A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; + A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; + A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; + A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; + A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; + A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; + A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; + A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; + A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; + A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; + A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; + A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; + A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; + A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; + A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; + A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; + A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; + A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; + A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; + A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; + A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; + A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; + A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; + A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; + A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; + A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; + A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; + A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; + A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; + A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; + A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; + A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; + A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; + A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; + A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; + A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; + A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; + A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; + A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; + A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; + A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; + A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; + A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; + A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; + A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; + A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; + A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; + A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; + A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; + A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; + A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; + A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; + A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; + A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; + A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; + A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; + A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; + A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; + A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; + A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; + A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; + A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; + A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; + A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; + A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; + A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; + A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; + A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; + A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; + A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; + A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; + A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; + A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; + A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; + A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; + A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; + A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; + A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; + A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; + A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; + A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; + A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; + A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; + A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; + A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; + A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; + A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; + A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; + A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; + A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; + A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; + A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; + A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; + A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; + A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; + A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; + A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; + A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; + A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; + A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; + A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; + A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; + A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; + A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; + A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; + A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; + A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; + A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; + A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; + A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; + A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; + A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; + A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; + A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; + A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; + A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; + A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; + A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; + A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; + A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; + A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; + A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; + A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; + A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; + A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; + A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; + A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; + A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; + A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; + A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; + A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; + A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; + A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; + A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; + A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; + A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; + A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; + A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; + A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; + A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; + A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; + A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; + A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; + A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; + A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; + A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; + A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; + A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; + A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; + A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; + A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; + A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; + A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; + A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; + A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; + A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; + A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; + A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; + A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; + A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; + A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; + A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; + A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; + A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; + A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; + A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; + A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; + A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; + A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; + A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; + A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; + A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; + A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; + A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; + A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; + A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; + A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; + A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; + A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; + A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; + A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; + A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; + A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; + A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; + A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; + A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; + A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; + A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; + A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; + A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; + A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; + A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; + A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; + A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; + A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; + A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; + A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; + A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; + A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; + A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; + A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; + A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; + A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; + A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; + A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; + A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; + A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; + A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; + A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; + A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; + A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; + A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; + A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; + A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; + A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; + A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; + A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; + A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; + A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; + A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; + A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; + A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; + A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; + A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; + A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; + A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; + A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; + A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; + A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; + A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; + A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; + A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; + A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; + A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; + A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; + A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; + A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; + A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; + A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; + A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; + A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; + A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; + A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; + A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; + A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; + A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; + A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; + A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; + A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; + A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; + A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; + A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; + A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; + A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; + A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; + A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; + A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; + A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; + A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; + A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; + A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; + A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; + A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; + A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; + A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; + A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; + A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; + A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; + A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; + A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; + A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; + A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; + A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; + A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; + A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; + A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; + A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; + A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; + A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; + A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; + A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; + A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; + A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; + A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; + A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; + A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; + A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; + A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; + A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; + A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; + A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; + A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; + A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; + A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; + A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; + A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; + A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; + A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; + A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; + A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; + A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; + A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; + A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; + A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; + A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; + A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; + A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; + A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; + A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; + A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; + A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; + A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; + A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; + A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; + A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; + A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; + A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; + A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; + A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; + A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; + A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; + A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; + A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; + A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; + A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; + A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; + A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; + A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; + A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; + A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; + A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; + A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; + A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; + A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; + A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; + A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; + A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; + A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; + A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; + A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; + A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; + A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; + A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; + A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; + A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; + A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; + A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; + A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; + A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; + A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; + A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; + A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; + A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; + A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; + A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; + A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; + A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; + A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; + A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; + A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; + A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; + A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; + A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; + A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; + A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; + A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; + A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; + A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; + A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; + A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; + A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; + A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; + A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; + A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; + A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; + A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; + A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; + A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; + A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; + A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; + A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; + A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; + A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; + A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; + A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; + A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; + A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; + A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; + A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; + A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; + A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; + A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; + A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; + A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; + A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; + A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; + A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; + A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; + A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; + A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; + A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; + A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; + A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; + A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; + A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; + A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; + A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; + A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; + A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; + A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; + A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; + A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; + A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; + A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; + A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; + A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; + A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; + A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; + A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; + A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; + A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; + A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; + A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; + A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; + A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; + A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; + A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; + A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; + A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; + A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; + A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; + A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; + A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; + A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; + A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; + A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; + A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; + A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; + A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; + A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; + A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; + A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; + A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; + A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; + A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; + A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; + A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; + A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; + AC00;;Lo;0;L;;;;;N;;;;; + D7A3;;Lo;0;L;;;;;N;;;;; + D800;;Cs;0;L;;;;;N;;;;; + DB7F;;Cs;0;L;;;;;N;;;;; + DB80;;Cs;0;L;;;;;N;;;;; + DBFF;;Cs;0;L;;;;;N;;;;; + DC00;;Cs;0;L;;;;;N;;;;; + DFFF;;Cs;0;L;;;;;N;;;;; + E000;;Co;0;L;;;;;N;;;;; + F8FF;;Co;0;L;;;;;N;;;;; + F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; + F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; + F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; + F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; + F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; + F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; + F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; + F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; + F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; + F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; + F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; + F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; + F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; + F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; + F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; + F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; + F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; + F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; + F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; + F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; + F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; + F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; + F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; + F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; + F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; + F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; + F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; + F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; + F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; + F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; + F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; + F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; + F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; + F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; + F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; + F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; + F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; + F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; + F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; + F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; + F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; + F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; + F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; + F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; + F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; + F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; + F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; + F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; + F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; + F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; + F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; + F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; + F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; + F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; + F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; + F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; + F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; + F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; + F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; + F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; + F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; + F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; + F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; + F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; + F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; + F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; + F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; + F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; + F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; + F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; + F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; + F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; + F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; + F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; + F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; + F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; + F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; + F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; + F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; + F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; + F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; + F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;96FB;;;;N;;;;; + F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; + F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; + F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; + F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; + F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; + F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; + F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; + F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; + F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; + F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; + F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; + F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; + F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; + F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; + F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; + F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; + F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; + F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; + F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; + F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; + F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; + F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; + F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; + F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; + F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; + F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;;N;;;;; + F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; + F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; + F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; + F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; + F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; + F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; + F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; + F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;;N;;;;; + F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; + F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; + F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; + F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; + F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;;N;;;;; + F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; + F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; + F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; + F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; + F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; + F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; + F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; + F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; + F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; + F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; + F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; + F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; + F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; + F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; + F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; + F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; + F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; + F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; + F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; + F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; + F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; + F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; + F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; + F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; + F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; + F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; + F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; + F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; + F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; + F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; + F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; + F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; + F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; + F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; + F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; + F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; + F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; + F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; + F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; + F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; + F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; + F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; + F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; + F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; + F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; + F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; + F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; + F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; + F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; + F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; + F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; + F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; + F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; + F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; + F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; + F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; + F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; + F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;;N;;;;; + F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; + F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; + F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; + F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; + F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; + F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; + F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; + F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; + F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; + F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; + F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; + F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; + F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; + F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; + F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; + F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; + F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; + F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; + F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; + F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; + F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; + F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; + F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; + F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; + F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; + F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; + F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; + F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; + F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; + F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; + F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;;N;;;;; + F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; + F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;;N;;;;; + F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; + F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; + F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; + F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; + F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; + F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; + F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; + F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; + F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; + F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; + F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; + F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; + F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; + F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; + F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; + F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; + F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; + F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; + F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; + F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; + F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; + F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; + F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; + F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; + F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; + F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; + F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; + F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; + F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; + F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; + F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; + F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; + F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; + F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; + F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; + F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; + F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; + F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; + F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; + F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; + F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; + F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;;N;;;;; + F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; + F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; + FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; + FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; + FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; + FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; + FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; + FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; + FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; + FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; + FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; + FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; + FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; + FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; + FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; + FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; + FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; + FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; + FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; + FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; + FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; + FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; + FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; + FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; + FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; + FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; + FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; + FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; + FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; + FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; + FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; + FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; + FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; + FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;*;;; + FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; + FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; + FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; + FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;*;;; + FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; + FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; + FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; + FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; + FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; + FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; + FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; + FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; + FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; + FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; + FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; + FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; + FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; + FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; + FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; + FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; + FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; + FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; + FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; + FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; + FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; + FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; + FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; + FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; + FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; + FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; + FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; + FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; + FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; + FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; + FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; + FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; + FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; + FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; + FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; + FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; + FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; + FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; + FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; + FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; + FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; + FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; + FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; + FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; + FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; + FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; + FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; + FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; + FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; + FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; + FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; + FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; + FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; + FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; + FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; + FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; + FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; + FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; + FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; + FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; + FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; + FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; + FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; + FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; + FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; + FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; + FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; + FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; + FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; + FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; + FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; + FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; + FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; + FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; + FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; + FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; + FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; + FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; + FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; + FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; + FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; + FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; + FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; + FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; + FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; + FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; + FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; + FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; + FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; + FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; + FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; + FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; + FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; + FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; + FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; + FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; + FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; + FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; + FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; + FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; + FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; + FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; + FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; + FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; + FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; + FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; + FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; + FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; + FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; + FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; + FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; + FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; + FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; + FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; + FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; + FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; + FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; + FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; + FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; + FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; + FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; + FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; + FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; + FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; + FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; + FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; + FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; + FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; + FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; + FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; + FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; + FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; + FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; + FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; + FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; + FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; + FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; + FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; + FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; + FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; + FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; + FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; + FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; + FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; + FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; + FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; + FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; + FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; + FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; + FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; + FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; + FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; + FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; + FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; + FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; + FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; + FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; + FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; + FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; + FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; + FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; + FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; + FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; + FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; + FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; + FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; + FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; + FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; + FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; + FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; + FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; + FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; + FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; + FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; + FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; + FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; + FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; + FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; + FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; + FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; + FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; + FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; + FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; + FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; + FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; + FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; + FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; + FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; + FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; + FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; + FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; + FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; + FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; + FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; + FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; + FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; + FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; + FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; + FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; + FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; + FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; + FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; + FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; + FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; + FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; + FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; + FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; + FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; + FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; + FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; + FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; + FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; + FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; + FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; + FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; + FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; + FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; + FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; + FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; + FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; + FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; + FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; + FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; + FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; + FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; + FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; + FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; + FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; + FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; + FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; + FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; + FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; + FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; + FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; + FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; + FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; + FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; + FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; + FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; + FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; + FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; + FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; + FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; + FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; + FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; + FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; + FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; + FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; + FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; + FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; + FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; + FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; + FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; + FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; + FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; + FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; + FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; + FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; + FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; + FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; + FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; + FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; + FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; + FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; + FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; + FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; + FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; + FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; + FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; + FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; + FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; + FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; + FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; + FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; + FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; + FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; + FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; + FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; + FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; + FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; + FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; + FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; + FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; + FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; + FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; + FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; + FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; + FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; + FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; + FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; + FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; + FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; + FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; + FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; + FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; + FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; + FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; + FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; + FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; + FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; + FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; + FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; + FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; + FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; + FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; + FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; + FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; + FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; + FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; + FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; + FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; + FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; + FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; + FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; + FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; + FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; + FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; + FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; + FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; + FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; + FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; + FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; + FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; + FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; + FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; + FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; + FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; + FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; + FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; + FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; + FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; + FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; + FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; + FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; + FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; + FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; + FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; + FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; + FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; + FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; + FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; + FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; + FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; + FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; + FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; + FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; + FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; + FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; + FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; + FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; + FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; + FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; + FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; + FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; + FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; + FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; + FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; + FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; + FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; + FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; + FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; + FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; + FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; + FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; + FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; + FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; + FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; + FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; + FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; + FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; + FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; + FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; + FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; + FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; + FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; + FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; + FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; + FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; + FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; + FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; + FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; + FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; + FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; + FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; + FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; + FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; + FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; + FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; + FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; + FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; + FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; + FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; + FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; + FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; + FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; + FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; + FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; + FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; + FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; + FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; + FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; + FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; + FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; + FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; + FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; + FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; + FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; + FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; + FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; + FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; + FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; + FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; + FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; + FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; + FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; + FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; + FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; + FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; + FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; + FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; + FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; + FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; + FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; + FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; + FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; + FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; + FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; + FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; + FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; + FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; + FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; + FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; + FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; + FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; + FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; + FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; + FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; + FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; + FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; + FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; + FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; + FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; + FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; + FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; + FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; + FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; + FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; + FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; + FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; + FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; + FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; + FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; + FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; + FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; + FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; + FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; + FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; + FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; + FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; + FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; + FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; + FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; + FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; + FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; + FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; + FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; + FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; + FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; + FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; + FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; + FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; + FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; + FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; + FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; + FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; + FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; + FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; + FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; + FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; + FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; + FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; + FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; + FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; + FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; + FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; + FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; + FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; + FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; + FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; + FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; + FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; + FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; + FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; + FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; + FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; + FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; + FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; + FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; + FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; + FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; + FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; + FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; + FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; + FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; + FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; + FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; + FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; + FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; + FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; + FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; + FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; + FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; + FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; + FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; + FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; + FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; + FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; + FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; + FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; + FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; + FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; + FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; + FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; + FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; + FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; + FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; + FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; + FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; + FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; + FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;; + FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;; + FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; + FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; + FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; + FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; + FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; + FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; + FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; + FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; + FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; + FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; + FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; + FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; + FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; + FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; + FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; + FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; + FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; + FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; + FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; + FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; + FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; + FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; + FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; + FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; + FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; + FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; + FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; + FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; + FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; + FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; + FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; + FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; + FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; + FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; + FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; + FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; + FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; + FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; + FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; + FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; + FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; + FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; + FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; + FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; + FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; + FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; + FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; + FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; + FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; + FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; + FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; + FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; + FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; + FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; + FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; + FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; + FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; + FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; + FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; + FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; + FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; + FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; + FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; + FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; + FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; + FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; + FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; + FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; + FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; + FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; + FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; + FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; + FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; + FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; + FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; + FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; + FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; + FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; + FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; + FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; + FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; + FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; + FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; + FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; + FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; + FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; + FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; + FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; + FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; + FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; + FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; + FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; + FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; + FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; + FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; + FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; + FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; + FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; + FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; + FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; + FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; + FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; + FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; + FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; + FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; + FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; + FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; + FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; + FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; + FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; + FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; + FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; + FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; + FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; + FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; + FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; + FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; + FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; + FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; + FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; + FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; + FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; + FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; + FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; + FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; + FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; + FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; + FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; + FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; + FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; + FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; + FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; + FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; + FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; + FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; + FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; + FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; + FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; + FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; + FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; + FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; + FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; + FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; + FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; + FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; + FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; + FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; + FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; + FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; + FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; + FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; + FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; + FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; + FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; + FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; + FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; + FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; + FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; + FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; + FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; + FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; + FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; + FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; + FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; + FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; + FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; + FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; + FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; + FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; + FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; + FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;SMALL OPENING PARENTHESIS;;;; + FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;SMALL CLOSING PARENTHESIS;;;; + FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;SMALL OPENING CURLY BRACKET;;;; + FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;SMALL CLOSING CURLY BRACKET;;;; + FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;SMALL OPENING TORTOISE SHELL BRACKET;;;; + FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;SMALL CLOSING TORTOISE SHELL BRACKET;;;; + FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; + FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; + FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; + FE62;SMALL PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; + FE63;SMALL HYPHEN-MINUS;Pd;0;ET; 002D;;;;N;;;;; + FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;N;;;;; + FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;N;;;;; + FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; + FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; + FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; + FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; + FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; + FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; + FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; + FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; + FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; + FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; + FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; + FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; + FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; + FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; + FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; + FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; + FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; + FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; + FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; + FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; + FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; + FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; + FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; + FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; + FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; + FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; + FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; + FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; + FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; + FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; + FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; + FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; + FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; + FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; + FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; + FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; + FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; + FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; + FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; + FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; + FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; + FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; + FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; + FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; + FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; + FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; + FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; + FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; + FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; + FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; + FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; + FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; + FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; + FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; + FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; + FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; + FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; + FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; + FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; + FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; + FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; + FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; + FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; + FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; + FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; + FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; + FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; + FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; + FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; + FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; + FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; + FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; + FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; + FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; + FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; + FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; + FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; + FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; + FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; + FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; + FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; + FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; + FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; + FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; + FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; + FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; + FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; + FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; + FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; + FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; + FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; + FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; + FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; + FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; + FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; + FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; + FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; + FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; + FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; + FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; + FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; + FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; + FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; + FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; + FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; + FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; + FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; + FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; + FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; + FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; + FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; + FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; + FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; + FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; + FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; + FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; + FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; + FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; + FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; + FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; + FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; + FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; + FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; + FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; + FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; + FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; + FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; + FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; + FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; + FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; + FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; + FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; + FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; + FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; + FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; + FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; + FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; + FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; + FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; + FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; + FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; + FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; + FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; + FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; + FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; + FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; + FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; + FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; + FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; + FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; + FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; + FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; + FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;FULLWIDTH OPENING PARENTHESIS;;;; + FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;FULLWIDTH CLOSING PARENTHESIS;;;; + FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; + FF0B;FULLWIDTH PLUS SIGN;Sm;0;ET; 002B;;;;N;;;;; + FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; + FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ET; 002D;;;;N;;;;; + FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; + FF0F;FULLWIDTH SOLIDUS;Po;0;ES; 002F;;;;N;FULLWIDTH SLASH;;;; + FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; + FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; + FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; + FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; + FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; + FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; + FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; + FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; + FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; + FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; + FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; + FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; + FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;N;;;;; + FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; + FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;N;;;;; + FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; + FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; + FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; + FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; + FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; + FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; + FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; + FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; + FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; + FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; + FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; + FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; + FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; + FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; + FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; + FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; + FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; + FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; + FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; + FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; + FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; + FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; + FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; + FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; + FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; + FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; + FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; + FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; + FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;FULLWIDTH OPENING SQUARE BRACKET;;;; + FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; + FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;FULLWIDTH CLOSING SQUARE BRACKET;;;; + FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; + FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; + FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; + FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 + FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 + FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 + FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 + FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 + FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 + FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 + FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 + FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 + FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A + FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B + FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C + FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D + FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E + FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F + FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 + FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 + FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 + FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 + FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 + FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 + FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 + FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 + FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 + FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 + FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A + FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;FULLWIDTH OPENING CURLY BRACKET;;;; + FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; + FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;FULLWIDTH CLOSING CURLY BRACKET;;;; + FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; + FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; + FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;HALFWIDTH OPENING CORNER BRACKET;;;; + FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;HALFWIDTH CLOSING CORNER BRACKET;;;; + FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; + FF65;HALFWIDTH KATAKANA MIDDLE DOT;Pc;0;ON; 30FB;;;;N;;;;; + FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; + FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; + FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; + FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; + FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; + FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; + FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; + FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; + FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; + FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; + FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; + FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; + FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; + FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; + FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; + FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; + FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; + FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; + FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; + FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; + FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; + FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; + FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; + FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; + FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; + FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; + FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; + FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; + FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; + FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; + FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; + FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; + FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; + FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; + FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; + FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; + FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; + FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; + FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; + FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; + FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; + FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; + FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; + FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; + FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; + FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; + FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; + FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; + FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; + FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; + FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; + FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; + FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; + FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; + FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; + FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; + FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;halfwidth katakana-hiragana voiced sound mark;;; + FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;halfwidth katakana-hiragana semi-voiced sound mark;;; + FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; + FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; + FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; + FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; + FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; + FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; + FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; + FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; + FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; + FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; + FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; + FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; + FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; + FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; + FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; + FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; + FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; + FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; + FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; + FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; + FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; + FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; + FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; + FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; + FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; + FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; + FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; + FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; + FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; + FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; + FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; + FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; + FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; + FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; + FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; + FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; + FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; + FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; + FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; + FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; + FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; + FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; + FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; + FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; + FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; + FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; + FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; + FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; + FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; + FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; + FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; + FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; + FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; + FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; + FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; + FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;*;;; + FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; + FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; + FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; + FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; + FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; + FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; + FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; + FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; + FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; + FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; + FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;BN;;;;;N;;;;; + FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;BN;;;;;N;;;;; + FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;BN;;;;;N;;;;; + FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; + FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/UnicodeToBytes.java gcc-3.1/libjava/gnu/gcj/convert/UnicodeToBytes.java *** gcc-3.0.4/libjava/gnu/gcj/convert/UnicodeToBytes.java Tue Sep 18 04:04:32 2001 --- gcc-3.1/libjava/gnu/gcj/convert/UnicodeToBytes.java Sat Aug 18 03:56:01 2001 *************** *** 1,4 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** Libgcj License. Please consult the file *** 7,13 **** details. */ package gnu.gcj.convert; ! public abstract class UnicodeToBytes extends IOConverter { /** Buffer to emit bytes to. --- 7,13 ---- details. */ package gnu.gcj.convert; ! public abstract class UnicodeToBytes extends IOConverter { /** Buffer to emit bytes to. *************** public abstract class UnicodeToBytes ext *** 15,42 **** public byte[] buf; public int count; ! static Class defaultEncodingClass; ! static synchronized void getDefaultEncodingClass() ! { ! // Test (defaultEncodingClass == null) again in case of race condition. ! if (defaultEncodingClass == null) ! { ! String encoding = canonicalize (System.getProperty("file.encoding")); ! String className = "gnu.gcj.convert.Output_"+encoding; ! try ! { ! defaultEncodingClass = Class.forName(className); ! } ! catch (ClassNotFoundException ex) ! { ! throw new NoClassDefFoundError("missing default encoding " ! + encoding + " (class " ! + className + " not found)"); ! ! } ! } ! } public abstract String getName(); --- 15,34 ---- public byte[] buf; public int count; ! // The name of the default encoding. ! static String defaultEncoding; ! /* These keep a small cache of encoders for reuse. The array holds ! the actual encoders. The currCachePos is the next value we are ! going to replace in the cache. We don't just throw the data away ! if the cache is full, because if the cache filled up with stuff we ! don't need then the cache would be worthless. We instead ! circulate through the cache the implement kind of an LRU ! algorithm. */ ! private static final int CACHE_SIZE = 4; // A power of 2 for speed ! private static UnicodeToBytes[] encoderCache ! = new UnicodeToBytes[CACHE_SIZE]; ! private static int currCachePos = 0; public abstract String getName(); *************** public abstract class UnicodeToBytes ext *** 44,63 **** { try { ! if (defaultEncodingClass == null) ! getDefaultEncodingClass(); ! return (UnicodeToBytes) defaultEncodingClass.newInstance(); } catch (Throwable ex) { ! try ! { ! return new Output_iconv (System.getProperty ("file.encoding")); ! } ! catch (Throwable ex2) ! { ! return new Output_8859_1(); ! } } } --- 36,69 ---- { try { ! synchronized (UnicodeToBytes.class) ! { ! if (defaultEncoding == null) ! { ! String encoding ! = canonicalize (System.getProperty("file.encoding", ! "8859_1")); ! String className = "gnu.gcj.convert.Output_" + encoding; ! try ! { ! Class defaultEncodingClass = Class.forName(className); ! defaultEncoding = encoding; ! } ! catch (ClassNotFoundException ex) ! { ! throw new NoClassDefFoundError("missing default encoding " ! + encoding + " (class " ! + className ! + " not found)"); ! } ! } ! } ! ! return getEncoder (defaultEncoding); } catch (Throwable ex) { ! return new Output_8859_1(); } } *************** public abstract class UnicodeToBytes ext *** 65,70 **** --- 71,93 ---- public static UnicodeToBytes getEncoder (String encoding) throws java.io.UnsupportedEncodingException { + /* First hunt in our cache to see if we have a encoder that is + already allocated. */ + synchronized (UnicodeToBytes.class) + { + int i; + for (i = 0; i < encoderCache.length; ++i) + { + if (encoderCache[i] != null + && encoding.equals(encoderCache[i].getName ())) + { + UnicodeToBytes rv = encoderCache[i]; + encoderCache[i] = null; + return rv; + } + } + } + String className = "gnu.gcj.convert.Output_" + canonicalize (encoding); Class encodingClass; try *************** public abstract class UnicodeToBytes ext *** 122,125 **** --- 145,165 ---- str.getChars(inpos, srcEnd, work, 0); return write(work, 0, srcEnd - inpos); } + + /** Indicate that the converter is resuable. + * This class keeps track of converters on a per-encoding basis. + * When done with an encoder you may call this method to indicate + * that it can be reused later. + */ + public void done () + { + synchronized (UnicodeToBytes.class) + { + this.buf = null; + this.count = 0; + + encoderCache[currCachePos] = this; + currCachePos = (currCachePos + 1) % CACHE_SIZE; + } + } } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/Unicode_to_JIS.cc gcc-3.1/libjava/gnu/gcj/convert/Unicode_to_JIS.cc *** gcc-3.0.4/libjava/gnu/gcj/convert/Unicode_to_JIS.cc Fri Apr 16 17:25:05 1999 --- gcc-3.1/libjava/gnu/gcj/convert/Unicode_to_JIS.cc Mon Oct 22 05:38:25 2001 *************** *** 1,4 **** --- 1,5 ---- /* This file is automatically generated. */ + #pragma GCC java_exceptions unsigned short Unicode_to_JIS[] = { /* branch: 0x0XXX */ 16, /* branch: 0x1XXX */ 0, diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/gen-from-JIS.c gcc-3.1/libjava/gnu/gcj/convert/gen-from-JIS.c *** gcc-3.0.4/libjava/gnu/gcj/convert/gen-from-JIS.c Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/gnu/gcj/convert/gen-from-JIS.c Mon Oct 22 05:38:25 2001 *************** main(int argc, char** argv) *** 106,111 **** --- 106,113 ---- fprintf(out,"/* This file is automatically generated from %s.TXT. */\n", argv[1]); + fprintf(out,"#pragma GCC java_exceptions\n", + argv[1]); fprintf(out, "unsigned short %s_to_Unicode[%d][%d] = {\n", argv[1], max1 - min1 + 1, max2 - min2 + 1); i = 0; diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/convert/natIconv.cc gcc-3.1/libjava/gnu/gcj/convert/natIconv.cc *** gcc-3.0.4/libjava/gnu/gcj/convert/natIconv.cc Wed Nov 1 17:00:01 2000 --- gcc-3.1/libjava/gnu/gcj/convert/natIconv.cc Mon Feb 18 02:52:44 2002 *************** *** 1,6 **** // Input_iconv.java -- Java side of iconv() reader. ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // Input_iconv.java -- Java side of iconv() reader. ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 17,24 **** --- 17,27 ---- #include #include + #include #include + #include + #ifdef HAVE_ICONV #include *************** gnu::gcj::convert::Input_iconv::read (jc *** 84,90 **** size_t r = iconv_adapter (iconv, (iconv_t) handle, &inbuf, &inavail, &outbuf, &outavail); ! // FIXME: what if R==-1? if (iconv_byte_swap) { --- 87,103 ---- size_t r = iconv_adapter (iconv, (iconv_t) handle, &inbuf, &inavail, &outbuf, &outavail); ! ! if (r == (size_t) -1) ! { ! // If we see EINVAL then there is an incomplete sequence at the ! // end of the input buffer. If we see E2BIG then we ran out of ! // space in the output buffer. However, in both these cases ! // some conversion might have taken place. So we fall through ! // to the normal case. ! if (errno != EINVAL && errno != E2BIG) ! throw new java::io::CharConversionException (); ! } if (iconv_byte_swap) { *************** gnu::gcj::convert::Input_iconv::read (jc *** 106,111 **** --- 119,142 ---- } void + gnu::gcj::convert::Input_iconv::done () + { + #ifdef HAVE_ICONV + // 50 bytes should be enough for any reset sequence. + size_t avail = 50; + char tmp[avail]; + char *p = tmp; + // Calling iconv() with a NULL INBUF pointer will cause iconv() to + // switch to its initial state. We don't care about the output that + // might be generated in that situation. + iconv_adapter (iconv, (iconv_t) handle, NULL, NULL, &p, &avail); + BytesToUnicode::done (); + #else /* HAVE_ICONV */ + // If no iconv, do nothing + #endif /* HAVE_ICONV */ + } + + void gnu::gcj::convert::Output_iconv::init (jstring encoding) { #ifdef HAVE_ICONV *************** gnu::gcj::convert::Output_iconv::write ( *** 182,188 **** size_t r = iconv_adapter (iconv, (iconv_t) handle, &inbuf, &inavail, &outbuf, &outavail); ! if (r == -1 && inavail == loop_old_in) { inavail -= 2; if (inavail == 0) --- 213,219 ---- size_t r = iconv_adapter (iconv, (iconv_t) handle, &inbuf, &inavail, &outbuf, &outavail); ! if (r == (size_t) -1 && inavail == loop_old_in) { inavail -= 2; if (inavail == 0) *************** gnu::gcj::convert::IOConverter::iconv_in *** 241,243 **** --- 272,292 ---- #endif /* HAVE_ICONV */ return result; } + + void + gnu::gcj::convert::Output_iconv::done () + { + #ifdef HAVE_ICONV + // 50 bytes should be enough for any reset sequence. + size_t avail = 50; + char tmp[avail]; + char *p = tmp; + // Calling iconv() with a NULL INBUF pointer will cause iconv() to + // switch to its initial state. We don't care about the output that + // might be generated in that situation. + iconv_adapter (iconv, (iconv_t) handle, NULL, NULL, &p, &avail); + UnicodeToBytes::done (); + #else /* HAVE_ICONV */ + // If no iconv, do nothing + #endif /* HAVE_ICONV */ + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/io/natSimpleSHSStream.cc gcc-3.1/libjava/gnu/gcj/io/natSimpleSHSStream.cc *** gcc-3.0.4/libjava/gnu/gcj/io/natSimpleSHSStream.cc Fri May 19 17:55:27 2000 --- gcc-3.1/libjava/gnu/gcj/io/natSimpleSHSStream.cc Thu Feb 7 05:01:29 2002 *************** void *** 37,43 **** gnu::gcj::io::SimpleSHSStream::shsUpdate (jbyteArray shs_info, jbyteArray buf, jint count) { SHS_INFO *info = (SHS_INFO *)elements(shs_info); ! BYTE *buffer = (BYTE *)elements(buf); ::shsUpdate (info, buffer, count); } --- 37,43 ---- gnu::gcj::io::SimpleSHSStream::shsUpdate (jbyteArray shs_info, jbyteArray buf, jint count) { SHS_INFO *info = (SHS_INFO *)elements(shs_info); ! uint8_t *buffer = (uint8_t *)elements(buf); ::shsUpdate (info, buffer, count); } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/io/shs.cc gcc-3.1/libjava/gnu/gcj/io/shs.cc *** gcc-3.0.4/libjava/gnu/gcj/io/shs.cc Sun May 20 16:24:41 2001 --- gcc-3.1/libjava/gnu/gcj/io/shs.cc Thu Feb 7 05:01:29 2002 *************** *** 91,100 **** /* The two buffers of 5 32-bit words */ ! LONG h0, h1, h2, h3, h4; ! LONG A, B, C, D, E; ! local void byteReverse OF((LONG *buffer, int byteCount)); void shsTransform OF((SHS_INFO *shsInfo)); /* Initialize the SHS values */ --- 91,100 ---- /* The two buffers of 5 32-bit words */ ! uint32_t h0, h1, h2, h3, h4; ! uint32_t A, B, C, D, E; ! local void byteReverse OF((uint32_t *buffer, int byteCount)); void shsTransform OF((SHS_INFO *shsInfo)); /* Initialize the SHS values */ *************** void shsInit (SHS_INFO *shsInfo) *** 120,126 **** void shsTransform (SHS_INFO *shsInfo) { ! LONG W [80], temp; int i; /* Step A. Copy the data buffer into the local work buffer */ --- 120,126 ---- void shsTransform (SHS_INFO *shsInfo) { ! uint32_t W [80], temp; int i; /* Step A. Copy the data buffer into the local work buffer */ *************** void shsTransform (SHS_INFO *shsInfo) *** 182,190 **** shsInfo->digest [4] += E; } ! local void byteReverse (LONG *buffer, int byteCount) { ! LONG value; int count; /* --- 182,190 ---- shsInfo->digest [4] += E; } ! local void byteReverse (uint32_t *buffer, int byteCount) { ! uint32_t value; int count; /* *************** local void byteReverse (LONG *buffer, in *** 209,215 **** if ((*(unsigned short *) ("@P") >> 8) == '@') return; ! byteCount /= sizeof (LONG); for (count = 0; count < byteCount; count++) { value = (buffer [count] << 16) | (buffer [count] >> 16); buffer [count] = ((value & 0xFF00FF00L) >> 8) | ((value & 0x00FF00FFL) << 8); --- 209,215 ---- if ((*(unsigned short *) ("@P") >> 8) == '@') return; ! byteCount /= sizeof (uint32_t); for (count = 0; count < byteCount; count++) { value = (buffer [count] << 16) | (buffer [count] >> 16); buffer [count] = ((value & 0xFF00FF00L) >> 8) | ((value & 0x00FF00FFL) << 8); *************** local void byteReverse (LONG *buffer, in *** 223,235 **** * between calls to shsUpdate() */ ! void shsUpdate (SHS_INFO *shsInfo, BYTE *buffer, int count) { /* Update bitcount */ ! if ((shsInfo->countLo + ((LONG) count << 3)) < shsInfo->countLo) shsInfo->countHi++; /* Carry from low to high bitCount */ ! shsInfo->countLo += ((LONG) count << 3); ! shsInfo->countHi += ((LONG) count >> 29); /* Process data in SHS_BLOCKSIZE chunks */ while (count >= SHS_BLOCKSIZE) { --- 223,235 ---- * between calls to shsUpdate() */ ! void shsUpdate (SHS_INFO *shsInfo, uint8_t *buffer, int count) { /* Update bitcount */ ! if ((shsInfo->countLo + ((uint32_t) count << 3)) < shsInfo->countLo) shsInfo->countHi++; /* Carry from low to high bitCount */ ! shsInfo->countLo += ((uint32_t) count << 3); ! shsInfo->countHi += ((uint32_t) count >> 29); /* Process data in SHS_BLOCKSIZE chunks */ while (count >= SHS_BLOCKSIZE) { *************** void shsUpdate (SHS_INFO *shsInfo, BYTE *** 250,256 **** void shsFinal (SHS_INFO *shsInfo) { int count; ! LONG lowBitcount = shsInfo->countLo, highBitcount = shsInfo->countHi; /* Compute number of bytes mod 64 */ count = (int) ((shsInfo->countLo >> 3) & 0x3F); --- 250,256 ---- void shsFinal (SHS_INFO *shsInfo) { int count; ! uint32_t lowBitcount = shsInfo->countLo, highBitcount = shsInfo->countHi; /* Compute number of bytes mod 64 */ count = (int) ((shsInfo->countLo >> 3) & 0x3F); *************** void shsFinal (SHS_INFO *shsInfo) *** 259,270 **** * Set the first char of padding to 0x80. * This is safe since there is always at least one byte free */ ! ((BYTE *) shsInfo->data) [count++] = 0x80; /* Pad out to 56 mod 64 */ if (count > 56) { /* Two lots of padding: Pad the first block to 64 bytes */ ! memset ((BYTE *) shsInfo->data + count, 0, 64 - count); byteReverse (shsInfo->data, SHS_BLOCKSIZE); shsTransform (shsInfo); --- 259,270 ---- * Set the first char of padding to 0x80. * This is safe since there is always at least one byte free */ ! ((uint8_t *) shsInfo->data) [count++] = 0x80; /* Pad out to 56 mod 64 */ if (count > 56) { /* Two lots of padding: Pad the first block to 64 bytes */ ! memset ((uint8_t *) shsInfo->data + count, 0, 64 - count); byteReverse (shsInfo->data, SHS_BLOCKSIZE); shsTransform (shsInfo); *************** void shsFinal (SHS_INFO *shsInfo) *** 272,278 **** memset (shsInfo->data, 0, 56); } else /* Pad block to 56 bytes */ ! memset ((BYTE *) shsInfo->data + count, 0, 56 - count); byteReverse (shsInfo->data, SHS_BLOCKSIZE); /* Append length in bits and transform */ --- 272,278 ---- memset (shsInfo->data, 0, 56); } else /* Pad block to 56 bytes */ ! memset ((uint8_t *) shsInfo->data + count, 0, 56 - count); byteReverse (shsInfo->data, SHS_BLOCKSIZE); /* Append length in bits and transform */ diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/io/shs.h gcc-3.1/libjava/gnu/gcj/io/shs.h *** gcc-3.0.4/libjava/gnu/gcj/io/shs.h Fri May 19 17:55:27 2000 --- gcc-3.1/libjava/gnu/gcj/io/shs.h Fri Mar 15 21:56:03 2002 *************** *** 14,21 **** #ifndef SHS_H #define SHS_H ! typedef unsigned char BYTE; ! typedef unsigned int LONG; /* A 32-bit type */ /* The SHS block size and message digest sizes, in bytes */ --- 14,35 ---- #ifndef SHS_H #define SHS_H ! #include ! #if HAVE_INTTYPES_H ! # include ! #else ! # if HAVE_STDINT_H ! # include ! # else ! typedef unsigned int uint8_t __attribute__((mode(QI))); ! /* This is a blatant hack: on Solaris 2.5, pthread.h defines uint32_t ! in pthread.h, which we sometimes include. We protect our ! definition the same way Solaris 2.5 does, to avoid redefining it. */ ! # ifndef _UINT32_T ! typedef unsigned int uint32_t __attribute__((mode(SI))); ! # endif ! # endif ! #endif /* The SHS block size and message digest sizes, in bytes */ *************** typedef unsigned int LONG; /* A 32-bit t *** 25,33 **** /* The structure for storing SHS info */ typedef struct { ! LONG digest [5]; /* Message digest */ ! LONG countLo, countHi; /* 64-bit bit count */ ! LONG data [16]; /* SHS data buffer */ } SHS_INFO; /* Turn off prototypes if requested */ --- 39,47 ---- /* The structure for storing SHS info */ typedef struct { ! uint32_t digest [5]; /* Message digest */ ! uint32_t countLo, countHi; /* 64-bit bit count */ ! uint32_t data [16]; /* SHS data buffer */ } SHS_INFO; /* Turn off prototypes if requested */ *************** typedef struct { *** 45,51 **** #define local static void shsInit OF((SHS_INFO *shsInfo)); ! void shsUpdate OF((SHS_INFO *shsInfo, BYTE *buffer, int count)); void shsFinal OF((SHS_INFO *shsInfo)); #endif --- 59,65 ---- #define local static void shsInit OF((SHS_INFO *shsInfo)); ! void shsUpdate OF((SHS_INFO *shsInfo, uint8_t *buffer, int count)); void shsFinal OF((SHS_INFO *shsInfo)); #endif diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/jni/NativeThread.java gcc-3.1/libjava/gnu/gcj/jni/NativeThread.java *** gcc-3.0.4/libjava/gnu/gcj/jni/NativeThread.java Thu Aug 24 02:16:57 2000 --- gcc-3.1/libjava/gnu/gcj/jni/NativeThread.java Thu Jan 1 00:00:00 1970 *************** *** 1,29 **** - // NativeThread.java - Wrapper for attached user threads. - - /* Copyright (C) 1998, 1999, 2000 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.jni; - - /** - * @author Tom Tromey - * @date February 9, 2000 - */ - - public class NativeThread extends Thread - { - public NativeThread (ThreadGroup g, String name) - { - super (g, null, name); - init (); - } - - // Call this to mark the thread as finished. - public native void finish (); - public native void init (); - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/jni/natNativeThread.cc gcc-3.1/libjava/gnu/gcj/jni/natNativeThread.cc *** gcc-3.0.4/libjava/gnu/gcj/jni/natNativeThread.cc Thu Aug 24 02:16:57 2000 --- gcc-3.1/libjava/gnu/gcj/jni/natNativeThread.cc Thu Jan 1 00:00:00 1970 *************** *** 1,30 **** - // natNativeThread.cc - Native side of attached threads. - - /* Copyright (C) 1998, 1999, 2000 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - // Written by Tom Tromey - - #include - - #include - #include - #include - #include - - void - gnu::gcj::jni::NativeThread::finish () - { - finish_ (); - } - - void - gnu::gcj::jni::NativeThread::init () - { - alive_flag = true; // alive_flag is private in java.lang.Thread - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/math/MPN.java gcc-3.1/libjava/gnu/gcj/math/MPN.java *** gcc-3.0.4/libjava/gnu/gcj/math/MPN.java Sat Mar 3 07:27:59 2001 --- gcc-3.1/libjava/gnu/gcj/math/MPN.java Thu Jan 1 00:00:00 1970 *************** *** 1,739 **** - /* Copyright (C) 1999, 2000, 2001 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - // Included from Kawa 1.6.62 with permission of the author, - // Per Bothner . - - package gnu.gcj.math; - - /** This contains various low-level routines for unsigned bigints. - * The interfaces match the mpn interfaces in gmp, - * so it should be easy to replace them with fast native functions - * that are trivial wrappers around the mpn_ functions in gmp - * (at least on platforms that use 32-bit "limbs"). - */ - - public class MPN - { - /** Add x[0:size-1] and y, and write the size least - * significant words of the result to dest. - * Return carry, either 0 or 1. - * All values are unsigned. - * This is basically the same as gmp's mpn_add_1. */ - public static int add_1 (int[] dest, int[] x, int size, int y) - { - long carry = (long) y & 0xffffffffL; - for (int i = 0; i < size; i++) - { - carry += ((long) x[i] & 0xffffffffL); - dest[i] = (int) carry; - carry >>= 32; - } - return (int) carry; - } - - /** Add x[0:len-1] and y[0:len-1] and write the len least - * significant words of the result to dest[0:len-1]. - * All words are treated as unsigned. - * @return the carry, either 0 or 1 - * This function is basically the same as gmp's mpn_add_n. - */ - public static int add_n (int dest[], int[] x, int[] y, int len) - { - long carry = 0; - for (int i = 0; i < len; i++) - { - carry += ((long) x[i] & 0xffffffffL) - + ((long) y[i] & 0xffffffffL); - dest[i] = (int) carry; - carry >>>= 32; - } - return (int) carry; - } - - /** Subtract Y[0:size-1] from X[0:size-1], and write - * the size least significant words of the result to dest[0:size-1]. - * Return borrow, either 0 or 1. - * This is basically the same as gmp's mpn_sub_n function. - */ - - public static int sub_n (int[] dest, int[] X, int[] Y, int size) - { - int cy = 0; - for (int i = 0; i < size; i++) - { - int y = Y[i]; - int x = X[i]; - y += cy; /* add previous carry to subtrahend */ - // Invert the high-order bit, because: (unsigned) X > (unsigned) Y - // iff: (int) (X^0x80000000) > (int) (Y^0x80000000). - cy = (y^0x80000000) < (cy^0x80000000) ? 1 : 0; - y = x - y; - cy += (y^0x80000000) > (x ^ 0x80000000) ? 1 : 0; - dest[i] = y; - } - return cy; - } - - /** Multiply x[0:len-1] by y, and write the len least - * significant words of the product to dest[0:len-1]. - * Return the most significant word of the product. - * All values are treated as if they were unsigned - * (i.e. masked with 0xffffffffL). - * OK if dest==x (not sure if this is guaranteed for mpn_mul_1). - * This function is basically the same as gmp's mpn_mul_1. - */ - - public static int mul_1 (int[] dest, int[] x, int len, int y) - { - long yword = (long) y & 0xffffffffL; - long carry = 0; - for (int j = 0; j < len; j++) - { - carry += ((long) x[j] & 0xffffffffL) * yword; - dest[j] = (int) carry; - carry >>>= 32; - } - return (int) carry; - } - - /** - * Multiply x[0:xlen-1] and y[0:ylen-1], and - * write the result to dest[0:xlen+ylen-1]. - * The destination has to have space for xlen+ylen words, - * even if the result might be one limb smaller. - * This function requires that xlen >= ylen. - * The destination must be distinct from either input operands. - * All operands are unsigned. - * This function is basically the same gmp's mpn_mul. */ - - public static void mul (int[] dest, - int[] x, int xlen, - int[] y, int ylen) - { - dest[xlen] = MPN.mul_1 (dest, x, xlen, y[0]); - - for (int i = 1; i < ylen; i++) - { - long yword = (long) y[i] & 0xffffffffL; - long carry = 0; - for (int j = 0; j < xlen; j++) - { - carry += ((long) x[j] & 0xffffffffL) * yword - + ((long) dest[i+j] & 0xffffffffL); - dest[i+j] = (int) carry; - carry >>>= 32; - } - dest[i+xlen] = (int) carry; - } - } - - /* Divide (unsigned long) N by (unsigned int) D. - * Returns (remainder << 32)+(unsigned int)(quotient). - * Assumes (unsigned int)(N>>32) < (unsigned int)D. - * Code transcribed from gmp-2.0's mpn_udiv_w_sdiv function. - */ - public static long udiv_qrnnd (long N, int D) - { - long q, r; - long a1 = N >>> 32; - long a0 = N & 0xffffffffL; - if (D >= 0) - { - if (a1 < ((D - a1 - (a0 >>> 31)) & 0xffffffffL)) - { - /* dividend, divisor, and quotient are nonnegative */ - q = N / D; - r = N % D; - } - else - { - /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */ - long c = N - ((long) D << 31); - /* Divide (c1*2^32 + c0) by d */ - q = c / D; - r = c % D; - /* Add 2^31 to quotient */ - q += 1 << 31; - } - } - else - { - long b1 = D >>> 1; /* d/2, between 2^30 and 2^31 - 1 */ - //long c1 = (a1 >> 1); /* A/2 */ - //int c0 = (a1 << 31) + (a0 >> 1); - long c = N >>> 1; - if (a1 < b1 || (a1 >> 1) < b1) - { - if (a1 < b1) - { - q = c / b1; - r = c % b1; - } - else /* c1 < b1, so 2^31 <= (A/2)/b1 < 2^32 */ - { - c = ~(c - (b1 << 32)); - q = c / b1; /* (A/2) / (d/2) */ - r = c % b1; - q = (~q) & 0xffffffffL; /* (A/2)/b1 */ - r = (b1 - 1) - r; /* r < b1 => new r >= 0 */ - } - r = 2 * r + (a0 & 1); - if ((D & 1) != 0) - { - if (r >= q) { - r = r - q; - } else if (q - r <= ((long) D & 0xffffffffL)) { - r = r - q + D; - q -= 1; - } else { - r = r - q + D + D; - q -= 2; - } - } - } - else /* Implies c1 = b1 */ - { /* Hence a1 = d - 1 = 2*b1 - 1 */ - if (a0 >= ((long)(-D) & 0xffffffffL)) - { - q = -1; - r = a0 + D; - } - else - { - q = -2; - r = a0 + D + D; - } - } - } - - return (r << 32) | (q & 0xFFFFFFFFl); - } - - /** Divide divident[0:len-1] by (unsigned int)divisor. - * Write result into quotient[0:len-1. - * Return the one-word (unsigned) remainder. - * OK for quotient==dividend. - */ - - public static int divmod_1 (int[] quotient, int[] dividend, - int len, int divisor) - { - int i = len - 1; - long r = dividend[i]; - if ((r & 0xffffffffL) >= ((long)divisor & 0xffffffffL)) - r = 0; - else - { - quotient[i--] = 0; - r <<= 32; - } - - for (; i >= 0; i--) - { - int n0 = dividend[i]; - r = (r & ~0xffffffffL) | (n0 & 0xffffffffL); - r = udiv_qrnnd (r, divisor); - quotient[i] = (int) r; - } - return (int)(r >> 32); - } - - /* Subtract x[0:len-1]*y from dest[offset:offset+len-1]. - * All values are treated as if unsigned. - * @return the most significant word of - * the product, minus borrow-out from the subtraction. - */ - public static int submul_1 (int[] dest, int offset, int[] x, int len, int y) - { - long yl = (long) y & 0xffffffffL; - int carry = 0; - int j = 0; - do - { - long prod = ((long) x[j] & 0xffffffffL) * yl; - int prod_low = (int) prod; - int prod_high = (int) (prod >> 32); - prod_low += carry; - // Invert the high-order bit, because: (unsigned) X > (unsigned) Y - // iff: (int) (X^0x80000000) > (int) (Y^0x80000000). - carry = ((prod_low ^ 0x80000000) < (carry ^ 0x80000000) ? 1 : 0) - + prod_high; - int x_j = dest[offset+j]; - prod_low = x_j - prod_low; - if ((prod_low ^ 0x80000000) > (x_j ^ 0x80000000)) - carry++; - dest[offset+j] = prod_low; - } - while (++j < len); - return carry; - } - - /** Divide zds[0:nx] by y[0:ny-1]. - * The remainder ends up in zds[0:ny-1]. - * The quotient ends up in zds[ny:nx]. - * Assumes: nx>ny. - * (int)y[ny-1] < 0 (i.e. most significant bit set) - */ - - public static void divide (int[] zds, int nx, int[] y, int ny) - { - // This is basically Knuth's formulation of the classical algorithm, - // but translated from in scm_divbigbig in Jaffar's SCM implementation. - - // Correspondance with Knuth's notation: - // Knuth's u[0:m+n] == zds[nx:0]. - // Knuth's v[1:n] == y[ny-1:0] - // Knuth's n == ny. - // Knuth's m == nx-ny. - // Our nx == Knuth's m+n. - - // Could be re-implemented using gmp's mpn_divrem: - // zds[nx] = mpn_divrem (&zds[ny], 0, zds, nx, y, ny). - - int j = nx; - do - { // loop over digits of quotient - // Knuth's j == our nx-j. - // Knuth's u[j:j+n] == our zds[j:j-ny]. - int qhat; // treated as unsigned - if (zds[j]==y[ny-1]) - qhat = -1; // 0xffffffff - else - { - long w = (((long)(zds[j])) << 32) + ((long)zds[j-1] & 0xffffffffL); - qhat = (int) udiv_qrnnd (w, y[ny-1]); - } - if (qhat != 0) - { - int borrow = submul_1 (zds, j - ny, y, ny, qhat); - int save = zds[j]; - long num = ((long)save&0xffffffffL) - ((long)borrow&0xffffffffL); - while (num != 0) - { - qhat--; - long carry = 0; - for (int i = 0; i < ny; i++) - { - carry += ((long) zds[j-ny+i] & 0xffffffffL) - + ((long) y[i] & 0xffffffffL); - zds[j-ny+i] = (int) carry; - carry >>>= 32; - } - zds[j] += carry; - num = carry - 1; - } - } - zds[j] = qhat; - } while (--j >= ny); - } - - /** Number of digits in the conversion base that always fits in a word. - * For example, for base 10 this is 9, since 10**9 is the - * largest number that fits into a words (assuming 32-bit words). - * This is the same as gmp's __mp_bases[radix].chars_per_limb. - * @param radix the base - * @return number of digits */ - public static int chars_per_word (int radix) - { - if (radix < 10) - { - if (radix < 8) - { - if (radix <= 2) - return 32; - else if (radix == 3) - return 20; - else if (radix == 4) - return 16; - else - return 18 - radix; - } - else - return 10; - } - else if (radix < 12) - return 9; - else if (radix <= 16) - return 8; - else if (radix <= 23) - return 7; - else if (radix <= 40) - return 6; - // The following are conservative, but we don't care. - else if (radix <= 256) - return 4; - else - return 1; - } - - /** Count the number of leading zero bits in an int. */ - public static int count_leading_zeros (int i) - { - if (i == 0) - return 32; - int count = 0; - for (int k = 16; k > 0; k = k >> 1) { - int j = i >>> k; - if (j == 0) - count += k; - else - i = j; - } - return count; - } - - public static int set_str (int dest[], byte[] str, int str_len, int base) - { - int size = 0; - if ((base & (base - 1)) == 0) - { - // The base is a power of 2. Read the input string from - // least to most significant character/digit. */ - - int next_bitpos = 0; - int bits_per_indigit = 0; - for (int i = base; (i >>= 1) != 0; ) bits_per_indigit++; - int res_digit = 0; - - for (int i = str_len; --i >= 0; ) - { - int inp_digit = str[i]; - res_digit |= inp_digit << next_bitpos; - next_bitpos += bits_per_indigit; - if (next_bitpos >= 32) - { - dest[size++] = res_digit; - next_bitpos -= 32; - res_digit = inp_digit >> (bits_per_indigit - next_bitpos); - } - } - - if (res_digit != 0) - dest[size++] = res_digit; - } - else - { - // General case. The base is not a power of 2. - int indigits_per_limb = MPN.chars_per_word (base); - int str_pos = 0; - - while (str_pos < str_len) - { - int chunk = str_len - str_pos; - if (chunk > indigits_per_limb) - chunk = indigits_per_limb; - int res_digit = str[str_pos++]; - int big_base = base; - - while (--chunk > 0) - { - res_digit = res_digit * base + str[str_pos++]; - big_base *= base; - } - - int cy_limb; - if (size == 0) - cy_limb = res_digit; - else - { - cy_limb = MPN.mul_1 (dest, dest, size, big_base); - cy_limb += MPN.add_1 (dest, dest, size, res_digit); - } - if (cy_limb != 0) - dest[size++] = cy_limb; - } - } - return size; - } - - /** Compare x[0:size-1] with y[0:size-1], treating them as unsigned integers. - * @result -1, 0, or 1 depending on if xy. - * This is basically the same as gmp's mpn_cmp function. - */ - public static int cmp (int[] x, int[] y, int size) - { - while (--size >= 0) - { - int x_word = x[size]; - int y_word = y[size]; - if (x_word != y_word) - { - // Invert the high-order bit, because: - // (unsigned) X > (unsigned) Y iff - // (int) (X^0x80000000) > (int) (Y^0x80000000). - return (x_word ^ 0x80000000) > (y_word ^0x80000000) ? 1 : -1; - } - } - return 0; - } - - /** Compare x[0:xlen-1] with y[0:ylen-1], treating them as unsigned integers. - * @result -1, 0, or 1 depending on if xy. - */ - public static int cmp (int[] x, int xlen, int[] y, int ylen) - { - return xlen > ylen ? 1 : xlen < ylen ? -1 : cmp (x, y, xlen); - } - - /* Shift x[x_start:x_start+len-1] count bits to the "right" - * (i.e. divide by 2**count). - * Store the len least significant words of the result at dest. - * The bits shifted out to the right are returned. - * OK if dest==x. - * Assumes: 0 < count < 32 - */ - - public static int rshift (int[] dest, int[] x, int x_start, - int len, int count) - { - int count_2 = 32 - count; - int low_word = x[x_start]; - int retval = low_word << count_2; - int i = 1; - for (; i < len; i++) - { - int high_word = x[x_start+i]; - dest[i-1] = (low_word >>> count) | (high_word << count_2); - low_word = high_word; - } - dest[i-1] = low_word >>> count; - return retval; - } - - /* Shift x[x_start:x_start+len-1] count bits to the "right" - * (i.e. divide by 2**count). - * Store the len least significant words of the result at dest. - * OK if dest==x. - * Assumes: 0 <= count < 32 - * Same as rshift, but handles count==0 (and has no return value). - */ - public static void rshift0 (int[] dest, int[] x, int x_start, - int len, int count) - { - if (count > 0) - rshift(dest, x, x_start, len, count); - else - for (int i = 0; i < len; i++) - dest[i] = x[i + x_start]; - } - - /** Return the long-truncated value of right shifting. - * @param x a two's-complement "bignum" - * @param len the number of significant words in x - * @param count the shift count - * @return (long)(x[0..len-1] >> count). - */ - public static long rshift_long (int[] x, int len, int count) - { - int wordno = count >> 5; - count &= 31; - int sign = x[len-1] < 0 ? -1 : 0; - int w0 = wordno >= len ? sign : x[wordno]; - wordno++; - int w1 = wordno >= len ? sign : x[wordno]; - if (count != 0) - { - wordno++; - int w2 = wordno >= len ? sign : x[wordno]; - w0 = (w0 >>> count) | (w1 << (32-count)); - w1 = (w1 >>> count) | (w2 << (32-count)); - } - return ((long)w1 << 32) | ((long)w0 & 0xffffffffL); - } - - /* Shift x[0:len-1] left by count bits, and store the len least - * significant words of the result in dest[d_offset:d_offset+len-1]. - * Return the bits shifted out from the most significant digit. - * Assumes 0 < count < 32. - * OK if dest==x. - */ - - public static int lshift (int[] dest, int d_offset, - int[] x, int len, int count) - { - int count_2 = 32 - count; - int i = len - 1; - int high_word = x[i]; - int retval = high_word >>> count_2; - d_offset++; - while (--i >= 0) - { - int low_word = x[i]; - dest[d_offset+i] = (high_word << count) | (low_word >>> count_2); - high_word = low_word; - } - dest[d_offset+i] = high_word << count; - return retval; - } - - /** Return least i such that word&(1<>= 4; - i += 4; - } - if ((word & 3) == 0) - { - word >>= 2; - i += 2; - } - if ((word & 1) == 0) - i += 1; - return i; - } - - /** Return least i such that words & (1< 0) - { - int j; - for (j = 0; j < len-i; j++) - other_arg[j] = other_arg[j+i]; - for ( ; j < len; j++) - other_arg[j] = 0; - } - i = findLowestBit(other_arg[0]); - if (i > 0) - MPN.rshift (other_arg, other_arg, 0, len, i); - - // Now both odd_arg and other_arg are odd. - - // Subtract the smaller from the larger. - // This does not change the result, since gcd(a-b,b)==gcd(a,b). - i = MPN.cmp(odd_arg, other_arg, len); - if (i == 0) - break; - if (i > 0) - { // odd_arg > other_arg - MPN.sub_n (odd_arg, odd_arg, other_arg, len); - // Now odd_arg is even, so swap with other_arg; - int[] tmp = odd_arg; odd_arg = other_arg; other_arg = tmp; - } - else - { // other_arg > odd_arg - MPN.sub_n (other_arg, other_arg, odd_arg, len); - } - while (odd_arg[len-1] == 0 && other_arg[len-1] == 0) - len--; - } - if (initShiftWords + initShiftBits > 0) - { - if (initShiftBits > 0) - { - int sh_out = MPN.lshift (x, initShiftWords, x, len, initShiftBits); - if (sh_out != 0) - x[(len++)+initShiftWords] = sh_out; - } - else - { - for (i = len; --i >= 0;) - x[i+initShiftWords] = x[i]; - } - for (i = initShiftWords; --i >= 0; ) - x[i] = 0; - len += initShiftWords; - } - return len; - } - - public static int intLength (int i) - { - return 32 - count_leading_zeros (i < 0 ? ~i : i); - } - - /** Calcaulte the Common Lisp "integer-length" function. - * Assumes input is canonicalized: len==BigInteger.wordsNeeded(words,len) */ - public static int intLength (int[] words, int len) - { - len--; - return intLength (words[len]) + 32 * len; - } - - /* DEBUGGING: - public static void dprint (BigInteger x) - { - if (x.words == null) - System.err.print(Long.toString((long) x.ival & 0xffffffffL, 16)); - else - dprint (System.err, x.words, x.ival); - } - public static void dprint (int[] x) { dprint (System.err, x, x.length); } - public static void dprint (int[] x, int len) { dprint (System.err, x, len); } - public static void dprint (java.io.PrintStream ps, int[] x, int len) - { - ps.print('('); - for (int i = 0; i < len; i++) - { - if (i > 0) - ps.print (' '); - ps.print ("#x" + Long.toString ((long) x[i] & 0xffffffffL, 16)); - } - ps.print(')'); - } - */ - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/natCore.cc gcc-3.1/libjava/gnu/gcj/natCore.cc *** gcc-3.0.4/libjava/gnu/gcj/natCore.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/natCore.cc Wed Apr 24 23:02:56 2002 *************** *** 0 **** --- 1,90 ---- + // natCore -- C++ side of Core + + /* Copyright (C) 2001, 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + /* Author: Anthony Green . */ + + #include + + #include + #include + #include + #include + + #include + #include + #include + + typedef struct core_chain_struct + { + int name_length; + const char *name; + int data_length; + const void *data; + + struct core_chain_struct *next; + } core_chain; + + static core_chain *root; + + void _Jv_RegisterResource (void *vptr) + { + char *rptr = (char *)vptr; + + // These are permanent data structures for now. This routine is + // called from a static constructor, so we shouldn't depend on too + // much existing infrastructure. + core_chain *cc = (core_chain *) _Jv_Malloc (sizeof (core_chain)); + + cc->name_length = ((int *)rptr)[0]; + cc->data_length = ((int *)rptr)[1]; + cc->name = rptr + 2*sizeof(int); + cc->data = cc->name + cc->name_length; + + // Add this new item to the chain... + core_chain *old_root = root; + cc->next = old_root; + root = cc; + } + + gnu::gcj::Core * + gnu::gcj::Core::create (jstring name) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (name) + 1); + jsize total = JvGetStringUTFRegion (name, 0, name->length(), buf); + buf[total] = '\0'; + + // Usually requests here end up as an absolute URL. We strip the + // initial `/'. + if (buf[0] == '/') + { + ++buf; + --total; + } + + core_chain *node = root; + + while (node) + { + if (total == node->name_length + && strncmp (buf, node->name, total) == 0) + { + gnu::gcj::Core *core = + (gnu::gcj::Core *) _Jv_AllocObject(&gnu::gcj::Core::class$, + sizeof (gnu::gcj::Core)); + core->ptr = (gnu::gcj::RawData *) node->data; + core->length = node->data_length; + return core; + } + else + node = node->next; + } + + throw new java::io::IOException (JvNewStringLatin1 ("can't open core")); + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/protocol/core/Connection.java gcc-3.1/libjava/gnu/gcj/protocol/core/Connection.java *** gcc-3.0.4/libjava/gnu/gcj/protocol/core/Connection.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/protocol/core/Connection.java Thu Sep 6 22:32:54 2001 *************** *** 0 **** --- 1,154 ---- + // Connection.java - Implementation of URLConnection for core protocol. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package gnu.gcj.protocol.core; + + import gnu.gcj.Core; + import java.net.*; + import java.io.*; + import java.util.Vector; + import java.util.Hashtable; + import java.util.Enumeration; + + /** + * @author Anthony Green + * @date August 13, 2001 + */ + + class Connection extends URLConnection + { + private Hashtable hdrHash = new Hashtable(); + private Vector hdrVec = new Vector(); + private boolean gotHeaders = false; + + private Core core; + + public Connection(URL url) + { + super(url); + } + + // Implementation of abstract method. + public void connect() throws IOException + { + // Call is ignored if already connected. + if (connected) + return; + + // If not connected, then file needs to be opened. + core = Core.create (url.getFile()); + connected = true; + } + + public InputStream getInputStream() throws IOException + { + if (!connected) + connect(); + + if (! doInput) + throw new ProtocolException("Can't open InputStream if doInput is false"); + return new BufferedInputStream(new CoreInputStream (core)); + } + + // Override default method in URLConnection. + public String getHeaderField(String name) + { + try + { + getHeaders(); + } + catch (IOException x) + { + return null; + } + return (String) hdrHash.get(name.toLowerCase()); + } + + // Override default method in URLConnection. + public String getHeaderField(int n) + { + try + { + getHeaders(); + } + catch (IOException x) + { + return null; + } + if (n < hdrVec.size()) + return getField((String) hdrVec.elementAt(n)); + + return null; + } + + // Override default method in URLConnection. + public String getHeaderFieldKey(int n) + { + try + { + getHeaders(); + } + catch (IOException x) + { + return null; + } + if (n < hdrVec.size()) + return getKey((String) hdrVec.elementAt(n)); + + return null; + } + + private String getKey(String str) + { + if (str == null) + return null; + int index = str.indexOf(':'); + if (index >= 0) + return str.substring(0, index); + else + return null; + } + + private String getField(String str) + { + if (str == null) + return null; + int index = str.indexOf(':'); + if (index >= 0) + return str.substring(index + 1).trim(); + else + return str; + } + + private void getHeaders() throws IOException + { + if (gotHeaders) + return; + gotHeaders = true; + + connect(); + + // Yes, it is overkill to use the hash table and vector here since + // we're only putting one header in the file, but in case we need + // to add others later and for consistency, we'll implement it this way. + + // Add the only header we know about right now: Content-length. + long len = core.length; + String line = "Content-length: " + len; + hdrVec.addElement(line); + + // The key will never be null in this scenario since we build up the + // headers ourselves. If we ever rely on getting a header from somewhere + // else, then we may have to check if the result of getKey() is null. + String key = getKey(line); + hdrHash.put(key.toLowerCase(), Long.toString(len)); + } + } + diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/protocol/core/CoreInputStream.java gcc-3.1/libjava/gnu/gcj/protocol/core/CoreInputStream.java *** gcc-3.0.4/libjava/gnu/gcj/protocol/core/CoreInputStream.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/protocol/core/CoreInputStream.java Thu Sep 6 22:32:54 2001 *************** *** 0 **** --- 1,89 ---- + // Handler.java - URLStreamHandler for core protocol. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package gnu.gcj.protocol.core; + + import java.io.*; + import gnu.gcj.Core; + import gnu.gcj.RawData; + + public class CoreInputStream extends InputStream + { + /* A pointer to the object in memory. */ + protected RawData ptr; + + /* Position of the next byte in core to be read. */ + protected int pos; + + /* The currently marked position in the stream. */ + protected int mark; + + /* The index in core one greater than the last valid character. */ + protected int count; + + private native int unsafeGetByte (long offset); + private native int copyIntoByteArray (byte[] dest, int offset, int numBytes); + + public CoreInputStream (Core core) + { + ptr = core.ptr; + count = core.length; + } + + public synchronized int available() + { + return count - pos; + } + + public synchronized void mark(int readAheadLimit) + { + // readAheadLimit is ignored per Java Class Lib. book, p.220. + mark = pos; + } + + public boolean markSupported() + { + return true; + } + + public synchronized int read() + { + if (pos < count) + return ((int) unsafeGetByte(pos++)) & 0xFF; + return -1; + } + + public synchronized int read(byte[] b, int off, int len) + { + if (pos >= count) + return -1; + + int numBytes = Math.min(count - pos, len); + copyIntoByteArray (b, off, numBytes); + pos += numBytes; + return numBytes; + } + + public synchronized void reset() + { + pos = mark; + } + + public synchronized long skip(long n) + { + // Even though the var numBytes is a long, in reality it can never + // be larger than an int since the result of subtracting 2 positive + // ints will always fit in an int. Since we have to return a long + // anyway, numBytes might as well just be a long. + long numBytes = Math.min((long) (count - pos), n < 0 ? 0L : n); + pos += numBytes; + return numBytes; + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/protocol/core/Handler.java gcc-3.1/libjava/gnu/gcj/protocol/core/Handler.java *** gcc-3.0.4/libjava/gnu/gcj/protocol/core/Handler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/protocol/core/Handler.java Thu Sep 6 22:32:54 2001 *************** *** 0 **** --- 1,29 ---- + // Handler.java - URLStreamHandler for core protocol. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package gnu.gcj.protocol.core; + + import java.net.URL; + import java.net.URLConnection; + import java.net.URLStreamHandler; + import java.io.IOException; + + /** + * @author Anthony Green + * @date August 13, 2001. + */ + + public class Handler extends URLStreamHandler + { + protected URLConnection openConnection(URL url) throws IOException + { + return new Connection(url); + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/protocol/core/natCoreInputStream.cc gcc-3.1/libjava/gnu/gcj/protocol/core/natCoreInputStream.cc *** gcc-3.0.4/libjava/gnu/gcj/protocol/core/natCoreInputStream.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/protocol/core/natCoreInputStream.cc Thu Sep 6 22:32:54 2001 *************** *** 0 **** --- 1,49 ---- + // natCoreInputStream.cc -- C++ side of CoreInputStream + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + /* Author: Anthony Green . */ + + #include + + #include + #include + #include + + #include + #include + #include + + jint + gnu::gcj::protocol::core::CoreInputStream::unsafeGetByte (jlong offset) + { + return ((char *)ptr)[offset]; + } + + jint + gnu::gcj::protocol::core::CoreInputStream::copyIntoByteArray (jbyteArray dest, + jint offset, + jint numBytes) + { + if (! dest) + throw new java::lang::NullPointerException; + jsize destSize = JvGetArrayLength (dest); + if (offset < 0 || numBytes < 0 || offset + numBytes < 0 + || offset + numBytes > destSize + || pos + numBytes > count) + throw new java::lang::ArrayIndexOutOfBoundsException; + + void *pcore = (void *) &((char*)ptr)[pos]; + void *pdest = (void *) (elements (dest) + offset); + + memcpy (pdest, pcore, numBytes); + + return 0; + } + diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/protocol/file/Connection.java gcc-3.1/libjava/gnu/gcj/protocol/file/Connection.java *** gcc-3.0.4/libjava/gnu/gcj/protocol/file/Connection.java Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/gnu/gcj/protocol/file/Connection.java Fri Feb 22 13:53:22 2002 *************** class Connection extends URLConnection *** 33,38 **** --- 33,40 ---- private Vector hdrVec = new Vector(); private boolean gotHeaders = false; private File fileIn; + private InputStream inputStream; + private OutputStream outputStream; public Connection(URL url) { *************** class Connection extends URLConnection *** 47,76 **** return; // If not connected, then file needs to be openned. ! fileIn = new File(url.getFile()); connected = true; } public InputStream getInputStream() throws IOException { if (!connected) connect(); ! if (! doInput) ! throw new ProtocolException("Can't open InputStream if doInput is false"); ! return new BufferedInputStream(new FileInputStream(fileIn)); } // Override default method in URLConnection. public OutputStream getOutputStream() throws IOException { - if (!connected) - connect(); - if (! doOutput) throw new ProtocolException("Can't open OutputStream if doOutput is false"); ! return new BufferedOutputStream(new FileOutputStream(fileIn)); } // Override default method in URLConnection. --- 49,84 ---- return; // If not connected, then file needs to be openned. ! String fname = url.getFile(); ! fileIn = new File(fname); ! if (doInput) ! inputStream = new BufferedInputStream(new FileInputStream(fileIn)); ! if (doOutput) ! outputStream = new BufferedOutputStream(new FileOutputStream(fileIn)); connected = true; } public InputStream getInputStream() throws IOException { + if (! doInput) + throw new ProtocolException("Can't open InputStream if doInput is false"); if (!connected) connect(); ! return inputStream; } // Override default method in URLConnection. public OutputStream getOutputStream() throws IOException { if (! doOutput) throw new ProtocolException("Can't open OutputStream if doOutput is false"); ! ! if (!connected) ! connect(); ! ! return outputStream; } // Override default method in URLConnection. diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/protocol/file/Handler.java gcc-3.1/libjava/gnu/gcj/protocol/file/Handler.java *** gcc-3.0.4/libjava/gnu/gcj/protocol/file/Handler.java Fri Apr 21 14:18:49 2000 --- gcc-3.1/libjava/gnu/gcj/protocol/file/Handler.java Sun Sep 30 07:52:16 2001 *************** public class Handler extends URLStreamHa *** 32,39 **** { // If a hostname is set, then we need to switch protocols to ftp // in order to transfer this from the remote host. ! if (! url.getHost().equals("")) { // Reset the protocol (and implicitly the handler) for this URL. // Then have the URL attempt the connection again, as it will // get the changed handler the next time around. --- 32,42 ---- { // If a hostname is set, then we need to switch protocols to ftp // in order to transfer this from the remote host. ! String host = url.getHost(); ! if ((host != null) && (! host.equals(""))) { + throw new IOException("ftp protocol handler not yet implemented."); + /* // Reset the protocol (and implicitly the handler) for this URL. // Then have the URL attempt the connection again, as it will // get the changed handler the next time around. *************** public class Handler extends URLStreamHa *** 42,47 **** --- 45,51 ---- // Until the ftp protocol handler is written, this will cause // a NullPointerException. return url.openConnection(); + */ } return new Connection(url); diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/protocol/http/Connection.java gcc-3.1/libjava/gnu/gcj/protocol/http/Connection.java *** gcc-3.0.4/libjava/gnu/gcj/protocol/http/Connection.java Thu Aug 10 09:10:25 2000 --- gcc-3.1/libjava/gnu/gcj/protocol/http/Connection.java Mon Apr 15 03:16:02 2002 *************** class Connection extends HttpURLConnecti *** 125,131 **** // TODO: public boolean usingProxy() public boolean usingProxy() { ! throw new InternalError("HttpURLConnection.usingProxy not implemented"); } // Override default method in URLConnection. --- 125,131 ---- // TODO: public boolean usingProxy() public boolean usingProxy() { ! return false; } // Override default method in URLConnection. diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/FinalizerThread.java gcc-3.1/libjava/gnu/gcj/runtime/FinalizerThread.java *** gcc-3.0.4/libjava/gnu/gcj/runtime/FinalizerThread.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/runtime/FinalizerThread.java Wed Oct 10 22:25:43 2001 *************** *** 0 **** --- 1,73 ---- + // FinalizerThread.java -- Thread in which finalizers are run. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package gnu.gcj.runtime; + + /** + * @author Tom Tromey + * @date October 3, 2001 + */ + public final class FinalizerThread extends Thread + { + // Finalizers must be run in a thread with no Java-visible locks + // held. This qualifies because we don't make the lock visible. + private static final Object lock = new Object (); + + // This is true if the finalizer thread started successfully. It + // might be false if, for instance, there are no threads on the + // current platform. In this situation we run finalizers in the + // caller's thread. + private static boolean thread_started = false; + + public FinalizerThread () + { + super ("LibgcjInternalFinalizerThread"); + setDaemon (true); + } + + // This is called by the runtime when a finalizer is ready to be + // run. It simply wakes up the finalizer thread. + public static void finalizerReady () + { + synchronized (lock) + { + if (! thread_started) + runFinalizers (); + else + lock.notify (); + } + } + + // Actually run the finalizers. + private static native void runFinalizers (); + + public void run () + { + // Wait on a lock. Whenever we wake up, try to invoke the + // finalizers. + synchronized (lock) + { + thread_started = true; + while (true) + { + try + { + lock.wait (); + } + catch (InterruptedException _) + { + // Just ignore it. It doesn't hurt to run finalizers + // when none are pending. + } + runFinalizers (); + } + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/FirstThread.java gcc-3.1/libjava/gnu/gcj/runtime/FirstThread.java *** gcc-3.0.4/libjava/gnu/gcj/runtime/FirstThread.java Tue Dec 12 00:32:02 2000 --- gcc-3.1/libjava/gnu/gcj/runtime/FirstThread.java Wed Oct 10 22:25:43 2001 *************** *** 1,6 **** // FirstThread.java - Implementation of very first thread. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // FirstThread.java - Implementation of very first thread. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** import java.util.jar.*; *** 17,79 **** * @date August 24, 1998 */ - // This is entirely internal to our implementation. - final class FirstThread extends Thread { ! public native void run (); ! ! public FirstThread (Class k, Object o) { super (null, null, "main"); klass = k; ! klass_name = null; ! args = o; } ! public FirstThread (String class_name, Object o) { super (null, null, "main"); - klass = null; klass_name = class_name; ! args = o; } ! private static void die (String s) { ! System.err.println(s); ! System.exit(1); } ! public static void main (String[] args) { try { ! JarFile j = new JarFile (args[0]); Attributes a = j.getManifest().getMainAttributes(); ! jarMainClassName = a.getValue(Attributes.Name.MAIN_CLASS); ! ! if (jarMainClassName != null) ! return; } catch (Exception e) { // empty } ! System.err.println ("Failed to load Main-Class manifest attribute from\n" ! + args[0]); } ! // If interpreter is invoked with -jar, the main class name is recorded ! // here. ! public static String jarMainClassName; // Private data. private Class klass; private String klass_name; private Object args; // If the user links statically then we need to ensure that these // classes are linked in. Otherwise bootstrapping fails. These --- 17,90 ---- * @date August 24, 1998 */ final class FirstThread extends Thread { ! public FirstThread (Class k, String[] args) { super (null, null, "main"); klass = k; ! this.args = args; } ! public FirstThread (String class_name, String[] args, boolean is_jar) { super (null, null, "main"); klass_name = class_name; ! this.args = args; ! this.is_jar = is_jar; } ! public void run() { ! if (is_jar) ! klass_name = getMain(klass_name); ! ! if (klass == null) ! { ! try ! { ! klass = Class.forName(klass_name); ! } ! catch (ClassNotFoundException x) ! { ! throw new NoClassDefFoundError(klass_name); ! } ! } ! ! call_main(); } ! private String getMain (String name) { + String mainName = null; try { ! JarFile j = new JarFile (name); Attributes a = j.getManifest().getMainAttributes(); ! mainName = a.getValue(Attributes.Name.MAIN_CLASS); } catch (Exception e) { // empty } ! if (mainName == null) ! { ! System.err.println ("Failed to load Main-Class manifest attribute from\n" ! + name); ! System.exit(1); ! } ! return mainName; } ! private native void call_main (); // Private data. private Class klass; private String klass_name; private Object args; + private boolean is_jar; // If the user links statically then we need to ensure that these // classes are linked in. Otherwise bootstrapping fails. These diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/JNIWeakRef.java gcc-3.1/libjava/gnu/gcj/runtime/JNIWeakRef.java *** gcc-3.0.4/libjava/gnu/gcj/runtime/JNIWeakRef.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/runtime/JNIWeakRef.java Tue Nov 13 17:43:41 2001 *************** *** 0 **** --- 1,24 ---- + // JNIWeakRef.java - Wrapper class for JNI-specific weak references. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package gnu.gcj.runtime; + + import java.lang.ref.*; + + // This wrapper is used by the JNI implementation to keep track of + // global weak references. Each such reference is wrapped in an + // instance of this class, and automatically unwrapped when used. + public final class JNIWeakRef extends WeakReference + { + public JNIWeakRef (Object referent) + { + super (referent); + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/SharedLibLoader.java gcc-3.1/libjava/gnu/gcj/runtime/SharedLibLoader.java *** gcc-3.0.4/libjava/gnu/gcj/runtime/SharedLibLoader.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/runtime/SharedLibLoader.java Sat Sep 29 19:16:26 2001 *************** *** 0 **** --- 1,75 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package gnu.gcj.runtime; + import java.util.Hashtable; + + /** + * A ClassLoader backed by a gcj-compiled shared library. + * @author Per Bothner , Brainfood Inc. + */ + + public class SharedLibLoader extends ClassLoader + { + public native void finalize (); + + /** Called during dlopen's processing of the init section. */ + void registerClass(String name, Class cls) + { + classMap.put(name, cls); + } + + /** Load a shared library, and associate a ClassLoader with it. + * @param libname named of shared library (passed to dlopen) + * @param parent the parent ClassLoader + * @parem flags passed to dlopen + */ + public SharedLibLoader(String libname, ClassLoader parent, int flags) + { + super(parent); + init(libname, flags); + } + + + /** Load a shared library, and asociate a ClassLoader with it. + * @param libname named of shared library (passed to dlopen) + */ + public SharedLibLoader(String libname) + { + super(getSystemClassLoader()); + init(libname, 0); + } + + void init(String libname, int flags) + { + init(libname.getBytes(), flags); + } + + native void init(byte[] libname, int flags); + + public Class loadClass(String name) + throws ClassNotFoundException + { + return super.loadClass(name); + } + + public Class findClass(String name) + throws ClassNotFoundException + { + Object cls = classMap.get(name); + if (cls == null) + throw new ClassNotFoundException(name); + return (Class) cls; + } + + /** The handle returned by dlopen. */ + gnu.gcj.RawData handler; + + /** Map classnames to Classes. */ + Hashtable classMap = new Hashtable(20); + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/StringBuffer.java gcc-3.1/libjava/gnu/gcj/runtime/StringBuffer.java *** gcc-3.0.4/libjava/gnu/gcj/runtime/StringBuffer.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/runtime/StringBuffer.java Tue Jan 22 22:39:48 2002 *************** *** 0 **** --- 1,199 ---- + // This is a simplified copy of java.lang.StringBuffer with + // `synchronized' removed. + + /* StringBuffer.java -- Growable strings + Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.gcj.runtime; + + public final class StringBuffer + { + /** Append the String value of the argument to this StringBuffer. + * Uses String.valueOf() to convert to + * String. + * @param bool the boolean to convert and append. + * @return this StringBuffer. + * @see java.lang.String#valueOf(boolean) + */ + public StringBuffer append (boolean bool) + { + return append (bool ? "true" : "false"); + } + + /** Append the char to this StringBuffer. + * @param c the char to append. + * @return this StringBuffer. + */ + public StringBuffer append (char ch) + { + ensureCapacity_unsynchronized (count + 1); + value[count++] = ch; + return this; + } + + /** Append the String value of the argument to this StringBuffer. + * Uses String.valueOf() to convert to + * String. + * @param inum the int to convert and append. + * @return this StringBuffer. + * @see java.lang.String#valueOf(int) + */ + public native StringBuffer append (int inum); + + /** Append the String value of the argument to this StringBuffer. + * Uses String.valueOf() to convert to + * String. + * @param lnum the long to convert and append. + * @return this StringBuffer. + * @see java.lang.String#valueOf(long) + */ + public StringBuffer append (long lnum) + { + return append (Long.toString (lnum)); + } + + /** Append the String value of the argument to this StringBuffer. + * Uses String.valueOf() to convert to + * String. + * @param fnum the float to convert and append. + * @return this StringBuffer. + * @see java.lang.String#valueOf(float) + */ + public StringBuffer append (float fnum) + { + return append (Float.toString (fnum)); + } + + /** Append the String value of the argument to this StringBuffer. + * Uses String.valueOf() to convert to + * String. + * @param dnum the double to convert and append. + * @return this StringBuffer. + * @see java.lang.String#valueOf(double) + */ + public StringBuffer append (double dnum) + { + return append (Double.toString (dnum)); + } + + /** Append the String value of the argument to this StringBuffer. + * Uses String.valueOf() to convert to + * String. + * @param obj the Object to convert and append. + * @return this StringBuffer. + * @see java.lang.String#valueOf(java.lang.Object) + */ + public StringBuffer append (Object obj) + { + return append (String.valueOf(obj)); + } + + /** Append the String to this StringBuffer. + * @param str the String to append. + * @return this StringBuffer. + */ + public StringBuffer append (String str) + { + if (str == null) + str = "null"; + int len = str.length(); + ensureCapacity_unsynchronized (count + len); + str.getChars(0, len, value, count); + count += len; + return this; + } + + private void ensureCapacity_unsynchronized (int minimumCapacity) + { + if (minimumCapacity > value.length) + { + minimumCapacity = Math.max (minimumCapacity, value.length * 2 + 2); + char[] nb = new char[minimumCapacity]; + System.arraycopy(value, 0, nb, 0, count); + value = nb; + } + } + + /** Create a new StringBuffer with default capacity 16. + * @see JLS 20.13.1 + */ + public StringBuffer () + { + this (DEFAULT_CAPACITY); + } + + /** Create an empty StringBuffer with the specified initial capacity. + * @param capacity the initial capacity. + */ + public StringBuffer (int capacity) + { + count = 0; + value = new char[capacity]; + } + + /** Create a new StringBuffer with the characters in the specified String. + * Initial capacity will be the size of the String plus 16. + * @param str the String to make a StringBuffer out of. + */ + public StringBuffer (String str) + { + if (str == null) + str = "null"; + count = str.length(); + // JLS: The initial capacity of the string buffer is 16 plus the + // length of the argument string. + value = new char[count + DEFAULT_CAPACITY]; + str.getChars(0, count, value, 0); + } + + /** Convert this StringBuffer to a String. + * @return the characters in this StringBuffer + */ + // This is native because efficient implementation requires avoiding + // the Java protection mechanism. + public native String toString (); + + // Index of next available character. Note that this has + // permissions set this way so that String can get the value. + int count; + + // The buffer. Note that this has permissions set this way so that + // String can get the value. + char[] value; + + private final static int DEFAULT_CAPACITY = 16; // JLS 20.13.1 + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/VMClassLoader.java gcc-3.1/libjava/gnu/gcj/runtime/VMClassLoader.java *** gcc-3.0.4/libjava/gnu/gcj/runtime/VMClassLoader.java Sun May 6 14:08:26 2001 --- gcc-3.1/libjava/gnu/gcj/runtime/VMClassLoader.java Thu Sep 6 22:32:54 2001 *************** *** 1,4 **** ! /* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1999, 2001 Free Software Foundation This file is part of libgcj. *************** import java.io.*; *** 14,20 **** import java.util.StringTokenizer; import java.net.URL; ! final class VMClassLoader extends java.net.URLClassLoader { private VMClassLoader () { --- 14,20 ---- import java.util.StringTokenizer; import java.net.URL; ! public final class VMClassLoader extends java.net.URLClassLoader { private VMClassLoader () { *************** final class VMClassLoader extends java.n *** 56,61 **** --- 56,71 ---- /* Ignore this path element */ } } + // Add core:/ to the end of the java.class.path so any resources + // compiled into this executable may be found. + try + { + p.addElement (new URL("core", "", -1, "/")); + } + catch (java.net.MalformedURLException x) + { + // This should never happen. + } URL[] urls = new URL[p.size()]; p.copyInto (urls); diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/natFinalizerThread.cc gcc-3.1/libjava/gnu/gcj/runtime/natFinalizerThread.cc *** gcc-3.0.4/libjava/gnu/gcj/runtime/natFinalizerThread.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/runtime/natFinalizerThread.cc Wed Oct 10 22:25:43 2001 *************** *** 0 **** --- 1,22 ---- + // natFinalizerThread.cc - Implementation of FinalizerThread native methods. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #include + + #include + #include + + #include + + void + gnu::gcj::runtime::FinalizerThread::runFinalizers () + { + _Jv_RunFinalizers (); + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/natFirstThread.cc gcc-3.1/libjava/gnu/gcj/runtime/natFirstThread.cc *** gcc-3.0.4/libjava/gnu/gcj/runtime/natFirstThread.cc Tue Jul 24 19:57:57 2001 --- gcc-3.1/libjava/gnu/gcj/runtime/natFirstThread.cc Sun Aug 26 11:30:08 2001 *************** details. */ *** 10,153 **** #include #include #include #include - #include #include - #include - #include - #include - #include - #include - - #ifdef ENABLE_JVMPI - #include - #include - #include - #endif - - #define DIE(Message) die (JvNewStringLatin1 (Message)) typedef void main_func (jobject); - #ifdef WITH_JVMPI - extern void (*_Jv_JVMPI_Notify_THREAD_START) (JVMPI_Event *event); - #endif - - /* This will be different from _JNI_OnLoad if the user has preloaded a JNI - library, or linked one into the executable. */ - extern "C" - { - /* Some systems, like Tru64 UNIX, don't support weak definitions, so use - an empty dummy function to check if the user provided his own. */ - #pragma weak JNI_OnLoad = _JNI_OnLoad - extern jint JNI_OnLoad (JavaVM *, void *) __attribute__((weak)); - - jint _JNI_OnLoad (JavaVM *vm, void *) - { - return 0; - } - } - void ! gnu::gcj::runtime::FirstThread::run (void) { - Utf8Const* main_signature = _Jv_makeUtf8Const ("([Ljava.lang.String;)V", 22); Utf8Const* main_name = _Jv_makeUtf8Const ("main", 4); - /* Some systems let you preload shared libraries before running a - program. Under Linux, this is done by setting the LD_PRELOAD - environment variable. We take advatage of this here to allow for - dynamically loading a JNI library into a fully linked executable. */ - - if (JNI_OnLoad != _JNI_OnLoad) - { - JavaVM *vm = _Jv_GetJavaVM (); - if (vm == NULL) - { - // FIXME: what? - return; - } - jint vers = JNI_OnLoad (vm, NULL); - if (vers != JNI_VERSION_1_1 && vers != JNI_VERSION_1_2) - { - // FIXME: unload the library. - _Jv_Throw (new java::lang::UnsatisfiedLinkError (JvNewStringLatin1 ("unrecognized version from preloaded JNI_OnLoad"))); - } - } - - if (klass == NULL) - klass = java::lang::Class::forName (klass_name); - if (klass != NULL) - _Jv_InitClass (klass); - _Jv_Method *meth = _Jv_GetMethodLocal (klass, main_name, main_signature); // Some checks from Java Spec section 12.1.4. if (meth == NULL) ! DIE ("no suitable method `main' in class"); ! if (! java::lang::reflect::Modifier::isStatic(meth->accflags)) ! DIE ("`main' must be static"); ! if (! java::lang::reflect::Modifier::isPublic(meth->accflags)) ! DIE ("`main' must be public"); ! ! #ifdef WITH_JVMPI ! if (_Jv_JVMPI_Notify_THREAD_START) { ! JVMPI_Event event; ! ! jstring thread_name = getName (); ! jstring group_name = NULL, parent_name = NULL; ! java::lang::ThreadGroup *group = getThreadGroup (); ! ! if (group) ! { ! group_name = group->getName (); ! group = group->getParent (); ! ! if (group) ! parent_name = group->getName (); ! } ! ! int thread_len = thread_name ? JvGetStringUTFLength (thread_name) : 0; ! int group_len = group_name ? JvGetStringUTFLength (group_name) : 0; ! int parent_len = parent_name ? JvGetStringUTFLength (parent_name) : 0; ! ! char thread_chars[thread_len + 1]; ! char group_chars[group_len + 1]; ! char parent_chars[parent_len + 1]; ! ! if (thread_name) ! JvGetStringUTFRegion (thread_name, 0, ! thread_name->length(), thread_chars); ! if (group_name) ! JvGetStringUTFRegion (group_name, 0, ! group_name->length(), group_chars); ! if (parent_name) ! JvGetStringUTFRegion (parent_name, 0, ! parent_name->length(), parent_chars); ! ! thread_chars[thread_len] = '\0'; ! group_chars[group_len] = '\0'; ! parent_chars[parent_len] = '\0'; ! ! event.event_type = JVMPI_EVENT_THREAD_START; ! event.env_id = NULL; ! event.u.thread_start.thread_name = thread_chars; ! event.u.thread_start.group_name = group_chars; ! event.u.thread_start.parent_name = parent_chars; ! event.u.thread_start.thread_id = (jobjectID) this; ! event.u.thread_start.thread_env_id = _Jv_GetCurrentJNIEnv (); ! ! _Jv_DisableGC (); ! (*_Jv_JVMPI_Notify_THREAD_START) (&event); ! _Jv_EnableGC (); } - #endif main_func *real_main = (main_func *) meth->ncode; (*real_main) (args); --- 10,46 ---- #include + #include #include #include #include #include typedef void main_func (jobject); void ! gnu::gcj::runtime::FirstThread::call_main (void) { Utf8Const* main_signature = _Jv_makeUtf8Const ("([Ljava.lang.String;)V", 22); Utf8Const* main_name = _Jv_makeUtf8Const ("main", 4); _Jv_Method *meth = _Jv_GetMethodLocal (klass, main_name, main_signature); // Some checks from Java Spec section 12.1.4. + const char *msg = NULL; if (meth == NULL) ! msg = "no suitable method `main' in class"; ! else if (! java::lang::reflect::Modifier::isStatic(meth->accflags)) ! msg = "`main' must be static"; ! else if (! java::lang::reflect::Modifier::isPublic(meth->accflags)) ! msg = "`main' must be public"; ! if (msg != NULL) { ! fprintf (stderr, "%s\n", msg); ! ::exit(1); } main_func *real_main = (main_func *) meth->ncode; (*real_main) (args); diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/natSharedLibLoader.cc gcc-3.1/libjava/gnu/gcj/runtime/natSharedLibLoader.cc *** gcc-3.0.4/libjava/gnu/gcj/runtime/natSharedLibLoader.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/runtime/natSharedLibLoader.cc Wed Oct 24 07:00:19 2001 *************** *** 0 **** --- 1,76 ---- + // natSharedLibLoader.cc - Implementation of FirstThread native methods. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #include + + #include + #include + #include + #include + + #ifdef HAVE_DLOPEN + #include + + /* Only used during dlopen, while having a lock on Class.class. */ + static gnu::gcj::runtime::SharedLibLoader* curLoader; + + typedef void (*ClassHookFunc) (jclass); + + static void + ::register_hook(jclass cls) + { + curLoader->registerClass(cls->getName(), cls); + } + + struct SharedLibDummy + { + ClassHookFunc saved; + SharedLibDummy() + { + saved = _Jv_RegisterClassHook; + } + ~SharedLibDummy() + { + _Jv_RegisterClassHook = saved; + curLoader = NULL; + } + }; + #endif + + void + gnu::gcj::runtime::SharedLibLoader::init(jbyteArray libname, jint flags) + { + #ifdef HAVE_DLOPEN + char *lname = (char*) elements(libname); + if (flags==0) + flags = RTLD_LAZY; + JvSynchronize dummy1(&java::lang::Class::class$); + SharedLibDummy dummy2; + curLoader = this; + _Jv_RegisterClassHook = ::register_hook; + void *h = dlopen(lname, flags); + if (h == NULL) + { + const char *msg = dlerror(); + } + handler = (gnu::gcj::RawData*) h; + #else + const char *msg = "ShareedLibLoader is not supported on this platform"; + throw new java::lang::UnsupportedOperationException(JvNewStringLatin1(msg)); + #endif + } + + void + gnu::gcj::runtime::SharedLibLoader::finalize() + { + #ifdef HAVE_DLOPEN + dlclose (handler); + #endif + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/runtime/natStringBuffer.cc gcc-3.1/libjava/gnu/gcj/runtime/natStringBuffer.cc *** gcc-3.0.4/libjava/gnu/gcj/runtime/natStringBuffer.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/gcj/runtime/natStringBuffer.cc Tue Dec 11 18:01:39 2001 *************** *** 0 **** --- 1,36 ---- + // natStringBuffer.cc - Implementation of java.lang.StringBuffer native methods. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #include + #include + #include + #include + + gnu::gcj::runtime::StringBuffer * + gnu::gcj::runtime::StringBuffer::append (jint num) + { + // Use an array large enough for "-2147483648"; i.e. 11 chars. + jchar buffer[11]; + int i = _Jv_FormatInt (buffer+11, num); + jint needed = count + i; + ensureCapacity_unsynchronized (needed); + jchar* dst = elements (value) + count; + jchar* src = buffer+11-i; + while (--i >= 0) + *dst++ = *src++; + count = needed; + return this; + } + + java::lang::String * + gnu::gcj::runtime::StringBuffer::toString () + { + return new java::lang::String (this); + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/text/BaseBreakIterator.java gcc-3.1/libjava/gnu/gcj/text/BaseBreakIterator.java *** gcc-3.0.4/libjava/gnu/gcj/text/BaseBreakIterator.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/gnu/gcj/text/BaseBreakIterator.java Thu Jan 1 00:00:00 1970 *************** *** 1,82 **** - // Base class for default BreakIterators. - - /* Copyright (C) 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.text; - - import java.text.BreakIterator; - import java.text.CharacterIterator; - - /** - * @author Tom Tromey - * @date March 22, 1999 - */ - - public abstract class BaseBreakIterator extends BreakIterator - { - public int current () - { - return iter.getIndex(); - } - - public int first () - { - iter.first(); - return iter.getBeginIndex(); - } - - public int following (int pos) - { - int save = iter.getIndex(); - iter.setIndex(pos); - int r = next (); - iter.setIndex(save); - return r; - } - - public CharacterIterator getText () - { - return iter; - } - - public int last () - { - iter.last(); - return iter.getEndIndex(); - } - - public int next (int n) - { - int r = iter.getIndex (); - if (n > 0) - { - while (n > 0 && r != DONE) - { - r = next (); - --n; - } - } - else if (n < 0) - { - while (n < 0 && r != DONE) - { - r = previous (); - ++n; - } - } - return r; - } - - public void setText (CharacterIterator newText) - { - iter = newText; - } - - protected CharacterIterator iter; - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/text/CharacterBreakIterator.java gcc-3.1/libjava/gnu/gcj/text/CharacterBreakIterator.java *** gcc-3.0.4/libjava/gnu/gcj/text/CharacterBreakIterator.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/gnu/gcj/text/CharacterBreakIterator.java Thu Jan 1 00:00:00 1970 *************** *** 1,188 **** - // Default character BreakIterator. - - /* Copyright (C) 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.text; - - import java.text.BreakIterator; - import java.text.CharacterIterator; - - /** - * @author Tom Tromey - * @date March 19, 1999 - * Written using The Unicode Standard, Version 2.0. - */ - - public class CharacterBreakIterator extends BaseBreakIterator - { - // Hangul Jamo constants from Unicode book. - private static final int LBase = 0x1100; - private static final int VBase = 0x1161; - private static final int TBase = 0x11a7; - private static final int LCount = 19; - private static final int VCount = 21; - private static final int TCount = 28; - - // Information about surrogates. - private static final int highSurrogateStart = 0xD800; - private static final int highSurrogateEnd = 0xDBFF; - private static final int lowSurrogateStart = 0xDC00; - private static final int lowSurrogateEnd = 0xDFFF; - - public Object clone () - { - return new CharacterBreakIterator (this); - } - - public CharacterBreakIterator () - { - iter = null; // FIXME? - } - - private CharacterBreakIterator (CharacterBreakIterator other) - { - iter = (CharacterIterator) other.iter.clone(); - } - - // Some methods to tell us different properties of characters. - private final boolean isL (char c) - { - return c >= LBase && c <= LBase + LCount; - } - private final boolean isV (char c) - { - return c >= VBase && c <= VBase + VCount; - } - private final boolean isT (char c) - { - return c >= TBase && c <= TBase + TCount; - } - private final boolean isLVT (char c) - { - return isL (c) || isV (c) || isT (c); - } - private final boolean isHighSurrogate (char c) - { - return c >= highSurrogateStart && c <= highSurrogateEnd; - } - private final boolean isLowSurrogate (char c) - { - return c >= lowSurrogateStart && c <= lowSurrogateEnd; - } - - public int next () - { - int end = iter.getEndIndex(); - if (iter.getIndex() == end) - return DONE; - - char c; - for (char prev = CharacterIterator.DONE; iter.getIndex() < end; prev = c) - { - c = iter.next(); - if (c == CharacterIterator.DONE) - break; - int type = Character.getType(c); - - // Break after paragraph separators. - if (type == Character.PARAGRAPH_SEPARATOR) - break; - - // Now we need some lookahead. - char ahead = iter.next(); - iter.previous(); - if (ahead == CharacterIterator.DONE) - break; - int aheadType = Character.getType(ahead); - - if (aheadType != Character.NON_SPACING_MARK - && ! isLowSurrogate (ahead) - && ! isLVT (ahead)) - break; - if (! isLVT (c) && isLVT (ahead)) - break; - if (isL (c) && ! isLVT (ahead) - && aheadType != Character.NON_SPACING_MARK) - break; - if (isV (c) && ! isV (ahead) && !isT (ahead) - && aheadType != Character.NON_SPACING_MARK) - break; - if (isT (c) && ! isT (ahead) - && aheadType != Character.NON_SPACING_MARK) - break; - - if (! isHighSurrogate (c) && isLowSurrogate (ahead)) - break; - if (isHighSurrogate (c) && ! isLowSurrogate (ahead)) - break; - if (! isHighSurrogate (prev) && isLowSurrogate (c)) - break; - } - - return iter.getIndex(); - } - - public int previous () - { - if (iter.getIndex() == iter.getBeginIndex()) - return DONE; - - int start = iter.getBeginIndex(); - while (iter.getIndex() >= iter.getBeginIndex()) - { - char c = iter.previous(); - if (c == CharacterIterator.DONE) - break; - int type = Character.getType(c); - - if (type != Character.NON_SPACING_MARK - && ! isLowSurrogate (c) - && ! isLVT (c)) - break; - - // Now we need some lookahead. - char ahead = iter.previous(); - if (ahead == CharacterIterator.DONE) - { - iter.next(); - break; - } - char ahead2 = iter.previous(); - iter.next(); - iter.next(); - if (ahead2 == CharacterIterator.DONE) - break; - int aheadType = Character.getType(ahead); - - if (aheadType == Character.PARAGRAPH_SEPARATOR) - break; - - if (isLVT (c) && ! isLVT (ahead)) - break; - if (! isLVT (c) && type != Character.NON_SPACING_MARK - && isL (ahead)) - break; - if (! isV (c) && ! isT (c) && type != Character.NON_SPACING_MARK - && isV (ahead)) - break; - if (! isT (c) && type != Character.NON_SPACING_MARK - && isT (ahead)) - break; - - if (isLowSurrogate (c) && ! isHighSurrogate (ahead)) - break; - if (! isLowSurrogate (c) && isHighSurrogate (ahead)) - break; - if (isLowSurrogate (ahead) && ! isHighSurrogate (ahead2)) - break; - } - - return iter.getIndex(); - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/text/LineBreakIterator.java gcc-3.1/libjava/gnu/gcj/text/LineBreakIterator.java *** gcc-3.0.4/libjava/gnu/gcj/text/LineBreakIterator.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/gnu/gcj/text/LineBreakIterator.java Thu Jan 1 00:00:00 1970 *************** *** 1,168 **** - // Default word BreakIterator. - - /* Copyright (C) 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.text; - - import java.text.BreakIterator; - import java.text.CharacterIterator; - - /** - * @author Tom Tromey - * @date March 22, 1999 - * Written using The Unicode Standard, Version 2.0. - */ - - public class LineBreakIterator extends BaseBreakIterator - { - public Object clone () - { - return new LineBreakIterator (this); - } - - public LineBreakIterator () - { - iter = null; - } - - private LineBreakIterator (LineBreakIterator other) - { - iter = (CharacterIterator) other.iter.clone(); - } - - // Some methods to tell us different properties of characters. - private final boolean isNb (char c) - { - return (c == 0x00a0 // NO-BREAK SPACE - || c == 0x2011 // NON-BREAKING HYPHEN - || c == 0xfeff); // ZERO WITH NO-BREAK SPACE - } - private final boolean isClose (int type) - { - return (type == Character.END_PUNCTUATION - // Unicode book says "comma, period, ...", which I take to - // mean "Po" class. - || type == Character.OTHER_PUNCTUATION); - } - private final boolean isIdeo (char c) - { - return (c >= 0x3040 && c <= 0x309f // Hiragana - || c >= 0x30a0 && c <= 0x30ff // Katakana - || c >= 0x4e00 && c <= 0x9fff // Han - || c >= 0x3100 && c <= 0x312f); // Bopomofo - } - - public int next () - { - int end = iter.getEndIndex(); - if (iter.getIndex() == end) - return DONE; - - while (iter.getIndex() < end) - { - char c = iter.current(); - int type = Character.getType(c); - - char n = iter.next(); - - if (n == CharacterIterator.DONE - || type == Character.PARAGRAPH_SEPARATOR - || type == Character.LINE_SEPARATOR) - break; - - // Handle two cases where we must scan for non-spacing marks. - int start = iter.getIndex(); - if (type == Character.SPACE_SEPARATOR - || type == Character.START_PUNCTUATION - || isIdeo (c)) - { - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.NON_SPACING_MARK) - n = iter.next(); - if (n == CharacterIterator.DONE) - break; - - if (type == Character.SPACE_SEPARATOR) - { - int nt = Character.getType(n); - if (nt != Character.NON_SPACING_MARK - && nt != Character.SPACE_SEPARATOR - && ! isNb (n)) - break; - } - else if (type == Character.START_PUNCTUATION) - { - if (isIdeo (n)) - { - // Open punctuation followed by non spacing marks - // and then ideograph does not have a break in - // it. So skip all this. - start = iter.getIndex(); - } - } - else - { - // Ideograph preceded this character. - if (isClose (Character.getType(n))) - break; - } - } - iter.setIndex(start); - } - - return iter.getIndex(); - } - - public int previous () - { - int start = iter.getBeginIndex(); - if (iter.getIndex() == start) - return DONE; - - while (iter.getIndex() >= start) - { - char c = iter.previous(); - if (c == CharacterIterator.DONE) - break; - int type = Character.getType(c); - - char n = iter.previous(); - if (n == CharacterIterator.DONE) - break; - iter.next(); - - int nt = Character.getType(n); - // Break after paragraph separators. - if (nt == Character.PARAGRAPH_SEPARATOR - || nt == Character.LINE_SEPARATOR) - break; - - // Skip non-spacing marks. - int init = iter.getIndex(); - while (n != CharacterIterator.DONE && nt == Character.NON_SPACING_MARK) - { - n = iter.previous(); - nt = Character.getType(n); - } - - if (nt == Character.SPACE_SEPARATOR - && type != Character.SPACE_SEPARATOR - && type != Character.NON_SPACING_MARK - && ! isNb (c)) - break; - if (! isClose (type) && isIdeo (n)) - break; - if (isIdeo (c) && nt != Character.START_PUNCTUATION) - break; - iter.setIndex(init); - } - - return iter.getIndex(); - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/text/LocaleData_en.java gcc-3.1/libjava/gnu/gcj/text/LocaleData_en.java *** gcc-3.0.4/libjava/gnu/gcj/text/LocaleData_en.java Tue Nov 28 03:09:21 2000 --- gcc-3.1/libjava/gnu/gcj/text/LocaleData_en.java Thu Jan 1 00:00:00 1970 *************** *** 1,92 **** - // Generic English locale data for java.text. - - /* Copyright (C) 1999, 2000 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.text; - - import java.util.ListResourceBundle; - - /** - * @author Tom Tromey - * @date March 4, 1999 - */ - - public final class LocaleData_en extends ListResourceBundle - { - // These are for DateFormatSymbols. - static final String[] ampmsDefault = {"AM", "PM" }; - static final String[] erasDefault = {"BC", "AD" }; - static final String localPatternCharsDefault = "GyMdkHmsSEDFwWahKz"; - static final String[] monthsDefault = { - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December", "" - }; - static final String[] shortMonthsDefault = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "" - }; - static final String[] shortWeekdaysDefault = { - "", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - }; - static final String[] weekdaysDefault = { - "", "Sunday", "Monday", "Tuesday", - "Wednesday", "Thursday", "Friday", "Saturday" - }; - - private static final Object[][] contents = - { - // These are for DecimalFormatSymbols. - { "decimalSeparator", "." }, - { "digit", "#" }, - { "exponential", "E" }, - { "groupingSeparator", "," }, - { "infinity", "\u221e" }, - { "minusSign", "-" }, - { "monetarySeparator", "." }, - { "NaN", "\ufffd" }, - { "patternSeparator", ";" }, - { "percent", "%" }, - { "perMill", "\u2030" }, - { "zeroDigit", "0" }, - - // These are for NumberFormat. - { "numberFormat", "#,##0.###" }, - { "percentFormat", "#,##0%" }, - - // These are for DateFormatSymbols. - { "ampm", ampmsDefault }, - { "eras", erasDefault }, - { "datePatternChars", localPatternCharsDefault }, - { "months", monthsDefault }, - { "shortMonths", shortMonthsDefault }, - { "shortWeekdays", shortWeekdaysDefault }, - { "weekdays", weekdaysDefault }, - - // These are for DateFormat. - { "shortDateFormat", "M/d/yy" }, // Java's Y2K bug. - { "mediumDateFormat", "d-MMM-yy" }, - { "longDateFormat", "MMMM d, yyyy" }, - { "fullDateFormat", "EEEE MMMM d, yyyy G" }, - { "shortTimeFormat", "h:mm a" }, - { "mediumTimeFormat", "h:mm:ss a" }, - { "longTimeFormat", "h:mm:ss a z" }, - { "fullTimeFormat", "h:mm:ss;S 'o''clock' a z" }, - - // For RuleBasedCollator. - // FIXME: this is nowhere near complete. - // In particular we must mark accents as ignorable, - // and probably other things as well. - { "collatorRule", "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < a,A < b,B < c,C < d,D < e,E < f,F < g,G < h,H < i,I < j,J < k,K < l,L < m,M < n,N < o,O < p,P < q,Q < r,R < s,S < t,T < u,U < v,V < w,W < x,X < y,Y < z,Z" } - }; - - protected Object[][] getContents () - { - return contents; - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/text/LocaleData_en_US.java gcc-3.1/libjava/gnu/gcj/text/LocaleData_en_US.java *** gcc-3.0.4/libjava/gnu/gcj/text/LocaleData_en_US.java Tue Jan 9 07:07:51 2001 --- gcc-3.1/libjava/gnu/gcj/text/LocaleData_en_US.java Thu Jan 1 00:00:00 1970 *************** *** 1,81 **** - // US English locale data for java.text. - - /* Copyright (C) 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.text; - - import java.util.ListResourceBundle; - - /** - * @author Tom Tromey - * @date March 4, 1999 - */ - - public final class LocaleData_en_US extends ListResourceBundle - { - // These are for DateFormatSymbols. - static String[][] zoneStringsDefault = { - { "GMT", "Greenwich Mean Time", "GMT", - /**/ "Greenwich Mean Time", "GMT", "GMT" }, - { "PST", "Pacific Standard Time", "PST", - /**/ "Pacific Daylight Time", "PDT", "San Francisco" }, - { "MST", "Mountain Standard Time", "MST", - /**/ "Mountain Daylight Time", "MDT", "Denver" }, - { "PNT", "Mountain Standard Time", "MST", - /**/ "Mountain Standard Time", "MST", "Phoenix" }, - { "CST", "Central Standard Time", "CST", - /**/ "Central Daylight Time", "CDT", "Chicago" }, - { "EST", "Eastern Standard Time", "EST", - /**/ "Eastern Daylight Time", "EDT", "Boston" }, - { "IET", "Eastern Standard Time", "EST", - /**/ "Eastern Standard Time", "EST", "Indianapolis" }, - { "PRT", "Atlantic Standard Time", "AST", - /**/ "Atlantic Daylight Time", "ADT", "Halifax" }, - { "CNT", "Newfoundland Standard Time", "NST", - /**/ "Newfoundland Daylight Time", "NDT", "St. Johns" }, - { "ECT", "Central European Standard Time", "CET", - /**/ "Central European Daylight Time", "CEST", "Paris" }, - { "CTT", "China Standard Time", "CST", - /**/ "China Standard Time", "CST", "Shanghai" }, - { "JST", "Japan Standard Time", "JST", - /**/ "Japan Standard Time", "JST", "Tokyo" }, - { "HST", "Hawaii Standard Time", "HST", - /**/ "Hawaii Standard Time", "HST", "Honolulu" }, - { "AST", "Alaska Standard Time", "AKST", - /**/ "Alaska Daylight Time", "AKDT", "Anchorage" } - }; - - private static final Object[][] contents = - { - // These are for DecimalFormatSymbols. - { "currency", "$" }, - { "intlCurrencySymbol", "$" }, // FIXME? - - // These are for NumberFormat. - { "currencyFormat", "$#,##0.00;($#,##0.00)" }, - - // These are for DateFormatSymbols. - { "zoneStrings", zoneStringsDefault }, - - // These are for DateFormat. - { "shortDateFormat", "M/d/yy" }, // Java's Y2K bug. - { "mediumDateFormat", "d-MMM-yy" }, - { "longDateFormat", "MMMM d, yyyy" }, - { "fullDateFormat", "EEEE MMMM d, yyyy G" }, - { "shortTimeFormat", "h:mm a" }, - { "mediumTimeFormat", "h:mm:ss a" }, - { "longTimeFormat", "h:mm:ss a z" }, - { "fullTimeFormat", "h:mm:ss;S 'o''clock' a z" } - }; - - protected Object[][] getContents () - { - return contents; - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/text/SentenceBreakIterator.java gcc-3.1/libjava/gnu/gcj/text/SentenceBreakIterator.java *** gcc-3.0.4/libjava/gnu/gcj/text/SentenceBreakIterator.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/gnu/gcj/text/SentenceBreakIterator.java Thu Jan 1 00:00:00 1970 *************** *** 1,226 **** - // Default sentence BreakIterator. - - /* Copyright (C) 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.text; - - import java.text.BreakIterator; - import java.text.CharacterIterator; - - /** - * @author Tom Tromey - * @date March 23, 1999 - * Written using The Unicode Standard, Version 2.0. - */ - - public class SentenceBreakIterator extends BaseBreakIterator - { - public Object clone () - { - return new SentenceBreakIterator (this); - } - - public SentenceBreakIterator () - { - iter = null; - } - - private SentenceBreakIterator (SentenceBreakIterator other) - { - iter = (CharacterIterator) other.iter.clone(); - } - - public int next () - { - int end = iter.getEndIndex(); - if (iter.getIndex() == end) - return DONE; - - while (iter.getIndex() < end) - { - char c = iter.current(); - if (c == CharacterIterator.DONE) - break; - int type = Character.getType(c); - - char n = iter.next(); - if (n == CharacterIterator.DONE) - break; - - // Always break after paragraph separator. - if (type == Character.PARAGRAPH_SEPARATOR) - break; - - if (c == '!' || c == '?') - { - // Skip close punctuation. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.END_PUNCTUATION) - n = iter.next(); - // Skip spaces. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.SPACE_SEPARATOR) - n = iter.next(); - // Skip optional paragraph separator. - if (n != CharacterIterator.DONE - && Character.getType(n) == Character.PARAGRAPH_SEPARATOR) - n = iter.next(); - - // There's always a break somewhere after `!' or `?'. - break; - } - - if (c == '.') - { - int save = iter.getIndex(); - // Skip close punctuation. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.END_PUNCTUATION) - n = iter.next(); - // Skip spaces. We keep count because we need at least - // one for this period to represent a terminator. - int spcount = 0; - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.SPACE_SEPARATOR) - { - n = iter.next(); - ++spcount; - } - if (spcount > 0) - { - int save2 = iter.getIndex(); - // Skip over open puncutation. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.START_PUNCTUATION) - n = iter.next(); - // Next character must not be lower case. - if (n == CharacterIterator.DONE - || ! Character.isLowerCase(n)) - { - iter.setIndex(save2); - break; - } - } - iter.setIndex(save); - } - } - - return iter.getIndex(); - } - - private final int previous_internal () - { - int start = iter.getBeginIndex(); - if (iter.getIndex() == start) - return DONE; - - while (iter.getIndex() >= start) - { - char c = iter.previous(); - if (c == CharacterIterator.DONE) - break; - - char n = iter.previous(); - if (n == CharacterIterator.DONE) - break; - iter.next(); - int nt = Character.getType(n); - - if (! Character.isLowerCase(c) - && (nt == Character.START_PUNCTUATION - || nt == Character.SPACE_SEPARATOR)) - { - int save = iter.getIndex(); - int save_nt = nt; - char save_n = n; - // Skip open punctuation. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.START_PUNCTUATION) - n = iter.previous(); - if (n == CharacterIterator.DONE) - break; - if (Character.getType(n) == Character.SPACE_SEPARATOR) - { - // Must have at least once space after the `.'. - int save2 = iter.getIndex(); - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.SPACE_SEPARATOR) - n = iter.previous(); - // Skip close punctuation. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.END_PUNCTUATION) - n = iter.previous(); - if (n == CharacterIterator.DONE || n == '.') - { - // Communicate location of actual end. - period = iter.getIndex(); - iter.setIndex(save2); - break; - } - } - iter.setIndex(save); - nt = save_nt; - n = save_n; - } - - if (nt == Character.PARAGRAPH_SEPARATOR) - { - // Communicate location of actual end. - period = iter.getIndex(); - break; - } - else if (nt == Character.SPACE_SEPARATOR - || nt == Character.END_PUNCTUATION) - { - int save = iter.getIndex(); - // Skip spaces. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.SPACE_SEPARATOR) - n = iter.previous(); - // Skip close punctuation. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.END_PUNCTUATION) - n = iter.previous(); - int here = iter.getIndex(); - iter.setIndex(save); - if (n == CharacterIterator.DONE || n == '!' || n == '?') - { - // Communicate location of actual end. - period = here; - break; - } - } - else if (n == '!' || n == '?') - { - // Communicate location of actual end. - period = iter.getIndex(); - break; - } - } - - return iter.getIndex(); - } - - public int previous () - { - // We want to skip over the first sentence end to the second one. - // However, at the end of the string we want the first end. - int here = iter.getIndex(); - period = here; - int first = previous_internal (); - if (here == iter.getEndIndex() || first == DONE) - return first; - iter.setIndex(period); - return previous_internal (); - } - - // This is used for communication between previous and - // previous_internal. - private int period; - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/text/WordBreakIterator.java gcc-3.1/libjava/gnu/gcj/text/WordBreakIterator.java *** gcc-3.0.4/libjava/gnu/gcj/text/WordBreakIterator.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/gnu/gcj/text/WordBreakIterator.java Thu Jan 1 00:00:00 1970 *************** *** 1,224 **** - // Default word BreakIterator. - - /* Copyright (C) 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.text; - - import java.text.BreakIterator; - import java.text.CharacterIterator; - - /** - * @author Tom Tromey - * @date March 22, 1999 - * Written using The Unicode Standard, Version 2.0. - */ - - public class WordBreakIterator extends BaseBreakIterator - { - public Object clone () - { - return new WordBreakIterator (this); - } - - public WordBreakIterator () - { - iter = null; - } - - private WordBreakIterator (WordBreakIterator other) - { - iter = (CharacterIterator) other.iter.clone(); - } - - // Some methods to tell us different properties of characters. - private final boolean isHira (char c) - { - return c >= 0x3040 && c <= 0x309f; - } - private final boolean isKata (char c) - { - return c >= 0x30a0 && c <= 0x30ff; - } - private final boolean isHan (char c) - { - return c >= 0x4e00 && c <= 0x9fff; - } - - public int next () - { - int end = iter.getEndIndex(); - if (iter.getIndex() == end) - return DONE; - - while (iter.getIndex() < end) - { - char c = iter.current(); - if (c == CharacterIterator.DONE) - break; - int type = Character.getType(c); - - char n = iter.next(); - if (n == CharacterIterator.DONE) - break; - - // Break after paragraph separators. - if (type == Character.PARAGRAPH_SEPARATOR - || type == Character.LINE_SEPARATOR) - break; - - // Break between letters and non-letters. - // FIXME: we treat apostrophe as part of a word. This - // is an English-ism. - boolean is_letter = Character.isLetter(c); - if (c != '\'' && ! is_letter && type != Character.NON_SPACING_MARK - && Character.isLetter(n)) - break; - - // Always break after certain symbols, such as punctuation. - // This heuristic is derived from hints in the JCL book and is - // not part of Unicode. It seems to be right, however. - // FIXME: we treat apostrophe as part of a word. This - // is an English-ism. - if (c != '\'' - && (type == Character.DASH_PUNCTUATION - || type == Character.START_PUNCTUATION - || type == Character.END_PUNCTUATION - || type == Character.CONNECTOR_PUNCTUATION - || type == Character.OTHER_PUNCTUATION - || type == Character.MATH_SYMBOL - || type == Character.CURRENCY_SYMBOL - || type == Character.MODIFIER_SYMBOL - || type == Character.OTHER_SYMBOL - || type == Character.FORMAT - || type == Character.CONTROL)) - break; - - boolean is_hira = isHira (c); - boolean is_kata = isKata (c); - boolean is_han = isHan (c); - - // Special case Japanese. - if (! is_hira && ! is_kata && ! is_han - && type != Character.NON_SPACING_MARK - && (isHira (n) || isKata (n) || isHan (n))) - break; - - if (is_hira || is_kata || is_han || is_letter) - { - // Now we need to do some lookahead. We might need to do - // quite a bit of lookahead, so we save our position and - // restore it later. - int save = iter.getIndex(); - // Skip string of non spacing marks. - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.NON_SPACING_MARK) - n = iter.next(); - if (n == CharacterIterator.DONE) - break; - if ((is_hira && ! isHira (n)) - || (is_kata && ! isHira (n) && ! isKata (n)) - || (is_han && ! isHira (n) && ! isHan (n)) - // FIXME: we treat apostrophe as part of a word. This - // is an English-ism. - || (is_letter && ! Character.isLetter(n) && n != '\'')) - break; - iter.setIndex(save); - } - } - - return iter.getIndex(); - } - - public int previous () - { - int start = iter.getBeginIndex(); - if (iter.getIndex() == start) - return DONE; - - while (iter.getIndex() >= start) - { - char c = iter.previous(); - if (c == CharacterIterator.DONE) - break; - - boolean is_hira = isHira (c); - boolean is_kata = isKata (c); - boolean is_han = isHan (c); - boolean is_letter = Character.isLetter(c); - - char n = iter.previous(); - if (n == CharacterIterator.DONE) - break; - iter.next(); - int type = Character.getType(n); - // Break after paragraph separators. - if (type == Character.PARAGRAPH_SEPARATOR - || type == Character.LINE_SEPARATOR) - break; - - // Break between letters and non-letters. - // FIXME: we treat apostrophe as part of a word. This - // is an English-ism. - if (n != '\'' && ! Character.isLetter(n) - && type != Character.NON_SPACING_MARK - && is_letter) - break; - - // Always break after certain symbols, such as punctuation. - // This heuristic is derived from hints in the JCL book and is - // not part of Unicode. It seems to be right, however. - // FIXME: we treat apostrophe as part of a word. This - // is an English-ism. - if (n != '\'' - && (type == Character.DASH_PUNCTUATION - || type == Character.START_PUNCTUATION - || type == Character.END_PUNCTUATION - || type == Character.CONNECTOR_PUNCTUATION - || type == Character.OTHER_PUNCTUATION - || type == Character.MATH_SYMBOL - || type == Character.CURRENCY_SYMBOL - || type == Character.MODIFIER_SYMBOL - || type == Character.OTHER_SYMBOL - || type == Character.FORMAT - || type == Character.CONTROL)) - break; - - // Special case Japanese. - if ((is_hira || is_kata || is_han) - && ! isHira (n) && ! isKata (n) && ! isHan (n) - && type != Character.NON_SPACING_MARK) - break; - - // We might have to skip over non spacing marks to see what's - // on the other side. - if (! is_hira || (! is_letter && c != '\'')) - { - int save = iter.getIndex(); - while (n != CharacterIterator.DONE - && Character.getType(n) == Character.NON_SPACING_MARK) - n = iter.previous(); - iter.setIndex(save); - // This is a strange case: a bunch of non-spacing marks at - // the beginning. We treat the current location as a word - // break. - if (n == CharacterIterator.DONE) - break; - if ((isHira (n) && ! is_hira) - || (isKata (n) && ! is_hira && ! is_kata) - || (isHan (n) && ! is_hira && ! is_han) - // FIXME: we treat apostrophe as part of a word. This - // is an English-ism. - || (! is_letter && c != '\'' && Character.isLetter(n))) - break; - } - } - - return iter.getIndex(); - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/util/EnumerationChain.java gcc-3.1/libjava/gnu/gcj/util/EnumerationChain.java *** gcc-3.0.4/libjava/gnu/gcj/util/EnumerationChain.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/gnu/gcj/util/EnumerationChain.java Thu Jan 1 00:00:00 1970 *************** *** 1,52 **** - /* Copyright (C) 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - package gnu.gcj.util; - - import java.util.Enumeration; - import java.util.NoSuchElementException; - - public class EnumerationChain implements Enumeration - { - private Enumeration first_; - private Enumeration second_; - - public EnumerationChain (Enumeration first, Enumeration second) - { - if (first == null - || second == null) - throw new NullPointerException(); - - first_ = first; - second_ = second; - } - - public synchronized boolean hasMoreElements() - { - if (first_ == null) - return false; - else - return first_.hasMoreElements(); - } - - public synchronized Object nextElement() throws NoSuchElementException - { - while (first_ != null) - { - if (! first_.hasMoreElements()) - { - first_ = second_; - second_ = null; - } - else - return first_.nextElement(); - } - - throw new NoSuchElementException(); - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/Pixmap.java gcc-3.1/libjava/gnu/gcj/xlib/Pixmap.java *** gcc-3.0.4/libjava/gnu/gcj/xlib/Pixmap.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/Pixmap.java Wed Oct 31 00:48:15 2001 *************** public class Pixmap extends Drawable *** 24,30 **** /* FIXME: don't create a new GC all the time. This might actually not be as bad as initially believed. The GC cache of Xlib makes ! this opertation less costly. */ GC gc = new GC(this); gc.putImage(image, 0, 0, 0, 0, image.getWidth(), image.getHeight()); --- 24,30 ---- /* FIXME: don't create a new GC all the time. This might actually not be as bad as initially believed. The GC cache of Xlib makes ! this operation less costly. */ GC gc = new GC(this); gc.putImage(image, 0, 0, 0, 0, image.getWidth(), image.getHeight()); diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/WindowAttributes.java gcc-3.1/libjava/gnu/gcj/xlib/WindowAttributes.java *** gcc-3.0.4/libjava/gnu/gcj/xlib/WindowAttributes.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/WindowAttributes.java Sat Mar 9 17:20:49 2002 *************** public class WindowAttributes *** 45,52 **** { WindowAttributes attributes = (WindowAttributes) super.clone(); // In case of an exception before the stucture is copied. ! attributes.in = 0; ! attributes.out = 0; // FIXME: do anything else? --- 45,52 ---- { WindowAttributes attributes = (WindowAttributes) super.clone(); // In case of an exception before the stucture is copied. ! attributes.in = null; ! attributes.out = null; // FIXME: do anything else? *************** public class WindowAttributes *** 77,89 **** * Reference to XWindowAttribute structure containing attributes * read from a window. */ ! RawData in = 0; /** * Reference to XSetWindowAttribute structure containing attributes * to be applied to a window. */ ! RawData out = 0; long mask; --- 77,89 ---- * Reference to XWindowAttribute structure containing attributes * read from a window. */ ! RawData in = null; /** * Reference to XSetWindowAttribute structure containing attributes * to be applied to a window. */ ! RawData out = null; long mask; diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/XColor.java gcc-3.1/libjava/gnu/gcj/xlib/XColor.java *** gcc-3.0.4/libjava/gnu/gcj/xlib/XColor.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/XColor.java Sat Mar 9 17:20:49 2002 *************** public final class XColor *** 38,42 **** public final native byte getFlags(); public final native long getPixelValue(); ! RawData structure = 0; } --- 38,42 ---- public final native byte getFlags(); public final native long getPixelValue(); ! RawData structure = null; } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/XException.java gcc-3.1/libjava/gnu/gcj/xlib/XException.java *** gcc-3.0.4/libjava/gnu/gcj/xlib/XException.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/XException.java Wed Oct 31 00:48:15 2001 *************** details. */ *** 9,15 **** package gnu.gcj.xlib; /** ! * Runtime exception that occured during an Xlib opertation. * * @author Rolf W. Rasmussen */ --- 9,15 ---- package gnu.gcj.xlib; /** ! * Runtime exception that occurred during an Xlib operation. * * @author Rolf W. Rasmussen */ diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/XImage.java gcc-3.1/libjava/gnu/gcj/xlib/XImage.java *** gcc-3.0.4/libjava/gnu/gcj/xlib/XImage.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/XImage.java Sat Mar 9 17:20:49 2002 *************** public class XImage *** 141,147 **** protected native void finalize(); boolean ownsData = false; ! RawData structure = 0; public final native int getWidth(); public final native int getHeight(); --- 141,147 ---- protected native void finalize(); boolean ownsData = false; ! RawData structure = null; public final native int getWidth(); public final native int getHeight(); *************** public class XImage *** 188,193 **** --- 188,196 ---- { case ZPIXMAP_FORMAT: format = "ZPixmapFormat"; + break; + default: + format = "unknown"; } String imageByteOrder; *************** public class XImage *** 198,203 **** --- 201,209 ---- break; case MOST_SIGNIFICANT_B_FIRST_ORDER: imageByteOrder = "mostSignificantByteFirst"; + break; + default: + imageByteOrder = "unknwon"; } String bitmapBitOrder; *************** public class XImage *** 208,213 **** --- 214,222 ---- break; case MOST_SIGNIFICANT_B_FIRST_ORDER: bitmapBitOrder = "mostSignificantBitFirst"; + break; + default: + bitmapBitOrder = "unknown"; } return getClass().getName() + "[" + format + diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/natDrawable.cc gcc-3.1/libjava/gnu/gcj/xlib/natDrawable.cc *** gcc-3.0.4/libjava/gnu/gcj/xlib/natDrawable.cc Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/natDrawable.cc Mon Mar 26 07:05:32 2001 *************** gnu::gcj::xlib::Drawable::getBounds(java *** 59,65 **** switch (status) { case BadDrawable: ! JvThrow(new XException(display, status)); default: ; // All OK, NOP. } --- 59,65 ---- switch (status) { case BadDrawable: ! throw new XException(display, status); default: ; // All OK, NOP. } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/natFont.cc gcc-3.1/libjava/gnu/gcj/xlib/natFont.cc *** gcc-3.0.4/libjava/gnu/gcj/xlib/natFont.cc Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/natFont.cc Mon Mar 26 07:05:32 2001 *************** gnu::gcj::RawData* gnu::gcj::xlib::Font: *** 29,35 **** XFontStruct* fontStruct = XLoadQueryFont(dpy, cName); if (fontStruct == 0) { ! JvThrow(new XException(JvNewStringLatin1("font not found"))); } return reinterpret_cast(fontStruct); --- 29,35 ---- XFontStruct* fontStruct = XLoadQueryFont(dpy, cName); if (fontStruct == 0) { ! throw new XException(JvNewStringLatin1("font not found")); } return reinterpret_cast(fontStruct); diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/natWMSizeHints.cc gcc-3.1/libjava/gnu/gcj/xlib/natWMSizeHints.cc *** gcc-3.0.4/libjava/gnu/gcj/xlib/natWMSizeHints.cc Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/natWMSizeHints.cc Mon Mar 26 07:05:32 2001 *************** void gnu::gcj::xlib::WMSizeHints::init(W *** 23,29 **** if (hints == 0) { jstring errorMessage = JvNewStringLatin1("XAllocSizeHints failed"); ! JvThrow(new java::lang::OutOfMemoryError(errorMessage)); } if (copyFrom != 0) --- 23,29 ---- if (hints == 0) { jstring errorMessage = JvNewStringLatin1("XAllocSizeHints failed"); ! throw new java::lang::OutOfMemoryError(errorMessage); } if (copyFrom != 0) diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/natWindowAttributes.cc gcc-3.1/libjava/gnu/gcj/xlib/natWindowAttributes.cc *** gcc-3.0.4/libjava/gnu/gcj/xlib/natWindowAttributes.cc Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/natWindowAttributes.cc Mon Mar 26 07:05:32 2001 *************** void gnu::gcj::xlib::WindowAttributes::i *** 31,37 **** Status status = XGetWindowAttributes(dpy, win, attributesIn); if ((status == BadDrawable) | (status == BadWindow)) ! JvThrow(new XException(display, status)); } --- 31,37 ---- Status status = XGetWindowAttributes(dpy, win, attributesIn); if ((status == BadDrawable) | (status == BadWindow)) ! throw new XException(display, status); } diff -Nrc3pad gcc-3.0.4/libjava/gnu/gcj/xlib/natXImage.cc gcc-3.1/libjava/gnu/gcj/xlib/natXImage.cc *** gcc-3.0.4/libjava/gnu/gcj/xlib/natXImage.cc Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/gnu/gcj/xlib/natXImage.cc Mon Mar 26 07:05:32 2001 *************** void gnu::gcj::xlib::XImage::init(Visual *** 40,46 **** if (ximage == 0) { jstring errorMessage = JvNewStringLatin1("XCreateImage failed"); ! JvThrow(new java::lang::OutOfMemoryError(errorMessage)); } bool reinitialize = false; --- 40,46 ---- if (ximage == 0) { jstring errorMessage = JvNewStringLatin1("XCreateImage failed"); ! throw new java::lang::OutOfMemoryError(errorMessage); } bool reinitialize = false; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/awt/BitMaskExtent.java gcc-3.1/libjava/gnu/java/awt/BitMaskExtent.java *** gcc-3.0.4/libjava/gnu/java/awt/BitMaskExtent.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/awt/BitMaskExtent.java Tue Jan 22 22:39:48 2002 *************** *** 0 **** --- 1,79 ---- + /* Copyright (C) 2000, 2002 Free Software Foundation + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.awt; + + /** + * Simple transparent utility class that can be used to perform bit + * mask extent calculations. + */ + public final class BitMaskExtent + { + /** The number of the least significant bit of the bit mask extent. */ + public byte leastSignificantBit; + + /** The number of bits in the bit mask extent. */ + public byte bitWidth; + + /** + * Set the bit mask. This will calculate and set the leastSignificantBit + * and bitWidth fields. + * + * @see #leastSignificantBit + * @see #bitWidth + */ + public void setMask(long mask) + { + leastSignificantBit = 0; + bitWidth = 0; + if (mask == 0) return; + long shiftMask = mask; + for (; (shiftMask&1) == 0; shiftMask >>>=1) leastSignificantBit++; + for (; (shiftMask&1) != 0; shiftMask >>>=1) bitWidth++; + + if (shiftMask != 0) + throw new IllegalArgumentException("mask must be continuous"); + } + + /** + * Calculate the bit mask based on the values of the + * leastSignificantBit and bitWidth fields. + */ + public long toMask() + { + return ((1< + */ + public class ComponentDataBlitOp implements RasterOp + { + public static ComponentDataBlitOp INSTANCE = new ComponentDataBlitOp(); + + public WritableRaster filter(Raster src, WritableRaster dest) + { + if (dest == null) + dest = createCompatibleDestRaster(src); + + DataBuffer srcDB = src.getDataBuffer(); + DataBuffer destDB = dest.getDataBuffer(); + + ComponentSampleModel srcSM = (ComponentSampleModel) src.getSampleModel(); + ComponentSampleModel destSM = (ComponentSampleModel) dest.getSampleModel(); + + + // Calculate offset to data in the underlying arrays: + + int srcScanlineStride = srcSM.getScanlineStride(); + int destScanlineStride = destSM.getScanlineStride(); + int srcX = src.getMinX() - src.getSampleModelTranslateX(); + int srcY = src.getMinY() - src.getSampleModelTranslateY(); + int destX = dest.getMinX() - dest.getSampleModelTranslateX(); + int destY = dest.getMinY() - dest.getSampleModelTranslateY(); + + int numBands = srcSM.getNumBands(); + + /* We can't use getOffset(x, y) from the sample model since we + don't want the band offset added in. */ + + int srcOffset = + numBands*srcX + srcScanlineStride*srcY + // from sample model + srcDB.getOffset(); // from data buffer + + int destOffset = + numBands*destX + destScanlineStride*destY + // from sample model + destDB.getOffset(); // from data buffer + + // Determine how much, and how many times to blit. + + int rowSize = src.getWidth()*numBands; + int h = src.getHeight(); + + if ((rowSize == srcScanlineStride) && + (rowSize == destScanlineStride)) + { + // collapse scan line blits to one large blit. + rowSize *= h; + h = 1; + } + + + // Do blitting + + Object srcArray = Buffers.getData(srcDB); + Object destArray = Buffers.getData(destDB); + + for (int yd = 0; yd + */ + public class GLightweightPeer implements LightweightPeer + { + public static final GLightweightPeer INSTANCE = new GLightweightPeer(); + + public GLightweightPeer() {} + + // -------- java.awt.peer.ComponentPeer implementation: + + public int checkImage(Image img, int width, int height, ImageObserver o) + { + return 0; + } + + public Image createImage(ImageProducer prod) + { + return null; + } + + public Image createImage(int width, int height) + { + return null; + } + + public void disable() {} + + public void dispose() {} + + public void enable() {} + + public GraphicsConfiguration getGraphicsConfiguration() + { + return null; + } + + public FontMetrics getFontMetrics(Font f) + { + return null; + } + + public Graphics getGraphics() + { + return null; + } + + public Point getLocationOnScreen() + { + return null; + } + + public Dimension getMinimumSize() + { + return null; + } + + public Dimension getPreferredSize() + { + return null; + } + + public Toolkit getToolkit() + { + return null; + } + + public void handleEvent(AWTEvent e) {} + + public void hide() {} + + public boolean isFocusTraversable() + { + return false; + } + + public Dimension minimumSize() + { + return null; + } + + public Dimension preferredSize() + { + return null; + } + + public void paint(Graphics graphics) {} + + public boolean prepareImage(Image img, int width, int height, + ImageObserver o) + { + return false; + } + + public void print(Graphics graphics) {} + + public void repaint(long tm, int x, int y, int width, int height) {} + + public void requestFocus() {} + + public void reshape(int x, int y, int width, int height) {} + + public void setBackground(Color color) {} + + public void setBounds(int x, int y, int width, int height) {} + + public void setCursor(Cursor cursor) {} + + public void setEnabled(boolean enabled) {} + + public void setEventMask(long eventMask) {} + + public void setFont(Font font) {} + + public void setForeground(Color color) {} + + public void setVisible(boolean visible) {} + + public void show() {} + + public ColorModel getColorModel () + { + return null; + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/beans/BeanInfoEmbryo.java gcc-3.1/libjava/gnu/java/beans/BeanInfoEmbryo.java *** gcc-3.0.4/libjava/gnu/java/beans/BeanInfoEmbryo.java Fri May 19 17:55:28 2000 --- gcc-3.1/libjava/gnu/java/beans/BeanInfoEmbryo.java Sun Mar 24 21:32:21 2002 *************** *** 1,5 **** /* gnu.java.beans.BeanInfoEmbryo ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* gnu.java.beans.BeanInfoEmbryo ! Copyright (C) 1998, 2002 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.beans; *************** public class BeanInfoEmbryo { *** 119,132 **** } public boolean hasMethod(MethodDescriptor m) { ! for(int i=0;ignu/gcj/convert/UnicodeData-3.0.0.txt, by some + * perl scripts. This Unicode definition file can be found on the + * http://www.unicode.org website. + * JDK 1.4 uses Unicode version 3.0.0. + * + * The data is stored as string constants, but Character will convert these + * Strings to their respective char[] components. The field + * BLOCKS stores the offset of a block of 2SHIFT + * characters within DATA. The DATA field, in turn, stores + * information about each character in the low order bits, and an offset + * into the attribute tables UPPER, LOWER, + * NUM_VALUE, and DIRECTION. Notice that the + * attribute tables are much smaller than 0xffff entries; as many characters + * in Unicode share common attributes. Finally, there is a listing for + * TITLE exceptions (most characters just have the same + * title case as upper case). + * + * @author scripts/unicode-muncher.pl (written by Jochen Hoenicke, + * Eric Blake) + * @see Character + */ + public interface CharData + { + /** + * The Unicode definition file that was parsed to build this database. + */ + String SOURCE = "gnu/gcj/convert/UnicodeData-3.0.0.txt"; + + /** + * The character shift amount to look up the block offset. In other words, + * (char) (BLOCKS.value[ch >> SHIFT] + ch) is the index where + * ch is described in DATA. + */ + int SHIFT = 5; + + /** + * The mapping of character blocks to their location in DATA. + * Each entry has been adjusted so that the 16-bit sum with the desired + * character gives the actual index into DATA. + */ + String BLOCKS + = "\u01c2\u01c2\u01c1\u012c\u012b\u01a0\u01f8\u027e\u0201\u0290\u01b7" + + "\u02c9\u0157\u02a9\u023f\u01b8\u0101\u0257\u02f9\u02f9\u0370\u0363" + + "\ufe8f\u033e\uff85\uff65\ufdb5\ufda1\uffbd\u02be\uffbe\uffe9\ufea8" + + "\uff2e\u022f\ufea1\uff9d\ufe61\uffa9\ufb20\u00c3\u010d\u00fe\ufb61" + + "\ufb5a\u0105\u0103\u00f8\ufe8b\u0223\u0258\u01c1\u01f6\u01d6\ufee1" + + "\u0223\ufdaa\ufb55\u0163\ufe63\u00f6\u00fd\ufe03\ufde3\ufdc3\ufda3" + + "\ufd83\ufd63\ufd43\ufd23\ufd03\ufce3_J\u00a5\u0133\ufe08" + + "]\u014f\u01a2\uf669\u0123\u0122\uf8c1\ufe50\u0102\u0101\ufa43" + + "\ufc88\ufea7\u00c0\ufca1\ufb8f\uf47d\u0099\ufb11\ufe1a\ufd22\ufb29" + + "5\uf3b9\ufe51\ufcc8\uffb5\uf339\ufa92\uff85\uff35\ufa4e\uf766" + + "\uff25\ufad1\ufb63\ufc34\ufedf\uf763\ufcaa\ufa82\ufdb9\uf6e3\ufe3f" + + "\ufcc1\ufe49\uf7eb\uf70f\uf2e8\ufd99\uf5e3\uf964\ufbfc\ufd91\uf563" + + "\uf543\uf43c\uf436\uef6b\uf864\uf844\ufc52\uf804\uf7e4\ufc09\uf7a4" + + "\uee9c\ufb8a\uf744\uf7f4\uf704\uf7c4\uf78c\uf46b\uf4cc\uf72c\uf644" + + "\uf3fb\uf647\uf243\uf5c4\uf5a4\ueca1\uf563\uf544\uf524\uf504\uf4e4" + + "\uf4c4\uf4a4\uf484\uf464\uf444\uf424\uf404\uf3e4\uf3c4\uf3a4\uf384" + + "\uf364\uf344\uf324\uf283\uf771\uf2c4\uf2a4\uf731\ueec3\ueea3\uee83" + + "\uee63\uf1e4\uf49c\uf53f\ued49\uf2d1\uf144\ue8ed\ue81e\uf0e4\uf591" + + "\ued03\uece3\uecc3\ueca3\uec83\uec63\uec43\uec23\uec03\uebe3\uebc3" + + "\ueba3\ueb83\ueb63\ueb43\ueb23\ueb03\ueae3\ueac3\ueaa3\uea83\uea63" + + "\uea43\uea23\uea03\ue9e3\ue9c3\ue9a3\ue983\ue963\ue943\ue923\ue903" + + "\ue8e3\ue8c3\ue8a3\ue883\ue863\ue843\ue823\ue803\ue7e3\ue501\ue4e1" + + "\ue4c1\ue4a1\uefd1\ue461\ue441\ue427\uef81\uef51\uef51\uef51\uef51" + + "\uef41\ue1ad\uef40\uef40\uef40\ue1e0\ue37f\uef00\ue9d3\uebe5\ue4df" + + "\ueece\uef5f\ue490\uef3f\ueee3\uef76\uee6e\uef6a\uef77\uef72\uee8b" + + "\uefcd\uee77\uee1f\uee21\uef5f\uefd7\uee90\uefcd\uefdb\uef63\ue223" + + "\ue203\ue1e3\ued25\ued37\ued13\uef16\uef02\ued41\ued37\ued2d\uec25" + + "\uec05\uebe5\uebc5\uebc8\uea76\ueb63\ueb66\ue9b0\ueb05\ueae5\ue9e3" + + "\udf43\udf23\udf03\udee3\ue90a\uea1d\ueb52\ueb49\ueb3f\ueadf\ude03" + + "\udde3\ue925\ue905\ue8e5\ue8c5\ue8a5\ue885\ue865\ue845\udcc3\udca3" + + "\udc83\udc63\udc43\udc23\udc03\udbe3\udbc3\udba3\udb83\udb63\udb43" + + "\udb23\udb03\udae3\udac3\udaa3\uda83\uda63\uda43\uda23\uda03\ud9e3" + + "\ud9c3\ud9a3\ud983\ud963\ud943\ud923\ud903\ud8e3\ud8c3\ud8a3\ud883" + + "\ud863\ud843\ud823\ud803\ud7e3\ud7c3\ud7a3\ud783\ud763\ue2ab\ue285" + + "\ue265\ue26a\ue225\ue205\ue1e5\ue1c5\ue1a5\ue185\ue188\udd89\ue3a2" + + "\udfcd\ud923\ud904\ue342\ud8c3\ud8a4\udcd1\udcac\ud67b\ud824\ud804" + + "\ue262\ucede\ud403\ud3e3\ue110\ue0e3\ue1c5\ue0b1\ue0b1\ue158\udf11" + + "\ue02e\ue00d\udfed\udfcd\ude66\udf8d\udf6d\udf4f\udf2e\ud564\ud544" + + "\ud524\ud504\ud4e4\ud4c4\ud4a4\ud484\ud464\ud444\ud424\ud404\ud3e4" + + "\ud3c4\ud3a4\ud384\ud364\ud344\ud324\ud304\ud2e4\ud2c4\ud2a4\ud284" + + "\ud264\ud244\ud224\ud204\ud1e4\ud1c4\ud1a4\ud184\ud164\ud144\ud124" + + "\ud104\ud0e4\ud0c4\ud0a4\ud084\ud064\ud044\ud024\ud004\ucfe4\ucfc4" + + "\ucfa4\ucf84\ucf64\ucf44\ucf24\ucf04\ucee4\ucec4\ucea4\uce84\uce64" + + "\uce44\uce24\uce04\ucde4\ucdc4\ucda4\ucd84\ucd64\ucd44\ucd24\ucd04" + + "\ucce4\uccc4\ucca4\ucc84\ucc64\ucc44\ucc24\ucc04\ucbe4\ucbc4\ucba4" + + "\ucb84\ucb64\ucb44\ucb24\ucb04\ucae4\ucac4\ucaa4\uca84\uca64\uca44" + + "\uca24\uca04\uc9e4\uc9c4\uc9a4\uc984\uc964\uc944\uc924\uc904\uc8e4" + + "\uc8c4\uc8a4\uc884\uc864\uc844\uc824\uc804\uc7e4\uc7c4\uc7a4\uc784" + + "\uc764\uc744\uc724\uc704\uc6e4\uc6c4\uc6a4\uc684\uc664\uc644\uc624" + + "\uc604\uc5e4\uc5c4\uc5a4\uc584\uc564\uc544\uc524\uc504\uc4e4\uc4c4" + + "\uc4a4\uc484\uc464\uc444\uc424\uc404\uc3e4\uc3c4\uc3a4\uc384\uc364" + + "\uc344\uc324\uc304\uc2e4\uc2c4\uc2a4\uc284\uc264\uc244\uc224\uc204" + + "\uc1e4\uc1c4\uc1a4\uc184\uc164\uc144\uc124\uc104\uc0e4\uc0c4\uc0a4" + + "\uc084\uc064\uc044\uc024\uc004\ubfe4\ubfc4\ubfa4\ubf84\ubf64\ubf44" + + "\ubf24\ubf04\ubee4\ubec4\ubea4\ube84\ube64\ube44\ube24\ube04\ubde4" + + "\ubdc4\ubda4\ubd84\ubd64\ubd44\ubd24\ubd04\ubce4\ubcc4\ubca4\ubc84" + + "\ubc64\ubc44\ubc24\ubc04\ubbe4\ub2e0\ub803\ub7e3\ubb64\ubb44\ubb24" + + "\ubb04\ubae4\ubac4\ubaa4\uba84\uba64\uba44\uba24\uba04\ub9e4\ub9c4" + + "\ub9a4\ub984\ub964\ub944\ub924\ub904\ub8e4\ub8c4\ub8a4\ub884\ub864" + + "\ub844\ub824\ub804\ub7e4\ub7c4\ub7a4\ub784\ub764\ub744\ub724\ub704" + + "\ub6e4\ub6c4\ub6a4\ub684\ub664\ub644\ub624\ub604\ub5e4\ub5c4\ub5a4" + + "\ub584\ub564\ub544\ub524\ub504\ub4e4\ub4c4\ub4a4\ub484\ub464\ub444" + + "\ub424\ub404\ub3e4\ub3c4\ub3a4\ub384\ub364\ub344\ub324\ub304\ub2e4" + + "\ub2c4\ub2a4\ub284\ub264\ub244\ub224\ub204\ub1e4\ub1c4\ub1a4\ub184" + + "\ub164\ub144\ub124\ub104\ub0e4\ub0c4\ub0a4\ub084\ub064\ub044\ub024" + + "\ub004\uafe4\uafc4\uafa4\uaf84\uaf64\uaf44\uaf24\uaf04\uaee4\uaec4" + + "\uaea4\uae84\uae64\uae44\uae24\uae04\uade4\uadc4\uada4\uad84\uad64" + + "\uad44\uad24\uad04\uace4\uacc4\uaca4\uac84\uac64\uac44\uac24\uac04" + + "\uabe4\uabc4\uaba4\uab84\uab64\uab44\uab24\uab04\uaae4\uaac4\uaaa4" + + "\uaa84\uaa64\uaa44\uaa24\uaa04\ua9e4\ua9c4\ua9a4\ua984\ua964\ua944" + + "\ua924\ua904\ua8e4\ua8c4\ua8a4\ua884\ua864\ua844\ua824\ua804\ua7e4" + + "\ua7c4\ua7a4\ua784\ua764\ua744\ua724\ua704\ua6e4\ua6c4\ua6a4\ua684" + + "\ua664\ua644\ua624\ua604\ua5e4\ua5c4\ua5a4\ua584\ua564\ua544\ua524" + + "\ua504\ua4e4\ua4c4\ua4a4\ua484\ua464\ua444\ua424\ua404\ua3e4\ua3c4" + + "\ua3a4\ua384\ua364\ua344\ua324\ua304\ua2e4\ua2c4\ua2a4\ua284\ua264" + + "\ua244\ua224\ua204\ua1e4\ua1c4\ua1a4\ua184\ua164\ua144\ua124\ua104" + + "\ua0e4\ua0c4\ua0a4\ua084\ua064\ua044\ua024\ua004\u9fe4\u9fc4\u9fa4" + + "\u9f84\u9f64\u9f44\u9f24\u9f04\u9ee4\u9ec4\u9ea4\u9e84\u9e64\u9e44" + + "\u9e24\u9e04\u9de4\u9dc4\u9da4\u9d84\u9d64\u9d44\u9d24\u9d04\u9ce4" + + "\u9cc4\u9ca4\u9c84\u9c64\u9c44\u9c24\u9c04\u9be4\u9bc4\u9ba4\u9b84" + + "\u9b64\u9b44\u9b24\u9b04\u9ae4\u9ac4\u9aa4\u9a84\u9a64\u9a44\u9a24" + + "\u9a04\u99e4\u99c4\u99a4\u9984\u9964\u9944\u9924\u9904\u98e4\u98c4" + + "\u98a4\u9884\u9864\u9844\u9824\u9804\u97e4\u97c4\u97a4\u9784\u9764" + + "\u9744\u9724\u9704\u96e4\u96c4\u96a4\u9684\u9664\u9644\u9624\u9604" + + "\u95e4\u95c4\u95a4\u9584\u9564\u9544\u9524\u9504\u94e4\u94c4\u94a4" + + "\u9484\u9464\u9444\u9424\u9404\u93e4\u93c4\u93a4\u9384\u9364\u9344" + + "\u9324\u9304\u92e4\u92c4\u92a4\u9284\u9264\u9244\u9224\u9204\u91e4" + + "\u91c4\u91a4\u9184\u9164\u9144\u9124\u9104\u90e4\u90c4\u90a4\u9084" + + "\u9064\u9044\u9024\u9004\u8fe4\u8fc4\u8fa4\u8f84\u8f64\u8f44\u8f24" + + "\u8f04\u8ee4\u8ec4\u8ea4\u8e84\u8e64\u8e44\u8e24\u8e04\u8de4\u8dc4" + + "\u8da4\u8d84\u8d64\u8d44\u8d24\u8d04\u8ce4\u8cc4\u8ca4\u8c84\u8c64" + + "\u8c44\u8c24\u8c04\u8be4\u8bc4\u8ba4\u8b84\u8b64\u8b44\u8b24\u8b04" + + "\u8ae4\u8ac4\u8aa4\u8a84\u8a64\u8a44\u8a24\u8a04\u89e4\u89c4\u89a4" + + "\u8984\u8964\u8944\u8924\u8904\u88e4\u88c4\u88a4\u8884\u8864\u8844" + + "\u8824\u8804\u87e4\u87c4\u87a4\u8784\u8764\u8744\u8724\u8704\u86e4" + + "\u86c4\u86a4\u8684\u8664\u8644\u8624\u8604\u85e4\u85c4\u85a4\u8584" + + "\u8564\u8544\u8524\u8504\u84e4\u84c4\u84a4\u8484\u8464\u8444\u8424" + + "\u8404\u83e4\u83c4\u83a4\u8384\u8364\u8344\u8324\u8304\u82e4\u82c4" + + "\u82a4\u8284\u8264\u8244\u8224\u8204\u81e4\u81c4\u81a4\u8184\u8164" + + "\u8144\u8124\u8104\u80e4\u80c4\u80a4\u8084\u8064\u8044\u8024\u8004" + + "\u7fe4\u7fc4\u7fa4\u7f84\u7f64\u7f44\u7f24\u7f04\u7ee4\u7ec4\u7ea4" + + "\u7e84\u7e64\u7e44\u7e24\u7e04\u7de4\u7dc4\u7da4\u7d84\u7d64\u7d44" + + "\u7d24\u7d04\u7ce4\u7cc4\u7ca4\u7c84\u7c64\u7c44\u7c24\u7c04\u7be4" + + "\u7bc4\u7ba4\u7b84\u7b64\u7b44\u7b24\u7b04\u7ae4\u7ac4\u7aa4\u7a84" + + "\u7a64\u7a44\u7a24\u7a04\u79e4\u79c4\u79a4\u7984\u7964\u7944\u7924" + + "\u7904\u78e4\u78c4\u78a4\u7884\u7864\u7844\u7824\u7804\u77e4\u77c4" + + "\u77a4\u7784\u7764\u7744\u7724\u7704\u76e4\u76c4\u76a4\u7684\u7664" + + "\u7644\u7624\u7604\u75e4\u75c4\u75a4\u7584\u7564\u7544\u7524\u7504" + + "\u74e4\u74c4\u74a4\u7484\u7464\u7444\u7424\u7404\u73e4\u73c4\u73a4" + + "\u7384\u7364\u7344\u7324\u7304\u72e4\u72c4\u72a4\u7284\u7264\u7244" + + "\u7224\u7204\u71e4\u71c4\u71a4\u7184\u7164\u7144\u7124\u7104\u70e4" + + "\u70c4\u70a4\u7084\u7064\u7044\u7024\u7004\u6fe4\u6fc4\u6fa4\u6f84" + + "\u6f64\u6f44\u6f24\u6f04\u6ee4\u6ec4\u6ea4\u6e84\u6e64\u6e44\u6e24" + + "\u6e04\u6de4\u6dc4\u6da4\u6d84\u6d64\u6d44\u6d24\u6d04\u6ce4\u6cc4" + + "\u6ca4\u6c84\u6c64\u6c44\u6c24\u6c04\u6be4\u6bc4\u6ba4\u6b84\u6b64" + + "\u6b44\u6b24\u6b04\u6ae4\u6ac4\u6aa4\u6a84\u6a64\u6a44\u6a24\u6a04" + + "\u69e4\u60f0\u6603\u65e3\u6964\u6944\u6924\u6904\u68e4\u68c4\u68a4" + + "\u6884\u6864\u6844\u6824\u6804\u67e4\u67c4\u67a4\u6784\u6764\u6744" + + "\u6724\u6704\u66e4\u66c4\u66a4\u6684\u6664\u6644\u6624\u6604\u65e4" + + "\u65c4\u65a4\u6584\u6564\u6544\u6524\u6504\u6b20\u6ddb\u6e96\u60e3" + + "\u60c3\u60a3\u6083\u6063\u6043\u6023\u6003\u5fe3\u5fc3\u5fa3\u5f83" + + "\u5f63\u5f43\u5f23\u5f03\u5ee3\u5ec3\u5ea3\u5e83\u5e63\u5e43\u5e23" + + "\u5e03\u5de3\u5dc3\u5da3\u5d83\u5d63\u5d43\u5d23\u5d03\u5ce3\u5cc3" + + "\u5ca3\u5c83\u5c63\u5c43\u5c23\u5c03\u5be3\u5bc3\u5ba3\u5b83\u5b63" + + "\u5b43\u5b23\u5b03\u5ae3\u5ac3\u5aa3\u5a83\u5a63\u5a43\u5a23\u5a03" + + "\u59e3\u5d64\u5d44\u5d24\u5d04\u5ce4\u5cc4\u5ca4\u5c84\u5c64\u5c44" + + "\u5c24\u5c04\u5be4\u5bc4\u5ba4\u5b84\u5b64\u5b44\u5b24\u5b04\u5ae4" + + "\u5ac4\u5aa4\u5a84\u5a64\u5a44\u5a24\u5a04\u59e4\u59c4\u59a4\u5984" + + "\u5964\u5944\u5924\u5904\u58e4\u58c4\u58a4\u5884\u5864\u5844\u5824" + + "\u5804\u57e4\u57c4\u57a4\u5784\u5764\u5744\u5724\u5704\u56e4\u56c4" + + "\u56a4\u5684\u5664\u5644\u5624\u5604\u55e4\u55c4\u55a4\u5584\u5564" + + "\u5544\u5524\u5504\u54e4\u54c4\u54a4\u5484\u5464\u5444\u5424\u5404" + + "\u53e4\u53c4\u53a4\u5384\u5364\u5344\u5324\u5304\u52e4\u52c4\u52a4" + + "\u5284\u5264\u5244\u5224\u5204\u51e4\u51c4\u51a4\u5184\u5164\u5144" + + "\u5124\u5104\u50e4\u50c4\u50a4\u5084\u5064\u5044\u5024\u5004\u4fe4" + + "\u4fc4\u4fa4\u4f84\u4f64\u4f44\u4f24\u4f04\u4ee4\u4ec4\u4ea4\u4e84" + + "\u4e64\u4e44\u4e24\u4e04\u4de4\u4dc4\u4da4\u4d84\u4d64\u4d44\u4d24" + + "\u4d04\u4ce4\u4cc4\u4ca4\u4c84\u4c64\u4c44\u4c24\u4c04\u4be4\u4bc4" + + "\u4ba4\u4b84\u4b64\u4b44\u4b24\u4b04\u4ae4\u4ac4\u4aa4\u4a84\u4a64" + + "\u4a44\u4a24\u4a04\u49e4\u49c4\u49a4\u4984\u4964\u4944\u4924\u4904" + + "\u48e4\u48c4\u48a4\u4884\u4864\u4844\u4824\u4804\u47e4\u47c4\u47a4" + + "\u4784\u4764\u4744\u4724\u4704\u46e4\u46c4\u46a4\u4684\u4664\u4644" + + "\u4624\u4604\u45e4\u45c4\u45a4\u4584\u4564\u4544\u4524\u4504\u44e4" + + "\u44c4\u44a4\u4484\u4464\u4444\u4424\u4404\u43e4\u43c4\u43a4\u4384" + + "\u4364\u4344\u4324\u4304\u42e4\u42c4\u42a4\u4284\u4264\u4244\u4224" + + "\u4204\u41e4\u41c4\u41a4\u4184\u4164\u4144\u4124\u4104\u40e4\u40c4" + + "\u40a4\u4084\u4064\u4044\u4024\u4004\u3fe4\u3fc4\u3fa4\u3f84\u3f64" + + "\u3f44\u3f24\u3f04\u3ee4\u3ec4\u3ea4\u3e84\u3e64\u3e44\u3e24\u3e04" + + "\u3de4\u3dc4\u3da4\u3d84\u3d64\u3d44\u3d24\u3d04\u3ce4\u3cc4\u3ca4" + + "\u3c84\u3c64\u3c44\u3c24\u3c04\u3be4\u3bc4\u3ba4\u3b84\u3b64\u3b44" + + "\u3b24\u3b04\u3ae4\u3ac4\u3aa4\u3a84\u3a64\u3a44\u3a24\u3a04\u39e4" + + "\u39c4\u39a4\u3984\u3964\u3944\u3924\u3904\u38e4\u38c4\u38a4\u3884" + + "\u3864\u3844\u3824\u3804\u37e4\u37c4\u37a4\u3784\u3764\u3744\u3724" + + "\u3704\u36e4\u36c4\u36a4\u3684\u3664\u3644\u3624\u3604\u35e4\u35c4" + + "\u35a4\u3584\u3564\u3544\u3524\u3504\u34e4\u34c4\u34a4\u3484\u3464" + + "\u3444\u3424\u3404\u33e4\u33c4\u33a4\u3384\u3364\u3344\u3324\u3304" + + "\u32e4\u32c4\u32a4\u3284\u3264\u3244\u3224\u3204\u31e4\u28f2\u2e03" + + "\u2de3\u3c25\u3c05\u3be5\u3bc5\u3ba5\u3b85\u3b65\u3b45\u3b25\u3b05" + + "\u3ae5\u3ac5\u3aa5\u3a85\u3a65\u3a45\u3a25\u3a05\u39e5\u39c5\u39a5" + + "\u3985\u3965\u3945\u3925\u3905\u38e5\u38c5\u38a5\u3885\u3865\u3845" + + "\u3825\u3805\u37e5\u37c5\u37a5\u3785\u3765\u3745\u3725\u3705\u36e5" + + "\u36c5\u36a5\u3685\u3665\u3645\u3625\u3605\u35e5\u35c5\u35a5\u3585" + + "\u3565\u3545\u3525\u3505\u34e5\u34c5\u34a5\u3485\u3465\u3445\u3445" + + "\u3425\u3405\u33e5\u33c5\u33a5\u3385\u3365\u3345\u3325\u3305\u32e5" + + "\u32c5\u32a5\u3285\u3265\u3245\u3225\u3205\u31e5\u31c5\u31a5\u3185" + + "\u3165\u3145\u3125\u3105\u30e5\u30c5\u30a5\u3085\u3065\u3045\u3025" + + "\u3005\u2fe5\u2fc5\u2fa5\u2f85\u2f65\u2f45\u2f25\u2f05\u2ee5\u2ec5" + + "\u2ea5\u2e85\u2e65\u2e45\u2e25\u2e05\u2de5\u2dc5\u2da5\u2d85\u2d65" + + "\u2d45\u2d25\u2d05\u2ce5\u2cc5\u2ca5\u2c85\u2c65\u2c45\u2c25\u2c05" + + "\u2be5\u2bc5\u2ba5\u2b85\u2b65\u2b45\u2b25\u2b05\u2ae5\u2ac5\u2aa5" + + "\u2a85\u2a65\u2a45\u2a25\u2a05\u29e5\u29c5\u29a5\u2985\u2965\u2945" + + "\u2925\u2905\u28e5\u28c5\u28a5\u2885\u2865\u2845\u2825\u2805\u27e5" + + "\u27c5\u27a5\u2785\u2765\u2745\u2725\u2705\u26e5\u26c5\u26a5\u2685" + + "\u2665\u2645\u2625\u2605\u25e5\u25c5\u25a5\u2585\u2565\u2545\u2525" + + "\u2505\u24e5\u24c5\u24a5\u2485\u2465\u2445\u2425\u2405\u23e5\u23c5" + + "\u23a5\u2385\u2365\u2345\u2325\u2305\u22e5\u22c5\u22a5\u2285\u2265" + + "\u2245\u2225\u2205\u21e5\u21c5\u21a5\u2185\u2165\u2145\u2125\u2105" + + "\u20e5\u20c5\u20a5\u2085\u2065\u2045\u2025\u2005\u1fe5\u1fc5\u1fa5" + + "\u1f85\u1f65\u1f45\u1f25\u1f05\u1ee5\u1ec5\u1ea5\u1e85\u1e65\u1e45" + + "\u1e25\u1e05\u1de5\u1dc5\u1da5\u1d85\u1d65\u1d45\u1d25\u1d05\u1ce5" + + "\u1cc5\u1ca5\u1c85\u1c65\u1c45\u1c25\u1c05\u1be5\u1bc5\u1ba5\u1b85" + + "\u1b65\u1064\u1044\u1024\u1004\u0fe4\u0fc4\u0fa4\u0f84\u0f64\u0668" + + "\u0b83\u0b63\u0b43\u0b23\u0b03\u0ae3\u0a72\u1945\u0a51\u0d16\u0cf6" + + "\u0cac\u0ca3\u0c96\u0c76\u0c56\u0c36\u0c16\u0bf6\u0bd6\u0bb6\u0b96" + + "\u0b76\u0b58\u0b26\u0b16\u0ab2\u0ad6\u0a96\u02c2\u07c3\u1665\u1661" + + "\u03ff\u09f6\u09d6\u09b6\u05dc\u0bb2\u15a1\u0fc0\u01c0\u01b1\u09c5" + + "\u0826\u127f"; + + /** + * Information about each character. The low order 5 bits form the + * character type, the next bit is a flag for non-breaking spaces, and the + * next bit is a flag for mirrored directionality. The high order 9 bits + * form the offset into the attribute tables. Note that this limits the + * number of unique character attributes to 512, which is not a problem + * as of Unicode version 3.2.0, but may soon become one. + */ + String DATA + = "\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81" + + "\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002" + + "\u3e00\u3e00\u2f81\u3002\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05" + + "\u3a05\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05" + + "\u3e00\u3e00\u3e00\u3e00\u5a88\u5a88\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00" + + "\u3e00\u3e00\u3e00\u5098\u3e00\u3e00\u3e00\u3e00\u4586\u3e00\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00\u3e00\u3a05" + + "\u3a05\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u3e00\u3e00\u3e00\u3e00\u5102\u5102\u5102\u5102" + + "\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102" + + "\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102\u5102" + + "\u5102\u5102\u5102\u5102\u5102\u2902\u3e00\u5098\u2a14\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4606\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u1a1b\u1a1b\u3e00\u3e00\u3e00\u3e00\u4504\u3e00\u3e00" + + "\u3e00\u0298\u3e00\u0298\u6515\u6596\u0298\u1a97\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u4504\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u4504\u4504\u1a1b\u1a1b\u1a1b\u1a1b" + + "\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u4504" + + "\u4504\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b" + + "\u1a1b\u1a1b\u1a1b\u1a1b\u2902\u7102\u2902\u3e00\u2902\u2902\u7301" + + "\u7301\u7301\u7301\u7203\u1a1b\u1a1b\u1a1b\u6c82\u6c82\u2902\u2902" + + "\u3e00\u3e00\u2902\u2902\u6d01\u6d01\u7381\u7381\u3e00\u1a1b\u1a1b" + + "\u1a1b\u1b02\u1b82\u1c02\u1c82\u1d02\u1d82\u1e02\u1e82\u1f02\u1f82" + + "\u2002\u2082\u2102\u2182\u2202\u2282\u2302\u2382\u2402\u2482\u2502" + + "\u2582\u2602\u2682\u2702\u2782\u0455\u0c99\u04d6\u0c99\017\017" + + "\017\017\017\u010f\017\017\017\017\017\017\017" + + "\017\017\017\017\017\017\017\017\017\017\017" + + "\017\017\017\017\017\017\017\017\u008f\u010f\u008f" + + "\u018f\u010f\017\017\017\017\017\017\017\017\017" + + "\017\017\017\017\017\u010f\u010f\u010f\u008f\u020c\u0298" + + "\u0298\u0318\u039a\u0318\u0298\u0298\u0455\u04d6\u0298\u0519\u0598" + + "\u0614\u0598\u0698\u0709\u0789\u0809\u0889\u0909\u0989\u0a09\u0a89" + + "\u0b09\u0b89\u0598\u0298\u0c59\u0c99\u0c59\u0298\u0d01\u0d81\u0e01" + + "\u0e81\u0f01\u0f81\u1001\u1081\u1101\u1181\u1201\u1281\u1301\u1381" + + "\u1401\u1481\u1501\u1581\u1601\u1681\u1701\u1781\u1801\u1881\u1901" + + "\u1981\u0455\u0298\u04d6\u1a1b\u1a97\u0298\u0298\u0298\u0c99\u0455" + + "\u04d6\u3e00\u0298\u0298\u0298\u0298\u0298\u0298\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u282c\u0298\u039a\u039a\u039a\u039a\u289c" + + "\u289c\u1a1b\u289c\u2902\u29dd\u0c99\u2a14\u289c\u1a1b\u2a9c\u0519" + + "\u2b0b\u2b8b\u1a1b\u2c02\u289c\u0298\u1a1b\u2c8b\u2902\u2d5e\u2d8b" + + "\u2d8b\u2d8b\u0298\u0298\u0519\u0614\u0c99\u0c99\u0c99\u3e00\u0298" + + "\u039a\u0318\u0298\u3e00\u3e00\u3e00\u3e00\u5305\u5305\u5305\u3e00" + + "\u5305\u3e00\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u3e00\u3e00\u3e00\u4586\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u3e00\u4f1c\u4f1c\u4e81\u4e81" + + "\u4e81\u4e81\u4e81\u4e81\u4e81\u4e81\u4e81\u4e81\u4e81\u4e81\u4e81" + + "\u4e81\u4e81\u4e81\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01" + + "\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01" + + "\u2e01\u2e01\u2e01\u2e01\u0c99\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01" + + "\u2e01\u2902\u3281\u2f81\u3002\u2f81\u3002\u3301\u2f81\u3002\u3381" + + "\u3381\u2f81\u3002\u2902\u3401\u3481\u3501\u2f81\u3002\u3381\u3581" + + "\u3602\u3681\u3701\u2f81\u3002\u2902\u2902\u3681\u3781\u2902\u3801" + + "\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2902\u2f81" + + "\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002" + + "\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81" + + "\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u5b09\u5b89\u5c09\u5c89\u5d09\u5d89\u5e09" + + "\u5e89\u5f09\u5f89\u4586\u4586\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u1a1b\u1a1b\u4681" + + "\u0298\u4701\u4701\u4701\u3e00\u4781\u3e00\u4801\u4801\u2902\u2e01" + + "\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01" + + "\u2e01\u2e01\u2e01\u2e01\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82" + + "\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82" + + "\u2e82\u2e82\u2e82\u2e82\u2e82\u0c99\u2e82\u2e82\u2e82\u2e82\u2e82" + + "\u2e82\u2e82\u2f02\u2e82\u2e82\u4982\u2e82\u2e82\u2e82\u2e82\u2e82" + + "\u2e82\u2e82\u2e82\u2e82\u4a02\u4a82\u4a82\u3e00\u4b02\u4b82\u4c01" + + "\u4c01\u4c01\u4c82\u4d02\u2902\u3e00\u3e00\u2f81\u3002\u2f81\u3002" + + "\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81" + + "\u3002\u2902\u3b01\u3b83\u3c02\u2f81\u3002\u3d01\u3d81\u2f81\u3002" + + "\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81" + + "\u3002\u2f81\u3002\u3081\u3102\u2f81\u3002\u2f81\u3002\u2f81\u3002" + + "\u2902\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002" + + "\u2f81\u3002\u2f81\u3002\u2f81\u3002\u4d82\u4e02\u3c82\u2902\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u5a10\u5a10\u5a10\u5a10\u5a10\u5a10\u7d8b\u3e00\u3e00\u3e00\u7e0b" + + "\u7e8b\u7f0b\u7f8b\u800b\u808b\u0519\u0519\u0c99\u0455\u04d6\u2902" + + "\u3a05\u3a05\u3a05\u3a05\u3b01\u3b83\u3c02\u3b01\u3b83\u3c02\u3b01" + + "\u3b83\u3c02\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81" + + "\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u3c82\u2f81\u3002\u4f1c" + + "\u4586\u4586\u4586\u4586\u3e00\u4f87\u4f87\u3e00\u3e00\u2f81\u3002" + + "\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81" + + "\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002" + + "\u3181\u2f81\u3002\u2f81\u3002\u2f81\u3002\u3202\u2f81\u3002\u2f81" + + "\u3002\u2f81\u3002\u3881\u2f81\u3002\u3881\u2902\u2902\u2f81\u3002" + + "\u3881\u2f81\u3002\u3901\u3901\u2f81\u3002\u2f81\u3002\u3981\u2f81" + + "\u3002\u2902\u3a05\u2f81\u3002\u2902\u3a82\u4c01\u2f81\u3002\u2f81" + + "\u3002\u3e00\u3e00\u2f81\u3002\u3e00\u3e00\u2f81\u3002\u3e00\u3e00" + + "\u3e00\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002" + + "\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u0598\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u5298\u3e00\u3e00\u3e00\u5298\u5298\u5298\u5298\u5298" + + "\u5298\u5298\u5298\u5298\u5298\u5298\u5298\u5298\u5298\u3e00\u5a10" + + "\u5305\u4586\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u3e00\u3e00" + + "\u5a10\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01" + + "\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01" + + "\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01\u4c01" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u5b09\u5b89\u5c09\u5c89\u5d09\u5d89\u5e09\u5e89\u5f09\u5f89" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u2902\u2902\u2902\u3e82\u3f02\u2902\u3f82\u3f82\u2902\u4002\u2902" + + "\u4082\u2902\u2902\u2902\u2902\u3f82\u2902\u2902\u4102\u2902\u2902" + + "\u2902\u2902\u4182\u4202\u2902\u2902\u2902\u2902\u2902\u4202\u2902" + + "\u2902\u4282\u2902\u2902\u4302\u2902\u2902\u2902\u2902\u2902\u2902" + + "\u2902\u2902\u2902\u2902\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u2902\u2902\u2902\u2902\u2902\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u5205\u4586\u5205\u5205\u3e00\u5205\u5205" + + "\u3e00\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5298\u5305" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4f87\u4f87\u4586\u4f87" + + "\u4f87\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u2d8b\u2d8b\u2d8b\u2d8b\u2d8b\u2d8b\u2d8b\u2d8b\u2d8b\u2d8b\u2d8b" + + "\u2d8b\u828b\u4382\u2902\u2902\u4382\u2902\u2902\u2902\u2902\u4382" + + "\u2902\u4402\u4402\u2902\u2902\u2902\u2902\u2902\u2902\u4482\u2902" + + "\u2902\u2902\u2902\u2902\u2902\u2902\u2902\u2902\u2902\u2902\u2902" + + "\u2902\u2902\u3e00\u3e00\u4504\u4504\u4504\u4504\u4504\u4504\u4504" + + "\u4504\u4504\u1a1b\u1a1b\u4504\u4504\u4504\u4504\u4504\u1a1b\u1a1b" + + "\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u1a1b\u4504\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u5001\u5001\u5001\u5001\u5001\u5001\u5001\u5001" + + "\u5001\u5001\u5001\u5001\u5001\u5001\u5001\u5001\u5001\u5001\u5001" + + "\u5001\u5001\u5001\u5001\u3e00\u3e00\u4504\u5098\u5098\u5098\u5098" + + "\u5098\u5098\u2e01\u2e01\u3e00\u2e01\u2e01\u2e01\u2e01\u2e01\u2e01" + + "\u2e01\u2e01\u2e01\u4882\u4902\u4902\u4902\u2902\u2e82\u2e82\u2e82" + + "\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82\u2e82" + + "\u2e82\u2e82\u4e02\u4e02\u4e02\u4e02\u4e02\u4e02\u4e02\u4e02\u4e02" + + "\u4e02\u4e02\u4e02\u4e02\u4e02\u4e02\u4e02\u4586\u4586\u4586\u4586" + + "\u4586\u5098\u4586\u4586\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00" + + "\u3e00\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u3e00\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u3e00\u4586\u4586\u4586\u5198\u4586\u4586\u5198\u4586\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u5205\u5205" + + "\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205" + + "\u5205\u5205\u5205\u3e00\u3e00\u3e00\u3e00\u3e00\u5205\u5205\u5205" + + "\u5198\u5198\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u5b89\u5c09\u5c89\u5d09\u5d89\u5e09\u5e89\u5f09\u5f89" + + "\u630b\u638b\u640b\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u4586\u5a88\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3e00\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00\u3a05\u3a05\u3e00\u3a05\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u5a88\u5a88\u5a88\u5a88\u3e00" + + "\u4586\u4586\u4586\u3e00\u4586\u4586\u4586\u4586\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u4586\u4586\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u4586\u5a88\u5a88\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3a05\u3a05\u3e00\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00\u3e00\u5a88\u5a88" + + "\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3e00\u3e00\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00\u3e00\u5b09\u5b89" + + "\u5c09\u5c89\u5d09\u5d89\u5e09\u5e89\u5f09\u5f89\u4f1c\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u5409\u5489\u5509\u5589\u5609\u5689\u5709\u5789\u5809" + + "\u5889\u0318\u5918\u5918\u5298\u3e00\u3e00\u4586\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u3e00\u3e00\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u6515\u6596" + + "\u5384\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305\u5305" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u5a88" + + "\u5a88\u5098\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u4586\u4586\u5a88\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3e00\u3a05\u3e00\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u5098\u5098\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u4586\u4586\u4586" + + "\u4586\u4586\u5384\u5384\u4586\u4586\u289c\u4586\u4586\u4586\u4586" + + "\u3e00\u3e00\u0709\u0789\u0809\u0889\u0909\u0989\u0a09\u0a89\u0b09" + + "\u0b89\u5305\u5305\u5305\u599c\u599c\u3e00\u3a05\u3a05\u3a05\u3e00" + + "\u3a05\u3e00\u3a05\u3e00\u3e00\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u4586\u3a05\u3a05\u4586\u4586\u4586\u4586\u4586\u4586\u3e00" + + "\u4586\u4586\u3a05\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00" + + "\u3e00\u3e00\u4586\u4586\u5a88\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u4586\u3a05\u5a88\u5a88" + + "\u5a88\u5a88\u5a88\u3e00\u4586\u5a88\u5a88\u3e00\u5a88\u5a88\u4586" + + "\u4586\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u5a88\u5a88\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05\u3e00\u5098\u5098\u5098" + + "\u5098\u5098\u5098\u5098\u5098\u5b89\u5c09\u5c89\u5d09\u5d89\u5e09" + + "\u5e89\u5f09\u5f89\u630b\u660b\u668b\u670b\u678b\u680b\u688b\u690b" + + "\u698b\u638b\u6a0b\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3e00\u3a05\u3a05\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3e00" + + "\u3e00\u4586\u3a05\u5a88\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u5a88\u5a88\u5a88\u5a88\u4586\u3e00\u3e00\u3a05\u4586\u4586" + + "\u4586\u4586\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3e00\u3a05\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00" + + "\u4586\u3e00\u5a88\u5a88\u5a88\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3e00\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3e00\u3a05\u3a05" + + "\u3a05\u3a05\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u4586" + + "\u3a05\u3a05\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u3e00\u3e00" + + "\u3e00\u3e00\u039a\u039a\u039a\u039a\u039a\u039a\u039a\u039a\u039a" + + "\u039a\u039a\u039a\u039a\u039a\u039a\u039a\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3a05\u3a05\u4586\u4586\u5098\u5098\u5b09\u5b89\u5c09\u5c89" + + "\u5d09\u5d89\u5e09\u5e89\u5f09\u5f89\u5098\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u0298\u0298\u0318\u039a\u0318\u0298\u0298\u6515\u6596\u0298\u0519" + + "\u0598\u0614\u0598\u0698\u0709\u0789\u0809\u0889\u0909\u0989\u0a09" + + "\u0a89\u0b09\u0b89\u0598\u0298\u0c99\u0c99\u0c99\u0298\u0298\u0298" + + "\u0298\u0298\u0298\u2a14\u0298\u0298\u0298\u0298\u5a10\u5a10\u5a10" + + "\u5a10\u3e00\u5b09\u5b89\u5c09\u5c89\u5d09\u5d89\u5e09\u5e89\u5f09" + + "\u5f89\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3e00\u3e00\u3e00\u3e00\u5a88\u4586\u4586\u4586\u4586\u3e00\u3e00" + + "\u5a88\u5a88\u3e00\u3e00\u5a88\u5a88\u4586\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u5a88\u3e00\u3e00\u3e00\u3e00\u3a05" + + "\u3a05\u3e00\u3a05\u3e00\u3e00\u3a05\u3a05\u3e00\u3a05\u3e00\u3e00" + + "\u3a05\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3e00" + + "\u3a05\u3a05\u3e00\u3a05\u3a05\u3e00\u3e00\u4586\u3e00\u5a88\u5a88" + + "\u4586\u4586\u3e00\u3e00\u3e00\u3e00\u4586\u4586\u3e00\u3e00\u4586" + + "\u4586\u4586\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3e00\u3a05\u3a05" + + "\u4586\u4586\u3e00\u3e00\u5b09\u5b89\u5c09\u5c89\u5d09\u5d89\u5e09" + + "\u5e89\u5f09\u5f89\u3a05\u3a05\u039a\u039a\u600b\u608b\u610b\u618b" + + "\u620b\u628b\u4f1c\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3e00\u3e00\u4586\u3a05\u5a88\u5a88\u4586\u4586\u4586\u4586" + + "\u4586\u3e00\u4586\u4586\u5a88\u3e00\u5a88\u5a88\u4586\u3e00\u3e00" + + "\u3a05\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u5b09\u5b89\u5c09\u5c89\u5d09\u5d89" + + "\u5e09\u5e89\u5f09\u5f89\u620b\u620b\u620b\u620b\u620b\u620b\u620b" + + "\u620b\u620b\u620b\u4f1c\u4586\u4f1c\u4586\u4f1c\u4586\u6515\u6596" + + "\u6515\u6596\u5a88\u5a88\u4586\u4586\u4586\u3e00\u3e00\u3e00\u5a88" + + "\u5a88\u3e00\u3e00\u5a88\u5a88\u4586\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u4586\u5a88\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05" + + "\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05\u3e00\u5a88" + + "\u4586\u4586\u4586\u4586\u5a88\u4586\u3e00\u3e00\u3e00\u4586\u4586" + + "\u5a88\u4586\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u5a88\u5a88\u5a88\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u5a88\u5a88\u3e00\u3e00\u3e00\u5a88" + + "\u5a88\u5a88\u3e00\u5a88\u5a88\u5a88\u4586\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u5a88\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u4504\u3e00" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u3e00\u3e00\u5b09\u5b89\u5c09" + + "\u5c89\u5d09\u5d89\u5e09\u5e89\u5f09\u5f89\u3e00\u3e00\u3a05\u3a05" + + "\u3e00\u3e00\u3e00\u3e00\u5b09\u5b89\u5c09\u5c89\u5d09\u5d89\u5e09" + + "\u5e89\u5f09\u5f89\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4f87" + + "\u4f87\u4f87\u5a88\u4586\u4586\u4586\u3e00\u3e00\u5a88\u5a88\u5a88" + + "\u3e00\u5a88\u5a88\u5a88\u4586\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u5a88\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00" + + "\u4586\u3e00\u3e00\u3e00\u3e00\u5a88\u5a88\u5a88\u4586\u4586\u4586" + + "\u3e00\u4586\u3e00\u5a88\u5a88\u5a88\u5a88\u5a88\u5a88\u5a88\u5a88" + + "\u4586\u5a88\u5a88\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u4586\u4586\u5098\u5098\u5098\u5098\u5098\u5098\u5098\u039a" + + "\u5098\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u4504" + + "\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u4586\u5098\u5b09\u5b89" + + "\u5c09\u5c89\u5d09\u5d89\u5e09\u5e89\u5f09\u5f89\u5098\u5098\u3e00" + + "\u3e00\u3e00\u3e00\u3a05\u4f1c\u4f1c\u4f1c\u5098\u5098\u5098\u5098" + + "\u5098\u5098\u5098\u5098\u64b8\u5098\u5098\u5098\u5098\u5098\u5098" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4586\u4586\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4586\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u3e00\u3e00" + + "\u4f1c\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u3e00\u3e00\u3e00\u3e00" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u1a97\u4504\u4504\u4504\u3e00\u5b09\u5b89\u5c09\u5c89\u5d09" + + "\u5d89\u5e09\u5e89\u5f09\u5f89\u5098\u5098\u5098\u5098\u5098\u5098" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u5a88\u5a88\u4586\u4586\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u020c\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u6515" + + "\u6596\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u5098\u5098\u5098\u6a8b\u6b0b\u6b8b\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u4586\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81" + + "\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002\u2f81\u3002" + + "\u2f81\u3002\u2902\u2902\u2902\u2902\u2902\u6c02\u3e00\u3e00\u3e00" + + "\u3e00\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u6d01\u6d01" + + "\u6d01\u6d01\u6d01\u6d01\u6d01\u6d01\u6c82\u6c82\u6c82\u6c82\u6c82" + + "\u6c82\u6c82\u6c82\u6d01\u6d01\u6d01\u6d01\u6d01\u6d01\u6d01\u6d01" + + "\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u3e00\u3e00\u6d01\u6d01\u6d01" + + "\u6d01\u6d01\u6d01\u3e00\u3e00\u2902\u6c82\u2902\u6c82\u2902\u6c82" + + "\u2902\u6c82\u3e00\u6d01\u3e00\u6d01\u3e00\u6d01\u3e00\u6d01\u6c82" + + "\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u6d01\u6d01\u6d01\u6d01" + + "\u6d01\u6d01\u6d01\u6d01\u6d82\u6d82\u6e02\u6e02\u6e02\u6e02\u6e82" + + "\u6e82\u6f02\u6f02\u6f82\u6f82\u7002\u7002\u3e00\u3e00\u6c82\u6c82" + + "\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u7083\u7083\u7083\u7083\u7083" + + "\u7083\u7083\u7083\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82\u6c82" + + "\u7083\u7083\u7083\u7083\u7083\u7083\u7083\u7083\u6c82\u6c82\u2902" + + "\u7102\u2902\u3e00\u2902\u2902\u6d01\u6d01\u7181\u7181\u7203\u1a1b" + + "\u7282\u1a1b\u1b02\u1b82\u1c02\u1c82\u1d02\u1d82\u1e02\u1e82\u1f02" + + "\u1f82\u2002\u2082\u2102\u2182\u2202\u2282\u2302\u2382\u2402\u2482" + + "\u2502\u2582\u2602\u2682\u2702\u2782\u6515\u0c99\u6596\u0c99\u3e00" + + "\u6c82\u6c82\u2902\u2902\u2902\u7402\u2902\u2902\u6d01\u6d01\u7481" + + "\u7481\u7501\u1a1b\u1a1b\u1a1b\u3e00\u3e00\u2902\u7102\u2902\u3e00" + + "\u2902\u2902\u7581\u7581\u7601\u7601\u7203\u1a1b\u1a1b\u3e00\u020c" + + "\u020c\u020c\u020c\u020c\u020c\u020c\u76ac\u020c\u020c\u020c\u770c" + + "\u5a10\u5a10\u7790\u7810\u2a14\u78b4\u2a14\u2a14\u2a14\u2a14\u0298" + + "\u0298\u791d\u799e\u6515\u791d\u791d\u799e\u6515\u791d\u0298\u0298" + + "\u0298\u0298\u0298\u0298\u0298\u0298\u7a0d\u7a8e\u7b10\u7b90\u7c10" + + "\u7c90\u7d10\u76ac\u0318\u0318\u0318\u0318\u0318\u0298\u0298\u0298" + + "\u0298\u29dd\u2d5e\u0298\u0298\u0298\u0298\u1a97\u7d8b\u2c8b\u2b0b" + + "\u2b8b\u7e0b\u7e8b\u7f0b\u7f8b\u800b\u808b\u0519\u0519\u0c99\u0455" + + "\u04d6\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00" + + "\u3e00\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u4c01\u289c\u289c\u289c\u289c\u4c01\u289c\u289c\u2902\u4c01\u4c01" + + "\u4c01\u2902\u2902\u4c01\u4c01\u4c01\u2902\u289c\u4c01\u289c\u289c" + + "\u289c\u4c01\u4c01\u4c01\u4c01\u4c01\u289c\u289c\ua08a\ua10a\ua18a" + + "\ua20a\ua28a\ua30a\ua38a\ua40a\ua48a\u4586\u4586\u4586\u4586\u4586" + + "\u4586\u2a14\u4504\u4504\u4504\u4504\u4504\u289c\u289c\ua50a\ua58a" + + "\ua60a\u3e00\u3e00\u3e00\u289c\u289c\u289c\u289c\u3e00\u289c\u289c" + + "\u289c\u289c\u3e00\u3e00\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u0c99\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u0c99\u0c99" + + "\u289c\u289c\u0c99\u289c\u0c99\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u0c99\u289c" + + "\u289c\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u930a\u938a\u940a\u948a\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u0c99\u0c99" + + "\u0c99\u0c99\u0c99\u289c\u289c\u289c\u289c\u289c\u0c99\u0c99\u289c" + + "\u289c\u289c\u289c\u4c01\u289c\u8101\u289c\u4c01\u289c\u8181\u8201" + + "\u4c01\u4c01\u2a9c\u2902\u4c01\u4c01\u289c\u4c01\u2902\u3a05\u3a05" + + "\u3a05\u3a05\u2902\u289c\u3e00\u3e00\u3e00\u3e00\u3e00\u830a\u838a" + + "\u840a\u848a\u850a\u858a\u860a\u868a\u870a\u878a\u880a\u888a\u890a" + + "\u898a\u8a0a\u8a8a\u8b0a\u8b8a\u8c0a\u8c8a\u8d0a\u8d8a\u8e0a\u8e8a" + + "\u8f0a\u8f8a\u900a\u908a\u910a\u918a\u920a\u928a\u0c99\u0c99\u0c59" + + "\u0c59\u0c99\u0c99\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59" + + "\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59" + + "\u0c99\u0c99\u0c99\u0c99\u0c99\u0c59\u0c59\u0c59\u0c59\u0c99\u0c99" + + "\u0c99\u0c99\u0c99\u0c99\u0c99\u0c99\u0c99\u0c59\u0c59\u0c59\u0c59" + + "\u0c59\u0c99\u0c99\u0c59\u0c59\u0c99\u0c99\u0c99\u0c99\u0c59\u0c59" + + "\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59" + + "\u0c99\u0c99\u0c59\u0c59\u0c59\u0c59\u0c99\u0c99\u0c99\u0c99\u0c99" + + "\u0c59\u0c99\u0c99\u0c99\u0c99\u0c99\u0c99\u0c99\u289c\u289c\u0c99" + + "\u289c\u289c\u0c99\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u0c99" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u3e00" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u0c99\u0c59\u0c59\u0c59\u0c59\u0c99" + + "\u0c99\u0c99\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c99\u0c99\u0c99" + + "\u0c59\u0519\u0519\u0c99\u0c59\u0c59\u0c99\u0c99\u0c99\u0c59\u0c59" + + "\u0c59\u0c59\u0c99\u0c59\u0c99\u0c59\u0c99\u0c99\u0c99\u0c99\u0c59" + + "\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c99\u0c99\u0c99" + + "\u0c99\u0c99\u0c59\u0c99\u0c59\u0c59\u0c59\u0c59\u0c59\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u0455\u04d6\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u3e00\u3e00\u3e00" + + "\u3e00\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c" + + "\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c\u9a9c\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c" + + "\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c\u9b1c" + + "\u7d8b\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u0c59\u0c99\u0c59\u0c99\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59" + + "\u0c59\u0c99\u0c99\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59" + + "\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c59\u0c99" + + "\u0c99\u0c59\u0c59\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u039a\u039a\u0c99\u1a1b\u289c" + + "\u039a\u039a\u3e00\u289c\u0c99\u0c99\u0c99\u0c99\u289c\u289c\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u5a10\u5a10" + + "\u5a10\u289c\u289c\u3e00\u3e00\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u3e00" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u3e00\u289c\u3e00\u289c\u289c\u289c\u289c\u3e00" + + "\u3e00\u3e00\u289c\u3e00\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u828b\u9b8b\u9c0b\u9c8b\u9d0b\u9d8b\u9e0b\u9e8b" + + "\u9f0b\u9f8b\u828b\u9b8b\u9c0b\u9c8b\u9d0b\u9d8b\u9e0b\u9e8b\u9f0b" + + "\u9f8b\u289c\u3e00\u3e00\u3e00\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u0c59\u0c59\u0c59\u0c59\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c\u289c" + + "\u289c\u289c\u289c\u289c\u289c\u4f1c\u289c\u289c\u289c\u289c\u289c" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u620b\u620b\u620b\u620b\u620b\u620b" + + "\u620b\u620b\u620b\u620b\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u3e00\u3e00\u3e00\u4f1c\u600b\u608b\u610b\u618b" + + "\ua68b\ua70b\ua78b\ua80b\ua88b\u630b\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u289c\u3e00\u289c\u289c\u289c\u3e00\u289c\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u2c8b" + + "\u2b0b\u2b8b\u7e0b\u7e8b\u7f0b\u7f8b\u800b\u808b\u950b\u958b\u960b" + + "\u968b\u970b\u978b\u980b\u988b\u990b\u998b\u9a0b\u2c8b\u2b0b\u2b8b" + + "\u7e0b\u7e8b\u7f0b\u7f8b\u800b\u808b\u950b\u958b\u960b\u968b\u970b" + + "\u978b\u980b\u988b\u990b\u998b\u9a0b\u4f1c\u4f1c\u4f1c\u4f1c\u020c" + + "\u0298\u0298\u0298\u289c\u4504\u3a05\ua00a\u0455\u04d6\u0455\u04d6" + + "\u0455\u04d6\u0455\u04d6\u0455\u04d6\u289c\u289c\u0455\u04d6\u0455" + + "\u04d6\u0455\u04d6\u0455\u04d6\u2a14\u6515\u6596\u6596\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3e00\u3e00\u3e00" + + "\u3e00\u4586\u4586\u1a1b\u1a1b\u4504\u4504\u3e00\u3a05\u3a05\u3a05" + + "\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05\u3a05" + + "\u3a05\u3e00\u4f1c\u4f1c\u620b\u620b\u620b\u620b\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c\u4f1c" + + "\u4f1c\u4f1c\u4f1c\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\ua913\ua913" + + "\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913" + + "\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913" + + "\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua913\ua992\ua992\ua992" + + "\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992" + + "\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992\ua992" + + "\ua992\ua992\ua992\ua992\ua992\ua992\ua992\u5205\u5205\u5205\u5205" + + "\u5205\u5205\u5205\u5205\u5205\u0519\u5205\u5205\u5205\u5205\u5205" + + "\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u5205\u3e00\u5205\u5205" + + "\u5205\u5205\u5205\u3e00\u5205\u3e00\u4586\u4586\u4586\u4586\u3e00" + + "\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00\u3e00" + + "\u0298\u2a14\u2a14\u1a97\u1a97\u6515\u6596\u6515\u6596\u6515\u6596" + + "\u6515\u6596\u6515\u6596\u6515\u6596\u3e00\u3e00\u3e00\u3e00\u0298" + + "\u0298\u0298\u0298\u1a97\u1a97\u1a97\u0598\u0298\u0598\u3e00\u0298" + + "\u0598\u0298\u0298\u2a14\u6515\u6596\u6515\u6596\u6515\u6596\u0318" + + "\u0298\u0d01\u0d81\u0e01\u0e81\u0f01\u0f81\u1001\u1081\u1101\u1181" + + "\u1201\u1281\u1301\u1381\u1401\u1481\u1501\u1581\u1601\u1681\u1701" + + "\u1781\u1801\u1881\u1901\u1981\u6515\u0298\u6596\u1a1b\u1a97"; + + /** + * This is the attribute table for computing the numeric value of a + * character. The value is -1 if Unicode does not define a value, -2 + * if the value is not a positive integer, otherwise it is the value. + * Note that this is a signed value, but stored as an unsigned char + * since this is a String literal. + */ + String NUM_VALUE + = "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\000\001\002\003\004\005\006\007" + + "\010\011\uffff\uffff\012\013\014\015\016\017\020" + + "\021\022\023\024\025\026\027\030\031\032\033" + + "\034\035\036\037 !\"#\uffff\uffff\012" + + "\013\014\015\016\017\020\021\022\023\024\025" + + "\026\027\030\031\032\033\034\035\036\037 " + + "!\"#\uffff\uffff\uffff\uffff\uffff\uffff\002\003" + + "\uffff\001\uffff\ufffe\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\000\001\002\003\004\005\006\007" + + "\010\011\uffff\uffff\uffff\uffff\000\001\002\003\004" + + "\005\006\007\010\011\001\002\003\004\uffff\020" + + "\012d\u03e8\uffff\uffff\uffff\024\036(2<" + + "FPZ\u2710\021\022\023\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff" + + "\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\uffff\000\004" + + "\005\006\007\010\011\uffff\uffff\uffff\001\001\002" + + "\003\004\005\006\007\010\011\012\013\0142" + + "d\u01f4\u03e8\001\002\003\004\005\006\007\010" + + "\011\012\013\0142d\u01f4\u03e8\u03e8\u1388\u2710" + + "\uffff\012\013\014\015\016\017\020\021\022\023" + + "\024\uffff\uffff\002\003\004\005\006\007\010\011" + + "\012\000\001\002\003\004\005\006\007\010\011" + + "\012\024\036\005\006\007\010\011\uffff\uffff"; + + /** + * This is the attribute table for computing the uppercase representation + * of a character. The value is the signed difference between the + * character and its uppercase version. Note that this is stored as an + * unsigned char since this is a String literal. + */ + String UPPER + = "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\uffe0" + + "\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0" + + "\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0\uffe0" + + "\uffe0\uffe0\uffe0\000\000\000\000\000\000\000\000" + + "\u02e7\000\000\000\000\uffe0y\000\uffff\000\uff18" + + "\000\ufed4\000\000\000\000\000\000\000a\000" + + "\000\000\000\000\000\000\0008\000\uffff\ufffe" + + "\uffb1\000\000\000\uff2e\uff32\uff33\uff36\uff35\uff31\uff2f" + + "\uff2d\uff2b\uff2a\uff26\uff27\uff25\000\000T\000\000" + + "\000\000\uffda\uffdb\uffe1\uffc0\uffc1\uffc2\uffc7\000\uffd1" + + "\uffca\uffaa\uffb0\000\000\000\000\000\uffd0\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\uffc5\010\000J" + + "Vd\u0080p~\000\011\000\000\ue3db\000" + + "\000\007\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\ufff0\ufff0\ufff0\ufff0\ufff0\ufff0\ufff0\ufff0" + + "\ufff0\ufff0\ufff0\ufff0\ufff0\ufff0\ufff0\ufff0\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\uffe6\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000"; + + /** + * This is the attribute table for computing the lowercase representation + * of a character. The value is the signed difference between the + * character and its lowercase version. Note that this is stored as an + * unsigned char since this is a String literal. + */ + String LOWER + = "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000 " + + " " + + " \000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000 \000\000\001\000\uff39\000" + + "\uff87\000\u00d2\u00ce\u00cdO\u00ca\u00cb\u00cf\000\u00d3" + + "\u00d1\u00d5\u00d6\u00da\u00d9\u00db\000\000\002\001\000" + + "\000\uff9f\uffc8\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000&%" + + "@?\000\000\000\000\000\000\000\000\000" + + "\000\000\000P\000\0000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\ufff8\000" + + "\000\000\000\000\000\ufff8\000\uffb6\ufff7\000\uffaa" + + "\uff9c\000\uff90\ufff9\uff80\uff82\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\ue2a3\udf41\udfba\000\020\020" + + "\020\020\020\020\020\020\020\020\020\020\020" + + "\020\020\020\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\032\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000"; + + /** + * This is the attribute table for computing the directionality class + * of a character. At present, the value is in the range 0 - 18 if the + * character has a direction, otherwise it is -1. Note that this is + * stored as an unsigned char since this is a String literal. + */ + String DIRECTION + = "\011\013\012\014\014\015\005\005\015\015\005" + + "\007\005\004\003\003\003\003\003\003\003\003" + + "\003\003\015\015\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\015\015\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\007\015\000\015\015\005\003\003" + + "\000\003\015\015\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\uffff\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\010\010\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\010\000\000\000\001\001" + + "\002\002\002\006\006\006\006\006\006\006\006" + + "\006\006\006\002\011\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\015\015\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\014\011\000\001\015" + + "\015\015\014\012\016\020\022\017\021\003\003" + + "\003\003\003\003\003\000\000\000\015\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000\000" + + "\000\003\003\003\003\003\003\003\003\003\003" + + "\003\000\000\015\015\015\015\015\015\015\015" + + "\015\000\000\000\000\000\000\000\000\000\000" + + "\000\000\000\000\000\000\000\000\000\000"; + + /** + * This is the listing of titlecase special cases (all other character + * can use UPPER to determine their titlecase). The listing + * is a sequence of character pairs; converting the first character of the + * pair to titlecase produces the second character. + */ + String TITLE + = "\u01c4\u01c5\u01c5\u01c5\u01c6\u01c5\u01c7\u01c8\u01c8\u01c8\u01c9" + + "\u01c8\u01ca\u01cb\u01cb\u01cb\u01cc\u01cb\u01f1\u01f2\u01f2\u01f2" + + "\u01f3\u01f2"; + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/lang/ClassHelper.java gcc-3.1/libjava/gnu/java/lang/ClassHelper.java *** gcc-3.0.4/libjava/gnu/java/lang/ClassHelper.java Fri May 19 17:55:29 2000 --- gcc-3.1/libjava/gnu/java/lang/ClassHelper.java Tue Jan 22 22:39:53 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.lang; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.lang; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/lang/reflect/TypeSignature.java gcc-3.1/libjava/gnu/java/lang/reflect/TypeSignature.java *** gcc-3.0.4/libjava/gnu/java/lang/reflect/TypeSignature.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/gnu/java/lang/reflect/TypeSignature.java Tue Jan 22 22:39:55 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.lang.reflect; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.lang.reflect; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/Calendar.java gcc-3.1/libjava/gnu/java/locale/Calendar.java *** gcc-3.0.4/libjava/gnu/java/locale/Calendar.java Fri Oct 27 10:33:46 2000 --- gcc-3.1/libjava/gnu/java/locale/Calendar.java Tue Jan 22 22:39:56 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.locale; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.locale; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/Calendar_de.java gcc-3.1/libjava/gnu/java/locale/Calendar_de.java *** gcc-3.0.4/libjava/gnu/java/locale/Calendar_de.java Fri Oct 27 10:33:46 2000 --- gcc-3.1/libjava/gnu/java/locale/Calendar_de.java Tue Jan 22 22:39:56 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.locale; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.locale; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/Calendar_en.java gcc-3.1/libjava/gnu/java/locale/Calendar_en.java *** gcc-3.0.4/libjava/gnu/java/locale/Calendar_en.java Fri Oct 27 10:33:46 2000 --- gcc-3.1/libjava/gnu/java/locale/Calendar_en.java Tue Jan 22 22:39:56 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.locale; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.locale; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/Calendar_nl.java gcc-3.1/libjava/gnu/java/locale/Calendar_nl.java *** gcc-3.0.4/libjava/gnu/java/locale/Calendar_nl.java Fri Oct 27 10:33:46 2000 --- gcc-3.1/libjava/gnu/java/locale/Calendar_nl.java Tue Jan 22 22:39:56 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.locale; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.locale; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation.java Tue Jan 22 22:39:56 2002 *************** *** 0 **** --- 1,47 ---- + /* LocaleInformation.java -- Default locale information + Copyright (C) 1998, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.locale; + + /** + * This is the resource bundle for the default locale, which right now is + * hardcoded to US English. + */ + public class LocaleInformation extends LocaleInformation_en + { + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_af_ZA.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_af_ZA.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_af_ZA.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_af_ZA.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_af_ZA extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "Sondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrydag", "Saterdag" }; + + static final String[] shortWeekdays = { null, "So", "Ma", "Di", "Wo", "Do", "Vr", "Sa" }; + + static final String[] shortMonths = { "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des", null }; + + static final String[] months = { "Januarie", "Februarie", "Maart", "April", "Mei", "Junie", "Julie", "Augustus", "September", "Oktober", "November", "Desember", null }; + + static final String[] ampms = { "VM", "NM" }; + + static final String shortDateFormat = "dd/MM/yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "R"; + static final String intlCurrencySymbol = "ZAR"; + static final String currencyFormat = "$#,###,##0.00;-$#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_AE.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_AE.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_AE.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_AE.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_AE extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A " }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u0625."; + static final String intlCurrencySymbol = "AED"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_BH.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_BH.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_BH.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_BH.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_BH extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u0628."; + static final String intlCurrencySymbol = "BHD"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_DZ.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_DZ.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_DZ.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_DZ.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_DZ extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u062C."; + static final String intlCurrencySymbol = "DZD"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_EG.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_EG.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_EG.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_EG.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_EG extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062C.\u0645."; + static final String intlCurrencySymbol = "EGP"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_IN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_IN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_IN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_IN.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_IN extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##,##0.###"; + static final String percentFormat = "#,##,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "EEEE dd MMMM yyyy"; + static final String defaultTimeFormat = "hh:m:s a z"; + static final String currencySymbol = "\u20A8"; + static final String intlCurrencySymbol = "INR"; + static final String currencyFormat = "$ #,##,##0.00;-$ #,##,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_IQ.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_IQ.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_IQ.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_IQ.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_IQ extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u0639."; + static final String intlCurrencySymbol = "IQD"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_JO.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_JO.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_JO.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_JO.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_JO extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortMonths = { "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0646\u0648\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", null }; + + static final String[] months = { "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0646\u0648\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u0623."; + static final String intlCurrencySymbol = "JOD"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_KW.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_KW.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_KW.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_KW.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_KW extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u0643."; + static final String intlCurrencySymbol = "KWD"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_LB.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_LB.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_LB.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_LB.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_LB extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortMonths = { "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0646\u0648\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", null }; + + static final String[] months = { "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0646\u0648\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u0644.\u0644."; + static final String intlCurrencySymbol = "LBP"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_LY.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_LY.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_LY.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_LY.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_LY extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u0644."; + static final String intlCurrencySymbol = "LYD"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_MA.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_MA.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_MA.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_MA.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_MA extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u0645."; + static final String intlCurrencySymbol = "MAD"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_OM.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_OM.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_OM.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_OM.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_OM extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u0631.\u0639."; + static final String intlCurrencySymbol = "OMR"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_QA.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_QA.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_QA.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_QA.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_QA extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u0631.\u0642."; + static final String intlCurrencySymbol = "QAR"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_SD.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_SD.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_SD.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_SD.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_SD extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062C.\u0633."; + static final String intlCurrencySymbol = "SDP"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_SY.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_SY.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_SY.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_SY.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_SY extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortMonths = { "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0646\u0648\u0627\u0631", "\u062D\u0632\u064A\u0631\u0627\u0646", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", null }; + + static final String[] months = { "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0634\u0628\u0627\u0637", "\u0622\u0630\u0627\u0631", "\u0646\u064A\u0633\u0627\u0646", "\u0646\u0648\u0627\u0631\u0627\u0646", "\u062D\u0632\u064A\u0631", "\u062A\u0645\u0648\u0632", "\u0622\u0628", "\u0623\u064A\u0644\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u0623\u0648\u0644", "\u062A\u0634\u0631\u064A\u0646 \u0627\u0644\u062B\u0627\u0646\u064A", "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u0644.\u0633."; + static final String intlCurrencySymbol = "SYP"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_TN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_TN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_TN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_TN.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_TN extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u062F.\u062A."; + static final String intlCurrencySymbol = "TND"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_YE.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_YE.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ar_YE.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ar_YE.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ar_YE extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0627\u0644\u0623\u062D\u062F", "\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A" }; + + static final String[] shortWeekdays = { null, "\u062D", "\u0646", "\u062B", "\u0631", "\u062E", "\u062C", "\u0633" }; + + static final String[] shortMonths = { "\u064A\u0646\u0627", "\u0641\u0628\u0631", "\u0645\u0627\u0631", "\u0623\u0628\u0631", "\u0645\u0627\u064A", "\u064A\u0648\u0646", "\u064A\u0648\u0644", "\u0623\u063A\u0633", "\u0633\u0628\u062A", "\u0623\u0643\u062A", "\u0646\u0648\u0641", "\u062F\u064A\u0633", null }; + + static final String[] months = { "\u064A\u0646\u0627\u064A\u0631", "\u0641\u0628\u0631\u0627\u064A\u0631", "\u0645\u0627\u0631\u0633", "\u0623\u0628\u0631\u064A\u0644", "\u0645\u0627\u064A\u0648", "\u064A\u0648\u0646\u064A\u0648", "\u064A\u0648\u0644\u064A\u0648", "\u0623\u063A\u0633\u0637\u0633", "\u0633\u0628\u062A\u0645\u0628\u0631", "\u0623\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0641\u0645\u0628\u0631", "\u062F\u064A\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0645" }; + + static final String shortDateFormat = "dd MMM, yyyy"; + static final String defaultTimeFormat = "z hh:m:s a"; + static final String currencySymbol = "\u0631.\u064A."; + static final String intlCurrencySymbol = "YER"; + static final String currencyFormat = "$ #,##0.000;$ #,##0.000-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_be_BY.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_be_BY.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_be_BY.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_be_BY.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_be_BY extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "\u041D\u044F\u0434\u0437\u0435\u043B\u044F", "\u041F\u0430\u043D\u044F\u0434\u0437\u0435\u043B\u0430\u043A", "\u0410\u045E\u0442\u043E\u0440\u0430\u043A", "\u0421\u0435\u0440\u0430\u0434\u0430", "\u0427\u0430\u0446\u0432\u0435\u0440", "\u041F\u044F\u0442\u043D\u0456\u0446\u0430", "\u0421\u0443\u0431\u043E\u0442\u0430" }; + + static final String[] shortWeekdays = { null, "\u041D\u044F\u0434", "\u041F\u0430\u043D", "\u0410\u045E\u0442", "\u0421\u0440\u0434", "\u0427\u0446\u0432", "\u041F\u044F\u0442", "\u0421\u0443\u0431" }; + + static final String[] shortMonths = { "\u0421\u0442\u0434", "\u041B\u044E\u0442", "\u0421\u0430\u043A", "\u041A\u0440\u0441", "\u0422\u0440\u0430", "\u0427\u044D\u0440", "\u041B\u0456\u043F", "\u0416\u043D\u0432", "\u0412\u0440\u0441", "\u041A\u0441\u0442", "\u041B\u0456\u0441", "\u0421\u043D\u0436", null }; + + static final String[] months = { "\u0421\u0442\u0443\u0434\u0437\u0435\u043D\u044C", "\u041B\u044E\u0442\u044B", "\u0421\u0430\u043A\u0430\u0432\u0456\u043A", "\u041A\u0440\u0430\u0441\u0430\u0432\u0456\u043A", "\u0422\u0440\u0430\u0432\u0435\u043D\u044C", "\u0427\u044D\u0440\u0432\u0435\u043D\u044C", "\u041B\u0456\u043F\u0435\u043D\u044C", "\u0416\u043D\u0456\u0432\u0435\u043D\u044C", "\u0412\u0435\u0440\u0430\u0441\u0435\u043D\u044C", "\u041A\u0430\u0441\u0442\u0440\u044B\u0447\u043D\u0456\u043A", "\u041B\u0456\u0441\u0442\u0430\u043F\u0430\u0434", "\u0421\u043D\u0435\u0436\u0430\u043D\u044C", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u0440\u0443\u0431"; + static final String intlCurrencySymbol = "BYB"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_bn_IN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_bn_IN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_bn_IN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_bn_IN.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_bn_IN extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##,##0.###"; + static final String percentFormat = "#,##,##0%"; + static final String[] weekdays = { null, "\u09B0\u09AC\u09BF\u09AC\u09BE\u09B0", "\u09B8\u09CB\u09AE\u09AC\u09BE\u09B0", "\u09AE\u0999\u0997\u09B2\u09AC\u09BE\u09B0", "\u09AC\u09C1\u09A7\u09AC\u09BE\u09B0", "\u09AC\u09C3\u09B9\u09B8\u09CD\u09AA\u09A4\u09BF\u09AC\u09BE\u09B0", "\u09B6\u09C1\u0995\u09CD\u09B0\u09AC\u09BE\u09B0", "\u09B6\u09A8\u09BF\u09AC\u09BE\u09B0" }; + + static final String[] shortWeekdays = { null, "\u09B0\u09AC\u09BF", "\u09B8\u09CB\u09AE", "\u09AE\u0999\u0997\u09B2", "\u09AC\u09C1\u09A7", "\u09AC\u09C3\u09B9\u09B8\u09CD\u09AA\u09A4\u09BF", "\u09B6\u09C1\u0995\u09CD\u09B0", "\u09B6\u09A8\u09BF" }; + + static final String[] shortMonths = { "\u099C\u09BE\u09A8\u09C1\u09DF\u09BE\u09B0\u09C0", "\u09AB\u09C7\u09AC\u09CD\u09B0\u09C1\u09DF\u09BE\u09B0\u09C0", "\u09AE\u09BE\u09B0\u09CD\u099A", "\u098F\u09AA\u09CD\u09B0\u09BF\u09B2", "\u09AE\u09C7", "\u099C\u09C1\u09A8", "\u099C\u09C1\u09B2\u09BE\u0987", "\u0986\u0997\u09B8\u09CD\u099F", "\u09B8\u09C7\u09AA\u09CD\u099F\u09C7\u09AE\u09CD\u09AC\u09B0", "\u0985\u0995\u09CD\u099F\u09CB\u09AC\u09B0", "\u09A8\u09AD\u09C7\u09AE\u09CD\u09AC\u09B0", "\u09A1\u09BF\u09B8\u09C7\u09AE\u09CD\u09AC\u09B0", null }; + + static final String[] months = { "\u099C\u09BE\u09A8\u09C1\u09DF\u09BE\u09B0\u09C0", "\u09AB\u09C7\u09AC\u09CD\u09B0\u09C1\u09DF\u09BE\u09B0\u09C0", "\u09AE\u09BE\u09B0\u09CD\u099A", "\u098F\u09AA\u09CD\u09B0\u09BF\u09B2", "\u09AE\u09C7", "\u099C\u09C1\u09A8", "\u099C\u09C1\u09B2\u09BE\u0987", "\u0986\u0997\u09B8\u09CD\u099F", "\u09B8\u09C7\u09AA\u09CD\u099F\u09C7\u09AE\u09CD\u09AC\u09B0", "\u0985\u0995\u09CD\u099F\u09CB\u09AC\u09B0", "\u09A8\u09AD\u09C7\u09AE\u09CD\u09AC\u09B0", "\u09A1\u09BF\u09B8\u09C7\u09AE\u09CD\u09AC\u09B0", null }; + + static final String[] ampms = { "\u09AA\u09C2\u09B0\u09CD\u09AC\u09BE\u09B9\u09CD\u09A3", "\u0985\u09AA\u09B0\u09BE\u09B9\u09CD\u09A3" }; + + static final String shortDateFormat = "EEEE dd MMM yyyy"; + static final String defaultTimeFormat = "hh:m:s a z"; + static final String currencySymbol = "\u099F\u09BE\u0995\u09BE"; + static final String intlCurrencySymbol = "INR"; + static final String currencyFormat = "$ #,###,#0.00;-$ #,###,#0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_br_FR.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_br_FR.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_br_FR.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_br_FR.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_br_FR extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "sul", "lun", "meurzh", "merc'her", "yaou", "gwener", "sadorn" }; + + static final String[] shortWeekdays = { null, "sul", "lun", "meu", "mer", "yao", "gwe", "sad" }; + + static final String[] shortMonths = { "Gen ", "C'hw", "Meu ", "Ebr ", "Mae ", "Eve ", "Gou ", "Eos ", "Gwe ", "Her ", "Du ", "Ker ", null }; + + static final String[] months = { "Genver", "C'hwevrer", "Meurzh", "Ebrel", "Mae", "Mezheven", "Gouere", "Eost", "Gwengolo", "Here", "Du", "Kerzu", null }; + + static final String[] ampms = { " ", " " }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = "hhem:s a"; + static final String currencySymbol = "F"; + static final String intlCurrencySymbol = "FRF"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_bs_BA.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_bs_BA.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_bs_BA.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_bs_BA.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_bs_BA extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "\u010Cetvrtak", "Petak", "Subota" }; + + static final String[] shortWeekdays = { null, "Ned", "Pon", "Uto", "Sri", "\u010Cet", "Pet", "Sub" }; + + static final String[] shortMonths = { "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec", null }; + + static final String[] months = { "Januar", "Februar", "Mart", "April", "Maj", "Juni", "Juli", "August", "Septembar", "Oktobar", "Novembar", "Decembar", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "KM"; + static final String intlCurrencySymbol = "BAK"; + static final String currencyFormat = "$ #,###,##0.00;-$ #,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ca_ES.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ca_ES.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ca_ES.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ca_ES.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ca_ES extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte" }; + + static final String[] shortWeekdays = { null, "dg", "dl", "dt", "dc", "dj", "dv", "ds" }; + + static final String[] shortMonths = { "gen", "feb", "mar", "abr", "mai", "jun", "jul", "ago", "set", "oct", "nov", "des", null }; + + static final String[] months = { "gener", "febrer", "mar\u00E7", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd/MM/yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "Pts"; + static final String intlCurrencySymbol = "ESP"; + static final String currencyFormat = "$ #,###,#0.;-$ #,###,#0."; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_cs_CZ.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_cs_CZ.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_cs_CZ.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_cs_CZ.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_cs_CZ extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "\u00A0"; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "Ned\u011Ble", "Pond\u011Bl\u00ED", "\u00DAter\u00FD", "St\u0159eda", "\u010Ctvrtek", "P\u00E1tek", "Sobota" }; + + static final String[] shortWeekdays = { null, "Ne", "Po", "\u00DAt", "St", "\u010Ct", "P\u00E1", "So" }; + + static final String[] shortMonths = { "led", "\u00FAno", "b\u0159e", "dub", "kv\u011B", "\u010Den", "\u010Dec", "srp", "z\u00E1\u0159", "\u0159\u00EDj", "lis", "pro", null }; + + static final String[] months = { "leden", "\u00FAnor", "b\u0159ezen", "duben", "kv\u011Bten", "\u010Derven", "\u010Dervenec", "srpen", "z\u00E1\u0159\u00ED", "\u0159\u00EDjen", "listopad", "prosinec", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = "hh:m:s"; + static final String currencySymbol = "K\u010D"; + static final String intlCurrencySymbol = "CZK"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_cy_GB.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_cy_GB.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_cy_GB.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_cy_GB.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_cy_GB extends ListResourceBundle + { + static final String decimalSeparator = LocaleInformation_en_GB.decimalSeparator; + static final String groupingSeparator = LocaleInformation_en_GB.groupingSeparator; + static final String numberFormat = LocaleInformation_en_GB.numberFormat; + static final String percentFormat = LocaleInformation_en_GB.percentFormat; + static final String[] weekdays = { null, "Sul", "Llun", "Mawrth", "Mercher", "Iau", "Gwener", "Sadwrn" }; + + static final String[] shortWeekdays = { null, "Sul", "Llu", "Maw", "Mer", "Iau", "Gwe", "Sad" }; + + static final String[] shortMonths = { "Ion", "Chw", "Maw", "Ebr", "Mai", "Meh", "Gor", "Aws", "Med", "Hyd", "Tach", "Rha", null }; + + static final String[] months = { "Ionawr", "Chwefror", "Mawrth", "Ebrill", "Mai", "Mehefin", "Gorffennaf", "Awst", "Medi", "Hydref", "Tachwedd", "Rhagfyr", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = LocaleInformation_en_GB.currencySymbol; + static final String intlCurrencySymbol = LocaleInformation_en_GB.intlCurrencySymbol; + static final String currencyFormat = LocaleInformation_en_GB.currencyFormat; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_da_DK.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_da_DK.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_da_DK.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_da_DK.java Tue Jan 8 23:56:22 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_da_DK extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "s\u00F8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00F8rdag" }; + + static final String[] shortWeekdays = { null, "s\u00F8n", "man", "tir", "ons", "tor", "fre", "l\u00F8r" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd-MM-yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "kr"; + static final String intlCurrencySymbol = "DKK"; + static final String currencyFormat = "$ #,###,##0.00;$ -#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_de.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_de.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_de.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_de.java Tue Jan 22 22:39:56 2002 *************** *** 0 **** --- 1,231 ---- + /* LocaleInformation_de.java -- German locale data + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.locale; + + import java.util.ListResourceBundle; + import java.util.Calendar; + + /** + * This class contains locale data for the German locale + * @author Jochen Hoenicke + */ + public class LocaleInformation_de extends ListResourceBundle + { + + /* + * This area is used for defining object values + */ + + /** + * This is the set of collation rules used by java.text.RuleBasedCollator + * to sort strings properly. See the documentation of that class for the + * proper format. + */ + private static final String collation_rules = + "<0<1<2<3<4<5<6<7<8<9", "Mer", "Ebr", "Me", "Evn", "Gor", "Est", "Gwn", "Hed", "Du", "Kev", null }; + + static final String[] months = { "Mys Genver", "Mys Whevrel", "Mys Merth", "Mys Ebrel", "Mys Me", "Mys Evan", "Mys Gortheren", "Mye Est", "Mys Gwyngala", "Mys Hedra", "Mys Du", "Mys Kevardhu", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd/MM/yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u00A3"; + static final String intlCurrencySymbol = "GBP"; + static final String currencyFormat = "$#,###,##0.00;-$#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_lt_LT.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_lt_LT.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_lt_LT.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_lt_LT.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_lt_LT extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "Sekmadienis", "Pirmadienis", "Antradienis", "Tre\u010Diadienis", "Ketvirtadienis", "Penktadienis", "\u0160e\u0161tadienis" }; + + static final String[] shortWeekdays = { null, "Sk", "Pr", "An", "Tr", "Kt", "Pn", "\u0160t" }; + + static final String[] shortMonths = { "Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rgp", "Rgs", "Spa", "Lap", "Grd", null }; + + static final String[] months = { "sausio", "vasario", "kovo", "baland\u017Eio", "gegu\u017E\u0117s", "bir\u017Eelio", "liepos", "rugpj\u016B\u010Dio", "rugs\u0117jo", "spalio", "lapkri\u010Dio", "gruod\u017Eio", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "yyyy.MM.dd"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "Lt"; + static final String intlCurrencySymbol = "LTL"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_lv_LV.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_lv_LV.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_lv_LV.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_lv_LV.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_lv_LV extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "\u00A0"; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "sv\u0113tdiena", "pirmdiena", "otrdiena", "tre\u0161diena", "ceturtdiena", "piektdiena", "sestdiena" }; + + static final String[] shortWeekdays = { null, "Sv", "P\u00A0", "O\u00A0", "T\u00A0", "C\u00A0", "Pk", "S\u00A0" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "mai", "j\u016Bn", "j\u016Bl", "aug", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "janv\u0101ris", "febru\u0101ris", "marts", "apr\u012Blis", "maijs", "j\u016Bnijs", "j\u016Blijs", "augusts", "septembris", "oktobris", "novembris", "decembris", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "yyyy.MM.dd."; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "Ls"; + static final String intlCurrencySymbol = "LVL"; + static final String currencyFormat = "$ #,###,##0.00;-$ #,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mi_NZ.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mi_NZ.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mi_NZ.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mi_NZ.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_mi_NZ extends ListResourceBundle + { + static final String decimalSeparator = LocaleInformation_en_NZ.decimalSeparator; + static final String groupingSeparator = LocaleInformation_en_NZ.groupingSeparator; + static final String numberFormat = LocaleInformation_en_NZ.numberFormat; + static final String percentFormat = LocaleInformation_en_NZ.percentFormat; + static final String[] weekdays = { null, "R\u0101tapu", "Mane", "T\u016Brei", "Wenerei", "T\u0101ite", "Paraire", "H\u0101tarei" }; + + static final String[] shortWeekdays = { null, "Ta", "Ma", "T\u016B", "We", "T\u0101i", "Pa", "H\u0101" }; + + static final String[] shortMonths = { "Kohi", "Hui", "Pou", "Pae", "Hara", "Pipi", "H\u014Dngoi", "Here", "Mahu", "Whi-nu", "Whi-ra", "Haki", null }; + + static final String[] months = { "Kohi-t\u0101tea", "Hui-tanguru", "Pout\u016B-te-rangi", "Paenga-wh\u0101wh\u0101", "Haratua", "Pipiri", "H\u014Dngoingoi", "Here-turi-k\u014Dk\u0101", "Mahuru", "Whiringa-\u0101-nuku", "Whiringa-\u0101-rangi", "Hakihea", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd/MM/yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = LocaleInformation_en_NZ.currencySymbol; + static final String intlCurrencySymbol = LocaleInformation_en_NZ.intlCurrencySymbol; + static final String currencyFormat = LocaleInformation_en_NZ.currencyFormat; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mk_MK.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mk_MK.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mk_MK.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mk_MK.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_mk_MK extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = " "; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "\u043D\u0435\u0434\u0435\u043B\u0430", "\u043F\u043E\u043D\u0435\u0434\u0435\u043B\u043D\u0438\u043A", "\u0432\u0442\u043E\u0440\u043D\u0438\u043A", "\u0441\u0440\u0435\u0434\u0430", "\u0447\u0435\u0442\u0432\u0440\u0442\u043E\u043A", "\u043F\u0435\u0442\u043E\u043A", "\u0441\u0430\u0431\u043E\u0442\u0430" }; + + static final String[] shortWeekdays = { null, "\u043D\u0435\u0434", "\u043F\u043E\u043D", "\u0432\u0442\u043E", "\u0441\u0440\u0435", "\u0447\u0435\u0442", "\u043F\u0435\u0442", "\u0441\u0430\u0431" }; + + static final String[] shortMonths = { "\u0458\u0430\u043D", "\u0444\u0435\u0432", "\u043C\u0430\u0440", "\u0430\u043F\u0440", "\u043C\u0430\u0458", "\u0458\u0443\u043D", "\u0458\u0443\u043B", "\u0430\u0432\u0433", "\u0441\u0435\u043F", "\u043E\u043A\u0442", "\u043D\u043E\u0435", "\u0434\u0435\u043A", null }; + + static final String[] months = { "\u0458\u0430\u043D\u0443\u0430\u0440\u0438", "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438", "\u043C\u0430\u0440\u0442", "\u0430\u043F\u0440\u0438\u043B", "\u043C\u0430\u0458", "\u0458\u0443\u043D\u0438", "\u0458\u0443\u043B\u0438", "\u0430\u0432\u0433\u0443\u0441\u0442", "\u0441\u0435\u043F\u0442\u0435\u043C\u0432\u0440\u0438", "\u043E\u043A\u0442\u043E\u043C\u0432\u0440\u0438", "\u043D\u043E\u0435\u043C\u0432\u0440\u0438", "\u0434\u0435\u043A\u0435\u043C\u0432\u0440\u0438", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u0434\u0435\u043D"; + static final String intlCurrencySymbol = "MKD"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mr_IN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mr_IN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mr_IN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mr_IN.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_mr_IN extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u0930\u0935\u093F\u0935\u093E\u0930", "\u0938\u094B\u092E\u0935\u093E\u0930", "\u092E\u0902\u0917\u0933\u0935\u093E\u0930", "\u092E\u0902\u0917\u0933\u0935\u093E\u0930", "\u0917\u0941\u0930\u0941\u0935\u093E\u0930", "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930", "\u0936\u0928\u093F\u0935\u093E\u0930" }; + + static final String[] shortWeekdays = { null, "\u0930\u0935\u093F", "\u0938\u094B\u092E", "\u092E\u0902\u0917\u0933", "\u092C\u0941\u0927", "\u0917\u0941\u0930\u0941", "\u0936\u0941\u0915\u094D\u0930", "\u0936\u0928\u093F" }; + + static final String[] shortMonths = { "\u091C\u093E\u0928\u0947\u0935\u093E\u0930\u0940", "\u092B\u0947\u092C\u0943\u0935\u093E\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u090F\u092A\u094D\u0930\u093F\u0932", "\u092E\u0947", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u0948", "\u0913\u0917\u0938\u094D\u091F", "\u0938\u0947\u092A\u094D\u091F\u0947\u0902\u092C\u0930", "\u0913\u0915\u094D\u091F\u094B\u092C\u0930", "\u0928\u094B\u0935\u094D\u0939\u0947\u0902\u092C\u0930", "\u0921\u093F\u0938\u0947\u0902\u092C\u0930", null }; + + static final String[] months = { "\u091C\u093E\u0928\u0947\u0935\u093E\u0930\u0940", "\u092B\u0947\u092C\u0943\u0935\u093E\u0930\u0940", "\u092E\u093E\u0930\u094D\u091A", "\u090F\u092A\u094D\u0930\u093F\u0932", "\u092E\u0947", "\u091C\u0942\u0928", "\u091C\u0941\u0932\u0948", "\u0913\u0917\u0938\u094D\u091F", "\u0938\u0947\u092A\u094D\u091F\u0947\u0902\u092C\u0930", "\u0913\u0915\u094D\u091F\u094B\u092C\u0930", "\u0928\u094B\u0935\u094D\u0939\u0947\u0902\u092C\u0930", "\u0921\u093F\u0938\u0947\u0902\u092C\u0930", null }; + + static final String[] ampms = { "\u092E.\u092A\u0942.", "\u092E.\u0928\u0902." }; + + static final String shortDateFormat = "EEEE dd MMM yyyy"; + static final String defaultTimeFormat = "hh:m:s a z"; + static final String currencySymbol = "\u0930\u0941"; + static final String intlCurrencySymbol = "INR"; + static final String currencyFormat = "$ #,##0.00;-$ #,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mt_MT.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mt_MT.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_mt_MT.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_mt_MT.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_mt_MT extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "il-\u0126add", "it-Tnejn", "it-Tlieta", "l-Erbg\u0127a", "il-\u0126amis", "il-\u0120img\u0127a", "is-Sibt" }; + + static final String[] shortWeekdays = { null, "\u0126ad", "Tne", "Tli", "Erb", "\u0126am", "\u0120im", "Sib" }; + + static final String[] shortMonths = { "Jan", "Fra", "Mar", "Apr", "Mej", "\u0120un", "Lul", "Awi", "Set", "Ott", "Nov", "Di\u010B", null }; + + static final String[] months = { "Jannar", "Frar", "Marzu", "April", "Mejju", "\u0120unju", "Lulju", "Awissu", "Settembru", "Ottubru", "Novembru", "Di\u010Bembru ", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "EEEE, dd ta MMM, yyyy"; + static final String defaultTimeFormat = "hh:m:s a z"; + static final String currencySymbol = "Lm"; + static final String intlCurrencySymbol = "MTL"; + static final String currencyFormat = "$#,##0.00;($#,##0.00)"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nl.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nl.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nl.java Tue Jan 22 22:39:56 2002 *************** *** 0 **** --- 1,315 ---- + /* LocaleInformation_nl.java -- Dutch locale data + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.locale; + + import java.util.ListResourceBundle; + import java.util.Calendar; + import java.util.Date; + + /** + * This class contains locale data for the Dutch locale + */ + + public class LocaleInformation_nl extends ListResourceBundle + { + + /* + * This area is used for defining object values + */ + + /** + * This is the set of collation rules used by java.text.RuleBasedCollator + * to sort strings properly. See the documentation of that class for the + * proper format. + *

    + * This is the same rule as used in the English locale. + */ + private static final String collation_rules = + "<0<1<2<3<4<5<6<7<8<9 + * Is there a real equivalent in Dutch? "Voormiddag"/"Namiddag"? + * Just using the Latin names for now. + */ + private static final String[] ampms = { "AM", "PM" }; + + /** + * This is the list of era identifiers + *

    + * Is there a real equivalent in Dutch? "voor Christus"/"na Christus"? + * Just use the Latin/English names for now. + */ + private static final String[] eras = { "BC", "AD" }; + + /** + * This is the list of timezone strings. The JDK appears to include a + * city name as the sixth element. + * XXX - TODO - FIXME - Which timezones should be included here and how are + * they called? + */ + private static final String[][] zoneStrings = + { + // European time zones. The city names are a little bit random. + { "WET", "West Europese Tijd", "WET", "West Europese Zomertijd", "WEST", "London" }, + { "CET", "Centraal Europese Tijd", "CET", "Centraal Europese Zomertijd", "CEST", "Amsterdam" }, + { "EET", "Oost Europese Tijd", "EET", "Oost Europese Zomertijd", "EEST", "Istanbul" }, + }; + + /** + * This is the list of pattern characters for formatting dates + *

    + * This is the same as the English locale uses: era (G), year (y), month (M), + * month (d), hour from 1-12 (h), hour 0-23 (H), minute (m), second (s), + * millisecond (S), date of week (E), date of year (D), + * day of week in month (F), week in year (w), week in month (W), am/pm (a), + * hour from 1-24 (k), hour from 0-11 (K), time zone (z). + * Why would you use others? + */ + private static final String localPatternChars = "GyMdhHmsSEDFwWakKz"; // Not a mistake! + + /** + * This is the DateFormat.SHORT date format + */ + private static final String shortDateFormat = "dd-MM-yy"; + + /** + * This is the DateFormat.MEDIUM format + */ + private static final String mediumDateFormat = "dd-MMM-yy"; + + /** + * This is the DateFormat.LONG format + */ + private static final String longDateFormat = "dd MMMM yyyy"; + + /** + * This is the DateFormat.FULL format + */ + private static final String fullDateFormat = "EEEE dd MMMM yyyy"; + + /** + * This is the DateFormat.DEFAULT format + */ + private static final String defaultDateFormat = mediumDateFormat; + + /** + * This is the TimeFormat.SHORT format + */ + private static final String shortTimeFormat = "HH:mm"; + + /** + * This is the TimeFormat.MEDIUM format + */ + private static final String mediumTimeFormat = "HH:mm:ss"; + + /** + * This is the TimeFormat.LONG format + */ + private static final String longTimeFormat = "HH:mm:ss"; + + /** + * This is the TimeFormat.FULL format + */ + private static final String fullTimeFormat = "HH:mm:ss z"; + + /** + * This is the TimeFormat.DEFAULT format + */ + private static final String defaultTimeFormat = shortTimeFormat; + + /** + * This is the currency symbol + */ + private static final String currencySymbol = "fl"; + + /** + * This is the international currency symbol. + */ + private static final String intlCurrencySymbol = "NLG"; + + /** + * This is the decimal point. + */ + private static final String decimalSeparator = ","; + + /** + * This is the exponential symbol + */ + private static final String exponential = "E"; + + /** + * This is the char used for digits in format strings + */ + private static final String digit = "#"; + + /** + * This is the grouping separator symbols + */ + private static final String groupingSeparator = ","; + + /** + * This is the symbols for infinity + */ + private static final String infinity = "\u221e"; + + /** + * This is the symbol for the not a number value + */ + private static final String NaN = "\ufffd"; + + /** + * This is the minus sign symbol. + */ + private static final String minusSign = "-"; + + /** + * This is the decimal separator in monetary values. + */ + private static final String monetarySeparator = ","; + + /** + * This is the separator between positive and negative subpatterns. + */ + private static final String patternSeparator = ";"; + + /** + * This is the percent sign + */ + private static final String percent = "%"; + + /** + * This is the per mille sign + */ + private static final String perMill = "\u2030"; + + /** + * This is the character for zero. + */ + private static final String zeroDigit = "0"; + + /*************************************************************************/ + + /** + * This is the object array used to hold the keys and values + * for this bundle + */ + + private static final Object[][] contents = + { + // For RuleBasedCollator + { "collation_rules", collation_rules }, + // For SimpleDateFormat/DateFormatSymbols + { "months", months }, + { "shortMonths", shortMonths }, + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "ampms", ampms }, + { "eras", eras }, + { "zoneStrings", zoneStrings }, + { "localPatternChars", localPatternChars }, + { "shortDateFormat", shortDateFormat }, + { "mediumDateFormat", mediumDateFormat }, + { "longDateFormat", longDateFormat }, + { "fullDateFormat", fullDateFormat }, + { "defaultDateFormat", defaultDateFormat }, + { "shortTimeFormat", shortTimeFormat }, + { "mediumTimeFormat", mediumTimeFormat }, + { "longTimeFormat", longTimeFormat }, + { "fullTimeFormat", fullTimeFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + // For DecimalFormat/DecimalFormatSymbols + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "decimalSeparator", decimalSeparator }, + { "digit", digit }, + { "exponential", exponential }, + { "groupingSeparator", groupingSeparator }, + { "infinity", infinity }, + { "NaN", NaN }, + { "minusSign", minusSign }, + { "monetarySeparator", monetarySeparator }, + { "patternSeparator", patternSeparator }, + { "percent", percent }, + { "perMill", perMill }, + { "zeroDigit", zeroDigit }, + }; + + /*************************************************************************/ + + /** + * This method returns the object array of key, value pairs containing + * the data for this bundle. + * + * @return The key, value information. + */ + public Object[][] + getContents() + { + return(contents); + } + + } // class LocaleInformation_nl diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nl_BE.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nl_BE.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nl_BE.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nl_BE.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_nl_BE extends ListResourceBundle + { + static final String decimalSeparator = LocaleInformation_fr_BE.decimalSeparator; + static final String groupingSeparator = LocaleInformation_fr_BE.groupingSeparator; + static final String numberFormat = LocaleInformation_fr_BE.numberFormat; + static final String percentFormat = LocaleInformation_fr_BE.percentFormat; + static final String[] weekdays = { null, "zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag" }; + + static final String[] shortWeekdays = { null, "zo", "ma", "di", "wo", "do", "vr", "za" }; + + static final String[] shortMonths = { "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd-MM-yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = LocaleInformation_fr_BE.currencySymbol; + static final String intlCurrencySymbol = LocaleInformation_fr_BE.intlCurrencySymbol; + static final String currencyFormat = LocaleInformation_fr_BE.currencyFormat; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nl_NL.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nl_NL.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nl_NL.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nl_NL.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_nl_NL extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag" }; + + static final String[] shortWeekdays = { null, "zo", "ma", "di", "wo", "do", "vr", "za" }; + + static final String[] shortMonths = { "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd-MM-yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "fl"; + static final String intlCurrencySymbol = "NLG"; + static final String currencyFormat = "$ #,###,##0.00;$ #,###,##0.00-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nn_NO.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nn_NO.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_nn_NO.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_nn_NO.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_nn_NO extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "\u00A0"; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "sundag ", "m\u00E5ndag ", "tysdag ", "onsdag ", "torsdag ", "fredag ", "laurdag " }; + + static final String[] shortWeekdays = { null, "su ", "m\u00E5 ", "ty ", "on ", "to ", "fr ", "lau " }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des", null }; + + static final String[] months = { "januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd. MMM yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "kr"; + static final String intlCurrencySymbol = "NOK"; + static final String currencyFormat = "$ #,##0.00;-$#,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_no_NO.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_no_NO.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_no_NO.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_no_NO.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_no_NO extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "s\u00F8ndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "l\u00F8rdag" }; + + static final String[] shortWeekdays = { null, "s\u00F8n", "man", "tir", "ons", "tor", "fre", "l\u00F8r" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des", null }; + + static final String[] months = { "januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd-MM-yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "kr"; + static final String intlCurrencySymbol = "NOK"; + static final String currencyFormat = "$#,###,##0.00;$-#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_oc_FR.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_oc_FR.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_oc_FR.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_oc_FR.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_oc_FR extends ListResourceBundle + { + static final String decimalSeparator = LocaleInformation_fr_FR.decimalSeparator; + static final String groupingSeparator = LocaleInformation_fr_FR.groupingSeparator; + static final String numberFormat = LocaleInformation_fr_FR.numberFormat; + static final String percentFormat = LocaleInformation_fr_FR.percentFormat; + static final String[] weekdays = { null, "dimenge", "diluns", "dimars", "dimecres", "dij\u00F3us", "divendres", "disabte" }; + + static final String[] shortWeekdays = { null, "dim", "lun", "mar", "mec", "j\u00F3u", "ven", "sab" }; + + static final String[] shortMonths = { "gen", "feb", "mar", "abr", "mai", "jun", "jul", "ag\u00F3", "set", "oct", "nov", "dec", null }; + + static final String[] months = { "geni\u00E8r", "febri\u00E8r", "mar\u00E7", "abrial", "mai", "junh", "julhet", "ag\u00F3st", "setembre", "octobre", "novembre", "decembre", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = LocaleInformation_fr_FR.currencySymbol; + static final String intlCurrencySymbol = LocaleInformation_fr_FR.intlCurrencySymbol; + static final String currencyFormat = LocaleInformation_fr_FR.currencyFormat; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_pl_PL.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_pl_PL.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_pl_PL.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_pl_PL.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_pl_PL extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "niedziela", "poniedzia\u0142ek", "wtorek", "\u015Broda", "czwartek", "pi\u0105tek", "sobota" }; + + static final String[] shortWeekdays = { null, "nie", "pon", "wto", "\u015Bro", "czw", "pi\u0105", "sob" }; + + static final String[] shortMonths = { "sty", "lut", "mar", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017A", "lis", "gru", null }; + + static final String[] months = { "stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017Adziernik", "listopad", "grudzie\u0144", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "yyyy-MM-dd"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "Z\u0142"; + static final String intlCurrencySymbol = "PLZ"; + static final String currencyFormat = "$#,###,##0.00;-$#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_pt_BR.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_pt_BR.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_pt_BR.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_pt_BR.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_pt_BR extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "domingo", "segunda", "ter\u00E7a", "quarta", "quinta", "sexta", "s\u00E1bado" }; + + static final String[] shortWeekdays = { null, "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00E1b" }; + + static final String[] shortMonths = { "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez", null }; + + static final String[] months = { "janeiro", "fevereiro", "mar\u00E7o", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd-MM-yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "R$"; + static final String intlCurrencySymbol = "BRL"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_pt_PT.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_pt_PT.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_pt_PT.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_pt_PT.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_pt_PT extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "Domingo", "Segunda", "Ter\u00E7a", "Quarta", "Quinta", "Sexta", "S\u00E1bado" }; + + static final String[] shortWeekdays = { null, "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "S\u00E1b" }; + + static final String[] shortMonths = { "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez", null }; + + static final String[] months = { "Janeiro", "Fevereiro", "Mar\u00E7o", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd-MM-yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "Esc"; + static final String intlCurrencySymbol = "PTE"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ro_RO.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ro_RO.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ro_RO.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ro_RO.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ro_RO extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "Duminic\u0102", "Luni", "Mar\u0163i", "Miercuri", "Joi", "Vineri", "S\u00EEmb\u0102t\u0102" }; + + static final String[] shortWeekdays = { null, "Du", "Lu", "Ma", "Mi", "Jo", "Vi", "S\u00EE" }; + + static final String[] shortMonths = { "ian", "feb", "mar", "apr", "mai", "iun", "iul", "aug", "sep", "oct", "nov", "dec", null }; + + static final String[] months = { "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "yyyy-MM-dd"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "Lei"; + static final String intlCurrencySymbol = "ROL"; + static final String currencyFormat = "$ #,###,##0.00;-$ #,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ru_RU.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ru_RU.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ru_RU.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ru_RU.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ru_RU extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "\u0412\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435", "\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A", "\u0412\u0442\u043E\u0440\u043D\u0438\u043A", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041F\u044F\u0442\u043D\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043E\u0442\u0430" }; + + static final String[] shortWeekdays = { null, "\u0412\u0441\u043A", "\u041F\u043D\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041F\u0442\u043D", "\u0421\u0431\u0442" }; + + static final String[] shortMonths = { "\u042F\u043D\u0432", "\u0424\u0435\u0432", "\u041C\u0430\u0440", "\u0410\u043F\u0440", "\u041C\u0430\u0439", "\u0418\u044E\u043D", "\u0418\u044E\u043B", "\u0410\u0432\u0433", "\u0421\u0435\u043D", "\u041E\u043A\u0442", "\u041D\u043E\u044F", "\u0414\u0435\u043A", null }; + + static final String[] months = { "\u042F\u043D\u0432\u0430\u0440\u044F", "\u0424\u0435\u0432\u0440\u0430\u043B\u044F", "\u041C\u0430\u0440\u0442\u0430", "\u0410\u043F\u0440\u0435\u043B\u044F", "\u041C\u0430\u044F", "\u0418\u044E\u043D\u044F", "\u0418\u044E\u043B\u044F", "\u0410\u0432\u0433\u0443\u0441\u0442\u0430", "\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044F", "\u041E\u043A\u0442\u044F\u0431\u0440\u044F", "\u041D\u043E\u044F\u0431\u0440\u044F", "\u0414\u0435\u043A\u0430\u0431\u0440\u044F", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u0440\u0443\u0431"; + static final String intlCurrencySymbol = "RUR"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ru_UA.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ru_UA.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ru_UA.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ru_UA.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ru_UA extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "\u0412\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435", "\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A", "\u0412\u0442\u043E\u0440\u043D\u0438\u043A", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041F\u044F\u0442\u043D\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043E\u0442\u0430" }; + + static final String[] shortWeekdays = { null, "\u0412\u0441\u043A", "\u041F\u043D\u0434", "\u0412\u0442\u043E", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041F\u0442\u043D", "\u0421\u0443\u0431" }; + + static final String[] shortMonths = { "\u042F\u043D\u0432", "\u0424\u0435\u0432", "\u041C\u0430\u0440", "\u0410\u043F\u0440", "\u041C\u0430\u0439", "\u0418\u044E\u043D", "\u0418\u044E\u043B", "\u0410\u0432\u0433", "\u0421\u0435\u043D", "\u041E\u043A\u0442", "\u041D\u043E\u044F", "\u0414\u0435\u043A", null }; + + static final String[] months = { "\u042F\u043D\u0432\u0430\u0440\u044C", "\u0424\u0435\u0432\u0440\u0430\u043B\u044C", "\u041C\u0430\u0440\u0442", "\u0410\u043F\u0440\u0435\u043B\u044C", "\u041C\u0430\u0439", "\u0418\u044E\u043D\u044C", "\u0418\u044E\u043B\u044C", "\u0410\u0432\u0433\u0443\u0441\u0442", "\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C", "\u041E\u043A\u0442\u044F\u0431\u0440\u044C", "\u041D\u043E\u044F\u0431\u0440\u044C", "\u0414\u0435\u043A\u0430\u0431\u0440\u044C", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u0433\u0440"; + static final String intlCurrencySymbol = "UAH"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_se_NO.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_se_NO.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_se_NO.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_se_NO.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_se_NO extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "sotnabeaivi", "vuoss\u00E1rga", "ma\u014B\u014Bebarga", "gaskavahkku", "duorasdat", "bearjadat", "l\u00E1vvardat" }; + + static final String[] shortWeekdays = { null, "sotn", "vuos", "ma\u014B", "gask", "duor", "bear", "l\u00E1v" }; + + static final String[] shortMonths = { "o\u0111\u0111j", "guov", "njuk", "cuo\u014B", "mies", "geas", "suoi", "borg", "\u010Dak\u010D", "golg", "sk\u00E1b", "juov", null }; + + static final String[] months = { "o\u0111\u0111ajagem\u00E1nu", "guovvam\u00E1nu", "njuk\u010Dam\u00E1nu", "cuo\u014Bom\u00E1nu", "miessem\u00E1nu", "geassem\u00E1nu", "suoidnem\u00E1nu", "borgem\u00E1nu", "\u010Dak\u010Dam\u00E1nu", "golggotm\u00E1nu", "sk\u00E1bmam\u00E1nu", "juovlam\u00E1nu", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "yyyy-MM-dd"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = " ru"; + static final String intlCurrencySymbol = "NOK"; + static final String currencyFormat = "$#,###,##0.00;$-#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sk_SK.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sk_SK.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sk_SK.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sk_SK.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_sk_SK extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "\u00A0"; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "Nede\u013Ea", "Pondelok", "Utorok", "Streda", "\u0160tvrtok", "Piatok", "Sobota" }; + + static final String[] shortWeekdays = { null, "Ne", "Po", "Ut", "St", "\u0160t", "Pi", "So" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "m\u00E1j", "j\u00FAn", "j\u00FAl", "aug", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "janu\u00E1r", "febru\u00E1r", "marec", "apr\u00EDl", "m\u00E1j", "j\u00FAn", "j\u00FAl", "august", "september", "okt\u00F3ber", "november", "december", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = "hh:m:s"; + static final String currencySymbol = "Sk"; + static final String intlCurrencySymbol = "SKK"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sl_SI.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sl_SI.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sl_SI.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sl_SI.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_sl_SI extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = " "; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "nedelja", "ponedeljek", "torek", "sreda", "\u010Detrtek", "petek", "sobota" }; + + static final String[] shortWeekdays = { null, "ned", "pon", "tor", "sre", "\u010Det", "pet", "sob" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "avg", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "januar", "februar", "marec", "april", "maj", "junij", "julij", "avgust", "september", "oktober", "november", "december", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "SIT"; + static final String intlCurrencySymbol = "SIT"; + static final String currencyFormat = "#,###,##0.00 $;#,###,##0.00 $-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sq_AL.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sq_AL.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sq_AL.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sq_AL.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_sq_AL extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "e diel ", "e h\u00EBn\u00EB ", "e mart\u00EB ", "e m\u00EBrkur\u00EB ", "e enjte ", "e premte ", "e shtun\u00EB " }; + + static final String[] shortWeekdays = { null, "Die ", "H\u00EBn ", "Mar ", "M\u00EBr ", "Enj ", "Pre ", "Sht " }; + + static final String[] shortMonths = { "Jan", "Shk", "Mar", "Pri", "Maj", "Qer", "Kor", "Gsh", "Sht", "Tet", "N\u00EBn", "Dhj", null }; + + static final String[] months = { "janar", "shkurt", "mars", "prill", "maj", "qershor", "korrik", "gusht", "shtator", "tetor", "n\u00EBntor", "dhjetor", null }; + + static final String[] ampms = { "PD", "MD" }; + + static final String shortDateFormat = "yyyy-MMM-dd"; + static final String defaultTimeFormat = "hh.m.s.a z"; + static final String currencySymbol = "Lek"; + static final String intlCurrencySymbol = "ALL"; + static final String currencyFormat = "$#,##0.000;-$#,##0.000"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sr_YU.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sr_YU.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sr_YU.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sr_YU.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_sr_YU extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = ""; + static final String numberFormat = "#.###"; + static final String percentFormat = "#%"; + static final String[] weekdays = { null, "nedelja", "ponedeljak", "utorak", "sreda", "\u010Detvrtak", "petak", "subota" }; + + static final String[] shortWeekdays = { null, "ned", "pon", "uto", "sre", "\u010Det", "pet", "sub" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "avg", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "januar", "februar", "mart", "april", "maj", "jun", "jul", "avgust", "septembar", "oktobar", "novembar", "decembar", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd-MM-yyyy."; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "din"; + static final String intlCurrencySymbol = "YUN"; + static final String currencyFormat = "$ #,###,##0.;-$ #,###,##0."; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sv_FI.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sv_FI.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sv_FI.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sv_FI.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_sv_FI extends ListResourceBundle + { + static final String decimalSeparator = LocaleInformation_fi_FI.decimalSeparator; + static final String groupingSeparator = LocaleInformation_fi_FI.groupingSeparator; + static final String numberFormat = LocaleInformation_fi_FI.numberFormat; + static final String percentFormat = LocaleInformation_fi_FI.percentFormat; + static final String[] weekdays = { null, "s\u00F6ndag", "m\u00E5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00F6rdag" }; + + static final String[] shortWeekdays = { null, "s\u00F6n", "m\u00E5n", "tis", "ons", "tor", "fre", "l\u00F6r" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "yyyy-MM-dd"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = LocaleInformation_fi_FI.currencySymbol; + static final String intlCurrencySymbol = LocaleInformation_fi_FI.intlCurrencySymbol; + static final String currencyFormat = LocaleInformation_fi_FI.currencyFormat; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sv_SE.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sv_SE.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_sv_SE.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_sv_SE.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_sv_SE extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = " "; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "s\u00F6ndag", "m\u00E5ndag", "tisdag", "onsdag", "torsdag", "fredag", "l\u00F6rdag" }; + + static final String[] shortWeekdays = { null, "s\u00F6n", "m\u00E5n", "tis", "ons", "tor", "fre", "l\u00F6r" }; + + static final String[] shortMonths = { "jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec", null }; + + static final String[] months = { "januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "yyyy-MM-dd"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "kr"; + static final String intlCurrencySymbol = "SEK"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ta_IN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ta_IN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ta_IN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ta_IN.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ta_IN extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##,##0.###"; + static final String percentFormat = "#,##,##0%"; + static final String[] weekdays = { null, "\u0B9E\u0BBE\u0BAF\u0BBF\u0BB1\u0BC1", "\u0BA4\u0BBF\u0B99\u0BCD\u0B95\u0BB3\u0BCD", "\u0B9A\u0BC6\u0BB5\u0BCD\u0BB5\u0BBE\u0BAF\u0BCD", "\u0BAA\u0BC1\u0BA4\u0BA9\u0BCD", "\u0BB5\u0BBF\u0BAF\u0BBE\u0BB4\u0BA9\u0BCD", "\u0BB5\u0BC6\u0BB3\u0BCD\u0BB3\u0BBF", "\u0B9A\u0BA9\u0BBF" }; + + static final String[] shortWeekdays = { null, "\u0B9E", "\u0BA4", "\u0B9A", "\u0BAA", "\u0BB5", "\u0BB5", "\u0B9A" }; + + static final String[] shortMonths = { "\u0B9C\u0BA9\u0BB5\u0BB0\u0BBF", "\u0BAA\u0BC6\u0BAA\u0BCD\u0BB0\u0BB5\u0BB0\u0BBF", "\u0BAE\u0BBE\u0BB0\u0BCD\u0B9A\u0BCD", "\u0B8F\u0BAA\u0BCD\u0BB0\u0BB2\u0BCD", "\u0BAE\u0BC7", "\u0B9C\u0BC2\u0BA9\u0BCD", "\u0B9C\u0BC2\u0BB2\u0BC8", "\u0B86\u0B95\u0BB8\u0BCD\u0B9F\u0BCD", "\u0B9A\u0BC6\u0BAA\u0BCD\u0B9F\u0BAE\u0BCD\u0BAA\u0BB0\u0BCD", "\u0B85\u0B95\u0BCD\u0B9F\u0BCB\u0BAA\u0BB0\u0BCD", "\u0BA8\u0BB5\u0BAE\u0BCD\u0BAA\u0BB0\u0BCD", "\u0B9F\u0BBF\u0B9A\u0BAE\u0BCD\u0BAA\u0BB0\u0BCDr", null }; + + static final String[] months = { "\u0B9C\u0BA9\u0BB5\u0BB0\u0BBF", "\u0BAA\u0BC6\u0BAA\u0BCD\u0BB0\u0BB5\u0BB0\u0BBF", "\u0BAE\u0BBE\u0BB0\u0BCD\u0B9A\u0BCD", "\u0B8F\u0BAA\u0BCD\u0BB0\u0BB2\u0BCD", "\u0BAE\u0BC7", "\u0B9C\u0BC2\u0BA9\u0BCD", "\u0B9C\u0BC2\u0BB2\u0BC8", "\u0B86\u0B95\u0BB8\u0BCD\u0B9F\u0BCD", "\u0B9A\u0BC6\u0BAA\u0BCD\u0B9F\u0BAE\u0BCD\u0BAA\u0BB0\u0BCD", "\u0B85\u0B95\u0BCD\u0B9F\u0BCB\u0BAA\u0BB0\u0BCD", "\u0BA8\u0BB5\u0BAE\u0BCD\u0BAA\u0BB0\u0BCD", "\u0B9F\u0BBF\u0B9A\u0BAE\u0BCD\u0BAA\u0BB0\u0BCDr", null }; + + static final String[] ampms = { "\u0B95\u0BBE\u0BB2\u0BC8", "\u0BAE\u0BBE\u0BB2\u0BC8" }; + + static final String shortDateFormat = "EEEE dd MMMM yyyy"; + static final String defaultTimeFormat = "hh:m:s a z"; + static final String currencySymbol = "\u20A8"; + static final String intlCurrencySymbol = "INR"; + static final String currencyFormat = "$ #,##,##0.00;-$ #,##,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_te_IN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_te_IN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_te_IN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_te_IN.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_te_IN extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,###,#0.###"; + static final String percentFormat = "#,###,#0%"; + static final String[] weekdays = { null, "\u0C06\u0C26\u0C3F\u0C35\u0C3E\u0C30\u0C02", "\u0C38\u0C4B\u0C2E\u0C35\u0C3E\u0C30\u0C02", "\u0C2E\u0C02\u0C17\u0C33\u0C35\u0C3E\u0C30\u0C02", "\u0C2C\u0C41\u0C27\u0C35\u0C3E\u0C30\u0C02", "\u0C17\u0C41\u0C30\u0C41\u0C35\u0C3E\u0C30\u0C02", "\u0C36\u0C41\u0C15\u0C4D\u0C30\u0C35\u0C3E\u0C30\u0C02", "\u0C36\u0C28\u0C3F\u0C35\u0C3E\u0C30\u0C02" }; + + static final String[] shortWeekdays = { null, "\u0C06\u0C26\u0C3F", "\u0C38\u0C4B\u0C2E", "\u0C2E\u0C02\u0C17\u0C33", "\u0C2C\u0C41\u0C27", "\u0C17\u0C41\u0C30\u0C41", "\u0C36\u0C41\u0C15\u0C4D\u0C30", "\u0C36\u0C28\u0C3F" }; + + static final String[] shortMonths = { "\u0C1C\u0C28\u0C35\u0C30\u0C3F", "\u0C2B\u0C3F\u0C2C\u0C4D\u0C30\u0C35\u0C30\u0C3F", "\u0C2E\u0C3E\u0C30\u0C4D\u0C1A\u0C3F", "\u0C0F\u0C2A\u0C4D\u0C30\u0C3F\u0C32\u0C4D", "\u0C2E\u0C47", "\u0C1C\u0C42\u0C28\u0C4D", "\u0C1C\u0C42\u0C32\u0C48", "\u0C06\u0C17\u0C38\u0C4D\u0C1F\u0C41", "\u0C38\u0C46\u0C2A\u0C4D\u0C1F\u0C46\u0C02\u0C2C\u0C30\u0C4D", "\u0C05\u0C15\u0C4D\u0C1F\u0C4B\u0C2C\u0C30\u0C4D", "\u0C28\u0C35\u0C02\u0C2C\u0C30\u0C4D", "\u0C21\u0C3F\u0C38\u0C46\u0C02\u0C2C\u0C30\u0C4D", null }; + + static final String[] months = { "\u0C1C\u0C28\u0C35\u0C30\u0C3F", "\u0C2B\u0C3F\u0C2C\u0C4D\u0C30\u0C35\u0C30\u0C3F", "\u0C2E\u0C3E\u0C30\u0C4D\u0C1A\u0C3F", "\u0C0F\u0C2A\u0C4D\u0C30\u0C3F\u0C32\u0C4D", "\u0C2E\u0C47", "\u0C1C\u0C42\u0C28\u0C4D", "\u0C1C\u0C42\u0C32\u0C48", "\u0C06\u0C17\u0C38\u0C4D\u0C1F\u0C41", "\u0C38\u0C46\u0C2A\u0C4D\u0C1F\u0C46\u0C02\u0C2C\u0C30\u0C4D", "\u0C05\u0C15\u0C4D\u0C1F\u0C4B\u0C2C\u0C30\u0C4D", "\u0C28\u0C35\u0C02\u0C2C\u0C30\u0C4D", "\u0C21\u0C3F\u0C38\u0C46\u0C02\u0C2C\u0C30\u0C4D", null }; + + static final String[] ampms = { "\u0C2A\u0C42\u0C30\u0C4D\u0C35\u0C3E\u0C39\u0C4D\u0C28", "\u0C05\u0C2A\u0C30\u0C3E\u0C39\u0C4D\u0C28" }; + + static final String shortDateFormat = "EEEE dd MMM yyyy"; + static final String defaultTimeFormat = "hh:m:s a z"; + static final String currencySymbol = "\u0930\u0942"; + static final String intlCurrencySymbol = "INR"; + static final String currencyFormat = "$ #,###,#0.00;-$ #,###,#0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_tg_TJ.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_tg_TJ.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_tg_TJ.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_tg_TJ.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_tg_TJ extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "\u0412\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435", "\u041F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A", "\u0412\u0442\u043E\u0440\u043D\u0438\u043A", "\u0421\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440\u0433", "\u041F\u044F\u0442\u043D\u0438\u0446\u0430", "\u0421\u0443\u0431\u0431\u043E\u0442\u0430" }; + + static final String[] shortWeekdays = { null, "\u0412\u0441\u043A", "\u041F\u043D\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041F\u0442\u043D", "\u0421\u0431\u0442" }; + + static final String[] shortMonths = { "\u042F\u043D\u0432", "\u0424\u0435\u0432", "\u041C\u0430\u0440", "\u0410\u043F\u0440", "\u041C\u0430\u0439", "\u0418\u044E\u043D", "\u0418\u044E\u043B", "\u0410\u0432\u0433", "\u0421\u0435\u043D", "\u041E\u043A\u0442", "\u041D\u043E\u044F", "\u0414\u0435\u043A", null }; + + static final String[] months = { "\u042F\u043D\u0432\u0430\u0440\u044F", "\u0424\u0435\u0432\u0440\u0430\u043B\u044F", "\u041C\u0430\u0440\u0442\u0430", "\u0410\u043F\u0440\u0435\u043B\u044F", "\u041C\u0430\u044F", "\u0418\u044E\u043D\u044F", "\u0418\u044E\u043B\u044F", "\u0410\u0432\u0433\u0443\u0441\u0442\u0430", "\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044F", "\u041E\u043A\u0442\u044F\u0431\u0440\u044F", "\u041D\u043E\u044F\u0431\u0440\u044F", "\u0414\u0435\u043A\u0430\u0431\u0440\u044F", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u0440\u0443\u0431"; + static final String intlCurrencySymbol = "RUR"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_tl_PH.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_tl_PH.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_tl_PH.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_tl_PH.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_tl_PH extends ListResourceBundle + { + static final String decimalSeparator = LocaleInformation_en_US.decimalSeparator; + static final String groupingSeparator = LocaleInformation_en_US.groupingSeparator; + static final String numberFormat = LocaleInformation_en_US.numberFormat; + static final String percentFormat = LocaleInformation_en_US.percentFormat; + static final String[] weekdays = { null, "Linggo", "Lunes", "Martes", "Miyerkoles", "Huwebes", "Biyernes", "Sabado" }; + + static final String[] shortWeekdays = { null, "Lin", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab" }; + + static final String[] shortMonths = { "Ene", "Peb", "Mar", "Abr", "May", "Hun", "Hul", "Ago", "Sep", "Okt", "Nob", "Dis", null }; + + static final String[] months = { "Enero", "Pebrero", "Marso", "Abril", "Mayo", "Hunyo", "Hulyo", "Agosto", "Septiyembre", "Oktubre", "Nobiyembre", "Disyembre", null }; + + static final String[] ampms = { "AM", "PM" }; + + static final String shortDateFormat = "MM/dd/yy"; + static final String defaultTimeFormat = "hh:m:s a"; + static final String currencySymbol = "PhP"; + static final String intlCurrencySymbol = "PHP"; + static final String currencyFormat = "$#,###,##0.00;-$ #,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_tr_TR.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_tr_TR.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_tr_TR.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_tr_TR.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_tr_TR extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ""; + static final String numberFormat = "#,##############################################################################################################################0.###"; + static final String percentFormat = "#,##############################################################################################################################0%"; + static final String[] weekdays = { null, "Pazar", "Pazartesi", "Sal\u0131", "\u00C7ar\u015Famba", "Per\u015Fembe", "Cuma", "Cumartesi" }; + + static final String[] shortWeekdays = { null, "Paz", "Pzt", "Sal", "\u00C7r\u015F", "Pr\u015F", "Cum", "Cts" }; + + static final String[] shortMonths = { "Oca", "\u015Eub", "Mar", "Nis", "May", "Haz", "Tem", "A\u011Fu", "Eyl", "Eki", "Kas", "Ara", null }; + + static final String[] months = { "Ocak", "\u015Eubat", "Mart", "Nisan", "May\u0131s", "Haziran", "Temmuz", "A\u011Fustos", "Eyl\u00FCl", "Ekim", "Kas\u0131m", "Aral\u0131k", null }; + + static final String[] ampms = { "\u00D6\u00D6", "\u00D6S" }; + + static final String shortDateFormat = "dd-MM-yyyy"; + static final String defaultTimeFormat = "hh:m:s a"; + static final String currencySymbol = "TL"; + static final String intlCurrencySymbol = "TRL"; + static final String currencyFormat = "#,##0.00 $;-#,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_uk_UA.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_uk_UA.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_uk_UA.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_uk_UA.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_uk_UA extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "\u041D\u0435\u0434\u0456\u043B\u044F", "\u041F\u043E\u043D\u0435\u0434\u0456\u043B\u043E\u043A", "\u0412\u0456\u0432\u0442\u043E\u0440\u043E\u043A", "\u0421\u0435\u0440\u0435\u0434\u0430", "\u0427\u0435\u0442\u0432\u0435\u0440", "\u041F'\u044F\u0442\u043D\u0438\u0446\u044F", "\u0421\u0443\u0431\u043E\u0442\u0430" }; + + static final String[] shortWeekdays = { null, "\u041D\u0434\u043B", "\u041F\u043D\u0434", "\u0412\u0442\u0440", "\u0421\u0440\u0434", "\u0427\u0442\u0432", "\u041F\u0442\u043D", "\u0421\u0431\u0442" }; + + static final String[] shortMonths = { "\u0421\u0456\u0447", "\u041B\u044E\u0442", "\u0411\u0435\u0440", "\u041A\u0432\u0456", "\u0422\u0440\u0430", "\u0427\u0435\u0440", "\u041B\u0438\u043F", "\u0421\u0435\u0440", "\u0412\u0435\u0440", "\u0416\u043E\u0432", "\u041B\u0438\u0441", "\u0413\u0440\u0443", null }; + + static final String[] months = { "\u0421\u0456\u0447\u0435\u043D\u044C", "\u041B\u044E\u0442\u0438\u0439", "\u0411\u0435\u0440\u0435\u0437\u0435\u043D\u044C", "\u041A\u0432\u0456\u0442\u0435\u043D\u044C", "\u0422\u0440\u0430\u0432\u0435\u043D\u044C", "\u0427\u0435\u0440\u0432\u0435\u043D\u044C", "\u041B\u0438\u043F\u0435\u043D\u044C", "\u0421\u0435\u0440\u043F\u0435\u043D\u044C", "\u0412\u0435\u0440\u0435\u0441\u0435\u043D\u044C", "\u0416\u043E\u0432\u0442\u0435\u043D\u044C", "\u041B\u0438\u0441\u0442\u043E\u043F\u0430\u0434", "\u0413\u0440\u0443\u0434\u0435\u043D\u044C", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd.MM.yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u0433\u0440"; + static final String intlCurrencySymbol = "UAH"; + static final String currencyFormat = "#,###,##0.00 $;-#,###,##0.00 $"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ur_PK.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ur_PK.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_ur_PK.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_ur_PK.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_ur_PK extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "\u0627\u062A\u0648\u0627\u0631", "\u067E\u064A\u0631", "\u0645\u0646\u06AF\u0644", "\u0628\u062F\u06BE", "\u062C\u0645\u0639\u0631\u0627\u062A", "\u062C\u0645\u0639\u0647", "\u0647\u0641\u062A\u0647" }; + + static final String[] shortWeekdays = { null, "\u0627\u062A\u0648\u0627\u0631", "\u067E\u064A\u0631", "\u0645\u0646\u06AF\u0644", "\u0628\u062F\u06BE", "\u062C\u0645\u0639\u0631\u0627\u062A", "\u062C\u0645\u0639\u0647", "\u0647\u0641\u062A\u0647" }; + + static final String[] shortMonths = { "\u062C\u0646\u0648\u0631\u064A", "\u0641\u0631\u0648\u0631\u064A", "\u0645\u0627\u0631\u0686", "\u0627\u067E\u0631\u064A\u0644", "\u0645\u0653\u06CC", "\u062C\u0648\u0646", "\u062C\u0648\u0644\u0627\u064A", "\u0627\u06AF\u0633\u062A", "\u0633\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0645\u0628\u0631", "\u062F\u0633\u0645\u0628\u0631", null }; + + static final String[] months = { "\u062C\u0646\u0648\u0631\u064A", "\u0641\u0631\u0648\u0631\u064A", "\u0645\u0627\u0631\u0686", "\u0627\u067E\u0631\u064A\u0644", "\u0645\u0653\u06CC", "\u062C\u0648\u0646", "\u062C\u0648\u0644\u0627\u064A", "\u0627\u06AF\u0633\u062A", "\u0633\u062A\u0645\u0628\u0631", "\u0627\u0643\u062A\u0648\u0628\u0631", "\u0646\u0648\u0645\u0628\u0631", "\u062F\u0633\u0645\u0628\u0631", null }; + + static final String[] ampms = { "\u0635", "\u0634" }; + + static final String shortDateFormat = "dd/MM/yyyy"; + static final String defaultTimeFormat = "a hh:m:s"; + static final String currencySymbol = "Rs"; + static final String intlCurrencySymbol = "PKR"; + static final String currencyFormat = "$ #,###,##0.00;-$#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_uz_UZ.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_uz_UZ.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_uz_UZ.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_uz_UZ.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_uz_UZ extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,###,##0.###"; + static final String percentFormat = "#,###,##0%"; + static final String[] weekdays = { null, "yakshanba", "dushanba", "seshanba", "chorshanba", "payshanba", "juma", "shanba" }; + + static final String[] shortWeekdays = { null, "Yak", "Du", "Se", "Cho", "Pay", "Ju", "Sha" }; + + static final String[] shortMonths = { "Yav", "Fev", "Mar", "Apr", "May", "Iyn", "Iyl", "Avg", "Sen", "Okt", "Noy", "Dek", null }; + + static final String[] months = { "yanvar", "fevral", "mart", "aprel", "may", "iyun", "iyul", "avgust", "senyabr", "oktyabr", "noyabr", "dekabr", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "dd/MM/yy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "so'm"; + static final String intlCurrencySymbol = "UZS"; + static final String currencyFormat = "$#,###,##0.00;-$#,###,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_vi_VN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_vi_VN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_vi_VN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_vi_VN.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_vi_VN extends ListResourceBundle + { + static final String decimalSeparator = ","; + static final String groupingSeparator = "."; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "Th\u01B0\u0301 hai ", "Th\u01B0\u0301 ba ", "Th\u01B0\u0301 t\u01B0 ", "Th\u01B0\u0301 n\u0103m ", "Th\u01B0\u0301 s\u00E1u ", "Th\u01B0\u0301 ba\u0309y ", "Chu\u0309 nh\u00E2\u0323t " }; + + static final String[] shortWeekdays = { null, "Th 2 ", "Th 3 ", "Th 4 ", "Th 5 ", "Th 6 ", "Th 7 ", "CN " }; + + static final String[] shortMonths = { "Thg 1", "Thg 2", "Thg 3", "Thg 4", "Thg 5", "Thg 6", "Thg 7", "Thg 8", "Thg 9", "Thg 10", "Thg 11", "Thg 12", null }; + + static final String[] months = { "Th\u00E1ng m\u00F4\u0323t", "Th\u00E1ng hai", "Th\u00E1ng ba", "Th\u00E1ng t\u01B0", "Th\u00E1ng n\u0103m", "Th\u00E1ng s\u00E1u", "Th\u00E1ng ba\u0309y", "Th\u00E1ng t\u00E1m", "Th\u00E1ng ch\u00EDn", "Th\u00E1ng m\u01B0\u01A1\u0300i", "Th\u00E1ng m\u01B0\u01A1\u0300i m\u00F4\u0323t", "Th\u00E1ng m\u01B0\u01A1\u0300i hai", null }; + + static final String[] ampms = { "", "" }; + + static final String shortDateFormat = "EEEE dd MMM yyyy"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "\u20AB"; + static final String intlCurrencySymbol = "VND"; + static final String currencyFormat = "#,##0.0000$;-$#,##0.0000"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_yi_US.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_yi_US.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_yi_US.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_yi_US.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_yi_US extends ListResourceBundle + { + static final String decimalSeparator = LocaleInformation_en_US.decimalSeparator; + static final String groupingSeparator = LocaleInformation_en_US.groupingSeparator; + static final String numberFormat = LocaleInformation_en_US.numberFormat; + static final String percentFormat = LocaleInformation_en_US.percentFormat; + static final String[] weekdays = { null, "\u05D6\u05D5\u05E0\u05D8\u05D9\u05E7", "\u05DE\u05D0\u05B8\u05E0\u05D8\u05D9\u05E7", "\u05D3\u05D9\u05E0\u05E1\u05D8\u05D9\u05E7", "\u05DE\u05D9\u05D8\u05F0\u05D0\u05B8\u05DA", "\u05D3\u05D0\u05B8\u05E0\u05E2\u05E8\u05E9\u05D8\u05D9\u05E7", "\u05E4\u05BF\u05E8\u05F2\u05B7\u05D8\u05D9\u05E7", "\u05E9\u05D1\u05EA" }; + + static final String[] shortWeekdays = { null, "\u05D6\u05D5\u05E0'", "\u05DE\u05D0\u05B8\u05E0'", "\u05D3\u05D9\u05E0'", "\u05DE\u05D9\u05D8'", "\u05D3\u05D0\u05B8\u05E0'", "\u05E4\u05BF\u05E8\u05F2\u05B7'", "\u05E9\u05D1\u05EA" }; + + static final String[] shortMonths = { "\u05D9\u05D0\u05B7\u05E0'", "\u05E4\u05BF\u05E2\u05D1'", "\u05DE\u05D0\u05B7\u05E8'", "\u05D0\u05B7\u05E4\u05BC\u05E8'", "\u05DE\u05F2\u05B7", "\u05D9\u05D5\u05E0'", "\u05D9\u05D5\u05DC'", "\u05D0\u05F1\u05D2'", "\u05E1\u05E2\u05E4\u05BC'", "\u05D0\u05B8\u05E7\u05D8'", "\u05E0\u05D0\u05B8\u05F0'", "\u05D3\u05E2\u05E6'", null }; + + static final String[] months = { "\u05D9\u05D0\u05B7\u05E0\u05D5\u05D0\u05B7\u05E8", "\u05E4\u05BF\u05E2\u05D1\u05E8\u05D5\u05D0\u05B7\u05E8", "\u05DE\u05D0\u05B7\u05E8\u05E5", "\u05D0\u05B7\u05E4\u05BC\u05E8\u05D9\u05DC", "\u05DE\u05F2\u05B7", "\u05D9\u05D5\u05E0\u05D9", "\u05D9\u05D5\u05DC\u05D9", "\u05D0\u05F1\u05D2\u05E1\u05D8", "\u05E1\u05E2\u05E4\u05BC\u05D8\u05E2\u05DE\u05D1\u05E2\u05E8", "\u05D0\u05B8\u05E7\u05D8\u05D0\u05B8\u05D1\u05E2\u05E8", "\u05E0A\u05B8\u05F0\u05E2\u05DE\u05D1\u05E2\u05E8", "\u05D3\u05E6\u05DE\u05D1\u05E8", null }; + + static final String[] ampms = { "AM", "PM" }; + + static final String shortDateFormat = "dd/MM/yy"; + static final String defaultTimeFormat = "hh:m:s a"; + static final String currencySymbol = "$"; + static final String intlCurrencySymbol = "USD"; + static final String currencyFormat = "$ #,###,##0.00;$ #,###,##0.00-"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_CN.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_CN.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_CN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_CN.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_zh_CN extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" }; + + static final String[] shortWeekdays = { null, "\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D" }; + + static final String[] shortMonths = { " 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708", null }; + + static final String[] months = { "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", null }; + + static final String[] ampms = { "\u4E0A\u5348", "\u4E0B\u5348" }; + + static final String shortDateFormat = "yyyyMMdd"; + static final String defaultTimeFormat = "a hhms"; + static final String currencySymbol = "\uFFE5"; + static final String intlCurrencySymbol = "CNY"; + static final String currencyFormat = "$#,##0.00;$-#,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_HK.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_HK.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_HK.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_HK.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_zh_HK extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u661F\u671F\u65E5 ", "\u661F\u671F\u4E00 ", "\u661F\u671F\u4E8C ", "\u661F\u671F\u4E09 ", "\u661F\u671F\u56DB ", "\u661F\u671F\u4E94 ", "\u661F\u671F\u516D " }; + + static final String[] shortWeekdays = { null, "\u65E5 ", "\u4E00 ", "\u4E8C ", "\u4E09 ", "\u56DB ", "\u4E94 ", "\u516D " }; + + static final String[] shortMonths = { "1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708", null }; + + static final String[] months = { "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", null }; + + static final String[] ampms = { "\u4E0A\u5348", "\u4E0B\u5348" }; + + static final String shortDateFormat = "yyyyMMMdd EEEE"; + static final String defaultTimeFormat = "a hh:m:s"; + static final String currencySymbol = "HK$"; + static final String intlCurrencySymbol = "HKD"; + static final String currencyFormat = "$#,##0.00;($#,##0.00)"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_SG.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_SG.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_SG.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_SG.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_zh_SG extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" }; + + static final String[] shortWeekdays = { null, "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" }; + + static final String[] shortMonths = { "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", null }; + + static final String[] months = { "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", null }; + + static final String[] ampms = { "\u4E0A\u5348", "\u4E0B\u5348" }; + + static final String shortDateFormat = "yyyyMMdd"; + static final String defaultTimeFormat = ""; + static final String currencySymbol = "$"; + static final String intlCurrencySymbol = "SGD"; + static final String currencyFormat = "$#,##0.00;($#,##0.00)"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_TW.java gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_TW.java *** gcc-3.0.4/libjava/gnu/java/locale/LocaleInformation_zh_TW.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/locale/LocaleInformation_zh_TW.java Tue Jan 8 23:56:23 2002 *************** *** 0 **** --- 1,48 ---- + // This file was automatically generated by localedef. + + package gnu.java.locale; + + import java.util.ListResourceBundle; + + public class LocaleInformation_zh_TW extends ListResourceBundle + { + static final String decimalSeparator = "."; + static final String groupingSeparator = ","; + static final String numberFormat = "#,##0.###"; + static final String percentFormat = "#,##0%"; + static final String[] weekdays = { null, "\u661F\u671F\u65E5", "\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D" }; + + static final String[] shortWeekdays = { null, "\u9031\u65E5", "\u9031\u4E00", "\u9031\u4E8C", "\u9031\u4E09", "\u9031\u56DB", "\u9031\u4E94", "\u9031\u516D" }; + + static final String[] shortMonths = { " 1\u6708", " 2\u6708", " 3\u6708", " 4\u6708", " 5\u6708", " 6\u6708", " 7\u6708", " 8\u6708", " 9\u6708", "10\u6708", "11\u6708", "12\u6708", null }; + + static final String[] months = { "\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708", null }; + + static final String[] ampms = { "\u4E0A\u5348", "\u4E0B\u5348" }; + + static final String shortDateFormat = "yyyyMMdd"; + static final String defaultTimeFormat = "a hhms"; + static final String currencySymbol = "NT$"; + static final String intlCurrencySymbol = "TWD"; + static final String currencyFormat = "$#,##0.00;-$#,##0.00"; + + private static final Object[][] contents = + { + { "weekdays", weekdays }, + { "shortWeekdays", shortWeekdays }, + { "shortMonths", shortMonths }, + { "months", months }, + { "ampms", ampms }, + { "shortDateFormat", shortDateFormat }, + { "defaultTimeFormat", defaultTimeFormat }, + { "currencySymbol", currencySymbol }, + { "intlCurrencySymbol", intlCurrencySymbol }, + { "currencyFormat", currencyFormat }, + { "decimalSeparator", decimalSeparator }, + { "groupingSeparator", groupingSeparator }, + { "numberFormat", numberFormat }, + { "percentFormat", percentFormat }, + }; + + public Object[][] getContents () { return contents; } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/math/MPN.java gcc-3.1/libjava/gnu/java/math/MPN.java *** gcc-3.0.4/libjava/gnu/java/math/MPN.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/math/MPN.java Tue Jan 22 22:39:57 2002 *************** *** 0 **** --- 1,768 ---- + /* gnu.java.math.MPN + Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + // Included from Kawa 1.6.62 with permission of the author, + // Per Bothner . + + package gnu.java.math; + + /** This contains various low-level routines for unsigned bigints. + * The interfaces match the mpn interfaces in gmp, + * so it should be easy to replace them with fast native functions + * that are trivial wrappers around the mpn_ functions in gmp + * (at least on platforms that use 32-bit "limbs"). + */ + + public class MPN + { + /** Add x[0:size-1] and y, and write the size least + * significant words of the result to dest. + * Return carry, either 0 or 1. + * All values are unsigned. + * This is basically the same as gmp's mpn_add_1. */ + public static int add_1 (int[] dest, int[] x, int size, int y) + { + long carry = (long) y & 0xffffffffL; + for (int i = 0; i < size; i++) + { + carry += ((long) x[i] & 0xffffffffL); + dest[i] = (int) carry; + carry >>= 32; + } + return (int) carry; + } + + /** Add x[0:len-1] and y[0:len-1] and write the len least + * significant words of the result to dest[0:len-1]. + * All words are treated as unsigned. + * @return the carry, either 0 or 1 + * This function is basically the same as gmp's mpn_add_n. + */ + public static int add_n (int dest[], int[] x, int[] y, int len) + { + long carry = 0; + for (int i = 0; i < len; i++) + { + carry += ((long) x[i] & 0xffffffffL) + + ((long) y[i] & 0xffffffffL); + dest[i] = (int) carry; + carry >>>= 32; + } + return (int) carry; + } + + /** Subtract Y[0:size-1] from X[0:size-1], and write + * the size least significant words of the result to dest[0:size-1]. + * Return borrow, either 0 or 1. + * This is basically the same as gmp's mpn_sub_n function. + */ + + public static int sub_n (int[] dest, int[] X, int[] Y, int size) + { + int cy = 0; + for (int i = 0; i < size; i++) + { + int y = Y[i]; + int x = X[i]; + y += cy; /* add previous carry to subtrahend */ + // Invert the high-order bit, because: (unsigned) X > (unsigned) Y + // iff: (int) (X^0x80000000) > (int) (Y^0x80000000). + cy = (y^0x80000000) < (cy^0x80000000) ? 1 : 0; + y = x - y; + cy += (y^0x80000000) > (x ^ 0x80000000) ? 1 : 0; + dest[i] = y; + } + return cy; + } + + /** Multiply x[0:len-1] by y, and write the len least + * significant words of the product to dest[0:len-1]. + * Return the most significant word of the product. + * All values are treated as if they were unsigned + * (i.e. masked with 0xffffffffL). + * OK if dest==x (not sure if this is guaranteed for mpn_mul_1). + * This function is basically the same as gmp's mpn_mul_1. + */ + + public static int mul_1 (int[] dest, int[] x, int len, int y) + { + long yword = (long) y & 0xffffffffL; + long carry = 0; + for (int j = 0; j < len; j++) + { + carry += ((long) x[j] & 0xffffffffL) * yword; + dest[j] = (int) carry; + carry >>>= 32; + } + return (int) carry; + } + + /** + * Multiply x[0:xlen-1] and y[0:ylen-1], and + * write the result to dest[0:xlen+ylen-1]. + * The destination has to have space for xlen+ylen words, + * even if the result might be one limb smaller. + * This function requires that xlen >= ylen. + * The destination must be distinct from either input operands. + * All operands are unsigned. + * This function is basically the same gmp's mpn_mul. */ + + public static void mul (int[] dest, + int[] x, int xlen, + int[] y, int ylen) + { + dest[xlen] = MPN.mul_1 (dest, x, xlen, y[0]); + + for (int i = 1; i < ylen; i++) + { + long yword = (long) y[i] & 0xffffffffL; + long carry = 0; + for (int j = 0; j < xlen; j++) + { + carry += ((long) x[j] & 0xffffffffL) * yword + + ((long) dest[i+j] & 0xffffffffL); + dest[i+j] = (int) carry; + carry >>>= 32; + } + dest[i+xlen] = (int) carry; + } + } + + /* Divide (unsigned long) N by (unsigned int) D. + * Returns (remainder << 32)+(unsigned int)(quotient). + * Assumes (unsigned int)(N>>32) < (unsigned int)D. + * Code transcribed from gmp-2.0's mpn_udiv_w_sdiv function. + */ + public static long udiv_qrnnd (long N, int D) + { + long q, r; + long a1 = N >>> 32; + long a0 = N & 0xffffffffL; + if (D >= 0) + { + if (a1 < ((D - a1 - (a0 >>> 31)) & 0xffffffffL)) + { + /* dividend, divisor, and quotient are nonnegative */ + q = N / D; + r = N % D; + } + else + { + /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */ + long c = N - ((long) D << 31); + /* Divide (c1*2^32 + c0) by d */ + q = c / D; + r = c % D; + /* Add 2^31 to quotient */ + q += 1 << 31; + } + } + else + { + long b1 = D >>> 1; /* d/2, between 2^30 and 2^31 - 1 */ + //long c1 = (a1 >> 1); /* A/2 */ + //int c0 = (a1 << 31) + (a0 >> 1); + long c = N >>> 1; + if (a1 < b1 || (a1 >> 1) < b1) + { + if (a1 < b1) + { + q = c / b1; + r = c % b1; + } + else /* c1 < b1, so 2^31 <= (A/2)/b1 < 2^32 */ + { + c = ~(c - (b1 << 32)); + q = c / b1; /* (A/2) / (d/2) */ + r = c % b1; + q = (~q) & 0xffffffffL; /* (A/2)/b1 */ + r = (b1 - 1) - r; /* r < b1 => new r >= 0 */ + } + r = 2 * r + (a0 & 1); + if ((D & 1) != 0) + { + if (r >= q) { + r = r - q; + } else if (q - r <= ((long) D & 0xffffffffL)) { + r = r - q + D; + q -= 1; + } else { + r = r - q + D + D; + q -= 2; + } + } + } + else /* Implies c1 = b1 */ + { /* Hence a1 = d - 1 = 2*b1 - 1 */ + if (a0 >= ((long)(-D) & 0xffffffffL)) + { + q = -1; + r = a0 + D; + } + else + { + q = -2; + r = a0 + D + D; + } + } + } + + return (r << 32) | (q & 0xFFFFFFFFl); + } + + /** Divide divident[0:len-1] by (unsigned int)divisor. + * Write result into quotient[0:len-1. + * Return the one-word (unsigned) remainder. + * OK for quotient==dividend. + */ + + public static int divmod_1 (int[] quotient, int[] dividend, + int len, int divisor) + { + int i = len - 1; + long r = dividend[i]; + if ((r & 0xffffffffL) >= ((long)divisor & 0xffffffffL)) + r = 0; + else + { + quotient[i--] = 0; + r <<= 32; + } + + for (; i >= 0; i--) + { + int n0 = dividend[i]; + r = (r & ~0xffffffffL) | (n0 & 0xffffffffL); + r = udiv_qrnnd (r, divisor); + quotient[i] = (int) r; + } + return (int)(r >> 32); + } + + /* Subtract x[0:len-1]*y from dest[offset:offset+len-1]. + * All values are treated as if unsigned. + * @return the most significant word of + * the product, minus borrow-out from the subtraction. + */ + public static int submul_1 (int[] dest, int offset, int[] x, int len, int y) + { + long yl = (long) y & 0xffffffffL; + int carry = 0; + int j = 0; + do + { + long prod = ((long) x[j] & 0xffffffffL) * yl; + int prod_low = (int) prod; + int prod_high = (int) (prod >> 32); + prod_low += carry; + // Invert the high-order bit, because: (unsigned) X > (unsigned) Y + // iff: (int) (X^0x80000000) > (int) (Y^0x80000000). + carry = ((prod_low ^ 0x80000000) < (carry ^ 0x80000000) ? 1 : 0) + + prod_high; + int x_j = dest[offset+j]; + prod_low = x_j - prod_low; + if ((prod_low ^ 0x80000000) > (x_j ^ 0x80000000)) + carry++; + dest[offset+j] = prod_low; + } + while (++j < len); + return carry; + } + + /** Divide zds[0:nx] by y[0:ny-1]. + * The remainder ends up in zds[0:ny-1]. + * The quotient ends up in zds[ny:nx]. + * Assumes: nx>ny. + * (int)y[ny-1] < 0 (i.e. most significant bit set) + */ + + public static void divide (int[] zds, int nx, int[] y, int ny) + { + // This is basically Knuth's formulation of the classical algorithm, + // but translated from in scm_divbigbig in Jaffar's SCM implementation. + + // Correspondance with Knuth's notation: + // Knuth's u[0:m+n] == zds[nx:0]. + // Knuth's v[1:n] == y[ny-1:0] + // Knuth's n == ny. + // Knuth's m == nx-ny. + // Our nx == Knuth's m+n. + + // Could be re-implemented using gmp's mpn_divrem: + // zds[nx] = mpn_divrem (&zds[ny], 0, zds, nx, y, ny). + + int j = nx; + do + { // loop over digits of quotient + // Knuth's j == our nx-j. + // Knuth's u[j:j+n] == our zds[j:j-ny]. + int qhat; // treated as unsigned + if (zds[j]==y[ny-1]) + qhat = -1; // 0xffffffff + else + { + long w = (((long)(zds[j])) << 32) + ((long)zds[j-1] & 0xffffffffL); + qhat = (int) udiv_qrnnd (w, y[ny-1]); + } + if (qhat != 0) + { + int borrow = submul_1 (zds, j - ny, y, ny, qhat); + int save = zds[j]; + long num = ((long)save&0xffffffffL) - ((long)borrow&0xffffffffL); + while (num != 0) + { + qhat--; + long carry = 0; + for (int i = 0; i < ny; i++) + { + carry += ((long) zds[j-ny+i] & 0xffffffffL) + + ((long) y[i] & 0xffffffffL); + zds[j-ny+i] = (int) carry; + carry >>>= 32; + } + zds[j] += carry; + num = carry - 1; + } + } + zds[j] = qhat; + } while (--j >= ny); + } + + /** Number of digits in the conversion base that always fits in a word. + * For example, for base 10 this is 9, since 10**9 is the + * largest number that fits into a words (assuming 32-bit words). + * This is the same as gmp's __mp_bases[radix].chars_per_limb. + * @param radix the base + * @return number of digits */ + public static int chars_per_word (int radix) + { + if (radix < 10) + { + if (radix < 8) + { + if (radix <= 2) + return 32; + else if (radix == 3) + return 20; + else if (radix == 4) + return 16; + else + return 18 - radix; + } + else + return 10; + } + else if (radix < 12) + return 9; + else if (radix <= 16) + return 8; + else if (radix <= 23) + return 7; + else if (radix <= 40) + return 6; + // The following are conservative, but we don't care. + else if (radix <= 256) + return 4; + else + return 1; + } + + /** Count the number of leading zero bits in an int. */ + public static int count_leading_zeros (int i) + { + if (i == 0) + return 32; + int count = 0; + for (int k = 16; k > 0; k = k >> 1) { + int j = i >>> k; + if (j == 0) + count += k; + else + i = j; + } + return count; + } + + public static int set_str (int dest[], byte[] str, int str_len, int base) + { + int size = 0; + if ((base & (base - 1)) == 0) + { + // The base is a power of 2. Read the input string from + // least to most significant character/digit. */ + + int next_bitpos = 0; + int bits_per_indigit = 0; + for (int i = base; (i >>= 1) != 0; ) bits_per_indigit++; + int res_digit = 0; + + for (int i = str_len; --i >= 0; ) + { + int inp_digit = str[i]; + res_digit |= inp_digit << next_bitpos; + next_bitpos += bits_per_indigit; + if (next_bitpos >= 32) + { + dest[size++] = res_digit; + next_bitpos -= 32; + res_digit = inp_digit >> (bits_per_indigit - next_bitpos); + } + } + + if (res_digit != 0) + dest[size++] = res_digit; + } + else + { + // General case. The base is not a power of 2. + int indigits_per_limb = MPN.chars_per_word (base); + int str_pos = 0; + + while (str_pos < str_len) + { + int chunk = str_len - str_pos; + if (chunk > indigits_per_limb) + chunk = indigits_per_limb; + int res_digit = str[str_pos++]; + int big_base = base; + + while (--chunk > 0) + { + res_digit = res_digit * base + str[str_pos++]; + big_base *= base; + } + + int cy_limb; + if (size == 0) + cy_limb = res_digit; + else + { + cy_limb = MPN.mul_1 (dest, dest, size, big_base); + cy_limb += MPN.add_1 (dest, dest, size, res_digit); + } + if (cy_limb != 0) + dest[size++] = cy_limb; + } + } + return size; + } + + /** Compare x[0:size-1] with y[0:size-1], treating them as unsigned integers. + * @result -1, 0, or 1 depending on if xy. + * This is basically the same as gmp's mpn_cmp function. + */ + public static int cmp (int[] x, int[] y, int size) + { + while (--size >= 0) + { + int x_word = x[size]; + int y_word = y[size]; + if (x_word != y_word) + { + // Invert the high-order bit, because: + // (unsigned) X > (unsigned) Y iff + // (int) (X^0x80000000) > (int) (Y^0x80000000). + return (x_word ^ 0x80000000) > (y_word ^0x80000000) ? 1 : -1; + } + } + return 0; + } + + /** Compare x[0:xlen-1] with y[0:ylen-1], treating them as unsigned integers. + * @result -1, 0, or 1 depending on if xy. + */ + public static int cmp (int[] x, int xlen, int[] y, int ylen) + { + return xlen > ylen ? 1 : xlen < ylen ? -1 : cmp (x, y, xlen); + } + + /* Shift x[x_start:x_start+len-1] count bits to the "right" + * (i.e. divide by 2**count). + * Store the len least significant words of the result at dest. + * The bits shifted out to the right are returned. + * OK if dest==x. + * Assumes: 0 < count < 32 + */ + + public static int rshift (int[] dest, int[] x, int x_start, + int len, int count) + { + int count_2 = 32 - count; + int low_word = x[x_start]; + int retval = low_word << count_2; + int i = 1; + for (; i < len; i++) + { + int high_word = x[x_start+i]; + dest[i-1] = (low_word >>> count) | (high_word << count_2); + low_word = high_word; + } + dest[i-1] = low_word >>> count; + return retval; + } + + /* Shift x[x_start:x_start+len-1] count bits to the "right" + * (i.e. divide by 2**count). + * Store the len least significant words of the result at dest. + * OK if dest==x. + * Assumes: 0 <= count < 32 + * Same as rshift, but handles count==0 (and has no return value). + */ + public static void rshift0 (int[] dest, int[] x, int x_start, + int len, int count) + { + if (count > 0) + rshift(dest, x, x_start, len, count); + else + for (int i = 0; i < len; i++) + dest[i] = x[i + x_start]; + } + + /** Return the long-truncated value of right shifting. + * @param x a two's-complement "bignum" + * @param len the number of significant words in x + * @param count the shift count + * @return (long)(x[0..len-1] >> count). + */ + public static long rshift_long (int[] x, int len, int count) + { + int wordno = count >> 5; + count &= 31; + int sign = x[len-1] < 0 ? -1 : 0; + int w0 = wordno >= len ? sign : x[wordno]; + wordno++; + int w1 = wordno >= len ? sign : x[wordno]; + if (count != 0) + { + wordno++; + int w2 = wordno >= len ? sign : x[wordno]; + w0 = (w0 >>> count) | (w1 << (32-count)); + w1 = (w1 >>> count) | (w2 << (32-count)); + } + return ((long)w1 << 32) | ((long)w0 & 0xffffffffL); + } + + /* Shift x[0:len-1] left by count bits, and store the len least + * significant words of the result in dest[d_offset:d_offset+len-1]. + * Return the bits shifted out from the most significant digit. + * Assumes 0 < count < 32. + * OK if dest==x. + */ + + public static int lshift (int[] dest, int d_offset, + int[] x, int len, int count) + { + int count_2 = 32 - count; + int i = len - 1; + int high_word = x[i]; + int retval = high_word >>> count_2; + d_offset++; + while (--i >= 0) + { + int low_word = x[i]; + dest[d_offset+i] = (high_word << count) | (low_word >>> count_2); + high_word = low_word; + } + dest[d_offset+i] = high_word << count; + return retval; + } + + /** Return least i such that word&(1<>= 4; + i += 4; + } + if ((word & 3) == 0) + { + word >>= 2; + i += 2; + } + if ((word & 1) == 0) + i += 1; + return i; + } + + /** Return least i such that words & (1< 0) + { + int j; + for (j = 0; j < len-i; j++) + other_arg[j] = other_arg[j+i]; + for ( ; j < len; j++) + other_arg[j] = 0; + } + i = findLowestBit(other_arg[0]); + if (i > 0) + MPN.rshift (other_arg, other_arg, 0, len, i); + + // Now both odd_arg and other_arg are odd. + + // Subtract the smaller from the larger. + // This does not change the result, since gcd(a-b,b)==gcd(a,b). + i = MPN.cmp(odd_arg, other_arg, len); + if (i == 0) + break; + if (i > 0) + { // odd_arg > other_arg + MPN.sub_n (odd_arg, odd_arg, other_arg, len); + // Now odd_arg is even, so swap with other_arg; + int[] tmp = odd_arg; odd_arg = other_arg; other_arg = tmp; + } + else + { // other_arg > odd_arg + MPN.sub_n (other_arg, other_arg, odd_arg, len); + } + while (odd_arg[len-1] == 0 && other_arg[len-1] == 0) + len--; + } + if (initShiftWords + initShiftBits > 0) + { + if (initShiftBits > 0) + { + int sh_out = MPN.lshift (x, initShiftWords, x, len, initShiftBits); + if (sh_out != 0) + x[(len++)+initShiftWords] = sh_out; + } + else + { + for (i = len; --i >= 0;) + x[i+initShiftWords] = x[i]; + } + for (i = initShiftWords; --i >= 0; ) + x[i] = 0; + len += initShiftWords; + } + return len; + } + + public static int intLength (int i) + { + return 32 - count_leading_zeros (i < 0 ? ~i : i); + } + + /** Calcaulte the Common Lisp "integer-length" function. + * Assumes input is canonicalized: len==BigInteger.wordsNeeded(words,len) */ + public static int intLength (int[] words, int len) + { + len--; + return intLength (words[len]) + 32 * len; + } + + /* DEBUGGING: + public static void dprint (BigInteger x) + { + if (x.words == null) + System.err.print(Long.toString((long) x.ival & 0xffffffffL, 16)); + else + dprint (System.err, x.words, x.ival); + } + public static void dprint (int[] x) { dprint (System.err, x, x.length); } + public static void dprint (int[] x, int len) { dprint (System.err, x, len); } + public static void dprint (java.io.PrintStream ps, int[] x, int len) + { + ps.print('('); + for (int i = 0; i < len; i++) + { + if (i > 0) + ps.print (' '); + ps.print ("#x" + Long.toString ((long) x[i] & 0xffffffffL, 16)); + } + ps.print(')'); + } + */ + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/dgc/DGCImpl.java gcc-3.1/libjava/gnu/java/rmi/dgc/DGCImpl.java *** gcc-3.0.4/libjava/gnu/java/rmi/dgc/DGCImpl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/dgc/DGCImpl.java Tue Jan 22 22:39:58 2002 *************** *** 0 **** --- 1,65 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.dgc; + + import java.rmi.dgc.DGC; + import java.rmi.dgc.Lease; + import java.rmi.dgc.VMID; + import java.rmi.server.ObjID; + import java.rmi.RemoteException; + import java.rmi.server.UnicastRemoteObject; + import java.rmi.server.RMISocketFactory; + import gnu.java.rmi.server.UnicastServerRef; + + public class DGCImpl + extends UnicastRemoteObject implements DGC { + + public DGCImpl() throws RemoteException { + super(new UnicastServerRef(new ObjID(ObjID.DGC_ID), 0, RMISocketFactory.getSocketFactory())); + } + + public Lease dirty(ObjID[] ids, long sequenceNum, Lease lease) throws RemoteException { + System.out.println("DGCImpl.dirty - not implemented"); + return (lease); + } + + public void clean(ObjID[] ids, long sequenceNum, VMID vmid, boolean strong) throws RemoteException { + System.out.println("DGCImpl.clean - not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java gcc-3.1/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java *** gcc-3.0.4/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/dgc/DGCImpl_Skel.java Tue Aug 28 00:03:20 2001 *************** *** 0 **** --- 1,106 ---- + // Skel class generated by rmic - DO NOT EDIT! + + package gnu.java.rmi.dgc; + + public final class DGCImpl_Skel + implements java.rmi.server.Skeleton + { + private static final long interfaceHash = -669196253586618813L; + + private static final java.rmi.server.Operation[] operations = { + new java.rmi.server.Operation("void clean(java.rmi.server.ObjID[], long, java.rmi.dgc.VMID, boolean"), + new java.rmi.server.Operation("java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease") + }; + + public java.rmi.server.Operation[] getOperations() { + return ((java.rmi.server.Operation[]) operations.clone()); + } + + public void dispatch(java.rmi.Remote obj, java.rmi.server.RemoteCall call, int opnum, long hash) throws java.lang.Exception { + if (opnum < 0) { + if (hash == -5803803475088455571L) { + opnum = 0; + } + else if (hash == -8139341527526761862L) { + opnum = 1; + } + else { + throw new java.rmi.server.SkeletonMismatchException("interface hash mismatch"); + } + } + else if (hash != interfaceHash) { + throw new java.rmi.server.SkeletonMismatchException("interface hash mismatch"); + } + + gnu.java.rmi.dgc.DGCImpl server = (gnu.java.rmi.dgc.DGCImpl)obj; + switch (opnum) { + case 0: + { + java.rmi.server.ObjID[] $param_0; + long $param_1; + java.rmi.dgc.VMID $param_2; + boolean $param_3; + try { + java.io.ObjectInput in = call.getInputStream(); + $param_0 = (java.rmi.server.ObjID[])in.readObject(); + $param_1 = (long)in.readLong(); + $param_2 = (java.rmi.dgc.VMID)in.readObject(); + $param_3 = (boolean)in.readBoolean(); + + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + catch (java.lang.ClassCastException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + finally { + call.releaseInputStream(); + } + server.clean($param_0, $param_1, $param_2, $param_3); + try { + java.io.ObjectOutput out = call.getResultStream(true); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling return", e); + } + break; + } + + case 1: + { + java.rmi.server.ObjID[] $param_0; + long $param_1; + java.rmi.dgc.Lease $param_2; + try { + java.io.ObjectInput in = call.getInputStream(); + $param_0 = (java.rmi.server.ObjID[])in.readObject(); + $param_1 = (long)in.readLong(); + $param_2 = (java.rmi.dgc.Lease)in.readObject(); + + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + catch (java.lang.ClassCastException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + finally { + call.releaseInputStream(); + } + java.rmi.dgc.Lease $result = server.dirty($param_0, $param_1, $param_2); + try { + java.io.ObjectOutput out = call.getResultStream(true); + out.writeObject($result); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling return", e); + } + break; + } + + default: + throw new java.rmi.UnmarshalException("invalid method number"); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java gcc-3.1/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java *** gcc-3.0.4/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/dgc/DGCImpl_Stub.java Tue Aug 28 00:03:20 2001 *************** *** 0 **** --- 1,120 ---- + // Stub class generated by rmic - DO NOT EDIT! + + package gnu.java.rmi.dgc; + + public final class DGCImpl_Stub + extends java.rmi.server.RemoteStub + implements java.rmi.dgc.DGC + { + private static final long serialVersionUID = 2L; + + private static final long interfaceHash = -669196253586618813L; + + private static boolean useNewInvoke; + + private static final java.rmi.server.Operation[] operations = { + new java.rmi.server.Operation("void clean(java.rmi.server.ObjID[], long, java.rmi.dgc.VMID, boolean)"), + new java.rmi.server.Operation("java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)") + }; + + private static java.lang.reflect.Method $method_clean_0; + private static java.lang.reflect.Method $method_dirty_1; + + static { + try { + java.rmi.server.RemoteRef.class.getMethod("invoke", new java.lang.Class[] { java.rmi.Remote.class, java.lang.reflect.Method.class, java.lang.Object[].class, long.class }); + useNewInvoke = true; + $method_clean_0 = gnu.java.rmi.dgc.DGCImpl.class.getMethod("clean", new java.lang.Class[] {java.rmi.server.ObjID[].class, long.class, java.rmi.dgc.VMID.class, boolean.class}); + $method_dirty_1 = gnu.java.rmi.dgc.DGCImpl.class.getMethod("dirty", new java.lang.Class[] {java.rmi.server.ObjID[].class, long.class, java.rmi.dgc.Lease.class}); + + } + catch (java.lang.NoSuchMethodException e) { + useNewInvoke = false; + } + } + + public DGCImpl_Stub() { + super(); + } + public DGCImpl_Stub(java.rmi.server.RemoteRef ref) { + super(ref); + } + + public void clean(java.rmi.server.ObjID[] $param_0, long $param_1, java.rmi.dgc.VMID $param_2, boolean $param_3) throws java.rmi.RemoteException { + try { + if (useNewInvoke) { + ref.invoke(this, $method_clean_0, new java.lang.Object[] {$param_0, new java.lang.Long($param_1), $param_2, new java.lang.Boolean($param_3)}, -5803803475088455571L); + } + else { + java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, 0, interfaceHash); + try { + java.io.ObjectOutput out = call.getOutputStream(); + out.writeObject($param_0); + out.writeLong($param_1); + out.writeObject($param_2); + out.writeBoolean($param_3); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling arguments", e); + } + ref.invoke(call); + try { + java.io.ObjectInput in = call.getInputStream(); + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling return", e); + } + finally { + ref.done(call); + } + } + } + catch (java.rmi.RemoteException e) { + throw e; + } + catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + public java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[] $param_0, long $param_1, java.rmi.dgc.Lease $param_2) throws java.rmi.RemoteException { + try { + if (useNewInvoke) { + java.lang.Object $result = ref.invoke(this, $method_dirty_1, new java.lang.Object[] {$param_0, new java.lang.Long($param_1), $param_2}, -8139341527526761862L); + return ((java.rmi.dgc.Lease)$result); + } + else { + java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, 1, interfaceHash); + try { + java.io.ObjectOutput out = call.getOutputStream(); + out.writeObject($param_0); + out.writeLong($param_1); + out.writeObject($param_2); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling arguments", e); + } + ref.invoke(call); + java.rmi.dgc.Lease $result; + try { + java.io.ObjectInput in = call.getInputStream(); + $result = (java.rmi.dgc.Lease)in.readObject(); + return ($result); + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling return", e); + } + finally { + ref.done(call); + } + } + } + catch (java.rmi.RemoteException e) { + throw e; + } + catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/registry/RegistryImpl.java gcc-3.1/libjava/gnu/java/rmi/registry/RegistryImpl.java *** gcc-3.0.4/libjava/gnu/java/rmi/registry/RegistryImpl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/registry/RegistryImpl.java Mon Mar 25 22:15:18 2002 *************** *** 0 **** --- 1,151 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.registry; + + import java.rmi.registry.Registry; + import java.rmi.registry.LocateRegistry; + import java.rmi.RemoteException; + import java.rmi.NotBoundException; + import java.rmi.AccessException; + import java.rmi.AlreadyBoundException; + import java.rmi.Remote; + import java.rmi.server.UnicastRemoteObject; + import java.rmi.server.ObjID; + import java.util.Hashtable; + import java.util.Enumeration; + import java.rmi.server.RMISocketFactory; + import java.rmi.server.RMIClientSocketFactory; + import java.rmi.server.RMIServerSocketFactory; + import gnu.java.rmi.server.UnicastServerRef; + + public class RegistryImpl + extends UnicastRemoteObject implements Registry { + + private Hashtable bindings = new Hashtable(); + + public RegistryImpl(int port) throws RemoteException { + this(port, RMISocketFactory.getSocketFactory(), RMISocketFactory.getSocketFactory()); + } + + public RegistryImpl(int port, RMIClientSocketFactory cf, RMIServerSocketFactory sf) throws RemoteException { + super(new UnicastServerRef(new ObjID(ObjID.REGISTRY_ID), port, sf)); + ((UnicastServerRef)getRef()).exportObject(this); + } + + public Remote lookup(String name) throws RemoteException, NotBoundException, AccessException { + Object obj = bindings.get(name); + if (obj == null) { + throw new NotBoundException(name); + } + return ((Remote)obj); + } + + public void bind(String name, Remote obj) throws RemoteException, AlreadyBoundException, AccessException { + if (bindings.containsKey(name)) { + throw new AlreadyBoundException(name); + } + bindings.put(name, obj); + } + + public void unbind(String name) throws RemoteException, NotBoundException, AccessException { + Object obj = bindings.remove(name); + if (obj == null) { + throw new NotBoundException(name); + } + } + + public void rebind(String name, Remote obj) throws RemoteException, AccessException { + bindings.put(name, obj); + } + + public String[] list() throws RemoteException, AccessException { + int size = bindings.size(); + String[] strings = new String[size]; + Enumeration e = bindings.keys(); + for (int i = 0; i < size; i++) { + strings[i] = (String)e.nextElement(); + } + return (strings); + } + + public static void version() { + System.out.println("rmiregistry (" + + System.getProperty("java.vm.name") + + ") " + + System.getProperty("java.vm.version")); + System.out.println("Copyright 2002 Free Software Foundation, Inc."); + System.out.println("This is free software; see the source for copying conditions. There is NO"); + System.out.println("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."); + System.exit(0); + } + + public static void help() { + System.out.println( + "Usage: rmiregistry [OPTION | PORT]\n" + + "\n" + + " --help Print this help, then exit\n" + + " --version Print version number, then exit\n"); + System.exit(0); + } + + public static void main(String[] args) { + int port = Registry.REGISTRY_PORT; + if (args.length > 0) { + if (args[0].equals("--version")) { + version(); + } + else if (args[0].equals("--help")) { + help(); + } + try { + port = Integer.parseInt(args[0]); + } + catch (NumberFormatException _) { + System.err.println("Bad port number - using default"); + } + } + + try { + Registry impl = LocateRegistry.createRegistry(port); + } + catch (RemoteException _) { + System.err.println("Registry failed"); + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java gcc-3.1/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java *** gcc-3.0.4/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/registry/RegistryImpl_Skel.java Tue Aug 28 00:03:22 2001 *************** *** 0 **** --- 1,189 ---- + // Skel class generated by rmic - DO NOT EDIT! + + package gnu.java.rmi.registry; + + public final class RegistryImpl_Skel + implements java.rmi.server.Skeleton + { + private static final long interfaceHash = 4905912898345647071L; + + private static final java.rmi.server.Operation[] operations = { + new java.rmi.server.Operation("void bind(java.lang.String, java.rmi.Remote"), + new java.rmi.server.Operation("java.lang.String[] list("), + new java.rmi.server.Operation("java.rmi.Remote lookup(java.lang.String"), + new java.rmi.server.Operation("void rebind(java.lang.String, java.rmi.Remote"), + new java.rmi.server.Operation("void unbind(java.lang.String") + }; + + public java.rmi.server.Operation[] getOperations() { + return ((java.rmi.server.Operation[]) operations.clone()); + } + + public void dispatch(java.rmi.Remote obj, java.rmi.server.RemoteCall call, int opnum, long hash) throws java.lang.Exception { + if (opnum < 0) { + if (hash == 7583982177005850366L) { + opnum = 0; + } + else if (hash == 2571371476350237748L) { + opnum = 1; + } + else if (hash == -7538657168040752697L) { + opnum = 2; + } + else if (hash == -8381844669958460146L) { + opnum = 3; + } + else if (hash == 7305022919901907578L) { + opnum = 4; + } + else { + throw new java.rmi.server.SkeletonMismatchException("interface hash mismatch"); + } + } + else if (hash != interfaceHash) { + throw new java.rmi.server.SkeletonMismatchException("interface hash mismatch"); + } + + gnu.java.rmi.registry.RegistryImpl server = (gnu.java.rmi.registry.RegistryImpl)obj; + switch (opnum) { + case 0: + { + java.lang.String $param_0; + java.rmi.Remote $param_1; + try { + java.io.ObjectInput in = call.getInputStream(); + $param_0 = (java.lang.String)in.readObject(); + $param_1 = (java.rmi.Remote)in.readObject(); + + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + catch (java.lang.ClassCastException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + finally { + call.releaseInputStream(); + } + server.bind($param_0, $param_1); + try { + java.io.ObjectOutput out = call.getResultStream(true); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling return", e); + } + break; + } + + case 1: + { + try { + java.io.ObjectInput in = call.getInputStream(); + + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + finally { + call.releaseInputStream(); + } + java.lang.String[] $result = server.list(); + try { + java.io.ObjectOutput out = call.getResultStream(true); + out.writeObject($result); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling return", e); + } + break; + } + + case 2: + { + java.lang.String $param_0; + try { + java.io.ObjectInput in = call.getInputStream(); + $param_0 = (java.lang.String)in.readObject(); + + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + catch (java.lang.ClassCastException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + finally { + call.releaseInputStream(); + } + java.rmi.Remote $result = server.lookup($param_0); + try { + java.io.ObjectOutput out = call.getResultStream(true); + out.writeObject($result); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling return", e); + } + break; + } + + case 3: + { + java.lang.String $param_0; + java.rmi.Remote $param_1; + try { + java.io.ObjectInput in = call.getInputStream(); + $param_0 = (java.lang.String)in.readObject(); + $param_1 = (java.rmi.Remote)in.readObject(); + + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + catch (java.lang.ClassCastException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + finally { + call.releaseInputStream(); + } + server.rebind($param_0, $param_1); + try { + java.io.ObjectOutput out = call.getResultStream(true); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling return", e); + } + break; + } + + case 4: + { + java.lang.String $param_0; + try { + java.io.ObjectInput in = call.getInputStream(); + $param_0 = (java.lang.String)in.readObject(); + + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + catch (java.lang.ClassCastException e) { + throw new java.rmi.UnmarshalException("error unmarshalling arguments", e); + } + finally { + call.releaseInputStream(); + } + server.unbind($param_0); + try { + java.io.ObjectOutput out = call.getResultStream(true); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling return", e); + } + break; + } + + default: + throw new java.rmi.UnmarshalException("invalid method number"); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java gcc-3.1/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java *** gcc-3.0.4/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/registry/RegistryImpl_Stub.java Tue Aug 28 00:03:22 2001 *************** *** 0 **** --- 1,255 ---- + // Stub class generated by rmic - DO NOT EDIT! + + package gnu.java.rmi.registry; + + public final class RegistryImpl_Stub + extends java.rmi.server.RemoteStub + implements java.rmi.registry.Registry + { + private static final long serialVersionUID = 2L; + + private static final long interfaceHash = 4905912898345647071L; + + private static boolean useNewInvoke; + + private static final java.rmi.server.Operation[] operations = { + new java.rmi.server.Operation("void bind(java.lang.String, java.rmi.Remote)"), + new java.rmi.server.Operation("java.lang.String[] list()"), + new java.rmi.server.Operation("java.rmi.Remote lookup(java.lang.String)"), + new java.rmi.server.Operation("void rebind(java.lang.String, java.rmi.Remote)"), + new java.rmi.server.Operation("void unbind(java.lang.String)") + }; + + private static java.lang.reflect.Method $method_bind_0; + private static java.lang.reflect.Method $method_list_1; + private static java.lang.reflect.Method $method_lookup_2; + private static java.lang.reflect.Method $method_rebind_3; + private static java.lang.reflect.Method $method_unbind_4; + + static { + try { + java.rmi.server.RemoteRef.class.getMethod("invoke", new java.lang.Class[] { java.rmi.Remote.class, java.lang.reflect.Method.class, java.lang.Object[].class, long.class }); + useNewInvoke = true; + $method_bind_0 = gnu.java.rmi.registry.RegistryImpl.class.getMethod("bind", new java.lang.Class[] {java.lang.String.class, java.rmi.Remote.class}); + $method_list_1 = gnu.java.rmi.registry.RegistryImpl.class.getMethod("list", new java.lang.Class[] {}); + $method_lookup_2 = gnu.java.rmi.registry.RegistryImpl.class.getMethod("lookup", new java.lang.Class[] {java.lang.String.class}); + $method_rebind_3 = gnu.java.rmi.registry.RegistryImpl.class.getMethod("rebind", new java.lang.Class[] {java.lang.String.class, java.rmi.Remote.class}); + $method_unbind_4 = gnu.java.rmi.registry.RegistryImpl.class.getMethod("unbind", new java.lang.Class[] {java.lang.String.class}); + + } + catch (java.lang.NoSuchMethodException e) { + useNewInvoke = false; + } + } + + public RegistryImpl_Stub() { + super(); + } + public RegistryImpl_Stub(java.rmi.server.RemoteRef ref) { + super(ref); + } + + public void bind(java.lang.String $param_0, java.rmi.Remote $param_1) throws java.rmi.AccessException, java.rmi.AlreadyBoundException, java.rmi.RemoteException { + try { + if (useNewInvoke) { + ref.invoke(this, $method_bind_0, new java.lang.Object[] {$param_0, $param_1}, 7583982177005850366L); + } + else { + java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, 0, interfaceHash); + try { + java.io.ObjectOutput out = call.getOutputStream(); + out.writeObject($param_0); + out.writeObject($param_1); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling arguments", e); + } + ref.invoke(call); + try { + java.io.ObjectInput in = call.getInputStream(); + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling return", e); + } + finally { + ref.done(call); + } + } + } + catch (java.rmi.AccessException e) { + throw e; + } + catch (java.rmi.AlreadyBoundException e) { + throw e; + } + catch (java.rmi.RemoteException e) { + throw e; + } + catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + public java.lang.String[] list() throws java.rmi.AccessException, java.rmi.RemoteException { + try { + if (useNewInvoke) { + java.lang.Object $result = ref.invoke(this, $method_list_1, null, 2571371476350237748L); + return ((java.lang.String[])$result); + } + else { + java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, 1, interfaceHash); + try { + java.io.ObjectOutput out = call.getOutputStream(); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling arguments", e); + } + ref.invoke(call); + java.lang.String[] $result; + try { + java.io.ObjectInput in = call.getInputStream(); + $result = (java.lang.String[])in.readObject(); + return ($result); + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling return", e); + } + finally { + ref.done(call); + } + } + } + catch (java.rmi.AccessException e) { + throw e; + } + catch (java.rmi.RemoteException e) { + throw e; + } + catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + public java.rmi.Remote lookup(java.lang.String $param_0) throws java.rmi.AccessException, java.rmi.NotBoundException, java.rmi.RemoteException { + try { + if (useNewInvoke) { + java.lang.Object $result = ref.invoke(this, $method_lookup_2, new java.lang.Object[] {$param_0}, -7538657168040752697L); + return ((java.rmi.Remote)$result); + } + else { + java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, 2, interfaceHash); + try { + java.io.ObjectOutput out = call.getOutputStream(); + out.writeObject($param_0); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling arguments", e); + } + ref.invoke(call); + java.rmi.Remote $result; + try { + java.io.ObjectInput in = call.getInputStream(); + $result = (java.rmi.Remote)in.readObject(); + return ($result); + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling return", e); + } + finally { + ref.done(call); + } + } + } + catch (java.rmi.AccessException e) { + throw e; + } + catch (java.rmi.NotBoundException e) { + throw e; + } + catch (java.rmi.RemoteException e) { + throw e; + } + catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + public void rebind(java.lang.String $param_0, java.rmi.Remote $param_1) throws java.rmi.AccessException, java.rmi.RemoteException { + try { + if (useNewInvoke) { + ref.invoke(this, $method_rebind_3, new java.lang.Object[] {$param_0, $param_1}, -8381844669958460146L); + } + else { + java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, 3, interfaceHash); + try { + java.io.ObjectOutput out = call.getOutputStream(); + out.writeObject($param_0); + out.writeObject($param_1); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling arguments", e); + } + ref.invoke(call); + try { + java.io.ObjectInput in = call.getInputStream(); + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling return", e); + } + finally { + ref.done(call); + } + } + } + catch (java.rmi.AccessException e) { + throw e; + } + catch (java.rmi.RemoteException e) { + throw e; + } + catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + public void unbind(java.lang.String $param_0) throws java.rmi.AccessException, java.rmi.NotBoundException, java.rmi.RemoteException { + try { + if (useNewInvoke) { + ref.invoke(this, $method_unbind_4, new java.lang.Object[] {$param_0}, 7305022919901907578L); + } + else { + java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, 4, interfaceHash); + try { + java.io.ObjectOutput out = call.getOutputStream(); + out.writeObject($param_0); + } + catch (java.io.IOException e) { + throw new java.rmi.MarshalException("error marshalling arguments", e); + } + ref.invoke(call); + try { + java.io.ObjectInput in = call.getInputStream(); + } + catch (java.io.IOException e) { + throw new java.rmi.UnmarshalException("error unmarshalling return", e); + } + finally { + ref.done(call); + } + } + } + catch (java.rmi.AccessException e) { + throw e; + } + catch (java.rmi.NotBoundException e) { + throw e; + } + catch (java.rmi.RemoteException e) { + throw e; + } + catch (java.lang.Exception e) { + throw new java.rmi.UnexpectedException("undeclared checked exception", e); + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/rmic/Compile_gcj.java gcc-3.1/libjava/gnu/java/rmi/rmic/Compile_gcj.java *** gcc-3.0.4/libjava/gnu/java/rmi/rmic/Compile_gcj.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/rmic/Compile_gcj.java Tue Jan 22 22:40:00 2002 *************** *** 0 **** --- 1,60 ---- + /* + Copyright (c) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.rmic; + + /** Subclass of Compiler that can be used to invoke gcj. */ + public class Compile_gcj extends CompilerProcess + { + public String[] computeArguments (String filename) + { + int len = 3 + (dest == null ? 0 : 2); + String[] result = new String[len]; + int i = 0; + + result[i++] = "gcj"; + result[i++] = "-C"; + if (dest != null) + { + result[i++] = "-d"; + result[i++] = dest; + } + result[i++] = filename; + + return result; + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/rmic/Compiler.java gcc-3.1/libjava/gnu/java/rmi/rmic/Compiler.java *** gcc-3.0.4/libjava/gnu/java/rmi/rmic/Compiler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/rmic/Compiler.java Tue Jan 22 22:40:00 2002 *************** *** 0 **** --- 1,85 ---- + /* + Copyright (c) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.rmic; + + /** A Compiler object can be used to compile a .java file into a + * .class file. This is an abstract class; the + * getInstance() method is used to obtain the actual + * compiler object. */ + public abstract class Compiler + { + // Can't directly instantiate. + protected Compiler () + { + } + + /** Create a new compiler instance. */ + public static Compiler getInstance () + { + return getInstance (System.getProperty ("classpath.compiler", "gcj")); + } + + /** Create a new compiler instance given the name of the compiler. */ + public static Compiler getInstance (String name) + { + try + { + Class k = Class.forName (classPrefix + name); + return (Compiler) k.newInstance (); + } + catch (Throwable _) + { + } + return null; + } + + /** Set the directory where output files will be put. */ + public void setDestination (String dest) + { + this.dest = dest; + } + + /** Compile the given file. Throws exception on error. */ + public abstract void compile (String name) throws Exception; + + /** The destination directory, or null if none set. */ + protected String dest; + + /** Class prefix used when trying to find instance. */ + private static final String classPrefix = "gnu.java.rmi.rmic.Compile_"; + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/rmic/CompilerProcess.java gcc-3.1/libjava/gnu/java/rmi/rmic/CompilerProcess.java *** gcc-3.0.4/libjava/gnu/java/rmi/rmic/CompilerProcess.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/rmic/CompilerProcess.java Tue Jan 22 22:40:00 2002 *************** *** 0 **** --- 1,71 ---- + /* + Copyright (c) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.rmic; + + /** Subclass of Compiler that can be subclassed to invoke a process to + * do its work. */ + public abstract class CompilerProcess extends Compiler + { + /** This is used to compute the command line for the process. */ + public abstract String[] computeArguments (String filename); + + public void compile (String name) throws Exception + { + String[] args = computeArguments (name); + Process p = Runtime.getRuntime ().exec (args); + // FIXME: probably should collect compiler output here and then + // put it into the exception message. + int result; + while (true) + { + try + { + result = p.waitFor (); + break; + } + catch (InterruptedException _) + { + } + } + if (result != 0) + { + // FIXME: wrong exception class. + throw new Exception ("compiler exited with status: " + result); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/rmic/RMIC.java gcc-3.1/libjava/gnu/java/rmi/rmic/RMIC.java *** gcc-3.0.4/libjava/gnu/java/rmi/rmic/RMIC.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/rmic/RMIC.java Mon Mar 25 22:15:21 2002 *************** *** 0 **** --- 1,1017 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999, 2001, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.rmic; + + import java.io.File; + import java.io.FileWriter; + import java.io.PrintWriter; + import java.io.IOException; + import java.lang.reflect.Method; + import java.lang.reflect.Modifier; + import java.util.HashSet; + import java.util.Iterator; + import java.util.Arrays; + import java.lang.Comparable; + import gnu.java.rmi.server.RMIHashes; + + public class RMIC { + + private String[] args; + private int next; + private Exception exception; + + private boolean keep = false; + private boolean need11Stubs = true; + private boolean need12Stubs = true; + private boolean compile = true; + private boolean verbose; + private String destination; + + private PrintWriter out; + private TabbedWriter ctrl; + + private Class clazz; + private String classname; + private String fullclassname; + private MethodRef[] remotemethods; + private String stubname; + private String skelname; + + public RMIC(String[] a) { + args = a; + } + + public static void main(String args[]) { + RMIC r = new RMIC(args); + if (r.run() == false) { + Exception exception = r.getException(); + if (exception != null) { + exception.printStackTrace(); + } + else { + System.exit(1); + } + } + } + + public boolean run() { + parseOptions(); + if (next >= args.length) { + error("no class names found"); + } + for (int i = next; i < args.length; i++) { + try { + if (verbose) { + System.out.println("[Processing class " + args[i] + ".class]"); + } + processClass(args[i]); + } + catch (Exception e) { + exception = e; + return (false); + } + } + return (true); + } + + private boolean processClass(String classname) throws Exception { + analyzeClass(classname); + generateStub(); + if (need11Stubs) { + generateSkel(); + } + if (compile) { + compile(stubname + ".java"); + if (need11Stubs) { + compile(skelname + ".java"); + } + } + if (!keep) { + (new File(stubname + ".java")).delete(); + if (need11Stubs) { + (new File(skelname + ".java")).delete(); + } + } + return (true); + } + + private void analyzeClass(String cname) throws Exception { + int p = cname.lastIndexOf('.'); + if (p != -1) { + classname = cname.substring(p+1); + } + else { + classname = cname; + } + fullclassname = cname; + + HashSet rmeths = new HashSet(); + findClass(); + for (Class cls = clazz; cls != null; cls = cls.getSuperclass()) { + // Keep going down the inheritence tree until we hit the system + if (cls.getName().startsWith("java.")) { + break; + } + + Method[] meths = cls.getDeclaredMethods(); + for (int i = 0; i < meths.length; i++) { + // Only include public methods + int mods = meths[i].getModifiers(); + if (Modifier.isPublic(mods) && !Modifier.isStatic(mods)) { + // Should check exceptions here. - XXX + + // Add this one in. + rmeths.add(meths[i]); + } + } + } + + // Convert into a MethodRef array and sort them + remotemethods = new MethodRef[rmeths.size()]; + int c = 0; + for (Iterator i = rmeths.iterator(); i.hasNext(); ) { + remotemethods[c++] = new MethodRef((Method)i.next()); + } + Arrays.sort(remotemethods); + } + + public Exception getException() { + return (exception); + } + + private void findClass() throws ClassNotFoundException { + clazz = Class.forName(fullclassname); + } + + private void generateStub() throws IOException { + stubname = classname + "_Stub"; + ctrl = new TabbedWriter(new FileWriter(stubname + ".java")); + out = new PrintWriter(ctrl); + + if (verbose) { + System.out.println("[Generating class " + stubname + ".java]"); + } + + out.println("// Stub class generated by rmic - DO NOT EDIT!"); + out.println(); + if (fullclassname != classname) { + String pname = fullclassname.substring(0, fullclassname.lastIndexOf('.')); + out.println("package " + pname + ";"); + out.println(); + } + + out.print("public final class " + stubname); + ctrl.indent(); + out.println("extends java.rmi.server.RemoteStub"); + + // Output interfaces we implement + out.print("implements "); + Class[] ifaces = clazz.getInterfaces(); + for (int i = 0; i < ifaces.length; i++) { + out.print(ifaces[i].getName()); + if (i+1 < ifaces.length) { + out.print(", "); + } + } + + ctrl.unindent(); + out.print("{"); + ctrl.indent(); + + // UID + if (need12Stubs) { + out.println("private static final long serialVersionUID = 2L;"); + out.println(); + } + + // InterfaceHash - don't know how to calculate this - XXX + if (need11Stubs) { + out.println("private static final long interfaceHash = " + RMIHashes.getInterfaceHash(clazz) + "L;"); + out.println(); + if (need12Stubs) { + out.println("private static boolean useNewInvoke;"); + out.println(); + } + + // Operation table + out.print("private static final java.rmi.server.Operation[] operations = {"); + + ctrl.indent(); + for (int i = 0; i < remotemethods.length; i++) { + Method m = remotemethods[i].meth; + out.print("new java.rmi.server.Operation(\""); + out.print(getPrettyName(m.getReturnType()) + " "); + out.print(m.getName() + "("); + // Output signature + Class[] sig = m.getParameterTypes(); + for (int j = 0; j < sig.length; j++) { + out.print(getPrettyName(sig[j])); + if (j+1 < sig.length) { + out.print(", "); + } + } + out.print(")\")"); + if (i + 1 < remotemethods.length) { + out.println(","); + } + } + ctrl.unindent(); + out.println("};"); + out.println(); + } + + // Set of method references. + if (need12Stubs) { + for (int i = 0; i < remotemethods.length; i++) { + Method m = remotemethods[i].meth; + out.println("private static java.lang.reflect.Method $method_" + m.getName() + "_" + i + ";"); + } + + // Initialize the methods references. + out.println(); + out.print("static {"); + ctrl.indent(); + + out.print("try {"); + ctrl.indent(); + + if (need11Stubs) { + out.println("java.rmi.server.RemoteRef.class.getMethod(\"invoke\", new java.lang.Class[] { java.rmi.Remote.class, java.lang.reflect.Method.class, java.lang.Object[].class, long.class });"); + out.println("useNewInvoke = true;"); + } + + for (int i = 0; i < remotemethods.length; i++) { + Method m = remotemethods[i].meth; + out.print("$method_" + m.getName() + "_" + i + " = "); + out.print(fullclassname + ".class.getMethod(\"" + m.getName() + "\""); + out.print(", new java.lang.Class[] {"); + // Output signature + Class[] sig = m.getParameterTypes(); + for (int j = 0; j < sig.length; j++) { + out.print(getPrettyName(sig[j]) + ".class"); + if (j+1 < sig.length) { + out.print(", "); + } + } + out.println("});"); + } + ctrl.unindent(); + out.println("}"); + out.print("catch (java.lang.NoSuchMethodException e) {"); + ctrl.indent(); + if (need11Stubs) { + out.print("useNewInvoke = false;"); + } + else { + out.print("throw new java.lang.NoSuchMethodError(\"stub class initialization failed\");"); + } + + ctrl.unindent(); + out.print("}"); + + ctrl.unindent(); + out.println("}"); + out.println(); + } + + // Constructors + if (need11Stubs) { + out.print("public " + stubname + "() {"); + ctrl.indent(); + out.print("super();"); + ctrl.unindent(); + out.println("}"); + } + + if (need12Stubs) { + out.print("public " + stubname + "(java.rmi.server.RemoteRef ref) {"); + ctrl.indent(); + out.print("super(ref);"); + ctrl.unindent(); + out.println("}"); + } + + // Method implementations + for (int i = 0; i < remotemethods.length; i++) { + Method m = remotemethods[i].meth; + Class[] sig = m.getParameterTypes(); + Class returntype = m.getReturnType(); + Class[] except = sortExceptions(m.getExceptionTypes()); + + out.println(); + out.print("public " + getPrettyName(returntype) + " " + m.getName() + "("); + for (int j = 0; j < sig.length; j++) { + out.print(getPrettyName(sig[j])); + out.print(" $param_" + j); + if (j+1 < sig.length) { + out.print(", "); + } + } + out.print(") "); + out.print("throws "); + for (int j = 0; j < except.length; j++) { + out.print(getPrettyName(except[j])); + if (j+1 < except.length) { + out.print(", "); + } + } + out.print(" {"); + ctrl.indent(); + + out.print("try {"); + ctrl.indent(); + + if (need12Stubs) { + if (need11Stubs) { + out.print("if (useNewInvoke) {"); + ctrl.indent(); + } + if (returntype != Void.TYPE) { + out.print("java.lang.Object $result = "); + } + out.print("ref.invoke(this, $method_" + m.getName() + "_" + i + ", "); + if (sig.length == 0) { + out.print("null, "); + } + else { + out.print("new java.lang.Object[] {"); + for (int j = 0; j < sig.length; j++) { + if (sig[j] == Boolean.TYPE) { + out.print("new java.lang.Boolean($param_" + j + ")"); + } + else if (sig[j] == Byte.TYPE) { + out.print("new java.lang.Byte($param_" + j + ")"); + } + else if (sig[j] == Character.TYPE) { + out.print("new java.lang.Character($param_" + j + ")"); + } + else if (sig[j] == Short.TYPE) { + out.print("new java.lang.Short($param_" + j + ")"); + } + else if (sig[j] == Integer.TYPE) { + out.print("new java.lang.Integer($param_" + j + ")"); + } + else if (sig[j] == Long.TYPE) { + out.print("new java.lang.Long($param_" + j + ")"); + } + else if (sig[j] == Float.TYPE) { + out.print("new java.lang.Float($param_" + j + ")"); + } + else if (sig[j] == Double.TYPE) { + out.print("new java.lang.Double($param_" + j + ")"); + } + else { + out.print("$param_" + j); + } + if (j+1 < sig.length) { + out.print(", "); + } + } + out.print("}, "); + } + out.print(Long.toString(remotemethods[i].hash) + "L"); + out.print(");"); + + if (returntype != Void.TYPE) { + out.println(); + out.print("return ("); + if (returntype == Boolean.TYPE) { + out.print("((java.lang.Boolean)$result).booleanValue()"); + } + else if (returntype == Byte.TYPE) { + out.print("((java.lang.Byte)$result).byteValue()"); + } + else if (returntype == Character.TYPE) { + out.print("((java.lang.Character)$result).charValue()"); + } + else if (returntype == Short.TYPE) { + out.print("((java.lang.Short)$result).shortValue()"); + } + else if (returntype == Integer.TYPE) { + out.print("((java.lang.Integer)$result).intValue()"); + } + else if (returntype == Long.TYPE) { + out.print("((java.lang.Long)$result).longValue()"); + } + else if (returntype == Float.TYPE) { + out.print("((java.lang.Float)$result).floatValue()"); + } + else if (returntype == Double.TYPE) { + out.print("((java.lang.Double)$result).doubleValue()"); + } + else { + out.print("(" + getPrettyName(returntype) + ")$result"); + } + out.print(");"); + } + + if (need11Stubs) { + ctrl.unindent(); + out.println("}"); + out.print("else {"); + ctrl.indent(); + } + } + + if (need11Stubs) { + out.println("java.rmi.server.RemoteCall call = ref.newCall((java.rmi.server.RemoteObject)this, operations, " + i + ", interfaceHash);"); + out.print("try {"); + ctrl.indent(); + out.print("java.io.ObjectOutput out = call.getOutputStream();"); + for (int j = 0; j < sig.length; j++) { + out.println(); + if (sig[j] == Boolean.TYPE) { + out.print("out.writeBoolean("); + } + else if (sig[j] == Byte.TYPE) { + out.print("out.writeByte("); + } + else if (sig[j] == Character.TYPE) { + out.print("out.writeChar("); + } + else if (sig[j] == Short.TYPE) { + out.print("out.writeShort("); + } + else if (sig[j] == Integer.TYPE) { + out.print("out.writeInt("); + } + else if (sig[j] == Long.TYPE) { + out.print("out.writeLong("); + } + else if (sig[j] == Float.TYPE) { + out.print("out.writeFloat("); + } + else if (sig[j] == Double.TYPE) { + out.print("out.writeDouble("); + } + else { + out.print("out.writeObject("); + } + out.print("$param_" + j + ");"); + } + ctrl.unindent(); + out.println("}"); + out.print("catch (java.io.IOException e) {"); + ctrl.indent(); + out.print("throw new java.rmi.MarshalException(\"error marshalling arguments\", e);"); + ctrl.unindent(); + out.println("}"); + out.println("ref.invoke(call);"); + if (returntype != Void.TYPE) { + out.println(getPrettyName(returntype) + " $result;"); + } + out.print("try {"); + ctrl.indent(); + out.print("java.io.ObjectInput in = call.getInputStream();"); + boolean needcastcheck = false; + if (returntype != Void.TYPE) { + out.println(); + out.print("$result = "); + if (returntype == Boolean.TYPE) { + out.print("in.readBoolean();"); + } + else if (returntype == Byte.TYPE) { + out.print("in.readByte();"); + } + else if (returntype == Character.TYPE) { + out.print("in.readChar();"); + } + else if (returntype == Short.TYPE) { + out.print("in.readShort();"); + } + else if (returntype == Integer.TYPE) { + out.print("in.readInt();"); + } + else if (returntype == Long.TYPE) { + out.print("in.readLong();"); + } + else if (returntype == Float.TYPE) { + out.print("in.readFloat();"); + } + else if (returntype == Double.TYPE) { + out.print("in.readDouble();"); + } + else { + if (returntype != Object.class) { + out.print("(" + getPrettyName(returntype) + ")"); + } + else { + needcastcheck = true; + } + out.print("in.readObject();"); + } + out.println(); + out.print("return ($result);"); + } + ctrl.unindent(); + out.println("}"); + out.print("catch (java.io.IOException e) {"); + ctrl.indent(); + out.print("throw new java.rmi.UnmarshalException(\"error unmarshalling return\", e);"); + ctrl.unindent(); + out.println("}"); + if (needcastcheck) { + out.print("catch (java.lang.ClassNotFoundException e) {"); + ctrl.indent(); + out.print("throw new java.rmi.UnmarshalException(\"error unmarshalling return\", e);"); + ctrl.unindent(); + out.println("}"); + } + out.print("finally {"); + ctrl.indent(); + out.print("ref.done(call);"); + ctrl.unindent(); + out.print("}"); + + if (need12Stubs && need11Stubs) { + ctrl.unindent(); + out.print("}"); + } + } + + ctrl.unindent(); + out.print("}"); + + boolean needgeneral = true; + for (int j = 0; j < except.length; j++) { + out.println(); + out.print("catch (" + getPrettyName(except[j]) + " e) {"); + ctrl.indent(); + out.print("throw e;"); + ctrl.unindent(); + out.print("}"); + if (except[j] == Exception.class) { + needgeneral = false; + } + } + if (needgeneral) { + out.println(); + out.print("catch (java.lang.Exception e) {"); + ctrl.indent(); + out.print("throw new java.rmi.UnexpectedException(\"undeclared checked exception\", e);"); + ctrl.unindent(); + out.print("}"); + } + + ctrl.unindent(); + out.print("}"); + out.println(); + } + + ctrl.unindent(); + out.println("}"); + + out.close(); + } + + private void generateSkel() throws IOException { + skelname = classname + "_Skel"; + ctrl = new TabbedWriter(new FileWriter(skelname + ".java")); + out = new PrintWriter(ctrl); + + if (verbose) { + System.out.println("[Generating class " + skelname + ".java]"); + } + + out.println("// Skel class generated by rmic - DO NOT EDIT!"); + out.println(); + if (fullclassname != classname) { + String pname = fullclassname.substring(0, fullclassname.lastIndexOf('.')); + out.println("package " + pname + ";"); + out.println(); + } + + out.print("public final class " + skelname); + ctrl.indent(); + + // Output interfaces we implement + out.print("implements java.rmi.server.Skeleton"); + + ctrl.unindent(); + out.print("{"); + ctrl.indent(); + + // Interface hash - don't know how to calculate this - XXX + out.println("private static final long interfaceHash = " + RMIHashes.getInterfaceHash(clazz) + "L;"); + out.println(); + + // Operation table + out.print("private static final java.rmi.server.Operation[] operations = {"); + + ctrl.indent(); + for (int i = 0; i < remotemethods.length; i++) { + Method m = remotemethods[i].meth; + out.print("new java.rmi.server.Operation(\""); + out.print(getPrettyName(m.getReturnType()) + " "); + out.print(m.getName() + "("); + // Output signature + Class[] sig = m.getParameterTypes(); + for (int j = 0; j < sig.length; j++) { + out.print(getPrettyName(sig[j])); + if (j+1 < sig.length) { + out.print(", "); + } + } + out.print("\")"); + if (i + 1 < remotemethods.length) { + out.println(","); + } + } + ctrl.unindent(); + out.println("};"); + + out.println(); + + // getOperations method + out.print("public java.rmi.server.Operation[] getOperations() {"); + ctrl.indent(); + out.print("return ((java.rmi.server.Operation[]) operations.clone());"); + ctrl.unindent(); + out.println("}"); + + out.println(); + + // Dispatch method + out.print("public void dispatch(java.rmi.Remote obj, java.rmi.server.RemoteCall call, int opnum, long hash) throws java.lang.Exception {"); + ctrl.indent(); + + out.print("if (opnum < 0) {"); + ctrl.indent(); + + for (int i = 0; i < remotemethods.length; i++) { + out.print("if (hash == " + Long.toString(remotemethods[i].hash) + "L) {"); + ctrl.indent(); + out.print("opnum = " + i + ";"); + ctrl.unindent(); + out.println("}"); + out.print("else "); + } + out.print("{"); + ctrl.indent(); + out.print("throw new java.rmi.server.SkeletonMismatchException(\"interface hash mismatch\");"); + ctrl.unindent(); + out.print("}"); + + ctrl.unindent(); + out.println("}"); + out.print("else if (hash != interfaceHash) {"); + ctrl.indent(); + out.print("throw new java.rmi.server.SkeletonMismatchException(\"interface hash mismatch\");"); + ctrl.unindent(); + out.println("}"); + + out.println(); + + out.println(fullclassname + " server = (" + fullclassname + ")obj;"); + out.println("switch (opnum) {"); + + // Method dispatch + for (int i = 0; i < remotemethods.length; i++) { + Method m = remotemethods[i].meth; + out.println("case " + i + ":"); + out.print("{"); + ctrl.indent(); + + Class[] sig = m.getParameterTypes(); + for (int j = 0; j < sig.length; j++) { + out.print(getPrettyName(sig[j])); + out.println(" $param_" + j + ";"); + } + + out.print("try {"); + boolean needcastcheck = false; + ctrl.indent(); + out.println("java.io.ObjectInput in = call.getInputStream();"); + for (int j = 0; j < sig.length; j++) { + out.print("$param_" + j + " = "); + if (sig[j] == Boolean.TYPE) { + out.print("in.readBoolean();"); + } + else if (sig[j] == Byte.TYPE) { + out.print("in.readByte();"); + } + else if (sig[j] == Character.TYPE) { + out.print("in.readChar();"); + } + else if (sig[j] == Short.TYPE) { + out.print("in.readShort();"); + } + else if (sig[j] == Integer.TYPE) { + out.print("in.readInt();"); + } + else if (sig[j] == Long.TYPE) { + out.print("in.readLong();"); + } + else if (sig[j] == Float.TYPE) { + out.print("in.readFloat();"); + } + else if (sig[j] == Double.TYPE) { + out.print("in.readDouble();"); + } + else { + if (sig[j] != Object.class) { + out.print("(" + getPrettyName(sig[j]) + ")"); + needcastcheck = true; + } + out.print("in.readObject();"); + } + out.println(); + } + ctrl.unindent(); + out.println("}"); + out.print("catch (java.io.IOException e) {"); + ctrl.indent(); + out.print("throw new java.rmi.UnmarshalException(\"error unmarshalling arguments\", e);"); + ctrl.unindent(); + out.println("}"); + if (needcastcheck) { + out.print("catch (java.lang.ClassCastException e) {"); + ctrl.indent(); + out.print("throw new java.rmi.UnmarshalException(\"error unmarshalling arguments\", e);"); + ctrl.unindent(); + out.println("}"); + } + out.print("finally {"); + ctrl.indent(); + out.print("call.releaseInputStream();"); + ctrl.unindent(); + out.println("}"); + + Class returntype = m.getReturnType(); + if (returntype != Void.TYPE) { + out.print(getPrettyName(returntype) + " $result = "); + } + out.print("server." + m.getName() + "("); + for (int j = 0; j < sig.length; j++) { + out.print("$param_" + j); + if (j + 1 < sig.length) { + out.print(", "); + } + } + out.println(");"); + + out.print("try {"); + ctrl.indent(); + out.print("java.io.ObjectOutput out = call.getResultStream(true);"); + if (returntype != Void.TYPE) { + out.println(); + if (returntype == Boolean.TYPE) { + out.print("out.writeBoolean($result);"); + } + else if (returntype == Byte.TYPE) { + out.print("out.writeByte($result);"); + } + else if (returntype == Character.TYPE) { + out.print("out.writeChar($result);"); + } + else if (returntype == Short.TYPE) { + out.print("out.writeShort($result);"); + } + else if (returntype == Integer.TYPE) { + out.print("out.writeInt($result);"); + } + else if (returntype == Long.TYPE) { + out.print("out.writeLong($result);"); + } + else if (returntype == Float.TYPE) { + out.print("out.writeFloat($result);"); + } + else if (returntype == Double.TYPE) { + out.print("out.writeDouble($result);"); + } + else { + out.print("out.writeObject($result);"); + } + } + ctrl.unindent(); + out.println("}"); + out.print("catch (java.io.IOException e) {"); + ctrl.indent(); + out.print("throw new java.rmi.MarshalException(\"error marshalling return\", e);"); + ctrl.unindent(); + out.println("}"); + out.print("break;"); + + ctrl.unindent(); + out.println("}"); + out.println(); + } + + out.print("default:"); + ctrl.indent(); + out.print("throw new java.rmi.UnmarshalException(\"invalid method number\");"); + ctrl.unindent(); + out.print("}"); + + ctrl.unindent(); + out.print("}"); + + ctrl.unindent(); + out.println("}"); + + out.close(); + } + + private void compile(String name) throws Exception { + Compiler comp = Compiler.getInstance(); + if (verbose) { + System.out.println("[Compiling class " + name + "]"); + } + comp.setDestination(destination); + comp.compile(name); + } + + private static String getPrettyName(Class cls) { + StringBuffer str = new StringBuffer(); + for (int count = 0;; count++) { + if (!cls.isArray()) { + str.append(cls.getName()); + for (; count > 0; count--) { + str.append("[]"); + } + return (str.toString()); + } + cls = cls.getComponentType(); + } + } + + /** + * Sort exceptions so the most general go last. + */ + private Class[] sortExceptions(Class[] except) { + for (int i = 0; i < except.length; i++) { + for (int j = i+1; j < except.length; j++) { + if (except[i].isAssignableFrom(except[j])) { + Class tmp = except[i]; + except[i] = except[j]; + except[j] = tmp; + } + } + } + return (except); + } + + /** + * Process the options until we find the first argument. + */ + private void parseOptions() { + for (;;) { + if (next >= args.length || args[next].charAt(0) != '-') { + break; + } + String arg = args[next]; + next++; + + // Accept `--' options if they look long enough. + if (arg.length() > 3 && arg.charAt(0) == '-' + && arg.charAt(1) == '-') + arg = arg.substring(1); + + if (arg.equals("-keep")) { + keep = true; + } + else if (arg.equals("-keepgenerated")) { + keep = true; + } + else if (arg.equals("-v1.1")) { + need11Stubs = true; + need12Stubs = false; + } + else if (arg.equals("-vcompat")) { + need11Stubs = true; + need12Stubs = true; + } + else if (arg.equals("-v1.2")) { + need11Stubs = false; + need12Stubs = true; + } + else if (arg.equals("-g")) { + } + else if (arg.equals("-depend")) { + } + else if (arg.equals("-nowarn")) { + } + else if (arg.equals("-verbose")) { + verbose = true; + } + else if (arg.equals("-nocompile")) { + compile = false; + } + else if (arg.equals("-classpath")) { + next++; + } + else if (arg.equals("-help")) { + usage(); + } + else if (arg.equals("-version")) { + System.out.println("rmic (" + + System.getProperty("java.vm.name") + + ") " + + System.getProperty("java.vm.version")); + System.out.println(); + System.out.println("Copyright 2002 Free Software Foundation, Inc."); + System.out.println("This is free software; see the source for copying conditions. There is NO"); + System.out.println("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."); + System.exit(0); + } + else if (arg.equals("-d")) { + destination = args[next]; + next++; + } + else if (arg.charAt(1) == 'J') { + } + else { + error("unrecognized option `" + arg + "'"); + } + } + } + + private static void error(String message) { + System.err.println("rmic: " + message); + System.err.println("Try `rmic --help' for more information."); + System.exit(1); + } + + private static void usage() { + System.out.println( + "Usage: rmic [OPTION]... CLASS...\n" + + "\n" + + " -keep Don't delete any intermediate files\n" + + " -keepgenerated Same as -keep\n" + + " -v1.1 Java 1.1 style stubs only\n" + + " -vcompat Java 1.1 & Java 1.2 stubs\n" + + " -v1.2 Java 1.2 style stubs only\n" + + " -g * Generated debugging information\n" + + " -depend * Recompile out-of-date files\n" + + " -nowarn * Suppress warning messages\n" + + " -nocompile Don't compile the generated files\n" + + " -verbose Output what's going on\n" + + " -classpath * Use given path as classpath\n" + + " -d Specify where to place generated classes\n" + + " -J * Pass flag to Java\n" + + " -help Print this help, then exit\n" + + " -version Print version number, then exit\n" + + "\n" + + " * Option currently ignored\n" + + "Long options can be used with `--option' form as well." + ); + System.exit(0); + } + + static class MethodRef + implements Comparable { + + Method meth; + String sig; + long hash; + + MethodRef(Method m) { + meth = m; + // We match on the name - but what about overloading? - XXX + sig = m.getName(); + hash = RMIHashes.getMethodHash(m); + } + + public int compareTo(Object obj) { + MethodRef that = (MethodRef)obj; + return (this.sig.compareTo(that.sig)); + } + + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/rmic/TabbedWriter.java gcc-3.1/libjava/gnu/java/rmi/rmic/TabbedWriter.java *** gcc-3.0.4/libjava/gnu/java/rmi/rmic/TabbedWriter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/rmic/TabbedWriter.java Tue Jan 22 22:40:00 2002 *************** *** 0 **** --- 1,100 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.rmic; + + import java.io.FilterWriter; + import java.io.Writer; + import java.io.IOException; + + public class TabbedWriter + extends FilterWriter { + + private static final String defaultTabstring = " "; + private char[] tabstring; + private int tabs; + + public TabbedWriter(Writer o) { + this(o, defaultTabstring); + } + + public TabbedWriter(Writer o, String str) { + super(o); + tabs = 0; + tabstring = str.toCharArray(); + } + + public void write(int c) throws IOException { + out.write(c); + if (c == '\n') { + for (int i = 0; i < tabs; i++) { + out.write(tabstring, 0, tabstring.length); + } + } + } + + public void write(char cbuf[], int off, int len) throws IOException { + for (int i = 0; i < len; i++) { + write((int)cbuf[i+off]); + } + } + + public void write(String str, int off, int len) throws IOException { + write(str.toCharArray(), off, len); + } + + public void unindent() throws IOException { + unindent(1); + } + + public void unindent(int nr) throws IOException { + indent(-nr); + } + + public void indent() throws IOException { + indent(1); + } + + public void indent(int nr) throws IOException { + tabs += nr; + if (tabs < 0) { + tabs = 0; + } + write((int)'\n'); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/ProtocolConstants.java gcc-3.1/libjava/gnu/java/rmi/server/ProtocolConstants.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/ProtocolConstants.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/ProtocolConstants.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,63 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + public interface ProtocolConstants { + + final public static int PROTOCOL_HEADER = 0x4a524d49; // JRMI + final public static int PROTOCOL_VERSION = 2; + + final public static int STREAM_PROTOCOL = 0x4b; + final public static int SINGLE_OP_PROTOCOL = 0x4c; + final public static int MULTIPLEX_PROTOCOL = 0x4d; + + final public static int PROTOCOL_ACK = 0x4e; + final public static int PROTOCOL_NACK = 0x4f; + + final public static int MESSAGE_CALL = 0x50; + final public static int MESSAGE_CALL_ACK = 0x51; + final public static int MESSAGE_PING = 0x52; + final public static int MESSAGE_PING_ACK = 0x53; + final public static int MESSAGE_DGCACK = 0x54; + + final public static int RETURN_ACK = 0x01; + final public static int RETURN_NACK = 0x02; + + final public static int DEFAULT_PROTOCOL = STREAM_PROTOCOL; + + }; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/RMIDefaultSocketFactory.java gcc-3.1/libjava/gnu/java/rmi/server/RMIDefaultSocketFactory.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/RMIDefaultSocketFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/RMIDefaultSocketFactory.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,59 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.rmi.server.RMISocketFactory; + import java.io.IOException; + import java.net.Socket; + import java.net.ServerSocket; + + public class RMIDefaultSocketFactory + extends RMISocketFactory { + + public RMIDefaultSocketFactory() { + } + + public Socket createSocket(String host, int port) throws IOException { + return (new Socket(host, port)); + } + + public ServerSocket createServerSocket(int port) throws IOException { + return (new ServerSocket(port)); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/RMIHashes.java gcc-3.1/libjava/gnu/java/rmi/server/RMIHashes.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/RMIHashes.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/RMIHashes.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,55 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.lang.reflect.Method; + import java.lang.Class; + import gnu.java.security.provider.SHA; + + public class RMIHashes + { + public static long getMethodHash(Method meth) + { + return meth.hashCode (); + } + + public static long getInterfaceHash(Class clazz) + { + return clazz.hashCode (); + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/RMIObjectInputStream.java gcc-3.1/libjava/gnu/java/rmi/server/RMIObjectInputStream.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/RMIObjectInputStream.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/RMIObjectInputStream.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,75 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.io.ObjectStreamClass; + import java.io.ObjectInputStream; + import java.io.InputStream; + import java.io.IOException; + import java.net.URL; + import java.net.MalformedURLException; + import java.rmi.server.RMIClassLoader; + + public class RMIObjectInputStream + extends ObjectInputStream { + + UnicastConnectionManager manager; + + public RMIObjectInputStream(InputStream strm, UnicastConnectionManager man) throws IOException { + super(strm); + manager = man; + enableResolveObject(true); + } + + protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + //System.out.println("Resolving class: " + desc.getName()); + String annotation = (String)readObject(); + if (annotation == null) { + return (super.resolveClass(desc)); + } + else { + try { + return (RMIClassLoader.loadClass(new URL(annotation), desc.getName())); + } + catch (MalformedURLException _) { + throw new ClassNotFoundException(desc.getName()); + } + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java gcc-3.1/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/RMIObjectOutputStream.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,57 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.io.ObjectOutputStream; + import java.io.OutputStream; + import java.io.IOException; + import java.rmi.server.RMIClassLoader; + + public class RMIObjectOutputStream + extends ObjectOutputStream { + + public RMIObjectOutputStream(OutputStream strm) throws IOException { + super(strm); + } + + protected void annotateClass(Class cls) throws IOException { + //System.out.println("Annotating class: " + cls); + writeObject(RMIClassLoader.getClassAnnotation(cls)); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastConnection.java gcc-3.1/libjava/gnu/java/rmi/server/UnicastConnection.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastConnection.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/UnicastConnection.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,172 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.lang.Runnable; + import java.net.Socket; + import java.net.ServerSocket; + import java.io.DataInputStream; + import java.io.DataOutputStream; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; + import java.io.ObjectOutput; + import java.io.ObjectInput; + import java.io.IOException; + import java.rmi.RemoteException; + + public class UnicastConnection + implements Runnable, ProtocolConstants { + + UnicastConnectionManager manager; + Socket sock; + DataInputStream din; + DataOutputStream dout; + ObjectInputStream oin; + ObjectOutputStream oout; + + UnicastConnection(UnicastConnectionManager man, Socket sock) { + this.manager = man; + this.sock = sock; + } + + void acceptConnection() throws IOException { + //System.out.println("Accepting connection on " + lport); + din = new DataInputStream(sock.getInputStream()); + dout = new DataOutputStream(sock.getOutputStream()); + + int sig = din.readInt(); + if (sig != PROTOCOL_HEADER) { + throw new IOException("bad protocol header"); + } + short ver = din.readShort(); + if (ver != PROTOCOL_VERSION) { + throw new IOException("bad protocol version"); + } + int protocol = din.readUnsignedByte(); + if (protocol != SINGLE_OP_PROTOCOL) { + // Send an ACK + dout.writeByte(PROTOCOL_ACK); + + // Send my hostname and port + dout.writeUTF(manager.serverName); + dout.writeInt(manager.serverPort); + + // Read their hostname and port + String rhost = din.readUTF(); + int rport = din.readInt(); + } + // Okay, ready to roll ... + } + + void makeConnection(int protocol) throws IOException { + dout = new DataOutputStream(sock.getOutputStream()); + din = new DataInputStream(sock.getInputStream()); + + // Send header + dout.writeInt(PROTOCOL_HEADER); + dout.writeShort(PROTOCOL_VERSION); + dout.writeByte(protocol); + dout.flush(); + + if (protocol != SINGLE_OP_PROTOCOL) { + // Get back ack. + int ack = din.readUnsignedByte(); + if (ack != PROTOCOL_ACK) { + throw new RemoteException("Unsupported protocol"); + } + + // Read in host and port + String dicard_rhost = din.readUTF(); + int discard_rport = din.readInt(); + + // Send them my endpoint + dout.writeUTF(manager.serverName); + dout.writeInt(manager.serverPort); + } + // Okay, ready to roll ... + } + + DataInputStream getDataInputStream() throws IOException { + return (din); + } + + DataOutputStream getDataOutputStream() throws IOException { + return (dout); + } + + ObjectInputStream getObjectInputStream() throws IOException { + if (oin == null) { + oin = new RMIObjectInputStream(din, manager); + } + return (oin); + } + + ObjectOutputStream getObjectOutputStream() throws IOException { + if (oout == null) { + oout = new RMIObjectOutputStream(dout); + } + return (oout); + } + + void disconnect() { + oin = null; + oout = null; + try { + sock.close(); + } + catch (IOException _) { + } + din = null; + dout = null; + sock = null; + } + + /** + * We run connects on the server. Dispatch it then discard it. + */ + public void run() { + try { + UnicastServer.dispatch(this); + manager.discardConnection(this); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastConnectionManager.java gcc-3.1/libjava/gnu/java/rmi/server/UnicastConnectionManager.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastConnectionManager.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/UnicastConnectionManager.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,272 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.rmi.server.RMISocketFactory; + import java.rmi.server.RMIServerSocketFactory; + import java.rmi.server.RMIClientSocketFactory; + import java.rmi.RemoteException; + import gnu.java.rmi.server.UnicastConnection; + import java.util.Hashtable; + import java.net.Socket; + import java.net.ServerSocket; + import java.io.IOException; + import java.io.ObjectOutput; + import java.io.ObjectInput; + import java.lang.Thread; + import java.lang.Runnable; + import java.net.InetAddress; + import java.net.UnknownHostException; + + public class UnicastConnectionManager + implements Runnable, ProtocolConstants { + + private static String localhost; + private static Hashtable servers = new Hashtable(); + + private Thread serverThread; + private ServerSocket ssock; + String serverName; + int serverPort; + private RMIServerSocketFactory serverFactory; + private RMIClientSocketFactory clientFactory; + + static { + try { + localhost = InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException _) { + localhost = "localhost"; + } + } + + private UnicastConnectionManager(String host, int port, RMIClientSocketFactory csf) { + ssock = null; + serverName = host; + serverPort = port; + serverFactory = null; + clientFactory = csf; + } + + private UnicastConnectionManager(int port, RMIServerSocketFactory ssf) { + try { + ssock = ssf.createServerSocket(port); + serverPort = ssock.getLocalPort(); + } + catch (IOException _) { + try { + ssock = ssf.createServerSocket(0); + serverPort = ssock.getLocalPort(); + } + catch (IOException __) { + ssock = null; + serverPort = 0; + } + } + serverName = localhost; + serverFactory = ssf; + clientFactory = null; + } + + /** + * Return a client connection manager which will connect to the given + * host/port. + */ + public static synchronized UnicastConnectionManager getInstance(String host, int port, RMIClientSocketFactory csf) { + //System.out.println("getInstance: " + host + "," + port + "," + csf); + if (csf == null) { + csf = RMISocketFactory.getSocketFactory(); + } + TripleKey key = new TripleKey(host, port, csf); + UnicastConnectionManager man = (UnicastConnectionManager)servers.get(key); + if (man == null) { + man = new UnicastConnectionManager(host, port, csf); + servers.put(key, man); + } + return (man); + } + + /** + * Return a server connection manager which will accept connection on the + * given port. + */ + public static synchronized UnicastConnectionManager getInstance(int port, RMIServerSocketFactory ssf) { + //System.out.println("getInstance: " + port + "," + ssf); + if (ssf == null) { + ssf = RMISocketFactory.getSocketFactory(); + } + TripleKey key = new TripleKey(localhost, port, ssf); + UnicastConnectionManager man = (UnicastConnectionManager)servers.get(key); + if (man == null) { + man = new UnicastConnectionManager(port, ssf); + // The provided port might not be the set port. + key.port = man.serverPort; + servers.put(key, man); + } + return (man); + } + + /** + * Get a connection from this manager. + */ + public UnicastConnection getConnection() throws IOException { + if (ssock == null) { + return (getClientConnection()); + } + else { + return (getServerConnection()); + } + } + + /** + * Accept a connection to this server. + */ + private UnicastConnection getServerConnection() throws IOException { + Socket sock = ssock.accept(); + UnicastConnection conn = new UnicastConnection(this, sock); + conn.acceptConnection(); + //System.out.println("Server connection " + conn); + return (conn); + } + + /** + * Make a conection from this client to the server. + */ + private UnicastConnection getClientConnection() throws IOException { + Socket sock = clientFactory.createSocket(serverName, serverPort); + UnicastConnection conn = new UnicastConnection(this, sock); + conn.makeConnection(DEFAULT_PROTOCOL); + //System.out.println("Client connection " + conn); + return (conn); + } + + /** + * Discard a connection when we're done with it - maybe it can be + * recycled. + */ + public void discardConnection(UnicastConnection conn) { + //System.out.println("Discarding connection " + conn); + conn.disconnect(); + } + + /** + * Start a server on this manager if it's a server socket and we've not + * already got one running. + */ + public void startServer() { + synchronized(this) { + if (ssock == null || serverThread != null) { + return; + } + serverThread = new Thread(this); + } + serverThread.start(); + } + + /** + * Server thread for connection manager. + */ + public void run() { + for (;;) { + try { + //System.out.println("Waiting for connection on " + serverPort); + UnicastConnection conn = getServerConnection(); + (new Thread(conn)).start(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * Serialization routine. + */ + void write(ObjectOutput out) throws IOException { + out.writeUTF(serverName); + out.writeInt(serverPort); + } + + /** + * Serialization routine. + */ + static UnicastConnectionManager read(ObjectInput in) throws IOException { + String host = in.readUTF(); + int port = in.readInt(); + RMIClientSocketFactory csf = ((RMIObjectInputStream)in).manager.clientFactory; + return (getInstance(host, port, csf)); + } + + } + + /** + * This is use as the hashkey for the client/server connections. + */ + class TripleKey { + + String host; + int port; + Object other; + + TripleKey(String host, int port, Object other) { + this.host = host; + this.port = port; + this.other = other; + } + + /** + * Hash code just include the host and other - we ignore the port since + * this has unusual matching behaviour. + */ + public int hashCode() { + return (host.hashCode() ^ other.hashCode()); + } + + public boolean equals(Object obj) { + if (obj instanceof TripleKey) { + TripleKey other = (TripleKey)obj; + if (this.host.equals(other.host) && + this.other == other.other && + (this.port == other.port || this.port == 0 || other.port == 0)) { + return (true); + } + } + return (false); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastRef.java gcc-3.1/libjava/gnu/java/rmi/server/UnicastRef.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastRef.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/UnicastRef.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,229 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.rmi.server.RemoteRef; + import java.rmi.server.RMISocketFactory; + import java.rmi.server.RMIClientSocketFactory; + import java.rmi.server.RMIServerSocketFactory; + import java.rmi.server.RemoteObject; + import java.rmi.server.RemoteCall; + import java.rmi.server.UnicastRemoteObject; + import java.rmi.server.Operation; + import java.rmi.server.ObjID; + import java.rmi.server.UID; + import java.lang.reflect.Method; + import java.io.ObjectOutput; + import java.io.ObjectInput; + import java.io.IOException; + import java.net.Socket; + import java.net.InetAddress; + import java.io.BufferedInputStream; + import java.io.BufferedOutputStream; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; + import java.io.DataInputStream; + import java.io.DataOutputStream; + + public class UnicastRef + implements RemoteRef, ProtocolConstants { + + public ObjID objid; + UnicastConnectionManager manager; + + /** + * Used by serialization. + */ + private UnicastRef() { + } + + public UnicastRef(ObjID objid, String host, int port, RMIClientSocketFactory csf) { + this(objid); + manager = UnicastConnectionManager.getInstance(host, port, csf); + } + + public UnicastRef(ObjID objid) { + this.objid = objid; + } + + public Object invoke(Remote obj, Method method, Object[] params, long opnum) throws Exception { + return (invokeCommon(obj, method, params, -1, opnum)); + } + + private Object invokeCommon(Remote obj, Method method, Object[] params, int opnum, long hash) throws Exception { + UnicastConnection conn; + try { + conn = manager.getConnection(); + } + catch (IOException e1) { + throw new RemoteException("connection failed to host: " + manager.serverName, e1); + } + + ObjectOutputStream out; + DataOutputStream dout; + try { + dout = conn.getDataOutputStream(); + dout.writeByte(MESSAGE_CALL); + + out = conn.getObjectOutputStream(); + + objid.write(out); + out.writeInt(opnum); + out.writeLong(hash); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (params[i] instanceof UnicastRemoteObject) { + out.writeObject(UnicastRemoteObject.exportObject((UnicastRemoteObject)params[i])); + } + else { + out.writeObject(params[i]); + } + } + } + + out.flush(); + } + catch (IOException e2) { + throw new RemoteException("call failed: ", e2); + } + + int returncode; + Object returnval; + DataInputStream din; + ObjectInputStream in; + UID ack; + try { + din = conn.getDataInputStream(); + if (din.readUnsignedByte() != MESSAGE_CALL_ACK) { + throw new RemoteException("Call not acked"); + } + + in = conn.getObjectInputStream(); + + returncode = in.readUnsignedByte(); + ack = UID.read(in); + returnval = in.readObject(); + } + catch (IOException e3) { + throw new RemoteException("call return failed: ", e3); + } + + manager.discardConnection(conn); + + if (returncode != RETURN_ACK) { + throw (Exception)returnval; + } + + return (returnval); + } + + /** + * @deprecated + */ + public RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash) throws RemoteException { + return (new UnicastRemoteCall(obj, opnum, hash)); + } + + /** + * @deprecated + */ + public void invoke(RemoteCall call) throws Exception { + UnicastRemoteCall c = (UnicastRemoteCall)call; + Object ret = invokeCommon((Remote)c.getObject(), (Method)null, c.getArguments(), c.getOpnum(), c.getHash()); + c.setReturnValue(ret); + } + + /** + * @deprecated + */ + public void done(RemoteCall call) throws RemoteException { + /* Does nothing */ + } + + public void writeExternal(ObjectOutput out) throws IOException { + if (manager == null) { + throw new IOException("no connection"); + } + manager.write(out); + objid.write(out); + out.writeByte(RETURN_ACK); + } + + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + manager = UnicastConnectionManager.read(in); + objid = ObjID.read(in); + if (in.readByte() != RETURN_ACK) { + throw new IOException("no ack found"); + } + } + + public boolean remoteEquals(RemoteRef ref) { + throw new Error("Not implemented"); + } + + public int remoteHashCode() { + throw new Error("Not implemented"); + } + + public String getRefClass(ObjectOutput out) { + return ("UnicastRef"); + } + + public String remoteToString() { + throw new Error("Not implemented"); + } + + public void dump(UnicastConnection conn) { + try { + DataInputStream din = conn.getDataInputStream(); + for (;;) { + int b = din.readUnsignedByte(); + System.out.print(Integer.toHexString(b)); + if (b >= 32 && b < 128) { + System.out.print(": " + (char)b); + } + System.out.println(); + } + } + catch (IOException _) { + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastRemoteCall.java gcc-3.1/libjava/gnu/java/rmi/server/UnicastRemoteCall.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastRemoteCall.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/UnicastRemoteCall.java Thu Feb 14 23:16:02 2002 *************** *** 0 **** --- 1,375 ---- + /* UnicastRemoteCall.java + Copyright (c) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.lang.Exception; + import java.io.IOException; + import java.io.ObjectOutput; + import java.io.ObjectInput; + import java.io.StreamCorruptedException; + import java.rmi.server.RemoteCall; + import java.util.Vector; + + public class UnicastRemoteCall implements RemoteCall + { + + private UnicastConnection conn; + private Object result; + private Object object; + private int opnum; + private long hash; + private Vector vec; + private int ptr; + + /** + * Incoming call. + */ + UnicastRemoteCall(UnicastConnection conn) + { + this.conn = conn; + } + + /** + * Outgoing call. + */ + UnicastRemoteCall(Object obj, int opnum, long hash) + { + this.object = obj; + this.opnum = opnum; + this.hash = hash; + } + + public ObjectOutput getOutputStream() throws IOException + { + vec = new Vector(); + return new DummyObjectOutputStream(); + } + + public void releaseOutputStream() throws IOException + { + // Does nothing. + } + + public ObjectInput getInputStream() throws IOException + { + if (conn != null) + return conn.getObjectInputStream(); + ptr = 0; + return new DummyObjectInputStream(); + } + + public void releaseInputStream() throws IOException + { + // Does nothing. + } + + public ObjectOutput getResultStream(boolean success) + throws IOException, StreamCorruptedException + { + vec = new Vector(); + return new DummyObjectOutputStream(); + } + + public void executeCall() throws Exception + { + throw new Error("Not implemented"); + } + + public void done() throws IOException + { + /* Does nothing */ + } + + Object returnValue() + { + return vec.elementAt(0); + } + + Object[] getArguments() + { + return vec.toArray(); + } + + Object getObject() + { + return object; + } + + int getOpnum() + { + return opnum; + } + + long getHash() + { + return hash; + } + + void setReturnValue(Object obj) + { + vec.removeAllElements(); + vec.addElement(obj); + } + + /** + * Dummy object output class. + */ + private class DummyObjectOutputStream implements ObjectOutput + { + /** + * Non-private constructor to reduce bytecode emitted. + */ + DummyObjectOutputStream() + { + } + + public void writeBoolean(boolean v) throws IOException + { + vec.addElement(new Boolean(v)); + } + + public void writeByte(int v) throws IOException + { + vec.addElement(new Byte((byte) v)); + } + + public void writeChar(int v) throws IOException + { + vec.addElement(new Character((char) v)); + } + + public void writeDouble(double v) throws IOException + { + vec.addElement(new Double(v)); + } + + public void writeFloat(float v) throws IOException + { + vec.addElement(new Float(v)); + } + + public void writeInt(int v) throws IOException + { + vec.addElement(new Integer(v)); + } + + public void writeLong(long v) throws IOException + { + vec.addElement(new Long(v)); + } + + public void writeShort(int v) throws IOException + { + vec.addElement(new Short((short) v)); + } + + public void writeObject(Object obj) throws IOException + { + vec.addElement(obj); + } + + public void write(byte b[]) throws IOException + { + throw new IOException("not required"); + } + + public void write(byte b[], int off, int len) throws IOException + { + throw new IOException("not required"); + } + + public void write(int b) throws IOException + { + throw new IOException("not required"); + } + + public void writeBytes(String s) throws IOException + { + throw new IOException("not required"); + } + + public void writeChars(String s) throws IOException + { + throw new IOException("not required"); + } + + public void writeUTF(String str) throws IOException + { + throw new IOException("not required"); + } + + public void flush() throws IOException + { + } + + public void close() throws IOException + { + } + } // class DummyObjectOutputStream + + /** + * Dummy object input class. + */ + private class DummyObjectInputStream implements ObjectInput + { + /** + * Non-private constructor to reduce bytecode emitted. + */ + DummyObjectInputStream() + { + } + + public boolean readBoolean() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Boolean) obj).booleanValue(); + } + + public byte readByte() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Byte) obj).byteValue(); + } + + public char readChar() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Character) obj).charValue(); + } + + public double readDouble() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Double) obj).doubleValue(); + } + + public float readFloat() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Float) obj).floatValue(); + } + + public int readInt() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Integer) obj).intValue(); + } + + public long readLong() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Long) obj).longValue(); + } + + public short readShort() throws IOException + { + Object obj = vec.elementAt(ptr++); + return ((Short) obj).shortValue(); + } + + public Object readObject() throws IOException + { + return vec.elementAt(ptr++); + } + + public int read(byte b[]) throws IOException + { + throw new IOException("not required"); + } + + public int read(byte b[], int off, int len) throws IOException + { + throw new IOException("not required"); + } + + public int read() throws IOException + { + throw new IOException("not required"); + } + + public long skip(long n) throws IOException + { + throw new IOException("not required"); + } + + public int available() throws IOException + { + throw new IOException("not required"); + } + + public void readFully(byte b[]) throws IOException + { + throw new IOException("not required"); + } + + public void readFully(byte b[], int off, int len) throws IOException + { + throw new IOException("not required"); + } + + public String readLine() throws IOException + { + throw new IOException("not required"); + } + + public String readUTF() throws IOException + { + throw new IOException("not required"); + } + + public int readUnsignedByte() throws IOException + { + throw new IOException("not required"); + } + + public int readUnsignedShort() throws IOException + { + throw new IOException("not required"); + } + + public int skipBytes(int n) throws IOException + { + throw new IOException("not required"); + } + + public void close() throws IOException + { + } + } // class DummyObjectInputStream + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastRemoteStub.java gcc-3.1/libjava/gnu/java/rmi/server/UnicastRemoteStub.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastRemoteStub.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/UnicastRemoteStub.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,50 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.rmi.server.RemoteStub; + import java.rmi.server.RemoteRef; + + public class UnicastRemoteStub + extends RemoteStub { + + public static void setStubRef(RemoteStub stub, RemoteRef ref) { + setRef(stub, ref); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastServer.java gcc-3.1/libjava/gnu/java/rmi/server/UnicastServer.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastServer.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/UnicastServer.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,129 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.io.DataInputStream; + import java.io.DataOutputStream; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; + import java.io.IOException; + import java.net.InetAddress; + import java.util.Hashtable; + import java.net.UnknownHostException; + import java.rmi.server.ObjID; + import java.rmi.server.UnicastRemoteObject; + import java.rmi.server.UID; + import java.rmi.server.RemoteRef; + import java.rmi.RemoteException; + import java.rmi.NoSuchObjectException; + import gnu.java.rmi.dgc.DGCImpl; + + public class UnicastServer + implements ProtocolConstants { + + static private Hashtable objects = new Hashtable(); + static private DGCImpl dgc; + + public static void exportObject(UnicastServerRef obj) { + startDGC(); + objects.put(obj.objid, obj); + obj.manager.startServer(); + } + + private static synchronized void startDGC() { + if (dgc == null) { + try { + dgc = new DGCImpl(); + ((UnicastServerRef)dgc.getRef()).exportObject(dgc); + } + catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + public static void dispatch(UnicastConnection conn) throws Exception { + switch (conn.getDataInputStream().readUnsignedByte()) { + case MESSAGE_CALL: + incomingMessageCall(conn); + break; + default: + throw new Exception("bad method type"); + } + } + + private static void incomingMessageCall(UnicastConnection conn) throws IOException { + ObjectInputStream in = conn.getObjectInputStream(); + + ObjID objid = ObjID.read(in); + int method = in.readInt(); + long hash = in.readLong(); + + //System.out.println("ObjID: " + objid + ", method: " + method + ", hash: " + hash); + + // Use the objid to locate the relevant UnicastServerRef + UnicastServerRef uref = (UnicastServerRef)objects.get(objid); + Object returnval; + int returncode = RETURN_ACK; + if (uref != null) { + try { + // Dispatch the call to it. + returnval = uref.incomingMessageCall(conn, method, hash); + } + catch (Exception e) { + returnval = e; + returncode = RETURN_NACK; + } + } + else { + returnval = new NoSuchObjectException(""); + returncode = RETURN_NACK; + } + + conn.getDataOutputStream().writeByte(MESSAGE_CALL_ACK); + + ObjectOutputStream out = conn.getObjectOutputStream(); + + out.writeByte(returncode); + (new UID()).write(out); + out.writeObject(returnval); + + out.flush(); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastServerRef.java gcc-3.1/libjava/gnu/java/rmi/server/UnicastServerRef.java *** gcc-3.0.4/libjava/gnu/java/rmi/server/UnicastServerRef.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/rmi/server/UnicastServerRef.java Tue Jan 22 22:40:01 2002 *************** *** 0 **** --- 1,208 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.rmi.server; + + import java.net.ServerSocket; + import java.net.Socket; + import java.net.InetAddress; + import java.net.UnknownHostException; + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.rmi.server.RemoteStub; + import java.rmi.server.ObjID; + import java.rmi.server.ServerRef; + import java.rmi.server.RemoteRef; + import java.rmi.server.ServerNotActiveException; + import java.rmi.server.RMIClientSocketFactory; + import java.rmi.server.RMIServerSocketFactory; + import java.rmi.server.UID; + import java.rmi.server.Skeleton; + import java.rmi.server.RemoteCall; + import java.lang.reflect.Constructor; + import java.lang.reflect.Method; + import java.lang.reflect.InvocationTargetException; + import java.lang.Thread; + import java.lang.Exception; + import java.io.IOException; + import java.io.DataInputStream; + import java.io.DataOutputStream; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; + import java.util.Hashtable; + + public class UnicastServerRef + extends UnicastRef { + + final static private Class[] stubprototype = new Class[] { RemoteRef.class }; + + Remote myself; + private Skeleton skel; + private RemoteStub stub; + private Hashtable methods; + + public UnicastServerRef(ObjID id, int port, RMIServerSocketFactory ssf) { + super(id); + manager = UnicastConnectionManager.getInstance(port, ssf); + } + + public RemoteStub exportObject(Remote obj) throws RemoteException { + if (myself == null) { + myself = obj; + + // Find and install the stub + Class cls = obj.getClass(); + stub = (RemoteStub)getHelperClass(cls, "_Stub"); + if (stub == null) { + throw new RemoteException("failed to export: " + cls); + } + + // Find and install the skeleton (if there is one) + skel = (Skeleton)getHelperClass(cls, "_Skel"); + + // Build hash of methods which may be called. + buildMethodHash(obj.getClass()); + + // Export it. + UnicastServer.exportObject(this); + } + + return (stub); + } + + private Object getHelperClass(Class cls, String type) { + try { + String classname = cls.getName(); + Class scls = Class.forName(classname + type); + if (type.equals("_Stub")) { + try { + // JDK 1.2 stubs + Constructor con = scls.getConstructor(stubprototype); + return (con.newInstance(new Object[]{this})); + } + catch (NoSuchMethodException e) { + } + catch (InstantiationException e) { + } + catch (IllegalAccessException e) { + } + catch (IllegalArgumentException e) { + } + catch (InvocationTargetException e) { + } + // JDK 1.1 stubs + RemoteStub stub = (RemoteStub)scls.newInstance(); + UnicastRemoteStub.setStubRef(stub, this); + return (stub); + } + else { + // JDK 1.1 skel + return (scls.newInstance()); + } + } + catch (ClassNotFoundException e) { + } + catch (InstantiationException e) { + } + catch (IllegalAccessException e) { + } + return (null); + } + + public String getClientHost() throws ServerNotActiveException { + throw new Error("Not implemented"); + } + + private void buildMethodHash(Class cls) { + methods = new Hashtable(); + Method[] meths = cls.getMethods(); + for (int i = 0; i < meths.length; i++) { + /* Don't need to include any java.xxx related stuff */ + if (meths[i].getDeclaringClass().getName().startsWith("java.")) { + continue; + } + long hash = RMIHashes.getMethodHash(meths[i]); + methods.put(new Long (hash), meths[i]); + //System.out.println("meth = " + meths[i] + ", hash = " + hash); + } + } + + public Object incomingMessageCall(UnicastConnection conn, int method, long hash) throws Exception { + //System.out.println("method = " + method + ", hash = " + hash); + // If method is -1 then this is JDK 1.2 RMI - so use the hash + // to locate the method + if (method == -1) { + Method meth = (Method)methods.get(new Long (hash)); + //System.out.println("class = " + myself.getClass() + ", meth = " + meth); + if (meth == null) { + throw new NoSuchMethodException(); + } + + ObjectInputStream in = conn.getObjectInputStream(); + int nrargs = meth.getParameterTypes().length; + Object[] args = new Object[nrargs]; + for (int i = 0; i < nrargs; i++) { + /** + * For debugging purposes - we don't handle CodeBases + * quite right so we don't always find the stubs. This + * lets us know that. + */ + try { + args[i] = in.readObject(); + } + catch (Exception t) { + t.printStackTrace(); + throw t; + } + } + return (meth.invoke(myself, args)); + } + // Otherwise this is JDK 1.1 style RMI - we find the skeleton + // and invoke it using the method number. We wrap up our + // connection system in a UnicastRemoteCall so it appears in a + // way the Skeleton can handle. + else { + if (skel == null) { + throw new NoSuchMethodException(); + } + UnicastRemoteCall call = new UnicastRemoteCall(conn); + skel.dispatch(myself, call, method, hash); + return (call.returnValue()); + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/security/provider/DefaultPolicy.java gcc-3.1/libjava/gnu/java/security/provider/DefaultPolicy.java *** gcc-3.0.4/libjava/gnu/java/security/provider/DefaultPolicy.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/security/provider/DefaultPolicy.java Tue Jan 22 22:40:02 2002 *************** *** 0 **** --- 1,66 ---- + /* DefaultPolicy.java + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.security.provider; + + import java.security.*; + + /** + * This is just a stub policy implementation which grants all permissions + * to any code source. FIXME: This should be replaced with a real + * implementation that reads the policy configuration from a file, like + * $JAVA_HOME/jre/lib/security/java.security. + */ + public class DefaultPolicy extends Policy + { + static Permissions allPermissions = new Permissions(); + + static + { + allPermissions.add(new AllPermission()); + } + + public PermissionCollection getPermissions(CodeSource codesource) + { + return allPermissions; + } + + public void refresh() + { + // Nothing. + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/security/provider/Gnu.java gcc-3.1/libjava/gnu/java/security/provider/Gnu.java *** gcc-3.0.4/libjava/gnu/java/security/provider/Gnu.java Wed Jun 28 11:24:05 2000 --- gcc-3.1/libjava/gnu/java/security/provider/Gnu.java Tue Jan 22 22:40:02 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.security.provider; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.security.provider; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/security/provider/SHA.java gcc-3.1/libjava/gnu/java/security/provider/SHA.java *** gcc-3.0.4/libjava/gnu/java/security/provider/SHA.java Thu Jul 27 23:57:06 2000 --- gcc-3.1/libjava/gnu/java/security/provider/SHA.java Tue Jan 22 22:40:02 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.security.provider; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.security.provider; diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/security/provider/SHA1PRNG.java gcc-3.1/libjava/gnu/java/security/provider/SHA1PRNG.java *** gcc-3.0.4/libjava/gnu/java/security/provider/SHA1PRNG.java Wed Jun 28 11:24:05 2000 --- gcc-3.1/libjava/gnu/java/security/provider/SHA1PRNG.java Tue Jan 22 22:40:02 2002 *************** *** 1,5 **** /* SHA1PRNG.java --- Secure Random SPI SHA1PRNG ! Copyright (C) 1999 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* SHA1PRNG.java --- Secure Random SPI SHA1PRNG ! Copyright (C) 1999, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,40 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package gnu.java.security.provider; import java.util.Random; ! // import java.security.SecureRandomSpi; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.io.Serializable; ! // public class SHA1PRNG extends SecureRandomSpi implements Serializable ! public class SHA1PRNG implements Serializable { MessageDigest digest; byte seed[]; --- 18,50 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package gnu.java.security.provider; import java.util.Random; ! import java.security.SecureRandomSpi; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.io.Serializable; ! public class SHA1PRNG extends SecureRandomSpi implements Serializable { MessageDigest digest; byte seed[]; *************** public class SHA1PRNG implements Seriali *** 74,102 **** public void engineNextBytes(byte[] bytes) { ! if( bytes.length < (20 - datapos) ) { ! System.arraycopy( bytes, 0, data, datapos, bytes.length); ! datapos += bytes.length; ! return; ! } ! ! int i, blen = bytes.length, bpos = 0; ! byte digestdata[]; ! while( bpos < blen ) { ! i = 20 - datapos; ! System.arraycopy( bytes, bpos, data, datapos, i); ! bpos += i; ! datapos += i; ! if( datapos >= 20) { ! //System.out.println( (0 + 20) + "\n" + (20 + 20) ); ! System.arraycopy( seed, 0, data, 20, 20); ! digestdata = digest.digest( data ); ! System.arraycopy( digestdata, 0, data, 0, 20); ! datapos = 0; } - } - } public byte[] engineGenerateSeed(int numBytes) --- 84,109 ---- public void engineNextBytes(byte[] bytes) { + int loc = 0; + while (loc < bytes.length) + { + int copy = Math.min (bytes.length - loc, 20 - datapos); ! if (copy > 0) ! { ! System.arraycopy (data, datapos, bytes, loc, copy); ! datapos += copy; ! loc += copy; ! } ! else ! { ! // No data ready for copying, so refill our buffer. ! System.arraycopy( seed, 0, data, 20, 20); ! byte[] digestdata = digest.digest( data ); ! System.arraycopy( digestdata, 0, data, 0, 20); ! datapos = 0; ! } } } public byte[] engineGenerateSeed(int numBytes) diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/text/BaseBreakIterator.java gcc-3.1/libjava/gnu/java/text/BaseBreakIterator.java *** gcc-3.0.4/libjava/gnu/java/text/BaseBreakIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/text/BaseBreakIterator.java Tue Jan 22 22:40:02 2002 *************** *** 0 **** --- 1,112 ---- + /* BaseBreakIterator.java -- Base class for default BreakIterators + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.text; + + import java.text.BreakIterator; + import java.text.CharacterIterator; + + /** + * @author Tom Tromey + * @date March 22, 1999 + */ + + public abstract class BaseBreakIterator extends BreakIterator + { + public int current () + { + return iter.getIndex(); + } + + public int first () + { + iter.first(); + return iter.getBeginIndex(); + } + + public int following (int pos) + { + int save = iter.getIndex(); + iter.setIndex(pos); + int r = next (); + iter.setIndex(save); + return r; + } + + public CharacterIterator getText () + { + return iter; + } + + public int last () + { + iter.last(); + // Go past the last character. + iter.next(); + return iter.getEndIndex(); + } + + public int next (int n) + { + int r = iter.getIndex (); + if (n > 0) + { + while (n > 0 && r != DONE) + { + r = next (); + --n; + } + } + else if (n < 0) + { + while (n < 0 && r != DONE) + { + r = previous (); + ++n; + } + } + return r; + } + + public void setText (CharacterIterator newText) + { + iter = newText; + } + + protected CharacterIterator iter; + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/text/CharacterBreakIterator.java gcc-3.1/libjava/gnu/java/text/CharacterBreakIterator.java *** gcc-3.0.4/libjava/gnu/java/text/CharacterBreakIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/text/CharacterBreakIterator.java Tue Jan 22 22:40:02 2002 *************** *** 0 **** --- 1,216 ---- + /* CharacterBreakIterator.java - Default character BreakIterator. + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.text; + + import java.text.BreakIterator; + import java.text.CharacterIterator; + + /** + * @author Tom Tromey + * @date March 19, 1999 + * Written using The Unicode Standard, Version 2.0. + */ + + public class CharacterBreakIterator extends BaseBreakIterator + { + // Hangul Jamo constants from Unicode book. + private static final int LBase = 0x1100; + private static final int VBase = 0x1161; + private static final int TBase = 0x11a7; + private static final int LCount = 19; + private static final int VCount = 21; + private static final int TCount = 28; + + // Information about surrogates. + private static final int highSurrogateStart = 0xD800; + private static final int highSurrogateEnd = 0xDBFF; + private static final int lowSurrogateStart = 0xDC00; + private static final int lowSurrogateEnd = 0xDFFF; + + public Object clone () + { + return new CharacterBreakIterator (this); + } + + public CharacterBreakIterator () + { + iter = null; // FIXME? + } + + private CharacterBreakIterator (CharacterBreakIterator other) + { + iter = (CharacterIterator) other.iter.clone(); + } + + // Some methods to tell us different properties of characters. + private final boolean isL (char c) + { + return c >= LBase && c <= LBase + LCount; + } + private final boolean isV (char c) + { + return c >= VBase && c <= VBase + VCount; + } + private final boolean isT (char c) + { + return c >= TBase && c <= TBase + TCount; + } + private final boolean isLVT (char c) + { + return isL (c) || isV (c) || isT (c); + } + private final boolean isHighSurrogate (char c) + { + return c >= highSurrogateStart && c <= highSurrogateEnd; + } + private final boolean isLowSurrogate (char c) + { + return c >= lowSurrogateStart && c <= lowSurrogateEnd; + } + + public int next () + { + int end = iter.getEndIndex(); + if (iter.getIndex() == end) + return DONE; + + char c; + for (char prev = CharacterIterator.DONE; iter.getIndex() < end; prev = c) + { + c = iter.next(); + if (c == CharacterIterator.DONE) + break; + int type = Character.getType(c); + + // Break after paragraph separators. + if (type == Character.PARAGRAPH_SEPARATOR) + break; + + // Now we need some lookahead. + char ahead = iter.next(); + iter.previous(); + if (ahead == CharacterIterator.DONE) + break; + int aheadType = Character.getType(ahead); + + if (aheadType != Character.NON_SPACING_MARK + && ! isLowSurrogate (ahead) + && ! isLVT (ahead)) + break; + if (! isLVT (c) && isLVT (ahead)) + break; + if (isL (c) && ! isLVT (ahead) + && aheadType != Character.NON_SPACING_MARK) + break; + if (isV (c) && ! isV (ahead) && !isT (ahead) + && aheadType != Character.NON_SPACING_MARK) + break; + if (isT (c) && ! isT (ahead) + && aheadType != Character.NON_SPACING_MARK) + break; + + if (! isHighSurrogate (c) && isLowSurrogate (ahead)) + break; + if (isHighSurrogate (c) && ! isLowSurrogate (ahead)) + break; + if (! isHighSurrogate (prev) && isLowSurrogate (c)) + break; + } + + return iter.getIndex(); + } + + public int previous () + { + if (iter.getIndex() == iter.getBeginIndex()) + return DONE; + + int start = iter.getBeginIndex(); + while (iter.getIndex() >= iter.getBeginIndex()) + { + char c = iter.previous(); + if (c == CharacterIterator.DONE) + break; + int type = Character.getType(c); + + if (type != Character.NON_SPACING_MARK + && ! isLowSurrogate (c) + && ! isLVT (c)) + break; + + // Now we need some lookahead. + char ahead = iter.previous(); + if (ahead == CharacterIterator.DONE) + { + iter.next(); + break; + } + char ahead2 = iter.previous(); + iter.next(); + iter.next(); + if (ahead2 == CharacterIterator.DONE) + break; + int aheadType = Character.getType(ahead); + + if (aheadType == Character.PARAGRAPH_SEPARATOR) + break; + + if (isLVT (c) && ! isLVT (ahead)) + break; + if (! isLVT (c) && type != Character.NON_SPACING_MARK + && isL (ahead)) + break; + if (! isV (c) && ! isT (c) && type != Character.NON_SPACING_MARK + && isV (ahead)) + break; + if (! isT (c) && type != Character.NON_SPACING_MARK + && isT (ahead)) + break; + + if (isLowSurrogate (c) && ! isHighSurrogate (ahead)) + break; + if (! isLowSurrogate (c) && isHighSurrogate (ahead)) + break; + if (isLowSurrogate (ahead) && ! isHighSurrogate (ahead2)) + break; + } + + return iter.getIndex(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/text/LineBreakIterator.java gcc-3.1/libjava/gnu/java/text/LineBreakIterator.java *** gcc-3.0.4/libjava/gnu/java/text/LineBreakIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/text/LineBreakIterator.java Tue Jan 22 22:40:02 2002 *************** *** 0 **** --- 1,196 ---- + /* LineBreakIterator.java - Default word BreakIterator. + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.text; + + import java.text.BreakIterator; + import java.text.CharacterIterator; + + /** + * @author Tom Tromey + * @date March 22, 1999 + * Written using The Unicode Standard, Version 2.0. + */ + + public class LineBreakIterator extends BaseBreakIterator + { + public Object clone () + { + return new LineBreakIterator (this); + } + + public LineBreakIterator () + { + iter = null; + } + + private LineBreakIterator (LineBreakIterator other) + { + iter = (CharacterIterator) other.iter.clone(); + } + + // Some methods to tell us different properties of characters. + private final boolean isNb (char c) + { + return (c == 0x00a0 // NO-BREAK SPACE + || c == 0x2011 // NON-BREAKING HYPHEN + || c == 0xfeff); // ZERO WITH NO-BREAK SPACE + } + private final boolean isClose (int type) + { + return (type == Character.END_PUNCTUATION + // Unicode book says "comma, period, ...", which I take to + // mean "Po" class. + || type == Character.OTHER_PUNCTUATION); + } + private final boolean isIdeo (char c) + { + return (c >= 0x3040 && c <= 0x309f // Hiragana + || c >= 0x30a0 && c <= 0x30ff // Katakana + || c >= 0x4e00 && c <= 0x9fff // Han + || c >= 0x3100 && c <= 0x312f); // Bopomofo + } + + public int next () + { + int end = iter.getEndIndex(); + if (iter.getIndex() == end) + return DONE; + + while (iter.getIndex() < end) + { + char c = iter.current(); + int type = Character.getType(c); + + char n = iter.next(); + + if (n == CharacterIterator.DONE + || type == Character.PARAGRAPH_SEPARATOR + || type == Character.LINE_SEPARATOR) + break; + + // Handle two cases where we must scan for non-spacing marks. + int start = iter.getIndex(); + if (type == Character.SPACE_SEPARATOR + || type == Character.START_PUNCTUATION + || isIdeo (c)) + { + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.NON_SPACING_MARK) + n = iter.next(); + if (n == CharacterIterator.DONE) + break; + + if (type == Character.SPACE_SEPARATOR) + { + int nt = Character.getType(n); + if (nt != Character.NON_SPACING_MARK + && nt != Character.SPACE_SEPARATOR + && ! isNb (n)) + break; + } + else if (type == Character.START_PUNCTUATION) + { + if (isIdeo (n)) + { + // Open punctuation followed by non spacing marks + // and then ideograph does not have a break in + // it. So skip all this. + start = iter.getIndex(); + } + } + else + { + // Ideograph preceded this character. + if (isClose (Character.getType(n))) + break; + } + } + iter.setIndex(start); + } + + return iter.getIndex(); + } + + public int previous () + { + int start = iter.getBeginIndex(); + if (iter.getIndex() == start) + return DONE; + + while (iter.getIndex() >= start) + { + char c = iter.previous(); + if (c == CharacterIterator.DONE) + break; + int type = Character.getType(c); + + char n = iter.previous(); + if (n == CharacterIterator.DONE) + break; + iter.next(); + + int nt = Character.getType(n); + // Break after paragraph separators. + if (nt == Character.PARAGRAPH_SEPARATOR + || nt == Character.LINE_SEPARATOR) + break; + + // Skip non-spacing marks. + int init = iter.getIndex(); + while (n != CharacterIterator.DONE && nt == Character.NON_SPACING_MARK) + { + n = iter.previous(); + nt = Character.getType(n); + } + + if (nt == Character.SPACE_SEPARATOR + && type != Character.SPACE_SEPARATOR + && type != Character.NON_SPACING_MARK + && ! isNb (c)) + break; + if (! isClose (type) && isIdeo (n)) + break; + if (isIdeo (c) && nt != Character.START_PUNCTUATION) + break; + iter.setIndex(init); + } + + return iter.getIndex(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/text/SentenceBreakIterator.java gcc-3.1/libjava/gnu/java/text/SentenceBreakIterator.java *** gcc-3.0.4/libjava/gnu/java/text/SentenceBreakIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/text/SentenceBreakIterator.java Tue Jan 22 22:40:02 2002 *************** *** 0 **** --- 1,254 ---- + /* SentenceBreakIterator.java - Default sentence BreakIterator. + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.text; + + import java.text.BreakIterator; + import java.text.CharacterIterator; + + /** + * @author Tom Tromey + * @date March 23, 1999 + * Written using The Unicode Standard, Version 2.0. + */ + + public class SentenceBreakIterator extends BaseBreakIterator + { + public Object clone () + { + return new SentenceBreakIterator (this); + } + + public SentenceBreakIterator () + { + iter = null; + } + + private SentenceBreakIterator (SentenceBreakIterator other) + { + iter = (CharacterIterator) other.iter.clone(); + } + + public int next () + { + int end = iter.getEndIndex(); + if (iter.getIndex() == end) + return DONE; + + while (iter.getIndex() < end) + { + char c = iter.current(); + if (c == CharacterIterator.DONE) + break; + int type = Character.getType(c); + + char n = iter.next(); + if (n == CharacterIterator.DONE) + break; + + // Always break after paragraph separator. + if (type == Character.PARAGRAPH_SEPARATOR) + break; + + if (c == '!' || c == '?') + { + // Skip close punctuation. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.END_PUNCTUATION) + n = iter.next(); + // Skip spaces. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.SPACE_SEPARATOR) + n = iter.next(); + // Skip optional paragraph separator. + if (n != CharacterIterator.DONE + && Character.getType(n) == Character.PARAGRAPH_SEPARATOR) + n = iter.next(); + + // There's always a break somewhere after `!' or `?'. + break; + } + + if (c == '.') + { + int save = iter.getIndex(); + // Skip close punctuation. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.END_PUNCTUATION) + n = iter.next(); + // Skip spaces. We keep count because we need at least + // one for this period to represent a terminator. + int spcount = 0; + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.SPACE_SEPARATOR) + { + n = iter.next(); + ++spcount; + } + if (spcount > 0) + { + int save2 = iter.getIndex(); + // Skip over open puncutation. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.START_PUNCTUATION) + n = iter.next(); + // Next character must not be lower case. + if (n == CharacterIterator.DONE + || ! Character.isLowerCase(n)) + { + iter.setIndex(save2); + break; + } + } + iter.setIndex(save); + } + } + + return iter.getIndex(); + } + + private final int previous_internal () + { + int start = iter.getBeginIndex(); + if (iter.getIndex() == start) + return DONE; + + while (iter.getIndex() >= start) + { + char c = iter.previous(); + if (c == CharacterIterator.DONE) + break; + + char n = iter.previous(); + if (n == CharacterIterator.DONE) + break; + iter.next(); + int nt = Character.getType(n); + + if (! Character.isLowerCase(c) + && (nt == Character.START_PUNCTUATION + || nt == Character.SPACE_SEPARATOR)) + { + int save = iter.getIndex(); + int save_nt = nt; + char save_n = n; + // Skip open punctuation. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.START_PUNCTUATION) + n = iter.previous(); + if (n == CharacterIterator.DONE) + break; + if (Character.getType(n) == Character.SPACE_SEPARATOR) + { + // Must have at least once space after the `.'. + int save2 = iter.getIndex(); + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.SPACE_SEPARATOR) + n = iter.previous(); + // Skip close punctuation. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.END_PUNCTUATION) + n = iter.previous(); + if (n == CharacterIterator.DONE || n == '.') + { + // Communicate location of actual end. + period = iter.getIndex(); + iter.setIndex(save2); + break; + } + } + iter.setIndex(save); + nt = save_nt; + n = save_n; + } + + if (nt == Character.PARAGRAPH_SEPARATOR) + { + // Communicate location of actual end. + period = iter.getIndex(); + break; + } + else if (nt == Character.SPACE_SEPARATOR + || nt == Character.END_PUNCTUATION) + { + int save = iter.getIndex(); + // Skip spaces. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.SPACE_SEPARATOR) + n = iter.previous(); + // Skip close punctuation. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.END_PUNCTUATION) + n = iter.previous(); + int here = iter.getIndex(); + iter.setIndex(save); + if (n == CharacterIterator.DONE || n == '!' || n == '?') + { + // Communicate location of actual end. + period = here; + break; + } + } + else if (n == '!' || n == '?') + { + // Communicate location of actual end. + period = iter.getIndex(); + break; + } + } + + return iter.getIndex(); + } + + public int previous () + { + // We want to skip over the first sentence end to the second one. + // However, at the end of the string we want the first end. + int here = iter.getIndex(); + period = here; + int first = previous_internal (); + if (here == iter.getEndIndex() || first == DONE) + return first; + iter.setIndex(period); + return previous_internal (); + } + + // This is used for communication between previous and + // previous_internal. + private int period; + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/text/WordBreakIterator.java gcc-3.1/libjava/gnu/java/text/WordBreakIterator.java *** gcc-3.0.4/libjava/gnu/java/text/WordBreakIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/text/WordBreakIterator.java Tue Jan 22 22:40:02 2002 *************** *** 0 **** --- 1,252 ---- + /* WordBreakIterator.java - Default word BreakIterator. + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package gnu.java.text; + + import java.text.BreakIterator; + import java.text.CharacterIterator; + + /** + * @author Tom Tromey + * @date March 22, 1999 + * Written using The Unicode Standard, Version 2.0. + */ + + public class WordBreakIterator extends BaseBreakIterator + { + public Object clone () + { + return new WordBreakIterator (this); + } + + public WordBreakIterator () + { + iter = null; + } + + private WordBreakIterator (WordBreakIterator other) + { + iter = (CharacterIterator) other.iter.clone(); + } + + // Some methods to tell us different properties of characters. + private final boolean isHira (char c) + { + return c >= 0x3040 && c <= 0x309f; + } + private final boolean isKata (char c) + { + return c >= 0x30a0 && c <= 0x30ff; + } + private final boolean isHan (char c) + { + return c >= 0x4e00 && c <= 0x9fff; + } + + public int next () + { + int end = iter.getEndIndex(); + if (iter.getIndex() == end) + return DONE; + + while (iter.getIndex() < end) + { + char c = iter.current(); + if (c == CharacterIterator.DONE) + break; + int type = Character.getType(c); + + char n = iter.next(); + if (n == CharacterIterator.DONE) + break; + + // Break after paragraph separators. + if (type == Character.PARAGRAPH_SEPARATOR + || type == Character.LINE_SEPARATOR) + break; + + // Break between letters and non-letters. + // FIXME: we treat apostrophe as part of a word. This + // is an English-ism. + boolean is_letter = Character.isLetter(c); + if (c != '\'' && ! is_letter && type != Character.NON_SPACING_MARK + && Character.isLetter(n)) + break; + + // Always break after certain symbols, such as punctuation. + // This heuristic is derived from hints in the JCL book and is + // not part of Unicode. It seems to be right, however. + // FIXME: we treat apostrophe as part of a word. This + // is an English-ism. + if (c != '\'' + && (type == Character.DASH_PUNCTUATION + || type == Character.START_PUNCTUATION + || type == Character.END_PUNCTUATION + || type == Character.CONNECTOR_PUNCTUATION + || type == Character.OTHER_PUNCTUATION + || type == Character.MATH_SYMBOL + || type == Character.CURRENCY_SYMBOL + || type == Character.MODIFIER_SYMBOL + || type == Character.OTHER_SYMBOL + || type == Character.FORMAT + || type == Character.CONTROL)) + break; + + boolean is_hira = isHira (c); + boolean is_kata = isKata (c); + boolean is_han = isHan (c); + + // Special case Japanese. + if (! is_hira && ! is_kata && ! is_han + && type != Character.NON_SPACING_MARK + && (isHira (n) || isKata (n) || isHan (n))) + break; + + if (is_hira || is_kata || is_han || is_letter) + { + // Now we need to do some lookahead. We might need to do + // quite a bit of lookahead, so we save our position and + // restore it later. + int save = iter.getIndex(); + // Skip string of non spacing marks. + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.NON_SPACING_MARK) + n = iter.next(); + if (n == CharacterIterator.DONE) + break; + if ((is_hira && ! isHira (n)) + || (is_kata && ! isHira (n) && ! isKata (n)) + || (is_han && ! isHira (n) && ! isHan (n)) + // FIXME: we treat apostrophe as part of a word. This + // is an English-ism. + || (is_letter && ! Character.isLetter(n) && n != '\'')) + break; + iter.setIndex(save); + } + } + + return iter.getIndex(); + } + + public int previous () + { + int start = iter.getBeginIndex(); + if (iter.getIndex() == start) + return DONE; + + while (iter.getIndex() >= start) + { + char c = iter.previous(); + if (c == CharacterIterator.DONE) + break; + + boolean is_hira = isHira (c); + boolean is_kata = isKata (c); + boolean is_han = isHan (c); + boolean is_letter = Character.isLetter(c); + + char n = iter.previous(); + if (n == CharacterIterator.DONE) + break; + iter.next(); + int type = Character.getType(n); + // Break after paragraph separators. + if (type == Character.PARAGRAPH_SEPARATOR + || type == Character.LINE_SEPARATOR) + break; + + // Break between letters and non-letters. + // FIXME: we treat apostrophe as part of a word. This + // is an English-ism. + if (n != '\'' && ! Character.isLetter(n) + && type != Character.NON_SPACING_MARK + && is_letter) + break; + + // Always break after certain symbols, such as punctuation. + // This heuristic is derived from hints in the JCL book and is + // not part of Unicode. It seems to be right, however. + // FIXME: we treat apostrophe as part of a word. This + // is an English-ism. + if (n != '\'' + && (type == Character.DASH_PUNCTUATION + || type == Character.START_PUNCTUATION + || type == Character.END_PUNCTUATION + || type == Character.CONNECTOR_PUNCTUATION + || type == Character.OTHER_PUNCTUATION + || type == Character.MATH_SYMBOL + || type == Character.CURRENCY_SYMBOL + || type == Character.MODIFIER_SYMBOL + || type == Character.OTHER_SYMBOL + || type == Character.FORMAT + || type == Character.CONTROL)) + break; + + // Special case Japanese. + if ((is_hira || is_kata || is_han) + && ! isHira (n) && ! isKata (n) && ! isHan (n) + && type != Character.NON_SPACING_MARK) + break; + + // We might have to skip over non spacing marks to see what's + // on the other side. + if (! is_hira || (! is_letter && c != '\'')) + { + int save = iter.getIndex(); + while (n != CharacterIterator.DONE + && Character.getType(n) == Character.NON_SPACING_MARK) + n = iter.previous(); + iter.setIndex(save); + // This is a strange case: a bunch of non-spacing marks at + // the beginning. We treat the current location as a word + // break. + if (n == CharacterIterator.DONE) + break; + if ((isHira (n) && ! is_hira) + || (isKata (n) && ! is_hira && ! is_kata) + || (isHan (n) && ! is_hira && ! is_han) + // FIXME: we treat apostrophe as part of a word. This + // is an English-ism. + || (! is_letter && c != '\'' && Character.isLetter(n))) + break; + } + } + + return iter.getIndex(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/gnu/java/util/DoubleEnumeration.java gcc-3.1/libjava/gnu/java/util/DoubleEnumeration.java *** gcc-3.0.4/libjava/gnu/java/util/DoubleEnumeration.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/gnu/java/util/DoubleEnumeration.java Tue Jan 22 22:40:03 2002 *************** *** 0 **** --- 1,139 ---- + /* gnu.java.util.DoubleEnumeration + Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package gnu.java.util; + + import java.io.*; + import java.util.Enumeration; + import java.util.NoSuchElementException; + + + /** + * This is a helper class that combines two Enumerations. + * It returns the elements of the first Enumeration until it has + * no more elements and then returns the elements of the second + * Enumeration.
    + * + * In the default case: + *

    +  * doubleEnum = new DoubleEnumeration(enum1, enum2);
    +  * while (doubleEnum.hasMoreElements()) {
    +  *    Object o = doubleEnum.nextElement();
    +  *    do_something(o);
    +  * }
    +  * 
    + * it calls hasMoreElements of the Enumerations as few times as + * possible. + * The references to the Enumerations are cleared as soon as they have no + * more elements to help garbage collecting. + * + * @author Jochen Hoenicke + * @author Mark Wielaard (mark@klomp.org) + */ + public class DoubleEnumeration implements Enumeration + { + /** + * This is true as long as one of the enumerations has more + * elements. + * Only valid when hasChecked is true. + * Set in hasMoreElements() + */ + private boolean hasMore; + /** + * This is true, if it is sure that hasMore indicates wether there are + * more elements. + * Set to true in hasMoreElements(). + * Set to false in getNextElement(). + */ + private boolean hasChecked; + /** + * The first enumeration. + */ + private Enumeration e1; + /** + * The second enumeration. + */ + private Enumeration e2; + + /** + * Creates a new Enumeration combining the given two enumerations. + * The enumerations mustn't be accessed by other classes. + */ + public DoubleEnumeration(Enumeration e1, Enumeration e2) + { + this.e1 = e1; + this.e2 = e2; + hasChecked = false; + } + + /** + * Returns true, if at least one of the two enumerations has more + * elements. + */ + public boolean hasMoreElements() + { + if (hasChecked) + return hasMore; + + hasMore = (e1 != null && e1.hasMoreElements()); + + if (!hasMore) { + e1 = e2; + e2 = null; + hasMore = (e1 != null && e1.hasMoreElements()); + } + + hasChecked = true; + return hasMore; + } + + /** + * Returns the next element. This returns the next element of the + * first enumeration, if it has more elements, otherwise the next + * element of the second enumeration. If both enumeration don't have + * any elements it throws a NoSuchElementException. + */ + public Object nextElement() + { + if (!hasMoreElements()) + throw new NoSuchElementException(); + else { + hasChecked = false; + return e1.nextElement(); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/include/Makefile.in gcc-3.1/libjava/include/Makefile.in *** gcc-3.0.4/libjava/include/Makefile.in Wed Jul 18 16:56:42 2001 --- gcc-3.1/libjava/include/Makefile.in Wed Apr 10 13:10:15 2002 *************** *** 1,6 **** ! # Makefile.in generated automatically by automake 1.4 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. --- 1,6 ---- ! # Makefile.in generated automatically by automake 1.4-p5 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. *************** AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ *** 67,72 **** --- 67,73 ---- AR = @AR@ AS = @AS@ CC = @CC@ + CHECKREFSPEC = @CHECKREFSPEC@ COMPPATH = @COMPPATH@ CXX = @CXX@ CXXCPP = @CXXCPP@ *************** GCLIBS = @GCLIBS@ *** 85,94 **** GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! ICONV_LDFLAGS = @ICONV_LDFLAGS@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBDATASTARTSPEC = @LIBDATASTARTSPEC@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ --- 86,96 ---- GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! HASH_SYNC_SPEC = @HASH_SYNC_SPEC@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBFFI = @LIBFFI@ ! LIBFFIINCS = @LIBFFIINCS@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ *************** OBJDUMP = @OBJDUMP@ *** 104,141 **** OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ - ZDEPS = @ZDEPS@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ AUTOMAKE_OPTIONS = foreign include_HEADERS = jni.h jvmpi.h ! CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = HEADERS = $(include_HEADERS) ! DIST_COMMON = ./stamp-h.in Makefile.am Makefile.in config.h.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: --- 106,148 ---- OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ + PLATFORMOBJS = @PLATFORMOBJS@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ + SYS_ZLIBS = @SYS_ZLIBS@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ + THREADLDFLAGS = @THREADLDFLAGS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ + gcc_version = @gcc_version@ + glibjava_CXX = @glibjava_CXX@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ + tool_include_dir = @tool_include_dir@ AUTOMAKE_OPTIONS = foreign include_HEADERS = jni.h jvmpi.h ! CONFIG_HEADER = config.h ../gcj/libgcj-config.h CONFIG_CLEAN_FILES = HEADERS = $(include_HEADERS) ! DIST_COMMON = ./stamp-h1.in Makefile.am Makefile.in config.h.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = gtar GZIP_ENV = --best all: all-redirect .SUFFIXES: *************** Makefile: $(srcdir)/Makefile.in $(top_b *** 147,170 **** && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status ! config.h: stamp-h @if test ! -f $@; then \ ! rm -f stamp-h; \ ! $(MAKE) stamp-h; \ else :; fi ! stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=include/config.h \ $(SHELL) ./config.status ! @echo timestamp > stamp-h 2> /dev/null ! $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h.in @if test ! -f $@; then \ ! rm -f $(srcdir)/stamp-h.in; \ ! $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi ! $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOHEADER) ! @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: --- 154,177 ---- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status ! config.h: stamp-h1 @if test ! -f $@; then \ ! rm -f stamp-h1; \ ! $(MAKE) stamp-h1; \ else :; fi ! stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=include/config.h \ $(SHELL) ./config.status ! @echo timestamp > stamp-h1 2> /dev/null ! $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h1.in @if test ! -f $@; then \ ! rm -f $(srcdir)/stamp-h1.in; \ ! $(MAKE) $(srcdir)/stamp-h1.in; \ else :; fi ! $(srcdir)/stamp-h1.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOHEADER) ! @echo timestamp > $(srcdir)/stamp-h1.in 2> /dev/null mostlyclean-hdr: *************** distdir: $(DISTFILES) *** 232,238 **** @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ --- 239,245 ---- @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ diff -Nrc3pad gcc-3.0.4/libjava/include/boehm-gc.h gcc-3.1/libjava/include/boehm-gc.h *** gcc-3.0.4/libjava/include/boehm-gc.h Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/include/boehm-gc.h Thu Oct 25 17:29:41 2001 *************** extern "C" *** 21,24 **** --- 21,71 ---- JV_MARKARRAY_DECL; }; + // Enough stuff to inline _Jv_AllocObj. Ugly. + #include + #include + #include + + extern "C" void * GC_gcj_malloc(size_t, void *); + extern "C" void * GC_malloc_atomic(size_t); + #ifdef THREAD_LOCAL_ALLOC + extern "C" void * GC_local_gcj_malloc(size_t, void *); + extern "C" void * GC_local_malloc_atomic(size_t); + #endif + + inline void * + _Jv_AllocObj (jsize size, jclass klass) + { + // This should call GC_GCJ_MALLOC, but that would involve + // including gc.h. + #ifdef THREAD_LOCAL_ALLOC + return GC_local_gcj_malloc (size, klass->vtable); + #else + return GC_gcj_malloc (size, klass->vtable); + #endif + } + + inline void * + _Jv_AllocPtrFreeObj (jsize size, jclass klass) + { + #ifdef JV_HASH_SYNCHRONIZATION + # ifdef THREAD_LOCAL_ALLOC + void * obj = GC_local_malloc_atomic(size); + # else + void * obj = GC_malloc_atomic(size); + # endif + *((_Jv_VTable **) obj) = klass->vtable; + #else + # ifdef THREAD_LOCAL_ALLOC + void * obj = GC_local_gcj_malloc(size, klass->vtable); + # else + void * obj = GC_gcj_malloc(size, klass->vtable); + # endif + #endif + return obj; + } + + // _Jv_AllocBytes (jsize size) should go here, too. But clients don't + // usually include this header. + #endif /* __JV_BOEHM_GC__ */ diff -Nrc3pad gcc-3.0.4/libjava/include/config.h.in gcc-3.1/libjava/include/config.h.in *** gcc-3.0.4/libjava/include/config.h.in Wed Aug 1 17:49:20 2001 --- gcc-3.1/libjava/include/config.h.in Mon Mar 18 06:30:26 2002 *************** *** 13,18 **** --- 13,28 ---- /* Define if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H + /* Define if you have that is POSIX.1 compatible. */ + #undef HAVE_SYS_WAIT_H + + /* Define if your struct tm has tm_zone. */ + #undef HAVE_TM_ZONE + + /* Define if you don't have tm_zone but do have the external array + tzname. */ + #undef HAVE_TZNAME + /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. *************** *** 25,30 **** --- 35,43 ---- /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS + /* Define if your declares struct tm. */ + #undef TM_IN_SYS_TIME + /* Define if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING *************** *** 34,42 **** /* Define if using POSIX threads that have the mutexattr functions. */ #undef HAVE_PTHREAD_MUTEXATTR_INIT - /* Define this if you prefer size over speed for java.lang.Character. */ - #undef COMPACT_CHARACTER - /* Define if you have memcpy. */ #undef HAVE_MEMCPY --- 47,52 ---- *************** *** 107,114 **** /* Define if global `timezone' exists. */ #undef HAVE_TIMEZONE ! /* Define to version of GCJ in use. */ ! #undef GCJVERSION /* Define if you have the appropriate function. */ #undef HAVE_ACCESS --- 117,125 ---- /* Define if global `timezone' exists. */ #undef HAVE_TIMEZONE ! /* Define if if the synchronization code should try to avoid pthread_self ! calls by caching thread IDs in a hashtable. */ ! #undef SLOW_PTHREAD_SELF /* Define if you have the appropriate function. */ #undef HAVE_ACCESS *************** *** 134,143 **** --- 145,160 ---- /* Define if java.net native functions should be stubbed out. */ #undef DISABLE_JAVA_NET + /* Define if we're to use libffi. */ + #undef USE_LIBFFI + /* Define if system properties shouldn't be read from getenv("GCJ_PROPERTIES"). */ #undef DISABLE_GETENV_PROPERTIES + /* Define if we should ignore arguments to main(). */ + #undef DISABLE_MAIN_ARGS + /* Define if you have /proc/self/exe */ #undef HAVE_PROC_SELF_EXE *************** *** 145,151 **** /* Define if you have dladdr() */ #undef HAVE_DLADDR - /* Define if getuid() and friends are missing. */ #undef NO_GETUID --- 162,167 ---- *************** *** 158,166 **** /* Define if you are using JVMPI. */ #undef ENABLE_JVMPI - /* The number of bytes in a void *. */ - #undef SIZEOF_VOID_P - /* Define if you have the access function. */ #undef HAVE_ACCESS --- 174,179 ---- *************** *** 239,244 **** --- 252,260 ---- /* Define if you have the open function. */ #undef HAVE_OPEN + /* Define if you have the opendir function. */ + #undef HAVE_OPENDIR + /* Define if you have the pipe function. */ #undef HAVE_PIPE *************** *** 269,274 **** --- 285,293 ---- /* Define if you have the setlocale function. */ #undef HAVE_SETLOCALE + /* Define if you have the sigaction function. */ + #undef HAVE_SIGACTION + /* Define if you have the sleep function. */ #undef HAVE_SLEEP *************** *** 371,385 **** --- 390,425 ---- /* Required define if using POSIX threads */ #undef _POSIX_PTHREAD_SEMANTICS + /* Define if hash synchronization is in use */ + #undef JV_HASH_SYNCHRONIZATION + /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST + /* Define if your file defines LC_MESSAGES. */ + #undef HAVE_LC_MESSAGES + /* Required define if using POSIX threads */ #undef _REENTRANT /* Define if struct hostent_data is defined in netdb.h */ #undef HAVE_STRUCT_HOSTENT_DATA + /* Define if dlopen is available */ + #undef HAVE_DLOPEN + + /* The number of bytes in type void * */ + #undef SIZEOF_VOID_P + + /* Short GCJ version */ + #undef GCJVERSION + + /* Define if is available */ + #undef HAVE_INTTYPES_H + + /* Define if is available */ + #undef JV_HAVE_INTTYPES_H + diff -Nrc3pad gcc-3.0.4/libjava/include/dwarf2-signal.h gcc-3.1/libjava/include/dwarf2-signal.h *** gcc-3.0.4/libjava/include/dwarf2-signal.h Tue May 29 16:28:21 2001 --- gcc-3.1/libjava/include/dwarf2-signal.h Thu May 2 20:15:45 2002 *************** details. */ *** 21,27 **** #undef HANDLE_FPE #define SIGNAL_HANDLER(_name) \ ! static void _Jv_##_name (int, siginfo_t *, void *_p) class java::lang::Throwable; --- 21,27 ---- #undef HANDLE_FPE #define SIGNAL_HANDLER(_name) \ ! static void _Jv_##_name (int, siginfo_t *_sip, void *_p) class java::lang::Throwable; *************** do \ *** 41,46 **** --- 41,118 ---- _sc->sc_pc += 4; \ } \ while (0) + + #elif defined(__ia64__) + + #define MAKE_THROW_FRAME(_exception) \ + do \ + { \ + /* IA-64 either leaves PC pointing at a faulting instruction or the \ + following instruction, depending on the signal. SEGV always does \ + the former, so we adjust the saved PC to point to the following \ + instruction; this is what the handler in libgcc expects. */ \ + /* Note that we are lying to the unwinder here, which expects the \ + faulting pc, not pc+1. But we claim the unwind information can't \ + be changed by such a ld or st instruction, so it doesn't matter. */ \ + struct sigcontext *_sc = (struct sigcontext *)_p; \ + _sc->sc_ip++; \ + } \ + while (0) + #elif defined(__sparc__) + /* We could do the unwind of the signal frame quickly by hand here like + sparc-signal.h does under Solaris, but that makes debugging unwind + failures almost impossible. */ + #if !defined(__arch64__) + #define MAKE_THROW_FRAME(_exception) \ + do \ + { \ + /* Sparc-32 leaves PC pointing at a faulting instruction \ + always. \ + We advance the PC one instruction past the exception causing PC. \ + This is done because FDEs are found with "context->ra - 1" in the \ + unwinder. \ + Also, the dwarf2 unwind machinery is going to add 8 to the \ + PC it uses on Sparc. So we adjust the PC here. We do it here \ + because we run once for such an exception, however the Sparc specific\ + unwind can run multiple times for the same exception and it would \ + adjust the PC more than once resulting in a bogus value. */ \ + struct sig_regs { \ + unsigned int psr, pc, npc, y, u_regs[16]; \ + } *regp; \ + unsigned int insn; \ + __asm__ __volatile__("ld [%%i7 + 8], %0" : "=r" (insn)); \ + /* mov __NR_sigaction, %g1; Old signal stack layout */ \ + if (insn == 0x821020d8) \ + regp = (struct sig_regs *) _sip; \ + else \ + /* mov __NR_rt_sigaction, %g1; New signal stack layout */ \ + regp = (struct sig_regs *) (_sip + 1); \ + regp->pc = ((regp->pc + 4) - 8); \ + } \ + while (0) + #else + #define MAKE_THROW_FRAME(_exception) \ + do \ + { \ + /* Sparc-64 leaves PC pointing at a faulting instruction \ + always. \ + We advance the PC one instruction past the exception causing PC. \ + This is done because FDEs are found with "context->ra - 1" in the \ + unwinder. \ + Also, the dwarf2 unwind machinery is going to add 8 to the \ + PC it uses on Sparc. So we adjust the PC here. We do it here \ + because we run once for such an exception, however the Sparc specific\ + unwind can run multiple times for the same exception and it would \ + adjust the PC more than once resulting in a bogus value. */ \ + struct pt_regs { \ + unsigned long u_regs[16]; \ + unsigned long tstate, tpc, tnpc; \ + unsigned int y, fprs; \ + } *regp = (struct pt_regs *) (_sip + 1); \ + regp->tpc = ((regp->tpc + 4) - 8); \ + } \ + while (0) + #endif #else #define MAKE_THROW_FRAME(_exception) \ do \ *************** do \ *** 50,55 **** --- 122,214 ---- while (0) #endif + #if defined(__sparc__) + #if defined(__arch64__) + extern "C" { + static void __rt_sigreturn_stub(void) + { + __asm__("mov %0, %%g1\n\t" + "ta 0x6d\n\t" + : /* no outputs */ + : "i" (__NR_rt_sigreturn)); + } + struct kernel_sigaction + { + void (*k_sa_sigaction)(int,siginfo_t *,void *); + unsigned long k_sa_flags; + void (*k_sa_restorer)(void); + sigset_t k_sa_mask; + }; + } + #define INIT_SEGV \ + do \ + { \ + nullp = new java::lang::NullPointerException (); \ + struct kernel_sigaction act; \ + unsigned long stub = ((unsigned long)&__rt_sigreturn_stub); \ + act.k_sa_sigaction = _Jv_catch_segv; \ + sigemptyset (&act.k_sa_mask); \ + act.k_sa_flags = SA_SIGINFO; \ + act.k_sa_restorer = NULL; \ + syscall (SYS_rt_sigaction, SIGSEGV, &act, NULL, \ + stub - 8, _NSIG / 8); \ + } \ + while (0) + + #define INIT_FPE \ + do \ + { \ + arithexception = new java::lang::ArithmeticException \ + (JvNewStringLatin1 ("/ by zero")); \ + struct kernel_sigaction act; \ + unsigned long stub = ((unsigned long)&__rt_sigreturn_stub); \ + act.k_sa_sigaction = _Jv_catch_fpe; \ + sigemptyset (&act.k_sa_mask); \ + act.k_sa_flags = SA_SIGINFO; \ + act.k_sa_restorer = NULL; \ + syscall (SYS_rt_sigaction, SIGFPE, &act, NULL, \ + stub - 8, _NSIG / 8); \ + } \ + while (0) + #else /* __arch64__ */ + + extern "C" { + struct kernel_sigaction + { + void (*k_sa_sigaction)(int,siginfo_t *,void *); + unsigned long k_sa_mask, k_sa_flags; + void (*k_sa_restorer)(void); + }; + } + + #define INIT_SEGV \ + do \ + { \ + struct kernel_sigaction act; \ + nullp = new java::lang::NullPointerException (); \ + act.k_sa_sigaction = _Jv_catch_segv; \ + act.k_sa_mask = 0; \ + act.k_sa_flags = SA_SIGINFO; \ + act.k_sa_restorer = NULL; \ + syscall (SYS_sigaction, -SIGSEGV, &act, NULL); \ + } \ + while (0) + + #define INIT_FPE \ + do \ + { \ + arithexception = new java::lang::ArithmeticException \ + (JvNewStringLatin1 ("/ by zero")); \ + struct kernel_sigaction act; \ + act.k_sa_sigaction = _Jv_catch_fpe; \ + act.k_sa_mask = 0; \ + act.k_sa_flags = SA_SIGINFO; \ + act.k_sa_restorer = NULL; \ + syscall (SYS_sigaction, -SIGFPE, &act, NULL); \ + } \ + while (0) + #endif + #elif !defined(__ia64__) #define INIT_SEGV \ do \ { \ *************** while (0) *** 82,85 **** --- 241,275 ---- * go away once all systems have pthreads libraries that are * compiled with full unwind info. */ + #else /* __ia64__ */ + + // On IA64, unwind information is mandatory, so we can unwind + // correctly through glibc frames. Thus we call the ordinary + // sigaction. + + #define INIT_SEGV \ + do \ + { \ + nullp = new java::lang::NullPointerException (); \ + struct sigaction act; \ + act.sa_sigaction = _Jv_catch_segv; \ + sigemptyset (&act.sa_mask); \ + act.sa_flags = SA_SIGINFO; \ + sigaction (SIGSEGV, &act, NULL); \ + } \ + while (0) + + #define INIT_FPE \ + do \ + { \ + arithexception = new java::lang::ArithmeticException \ + (JvNewStringLatin1 ("/ by zero")); \ + struct sigaction act; \ + act.sa_sigaction = _Jv_catch_fpe; \ + sigemptyset (&act.sa_mask); \ + act.sa_flags = SA_SIGINFO; \ + sigaction (SIGFPE, &act, NULL); \ + } \ + while (0) + #endif /* __ia64__ || __sparc__ */ #endif /* JAVA_SIGNAL_H */ diff -Nrc3pad gcc-3.0.4/libjava/include/i386-signal.h gcc-3.1/libjava/include/i386-signal.h *** gcc-3.0.4/libjava/include/i386-signal.h Tue May 29 16:28:21 2001 --- gcc-3.1/libjava/include/i386-signal.h Mon Mar 18 17:26:11 2002 *************** *** 1,6 **** ! // i386-signal.h - Catch runtime signals and turn them into exceptions. ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. --- 1,7 ---- ! // i386-signal.h - Catch runtime signals and turn them into exceptions ! // on an i386 based Linux system. ! /* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 8,17 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ - /* This technique should work for all i386 based Unices which conform - * to iBCS2. This includes all versions of Linux more recent than 1.3 - */ - #ifndef JAVA_SIGNAL_H #define JAVA_SIGNAL_H 1 --- 9,14 ---- *************** do \ *** 45,51 **** void **_p = (void **)&_dummy; \ struct sigcontext_struct *_regs = (struct sigcontext_struct *)++_p; \ \ - register unsigned long *_ebp = (unsigned long *)_regs->ebp; \ register unsigned char *_eip = (unsigned char *)_regs->eip; \ \ /* According to the JVM spec, "if the dividend is the negative \ --- 42,47 ---- *************** do \ *** 88,108 **** _regs->eip = (unsigned long)_eip; \ return; \ } \ - else if (((_modrm >> 3) & 7) == 6) /* Unsigned divide */ \ - { \ - /* We assume that unsigned divisions are in library code, so \ - * we throw one level down the stack, which was hopefully \ - * the place that called the library routine. This will \ - * break if the library is ever compiled with \ - * -fomit-frame-pointer, but at least this way we've got a \ - * good chance of finding the exception handler. */ \ - \ - _eip = (unsigned char *)_ebp[1]; \ - _ebp = (unsigned long *)_ebp[0]; \ - \ - asm volatile ("mov %0, (%%ebp); mov %1, 4(%%ebp)" \ - : : "r"(_ebp), "r"(_eip)); \ - } \ else \ { \ /* Advance the program counter so that it is after the start \ --- 84,89 ---- *************** do \ *** 115,129 **** } \ while (0) #define INIT_SEGV \ do \ { \ nullp = new java::lang::NullPointerException (); \ ! struct sigaction act; \ ! act.sa_handler = catch_segv; \ ! sigemptyset (&act.sa_mask); \ ! act.sa_flags = 0; \ ! syscall (SYS_sigaction, SIGSEGV, &act, NULL); \ } \ while (0) --- 96,122 ---- } \ while (0) + /* We use old_kernel_sigaction here because we're calling the kernel + directly rather than via glibc. The sigaction structure that the + syscall uses is a different shape from the one in userland and not + visible to us in a header file so we define it here. */ + + struct old_i386_kernel_sigaction { + void (*k_sa_handler) (int); + unsigned long k_sa_mask; + unsigned long k_sa_flags; + void (*sa_restorer) (void); + }; + #define INIT_SEGV \ do \ { \ nullp = new java::lang::NullPointerException (); \ ! struct old_i386_kernel_sigaction kact; \ ! kact.k_sa_handler = catch_segv; \ ! kact.k_sa_mask = 0; \ ! kact.k_sa_flags = 0; \ ! syscall (SYS_sigaction, SIGSEGV, &kact, NULL); \ } \ while (0) *************** do \ *** 132,157 **** { \ arithexception = new java::lang::ArithmeticException \ (JvNewStringLatin1 ("/ by zero")); \ ! struct sigaction act; \ ! act.sa_handler = catch_fpe; \ ! sigemptyset (&act.sa_mask); \ ! act.sa_flags = 0; \ ! syscall (SYS_sigaction, SIGFPE, &act, NULL); \ } \ while (0) ! /* You might wonder why we use syscall(SYS_sigaction) in INIT_SEGV and ! * INIT_FPE instead of the standard sigaction(). This is necessary ! * because of the shenanigans above where we increment the PC saved in ! * the context and then return. This trick will only work when we are * called _directly_ by the kernel, because linuxthreads wraps signal ! * handlers and its wrappers do not copy the sigcontext struct back when ! * returning from a signal handler. If we return from our divide handler ! * to a linuxthreads wrapper, we will lose the PC adjustment we made and ! * return to the faulting instruction again. Using syscall(SYS_sigaction) ! * causes our handler to be called directly by the kernel, bypassing ! * any wrappers. This is a kludge, and a future version of this handler ! * will do something better. */ #endif /* JAVA_SIGNAL_H */ --- 125,156 ---- { \ arithexception = new java::lang::ArithmeticException \ (JvNewStringLatin1 ("/ by zero")); \ ! struct old_i386_kernel_sigaction kact; \ ! kact.k_sa_handler = catch_fpe; \ ! kact.k_sa_mask = 0; \ ! kact.k_sa_flags = 0; \ ! syscall (SYS_sigaction, SIGFPE, &kact, NULL); \ } \ while (0) ! /* You might wonder why we use syscall(SYS_sigaction) in INIT_FPE ! * instead of the standard sigaction(). This is necessary because of ! * the shenanigans above where we increment the PC saved in the ! * context and then return. This trick will only work when we are * called _directly_ by the kernel, because linuxthreads wraps signal ! * handlers and its wrappers do not copy the sigcontext struct back ! * when returning from a signal handler. If we return from our divide ! * handler to a linuxthreads wrapper, we will lose the PC adjustment ! * we made and return to the faulting instruction again. Using ! * syscall(SYS_sigaction) causes our handler to be called directly ! * by the kernel, bypassing any wrappers. ! ! * Also, there is at the present time no unwind info in the ! * linuxthreads library's signal handlers and so we can't unwind ! * through them anyway. ! ! * Finally, the code that glibc uses to return from a signal handler ! * is subject to change. */ #endif /* JAVA_SIGNAL_H */ diff -Nrc3pad gcc-3.0.4/libjava/include/java-chardecomp.h gcc-3.1/libjava/include/java-chardecomp.h *** gcc-3.0.4/libjava/include/java-chardecomp.h Wed Apr 7 14:52:34 1999 --- gcc-3.1/libjava/include/java-chardecomp.h Wed Mar 6 19:12:50 2002 *************** *** 3,9 **** #ifndef __JAVA_CHARDECOMP_H__ #define __JAVA_CHARDECOMP_H__ ! // These tables are automatically generated by the chartables.pl // script. DO NOT EDIT the tables. Instead, fix the script // and run it again. --- 3,10 ---- #ifndef __JAVA_CHARDECOMP_H__ #define __JAVA_CHARDECOMP_H__ ! ! // These tables are automatically generated by the scripts/unicode-decomp.pl // script. DO NOT EDIT the tables. Instead, fix the script // and run it again. *************** static const decomp_entry canonical_deco *** 200,207 **** { 0x01dc, "\x00\xfc\x03\x00" }, { 0x01de, "\x00\xc4\x03\x04" }, { 0x01df, "\x00\xe4\x03\x04" }, ! { 0x01e0, "\x00\x41\x03\x07\x03\x04" }, ! { 0x01e1, "\x00\x61\x03\x07\x03\x04" }, { 0x01e2, "\x00\xc6\x03\x04" }, { 0x01e3, "\x00\xe6\x03\x04" }, { 0x01e6, "\x00\x47\x03\x0c" }, --- 201,208 ---- { 0x01dc, "\x00\xfc\x03\x00" }, { 0x01de, "\x00\xc4\x03\x04" }, { 0x01df, "\x00\xe4\x03\x04" }, ! { 0x01e0, "\x02\x26\x03\x04" }, ! { 0x01e1, "\x02\x27\x03\x04" }, { 0x01e2, "\x00\xc6\x03\x04" }, { 0x01e3, "\x00\xe6\x03\x04" }, { 0x01e6, "\x00\x47\x03\x0c" }, *************** static const decomp_entry canonical_deco *** 217,222 **** --- 218,225 ---- { 0x01f0, "\x00\x6a\x03\x0c" }, { 0x01f4, "\x00\x47\x03\x01" }, { 0x01f5, "\x00\x67\x03\x01" }, + { 0x01f8, "\x00\x4e\x03\x00" }, + { 0x01f9, "\x00\x6e\x03\x00" }, { 0x01fa, "\x00\xc5\x03\x01" }, { 0x01fb, "\x00\xe5\x03\x01" }, { 0x01fc, "\x00\xc6\x03\x01" }, *************** static const decomp_entry canonical_deco *** 247,252 **** --- 250,275 ---- { 0x0215, "\x00\x75\x03\x0f" }, { 0x0216, "\x00\x55\x03\x11" }, { 0x0217, "\x00\x75\x03\x11" }, + { 0x0218, "\x00\x53\x03\x26" }, + { 0x0219, "\x00\x73\x03\x26" }, + { 0x021a, "\x00\x54\x03\x26" }, + { 0x021b, "\x00\x74\x03\x26" }, + { 0x021e, "\x00\x48\x03\x0c" }, + { 0x021f, "\x00\x68\x03\x0c" }, + { 0x0226, "\x00\x41\x03\x07" }, + { 0x0227, "\x00\x61\x03\x07" }, + { 0x0228, "\x00\x45\x03\x27" }, + { 0x0229, "\x00\x65\x03\x27" }, + { 0x022a, "\x00\xd6\x03\x04" }, + { 0x022b, "\x00\xf6\x03\x04" }, + { 0x022c, "\x00\xd5\x03\x04" }, + { 0x022d, "\x00\xf5\x03\x04" }, + { 0x022e, "\x00\x4f\x03\x07" }, + { 0x022f, "\x00\x6f\x03\x07" }, + { 0x0230, "\x02\x2e\x03\x04" }, + { 0x0231, "\x02\x2f\x03\x04" }, + { 0x0232, "\x00\x59\x03\x04" }, + { 0x0233, "\x00\x79\x03\x04" }, { 0x0340, "\x03\x00" }, { 0x0341, "\x03\x01" }, { 0x0343, "\x03\x13" }, *************** static const decomp_entry canonical_deco *** 277,293 **** --- 300,320 ---- { 0x03ce, "\x03\xc9\x03\x01" }, { 0x03d3, "\x03\xd2\x03\x01" }, { 0x03d4, "\x03\xd2\x03\x08" }, + { 0x0400, "\x04\x15\x03\x00" }, { 0x0401, "\x04\x15\x03\x08" }, { 0x0403, "\x04\x13\x03\x01" }, { 0x0407, "\x04\x06\x03\x08" }, { 0x040c, "\x04\x1a\x03\x01" }, + { 0x040d, "\x04\x18\x03\x00" }, { 0x040e, "\x04\x23\x03\x06" }, { 0x0419, "\x04\x18\x03\x06" }, { 0x0439, "\x04\x38\x03\x06" }, + { 0x0450, "\x04\x35\x03\x00" }, { 0x0451, "\x04\x35\x03\x08" }, { 0x0453, "\x04\x33\x03\x01" }, { 0x0457, "\x04\x56\x03\x08" }, { 0x045c, "\x04\x3a\x03\x01" }, + { 0x045d, "\x04\x38\x03\x00" }, { 0x045e, "\x04\x43\x03\x06" }, { 0x0476, "\x04\x74\x03\x0f" }, { 0x0477, "\x04\x75\x03\x0f" }, *************** static const decomp_entry canonical_deco *** 313,318 **** --- 340,347 ---- { 0x04e7, "\x04\x3e\x03\x08" }, { 0x04ea, "\x04\xe8\x03\x08" }, { 0x04eb, "\x04\xe9\x03\x08" }, + { 0x04ec, "\x04\x2d\x03\x08" }, + { 0x04ed, "\x04\x4d\x03\x08" }, { 0x04ee, "\x04\x23\x03\x04" }, { 0x04ef, "\x04\x43\x03\x04" }, { 0x04f0, "\x04\x23\x03\x08" }, *************** static const decomp_entry canonical_deco *** 323,328 **** --- 352,365 ---- { 0x04f5, "\x04\x47\x03\x08" }, { 0x04f8, "\x04\x2b\x03\x08" }, { 0x04f9, "\x04\x4b\x03\x08" }, + { 0x0622, "\x06\x27\x06\x53" }, + { 0x0623, "\x06\x27\x06\x54" }, + { 0x0624, "\x06\x48\x06\x54" }, + { 0x0625, "\x06\x27\x06\x55" }, + { 0x0626, "\x06\x4a\x06\x54" }, + { 0x06c0, "\x06\xd5\x06\x54" }, + { 0x06c2, "\x06\xc1\x06\x54" }, + { 0x06d3, "\x06\xd2\x06\x54" }, { 0x0929, "\x09\x28\x09\x3c" }, { 0x0931, "\x09\x30\x09\x3c" }, { 0x0934, "\x09\x33\x09\x3c" }, *************** static const decomp_entry canonical_deco *** 334,356 **** { 0x095d, "\x09\x22\x09\x3c" }, { 0x095e, "\x09\x2b\x09\x3c" }, { 0x095f, "\x09\x2f\x09\x3c" }, - { 0x09b0, "\x09\xac\x09\xbc" }, { 0x09cb, "\x09\xc7\x09\xbe" }, { 0x09cc, "\x09\xc7\x09\xd7" }, { 0x09dc, "\x09\xa1\x09\xbc" }, { 0x09dd, "\x09\xa2\x09\xbc" }, { 0x09df, "\x09\xaf\x09\xbc" }, { 0x0a59, "\x0a\x16\x0a\x3c" }, { 0x0a5a, "\x0a\x17\x0a\x3c" }, { 0x0a5b, "\x0a\x1c\x0a\x3c" }, - { 0x0a5c, "\x0a\x21\x0a\x3c" }, { 0x0a5e, "\x0a\x2b\x0a\x3c" }, { 0x0b48, "\x0b\x47\x0b\x56" }, { 0x0b4b, "\x0b\x47\x0b\x3e" }, { 0x0b4c, "\x0b\x47\x0b\x57" }, { 0x0b5c, "\x0b\x21\x0b\x3c" }, { 0x0b5d, "\x0b\x22\x0b\x3c" }, - { 0x0b5f, "\x0b\x2f\x0b\x3c" }, { 0x0b94, "\x0b\x92\x0b\xd7" }, { 0x0bca, "\x0b\xc6\x0b\xbe" }, { 0x0bcb, "\x0b\xc7\x0b\xbe" }, --- 371,392 ---- { 0x095d, "\x09\x22\x09\x3c" }, { 0x095e, "\x09\x2b\x09\x3c" }, { 0x095f, "\x09\x2f\x09\x3c" }, { 0x09cb, "\x09\xc7\x09\xbe" }, { 0x09cc, "\x09\xc7\x09\xd7" }, { 0x09dc, "\x09\xa1\x09\xbc" }, { 0x09dd, "\x09\xa2\x09\xbc" }, { 0x09df, "\x09\xaf\x09\xbc" }, + { 0x0a33, "\x0a\x32\x0a\x3c" }, + { 0x0a36, "\x0a\x38\x0a\x3c" }, { 0x0a59, "\x0a\x16\x0a\x3c" }, { 0x0a5a, "\x0a\x17\x0a\x3c" }, { 0x0a5b, "\x0a\x1c\x0a\x3c" }, { 0x0a5e, "\x0a\x2b\x0a\x3c" }, { 0x0b48, "\x0b\x47\x0b\x56" }, { 0x0b4b, "\x0b\x47\x0b\x3e" }, { 0x0b4c, "\x0b\x47\x0b\x57" }, { 0x0b5c, "\x0b\x21\x0b\x3c" }, { 0x0b5d, "\x0b\x22\x0b\x3c" }, { 0x0b94, "\x0b\x92\x0b\xd7" }, { 0x0bca, "\x0b\xc6\x0b\xbe" }, { 0x0bcb, "\x0b\xc7\x0b\xbe" }, *************** static const decomp_entry canonical_deco *** 364,390 **** { 0x0d4a, "\x0d\x46\x0d\x3e" }, { 0x0d4b, "\x0d\x47\x0d\x3e" }, { 0x0d4c, "\x0d\x46\x0d\x57" }, ! { 0x0e33, "\x0e\x4d\x0e\x32" }, ! { 0x0eb3, "\x0e\xcd\x0e\xb2" }, { 0x0f43, "\x0f\x42\x0f\xb7" }, { 0x0f4d, "\x0f\x4c\x0f\xb7" }, { 0x0f52, "\x0f\x51\x0f\xb7" }, { 0x0f57, "\x0f\x56\x0f\xb7" }, { 0x0f5c, "\x0f\x5b\x0f\xb7" }, { 0x0f69, "\x0f\x40\x0f\xb5" }, ! { 0x0f73, "\x0f\x72\x0f\x71" }, { 0x0f75, "\x0f\x71\x0f\x74" }, { 0x0f76, "\x0f\xb2\x0f\x80" }, - { 0x0f77, "\x0f\x76\x0f\x71" }, { 0x0f78, "\x0f\xb3\x0f\x80" }, ! { 0x0f79, "\x0f\x78\x0f\x71" }, ! { 0x0f81, "\x0f\x80\x0f\x71" }, { 0x0f93, "\x0f\x92\x0f\xb7" }, { 0x0f9d, "\x0f\x9c\x0f\xb7" }, { 0x0fa2, "\x0f\xa1\x0f\xb7" }, { 0x0fa7, "\x0f\xa6\x0f\xb7" }, { 0x0fac, "\x0f\xab\x0f\xb7" }, { 0x0fb9, "\x0f\x90\x0f\xb5" }, { 0x1e00, "\x00\x41\x03\x25" }, { 0x1e01, "\x00\x61\x03\x25" }, { 0x1e02, "\x00\x42\x03\x07" }, --- 400,427 ---- { 0x0d4a, "\x0d\x46\x0d\x3e" }, { 0x0d4b, "\x0d\x47\x0d\x3e" }, { 0x0d4c, "\x0d\x46\x0d\x57" }, ! { 0x0dda, "\x0d\xd9\x0d\xca" }, ! { 0x0ddc, "\x0d\xd9\x0d\xcf" }, ! { 0x0ddd, "\x0d\xdc\x0d\xca" }, ! { 0x0dde, "\x0d\xd9\x0d\xdf" }, { 0x0f43, "\x0f\x42\x0f\xb7" }, { 0x0f4d, "\x0f\x4c\x0f\xb7" }, { 0x0f52, "\x0f\x51\x0f\xb7" }, { 0x0f57, "\x0f\x56\x0f\xb7" }, { 0x0f5c, "\x0f\x5b\x0f\xb7" }, { 0x0f69, "\x0f\x40\x0f\xb5" }, ! { 0x0f73, "\x0f\x71\x0f\x72" }, { 0x0f75, "\x0f\x71\x0f\x74" }, { 0x0f76, "\x0f\xb2\x0f\x80" }, { 0x0f78, "\x0f\xb3\x0f\x80" }, ! { 0x0f81, "\x0f\x71\x0f\x80" }, { 0x0f93, "\x0f\x92\x0f\xb7" }, { 0x0f9d, "\x0f\x9c\x0f\xb7" }, { 0x0fa2, "\x0f\xa1\x0f\xb7" }, { 0x0fa7, "\x0f\xa6\x0f\xb7" }, { 0x0fac, "\x0f\xab\x0f\xb7" }, { 0x0fb9, "\x0f\x90\x0f\xb5" }, + { 0x1026, "\x10\x25\x10\x2e" }, { 0x1e00, "\x00\x41\x03\x25" }, { 0x1e01, "\x00\x61\x03\x25" }, { 0x1e02, "\x00\x42\x03\x07" }, *************** static const decomp_entry canonical_deco *** 413,420 **** { 0x1e19, "\x00\x65\x03\x2d" }, { 0x1e1a, "\x00\x45\x03\x30" }, { 0x1e1b, "\x00\x65\x03\x30" }, ! { 0x1e1c, "\x01\x14\x03\x27" }, ! { 0x1e1d, "\x01\x15\x03\x27" }, { 0x1e1e, "\x00\x46\x03\x07" }, { 0x1e1f, "\x00\x66\x03\x07" }, { 0x1e20, "\x00\x47\x03\x04" }, --- 450,457 ---- { 0x1e19, "\x00\x65\x03\x2d" }, { 0x1e1a, "\x00\x45\x03\x30" }, { 0x1e1b, "\x00\x65\x03\x30" }, ! { 0x1e1c, "\x02\x28\x03\x06" }, ! { 0x1e1d, "\x02\x29\x03\x06" }, { 0x1e1e, "\x00\x46\x03\x07" }, { 0x1e1f, "\x00\x66\x03\x07" }, { 0x1e20, "\x00\x47\x03\x04" }, *************** static const decomp_entry canonical_deco *** 552,559 **** { 0x1ea9, "\x00\xe2\x03\x09" }, { 0x1eaa, "\x00\xc2\x03\x03" }, { 0x1eab, "\x00\xe2\x03\x03" }, ! { 0x1eac, "\x00\xc2\x03\x23" }, ! { 0x1ead, "\x00\xe2\x03\x23" }, { 0x1eae, "\x01\x02\x03\x01" }, { 0x1eaf, "\x01\x03\x03\x01" }, { 0x1eb0, "\x01\x02\x03\x00" }, --- 589,596 ---- { 0x1ea9, "\x00\xe2\x03\x09" }, { 0x1eaa, "\x00\xc2\x03\x03" }, { 0x1eab, "\x00\xe2\x03\x03" }, ! { 0x1eac, "\x1e\xa0\x03\x02" }, ! { 0x1ead, "\x1e\xa1\x03\x02" }, { 0x1eae, "\x01\x02\x03\x01" }, { 0x1eaf, "\x01\x03\x03\x01" }, { 0x1eb0, "\x01\x02\x03\x00" }, *************** static const decomp_entry canonical_deco *** 562,569 **** { 0x1eb3, "\x01\x03\x03\x09" }, { 0x1eb4, "\x01\x02\x03\x03" }, { 0x1eb5, "\x01\x03\x03\x03" }, ! { 0x1eb6, "\x01\x02\x03\x23" }, ! { 0x1eb7, "\x01\x03\x03\x23" }, { 0x1eb8, "\x00\x45\x03\x23" }, { 0x1eb9, "\x00\x65\x03\x23" }, { 0x1eba, "\x00\x45\x03\x09" }, --- 599,606 ---- { 0x1eb3, "\x01\x03\x03\x09" }, { 0x1eb4, "\x01\x02\x03\x03" }, { 0x1eb5, "\x01\x03\x03\x03" }, ! { 0x1eb6, "\x1e\xa0\x03\x06" }, ! { 0x1eb7, "\x1e\xa1\x03\x06" }, { 0x1eb8, "\x00\x45\x03\x23" }, { 0x1eb9, "\x00\x65\x03\x23" }, { 0x1eba, "\x00\x45\x03\x09" }, *************** static const decomp_entry canonical_deco *** 578,585 **** { 0x1ec3, "\x00\xea\x03\x09" }, { 0x1ec4, "\x00\xca\x03\x03" }, { 0x1ec5, "\x00\xea\x03\x03" }, ! { 0x1ec6, "\x00\xca\x03\x23" }, ! { 0x1ec7, "\x00\xea\x03\x23" }, { 0x1ec8, "\x00\x49\x03\x09" }, { 0x1ec9, "\x00\x69\x03\x09" }, { 0x1eca, "\x00\x49\x03\x23" }, --- 615,622 ---- { 0x1ec3, "\x00\xea\x03\x09" }, { 0x1ec4, "\x00\xca\x03\x03" }, { 0x1ec5, "\x00\xea\x03\x03" }, ! { 0x1ec6, "\x1e\xb8\x03\x02" }, ! { 0x1ec7, "\x1e\xb9\x03\x02" }, { 0x1ec8, "\x00\x49\x03\x09" }, { 0x1ec9, "\x00\x69\x03\x09" }, { 0x1eca, "\x00\x49\x03\x23" }, *************** static const decomp_entry canonical_deco *** 596,603 **** { 0x1ed5, "\x00\xf4\x03\x09" }, { 0x1ed6, "\x00\xd4\x03\x03" }, { 0x1ed7, "\x00\xf4\x03\x03" }, ! { 0x1ed8, "\x00\xd4\x03\x23" }, ! { 0x1ed9, "\x00\xf4\x03\x23" }, { 0x1eda, "\x01\xa0\x03\x01" }, { 0x1edb, "\x01\xa1\x03\x01" }, { 0x1edc, "\x01\xa0\x03\x00" }, --- 633,640 ---- { 0x1ed5, "\x00\xf4\x03\x09" }, { 0x1ed6, "\x00\xd4\x03\x03" }, { 0x1ed7, "\x00\xf4\x03\x03" }, ! { 0x1ed8, "\x1e\xcc\x03\x02" }, ! { 0x1ed9, "\x1e\xcd\x03\x02" }, { 0x1eda, "\x01\xa0\x03\x01" }, { 0x1edb, "\x01\xa1\x03\x01" }, { 0x1edc, "\x01\xa0\x03\x00" }, *************** static const decomp_entry canonical_deco *** 864,875 **** { 0x2126, "\x03\xa9" }, { 0x212a, "\x00\x4b" }, { 0x212b, "\x00\xc5" }, { 0x2204, "\x22\x03\x03\x38" }, { 0x2209, "\x22\x08\x03\x38" }, { 0x220c, "\x22\x0b\x03\x38" }, { 0x2224, "\x22\x23\x03\x38" }, { 0x2226, "\x22\x25\x03\x38" }, ! { 0x2241, "\x00\x7e\x03\x38" }, { 0x2244, "\x22\x43\x03\x38" }, { 0x2247, "\x22\x45\x03\x38" }, { 0x2249, "\x22\x48\x03\x38" }, --- 901,918 ---- { 0x2126, "\x03\xa9" }, { 0x212a, "\x00\x4b" }, { 0x212b, "\x00\xc5" }, + { 0x219a, "\x21\x90\x03\x38" }, + { 0x219b, "\x21\x92\x03\x38" }, + { 0x21ae, "\x21\x94\x03\x38" }, + { 0x21cd, "\x21\xd0\x03\x38" }, + { 0x21ce, "\x21\xd4\x03\x38" }, + { 0x21cf, "\x21\xd2\x03\x38" }, { 0x2204, "\x22\x03\x03\x38" }, { 0x2209, "\x22\x08\x03\x38" }, { 0x220c, "\x22\x0b\x03\x38" }, { 0x2224, "\x22\x23\x03\x38" }, { 0x2226, "\x22\x25\x03\x38" }, ! { 0x2241, "\x22\x3c\x03\x38" }, { 0x2244, "\x22\x43\x03\x38" }, { 0x2247, "\x22\x45\x03\x38" }, { 0x2249, "\x22\x48\x03\x38" }, *************** static const decomp_entry canonical_deco *** 1252,1257 **** --- 1295,1301 ---- { 0xfa2b, "\x98\xfc" }, { 0xfa2c, "\x99\x28" }, { 0xfa2d, "\x9d\xb4" }, + { 0xfb1d, "\x05\xd9\x05\xb4" }, { 0xfb1f, "\x05\xf2\x05\xb7" }, { 0xfb2a, "\x05\xe9\x05\xc1" }, { 0xfb2b, "\x05\xe9\x05\xc2" }, *************** static const decomp_entry canonical_deco *** 1289,1297 **** static const decomp_entry full_decomposition[] = { - { 0x005e, "\x00\x20\x03\x02" }, - { 0x005f, "\x00\x20\x03\x32" }, - { 0x0060, "\x00\x20\x03\x00" }, { 0x00a0, "\x00\x20" }, { 0x00a8, "\x00\x20\x03\x08" }, { 0x00aa, "\x00\x61" }, --- 1333,1338 ---- *************** static const decomp_entry full_decomposi *** 1346,1541 **** { 0x02e4, "\x02\x95" }, { 0x037a, "\x00\x20\x03\x45" }, { 0x0384, "\x00\x20\x03\x01" }, { 0x0587, "\x05\x65\x05\x82" }, { 0x0edc, "\x0e\xab\x0e\x99" }, { 0x0edd, "\x0e\xab\x0e\xa1" }, ! { 0x1101, "\x11\x00\x11\x00" }, ! { 0x1104, "\x11\x03\x11\x03" }, ! { 0x1108, "\x11\x07\x11\x07" }, ! { 0x110a, "\x11\x09\x11\x09" }, ! { 0x110d, "\x11\x0c\x11\x0c" }, ! { 0x1113, "\x11\x02\x11\x00" }, ! { 0x1114, "\x11\x02\x11\x02" }, ! { 0x1115, "\x11\x02\x11\x03" }, ! { 0x1116, "\x11\x02\x11\x07" }, ! { 0x1117, "\x11\x03\x11\x00" }, ! { 0x1118, "\x11\x05\x11\x02" }, ! { 0x1119, "\x11\x05\x11\x05" }, ! { 0x111a, "\x11\x05\x11\x12" }, ! { 0x111b, "\x11\x05\x11\x0b" }, ! { 0x111c, "\x11\x06\x11\x07" }, ! { 0x111d, "\x11\x06\x11\x0b" }, ! { 0x111e, "\x11\x07\x11\x00" }, ! { 0x111f, "\x11\x07\x11\x02" }, ! { 0x1120, "\x11\x07\x11\x03" }, ! { 0x1121, "\x11\x07\x11\x09" }, ! { 0x1122, "\x11\x07\x11\x09\x11\x00" }, ! { 0x1123, "\x11\x07\x11\x09\x11\x03" }, ! { 0x1124, "\x11\x07\x11\x09\x11\x07" }, ! { 0x1125, "\x11\x07\x11\x09\x11\x09" }, ! { 0x1126, "\x11\x07\x11\x09\x11\x0c" }, ! { 0x1127, "\x11\x07\x11\x0c" }, ! { 0x1128, "\x11\x07\x11\x0e" }, ! { 0x1129, "\x11\x07\x11\x10" }, ! { 0x112a, "\x11\x07\x11\x11" }, ! { 0x112b, "\x11\x07\x11\x0b" }, ! { 0x112c, "\x11\x07\x11\x07\x11\x0b" }, ! { 0x112d, "\x11\x09\x11\x00" }, ! { 0x112e, "\x11\x09\x11\x02" }, ! { 0x112f, "\x11\x09\x11\x03" }, ! { 0x1130, "\x11\x09\x11\x05" }, ! { 0x1131, "\x11\x09\x11\x06" }, ! { 0x1132, "\x11\x09\x11\x07" }, ! { 0x1133, "\x11\x09\x11\x07\x11\x00" }, ! { 0x1134, "\x11\x09\x11\x09\x11\x09" }, ! { 0x1135, "\x11\x09\x11\x0b" }, ! { 0x1136, "\x11\x09\x11\x0c" }, ! { 0x1137, "\x11\x09\x11\x0e" }, ! { 0x1138, "\x11\x09\x11\x0f" }, ! { 0x1139, "\x11\x09\x11\x10" }, ! { 0x113a, "\x11\x09\x11\x11" }, ! { 0x113b, "\x11\x09\x11\x12" }, ! { 0x113d, "\x11\x3c\x11\x3c" }, ! { 0x113f, "\x11\x3e\x11\x3e" }, ! { 0x1141, "\x11\x0b\x11\x00" }, ! { 0x1142, "\x11\x0b\x11\x03" }, ! { 0x1143, "\x11\x0b\x11\x06" }, ! { 0x1144, "\x11\x0b\x11\x07" }, ! { 0x1145, "\x11\x0b\x11\x09" }, ! { 0x1146, "\x11\x0b\x11\x40" }, ! { 0x1147, "\x11\x0b\x11\x0b" }, ! { 0x1148, "\x11\x0b\x11\x0c" }, ! { 0x1149, "\x11\x0b\x11\x0e" }, ! { 0x114a, "\x11\x0b\x11\x10" }, ! { 0x114b, "\x11\x0b\x11\x11" }, ! { 0x114d, "\x11\x0c\x11\x0b" }, ! { 0x114f, "\x11\x4e\x11\x4e" }, ! { 0x1151, "\x11\x50\x11\x50" }, ! { 0x1152, "\x11\x0e\x11\x0f" }, ! { 0x1153, "\x11\x0e\x11\x12" }, ! { 0x1156, "\x11\x11\x11\x07" }, ! { 0x1157, "\x11\x11\x11\x0b" }, ! { 0x1158, "\x11\x12\x11\x12" }, ! { 0x1162, "\x11\x61\x11\x75" }, ! { 0x1164, "\x11\x63\x11\x75" }, ! { 0x1166, "\x11\x65\x11\x75" }, ! { 0x1168, "\x11\x67\x11\x75" }, ! { 0x116a, "\x11\x69\x11\x61" }, ! { 0x116b, "\x11\x69\x11\x61\x11\x75" }, ! { 0x116c, "\x11\x69\x11\x75" }, ! { 0x116f, "\x11\x6e\x11\x65" }, ! { 0x1170, "\x11\x6e\x11\x65\x11\x75" }, ! { 0x1171, "\x11\x6e\x11\x75" }, ! { 0x1174, "\x11\x73\x11\x75" }, ! { 0x1176, "\x11\x61\x11\x69" }, ! { 0x1177, "\x11\x61\x11\x6e" }, ! { 0x1178, "\x11\x63\x11\x69" }, ! { 0x1179, "\x11\x63\x11\x6d" }, ! { 0x117a, "\x11\x65\x11\x69" }, ! { 0x117b, "\x11\x65\x11\x6e" }, ! { 0x117c, "\x11\x65\x11\x73" }, ! { 0x117d, "\x11\x67\x11\x69" }, ! { 0x117e, "\x11\x67\x11\x6e" }, ! { 0x117f, "\x11\x69\x11\x65" }, ! { 0x1180, "\x11\x69\x11\x66" }, ! { 0x1181, "\x11\x69\x11\x68" }, ! { 0x1182, "\x11\x69\x11\x69" }, ! { 0x1183, "\x11\x69\x11\x6e" }, ! { 0x1184, "\x11\x6d\x11\x63" }, ! { 0x1185, "\x11\x6d\x11\x64" }, ! { 0x1186, "\x11\x6d\x11\x67" }, ! { 0x1187, "\x11\x6d\x11\x69" }, ! { 0x1188, "\x11\x6d\x11\x75" }, ! { 0x1189, "\x11\x6e\x11\x61" }, ! { 0x118a, "\x11\x6e\x11\x62" }, ! { 0x118b, "\x11\x6e\x11\x65\x11\x73" }, ! { 0x118c, "\x11\x6e\x11\x68" }, ! { 0x118d, "\x11\x6e\x11\x6e" }, ! { 0x118e, "\x11\x72\x11\x61" }, ! { 0x118f, "\x11\x72\x11\x65" }, ! { 0x1190, "\x11\x72\x11\x66" }, ! { 0x1191, "\x11\x72\x11\x67" }, ! { 0x1192, "\x11\x72\x11\x68" }, ! { 0x1193, "\x11\x72\x11\x6e" }, ! { 0x1194, "\x11\x72\x11\x75" }, ! { 0x1195, "\x11\x73\x11\x6e" }, ! { 0x1196, "\x11\x73\x11\x73" }, ! { 0x1197, "\x11\x74\x11\x6e" }, ! { 0x1198, "\x11\x75\x11\x61" }, ! { 0x1199, "\x11\x75\x11\x63" }, ! { 0x119a, "\x11\x75\x11\x69" }, ! { 0x119b, "\x11\x75\x11\x6e" }, ! { 0x119c, "\x11\x75\x11\x73" }, ! { 0x119d, "\x11\x75\x11\x9e" }, ! { 0x119f, "\x11\x9e\x11\x65" }, ! { 0x11a0, "\x11\x9e\x11\x6e" }, ! { 0x11a1, "\x11\x9e\x11\x75" }, ! { 0x11a2, "\x11\x9e\x11\x9e" }, ! { 0x11a9, "\x11\xa8\x11\xa8" }, ! { 0x11aa, "\x11\xa8\x11\xba" }, ! { 0x11ac, "\x11\xab\x11\xbd" }, ! { 0x11ad, "\x11\xab\x11\xc2" }, ! { 0x11b0, "\x11\xaf\x11\xa8" }, ! { 0x11b1, "\x11\xaf\x11\xb7" }, ! { 0x11b2, "\x11\xaf\x11\xb8" }, ! { 0x11b3, "\x11\xaf\x11\xba" }, ! { 0x11b4, "\x11\xaf\x11\xc0" }, ! { 0x11b5, "\x11\xaf\x11\xc1" }, ! { 0x11b6, "\x11\xaf\x11\xc2" }, ! { 0x11b9, "\x11\xb8\x11\xba" }, ! { 0x11bb, "\x11\xba\x11\xba" }, ! { 0x11c3, "\x11\xa8\x11\xaf" }, ! { 0x11c4, "\x11\xa8\x11\xba\x11\xa8" }, ! { 0x11c5, "\x11\xab\x11\xa8" }, ! { 0x11c6, "\x11\xab\x11\xae" }, ! { 0x11c7, "\x11\xab\x11\xba" }, ! { 0x11c8, "\x11\xab\x11\xeb" }, ! { 0x11c9, "\x11\xab\x11\xc0" }, ! { 0x11ca, "\x11\xae\x11\xa8" }, ! { 0x11cb, "\x11\xae\x11\xaf" }, ! { 0x11cc, "\x11\xaf\x11\xa8\x11\xba" }, ! { 0x11cd, "\x11\xaf\x11\xab" }, ! { 0x11ce, "\x11\xaf\x11\xae" }, ! { 0x11cf, "\x11\xaf\x11\xae\x11\xc2" }, ! { 0x11d0, "\x11\xaf\x11\xaf" }, ! { 0x11d1, "\x11\xaf\x11\xb7\x11\xa8" }, ! { 0x11d2, "\x11\xaf\x11\xb7\x11\xba" }, ! { 0x11d3, "\x11\xaf\x11\xb8\x11\xba" }, ! { 0x11d4, "\x11\xaf\x11\xb8\x11\xc2" }, ! { 0x11d5, "\x11\xaf\x11\xb8\x11\xbc" }, ! { 0x11d6, "\x11\xaf\x11\xba\x11\xba" }, ! { 0x11d7, "\x11\xaf\x11\xeb" }, ! { 0x11d8, "\x11\xaf\x11\xbf" }, ! { 0x11d9, "\x11\xaf\x11\xf9" }, ! { 0x11da, "\x11\xb7\x11\xa8" }, ! { 0x11db, "\x11\xb7\x11\xaf" }, ! { 0x11dc, "\x11\xb7\x11\xb8" }, ! { 0x11dd, "\x11\xb7\x11\xba" }, ! { 0x11de, "\x11\xb7\x11\xba\x11\xba" }, ! { 0x11df, "\x11\xb7\x11\xeb" }, ! { 0x11e0, "\x11\xb7\x11\xbe" }, ! { 0x11e1, "\x11\xb7\x11\xc2" }, ! { 0x11e2, "\x11\xb7\x11\xbc" }, ! { 0x11e3, "\x11\xb8\x11\xaf" }, ! { 0x11e4, "\x11\xb8\x11\xc1" }, ! { 0x11e5, "\x11\xb8\x11\xc2" }, ! { 0x11e6, "\x11\xb8\x11\xbc" }, ! { 0x11e7, "\x11\xba\x11\xa8" }, ! { 0x11e8, "\x11\xba\x11\xae" }, ! { 0x11e9, "\x11\xba\x11\xaf" }, ! { 0x11ea, "\x11\xba\x11\xb8" }, ! { 0x11ec, "\x11\xbc\x11\xa8" }, ! { 0x11ed, "\x11\xbc\x11\xa8\x11\xa8" }, ! { 0x11ee, "\x11\xbc\x11\xbc" }, ! { 0x11ef, "\x11\xbc\x11\xbf" }, ! { 0x11f1, "\x11\xf0\x11\xba" }, ! { 0x11f2, "\x11\xf0\x11\xeb" }, ! { 0x11f3, "\x11\xc1\x11\xb8" }, ! { 0x11f4, "\x11\xc1\x11\xbc" }, ! { 0x11f5, "\x11\xc2\x11\xab" }, ! { 0x11f6, "\x11\xc2\x11\xaf" }, ! { 0x11f7, "\x11\xc2\x11\xb7" }, ! { 0x11f8, "\x11\xc2\x11\xb8" }, { 0x1e9a, "\x00\x61\x02\xbe" }, { 0x1fbd, "\x00\x20\x03\x13" }, { 0x1fbf, "\x00\x20\x03\x13" }, --- 1387,1412 ---- { 0x02e4, "\x02\x95" }, { 0x037a, "\x00\x20\x03\x45" }, { 0x0384, "\x00\x20\x03\x01" }, + { 0x03d0, "\x03\xb2" }, + { 0x03d1, "\x03\xb8" }, + { 0x03d2, "\x03\xa5" }, + { 0x03d5, "\x03\xc6" }, + { 0x03d6, "\x03\xc0" }, + { 0x03f0, "\x03\xba" }, + { 0x03f1, "\x03\xc1" }, + { 0x03f2, "\x03\xc2" }, { 0x0587, "\x05\x65\x05\x82" }, + { 0x0675, "\x06\x27\x06\x74" }, + { 0x0676, "\x06\x48\x06\x74" }, + { 0x0677, "\x06\xc7\x06\x74" }, + { 0x0678, "\x06\x4a\x06\x74" }, + { 0x0e33, "\x0e\x4d\x0e\x32" }, + { 0x0eb3, "\x0e\xcd\x0e\xb2" }, { 0x0edc, "\x0e\xab\x0e\x99" }, { 0x0edd, "\x0e\xab\x0e\xa1" }, ! { 0x0f0c, "\x0f\x0b" }, ! { 0x0f77, "\x0f\xb2\x0f\x81" }, ! { 0x0f79, "\x0f\xb3\x0f\x81" }, { 0x1e9a, "\x00\x61\x02\xbe" }, { 0x1fbd, "\x00\x20\x03\x13" }, { 0x1fbf, "\x00\x20\x03\x13" }, *************** static const decomp_entry full_decomposi *** 1555,1566 **** --- 1426,1440 ---- { 0x2024, "\x00\x2e" }, { 0x2025, "\x00\x2e\x00\x2e" }, { 0x2026, "\x00\x2e\x00\x2e\x00\x2e" }, + { 0x202f, "\x00\x20" }, { 0x2033, "\x20\x32\x20\x32" }, { 0x2034, "\x20\x32\x20\x32\x20\x32" }, { 0x2036, "\x20\x35\x20\x35" }, { 0x2037, "\x20\x35\x20\x35\x20\x35" }, { 0x203c, "\x00\x21\x00\x21" }, { 0x203e, "\x00\x20\x03\x05" }, + { 0x2048, "\x00\x3f\x00\x21" }, + { 0x2049, "\x00\x21\x00\x3f" }, { 0x2070, "\x00\x30" }, { 0x2074, "\x00\x34" }, { 0x2075, "\x00\x35" }, *************** static const decomp_entry full_decomposi *** 1631,1636 **** --- 1505,1511 ---- { 0x2136, "\x05\xd1" }, { 0x2137, "\x05\xd2" }, { 0x2138, "\x05\xd3" }, + { 0x2139, "\x00\x69" }, { 0x2153, "\x00\x31\x20\x44\x00\x33" }, { 0x2154, "\x00\x32\x20\x44\x00\x33" }, { 0x2155, "\x00\x31\x20\x44\x00\x35" }, *************** static const decomp_entry full_decomposi *** 1819,1826 **** --- 1694,1920 ---- { 0x24e8, "\x00\x79" }, { 0x24e9, "\x00\x7a" }, { 0x24ea, "\x00\x30" }, + { 0x2e9f, "\x6b\xcd" }, + { 0x2ef3, "\x9f\x9f" }, + { 0x2f00, "\x4e\x00" }, + { 0x2f01, "\x4e\x28" }, + { 0x2f02, "\x4e\x36" }, + { 0x2f03, "\x4e\x3f" }, + { 0x2f04, "\x4e\x59" }, + { 0x2f05, "\x4e\x85" }, + { 0x2f06, "\x4e\x8c" }, + { 0x2f07, "\x4e\xa0" }, + { 0x2f08, "\x4e\xba" }, + { 0x2f09, "\x51\x3f" }, + { 0x2f0a, "\x51\x65" }, + { 0x2f0b, "\x51\x6b" }, + { 0x2f0c, "\x51\x82" }, + { 0x2f0d, "\x51\x96" }, + { 0x2f0e, "\x51\xab" }, + { 0x2f0f, "\x51\xe0" }, + { 0x2f10, "\x51\xf5" }, + { 0x2f11, "\x52\x00" }, + { 0x2f12, "\x52\x9b" }, + { 0x2f13, "\x52\xf9" }, + { 0x2f14, "\x53\x15" }, + { 0x2f15, "\x53\x1a" }, + { 0x2f16, "\x53\x38" }, + { 0x2f17, "\x53\x41" }, + { 0x2f18, "\x53\x5c" }, + { 0x2f19, "\x53\x69" }, + { 0x2f1a, "\x53\x82" }, + { 0x2f1b, "\x53\xb6" }, + { 0x2f1c, "\x53\xc8" }, + { 0x2f1d, "\x53\xe3" }, + { 0x2f1e, "\x56\xd7" }, + { 0x2f1f, "\x57\x1f" }, + { 0x2f20, "\x58\xeb" }, + { 0x2f21, "\x59\x02" }, + { 0x2f22, "\x59\x0a" }, + { 0x2f23, "\x59\x15" }, + { 0x2f24, "\x59\x27" }, + { 0x2f25, "\x59\x73" }, + { 0x2f26, "\x5b\x50" }, + { 0x2f27, "\x5b\x80" }, + { 0x2f28, "\x5b\xf8" }, + { 0x2f29, "\x5c\x0f" }, + { 0x2f2a, "\x5c\x22" }, + { 0x2f2b, "\x5c\x38" }, + { 0x2f2c, "\x5c\x6e" }, + { 0x2f2d, "\x5c\x71" }, + { 0x2f2e, "\x5d\xdb" }, + { 0x2f2f, "\x5d\xe5" }, + { 0x2f30, "\x5d\xf1" }, + { 0x2f31, "\x5d\xfe" }, + { 0x2f32, "\x5e\x72" }, + { 0x2f33, "\x5e\x7a" }, + { 0x2f34, "\x5e\x7f" }, + { 0x2f35, "\x5e\xf4" }, + { 0x2f36, "\x5e\xfe" }, + { 0x2f37, "\x5f\x0b" }, + { 0x2f38, "\x5f\x13" }, + { 0x2f39, "\x5f\x50" }, + { 0x2f3a, "\x5f\x61" }, + { 0x2f3b, "\x5f\x73" }, + { 0x2f3c, "\x5f\xc3" }, + { 0x2f3d, "\x62\x08" }, + { 0x2f3e, "\x62\x36" }, + { 0x2f3f, "\x62\x4b" }, + { 0x2f40, "\x65\x2f" }, + { 0x2f41, "\x65\x34" }, + { 0x2f42, "\x65\x87" }, + { 0x2f43, "\x65\x97" }, + { 0x2f44, "\x65\xa4" }, + { 0x2f45, "\x65\xb9" }, + { 0x2f46, "\x65\xe0" }, + { 0x2f47, "\x65\xe5" }, + { 0x2f48, "\x66\xf0" }, + { 0x2f49, "\x67\x08" }, + { 0x2f4a, "\x67\x28" }, + { 0x2f4b, "\x6b\x20" }, + { 0x2f4c, "\x6b\x62" }, + { 0x2f4d, "\x6b\x79" }, + { 0x2f4e, "\x6b\xb3" }, + { 0x2f4f, "\x6b\xcb" }, + { 0x2f50, "\x6b\xd4" }, + { 0x2f51, "\x6b\xdb" }, + { 0x2f52, "\x6c\x0f" }, + { 0x2f53, "\x6c\x14" }, + { 0x2f54, "\x6c\x34" }, + { 0x2f55, "\x70\x6b" }, + { 0x2f56, "\x72\x2a" }, + { 0x2f57, "\x72\x36" }, + { 0x2f58, "\x72\x3b" }, + { 0x2f59, "\x72\x3f" }, + { 0x2f5a, "\x72\x47" }, + { 0x2f5b, "\x72\x59" }, + { 0x2f5c, "\x72\x5b" }, + { 0x2f5d, "\x72\xac" }, + { 0x2f5e, "\x73\x84" }, + { 0x2f5f, "\x73\x89" }, + { 0x2f60, "\x74\xdc" }, + { 0x2f61, "\x74\xe6" }, + { 0x2f62, "\x75\x18" }, + { 0x2f63, "\x75\x1f" }, + { 0x2f64, "\x75\x28" }, + { 0x2f65, "\x75\x30" }, + { 0x2f66, "\x75\x8b" }, + { 0x2f67, "\x75\x92" }, + { 0x2f68, "\x76\x76" }, + { 0x2f69, "\x76\x7d" }, + { 0x2f6a, "\x76\xae" }, + { 0x2f6b, "\x76\xbf" }, + { 0x2f6c, "\x76\xee" }, + { 0x2f6d, "\x77\xdb" }, + { 0x2f6e, "\x77\xe2" }, + { 0x2f6f, "\x77\xf3" }, + { 0x2f70, "\x79\x3a" }, + { 0x2f71, "\x79\xb8" }, + { 0x2f72, "\x79\xbe" }, + { 0x2f73, "\x7a\x74" }, + { 0x2f74, "\x7a\xcb" }, + { 0x2f75, "\x7a\xf9" }, + { 0x2f76, "\x7c\x73" }, + { 0x2f77, "\x7c\xf8" }, + { 0x2f78, "\x7f\x36" }, + { 0x2f79, "\x7f\x51" }, + { 0x2f7a, "\x7f\x8a" }, + { 0x2f7b, "\x7f\xbd" }, + { 0x2f7c, "\x80\x01" }, + { 0x2f7d, "\x80\x0c" }, + { 0x2f7e, "\x80\x12" }, + { 0x2f7f, "\x80\x33" }, + { 0x2f80, "\x80\x7f" }, + { 0x2f81, "\x80\x89" }, + { 0x2f82, "\x81\xe3" }, + { 0x2f83, "\x81\xea" }, + { 0x2f84, "\x81\xf3" }, + { 0x2f85, "\x81\xfc" }, + { 0x2f86, "\x82\x0c" }, + { 0x2f87, "\x82\x1b" }, + { 0x2f88, "\x82\x1f" }, + { 0x2f89, "\x82\x6e" }, + { 0x2f8a, "\x82\x72" }, + { 0x2f8b, "\x82\x78" }, + { 0x2f8c, "\x86\x4d" }, + { 0x2f8d, "\x86\x6b" }, + { 0x2f8e, "\x88\x40" }, + { 0x2f8f, "\x88\x4c" }, + { 0x2f90, "\x88\x63" }, + { 0x2f91, "\x89\x7e" }, + { 0x2f92, "\x89\x8b" }, + { 0x2f93, "\x89\xd2" }, + { 0x2f94, "\x8a\x00" }, + { 0x2f95, "\x8c\x37" }, + { 0x2f96, "\x8c\x46" }, + { 0x2f97, "\x8c\x55" }, + { 0x2f98, "\x8c\x78" }, + { 0x2f99, "\x8c\x9d" }, + { 0x2f9a, "\x8d\x64" }, + { 0x2f9b, "\x8d\x70" }, + { 0x2f9c, "\x8d\xb3" }, + { 0x2f9d, "\x8e\xab" }, + { 0x2f9e, "\x8e\xca" }, + { 0x2f9f, "\x8f\x9b" }, + { 0x2fa0, "\x8f\xb0" }, + { 0x2fa1, "\x8f\xb5" }, + { 0x2fa2, "\x90\x91" }, + { 0x2fa3, "\x91\x49" }, + { 0x2fa4, "\x91\xc6" }, + { 0x2fa5, "\x91\xcc" }, + { 0x2fa6, "\x91\xd1" }, + { 0x2fa7, "\x95\x77" }, + { 0x2fa8, "\x95\x80" }, + { 0x2fa9, "\x96\x1c" }, + { 0x2faa, "\x96\xb6" }, + { 0x2fab, "\x96\xb9" }, + { 0x2fac, "\x96\xe8" }, + { 0x2fad, "\x97\x51" }, + { 0x2fae, "\x97\x5e" }, + { 0x2faf, "\x97\x62" }, + { 0x2fb0, "\x97\x69" }, + { 0x2fb1, "\x97\xcb" }, + { 0x2fb2, "\x97\xed" }, + { 0x2fb3, "\x97\xf3" }, + { 0x2fb4, "\x98\x01" }, + { 0x2fb5, "\x98\xa8" }, + { 0x2fb6, "\x98\xdb" }, + { 0x2fb7, "\x98\xdf" }, + { 0x2fb8, "\x99\x96" }, + { 0x2fb9, "\x99\x99" }, + { 0x2fba, "\x99\xac" }, + { 0x2fbb, "\x9a\xa8" }, + { 0x2fbc, "\x9a\xd8" }, + { 0x2fbd, "\x9a\xdf" }, + { 0x2fbe, "\x9b\x25" }, + { 0x2fbf, "\x9b\x2f" }, + { 0x2fc0, "\x9b\x32" }, + { 0x2fc1, "\x9b\x3c" }, + { 0x2fc2, "\x9b\x5a" }, + { 0x2fc3, "\x9c\xe5" }, + { 0x2fc4, "\x9e\x75" }, + { 0x2fc5, "\x9e\x7f" }, + { 0x2fc6, "\x9e\xa5" }, + { 0x2fc7, "\x9e\xbb" }, + { 0x2fc8, "\x9e\xc3" }, + { 0x2fc9, "\x9e\xcd" }, + { 0x2fca, "\x9e\xd1" }, + { 0x2fcb, "\x9e\xf9" }, + { 0x2fcc, "\x9e\xfd" }, + { 0x2fcd, "\x9f\x0e" }, + { 0x2fce, "\x9f\x13" }, + { 0x2fcf, "\x9f\x20" }, + { 0x2fd0, "\x9f\x3b" }, + { 0x2fd1, "\x9f\x4a" }, + { 0x2fd2, "\x9f\x52" }, + { 0x2fd3, "\x9f\x8d" }, + { 0x2fd4, "\x9f\x9c" }, + { 0x2fd5, "\x9f\xa0" }, { 0x3000, "\x00\x20" }, { 0x3036, "\x30\x12" }, + { 0x3038, "\x53\x41" }, + { 0x3039, "\x53\x44" }, + { 0x303a, "\x53\x45" }, { 0x309b, "\x00\x20\x30\x99" }, { 0x309c, "\x00\x20\x30\x9a" }, { 0x3131, "\x11\x00" }, *************** static const decomp_entry full_decomposi *** 2641,2651 **** { 0xfc5b, "\x06\x30\x06\x70" }, { 0xfc5c, "\x06\x31\x06\x70" }, { 0xfc5d, "\x06\x49\x06\x70" }, ! { 0xfc5e, "\x00\x20\x06\x51\x06\x4c" }, ! { 0xfc5f, "\x00\x20\x06\x51\x06\x4d" }, ! { 0xfc60, "\x00\x20\x06\x51\x06\x4e" }, ! { 0xfc61, "\x00\x20\x06\x51\x06\x4f" }, ! { 0xfc62, "\x00\x20\x06\x51\x06\x50" }, { 0xfc63, "\x00\x20\x06\x51\x06\x70" }, { 0xfc64, "\x06\x26\x06\x31" }, { 0xfc65, "\x06\x26\x06\x32" }, --- 2735,2745 ---- { 0xfc5b, "\x06\x30\x06\x70" }, { 0xfc5c, "\x06\x31\x06\x70" }, { 0xfc5d, "\x06\x49\x06\x70" }, ! { 0xfc5e, "\x00\x20\x06\x4c\x06\x51" }, ! { 0xfc5f, "\x00\x20\x06\x4d\x06\x51" }, ! { 0xfc60, "\x00\x20\x06\x4e\x06\x51" }, ! { 0xfc61, "\x00\x20\x06\x4f\x06\x51" }, ! { 0xfc62, "\x00\x20\x06\x50\x06\x51" }, { 0xfc63, "\x00\x20\x06\x51\x06\x70" }, { 0xfc64, "\x06\x26\x06\x31" }, { 0xfc65, "\x06\x26\x06\x32" }, *************** static const decomp_entry full_decomposi *** 2789,2797 **** { 0xfcef, "\x06\x46\x06\x47" }, { 0xfcf0, "\x06\x4a\x06\x45" }, { 0xfcf1, "\x06\x4a\x06\x47" }, ! { 0xfcf2, "\x06\x40\x06\x51\x06\x4e" }, ! { 0xfcf3, "\x06\x40\x06\x51\x06\x4f" }, ! { 0xfcf4, "\x06\x40\x06\x51\x06\x50" }, { 0xfcf5, "\x06\x37\x06\x49" }, { 0xfcf6, "\x06\x37\x06\x4a" }, { 0xfcf7, "\x06\x39\x06\x49" }, --- 2883,2891 ---- { 0xfcef, "\x06\x46\x06\x47" }, { 0xfcf0, "\x06\x4a\x06\x45" }, { 0xfcf1, "\x06\x4a\x06\x47" }, ! { 0xfcf2, "\x06\x40\x06\x4e\x06\x51" }, ! { 0xfcf3, "\x06\x40\x06\x4f\x06\x51" }, ! { 0xfcf4, "\x06\x40\x06\x50\x06\x51" }, { 0xfcf5, "\x06\x37\x06\x49" }, { 0xfcf6, "\x06\x37\x06\x4a" }, { 0xfcf7, "\x06\x39\x06\x49" }, diff -Nrc3pad gcc-3.0.4/libjava/include/java-chartables.h gcc-3.1/libjava/include/java-chartables.h *** gcc-3.0.4/libjava/include/java-chartables.h Wed Apr 7 14:52:34 1999 --- gcc-3.1/libjava/include/java-chartables.h Wed Mar 6 19:12:51 2002 *************** *** 1,82984 **** ! // java-chartables.h - Character tables for java.lang.Character -*- c++ -*- ! #ifndef __JAVA_CHARTABLES_H__ ! #define __JAVA_CHARTABLES_H__ ! // These tables are automatically generated by the chartables.pl ! // script. DO NOT EDIT the tables. Instead, fix the script ! // and run it again. ! // This file should only be included by natCharacter.cc ! static const jchar title_to_lower_table[][2] = ! { ! { 0x01c5, 0x01c6 }, // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON ! { 0x01c8, 0x01c9 }, // LATIN CAPITAL LETTER L WITH SMALL LETTER J ! { 0x01cb, 0x01cc }, // LATIN CAPITAL LETTER N WITH SMALL LETTER J ! { 0x01f2, 0x01f3 } // LATIN CAPITAL LETTER D WITH SMALL LETTER Z ! }; ! static const jchar title_to_upper_table[][2] = ! { ! { 0x01c5, 0x01c4 }, // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON ! { 0x01c8, 0x01c7 }, // LATIN CAPITAL LETTER L WITH SMALL LETTER J ! { 0x01cb, 0x01ca }, // LATIN CAPITAL LETTER N WITH SMALL LETTER J ! { 0x01f2, 0x01f1 } // LATIN CAPITAL LETTER D WITH SMALL LETTER Z ! }; ! #ifdef COMPACT_CHARACTER ! #define TAMIL_DIGIT_ONE 0x0be7 ! static const jchar numeric_table[] = ! { 0x00b2, 0x00b3, 0x00b9, 0x00bc, 0x00bd, ! 0x00be, 0x09f4, 0x09f5, 0x09f6, 0x09f7, ! 0x09f8, 0x09f9, 0x0bf0, 0x0bf1, 0x0bf2, ! 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, ! 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, ! 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, ! 0x2088, 0x2089, 0x2153, 0x2154, 0x2155, ! 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, ! 0x215b, 0x215c, 0x215d, 0x215e, 0x215f, ! 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, ! 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, ! 0x216a, 0x216b, 0x216c, 0x216d, 0x216e, ! 0x216f, 0x2170, 0x2171, 0x2172, 0x2173, ! 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, ! 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, ! 0x217e, 0x217f, 0x2180, 0x2181, 0x2182, ! 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, ! 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, ! 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, ! 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, ! 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, ! 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, ! 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, ! 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, ! 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, ! 0x248d, 0x248e, 0x248f, 0x2490, 0x2491, ! 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, ! 0x2497, 0x2498, 0x2499, 0x249a, 0x249b, ! 0x24ea, 0x2776, 0x2777, 0x2778, 0x2779, ! 0x277a, 0x277b, 0x277c, 0x277d, 0x277e, ! 0x277f, 0x2780, 0x2781, 0x2782, 0x2783, ! 0x2784, 0x2785, 0x2786, 0x2787, 0x2788, ! 0x2789, 0x278a, 0x278b, 0x278c, 0x278d, ! 0x278e, 0x278f, 0x2790, 0x2791, 0x2792, ! 0x2793, 0x3007, 0x3021, 0x3022, 0x3023, ! 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, ! 0x3029, 0x3280, 0x3281, 0x3282, 0x3283, ! 0x3284, 0x3285, 0x3286, 0x3287, 0x3288, ! 0x3289 }; ! static const jshort numeric_value[] = ! { 2, 3, 1, -2, -2, -2, 1, 2, 3, 4, ! -2, 16, 10, 100, 1000, 0, 4, 5, 6, 7, ! 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, ! 8, 9, -2, -2, -2, -2, -2, -2, -2, -2, ! -2, -2, -2, -2, 1, 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, 11, 12, 50, 100, 500, ! 1000, 1, 2, 3, 4, 5, 6, 7, 8, 9, ! 10, 11, 12, 50, 100, 500, 1000, 1000, 5000, 10000, ! 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ! 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ! 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ! 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ! 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ! 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ! 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ! 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, ! 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, ! 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, ! 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, ! 10 }; ! static const jchar digit_table[][2] = ! { ! { 0x0030, 0x0039 }, ! { 0x0660, 0x0669 }, ! { 0x06f0, 0x06f9 }, ! { 0x0966, 0x096f }, ! { 0x09e6, 0x09ef }, ! { 0x0a66, 0x0a6f }, ! { 0x0ae6, 0x0aef }, ! { 0x0b66, 0x0b6f }, ! { 0x0be7, 0x0bef }, ! { 0x0c66, 0x0c6f }, ! { 0x0ce6, 0x0cef }, ! { 0x0d66, 0x0d6f }, ! { 0x0e50, 0x0e59 }, ! { 0x0ed0, 0x0ed9 }, ! { 0x0f20, 0x0f29 }, ! { 0xff10, 0xff19 } ! }; ! static const jchar space_table[][2] = ! { ! { 0x0020, 0x0020 }, ! { 0x00a0, 0x00a0 }, ! { 0x2000, 0x200b }, ! { 0x2028, 0x2029 }, ! { 0x3000, 0x3000 } ! }; ! static const jchar upper_case_table[][2] = ! { ! { 0x0041, 0x005a }, ! { 0x00c0, 0x00d6 }, ! { 0x00d8, 0x00de }, ! { 0x0100, 0x0100 }, ! { 0x0102, 0x0102 }, ! { 0x0104, 0x0104 }, ! { 0x0106, 0x0106 }, ! { 0x0108, 0x0108 }, ! { 0x010a, 0x010a }, ! { 0x010c, 0x010c }, ! { 0x010e, 0x010e }, ! { 0x0110, 0x0110 }, ! { 0x0112, 0x0112 }, ! { 0x0114, 0x0114 }, ! { 0x0116, 0x0116 }, ! { 0x0118, 0x0118 }, ! { 0x011a, 0x011a }, ! { 0x011c, 0x011c }, ! { 0x011e, 0x011e }, ! { 0x0120, 0x0120 }, ! { 0x0122, 0x0122 }, ! { 0x0124, 0x0124 }, ! { 0x0126, 0x0126 }, ! { 0x0128, 0x0128 }, ! { 0x012a, 0x012a }, ! { 0x012c, 0x012c }, ! { 0x012e, 0x012e }, ! { 0x0130, 0x0130 }, ! { 0x0132, 0x0132 }, ! { 0x0134, 0x0134 }, ! { 0x0136, 0x0136 }, ! { 0x0139, 0x0139 }, ! { 0x013b, 0x013b }, ! { 0x013d, 0x013d }, ! { 0x013f, 0x013f }, ! { 0x0141, 0x0141 }, ! { 0x0143, 0x0143 }, ! { 0x0145, 0x0145 }, ! { 0x0147, 0x0147 }, ! { 0x014a, 0x014a }, ! { 0x014c, 0x014c }, ! { 0x014e, 0x014e }, ! { 0x0150, 0x0150 }, ! { 0x0152, 0x0152 }, ! { 0x0154, 0x0154 }, ! { 0x0156, 0x0156 }, ! { 0x0158, 0x0158 }, ! { 0x015a, 0x015a }, ! { 0x015c, 0x015c }, ! { 0x015e, 0x015e }, ! { 0x0160, 0x0160 }, ! { 0x0162, 0x0162 }, ! { 0x0164, 0x0164 }, ! { 0x0166, 0x0166 }, ! { 0x0168, 0x0168 }, ! { 0x016a, 0x016a }, ! { 0x016c, 0x016c }, ! { 0x016e, 0x016e }, ! { 0x0170, 0x0170 }, ! { 0x0172, 0x0172 }, ! { 0x0174, 0x0174 }, ! { 0x0176, 0x0176 }, ! { 0x0178, 0x0178 }, ! { 0x0179, 0x0179 }, ! { 0x017b, 0x017b }, ! { 0x017d, 0x017d }, ! { 0x0181, 0x0181 }, ! { 0x0182, 0x0182 }, ! { 0x0184, 0x0184 }, ! { 0x0186, 0x0186 }, ! { 0x0187, 0x0187 }, ! { 0x0189, 0x018a }, ! { 0x018b, 0x018b }, ! { 0x018e, 0x018e }, ! { 0x018f, 0x018f }, ! { 0x0190, 0x0190 }, ! { 0x0191, 0x0191 }, ! { 0x0193, 0x0193 }, ! { 0x0194, 0x0194 }, ! { 0x0196, 0x0196 }, ! { 0x0197, 0x0197 }, ! { 0x0198, 0x0198 }, ! { 0x019c, 0x019c }, ! { 0x019d, 0x019d }, ! { 0x019f, 0x019f }, ! { 0x01a0, 0x01a0 }, ! { 0x01a2, 0x01a2 }, ! { 0x01a4, 0x01a4 }, ! { 0x01a6, 0x01a6 }, ! { 0x01a7, 0x01a7 }, ! { 0x01a9, 0x01a9 }, ! { 0x01ac, 0x01ac }, ! { 0x01ae, 0x01ae }, ! { 0x01af, 0x01af }, ! { 0x01b1, 0x01b2 }, ! { 0x01b3, 0x01b3 }, ! { 0x01b5, 0x01b5 }, ! { 0x01b7, 0x01b7 }, ! { 0x01b8, 0x01b8 }, ! { 0x01bc, 0x01bc }, ! { 0x01c4, 0x01c4 }, ! { 0x01c7, 0x01c7 }, ! { 0x01ca, 0x01ca }, ! { 0x01cd, 0x01cd }, ! { 0x01cf, 0x01cf }, ! { 0x01d1, 0x01d1 }, ! { 0x01d3, 0x01d3 }, ! { 0x01d5, 0x01d5 }, ! { 0x01d7, 0x01d7 }, ! { 0x01d9, 0x01d9 }, ! { 0x01db, 0x01db }, ! { 0x01de, 0x01de }, ! { 0x01e0, 0x01e0 }, ! { 0x01e2, 0x01e2 }, ! { 0x01e4, 0x01e4 }, ! { 0x01e6, 0x01e6 }, ! { 0x01e8, 0x01e8 }, ! { 0x01ea, 0x01ea }, ! { 0x01ec, 0x01ec }, ! { 0x01ee, 0x01ee }, ! { 0x01f1, 0x01f1 }, ! { 0x01f4, 0x01f4 }, ! { 0x01fa, 0x01fa }, ! { 0x01fc, 0x01fc }, ! { 0x01fe, 0x01fe }, ! { 0x0200, 0x0200 }, ! { 0x0202, 0x0202 }, ! { 0x0204, 0x0204 }, ! { 0x0206, 0x0206 }, ! { 0x0208, 0x0208 }, ! { 0x020a, 0x020a }, ! { 0x020c, 0x020c }, ! { 0x020e, 0x020e }, ! { 0x0210, 0x0210 }, ! { 0x0212, 0x0212 }, ! { 0x0214, 0x0214 }, ! { 0x0216, 0x0216 }, ! { 0x0386, 0x0386 }, ! { 0x0388, 0x038a }, ! { 0x038c, 0x038c }, ! { 0x038e, 0x038f }, ! { 0x0391, 0x03a1 }, ! { 0x03a3, 0x03ab }, ! { 0x03e2, 0x03e2 }, ! { 0x03e4, 0x03e4 }, ! { 0x03e6, 0x03e6 }, ! { 0x03e8, 0x03e8 }, ! { 0x03ea, 0x03ea }, ! { 0x03ec, 0x03ec }, ! { 0x03ee, 0x03ee }, ! { 0x0401, 0x040c }, ! { 0x040e, 0x040f }, ! { 0x0410, 0x042f }, ! { 0x0460, 0x0460 }, ! { 0x0462, 0x0462 }, ! { 0x0464, 0x0464 }, ! { 0x0466, 0x0466 }, ! { 0x0468, 0x0468 }, ! { 0x046a, 0x046a }, ! { 0x046c, 0x046c }, ! { 0x046e, 0x046e }, ! { 0x0470, 0x0470 }, ! { 0x0472, 0x0472 }, ! { 0x0474, 0x0474 }, ! { 0x0476, 0x0476 }, ! { 0x0478, 0x0478 }, ! { 0x047a, 0x047a }, ! { 0x047c, 0x047c }, ! { 0x047e, 0x047e }, ! { 0x0480, 0x0480 }, ! { 0x0490, 0x0490 }, ! { 0x0492, 0x0492 }, ! { 0x0494, 0x0494 }, ! { 0x0496, 0x0496 }, ! { 0x0498, 0x0498 }, ! { 0x049a, 0x049a }, ! { 0x049c, 0x049c }, ! { 0x049e, 0x049e }, ! { 0x04a0, 0x04a0 }, ! { 0x04a2, 0x04a2 }, ! { 0x04a4, 0x04a4 }, ! { 0x04a6, 0x04a6 }, ! { 0x04a8, 0x04a8 }, ! { 0x04aa, 0x04aa }, ! { 0x04ac, 0x04ac }, ! { 0x04ae, 0x04ae }, ! { 0x04b0, 0x04b0 }, ! { 0x04b2, 0x04b2 }, ! { 0x04b4, 0x04b4 }, ! { 0x04b6, 0x04b6 }, ! { 0x04b8, 0x04b8 }, ! { 0x04ba, 0x04ba }, ! { 0x04bc, 0x04bc }, ! { 0x04be, 0x04be }, ! { 0x04c1, 0x04c1 }, ! { 0x04c3, 0x04c3 }, ! { 0x04c7, 0x04c7 }, ! { 0x04cb, 0x04cb }, ! { 0x04d0, 0x04d0 }, ! { 0x04d2, 0x04d2 }, ! { 0x04d4, 0x04d4 }, ! { 0x04d6, 0x04d6 }, ! { 0x04d8, 0x04d8 }, ! { 0x04da, 0x04da }, ! { 0x04dc, 0x04dc }, ! { 0x04de, 0x04de }, ! { 0x04e0, 0x04e0 }, ! { 0x04e2, 0x04e2 }, ! { 0x04e4, 0x04e4 }, ! { 0x04e6, 0x04e6 }, ! { 0x04e8, 0x04e8 }, ! { 0x04ea, 0x04ea }, ! { 0x04ee, 0x04ee }, ! { 0x04f0, 0x04f0 }, ! { 0x04f2, 0x04f2 }, ! { 0x04f4, 0x04f4 }, ! { 0x04f8, 0x04f8 }, ! { 0x0531, 0x0556 }, ! { 0x10a0, 0x10c5 }, ! { 0x1e00, 0x1e00 }, ! { 0x1e02, 0x1e02 }, ! { 0x1e04, 0x1e04 }, ! { 0x1e06, 0x1e06 }, ! { 0x1e08, 0x1e08 }, ! { 0x1e0a, 0x1e0a }, ! { 0x1e0c, 0x1e0c }, ! { 0x1e0e, 0x1e0e }, ! { 0x1e10, 0x1e10 }, ! { 0x1e12, 0x1e12 }, ! { 0x1e14, 0x1e14 }, ! { 0x1e16, 0x1e16 }, ! { 0x1e18, 0x1e18 }, ! { 0x1e1a, 0x1e1a }, ! { 0x1e1c, 0x1e1c }, ! { 0x1e1e, 0x1e1e }, ! { 0x1e20, 0x1e20 }, ! { 0x1e22, 0x1e22 }, ! { 0x1e24, 0x1e24 }, ! { 0x1e26, 0x1e26 }, ! { 0x1e28, 0x1e28 }, ! { 0x1e2a, 0x1e2a }, ! { 0x1e2c, 0x1e2c }, ! { 0x1e2e, 0x1e2e }, ! { 0x1e30, 0x1e30 }, ! { 0x1e32, 0x1e32 }, ! { 0x1e34, 0x1e34 }, ! { 0x1e36, 0x1e36 }, ! { 0x1e38, 0x1e38 }, ! { 0x1e3a, 0x1e3a }, ! { 0x1e3c, 0x1e3c }, ! { 0x1e3e, 0x1e3e }, ! { 0x1e40, 0x1e40 }, ! { 0x1e42, 0x1e42 }, ! { 0x1e44, 0x1e44 }, ! { 0x1e46, 0x1e46 }, ! { 0x1e48, 0x1e48 }, ! { 0x1e4a, 0x1e4a }, ! { 0x1e4c, 0x1e4c }, ! { 0x1e4e, 0x1e4e }, ! { 0x1e50, 0x1e50 }, ! { 0x1e52, 0x1e52 }, ! { 0x1e54, 0x1e54 }, ! { 0x1e56, 0x1e56 }, ! { 0x1e58, 0x1e58 }, ! { 0x1e5a, 0x1e5a }, ! { 0x1e5c, 0x1e5c }, ! { 0x1e5e, 0x1e5e }, ! { 0x1e60, 0x1e60 }, ! { 0x1e62, 0x1e62 }, ! { 0x1e64, 0x1e64 }, ! { 0x1e66, 0x1e66 }, ! { 0x1e68, 0x1e68 }, ! { 0x1e6a, 0x1e6a }, ! { 0x1e6c, 0x1e6c }, ! { 0x1e6e, 0x1e6e }, ! { 0x1e70, 0x1e70 }, ! { 0x1e72, 0x1e72 }, ! { 0x1e74, 0x1e74 }, ! { 0x1e76, 0x1e76 }, ! { 0x1e78, 0x1e78 }, ! { 0x1e7a, 0x1e7a }, ! { 0x1e7c, 0x1e7c }, ! { 0x1e7e, 0x1e7e }, ! { 0x1e80, 0x1e80 }, ! { 0x1e82, 0x1e82 }, ! { 0x1e84, 0x1e84 }, ! { 0x1e86, 0x1e86 }, ! { 0x1e88, 0x1e88 }, ! { 0x1e8a, 0x1e8a }, ! { 0x1e8c, 0x1e8c }, ! { 0x1e8e, 0x1e8e }, ! { 0x1e90, 0x1e90 }, ! { 0x1e92, 0x1e92 }, ! { 0x1e94, 0x1e94 }, ! { 0x1ea0, 0x1ea0 }, ! { 0x1ea2, 0x1ea2 }, ! { 0x1ea4, 0x1ea4 }, ! { 0x1ea6, 0x1ea6 }, ! { 0x1ea8, 0x1ea8 }, ! { 0x1eaa, 0x1eaa }, ! { 0x1eac, 0x1eac }, ! { 0x1eae, 0x1eae }, ! { 0x1eb0, 0x1eb0 }, ! { 0x1eb2, 0x1eb2 }, ! { 0x1eb4, 0x1eb4 }, ! { 0x1eb6, 0x1eb6 }, ! { 0x1eb8, 0x1eb8 }, ! { 0x1eba, 0x1eba }, ! { 0x1ebc, 0x1ebc }, ! { 0x1ebe, 0x1ebe }, ! { 0x1ec0, 0x1ec0 }, ! { 0x1ec2, 0x1ec2 }, ! { 0x1ec4, 0x1ec4 }, ! { 0x1ec6, 0x1ec6 }, ! { 0x1ec8, 0x1ec8 }, ! { 0x1eca, 0x1eca }, ! { 0x1ecc, 0x1ecc }, ! { 0x1ece, 0x1ece }, ! { 0x1ed0, 0x1ed0 }, ! { 0x1ed2, 0x1ed2 }, ! { 0x1ed4, 0x1ed4 }, ! { 0x1ed6, 0x1ed6 }, ! { 0x1ed8, 0x1ed8 }, ! { 0x1eda, 0x1eda }, ! { 0x1edc, 0x1edc }, ! { 0x1ede, 0x1ede }, ! { 0x1ee0, 0x1ee0 }, ! { 0x1ee2, 0x1ee2 }, ! { 0x1ee4, 0x1ee4 }, ! { 0x1ee6, 0x1ee6 }, ! { 0x1ee8, 0x1ee8 }, ! { 0x1eea, 0x1eea }, ! { 0x1eec, 0x1eec }, ! { 0x1eee, 0x1eee }, ! { 0x1ef0, 0x1ef0 }, ! { 0x1ef2, 0x1ef2 }, ! { 0x1ef4, 0x1ef4 }, ! { 0x1ef6, 0x1ef6 }, ! { 0x1ef8, 0x1ef8 }, ! { 0x1f08, 0x1f0f }, ! { 0x1f18, 0x1f1d }, ! { 0x1f28, 0x1f2f }, ! { 0x1f38, 0x1f3f }, ! { 0x1f48, 0x1f4d }, ! { 0x1f59, 0x1f59 }, ! { 0x1f5b, 0x1f5b }, ! { 0x1f5d, 0x1f5d }, ! { 0x1f5f, 0x1f5f }, ! { 0x1f68, 0x1f6f }, ! { 0x1f88, 0x1f8f }, ! { 0x1f98, 0x1f9f }, ! { 0x1fa8, 0x1faf }, ! { 0x1fb8, 0x1fb9 }, ! { 0x1fba, 0x1fbb }, ! { 0x1fbc, 0x1fbc }, ! { 0x1fc8, 0x1fcb }, ! { 0x1fcc, 0x1fcc }, ! { 0x1fd8, 0x1fd9 }, ! { 0x1fda, 0x1fdb }, ! { 0x1fe8, 0x1fe9 }, ! { 0x1fea, 0x1feb }, ! { 0x1fec, 0x1fec }, ! { 0x1ff8, 0x1ff9 }, ! { 0x1ffa, 0x1ffb }, ! { 0x1ffc, 0x1ffc }, ! { 0x2160, 0x216f }, ! { 0x24b6, 0x24cf }, ! { 0xff21, 0xff3a } }; ! static const jchar upper_case_map_table[] = ! { 0x0061, 0x00e0, 0x00f8, 0x0101, 0x0103, ! 0x0105, 0x0107, 0x0109, 0x010b, 0x010d, ! 0x010f, 0x0111, 0x0113, 0x0115, 0x0117, ! 0x0119, 0x011b, 0x011d, 0x011f, 0x0121, ! 0x0123, 0x0125, 0x0127, 0x0129, 0x012b, ! 0x012d, 0x012f, 0x0069, 0x0133, 0x0135, ! 0x0137, 0x013a, 0x013c, 0x013e, 0x0140, ! 0x0142, 0x0144, 0x0146, 0x0148, 0x014b, ! 0x014d, 0x014f, 0x0151, 0x0153, 0x0155, ! 0x0157, 0x0159, 0x015b, 0x015d, 0x015f, ! 0x0161, 0x0163, 0x0165, 0x0167, 0x0169, ! 0x016b, 0x016d, 0x016f, 0x0171, 0x0173, ! 0x0175, 0x0177, 0x00ff, 0x017a, 0x017c, ! 0x017e, 0x0253, 0x0183, 0x0185, 0x0254, ! 0x0188, 0x0256, 0x018c, 0x01dd, 0x0259, ! 0x025b, 0x0192, 0x0260, 0x0263, 0x0269, ! 0x0268, 0x0199, 0x026f, 0x0272, 0x0275, ! 0x01a1, 0x01a3, 0x01a5, 0x0280, 0x01a8, ! 0x0283, 0x01ad, 0x0288, 0x01b0, 0x028a, ! 0x01b4, 0x01b6, 0x0292, 0x01b9, 0x01bd, ! 0x01c6, 0x01c9, 0x01cc, 0x01ce, 0x01d0, ! 0x01d2, 0x01d4, 0x01d6, 0x01d8, 0x01da, ! 0x01dc, 0x01df, 0x01e1, 0x01e3, 0x01e5, ! 0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, ! 0x01f3, 0x01f5, 0x01fb, 0x01fd, 0x01ff, ! 0x0201, 0x0203, 0x0205, 0x0207, 0x0209, ! 0x020b, 0x020d, 0x020f, 0x0211, 0x0213, ! 0x0215, 0x0217, 0x03ac, 0x03ad, 0x03cc, ! 0x03cd, 0x03b1, 0x03c3, 0x03e3, 0x03e5, ! 0x03e7, 0x03e9, 0x03eb, 0x03ed, 0x03ef, ! 0x0451, 0x045e, 0x0430, 0x0461, 0x0463, ! 0x0465, 0x0467, 0x0469, 0x046b, 0x046d, ! 0x046f, 0x0471, 0x0473, 0x0475, 0x0477, ! 0x0479, 0x047b, 0x047d, 0x047f, 0x0481, ! 0x0491, 0x0493, 0x0495, 0x0497, 0x0499, ! 0x049b, 0x049d, 0x049f, 0x04a1, 0x04a3, ! 0x04a5, 0x04a7, 0x04a9, 0x04ab, 0x04ad, ! 0x04af, 0x04b1, 0x04b3, 0x04b5, 0x04b7, ! 0x04b9, 0x04bb, 0x04bd, 0x04bf, 0x04c2, ! 0x04c4, 0x04c8, 0x04cc, 0x04d1, 0x04d3, ! 0x04d5, 0x04d7, 0x04d9, 0x04db, 0x04dd, ! 0x04df, 0x04e1, 0x04e3, 0x04e5, 0x04e7, ! 0x04e9, 0x04eb, 0x04ef, 0x04f1, 0x04f3, ! 0x04f5, 0x04f9, 0x0561, 0x10d0, 0x1e01, ! 0x1e03, 0x1e05, 0x1e07, 0x1e09, 0x1e0b, ! 0x1e0d, 0x1e0f, 0x1e11, 0x1e13, 0x1e15, ! 0x1e17, 0x1e19, 0x1e1b, 0x1e1d, 0x1e1f, ! 0x1e21, 0x1e23, 0x1e25, 0x1e27, 0x1e29, ! 0x1e2b, 0x1e2d, 0x1e2f, 0x1e31, 0x1e33, ! 0x1e35, 0x1e37, 0x1e39, 0x1e3b, 0x1e3d, ! 0x1e3f, 0x1e41, 0x1e43, 0x1e45, 0x1e47, ! 0x1e49, 0x1e4b, 0x1e4d, 0x1e4f, 0x1e51, ! 0x1e53, 0x1e55, 0x1e57, 0x1e59, 0x1e5b, ! 0x1e5d, 0x1e5f, 0x1e61, 0x1e63, 0x1e65, ! 0x1e67, 0x1e69, 0x1e6b, 0x1e6d, 0x1e6f, ! 0x1e71, 0x1e73, 0x1e75, 0x1e77, 0x1e79, ! 0x1e7b, 0x1e7d, 0x1e7f, 0x1e81, 0x1e83, ! 0x1e85, 0x1e87, 0x1e89, 0x1e8b, 0x1e8d, ! 0x1e8f, 0x1e91, 0x1e93, 0x1e95, 0x1ea1, ! 0x1ea3, 0x1ea5, 0x1ea7, 0x1ea9, 0x1eab, ! 0x1ead, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, ! 0x1eb7, 0x1eb9, 0x1ebb, 0x1ebd, 0x1ebf, ! 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, 0x1ec9, ! 0x1ecb, 0x1ecd, 0x1ecf, 0x1ed1, 0x1ed3, ! 0x1ed5, 0x1ed7, 0x1ed9, 0x1edb, 0x1edd, ! 0x1edf, 0x1ee1, 0x1ee3, 0x1ee5, 0x1ee7, ! 0x1ee9, 0x1eeb, 0x1eed, 0x1eef, 0x1ef1, ! 0x1ef3, 0x1ef5, 0x1ef7, 0x1ef9, 0x1f00, ! 0x1f10, 0x1f20, 0x1f30, 0x1f40, 0x1f51, ! 0x1f53, 0x1f55, 0x1f57, 0x1f60, 0x1f80, ! 0x1f90, 0x1fa0, 0x1fb0, 0x1f70, 0x1fb3, ! 0x1f72, 0x1fc3, 0x1fd0, 0x1f76, 0x1fe0, ! 0x1f7a, 0x1fe5, 0x1f78, 0x1f7c, 0x1ff3, ! 0x2170, 0x24d0, 0xff41 }; ! ! static const jchar lower_case_table[][2] = ! { ! { 0x0061, 0x007a }, ! { 0x00e0, 0x00f6 }, ! { 0x00f8, 0x00fe }, ! { 0x00ff, 0x00ff }, ! { 0x0101, 0x0101 }, ! { 0x0103, 0x0103 }, ! { 0x0105, 0x0105 }, ! { 0x0107, 0x0107 }, ! { 0x0109, 0x0109 }, ! { 0x010b, 0x010b }, ! { 0x010d, 0x010d }, ! { 0x010f, 0x010f }, ! { 0x0111, 0x0111 }, ! { 0x0113, 0x0113 }, ! { 0x0115, 0x0115 }, ! { 0x0117, 0x0117 }, ! { 0x0119, 0x0119 }, ! { 0x011b, 0x011b }, ! { 0x011d, 0x011d }, ! { 0x011f, 0x011f }, ! { 0x0121, 0x0121 }, ! { 0x0123, 0x0123 }, ! { 0x0125, 0x0125 }, ! { 0x0127, 0x0127 }, ! { 0x0129, 0x0129 }, ! { 0x012b, 0x012b }, ! { 0x012d, 0x012d }, ! { 0x012f, 0x012f }, ! { 0x0131, 0x0131 }, ! { 0x0133, 0x0133 }, ! { 0x0135, 0x0135 }, ! { 0x0137, 0x0137 }, ! { 0x013a, 0x013a }, ! { 0x013c, 0x013c }, ! { 0x013e, 0x013e }, ! { 0x0140, 0x0140 }, ! { 0x0142, 0x0142 }, ! { 0x0144, 0x0144 }, ! { 0x0146, 0x0146 }, ! { 0x0148, 0x0148 }, ! { 0x014b, 0x014b }, ! { 0x014d, 0x014d }, ! { 0x014f, 0x014f }, ! { 0x0151, 0x0151 }, ! { 0x0153, 0x0153 }, ! { 0x0155, 0x0155 }, ! { 0x0157, 0x0157 }, ! { 0x0159, 0x0159 }, ! { 0x015b, 0x015b }, ! { 0x015d, 0x015d }, ! { 0x015f, 0x015f }, ! { 0x0161, 0x0161 }, ! { 0x0163, 0x0163 }, ! { 0x0165, 0x0165 }, ! { 0x0167, 0x0167 }, ! { 0x0169, 0x0169 }, ! { 0x016b, 0x016b }, ! { 0x016d, 0x016d }, ! { 0x016f, 0x016f }, ! { 0x0171, 0x0171 }, ! { 0x0173, 0x0173 }, ! { 0x0175, 0x0175 }, ! { 0x0177, 0x0177 }, ! { 0x017a, 0x017a }, ! { 0x017c, 0x017c }, ! { 0x017e, 0x017e }, ! { 0x017f, 0x017f }, ! { 0x0183, 0x0183 }, ! { 0x0185, 0x0185 }, ! { 0x0188, 0x0188 }, ! { 0x018c, 0x018c }, ! { 0x0192, 0x0192 }, ! { 0x0199, 0x0199 }, ! { 0x01a1, 0x01a1 }, ! { 0x01a3, 0x01a3 }, ! { 0x01a5, 0x01a5 }, ! { 0x01a8, 0x01a8 }, ! { 0x01ad, 0x01ad }, ! { 0x01b0, 0x01b0 }, ! { 0x01b4, 0x01b4 }, ! { 0x01b6, 0x01b6 }, ! { 0x01b9, 0x01b9 }, ! { 0x01bd, 0x01bd }, ! { 0x01c6, 0x01c6 }, ! { 0x01c9, 0x01c9 }, ! { 0x01cc, 0x01cc }, ! { 0x01ce, 0x01ce }, ! { 0x01d0, 0x01d0 }, ! { 0x01d2, 0x01d2 }, ! { 0x01d4, 0x01d4 }, ! { 0x01d6, 0x01d6 }, ! { 0x01d8, 0x01d8 }, ! { 0x01da, 0x01da }, ! { 0x01dc, 0x01dc }, ! { 0x01dd, 0x01dd }, ! { 0x01df, 0x01df }, ! { 0x01e1, 0x01e1 }, ! { 0x01e3, 0x01e3 }, ! { 0x01e5, 0x01e5 }, ! { 0x01e7, 0x01e7 }, ! { 0x01e9, 0x01e9 }, ! { 0x01eb, 0x01eb }, ! { 0x01ed, 0x01ed }, ! { 0x01ef, 0x01ef }, ! { 0x01f3, 0x01f3 }, ! { 0x01f5, 0x01f5 }, ! { 0x01fb, 0x01fb }, ! { 0x01fd, 0x01fd }, ! { 0x01ff, 0x01ff }, ! { 0x0201, 0x0201 }, ! { 0x0203, 0x0203 }, ! { 0x0205, 0x0205 }, ! { 0x0207, 0x0207 }, ! { 0x0209, 0x0209 }, ! { 0x020b, 0x020b }, ! { 0x020d, 0x020d }, ! { 0x020f, 0x020f }, ! { 0x0211, 0x0211 }, ! { 0x0213, 0x0213 }, ! { 0x0215, 0x0215 }, ! { 0x0217, 0x0217 }, ! { 0x0253, 0x0253 }, ! { 0x0254, 0x0254 }, ! { 0x0256, 0x0257 }, ! { 0x0259, 0x0259 }, ! { 0x025b, 0x025b }, ! { 0x0260, 0x0260 }, ! { 0x0263, 0x0263 }, ! { 0x0268, 0x0268 }, ! { 0x0269, 0x0269 }, ! { 0x026f, 0x026f }, ! { 0x0272, 0x0272 }, ! { 0x0275, 0x0275 }, ! { 0x0280, 0x0280 }, ! { 0x0283, 0x0283 }, ! { 0x0288, 0x0288 }, ! { 0x028a, 0x028b }, ! { 0x0292, 0x0292 }, ! { 0x0345, 0x0345 }, ! { 0x03ac, 0x03ac }, ! { 0x03ad, 0x03af }, ! { 0x03b1, 0x03c1 }, ! { 0x03c2, 0x03c2 }, ! { 0x03c3, 0x03cb }, ! { 0x03cc, 0x03cc }, ! { 0x03cd, 0x03ce }, ! { 0x03d0, 0x03d0 }, ! { 0x03d1, 0x03d1 }, ! { 0x03d5, 0x03d5 }, ! { 0x03d6, 0x03d6 }, ! { 0x03e3, 0x03e3 }, ! { 0x03e5, 0x03e5 }, ! { 0x03e7, 0x03e7 }, ! { 0x03e9, 0x03e9 }, ! { 0x03eb, 0x03eb }, ! { 0x03ed, 0x03ed }, ! { 0x03ef, 0x03ef }, ! { 0x03f0, 0x03f0 }, ! { 0x03f1, 0x03f1 }, ! { 0x03f2, 0x03f2 }, ! { 0x0430, 0x044f }, ! { 0x0451, 0x045c }, ! { 0x045e, 0x045f }, ! { 0x0461, 0x0461 }, ! { 0x0463, 0x0463 }, ! { 0x0465, 0x0465 }, ! { 0x0467, 0x0467 }, ! { 0x0469, 0x0469 }, ! { 0x046b, 0x046b }, ! { 0x046d, 0x046d }, ! { 0x046f, 0x046f }, ! { 0x0471, 0x0471 }, ! { 0x0473, 0x0473 }, ! { 0x0475, 0x0475 }, ! { 0x0477, 0x0477 }, ! { 0x0479, 0x0479 }, ! { 0x047b, 0x047b }, ! { 0x047d, 0x047d }, ! { 0x047f, 0x047f }, ! { 0x0481, 0x0481 }, ! { 0x0491, 0x0491 }, ! { 0x0493, 0x0493 }, ! { 0x0495, 0x0495 }, ! { 0x0497, 0x0497 }, ! { 0x0499, 0x0499 }, ! { 0x049b, 0x049b }, ! { 0x049d, 0x049d }, ! { 0x049f, 0x049f }, ! { 0x04a1, 0x04a1 }, ! { 0x04a3, 0x04a3 }, ! { 0x04a5, 0x04a5 }, ! { 0x04a7, 0x04a7 }, ! { 0x04a9, 0x04a9 }, ! { 0x04ab, 0x04ab }, ! { 0x04ad, 0x04ad }, ! { 0x04af, 0x04af }, ! { 0x04b1, 0x04b1 }, ! { 0x04b3, 0x04b3 }, ! { 0x04b5, 0x04b5 }, ! { 0x04b7, 0x04b7 }, ! { 0x04b9, 0x04b9 }, ! { 0x04bb, 0x04bb }, ! { 0x04bd, 0x04bd }, ! { 0x04bf, 0x04bf }, ! { 0x04c2, 0x04c2 }, ! { 0x04c4, 0x04c4 }, ! { 0x04c8, 0x04c8 }, ! { 0x04cc, 0x04cc }, ! { 0x04d1, 0x04d1 }, ! { 0x04d3, 0x04d3 }, ! { 0x04d5, 0x04d5 }, ! { 0x04d7, 0x04d7 }, ! { 0x04d9, 0x04d9 }, ! { 0x04db, 0x04db }, ! { 0x04dd, 0x04dd }, ! { 0x04df, 0x04df }, ! { 0x04e1, 0x04e1 }, ! { 0x04e3, 0x04e3 }, ! { 0x04e5, 0x04e5 }, ! { 0x04e7, 0x04e7 }, ! { 0x04e9, 0x04e9 }, ! { 0x04eb, 0x04eb }, ! { 0x04ef, 0x04ef }, ! { 0x04f1, 0x04f1 }, ! { 0x04f3, 0x04f3 }, ! { 0x04f5, 0x04f5 }, ! { 0x04f9, 0x04f9 }, ! { 0x0561, 0x0586 }, ! { 0x1e01, 0x1e01 }, ! { 0x1e03, 0x1e03 }, ! { 0x1e05, 0x1e05 }, ! { 0x1e07, 0x1e07 }, ! { 0x1e09, 0x1e09 }, ! { 0x1e0b, 0x1e0b }, ! { 0x1e0d, 0x1e0d }, ! { 0x1e0f, 0x1e0f }, ! { 0x1e11, 0x1e11 }, ! { 0x1e13, 0x1e13 }, ! { 0x1e15, 0x1e15 }, ! { 0x1e17, 0x1e17 }, ! { 0x1e19, 0x1e19 }, ! { 0x1e1b, 0x1e1b }, ! { 0x1e1d, 0x1e1d }, ! { 0x1e1f, 0x1e1f }, ! { 0x1e21, 0x1e21 }, ! { 0x1e23, 0x1e23 }, ! { 0x1e25, 0x1e25 }, ! { 0x1e27, 0x1e27 }, ! { 0x1e29, 0x1e29 }, ! { 0x1e2b, 0x1e2b }, ! { 0x1e2d, 0x1e2d }, ! { 0x1e2f, 0x1e2f }, ! { 0x1e31, 0x1e31 }, ! { 0x1e33, 0x1e33 }, ! { 0x1e35, 0x1e35 }, ! { 0x1e37, 0x1e37 }, ! { 0x1e39, 0x1e39 }, ! { 0x1e3b, 0x1e3b }, ! { 0x1e3d, 0x1e3d }, ! { 0x1e3f, 0x1e3f }, ! { 0x1e41, 0x1e41 }, ! { 0x1e43, 0x1e43 }, ! { 0x1e45, 0x1e45 }, ! { 0x1e47, 0x1e47 }, ! { 0x1e49, 0x1e49 }, ! { 0x1e4b, 0x1e4b }, ! { 0x1e4d, 0x1e4d }, ! { 0x1e4f, 0x1e4f }, ! { 0x1e51, 0x1e51 }, ! { 0x1e53, 0x1e53 }, ! { 0x1e55, 0x1e55 }, ! { 0x1e57, 0x1e57 }, ! { 0x1e59, 0x1e59 }, ! { 0x1e5b, 0x1e5b }, ! { 0x1e5d, 0x1e5d }, ! { 0x1e5f, 0x1e5f }, ! { 0x1e61, 0x1e61 }, ! { 0x1e63, 0x1e63 }, ! { 0x1e65, 0x1e65 }, ! { 0x1e67, 0x1e67 }, ! { 0x1e69, 0x1e69 }, ! { 0x1e6b, 0x1e6b }, ! { 0x1e6d, 0x1e6d }, ! { 0x1e6f, 0x1e6f }, ! { 0x1e71, 0x1e71 }, ! { 0x1e73, 0x1e73 }, ! { 0x1e75, 0x1e75 }, ! { 0x1e77, 0x1e77 }, ! { 0x1e79, 0x1e79 }, ! { 0x1e7b, 0x1e7b }, ! { 0x1e7d, 0x1e7d }, ! { 0x1e7f, 0x1e7f }, ! { 0x1e81, 0x1e81 }, ! { 0x1e83, 0x1e83 }, ! { 0x1e85, 0x1e85 }, ! { 0x1e87, 0x1e87 }, ! { 0x1e89, 0x1e89 }, ! { 0x1e8b, 0x1e8b }, ! { 0x1e8d, 0x1e8d }, ! { 0x1e8f, 0x1e8f }, ! { 0x1e91, 0x1e91 }, ! { 0x1e93, 0x1e93 }, ! { 0x1e95, 0x1e95 }, ! { 0x1e9b, 0x1e9b }, ! { 0x1ea1, 0x1ea1 }, ! { 0x1ea3, 0x1ea3 }, ! { 0x1ea5, 0x1ea5 }, ! { 0x1ea7, 0x1ea7 }, ! { 0x1ea9, 0x1ea9 }, ! { 0x1eab, 0x1eab }, ! { 0x1ead, 0x1ead }, ! { 0x1eaf, 0x1eaf }, ! { 0x1eb1, 0x1eb1 }, ! { 0x1eb3, 0x1eb3 }, ! { 0x1eb5, 0x1eb5 }, ! { 0x1eb7, 0x1eb7 }, ! { 0x1eb9, 0x1eb9 }, ! { 0x1ebb, 0x1ebb }, ! { 0x1ebd, 0x1ebd }, ! { 0x1ebf, 0x1ebf }, ! { 0x1ec1, 0x1ec1 }, ! { 0x1ec3, 0x1ec3 }, ! { 0x1ec5, 0x1ec5 }, ! { 0x1ec7, 0x1ec7 }, ! { 0x1ec9, 0x1ec9 }, ! { 0x1ecb, 0x1ecb }, ! { 0x1ecd, 0x1ecd }, ! { 0x1ecf, 0x1ecf }, ! { 0x1ed1, 0x1ed1 }, ! { 0x1ed3, 0x1ed3 }, ! { 0x1ed5, 0x1ed5 }, ! { 0x1ed7, 0x1ed7 }, ! { 0x1ed9, 0x1ed9 }, ! { 0x1edb, 0x1edb }, ! { 0x1edd, 0x1edd }, ! { 0x1edf, 0x1edf }, ! { 0x1ee1, 0x1ee1 }, ! { 0x1ee3, 0x1ee3 }, ! { 0x1ee5, 0x1ee5 }, ! { 0x1ee7, 0x1ee7 }, ! { 0x1ee9, 0x1ee9 }, ! { 0x1eeb, 0x1eeb }, ! { 0x1eed, 0x1eed }, ! { 0x1eef, 0x1eef }, ! { 0x1ef1, 0x1ef1 }, ! { 0x1ef3, 0x1ef3 }, ! { 0x1ef5, 0x1ef5 }, ! { 0x1ef7, 0x1ef7 }, ! { 0x1ef9, 0x1ef9 }, ! { 0x1f00, 0x1f07 }, ! { 0x1f10, 0x1f15 }, ! { 0x1f20, 0x1f27 }, ! { 0x1f30, 0x1f37 }, ! { 0x1f40, 0x1f45 }, ! { 0x1f51, 0x1f51 }, ! { 0x1f53, 0x1f53 }, ! { 0x1f55, 0x1f55 }, ! { 0x1f57, 0x1f57 }, ! { 0x1f60, 0x1f67 }, ! { 0x1f70, 0x1f71 }, ! { 0x1f72, 0x1f75 }, ! { 0x1f76, 0x1f77 }, ! { 0x1f78, 0x1f79 }, ! { 0x1f7a, 0x1f7b }, ! { 0x1f7c, 0x1f7d }, ! { 0x1f80, 0x1f87 }, ! { 0x1f90, 0x1f97 }, ! { 0x1fa0, 0x1fa7 }, ! { 0x1fb0, 0x1fb1 }, ! { 0x1fb3, 0x1fb3 }, ! { 0x1fbe, 0x1fbe }, ! { 0x1fc3, 0x1fc3 }, ! { 0x1fd0, 0x1fd1 }, ! { 0x1fe0, 0x1fe1 }, ! { 0x1fe5, 0x1fe5 }, ! { 0x1ff3, 0x1ff3 }, ! { 0x2170, 0x217f }, ! { 0x24d0, 0x24e9 }, ! { 0xff41, 0xff5a } }; ! static const jchar lower_case_map_table[] = ! { 0x0041, 0x00c0, 0x00d8, 0x0178, 0x0100, ! 0x0102, 0x0104, 0x0106, 0x0108, 0x010a, ! 0x010c, 0x010e, 0x0110, 0x0112, 0x0114, ! 0x0116, 0x0118, 0x011a, 0x011c, 0x011e, ! 0x0120, 0x0122, 0x0124, 0x0126, 0x0128, ! 0x012a, 0x012c, 0x012e, 0x0049, 0x0132, ! 0x0134, 0x0136, 0x0139, 0x013b, 0x013d, ! 0x013f, 0x0141, 0x0143, 0x0145, 0x0147, ! 0x014a, 0x014c, 0x014e, 0x0150, 0x0152, ! 0x0154, 0x0156, 0x0158, 0x015a, 0x015c, ! 0x015e, 0x0160, 0x0162, 0x0164, 0x0166, ! 0x0168, 0x016a, 0x016c, 0x016e, 0x0170, ! 0x0172, 0x0174, 0x0176, 0x0179, 0x017b, ! 0x017d, 0x0053, 0x0182, 0x0184, 0x0187, ! 0x018b, 0x0191, 0x0198, 0x01a0, 0x01a2, ! 0x01a4, 0x01a7, 0x01ac, 0x01af, 0x01b3, ! 0x01b5, 0x01b8, 0x01bc, 0x01c4, 0x01c7, ! 0x01ca, 0x01cd, 0x01cf, 0x01d1, 0x01d3, ! 0x01d5, 0x01d7, 0x01d9, 0x01db, 0x018e, ! 0x01de, 0x01e0, 0x01e2, 0x01e4, 0x01e6, ! 0x01e8, 0x01ea, 0x01ec, 0x01ee, 0x01f1, ! 0x01f4, 0x01fa, 0x01fc, 0x01fe, 0x0200, ! 0x0202, 0x0204, 0x0206, 0x0208, 0x020a, ! 0x020c, 0x020e, 0x0210, 0x0212, 0x0214, ! 0x0216, 0x0181, 0x0186, 0x0189, 0x018f, ! 0x0190, 0x0193, 0x0194, 0x0197, 0x0196, ! 0x019c, 0x019d, 0x019f, 0x01a6, 0x01a9, ! 0x01ae, 0x01b1, 0x01b7, 0x0399, 0x0386, ! 0x0388, 0x0391, 0x03a3, 0x03a3, 0x038c, ! 0x038e, 0x0392, 0x0398, 0x03a6, 0x03a0, ! 0x03e2, 0x03e4, 0x03e6, 0x03e8, 0x03ea, ! 0x03ec, 0x03ee, 0x039a, 0x03a1, 0x03a3, ! 0x0410, 0x0401, 0x040e, 0x0460, 0x0462, ! 0x0464, 0x0466, 0x0468, 0x046a, 0x046c, ! 0x046e, 0x0470, 0x0472, 0x0474, 0x0476, ! 0x0478, 0x047a, 0x047c, 0x047e, 0x0480, ! 0x0490, 0x0492, 0x0494, 0x0496, 0x0498, ! 0x049a, 0x049c, 0x049e, 0x04a0, 0x04a2, ! 0x04a4, 0x04a6, 0x04a8, 0x04aa, 0x04ac, ! 0x04ae, 0x04b0, 0x04b2, 0x04b4, 0x04b6, ! 0x04b8, 0x04ba, 0x04bc, 0x04be, 0x04c1, ! 0x04c3, 0x04c7, 0x04cb, 0x04d0, 0x04d2, ! 0x04d4, 0x04d6, 0x04d8, 0x04da, 0x04dc, ! 0x04de, 0x04e0, 0x04e2, 0x04e4, 0x04e6, ! 0x04e8, 0x04ea, 0x04ee, 0x04f0, 0x04f2, ! 0x04f4, 0x04f8, 0x0531, 0x1e00, 0x1e02, ! 0x1e04, 0x1e06, 0x1e08, 0x1e0a, 0x1e0c, ! 0x1e0e, 0x1e10, 0x1e12, 0x1e14, 0x1e16, ! 0x1e18, 0x1e1a, 0x1e1c, 0x1e1e, 0x1e20, ! 0x1e22, 0x1e24, 0x1e26, 0x1e28, 0x1e2a, ! 0x1e2c, 0x1e2e, 0x1e30, 0x1e32, 0x1e34, ! 0x1e36, 0x1e38, 0x1e3a, 0x1e3c, 0x1e3e, ! 0x1e40, 0x1e42, 0x1e44, 0x1e46, 0x1e48, ! 0x1e4a, 0x1e4c, 0x1e4e, 0x1e50, 0x1e52, ! 0x1e54, 0x1e56, 0x1e58, 0x1e5a, 0x1e5c, ! 0x1e5e, 0x1e60, 0x1e62, 0x1e64, 0x1e66, ! 0x1e68, 0x1e6a, 0x1e6c, 0x1e6e, 0x1e70, ! 0x1e72, 0x1e74, 0x1e76, 0x1e78, 0x1e7a, ! 0x1e7c, 0x1e7e, 0x1e80, 0x1e82, 0x1e84, ! 0x1e86, 0x1e88, 0x1e8a, 0x1e8c, 0x1e8e, ! 0x1e90, 0x1e92, 0x1e94, 0x1e60, 0x1ea0, ! 0x1ea2, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, ! 0x1eac, 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, ! 0x1eb6, 0x1eb8, 0x1eba, 0x1ebc, 0x1ebe, ! 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ec8, ! 0x1eca, 0x1ecc, 0x1ece, 0x1ed0, 0x1ed2, ! 0x1ed4, 0x1ed6, 0x1ed8, 0x1eda, 0x1edc, ! 0x1ede, 0x1ee0, 0x1ee2, 0x1ee4, 0x1ee6, ! 0x1ee8, 0x1eea, 0x1eec, 0x1eee, 0x1ef0, ! 0x1ef2, 0x1ef4, 0x1ef6, 0x1ef8, 0x1f08, ! 0x1f18, 0x1f28, 0x1f38, 0x1f48, 0x1f59, ! 0x1f5b, 0x1f5d, 0x1f5f, 0x1f68, 0x1fba, ! 0x1fc8, 0x1fda, 0x1ff8, 0x1fea, 0x1ffa, ! 0x1f88, 0x1f98, 0x1fa8, 0x1fb8, 0x1fbc, ! 0x0399, 0x1fcc, 0x1fd8, 0x1fe8, 0x1fec, ! 0x1ffc, 0x2160, 0x24b6, 0xff21 }; ! ! static const jchar lower_anomalous_table[] = ! { 0x00df, 0x0138, 0x0149, 0x0180, 0x018d, ! 0x0195, 0x019a, 0x019b, 0x019e, 0x01ab, ! 0x01ba, 0x01f0, 0x0250, 0x0251, 0x0252, ! 0x0255, 0x0258, 0x025a, 0x025c, 0x025d, ! 0x025e, 0x025f, 0x0261, 0x0264, 0x0265, ! 0x0266, 0x0267, 0x026b, 0x026c, 0x026d, ! 0x026e, 0x0270, 0x0271, 0x0273, 0x0277, ! 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, ! 0x027d, 0x027e, 0x027f, 0x0282, 0x0284, ! 0x0285, 0x0286, 0x0287, 0x0289, 0x028c, ! 0x028d, 0x028e, 0x0290, 0x0291, 0x0293, ! 0x029a, 0x029d, 0x029e, 0x02a0, 0x02a3, ! 0x02a4, 0x02a5, 0x02a6, 0x02a7, 0x02a8, ! 0x0390, 0x03b0, 0x0587, 0x1e96, 0x1e97, ! 0x1e98, 0x1e99, 0x1e9a, 0x1f50, 0x1f52, ! 0x1f54, 0x1f56, 0x1fb2, 0x1fb4, 0x1fb6, ! 0x1fb7, 0x1fc2, 0x1fc4, 0x1fc6, 0x1fc7, ! 0x1fd2, 0x1fd3, 0x1fd6, 0x1fd7, 0x1fe2, ! 0x1fe3, 0x1fe4, 0x1fe6, 0x1fe7, 0x1ff2, ! 0x1ff4, 0x1ff6, 0x1ff7, 0x207f, 0x2129, ! 0x249c, 0x249d, 0x249e, 0x249f, 0x24a0, ! 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, ! 0x24a6, 0x24a7, 0x24a8, 0x24a9, 0x24aa, ! 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, ! 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, ! 0x24b5, 0xfb00, 0xfb01, 0xfb02, 0xfb03, ! 0xfb04, 0xfb05, 0xfb06, 0xfb13, 0xfb14, ! 0xfb15, 0xfb16, 0xfb17 }; ! ! static const jchar all_table[][2] = ! { ! { 0x0000, 0x001f }, ! { 0x0020, 0x0020 }, ! { 0x0021, 0x0023 }, ! { 0x0024, 0x0024 }, ! { 0x0025, 0x0027 }, ! { 0x0028, 0x0028 }, ! { 0x0029, 0x0029 }, ! { 0x002a, 0x002a }, ! { 0x002b, 0x002b }, ! { 0x002c, 0x002c }, ! { 0x002d, 0x002d }, ! { 0x002e, 0x002f }, ! { 0x0030, 0x0039 }, ! { 0x003a, 0x003b }, ! { 0x003c, 0x003e }, ! { 0x003f, 0x0040 }, ! { 0x0041, 0x005a }, ! { 0x005b, 0x005b }, ! { 0x005c, 0x005c }, ! { 0x005d, 0x005d }, ! { 0x005e, 0x005e }, ! { 0x005f, 0x005f }, ! { 0x0060, 0x0060 }, ! { 0x0061, 0x007a }, ! { 0x007b, 0x007b }, ! { 0x007c, 0x007c }, ! { 0x007d, 0x007d }, ! { 0x007e, 0x007e }, ! { 0x007f, 0x009f }, ! { 0x00a0, 0x00a0 }, ! { 0x00a1, 0x00a1 }, ! { 0x00a2, 0x00a5 }, ! { 0x00a6, 0x00a7 }, ! { 0x00a8, 0x00a8 }, ! { 0x00a9, 0x00a9 }, ! { 0x00aa, 0x00aa }, ! { 0x00ab, 0x00ab }, ! { 0x00ac, 0x00ac }, ! { 0x00ad, 0x00ad }, ! { 0x00ae, 0x00ae }, ! { 0x00af, 0x00af }, ! { 0x00b0, 0x00b0 }, ! { 0x00b1, 0x00b1 }, ! { 0x00b2, 0x00b3 }, ! { 0x00b4, 0x00b4 }, ! { 0x00b5, 0x00b5 }, ! { 0x00b6, 0x00b6 }, ! { 0x00b7, 0x00b7 }, ! { 0x00b8, 0x00b8 }, ! { 0x00b9, 0x00b9 }, ! { 0x00ba, 0x00ba }, ! { 0x00bb, 0x00bb }, ! { 0x00bc, 0x00be }, ! { 0x00bf, 0x00bf }, ! { 0x00c0, 0x00d6 }, ! { 0x00d7, 0x00d7 }, ! { 0x00d8, 0x00de }, ! { 0x00df, 0x00f6 }, ! { 0x00f7, 0x00f7 }, ! { 0x00f8, 0x00ff }, ! { 0x0100, 0x0100 }, ! { 0x0101, 0x0101 }, ! { 0x0102, 0x0102 }, ! { 0x0103, 0x0103 }, ! { 0x0104, 0x0104 }, ! { 0x0105, 0x0105 }, ! { 0x0106, 0x0106 }, ! { 0x0107, 0x0107 }, ! { 0x0108, 0x0108 }, ! { 0x0109, 0x0109 }, ! { 0x010a, 0x010a }, ! { 0x010b, 0x010b }, ! { 0x010c, 0x010c }, ! { 0x010d, 0x010d }, ! { 0x010e, 0x010e }, ! { 0x010f, 0x010f }, ! { 0x0110, 0x0110 }, ! { 0x0111, 0x0111 }, ! { 0x0112, 0x0112 }, ! { 0x0113, 0x0113 }, ! { 0x0114, 0x0114 }, ! { 0x0115, 0x0115 }, ! { 0x0116, 0x0116 }, ! { 0x0117, 0x0117 }, ! { 0x0118, 0x0118 }, ! { 0x0119, 0x0119 }, ! { 0x011a, 0x011a }, ! { 0x011b, 0x011b }, ! { 0x011c, 0x011c }, ! { 0x011d, 0x011d }, ! { 0x011e, 0x011e }, ! { 0x011f, 0x011f }, ! { 0x0120, 0x0120 }, ! { 0x0121, 0x0121 }, ! { 0x0122, 0x0122 }, ! { 0x0123, 0x0123 }, ! { 0x0124, 0x0124 }, ! { 0x0125, 0x0125 }, ! { 0x0126, 0x0126 }, ! { 0x0127, 0x0127 }, ! { 0x0128, 0x0128 }, ! { 0x0129, 0x0129 }, ! { 0x012a, 0x012a }, ! { 0x012b, 0x012b }, ! { 0x012c, 0x012c }, ! { 0x012d, 0x012d }, ! { 0x012e, 0x012e }, ! { 0x012f, 0x012f }, ! { 0x0130, 0x0130 }, ! { 0x0131, 0x0131 }, ! { 0x0132, 0x0132 }, ! { 0x0133, 0x0133 }, ! { 0x0134, 0x0134 }, ! { 0x0135, 0x0135 }, ! { 0x0136, 0x0136 }, ! { 0x0137, 0x0138 }, ! { 0x0139, 0x0139 }, ! { 0x013a, 0x013a }, ! { 0x013b, 0x013b }, ! { 0x013c, 0x013c }, ! { 0x013d, 0x013d }, ! { 0x013e, 0x013e }, ! { 0x013f, 0x013f }, ! { 0x0140, 0x0140 }, ! { 0x0141, 0x0141 }, ! { 0x0142, 0x0142 }, ! { 0x0143, 0x0143 }, ! { 0x0144, 0x0144 }, ! { 0x0145, 0x0145 }, ! { 0x0146, 0x0146 }, ! { 0x0147, 0x0147 }, ! { 0x0148, 0x0149 }, ! { 0x014a, 0x014a }, ! { 0x014b, 0x014b }, ! { 0x014c, 0x014c }, ! { 0x014d, 0x014d }, ! { 0x014e, 0x014e }, ! { 0x014f, 0x014f }, ! { 0x0150, 0x0150 }, ! { 0x0151, 0x0151 }, ! { 0x0152, 0x0152 }, ! { 0x0153, 0x0153 }, ! { 0x0154, 0x0154 }, ! { 0x0155, 0x0155 }, ! { 0x0156, 0x0156 }, ! { 0x0157, 0x0157 }, ! { 0x0158, 0x0158 }, ! { 0x0159, 0x0159 }, ! { 0x015a, 0x015a }, ! { 0x015b, 0x015b }, ! { 0x015c, 0x015c }, ! { 0x015d, 0x015d }, ! { 0x015e, 0x015e }, ! { 0x015f, 0x015f }, ! { 0x0160, 0x0160 }, ! { 0x0161, 0x0161 }, ! { 0x0162, 0x0162 }, ! { 0x0163, 0x0163 }, ! { 0x0164, 0x0164 }, ! { 0x0165, 0x0165 }, ! { 0x0166, 0x0166 }, ! { 0x0167, 0x0167 }, ! { 0x0168, 0x0168 }, ! { 0x0169, 0x0169 }, ! { 0x016a, 0x016a }, ! { 0x016b, 0x016b }, ! { 0x016c, 0x016c }, ! { 0x016d, 0x016d }, ! { 0x016e, 0x016e }, ! { 0x016f, 0x016f }, ! { 0x0170, 0x0170 }, ! { 0x0171, 0x0171 }, ! { 0x0172, 0x0172 }, ! { 0x0173, 0x0173 }, ! { 0x0174, 0x0174 }, ! { 0x0175, 0x0175 }, ! { 0x0176, 0x0176 }, ! { 0x0177, 0x0177 }, ! { 0x0178, 0x0179 }, ! { 0x017a, 0x017a }, ! { 0x017b, 0x017b }, ! { 0x017c, 0x017c }, ! { 0x017d, 0x017d }, ! { 0x017e, 0x0180 }, ! { 0x0181, 0x0182 }, ! { 0x0183, 0x0183 }, ! { 0x0184, 0x0184 }, ! { 0x0185, 0x0185 }, ! { 0x0186, 0x0187 }, ! { 0x0188, 0x0188 }, ! { 0x0189, 0x018b }, ! { 0x018c, 0x018d }, ! { 0x018e, 0x0191 }, ! { 0x0192, 0x0192 }, ! { 0x0193, 0x0194 }, ! { 0x0195, 0x0195 }, ! { 0x0196, 0x0198 }, ! { 0x0199, 0x019b }, ! { 0x019c, 0x019d }, ! { 0x019e, 0x019e }, ! { 0x019f, 0x01a0 }, ! { 0x01a1, 0x01a1 }, ! { 0x01a2, 0x01a2 }, ! { 0x01a3, 0x01a3 }, ! { 0x01a4, 0x01a4 }, ! { 0x01a5, 0x01a5 }, ! { 0x01a6, 0x01a7 }, ! { 0x01a8, 0x01a8 }, ! { 0x01a9, 0x01a9 }, ! { 0x01aa, 0x01aa }, ! { 0x01ab, 0x01ab }, ! { 0x01ac, 0x01ac }, ! { 0x01ad, 0x01ad }, ! { 0x01ae, 0x01af }, ! { 0x01b0, 0x01b0 }, ! { 0x01b1, 0x01b3 }, ! { 0x01b4, 0x01b4 }, ! { 0x01b5, 0x01b5 }, ! { 0x01b6, 0x01b6 }, ! { 0x01b7, 0x01b8 }, ! { 0x01b9, 0x01ba }, ! { 0x01bb, 0x01bb }, ! { 0x01bc, 0x01bc }, ! { 0x01bd, 0x01bd }, ! { 0x01be, 0x01c3 }, ! { 0x01c4, 0x01c4 }, ! { 0x01c5, 0x01c5 }, ! { 0x01c6, 0x01c6 }, ! { 0x01c7, 0x01c7 }, ! { 0x01c8, 0x01c8 }, ! { 0x01c9, 0x01c9 }, ! { 0x01ca, 0x01ca }, ! { 0x01cb, 0x01cb }, ! { 0x01cc, 0x01cc }, ! { 0x01cd, 0x01cd }, ! { 0x01ce, 0x01ce }, ! { 0x01cf, 0x01cf }, ! { 0x01d0, 0x01d0 }, ! { 0x01d1, 0x01d1 }, ! { 0x01d2, 0x01d2 }, ! { 0x01d3, 0x01d3 }, ! { 0x01d4, 0x01d4 }, ! { 0x01d5, 0x01d5 }, ! { 0x01d6, 0x01d6 }, ! { 0x01d7, 0x01d7 }, ! { 0x01d8, 0x01d8 }, ! { 0x01d9, 0x01d9 }, ! { 0x01da, 0x01da }, ! { 0x01db, 0x01db }, ! { 0x01dc, 0x01dd }, ! { 0x01de, 0x01de }, ! { 0x01df, 0x01df }, ! { 0x01e0, 0x01e0 }, ! { 0x01e1, 0x01e1 }, ! { 0x01e2, 0x01e2 }, ! { 0x01e3, 0x01e3 }, ! { 0x01e4, 0x01e4 }, ! { 0x01e5, 0x01e5 }, ! { 0x01e6, 0x01e6 }, ! { 0x01e7, 0x01e7 }, ! { 0x01e8, 0x01e8 }, ! { 0x01e9, 0x01e9 }, ! { 0x01ea, 0x01ea }, ! { 0x01eb, 0x01eb }, ! { 0x01ec, 0x01ec }, ! { 0x01ed, 0x01ed }, ! { 0x01ee, 0x01ee }, ! { 0x01ef, 0x01f0 }, ! { 0x01f1, 0x01f1 }, ! { 0x01f2, 0x01f2 }, ! { 0x01f3, 0x01f3 }, ! { 0x01f4, 0x01f4 }, ! { 0x01f5, 0x01f5 }, ! { 0x01f6, 0x01f9 }, ! { 0x01fa, 0x01fa }, ! { 0x01fb, 0x01fb }, ! { 0x01fc, 0x01fc }, ! { 0x01fd, 0x01fd }, ! { 0x01fe, 0x01fe }, ! { 0x01ff, 0x01ff }, ! { 0x0200, 0x0200 }, ! { 0x0201, 0x0201 }, ! { 0x0202, 0x0202 }, ! { 0x0203, 0x0203 }, ! { 0x0204, 0x0204 }, ! { 0x0205, 0x0205 }, ! { 0x0206, 0x0206 }, ! { 0x0207, 0x0207 }, ! { 0x0208, 0x0208 }, ! { 0x0209, 0x0209 }, ! { 0x020a, 0x020a }, ! { 0x020b, 0x020b }, ! { 0x020c, 0x020c }, ! { 0x020d, 0x020d }, ! { 0x020e, 0x020e }, ! { 0x020f, 0x020f }, ! { 0x0210, 0x0210 }, ! { 0x0211, 0x0211 }, ! { 0x0212, 0x0212 }, ! { 0x0213, 0x0213 }, ! { 0x0214, 0x0214 }, ! { 0x0215, 0x0215 }, ! { 0x0216, 0x0216 }, ! { 0x0217, 0x0217 }, ! { 0x0218, 0x024f }, ! { 0x0250, 0x02a8 }, ! { 0x02a9, 0x02af }, ! { 0x02b0, 0x02b8 }, ! { 0x02b9, 0x02ba }, ! { 0x02bb, 0x02c1 }, ! { 0x02c2, 0x02cf }, ! { 0x02d0, 0x02d1 }, ! { 0x02d2, 0x02de }, ! { 0x02df, 0x02df }, ! { 0x02e0, 0x02e4 }, ! { 0x02e5, 0x02e9 }, ! { 0x02ea, 0x02ff }, ! { 0x0300, 0x0345 }, ! { 0x0346, 0x035f }, ! { 0x0360, 0x0361 }, ! { 0x0362, 0x0373 }, ! { 0x0374, 0x0375 }, ! { 0x0376, 0x0379 }, ! { 0x037a, 0x037a }, ! { 0x037b, 0x037d }, ! { 0x037e, 0x037e }, ! { 0x037f, 0x0383 }, ! { 0x0384, 0x0385 }, ! { 0x0386, 0x0386 }, ! { 0x0387, 0x0387 }, ! { 0x0388, 0x038a }, ! { 0x038b, 0x038b }, ! { 0x038c, 0x038c }, ! { 0x038d, 0x038d }, ! { 0x038e, 0x038f }, ! { 0x0390, 0x0390 }, ! { 0x0391, 0x03a1 }, ! { 0x03a2, 0x03a2 }, ! { 0x03a3, 0x03ab }, ! { 0x03ac, 0x03ce }, ! { 0x03cf, 0x03cf }, ! { 0x03d0, 0x03d1 }, ! { 0x03d2, 0x03d4 }, ! { 0x03d5, 0x03d6 }, ! { 0x03d7, 0x03d9 }, ! { 0x03da, 0x03da }, ! { 0x03db, 0x03db }, ! { 0x03dc, 0x03dc }, ! { 0x03dd, 0x03dd }, ! { 0x03de, 0x03de }, ! { 0x03df, 0x03df }, ! { 0x03e0, 0x03e0 }, ! { 0x03e1, 0x03e1 }, ! { 0x03e2, 0x03e2 }, ! { 0x03e3, 0x03e3 }, ! { 0x03e4, 0x03e4 }, ! { 0x03e5, 0x03e5 }, ! { 0x03e6, 0x03e6 }, ! { 0x03e7, 0x03e7 }, ! { 0x03e8, 0x03e8 }, ! { 0x03e9, 0x03e9 }, ! { 0x03ea, 0x03ea }, ! { 0x03eb, 0x03eb }, ! { 0x03ec, 0x03ec }, ! { 0x03ed, 0x03ed }, ! { 0x03ee, 0x03ee }, ! { 0x03ef, 0x03f2 }, ! { 0x03f3, 0x03f3 }, ! { 0x03f4, 0x0400 }, ! { 0x0401, 0x040c }, ! { 0x040d, 0x040d }, ! { 0x040e, 0x042f }, ! { 0x0430, 0x044f }, ! { 0x0450, 0x0450 }, ! { 0x0451, 0x045c }, ! { 0x045d, 0x045d }, ! { 0x045e, 0x045f }, ! { 0x0460, 0x0460 }, ! { 0x0461, 0x0461 }, ! { 0x0462, 0x0462 }, ! { 0x0463, 0x0463 }, ! { 0x0464, 0x0464 }, ! { 0x0465, 0x0465 }, ! { 0x0466, 0x0466 }, ! { 0x0467, 0x0467 }, ! { 0x0468, 0x0468 }, ! { 0x0469, 0x0469 }, ! { 0x046a, 0x046a }, ! { 0x046b, 0x046b }, ! { 0x046c, 0x046c }, ! { 0x046d, 0x046d }, ! { 0x046e, 0x046e }, ! { 0x046f, 0x046f }, ! { 0x0470, 0x0470 }, ! { 0x0471, 0x0471 }, ! { 0x0472, 0x0472 }, ! { 0x0473, 0x0473 }, ! { 0x0474, 0x0474 }, ! { 0x0475, 0x0475 }, ! { 0x0476, 0x0476 }, ! { 0x0477, 0x0477 }, ! { 0x0478, 0x0478 }, ! { 0x0479, 0x0479 }, ! { 0x047a, 0x047a }, ! { 0x047b, 0x047b }, ! { 0x047c, 0x047c }, ! { 0x047d, 0x047d }, ! { 0x047e, 0x047e }, ! { 0x047f, 0x047f }, ! { 0x0480, 0x0480 }, ! { 0x0481, 0x0481 }, ! { 0x0482, 0x0482 }, ! { 0x0483, 0x0486 }, ! { 0x0487, 0x048f }, ! { 0x0490, 0x0490 }, ! { 0x0491, 0x0491 }, ! { 0x0492, 0x0492 }, ! { 0x0493, 0x0493 }, ! { 0x0494, 0x0494 }, ! { 0x0495, 0x0495 }, ! { 0x0496, 0x0496 }, ! { 0x0497, 0x0497 }, ! { 0x0498, 0x0498 }, ! { 0x0499, 0x0499 }, ! { 0x049a, 0x049a }, ! { 0x049b, 0x049b }, ! { 0x049c, 0x049c }, ! { 0x049d, 0x049d }, ! { 0x049e, 0x049e }, ! { 0x049f, 0x049f }, ! { 0x04a0, 0x04a0 }, ! { 0x04a1, 0x04a1 }, ! { 0x04a2, 0x04a2 }, ! { 0x04a3, 0x04a3 }, ! { 0x04a4, 0x04a4 }, ! { 0x04a5, 0x04a5 }, ! { 0x04a6, 0x04a6 }, ! { 0x04a7, 0x04a7 }, ! { 0x04a8, 0x04a8 }, ! { 0x04a9, 0x04a9 }, ! { 0x04aa, 0x04aa }, ! { 0x04ab, 0x04ab }, ! { 0x04ac, 0x04ac }, ! { 0x04ad, 0x04ad }, ! { 0x04ae, 0x04ae }, ! { 0x04af, 0x04af }, ! { 0x04b0, 0x04b0 }, ! { 0x04b1, 0x04b1 }, ! { 0x04b2, 0x04b2 }, ! { 0x04b3, 0x04b3 }, ! { 0x04b4, 0x04b4 }, ! { 0x04b5, 0x04b5 }, ! { 0x04b6, 0x04b6 }, ! { 0x04b7, 0x04b7 }, ! { 0x04b8, 0x04b8 }, ! { 0x04b9, 0x04b9 }, ! { 0x04ba, 0x04ba }, ! { 0x04bb, 0x04bb }, ! { 0x04bc, 0x04bc }, ! { 0x04bd, 0x04bd }, ! { 0x04be, 0x04be }, ! { 0x04bf, 0x04bf }, ! { 0x04c0, 0x04c0 }, ! { 0x04c1, 0x04c1 }, ! { 0x04c2, 0x04c2 }, ! { 0x04c3, 0x04c3 }, ! { 0x04c4, 0x04c4 }, ! { 0x04c5, 0x04c6 }, ! { 0x04c7, 0x04c7 }, ! { 0x04c8, 0x04c8 }, ! { 0x04c9, 0x04ca }, ! { 0x04cb, 0x04cb }, ! { 0x04cc, 0x04cc }, ! { 0x04cd, 0x04cf }, ! { 0x04d0, 0x04d0 }, ! { 0x04d1, 0x04d1 }, ! { 0x04d2, 0x04d2 }, ! { 0x04d3, 0x04d3 }, ! { 0x04d4, 0x04d4 }, ! { 0x04d5, 0x04d5 }, ! { 0x04d6, 0x04d6 }, ! { 0x04d7, 0x04d7 }, ! { 0x04d8, 0x04d8 }, ! { 0x04d9, 0x04d9 }, ! { 0x04da, 0x04da }, ! { 0x04db, 0x04db }, ! { 0x04dc, 0x04dc }, ! { 0x04dd, 0x04dd }, ! { 0x04de, 0x04de }, ! { 0x04df, 0x04df }, ! { 0x04e0, 0x04e0 }, ! { 0x04e1, 0x04e1 }, ! { 0x04e2, 0x04e2 }, ! { 0x04e3, 0x04e3 }, ! { 0x04e4, 0x04e4 }, ! { 0x04e5, 0x04e5 }, ! { 0x04e6, 0x04e6 }, ! { 0x04e7, 0x04e7 }, ! { 0x04e8, 0x04e8 }, ! { 0x04e9, 0x04e9 }, ! { 0x04ea, 0x04ea }, ! { 0x04eb, 0x04eb }, ! { 0x04ec, 0x04ed }, ! { 0x04ee, 0x04ee }, ! { 0x04ef, 0x04ef }, ! { 0x04f0, 0x04f0 }, ! { 0x04f1, 0x04f1 }, ! { 0x04f2, 0x04f2 }, ! { 0x04f3, 0x04f3 }, ! { 0x04f4, 0x04f4 }, ! { 0x04f5, 0x04f5 }, ! { 0x04f6, 0x04f7 }, ! { 0x04f8, 0x04f8 }, ! { 0x04f9, 0x04f9 }, ! { 0x04fa, 0x0530 }, ! { 0x0531, 0x0556 }, ! { 0x0557, 0x0558 }, ! { 0x0559, 0x0559 }, ! { 0x055a, 0x055f }, ! { 0x0560, 0x0560 }, ! { 0x0561, 0x0587 }, ! { 0x0588, 0x0588 }, ! { 0x0589, 0x0589 }, ! { 0x058a, 0x0590 }, ! { 0x0591, 0x05a1 }, ! { 0x05a2, 0x05a2 }, ! { 0x05a3, 0x05b9 }, ! { 0x05ba, 0x05ba }, ! { 0x05bb, 0x05bd }, ! { 0x05be, 0x05be }, ! { 0x05bf, 0x05bf }, ! { 0x05c0, 0x05c0 }, ! { 0x05c1, 0x05c2 }, ! { 0x05c3, 0x05c3 }, ! { 0x05c4, 0x05c4 }, ! { 0x05c5, 0x05cf }, ! { 0x05d0, 0x05ea }, ! { 0x05eb, 0x05ef }, ! { 0x05f0, 0x05f2 }, ! { 0x05f3, 0x05f4 }, ! { 0x05f5, 0x060b }, ! { 0x060c, 0x060c }, ! { 0x060d, 0x061a }, ! { 0x061b, 0x061b }, ! { 0x061c, 0x061e }, ! { 0x061f, 0x061f }, ! { 0x0620, 0x0620 }, ! { 0x0621, 0x063a }, ! { 0x063b, 0x063f }, ! { 0x0640, 0x0640 }, ! { 0x0641, 0x064a }, ! { 0x064b, 0x0652 }, ! { 0x0653, 0x065f }, ! { 0x0660, 0x0669 }, ! { 0x066a, 0x066d }, ! { 0x066e, 0x066f }, ! { 0x0670, 0x0670 }, ! { 0x0671, 0x06b7 }, ! { 0x06b8, 0x06b9 }, ! { 0x06ba, 0x06be }, ! { 0x06bf, 0x06bf }, ! { 0x06c0, 0x06ce }, ! { 0x06cf, 0x06cf }, ! { 0x06d0, 0x06d3 }, ! { 0x06d4, 0x06d4 }, ! { 0x06d5, 0x06d5 }, ! { 0x06d6, 0x06dc }, ! { 0x06dd, 0x06de }, ! { 0x06df, 0x06e4 }, ! { 0x06e5, 0x06e6 }, ! { 0x06e7, 0x06e8 }, ! { 0x06e9, 0x06e9 }, ! { 0x06ea, 0x06ed }, ! { 0x06ee, 0x06ef }, ! { 0x06f0, 0x06f9 }, ! { 0x06fa, 0x0900 }, ! { 0x0901, 0x0902 }, ! { 0x0903, 0x0903 }, ! { 0x0904, 0x0904 }, ! { 0x0905, 0x0939 }, ! { 0x093a, 0x093b }, ! { 0x093c, 0x093c }, ! { 0x093d, 0x093d }, ! { 0x093e, 0x0940 }, ! { 0x0941, 0x0948 }, ! { 0x0949, 0x094c }, ! { 0x094d, 0x094d }, ! { 0x094e, 0x094f }, ! { 0x0950, 0x0950 }, ! { 0x0951, 0x0954 }, ! { 0x0955, 0x0957 }, ! { 0x0958, 0x0961 }, ! { 0x0962, 0x0963 }, ! { 0x0964, 0x0965 }, ! { 0x0966, 0x096f }, ! { 0x0970, 0x0970 }, ! { 0x0971, 0x0980 }, ! { 0x0981, 0x0981 }, ! { 0x0982, 0x0983 }, ! { 0x0984, 0x0984 }, ! { 0x0985, 0x098c }, ! { 0x098d, 0x098e }, ! { 0x098f, 0x0990 }, ! { 0x0991, 0x0992 }, ! { 0x0993, 0x09a8 }, ! { 0x09a9, 0x09a9 }, ! { 0x09aa, 0x09b0 }, ! { 0x09b1, 0x09b1 }, ! { 0x09b2, 0x09b2 }, ! { 0x09b3, 0x09b5 }, ! { 0x09b6, 0x09b9 }, ! { 0x09ba, 0x09bb }, ! { 0x09bc, 0x09bc }, ! { 0x09bd, 0x09bd }, ! { 0x09be, 0x09c0 }, ! { 0x09c1, 0x09c4 }, ! { 0x09c5, 0x09c6 }, ! { 0x09c7, 0x09c8 }, ! { 0x09c9, 0x09ca }, ! { 0x09cb, 0x09cc }, ! { 0x09cd, 0x09cd }, ! { 0x09ce, 0x09d6 }, ! { 0x09d7, 0x09d7 }, ! { 0x09d8, 0x09db }, ! { 0x09dc, 0x09dd }, ! { 0x09de, 0x09de }, ! { 0x09df, 0x09e1 }, ! { 0x09e2, 0x09e3 }, ! { 0x09e4, 0x09e5 }, ! { 0x09e6, 0x09ef }, ! { 0x09f0, 0x09f1 }, ! { 0x09f2, 0x09f3 }, ! { 0x09f4, 0x09f9 }, ! { 0x09fa, 0x09fa }, ! { 0x09fb, 0x0a01 }, ! { 0x0a02, 0x0a02 }, ! { 0x0a03, 0x0a04 }, ! { 0x0a05, 0x0a0a }, ! { 0x0a0b, 0x0a0e }, ! { 0x0a0f, 0x0a10 }, ! { 0x0a11, 0x0a12 }, ! { 0x0a13, 0x0a28 }, ! { 0x0a29, 0x0a29 }, ! { 0x0a2a, 0x0a30 }, ! { 0x0a31, 0x0a31 }, ! { 0x0a32, 0x0a33 }, ! { 0x0a34, 0x0a34 }, ! { 0x0a35, 0x0a36 }, ! { 0x0a37, 0x0a37 }, ! { 0x0a38, 0x0a39 }, ! { 0x0a3a, 0x0a3b }, ! { 0x0a3c, 0x0a3c }, ! { 0x0a3d, 0x0a3d }, ! { 0x0a3e, 0x0a40 }, ! { 0x0a41, 0x0a42 }, ! { 0x0a43, 0x0a46 }, ! { 0x0a47, 0x0a48 }, ! { 0x0a49, 0x0a4a }, ! { 0x0a4b, 0x0a4d }, ! { 0x0a4e, 0x0a58 }, ! { 0x0a59, 0x0a5c }, ! { 0x0a5d, 0x0a5d }, ! { 0x0a5e, 0x0a5e }, ! { 0x0a5f, 0x0a65 }, ! { 0x0a66, 0x0a6f }, ! { 0x0a70, 0x0a71 }, ! { 0x0a72, 0x0a74 }, ! { 0x0a75, 0x0a80 }, ! { 0x0a81, 0x0a82 }, ! { 0x0a83, 0x0a83 }, ! { 0x0a84, 0x0a84 }, ! { 0x0a85, 0x0a8b }, ! { 0x0a8c, 0x0a8c }, ! { 0x0a8d, 0x0a8d }, ! { 0x0a8e, 0x0a8e }, ! { 0x0a8f, 0x0a91 }, ! { 0x0a92, 0x0a92 }, ! { 0x0a93, 0x0aa8 }, ! { 0x0aa9, 0x0aa9 }, ! { 0x0aaa, 0x0ab0 }, ! { 0x0ab1, 0x0ab1 }, ! { 0x0ab2, 0x0ab3 }, ! { 0x0ab4, 0x0ab4 }, ! { 0x0ab5, 0x0ab9 }, ! { 0x0aba, 0x0abb }, ! { 0x0abc, 0x0abc }, ! { 0x0abd, 0x0abd }, ! { 0x0abe, 0x0ac0 }, ! { 0x0ac1, 0x0ac5 }, ! { 0x0ac6, 0x0ac6 }, ! { 0x0ac7, 0x0ac8 }, ! { 0x0ac9, 0x0ac9 }, ! { 0x0aca, 0x0aca }, ! { 0x0acb, 0x0acc }, ! { 0x0acd, 0x0acd }, ! { 0x0ace, 0x0acf }, ! { 0x0ad0, 0x0ad0 }, ! { 0x0ad1, 0x0adf }, ! { 0x0ae0, 0x0ae0 }, ! { 0x0ae1, 0x0ae5 }, ! { 0x0ae6, 0x0aef }, ! { 0x0af0, 0x0b00 }, ! { 0x0b01, 0x0b01 }, ! { 0x0b02, 0x0b03 }, ! { 0x0b04, 0x0b04 }, ! { 0x0b05, 0x0b0c }, ! { 0x0b0d, 0x0b0e }, ! { 0x0b0f, 0x0b10 }, ! { 0x0b11, 0x0b12 }, ! { 0x0b13, 0x0b28 }, ! { 0x0b29, 0x0b29 }, ! { 0x0b2a, 0x0b30 }, ! { 0x0b31, 0x0b31 }, ! { 0x0b32, 0x0b33 }, ! { 0x0b34, 0x0b35 }, ! { 0x0b36, 0x0b39 }, ! { 0x0b3a, 0x0b3b }, ! { 0x0b3c, 0x0b3c }, ! { 0x0b3d, 0x0b3d }, ! { 0x0b3e, 0x0b3e }, ! { 0x0b3f, 0x0b3f }, ! { 0x0b40, 0x0b40 }, ! { 0x0b41, 0x0b43 }, ! { 0x0b44, 0x0b46 }, ! { 0x0b47, 0x0b48 }, ! { 0x0b49, 0x0b4a }, ! { 0x0b4b, 0x0b4c }, ! { 0x0b4d, 0x0b4d }, ! { 0x0b4e, 0x0b55 }, ! { 0x0b56, 0x0b56 }, ! { 0x0b57, 0x0b57 }, ! { 0x0b58, 0x0b5b }, ! { 0x0b5c, 0x0b5d }, ! { 0x0b5e, 0x0b5e }, ! { 0x0b5f, 0x0b61 }, ! { 0x0b62, 0x0b65 }, ! { 0x0b66, 0x0b6f }, ! { 0x0b70, 0x0b70 }, ! { 0x0b71, 0x0b81 }, ! { 0x0b82, 0x0b82 }, ! { 0x0b83, 0x0b83 }, ! { 0x0b84, 0x0b84 }, ! { 0x0b85, 0x0b8a }, ! { 0x0b8b, 0x0b8d }, ! { 0x0b8e, 0x0b90 }, ! { 0x0b91, 0x0b91 }, ! { 0x0b92, 0x0b95 }, ! { 0x0b96, 0x0b98 }, ! { 0x0b99, 0x0b9a }, ! { 0x0b9b, 0x0b9b }, ! { 0x0b9c, 0x0b9c }, ! { 0x0b9d, 0x0b9d }, ! { 0x0b9e, 0x0b9f }, ! { 0x0ba0, 0x0ba2 }, ! { 0x0ba3, 0x0ba4 }, ! { 0x0ba5, 0x0ba7 }, ! { 0x0ba8, 0x0baa }, ! { 0x0bab, 0x0bad }, ! { 0x0bae, 0x0bb5 }, ! { 0x0bb6, 0x0bb6 }, ! { 0x0bb7, 0x0bb9 }, ! { 0x0bba, 0x0bbd }, ! { 0x0bbe, 0x0bbf }, ! { 0x0bc0, 0x0bc0 }, ! { 0x0bc1, 0x0bc2 }, ! { 0x0bc3, 0x0bc5 }, ! { 0x0bc6, 0x0bc8 }, ! { 0x0bc9, 0x0bc9 }, ! { 0x0bca, 0x0bcc }, ! { 0x0bcd, 0x0bcd }, ! { 0x0bce, 0x0bd6 }, ! { 0x0bd7, 0x0bd7 }, ! { 0x0bd8, 0x0be6 }, ! { 0x0be7, 0x0bef }, ! { 0x0bf0, 0x0bf2 }, ! { 0x0bf3, 0x0c00 }, ! { 0x0c01, 0x0c03 }, ! { 0x0c04, 0x0c04 }, ! { 0x0c05, 0x0c0c }, ! { 0x0c0d, 0x0c0d }, ! { 0x0c0e, 0x0c10 }, ! { 0x0c11, 0x0c11 }, ! { 0x0c12, 0x0c28 }, ! { 0x0c29, 0x0c29 }, ! { 0x0c2a, 0x0c33 }, ! { 0x0c34, 0x0c34 }, ! { 0x0c35, 0x0c39 }, ! { 0x0c3a, 0x0c3d }, ! { 0x0c3e, 0x0c40 }, ! { 0x0c41, 0x0c44 }, ! { 0x0c45, 0x0c45 }, ! { 0x0c46, 0x0c48 }, ! { 0x0c49, 0x0c49 }, ! { 0x0c4a, 0x0c4d }, ! { 0x0c4e, 0x0c54 }, ! { 0x0c55, 0x0c56 }, ! { 0x0c57, 0x0c5f }, ! { 0x0c60, 0x0c61 }, ! { 0x0c62, 0x0c65 }, ! { 0x0c66, 0x0c6f }, ! { 0x0c70, 0x0c81 }, ! { 0x0c82, 0x0c83 }, ! { 0x0c84, 0x0c84 }, ! { 0x0c85, 0x0c8c }, ! { 0x0c8d, 0x0c8d }, ! { 0x0c8e, 0x0c90 }, ! { 0x0c91, 0x0c91 }, ! { 0x0c92, 0x0ca8 }, ! { 0x0ca9, 0x0ca9 }, ! { 0x0caa, 0x0cb3 }, ! { 0x0cb4, 0x0cb4 }, ! { 0x0cb5, 0x0cb9 }, ! { 0x0cba, 0x0cbd }, ! { 0x0cbe, 0x0cbe }, ! { 0x0cbf, 0x0cbf }, ! { 0x0cc0, 0x0cc4 }, ! { 0x0cc5, 0x0cc5 }, ! { 0x0cc6, 0x0cc6 }, ! { 0x0cc7, 0x0cc8 }, ! { 0x0cc9, 0x0cc9 }, ! { 0x0cca, 0x0ccb }, ! { 0x0ccc, 0x0ccd }, ! { 0x0cce, 0x0cd4 }, ! { 0x0cd5, 0x0cd6 }, ! { 0x0cd7, 0x0cdd }, ! { 0x0cde, 0x0cde }, ! { 0x0cdf, 0x0cdf }, ! { 0x0ce0, 0x0ce1 }, ! { 0x0ce2, 0x0ce5 }, ! { 0x0ce6, 0x0cef }, ! { 0x0cf0, 0x0d01 }, ! { 0x0d02, 0x0d03 }, ! { 0x0d04, 0x0d04 }, ! { 0x0d05, 0x0d0c }, ! { 0x0d0d, 0x0d0d }, ! { 0x0d0e, 0x0d10 }, ! { 0x0d11, 0x0d11 }, ! { 0x0d12, 0x0d28 }, ! { 0x0d29, 0x0d29 }, ! { 0x0d2a, 0x0d39 }, ! { 0x0d3a, 0x0d3d }, ! { 0x0d3e, 0x0d40 }, ! { 0x0d41, 0x0d43 }, ! { 0x0d44, 0x0d45 }, ! { 0x0d46, 0x0d48 }, ! { 0x0d49, 0x0d49 }, ! { 0x0d4a, 0x0d4c }, ! { 0x0d4d, 0x0d4d }, ! { 0x0d4e, 0x0d56 }, ! { 0x0d57, 0x0d57 }, ! { 0x0d58, 0x0d5f }, ! { 0x0d60, 0x0d61 }, ! { 0x0d62, 0x0d65 }, ! { 0x0d66, 0x0d6f }, ! { 0x0d70, 0x0e00 }, ! { 0x0e01, 0x0e30 }, ! { 0x0e31, 0x0e31 }, ! { 0x0e32, 0x0e33 }, ! { 0x0e34, 0x0e3a }, ! { 0x0e3b, 0x0e3e }, ! { 0x0e3f, 0x0e3f }, ! { 0x0e40, 0x0e45 }, ! { 0x0e46, 0x0e46 }, ! { 0x0e47, 0x0e4e }, ! { 0x0e4f, 0x0e4f }, ! { 0x0e50, 0x0e59 }, ! { 0x0e5a, 0x0e5b }, ! { 0x0e5c, 0x0e80 }, ! { 0x0e81, 0x0e82 }, ! { 0x0e83, 0x0e83 }, ! { 0x0e84, 0x0e84 }, ! { 0x0e85, 0x0e86 }, ! { 0x0e87, 0x0e88 }, ! { 0x0e89, 0x0e89 }, ! { 0x0e8a, 0x0e8a }, ! { 0x0e8b, 0x0e8c }, ! { 0x0e8d, 0x0e8d }, ! { 0x0e8e, 0x0e93 }, ! { 0x0e94, 0x0e97 }, ! { 0x0e98, 0x0e98 }, ! { 0x0e99, 0x0e9f }, ! { 0x0ea0, 0x0ea0 }, ! { 0x0ea1, 0x0ea3 }, ! { 0x0ea4, 0x0ea4 }, ! { 0x0ea5, 0x0ea5 }, ! { 0x0ea6, 0x0ea6 }, ! { 0x0ea7, 0x0ea7 }, ! { 0x0ea8, 0x0ea9 }, ! { 0x0eaa, 0x0eab }, ! { 0x0eac, 0x0eac }, ! { 0x0ead, 0x0eb0 }, ! { 0x0eb1, 0x0eb1 }, ! { 0x0eb2, 0x0eb3 }, ! { 0x0eb4, 0x0eb9 }, ! { 0x0eba, 0x0eba }, ! { 0x0ebb, 0x0ebc }, ! { 0x0ebd, 0x0ebd }, ! { 0x0ebe, 0x0ebf }, ! { 0x0ec0, 0x0ec4 }, ! { 0x0ec5, 0x0ec5 }, ! { 0x0ec6, 0x0ec6 }, ! { 0x0ec7, 0x0ec7 }, ! { 0x0ec8, 0x0ecd }, ! { 0x0ece, 0x0ecf }, ! { 0x0ed0, 0x0ed9 }, ! { 0x0eda, 0x0edb }, ! { 0x0edc, 0x0edd }, ! { 0x0ede, 0x0eff }, ! { 0x0f00, 0x0f00 }, ! { 0x0f01, 0x0f03 }, ! { 0x0f04, 0x0f12 }, ! { 0x0f13, 0x0f17 }, ! { 0x0f18, 0x0f19 }, ! { 0x0f1a, 0x0f1f }, ! { 0x0f20, 0x0f29 }, ! { 0x0f2a, 0x0f33 }, ! { 0x0f34, 0x0f34 }, ! { 0x0f35, 0x0f35 }, ! { 0x0f36, 0x0f36 }, ! { 0x0f37, 0x0f37 }, ! { 0x0f38, 0x0f38 }, ! { 0x0f39, 0x0f39 }, ! { 0x0f3a, 0x0f3a }, ! { 0x0f3b, 0x0f3b }, ! { 0x0f3c, 0x0f3c }, ! { 0x0f3d, 0x0f3d }, ! { 0x0f3e, 0x0f3f }, ! { 0x0f40, 0x0f47 }, ! { 0x0f48, 0x0f48 }, ! { 0x0f49, 0x0f69 }, ! { 0x0f6a, 0x0f70 }, ! { 0x0f71, 0x0f7e }, ! { 0x0f7f, 0x0f7f }, ! { 0x0f80, 0x0f84 }, ! { 0x0f85, 0x0f85 }, ! { 0x0f86, 0x0f87 }, ! { 0x0f88, 0x0f8b }, ! { 0x0f8c, 0x0f8f }, ! { 0x0f90, 0x0f95 }, ! { 0x0f96, 0x0f96 }, ! { 0x0f97, 0x0f97 }, ! { 0x0f98, 0x0f98 }, ! { 0x0f99, 0x0fad }, ! { 0x0fae, 0x0fb0 }, ! { 0x0fb1, 0x0fb7 }, ! { 0x0fb8, 0x0fb8 }, ! { 0x0fb9, 0x0fb9 }, ! { 0x0fba, 0x109f }, ! { 0x10a0, 0x10c5 }, ! { 0x10c6, 0x10cf }, ! { 0x10d0, 0x10f6 }, ! { 0x10f7, 0x10fa }, ! { 0x10fb, 0x10fb }, ! { 0x10fc, 0x10ff }, ! { 0x1100, 0x1159 }, ! { 0x115a, 0x115e }, ! { 0x115f, 0x11a2 }, ! { 0x11a3, 0x11a7 }, ! { 0x11a8, 0x11f9 }, ! { 0x11fa, 0x1dff }, ! { 0x1e00, 0x1e00 }, ! { 0x1e01, 0x1e01 }, ! { 0x1e02, 0x1e02 }, ! { 0x1e03, 0x1e03 }, ! { 0x1e04, 0x1e04 }, ! { 0x1e05, 0x1e05 }, ! { 0x1e06, 0x1e06 }, ! { 0x1e07, 0x1e07 }, ! { 0x1e08, 0x1e08 }, ! { 0x1e09, 0x1e09 }, ! { 0x1e0a, 0x1e0a }, ! { 0x1e0b, 0x1e0b }, ! { 0x1e0c, 0x1e0c }, ! { 0x1e0d, 0x1e0d }, ! { 0x1e0e, 0x1e0e }, ! { 0x1e0f, 0x1e0f }, ! { 0x1e10, 0x1e10 }, ! { 0x1e11, 0x1e11 }, ! { 0x1e12, 0x1e12 }, ! { 0x1e13, 0x1e13 }, ! { 0x1e14, 0x1e14 }, ! { 0x1e15, 0x1e15 }, ! { 0x1e16, 0x1e16 }, ! { 0x1e17, 0x1e17 }, ! { 0x1e18, 0x1e18 }, ! { 0x1e19, 0x1e19 }, ! { 0x1e1a, 0x1e1a }, ! { 0x1e1b, 0x1e1b }, ! { 0x1e1c, 0x1e1c }, ! { 0x1e1d, 0x1e1d }, ! { 0x1e1e, 0x1e1e }, ! { 0x1e1f, 0x1e1f }, ! { 0x1e20, 0x1e20 }, ! { 0x1e21, 0x1e21 }, ! { 0x1e22, 0x1e22 }, ! { 0x1e23, 0x1e23 }, ! { 0x1e24, 0x1e24 }, ! { 0x1e25, 0x1e25 }, ! { 0x1e26, 0x1e26 }, ! { 0x1e27, 0x1e27 }, ! { 0x1e28, 0x1e28 }, ! { 0x1e29, 0x1e29 }, ! { 0x1e2a, 0x1e2a }, ! { 0x1e2b, 0x1e2b }, ! { 0x1e2c, 0x1e2c }, ! { 0x1e2d, 0x1e2d }, ! { 0x1e2e, 0x1e2e }, ! { 0x1e2f, 0x1e2f }, ! { 0x1e30, 0x1e30 }, ! { 0x1e31, 0x1e31 }, ! { 0x1e32, 0x1e32 }, ! { 0x1e33, 0x1e33 }, ! { 0x1e34, 0x1e34 }, ! { 0x1e35, 0x1e35 }, ! { 0x1e36, 0x1e36 }, ! { 0x1e37, 0x1e37 }, ! { 0x1e38, 0x1e38 }, ! { 0x1e39, 0x1e39 }, ! { 0x1e3a, 0x1e3a }, ! { 0x1e3b, 0x1e3b }, ! { 0x1e3c, 0x1e3c }, ! { 0x1e3d, 0x1e3d }, ! { 0x1e3e, 0x1e3e }, ! { 0x1e3f, 0x1e3f }, ! { 0x1e40, 0x1e40 }, ! { 0x1e41, 0x1e41 }, ! { 0x1e42, 0x1e42 }, ! { 0x1e43, 0x1e43 }, ! { 0x1e44, 0x1e44 }, ! { 0x1e45, 0x1e45 }, ! { 0x1e46, 0x1e46 }, ! { 0x1e47, 0x1e47 }, ! { 0x1e48, 0x1e48 }, ! { 0x1e49, 0x1e49 }, ! { 0x1e4a, 0x1e4a }, ! { 0x1e4b, 0x1e4b }, ! { 0x1e4c, 0x1e4c }, ! { 0x1e4d, 0x1e4d }, ! { 0x1e4e, 0x1e4e }, ! { 0x1e4f, 0x1e4f }, ! { 0x1e50, 0x1e50 }, ! { 0x1e51, 0x1e51 }, ! { 0x1e52, 0x1e52 }, ! { 0x1e53, 0x1e53 }, ! { 0x1e54, 0x1e54 }, ! { 0x1e55, 0x1e55 }, ! { 0x1e56, 0x1e56 }, ! { 0x1e57, 0x1e57 }, ! { 0x1e58, 0x1e58 }, ! { 0x1e59, 0x1e59 }, ! { 0x1e5a, 0x1e5a }, ! { 0x1e5b, 0x1e5b }, ! { 0x1e5c, 0x1e5c }, ! { 0x1e5d, 0x1e5d }, ! { 0x1e5e, 0x1e5e }, ! { 0x1e5f, 0x1e5f }, ! { 0x1e60, 0x1e60 }, ! { 0x1e61, 0x1e61 }, ! { 0x1e62, 0x1e62 }, ! { 0x1e63, 0x1e63 }, ! { 0x1e64, 0x1e64 }, ! { 0x1e65, 0x1e65 }, ! { 0x1e66, 0x1e66 }, ! { 0x1e67, 0x1e67 }, ! { 0x1e68, 0x1e68 }, ! { 0x1e69, 0x1e69 }, ! { 0x1e6a, 0x1e6a }, ! { 0x1e6b, 0x1e6b }, ! { 0x1e6c, 0x1e6c }, ! { 0x1e6d, 0x1e6d }, ! { 0x1e6e, 0x1e6e }, ! { 0x1e6f, 0x1e6f }, ! { 0x1e70, 0x1e70 }, ! { 0x1e71, 0x1e71 }, ! { 0x1e72, 0x1e72 }, ! { 0x1e73, 0x1e73 }, ! { 0x1e74, 0x1e74 }, ! { 0x1e75, 0x1e75 }, ! { 0x1e76, 0x1e76 }, ! { 0x1e77, 0x1e77 }, ! { 0x1e78, 0x1e78 }, ! { 0x1e79, 0x1e79 }, ! { 0x1e7a, 0x1e7a }, ! { 0x1e7b, 0x1e7b }, ! { 0x1e7c, 0x1e7c }, ! { 0x1e7d, 0x1e7d }, ! { 0x1e7e, 0x1e7e }, ! { 0x1e7f, 0x1e7f }, ! { 0x1e80, 0x1e80 }, ! { 0x1e81, 0x1e81 }, ! { 0x1e82, 0x1e82 }, ! { 0x1e83, 0x1e83 }, ! { 0x1e84, 0x1e84 }, ! { 0x1e85, 0x1e85 }, ! { 0x1e86, 0x1e86 }, ! { 0x1e87, 0x1e87 }, ! { 0x1e88, 0x1e88 }, ! { 0x1e89, 0x1e89 }, ! { 0x1e8a, 0x1e8a }, ! { 0x1e8b, 0x1e8b }, ! { 0x1e8c, 0x1e8c }, ! { 0x1e8d, 0x1e8d }, ! { 0x1e8e, 0x1e8e }, ! { 0x1e8f, 0x1e8f }, ! { 0x1e90, 0x1e90 }, ! { 0x1e91, 0x1e91 }, ! { 0x1e92, 0x1e92 }, ! { 0x1e93, 0x1e93 }, ! { 0x1e94, 0x1e94 }, ! { 0x1e95, 0x1e9b }, ! { 0x1e9c, 0x1e9f }, ! { 0x1ea0, 0x1ea0 }, ! { 0x1ea1, 0x1ea1 }, ! { 0x1ea2, 0x1ea2 }, ! { 0x1ea3, 0x1ea3 }, ! { 0x1ea4, 0x1ea4 }, ! { 0x1ea5, 0x1ea5 }, ! { 0x1ea6, 0x1ea6 }, ! { 0x1ea7, 0x1ea7 }, ! { 0x1ea8, 0x1ea8 }, ! { 0x1ea9, 0x1ea9 }, ! { 0x1eaa, 0x1eaa }, ! { 0x1eab, 0x1eab }, ! { 0x1eac, 0x1eac }, ! { 0x1ead, 0x1ead }, ! { 0x1eae, 0x1eae }, ! { 0x1eaf, 0x1eaf }, ! { 0x1eb0, 0x1eb0 }, ! { 0x1eb1, 0x1eb1 }, ! { 0x1eb2, 0x1eb2 }, ! { 0x1eb3, 0x1eb3 }, ! { 0x1eb4, 0x1eb4 }, ! { 0x1eb5, 0x1eb5 }, ! { 0x1eb6, 0x1eb6 }, ! { 0x1eb7, 0x1eb7 }, ! { 0x1eb8, 0x1eb8 }, ! { 0x1eb9, 0x1eb9 }, ! { 0x1eba, 0x1eba }, ! { 0x1ebb, 0x1ebb }, ! { 0x1ebc, 0x1ebc }, ! { 0x1ebd, 0x1ebd }, ! { 0x1ebe, 0x1ebe }, ! { 0x1ebf, 0x1ebf }, ! { 0x1ec0, 0x1ec0 }, ! { 0x1ec1, 0x1ec1 }, ! { 0x1ec2, 0x1ec2 }, ! { 0x1ec3, 0x1ec3 }, ! { 0x1ec4, 0x1ec4 }, ! { 0x1ec5, 0x1ec5 }, ! { 0x1ec6, 0x1ec6 }, ! { 0x1ec7, 0x1ec7 }, ! { 0x1ec8, 0x1ec8 }, ! { 0x1ec9, 0x1ec9 }, ! { 0x1eca, 0x1eca }, ! { 0x1ecb, 0x1ecb }, ! { 0x1ecc, 0x1ecc }, ! { 0x1ecd, 0x1ecd }, ! { 0x1ece, 0x1ece }, ! { 0x1ecf, 0x1ecf }, ! { 0x1ed0, 0x1ed0 }, ! { 0x1ed1, 0x1ed1 }, ! { 0x1ed2, 0x1ed2 }, ! { 0x1ed3, 0x1ed3 }, ! { 0x1ed4, 0x1ed4 }, ! { 0x1ed5, 0x1ed5 }, ! { 0x1ed6, 0x1ed6 }, ! { 0x1ed7, 0x1ed7 }, ! { 0x1ed8, 0x1ed8 }, ! { 0x1ed9, 0x1ed9 }, ! { 0x1eda, 0x1eda }, ! { 0x1edb, 0x1edb }, ! { 0x1edc, 0x1edc }, ! { 0x1edd, 0x1edd }, ! { 0x1ede, 0x1ede }, ! { 0x1edf, 0x1edf }, ! { 0x1ee0, 0x1ee0 }, ! { 0x1ee1, 0x1ee1 }, ! { 0x1ee2, 0x1ee2 }, ! { 0x1ee3, 0x1ee3 }, ! { 0x1ee4, 0x1ee4 }, ! { 0x1ee5, 0x1ee5 }, ! { 0x1ee6, 0x1ee6 }, ! { 0x1ee7, 0x1ee7 }, ! { 0x1ee8, 0x1ee8 }, ! { 0x1ee9, 0x1ee9 }, ! { 0x1eea, 0x1eea }, ! { 0x1eeb, 0x1eeb }, ! { 0x1eec, 0x1eec }, ! { 0x1eed, 0x1eed }, ! { 0x1eee, 0x1eee }, ! { 0x1eef, 0x1eef }, ! { 0x1ef0, 0x1ef0 }, ! { 0x1ef1, 0x1ef1 }, ! { 0x1ef2, 0x1ef2 }, ! { 0x1ef3, 0x1ef3 }, ! { 0x1ef4, 0x1ef4 }, ! { 0x1ef5, 0x1ef5 }, ! { 0x1ef6, 0x1ef6 }, ! { 0x1ef7, 0x1ef7 }, ! { 0x1ef8, 0x1ef8 }, ! { 0x1ef9, 0x1ef9 }, ! { 0x1efa, 0x1eff }, ! { 0x1f00, 0x1f07 }, ! { 0x1f08, 0x1f0f }, ! { 0x1f10, 0x1f15 }, ! { 0x1f16, 0x1f17 }, ! { 0x1f18, 0x1f1d }, ! { 0x1f1e, 0x1f1f }, ! { 0x1f20, 0x1f27 }, ! { 0x1f28, 0x1f2f }, ! { 0x1f30, 0x1f37 }, ! { 0x1f38, 0x1f3f }, ! { 0x1f40, 0x1f45 }, ! { 0x1f46, 0x1f47 }, ! { 0x1f48, 0x1f4d }, ! { 0x1f4e, 0x1f4f }, ! { 0x1f50, 0x1f57 }, ! { 0x1f58, 0x1f58 }, ! { 0x1f59, 0x1f59 }, ! { 0x1f5a, 0x1f5a }, ! { 0x1f5b, 0x1f5b }, ! { 0x1f5c, 0x1f5c }, ! { 0x1f5d, 0x1f5d }, ! { 0x1f5e, 0x1f5e }, ! { 0x1f5f, 0x1f5f }, ! { 0x1f60, 0x1f67 }, ! { 0x1f68, 0x1f6f }, ! { 0x1f70, 0x1f7d }, ! { 0x1f7e, 0x1f7f }, ! { 0x1f80, 0x1f87 }, ! { 0x1f88, 0x1f8f }, ! { 0x1f90, 0x1f97 }, ! { 0x1f98, 0x1f9f }, ! { 0x1fa0, 0x1fa7 }, ! { 0x1fa8, 0x1faf }, ! { 0x1fb0, 0x1fb4 }, ! { 0x1fb5, 0x1fb5 }, ! { 0x1fb6, 0x1fb7 }, ! { 0x1fb8, 0x1fbc }, ! { 0x1fbd, 0x1fbd }, ! { 0x1fbe, 0x1fbe }, ! { 0x1fbf, 0x1fc1 }, ! { 0x1fc2, 0x1fc4 }, ! { 0x1fc5, 0x1fc5 }, ! { 0x1fc6, 0x1fc7 }, ! { 0x1fc8, 0x1fcc }, ! { 0x1fcd, 0x1fcf }, ! { 0x1fd0, 0x1fd3 }, ! { 0x1fd4, 0x1fd5 }, ! { 0x1fd6, 0x1fd7 }, ! { 0x1fd8, 0x1fdb }, ! { 0x1fdc, 0x1fdc }, ! { 0x1fdd, 0x1fdf }, ! { 0x1fe0, 0x1fe7 }, ! { 0x1fe8, 0x1fec }, ! { 0x1fed, 0x1fef }, ! { 0x1ff0, 0x1ff1 }, ! { 0x1ff2, 0x1ff4 }, ! { 0x1ff5, 0x1ff5 }, ! { 0x1ff6, 0x1ff7 }, ! { 0x1ff8, 0x1ffc }, ! { 0x1ffd, 0x1ffe }, ! { 0x1fff, 0x1fff }, ! { 0x2000, 0x200b }, ! { 0x200c, 0x200f }, ! { 0x2010, 0x2015 }, ! { 0x2016, 0x2017 }, ! { 0x2018, 0x2018 }, ! { 0x2019, 0x2019 }, ! { 0x201a, 0x201a }, ! { 0x201b, 0x201c }, ! { 0x201d, 0x201d }, ! { 0x201e, 0x201e }, ! { 0x201f, 0x201f }, ! { 0x2020, 0x2027 }, ! { 0x2028, 0x2028 }, ! { 0x2029, 0x2029 }, ! { 0x202a, 0x202e }, ! { 0x202f, 0x202f }, ! { 0x2030, 0x2038 }, ! { 0x2039, 0x2039 }, ! { 0x203a, 0x203a }, ! { 0x203b, 0x203e }, ! { 0x203f, 0x2040 }, ! { 0x2041, 0x2043 }, ! { 0x2044, 0x2044 }, ! { 0x2045, 0x2045 }, ! { 0x2046, 0x2046 }, ! { 0x2047, 0x2069 }, ! { 0x206a, 0x206f }, ! { 0x2070, 0x2070 }, ! { 0x2071, 0x2073 }, ! { 0x2074, 0x2079 }, ! { 0x207a, 0x207c }, ! { 0x207d, 0x207d }, ! { 0x207e, 0x207e }, ! { 0x207f, 0x207f }, ! { 0x2080, 0x2089 }, ! { 0x208a, 0x208c }, ! { 0x208d, 0x208d }, ! { 0x208e, 0x208e }, ! { 0x208f, 0x209f }, ! { 0x20a0, 0x20ac }, ! { 0x20ad, 0x20cf }, ! { 0x20d0, 0x20dc }, ! { 0x20dd, 0x20e0 }, ! { 0x20e1, 0x20e1 }, ! { 0x20e2, 0x20ff }, ! { 0x2100, 0x2101 }, ! { 0x2102, 0x2102 }, ! { 0x2103, 0x2106 }, ! { 0x2107, 0x2107 }, ! { 0x2108, 0x2109 }, ! { 0x210a, 0x210a }, ! { 0x210b, 0x210d }, ! { 0x210e, 0x210f }, ! { 0x2110, 0x2112 }, ! { 0x2113, 0x2113 }, ! { 0x2114, 0x2114 }, ! { 0x2115, 0x2115 }, ! { 0x2116, 0x2117 }, ! { 0x2118, 0x2118 }, ! { 0x2119, 0x211d }, ! { 0x211e, 0x2123 }, ! { 0x2124, 0x2124 }, ! { 0x2125, 0x2125 }, ! { 0x2126, 0x2126 }, ! { 0x2127, 0x2127 }, ! { 0x2128, 0x2128 }, ! { 0x2129, 0x2129 }, ! { 0x212a, 0x212d }, ! { 0x212e, 0x212f }, ! { 0x2130, 0x2131 }, ! { 0x2132, 0x2132 }, ! { 0x2133, 0x2133 }, ! { 0x2134, 0x2134 }, ! { 0x2135, 0x2138 }, ! { 0x2139, 0x2152 }, ! { 0x2153, 0x215f }, ! { 0x2160, 0x2182 }, ! { 0x2183, 0x218f }, ! { 0x2190, 0x2194 }, ! { 0x2195, 0x21d1 }, ! { 0x21d2, 0x21d2 }, ! { 0x21d3, 0x21d3 }, ! { 0x21d4, 0x21d4 }, ! { 0x21d5, 0x21ea }, ! { 0x21eb, 0x21ff }, ! { 0x2200, 0x22f1 }, ! { 0x22f2, 0x22ff }, ! { 0x2300, 0x2300 }, ! { 0x2301, 0x2301 }, ! { 0x2302, 0x2307 }, ! { 0x2308, 0x230b }, ! { 0x230c, 0x231f }, ! { 0x2320, 0x2321 }, ! { 0x2322, 0x2328 }, ! { 0x2329, 0x2329 }, ! { 0x232a, 0x232a }, ! { 0x232b, 0x237a }, ! { 0x237b, 0x23ff }, ! { 0x2400, 0x2424 }, ! { 0x2425, 0x243f }, ! { 0x2440, 0x244a }, ! { 0x244b, 0x245f }, ! { 0x2460, 0x249b }, ! { 0x249c, 0x24e9 }, ! { 0x24ea, 0x24ea }, ! { 0x24eb, 0x24ff }, ! { 0x2500, 0x2595 }, ! { 0x2596, 0x259f }, ! { 0x25a0, 0x25ef }, ! { 0x25f0, 0x25ff }, ! { 0x2600, 0x2613 }, ! { 0x2614, 0x2619 }, ! { 0x261a, 0x266f }, ! { 0x2670, 0x2700 }, ! { 0x2701, 0x2704 }, ! { 0x2705, 0x2705 }, ! { 0x2706, 0x2709 }, ! { 0x270a, 0x270b }, ! { 0x270c, 0x2727 }, ! { 0x2728, 0x2728 }, ! { 0x2729, 0x274b }, ! { 0x274c, 0x274c }, ! { 0x274d, 0x274d }, ! { 0x274e, 0x274e }, ! { 0x274f, 0x2752 }, ! { 0x2753, 0x2755 }, ! { 0x2756, 0x2756 }, ! { 0x2757, 0x2757 }, ! { 0x2758, 0x275e }, ! { 0x275f, 0x2760 }, ! { 0x2761, 0x2767 }, ! { 0x2768, 0x2775 }, ! { 0x2776, 0x2793 }, ! { 0x2794, 0x2794 }, ! { 0x2795, 0x2797 }, ! { 0x2798, 0x27af }, ! { 0x27b0, 0x27b0 }, ! { 0x27b1, 0x27be }, ! { 0x27bf, 0x2fff }, ! { 0x3000, 0x3000 }, ! { 0x3001, 0x3003 }, ! { 0x3004, 0x3004 }, ! { 0x3005, 0x3005 }, ! { 0x3006, 0x3006 }, ! { 0x3007, 0x3007 }, ! { 0x3008, 0x3008 }, ! { 0x3009, 0x3009 }, ! { 0x300a, 0x300a }, ! { 0x300b, 0x300b }, ! { 0x300c, 0x300c }, ! { 0x300d, 0x300d }, ! { 0x300e, 0x300e }, ! { 0x300f, 0x300f }, ! { 0x3010, 0x3010 }, ! { 0x3011, 0x3011 }, ! { 0x3012, 0x3013 }, ! { 0x3014, 0x3014 }, ! { 0x3015, 0x3015 }, ! { 0x3016, 0x3016 }, ! { 0x3017, 0x3017 }, ! { 0x3018, 0x3018 }, ! { 0x3019, 0x3019 }, ! { 0x301a, 0x301a }, ! { 0x301b, 0x301b }, ! { 0x301c, 0x301c }, ! { 0x301d, 0x301d }, ! { 0x301e, 0x301f }, ! { 0x3020, 0x3020 }, ! { 0x3021, 0x3029 }, ! { 0x302a, 0x302f }, ! { 0x3030, 0x3030 }, ! { 0x3031, 0x3035 }, ! { 0x3036, 0x3037 }, ! { 0x3038, 0x303e }, ! { 0x303f, 0x303f }, ! { 0x3040, 0x3040 }, ! { 0x3041, 0x3094 }, ! { 0x3095, 0x3098 }, ! { 0x3099, 0x309a }, ! { 0x309b, 0x309c }, ! { 0x309d, 0x309e }, ! { 0x309f, 0x30a0 }, ! { 0x30a1, 0x30fa }, ! { 0x30fb, 0x30fb }, ! { 0x30fc, 0x30fe }, ! { 0x30ff, 0x3104 }, ! { 0x3105, 0x312c }, ! { 0x312d, 0x3130 }, ! { 0x3131, 0x318e }, ! { 0x318f, 0x318f }, ! { 0x3190, 0x3191 }, ! { 0x3192, 0x3195 }, ! { 0x3196, 0x319f }, ! { 0x31a0, 0x31ff }, ! { 0x3200, 0x321c }, ! { 0x321d, 0x321f }, ! { 0x3220, 0x3229 }, ! { 0x322a, 0x3243 }, ! { 0x3244, 0x325f }, ! { 0x3260, 0x327b }, ! { 0x327c, 0x327e }, ! { 0x327f, 0x327f }, ! { 0x3280, 0x3289 }, ! { 0x328a, 0x32b0 }, ! { 0x32b1, 0x32bf }, ! { 0x32c0, 0x32cb }, ! { 0x32cc, 0x32cf }, ! { 0x32d0, 0x32fe }, ! { 0x32ff, 0x32ff }, ! { 0x3300, 0x3376 }, ! { 0x3377, 0x337a }, ! { 0x337b, 0x33dd }, ! { 0x33de, 0x33df }, ! { 0x33e0, 0x33fe }, ! { 0x33ff, 0x4dff }, ! { 0x4e00, 0x9fa5 }, ! { 0x9fa6, 0xabff }, ! { 0xac00, 0xd7a3 }, ! { 0xd7a4, 0xd7ff }, ! { 0xd800, 0xdfff }, ! { 0xe000, 0xf8ff }, ! { 0xf900, 0xfa2d }, ! { 0xfa2e, 0xfaff }, ! { 0xfb00, 0xfb06 }, ! { 0xfb07, 0xfb12 }, ! { 0xfb13, 0xfb17 }, ! { 0xfb18, 0xfb1d }, ! { 0xfb1e, 0xfb1e }, ! { 0xfb1f, 0xfb28 }, ! { 0xfb29, 0xfb29 }, ! { 0xfb2a, 0xfb36 }, ! { 0xfb37, 0xfb37 }, ! { 0xfb38, 0xfb3c }, ! { 0xfb3d, 0xfb3d }, ! { 0xfb3e, 0xfb3e }, ! { 0xfb3f, 0xfb3f }, ! { 0xfb40, 0xfb41 }, ! { 0xfb42, 0xfb42 }, ! { 0xfb43, 0xfb44 }, ! { 0xfb45, 0xfb45 }, ! { 0xfb46, 0xfbb1 }, ! { 0xfbb2, 0xfbd2 }, ! { 0xfbd3, 0xfd3d }, ! { 0xfd3e, 0xfd3e }, ! { 0xfd3f, 0xfd3f }, ! { 0xfd40, 0xfd4f }, ! { 0xfd50, 0xfd8f }, ! { 0xfd90, 0xfd91 }, ! { 0xfd92, 0xfdc7 }, ! { 0xfdc8, 0xfdef }, ! { 0xfdf0, 0xfdfb }, ! { 0xfdfc, 0xfe1f }, ! { 0xfe20, 0xfe23 }, ! { 0xfe24, 0xfe2f }, ! { 0xfe30, 0xfe30 }, ! { 0xfe31, 0xfe32 }, ! { 0xfe33, 0xfe34 }, ! { 0xfe35, 0xfe35 }, ! { 0xfe36, 0xfe36 }, ! { 0xfe37, 0xfe37 }, ! { 0xfe38, 0xfe38 }, ! { 0xfe39, 0xfe39 }, ! { 0xfe3a, 0xfe3a }, ! { 0xfe3b, 0xfe3b }, ! { 0xfe3c, 0xfe3c }, ! { 0xfe3d, 0xfe3d }, ! { 0xfe3e, 0xfe3e }, ! { 0xfe3f, 0xfe3f }, ! { 0xfe40, 0xfe40 }, ! { 0xfe41, 0xfe41 }, ! { 0xfe42, 0xfe42 }, ! { 0xfe43, 0xfe43 }, ! { 0xfe44, 0xfe44 }, ! { 0xfe45, 0xfe48 }, ! { 0xfe49, 0xfe4c }, ! { 0xfe4d, 0xfe4f }, ! { 0xfe50, 0xfe52 }, ! { 0xfe53, 0xfe53 }, ! { 0xfe54, 0xfe57 }, ! { 0xfe58, 0xfe58 }, ! { 0xfe59, 0xfe59 }, ! { 0xfe5a, 0xfe5a }, ! { 0xfe5b, 0xfe5b }, ! { 0xfe5c, 0xfe5c }, ! { 0xfe5d, 0xfe5d }, ! { 0xfe5e, 0xfe5e }, ! { 0xfe5f, 0xfe61 }, ! { 0xfe62, 0xfe62 }, ! { 0xfe63, 0xfe63 }, ! { 0xfe64, 0xfe66 }, ! { 0xfe67, 0xfe67 }, ! { 0xfe68, 0xfe68 }, ! { 0xfe69, 0xfe69 }, ! { 0xfe6a, 0xfe6b }, ! { 0xfe6c, 0xfe6f }, ! { 0xfe70, 0xfe72 }, ! { 0xfe73, 0xfe73 }, ! { 0xfe74, 0xfe74 }, ! { 0xfe75, 0xfe75 }, ! { 0xfe76, 0xfefc }, ! { 0xfefd, 0xfefe }, ! { 0xfeff, 0xfeff }, ! { 0xff00, 0xff00 }, ! { 0xff01, 0xff03 }, ! { 0xff04, 0xff04 }, ! { 0xff05, 0xff07 }, ! { 0xff08, 0xff08 }, ! { 0xff09, 0xff09 }, ! { 0xff0a, 0xff0a }, ! { 0xff0b, 0xff0b }, ! { 0xff0c, 0xff0c }, ! { 0xff0d, 0xff0d }, ! { 0xff0e, 0xff0f }, ! { 0xff10, 0xff19 }, ! { 0xff1a, 0xff1b }, ! { 0xff1c, 0xff1e }, ! { 0xff1f, 0xff20 }, ! { 0xff21, 0xff3a }, ! { 0xff3b, 0xff3b }, ! { 0xff3c, 0xff3c }, ! { 0xff3d, 0xff3d }, ! { 0xff3e, 0xff3e }, ! { 0xff3f, 0xff3f }, ! { 0xff40, 0xff40 }, ! { 0xff41, 0xff5a }, ! { 0xff5b, 0xff5b }, ! { 0xff5c, 0xff5c }, ! { 0xff5d, 0xff5d }, ! { 0xff5e, 0xff5e }, ! { 0xff5f, 0xff60 }, ! { 0xff61, 0xff61 }, ! { 0xff62, 0xff62 }, ! { 0xff63, 0xff63 }, ! { 0xff64, 0xff64 }, ! { 0xff65, 0xff65 }, ! { 0xff66, 0xff6f }, ! { 0xff70, 0xff70 }, ! { 0xff71, 0xff9d }, ! { 0xff9e, 0xff9f }, ! { 0xffa0, 0xffbe }, ! { 0xffbf, 0xffc1 }, ! { 0xffc2, 0xffc7 }, ! { 0xffc8, 0xffc9 }, ! { 0xffca, 0xffcf }, ! { 0xffd0, 0xffd1 }, ! { 0xffd2, 0xffd7 }, ! { 0xffd8, 0xffd9 }, ! { 0xffda, 0xffdc }, ! { 0xffdd, 0xffdf }, ! { 0xffe0, 0xffe1 }, ! { 0xffe2, 0xffe2 }, ! { 0xffe3, 0xffe3 }, ! { 0xffe4, 0xffe4 }, ! { 0xffe5, 0xffe6 }, ! { 0xffe7, 0xffe7 }, ! { 0xffe8, 0xffec }, ! { 0xffed, 0xffee }, ! { 0xffef, 0xfffb }, ! { 0xfffc, 0xfffd }, ! { 0xfffe, 0xffff } }; ! static const jbyte category_table[] = ! { java::lang::Character::CONTROL, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::CONTROL, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::FORMAT, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::LINE_SEPARATOR, ! java::lang::Character::PARAGRAPH_SEPARATOR, ! java::lang::Character::FORMAT, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::FORMAT, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::SURROGATE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::FORMAT, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED ! }; ! ! #else /* COMPACT_CHARACTER */ ! ! #define ROMAN_START 0x2160 ! #define ROMAN_END 0x217f ! ! static const jbyte type_table[] = ! { java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::CONTROL, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::TITLECASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::COMBINING_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::LINE_SEPARATOR, ! java::lang::Character::PARAGRAPH_SEPARATOR, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::FORMAT, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::ENCLOSING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::SPACE_SEPARATOR, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::LETTER_NUMBER, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_NUMBER, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::SURROGATE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::PRIVATE_USE, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::NON_SPACING_MARK, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::FORMAT, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DASH_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::DECIMAL_DIGIT_NUMBER, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::UPPERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::LOWERCASE_LETTER, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::START_PUNCTUATION, ! java::lang::Character::END_PUNCTUATION, ! java::lang::Character::OTHER_PUNCTUATION, ! java::lang::Character::CONNECTOR_PUNCTUATION, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::MODIFIER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::OTHER_LETTER, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MODIFIER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::CURRENCY_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::MATH_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::OTHER_SYMBOL, ! java::lang::Character::UNASSIGNED, ! java::lang::Character::UNASSIGNED ! ! }; ! static const jshort attribute_table[] = ! { 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 1, 2, 3, ! 4, 5, 6, 7, 8, ! 9, 0, 0, 0, 0, ! 0, 0, 0, 97, 98, ! 99, 100, 101, 102, 103, ! 104, 105, 106, 107, 108, ! 109, 110, 111, 112, 113, ! 114, 115, 116, 117, 118, ! 119, 120, 121, 122, 0, ! 0, 0, 0, 0, 0, ! 65, 66, 67, 68, 69, ! 70, 71, 72, 73, 74, ! 75, 76, 77, 78, 79, ! 80, 81, 82, 83, 84, ! 85, 86, 87, 88, 89, ! 90, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 2, 3, 0, 0, ! 0, 0, 0, 1, 0, ! 0, -2, -2, -2, 0, ! 224, 225, 226, 227, 228, ! 229, 230, 231, 232, 233, ! 234, 235, 236, 237, 238, ! 239, 240, 241, 242, 243, ! 244, 245, 246, 0, 248, ! 249, 250, 251, 252, 253, ! 254, 0, 192, 193, 194, ! 195, 196, 197, 198, 199, ! 200, 201, 202, 203, 204, ! 205, 206, 207, 208, 209, ! 210, 211, 212, 213, 214, ! 0, 216, 217, 218, 219, ! 220, 221, 222, 376, 257, ! 256, 259, 258, 261, 260, ! 263, 262, 265, 264, 267, ! 266, 269, 268, 271, 270, ! 273, 272, 275, 274, 277, ! 276, 279, 278, 281, 280, ! 283, 282, 285, 284, 287, ! 286, 289, 288, 291, 290, ! 293, 292, 295, 294, 297, ! 296, 299, 298, 301, 300, ! 303, 302, 105, 73, 307, ! 306, 309, 308, 311, 310, ! 0, 314, 313, 316, 315, ! 318, 317, 320, 319, 322, ! 321, 324, 323, 326, 325, ! 328, 327, 0, 331, 330, ! 333, 332, 335, 334, 337, ! 336, 339, 338, 341, 340, ! 343, 342, 345, 344, 347, ! 346, 349, 348, 351, 350, ! 353, 352, 355, 354, 357, ! 356, 359, 358, 361, 360, ! 363, 362, 365, 364, 367, ! 366, 369, 368, 371, 370, ! 373, 372, 375, 374, 255, ! 378, 377, 380, 379, 382, ! 381, 83, 0, 595, 387, ! 386, 389, 388, 596, 392, ! 391, 598, 599, 396, 395, ! 0, 477, 601, 603, 402, ! 401, 608, 611, 0, 617, ! 616, 409, 408, 0, 0, ! 623, 626, 0, 629, 417, ! 416, 419, 418, 421, 420, ! 640, 424, 423, 643, 0, ! 0, 429, 428, 648, 432, ! 431, 650, 651, 436, 435, ! 438, 437, 658, 441, 440, ! 0, 0, 445, 444, 0, ! 0, 0, 0, 0, 0, ! 454, 0, 452, 457, 0, ! 455, 460, 0, 458, 462, ! 461, 464, 463, 466, 465, ! 468, 467, 470, 469, 472, ! 471, 474, 473, 476, 475, ! 398, 479, 478, 481, 480, ! 483, 482, 485, 484, 487, ! 486, 489, 488, 491, 490, ! 493, 492, 495, 494, 0, ! 499, 0, 497, 501, 500, ! 0, 0, 0, 0, 507, ! 506, 509, 508, 511, 510, ! 513, 512, 515, 514, 517, ! 516, 519, 518, 521, 520, ! 523, 522, 525, 524, 527, ! 526, 529, 528, 531, 530, ! 533, 532, 535, 534, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 385, 390, ! 0, 393, 394, 0, 399, ! 0, 400, 0, 0, 0, ! 0, 403, 0, 0, 404, ! 0, 0, 0, 0, 407, ! 406, 0, 0, 0, 0, ! 0, 412, 0, 0, 413, ! 0, 0, 415, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 422, 0, ! 0, 425, 0, 0, 0, ! 0, 430, 0, 433, 434, ! 0, 0, 0, 0, 0, ! 0, 439, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 921, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 940, 0, 941, 942, 943, ! 0, 972, 0, 973, 974, ! 0, 945, 946, 947, 948, ! 949, 950, 951, 952, 953, ! 954, 955, 956, 957, 958, ! 959, 960, 961, 0, 963, ! 964, 965, 966, 967, 968, ! 969, 970, 971, 902, 904, ! 905, 906, 0, 913, 914, ! 915, 916, 917, 918, 919, ! 920, 921, 922, 923, 924, ! 925, 926, 927, 928, 929, ! 931, 931, 932, 933, 934, ! 935, 936, 937, 938, 939, ! 908, 910, 911, 0, 914, ! 920, 0, 0, 0, 934, ! 928, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 995, 994, 997, ! 996, 999, 998, 1001, 1000, ! 1003, 1002, 1005, 1004, 1007, ! 1006, 922, 929, 931, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 1105, 1106, ! 1107, 1108, 1109, 1110, 1111, ! 1112, 1113, 1114, 1115, 1116, ! 0, 1118, 1119, 1072, 1073, ! 1074, 1075, 1076, 1077, 1078, ! 1079, 1080, 1081, 1082, 1083, ! 1084, 1085, 1086, 1087, 1088, ! 1089, 1090, 1091, 1092, 1093, ! 1094, 1095, 1096, 1097, 1098, ! 1099, 1100, 1101, 1102, 1103, ! 1040, 1041, 1042, 1043, 1044, ! 1045, 1046, 1047, 1048, 1049, ! 1050, 1051, 1052, 1053, 1054, ! 1055, 1056, 1057, 1058, 1059, ! 1060, 1061, 1062, 1063, 1064, ! 1065, 1066, 1067, 1068, 1069, ! 1070, 1071, 0, 1025, 1026, ! 1027, 1028, 1029, 1030, 1031, ! 1032, 1033, 1034, 1035, 1036, ! 0, 1038, 1039, 1121, 1120, ! 1123, 1122, 1125, 1124, 1127, ! 1126, 1129, 1128, 1131, 1130, ! 1133, 1132, 1135, 1134, 1137, ! 1136, 1139, 1138, 1141, 1140, ! 1143, 1142, 1145, 1144, 1147, ! 1146, 1149, 1148, 1151, 1150, ! 1153, 1152, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 1169, 1168, 1171, 1170, ! 1173, 1172, 1175, 1174, 1177, ! 1176, 1179, 1178, 1181, 1180, ! 1183, 1182, 1185, 1184, 1187, ! 1186, 1189, 1188, 1191, 1190, ! 1193, 1192, 1195, 1194, 1197, ! 1196, 1199, 1198, 1201, 1200, ! 1203, 1202, 1205, 1204, 1207, ! 1206, 1209, 1208, 1211, 1210, ! 1213, 1212, 1215, 1214, 0, ! 1218, 1217, 1220, 1219, 0, ! 0, 1224, 1223, 0, 0, ! 1228, 1227, 0, 0, 0, ! 1233, 1232, 1235, 1234, 1237, ! 1236, 1239, 1238, 1241, 1240, ! 1243, 1242, 1245, 1244, 1247, ! 1246, 1249, 1248, 1251, 1250, ! 1253, 1252, 1255, 1254, 1257, ! 1256, 1259, 1258, 0, 0, ! 1263, 1262, 1265, 1264, 1267, ! 1266, 1269, 1268, 0, 0, ! 1273, 1272, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 1377, 1378, 1379, ! 1380, 1381, 1382, 1383, 1384, ! 1385, 1386, 1387, 1388, 1389, ! 1390, 1391, 1392, 1393, 1394, ! 1395, 1396, 1397, 1398, 1399, ! 1400, 1401, 1402, 1403, 1404, ! 1405, 1406, 1407, 1408, 1409, ! 1410, 1411, 1412, 1413, 1414, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 1329, 1330, 1331, 1332, 1333, ! 1334, 1335, 1336, 1337, 1338, ! 1339, 1340, 1341, 1342, 1343, ! 1344, 1345, 1346, 1347, 1348, ! 1349, 1350, 1351, 1352, 1353, ! 1354, 1355, 1356, 1357, 1358, ! 1359, 1360, 1361, 1362, 1363, ! 1364, 1365, 1366, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 1, 2, 3, 4, ! 5, 6, 7, 8, 9, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 1, 2, ! 3, 4, 5, 6, 7, ! 8, 9, 0, 0, 0, ! 0, 1, 2, 3, 4, ! -2, 16, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 1, 2, 3, 4, ! 5, 6, 7, 8, 9, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 1, ! 2, 3, 4, 5, 6, ! 7, 8, 9, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 1, 2, 3, ! 4, 5, 6, 7, 8, ! 9, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, ! 100, 1000, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 1, 2, ! 3, 4, 5, 6, 7, ! 8, 9, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 1, 2, 3, 4, ! 5, 6, 7, 8, 9, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 1, ! 2, 3, 4, 5, 6, ! 7, 8, 9, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 1, 2, ! 3, 4, 5, 6, 7, ! 8, 9, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 1, 2, 3, 4, ! 5, 6, 7, 8, 9, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 1, 2, 3, 4, ! 5, 6, 7, 8, 9, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 4304, ! 4305, 4306, 4307, 4308, 4309, ! 4310, 4311, 4312, 4313, 4314, ! 4315, 4316, 4317, 4318, 4319, ! 4320, 4321, 4322, 4323, 4324, ! 4325, 4326, 4327, 4328, 4329, ! 4330, 4331, 4332, 4333, 4334, ! 4335, 4336, 4337, 4338, 4339, ! 4340, 4341, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 7681, 7680, ! 7683, 7682, 7685, 7684, 7687, ! 7686, 7689, 7688, 7691, 7690, ! 7693, 7692, 7695, 7694, 7697, ! 7696, 7699, 7698, 7701, 7700, ! 7703, 7702, 7705, 7704, 7707, ! 7706, 7709, 7708, 7711, 7710, ! 7713, 7712, 7715, 7714, 7717, ! 7716, 7719, 7718, 7721, 7720, ! 7723, 7722, 7725, 7724, 7727, ! 7726, 7729, 7728, 7731, 7730, ! 7733, 7732, 7735, 7734, 7737, ! 7736, 7739, 7738, 7741, 7740, ! 7743, 7742, 7745, 7744, 7747, ! 7746, 7749, 7748, 7751, 7750, ! 7753, 7752, 7755, 7754, 7757, ! 7756, 7759, 7758, 7761, 7760, ! 7763, 7762, 7765, 7764, 7767, ! 7766, 7769, 7768, 7771, 7770, ! 7773, 7772, 7775, 7774, 7777, ! 7776, 7779, 7778, 7781, 7780, ! 7783, 7782, 7785, 7784, 7787, ! 7786, 7789, 7788, 7791, 7790, ! 7793, 7792, 7795, 7794, 7797, ! 7796, 7799, 7798, 7801, 7800, ! 7803, 7802, 7805, 7804, 7807, ! 7806, 7809, 7808, 7811, 7810, ! 7813, 7812, 7815, 7814, 7817, ! 7816, 7819, 7818, 7821, 7820, ! 7823, 7822, 7825, 7824, 7827, ! 7826, 7829, 7828, 0, 0, ! 0, 0, 0, 7776, 0, ! 0, 0, 0, 7841, 7840, ! 7843, 7842, 7845, 7844, 7847, ! 7846, 7849, 7848, 7851, 7850, ! 7853, 7852, 7855, 7854, 7857, ! 7856, 7859, 7858, 7861, 7860, ! 7863, 7862, 7865, 7864, 7867, ! 7866, 7869, 7868, 7871, 7870, ! 7873, 7872, 7875, 7874, 7877, ! 7876, 7879, 7878, 7881, 7880, ! 7883, 7882, 7885, 7884, 7887, ! 7886, 7889, 7888, 7891, 7890, ! 7893, 7892, 7895, 7894, 7897, ! 7896, 7899, 7898, 7901, 7900, ! 7903, 7902, 7905, 7904, 7907, ! 7906, 7909, 7908, 7911, 7910, ! 7913, 7912, 7915, 7914, 7917, ! 7916, 7919, 7918, 7921, 7920, ! 7923, 7922, 7925, 7924, 7927, ! 7926, 7929, 7928, 0, 0, ! 0, 0, 0, 0, 7944, ! 7945, 7946, 7947, 7948, 7949, ! 7950, 7951, 7936, 7937, 7938, ! 7939, 7940, 7941, 7942, 7943, ! 7960, 7961, 7962, 7963, 7964, ! 7965, 0, 0, 7952, 7953, ! 7954, 7955, 7956, 7957, 0, ! 0, 7976, 7977, 7978, 7979, ! 7980, 7981, 7982, 7983, 7968, ! 7969, 7970, 7971, 7972, 7973, ! 7974, 7975, 7992, 7993, 7994, ! 7995, 7996, 7997, 7998, 7999, ! 7984, 7985, 7986, 7987, 7988, ! 7989, 7990, 7991, 8008, 8009, ! 8010, 8011, 8012, 8013, 0, ! 0, 8000, 8001, 8002, 8003, ! 8004, 8005, 0, 0, 0, ! 8025, 0, 8027, 0, 8029, ! 0, 8031, 0, 8017, 0, ! 8019, 0, 8021, 0, 8023, ! 8040, 8041, 8042, 8043, 8044, ! 8045, 8046, 8047, 8032, 8033, ! 8034, 8035, 8036, 8037, 8038, ! 8039, 8122, 8123, 8136, 8137, ! 8138, 8139, 8154, 8155, 8184, ! 8185, 8170, 8171, 8186, 8187, ! 0, 0, 8072, 8073, 8074, ! 8075, 8076, 8077, 8078, 8079, ! 8064, 8065, 8066, 8067, 8068, ! 8069, 8070, 8071, 8088, 8089, ! 8090, 8091, 8092, 8093, 8094, ! 8095, 8080, 8081, 8082, 8083, ! 8084, 8085, 8086, 8087, 8104, ! 8105, 8106, 8107, 8108, 8109, ! 8110, 8111, 8096, 8097, 8098, ! 8099, 8100, 8101, 8102, 8103, ! 8120, 8121, 0, 8124, 0, ! 0, 0, 0, 8112, 8113, ! 8048, 8049, 8115, 0, 921, ! 0, 0, 0, 0, 8140, ! 0, 0, 0, 0, 8050, ! 8051, 8052, 8053, 8131, 0, ! 0, 0, 8152, 8153, 0, ! 0, 0, 0, 0, 0, ! 8144, 8145, 8054, 8055, 0, ! 0, 0, 0, 8168, 8169, ! 0, 0, 0, 8172, 0, ! 0, 8160, 8161, 8058, 8059, ! 8165, 0, 0, 0, 0, ! 0, 0, 8188, 0, 0, ! 0, 0, 8056, 8057, 8060, ! 8061, 8179, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 4, 5, 6, 7, ! 8, 9, 0, 0, 0, ! 0, 0, 0, 0, 1, ! 2, 3, 4, 5, 6, ! 7, 8, 9, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, -2, ! -2, -2, -2, -2, -2, ! -2, -2, -2, -2, -2, ! -2, 1, 8560, 8561, 8562, ! 8563, 8564, 8565, 8566, 8567, ! 8568, 8569, 8570, 8571, 8572, ! 8573, 8574, 8575, 8544, 8545, ! 8546, 8547, 8548, 8549, 8550, ! 8551, 8552, 8553, 8554, 8555, ! 8556, 8557, 8558, 8559, 1000, ! 5000, 10000, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, ! 11, 12, 13, 14, 15, ! 16, 17, 18, 19, 20, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, ! 11, 12, 13, 14, 15, ! 16, 17, 18, 19, 20, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, ! 11, 12, 13, 14, 15, ! 16, 17, 18, 19, 20, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 9424, 9425, 9426, 9427, ! 9428, 9429, 9430, 9431, 9432, ! 9433, 9434, 9435, 9436, 9437, ! 9438, 9439, 9440, 9441, 9442, ! 9443, 9444, 9445, 9446, 9447, ! 9448, 9449, 9398, 9399, 9400, ! 9401, 9402, 9403, 9404, 9405, ! 9406, 9407, 9408, 9409, 9410, ! 9411, 9412, 9413, 9414, 9415, ! 9416, 9417, 9418, 9419, 9420, ! 9421, 9422, 9423, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 10, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 1, ! 2, 3, 4, 5, 6, ! 7, 8, 9, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 1, 2, 3, 4, ! 5, 6, 7, 8, 9, ! 10, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 1, 2, 3, 4, 5, ! 6, 7, 8, 9, 0, ! 0, 0, 0, 0, 0, ! 0, 65345, 65346, 65347, 65348, ! 65349, 65350, 65351, 65352, 65353, ! 65354, 65355, 65356, 65357, 65358, ! 65359, 65360, 65361, 65362, 65363, ! 65364, 65365, 65366, 65367, 65368, ! 65369, 65370, 0, 0, 0, ! 0, 0, 0, 65313, 65314, ! 65315, 65316, 65317, 65318, 65319, ! 65320, 65321, 65322, 65323, 65324, ! 65325, 65326, 65327, 65328, 65329, ! 65330, 65331, 65332, 65333, 65334, ! 65335, 65336, 65337, 65338, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, ! 0, 0, 0, 0 ! }; ! static const jshort secondary_attribute_table[] = ! { 1, 2, 3, ! 4, 5, 6, 7, 8, ! 9, 10, 11, 12, 50, ! 100, 500, 1000, 1, 2, ! 3, 4, 5, 6, 7, ! 8, 9, 10, 11, 12, ! 50, 100, 500, 1000 ! }; ! #endif /* COMPACT_CHARACTER */ #endif /* __JAVA_CHARTABLES_H__ */ --- 1,986 ---- ! /* java-chartables.h -- Character tables for java.lang.Character -*- c++ -*- ! Copyright (C) 2002 Free Software Foundation, Inc. ! *** This file is generated by scripts/MakeCharTables.java *** ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! #ifndef __JAVA_CHARTABLES_H__ ! #define __JAVA_CHARTABLES_H__ ! // These tables are automatically generated by scripts/MakeCharTables.java. ! // This is in turn parsing gnu.java.lang.CharData, which is generated by ! // scripts/unicode-muncher.pl. The Unicode data comes from ! // www.unicode.org; this header is based on ! // gnu/gcj/convert/UnicodeData-3.0.0.txt. JDK 1.4 uses Unicode version 3.0.0. ! // DO NOT EDIT the tables. Instead, fix the upstream scripts and run ! // them again. ! // The data is stored in C style arrays of the appropriate CNI types, to ! // guarantee that the data is constant and non-relocatable. The field ! // blocks stores the offset of a block of 2 ! // characters within data. The data field, in turn, stores ! // information about each character in the low order bits, and an offset ! // into the attribute tables upper, lower, ! // numValue, and direction. Notice that the ! // attribute tables are much smaller than 0xffff entries; as many characters ! // in Unicode share common attributes. Finally, there is a listing for ! // title exceptions (most characters just have the same title ! // case as upper case). ! // This file should only be included by natCharacter.cc ! /** ! * The character shift amount to look up the block offset. In other words, ! * (char) (blocks[ch >> SHIFT] + ch) is the index where ! * ch is described in data. ! */ ! #define SHIFT 5 ! /** ! * The mapping of character blocks to their location in data. ! * Each entry has been adjusted so that a modulo 16 sum with the desired ! * character gives the actual index into data. ! */ ! static const jchar blocks[] = { ! 450, 450, 449, 300, 299, 416, 504, 638, 513, 656, ! 439, 713, 343, 681, 575, 440, 257, 599, 761, 761, ! 880, 867, 65167, 830, 65413, 65381, 64949, 64929, 65469, 702, ! 65470, 65513, 65192, 65326, 559, 65185, 65437, 65121, 65449, 64288, ! 195, 269, 254, 64353, 64346, 261, 259, 248, 65163, 547, ! 600, 449, 502, 470, 65249, 547, 64938, 64341, 355, 65123, ! 246, 253, 65027, 64995, 64963, 64931, 64899, 64867, 64835, 64803, ! 64771, 64739, 95, 74, 165, 307, 65032, 93, 335, 418, ! 63081, 291, 290, 63681, 65104, 258, 257, 64067, 64648, 65191, ! 192, 64673, 64399, 62589, 153, 64273, 65050, 64802, 64297, 53, ! 62393, 65105, 64712, 65461, 62265, 64146, 65413, 65333, 64078, 63334, ! 65317, 64209, 64355, 64564, 65247, 63331, 64682, 64130, 64953, 63203, ! 65087, 64705, 65097, 63467, 63247, 62184, 64921, 62947, 63844, 64508, ! 64913, 62819, 62787, 62524, 62518, 61291, 63588, 63556, 64594, 63492, ! 63460, 64521, 63396, 61084, 64394, 63300, 63476, 63236, 63428, 63372, ! 62571, 62668, 63276, 63044, 62459, 63047, 62019, 62916, 62884, 60577, ! 62819, 62788, 62756, 62724, 62692, 62660, 62628, 62596, 62564, 62532, ! 62500, 62468, 62436, 62404, 62372, 62340, 62308, 62276, 62244, 62083, ! 63345, 62148, 62116, 63281, 61123, 61091, 61059, 61027, 61924, 62620, ! 62783, 60745, 62161, 61764, 59629, 59422, 61668, 62865, 60675, 60643, ! 60611, 60579, 60547, 60515, 60483, 60451, 60419, 60387, 60355, 60323, ! 60291, 60259, 60227, 60195, 60163, 60131, 60099, 60067, 60035, 60003, ! 59971, 59939, 59907, 59875, 59843, 59811, 59779, 59747, 59715, 59683, ! 59651, 59619, 59587, 59555, 59523, 59491, 59459, 59427, 59395, 59363, ! 58625, 58593, 58561, 58529, 61393, 58465, 58433, 58407, 61313, 61265, ! 61265, 61265, 61265, 61249, 57773, 61248, 61248, 61248, 57824, 58239, ! 61184, 59859, 60389, 58591, 61134, 61279, 58512, 61247, 61155, 61302, ! 61038, 61290, 61303, 61298, 61067, 61389, 61047, 60959, 60961, 61279, ! 61399, 61072, 61389, 61403, 61283, 57891, 57859, 57827, 60709, 60727, ! 60691, 61206, 61186, 60737, 60727, 60717, 60453, 60421, 60389, 60357, ! 60360, 60022, 60259, 60262, 59824, 60165, 60133, 59875, 57155, 57123, ! 57091, 57059, 59658, 59933, 60242, 60233, 60223, 60127, 56835, 56803, ! 59685, 59653, 59621, 59589, 59557, 59525, 59493, 59461, 56515, 56483, ! 56451, 56419, 56387, 56355, 56323, 56291, 56259, 56227, 56195, 56163, ! 56131, 56099, 56067, 56035, 56003, 55971, 55939, 55907, 55875, 55843, ! 55811, 55779, 55747, 55715, 55683, 55651, 55619, 55587, 55555, 55523, ! 55491, 55459, 55427, 55395, 55363, 55331, 55299, 55267, 55235, 55203, ! 55171, 55139, 58027, 57989, 57957, 57962, 57893, 57861, 57829, 57797, ! 57765, 57733, 57736, 56713, 58274, 57293, 55587, 55556, 58178, 55491, ! 55460, 56529, 56492, 54907, 55332, 55300, 57954, 52958, 54275, 54243, ! 57616, 57571, 57797, 57521, 57521, 57688, 57105, 57390, 57357, 57325, ! 57293, 56934, 57229, 57197, 57167, 57134, 54628, 54596, 54564, 54532, ! 54500, 54468, 54436, 54404, 54372, 54340, 54308, 54276, 54244, 54212, ! 54180, 54148, 54116, 54084, 54052, 54020, 53988, 53956, 53924, 53892, ! 53860, 53828, 53796, 53764, 53732, 53700, 53668, 53636, 53604, 53572, ! 53540, 53508, 53476, 53444, 53412, 53380, 53348, 53316, 53284, 53252, ! 53220, 53188, 53156, 53124, 53092, 53060, 53028, 52996, 52964, 52932, ! 52900, 52868, 52836, 52804, 52772, 52740, 52708, 52676, 52644, 52612, ! 52580, 52548, 52516, 52484, 52452, 52420, 52388, 52356, 52324, 52292, ! 52260, 52228, 52196, 52164, 52132, 52100, 52068, 52036, 52004, 51972, ! 51940, 51908, 51876, 51844, 51812, 51780, 51748, 51716, 51684, 51652, ! 51620, 51588, 51556, 51524, 51492, 51460, 51428, 51396, 51364, 51332, ! 51300, 51268, 51236, 51204, 51172, 51140, 51108, 51076, 51044, 51012, ! 50980, 50948, 50916, 50884, 50852, 50820, 50788, 50756, 50724, 50692, ! 50660, 50628, 50596, 50564, 50532, 50500, 50468, 50436, 50404, 50372, ! 50340, 50308, 50276, 50244, 50212, 50180, 50148, 50116, 50084, 50052, ! 50020, 49988, 49956, 49924, 49892, 49860, 49828, 49796, 49764, 49732, ! 49700, 49668, 49636, 49604, 49572, 49540, 49508, 49476, 49444, 49412, ! 49380, 49348, 49316, 49284, 49252, 49220, 49188, 49156, 49124, 49092, ! 49060, 49028, 48996, 48964, 48932, 48900, 48868, 48836, 48804, 48772, ! 48740, 48708, 48676, 48644, 48612, 48580, 48548, 48516, 48484, 48452, ! 48420, 48388, 48356, 48324, 48292, 48260, 48228, 48196, 48164, 48132, ! 48100, 45792, 47107, 47075, 47972, 47940, 47908, 47876, 47844, 47812, ! 47780, 47748, 47716, 47684, 47652, 47620, 47588, 47556, 47524, 47492, ! 47460, 47428, 47396, 47364, 47332, 47300, 47268, 47236, 47204, 47172, ! 47140, 47108, 47076, 47044, 47012, 46980, 46948, 46916, 46884, 46852, ! 46820, 46788, 46756, 46724, 46692, 46660, 46628, 46596, 46564, 46532, ! 46500, 46468, 46436, 46404, 46372, 46340, 46308, 46276, 46244, 46212, ! 46180, 46148, 46116, 46084, 46052, 46020, 45988, 45956, 45924, 45892, ! 45860, 45828, 45796, 45764, 45732, 45700, 45668, 45636, 45604, 45572, ! 45540, 45508, 45476, 45444, 45412, 45380, 45348, 45316, 45284, 45252, ! 45220, 45188, 45156, 45124, 45092, 45060, 45028, 44996, 44964, 44932, ! 44900, 44868, 44836, 44804, 44772, 44740, 44708, 44676, 44644, 44612, ! 44580, 44548, 44516, 44484, 44452, 44420, 44388, 44356, 44324, 44292, ! 44260, 44228, 44196, 44164, 44132, 44100, 44068, 44036, 44004, 43972, ! 43940, 43908, 43876, 43844, 43812, 43780, 43748, 43716, 43684, 43652, ! 43620, 43588, 43556, 43524, 43492, 43460, 43428, 43396, 43364, 43332, ! 43300, 43268, 43236, 43204, 43172, 43140, 43108, 43076, 43044, 43012, ! 42980, 42948, 42916, 42884, 42852, 42820, 42788, 42756, 42724, 42692, ! 42660, 42628, 42596, 42564, 42532, 42500, 42468, 42436, 42404, 42372, ! 42340, 42308, 42276, 42244, 42212, 42180, 42148, 42116, 42084, 42052, ! 42020, 41988, 41956, 41924, 41892, 41860, 41828, 41796, 41764, 41732, ! 41700, 41668, 41636, 41604, 41572, 41540, 41508, 41476, 41444, 41412, ! 41380, 41348, 41316, 41284, 41252, 41220, 41188, 41156, 41124, 41092, ! 41060, 41028, 40996, 40964, 40932, 40900, 40868, 40836, 40804, 40772, ! 40740, 40708, 40676, 40644, 40612, 40580, 40548, 40516, 40484, 40452, ! 40420, 40388, 40356, 40324, 40292, 40260, 40228, 40196, 40164, 40132, ! 40100, 40068, 40036, 40004, 39972, 39940, 39908, 39876, 39844, 39812, ! 39780, 39748, 39716, 39684, 39652, 39620, 39588, 39556, 39524, 39492, ! 39460, 39428, 39396, 39364, 39332, 39300, 39268, 39236, 39204, 39172, ! 39140, 39108, 39076, 39044, 39012, 38980, 38948, 38916, 38884, 38852, ! 38820, 38788, 38756, 38724, 38692, 38660, 38628, 38596, 38564, 38532, ! 38500, 38468, 38436, 38404, 38372, 38340, 38308, 38276, 38244, 38212, ! 38180, 38148, 38116, 38084, 38052, 38020, 37988, 37956, 37924, 37892, ! 37860, 37828, 37796, 37764, 37732, 37700, 37668, 37636, 37604, 37572, ! 37540, 37508, 37476, 37444, 37412, 37380, 37348, 37316, 37284, 37252, ! 37220, 37188, 37156, 37124, 37092, 37060, 37028, 36996, 36964, 36932, ! 36900, 36868, 36836, 36804, 36772, 36740, 36708, 36676, 36644, 36612, ! 36580, 36548, 36516, 36484, 36452, 36420, 36388, 36356, 36324, 36292, ! 36260, 36228, 36196, 36164, 36132, 36100, 36068, 36036, 36004, 35972, ! 35940, 35908, 35876, 35844, 35812, 35780, 35748, 35716, 35684, 35652, ! 35620, 35588, 35556, 35524, 35492, 35460, 35428, 35396, 35364, 35332, ! 35300, 35268, 35236, 35204, 35172, 35140, 35108, 35076, 35044, 35012, ! 34980, 34948, 34916, 34884, 34852, 34820, 34788, 34756, 34724, 34692, ! 34660, 34628, 34596, 34564, 34532, 34500, 34468, 34436, 34404, 34372, ! 34340, 34308, 34276, 34244, 34212, 34180, 34148, 34116, 34084, 34052, ! 34020, 33988, 33956, 33924, 33892, 33860, 33828, 33796, 33764, 33732, ! 33700, 33668, 33636, 33604, 33572, 33540, 33508, 33476, 33444, 33412, ! 33380, 33348, 33316, 33284, 33252, 33220, 33188, 33156, 33124, 33092, ! 33060, 33028, 32996, 32964, 32932, 32900, 32868, 32836, 32804, 32772, ! 32740, 32708, 32676, 32644, 32612, 32580, 32548, 32516, 32484, 32452, ! 32420, 32388, 32356, 32324, 32292, 32260, 32228, 32196, 32164, 32132, ! 32100, 32068, 32036, 32004, 31972, 31940, 31908, 31876, 31844, 31812, ! 31780, 31748, 31716, 31684, 31652, 31620, 31588, 31556, 31524, 31492, ! 31460, 31428, 31396, 31364, 31332, 31300, 31268, 31236, 31204, 31172, ! 31140, 31108, 31076, 31044, 31012, 30980, 30948, 30916, 30884, 30852, ! 30820, 30788, 30756, 30724, 30692, 30660, 30628, 30596, 30564, 30532, ! 30500, 30468, 30436, 30404, 30372, 30340, 30308, 30276, 30244, 30212, ! 30180, 30148, 30116, 30084, 30052, 30020, 29988, 29956, 29924, 29892, ! 29860, 29828, 29796, 29764, 29732, 29700, 29668, 29636, 29604, 29572, ! 29540, 29508, 29476, 29444, 29412, 29380, 29348, 29316, 29284, 29252, ! 29220, 29188, 29156, 29124, 29092, 29060, 29028, 28996, 28964, 28932, ! 28900, 28868, 28836, 28804, 28772, 28740, 28708, 28676, 28644, 28612, ! 28580, 28548, 28516, 28484, 28452, 28420, 28388, 28356, 28324, 28292, ! 28260, 28228, 28196, 28164, 28132, 28100, 28068, 28036, 28004, 27972, ! 27940, 27908, 27876, 27844, 27812, 27780, 27748, 27716, 27684, 27652, ! 27620, 27588, 27556, 27524, 27492, 27460, 27428, 27396, 27364, 27332, ! 27300, 27268, 27236, 27204, 27172, 27140, 27108, 24816, 26115, 26083, ! 26980, 26948, 26916, 26884, 26852, 26820, 26788, 26756, 26724, 26692, ! 26660, 26628, 26596, 26564, 26532, 26500, 26468, 26436, 26404, 26372, ! 26340, 26308, 26276, 26244, 26212, 26180, 26148, 26116, 26084, 26052, ! 26020, 25988, 25956, 25924, 25892, 25860, 27424, 28123, 28310, 24803, ! 24771, 24739, 24707, 24675, 24643, 24611, 24579, 24547, 24515, 24483, ! 24451, 24419, 24387, 24355, 24323, 24291, 24259, 24227, 24195, 24163, ! 24131, 24099, 24067, 24035, 24003, 23971, 23939, 23907, 23875, 23843, ! 23811, 23779, 23747, 23715, 23683, 23651, 23619, 23587, 23555, 23523, ! 23491, 23459, 23427, 23395, 23363, 23331, 23299, 23267, 23235, 23203, ! 23171, 23139, 23107, 23075, 23043, 23011, 23908, 23876, 23844, 23812, ! 23780, 23748, 23716, 23684, 23652, 23620, 23588, 23556, 23524, 23492, ! 23460, 23428, 23396, 23364, 23332, 23300, 23268, 23236, 23204, 23172, ! 23140, 23108, 23076, 23044, 23012, 22980, 22948, 22916, 22884, 22852, ! 22820, 22788, 22756, 22724, 22692, 22660, 22628, 22596, 22564, 22532, ! 22500, 22468, 22436, 22404, 22372, 22340, 22308, 22276, 22244, 22212, ! 22180, 22148, 22116, 22084, 22052, 22020, 21988, 21956, 21924, 21892, ! 21860, 21828, 21796, 21764, 21732, 21700, 21668, 21636, 21604, 21572, ! 21540, 21508, 21476, 21444, 21412, 21380, 21348, 21316, 21284, 21252, ! 21220, 21188, 21156, 21124, 21092, 21060, 21028, 20996, 20964, 20932, ! 20900, 20868, 20836, 20804, 20772, 20740, 20708, 20676, 20644, 20612, ! 20580, 20548, 20516, 20484, 20452, 20420, 20388, 20356, 20324, 20292, ! 20260, 20228, 20196, 20164, 20132, 20100, 20068, 20036, 20004, 19972, ! 19940, 19908, 19876, 19844, 19812, 19780, 19748, 19716, 19684, 19652, ! 19620, 19588, 19556, 19524, 19492, 19460, 19428, 19396, 19364, 19332, ! 19300, 19268, 19236, 19204, 19172, 19140, 19108, 19076, 19044, 19012, ! 18980, 18948, 18916, 18884, 18852, 18820, 18788, 18756, 18724, 18692, ! 18660, 18628, 18596, 18564, 18532, 18500, 18468, 18436, 18404, 18372, ! 18340, 18308, 18276, 18244, 18212, 18180, 18148, 18116, 18084, 18052, ! 18020, 17988, 17956, 17924, 17892, 17860, 17828, 17796, 17764, 17732, ! 17700, 17668, 17636, 17604, 17572, 17540, 17508, 17476, 17444, 17412, ! 17380, 17348, 17316, 17284, 17252, 17220, 17188, 17156, 17124, 17092, ! 17060, 17028, 16996, 16964, 16932, 16900, 16868, 16836, 16804, 16772, ! 16740, 16708, 16676, 16644, 16612, 16580, 16548, 16516, 16484, 16452, ! 16420, 16388, 16356, 16324, 16292, 16260, 16228, 16196, 16164, 16132, ! 16100, 16068, 16036, 16004, 15972, 15940, 15908, 15876, 15844, 15812, ! 15780, 15748, 15716, 15684, 15652, 15620, 15588, 15556, 15524, 15492, ! 15460, 15428, 15396, 15364, 15332, 15300, 15268, 15236, 15204, 15172, ! 15140, 15108, 15076, 15044, 15012, 14980, 14948, 14916, 14884, 14852, ! 14820, 14788, 14756, 14724, 14692, 14660, 14628, 14596, 14564, 14532, ! 14500, 14468, 14436, 14404, 14372, 14340, 14308, 14276, 14244, 14212, ! 14180, 14148, 14116, 14084, 14052, 14020, 13988, 13956, 13924, 13892, ! 13860, 13828, 13796, 13764, 13732, 13700, 13668, 13636, 13604, 13572, ! 13540, 13508, 13476, 13444, 13412, 13380, 13348, 13316, 13284, 13252, ! 13220, 13188, 13156, 13124, 13092, 13060, 13028, 12996, 12964, 12932, ! 12900, 12868, 12836, 12804, 12772, 10482, 11779, 11747, 15397, 15365, ! 15333, 15301, 15269, 15237, 15205, 15173, 15141, 15109, 15077, 15045, ! 15013, 14981, 14949, 14917, 14885, 14853, 14821, 14789, 14757, 14725, ! 14693, 14661, 14629, 14597, 14565, 14533, 14501, 14469, 14437, 14405, ! 14373, 14341, 14309, 14277, 14245, 14213, 14181, 14149, 14117, 14085, ! 14053, 14021, 13989, 13957, 13925, 13893, 13861, 13829, 13797, 13765, ! 13733, 13701, 13669, 13637, 13605, 13573, 13541, 13509, 13477, 13445, ! 13413, 13381, 13381, 13349, 13317, 13285, 13253, 13221, 13189, 13157, ! 13125, 13093, 13061, 13029, 12997, 12965, 12933, 12901, 12869, 12837, ! 12805, 12773, 12741, 12709, 12677, 12645, 12613, 12581, 12549, 12517, ! 12485, 12453, 12421, 12389, 12357, 12325, 12293, 12261, 12229, 12197, ! 12165, 12133, 12101, 12069, 12037, 12005, 11973, 11941, 11909, 11877, ! 11845, 11813, 11781, 11749, 11717, 11685, 11653, 11621, 11589, 11557, ! 11525, 11493, 11461, 11429, 11397, 11365, 11333, 11301, 11269, 11237, ! 11205, 11173, 11141, 11109, 11077, 11045, 11013, 10981, 10949, 10917, ! 10885, 10853, 10821, 10789, 10757, 10725, 10693, 10661, 10629, 10597, ! 10565, 10533, 10501, 10469, 10437, 10405, 10373, 10341, 10309, 10277, ! 10245, 10213, 10181, 10149, 10117, 10085, 10053, 10021, 9989, 9957, ! 9925, 9893, 9861, 9829, 9797, 9765, 9733, 9701, 9669, 9637, ! 9605, 9573, 9541, 9509, 9477, 9445, 9413, 9381, 9349, 9317, ! 9285, 9253, 9221, 9189, 9157, 9125, 9093, 9061, 9029, 8997, ! 8965, 8933, 8901, 8869, 8837, 8805, 8773, 8741, 8709, 8677, ! 8645, 8613, 8581, 8549, 8517, 8485, 8453, 8421, 8389, 8357, ! 8325, 8293, 8261, 8229, 8197, 8165, 8133, 8101, 8069, 8037, ! 8005, 7973, 7941, 7909, 7877, 7845, 7813, 7781, 7749, 7717, ! 7685, 7653, 7621, 7589, 7557, 7525, 7493, 7461, 7429, 7397, ! 7365, 7333, 7301, 7269, 7237, 7205, 7173, 7141, 7109, 7077, ! 7045, 7013, 4196, 4164, 4132, 4100, 4068, 4036, 4004, 3972, ! 3940, 1640, 2947, 2915, 2883, 2851, 2819, 2787, 2674, 6469, ! 2641, 3350, 3318, 3244, 3235, 3222, 3190, 3158, 3126, 3094, ! 3062, 3030, 2998, 2966, 2934, 2904, 2854, 2838, 2738, 2774, ! 2710, 706, 1987, 5733, 5729, 1023, 2550, 2518, 2486, 1500, ! 2994, 5537, 4032, 448, 433, 2501, 2086, 4735, }; + /** Length of blocks. */ + static const int blocks_length = 2048; ! /** ! * Information about each character. The low order 5 bits form the ! * character type, the next bit is a flag for non-breaking spaces, and the ! * next bit is a flag for mirrored directionality. The high order 9 bits ! * form the offset into the attribute tables. Note that this limits the ! * number of unique character attributes to 512, which is not a problem ! * as of Unicode version 3.2.0, but may soon become one. ! */ ! static const jchar data[] = { ! 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, ! 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, ! 12161, 12290, 15872, 15872, 12161, 12290, 15872, 15872, 15872, 15872, ! 15872, 15872, 14853, 14853, 15872, 15872, 15872, 14853, 14853, 14853, ! 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 15872, 14853, 14853, 14853, 15872, 15872, 15872, 15872, 23176, ! 23176, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 14853, 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, ! 15872, 15872, 20632, 15872, 15872, 15872, 15872, 17798, 15872, 15872, ! 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, 15872, 15872, ! 14853, 14853, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 15872, 15872, 15872, 15872, 20738, 20738, 20738, 20738, 20738, 20738, ! 20738, 20738, 20738, 20738, 20738, 20738, 20738, 20738, 20738, 20738, ! 20738, 20738, 20738, 20738, 20738, 20738, 20738, 20738, 20738, 20738, ! 20738, 20738, 20738, 20738, 20738, 10498, 15872, 20632, 10772, 15872, ! 15872, 15872, 15872, 15872, 15872, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 17926, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 6683, 6683, 15872, ! 15872, 15872, 15872, 17668, 15872, 15872, 15872, 664, 15872, 664, ! 25877, 26006, 664, 6807, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 17668, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 17668, 17668, 6683, 6683, 6683, ! 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, ! 6683, 17668, 17668, 6683, 6683, 6683, 6683, 6683, 6683, 6683, ! 6683, 6683, 6683, 6683, 6683, 6683, 6683, 10498, 28930, 10498, ! 15872, 10498, 10498, 29441, 29441, 29441, 29441, 29187, 6683, 6683, ! 6683, 27778, 27778, 10498, 10498, 15872, 15872, 10498, 10498, 27905, ! 27905, 29569, 29569, 15872, 6683, 6683, 6683, 6914, 7042, 7170, ! 7298, 7426, 7554, 7682, 7810, 7938, 8066, 8194, 8322, 8450, ! 8578, 8706, 8834, 8962, 9090, 9218, 9346, 9474, 9602, 9730, ! 9858, 9986, 10114, 1109, 3225, 1238, 3225, 15, 15, 15, ! 15, 15, 271, 15, 15, 15, 15, 15, 15, 15, ! 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, ! 15, 15, 15, 15, 15, 15, 15, 15, 15, 143, ! 271, 143, 399, 271, 15, 15, 15, 15, 15, 15, ! 15, 15, 15, 15, 15, 15, 15, 15, 271, 271, ! 271, 143, 524, 664, 664, 792, 922, 792, 664, 664, ! 1109, 1238, 664, 1305, 1432, 1556, 1432, 1688, 1801, 1929, ! 2057, 2185, 2313, 2441, 2569, 2697, 2825, 2953, 1432, 664, ! 3161, 3225, 3161, 664, 3329, 3457, 3585, 3713, 3841, 3969, ! 4097, 4225, 4353, 4481, 4609, 4737, 4865, 4993, 5121, 5249, ! 5377, 5505, 5633, 5761, 5889, 6017, 6145, 6273, 6401, 6529, ! 1109, 664, 1238, 6683, 6807, 664, 664, 664, 3225, 1109, ! 1238, 15872, 664, 664, 664, 664, 664, 664, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 10284, 664, 922, 922, ! 922, 922, 10396, 10396, 6683, 10396, 10498, 10717, 3225, 10772, ! 10396, 6683, 10908, 1305, 11019, 11147, 6683, 11266, 10396, 664, ! 6683, 11403, 10498, 11614, 11659, 11659, 11659, 664, 664, 1305, ! 1556, 3225, 3225, 3225, 15872, 664, 922, 792, 664, 15872, ! 15872, 15872, 15872, 21253, 21253, 21253, 15872, 21253, 15872, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 15872, 15872, 15872, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 15872, 20252, 20252, ! 20097, 20097, 20097, 20097, 20097, 20097, 20097, 20097, 20097, 20097, ! 20097, 20097, 20097, 20097, 20097, 20097, 11777, 11777, 11777, 11777, ! 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, ! 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, 3225, ! 11777, 11777, 11777, 11777, 11777, 11777, 11777, 10498, 12929, 12161, ! 12290, 12161, 12290, 13057, 12161, 12290, 13185, 13185, 12161, 12290, ! 10498, 13313, 13441, 13569, 12161, 12290, 13185, 13697, 13826, 13953, ! 14081, 12161, 12290, 10498, 10498, 13953, 14209, 10498, 14337, 12290, ! 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 10498, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, ! 12290, 15872, 15872, 15872, 15872, 15872, 15872, 23305, 23433, 23561, ! 23689, 23817, 23945, 24073, 24201, 24329, 24457, 17798, 17798, 14853, ! 14853, 14853, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 6683, 6683, 18049, 664, 18177, 18177, 18177, ! 15872, 18305, 15872, 18433, 18433, 10498, 11777, 11777, 11777, 11777, ! 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, ! 11777, 11777, 11906, 11906, 11906, 11906, 11906, 11906, 11906, 11906, ! 11906, 11906, 11906, 11906, 11906, 11906, 11906, 11906, 11906, 11906, ! 11906, 11906, 11906, 11906, 11906, 3225, 11906, 11906, 11906, 11906, ! 11906, 11906, 11906, 12034, 11906, 11906, 18818, 11906, 11906, 11906, ! 11906, 11906, 11906, 11906, 11906, 11906, 18946, 19074, 19074, 15872, ! 19202, 19330, 19457, 19457, 19457, 19586, 19714, 10498, 15872, 15872, ! 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, ! 12161, 12290, 12161, 12290, 12161, 12290, 10498, 15105, 15235, 15362, ! 12161, 12290, 15617, 15745, 12161, 12290, 12161, 12290, 12161, 12290, ! 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, ! 12417, 12546, 12161, 12290, 12161, 12290, 12161, 12290, 10498, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 19842, 19970, 15490, 10498, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 23056, 23056, 23056, 23056, 23056, 23056, 32139, 15872, 15872, ! 15872, 32267, 32395, 32523, 32651, 32779, 32907, 1305, 1305, 3225, ! 1109, 1238, 10498, 14853, 14853, 14853, 14853, 15105, 15235, 15362, ! 15105, 15235, 15362, 15105, 15235, 15362, 12161, 12290, 12161, 12290, ! 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, ! 12161, 12290, 15490, 12161, 12290, 20252, 17798, 17798, 17798, 17798, ! 15872, 20359, 20359, 15872, 15872, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12673, ! 12161, 12290, 12161, 12290, 12161, 12290, 12802, 12161, 12290, 12161, ! 12290, 12161, 12290, 14465, 12161, 12290, 14465, 10498, 10498, 12161, ! 12290, 14465, 12161, 12290, 14593, 14593, 12161, 12290, 12161, 12290, ! 14721, 12161, 12290, 10498, 14853, 12161, 12290, 10498, 14978, 19457, ! 12161, 12290, 12161, 12290, 15872, 15872, 12161, 12290, 15872, 15872, ! 12161, 12290, 15872, 15872, 15872, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 1432, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 21144, 15872, 15872, 15872, 21144, 21144, 21144, 21144, 21144, 21144, ! 21144, 21144, 21144, 21144, 21144, 21144, 21144, 21144, 15872, 23056, ! 21253, 17798, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 15872, 15872, 23056, 19457, 19457, 19457, 19457, 19457, 19457, ! 19457, 19457, 19457, 19457, 19457, 19457, 19457, 19457, 19457, 19457, ! 19457, 19457, 19457, 19457, 19457, 19457, 19457, 19457, 19457, 19457, ! 19457, 19457, 19457, 19457, 19457, 19457, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 15872, 14853, 15872, 15872, 15872, 15872, ! 15872, 23305, 23433, 23561, 23689, 23817, 23945, 24073, 24201, 24329, ! 24457, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 10498, 10498, 10498, 16002, 16130, 10498, 16258, ! 16258, 10498, 16386, 10498, 16514, 10498, 10498, 10498, 10498, 16258, ! 10498, 10498, 16642, 10498, 10498, 10498, 10498, 16770, 16898, 10498, ! 10498, 10498, 10498, 10498, 16898, 10498, 10498, 17026, 10498, 10498, ! 17154, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, ! 10498, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 10498, 10498, 10498, 10498, 10498, 15872, 15872, ! 15872, 15872, 15872, 20997, 17798, 20997, 20997, 15872, 20997, 20997, ! 15872, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, ! 20997, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21144, 21253, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 20359, 20359, 17798, 20359, 20359, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 11659, 11659, 11659, ! 11659, 11659, 11659, 11659, 11659, 11659, 11659, 11659, 11659, 33419, ! 17282, 10498, 10498, 17282, 10498, 10498, 10498, 10498, 17282, 10498, ! 17410, 17410, 10498, 10498, 10498, 10498, 10498, 10498, 17538, 10498, ! 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, 10498, ! 10498, 10498, 10498, 15872, 15872, 17668, 17668, 17668, 17668, 17668, ! 17668, 17668, 17668, 17668, 6683, 6683, 17668, 17668, 17668, 17668, ! 17668, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, 6683, ! 17668, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 20481, 20481, ! 20481, 20481, 20481, 20481, 20481, 20481, 20481, 20481, 20481, 20481, ! 20481, 20481, 20481, 20481, 20481, 20481, 20481, 20481, 20481, 20481, ! 20481, 15872, 15872, 17668, 20632, 20632, 20632, 20632, 20632, 20632, ! 11777, 11777, 15872, 11777, 11777, 11777, 11777, 11777, 11777, 11777, ! 11777, 11777, 18562, 18690, 18690, 18690, 10498, 11906, 11906, 11906, ! 11906, 11906, 11906, 11906, 11906, 11906, 11906, 11906, 11906, 11906, ! 11906, 11906, 11906, 19970, 19970, 19970, 19970, 19970, 19970, 19970, ! 19970, 19970, 19970, 19970, 19970, 19970, 19970, 19970, 19970, 17798, ! 17798, 17798, 17798, 17798, 20632, 17798, 17798, 14853, 14853, 14853, ! 14853, 15872, 15872, 15872, 15872, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 15872, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 15872, 17798, 17798, ! 17798, 20888, 17798, 17798, 20888, 17798, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 20997, 20997, 20997, ! 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, ! 20997, 20997, 20997, 15872, 15872, 15872, 15872, 15872, 20997, 20997, ! 20997, 20888, 20888, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 23433, 23561, 23689, 23817, 23945, 24073, ! 24201, 24329, 24457, 25355, 25483, 25611, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 17798, ! 23176, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, ! 15872, 14853, 14853, 14853, 15872, 14853, 14853, 14853, 14853, 15872, ! 15872, 15872, 14853, 14853, 15872, 14853, 15872, 14853, 14853, 14853, ! 14853, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, ! 15872, 15872, 15872, 15872, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 23176, 23176, ! 23176, 23176, 15872, 17798, 17798, 17798, 15872, 17798, 17798, 17798, ! 17798, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 17798, 17798, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 17798, ! 23176, 23176, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 15872, 15872, 14853, 14853, 15872, 15872, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, 15872, 15872, ! 23176, 23176, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, ! 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, 14853, 14853, ! 14853, 15872, 15872, 15872, 15872, 23305, 23433, 23561, 23689, 23817, ! 23945, 24073, 24201, 24329, 24457, 20252, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 21513, 21641, 21769, 21897, 22025, 22153, 22281, 22409, 22537, ! 22665, 792, 22808, 22808, 21144, 15872, 15872, 17798, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 15872, 15872, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 25877, 26006, ! 21380, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, 21253, ! 21253, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 23176, 23176, 20632, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 17798, 17798, 23176, ! 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 14853, ! 15872, 14853, 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 20632, 20632, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 17798, 17798, 17798, ! 17798, 17798, 21380, 21380, 17798, 17798, 10396, 17798, 17798, 17798, ! 17798, 15872, 15872, 1801, 1929, 2057, 2185, 2313, 2441, 2569, ! 2697, 2825, 2953, 21253, 21253, 21253, 22940, 22940, 15872, 14853, ! 14853, 14853, 15872, 14853, 15872, 14853, 15872, 15872, 14853, 14853, ! 15872, 14853, 14853, 14853, 14853, 17798, 14853, 14853, 17798, 17798, ! 17798, 17798, 17798, 17798, 15872, 17798, 17798, 14853, 15872, 15872, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 14853, 14853, 14853, 14853, 14853, 15872, 15872, 15872, 15872, ! 17798, 17798, 23176, 15872, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, 17798, 14853, ! 23176, 23176, 23176, 23176, 23176, 15872, 17798, 23176, 23176, 15872, ! 23176, 23176, 17798, 17798, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 23176, 23176, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 14853, 15872, 20632, 20632, 20632, 20632, 20632, 20632, 20632, 20632, ! 23433, 23561, 23689, 23817, 23945, 24073, 24201, 24329, 24457, 25355, ! 26123, 26251, 26379, 26507, 26635, 26763, 26891, 27019, 25483, 27147, ! 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 14853, 14853, 15872, 15872, 14853, 14853, 14853, 14853, 15872, ! 15872, 17798, 14853, 23176, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 23176, 23176, 23176, 23176, 17798, 15872, 15872, 14853, ! 17798, 17798, 17798, 17798, 15872, 15872, 15872, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 15872, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 15872, 14853, 15872, 15872, 15872, 14853, ! 14853, 14853, 14853, 15872, 15872, 17798, 15872, 23176, 23176, 23176, ! 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, ! 14853, 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, ! 14853, 15872, 14853, 14853, 14853, 14853, 15872, 15872, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 15872, 14853, 15872, 14853, 14853, ! 14853, 14853, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 17798, 14853, 14853, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 15872, 15872, 15872, 15872, 922, 922, 922, 922, 922, ! 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, ! 922, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 14853, 14853, 17798, ! 17798, 20632, 20632, 23305, 23433, 23561, 23689, 23817, 23945, 24073, ! 24201, 24329, 24457, 20632, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 664, ! 664, 792, 922, 792, 664, 664, 25877, 26006, 664, 1305, ! 1432, 1556, 1432, 1688, 1801, 1929, 2057, 2185, 2313, 2441, ! 2569, 2697, 2825, 2953, 1432, 664, 3225, 3225, 3225, 664, ! 664, 664, 664, 664, 664, 10772, 664, 664, 664, 664, ! 23056, 23056, 23056, 23056, 15872, 23305, 23433, 23561, 23689, 23817, ! 23945, 24073, 24201, 24329, 24457, 15872, 15872, 15872, 15872, 15872, ! 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 15872, 14853, 14853, 14853, 14853, 14853, 15872, 15872, 15872, ! 15872, 23176, 17798, 17798, 17798, 17798, 15872, 15872, 23176, 23176, ! 15872, 15872, 23176, 23176, 17798, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 23176, 15872, 15872, 15872, 15872, 14853, ! 14853, 15872, 14853, 15872, 15872, 14853, 14853, 15872, 14853, 15872, ! 15872, 14853, 15872, 15872, 15872, 15872, 15872, 15872, 14853, 14853, ! 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 14853, 14853, 15872, 14853, 14853, 15872, 14853, 14853, 15872, ! 15872, 17798, 15872, 23176, 23176, 17798, 17798, 15872, 15872, 15872, ! 15872, 17798, 17798, 15872, 15872, 17798, 17798, 17798, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 14853, ! 14853, 14853, 14853, 15872, 14853, 15872, 14853, 14853, 17798, 17798, ! 15872, 15872, 23305, 23433, 23561, 23689, 23817, 23945, 24073, 24201, ! 24329, 24457, 14853, 14853, 922, 922, 24587, 24715, 24843, 24971, ! 25099, 25227, 20252, 15872, 15872, 15872, 15872, 15872, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 15872, 14853, 14853, 15872, 14853, ! 14853, 14853, 14853, 14853, 15872, 15872, 17798, 14853, 23176, 23176, ! 17798, 17798, 17798, 17798, 17798, 15872, 17798, 17798, 23176, 15872, ! 23176, 23176, 17798, 15872, 15872, 14853, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 23305, 23433, 23561, 23689, 23817, 23945, 24073, 24201, 24329, ! 24457, 25099, 25099, 25099, 25099, 25099, 25099, 25099, 25099, 25099, ! 25099, 20252, 17798, 20252, 17798, 20252, 17798, 25877, 26006, 25877, ! 26006, 23176, 23176, 17798, 17798, 17798, 15872, 15872, 15872, 23176, ! 23176, 15872, 15872, 23176, 23176, 17798, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 17798, 23176, 15872, 15872, 15872, 15872, ! 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, 15872, 14853, ! 14853, 15872, 23176, 17798, 17798, 17798, 17798, 23176, 17798, 15872, ! 15872, 15872, 17798, 17798, 23176, 17798, 15872, 15872, 15872, 15872, ! 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 23176, 23176, 23176, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 23176, 23176, 15872, 15872, 15872, 23176, 23176, 23176, ! 15872, 23176, 23176, 23176, 17798, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 23176, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 15872, 17668, ! 15872, 17798, 17798, 17798, 17798, 17798, 17798, 15872, 15872, 23305, ! 23433, 23561, 23689, 23817, 23945, 24073, 24201, 24329, 24457, 15872, ! 15872, 14853, 14853, 15872, 15872, 15872, 15872, 23305, 23433, 23561, ! 23689, 23817, 23945, 24073, 24201, 24329, 24457, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 17798, 17798, 17798, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 20359, 20359, 20359, 23176, ! 17798, 17798, 17798, 15872, 15872, 23176, 23176, 23176, 15872, 23176, ! 23176, 23176, 17798, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 23176, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, 15872, ! 15872, 17798, 15872, 15872, 15872, 15872, 23176, 23176, 23176, 17798, ! 17798, 17798, 15872, 17798, 15872, 23176, 23176, 23176, 23176, 23176, ! 23176, 23176, 23176, 17798, 23176, 23176, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 17798, 17798, 17798, 20632, 20632, 20632, ! 20632, 20632, 20632, 20632, 922, 20632, 15872, 15872, 15872, 14853, ! 14853, 14853, 14853, 14853, 14853, 17668, 17798, 17798, 17798, 17798, ! 17798, 17798, 17798, 17798, 20632, 23305, 23433, 23561, 23689, 23817, ! 23945, 24073, 24201, 24329, 24457, 20632, 20632, 15872, 15872, 15872, ! 15872, 14853, 20252, 20252, 20252, 20632, 20632, 20632, 20632, 20632, ! 20632, 20632, 20632, 25784, 20632, 20632, 20632, 20632, 20632, 20632, ! 20252, 20252, 20252, 20252, 20252, 17798, 17798, 20252, 20252, 20252, ! 20252, 20252, 20252, 17798, 20252, 20252, 20252, 20252, 20252, 20252, ! 15872, 15872, 20252, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 15872, 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 15872, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 15872, 15872, 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 6807, 17668, 17668, 17668, 15872, 23305, 23433, 23561, ! 23689, 23817, 23945, 24073, 24201, 24329, 24457, 20632, 20632, 20632, ! 20632, 20632, 20632, 14853, 14853, 14853, 14853, 14853, 14853, 23176, ! 23176, 17798, 17798, 15872, 15872, 15872, 15872, 15872, 15872, 524, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 25877, 26006, 15872, 15872, ! 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 20632, 20632, 20632, 27275, 27403, 27531, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 17798, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, 12290, 12161, ! 12290, 12161, 12290, 12161, 12290, 12161, 12290, 10498, 10498, 10498, ! 10498, 10498, 27650, 15872, 15872, 15872, 15872, 27778, 27778, 27778, ! 27778, 27778, 27778, 27778, 27778, 27905, 27905, 27905, 27905, 27905, ! 27905, 27905, 27905, 27778, 27778, 27778, 27778, 27778, 27778, 27778, ! 27778, 27905, 27905, 27905, 27905, 27905, 27905, 27905, 27905, 27778, ! 27778, 27778, 27778, 27778, 27778, 15872, 15872, 27905, 27905, 27905, ! 27905, 27905, 27905, 15872, 15872, 10498, 27778, 10498, 27778, 10498, ! 27778, 10498, 27778, 15872, 27905, 15872, 27905, 15872, 27905, 15872, ! 27905, 27778, 27778, 27778, 27778, 27778, 27778, 27778, 27778, 27905, ! 27905, 27905, 27905, 27905, 27905, 27905, 27905, 28034, 28034, 28162, ! 28162, 28162, 28162, 28290, 28290, 28418, 28418, 28546, 28546, 28674, ! 28674, 15872, 15872, 27778, 27778, 27778, 27778, 27778, 27778, 27778, ! 27778, 28803, 28803, 28803, 28803, 28803, 28803, 28803, 28803, 27778, ! 27778, 27778, 27778, 27778, 27778, 27778, 27778, 28803, 28803, 28803, ! 28803, 28803, 28803, 28803, 28803, 27778, 27778, 10498, 28930, 10498, ! 15872, 10498, 10498, 27905, 27905, 29057, 29057, 29187, 6683, 29314, ! 6683, 6914, 7042, 7170, 7298, 7426, 7554, 7682, 7810, 7938, ! 8066, 8194, 8322, 8450, 8578, 8706, 8834, 8962, 9090, 9218, ! 9346, 9474, 9602, 9730, 9858, 9986, 10114, 25877, 3225, 26006, ! 3225, 15872, 27778, 27778, 10498, 10498, 10498, 29698, 10498, 10498, ! 27905, 27905, 29825, 29825, 29953, 6683, 6683, 6683, 15872, 15872, ! 10498, 28930, 10498, 15872, 10498, 10498, 30081, 30081, 30209, 30209, ! 29187, 6683, 6683, 15872, 524, 524, 524, 524, 524, 524, ! 524, 30380, 524, 524, 524, 30476, 23056, 23056, 30608, 30736, ! 10772, 30900, 10772, 10772, 10772, 10772, 664, 664, 31005, 31134, ! 25877, 31005, 31005, 31134, 25877, 31005, 664, 664, 664, 664, ! 664, 664, 664, 664, 31245, 31374, 31504, 31632, 31760, 31888, ! 32016, 30380, 792, 792, 792, 792, 792, 664, 664, 664, ! 664, 10717, 11614, 664, 664, 664, 664, 6807, 32139, 11403, ! 11019, 11147, 32267, 32395, 32523, 32651, 32779, 32907, 1305, 1305, ! 3225, 1109, 1238, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 15872, 15872, 15872, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 15872, 15872, 15872, 15872, ! 15872, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 19457, 10396, ! 10396, 10396, 10396, 19457, 10396, 10396, 10498, 19457, 19457, 19457, ! 10498, 10498, 19457, 19457, 19457, 10498, 10396, 19457, 10396, 10396, ! 10396, 19457, 19457, 19457, 19457, 19457, 10396, 10396, 41098, 41226, ! 41354, 41482, 41610, 41738, 41866, 41994, 42122, 17798, 17798, 17798, ! 17798, 17798, 17798, 10772, 17668, 17668, 17668, 17668, 17668, 10396, ! 10396, 42250, 42378, 42506, 15872, 15872, 15872, 10396, 10396, 10396, ! 10396, 15872, 10396, 10396, 10396, 10396, 15872, 15872, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 3225, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 3225, 3225, 10396, 10396, ! 3225, 10396, 3225, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 3225, 10396, ! 10396, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 37642, 37770, 37898, 38026, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 3225, 3225, 3225, 3225, 3225, 10396, 10396, 10396, 10396, ! 10396, 3225, 3225, 10396, 10396, 10396, 10396, 19457, 10396, 33025, ! 10396, 19457, 10396, 33153, 33281, 19457, 19457, 10908, 10498, 19457, ! 19457, 10396, 19457, 10498, 14853, 14853, 14853, 14853, 10498, 10396, ! 15872, 15872, 15872, 15872, 15872, 33546, 33674, 33802, 33930, 34058, ! 34186, 34314, 34442, 34570, 34698, 34826, 34954, 35082, 35210, 35338, ! 35466, 35594, 35722, 35850, 35978, 36106, 36234, 36362, 36490, 36618, ! 36746, 36874, 37002, 37130, 37258, 37386, 37514, 3225, 3225, 3161, ! 3161, 3225, 3225, 3161, 3161, 3161, 3161, 3161, 3161, 3161, ! 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, ! 3161, 3161, 3225, 3225, 3225, 3225, 3225, 3161, 3161, 3161, ! 3161, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225, ! 3161, 3161, 3161, 3161, 3161, 3225, 3225, 3161, 3161, 3225, ! 3225, 3225, 3225, 3161, 3161, 3161, 3161, 3161, 3161, 3161, ! 3161, 3161, 3161, 3161, 3161, 3161, 3225, 3225, 3161, 3161, ! 3161, 3161, 3225, 3225, 3225, 3225, 3225, 3161, 3225, 3225, ! 3225, 3225, 3225, 3225, 3225, 10396, 10396, 3225, 10396, 10396, ! 3225, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 3225, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 15872, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 3225, 3161, 3161, 3161, 3161, 3225, 3225, 3225, 3161, ! 3161, 3161, 3161, 3161, 3161, 3225, 3225, 3225, 3161, 1305, ! 1305, 3225, 3161, 3161, 3225, 3225, 3225, 3161, 3161, 3161, ! 3161, 3225, 3161, 3225, 3161, 3225, 3225, 3225, 3225, 3161, ! 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3225, 3225, ! 3225, 3225, 3225, 3161, 3225, 3161, 3161, 3161, 3161, 3161, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 1109, 1238, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 15872, 15872, 15872, 15872, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 39580, ! 39580, 39580, 39580, 39580, 39580, 39580, 39580, 39580, 39580, 39580, ! 39580, 39580, 39580, 39580, 39580, 39708, 39708, 39708, 39708, 39708, ! 39708, 39708, 39708, 39708, 39708, 39708, 39708, 39708, 39708, 39708, ! 39708, 32139, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 3161, 3225, 3161, 3225, 3161, 3161, 3161, ! 3161, 3161, 3161, 3161, 3161, 3225, 3225, 3161, 3161, 3161, ! 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, 3161, ! 3161, 3161, 3161, 3161, 3161, 3225, 3225, 3161, 3161, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 922, 922, 3225, 6683, 10396, 922, 922, ! 15872, 10396, 3225, 3225, 3225, 3225, 10396, 10396, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 23056, 23056, ! 23056, 10396, 10396, 15872, 15872, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 15872, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 15872, 10396, 15872, 10396, ! 10396, 10396, 10396, 15872, 15872, 15872, 10396, 15872, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 33419, ! 39819, 39947, 40075, 40203, 40331, 40459, 40587, 40715, 40843, 33419, ! 39819, 39947, 40075, 40203, 40331, 40459, 40587, 40715, 40843, 10396, ! 15872, 15872, 15872, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 3161, 3161, 3161, 3161, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, 10396, ! 10396, 10396, 10396, 10396, 10396, 10396, 20252, 10396, 10396, 10396, ! 10396, 10396, 15872, 15872, 15872, 15872, 15872, 25099, 25099, 25099, ! 25099, 25099, 25099, 25099, 25099, 25099, 25099, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 15872, ! 15872, 15872, 20252, 24587, 24715, 24843, 24971, 42635, 42763, 42891, ! 43019, 43147, 25355, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 10396, 15872, 10396, 10396, 10396, 15872, 10396, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 11403, 11019, 11147, 32267, 32395, 32523, 32651, 32779, ! 32907, 38155, 38283, 38411, 38539, 38667, 38795, 38923, 39051, 39179, ! 39307, 39435, 11403, 11019, 11147, 32267, 32395, 32523, 32651, 32779, ! 32907, 38155, 38283, 38411, 38539, 38667, 38795, 38923, 39051, 39179, ! 39307, 39435, 20252, 20252, 20252, 20252, 524, 664, 664, 664, ! 10396, 17668, 14853, 40970, 1109, 1238, 1109, 1238, 1109, 1238, ! 1109, 1238, 1109, 1238, 10396, 10396, 1109, 1238, 1109, 1238, ! 1109, 1238, 1109, 1238, 10772, 25877, 26006, 26006, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 15872, ! 15872, 15872, 15872, 17798, 17798, 6683, 6683, 17668, 17668, 15872, ! 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, 14853, ! 14853, 14853, 14853, 14853, 14853, 15872, 20252, 20252, 25099, 25099, ! 25099, 25099, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, ! 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 20252, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 43283, 43283, 43283, ! 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, ! 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, ! 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43410, ! 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, ! 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, ! 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, 43410, ! 43410, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, ! 1305, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, 20997, ! 20997, 20997, 20997, 20997, 15872, 20997, 20997, 20997, 20997, 20997, ! 15872, 20997, 15872, 17798, 17798, 17798, 17798, 15872, 15872, 15872, ! 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 15872, 664, ! 10772, 10772, 6807, 6807, 25877, 26006, 25877, 26006, 25877, 26006, ! 25877, 26006, 25877, 26006, 25877, 26006, 15872, 15872, 15872, 15872, ! 664, 664, 664, 664, 6807, 6807, 6807, 1432, 664, 1432, ! 15872, 664, 1432, 664, 664, 10772, 25877, 26006, 25877, 26006, ! 25877, 26006, 792, 664, 3329, 3457, 3585, 3713, 3841, 3969, ! 4097, 4225, 4353, 4481, 4609, 4737, 4865, 4993, 5121, 5249, ! 5377, 5505, 5633, 5761, 5889, 6017, 6145, 6273, 6401, 6529, ! 25877, 664, 26006, 6683, 6807, }; + /** Length of data. */ + static const int data_length = 5345; ! /** ! * This is the attribute table for computing the numeric value of a ! * character. The value is -1 if Unicode does not define a value, -2 ! * if the value is not a positive integer, otherwise it is the value. ! */ ! static const jshort numValue[] = { ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, ! 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, ! 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ! -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ! 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ! 34, 35, -1, -1, -1, -1, -1, -1, 2, 3, -1, 1, -1, ! -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, ! 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, ! 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, ! 4, -1, 16, 10, 100, 1000, -1, -1, -1, 20, 30, 40, 50, ! 60, 70, 80, 90, 10000, 17, 18, 19, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, ! -1, -1, -1, -1, 0, 4, 5, 6, 7, 8, 9, -1, -1, ! -1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ! 12, 50, 100, 500, 1000, 1, 2, 3, 4, 5, 6, 7, 8, ! 9, 10, 11, 12, 50, 100, 500, 1000, 1000, 5000, 10000, -1, 10, ! 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 2, ! 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, ! 5, 6, 7, 8, 9, 10, 20, 30, 5, 6, 7, 8, 9, ! -1, -1, }; + /** Length of numValue. */ + static const int numValue_length = 340; ! /** ! * This is the attribute table for computing the uppercase representation ! * of a character. The value is the difference between the character and ! * its uppercase version. ! */ ! static const jshort upper[] = { ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, ! -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, ! -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 743, 0, 0, ! 0, 0, -32, 121, 0, -1, 0, -232, 0, -300, 0, 0, 0, ! 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, ! 56, 0, -1, -2, -79, 0, 0, 0, -210, -206, -205, -202, -203, ! -207, -209, -211, -213, -214, -218, -217, -219, 0, 0, 84, 0, 0, ! 0, 0, -38, -37, -31, -64, -63, -62, -57, 0, -47, -54, -86, ! -80, 0, 0, 0, 0, 0, -48, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, -59, 8, 0, 74, 86, ! 100, 128, 112, 126, 0, 9, 0, 0, -7205, 0, 0, 7, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, -16, -16, -16, -16, -16, -16, -16, -16, ! -16, -16, -16, -16, -16, -16, -16, -16, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -26, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, ! }; ! /** Length of upper. */ ! static const int upper_length = 340; ! /** ! * This is the attribute table for computing the lowercase representation ! * of a character. The value is the difference between the character and ! * its lowercase version. ! */ ! static const jshort lower[] = { ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, ! 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 32, 0, 0, 1, 0, -199, 0, -121, 0, 210, 206, 205, ! 79, 202, 203, 207, 0, 211, 209, 213, 214, 218, 217, 219, 0, ! 0, 2, 1, 0, 0, -97, -56, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 37, ! 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 80, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 0, 0, ! 0, 0, 0, 0, -8, 0, -74, -9, 0, -86, -100, 0, -112, ! -7, -128, -126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7517, -8383, ! -8262, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, ! 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, ! }; ! /** Length of lower. */ ! static const int lower_length = 340; ! /** ! * This is the attribute table for computing the directionality class ! * of a character. At present, the value is in the range 0 - 18 if the ! * character has a direction, otherwise it is -1. ! */ ! static const jbyte direction[] = { ! 9, 11, 10, 12, 12, 13, 5, 5, 13, 13, 5, 7, 5, 4, 3, 3, 3, 3, 3, 3, 3, ! 3, 3, 3, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 13, 0, 13, ! 13, 5, 3, 3, 0, 3, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 1, 1, 2, 2, 2, ! 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 12, 9, 0, 1, 13, 13, 13, 12, 10, 14, 16, 18, 15, 17, 3, ! 3, 3, 3, 3, 3, 3, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 13, 13, 13, 13, ! 13, 13, 13, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 0, 0, 0, 0, ! }; ! /** Length of direction. */ ! static const int direction_length = 340; ! /** ! * This is the listing of titlecase special cases (all other character ! * can use upper to determine their titlecase). The listing ! * is a sequence of character pairs; converting the first character of the ! * pair to titlecase produces the second character. ! */ ! static const jchar title[] = { ! 452, 453, 453, 453, 454, 453, 455, 456, 456, 456, ! 457, 456, 458, 459, 459, 459, 460, 459, 497, 498, ! 498, 498, 499, 498, ! }; ! /** Length of title. */ ! static const int title_length = 24; #endif /* __JAVA_CHARTABLES_H__ */ diff -Nrc3pad gcc-3.0.4/libjava/include/java-insns.h gcc-3.1/libjava/include/java-insns.h *** gcc-3.0.4/libjava/include/java-insns.h Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/include/java-insns.h Sun Nov 25 19:48:19 2001 *************** *** 1,6 **** // java-insns.h - Instruction encodings. This is -*- c++ -*- ! /* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // java-insns.h - Instruction encodings. This is -*- c++ -*- ! /* Copyright (C) 1999, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 11,17 **** #ifndef __JAVA_INSNS_H__ #define __JAVA_INSNS_H__ ! enum { op_nop = 0x00, op_aconst_null = 0x01, --- 11,17 ---- #ifndef __JAVA_INSNS_H__ #define __JAVA_INSNS_H__ ! enum java_opcode { op_nop = 0x00, op_aconst_null = 0x01, diff -Nrc3pad gcc-3.0.4/libjava/include/java-interp.h gcc-3.1/libjava/include/java-interp.h *** gcc-3.0.4/libjava/include/java-interp.h Fri Mar 23 19:12:19 2001 --- gcc-3.1/libjava/include/java-interp.h Mon Nov 26 06:40:05 2001 *************** _Jv_IsInterpretedClass (jclass c) *** 33,48 **** struct _Jv_ResolvedMethod; - bool _Jv_VerifyFieldSignature (_Jv_Utf8Const*sig); - bool _Jv_VerifyMethodSignature (_Jv_Utf8Const*sig); - bool _Jv_VerifyClassName (unsigned char* ptr, _Jv_ushort length); - bool _Jv_VerifyClassName (_Jv_Utf8Const *name); - bool _Jv_VerifyIdentifier (_Jv_Utf8Const *); - bool _Jv_ClassNameSamePackage (_Jv_Utf8Const *name1, _Jv_Utf8Const *name2); void _Jv_DefineClass (jclass, jbyteArray, jint, jint); void _Jv_InitField (jobject, jclass, int); void * _Jv_AllocMethodInvocation (jsize size); /* FIXME: this should really be defined in some more generic place */ #define ROUND(V, A) (((((unsigned) (V))-1) | ((A)-1))+1) --- 33,45 ---- struct _Jv_ResolvedMethod; void _Jv_DefineClass (jclass, jbyteArray, jint, jint); void _Jv_InitField (jobject, jclass, int); void * _Jv_AllocMethodInvocation (jsize size); + int _Jv_count_arguments (_Jv_Utf8Const *signature, + jboolean staticp = true); + void _Jv_VerifyMethod (_Jv_InterpMethod *method); /* FIXME: this should really be defined in some more generic place */ #define ROUND(V, A) (((((unsigned) (V))-1) | ((A)-1))+1) *************** class _Jv_InterpClass; *** 54,60 **** class _Jv_InterpMethod; class _Jv_InterpMethodInvocation; ! class _Jv_InterpException { int start_pc; int end_pc; int handler_pc; --- 51,58 ---- class _Jv_InterpMethod; class _Jv_InterpMethodInvocation; ! class _Jv_InterpException ! { int start_pc; int end_pc; int handler_pc; *************** class _Jv_InterpException { *** 62,67 **** --- 60,66 ---- friend class _Jv_ClassReader; friend class _Jv_InterpMethod; + friend class _Jv_BytecodeVerifier; }; // Base class for method representations. Subclasses are interpreted *************** class _Jv_InterpMethod : public _Jv_Meth *** 133,138 **** --- 132,138 ---- friend class _Jv_ClassReader; friend class _Jv_InterpMethodInvocation; + friend class _Jv_BytecodeVerifier; friend void _Jv_PrepareClass(jclass); }; *************** class _Jv_InterpClass : public java::lan *** 158,164 **** friend class _Jv_InterpMethod; friend void _Jv_PrepareClass(jclass); friend void _Jv_InitField (jobject, jclass, int); ! friend void* _Jv_MarkObj (void *, void *, void *, void *); friend _Jv_MethodBase ** _Jv_GetFirstMethod (_Jv_InterpClass *klass); }; --- 158,166 ---- friend class _Jv_InterpMethod; friend void _Jv_PrepareClass(jclass); friend void _Jv_InitField (jobject, jclass, int); ! #ifdef JV_MARKOBJ_DECL ! friend JV_MARKOBJ_DECL; ! #endif friend _Jv_MethodBase ** _Jv_GetFirstMethod (_Jv_InterpClass *klass); }; diff -Nrc3pad gcc-3.0.4/libjava/include/jni.h gcc-3.1/libjava/include/jni.h *** gcc-3.0.4/libjava/include/jni.h Fri Apr 27 16:07:05 2001 --- gcc-3.1/libjava/include/jni.h Tue Mar 19 21:47:03 2002 *************** *** 1,4 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 14,27 **** #ifndef __GCJ_JNI_H__ #define __GCJ_JNI_H__ #include #define _Jv_va_list va_list ! #ifdef __cplusplus ! /* This is wrong, because it pollutes the name-space too much! */ #include #include typedef struct _Jv_JNIEnv JNIEnv; typedef struct _Jv_JavaVM JavaVM; --- 14,37 ---- #ifndef __GCJ_JNI_H__ #define __GCJ_JNI_H__ + #include + + /* We include for compatibility with Sun's . */ + #include + #include #define _Jv_va_list va_list ! #ifdef __GCJ_JNI_IMPL__ ! /* If __GCJ_JNI_IMPL__ is defined, then we assume that we're building ! libgcj itself, and we include headers which taint the namespace ! more than is acceptable for the ordinary JNI user. */ #include #include + #include + + typedef gnu::gcj::runtime::JNIWeakRef *jweak; typedef struct _Jv_JNIEnv JNIEnv; typedef struct _Jv_JavaVM JavaVM; *************** typedef struct _Jv_JavaVM JavaVM; *** 29,36 **** #define JNI_TRUE true #define JNI_FALSE false ! #else /* __cplusplus */ typedef int jbyte __attribute__((__mode__(__QI__))); typedef int jshort __attribute__((__mode__(__HI__))); typedef int jint __attribute__((__mode__(__SI__))); --- 39,50 ---- #define JNI_TRUE true #define JNI_FALSE false ! #else /* __GCJ_JNI_IMPL__ */ ! ! # ifdef __GNUC__ + /* If we're using gcc, we can use a platform-independent scheme to get + the right integer types. */ typedef int jbyte __attribute__((__mode__(__QI__))); typedef int jshort __attribute__((__mode__(__HI__))); typedef int jint __attribute__((__mode__(__SI__))); *************** typedef float jfloat; *** 41,51 **** typedef double jdouble; typedef jint jsize; typedef void *jobject; typedef jobject jclass; typedef jobject jstring; - typedef jobject jarray; typedef jobject jthrowable; typedef jobject jobjectArray; typedef jobject jbyteArray; typedef jobject jshortArray; --- 55,139 ---- typedef double jdouble; typedef jint jsize; + # else /* __GNUC__ */ + + # ifdef JV_HAVE_INTTYPES_H + + /* If is available, we use it. */ + + # include + + typedef int8_t jbyte; + typedef int16_t jshort; + typedef int32_t jint; + typedef int64_t jlong; + typedef float jfloat; + typedef double jdouble; + typedef jint jsize; + typedef int8_t jboolean; + typedef uint16_t jchar; + + # else /* JV_HAVE_INTTYPES_H */ + + /* For now, we require either gcc or . If we did more + work at configure time we could get around this, but right now it + doesn't seem worth it. */ + # error jni.h not ported to this platform + + # endif /* JV_HAVE_INTTYPES_H */ + + # endif /* __GNUC__ */ + + # ifdef __cplusplus + + /* Define dummy classes and then define the JNI types as pointers. */ + struct __jobject {}; + struct __jclass : __jobject {}; + struct __jstring : __jobject {}; + struct __jthrowable : __jobject {}; + struct __jweak : __jobject {}; + struct __jarray : __jobject {}; + struct __jobjectArray : __jarray {}; + struct __jbyteArray : __jarray {}; + struct __jshortArray : __jarray {}; + struct __jintArray : __jarray {}; + struct __jlongArray : __jarray {}; + struct __jbooleanArray : __jarray {}; + struct __jcharArray : __jarray {}; + struct __jfloatArray : __jarray {}; + struct __jdoubleArray : __jarray {}; + + typedef __jobject *jobject; + typedef __jclass *jclass; + typedef __jstring *jstring; + typedef __jthrowable *jthrowable; + typedef __jweak *jweak; + typedef __jarray *jarray; + typedef __jobjectArray *jobjectArray; + typedef __jbyteArray *jbyteArray; + typedef __jshortArray *jshortArray; + typedef __jintArray *jintArray; + typedef __jlongArray *jlongArray; + typedef __jbooleanArray *jbooleanArray; + typedef __jcharArray *jcharArray; + typedef __jfloatArray *jfloatArray; + typedef __jdoubleArray *jdoubleArray; + + #define JNI_TRUE true + #define JNI_FALSE false + + typedef struct _Jv_JNIEnv JNIEnv; + typedef struct _Jv_JavaVM JavaVM; + + # else /* __cplusplus */ + + /* For C, simply define the class types as generic pointers. */ typedef void *jobject; typedef jobject jclass; typedef jobject jstring; typedef jobject jthrowable; + typedef jobject jweak; + typedef jobject jarray; typedef jobject jobjectArray; typedef jobject jbyteArray; typedef jobject jshortArray; *************** typedef jobject jcharArray; *** 56,75 **** typedef jobject jfloatArray; typedef jobject jdoubleArray; ! /* Dummy defines. */ ! typedef void *jfieldID; ! typedef void *jmethodID; typedef const struct JNINativeInterface *JNIEnv; typedef const struct JNIInvokeInterface *JavaVM; ! #define JNI_TRUE 1 ! #define JNI_FALSE 0 ! #endif /* __cplusplus */ ! /* FIXME: this is wrong. */ ! typedef jobject jweak; /* Version numbers. */ #define JNI_VERSION_1_1 0x00010001 --- 144,162 ---- typedef jobject jfloatArray; typedef jobject jdoubleArray; ! #define JNI_TRUE 1 ! #define JNI_FALSE 0 typedef const struct JNINativeInterface *JNIEnv; typedef const struct JNIInvokeInterface *JavaVM; ! # endif /* __cplusplus */ ! /* Dummy defines. */ ! typedef void *jfieldID; ! typedef void *jmethodID; ! #endif /* __GCJ_JNI_IMPL__ */ /* Version numbers. */ #define JNI_VERSION_1_1 0x00010001 *************** typedef jobject jweak; *** 85,90 **** --- 172,183 ---- #define JNI_EDETACHED -2 #define JNI_EVERSION -3 + /* Linkage and calling conventions. This will need updating when we + support Windows DLLs. */ + #define JNIIMPORT + #define JNIEXPORT + #define JNICALL + #ifdef __cplusplus extern "C" { *************** struct JNINativeInterface *** 167,173 **** jobject (*NewGlobalRef) (JNIEnv *, jobject); void (*DeleteGlobalRef) (JNIEnv *, jobject); ! void (*DeleteLocalRef) (JNIEnv *, jobject);; jboolean (*IsSameObject) (JNIEnv *, jobject, jobject); jobject (*NewLocalRef) (JNIEnv *, jobject); --- 260,266 ---- jobject (*NewGlobalRef) (JNIEnv *, jobject); void (*DeleteGlobalRef) (JNIEnv *, jobject); ! void (*DeleteLocalRef) (JNIEnv *, jobject); jboolean (*IsSameObject) (JNIEnv *, jobject, jobject); jobject (*NewLocalRef) (JNIEnv *, jobject); *************** struct JNINativeInterface *** 436,442 **** jfieldID, jdouble); jstring (*NewString) (JNIEnv *, const jchar *, jsize); ! jint (*GetStringLength) (JNIEnv *, jstring); const jchar * (*GetStringChars) (JNIEnv *, jstring, jboolean *); void (*ReleaseStringChars) (JNIEnv *, jstring, const jchar *); jstring (*NewStringUTF) (JNIEnv *, const char *); --- 529,535 ---- jfieldID, jdouble); jstring (*NewString) (JNIEnv *, const jchar *, jsize); ! jsize (*GetStringLength) (JNIEnv *, jstring); const jchar * (*GetStringChars) (JNIEnv *, jstring, jboolean *); void (*ReleaseStringChars) (JNIEnv *, jstring, const jchar *); jstring (*NewStringUTF) (JNIEnv *, const char *); *************** public: *** 558,564 **** /* The method table. */ struct JNINativeInterface *p; ! /* FIXME: this is really ugly. */ #ifndef __GCJ_JNI_IMPL__ private: #endif --- 651,657 ---- /* The method table. */ struct JNINativeInterface *p; ! /* This is ugly, but we must live with it. */ #ifndef __GCJ_JNI_IMPL__ private: #endif diff -Nrc3pad gcc-3.0.4/libjava/include/jvm.h gcc-3.1/libjava/include/jvm.h *** gcc-3.0.4/libjava/include/jvm.h Sat Sep 22 01:34:48 2001 --- gcc-3.1/libjava/include/jvm.h Thu Apr 11 15:56:34 2002 *************** *** 1,6 **** // jvm.h - Header file for private implementation information. -*- c++ -*- ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // jvm.h - Header file for private implementation information. -*- c++ -*- ! /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 11,16 **** --- 11,22 ---- #ifndef __JAVA_JVM_H__ #define __JAVA_JVM_H__ + // Define this before including jni.h. + // jni.h is included by jvmpi.h, which might be included. We define + // this unconditionally because it is convenient and it lets other + // files include jni.h without difficulty. + #define __GCJ_JNI_IMPL__ + #include #include *************** details. */ *** 28,45 **** struct _Jv_VTable { #ifdef __ia64__ - jclass clas; - unsigned long : 64; - void *gc_descr; - unsigned long : 64; - typedef struct { void *pc, *gp; } vtable_elt; #else - jclass clas; - void *gc_descr; - typedef void *vtable_elt; #endif // This must be last, as derived classes "extend" this by // adding new data members. --- 34,45 ---- struct _Jv_VTable { #ifdef __ia64__ typedef struct { void *pc, *gp; } vtable_elt; #else typedef void *vtable_elt; #endif + jclass clas; + void *gc_descr; // This must be last, as derived classes "extend" this by // adding new data members. *************** struct _Jv_VTable *** 48,60 **** #ifdef __ia64__ void *get_method(int i) { return &method[i]; } void set_method(int i, void *fptr) { method[i] = *(vtable_elt *)fptr; } #else void *get_method(int i) { return method[i]; } void set_method(int i, void *fptr) { method[i] = fptr; } #endif - void *get_finalizer() { return get_method(0); } static size_t vtable_elt_size() { return sizeof(vtable_elt); } static _Jv_VTable *new_vtable (int count); }; --- 48,74 ---- #ifdef __ia64__ void *get_method(int i) { return &method[i]; } void set_method(int i, void *fptr) { method[i] = *(vtable_elt *)fptr; } + void *get_finalizer() + { + // We know that get_finalizer is only used for checking whether + // this object needs to have a finalizer registered. So it is + // safe to simply return just the PC component of the vtable + // slot. + return ((vtable_elt *)(get_method(0)))->pc; + } #else void *get_method(int i) { return method[i]; } void set_method(int i, void *fptr) { method[i] = fptr; } + void *get_finalizer() { return get_method(0); } #endif static size_t vtable_elt_size() { return sizeof(vtable_elt); } + + // Given a method index, return byte offset from the vtable pointer. + static jint idx_to_offset (int index) + { + return (2 * sizeof (void *)) + (index * vtable_elt_size ()); + } static _Jv_VTable *new_vtable (int count); }; *************** extern jboolean _Jv_equaln (_Jv_Utf8Cons *** 124,151 **** // FIXME: remove this define. #define StringClass java::lang::String::class$ /* Type of pointer used as finalizer. */ typedef void _Jv_FinalizerFunc (jobject); /* Allocate space for a new Java object. */ void *_Jv_AllocObj (jsize size, jclass cl) __attribute__((__malloc__)); /* Allocate space for an array of Java objects. */ void *_Jv_AllocArray (jsize size, jclass cl) __attribute__((__malloc__)); /* Allocate space that is known to be pointer-free. */ void *_Jv_AllocBytes (jsize size) __attribute__((__malloc__)); /* Initialize the GC. */ void _Jv_InitGC (void); /* Register a finalizer. */ void _Jv_RegisterFinalizer (void *object, _Jv_FinalizerFunc *method); /* Compute the GC descriptor for a class */ - #ifdef INTERPRETER void * _Jv_BuildGCDescr(jclass); - #endif /* Allocate some unscanned, unmoveable memory. Return NULL if out of memory. */ void *_Jv_MallocUnchecked (jsize size) __attribute__((__malloc__)); /* Run finalizers for objects ready to be finalized.. */ void _Jv_RunFinalizers (void); /* Run all finalizers. Should be called only before exit. */ --- 138,191 ---- // FIXME: remove this define. #define StringClass java::lang::String::class$ + namespace gcj + { + /* Some constants used during lookup of special class methods. */ + extern _Jv_Utf8Const *void_signature; /* "()V" */ + extern _Jv_Utf8Const *clinit_name; /* "" */ + extern _Jv_Utf8Const *init_name; /* "" */ + extern _Jv_Utf8Const *finit_name; /* "finit$", */ + + /* Set to true by _Jv_CreateJavaVM. */ + extern bool runtimeInitialized; + }; + /* Type of pointer used as finalizer. */ typedef void _Jv_FinalizerFunc (jobject); /* Allocate space for a new Java object. */ void *_Jv_AllocObj (jsize size, jclass cl) __attribute__((__malloc__)); + /* Allocate space for a potentially uninitialized pointer-free object. + Interesting only with JV_HASH_SYNCHRONIZATION. */ + void *_Jv_AllocPtrFreeObj (jsize size, jclass cl) __attribute__((__malloc__)); /* Allocate space for an array of Java objects. */ void *_Jv_AllocArray (jsize size, jclass cl) __attribute__((__malloc__)); /* Allocate space that is known to be pointer-free. */ void *_Jv_AllocBytes (jsize size) __attribute__((__malloc__)); + /* Allocate space for a new non-Java object, which does not have the usual + Java object header but may contain pointers to other GC'ed objects. */ + void *_Jv_AllocRawObj (jsize size) __attribute__((__malloc__)); + /* Explicitly throw an out-of-memory exception. */ + void _Jv_ThrowNoMemory() __attribute__((__noreturn__)); + /* Allocate an object with a single pointer. The first word is reserved + for the GC, and the second word is the traced pointer. */ + void *_Jv_AllocTraceOne (jsize size /* incl. reserved slot */); + /* Ditto, but for two traced pointers. */ + void *_Jv_AllocTraceTwo (jsize size /* incl. reserved slot */); /* Initialize the GC. */ void _Jv_InitGC (void); /* Register a finalizer. */ void _Jv_RegisterFinalizer (void *object, _Jv_FinalizerFunc *method); /* Compute the GC descriptor for a class */ void * _Jv_BuildGCDescr(jclass); /* Allocate some unscanned, unmoveable memory. Return NULL if out of memory. */ void *_Jv_MallocUnchecked (jsize size) __attribute__((__malloc__)); + /* Initialize finalizers. The argument is a function to be called + when a finalizer is ready to be run. */ + void _Jv_GCInitializeFinalizers (void (*notifier) (void)); /* Run finalizers for objects ready to be finalized.. */ void _Jv_RunFinalizers (void); /* Run all finalizers. Should be called only before exit. */ *************** void _Jv_RunGC (void); *** 155,160 **** --- 195,207 ---- /* Disable and enable GC. */ void _Jv_DisableGC (void); void _Jv_EnableGC (void); + /* Register a disappearing link. This is a field F which should be + cleared when *F is found to be inaccessible. This is used in the + implementation of java.lang.ref.Reference. */ + void _Jv_GCRegisterDisappearingLink (jobject *objp); + /* Return true if OBJECT should be reclaimed. This is used to + implement soft references. */ + jboolean _Jv_GCCanReclaimSoftReference (jobject obj); /* Return approximation of total size of heap. */ long _Jv_GCTotalMemory (void); *************** void _Jv_SetInitialHeapSize (const char *** 179,189 **** _Jv_GCSetMaximumHeapSize. */ void _Jv_SetMaximumHeapSize (const char *arg); - /* Allocate some unscanned bytes. Throw exception if out of memory. */ - void *_Jv_AllocBytesChecked (jsize size) __attribute__((__malloc__)); - extern "C" void JvRunMain (jclass klass, int argc, const char **argv); ! void _Jv_RunMain (const char* name, int argc, const char **argv, bool is_jar); // Delayed until after _Jv_AllocBytes is declared. // --- 226,234 ---- _Jv_GCSetMaximumHeapSize. */ void _Jv_SetMaximumHeapSize (const char *arg); extern "C" void JvRunMain (jclass klass, int argc, const char **argv); ! void _Jv_RunMain (jclass klass, const char *name, int argc, const char **argv, ! bool is_jar); // Delayed until after _Jv_AllocBytes is declared. // *************** _Jv_GetArrayElementFromElementType (jobj *** 238,245 **** return elts; } ! extern "C" void _Jv_ThrowBadArrayIndex (jint bad_index); ! extern "C" void _Jv_ThrowNullPointerException (void); extern "C" jobject _Jv_NewArray (jint type, jint size) __attribute__((__malloc__)); extern "C" jobject _Jv_NewMultiArray (jclass klass, jint dims, ...) --- 283,292 ---- return elts; } ! extern "C" void _Jv_ThrowBadArrayIndex (jint bad_index) ! __attribute__((noreturn)); ! extern "C" void _Jv_ThrowNullPointerException (void) ! __attribute__((noreturn)); extern "C" jobject _Jv_NewArray (jint type, jint size) __attribute__((__malloc__)); extern "C" jobject _Jv_NewMultiArray (jclass klass, jint dims, ...) *************** extern "C" void *_Jv_LookupInterfaceMeth *** 252,257 **** --- 299,305 ---- extern "C" void _Jv_CheckArrayStore (jobject array, jobject obj); extern "C" void _Jv_RegisterClass (jclass klass); extern "C" void _Jv_RegisterClasses (jclass *classes); + extern "C" void _Jv_RegisterResource (void *vptr); extern void _Jv_UnregisterClass (_Jv_Utf8Const*, java::lang::ClassLoader*); extern void _Jv_ResolveField (_Jv_Field *, java::lang::ClassLoader*); *************** _Jv_JNIEnv *_Jv_GetCurrentJNIEnv (); *** 305,313 **** void _Jv_SetCurrentJNIEnv (_Jv_JNIEnv *); struct _Jv_JavaVM; ! _Jv_JavaVM *_Jv_GetJavaVM (); #ifdef ENABLE_JVMPI #include "jvmpi.h" extern void (*_Jv_JVMPI_Notify_OBJECT_ALLOC) (JVMPI_Event *event); --- 353,370 ---- void _Jv_SetCurrentJNIEnv (_Jv_JNIEnv *); struct _Jv_JavaVM; ! _Jv_JavaVM *_Jv_GetJavaVM (); ! ! // Some verification functions from defineclass.cc. ! bool _Jv_VerifyFieldSignature (_Jv_Utf8Const*sig); ! bool _Jv_VerifyMethodSignature (_Jv_Utf8Const*sig); ! bool _Jv_VerifyClassName (unsigned char* ptr, _Jv_ushort length); ! bool _Jv_VerifyClassName (_Jv_Utf8Const *name); ! bool _Jv_VerifyIdentifier (_Jv_Utf8Const *); ! bool _Jv_ClassNameSamePackage (_Jv_Utf8Const *name1, _Jv_Utf8Const *name2); #ifdef ENABLE_JVMPI + #include "jvmpi.h" extern void (*_Jv_JVMPI_Notify_OBJECT_ALLOC) (JVMPI_Event *event); diff -Nrc3pad gcc-3.0.4/libjava/include/name-finder.h gcc-3.1/libjava/include/name-finder.h *** gcc-3.0.4/libjava/include/name-finder.h Tue May 30 23:26:02 2000 --- gcc-3.1/libjava/include/name-finder.h Sat Mar 23 16:17:07 2002 *************** *** 1,6 **** // name-finder.h - Convert addresses to names ! /* Copyright (C) 2000 Red Hat Inc This file is part of libgcj. --- 1,6 ---- // name-finder.h - Convert addresses to names ! /* Copyright (C) 2000, 2002 Free Software Foundation, Inc This file is part of libgcj. *************** details. */ *** 17,23 **** --- 17,26 ---- #include #include + + #ifdef HAVE_SYS_WAIT_H #include + #endif #include #include *************** public: *** 37,48 **** ~_Jv_name_finder () { #if defined (HAVE_PIPE) && defined (HAVE_FORK) ! close (f_pipe[1]); ! fclose (b_pipe_fd); ! int wstat; ! // We don't care about errors here. ! waitpid (pid, &wstat, 0); #endif } --- 40,58 ---- ~_Jv_name_finder () { #if defined (HAVE_PIPE) && defined (HAVE_FORK) ! myclose (f_pipe[0]); ! myclose (f_pipe[1]); ! myclose (b_pipe[0]); ! myclose (b_pipe[1]); ! if (b_pipe_fd != NULL) ! fclose (b_pipe_fd); ! if (pid >= 0) ! { ! int wstat; ! // We don't care about errors here. ! waitpid (pid, &wstat, 0); ! } #endif } *************** private: *** 69,73 **** --- 79,91 ---- int f_pipe[2], b_pipe[2]; FILE *b_pipe_fd; int error; + + // Close a descriptor only if it has not been closed. + void myclose (int fd) + { + if (fd != -1) + close (fd); + } + #endif }; diff -Nrc3pad gcc-3.0.4/libjava/include/no-threads.h gcc-3.1/libjava/include/no-threads.h *** gcc-3.0.4/libjava/include/no-threads.h Sat Dec 30 12:18:39 2000 --- gcc-3.1/libjava/include/no-threads.h Tue May 22 06:47:48 2001 *************** _Jv_InitThreads (void) *** 102,112 **** { } ! inline _Jv_Thread_t * ! _Jv_ThreadInitData (java::lang::Thread *) ! { ! return NULL; ! } inline void _Jv_ThreadDestroyData (_Jv_Thread_t *data) --- 102,109 ---- { } ! _Jv_Thread_t * ! _Jv_ThreadInitData (java::lang::Thread *); inline void _Jv_ThreadDestroyData (_Jv_Thread_t *data) *************** _Jv_ThreadSetPriority (_Jv_Thread_t *, j *** 130,135 **** --- 127,142 ---- { } + inline void + _Jv_ThreadRegister (_Jv_Thread_t *data) + { + } + + inline void + _Jv_ThreadUnRegister (void) + { + } + void _Jv_ThreadStart (java::lang::Thread *, _Jv_Thread_t *, _Jv_ThreadStartFunc *meth); diff -Nrc3pad gcc-3.0.4/libjava/include/posix-threads.h gcc-3.1/libjava/include/posix-threads.h *** gcc-3.0.4/libjava/include/posix-threads.h Sat May 19 05:42:03 2001 --- gcc-3.1/libjava/include/posix-threads.h Mon Apr 1 23:08:40 2002 *************** *** 1,7 **** // -*- c++ -*- // posix-threads.h - Defines for using POSIX threads. ! /* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj. --- 1,7 ---- // -*- c++ -*- // posix-threads.h - Defines for using POSIX threads. ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. *************** _Jv_CondInit (_Jv_ConditionVariable_t *c *** 106,115 **** --- 106,126 ---- // Mutexes. // + #ifdef LOCK_DEBUG + # include + #endif + inline void _Jv_MutexInit (_Jv_Mutex_t *mu) { + # ifdef LOCK_DEBUG /* Assumes Linuxthreads */ + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); + pthread_mutex_init (&mu->mutex, &attr); + # else pthread_mutex_init (&mu->mutex, 0); + # endif mu->count = 0; mu->owner = 0; *************** _Jv_MutexLock (_Jv_Mutex_t *mu) *** 125,131 **** } else { ! pthread_mutex_lock (&mu->mutex); mu->count = 1; mu->owner = self; } --- 136,151 ---- } else { ! # ifdef LOCK_DEBUG ! int result = pthread_mutex_lock (&mu->mutex); ! if (0 != result) ! { ! fprintf(stderr, "Pthread_mutex_lock returned %d\n", result); ! for (;;) {} ! } ! # else ! pthread_mutex_lock (&mu->mutex); ! # endif mu->count = 1; mu->owner = self; } *************** inline int *** 136,149 **** _Jv_MutexUnlock (_Jv_Mutex_t *mu) { if (_Jv_PthreadCheckMonitor (mu)) ! return 1; mu->count--; if (mu->count == 0) { mu->owner = 0; ! pthread_mutex_unlock (&mu->mutex); } return 0; } --- 156,184 ---- _Jv_MutexUnlock (_Jv_Mutex_t *mu) { if (_Jv_PthreadCheckMonitor (mu)) ! { ! # ifdef LOCK_DEBUG ! fprintf(stderr, "_Jv_MutexUnlock: Not owner\n"); ! for (;;) {} ! # endif ! return 1; ! } mu->count--; if (mu->count == 0) { mu->owner = 0; ! # ifdef LOCK_DEBUG ! int result = pthread_mutex_unlock (&mu->mutex); ! if (0 != result) ! { ! fprintf(stderr, "Pthread_mutex_unlock returned %d\n", result); ! for (;;) {} ! } ! # else ! pthread_mutex_unlock (&mu->mutex); ! # endif } return 0; } *************** _Jv_ThreadCurrent (void) *** 179,184 **** --- 214,356 ---- return (java::lang::Thread *) pthread_getspecific (_Jv_ThreadKey); } + #ifdef JV_HASH_SYNCHRONIZATION + // Should be specialized to just load the "current thread" register + // on platforms that support it. Speed is of the essence. The value + // of the descriptor is not, so long as there is a one-to-one correspondence + // to threads. + + + #ifdef __ia64__ + + typedef size_t _Jv_ThreadId_t; + + register size_t _Jv_self __asm__("r13"); + // For linux_threads this is really a pointer to its thread data + // structure. We treat it as opaque. That should also work + // on other operating systems that follow the ABI standard. + + // This should become the prototype for machines that maintain a thread + // pointer in a register. + inline _Jv_ThreadId_t + _Jv_ThreadSelf (void) + { + return _Jv_self; + } + + #define JV_SELF_DEFINED + + #endif /* __ia64__ */ + + #ifdef __alpha__ + + #ifdef __FreeBSD__ + #include + #define PAL_rduniq PAL_rdunique + #else + #include + #endif + + typedef unsigned long _Jv_ThreadId_t; + + inline _Jv_ThreadId_t + _Jv_ThreadSelf (void) + { + unsigned long id; + __asm__ ("call_pal %1\n\tmov $0, %0" : "=r"(id) : "i"(PAL_rduniq) : "$0"); + return id; + } + + #define JV_SELF_DEFINED + + #endif /* __alpha__ */ + + #if defined(SLOW_PTHREAD_SELF) + + #include "sysdep/locks.h" + + typedef pthread_t _Jv_ThreadId_t; + + // E.g. on X86 Linux, pthread_self() is too slow for our purpose. + // Instead we maintain a cache based on the current sp value. + // This is similar to what's done for thread local allocation in the + // GC, only far simpler. + // This code should probably go away when Linux/X86 starts using a + // segment register to hold the thread id. + # define LOG_THREAD_SPACING 12 + // If two thread pointer values are closer than + // 1 << LOG_THREAD_SPACING, we assume they belong + // to the same thread. + # define SELF_CACHE_SIZE 1024 + # define SC_INDEX(sp) (((unsigned long)(sp) >> 19) & (SELF_CACHE_SIZE-1)) + // Mapping from sp value to cache index. + // Note that this is not in any real sense a hash + // function, since we need to be able to clear + // all possibly matching slots on thread startup. + // Thus all entries that might correspond to + // a given thread are intentionally contiguous. + // Works well with anything that allocates at least + // 512KB stacks. + # define SC_CLEAR_MIN (-16) // When starting a new thread, we clear + # define SC_CLEAR_MAX 0 // all self cache entries between + // SC_INDEX(sp)+SC_CLEAR_MIN and + // SC_INDEX(sp)+SC_CLEAR_MAX to ensure + // we never see stale values. The + // current values assume a downward + // growing stack of size <= 7.5 MB. + # define BAD_HIGH_SP_VALUE ((size_t)(-1)) + + extern volatile + struct self_cache_entry { + size_t high_sp_bits; // sp value >> LOG_THREAD_SPACING + pthread_t self; // Corresponding thread + } _Jv_self_cache[]; + + void _Jv_Self_Cache_Init(); + + _Jv_ThreadId_t + _Jv_ThreadSelf_out_of_line(volatile self_cache_entry *sce, + size_t high_sp_bits); + + inline _Jv_ThreadId_t + _Jv_ThreadSelf (void) + { + int dummy; + size_t sp = (size_t)(&dummy); + unsigned h = SC_INDEX(sp); + volatile self_cache_entry *sce = _Jv_self_cache + h; + pthread_t candidate_self = sce -> self; // Read must precede following one. + read_barrier(); + if (sce -> high_sp_bits == sp >> LOG_THREAD_SPACING) + { + // The sce -> self value we read must be valid. An intervening + // cache replacement by another thread would have first replaced + // high_sp_bits by something else, and it can't possibly change + // back without our intervention. + return candidate_self; + } + else + return _Jv_ThreadSelf_out_of_line(sce, sp >> LOG_THREAD_SPACING); + } + + #define JV_SELF_DEFINED + + #endif /* SLOW_PTHREAD_SELF */ + + #ifndef JV_SELF_DEFINED /* If all else fails, call pthread_self directly */ + + typedef pthread_t _Jv_ThreadId_t; + + inline _Jv_ThreadId_t + _Jv_ThreadSelf (void) + { + return pthread_self(); + } + + #endif /* !JV_SELF_DEFINED */ + + #endif /* JV_HASH_SYNCHRONIZATION */ + inline _Jv_Thread_t * _Jv_ThreadCurrentData (void) { *************** _Jv_ThreadYield (void) *** 194,199 **** --- 366,374 ---- #endif /* HAVE_SCHED_YIELD */ } + void _Jv_ThreadRegister (_Jv_Thread_t *data); + void _Jv_ThreadUnRegister (); + void _Jv_ThreadSetPriority (_Jv_Thread_t *data, jint prio); void _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *data, diff -Nrc3pad gcc-3.0.4/libjava/include/posix.h gcc-3.1/libjava/include/posix.h *** gcc-3.0.4/libjava/include/posix.h Wed Aug 1 17:49:20 2001 --- gcc-3.1/libjava/include/posix.h Sun Apr 7 11:30:09 2002 *************** *** 1,6 **** // posix.h -- Helper functions for POSIX-flavored OSs. ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // posix.h -- Helper functions for POSIX-flavored OSs. ! /* Copyright (C) 2000, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 28,32 **** #include #endif extern int _Jv_select (int n, fd_set *, fd_set *, fd_set *, struct timeval *); ! extern void _Jv_gettimeofday (struct timeval *); --- 28,46 ---- #include #endif + #include + + #include + #include + extern int _Jv_select (int n, fd_set *, fd_set *, fd_set *, struct timeval *); ! extern jlong _Jv_platform_gettimeofday (); ! extern void _Jv_platform_initialize (void); ! extern void _Jv_platform_initProperties (java::util::Properties*); ! ! inline void ! _Jv_platform_close_on_exec (jint fd) ! { ! // Ignore errors. ! fcntl (fd, F_SETFD, FD_CLOEXEC); ! } diff -Nrc3pad gcc-3.0.4/libjava/include/sparc-signal.h gcc-3.1/libjava/include/sparc-signal.h *** gcc-3.0.4/libjava/include/sparc-signal.h Fri Jun 16 15:52:24 2000 --- gcc-3.1/libjava/include/sparc-signal.h Sun Apr 21 09:36:06 2002 *************** details. */ *** 20,27 **** --- 20,32 ---- #define SIGNAL_HANDLER(_name) \ static void _name (int _dummy, siginfo_t *_info, void *arg) + #ifdef __arch64__ + #define FLUSH_REGISTER_WINDOWS \ + asm volatile ("flushw"); + #else #define FLUSH_REGISTER_WINDOWS \ asm volatile ("ta 3"); + #endif #define MAKE_THROW_FRAME(_exception) \ do \ *************** do \ *** 29,36 **** ucontext_t *_context = (ucontext_t *) arg; \ (void)_dummy; \ (void)_info; \ ! register int sp = _context->uc_mcontext.gregs[REG_SP]; \ ! register int retaddr = _context->uc_mcontext.gregs[REG_O7]; \ FLUSH_REGISTER_WINDOWS; \ asm volatile ("mov %0, %%i6; mov %1, %%i7" \ : : "r"(sp), "r"(retaddr)); \ --- 34,41 ---- ucontext_t *_context = (ucontext_t *) arg; \ (void)_dummy; \ (void)_info; \ ! register long sp = _context->uc_mcontext.gregs[REG_SP]; \ ! register long retaddr = _context->uc_mcontext.gregs[REG_O7]; \ FLUSH_REGISTER_WINDOWS; \ asm volatile ("mov %0, %%i6; mov %1, %%i7" \ : : "r"(sp), "r"(retaddr)); \ diff -Nrc3pad gcc-3.0.4/libjava/include/win32-threads.h gcc-3.1/libjava/include/win32-threads.h *** gcc-3.0.4/libjava/include/win32-threads.h Sat Dec 30 12:18:39 2000 --- gcc-3.1/libjava/include/win32-threads.h Sat Feb 2 04:27:34 2002 *************** details. */ *** 18,30 **** // Typedefs. // ! typedef HANDLE _Jv_ConditionVariable_t; ! typedef HANDLE _Jv_Mutex_t; typedef struct { int flags; // Flags are defined in implementation. HANDLE handle; // Actual handle to the thread } _Jv_Thread_t; typedef void _Jv_ThreadStartFunc (java::lang::Thread *); --- 18,36 ---- // Typedefs. // ! typedef struct _Jv_ConditionVariable_t { ! HANDLE ev[2]; ! CRITICAL_SECTION count_mutex; ! int blocked_count; ! }; ! ! typedef CRITICAL_SECTION _Jv_Mutex_t; typedef struct { int flags; // Flags are defined in implementation. HANDLE handle; // Actual handle to the thread + java::lang::Thread *thread_obj; } _Jv_Thread_t; typedef void _Jv_ThreadStartFunc (java::lang::Thread *); *************** typedef void _Jv_ThreadStartFunc (java:: *** 33,95 **** // Condition variables. // ! inline void ! _Jv_CondInit (_Jv_ConditionVariable_t *cv) ! { ! *cv = CreateEvent (NULL, 0, 0, NULL); ! } ! ! #define _Jv_HaveCondDestroy ! ! inline void ! _Jv_CondDestroy (_Jv_ConditionVariable_t *cv) ! { ! CloseHandle (*cv); ! cv = NULL; ! } ! ! int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, ! jlong millis, jint nanos); ! ! inline int ! _Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *) ! { ! // FIXME: check for mutex ownership? ! return PulseEvent (*cv) ? 0 : _JV_NOT_OWNER; // FIXME? ! } ! ! inline int ! _Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *) ! { ! // FIXME: check for mutex ownership? ! return PulseEvent (*cv) ? 0 : _JV_NOT_OWNER; // FIXME? ! } // // Mutexes. // ! inline void ! _Jv_MutexInit (_Jv_Mutex_t *mu) { ! *mu = CreateMutex (NULL, 0, NULL); } #define _Jv_HaveMutexDestroy ! ! inline void ! _Jv_MutexDestroy (_Jv_Mutex_t *mu) { ! CloseHandle (*mu); mu = NULL; } ! int _Jv_MutexLock (_Jv_Mutex_t *mu); ! inline int ! _Jv_MutexUnlock (_Jv_Mutex_t *mu) { ! return ReleaseMutex(*mu) ? 0 : GetLastError(); // FIXME: Map error code? } // --- 39,77 ---- // Condition variables. // ! int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, jlong millis, jint nanos); ! void _Jv_CondInit (_Jv_ConditionVariable_t *cv); ! void _Jv_CondDestroy (_Jv_ConditionVariable_t *cv); ! int _Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *); ! int _Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *); // // Mutexes. + // We use CRITICAL_SECTIONs instead of CreateMutex() for better performance // ! inline void _Jv_MutexInit (_Jv_Mutex_t *mu) { ! InitializeCriticalSection(mu); } #define _Jv_HaveMutexDestroy ! inline void _Jv_MutexDestroy (_Jv_Mutex_t *mu) { ! DeleteCriticalSection(mu); mu = NULL; } ! inline int _Jv_MutexUnlock (_Jv_Mutex_t *mu) ! { ! LeaveCriticalSection(mu); ! return 0; ! } ! inline int _Jv_MutexLock (_Jv_Mutex_t *mu) { ! EnterCriticalSection(mu); ! return 0; } // *************** void _Jv_InitThreads (void); *** 100,125 **** _Jv_Thread_t *_Jv_ThreadInitData (java::lang::Thread *thread); void _Jv_ThreadDestroyData (_Jv_Thread_t *data); ! inline java::lang::Thread * ! _Jv_ThreadCurrent (void) { extern DWORD _Jv_ThreadKey; return (java::lang::Thread *) TlsGetValue(_Jv_ThreadKey); } ! inline _Jv_Thread_t * ! _Jv_ThreadCurrentData (void) { extern DWORD _Jv_ThreadDataKey; return (_Jv_Thread_t *) TlsGetValue(_Jv_ThreadDataKey); } ! inline void ! _Jv_ThreadYield (void) { ! Sleep (0); } void _Jv_ThreadSetPriority (_Jv_Thread_t *data, jint prio); void _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *data, _Jv_ThreadStartFunc *meth); --- 82,109 ---- _Jv_Thread_t *_Jv_ThreadInitData (java::lang::Thread *thread); void _Jv_ThreadDestroyData (_Jv_Thread_t *data); ! inline java::lang::Thread* _Jv_ThreadCurrent (void) { extern DWORD _Jv_ThreadKey; return (java::lang::Thread *) TlsGetValue(_Jv_ThreadKey); } ! inline _Jv_Thread_t *_Jv_ThreadCurrentData(void) { extern DWORD _Jv_ThreadDataKey; return (_Jv_Thread_t *) TlsGetValue(_Jv_ThreadDataKey); } ! inline void _Jv_ThreadYield (void) { ! // FIXME: win98 freezes hard (OS hang) when we use this -- ! // for now, we simply don't yield ! // Sleep (0); } + void _Jv_ThreadRegister (_Jv_Thread_t *data); + void _Jv_ThreadUnRegister (); + void _Jv_ThreadSetPriority (_Jv_Thread_t *data, jint prio); void _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *data, _Jv_ThreadStartFunc *meth); diff -Nrc3pad gcc-3.0.4/libjava/include/win32.h gcc-3.1/libjava/include/win32.h *** gcc-3.0.4/libjava/include/win32.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/include/win32.h Wed Apr 24 01:04:45 2002 *************** *** 0 **** --- 1,38 ---- + // win32.h -- Helper functions for Microsoft-flavored OSs. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #ifndef __JV_WIN32_H__ + #define __JV_WIN32_H__ + + #include + #undef STRICT + + #undef __INSIDE_CYGWIN__ + #include + #include + #include + + extern void _Jv_platform_initialize (void); + extern void _Jv_platform_initProperties (java::util::Properties*); + extern jlong _Jv_platform_gettimeofday (); + + inline void + _Jv_platform_close_on_exec (jint) + { + // Ignore. + } + + #define HAVE_BACKTRACE + + /* Store up to SIZE return address of the current program state in + ARRAY and return the exact number of values stored. */ + extern int backtrace (void **__array, int __size); + + #endif /* __JV_WIN32_H__ */ diff -Nrc3pad gcc-3.0.4/libjava/interpret.cc gcc-3.1/libjava/interpret.cc *** gcc-3.0.4/libjava/interpret.cc Sat Sep 22 01:34:48 2001 --- gcc-3.1/libjava/interpret.cc Sun Feb 10 18:32:48 2002 *************** *** 1,6 **** // interpret.cc - Code for the interpreter ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // interpret.cc - Code for the interpreter ! /* Copyright (C) 1999, 2000, 2001 , 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 21,26 **** --- 21,27 ---- #include #include #include + #include #include #include #include *************** details. */ *** 37,43 **** #include ! static _Jv_Utf8Const *init_name = _Jv_makeUtf8Const ("", 6); static void throw_internal_error (char *msg) __attribute__ ((__noreturn__)); --- 38,44 ---- #include ! using namespace gcj; static void throw_internal_error (char *msg) __attribute__ ((__noreturn__)); *************** static inline void dupx (_Jv_word *sp, i *** 67,72 **** --- 68,89 ---- }; + // Used to convert from floating types to integral types. + template + static inline TO + convert (FROM val, TO min, TO max) + { + TO ret; + if (val >= (FROM) max) + ret = max; + else if (val <= (FROM) min) + ret = min; + else if (val != val) + ret = 0; + else + ret = (TO) val; + return ret; + } #define PUSHA(V) (sp++)->o = (V) #define PUSHI(V) (sp++)->i = (V) *************** static jint get4(unsigned char* loc) { *** 182,192 **** --- 199,219 ---- #ifdef HANDLE_SEGV #define NULLCHECK(X) + #define NULLARRAYCHECK(X) do { SAVE_PC; } while (0) #else #define NULLCHECK(X) \ do { if ((X)==NULL) throw_null_pointer_exception (); } while (0) + #define NULLARRAYCHECK(X) \ + do { if ((X)==NULL) { SAVE_PC; throw_null_pointer_exception (); } } while (0) #endif + #define ARRAYBOUNDSCHECK(array, index) \ + do \ + { \ + if (((unsigned) index) >= (unsigned) (array->length)) \ + _Jv_ThrowBadArrayIndex (index); \ + } \ + while (0) // this method starts the actual running of the method. It is inlined // in three different variants in the static methods run_normal, *************** _Jv_InterpMethod::run (ffi_cif* cif, *** 291,300 **** return ex; } bool _Jv_InterpMethod::find_exception (jobject ex, _Jv_InterpMethodInvocation *inv) { ! int logical_pc = inv->pc - bytecode (); _Jv_InterpException *exc = exceptions (); jclass exc_class = ex->getClass (); --- 318,331 ---- return ex; } + #define SAVE_PC inv->pc = pc + bool _Jv_InterpMethod::find_exception (jobject ex, _Jv_InterpMethodInvocation *inv) { ! // We subtract one because the PC was incremented before it was ! // saved. ! int logical_pc = inv->pc - 1 - bytecode (); _Jv_InterpException *exc = exceptions (); jclass exc_class = ex->getClass (); *************** void _Jv_InterpMethod::run_normal (ffi_c *** 337,343 **** + storage_size * sizeof (_Jv_word)); jobject ex = _this->run (cif, ret, args, inv); ! if (ex != 0) _Jv_Throw ((jthrowable) ex); } void _Jv_InterpMethod::run_synch_object (ffi_cif* cif, --- 368,374 ---- + storage_size * sizeof (_Jv_word)); jobject ex = _this->run (cif, ret, args, inv); ! if (ex != 0) throw static_cast(ex); } void _Jv_InterpMethod::run_synch_object (ffi_cif* cif, *************** void _Jv_InterpMethod::run_synch_object *** 357,363 **** jobject ex = _this->run (cif, ret, args, inv); _Jv_MonitorExit (rcv); ! if (ex != 0) _Jv_Throw ((jthrowable) ex); } void _Jv_InterpMethod::run_synch_class (ffi_cif* cif, --- 388,394 ---- jobject ex = _this->run (cif, ret, args, inv); _Jv_MonitorExit (rcv); ! if (ex != 0) throw static_cast(ex); } void _Jv_InterpMethod::run_synch_class (ffi_cif* cif, *************** void _Jv_InterpMethod::run_synch_class ( *** 377,383 **** jobject ex = _this->run (cif, ret, args, inv); _Jv_MonitorExit (sync); ! if (ex != 0) _Jv_Throw ((jthrowable) ex); } /* --- 408,414 ---- jobject ex = _this->run (cif, ret, args, inv); _Jv_MonitorExit (sync); ! if (ex != 0) throw static_cast(ex); } /* *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 615,622 **** INSN_LABEL(jsr_w), }; - #define SAVE_PC inv->pc = pc-1 - /* If the macro INLINE_SWITCH is not defined, then the main loop operates as one big (normal) switch statement. If it is defined, then the case selection is performed `inline' in the end of the --- 646,651 ---- *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 679,685 **** // working if the method is final. So instead we do an // explicit test. if (! sp[0].o) ! throw new java::lang::NullPointerException (); if (rmeth->vtable_index == -1) { --- 708,714 ---- // working if the method is final. So instead we do an // explicit test. if (! sp[0].o) ! throw new java::lang::NullPointerException; if (rmeth->vtable_index == -1) { *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 953,1065 **** NEXT_INSN; insn_iaload: - SAVE_PC; { jint index = POPI(); jintArray arr = (jintArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_laload: - SAVE_PC; { jint index = POPI(); jlongArray arr = (jlongArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHL( elements(arr)[index] ); } NEXT_INSN; insn_faload: - SAVE_PC; { jint index = POPI(); jfloatArray arr = (jfloatArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHF( elements(arr)[index] ); } NEXT_INSN; insn_daload: - SAVE_PC; { jint index = POPI(); jdoubleArray arr = (jdoubleArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHD( elements(arr)[index] ); } NEXT_INSN; insn_aaload: - SAVE_PC; { jint index = POPI(); jobjectArray arr = (jobjectArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHA( elements(arr)[index] ); } NEXT_INSN; insn_baload: - SAVE_PC; { jint index = POPI(); jbyteArray arr = (jbyteArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_caload: - SAVE_PC; { jint index = POPI(); jcharArray arr = (jcharArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_saload: - SAVE_PC; { jint index = POPI(); jshortArray arr = (jshortArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } PUSHI( elements(arr)[index] ); } NEXT_INSN; --- 982,1062 ---- NEXT_INSN; insn_iaload: { jint index = POPI(); jintArray arr = (jintArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_laload: { jint index = POPI(); jlongArray arr = (jlongArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHL( elements(arr)[index] ); } NEXT_INSN; insn_faload: { jint index = POPI(); jfloatArray arr = (jfloatArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHF( elements(arr)[index] ); } NEXT_INSN; insn_daload: { jint index = POPI(); jdoubleArray arr = (jdoubleArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHD( elements(arr)[index] ); } NEXT_INSN; insn_aaload: { jint index = POPI(); jobjectArray arr = (jobjectArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHA( elements(arr)[index] ); } NEXT_INSN; insn_baload: { jint index = POPI(); jbyteArray arr = (jbyteArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_caload: { jint index = POPI(); jcharArray arr = (jcharArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; insn_saload: { jint index = POPI(); jshortArray arr = (jshortArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); PUSHI( elements(arr)[index] ); } NEXT_INSN; *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1165,1286 **** NEXT_INSN; insn_iastore: - SAVE_PC; { jint value = POPI(); jint index = POPI(); jintArray arr = (jintArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } elements(arr)[index] = value; } NEXT_INSN; insn_lastore: - SAVE_PC; { jlong value = POPL(); jint index = POPI(); jlongArray arr = (jlongArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } elements(arr)[index] = value; } NEXT_INSN; insn_fastore: - SAVE_PC; { jfloat value = POPF(); jint index = POPI(); jfloatArray arr = (jfloatArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } elements(arr)[index] = value; } NEXT_INSN; insn_dastore: - SAVE_PC; { jdouble value = POPD(); jint index = POPI(); jdoubleArray arr = (jdoubleArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } elements(arr)[index] = value; } NEXT_INSN; insn_aastore: - SAVE_PC; { jobject value = POPA(); jint index = POPI(); jobjectArray arr = (jobjectArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } _Jv_CheckArrayStore (arr, value); elements(arr)[index] = value; } NEXT_INSN; insn_bastore: - SAVE_PC; { jbyte value = (jbyte) POPI(); jint index = POPI(); jbyteArray arr = (jbyteArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } elements(arr)[index] = value; } NEXT_INSN; insn_castore: - SAVE_PC; { jchar value = (jchar) POPI(); jint index = POPI(); jcharArray arr = (jcharArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } elements(arr)[index] = value; } NEXT_INSN; insn_sastore: - SAVE_PC; { jshort value = (jshort) POPI(); jint index = POPI(); jshortArray arr = (jshortArray) POPA(); ! NULLCHECK (arr); ! if (index < 0 || index >= arr->length) ! { ! _Jv_ThrowBadArrayIndex (index); ! } elements(arr)[index] = value; } NEXT_INSN; --- 1162,1251 ---- NEXT_INSN; insn_iastore: { jint value = POPI(); jint index = POPI(); jintArray arr = (jintArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_lastore: { jlong value = POPL(); jint index = POPI(); jlongArray arr = (jlongArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_fastore: { jfloat value = POPF(); jint index = POPI(); jfloatArray arr = (jfloatArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_dastore: { jdouble value = POPD(); jint index = POPI(); jdoubleArray arr = (jdoubleArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_aastore: { jobject value = POPA(); jint index = POPI(); jobjectArray arr = (jobjectArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); _Jv_CheckArrayStore (arr, value); elements(arr)[index] = value; } NEXT_INSN; insn_bastore: { jbyte value = (jbyte) POPI(); jint index = POPI(); jbyteArray arr = (jbyteArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_castore: { jchar value = (jchar) POPI(); jint index = POPI(); jcharArray arr = (jcharArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; insn_sastore: { jshort value = (jshort) POPI(); jint index = POPI(); jshortArray arr = (jshortArray) POPA(); ! NULLARRAYCHECK (arr); ! ARRAYBOUNDSCHECK (arr, index); elements(arr)[index] = value; } NEXT_INSN; *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1398,1404 **** NEXT_INSN; insn_fdiv: - SAVE_PC; { jfloat value2 = POPF(); jfloat value1 = POPF(); --- 1363,1368 ---- *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1408,1414 **** NEXT_INSN; insn_ddiv: - SAVE_PC; { jdouble value2 = POPD(); jdouble value1 = POPD(); --- 1372,1377 ---- *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1438,1444 **** NEXT_INSN; insn_frem: - SAVE_PC; { jfloat value2 = POPF(); jfloat value1 = POPF(); --- 1401,1406 ---- *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1448,1454 **** NEXT_INSN; insn_drem: - SAVE_PC; { jdouble value2 = POPD(); jdouble value1 = POPD(); --- 1410,1415 ---- *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1590,1600 **** NEXT_INSN; insn_f2i: ! { jint value = (jint)POPF (); PUSHI(value); } NEXT_INSN; insn_f2l: ! { jlong value = (jlong)POPF (); PUSHL(value); } NEXT_INSN; insn_f2d: --- 1551,1569 ---- NEXT_INSN; insn_f2i: ! { ! using namespace java::lang; ! jint value = convert (POPF (), Integer::MIN_VALUE, Integer::MAX_VALUE); ! PUSHI(value); ! } NEXT_INSN; insn_f2l: ! { ! using namespace java::lang; ! jlong value = convert (POPF (), Long::MIN_VALUE, Long::MAX_VALUE); ! PUSHL(value); ! } NEXT_INSN; insn_f2d: *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1602,1612 **** NEXT_INSN; insn_d2i: ! { jint value = (jint)POPD (); PUSHI(value); } NEXT_INSN; insn_d2l: ! { jlong value = (jlong)POPD (); PUSHL(value); } NEXT_INSN; insn_d2f: --- 1571,1589 ---- NEXT_INSN; insn_d2i: ! { ! using namespace java::lang; ! jint value = convert (POPD (), Integer::MIN_VALUE, Integer::MAX_VALUE); ! PUSHI(value); ! } NEXT_INSN; insn_d2l: ! { ! using namespace java::lang; ! jlong value = convert (POPD (), Long::MIN_VALUE, Long::MAX_VALUE); ! PUSHL(value); ! } NEXT_INSN; insn_d2f: *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 1979,1985 **** jclass type = field->type; jint field_offset = field->u.boffset; if (field_offset > 0xffff) ! JvThrow (new java::lang::VirtualMachineError); jobject obj = POPA(); NULLCHECK(obj); --- 1956,1962 ---- jclass type = field->type; jint field_offset = field->u.boffset; if (field_offset > 0xffff) ! throw new java::lang::VirtualMachineError; jobject obj = POPA(); NULLCHECK(obj); *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 2086,2092 **** jint field_offset = field->u.boffset; if (field_offset > 0xffff) ! JvThrow (new java::lang::VirtualMachineError); if (type->isPrimitive ()) { --- 2063,2069 ---- jint field_offset = field->u.boffset; if (field_offset > 0xffff) ! throw new java::lang::VirtualMachineError; if (type->isPrimitive ()) { *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 2226,2234 **** NEXT_INSN; insn_arraylength: - SAVE_PC; { __JArray *arr = (__JArray*)POPA(); PUSHI (arr->length); } NEXT_INSN; --- 2203,2211 ---- NEXT_INSN; insn_arraylength: { __JArray *arr = (__JArray*)POPA(); + NULLARRAYCHECK (arr); PUSHI (arr->length); } NEXT_INSN; *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 2237,2243 **** SAVE_PC; { jobject value = POPA(); ! JvThrow (value); } NEXT_INSN; --- 2214,2220 ---- SAVE_PC; { jobject value = POPA(); ! throw static_cast(value); } NEXT_INSN; *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 2250,2257 **** if (value != NULL && ! to->isInstance (value)) { ! JvThrow (new java::lang::ClassCastException ! (to->getName())); } PUSHA (value); --- 2227,2233 ---- if (value != NULL && ! to->isInstance (value)) { ! throw new java::lang::ClassCastException (to->getName()); } PUSHA (value); *************** void _Jv_InterpMethod::continue1 (_Jv_In *** 2412,2424 **** static void throw_internal_error (char *msg) { ! JvThrow (new java::lang::InternalError (JvNewStringLatin1 (msg))); } static void throw_incompatible_class_change_error (jstring msg) { ! JvThrow (new java::lang::IncompatibleClassChangeError (msg)); } #ifndef HANDLE_SEGV --- 2388,2400 ---- static void throw_internal_error (char *msg) { ! throw new java::lang::InternalError (JvNewStringLatin1 (msg)); } static void throw_incompatible_class_change_error (jstring msg) { ! throw new java::lang::IncompatibleClassChangeError (msg); } #ifndef HANDLE_SEGV *************** throw_null_pointer_exception () *** 2429,2435 **** if (null_pointer_exc == NULL) null_pointer_exc = new java::lang::NullPointerException; ! JvThrow (null_pointer_exc); } #endif --- 2405,2411 ---- if (null_pointer_exc == NULL) null_pointer_exc = new java::lang::NullPointerException; ! throw null_pointer_exc; } #endif diff -Nrc3pad gcc-3.0.4/libjava/java/applet/Applet.java gcc-3.1/libjava/java/applet/Applet.java *** gcc-3.0.4/libjava/java/applet/Applet.java Wed Jul 12 04:52:04 2000 --- gcc-3.1/libjava/java/applet/Applet.java Tue Jan 22 22:40:03 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.applet; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.applet; diff -Nrc3pad gcc-3.0.4/libjava/java/applet/AppletContext.java gcc-3.1/libjava/java/applet/AppletContext.java *** gcc-3.0.4/libjava/java/applet/AppletContext.java Wed Jul 12 04:52:04 2000 --- gcc-3.1/libjava/java/applet/AppletContext.java Tue Jan 22 22:40:03 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.applet; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.applet; diff -Nrc3pad gcc-3.0.4/libjava/java/applet/AppletStub.java gcc-3.1/libjava/java/applet/AppletStub.java *** gcc-3.0.4/libjava/java/applet/AppletStub.java Wed Jul 12 04:52:04 2000 --- gcc-3.1/libjava/java/applet/AppletStub.java Tue Jan 22 22:40:03 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.applet; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.applet; diff -Nrc3pad gcc-3.0.4/libjava/java/applet/AudioClip.java gcc-3.1/libjava/java/applet/AudioClip.java *** gcc-3.0.4/libjava/java/applet/AudioClip.java Wed Jul 12 04:52:04 2000 --- gcc-3.1/libjava/java/applet/AudioClip.java Tue Jan 22 22:40:03 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.applet; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.applet; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/AWTError.java gcc-3.1/libjava/java/awt/AWTError.java *** gcc-3.0.4/libjava/java/awt/AWTError.java Mon Dec 4 01:54:34 2000 --- gcc-3.1/libjava/java/awt/AWTError.java Tue Jan 22 22:40:04 2002 *************** *** 1,25 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! /** An exception of this type is thrown by AWT in some situations, ! * usually when major problems are encountered. ! * @author Tom Tromey ! * @date April 8, 2000 ! */ public class AWTError extends Error { ! /** Make a new instance of AWTError ! * @param s Text associated with the exception ! */ ! public AWTError (String s) ! { ! super (s); ! } } --- 1,62 ---- ! /* AWTError.java -- A serious AWT error occurred. ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! /** ! * This error is thrown when a critical AWT error occurs. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public class AWTError extends Error { ! ! /** ! * Initializes a new instance of AWTError with the specified ! * descriptive error message. ! * ! * @param message The descriptive error message. ! */ ! public ! AWTError(String message) ! { ! super(message); } + + } // class AWTError + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/AWTEvent.java gcc-3.1/libjava/java/awt/AWTEvent.java *** gcc-3.0.4/libjava/java/awt/AWTEvent.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/AWTEvent.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,39 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** package java.awt; *** 17,43 **** /** * AWTEvent is the root event class for all AWT events in the JDK 1.1 event ! * model. It supercedes the Event class from JDK 1.0. */ - public abstract class AWTEvent extends java.util.EventObject { protected boolean consumed; protected int id; ! /* Event selection masks */ ! public static final long COMPONENT_EVENT_MASK = 1 << 0, ! CONTAINER_EVENT_MASK = 1 << 1, ! FOCUS_EVENT_MASK = 1 << 2, ! KEY_EVENT_MASK = 1 << 3, ! MOUSE_EVENT_MASK = 1 << 4, ! MOUSE_MOTION_EVENT_MASK = 1 << 5, ! WINDOW_EVENT_MASK = 1 << 6, ! ACTION_EVENT_MASK = 1 << 7, ! ADJUSTMENT_EVENT_MASK = 1 << 8, ! ITEM_EVENT_MASK = 1 << 9, ! TEXT_EVENT_MASK = 1 << 10, ! INPUT_METHOD_EVENT_MASK = 1 << 11; /* Additional event selection masks from JDK 1.3 javadocs */ public static final long PAINT_EVENT_MASK = 1 << 13, --- 46,129 ---- /** * AWTEvent is the root event class for all AWT events in the JDK 1.1 event ! * model. It supersedes the Event class from JDK 1.0. ! * @author Warren Levy ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public abstract class AWTEvent extends java.util.EventObject { + /** + * @serial Indicates whether or not this event has been consumed. + */ protected boolean consumed; + + /** + * @serial The identifier number of this event. + */ protected int id; ! /** ! * Mask for selecting component events. ! */ ! public static final long COMPONENT_EVENT_MASK = 0x001; ! ! /** ! * Mask for selecting container events. ! */ ! public static final long CONTAINER_EVENT_MASK = 0x002; ! ! /** ! * Mask for selecting component focus events. ! */ ! public static final long FOCUS_EVENT_MASK = 0x004; ! ! /** ! * Mask for selecting keyboard events. ! */ ! public static final long KEY_EVENT_MASK = 0x008; ! ! /** ! * Mask for mouse button events. ! */ ! public static final long MOUSE_EVENT_MASK = 0x010; ! ! /** ! * Mask for mouse motion events. ! */ ! public static final long MOUSE_MOTION_EVENT_MASK = 0x020; ! ! /** ! * Mask for window events. ! */ ! public static final long WINDOW_EVENT_MASK = 0x040; ! ! /** ! * Mask for action events. ! */ ! public static final long ACTION_EVENT_MASK = 0x080; ! ! /** ! * Mask for adjustment events. ! */ ! public static final long ADJUSTMENT_EVENT_MASK = 0x100; ! ! /** ! * Mask for item events. ! */ ! public static final long ITEM_EVENT_MASK = 0x200; ! ! /** ! * Mask for text events. ! */ ! public static final long TEXT_EVENT_MASK = 0x400; ! ! /** ! * This is the highest number for event ids that are reserved for use by ! * the AWT system itself. ! */ ! public static final int RESERVED_ID_MAX = 1999; ! ! public static final long INPUT_METHOD_EVENT_MASK = 1 << 11; /* Additional event selection masks from JDK 1.3 javadocs */ public static final long PAINT_EVENT_MASK = 1 << 13, *************** public abstract class AWTEvent extends j *** 45,85 **** HIERARCHY_EVENT_MASK = 1 << 15, HIERARCHY_BOUNDS_EVENT_MASK = 1 << 16; ! public static final int RESERVED_ID_MAX = 0x7cf; ! public AWTEvent(Event event) { // FIXME?? super(event.target); this.id = event.id; } ! public AWTEvent(Object source, int id) { super(source); this.id = id; } public int getID() { return id; } public String paramString () { return ""; } public String toString () { return getClass().getName() + "[" + paramString() + "] on " + source; } ! protected void consume() { consumed = true; } ! protected boolean isConsumed() { return consumed; --- 131,212 ---- HIERARCHY_EVENT_MASK = 1 << 15, HIERARCHY_BOUNDS_EVENT_MASK = 1 << 16; ! /** ! * Initializes a new instance of AWTEvent from the ! * specified Java 1.0 event object. ! * ! * @param event The Java 1.0 event to initialize from. ! * ! * ! * Removed this method because we no longer support Java 1.0 ! * ! */ public AWTEvent(Event event) { // FIXME?? super(event.target); this.id = event.id; } ! ! /** ! * Initializes a new instance of AWTEvent with the specified ! * source and id. ! * ! * @param source The object that caused the event. ! * @param id The event id. ! */ public AWTEvent(Object source, int id) { super(source); this.id = id; } + /** + * Returns the id number of this event. + * + * @return The id number of this event. + */ public int getID() { return id; } + /** + * Returns a string representation of this event. + * + * @return A string representation of this event. + */ public String paramString () { return ""; } + /** + * Returns a string representation of this event. + * + * @return A string representation of this event. + */ public String toString () { return getClass().getName() + "[" + paramString() + "] on " + source; } ! ! /** ! * Consumes this event so that it will not be processed in the default ! * manner. ! */ protected void consume() { consumed = true; } ! ! /** ! * Tests whether not not this event has been consumed. A consumed event ! * is not processed in the default manner. ! * ! * @return true if this event has been consumed, ! * false otherwise. ! */ protected boolean isConsumed() { return consumed; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/AWTEventMulticaster.java gcc-3.1/libjava/java/awt/AWTEventMulticaster.java *** gcc-3.0.4/libjava/java/awt/AWTEventMulticaster.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/AWTEventMulticaster.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,39 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** import java.io.ObjectOutputStream; *** 21,40 **** */ /** ! * Convienience class for thread-safe multicasting of AWT events, ! * without synchronization. ! * ! * @author Bryce McKinlay ! */ ! public class AWTEventMulticaster implements ComponentListener, ContainerListener, FocusListener, KeyListener, MouseListener, MouseMotionListener, WindowListener, ActionListener, ItemListener, AdjustmentListener, TextListener, InputMethodListener, HierarchyListener, HierarchyBoundsListener { ! protected final EventListener a, b; protected AWTEventMulticaster(EventListener a, EventListener b) { --- 50,114 ---- */ /** ! * This class is used to implement a chain of event handlers. Dispatching ! * using this class is thread safe. Here is a quick example of how to ! * add and delete listeners using this class. For this example, we will ! * assume are firing AdjustableEvent's. However, this ! * same approach is useful for all events in the java.awt.event ! * package, and more if this class is subclassed. ! *

    ! * ! * AdjustmentListener al; ! * ! * public void ! * addAdjustmentListener(AdjustmentListener listener) ! * { ! * al = AWTEventMulticaster.add(al, listener); ! * } ! * ! * public void ! * removeAdjustmentListener(AdjustmentListener listener) ! * { ! * al = AWTEventMulticaster.remove(al, listener); ! * } ! * ! *

    ! * When it come time to process an event, simply call al, ! * assuming it is not null. ! *

    ! * The first time add is called it is passed ! * null and listener as its arguments. This ! * starts building the chain. This class returns listener ! * which becomes the new al. The next time, add ! * is called with al and listener and the ! * new listener is then chained to the old. ! * ! * @author Bryce McKinlay ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public class AWTEventMulticaster implements ComponentListener, ContainerListener, FocusListener, KeyListener, MouseListener, MouseMotionListener, WindowListener, ActionListener, ItemListener, AdjustmentListener, TextListener, InputMethodListener, HierarchyListener, HierarchyBoundsListener { ! /** ! * A variable in the event chain. ! */ ! protected final EventListener a; + /** + * A variable in the event chain + */ + protected final EventListener b; + + /** + * Initializes a new instance of AWTEventMulticaster with + * the specified event listener parameters. + * + * @param a The "a" listener object. + * @param b The "b" listener object. + */ protected AWTEventMulticaster(EventListener a, EventListener b) { *************** public class AWTEventMulticaster impleme *** 42,47 **** --- 116,129 ---- this.b = b; } + /** + * Chain EventListener b to a. + * + * @param a - Listener to chain to. + * @param b - Listener to chain. + * + * @return Latest entry in the chain. + */ protected static EventListener addInternal(EventListener a, EventListener b) { if (a == null) *************** public class AWTEventMulticaster impleme *** 50,56 **** return a; else return new AWTEventMulticaster(a, b); } ! protected static EventListener removeInternal(EventListener l, EventListener oldl) { --- 132,146 ---- return a; else return new AWTEventMulticaster(a, b); } ! ! /** ! * Removes the listener old from the listener lis. ! * ! * @param lis The listener to remove old from. ! * @param old The listener to remove. ! * ! * @return The resulting listener after the remove operation. ! */ protected static EventListener removeInternal(EventListener l, EventListener oldl) { *************** public class AWTEventMulticaster impleme *** 64,70 **** return l; } ! /* Remove oldl from this multicaster. */ protected EventListener remove(EventListener oldl) { // If oldl is an immediate child, return the other child. --- 154,170 ---- return l; } ! /** ! * Removes the specified object from this multicaster object. If the ! * object to remove is not part of this multicaster, then the remove ! * method on the parent multicaster (if it exists) is called and a ! * new multicaster object is returned based on that object and this ! * multicaster's non-parent object. ! * ! * @param old The object to remove from this multicaster. ! * ! * @return The resulting multicaster with the specified listener removed. ! */ protected EventListener remove(EventListener oldl) { // If oldl is an immediate child, return the other child. *************** public class AWTEventMulticaster impleme *** 73,79 **** if (b == oldl) return a; ! // If a and/or b are Multicaster's, search them recursivly. if (a instanceof AWTEventMulticaster) { AWTEventMulticaster mc = (AWTEventMulticaster) a; --- 173,179 ---- if (b == oldl) return a; ! // If a and/or b are Multicaster's, search them recursively. if (a instanceof AWTEventMulticaster) { AWTEventMulticaster mc = (AWTEventMulticaster) a; *************** public class AWTEventMulticaster impleme *** 88,195 **** if (newb != b) return new AWTEventMulticaster (a, newb); } ! // oldl was not found. return this; } public static ActionListener add(ActionListener a, ActionListener b) { return (ActionListener) addInternal(a, b); } ! public static AdjustmentListener add(AdjustmentListener a, AdjustmentListener b) { return (AdjustmentListener) addInternal(a, b); } ! public static ComponentListener add(ComponentListener a, ComponentListener b) { return (ComponentListener) addInternal(a, b); } ! public static ContainerListener add(ContainerListener a, ContainerListener b) { return (ContainerListener) addInternal(a, b); } ! public static FocusListener add(FocusListener a, FocusListener b) { return (FocusListener) addInternal(a, b); } ! public static HierarchyBoundsListener add(HierarchyBoundsListener a, HierarchyBoundsListener b) { return (HierarchyBoundsListener) addInternal(a, b); } ! public static HierarchyListener add(HierarchyListener a, HierarchyListener b) { return (HierarchyListener) addInternal(a, b); } ! public static InputMethodListener add(InputMethodListener a, InputMethodListener b) { return (InputMethodListener) addInternal(a, b); } ! public static ItemListener add(ItemListener a, ItemListener b) { return (ItemListener) addInternal(a, b); } ! public static KeyListener add(KeyListener a, KeyListener b) { return (KeyListener) addInternal(a, b); } public static MouseListener add(MouseListener a, MouseListener b) { return (MouseListener) addInternal(a, b); } ! public static MouseMotionListener add(MouseMotionListener a, MouseMotionListener b) { return (MouseMotionListener) addInternal(a, b); } ! public static TextListener add(TextListener a, TextListener b) { return (TextListener) addInternal(a, b); } ! public static WindowListener add(WindowListener a, WindowListener b) { return (WindowListener) addInternal(a, b); } ! public static ActionListener remove(ActionListener l, ActionListener oldl) { return (ActionListener) removeInternal(l, oldl); } ! public static AdjustmentListener remove(AdjustmentListener l, AdjustmentListener oldl) { return (AdjustmentListener) removeInternal(l, oldl); } public static ComponentListener remove(ComponentListener l, ComponentListener oldl) { return (ComponentListener) removeInternal(l, oldl); } public static ContainerListener remove(ContainerListener l, ContainerListener oldl) { return (ContainerListener) removeInternal(l, oldl); } public static FocusListener remove(FocusListener l, FocusListener oldl) { return (FocusListener) removeInternal(l, oldl); --- 188,423 ---- if (newb != b) return new AWTEventMulticaster (a, newb); } ! // oldl was not found. return this; } + /** + * Chain ActionListener b to a. + * + * @param a - Listener to chain to. + * @param b - Listener to chain. + * + * @return Latest entry in the chain. + */ public static ActionListener add(ActionListener a, ActionListener b) { return (ActionListener) addInternal(a, b); } ! ! /** ! * Chain AdjustmentListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static AdjustmentListener add(AdjustmentListener a, AdjustmentListener b) { return (AdjustmentListener) addInternal(a, b); } ! ! /** ! * Chain ComponentListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static ComponentListener add(ComponentListener a, ComponentListener b) { return (ComponentListener) addInternal(a, b); } ! ! /** ! * Chain ContainerListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static ContainerListener add(ContainerListener a, ContainerListener b) { return (ContainerListener) addInternal(a, b); } ! ! /** ! * Chain FocusListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static FocusListener add(FocusListener a, FocusListener b) { return (FocusListener) addInternal(a, b); } ! public static HierarchyBoundsListener add(HierarchyBoundsListener a, HierarchyBoundsListener b) { return (HierarchyBoundsListener) addInternal(a, b); } ! public static HierarchyListener add(HierarchyListener a, HierarchyListener b) { return (HierarchyListener) addInternal(a, b); } ! public static InputMethodListener add(InputMethodListener a, InputMethodListener b) { return (InputMethodListener) addInternal(a, b); } ! ! /** ! * Chain ItemListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static ItemListener add(ItemListener a, ItemListener b) { return (ItemListener) addInternal(a, b); } ! ! /** ! * Chain KeyListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static KeyListener add(KeyListener a, KeyListener b) { return (KeyListener) addInternal(a, b); } + /** + * Chain MouseListener b to a. + * + * @param a - Listener to chain to. + * @param b - Listener to chain. + * + * @return Latest entry in the chain. + */ public static MouseListener add(MouseListener a, MouseListener b) { return (MouseListener) addInternal(a, b); } ! ! /** ! * Chain MouseMotionListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static MouseMotionListener add(MouseMotionListener a, MouseMotionListener b) { return (MouseMotionListener) addInternal(a, b); } ! ! /** ! * Chain AdjustmentListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static TextListener add(TextListener a, TextListener b) { return (TextListener) addInternal(a, b); } ! ! /** ! * Chain WindowListener b to a. ! * ! * @param a - Listener to chain to. ! * @param b - Listener to chain. ! * ! * @return Latest entry in the chain. ! */ public static WindowListener add(WindowListener a, WindowListener b) { return (WindowListener) addInternal(a, b); } ! ! /** ! * Removes the listener old from the listener lis. ! * ! * @param lis The listener to remove old from. ! * @param old The listener to remove. ! * ! * @return The resulting listener after the remove operation. ! */ public static ActionListener remove(ActionListener l, ActionListener oldl) { return (ActionListener) removeInternal(l, oldl); } ! ! /** ! * Removes the listener old from the listener lis. ! * ! * @param lis The listener to remove old from. ! * @param old The listener to remove. ! * ! * @return The resulting listener after the remove operation. ! */ public static AdjustmentListener remove(AdjustmentListener l, AdjustmentListener oldl) { return (AdjustmentListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static ComponentListener remove(ComponentListener l, ComponentListener oldl) { return (ComponentListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static ContainerListener remove(ContainerListener l, ContainerListener oldl) { return (ContainerListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static FocusListener remove(FocusListener l, FocusListener oldl) { return (FocusListener) removeInternal(l, oldl); *************** public class AWTEventMulticaster impleme *** 213,463 **** return (InputMethodListener) removeInternal(l, oldl); } public static ItemListener remove(ItemListener l, ItemListener oldl) { return (ItemListener) removeInternal(l, oldl); } public static KeyListener remove(KeyListener l, KeyListener oldl) { return (KeyListener) removeInternal(l, oldl); } public static MouseListener remove(MouseListener l, MouseListener oldl) { return (MouseListener) removeInternal(l, oldl); } public static MouseMotionListener remove(MouseMotionListener l, MouseMotionListener oldl) { return (MouseMotionListener) removeInternal(l, oldl); } public static TextListener remove(TextListener l, TextListener oldl) { return (TextListener) removeInternal(l, oldl); } public static WindowListener remove(WindowListener l, WindowListener oldl) { return (WindowListener) removeInternal(l, oldl); } public void actionPerformed(ActionEvent e) { ((ActionListener) a).actionPerformed(e); ((ActionListener) b).actionPerformed(e); } ! public void adjustmentValueChanged(AdjustmentEvent e) { ((AdjustmentListener) a).adjustmentValueChanged(e); ((AdjustmentListener) b).adjustmentValueChanged(e); } ! public void componentHidden(ComponentEvent e) { ((ComponentListener) a).componentHidden(e); ((ComponentListener) b).componentHidden(e); } ! public void componentMoved(ComponentEvent e) { ((ComponentListener) a).componentMoved(e); ((ComponentListener) b).componentMoved(e); } ! public void componentResized(ComponentEvent e) { ((ComponentListener) a).componentResized(e); ((ComponentListener) b).componentResized(e); } ! public void componentShown(ComponentEvent e) { ((ComponentListener) a).componentShown(e); ((ComponentListener) b).componentShown(e); } ! public void componentAdded(ContainerEvent e) { ((ContainerListener) a).componentAdded(e); ((ContainerListener) b).componentAdded(e); } public void componentRemoved(ContainerEvent e) { ((ContainerListener) a).componentRemoved(e); ((ContainerListener) b).componentRemoved(e); } ! public void focusGained(FocusEvent e) { ((FocusListener) a).focusGained(e); ((FocusListener) b).focusGained(e); } ! public void focusLost(FocusEvent e) { ((FocusListener) a).focusLost(e); ((FocusListener) b).focusLost(e); } - public void ancestorMoved(HierarchyEvent e) { ((HierarchyBoundsListener) a).ancestorMoved(e); ((HierarchyBoundsListener) b).ancestorMoved(e); } ! public void ancestorResized(HierarchyEvent e) { ((HierarchyBoundsListener) a).ancestorResized(e); ((HierarchyBoundsListener) b).ancestorResized(e); } ! public void hierarchyChanged(HierarchyEvent e) { ((HierarchyListener) a).hierarchyChanged(e); ((HierarchyListener) b).hierarchyChanged(e); } public void caretPositionChanged(InputMethodEvent e) { ((InputMethodListener) a).caretPositionChanged(e); ((InputMethodListener) b).caretPositionChanged(e); } public void inputMethodTextChanged(InputMethodEvent e) { ((InputMethodListener) a).inputMethodTextChanged(e); ((InputMethodListener) b).inputMethodTextChanged(e); } public void itemStateChanged(ItemEvent e) { ((ItemListener) a).itemStateChanged(e); ((ItemListener) b).itemStateChanged(e); } public void keyPressed(KeyEvent e) { ((KeyListener) a).keyPressed(e); ((KeyListener) b).keyPressed(e); } ! public void keyReleased(KeyEvent e) { ((KeyListener) a).keyReleased(e); ((KeyListener) b).keyReleased(e); } ! public void keyTyped(KeyEvent e) { ((KeyListener) a).keyTyped(e); ((KeyListener) b).keyTyped(e); } ! public void mouseClicked(MouseEvent e) { ((MouseListener) a).mouseClicked(e); ((MouseListener) b).mouseClicked(e); } ! ! public void mouseEntered(MouseEvent e) { ((MouseListener) a).mouseEntered(e); ((MouseListener) b).mouseEntered(e); } ! public void mouseExited(MouseEvent e) { ((MouseListener) a).mouseExited(e); ((MouseListener) b).mouseExited(e); } public void mousePressed(MouseEvent e) { ((MouseListener) a).mousePressed(e); ((MouseListener) b).mousePressed(e); } ! public void mouseReleased(MouseEvent e) { ((MouseListener) a).mouseReleased(e); ((MouseListener) b).mouseReleased(e); } ! public void mouseDragged(MouseEvent e) { ((MouseMotionListener) a).mouseDragged(e); ((MouseMotionListener) b).mouseDragged(e); } public void mouseMoved(MouseEvent e) { ((MouseMotionListener) a).mouseMoved(e); ((MouseMotionListener) b).mouseMoved(e); } ! public void textValueChanged(TextEvent e) { ((TextListener) a).textValueChanged(e); ((TextListener) b).textValueChanged(e); } ! public void windowActivated(WindowEvent e) { ((WindowListener) a).windowActivated(e); ((WindowListener) b).windowActivated(e); } ! public void windowClosed(WindowEvent e) { ((WindowListener) a).windowClosed(e); ((WindowListener) b).windowClosed(e); } ! public void windowClosing(WindowEvent e) { ((WindowListener) a).windowClosing(e); ((WindowListener) b).windowClosing(e); } ! public void windowDeactivated(WindowEvent e) { ((WindowListener) a).windowDeactivated(e); ((WindowListener) b).windowDeactivated(e); } ! public void windowDeiconified(WindowEvent e) { ((WindowListener) a).windowDeiconified(e); ((WindowListener) b).windowDeiconified(e); } ! public void windowIconified(WindowEvent e) { ((WindowListener) a).windowIconified(e); ((WindowListener) b).windowIconified(e); } ! public void windowOpened(WindowEvent e) { ((WindowListener) a).windowOpened(e); ((WindowListener) b).windowOpened(e); } ! protected static void save(ObjectOutputStream s, String k, EventListener l) { ! // FIXME } protected void saveInternal(ObjectOutputStream s, String k) { ! // FIXME } - } --- 441,940 ---- return (InputMethodListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static ItemListener remove(ItemListener l, ItemListener oldl) { return (ItemListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static KeyListener remove(KeyListener l, KeyListener oldl) { return (KeyListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static MouseListener remove(MouseListener l, MouseListener oldl) { return (MouseListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static MouseMotionListener remove(MouseMotionListener l, MouseMotionListener oldl) { return (MouseMotionListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static TextListener remove(TextListener l, TextListener oldl) { return (TextListener) removeInternal(l, oldl); } + /** + * Removes the listener old from the listener lis. + * + * @param lis The listener to remove old from. + * @param old The listener to remove. + * + * @return The resulting listener after the remove operation. + */ public static WindowListener remove(WindowListener l, WindowListener oldl) { return (WindowListener) removeInternal(l, oldl); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void actionPerformed(ActionEvent e) { ((ActionListener) a).actionPerformed(e); ((ActionListener) b).actionPerformed(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void adjustmentValueChanged(AdjustmentEvent e) { ((AdjustmentListener) a).adjustmentValueChanged(e); ((AdjustmentListener) b).adjustmentValueChanged(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void componentHidden(ComponentEvent e) { ((ComponentListener) a).componentHidden(e); ((ComponentListener) b).componentHidden(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void componentMoved(ComponentEvent e) { ((ComponentListener) a).componentMoved(e); ((ComponentListener) b).componentMoved(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void componentResized(ComponentEvent e) { ((ComponentListener) a).componentResized(e); ((ComponentListener) b).componentResized(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void componentShown(ComponentEvent e) { ((ComponentListener) a).componentShown(e); ((ComponentListener) b).componentShown(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void componentAdded(ContainerEvent e) { ((ContainerListener) a).componentAdded(e); ((ContainerListener) b).componentAdded(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void componentRemoved(ContainerEvent e) { ((ContainerListener) a).componentRemoved(e); ((ContainerListener) b).componentRemoved(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void focusGained(FocusEvent e) { ((FocusListener) a).focusGained(e); ((FocusListener) b).focusGained(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void focusLost(FocusEvent e) { ((FocusListener) a).focusLost(e); ((FocusListener) b).focusLost(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void ancestorMoved(HierarchyEvent e) { ((HierarchyBoundsListener) a).ancestorMoved(e); ((HierarchyBoundsListener) b).ancestorMoved(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void ancestorResized(HierarchyEvent e) { ((HierarchyBoundsListener) a).ancestorResized(e); ((HierarchyBoundsListener) b).ancestorResized(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void hierarchyChanged(HierarchyEvent e) { ((HierarchyListener) a).hierarchyChanged(e); ((HierarchyListener) b).hierarchyChanged(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void caretPositionChanged(InputMethodEvent e) { ((InputMethodListener) a).caretPositionChanged(e); ((InputMethodListener) b).caretPositionChanged(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void inputMethodTextChanged(InputMethodEvent e) { ((InputMethodListener) a).inputMethodTextChanged(e); ((InputMethodListener) b).inputMethodTextChanged(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void itemStateChanged(ItemEvent e) { ((ItemListener) a).itemStateChanged(e); ((ItemListener) b).itemStateChanged(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void keyPressed(KeyEvent e) { ((KeyListener) a).keyPressed(e); ((KeyListener) b).keyPressed(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void keyReleased(KeyEvent e) { ((KeyListener) a).keyReleased(e); ((KeyListener) b).keyReleased(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void keyTyped(KeyEvent e) { ((KeyListener) a).keyTyped(e); ((KeyListener) b).keyTyped(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void mouseClicked(MouseEvent e) { ((MouseListener) a).mouseClicked(e); ((MouseListener) b).mouseClicked(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void mouseEntered(MouseEvent e) { ((MouseListener) a).mouseEntered(e); ((MouseListener) b).mouseEntered(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void mouseExited(MouseEvent e) { ((MouseListener) a).mouseExited(e); ((MouseListener) b).mouseExited(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void mousePressed(MouseEvent e) { ((MouseListener) a).mousePressed(e); ((MouseListener) b).mousePressed(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void mouseReleased(MouseEvent e) { ((MouseListener) a).mouseReleased(e); ((MouseListener) b).mouseReleased(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void mouseDragged(MouseEvent e) { ((MouseMotionListener) a).mouseDragged(e); ((MouseMotionListener) b).mouseDragged(e); } + /** + * Handles this event by dispatching it to the "a" and "b" listener + * instances. + * + * @param event The event to handle. + */ public void mouseMoved(MouseEvent e) { ((MouseMotionListener) a).mouseMoved(e); ((MouseMotionListener) b).mouseMoved(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void textValueChanged(TextEvent e) { ((TextListener) a).textValueChanged(e); ((TextListener) b).textValueChanged(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void windowActivated(WindowEvent e) { ((WindowListener) a).windowActivated(e); ((WindowListener) b).windowActivated(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void windowClosed(WindowEvent e) { ((WindowListener) a).windowClosed(e); ((WindowListener) b).windowClosed(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void windowClosing(WindowEvent e) { ((WindowListener) a).windowClosing(e); ((WindowListener) b).windowClosing(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void windowDeactivated(WindowEvent e) { ((WindowListener) a).windowDeactivated(e); ((WindowListener) b).windowDeactivated(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void windowDeiconified(WindowEvent e) { ((WindowListener) a).windowDeiconified(e); ((WindowListener) b).windowDeiconified(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void windowIconified(WindowEvent e) { ((WindowListener) a).windowIconified(e); ((WindowListener) b).windowIconified(e); } ! ! /** ! * Handles this event by dispatching it to the "a" and "b" listener ! * instances. ! * ! * @param event The event to handle. ! */ public void windowOpened(WindowEvent e) { ((WindowListener) a).windowOpened(e); ((WindowListener) b).windowOpened(e); } ! protected static void save(ObjectOutputStream s, String k, EventListener l) { ! throw new RuntimeException("Not Implemented"); } protected void saveInternal(ObjectOutputStream s, String k) { ! throw new RuntimeException("Not Implemented"); } } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/AWTException.java gcc-3.1/libjava/java/awt/AWTException.java *** gcc-3.0.4/libjava/java/awt/AWTException.java Tue Apr 4 19:56:20 2000 --- gcc-3.1/libjava/java/awt/AWTException.java Tue Jan 22 22:40:04 2002 *************** *** 1,27 **** ! /* Copyright (C) 2000 Free Software Foundation - This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.awt; /** ! * @author Tom Tromey ! * @date Tue Apr 4 2000 ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ ! public class AWTException extends Exception { ! public AWTException (String message) ! { ! super (message); ! } } --- 1,63 ---- ! /* AWTException.java -- Generic AWT exception ! Copyright (C) 1999 Free Software Foundation, Inc. ! ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; /** ! * This is a generic exception that indicates an error occurred in the ! * AWT system. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public class AWTException extends Exception { ! ! /** ! * Initializes a new instance of AWTException with the ! * specified detailed error message. ! * ! * @param message The detailed error message. ! */ ! public ! AWTException(String message) ! { ! super(message); } + + } // class AWTException + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/AWTPermission.java gcc-3.1/libjava/java/awt/AWTPermission.java *** gcc-3.0.4/libjava/java/awt/AWTPermission.java Sun Dec 3 06:34:54 2000 --- gcc-3.1/libjava/java/awt/AWTPermission.java Tue Jan 22 22:40:04 2002 *************** *** 1,12 **** // AWTPermission.java - AWT permissions ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ /** * @author Tom Tromey --- 1,41 ---- // AWTPermission.java - AWT permissions ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ /** * @author Tom Tromey diff -Nrc3pad gcc-3.0.4/libjava/java/awt/ActiveEvent.java gcc-3.1/libjava/java/awt/ActiveEvent.java *** gcc-3.0.4/libjava/java/awt/ActiveEvent.java Sun Apr 9 04:13:27 2000 --- gcc-3.1/libjava/java/awt/ActiveEvent.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; --- 1,39 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Adjustable.java gcc-3.1/libjava/java/awt/Adjustable.java *** gcc-3.0.4/libjava/java/awt/Adjustable.java Sun Jul 23 00:24:14 2000 --- gcc-3.1/libjava/java/awt/Adjustable.java Tue Jan 22 22:58:08 2002 *************** *** 1,39 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! import java.awt.event.*; /** ! * @author Tom Tromey ! * @date April 8, 2000 */ ! /* Status: Believed complete and correct to JDK 1.2. */ ! public interface Adjustable ! { ! public static final int HORIZONTAL = 0; ! public static final int VERTICAL = 1; - public void addAdjustmentListener (AdjustmentListener l); - public int getBlockIncrement (); - public int getMaximum (); - public int getMinimum (); - public int getOrientation (); - public int getUnitIncrement (); - public int getValue (); - public int getVisibleAmount (); - public void removeAdjustmentListener (AdjustmentListener l); - public void setBlockIncrement (int b); - public void setMaximum (int max); - public void setMinimum (int min); - public void setUnitIncrement (int u); - public void setValue (int v); - public void setVisibleAmount (int v); - } --- 1,223 ---- ! /* Adjustable.java -- Objects with a numeric adjustment scale. ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! ! import java.awt.event.AdjustmentListener; /** ! * This interface is for objects that take a numeric value that ! * can be adjusted within a bounded range. For example, a scroll bar. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public interface Adjustable ! { ! ! /* ! * Static Variables */ ! /** ! * Constant for a horizontal orientation ! */ ! public static final int HORIZONTAL = 0; ! /** ! * Constant for a vertical orientation ! */ ! public static final int VERTICAL = 1; ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Returns the current value of the object. ! * ! * @return The current value of the object. ! */ ! public abstract int ! getValue(); ! ! /*************************************************************************/ ! ! /** ! * Sets the current value of the object. ! * ! * @param value The current value of the object. ! */ ! public abstract void ! setValue(int value); ! ! /*************************************************************************/ ! ! /** ! * Returns the orientation of the object, either HORIZONTAL ! * or VERTICAL. ! * ! * @return The orientation of this object. ! */ ! public abstract int ! getOrientation(); ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum value this object can take. ! * ! * @return The minimum value this object can take. ! */ ! public abstract int ! getMinimum(); ! ! /*************************************************************************/ ! ! /** ! * Sets the minimum value this object can take to the specified value. ! * ! * @param minimum The new minimum value for this object. ! */ ! public abstract void ! setMinimum(int minimum); ! ! /*************************************************************************/ ! ! /** ! * Returns the maximum value this object can take. ! * ! * @return The maximum value this object can take. ! */ ! public abstract int ! getMaximum(); ! ! /*************************************************************************/ ! ! /** ! * Sets the maximum value this object can take to the specified value. ! * ! * @param maximum The new maximum value for this object. ! */ ! public abstract void ! setMaximum(int maximum); ! ! /*************************************************************************/ ! ! /** ! * Returns the increment value for incrementing by units. ! * ! * @return The unit increment value. ! */ ! public abstract int ! getUnitIncrement(); ! ! /*************************************************************************/ ! ! /** ! * Sets the increment value for incrementing by units to the specified value. ! * ! * @param increment The unit increment value. ! */ ! public abstract void ! setUnitIncrement(int increment); ! ! /*************************************************************************/ ! ! /** ! * Returns the increment value for incrementing by blocks. ! * ! * @return The block increment value. ! */ ! public abstract int ! getBlockIncrement(); ! ! /*************************************************************************/ ! ! /** ! * Sets the increment value for incrementing by blocks to the specified value. ! * ! * @param increment The block increment value. ! */ ! public abstract void ! setBlockIncrement(int increment); ! ! /*************************************************************************/ ! ! /** ! * Returns the length of the indicator for this object. ! * ! * @return The indicator length. ! */ ! public abstract int ! getVisibleAmount(); ! ! /*************************************************************************/ ! ! /** ! * Sets the length of the indicator for this object to the specified value. ! * ! * @param length The indicator length ! */ ! public abstract void ! setVisibleAmount(int length); ! ! /*************************************************************************/ ! ! /** ! * Adds a listener that will receive adjustment events for this object. ! * ! * @param listener The adjustment listener to add. ! */ ! public abstract void ! addAdjustmentListener(AdjustmentListener listener); ! ! /*************************************************************************/ ! ! /** ! * Removes an adjustment listener from this object. It will no longer ! * receive adjustment events. ! * ! * @param listener The adjustment listener to remove. ! */ ! public abstract void ! removeAdjustmentListener(AdjustmentListener listener); ! ! } // interface Adjustable diff -Nrc3pad gcc-3.0.4/libjava/java/awt/BorderLayout.java gcc-3.1/libjava/java/awt/BorderLayout.java *** gcc-3.0.4/libjava/java/awt/BorderLayout.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/BorderLayout.java Thu Jan 24 06:39:29 2002 *************** *** 1,174 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; public class BorderLayout implements LayoutManager2, java.io.Serializable { - public static final String NORTH = "North", - SOUTH = "South", - EAST = "East", - WEST = "West", - CENTER = "Center"; - - // FIXME: use these too - public static final String BEFORE_FIRST_LINE = "First", - AFTER_LAST_LINE = "Last", - BEFORE_LINE_BEGINS = "Before", - AFTER_LINE_ENDS = "After"; ! // FIXME: check serialization of fields ! int hgap; ! int vgap; ! Component north, south, east, west, center; ! public BorderLayout () ! { ! this (0, 0); ! } ! public BorderLayout (int hgap, int vgap) ! { ! this.hgap = hgap; ! this.vgap = vgap; ! } ! public int getHgap() ! { ! return hgap; ! } ! public void setHgap(int hgap) ! { ! this.hgap = hgap; ! } ! public int getVgap() ! { ! return vgap; ! } ! public void setVgap(int vgap) ! { ! this.vgap = vgap; ! } ! ! public void addLayoutComponent(Component comp, Object constraints) ! { ! if ((constraints == null) || CENTER.equals(constraints)) ! { ! center = comp; ! } ! else if (NORTH.equals(constraints)) ! { ! north = comp; ! } ! else if (SOUTH.equals(constraints)) ! { ! south = comp; ! } ! else if (EAST.equals(constraints)) ! { ! east = comp; ! } ! else if (WEST.equals(constraints)) ! { ! west = comp; ! } ! } ! ! public void addLayoutComponent(String name, Component comp) ! { ! addLayoutComponent(comp, name); ! } ! public void removeLayoutComponent(Component comp) ! { ! if (center == comp) ! { ! center = null; ! } ! else if (north == comp) ! { ! north = null; ! } ! else if (south == comp) ! { ! south = null; ! } ! else if (east == comp) ! { ! east = null; ! } ! else if (west == comp) ! { ! west = null; ! } ! } ! public Dimension minimumLayoutSize(Container target) ! { ! return calcSize(getMinimumSize(center), ! getMinimumSize(north), ! getMinimumSize(south), ! getMinimumSize(east), ! getMinimumSize(west), ! target); ! } ! public Dimension preferredLayoutSize(Container target) ! { ! return calcSize(getPreferredSize(center), ! getPreferredSize(north), ! getPreferredSize(south), ! getPreferredSize(east), ! getPreferredSize(west), ! target); ! } ! ! /** ! * Completely disregards the requested maximum sizes of the ! * components, and states that the container has no upper size ! * limit. ! * ! * @return a dimension of width and height Integer.MAX_VALUE. ! */ ! public Dimension maximumLayoutSize(Container target) ! { ! return (Dimension) DIM_MAX.clone(); ! } ! public float getLayoutAlignmentX(Container parent) ! { ! return Component.CENTER_ALIGNMENT; ! } ! public float getLayoutAlignmentY(Container parent) ! { ! return Component.CENTER_ALIGNMENT; ! } ! ! public void invalidateLayout(Container target) ! { ! // TODO... implement caching? ! } - public void layoutContainer(Container target) - { - Insets i = target.getInsets(); - Dimension c = getPreferredSize(center); - Dimension n = getPreferredSize(north); - Dimension s = getPreferredSize(south); - Dimension e = getPreferredSize(east); - Dimension w = getPreferredSize(west); - Dimension t = target.getSize(); - /* <-> hgap <-> hgap +----------------------------+ } --- 1,492 ---- ! /* BorderLayout.java -- A layout manager class ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + /** + * This class implements a layout manager that positions components + * in certain sectors of the parent container. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Rolf W. Rasmussen + */ public class BorderLayout implements LayoutManager2, java.io.Serializable { + /* + * Static Variables + */ ! /** ! * Constant indicating the top of the container ! */ ! public static final String NORTH = "North"; ! /** ! * Constant indicating the bottom of the container ! */ ! public static final String SOUTH = "South"; ! /** ! * Constant indicating the right side of the container ! */ ! public static final String EAST = "East"; ! /** ! * Constant indicating the left side of the container ! */ ! public static final String WEST = "West"; ! /** ! * Constant indicating the center of the container ! */ ! public static final String CENTER = "Center"; ! /** ! * Constant indicating the position just after the last line of the ! * layout. ! */ ! public static final String AFTER_LAST_LINE = "Last"; ! /** ! * Constant indicating the position just after the end of the line. ! */ ! public static final String AFTER_LINE_ENDS = "After"; ! /** ! * Constant indicating the position just before the first line of the ! * layout. ! */ ! public static final String BEFORE_FIRST_LINE = "First"; ! /** ! * Constant indicating the position at the beginning of the line. ! */ ! public static final String BEFORE_LINE_BEGINS = "Before"; ! // Serialization constant ! private static final long serialVersionUID = -8658291919501921765L; ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! ! /** ! * @serial ! */ ! private Component north; ! ! /** ! * @serial ! */ ! private Component south; ! ! /** ! * @serial ! */ ! private Component east; ! ! /** ! * @serial ! */ ! private Component west; ! ! /** ! * @serial ! */ ! private Component center; ! ! /** ! * @serial ! */ ! private Component firstLine; ! ! /** ! * @serial ! */ ! private Component lastLine; ! ! /** ! * @serial ! */ ! private Component firstItem; ! ! /** ! * @serial ! */ ! private Component lastItem; ! ! /** ! * @serial The horizontal gap between components ! */ ! private int hgap; ! ! /** ! * @serial The vertical gap between components ! */ ! private int vgap; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of BorderLayout with no ! * horiztonal or vertical gaps between components. ! */ ! public ! BorderLayout() ! { ! this(0,0); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of BorderLayout with the ! * specified horiztonal and vertical gaps between components. ! * ! * @param hgap The horizontal gap between components. ! * @param vgap The vertical gap between components. ! */ ! public ! BorderLayout(int hgap, int vgap) ! { ! this.hgap = hgap; ! this.vgap = vgap; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * Returns the horitzontal gap value. ! * ! * @return The horitzontal gap value. ! */ ! public int ! getHgap() ! { ! return(hgap); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the horizontal gap to the specified value. ! * ! * @param hgap The new horizontal gap. ! */ ! public void ! setHgap(int hgap) ! { ! this.hgap = hgap; ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the vertical gap value. ! * ! * @return The vertical gap value. ! */ ! public int ! getVgap() ! { ! return(vgap); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the vertical gap to the specified value. ! * ! * @param vgap The new vertical gap value. ! */ ! public void ! setVgap(int vgap) ! { ! this.vgap = vgap; ! } ! ! /*************************************************************************/ ! ! /** ! * Adds a component to the layout in the specified constraint position, ! * which must be one of the string constants defined in this class. ! * ! * @param component The component to add. ! * @param constraints The constraint string. ! * ! * @exception IllegalArgumentException If the constraint object is not ! * a string, or is not one of the specified constants in this class. ! */ ! public void ! addLayoutComponent(Component component, Object constraints) ! { ! if (constraints != null && ! (constraints instanceof String)) ! throw new IllegalArgumentException("Constraint must be a string"); ! ! String str = (String)constraints; ! ! if (str == null || str.equals(CENTER)) ! center = component; ! else if (str.equals(NORTH)) ! north = component; ! else if (str.equals(SOUTH)) ! south = component; ! else if (str.equals(EAST)) ! east = component; ! else if (str.equals(WEST)) ! west = component; ! else if (str.equals(BEFORE_FIRST_LINE)) ! firstLine = component; ! else if (str.equals(AFTER_LAST_LINE)) ! lastLine = component; ! else if (str.equals(BEFORE_LINE_BEGINS)) ! firstItem = component; ! else if (str.equals(AFTER_LINE_ENDS)) ! lastItem = component; ! else ! throw new IllegalArgumentException("Constraint value not valid: " + str); ! } ! ! /*************************************************************************/ ! ! /** ! * Adds a component to the layout in the specified constraint position, ! * which must be one of the string constants defined in this class. ! * ! * @param constraints The constraint string. ! * @param component The component to add. ! * ! * @exception IllegalArgumentException If the constraint object is not ! * one of the specified constants in this class. ! * ! * @deprecated This method is deprecated in favor of ! * addLayoutComponent(Component, Object). ! */ ! public void ! addLayoutComponent(String constraints, Component component) ! { ! addLayoutComponent(component, constraints); ! } ! ! /*************************************************************************/ ! ! /** ! * Removes the specified component from the layout. ! * ! * @param component The component to remove from the layout. ! */ ! public void ! removeLayoutComponent(Component component) ! { ! if (north == component) ! north = null; ! if (south == component) ! south = null; ! if (east == component) ! east = null; ! if (west == component) ! west = null; ! if (center == component) ! center = null; ! if (firstItem == component) ! firstItem = null; ! if (lastItem == component) ! lastItem = null; ! if (firstLine == component) ! firstLine = null; ! if (lastLine == component) ! lastLine = null; ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum size of the specified container using this layout. ! * ! * @param target The container to calculate the minimum size for. ! * ! * @return The minimum size of the container ! */ ! public Dimension ! minimumLayoutSize(Container target) ! { ! return calcSize(target, MIN); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the preferred size of the specified container using this layout. ! * ! * @param target The container to calculate the preferred size for. ! * ! * @return The preferred size of the container ! */ ! public Dimension ! preferredLayoutSize(Container target) ! { ! return calcSize(target, PREF); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the maximum size of the specified container using this layout. ! * ! * @param target The container to calculate the maximum size for. ! * ! * @return The maximum size of the container ! */ ! public Dimension ! maximumLayoutSize(Container target) ! { ! return calcSize(target, MAX); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the X axis alignment, which is a float indicating ! * where along the X axis this container wishs to position its layout. ! * 0 indicates align to the left, 1 indicates align to the right, and 0.5 ! * indicates align to the center. ! * ! * @param parent The parent container. ! * ! * @return The X alignment value. ! */ ! public float ! getLayoutAlignmentX(Container parent) ! { ! return(parent.getAlignmentX()); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the Y axis alignment, which is a float indicating ! * where along the Y axis this container wishs to position its layout. ! * 0 indicates align to the top, 1 indicates align to the bottom, and 0.5 ! * indicates align to the center. ! * ! * @param parent The parent container. ! * ! * @return The Y alignment value. ! */ ! public float ! getLayoutAlignmentY(Container parent) ! { ! return(parent.getAlignmentY()); ! } ! ! /*************************************************************************/ ! ! /** ! * Instructs this object to discard any layout information it might ! * have cached. ! * ! * @param parent The parent container. ! */ ! public void ! invalidateLayout(Container parent) ! { ! } ! ! /*************************************************************************/ ! ! /** ! * Lays out the specified container according to the constraints ! * in this object. ! * ! * @param target The container to lay out. ! */ ! public void ! layoutContainer(Container target) ! { ! Insets i = target.getInsets(); ! ! ComponentOrientation orient = target.getComponentOrientation (); ! boolean left_to_right = orient.isLeftToRight (); ! ! Component my_north = north; ! Component my_east = east; ! Component my_south = south; ! Component my_west = west; ! ! // Note that we currently don't handle vertical layouts. Neither ! // does JDK 1.3. ! if (firstLine != null) ! my_north = firstLine; ! if (lastLine != null) ! my_south = lastLine; ! if (firstItem != null) ! { ! if (left_to_right) ! my_west = firstItem; ! else ! my_east = firstItem; ! } ! if (lastItem != null) ! { ! if (left_to_right) ! my_east = lastItem; ! else ! my_west = lastItem; ! } ! ! Dimension c = calcCompSize(center, PREF); ! Dimension n = calcCompSize(my_north, PREF); ! Dimension s = calcCompSize(my_south, PREF); ! Dimension e = calcCompSize(my_east, PREF); ! Dimension w = calcCompSize(my_west, PREF); ! Dimension t = target.getSize(); /* <-> hgap <-> hgap +----------------------------+ } *************** public class BorderLayout implements Lay *** 190,254 **** i.left i.right */ ! int x1 = i.left; ! int x2 = x1 + w.width + hgap; ! int x3 = t.width - i.right - e.width; ! int ww = t.width - i.right - i.left; ! int y1 = i.top; ! int y2 = y1 + n.height + vgap; ! int y3 = t.height - i.bottom - s.height; ! int hh = y3-y2-vgap; ! setBounds(center, x2, y2, x3-x2-hgap, hh); ! setBounds(north, x1, y1, ww, n.height); ! setBounds(south, x1, y3, ww, s.height); ! setBounds(west, x1, y2, w.width, hh); ! setBounds(east, x3, y2, e.width, hh); ! } ! ! public String toString() ! { ! return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + "]"; ! } ! // Support: ! static final Dimension DIM_0 = new Dimension(0, 0); ! static final Dimension DIM_MAX = new Dimension(Integer.MAX_VALUE, ! Integer.MAX_VALUE); ! void setBounds(Component comp, int x, int y, int w, int h) ! { ! if (comp == null) ! return; ! comp.setBounds(x, y, w, h); ! } ! Dimension getMinimumSize(Component comp) ! { ! if (comp == null) ! return DIM_0; return comp.getMinimumSize(); ! } ! Dimension getPreferredSize(Component comp) ! { ! if (comp == null) ! return DIM_0; ! return comp.getPreferredSize(); ! } ! Dimension calcSize(Dimension c, Dimension n, Dimension s, ! Dimension e, Dimension w, Container target) ! { ! Insets i = target.getInsets(); ! ! return new Dimension(c.width + e.width + w.width + hgap*2 + ! i.left + i.right, ! c.height + n.height + s.height + vgap*2 + ! i.top + i.bottom ! ); ! } } --- 508,626 ---- i.left i.right */ ! int x1 = i.left; ! int x2 = x1 + w.width + hgap; ! int x3 = t.width - i.right - e.width; ! int ww = t.width - i.right - i.left; ! int y1 = i.top; ! int y2 = y1 + n.height + vgap; ! int y3 = t.height - i.bottom - s.height; ! int hh = y3-y2-vgap; ! setBounds(center, x2, y2, x3-x2-hgap, hh); ! setBounds(my_north, x1, y1, ww, n.height); ! setBounds(my_south, x1, y3, ww, s.height); ! setBounds(my_west, x1, y2, w.width, hh); ! setBounds(my_east, x3, y2, e.width, hh); ! } + /*************************************************************************/ ! /** ! * Returns a string representation of this layout manager. ! * ! * @return A string representation of this object. ! */ ! public String ! toString() ! { ! return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + "]"; ! } ! private void ! setBounds(Component comp, int x, int y, int w, int h) ! { ! if (comp == null) ! return; ! comp.setBounds(x, y, w, h); ! } ! // Some constants for use with calcSize(). ! private static final int MIN = 0; ! private static final int MAX = 1; ! private static final int PREF = 2; ! private Dimension ! calcCompSize(Component comp, int what) ! { ! if (comp == null) ! return new Dimension(0, 0); ! if (what == MIN) return comp.getMinimumSize(); ! else if (what == MAX) ! return comp.getMaximumSize(); ! return comp.getPreferredSize(); ! } ! // This is a helper function used to compute the various sizes for ! // this layout. ! private Dimension ! calcSize(Container target, int what) ! { ! Insets ins = target.getInsets(); ! ComponentOrientation orient = target.getComponentOrientation (); ! boolean left_to_right = orient.isLeftToRight (); ! ! Component my_north = north; ! Component my_east = east; ! Component my_south = south; ! Component my_west = west; ! ! // Note that we currently don't handle vertical layouts. Neither ! // does JDK 1.3. ! if (firstLine != null) ! my_north = firstLine; ! if (lastLine != null) ! my_south = lastLine; ! if (firstItem != null) ! { ! if (left_to_right) ! my_west = firstItem; ! else ! my_east = firstItem; ! } ! if (lastItem != null) ! { ! if (left_to_right) ! my_east = lastItem; ! else ! my_west = lastItem; ! } ! ! Dimension ndim = calcCompSize(my_north, what); ! Dimension sdim = calcCompSize(my_south, what); ! Dimension edim = calcCompSize(my_east, what); ! Dimension wdim = calcCompSize(my_west, what); ! Dimension cdim = calcCompSize(center, what); ! ! int width = edim.width + cdim.width + wdim.width + (hgap * 2); ! if (ndim.width > width) ! width = ndim.width; ! if (sdim.width > width) ! width = sdim.width; ! ! width += (ins.left + ins.right); ! ! int height = edim.height; ! if (cdim.height > height) ! height = cdim.height; ! if (wdim.height > height) ! height = wdim.height; ! ! height += (ndim.height + sdim.height + (vgap * 2) + ins.top + ins.bottom); ! ! return(new Dimension(width, height)); } + } // class BorderLayout diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Button.java gcc-3.1/libjava/java/awt/Button.java *** gcc-3.0.4/libjava/java/awt/Button.java Mon Dec 18 22:17:25 2000 --- gcc-3.1/libjava/java/awt/Button.java Tue Jan 22 22:40:04 2002 *************** *** 1,116 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; import java.awt.peer.ButtonPeer; import java.awt.peer.ComponentPeer; - import java.awt.event.ActionListener; - import java.awt.event.ActionEvent; import java.util.EventListener; /** ! * @author Tom Tromey ! * @date July 30, 2000 */ ! public class Button extends Component { ! public Button () ! { ! this (null); ! } ! public Button (String label) ! { ! this.label = label; ! } ! public void addActionListener (ActionListener l) ! { ! actionListener = AWTEventMulticaster.add (actionListener, l); ! } ! public void addNotify () ! { ! if (peer == null) ! peer = getToolkit ().createButton (this); ! super.addNotify(); ! } ! public String getActionCommand () ! { ! return actionCommand; ! } ! public String getLabel () ! { ! return label; ! } ! protected String paramString () ! { ! return "Button[" + label + "]"; ! } ! void dispatchEventImpl(AWTEvent e) ! { ! super.dispatchEventImpl(e); ! ! if (e.id <= ActionEvent.ACTION_LAST ! && e.id >= ActionEvent.ACTION_FIRST ! && (actionListener != null ! || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0)) ! processEvent(e); ! } ! protected void processActionEvent (ActionEvent e) ! { ! if (actionListener != null) ! actionListener.actionPerformed (e); ! } ! protected void processEvent (AWTEvent e) ! { ! if (e instanceof ActionEvent) ! processActionEvent ((ActionEvent) e); ! else ! super.processEvent (e); ! } ! public void removeActionListener (ActionListener l) ! { ! actionListener = AWTEventMulticaster.remove (actionListener, l); ! } ! public EventListener[] getListeners(Class listenerType) ! { ! if (listenerType == ActionListener.class) ! return getListenersImpl(listenerType, actionListener); ! return super.getListeners(listenerType); ! } ! public void setActionCommand (String command) ! { ! this.actionCommand = (command == null) ? label : command; ! } ! public void setLabel (String label) ! { ! this.label = label; ! if (peer != null) ! { ! ButtonPeer bp = (ButtonPeer) peer; ! bp.setLabel (label); ! } ! } ! String label; ! String actionCommand; ! transient ActionListener actionListener; } --- 1,288 ---- ! /* Button.java -- AWT button widget ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + + import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; import java.awt.peer.ButtonPeer; import java.awt.peer.ComponentPeer; import java.util.EventListener; /** ! * This class provides a button widget for the AWT. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class Button extends Component implements java.io.Serializable ! { ! ! /* ! * Static Variables */ ! // FIXME: Need readObject/writeObject for serialization ! ! // Serialization version constant ! private static final long serialVersionUID = -8774683716313001058L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The action command name for this button. ! */ ! private String actionCommand; ! ! /** ! * @serial The label for this button. ! */ ! private String label; ! ! // List of ActionListeners for this class. ! private transient ActionListener action_listeners; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Button with no label. ! */ ! public ! Button() { ! this(null); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Button with the specified ! * label. The action command name is also initialized to this value. ! * ! * @param label The label to display on the button. ! */ ! public ! Button(String label) ! { ! this.label = label; ! actionCommand = label; ! } ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * Returns the label for this button. ! * ! * @return The label for this button. ! */ ! public String ! getLabel() ! { ! return(label); ! } ! /*************************************************************************/ ! /** ! * Sets the label for this button to the specified value. ! * ! * @param label The new label for this button. ! */ ! public synchronized void ! setLabel(String label) ! { ! this.label = label; ! if (peer != null) ! { ! ButtonPeer bp = (ButtonPeer) peer; ! bp.setLabel (label); ! } ! } ! /*************************************************************************/ ! /** ! * Returns the action command name for this button. ! * ! * @return The action command name for this button. ! */ ! public String ! getActionCommand() ! { ! return(actionCommand); ! } ! /*************************************************************************/ ! /** ! * Sets the action command name for this button to the specified value. ! * ! * @param actionCommand The new action command name. ! */ ! public void ! setActionCommand(String actionCommand) ! { ! this.actionCommand = actionCommand == null ? label : actionCommand; ! } ! /*************************************************************************/ ! /** ! * Adds a new entry to the list of listeners that will receive ! * action events from this button. ! * ! * @param listener The listener to add. ! */ ! public synchronized void ! addActionListener(ActionListener listener) ! { ! action_listeners = AWTEventMulticaster.add(action_listeners, listener); ! } ! /*************************************************************************/ ! /** ! * Removes the specified listener from the list of listeners that will ! * receive action events from this button. ! * ! * @param listener The listener to remove. ! */ ! public synchronized void ! removeActionListener(ActionListener listener) ! { ! action_listeners = AWTEventMulticaster.remove(action_listeners, listener); } + + public EventListener[] + getListeners(Class listenerType) + { + if (listenerType == ActionListener.class) + return getListenersImpl(listenerType, action_listeners); + return super.getListeners(listenerType); + } + + /*************************************************************************/ + + /** + * Notifies this button that it should create its native peer object. + */ + public void + addNotify() + { + if (peer == null) + peer = getToolkit ().createButton (this); + super.addNotify(); + } + + /*************************************************************************/ + + /** + * Processes an event for this button. If the specified event is an + * instance of ActionEvent, then the + * processActionEvent() method is called to dispatch it + * to any registered listeners. Otherwise, the superclass method + * will be invoked. Note that this method will not be called at all + * unless ActionEvent's are enabled. This will be done + * implicitly if any listeners are added. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof ActionEvent) + processActionEvent((ActionEvent)event); + else + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * This method dispatches an action event for this button to any + * registered listeners. + * + * @param event The event to process. + */ + protected void + processActionEvent(ActionEvent event) + { + if (action_listeners != null) + action_listeners.actionPerformed(event); + } + + void + dispatchEventImpl(AWTEvent e) + { + super.dispatchEventImpl(e); + + if (e.id <= ActionEvent.ACTION_LAST + && e.id >= ActionEvent.ACTION_FIRST + && (action_listeners != null + || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0)) + processEvent(e); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this button. + * + * @return A debugging string for this button. + */ + protected String + paramString() + { + return ("label=" + getLabel() + ",actionCommand=" + getActionCommand() + + "," + super.paramString()); + } + + } // class Button + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Canvas.java gcc-3.1/libjava/java/awt/Canvas.java *** gcc-3.0.4/libjava/java/awt/Canvas.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/Canvas.java Tue Jan 22 22:40:04 2002 *************** *** 1,21 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; import java.awt.peer.ComponentPeer; ! public class Canvas extends Component { transient GraphicsConfiguration graphicsConfiguration; ! public Canvas() { } ! public Canvas(GraphicsConfiguration graphicsConfiguration) { this.graphicsConfiguration = graphicsConfiguration; --- 1,53 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; import java.awt.peer.ComponentPeer; ! public class Canvas extends Component implements java.io.Serializable { transient GraphicsConfiguration graphicsConfiguration; ! ! /** ! * Initializes a new instance of Canvas. ! */ public Canvas() { } ! public Canvas(GraphicsConfiguration graphicsConfiguration) { this.graphicsConfiguration = graphicsConfiguration; *************** public class Canvas extends Component *** 28,44 **** return super.getGraphicsConfigurationImpl(); } public void addNotify() { if (peer == null) ! { ! peer = (ComponentPeer) getToolkit().createCanvas(this); ! } super.addNotify(); } ! /** Override this to create components with custom painting. ! Defaults to filling the component with the background color. */ public void paint(Graphics gfx) { /* This implementation doesn't make much sense since the filling --- 60,80 ---- return super.getGraphicsConfigurationImpl(); } + /** + * Creates the native peer for this object. + */ public void addNotify() { if (peer == null) ! peer = (ComponentPeer) getToolkit().createCanvas(this); super.addNotify(); } ! /** ! * Repaints the canvas window. This method should be overriden by ! * a subclass to do something useful, as this method simply paints ! * the window with the background color. ! */ public void paint(Graphics gfx) { /* This implementation doesn't make much sense since the filling *************** public class Canvas extends Component *** 49,52 **** --- 85,91 ---- Dimension size = getSize(); gfx.fillRect(0, 0, size.width, size.height); } + + // Serialization constant + private static final long serialVersionUID = -2284879212465893870L; } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/CardLayout.java gcc-3.1/libjava/java/awt/CardLayout.java *** gcc-3.0.4/libjava/java/awt/CardLayout.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/CardLayout.java Tue Jan 22 22:40:04 2002 *************** *** 1,12 **** // CardLayout.java - Card-based layout engine ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,41 ---- // CardLayout.java - Card-based layout engine ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** import java.io.Serializable; *** 19,38 **** * time. This class includes methods for changing which card is * shown. * - * @version 0.0 * @author Tom Tromey ! * @date December 2, 2000 */ public class CardLayout implements LayoutManager2, Serializable { ! /** Create a new CardLayout object with both gaps zero. */ public CardLayout () { this (0, 0); } ! /** Create a new CardLayout object with the specified horizontal and ! * vertical gaps. * @param hgap The horizontal gap * @param vgap The vertical gap */ --- 48,70 ---- * time. This class includes methods for changing which card is * shown. * * @author Tom Tromey ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public class CardLayout implements LayoutManager2, Serializable { ! /** ! * Initializes a new instance of CardLayout with horizontal ! * and vertical gaps of 0. ! */ public CardLayout () { this (0, 0); } ! /** ! * Create a new CardLayout object with the specified ! * horizontal and vertical gaps. * @param hgap The horizontal gap * @param vgap The vertical gap */ *************** public class CardLayout implements Layou *** 40,46 **** { this.hgap = hgap; this.vgap = vgap; ! this.map = new Hashtable (); } /** Add a new component to the layout. The constraint must be a --- 72,78 ---- { this.hgap = hgap; this.vgap = vgap; ! this.tab = new Hashtable (); } /** Add a new component to the layout. The constraint must be a *************** public class CardLayout implements Layou *** 48,68 **** * later be used to refer to the particular component. * @param comp The component to add * @param constraints The name by which the component can later be called ! * @exception IllegalArgumentException If `constraints' is not a string */ public void addLayoutComponent (Component comp, Object constraints) { if (! (constraints instanceof String)) throw new IllegalArgumentException ("Object " + constraints + " is not a string"); ! map.put (constraints, comp); } /** Add a new component to the layout. The name can be used later * to refer to the component. * @param name The name by which the component can later be called * @param comp The component to add ! * @deprecated */ public void addLayoutComponent (String name, Component comp) { --- 80,102 ---- * later be used to refer to the particular component. * @param comp The component to add * @param constraints The name by which the component can later be called ! * @exception IllegalArgumentException If `constraints' is not a ! * String */ public void addLayoutComponent (Component comp, Object constraints) { if (! (constraints instanceof String)) throw new IllegalArgumentException ("Object " + constraints + " is not a string"); ! tab.put (constraints, comp); } /** Add a new component to the layout. The name can be used later * to refer to the component. * @param name The name by which the component can later be called * @param comp The component to add ! * @deprecated This method is deprecated in favor of ! * addLayoutComponent(Component, Object). */ public void addLayoutComponent (String name, Component comp) { *************** public class CardLayout implements Layou *** 121,130 **** gotoComponent (parent, LAST, null); } ! /** Lay out the container's components based on the current ! * settings. ! * @param parent The parent container ! */ public void layoutContainer (Container parent) { int width = parent.width; --- 155,166 ---- gotoComponent (parent, LAST, null); } ! /** ! * Lays out the container. This is done by resizing the child components ! * to be the same size as the parent, less insets and gaps. ! * ! * @param parent The parent container. ! */ public void layoutContainer (Container parent) { int width = parent.width; *************** public class CardLayout implements Layou *** 135,151 **** int num = parent.ncomponents; Component[] comps = parent.component; for (int i = 0; i < num; ++i) ! { ! if (comps[i].isVisible ()) ! { ! // Only resize the one we care about. ! comps[i].setBounds (hgap + ins.left, vgap + ins.top, ! width - 2 * hgap - ins.left - ins.right, ! height - 2 * vgap - ins.top - ins.bottom); ! break; ! } ! } } /** Get the maximum layout size of the container. --- 171,183 ---- int num = parent.ncomponents; Component[] comps = parent.component; + int x = ins.left + hgap; + int y = ins.top + vgap; + width = width - 2 * hgap - ins.left - ins.right; + height = height - 2 * vgap - ins.top - ins.bottom; + for (int i = 0; i < num; ++i) ! comps[i].setBounds (x, y, width, height); } /** Get the maximum layout size of the container. *************** public class CardLayout implements Layou *** 166,172 **** return getSize (target, MIN); } ! /** Cause the next component in the container to be displayed. * @param parent The parent container */ public void next (Container parent) --- 198,206 ---- return getSize (target, MIN); } ! /** Cause the next component in the container to be displayed. If ! * this current card is the last one in the deck, the first ! * component is displayed. * @param parent The parent container */ public void next (Container parent) *************** public class CardLayout implements Layou *** 183,188 **** --- 217,224 ---- } /** Cause the previous component in the container to be displayed. + * If this current card is the first one in the deck, the last + * component is displayed. * @param parent The parent container */ public void previous (Container parent) *************** public class CardLayout implements Layou *** 195,207 **** */ public void removeLayoutComponent (Component comp) { ! Enumeration e = map.keys (); while (e.hasMoreElements ()) { Object key = e.nextElement (); ! if (map.get (key) == comp) { ! map.remove (key); break; } } --- 231,243 ---- */ public void removeLayoutComponent (Component comp) { ! Enumeration e = tab.keys (); while (e.hasMoreElements ()) { Object key = e.nextElement (); ! if (tab.get (key) == comp) { ! tab.remove (key); break; } } *************** public class CardLayout implements Layou *** 230,240 **** */ public void show (Container parent, String name) { ! Object target = map.get (name); if (target != null) gotoComponent (parent, NONE, (Component) target); } public String toString () { return getClass ().getName () + "[" + hgap + "," + vgap + "]"; --- 266,281 ---- */ public void show (Container parent, String name) { ! Object target = tab.get (name); if (target != null) gotoComponent (parent, NONE, (Component) target); } + /** + * Returns a string representation of this layout manager. + * + * @return A string representation of this object. + */ public String toString () { return getClass ().getName () + "[" + hgap + "," + vgap + "]"; *************** public class CardLayout implements Layou *** 244,250 **** private void gotoComponent (Container parent, int what, Component target) { ! int num = parent.getComponentCount (); // This is more efficient than calling getComponents(). Component[] comps = parent.component; int choice = -1; --- 285,291 ---- private void gotoComponent (Container parent, int what, Component target) { ! int num = parent.ncomponents; // This is more efficient than calling getComponents(). Component[] comps = parent.component; int choice = -1; *************** public class CardLayout implements Layou *** 252,258 **** if (what == FIRST) choice = 0; else if (what == LAST) ! choice = num; else if (what >= 0) choice = what; --- 293,299 ---- if (what == FIRST) choice = 0; else if (what == LAST) ! choice = num - 1; else if (what >= 0) choice = what; *************** public class CardLayout implements Layou *** 272,291 **** { choice = i + 1; if (choice == num) ! choice = num - 1; } else if (what == PREV) { choice = i - 1; if (choice < 0) ! choice = 0; } ! else { // Do nothing if we're already looking at the right // component. ! if (choice == i) ! return; } comps[i].setVisible (false); --- 313,331 ---- { choice = i + 1; if (choice == num) ! choice = 0; } else if (what == PREV) { choice = i - 1; if (choice < 0) ! choice = num - 1; } ! else if (choice == i) { // Do nothing if we're already looking at the right // component. ! return; } comps[i].setVisible (false); *************** public class CardLayout implements Layou *** 294,300 **** } } ! comps[choice].setVisible (true); } // Compute the size according to WHAT. --- 334,341 ---- } } ! if (choice >= 0 && choice < num) ! comps[choice].setVisible (true); } // Compute the size according to WHAT. *************** public class CardLayout implements Layou *** 331,342 **** return new Dimension (w, h); } ! // The gaps. private int hgap; private int vgap; ! // This hashtable maps a name to a component. ! private Hashtable map; // These constants are used by the private gotoComponent method. private int FIRST = 0; --- 372,391 ---- return new Dimension (w, h); } ! /** ! * @serial Horizontal gap value. ! */ private int hgap; + + /** + * @serial Vertical gap value. + */ private int vgap; ! /** ! * @serial Table of named components. ! */ ! private Hashtable tab; // These constants are used by the private gotoComponent method. private int FIRST = 0; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Checkbox.java gcc-3.1/libjava/java/awt/Checkbox.java *** gcc-3.0.4/libjava/java/awt/Checkbox.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/Checkbox.java Tue Jan 22 22:40:04 2002 *************** *** 1,185 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! import java.awt.event.*; import java.awt.peer.CheckboxPeer; ! /** This class implements a component which has an on/off state. Two * or more Checkboxes can be grouped by a CheckboxGroup. * @author Tom Tromey - * @date December 25, 2000 */ ! public class Checkbox extends Component implements ItemSelectable { - /** Create a new checkbox. - * @param label The checkbox label. A null value is the same as ""; - * this is the default. - * @param state The initial check state; defaults to false. - * @param group The CheckboxGroup. Defaults to null. - */ - public Checkbox () - { - this (null, null, false); - } ! public Checkbox (String label) ! { ! this (label, null, false); ! } ! public Checkbox (String label, boolean state) ! { ! this (label, null, state); ! } ! public Checkbox (String label, boolean state, CheckboxGroup group) ! { ! this (label, group, state); ! } ! public Checkbox (String label, CheckboxGroup group, boolean state) ! { ! this.label = label; ! this.group = group; ! this.state = state; ! } ! /** Add a listener for item events. ! * @param listener The listener to add. ! */ ! public synchronized void addItemListener (ItemListener listener) ! { ! listeners = AWTEventMulticaster.add (listeners, listener); ! } ! /** This creates the component's peer. */ ! public void addNotify () ! { ! if (peer == null) ! peer = getToolkit ().createCheckbox (this); ! } ! /** Returns the current CheckboxGroup associated with this ! * Checkbox. */ ! public CheckboxGroup getCheckboxGroup () ! { ! return group; ! } ! /** Returns the current label; might be null. */ ! public String getLabel () ! { ! return label; ! } ! /** Returns this checkbox's label if this checkbox is selected. */ ! public Object[] getSelectedObjects () ! { ! Object[] r; ! if (state) ! { ! r = new Object[1]; ! r[0] = label; ! } ! else ! r = new Object[0]; ! return r; ! } ! /** Returns the current state of this checkbox. */ ! public boolean getState () ! { ! return state; ! } ! /** Generates a String representation of this Checkbox's state. */ ! protected String paramString () ! { ! return ("Checkbox[" ! + "state=" + state + "," ! + "label=" + label + "," ! + "group=" + group + "]"); ! } ! /** Process an event for this Checkbox. ! * @param event The event the process. ! */ ! protected void processEvent (AWTEvent event) ! { ! if (event instanceof ItemEvent) ! processItemEvent ((ItemEvent) event); ! else ! super.processEvent (event); ! } ! /** Process an item event for this Checkbox. ! * @param event The ItemEvent to process ! */ ! protected void processItemEvent (ItemEvent event) ! { ! if (listeners != null) ! listeners.itemStateChanged (event); ! } ! /** Remove an item listener. ! * @param listener Item listener to remove. ! */ ! public synchronized void removeItemListener (ItemListener listener) ! { ! listeners = AWTEventMulticaster.remove (listeners, listener); ! } ! /** Set this checkbox's group. ! * @param group The new group. null means remove the Checkbox from ! * its group. ! */ ! public void setCheckboxGroup (CheckboxGroup group) ! { ! this.group = group; ! if (peer != null) ! { ! CheckboxPeer cp = (CheckboxPeer) peer; ! cp.setCheckboxGroup (group); ! } ! } ! /** Set the checkbox's label. ! * @param label The new label ! */ ! public synchronized void setLabel (String label) ! { ! this.label = label; ! if (peer != null) ! { ! CheckboxPeer cp = (CheckboxPeer) peer; ! // FIXME: unclear what to do here; we err on the side of ! // caution. ! cp.setLabel (label == null ? "" : label); ! } ! } ! /** Set the checkbox's state. ! * @param state The new state. ! */ ! public void setState (boolean state) ! { ! this.state = state; ! if (peer != null) ! { ! CheckboxPeer cp = (CheckboxPeer) peer; ! cp.setState (state); ! } ! } ! private ItemListener listeners; ! String label; ! CheckboxGroup group; ! boolean state; } --- 1,380 ---- ! /* Checkbox.java -- An AWT checkbox widget ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.CheckboxPeer; + import java.awt.peer.ComponentPeer; + import java.awt.event.ItemEvent; + import java.awt.event.ItemListener; + import java.io.Serializable; ! /** ! * This class implements a component which has an on/off state. Two * or more Checkboxes can be grouped by a CheckboxGroup. + * + * @author Aaron M. Renn (arenn@urbanophile.com) * @author Tom Tromey */ ! public class Checkbox extends Component implements ItemSelectable, Serializable { ! // FIXME: Need readObject/writeObject for this. ! /* ! * Static Variables ! */ ! // Serialization Constant ! private static final long serialVersionUID = 7270714317450821763L; ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * @serial The checkbox group for this checkbox. ! */ ! private CheckboxGroup group; ! /** ! * @serial The label on this checkbox. ! */ ! private String label; ! /** ! * @serial The state of this checkbox. ! */ ! private boolean state; ! // The list of listeners for this object. ! private transient ItemListener item_listeners; ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * Initializes a new instance of Checkbox with no label, ! * an initial state of off, and that is not part of any checkbox group. ! */ ! public ! Checkbox() ! { ! this("", false, null); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Checkbox with the specified ! * label, an initial state of off, and that is not part of any checkbox ! * group. ! * ! * @param label The label for this checkbox. ! */ ! public ! Checkbox(String label) ! { ! this(label, false, null); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Checkbox with the specified ! * label and initial state, and that is not part of any checkbox ! * group. ! * ! * @param label The label for this checkbox. ! * @param state The initial state of the checkbox, true for ! * on, false for off. ! */ ! public ! Checkbox(String label, boolean state) ! { ! this(label, state, null); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Checkbox with the specified ! * label, initial state, and checkbox group. ! * ! * @param label The label for this checkbox. ! * @param group The checkbox group for this box, or null ! * if there is no checkbox group. ! * @param state The initial state of the checkbox, true for ! * on, false for off. ! */ ! public ! Checkbox(String label, CheckboxGroup group, boolean state) ! { ! this(label, state, group); ! } ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of Checkbox with the specified ! * label, initial state, and checkbox group. ! * ! * @param label The label for this checkbox. ! * @param state The initial state of the checkbox, true for ! * on, false for off. ! * @param group The checkbox group for this box, or null ! * if there is no checkbox group. ! */ ! public ! Checkbox(String label, boolean state, CheckboxGroup group) ! { ! this.label = label; ! this.state = state; ! this.group = group; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * Returns the label for this checkbox. ! * ! * @return The label for this checkbox. ! */ ! public String ! getLabel() ! { ! return(label); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the label for this checkbox to the specified value. ! * ! * @param label The new checkbox label. ! */ ! public synchronized void ! setLabel(String label) ! { ! this.label = label; ! if (peer != null) ! { ! CheckboxPeer cp = (CheckboxPeer) peer; ! cp.setLabel(label); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the state of this checkbox. ! * ! * @return The state of this checkbox, which will be true for ! * on and false for off. ! */ ! public boolean ! getState() ! { ! return(state); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the state of this checkbox to the specified value. ! * ! * @param state The new state of the checkbox, which will be true ! * for on or false for off. ! */ ! public synchronized void ! setState(boolean state) ! { ! this.state = state; ! if (peer != null) ! { ! CheckboxPeer cp = (CheckboxPeer) peer; ! cp.setState (state); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * Returns an array of length one containing the checkbox label if this ! * checkbox is selected. Otherwise null is returned. ! * ! * @return The selection state of this checkbox. ! */ ! public Object[] ! getSelectedObjects() ! { ! if (state == false) ! return(null); ! ! Object[] objs = new Object[1]; ! objs[0] = label; ! ! return(objs); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the checkbox group this object is a member of, if any. ! * ! * @return This object's checkbox group, of null if it is ! * not a member of any group. ! */ ! public CheckboxGroup ! getCheckboxGroup() ! { ! return(group); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets this object's checkbox group to the specified group. ! * ! * @param group The new checkbox group, or null to make this ! * object part of no checkbox group. ! */ ! public synchronized void ! setCheckboxGroup(CheckboxGroup group) ! { ! this.group = group; ! if (peer != null) ! { ! CheckboxPeer cp = (CheckboxPeer) peer; ! cp.setCheckboxGroup (group); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * Creates this object's native peer. ! */ ! public void ! addNotify() ! { ! if (peer == null) ! peer = getToolkit ().createCheckbox (this); ! super.addNotify (); ! } ! ! /*************************************************************************/ ! ! /** ! * Adds a new listeners to the list of registered listeners for this object. ! * ! * @param listener The new listener to add. ! */ ! public synchronized void ! addItemListener(ItemListener listener) ! { ! item_listeners = AWTEventMulticaster.add(item_listeners, listener); ! } ! ! /*************************************************************************/ ! ! /** ! * Removes a listener from the list of registered listeners for this object. ! * ! * @param listener The listener to remove. ! */ ! public synchronized void ! removeItemListener(ItemListener listener) ! { ! item_listeners = AWTEventMulticaster.remove(item_listeners, listener); } + + /*************************************************************************/ + + /** + * Processes this event by calling processItemEvent() if it + * is any instance of ItemEvent. Otherwise it is passed to + * the superclass for processing. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof ItemEvent) + processItemEvent((ItemEvent)event); + else + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * Processes this event by dispatching it to any registered listeners. + * + * @param event The ItemEvent to process. + */ + protected void + processItemEvent(ItemEvent event) + { + if (item_listeners != null) + item_listeners.itemStateChanged(event); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + */ + protected String + paramString() + { + return ("label=" + label + ",state=" + state + ",group=" + group + + "," + super.paramString()); + } + + } // class Checkbox diff -Nrc3pad gcc-3.0.4/libjava/java/awt/CheckboxGroup.java gcc-3.1/libjava/java/awt/CheckboxGroup.java *** gcc-3.0.4/libjava/java/awt/CheckboxGroup.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/CheckboxGroup.java Tue Jan 22 22:40:04 2002 *************** *** 1,66 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! import java.io.Serializable; ! /** This class is used to groups checkbox components. ! * @author Tom Tromey ! * @date December 25, 2000 */ ! public class CheckboxGroup implements Serializable { ! // Current set checkbox. ! Checkbox selectedCheckbox; ! /** Create a new instance of CheckboxGroup. */ ! public CheckboxGroup () ! { ! } ! /** Returns the currently selected checkbox in the group. ! * @deprecated ! */ ! public Checkbox getCurrent () ! { ! return getSelectedCheckbox (); ! } ! /** Returns the currently selected checkbox in the group. */ ! public Checkbox getSelectedCheckbox () ! { ! return selectedCheckbox; ! } ! /** Set the selected checkbox. ! * @deprecated ! */ ! public synchronized void setCurrent (Checkbox checkbox) ! { ! setSelectedCheckbox (checkbox); ! } ! /** Set the selected checkbox. */ ! public synchronized void setSelectedCheckbox (Checkbox checkbox) ! { ! if (checkbox != null && checkbox.group != this) ! return; ! selectedCheckbox.setState (false); ! selectedCheckbox = checkbox; ! if (checkbox != null) ! checkbox.setState (true); ! } ! /** Return String representation of this class and current Checkbox. */ ! public String toString () ! { ! return "[CheckboxGroup: " + selectedCheckbox + "]"; ! } } --- 1,173 ---- ! /* CheckboxGroup.java -- A grouping class for checkboxes. ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! /** ! * This class if for combining checkboxes into groups so that only ! * one checkbox in the group can be selected at any one time. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class CheckboxGroup implements java.io.Serializable ! { ! /* ! * Static Variables */ ! ! // Serialization constant ! private static final long serialVersionUID = 3729780091441768983L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The currently selected checkbox. ! */ ! private Checkbox selectedCheckbox; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of CheckboxGroup. ! */ ! public ! CheckboxGroup() { ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the currently selected checkbox, or null if none ! * of the checkboxes in this group are selected. ! * ! * @return The selected checkbox. ! */ ! public Checkbox ! getSelectedCheckbox() ! { ! return(selectedCheckbox); ! } ! /*************************************************************************/ ! /** ! * Returns the currently selected checkbox, or null if none ! * of the checkboxes in this group are selected. ! * ! * @return The selected checkbox. ! * ! * @deprecated This method is deprecated in favor of ! * getSelectedCheckbox(). ! */ ! public Checkbox ! getCurrent() ! { ! return(selectedCheckbox); ! } ! /*************************************************************************/ ! /** ! * This method sets the specified checkbox to be the selected on in this ! * group, and unsets all others. ! * ! * @param selectedCheckbox The new selected checkbox. ! */ ! public void ! setSelectedCheckbox(Checkbox selectedCheckbox) ! { ! if (this.selectedCheckbox != null) ! { ! if (this.selectedCheckbox.getCheckboxGroup() != this) ! return; ! ! this.selectedCheckbox.setState(false); ! } ! ! this.selectedCheckbox = selectedCheckbox; ! if (selectedCheckbox != null) ! selectedCheckbox.setState(true); } + + /*************************************************************************/ + + /** + * This method sets the specified checkbox to be the selected on in this + * group, and unsets all others. + * + * @param selectedCheckbox The new selected checkbox. + * + * @deprecated This method is deprecated in favor of + * setSelectedCheckbox(). + */ + public void + setCurrent(Checkbox selectedCheckbox) + { + setSelectedCheckbox(selectedCheckbox); + } + + /*************************************************************************/ + + /** + * Returns a string representation of this checkbox group. + * + * @return A string representation of this checkbox group. + */ + public String + toString() + { + return(getClass().getName() + "[selectedCheckbox=" + selectedCheckbox + "]"); + } + + } // class CheckboxGroup + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/CheckboxMenuItem.java gcc-3.1/libjava/java/awt/CheckboxMenuItem.java *** gcc-3.0.4/libjava/java/awt/CheckboxMenuItem.java Tue Dec 26 07:18:16 2000 --- gcc-3.1/libjava/java/awt/CheckboxMenuItem.java Tue Jan 22 22:58:08 2002 *************** *** 1,133 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; import java.awt.peer.CheckboxMenuItemPeer; ! import java.awt.event.ItemListener; import java.awt.event.ItemEvent; ! /** This implements a menu item which keeps track of a boolean state. ! * @author Tom Tromey ! * @date December 25, 2000 */ ! public class CheckboxMenuItem extends MenuItem implements ItemSelectable { ! /** Create a new CheckboxMenuItem. ! * @param label The checkbox label. A null value is the same as ""; ! * null is the default. ! * @param state The initial check state; defaults to false. ! */ ! public CheckboxMenuItem () ! { ! this (null, false); ! } ! public CheckboxMenuItem (String label) ! { ! this (label, false); ! } ! public CheckboxMenuItem (String label, boolean state) ! { ! this.label = label; ! this.state = state; ! } ! /** Add a listener for item events. ! * @param listener The listener to add. ! */ ! public synchronized void addItemListener (ItemListener listener) ! { ! listeners = AWTEventMulticaster.add (listeners, listener); ! } ! /** This creates the component's peer. */ ! public void addNotify () ! { ! if (peer != null) ! { ! // This choice of toolkit seems unsatisfying, but I'm not sure ! // what else to do. ! peer = Toolkit.getDefaultToolkit ().createCheckboxMenuItem (this); ! } ! } ! /** Returns this checkbox's label if this checkbox is selected. */ ! public Object[] getSelectedObjects () ! { ! Object[] r; ! if (state) ! { ! r = new Object[1]; ! r[0] = label; ! } ! else ! r = new Object[0]; ! return r; ! } ! /** Returns the current state of this checkbox. */ ! public boolean getState () ! { ! return state; ! } ! /** Generates a String representation of this Checkbox's state. */ ! public String paramString () ! { ! return ("[" + getClass ().getName () ! + "state=" + state + "," ! + "label=" + label + "]"); ! } ! /** Process an event for this Checkbox. ! * @param event The event the process. ! */ ! protected void processEvent (AWTEvent event) ! { ! if (event instanceof ItemEvent) ! processItemEvent ((ItemEvent) event); ! else ! super.processEvent (event); ! } ! /** Process an item event for this Checkbox. ! * @param event The ItemEvent to process ! */ ! protected void processItemEvent (ItemEvent event) ! { ! if (listeners != null) ! listeners.itemStateChanged (event); ! } ! /** Remove an item listener. ! * @param listener Item listener to remove. ! */ ! public synchronized void removeItemListener (ItemListener listener) ! { ! listeners = AWTEventMulticaster.remove (listeners, listener); ! } ! /** Set the checkbox's state. ! * @param state The new state. ! */ ! public void setState (boolean state) ! { ! this.state = state; ! if (peer != null) ! { ! CheckboxMenuItemPeer cp = (CheckboxMenuItemPeer) peer; ! cp.setState (state); ! } ! } ! // Private state. ! String label; ! boolean state; ! ItemListener listeners; } --- 1,276 ---- ! /* CheckboxMenuItem.java -- A menu option with a checkbox on it. ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + import java.awt.peer.CheckboxMenuItemPeer; ! import java.awt.peer.MenuItemPeer; ! import java.awt.peer.MenuComponentPeer; import java.awt.event.ItemEvent; + import java.awt.event.ItemListener; ! /** ! * This class implements a menu item that has a checkbox on it indicating ! * the selected state of some option. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class CheckboxMenuItem extends MenuItem implements ItemSelectable, ! java.io.Serializable ! { ! ! /* ! * Static Variables */ ! ! // Serialization constant ! private static final long serialVersionUID = 6190621106981774043L; ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The state of the checkbox, with true being on and ! * false being off. ! */ ! private boolean state; ! ! // List of registered ItemListeners ! private transient ItemListener item_listeners; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of CheckboxMenuItem with no ! * label and an initial state of off. ! */ ! public ! CheckboxMenuItem() { ! this("", false); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of CheckboxMenuItem with the ! * specified label and an initial state of off. ! * ! * @param label The label of the menu item. ! */ ! public ! CheckboxMenuItem(String label) ! { ! this(label, false); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of CheckboxMenuItem with the ! * specified label and initial state. ! * ! * @param label The label of the menu item. ! * @param state The initial state of the menu item, where true ! * is on, and false is off. ! */ ! public ! CheckboxMenuItem(String label, boolean state) ! { ! super(label); ! this.state = state; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the state of this menu item. ! * ! * @return The state of this menu item. ! */ ! public boolean ! getState() ! { ! return(state); ! } ! /*************************************************************************/ ! /** ! * Sets the state of this menu item. ! * ! * @param state The initial state of the menu item, where true ! * is on, and false is off. ! */ ! public synchronized void ! setState(boolean state) ! { ! this.state = state; ! if (peer != null) ! { ! CheckboxMenuItemPeer cp = (CheckboxMenuItemPeer) peer; ! cp.setState (state); ! } ! } ! /*************************************************************************/ ! /** ! * Returns an array of length 1 with the menu item label for this object ! * if the state is on. Otherwise null is returned. ! * ! * @param An array with this menu item's label if it has a state of on, ! * or null otherwise. ! */ ! public Object[] ! getSelectedObjects() ! { ! if (state == false) ! return(null); ! Object[] obj = new Object[1]; ! obj[0] = getLabel(); ! ! return(obj); ! } ! ! /*************************************************************************/ ! ! /** ! * Create's this object's native peer ! */ ! public synchronized void ! addNotify() ! { ! if (peer != null) ! { ! // This choice of toolkit seems unsatisfying, but I'm not sure ! // what else to do. ! peer = getToolkit().createCheckboxMenuItem(this); ! } ! super.addNotify (); ! } ! ! /*************************************************************************/ ! ! /** ! * Adds the specified listener to the list of registered item listeners ! * for this object. ! * ! * @param listener The listener to add. ! */ ! public synchronized void ! addItemListener(ItemListener listener) ! { ! item_listeners = AWTEventMulticaster.add(item_listeners, listener); ! ! enableEvents(AWTEvent.ITEM_EVENT_MASK); } + + /*************************************************************************/ + + /** + * Removes the specified listener from the list of registered item + * listeners for this object. + * + * @param listener The listener to remove. + */ + public synchronized void + removeItemListener(ItemListener listener) + { + item_listeners = AWTEventMulticaster.remove(item_listeners, listener); + } + + /*************************************************************************/ + + /** + * Processes the specified event by calling processItemEvent() + * if it is an instance of ItemEvent or calling the superclass + * method otherwise. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof ItemEvent) + processItemEvent((ItemEvent)event); + else + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * Processes the specified event by dispatching it to any registered listeners. + * + * @param event The event to process. + */ + protected void + processItemEvent(ItemEvent event) + { + if (item_listeners != null) + item_listeners.itemStateChanged(event); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + public String + paramString() + { + return ("label=" + getLabel() + ",state=" + state + + "," + super.paramString()); + } + + } // class CheckboxMenuItem + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Choice.java gcc-3.1/libjava/java/awt/Choice.java *** gcc-3.0.4/libjava/java/awt/Choice.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/Choice.java Tue Jan 22 22:58:08 2002 *************** *** 1,275 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! import java.awt.event.*; import java.awt.peer.ChoicePeer; ! import java.util.ArrayList; ! /** This component lets the user choose an item from a list of ! * Strings. ! * @author Tom Tromey ! * @date December 25, 2000 */ ! public class Choice extends Component implements ItemSelectable { ! /** Create a new Choice object. */ ! public Choice () ! { ! items = new ArrayList (); ! selected = -1; ! } ! /** Add a new item to this Choice object. If the item is the first ! * item on the list, then it is selected. ! * @param item The new item; must be non-null. ! */ ! public synchronized void add (String item) ! { ! if (item == null) ! throw new IllegalArgumentException ("item must be non-null"); ! items.add (item); ! int i = items.size () - 1; ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! cp.add (item, i); ! } ! if (i == 0) ! select (0); ! } ! /** Add a new item to this Choice object. This is the same as the ! * add method. */ ! public void addItem (String item) ! { ! add (item); ! } ! /** Add a listener for item events. ! * @param listener The listener to add. ! */ ! public synchronized void addItemListener (ItemListener listener) ! { ! listeners = AWTEventMulticaster.add (listeners, listener); ! } ! /** This creates the component's peer. */ ! public void addNotify () ! { ! if (peer == null) ! peer = getToolkit ().createChoice (this); ! } ! /** Returns number of items. ! * @deprecated ! */ ! public int countItems () ! { ! return getItemCount (); ! } ! /** Returns an item from this choice. ! * @param index Index of the item. Indices start at zero. ! */ ! public String getItem (int index) ! { ! return (String) items.get (index); ! } ! /** Returns number of items in Choice. */ ! public int getItemCount () ! { ! return items.size (); ! } ! /** Returns index of selected item; -1 if no item is selected. */ ! public int getSelectedIndex () ! { ! return selected; ! } ! /** Returns currently selected item; null if no item is selected. */ ! public synchronized String getSelectedItem () ! { ! return selected == -1 ? null : (String) items.get (selected); ! } ! /** Returns the currently selected item. */ ! public synchronized Object[] getSelectedObjects () ! { ! // The JCL says this can return null but that breaks the contract ! // for ItemSelectable. ! Object[] r; ! if (selected != -1) ! { ! r = new Object[1]; ! r[0] = items.get (selected); ! } ! else ! r = new Object[0]; ! return r; ! } ! /** Inserts an item into this Choice. Existing items are shifted ! * upwards. If the new item is the only item, then it is selected. ! * If the currently selected item is shifted, then the first item is ! * selected. If the currently selected item is not shifted, then it ! * remains selected. ! * @param item The new item ! * @param index The position at which to insert it. ! */ ! public synchronized void insert (String item, int index) ! { ! if (index > items.size ()) ! index = items.size (); ! items.add (index, item); ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! cp.add (item, index); ! } ! if (items.size () == 1 || selected >= index) ! select (0); ! } ! /** Generates a String representation of this Choice's state. */ ! protected String paramString () ! { ! return ("Choice[" ! + "selected=" + selected ! + "]"); ! } ! /** Process an event for this Choice ! * @param event The event the process. ! */ ! protected void processEvent (AWTEvent event) ! { ! if (event instanceof ItemEvent) ! processItemEvent ((ItemEvent) event); ! else ! super.processEvent (event); ! } ! /** Process an item event for this Choice. ! * @param event The ItemEvent to process ! */ ! protected void processItemEvent (ItemEvent event) ! { ! if (listeners != null) ! listeners.itemStateChanged (event); ! } ! /** Remove an item from this Choice. If several matches exist, the ! * first one is removed. If the removed item is selected, the the ! * first item is selected. ! * @param item The item string. ! */ ! public synchronized void remove (String item) ! { ! int size = items.size (); ! for (int i = 0; i < size; ++i) ! { ! if (item.equals (items.get (i))) ! { ! remove (i); ! break; ! } ! } ! throw new IllegalArgumentException ("item \"" + item + "\" not in Choice"); ! } ! /** Remove an item from this Choice. If the removed item is ! * selected, the the first item is selected. ! * @param index Index of the item to remove ! */ ! public synchronized void remove (int index) ! { ! items.remove (index); ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! cp.remove (index); ! } ! if (index == selected) ! select (0); ! else if (selected > index) ! --selected; ! } ! /** Remove all items from this choice. */ ! public synchronized void removeAll () ! { ! int oldsize = items.size (); ! items.clear (); ! selected = -1; ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! for (int i = 0; i < oldsize; ++i) ! { ! // Always remove item 0. ! cp.remove (0); ! } ! } ! } ! /** Remove an item listener. ! * @param listener Item listener to remove. ! */ ! public synchronized void removeItemListener (ItemListener listener) ! { ! listeners = AWTEventMulticaster.remove (listeners, listener); ! } ! /** Select an item in this Choice. ! * @param item Name of the item to select. ! */ ! public synchronized void select (String item) ! { ! int size = items.size (); ! for (int i = 0; i < size; ++i) ! { ! if (item.equals (items.get (i))) ! { ! select (i); ! break; ! } ! } ! } ! /** Select an item in this choice. ! * @param index Index of item to select. ! */ ! public synchronized void select (int index) ! { ! if (index < 0 || index > items.size ()) ! throw new IllegalArgumentException ("index out of range"); ! selected = index; ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! cp.select (index); ! } ! } ! private ItemListener listeners; ! // List of items. ! ArrayList items; ! // Index of selected item. ! int selected; } --- 1,447 ---- ! /* Choice.java -- Java choice button widget. ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.ChoicePeer; ! import java.awt.peer.ComponentPeer; ! import java.awt.event.ItemEvent; ! import java.awt.event.ItemListener; ! import java.io.Serializable; ! import java.util.Vector; ! /** ! * This class implements a drop down choice list. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class Choice extends Component implements ItemSelectable, Serializable ! { ! ! /* ! * Static Variables */ ! ! // Serialization constant ! private static final long serialVersionUID = -4075310674757313071L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial A list of items for the choice box, which can be null. ! */ ! private Vector pItems = new Vector(); ! ! /** ! * @serial The index of the selected item in the choice box. ! */ ! private int selectedIndex = -1; ! ! // Listener chain ! private ItemListener item_listeners; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Choice. ! */ ! public ! Choice() { ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the number of items in the list. ! * ! * @return The number of items in the list. ! */ ! public int ! getItemCount() ! { ! return(pItems.size()); ! } ! /*************************************************************************/ ! /** ! * Returns the number of items in the list. ! * ! * @return The number of items in the list. ! * ! * @deprecated This method is deprecated in favor of getItemCount. ! */ ! public int ! countItems() ! { ! return(pItems.size()); ! } ! /*************************************************************************/ ! /** ! * Returns the item at the specified index in the list. ! * ! * @param index The index into the list to return the item from. ! * ! * @exception ArrayIndexOutOfBoundsException If the index is invalid. ! */ ! public String ! getItem(int index) ! { ! return((String)pItems.elementAt(index)); ! } ! /*************************************************************************/ ! /** ! * Adds the specified item to this choice box. ! * ! * @param item The item to add. ! */ ! public synchronized void ! add(String item) ! { ! if (item == null) ! throw new IllegalArgumentException ("item must be non-null"); ! pItems.addElement(item); ! int i = pItems.size () - 1; ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! cp.add (item, i); ! } ! if (i == 0) ! select (0); ! } ! /*************************************************************************/ ! /** ! * Adds the specified item to this choice box. ! * ! * @param item The item to add. ! */ ! public synchronized void ! addItem(String item) ! { ! add(item); ! } ! /*************************************************************************/ ! /** Inserts an item into this Choice. Existing items are shifted ! * upwards. If the new item is the only item, then it is selected. ! * If the currently selected item is shifted, then the first item is ! * selected. If the currently selected item is not shifted, then it ! * remains selected. ! * ! * @param item The item to add. ! * @param index The index at which the item should be inserted. ! */ ! public synchronized void ! insert(String item, int index) ! { ! if (index > getItemCount ()) ! index = getItemCount (); ! pItems.insertElementAt(item, index); ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! cp.add (item, index); ! } ! if (getItemCount () == 1 || selectedIndex >= index) ! select (0); ! } ! /*************************************************************************/ ! /** ! * Removes the specified item from the choice box. ! * ! * @param item The item to remove. ! * ! * @param IllegalArgumentException If the specified item doesn't exist. ! */ ! public synchronized void ! remove(String item) ! { ! int index = pItems.indexOf(item); ! if (index == -1) ! throw new IllegalArgumentException ("item \"" ! + item + "\" not found in Choice"); ! remove(index); ! } ! /*************************************************************************/ ! /** ! * Removes the item at the specified index from the choice box. ! * ! * @param index The index of the item to remove. ! * ! * @exception ArrayIndexOutOfBoundException If the index is not valid. ! */ ! public synchronized void ! remove(int index) ! { ! pItems.removeElementAt(index); ! if (peer != null) ! { ! ChoicePeer cp = (ChoicePeer) peer; ! cp.remove (index); ! } ! if (index == selectedIndex) ! select (0); ! else if (selectedIndex > index) ! --selectedIndex; ! } ! /*************************************************************************/ ! /** ! * Removes all of the objects from this choice box. ! */ ! public synchronized void ! removeAll() ! { ! int count = getItemCount(); ! for (int i = 0; i < count; i++) ! { ! // Always remove 0. ! remove(0); ! } ! } ! /*************************************************************************/ ! ! /** ! * Returns the currently selected item, or null if no item is ! * selected. ! * ! * @return The currently selected item. ! */ ! public synchronized String ! getSelectedItem() ! { ! return (selectedIndex == -1 ! ? null ! : ((String)pItems.elementAt(selectedIndex))); } + + /*************************************************************************/ + + /** + * Returns an array with one row containing the selected item. + * + * @return An array containing the selected item. + */ + public synchronized Object[] + getSelectedObjects() + { + if (selectedIndex == -1) + return null; + + Object[] objs = new Object[1]; + objs[0] = pItems.elementAt(selectedIndex); + + return(objs); + } + + /*************************************************************************/ + + /** + * Returns the index of the selected item. + * + * @return The index of the selected item. + */ + public int + getSelectedIndex() + { + return(selectedIndex); + } + + /*************************************************************************/ + + /** + * Forces the item at the specified index to be selected. + * + * @param index The index of the row to make selected. + * + * @param IllegalArgumentException If the specified index is invalid. + */ + public synchronized void + select(int index) + { + if ((index < 0) || (index > getItemCount())) + throw new IllegalArgumentException("Bad index: " + index); + + this.selectedIndex = index; + if (peer != null) + { + ChoicePeer cp = (ChoicePeer) peer; + cp.select (index); + } + } + + /*************************************************************************/ + + /** + * Forces the named item to be selected. + * + * @param item The item to be selected. + * + * @exception IllegalArgumentException If the specified item does not exist. + */ + public synchronized void + select(String item) + { + int index = pItems.indexOf(item); + if (index >= 0) + select(index); + } + + /*************************************************************************/ + + /** + * Creates the native peer for this object. + */ + public void + addNotify() + { + if (peer == null) + peer = getToolkit ().createChoice (this); + super.addNotify (); + } + + /*************************************************************************/ + + /** + * Adds the specified listener to the list of registered listeners for + * this object. + * + * @param listener The listener to add. + */ + public synchronized void + addItemListener(ItemListener listener) + { + item_listeners = AWTEventMulticaster.add(item_listeners, listener); + } + + /*************************************************************************/ + + /** + * Removes the specified listener from the list of registered listeners for + * this object. + * + * @param listener The listener to remove. + */ + public synchronized void + removeItemListener(ItemListener listener) + { + item_listeners = AWTEventMulticaster.remove(item_listeners, listener); + } + + /*************************************************************************/ + + /** + * Processes this event by invoking processItemEvent() if the + * event is an instance of ItemEvent, otherwise the event + * is passed to the superclass. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof ItemEvent) + processItemEvent((ItemEvent)event); + else + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * Processes item event by dispatching to any registered listeners. + * + * @param event The event to process. + */ + protected void + processItemEvent(ItemEvent event) + { + if (item_listeners != null) + item_listeners.itemStateChanged(event); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + protected String + paramString() + { + return ("selectedIndex=" + selectedIndex + "," + super.paramString()); + } + + } // class Choice diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Color.java gcc-3.1/libjava/java/awt/Color.java *** gcc-3.0.4/libjava/java/awt/Color.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/Color.java Tue Jan 22 22:58:08 2002 *************** *** 1,122 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; /** ! * @author Warren Levy ! * @date March 15, 2000. */ /** ! * Written using on-line Java Platform 1.2 API Specification, as well ! * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). ! * Status: Stubbed; A very incomplete implementation. */ ! public class Color extends Object implements Paint, java.io.Serializable { ! public static final Color white = new Color(0xFFFFFFFF, true); ! public static final Color lightGray = new Color(0xFFC0C0C0, true); ! public static final Color gray = new Color(0xFF808080, true); ! public static final Color darkGray = new Color(0xFF404040, true); ! public static final Color black = new Color(0xFF000000, true); ! public static final Color red = new Color(0xFFFF0000, true); ! public static final Color pink = new Color(0xFFFFAFAF, true); ! public static final Color orange = new Color(0xFFFFC800, true); ! public static final Color yellow = new Color(0xFFFFFF00, true); ! public static final Color green = new Color(0xFF00FF00, true); ! public static final Color magenta = new Color(0xFFFF00FF, true); ! public static final Color cyan = new Color(0xFF00FFFF, true); ! public static final Color blue = new Color(0xFF0000FF, true); ! ! // The internal sRGB representation. ! // Alpha is bits 24-31, if hasalpha is true. ! // Red is bits 16-23; Green is bits 8-15; Blue is bits 0-7. ! int rgba = 0xFFFFFFFF; ! public Color(int rgb) ! { ! this(rgb, false); ! } ! public Color(int rgba, boolean hasalpha) ! { ! this.rgba = rgba; ! if (!hasalpha) ! rgba |= 0xFF000000; ! } ! public Color(int r, int g, int b) ! { ! this(r, g, b, 0xFF); ! } ! public Color(int r, int g, int b, int a) ! { ! rgba = a << 24 | ((r << 16) & 0x00FF0000) | ((g << 8) & 0x0000FF00) | ! (b & 0x000000FF); ! } ! public int getRed() ! { ! return (rgba >> 16) & 0xFF; ! } ! public int getGreen() ! { ! return (rgba >> 8) & 0xFF; ! } ! public int getBlue() ! { ! return rgba & 0xFF; ! } ! public int getAlpha() ! { ! return (rgba >> 24) & 0xFF; ! } ! public int getRGB() ! { ! return rgba; ! } ! static final int BRIGHT_STEP = 0x30; ! public Color brighter() ! { ! return new Color(Math.min(255, getRed() + BRIGHT_STEP), ! Math.min(255, getGreen() + BRIGHT_STEP), ! Math.min(255, getBlue() + BRIGHT_STEP), ! getAlpha()); ! } ! ! public Color darker() ! { ! return new Color(Math.max(0, getRed() - BRIGHT_STEP), ! Math.max(0, getGreen() - BRIGHT_STEP), ! Math.max(0, getBlue() - BRIGHT_STEP), ! getAlpha()); ! } ! ! public int hashCode() ! { ! return rgba; ! } ! ! public int getTransparency() ! { ! if (getAlpha() == 0xFF) ! return Transparency.OPAQUE; ! else ! return Transparency.TRANSLUCENT; ! } } --- 1,533 ---- ! /* Color.java -- Class representing a color in Java ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; /** ! * This class represents a color value in the AWT system. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class Color implements java.io.Serializable ! { ! ! /* ! * Static Variables */ /** ! * Constant for the color white ! */ ! public static final Color white = new Color(255,255,255,255); ! ! /** ! * Constant for the color light gray ! */ ! public static final Color lightGray = new Color(192,192,192,255); ! ! /** ! * Constant for the color gray ! */ ! public static final Color gray = new Color(128,128,128,255); ! ! /** ! * Constant for the color dark gray ! */ ! public static final Color darkGray = new Color(64,64,64,255); ! ! /** ! * Constant for the color black ! */ ! public static final Color black = new Color(0,0,0,255); ! ! /** ! * Constant for the color red ! */ ! public static final Color red = new Color(255,0,0,255); ! ! /** ! * Constant for the color pink ! */ ! public static final Color pink = new Color(255, 175, 175,255); ! ! /** ! * Constant for the color orange ! */ ! public static final Color orange = new Color(255, 200, 0,255); ! ! /** ! * Constant for the color yellow ! */ ! public static final Color yellow = new Color(255,255,0,255); ! ! /** ! * Constant for the color green ! */ ! public static final Color green = new Color(0,255,0,255); ! ! /** ! * Constant for the color magenta ! */ ! public static final Color magenta = new Color(255,0,255,255); ! ! /** ! * Constant for the color cyan ! */ ! public static final Color cyan = new Color(0,255,255,255); ! ! /** ! * Constant for the color blue ! */ ! public static final Color blue = new Color(0,0,255,255); ! ! // Serialization Constant ! private static final long serialVersionUID = 118526816881161077L; ! ! // Masks for individual color components ! private static final int redmask = 255 << 16; ! private static final int greenmask = 255 << 8; ! private static final int bluemask = 255; ! private static final int alphamask = 255 << 24; ! ! private static final int BRIGHT_STEP = 0x30; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables */ ! /** ! * @serial The RGB value of the color. ! */ ! private int value = 0xFFFFFFFF; ! ! /*************************************************************************/ ! ! /* ! * Static Methods ! */ ! ! /** ! * Converts the specified string to a number and creates a new instance ! * of Color from the value. ! * ! * @param str The numeric color string. ! * ! * @return A new instance of Color for the string. ! * ! * @exception NumberFormatException If the string cannot be parsed. ! */ ! public static Color ! decode(String str) throws NumberFormatException { ! Integer i = Integer.decode(str); ! return(new Color(i.intValue())); ! } ! /*************************************************************************/ ! /** ! * Returns a new instance of Color from the value of ! * the system property named by the specified string. If the property ! * does not exist, or cannot be parsed, then null will be ! * returned. ! * ! * @param prop The system property to retrieve. ! */ ! public static Color ! getColor(String prop) ! { ! return(getColor(prop, null)); ! } ! /*************************************************************************/ ! /** ! * Returns a new instance of Color from the value of the ! * system property named by the specified string. If the property does ! * not exist, or cannot be parsed, then the default RGB value will be ! * used to create a return value. ! * ! * @param prop The system property to retrieve. ! * @param defrgb The default RGB value. ! */ ! public static Color ! getColor(String prop, int defrgb) ! { ! return(getColor(prop, new Color(defrgb))); ! } ! /*************************************************************************/ ! /** ! * Returns a new instance of Color from the value of the ! * system property named by the specified string. If the property does ! * not exist, or cannot be parsed, then the default color value will be ! * returned ! * ! * @param prop The system property to retrieve. ! * @param defcolor The default color ! */ ! public static Color ! getColor(String prop, Color defcolor) ! { ! String val = System.getProperty(prop); ! if (val == null) ! return(defcolor); ! try ! { ! return(decode(val)); ! } ! catch(NumberFormatException e) ! { ! return(defcolor); ! } ! } ! /*************************************************************************/ ! /** ! * Converts from the HSB (hue, saturation, brightness) color model to ! * the RGB (red, green, blue) color model. ! * ! * @param hue The hue of the HSB value. ! * @param saturation The saturation of the HSB value. ! * @param brightness The brightness of the HSB value. ! * ! * @return The RGB value. ! */ ! public static int ! HSBtoRGB(float hue, float saturation, float brightness) ! { ! // FIXME: Implement ! throw new RuntimeException("Not implemented yet"); ! } ! /*************************************************************************/ ! /** ! * Converts from the RGB (red, green, blue) color model to the HSB ! * (hue, saturation, brightness) color model. ! * ! * @param red The red part of the RGB value. ! * @param green The green part of the RGB value. ! * @param blue The blue part of the RGB value. ! * @param hsbvals An array of three floats used for storing the HSB values, ! * or null if this return mechanism is not used. ! * ! * @return The HSB value. ! */ ! public static float[] ! RGBtoHSB(int red, int green, int blue, float hsbvals[]) ! { ! // FIXME: Implement ! throw new RuntimeException("Not implemented yet"); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns a new instance of Color based on the specified ! * HSB values. ! * ! * @param hue The hue of the HSB value. ! * @param saturation The saturation of the HSB value. ! * @param brightness The brightness of the HSB value. ! * ! * @return The new Color object. ! */ ! public static Color ! getHSBColor(float hue, float saturation, float brightness) ! { ! return(new Color(HSBtoRGB(hue, saturation, brightness))); ! } ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Color using the specified ! * red, green, and blue values, which must be given as integers in the ! * range of 0-255. ! * ! * @param red The red component of the RGB value. ! * @param green The green component of the RGB value. ! * @param blue The blue component of the RGB value. ! * ! * @exception IllegalArgumentException If the values are out of range. ! */ ! public ! Color(int red, int green, int blue) ! { ! if ((red < 0) || (red > 255) || (green < 0) || (green > 255) || ! (blue < 0) || (blue > 255)) ! throw new IllegalArgumentException("Bad RGB values"); ! ! value = blue + (green << 8) + (red << 16); ! } ! ! public ! Color(int red, int green, int blue, int alpha) ! { ! if ((red < 0) || (red > 255) || (green < 0) || (green > 255) || ! (blue < 0) || (blue > 255)) ! throw new IllegalArgumentException("Bad RGB values"); ! ! value = blue + (green << 8) + (red << 16) + (alpha << 24); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of Color using the specified ! * RGB value. The blue value is in bits 0-7, green in bits 8-15, and ! * red in bits 16-23. The other bits are ignored. ! * ! * @param value The RGB value ! */ ! public ! Color(int value) ! { ! this.value = value; ! } ! ! public ! Color(int value, boolean hasalpha) ! { ! this.value = value; ! if (! hasalpha) ! this.value |= 0xFF000000; ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of Color using the specified ! * RGB values. These must be in the range of 0.0-1.0. ! * ! * @param red The red component of the RGB value. ! * @param green The green component of the RGB value. ! * @param blue The blue component of the RGB value. ! * ! * @exception IllegalArgumentException If the values are out of range. ! */ ! public ! Color(float red, float green, float blue) ! { ! if ((red < 0.0) || (red > 1.0) || (green < 0.0) || (green > 1.0) || ! (blue < 0.0) || (blue > 1.0)) ! throw new IllegalArgumentException("Bad RGB values"); ! ! int redval = (int)(255 * red); ! int greenval = (int)(255 * green); ! int blueval = (int)(255 * blue); ! ! value = blueval + (greenval << 8) + (redval << 16); ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Returns the red value for this color. ! * ! * @return The red value for this color. ! */ ! public int ! getRed() ! { ! int redval = (value & redmask) >> 16; ! ! return(redval); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the green value for this color. ! * ! * @return The green value for this color. ! */ ! public int ! getGreen() ! { ! int greenval = (value & greenmask) >> 8; ! ! return(greenval); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the blue value for this color. ! * ! * @return The blue value for this color. ! */ ! public int ! getBlue() ! { ! int blueval = (value & bluemask); ! ! return(blueval); ! } ! ! public int ! getAlpha() ! { ! int alphaval = (value & alphamask); ! ! return(alphaval); ! } ! ! public int ! getTransparency() ! { ! if (getAlpha() == 0xFF) ! return Transparency.OPAQUE; ! else ! return Transparency.TRANSLUCENT; ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the RGB value for this color. The blue value will be in bits ! * 0-7, green in 8-15, and red in 6-23. The upper bits should be ignored. ! * ! * @return The RGB value for this color. ! */ ! public int ! getRGB() ! { ! return(value); } + /*************************************************************************/ + + /** + * Returns a brighter version of this color. This is done by increasing + * the RGB values by an arbitrary scale factor. Note that this method + * and the darker() method are not necessarily inverses. + * + * @return A brighter version of this color. + */ + public Color + brighter() + { + return new Color(Math.min(255, getRed() + BRIGHT_STEP), + Math.min(255, getGreen() + BRIGHT_STEP), + Math.min(255, getBlue() + BRIGHT_STEP), + getAlpha()); + } + + /*************************************************************************/ + + /** + * Returns a darker version of this color. This is done by decreasing + * the RGB values by an arbitrary scale factor. Note that this method + * and the brighter() method are not necessarily inverses. + * + * @return A darker version of this color. + */ + public Color + darker() + { + return new Color(Math.max(0, getRed() - BRIGHT_STEP), + Math.max(0, getGreen() - BRIGHT_STEP), + Math.max(0, getBlue() - BRIGHT_STEP), + getAlpha()); + } + + /*************************************************************************/ + + /** + * Returns a hash value for this color. + * + * @return A hash value for this color. + */ + public int + hashCode() + { + return(value); + } + + /*************************************************************************/ + + /** + * Tests this object for equality against the specified object. This will + * be true if and only if the specified object is an instance of + * Color and has the same red, green, and blue values as + * this object. + * + * @return true if the specified object is equal to this one, + * false otherwise. + */ + public boolean + equals(Object obj) + { + if (!(obj instanceof Color)) + return(false); + + Color c = (Color)obj; + return value == c.value; + } + + /*************************************************************************/ + + /** + * Returns a string representation of this object. + * + * @return A string representation of this object. + */ + public String + toString() + { + return(getClass().getName() + "(red=" + getRed() + ",green=" + getGreen() + + ",blue=" + getBlue() + ")"); + } + + } // class Color + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Component.java gcc-3.1/libjava/java/awt/Component.java *** gcc-3.0.4/libjava/java/awt/Component.java Wed Jan 3 00:07:13 2001 --- gcc-3.1/libjava/java/awt/Component.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt; import java.awt.event.*; --- 1,38 ---- ! /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; import java.awt.event.*; *************** import java.beans.PropertyChangeListener *** 34,46 **** public abstract class Component implements ImageObserver, MenuContainer, java.io.Serializable { ! /* Constants for use with getAlignmentX()/getAlignmentY(). */ ! public static final float BOTTOM_ALIGNMENT = 1.0f, ! CENTER_ALIGNMENT = 0.5f, ! LEFT_ALIGNMENT = 0.0f, ! RIGHT_ALIGNMENT = 1.0f, ! TOP_ALIGNMENT = 0.0f; /* Make the treelock a String so that it can easily be identified in debug dumps. We clone the String in order to avoid a conflict in --- 62,102 ---- public abstract class Component implements ImageObserver, MenuContainer, java.io.Serializable { + /** + * Constant returned by the getAlignmentY method to indicate + * that the component wishes to be aligned to the bottom relative to + * other components. + */ + public static final float BOTTOM_ALIGNMENT = (float)1.0; ! /** ! * Constant returned by the getAlignmentY and ! * getAlignmentX methods to indicate ! * that the component wishes to be aligned to the center relative to ! * other components. ! */ ! public static final float CENTER_ALIGNMENT = (float)0.5; ! ! /** ! * Constant returned by the getAlignmentY method to indicate ! * that the component wishes to be aligned to the top relative to ! * other components. ! */ ! public static final float TOP_ALIGNMENT = (float)0.0; ! ! /** ! * Constant returned by the getAlignmentX method to indicate ! * that the component wishes to be aligned to the right relative to ! * other components. ! */ ! public static final float RIGHT_ALIGNMENT = (float)1.0; ! ! /** ! * Constant returned by the getAlignmentX method to indicate ! * that the component wishes to be aligned to the left relative to ! * other components. ! */ ! public static final float LEFT_ALIGNMENT = (float)0.0; /* Make the treelock a String so that it can easily be identified in debug dumps. We clone the String in order to avoid a conflict in *************** public abstract class Component implemen *** 92,108 **** transient ComponentOrientation orientation = ComponentOrientation.UNKNOWN; protected Component() { } public String getName() { if (name == null && !nameExplicitlySet) name = generateName(); return name; } ! public void setName(String name) { nameExplicitlySet = true; --- 148,177 ---- transient ComponentOrientation orientation = ComponentOrientation.UNKNOWN; + /** + * Default constructor for subclasses. + */ protected Component() { } + /** + * Returns the name of this component. + * + * @return The name of this component. + */ public String getName() { if (name == null && !nameExplicitlySet) name = generateName(); return name; } ! ! /** ! * Sets the name of this component to the specified name. ! * ! * @param name The new name of this component. ! */ public void setName(String name) { nameExplicitlySet = true; *************** public abstract class Component implemen *** 117,135 **** // Component is abstract. return null; } ! public Container getParent() { return parent; } ! ! /** @deprecated */ ! // However, Classpath's Gtk peers rely on it. public java.awt.peer.ComponentPeer getPeer() { return peer; } ! // FIXME: java.awt.dnd classes not yet implemented /* public void setDropTarget(DropTarget dt) --- 186,220 ---- // Component is abstract. return null; } ! ! /** ! * Returns the parent of this component. ! * ! * @return The parent of this component. ! */ public Container getParent() { return parent; } ! ! // Sets the peer for this component. ! final void setPeer (ComponentPeer peer) ! { ! this.peer = peer; ! } ! ! /** ! * Returns the native windowing system peer for this component. ! * ! * @return The peer for this component. ! * @deprecated ! */ ! // Classpath's Gtk peers rely on this. public java.awt.peer.ComponentPeer getPeer() { return peer; } ! // FIXME: java.awt.dnd classes not yet implemented /* public void setDropTarget(DropTarget dt) *************** public abstract class Component implemen *** 167,177 **** --- 252,279 ---- return null; } + /** + * Returns the object used for synchronization locks on this component + * when performing tree and layout functions. + * + * @return The synchronization lock for this component. + */ public final Object getTreeLock() { return treeLock; } + // The sync lock object for this component. + final void setTreeLock(Object tree_lock) + { + this.treeLock = tree_lock; + } + + /** + * Returns the toolkit in use for this component. + * + * @return The toolkit for this component. + */ public Toolkit getToolkit() { if (peer != null) *************** public abstract class Component implemen *** 185,190 **** --- 287,299 ---- return Toolkit.getDefaultToolkit (); } + /** + * Tests whether or not this component is valid. A invalid component needs + * to have its layout redone. + * + * @return true if this component is valid, false + * otherwise. + */ public boolean isValid() { return valid; *************** public abstract class Component implemen *** 197,208 **** return parent.isDisplayable(); return false; } ! public boolean isVisible() { return visible; } ! public boolean isShowing() { if (! visible || peer == null) --- 306,331 ---- return parent.isDisplayable(); return false; } ! ! /** ! * Tests whether or not this component is visible. ! * ! * @return true if the component is visible, ! * false otherwise. ! */ public boolean isVisible() { return visible; } ! ! /** ! * Tests whether or not this component is actually being shown on ! * the screen. This will be true if and only if it this component is ! * visible and its parent components are all visible. ! * ! * @return true if the component is showing on the screen, ! * false otherwise. ! */ public boolean isShowing() { if (! visible || peer == null) *************** public abstract class Component implemen *** 210,291 **** return parent == null ? true : parent.isShowing (); } ! public boolean isEnabled() { return enabled; } ! public void setEnabled(boolean b) { this.enabled = b; if (peer != null) peer.setEnabled(b); } ! ! /** @deprecated */ public void enable() { setEnabled(true); } ! ! /** @deprecated */ public void enable(boolean b) { setEnabled(b); } ! ! /** @deprecated */ public void disable() { setEnabled(false); } ! public boolean isDoubleBuffered() { return false; } ! /** @since 1.2 */ public void enableInputMethods(boolean enable) { // FIXME } ! ! /** @specnote Inspection by subclassing shows that Sun's implementation ! calls show(boolean) which then calls show() or hide(). It is ! the show() method that is overriden in subclasses like Window. ! We do the same to preserve compatibility for subclasses. */ public void setVisible(boolean b) { ! show (b); } ! ! /** @deprecated */ public void show() { ! if (peer != null) ! peer.setVisible(true); ! this.visible = true; } ! ! /** @deprecated */ public void show(boolean b) { ! if (b) ! show(); ! else ! hide(); } ! ! /** @deprecated */ public void hide() { ! if (peer != null) ! peer.setVisible(false); ! this.visible = false; } ! public Color getForeground() { if (foreground != null) --- 333,464 ---- return parent == null ? true : parent.isShowing (); } ! ! /** ! * Tests whether or not this component is enabled. ! * ! * @return true if the component is enabled, ! * false otherwise. ! */ public boolean isEnabled() { return enabled; } ! ! /** ! * Enables or disables this component. ! * ! * @param enabled true to enable this component, ! * false to disable it. ! * ! * @deprecated Deprecated in favor of setEnabled(). ! */ public void setEnabled(boolean b) { this.enabled = b; if (peer != null) peer.setEnabled(b); } ! ! /** ! * Enables this component. ! * ! * @deprecated Deprecated in favor of setEnabled(). ! */ public void enable() { setEnabled(true); } ! ! /** ! * Enables or disables this component. ! * ! * @param enabled true to enable this component, ! * false to disable it. ! * ! * @deprecated Deprecated in favor of setEnabled(). ! */ public void enable(boolean b) { setEnabled(b); } ! ! /** ! * Disables this component. ! * ! * @deprecated Deprecated in favor of setEnabled(). ! */ public void disable() { setEnabled(false); } ! public boolean isDoubleBuffered() { return false; } ! /** @since 1.2 */ public void enableInputMethods(boolean enable) { // FIXME } ! ! /** ! * Makes this component visible or invisible. ! * ! * @param visible true to make this component visible, ! * false to make it invisible. ! * @specnote Inspection by subclassing shows that Sun's implementation ! * calls show(boolean) which then calls show() or hide(). It is ! * the show() method that is overriden in subclasses like Window. ! * We do the same to preserve compatibility for subclasses. ! */ public void setVisible(boolean b) { ! if (peer != null) ! peer.setVisible (b); ! this.visible = b; } ! ! /** ! * Makes this component visible on the screen. ! * ! * @deprecated Deprecated in favor of setVisible(). ! */ public void show() { ! setVisible (true); } ! ! /** ! * Makes this component visible or invisible. ! * ! * @param visible true to make this component visible, ! * false to make it invisible. ! * ! * @deprecated Deprecated in favor of setVisible(). ! */ public void show(boolean b) { ! setVisible (b); } ! ! /** ! * Hides this component so that it is no longer shown on the screen. ! * ! * @deprecated Deprecated in favor of setVisible(). ! */ public void hide() { ! setVisible (false); } ! ! /** ! * Returns this component's foreground color. ! * ! * @return This component's foreground color. ! */ public Color getForeground() { if (foreground != null) *************** public abstract class Component implemen *** 294,300 **** return parent.getForeground(); return null; } ! public void setForeground(Color c) { if (peer != null) --- 467,478 ---- return parent.getForeground(); return null; } ! ! /** ! * Sets this component's foreground color to the specified color. ! * ! * @param foreground_color The new foreground color. ! */ public void setForeground(Color c) { if (peer != null) *************** public abstract class Component implemen *** 302,311 **** this.foreground = c; } ! /** @return the background color of the component. null may be ! returned instead of the actual background color, if this ! method is called before the component is added to the ! component hierarchy. */ public Color getBackground() { if (background != null) --- 480,493 ---- this.foreground = c; } ! /** ! * Returns this component's background color. ! * ! * @return the background color of the component. null may be ! * returned instead of the actual background color, if this ! * method is called before the component is added to the ! * component hierarchy. ! */ public Color getBackground() { if (background != null) *************** public abstract class Component implemen *** 314,327 **** return parent.getBackground(); return null; } ! public void setBackground(Color c) { if (peer != null) peer.setBackground(c); this.background = c; } ! public Font getFont() { if (font != null) --- 496,519 ---- return parent.getBackground(); return null; } ! ! /** ! * Sets this component's background color to the specified color. ! * ! * @param background_color The new background color ! */ public void setBackground(Color c) { if (peer != null) peer.setBackground(c); this.background = c; } ! ! /** ! * Returns the font in use for this component. ! * ! * @return The font for this component. ! */ public Font getFont() { if (font != null) *************** public abstract class Component implemen *** 330,336 **** return parent.getFont(); return null; } ! public void setFont(Font f) { if (peer != null) --- 522,533 ---- return parent.getFont(); return null; } ! ! /** ! * Sets the font for this component to the specified font. ! * ! * @param font The new font for this component. ! */ public void setFont(Font f) { if (peer != null) *************** public abstract class Component implemen *** 338,343 **** --- 535,547 ---- this.font = f; } + /** + * Returns the locale for this component. If this component does not + * have a locale, the locale of the parent component is returned. If the + * component has no parent, the system default locale is returned. + * + * @return The locale for this component. + */ public Locale getLocale() throws IllegalComponentStateException { if (locale != null) *************** public abstract class Component implemen *** 347,362 **** ("Component has no parent: Can not determine Locale"); return parent.getLocale(); } ! public void setLocale(Locale l) { this.locale = l; ! /* new writing/layout direction perhaps, or make more/less room for localized text labels */ invalidate(); } ! public ColorModel getColorModel() { GraphicsConfiguration config = getGraphicsConfiguration(); --- 551,576 ---- ("Component has no parent: Can not determine Locale"); return parent.getLocale(); } ! ! /** ! * Sets the locale for this component to the specified locale. ! * ! * @param locale The new locale for this component. ! */ public void setLocale(Locale l) { this.locale = l; ! /* new writing/layout direction perhaps, or make more/less room for localized text labels */ invalidate(); } ! ! /** ! * Returns the color model of the device this componet is displayed on. ! * ! * @return This object's color model. ! */ public ColorModel getColorModel() { GraphicsConfiguration config = getGraphicsConfiguration(); *************** public abstract class Component implemen *** 367,377 **** --- 581,603 ---- return getToolkit().getColorModel(); } + /** + * Returns the location of this component's top left corner relative to + * its parent component. + * + * @return The location of this component. + */ public Point getLocation() { return new Point(x, y); } + /** + * Returns the location of this component's top left corner in screen + * coordinates. + * + * @return The location of this component in screen coordinates. + */ public Point getLocationOnScreen() { if (! isShowing ()) *************** public abstract class Component implemen *** 381,427 **** return peer.getLocationOnScreen (); } ! /** @deprecated Use getLocation() instead. */ public Point location() { return getLocation(); } public void setLocation (int x, int y) { if ((this.x == x) && (this.y == y)) return; ! invalidate(); ! this.x = x; this.y = y; if (peer != null) peer.setBounds(x, y, width, height); } ! /** @deprecated */ public void move(int x, int y) { setLocation(x,y); } ! public void setLocation(Point p) { setLocation(p.x, p.y); } ! public Dimension getSize() { return new Dimension(width, height); } ! ! /** @deprecated */ public Dimension size() { return getSize(); } ! public void setSize(int width, int height) { if ((this.width == width) && (this.height == height)) --- 607,699 ---- return peer.getLocationOnScreen (); } ! /** ! * Returns the location of this component's top left corner relative to ! * its parent component. ! * ! * @return The location of this component. ! * ! * @deprecated This method is deprecated in favor of ! * getLocation(). ! */ public Point location() { return getLocation(); } + /** + * Moves this component to the specified location. The coordinates are + * the new upper left corner of this component. + * + * @param x The new X coordinate of this component. + * @param y The new Y coordinate of this component. + */ public void setLocation (int x, int y) { if ((this.x == x) && (this.y == y)) return; ! invalidate(); ! this.x = x; this.y = y; if (peer != null) peer.setBounds(x, y, width, height); } ! /** ! * Moves this component to the specified location. The coordinates are ! * the new upper left corner of this component. ! * ! * @param x The new X coordinate of this component. ! * @param y The new Y coordinate of this component. ! * ! * @deprecated Deprecated in favor for setLocation. ! */ public void move(int x, int y) { setLocation(x,y); } ! ! /** ! * Moves this component to the specified location. The coordinates are ! * the new upper left corner of this component. ! * ! * @param p New coordinates for this component. ! */ public void setLocation(Point p) { setLocation(p.x, p.y); } ! ! /** ! * Returns the size of this object. ! * ! * @return The size of this object. ! */ public Dimension getSize() { return new Dimension(width, height); } ! ! /** ! * Returns the size of this object. ! * ! * @return The size of this object. ! * ! * @deprecated This method is deprecated in favor of getSize. ! */ public Dimension size() { return getSize(); } ! ! /** ! * Sets the size of this component to the specified width and height. ! * ! * @param width The new width of this component. ! * @param height The new height of this component. ! */ public void setSize(int width, int height) { if ((this.width == width) && (this.height == height)) *************** public abstract class Component implemen *** 434,468 **** if (peer != null) peer.setBounds(x, y, width, height); } ! ! /** @deprecated */ public void resize(int width, int height) { setSize(width, height); } ! public void setSize(Dimension d) { setSize(d.width, d.height); } ! /** @deprecated */ public void resize(Dimension d) { setSize(d.width, d.height); } public Rectangle getBounds() { return new Rectangle (x, y, width, height); } ! /** @deprecated */ public Rectangle bounds() { return getBounds(); } ! public void setBounds(int x, int y, int w, int h) { if (this.x == x --- 706,783 ---- if (peer != null) peer.setBounds(x, y, width, height); } ! ! /** ! * Sets the size of this component to the specified value. ! * ! * @param width The new width of the component. ! * @param height The new height of the component. ! * ! * @deprecated This method is deprecated in favor of setSize. ! */ public void resize(int width, int height) { setSize(width, height); } ! ! /** ! * Sets the size of this component to the specified value. ! * ! * @param dim The new size of this component. ! */ public void setSize(Dimension d) { setSize(d.width, d.height); } ! /** ! * Sets the size of this component to the specified value. ! * ! * @param dim The new size of this component. ! * ! * @deprecated This method is deprecated in favor of setSize. ! */ public void resize(Dimension d) { setSize(d.width, d.height); } + /** + * Returns a bounding rectangle for this component. Note that the + * returned rectange is relative to this component's parent, not to + * the screen. + * + * @return The bounding rectangle for this component. + */ public Rectangle getBounds() { return new Rectangle (x, y, width, height); } ! /** ! * Returns a bounding rectangle for this component. Note that the ! * returned rectange is relative to this component's parent, not to ! * the screen. ! * ! * @return The bounding rectangle for this component. ! * ! * @deprecated Deprecated in favor of getBounds(). ! */ public Rectangle bounds() { return getBounds(); } ! ! /** ! * Sets the bounding rectangle for this component to the specified ! * values. Note that these coordinates are relative to the parent, ! * not to the screen. ! * ! * @param x The X coordinate of the upper left corner of the rectangle. ! * @param y The Y coordinate of the upper left corner of the rectangle. ! * @param width The width of the rectangle. ! * @param height The height of the rectangle. ! */ public void setBounds(int x, int y, int w, int h) { if (this.x == x *************** public abstract class Component implemen *** 481,493 **** if (peer != null) peer.setBounds(x, y, w, h); } ! ! /** @deprecated */ public void reshape(int x, int y, int width, int height) { setBounds(x, y, width, height); } ! public void setBounds(Rectangle r) { setBounds(r.x, r.y, r.width, r.height); --- 796,827 ---- if (peer != null) peer.setBounds(x, y, w, h); } ! ! /** ! * Sets the bounding rectangle for this component to the specified ! * values. Note that these coordinates are relative to the parent, ! * not to the screen. ! * ! * @param x The X coordinate of the upper left corner of the rectangle. ! * @param y The Y coordinate of the upper left corner of the rectangle. ! * @param width The width of the rectangle. ! * @param height The height of the rectangle. ! * ! * @deprecated This method is deprecated in favor of ! * setBounds(int, int, int, int). ! */ public void reshape(int x, int y, int width, int height) { setBounds(x, y, width, height); } ! ! /** ! * Sets the bounding rectangle for this component to the specified ! * rectangle. Note that these coordinates are relative to the parent, ! * not to the screen. ! * ! * @param bounding_rectangle The new bounding rectangle. ! */ public void setBounds(Rectangle r) { setBounds(r.x, r.y, r.width, r.height); *************** public abstract class Component implemen *** 557,563 **** { return (peer != null) && (peer instanceof LightweightPeer); } ! public Dimension getPreferredSize() { if (peer == null) --- 891,902 ---- { return (peer != null) && (peer instanceof LightweightPeer); } ! ! /** ! * Returns the component's preferred size. ! * ! * @return The component's preferred size. ! */ public Dimension getPreferredSize() { if (peer == null) *************** public abstract class Component implemen *** 566,577 **** return peer.getPreferredSize(); } ! /** @deprecated */ public Dimension preferredSize() { return getPreferredSize(); } ! public Dimension getMinimumSize() { if (peer == null) --- 905,927 ---- return peer.getPreferredSize(); } ! /** ! * Returns the component's preferred size. ! * ! * @return The component's preferred size. ! * ! * @deprecated Deprecated in favor of getPreferredSize(). ! */ public Dimension preferredSize() { return getPreferredSize(); } ! ! /** ! * Returns the component's minimum size. ! * ! * @return The component's minimum size. ! */ public Dimension getMinimumSize() { if (peer == null) *************** public abstract class Component implemen *** 580,622 **** return peer.getMinimumSize(); } ! /** @deprecated */ public Dimension minimumSize() { return getMinimumSize(); } public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } public float getAlignmentX() { return CENTER_ALIGNMENT; } public float getAlignmentY() { return CENTER_ALIGNMENT; } public void doLayout() { // nothing to do unless we're a container } ! ! /** @deprecated */ public void layout() { doLayout(); } ! public void validate() { ! // nothing to do unless we're a container } ! public void invalidate() { valid = false; --- 930,1011 ---- return peer.getMinimumSize(); } ! /** ! * Returns the component's minimum size. ! * ! * @return The component's minimum size. ! * ! * @deprecated Deprecated in favor of getMinimumSize() ! */ public Dimension minimumSize() { return getMinimumSize(); } + /** + * Returns the component's maximum size. + * + * @return The component's maximum size. + */ public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } + /** + * Returns the preferred horizontal alignment of this component. The + * value returned will be one of the constants defined in this class. + * + * @return The preferred horizontal alignment of this component. + */ public float getAlignmentX() { return CENTER_ALIGNMENT; } + /** + * Returns the preferred vertical alignment of this component. The + * value returned will be one of the constants defined in this class. + * + * @return The preferred vertical alignment of this component. + */ public float getAlignmentY() { return CENTER_ALIGNMENT; } + /** + * Calls the layout manager to re-layout the component. This is called + * during validation of a container in most cases. + */ public void doLayout() { // nothing to do unless we're a container } ! ! /** ! * Calls the layout manager to re-layout the component. This is called ! * during validation of a container in most cases. ! * ! * @deprecated This method is deprecated in favor of doLayout(). ! */ public void layout() { doLayout(); } ! ! /** ! * Called to ensure that the layout for this component is valid. ! */ public void validate() { ! valid = true; } ! ! /** ! * Invalidates this component and all of its parent components. This will ! * cause them to have their layout redone. ! */ public void invalidate() { valid = false; *************** public abstract class Component implemen *** 625,630 **** --- 1014,1025 ---- parent.invalidate (); } + /** + * Returns a graphics object for this component. Returns null + * if this component is not currently displayed on the screen. + * + * @return A graphics object for this component. + */ public Graphics getGraphics() { if (peer != null) *************** public abstract class Component implemen *** 646,676 **** } return null; } ! public FontMetrics getFontMetrics(Font font) { ! return getToolkit().getFontMetrics(font); } ! public void setCursor(Cursor cursor) { this.cursor = cursor; } ! public Cursor getCursor() { return this.cursor; } ! public void paint(Graphics g) ! { } ! public void update(Graphics g) { paint(g); } ! public void paintAll(Graphics g) { if (!visible) --- 1041,1112 ---- } return null; } ! ! /** ! * Returns the font metrics for the specified font in this component. ! * ! * @param font The font to retrieve metrics for. ! * ! * @return The font metrics for the specified font. ! */ public FontMetrics getFontMetrics(Font font) { ! if (peer == null) ! return getToolkit().getFontMetrics(font); ! return peer.getFontMetrics (font); } ! ! /** ! * Sets the cursor for this component to the specified cursor. ! * ! * @param cursor The new cursor for this component. ! */ public void setCursor(Cursor cursor) { this.cursor = cursor; + if (peer != null) + peer.setCursor (cursor); } ! ! /** ! * Returns the cursor for this component. ! * ! * @return The cursor for this component. ! */ public Cursor getCursor() { return this.cursor; } ! ! /** ! * Paints this component on the screen. The clipping region in the ! * graphics context will indicate the region that requires painting. ! * ! * @param graphics The graphics context for this paint job. ! */ public void paint(Graphics g) ! { } ! ! /** ! * Updates this component. This method fills the component ! * with the background color, then sets the foreground color of the ! * specified graphics context to the foreground color of this component ! * and calls the paint() method. ! * // FIXME: What are the coords relative to? ! * ! * @param graphics The graphics context for this update. ! */ public void update(Graphics g) { paint(g); } ! ! /** ! * Paints this entire component, including any sub-components. ! * ! * @param graphics The graphics context for this paint job. ! */ public void paintAll(Graphics g) { if (!visible) *************** public abstract class Component implemen *** 680,701 **** peer.paint(g); paint(g); } ! public void repaint() { repaint(0, 0, 0, getWidth(), getHeight()); } ! public void repaint(long tm) { repaint(tm, 0, 0, getWidth(), getHeight()); } ! public void repaint(int x, int y, int width, int height) { repaint(0, x, y, width, height); } ! public void repaint(long tm, int x, int y, int width, int height) { // Handle lightweight repainting by forwarding to native parent --- 1116,1175 ---- peer.paint(g); paint(g); } ! ! /** ! * Repaint this entire component. The update() method ! * on this component will be called as soon as possible. ! * // FIXME: What are the coords relative to? ! */ public void repaint() { repaint(0, 0, 0, getWidth(), getHeight()); } ! ! /** ! * Repaint this entire component. The update() method ! * on this component will be called in approximate the specified number ! * of milliseconds. ! * // FIXME: What are the coords relative to? ! * ! * @param tm The number of milliseconds before this component should ! * be repainted. ! */ public void repaint(long tm) { repaint(tm, 0, 0, getWidth(), getHeight()); } ! ! /** ! * Repaints the specified rectangular region within this component. ! * This update method on this component will be called as ! * soon as possible. ! * // FIXME: What are the coords relative to? ! * ! * @param x The X coordinate of the upper left of the region to repaint ! * @param y The Y coordinate of the upper left of the region to repaint ! * @param width The width of the region to repaint. ! * @param height The height of the region to repaint. ! */ public void repaint(int x, int y, int width, int height) { repaint(0, x, y, width, height); } ! ! /** ! * Repaints the specified rectangular region within this component. ! * This update method on this component will be called in ! * approximately the specified number of milliseconds. ! * // FIXME: What are the coords relative to? ! * ! * @param tm The number of milliseconds before this component should ! * be repainted. ! * @param x The X coordinate of the upper left of the region to repaint ! * @param y The Y coordinate of the upper left of the region to repaint ! * @param width The width of the region to repaint. ! * @param height The height of the region to repaint. ! */ public void repaint(long tm, int x, int y, int width, int height) { // Handle lightweight repainting by forwarding to native parent *************** public abstract class Component implemen *** 705,725 **** parent.repaint(tm, x+getX(), y+getY(), width, height); return; } ! if (peer != null) peer.repaint(tm, x, y, width, height); } public void print(Graphics g) { paint(g); } public void printAll(Graphics g) { paintAll(g); } public boolean imageUpdate (Image img, int infoflags, int x, int y, int w, int h) { --- 1179,1229 ---- parent.repaint(tm, x+getX(), y+getY(), width, height); return; } ! if (peer != null) peer.repaint(tm, x, y, width, height); } + /** + * Prints this component. This method is + * provided so that printing can be done in a different manner from + * painting. However, the implementation in this class simply calls + * the paint() method. + * + * @param graphics The graphics context of the print device. + */ public void print(Graphics g) { paint(g); } + /** + * Prints this component, including all sub-components. This method is + * provided so that printing can be done in a different manner from + * painting. However, the implementation in this class simply calls + * the paintAll() method. + * + * @param graphics The graphics context of the print device. + */ public void printAll(Graphics g) { paintAll(g); } + /** + * Called when an image has changed so that this component is + * repainted. + * + * @param image The image that has been updated. + * @param flags Flags as specified in ImageObserver. + * @param x The X coordinate + * @param y The Y coordinate + * @param width The width + * @param height The height + * + * @return true if the image has been fully loaded, + * false otherwise. + */ public boolean imageUpdate (Image img, int infoflags, int x, int y, int w, int h) { *************** public abstract class Component implemen *** 727,784 **** return false; } public Image createImage(ImageProducer producer) { ! // FIXME ! return null; } public Image createImage(int width, int height) { return getGraphicsConfiguration().createCompatibleImage(width, height); } public boolean prepareImage(Image image, ImageObserver observer) { ! // FIXME ! return false; } ! public boolean prepareImage(Image image, int width, int height, ImageObserver observer) { ! // FIXME ! return false; } public int checkImage(Image image, ImageObserver observer) { ! // FIXME ! return 0; } ! public int checkImage (Image image, int width, int height, ImageObserver observer) { if (peer != null) return peer.checkImage (image, width, height, observer); return getToolkit ().checkImage (image, width, height, observer); } public boolean contains (int x, int y) { return (x >= 0) && (y >= 0) && (x < width) && (y < height); } ! /** @deprecated */ public boolean inside(int x, int y) { return contains(x,y); } public boolean contains(Point p) { return contains(p.x, p.y); } public Component getComponentAt(int x, int y) { if (contains(x,y)) --- 1231,1390 ---- return false; } + /** + * Creates an image from the specified producer. + * + * @param producer The image procedure to create the image from. + * + * @return The resulting image. + */ public Image createImage(ImageProducer producer) { ! return peer.createImage(producer); } + /** + * Creates an image with the specified width and height for use in + * double buffering. + * + * @param width The width of the image. + * @param height The height of the image. + * + * @return The requested image. + */ public Image createImage(int width, int height) { return getGraphicsConfiguration().createCompatibleImage(width, height); } + /** + * Prepares the specified image for rendering on this component. + * + * @param image The image to prepare for rendering. + * @param observer The image observer to notify of the status of the + * image preparation. + * + * @return true if the image is already fully prepared + * for rendering, false otherwise. + */ public boolean prepareImage(Image image, ImageObserver observer) { ! return prepareImage(image, image.getWidth(observer), ! image.getHeight(observer), observer); } ! /** ! * Prepares the specified image for rendering on this component at the ! * specified scaled width and height ! * ! * @param image The image to prepare for rendering. ! * @param width The scaled width of the image. ! * @param height The scaled height of the image. ! * @param observer The image observer to notify of the status of the ! * image preparation. ! * ! * @return true if the image is already fully prepared ! * for rendering, false otherwise. ! */ ! public boolean prepareImage(Image image, int width, int height, ! ImageObserver observer) { ! return peer.prepareImage(image, width, height, observer); } + /** + * Returns the status of the loading of the specified image. The value + * returned will be those flags defined in ImageObserver. + * + * @param image The image to check on. + * @param observer The observer to be notified as the image loading + * progresses. + * + * @return The image observer flags indicating the status of the load. + */ public int checkImage(Image image, ImageObserver observer) { ! return checkImage(image, image.getWidth(observer), ! image.getHeight(observer), observer); } ! /** ! * Returns the status of the loading of the specified image. The value ! * returned will be those flags defined in ImageObserver. ! * ! * @param image The image to check on. ! * @param width The scaled image width. ! * @param height The scaled image height. ! * @param observer The observer to be notified as the image loading ! * progresses. ! * ! * @return The image observer flags indicating the status of the load. ! */ ! public int checkImage (Image image, int width, int height, ! ImageObserver observer) { if (peer != null) return peer.checkImage (image, width, height, observer); return getToolkit ().checkImage (image, width, height, observer); } + /** + * Tests whether or not the specified point is contained within this + * component. Coordinates are relative to this component. + * + * @param x The X coordinate of the point to test. + * @param y The Y coordinate of the point to test. + * + * @return true if the point is within this component, + * false otherwise. + */ public boolean contains (int x, int y) { return (x >= 0) && (y >= 0) && (x < width) && (y < height); } ! /** ! * Tests whether or not the specified point is contained within this ! * component. Coordinates are relative to this component. ! * ! * @param x The X coordinate of the point to test. ! * @param y The Y coordinate of the point to test. ! * ! * @return true if the point is within this component, ! * false otherwise. ! * ! * @deprecated Deprecated in favor of contains(int, int). ! */ public boolean inside(int x, int y) { return contains(x,y); } + /** + * Tests whether or not the specified point is contained within this + * component. Coordinates are relative to this component. + * + * @param point The point to test. + * + * @return true if the point is within this component, + * false otherwise. + */ public boolean contains(Point p) { return contains(p.x, p.y); } + /** + * Returns the component occupying the position (x,y). This will either + * be this component, an immediate child component, or null + * if neither of the first two occupies the specified location. + * + * @param x The X coordinate to search for components at. + * @param y The Y coordinate to search for components at. + * + * @return The component at the specified location, for null + * if there is none. + */ public Component getComponentAt(int x, int y) { if (contains(x,y)) *************** public abstract class Component implemen *** 786,806 **** return null; } ! /** @deprecated */ public Component locate(int x, int y) { return getComponentAt(x, y); } public Component getComponentAt(Point p) { return getComponentAt(p.x, p.y); } ! /** @deprecated */ public void deliverEvent(Event e) { - } /** Forward AWT events to processEvent() if: --- 1392,1438 ---- return null; } ! /** ! * Returns the component occupying the position (x,y). This will either ! * be this component, an immediate child component, or null ! * if neither of the first two occupies the specified location. ! * ! * @param x The X coordinate to search for components at. ! * @param y The Y coordinate to search for components at. ! * ! * @return The component at the specified location, for null ! * if there is none. ! * ! * @deprecated The method is deprecated in favor of ! * getComponentAt(). ! */ public Component locate(int x, int y) { return getComponentAt(x, y); } + /** + * Returns the component occupying the specified point This will either + * be this component, an immediate child component, or null + * if neither of the first two occupies the specified location. + * + * @param point The point to search for components at. + * + * @return The component at the specified location, for null + * if there is none. + */ public Component getComponentAt(Point p) { return getComponentAt(p.x, p.y); } ! /** ! * AWT 1.0 event dispatcher. ! * ! * @deprecated Deprecated in favor of dispatchEvent(). ! */ public void deliverEvent(Event e) { } /** Forward AWT events to processEvent() if: *************** public abstract class Component implemen *** 808,813 **** --- 1440,1447 ---- * OR: * - There is at least one registered listener for this type of event * + * @param event The event to dispatch + * * @specnote This method is final, but we need to be able to * override it in order to handle other event types in our * subclasses. The solution is to define a second, non-final *************** public abstract class Component implemen *** 866,896 **** processEvent(e); } ! /** @deprecated */ public boolean postEvent(Event e) { return false; } ! public synchronized void addComponentListener(ComponentListener l) { componentListener = AWTEventMulticaster.add(componentListener, l); if (componentListener != null) enableEvents(AWTEvent.COMPONENT_EVENT_MASK); } ! public synchronized void removeComponentListener(ComponentListener l) { componentListener = AWTEventMulticaster.remove(componentListener, l); } ! public synchronized void addFocusListener(FocusListener l) { focusListener = AWTEventMulticaster.add(focusListener, l); if (focusListener != null) enableEvents(AWTEvent.FOCUS_EVENT_MASK); } ! public synchronized void removeFocusListener(FocusListener l) { focusListener = AWTEventMulticaster.remove(focusListener, l); --- 1500,1554 ---- processEvent(e); } ! /** ! * AWT 1.0 event dispatcher. ! * ! * @deprecated Deprecated in favor of dispatchEvent(). ! */ public boolean postEvent(Event e) { return false; } ! ! /** ! * Adds the specified listener to this component. ! * ! * @param listener The new listener to add. ! */ public synchronized void addComponentListener(ComponentListener l) { componentListener = AWTEventMulticaster.add(componentListener, l); if (componentListener != null) enableEvents(AWTEvent.COMPONENT_EVENT_MASK); } ! ! /** ! * Removes the specified listener from the component. ! * ! * @param listener The listener to remove. ! */ public synchronized void removeComponentListener(ComponentListener l) { componentListener = AWTEventMulticaster.remove(componentListener, l); } ! ! /** ! * Adds the specified listener to this component. ! * ! * @param listener The new listener to add. ! */ public synchronized void addFocusListener(FocusListener l) { focusListener = AWTEventMulticaster.add(focusListener, l); if (focusListener != null) enableEvents(AWTEvent.FOCUS_EVENT_MASK); } ! ! /** ! * Removes the specified listener from the component. ! * ! * @param listener The listener to remove. ! */ public synchronized void removeFocusListener(FocusListener l) { focusListener = AWTEventMulticaster.remove(focusListener, l); *************** public abstract class Component implemen *** 927,932 **** --- 1585,1595 ---- AWTEventMulticaster.remove(hierarchyBoundsListener, l); } + /** + * Adds the specified listener to this component. + * + * @param listener The new listener to add. + */ public synchronized void addKeyListener(KeyListener l) { keyListener = AWTEventMulticaster.add(keyListener, l); *************** public abstract class Component implemen *** 934,944 **** --- 1597,1617 ---- enableEvents(AWTEvent.KEY_EVENT_MASK); } + /** + * Removes the specified listener from the component. + * + * @param listener The listener to remove. + */ public synchronized void removeKeyListener(KeyListener l) { keyListener = AWTEventMulticaster.remove(keyListener, l); } + /** + * Adds the specified listener to this component. + * + * @param listener The new listener to add. + */ public synchronized void addMouseListener(MouseListener l) { mouseListener = AWTEventMulticaster.add(mouseListener, l); *************** public abstract class Component implemen *** 946,956 **** --- 1619,1639 ---- enableEvents(AWTEvent.MOUSE_EVENT_MASK); } + /** + * Removes the specified listener from the component. + * + * @param listener The listener to remove. + */ public synchronized void removeMouseListener(MouseListener l) { mouseListener = AWTEventMulticaster.remove(mouseListener, l); } + /** + * Adds the specified listener to this component. + * + * @param listener The new listener to add. + */ public synchronized void addMouseMotionListener(MouseMotionListener l) { mouseMotionListener = AWTEventMulticaster.add(mouseMotionListener, l); *************** public abstract class Component implemen *** 958,963 **** --- 1641,1651 ---- enableEvents(AWTEvent.MOUSE_EVENT_MASK); } + /** + * Removes the specified listener from the component. + * + * @param listener The listener to remove. + */ public synchronized void removeMouseMotionListener(MouseMotionListener l) { mouseMotionListener = AWTEventMulticaster.remove(mouseMotionListener, l); *************** public abstract class Component implemen *** 1039,1044 **** --- 1727,1743 ---- // // public InputContext getInputContext() + /** + * Enables the specified events. The events to enable are specified + * by OR-ing together the desired masks from AWTEvent. + *

    + * Events are enabled by default when a listener is attached to the + * component for that event type. This method can be used by subclasses + * to ensure the delivery of a specified event regardless of whether + * or not a listener is attached. + * + * @param enable_events The desired events to enable. + */ protected final void enableEvents(long eventsToEnable) { eventMask |= eventsToEnable; *************** public abstract class Component implemen *** 1056,1061 **** --- 1755,1766 ---- peer.setEventMask (eventMask); } + /** + * Disables the specified events. The events to disable are specified + * by OR-ing together the desired masks from AWTEvent. + * + * @param disable_events The desired events to disable. + */ protected final void disableEvents(long eventsToDisable) { eventMask &= ~eventsToDisable; *************** public abstract class Component implemen *** 1107,1113 **** * +--+ * */ - private PaintEvent coalescePaintEvents(PaintEvent queuedEvent, PaintEvent newEvent) { --- 1812,1817 ---- *************** public abstract class Component implemen *** 1128,1139 **** return newEvent; } ! ! ! ! /** Forward event to the appropriate processXXXEvent method based on the ! * event type. ! */ protected void processEvent(AWTEvent e) { --- 1832,1843 ---- return newEvent; } ! /** ! * Processes the specified event. In this class, this method simply ! * calls one of the more specific event handlers. ! * ! * @param event The event to process. ! */ protected void processEvent(AWTEvent e) { *************** public abstract class Component implemen *** 1168,1174 **** processHierarchyBoundsEvent((HierarchyEvent) e); } } ! protected void processComponentEvent(ComponentEvent e) { if (componentListener == null) --- 1872,1885 ---- processHierarchyBoundsEvent((HierarchyEvent) e); } } ! ! /** ! * Called when a component event is dispatched and component events are ! * enabled. This method passes the event along to any listeners ! * that are attached. ! * ! * @param event The ComponentEvent to process. ! */ protected void processComponentEvent(ComponentEvent e) { if (componentListener == null) *************** public abstract class Component implemen *** 1192,1198 **** break; } } ! protected void processFocusEvent(FocusEvent e) { if (focusListener == null) --- 1903,1916 ---- break; } } ! ! /** ! * Called when a focus event is dispatched and component events are ! * enabled. This method passes the event along to any listeners ! * that are attached. ! * ! * @param event The FocusEvent to process. ! */ protected void processFocusEvent(FocusEvent e) { if (focusListener == null) *************** public abstract class Component implemen *** 1207,1213 **** break; } } ! protected void processKeyEvent(KeyEvent e) { if (keyListener == null) --- 1925,1938 ---- break; } } ! ! /** ! * Called when a key event is dispatched and component events are ! * enabled. This method passes the event along to any listeners ! * that are attached. ! * ! * @param event The KeyEvent to process. ! */ protected void processKeyEvent(KeyEvent e) { if (keyListener == null) *************** public abstract class Component implemen *** 1225,1231 **** break; } } ! protected void processMouseEvent(MouseEvent e) { if (mouseListener == null) --- 1950,1963 ---- break; } } ! ! /** ! * Called when a regular mouse event is dispatched and component events are ! * enabled. This method passes the event along to any listeners ! * that are attached. ! * ! * @param event The MouseEvent to process. ! */ protected void processMouseEvent(MouseEvent e) { if (mouseListener == null) *************** public abstract class Component implemen *** 1250,1255 **** --- 1982,1994 ---- } } + /** + * Called when a mouse motion event is dispatched and component events are + * enabled. This method passes the event along to any listeners + * that are attached. + * + * @param event The MouseMotionEvent to process. + */ protected void processMouseMotionEvent(MouseEvent e) { if (mouseMotionListener == null) *************** public abstract class Component implemen *** 1264,1270 **** break; } } ! /** @since 1.2 */ protected void processInputMethodEvent(InputMethodEvent e) { --- 2003,2009 ---- break; } } ! /** @since 1.2 */ protected void processInputMethodEvent(InputMethodEvent e) { *************** public abstract class Component implemen *** 1328,1404 **** throw new IllegalArgumentException("unknown paint event"); } } ! ! /** @deprecated */ public boolean handleEvent(Event evt) { return false; } ! ! /** @deprecated */ public boolean mouseDown(Event evt, int x, int y) { return false; } ! /** @deprecated */ public boolean mouseDrag(Event evt, int x, int y) { return false; } ! /** @deprecated */ public boolean mouseUp(Event evt, int x, int y) { return false; } ! /** @deprecated */ public boolean mouseMove(Event evt, int x, int y) { return false; } ! /** @deprecated */ public boolean mouseEnter(Event evt, int x, int y) { return false; } ! /** @deprecated */ public boolean mouseExit(Event evt, int x, int y) { return false; } ! /** @deprecated */ public boolean keyDown(Event evt, int key) { return false; } ! /** @deprecated */ public boolean keyUp(Event evt, int key) { return false; } ! /** @deprecated */ public boolean action(Event evt, Object what) { return false; } public void addNotify() { if (peer == null) peer = getToolkit().createComponent(this); - /* Add notify children using a template method, so that it is - possible to ensure that the new event mask delivered to the - peer. */ - addNotifyContainerChildren(); - /* Now that all the children has gotten their peers, we should have the event mask needed for this component and its lightweight subcomponents. */ --- 2067,2185 ---- throw new IllegalArgumentException("unknown paint event"); } } ! ! /** ! * AWT 1.0 event processor. ! * ! * @deprecated Deprecated in favor of processEvent. ! */ public boolean handleEvent(Event evt) { return false; } ! ! /** ! * AWT 1.0 mouse event. ! * ! * @deprecated Deprecated in favor of processMouseEvent(). ! */ public boolean mouseDown(Event evt, int x, int y) { return false; } ! /** ! * AWT 1.0 mouse event. ! * ! * @deprecated Deprecated in favor of processMouseMotionEvent(). ! */ public boolean mouseDrag(Event evt, int x, int y) { return false; } ! /** ! * AWT 1.0 mouse event. ! * ! * @deprecated Deprecated in favor of processMouseEvent(). ! */ public boolean mouseUp(Event evt, int x, int y) { return false; } ! /** ! * AWT 1.0 mouse event. ! * ! * @deprecated Deprecated in favor of processMouseMotionEvent(). ! */ public boolean mouseMove(Event evt, int x, int y) { return false; } ! /** ! * AWT 1.0 mouse event. ! * ! * @deprecated Deprecated in favor of processMouseEvent(). ! */ public boolean mouseEnter(Event evt, int x, int y) { return false; } ! /** ! * AWT 1.0 mouse event. ! * ! * @deprecated Deprecated in favor of processMouseEvent(). ! */ public boolean mouseExit(Event evt, int x, int y) { return false; } ! /** ! * AWT 1.0 key press event. ! * ! * @deprecated Deprecated in favor of processKeyEvent. ! */ public boolean keyDown(Event evt, int key) { return false; } ! /** ! * AWT 1.0 key press event. ! * ! * @deprecated Deprecated in favor of processKeyEvent. ! */ public boolean keyUp(Event evt, int key) { return false; } ! /** ! * AWT 1.0 action event processor. ! * ! * @deprecated Deprecated in favor of the ActionListener ! * interface. ! */ public boolean action(Event evt, Object what) { return false; } + /** + * Called to inform this component it has been added to a container. + * A native peer - if any - is created at this time. This method is + * called automatically by the AWT system and should not be called by + * user level code. + */ public void addNotify() { if (peer == null) peer = getToolkit().createComponent(this); /* Now that all the children has gotten their peers, we should have the event mask needed for this component and its lightweight subcomponents. */ *************** public abstract class Component implemen *** 1411,1421 **** etc. */ } ! void addNotifyContainerChildren() ! { ! // nothing to do unless we're a container ! } ! public void removeNotify() { if (peer != null) --- 2192,2203 ---- etc. */ } ! /** ! * Called to inform this component is has been removed from its ! * container. Its native peer - if any - is destroyed at this time. ! * This method is called automatically by the AWT system and should ! * not be called by user level code. ! */ public void removeNotify() { if (peer != null) *************** public abstract class Component implemen *** 1435,1445 **** --- 2217,2240 ---- return false; } + /** + * Tests whether or not this component is in the group that can + * be traversed using the keyboard traversal mechanism (such as the TAB + * key). + * + * @return true if the component is traversed via the TAB + * key, false otherwise. + */ public boolean isFocusTraversable() { return enabled && visible && (peer == null || peer.isFocusTraversable ()); } + /** + * Requests that this component be given focus. The gotFocus() + * method on this event will be called when and if this request was + * successful. + */ public void requestFocus() { // If there's no peer then this component can't get the focus. We *************** public abstract class Component implemen *** 1457,1462 **** --- 2252,2260 ---- return null; } + /** + * Transfers focus to the next component in the focus traversal order. + */ public void transferFocus() { Component next; *************** public abstract class Component implemen *** 1468,1474 **** next.requestFocus (); } ! /** @deprecated */ public void nextFocus() { transferFocus(); --- 2266,2276 ---- next.requestFocus (); } ! /** ! * AWT 1.0 focus event processor. ! * ! * @deprecated Deprecated in favor of transferFocus(). ! */ public void nextFocus() { transferFocus(); *************** public abstract class Component implemen *** 1480,1485 **** --- 2282,2292 ---- return hasFocus; } + /** + * Adds the specified popup menu to this component. + * + * @param menu The popup menu to be added. + */ public synchronized void add(PopupMenu popup) { if (popups == null) *************** public abstract class Component implemen *** 1487,1497 **** --- 2294,2314 ---- popups.addElement(popup); } + /** + * Removes the specified popup menu from this component. + * + * @param menu The popup menu to remove. + */ public synchronized void remove(MenuComponent popup) { popups.removeElement(popup); } + /** + * Returns a debugging string representing this component. + * + * @return A string representing this component. + */ protected String paramString() { StringBuffer param = new StringBuffer(); *************** public abstract class Component implemen *** 1523,1543 **** --- 2340,2380 ---- return param.toString(); } + /** + * Returns a string representation of this component. + * + * @return A string representation of this component + */ public String toString() { return this.getClass().getName() + "[" + paramString() + "]"; } + /** + * Prints a listing of this component to the standard output. + */ public void list () { list (System.out, 0); } + /** + * Prints a listing of this component to the specified print stream. + * + * @param stream The PrintStream to print to. + */ public void list (PrintStream out) { list (out, 0); } + /** + * Prints a listing of this component to the specified print stream, + * starting at the specified indentation point. + * + * @param stream The PrintStream to print to. + * @param indent The indentation point. + */ public void list (PrintStream out, int indent) { for (int i = 0; i < indent; ++i) *************** public abstract class Component implemen *** 1545,1555 **** --- 2382,2404 ---- out.println (toString ()); } + /** + * Prints a listing of this component to the specified print writer. + * + * @param writer The PrintWrinter to print to. + */ public void list (PrintWriter out) { list (out, 0); } + /** + * Prints a listing of this component to the specified print writer, + * starting at the specified indentation point. + * + * @param writer The PrintWriter to print to. + * @param indent The indentation point. + */ public void list (PrintWriter out, int indent) { for (int i = 0; i < indent; ++i) *************** public abstract class Component implemen *** 1608,1611 **** --- 2457,2485 ---- return accessibleContext; } */ + + /** + * AWT 1.0 focus event processor. + * + * @deprecated Deprecated in favor of processFocusEvent. + + public boolean + gotFocus(Event event, Object what) + { + return(true); + } + */ + + /** + * AWT 1.0 focus event processor. + * + * @deprecated Deprecated in favor of processFocusEvent. + + public boolean + lostFocus(Event event, Object what) + { + return(true); + } + */ + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/ComponentOrientation.java gcc-3.1/libjava/java/awt/ComponentOrientation.java *** gcc-3.0.4/libjava/java/awt/ComponentOrientation.java Wed Aug 9 13:01:43 2000 --- gcc-3.1/libjava/java/awt/ComponentOrientation.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ /* Status: Incomplete. Needs a Locale lookup table. */ --- 1,42 ---- ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! /** ! * @author Bryce McKinlay ! */ /* Status: Incomplete. Needs a Locale lookup table. */ *************** package java.awt; *** 13,19 **** import java.util.Locale; import java.util.ResourceBundle; ! public class ComponentOrientation implements java.io.Serializable { // Here is a wild guess. private static int HORIZONTAL_ID = 1 << 0, --- 45,51 ---- import java.util.Locale; import java.util.ResourceBundle; ! public final class ComponentOrientation implements java.io.Serializable { // Here is a wild guess. private static int HORIZONTAL_ID = 1 << 0, *************** public class ComponentOrientation implem *** 29,35 **** // FIXME: This field is from the serialization spec, but what are the // correct values? int orientation; ! ComponentOrientation(int orientation) { this.orientation = orientation; --- 61,67 ---- // FIXME: This field is from the serialization spec, but what are the // correct values? int orientation; ! ComponentOrientation(int orientation) { this.orientation = orientation; *************** public class ComponentOrientation implem *** 54,60 **** public static ComponentOrientation getOrientation(ResourceBundle bdl) { ComponentOrientation r; ! try { Object obj = bdl.getObject("Orientation"); --- 86,92 ---- public static ComponentOrientation getOrientation(ResourceBundle bdl) { ComponentOrientation r; ! try { Object obj = bdl.getObject("Orientation"); diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Container.java gcc-3.1/libjava/java/awt/Container.java *** gcc-3.0.4/libjava/java/awt/Container.java Wed Jan 3 00:07:13 2001 --- gcc-3.1/libjava/java/awt/Container.java Fri Jan 25 07:04:06 2002 *************** *** 1,10 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt; --- 1,38 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** public class Container extends Component *** 31,51 **** /* Anything else is non-serializable, and should be declared "transient". */ transient ContainerListener containerListener; public Container() { } public int getComponentCount() { return ncomponents; } ! /** @deprecated Use getComponentCount() instead. */ public int countComponents() { return ncomponents; } public Component getComponent (int n) { if (n < 0 || n >= ncomponents) --- 59,104 ---- /* Anything else is non-serializable, and should be declared "transient". */ transient ContainerListener containerListener; + /** + * Default constructor for subclasses. + */ public Container() { } + /** + * Returns the number of components in this container. + * + * @return The number of components in this container. + */ public int getComponentCount() { return ncomponents; } ! /** ! * Returns the number of components in this container. ! * ! * @return The number of components in this container. ! * ! * @deprecated This method is deprecated in favor of ! * getComponentCount(). ! */ public int countComponents() { return ncomponents; } + /** + * Returns the component at the specified index. + * + * @param index The index of the component to retrieve. + * + * @return The requested component. + * + * @exception ArrayIndexOutOfBoundsException If the specified index is not + * valid. + */ public Component getComponent (int n) { if (n < 0 || n >= ncomponents) *************** public class Container extends Component *** 53,58 **** --- 106,116 ---- return component[n]; } + /** + * Returns an array of the components in this container. + * + * @return The components in this container. + */ public Component[] getComponents() { Component[] result = new Component[ncomponents]; *************** public class Container extends Component *** 61,111 **** return result; } public Insets getInsets() { if (peer == null) ! return new Insets(0, 0, 0, 0); ! return ((ContainerPeer) peer).getInsets(); } ! /** @deprecated Use getInsets() instead. */ public Insets insets() { return getInsets(); } ! public Component add (Component comp) { addImpl (comp, null, -1); return comp; } public Component add (String name, Component comp) { addImpl (comp, name, -1); return comp; } public Component add (Component comp, int index) { addImpl (comp, null, index); return comp; } public void add (Component comp, Object constraints) { addImpl (comp, constraints, -1); } public void add (Component comp, Object constraints, int index) { addImpl (comp, constraints, index); } protected void addImpl (Component comp, Object constraints, int index) { if (index > ncomponents || comp instanceof Window || (comp instanceof Container && ((Container) comp).isAncestorOf (this))) --- 119,248 ---- return result; } + /** + * Returns the insets for this container, which is the space used for + * borders, the margin, etc. + * + * @return The insets for this container. + */ public Insets getInsets() { if (peer == null) ! return new Insets(0, 0, 0, 0); return ((ContainerPeer) peer).getInsets(); } ! /** ! * Returns the insets for this container, which is the space used for ! * borders, the margin, etc. ! * ! * @return The insets for this container. ! * ! * @deprecated This method is deprecated in favor of ! * getInsets(). ! */ public Insets insets() { return getInsets(); } ! ! /** ! * Adds the specified component to this container at the end of the ! * component list. ! * ! * @param component The component to add to the container. ! * ! * @return The same component that was added. ! */ public Component add (Component comp) { addImpl (comp, null, -1); return comp; } + /** + * Adds the specified component to the container at the end of the + * component list. This method should not be used. Instead, use + * add(Component, Object. + * + * @param name FIXME + * @param component The component to be added. + * + * @return The same component that was added. + */ public Component add (String name, Component comp) { addImpl (comp, name, -1); return comp; } + /** + * Adds the specified component to this container at the specified index + * in the component list. + * + * @param component The component to be added. + * @param index The index in the component list to insert this child + * at, or -1 to add at the end of the list. + * + * @return The same component that was added. + * + * @param throws ArrayIndexOutOfBounds If the specified index is invalid. + */ public Component add (Component comp, int index) { addImpl (comp, null, index); return comp; } + /** + * Adds the specified component to this container at the end of the + * component list. The layout manager will use the specified constraints + * when laying out this component. + * + * @param component The component to be added to this container. + * @param constraints The layout constraints for this component. + */ public void add (Component comp, Object constraints) { addImpl (comp, constraints, -1); } + /** + * Adds the specified component to this container at the specified index + * in the component list. The layout manager will use the specified + * constraints when layout out this component. + * + * @param component The component to be added. + * @param constraints The layout constraints for this component. + * @param index The index in the component list to insert this child + * at, or -1 to add at the end of the list. + * + * @param throws ArrayIndexOutOfBounds If the specified index is invalid. + */ public void add (Component comp, Object constraints, int index) { addImpl (comp, constraints, index); } + /** + * This method is called by all the add() methods to perform + * the actual adding of the component. Subclasses who wish to perform + * their own processing when a component is added should override this + * method. Any subclass doing this must call the superclass version of + * this method in order to ensure proper functioning of the container. + * + * @param component The component to be added. + * @param constraints The layout constraints for this component, or + * null if there are no constraints. + * @param index The index in the component list to insert this child + * at, or -1 to add at the end of the list. + * + * @param throws ArrayIndexOutOfBounds If the specified index is invalid. + */ protected void addImpl (Component comp, Object constraints, int index) { if (index > ncomponents + || (index < 0 && index != -1) || comp instanceof Window || (comp instanceof Container && ((Container) comp).isAncestorOf (this))) *************** public class Container extends Component *** 151,171 **** // Notify the layout manager. if (layoutMgr != null) { ! if (constraints != null && layoutMgr instanceof LayoutManager2) { LayoutManager2 lm2 = (LayoutManager2) layoutMgr; lm2.addLayoutComponent (comp, constraints); } ! else layoutMgr.addLayoutComponent ((String) constraints, comp); } ContainerEvent ce = new ContainerEvent (this, ContainerEvent.COMPONENT_ADDED, comp); ! dispatchEvent (ce); } public void remove (int index) { Component r = component[index]; --- 288,316 ---- // Notify the layout manager. if (layoutMgr != null) { ! if (layoutMgr instanceof LayoutManager2) { LayoutManager2 lm2 = (LayoutManager2) layoutMgr; lm2.addLayoutComponent (comp, constraints); } ! else if (constraints instanceof String) layoutMgr.addLayoutComponent ((String) constraints, comp); + else + layoutMgr.addLayoutComponent (null, comp); } + // Post event to notify of adding the container. ContainerEvent ce = new ContainerEvent (this, ContainerEvent.COMPONENT_ADDED, comp); ! getToolkit().getSystemEventQueue().postEvent(ce); } + /** + * Removes the component at the specified index from this container. + * + * @param index The index of the component to remove. + */ public void remove (int index) { Component r = component[index]; *************** public class Container extends Component *** 181,192 **** if (layoutMgr != null) layoutMgr.removeLayoutComponent (r); ContainerEvent ce = new ContainerEvent (this, ContainerEvent.COMPONENT_REMOVED, r); ! dispatchEvent (ce); } public void remove (Component comp) { for (int i = 0; i < ncomponents; ++i) --- 326,343 ---- if (layoutMgr != null) layoutMgr.removeLayoutComponent (r); + // Post event to notify of adding the container. ContainerEvent ce = new ContainerEvent (this, ContainerEvent.COMPONENT_REMOVED, r); ! getToolkit().getSystemEventQueue().postEvent(ce); } + /** + * Removes the specified component from this container. + * + * @return component The component to remove from this container. + */ public void remove (Component comp) { for (int i = 0; i < ncomponents; ++i) *************** public class Container extends Component *** 199,249 **** } } public void removeAll() { while (ncomponents > 0) remove (0); } public LayoutManager getLayout() { return layoutMgr; } public void setLayout(LayoutManager mgr) { layoutMgr = mgr; invalidate (); } public void doLayout() { if (layoutMgr != null) layoutMgr.layoutContainer (this); } ! /** @deprecated Use doLayout() instead. */ public void layout() { doLayout(); } public void invalidate() { super.invalidate (); } public void validate() { ! if (! isValid ()) { ! validateTree (); } } protected void validateTree() { ! if (valid) return; ContainerPeer cPeer = null; if ((peer != null) && !(peer instanceof LightweightPeer)) --- 350,438 ---- } } + /** + * Removes all components from this container. + */ public void removeAll() { while (ncomponents > 0) remove (0); } + /** + * Returns the current layout manager for this container. + * + * @return The layout manager for this container. + */ public LayoutManager getLayout() { return layoutMgr; } + /** + * Sets the layout manager for this container to the specified layout + * manager. + * + * @param mgr The new layout manager for this container. + */ public void setLayout(LayoutManager mgr) { layoutMgr = mgr; invalidate (); } + /** + * Layout the components in this container. + */ public void doLayout() { if (layoutMgr != null) layoutMgr.layoutContainer (this); } ! /** ! * Layout the components in this container. ! * ! * @deprecated This method is deprecated in favor of ! * doLayout(). ! */ public void layout() { doLayout(); } + /** + * Invalidates this container to indicate that it (and all parent + * containers) need to be laid out. + */ public void invalidate() { super.invalidate (); } + /** + * Re-lays out the components in this container. + */ public void validate() { ! // FIXME: use the tree lock? ! synchronized (this) { ! if (! isValid ()) ! { ! validateTree (); ! } } } + /** + * Recursively validates the container tree, recomputing any invalid + * layouts. + */ protected void validateTree() { ! if (valid) ! return; ContainerPeer cPeer = null; if ((peer != null) && !(peer instanceof LightweightPeer)) *************** public class Container extends Component *** 256,271 **** for (int i = 0; i < ncomponents; ++i) { Component comp = component[i]; ! if (comp instanceof Container) ! { ! ((Container) comp).validateTree(); ! } ! else { ! component[i].validate(); } } ! /* children will call invalidate() when they are layed out. It is therefore imporant that valid is not set to true before after the children has been layed out. */ --- 445,463 ---- for (int i = 0; i < ncomponents; ++i) { Component comp = component[i]; ! if (! comp.isValid ()) { ! if (comp instanceof Container) ! { ! ((Container) comp).validateTree(); ! } ! else ! { ! component[i].validate(); ! } } } ! /* children will call invalidate() when they are layed out. It is therefore imporant that valid is not set to true before after the children has been layed out. */ *************** public class Container extends Component *** 281,286 **** --- 473,483 ---- // FIXME, should invalidate all children with font == null } + /** + * Returns the preferred size of this container. + * + * @return The preferred size of this container. + */ public Dimension getPreferredSize() { if (layoutMgr != null) *************** public class Container extends Component *** 288,300 **** else return super.getPreferredSize (); } ! ! /** @deprecated Use getPreferredSize() instead */ public Dimension preferredSize() { return getPreferredSize(); } ! public Dimension getMinimumSize() { if (layoutMgr != null) --- 485,509 ---- else return super.getPreferredSize (); } ! ! /** ! * Returns the preferred size of this container. ! * ! * @return The preferred size of this container. ! * ! * @deprecated This method is deprecated in favor of ! * getPreferredSize(). ! */ public Dimension preferredSize() { return getPreferredSize(); } ! ! /** ! * Returns the minimum size of this container. ! * ! * @return The minimum size of this container. ! */ public Dimension getMinimumSize() { if (layoutMgr != null) *************** public class Container extends Component *** 302,314 **** else return super.getMinimumSize (); } ! ! /** @deprecated Use getMinimumSize() instead */ public Dimension minimumSize() { return getMinimumSize(); } ! public Dimension getMaximumSize() { if (layoutMgr != null && layoutMgr instanceof LayoutManager2) --- 511,535 ---- else return super.getMinimumSize (); } ! ! /** ! * Returns the minimum size of this container. ! * ! * @return The minimum size of this container. ! * ! * @deprecated This method is deprecated in favor of ! * getMinimumSize(). ! */ public Dimension minimumSize() { return getMinimumSize(); } ! ! /** ! * Returns the maximum size of this container. ! * ! * @return The maximum size of this container. ! */ public Dimension getMaximumSize() { if (layoutMgr != null && layoutMgr instanceof LayoutManager2) *************** public class Container extends Component *** 320,325 **** --- 541,553 ---- return super.getMaximumSize (); } + /** + * Returns the preferred alignment along the X axis. This is a value + * between 0 and 1 where 0 represents alignment flush left and + * 1 means alignment flush right, and 0.5 means centered. + * + * @return The preferred alignment along the X axis. + */ public float getAlignmentX() { if (layoutMgr instanceof LayoutManager2) *************** public class Container extends Component *** 328,336 **** return lm2.getLayoutAlignmentX (this); } else ! return CENTER_ALIGNMENT; } public float getAlignmentY() { if (layoutMgr instanceof LayoutManager2) --- 556,571 ---- return lm2.getLayoutAlignmentX (this); } else ! return super.getAlignmentX(); } + /** + * Returns the preferred alignment along the Y axis. This is a value + * between 0 and 1 where 0 represents alignment flush top and + * 1 means alignment flush bottom, and 0.5 means centered. + * + * @return The preferred alignment along the Y axis. + */ public float getAlignmentY() { if (layoutMgr instanceof LayoutManager2) *************** public class Container extends Component *** 339,347 **** return lm2.getLayoutAlignmentY (this); } else ! return CENTER_ALIGNMENT; } public void paint(Graphics g) { if (!isShowing()) --- 574,591 ---- return lm2.getLayoutAlignmentY (this); } else ! return super.getAlignmentY(); } + /** + * Paints this container. The implementation of this method in this + * class forwards to any lightweight components in this container. If + * this method is subclassed, this method should still be invoked as + * a superclass method so that lightweight components are properly + * drawn. + * + * @param graphics The graphics context for this paint job. + */ public void paint(Graphics g) { if (!isShowing()) *************** public class Container extends Component *** 365,371 **** * be visited. */ private void visitChildren(Graphics gfx, GfxVisitor visitor, ! boolean lightweightOnly) { // FIXME: do locking --- 609,615 ---- * be visited. */ private void visitChildren(Graphics gfx, GfxVisitor visitor, ! boolean lightweightOnly) { // FIXME: do locking *************** public class Container extends Component *** 408,436 **** visitor.visit(comp, gfx2); } public void update(Graphics g) { super.update(g); } public void print(Graphics g) { super.print(g); visitChildren(g, GfxPrintVisitor.INSTANCE, true); } public void paintComponents(Graphics g) { super.paint(g); visitChildren(g, GfxPaintAllVisitor.INSTANCE, true); } public void printComponents(Graphics g) { super.paint(g); visitChildren(g, GfxPrintAllVisitor.INSTANCE, true); } ! void dispatchEventImpl(AWTEvent e) { if ((e.id <= ContainerEvent.CONTAINER_LAST --- 652,708 ---- visitor.visit(comp, gfx2); } + /** + * Updates this container. The implementation of this method in this + * class forwards to any lightweight components in this container. If + * this method is subclassed, this method should still be invoked as + * a superclass method so that lightweight components are properly + * drawn. + * + * @param graphics The graphics context for this update. + */ public void update(Graphics g) { super.update(g); } + /** + * Prints this container. The implementation of this method in this + * class forwards to any lightweight components in this container. If + * this method is subclassed, this method should still be invoked as + * a superclass method so that lightweight components are properly + * drawn. + * + * @param graphics The graphics context for this print job. + */ public void print(Graphics g) { super.print(g); visitChildren(g, GfxPrintVisitor.INSTANCE, true); } + /** + * Paints all of the components in this container. + * + * @param graphics The graphics context for this paint job. + */ public void paintComponents(Graphics g) { super.paint(g); visitChildren(g, GfxPaintAllVisitor.INSTANCE, true); } + /** + * Prints all of the components in this container. + * + * @param graphics The graphics context for this print job. + */ public void printComponents(Graphics g) { super.paint(g); visitChildren(g, GfxPrintAllVisitor.INSTANCE, true); } ! void dispatchEventImpl(AWTEvent e) { if ((e.id <= ContainerEvent.CONTAINER_LAST *************** public class Container extends Component *** 438,452 **** && (containerListener != null || (eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0)) processEvent(e); ! else super.dispatchEventImpl(e); } ! public void addContainerListener(ContainerListener l) { containerListener = AWTEventMulticaster.add (containerListener, l); } ! public void removeContainerListener(ContainerListener l) { containerListener = AWTEventMulticaster.remove(containerListener, l); } --- 710,737 ---- && (containerListener != null || (eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0)) processEvent(e); ! else ! super.dispatchEventImpl(e); } ! /** ! * Adds the specified container listener to this object's list of ! * container listeners. ! * ! * @param listener The listener to add. ! */ ! public synchronized void addContainerListener(ContainerListener l) { containerListener = AWTEventMulticaster.add (containerListener, l); } ! /** ! * Removes the specified container listener from this object's list of ! * container listeners. ! * ! * @param listener The listener to remove. ! */ ! public synchronized void removeContainerListener(ContainerListener l) { containerListener = AWTEventMulticaster.remove(containerListener, l); } *************** public class Container extends Component *** 458,492 **** return getListenersImpl(listenerType, containerListener); else return super.getListeners(listenerType); } ! protected void processEvent(AWTEvent e) { if (e instanceof ContainerEvent) processContainerEvent((ContainerEvent) e); else super.processEvent(e); } ! protected void processContainerEvent(ContainerEvent e) { if (containerListener == null) return; switch (e.id) { ! case ContainerEvent.COMPONENT_ADDED: ! containerListener.componentAdded(e); break; ! case ContainerEvent.COMPONENT_REMOVED: ! containerListener.componentRemoved(e); break; } } ! /** @deprecated */ public void deliverEvent(Event e) { } ! public Component getComponentAt (int x, int y) { if (! contains (x, y)) --- 743,812 ---- return getListenersImpl(listenerType, containerListener); else return super.getListeners(listenerType); } ! ! /** ! * Processes the specified event. This method calls ! * processContainerEvent() if this method is a ! * ContainerEvent, otherwise it calls the superclass ! * method. ! * ! * @param event The event to be processed. ! */ protected void processEvent(AWTEvent e) { if (e instanceof ContainerEvent) processContainerEvent((ContainerEvent) e); else super.processEvent(e); } ! ! /** ! * Called when a container event occurs if container events are enabled. ! * This method calls any registered listeners. ! * ! * @param event The event that occurred. ! */ protected void processContainerEvent(ContainerEvent e) { if (containerListener == null) return; switch (e.id) { ! case ContainerEvent.COMPONENT_ADDED: ! containerListener.componentAdded(e); break; ! case ContainerEvent.COMPONENT_REMOVED: ! containerListener.componentRemoved(e); break; } } ! /** ! * AWT 1.0 event processor. ! * ! * @param event The event that occurred. ! * ! * @deprecated This method is deprecated in favor of ! * dispatchEvent(). ! */ public void deliverEvent(Event e) { } ! ! /** ! * Returns the component located at the specified point. This is done ! * by checking whether or not a child component claims to contain this ! * point. The first child component that does is returned. If no ! * child component claims the point, the container itself is returned, ! * unless the point does not exist within this container, in which ! * case null is returned. ! * ! * @param x The X coordinate of the point. ! * @param y The Y coordinate of the point. ! * ! * @return The component containing the specified point, or ! * null if there is no such point. ! */ public Component getComponentAt (int x, int y) { if (! contains (x, y)) *************** public class Container extends Component *** 505,516 **** return this; } ! /** @deprecated Use getComponentAt() instead */ public Component locate(int x, int y) { return getComponentAt(x, y); } public Component getComponentAt(Point p) { return getComponentAt(p.x, p.y); --- 825,864 ---- return this; } ! /** ! * Returns the component located at the specified point. This is done ! * by checking whether or not a child component claims to contain this ! * point. The first child component that does is returned. If no ! * child component claims the point, the container itself is returned, ! * unless the point does not exist within this container, in which ! * case null is returned. ! * ! * @param point The point to return the component at. ! * ! * @return The component containing the specified point, or null ! * if there is no such point. ! * ! * @deprecated This method is deprecated in favor of ! * getComponentAt(int, int). ! */ public Component locate(int x, int y) { return getComponentAt(x, y); } + /** + * Returns the component located at the specified point. This is done + * by checking whether or not a child component claims to contain this + * point. The first child component that does is returned. If no + * child component claims the point, the container itself is returned, + * unless the point does not exist within this container, in which + * case null is returned. + * + * @param point The point to return the component at. + * + * @return The component containing the specified point, or null + * if there is no such point. + */ public Component getComponentAt(Point p) { return getComponentAt(p.x, p.y); *************** public class Container extends Component *** 550,561 **** return findComponentAt(p.x, p.y); } public void addNotify () { super.addNotify(); } ! void addNotifyContainerChildren() { for (int i = ncomponents; --i >= 0; ) { --- 898,915 ---- return findComponentAt(p.x, p.y); } + /** + * Called when this container is added to another container to inform it + * to create its peer. Peers for any child components will also be + * created. + */ public void addNotify () { + addNotifyContainerChildren (); super.addNotify(); } ! private void addNotifyContainerChildren() { for (int i = ncomponents; --i >= 0; ) { *************** public class Container extends Component *** 565,570 **** --- 919,929 ---- } } + /** + * Called when this container is removed from its parent container to + * inform it to destroy its peer. This causes the peers of all child + * component to be destroyed as well. + */ public void removeNotify() { for (int i = 0; i < ncomponents; ++i) *************** public class Container extends Component *** 572,577 **** --- 931,945 ---- super.removeNotify(); } + /** + * Tests whether or not the specified component is contained within + * this components subtree. + * + * @param component The component to test. + * + * @return true if this container is an ancestor of the + * specified component, false. + */ public boolean isAncestorOf (Component comp) { for (;;) *************** public class Container extends Component *** 584,589 **** --- 952,963 ---- } } + /** + * Returns a string representing the state of this container for + * debugging purposes. + * + * @return A string representing the state of this container. + */ protected String paramString() { String param = super.paramString(); *************** public class Container extends Component *** 592,598 **** return param; } ! public void list (PrintStream out, int indent) { super.list (out, indent); --- 966,979 ---- return param; } ! ! /** ! * Writes a listing of this container to the specified stream starting ! * at the specified indentation point. ! * ! * @param stream The PrintStream to write to. ! * @param indent The indentation point. ! */ public void list (PrintStream out, int indent) { super.list (out, indent); *************** public class Container extends Component *** 600,605 **** --- 981,993 ---- component[i].list (out, indent + 2); } + /** + * Writes a listing of this container to the specified stream starting + * at the specified indentation point. + * + * @param stream The PrintWriter to write to. + * @param indent The indentation point. + */ public void list(PrintWriter out, int indent) { super.list (out, indent); diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Cursor.java gcc-3.1/libjava/java/awt/Cursor.java *** gcc-3.0.4/libjava/java/awt/Cursor.java Thu Jan 11 17:49:47 2001 --- gcc-3.1/libjava/java/awt/Cursor.java Tue Jan 22 22:58:08 2002 *************** *** 1,39 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.awt; ! /* A somewhat incomplete placeholder. */ public class Cursor implements java.io.Serializable { ! public static final int DEFAULT_CURSOR = 0, ! CROSSHAIR_CURSOR = 1, ! TEXT_CURSOR = 2, ! WAIT_CURSOR = 3, ! SW_RESIZE_CURSOR = 4, ! SE_RESIZE_CURSOR = 5, ! NW_RESIZE_CURSOR = 6, ! NE_RESIZE_CURSOR = 7, ! N_RESIZE_CURSOR = 8, ! S_RESIZE_CURSOR = 9, ! W_RESIZE_CURSOR = 10, ! E_RESIZE_CURSOR = 11, ! HAND_CURSOR = 12, ! MOVE_CURSOR = 13, ! CUSTOM_CURSOR = 0xFFFFFFFF; private static final int PREDEFINED_COUNT = 14; protected static Cursor[] predefined = new Cursor[PREDEFINED_COUNT]; protected String name; int type; public Cursor(int type) { if (type < 0 || type >= PREDEFINED_COUNT) --- 1,137 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt; + + /** + * This class represents various predefined cursor types. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public class Cursor implements java.io.Serializable { ! /** ! * Constant for the system default cursor type ! */ ! public static final int DEFAULT_CURSOR = 0; ! ! /** ! * Constant for a cross-hair cursor. ! */ ! public static final int CROSSHAIR_CURSOR = 1; ! ! /** ! * Constant for a cursor over a text field. ! */ ! public static final int TEXT_CURSOR = 2; ! ! /** ! * Constant for a cursor to display while waiting for an action to complete. ! */ ! public static final int WAIT_CURSOR = 3; ! ! /** ! * Cursor used over SW corner of window decorations. ! */ ! public static final int SW_RESIZE_CURSOR = 4; ! ! /** ! * Cursor used over SE corner of window decorations. ! */ ! public static final int SE_RESIZE_CURSOR = 5; ! ! /** ! * Cursor used over NW corner of window decorations. ! */ ! public static final int NW_RESIZE_CURSOR = 6; ! ! /** ! * Cursor used over NE corner of window decorations. ! */ ! public static final int NE_RESIZE_CURSOR = 7; ! ! /** ! * Cursor used over N edge of window decorations. ! */ ! public static final int N_RESIZE_CURSOR = 8; ! ! /** ! * Cursor used over S edge of window decorations. ! */ ! public static final int S_RESIZE_CURSOR = 9; ! ! /** ! * Cursor used over W edge of window decorations. ! */ ! public static final int W_RESIZE_CURSOR = 10; ! ! /** ! * Cursor used over E edge of window decorations. ! */ ! public static final int E_RESIZE_CURSOR = 11; ! ! /** ! * Constant for a hand cursor. ! */ ! public static final int HAND_CURSOR = 12; ! ! /** ! * Constant for a cursor used during window move operations. ! */ ! public static final int MOVE_CURSOR = 13; ! ! public static final int CUSTOM_CURSOR = 0xFFFFFFFF; private static final int PREDEFINED_COUNT = 14; protected static Cursor[] predefined = new Cursor[PREDEFINED_COUNT]; protected String name; + + /** + * @serial The numeric id of this cursor. + */ int type; + /** + * Initializes a new instance of Cursor with the specified + * type. + * + * @param type The cursor type. + */ public Cursor(int type) { if (type < 0 || type >= PREDEFINED_COUNT) *************** public class Cursor implements java.io.S *** 43,56 **** } /** This constructor is used internally only. ! * Application code should call Toolkit.createCustomCursor(). ! */ protected Cursor(String name) { this.name = name; this.type = CUSTOM_CURSOR; } public static Cursor getPredefinedCursor(int type) { if (type < 0 || type >= PREDEFINED_COUNT) --- 141,165 ---- } /** This constructor is used internally only. ! * Application code should call Toolkit.createCustomCursor(). ! */ protected Cursor(String name) { this.name = name; this.type = CUSTOM_CURSOR; } + /** + * Returns an instance of Cursor for one of the specified + * predetermined types. + * + * @param type The type contant from this class. + * + * @return The requested predefined cursor. + * + * @exception IllegalArgumentException If the constant is not one of the + * predefined cursor type constants from this class. + */ public static Cursor getPredefinedCursor(int type) { if (type < 0 || type >= PREDEFINED_COUNT) *************** public class Cursor implements java.io.S *** 67,77 **** return null; } public static Cursor getDefaultCursor() { ! return getPredefinedCursor(0); } public int getType() { return type; --- 176,196 ---- return null; } + /** + * Returns an instance of the system default cursor type. + * + * @return The system default cursor. + */ public static Cursor getDefaultCursor() { ! return getPredefinedCursor(DEFAULT_CURSOR); } + /** + * Returns the numeric type identifier for this cursor. + * + * @return The cursor id. + */ public int getType() { return type; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Dialog.java gcc-3.1/libjava/java/awt/Dialog.java *** gcc-3.0.4/libjava/java/awt/Dialog.java Thu Aug 3 12:09:38 2000 --- gcc-3.1/libjava/java/awt/Dialog.java Tue Jan 22 22:58:08 2002 *************** *** 1,20 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! /* A very incomplete placeholder. */ ! public class Dialog extends Window { ! public Dialog (Frame owner) ! { ! super(owner); ! // FIXME ! } } --- 1,314 ---- ! /* Dialog.java -- An AWT dialog box ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.DialogPeer; ! import java.awt.peer.WindowPeer; ! import java.awt.peer.ContainerPeer; ! import java.awt.peer.ComponentPeer; ! /** ! * A dialog box widget class. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class Dialog extends Window implements java.io.Serializable { ! ! /* ! * Static Variables ! */ ! ! // Serialization constant ! private static final long serialVersionUID = 5920926903803293709L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial Indicates whether or not this dialog box is modal. ! */ ! private boolean modal; ! ! /** ! * @serial Indicates whether or not this dialog box is resizable. ! */ ! private boolean resizable; ! ! /** ! * @serial The title string for this dialog box, which can be ! * null. ! */ ! private String title; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Dialog with the specified ! * parent, that is not resizable and not modal, and which has no title. ! * ! * @param parent The parent frame of this dialog box. ! */ ! public ! Dialog(Frame parent) ! { ! this(parent, "", false); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of Dialog with the specified ! * parent and modality, that is not resizable and which has no title. ! * ! * @param parent The parent frame of this dialog box. ! * @param modal if this dialog box is modal, false ! * otherwise. ! */ ! public ! Dialog(Frame parent, boolean modal) ! { ! this(parent, "", modal); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of Dialog with the specified ! * parent, that is not resizable and not modal, and which has the specified ! * title. ! * ! * @param parent The parent frame of this dialog box. ! * @param title The title string for this dialog box. ! */ ! public ! Dialog(Frame parent, String title) ! { ! this(parent, title, false); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of Dialog with the specified, ! * parent, title, and modality, that is not resizable. ! * ! * @param parent The parent frame of this dialog box. ! * @param title The title string for this dialog box. ! * @param modal if this dialog box is modal, false ! * otherwise. ! */ ! public ! Dialog(Frame parent, String title, boolean modal) ! { ! super(parent); ! ! this.title = title; ! this.modal = modal; ! resizable = false; ! ! setLayout(new BorderLayout()); } + + public + Dialog (Dialog owner) + { + this (owner, "", false); + } + + public + Dialog (Dialog owner, String title) + { + this (owner, title, false); + } + + public + Dialog (Dialog owner, String title, boolean modal) + { + super (owner); + this.modal = modal; + this.title = title; + setLayout (new BorderLayout ()); + } + + /*************************************************************************/ + + /* + * Instance Variables + */ + + /** + * Returns the title of this dialog box. + * + * @return The title of this dialog box. + */ + public String + getTitle() + { + return(title); + } + + /*************************************************************************/ + + /** + * Sets the title of this dialog box to the specified string. + * + * @param title The new title. + */ + public synchronized void + setTitle(String title) + { + this.title = title; + if (peer != null) + { + DialogPeer d = (DialogPeer) peer; + d.setTitle (title); + } + } + + /*************************************************************************/ + + /** + * Tests whether or not this dialog box is modal. + * + * @return true if this dialog box is modal, + * false otherwise. + */ + public boolean + isModal() + { + return(modal); + } + + /*************************************************************************/ + + /** + * Changes the modality of this dialog box. This can only be done before + * the peer is created. + * + * @param modal true to make this dialog box modal, + * false to make it non-modal. + */ + public void + setModal(boolean modal) + { + this.modal = modal; + } + + /*************************************************************************/ + + /** + * Tests whether or not this dialog box is resizable. + * + * @return true if this dialog is resizable, false, + * otherwise. + */ + public boolean + isResizable() + { + return(resizable); + } + + /*************************************************************************/ + + /** + * Changes the resizability of this dialog box. + * + * @param resizable true to make this dialog resizable, + * false to make it non-resizable. + */ + public synchronized void + setResizable(boolean resizable) + { + this.resizable = resizable; + if (peer != null) + { + DialogPeer d = (DialogPeer) peer; + d.setResizable (resizable); + } + } + + /*************************************************************************/ + + /** + * Creates this object's native peer. + */ + public synchronized void + addNotify() + { + if (peer == null) + peer = getToolkit ().createDialog (this); + super.addNotify (); + } + + /*************************************************************************/ + + /** + * Makes this dialog visible and brings it to the front. + */ + public void + show() + { + super.show(); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this component. + * + * @return A debugging string for this component. + */ + protected String + paramString() + { + return ("title+" + title + ",modal=" + modal + + ",resizable=" + resizable + "," + super.paramString()); + } + + } // class Dialog + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Dimension.java gcc-3.1/libjava/java/awt/Dimension.java *** gcc-3.0.4/libjava/java/awt/Dimension.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/Dimension.java Tue Jan 22 22:40:04 2002 *************** *** 1,17 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ ! package java.awt; ! /** ! * @author Per Bothner ! * @date Fenruary 8, 1999. ! */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. --- 1,41 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.awt; /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. *************** package java.awt; *** 19,44 **** * has not been compared with JDK output. */ public class Dimension extends java.awt.geom.Dimension2D implements java.io.Serializable { ! public int height; public int width; public Dimension () { } public Dimension (Dimension dim) { this.width = dim.width; this.height = dim.height; } public Dimension (int width, int height) { this.width = width; this.height = height; } public boolean equals (Object obj) { if (! (obj instanceof Dimension)) --- 43,114 ---- * has not been compared with JDK output. */ + /** + * This class holds a width and height value pair. + * + * @author Per Bothner + * @author Aaron M. Renn (arenn@urbanophile.com) + * @date Fenruary 8, 1999. + */ public class Dimension extends java.awt.geom.Dimension2D implements java.io.Serializable { ! /** ! * This width of this object. ! */ public int width; + /** + * The height of this object. + */ + public int height; + + /** + * Initializes a new instance of Dimension with a width + * and height of zero. + */ public Dimension () { } + /** + * Initializes a new instance of Dimension to have a width + * and height identical to that of the specified dimension object. + * + * @param dim The Dimension to take the width and height from. + */ public Dimension (Dimension dim) { this.width = dim.width; this.height = dim.height; } + /** + * Initializes a new instance of Dimension with the + * specified width and height. + * + * @param width The width of this object. + * @param height The height of this object. + */ public Dimension (int width, int height) { this.width = width; this.height = height; } + /** + * Tests this object for equality against the specified object. This will + * be true if and only if the specified object: + *

    + *

      + *
    • Is not null. + *
    • Is an instance of Dimension. + *
    • Has width and height values identical to this object. + *
    + * + * @param obj The object to test against. + * + * @return true if the specified object is equal to this + * object, false otherwise. + */ public boolean equals (Object obj) { if (! (obj instanceof Dimension)) *************** public class Dimension extends java.awt. *** 47,66 **** --- 117,159 ---- return height == dim.height && width == dim.width; } + /** + * Returns the size of this object. Not very useful. + * + * @return This object. + */ public Dimension getSize () { return new Dimension(this); } + /** + * Sets the width and height of this object to match that of the + * specified object. + * + * @param dim The Dimension object to get the new width and + * height from. + */ public void setSize (Dimension dim) { this.width = dim.width; this.height = dim.height; } + /** + * Sets the width and height of this object to the specified values. + * + * @param width The new width value. + * @param height The new height value. + */ public void setSize (int width, int height) { this.width = width; this.height = height; } + /** + * Returns a string representation of this object. + * + * @return A string representation of this object. + */ public String toString () { return "Dimension[w:"+width+",h:"+height+']'; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Event.java gcc-3.1/libjava/java/awt/Event.java *** gcc-3.0.4/libjava/java/awt/Event.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/Event.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; --- 1,39 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/EventDispatchThread.java gcc-3.1/libjava/java/awt/EventDispatchThread.java *** gcc-3.0.4/libjava/java/awt/EventDispatchThread.java Sun Oct 22 17:46:09 2000 --- gcc-3.1/libjava/java/awt/EventDispatchThread.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ /** @author Bryce McKinlay */ --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ /** @author Bryce McKinlay */ diff -Nrc3pad gcc-3.0.4/libjava/java/awt/EventQueue.java gcc-3.1/libjava/java/awt/EventQueue.java *** gcc-3.0.4/libjava/java/awt/EventQueue.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/EventQueue.java Tue Jan 22 22:40:04 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,39 ---- ! /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** import java.lang.reflect.InvocationTarge *** 18,30 **** * Status: Believed complete, but untested. Check FIXME's. */ ! /** @author Bryce McKinlay */ ! public class EventQueue { private static final int INITIAL_QUEUE_DEPTH = 8; private AWTEvent[] queue = new AWTEvent[INITIAL_QUEUE_DEPTH]; ! private int next_in = 0; // Index where next event will be added to queue private int next_out = 0; // Index of next event to be removed from queue --- 47,65 ---- * Status: Believed complete, but untested. Check FIXME's. */ ! /** ! * This class manages a queue of AWTEvent objects that ! * are posted to it. The AWT system uses only one event queue for all ! * events. ! * ! * @author Bryce McKinlay ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public class EventQueue { private static final int INITIAL_QUEUE_DEPTH = 8; private AWTEvent[] queue = new AWTEvent[INITIAL_QUEUE_DEPTH]; ! private int next_in = 0; // Index where next event will be added to queue private int next_out = 0; // Index of next event to be removed from queue *************** public class EventQueue *** 33,72 **** private EventDispatchThread dispatchThread = new EventDispatchThread(this); public EventQueue() { } ! public synchronized AWTEvent getNextEvent() throws InterruptedException { if (next != null) return next.getNextEvent(); ! while (next_in == next_out) wait(); ! AWTEvent res = queue[next_out]; ! if (++next_out == queue.length) next_out = 0; return res; } ! ! /** @specnote Does not block. Returns null if there are no events on the * queue. */ public synchronized AWTEvent peekEvent() { if (next != null) return next.peekEvent(); ! if (next_in != next_out) return queue[next_out]; else return null; } ! ! /** @specnote Does not block. Returns null if there are no matching events * on the queue. */ public synchronized AWTEvent peekEvent(int id) --- 68,135 ---- private EventDispatchThread dispatchThread = new EventDispatchThread(this); + /** + * Initializes a new instance of EventQueue. + */ public EventQueue() { } ! ! /** ! * Returns the next event in the queue. This method will block until ! * an event is available or until the thread is interrupted. ! * ! * @return The next event in the queue. ! * ! * @exception InterruptedException If this thread is interrupted while ! * waiting for an event to be posted to the queue. ! */ public synchronized AWTEvent getNextEvent() throws InterruptedException { if (next != null) return next.getNextEvent(); ! while (next_in == next_out) wait(); ! AWTEvent res = queue[next_out]; ! if (++next_out == queue.length) next_out = 0; return res; } ! ! /** ! * Returns the next event in the queue without removing it from the queue. ! * This method will block until an event is available or until the thread ! * is interrupted. ! * ! * @return The next event in the queue. ! * @specnote Does not block. Returns null if there are no events on the * queue. */ public synchronized AWTEvent peekEvent() { if (next != null) return next.peekEvent(); ! if (next_in != next_out) return queue[next_out]; else return null; } ! ! /** ! * Returns the next event in the queue that has the specified id ! * without removing it from the queue. ! * This method will block until an event is available or until the thread ! * is interrupted. ! * ! * @param id The event id to return. ! * ! * @return The next event in the queue. ! * ! * @specnote Does not block. Returns null if there are no matching events * on the queue. */ public synchronized AWTEvent peekEvent(int id) *************** public class EventQueue *** 83,89 **** } return null; } ! public synchronized void postEvent(AWTEvent evt) { if (next != null) --- 146,157 ---- } return null; } ! ! /** ! * Posts a new event to the queue. ! * ! * @param event The event to post to the queue. ! */ public synchronized void postEvent(AWTEvent evt) { if (next != null) *************** public class EventQueue *** 92,98 **** return; } // FIXME: Security checks? ! /* Check for any events already on the queue with the same source and ID. */ int i = next_out; --- 160,166 ---- return; } // FIXME: Security checks? ! /* Check for any events already on the queue with the same source and ID. */ int i = next_out; *************** public class EventQueue *** 123,146 **** queue[next_in] = evt; if (++next_in == queue.length) next_in = 0; ! if (next_in == next_out) { /* Queue is full. Extend it. */ AWTEvent[] oldQueue = queue; queue = new AWTEvent[queue.length * 2]; ! int len = oldQueue.length - next_out; System.arraycopy(oldQueue, next_out, queue, 0, len); if (next_out != 0) System.arraycopy(oldQueue, 0, queue, len, next_out); ! next_out = 0; next_in = oldQueue.length; } notify(); } ! /** @since JDK1.2 */ public static void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException --- 191,214 ---- queue[next_in] = evt; if (++next_in == queue.length) next_in = 0; ! if (next_in == next_out) { /* Queue is full. Extend it. */ AWTEvent[] oldQueue = queue; queue = new AWTEvent[queue.length * 2]; ! int len = oldQueue.length - next_out; System.arraycopy(oldQueue, next_out, queue, 0, len); if (next_out != 0) System.arraycopy(oldQueue, 0, queue, len, next_out); ! next_out = 0; next_in = oldQueue.length; } notify(); } ! /** @since JDK1.2 */ public static void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException *************** public class EventQueue *** 149,155 **** Thread current = Thread.currentThread(); if (current == eq.dispatchThread) throw new Error("Can't call invokeAndWait from event dispatch thread"); ! InvocationEvent ie = new InvocationEvent(eq, runnable, current, true); --- 217,223 ---- Thread current = Thread.currentThread(); if (current == eq.dispatchThread) throw new Error("Can't call invokeAndWait from event dispatch thread"); ! InvocationEvent ie = new InvocationEvent(eq, runnable, current, true); *************** public class EventQueue *** 160,172 **** } Exception exception; ! if ((exception = ie.getException()) != null) throw new InvocationTargetException(exception); } ! /** @since JDK1.2 */ ! static void invokeLater(Runnable runnable) { EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); --- 228,240 ---- } Exception exception; ! if ((exception = ie.getException()) != null) throw new InvocationTargetException(exception); } ! /** @since JDK1.2 */ ! public static void invokeLater(Runnable runnable) { EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); *************** public class EventQueue *** 175,187 **** eq.postEvent(ie); } ! ! static boolean isDispatchThread() { EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); return (Thread.currentThread() == eq.dispatchThread); } ! /** Allows a custom EventQueue implementation to replace this one. * All pending events are transferred to the new queue. Calls to postEvent, * getNextEvent, and peekEvent are forwarded to the pushed queue until it --- 243,255 ---- eq.postEvent(ie); } ! ! public static boolean isDispatchThread() { EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); return (Thread.currentThread() == eq.dispatchThread); } ! /** Allows a custom EventQueue implementation to replace this one. * All pending events are transferred to the new queue. Calls to postEvent, * getNextEvent, and peekEvent are forwarded to the pushed queue until it *************** public class EventQueue *** 201,221 **** next = newEventQueue; newEventQueue.prev = this; } ! /** Transfer any pending events from this queue back to the parent queue that * was previously push()ed. Event dispatch from this queue is suspended. */ protected void pop() throws EmptyStackException { if (prev == null) throw new EmptyStackException(); ! // Don't synchronize both this and prev at the same time, or deadlock could // occur. synchronized (prev) { prev.next = null; } ! synchronized (this) { int i = next_out; --- 269,289 ---- next = newEventQueue; newEventQueue.prev = this; } ! /** Transfer any pending events from this queue back to the parent queue that * was previously push()ed. Event dispatch from this queue is suspended. */ protected void pop() throws EmptyStackException { if (prev == null) throw new EmptyStackException(); ! // Don't synchronize both this and prev at the same time, or deadlock could // occur. synchronized (prev) { prev.next = null; } ! synchronized (this) { int i = next_out; *************** public class EventQueue *** 228,234 **** } } } ! protected void dispatchEvent(AWTEvent evt) { if (evt instanceof ActiveEvent) --- 296,302 ---- } } } ! protected void dispatchEvent(AWTEvent evt) { if (evt instanceof ActiveEvent) diff -Nrc3pad gcc-3.0.4/libjava/java/awt/FileDialog.java gcc-3.1/libjava/java/awt/FileDialog.java *** gcc-3.0.4/libjava/java/awt/FileDialog.java Thu Aug 3 12:09:38 2000 --- gcc-3.1/libjava/java/awt/FileDialog.java Tue Jan 22 22:58:08 2002 *************** *** 1,20 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! /* A very incomplete placeholder. */ ! public class FileDialog extends Dialog { ! public FileDialog (Frame owner) ! { ! super(owner); ! // FIXME ! } } --- 1,314 ---- ! /* FileDialog.java -- A filename selection dialog box ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.FileDialogPeer; ! import java.awt.peer.DialogPeer; ! import java.awt.peer.WindowPeer; ! import java.awt.peer.ContainerPeer; ! import java.awt.peer.ComponentPeer; ! import java.io.FilenameFilter; ! /** ! * This class implements a file selection dialog box widget. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class FileDialog extends Dialog implements java.io.Serializable { ! ! /* ! * Static Variables ! */ ! ! /** ! * Indicates that the purpose of the dialog is for opening a file. ! */ ! public static final int LOAD = 0; ! ! /** ! * Indicates that the purpose of the dialog is for saving a file. ! */ ! public static final int SAVE = 1; ! ! // Serialization constant ! private static final long serialVersionUID = 5035145889651310422L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The directory for this file dialog. ! */ ! private String dir; ! ! /** ! * @serial The filename for this file dialog ! */ ! private String file; ! ! /** ! * @serial The filter for selecting filenames to display ! */ ! private FilenameFilter filter; ! ! /** ! * @serial The mode of this dialog, either LOAD or ! * SAVE. ! */ ! private int mode; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of FileDialog with the ! * specified parent. This dialog will have no title and will be for ! * loading a file. ! * ! * @param parent The parent frame for this dialog. ! */ ! public ! FileDialog(Frame parent) ! { ! this(parent, "", LOAD); ! } ! ! /*************************************************************************/ ! ! /** ! * Initialized a new instance of FileDialog with the ! * specified parent and title. This dialog will be for opening a file. ! * ! * @param parent The parent frame for this dialog. ! * @param title The title for this dialog. ! */ ! public ! FileDialog(Frame parent, String title) ! { ! this(parent, title, LOAD); ! } ! ! /*************************************************************************/ ! ! /** ! * Initialized a new instance of FileDialog with the ! * specified parent, title, and mode. ! * ! * @param parent The parent frame for this dialog. ! * @param title The title for this dialog. ! * @param mode The mode of the dialog, either LOAD or ! * SAVE. ! */ ! public ! FileDialog(Frame parent, String title, int mode) ! { ! super(parent, title, true); ! ! if ((mode != LOAD) && (mode != SAVE)) ! throw new IllegalArgumentException("Bad mode: " + mode); ! ! this.mode = mode; } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * Returns the mode of this dialog, either LOAD or + * SAVE. + * + * @return The mode of this dialog. + */ + public int + getMode() + { + return(mode); + } + + /*************************************************************************/ + + /** + * Sets the mode of this dialog to either LOAD or + * SAVE. This method is only effective before the native + * peer is created. + * + * @param mode The new mode of this file dialog. + */ + public void + setMode(int mode) + { + if ((mode != LOAD) && (mode != SAVE)) + throw new IllegalArgumentException("Bad mode: " + mode); + + this.mode = mode; + } + + /*************************************************************************/ + + /** + * Returns the directory for this file dialog. + * + * @return The directory for this file dialog. + */ + public String + getDirectory() + { + return(dir); + } + + /*************************************************************************/ + + /** + * Sets the directory for this file dialog. + * + * @param dir The new directory for this file dialog. + */ + public synchronized void + setDirectory(String dir) + { + this.dir = dir; + if (peer != null) + { + FileDialogPeer f = (FileDialogPeer) peer; + f.setDirectory (dir); + } + } + + /*************************************************************************/ + + /** + * Returns the file that is selected in this dialog. + * + * @return The file that is selected in this dialog. + */ + public String + getFile() + { + return(file); + } + + /*************************************************************************/ + + /** + * Sets the selected file for this dialog. + * + * @param file The selected file for this dialog. + */ + public synchronized void + setFile(String file) + { + this.file = file; + if (peer != null) + { + FileDialogPeer f = (FileDialogPeer) peer; + f.setFile (file); + } + } + + /*************************************************************************/ + + /** + * Returns the filename filter being used by this dialog. + * + * @param The filename filter being used by this dialog. + */ + public FilenameFilter + getFilenameFilter() + { + return(filter); + } + + /*************************************************************************/ + + /** + * Sets the filename filter used by this dialog. + * + * @param filter The new filename filter for this file dialog box. + */ + public synchronized void + setFilenameFilter(FilenameFilter filter) + { + this.filter = filter; + if (peer != null) + { + FileDialogPeer f = (FileDialogPeer) peer; + f.setFilenameFilter (filter); + } + } + + /*************************************************************************/ + + /** + * Creates the native peer for this file dialog box. + */ + public void + addNotify() + { + if (peer == null) + peer = getToolkit ().createFileDialog (this); + super.addNotify (); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + protected String + paramString() + { + return ("dir=" + dir + ",file=" + file + + ",mode=" + mode + "," + super.paramString()); + } + + } // class FileDialog + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/FlowLayout.java gcc-3.1/libjava/java/awt/FlowLayout.java *** gcc-3.0.4/libjava/java/awt/FlowLayout.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/FlowLayout.java Tue Jan 29 16:31:24 2002 *************** *** 1,12 **** ! // GridLayout.java - Grid-based layout engine ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,41 ---- ! // FlowLayout.java - Grid-based layout engine ! /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** import java.io.Serializable; *** 17,22 **** --- 46,54 ---- * without horizontal clipping, a new row is started. This class * supports horizontal and vertical gaps. These are used for spacing * between components. + * + * @author Tom Tromey + * @author Aaron M. Renn (arenn@urbanophile.com) */ public class FlowLayout implements LayoutManager, Serializable { *************** public class FlowLayout implements Layou *** 34,39 **** --- 66,74 ---- * orientation. */ public static final int TRAILING = 4; + // Serialization constant + private static final long serialVersionUID = -7262534875583282631L; + /** Add a new component to the layout. This particular implementation * does nothing. */ *************** public class FlowLayout implements Layou *** 42,83 **** // Nothing. } ! /** Return the alignment. */ public int getAlignment () { return align; } ! /** Return the horizontal gap. */ public int getHgap () { return hgap; } ! /** Return the vertical gap. */ public int getVgap () { return vgap; } ! /** Create a new FlowLayout with center alignment. ! * Both gaps are set to 0. */ public FlowLayout () { ! this (CENTER, 0, 0); } ! /** Create a new FlowLayout with the alignment. ! * columns. Both gaps are set to 0. ! * @param align Alignment */ public FlowLayout (int align) { ! this (align, 0, 0); } ! /** Create a new FlowLayout with the specified alignment and gaps. * @param align Alignment * @param hgap The horizontal gap * @param vgap The vertical gap --- 77,136 ---- // Nothing. } ! /** ! * Returns the current justification value for this object. ! * ! * @return The current justification value for this object. ! */ public int getAlignment () { return align; } ! /** ! * Returns the horizontal gap between components. ! * ! * @return The horizontal gap between components. ! */ public int getHgap () { return hgap; } ! /** ! * Returns the vertical gap between lines of components. ! * ! * @return The vertical gap between lines of components. ! */ public int getVgap () { return vgap; } ! /** ! * Initializes a new instance of FlowLayout with a center ! * justification and a default horizontal and vertical gap of 5. */ public FlowLayout () { ! this (CENTER, 5, 5); } ! /** ! * Initializes a new instance of FlowLayout with the specified ! * justification and a default horizontal and vertical gap of 5. ! * ! * @param align The justification setting, which should be one of the ! * contants in this class. */ public FlowLayout (int align) { ! this (align, 5, 5); } ! /** ! * Initializes a new instance of FlowLayout with the specified ! * justification and gap values * @param align Alignment * @param hgap The horizontal gap * @param vgap The vertical gap *************** public class FlowLayout implements Layou *** 85,100 **** */ public FlowLayout (int align, int hgap, int vgap) { ! if (hgap < 0) ! throw new IllegalArgumentException ("horizontal gap must be nonnegative"); ! if (vgap < 0) ! throw new IllegalArgumentException ("vertical gap must be nonnegative"); ! if (align != LEFT && align != RIGHT && align != CENTER ! && align != LEADING && align != TRAILING) ! throw new IllegalArgumentException ("invalid align: " + align); ! this.align = align; ! this.hgap = hgap; ! this.vgap = vgap; } /** Lay out the container's components based on current settings. --- 138,148 ---- */ public FlowLayout (int align, int hgap, int vgap) { ! // Use methods to set fields so that we can have all the checking ! // in one place. ! setVgap (vgap); ! setHgap (hgap); ! setAlignment (align); } /** Lay out the container's components based on current settings. *************** public class FlowLayout implements Layou *** 120,141 **** int new_w = ins.left + hgap + ins.right; int new_h = 0; int j; ! for (j = i; j < num; ++j) { ! // FIXME: this is very inefficient. Dimension c = comps[i].getPreferredSize (); int next_w = new_w + hgap + c.width; ! if (next_w > d.width) { ! // We must start a new row. break; } - new_w = next_w; - new_h = Math.max (new_h, c.height); } - // We always need at least one item. - if (j == i) - ++j; // Set the location of each component for this row. int x; --- 168,195 ---- int new_w = ins.left + hgap + ins.right; int new_h = 0; int j; ! boolean found_one = false; ! for (j = i; j < num && ! found_one; ++j) { ! // Skip invisible items. ! if (! comps[i].visible) ! continue; ! Dimension c = comps[i].getPreferredSize (); + int next_w = new_w + hgap + c.width; ! if (next_w <= d.width || ! found_one) { ! new_w = next_w; ! new_h = Math.max (new_h, c.height); ! found_one = true; ! } ! else ! { ! // Must start a new row, and we already found an item break; } } // Set the location of each component for this row. int x; *************** public class FlowLayout implements Layou *** 153,164 **** else x = d.width - new_w; ! for (int k = i; i < j; ++k) { ! // FIXME: this is very inefficient. ! Dimension c = comps[i].getPreferredSize (); ! comps[i].setLocation (x, y); ! x += c.width + vgap; } // Advance to next row. --- 207,220 ---- else x = d.width - new_w; ! for (int k = i; k < j; ++k) { ! if (comps[k].visible) ! { ! Dimension c = comps[k].getPreferredSize (); ! comps[k].setBounds (x, y, c.width, new_h); ! x += c.width + hgap; ! } } // Advance to next row. *************** public class FlowLayout implements Layou *** 167,182 **** } } ! /** Get the minimum layout size of the container. * @param cont The parent container */ public Dimension minimumLayoutSize (Container cont) { return getSize (cont, true); } ! /** Get the preferred layout size of the container. * @param cont The parent container */ public Dimension preferredLayoutSize (Container cont) { --- 223,244 ---- } } ! /** ! * Returns the minimum layout size for the specified container using ! * this layout. * @param cont The parent container + * @return The minimum layout size. */ public Dimension minimumLayoutSize (Container cont) { return getSize (cont, true); } ! /** ! * Returns the preferred layout size for the specified container using ! * this layout. * @param cont The parent container + * @return The preferred layout size. */ public Dimension preferredLayoutSize (Container cont) { *************** public class FlowLayout implements Layou *** 192,210 **** // Nothing. } ! /** Set the alignment. ! * @param align The alignment */ public void setAlignment (int align) { if (align != LEFT && align != RIGHT && align != CENTER && align != LEADING && align != TRAILING) ! throw new IllegalArgumentException ("invalid align: " + align); this.align = align; } ! /** Set the horizontal gap ! * @param hgap The horizontal gap */ public void setHgap (int hgap) { --- 254,277 ---- // Nothing. } ! /** ! * Sets the justification value for this object to the specified value. ! * ! * @param align The new justification value for this object, which must ! * be one of the constants in this class. */ public void setAlignment (int align) { if (align != LEFT && align != RIGHT && align != CENTER && align != LEADING && align != TRAILING) ! throw new IllegalArgumentException ("invalid alignment: " + align); this.align = align; } ! /** ! * Sets the horizontal gap between components to the specified value. ! * ! * @param hgap The new horizontal gap between components. */ public void setHgap (int hgap) { *************** public class FlowLayout implements Layou *** 213,220 **** this.hgap = hgap; } ! /** Set the vertical gap. ! * @param vgap The vertical gap */ public void setVgap (int vgap) { --- 280,289 ---- this.hgap = hgap; } ! /** ! * Sets the vertical gap between lines of components to the specified value. ! * ! * @param vgap The new vertical gap. */ public void setVgap (int vgap) { *************** public class FlowLayout implements Layou *** 223,229 **** this.vgap = vgap; } ! /** Return String description of this object. */ public String toString () { return ("[" + getClass ().getName () + ",hgap=" + hgap + ",vgap=" + vgap --- 292,300 ---- this.vgap = vgap; } ! /** Return String description of this object. ! * @return A string representation of this object. ! */ public String toString () { return ("[" + getClass ().getName () + ",hgap=" + hgap + ",vgap=" + vgap *************** public class FlowLayout implements Layou *** 241,246 **** --- 312,320 ---- h = 0; for (int i = 0; i < num; ++i) { + if (! comps[i].visible) + continue; + // FIXME: can we just directly read the fields in Component? // Or will that not work with subclassing? Dimension d; *************** public class FlowLayout implements Layou *** 262,270 **** return new Dimension (w, h); } ! // Alignment. private int align; ! // The gaps. private int hgap; private int vgap; } --- 336,354 ---- return new Dimension (w, h); } ! /** ! * @serial The justification alignment of the lines of components, which ! * will be one of the constants defined in this class. ! */ private int align; ! ! /** ! * @serial The horizontal gap between components. ! */ private int hgap; + + /** + * @serial The vertical gap between lines of components. + */ private int vgap; } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Font.java gcc-3.1/libjava/java/awt/Font.java *** gcc-3.0.4/libjava/java/awt/Font.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/Font.java Tue Jan 22 22:58:08 2002 *************** *** 1,120 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! import java.util.Locale; /** ! * @author Warren Levy ! * @date March 16, 2000. */ /** ! * Written using on-line Java Platform 1.2 API Specification, as well ! * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). ! * Status: Stubbed; A very incomplete implementation. */ ! public class Font { ! // FIXME ! public static final int PLAIN = 0; ! public static final int BOLD = 1; ! public static final int ITALIC = 2; ! public static final int ROMAN_BASELINE = 0; ! public static final int CENTER_BASELINE = 1; ! public static final int HANGING_BASELINE = 2; ! protected String name; ! protected int style; ! protected int size; ! protected float pointSize; ! public Font(String name, int style, int size) ! { ! this.name = name; ! this.style = style & 0x3; // Only use lowest 2 bits. ! this.size = size; ! pointSize = size; // Assume some subclass can set a different val. ! } ! public boolean isPlain() ! { ! if (style == PLAIN) ! return true; ! return false; ! } ! public boolean isBold() ! { ! if ((style & BOLD) == BOLD) ! return true; ! return false; ! } ! public boolean isItalic() ! { ! if ((style & ITALIC) == ITALIC) ! return true; ! return false; ! } ! ! public String getName() ! { ! return name; ! } ! public String getFamily() ! { ! // FIXME ! return null; ! } ! public String getFamily(Locale l) ! { ! // FIXME ! return null; ! } ! public int getStyle() ! { ! return style; ! } ! public int getSize() ! { ! return size; ! } ! public float getSize2D() ! { ! return pointSize; ! } ! public static Font decode(String str) { return null; } // FIXME ! ! public String toString() ! { ! String style_str = ""; ! if (isPlain()) ! style_str = "plain"; ! else ! { ! if (isBold()) ! style_str += "bold"; ! if (isItalic()) ! style_str += "italic"; ! } ! return getClass().getName() + "[family=" + getFamily() + ",name=" + ! getName() + ",style=" + style_str + ",size=" + getSize() + "]"; ! } } --- 1,425 ---- ! /* Font.java -- Font object ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.FontPeer; ! import java.util.StringTokenizer; /** ! * This class represents a windowing system font. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ ! public class Font implements java.io.Serializable ! { ! ! /* ! * Static Variables */ /** ! * Constant indicating a "plain" font. ! */ ! public static final int PLAIN = 0; ! ! /** ! * Constant indicating a "bold" font. ! */ ! public static final int BOLD = 1; ! ! /** ! * Constant indicating an "italic" font. ! */ ! public static final int ITALIC = 2; ! ! public static final int ROMAN_BASELINE = 0; ! public static final int CENTER_BASELINE = 1; ! public static final int HANGING_BASELINE = 2; ! ! // Serialization constant ! private static final long serialVersionUID = -4206021311591459213L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables */ ! /** ! * The name of this font ! */ ! protected String name; ! ! /** ! * The font style, which is a combination (by summing, not OR-ing) of ! * the font style constants in this class. ! */ ! protected int style; ! ! /** ! * The font point size. ! */ ! protected int size; ! ! protected float pointSize; ! ! // The native peer for this font ! private FontPeer peer; ! ! /*************************************************************************/ ! ! /* ! * Static Methods ! */ ! ! /** ! * Creates a Font object from the specified string, which ! * is in one of the following formats: ! *

    ! *

      ! *
    • fontname-style-pointsize ! *
    • fontname-style ! *
    • fontname-pointsize ! *
    • fontname ! *
    ! *

    ! * The style should be one of BOLD, ITALIC, or BOLDITALIC. The default ! * style if none is specified is PLAIN. The default size if none ! * is specified is 12. ! */ ! public static Font ! decode(String fontspec) { ! String name = null; ! int style = PLAIN; ! int size = 12; ! StringTokenizer st = new StringTokenizer(fontspec, "-"); ! while (st.hasMoreTokens()) ! { ! String token = st.nextToken(); ! if (name == null) ! { ! name = token; ! continue; ! } ! if (token.toUpperCase().equals("BOLD")) ! { ! style = BOLD; ! continue; ! } ! if (token.toUpperCase().equals("ITALIC")) ! { ! style = ITALIC; ! continue; ! } ! if (token.toUpperCase().equals("BOLDITALIC")) ! { ! style = BOLD + ITALIC; ! continue; ! } ! int tokenval = 0; ! try ! { ! tokenval = Integer.parseInt(token); ! } ! catch(Exception e) { ; } ! if (tokenval != 0) ! size = tokenval; ! } ! return(new Font(name, style, size)); ! } ! /*************************************************************************/ ! /** ! * Returns a Font object from the passed property name. ! * ! * @param propname The name of the system property. ! * @param default Value to use if the property is not found. ! * ! * @return The requested font, or default if the property ! * not exist or is malformed. ! */ ! public static Font ! getFont(String propname, Font defval) ! { ! String propval = System.getProperty(propname); ! if (propval != null) ! return(decode(propval)); ! return(defval); ! } ! /*************************************************************************/ ! /** ! * Returns a Font object from the passed property name. ! * ! * @param propname The name of the system property. ! * ! * @return The requested font, or null if the property ! * not exist or is malformed. ! */ ! public static Font ! getFont(String propname) ! { ! return(getFont(propname, null)); ! } ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * Initializes a new instance of Font with the specified ! * attributes. ! * ! * @param name The name of the font. ! * @param style The font style. ! * @param size The font point size. ! */ ! public ! Font(String name, int style, int size) ! { ! this.name = name; ! this.style = style; ! this.size = size; ! this.pointSize = size; ! } ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Returns the name of the font. ! * ! * @return The name of the font. ! */ ! public String ! getName() ! { ! return(name); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the style of the font. ! * ! * @return The font style. ! */ ! public int ! getSize() ! { ! return(size); ! } ! ! public float ! getSize2D() ! { ! return pointSize; ! } ! ! /*************************************************************************/ ! ! /** ! * Tests whether or not this is a plain font. This will be true if ! * and only if neither the bold nor the italics style is set. ! * ! * @return true if this is a plain font, false ! * otherwise. ! */ ! public boolean ! isPlain() ! { ! if (style == PLAIN) ! return(true); ! else ! return(false); ! } ! ! /*************************************************************************/ ! ! /** ! * Tests whether or not this font is bold. ! * ! * @return true if this font is bold, false ! * otherwise. ! */ ! public boolean ! isBold() ! { ! if ((style == BOLD) || (style == (BOLD+ITALIC))) ! return(true); ! else ! return(false); } + + /*************************************************************************/ + + /** + * Tests whether or not this font is italic. + * + * @return true if this font is italic, false + * otherwise. + */ + public boolean + isItalic() + { + if ((style == ITALIC) || (style == (BOLD+ITALIC))) + return(true); + else + return(false); + } + + /*************************************************************************/ + + /** + * Returns the system specific font family name. + * + * @return The system specific font family name. + */ + public String + getFamily() + { + // FIXME: How do I implement this? + return(name); + } + + public int + getStyle() + { + return style; + } + + /*************************************************************************/ + + /** + * Returns a native peer object for this font. + * + * @return A native peer object for this font. + */ + public FontPeer + getPeer() + { + if (peer != null) + return(peer); + + peer = Toolkit.getDefaultToolkit().getFontPeer(name, style); + return(peer); + } + + /*************************************************************************/ + + /** + * Returns a hash value for this font. + * + * @return A hash for this font. + */ + public int + hashCode() + { + return((new String(name + size + style)).hashCode()); + } + + /*************************************************************************/ + + /** + * Tests whether or not the specified object is equal to this font. This + * will be true if and only if: + *

    + *

      + *
    • The object is not null. + *
    • The object is an instance of Font. + *
    • The object has the same name, style, and size as this object. + *
    + * + * @return true if the specified object is equal to this + * object, false otherwise. + */ + public boolean + equals(Object obj) + { + if (obj == null) + return(false); + + if (!(obj instanceof Font)) + return(false); + + Font f = (Font)obj; + + if (!f.name.equals(name)) + return(false); + + if (f.size != size) + return(false); + + if (f.style != style) + return(false); + + return(true); + } + + /*************************************************************************/ + + /** + * Returns a string representation of this font. + * + * @return A string representation of this font. + */ + public String + toString() + { + return(getClass().getName() + "(name=" + name + ",style=" + style + + ",size=" + size + ")"); + } + + } // class Font + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/FontMetrics.java gcc-3.1/libjava/java/awt/FontMetrics.java *** gcc-3.0.4/libjava/java/awt/FontMetrics.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/FontMetrics.java Tue Jan 22 22:58:08 2002 *************** *** 1,146 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; /** ! * Status: Stubbed; A very incomplete implementation. */ ! public class FontMetrics implements java.io.Serializable { ! protected Font font; ! ! protected FontMetrics(Font font) ! { ! this.font = font; ! } ! public Font getFont() ! { ! return font; ! } ! public int getLeading() ! { ! return getMaxAscent() + getMaxDescent() - (getAscent() + getDescent()); ! } ! public int getAscent() ! { ! return getHeight() - (getDescent() + getLeading()); ! } ! public int getDescent() ! { ! return getHeight() - (getLeading() + getDescent()); ! } ! public int getHeight() ! { ! return getLeading() + getAscent() + getDescent(); ! } ! public int getMaxAscent() ! { ! return getAscent(); ! } ! public int getMaxDescent() ! { ! return getDescent(); ! } ! /* @deprecated Use getMaxDescent() instead. */ ! public int getMaxDecent() ! { ! return getMaxDescent(); ! } ! /** @return max advance, or -1 if unknown. */ ! public int getMaxAdvance() ! { ! return -1; ! } ! public int charWidth(int ch) ! { ! return charWidth((char) ch); ! } ! public int charWidth(char ch) ! { ! Character chObj = new Character(ch); ! return stringWidth(chObj.toString()); ! } ! ! public int stringWidth(String str) ! { ! return charsWidth(str.toCharArray(), 0, str.length()); ! } ! public int charsWidth(char[] data, int off, int len) ! { ! return stringWidth(new String(data, off, len)); ! } ! public int bytesWidth(byte[] data, int off, int len) ! { ! return stringWidth(new String(data, off, len)); ! } ! ! public int[] getWidths() ! { ! int[] widths = new int[256]; ! for (char c=0; c<256; c++) widths[c] = charWidth(c); ! return widths; ! } ! public boolean hasUniformLineMetrics() ! { ! // FIXME ! return false; ! } ! // Don't have LineMetrics yet... ! /* ! public LineMetrics getLineMetrics(String str, Graphics context) ! public LineMetrics getLineMetrics(String str, int beginIndex, int limit, ! Graphics context) ! public LineMetrics getLineMetrics(char[] chars, int beginIndex, int limit, ! Graphics context) ! public LineMetrics getLineMetrics(CharacterIterator ci, int beginIndex, ! int limit, Graphics context) */ ! // Don't have Java2D yet. ! /* ! public Rectangle2D getStringBounds(String str, Graphics context) ! public Rectangle2D getStringBounds(String str, int beginIndex, int limit, ! Graphics context) ! public Rectangle2D getStringBounds(char[] chars, int beginIndex, int limit, ! Graphics context) ! public Rectangle2D getStringBounds(CharacterIterator ci, int beginIndex, ! int limit, Graphics context) ! public Rectangle2D getMaxCharBounds(Graphics context) */ ! public String toString() ! { ! return this.getClass() + "[font=" + font + ",ascent=" + getAscent() ! + ",descent=" + getDescent() + ",height=" + getHeight() + "]"; ! } } --- 1,349 ---- ! /* FontMetrics.java -- Information about about a fonts display characteristics ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + // FIXME: I leave many methods basically unimplemented. This + // should be reviewed. + /** ! * This class returns information about the display characteristics of ! * a font. It is abstract, and concrete subclasses should implement at ! * least the following methods: ! *

    ! *

      ! *
    • getAscent ! *
    • getDescent ! *
    • getLeading() ! *
    • getMaxAdvance() ! *
    • charWidth(char) ! *
    • charsWidth(char[], int, int) ! *
    ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class FontMetrics implements java.io.Serializable ! { ! ! /* ! * Static Variables */ ! // Serialization constant ! private static final long serialVersionUID = 1681126225205050147L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * This is the font for which metrics will be returned. ! */ ! protected Font font; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of FontMetrics for the ! * specified font. ! * ! * @param font The font to return metric information for. ! */ ! protected ! FontMetrics(Font font) { ! this.font = font; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the font that this object is creating metric information fo. ! * ! * @return The font for this object. ! */ ! public Font ! getFont() ! { ! return(font); ! } ! /*************************************************************************/ ! /** ! * Returns the leading, or spacing between lines, for this font. ! * ! * @return The font leading. ! */ ! public int ! getLeading() ! { ! return(0); ! } ! /*************************************************************************/ ! /** ! * Returns the ascent of the font, which is the distance from the base ! * to the top of the majority of characters in the set. Some characters ! * can exceed this value however. ! * ! * @return The font ascent. ! */ ! public int ! getAscent() ! { ! return(1); ! } ! /*************************************************************************/ ! /** ! * Returns the descent of the font, which is the distance from the base ! * to the bottom of the majority of characters in the set. Some characters ! * can exceed this value however. ! * ! * @return The font descent. ! */ ! public int ! getDescent() ! { ! return(1); ! } + /*************************************************************************/ ! /** ! * Returns the height of a line in this font. This will be the sum ! * of the leading, the ascent, and the descent. ! * ! * @return The height of the font. ! */ ! public int ! getHeight() ! { ! return(getAscent() + getDescent() + getLeading()); ! } ! /*************************************************************************/ ! /** ! * Returns the maximum ascent value. This is the maximum distance any ! * character in the font rised above the baseline. ! * ! * @return The maximum ascent for this font. ! */ ! public int ! getMaxAscent() ! { ! return(getAscent()); ! } ! /*************************************************************************/ ! /** ! * Returns the maximum descent value. This is the maximum distance any ! * character in the font extends below the baseline. ! * ! * @return The maximum descent for this font. ! */ ! public int ! getMaxDescent() ! { ! return(getDescent()); ! } ! /*************************************************************************/ ! /** ! * Returns the maximum descent value. This is the maximum distance any ! * character in the font extends below the baseline. ! * ! * @return The maximum descent for this font. ! * ! * @deprecated This method is deprecated in favor of ! * getMaxDescent(). ! */ ! public int ! getMaxDecent() ! { ! return(getMaxDescent()); ! } ! /*************************************************************************/ ! /** ! * Returns the width of the widest character in the font. ! * ! * @return The width of the widest character in the font. */ + public int + getMaxAdvance() + { + return(-1); + } ! /*************************************************************************/ ! /** ! * Returns the width of the specified character. ! * ! * @param ch The character to return the width of. ! * ! * @return The width of the specified character. ! */ ! public int ! charWidth(int ch) ! { ! return(charWidth((char)ch)); ! } ! /*************************************************************************/ ! /** ! * Returns the width of the specified character. ! * ! * @param ch The character to return the width of. ! * ! * @return The width of the specified character. ! */ ! public int ! charWidth(char ch) ! { ! return(1); ! } ! /*************************************************************************/ ! ! /** ! * Returns the total width of the specified string ! * ! * @param str The string to return the width of. ! * ! * @return The width of the string. */ + public int + stringWidth(String str) + { + char[] buf = new char[str.length()]; + str.getChars(0, str.length(), buf, 0); ! return(charsWidth(buf, 0, buf.length)); } + + /*************************************************************************/ + + /** + * Returns the total width of the specified character array. + * + * @param buf The character array containing the data. + * @param offset The offset into the array to start calculating from. + * @param len The total number of bytes to process. + * + * @return The width of the requested characters. + */ + public int + charsWidth(char buf[], int offset, int len) + { + int total_width = 0; + for (int i = offset; i < len; i++) + total_width = charWidth(buf[i]); + + return(total_width); + } + + /*************************************************************************/ + + /** + * Returns the total width of the specified byte array. + * + * @param buf The byte array containing the data. + * @param offset The offset into the array to start calculating from. + * @param len The total number of bytes to process. + * + * @return The width of the requested characters. + */ + public int + bytesWidth(byte buf[], int offset, int len) + { + int total_width = 0; + for (int i = offset; i < len; i++) + total_width = charWidth((char)buf[i]); + + return(total_width); + } + + /*************************************************************************/ + + /** + * Returns the widths of the first 256 characters in the font. + * + * @return The widths of the first 256 characters in the font. + */ + public int[] + getWidths() + { + return(new int[256]); + } + + /*************************************************************************/ + + /** + * Returns a string representation of this object. + * + * @return A string representation of this object. + */ + public String + toString() + { + return (this.getClass() + "[font=" + font + ",ascent=" + getAscent() + + ",descent=" + getDescent() + ",height=" + getHeight() + "]"); + } + + } // class FontMetrics + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Frame.java gcc-3.1/libjava/java/awt/Frame.java *** gcc-3.0.4/libjava/java/awt/Frame.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/Frame.java Tue Jan 22 22:40:04 2002 *************** *** 1,150 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; import java.awt.peer.FramePeer; ! /* A very incomplete placeholder. */ ! public class Frame extends Window implements MenuContainer { ! public static final int NORMAL = 0; ! public static final int ICONIFIED = 1; ! MenuBar menuBar = null; ! String title; ! private transient Image iconImage; ! private transient boolean isResizable = true; ! private transient int state = NORMAL; ! public Frame () ! { ! super(); ! } ! public Frame(GraphicsConfiguration gc) ! { ! super(gc); ! } ! public Frame (String title) ! { ! super(); ! setTitle(title); ! } ! public Frame(String title, GraphicsConfiguration gc) ! { ! super(gc); ! setTitle(title); ! } ! public String getTitle() ! { ! return (title != null) ? title : ""; ! } ! ! public void setTitle (String title) ! { ! this.title = title; ! if (peer != null) ! ((FramePeer)peer).setTitle(title); ! } ! public Image getIconImage() ! { ! return iconImage; ! } ! ! public void setIconImage(Image image) ! { ! iconImage = image; ! if (peer != null) ! ((FramePeer) peer).setIconImage(iconImage); ! } ! protected void finalize() throws Throwable ! { ! //frames.remove(this); ! /* FIXME: This won't work. Finalize will never be called if frames ! has a reference to the object. We need weak references to ! implement this correctly. */ ! super.finalize(); ! } ! public synchronized void setMenuBar (MenuBar menuBar) ! { ! if (this.menuBar != menuBar) ! { ! //this.menuBar.removeNotify(); ! this.menuBar = menuBar; ! //this.menuBar.addNotify(); ! } ! if (peer != null) ! ((FramePeer) peer).setMenuBar(menuBar); ! } ! ! public boolean isResizable() ! { ! return isResizable; ! } ! public void setResizable(boolean resizable) ! { ! isResizable = resizable; ! if (peer != null) ! ((FramePeer) peer).setResizable(isResizable); ! } ! public int getState() ! { ! /* FIXME: State might have changed in the peer... Must check. */ ! ! return state; ! } ! public synchronized void addNotify () ! { ! if (peer == null) ! peer = getToolkit ().createFrame (this); ! super.addNotify(); ! } ! public boolean postEvent(Event evt) { return false; } // FIXME ! ! public void remove(MenuComponent m) ! { ! if (m == menuBar) ! { ! setMenuBar(null); ! return; ! } ! ! super.remove(m); ! } ! ! public void removeNotify() ! { ! //if ((peer != null) && (menuBar != null)) menuBar.removeNotify(); ! super.removeNotify(); ! } ! public static Frame[] getFrames() ! { ! //Frame[] array = new Frames[frames.size()]; ! //return frames.toArray(array); // see finalize() comment ! String msg = "FIXME: can't be implemented without weak references"; ! throw new UnsupportedOperationException(msg); ! } } --- 1,470 ---- ! /* Frame.java -- AWT toplevel window ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + import java.awt.peer.FramePeer; + import java.awt.peer.WindowPeer; + import java.awt.peer.ContainerPeer; + import java.awt.peer.ComponentPeer; + import java.io.Serializable; + import java.util.Enumeration; + import java.util.Vector; ! /** ! * This class is a top-level window with a title bar and window ! * decorations. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class Frame extends Window implements MenuContainer, Serializable ! { ! /* ! * Static Variables ! */ ! ! /** ! * Constant for a cross-hair cursor. ! * @deprecated Use Cursor.CROSSHAIR_CURSOR instead. ! */ ! public static final int CROSSHAIR_CURSOR = Cursor.CROSSHAIR_CURSOR; ! ! /** ! * Constant for a cursor over a text field. ! * @deprecated Use Cursor.TEXT_CURSOR instead. ! */ ! public static final int TEXT_CURSOR = Cursor.TEXT_CURSOR; ! ! /** ! * Constant for a cursor to display while waiting for an action to complete. ! * @deprecated Use Cursor.WAIT_CURSOR. ! */ ! public static final int WAIT_CURSOR = Cursor.WAIT_CURSOR; ! ! /** ! * Cursor used over SW corner of window decorations. ! * @deprecated Use Cursor.SW_RESIZE_CURSOR instead. ! */ ! public static final int SW_RESIZE_CURSOR = Cursor.SW_RESIZE_CURSOR; ! ! /** ! * Cursor used over SE corner of window decorations. ! * @deprecated Use Cursor.SE_RESIZE_CURSOR instead. ! */ ! public static final int SE_RESIZE_CURSOR = Cursor.SE_RESIZE_CURSOR; ! ! /** ! * Cursor used over NW corner of window decorations. ! * @deprecated Use Cursor.NW_RESIZE_CURSOR instead. ! */ ! public static final int NW_RESIZE_CURSOR = Cursor.NW_RESIZE_CURSOR; ! ! /** ! * Cursor used over NE corner of window decorations. ! * @deprecated Use Cursor.NE_RESIZE_CURSOR instead. ! */ ! public static final int NE_RESIZE_CURSOR = Cursor.NE_RESIZE_CURSOR; ! ! /** ! * Cursor used over N edge of window decorations. ! * @deprecated Use Cursor.N_RESIZE_CURSOR instead. ! */ ! public static final int N_RESIZE_CURSOR = Cursor.N_RESIZE_CURSOR; ! ! /** ! * Cursor used over S edge of window decorations. ! * @deprecated Use Cursor.S_RESIZE_CURSOR instead. ! */ ! public static final int S_RESIZE_CURSOR = Cursor.S_RESIZE_CURSOR; ! ! /** ! * Cursor used over E edge of window decorations. ! * @deprecated Use Cursor.E_RESIZE_CURSOR instead. ! */ ! public static final int E_RESIZE_CURSOR = Cursor.E_RESIZE_CURSOR; ! ! /** ! * Cursor used over W edge of window decorations. ! * @deprecated Use Cursor.W_RESIZE_CURSOR instead. ! */ ! public static final int W_RESIZE_CURSOR = Cursor.W_RESIZE_CURSOR; ! ! /** ! * Constant for a hand cursor. ! * @deprecated Use Cursor.HAND_CURSOR instead. ! */ ! public static final int HAND_CURSOR = Cursor.HAND_CURSOR; ! ! /** ! * Constant for a cursor used during window move operations. ! * @deprecated Use Cursor.MOVE_CURSOR instead. ! */ ! public static final int MOVE_CURSOR = Cursor.MOVE_CURSOR; ! ! // Serialization version constant ! private static final long serialVersionUID = 2673458971256075116L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The version of the class data being serialized ! * // FIXME: what is this value? ! */ ! private int frameSerializedDataVersion; ! ! /** ! * @serial Image used as the icon when this frame is minimized. ! */ ! private Image icon; ! ! /** ! * @serial Constant used by the JDK Motif peer set. Not used in ! * this implementation. ! */ ! private boolean mbManagement; ! ! /** ! * @serial The menu bar for this frame. ! */ ! //private MenuBar menuBar = new MenuBar(); ! private MenuBar menuBar; ! ! /** ! * @serial A list of other top-level windows owned by this window. ! */ ! Vector ownedWindows = new Vector(); ! ! /** ! * @serial Indicates whether or not this frame is resizable. ! */ ! private boolean resizable = true; ! ! /** ! * @serial The state of this frame. ! * // FIXME: What are the values here? ! */ ! private int state; ! ! /** ! * @serial The title of the frame. ! */ ! private String title = ""; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Frame that is not visible ! * and has no title. ! */ ! public ! Frame() { ! this(""); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Frame that is not visible ! * and has the specified title. ! * ! * @param title The title of this frame. ! */ ! public ! Frame(String title) ! { ! super(); ! System.err.println("returned"); ! this.title = title; ! System.err.println("end"); ! } ! public ! Frame(GraphicsConfiguration gc) ! { ! super(gc); ! } ! public ! Frame(String title, GraphicsConfiguration gc) ! { ! super(gc); ! setTitle(title); ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns this frame's title string. ! * ! * @return This frame's title string. ! */ ! public String ! getTitle() ! { ! return(title); ! } ! /*************************************************************************/ ! /* ! * Sets this frame's title to the specified value. ! * ! * @param title The new frame title. ! */ ! public synchronized void ! setTitle(String title) ! { ! this.title = title; ! if (peer != null) ! ((FramePeer) peer).setTitle(title); ! } ! /*************************************************************************/ ! /** ! * Returns this frame's icon. ! * ! * @return This frame's icon, or null if this frame does not ! * have an icon. ! */ ! public Image ! getIconImage() ! { ! return(icon); ! } ! /*************************************************************************/ ! /** ! * Sets this frame's icon to the specified value. ! * ! * @icon The new icon for this frame. ! */ ! public synchronized void ! setIconImage(Image icon) ! { ! this.icon = icon; ! if (peer != null) ! ((FramePeer) peer).setIconImage(icon); ! } ! /*************************************************************************/ + /** + * Returns this frame's menu bar. + * + * @return This frame's menu bar, or null if this frame + * does not have a menu bar. + */ + public MenuBar + getMenuBar() + { + return(menuBar); + } ! /*************************************************************************/ ! /** ! * Sets this frame's menu bar. ! * ! * @param menuBar The new menu bar for this frame. ! */ ! public synchronized void ! setMenuBar(MenuBar menuBar) ! { ! this.menuBar = menuBar; ! if (peer != null) ! ((FramePeer) peer).setMenuBar(menuBar); ! } ! ! /*************************************************************************/ ! ! /** ! * Tests whether or not this frame is resizable. This will be ! * true by default. ! * ! * @return true if this frame is resizable, false ! * otherwise. ! */ ! public boolean ! isResizable() ! { ! return(resizable); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the resizability of this frame to the specified value. ! * ! * @param resizable true to make the frame resizable, ! * false to make it non-resizable. ! */ ! public synchronized void ! setResizable(boolean resizable) ! { ! this.resizable = resizable; ! if (peer != null) ! ((FramePeer) peer).setResizable(resizable); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the cursor type of the cursor for this window. This will ! * be one of the constants in this class. ! * ! * @return The cursor type for this frame. ! * ! * @deprecated Use Component.getCursor() instead. ! */ ! public int ! getCursorType() ! { ! return(getCursor().getType()); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the cursor for this window to the specified type. The specified ! * type should be one of the constants in this class. ! * ! * @param type The cursor type. ! * ! * @deprecated. Use Component.setCursor(Cursor) instead. ! */ ! public void ! setCursor(int type) ! { ! setCursor(new Cursor(type)); ! } ! ! /*************************************************************************/ ! ! /** ! * Removes the specified component from this frame's menu. ! * ! * @param menu The menu component to remove. ! */ ! public void ! remove(MenuComponent menu) ! { ! menuBar.remove(menu); ! } ! ! /*************************************************************************/ ! ! /** ! * Notifies this frame that it should create its native peer. ! */ ! public void ! addNotify() ! { ! if (peer == null) ! peer = getToolkit ().createFrame (this); ! super.addNotify(); ! } ! ! /*************************************************************************/ ! ! /** ! * Destroys any resources associated with this frame. This includes ! * all components in the frame and all owned toplevel windows. ! */ ! public void ! dispose() ! { ! Enumeration e = ownedWindows.elements(); ! while(e.hasMoreElements()) ! { ! Window w = (Window)e.nextElement(); ! w.dispose(); ! } ! ! super.dispose(); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns a debugging string describing this window. ! * ! * @return A debugging string describing this window. ! */ ! protected String ! paramString() ! { ! return(getClass().getName()); ! } ! ! public int ! getState() ! { ! /* FIXME: State might have changed in the peer... Must check. */ ! return state; ! } ! ! public static Frame[] ! getFrames() ! { ! //Frame[] array = new Frames[frames.size()]; ! //return frames.toArray(array); // see finalize() comment ! String msg = "FIXME: can't be implemented without weak references"; ! throw new UnsupportedOperationException(msg); } + + } // class Frame + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Graphics.java gcc-3.1/libjava/java/awt/Graphics.java *** gcc-3.0.4/libjava/java/awt/Graphics.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/Graphics.java Tue Jan 22 22:40:04 2002 *************** *** 1,235 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; import java.awt.image.ImageObserver; /** ! * @author Warren Levy ! * @date March 15, 2000. */ /** ! * Written using on-line Java Platform 1.2 API Specification, as well ! * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). ! * Status: Almost complete */ ! public abstract class Graphics { ! protected Graphics() {} ! public abstract Graphics create(); ! public Graphics create(int x, int y, int width, int height) ! { ! Graphics gfx = create(); ! gfx.translate(x, y); ! gfx.setClip(0, y, width, height); ! return gfx; ! } ! public abstract void translate(int x, int y); ! public abstract Color getColor(); ! public abstract void setColor(Color color); ! public abstract void setPaintMode(); ! public abstract void setXORMode(Color altColor); ! public abstract Font getFont(); ! public abstract void setFont(Font font); ! public FontMetrics getFontMetrics() ! { ! return getFontMetrics(getFont()); ! } ! public abstract FontMetrics getFontMetrics(Font font); ! public abstract Rectangle getClipBounds(); ! public abstract void clipRect(int x, int y, int width, int height); ! public abstract void setClip(int x, int y, int width, int height); ! public abstract Shape getClip(); ! public abstract void setClip(Shape clip); ! public abstract void copyArea(int x, int y, int width, int height, ! int dx, int dy); ! public abstract void drawLine(int x1, int y1, int x2, int y2); ! ! public abstract void fillRect(int x, int y, int width, int height); ! public void drawRect(int x, int y, int width, int height) ! { ! int x1 = x; ! int y1 = y; ! int x2 = x + width; ! int y2 = y + height; ! drawLine(x1, y1, x2, y1); ! drawLine(x2, y1, x2, y2); ! drawLine(x2, y2, x1, y2); ! drawLine(x1, y2, x1, y1); ! } ! public abstract void clearRect(int x, int y, int width, int height); ! ! public abstract void drawRoundRect(int x, int y, int width, int height, ! int arcWidth, int arcHeight); ! ! public abstract void fillRoundRect(int x, int y, int width, int height, ! int arcWidth, int arcHeight); ! ! public void draw3DRect(int x, int y, int width, int height, ! boolean raised) ! { ! Color color = getColor(); ! Color tl = color.brighter(); ! Color br = color.darker(); ! if (!raised) ! { ! Color tmp = tl; ! tl = br; ! br = tmp; ! } ! int x1 = x; ! int y1 = y; ! int x2 = x + width; ! int y2 = y + height; ! setColor(tl); ! drawLine(x1, y1, x2, y1); ! drawLine(x1, y2, x1, y1); ! setColor(br); ! drawLine(x2, y1, x2, y2); ! drawLine(x2, y1, x1, y2); ! setColor(color); ! } ! public void fill3DRect(int x, int y, int width, int height, ! boolean raised) ! { ! fillRect(x, y, width, height); ! draw3DRect(x, y, width-1, height-1, raised); ! } ! public abstract void drawOval(int x, int y, int width, int height); ! ! public abstract void fillOval(int x, int y, int width, int height); ! ! public abstract void drawArc(int x, int y, int width, int height, ! int startAngle, int arcAngle); ! ! public abstract void fillArc(int x, int y, int width, int height, ! int startAngle, int arcAngle); ! ! public abstract void drawPolyline(int[] xPoints, int[] yPoints, ! int nPoints); ! ! public abstract void drawPolygon(int[] xPoints, int[] yPoints, ! int nPoints); ! ! //public void drawPolygon(Polygon p); ! ! public abstract void fillPolygon(int[] xPoints, int[] yPoints, ! int nPoints); ! //public void fillPolygon(Polygon p); ! public abstract void drawString(String str, int x, int y); ! /* ! public abstract void drawString(AttributedCharacterIterator iterator, int x, int y) */ ! public void drawChars(char[] data, int offset, int length, ! int x, int y) ! { ! String str = new String(data, offset, length); ! drawString(str, x, y); ! } ! public void drawBytes(byte[] data, int offset, int length, ! int x, int y) ! { ! String str = new String(data, offset, length); ! drawString(str, x, y); ! } ! public abstract boolean drawImage(Image img, int x, int y, ! ImageObserver observer); ! public abstract boolean drawImage(Image img, int x, int y, ! int width, int height, ! ImageObserver observer); ! public abstract boolean drawImage(Image img, int x, int y, Color bgcolor, ! ImageObserver observer); ! ! public abstract boolean drawImage(Image img, int x, int y, ! int width, int height, Color bgcolor, ! ImageObserver observer); ! public abstract boolean drawImage(Image img, ! int dx1, int dy1, int dx2, int dy2, ! int sx1, int sy1, int sx2, int sy2, ! ImageObserver observer); ! public abstract boolean drawImage(Image img, ! int dx1, int dy1, int dx2, int dy2, ! int sx1, int sy1, int sx2, int sy2, ! Color bgcolor, ImageObserver observer); ! public abstract void dispose(); ! ! public void finalize() ! { ! dispose(); ! } ! public String toString() ! { ! return super.toString(); // FIXME ! } ! ! /** @deprecated */ ! public Rectangle getClipRect() ! { ! return getClipBounds(null); ! } ! public boolean hitClip(int x, int y, int width, int height) ! { ! throw new UnsupportedOperationException("not implemented yet"); ! } ! public Rectangle getClipBounds(Rectangle r) ! { ! Rectangle clipBounds = getClipBounds(); ! if (r == null) ! return clipBounds; ! r.x = clipBounds.x; ! r.y = clipBounds.y; ! r.width = clipBounds.width; ! r.height = clipBounds.height; ! return r; ! } } --- 1,804 ---- ! /* Graphics.java -- Abstract Java drawing class ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; import java.awt.image.ImageObserver; /** ! * This is the abstract superclass of classes for drawing to graphics ! * devices such as the screen or printers. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ ! public abstract class Graphics ! { ! ! /* ! * Instance Variables ! */ ! ! /*************************************************************************/ ! ! /* ! * Constructors */ /** ! * Default constructor for subclasses. ! */ ! protected ! Graphics() ! { ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods */ ! /** ! * Returns a copy of this Graphics object. ! * ! * @return A copy of this object. ! */ ! public abstract Graphics ! create(); ! ! /*************************************************************************/ ! ! /** ! * Returns a copy of this Graphics object. The origin point ! * will be translated to the point (x, y) and the cliping rectangle set ! * to the intersection of the clipping rectangle in this object and the ! * rectangle specified by the parameters to this method. ! * ! * @param x The new X coordinate of the clipping region rect. ! * @param y The new Y coordinate of the clipping region rect. ! * @param width The width of the clipping region intersect rectangle. ! * @param height The height of the clipping region intersect rectangle. ! * ! * @return A copy of this object, modified as specified. ! */ ! public Graphics ! create(int x, int y, int width, int height) { ! Graphics g = create(); ! ! g.translate(x, y); ! // FIXME: I'm not sure if this will work. Are the old clip rect bounds ! // translated above? ! g.clipRect(0, 0, width, height); ! ! return(g); ! } ! ! /*************************************************************************/ ! ! /** ! * Translates this context so that its new origin point is the point ! * (x, y). ! * ! * @param x The new X coordinate of the origin. ! * @param y The new Y coordinate of the origin. ! */ ! public abstract void ! translate(int x, int y); ! ! /*************************************************************************/ ! ! /** ! * Returns the current color for this object. ! * ! * @return The color for this object. ! */ ! public abstract Color ! getColor(); ! ! /*************************************************************************/ ! ! /** ! * Sets the current color for this object. ! * ! * @param color The new color. ! */ ! public abstract void ! setColor(Color color); ! ! /*************************************************************************/ ! ! /** ! * Sets this context into "paint" mode, where the target pixels are ! * completely overwritten when drawn on. ! */ ! public abstract void ! setPaintMode(); ! ! /*************************************************************************/ ! ! /** ! * Sets this context info "XOR" mode, where the targe pixles are ! * XOR-ed when drawn on. ! * ! * @param color The color to XOR against. ! */ ! public abstract void ! setXORMode(Color color); ! /*************************************************************************/ ! /** ! * Returns the current font for this graphics context. ! * ! * @return The current font. ! */ ! public abstract Font ! getFont(); ! /*************************************************************************/ ! /** ! * Sets the font for this graphics context to the specified value. ! * ! * @param font The new font. ! */ ! public abstract void ! setFont(Font font); ! /*************************************************************************/ ! /** ! * Returns the font metrics for the current font. ! * ! * @return The font metrics for the current font. ! */ ! public FontMetrics ! getFontMetrics() ! { ! return(getFontMetrics(getFont())); ! } ! /*************************************************************************/ ! /** ! * Returns the font metrics for the specified font. ! * ! * @param font The font to return metrics for. ! * ! * @return The requested font metrics. ! */ ! public abstract FontMetrics ! getFontMetrics(Font font); ! /*************************************************************************/ ! /** ! * Returns the bounding rectangle of the clipping region for this ! * graphics context. ! * ! * @return The bounding rectangle for the clipping region. ! */ ! public abstract Rectangle ! getClipBounds(); ! /*************************************************************************/ ! /** ! * Returns the bounding rectangle of the clipping region for this ! * graphics context. ! * ! * @return The bounding rectangle for the clipping region. ! * ! * @deprecated This method is deprecated in favor of ! * getClipBounds(). ! */ ! public Rectangle ! getClipRect() ! { ! return(getClipBounds()); ! } ! /*************************************************************************/ ! /** ! * Sets the clipping region to the intersection of the current clipping ! * region and the rectangle determined by the specified parameters. ! * ! * @param x The X coordinate of the upper left corner of the intersect rect. ! * @param Y The Y coordinate of the upper left corner of the intersect rect. ! * @param width The width of the intersect rect. ! * @param height The height of the intersect rect. ! */ ! public abstract void ! clipRect(int x, int y, int width, int height); ! /*************************************************************************/ ! /** ! * Sets the clipping region to the rectangle determined by the specified ! * parameters. ! * ! * @param x The X coordinate of the upper left corner of the rect. ! * @param y The Y coordinate of the upper left corner of the rect. ! * @param width The width of the rect. ! * @param height The height of the rect. ! */ ! public abstract void ! setClip(int x, int y, int width, int height); ! /*************************************************************************/ ! /** ! * Returns the current clipping region as a Shape object. ! * ! * @return The clipping region as a Shape. ! */ ! public abstract Shape ! getClip(); ! /*************************************************************************/ ! /** ! * Sets the clipping region to the specified Shape. ! * ! * @param shape The new clipping region. ! */ ! public abstract void ! setClip(Shape clip); ! ! /*************************************************************************/ ! ! /** ! * Copies the specified rectangle to the specified offset location. ! * ! * @param x The X coordinate of the upper left corner of the copy rect. ! * @param y The Y coordinate of the upper left corner of the copy rect. ! * @param width The width of the copy rect. ! * @param height The height of the copy rect. ! * @param dx The offset from the X value to start drawing. ! * @param dy The offset from the Y value to start drawing. ! */ ! public abstract void ! copyArea(int x, int y, int width, int height, int dx, int dy); ! ! /*************************************************************************/ ! ! /** ! * Draws a line between the two specified points. ! * ! * @param x1 The X coordinate of the first point. ! * @param y1 The Y coordinate of the first point. ! * @param x2 The X coordinate of the second point. ! * @param y2 The Y coordinate of the second point. ! */ ! public abstract void ! drawLine(int x1, int y1, int x2, int y2); ! ! /*************************************************************************/ ! ! /** ! * Fills the area bounded by the specified rectangle. ! * ! * @param x The X coordinate of the upper left corner of the fill rect. ! * @param y The Y coordinate of the upper left corner of the fill rect. ! * @param width The width of the fill rect. ! * @param height The height of the fill rect. ! */ ! public abstract void ! fillRect(int x, int y, int width, int height); ! ! /*************************************************************************/ ! ! /** ! * Draws the outline of the specified rectangle. ! * ! * @param x The X coordinate of the upper left corner of the draw rect. ! * @param y The Y coordinate of the upper left corner of the draw rect. ! * @param width The width of the draw rect. ! * @param height The height of the draw rect. ! */ ! public void ! drawRect(int x, int y, int width, int height) ! { ! int x1 = x; ! int y1 = y; ! int x2 = x + width; ! int y2 = y + height; ! drawLine(x1, y1, x2, y1); ! drawLine(x2, y1, x2, y2); ! drawLine(x2, y2, x1, y2); ! drawLine(x1, y2, x1, y1); ! } ! ! /*************************************************************************/ ! ! /** ! * Clears the specified rectangle. ! * ! * @param x The X coordinate of the upper left corner of the clear rect. ! * @param y The Y coordinate of the upper left corner of the clear rect. ! * @param width The width of the clear rect. ! * @param height The height of the clear rect. ! */ ! public abstract void ! clearRect(int x, int y, int width, int height); ! ! /*************************************************************************/ ! ! /** ! * Draws the outline of the specified rectangle with rounded cornders. ! * ! * @param x The X coordinate of the upper left corner of the draw rect. ! * @param y The Y coordinate of the upper left corner of the draw rect. ! * @param width The width of the draw rect. ! * @param height The height of the draw rect. ! * @param arcWidth The width of the corner arcs. ! * @param arcHeigth The height of the corner arcs. ! */ ! public abstract void ! drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); ! ! /*************************************************************************/ ! ! /** ! * Fills the specified rectangle with rounded cornders. ! * ! * @param x The X coordinate of the upper left corner of the fill rect. ! * @param y The Y coordinate of the upper left corner of the fill rect. ! * @param width The width of the fill rect. ! * @param height The height of the fill rect. ! * @param arcWidth The width of the corner arcs. ! * @param arcHeigth The height of the corner arcs. ! */ ! public abstract void ! fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); ! ! /*************************************************************************/ ! ! public void ! draw3DRect(int x, int y, int width, int height, boolean raised) ! { ! Color color = getColor(); ! Color tl = color.brighter(); ! Color br = color.darker(); ! if (!raised) ! { ! Color tmp = tl; ! tl = br; ! br = tmp; ! } ! int x1 = x; ! int y1 = y; ! int x2 = x + width; ! int y2 = y + height; ! setColor(tl); ! drawLine(x1, y1, x2, y1); ! drawLine(x1, y2, x1, y1); ! setColor(br); ! drawLine(x2, y1, x2, y2); ! drawLine(x2, y1, x1, y2); ! setColor(color); ! } ! /** ! * Fills the specified rectangle with a 3D effect ! * ! * @param x The X coordinate of the upper left corner of the fill rect. ! * @param y The Y coordinate of the upper left corner of the fill rect. ! * @param width The width of the fill rect. ! * @param height The height of the fill rect. ! * @param raised true if the rectangle appears raised, ! * false if it should appear etched. ! */ ! public void ! fill3DRect(int x, int y, int width, int height, boolean raised) ! { ! fillRect(x, y, width, height); ! draw3DRect(x, y, width-1, height-1, raised); ! } ! /*************************************************************************/ ! /** ! * Draws the outline of the specified rectangle with a 3D effect ! * ! * @param x The X coordinate of the upper left corner of the draw rect. ! * @param y The Y coordinate of the upper left corner of the draw rect. ! * @param width The width of the draw rect. ! * @param height The height of the draw rect. ! * @param raised true if the rectangle appears raised, ! * false if it should appear etched. ! */ ! public void ! drawRoundRect(int x, int y, int width, int height, boolean raised) ! { ! // FIXME: ??? ! } ! /*************************************************************************/ ! /** ! * Draws an oval that just fits within the specified rectangle. ! * ! * @param x The X coordinate of the upper left corner of the rect. ! * @param y The Y coordinate of the upper left corner of the rect. ! * @param width The width of the rect. ! * @param height The height of the rect. ! */ ! public abstract void ! drawOval(int x, int y, int width, int height); ! ! /*************************************************************************/ ! ! /** ! * Fills an oval that just fits within the specified rectangle. ! * ! * @param x The X coordinate of the upper left corner of the rect. ! * @param y The Y coordinate of the upper left corner of the rect. ! * @param width The width of the rect. ! * @param height The height of the rect. ! */ ! public abstract void ! fillOval(int x, int y, int width, int height); ! ! /*************************************************************************/ ! ! /** ! * Draws an arc using the specified bounding rectangle and the specified ! * angle parameter. The arc is centered at the center of the rectangle. ! * The arc starts at the arcAngle position and extend for arcAngle ! * degrees. The degree origin is at the 3 o'clock position. ! * ! * @param x The X coordinate of the upper left corner of the rect. ! * @param y The Y coordinate of the upper left corner of the rect. ! * @param width The width of the rect. ! * @param height The height of the rect. ! * @param arcStart The beginning angle of the arc. ! * @param arcAngle The extent of the arc. ! */ ! public abstract void ! drawArc(int x, int y, int width, int height, int startAngle, int arcAngle); ! ! /*************************************************************************/ ! ! /** ! * Fills the arc define by the specified bounding rectangle and the specified ! * angle parameter. The arc is centered at the center of the rectangle. ! * The arc starts at the arcAngle position and extend for arcAngle ! * degrees. The degree origin is at the 3 o'clock position. ! * ! * @param x The X coordinate of the upper left corner of the rect. ! * @param y The Y coordinate of the upper left corner of the rect. ! * @param width The width of the rect. ! * @param height The height of the rect. ! * @param arcStart The beginning angle of the arc. ! * @param arcAngle The extent of the arc. ! */ ! public abstract void ! fillArc(int x, int y, int width, int height, int startAngle, int arcAngle); ! ! /*************************************************************************/ ! ! /** ! * Draws a series of interconnected lines determined by the arrays ! * of corresponding x and y coordinates. ! * ! * @param xPoints The X coordinate array. ! * @param yPoints The Y coordinate array. ! * @param npoints The number of points to draw. ! */ ! public abstract void ! drawPolyline(int xPoints[], int yPoints[], int npoints); ! ! /*************************************************************************/ ! ! /** ! * Draws a series of interconnected lines determined by the arrays ! * of corresponding x and y coordinates. The figure is closed if necessary ! * by connecting the first and last points. ! * ! * @param xPoints The X coordinate array. ! * @param yPoints The Y coordinate array. ! * @param npoints The number of points to draw. ! */ ! public abstract void ! drawPolygon(int xPoints[], int yPoints[], int npoints); ! ! /*************************************************************************/ ! ! /** ! * Draws the specified polygon. ! * ! * @param polygon The polygon to draw. ! */ ! public void ! drawPolygon(Polygon polygon) ! { ! drawPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints); ! } ! ! /*************************************************************************/ ! ! /** ! * Fills the polygon determined by the arrays ! * of corresponding x and y coordinates. ! * ! * @param xPoints The X coordinate array. ! * @param yPoints The Y coordinate array. ! * @param npoints The number of points to draw. ! */ ! public abstract void ! fillPolygon(int xPoints[], int yPoints[], int npoints); ! ! /*************************************************************************/ ! ! /** ! * Fills the specified polygon ! * ! * @param polygon The polygon to fill. ! */ ! public void ! fillPolygon(Polygon polygon) ! { ! fillPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints); ! } ! ! /*************************************************************************/ ! ! /** ! * Draws the specified string starting at the specified point. ! * ! * @param string The string to draw. ! * @param x The X coordinate of the point to draw at. ! * @param y The Y coordinate of the point to draw at. ! */ ! public abstract void ! drawString(String string, int x, int y); ! ! /*************************************************************************/ ! ! /** ! * Draws the specified characters starting at the specified point. ! * ! * @param data The array of characters to draw. ! * @param offset The offset into the array to start drawing characters from. ! * @param length The number of characters to draw. ! * @param x The X coordinate of the point to draw at. ! * @param y The Y coordinate of the point to draw at. ! */ ! public void ! drawChars(char data[], int offset, int length, int x, int y) ! { ! drawString(new String(data, offset, length), x, y); ! } ! ! /*************************************************************************/ ! ! /** ! * Draws the specified bytes as text starting at the specified point. ! * ! * @param data The array of bytes to draw. ! * @param offset The offset into the array to start drawing bytes from. ! * @param length The number of bytes to draw. ! * @param x The X coordinate of the point to draw at. ! * @param y The Y coordinate of the point to draw at. ! */ ! public void ! drawChars(byte data[], int offset, int length, int x, int y) ! { ! drawString(new String(data, offset, length), x, y); ! } ! ! /* ! public abstract void drawString(AttributedCharacterIterator iterator, int x, int y) + */ + + public void + drawBytes(byte[] data, int offset, int length, int x, int y) + { + String str = new String(data, offset, length); + drawString(str, x, y); + } + + /*************************************************************************/ + + /** + * Draws all of the image that is available and returns. If the image + * is not completely loaded, false is returned and + * the specified iamge observer is notified as more data becomes + * available. + * + * @param image The image to draw. + * @param x The X coordinate of the point to draw at. + * @param y The Y coordinate of the point to draw at. + * @param observer The image observer to notify as data becomes available. + * + * @return true if all the image data is available, + * false otherwise. */ + public abstract boolean + drawImage(Image image, int x, int y, ImageObserver observer); + + /*************************************************************************/ ! /** ! * Draws all of the image that is available and returns. The image ! * is scaled to fit in the specified rectangle. If the image ! * is not completely loaded, false is returned and ! * the specified iamge observer is notified as more data becomes ! * available. ! * ! * @param image The image to draw. ! * @param x The X coordinate of the point to draw at. ! * @param y The Y coordinate of the point to draw at. ! * @param width The width of the rectangle to draw in. ! * @param height The height of the rectangle to draw in. ! * @param observer The image observer to notify as data becomes available. ! * ! * @return true if all the image data is available, ! * false otherwise. ! */ ! public abstract boolean ! drawImage(Image image, int x, int y, int width, int height, ! ImageObserver observer); ! ! /*************************************************************************/ ! /** ! * Draws all of the image that is available and returns. If the image ! * is not completely loaded, false is returned and ! * the specified iamge observer is notified as more data becomes ! * available. ! * ! * @param image The image to draw. ! * @param x The X coordinate of the point to draw at. ! * @param y The Y coordinate of the point to draw at. ! * @param bgcolor The background color to use for the image. ! * @param observer The image observer to notify as data becomes available. ! * ! * @return true if all the image data is available, ! * false otherwise. ! */ ! public abstract boolean ! drawImage(Image image, int x, int y, Color bgcolor, ImageObserver observer); ! ! /*************************************************************************/ ! /** ! * Draws all of the image that is available and returns. The image ! * is scaled to fit in the specified rectangle. If the image ! * is not completely loaded, false is returned and ! * the specified iamge observer is notified as more data becomes ! * available. ! * ! * @param image The image to draw. ! * @param x The X coordinate of the point to draw at. ! * @param y The Y coordinate of the point to draw at. ! * @param width The width of the rectangle to draw in. ! * @param height The height of the rectangle to draw in. ! * @param bgcolor The background color to use for the image. ! * @param observer The image observer to notify as data becomes available. ! * ! * @return true if all the image data is available, ! * false otherwise. ! */ ! public abstract boolean ! drawImage(Image image, int x, int y, int width, int height, Color bgcolor, ! ImageObserver observer); ! ! /*************************************************************************/ ! /** ! * FIXME: Write Javadocs for this when you understand it. ! */ ! public abstract boolean ! drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, ! int sx2, int sy2, ImageObserver observer); ! /*************************************************************************/ ! /** ! * FIXME: Write Javadocs for this when you understand it. ! */ ! public abstract boolean ! drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, ! int sx2, int sy2, Color bgcolor, ImageObserver observer); ! /*************************************************************************/ ! /** ! * Free any resources held by this graphics context immediately instead ! * of waiting for the object to be garbage collected and finalized. ! */ ! public abstract void ! dispose(); ! /*************************************************************************/ ! /** ! * Frees the resources held by this graphics context when it is ! * garbage collected. ! */ ! public void ! finalize() ! { ! dispose(); ! } ! /*************************************************************************/ ! /** ! * Returns a string representation of this object. ! * ! * @param A string representation of this object. ! */ ! public String ! toString() ! { ! return(super.toString()); ! } ! public boolean ! hitClip(int x, int y, int width, int height) ! { ! throw new UnsupportedOperationException("not implemented yet"); ! } ! ! public Rectangle ! getClipBounds(Rectangle r) ! { ! Rectangle clipBounds = getClipBounds(); ! ! if (r == null) ! return clipBounds; ! ! r.x = clipBounds.x; ! r.y = clipBounds.y; ! r.width = clipBounds.width; ! r.height = clipBounds.height; ! return r; } + + } // class Graphics + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Graphics2D.java gcc-3.1/libjava/java/awt/Graphics2D.java *** gcc-3.0.4/libjava/java/awt/Graphics2D.java Tue Aug 29 03:23:56 2000 --- gcc-3.1/libjava/java/awt/Graphics2D.java Tue Jan 22 22:40:05 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/GraphicsConfiguration.java gcc-3.1/libjava/java/awt/GraphicsConfiguration.java *** gcc-3.0.4/libjava/java/awt/GraphicsConfiguration.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/GraphicsConfiguration.java Tue Jan 22 22:40:05 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ /* Status: Complete, but commented out until we have the required GraphicsDevice. */ --- 1,38 ---- ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ /* Status: Complete, but commented out until we have the required GraphicsDevice. */ *************** import java.awt.geom.AffineTransform; *** 17,22 **** --- 45,56 ---- public abstract class GraphicsConfiguration { + // Can't instantiate directly. Having a protected constructor seems + // redundant, but that is what the docs specify. + protected GraphicsConfiguration () + { + } + /* public abstract GraphicsDevice getDevice(); */ diff -Nrc3pad gcc-3.0.4/libjava/java/awt/GridBagConstraints.java gcc-3.1/libjava/java/awt/GridBagConstraints.java *** gcc-3.0.4/libjava/java/awt/GridBagConstraints.java Tue Dec 26 07:18:16 2000 --- gcc-3.1/libjava/java/awt/GridBagConstraints.java Thu Jan 24 01:05:10 2002 *************** *** 1,12 **** // GridBagConstraints.java - Constraints for GridBag layout manager ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,41 ---- // GridBagConstraints.java - Constraints for GridBag layout manager ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** public class GridBagConstraints implemen *** 64,73 **** /** Create a copy of this object. */ public Object clone () { ! // This is lazy but it works. ! GridBagConstraints g = (GridBagConstraints) super.clone (); ! g.insets = (Insets) insets.clone (); ! return g; } /** Create a new GridBagConstraints object with the default --- 93,109 ---- /** Create a copy of this object. */ public Object clone () { ! try ! { ! GridBagConstraints g = (GridBagConstraints) super.clone (); ! g.insets = (Insets) insets.clone (); ! return g; ! } ! catch (CloneNotSupportedException _) ! { ! // Can't happen. ! return null; ! } } /** Create a new GridBagConstraints object with the default diff -Nrc3pad gcc-3.0.4/libjava/java/awt/GridLayout.java gcc-3.1/libjava/java/awt/GridLayout.java *** gcc-3.0.4/libjava/java/awt/GridLayout.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/GridLayout.java Tue Jan 29 16:31:24 2002 *************** *** 1,12 **** // GridLayout.java - Grid-based layout engine ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,41 ---- // GridLayout.java - Grid-based layout engine ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** import java.io.Serializable; *** 15,30 **** /** This class implements a grid-based layout scheme. Components are * all given the same size and are laid out from left to right and top * to bottom. A GridLayout is configured with a number of rows and a ! * number of columns. If either is zero then that dimension is ! * computed based on the actual size of the container. An exception ! * is thrown if an attempt is made to set both the number of rows and ! * the number of columns to 0. This class also support horizontal and ! * vertical gaps; these are used as spacing between cells. */ public class GridLayout implements LayoutManager, Serializable { /** Add a new component to the layout. This particular implementation * does nothing. */ public void addLayoutComponent (String name, Component comp) { --- 44,67 ---- /** This class implements a grid-based layout scheme. Components are * all given the same size and are laid out from left to right and top * to bottom. A GridLayout is configured with a number of rows and a ! * number of columns. If both are specified, then the number of ! * columns is ignored and is derived from the number of rows and the ! * total number of components. If either is zero then that dimension ! * is computed based on the actual size of the container. An ! * exception is thrown if an attempt is made to set both the number of ! * rows and the number of columns to 0. This class also supports ! * horizontal and vertical gaps; these are used as spacing between ! * cells. ! * ! * @author Tom Tromey ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public class GridLayout implements LayoutManager, Serializable { /** Add a new component to the layout. This particular implementation * does nothing. + * @param name The name of the component to add. + * @param component The component to add. */ public void addLayoutComponent (String name, Component comp) { *************** public class GridLayout implements Layou *** 55,70 **** return vgap; } ! /** Create a new GridLayout with one row and any number of columns. ! * Both gaps are set to 0. */ public GridLayout () { this (1, 0, 0, 0); } ! /** Create a new GridLayout with the specified number of rows and ! * columns. Both gaps are set to 0. * @param rows Number of rows * @param cols Number of columns * @exception IllegalArgumentException If rows and columns are both --- 92,109 ---- return vgap; } ! /** Create a new GridLayout with one row and any number ! * of columns. Both gaps are set to 0. */ public GridLayout () { this (1, 0, 0, 0); } ! /** Create a new GridLayout with the specified number ! * of rows and columns. Both gaps are set to 0. Note that the row ! * and column settings cannot both be zero. If both the row and ! * column values are non-zero, the rows value takes precedence. * @param rows Number of rows * @param cols Number of columns * @exception IllegalArgumentException If rows and columns are both *************** public class GridLayout implements Layou *** 77,82 **** --- 116,124 ---- /** Create a new GridLayout with the specified number of rows and * columns and the specified gaps. + * Note that the row and column settings cannot both be + * zero. If both the row and column values are non-zero, the rows value + * takes precedence. * @param rows Number of rows * @param cols Number of columns * @param hgap The horizontal gap *************** public class GridLayout implements Layou *** 103,113 **** } /** Lay out the container's components based on current settings. ! * @param parent The parent container */ public void layoutContainer (Container parent) { ! int num = parent.getComponentCount (); // This is more efficient than calling getComponents(). Component[] comps = parent.component; --- 145,157 ---- } /** Lay out the container's components based on current settings. ! * The free space in the container is divided evenly into the specified ! * number of rows and columns in this object. ! * @param parent The container to lay out */ public void layoutContainer (Container parent) { ! int num = parent.ncomponents; // This is more efficient than calling getComponents(). Component[] comps = parent.component; *************** public class GridLayout implements Layou *** 118,131 **** else real_cols = (num + real_rows - 1) / real_rows; Dimension d = parent.getSize (); Insets ins = parent.getInsets (); int tw = d.width - ins.left - ins.right; int th = d.height - ins.top - ins.bottom; ! int w = (tw - (real_rows - 1) * hgap) / real_rows; ! int h = (th - (real_cols - 1) * vgap) / real_cols; int x = ins.left; int y = ins.top; --- 162,186 ---- else real_cols = (num + real_rows - 1) / real_rows; + // We might have less than a single row. In this case we expand + // to fill. + if (num < real_cols) + real_cols = num; + Dimension d = parent.getSize (); Insets ins = parent.getInsets (); + // Compute width and height of each cell in the grid. int tw = d.width - ins.left - ins.right; + tw = (tw - (real_cols - 1) * hgap) / real_cols; int th = d.height - ins.top - ins.bottom; + th = (th - (real_rows - 1) * vgap) / real_rows; ! // If the cells are too small, still try to do something. ! if (tw < 0) ! tw = 1; ! if (th < 0) ! th = 1; int x = ins.left; int y = ins.top; *************** public class GridLayout implements Layou *** 191,196 **** --- 246,252 ---- /** Set the horizontal gap * @param hgap The horizontal gap + * @exception IllegalArgumentException If the hgap value is less than zero. */ public void setHgap (int hgap) { *************** public class GridLayout implements Layou *** 216,221 **** --- 272,278 ---- /** Set the vertical gap. * @param vgap The vertical gap + * @exception IllegalArgumentException If the vgap value is less than zero. */ public void setVgap (int vgap) { *************** public class GridLayout implements Layou *** 236,249 **** // This method is used to compute the various sizes. private Dimension getSize (Container parent, boolean is_min) { ! int w = 0, h = 0, num = parent.getComponentCount (); // This is more efficient than calling getComponents(). Component[] comps = parent.component; for (int i = 0; i < num; ++i) { - // FIXME: can we just directly read the fields in Component? - // Or will that not work with subclassing? Dimension d; if (is_min) --- 293,304 ---- // This method is used to compute the various sizes. private Dimension getSize (Container parent, boolean is_min) { ! int w = 0, h = 0, num = parent.ncomponents; // This is more efficient than calling getComponents(). Component[] comps = parent.component; for (int i = 0; i < num; ++i) { Dimension d; if (is_min) *************** public class GridLayout implements Layou *** 262,277 **** else real_cols = (num + real_rows - 1) / real_rows; // We subtract out an extra gap here because the gaps are only // between cells. ! return new Dimension (real_rows * (w + hgap) - hgap, ! real_cols * (h + vgap) - vgap); } ! // The gaps. private int hgap; private int vgap; - // Number of rows and columns. - private int rows; - private int cols; } --- 317,347 ---- else real_cols = (num + real_rows - 1) / real_rows; + Insets ins = parent.getInsets (); // We subtract out an extra gap here because the gaps are only // between cells. ! w = ins.left + ins.right + real_cols * (w + hgap) - hgap; ! h = ins.top + ins.bottom + real_rows * (h + vgap) - vgap; ! return new Dimension (w, h); } ! /** ! * @serial The number of columns in the grid. ! */ ! private int cols; ! ! /** ! * @serial The number of rows in the grid. ! */ ! private int rows; ! ! /** ! * @serial The horizontal gap between columns ! */ private int hgap; + + /** + * @serial The vertical gap between rows + */ private int vgap; } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/IllegalComponentStateException.java gcc-3.1/libjava/java/awt/IllegalComponentStateException.java *** gcc-3.0.4/libjava/java/awt/IllegalComponentStateException.java Sun Apr 9 04:13:27 2000 --- gcc-3.1/libjava/java/awt/IllegalComponentStateException.java Tue Jan 22 22:40:05 2002 *************** *** 1,30 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ ! package java.awt; ! /** ! * @author Tom Tromey ! * @date April 8, 2000 ! */ ! /* Status: Believed complete and correct to JDK 1.2. */ public class IllegalComponentStateException extends IllegalStateException { - public IllegalComponentStateException () - { - super (); - } ! public IllegalComponentStateException (String s) ! { ! super (s); ! } } --- 1,75 ---- ! /* IllegalComponentStateException.java -- Bad component state ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + package java.awt; + + /** + * This exception is thrown when the requested operation failed because + * a component was not in the proper state. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public class IllegalComponentStateException extends IllegalStateException { ! /** ! * Initializes a new instance of IllegalComponentStateException ! * with the specified detailed error message. ! * ! * @param message The detailed error message. ! */ ! public ! IllegalComponentStateException(String message) ! { ! super(message); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of IllegalComponentStateException ! * with no detailed error message. ! */ ! public ! IllegalComponentStateException() ! { ! super(); } + + } // class IllegalComponentStateException + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Image.java gcc-3.1/libjava/java/awt/Image.java *** gcc-3.0.4/libjava/java/awt/Image.java Mon Oct 2 05:14:25 2000 --- gcc-3.1/libjava/java/awt/Image.java Tue Jan 22 22:58:08 2002 *************** *** 1,51 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! import java.awt.image.ImageObserver; ! import java.awt.image.ImageProducer; /** ! * @author Warren Levy ! * @date March 15, 2000. */ /** ! * Written using on-line Java Platform 1.2 API Specification, as well ! * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). ! * Status: Mostly complete, but look for FIXMEs. */ ! public abstract class Image extends Object { ! public static final Object UndefinedProperty = new Object(); ! public static final int SCALE_DEFAULT = 1<<0, ! SCALE_FAST = 1<<1, ! SCALE_SMOOTH = 1<<2, ! SCALE_REPLICATE = 1<<3, ! SCALE_AREA_AVERAGING = 1<<4; ! public abstract int getWidth(ImageObserver observer); ! public abstract int getHeight(ImageObserver observer); ! public abstract ImageProducer getSource(); ! ! public abstract Graphics getGraphics(); ! public abstract Object getProperty(String name, ImageObserver observer); ! public Image getScaledInstance(int width, int height, int hints) { ! throw new UnsupportedOperationException("FIXME: not implemented yet"); } ! public abstract void flush(); ! } --- 1,197 ---- ! /* Image.java -- Java class for images ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.image.*; /** ! * This is the abstract superclass of all image objects in Java. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class Image ! { ! ! /* ! * Static Variables */ /** ! * Constant indicating that the default scaling algorithm should be used. ! */ ! public static final int SCALE_DEFAULT = 1; ! ! /** ! * Constant indicating that a fast scaling algorithm should be used. ! */ ! public static final int SCALE_FAST = 2; ! ! /** ! * Constant indicating that a smooth scaling algorithm should be used. ! */ ! public static final int SCALE_SMOOTH = 4; ! ! /** ! * Constant indicating that the ReplicateScaleFilter class ! * algorithm should be used for scaling. ! */ ! public static final int SCALE_REPLICATE = 8; ! ! /** ! * Constant indicating that the area averaging scaling algorithm should be ! * used. ! */ ! public static final int SCALE_AREA_AVERAGING = 16; ! ! /** ! * This variable is returned whenever a property that is not defined ! * is requested. ! */ ! public static final Object UndefinedProperty = Image.class; ! ! /*************************************************************************/ ! ! /* ! * Constructors */ ! /** ! * A default constructor for subclasses. ! */ ! public ! Image() { ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the width of the image, or -1 if it is unknown. If the ! * image width is unknown, the observer object will be notified when ! * the value is known. ! * ! * @param observer The image observer for this object. ! */ ! public abstract int ! getWidth(ImageObserver observer); ! /*************************************************************************/ ! /** ! * Returns the height of the image, or -1 if it is unknown. If the ! * image height is unknown, the observer object will be notified when ! * the value is known. ! * ! * @param observer The image observer for this object. ! */ ! public abstract int ! getHeight(ImageObserver observer); ! /*************************************************************************/ ! ! /** ! * Returns the image producer object for this object. ! * ! * @return The image producer for this object. ! */ ! public abstract ImageProducer ! getSource(); ! ! /*************************************************************************/ ! ! /** ! * Returns a graphics context object for drawing an off-screen object. ! * This method is only valid for off-screen objects. ! * ! * @return A graphics context object for an off-screen object. ! */ ! public abstract Graphics ! getGraphics(); ! ! /*************************************************************************/ ! ! /** ! * This method requests a named property for an object. The value of the ! * property is returned. The value UndefinedProperty is ! * returned if there is no property with the specified name. The value ! * null is returned if the properties for the object are ! * not yet known. In this case, the specified image observer is notified ! * when the properties are known. ! * ! * @param name The requested property name. ! * @param observer The image observer for this object. ! */ ! public abstract Object ! getProperty(String name, ImageObserver observer); ! ! /*************************************************************************/ ! ! /** ! * Scales the image to the requested dimension. ! * ! * XXX: FIXME ! * ! * @param width The width of the scaled image. ! * @param height The height of the scaled image. ! * @param flags A value indicating the algorithm to use, which will be ! * set from contants defined in this class. ! * ! * @return The scaled Image object. ! */ ! public Image ! getScaledInstance(int width, int height, int flags) { ! return null; } ! /*************************************************************************/ ! ! /** ! * Flushes (that is, destroys) any resources used for this image. This ! * includes the actual image data. ! */ ! public abstract void ! flush(); ! ! } // class Image ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Insets.java gcc-3.1/libjava/java/awt/Insets.java *** gcc-3.0.4/libjava/java/awt/Insets.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/Insets.java Tue Jan 22 22:58:08 2002 *************** *** 1,56 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; public class Insets implements Cloneable, java.io.Serializable { - public int top; - public int left; - public int bottom; - public int right; - - public Insets(int top, int left, int bottom, int right) - { - this.top = top; - this.left = left; - this.bottom = bottom; - this.right = right; - } ! public boolean equals(Object obj) ! { ! if (obj instanceof Insets) ! { ! Insets i = (Insets) obj; ! return (i.top == top ! && i.left == left ! && i.bottom == bottom ! && i.right == right); ! } ! return false; ! } ! public int hashCode() ! { ! // FIXME: what is the correct algorithm for this? ! return (top * (2 * left) * (3 * right) * (4 * bottom)); ! } ! public String toString() ! { ! return (getClass() + "[top=" + top + ",left=" + left + ",bottom=" ! + bottom + ",right=" + right + "]"); ! } ! ! public Object clone() ! { ! Insets r = new Insets(top, left, bottom, right); ! return r; ! } } --- 1,174 ---- ! /* Insets.java -- Information about a container border. ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + /** + * This class represents the "margin" or space around a container. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public class Insets implements Cloneable, java.io.Serializable { ! /* ! * Instance Variable ! */ ! /** ! * @serial The top inset ! */ ! public int top; ! /** ! * @serial This bottom inset ! */ ! public int bottom; ! ! /** ! * @serial The left inset ! */ ! public int left; ! ! /** ! * @serial The right inset ! */ ! public int right; ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of Inset with the specified ! * inset values. ! * ! * @param top The top inset ! * @param left The left inset ! * @param bottom The bottom inset ! * @param right The right inset ! */ ! public ! Insets(int top, int left, int bottom, int right) ! { ! this.top = top; ! this.left = left; ! this.bottom = bottom; ! this.right = right; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Tests whether this object is equal to the specified object. This will ! * be true if and only if the specified object: ! *

    ! *

      ! *
    • Is not null. ! *
    • Is an instance of Insets. ! *
    • Has the same top, bottom, left, and right inset values as this object. ! *
    ! * ! * @param obj The object to test against. ! * ! * @return true if the specified object is equal to this ! * one, false otherwise. ! */ ! public boolean ! equals(Object obj) ! { ! if (!(obj instanceof Insets)) ! return(false); ! ! Insets i = (Insets)obj; ! ! if (i.top != top) ! return(false); ! if (i.bottom != bottom) ! return(false); ! if (i.left != left) ! return(false); ! if (i.right != right) ! return(false); ! ! return(true); ! } ! ! public int ! hashCode() ! { ! return top + bottom + left + right; ! } ! ! /*************************************************************************/ ! ! /** ! * Returns a string representation of this object. ! * ! * @return A string representation of this object. ! */ ! public String ! toString() ! { ! return(getClass().getName() + "(top=" + top + ",bottom=" + bottom + ! ",left=" + left + ",right=" + right + ")"); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns a copy of this object. ! * ! * @return A copy of this object. ! */ ! public Object ! clone() ! { ! try ! { ! return(super.clone()); ! } ! catch(Exception e) ! { ! return(null); ! } } + + } // class Insets diff -Nrc3pad gcc-3.0.4/libjava/java/awt/ItemSelectable.java gcc-3.1/libjava/java/awt/ItemSelectable.java *** gcc-3.0.4/libjava/java/awt/ItemSelectable.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/ItemSelectable.java Tue Jan 22 22:40:05 2002 *************** *** 1,36 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; - import java.awt.event.*; ! /** This interface is implemented by components that support the ! * select of items. For instance, Checkbox implements this ! * interface. ! * @author Tom Tromey ! * @date April 8, 2000 ! */ public interface ItemSelectable { - /** This method adds a listener to receive item events fired by the - * component. - * @param l The item listener to add. - */ - public void addItemListener (ItemListener l); ! /** This method returns the items in this component which are ! * currently selected. ! * @returns A non-null array containing the items. ! */ ! public Object[] getSelectedObjects (); - /** This method removes an item listener. - * @param l The item listener to remove. - */ - public void removeItemListener (ItemListener l); - } --- 1,84 ---- ! /* ItemSelectable.java -- Items that can be selected ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.event.ItemListener; ! ! /** ! * This interface is for objects that can have one or more items ! * selected. For example, radio buttons. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public interface ItemSelectable { ! /** ! * Returns the list of objects that are selected in this component. ! * ! * @return The list of objects that are selected, or null if ! * no objects are selected. ! */ ! public abstract Object[] ! getSelectedObjects(); ! ! /*************************************************************************/ ! ! /** ! * Adds an item listener to this object. It will receive ! * selection events for this object. ! * ! * @param listener The item listener to add. ! */ ! public abstract void ! addItemListener(ItemListener listener); ! ! /*************************************************************************/ ! ! /** ! * Removes an item listener from this object. It will no longer receive ! * selection change events. ! * ! * @param listener The item listener to remove. ! */ ! public abstract void ! removeItemListener(ItemListener listener); ! ! } // interface ItemSelectable diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Label.java gcc-3.1/libjava/java/awt/Label.java *** gcc-3.0.4/libjava/java/awt/Label.java Mon Dec 18 22:17:25 2000 --- gcc-3.1/libjava/java/awt/Label.java Tue Jan 22 22:40:05 2002 *************** *** 1,87 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! import java.awt.peer.ComponentPeer; import java.awt.peer.LabelPeer; /** ! * @author Tom Tromey ! * @date April 12, 2000 */ ! public class Label extends Component { ! public static final int CENTER = 1; ! public static final int LEFT = 0; ! public static final int RIGHT = 2; ! public Label () ! { ! this ("", LEFT); ! } ! public Label (String text) ! { ! this (text, LEFT); ! } ! public Label (String text, int alignment) ! { ! if (alignment != CENTER && alignment != LEFT && alignment != RIGHT) ! throw new IllegalArgumentException (); ! this.text = text; ! this.alignment = alignment; ! } ! public void addNotify () ! { ! if (peer == null) ! peer = getToolkit ().createLabel (this); ! } ! public int getAlignment () ! { ! return alignment; ! } ! public String getText () ! { ! return text; ! } ! protected String paramString () ! { ! return "Label[" + alignment + "," + text + "]"; ! } ! public void setAlignment (int alignment) ! { ! if (alignment != CENTER && alignment != LEFT && alignment != RIGHT) ! throw new IllegalArgumentException (); ! this.alignment = alignment; ! if (peer != null) ! { ! LabelPeer lp = (LabelPeer) peer; ! lp.setAlignment (alignment); ! } ! } ! public void setText (String text) ! { ! this.text = text; ! if (peer != null) ! { ! LabelPeer lp = (LabelPeer) peer; ! lp.setText (text); ! } ! } ! private String text; ! private int alignment; } --- 1,244 ---- ! /* Label.java -- Java label widget ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.LabelPeer; + import java.awt.peer.ComponentPeer; /** ! * This component is used for displaying simple text strings that cannot ! * be edited. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class Label extends Component implements java.io.Serializable ! { ! ! /* ! * Static Variables */ ! /** ! * Alignment constant aligning the text to the left of its window. ! */ ! public static final int LEFT = 0; ! ! /** ! * Alignment constant aligning the text in the center of its window. ! */ ! public static final int CENTER = 1; ! ! /** ! * Alignment constant aligning the text to the right of its window. ! */ ! public static final int RIGHT = 2; ! ! // Serialization version constant: ! private static final long serialVersionUID = 3094126758329070636L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial Indicates the alignment of the text within this label's window. ! * This is one of the constants in this class. The default value is ! * LEFT. ! */ ! private int alignment; ! ! /** ! * @serial The text displayed in the label ! */ ! private String text; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Label with no text. ! */ ! public ! Label() { ! this("", LEFT); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Label with the specified ! * text that is aligned to the left. ! * ! * @param text The text of the label. ! */ ! public ! Label(String text) ! { ! this(text, LEFT); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Label with the specified ! * text and alignment. ! * ! * @param text The text of the label. ! * @param alignment The desired alignment for the text in this label, ! * which must be one of LEFT, CENTER, or ! * RIGHT. ! */ ! public ! Label(String text, int alignment) ! { ! setAlignment (alignment); ! setText (text); ! } ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * Returns the constant indicating the alignment of the text in this ! * label. The value returned will be one of the alignment constants ! * from this class. ! * ! * @return The alignment of the text in the label. ! */ ! public int ! getAlignment() ! { ! return(alignment); ! } ! /*************************************************************************/ ! /** ! * Sets the text alignment of this label to the specified value. ! * ! * @param alignment The desired alignment for the text in this label, ! * which must be one of LEFT, CENTER, or ! * RIGHT. ! */ ! public synchronized void ! setAlignment(int alignment) ! { ! if (alignment != CENTER && alignment != LEFT && alignment != RIGHT) ! throw new IllegalArgumentException ("invalid alignment: " + alignment); ! this.alignment = alignment; ! if (peer != null) ! { ! LabelPeer lp = (LabelPeer) peer; ! lp.setAlignment (alignment); ! } ! } ! /*************************************************************************/ ! ! /** ! * Returns the text displayed in this label. ! * ! * @return The text for this label. ! */ ! public String ! getText() ! { ! return(text); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the text in this label to the specified value. ! * ! * @param text The new text for this label. ! */ ! public synchronized void ! setText(String text) ! { ! this.text = text; ! ! if (peer != null) ! { ! LabelPeer lp = (LabelPeer) peer; ! lp.setText (text); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * Notifies this lable that it has been added to a container, causing ! * the peer to be created. This method is called internally by the AWT ! * system. ! */ ! public void ! addNotify() ! { ! if (peer == null) ! peer = getToolkit ().createLabel (this); ! super.addNotify (); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns a parameter string useful for debugging. ! * ! * @param A debugging string. ! */ ! protected String ! paramString() ! { ! return ("text=" + getText() + ",alignment=" + ! getAlignment() + "," + super.paramString()); } + + } // class Label + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/LayoutManager.java gcc-3.1/libjava/java/awt/LayoutManager.java *** gcc-3.0.4/libjava/java/awt/LayoutManager.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/java/awt/LayoutManager.java Tue Jan 22 22:40:05 2002 *************** *** 1,20 **** ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ ! package java.awt; ! /* Status: Believed complete and correct. */ public interface LayoutManager { ! public void addLayoutComponent (String name, Component comp); ! public void layoutContainer (Container parent); ! public Dimension minimumLayoutSize (Container parent); ! public Dimension preferredLayoutSize (Container parent); ! public void removeLayoutComponent (Component comp); ! } --- 1,106 ---- ! /* LayoutManager.java -- Layout containers in a Window ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.awt; + /** + * This interface is for laying out containers. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public interface LayoutManager { ! ! /** ! * Adds the specified component to the layout group. ! * ! * @param name The name of the component to add. ! * @param component The component to add. ! */ ! public abstract void ! addLayoutComponent(String name, Component component); ! ! /*************************************************************************/ ! ! /** ! * Removes the specified component from the layout group. ! * ! * @param component The component to remove. ! */ ! public abstract void ! removeLayoutComponent(Component component); ! ! /*************************************************************************/ ! ! /** ! * Calculates the preferred size for this container, taking into account ! * the components in the specified parent container. ! * ! * @param parent The parent container. ! * ! * @return The preferred dimensions of this container. ! */ ! public abstract Dimension ! preferredLayoutSize(Container parent); ! ! /*************************************************************************/ ! ! /** ! * Calculates the minimum size for this container, taking into account ! * the components in the specified parent container. ! * ! * @param parent The parent container. ! * ! * @return The minimum dimensions of this container. ! */ ! public abstract Dimension ! minimumLayoutSize(Container parent); ! ! /*************************************************************************/ ! ! /** ! * Lays out the components in this container on the specified parent ! * container. ! * ! * @param parent The parent container. ! */ ! public abstract void ! layoutContainer(Container parent); ! ! } // interface LayoutManager ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/LayoutManager2.java gcc-3.1/libjava/java/awt/LayoutManager2.java *** gcc-3.0.4/libjava/java/awt/LayoutManager2.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/java/awt/LayoutManager2.java Tue Jan 22 22:40:05 2002 *************** *** 1,20 **** ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ ! package java.awt; ! /* Status: Believed complete and correct. */ public interface LayoutManager2 extends LayoutManager { ! public void addLayoutComponent (Component comp, Object constraints); ! public float getLayoutAlignmentX (Container target); ! public float getLayoutAlignmentY (Container target); ! public void invalidateLayout (Container target); ! public Dimension maximumLayoutSize (Container target); ! } --- 1,108 ---- ! /* LayoutManager2.java -- Enhanced layout manager. ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt; + + /** + * Layout manager for laying out containers based on contraints. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public interface LayoutManager2 extends LayoutManager { ! ! /** ! * Adds the specified component to the layout, with the specified ! * constraint object. ! * ! * @param component The component to add. ! * @param constraint The constraint object. ! */ ! public abstract void ! addLayoutComponent(Component component, Object contraint); ! ! /*************************************************************************/ ! ! /** ! * Determines the minimum size of the specified target container. ! * ! * @param target The target container. ! */ ! public abstract Dimension ! maximumLayoutSize(Container target); ! ! /*************************************************************************/ ! ! /** ! * Returns the preferred X axis alignment for the specified target ! * container. This value will range from 0 to 1 where 0 is alignment ! * closest to the origin, 0.5 is centered, and 1 is aligned furthest ! * from the origin. ! * ! * @param target The target container. ! */ ! public abstract float ! getLayoutAlignmentX(Container target); ! ! /*************************************************************************/ ! ! /** ! * Returns the preferred Y axis alignment for the specified target ! * container. This value will range from 0 to 1 where 0 is alignment ! * closest to the origin, 0.5 is centered, and 1 is aligned furthest ! * from the origin. ! * ! * @param target The target container. ! */ ! public abstract float ! getLayoutAlignmentY(Container target); ! ! /*************************************************************************/ ! ! /** ! * Forces the layout manager to purge any cached information about ! * the layout of the target container. This will force it to be ! * recalculated. ! * ! * @param target The target container. ! */ ! public abstract void ! invalidateLayout(Container target); ! ! } // interface LayoutManager2 ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/List.java gcc-3.1/libjava/java/awt/List.java *** gcc-3.0.4/libjava/java/awt/List.java Thu Aug 3 12:09:38 2000 --- gcc-3.1/libjava/java/awt/List.java Wed Jan 30 02:47:48 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! /* A very incomplete placeholder. */ ! public class List extends Component { } --- 1,1005 ---- ! /* List.java -- A listbox widget ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.io.Serializable; ! import java.awt.event.ActionEvent; ! import java.awt.event.ActionListener; ! import java.awt.event.ItemEvent; ! import java.awt.event.ItemListener; ! import java.awt.peer.ListPeer; ! import java.awt.peer.ComponentPeer; ! import java.util.Vector; ! /** ! * Class that implements a listbox widget ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class List extends Component implements ItemSelectable, Serializable ! { ! ! /* ! * Static Variables ! */ ! ! // Serialization constant ! private static final long serialVersionUID = -3304312411574666869L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! // FIXME: Need read/writeObject ! ! /** ! * @serial The items in the list. ! */ ! private Vector items = new Vector(); ! ! /** ! * @serial Indicates whether or not multiple items can be selected ! * simultaneously. ! */ ! private boolean multipleMode; ! ! /** ! * @serial The number of rows in the list. This is set on creation ! * only and cannot be modified. ! */ ! private int rows; ! ! /** ! * @serial An array of the item indices that are selected. ! */ ! private int[] selected; ! ! /** ! * @serial An index value used by makeVisible() and ! * getVisibleIndex. ! */ ! private int visibleIndex; ! ! // The list of ItemListeners for this object. ! private ItemListener item_listeners; ! ! // The list of ActionListeners for this object. ! private ActionListener action_listeners; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of List with no visible lines ! * and multi-select disabled. ! */ ! public ! List() ! { ! this(4, false); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of List with the specified ! * number of visible lines and multi-select disabled. ! * ! * @param lines The number of visible lines in the list. ! */ ! public ! List(int rows) ! { ! this(rows, false); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of List with the specified ! * number of lines and the specified multi-select setting. ! * ! * @param lines The number of visible lines in the list. ! * @param multipleMode true if multiple lines can be selected ! * simultaneously, false otherwise. ! */ ! public ! List(int rows, boolean multipleMode) ! { ! this.rows = rows; ! this.multipleMode = multipleMode; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * Returns the number of items in this list. ! * ! * @return The number of items in this list. ! */ ! public int ! getItemCount() ! { ! return(items.size()); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the number of items in this list. ! * ! * @return The number of items in this list. ! * ! * @deprecated This method is deprecated in favor of ! * getItemCount() ! */ ! public int ! countItems() ! { ! return(getItemCount()); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the complete list of items. ! * ! * @return The complete list of items in the list. ! */ ! public synchronized String[] ! getItems() ! { ! String[] l_items = new String[getItemCount()]; ! ! items.copyInto(l_items); ! return(l_items); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the item at the specified index. ! * ! * @param index The index of the item to retrieve. ! * ! * @exception IndexOutOfBoundsException If the index value is not valid. ! */ ! public String ! getItem(int index) ! { ! return((String)items.elementAt(index)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the number of visible rows in the list. ! * ! * @return The number of visible rows in the list. ! */ ! public int ! getRows() ! { ! return(rows); ! } ! ! /*************************************************************************/ ! ! /** ! * Tests whether or not multi-select mode is enabled. ! * ! * @return true if multi-select mode is enabled, ! * false otherwise. ! */ ! public boolean ! isMultipleMode() ! { ! return(multipleMode); ! } ! ! /*************************************************************************/ ! ! /** ! * Tests whether or not multi-select mode is enabled. ! * ! * @return true if multi-select mode is enabled, ! * false otherwise. ! * ! * @deprecated This method is deprecated in favor of ! * isMultipleMode(). ! */ ! public boolean ! allowsMultipleSelections() ! { ! return(multipleMode); ! } ! ! /*************************************************************************/ ! ! /** ! * This method enables or disables multiple selection mode for this ! * list. ! * ! * @param multipleMode true to enable multiple mode, ! * false otherwise. ! */ ! public void ! setMultipleMode(boolean multipleMode) ! { ! this.multipleMode = multipleMode; ! if (peer != null) ! { ! ListPeer l = (ListPeer) peer; ! l.setMultipleMode (multipleMode); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * This method enables or disables multiple selection mode for this ! * list. ! * ! * @param multipleMode true to enable multiple mode, ! * false otherwise. ! */ ! public void ! setMultipleSelections(boolean multipleMode) ! { ! setMultipleMode(multipleMode); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum size of this component. ! * ! * @return The minimum size of this component. ! */ ! public Dimension ! getMinimumSize() ! { ! return(getMinimumSize(rows)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum size of this component. ! * ! * @return The minimum size of this component. ! * ! * @deprecated This method is deprecated in favor of ! * getMinimumSize. ! */ ! public Dimension ! minimumSize() ! { ! return(getMinimumSize(rows)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum size of this component assuming it had the specified ! * number of rows. ! * ! * @param rows The number of rows to size for. ! * ! * @return The minimum size of this component. ! */ ! public Dimension ! getMinimumSize(int rows) ! { ! ListPeer lp = (ListPeer)getPeer(); ! if (lp != null) ! return(lp.minimumSize(rows)); ! else ! return(new Dimension(0,0)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum size of this component assuming it had the specified ! * number of rows. ! * ! * @param rows The number of rows to size for. ! * ! * @return The minimum size of this component. ! * ! * @deprecated This method is deprecated in favor of ! * getMinimumSize(int)> ! */ ! public Dimension ! minimumSize(int rows) ! { ! return(getMinimumSize(rows)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the preferred size of this component. ! * ! * @return The preferred size of this component. ! */ ! public Dimension ! getPreferredSize() ! { ! return(getPreferredSize(rows)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the preferred size of this component. ! * ! * @return The preferred size of this component. ! * ! * @deprecated This method is deprecated in favor of ! * getPreferredSize. ! */ ! public Dimension ! preferredSize() ! { ! return(getPreferredSize(rows)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the preferred size of this component assuming it had the specified ! * number of rows. ! * ! * @param rows The number of rows to size for. ! * ! * @return The preferred size of this component. ! */ ! public Dimension ! getPreferredSize(int rows) ! { ! ListPeer lp = (ListPeer)getPeer(); ! if (lp != null) ! return(lp.preferredSize(rows)); ! else ! return(new Dimension(0,0)); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the preferred size of this component assuming it had the specified ! * number of rows. ! * ! * @param rows The number of rows to size for. ! * ! * @return The preferred size of this component. ! * ! * @deprecated This method is deprecated in favor of ! * getPreferredSize(int)> ! */ ! public Dimension ! preferredSize(int rows) ! { ! return(getPreferredSize(rows)); ! } ! ! /*************************************************************************/ ! ! /** ! * This method adds the specified item to the end of the list. ! * ! * @param item The item to add to the list. ! */ ! public void ! add(String item) ! { ! add(item, -1); ! } ! ! /*************************************************************************/ ! ! /** ! * This method adds the specified item to the end of the list. ! * ! * @param item The item to add to the list. ! * ! * @deprecated Use add() instead. ! */ ! public void ! addItem(String item) ! { ! addItem(item, -1); ! } ! ! /*************************************************************************/ ! ! /** ! * Adds the specified item to the specified location in the list. ! * If the desired index is -1 or greater than the number of rows ! * in the list, then the item is added to the end. ! * ! * @param item The item to add to the list. ! * @param index The location in the list to add the item, or -1 to add ! * to the end. ! */ ! public void ! add(String item, int index) ! { ! if ((index == -1) || (index >= items.size())) ! items.addElement(item); ! else ! items.insertElementAt(item, index); ! ! if (peer != null) ! { ! ListPeer l = (ListPeer) peer; ! l.add (item, index); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * Adds the specified item to the specified location in the list. ! * If the desired index is -1 or greater than the number of rows ! * in the list, then the item is added to the end. ! * ! * @param item The item to add to the list. ! * @param index The location in the list to add the item, or -1 to add ! * to the end. ! * ! * @deprecated Use add() instead. ! */ ! public void ! addItem(String item, int index) { + add(item, index); + } + + /*************************************************************************/ + + /** + * Deletes the item at the specified index. + * + * @param index The index of the item to delete. + * + * @exception IllegalArgumentException If the index is not valid + */ + public void + delItem(int index) throws IllegalArgumentException + { + remove(index); + } + + /*************************************************************************/ + + /** + * Deletes the item at the specified index. + * + * @param index The index of the item to delete. + * + * @exception IllegalArgumentException If the index is not valid + */ + public void + remove(int index) throws IllegalArgumentException + { + items.removeElementAt (index); + if (peer != null) + { + ListPeer l = (ListPeer) peer; + l.delItems (index, index); + } + } + + /*************************************************************************/ + + /** + * Deletes all items in the specified index range. + * + * @param start The beginning index of the range to delete. + * @param end The ending index of the range to delete. + * + * @exception IllegalArgumentException If the indexes are not valid + * + * @deprecated This method is deprecated for some unknown reason. + */ + public synchronized void + delItems(int start, int end) throws IllegalArgumentException + { + if ((start < 0) || (start >= items.size())) + throw new IllegalArgumentException("Bad list start index value: " + start); + + if ((start < 0) || (start >= items.size())) + throw new IllegalArgumentException("Bad list start index value: " + start); + + if (start > end) + throw new IllegalArgumentException("Start is greater than end!"); + + // We must run the loop in reverse direction. + for (int i = end; i >= start; --i) + items.removeElementAt (i); + if (peer != null) + { + ListPeer l = (ListPeer) peer; + l.delItems (start, end); + } + } + + /*************************************************************************/ + + /** + * Deletes the first occurrence of the specified item from the list. + * + * @param item The item to delete. + * + * @exception IllegalArgumentException If the specified item does not exist. + */ + public synchronized void + remove(String item) throws IllegalArgumentException + { + int index = items.indexOf(item); + if (index == -1) + throw new IllegalArgumentException("List element to delete not found"); + + remove(index); + } + + /*************************************************************************/ + + /** + * Deletes all of the items from the list. + */ + public synchronized void + removeAll() + { + items.clear(); + if (peer != null) + { + ListPeer l = (ListPeer) peer; + l.removeAll (); + } + } + + /*************************************************************************/ + + /** + * Deletes all of the items from the list. + * + * @deprecated This method is deprecated in favor of removeAll(). + */ + public void + clear() + { + removeAll(); + } + + /*************************************************************************/ + + /** + * Replaces the item at the specified index with the specified item. + * + * @param item The new item value. + * @param index The index of the item to replace. + * + * @exception IllegalArgumentException If the index is not valid. + */ + public synchronized void + replaceItem(String item, int index) throws IllegalArgumentException + { + remove(index); + addItem(item, index); + } + + /*************************************************************************/ + + /** + * Returns the index of the currently selected item. -1 will be returned + * if there are no selected rows or if there are multiple selected rows. + * + * @return The index of the selected row. + */ + public synchronized int + getSelectedIndex() + { + if (peer != null) + { + ListPeer l = (ListPeer) peer; + selected = l.getSelectedIndexes (); + } + + if (selected == null || selected.length > 1) + return -1; + return selected[0]; + } + + /*************************************************************************/ + + /** + * Returns an array containing the indexes of the rows that are + * currently selected. + * + * @return A list of indexes of selected rows. + */ + public synchronized int[] + getSelectedIndexes() + { + if (peer != null) + { + ListPeer l = (ListPeer) peer; + selected = l.getSelectedIndexes (); + } + return selected; + } + + /*************************************************************************/ + + /** + * Returns the item that is currently selected, or null if there + * is no item selected. FIXME: What happens if multiple items selected? + * + * @return The selected item, or null if there is no + * selected item. + */ + public synchronized String + getSelectedItem() + { + int index = getSelectedIndex(); + if (index == -1) + return(null); + + return((String)items.elementAt(index)); + } + + /*************************************************************************/ + + /** + * Returns the list of items that are currently selected in this list. + * + * @return The list of currently selected items. + */ + public synchronized String[] + getSelectedItems() + { + int[] indexes = getSelectedIndexes(); + if (indexes == null) + return(new String[0]); + + String[] retvals = new String[indexes.length]; + if (retvals.length > 0) + for (int i = 0 ; i < retvals.length; i++) + retvals[i] = (String)items.elementAt(indexes[i]); + + return(retvals); + } + + /*************************************************************************/ + + /** + * Returns the list of items that are currently selected in this list as + * an array of type Object[] instead of String[]. + * + * @return The list of currently selected items. + */ + public synchronized Object[] + getSelectedObjects() + { + int[] indexes = getSelectedIndexes(); + if (indexes == null) + return(new Object[0]); + + Object[] retvals = new Object[indexes.length]; + if (retvals.length > 0) + for (int i = 0 ; i < retvals.length; i++) + retvals[i] = items.elementAt(indexes[i]); + + return(retvals); + } + + /*************************************************************************/ + + /** + * Tests whether or not the specified index is selected. + * + * @param index The index to test. + * + * @return true if the index is selected, false + * otherwise. + */ + public boolean + isIndexSelected(int index) + { + int[] indexes = getSelectedIndexes(); + + for (int i = 0; i < indexes.length; i++) + if (indexes[i] == index) + return(true); + + return(false); + } + + /*************************************************************************/ + + /** + * Tests whether or not the specified index is selected. + * + * @param index The index to test. + * + * @return true if the index is selected, false + * otherwise. + * + * @deprecated This method is deprecated in favor of + * isIndexSelected(int). + */ + public boolean + isSelected(int index) + { + return(isIndexSelected(index)); + } + + /*************************************************************************/ + + /** + * This method ensures that the item at the specified index is visible. + * + * @exception IllegalArgumentException If the specified index is out of + * range. + */ + public synchronized void + makeVisible(int index) throws IllegalArgumentException + { + if ((index < 0) || (index >= items.size())) + throw new IllegalArgumentException("Bad list index: " + index); + + visibleIndex = index; + if (peer != null) + { + ListPeer l = (ListPeer) peer; + l.makeVisible (index); + } + } + + /*************************************************************************/ + + /** + * Returns the index of the last item that was made visible via the + * makeVisible() method. + * + * @return The index of the last item made visible via the + * makeVisible() method. + */ + public int + getVisibleIndex() + { + return(visibleIndex); + } + + /*************************************************************************/ + + /** + * Makes the item at the specified index selected. + * + * @param index The index of the item to select. + */ + public synchronized void + select(int index) + { + ListPeer lp = (ListPeer)getPeer(); + if (lp != null) + lp.select(index); } + + /*************************************************************************/ + + /** + * Makes the item at the specified index not selected. + * + * @param index The index of the item to unselect. + */ + public synchronized void + deselect(int index) + { + ListPeer lp = (ListPeer)getPeer(); + if (lp != null) + lp.deselect(index); + } + + /*************************************************************************/ + + /** + * Notifies this object to create its native peer. + */ + public void + addNotify() + { + if (peer == null) + peer = getToolkit ().createList (this); + super.addNotify (); + } + + /*************************************************************************/ + + /** + * Notifies this object to destroy its native peer. + */ + public void + removeNotify() + { + super.removeNotify(); + } + + /*************************************************************************/ + + /** + * Adds the specified ActionListener to the list of + * registered listeners for this object. + * + * @param listener The listener to add. + */ + public synchronized void + addActionListener(ActionListener listener) + { + action_listeners = AWTEventMulticaster.add(action_listeners, listener); + } + + /*************************************************************************/ + + /** + * Removes the specified ActionListener from the list of + * registers listeners for this object. + * + * @param listener The listener to remove. + */ + public synchronized void + removeActionListener(ActionListener listener) + { + action_listeners = AWTEventMulticaster.remove(action_listeners, listener); + } + + /*************************************************************************/ + + /** + * Adds the specified ItemListener to the list of + * registered listeners for this object. + * + * @param listener The listener to add. + */ + public synchronized void + addItemListener(ItemListener listener) + { + item_listeners = AWTEventMulticaster.add(item_listeners, listener); + } + + /*************************************************************************/ + + /** + * Removes the specified ItemListener from the list of + * registers listeners for this object. + * + * @param listener The listener to remove. + */ + public synchronized void + removeItemListener(ItemListener listener) + { + item_listeners = AWTEventMulticaster.remove(item_listeners, listener); + } + + /*************************************************************************/ + + /** + * Processes the specified event for this object. If the event is an + * instance of ActionEvent then the + * processActionEvent() method is called. Similarly, if the + * even is an instance of ItemEvent then the + * processItemEvent() method is called. Otherwise the + * superclass method is called to process this event. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof ActionEvent) + processActionEvent((ActionEvent)event); + if (event instanceof ItemEvent) + processItemEvent((ItemEvent)event); + + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * This method processes the specified event by dispatching it to any + * registered listeners. Note that this method will only get called if + * action events are enabled. This will happen automatically if any + * listeners are added, or it can be done "manually" by calling + * the enableEvents() method. + * + * @param event The event to process. + */ + protected void + processActionEvent(ActionEvent event) + { + if (action_listeners != null) + action_listeners.actionPerformed(event); + } + + /*************************************************************************/ + + /** + * This method processes the specified event by dispatching it to any + * registered listeners. Note that this method will only get called if + * item events are enabled. This will happen automatically if any + * listeners are added, or it can be done "manually" by calling + * the enableEvents() method. + * + * @param event The event to process. + */ + protected void + processItemEvent(ItemEvent event) + { + if (item_listeners != null) + item_listeners.itemStateChanged(event); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + protected String + paramString() + { + return "multiple=" + multipleMode + ",rows=" + rows + super.paramString(); + } + + } // class List diff -Nrc3pad gcc-3.0.4/libjava/java/awt/MediaTracker.java gcc-3.1/libjava/java/awt/MediaTracker.java *** gcc-3.0.4/libjava/java/awt/MediaTracker.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/MediaTracker.java Wed Mar 6 08:08:19 2002 *************** *** 0 **** --- 1,392 ---- + /* MediaTracker.java -- Class used for keeping track of images + Copyright (C) 1999, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt; + + import java.util.ArrayList; + import java.awt.image.ImageObserver; + + /** + * This class is used for keeping track of the status of various media + * objects. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Bryce McKinlay + */ + public class MediaTracker implements java.io.Serializable + { + public static final int LOADING = 1 << 0; + public static final int ABORTED = 1 << 1; + public static final int ERRORED = 1 << 2; + public static final int COMPLETE = 1 << 3; + + Component target; + MediaEntry head; + + static final long serialVersionUID = -483174189758638095L; + + // FIXME: The serialized form documentation says MediaEntry is a + // serializable field, but the serialized form of MediaEntry itself + // doesn't appear to be documented. + class MediaEntry implements ImageObserver + { + int id; + Image image; + MediaEntry next; + int status; + int width; + int height; + + public boolean imageUpdate(Image img, int flags, int x, int y, + int width, int height) + { + if ((flags & ABORT) != 0) + status = ABORTED & COMPLETE; + else if ((flags & ERROR) != 0) + status = ERRORED & COMPLETE; + else if ((flags & ALLBITS) != 0) + status = COMPLETE; + else + status = LOADING; + + synchronized (MediaTracker.this) + { + MediaTracker.this.notifyAll(); + } + + return ((status & COMPLETE) != 0); + } + } + + public MediaTracker(Component c) + { + target = c; + } + + public void addImage(Image image, int id) + { + MediaEntry e = new MediaEntry(); + e.id = id; + e.image = image; + e.next = head; + head = e; + // Start tracking image status. + target.checkImage(image, e); + } + + public void addImage(Image image, int id, int width, int height) + { + MediaEntry e = new MediaEntry(); + e.id = id; + e.image = image; + e.next = head; + e.width = width; + e.height = height; + head = e; + // Start tracking image status. + target.checkImage(image, width, height, e); + } + + public boolean checkAll() + { + return checkAll(false); + } + + public boolean checkAll(boolean load) + { + MediaEntry e = head; + boolean result = true; + + while (e != null) + { + if ((e.status & COMPLETE) == 0) + { + if (load) + { + result = false; + if (e.status == 0) + { + target.prepareImage(e.image, e); + e.status = LOADING; + } + } + else + return false; + } + e = e.next; + } + return result; + } + + public boolean isErrorAny() + { + MediaEntry e = head; + while (e != null) + { + if ((e.status & ERRORED) != 0) + return true; + e = e.next; + } + return false; + } + + public Object[] getErrorsAny() + { + MediaEntry e = head; + ArrayList result = null; + while (e != null) + { + if ((e.status & ERRORED) != 0) + { + if (result == null) + result = new ArrayList(); + result.add(e.image); + } + e = e.next; + } + if (result == null) + return null; + else + return result.toArray(); + } + + public void waitForAll() throws InterruptedException + { + synchronized (this) + { + while (checkAll(true) == false) + wait(); + } + } + + public boolean waitForAll(long ms) throws InterruptedException + { + long start = System.currentTimeMillis(); + synchronized (this) + { + while (!checkAll(true)) + wait(ms); + } + if ((System.currentTimeMillis() - start) < ms) + return true; + else + return false; + } + + public int statusAll(boolean load) + { + int result = 0; + MediaEntry e = head; + while (e != null) + { + if (load && e.status == 0) + { + target.prepareImage(e.image, e); + e.status = LOADING; + } + result |= e.status; + e = e.next; + } + return result; + } + + public boolean checkID(int id) + { + return checkID(id, false); + } + + public boolean checkID(int id, boolean load) + { + MediaEntry e = head; + boolean result = true; + + while (e != null) + { + if (e.id == id && ((e.status & COMPLETE) == 0)) + { + if (load) + { + result = false; + if (e.status == 0) + { + target.prepareImage(e.image, e); + e.status = LOADING; + } + } + else + return false; + } + e = e.next; + } + return result; + } + + public boolean isErrorID(int id) + { + MediaEntry e = head; + while (e != null) + { + if (e.id == id && ((e.status & ERRORED) != 0)) + return true; + e = e.next; + } + return false; + } + + public Object[] getErrorsID(int id) + { + MediaEntry e = head; + ArrayList result = null; + while (e != null) + { + if (e.id == id && ((e.status & ERRORED) != 0)) + { + if (result == null) + result = new ArrayList(); + result.add(e.image); + } + e = e.next; + } + if (result == null) + return null; + else + return result.toArray(); + } + + public void waitForID(int id) throws InterruptedException + { + MediaEntry e = head; + synchronized (this) + { + while (checkID (id, true) == false) + wait(); + } + } + + public boolean waitForID(int id, long ms) throws InterruptedException + { + MediaEntry e = head; + long start = System.currentTimeMillis(); + synchronized (this) + { + while (checkID (id, true) == false) + wait(ms); + } + if ((System.currentTimeMillis() - start) < ms) + return true; + else + return false; + } + + public int statusID(int id, boolean load) + { + int result = 0; + MediaEntry e = head; + while (e != null) + { + if (e.id == id) + { + if (load && e.status == 0) + { + target.prepareImage(e.image, e); + e.status = LOADING; + } + result |= e.status; + } + e = e.next; + } + return result; + } + + public void removeImage(Image image) + { + MediaEntry e = head; + MediaEntry prev = null; + while (e != null) + { + if (e.image == image) + { + if (prev == null) + head = e.next; + else + prev.next = e.next; + } + prev = e; + e = e.next; + } + } + + public void removeImage(Image image, int id) + { + MediaEntry e = head; + MediaEntry prev = null; + while (e != null) + { + if (e.id == id && e.image == image) + { + if (prev == null) + head = e.next; + else + prev.next = e.next; + } + else + prev = e; + e = e.next; + } + } + + public void removeImage(Image image, int id, int width, int height) + { + MediaEntry e = head; + MediaEntry prev = null; + while (e != null) + { + if (e.id == id && e.image == image + && e.width == width && e.height == height) + { + if (prev == null) + head = e.next; + else + prev.next = e.next; + } + else + prev = e; + e = e.next; + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Menu.java gcc-3.1/libjava/java/awt/Menu.java *** gcc-3.0.4/libjava/java/awt/Menu.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/Menu.java Tue Jan 22 22:58:08 2002 *************** *** 1,135 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; import java.util.Vector; ! /* Status: Incomplete. */ ! public class Menu extends MenuItem implements MenuContainer { ! // Fields from the serialization spec. Decalare others "transient". ! Vector items = new Vector(); ! boolean tearOff; ! boolean isHelpMenu; ! int menuSerializedDataVersion; ! ! static final MenuItem separator = new MenuItem("-"); ! public Menu() ! { ! this(null, false); ! } ! ! public Menu(String label) ! { ! this(label, false); ! } ! ! public Menu(String label, boolean tearOff) ! { ! super(label); ! this.tearOff = tearOff; ! } ! public void addNotify() ! { ! // FIXME ! } ! public void removeNotify() ! { ! // FIXME ! } ! public boolean isTearOff() ! { ! return tearOff; ! } ! public int getItemCount() ! { ! return items.size(); ! } ! /** @deprecated Use getItemCount() instead. */ ! public int countItems() ! { ! return getItemCount(); ! } ! public MenuItem getItem(int index) ! { ! return (MenuItem) items.elementAt(index); ! } ! public synchronized MenuItem add(MenuItem mi) ! { ! items.addElement(mi); ! if (mi.parent != null) ! { ! mi.parent.remove(mi); ! } ! mi.parent = this; ! return mi; ! } ! public void add(String label) ! { ! MenuItem mi = new MenuItem(label); ! this.add(mi); ! } ! public synchronized void insert(MenuItem menuitem, int index) ! { ! if (index < 0) ! throw new IllegalArgumentException(); ! items.insertElementAt(menuitem, index); ! } ! public void insert(String label, int index) ! { ! MenuItem mi = new MenuItem(label); ! this.insert(mi, index); ! } ! public void addSeparator() ! { ! this.add(separator); ! } ! public void insertSeparator(int index) ! { ! this.insert(separator, index); ! } ! public synchronized void remove(int index) ! { ! items.removeElementAt(index); ! } ! public synchronized void remove(MenuComponent item) ! { ! items.removeElement(item); ! } ! public synchronized void removeAll() ! { ! items.removeAllElements(); ! } ! public String paramString() ! { ! return getName() + ",label" + label + ",tearOff=" + tearOff + ! ",isHelpMenu=" + isHelpMenu; ! } ! ! // Accessibility API not yet implemented. ! // public AccessibleContext getAccessibleContext() } --- 1,409 ---- ! /* Menu.java -- A Java AWT Menu ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + import java.awt.peer.MenuPeer; + import java.awt.peer.MenuItemPeer; + import java.awt.peer.MenuComponentPeer; + import java.io.Serializable; import java.util.Vector; + import java.util.Enumeration; ! /** ! * This class represents a pull down or tear off menu in Java's AWT. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class Menu extends MenuItem implements MenuContainer, Serializable ! { ! /* ! * Static Variables ! */ ! ! // Serialization Constant ! private static final long serialVersionUID = -8809584163345499784L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The actual items in the menu ! */ ! private Vector items = new Vector(); ! ! /** ! * @serial Flag indicating whether or not this menu is a tear off ! */ ! private boolean isTearOff; ! ! /** ! * @serial Indicates whether or not this is a help menu. ! */ ! private boolean isHelpMenu; ! ! // From the serialization spec. FIXME: what should it be? ! private int menuSerializedDataVersion; ! ! static final MenuItem separator = new MenuItem("-"); ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Menu with no label and that ! * is not a tearoff; ! */ ! public ! Menu() { ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Menu that is not a tearoff and ! * that has the specified label. ! * ! * @param label The menu label. ! */ ! public ! Menu(String label) ! { ! this(label, false); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Menu with the specified ! * label and tearoff status. ! * ! * @param label The label for this menu ! * @param isTearOff true if this menu is a tear off menu, ! * false otherwise. ! */ ! public ! Menu(String label, boolean isTearOff) ! { ! super(label); ! this.isTearOff = isTearOff; ! if (label.equals("Help")) ! isHelpMenu = true; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Tests whether or not this menu is a tearoff. ! * ! * @return true if this menu is a tearoff, false ! * otherwise. ! */ ! public boolean ! isTearOff() ! { ! return(isTearOff); ! } ! /*************************************************************************/ ! /** ! * Returns the number of items in this menu. ! * ! * @return The number of items in this menu. ! */ ! public int ! getItemCount() ! { ! return(items.size()); ! } ! ! /*************************************************************************/ ! /** ! * Returns the number of items in this menu. ! * ! * @return The number of items in this menu. ! * ! * @deprecated This method is deprecated in favor of getItemCount(). ! */ ! public int ! count() ! { ! return(items.size()); ! } ! ! /*************************************************************************/ ! /** ! * Returns the item at the specified index. ! * ! * @return The item at the specified index. ! * ! * @exception ArrayIndexOutOfBoundsException If the index value is not valid. ! */ ! public MenuItem ! getItem(int index) ! { ! return((MenuItem)items.elementAt(index)); ! } ! /*************************************************************************/ ! /** ! * Adds the specified item to this menu. If it was previously part of ! * another menu, it is first removed from that menu. ! * ! * @param item The new item to add. ! * ! * @return The item that was added. ! */ ! public MenuItem ! add(MenuItem item) ! { ! items.addElement(item); ! if (item.parent != null) ! { ! item.parent.remove(item); ! } ! item.parent = this; ! if (peer != null) ! { ! MenuPeer mp = (MenuPeer) peer; ! mp.addItem(item); ! } ! return item; ! } ! ! /*************************************************************************/ ! ! /** ! * Add an item with the specified label to this menu. ! * ! * @param label The label of the menu item to add. ! */ ! public void ! add(String label) ! { ! add(new MenuItem(label)); } + + /*************************************************************************/ + + /** + * Inserts the specified menu item into this menu at the specified index. + * + * @param item The menu item to add. + * @param index The index of the menu item. + * + * XXX: FIXME + * + * @exception IllegalArgumentException If the index is less than zero. + * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. + */ + public void + insert(MenuItem item, int index) + { + if (index < 0) + throw new IllegalArgumentException("Index is less than zero"); + + items.insertElementAt(item, index); + + MenuPeer mp = (MenuPeer)getPeer(); + // FIXME: Need to add a peer method here. + // if (mp != null) + // mp.insertItem(item, index); + } + + /*************************************************************************/ + + /** + * Inserts an item with the specified label into this menu at the specified index. + * + * @param label The label of the item to add. + * @param index The index of the menu item. + * + * @exception IllegalArgumentException If the index is less than zero. + * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. + */ + public void + insert(String label, int index) + { + insert(new MenuItem(label), index); + } + + /*************************************************************************/ + + /** + * Adds a separator bar at the current menu location. + */ + public void + addSeparator() + { + add(separator); + } + + /*************************************************************************/ + + /** + * Inserts a separator bar at the specified index value. + * + * @param index The index at which to insert a separator bar. + * + * XXX: FIXME + * + * @exception IllegalArgumentException If the index is less than zero. + * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. + */ + public void + insertSeparator(int index) + { + insert(separator, index); + } + + /*************************************************************************/ + + /** + * Deletes the item at the specified index from this menu. + * + * @param index The index of the item to remove. + * + * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. + */ + public synchronized void + remove(int index) + { + items.removeElementAt(index); + + MenuPeer mp = (MenuPeer)getPeer(); + if (mp != null) + mp.delItem(index); + } + + /*************************************************************************/ + + /** + * Removes the specifed item from the menu. If the specified component + * does not exist, this method does nothing. // FIXME: Right? + * + * @param item The component to remove. + */ + public void + remove(MenuComponent item) + { + int index = items.indexOf(item); + if (index == -1) + return; + + remove(index); + } + + /*************************************************************************/ + + /** + * Removes all the elements from this menu. + */ + public synchronized void + removeAll() + { + int count = getItemCount(); + for(int i = 0; i < count; i++) + { + // We must always remove item 0. + remove(0); + } + } + + /*************************************************************************/ + + /** + * Creates the native peer for this object. + */ + public void + addNotify() + { + if (peer != null) + peer = getToolkit().createMenu(this); + super.addNotify (); + } + + /*************************************************************************/ + + /** + * Destroys the native peer for this object. + */ + public void + removeNotify() + { + super.removeNotify(); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this menu. + * + * @return A debugging string for this menu. + */ + public String + paramString() + { + return (",isTearOff=" + isTearOff + ",isHelpMenu=" + isHelpMenu + + super.paramString()); + } + + // Accessibility API not yet implemented. + // public AccessibleContext getAccessibleContext() + + } // class Menu diff -Nrc3pad gcc-3.0.4/libjava/java/awt/MenuBar.java gcc-3.1/libjava/java/awt/MenuBar.java *** gcc-3.0.4/libjava/java/awt/MenuBar.java Tue Dec 26 07:18:16 2000 --- gcc-3.1/libjava/java/awt/MenuBar.java Tue Jan 22 22:58:08 2002 *************** *** 1,288 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; import java.awt.peer.MenuBarPeer; ! import java.util.Vector; import java.util.Enumeration; ! import java.util.NoSuchElementException; ! /** This class implements a MenuBar, such as might appear across the ! * top of a window. ! * @author Tom Tromey ! * @date December 25, 2000 ! */ ! public class MenuBar extends MenuComponent implements MenuContainer { - /** Create a new MenuBar. */ - public MenuBar () - { - menus = new Vector (); - } ! /** Add a menu to this MenuBar. If the menu has already has a ! * parent, it is first removed from its old parent before being ! * added. ! * @param menu The menu to add. ! * @returns menu ! */ ! public synchronized Menu add (Menu menu) ! { ! if (menu.parent != null) ! menu.parent.remove (menu); ! menu.parent = this; ! menus.add (menu); ! if (peer != null) ! { ! MenuBarPeer mp = (MenuBarPeer) peer; ! mp.add (menu); ! } ! return menu; ! } ! /** This creates the component's peer. */ ! public void addNotify () ! { ! if (peer != null) ! { ! // This choice of toolkit seems unsatisfying, but I'm not sure ! // what else to do. ! peer = Toolkit.getDefaultToolkit ().createMenuBar (this); ! } ! } ! /** @deprecated Use getMenuCount() instead. */ ! public int countMenus () ! { ! return getMenuCount (); ! } ! /** Delete a keyboard shortcut. ! * @param shortcut The short cut which should be deleted from all ! * menus on this MenuBar. ! */ ! public void deleteShortcut (MenuShortcut shortcut) ! { ! MenuItem it; ! // This is a slow implementation, but it probably doesn't matter. ! while ((it = getShortcutMenuItem (shortcut)) != null) ! it.deleteShortcut (); ! } ! /** Returns the current Help menu. */ ! public Menu getHelpMenu () ! { ! return help_menu; ! } ! /** Returns a menu from this object. ! * @param index Index of menu to return. ! */ ! public Menu getMenu (int index) ! { ! return (Menu) menus.get (index); ! } ! /** Returns the number of menus on this MenuBar. */ ! public int getMenuCount () ! { ! return menus.size (); ! } ! /** Returns the menu item on this MenuBar with the specified ! * shortcut. ! * @param shortcut Shortcut to look for ! */ ! public MenuItem getShortcutMenuItem (MenuShortcut shortcut) ! { ! Enumeration m = new MenuEnumeration (this); ! while (m.hasMoreElements ()) ! { ! MenuItem item = (MenuItem) m.nextElement (); ! if (item.getShortcut () == shortcut) ! return item; ! } ! return null; ! } ! /** Remove a menu from the menu bar. If the menu is specified by ! * component (and not index), and does not exist on the menu, then ! * the method does nothing. If the removed menu has a peer, it is ! * destroyed. ! * @param menu The menu to remove ! * @param index The index of the menu to remove ! */ ! public synchronized void remove (MenuComponent menu) ! { ! int s = menus.size (); ! for (int i = 0; i < s; ++i) ! { ! if (menus.get (i) == menu) ! { ! remove (i); ! break; ! } ! } ! } ! public synchronized void remove (int index) ! { ! Menu m = (Menu) menus.get (index); ! menus.remove (index); ! m.removeNotify (); ! m.parent = null; ! if (peer != null) ! { ! MenuBarPeer mp = (MenuBarPeer) peer; ! mp.remove (index); ! } ! } ! /** Set the Help menu for this MenuBar. If a Help menu already ! * exists, it is first removed. ! * @param menu The new Help menu. ! */ ! public synchronized void setHelpMenu (Menu menu) ! { ! if (help_menu != null) ! { ! help_menu.removeNotify (); ! help_menu.parent = null; ! } ! if (menu.parent != null) ! menu.parent.remove (menu); ! if (menu.parent != null) ! menu.parent.remove (menu); ! menu.parent = this; ! if (peer != null) ! { ! MenuBarPeer mp = (MenuBarPeer) peer; ! mp.addHelpMenu (menu); ! } ! } ! /** Returns an Enumeration which lists the keyboard shortcuts ! * associated with menu items on this MenuBar. ! */ ! public synchronized Enumeration shortcuts () ! { ! return new ShortcutEnumeration (new MenuEnumeration (this)); ! } ! // Iterate over the items of a menu. ! private static class MenuEnumeration implements Enumeration ! { ! // Enumerate over the menu's items. ! Enumeration main; ! // Enumerate over a submenu. ! Enumeration sub; ! // Menubar so we can keep track of help menu too. ! MenuBar menubar; ! MenuEnumeration (Menu m) { ! sub = null; ! menubar = null; ! main = m.items.elements (); } ! MenuEnumeration (MenuBar mb) ! { ! sub = null; ! menubar = mb; ! main = mb.menus.elements (); ! } ! public boolean hasMoreElements () { ! boolean r = false; ! if (sub != null) ! r = sub.hasMoreElements (); ! if (! r) ! r = main.hasMoreElements (); ! if (! r && menubar != null) ! { ! if (menubar.help_menu != null) ! { ! main = new MenuEnumeration (menubar.help_menu); ! r = main.hasMoreElements (); ! } ! menubar = null; ! } ! return r; } ! public Object nextElement () throws NoSuchElementException ! { ! while (true) ! { ! if (! sub.hasMoreElements ()) ! sub = null; ! else ! return sub.nextElement (); ! if (! main.hasMoreElements () && menubar != null ! && menubar.help_menu != null) ! { ! main = new MenuEnumeration (menubar.help_menu); ! menubar = null; ! } ! Object r = main.nextElement (); ! if (r instanceof Menu) ! { ! sub = new MenuEnumeration ((Menu) r); ! continue; ! } ! return r; ! } ! } ! } ! // This is an enumeration that shadows another enumeration and ! // returns the shortcut for each item returned. I wonder if we're ! // only supposed to return unique shortcuts? If so then we could ! // keep a hash table here and remove duplicates. ! private static class ShortcutEnumeration implements Enumeration ! { ! Enumeration back; ! ShortcutEnumeration (Enumeration back) ! { ! this.back = back; ! } ! public boolean hasMoreElements () { ! return back.hasMoreElements (); } ! public Object nextElement () throws NoSuchElementException { ! while (true) ! { ! MenuItem item = (MenuItem) back.nextElement (); ! if (item.getShortcut () != null) ! return item.getShortcut (); ! } } - } ! // We use Vector because it makes enumerating easier than ArrayList ! // in this case. ! Vector menus; ! Menu help_menu; } --- 1,340 ---- ! /* MenuBar.java -- An AWT menu bar class ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; import java.awt.peer.MenuBarPeer; ! import java.awt.peer.MenuComponentPeer; ! ! import java.io.Serializable; import java.util.Enumeration; ! import java.util.Vector; ! /** ! * This class implements a menu bar in the AWT system. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class MenuBar extends MenuComponent ! implements MenuContainer, Serializable { ! /* ! * Static Variables ! */ ! // Serialization Constant ! private static final long serialVersionUID = -4930327919388951260L; ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * @serial The menu used for providing help information ! */ ! private Menu helpMenu; ! /** ! * @serial The menus contained in this menu bar. ! */ ! private Vector menus = new Vector(); ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * Initializes a new instance of MenuBar. ! */ ! public ! MenuBar() ! { ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the help menu for this menu bar. This may be null. ! * ! * @return The help menu for this menu bar. ! */ ! public Menu ! getHelpMenu() ! { ! return(helpMenu); ! } ! /*************************************************************************/ ! /** ! * Sets the help menu for this menu bar. ! * ! * @param helpMenu The new help menu for this menu bar. ! */ ! public synchronized void ! setHelpMenu(Menu menu) ! { ! if (helpMenu != null) ! { ! helpMenu.removeNotify (); ! helpMenu.parent = null; ! } ! if (menu.parent != null) ! menu.parent.remove (menu); ! if (menu.parent != null) ! menu.parent.remove (menu); ! menu.parent = this; ! if (peer != null) ! { ! MenuBarPeer mp = (MenuBarPeer) peer; ! mp.addHelpMenu (menu); ! } ! } ! /*************************************************************************/ ! /** Add a menu to this MenuBar. If the menu has already has a ! * parent, it is first removed from its old parent before being ! * added. ! * ! * @param menu The menu to add. ! * ! * @return The menu that was added. ! */ ! public synchronized Menu ! add(Menu menu) ! { ! if (menu.parent != null) ! menu.parent.remove (menu); ! menu.parent = this; ! menus.addElement(menu); ! if (peer != null) { ! MenuBarPeer mp = (MenuBarPeer) peer; ! mp.addMenu (menu); } ! return(menu); ! } ! /*************************************************************************/ ! ! /** ! * Removes the menu at the specified index. ! * ! * @param index The index of the menu to remove from the menu bar. ! */ ! public synchronized void ! remove(int index) ! { ! Menu m = (Menu) menus.get (index); ! menus.remove (index); ! m.removeNotify (); ! m.parent = null; ! ! if (peer != null) { ! MenuBarPeer mp = (MenuBarPeer) peer; ! mp.delMenu (index); } + } ! /*************************************************************************/ ! /** ! * Removes the specified menu from the menu bar. ! * ! * @param menu The menu to remove from the menu bar. ! */ ! public void ! remove(MenuComponent menu) ! { ! int index = menus.indexOf(menu); ! if (index == -1) ! return; ! remove(index); ! } ! /*************************************************************************/ ! /** ! * Returns the number of elements in this menu bar. ! * ! * @return The number of elements in the menu bar. ! */ ! public int ! getMenuCount() ! { ! // FIXME: How does the help menu fit in here? ! return(menus.size()); ! } ! /*************************************************************************/ ! /** ! * Returns the number of elements in this menu bar. ! * ! * @return The number of elements in the menu bar. ! * ! * @deprecated This method is deprecated in favor of getMenuCount(). ! */ ! public int ! countMenus() ! { ! return(getMenuCount()); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the menu at the specified index. ! * ! * @return The requested menu. ! * ! * @exception ArrayIndexOutOfBoundsException If the index is not valid. ! */ ! public Menu ! getMenu(int index) ! { ! return((Menu)menus.elementAt(index)); ! } ! ! /*************************************************************************/ ! ! /** ! * Creates this object's native peer. ! */ ! public void ! addNotify() ! { ! if (getPeer() == null) ! setPeer((MenuComponentPeer)getToolkit().createMenuBar(this)); ! } ! ! /*************************************************************************/ ! ! /** ! * Destroys this object's native peer. ! */ ! public void ! removeNotify() ! { ! super.removeNotify(); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns a list of all shortcuts for the menus in this menu bar. ! * ! * @return A list of all shortcuts for the menus in this menu bar. ! */ ! public synchronized Enumeration ! shortcuts() ! { ! Vector shortcuts = new Vector(); ! Enumeration e = menus.elements(); ! ! while (e.hasMoreElements()) { ! Menu menu = (Menu)e.nextElement(); ! if (menu.getShortcut() != null) ! shortcuts.addElement(menu.getShortcut()); } ! return(shortcuts.elements()); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the menu item for the specified shortcut, or null ! * if no such item exists. ! * ! * @param shortcut The shortcut to return the menu item for. ! * ! * @return The menu item for the specified shortcut. ! */ ! public MenuItem ! getShortcutMenuItem(MenuShortcut shortcut) ! { ! Enumeration e = menus.elements(); ! ! while (e.hasMoreElements()) { ! Menu menu = (Menu)e.nextElement(); ! MenuShortcut s = menu.getShortcut(); ! if ((s != null) && (s.equals(shortcut))) ! return(menu); } ! return(null); } + + /*************************************************************************/ + + /** + * Deletes the specified menu shortcut. + * + * @param shortcut The shortcut to delete. + */ + public void + deleteShortcut(MenuShortcut shortcut) + { + MenuItem it; + // This is a slow implementation, but it probably doesn't matter. + while ((it = getShortcutMenuItem (shortcut)) != null) + it.deleteShortcut (); + } + + } // class MenuBar diff -Nrc3pad gcc-3.0.4/libjava/java/awt/MenuComponent.java gcc-3.1/libjava/java/awt/MenuComponent.java *** gcc-3.0.4/libjava/java/awt/MenuComponent.java Tue Dec 26 07:18:16 2000 --- gcc-3.1/libjava/java/awt/MenuComponent.java Tue Jan 22 22:40:05 2002 *************** *** 1,120 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! /* Status: partially complete, untested. */ public abstract class MenuComponent implements java.io.Serializable { - // Fields from the serialization spec. Decalare others "transient". - Font font; - String name; - boolean nameExplicitlySet; - boolean newEventsOnly; - //AccessibleContext accessibleContext; - - transient MenuContainer parent; - transient java.awt.peer.MenuComponentPeer peer; ! public MenuComponent() ! { ! } ! public String getName() ! { ! if (name == null && !nameExplicitlySet) ! name = generateName(); ! return name; ! } ! ! /** Subclasses should override this to generate unique names like ! * "menuitem0". ! */ ! String generateName() ! { ! // MenuComponent is abstract. ! return null; ! } ! public void setName(String name) ! { ! nameExplicitlySet = true; ! this.name = name; ! } ! public MenuContainer getParent() ! { ! return parent; ! } ! /** @deprecated Don't use this. */ ! public java.awt.peer.MenuComponentPeer getPeer() ! { ! return peer; ! } ! public Font getFont() ! { ! return font; ! } ! public void setFont(Font f) ! { ! this.font = f; ! } ! public void removeNotify() ! { ! if (peer != null) ! peer.dispose (); ! peer = null; ! } ! /** @deprecated Replaced by dispatchEvent(AWTEvent) */ ! public boolean postEvent(Event evt) ! { ! return false; ! } ! public final void dispatchEvent(AWTEvent e) ! { ! // FIXME ! dispatchEventImpl(e); ! } ! ! void dispatchEventImpl(AWTEvent e) ! { ! // This is overridden by subclasses that support events. ! } ! protected void processEvent(AWTEvent e) ! { ! // Nothing to do here? This is be overridden by subclasses that ! // support events. ! } ! protected String paramString() ! { ! return name; ! } ! public String toString() ! { ! return this.getClass().getName() + "[" + paramString() + "]"; ! } ! protected final Object getTreeLock() ! { ! // FIXME: figure out how the tree lock works. ! return null; ! } ! // Accessibility API not yet implemented. ! // public AccessibleContext getAccessibleContext() } --- 1,323 ---- ! /* MenuComponent.java -- Superclass of all AWT menu components ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.MenuComponentPeer; ! ! // FIXME: Java 1.0 event model unimplemented + /** + * This is the superclass of all non-menu AWT widgets. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public abstract class MenuComponent implements java.io.Serializable { ! /* ! * Static Variables ! */ ! // Serialization Constant ! private static final long serialVersionUID = -4536902356223894379L; ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! // FIXME: missing serialized fields `nameExplicitlySet', ! // `newEventsOnly', and `accessibleContext'. ! // The font for this component ! private Font font; ! // The name of the component ! private String name; ! // The parent of this component ! transient MenuContainer parent; ! // The native peer for this componet ! transient MenuComponentPeer peer; ! // The synchronization locking object for this component ! private transient Object tree_lock = this; ! // The toolkit for this object ! private static transient Toolkit toolkit = Toolkit.getDefaultToolkit(); ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * Default constructor for subclasses. ! */ ! protected ! MenuComponent() ! { ! } ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Returns the font in use for this component. ! * ! * @return The font for this component. ! */ ! public Font ! getFont() ! { ! return(font); } + + /*************************************************************************/ + + /** + * Sets the font for this component to the specified font. + * + * @param font The new font for this component. + */ + public void + setFont(Font font) + { + this.font = font; + } + + /*************************************************************************/ + + /** + * Returns the name of this component. + * + * @return The name of this component. + */ + public String + getName() + { + return(name); + } + + /*************************************************************************/ + + /** + * Sets the name of this component to the specified name. + * + * @param name The new name of this component. + */ + public void + setName(String name) + { + this.name = name; + } + + /*************************************************************************/ + + /** + * Returns the parent of this component. + * + * @return The parent of this component. + */ + public MenuContainer + getParent() + { + return(parent); + } + + /*************************************************************************/ + + // Sets the parent of this component. + final void + setParent(MenuContainer parent) + { + this.parent = parent; + } + + /*************************************************************************/ + + /** + * Returns the native windowing system peer for this component. + * + * @return The peer for this component. + */ + public MenuComponentPeer + getPeer() + { + return(peer); + } + + /*************************************************************************/ + + // Sets the peer for this component. + final void + setPeer(MenuComponentPeer peer) + { + this.peer = peer; + } + + /*************************************************************************/ + + /** + * Destroys this component's native peer + */ + public void + removeNotify() + { + if (peer != null) + peer.dispose(); + peer = null; + } + + /*************************************************************************/ + + /** + * Returns the toolkit in use for this component. + * + * @return The toolkit for this component. + */ + final Toolkit + getToolkit() + { + return(toolkit); + } + + /*************************************************************************/ + + /** + * Returns the object used for synchronization locks on this component + * when performing tree and layout functions. + * + * @return The synchronization lock for this component. + */ + protected final Object + getTreeLock() + { + return(tree_lock); + } + + /*************************************************************************/ + + // The sync lock object for this component. + final void + setTreeLock(Object tree_lock) + { + this.tree_lock = tree_lock; + } + + /*************************************************************************/ + + /** + * AWT 1.0 event dispatcher. + * + * @deprecated Deprecated in favor of dispatchEvent(). + */ + public boolean + postEvent(Event event) + { + return(false); + } + + /*************************************************************************/ + + /** + * Sends this event to this component or a subcomponent for processing. + * + * @param event The event to dispatch + */ + public final void + dispatchEvent(AWTEvent event) + { + // See comment in Component.dispatchEvent(). + dispatchEventImpl(event); + } + + void + dispatchEventImpl(AWTEvent e) + { + // This is overridden by subclasses that support events. + } + + /*************************************************************************/ + + /** + * Processes the specified event. In this class, this method simply + * calls one of the more specific event handlers. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + } + + /*************************************************************************/ + + /** + * Returns a string representation of this component. + * + * @return A string representation of this component + */ + public String + toString() + { + return this.getClass().getName() + "[" + paramString() + "]"; + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this component + */ + protected String + paramString() + { + return "name=" + getName(); + } + + // Accessibility API not yet implemented. + // public AccessibleContext getAccessibleContext() + + } // class Component diff -Nrc3pad gcc-3.0.4/libjava/java/awt/MenuContainer.java gcc-3.1/libjava/java/awt/MenuContainer.java *** gcc-3.0.4/libjava/java/awt/MenuContainer.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/MenuContainer.java Tue Jan 22 22:58:08 2002 *************** *** 1,27 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ ! package java.awt; ! /* Written using "Java Class Libraries", 2nd edition, plus online ! * API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ public interface MenuContainer { - public Font getFont(); ! /** ! * @deprecated ! */ ! public boolean postEvent(Event evt); ! public void remove(MenuComponent comp); ! } --- 1,80 ---- ! /* MenuContainer.java -- Container for menu items. ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + + package java.awt; + + /** + * This interface is a container for menu components. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public interface MenuContainer { ! /** ! * Returns the font in use by this container. ! * ! * @return The font in use by this container. ! */ ! public abstract Font ! getFont(); ! /*************************************************************************/ + /** + * Removes the specified menu component from the menu. + * + * @param component The menu component to remove. + */ + public abstract void + remove(MenuComponent component); + + /*************************************************************************/ + + /** + * Posts and event to the listeners. This is replaced by + * dispatchEvent. + * + * @param event The event to dispatch. + * + * @deprecated + */ + public abstract boolean + postEvent(Event event); + + } // interface MenuContainer diff -Nrc3pad gcc-3.0.4/libjava/java/awt/MenuItem.java gcc-3.1/libjava/java/awt/MenuItem.java *** gcc-3.0.4/libjava/java/awt/MenuItem.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/MenuItem.java Tue Jan 22 22:40:05 2002 *************** *** 1,195 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! import java.awt.event.*; ! import java.util.EventListener; import java.awt.peer.MenuItemPeer; ! public class MenuItem extends MenuComponent { - // Fields from the serialization spec. Decalare others "transient". - boolean enabled; - String label; - String actionCommand; - long eventMask; - MenuShortcut shortcut; - int menuItemSerializedDataVersion; ! transient ActionListener actionListener; ! public MenuItem () ! { ! this.label = ""; ! } ! public MenuItem (String label) ! { ! this.label = label; ! } ! public MenuItem (String label, MenuShortcut shortcut) ! { ! this.label = label; ! this.shortcut = shortcut; ! } ! public String getLabel() ! { ! return label; ! } ! public synchronized void setLabel(String label) ! { ! this.label = label; ! if (peer != null) ! { ! MenuItemPeer mp = (MenuItemPeer) peer; ! mp.setLabel (label); ! } ! } ! public boolean isEnabled() ! { ! return enabled; ! } ! public synchronized void setEnabled(boolean b) ! { ! // The JCL says this method is ignored if the enabled state does ! // not change. I take that to mean that the peer is not notified ! // in this case. ! if (this.enabled != b) ! { ! this.enabled = b; ! if (peer != null) ! { ! MenuItemPeer mp = (MenuItemPeer) peer; ! mp.setEnabled (b); ! } ! } ! } ! /** @deprecated Use setEnabled() instead. */ ! public void enable() ! { ! setEnabled(true); ! } ! /** @deprecated Use setEnabled() instead. */ ! public void enable(boolean b) ! { ! setEnabled(b); ! } ! /** @deprecated Use setEnabled() instead. */ ! public void disable() ! { ! setEnabled(false); ! } ! public MenuShortcut getShortcut() ! { ! return shortcut; ! } ! public void setShortcut(MenuShortcut s) ! { ! this.shortcut = s; ! } ! public void deleteShortcut() ! { ! setShortcut(null); ! } ! protected final void enableEvents(long eventsToEnable) ! { ! eventMask |= eventsToEnable; ! // TODO: see comment in Component.enableEvents(). ! } ! protected final void disableEvents(long eventsToDisable) ! { ! eventMask &= ~eventsToDisable; ! } ! public void setActionCommand(String command) ! { ! this.actionCommand = command; ! } ! public String getActionCommand() ! { ! return actionCommand; ! } ! public synchronized void addActionListener(ActionListener l) ! { ! actionListener = AWTEventMulticaster.add(actionListener, l); ! if (actionListener != null) ! enableEvents(AWTEvent.ACTION_EVENT_MASK); ! } ! public synchronized void removeActionListener(ActionListener l) ! { ! actionListener = AWTEventMulticaster.remove(actionListener, l); ! } ! public void addNotify () ! { ! if (peer != null) ! { ! // This choice of toolkit seems unsatisfying, but I'm not sure ! // what else to do. ! peer = Toolkit.getDefaultToolkit ().createMenuItem (this); ! } ! } ! /** Returns all registered EventListers of the given listenerType. ! * listenerType must be a subclass of EventListener, or a ! * ClassClassException is thrown. ! * @since 1.3 ! */ ! public EventListener[] getListeners(Class listenerType) ! { ! if (listenerType == ActionListener.class) ! return Component.getListenersImpl(listenerType, actionListener); ! else ! return Component.getListenersImpl(listenerType, null); ! } ! void dispatchEventImpl(AWTEvent e) ! { ! if (e.id <= ActionEvent.ACTION_LAST ! && e.id >= ActionEvent.ACTION_FIRST ! && (actionListener != null ! || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0)) ! processEvent(e); ! } ! protected void processEvent(AWTEvent e) ! { ! if (e instanceof ActionEvent) ! processActionEvent((ActionEvent) e); ! } ! protected void processActionEvent(ActionEvent e) ! { ! if (actionListener != null) ! actionListener.actionPerformed(e); ! } ! public String paramString() ! { ! return name + ",label=" + label; ! } ! // Accessibility API not yet implemented. ! // public AccessibleContext getAccessibleContext() } --- 1,458 ---- ! /* MenuItem.java -- An item in a menu ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.MenuItemPeer; + import java.awt.peer.MenuComponentPeer; + import java.awt.event.ActionEvent; + import java.awt.event.ActionListener; + import java.util.EventListener; ! /** ! * This class represents an item in a menu. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class MenuItem extends MenuComponent implements java.io.Serializable { ! // FIXME: The enabled event mask is not used at this time. ! /* ! * Static Variables ! */ ! // Serialization Constant ! private static final long serialVersionUID = -21757335363267194L; ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * @serial The name of the action command generated by this item. ! */ ! private String actionCommand; ! /** ! * @serial Indicates whether or not this menu item is enabled. ! */ ! private boolean enabled; ! /** ! * @serial The mask of events that are enabled for this menu item. ! */ ! private long eventMask; ! /** ! * @serial This menu item's label ! */ ! private String label; ! /** ! * @serial The shortcut for this menu item, if any ! */ ! private MenuShortcut shortcut; ! // The list of action listeners for this menu item. ! private transient ActionListener action_listeners; ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * Initializes a new instance of MenuItem with no label ! * and no shortcut. ! */ ! public ! MenuItem() ! { ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of MenuItem with the specified ! * label and no shortcut. ! * ! * @param label The label for this menu item. ! */ ! public ! MenuItem(String label) ! { ! this.label = label; ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of MenuItem with the specified ! * label and shortcut. ! * ! * @param label The label for this menu item. ! * @param shortcut The shortcut for this menu item. ! */ ! public ! MenuItem(String label, MenuShortcut shortcut) ! { ! this.label = label; ! this.shortcut = shortcut; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the label for this menu item, which may be null. ! * ! * @return The label for this menu item. ! */ ! public String ! getLabel() ! { ! return(label); ! } ! /*************************************************************************/ ! /** ! * This method sets the label for this menu to the specified value. ! * ! * @param label The new label for this menu item. ! */ ! public synchronized void ! setLabel(String label) ! { ! this.label = label; ! if (peer != null) ! { ! MenuItemPeer mp = (MenuItemPeer) peer; ! mp.setLabel (label); ! } ! } ! /*************************************************************************/ ! /** ! * Tests whether or not this menu item is enabled. ! * ! * @return true if this menu item is enabled, false ! * otherwise. ! */ ! public boolean ! isEnabled() ! { ! return(enabled); ! } ! /*************************************************************************/ ! /** ! * Sets the enabled status of this menu item. ! * ! * @param enabled true to enable this menu item, ! * false otherwise. ! */ ! public synchronized void ! setEnabled(boolean enabled) ! { ! if (enabled == this.enabled) ! return; ! ! this.enabled = enabled; ! if (peer != null) ! { ! MenuItemPeer mp = (MenuItemPeer) peer; ! mp.setEnabled (enabled); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the enabled status of this menu item. ! * ! * @param enabled true to enable this menu item, ! * false otherwise. ! * ! * @deprecated This method is deprecated in favor of setEnabled(). ! */ ! public void ! enable(boolean enabled) ! { ! setEnabled(enabled); ! } ! ! /*************************************************************************/ ! ! /** ! * Enables this menu item. ! * ! * @deprecated This method is deprecated in favor of setEnabled(). ! */ ! public void ! enable() ! { ! setEnabled(true); } + + /*************************************************************************/ + + /** + * Disables this menu item. + * + * @deprecated This method is deprecated in favor of setEnabled(). + */ + public void + disable() + { + setEnabled(false); + } + + /*************************************************************************/ + + /** + * Returns the shortcut for this menu item, which may be null. + * + * @return The shortcut for this menu item. + */ + public MenuShortcut + getShortcut() + { + return(shortcut); + } + + /*************************************************************************/ + + /** + * Sets the shortcut for this menu item to the specified value. This + * must be done before the native peer is created. + * + * @param shortcut The new shortcut for this menu item. + */ + public void + setShortcut(MenuShortcut shortcut) + { + this.shortcut = shortcut; + } + + /*************************************************************************/ + + /** + * Deletes the shortcut for this menu item if one exists. This must be + * done before the native peer is created. + */ + public void + deleteShortcut() + { + shortcut = null; + } + + /*************************************************************************/ + + /** + * Returns the name of the action command in the action events + * generated by this menu item. + * + * @return The action command name + */ + public String + getActionCommand() + { + return(actionCommand); + } + + /*************************************************************************/ + + /** + * Sets the name of the action command in the action events generated by + * this menu item. + * + * @param actionCommand The new action command name. + */ + public void + setActionCommand(String actionCommand) + { + this.actionCommand = actionCommand; + } + + /*************************************************************************/ + + /** + * Enables the specified events. This is done automatically when a + * listener is added and does not normally need to be done by + * application code. + * + * @param events The events to enable, which should be the bit masks + * from AWTEvent. + */ + protected final void + enableEvents(long events) + { + eventMask |= events; + // TODO: see comment in Component.enableEvents(). + } + + /*************************************************************************/ + + /** + * Disables the specified events. + * + * @param events The events to enable, which should be the bit masks + * from AWTEvent. + */ + protected final void + disableEvents(long events) + { + eventMask &= ~events; + } + + /*************************************************************************/ + + /** + * Creates the native peer for this object. + */ + public void + addNotify() + { + if (peer != null) + peer = getToolkit ().createMenuItem (this); + } + + /*************************************************************************/ + + /** + * Adds the specified listener to the list of registered action listeners + * for this component. + * + * @param listener The listener to add. + */ + public synchronized void + addActionListener(ActionListener listener) + { + action_listeners = AWTEventMulticaster.add(action_listeners, listener); + + enableEvents(AWTEvent.ACTION_EVENT_MASK); + } + + public synchronized void + removeActionListener(ActionListener l) + { + action_listeners = AWTEventMulticaster.remove(action_listeners, l); + } + + /** Returns all registered EventListers of the given listenerType. + * listenerType must be a subclass of EventListener, or a + * ClassClassException is thrown. + * @since 1.3 + */ + public EventListener[] + getListeners(Class listenerType) + { + if (listenerType == ActionListener.class) + return Component.getListenersImpl(listenerType, action_listeners); + else + return Component.getListenersImpl(listenerType, null); + } + + /*************************************************************************/ + + void + dispatchEventImpl(AWTEvent e) + { + if (e.id <= ActionEvent.ACTION_LAST + && e.id >= ActionEvent.ACTION_FIRST + && (action_listeners != null + || (eventMask & AWTEvent.ACTION_EVENT_MASK) != 0)) + processEvent(e); + } + + /** + * Processes the specified event by calling processActionEvent() + * if it is an instance of ActionEvent. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof ActionEvent) + processActionEvent((ActionEvent)event); + } + + /*************************************************************************/ + + /** + * Processes the specified event by dispatching it to any registered listeners. + * + * @param event The event to process. + */ + protected void + processActionEvent(ActionEvent event) + { + if (action_listeners != null) + action_listeners.actionPerformed(event); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + public String + paramString() + { + return ("label=" + label + ",enabled=" + enabled + + ",actionCommand=" + actionCommand + "," + super.paramString()); + } + + // Accessibility API not yet implemented. + // public AccessibleContext getAccessibleContext() + + } // class MenuItem diff -Nrc3pad gcc-3.0.4/libjava/java/awt/MenuShortcut.java gcc-3.1/libjava/java/awt/MenuShortcut.java *** gcc-3.0.4/libjava/java/awt/MenuShortcut.java Tue Dec 26 07:18:16 2000 --- gcc-3.1/libjava/java/awt/MenuShortcut.java Tue Jan 22 22:58:08 2002 *************** *** 1,75 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.awt; ! import java.awt.event.KeyEvent; ! /* Status: Complete, except for hashCode(). Untested. */ public class MenuShortcut implements java.io.Serializable { - // Fields from the serialization spec. Decalare others "transient". - int key; - boolean usesShift; ! public MenuShortcut(int key) ! { ! this.key = key; ! } ! public MenuShortcut(int key, boolean useShiftModifier) ! { ! this.key = key; ! this.usesShift = useShiftModifier; ! } ! public int getKey() ! { ! return key; ! } ! public boolean usesShiftModifier() ! { ! return usesShift; ! } ! public boolean equals(MenuShortcut ms) ! { ! return (ms.key == key && ms.usesShift == usesShift); ! } ! public boolean equals(Object obj) ! { ! if (obj instanceof MenuShortcut) ! { ! MenuShortcut ms = (MenuShortcut) obj; ! return (ms.key == key && ms.usesShift == usesShift); ! } ! return false; ! } ! public int hashCode() ! { ! // FIXME: find/implement the correct algorithm for this ! if (usesShift) ! return (2 * key); ! else ! return key; ! } ! public String toString() ! { ! return paramString(); // ? ! } ! ! protected String paramString() ! { ! return KeyEvent.getKeyText(key); ! } } --- 1,207 ---- ! /* MenuShortcut.java -- A class for menu accelerators ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + + package java.awt; + + /** + * This class implements a keyboard accelerator for a menu item. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public class MenuShortcut implements java.io.Serializable { ! /* ! * Static Variables ! */ ! // Serialization Constant ! private static final long serialVersionUID = 143448358473180225L; ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * @serial The virtual keycode for the shortcut. ! */ ! private int key; ! /** ! * @serial true if the shift key was used with this shortcut, ! * or false otherwise. ! */ ! private boolean usesShift; ! /*************************************************************************/ ! /** ! * Initializes a new instance of MenuShortcut with the ! * specified virtual key value. ! * ! * @param key The virtual keycode for the shortcut. ! */ ! public ! MenuShortcut(int key) ! { ! this(key, false); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of MenuShortcut with the ! * specified virtual key value and shift setting. ! * ! * @param key The virtual keycode for the shortcut. ! * @param usesShift true if the shift key was pressed, ! * false otherwise. ! */ ! public ! MenuShortcut(int key, boolean usesShift) ! { ! this.key = key; ! this.usesShift = usesShift; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Returns the virtual keycode for this shortcut. ! * ! * @return The virtual keycode for this shortcut. ! */ ! public int ! getKey() ! { ! return(key); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the shift setting for this shortcut. ! * ! * @return true if the shift key was pressed, false ! * otherwise. ! */ ! public boolean ! usesShiftModifier() ! { ! return(usesShift); ! } ! ! /*************************************************************************/ ! ! /** ! * Tests this object for equality against the specified object. The two ! * objects will be considered equal if and only if the specified object ! * is an instance of MenuShortcut and has the same key value ! * and shift setting as this object. ! * ! * @param obj The object to test for equality against. ! * ! * @return true if the two objects are equal, false ! * otherwise. ! */ ! public boolean ! equals(MenuShortcut obj) ! { ! if (obj == null) ! return(false); ! ! if (obj.key != this.key) ! return(false); ! ! if (obj.usesShift != this.usesShift) ! return(false); ! ! return(true); ! } ! ! public boolean ! equals(Object obj) ! { ! if (obj instanceof MenuShortcut) ! { ! MenuShortcut ms = (MenuShortcut) obj; ! return (ms.key == key && ms.usesShift == usesShift); ! } ! return false; ! } ! ! /*************************************************************************/ ! ! /** ! * Returns a string representation of this shortcut. ! * ! * @return A string representation of this shortcut. ! */ ! public String ! toString() ! { ! return(getClass().getName() + "[" + paramString () + "]"); ! } ! ! public int ! hashCode() ! { ! // Arbitrary. ! return key + (usesShift ? 23 : 57); } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + protected String + paramString() + { + return "key=" + key + ",usesShift=" + usesShift; + } + + } // class MenuShortcut diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Paint.java gcc-3.1/libjava/java/awt/Paint.java *** gcc-3.0.4/libjava/java/awt/Paint.java Fri Mar 17 00:45:06 2000 --- gcc-3.1/libjava/java/awt/Paint.java Tue Jan 22 22:40:05 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,39 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/PaintContext.java gcc-3.1/libjava/java/awt/PaintContext.java *** gcc-3.0.4/libjava/java/awt/PaintContext.java Fri Mar 17 00:45:06 2000 --- gcc-3.1/libjava/java/awt/PaintContext.java Tue Jan 22 22:58:08 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; --- 1,39 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Panel.java gcc-3.1/libjava/java/awt/Panel.java *** gcc-3.0.4/libjava/java/awt/Panel.java Wed Jan 3 00:07:13 2001 --- gcc-3.1/libjava/java/awt/Panel.java Tue Jan 22 22:58:08 2002 *************** *** 1,36 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; import java.awt.peer.ComponentPeer; ! /* This class is complete to 1.2. */ ! public class Panel extends Container { ! public Panel() ! { ! this (new FlowLayout ()); ! } ! public Panel(LayoutManager layout) ! { ! super(); ! setLayout (layout); ! } ! //public AccessibleContext getAccessibleContext() ! public void addNotify() ! { ! if (peer == null) ! peer = getToolkit().createPanel(this); ! super.addNotify(); ! } } --- 1,99 ---- ! /* Panel.java -- Simple container object. ! Copyright (C) 1999, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + import java.awt.peer.PanelPeer; + import java.awt.peer.ContainerPeer; import java.awt.peer.ComponentPeer; ! /** ! * A panel is a simple container class. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class Panel extends Container implements java.io.Serializable ! { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Panel that has a default ! * layout manager of FlowLayout. ! */ ! public ! Panel() { ! this(new FlowLayout()); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Panel with the specified ! * layout manager. ! * ! * @param layoutManager The layout manager for this object. ! */ ! public ! Panel(LayoutManager layoutManager) ! { ! setLayout(layoutManager); ! } ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Notifies this object to create its native peer. ! */ ! public void ! addNotify() ! { ! if (peer == null) ! peer = getToolkit().createPanel(this); ! super.addNotify(); } + + } // class Panel + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Point.java gcc-3.1/libjava/java/awt/Point.java *** gcc-3.0.4/libjava/java/awt/Point.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/java/awt/Point.java Tue Jan 22 22:40:05 2002 *************** *** 1,36 **** ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; import java.awt.geom.Point2D; - /** - * @author Per Bothner - * @date February 8, 1999. - */ - /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct, except that neither toString * nor hashCode have been compared with JDK output. */ public class Point extends Point2D implements java.io.Serializable { public int x; public int y; public Point () { } public Point (Point p) { this.x = p.x; this.y = p.y; } public Point (int x, int y) { this.x = x; this.y = y; } public boolean equals (Object obj) { if (! (obj instanceof Point)) --- 1,106 ---- ! /* Copyright (C) 1999, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; import java.awt.geom.Point2D; /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct, except that neither toString * nor hashCode have been compared with JDK output. */ + /** + * This class represents a point on the screen using cartesian coordinates. + * + * @author Per Bothner + * @author Aaron M. Renn (arenn@urbanophile.com) + * @date February 8, 1999. + */ public class Point extends Point2D implements java.io.Serializable { + /** + * @serial The X coordinate of the point. + */ public int x; + + /** + * @serial The Y coordinate of the point. + */ public int y; + /** + * Initializes a new instance of Point representing the + * coordiates (0,0). + */ public Point () { } + /** + * Initializes a new instance of Point with coordinates + * identical to the coordinates of the specified points. + * + * @param point The point to copy the coordinates from. + */ public Point (Point p) { this.x = p.x; this.y = p.y; } + /** + * Initializes a new instance of Point with the specified + * coordinates. + * + * @param x The X coordinate of this point. + * @param y The Y coordinate of this point. + */ public Point (int x, int y) { this.x = x; this.y = y; } + /** + * Tests whether or not this object is equal to the specified object. + * This will be true if and only if the specified objectj: + *

    + *

      + *
    • Is not null. + *
    • Is an instance of Point. + *
    • Has X and Y coordinates equal to this object's. + *
    + * + * @param obj The object to test against for equality. + * + * @return true if the specified object is equal to this + * object, false otherwise. + */ public boolean equals (Object obj) { if (! (obj instanceof Point)) *************** public class Point extends Point2D imple *** 39,59 **** return this.x == p.x && this.y == p.y; } public int hashCode () { return x ^ y; } public Point getLocation () { return new Point(this); } public void move (int x, int y) { this.x = x; this.y = y; } public void setLocation (int x, int y) { this.x = x; this.y = y; } public void setLocation (Point pt) { this.x = pt.x; this.y = pt.y; } public void translate (int x, int y) { this.x += x; this.y += y; } public String toString () { ! return "Point[x:"+x+",y:"+y+']'; } public double getX() { return x; } --- 109,173 ---- return this.x == p.x && this.y == p.y; } + /** + * Returns a hash value for this point. + * + * @param A hash value for this point. + */ public int hashCode () { return x ^ y; } + /** + * Returns the location of this object as a point. A pretty useless + * method. It is included to mimic the getLocation method + * in component. + * + * @return This point. + */ public Point getLocation () { return new Point(this); } + /** + * Sets this object's coordinates to the specified values. This method + * is identical to the setLocation(int, int) method. + * + * @param x The new X coordinate. + * @param y The new Y coordinate. + */ public void move (int x, int y) { this.x = x; this.y = y; } + /** + * Sets this object's coordinates to the specified values. This method + * is identical to the move() method. + * + * @param x The new X coordinate. + * @param y The new Y coordinate. + */ public void setLocation (int x, int y) { this.x = x; this.y = y; } + /** + * Sets this object's coordinates to match those of the specified point. + * + * @param point The point to copy the coordinates from. + */ public void setLocation (Point pt) { this.x = pt.x; this.y = pt.y; } + /** + * Changes the coordinates of this point such that the specified + * dx parameter is added to the existing X coordinate and + * dy is added to the existing Y coordinate. + * + * @param dx The amount to add to the X coordinate. + * @param dy The amount to add to the Y coordinate. + */ public void translate (int x, int y) { this.x += x; this.y += y; } + /** + * Returns a string representation of this object. + * + * @return A string representation of this object. + */ public String toString () { ! return getClass().getName() + "[x:"+x+",y:"+y+']'; } public double getX() { return x; } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Polygon.java gcc-3.1/libjava/java/awt/Polygon.java *** gcc-3.0.4/libjava/java/awt/Polygon.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/Polygon.java Fri May 11 01:03:45 2001 *************** *** 0 **** --- 1,422 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libjava. + + This software is copyrighted work licensed under the terms of the + Libjava License. Please consult the file "LIBJAVA_LICENSE" for + details. */ + + package java.awt; + + import java.awt.geom.*; + import java.io.Serializable; + import java.util.Arrays; + + /** + * @author Tom Tromey + * @date May 10, 2001 + */ + + /** The Polygon class represents a closed region whose boundary is + made of line segments. The Polygon is defined by its vertices. */ + public class Polygon implements Shape, Serializable + { + /** The bounds of the polygon. This is null until the bounds have + * been computed for the first time; then it is correctly + * maintained whenever it is modified. */ + protected Rectangle bounds; + + /** The number of points in the polygon. */ + public int npoints; + + /** The x coordinates of the points. */ + public int[] xpoints; + + /** The y coordinates of the points. */ + public int[] ypoints; + + /** Create a new, empty Polygon. */ + public Polygon () + { + this.xpoints = new int[0]; + this.ypoints = new int[0]; + this.npoints = 0; + } + + /** Create a new Polygon from the given vertices. + * @param xpoints The x coordinates + * @param ypoints The y coordinates + * @param npoints The number of points + */ + public Polygon (int[] xpoints, int[] ypoints, int npoints) + { + // We make explicit copies instead of relying on clone so that we + // ensure the new arrays are the same size. + this.xpoints = new int[npoints]; + this.ypoints = new int[npoints]; + System.arraycopy (xpoints, 0, this.xpoints, 0, npoints); + System.arraycopy (ypoints, 0, this.ypoints, 0, npoints); + } + + /** Append the specified point to this Polygon. + * @param x The x coordinate + * @param y The y coordinate + */ + public void addPoint (int x, int y) + { + int[] newx = new int[npoints + 1]; + System.arraycopy (xpoints, 0, newx, 0, npoints); + int[] newy = new int[npoints + 1]; + System.arraycopy (ypoints, 0, newy, 0, npoints); + newx[npoints] = x; + newy[npoints] = y; + ++npoints; + xpoints = newx; + ypoints = newy; + + // It is simpler to just recompute. + if (bounds != null) + computeBoundingBox (); + } + + /** Return true if the indicated point is inside this Polygon. + * This uses an even-odd rule to determine insideness. + * @param x The x coordinate + * @param y The y coordinate + * @returns true if the point is contained by this Polygon. + */ + public boolean contains (double x, double y) + { + // What we do is look at each line segment. If the line segment + // crosses the "scan line" at y at a point x' < x, then we + // increment our counter. At the end, an even number means the + // point is outside the polygon. Instead of a number, though, we + // use a boolean. + boolean inside = false; + for (int i = 0; i < npoints; ++i) + { + // Handle the wrap case. + int x2 = (i == npoints) ? xpoints[0] : xpoints[i + 1]; + int y2 = (i == npoints) ? ypoints[0] : ypoints[i + 1]; + + if (ypoints[i] == y2) + { + // We ignore horizontal lines. This might give weird + // results in some situations -- ? + continue; + } + + double t = (y - ypoints[i]) / (double) (y2 - ypoints[i]); + double x3 = xpoints[i] + t * (x2 - xpoints[i]); + if (x3 < x) + inside = ! inside; + } + + return inside; + } + + /** Return true if the indicated rectangle is entirely inside this + * Polygon. + * This uses an even-odd rule to determine insideness. + * @param x The x coordinate + * @param y The y coordinate + * @param w The width + * @param h The height + * @returns true if the rectangle is contained by this Polygon. + */ + public boolean contains (double x, double y, double w, double h) + { + return intersectOrContains (x, y, w, h, false); + } + + /** Return true if the indicated point is inside this Polygon. + * This uses an even-odd rule to determine insideness. + * @param x The x coordinate + * @param y The y coordinate + * @returns true if the point is contained by this Polygon. + */ + public boolean contains (int x, int y) + { + return contains ((double) x, (double) y); + } + + /** Return true if the indicated point is inside this Polygon. + * This uses an even-odd rule to determine insideness. + * @param p The point + * @returns true if the point is contained by this Polygon. + */ + public boolean contains (Point p) + { + return contains (p.x, p.y); + } + + /** Return true if the indicated point is inside this Polygon. + * This uses an even-odd rule to determine insideness. + * @param p The point + * @returns true if the point is contained by this Polygon. + */ + public boolean contains (Point2D p) + { + return contains (p.getX (), p.getY ()); + } + + /** Return true if the indicated rectangle is entirely inside this + * Polygon. This uses an even-odd rule to determine insideness. + * @param r The rectangle + * @returns true if the rectangle is contained by this Polygon. + */ + public boolean contains (Rectangle2D r) + { + return contains (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); + } + + /** Returns the bounds of this Polygon. + * @deprecated Use getBounds() instead. + */ + public Rectangle getBoundingBox () + { + if (bounds == null) + computeBoundingBox (); + return bounds; + } + + /** Returns the bounds of this Polygon. */ + public Rectangle getBounds () + { + if (bounds == null) + computeBoundingBox (); + return bounds; + } + + /** Returns the bounds of this Polygon. */ + public Rectangle2D getBounds2D () + { + if (bounds == null) + computeBoundingBox (); + return bounds; // Why not? + } + + /** Return an iterator for the boundary of this Polygon. + * @param at A transform to apply to the coordinates. + * @returns A path iterator for the Polygon's boundary. + */ + public PathIterator getPathIterator (AffineTransform at) + { + return new Iterator (at); + } + + /** Return an iterator for the boundary of this Polygon. + * @param at A transform to apply to the coordinates. + * @param flatness The flatness of the result; it is ignored by + * this class. + * @returns A path iterator for the Polygon's boundary. + */ + public PathIterator getPathIterator (AffineTransform at, double flatness) + { + // We ignore the flatness. + return new Iterator (at); + } + + /** @deprecated use contains(int,int). */ + public boolean inside (int x, int y) + { + return contains (x, y); + } + + /** Return true if this Polygon's interior intersects the given + * rectangle's interior. + * @param x The x coordinate + * @param y The y coordinate + * @param w The width + * @param h The height + */ + public boolean intersects (double x, double y, double w, double h) + { + return intersectOrContains (x, y, w, h, true); + } + + /** Return true if this Polygon's interior intersects the given + * rectangle's interior. + * @param r The rectangle + */ + public boolean intersects (Rectangle2D r) + { + return intersects (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); + } + + // This tests for intersection with or containment of a rectangle, + // depending on the INTERSECT argument. + private boolean intersectOrContains (double x, double y, double w, double h, + boolean intersect) + { + // First compute the rectangle of possible intersection points. + Rectangle r = getBounds (); + int minx = Math.max (r.x, (int) x); + int maxx = Math.min (r.x + r.width, (int) (x + w)); + int miny = Math.max (r.y, (int) y); + int maxy = Math.min (r.y + r.height, (int) (y + h)); + + if (miny > maxy) + return false; + + double[] crosses = new double[npoints + 1]; + + for (; miny < maxy; ++miny) + { + // First compute every place where the polygon might intersect + // the scan line at Y. + int ins = 0; + for (int i = 0; i < npoints; ++i) + { + // Handle the wrap case. + int x2 = (i == npoints) ? xpoints[0] : xpoints[i + 1]; + int y2 = (i == npoints) ? ypoints[0] : ypoints[i + 1]; + + if (ypoints[i] == y2) + { + // We ignore horizontal lines. This might give weird + // results in some situations -- ? + continue; + } + + double t = (((double) miny - ypoints[i]) + / (double) (y2 - ypoints[i])); + double x3 = xpoints[i] + t * (x2 - xpoints[i]); + crosses[ins++] = x3; + } + + // Now we can sort into increasing order and look to see if + // any point in the rectangle is in the polygon. We examine + // every other pair due to our even-odd rule. + Arrays.sort (crosses, 0, ins); + int i = intersect ? 0 : 1; + for (; i < ins - 1; i += 2) + { + // Pathological case. + if (crosses[i] == crosses[i + 1]) + continue; + + // Found a point on the inside. + if ((crosses[i] >= x && crosses[i] < x + w) + || (crosses[i + 1] >= x && crosses[i + 1] < x + w)) + { + // If we're checking containment then we just lost. + // But if we're checking intersection then we just + // won. + return intersect; + } + } + } + + return false; + } + + /** Translates all the vertices of the polygon via a given vector. + * @param deltaX The X offset + * @param deltaY The Y offset + */ + public void translate (int deltaX, int deltaY) + { + for (int i = 0; i < npoints; ++i) + { + xpoints[i] += deltaX; + ypoints[i] += deltaY; + } + + if (bounds != null) + { + bounds.x += deltaX; + bounds.y += deltaY; + } + } + + // This computes the bounding box if required. + private void computeBoundingBox () + { + if (npoints == 0) + { + // This is wrong if the user adds a new point, but we + // account for that in addPoint(). + bounds = new Rectangle (0, 0, 0, 0); + } + else + { + int maxx = xpoints[0]; + int minx = xpoints[0]; + int maxy = ypoints[0]; + int miny = ypoints[0]; + + for (int i = 1; i < npoints; ++i) + { + maxx = Math.max (maxx, xpoints[i]); + minx = Math.min (minx, xpoints[i]); + maxy = Math.max (maxy, ypoints[i]); + miny = Math.min (miny, ypoints[i]); + } + + bounds = new Rectangle (minx, miny, maxx - minx, maxy - miny); + } + } + + private class Iterator implements PathIterator + { + public AffineTransform xform; + public int where; + + public Iterator (AffineTransform xform) + { + this.xform = xform; + where = 0; + } + + public int currentSegment (double[] coords) + { + int r; + + if (where < npoints) + { + coords[0] = xpoints[where]; + coords[1] = ypoints[where]; + r = (where == 0) ? SEG_MOVETO : SEG_LINETO; + xform.transform (coords, 0, coords, 0, 1); + ++where; + } + else + r = SEG_CLOSE; + + return r; + } + + public int currentSegment (float[] coords) + { + int r; + + if (where < npoints) + { + coords[0] = xpoints[where]; + coords[1] = ypoints[where]; + r = (where == 0) ? SEG_MOVETO : SEG_LINETO; + xform.transform (coords, 0, coords, 0, 1); + } + else + r = SEG_CLOSE; + + return r; + } + + public int getWindingRule () + { + return WIND_EVEN_ODD; + } + + public boolean isDone () + { + return where == npoints + 1; + } + + public void next () + { + ++where; + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/PopupMenu.java gcc-3.1/libjava/java/awt/PopupMenu.java *** gcc-3.0.4/libjava/java/awt/PopupMenu.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/PopupMenu.java Tue Jan 22 22:58:08 2002 *************** *** 1,37 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! /* Status: Incomplete. */ ! public class PopupMenu extends Menu { ! public PopupMenu() ! { ! super(); ! } ! public PopupMenu(String label) ! { ! super(label); ! } ! public void addNotify() ! { ! // FIXME ! } ! public void show(Component origin, int x, int y) ! { ! // FIXME ! } ! ! // Accessibility API not yet implemented. ! // public AccessibleContext getAccessibleContext() } --- 1,130 ---- ! /* PopupMenu.java -- An AWT popup menu ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.PopupMenuPeer; ! import java.awt.peer.MenuPeer; ! import java.awt.peer.MenuItemPeer; ! import java.awt.peer.MenuComponentPeer; ! /** ! * This class implement an AWT popup menu widget ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class PopupMenu extends Menu implements java.io.Serializable ! { ! /* ! * Static Variables ! */ ! ! // Serialization Constant ! private static final long serialVersionUID = -4620452533522760060L; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of PopupMenu. ! */ ! public ! PopupMenu() { ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of PopupMenu with the specified ! * label. ! * ! * @param label The label for this popup menu. ! */ ! public ! PopupMenu(String label) ! { ! super(label); ! } ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Creates this object's native peer. ! */ ! public void ! addNotify() ! { ! if (peer != null) ! peer = getToolkit ().createPopupMenu (this); ! super.addNotify (); ! } ! ! /*************************************************************************/ ! ! /** ! * Displays this popup menu at the specified coordinates relative to ! * the specified component. ! * ! * @param component The component to which the display coordinates are relative. ! * @param x The X coordinate of the menu. ! * @param y The Y coordinate of the menu. ! */ ! public void ! show(Component component, int x, int y) ! { ! PopupMenuPeer pmp = (PopupMenuPeer)getPeer(); ! if (pmp != null) ! { ! /* XXX ! Event e = new Event (component, Event.ACTION_EVENT, component); ! e.x = x; ! e.y = y;*/ ! pmp.show (component, x, y); ! } } + + } // class PopupMenu + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/PrintGraphics.java gcc-3.1/libjava/java/awt/PrintGraphics.java *** gcc-3.0.4/libjava/java/awt/PrintGraphics.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/PrintGraphics.java Thu Jan 24 06:30:58 2002 *************** *** 0 **** --- 1,59 ---- + /* PrintGraphics.java -- A print graphics context. + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt; + + /** + * This interface allows the originating print job to be obtained. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface PrintGraphics + { + + /** + * Returns the PrintJob that this object is being + * managed by. + * + * @return The print job for this object. + */ + public abstract PrintJob + getPrintJob(); + + } // interface PrintGraphics + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/PrintJob.java gcc-3.1/libjava/java/awt/PrintJob.java *** gcc-3.0.4/libjava/java/awt/PrintJob.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/PrintJob.java Thu Jan 24 06:30:59 2002 *************** *** 0 **** --- 1,128 ---- + /* PrintJob.java -- A print job class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt; + + /** + * This abstract class represents a print job. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public abstract class PrintJob + { + + /* + * Constructors + */ + + /** + * This method initializes a new instance of PrintJob. + */ + public + PrintJob() + { + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * Returns a graphics context suitable for rendering the next page. + * + * @return A graphics context for printing the next page. + */ + public abstract Graphics + getGraphics(); + + /*************************************************************************/ + + /** + * Returns the dimension of the page in pixels. The resolution will be + * chosen to be similar to the on screen image. + * + * @return The page dimensions. + */ + public abstract Dimension + getPageDimension(); + + /*************************************************************************/ + + /** + * Returns the resolution of the page in pixels per inch. + * + * @return The resolution of the page in pixels per inch. + */ + public abstract int + getPageResolution(); + + /*************************************************************************/ + + /** + * Tests whether or not the last page will be printed first. + * + * @return true if the last page prints first, false + * otherwise. + */ + public abstract boolean + lastPageFirst(); + + /*************************************************************************/ + + /** + * Informs the print job that printing is complete. + */ + public abstract void + end(); + + /*************************************************************************/ + + /** + * This method explicitly ends the print job in the event the job + * becomes un-referenced without the application having done so. + */ + public void + finalize() + { + end(); + } + + } // class PrintJob + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Rectangle.java gcc-3.1/libjava/java/awt/Rectangle.java *** gcc-3.0.4/libjava/java/awt/Rectangle.java Wed Aug 16 18:03:47 2000 --- gcc-3.1/libjava/java/awt/Rectangle.java Tue Jan 22 22:40:05 2002 *************** *** 1,23 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; import java.awt.geom.*; /* Status: Mostly complete. Some of the Java2D stuff is commented out. */ ! public class Rectangle extends Rectangle2D implements Cloneable, Shape { public int x; public int y; public int width; public int height; public Rectangle() { x = 0; --- 1,83 ---- ! /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; + import java.awt.geom.*; + import java.io.Serializable; /* Status: Mostly complete. Some of the Java2D stuff is commented out. */ ! /** ! * This class represents a rectangle and all the interesting things you ! * might want to do with it. Note that the coordinate system uses ! * the origin (0,0) as the top left of the screen, with the x and y ! * values increasing as they move to the right and down respectively. ! * ! * @author Warren Levy ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class Rectangle extends Rectangle2D ! implements Cloneable, Shape, Serializable { + /** + * The X coordinate of the top-left corner of the rectangle. + */ public int x; + + /** + * The Y coordinate of the top-left corner of the rectangle; + */ public int y; + + /** + * The width of the rectangle + */ public int width; + + /** + * The height of the rectangle + */ public int height; + /** + * Initializes a new instance of Rectangle with a top + * left corner at (0,0) and a width and height of 0. + */ public Rectangle() { x = 0; *************** public class Rectangle extends Rectangle *** 26,31 **** --- 86,97 ---- height = 0; } + /** + * Initializes a new instance of Rectangle from the + * coordinates of the specified rectangle. + * + * @param rect The rectangle to copy from. + */ public Rectangle(Rectangle r) { x = r.x; *************** public class Rectangle extends Rectangle *** 34,39 **** --- 100,114 ---- height = r.height; } + /** + * Initializes a new instance of Rectangle from the specified + * inputs. + * + * @param x The X coordinate of the top left corner of the rectangle. + * @param y The Y coordinate of the top left corner of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + */ public Rectangle(int x, int y, int width, int height) { this.x = x; *************** public class Rectangle extends Rectangle *** 42,47 **** --- 117,130 ---- this.height = height; } + /** + * Initializes a new instance of Rectangle with the specified + * width and height. The upper left corner of the rectangle will be at + * the origin (0,0). + * + * @param width The width of the rectangle. + * @param height the height of the rectange. + */ public Rectangle(int width, int height) { x = 0; *************** public class Rectangle extends Rectangle *** 50,55 **** --- 133,146 ---- this.height = height; } + /** + * Initializes a new instance of Rectangle with a top-left + * corner represented by the specified point and the width and height + * represented by the specified dimension. + * + * @param point The upper left corner of the rectangle. + * @param dim The width and height of the rectangle. + */ public Rectangle(Point p, Dimension d) { x = p.x; *************** public class Rectangle extends Rectangle *** 58,63 **** --- 149,160 ---- height = d.height; } + /** + * Initializes a new instance of Rectangle with a top left + * corner at the specified point and a width and height of zero. + * + * @param poin The upper left corner of the rectangle. + */ public Rectangle(Point p) { x = p.x; *************** public class Rectangle extends Rectangle *** 66,71 **** --- 163,175 ---- height = 0; } + /** + * Initializes a new instance of Rectangle with an + * upper left corner at the origin (0,0) and a width and height represented + * by the specified dimension. + * + * @param dim The width and height of the rectangle. + */ public Rectangle(Dimension d) { x = 0; *************** public class Rectangle extends Rectangle *** 74,84 **** --- 178,201 ---- height = d.height; } + /** + * Returns the bounding rectangle for this rectangle, which is simply + * this rectange itself. + * + * @return This rectangle. + */ public Rectangle getBounds () { return (Rectangle) this.clone(); } + /** + * Modifies this rectangle so that it represents the smallest rectangle + * that contains both the existing rectangle and the specified point. + * + * @param x The X coordinate of the point to add to this rectangle. + * @param y The Y coordinate of the point to add to this rectangle. + */ public void add(int newx, int newy) { int x = this.x > newx ? newx : this.x; *************** public class Rectangle extends Rectangle *** 89,99 **** --- 206,228 ---- this.y = y; } + /** + * Modifies this rectangle so that it represents the smallest rectangle + * that contains both the existing rectangle and the specified point. + * + * @param point The point to add to this rectangle. + */ public void add(Point pt) { add (pt.x, pt.y); } + /** + * Modifies this rectangle so that it represents the smallest rectangle + * that contains both the existing rectangle and the specified rectangle. + * + * @param rect The rectangle to add to this rectangle. + */ public void add(Rectangle r) { int x = this.x > r.x ? r.x : this.x; *************** public class Rectangle extends Rectangle *** 106,111 **** --- 235,249 ---- this.y = y; } + /** + * Tests whether or not the specified point is inside this rectangle. + * + * @param x The X coordinate of the point to test. + * @param y The Y coordinate of the point to test. + * + * @return true if the point is inside the rectangle, + * false otherwise. + */ public boolean contains(int x, int y) { return (x >= this.x && x <= this.x + this.width *************** public class Rectangle extends Rectangle *** 118,123 **** --- 256,269 ---- && y >= this.y && y + h <= this.y + this.height); } + /** + * Tests whether or not the specified point is inside this rectangle. + * + * @param point The point to test. + * + * @return true if the point is inside the rectangle, + * false otherwise. + */ public boolean contains(Point p) { return contains(p.x, p.y); *************** public class Rectangle extends Rectangle *** 128,133 **** --- 274,295 ---- return contains(r.x, r.y, r.width, r.height); } + /** + * Tests this rectangle for equality against the specified object. This + * will be true if an only if the specified object: + *

    + *

      + *
    • Is not null. + *
    • Is an instance of Rectangle. + *
    • Has X and Y coordinates identical to this rectangle. + *
    • Has a width and height identical to this rectangle. + *
    + * + * @param obj The object to test against for equality. + * + * @return true if the specified object is equal to this one, + * false otherwise. + */ public boolean equals(Object obj) { if (obj instanceof Rectangle) *************** public class Rectangle extends Rectangle *** 146,162 **** return (double) this.height; } public Point getLocation() { return new Point(x,y); } ! public PathIterator getPathIterator (AffineTransform t) ! { ! // FIXME ! return null; ! } ! public Dimension getSize() { return new Dimension(width, height); --- 308,329 ---- return (double) this.height; } + /** + * Returns the location of this rectangle, which is the coordinates of + * its upper left corner. + * + * @return The point where this rectangle is located. + */ public Point getLocation() { return new Point(x,y); } ! /** ! * Returns the size of this rectangle. ! * ! * @return The size of this rectangle. ! */ public Dimension getSize() { return new Dimension(width, height); *************** public class Rectangle extends Rectangle *** 177,197 **** return (double) y; } public void grow(int h, int v) { width += h; height += v; } ! /** @deprecated Use contains() instead. */ public boolean inside(int x, int y) { return contains(x, y); } ! /** @specnote If there is no intersection, an empty rectangle at 0,0 ! * is returned. ! */ public Rectangle intersection(Rectangle r) { int newx = x < r.x ? r.x : x; --- 344,392 ---- return (double) y; } + /** + * Expands the rectangle by the specified amount. The horizontal + * and vertical expansion values are applied both to the X,Y coordinate + * of this rectangle, and its width and height. Thus the width and + * height will increase by 2h and 2v accordingly. + * + * @param h The horizontal expansion value. + * @param v The vertical expansion value. + */ public void grow(int h, int v) { width += h; height += v; } ! /** ! * Tests whether or not the specified point is inside this rectangle. ! * ! * @param x The X coordinate of the point to test. ! * @param y The Y coordinate of the point to test. ! * ! * @return true if the point is inside the rectangle, ! * false otherwise. ! * ! * @deprecated This method is deprecated in favor of ! * contains(int, int). ! */ public boolean inside(int x, int y) { return contains(x, y); } ! /** ! * Determines the rectange which is formed by the intersection of this ! * rectangle with the specified rectangle. ! * ! * @param rect The rectange to calculate the intersection with. ! * ! * @return The rectangle bounding the intersection. ! * ! * @specnote If there is no intersection, an empty rectangle at 0,0 ! * is returned. ! */ public Rectangle intersection(Rectangle r) { int newx = x < r.x ? r.x : x; *************** public class Rectangle extends Rectangle *** 206,214 **** return new Rectangle(0, 0, 0, 0); } ! /** @specnote If the intersection is at an edge or corner only (an empty ! * intersection with a non-zero location), false is returned. ! */ public boolean intersects(Rectangle r) { int neww = (x + width < r.x + r.width ? --- 401,417 ---- return new Rectangle(0, 0, 0, 0); } ! /** ! * Tests whether or not the specified rectangle intersects this rectangle. ! * ! * @param rect The rectangle to test against. ! * ! * @return true if the specified rectangle intersects this ! * one, false otherwise. ! * ! * @specnote If the intersection is at an edge or corner only (an empty ! * intersection with a non-zero location), false is returned. ! */ public boolean intersects(Rectangle r) { int neww = (x + width < r.x + r.width ? *************** public class Rectangle extends Rectangle *** 218,229 **** return (neww > 0 && newh > 0); } public boolean isEmpty() { return !(width > 0 && height > 0); } ! /** @deprecated Use setLocation() instead. */ public void move(int x, int y) { setLocation(x, y); --- 421,449 ---- return (neww > 0 && newh > 0); } + /** + * Tests whether or not this rectangle is empty. An empty rectangle + * has a width or height of zero. + * + * @return true if the rectangle is empty, false + * otherwise. + */ public boolean isEmpty() { return !(width > 0 && height > 0); } ! /** ! * Moves the location of this rectangle by setting its upper left ! * corner to the specified coordinates. ! * // FIXME: Is this true? ! * ! * @param x The new X coordinate for this rectangle. ! * @param y The new Y coordinate for this rectangle. ! * ! * @deprecated This method is deprecated in favor of ! * setLocation(int, int). ! */ public void move(int x, int y) { setLocation(x, y); *************** public class Rectangle extends Rectangle *** 235,252 **** return 0; } ! /** @deprecated Use setBounds() instead. */ public void reshape(int x, int y, int width, int height) { setBounds(x, y, width, height); } ! /** @deprecated Use setSize() instead. */ public void resize(int width, int height) { setSize(width, height); } public void setBounds(int x, int y, int width, int height) { this.x = x; --- 455,498 ---- return 0; } ! /** ! * Updates this rectangle to have the specified dimensions. ! * ! * @param x The new X coordinate of the upper left hand corner. ! * @param y The new Y coordinate of the upper left hand corner. ! * @param width The new width of this rectangle. ! * @param height The new height of this rectangle. ! * ! * @deprecated This method is deprecated in favor of ! * setBounds(int, int, int, int). ! */ public void reshape(int x, int y, int width, int height) { setBounds(x, y, width, height); } ! /** ! * Sets the size of this rectangle based on the specified dimensions. ! * ! * @param width The new width of the rectangle. ! * @param height The new height of the rectangle. ! * ! * @deprecated This method is deprecated in favor of ! * setSize(int, int). ! */ public void resize(int width, int height) { setSize(width, height); } + /** + * Updates this rectangle to have the specified dimensions. + * + * @param x The new X coordinate of the upper left hand corner. + * @param y The new Y coordinate of the upper left hand corner. + * @param width The new width of this rectangle. + * @param height The new height of this rectangle. + */ public void setBounds(int x, int y, int width, int height) { this.x = x; *************** public class Rectangle extends Rectangle *** 255,260 **** --- 501,512 ---- this.height = height; } + /** + * Updates this rectangle to match the dimensions of the specified + * rectangle. + * + * @param rect The rectangle to update from. + */ public void setBounds(Rectangle r) { this.x = r.x; *************** public class Rectangle extends Rectangle *** 263,274 **** --- 515,541 ---- this.height = r.height; } + /** + * Moves the location of this rectangle by setting its upper left + * corner to the specified coordinates. + * // FIXME: Is this true? + * + * @param x The new X coordinate for this rectangle. + * @param y The new Y coordinate for this rectangle. + */ public void setLocation(int x, int y) { this.x = x; this.y = y; } + /** + * Moves the location of this rectangle by setting its upper left + * corner to the specified point. + * // FIXME: Is this true? + * + * @param point The point to move the rectange to. + */ public void setLocation(Point p) { this.x = p.x; *************** public class Rectangle extends Rectangle *** 283,294 **** --- 550,572 ---- this.height = (int) height; } + /** + * Sets the size of this rectangle based on the specified dimensions. + * + * @param dim The new dimensions of the rectangle. + */ public void setSize(Dimension d) { this.width = d.width; this.height = d.height; } + /** + * Sets the size of this rectangle based on the specified dimensions. + * + * @param width The new width of the rectangle. + * @param height The new height of the rectangle. + */ public void setSize(int width, int height) { this.width = width; *************** public class Rectangle extends Rectangle *** 301,306 **** --- 579,592 ---- y += y; } + /** + * Returns the smallest rectangle that contains both this rectangle + * and the specified rectangle. + * + * @param rect The rectangle to compute the union with. + * + * @return The smallest rectangle containing both rectangles. + */ public Rectangle union(Rectangle r) { int newx = x > r.x ? r.x : x; *************** public class Rectangle extends Rectangle *** 336,344 **** --- 622,645 ---- return new Rectangle (x, y, width, height); } + /** + * Returns a string representation of this rectangle. + * + * @return A string representation of this rectangle. + */ public String toString() { return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]"; } + + /** + * Returns a hash value for this object. + * + * @return A hash value for this object. + */ + public int hashCode() + { + return x * y * width * height * 37; + } } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/RenderingHints.java gcc-3.1/libjava/java/awt/RenderingHints.java *** gcc-3.0.4/libjava/java/awt/RenderingHints.java Tue Aug 29 03:23:56 2000 --- gcc-3.1/libjava/java/awt/RenderingHints.java Tue Jan 22 22:40:05 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt; --- 1,38 ---- ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; *************** public class RenderingHints implements *** 16,22 **** Cloneable { ! static abstract class Key { private int intKey; --- 44,50 ---- Cloneable { ! public abstract static class Key { private int intKey; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Scrollbar.java gcc-3.1/libjava/java/awt/Scrollbar.java *** gcc-3.0.4/libjava/java/awt/Scrollbar.java Mon Dec 18 22:17:25 2000 --- gcc-3.1/libjava/java/awt/Scrollbar.java Fri Jan 25 07:06:06 2002 *************** *** 1,234 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! import java.awt.event.*; import java.awt.peer.ScrollbarPeer; import java.awt.peer.ComponentPeer; /** ! * @author Tom Tromey ! * @date April 12, 2000 */ ! public class Scrollbar extends Component implements Adjustable { ! public Scrollbar () ! { ! this (VERTICAL, 0, 10, 0, 100); ! } ! public Scrollbar (int orientation) ! { ! this (orientation, 0, 10, 0, 100); ! } ! public Scrollbar (int orientation, int value, int visible, ! int minimum, int maximum) ! { ! if (orientation != HORIZONTAL && orientation != VERTICAL) ! throw new IllegalArgumentException (); ! if (maximum < minimum) ! maximum = minimum; ! if (value < minimum) ! value = minimum; ! if (value > maximum) ! value = maximum; ! this.orientation = orientation; ! this.value = value; ! this.visible = visible; ! this.minimum = minimum; ! this.maximum = maximum; ! this.unit = 1; ! this.block = 0; // FIXME ! } ! public void addNotify () ! { ! if (peer == null) ! peer = getToolkit ().createScrollbar (this); ! } ! public int getOrientation () ! { ! return orientation; ! } ! public void setOrientation (int orientation) ! { ! if (orientation != HORIZONTAL && orientation != VERTICAL) ! throw new IllegalArgumentException (); ! this.orientation = orientation; ! } ! public int getValue () ! { ! return value; ! } ! public void setValue (int value) ! { ! setValues (value, visible, minimum, maximum); ! } ! public int getMinimum () ! { ! return minimum; ! } ! public void setMinimum (int minimum) ! { ! setValues (value, visible, minimum, maximum); ! } ! public int getMaximum () ! { ! return maximum; ! } ! public void setMaximum (int maximum) ! { ! setValues (value, visible, minimum, maximum); ! } ! public int getVisibleAmount () ! { ! return visible; ! } ! public int getVisible () ! { ! return visible; ! } ! public void setVisibleAmount (int visible) ! { ! setValues (value, visible, minimum, maximum); ! } ! public void setUnitIncrement (int v) ! { ! unit = v; ! if (peer != null) ! { ! ScrollbarPeer sp = (ScrollbarPeer) peer; ! sp.setLineIncrement (v); ! } ! } ! /** @deprecated */ ! public void setLineIncrement (int v) ! { ! setUnitIncrement (v); ! } ! public int getUnitIncrement () ! { ! return unit; ! } ! public int getLineIncrement () ! { ! return unit; ! } ! public void setBlockIncrement (int v) ! { ! block = v; ! if (peer != null) ! { ! ScrollbarPeer sp = (ScrollbarPeer) peer; ! sp.setPageIncrement (v); ! } ! } ! public void setPageIncrement (int v) ! { ! setBlockIncrement (v); ! } ! public int getBlockIncrement () ! { ! return block; ! } ! public int getPageIncrement () ! { ! return block; ! } ! public synchronized void setValues (int value, int visible, ! int minimum, int maximum) ! { ! if (maximum < minimum) ! maximum = minimum; ! if (value < minimum) ! value = minimum; ! if (value > maximum) ! value = maximum; ! this.value = value; ! this.visible = visible; ! this.minimum = minimum; ! this.maximum = maximum; ! if (peer != null) ! { ! ScrollbarPeer sp = (ScrollbarPeer) peer; ! sp.setValues (value, visible, minimum, maximum); ! } ! } ! public void addAdjustmentListener (AdjustmentListener l) ! { ! listeners = AWTEventMulticaster.add (listeners, l); ! } ! public void removeAdjustmentListener (AdjustmentListener l) ! { ! listeners = AWTEventMulticaster.remove (listeners, l); ! } ! protected void processEvent (AWTEvent e) ! { ! if (e instanceof AdjustmentEvent) ! processAdjustmentEvent ((AdjustmentEvent) e); ! else ! super.processEvent (e); ! } ! protected void processAdjustmentEvent (AdjustmentEvent e) ! { ! if (listeners != null) ! listeners.adjustmentValueChanged (e); ! } ! protected String paramString () ! { ! return ("Scrollbar[" ! + ((orientation == VERTICAL) ? "VERTICAL" : "HORIZONTAL") + "," ! + value + "," ! + visible + "," ! + minimum + "," ! + maximum + "," ! + unit + "," ! + block + "]"); ! } ! private AdjustmentListener listeners; ! private int orientation; ! private int value; ! private int visible; ! private int minimum; ! private int maximum; ! private int unit; ! private int block; } --- 1,684 ---- ! /* Scrollbar.java -- AWT Scrollbar widget ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.ScrollbarPeer; import java.awt.peer.ComponentPeer; + import java.awt.event.AdjustmentListener; + import java.awt.event.AdjustmentEvent; + /** ! * This class implements a scrollbar widget. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Tom Tromey ! */ ! public class Scrollbar extends Component implements Adjustable, ! java.io.Serializable ! { ! ! // FIXME: Serialization readObject/writeObject ! ! /* ! * Static Variables */ ! /** ! * Constant indicating that a scrollbar is horizontal. ! */ ! public static final int HORIZONTAL = 0; ! ! /** ! * Constant indicating that a scrollbar is vertical. ! */ ! public static final int VERTICAL = 1; ! ! // Serialization Constant ! private static final long serialVersionUID = 8451667562882310543L; ! ! /*************************************************************************/ ! ! /** ! * @serial The amount by which the value of the scrollbar is changed ! * when incrementing in line mode. ! */ ! private int lineIncrement; ! ! /** ! * @serial The amount by which the value of the scrollbar is changed ! * when incrementing in page mode. ! */ ! private int pageIncrement; ! ! /** ! * @serial The maximum value for this scrollbar ! */ ! private int maximum; ! ! /** ! * @serial The minimum value for this scrollbar ! */ ! private int minimum; ! ! /** ! * @serial The orientation of this scrollbar, which will be either ! * the HORIZONTAL or VERTICAL constant ! * from this class. ! */ ! private int orientation; ! ! /** ! * @serial The current value of this scrollbar. ! */ ! private int value; ! ! /** ! * @serial The width of the scrollbar's thumb, which is relative ! * to the minimum and maximum value of the scrollbar. ! */ ! private int visibleAmount; ! ! // List of AdjustmentListener's. ! private AdjustmentListener adjustment_listeners; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of Scrollbar with a ! * veritical orientation and default values for all other parameters. ! */ ! public ! Scrollbar() { ! this(VERTICAL); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Scrollbar with the ! * specified orientation and default values for all other parameters. ! * The orientation must be either the constant HORIZONTAL or ! * VERTICAL from this class. An incorrect value will throw ! * an exception. ! * ! * @param orientation The orientation of this scrollbar. ! * ! * @exception IllegalArgumentException If the orientation value is not valid. ! */ ! public ! Scrollbar(int orientation) throws IllegalArgumentException ! { ! this(orientation, 0, 10, 0, 100); ! } ! /*************************************************************************/ ! /** ! * Initializes a new instance of Scrollbar with the ! * specified parameters. The orientation must be either the constant ! * HORIZONTAL or VERTICAL. An incorrect value ! * will throw an exception. Inconsistent values for other parameters ! * are silently corrected to valid values. ! * ! * @param orientation The orientation of this scrollbar. ! * @param value The initial value of the scrollbar. ! * @param visibleAmount The width of the scrollbar thumb. ! * @param minimum The minimum value of the scrollbar. ! * @param maximum The maximum value of the scrollbar. ! * ! * @exception IllegalArgumentException If the orientation value is not valid. ! */ ! public ! Scrollbar(int orientation, int value, int visibleAmount, int minimum, ! int maximum) throws IllegalArgumentException ! { ! if ((orientation != HORIZONTAL) && (orientation != VERTICAL)) ! throw new IllegalArgumentException("Bad orientation value: " ! + orientation); ! this.orientation = orientation; ! setValues(value, visibleAmount, minimum, maximum); ! // Default is 1 according to online docs. ! lineIncrement = 1; ! pageIncrement = (maximum - minimum) / 5; ! if (pageIncrement == 0) ! pageIncrement = 1; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Returns the orientation constant for this object. ! * ! * @return The orientation constant for this object. ! */ ! public int ! getOrientation() ! { ! return(orientation); ! } ! /*************************************************************************/ ! /** ! * Sets the orientation of this scrollbar to the specified value. This ! * value must be either the constant HORIZONTAL or ! * VERTICAL from this class or an exception will be thrown. ! * ! * @param orientation The new orientation value. ! * ! * @exception IllegalArgumentException If the orientation value is not valid. ! */ ! public void ! setOrientation(int orientation) ! { ! if ((orientation != HORIZONTAL) && (orientation != VERTICAL)) ! throw new IllegalArgumentException("Bad orientation value: " ! + orientation); ! // FIXME: Communicate to peer? Or must this be called before peer creation? ! this.orientation = orientation; ! } ! /*************************************************************************/ ! /** ! * Returns the current value for this scrollbar. ! * ! * @return The current value for this scrollbar. ! */ ! public int ! getValue() ! { ! return(value); ! } ! /*************************************************************************/ ! /** ! * Sets the current value for this scrollbar to the specified value. ! * If this is inconsistent with the minimum and maximum values for this ! * scrollbar, the value is silently adjusted. ! * ! * @param value The new value for this scrollbar. ! */ ! public void ! setValue(int value) ! { ! setValues(value, visibleAmount, minimum, maximum); ! } ! /*************************************************************************/ ! /** ! * Returns the maximum value for this scrollbar. ! * ! * @return The maximum value for this scrollbar. ! */ ! public int ! getMaximum() ! { ! return(maximum); ! } ! /*************************************************************************/ ! /** ! * Sets the maximum value for this scrollbar to the specified value. ! * If the value is less than the current minimum value, it is silent ! * set to equal the minimum value. ! * ! * @param maximum The new maximum value for this scrollbar. ! */ ! public void ! setMaximum(int maximum) ! { ! setValues(value, visibleAmount, minimum, maximum); ! } ! /*************************************************************************/ ! /** ! * Returns the minimum value for this scrollbar. ! * ! * @return The minimum value for this scrollbar. ! */ ! public int ! getMinimum() ! { ! return(minimum); ! } ! /*************************************************************************/ ! /** ! * Sets the minimum value for this scrollbar to the specified value. If ! * this is not consistent with the current value and maximum, it is ! * silently adjusted to be consistent. ! * ! * @param minimum The new minimum value for this scrollbar. ! */ ! public void ! setMinimum(int minimum) ! { ! setValues(value, visibleAmount, minimum, maximum); ! } ! /*************************************************************************/ ! /** ! * Returns the width of the scrollbar's thumb, in units relative to the ! * maximum and minimum value of the scrollbar. ! * ! * @return The width of the scrollbar's thumb. ! */ ! public int ! getVisibleAmount() ! { ! return(visibleAmount); ! } ! /*************************************************************************/ ! /** ! * Returns the width of the scrollbar's thumb, in units relative to the ! * maximum and minimum value of the scrollbar. ! * ! * @return The width of the scrollbar's thumb. ! * ! * @deprecated This method is deprecated in favor of ! * getVisibleAmount(). ! */ ! public int ! getVisible() ! { ! return(getVisibleAmount()); ! } ! /*************************************************************************/ ! /** ! * Sets the width of the scrollbar's thumb, in units relative to the ! * maximum and minimum value of the scrollbar. ! * ! * @param visibileAmount The new visible amount value of the scrollbar. ! */ ! public void ! setVisibleAmount(int visibleAmount) ! { ! setValues(value, visibleAmount, minimum, maximum); ! } ! /*************************************************************************/ ! /** ! * Sets the current value, visible amount, minimum, and maximum for this ! * scrollbar. These values are adjusted to be internally consistent ! * if necessary. ! * ! * @param value The new value for this scrollbar. ! * @param visibleAmount The new visible amount for this scrollbar. ! * @param minimum The new minimum value for this scrollbar. ! * @param maximum The new maximum value for this scrollbar. ! */ ! public synchronized void ! setValues(int value, int visibleAmount, int minimum, int maximum) ! { ! if (maximum < minimum) ! maximum = minimum; ! ! if (value < minimum) ! value = minimum; ! ! if (value > maximum) ! value = maximum; ! ! if (visibleAmount > value) ! visibleAmount = value; ! ! this.value = value; ! this.visibleAmount = visibleAmount; ! this.minimum = minimum; ! this.maximum = maximum; ! ! ScrollbarPeer sp = (ScrollbarPeer)getPeer(); ! if (sp != null) ! sp.setValues(value, visibleAmount, minimum, maximum); ! ! int range = maximum - minimum; ! if (lineIncrement > range) ! { ! if (range == 0) ! lineIncrement = 1; ! else ! lineIncrement = range; ! ! if (sp != null) ! sp.setLineIncrement(lineIncrement); ! } ! ! if (pageIncrement > range) ! { ! if (range == 0) ! pageIncrement = 1; ! else ! pageIncrement = range; ! ! if (sp != null) ! sp.setPageIncrement(pageIncrement); ! } } + + /*************************************************************************/ + + /** + * Returns the value added or subtracted when the user activates the scrollbar + * scroll by a "unit" amount. + * + * @return The unit increment value. + */ + public int + getUnitIncrement() + { + return(lineIncrement); + } + + /*************************************************************************/ + + /** + * Returns the value added or subtracted when the user selects the scrollbar + * scroll by a "unit" amount control. + * + * @return The unit increment value. + * + * @deprecated This method is deprecated in favor of + * getUnitIncrement(). + */ + public int + getLineIncrement() + { + return(lineIncrement); + } + + /*************************************************************************/ + + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "unit" amount control. + * + * @param unitIncrement The new unit increment amount. + */ + public synchronized void + setUnitIncrement(int unitIncrement) + { + if (unitIncrement < 0) + throw new IllegalArgumentException("Unit increment less than zero."); + + int range = maximum - minimum; + if (unitIncrement > range) + { + if (range == 0) + unitIncrement = 1; + else + unitIncrement = range; + } + + if (unitIncrement == lineIncrement) + return; + + lineIncrement = unitIncrement; + + ScrollbarPeer sp = (ScrollbarPeer)getPeer(); + if (sp != null) + sp.setLineIncrement(lineIncrement); + } + + /*************************************************************************/ + + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "unit" amount control. + * + * @param lineIncrement The new unit increment amount. + * + * @deprecated This method is deprecated in favor of + * setUnitIncrement(). + */ + public void + setLineIncrement(int lineIncrement) + { + setUnitIncrement(lineIncrement); + } + + /*************************************************************************/ + + /** + * Returns the value added or subtracted when the user activates the scrollbar + * scroll by a "block" amount. + * + * @return The block increment value. + */ + public int + getBlockIncrement() + { + return(pageIncrement); + } + + /*************************************************************************/ + + /** + * Returns the value added or subtracted when the user selects the scrollbar + * scroll by a "block" amount control. + * + * @return The block increment value. + * + * @deprecated This method is deprecated in favor of + * getBlockIncrement(). + */ + public int + getPageIncrement() + { + return(pageIncrement); + } + + /*************************************************************************/ + + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "block" amount control. + * + * @param blockIncrement The new block increment amount. + */ + public synchronized void + setBlockIncrement(int blockIncrement) + { + if (blockIncrement < 0) + throw new IllegalArgumentException("Block increment less than zero."); + + int range = maximum - minimum; + if (blockIncrement > range) + { + if (range == 0) + blockIncrement = 1; + else + blockIncrement = range; + } + + if (blockIncrement == pageIncrement) + return; + + pageIncrement = blockIncrement; + + ScrollbarPeer sp = (ScrollbarPeer)getPeer(); + if (sp != null) + sp.setPageIncrement(pageIncrement); + } + + /*************************************************************************/ + + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "block" amount control. + * + * @param pageIncrement The new block increment amount. + * + * @deprecated This method is deprecated in favor of + * setBlockIncrement(). + */ + public void + setPageIncrement(int pageIncrement) + { + setBlockIncrement(pageIncrement); + } + + /*************************************************************************/ + + /** + * Notifies this object to create its native peer. + */ + public synchronized void + addNotify() + { + if (peer == null) + peer = getToolkit ().createScrollbar (this); + super.addNotify (); + } + + /*************************************************************************/ + + /** + * Adds a new adjustment listener to the list of registered listeners + * for this object. + * + * @param listener The listener to add. + */ + public synchronized void + addAdjustmentListener(AdjustmentListener listener) + { + adjustment_listeners = AWTEventMulticaster.add(adjustment_listeners, listener); + enableEvents(AWTEvent.ADJUSTMENT_EVENT_MASK); + } + + /*************************************************************************/ + + /** + * Removes the specified listener from the list of registered listeners + * for this object. + * + * @param listener The listener to remove. + */ + public synchronized void + removeAdjustmentListener(AdjustmentListener listener) + { + adjustment_listeners = AWTEventMulticaster.remove(adjustment_listeners, + listener); + } + + /*************************************************************************/ + + /** + * Processes events for this scrollbar. It does this by calling + * processAdjustmentEvent() if the event is an instance of + * AdjustmentEvent, otherwise it calls the superclass to + * process the event. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof AdjustmentEvent) + processAdjustmentEvent((AdjustmentEvent)event); + else + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * Processes adjustment events for this object by dispatching them to + * any registered listeners. Note that this method will only be called + * if adjustment events are enabled. This will happen automatically if + * any listeners are registered. Otherwise, it can be enabled by a + * call to enableEvents(). + * + * @param event The event to process. + */ + protected void + processAdjustmentEvent(AdjustmentEvent event) + { + if (adjustment_listeners != null) + adjustment_listeners.adjustmentValueChanged(event); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + protected String + paramString() + { + return("value=" + getValue() + ",visibleAmount=" + + getVisibleAmount() + ",minimum=" + getMinimum() + + ",maximum=" + getMaximum() + + ",pageIncrement=" + pageIncrement + + ",lineIncrement=" + lineIncrement + + ",orientation=" + (orientation == HORIZONTAL + ? "HORIZONTAL" : "VERTICAL") + + super.paramString()); + } + + } // class Scrollbar + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Shape.java gcc-3.1/libjava/java/awt/Shape.java *** gcc-3.0.4/libjava/java/awt/Shape.java Sun Jul 23 00:24:14 2000 --- gcc-3.1/libjava/java/awt/Shape.java Fri Jan 25 07:06:06 2002 *************** *** 1,33 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; - import java.awt.geom.*; ! /** ! * @author Per Bothner ! * @date February 8, 1999. ! */ /* Written using "Java Class Libraries", 2nd edition. * Status: Believed complete and correct to JDK 1.2. */ public interface Shape { public boolean contains (double x, double y); public boolean contains (double x, double y, double w, double h); public boolean contains (Point2D p); public boolean contains (Rectangle2D r); - public Rectangle getBounds (); public Rectangle2D getBounds2D (); public PathIterator getPathIterator (AffineTransform at); public PathIterator getPathIterator (AffineTransform at, double flatness); public boolean intersects (double x, double y, double w, double h); public boolean intersects (Rectangle2D r); ! } --- 1,75 ---- ! /* Shape.java -- Interface for shape abstractions. ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.geom.*; /* Written using "Java Class Libraries", 2nd edition. * Status: Believed complete and correct to JDK 1.2. */ + /** + * This interface represents an abstract shape. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Per Bothner + */ public interface Shape { + + /** + * Returns a Rectange that bounds the shape. + * + * @return A Rectange that bounds the shape. + */ + public abstract Rectangle + getBounds(); + public boolean contains (double x, double y); public boolean contains (double x, double y, double w, double h); public boolean contains (Point2D p); public boolean contains (Rectangle2D r); public Rectangle2D getBounds2D (); public PathIterator getPathIterator (AffineTransform at); public PathIterator getPathIterator (AffineTransform at, double flatness); public boolean intersects (double x, double y, double w, double h); public boolean intersects (Rectangle2D r); ! ! } // interface Shape ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/SystemColor.java gcc-3.1/libjava/java/awt/SystemColor.java *** gcc-3.0.4/libjava/java/awt/SystemColor.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/SystemColor.java Tue Jan 22 22:58:08 2002 *************** *** 1,158 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; ! /** This class contains most of the colors used by the native ! * windowing sytem to draw native components. ! * @author Tom Tromey ! * @date December 25, 2000 ! */ public final class SystemColor extends Color implements java.io.Serializable { - /** The background color for the title bar of an active window. */ - public static final SystemColor activeCaption - = new SystemColor (ACTIVE_CAPTION); - /** The border color of an active window. */ - public static final SystemColor activeCaptionBorder - = new SystemColor (ACTIVE_CAPTION_BORDER); - /** The color of text in the title bar of an active window. */ - public static final SystemColor activeCaptionText - = new SystemColor (ACTIVE_CAPTION_TEXT); - /** The background color. */ - public static final SystemColor control = new SystemColor (CONTROL); - /** The darkest color of an outline. */ - public static final SystemColor controlDkShadow - = new SystemColor (CONTROL_DK_SHADOW); - /** The second brightest color of an outline. */ - public static final SystemColor controlHighlight - = new SystemColor (CONTROL_HIGHLIGHT); - /** The brightest color of an outline. */ - public static final SystemColor controlLtHighlight - = new SystemColor (CONTROL_LT_HIGHLIGHT); - /** The second darkest color of an outline. */ - public static final SystemColor controlShadow - = new SystemColor (CONTROL_SHADOW); - /** The color of text in a label. */ - public static final SystemColor controlText = new SystemColor (CONTROL_TEXT); - /** The background color of the desktop. */ - public static final SystemColor desktop = new SystemColor (DESKTOP); - /** The background color for the title bar of an inactive window. */ - public static final SystemColor inactiveCaption - = new SystemColor (INACTIVE_CAPTION); - /** The border color of an inactive window. */ - public static final SystemColor inactiveCaptionBorder - = new SystemColor (INACTIVE_CAPTION_BORDER); - /** The color of text in the title ar of an inactive window. */ - public static final SystemColor inactiveCaptionText - = new SystemColor (INACTIVE_CAPTION_TEXT); - /** The background color of tooltips. */ - public static final SystemColor info = new SystemColor (INFO); - /** The color of text in tooltips. */ - public static final SystemColor infoText = new SystemColor (INFO_TEXT); - /** The background color of a menu. */ - public static final SystemColor menu = new SystemColor (MENU); - /** The color of text in a menu. */ - public static final SystemColor menuText = new SystemColor (MENU_TEXT); - /** The background color of a scrollbar. */ - public static final SystemColor scrollbar = new SystemColor (SCROLLBAR); - /** The background color of text components. */ - public static final SystemColor text = new SystemColor (TEXT); - /** The background color of highlighted text. */ - public static final SystemColor textHighlight - = new SystemColor (TEXT_HIGHLIGHT); - /** The color of highlighted text. */ - public static final SystemColor textHighlightText - = new SystemColor (TEXT_HIGHLIGHT_TEXT); - /** The color of inactive text. */ - public static final SystemColor textInactiveText - = new SystemColor (TEXT_INACTIVE_TEXT); - /** The color of text in text components. */ - public static final SystemColor textText = new SystemColor (TEXT_TEXT); - /** The background color of a window. */ - public static final SystemColor window = new SystemColor (WINDOW); - /** The border color of a window. */ - public static final SystemColor windowBorder - = new SystemColor (WINDOW_BORDER); - /** The color of text in a window. */ - public static final SystemColor windowText = new SystemColor (WINDOW_TEXT); ! public static final int DESKTOP = 0; ! public static final int ACTIVE_CAPTION = 1; ! public static final int ACTIVE_CAPTION_TEXT = 2; ! public static final int ACTIVE_CAPTION_BORDER = 3; ! public static final int INACTIVE_CAPTION = 4; ! public static final int INACTIVE_CAPTION_TEXT = 5; ! public static final int INACTIVE_CAPTION_BORDER = 6; ! public static final int WINDOW = 7; ! public static final int WINDOW_BORDER = 8; ! public static final int WINDOW_TEXT = 9; ! public static final int MENU = 10; ! public static final int MENU_TEXT = 11; ! public static final int TEXT = 12; ! public static final int TEXT_TEXT = 13; ! public static final int TEXT_HIGHLIGHT = 14; ! public static final int TEXT_HIGHLIGHT_TEXT = 15; ! public static final int TEXT_INACTIVE_TEXT = 16; ! public static final int CONTROL = 17; ! public static final int CONTROL_TEXT = 18; ! public static final int CONTROL_HIGHLIGHT = 19; ! public static final int CONTROL_LT_HIGHLIGHT = 20; ! public static final int CONTROL_SHADOW = 21; ! public static final int CONTROL_DK_SHADOW = 22; ! public static final int SCROLLBAR = 23; ! public static final int INFO = 24; ! public static final int INFO_TEXT = 25; ! public static final int NUM_COLORS = 26; ! private static final int rgbs[] = ! { ! 0x005c5c, ! 0x000080, ! 0xffffff, ! 0xc0c0c0, ! 0x808080, ! 0xc0c0c0, ! 0xc0c0c0, ! 0xffffff, ! 0x000000, ! 0x000000, ! 0xc0c0c0, ! 0x000000, ! 0xc0c0c0, ! 0x000000, ! 0x000080, ! 0xffffff, ! 0x808080, ! 0xc0c0c0, ! 0x000000, ! 0xffffff, ! 0xe0e0e0, ! 0x808080, ! 0x000000, ! 0xe0e0e0, ! 0xe0e000, ! 0x000000 ! }; ! public int getRGB () ! { ! return rgbs[rgba]; ! } ! public String toString () ! { ! return "[" + getClass ().getName () + " " + rgba + "]"; ! } ! private SystemColor (int index) ! { ! super (index, true); ! } } --- 1,430 ---- ! /* SystemColor.java -- Class to access system color values. ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! /** ! * This class contains the various "system colors" in use by the ! * native windowing system. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public final class SystemColor extends Color implements java.io.Serializable { ! /* ! * Static Variables ! */ ! /** ! * Array index of the desktop color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int DESKTOP = 0; ! /** ! * Array index of the active caption color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int ACTIVE_CAPTION = 1; ! /** ! * Array index of the active caption text color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int ACTIVE_CAPTION_TEXT = 2; ! /** ! * Array index of the active caption border color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int ACTIVE_CAPTION_BORDER = 3; ! /** ! * Array index of the inactive caption color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int INACTIVE_CAPTION = 4; ! ! /** ! * Array index of the inactive caption text color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int INACTIVE_CAPTION_TEXT = 5; ! ! /** ! * Array index of the inactive caption border color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int INACTIVE_CAPTION_BORDER = 6; ! ! /** ! * Array index of the window background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int WINDOW = 7; ! ! /** ! * Array index of the window border color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int WINDOW_BORDER = 8; ! ! /** ! * Array index of the window text color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int WINDOW_TEXT = 9; ! ! /** ! * Array index of the menu background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int MENU = 10; ! ! /** ! * Array index of the menu text color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int MENU_TEXT = 11; ! ! /** ! * Array index of the text background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int TEXT = 12; ! ! /** ! * Array index of the text foreground color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int TEXT_TEXT = 13; ! ! /** ! * Array index of the highlighted text background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int TEXT_HIGHLIGHT = 14; ! ! /** ! * Array index of the highlighted text foreground color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int TEXT_HIGHLIGHT_TEXT = 15; ! ! /** ! * Array index of the inactive text foreground color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int TEXT_INACTIVE_TEXT = 16; ! ! /** ! * Array index of the control background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int CONTROL = 17; ! ! /** ! * Array index of the control text color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int CONTROL_TEXT = 18; ! ! /** ! * Array index of the highlighted control background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int CONTROL_HIGHLIGHT = 19; ! ! /** ! * Array index of the lightly highlighted control background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int CONTROL_LT_HIGHLIGHT = 20; ! ! /** ! * Array index of the shadowed control background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int CONTROL_SHADOW = 21; ! ! /** ! * Array index of the darkly shadowed control background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int CONTROL_DK_SHADOW = 22; ! ! /** ! * Array index of the scrollbar background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int SCROLLBAR = 23; ! ! /** ! * Array index of the info background color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int INFO = 24; ! ! /** ! * Array index of the info text color. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int INFO_TEXT = 25; ! ! /** ! * The number of system colors. Used by ! * Toolkit.loadSystemColors(). ! */ ! public static final int NUM_COLORS = 26; ! ! /** ! * The desktop color. ! */ ! public static final SystemColor desktop; ! ! /** ! * The active caption background color. ! */ ! public static final SystemColor activeCaption; ! ! /** ! * The active caption text color. ! */ ! public static final SystemColor activeCaptionText; ! ! /** ! * The active caption border color. ! */ ! public static final SystemColor activeCaptionBorder; ! ! /** ! * The inactive caption background color. ! */ ! public static final SystemColor inactiveCaption; ! ! /** ! * The inactive caption text color. ! */ ! public static final SystemColor inactiveCaptionText; ! ! /** ! * The inactive caption border color. ! */ ! public static final SystemColor inactiveCaptionBorder; ! ! /** ! * The window background color. ! */ ! public static final SystemColor window; ! ! /** ! * The window border color. ! */ ! public static final SystemColor windowBorder; ! ! /** ! * The window text color. ! */ ! public static final SystemColor windowText; ! ! /** ! * The menu background color. ! */ ! public static final SystemColor menu; ! ! /** ! * The menu text color. ! */ ! public static final SystemColor menuText; ! ! /** ! * The text background color. ! */ ! public static final SystemColor text; ! ! /** ! * The text foreground color. ! */ ! public static final SystemColor textText; ! ! /** ! * The highlighted text background color. ! */ ! public static final SystemColor textHighlight; ! ! /** ! * The highlighted text foreground color. ! */ ! public static final SystemColor textHighlightText; ! ! /** ! * The inactive text color. ! */ ! public static final SystemColor textInactiveText; ! ! /** ! * The control background color. ! */ ! public static final SystemColor control; ! ! /** ! * The control text color. ! */ ! public static final SystemColor controlText; ! ! /** ! * The control highlight color. ! */ ! public static final SystemColor controlHighlight; ! ! /** ! * The control light highlight color. ! */ ! public static final SystemColor controlLtHighlight; ! ! /** ! * The control shadow color. ! */ ! public static final SystemColor controlShadow; ! ! /** ! * The control dark shadow color. ! */ ! public static final SystemColor controlDkShadow; ! ! /** ! * The scrollbar color. ! */ ! public static final SystemColor scrollbar; ! ! /** ! * The info text background color. ! */ ! public static final SystemColor info; ! ! /** ! * The info text foreground color. ! */ ! public static final SystemColor infoText; ! ! // Serialization version constant ! private static final long serialVersionUID = 4503142729533789064L; ! ! static ! { ! int[] sys_color_rgbs = new int[NUM_COLORS]; ! Toolkit.getDefaultToolkit().loadSystemColors(sys_color_rgbs); ! ! desktop = new SystemColor(sys_color_rgbs[DESKTOP]); ! activeCaption= new SystemColor(sys_color_rgbs[ACTIVE_CAPTION]); ! activeCaptionText= new SystemColor(sys_color_rgbs[ACTIVE_CAPTION_TEXT]); ! activeCaptionBorder = new SystemColor(sys_color_rgbs[ACTIVE_CAPTION_BORDER]); ! inactiveCaption = new SystemColor(sys_color_rgbs[INACTIVE_CAPTION]); ! inactiveCaptionText = new SystemColor(sys_color_rgbs[INACTIVE_CAPTION_TEXT]); ! inactiveCaptionBorder = ! new SystemColor(sys_color_rgbs[INACTIVE_CAPTION_BORDER]); ! window = new SystemColor(sys_color_rgbs[WINDOW]); ! windowBorder = new SystemColor(sys_color_rgbs[WINDOW_BORDER]); ! windowText = new SystemColor(sys_color_rgbs[WINDOW_TEXT]); ! menu = new SystemColor(sys_color_rgbs[MENU]); ! menuText = new SystemColor(sys_color_rgbs[MENU_TEXT]); ! text = new SystemColor(sys_color_rgbs[TEXT]); ! textText = new SystemColor(sys_color_rgbs[TEXT_TEXT]); ! textHighlight = new SystemColor(sys_color_rgbs[TEXT_HIGHLIGHT]); ! textHighlightText = new SystemColor(sys_color_rgbs[TEXT_HIGHLIGHT_TEXT]); ! textInactiveText = new SystemColor(sys_color_rgbs[TEXT_INACTIVE_TEXT]); ! control = new SystemColor(sys_color_rgbs[CONTROL]); ! controlText = new SystemColor(sys_color_rgbs[CONTROL_TEXT]); ! controlHighlight = new SystemColor(sys_color_rgbs[CONTROL_HIGHLIGHT]); ! controlLtHighlight = new SystemColor(sys_color_rgbs[CONTROL_LT_HIGHLIGHT]); ! controlShadow = new SystemColor(sys_color_rgbs[CONTROL_SHADOW]); ! controlDkShadow = new SystemColor(sys_color_rgbs[CONTROL_DK_SHADOW]); ! scrollbar = new SystemColor(sys_color_rgbs[SCROLLBAR]); ! info = new SystemColor(sys_color_rgbs[INFO]); ! infoText = new SystemColor(sys_color_rgbs[INFO_TEXT]); ! } ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! private ! SystemColor(int rgb) ! { ! super(rgb); ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Returns the RGB value for this color as an int. The first ! * byte is the blue value, the second the green value, the third the ! * red value and the fourth is set to 0xFF. ! * ! * @return The RGB value. ! */ ! public int ! getRGB() ! { ! // Override only to be spec consistent. ! return(super.getRGB()); } + + /*************************************************************************/ + + /** + * Returns a string describing this color. + * + * @return A string describing this color. + */ + public String + toString() + { + return("SystemColor(R=" + getRed() + ",G=" + getGreen() + ",B=" + + getBlue() + ")"); + } + + } // class SystemColor + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/TextArea.java gcc-3.1/libjava/java/awt/TextArea.java *** gcc-3.0.4/libjava/java/awt/TextArea.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/java/awt/TextArea.java Wed Jan 23 00:07:39 2002 *************** *** 1,49 **** ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! /* A very incomplete placeholder. */ ! public class TextArea extends TextComponent { - public synchronized void append (String str) - { - replaceRange(str, length, length); - } ! public synchronized void insert (String str, int pos) ! { ! replaceRange(str, pos, pos); ! } ! public synchronized void replaceRange (String str, int start, int end) ! { ! if (length == 0) ! setText (str); ! else ! { ! int len = str.length(); ! int delta = len - (end - start); ! int new_length = length + delta; ! if (buffer.length < new_length) ! { ! int new_size = 2 * buffer.length; ! if (new_size < new_length) ! new_size = new_length; ! char[] new_buffer = new char[new_size]; ! System.arraycopy(buffer, 0, new_buffer, 0, length); ! buffer = new_buffer; ! } ! if (len != end) ! System.arraycopy(buffer, start, buffer, start + len, len - end); ! str.getChars(0, len, buffer, start); ! length += delta; ! } ! } } --- 1,549 ---- ! /* TextArea.java -- A multi-line text entry widget ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.peer.TextAreaPeer; ! import java.awt.peer.TextComponentPeer; ! import java.awt.peer.ComponentPeer; ! /** ! * This implements a multi-line text entry widget. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class TextArea extends TextComponent implements java.io.Serializable { ! /* ! * Static Variables ! */ ! /** ! * Use both horiztonal and vertical scroll bars. ! */ ! public static final int SCROLLBARS_BOTH = 0; ! ! /** ! * Use vertical scroll bars only. ! */ ! public static final int SCROLLBARS_VERTICAL_ONLY = 1; ! ! /** ! * Use horizatonal scroll bars only. ! */ ! public static final int SCROLLBARS_HORIZONTAL_ONLY = 2; ! ! /** ! * Use no scrollbars. ! */ ! public static final int SCROLLBARS_NONE = 3; ! ! // Serialization constant ! private static final long serialVersionUID = 3692302836626095722L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The number of columns in this text area. ! */ ! private int columns; ! ! /** ! * @serial The number of rows in this text area. ! */ ! private int rows; ! ! /** ! * @serial The type of scrollbars to display, which will be one of ! * the contstants from this class. ! */ ! private int scrollbarVisibility; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Initialize a new instance of TextArea that is empty ! * and is one row and one column. Both horizontal and vertical ! * scrollbars will be used. ! */ ! public ! TextArea() ! { ! this("", 1, 1, SCROLLBARS_BOTH); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of TextArea that ! * contains the specified string. Both horizontal and veritcal ! * scrollbars will be used. ! * ! * @param text The text to display in this text area. ! */ ! public ! TextArea(String text) ! { ! this(text, 1, text.length(), SCROLLBARS_BOTH); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of TextArea that is empty ! * and has the specified number of rows and columns. Both ! * horizontal and vertical scrollbars will be used. ! * ! * @param rows The number of rows in this text area. ! * @param columns The number of columns in this text area. ! */ ! public ! TextArea(int rows, int columns) ! { ! this("", rows, columns, SCROLLBARS_BOTH); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of TextArea that is the ! * specified size and has the specified text. ! * ! * @param text The text to display in this text area. ! * @param rows The number of rows in this text area. ! * @param columns The number of columns in this text area. ! */ ! public ! TextArea(String text, int rows, int columns) ! { ! this(text, rows, columns, SCROLLBARS_BOTH); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of TextArea with the ! * specified values. The scrollbar visibility value must be one ! * of the constants in this class. ! * ! * @param text The text to display in this text area. ! * @param rows The number of rows in this text area. ! * @param columns The number of columns in this text area. ! * @param scrollbarVisibility Which scrollbars to display. ! */ ! public ! TextArea(String text, int rows, int columns, int scrollbarVisibility) ! { ! super(text); ! ! if ((rows < 1) || (columns < 0)) ! throw new IllegalArgumentException("Bad row or column value"); ! ! if ((scrollbarVisibility != SCROLLBARS_BOTH) && ! (scrollbarVisibility != SCROLLBARS_VERTICAL_ONLY) && ! (scrollbarVisibility != SCROLLBARS_HORIZONTAL_ONLY) && ! (scrollbarVisibility != SCROLLBARS_NONE)) ! throw new IllegalArgumentException("Bad scrollbar visibility value"); ! ! this.rows = rows; ! this.columns = columns; ! this.scrollbarVisibility = scrollbarVisibility; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * Returns the number of columns in the field. ! * ! * @return The number of columns in the field. ! */ ! public int ! getColumns() ! { ! return(columns); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the number of columns in this field to the specified value. ! * ! * @param columns The new number of columns in the field. ! * ! * @exception IllegalArgumentException If columns is less than zero. ! */ ! public synchronized void ! setColumns(int columns) ! { ! if (columns < 0) ! throw new IllegalArgumentException("Value is less than zero: " + ! columns); ! ! this.columns = columns; ! // FIXME: How to we communicate this to our peer? ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the number of rows in the field. ! * ! * @return The number of rows in the field. ! */ ! public int ! getRows() ! { ! return(rows); ! } ! ! /*************************************************************************/ ! ! /** ! * Sets the number of rows in this field to the specified value. ! * ! * @param rows The new number of rows in the field. ! * ! * @exception IllegalArgumentException If rows is less than zero. ! */ ! public synchronized void ! setRows(int rows) ! { ! if (rows < 1) ! throw new IllegalArgumentException("Value is less than one: " + ! rows); ! ! this.rows = rows; ! // FIXME: How to we communicate this to our peer? ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum size for this text field. ! * ! * @return The minimum size for this text field. ! */ ! public Dimension ! getMinimumSize() ! { ! return(getMinimumSize(getRows(), getColumns())); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the minimum size of a text field with the specified number ! * of rows and columns. ! * ! * @param rows The number of rows to get the minimum size for. ! * @param columns The number of columns to get the minimum size for. ! */ ! public Dimension ! getMinimumSize(int rows, int columns) ! { ! TextAreaPeer tap = (TextAreaPeer)getPeer(); ! if (tap == null) ! return(null); // FIXME: What do we do if there is no peer? ! ! return(tap.getMinimumSize(rows, columns)); } + + /*************************************************************************/ + + /** + * Returns the minimum size for this text field. + * + * @return The minimum size for this text field. + * + * @deprecated This method is depcreated in favor of + * getMinimumSize(). + */ + public Dimension + minimumSize() + { + return(getMinimumSize(getRows(), getColumns())); + } + + /*************************************************************************/ + + /** + * Returns the minimum size of a text field with the specified number + * of rows and columns. + * + * @param rows The number of rows to get the minimum size for. + * @param columns The number of columns to get the minimum size for. + * + * @deprecated This method is deprecated in favor of + * getMinimumSize(int). + */ + public Dimension + minimumSize(int rows, int columns) + { + return(getMinimumSize(rows, columns)); + } + + /*************************************************************************/ + + /** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + */ + public Dimension + getPreferredSize() + { + return(getPreferredSize(getRows(), getColumns())); + } + + /*************************************************************************/ + + /** + * Returns the preferred size of a text field with the specified number + * of rows and columns. + * + * @param rows The number of rows to get the preferred size for. + * @param columns The number of columns to get the preferred size for. + */ + public Dimension + getPreferredSize(int rows, int columns) + { + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return(null); // FIXME: What do we do if there is no peer? + + return(tap.getPreferredSize(rows, columns)); + } + + /*************************************************************************/ + + /** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(). + */ + public Dimension + preferredSize() + { + return(getPreferredSize(getRows(), getColumns())); + } + + /*************************************************************************/ + + /** + * Returns the preferred size of a text field with the specified number + * of rows and columns. + * + * @param rows The number of rows to get the preferred size for. + * @param columns The number of columns to get the preferred size for. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(int). + */ + public Dimension + preferredSize(int columns) + { + return(getPreferredSize(rows, columns)); + } + + /*************************************************************************/ + + /** + * Returns one of the constants from this class indicating which + * types of scrollbars this object uses, if any. + * + * @return The scrollbar type constant for this object. + */ + public int + getScrollbarVisibility() + { + return(scrollbarVisibility); + } + + /*************************************************************************/ + + /** + * Notify this object that it should create its native peer. + */ + public void + addNotify() + { + if (getPeer() != null) + return; + + setPeer((ComponentPeer)getToolkit().createTextArea(this)); + } + + /*************************************************************************/ + + /** + * Appends the specified text to the end of the current text. + * + * @param text The text to append. + */ + public void + append(String str) + { + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return; + + tap.insert(str, tap.getText().length()); + } + + /*************************************************************************/ + + /** + * Appends the specified text to the end of the current text. + * + * @param text The text to append. + * + * @deprecated This method is deprecated in favor of + * append(). + */ + public void + appendText(String text) + { + append(text); + } + + /*************************************************************************/ + + /** + * Inserts the specified text at the specified location. + * + * @param text The text to insert. + * @param pos The insert position. + */ + public void + insert(String text, int pos) + { + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return; + + tap.insert(text, pos); + } + + /*************************************************************************/ + + /** + * Inserts the specified text at the specified location. + * + * @param text The text to insert. + * @param pos The insert position. + * + * @deprecated This method is depcreated in favor of insert(). + */ + public void + insertText(String text, int pos) + { + insert(text, pos); + } + + /*************************************************************************/ + + /** + * Replaces the text bounded by the specified start and end positions + * with the specified text. + * + * @param text The new text for the range. + * @param start The start position of the replacement range. + * @param end The end position of the replacement range. + */ + public void + replaceRange(String text, int start, int end) + { + TextAreaPeer tap = (TextAreaPeer)getPeer(); + if (tap == null) + return; + + tap.replaceRange(text, start, end); + } + + /*************************************************************************/ + + /** + * Replaces the text bounded by the specified start and end positions + * with the specified text. + * + * @param text The new text for the range. + * @param start The start position of the replacement range. + * @param end The end position of the replacement range. + * + * @deprecated This method is deprecated in favor of + * replaceRange(). + */ + public void + replaceText(String text, int start, int end) + { + replaceRange(text, start, end); + } + + /*************************************************************************/ + + /** + * Returns a debugging string for this text area. + * + * @return A debugging string for this text area. + */ + protected String + paramString() + { + return(getClass().getName() + "(rows=" + getRows() + ",columns=" + + getColumns() + ",scrollbars=" + getScrollbarVisibility() + + ")"); + } + + } // class TextArea + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/TextComponent.java gcc-3.1/libjava/java/awt/TextComponent.java *** gcc-3.0.4/libjava/java/awt/TextComponent.java Tue Mar 7 19:55:25 2000 --- gcc-3.1/libjava/java/awt/TextComponent.java Wed Jan 23 00:07:39 2002 *************** *** 1,38 **** ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; - import java.awt.event.*; ! /* A very incomplete placeholder. */ ! public class TextComponent extends Component { - char[] buffer; - int length; - int caretPosition; ! public synchronized String getText () ! { return new String(buffer, 0, length); } ! public synchronized void setText (String text) ! { ! length = text.length(); ! if (buffer == null || buffer.length < length) ! buffer = new char[length]; ! text.getChars(0, length, buffer, 0); ! } ! public synchronized void addTextListener (TextListener listener) ! { /* FIXME */ } ! public int getCaretPosition () { return caretPosition; } ! public void setCaretPosition (int pos) { caretPosition = pos; } } --- 1,425 ---- ! /* TextComponent.java -- Widgets for entering text ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.event.TextEvent; ! import java.awt.event.TextListener; ! import java.awt.peer.TextComponentPeer; ! import java.awt.peer.ComponentPeer; ! /** ! * This class provides common functionality for widgets than ! * contain text. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class TextComponent extends Component implements java.io.Serializable { ! /* ! * Static Variables ! */ ! // Constant for serialization ! private static final long serialVersionUID = -2214773872412987419L; ! /* ! * Instance Variables ! */ ! /** ! * @serial Indicates whether or not this component is editable. ! */ ! private boolean editable; ! /** ! * @serial The starting position of the selected text region. ! */ ! private int selectionStart; ! ! /** ! * @serial The ending position of the selected text region. ! */ ! private int selectionEnd; ! ! /** ! * @serial The text in the component ! */ ! private String text; ! ! /** ! * A list of listeners that will receive events from this object. ! */ ! protected transient TextListener textListener; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! TextComponent(String text) ! { ! this.text = text; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * Returns the text in this component ! * ! * @return The text in this component. ! */ ! public synchronized String ! getText() ! { ! TextComponentPeer tcp = (TextComponentPeer)getPeer(); ! if (tcp != null) ! text = tcp.getText(); + return(text); } + + /*************************************************************************/ + + /** + * Sets the text in this component to the specified string. + * + * @param text The new text for this component. + */ + public synchronized void + setText(String text) + { + if (text == null) + text = ""; + + this.text = text; + + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.setText(text); + } + + /*************************************************************************/ + + /** + * Returns a string that contains the text that is currently selected. + * + * @return The currently selected text region. + */ + public synchronized String + getSelectedText() + { + String alltext = getText(); + int start = getSelectionStart(); + int end = getSelectionEnd(); + + return(alltext.substring(start, end)); + } + + /*************************************************************************/ + + /** + * Returns the starting position of the selected text region. + * // FIXME: What is returned if there is no selected text? + * + * @return The starting position of the selected text region. + */ + public synchronized int + getSelectionStart() + { + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + selectionStart = tcp.getSelectionStart(); + + return(selectionStart); + } + + /*************************************************************************/ + + /** + * Sets the starting position of the selected region to the + * specified value. If the specified value is out of range, then it + * will be silently changed to the nearest legal value. + * + * @param selectionStart The new start position for selected text. + */ + public synchronized void + setSelectionStart(int selectionStart) + { + select(selectionStart, getSelectionEnd()); + } + + /*************************************************************************/ + + /** + * Returns the ending position of the selected text region. + * // FIXME: What is returned if there is no selected text. + * + * @return The ending position of the selected text region. + */ + public synchronized int + getSelectionEnd() + { + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + selectionEnd = tcp.getSelectionEnd(); + + return(selectionEnd); + } + + /*************************************************************************/ + + /** + * Sets the ending position of the selected region to the + * specified value. If the specified value is out of range, then it + * will be silently changed to the nearest legal value. + * + * @param selectionEnd The new start position for selected text. + */ + public synchronized void + setSelectionEnd(int selectionEnd) + { + select(getSelectionStart(), selectionEnd); + } + + /*************************************************************************/ + + /** + * This method sets the selected text range to the text between the + * specified start and end positions. Illegal values for these + * positions are silently fixed. + * + * @param startSelection The new start position for the selected text. + * @param endSelection The new end position for the selected text. + */ + public synchronized void + select(int selectionStart, int endSelection) + { + if (selectionStart < 0) + selectionStart = 0; + + if (selectionStart > getText().length()) + selectionStart = text.length(); + + if (selectionEnd > text.length()) + selectionEnd = text.length(); + + if (selectionStart > getSelectionEnd()) + selectionStart = selectionEnd; + + this.selectionStart = selectionStart; + this.selectionEnd = selectionEnd; + + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.select(selectionStart, selectionEnd); + } + + /*************************************************************************/ + + /** + * Selects all of the text in the component. + */ + public synchronized void + selectAll() + { + select(0, getText().length()); + } + + /*************************************************************************/ + + /** + * Returns the current caret position in the text. + * + * @return The caret position in the text. + */ + public synchronized int + getCaretPosition() + { + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + return(tcp.getCaretPosition()); + else + return(0); + } + + /*************************************************************************/ + + /** + * Sets the caret position to the specified value. + * + * @param caretPosition The new caret position. + */ + public synchronized void + setCaretPosition(int caretPosition) + { + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.setCaretPosition(caretPosition); + } + + /*************************************************************************/ + + /** + * Tests whether or not this component's text can be edited. + * + * @return true if the text can be edited, false + * otherwise. + */ + public boolean + isEditable() + { + return(editable); + } + + /*************************************************************************/ + + /** + * Sets whether or not this component's text can be edited. + * + * @param editable true to enable editing of the text, + * false to disable it. + */ + public synchronized void + setEditable(boolean editable) + { + this.editable = editable; + + TextComponentPeer tcp = (TextComponentPeer)getPeer(); + if (tcp != null) + tcp.setEditable(editable); + } + + /*************************************************************************/ + + /** + * Notifies the component that it should destroy its native peer. + */ + public void + removeNotify() + { + super.removeNotify(); + } + + /*************************************************************************/ + + /** + * Adds a new listener to the list of text listeners for this + * component. + * + * @param listener The listener to be added. + */ + public synchronized void + addTextListener(TextListener listener) + { + textListener = AWTEventMulticaster.add(textListener, listener); + + enableEvents(AWTEvent.TEXT_EVENT_MASK); + } + + /*************************************************************************/ + + /** + * Removes the specified listener from the list of listeners + * for this component. + * + * @param listener The listener to remove. + */ + public synchronized void + removeTextListener(TextListener listener) + { + textListener = AWTEventMulticaster.remove(textListener, listener); + } + + /*************************************************************************/ + + /** + * Processes the specified event for this component. Text events are + * processed by calling the processTextEvent() method. + * All other events are passed to the superclass method. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof TextEvent) + processTextEvent((TextEvent)event); + else + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * Processes the specified text event by dispatching it to any listeners + * that are registered. Note that this method will only be called + * if text event's are enabled. This will be true if there are any + * registered listeners, or if the event has been specifically + * enabled using enableEvents(). + * + * @param event The text event to process. + */ + protected void + processTextEvent(TextEvent event) + { + if (textListener != null) + textListener.textValueChanged(event); + } + + /*************************************************************************/ + + /** + * Returns a debugging string. + * + * @return A debugging string. + */ + protected String + paramString() + { + return(getClass().getName() + "(text=" + getText() + ")"); + } + + } // class TextComponent + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/TextField.java gcc-3.1/libjava/java/awt/TextField.java *** gcc-3.0.4/libjava/java/awt/TextField.java Thu Aug 3 12:09:38 2000 --- gcc-3.1/libjava/java/awt/TextField.java Wed Jan 23 00:07:39 2002 *************** *** 1,16 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt; - import java.awt.event.*; ! /* A very incomplete placeholder. */ ! public class TextField extends TextComponent { } --- 1,469 ---- ! /* TextField.java -- A one line text entry field ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.event.ActionEvent; ! import java.awt.event.ActionListener; ! import java.awt.peer.TextFieldPeer; ! import java.awt.peer.TextComponentPeer; ! import java.awt.peer.ComponentPeer; ! /** ! * This class implements a single line text entry field widget ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class TextField extends TextComponent implements java.io.Serializable ! { ! ! /* ! * Static Variables ! */ ! ! // Serialization constant ! private static final long serialVersionUID = -2966288784432217853L; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * @serial The number of columns in the text entry field. ! */ ! private int columns; ! ! /** ! * @serial The character that is echoed when doing protected input ! */ ! private char echoChar; ! ! // List of registered ActionListener's for this object. ! private ActionListener action_listeners; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /* ! * Initializes a new instance of TextField that is empty ! * and has one column. ! */ ! public ! TextField() { + this("", 1); } + + /*************************************************************************/ + + /** + * Initializes a new instance of TextField containing + * the specified text. The number of columns will be equal to the + * length of the text string. + * + * @param text The text to display in the field. + */ + public + TextField(String text) + { + this(text, text.length()); + } + + /*************************************************************************/ + + /** + * Initializes a new instance of TextField that is empty + * and has the specified number of columns. + * + * @param columns The number of columns in the text field. + */ + public + TextField(int columns) + { + this("", columns); + } + + /*************************************************************************/ + + /** + * Initializes a new instance of TextField with the + * specified text and number of columns. + * + * @param text The text to display in the field. + * @param columns The number of columns in the field. + */ + public + TextField(String text, int columns) + { + super(text); + this.columns = columns; + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * Returns the number of columns in the field. + * + * @return The number of columns in the field. + */ + public int + getColumns() + { + return(columns); + } + + /*************************************************************************/ + + /** + * Sets the number of columns in this field to the specified value. + * + * @param columns The new number of columns in the field. + * + * @exception IllegalArgumentException If columns is less than zero. + */ + public synchronized void + setColumns(int columns) + { + if (columns < 0) + throw new IllegalArgumentException("Value is less than zero: " + + columns); + + this.columns = columns; + // FIXME: How to we communicate this to our peer? + } + + /*************************************************************************/ + + /** + * Returns the character that is echoed to the screen when a text + * field is protected (such as when a password is being entered). + * + * @return The echo character for this text field. + */ + public char + getEchoChar() + { + return(echoChar); + } + + /*************************************************************************/ + + /** + * Sets the character that is echoed when protected input such as + * a password is displayed. + * + * @param echoChar The new echo character. + */ + public void + setEchoChar(char echoChar) + { + this.echoChar = echoChar; + + TextFieldPeer tfp = (TextFieldPeer)getPeer(); + if (tfp != null) + tfp.setEchoChar(echoChar); + } + + /*************************************************************************/ + + /** + * Sets the character that is echoed when protected input such as + * a password is displayed. + * + * @param echoChar The new echo character. + * + * @deprecated This method is deprecated in favor of + * setEchoChar() + */ + public void + setEchoCharacter(char echoChar) + { + setEchoChar(echoChar); + } + + /*************************************************************************/ + + /** + * Tests whether or not this text field has an echo character set + * so that characters the user type are not echoed to the screen. + * + * @return true if an echo character is set, + * false otherwise. + */ + public boolean + echoCharIsSet() + { + if (echoChar == '\u0000') + return(false); + else + return(true); + } + + /*************************************************************************/ + + /** + * Returns the minimum size for this text field. + * + * @return The minimum size for this text field. + */ + public Dimension + getMinimumSize() + { + return(getMinimumSize(getColumns())); + } + + /*************************************************************************/ + + /** + * Returns the minimum size of a text field with the specified number + * of columns. + * + * @param columns The number of columns to get the minimum size for. + */ + public Dimension + getMinimumSize(int columns) + { + TextFieldPeer tfp = (TextFieldPeer)getPeer(); + if (tfp == null) + return(null); // FIXME: What do we do if there is no peer? + + return(tfp.getMinimumSize(columns)); + } + + /*************************************************************************/ + + /** + * Returns the minimum size for this text field. + * + * @return The minimum size for this text field. + * + * @deprecated This method is depcreated in favor of + * getMinimumSize(). + */ + public Dimension + minimumSize() + { + return(getMinimumSize(getColumns())); + } + + /*************************************************************************/ + + /** + * Returns the minimum size of a text field with the specified number + * of columns. + * + * @param columns The number of columns to get the minimum size for. + * + * @deprecated This method is deprecated in favor of + * getMinimumSize(int). + */ + public Dimension + minimumSize(int columns) + { + return(getMinimumSize(columns)); + } + + /*************************************************************************/ + + /** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + */ + public Dimension + getPreferredSize() + { + return(getPreferredSize(getColumns())); + } + + /*************************************************************************/ + + /** + * Returns the preferred size of a text field with the specified number + * of columns. + * + * @param columns The number of columns to get the preferred size for. + */ + public Dimension + getPreferredSize(int columns) + { + TextFieldPeer tfp = (TextFieldPeer)getPeer(); + if (tfp == null) + return(null); // FIXME: What do we do if there is no peer? + + return(tfp.getPreferredSize(columns)); + } + + /*************************************************************************/ + + /** + * Returns the preferred size for this text field. + * + * @return The preferred size for this text field. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(). + */ + public Dimension + preferredSize() + { + return(getPreferredSize(getColumns())); + } + + /*************************************************************************/ + + /** + * Returns the preferred size of a text field with the specified number + * of columns. + * + * @param columns The number of columns to get the preferred size for. + * + * @deprecated This method is deprecated in favor of + * getPreferredSize(int). + */ + public Dimension + preferredSize(int columns) + { + return(getPreferredSize(columns)); + } + + /*************************************************************************/ + + /** + * Notifies this object that it should create its native peer. + */ + public void + addNotify() + { + if (getPeer() != null) + return; + + setPeer((ComponentPeer)getToolkit().createTextField(this)); + } + + /*************************************************************************/ + + /** + * Addes a new listener to the list of action listeners for this + * object. + * + * @param listener The listener to add to the list. + */ + public synchronized void + addActionListener(ActionListener listener) + { + action_listeners = AWTEventMulticaster.add(action_listeners, listener); + + enableEvents(AWTEvent.ACTION_EVENT_MASK); + } + + /*************************************************************************/ + + /** + * Removes the specified listener from the list of action listeners + * for this object. + * + * @param listener The listener to remove from the list. + */ + public synchronized void + removeActionListener(ActionListener listener) + { + action_listeners = AWTEventMulticaster.remove(action_listeners, listener); + } + + /*************************************************************************/ + + /** + * Processes the specified event. If the event is an instance of + * ActionEvent then processActionEvent() is + * called to process it, otherwise the event is sent to the + * superclass. + * + * @param event The event to process. + */ + protected void + processEvent(AWTEvent event) + { + if (event instanceof ActionEvent) + processActionEvent((ActionEvent)event); + else + super.processEvent(event); + } + + /*************************************************************************/ + + /** + * Processes an action event by calling any registered listeners. + * Note to subclasses: This method is not called unless action events + * are enabled on this object. This will be true if any listeners + * are registered, or if action events were specifically enabled + * using enableEvents(). + * + * @param event The event to process. + */ + protected void + processActionEvent(ActionEvent event) + { + if (action_listeners != null) + action_listeners.actionPerformed(event); + } + + /*************************************************************************/ + + /** + * Returns a debug string for this object. + * + * @return A debug string for this object. + */ + protected String + paramString() + { + return(getClass().getName() + "(columns=" + getColumns() + ",echoChar=" + + getEchoChar()); + } + + } // class TextField diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Toolkit.java gcc-3.1/libjava/java/awt/Toolkit.java *** gcc-3.0.4/libjava/java/awt/Toolkit.java Mon Oct 2 05:14:25 2000 --- gcc-3.1/libjava/java/awt/Toolkit.java Thu Jan 24 06:30:59 2002 *************** *** 1,263 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. - This software is copyrighted work licensed under the terms of the - Libjava License. Please consult the file "LIBJAVA_LICENSE" for - details. */ package java.awt; ! import java.awt.peer.*; import java.awt.event.*; ! import java.net.URL; ! import java.beans.*; import java.awt.image.*; import java.awt.datatransfer.Clipboard; ! import java.util.Hashtable; ! import gnu.gcj.awt.GLightweightPeer; ! ! /* A very incomplete placeholder. */ public abstract class Toolkit { - static Toolkit defaultToolkit; - PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); - Hashtable desktopProperties = new Hashtable(); ! public static Toolkit getDefaultToolkit() ! { ! if (defaultToolkit != null) ! return defaultToolkit; ! ! Class toolkit_class; ! String tk_class_name = System.getProperty("awt.toolkit"); ! if (tk_class_name == null) ! tk_class_name = "gnu.awt.gtk.GtkToolkit"; ! try { ! toolkit_class = Class.forName(tk_class_name); ! defaultToolkit = (Toolkit) toolkit_class.newInstance(); } ! catch (Exception x) { ! throw new AWTError("Toolkit class " + tk_class_name + ! " could not be initialized:\n " + x); } ! return defaultToolkit; ! } ! protected abstract ButtonPeer createButton(Button target); ! protected abstract TextFieldPeer createTextField(TextField target); ! protected abstract LabelPeer createLabel(Label target); ! protected abstract ListPeer createList(List target); ! protected abstract CheckboxPeer createCheckbox(Checkbox target); ! protected abstract ScrollbarPeer createScrollbar(Scrollbar target); ! protected abstract ScrollPanePeer createScrollPane(ScrollPane target); ! protected abstract TextAreaPeer createTextArea(TextArea target); ! protected abstract ChoicePeer createChoice(Choice target); ! protected abstract FramePeer createFrame(Frame target); ! protected abstract CanvasPeer createCanvas(Canvas target); ! protected abstract PanelPeer createPanel(Panel target); ! protected abstract WindowPeer createWindow(Window target); ! protected abstract DialogPeer createDialog(Dialog target); ! protected abstract MenuBarPeer createMenuBar(MenuBar target); ! protected abstract MenuPeer createMenu(Menu target); ! protected abstract PopupMenuPeer createPopupMenu(PopupMenu target); ! protected abstract MenuItemPeer createMenuItem(MenuItem target); ! protected abstract FileDialogPeer createFileDialog(FileDialog target); ! protected abstract CheckboxMenuItemPeer ! createCheckboxMenuItem(CheckboxMenuItem target); ! protected LightweightPeer createComponent(Component target) ! { ! return GLightweightPeer.INSTANCE; ! } ! ! /* @deprecated Use GraphicsEnvironment.getAllFonts() */ ! protected abstract java.awt.peer.FontPeer getFontPeer(String name, int style); ! ! /* ! public abstract DragSourceContextPeer ! createDragSourceContextPeer(DragGestureEvent dge) ! throws InvalidDnDOperationException; */ ! ! protected void loadSystemColors(int[] systemColors) ! { ! // FIXME ! } ! public abstract Dimension getScreenSize(); ! public abstract int getScreenResolution(); ! public abstract ColorModel getColorModel(); ! /* @deprecated Use GraphicsEnvironment.getAvailableFontFamilyNames() */ ! public abstract String[] getFontList(); ! public abstract FontMetrics getFontMetrics(Font font); ! public abstract void sync(); ! public abstract Image getImage(String filename); ! public abstract Image getImage(URL url); ! public abstract Image createImage(String filename); ! public abstract Image createImage(URL url); ! public abstract boolean prepareImage(Image image, int width, int height, ! ImageObserver observer); ! public abstract int checkImage(Image image, int width, int height, ! ImageObserver observer); ! public abstract Image createImage(ImageProducer producer); ! public Image createImage(byte[] imagedata) ! { ! return createImage (imagedata, 0, imagedata.length); ! } ! ! public abstract Image createImage(byte[] imagedata, int imageoffset, ! int imagelength); ! /* ! public abstract PrintJob getPrintJob(Frame frame, String jobtitle, ! Properties props); ! public PrintJob getPrintJob(Frame frame, String jobtitle, ! JobAttributes jobAttributes, ! PageAttributes pageAttributes) ! { ! ! } */ ! ! public abstract void beep(); ! public abstract Clipboard getSystemClipboard(); ! public int getMenuShortcutKeyMask() ! { ! return InputEvent.CTRL_MASK; ! } ! public boolean getLockingKeyState(int keyCode) ! { ! if (keyCode != KeyEvent.VK_CAPS_LOCK ! && keyCode != KeyEvent.VK_NUM_LOCK ! && keyCode != KeyEvent.VK_SCROLL_LOCK) ! throw new IllegalArgumentException(); ! throw new UnsupportedOperationException(); ! } ! public void setLockingKeyState(int keyCode, boolean on) ! { ! if (keyCode != KeyEvent.VK_CAPS_LOCK ! && keyCode != KeyEvent.VK_NUM_LOCK ! && keyCode != KeyEvent.VK_SCROLL_LOCK) ! throw new IllegalArgumentException(); ! throw new UnsupportedOperationException(); ! } ! protected static Container getNativeContainer(Component c) ! { ! while (c != null) ! { ! if (!c.isLightweight ()) ! return (Container) c; ! c = c.getParent(); ! } ! return null; ! } ! public Cursor createCustomCursor(Image cursor, Point hotSpot, String name) ! throws IndexOutOfBoundsException ! { ! // Presumably the only reason this isn't abstract is for backwards ! // compatibility? FIXME? ! return null; ! } ! public Dimension getBestCursorSize(int preferredWidth, int preferredHeight) ! { ! return new Dimension (0,0); ! } ! public int getMaximumCursorColors() ! { ! return 0; ! } ! public static String getProperty(String key, String defaultValue) ! { ! // FIXME ! return defaultValue; ! } ! public final EventQueue getSystemEventQueue() ! { ! return getSystemEventQueueImpl(); ! } ! protected abstract EventQueue getSystemEventQueueImpl(); ! /* ! public DragGestureRecognizer ! createDragGestureRecognizer(Class abstractRecognizerClass, DragSource ds, ! Component c, int srcActions, ! DragGestureListener dgl) ! { ! // err... FIXME ! return null; ! } */ ! public final Object getDesktopProperty(String propertyName) ! { ! return desktopProperties.get(propertyName); ! } ! protected final void setDesktopProperty(String name, Object newValue) ! { ! Object oldValue = getDesktopProperty(name); ! desktopProperties.put(name, newValue); ! changeSupport.firePropertyChange(name, oldValue, newValue); ! } ! protected Object lazilyLoadDesktopProperty(String name) ! { ! // FIXME - what is this?? ! return null; ! } ! protected void initializeDesktopProperties() ! { ! // Overridden by toolkit implementation? ! } ! public void addPropertyChangeListener(String name, ! PropertyChangeListener pcl) ! { ! changeSupport.addPropertyChangeListener(name, pcl); ! } ! ! public void removePropertyChangeListener(String name, ! PropertyChangeListener pcl) ! { ! changeSupport.removePropertyChangeListener(name, pcl); ! } ! public void addAWTEventListener(AWTEventListener listener, long eventMask) ! { ! // SecurityManager s = System.getSecurityManager(); ! // if (s != null) ! // s.checkPermission(AWTPermission("listenToAllAWTEvents")); ! // FIXME ! } ! public void removeAWTEventListener(AWTEventListener listener) ! { ! // FIXME ! } ! ! /* ! public abstract Map mapInputMethodHighlight(InputMethodHighlight highlight) ! { ! } */ } --- 1,825 ---- ! /* Toolkit.java -- AWT Toolkit superclass ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; ! import java.awt.event.*; ! import java.awt.peer.*; import java.awt.image.*; import java.awt.datatransfer.Clipboard; ! import java.util.Properties; ! import java.net.URL; ! import java.beans.*; + /** + * The AWT system uses a set of native peer objects to implement its + * widgets. These peers are provided by a peer toolkit, that is accessed + * via a subclass of this superclass. The system toolkit is retrieved + * by the static methods getDefaultToolkit. This method + * determines the system toolkit by examining the system property + * awt.toolkit. That property is set to the name of the + * Toolkit subclass for the specified peer set. If the + * awt.toolkit property is not set, then the default + * toolkit gnu.java.awt.peer.gtk.GtkToolkit is used. This + * toolkit creates its peers using the GTK+ toolkit. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public abstract class Toolkit { ! /* ! * Static Variables ! */ ! // The default toolkit name. ! private static String default_toolkit_name = ! "gnu.java.awt.peer.gtk.GtkToolkit"; ! ! // The toolkit in use. Once we load it, we don't ever change it ! // if the awt.toolkit propert is set. ! private static Toolkit toolkit; ! ! // The toolkit properties ! private static Properties props = new Properties(); ! ! private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); ! ! private Properties desktopProperties = new Properties(); ! ! /*************************************************************************/ ! ! /* ! * Static Methods ! */ ! ! /** ! * Returns an instance of the default toolkit. The default toolkit is ! * the subclass of Toolkit specified in the system property ! * awt.toolkit, or gnu.java.awt.peer.gtk.GtkToolkit ! * if the property is not set. ! * ! * @return An instance of the system default toolkit. ! * ! * @error AWTError If the toolkit cannot be loaded. ! */ ! public static Toolkit ! getDefaultToolkit() ! { ! if (toolkit != null) ! return(toolkit); ! ! String toolkit_name = System.getProperty("awt.toolkit", ! default_toolkit_name); ! ! try { ! Class cls = Class.forName(toolkit_name); ! Object obj = cls.newInstance(); ! ! if (!(obj instanceof Toolkit)) ! throw new AWTError(toolkit_name + " is not a subclass of " + ! "java.awt.Toolkit"); ! ! toolkit = (Toolkit)obj; ! return(toolkit); } ! catch(Exception e) { ! throw new AWTError("Cannot load AWT toolkit: " + e.getMessage()); } + } ! /*************************************************************************/ ! /** ! * Returns the value of the property with the specified name, or the ! * default value if the property does not exist. ! * ! * @param key The name of the property to retrieve. ! * @param defThe default value of the property. ! */ ! public static String ! getProperty(String key, String def) ! { ! return(props.getProperty(key, def)); ! } ! /*************************************************************************/ ! ! /** ! * Returns the native container object of the specified component. This ! * method is necessary because the parent component might be a lightweight ! * component. ! * ! * @param component The component to fetch the native container for. ! * ! * @return The native container object for this component. */ ! protected static Container ! getNativeContainer(Component component) ! { ! component = component.getParent(); ! for(;;) ! { ! if (component == null) ! return(null); ! if (!(component instanceof Container)) ! { ! component = component.getParent(); ! continue; ! } ! ! if (component.getPeer() instanceof LightweightPeer) ! { ! component = component.getParent(); ! continue; ! } ! ! return((Container)component); ! } ! } ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Default constructor for subclasses. */ ! public ! Toolkit() ! { ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Creates a peer object for the specified Button. ! * ! * @param target The Button to create the peer for. ! * ! * @return The peer for the specified Button object. ! */ ! protected abstract ButtonPeer ! createButton(Button target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified TextField. ! * ! * @param target The TextField to create the peer for. ! * ! * @return The peer for the specified TextField object. ! */ ! protected abstract TextFieldPeer ! createTextField(TextField target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified Label. ! * ! * @param target The Label to create the peer for. ! * ! * @return The peer for the specified Label object. ! */ ! protected abstract LabelPeer ! createLabel(Label target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified List. ! * ! * @param target The List to create the peer for. ! * ! * @return The peer for the specified List object. ! */ ! protected abstract ListPeer ! createList(List target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified Checkbox. ! * ! * @param target The Checkbox to create the peer for. ! * ! * @return The peer for the specified Checkbox object. ! */ ! protected abstract CheckboxPeer ! createCheckbox(Checkbox target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified Scrollbar. ! * ! * @param target The Scrollbar to create the peer for. ! * ! * @return The peer for the specified Scrollbar object. ! */ ! protected abstract ScrollbarPeer ! createScrollbar(Scrollbar target); ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified ScrollPane. ! * ! * @param target The ScrollPane to create the peer for. ! * ! * @return The peer for the specified ScrollPane object. */ + protected abstract ScrollPanePeer + createScrollPane(ScrollPane target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified TextArea. ! * ! * @param target The TextArea to create the peer for. ! * ! * @return The peer for the specified TextArea object. ! */ ! protected abstract TextAreaPeer ! createTextArea(TextArea target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified Choice. ! * ! * @param target The Choice to create the peer for. ! * ! * @return The peer for the specified Choice object. ! */ ! protected abstract ChoicePeer ! createChoice(Choice target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified Frame. ! * ! * @param target The Frame to create the peer for. ! * ! * @return The peer for the specified Frame object. ! */ ! protected abstract FramePeer ! createFrame(Frame target); ! /*************************************************************************/ ! /** ! * Creates a peer object for the specified Canvas. ! * ! * @param target The Canvas to create the peer for. ! * ! * @return The peer for the specified Canvas object. ! */ ! protected abstract CanvasPeer ! createCanvas(Canvas target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified Panel. ! * ! * @param target The Panel to create the peer for. ! * ! * @return The peer for the specified Panel object. ! */ ! protected abstract PanelPeer ! createPanel(Panel target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified Window. ! * ! * @param target The Window to create the peer for. ! * ! * @return The peer for the specified Window object. ! */ ! protected abstract WindowPeer ! createWindow(Window target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified Dialog. ! * ! * @param target The dialog to create the peer for ! * ! * @return The peer for the specified font name. ! */ ! protected abstract DialogPeer ! createDialog(Dialog target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified MenuBar. ! * ! * @param target The MenuBar to create the peer for. ! * ! * @return The peer for the specified MenuBar object. ! */ ! protected abstract MenuBarPeer ! createMenuBar(MenuBar target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified Menu. ! * ! * @param target The Menu to create the peer for. ! * ! * @return The peer for the specified Menu object. ! */ ! protected abstract MenuPeer ! createMenu(Menu target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified PopupMenu. ! * ! * @param target The PopupMenu to create the peer for. ! * ! * @return The peer for the specified PopupMenu object. ! */ ! protected abstract PopupMenuPeer ! createPopupMenu(PopupMenu target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified MenuItem. ! * ! * @param target The MenuItem to create the peer for. ! * ! * @return The peer for the specified MenuItem object. ! */ ! protected abstract MenuItemPeer ! createMenuItem(MenuItem target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified FileDialog. ! * ! * @param target The FileDialog to create the peer for. ! * ! * @return The peer for the specified FileDialog object. ! */ ! protected abstract FileDialogPeer ! createFileDialog(FileDialog target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified CheckboxMenuItem. ! * ! * @param target The CheckboxMenuItem to create the peer for. ! * ! * @return The peer for the specified CheckboxMenuItem object. ! */ ! protected abstract CheckboxMenuItemPeer ! createCheckboxMenuItem(CheckboxMenuItem target); ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified Component. The ! * peer returned by this method is not a native windowing system peer ! * with its own native window. Instead, this method allows the component ! * to draw on its parent window as a "lightweight" widget. ! * ! * XXX: FIXME ! * ! * @param target The Component to create the peer for. ! * ! * @return The peer for the specified Component object. ! */ ! protected LightweightPeer ! createComponent(Component target) ! { ! return null; ! } ! ! /*************************************************************************/ ! ! /** ! * Creates a peer object for the specified font name. ! * ! * @param name The font to create the peer for. ! * @param style The font style to create the peer for. ! * ! * @return The peer for the specified font name. ! */ ! protected abstract FontPeer ! getFontPeer(String name, int style); ! ! /*************************************************************************/ ! ! /** ! * Copies the current system colors into the specified array. This is ! * the interface used by the SystemColors class. ! * ! * @param colors The array to copy the system colors into. ! */ ! protected void ! loadSystemColors(int systemColors[]) ! { ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the dimensions of the screen in pixels. ! * ! * @return The dimensions of the screen in pixels. ! */ ! public abstract Dimension ! getScreenSize(); ! ! /*************************************************************************/ ! ! /** ! * Returns the screen resolution in dots per square inch. ! * ! * @return The screen resolution in dots per square inch. ! */ ! public abstract int ! getScreenResolution(); ! ! /*************************************************************************/ ! ! /** ! * Returns the color model of the screen. ! * ! * @return The color model of the screen. ! */ ! public abstract ColorModel ! getColorModel(); ! ! /*************************************************************************/ ! ! /** ! * Returns the names of the available fonts. ! * ! * @return The names of the available fonts. ! */ ! public abstract String[] ! getFontList(); ! ! /*************************************************************************/ ! ! /** ! * Return the font metrics for the specified font ! * ! * @param name The name of the font to return metrics for. ! * ! * @return The requested font metrics. ! */ ! public abstract FontMetrics ! getFontMetrics(Font name); ! ! /*************************************************************************/ ! ! /** ! * Flushes any buffered data to the screen so that it is in sync with ! * what the AWT system has drawn to it. ! */ ! public abstract void ! sync(); ! ! /*************************************************************************/ ! ! /** ! * Returns an image from the specified file, which must be in a ! * recognized format. Supported formats vary from toolkit to toolkit. ! * ! * @return name The name of the file to read the image from. ! */ ! public abstract Image ! getImage(String name); ! ! /*************************************************************************/ ! ! /** ! * Returns an image from the specified URL, which must be in a ! * recognized format. Supported formats vary from toolkit to toolkit. ! * ! * @return url The URl to read the image from. ! */ ! public abstract Image ! getImage(URL url); ! ! /*************************************************************************/ ! ! /** ! * Readies an image to be rendered on the screen. The width and height ! * values can be set to the default sizes for the image by passing -1 ! * in those parameters. ! * ! * @param image The image to prepare for rendering. ! * @param width The width of the image. ! * @param height The height of the image. ! * @param observer The observer to receive events about the preparation ! * process. ! * ! * @return true if the image is already prepared for rendering, ! * false otherwise. ! */ ! public abstract boolean ! prepareImage(Image image, int width, int height, ImageObserver observer); ! ! /*************************************************************************/ ! ! /** ! * Checks the status of specified image as it is being readied for ! * rendering. ! * ! * @param image The image to prepare for rendering. ! * @param width The width of the image. ! * @param height The height of the image. ! * @param observer The observer to receive events about the preparation ! * process. ! * ! * @return A union of the bitmasks from ! * java.awt.image.ImageObserver that indicates the current ! * state of the imaging readying process. ! */ ! public abstract int ! checkImage(Image image, int width, int height, ImageObserver observer); ! ! /*************************************************************************/ ! ! /** ! * Creates an image using the specified ImageProducer ! * ! * @param producer The ImageProducer to create the image from. ! * ! * @return The created image. ! */ ! public abstract Image ! createImage(ImageProducer producer); ! ! /*************************************************************************/ ! ! /** ! * Creates an image from the specified portion of the byte array passed. ! * The array must be in a recognized format. Supported formats vary from ! * toolkit to toolkit. ! * ! * @param data The raw image data. ! * @param offset The offset into the data where the image data starts. ! * @param len The length of the image data. ! * ! * @return The created image. ! */ ! public abstract Image ! createImage(byte[] data, int offset, int len); ! ! /*************************************************************************/ ! ! /** ! * Creates an image from the specified byte array. The array must be in ! * a recognized format. Supported formats vary from toolkit to toolkit. ! * ! * @param data The raw image data. ! * ! * @return The created image. ! */ ! public Image ! createImage(byte[] data) ! { ! return(createImage(data, 0, data.length)); ! } ! ! public abstract Image ! createImage(String filename); ! ! public abstract Image ! createImage(URL url); ! ! ! /*************************************************************************/ ! ! /** ! * Returns a instance of PrintJob for the specified ! * arguments. ! * ! * @param frame The window initiating the print job. ! * @param title The print job title. ! * @param props The print job properties. ! * ! * @return The requested print job, or null if the job ! * was cancelled. ! */ ! public abstract PrintJob ! getPrintJob(Frame frame, String title, Properties props); ! ! /*************************************************************************/ ! ! /** ! * Returns the system clipboard. ! * ! * @return THe system clipboard. ! */ ! public abstract Clipboard ! getSystemClipboard(); ! ! /*************************************************************************/ ! ! /** ! * Returns the accelerator key mask for menu shortcuts. The default is ! * Event.CTRL_MASK. A toolkit must override this method ! * to change the default. ! * ! * @return The key mask for the menu accelerator key. ! */ ! public int ! getMenuShortcutKeyMask() ! { ! return Event.CTRL_MASK; ! } ! ! public boolean ! getLockingKeyState(int keyCode) ! { ! if (keyCode != KeyEvent.VK_CAPS_LOCK ! && keyCode != KeyEvent.VK_NUM_LOCK ! && keyCode != KeyEvent.VK_SCROLL_LOCK) ! throw new IllegalArgumentException(); ! ! throw new UnsupportedOperationException(); ! } ! ! public void ! setLockingKeyState(int keyCode, boolean on) ! { ! if (keyCode != KeyEvent.VK_CAPS_LOCK ! && keyCode != KeyEvent.VK_NUM_LOCK ! && keyCode != KeyEvent.VK_SCROLL_LOCK) ! throw new IllegalArgumentException(); ! ! throw new UnsupportedOperationException(); ! } ! ! /*************************************************************************/ ! ! /** ! * Returns the event queue for the applet. Despite the word "System" ! * in the name of this method, there is no guarantee that the same queue ! * is shared system wide. ! * ! * @return The event queue for this applet (or application) ! */ ! public final EventQueue ! getSystemEventQueue() ! { ! return(getSystemEventQueueImpl()); ! } ! ! /*************************************************************************/ ! ! /** ! * // FIXME: What does this do? ! */ ! protected abstract EventQueue ! getSystemEventQueueImpl(); ! ! /*************************************************************************/ ! ! /** ! * Causes a "beep" tone to be generated. */ + public abstract void + beep(); + + public Cursor + createCustomCursor(Image cursor, Point hotSpot, String name) + throws IndexOutOfBoundsException + { + // Presumably the only reason this isn't abstract is for backwards + // compatibility? FIXME? + return null; + } + + public Dimension + getBestCursorSize(int preferredWidth, int preferredHeight) + { + return new Dimension (0,0); } + + public int + getMaximumCursorColors() + { + return 0; + } + + public final Object + getDesktopProperty(String propertyName) + { + return desktopProperties.get(propertyName); + } + + protected final void + setDesktopProperty(String name, Object newValue) + { + Object oldValue = getDesktopProperty(name); + desktopProperties.put(name, newValue); + changeSupport.firePropertyChange(name, oldValue, newValue); + } + protected Object + lazilyLoadDesktopProperty(String name) + { + // FIXME - what is this?? + return null; + } + + protected void + initializeDesktopProperties() + { + // Overridden by toolkit implementation? + } + + public void + addPropertyChangeListener(String name, PropertyChangeListener pcl) + { + changeSupport.addPropertyChangeListener(name, pcl); + } + + public void + removePropertyChangeListener(String name, PropertyChangeListener pcl) + { + changeSupport.removePropertyChangeListener(name, pcl); + } + + public void + addAWTEventListener(AWTEventListener listener, long eventMask) + { + // SecurityManager s = System.getSecurityManager(); + // if (s != null) + // s.checkPermission(AWTPermission("listenToAllAWTEvents")); + + // FIXME + } + + public void + removeAWTEventListener(AWTEventListener listener) + { + // FIXME + } + + } // class Toolkit diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Transparency.java gcc-3.1/libjava/java/awt/Transparency.java *** gcc-3.0.4/libjava/java/awt/Transparency.java Fri Mar 17 00:45:06 2000 --- gcc-3.1/libjava/java/awt/Transparency.java Tue Jan 22 22:40:05 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/Window.java gcc-3.1/libjava/java/awt/Window.java *** gcc-3.0.4/libjava/java/awt/Window.java Mon Dec 18 21:20:31 2000 --- gcc-3.1/libjava/java/awt/Window.java Tue Jan 29 16:31:24 2002 *************** *** 1,10 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt; import java.awt.event.WindowEvent; --- 1,40 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt; import java.awt.event.WindowEvent; *************** import java.util.EventListener; *** 15,22 **** import java.util.Locale; import java.util.ResourceBundle; ! /* Status: partially implemented. */ ! public class Window extends Container { // Serialized fields, from Sun's serialization spec. --- 45,56 ---- import java.util.Locale; import java.util.ResourceBundle; ! /** ! * This class represents a top-level window with no decorations. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ public class Window extends Container { // Serialized fields, from Sun's serialization spec. *************** public class Window extends Container *** 46,51 **** --- 80,91 ---- graphicsConfiguration = gc; } + /** + * Initializes a new instance of Window with the specified + * parent. The window will initially be invisible. + * + * @param parent The owning Frame of this window. + */ public Window(Frame owner) { this((Window) owner); *************** public class Window extends Container *** 99,104 **** --- 139,147 ---- super.finalize(); } + /** + * Creates the native peer for this window. + */ public void addNotify() { if (peer == null) *************** public class Window extends Container *** 106,113 **** super.addNotify (); } ! /** @specnote pack() doesn't appear to be called internally by show(), so ! we duplicate some of the functionality. */ public void pack() { if (parent != null --- 149,160 ---- super.addNotify (); } ! /** ! * Relays out this window's child components at their preferred size. ! * ! * @specnote pack() doesn't appear to be called internally by show(), so ! * we duplicate some of the functionality. ! */ public void pack() { if (parent != null *************** public class Window extends Container *** 121,151 **** validate(); } public void show () { if (peer == null) addNotify(); - validate (); - - if (isVisible()) - { - this.toFront(); - return; - } - - if (parent != null - && !parent.isDisplayable()) - parent.addNotify(); - if (peer == null) - addNotify (); - - validate (); - - super.show (); ! // FIXME: Is this call neccessary or do we assume the peer takes care of ! // it? ! // this.toFront(); } public void hide() --- 168,183 ---- validate(); } + /** + * Makes this window visible and brings it to the front. + */ public void show () { if (peer == null) addNotify(); ! super.show(); ! toFront(); } public void hide() *************** public class Window extends Container *** 154,159 **** --- 186,194 ---- super.hide(); } + /** + * Called to free any resource associated with this window. + */ public void dispose() { hide(); *************** public class Window extends Container *** 167,172 **** --- 202,211 ---- this.removeNotify(); } + /** + * Sends this window to the back so that all other windows display in + * front of it. + */ public void toBack () { if (peer != null) *************** public class Window extends Container *** 176,181 **** --- 215,224 ---- } } + /** + * Brings this window to the front so that it displays in front of + * any other windows. + */ public void toFront () { if (peer != null) *************** public class Window extends Container *** 185,197 **** } } ! /** @specnote Unlike Component.getToolkit, this implementation always ! returns the value of Toolkit.getDefaultToolkit(). */ public Toolkit getToolkit() { return Toolkit.getDefaultToolkit (); } public final String getWarningString() { boolean secure = true; --- 228,252 ---- } } ! /** ! * Returns the toolkit used to create this window. ! * ! * @return The toolkit used to create this window. ! * ! * @specnote Unlike Component.getToolkit, this implementation always ! * returns the value of Toolkit.getDefaultToolkit(). ! */ public Toolkit getToolkit() { return Toolkit.getDefaultToolkit (); } + /** + * Returns the warning string that will be displayed if this window is + * popped up by an unsecure applet or application. + * + * @return The unsecure window warning message. + */ public final String getWarningString() { boolean secure = true; *************** public class Window extends Container *** 210,215 **** --- 265,275 ---- return null; } + /** + * Returns the locale that this window is configured for. + * + * @return The locale this window is configured for. + */ public Locale getLocale () { return locale == null ? Locale.getDefault () : locale; *************** public class Window extends Container *** 223,231 **** } */ public void setCursor(Cursor cursor) { - // FIXME: why different from Component.setCursor() ? super.setCursor(cursor); } --- 283,295 ---- } */ + /** + * Sets the cursor for this window to the specifiec cursor. + * + * @param cursor The new cursor for this window. + */ public void setCursor(Cursor cursor) { super.setCursor(cursor); } *************** public class Window extends Container *** 239,252 **** { // FIXME: return array containing all the windows this window currently // owns. ! return null; } public synchronized void addWindowListener (WindowListener listener) { windowListener = AWTEventMulticaster.add (windowListener, listener); } public synchronized void removeWindowListener (WindowListener listener) { windowListener = AWTEventMulticaster.remove (windowListener, listener); --- 303,328 ---- { // FIXME: return array containing all the windows this window currently // owns. ! return new Window[0]; } + /** + * Adds the specified listener to the list of WindowListeners + * that will receive events for this window. + * + * @param listener The WindowListener to add. + */ public synchronized void addWindowListener (WindowListener listener) { windowListener = AWTEventMulticaster.add (windowListener, listener); } + /** + * Removes the specified listener from the list of + * WindowListeners that will receive events for this window. + * + * @param listener The WindowListener to remove. + */ public synchronized void removeWindowListener (WindowListener listener) { windowListener = AWTEventMulticaster.remove (windowListener, listener); *************** public class Window extends Container *** 272,277 **** --- 348,361 ---- super.dispatchEventImpl(e); } + /** + * Processes the specified event for this window. If the event is an + * instance of WindowEvent, then + * processWindowEvent() is called to process the event, + * otherwise the superclass version of this method is invoked. + * + * @param event The event to process. + */ protected void processEvent (AWTEvent evt) { if (evt instanceof WindowEvent) *************** public class Window extends Container *** 280,285 **** --- 364,377 ---- super.processEvent (evt); } + /** + * Dispatches this event to any listeners that are listening for + * WindowEvents on this window. This method only gets + * invoked if it is enabled via enableEvents() or if + * a listener has been added. + * + * @param event The event to process. + */ protected void processWindowEvent (WindowEvent evt) { if (windowListener != null) *************** public class Window extends Container *** 311,332 **** } } public Component getFocusOwner() { // FIXME return null; } public boolean postEvent(Event e) { // FIXME return false; } public boolean isShowing() { ! // FIXME: Also check if window is within the boundary of the screen? ! return isVisible(); } /** @since 1.2 */ --- 403,442 ---- } } + /** + * Returns the child window that has focus if this window is active. + * This method returns null if this window is not active + * or no children have focus. + * + * @return The component that has focus, or null if no + * component has focus. + */ public Component getFocusOwner() { // FIXME return null; } + /** + * Post a Java 1.0 event to the event queue. + * + * @param event The event to post. + */ public boolean postEvent(Event e) { // FIXME return false; } + /** + * Tests whether or not this window is visible on the screen. + * + * @return true if this window is visible, false + * otherwise. + */ public boolean isShowing() { ! return super.isShowing(); } /** @since 1.2 */ diff -Nrc3pad gcc-3.0.4/libjava/java/awt/color/ColorSpace.java gcc-3.1/libjava/java/awt/color/ColorSpace.java *** gcc-3.0.4/libjava/java/awt/color/ColorSpace.java Tue Aug 29 03:23:56 2000 --- gcc-3.1/libjava/java/awt/color/ColorSpace.java Tue Jan 22 22:40:06 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.color; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.color; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/color/ICC_ColorSpace.java gcc-3.1/libjava/java/awt/color/ICC_ColorSpace.java *** gcc-3.0.4/libjava/java/awt/color/ICC_ColorSpace.java Tue Aug 29 03:23:56 2000 --- gcc-3.1/libjava/java/awt/color/ICC_ColorSpace.java Tue Jan 22 22:40:06 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.color; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.color; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/color/ICC_Profile.java gcc-3.1/libjava/java/awt/color/ICC_Profile.java *** gcc-3.0.4/libjava/java/awt/color/ICC_Profile.java Tue Aug 29 03:23:56 2000 --- gcc-3.1/libjava/java/awt/color/ICC_Profile.java Tue Jan 22 22:40:06 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.color; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.color; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/Clipboard.java gcc-3.1/libjava/java/awt/datatransfer/Clipboard.java *** gcc-3.0.4/libjava/java/awt/datatransfer/Clipboard.java Thu Aug 3 12:09:41 2000 --- gcc-3.1/libjava/java/awt/datatransfer/Clipboard.java Thu Jan 24 06:31:02 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.awt.datatransfer; ! /* A very incomplete placeholder. */ public class Clipboard { } --- 1,136 ---- ! /* Clipboard.java -- Class for transferring data via cut and paste. ! Copyright (C) 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + + package java.awt.datatransfer; + + /** + * This class allows data to be transferred using a cut and paste type + * mechanism. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ public class Clipboard { + + /* + * Instance Variables + */ + + /** + * The data being transferred. + */ + protected Transferable contents; + + /** + * The owner of this clipboard. + */ + protected ClipboardOwner owner; + + // The clipboard name + private String name; + + /*************************************************************************/ + + /* + * Constructors + */ + + /** + * Initializes a new instance of Clipboard with the + * specified name. + * + * @param name The clipboard name. + */ + public + Clipboard(String name) + { + this.name = name; + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * Returns the name of the clipboard. + */ + public String + getName() + { + return(name); } + + /*************************************************************************/ + + /** + * Returns the contents of the clipboard. + * + * @param requestor The object requesting the contents. + */ + public synchronized Transferable + getContents(Object requestor) + { + return(contents); + } + + /*************************************************************************/ + + /** + * Sets the content and owner of this clipboard. + * If the given owner is different from the current owner + * then lostOwnership is called on the current owner. + * XXX - is this called with the old or new contents. + * + * @param contents The new clipboard contents. + * @param owner The new clipboard owner + */ + public synchronized void + setContents(Transferable contents, ClipboardOwner owner) + { + if (this.owner != owner) + if (this.owner != null) + this.owner.lostOwnership(this, contents); + + this.owner = owner; + this.contents = contents; + } + + } // class Clipboard + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/ClipboardOwner.java gcc-3.1/libjava/java/awt/datatransfer/ClipboardOwner.java *** gcc-3.0.4/libjava/java/awt/datatransfer/ClipboardOwner.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/ClipboardOwner.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,60 ---- + /* ClipboardOwner.java -- Interface for clipboard providers + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + /** + * This interface is for classes that will own a clipboard object. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface ClipboardOwner + { + + /** + * This method is called to notify this object that it no longer + * has ownership of the specified Clipboard. + * + * @param clipboard The clipboard for which ownership was lost. + * @param contents The contents of the clipboard which are no longer owned. + */ + public abstract void + lostOwnership(Clipboard clipboard, Transferable contents); + + } // interface ClipboardOwner + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/DataFlavor.java gcc-3.1/libjava/java/awt/datatransfer/DataFlavor.java *** gcc-3.0.4/libjava/java/awt/datatransfer/DataFlavor.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/DataFlavor.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,982 ---- + /* DataFlavor.java -- A type of data to transfer via the clipboard. + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + import java.io.ByteArrayInputStream; + import java.io.InputStream; + import java.io.InputStreamReader; + import java.io.IOException; + import java.io.ObjectOutput; + import java.io.ObjectInput; + import java.io.Reader; + import java.io.StringReader; + import java.io.UnsupportedEncodingException; + + /** + * This class represents a particular data format used for transferring + * data via the clipboard. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class DataFlavor implements java.io.Externalizable, Cloneable + { + + // FIXME: Serialization: Need to write methods for. + + /* + * Static Variables + */ + + /** + * This is the data flavor used for tranferring plain text. The MIME + * type is "text/plain; charset=unicode". The representation class + * is java.io.InputStream. + * + * @deprecated The charset unicode is platform specific and InputStream + * deals with bytes not chars. Use getRederForText(). + */ + public static final DataFlavor plainTextFlavor; + + /** + * This is the data flavor used for transferring Java strings. The + * MIME type is "application/x-java-serialized-object" and the + * representation class is java.lang.String. + */ + public static final DataFlavor stringFlavor; + + /** + * This is a data flavor used for transferring lists of files. The + * representation type is a java.util.List, with each element of + * the list being a java.io.File. + */ + public static final DataFlavor javaFileListFlavor; + + /** + * This is the MIME type used for transferring a serialized object. + * The representation class is the type of object be deserialized. + */ + public static final String javaSerializedObjectMimeType = + "application/x-java-serialized-object"; + + /** + * This is the MIME type used to transfer a Java object reference within + * the same JVM. The representation class is the class of the object + * being transferred. + */ + public static final String javaJVMLocalObjectMimeType = + "application/x-java-jvm-local-object"; + + /** + * This is the MIME type used to transfer a link to a remote object. + * The representation class is the type of object being linked to. + */ + public static final String javaRemoteObjectMimeType = + "application/x-java-remote-object"; + + static + { + plainTextFlavor + = new DataFlavor(java.io.InputStream.class, + "text/plain; charset=unicode", + "plain unicode text"); + + stringFlavor + = new DataFlavor(java.lang.String.class, + "Java Unicode String"); + + javaFileListFlavor + = new DataFlavor(java.util.List.class, + "Java File List"); + + // javaFileListFlavor.mimeType = "application/x-java-file-list"; + } + + /*************************************************************************/ + + /* + * Instance Variables + */ + + // The MIME type for this flavor + private final String mimeType; + + // The representation class for this flavor + private final Class representationClass; + + // The human readable name of this flavor + private String humanPresentableName; + + /*************************************************************************/ + + /* + * Static Methods + */ + + /** + * This method attempts to load the named class. The following class + * loaders are searched in order: the bootstrap class loader, the + * system class loader, the context class loader (if it exists), and + * the specified fallback class loader. + * + * @param className The name of the class to load. + * @param classLoader The class loader to use if all others fail, which + * may be null. + * + * @exception ClassNotFoundException If the class cannot be loaded. + */ + protected static final Class + tryToLoadClass(String className, ClassLoader classLoader) + throws ClassNotFoundException + { + try + { + return(Class.forName(className)); + } + catch(Exception e) { ; } + // Commented out for Java 1.1 + /* + try + { + return(className.getClass().getClassLoader().findClass(className)); + } + catch(Exception e) { ; } + + try + { + return(ClassLoader.getSystemClassLoader().findClass(className)); + } + catch(Exception e) { ; } + */ + + // FIXME: What is the context class loader? + /* + try + { + } + catch(Exception e) { ; } + */ + + if (classLoader != null) + return(classLoader.loadClass(className)); + else + throw new ClassNotFoundException(className); + } + + /*************************************************************************/ + + /* + * Constructors + */ + + /** + * Empty public constructor needed for externalization. + * Should not be used for normal instantiation. + */ + public + DataFlavor() + { + mimeType = null; + representationClass = null; + humanPresentableName = null; + } + + /*************************************************************************/ + + /** + * Private constructor. + */ + private + DataFlavor(Class representationClass, + String mimeType, + String humanPresentableName) + { + this.representationClass = representationClass; + this.mimeType = mimeType; + if (humanPresentableName != null) + this.humanPresentableName = humanPresentableName; + else + this.humanPresentableName = mimeType; + } + + /*************************************************************************/ + + /** + * Initializes a new instance of DataFlavor. The class + * and human readable name are specified, the MIME type will be + * "application/x-java-serialized-object". If the human readable name + * is not specified (null) then the human readable name + * will be the same as the MIME type. + * + * @param representationClass The representation class for this object. + * @param humanPresentableName The display name of the object. + */ + public + DataFlavor(Class representationClass, String humanPresentableName) + { + this(representationClass, + "application/x-java-serialized-object" + + "; class=" + + representationClass.getName(), + humanPresentableName); + } + + /*************************************************************************/ + + /** + * Initializes a new instance of DataFlavor with the + * specified MIME type and description. If the MIME type has a + * "class=" parameter then the representation class will + * be the class name specified. Otherwise the class defaults to + * java.io.InputStream. If the human readable name + * is not specified (null) then the human readable name + * will be the same as the MIME type. + * + * @param mimeType The MIME type for this flavor. + * @param humanPresentableName The display name of this flavor. + * @param classLoader The class loader for finding classes if the default + * class loaders do not work. + * + * @exception IllegalArgumentException If the representation class + * specified cannot be loaded. + */ + public + DataFlavor(String mimeType, String humanPresentableName, + ClassLoader classLoader) throws ClassNotFoundException + { + this(getRepresentationClassFromMime(mimeType, classLoader), + mimeType, humanPresentableName); + } + + private static Class + getRepresentationClassFromMime(String mimeString, ClassLoader classLoader) + { + String classname = getParameter("class", mimeString); + if (classname != null) + { + try + { + return tryToLoadClass(classname, classLoader); + } + catch(Exception e) + { + throw new IllegalArgumentException("classname: " + e.getMessage()); + } + } + else + { + return java.io.InputStream.class; + } + } + + /*************************************************************************/ + + /** + * Initializes a new instance of DataFlavor with the + * specified MIME type and description. If the MIME type has a + * "class=" parameter then the representation class will + * be the class name specified. Otherwise the class defaults to + * java.io.InputStream. If the human readable name + * is not specified (null) then the human readable name + * will be the same as the MIME type. This is the same as calling + * new DataFlavor(mimeType, humanPresentableName, null). + * + * @param mimeType The MIME type for this flavor. + * @param humanPresentableName The display name of this flavor. + * @param classLoader The class loader for finding classes. + * + * @exception IllegalArgumentException If the representation class + * specified cannot be loaded. + */ + public + DataFlavor(String mimeType, String humanPresentableName) + throws ClassNotFoundException + { + this(mimeType, humanPresentableName, null); + } + + /*************************************************************************/ + + /** + * Initializes a new instance of DataFlavor with the specified + * MIME type. This type can have a "class=" parameter to specify the + * representation class, and then the class must exist or an exception will + * be thrown. If there is no "class=" parameter then the representation class + * will be java.io.InputStream. This is the same as calling + * new DataFlavor(mimeType, null). + * + * @param mimeType The MIME type for this flavor. + * + * @exception IllegalArgumentException If a class is not specified in + * the MIME type. + * @exception ClassNotFoundException If the class cannot be loaded. + */ + public + DataFlavor(String mimeType) throws ClassNotFoundException + { + this(mimeType, null); + } + + /*************************************************************************/ + + /** + * Returns the MIME type of this flavor. + * + * @return The MIME type for this flavor. + */ + public String + getMimeType() + { + return(mimeType); + } + + /*************************************************************************/ + + /** + * Returns the representation class for this flavor. + * + * @return The representation class for this flavor. + */ + public Class + getRepresentationClass() + { + return(representationClass); + } + + /*************************************************************************/ + + /** + * Returns the human presentable name for this flavor. + * + * @return The human presentable name for this flavor. + */ + public String + getHumanPresentableName() + { + return(humanPresentableName); + } + + /*************************************************************************/ + + /** + * Returns the primary MIME type for this flavor. + * + * @return The primary MIME type for this flavor. + */ + public String + getPrimaryType() + { + int idx = mimeType.indexOf("/"); + if (idx == -1) + return(mimeType); + + return(mimeType.substring(0, idx)); + } + + /*************************************************************************/ + + /** + * Returns the MIME subtype for this flavor. + * + * @return The MIME subtype for this flavor. + */ + public String + getSubType() + { + int idx = mimeType.indexOf("/"); + if (idx == -1) + return(""); + + String subtype = mimeType.substring(idx + 1); + + idx = subtype.indexOf(" "); + if (idx == -1) + return(subtype); + else + return(subtype.substring(0, idx)); + } + + /*************************************************************************/ + + /** + * Returns the value of the named MIME type parameter, or null + * if the parameter does not exist. Given the parameter name and the mime + * string. + * + * @param paramName The name of the parameter. + * @param mimeString The mime string from where the name should be found. + * + * @return The value of the parameter or null. + */ + private static String + getParameter(String paramName, String mimeString) + { + int idx = mimeString.indexOf(paramName + "="); + if (idx == -1) + return(null); + + String value = mimeString.substring(idx + paramName.length() + 2); + + idx = value.indexOf(" "); + if (idx == -1) + return(value); + else + return(value.substring(0, idx)); + } + + /*************************************************************************/ + /** + * Returns the value of the named MIME type parameter, or null + * if the parameter does not exist. + * + * @param paramName The name of the paramter. + * + * @return The value of the parameter. + */ + public String + getParameter(String paramName) + { + return getParameter(paramName, mimeType); + } + + /*************************************************************************/ + + /** + * Sets the human presentable name to the specified value. + * + * @param humanPresentableName The new display name. + */ + public void + setHumanPresentableName(String humanPresentableName) + { + this.humanPresentableName = humanPresentableName; + } + + /*************************************************************************/ + + /** + * Tests the MIME type of this object for equality against the specified + * MIME type. + * + * @param mimeType The MIME type to test against. + * + * @return true if the MIME type is equal to this object's + * MIME type, false otherwise. + */ + public boolean + isMimeTypeEqual(String mimeType) + { + // FIXME: Need to handle default attributes and parameters + + return(this.mimeType.equals(mimeType)); + } + + /*************************************************************************/ + + /** + * Tests the MIME type of this object for equality against the specified + * data flavor's MIME type + * + * @param flavor The flavor to test against. + * + * @return true if the flavor's MIME type is equal to this + * object's MIME type, false otherwise. + */ + public boolean + isMimeTypeEqual(DataFlavor flavor) + { + return(isMimeTypeEqual(flavor.getMimeType())); + } + + /*************************************************************************/ + + /** + * Tests whether or not this flavor represents a serialized object. + * + * @return true if this flavor represents a serialized + * object, false otherwise. + */ + public boolean + isMimeTypeSerializedObject() + { + return(mimeType.startsWith(javaSerializedObjectMimeType)); + } + + /*************************************************************************/ + + /** + * Tests whether or not this flavor has a representation class of + * java.io.InputStream. + * + * @param true if the representation class of this flavor + * is java.io.InputStream, false otherwise. + */ + public boolean + isRepresentationClassInputStream() + { + return(representationClass.getName().equals("java.io.InputStream")); + } + + /*************************************************************************/ + + /** + * Tests whether the representation class for this flavor is + * serializable. + * + * @param true if the representation class is serializable, + * false otherwise. + */ + public boolean + isRepresentationClassSerializable() + { + Class[] interfaces = representationClass.getInterfaces(); + + int i = 0; + while (i < interfaces.length) + { + if (interfaces[i].getName().equals("java.io.Serializable")) + return(true); + ++i; + } + + return(false); + } + + /*************************************************************************/ + + /** + * Tests whether the representation class for his flavor is remote. + * + * @return true if the representation class is remote, + * false otherwise. + */ + public boolean + isRepresentationClassRemote() + { + // FIXME: Implement + throw new RuntimeException("Not implemented"); + } + + /*************************************************************************/ + + /** + * Tests whether or not this flavor represents a serialized object. + * + * @return true if this flavor represents a serialized + * object, false otherwise. + */ + public boolean + isFlavorSerializedObjectType() + { + // FIXME: What is the diff between this and isMimeTypeSerializedObject? + return(mimeType.startsWith(javaSerializedObjectMimeType)); + } + + /*************************************************************************/ + + /** + * Tests whether or not this flavor represents a remote object. + * + * @return true if this flavor represents a remote object, + * false otherwise. + */ + public boolean + isFlavorRemoteObjectType() + { + return(mimeType.startsWith(javaRemoteObjectMimeType)); + } + + /*************************************************************************/ + + /** + * Tests whether or not this flavor represents a list of files. + * + * @return true if this flavor represents a list of files, + * false otherwise. + */ + public boolean + isFlavorJavaFileListType() + { + if (this.mimeType.equals(javaFileListFlavor.mimeType) && + this.representationClass.equals(javaFileListFlavor.representationClass)) + return(true); + + return(false); + } + + /*************************************************************************/ + + /** + * Returns a copy of this object. + * + * @return A copy of this object. + */ + public Object + clone() + { + try + { + return(super.clone()); + } + catch(Exception e) + { + return(null); + } + } + + /*************************************************************************/ + + /** + * This method test the specified DataFlavor for equality + * against this object. This will be true if the MIME type and + * representation type are the equal. + * + * @param flavor The DataFlavor to test against. + * + * @return true if the flavor is equal to this object, + * false otherwise. + */ + public boolean + equals(DataFlavor flavor) + { + if (flavor == null) + return(false); + + if (!this.mimeType.toLowerCase().equals(flavor.mimeType.toLowerCase())) + return(false); + + if (!this.representationClass.equals(flavor.representationClass)) + return(false); + + return(true); + } + + /*************************************************************************/ + + /** + * This method test the specified Object for equality + * against this object. This will be true if the following conditions + * are met: + *

    + *

      + *
    • The object is not null. + *
    • The object is an instance of DataFlavor. + *
    • The object's MIME type and representation class are equal to + * this object's. + *
    + * + * @param obj The Object to test against. + * + * @return true if the flavor is equal to this object, + * false otherwise. + */ + public boolean + equals(Object obj) + { + if (obj == null) + return(false); + + if (!(obj instanceof DataFlavor)) + return(false); + + return(equals((DataFlavor)obj)); + } + + /*************************************************************************/ + + /** + * Tests whether or not the specified string is equal to the MIME type + * of this object. + * + * @param str The string to test against. + * + * @return true if the string is equal to this object's MIME + * type, false otherwise. + * + * @deprecated Not compatible with hashCode(). + * Use isMimeTypeEqual() + */ + public boolean + equals(String str) + { + return(isMimeTypeEqual(str)); + } + + /*************************************************************************/ + + /** + * Returns the hash code for this data flavor. + * The hash code is based on the (lower case) mime type and the + * representation class. + */ + public int + hashCode() + { + return(mimeType.toLowerCase().hashCode()^representationClass.hashCode()); + } + + /*************************************************************************/ + + /** + * Returns true when the given DataFlavor + * matches this one. + */ + public boolean + match(DataFlavor dataFlavor) + { + // XXX - How is this different from equals? + return(equals(dataFlavor)); + } + + /*************************************************************************/ + + /** + * This method exists for backward compatibility. It simply returns + * the same name/value pair passed in. + * + * @param name The parameter name. + * @param value The parameter value. + * + * @return The name/value pair. + * + * @deprecated + */ + protected String + normalizeMimeTypeParameter(String name, String value) + { + return(name + "=" + value); + } + + /*************************************************************************/ + + /** + * This method exists for backward compatibility. It simply returns + * the MIME type string unchanged. + * + * @param type The MIME type. + * + * @return The MIME type. + * + * @deprecated + */ + protected String + normalizeMimeType(String type) + { + return(type); + } + + /*************************************************************************/ + + /** + * Serialize this class. + * + * @param stream The ObjectOutput stream to serialize to. + */ + public void + writeExternal(ObjectOutput stream) throws IOException + { + // FIXME: Implement me + } + + /*************************************************************************/ + + /** + * De-serialize this class. + * + * @param stream The ObjectInput stream to deserialize from. + */ + public void + readExternal(ObjectInput stream) throws IOException, ClassNotFoundException + { + // FIXME: Implement me + } + + /*************************************************************************/ + + /** + * Returns a string representation of this DataFlavor. Including the + * representation class name, MIME type and human presentable name. + */ + public String + toString() + { + return("DataFlavor[representationClass=" + + representationClass.getName() + + ",mimeType=" + + mimeType + + "humanPresentableName=" + + humanPresentableName); + } + + /*************************************************************************/ + + /** + * XXX - Currently returns plainTextFlavor. + */ + public static final DataFlavor + getTextPlainUnicodeFlavor() + { + return(plainTextFlavor); + } + + /*************************************************************************/ + + /** + * XXX - Currently returns java.io.InputStream. + * + * @since 1.3 + */ + public static final Class + getDefaultRepresentationClass() + { + return(java.io.InputStream.class); + } + /*************************************************************************/ + + /** + * XXX - Currently returns java.io.InputStream. + */ + public static final String + getDefaultRepresentationClassAsString() + { + return(getDefaultRepresentationClass().getName()); + } + + /*************************************************************************/ + + /** + * Selects the best supported text flavor on this implementation. + * Returns null when none of the given flavors is liked. + * + * The DataFlavor returned the first data flavor in the + * array that has either a representation class which is (a subclass of) + * Reader or String, or has a representation + * class which is (a subclass of) InputStream and has a + * primary MIME type of "text" and has an supported encoding. + */ + public static final DataFlavor + selectBestTextFlavor(DataFlavor[] availableFlavors) + { + for(int i=0; iReader for a given Transferable. + * + * If the representation class is a (subclass of) Reader + * then an instance of the representation class is returned. If the + * representatation class is a String then a + * StringReader is returned. And if the representation class + * is a (subclass of) InputStream and the primary MIME type + * is "text" then a InputStreamReader for the correct charset + * encoding is returned. + * + * @param transferable The Transferable for which a text + * Reader is requested. + * @exception UnsupportedFlavorException when the transferable doesn't + * support this DataFlavor. Or if the representable class + * isn't a (subclass of) Reader, String, + * InputStream and/or the primary MIME type isn't "text". + * @exception IOException when any IOException occurs. + * @exception UnsupportedEncodingException if the "charset" isn't supported + * on this platform. + */ + public Reader + getReaderForText(Transferable transferable) throws UnsupportedFlavorException, + IOException, + UnsupportedEncodingException + { + if (!transferable.isDataFlavorSupported(this)) + throw new UnsupportedFlavorException(this); + + if (Reader.class.isAssignableFrom(representationClass)) + return((Reader)transferable.getTransferData(this)); + + if (String.class.isAssignableFrom(representationClass)) + return(new StringReader((String)transferable.getTransferData(this))); + + if (InputStream.class.isAssignableFrom(representationClass) + && "text".equals(getPrimaryType())) + { + InputStream in = (InputStream)transferable.getTransferData(this); + String encoding = getParameter("charset"); + if (encoding == null) + encoding = "us-ascii"; + return(new InputStreamReader(in, encoding)); + } + + throw new UnsupportedFlavorException(this); + } + + } // class DataFlavor + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/FlavorMap.java gcc-3.1/libjava/java/awt/datatransfer/FlavorMap.java *** gcc-3.0.4/libjava/java/awt/datatransfer/FlavorMap.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/FlavorMap.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,82 ---- + /* FlavorMap.java -- Maps between flavor names and MIME types. + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + import java.util.Map; + + /** + * This interface maps between native platform type names and DataFlavors. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface FlavorMap + { + + /** + * Maps the specified DataFlavor objects to the native + * data type name. The returned Map has keys that are + * the data flavors and values that are strings. The returned map + * may be modified. This can be useful for implementing nested mappings. + * + * @param flavors An array of data flavors to map + * or null for all data flavors. + * + * @return A Map of native data types. + */ + public abstract Map + getNativesForFlavors(DataFlavor[] flavors); + + /*************************************************************************/ + + /** + * Maps the specified native type names to DataFlavor's. + * The returned Map has keys that are strings and values + * that are DataFlavor's. The returned map may be + * modified. This can be useful for implementing nested mappings. + * + * @param natives An array of native types to map + * or null for all native types. + * + * @return A Map of data flavors. + */ + public abstract Map + getFlavorsForNatives(String[] natives); + + } // interface FlavorMap + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/MimeTypeParseException.java gcc-3.1/libjava/java/awt/datatransfer/MimeTypeParseException.java *** gcc-3.0.4/libjava/java/awt/datatransfer/MimeTypeParseException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/MimeTypeParseException.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,70 ---- + /* MimeTypeParseException.java -- Thrown when MIME string couldn't be parsed. + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + /** + * MIME string couldn't be parsed correctly. + * + * @author Mark Wielaard (mark@klomp.org) + */ + public class MimeTypeParseException extends Exception + { + + /** + * Initializes a new instance of MimeTypeParseException + * without any message. + */ + public + MimeTypeParseException() + { + super(); + } + + /** + * Initializes a new instance of MimeTypeParseException + * with a specified detailed error message. + */ + public + MimeTypeParseException(String message) + { + super(message); + } + + } // class MimeTypeParseException + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/StringSelection.java gcc-3.1/libjava/java/awt/datatransfer/StringSelection.java *** gcc-3.0.4/libjava/java/awt/datatransfer/StringSelection.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/StringSelection.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,159 ---- + /* StringSelection.java -- Clipboard handler for text. + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + import java.io.StringBufferInputStream; + import java.io.IOException; + + /** + * This class transfers a string as plain text using the clipboard. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class StringSelection implements Transferable, ClipboardOwner + { + + /* + * Class Variables + */ + + // List of flavors we support + public static final DataFlavor[] supported_flavors + = { DataFlavor.plainTextFlavor }; + + /*************************************************************************/ + + /* + * Instance Variables + */ + + // This is the data to transfer + private String data; + + /*************************************************************************/ + + /* + * Constructors + */ + + /** + * Transfer the specfied string as text. + */ + public + StringSelection(String data) + { + this.data = data; + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * Returns a list of supported data flavors. + * + * @return A list of supported data flavors. + */ + public DataFlavor[] + getTransferDataFlavors() + { + return(supported_flavors); + } + + /*************************************************************************/ + + /** + * Tests whether or not the specified data flavor is supported. + * + * @param flavor The data flavor to test. + * + * @return true if the data flavor is supported, + * false otherwise. + */ + public boolean + isDataFlavorSupported(DataFlavor flavor) + { + for (int i = 0; i < supported_flavors.length; i++) + if (supported_flavors[i].equals(flavor)) + return(true); + + return(false); + } + + /*************************************************************************/ + + /** + * This method returns the data in the requested format. + * + * @param flavor The desired data flavor. + * + * @return The transferred data. + * + * @exception UnsupportedFlavorException If the specified flavor is not + * supported. + * @exception IOException If any other error occurs. + */ + public Object + getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, + IOException + { + if (!isDataFlavorSupported(flavor)) + throw new UnsupportedFlavorException(flavor); + + return(new StringBufferInputStream(data)); + } + + /*************************************************************************/ + + /** + * Called when ownership of the clipboard object is lost. + * + * @param clipboard The affected clipboard. + * @param contents The clipboard contents. + */ + public void + lostOwnership(Clipboard clipboard, Transferable contents) + { + // FIXME: What does this do? + } + + } // class StringSelection + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/SystemFlavorMap.java gcc-3.1/libjava/java/awt/datatransfer/SystemFlavorMap.java *** gcc-3.0.4/libjava/java/awt/datatransfer/SystemFlavorMap.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/SystemFlavorMap.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,180 ---- + /* SystemFlavorMap.java -- Maps between native flavor names and MIME types. + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + import java.util.HashMap; + import java.util.Map; + + /** + * This class maps between native platform type names and DataFlavors. + * + * XXX - The current implementation does no mapping at all. + * + * @author Mark Wielaard (mark@klomp.org) + */ + public final class SystemFlavorMap implements FlavorMap + { + + /** + * The default (instance) flavor map. + */ + private static FlavorMap defaultFlavorMap; + + /** + * Private constructor. + */ + private SystemFlavorMap() + { + } + + /*************************************************************************/ + + /** + * Maps the specified DataFlavor objects to the native + * data type name. The returned Map has keys that are + * the data flavors and values that are strings. The returned map + * may be modified. This can be useful for implementing nested mappings. + * + * @param flavors An array of data flavors to map + * or null for all data flavors. + * + * @return A Map of native data types to data flavors. + */ + public Map + getNativesForFlavors(DataFlavor[] flavors) + { + return(new HashMap()); + } + + /*************************************************************************/ + + /** + * Maps the specified native type names to DataFlavor's. + * The returned Map has keys that are strings and values + * that are DataFlavor's. The returned map may be + * modified. This can be useful for implementing nested mappings. + * + * @param natives An array of native types to map + * or null for all native types. + * + * @return A Map of data flavors to native type names. + */ + public Map + getFlavorsForNatives(String[] natives) + { + return(new HashMap()); + } + + /*************************************************************************/ + + /** + * Returns the default (instance) (System)FlavorMap. + */ + public static FlavorMap + getDefaultFlavorMap() + { + if (defaultFlavorMap == null) + defaultFlavorMap = new SystemFlavorMap(); + + return(defaultFlavorMap); + } + + /*************************************************************************/ + + /** + * Returns the native type name for the given java mime type. + */ + public static String + encodeJavaMIMEType(String mime) + { + return null; + } + + /*************************************************************************/ + + /** + * Returns the native type name for the given data flavor. + */ + public static String + encodeDataFlavor(DataFlavor df) + { + return null; + } + + /*************************************************************************/ + + /** + * Returns true if the native type name can be represented as + * a java mime type. + */ + public static boolean + isJavaMIMEType(String name) + { + return(false); + } + + /*************************************************************************/ + + /** + * Returns the java mime type for the given the native type name. + */ + public static String + decodeJavaMIMEType(String name) + { + return null; + } + + /*************************************************************************/ + + /** + * Returns the data flavor given the native type name + * or null when no such data flavor exists. + */ + public static DataFlavor + decodeDataFlavor(String name) throws ClassNotFoundException + { + String javaMIMEType = decodeJavaMIMEType(name); + if (javaMIMEType != null) + return(new DataFlavor(javaMIMEType)); + else + return(null); + } + + } // class SystemFlavorMap + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/Transferable.java gcc-3.1/libjava/java/awt/datatransfer/Transferable.java *** gcc-3.0.4/libjava/java/awt/datatransfer/Transferable.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/Transferable.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,92 ---- + /* Transferable.java -- Data transfer source + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + import java.io.IOException; + + /** + * This interface is implemented by classes that can transfer data. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface Transferable + { + + /** + * Returns the data in the specified DataFlavor + * + * @param flavor The data flavor to return. + * + * @return The data in the appropriate flavor. + * + * @exception UnsupportedFlavorException If the flavor is not supported. + * @exception IOException If the data is not available. + */ + public abstract Object + getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, + IOException; + + /*************************************************************************/ + + /** + * This method returns a list of available data flavors for the + * data being transferred. The array returned will be sorted from most + * preferred flavor at the beginning to least preferred at the end. + * + * @return A list of data flavors for this data. + */ + public abstract DataFlavor[] + getTransferDataFlavors(); + + /*************************************************************************/ + + /** + * Tests whether or not this data can be delivered in the specified + * data flavor. + * + * @param flavor The data flavor to test. + * + * @return true if the data flavor is supported, + * false otherwise. + */ + public abstract boolean + isDataFlavorSupported(DataFlavor flavor); + + } // interface Transferable + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/datatransfer/UnsupportedFlavorException.java gcc-3.1/libjava/java/awt/datatransfer/UnsupportedFlavorException.java *** gcc-3.0.4/libjava/java/awt/datatransfer/UnsupportedFlavorException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/datatransfer/UnsupportedFlavorException.java Thu Jan 24 06:31:02 2002 *************** *** 0 **** --- 1,62 ---- + /* UnsupportedFlavorException.java -- Data flavor is not valid. + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.datatransfer; + + /** + * The data flavor requested is not supported for the transfer data. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class UnsupportedFlavorException extends Exception + { + + /** + * Initializes a new instance of UnsupportedDataFlavor + * for the specified data flavor. + * + * @param flavor The data flavor that is not supported. + */ + public + UnsupportedFlavorException(DataFlavor flavor) + { + super(flavor.getHumanPresentableName()); + } + + } // class UnsupportedFlavorException + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/event/ContainerEvent.java gcc-3.1/libjava/java/awt/event/ContainerEvent.java *** gcc-3.0.4/libjava/java/awt/event/ContainerEvent.java Tue Dec 26 00:25:12 2000 --- gcc-3.1/libjava/java/awt/event/ContainerEvent.java Sun Apr 22 03:05:38 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libjava. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libjava. *************** public class ContainerEvent extends Comp *** 35,43 **** return child; } ! public Component getContainer () { ! return (Component) source; } public String paramString () --- 35,43 ---- return child; } ! public Container getContainer () { ! return (Container) source; } public String paramString () diff -Nrc3pad gcc-3.0.4/libjava/java/awt/event/HierarchyBoundsAdapter.java gcc-3.1/libjava/java/awt/event/HierarchyBoundsAdapter.java *** gcc-3.0.4/libjava/java/awt/event/HierarchyBoundsAdapter.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/event/HierarchyBoundsAdapter.java Tue Jan 22 22:40:07 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.event; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.event; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/event/HierarchyBoundsListener.java gcc-3.1/libjava/java/awt/event/HierarchyBoundsListener.java *** gcc-3.0.4/libjava/java/awt/event/HierarchyBoundsListener.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/event/HierarchyBoundsListener.java Tue Jan 22 22:40:07 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.event; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.event; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/event/HierarchyEvent.java gcc-3.1/libjava/java/awt/event/HierarchyEvent.java *** gcc-3.0.4/libjava/java/awt/event/HierarchyEvent.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/event/HierarchyEvent.java Tue Jan 22 22:40:07 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.event; import java.awt.*; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.event; import java.awt.*; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/event/HierarchyListener.java gcc-3.1/libjava/java/awt/event/HierarchyListener.java *** gcc-3.0.4/libjava/java/awt/event/HierarchyListener.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/event/HierarchyListener.java Tue Jan 22 22:40:07 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.event; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.event; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/event/InputEvent.java gcc-3.1/libjava/java/awt/event/InputEvent.java *** gcc-3.0.4/libjava/java/awt/event/InputEvent.java Tue Dec 26 00:25:13 2000 --- gcc-3.1/libjava/java/awt/event/InputEvent.java Mon Jan 28 06:34:00 2002 *************** *** 1,4 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libjava. --- 1,4 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation This file is part of libjava. *************** public abstract class InputEvent extends *** 73,78 **** consumed = true; } ! private long when; ! private int modifiers; } --- 73,78 ---- consumed = true; } ! long when; ! int modifiers; } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/event/MouseEvent.java gcc-3.1/libjava/java/awt/event/MouseEvent.java *** gcc-3.0.4/libjava/java/awt/event/MouseEvent.java Wed Jul 12 03:32:06 2000 --- gcc-3.1/libjava/java/awt/event/MouseEvent.java Mon Jan 28 06:34:01 2002 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libjava. --- 1,4 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation This file is part of libjava. *************** public class MouseEvent extends InputEve *** 106,113 **** this.y += y; } - private long when; - private int modifiers; private int x; private int y; private int clickCount; --- 106,111 ---- diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/AffineTransform.java gcc-3.1/libjava/java/awt/geom/AffineTransform.java *** gcc-3.0.4/libjava/java/awt/geom/AffineTransform.java Mon Dec 4 02:27:20 2000 --- gcc-3.1/libjava/java/awt/geom/AffineTransform.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; import java.awt.*; --- 1,38 ---- ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; import java.awt.*; *************** public class AffineTransform implements *** 51,57 **** this.m11 = m11; this.m02 = m02; this.m12 = m12; ! this.type = 0; // fixme; } public AffineTransform (float[] flatmatrix) --- 79,85 ---- this.m11 = m11; this.m02 = m02; this.m12 = m12; ! this.type = TYPE_GENERAL_TRANSFORM; } public AffineTransform (float[] flatmatrix) *************** public class AffineTransform implements *** 260,265 **** --- 288,307 ---- type = TYPE_GENERAL_ROTATION; } + public void setToRotation (double theta, double x, double y) + { + double c = Math.cos (theta); + double s = Math.sin (theta); + + m00 = c; + m01 = -s; + m02 = x - x * c + y * s; + m10 = s; + m11 = c; + m12 = y - x * s - y * c; + type = TYPE_GENERAL_TRANSFORM; + } + public void setToScale (double sx, double sy) { m00 = sx; *************** public class AffineTransform implements *** 274,280 **** m01 = shx; m10 = shy; m02 = m12 = 0; ! type = 0; // FIXME } public void setTransform (AffineTransform tx) --- 316,322 ---- m01 = shx; m10 = shy; m02 = m12 = 0; ! type = TYPE_GENERAL_TRANSFORM; } public void setTransform (AffineTransform tx) diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/Dimension2D.java gcc-3.1/libjava/java/awt/geom/Dimension2D.java *** gcc-3.0.4/libjava/java/awt/geom/Dimension2D.java Mon Dec 4 02:27:21 2000 --- gcc-3.1/libjava/java/awt/geom/Dimension2D.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/Ellipse2D.java gcc-3.1/libjava/java/awt/geom/Ellipse2D.java *** gcc-3.0.4/libjava/java/awt/geom/Ellipse2D.java Sun Jul 23 00:24:14 2000 --- gcc-3.1/libjava/java/awt/geom/Ellipse2D.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/IllegalPathStateException.java gcc-3.1/libjava/java/awt/geom/IllegalPathStateException.java *** gcc-3.0.4/libjava/java/awt/geom/IllegalPathStateException.java Sun Jul 23 00:24:14 2000 --- gcc-3.1/libjava/java/awt/geom/IllegalPathStateException.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/Line2D.java gcc-3.1/libjava/java/awt/geom/Line2D.java *** gcc-3.0.4/libjava/java/awt/geom/Line2D.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/geom/Line2D.java Tue Jan 22 22:40:09 2002 *************** *** 0 **** --- 1,573 ---- + /* Copyright (C) 2000, 2001, 2002 Free Software Foundation + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.awt.geom; + + import java.awt.Rectangle; + import java.awt.Shape; + + /** + * @author Tom Tromey + * @date April 21, 2001 + */ + + public abstract class Line2D implements Shape, Cloneable + { + protected Line2D () + { + } + + public Object clone () + { + try + { + return super.clone (); + } + catch (CloneNotSupportedException _) + { + // Can't happen. + return null; + } + } + + public boolean contains (double x, double y) + { + double x1 = getX1 (); + double t1 = (x - x1) / (getX2 () - x1); + if (t1 < 0 || t1 > 1) + return false; + double y1 = getY1 (); + double t2 = (y - y1) / (getY2 () - y1); + // FIXME: use of == here is bogus + return t2 >= 0 && t2 <= 1 && t1 == t2; + } + + public boolean contains (double x, double y, double w, double h) + { + return false; + } + + public boolean contains (Point2D p) + { + return contains (p.getX (), p.getY ()); + } + + public boolean contains (Rectangle2D r) + { + return false; + } + + public Rectangle getBounds () + { + double x1 = getX1 (); + double y1 = getY1 (); + double x2 = getX2 (); + double y2 = getY2 (); + + double x = Math.min (x1, x2); + double y = Math.min (y1, y2); + double w = Math.abs (x1 - x2); + double h = Math.abs (y1 - y2); + + return new Rectangle ((int) x, (int) y, (int) w, (int) h); + } + + public abstract Point2D getP1 (); + public abstract Point2D getP2 (); + + public PathIterator getPathIterator (AffineTransform at) + { + return getPathIterator (at, 0); + } + + public PathIterator getPathIterator (AffineTransform at, double flatness) + { + return at.new Iterator (new Iterator ()); + } + + public abstract double getX1 (); + public abstract double getY1 (); + public abstract double getX2 (); + public abstract double getY2 (); + + public boolean intersects (double x, double y, double w, double h) + { + double x1 = getX1 (); + double y1 = getY1 (); + double x2 = getX2 (); + double y2 = getY2 (); + + if (x1 >= x && x1 <= x + w && y1 >= y && y1 <= y +h) + return true; + if (x2 >= x && x2 <= x + w && y2 >= y && y2 <= y +h) + return true; + + double x3 = x + w; + double y3 = y + h; + + return (linesIntersect (x1, y1, x2, y2, x, y, x, y3) + || linesIntersect (x1, y1, x2, y2, x, y3, x3, y3) + || linesIntersect (x1, y1, x2, y2, x3, y3, x3, y) + || linesIntersect (x1, y1, x2, y2, x3, y, x, y)); + } + + public boolean intersects (Rectangle2D r) + { + return intersects (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); + } + + public boolean intersectsLine (double x1, double y1, double x2, double y2) + { + return linesIntersect (getX1 (), getY1 (), getX2 (), getY2(), + x1, y1, x2, y2); + } + + public boolean intersectsLine (Line2D l) + { + return linesIntersect (getX1 (), getY1 (), getX2 (), getY2(), + l.getX1 (), l.getY1 (), l.getX2 (), l.getY2 ()); + } + + public static boolean linesIntersect (double x1, double y1, + double x2, double y2, + double x3,double y3, + double x4, double y4) + { + double beta = (((y1 - y3) * (x4 - x3) + (x1 - x3) * (y4 - y3)) + / ((y2 - y1) * (x4 - x3) + (x2 - x1) * (y4 - y3))); + if (beta < 0.0 || beta > 1.0) + return false; + double alpha = (x1 + beta * (x2 - x1) - x3) / (x4 - x3); + return alpha >= 0.0 && alpha <= 1.0; + } + + public double ptLineDist (double px, double py) + { + return ptLineDist (getX1 (), getY1 (), getX2 (), getY2 (), + px, py); + } + + public static double ptLineDist (double x1, double y1, + double x2, double y2, + double px, double py) + { + return Math.sqrt (ptLineDistSq (x1, y1, x2, y2, px, py)); + } + + public double ptLineDist (Point2D p) + { + return ptLineDist (getX1 (), getY1 (), getX2 (), getY2 (), + p.getX (), p.getY ()); + } + + public double ptLineDistSq (double px, double py) + { + return ptLineDistSq (getX1 (), getY1 (), getX2 (), getY2 (), + px, py); + } + + public static double ptLineDistSq (double x1, double y1, + double x2, double y2, + double px, double py) + { + double pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); + + double x, y; + if (pd2 == 0) + { + // Points are coincident. + x = x1; + y = y2; + } + else + { + double u = ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / pd2; + x = x1 + u * (x2 - x1); + y = y1 + u * (y2 - y1); + } + + return (x - px) * (x - px) + (y - py) * (y - py); + } + + public double ptLineDistSq (Point2D p) + { + return ptLineDistSq (getX1 (), getY1 (), getX2 (), getY2 (), + p.getX (), p.getY ()); + } + + public double ptSegDist (double px, double py) + { + return ptSegDist (getX1 (), getY1 (), getX2 (), getY2 (), + px, py); + } + + public static double ptSegDist (double x1, double y1, + double x2, double y2, + double px, double py) + { + return Math.sqrt (ptSegDistSq (x1, y1, x2, y2, px, py)); + } + + public double ptSegDist (Point2D p) + { + return ptSegDist (getX1 (), getY1 (), getX2 (), getY2 (), + p.getX (), p.getY ()); + } + + public double ptSegDistSq (double px, double py) + { + return ptSegDistSq (getX1 (), getY1 (), getX2 (), getY2 (), + px, py); + } + + public static double ptSegDistSq (double x1, double y1, + double x2, double y2, + double px, double py) + { + double pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); + + double x, y; + if (pd2 == 0) + { + // Points are coincident. + x = x1; + y = y2; + } + else + { + double u = ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / pd2; + + if (u < 0) + { + // "Off the end" + x = x1; + y = y1; + } + else if (u > 1.0) + { + x = x2; + y = y2; + } + else + { + x = x1 + u * (x2 - x1); + y = y1 + u * (y2 - y1); + } + } + + return (x - px) * (x - px) + (y - py) * (y - py); + } + + public double ptSegDistSq (Point2D p) + { + return ptSegDistSq (getX1 (), getY1 (), getX2 (), getY2 (), + p.getX (), p.getY ()); + } + + public int relativeCCW (double px, double py) + { + return relativeCCW (getX1 (), getY1 (), + getX2 (), getY2 (), + px, py); + } + + public static int relativeCCW (double x1, double y1, + double x2, double y2, + double px, double py) + { + // This is a somewhat silly way to compute this. + // Please write a better one. + double a1 = Math.atan2 (y2 - y1, x2 - x1); + double a2 = Math.atan2 (py - y1, px - x1); + + double a = (a1 - a2) % (2 * Math.PI); + if (a == 0 || a == Math.PI) + { + double u = ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)); + if (u < 0.0) + return 1; + else if (u > 1.0) + return -1; + else + return 0; + } + + return (a > 0 && a < Math.PI) ? 1 : -1; + } + + public int relativeCCW (Point2D p) + { + return relativeCCW (getX1 (), getY1 (), + getX2 (), getY2 (), + p.getX (), p.getY ()); + } + + public abstract void setLine (double x1, double y1, double x2, double y2); + + public void setLine (Line2D l) + { + setLine (l.getX1 (), l.getY1 (), l.getX2 (), l.getY2 ()); + } + + public void setLine (Point2D p1, Point2D p2) + { + setLine (p1.getX (), p1.getY (), p2.getX (), p2.getY ()); + } + + public static class Float extends Line2D + { + float x1, y1, x2, y2; + + public Float () + { + this (0.0F, 0.0F, 0.0F, 0.0F); + } + + public Float (float x1, float y1, float x2, float y2) + { + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + } + + public Float (Point2D p1, Point2D p2) + { + this.x1 = (float) p1.getX (); + this.y1 = (float) p1.getY (); + this.x2 = (float) p2.getX (); + this.y2 = (float) p2.getY (); + } + + public Rectangle2D getBounds2D () + { + float x = Math.min (x1, x2); + float w = Math.abs (x1 - x2); + float y = Math.min (y1, y2); + float h = Math.abs (y1 - y2); + return new Rectangle2D.Float (x, y, w, h); + } + + public Point2D getP1 () + { + return new Point2D.Float (x1, y1); + } + + public Point2D getP2 () + { + return new Point2D.Float (x2, y2); + } + + public double getX1 () + { + return x1; + } + + public double getY1 () + { + return y1; + } + + public double getX2 () + { + return x2; + } + + public double getY2 () + { + return y2; + } + + public void setLine (double x1, double y1, double x2, double y2) + { + this.x1 = (float) x1; + this.y1 = (float) y1; + this.x2 = (float) x2; + this.y2 = (float) y2; + } + + public void setLine (float x1, float y1, float x2, float y2) + { + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + } + } + + public static class Double extends Line2D + { + double x1, y1, x2, y2; + + public Double () + { + this (0.0, 0.0, 0.0, 0.0); + } + + public Double (double x1, double y1, double x2, double y2) + { + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + } + + public Double (Point2D p1, Point2D p2) + { + this.x1 = (double) p1.getX (); + this.y1 = p1.getY (); + this.x2 = p2.getX (); + this.y2 = p2.getY (); + } + + public Rectangle2D getBounds2D () + { + double x = Math.min (x1, x2); + double w = Math.abs (x1 - x2); + double y = Math.min (y1, y2); + double h = Math.abs (y1 - y2); + return new Rectangle2D.Double (x, y, w, h); + } + + public Point2D getP1 () + { + return new Point2D.Double (x1, y1); + } + + public Point2D getP2 () + { + return new Point2D.Double (x2, y2); + } + + public double getX1 () + { + return x1; + } + + public double getY1 () + { + return y1; + } + + public double getX2 () + { + return x2; + } + + public double getY2 () + { + return y2; + } + + public void setLine (double x1, double y1, double x2, double y2) + { + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + } + } + + // This implements the PathIterator for all line objects that don't + // override getPathIterator. + private class Iterator implements PathIterator + { + // Current coordinate. + private int coord; + + private static final int START = 0; + private static final int END_PLUS_ONE = 2; + + public Iterator () + { + coord = START; + } + + public int currentSegment (double[] coords) + { + int r = SEG_MOVETO; + if (coord == 0) + { + coords[0] = getX1 (); + coords[1] = getY1 (); + } + else if (coord == 1) + { + coords[0] = getX2 (); + coords[1] = getY2 (); + } + else + r = SEG_CLOSE; + + return r; + } + + public int currentSegment (float[] coords) + { + int r = SEG_MOVETO; + if (coord == 0) + { + coords[0] = (float) getX1 (); + coords[1] = (float) getY1 (); + } + else if (coord == 1) + { + coords[0] = (float) getX2 (); + coords[1] = (float) getY2 (); + } + else + r = SEG_CLOSE; + + return r; + } + + public int getWindingRule () + { + return WIND_NON_ZERO; + } + + public boolean isDone () + { + return coord == END_PLUS_ONE; + } + + public void next () + { + if (coord < END_PLUS_ONE) + ++coord; + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/NoninvertibleTransformException.java gcc-3.1/libjava/java/awt/geom/NoninvertibleTransformException.java *** gcc-3.0.4/libjava/java/awt/geom/NoninvertibleTransformException.java Sun Jul 23 00:24:14 2000 --- gcc-3.1/libjava/java/awt/geom/NoninvertibleTransformException.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/PathIterator.java gcc-3.1/libjava/java/awt/geom/PathIterator.java *** gcc-3.0.4/libjava/java/awt/geom/PathIterator.java Sun Jul 23 00:24:14 2000 --- gcc-3.1/libjava/java/awt/geom/PathIterator.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/Point2D.java gcc-3.1/libjava/java/awt/geom/Point2D.java *** gcc-3.0.4/libjava/java/awt/geom/Point2D.java Mon Dec 4 02:27:21 2000 --- gcc-3.1/libjava/java/awt/geom/Point2D.java Mon Apr 8 18:48:55 2002 *************** *** 1,10 **** ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; *************** public abstract class Point2D implements *** 41,47 **** static public double distance (double X1, double Y1, double X2, double Y2) { ! return Math.sqrt(distance(X1, Y1, X2, Y2)); } public double distanceSq (double PX, double PY) --- 69,75 ---- static public double distance (double X1, double Y1, double X2, double Y2) { ! return Math.sqrt(distanceSq(X1, Y1, X2, Y2)); } public double distanceSq (double PX, double PY) diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/Rectangle2D.java gcc-3.1/libjava/java/awt/geom/Rectangle2D.java *** gcc-3.0.4/libjava/java/awt/geom/Rectangle2D.java Sun Jul 23 00:24:14 2000 --- gcc-3.1/libjava/java/awt/geom/Rectangle2D.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; *************** public abstract class Rectangle2D extend *** 45,51 **** * @param x1 X coordinate of first end of line segment * @param y1 Y coordinate of first end of line segment * @param x2 X coordinate of second end of line segment ! * @param y1 Y coordinate of segment end of line segment */ public boolean intersectsLine (double x1, double y1, double x2, double y2) { --- 73,79 ---- * @param x1 X coordinate of first end of line segment * @param y1 Y coordinate of first end of line segment * @param x2 X coordinate of second end of line segment ! * @param y2 Y coordinate of segment end of line segment */ public boolean intersectsLine (double x1, double y1, double x2, double y2) { *************** public abstract class Rectangle2D extend *** 379,384 **** --- 407,420 ---- this.height = (float) h; } + public void setRect (float x, float y, float w, float h) + { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + public void setRect (Rectangle2D r) { this.x = (float) r.getX (); diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/RectangularShape.java gcc-3.1/libjava/java/awt/geom/RectangularShape.java *** gcc-3.0.4/libjava/java/awt/geom/RectangularShape.java Wed Aug 9 13:01:44 2000 --- gcc-3.1/libjava/java/awt/geom/RectangularShape.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; import java.awt.*; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; import java.awt.*; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/geom/RoundRectangle2D.java gcc-3.1/libjava/java/awt/geom/RoundRectangle2D.java *** gcc-3.0.4/libjava/java/awt/geom/RoundRectangle2D.java Sun Dec 3 21:21:52 2000 --- gcc-3.1/libjava/java/awt/geom/RoundRectangle2D.java Tue Jan 22 22:40:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libjava. ! This software is copyrighted work licensed under the terms of the ! Libjava License. Please consult the file "LIBJAVA_LICENSE" for ! details. */ package java.awt.geom; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.geom; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/AreaAveragingScaleFilter.java gcc-3.1/libjava/java/awt/image/AreaAveragingScaleFilter.java *** gcc-3.0.4/libjava/java/awt/image/AreaAveragingScaleFilter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/AreaAveragingScaleFilter.java Thu Jan 24 01:05:12 2002 *************** *** 0 **** --- 1,127 ---- + /* AreaAveragingScaleFilter.java -- Java class for filtering images + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + /** + * This filter should produce images which do not have image artifacts + * like broken lines which were originally unbroken. The cost is of + * course speed. Using bi-linear interpolation here against 4 pixel + * points should give the desired results although Sun does not + * specify what the exact algorithm should be. + *
    + * Currently this filter does nothing and needs to be implemented. + * + * @author C. Brian Jones (cbj@gnu.org) + */ + public class AreaAveragingScaleFilter extends ReplicateScaleFilter + { + /** + * Construct an instance of AreaAveragingScaleFilter which + * should be used in conjunction with a FilteredImageSource + * object. + * + * @param width the width of the destination image + * @param height the height of the destination image + */ + public AreaAveragingScaleFilter(int width, int height) { + super(width, height); + } + + /** + * The ImageProducer should call this method with a + * bit mask of hints from any of RANDOMPIXELORDER, + * TOPDOWNLEFTRIGHT, COMPLETESCANLINES, + * SINGLEPASS, SINGLEFRAME from the + * ImageConsumer interface. + *
    + * FIXME - more than likely Sun's implementation desires + * TOPDOWNLEFTRIGHT order and this method is overloaded here + * in order to assure that mask is part of the hints added to + * the consumer. + * + * @param flags a bit mask of hints + * @see ImageConsumer + */ + public void setHints(int flags) + { + consumer.setHints(flags); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as a byte at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as an int at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/BufferedImage.java gcc-3.1/libjava/java/awt/image/BufferedImage.java *** gcc-3.0.4/libjava/java/awt/image/BufferedImage.java Mon Oct 2 05:14:25 2000 --- gcc-3.1/libjava/java/awt/image/BufferedImage.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.image; --- 1,39 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; *************** import java.awt.*; *** 12,18 **** import java.awt.color.*; import java.util.*; ! import gnu.gcj.awt.ComponentDataBlitOp; /** * A buffered image always starts at coordinates (0, 0). --- 41,47 ---- import java.awt.color.*; import java.util.*; ! import gnu.java.awt.ComponentDataBlitOp; /** * A buffered image always starts at coordinates (0, 0). diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ColorModel.java gcc-3.1/libjava/java/awt/image/ColorModel.java *** gcc-3.0.4/libjava/java/awt/image/ColorModel.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/ColorModel.java Fri Jan 25 05:44:03 2002 *************** *** 1,17 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.image; import java.awt.Point; import java.awt.Transparency; import java.awt.color.ColorSpace; ! import gnu.gcj.awt.Buffers; /** * A color model operates with colors in several formats: --- 1,46 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; import java.awt.Point; import java.awt.Transparency; import java.awt.color.ColorSpace; ! import gnu.java.awt.Buffers; /** * A color model operates with colors in several formats: *************** import gnu.gcj.awt.Buffers; *** 39,45 **** *
  • arrays of unnormalized component samples of single pixel: these * samples are scaled and multiplied according to the color model, but * is otherwise not packed or encoded. Each element of the array is one ! * seperate component sample. The color model only operate on the * components from one pixel at a time, but using offsets, allows * manipulation of arrays that contain the components of more than one * pixel.
  • --- 68,74 ---- *
  • arrays of unnormalized component samples of single pixel: these * samples are scaled and multiplied according to the color model, but * is otherwise not packed or encoded. Each element of the array is one ! * separate component sample. The color model only operate on the * components from one pixel at a time, but using offsets, allows * manipulation of arrays that contain the components of more than one * pixel.
  • *************** import gnu.gcj.awt.Buffers; *** 47,54 **** * * * @author Rolf W. Rasmussen */ - public abstract class ColorModel implements Transparency { protected int pixel_bits; --- 76,83 ---- * * * @author Rolf W. Rasmussen + * @author C. Brian Jones (cbj@gnu.org) */ public abstract class ColorModel implements Transparency { protected int pixel_bits; *************** public abstract class ColorModel impleme *** 74,79 **** --- 103,114 ---- return array; } + /** + * Constructs the default color model. The default color model + * can be obtained by calling getRGBdefault of this + * class. + * @param b the number of bits wide used for bit size of pixel values + */ public ColorModel(int bits) { this(bits * 4, // total bits, sRGB, four channels *************** public abstract class ColorModel impleme *** 98,103 **** --- 133,142 ---- this.transferType = transferType; } + /** + * Returns the default color model which in Sun's case is an instance + * of DirectColorModel. + */ public static ColorModel getRGBdefault() { return new DirectColorModel(8, 0xff0000, 0xff00, 0xff, 0xff000000); *************** public abstract class ColorModel impleme *** 113,118 **** --- 152,160 ---- return isAlphaPremultiplied; } + /** + * Get get number of bits wide used for the bit size of pixel values + */ public int getPixelSize() { return pixel_bits; *************** public abstract class ColorModel impleme *** 251,257 **** * @see #getRed(Object) */ public int getAlpha(Object inData) { ! return getBlue(getPixelFromArray(inData)); } /** --- 293,299 ---- * @see #getRed(Object) */ public int getAlpha(Object inData) { ! return getAlpha(getPixelFromArray(inData)); } /** *************** public abstract class ColorModel impleme *** 337,343 **** * @return arrays of unnormalized component samples of single * pixel. The scale and multiplication state of the samples are * according to the color model. Each component sample is stored ! * as a seperate element in the array. */ public int[] getComponents(int pixel, int[] components, int offset) { // FIXME: implement --- 379,385 ---- * @return arrays of unnormalized component samples of single * pixel. The scale and multiplication state of the samples are * according to the color model. Each component sample is stored ! * as a separate element in the array. */ public int[] getComponents(int pixel, int[] components, int offset) { // FIXME: implement *************** public abstract class ColorModel impleme *** 358,364 **** * @return arrays of unnormalized component samples of single * pixel. The scale and multiplication state of the samples are * according to the color model. Each component sample is stored ! * as a seperate element in the array. */ public int[] getComponents(Object pixel, int[] components, int offset) { --- 400,406 ---- * @return arrays of unnormalized component samples of single * pixel. The scale and multiplication state of the samples are * according to the color model. Each component sample is stored ! * as a separate element in the array. */ public int[] getComponents(Object pixel, int[] components, int offset) { *************** public abstract class ColorModel impleme *** 429,435 **** * @param arrays of unnormalized component samples of single * pixel. The scale and multiplication state of the samples are * according to the color model. Each component sample is stored ! * as a seperate element in the array. * * @return pixel value encoded according to the color model. */ --- 471,477 ---- * @param arrays of unnormalized component samples of single * pixel. The scale and multiplication state of the samples are * according to the color model. Each component sample is stored ! * as a separate element in the array. * * @return pixel value encoded according to the color model. */ *************** public abstract class ColorModel impleme *** 525,531 **** return sm.getTransferType() == transferType; } ! public void finalize() { } /** --- 567,574 ---- return sm.getTransferType() == transferType; } ! public void finalize() ! { } /** diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ComponentColorModel.java gcc-3.1/libjava/java/awt/image/ComponentColorModel.java *** gcc-3.0.4/libjava/java/awt/image/ComponentColorModel.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/ComponentColorModel.java Tue Jan 22 22:40:10 2002 *************** *** 1,16 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; import java.awt.color.*; import java.awt.Point; ! import gnu.gcj.awt.Buffers; public class ComponentColorModel extends ColorModel { --- 1,44 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; import java.awt.color.*; import java.awt.Point; ! import gnu.java.awt.Buffers; public class ComponentColorModel extends ColorModel { diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ComponentSampleModel.java gcc-3.1/libjava/java/awt/image/ComponentSampleModel.java *** gcc-3.0.4/libjava/java/awt/image/ComponentSampleModel.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/ComponentSampleModel.java Tue Jan 22 22:40:10 2002 *************** *** 1,14 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; ! import gnu.gcj.awt.Buffers; /* FIXME: This class does not yet support data type TYPE_SHORT */ --- 1,42 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; ! import gnu.java.awt.Buffers; /* FIXME: This class does not yet support data type TYPE_SHORT */ diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/CropImageFilter.java gcc-3.1/libjava/java/awt/image/CropImageFilter.java *** gcc-3.0.4/libjava/java/awt/image/CropImageFilter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/CropImageFilter.java Thu Jan 24 01:05:12 2002 *************** *** 0 **** --- 1,140 ---- + /* CropImageFilter.java -- Java class for cropping image filter + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + import java.util.Hashtable; + + /** + *
    + * Currently this filter does almost nothing and needs to be implemented. + * + * @author C. Brian Jones (cbj@gnu.org) + */ + public class CropImageFilter extends ImageFilter + { + int x; + int y; + int width; + int height; + + /** + * Construct a new CropImageFilter instance. + * + * @param x the x-coordinate location of the top-left of the cropped rectangle + * @param y the y-coordinate location of the top-left of the cropped rectangle + * @param width the width of the cropped rectangle + * @param height the height of the cropped rectangle + */ + public CropImageFilter(int x, int y, int width, int height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + /** + * An ImageProducer indicates the size of the image + * being produced using this method. This filter overrides this + * method in order to set the dimentions to the size of the + * cropped rectangle instead of the size of the image. + * + * @param width the width of the image + * @param height the height of the image + */ + public void setDimensions(int width, int height) + { + consumer.setDimensions(this.width, this.height); + } + + /** + * An ImageProducer can set a list of properties + * associated with this image by using this method. + *
    + * FIXME - What property is set for this class? + * + * @param props the list of properties associated with this image + */ + public void setProperties(Hashtable props) + { + // props.put("filters", "ReplicateScaleFilter"); + consumer.setProperties(props); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as a byte at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as an int at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/DataBuffer.java gcc-3.1/libjava/java/awt/image/DataBuffer.java *** gcc-3.0.4/libjava/java/awt/image/DataBuffer.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/DataBuffer.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/DataBufferByte.java gcc-3.1/libjava/java/awt/image/DataBufferByte.java *** gcc-3.0.4/libjava/java/awt/image/DataBufferByte.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/DataBufferByte.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/DataBufferInt.java gcc-3.1/libjava/java/awt/image/DataBufferInt.java *** gcc-3.0.4/libjava/java/awt/image/DataBufferInt.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/DataBufferInt.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/DataBufferUShort.java gcc-3.1/libjava/java/awt/image/DataBufferUShort.java *** gcc-3.0.4/libjava/java/awt/image/DataBufferUShort.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/DataBufferUShort.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/DirectColorModel.java gcc-3.1/libjava/java/awt/image/DirectColorModel.java *** gcc-3.0.4/libjava/java/awt/image/DirectColorModel.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/DirectColorModel.java Tue Jan 22 22:40:10 2002 *************** *** 1,23 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.image; import java.awt.Point; import java.awt.Transparency; import java.awt.color.ColorSpace; ! import gnu.gcj.awt.Buffers; /** * @author Rolf W. Rasmussen */ public class DirectColorModel extends PackedColorModel { public DirectColorModel(int pixelBits, int rmask, int gmask, int bmask) { this(ColorSpace.getInstance(ColorSpace.CS_sRGB), pixelBits, --- 1,67 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; import java.awt.Point; import java.awt.Transparency; import java.awt.color.ColorSpace; ! import gnu.java.awt.Buffers; /** * @author Rolf W. Rasmussen + * @author C. Brian Jones (cbj@gnu.org) + * @author Mark Benvenuto (mcb54@columbia.edu) */ public class DirectColorModel extends PackedColorModel { + /** + * For the color model created with this constructor the pixels + * will have fully opaque alpha components with a value of 255. + * Each mask should describe a fully contiguous set of bits in the + * most likely order of alpha, red, green, blue from the most significant + * byte to the least significant byte. + * + * @param bits the number of bits wide used for bit size of pixel values + * @param rmask the bits describing the red component of a pixel + * @param gmask the bits describing the green component of a pixel + * @param bmask the bits describing the blue component of a pixel + * @param amask the bits describing the alpha component of a pixel + */ public DirectColorModel(int pixelBits, int rmask, int gmask, int bmask) { this(ColorSpace.getInstance(ColorSpace.CS_sRGB), pixelBits, *************** public class DirectColorModel extends Pa *** 27,32 **** --- 71,88 ---- ); } + /** + * For the color model created with this constructor the pixels + * will have fully opaque alpha components with a value of 255. + * Each mask should describe a fully contiguous set of bits in the + * most likely order of red, green, blue from the most significant + * byte to the least significant byte. + * + * @param bits the number of bits wide used for bit size of pixel values + * @param rmask the bits describing the red component of a pixel + * @param gmask the bits describing the green component of a pixel + * @param bmask the bits describing the blue component of a pixel + */ public DirectColorModel(int pixelBits, int rmask, int gmask, int bmask, int amask) { *************** public class DirectColorModel extends Pa *** 68,91 **** return hasAlpha() ? getMask(3) : 0; } public final int getRed(int pixel) { return extractAndNormalizeSample(pixel, 0); } public final int getGreen(int pixel) { return extractAndNormalizeSample(pixel, 1); } public final int getBlue(int pixel) { return extractAndNormalizeSample(pixel, 2); } public final int getAlpha(int pixel) { ! if (!hasAlpha()) return 0; return extractAndScaleSample(pixel, 3); } --- 124,164 ---- return hasAlpha() ? getMask(3) : 0; } + /** + * Get the red component of the given pixel. + *
    + */ public final int getRed(int pixel) { return extractAndNormalizeSample(pixel, 0); } + /** + * Get the green component of the given pixel. + *
    + */ public final int getGreen(int pixel) { return extractAndNormalizeSample(pixel, 1); } + /** + * Get the blue component of the given pixel. + *
    + */ public final int getBlue(int pixel) { return extractAndNormalizeSample(pixel, 2); } + /** + * Get the alpha component of the given pixel. + *
    + */ public final int getAlpha(int pixel) { ! if (!hasAlpha()) ! return 0; return extractAndScaleSample(pixel, 3); } *************** public class DirectColorModel extends Pa *** 106,120 **** (field << to8BitShift) : (field >>> (-to8BitShift)); } - ! /* FIXME: The Sun docs show that this method is overridden, but I don't ! see any way to improve on the superclass implementation. */ public final int getRGB(int pixel) { return super.getRGB(pixel); } ! public int getRed(Object inData) { return getRed(getPixelFromArray(inData)); --- 179,200 ---- (field << to8BitShift) : (field >>> (-to8BitShift)); } ! /** ! * Get the RGB color value of the given pixel using the default ! * RGB color model. ! *
    ! * ! * @param pixel a pixel value ! */ public final int getRGB(int pixel) { + /* FIXME: The Sun docs show that this method is overridden, but I + don't see any way to improve on the superclass + implementation. */ return super.getRGB(pixel); } ! public int getRed(Object inData) { return getRed(getPixelFromArray(inData)); diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/FilteredImageSource.java gcc-3.1/libjava/java/awt/image/FilteredImageSource.java *** gcc-3.0.4/libjava/java/awt/image/FilteredImageSource.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/FilteredImageSource.java Thu Jan 24 01:05:12 2002 *************** *** 0 **** --- 1,125 ---- + /* FilteredImageSource.java -- Java class for providing image data + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + import java.util.Hashtable; + + /** + * + * @see ImageConsumer + * @author C. Brian Jones (cbj@gnu.org) + */ + public class FilteredImageSource implements ImageProducer + { + ImageProducer ip; + ImageFilter filter; + Hashtable consumers = new Hashtable(); + + /** + * The given filter is applied to the given image producer + * to create a new image producer. + */ + public FilteredImageSource(ImageProducer ip, ImageFilter filter) { + this.ip = ip; + this.filter = filter; + } + + /** + * Used to register an ImageConsumer with this + * ImageProducer. + */ + public synchronized void addConsumer(ImageConsumer ic) { + if (consumers.containsKey(ic)) + return; + + ImageFilter f = filter.getFilterInstance(ic); + consumers.put(ic, f); + ip.addConsumer(f); + } + + /** + * Used to determine if the given ImageConsumer is + * already registered with this ImageProducer. + */ + public synchronized boolean isConsumer(ImageConsumer ic) { + ImageFilter f = (ImageFilter)consumers.get(ic); + if (f != null) + return ip.isConsumer(f); + return false; + } + + /** + * Used to remove an ImageConsumer from the list of + * registered consumers for this ImageProducer. + */ + public synchronized void removeConsumer(ImageConsumer ic) { + ImageFilter f = (ImageFilter)consumers.remove(ic); + if (f != null) + ip.removeConsumer(f); + } + + /** + * Used to register an ImageConsumer with this + * ImageProducer and then immediately start + * reconstruction of the image data to be delivered to all + * registered consumers. + */ + public void startProduction(ImageConsumer ic) { + ImageFilter f; + if (!(consumers.containsKey(ic))) { + f = filter.getFilterInstance(ic); + consumers.put(ic, f); + ip.addConsumer(f); + } else { + f = (ImageFilter)consumers.get( ic ); + } + ip.startProduction(f); + } + + /** + * Used to register an ImageConsumer with this + * ImageProducer and then request that this producer + * resend the image data in the order top-down, left-right. + */ + public void requestTopDownLeftRightResend(ImageConsumer ic) { + ImageFilter f = (ImageFilter)consumers.get(ic); + ip.requestTopDownLeftRightResend(f); + } + } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ImageConsumer.java gcc-3.1/libjava/java/awt/image/ImageConsumer.java *** gcc-3.0.4/libjava/java/awt/image/ImageConsumer.java Tue Jul 25 17:53:30 2000 --- gcc-3.1/libjava/java/awt/image/ImageConsumer.java Thu Jan 24 05:51:33 2002 *************** *** 1,35 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.image; import java.util.Hashtable; public interface ImageConsumer { ! public static final int RANDOMPIXELORDER = 1 << 0, ! TOPDOWNLEFTRIGHT = 1 << 1, ! COMPLETESCANLINES = 1 << 2, ! SINGLEPASS = 1 << 3, ! SINGLEFRAME = 1 << 4; ! ! public static final int IMAGEERROR = 1, ! SINGLEFRAMEDONE = 2, ! STATICIMAGEDONE = 3, ! IMAGEABORTED = 4; ! public void setDimensions(int width, int height); ! public void setProperties(Hashtable props); ! public void setColorModel(ColorModel model); ! public void setHints(int hintflags); ! public void setPixels(int x, int y, int w, int h, ColorModel model, ! byte[] pixels, int off, int scansize); ! public void setPixels(int x, int y, int w, int h, ColorModel model, ! int[] pixels, int off, int scansize); ! public void imageComplete(int status); } --- 1,186 ---- ! /* ImageConsumer.java -- Java interface for image consumption ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; + import java.util.Hashtable; + /** + * An object implementing the ImageProducer interface can + * use objects implementing this interface to deliver the image data. + * + * @author C. Brian Jones (cbj@gnu.org) + */ public interface ImageConsumer { + /** + * The pixel order may be random. This should be + * the default assumption of the ImageConsumer. + * + * @see #setHints + */ + public static final int RANDOMPIXELORDER = 1; ! /** ! * The pixel order is top-down, left-right. ! * ! * @see #setHints ! */ ! public static final int TOPDOWNLEFTRIGHT = 2; ! /** ! * The pixel order is in multiples of complete scanlines. ! * ! * @see #setHints ! */ ! public static final int COMPLETESCANLINES = 4; ! ! /** ! * The pixels will be delivered in a single pass. There is at ! * most one call to setPixels for any single pixel. ! * ! * @see #setHints ! * @see #setPixels ! */ ! public static final int SINGLEPASS = 8; ! ! /** ! * The pixels will be delivered with multiple calls to ! * setPixels. The image contains a single frame ! * which ends when imageComplete is called with the ! * STATICIMAGEDONE flag. If the image is constantly ! * changing such as with video then the end of each frame is ! * marked by a similar call to imageComplete with the ! * SINGLEFRAMEDONE flag. ! * ! * @see #setHints ! * @see #imageComplete ! */ ! public static final int SINGLEFRAME = 16; ! ! /** ! * Indicates an error occurred while producing an image. ! * ! * @see #imageComplete ! */ ! public static final int IMAGEERROR = 1; ! ! /** ! * A single frame is complete but more will follow. ! * ! * @see #imageComplete ! */ ! public static final int SINGLEFRAMEDONE = 2; ! ! /** ! * The image is complete and no more pixels or frames will follow. ! * ! * @see #imageComplete ! */ ! public static final int STATICIMAGEDONE = 3; ! ! /** ! * Production of the image has been aborted. ! * ! * @see #imageComplete ! */ ! public static final int IMAGEABORTED = 4; ! ! /** ! * An ImageProducer indicates the size of the image ! * being produced using this method. ! * ! * @param width the width of the image ! * @param height the height of the image ! */ ! public abstract void setDimensions(int width, int height); ! ! /** ! * An ImageProducer can set a list of properties ! * associated with this image by using this method. ! * ! * @param props the list of properties associated with this image ! */ ! public abstract void setProperties(Hashtable props); ! ! /** ! * This ColorModel should indicate the model used by ! * the majority of calls to setPixels. Each call to ! * setPixels could however indicate a different ! * ColorModel. ! * ! * @param model the color model to be used most often by setPixels ! * @see ColorModel ! */ ! public abstract void setColorModel(ColorModel model); ! ! /** ! * The ImageProducer should call this method with a ! * bit mask of hints from any of RANDOMPIXELORDER, ! * TOPDOWNLEFTRIGHT, COMPLETESCANLINES, ! * SINGLEPASS, SINGLEFRAME. ! * ! * @param flags a bit mask of hints ! */ ! public abstract void setHints(int flags); ! ! /** ! * This function delivers a rectangle of pixels where any ! * pixel(m,n) is stored in the array as a byte at ! * index (n * scansize + m + offset). ! */ ! public abstract void setPixels(int x, int y, int w, int h, ! ColorModel model, byte[] pixels, int offset, int scansize); ! ! /** ! * This function delivers a rectangle of pixels where any ! * pixel(m,n) is stored in the array as an int at ! * index (n * scansize + m + offset). ! */ ! public abstract void setPixels(int x, int y, int w, int h, ! ColorModel model, int[] pixels, int offset, int scansize); ! ! /** ! * The ImageProducer calls this method to indicate a ! * single frame or the entire image is complete. The method is ! * also used to indicate an error in loading or producing the ! * image. ! */ ! public abstract void imageComplete(int status); } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ImageFilter.java gcc-3.1/libjava/java/awt/image/ImageFilter.java *** gcc-3.0.4/libjava/java/awt/image/ImageFilter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/ImageFilter.java Thu Jan 24 01:05:12 2002 *************** *** 0 **** --- 1,218 ---- + /* ImageFilter.java -- Java class for filtering images + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + import java.util.Hashtable; + + /** + * The ImageFilter class is a base class which can be + * extended to provide different types of filters for an image. By + * default this class does nothing to an image passing through it. + * + * @author C. Brian Jones (cbj@gnu.org) + */ + public class ImageFilter implements ImageConsumer, Cloneable + { + /** + * The consumer this filter is filtering an image data stream for. + * It is initialized in the method getFilterInstance. + */ + protected ImageConsumer consumer = null; + + /** + * The ImageConsumer can use this method to request + * the pixels be delivered in top-down, left-right order. + *
    + * The filter can respond in three different ways. + *
      + *
    • The default behavior is to forward the request to the + * ImageProducer + * using the method requestTopDownLeftRightResend + * and using the filter as the consumer.
    • + *
    • The filter has the pixels and can retransmit them in the + * top-down, left-right order.
    • + *
    • The filter can do nothing when this method is called.
    • + *
    + */ + public void resendTopDownLeftRight(ImageProducer ip) + { + ip.requestTopDownLeftRightResend(this); + } + + /** + * By default, returns a shallow copy of the object created by + * Object.clone() + * + * @see java.lang.Object#clone () + */ + public Object clone() throws CloneNotSupportedException + { + return (super.clone()); + } + + /** + * This is the only method which can set the + * ImageConsumer for this filter. By default a clone + * of this filter with the appropriate consumer set is returned. + * + * @see #clone () + */ + public ImageFilter getFilterInstance(ImageConsumer ic) + { + if ( ic == null ) + throw new IllegalArgumentException("null argument for ImageFilter.getFilterInstance(ImageConsumer)"); + + consumer = ic; + try { + ImageFilter f = (ImageFilter)clone(); + consumer = null; + return f; + } catch ( CloneNotSupportedException cnse ) { + cnse.printStackTrace(); + consumer = null; + return null; + } + } + + /** + * An ImageProducer indicates the size of the image + * being produced using this method. A filter can override this + * method to intercept these calls from the producer in order to + * change either the width or the height before in turn calling + * the consumer's setDimensions method. + * + * @param width the width of the image + * @param height the height of the image + */ + public void setDimensions(int width, int height) + { + consumer.setDimensions(width, height); + } + + /** + * An ImageProducer can set a list of properties + * associated with this image by using this method. + * + * @param props the list of properties associated with this image + */ + public void setProperties(Hashtable props) + { + props.put("filters", "ImageFilter"); + consumer.setProperties(props); + } + + /** + * Override this method to process calls to this method from the + * ImageProducer. By default the setColorModel + * method of the consumer is called with the specified model. + * + * @param model the color model to be used most often by setPixels + * @see ColorModel */ + public void setColorModel(ColorModel model) + { + consumer.setColorModel(model); + } + + /** + * The ImageProducer should call this method with a + * bit mask of hints from any of RANDOMPIXELORDER, + * TOPDOWNLEFTRIGHT, COMPLETESCANLINES, + * SINGLEPASS, SINGLEFRAME from the + * ImageConsumer interface. + * + * @param flags a bit mask of hints + * @see ImageConsumer + */ + public void setHints(int flags) + { + consumer.setHints(flags); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as a byte at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as an int at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + /** + * The ImageProducer calls this method to indicate a + * single frame or the entire image is complete. The method is + * also used to indicate an error in loading or producing the + * image. + */ + public void imageComplete(int status) + { + consumer.imageComplete(status); + } + } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ImageObserver.java gcc-3.1/libjava/java/awt/image/ImageObserver.java *** gcc-3.0.4/libjava/java/awt/image/ImageObserver.java Wed Jul 12 21:13:51 2000 --- gcc-3.1/libjava/java/awt/image/ImageObserver.java Thu Jan 24 05:51:34 2002 *************** *** 1,28 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.image; import java.awt.Image; ! public interface ImageObserver { ! int WIDTH = 1 << 0; ! int HEIGHT = 1 << 1; ! int PROPERTIES = 1 << 2; ! int SOMEBITS = 1 << 3; ! int FRAMEBITS = 1 << 4; ! int ALLBITS = 1 << 5; ! int ERROR = 1 << 6; ! int ABORT = 1 << 7; ! boolean imageUpdate(Image image, int infoFlags, int x, int y, int width, ! int height); ! } --- 1,129 ---- ! /* ImageObserver.java -- Java interface for asynchronous updates to an image ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; import java.awt.Image; ! /** ! * An object implementing the ImageObserver interface can ! * receive updates on image construction from an ! * ImageProducer asynchronously. ! * ! * @see ImageProducer ! * @author C. Brian Jones (cbj@gnu.org) ! */ ! public interface ImageObserver { ! /** ! * The width of the image has been provided as the ! * width argument to imageUpdate. ! * ! * @see #imageUpdate ! */ ! public static final int WIDTH = 1; ! /** ! * The height of the image has been provided as the ! * height argument to imageUpdate. ! * ! * @see #imageUpdate ! */ ! public static final int HEIGHT = 2; ! ! /** ! * The properties of the image have been provided. ! * ! * @see #imageUpdate ! * @see java.awt.Image#getProperty (java.lang.String, java.awt.image.ImageObserver) ! */ ! public static final int PROPERTIES = 4; ! ! /** ! * More pixels are now available for drawing a scaled variation of ! * the image. ! * ! * @see #imageUpdate ! */ ! public static final int SOMEBITS = 8; + /** + * All the pixels needed to draw a complete frame of a multi-frame + * image are available. + * + * @see #imageUpdate + */ + public static final int FRAMEBITS = 16; + /** + * An image with a single frame, a static image, is complete. + * + * @see #imageUpdate + */ + public static final int ALLBITS = 32; + + /** + * An error was encountered while producing the image. + * + * @see #imageUpdate + */ + public static final int ERROR = 64; + + /** + * Production of the image was aborted. + * + * @see #imageUpdate + */ + public static final int ABORT = 128; + + /** + * This is a callback method for an asynchronous image producer to + * provide updates on the production of the image as it happens. + * + * @param image the image the update refers to + * @param flags a bit mask indicating what is provided with this update + * @param x the x coordinate of the image + * @param y the y coordinate of the image + * @param width the width of the image + * @param height the height of the image + * + * @see java.awt.Image + */ + public abstract boolean imageUpdate(Image image, int flags, int x, + int y, int width, int height); + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ImageProducer.java gcc-3.1/libjava/java/awt/image/ImageProducer.java *** gcc-3.0.4/libjava/java/awt/image/ImageProducer.java Wed Jul 12 21:16:52 2000 --- gcc-3.1/libjava/java/awt/image/ImageProducer.java Thu Jan 24 05:51:34 2002 *************** *** 1,18 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.image; public interface ImageProducer { ! void addConsumer(ImageConsumer ic); ! boolean isConsumer(ImageConsumer ic); ! void removeConsumer(ImageConsumer ic); ! void startProduction(ImageConsumer ic); ! void requestTopDownLeftRightResend(ImageConsumer ic); } --- 1,85 ---- ! /* ImageProducer.java -- Java interface for image production ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; + /** + * An object implementing the ImageProducer interface can + * produce data for images. Each image has a corresponding + * ImageProducer which is needed for things such as + * resizing the image. + * + * @see ImageConsumer + * @author C. Brian Jones (cbj@gnu.org) + */ public interface ImageProducer { ! /** ! * Used to register an ImageConsumer with this ! * ImageProducer. ! */ ! public abstract void addConsumer(ImageConsumer ic); ! ! /** ! * Used to determine if the given ImageConsumer is ! * already registered with this ImageProducer. ! */ ! public abstract boolean isConsumer(ImageConsumer ic); ! ! /** ! * Used to remove an ImageConsumer from the list of ! * registered consumers for this ImageProducer. ! */ ! public abstract void removeConsumer(ImageConsumer ic); ! ! /** ! * Used to register an ImageConsumer with this ! * ImageProducer and then immediately start ! * reconstruction of the image data to be delivered to all ! * registered consumers. ! */ ! public abstract void startProduction(ImageConsumer ic); ! ! /** ! * Used to register an ImageConsumer with this ! * ImageProducer and then request that this producer ! * resend the image data in the order top-down, left-right. ! */ ! public abstract void requestTopDownLeftRightResend(ImageConsumer ic); } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/IndexColorModel.java gcc-3.1/libjava/java/awt/image/IndexColorModel.java *** gcc-3.0.4/libjava/java/awt/image/IndexColorModel.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/IndexColorModel.java Wed Jan 16 04:21:35 2002 *************** package java.awt.image; *** 10,16 **** import java.awt.Transparency; import java.awt.color.ColorSpace; ! import gnu.gcj.awt.Buffers; /** * @author Rolf W. Rasmussen --- 10,16 ---- import java.awt.Transparency; import java.awt.color.ColorSpace; ! import gnu.java.awt.Buffers; /** * @author Rolf W. Rasmussen diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/MemoryImageSource.java gcc-3.1/libjava/java/awt/image/MemoryImageSource.java *** gcc-3.0.4/libjava/java/awt/image/MemoryImageSource.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/MemoryImageSource.java Sat Jan 26 08:35:34 2002 *************** *** 0 **** --- 1,327 ---- + /* MemoryImageSource.java -- Java class for providing image data + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + import java.awt.Image; + import java.util.Enumeration; + import java.util.Hashtable; + + public class MemoryImageSource implements ImageProducer + { + private boolean animated = false; + private boolean fullbuffers = false; + private int pixeli[], width, height, offset, scansize; + private byte pixelb[]; + private ColorModel cm; + private Hashtable props, consumers = new Hashtable(); + + /** + Constructs an ImageProducer from memory + */ + public MemoryImageSource(int w, int h, ColorModel cm, + byte pix[], int off, int scan) + { + this ( w, h, cm, pix, off, scan, null ); + } + /** + Constructs an ImageProducer from memory + */ + public MemoryImageSource( int w, int h, ColorModel cm, + byte pix[], int off, int scan, + Hashtable props) + { + width = w; + height = h; + this.cm = cm; + offset = off; + scansize = scan; + this.props = props; + int max = (( scansize > width ) ? scansize : width ); + pixelb = new byte[ max * height ]; + System.arraycopy( pix, 0, pixelb, 0, max ); + } + /** + Constructs an ImageProducer from memory + */ + public MemoryImageSource(int w, int h, ColorModel cm, + int pix[], int off, int scan) + { + this ( w, h, cm, pix, off, scan, null ); + } + + /** + Constructs an ImageProducer from memory + */ + public MemoryImageSource(int w, int h, ColorModel cm, + int pix[], int off, int scan, + Hashtable props) + { + width = w; + height = h; + this.cm = cm; + offset = off; + scansize = scan; + this.props = props; + int max = (( scansize > width ) ? scansize : width ); + pixeli = new int[ max * height ]; + System.arraycopy( pix, 0, pixeli, 0, max ); + } + /** + Constructs an ImageProducer from memory using the default RGB ColorModel + */ + public MemoryImageSource(int w, int h, + int pix[], int off, int scan, + Hashtable props) + { + this ( w, h, ColorModel.getRGBdefault(), pix, off, scan, props); + } + + /** + Constructs an ImageProducer from memory using the default RGB ColorModel + */ + public MemoryImageSource(int w, int h, + byte pix[], int off, int scan) + { + this ( w, h, ColorModel.getRGBdefault(), pix, off, scan, null); + } + + /** + * Used to register an ImageConsumer with this + * ImageProducer. + */ + public synchronized void addConsumer(ImageConsumer ic) { + if (consumers.containsKey(ic)) + return; + + consumers.put(ic, ic); + } + + /** + * Used to determine if the given ImageConsumer is + * already registered with this ImageProducer. + */ + public synchronized boolean isConsumer(ImageConsumer ic) { + if (consumers.containsKey(ic)) + return true; + return false; + } + + /** + * Used to remove an ImageConsumer from the list of + * registered consumers for this ImageProducer. + */ + public synchronized void removeConsumer(ImageConsumer ic) { + consumers.remove(ic); + } + + /** + * Used to register an ImageConsumer with this + * ImageProducer and then immediately start + * reconstruction of the image data to be delivered to all + * registered consumers. + */ + public void startProduction(ImageConsumer ic) { + if (!(consumers.containsKey(ic))) { + consumers.put(ic, ic); + } + Enumeration e = consumers.elements(); + for( ; e.hasMoreElements(); ) { + ic = (ImageConsumer)e.nextElement(); + sendPicture( ic ); + ic.imageComplete( ImageConsumer.SINGLEFRAME ); + } + + } + + /** + * Used to register an ImageConsumer with this + * ImageProducer and then request that this producer + * resend the image data in the order top-down, left-right. + */ + public void requestTopDownLeftRightResend(ImageConsumer ic) { + startProduction ( ic ); + } + + + /** + Changes a flag to indicate whether this MemoryImageSource supports + animations. + + @param animated A flag indicating whether this class supports animations + */ + public synchronized void setAnimated(boolean animated) + { + this.animated = animated; + } + + + /** + A flag to indicate whether or not to send full buffer updates when + sending animation. If this flag is set then full buffers are sent + in the newPixels methods instead of just regions. + + @param fullbuffers - a flag indicating whether to send the full buffers + */ + public synchronized void setFullBufferUpdates(boolean fullbuffers) + { + this.fullbuffers = fullbuffers; + } + + /** + Send an animation frame to the image consumers. + */ + public void newPixels() + { + if( animated == true ) { + ImageConsumer ic; + Enumeration e = consumers.elements(); + for( ; e.hasMoreElements(); ) { + ic = (ImageConsumer)e.nextElement(); + sendPicture( ic ); + ic.imageComplete( ImageConsumer.SINGLEFRAME ); + } + } + } + + + private void sendPicture ( ImageConsumer ic ) + { + ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); + if( props != null ) { + ic.setProperties( props ); + } + if( pixeli != null ) { + ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); + } else { + ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); + } + } + + /** + Send an animation frame to the image consumers containing the specified + pixels unless setFullBufferUpdates is set. + */ + public synchronized void newPixels(int x, + int y, + int w, + int h) + { + if( animated == true ) + { + if( fullbuffers ) { + newPixels(); + } else { + ImageConsumer ic; + Enumeration e = consumers.elements(); + for( ; e.hasMoreElements(); ) { + ic = (ImageConsumer)e.nextElement(); + ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); + if( props != null ) { + ic.setProperties( props ); + } + if( pixeli != null ) { + ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); + } else { + ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); + } + ic.imageComplete( ImageConsumer.SINGLEFRAME ); + } + } + } + } + + + + /** + Send an animation frame to the image consumers containing the specified + pixels unless setFullBufferUpdates is set. + + If framenotify is set then a notification is sent when the frame + is sent otherwise no status is sent. + */ + public synchronized void newPixels(int x, + int y, + int w, + int h, + boolean framenotify) + { + if( animated == true ) + { + if( fullbuffers ) { + newPixels(); + } else { + ImageConsumer ic; + Enumeration e = consumers.elements(); + for( ; e.hasMoreElements(); ) { + ic = (ImageConsumer)e.nextElement(); + ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); + if( props != null ) { + ic.setProperties( props ); + } + if( pixeli != null ) { + ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); + } else { + ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); + } + if( framenotify == true ) + ic.imageComplete( ImageConsumer.SINGLEFRAME ); + } + } + } + } + + public synchronized void newPixels(byte newpix[], + ColorModel newmodel, + int offset, + int scansize) + + { + // FIXME + } + + public synchronized void newPixels(int newpix[], + ColorModel newmodel, + int offset, + int scansize) + + { + // FIXME + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/PackedColorModel.java gcc-3.1/libjava/java/awt/image/PackedColorModel.java *** gcc-3.0.4/libjava/java/awt/image/PackedColorModel.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/PackedColorModel.java Tue Jan 22 22:40:10 2002 *************** *** 1,16 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; import java.awt.Point; import java.awt.color.ColorSpace; ! import gnu.gcj.awt.BitMaskExtent; /** * @author Rolf W. Rasmussen --- 1,44 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; import java.awt.Point; import java.awt.color.ColorSpace; ! import gnu.java.awt.BitMaskExtent; /** * @author Rolf W. Rasmussen diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/PixelGrabber.java gcc-3.1/libjava/java/awt/image/PixelGrabber.java *** gcc-3.0.4/libjava/java/awt/image/PixelGrabber.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/PixelGrabber.java Fri Jan 25 04:39:04 2002 *************** *** 0 **** --- 1,346 ---- + /* PixelGrabber.java -- Java class for providing image data + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + import java.awt.Image; + import java.util.Hashtable; + + /** + PixelGrabber is an ImageConsumer designed to extract a rectangular region of pixels + from an Image + */ + public class PixelGrabber implements ImageConsumer + { + int x, y, width, height, status, scansize, offset; + ColorModel model = ColorModel.getRGBdefault(); + //int hints; + //Hashtable props; + int pixel_bufferi[]; + byte pixel_bufferb[]; + boolean grabbing; + ImageProducer ip; + + /** + * Create a PixelGrabber used to grab pixels from the specified Image + * in the specified rectangle + * + * @param img the Image to grab pixels from + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public PixelGrabber(Image img, int x, int y, int w, int h, + int pix[], int off, int scansize) + { + this( img.getSource(), x, y, w, h, pix, off, scansize ); + } + + /** + * Create a PixelGrabber used to grab pixels from the specified ImageProducer + * in the specified rectangle + * + * @param ip the ImageProducer to grab pixels from + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public PixelGrabber(ImageProducer ip, int x, int y, int w, int h, + int pix[], int off, int scansize) + { + this.ip = ip; + this.x = x; + this.y = y; + this.width = w; + this.height = h; + this.pixel_bufferi = pix; + this.offset = off; + this.scansize = scansize; + pixel_bufferb = new byte[pix.length * 4]; + } + + + /** + * Create a PixelGrabber used to grab pixels from the specified Image + * in the specified rectangle + * + * @param img the Image to grab pixels from + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param forceRGB true to force conversion to RGB + */ + public PixelGrabber(Image img, + int x, int y, + int w, int h, + boolean forceRGB) + { + //FIXME + } + + /** + Start Grabbing Pixels + */ + public synchronized void startGrabbing() + { + if ( grabbing == false ) + { + grabbing = true; + ip.startProduction( this ); + } + } + + /** + Abort the grabbing of pixels + */ + public synchronized void abortGrabbing() + { + if ( grabbing == true ) + { + grabbing = false; + ip.removeConsumer( this ); + } + } + + /** + Grab the Pixels. + + @return true if successful + + @throws InterruptedExcpetion if interrupted by another thread. + */ + public boolean grabPixels() throws InterruptedException + { + return grabPixels(0); + } + + /** + Grab the Pixels and abort if it takes too long + + @return true if successful + + @throws InterruptedExcpetion if interrupted by another thread. + or time runs out + */ + public synchronized boolean grabPixels(long ms) throws InterruptedException + { + startGrabbing(); + + if (ms < 0) + return (status == ImageObserver.ALLBITS); + + wait(ms); + + if (status == ImageObserver.ALLBITS) + return true; + else + return false; + } + + /** + Get the status of the pixel grabbing representing by ImageObserver flags + + @return the status + */ + public synchronized int getStatus() + { + return status; + } + + /** + Return width of pixel region + + @return width of region + */ + public synchronized int getWidth() + { + return width; + } + + /** + Return height of pixel region + + @return height of region + */ + public synchronized int getHeight() + { + return height; + } + + /** + Returns the grabbed pixel buffer + + @return a byte or int array + */ + public synchronized Object getPixels() + { + if( pixel_bufferi != null ) + return pixel_bufferi; + return pixel_bufferb; + } + + /** + Get the ColorModel of the image + + @return the ColorModel + */ + public synchronized ColorModel getColorModel() + { + return model; + } + + /** + * An ImageProducer indicates the size of the image + * being produced using this method. + * + * @param width the width of the image + * @param height the height of the image + */ + public void setDimensions(int width, int height) + { + } + + /** + * An ImageProducer can set a list of properties + * associated with this image by using this method. + * + * @param props the list of properties associated with this image + */ + public void setProperties(Hashtable props) + { + //this.props = props; //FIXME - DO WE NEED THIS + } + + /** + * This ColorModel should indicate the model used by + * the majority of calls to setPixels. Each call to + * setPixels could however indicate a different + * ColorModel. + * + * @param model the color model to be used most often by setPixels + * @see ColorModel + */ + public void setColorModel(ColorModel model) + { + this.model = model; + } + + /** + * The ImageProducer should call this method with a + * bit mask of hints from any of RANDOMPIXELORDER, + * TOPDOWNLEFTRIGHT, COMPLETESCANLINES, + * SINGLEPASS, SINGLEFRAME. + * + * @param flags a bit mask of hints + */ + public void setHints(int flags) + { + //hints = flags; // FIXME - DO NOT KNOW WHAT TO DO WITH THE HINTS + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as a byte at + * index (n * scansize + m + offset). + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { + //FIXME - I hate bytes + int xp, yp; + for( xp = x; xp < ( x + w); xp++ ) + for( yp = y; yp < (y + h); yp++ ) + if( xp >= this.x && + yp >= this.y && + xp <= ( this.x + this.width ) && + yp <= ( this.y + this.height ) ) { + pixel_bufferb[(yp - this.y) * this.scansize + (xp - this.x) + this.offset] = + pixels[ offset + yp * scansize + xp ]; + } + + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as an int at + * index (n * scansize + m + offset). + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { + int xp, yp; + for( xp = x; xp < ( x + w); xp++ ) + for( yp = y; yp < (y + h); yp++ ) + if( xp >= this.x && + yp >= this.y && + xp <= ( this.x + this.width ) && + yp <= ( this.y + this.height ) ) { + pixel_bufferi[(yp - this.y) * this.scansize + (xp - this.x) + this.offset] = + pixels[ offset + yp * scansize + xp ]; + } + } + + /** + * The ImageProducer calls this method to indicate a + * single frame or the entire image is complete. The method is + * also used to indicate an error in loading or producing the + * image. + */ + public synchronized void imageComplete(int status) + { + this.status = status; + } + + /** + @deprecated by getStatus + */ + public synchronized int status() + { + return getStatus(); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/RGBImageFilter.java gcc-3.1/libjava/java/awt/image/RGBImageFilter.java *** gcc-3.0.4/libjava/java/awt/image/RGBImageFilter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/RGBImageFilter.java Thu Jan 24 01:05:12 2002 *************** *** 0 **** --- 1,244 ---- + /* RGBImageFilter.java -- Java class for filtering Pixels by RGB values + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + /** + * A filter designed to filter images in the default RGBColorModel regardless of + * the ImageProducer's ColorModel. + * + * @author Mark Benvenuto + */ + public abstract class RGBImageFilter extends ImageFilter + { + protected ColorModel origmodel = ColorModel.getRGBdefault(); + + protected ColorModel newmodel; + + /** + Specifies whether to apply the filter to the index entries of the + IndexColorModel. Subclasses should set this to true if the filter + does not depend on the pixel's coordinate. + */ + protected boolean canFilterIndexColorModel = false; + + /** + Construct new RGBImageFilter. + */ + public RGBImageFilter() + { + } + + /** + * Sets the ColorModel used to filter with. If the specified ColorModel is IndexColorModel + * and canFilterIndexColorModel is true, we subsitute the ColorModel for a filtered one + * here and in setPixels whenever the original one appears. Otherwise overrides the default + * ColorModel of ImageProducer and specifies the default RGBColorModel + * + * @param model the color model to be used most often by setPixels + * @see ColorModel */ + public void setColorModel(ColorModel model) + { + origmodel = model; + newmodel = model; + + if( ( model instanceof IndexColorModel) && canFilterIndexColorModel ) { + newmodel = filterIndexColorModel( (IndexColorModel) model ); + } + } + + /** + Registers a new ColorModel to subsitute for the old ColorModel when + setPixels encounters the a pixel with the old ColorModel. The pixel + remains unchanged except for a new ColorModel. + + @param oldcm the old ColorModel + @param newcm the new ColorModel + */ + public void substituteColorModel(ColorModel oldcm, + ColorModel newcm) + { + origmodel = oldcm; + newmodel = newcm; + } + + /** + Filters an IndexColorModel through the filterRGB function. Uses + coordinates of -1 to indicate its filtering an index and not a pixel. + + @param icm an IndexColorModel to filter + */ + public IndexColorModel filterIndexColorModel(IndexColorModel icm) + { + int len = icm.getMapSize(), rgb; + byte reds[] = new byte[len], greens[] = new byte[len], blues[] = new byte[len], alphas[] = new byte[len]; + + icm.getAlphas( alphas ); + icm.getReds( reds ); + icm.getGreens( greens ); + icm.getBlues( blues ); + + for( int i = 0; i < len; i++ ) + { + rgb = filterRGB( -1, -1, makeColor ( alphas[i], reds[i], greens[i], blues[i] ) ); + alphas[i] = (byte)(( 0xff000000 & rgb ) >> 24); + reds[i] = (byte)(( 0xff0000 & rgb ) >> 16); + greens[i] = (byte)(( 0xff00 & rgb ) >> 8); + blues[i] = (byte)(0xff & rgb); + } + return new IndexColorModel( icm.getPixelSize(), len, reds, greens, blues, alphas ); + } + + private int makeColor( byte a, byte r, byte g, byte b ) + { + return ( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); + } + + /** + This functions filters a set of RGB pixels through filterRGB. + + @param x the x coordinate of the rectangle + @param y the y coordinate of the rectangle + @param w the width of the rectangle + @param h the height of the rectangle + @param model the ColorModel used to translate the pixels + @param pixels the array of pixel values + @param offset the index of the first pixels in the pixels array + @param scansize the width to use in extracting pixels from the pixels array + */ + public void filterRGBPixels(int x, + int y, + int w, + int h, + int[] pixels, + int off, + int scansize) + { + int xp, yp, i; + + for( xp = x; xp < ( x + w); xp++ ) + for( yp = y; yp < (y + h); yp++ ) + pixels[ off + yp * scansize + xp ] = filterRGB( xp, yp, pixels[ off + yp * scansize + xp ] ); + } + + + /** + * If the ColorModel is the same ColorModel which as already converted + * then it converts it the converted ColorModel. Otherwise it passes the + * array of pixels through filterRGBpixels. + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { + if( model == origmodel ) { + consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize); + } else { + //FIXME + //convert to proper CM + int pixelsi[] = new int[ pixels.length / 4 ]; + filterRGBPixels( x, y, w, h, pixelsi, offset, scansize ); + } + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as an int at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { + if( model == origmodel ) { + consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize); + } else { + convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize ); + filterRGBPixels( x, y, w, h, pixels, offset, scansize ); + } + } + + private void convertColorModelToDefault( int x, int y, int w, int h, + ColorModel model, int pixels[], int offset, int scansize) + { + int xp, yp, i; + + for( xp = x; xp < ( x + w); xp++ ) + for( yp = y; yp < (y + h); yp++ ) + pixels[ offset + yp * scansize + xp ] = makeColorbyDefaultCM( pixels[ offset + yp * scansize + xp ] ); + + } + private int makeColorbyDefaultCM( int rgb ) + { + return makeColor( origmodel.getRed( rgb ), origmodel.getGreen( rgb ), origmodel.getGreen( rgb ), origmodel.getBlue( rgb ) ); + } + + + private int makeColor( int a, int r, int g, int b ) + { + return (int)( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); + } + + + /** + Filters a single pixel from the default ColorModel. + + @param x x-coordinate + @param y y-coordinate + @param rgb color + */ + public abstract int filterRGB(int x, + int y, + int rgb); + } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/Raster.java gcc-3.1/libjava/java/awt/image/Raster.java *** gcc-3.0.4/libjava/java/awt/image/Raster.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/Raster.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/RasterOp.java gcc-3.1/libjava/java/awt/image/RasterOp.java *** gcc-3.0.4/libjava/java/awt/image/RasterOp.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/RasterOp.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/ReplicateScaleFilter.java gcc-3.1/libjava/java/awt/image/ReplicateScaleFilter.java *** gcc-3.0.4/libjava/java/awt/image/ReplicateScaleFilter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/awt/image/ReplicateScaleFilter.java Thu Jan 24 01:05:12 2002 *************** *** 0 **** --- 1,163 ---- + /* ReplicateScaleFilter.java -- Java class for filtering images + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.image; + + import java.util.Hashtable; + + /** + * This filter should be used for fast scaling of images where the result + * does not need to ensure straight lines are still straight, etc. The + * exact method is not defined by Sun but some sort of fast Box filter should + * probably be correct. + *
    + * Currently this filter does nothing and needs to be implemented. + * + * @author C. Brian Jones (cbj@gnu.org) + */ + public class ReplicateScaleFilter extends ImageFilter + { + public ReplicateScaleFilter(int width, int height) { + destHeight = height; + destWidth = width; + } + + /** + * The height of the destination image. + */ + protected int destHeight; + + /** + * The width of the destination image. + */ + protected int destWidth; + + /** + * The height of the source image. + */ + protected int srcHeight; + + /** + * The width of the source image. + */ + protected int srcWidth; + + /** + * + */ + protected int srcrows[]; + + /** + * + */ + protected int srccols[]; + + /** + * + */ + protected Object outpixbuf; + + /** + * An ImageProducer indicates the size of the image + * being produced using this method. A filter can override this + * method to intercept these calls from the producer in order to + * change either the width or the height before in turn calling + * the consumer's setDimensions method. + * + * @param width the width of the image + * @param height the height of the image + */ + public void setDimensions(int width, int height) + { + consumer.setDimensions(width, height); + } + + /** + * An ImageProducer can set a list of properties + * associated with this image by using this method. + * + * @param props the list of properties associated with this image + */ + public void setProperties(Hashtable props) + { + props.put("filters", "ReplicateScaleFilter"); + consumer.setProperties(props); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as a byte at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, byte[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + /** + * This function delivers a rectangle of pixels where any + * pixel(m,n) is stored in the array as an int at + * index (n * scansize + m + offset). + * + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param model the ColorModel used to translate the pixels + * @param pixels the array of pixel values + * @param offset the index of the first pixels in the pixels array + * @param scansize the width to use in extracting pixels from the pixels array + */ + public void setPixels(int x, int y, int w, int h, + ColorModel model, int[] pixels, int offset, int scansize) + { + consumer.setPixels(x, y, w, h, model, pixels, offset, scansize); + } + + } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/SampleModel.java gcc-3.1/libjava/java/awt/image/SampleModel.java *** gcc-3.0.4/libjava/java/awt/image/SampleModel.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/SampleModel.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; *************** public abstract class SampleModel *** 80,86 **** * * This method is provided as a faster alternative to getPixel(), * that can be used when there is no need to decode the pixel into ! * seperate sample values. * * @param obj An array to return the pixel data in. If null, an * array of the right type and size will be created. --- 108,114 ---- * * This method is provided as a faster alternative to getPixel(), * that can be used when there is no need to decode the pixel into ! * separate sample values. * * @param obj An array to return the pixel data in. If null, an * array of the right type and size will be created. *************** public abstract class SampleModel *** 179,185 **** for (int b=0; b --- 1,43 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; ! import gnu.java.awt.BitMaskExtent; ! import gnu.java.awt.Buffers; /** * @author Rolf W. Rasmussen diff -Nrc3pad gcc-3.0.4/libjava/java/awt/image/WritableRaster.java gcc-3.1/libjava/java/awt/image/WritableRaster.java *** gcc-3.0.4/libjava/java/awt/image/WritableRaster.java Tue Aug 29 03:23:57 2000 --- gcc-3.1/libjava/java/awt/image/WritableRaster.java Tue Jan 22 22:40:10 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.awt.image; --- 1,38 ---- ! /* Copyright (C) 2000, 2002 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.image; diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/ButtonPeer.java gcc-3.1/libjava/java/awt/peer/ButtonPeer.java *** gcc-3.0.4/libjava/java/awt/peer/ButtonPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/ButtonPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface ButtonPeer extends ComponentPeer { ! void setLabel(String label); ! } --- 1,47 ---- ! /* ButtonPeer.java -- Peer interface for buttons ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface ButtonPeer extends ComponentPeer { ! ! public abstract void setLabel(String label); ! ! } // interface ButtonPeer diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/CanvasPeer.java gcc-3.1/libjava/java/awt/peer/CanvasPeer.java *** gcc-3.0.4/libjava/java/awt/peer/CanvasPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/CanvasPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,13 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface CanvasPeer extends ComponentPeer { ! } --- 1,45 ---- ! /* CanvasPeer.java -- Peer interface for a canvas ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface CanvasPeer extends ComponentPeer { ! ! } // interface CanvasPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/CheckboxMenuItemPeer.java gcc-3.1/libjava/java/awt/peer/CheckboxMenuItemPeer.java *** gcc-3.0.4/libjava/java/awt/peer/CheckboxMenuItemPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/CheckboxMenuItemPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface CheckboxMenuItemPeer extends MenuItemPeer { ! void setState(boolean state); ! } --- 1,47 ---- ! /* CheckboxMenuItemPeer.java -- Peer interface for checkbox menu items ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface CheckboxMenuItemPeer extends MenuItemPeer { ! ! public abstract void setState(boolean state); ! ! } // interface CheckboxMenuItemPeer diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/CheckboxPeer.java gcc-3.1/libjava/java/awt/peer/CheckboxPeer.java *** gcc-3.0.4/libjava/java/awt/peer/CheckboxPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/CheckboxPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,16 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface CheckboxPeer extends ComponentPeer { ! void setCheckboxGroup(java.awt.CheckboxGroup group); ! void setLabel(String label); ! void setState(boolean state); ! } --- 1,49 ---- ! /* CheckboxPeer.java -- Interface for checkbox peer ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface CheckboxPeer extends ComponentPeer { ! ! public abstract void setCheckboxGroup(java.awt.CheckboxGroup group); ! public abstract void setLabel(String label); ! public abstract void setState(boolean state); ! ! } // interface CheckboxPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/ChoicePeer.java gcc-3.1/libjava/java/awt/peer/ChoicePeer.java *** gcc-3.0.4/libjava/java/awt/peer/ChoicePeer.java Wed Oct 11 09:47:25 2000 --- gcc-3.1/libjava/java/awt/peer/ChoicePeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,17 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface ChoicePeer extends ComponentPeer { ! void add(String item, int index); ! void remove(int index); ! void select(int index); ! } --- 1,50 ---- ! /* ChoicePeer.java -- Peer for choice box ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface ChoicePeer extends ComponentPeer { ! ! public abstract void add(String item, int index); ! public abstract void addItem(String item, int index); ! public abstract void remove(int index); ! public abstract void select(int index); ! ! } // interface ChoicePeer diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/ComponentPeer.java gcc-3.1/libjava/java/awt/peer/ComponentPeer.java *** gcc-3.0.4/libjava/java/awt/peer/ComponentPeer.java Wed Jan 3 00:07:13 2001 --- gcc-3.1/libjava/java/awt/peer/ComponentPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* ComponentPeer.java -- Toplevel component peer ! Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.image.*; *** 13,22 **** public interface ComponentPeer { ! int checkImage(Image img, int width, int height, ImageObserver o); ! Image createImage(ImageProducer prod); ! Image createImage(int width, int height); ! void dispose(); /** * Get the graphics configuration of the component. The color model --- 43,84 ---- public interface ComponentPeer { ! public int checkImage(Image img, int width, int height, ! ImageObserver ob); ! public Image createImage(ImageProducer prod); ! public Image createImage(int width, int height); ! public void disable(); ! public void dispose(); ! public void enable(); ! public ColorModel getColorModel(); ! public FontMetrics getFontMetrics(Font f); ! public Graphics getGraphics(); ! public Point getLocationOnScreen(); ! public Dimension getMinimumSize(); ! public Dimension getPreferredSize(); ! public Toolkit getToolkit(); ! // The JCL says that handleEvent returns boolean. However, we've ! // experimentally determined that it in fact actually returns void. ! public void handleEvent(AWTEvent e); ! public void hide(); ! public boolean isFocusTraversable(); ! public Dimension minimumSize(); ! public Dimension preferredSize(); ! public void paint(Graphics graphics); ! public boolean prepareImage(Image img, int width, int height, ! ImageObserver ob); ! public void print(Graphics graphics); ! public void repaint(long tm, int x, int y, int width, int height); ! public void requestFocus(); ! public void reshape(int x, int y, int width, int height); ! public void setBackground(Color color); ! public void setBounds(int x, int y, int width, int height); ! public void setCursor(Cursor cursor); ! public void setEnabled(boolean enabled); ! public void setFont(Font font); ! public void setForeground(Color color); ! public void setVisible(boolean visible); ! public void show(); /** * Get the graphics configuration of the component. The color model *************** public interface ComponentPeer *** 24,50 **** */ GraphicsConfiguration getGraphicsConfiguration(); ! FontMetrics getFontMetrics(Font f); ! Graphics getGraphics(); ! Point getLocationOnScreen(); ! Dimension getMinimumSize(); ! Dimension getPreferredSize(); ! Toolkit getToolkit(); ! // The JCL says that handleEvent returns boolean. However, we've ! // experimentally determined that it in fact actually returns void. ! void handleEvent(AWTEvent e); ! boolean isFocusTraversable(); ! void paint(Graphics graphics); ! boolean prepareImage(Image img, int width, int height, ImageObserver o); ! void print(Graphics graphics); ! void repaint(long tm, int x, int y, int width, int height); ! void requestFocus(); ! void setBackground(Color color); ! void setBounds(int x, int y, int width, int height); ! void setCursor(Cursor cursor); ! void setEnabled(boolean enabled); ! void setEventMask(long eventMask); ! void setFont(Font font); ! void setForeground(Color color); ! void setVisible(boolean visible); } --- 86,90 ---- */ GraphicsConfiguration getGraphicsConfiguration(); ! public void setEventMask (long mask); } diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/ContainerPeer.java gcc-3.1/libjava/java/awt/peer/ContainerPeer.java *** gcc-3.0.4/libjava/java/awt/peer/ContainerPeer.java Mon Oct 2 05:14:25 2000 --- gcc-3.1/libjava/java/awt/peer/ContainerPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* ContainerPeer.java -- Interface for container peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.Insets; *** 12,18 **** public interface ContainerPeer extends ComponentPeer { ! Insets getInsets(); ! void beginValidate(); ! void endValidate(); ! } --- 42,52 ---- public interface ContainerPeer extends ComponentPeer { ! ! public abstract Insets insets(); ! public abstract Insets getInsets(); ! public abstract void beginValidate(); ! public abstract void endValidate(); ! ! } // interface ContainerPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/DialogPeer.java gcc-3.1/libjava/java/awt/peer/DialogPeer.java *** gcc-3.0.4/libjava/java/awt/peer/DialogPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/DialogPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface DialogPeer extends WindowPeer { ! void setResizable(boolean resizeable); ! void setTitle(String title); ! } --- 1,48 ---- ! /* DialogPeer.java -- Interface for dialog box peer ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface DialogPeer extends WindowPeer { ! ! public abstract void setResizable(boolean resizeable); ! public abstract void setTitle(String title); ! ! } // interface DialogPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/FileDialogPeer.java gcc-3.1/libjava/java/awt/peer/FileDialogPeer.java *** gcc-3.0.4/libjava/java/awt/peer/FileDialogPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/FileDialogPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* FileDialogPeer.java -- Interface for file selection dialog box peer ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.io.FilenameFilter; *** 12,18 **** public interface FileDialogPeer extends DialogPeer { ! void setDirectory(String dir); ! void setFile(String file); ! void setFilenameFilter(FilenameFilter filter); ! } --- 42,51 ---- public interface FileDialogPeer extends DialogPeer { ! ! public abstract void setFile(String file); ! public abstract void setDirectory(String dir); ! public abstract void setFilenameFilter(FilenameFilter ff); ! ! } // interface FileDialogPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/FontPeer.java gcc-3.1/libjava/java/awt/peer/FontPeer.java *** gcc-3.0.4/libjava/java/awt/peer/FontPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/FontPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,13 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface FontPeer { ! } --- 1,45 ---- ! /* FontPeer.java -- Interface for font peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface FontPeer { ! ! } // interface FontPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/FramePeer.java gcc-3.1/libjava/java/awt/peer/FramePeer.java *** gcc-3.0.4/libjava/java/awt/peer/FramePeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/FramePeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* FramePeer.java -- Interface for frame peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.MenuBar; *** 13,20 **** public interface FramePeer extends WindowPeer { ! void setIconImage(Image image); ! void setMenuBar(MenuBar mb); ! void setResizable(boolean resizable); ! void setTitle(String title); ! } --- 43,53 ---- public interface FramePeer extends WindowPeer { ! ! public abstract void setIconImage(Image image); ! public abstract void setMenuBar(MenuBar mb); ! public abstract void setResizable(boolean resizable); ! public abstract void setTitle(String title); ! ! } // interface FramePeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/LabelPeer.java gcc-3.1/libjava/java/awt/peer/LabelPeer.java *** gcc-3.0.4/libjava/java/awt/peer/LabelPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/LabelPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface LabelPeer extends ComponentPeer { ! void setAlignment(int alignment); ! void setText(String text); ! } --- 1,48 ---- ! /* LabelPeer.java -- Interface for simple text lable peer ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface LabelPeer extends ComponentPeer { ! ! public abstract void setAlignment(int alignment); ! public abstract void setText(String text); ! ! } // interface LabelPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/LightweightPeer.java gcc-3.1/libjava/java/awt/peer/LightweightPeer.java *** gcc-3.0.4/libjava/java/awt/peer/LightweightPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/LightweightPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,13 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface LightweightPeer extends ComponentPeer { ! } --- 1,45 ---- ! /* LightweightPeer.java -- Interface for lightweight peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface LightweightPeer extends ComponentPeer { ! ! } // interface LightweightPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/ListPeer.java gcc-3.1/libjava/java/awt/peer/ListPeer.java *** gcc-3.0.4/libjava/java/awt/peer/ListPeer.java Wed Oct 11 09:47:25 2000 --- gcc-3.1/libjava/java/awt/peer/ListPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* ListPeer.java -- Interface for list box peer ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.Dimension; *** 12,23 **** public interface ListPeer extends ComponentPeer { ! void add(String item, int index); ! void delItems(int start_index, int end_index); ! void deselect(int index); ! int[] getSelectedIndexes(); ! void makeVisible(int index); ! void removeAll(); ! void select(int index); ! void setMultipleMode(boolean multipleMode); ! } --- 42,61 ---- public interface ListPeer extends ComponentPeer { ! ! public abstract void add(String item, int index); ! public abstract void addItem(String item, int index); ! public abstract void clear(); ! public abstract void delItems(int start_index, int end_index); ! public abstract void deselect(int index); ! public abstract int[] getSelectedIndexes(); ! public abstract void makeVisible(int index); ! public abstract Dimension minimumSize(int s); ! public abstract Dimension preferredSize(int s); ! public abstract void removeAll(); ! public abstract void select(int index); ! public abstract void setMultipleMode(boolean multi); ! public abstract void setMultipleSelections(boolean multi); ! ! } // interface ListPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/MenuBarPeer.java gcc-3.1/libjava/java/awt/peer/MenuBarPeer.java *** gcc-3.0.4/libjava/java/awt/peer/MenuBarPeer.java Wed Oct 11 09:47:25 2000 --- gcc-3.1/libjava/java/awt/peer/MenuBarPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* MenuBarPeer.java -- Interface for menu bar peer ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.Menu; *** 12,18 **** public interface MenuBarPeer extends MenuComponentPeer { ! void addHelpMenu(Menu menu); ! void add(Menu menu); ! void remove(int index); ! } --- 42,51 ---- public interface MenuBarPeer extends MenuComponentPeer { ! ! public abstract void addHelpMenu(Menu menu); ! public abstract void addMenu(Menu menu); ! public abstract void delMenu(int index); ! ! } // interface MenuBarPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/MenuComponentPeer.java gcc-3.1/libjava/java/awt/peer/MenuComponentPeer.java *** gcc-3.0.4/libjava/java/awt/peer/MenuComponentPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/MenuComponentPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,14 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface MenuComponentPeer { ! void dispose(); ! } --- 1,47 ---- ! /* MenuComponentPeer.java -- ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface MenuComponentPeer { ! ! public abstract void dispose(); ! ! } // interface MenuComponentPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/MenuItemPeer.java gcc-3.1/libjava/java/awt/peer/MenuItemPeer.java *** gcc-3.0.4/libjava/java/awt/peer/MenuItemPeer.java Wed Oct 11 09:47:25 2000 --- gcc-3.1/libjava/java/awt/peer/MenuItemPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface MenuItemPeer extends MenuComponentPeer { ! void setEnabled(boolean enabled); ! void setLabel(String text); ! } --- 1,50 ---- ! /* MenuItemPeer.java -- Interface for menu item peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface MenuItemPeer extends MenuComponentPeer { ! ! public abstract void disable(); ! public abstract void enable(); ! public abstract void setEnabled(boolean enabled); ! public abstract void setLabel(String text); ! ! } // interface MenuItemPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/MenuPeer.java gcc-3.1/libjava/java/awt/peer/MenuPeer.java *** gcc-3.0.4/libjava/java/awt/peer/MenuPeer.java Wed Oct 11 09:47:25 2000 --- gcc-3.1/libjava/java/awt/peer/MenuPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* MenuPeer.java -- Interface for menu peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.MenuItem; *** 12,18 **** public interface MenuPeer extends MenuItemPeer { ! void add(MenuItem item); ! void addSeparator(); ! void remove(int index); } --- 42,49 ---- public interface MenuPeer extends MenuItemPeer { ! public abstract void addItem (MenuItem item); ! public abstract void addSeparator (); ! public abstract void delItem (int index); } + diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/PanelPeer.java gcc-3.1/libjava/java/awt/peer/PanelPeer.java *** gcc-3.0.4/libjava/java/awt/peer/PanelPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/PanelPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,13 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface PanelPeer extends ContainerPeer { ! } --- 1,45 ---- ! /* PanelPeer.java -- Interface for panel peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface PanelPeer extends ContainerPeer { ! ! } // interface PanelPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/PopupMenuPeer.java gcc-3.1/libjava/java/awt/peer/PopupMenuPeer.java *** gcc-3.0.4/libjava/java/awt/peer/PopupMenuPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/PopupMenuPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,16 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.awt.peer; ! import java.awt.Event; public interface PopupMenuPeer extends MenuPeer { ! void show(Event e); ! } --- 1,48 ---- ! /* PopupMenuPeer.java -- Interface for popup menu peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.awt.peer; + + import java.awt.Component; public interface PopupMenuPeer extends MenuPeer { ! ! public abstract void show (Component origin, int x, int y); ! ! } // interface PopupMenuPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/ScrollPanePeer.java gcc-3.1/libjava/java/awt/peer/ScrollPanePeer.java *** gcc-3.0.4/libjava/java/awt/peer/ScrollPanePeer.java Wed Jan 3 20:34:44 2001 --- gcc-3.1/libjava/java/awt/peer/ScrollPanePeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* ScrollPanePeer.java -- Interface for scrollable panes ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.Adjustable; *** 12,21 **** public interface ScrollPanePeer extends ContainerPeer { ! void childResized(int width, int height); ! int getHScrollbarHeight(); ! int getVScrollbarWidth(); ! void setScrollPosition(int x, int y); ! void setUnitIncrement(Adjustable adj, int increment); ! void setValue(Adjustable adj, int value); ! } --- 42,54 ---- public interface ScrollPanePeer extends ContainerPeer { ! ! public abstract int getHScrollbarHeight(); ! public abstract int getVScrollbarWidth(); ! public abstract void setScrollPosition(int h, int v); ! public abstract void childResized(int width, int height); ! public abstract void setUnitIncrement(Adjustable item, int inc); ! public abstract void setValue(Adjustable item, int value); ! ! } // interface ScollPanePeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/ScrollbarPeer.java gcc-3.1/libjava/java/awt/peer/ScrollbarPeer.java *** gcc-3.0.4/libjava/java/awt/peer/ScrollbarPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/ScrollbarPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,16 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface ScrollbarPeer extends ComponentPeer { ! void setLineIncrement(int increment); ! void setPageIncrement(int increment); ! void setValues(int value, int visible, int minimum, int maximum); ! } --- 1,49 ---- ! /* ScrollbarPeer.java -- Interface for scrollbar peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface ScrollbarPeer extends ComponentPeer { ! ! public abstract void setLineIncrement(int inc); ! public abstract void setPageIncrement(int inc); ! public abstract void setValues(int value, int visible, int min, int max); ! ! } // interface ScrollbarPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/TextAreaPeer.java gcc-3.1/libjava/java/awt/peer/TextAreaPeer.java *** gcc-3.0.4/libjava/java/awt/peer/TextAreaPeer.java Wed Oct 11 09:47:25 2000 --- gcc-3.1/libjava/java/awt/peer/TextAreaPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* TextAreaPeer.java -- Interface for text area peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.Dimension; *** 12,17 **** public interface TextAreaPeer extends TextComponentPeer { ! void insert(String text, int pos); ! void replaceRange(String text, int start, int end); ! } --- 42,55 ---- public interface TextAreaPeer extends TextComponentPeer { ! ! public abstract void insert(String text, int pos); ! public abstract void insertText(String text, int pos); ! public abstract Dimension minimumSize(int rows, int cols); ! public abstract Dimension getMinimumSize(int rows, int cols); ! public abstract Dimension preferredSize(int rows, int cols); ! public abstract Dimension getPreferredSize(int rows, int cols); ! public abstract void replaceRange(String text, int start_pos, int end_pos); ! public abstract void replaceText(String text, int start_pos, int end_pos); ! ! } // interface TextAreaPeer diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/TextComponentPeer.java gcc-3.1/libjava/java/awt/peer/TextComponentPeer.java *** gcc-3.0.4/libjava/java/awt/peer/TextComponentPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/TextComponentPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,21 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface TextComponentPeer extends ComponentPeer { ! int getCaretPosition(); ! int getSelectionEnd(); ! int getSelectionStart(); ! String getText(); ! void select(int start, int end); ! void setCaretPosition(int pos); ! void setEditable(boolean editable); ! void setText(String text); ! } --- 1,54 ---- ! /* TextComponentPeer.java -- Superclass interface for text components ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface TextComponentPeer extends ComponentPeer { ! ! public abstract int getSelectionEnd(); ! public abstract int getSelectionStart(); ! public abstract String getText(); ! public abstract void setText(String text); ! public abstract void select(int start_pos, int end_pos); ! public abstract void setEditable(boolean editable); ! public abstract int getCaretPosition(); ! public abstract void setCaretPosition(int pos); ! ! } // interface TextComponentPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/TextFieldPeer.java gcc-3.1/libjava/java/awt/peer/TextFieldPeer.java *** gcc-3.0.4/libjava/java/awt/peer/TextFieldPeer.java Wed Oct 11 09:47:25 2000 --- gcc-3.1/libjava/java/awt/peer/TextFieldPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; --- 1,40 ---- ! /* TextFieldPeer.java -- Interface for text field peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; *************** import java.awt.Dimension; *** 12,16 **** public interface TextFieldPeer extends TextComponentPeer { ! void setEchoChar(char echo); ! } --- 42,54 ---- public interface TextFieldPeer extends TextComponentPeer { ! ! public abstract Dimension minimumSize(int len); ! public abstract Dimension preferredSize(int len); ! public abstract Dimension getMinimumSize(int len); ! public abstract Dimension getPreferredSize(int len); ! public abstract void setEchoChar(char echo_char); ! public abstract void setEchoCharacter(char echo_char); ! ! } // interface TextFieldPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/awt/peer/WindowPeer.java gcc-3.1/libjava/java/awt/peer/WindowPeer.java *** gcc-3.0.4/libjava/java/awt/peer/WindowPeer.java Wed Jul 12 03:32:07 2000 --- gcc-3.1/libjava/java/awt/peer/WindowPeer.java Tue Jan 22 22:58:09 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.awt.peer; public interface WindowPeer extends ContainerPeer { ! void toBack(); ! void toFront(); ! } --- 1,48 ---- ! /* WindowPeer.java -- Interface for window peers ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.awt.peer; public interface WindowPeer extends ContainerPeer { ! ! public abstract void toBack(); ! public abstract void toFront(); ! ! } // interface WindowPeer ! diff -Nrc3pad gcc-3.0.4/libjava/java/beans/AppletInitializer.java gcc-3.1/libjava/java/beans/AppletInitializer.java *** gcc-3.0.4/libjava/java/beans/AppletInitializer.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/beans/AppletInitializer.java Tue Jan 22 22:40:11 2002 *************** *** 0 **** --- 1,61 ---- + /* java.beans.AppletInitializer + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.beans; + + import java.applet.Applet; + import java.beans.beancontext.BeanContext; + + + /** This interface is a mechanism for the initialization of a Java + * Bean that is also an Applet. It is used by + * Beans.instantiate(). + * + * @author Tom Tromey + * @since 1.2 + */ + public interface AppletInitializer + { + /** Activate the applet. */ + public void activate (Applet applet); + + /** This method will be called by Beans.instantiate() + * to associated the new Applet with its AppletContext, AppletStub, + * and Container. + */ + public void initialize (Applet applet, BeanContext context); + } diff -Nrc3pad gcc-3.0.4/libjava/java/beans/BeanDescriptor.java gcc-3.1/libjava/java/beans/BeanDescriptor.java *** gcc-3.0.4/libjava/java/beans/BeanDescriptor.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/BeanDescriptor.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/BeanInfo.java gcc-3.1/libjava/java/beans/BeanInfo.java *** gcc-3.0.4/libjava/java/beans/BeanInfo.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/BeanInfo.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/Beans.java gcc-3.1/libjava/java/beans/Beans.java *** gcc-3.0.4/libjava/java/beans/Beans.java Thu Jan 18 00:43:17 2001 --- gcc-3.1/libjava/java/beans/Beans.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/Customizer.java gcc-3.1/libjava/java/beans/Customizer.java *** gcc-3.0.4/libjava/java/beans/Customizer.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/Customizer.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/DesignMode.java gcc-3.1/libjava/java/beans/DesignMode.java *** gcc-3.0.4/libjava/java/beans/DesignMode.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/DesignMode.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/EventSetDescriptor.java gcc-3.1/libjava/java/beans/EventSetDescriptor.java *** gcc-3.0.4/libjava/java/beans/EventSetDescriptor.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/EventSetDescriptor.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/FeatureDescriptor.java gcc-3.1/libjava/java/beans/FeatureDescriptor.java *** gcc-3.0.4/libjava/java/beans/FeatureDescriptor.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/FeatureDescriptor.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/IndexedPropertyDescriptor.java gcc-3.1/libjava/java/beans/IndexedPropertyDescriptor.java *** gcc-3.0.4/libjava/java/beans/IndexedPropertyDescriptor.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/IndexedPropertyDescriptor.java Tue Jan 22 22:40:11 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; diff -Nrc3pad gcc-3.0.4/libjava/java/beans/IntrospectionException.java gcc-3.1/libjava/java/beans/IntrospectionException.java *** gcc-3.0.4/libjava/java/beans/IntrospectionException.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/IntrospectionException.java Sun Mar 24 21:32:22 2002 *************** *** 1,5 **** ! /* java.beans.IntrospectionException ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- ! /* IntrospectionException -- thrown when an exception occurs in introspection ! Copyright (C) 1998, 2002 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,46 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; /** ! ** IntrospectionException is thrown when the Introspector fails. Surprise, surprise. ! ** ! ** @author John Keiser ! ** @since JDK1.1 ! ** @version 1.1.0, 31 May 1998 ! ** @see java.beans.Introspector ! **/ ! public class IntrospectionException extends Exception { ! /** Instantiate this exception with the given message. ! ** @param msg the message for the exception. ! **/ ! public IntrospectionException(String msg) { ! super(msg); ! } } --- 18,67 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; /** ! * IntrospectionException is thrown when the Introspector fails. Typical ! * causes are the inability to map a name to its Class, or specifying a ! * wrong type signature. ! * ! * @author John Keiser ! * @see Introspector ! * @since 1.1 ! * @status updated to 1.4 ! */ ! public class IntrospectionException extends Exception ! { ! /** ! * Compatible with JDK 1.1+. ! */ ! private static final long serialVersionUID = -3728150539969542619L; ! /** ! * Instantiate this exception with the given message. ! * ! * @param msg the message for the exception ! */ ! public IntrospectionException(String msg) ! { ! super(msg); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/beans/Introspector.java gcc-3.1/libjava/java/beans/Introspector.java *** gcc-3.0.4/libjava/java/beans/Introspector.java Fri May 19 17:55:30 2000 --- gcc-3.1/libjava/java/beans/Introspector.java Sun Mar 24 21:32:22 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.beans; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.beans; *************** import java.lang.reflect.*; *** 33,427 **** import gnu.java.lang.*; /** ! ** Introspector is the class that does the bulk of the ! ** design-time work in Java Beans. Every class must have ! ** a BeanInfo in order for an RAD tool to use it; but, as ! ** promised, you don't have to write the BeanInfo class ! ** yourself if you don't want to. All you have to do is ! ** call getBeanInfo() in the Introspector and it will use ! ** standard JavaBeans-defined method signatures to ! ** determine the information about your class.

    ! ** ! ** Don't worry about it too much, though: you can provide ! ** JavaBeans with as much customized information as you ! ** want, or as little as you want, using the BeanInfo ! ** interface (see BeanInfo for details).

    ! ** ! ** Order of Operations

    ! ** ! ** When you call getBeanInfo(class c), the Introspector ! ** first searches for BeanInfo class to see if you ! ** provided any explicit information. It searches for a ! ** class named BeanInfo in different ! ** packages, first searching the bean class's package ! ** and then moving on to search the beanInfoSearchPath.

    ! ** ! ** If it does not find a BeanInfo class, it acts as though ! ** it had found a BeanInfo class returning null from all ! ** methods (meaning it should discover everything through ! ** Introspection). If it does, then it takes the ! ** information it finds in the BeanInfo class to be ! ** canonical (that is, the information speaks for its ! ** class as well as all superclasses).

    ! ** ! ** When it has introspected the class, calls ! ** getBeanInfo(c.getSuperclass) and adds that information ! ** to the information it has, not adding to any information ! ** it already has that is canonical.

    ! ** ! ** Introspection Design Patterns

    ! ** ! ** When the Introspector goes in to read the class, it ! ** follows a well-defined order in order to not leave any ! ** methods unaccounted for. Its job is to step over all ! ** of the public methods in a class and determine whether ! ** they are part of a property, an event, or a method (in ! ** that order). ! ** ! ** ! ** Properties:

    ! ** ! **

      ! **
    1. If there is a public boolean isXXX() ! ** method, then XXX is a read-only boolean property. ! ** boolean getXXX() may be supplied in ! ** addition to this method, although isXXX() is the ! ** one that will be used in this case and getXXX() ! ** will be ignored. If there is a ! ** public void setXXX(boolean) method, ! ** it is part of this group and makes it a read-write ! ** property.
    2. ! **
    3. If there is a ! ** public <type> getXXX(int) ! ** method, then XXX is a read-only indexed property of ! ** type <type>. If there is a ! ** public void setXXX(int,<type>) ! ** method, then it is a read-write indexed property of ! ** type <type>. There may also be a ! ** public <type>[] getXXX() and a ! ** public void setXXX(<type>) ! ** method as well.
    4. ! **
    5. If there is a ! ** public void setXXX(int,<type>) ! ** method, then it is a write-only indexed property of ! ** type <type>. There may also be a ! ** public <type>[] getXXX() and a ! ** public void setXXX(<type>) ! ** method as well.
    6. ! **
    7. If there is a ! ** public <type> getXXX() method, ! ** then XXX is a read-only property of type ! ** <type>. If there is a ! ** public void setXXX(<type>) ! ** method, then it will be used for the property and ! ** the property will be considered read-write.
    8. ! **
    9. If there is a ! ** public void setXXX(<type>) ! ** method, then as long as XXX is not already used as ! ** the name of a property, XXX is assumed to be a ! ** write-only property of type <type>.
    10. ! **
    11. In all of the above cases, if the setXXX() method ! ** throws PropertyVetoException, then the ! ** property in question is assumed to be constrained. ! ** No properties are ever assumed to be bound ! ** (Spec Note: this is not in the ! ** spec, it just makes sense). See PropertyDescriptor ! ** for a description of bound and constrained ! ** properties.
    12. ! **
    ! ** ! ** Events:

    ! ** ! ** If there is a pair of methods, ! ** public void addXXX(<type>) and ! ** public void removeXXX(<type>), where ! ** <type> is a descendant of ! ** java.util.EventListener, then the pair of ! ** methods imply that this Bean will fire events to ! ** listeners of type <type>.

    ! ** ! ** If the addXXX() method throws ! ** java.util.TooManyListenersException, then ! ** the event set is assumed to be unicast. See ! ** EventSetDescriptor for a discussion of unicast event ! ** sets.

    ! ** ! ** Spec Note: the spec seems to say that ! ** the listener type's classname must be equal to the XXX ! ** part of addXXX() and removeXXX(), but that is not the ! ** case in Sun's implementation, so I am assuming it is ! ** not the case in general.

    ! ** ! ** Methods:

    ! ** ! ** Any public methods (including those which were used ! ** for Properties or Events) are used as Methods. ! ** ! ** @author John Keiser ! ** @since JDK1.1 ! ** @version 1.1.0, 29 Jul 1998 ! ** @see java.beans.BeanInfo ! **/ ! public class Introspector { ! static String[] beanInfoSearchPath = {"gnu.java.beans.info", "sun.beans.infos"}; ! static Hashtable beanInfoCache = new Hashtable(); ! ! private Introspector() {} ! ! /** Get the BeanInfo for class beanClass, ! ** first by looking for explicit information, next by ! ** using standard design patterns to determine ! ** information about the class. ! ** @param beanClass the class to get BeanInfo about. ! ** @return the BeanInfo object representing the class. ! **/ ! public static BeanInfo getBeanInfo(Class beanClass) throws IntrospectionException { ! BeanInfo cachedInfo; ! synchronized(beanClass) { ! cachedInfo = (BeanInfo)beanInfoCache.get(beanClass); ! if(cachedInfo != null) { ! return cachedInfo; ! } ! cachedInfo = getBeanInfo(beanClass,null); ! beanInfoCache.put(beanClass,cachedInfo); ! return cachedInfo; ! } ! } ! ! /** Get the BeanInfo for class beanClass, ! ** first by looking for explicit information, next by ! ** using standard design patterns to determine ! ** information about the class. It crawls up the ! ** inheritance tree until it hits topClass. ! ** @param beanClass the Bean class. ! ** @param stopClass the class to stop at. ! ** @return the BeanInfo object representing the class. ! **/ ! public static BeanInfo getBeanInfo(Class beanClass, Class stopClass) throws IntrospectionException { ! ExplicitInfo explicit = new ExplicitInfo(beanClass,stopClass); ! ! IntrospectionIncubator ii = new IntrospectionIncubator(); ! ii.setPropertyStopClass(explicit.propertyStopClass); ! ii.setEventStopClass(explicit.eventStopClass); ! ii.setMethodStopClass(explicit.methodStopClass); ! ii.addMethods(beanClass.getMethods()); ! ! BeanInfoEmbryo currentInfo = ii.getBeanInfoEmbryo(); ! PropertyDescriptor[] p = explicit.explicitPropertyDescriptors; ! if(p!=null) { ! for(int i=0;i ! * ! * Don't worry about it too much, though: you can provide ! * JavaBeans with as much customized information as you ! * want, or as little as you want, using the BeanInfo ! * interface (see BeanInfo for details).

    ! * ! * Order of Operations

    ! * ! * When you call getBeanInfo(class c), the Introspector ! * first searches for BeanInfo class to see if you ! * provided any explicit information. It searches for a ! * class named BeanInfo in different ! * packages, first searching the bean class's package ! * and then moving on to search the beanInfoSearchPath.

    ! * ! * If it does not find a BeanInfo class, it acts as though ! * it had found a BeanInfo class returning null from all ! * methods (meaning it should discover everything through ! * Introspection). If it does, then it takes the ! * information it finds in the BeanInfo class to be ! * canonical (that is, the information speaks for its ! * class as well as all superclasses).

    ! * ! * When it has introspected the class, calls ! * getBeanInfo(c.getSuperclass) and adds that information ! * to the information it has, not adding to any information ! * it already has that is canonical.

    ! * ! * Introspection Design Patterns

    ! * ! * When the Introspector goes in to read the class, it ! * follows a well-defined order in order to not leave any ! * methods unaccounted for. Its job is to step over all ! * of the public methods in a class and determine whether ! * they are part of a property, an event, or a method (in ! * that order). ! * ! * ! * Properties:

    ! * ! *

      ! *
    1. If there is a public boolean isXXX() ! * method, then XXX is a read-only boolean property. ! * boolean getXXX() may be supplied in ! * addition to this method, although isXXX() is the ! * one that will be used in this case and getXXX() ! * will be ignored. If there is a ! * public void setXXX(boolean) method, ! * it is part of this group and makes it a read-write ! * property.
    2. ! *
    3. If there is a ! * public <type> getXXX(int) ! * method, then XXX is a read-only indexed property of ! * type <type>. If there is a ! * public void setXXX(int,<type>) ! * method, then it is a read-write indexed property of ! * type <type>. There may also be a ! * public <type>[] getXXX() and a ! * public void setXXX(<type>) ! * method as well.
    4. ! *
    5. If there is a ! * public void setXXX(int,<type>) ! * method, then it is a write-only indexed property of ! * type <type>. There may also be a ! * public <type>[] getXXX() and a ! * public void setXXX(<type>) ! * method as well.
    6. ! *
    7. If there is a ! * public <type> getXXX() method, ! * then XXX is a read-only property of type ! * <type>. If there is a ! * public void setXXX(<type>) ! * method, then it will be used for the property and ! * the property will be considered read-write.
    8. ! *
    9. If there is a ! * public void setXXX(<type>) ! * method, then as long as XXX is not already used as ! * the name of a property, XXX is assumed to be a ! * write-only property of type <type>.
    10. ! *
    11. In all of the above cases, if the setXXX() method ! * throws PropertyVetoException, then the ! * property in question is assumed to be constrained. ! * No properties are ever assumed to be bound ! * (Spec Note: this is not in the ! * spec, it just makes sense). See PropertyDescriptor ! * for a description of bound and constrained ! * properties.
    12. ! *
    ! * ! * Events:

    ! * ! * If there is a pair of methods, ! * public void addXXX(<type>) and ! * public void removeXXX(<type>), where ! * <type> is a descendant of ! * java.util.EventListener, then the pair of ! * methods imply that this Bean will fire events to ! * listeners of type <type>.

    ! * ! * If the addXXX() method throws ! * java.util.TooManyListenersException, then ! * the event set is assumed to be unicast. See ! * EventSetDescriptor for a discussion of unicast event ! * sets.

    ! * ! * Spec Note: the spec seems to say that ! * the listener type's classname must be equal to the XXX ! * part of addXXX() and removeXXX(), but that is not the ! * case in Sun's implementation, so I am assuming it is ! * not the case in general.

    ! * ! * Methods:

    ! * ! * Any public methods (including those which were used ! * for Properties or Events) are used as Methods. ! * ! * @author John Keiser ! * @since JDK1.1 ! * @see java.beans.BeanInfo ! */ public class Introspector { ! ! public static final int USE_ALL_BEANINFO = 1; ! public static final int IGNORE_IMMEDIATE_BEANINFO = 2; ! public static final int IGNORE_ALL_BEANINFO = 3; ! static String[] beanInfoSearchPath = {"gnu.java.beans.info"}; ! static Hashtable beanInfoCache = new Hashtable(); ! ! private Introspector() {} ! ! /** ! * Get the BeanInfo for class beanClass, ! * first by looking for explicit information, next by ! * using standard design patterns to determine ! * information about the class. ! * ! * @param beanClass the class to get BeanInfo about. ! * @return the BeanInfo object representing the class. ! */ ! public static BeanInfo getBeanInfo(Class beanClass) ! throws IntrospectionException ! { ! BeanInfo cachedInfo; ! synchronized(beanClass) ! { ! cachedInfo = (BeanInfo)beanInfoCache.get(beanClass); ! if(cachedInfo != null) ! { ! return cachedInfo; ! } ! cachedInfo = getBeanInfo(beanClass,null); ! beanInfoCache.put(beanClass,cachedInfo); ! return cachedInfo; ! } ! } ! /** ! * Get the BeanInfo for class beanClass, ! * first by looking for explicit information, next by ! * using standard design patterns to determine ! * information about the class. It crawls up the ! * inheritance tree until it hits topClass. ! * ! * @param beanClass the Bean class. ! * @param stopClass the class to stop at. ! * @return the BeanInfo object representing the class. ! */ ! public static BeanInfo getBeanInfo(Class beanClass, Class stopClass) ! throws IntrospectionException ! { ! ExplicitInfo explicit = new ExplicitInfo(beanClass,stopClass); ! ! IntrospectionIncubator ii = new IntrospectionIncubator(); ! ii.setPropertyStopClass(explicit.propertyStopClass); ! ii.setEventStopClass(explicit.eventStopClass); ! ii.setMethodStopClass(explicit.methodStopClass); ! ii.addMethods(beanClass.getMethods()); ! ! BeanInfoEmbryo currentInfo = ii.getBeanInfoEmbryo(); ! PropertyDescriptor[] p = explicit.explicitPropertyDescriptors; ! if(p!=null) ! { ! for(int i=0;i - * @date October 8, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class BufferedInputStream extends FilterInputStream { ! /* Internal buffer array for data. */ protected byte[] buf; ! /* Index one greater than the last valid byte in the buffer. */ protected int count = 0; ! /* The current position in the buffer. */ protected int pos = 0; ! /* The value of pos the last time mark() was called. */ protected int markpos = -1; ! /* The maximum read-ahead allowed before calls to reset() fail. */ protected int marklimit = 0; public BufferedInputStream(InputStream in) { ! this(in, 2048); } public BufferedInputStream(InputStream in, int size) { super(in); --- 1,129 ---- ! /* BufferedInputStream.java -- An input stream that implements buffering ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * This subclass of FilterInputStream buffers input from an + * underlying implementation to provide a possibly more efficient read + * mechanism. It maintains the buffer and buffer state in instance + * variables that are available to subclasses. The default buffer size + * of 2048 bytes can be overridden by the creator of the stream. + *

    + * This class also implements mark/reset functionality. It is capable + * of remembering any number of input bytes, to the limits of + * system memory or the size of Integer.MAX_VALUE + *

    + * Please note that this class does not properly handle character + * encodings. Consider using the BufferedReader class which + * does. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + */ public class BufferedInputStream extends FilterInputStream { ! ! /** ! * This is the default buffer size ! */ ! private static final int DEFAULT_BUFFER_SIZE = 2048; ! ! /** ! * The buffer used for storing data from the underlying stream. ! */ protected byte[] buf; ! /** ! * The number of valid bytes currently in the buffer. It is also the index ! * of the buffer position one byte past the end of the valid data. ! */ protected int count = 0; ! /** ! * The index of the next character that will by read from the buffer. ! * When pos == count, the buffer is empty. ! */ protected int pos = 0; ! /** ! * The value of pos when the mark() method was ! * called. ! * This is set to -1 if there is no mark set. ! */ protected int markpos = -1; ! /** ! * This is the maximum number of bytes than can be read after a ! * call to mark() before the mark can be discarded. ! * After this may bytes are read, the reset() method ! * may not be called successfully. ! */ protected int marklimit = 0; + /** + * This method initializes a new BufferedInputStream that will + * read from the specified subordinate stream with a default buffer size + * of 2048 bytes + * + * @param in The subordinate stream to read from + */ public BufferedInputStream(InputStream in) { ! this(in, DEFAULT_BUFFER_SIZE); } + /** + * This method initializes a new BufferedInputStream that will + * read from the specified subordinate stream with a buffer size that + * is specified by the caller. + * + * @param in The subordinate stream to read from + * @param size The buffer size to use + * + * @exception IllegalArgumentException when size is smaller then 1 + */ public BufferedInputStream(InputStream in, int size) { super(in); *************** public class BufferedInputStream extends *** 48,58 **** --- 132,161 ---- buf = new byte[size]; } + /** + * This method returns the number of bytes that can be read from this + * stream before a read can block. A return of 0 indicates that blocking + * might (or might not) occur on the very next read attempt. + *

    + * The number of available bytes will be the number of read ahead bytes + * stored in the internal buffer plus the number of available bytes in + * the underlying stream. + * + * @return The number of bytes that can be read before blocking could occur + * + * @exception IOException If an error occurs + */ public synchronized int available() throws IOException { return count - pos + super.available(); } + /** + * This method closes the underlying input stream and frees any + * resources associated with it. Sets buf to null. + * + * @exception IOException If an error occurs. + */ public void close() throws IOException { // Free up the array memory. *************** public class BufferedInputStream extends *** 60,76 **** --- 163,216 ---- super.close(); } + /** + * This method marks a position in the input to which the stream can be + * "reset" by calling the reset() method. The parameter + * readlimit is the number of bytes that can be read from the + * stream after setting the mark before the mark becomes invalid. For + * example, if mark() is called with a read limit of 10, then + * when 11 bytes of data are read from the stream before the + * reset() method is called, then the mark is invalid and the + * stream object instance is not required to remember the mark. + *

    + * Note that the number of bytes that can be remembered by this method + * can be greater than the size of the internal read buffer. It is also + * not dependent on the subordinate stream supporting mark/reset + * functionality. + * + * @param readlimit The number of bytes that can be read before the mark + * becomes invalid + */ public synchronized void mark(int readlimit) { marklimit = readlimit; markpos = pos; } + /** + * This method returns true to indicate that this class + * supports mark/reset functionality. + * + * @return true to indicate that mark/reset functionality is + * supported + * + */ public boolean markSupported() { return true; } + /** + * This method reads an unsigned byte from the input stream and returns it + * as an int in the range of 0-255. This method also will return -1 if + * the end of the stream has been reached. + *

    + * This method will block until the byte can be read. + * + * @return The byte read or -1 if end of stream + * + * @exception IOException If an error occurs + */ public synchronized int read() throws IOException { if (pos >= count && !refill()) *************** public class BufferedInputStream extends *** 82,91 **** return ((int) buf[pos++]) & 0xFF; } public synchronized int read(byte[] b, int off, int len) throws IOException { if (off < 0 || len < 0 || off + len > b.length) ! throw new ArrayIndexOutOfBoundsException(); if (pos >= count && !refill()) return -1; // No bytes were read before EOF. --- 222,252 ---- return ((int) buf[pos++]) & 0xFF; } + /** + * This method reads bytes from a stream and stores them into a caller + * supplied buffer. It starts storing the data at index off + * into the buffer and attempts to read len bytes. This method + * can return before reading the number of bytes requested. The actual + * number of bytes read is returned as an int. A -1 is returned to indicate + * the end of the stream. + *

    + * This method will block until some data can be read. + * + * @param b The array into which the bytes read should be stored + * @param off The offset into the array to start storing bytes + * @param len The requested number of bytes to read + * + * @return The actual number of bytes read, or -1 if end of stream. + * + * @exception IOException If an error occurs. + * @exception IndexOutOfBoundsException when off or + * len are negative, or when off + len + * is larger then the size of b, + */ public synchronized int read(byte[] b, int off, int len) throws IOException { if (off < 0 || len < 0 || off + len > b.length) ! throw new IndexOutOfBoundsException(); if (pos >= count && !refill()) return -1; // No bytes were read before EOF. *************** public class BufferedInputStream extends *** 100,105 **** --- 261,279 ---- return remain; } + /** + * This method resets a stream to the point where the mark() + * method was called. Any bytes that were read after the mark point was + * set will be re-read during subsequent reads. + *

    + * This method will throw an IOException if the number of bytes read from + * the stream since the call to mark() exceeds the mark limit + * passed when establishing the mark. + * + * @exception IOException If mark() was never called or more + * then markLimit bytes were read since the last + * call to mark() + */ public synchronized void reset() throws IOException { if (markpos < 0) *************** public class BufferedInputStream extends *** 108,113 **** --- 282,298 ---- pos = markpos; } + /** + * This method skips the specified number of bytes in the stream. It + * returns the actual number of bytes skipped, which may be less than the + * requested amount. + * + * @param n The requested number of bytes to skip + * + * @return The actual number of bytes skipped. + * + * @exception IOException If an error occurs + */ public synchronized long skip(long n) throws IOException { final long origN = n; *************** public class BufferedInputStream extends *** 131,137 **** return origN - n; } ! private boolean refill() throws IOException { if (markpos < 0) count = pos = 0; --- 316,329 ---- return origN - n; } ! /** ! * Called to refill the buffer (when count is equal or greater the pos). ! * Package local so BufferedReader can call it when needed. ! * ! * @return true when buf can be (partly) refilled, ! * false otherwise. ! */ ! boolean refill() throws IOException { if (markpos < 0) count = pos = 0; diff -Nrc3pad gcc-3.0.4/libjava/java/io/BufferedOutputStream.java gcc-3.1/libjava/java/io/BufferedOutputStream.java *** gcc-3.0.4/libjava/java/io/BufferedOutputStream.java Fri May 19 23:35:34 2000 --- gcc-3.1/libjava/java/io/BufferedOutputStream.java Tue Jan 22 22:40:13 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/BufferedReader.java gcc-3.1/libjava/java/io/BufferedReader.java *** gcc-3.0.4/libjava/java/io/BufferedReader.java Sat Feb 17 01:06:44 2001 --- gcc-3.1/libjava/java/io/BufferedReader.java Tue Jan 22 22:40:13 2002 *************** *** 1,11 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; /* Written using "Java Class Libraries", 2nd edition, plus online --- 1,41 ---- ! /* BufferedReader.java ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.io; /* Written using "Java Class Libraries", 2nd edition, plus online *************** public class BufferedReader extends Read *** 53,58 **** --- 83,92 ---- guaranteed to be >= the read-limit requested in the call to mark. */ int markPos = -1; + // The JCL book specifies the default buffer size as 8K characters. + // This is package-private because it is used by LineNumberReader. + static final int DEFAULT_BUFFER_SIZE = 8192; + /** * Create a new BufferedReader that will read from the * specified subordinate stream with a default buffer size of 4096 chars. *************** public class BufferedReader extends Read *** 61,67 **** */ public BufferedReader(Reader in) { ! this(in, 8192); } /** --- 95,101 ---- */ public BufferedReader(Reader in) { ! this(in, DEFAULT_BUFFER_SIZE); } /** diff -Nrc3pad gcc-3.0.4/libjava/java/io/BufferedWriter.java gcc-3.1/libjava/java/io/BufferedWriter.java *** gcc-3.0.4/libjava/java/io/BufferedWriter.java Tue Feb 20 19:03:20 2001 --- gcc-3.1/libjava/java/io/BufferedWriter.java Tue Jan 22 22:40:13 2002 *************** *** 1,5 **** /* BufferedWriter.java -- Buffer output into large blocks before writing ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* BufferedWriter.java -- Buffer output into large blocks before writing ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** public class BufferedWriter extends Writ *** 160,168 **** */ public void write (char[] buf, int offset, int len) throws IOException { - if (offset < 0 || len < 0 || offset + len > buf.length) - throw new ArrayIndexOutOfBoundsException (); - synchronized (lock) { if (buffer == null) --- 171,176 ---- *************** public class BufferedWriter extends Writ *** 199,207 **** */ public void write (String str, int offset, int len) throws IOException { - if (offset < 0 || len < 0 || offset + len < str.length()) - throw new ArrayIndexOutOfBoundsException (); - synchronized (lock) { if (buffer == null) --- 207,212 ---- *************** public class BufferedWriter extends Writ *** 222,236 **** } } private final void localFlush () throws IOException { if (count > 0) { ! synchronized (lock) ! { ! out.write(buffer, 0, count); ! count = 0; ! } } } --- 227,239 ---- } } + // This should only be called with the lock held. private final void localFlush () throws IOException { if (count > 0) { ! out.write(buffer, 0, count); ! count = 0; } } diff -Nrc3pad gcc-3.0.4/libjava/java/io/ByteArrayInputStream.java gcc-3.1/libjava/java/io/ByteArrayInputStream.java *** gcc-3.0.4/libjava/java/io/ByteArrayInputStream.java Mon Feb 19 05:37:00 2001 --- gcc-3.1/libjava/java/io/ByteArrayInputStream.java Tue Jan 22 22:40:13 2002 *************** *** 1,43 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; /** ! * @author Warren Levy ! * @date October 7, 1998. ! */ ! ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct ! */ ! public class ByteArrayInputStream extends InputStream { ! /* An array of bytes provided by the creator of the stream. */ protected byte[] buf; ! /* Position of the next byte in buf to be read. */ protected int pos; ! /* The currently marked position in the stream. */ protected int mark; ! /* The index in buf one greater than the last valid character. */ protected int count; public ByteArrayInputStream(byte[] buffer) { this(buffer, 0, buffer.length); } public ByteArrayInputStream(byte[] buffer, int offset, int length) { if (offset < 0 || length < 0 || offset > buffer.length) --- 1,114 ---- ! /* ByteArrayInputStream.java -- Read an array as a stream ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.io; /** ! * This class permits an array of bytes to be read as an input stream. ! * ! * @author Warren Levy ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public class ByteArrayInputStream extends InputStream { ! /** ! * The array that contains the data supplied during read operations ! */ protected byte[] buf; ! /** ! * The array index of the next byte to be read from the buffer ! * buf ! */ protected int pos; ! /** ! * The currently marked position in the stream. This defaults to 0, so a ! * reset operation on the stream resets it to read from array index 0 in ! * the buffer - even if the stream was initially created with an offset ! * greater than 0 ! */ protected int mark; ! /** ! * This indicates the maximum number of bytes that can be read from this ! * stream. It is the array index of the position after the last valid ! * byte in the buffer buf ! */ protected int count; + /** + * Create a new ByteArrayInputStream that will read bytes from the passed + * in byte array. This stream will read from the beginning to the end + * of the array. It is identical to calling an overloaded constructor + * as ByteArrayInputStream(buf, 0, buf.length). + *

    + * Note that this array is not copied. If its contents are changed + * while this stream is being read, those changes will be reflected in the + * bytes supplied to the reader. Please use caution in changing the + * contents of the buffer while this stream is open. + * + * @param buf The byte array buffer this stream will read from. + */ public ByteArrayInputStream(byte[] buffer) { this(buffer, 0, buffer.length); } + /** + * Create a new ByteArrayInputStream that will read bytes from the + * passed in byte array. This stream will read from position + * offset in the array for a length of + * length bytes past offset. If the + * stream is reset to a position before offset then + * more than length bytes can be read from the stream. + * The length value should be viewed as the array index + * one greater than the last position in the buffer to read. + *

    + * Note that this array is not copied. If its contents are changed + * while this stream is being read, those changes will be reflected in the + * bytes supplied to the reader. Please use caution in changing the + * contents of the buffer while this stream is open. + * + * @param buf The byte array buffer this stream will read from. + * @param offset The index into the buffer to start reading bytes from + * @param length The number of bytes to read from the buffer + */ public ByteArrayInputStream(byte[] buffer, int offset, int length) { if (offset < 0 || length < 0 || offset > buffer.length) *************** public class ByteArrayInputStream extend *** 53,74 **** --- 124,183 ---- mark = pos; } + /** + * This method returns the number of bytes available to be read from this + * stream. The value returned will be equal to count - pos. + * + * @return The number of bytes that can be read from this stream + * before blocking, which is all of them + */ public synchronized int available() { return count - pos; } + /** + * This method sets the mark position in this stream to the current + * position. Note that the readlimit parameter in this + * method does nothing as this stream is always capable of + * remembering all the bytes int it. + *

    + * Note that in this class the mark position is set by default to + * position 0 in the stream. This is in constrast to some other + * stream types where there is no default mark position. + * + * @param readlimit The number of bytes this stream must remember. + * This parameter is ignored. + */ public synchronized void mark(int readAheadLimit) { // readAheadLimit is ignored per Java Class Lib. book, p.220. mark = pos; } + /** + * This method overrides the markSupported method in + * InputStream in order to return true - + * indicating that this stream class supports mark/reset + * functionality. + * + * @return true to indicate that this class supports + * mark/reset. + */ public boolean markSupported() { return true; } + /** + * This method reads one byte from the stream. The pos + * counter is advanced to the next byte to be read. The byte read is + * returned as an int in the range of 0-255. If the stream position + * is already at the end of the buffer, no byte is read and a -1 is + * returned in order to indicate the end of the stream. + * + * @return The byte read, or -1 if end of stream + */ public synchronized int read() { if (pos < count) *************** public class ByteArrayInputStream extend *** 76,81 **** --- 185,208 ---- return -1; } + /** + * This method reads bytes from the stream and stores them into a + * caller supplied buffer. It starts storing the data at index + * offset into the buffer and attempts to read + * len bytes. This method can return before reading + * the number of bytes requested if the end of the stream is + * encountered first. The actual number of bytes read is returned. + * If no bytes can be read because the stream is already at the end + * of stream position, a -1 is returned. + *

    + * This method does not block. + * + * @param buf The array into which the bytes read should be stored. + * @param offset The offset into the array to start storing bytes + * @param len The requested number of bytes to read + * + * @return The actual number of bytes read, or -1 if end of stream. + */ public synchronized int read(byte[] b, int off, int len) { if (pos >= count) *************** public class ByteArrayInputStream extend *** 87,97 **** --- 214,243 ---- return numBytes; } + /** + * This method sets the read position in the stream to the mark + * point by setting the pos variable equal to the + * mark variable. Since a mark can be set anywhere in + * the array, the mark/reset methods int this class can be used to + * provide random search capabilities for this type of stream. + */ public synchronized void reset() { pos = mark; } + /** + * This method attempts to skip the requested number of bytes in the + * input stream. It does this by advancing the pos + * value by the specified number of bytes. It this would exceed the + * length of the buffer, then only enough bytes are skipped to + * position the stream at the end of the buffer. The actual number + * of bytes skipped is returned. + * + * @param num_bytes The requested number of bytes to skip + * + * @return The actual number of bytes skipped. + */ public synchronized long skip(long n) { // Even though the var numBytes is a long, in reality it can never diff -Nrc3pad gcc-3.0.4/libjava/java/io/ByteArrayOutputStream.java gcc-3.1/libjava/java/io/ByteArrayOutputStream.java *** gcc-3.0.4/libjava/java/io/ByteArrayOutputStream.java Sat Aug 19 19:54:36 2000 --- gcc-3.1/libjava/java/io/ByteArrayOutputStream.java Tue Jan 22 22:40:13 2002 *************** *** 1,12 **** ! // ByteArrayOutputStream.java - Write bytes to an array. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.io; --- 1,40 ---- ! /* BufferedReader.java ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** public class ByteArrayOutputStream exten *** 169,175 **** return new String (buf, 0, count, hibyte); } ! // Resize buffer to accomodate new bytes. private void resize (int add) { if (count + add >= buf.length) --- 197,203 ---- return new String (buf, 0, count, hibyte); } ! // Resize buffer to accommodate new bytes. private void resize (int add) { if (count + add >= buf.length) diff -Nrc3pad gcc-3.0.4/libjava/java/io/CharArrayReader.java gcc-3.1/libjava/java/io/CharArrayReader.java *** gcc-3.0.4/libjava/java/io/CharArrayReader.java Mon Feb 19 05:37:00 2001 --- gcc-3.1/libjava/java/io/CharArrayReader.java Tue Jan 22 22:40:13 2002 *************** *** 1,43 **** ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Warren Levy ! * @date October 16, 1998. ! */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct - */ public class CharArrayReader extends Reader { ! /* An array of chars provided by the creator of the stream. */ protected char[] buf; ! /* Position of the next char in buf to be read. */ protected int pos; ! /* The currently marked position in the stream. */ protected int markedPos; ! /* The index in buf one greater than the last valid character. */ protected int count; public CharArrayReader(char[] buffer) { this(buffer, 0, buffer.length); } public CharArrayReader(char[] buffer, int offset, int length) { super(); --- 1,114 ---- ! /* CharArrayReader.java -- Read an array of characters as a stream ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + package java.io; + + /** + * This class permits an array of chars to be read as an input stream. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + */ public class CharArrayReader extends Reader { ! /** ! * The array that contains the data supplied during read operations ! */ protected char[] buf; ! /** ! * The array index of the next char to be read from the buffer ! * buf ! */ protected int pos; ! /** ! * The currently marked position in the stream. This defaults to 0, so a ! * reset operation on the stream resets it to read from array index 0 in ! * the buffer - even if the stream was initially created with an offset ! * greater than 0 ! */ protected int markedPos; ! /** ! * This indicates the maximum number of chars that can be read from this ! * stream. It is the array index of the position after the last valid ! * char in the buffer buf ! */ protected int count; + /** + * Create a new CharArrayReader that will read chars from the passed + * in char array. This stream will read from the beginning to the end + * of the array. It is identical to calling an overloaded constructor + * as CharArrayReader(buf, 0, buf.length). + *

    + * Note that this array is not copied. If its contents are changed + * while this stream is being read, those changes will be reflected in the + * chars supplied to the reader. Please use caution in changing the + * contents of the buffer while this stream is open. + * + * @param buffer The char array buffer this stream will read from. + */ public CharArrayReader(char[] buffer) { this(buffer, 0, buffer.length); } + /** + * Create a new CharArrayReader that will read chars from the passed + * in char array. This stream will read from position + * offset in the array for a length of + * length chars past offset. If the + * stream is reset to a position before offset then + * more than length chars can be read from the stream. + * The length value should be viewed as the array index + * one greater than the last position in the buffer to read. + *

    + * Note that this array is not copied. If its contents are changed + * while this stream is being read, those changes will be reflected in the + * chars supplied to the reader. Please use caution in changing the + * contents of the buffer while this stream is open. + * + * @param buffer The char array buffer this stream will read from. + * @param offset The index into the buffer to start reading chars from + * @param length The number of chars to read from the buffer + */ public CharArrayReader(char[] buffer, int offset, int length) { super(); *************** public class CharArrayReader extends Rea *** 54,125 **** markedPos = pos; } public void close() { synchronized (lock) ! { ! buf = null; ! } } public void mark(int readAheadLimit) throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! // readAheadLimit is ignored per Java Class Lib. book, p. 318. ! markedPos = pos; ! } } public boolean markSupported() { return true; } public int read() throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! if (pos < 0) ! throw new ArrayIndexOutOfBoundsException(pos); ! if (pos < count) ! return ((int) buf[pos++]) & 0xFFFF; ! return -1; ! } } public int read(char[] b, int off, int len) throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! /* Don't need to check pos value, arraycopy will check it. */ ! if (off < 0 || len < 0 || off + len > b.length) ! throw new ArrayIndexOutOfBoundsException(); ! if (pos >= count) ! return -1; ! int numChars = Math.min(count - pos, len); ! System.arraycopy(buf, pos, b, off, numChars); ! pos += numChars; ! return numChars; ! } } ! /** Return true if more characters are available to be read. ! * ! * @specnote The JDK 1.3 API docs are wrong here. This method will ! * return false if there are no more characters available. ! */ public boolean ready() throws IOException { if (buf == null) --- 125,254 ---- markedPos = pos; } + /** + * This method closes the stream. + */ public void close() { synchronized (lock) ! { ! buf = null; ! } } + /** + * This method sets the mark position in this stream to the current + * position. Note that the readlimit parameter in this + * method does nothing as this stream is always capable of + * remembering all the chars int it. + *

    + * Note that in this class the mark position is set by default to + * position 0 in the stream. This is in constrast to some other + * stream types where there is no default mark position. + * + * @param readAheadLimit The number of chars this stream must + * remember. This parameter is ignored. + * + * @exception IOException If an error occurs + */ public void mark(int readAheadLimit) throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! // readAheadLimit is ignored per Java Class Lib. book, p. 318. ! markedPos = pos; ! } } + /** + * This method overrides the markSupported method in + * Reader in order to return true - + * indicating that this stream class supports mark/reset + * functionality. + * + * @return true to indicate that this class supports + * mark/reset. + */ public boolean markSupported() { return true; } + /** + * This method reads one char from the stream. The pos + * counter is advanced to the next char to be read. The char read + * is returned as an int in the range of 0-65535. If the stream + * position is already at the end of the buffer, no char is read and + * a -1 is returned in order to indicate the end of the stream. + * + * @return The char read, or -1 if end of stream + */ public int read() throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! if (pos < 0) ! throw new ArrayIndexOutOfBoundsException(pos); ! if (pos < count) ! return ((int) buf[pos++]) & 0xFFFF; ! return -1; ! } } + /** + * This method reads chars from the stream and stores them into a + * caller supplied buffer. It starts storing the data at index + * offset into the buffer and attempts to read + * len chars. This method can return before reading + * the number of chars requested if the end of the stream is + * encountered first. The actual number of chars read is returned. + * If no chars can be read because the stream is already at the end + * of stream position, a -1 is returned. + *

    + * This method does not block. + * + * @param b The array into which the chars read should be stored. + * @param off The offset into the array to start storing chars + * @param len The requested number of chars to read + * + * @return The actual number of chars read, or -1 if end of stream. + */ public int read(char[] b, int off, int len) throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! /* Don't need to check pos value, arraycopy will check it. */ ! if (off < 0 || len < 0 || off + len > b.length) ! throw new ArrayIndexOutOfBoundsException(); ! if (pos >= count) ! return -1; ! int numChars = Math.min(count - pos, len); ! System.arraycopy(buf, pos, b, off, numChars); ! pos += numChars; ! return numChars; ! } } ! /** ! * Return true if more characters are available to be read. ! * ! * @return true to indicate that this stream is ready ! * to be read. ! * ! * @specnote The JDK 1.3 API docs are wrong here. This method will ! * return false if there are no more characters available. ! */ public boolean ready() throws IOException { if (buf == null) *************** public class CharArrayReader extends Rea *** 128,158 **** return (pos < count); } public void reset() throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! pos = markedPos; ! } } public long skip(long n) throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! // Even though the var numChars is a long, in reality it can never ! // be larger than an int since the result of subtracting 2 positive ! // ints will always fit in an int. Since we have to return a long ! // anyway, numChars might as well just be a long. ! long numChars = Math.min((long) (count - pos), n < 0 ? 0L : n); ! pos += numChars; ! return numChars; ! } } } --- 257,305 ---- return (pos < count); } + /** + * This method sets the read position in the stream to the mark + * point by setting the pos variable equal to the + * mark variable. Since a mark can be set anywhere in + * the array, the mark/reset methods int this class can be used to + * provide random search capabilities for this type of stream. + */ public void reset() throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! pos = markedPos; ! } } + /** + * This method attempts to skip the requested number of chars in the + * input stream. It does this by advancing the pos value by the + * specified number of chars. It this would exceed the length of the + * buffer, then only enough chars are skipped to position the stream at + * the end of the buffer. The actual number of chars skipped is returned. + * + * @param n The requested number of chars to skip + * + * @return The actual number of chars skipped. + */ public long skip(long n) throws IOException { synchronized (lock) ! { ! if (buf == null) ! throw new IOException("Stream closed"); ! // Even though the var numChars is a long, in reality it can never ! // be larger than an int since the result of subtracting 2 positive ! // ints will always fit in an int. Since we have to return a long ! // anyway, numChars might as well just be a long. ! long numChars = Math.min((long) (count - pos), n < 0 ? 0L : n); ! pos += numChars; ! return numChars; ! } } } diff -Nrc3pad gcc-3.0.4/libjava/java/io/CharArrayWriter.java gcc-3.1/libjava/java/io/CharArrayWriter.java *** gcc-3.0.4/libjava/java/io/CharArrayWriter.java Tue Feb 20 19:03:20 2001 --- gcc-3.1/libjava/java/io/CharArrayWriter.java Tue Jan 22 22:40:13 2002 *************** *** 1,43 **** ! // CharArrayWriter.java - Character array output stream. ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 25, 1998 ! */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * Status: Complete to 1.1. - */ public class CharArrayWriter extends Writer { public CharArrayWriter () { ! this (32); } public CharArrayWriter (int size) { super (); buf = new char[size]; } public void close () { closed = true; } public void flush () throws IOException { synchronized (lock) --- 1,109 ---- ! /* CharArrayWriter.java -- Write chars to a buffer ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + package java.io; + + /** + * This class allows data to be written to a char array buffer and + * and then retrieved by an application. The internal char array + * buffer is dynamically resized to hold all the data written. Please + * be aware that writing large amounts to data to this stream will + * cause large amounts of memory to be allocated. + *

    + * The size of the internal buffer defaults to 32 and it is resized + * in increments of 1024 chars. This behavior can be over-ridden by using the + * following two properties: + *

    + *

      + *
    • gnu.java.io.CharArrayWriter.initialBufferSize + *
    • gnu.java.io.CharArrayWriter.bufferIncrementSize + *
    + *

    + * There is a constructor that specified the initial buffer size and + * that is the preferred way to set that value because it it portable + * across all Java class library implementations. + *

    + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public class CharArrayWriter extends Writer { + /** + * The default initial buffer size + */ + private static final int DEFAULT_INITIAL_BUFFER_SIZE = 32; + + /** + * This method initializes a new CharArrayWriter with + * the default buffer size of 32 chars. If a different initial + * buffer size is desired, see the constructor + * CharArrayWriter(int size). + */ public CharArrayWriter () { ! this (DEFAULT_INITIAL_BUFFER_SIZE); } + /** + * This method initializes a new CharArrayWriter with + * a specified initial buffer size. + * + * @param size The initial buffer size in chars + */ public CharArrayWriter (int size) { super (); buf = new char[size]; } + /** + * Closes the stream. This method is guaranteed not to free the contents + * of the internal buffer, which can still be retrieved. + */ public void close () { closed = true; } + /** + * This method flushes all buffered chars to the stream. + */ public void flush () throws IOException { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 47,52 **** --- 113,123 ---- } } + /** + * This method discards all of the chars that have been written to the + * internal buffer so far by setting the count variable to + * 0. The internal buffer remains at its currently allocated size. + */ public void reset () { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 58,68 **** --- 129,159 ---- } } + /** + * This method returns the number of chars that have been written to + * the buffer so far. This is the same as the value of the protected + * count variable. If the reset method is + * called, then this value is reset as well. Note that this method does + * not return the length of the internal buffer, but only the number + * of chars that have been written to it. + * + * @return The number of chars in the internal buffer + * + * @see reset + */ public int size () { return count; } + /** + * This method returns a char array containing the chars that have been + * written to this stream so far. This array is a copy of the valid + * chars in the internal buffer and its length is equal to the number of + * valid chars, not necessarily to the the length of the current + * internal buffer. Note that since this method allocates a new array, + * it should be used with caution when the internal buffer is very large. + */ public char[] toCharArray () { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 73,78 **** --- 164,178 ---- } } + /** + * Returns the chars in the internal array as a String. The + * chars in the buffer are converted to characters using the system default + * encoding. There is an overloaded toString() method that + * allows an application specified character encoding to be used. + * + * @return A String containing the data written to this + * stream so far + */ public String toString () { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 81,86 **** --- 181,192 ---- } } + /** + * This method writes the writes the specified char into the internal + * buffer. + * + * @param oneChar The char to be read passed as an int + */ public void write (int oneChar) throws IOException { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 93,98 **** --- 199,212 ---- } } + /** + * This method writes len chars from the passed in array + * buf starting at index offset into that buffer + * + * @param buffer The char array to write data from + * @param offset The index into the buffer to start writing data from + * @param len The number of chars to write + */ public void write (char[] buffer, int offset, int len) throws IOException { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 107,112 **** --- 221,235 ---- } } + /** + * This method writes len chars from the passed in + * String buf starting at index + * offset into the internal buffer. + * + * @param str The String to write data from + * @param offset The index into the string to start writing data from + * @param len The number of chars to write + */ public void write (String str, int offset, int len) throws IOException { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 121,126 **** --- 244,257 ---- } } + /** + * This method writes all the chars that have been written to this stream + * from the internal buffer to the specified Writer. + * + * @param out The Writer to write to + * + * @exception IOException If an error occurs + */ public void writeTo (Writer out) throws IOException { synchronized (lock) *************** public class CharArrayWriter extends Wri *** 129,134 **** --- 260,272 ---- } } + /** + * This private method makes the buffer bigger when we run out of room + * by allocating a larger buffer and copying the valid chars from the + * old array into it. This is obviously slow and should be avoided by + * application programmers by setting their initial buffer size big + * enough to hold everything if possible. + */ private final void resize (int len) { if (count + len >= buf.length) *************** public class CharArrayWriter extends Wri *** 142,151 **** } } ! // The character buffer. protected char[] buf; ! // Number of valid characters in buffer. protected int count; ! // True if stream is closed. private boolean closed; } --- 280,297 ---- } } ! /** ! * The internal buffer where the data written is stored ! */ protected char[] buf; ! ! /** ! * The number of chars that have been written to the buffer ! */ protected int count; ! ! /** ! * True if the stream has been closed. ! */ private boolean closed; } diff -Nrc3pad gcc-3.0.4/libjava/java/io/CharConversionException.java gcc-3.1/libjava/java/io/CharConversionException.java *** gcc-3.0.4/libjava/java/io/CharConversionException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/CharConversionException.java Tue Jan 22 22:40:13 2002 *************** *** 1,34 **** ! // CharConversionException.java - Problem converting char to byte encoding. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 25, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public class CharConversionException extends IOException { - public CharConversionException () - { - super (); - } ! public CharConversionException (String s) ! { ! super (s); ! } } --- 1,86 ---- ! /* CharConversionException.java -- Character conversion exceptions ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * This exception is thrown to indicate that a problem occurred with + * an attempted character conversion. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + * @date September 25, 1998 + */ public class CharConversionException extends IOException { ! /* ! * Constructors ! */ ! ! /** ! * Create a new CharConversionException without a descriptive error message ! */ ! public ! CharConversionException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Create a new CharConversionException with a descriptive error message String ! * ! * @param message The descriptive error message ! */ ! public ! CharConversionException(String message) ! { ! super(message); } + + } // class CharConversionException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/DataInput.java gcc-3.1/libjava/java/io/DataInput.java *** gcc-3.0.4/libjava/java/io/DataInput.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/DataInput.java Tue Jan 22 22:40:13 2002 *************** *** 1,41 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Warren Levy ! * @date October 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public interface DataInput { ! public boolean readBoolean() throws IOException; ! public byte readByte() throws IOException; ! public char readChar() throws IOException; ! public double readDouble() throws IOException; ! public float readFloat() throws IOException; ! public void readFully(byte[] b) ! throws IOException, NullPointerException; ! public void readFully(byte[] b, int off, int len) ! throws IOException, NullPointerException, IndexOutOfBoundsException; ! public int readInt() throws IOException; ! public String readLine() throws IOException; ! public long readLong() throws IOException; ! public short readShort() throws IOException; ! public int readUnsignedByte() throws IOException; ! public int readUnsignedShort() throws IOException; ! public String readUTF() throws IOException; ! public int skipBytes(int n) throws IOException; ! } --- 1,472 ---- ! /* DataInput.java -- Interface for reading data from a stream ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This interface is implemented by classes that can data from streams ! * into Java primitive types. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ public interface DataInput { ! ! /** ! * This method reads a Java boolean value from an input stream. It does ! * so by reading a single byte of data. If that byte is zero, then the ! * value returned is false. If the byte is non-zero, then ! * the value returned is true. ! *

    ! * This method can read a boolean written by an object ! * implementing the writeBoolean() method in the ! * DataOutput interface. ! * ! * @return The boolean value read ! * ! * @exception EOFException If end of file is reached before reading the boolean ! * @exception IOException If any other error occurs ! */ ! boolean ! readBoolean() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a Java byte value from an input stream. The value ! * is in the range of -128 to 127. ! *

    ! * This method can read a byte written by an object ! * implementing the ! * writeByte() method in the DataOutput interface. ! *

    ! * @return The byte value read ! * ! * @exception EOFException If end of file is reached before reading the byte ! * @exception IOException If any other error occurs ! * ! * @see DataOutput ! */ ! byte ! readByte() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads 8 unsigned bits into a Java int value from ! * the stream. The value returned is in the range of 0 to 255. ! *

    ! * This method can read an unsigned byte written by an object implementing the ! * writeUnsignedByte() method in the DataOutput ! * interface. ! * ! * @return The unsigned bytes value read as a Java int. ! * ! * @exception EOFException If end of file is reached before reading the value ! * @exception IOException If any other error occurs ! * ! * @see DataOutput ! */ ! int ! readUnsignedByte() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a Java char value from an input stream. ! * It operates by reading two bytes from the stream and converting them to ! * a single 16-bit Java char. The two bytes are stored most ! * significant byte first (i.e., "big endian") regardless of the native ! * host byte ordering. ! *

    ! * As an example, if byte1 and byte2 represent the ! * first and second byte read from the stream respectively, they will be ! * transformed to a char in the following manner: ! *

    ! * (char)((byte1 << 8) + byte2) ! *

    ! * This method can read a char written by an object implementing ! * the ! * writeChar() method in the DataOutput interface. ! * ! * @return The char value read ! * ! * @exception EOFException If end of file is reached before reading the char ! * @exception IOException If any other error occurs ! * ! * @see DataOutput ! */ ! char ! readChar() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a signed 16-bit value into a Java in from the stream. ! * It operates by reading two bytes from the stream and converting them to ! * a single 16-bit Java short. The two bytes are stored most ! * significant byte first (i.e., "big endian") regardless of the native ! * host byte ordering. ! *

    ! * As an example, if byte1 and byte2 represent the ! * first and second byte read from the stream respectively, they will be ! * transformed to a short in the following manner: ! *

    ! * (short)((byte1 << 8) + byte2) ! *

    ! * The value returned is in the range of -32768 to 32767. ! *

    ! * This method can read a short written by an object implementing ! * the writeShort() method in the DataOutput ! * interface. ! * ! * @return The short value read ! * ! * @exception EOFException If end of file is reached before reading the value ! * @exception IOException If any other error occurs ! * ! * @see DataOutput ! */ ! short ! readShort() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads 16 unsigned bits into a Java int value from the stream. ! * It operates by reading two bytes from the stream and converting them to ! * a single Java int. The two bytes are stored most ! * significant byte first (i.e., "big endian") regardless of the native ! * host byte ordering. ! *

    ! * As an example, if byte1 and byte2 represent the ! * first and second byte read from the stream respectively, they will be ! * transformed to an int in the following manner: ! *

    ! * (int)((byte1 << 8) + byte2) ! *

    ! * The value returned is in the range of 0 to 65535. ! *

    ! * This method can read an unsigned short written by an object implementing ! * the writeUnsignedShort() method in the DataOutput ! * interface. ! * ! * @return The unsigned short value read as a Java int. ! * ! * @exception EOFException If end of file is reached before reading the value ! * @exception IOException If any other error occurs ! */ ! int ! readUnsignedShort() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a Java int value from an input stream ! * It operates by reading four bytes from the stream and converting them to ! * a single Java int. The bytes are stored most ! * significant byte first (i.e., "big endian") regardless of the native ! * host byte ordering. ! *

    ! * As an example, if byte1 through byte4 represent ! * the first four bytes read from the stream, they will be ! * transformed to an int in the following manner: ! *

    ! * (int)((byte1 << 24) + (byte2 << 16) + (byte3 << 8) + byte4)) ! *

    ! The value returned is in the range of -2147483648 to 2147483647. ! *

    ! * This method can read an int written by an object implementing ! * the writeInt() method in the DataOutput interface. ! * ! * @return The int value read ! * ! * @exception EOFException If end of file is reached before reading the int ! * @exception IOException If any other error occurs ! * ! * @see DataOutput ! */ ! int ! readInt() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a Java long value from an input stream ! * It operates by reading eight bytes from the stream and converting them to ! * a single Java long. The bytes are stored most ! * significant byte first (i.e., "big endian") regardless of the native ! * host byte ordering. ! *

    ! * As an example, if byte1 through byte8 represent ! * the first eight bytes read from the stream, they will be ! * transformed to an long in the following manner: ! *

    ! * (long)((byte1 << 56) + (byte2 << 48) + (byte3 << 40) + ! * (byte4 << 32) + (byte5 << 24) + (byte6 << 16) + (byte7 << 8) + byte9)) ! * ! *

    ! * The value returned is in the range of -9223372036854775808 to ! * 9223372036854775807. ! *

    ! * This method can read an long written by an object implementing ! * the writeLong() method in the DataOutput ! * interface. ! * ! * @return The long value read ! * ! * @exception EOFException If end of file is reached before reading the long ! * @exception IOException If any other error occurs ! * ! * @see DataOutput ! */ ! long ! readLong() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a Java float value from an input stream. It operates ! * by first reading an int value from the stream by calling the ! * readInt() method in this interface, then converts that ! * int to a float using the ! * intBitsToFloat method in the class ! * java.lang.Float. ! *

    ! * This method can read a float written by an object implementing ! * the writeFloat() method in the DataOutput ! * interface. ! * ! * @return The float value read ! * ! * @exception EOFException If end of file is reached before reading the float ! * @exception IOException If any other error occurs ! * ! * @see java.lang.Float ! * @see DataOutput ! */ ! float ! readFloat() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a Java double value from an input stream. It operates ! * by first reading a long value from the stream by calling the ! * readLong() method in this interface, then converts that ! * long to a double using the ! * longBitsToDouble method in the class ! * java.lang.Double. ! *

    ! * This method can read a double written by an object ! * implementing the writeDouble() method in the ! * DataOutput interface. ! * ! * @return The double value read ! * ! * @exception EOFException If end of file is reached before reading the double ! * @exception IOException If any other error occurs ! * ! * @see java.lang.Double ! * @see DataOutput ! */ ! double ! readDouble() throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads the next line of text data from an input stream. ! * It operates by reading bytes and converting those bytes to char ! * values by treating the byte read as the low eight bits of the ! * char and using 0 as the high eight bits. Because of this, ! * it does not support the full 16-bit Unicode character set. ! *

    ! * The reading of bytes ends when either the end of file or a line terminator ! * is encountered. The bytes read are then returned as a String. ! * A line terminator is a byte sequence consisting of either ! * \r, \n or \r\n. These termination ! * charaters are discarded and are not returned as part of the string. ! *

    ! * This method can read data that was written by an object implementing the ! * writeLine() method in DataOutput. ! * ! * @return The line read as a String ! * ! * @exception IOException If an error occurs ! * ! * @see DataOutput ! */ ! String ! readLine() throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads a String from an input stream that is ! * encoded in a modified UTF-8 format. This format has a leading two byte ! * sequence that contains the remaining number of bytes to read. This two byte ! * sequence is read using the readUnsignedShort() method of this ! * interface. ! * ! * After the number of remaining bytes have been determined, these bytes ! * are read an transformed into char values. These ! * char values are encoded in the stream using either a one, two, ! * or three byte format. ! * The particular format in use can be determined by examining the first ! * byte read. ! *

    ! * If the first byte has a high order bit of 0, then ! * that character consists on only one byte. This character value consists ! * of seven bits that are at positions 0 through 6 of the byte. As an ! * example, if byte1 is the byte read from the stream, it would ! * be converted to a char like so: ! *

    ! * (char)byte1 ! *

    ! * If the first byte has 110 as its high order bits, then the ! * character consists of two bytes. The bits that make up the character ! * value are in positions 0 through 4 of the first byte and bit positions ! * 0 through 5 of the second byte. (The second byte should have ! * 10 as its high order bits). These values are in most significant ! * byte first (i.e., "big endian") order. ! *

    ! * As an example, if byte1 and byte2 are the first ! * two bytes read respectively, and the high order bits of them match the ! * patterns which indicate a two byte character encoding, then they would be ! * converted to a Java char like so: ! *

    ! * (char)(((byte1 & 0x1F) << 6) + (byte2 & 0x3F)) ! *

    ! * If the first byte has a 1110 as its high order bits, then the ! * character consists of three bytes. The bits that make up the character ! * value are in positions 0 through 3 of the first byte and bit positions ! * 0 through 5 of the other two bytes. (The second and third bytes should ! * have 10 as their high order bits). These values are in most ! * significant byte first (i.e., "big endian") order. ! *

    ! * As an example, if byte1, byte2, and ! * byte3 are the three bytes read, and the high order bits of ! * them match the patterns which indicate a three byte character encoding, ! * then they would be converted to a Java char like so: ! * ! * ! * (char)(((byte1 & 0x0F) << 12) + ((byte2 & 0x3F) + (byte3 & 0x3F)) ! * ! * ! * Note that all characters are encoded in the method that requires the ! * fewest number of bytes with the exception of the character with the ! * value of \u0000 which is encoded as two bytes. This is ! * a modification of the UTF standard used to prevent C language style ! * NUL values from appearing in the byte stream. ! *

    ! * This method can read data that was written by an object implementing the ! * writeUTF() method in DataOutput. ! * ! * @returns The String read ! * ! * @exception EOFException If end of file is reached before reading the String ! * @exception UTFDataFormatException If the data is not in UTF-8 format ! * @exception IOException If any other error occurs ! * ! * @see DataOutput ! */ ! String ! readUTF() throws EOFException, UTFDataFormatException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads raw bytes into the passed array until the array is ! * full. Note that this method blocks until the data is available and ! * throws an exception if there is not enough data left in the stream to ! * fill the buffer ! * ! * @param buf The buffer into which to read the data ! * ! * @exception EOFException If end of file is reached before filling the buffer ! * @exception IOException If any other error occurs ! */ ! void ! readFully(byte[] buf) throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method reads raw bytes into the passed array buf starting ! * offset bytes into the buffer. The number of bytes read will be ! * exactly len. Note that this method blocks until the data is ! * available and * throws an exception if there is not enough data left in ! * the stream to read len bytes. ! * ! * @param buf The buffer into which to read the data ! * @param offset The offset into the buffer to start storing data ! * @param len The number of bytes to read into the buffer ! * ! * @exception EOFException If end of file is reached before filling the buffer ! * @exception IOException If any other error occurs ! */ ! void ! readFully(byte[] buf, int offset, int len) throws EOFException, IOException; ! ! /*************************************************************************/ ! ! /** ! * This method skips and discards the specified number of bytes in an ! * input stream ! * ! * @param num_bytes The number of bytes to skip ! * ! * @return The number of bytes actually skipped, which will always be ! * num_bytes ! * ! * @exception EOFException If end of file is reached before all bytes can be ! * skipped ! * @exception IOException If any other error occurs ! */ ! int ! skipBytes(int n) throws EOFException, IOException; ! ! } // interface DataInput diff -Nrc3pad gcc-3.0.4/libjava/java/io/DataInputStream.java gcc-3.1/libjava/java/io/DataInputStream.java *** gcc-3.0.4/libjava/java/io/DataInputStream.java Sat Jan 6 23:28:40 2001 --- gcc-3.1/libjava/java/io/DataInputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,10 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; --- 1,39 ---- ! /* DataInputStream.java -- FilteredInputStream that implements DataInput ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** public class DataInputStream extends Fil *** 33,38 **** --- 62,70 ---- // handled correctly. If set, readLine() will ignore the first char it sees // if that char is a '\n' boolean ignoreInitialNewline = false; + + // Byte buffer, used to make primitive read calls more efficient. + byte[] buf = new byte[8]; /** * This constructor initializes a new DataInputStream *************** public class DataInputStream extends Fil *** 102,111 **** */ public final boolean readBoolean() throws IOException { ! int b = in.read(); ! if (b < 0) ! throw new EOFException(); ! return (b != 0); } /** --- 134,140 ---- */ public final boolean readBoolean() throws IOException { ! return convertToBoolean(in.read()); } /** *************** public class DataInputStream extends Fil *** 125,135 **** */ public final byte readByte() throws IOException { ! int i = in.read(); ! if (i < 0) ! throw new EOFException(); ! ! return (byte) i; } /** --- 154,160 ---- */ public final byte readByte() throws IOException { ! return convertToByte(in.read()); } /** *************** public class DataInputStream extends Fil *** 159,169 **** */ public final char readChar() throws IOException { ! int a = in.read(); ! int b = in.read(); ! if (b < 0) ! throw new EOFException(); ! return (char) ((a << 8) | (b & 0xff)); } /** --- 184,191 ---- */ public final char readChar() throws IOException { ! readFully (buf, 0, 2); ! return convertToChar(buf); } /** *************** public class DataInputStream extends Fil *** 290,304 **** */ public final int readInt() throws IOException { ! int a = in.read(); ! int b = in.read(); ! int c = in.read(); ! int d = in.read(); ! if (d < 0) ! throw new EOFException(); ! ! return (((a & 0xff) << 24) | ((b & 0xff) << 16) | ! ((c & 0xff) << 8) | (d & 0xff)); } /** --- 312,319 ---- */ public final int readInt() throws IOException { ! readFully (buf, 0, 4); ! return convertToInt(buf); } /** *************** public class DataInputStream extends Fil *** 445,469 **** */ public final long readLong() throws IOException { ! int a = in.read(); ! int b = in.read(); ! int c = in.read(); ! int d = in.read(); ! int e = in.read(); ! int f = in.read(); ! int g = in.read(); ! int h = in.read(); ! if (h < 0) ! throw new EOFException(); ! ! return (((long)(a & 0xff) << 56) | ! ((long)(b & 0xff) << 48) | ! ((long)(c & 0xff) << 40) | ! ((long)(d & 0xff) << 32) | ! ((long)(e & 0xff) << 24) | ! ((long)(f & 0xff) << 16) | ! ((long)(g & 0xff) << 8) | ! ((long)(h & 0xff))); } /** --- 460,467 ---- */ public final long readLong() throws IOException { ! readFully (buf, 0, 8); ! return convertToLong(buf); } /** *************** public class DataInputStream extends Fil *** 495,505 **** */ public final short readShort() throws IOException { ! int a = in.read(); ! int b = in.read(); ! if (b < 0) ! throw new EOFException(); ! return (short) ((a << 8) | (b & 0xff)); } /** --- 493,500 ---- */ public final short readShort() throws IOException { ! readFully (buf, 0, 2); ! return convertToShort(buf); } /** *************** public class DataInputStream extends Fil *** 520,530 **** */ public final int readUnsignedByte() throws IOException { ! int i = in.read(); ! if (i < 0) ! throw new EOFException(); ! ! return (i & 0xFF); } /** --- 515,521 ---- */ public final int readUnsignedByte() throws IOException { ! return convertToUnsignedByte(in.read()); } /** *************** public class DataInputStream extends Fil *** 554,564 **** */ public final int readUnsignedShort() throws IOException { ! int a = in.read(); ! int b = in.read(); ! if (b < 0) ! throw new EOFException(); ! return (((a & 0xff) << 8) | (b & 0xff)); } /** --- 545,552 ---- */ public final int readUnsignedShort() throws IOException { ! readFully (buf, 0, 2); ! return convertToUnsignedShort(buf); } /** *************** public class DataInputStream extends Fil *** 650,690 **** { final int UTFlen = in.readUnsignedShort(); byte[] buf = new byte[UTFlen]; - StringBuffer strbuf = new StringBuffer(); // This blocks until the entire string is available rather than // doing partial processing on the bytes that are available and then // blocking. An advantage of the latter is that Exceptions // could be thrown earlier. The former is a bit cleaner. in.readFully(buf, 0, UTFlen); - for (int i = 0; i < UTFlen; ) - { - if ((buf[i] & 0x80) == 0) // bit pattern 0xxxxxxx - strbuf.append((char) (buf[i++] & 0xFF)); - else if ((buf[i] & 0xE0) == 0xC0) // bit pattern 110xxxxx - { - if (i + 1 >= UTFlen || (buf[i+1] & 0xC0) != 0x80) - throw new UTFDataFormatException(); - - strbuf.append((char) (((buf[i++] & 0x1F) << 6) | - (buf[i++] & 0x3F))); - } - else if ((buf[i] & 0xF0) == 0xE0) // bit pattern 1110xxxx - { - if (i + 2 >= UTFlen || - (buf[i+1] & 0xC0) != 0x80 || (buf[i+2] & 0xC0) != 0x80) - throw new UTFDataFormatException(); ! strbuf.append((char) (((buf[i++] & 0x0F) << 12) | ! ((buf[i++] & 0x3F) << 6) | ! (buf[i++] & 0x3F))); ! } ! else // must be ((buf[i] & 0xF0) == 0xF0 || (buf[i] & 0xC0) == 0x80) ! throw new UTFDataFormatException(); // bit patterns 1111xxxx or ! // 10xxxxxx ! } ! ! return strbuf.toString(); } /** --- 638,651 ---- { final int UTFlen = in.readUnsignedShort(); byte[] buf = new byte[UTFlen]; // This blocks until the entire string is available rather than // doing partial processing on the bytes that are available and then // blocking. An advantage of the latter is that Exceptions // could be thrown earlier. The former is a bit cleaner. in.readFully(buf, 0, UTFlen); ! return convertFromUTF(buf); } /** *************** public class DataInputStream extends Fil *** 715,718 **** --- 676,768 ---- } return n; } + + static boolean convertToBoolean(int b) throws EOFException + { + if (b < 0) + throw new EOFException(); + return (b != 0); + } + + static byte convertToByte(int i) throws EOFException + { + if (i < 0) + throw new EOFException(); + return (byte) i; + } + + static int convertToUnsignedByte(int i) throws EOFException + { + if (i < 0) + throw new EOFException(); + return (i & 0xFF); + } + + static char convertToChar(byte[] buf) + { + return (char) ((buf[0] << 8) | (buf[1] & 0xff)); + } + + static short convertToShort(byte[] buf) + { + return (short) ((buf[0] << 8) | (buf[1] & 0xff)); + } + + static int convertToUnsignedShort(byte[] buf) + { + return (((buf[0] & 0xff) << 8) | (buf[1] & 0xff)); + } + + static int convertToInt(byte[] buf) + { + return (((buf[0] & 0xff) << 24) | ((buf[1] & 0xff) << 16) | + ((buf[2] & 0xff) << 8) | (buf[3] & 0xff)); + } + + static long convertToLong(byte[] buf) + { + return (((long)(buf[0] & 0xff) << 56) | + ((long)(buf[1] & 0xff) << 48) | + ((long)(buf[2] & 0xff) << 40) | + ((long)(buf[3] & 0xff) << 32) | + ((long)(buf[4] & 0xff) << 24) | + ((long)(buf[5] & 0xff) << 16) | + ((long)(buf[6] & 0xff) << 8) | + ((long)(buf[7] & 0xff))); + } + + static String convertFromUTF(byte[] buf) + throws EOFException, UTFDataFormatException + { + StringBuffer strbuf = new StringBuffer(); + + for (int i = 0; i < buf.length; ) + { + if ((buf[i] & 0x80) == 0) // bit pattern 0xxxxxxx + strbuf.append((char) (buf[i++] & 0xFF)); + else if ((buf[i] & 0xE0) == 0xC0) // bit pattern 110xxxxx + { + if (i + 1 >= buf.length || (buf[i+1] & 0xC0) != 0x80) + throw new UTFDataFormatException(); + + strbuf.append((char) (((buf[i++] & 0x1F) << 6) | + (buf[i++] & 0x3F))); + } + else if ((buf[i] & 0xF0) == 0xE0) // bit pattern 1110xxxx + { + if (i + 2 >= buf.length || + (buf[i+1] & 0xC0) != 0x80 || (buf[i+2] & 0xC0) != 0x80) + throw new UTFDataFormatException(); + + strbuf.append((char) (((buf[i++] & 0x0F) << 12) | + ((buf[i++] & 0x3F) << 6) | + (buf[i++] & 0x3F))); + } + else // must be ((buf[i] & 0xF0) == 0xF0 || (buf[i] & 0xC0) == 0x80) + throw new UTFDataFormatException(); // bit patterns 1111xxxx or + // 10xxxxxx + } + + return strbuf.toString(); + } } diff -Nrc3pad gcc-3.0.4/libjava/java/io/DataOutput.java gcc-3.1/libjava/java/io/DataOutput.java *** gcc-3.0.4/libjava/java/io/DataOutput.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/DataOutput.java Tue Jan 22 22:40:14 2002 *************** *** 1,44 **** ! // DataOutput.java - Interface for data output conversions. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ public interface DataOutput { ! public abstract void write (int b) throws IOException; ! public abstract void write (byte[] b) ! throws IOException, NullPointerException; ! public abstract void write (byte[] b, int off, int len) ! throws IOException, NullPointerException, IndexOutOfBoundsException; ! public abstract void writeBoolean (boolean v) throws IOException; ! public abstract void writeByte (int v) throws IOException; ! public abstract void writeShort (int v) throws IOException; ! public abstract void writeChar (int v) throws IOException; ! public abstract void writeInt (int v) throws IOException; ! public abstract void writeLong (long v) throws IOException; ! public abstract void writeFloat (float v) throws IOException; ! public abstract void writeDouble (double v) throws IOException; ! public abstract void writeBytes (String s) ! throws IOException, NullPointerException; ! public abstract void writeChars (String s) ! throws IOException, NullPointerException; ! public abstract void writeUTF (String s) ! throws IOException, NullPointerException; ! } --- 1,228 ---- ! /* DataOutput.java -- Interface for writing data from a stream ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ + /** + * This interface is implemented by classes that can wrte data to streams + * from Java primitive types. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public interface DataOutput { ! ! /** ! * This method writes a Java boolean value to an output stream ! * ! * @param value The boolean value to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeBoolean(boolean value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a Java byte value to an output stream ! * ! * @param value The int value to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeByte(int value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a Java char value to an output stream ! * ! * @param value The char value to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeChar(int value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a Java int value to an output stream as a 16 bit value ! * ! * @param value The int value to write as a 16-bit value ! * ! * @exception IOException If an error occurs ! */ ! void ! writeShort(int value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a Java int value to an output stream ! * ! * @param value The int value to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeInt(int value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a Java long value to an output stream ! * ! * @param value The long value to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeLong(long value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a Java float value to an output stream ! * ! * @param value The float value to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeFloat(float value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a Java double value to an output stream ! * ! * @param value The double value to write ! * ! * @exception IOException If any other error occurs ! */ ! void ! writeDouble(double value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a String to an output stream as an array of bytes ! * ! * @param value The String to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeBytes(String value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a String to an output stream as an array of char's ! * ! * @param value The String to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeChars(String value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes a String to an output stream encoded in ! * UTF-8 format. ! * ! * @param value The String to write ! * ! * @exception IOException If an error occurs ! */ ! void ! writeUTF(String value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes an 8-bit value (passed into the method as a Java ! * int) to an output stream. ! * ! * @param value The byte to write to the output stream ! * ! * @exception IOException If an error occurs ! */ ! void ! write(int value) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes the raw byte array passed in to the output stream. ! * ! * @param buf The byte array to write ! * ! * @exception IOException If an error occurs ! */ ! void ! write(byte[] buf) throws IOException; ! ! /*************************************************************************/ ! ! /** ! * This method writes raw bytes from the passed array buf starting ! * offset bytes into the buffer. The number of bytes written will be ! * exactly len. ! * ! * @param buf The buffer from which to write the data ! * @param offset The offset into the buffer to start writing data from ! * @param len The number of bytes to write from the buffer to the output stream ! * ! * @exception IOException If any other error occurs ! */ ! void ! write(byte[] buf, int offset, int len) throws IOException; ! ! } // interface DataOutput diff -Nrc3pad gcc-3.0.4/libjava/java/io/DataOutputStream.java gcc-3.1/libjava/java/io/DataOutputStream.java *** gcc-3.0.4/libjava/java/io/DataOutputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/DataOutputStream.java Sun Dec 16 00:14:57 2001 *************** public class DataOutputStream extends Fi *** 48,54 **** throws IOException, NullPointerException, IndexOutOfBoundsException { out.write(b, off, len); ! written += len - off; } public final void writeBoolean (boolean v) throws IOException --- 48,54 ---- throws IOException, NullPointerException, IndexOutOfBoundsException { out.write(b, off, len); ! written += len; } public final void writeBoolean (boolean v) throws IOException diff -Nrc3pad gcc-3.0.4/libjava/java/io/EOFException.java gcc-3.1/libjava/java/io/EOFException.java *** gcc-3.0.4/libjava/java/io/EOFException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/EOFException.java Tue Jan 22 22:40:14 2002 *************** *** 1,34 **** ! // EOFException.java - End of file exception ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public class EOFException extends IOException { - public EOFException () - { - super (); - } ! public EOFException (String s) ! { ! super (s); ! } } --- 1,90 ---- ! /* EOFException.java -- Unexpected end of file exception ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * This exception is thrown when the end of the file or stream was + * encountered unexpectedly. This is not the normal way that a normal + * EOF condition is reported. Normally a special value such as -1 is + * returned. However, certain types of streams expecting certain data + * in a certain format might reach EOF before reading their expected + * data pattern and thus throw this exception. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + * @date September 24, 1998 + */ public class EOFException extends IOException { ! /* ! * Constructors ! */ ! ! /** ! * Create a new EOFException without a descriptive error message ! */ ! public ! EOFException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Create a new EOFException with a descriptive error message String + * + * @param message The descriptive error message + */ + public + EOFException(String message) + { + super(message); + } + + } // class EOFException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/Externalizable.java gcc-3.1/libjava/java/io/Externalizable.java *** gcc-3.0.4/libjava/java/io/Externalizable.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/Externalizable.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** package java.io; *** 49,55 **** * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public abstract interface Externalizable extends Serializable { /** --- 60,66 ---- * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public interface Externalizable extends Serializable { /** diff -Nrc3pad gcc-3.0.4/libjava/java/io/File.java gcc-3.1/libjava/java/io/File.java *** gcc-3.0.4/libjava/java/io/File.java Wed Jul 18 18:38:23 2001 --- gcc-3.1/libjava/java/io/File.java Wed Apr 17 23:01:09 2002 *************** public class File implements Serializabl *** 82,92 **** // Remove duplicate and redundant separator characters. private String normalizePath(String p) { int dupIndex = p.indexOf(dupSeparator); int plen = p.length(); ! // Special case: permit Windows UNC path prefix. ! if (dupSeparator == "\\" && dupIndex == 0) dupIndex = p.indexOf(dupSeparator, 1); if (dupIndex == -1) --- 82,97 ---- // Remove duplicate and redundant separator characters. private String normalizePath(String p) { + // On Windows, convert any '/' to '\'. This appears to be the same logic + // that Sun's Win32 Java performs. + if (separatorChar == '\\') + p = p.replace ('/', '\\'); + int dupIndex = p.indexOf(dupSeparator); int plen = p.length(); ! // Special case: permit Windows UNC path prefix. ! if (dupSeparator.equals("\\\\") && dupIndex == 0) dupIndex = p.indexOf(dupSeparator, 1); if (dupIndex == -1) *************** public class File implements Serializabl *** 157,163 **** } /** @since 1.2 */ ! public File getAbsoluteFile () throws IOException { return new File (getAbsolutePath()); } --- 162,168 ---- } /** @since 1.2 */ ! public File getAbsoluteFile () { return new File (getAbsolutePath()); } *************** public class File implements Serializabl *** 181,186 **** --- 186,194 ---- int last = path.lastIndexOf(separatorChar); if (last == -1) return null; + // FIXME: POSIX assumption. + if (last == 0 && path.charAt (0) == '/') + ++last; return path.substring(0, last); } *************** public class File implements Serializabl *** 281,287 **** public URL toURL () throws MalformedURLException { ! return new URL ("file:" + path + (isDirectory() ? "/" : "")); } private final native boolean performMkdir (); --- 289,296 ---- public URL toURL () throws MalformedURLException { ! return new URL ("file://" + getAbsolutePath () ! + (isDirectory() ? "/" : "")); } private final native boolean performMkdir (); diff -Nrc3pad gcc-3.0.4/libjava/java/io/FileDescriptor.java gcc-3.1/libjava/java/io/FileDescriptor.java *** gcc-3.0.4/libjava/java/io/FileDescriptor.java Tue Dec 26 00:24:01 2000 --- gcc-3.1/libjava/java/io/FileDescriptor.java Fri Mar 8 00:43:29 2002 *************** *** 1,6 **** // FileDescriptor.java - Open file or device ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // FileDescriptor.java - Open file or device ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** package java.io; *** 24,37 **** // if need be. public final class FileDescriptor { ! public static final FileDescriptor in = new FileDescriptor (0); ! public static final FileDescriptor out = new FileDescriptor (1); ! public static final FileDescriptor err = new FileDescriptor (2); public native void sync () throws SyncFailedException; public native boolean valid (); - // These are mode values for open(). static final int READ = 1; static final int WRITE = 2; --- 24,43 ---- // if need be. public final class FileDescriptor { ! ! public static final FileDescriptor in = null; ! public static final FileDescriptor out = null; ! public static final FileDescriptor err = null; ! ! private static native void init(); ! static ! { ! init(); ! } public native void sync () throws SyncFailedException; public native boolean valid (); // These are mode values for open(). static final int READ = 1; static final int WRITE = 2; *************** public final class FileDescriptor *** 43,48 **** --- 49,59 ---- static final int SET = 0; static final int CUR = 1; + // This constructor is specified to create an invalid descriptor. + public FileDescriptor () + { + } + // Open a file. MODE is a combination of the above mode flags. FileDescriptor (String path, int mode) throws FileNotFoundException { *************** public final class FileDescriptor *** 54,60 **** native void write (byte[] b, int offset, int len) throws IOException, NullPointerException, IndexOutOfBoundsException; native void close () throws IOException; ! native int seek (long pos, int whence) throws IOException; native long length () throws IOException; native long getFilePointer () throws IOException; native int read () throws IOException; --- 65,75 ---- native void write (byte[] b, int offset, int len) throws IOException, NullPointerException, IndexOutOfBoundsException; native void close () throws IOException; ! // EOF_TRUNC is true if a request to seek past the end of file ! // should actually stop at the end of file. If false, then a seek ! // past the end is ok (and if a subsequent write occurs the file ! // will grow). ! native int seek (long pos, int whence, boolean eof_trunc) throws IOException; native long length () throws IOException; native long getFilePointer () throws IOException; native int read () throws IOException; diff -Nrc3pad gcc-3.0.4/libjava/java/io/FileFilter.java gcc-3.1/libjava/java/io/FileFilter.java *** gcc-3.0.4/libjava/java/io/FileFilter.java Mon Nov 20 18:25:41 2000 --- gcc-3.1/libjava/java/io/FileFilter.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/FileInputStream.java gcc-3.1/libjava/java/io/FileInputStream.java *** gcc-3.0.4/libjava/java/io/FileInputStream.java Fri Dec 8 10:28:32 2000 --- gcc-3.1/libjava/java/io/FileInputStream.java Mon Mar 25 01:59:54 2002 *************** *** 1,4 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. *************** public class FileInputStream extends Inp *** 88,93 **** public long skip(long n) throws IOException { ! return fd.seek(n, FileDescriptor.CUR); } } --- 88,95 ---- public long skip(long n) throws IOException { ! long startPos = fd.getFilePointer(); ! long endPos = fd.seek(n, FileDescriptor.CUR, true); ! return endPos - startPos; } } diff -Nrc3pad gcc-3.0.4/libjava/java/io/FileNotFoundException.java gcc-3.1/libjava/java/io/FileNotFoundException.java *** gcc-3.0.4/libjava/java/io/FileNotFoundException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/FileNotFoundException.java Tue Jan 22 22:40:14 2002 *************** *** 1,34 **** ! // FileNotFoundException.java ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public class FileNotFoundException extends IOException { - public FileNotFoundException () - { - super (); - } ! public FileNotFoundException (String s) ! { ! super (s); ! } } --- 1,86 ---- ! /* FileNotFoundException.java -- The requested file could not be found ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * This exception is thrown when an attempt is made to access a file that + * does not exist. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + * @date September 24, 1998 + */ public class FileNotFoundException extends IOException { ! /* ! * Constructors ! */ ! ! /** ! * Create a new FileNotFoundException without a descriptive error message ! */ ! public ! FileNotFoundException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Create a new FileNotFoundException with a descriptive error message String ! * ! * @param message The descriptive error message ! */ ! public ! FileNotFoundException(String message) ! { ! super(message); } + + } // class FileNotFoundException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/FileOutputStream.java gcc-3.1/libjava/java/io/FileOutputStream.java *** gcc-3.0.4/libjava/java/io/FileOutputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/FileOutputStream.java Thu Jul 12 15:37:43 2001 *************** *** 1,6 **** // FileOutputStream.java - Write bytes to a file. ! /* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // FileOutputStream.java - Write bytes to a file. ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. *************** package java.io; *** 23,29 **** public class FileOutputStream extends OutputStream { public FileOutputStream (String path, boolean append) ! throws SecurityException, IOException { SecurityManager s = System.getSecurityManager(); if (s != null) --- 23,29 ---- public class FileOutputStream extends OutputStream { public FileOutputStream (String path, boolean append) ! throws SecurityException, FileNotFoundException { SecurityManager s = System.getSecurityManager(); if (s != null) *************** public class FileOutputStream extends Ou *** 33,49 **** : FileDescriptor.WRITE)); } ! public FileOutputStream (String path) throws SecurityException, IOException { this (path, false); } ! public FileOutputStream (File file) throws SecurityException, IOException { this (file.getPath(), false); } ! public FileOutputStream (FileDescriptor fdObj) throws SecurityException { SecurityManager s = System.getSecurityManager(); if (s != null) --- 33,52 ---- : FileDescriptor.WRITE)); } ! public FileOutputStream (String path) ! throws SecurityException, FileNotFoundException { this (path, false); } ! public FileOutputStream (File file) ! throws SecurityException, FileNotFoundException { this (file.getPath(), false); } ! public FileOutputStream (FileDescriptor fdObj) ! throws SecurityException { SecurityManager s = System.getSecurityManager(); if (s != null) diff -Nrc3pad gcc-3.0.4/libjava/java/io/FilePermission.java gcc-3.1/libjava/java/io/FilePermission.java *** gcc-3.0.4/libjava/java/io/FilePermission.java Mon Dec 4 10:20:00 2000 --- gcc-3.1/libjava/java/io/FilePermission.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/FileReader.java gcc-3.1/libjava/java/io/FileReader.java *** gcc-3.0.4/libjava/java/io/FileReader.java Mon Oct 30 09:20:47 2000 --- gcc-3.1/libjava/java/io/FileReader.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/FileWriter.java gcc-3.1/libjava/java/io/FileWriter.java *** gcc-3.0.4/libjava/java/io/FileWriter.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/FileWriter.java Tue Jan 22 22:40:14 2002 *************** *** 1,44 **** ! // FileWriter.java - Character output to a file. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 25, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ public class FileWriter extends OutputStreamWriter { - public FileWriter (String fileName) throws IOException - { - super (new FileOutputStream (fileName)); - } ! public FileWriter (String fileName, boolean append) throws IOException ! { ! super (new FileOutputStream (fileName, append)); ! } ! public FileWriter (File file) throws IOException ! { ! super (new FileOutputStream (file)); ! } ! public FileWriter (FileDescriptor fd) ! { ! super (new FileOutputStream (fd)); ! } } --- 1,137 ---- ! /* FileWriter.java -- Convenience class for writing to files. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ + /** + * This is a convenience class for writing to files. It creates an + * FileOutputStream and initializes an + * OutputStreamWriter to write to it. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public class FileWriter extends OutputStreamWriter { ! /*************************************************************************/ ! /* ! * Constructors ! */ ! ! /** ! * This method initializes a new FileWriter object to write ! * to the specified File object. ! * ! * @param file The File object to write to. ! * ! * @param SecurityException If writing to this file is forbidden by the ! * SecurityManager. ! * @param IOException If any other error occurs ! */ ! public ! FileWriter(File file) throws SecurityException, IOException ! { ! super(new FileOutputStream(file)); ! } ! /*************************************************************************/ ! ! /** ! * This method initializes a new FileWriter object to write ! * to the specified FileDescriptor object. ! * ! * @param fd The FileDescriptor object to write to ! * ! * @param SecurityException If writing to this file is forbidden by the ! * SecurityManager. ! */ ! public ! FileWriter(FileDescriptor fd) throws SecurityException ! { ! super(new FileOutputStream(fd)); } + + /*************************************************************************/ + + /** + * This method intializes a new FileWriter object to write to the + * specified named file. + * + * @param name The name of the file to write to + * + * @param SecurityException If writing to this file is forbidden by the + * SecurityManager. + * @param IOException If any other error occurs + */ + public + FileWriter(String name) throws IOException + { + super(new FileOutputStream(name)); + } + + /*************************************************************************/ + + /** + * This method intializes a new FileWriter object to write to the + * specified named file. This form of the constructor allows the caller + * to determin whether data should be written starting at the beginning or + * the end of the file. + * + * @param name The name of the file to write to + * @param append true to start adding data at the end of the + * file, false otherwise. + * + * @param SecurityException If writing to this file is forbidden by the + * SecurityManager. + * @param IOException If any other error occurs + */ + public + FileWriter(String name, boolean append) throws IOException + { + super(new FileOutputStream(name, append)); + } + + } // class FileWriter + diff -Nrc3pad gcc-3.0.4/libjava/java/io/FilenameFilter.java gcc-3.1/libjava/java/io/FilenameFilter.java *** gcc-3.0.4/libjava/java/io/FilenameFilter.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/FilenameFilter.java Tue Jan 22 22:40:14 2002 *************** *** 1,26 **** ! // FilenameFilter.java - Compute subset of list of file names ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public interface FilenameFilter { ! public abstract boolean accept (File dir, String name); ! } --- 1,73 ---- ! /* FilenameFilter.java -- Filter a list of filenames ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * This interface has one method which is used for filtering filenames + * returned in a directory listing. It is currently used by the + * File.list() method and by the filename dialog in AWT. + *

    + * The method in this interface determines if a particular file should + * or should not be included in the file listing. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public interface FilenameFilter { ! ! /** ! * This method determines whether or not a given file should be included ! * in a directory listing. ! * ! * @param dir The File instance for the directory being read ! * @param name The name of the file to test ! * ! * @return true if the file should be included in the list, ! * false otherwise. ! */ ! boolean ! accept(File dir, String name); ! ! } // interface FilenameFilter diff -Nrc3pad gcc-3.0.4/libjava/java/io/FilterInputStream.java gcc-3.1/libjava/java/io/FilterInputStream.java *** gcc-3.0.4/libjava/java/io/FilterInputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/FilterInputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,75 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; - /** - * @author Warren Levy - * @date October 8, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class FilterInputStream extends InputStream { - /* The input stream to be filtered. */ - protected InputStream in; ! protected FilterInputStream(InputStream in) ! { ! this.in = in; ! } ! public int available() throws IOException ! { ! return in.available(); ! } ! public void close() throws IOException ! { ! in.close(); ! } ! public synchronized void mark(int readlimit) ! { ! in.mark(readlimit); ! } ! public boolean markSupported() ! { ! return in.markSupported(); ! } ! public int read() throws IOException ! { ! return in.read(); ! } ! public int read(byte[] b) throws IOException ! { ! return read(b, 0, b.length); ! } ! public int read(byte[] b, int off, int len) throws IOException ! { ! return in.read(b, off, len); ! } ! public synchronized void reset() throws IOException ! { ! in.reset(); ! } ! public long skip(long n) throws IOException ! { ! return in.skip(n); ! } } --- 1,248 ---- ! /* FilterInputStream.java -- Base class for classes that filter input ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This is the common superclass of all standard classes that filter ! * input. It acts as a layer on top of an underlying InputStream ! * and simply redirects calls made to it to the subordinate InputStream ! * instead. Subclasses of this class perform additional filtering ! * functions in addition to simply redirecting the call. ! *

    ! * This class is not abstract. However, since it only redirects calls ! * to a subordinate InputStream without adding any functionality ! * on top of it, this class should not be used directly. Instead, various ! * subclasses of this class should be used. This is enforced with a ! * protected constructor. Do not try to hack around it. ! *

    ! * When creating a subclass of FilterInputStream, override the ! * appropriate methods to implement the desired filtering. However, note ! * that the read(byte[]) method does not need to be overridden ! * as this class redirects calls to that method to ! * read(byte[], int, int) instead of to the subordinate ! * InputStream read(byte[]) method. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ public class FilterInputStream extends InputStream { ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * This is the subordinate InputStream to which method calls ! * are redirected ! */ ! protected InputStream in; ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * Create a FilterInputStream with the specified subordinate ! * InputStream. ! * ! * @param in The subordinate InputStream ! */ ! protected ! FilterInputStream(InputStream in) ! { ! this.in = in; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Calls the in.mark(int) method. ! * ! * @param readlimit The parameter passed to in.mark(int) ! */ ! public void ! mark(int readlimit) ! { ! in.mark(readlimit); ! } ! /*************************************************************************/ ! ! /** ! * Calls the in.markSupported() method. ! * ! * @return true if mark/reset is supported, false ! * otherwise ! */ ! public boolean ! markSupported() ! { ! return(in.markSupported()); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.reset() method. ! * ! * @exception IOException If an error occurs ! */ ! public void ! reset() throws IOException ! { ! in.reset(); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.available() method. ! * ! * @return The value returned from in.available() ! * ! * @exception IOException If an error occurs ! */ ! public int ! available() throws IOException ! { ! return(in.available()); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.skip(long) method ! * ! * @param The requested number of bytes to skip. ! * ! * @return The value returned from in.skip(long) ! * ! * @exception IOException If an error occurs ! */ ! public long ! skip(long num_bytes) throws IOException ! { ! return(in.skip(num_bytes)); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.read() method ! * ! * @return The value returned from in.read() ! * ! * @exception IOException If an error occurs ! */ ! public int ! read() throws IOException ! { ! return(in.read()); } + + /*************************************************************************/ + + /** + * Calls the read(byte[], int, int) overloaded method. Note that + * this method does not redirect its call directly to a corresponding + * method in in. This allows subclasses to override only the + * three argument version of read. + * + * @param buf The buffer to read bytes into + * + * @return The value retured from in.read(byte[], int, int) + * + * @exception IOException If an error occurs + */ + public int + read(byte[] buf) throws IOException + { + return(read(buf, 0, buf.length)); + } + + /*************************************************************************/ + + /** + * Calls the in.read(byte[], int, int) method. + * + * @param buf The buffer to read bytes into + * @param offset The index into the buffer to start storing bytes + * @param len The maximum number of bytes to read. + * + * @return The value retured from in.read(byte[], int, int) + * + * @exception IOException If an error occurs + */ + public int + read(byte[] buf, int offset, int len) throws IOException + { + return(in.read(buf, offset, len)); + } + + /*************************************************************************/ + + /** + * This method closes the input stream by closing the input stream that + * this object is filtering. Future attempts to access this stream may + * throw an exception. + * + * @exception IOException If an error occurs + */ + public void + close() throws IOException + { + in.close(); + } + + } // class FilterInputStream diff -Nrc3pad gcc-3.0.4/libjava/java/io/FilterOutputStream.java gcc-3.1/libjava/java/io/FilterOutputStream.java *** gcc-3.0.4/libjava/java/io/FilterOutputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/FilterOutputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,62 **** ! // FilterOutputStream.java - A filtered stream ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ public class FilterOutputStream extends OutputStream { - public void close () throws IOException - { - flush (); - out.close(); - } ! public FilterOutputStream (OutputStream ox) ! { ! out = ox; ! } ! public void flush () throws IOException ! { ! out.flush(); ! } ! public void write (int b) throws IOException ! { ! out.write(b); ! } ! public void write (byte[] b) throws IOException, NullPointerException ! { ! // Don't do checking here, per Java Lang Spec. ! write (b, 0, b.length); ! } ! public void write (byte[] b, int off, int len) ! throws IOException, NullPointerException, IndexOutOfBoundsException ! { ! // Don't do checking here, per Java Lang Spec. ! for (int i=0; i < len; i++) ! write (b[off + i]); ! } ! // The output stream. ! protected OutputStream out; } --- 1,182 ---- ! /* FilterOutputStream.java -- Parent class for output streams that filter ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ + /** + * This class is the common superclass of output stream classes that + * filter the output they write. These classes typically transform the + * data in some way prior to writing it out to another underlying + * OutputStream. This class simply overrides all the + * methods in OutputStream to redirect them to the + * underlying stream. Subclasses provide actual filtering. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public class FilterOutputStream extends OutputStream { ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * This is the subordinate OutputStream that this class ! * redirects its method calls to. ! */ ! protected OutputStream out; ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * This method initializes an instance of FilterOutputStream ! * to write to the specified subordinate OutputStream. ! * ! * @param out The OutputStream to write to ! */ ! public ! FilterOutputStream(OutputStream out) ! { ! this.out = out; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * This method closes the underlying OutputStream. Any ! * further attempts to write to this stream may throw an exception. ! * ! * @exception IOException If an error occurs ! */ ! public void ! close() throws IOException ! { ! flush(); ! out.close(); ! } ! ! /*************************************************************************/ ! ! /** ! * This method attempt to flush all buffered output to be written to the ! * underlying output sink. ! * ! * @exception IOException If an error occurs ! */ ! public void ! flush() throws IOException ! { ! out.flush(); ! } ! ! /*************************************************************************/ ! ! /** ! * This method writes a single byte of output to the underlying ! * OutputStream. ! * ! * @param b The byte to write, passed as an int. ! * ! * @exception IOException If an error occurs ! */ ! public void ! write(int b) throws IOException ! { ! out.write(b); ! } ! ! /*************************************************************************/ ! ! /** ! * This method writes all the bytes in the specified array to the underlying ! * OutputStream. It does this by calling the three parameter ! * version of this method - write(byte[], int, int) in this ! * class instead of writing to the underlying OutputStream ! * directly. This allows most subclasses to avoid overriding this method. ! * ! * @param buf The byte array to write bytes from ! * ! * @exception IOException If an error occurs ! */ ! public void ! write(byte[] buf) throws IOException ! { ! // Don't do checking here, per Java Lang Spec. ! write(buf, 0, buf.length); } + + /*************************************************************************/ + + /** + * This method calls the write(int) method len + * times for all bytes from the array buf starting at index + * offset. Subclasses should overwrite this method to get a + * more efficient implementation. + * + * @param buf The byte array to write bytes from + * @param offset The index into the array to start writing bytes from + * @param len The number of bytes to write + * + * @exception IOException If an error occurs + */ + public void + write(byte[] buf, int offset, int len) throws IOException + { + // Don't do checking here, per Java Lang Spec. + for (int i=0; i < len; i++) + write(buf[offset + i]); + + } + + } // class FilterOutputStream diff -Nrc3pad gcc-3.0.4/libjava/java/io/FilterReader.java gcc-3.1/libjava/java/io/FilterReader.java *** gcc-3.0.4/libjava/java/io/FilterReader.java Sat Feb 17 01:06:44 2001 --- gcc-3.1/libjava/java/io/FilterReader.java Tue Jan 22 22:40:14 2002 *************** *** 1,75 **** ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.io; - /** - * @author Warren Levy - * @date October 15, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public abstract class FilterReader extends Reader { - /* The input stream to be filtered. */ - protected Reader in; ! protected FilterReader(Reader in) ! { ! super(in.lock); ! this.in = in; ! } ! public void close() throws IOException ! { ! // We used to set `in = null' here. We don't, though, because ! // that is the simplest way to ensure that read-after-close will ! // throw the appropriate exception -- we rely on the filtered ! // stream to do it. ! in.close(); ! } ! public synchronized void mark(int readlimit) throws IOException ! { ! in.mark(readlimit); ! } ! public boolean markSupported() ! { ! return in.markSupported(); ! } ! public int read() throws IOException ! { ! return in.read(); ! } ! public int read(char[] b, int off, int len) throws IOException ! { ! return in.read(b, off, len); ! } ! public boolean ready() throws IOException ! { ! return in.ready(); ! } ! public synchronized void reset() throws IOException ! { ! in.reset(); ! } ! public long skip(long n) throws IOException ! { ! return in.skip(n); ! } } --- 1,225 ---- ! /* FilterReader.java -- Base class for char stream classes that filter input ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This is the common superclass of all standard classes that filter ! * input. It acts as a layer on top of an underlying Reader ! * and simply redirects calls made to it to the subordinate Reader ! * instead. Subclasses of this class perform additional filtering ! * functions in addition to simply redirecting the call. ! *

    ! * When creating a subclass of FilterReader, override the ! * appropriate methods to implement the desired filtering. However, note ! * that the read(char[]) method does not need to be overridden ! * as this class redirects calls to that method to ! * read(yte[], int, int) instead of to the subordinate ! * Reader} read(yte[]) method. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ public abstract class FilterReader extends Reader { ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * This is the subordinate Reader to which method calls ! * are redirected ! */ ! protected Reader in; ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * Create a FilterReader with the specified subordinate ! * Reader. ! * The lock of the new FilterReader will be set ! * to in.lock. ! * ! * @param in The subordinate Reader ! */ ! protected ! FilterReader(Reader in) ! { ! super(in.lock); ! this.in = in; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! /** ! * Calls the in.mark(int) method. ! * ! * @param readlimit The parameter passed to in.mark(int) ! * ! * @exception IOException If an error occurs ! */ ! public void ! mark(int readlimit) throws IOException ! { ! in.mark(readlimit); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.markSupported() method. ! * ! * @return true if mark/reset is supported, false otherwise ! */ ! public boolean ! markSupported() ! { ! return(in.markSupported()); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.reset() method. ! * ! * @exception IOException If an error occurs ! */ ! public void ! reset() throws IOException ! { ! in.reset(); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.read() method. ! * ! * @return The value returned from in.available() ! * ! * @exception IOException If an error occurs ! */ ! public boolean ! ready() throws IOException ! { ! return(in.ready()); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.skip(long) method ! * ! * @param The requested number of chars to skip. ! * ! * @return The value returned from in.skip(long) ! * ! * @exception IOException If an error occurs ! */ ! public long ! skip(long num_chars) throws IOException ! { ! return(in.skip(num_chars)); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.read() method ! * ! * @return The value returned from in.read() ! * ! * @exception IOException If an error occurs ! */ ! public int ! read() throws IOException ! { ! return(in.read()); ! } ! ! /*************************************************************************/ ! ! /** ! * Calls the in.read(char[], int, int) method. ! * ! * @param buf The buffer to read chars into ! * @param offset The index into the buffer to start storing chars ! * @param len The maximum number of chars to read. ! * ! * @return The value retured from in.read(char[], int, int) ! * ! * @exception IOException If an error occurs ! */ ! public int ! read(char[] buf, int offset, int len) throws IOException ! { ! return(in.read(buf, offset, len)); } + + /*************************************************************************/ + + /** + * This method closes the stream by calling the close() method + * of the underlying stream. + * + * @exception IOException If an error occurs + */ + public void + close() throws IOException + { + in.close(); + } + + } // class FilterReader diff -Nrc3pad gcc-3.0.4/libjava/java/io/FilterWriter.java gcc-3.1/libjava/java/io/FilterWriter.java *** gcc-3.0.4/libjava/java/io/FilterWriter.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/FilterWriter.java Tue Jan 22 22:40:14 2002 *************** *** 1,58 **** ! // FilterWriter.java - Filtered character output stream. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 25, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ public abstract class FilterWriter extends Writer { - public void close () throws IOException - { - out.close(); - } ! protected FilterWriter (Writer ox) ! { ! super (ox); ! out = ox; ! } ! public void flush () throws IOException ! { ! out.flush(); ! } ! public void write (int oneChar) throws IOException ! { ! out.write(oneChar); ! } ! public void write (char[] buffer, int offset, int count) throws IOException ! { ! out.write(buffer, offset, count); ! } ! public void write (String str, int offset, int count) throws IOException ! { ! out.write(str, offset, count); ! } ! // Where our writes should go. ! protected Writer out; } --- 1,179 ---- ! /* FilterWriter.java -- Parent class for output streams that filter ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to version 1.1. */ + /** + * This class is the common superclass of output character stream classes + * that filter the output they write. These classes typically transform the + * data in some way prior to writing it out to another underlying + * Writer. This class simply overrides all the + * methods in Writer to redirect them to the + * underlying stream. Subclasses provide actual filtering. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public abstract class FilterWriter extends Writer { ! /*************************************************************************/ ! /* ! * Instance Variables ! */ ! /** ! * This is the subordinate Writer that this class ! * redirects its method calls to. ! */ ! protected Writer out; ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * This method initializes an instance of FilterWriter ! * to write to the specified subordinate Writer. ! * The given Writer will be used as lock for ! * the newly created FilterWriter. ! * ! * @param out The Writer to write to ! */ ! protected ! FilterWriter(Writer out) ! { ! super(out); ! this.out = out; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * This method closes the underlying Writer. Any ! * further attempts to write to this stream may throw an exception. ! * ! * @exception IOException If an error occurs ! */ ! public void ! close() throws IOException ! { ! out.close(); ! } ! ! /*************************************************************************/ ! ! /** ! * This method attempt to flush all buffered output to be written to the ! * underlying output sink. ! * ! * @exception IOException If an error occurs ! */ ! public void ! flush() throws IOException ! { ! out.flush(); ! } ! ! /*************************************************************************/ ! ! /** ! * This method writes a single char of output to the underlying ! * Writer. ! * ! * @param b The char to write, passed as an int. ! * ! * @exception IOException If an error occurs ! */ ! public void ! write(int b) throws IOException ! { ! out.write(b); } + + /*************************************************************************/ + + /** + * This method writes len chars from the array buf + * starting at index offset to the underlying + * Writer. + * + * @param buf The char array to write chars from + * @param offset The index into the array to start writing chars from + * @param len The number of chars to write + * + * @exception IOException If an error occurs + */ + public void + write(char[] buf, int offset, int len) throws IOException + { + out.write(buf, offset, len); + } + + /*************************************************************************/ + + /** + * This method writes len chars from the String + * starting at position offset. + * + * @param str The String that is to be written + * @param offset The character offset into the String to start writing from + * @param len The number of chars to write + * + * @exception IOException If an error occurs + */ + public void + write(String str, int offset, int len) throws IOException + { + out.write(str, offset, len); + } + + } // class FilterWriter + diff -Nrc3pad gcc-3.0.4/libjava/java/io/IOException.java gcc-3.1/libjava/java/io/IOException.java *** gcc-3.0.4/libjava/java/io/IOException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/IOException.java Tue Jan 22 22:40:14 2002 *************** *** 1,34 **** ! // IOException.java - Base class for I/O Exceptions ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public class IOException extends Exception { - public IOException () - { - super (); - } ! public IOException (String s) ! { ! super (s); ! } } --- 1,88 ---- ! /* IOException.java -- Generic input/output exception ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * This exception is thrown to indicate an I/O problem of some sort + * occurred. Since this is a fairly generic exception, often a subclass + * of IOException will actually be thrown in order to provide a more + * detailed indication of what happened. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + * @date September 24, 1998 + */ public class IOException extends Exception { ! /* ! * Constructors ! */ ! ! /** ! * Create a new IOException without a descriptive error message ! */ ! public ! IOException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Create a new IOException with a descriptive error message String + * + * @param message The descriptive error message + */ + public + IOException(String message) + { + super(message); + } + + } // class IOException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/InputStream.java gcc-3.1/libjava/java/io/InputStream.java *** gcc-3.0.4/libjava/java/io/InputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/InputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,56 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.io; /** ! * @author Warren Levy ! * @date October 2, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ ! public abstract class InputStream { public InputStream() { } public int available() throws IOException { return 0; } public void close() throws IOException { // Do nothing } public void mark(int readlimit) { // Do nothing } public boolean markSupported() { return false; } public abstract int read() throws IOException; public int read(byte[] b) throws IOException { return read(b, 0, b.length); } public int read(byte[] b, int off, int len) throws IOException { if (off < 0 || len < 0 || off + len > b.length) --- 1,196 ---- ! /* InputStream.java -- Base class for input ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; /** ! * This abstract class forms the base of the hierarchy of classes that read ! * input as a stream of bytes. It provides a common set of methods for ! * reading bytes from streams. Subclasses implement and extend these ! * methods to read bytes from a particular input source such as a file ! * or network connection. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ public abstract class InputStream { + /** + * Default, no-arg, public constructor + */ public InputStream() { } + /** + * This method returns the number of bytes that can be read from this + * stream before a read can block. A return of 0 indicates that blocking + * might (or might not) occur on the very next read attempt. + *

    + * This method always returns 0 in this class + * + * @return The number of bytes that can be read before blocking could occur + * + * @exception IOException If an error occurs + */ public int available() throws IOException { return 0; } + /** + * This method closes the stream. Any futher attempts to read from the + * stream may generate an IOException + *

    + * This method does nothing in this class, but subclasses may override + * this method in order to provide additional functionality. + * + * @exception IOException If an error occurs, which can only happen + * in a subclass + */ public void close() throws IOException { // Do nothing } + /** + * This method marks a position in the input to which the stream can + * be "reset" by calling the reset() method. The + * parameter @code{readlimit} is the number of bytes that can be read + * from the stream after setting the mark before the mark becomes + * invalid. For example, if mark() is called with a + * read limit of 10, then when 11 bytes of data are read from the + * stream before the reset() method is called, then the + * mark is invalid and the stream object instance is not required to + * remember the mark. + *

    + * This method does nothing in this class, but subclasses may override it + * to provide mark/reset functionality. + * + * @param readLimit The number of bytes that can be read before the + * mark becomes invalid + */ public void mark(int readlimit) { // Do nothing } + /** + * This method returns a boolean that indicates whether the mark/reset + * methods are supported in this class. Those methods can be used to + * remember a specific point in the stream and reset the stream to that + * point. + *

    + * This method always returns false in this class, but + * subclasses can override this method to return true + * if they support mark/reset functionality. + * + * @return true if mark/reset functionality is + * supported, false otherwise + */ public boolean markSupported() { return false; } + /** + * This method reads an unsigned byte from the input stream and returns it + * as an int in the range of 0-255. This method also will return -1 if + * the end of the stream has been reached. + *

    + * This method will block until the byte can be read. + * + * @return The byte read or -1 if end of stream + * + * @exception IOException If an error occurs + */ public abstract int read() throws IOException; + /** + * This method reads bytes from a stream and stores them into a caller + * supplied buffer. This method attempts to completely fill the buffer, + * but can return before doing so. The actual number of bytes read is + * returned as an int. A -1 is returned to indicate the end of the stream. + *

    + * This method will block until some data can be read. + *

    + * This method operates by calling an overloaded read method like so: + * read(b, 0, b.length) + * + * @param b The buffer into which the bytes read will be stored. + * + * @return The number of bytes read or -1 if end of stream. + * + * @exception IOException If an error occurs. + */ public int read(byte[] b) throws IOException { return read(b, 0, b.length); } + /** + * This method read bytes from a stream and stores them into a + * caller supplied buffer. It starts storing the data at index + * off into the buffer and attempts to read + * len bytes. This method can return before reading the + * number of bytes requested. The actual number of bytes read is + * returned as an int. A -1 is returned to indicate the end of the + * stream. + *

    + * This method will block until some data can be read. + *

    + * This method operates by calling the single byte read() method + * in a loop until the desired number of bytes are read. The read loop + * stops short if the end of the stream is encountered or if an IOException + * is encountered on any read operation except the first. If the first + * attempt to read a bytes fails, the IOException is allowed to propagate + * upward. And subsequent IOException is caught and treated identically + * to an end of stream condition. Subclasses can (and should if possible) + * override this method to provide a more efficient implementation. + * + * @param b The array into which the bytes read should be stored + * @param off The offset into the array to start storing bytes + * @param len The requested number of bytes to read + * + * @return The actual number of bytes read, or -1 if end of stream. + * + * @exception IOException If an error occurs. + */ public int read(byte[] b, int off, int len) throws IOException { if (off < 0 || len < 0 || off + len > b.length) *************** public abstract class InputStream *** 62,88 **** for (i = 0; i < len; ++i) try ! { ! if ((ch = read()) < 0) ! return i == 0 ? -1 : i; // EOF ! b[off + i] = (byte) ch; ! } catch (IOException ex) ! { ! // Only reading the first byte should cause an IOException. ! if (i == 0) ! throw ex; ! return i; ! } return i; } public void reset() throws IOException { throw new IOException("mark/reset not supported"); } public long skip(long n) throws IOException { // Throw away n bytes by reading them into a temp byte[]. --- 202,256 ---- for (i = 0; i < len; ++i) try ! { ! if ((ch = read()) < 0) ! return i == 0 ? -1 : i; // EOF ! b[off + i] = (byte) ch; ! } catch (IOException ex) ! { ! // Only reading the first byte should cause an IOException. ! if (i == 0) ! throw ex; ! return i; ! } return i; } + /** + * This method resets a stream to the point where the + * mark() method was called. Any bytes that were read + * after the mark point was set will be re-read during subsequent + * reads. + *

    + * This method always throws an IOException in this class, but subclasses + * can override this method if they provide mark/reset functionality. + * + * @exception IOException Always thrown for this class + */ public void reset() throws IOException { throw new IOException("mark/reset not supported"); } + /** + * This method skips the specified number of bytes in the stream. It + * returns the actual number of bytes skipped, which may be less than the + * requested amount. + *

    + * This method reads and discards bytes into a byte array until the + * specified number of bytes were skipped or until either the end of stream + * is reached or a read attempt returns a short count. Subclasses can + * override this metho to provide a more efficient implementation where + * one exists. + * + * @param n The requested number of bytes to skip + * + * @return The actual number of bytes skipped. + * + * @exception IOException If an error occurs + */ public long skip(long n) throws IOException { // Throw away n bytes by reading them into a temp byte[]. diff -Nrc3pad gcc-3.0.4/libjava/java/io/InputStreamReader.java gcc-3.1/libjava/java/io/InputStreamReader.java *** gcc-3.0.4/libjava/java/io/InputStreamReader.java Fri Feb 9 01:54:38 2001 --- gcc-3.1/libjava/java/io/InputStreamReader.java Mon Aug 6 22:01:32 2001 *************** public class InputStreamReader extends R *** 44,49 **** --- 44,54 ---- private InputStreamReader(InputStream in, BytesToUnicode decoder) { + // FIXME: someone could pass in a BufferedInputStream whose buffer + // is smaller than the longest encoded character for this + // encoding. We will probably go into an infinite loop in this + // case. We probably ought to just have our own byte buffering + // here. this.in = in instanceof BufferedInputStream ? (BufferedInputStream) in : new BufferedInputStream(in); *************** public class InputStreamReader extends R *** 76,103 **** if (wpos < wcount) return true; ! if (work == null) ! { ! work = new char[100]; ! wpos = 0; ! wcount = 0; ! } ! for (;;) ! { ! if (in.available() <= 0) ! return false; ! in.mark(1); ! int b = in.read(); ! if (b < 0) ! return true; ! in.reset(); ! converter.setInput(in.buf, in.pos, in.count); ! wpos = 0; ! wcount = converter.read(work, 0, work.length); ! in.skip(converter.inpos - in.pos); ! if (wcount > 0) ! return true; ! } } } --- 81,91 ---- if (wpos < wcount) return true; ! ! // According to the spec, an InputStreamReader is ready if its ! // input buffer is not empty (above), or if bytes are ! // available on the underlying byte stream. ! return in.available () > 0; } } *************** public class InputStreamReader extends R *** 108,140 **** if (in == null) throw new IOException("Stream closed"); int wavail = wcount - wpos; ! if (wavail > 0) ! { ! if (length > wavail) ! length = wavail; ! System.arraycopy(work, wpos, buf, offset, length); ! wpos += length; ! return length; ! } ! else { ! if (length == 0) ! return 0; ! for (;;) ! { ! in.mark(1); ! int b = in.read(); ! if (b < 0) ! return -1; ! in.reset(); ! converter.setInput(in.buf, in.pos, in.count); ! int count = converter.read (buf, offset, length); ! in.skip(converter.inpos - in.pos); ! if (count > 0) ! return count; ! } } } } --- 96,118 ---- if (in == null) throw new IOException("Stream closed"); + if (length == 0) + return 0; + int wavail = wcount - wpos; ! if (wavail <= 0) { ! // Nothing waiting, so refill our buffer. ! if (! refill ()) ! return -1; ! wavail = wcount - wpos; } + + if (length > wavail) + length = wavail; + System.arraycopy(work, wpos, buf, offset, length); + wpos += length; + return length; } } *************** public class InputStreamReader extends R *** 146,169 **** throw new IOException("Stream closed"); int wavail = wcount - wpos; ! if (wavail > 0) ! return work[wpos++]; ! if (work == null) { ! work = new char[100]; ! wpos = 0; ! wcount = 0; } ! else if (wavail == 0) { ! wpos = 0; ! wcount = 0; } - int count = read(work, wpos, work.length-wpos); - if (count <= 0) - return -1; - wcount = wpos + count; - return work[wpos++]; } } } --- 124,168 ---- throw new IOException("Stream closed"); int wavail = wcount - wpos; ! if (wavail <= 0) { ! // Nothing waiting, so refill our buffer. ! if (! refill ()) ! return -1; } ! ! return work[wpos++]; ! } ! } ! ! // Read more bytes and convert them into the WORK buffer. ! // Return false on EOF. ! private boolean refill () throws IOException ! { ! wcount = wpos = 0; ! ! if (work == null) ! work = new char[100]; ! ! for (;;) ! { ! // We have knowledge of the internals of BufferedInputStream ! // here. Eww. ! in.mark (0); ! // BufferedInputStream.refill() can only be called when ! // `pos>=count'. ! boolean r = in.pos < in.count || in.refill (); ! in.reset (); ! if (! r) ! return false; ! converter.setInput(in.buf, in.pos, in.count); ! int count = converter.read (work, wpos, work.length - wpos); ! in.skip(converter.inpos - in.pos); ! if (count > 0) { ! wcount += count; ! return true; } } } } diff -Nrc3pad gcc-3.0.4/libjava/java/io/InterruptedIOException.java gcc-3.1/libjava/java/io/InterruptedIOException.java *** gcc-3.0.4/libjava/java/io/InterruptedIOException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/InterruptedIOException.java Tue Jan 22 22:40:14 2002 *************** *** 1,36 **** ! // InterruptedIOException.java ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public class InterruptedIOException extends IOException { - public InterruptedIOException () - { - super (); - } ! public InterruptedIOException (String s) ! { ! super (s); ! } ! public int bytesTransferred = 0; } --- 1,115 ---- ! /* InterruptedIOException.java -- An I/O operation was interrupted. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * This exception is thrown when a in process I/O operation is + * interrupted for some reason. The field bytesTransferred will contain + * the number of bytes that were read/written prior to the interruption. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + * @date September 24, 1998 + */ public class InterruptedIOException extends IOException { ! private static final long serialVersionUID = 4020568460727500567L; ! /* ! * Instance Variables ! */ ! ! /** ! * The number of bytes read/written prior to the interruption ! */ ! public int bytesTransferred; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Create a new InterruptedIOException without a descriptive error message ! */ ! public ! InterruptedIOException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Create a new InterruptedIOException with a descriptive error message String + * + * @param message The descriptive error message + */ + public + InterruptedIOException(String message) + { + super(message); + } + + /*************************************************************************/ + + /** + * Create a new InterruptedIOException with a descriptive error message + * String. Also sets the value of the bytesTransferred field. + * + * @param message The descriptive error message + * @param bytesTransferred The number of bytes tranferred before the interruption + */ + InterruptedIOException(String message, int bytesTransferred) + { + super(message); + this.bytesTransferred = bytesTransferred; + } + + } // class InterruptedIOException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/InvalidClassException.java gcc-3.1/libjava/java/io/InvalidClassException.java *** gcc-3.0.4/libjava/java/io/InvalidClassException.java Sun May 6 14:08:26 2001 --- gcc-3.1/libjava/java/io/InvalidClassException.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/InvalidObjectException.java gcc-3.1/libjava/java/io/InvalidObjectException.java *** gcc-3.0.4/libjava/java/io/InvalidObjectException.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/InvalidObjectException.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/LineNumberReader.java gcc-3.1/libjava/java/io/LineNumberReader.java *** gcc-3.0.4/libjava/java/io/LineNumberReader.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/LineNumberReader.java Mon Jul 2 05:16:24 2001 *************** *** 1,4 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. *************** public class LineNumberReader extends Bu *** 94,100 **** if (markPos > 0 && pos > markPos && buffer[markPos-1] == '\r' && buffer[markPos] == '\n') lineNumber--; ! lineNumber -= countLines(buffer, pos, markPos); pos = markPos; } } --- 94,100 ---- if (markPos > 0 && pos > markPos && buffer[markPos-1] == '\r' && buffer[markPos] == '\n') lineNumber--; ! lineNumber -= countLines(buffer, markPos, pos - markPos); pos = markPos; } } diff -Nrc3pad gcc-3.0.4/libjava/java/io/NotActiveException.java gcc-3.1/libjava/java/io/NotActiveException.java *** gcc-3.0.4/libjava/java/io/NotActiveException.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/NotActiveException.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/NotSerializableException.java gcc-3.1/libjava/java/io/NotSerializableException.java *** gcc-3.0.4/libjava/java/io/NotSerializableException.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/NotSerializableException.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectInput.java gcc-3.1/libjava/java/io/ObjectInput.java *** gcc-3.0.4/libjava/java/io/ObjectInput.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/ObjectInput.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** package java.io; *** 37,43 **** * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public abstract interface ObjectInput extends DataInput { /** --- 48,54 ---- * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public interface ObjectInput extends DataInput { /** diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectInputStream.java gcc-3.1/libjava/java/io/ObjectInputStream.java *** gcc-3.0.4/libjava/java/io/ObjectInputStream.java Sun May 6 14:08:26 2001 --- gcc-3.1/libjava/java/io/ObjectInputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,5 **** /* ObjectInputStream.java -- Class used to read serialized objects ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* ObjectInputStream.java -- Class used to read serialized objects ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** public class ObjectInputStream extends I *** 225,237 **** { dumpElementln ("ARRAY"); ObjectStreamClass osc = (ObjectStreamClass)readObject (); ! Class componenetType = osc.forClass ().getComponentType (); dumpElement ("ARRAY LENGTH="); int length = this.realInputStream.readInt (); ! dumpElementln (length + "; COMPONENT TYPE=" + componenetType); ! Object array = Array.newInstance (componenetType, length); int handle = assignNewHandle (array); ! readArrayElements (array, componenetType); for (int i=0, len=Array.getLength(array); i < len; i++) dumpElementln (" ELEMENT[" + i + "]=" + Array.get(array, i).toString()); ret_val = processResolution (array, handle); --- 236,248 ---- { dumpElementln ("ARRAY"); ObjectStreamClass osc = (ObjectStreamClass)readObject (); ! Class componentType = osc.forClass ().getComponentType (); dumpElement ("ARRAY LENGTH="); int length = this.realInputStream.readInt (); ! dumpElementln (length + "; COMPONENT TYPE=" + componentType); ! Object array = Array.newInstance (componentType, length); int handle = assignNewHandle (array); ! readArrayElements (array, componentType); for (int i=0, len=Array.getLength(array); i < len; i++) dumpElementln (" ELEMENT[" + i + "]=" + Array.get(array, i).toString()); ret_val = processResolution (array, handle); *************** public class ObjectInputStream extends I *** 528,535 **** throws SecurityException { if (enable) ! if (getClass ().getClassLoader () != null) ! throw new SecurityException ("Untrusted ObjectInputStream subclass attempted to enable object resolution"); boolean old_val = this.resolveEnabled; this.resolveEnabled = enable; --- 539,549 ---- throws SecurityException { if (enable) ! { ! SecurityManager sm = System.getSecurityManager (); ! if (sm != null) ! sm.checkPermission (new SerializablePermission ("enableSubtitution")); ! } boolean old_val = this.resolveEnabled; this.resolveEnabled = enable; *************** public class ObjectInputStream extends I *** 1295,1301 **** // returns a new instance of REAL_CLASS that has been constructed ! // only to th level of CONSTRUCTOR_CLASS (a super class of REAL_CLASS) private Object newObject (Class real_class, Class constructor_class) { try --- 1309,1315 ---- // returns a new instance of REAL_CLASS that has been constructed ! // only to the level of CONSTRUCTOR_CLASS (a super class of REAL_CLASS) private Object newObject (Class real_class, Class constructor_class) { try diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectInputValidation.java gcc-3.1/libjava/java/io/ObjectInputValidation.java *** gcc-3.0.4/libjava/java/io/ObjectInputValidation.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/ObjectInputValidation.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** package java.io; *** 34,40 **** * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public abstract interface ObjectInputValidation { /** --- 45,51 ---- * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public interface ObjectInputValidation { /** diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectOutput.java gcc-3.1/libjava/java/io/ObjectOutput.java *** gcc-3.0.4/libjava/java/io/ObjectOutput.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/ObjectOutput.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** package java.io; *** 36,42 **** * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public abstract interface ObjectOutput extends DataOutput { --- 47,53 ---- * * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public interface ObjectOutput extends DataOutput { diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectOutputStream.java gcc-3.1/libjava/java/io/ObjectOutputStream.java *** gcc-3.0.4/libjava/java/io/ObjectOutputStream.java Sat Jan 27 06:04:29 2001 --- gcc-3.1/libjava/java/io/ObjectOutputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,5 **** /* ObjectOutputStream.java -- Class used to write serialized objects ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* ObjectOutputStream.java -- Class used to write serialized objects ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** public class ObjectOutputStream extends *** 550,557 **** throws SecurityException { if (enable) ! if (getClass ().getClassLoader () != null) ! throw new SecurityException ("Untrusted ObjectOutputStream subclass attempted to enable object replacement"); boolean old_val = replacementEnabled; replacementEnabled = enable; --- 561,571 ---- throws SecurityException { if (enable) ! { ! SecurityManager sm = System.getSecurityManager (); ! if (sm != null) ! sm.checkPermission (new SerializablePermission ("enableSubstitution")); ! } boolean old_val = replacementEnabled; replacementEnabled = enable; diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectStreamClass.java gcc-3.1/libjava/java/io/ObjectStreamClass.java *** gcc-3.0.4/libjava/java/io/ObjectStreamClass.java Sun May 6 14:08:26 2001 --- gcc-3.1/libjava/java/io/ObjectStreamClass.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectStreamConstants.java gcc-3.1/libjava/java/io/ObjectStreamConstants.java *** gcc-3.0.4/libjava/java/io/ObjectStreamConstants.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/ObjectStreamConstants.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectStreamException.java gcc-3.1/libjava/java/io/ObjectStreamException.java *** gcc-3.0.4/libjava/java/io/ObjectStreamException.java Fri Jul 28 11:58:03 2000 --- gcc-3.1/libjava/java/io/ObjectStreamException.java Tue Jan 22 22:40:14 2002 *************** *** 1,31 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Warren Levy ! * @date February 7, 2000. ! */ /* Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ ! public abstract class ObjectStreamException extends IOException { - protected ObjectStreamException() - { - super(); - } ! protected ObjectStreamException(String msg) ! { ! super(msg); ! } } --- 1,86 ---- ! /* ObjectStreamException.java -- Superclass of all serialisation exceptions ! Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ ! /** ! * This exception is thrown when a problem occurs during serialization. ! * There are more specific subclasses than give more fine grained ! * indications of the precise failure. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! * @date February 7, 2000. ! */ ! public abstract class ObjectStreamException extends IOException { ! /* ! * Constructors ! */ ! ! /** ! * Create a new ObjectStreamException without a descriptive error message ! */ ! protected ! ObjectStreamException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Create a new ObjectStreamException with a descriptive error message String + * + * @param message The descriptive error message + */ + protected + ObjectStreamException(String message) + { + super(message); + } + + } // class ObjectStreamException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/ObjectStreamField.java gcc-3.1/libjava/java/io/ObjectStreamField.java *** gcc-3.0.4/libjava/java/io/ObjectStreamField.java Fri May 19 17:55:31 2000 --- gcc-3.1/libjava/java/io/ObjectStreamField.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/OptionalDataException.java gcc-3.1/libjava/java/io/OptionalDataException.java *** gcc-3.0.4/libjava/java/io/OptionalDataException.java Fri Sep 8 19:37:08 2000 --- gcc-3.1/libjava/java/io/OptionalDataException.java Tue Jan 22 22:40:14 2002 *************** *** 1,39 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Warren Levy ! * @date February 7, 2000. ! */ /* Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ public class OptionalDataException extends ObjectStreamException { - // FIXME: Need to set these fields per the doc in a constructor. - public boolean eof; - public int length; ! // FIXME: This can probably go away once the right signatures of ! // these package private constructors is determined. ! private static final long serialVersionUID = -8011121865681257820L; ! OptionalDataException() ! { ! super(); ! } ! OptionalDataException(String msg) ! { ! super(msg); ! } } --- 1,98 ---- ! /* OptionalDataException.java -- indicates unexpected data in serialised stream ! Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ + /** + * This exception is thrown when unexpected data appears in the input + * stream from which a serialized object is being read. The field + * eof will always be set to true (***Why even have it?***) and + * the count field will contain the number of valid bytes + * available to be read. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date February 7, 2000. + */ public class OptionalDataException extends ObjectStreamException { ! private static final long serialVersionUID = -8011121865681257820L; ! /* ! * Instance Variables ! */ ! /** ! * Whether or not the end of the stream has been reached ! */ ! public boolean eof; ! ! /** ! * The number of valid bytes that can be read ! */ ! public int length; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Create a new OptionalDataException with an eof parameter indicating ! * whether or not the end of stream is reached and the number of valid ! * bytes that may be read. ! * ! * @param eof 'true' if end of stream reached, 'false' otherwise ! * @param count The number of valid bytes to be read. ! */ ! OptionalDataException(boolean eof, int count) ! { ! this.eof = eof; ! this.length = count; } + + } // class OptionalDataException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/OutputStream.java gcc-3.1/libjava/java/io/OutputStream.java *** gcc-3.0.4/libjava/java/io/OutputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/OutputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,34 **** ! // OutputStream.java - Send output bytes to output sink. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * Status: Complete to version 1.1. - */ public abstract class OutputStream { public abstract void write (int b) throws IOException; public void write (byte[] b) throws IOException, NullPointerException { write (b, 0, b.length); } public void write (byte[] b, int off, int len) throws IOException, NullPointerException, IndexOutOfBoundsException { --- 1,106 ---- ! /* OutputStream.java -- Base class for byte output streams ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + package java.io; + + /** + * This abstract class forms the base of the hierarchy of classes that + * write output as a stream of bytes. It provides a common set of methods + * for writing bytes to stream. Subclasses implement and/or extend these + * methods to write bytes in a particular manner or to a particular + * destination such as a file on disk or network connection. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public abstract class OutputStream { + /** + * This is the default no-argument constructor for this class. This method + * does nothing in this class. + */ + public OutputStream () + { + } + + /** + * This method writes a single byte to the output stream. The byte written + * is the low eight bits of the int passed and a argument. + *

    + * Subclasses must provide an implementation of this abstract method + * + * @param b The byte to be written to the output stream, passed as + * the low eight bits of an int + * + * @exception IOException If an error occurs + */ public abstract void write (int b) throws IOException; + /** + * This method all the writes bytes from the passed array to the + * output stream. This method is equivalent to write(b, 0, + * buf.length) which is exactly how it is implemented in this + * class. + * + * @param b The array of bytes to write + * + * @exception IOException If an error occurs + */ public void write (byte[] b) throws IOException, NullPointerException { write (b, 0, b.length); } + /** + * This method writes len bytes from the specified array + * b starting at index off into the array. + *

    + * This method in this class calls the single byte write() + * method in a loop until all bytes have been written. Subclasses should + * override this method if possible in order to provide a more efficent + * implementation. + * + * @param b The array of bytes to write from + * @param off The index into the array to start writing from + * @param len The number of bytes to write + * + * @exception IOException If an error occurs + */ public void write (byte[] b, int off, int len) throws IOException, NullPointerException, IndexOutOfBoundsException { *************** public abstract class OutputStream *** 38,47 **** --- 110,139 ---- write (b[off + i]); } + /** + * This method forces any data that may have been buffered to be written + * to the underlying output device. Please note that the host environment + * might perform its own buffering unbeknowst to Java. In that case, a + * write made (for example, to a disk drive) might be cached in OS + * buffers instead of actually being written to disk. + *

    + * This method in this class does nothing. + * + * @exception IOException If an error occurs + */ public void flush () throws IOException { } + /** + * This method closes the stream. Any internal or native resources + * associated with this stream are freed. Any subsequent attempt to + * access the stream might throw an exception. + *

    + * This method in this class does nothing. + * + * @exception IOException If an error occurs + */ public void close () throws IOException { } diff -Nrc3pad gcc-3.0.4/libjava/java/io/PipedInputStream.java gcc-3.1/libjava/java/io/PipedInputStream.java *** gcc-3.0.4/libjava/java/io/PipedInputStream.java Sat Jan 6 23:28:40 2001 --- gcc-3.1/libjava/java/io/PipedInputStream.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ // NOTE: This implementation is very similar to that of PipedReader. If you // fix a bug in here, chances are you should make a similar change to the --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ // NOTE: This implementation is very similar to that of PipedReader. If you // fix a bug in here, chances are you should make a similar change to the *************** public class PipedInputStream extends In *** 194,200 **** else copylen = Math.min (len, buffer.length - in); ! // Copy bytes until the pipe is filled, wrapping if neccessary. System.arraycopy(buf, bufpos, buffer, in, copylen); len -= copylen; bufpos += copylen; --- 205,211 ---- else copylen = Math.min (len, buffer.length - in); ! // Copy bytes until the pipe is filled, wrapping if necessary. System.arraycopy(buf, bufpos, buffer, in, copylen); len -= copylen; bufpos += copylen; diff -Nrc3pad gcc-3.0.4/libjava/java/io/PipedOutputStream.java gcc-3.1/libjava/java/io/PipedOutputStream.java *** gcc-3.0.4/libjava/java/io/PipedOutputStream.java Fri Jan 5 08:23:51 2001 --- gcc-3.1/libjava/java/io/PipedOutputStream.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/PipedReader.java gcc-3.1/libjava/java/io/PipedReader.java *** gcc-3.0.4/libjava/java/io/PipedReader.java Sat Feb 17 01:06:44 2001 --- gcc-3.1/libjava/java/io/PipedReader.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** public class PipedReader extends Reader *** 181,187 **** else copylen = Math.min (len, buffer.length - in); ! // Copy chars until the pipe is filled, wrapping if neccessary. System.arraycopy(buf, bufpos, buffer, in, copylen); len -= copylen; bufpos += copylen; --- 192,198 ---- else copylen = Math.min (len, buffer.length - in); ! // Copy chars until the pipe is filled, wrapping if necessary. System.arraycopy(buf, bufpos, buffer, in, copylen); len -= copylen; bufpos += copylen; diff -Nrc3pad gcc-3.0.4/libjava/java/io/PipedWriter.java gcc-3.1/libjava/java/io/PipedWriter.java *** gcc-3.0.4/libjava/java/io/PipedWriter.java Tue Feb 20 19:03:20 2001 --- gcc-3.1/libjava/java/io/PipedWriter.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; *************** public class PipedWriter extends Writer *** 104,112 **** * @exception IOException If the stream has not been connected or has * been closed. */ ! public void write(char b) throws IOException { ! read_buf[0] = b; sink.receive (read_buf, 0, 1); } --- 115,123 ---- * @exception IOException If the stream has not been connected or has * been closed. */ ! public void write(int b) throws IOException { ! read_buf[0] = (char) (b & 0xffff); sink.receive (read_buf, 0, 1); } diff -Nrc3pad gcc-3.0.4/libjava/java/io/PrintWriter.java gcc-3.1/libjava/java/io/PrintWriter.java *** gcc-3.0.4/libjava/java/io/PrintWriter.java Thu Aug 24 06:56:38 2000 --- gcc-3.1/libjava/java/io/PrintWriter.java Tue Jan 22 22:40:14 2002 *************** *** 1,11 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; /** --- 1,40 ---- ! /* PrintWriter.java -- prints primitive values and objects to a stream as text ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package java.io; /** *************** public class PrintWriter extends Writer *** 39,45 **** private boolean autoflush; /** ! * This boolean indicates whether or not an error has ever occured * on this stream. */ private boolean error; --- 68,74 ---- private boolean autoflush; /** ! * This boolean indicates whether or not an error has ever occurred * on this stream. */ private boolean error; diff -Nrc3pad gcc-3.0.4/libjava/java/io/PushbackInputStream.java gcc-3.1/libjava/java/io/PushbackInputStream.java *** gcc-3.0.4/libjava/java/io/PushbackInputStream.java Tue Jun 27 21:27:50 2000 --- gcc-3.1/libjava/java/io/PushbackInputStream.java Mon Mar 25 02:28:02 2002 *************** *** 1,36 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; /** ! * @author Warren Levy ! * @date October 15, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ ! public class PushbackInputStream extends FilterInputStream { ! /* Internal buffer array for data. */ protected byte[] buf; ! /* The current position in the buffer. */ protected int pos; public PushbackInputStream(InputStream in) { ! this(in, 1); } public PushbackInputStream(InputStream in, int size) { super(in); --- 1,97 ---- ! /* PushbackInputStream.java -- An input stream that can unread bytes ! Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package java.io; /** ! * This subclass of FilterInputStream provides the ability to ! * unread data from a stream. It maintains an internal buffer of unread ! * data that is supplied to the next read operation. This is conceptually ! * similar to mark/reset functionality, except that in this case the ! * position to reset the stream to does not need to be known in advance. ! *

    ! * The default pushback buffer size one byte, but this can be overridden ! * by the creator of the stream. ! *

    ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ public class PushbackInputStream extends FilterInputStream { ! /** ! * This is the default buffer size ! */ ! private static final int DEFAULT_BUFFER_SIZE = 1; ! ! /** ! * This is the buffer that is used to store the pushed back data ! */ protected byte[] buf; ! /** ! * This is the position in the buffer from which the next byte will be ! * read. Bytes are stored in reverse order in the buffer, starting from ! * buf[buf.length - 1] to buf[0]. Thus when ! * pos is 0 the buffer is full and buf.length when ! * it is empty ! */ protected int pos; + /** + * This method initializes a PushbackInputStream to + * read from the * specified subordinate InputStream + * with a default pushback buffer * size of 1. + * + * @param in The subordinate stream to read from + */ public PushbackInputStream(InputStream in) { ! this(in, DEFAULT_BUFFER_SIZE); } + /** + * This method initializes a PushbackInputStream to + * read from the specified subordinate InputStream with + * the specified buffer size + * + * @param in The subordinate InputStream to read from + * @param size The pushback buffer size to use + */ public PushbackInputStream(InputStream in, int size) { super(in); *************** public class PushbackInputStream extends *** 40,62 **** pos = buf.length; } public int available() throws IOException { ! return pos + super.available(); } ! public void close() throws IOException { buf = null; super.close(); } public boolean markSupported() { return false; } ! public int read() throws IOException { if (pos < buf.length) return ((int) buf[pos++]) & 0xFF; --- 101,172 ---- pos = buf.length; } + /** + * This method returns the number of bytes that can be read from this + * stream before a read can block. A return of 0 indicates that blocking + * might (or might not) occur on the very next read attempt. + *

    + * This method will return the number of bytes available from the + * pushback buffer plus the number of bytes available from the + * underlying stream. + * + * @return The number of bytes that can be read before blocking could occur + * + * @exception IOException If an error occurs + */ public int available() throws IOException { ! return (buf.length - pos) + super.available(); } ! /** ! * This method closes the stream and releases any associated resources. ! * ! * @exception IOException If an error occurs. ! */ ! public synchronized void close() throws IOException { buf = null; super.close(); } + /** + * This method returns false to indicate that it does + * not support mark/reset functionality. + * + * @return This method returns false to indicate that + * this class does not support mark/reset functionality + */ public boolean markSupported() { return false; } ! /** ! * This method always throws an IOException in this class because ! * mark/reset functionality is not supported. ! * ! * @exception IOException Always thrown for this class ! */ ! public void reset() throws IOException ! { ! throw new IOException("Mark not supported in this class"); ! } ! ! /** ! * This method reads an unsigned byte from the input stream and returns it ! * as an int in the range of 0-255. This method also will return -1 if ! * the end of the stream has been reached. The byte returned will be read ! * from the pushback buffer, unless the buffer is empty, in which case ! * the byte will be read from the underlying stream. ! *

    ! * This method will block until the byte can be read. ! * ! * @return The byte read or -1 if end of stream ! * ! * @exception IOException If an error occurs ! */ ! public synchronized int read() throws IOException { if (pos < buf.length) return ((int) buf[pos++]) & 0xFF; *************** public class PushbackInputStream extends *** 64,102 **** return super.read(); } ! public int read(byte[] b, int off, int len) throws IOException { - if (off < 0 || len < 0 || off + len > b.length) - throw new ArrayIndexOutOfBoundsException(); - int numBytes = Math.min(buf.length - pos, len); if (numBytes > 0) { System.arraycopy (buf, pos, b, off, numBytes); pos += numBytes; ! return numBytes; } ! return super.read(b, off, len); } ! public void unread(int b) throws IOException { if (pos <= 0) ! throw new IOException(); buf[--pos] = (byte) b; } ! public void unread(byte[] b) throws IOException { unread(b, 0, b.length); } ! public void unread(byte[] b, int off, int len) throws IOException { if (pos < len) ! throw new IOException(); // Note the order that these bytes are being added is the opposite // of what would be done if they were added to the buffer one at a time. --- 174,286 ---- return super.read(); } ! /** ! * This method read bytes from a stream and stores them into a ! * caller supplied buffer. It starts storing the data at index ! * offset into the buffer and attempts to read ! * len bytes. This method can return before reading the ! * number of bytes requested. The actual number of bytes read is ! * returned as an int. A -1 is returned to indicate the end of the ! * stream. ! *

    ! * This method will block until some data can be read. ! *

    ! * This method first reads bytes from the pushback buffer in order to ! * satisfy the read request. If the pushback buffer cannot provide all ! * of the bytes requested, the remaining bytes are read from the ! * underlying stream. ! * ! * @param b The array into which the bytes read should be stored ! * @param off The offset into the array to start storing bytes ! * @param len The requested number of bytes to read ! * ! * @return The actual number of bytes read, or -1 if end of stream. ! * ! * @exception IOException If an error occurs. ! */ ! public synchronized int read(byte[] b, int off, int len) throws IOException { int numBytes = Math.min(buf.length - pos, len); if (numBytes > 0) { System.arraycopy (buf, pos, b, off, numBytes); pos += numBytes; ! len -= numBytes; ! off += numBytes; } ! if (len > 0) ! { ! len = super.read(b, off, len); ! if (len == -1) // EOF ! return numBytes > 0 ? numBytes : -1; ! numBytes += len; ! } ! return numBytes; } ! /** ! * This method pushes a single byte of data into the pushback buffer. ! * The byte pushed back is the one that will be returned as the first byte ! * of the next read. ! *

    ! * If the pushback buffer is full, this method throws an exception. ! *

    ! * The argument to this method is an int. Only the low ! * eight bits of this value are pushed back. ! * ! * @param b The byte to be pushed back, passed as an int ! * ! * @exception IOException If the pushback buffer is full. ! */ ! public synchronized void unread(int b) throws IOException { if (pos <= 0) ! throw new IOException("Insufficient space in pushback buffer"); buf[--pos] = (byte) b; } ! /** ! * This method pushes all of the bytes in the passed byte array into ! * the pushback bfer. These bytes are pushed in reverse order so that ! * the next byte read from the stream after this operation will be ! * b[0] followed by b[1], etc. ! *

    ! * If the pushback buffer cannot hold all of the requested bytes, an ! * exception is thrown. ! * ! * @param b The byte array to be pushed back ! * ! * @exception IOException If the pushback buffer is full ! */ ! public synchronized void unread(byte[] b) throws IOException { unread(b, 0, b.length); } ! /** ! * This method pushed back bytes from the passed in array into the ! * pushback buffer. The bytes from b[offset] to ! * b[offset + len] are pushed in reverse order so that ! * the next byte read from the stream after this operation will be ! * b[offset] followed by b[offset + 1], ! * etc. ! *

    ! * If the pushback buffer cannot hold all of the requested bytes, an ! * exception is thrown. ! * ! * @param b The byte array to be pushed back ! * @param off The index into the array where the bytes to be push start ! * @param len The number of bytes to be pushed. ! * ! * @exception IOException If the pushback buffer is full ! */ ! public synchronized void unread(byte[] b, int off, int len) ! throws IOException { if (pos < len) ! throw new IOException("Insufficient space in pushback buffer"); // Note the order that these bytes are being added is the opposite // of what would be done if they were added to the buffer one at a time. *************** public class PushbackInputStream extends *** 108,115 **** pos -= len; } ! // JDK1.2 ! public long skip(long n) throws IOException { final long origN = n; --- 292,315 ---- pos -= len; } ! /** ! * This method skips the specified number of bytes in the stream. It ! * returns the actual number of bytes skipped, which may be less than the ! * requested amount. ! *

    ! * This method first discards bytes from the buffer, then calls the ! * skip method on the underlying InputStream to ! * skip additional bytes if necessary. ! * ! * @param num_bytes The requested number of bytes to skip ! * ! * @return The actual number of bytes skipped. ! * ! * @exception IOException If an error occurs ! * ! * @since 1.2 ! */ ! public synchronized long skip(long n) throws IOException { final long origN = n; diff -Nrc3pad gcc-3.0.4/libjava/java/io/PushbackReader.java gcc-3.1/libjava/java/io/PushbackReader.java *** gcc-3.0.4/libjava/java/io/PushbackReader.java Sat Jan 6 23:28:40 2001 --- gcc-3.1/libjava/java/io/PushbackReader.java Mon Mar 25 01:59:54 2002 *************** along with GNU Classpath; see the file C *** 18,429 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ ! ! ! package java.io; ! ! /** ! * This subclass of FilterReader provides the ability to ! * unread data from a stream. It maintains an internal buffer of unread ! * data that is supplied to the next read operation. This is conceptually ! * similar to mark/reset functionality, except that in this case the ! * position to reset the stream to does not need to be known in advance. ! *

    ! * The default pushback buffer size one char, but this can be overridden ! * by the creator of the stream. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ ! public class PushbackReader extends FilterReader ! { ! ! /*************************************************************************/ ! ! /* ! * Class Variables ! */ ! ! /** ! * This is the default buffer size ! */ ! private static final int DEFAULT_BUFFER_SIZE = 1; ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * This is the buffer that is used to store the pushed back data ! */ ! private char[] buf; ! ! /** ! * This is the position in the buffer from which the next char will be ! * read. Bytes are stored in reverse order in the buffer, starting from ! * buf[buf.length - 1] to buf[0]. Thus when ! * pos is 0 the buffer is full and buf.length when ! * it is empty ! */ ! private int pos; ! ! /*************************************************************************/ ! /* ! * Constructors ! */ - /** - * This method initializes a PushbackReader to read from the - * specified subordinate Reader with a default pushback buffer - * size of 1. - * - * @code in The subordinate stream to read from - */ - public - PushbackReader(Reader in) - { - this(in, DEFAULT_BUFFER_SIZE); - } ! /*************************************************************************/ /** ! * This method initializes a PushbackReader to read from the ! * specified subordinate Reader with the specified buffer ! * size ! * ! * @param in The subordinate Reader to read from ! * @param bufsize The pushback buffer size to use ! */ ! public ! PushbackReader(Reader in, int bufsize) ! { ! super(in); ! ! if (bufsize < 0) ! throw new IllegalArgumentException("buffer size must be positive"); ! ! buf = new char[bufsize]; ! pos = bufsize; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods */ ! ! /** ! * This method closes the stream and frees any associated resources. ! * ! * @exception IOException If an error occurs. ! */ ! public void ! close() throws IOException ! { ! synchronized (lock) ! { ! buf = null; ! super.close(); ! } ! } ! ! /*************************************************************************/ ! ! /** ! * This method throws an exception when called since this class does ! * not support mark/reset. ! * ! * @param read_limit Not used. ! * ! * @exception IOException Always thrown to indicate mark/reset not supported. ! */ ! public void ! mark(int read_limit) throws IOException { ! throw new IOException("mark not supported in this class"); ! } ! ! /*************************************************************************/ ! /** ! * This method returns false to indicate that it does not support ! * mark/reset functionality. ! * ! * @return This method returns false to indicate that this class does not support mark/reset functionality ! * ! */ ! public boolean ! markSupported() ! { ! return(false); ! } ! /*************************************************************************/ ! /** ! * This method always throws an IOException in this class because ! * mark/reset functionality is not supported. ! * ! * @exception IOException Always thrown for this class ! */ ! public void ! reset() throws IOException ! { ! throw new IOException("reset not supported in this class"); ! } ! /*************************************************************************/ ! /** ! * This method determines whether or not this stream is ready to be read. ! * If it returns false to indicate that the stream is not ! * ready, any attempt to read from the stream could (but is not ! * guaranteed to) block. ! *

    ! * This stream is ready to read if there are either chars waiting to be ! * read in the pushback buffer or if the underlying stream is ready to ! * be read. ! * ! * @return true if this stream is ready to be read, false otherwise ! * ! * @exception IOException If an error occurs ! */ ! public boolean ! ready() throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException ("stream closed"); ! if (((buf.length - pos) > 0) || super.ready()) ! return(true); ! else ! return(false); ! } ! } ! /*************************************************************************/ ! // Don't delete this method just because the spec says it shouldn't be there! ! // See the CVS log for details. ! /** ! * This method skips the specified number of chars in the stream. It ! * returns the actual number of chars skipped, which may be less than the ! * requested amount. ! *

    ! * This method first discards chars from the buffer, then calls the ! * skip method on the underlying Reader to ! * skip additional chars if necessary. ! * ! * @param num_chars The requested number of chars to skip ! * ! * @return The actual number of chars skipped. ! * ! * @exception IOException If an error occurs ! */ ! public long ! skip(long num_chars) throws IOException ! { ! synchronized (lock) ! { ! if (num_chars <= 0) ! return(0); ! if ((buf.length - pos) >= num_chars) ! { ! pos += num_chars; ! return(num_chars); ! } ! int chars_discarded = buf.length - pos; ! pos = buf.length; ! long chars_skipped = in.skip(num_chars - chars_discarded); ! return(chars_discarded + chars_skipped); ! } // synchronized ! } ! /*************************************************************************/ ! /** ! * This method reads an unsigned char from the input stream and returns it ! * as an int in the range of 0-65535. This method also will return -1 if ! * the end of the stream has been reached. The char returned will be read ! * from the pushback buffer, unless the buffer is empty, in which case ! * the char will be read from the underlying stream. ! *

    ! * This method will block until the char can be read. ! * ! * @return The char read or -1 if end of stream ! * ! * @exception IOException If an error occurs ! */ ! public int ! read() throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (pos == buf.length) ! return(super.read()); ! ++pos; ! return((buf[pos - 1] & 0xFFFF)); ! } ! } ! /*************************************************************************/ ! /** ! * This method read chars from a stream and stores them into a caller ! * supplied buffer. It starts storing the data at index offset into ! * the buffer and attempts to read len chars. This method can ! * return before reading the number of chars requested. The actual number ! * of chars read is returned as an int. A -1 is returned to indicate the ! * end of the stream. ! *

    ! * This method will block until some data can be read. ! *

    ! * This method first reads chars from the pushback buffer in order to ! * satisfy the read request. If the pushback buffer cannot provide all ! * of the chars requested, the remaining chars are read from the ! * underlying stream. ! * ! * @param buf The array into which the chars read should be stored ! * @param offset The offset into the array to start storing chars ! * @param len The requested number of chars to read ! * ! * @return The actual number of chars read, or -1 if end of stream. ! * ! * @exception IOException If an error occurs. ! */ ! public synchronized int ! read(char[] b, int offset, int len) throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (offset < 0 || len < 0 || offset + len > b.length) ! throw new ArrayIndexOutOfBoundsException(); ! int numBytes = Math.min(buf.length - pos, len); ! if (numBytes > 0) ! { ! System.arraycopy (buf, pos, b, offset, numBytes); ! pos += numBytes; ! return numBytes; ! } ! return super.read(b, offset, len); ! } ! } ! /*************************************************************************/ ! /** ! * This method pushes a single char of data into the pushback buffer. ! * The char pushed back is the one that will be returned as the first char ! * of the next read. ! *

    ! * If the pushback buffer is full, this method throws an exception. ! *

    ! * The argument to this method is an int. Only the low eight bits ! * of this value are pushed back. ! * ! * @param b The char to be pushed back, passed as an int ! * ! * @exception IOException If the pushback buffer is full. ! */ ! public void ! unread(int b) throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (pos == 0) ! throw new IOException("Pushback buffer is full"); ! --pos; ! buf[pos] = (char)(b & 0xFFFF); ! } // synchronized ! } ! /*************************************************************************/ ! /** ! * This method pushes all of the chars in the passed char array into ! * the pushback buffer. These chars are pushed in reverse order so that ! * the next char read from the stream after this operation will be ! * buf[0] followed by buf[1], etc. ! *

    ! * If the pushback buffer cannot hold all of the requested chars, an ! * exception is thrown. ! * ! * @param buf The char array to be pushed back ! * ! * @exception IOException If the pushback buffer is full ! */ ! public synchronized void ! unread(char[] buf) throws IOException ! { ! unread(buf, 0, buf.length); ! } ! /*************************************************************************/ ! /** ! * This method pushed back chars from the passed in array into the pushback ! * buffer. The chars from buf[offset] to buf[offset + len] ! * are pushed in reverse order so that the next char read from the stream ! * after this operation will be buf[offset] followed by ! * buf[offset + 1], etc. ! *

    ! * If the pushback buffer cannot hold all of the requested chars, an ! * exception is thrown. ! * ! * @param buf The char array to be pushed back ! * @param offset The index into the array where the chars to be push start ! * @param len The number of chars to be pushed. ! * ! * @exception IOException If the pushback buffer is full ! */ ! public synchronized void ! unread(char[] b, int offset, int len) throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (pos < len) ! throw new IOException("Pushback buffer is full"); ! // Note the order that these chars are being added is the opposite ! // of what would be done if they were added to the buffer one at a time. ! // See the Java Class Libraries book p. 1397. ! System.arraycopy(b, offset, buf, pos - len, len); ! // Don't put this into the arraycopy above, an exception might be thrown ! // and in that case we don't want to modify pos. ! pos -= len; ! } } - - } // class PushbackReader --- 18,380 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.io; /** ! * This subclass of FilterReader provides the ability to ! * unread data from a stream. It maintains an internal buffer of unread ! * data that is supplied to the next read operation. This is conceptually ! * similar to mark/reset functionality, except that in this case the ! * position to reset the stream to does not need to be known in advance. ! *

    ! * The default pushback buffer size one char, but this can be overridden ! * by the creator of the stream. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy */ ! public class PushbackReader extends FilterReader { ! /** ! * This is the default buffer size ! */ ! private static final int DEFAULT_BUFFER_SIZE = 1; ! /** ! * This is the buffer that is used to store the pushed back data ! */ ! private char[] buf; ! /** ! * This is the position in the buffer from which the next char will be ! * read. Bytes are stored in reverse order in the buffer, starting from ! * buf[buf.length - 1] to buf[0]. Thus when ! * pos is 0 the buffer is full and buf.length when ! * it is empty ! */ ! private int pos; ! /** ! * This method initializes a PushbackReader to read from the ! * specified subordinate Reader with a default pushback buffer ! * size of 1. ! * ! * @code in The subordinate stream to read from ! */ ! public PushbackReader(Reader in) ! { ! this(in, DEFAULT_BUFFER_SIZE); ! } ! /** ! * This method initializes a PushbackReader to read from the ! * specified subordinate Reader with the specified buffer ! * size ! * ! * @param in The subordinate Reader to read from ! * @param bufsize The pushback buffer size to use ! */ ! public PushbackReader(Reader in, int bufsize) ! { ! super(in); ! if (bufsize < 0) ! throw new IllegalArgumentException("buffer size must be positive"); ! buf = new char[bufsize]; ! pos = bufsize; ! } ! /** ! * This method closes the stream and frees any associated resources. ! * ! * @exception IOException If an error occurs. ! */ ! public void close() throws IOException ! { ! synchronized (lock) ! { ! buf = null; ! super.close(); ! } ! } ! /** ! * This method throws an exception when called since this class does ! * not support mark/reset. ! * ! * @param read_limit Not used. ! * ! * @exception IOException Always thrown to indicate mark/reset not supported. ! */ ! public void mark(int read_limit) throws IOException ! { ! throw new IOException("mark not supported in this class"); ! } ! /** ! * This method returns false to indicate that it does not support ! * mark/reset functionality. ! * ! * @return This method returns false to indicate that this class does not support mark/reset functionality ! * ! */ ! public boolean markSupported() ! { ! return(false); ! } ! /** ! * This method always throws an IOException in this class because ! * mark/reset functionality is not supported. ! * ! * @exception IOException Always thrown for this class ! */ ! public void reset() throws IOException ! { ! throw new IOException("reset not supported in this class"); ! } ! /** ! * This method determines whether or not this stream is ready to be read. ! * If it returns false to indicate that the stream is not ! * ready, any attempt to read from the stream could (but is not ! * guaranteed to) block. ! *

    ! * This stream is ready to read if there are either chars waiting to be ! * read in the pushback buffer or if the underlying stream is ready to ! * be read. ! * ! * @return true if this stream is ready to be read, false otherwise ! * ! * @exception IOException If an error occurs ! */ ! public boolean ready() throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException ("stream closed"); ! if (((buf.length - pos) > 0) || super.ready()) ! return(true); ! else ! return(false); ! } ! } ! // Don't delete this method just because the spec says it shouldn't be there! ! // See the CVS log for details. ! /** ! * This method skips the specified number of chars in the stream. It ! * returns the actual number of chars skipped, which may be less than the ! * requested amount. ! *

    ! * This method first discards chars from the buffer, then calls the ! * skip method on the underlying Reader to ! * skip additional chars if necessary. ! * ! * @param num_chars The requested number of chars to skip ! * ! * @return The actual number of chars skipped. ! * ! * @exception IOException If an error occurs ! */ ! public long skip(long num_chars) throws IOException ! { ! synchronized (lock) ! { ! if (num_chars <= 0) ! return(0); ! if ((buf.length - pos) >= num_chars) ! { ! pos += num_chars; ! return(num_chars); ! } ! int chars_discarded = buf.length - pos; ! pos = buf.length; ! long chars_skipped = in.skip(num_chars - chars_discarded); ! return(chars_discarded + chars_skipped); ! } ! } ! /** ! * This method reads an unsigned char from the input stream and returns it ! * as an int in the range of 0-65535. This method also will return -1 if ! * the end of the stream has been reached. The char returned will be read ! * from the pushback buffer, unless the buffer is empty, in which case ! * the char will be read from the underlying stream. ! *

    ! * This method will block until the char can be read. ! * ! * @return The char read or -1 if end of stream ! * ! * @exception IOException If an error occurs ! */ ! public int read() throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (pos == buf.length) ! return(super.read()); ! ++pos; ! return((buf[pos - 1] & 0xFFFF)); ! } ! } ! /** ! * This method read chars from a stream and stores them into a caller ! * supplied buffer. It starts storing the data at index offset into ! * the buffer and attempts to read len chars. This method can ! * return before reading the number of chars requested. The actual number ! * of chars read is returned as an int. A -1 is returned to indicate the ! * end of the stream. ! *

    ! * This method will block until some data can be read. ! *

    ! * This method first reads chars from the pushback buffer in order to ! * satisfy the read request. If the pushback buffer cannot provide all ! * of the chars requested, the remaining chars are read from the ! * underlying stream. ! * ! * @param buf The array into which the chars read should be stored ! * @param offset The offset into the array to start storing chars ! * @param len The requested number of chars to read ! * ! * @return The actual number of chars read, or -1 if end of stream. ! * ! * @exception IOException If an error occurs. ! */ ! public synchronized int read(char[] b, int offset, int len) throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (offset < 0 || len < 0 || offset + len > b.length) ! throw new ArrayIndexOutOfBoundsException(); ! int numBytes = Math.min(buf.length - pos, len); ! if (numBytes > 0) ! { ! System.arraycopy (buf, pos, b, offset, numBytes); ! pos += numBytes; ! return numBytes; ! } ! return super.read(b, offset, len); ! } ! } ! /** ! * This method pushes a single char of data into the pushback buffer. ! * The char pushed back is the one that will be returned as the first char ! * of the next read. ! *

    ! * If the pushback buffer is full, this method throws an exception. ! *

    ! * The argument to this method is an int. Only the low eight bits ! * of this value are pushed back. ! * ! * @param b The char to be pushed back, passed as an int ! * ! * @exception IOException If the pushback buffer is full. ! */ ! public void unread(int b) throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (pos == 0) ! throw new IOException("Pushback buffer is full"); ! --pos; ! buf[pos] = (char)(b & 0xFFFF); ! } ! } ! /** ! * This method pushes all of the chars in the passed char array into ! * the pushback buffer. These chars are pushed in reverse order so that ! * the next char read from the stream after this operation will be ! * buf[0] followed by buf[1], etc. ! *

    ! * If the pushback buffer cannot hold all of the requested chars, an ! * exception is thrown. ! * ! * @param buf The char array to be pushed back ! * ! * @exception IOException If the pushback buffer is full ! */ ! public synchronized void unread(char[] buf) throws IOException ! { ! unread(buf, 0, buf.length); ! } ! /** ! * This method pushed back chars from the passed in array into the pushback ! * buffer. The chars from buf[offset] to buf[offset + len] ! * are pushed in reverse order so that the next char read from the stream ! * after this operation will be buf[offset] followed by ! * buf[offset + 1], etc. ! *

    ! * If the pushback buffer cannot hold all of the requested chars, an ! * exception is thrown. ! * ! * @param buf The char array to be pushed back ! * @param offset The index into the array where the chars to be push start ! * @param len The number of chars to be pushed. ! * ! * @exception IOException If the pushback buffer is full ! */ ! public synchronized void unread(char[] b, int offset, int len) ! throws IOException ! { ! synchronized (lock) ! { ! if (buf == null) ! throw new IOException("stream closed"); ! if (pos < len) ! throw new IOException("Pushback buffer is full"); ! // Note the order that these chars are being added is the opposite ! // of what would be done if they were added to the buffer one at a time. ! // See the Java Class Libraries book p. 1397. ! System.arraycopy(b, offset, buf, pos - len, len); ! // Don't put this into the arraycopy above, an exception might be thrown ! // and in that case we don't want to modify pos. ! pos -= len; ! } ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/io/RandomAccessFile.java gcc-3.1/libjava/java/io/RandomAccessFile.java *** gcc-3.0.4/libjava/java/io/RandomAccessFile.java Fri Dec 8 10:28:32 2000 --- gcc-3.1/libjava/java/io/RandomAccessFile.java Thu Aug 2 23:46:39 2001 *************** *** 1,6 **** // RandomAccessFile.java ! /* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // RandomAccessFile.java ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. *************** public class RandomAccessFile implements *** 161,172 **** public void seek (long pos) throws IOException { ! fd.seek(pos, FileDescriptor.SET); } public int skipBytes (int count) throws IOException { ! return fd.seek(count, FileDescriptor.CUR); } public void write (int oneByte) throws IOException --- 161,172 ---- public void seek (long pos) throws IOException { ! fd.seek(pos, FileDescriptor.SET, false); } public int skipBytes (int count) throws IOException { ! return count <= 0 ? 0 : fd.seek(count, FileDescriptor.CUR, true); } public void write (int oneByte) throws IOException diff -Nrc3pad gcc-3.0.4/libjava/java/io/Reader.java gcc-3.1/libjava/java/io/Reader.java *** gcc-3.0.4/libjava/java/io/Reader.java Mon Oct 30 09:20:47 2000 --- gcc-3.1/libjava/java/io/Reader.java Tue Jan 22 22:40:14 2002 *************** *** 1,11 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; /* Written using "Java Class Libraries", 2nd edition, plus online --- 1,40 ---- ! /* Reader.java -- base class of classes that read input as a stream of chars ! Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package java.io; /* Written using "Java Class Libraries", 2nd edition, plus online diff -Nrc3pad gcc-3.0.4/libjava/java/io/SequenceInputStream.java gcc-3.1/libjava/java/io/SequenceInputStream.java *** gcc-3.0.4/libjava/java/io/SequenceInputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/SequenceInputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,36 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; import java.util.Enumeration; - /** - * @author Warren Levy - * @date November 3, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class SequenceInputStream extends InputStream { ! /* The handle for the current input stream. */ private InputStream in; ! /* Secondary input stream; not used if constructed w/ enumeration. */ private InputStream in2; ! /* The enum handle; not used if constructed w/ 2 explicit input streams. */ private Enumeration enum; public SequenceInputStream(Enumeration e) { enum = e; --- 1,87 ---- ! /* SequenceInputStream.java -- Reads multiple input streams in sequence ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.io; import java.util.Enumeration; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * This class merges a sequence of multiple InputStream's in + * order to form a single logical stream that can be read by applications + * that expect only one stream. + *

    + * The streams passed to the constructor method are read in order until + * they return -1 to indicate they are at end of stream. When a stream + * reports end of stream, it is closed, then the next stream is read. + * When the last stream is closed, the next attempt to read from this + * stream will return a -1 to indicate it is at end of stream. + *

    + * If this stream is closed prior to all subordinate streams being read + * to completion, all subordinate streams are closed. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + */ public class SequenceInputStream extends InputStream { ! /** The handle for the current input stream. */ private InputStream in; ! /** Secondary input stream; not used if constructed w/ enumeration. */ private InputStream in2; ! /** The enum handle; not used if constructed w/ 2 explicit input streams. */ private Enumeration enum; + /** + * This method creates a new SequenceInputStream that obtains + * its list of subordinate InputStreams from the specified + * Enumeration + * + * @param e An Enumeration that will return a list of + * InputStreams to read in sequence + */ public SequenceInputStream(Enumeration e) { enum = e; *************** public class SequenceInputStream extends *** 38,49 **** --- 89,118 ---- in2 = null; } + /** + * This method creates a new SequenceInputStream that will read + * the two specified subordinate InputStreams in sequence. + * + * @param s1 The first InputStream to read + * @param s2 The second InputStream to read + */ public SequenceInputStream(InputStream s1, InputStream s2) { in = s1; in2 = s2; } + /** + * This method returns the number of bytes than can be read from the + * currently being read subordinate stream before that stream could + * block. Note that it is possible more bytes than this can actually + * be read without the stream blocking. If a 0 is returned, then the + * stream could block on the very next read. + * + * @return The number of bytes that can be read before blocking could occur + * + * @exception IOException If an error occurs + */ public int available() throws IOException { if (in == null) *************** public class SequenceInputStream extends *** 52,57 **** --- 121,133 ---- return in.available(); } + /** + * Closes this stream. This will cause any remaining unclosed subordinate + * InputStream's to be closed as well. Subsequent attempts to + * read from this stream may cause an exception. + * + * @exception IOException If an error occurs + */ public void close() throws IOException { while (in != null) *************** public class SequenceInputStream extends *** 61,66 **** --- 137,154 ---- } } + /** + * This method reads an unsigned byte from the input stream and returns it + * as an int in the range of 0-255. This method also will return -1 if + * the end of the stream has been reached. This will only happen when + * all of the subordinate streams have been read. + *

    + * This method will block until the byte can be read. + * + * @return The byte read, or -1 if end of stream + * + * @exception IOException If an error occurs + */ public int read() throws IOException { int ch = -1; *************** public class SequenceInputStream extends *** 74,79 **** --- 162,186 ---- return ch; } + /** + * This method reads bytes from a stream and stores them into a caller + * supplied buffer. It starts storing the data at index offset + * into the buffer and attempts to read len bytes. This method + * can return before reading the number of bytes requested. The actual number + * of bytes read is returned as an int. A -1 is returend to indicate the + * end of the stream. This will only happen when all of the subordinate + * streams have been read. + *

    + * This method will block until at least one byte can be read. + * + * @param b The array into which bytes read should be stored + * @param off The offset into the array to start storing bytes + * @param len The requested number of bytes to read + * + * @return The actual number of bytes read, or -1 if end of stream + * + * @exception IOException If an error occurs + */ public int read(byte[] b, int off, int len) throws IOException { int ch = -1; *************** public class SequenceInputStream extends *** 89,94 **** --- 196,205 ---- return ch; } + /** + * This private method is used to get the next InputStream to + * read from. Returns null when no more streams are available. + */ private InputStream getNextStream() { InputStream nextIn = null; diff -Nrc3pad gcc-3.0.4/libjava/java/io/Serializable.java gcc-3.1/libjava/java/io/Serializable.java *** gcc-3.0.4/libjava/java/io/Serializable.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/Serializable.java Tue Jan 22 22:40:14 2002 *************** *** 1,21 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.io; - /** - * @author Warren Levy - * @date August 18, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * Status: Believed complete */ public interface Serializable { ! } --- 1,54 ---- ! /* Serializable.java -- Interface to indicate a class may be serialized ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * Status: Believed complete */ + /** + * This interface has no methods. It simply serves to indicate that + * the implementing class may be serialized. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + */ public interface Serializable { ! } // interface Serializable diff -Nrc3pad gcc-3.0.4/libjava/java/io/SerializablePermission.java gcc-3.1/libjava/java/io/SerializablePermission.java *** gcc-3.0.4/libjava/java/io/SerializablePermission.java Fri Dec 15 05:59:31 2000 --- gcc-3.1/libjava/java/io/SerializablePermission.java Tue Jan 22 22:40:14 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/StreamCorruptedException.java gcc-3.1/libjava/java/io/StreamCorruptedException.java *** gcc-3.0.4/libjava/java/io/StreamCorruptedException.java Tue Apr 11 09:21:53 2000 --- gcc-3.1/libjava/java/io/StreamCorruptedException.java Tue Jan 22 22:40:14 2002 *************** *** 1,31 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.io; ! /** ! * @author Warren Levy ! * @date February 7, 2000. */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ ! public class StreamCorruptedException extends ObjectStreamException { ! public StreamCorruptedException() ! { ! super(); ! } ! public StreamCorruptedException(String msg) ! { ! super(msg); ! } } --- 1,85 ---- ! /* StreamCorruptedException.java -- Error in stream during serialization ! Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ + + /** + * This exception is thrown when there is an error in the data that is + * read from a stream during de-serialization. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date February 7, 2000. + */ + public class StreamCorruptedException extends ObjectStreamException + { ! /* ! * Constructors */ ! /** ! * Create a new StreamCorruptedException without a descriptive error message ! */ ! public ! StreamCorruptedException() { ! super(); ! } ! /*************************************************************************/ ! ! /** ! * Create a new StreamCorruptedException with a descriptive error message String ! * ! * @param message The descriptive error message ! */ ! public ! StreamCorruptedException(String message) ! { ! super(message); } + + } // class StreamCorruptedException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/StreamTokenizer.java gcc-3.1/libjava/java/io/StreamTokenizer.java *** gcc-3.0.4/libjava/java/io/StreamTokenizer.java Tue Jan 9 11:21:12 2001 --- gcc-3.1/libjava/java/io/StreamTokenizer.java Tue Jan 22 22:40:14 2002 *************** *** 1,11 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; /** --- 1,40 ---- ! /* StreamTokenizer.java -- parses streams of characters into tokens ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package java.io; /** *************** public class StreamTokenizer *** 389,395 **** ttype = TT_WORD; sval = tokbuf.toString(); if (lowerCase) ! sval.toLowerCase(); } else if (isComment(ch)) { --- 418,424 ---- ttype = TT_WORD; sval = tokbuf.toString(); if (lowerCase) ! sval = sval.toLowerCase(); } else if (isComment(ch)) { diff -Nrc3pad gcc-3.0.4/libjava/java/io/StringBufferInputStream.java gcc-3.1/libjava/java/io/StringBufferInputStream.java *** gcc-3.0.4/libjava/java/io/StringBufferInputStream.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/StringBufferInputStream.java Tue Jan 22 22:40:14 2002 *************** *** 1,46 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; - /** - * @author Warren Levy - * @date November 11, 1998. - * @deprecated - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. Deprecated in JDK 1.1. */ public class StringBufferInputStream extends InputStream { ! /* The String which is the input to this stream. */ protected String buffer; ! /* Position of the next byte in buffer to be read. */ protected int pos = 0; ! /* The length of the String buffer. */ protected int count; public StringBufferInputStream(String s) { buffer = s; count = s.length(); } public int available() { return count - pos; } public int read() { if (pos >= count) --- 1,117 ---- ! /* StringBufferInputStream.java -- Read an String as a stream ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. Deprecated in JDK 1.1. */ + /** + * This class permits a String to be read as an input stream. + * The low eight bits of each character in the String are the + * bytes that are returned. The high eight bits of each character are + * discarded. + *

    + * The mark/reset functionality in this class behaves differently than + * normal. The mark() method is always ignored and the + * reset() method always resets in stream to start reading from + * position 0 in the String. Note that since this method does not override + * markSupported() in InputStream, calling that + * method will return false. + *

    + * Note that this class is deprecated because it does not properly handle + * 16-bit Java characters. It is provided for backwards compatibility only + * and should not be used for new development. The StringReader + * class should be used instead. + * + * @deprecated + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + */ public class StringBufferInputStream extends InputStream { ! /** The String which is the input to this stream. */ protected String buffer; ! /** Position of the next byte in buffer to be read. */ protected int pos = 0; ! /** The length of the String buffer. */ protected int count; + /** + * Create a new StringBufferInputStream that will read bytes + * from the passed in String. This stream will read from the + * beginning to the end of the String. + * + * @param s The String this stream will read from. + */ public StringBufferInputStream(String s) { buffer = s; count = s.length(); } + /** + * This method returns the number of bytes available to be read from this + * stream. The value returned will be equal to count - pos. + * + * @return The number of bytes that can be read from this stream before + * blocking, which is all of them + */ public int available() { return count - pos; } + /** + * This method reads one byte from the stream. The pos counter + * is advanced to the next byte to be read. The byte read is returned as + * an int in the range of 0-255. If the stream position is already at the + * end of the buffer, no byte is read and a -1 is returned in order to + * indicate the end of the stream. + * + * @return The byte read, or -1 if end of stream + */ public int read() { if (pos >= count) *************** public class StringBufferInputStream ext *** 49,54 **** --- 120,142 ---- return ((int) buffer.charAt(pos++)) & 0xFF; } + /** + * This method reads bytes from the stream and stores them into a caller + * supplied buffer. It starts storing the data at index offset + * into the buffer and attempts to read len bytes. This method + * can return before reading the number of bytes requested if the end of the + * stream is encountered first. The actual number of bytes read is + * returned. If no bytes can be read because the stream is already at + * the end of stream position, a -1 is returned. + *

    + * This method does not block. + * + * @param b The array into which the bytes read should be stored. + * @param off The offset into the array to start storing bytes + * @param len The requested number of bytes to read + * + * @return The actual number of bytes read, or -1 if end of stream. + */ public int read(byte[] b, int off, int len) { if (off < 0 || len < 0 || off + len > b.length) *************** public class StringBufferInputStream ext *** 66,76 **** --- 154,180 ---- return numRead; } + /** + * This method sets the read position in the stream to the beginning + * setting the pos variable equal to 0. Note that this differs + * from the common implementation of the reset() method. + */ public void reset() { pos = 0; } + /** + * This method attempts to skip the requested number of bytes in the + * input stream. It does this by advancing the pos value by the + * specified number of bytes. It this would exceed the length of the + * buffer, then only enough bytes are skipped to position the stream at + * the end of the buffer. The actual number of bytes skipped is returned. + * + * @param n The requested number of bytes to skip + * + * @return The actual number of bytes skipped. + */ public long skip(long n) { if (n < 0) diff -Nrc3pad gcc-3.0.4/libjava/java/io/StringReader.java gcc-3.1/libjava/java/io/StringReader.java *** gcc-3.0.4/libjava/java/io/StringReader.java Mon Oct 30 09:20:47 2000 --- gcc-3.1/libjava/java/io/StringReader.java Tue Jan 22 22:40:14 2002 *************** *** 1,11 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 --- 1,40 ---- ! /* StringReader.java -- permits a String to be read as a character input stream ! Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 diff -Nrc3pad gcc-3.0.4/libjava/java/io/StringWriter.java gcc-3.1/libjava/java/io/StringWriter.java *** gcc-3.0.4/libjava/java/io/StringWriter.java Fri Dec 15 06:08:55 2000 --- gcc-3.1/libjava/java/io/StringWriter.java Tue Jan 22 22:40:14 2002 *************** *** 1,27 **** ! // StringWriter.java - StringBuffer output stream ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 25, 1998 ! */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * Status: Complete to 1.2. - */ public class StringWriter extends Writer { public void close () { // JCL says this does nothing. This seems to violate the Writer --- 1,66 ---- ! /* StringWriter.java -- Writes bytes to a StringBuffer ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + package java.io; + + // Wow is this a dumb class. CharArrayWriter can do all this and + // more. I would redirect all calls to one in fact, but the javadocs say + // use a StringBuffer so I will comply. + + /** + * This class writes chars to an internal StringBuffer that + * can then be used to retrieve a String. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + */ public class StringWriter extends Writer { + /** + * This is the default size of the buffer if the user doesn't specify it. + * @specnote The JCL Volume 1 says that 16 is the default size. + */ + private static final int DEFAULT_BUFFER_SIZE = 16; + + /** + * This method closes the stream. The contents of the internal buffer + * can still be retrieved, but future writes are not guaranteed to work. + */ public void close () { // JCL says this does nothing. This seems to violate the Writer *************** public class StringWriter extends Writer *** 29,48 **** // IOException after a close. Still, we just follow JCL. } public void flush () { } public StringBuffer getBuffer () { return buffer; } public StringWriter () { ! this (16); } public StringWriter (int size) { super (); --- 68,109 ---- // IOException after a close. Still, we just follow JCL. } + /** + * This method flushes any buffered characters to the underlying output. + * It does nothing in this class. + */ public void flush () { } + /** + * This method returns the StringBuffer object that this + * object is writing to. Note that this is the actual internal buffer, so + * any operations performed on it will affect this stream object. + * + * @return The StringBuffer object being written to + */ public StringBuffer getBuffer () { return buffer; } + /** + * This method initializes a new StringWriter to write to a + * StringBuffer initially sized to a default size of 16 + * chars. + */ public StringWriter () { ! this (DEFAULT_BUFFER_SIZE); } + /** + * This method initializes a new StringWriter to write to a + * StringBuffer with the specified initial size. + * + * @param size The initial size to make the StringBuffer + */ public StringWriter (int size) { super (); *************** public class StringWriter extends Writer *** 50,80 **** lock = buffer; } public String toString () { return buffer.toString(); } public void write (int oneChar) { ! buffer.append((char) oneChar); } public void write (char[] chars, int offset, int len) { buffer.append(chars, offset, len); } public void write (String str) { buffer.append(str); } public void write (String str, int offset, int len) { buffer.append(str.substring(offset, offset + len)); } ! // The string buffer. private StringBuffer buffer; } --- 111,189 ---- lock = buffer; } + /** + * This method returns the contents of the internal StringBuffer + * as a String. + * + * @return A String representing the chars written to + * this stream. + */ public String toString () { return buffer.toString(); } + /** + * This method writes a single character to the output, storing it in + * the internal buffer. + * + * @param oneChar The char to write, passed as an int. + */ public void write (int oneChar) { ! buffer.append((char) (oneChar & 0xFFFF)); } + /** + * This method writes len chars from the specified + * array starting at index offset in that array to this + * stream by appending the chars to the end of the internal buffer. + * + * @param chars The array of chars to write + * @param offset The index into the array to start writing from + * @param len The number of chars to write + */ public void write (char[] chars, int offset, int len) { buffer.append(chars, offset, len); } + /** + * This method writes the characters in the specified String + * to the stream by appending them to the end of the internal buffer. + * + * @param str The String to write to the stream. + */ public void write (String str) { buffer.append(str); } + /** + * This method writes out len characters of the specified + * String to the stream starting at character position + * offset into the stream. This is done by appending the + * characters to the internal buffer. + * + * @param str The String to write characters from + * @param offset The character position to start writing from + * @param len The number of characters to write. + */ public void write (String str, int offset, int len) { + // char[] tmpbuf = new char[len]; + // str.getChars(offset, offset+len, tmpbuf, 0); + // buf.append(tmpbuf, 0, tmpbuf.length); + // This implementation assumes that String.substring is more + // efficient than using String.getChars and copying the data + // twice. For libgcj, this is true. For Classpath, it is not. + // FIXME. buffer.append(str.substring(offset, offset + len)); } ! /** ! * This is the StringBuffer that we use to store bytes that ! * are written. ! */ private StringBuffer buffer; } diff -Nrc3pad gcc-3.0.4/libjava/java/io/SyncFailedException.java gcc-3.1/libjava/java/io/SyncFailedException.java *** gcc-3.0.4/libjava/java/io/SyncFailedException.java Fri Sep 8 19:37:08 2000 --- gcc-3.1/libjava/java/io/SyncFailedException.java Tue Jan 22 22:40:14 2002 *************** *** 1,29 **** ! // SyncFailedException.java ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public class SyncFailedException extends IOException { ! public SyncFailedException (String s) ! { ! super (s); ! } } --- 1,86 ---- ! /* SyncFailedException.java -- The sync failed (?) ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * I really wish I knew what caused this exception to be thrown. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + * @date September 24, 1998 + */ public class SyncFailedException extends IOException { ! ! private static final long serialVersionUID = -2353342684412443330L; ! ! /* ! * Constructors ! */ ! ! /** ! * Create a new SyncFailedException without a descriptive error message ! */ ! SyncFailedException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Create a new SyncFailedException with a descriptive error message String + * + * @param message The descriptive error message + */ + public + SyncFailedException(String message) + { + super(message); + } + + } // class SyncFailedException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/UTFDataFormatException.java gcc-3.1/libjava/java/io/UTFDataFormatException.java *** gcc-3.0.4/libjava/java/io/UTFDataFormatException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/UTFDataFormatException.java Tue Jan 22 22:40:14 2002 *************** *** 1,34 **** ! // UTFDataFormatException.java ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Tom Tromey ! * @date September 24, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ public class UTFDataFormatException extends IOException { - public UTFDataFormatException () - { - super (); - } ! public UTFDataFormatException (String s) ! { ! super (s); ! } } --- 1,86 ---- ! /* UTFDataFormatException.java -- Bad format in UTF data ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Complete to 1.1. */ + /** + * When reading a UTF string from an input stream, this exception is thrown + * to indicate that the data read is invalid. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey + * @date September 24, 1998 + */ public class UTFDataFormatException extends IOException { ! /* ! * Constructors ! */ ! ! /** ! * Create a new UTFDataFormatException without a descriptive error message ! */ ! public ! UTFDataFormatException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Create a new UTFDataFormatException with a descriptive error message String ! * ! * @param message The descriptive error message ! */ ! public ! UTFDataFormatException(String message) ! { ! super(message); } + + } // class UTFDataFormatException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/UnsupportedEncodingException.java gcc-3.1/libjava/java/io/UnsupportedEncodingException.java *** gcc-3.0.4/libjava/java/io/UnsupportedEncodingException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/UnsupportedEncodingException.java Tue Jan 22 22:40:14 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.io; ! /** ! * @author Per Bothner ! * @date April 17, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class UnsupportedEncodingException extends IOException { - public UnsupportedEncodingException () - { - super(); - } ! public UnsupportedEncodingException (String msg) ! { ! super(msg); ! } } --- 1,86 ---- ! /* UnsupportedEncodingException.java -- The requested encoding isn't supported ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.io; /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This exception is thrown when the requested character encoding is ! * not supported. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Per Bothner ! * @date April 17, 1998. ! */ public class UnsupportedEncodingException extends IOException { ! /* ! * Constructors ! */ ! ! /** ! * Create a new UnsupportedEncodingException without a descriptive error message ! */ ! public ! UnsupportedEncodingException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Create a new UnsupportedEncodingException with a descriptive error message String + * + * @param message The descriptive error message + */ + public + UnsupportedEncodingException(String message) + { + super(message); + } + + } // class UnsupportedEncodingException + diff -Nrc3pad gcc-3.0.4/libjava/java/io/WriteAbortedException.java gcc-3.1/libjava/java/io/WriteAbortedException.java *** gcc-3.0.4/libjava/java/io/WriteAbortedException.java Tue Jun 27 05:10:02 2000 --- gcc-3.1/libjava/java/io/WriteAbortedException.java Tue Jan 22 22:40:14 2002 *************** *** 1,4 **** ! /* WriteAbortedException.java -- An exception occured while writing a serialization stream Copyright (C) 1998, 2000 Free Software Foundation, Inc. --- 1,4 ---- ! /* WriteAbortedException.java -- An exception occurred while writing a serialization stream Copyright (C) 1998, 2000 Free Software Foundation, Inc. *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.io; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.io; diff -Nrc3pad gcc-3.0.4/libjava/java/io/Writer.java gcc-3.1/libjava/java/io/Writer.java *** gcc-3.0.4/libjava/java/io/Writer.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/Writer.java Tue Jan 22 22:40:14 2002 *************** *** 1,67 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.io; - /** - * @author Per Bothner - * @date April 17, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. - * However, write(String, int, int) should be made a native method. */ public abstract class Writer { - protected Object lock; ! protected Writer () ! { ! lock = this; ! } ! protected Writer (Object lock) ! { ! this.lock = lock; ! } ! abstract public void close() throws IOException; ! abstract public void flush() throws IOException; ! abstract public void write(char[] buf, int offset, int count) ! throws IOException; ! public void write(char[] buf) throws IOException ! { ! write(buf, 0, buf.length); ! } ! public void write(int ch) throws IOException ! { ! char[] buf = new char[1]; ! buf[0] = (char) ch; ! write(buf, 0, 1); ! } ! // FIXME - re-write using native code to not require copied buffer. ! public void write (String str, int offset, int count) throws IOException ! { ! char[] buf = new char[count]; ! str.getChars(offset, offset + count, buf, 0); ! write(buf, 0, count); ! } ! public void write (String str) throws IOException ! { ! write(str, 0, str.length()); ! } } --- 1,222 ---- ! /* Writer.java -- Base class for character output streams ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.io; /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * This abstract class forms the base of the hierarchy of classes that + * write output as a stream of chars. It provides a common set of methods + * for writing chars to stream. Subclasses implement and/or extend these + * methods to write chars in a particular manner or to a particular + * destination such as a file on disk or network connection. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Per Bothner + */ public abstract class Writer { ! /*************************************************************************/ ! /** ! * This is the object used to synchronize criticial code sections for ! * thread safety. Subclasses should use this field instead of using ! * synchronized methods or explicity synchronizations on this ! */ ! protected Object lock; ! /*************************************************************************/ ! /* ! * Constructors ! */ ! /** ! * This is the default no-argument constructor for this class. This method ! * will set up the class to synchronize criticial sections on itself. ! */ ! protected ! Writer() ! { ! lock = this; ! } ! /*************************************************************************/ ! /** ! * This method initializes a Writer that will synchronize ! * on the specified Object. ! * ! * @param obj The Object to use for synchronizing critical ! * sections ! */ ! protected ! Writer(Object lock) ! { ! this.lock = lock; ! } ! /*************************************************************************/ ! /* ! * Instance Methods ! */ ! ! /** ! * This method forces any data that may have been buffered to be written ! * to the underlying output device. Please note that the host environment ! * might perform its own buffering unbeknowst to Java. In that case, a ! * write made (for example, to a disk drive) might be cached in OS ! * buffers instead of actually being written to disk. ! * ! * @exception IOException If an error occurs ! */ ! public abstract void ! flush() throws IOException; + /*************************************************************************/ + + /** + * This method closes the stream. Any internal or native resources associated + * with this stream are freed. Any subsequent attempt to access the stream + * might throw an exception. + *

    + * This method in this class does nothing. + * + * @exception IOException If an error occurs + */ + public abstract void + close() throws IOException; + + /*************************************************************************/ + + /** + * This method writes a single char to the output stream. + * + * @param b The char to be written to the output stream, passed as an int + * + * @exception IOException If an error occurs + */ + public void + write(int b) throws IOException + { + char[] buf = new char[1]; + + buf[0] = (char)b; + write(buf, 0, buf.length); } + + /*************************************************************************/ + + /** + * This method all the writes char from the passed array to the output stream. + * This method is equivalent to write(buf, 0, buf.length) which + * is exactly how it is implemented in this class. + * + * @param buf The array of char to write + * + * @exception IOException If an error occurs + */ + public void + write(char[] buf) throws IOException + { + write(buf, 0, buf.length); + } + + /*************************************************************************/ + + /** + * This method writes len char from the specified array + * buf starting at index offset into the array. + *

    + * Subclasses must provide an implementation of this abstract method. + * + * @param buf The array of char to write from + * @param offset The index into the array to start writing from + * @param len The number of char to write + * + * @exception IOException If an error occurs + */ + public abstract void + write(char[] buf, int offset, int len) throws IOException; + + /*************************************************************************/ + + /** + * This method writes all the characters in a String to the + * output. + * + * @param str The String whose chars are to be written. + * + * @param IOException If an error occurs + */ + public void + write(String str) throws IOException + { + write(str, 0, str.length()); + } + + /*************************************************************************/ + + /** + * This method writes len chars from the String + * starting at position offset. + * + * @param str The String that is to be written + * @param offset The character offset into the String to start + * writing from + * @param len The number of chars to write + * + * @exception IOException If an error occurs + */ + public void + write(String str, int offset, int len) throws IOException + { + // FIXME - for libgcj re-write using native code to not require copied buffer. + char[] buf = new char[len]; + + str.getChars(offset, offset + len, buf, 0); + write(buf, 0, len); + } + + } // class Writer diff -Nrc3pad gcc-3.0.4/libjava/java/io/natFile.cc gcc-3.1/libjava/java/io/natFile.cc *** gcc-3.0.4/libjava/java/io/natFile.cc Wed Jul 18 18:38:23 2001 --- gcc-3.1/libjava/java/io/natFile.cc Thu Jan 1 00:00:00 1970 *************** *** 1,327 **** - // natFile.cc - Native part of File class for POSIX. - - /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - #include - - #include - #include - #include - #include - #include - #include - #ifdef HAVE_UNISTD_H - #include - #endif - #include - #ifdef HAVE_DIRENT_H - #include - #endif - #include - #include - - #include - #include - #include - #include - #include - #include - #include - #include - #include - - jboolean - java::io::File::_access (jint query) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - JvAssert (query == READ || query == WRITE || query == EXISTS); - #ifdef HAVE_ACCESS - int mode; - if (query == READ) - mode = R_OK; - else if (query == WRITE) - mode = W_OK; - else - mode = F_OK; - return ::access (buf, mode) == 0; - #else - return false; - #endif - } - - jboolean - java::io::File::_stat (jint query) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - if (query == ISHIDDEN) - return (getName()->charAt(0) == '.'); - - #ifdef HAVE_STAT - struct stat sb; - if (::stat (buf, &sb)) - return false; - - JvAssert (query == DIRECTORY || query == ISFILE); - jboolean r = S_ISDIR (sb.st_mode); - return query == DIRECTORY ? r : ! r; - #else - return false; - #endif - } - - jlong - java::io::File::attr (jint query) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - #ifdef HAVE_STAT - struct stat sb; - // FIXME: not sure about return value here. - if (::stat (buf, &sb)) - return 0; - - JvAssert (query == MODIFIED || query == LENGTH); - return query == MODIFIED ? (jlong)sb.st_mtime * 1000 : sb.st_size; - #else - // There's no good choice here. - return 23; - #endif - } - - jstring - java::io::File::getCanonicalPath (void) - { - char buf[MAXPATHLEN], buf2[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - #ifdef HAVE_REALPATH - if (realpath (buf, buf2) == NULL) - throw new IOException (JvNewStringLatin1 (strerror (errno))); - - // FIXME: what encoding to assume for file names? This affects many - // calls. - return JvNewStringUTF (buf2); - #else - return JvNewStringUTF (buf); - #endif - } - - jboolean - java::io::File::isAbsolute (void) - { - return path->charAt(0) == '/'; - } - - jobjectArray - java::io::File::performList (java::io::FilenameFilter *filter, - java::io::FileFilter *fileFilter, - java::lang::Class *result_type) - { - #ifdef HAVE_DIRENT_H - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - DIR *dir = opendir (buf); - if (! dir) - return NULL; - - - java::util::ArrayList *list = new java::util::ArrayList (); - struct dirent *d; - #ifdef HAVE_READDIR_R - int name_max = pathconf (buf, _PC_NAME_MAX); - char dbuf[sizeof (struct dirent) + name_max + 1]; - while (readdir_r (dir, (struct dirent *) dbuf, &d) == 0 && d != NULL) - #else /* HAVE_READDIR_R */ - while ((d = readdir (dir)) != NULL) - #endif /* HAVE_READDIR_R */ - { - // Omit "." and "..". - if (d->d_name[0] == '.' - && (d->d_name[1] == '\0' - || (d->d_name[1] == '.' && d->d_name[2] == '\0'))) - continue; - - jstring name = JvNewStringUTF (d->d_name); - if (filter && ! filter->accept(this, name)) - continue; - - if (result_type == &java::io::File::class$) - { - java::io::File *file = new java::io::File (this, name); - if (fileFilter && ! fileFilter->accept(file)) - continue; - - list->add(file); - } - else - list->add(name); - } - - closedir (dir); - - jobjectArray ret = JvNewObjectArray (list->size(), result_type, NULL); - list->toArray(ret); - return ret; - #else /* HAVE_DIRENT_H */ - return NULL; - #endif /* HAVE_DIRENT_H */ - } - - jboolean - java::io::File::performMkdir (void) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - #ifdef HAVE_MKDIR - return ::mkdir (buf, 0755) == 0; - #else - return false; - #endif - } - - jboolean - java::io::File::performSetReadOnly (void) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - #if defined (HAVE_STAT) && defined (HAVE_CHMOD) - struct stat sb; - if (::stat (buf, &sb)) - return false; - - if (::chmod(buf, sb.st_mode & 0555)) - return false; - return true; - #else - return false; - #endif - } - - static JArray *unixroot; - - JArray< ::java::io::File *>* - java::io::File::performListRoots () - { - if (unixroot == NULL) - { - ::java::io::File *f = new ::java::io::File (JvNewStringLatin1 ("/")); - unixroot = reinterpret_cast *> - (JvNewObjectArray (1, &java::io::File::class$, f)); - elements (unixroot) [0] = f; - } - return unixroot; - } - - jboolean - java::io::File::performRenameTo (File *dest) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - char buf2[MAXPATHLEN]; - total = JvGetStringUTFRegion (dest->path, 0, dest->path->length(), buf2); - // FIXME? - buf2[total] = '\0'; - - #ifdef HAVE_RENAME - return ::rename (buf, buf2) == 0; - #else - return false; - #endif - } - - jboolean - java::io::File::performSetLastModified (jlong time) - { - #ifdef HAVE_UTIME - utimbuf tb; - - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - tb.actime = time / 1000; - tb.modtime = time / 1000; - return ::utime (buf, &tb); - #else - return false; - #endif - } - - jboolean - java::io::File::performCreate (void) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - int fd = ::open (buf, O_CREAT | O_EXCL, 0644); - - if (fd < 0) - { - if (errno == EEXIST) - return false; - throw new IOException (JvNewStringLatin1 (strerror (errno))); - } - else - { - ::close (fd); - return true; - } - } - - jboolean - java::io::File::performDelete (void) - { - char buf[MAXPATHLEN]; - jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? - buf[total] = '\0'; - - #ifdef HAVE_UNLINK - #ifdef HAVE_RMDIR - if (! ::rmdir (buf)) - return true; - if (errno == ENOTDIR) - #endif // HAVE_RMDIR - return ::unlink (buf) == 0; - #endif // HAVE_UNLINK - return false; - } - - void - java::io::File::init_native () - { - maxPathLen = MAXPATHLEN; - caseSensitive = true; - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/java/io/natFileDescriptorEcos.cc gcc-3.1/libjava/java/io/natFileDescriptorEcos.cc *** gcc-3.0.4/libjava/java/io/natFileDescriptorEcos.cc Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/io/natFileDescriptorEcos.cc Fri Mar 8 00:43:29 2002 *************** *** 1,6 **** // natFileDescriptor.cc - Native part of FileDescriptor class. ! /* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natFileDescriptor.cc - Native part of FileDescriptor class. ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. *************** diag_write (char *data, int len) *** 41,46 **** --- 41,54 ---- #define NO_FSYNC_MESSAGE "sync unsupported" + void + java::io::FileDescriptor::init(void) + { + in = new java::io::FileDescriptor(0); + out = new java::io::FileDescriptor(1); + err = new java::io::FileDescriptor(2); + } + jboolean java::io::FileDescriptor::valid (void) { *************** java::io::FileDescriptor::sync (void) *** 54,60 **** // as errors. #ifdef HAVE_FSYNC #else ! JvThrow (new SyncFailedException (JvNewStringLatin1 (NO_FSYNC_MESSAGE))); #endif } --- 62,68 ---- // as errors. #ifdef HAVE_FSYNC #else ! throw new SyncFailedException (JvNewStringLatin1 (NO_FSYNC_MESSAGE)); #endif } *************** void *** 75,83 **** java::io::FileDescriptor::write (jbyteArray b, jint offset, jint len) { if (! b) ! JvThrow (new java::lang::NullPointerException); if (offset < 0 || len < 0 || offset + len > JvGetArrayLength (b)) ! JvThrow (new java::lang::ArrayIndexOutOfBoundsException); char *bytes = (char *)elements (b) + offset; ::diag_write (bytes, len); } --- 83,91 ---- java::io::FileDescriptor::write (jbyteArray b, jint offset, jint len) { if (! b) ! throw new java::lang::NullPointerException; if (offset < 0 || len < 0 || offset + len > JvGetArrayLength (b)) ! throw new java::lang::ArrayIndexOutOfBoundsException; char *bytes = (char *)elements (b) + offset; ::diag_write (bytes, len); } *************** java::io::FileDescriptor::close (void) *** 88,103 **** } jint ! java::io::FileDescriptor::seek (jlong pos, jint whence) { JvAssert (whence == SET || whence == CUR); - - jlong len = length (); - jlong here = getFilePointer (); - - if ((whence == SET && pos > len) || (whence == CUR && here + pos > len)) - JvThrow (new EOFException); - return 0; } --- 96,104 ---- } jint ! java::io::FileDescriptor::seek (jlong pos, jint whence, jboolean) { JvAssert (whence == SET || whence == CUR); return 0; } diff -Nrc3pad gcc-3.0.4/libjava/java/io/natFileDescriptorPosix.cc gcc-3.1/libjava/java/io/natFileDescriptorPosix.cc *** gcc-3.0.4/libjava/java/io/natFileDescriptorPosix.cc Wed Mar 21 17:20:22 2001 --- gcc-3.1/libjava/java/io/natFileDescriptorPosix.cc Sun Mar 10 18:00:04 2002 *************** details. */ *** 17,23 **** #include #include #include - #include #ifdef HAVE_SYS_IOCTL_H #define BSD_COMP /* Get FIONREAD on Solaris2. */ --- 17,22 ---- *************** details. */ *** 45,50 **** --- 44,57 ---- #define NO_FSYNC_MESSAGE "sync unsupported" + void + java::io::FileDescriptor::init(void) + { + in = new java::io::FileDescriptor(0); + out = new java::io::FileDescriptor(1); + err = new java::io::FileDescriptor(2); + } + jboolean java::io::FileDescriptor::valid (void) { *************** java::io::FileDescriptor::sync (void) *** 59,77 **** // as errors. #ifdef HAVE_FSYNC if (::fsync (fd) && errno != EROFS && errno != EINVAL) ! JvThrow (new SyncFailedException (JvNewStringLatin1 (strerror (errno)))); #else ! JvThrow (new SyncFailedException (JvNewStringLatin1 (NO_FSYNC_MESSAGE))); #endif } jint java::io::FileDescriptor::open (jstring path, jint jflags) { ! // FIXME: eww. ! char buf[MAXPATHLEN]; jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? buf[total] = '\0'; int flags = 0; #ifdef O_BINARY --- 66,82 ---- // as errors. #ifdef HAVE_FSYNC if (::fsync (fd) && errno != EROFS && errno != EINVAL) ! throw new SyncFailedException (JvNewStringLatin1 (strerror (errno))); #else ! throw new SyncFailedException (JvNewStringLatin1 (NO_FSYNC_MESSAGE)); #endif } jint java::io::FileDescriptor::open (jstring path, jint jflags) { ! char *buf = (char *) _Jv_AllocBytes (_Jv_GetStringUTFLength (path) + 1); jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); buf[total] = '\0'; int flags = 0; #ifdef O_BINARY *************** java::io::FileDescriptor::open (jstring *** 111,119 **** if (fd == -1) { char msg[MAXPATHLEN + 200]; ! sprintf (msg, "%s: %s", buf, strerror (errno)); ! JvThrow (new FileNotFoundException (JvNewStringLatin1 (msg))); } return fd; } --- 116,129 ---- if (fd == -1) { char msg[MAXPATHLEN + 200]; ! // We choose the formatting here for JDK compatibility, believe ! // it or not. ! sprintf (msg, "%s (%s)", buf, strerror (errno)); ! throw new FileNotFoundException (JvNewStringLatin1 (msg)); } + + _Jv_platform_close_on_exec (fd); + return fd; } *************** void *** 121,158 **** java::io::FileDescriptor::write (jint b) { jbyte d = (jbyte) b; ! int r = ::write (fd, &d, 1); ! if (java::lang::Thread::interrupted()) { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); ! iioe->bytesTransferred = r == -1 ? 0 : r; ! JvThrow (iioe); } - else if (r == -1) - JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); - // FIXME: loop if r != 1. } void java::io::FileDescriptor::write (jbyteArray b, jint offset, jint len) { if (! b) ! JvThrow (new java::lang::NullPointerException); if (offset < 0 || len < 0 || offset + len > JvGetArrayLength (b)) ! JvThrow (new java::lang::ArrayIndexOutOfBoundsException); jbyte *bytes = elements (b) + offset; ! int r = ::write (fd, bytes, len); ! if (java::lang::Thread::interrupted()) { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); ! iioe->bytesTransferred = r == -1 ? 0 : r; ! JvThrow (iioe); } - else if (r == -1) - JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); - // FIXME: loop if r != len. } void --- 131,183 ---- java::io::FileDescriptor::write (jint b) { jbyte d = (jbyte) b; ! int r = 0; ! while (r != 1) { ! r = ::write (fd, &d, 1); ! if (r == -1) ! { ! if (java::lang::Thread::interrupted()) ! { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 (strerror (errno))); ! iioe->bytesTransferred = r == -1 ? 0 : r; ! throw iioe; ! } ! throw new IOException (JvNewStringLatin1 (strerror (errno))); ! } } } void java::io::FileDescriptor::write (jbyteArray b, jint offset, jint len) { if (! b) ! throw new java::lang::NullPointerException; if (offset < 0 || len < 0 || offset + len > JvGetArrayLength (b)) ! throw new java::lang::ArrayIndexOutOfBoundsException; jbyte *bytes = elements (b) + offset; ! ! int written = 0; ! while (len > 0) { ! int r = ::write (fd, bytes, len); ! if (r == -1) ! { ! if (java::lang::Thread::interrupted()) ! { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 (strerror (errno))); ! iioe->bytesTransferred = written; ! throw iioe; ! } ! throw new IOException (JvNewStringLatin1 (strerror (errno))); ! } ! ! written += r; ! len -= r; ! bytes += r; } } void *************** java::io::FileDescriptor::close (void) *** 161,183 **** jint save = fd; fd = -1; if (::close (save)) ! JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); } jint ! java::io::FileDescriptor::seek (jlong pos, jint whence) { JvAssert (whence == SET || whence == CUR); jlong len = length (); jlong here = getFilePointer (); ! if ((whence == SET && pos > len) || (whence == CUR && here + pos > len)) ! JvThrow (new EOFException); off_t r = ::lseek (fd, (off_t) pos, whence == SET ? SEEK_SET : SEEK_CUR); if (r == -1) ! JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); return r; } --- 186,212 ---- jint save = fd; fd = -1; if (::close (save)) ! throw new IOException (JvNewStringLatin1 (strerror (errno))); } jint ! java::io::FileDescriptor::seek (jlong pos, jint whence, jboolean eof_trunc) { JvAssert (whence == SET || whence == CUR); jlong len = length (); jlong here = getFilePointer (); ! if (eof_trunc ! && ((whence == SET && pos > len) || (whence == CUR && here + pos > len))) ! { ! whence = SET; ! pos = len; ! } off_t r = ::lseek (fd, (off_t) pos, whence == SET ? SEEK_SET : SEEK_CUR); if (r == -1) ! throw new IOException (JvNewStringLatin1 (strerror (errno))); return r; } *************** java::io::FileDescriptor::length (void) *** 186,192 **** { struct stat sb; if (::fstat (fd, &sb)) ! JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); return sb.st_size; } --- 215,221 ---- { struct stat sb; if (::fstat (fd, &sb)) ! throw new IOException (JvNewStringLatin1 (strerror (errno))); return sb.st_size; } *************** java::io::FileDescriptor::getFilePointer *** 195,201 **** { off_t r = ::lseek (fd, 0, SEEK_CUR); if (r == -1) ! JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); return r; } --- 224,230 ---- { off_t r = ::lseek (fd, 0, SEEK_CUR); if (r == -1) ! throw new IOException (JvNewStringLatin1 (strerror (errno))); return r; } *************** java::io::FileDescriptor::read (void) *** 206,220 **** int r = ::read (fd, &b, 1); if (r == 0) return -1; ! if (java::lang::Thread::interrupted()) { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 ("read interrupted")); ! iioe->bytesTransferred = r == -1 ? 0 : r; ! JvThrow (iioe); } - else if (r == -1) - JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); return b & 0xFF; } --- 235,251 ---- int r = ::read (fd, &b, 1); if (r == 0) return -1; ! if (r == -1) { ! if (java::lang::Thread::interrupted()) ! { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 (strerror (errno))); ! iioe->bytesTransferred = r == -1 ? 0 : r; ! throw iioe; ! } ! throw new IOException (JvNewStringLatin1 (strerror (errno))); } return b & 0xFF; } *************** jint *** 222,244 **** java::io::FileDescriptor::read (jbyteArray buffer, jint offset, jint count) { if (! buffer) ! JvThrow (new java::lang::NullPointerException); jsize bsize = JvGetArrayLength (buffer); if (offset < 0 || count < 0 || offset + count > bsize) ! JvThrow (new java::lang::ArrayIndexOutOfBoundsException); jbyte *bytes = elements (buffer) + offset; int r = ::read (fd, bytes, count); if (r == 0) return -1; ! if (java::lang::Thread::interrupted()) ! { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 ("read interrupted")); ! iioe->bytesTransferred = r == -1 ? 0 : r; ! JvThrow (iioe); } - else if (r == -1) - JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); return r; } --- 253,277 ---- java::io::FileDescriptor::read (jbyteArray buffer, jint offset, jint count) { if (! buffer) ! throw new java::lang::NullPointerException; jsize bsize = JvGetArrayLength (buffer); if (offset < 0 || count < 0 || offset + count > bsize) ! throw new java::lang::ArrayIndexOutOfBoundsException; jbyte *bytes = elements (buffer) + offset; int r = ::read (fd, bytes, count); if (r == 0) return -1; ! if (r == -1) ! { ! if (java::lang::Thread::interrupted()) ! { ! InterruptedIOException *iioe ! = new InterruptedIOException (JvNewStringLatin1 (strerror (errno))); ! iioe->bytesTransferred = r == -1 ? 0 : r; ! throw iioe; ! } ! throw new IOException (JvNewStringLatin1 (strerror (errno))); } return r; } *************** java::io::FileDescriptor::available (voi *** 271,277 **** if (r == -1) { posix_error: ! JvThrow (new IOException (JvNewStringLatin1 (strerror (errno)))); } // If we didn't get anything, and we have fstat, then see if see if --- 304,310 ---- if (r == -1) { posix_error: ! throw new IOException (JvNewStringLatin1 (strerror (errno))); } // If we didn't get anything, and we have fstat, then see if see if *************** java::io::FileDescriptor::available (voi *** 313,318 **** return (jint) num; #else ! JvThrow (new IOException (JvNewStringLatin1 ("unimplemented"))); #endif } --- 346,351 ---- return (jint) num; #else ! throw new IOException (JvNewStringLatin1 ("unimplemented")); #endif } diff -Nrc3pad gcc-3.0.4/libjava/java/io/natFileDescriptorWin32.cc gcc-3.1/libjava/java/io/natFileDescriptorWin32.cc *** gcc-3.0.4/libjava/java/io/natFileDescriptorWin32.cc Wed Mar 15 22:03:19 2000 --- gcc-3.1/libjava/java/io/natFileDescriptorWin32.cc Sun Mar 10 03:34:59 2002 *************** *** 1,6 **** // natFileDescriptorWin32.cc - Native part of FileDescriptor class. ! /* Copyright (C) 1998, 1999, 2000 Red Hat, Inc. This file is part of libgcj. --- 1,6 ---- // natFileDescriptorWin32.cc - Native part of FileDescriptor class. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of libgcj. *************** details. */ *** 17,22 **** --- 17,23 ---- #include #include + #undef STRICT #include #include *************** details. */ *** 31,36 **** --- 32,45 ---- #include #include + void + java::io::FileDescriptor::init(void) + { + in = new java::io::FileDescriptor((jint)(GetStdHandle (STD_INPUT_HANDLE))); + out = new java::io::FileDescriptor((jint)(GetStdHandle (STD_OUTPUT_HANDLE))); + err = new java::io::FileDescriptor((jint)(GetStdHandle (STD_ERROR_HANDLE))); + } + static char * winerr (void) { *************** java::io::FileDescriptor::valid (void) { *** 65,71 **** void java::io::FileDescriptor::sync (void) { if (! FlushFileBuffers ((HANDLE)fd)) ! JvThrow (new SyncFailedException (JvNewStringLatin1 (winerr ()))); } jint --- 74,80 ---- void java::io::FileDescriptor::sync (void) { if (! FlushFileBuffers ((HANDLE)fd)) ! throw new SyncFailedException (JvNewStringLatin1 (winerr ())); } jint *************** java::io::FileDescriptor::open (jstring *** 109,115 **** { char msg[MAX_PATH + 1000]; sprintf (msg, "%s: %s", buf, winerr ()); ! JvThrow (new FileNotFoundException (JvNewStringLatin1 (msg))); } return (jint)handle; --- 118,124 ---- { char msg[MAX_PATH + 1000]; sprintf (msg, "%s: %s", buf, winerr ()); ! throw new FileNotFoundException (JvNewStringLatin1 (msg)); } return (jint)handle; *************** java::io::FileDescriptor::write (jint b) *** 127,139 **** { InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); iioe->bytesTransferred = bytesWritten; ! JvThrow (iioe); } if (bytesWritten != 1) ! JvThrow (new IOException (JvNewStringLatin1 (winerr ()))); } else ! JvThrow (new IOException (JvNewStringLatin1 (winerr ()))); // FIXME: loop until bytesWritten == 1 } --- 136,148 ---- { InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); iioe->bytesTransferred = bytesWritten; ! throw iioe; } if (bytesWritten != 1) ! throw new IOException (JvNewStringLatin1 (winerr ())); } else ! throw new IOException (JvNewStringLatin1 (winerr ())); // FIXME: loop until bytesWritten == 1 } *************** void *** 141,149 **** java::io::FileDescriptor::write(jbyteArray b, jint offset, jint len) { if (! b) ! JvThrow (new java::lang::NullPointerException); if(offset < 0 || len < 0 || offset + len > JvGetArrayLength (b)) ! JvThrow (new java::lang::ArrayIndexOutOfBoundsException); jbyte *buf = elements (b) + offset; DWORD bytesWritten; --- 150,158 ---- java::io::FileDescriptor::write(jbyteArray b, jint offset, jint len) { if (! b) ! throw new java::lang::NullPointerException; if(offset < 0 || len < 0 || offset + len > JvGetArrayLength (b)) ! throw new java::lang::ArrayIndexOutOfBoundsException; jbyte *buf = elements (b) + offset; DWORD bytesWritten; *************** java::io::FileDescriptor::write(jbyteArr *** 153,163 **** { InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); iioe->bytesTransferred = bytesWritten; ! JvThrow (iioe); } } else ! JvThrow(new IOException (JvNewStringLatin1 (winerr ()))); // FIXME: loop until bytesWritten == len } --- 162,172 ---- { InterruptedIOException *iioe = new InterruptedIOException (JvNewStringLatin1 ("write interrupted")); iioe->bytesTransferred = bytesWritten; ! throw iioe; } } else ! throw new IOException (JvNewStringLatin1 (winerr ())); // FIXME: loop until bytesWritten == len } *************** java::io::FileDescriptor::close (void) *** 167,190 **** HANDLE save = (HANDLE)fd; fd = (jint)INVALID_HANDLE_VALUE; if (! CloseHandle (save)) ! JvThrow (new IOException (JvNewStringLatin1 (winerr ()))); } jint ! java::io::FileDescriptor::seek (jlong pos, jint whence) { JvAssert (whence == SET || whence == CUR); jlong len = length(); jlong here = getFilePointer(); ! if ((whence == SET && pos > len) || (whence == CUR && here + pos > len)) ! JvThrow (new EOFException); LONG high = pos >> 32; DWORD low = SetFilePointer ((HANDLE)fd, (DWORD)(0xffffffff & pos), &high, whence == SET ? FILE_BEGIN : FILE_CURRENT); if ((low == 0xffffffff) && (GetLastError () != NO_ERROR)) ! JvThrow (new IOException (JvNewStringLatin1 (winerr ()))); return low; } --- 176,203 ---- HANDLE save = (HANDLE)fd; fd = (jint)INVALID_HANDLE_VALUE; if (! CloseHandle (save)) ! throw new IOException (JvNewStringLatin1 (winerr ())); } jint ! java::io::FileDescriptor::seek (jlong pos, jint whence, jboolean eof_trunc) { JvAssert (whence == SET || whence == CUR); jlong len = length(); jlong here = getFilePointer(); ! if (eof_trunc ! && ((whence == SET && pos > len) || (whence == CUR && here + pos > len))) ! { ! whence = SET; ! pos = len; ! } LONG high = pos >> 32; DWORD low = SetFilePointer ((HANDLE)fd, (DWORD)(0xffffffff & pos), &high, whence == SET ? FILE_BEGIN : FILE_CURRENT); if ((low == 0xffffffff) && (GetLastError () != NO_ERROR)) ! throw new IOException (JvNewStringLatin1 (winerr ())); return low; } *************** java::io::FileDescriptor::getFilePointer *** 194,200 **** LONG high = 0; DWORD low = SetFilePointer ((HANDLE)fd, 0, &high, FILE_CURRENT); if ((low == 0xffffffff) && (GetLastError() != NO_ERROR)) ! JvThrow(new IOException (JvNewStringLatin1 (winerr ()))); return (((jlong)high) << 32L) | (jlong)low; } --- 207,213 ---- LONG high = 0; DWORD low = SetFilePointer ((HANDLE)fd, 0, &high, FILE_CURRENT); if ((low == 0xffffffff) && (GetLastError() != NO_ERROR)) ! throw new IOException (JvNewStringLatin1 (winerr ())); return (((jlong)high) << 32L) | (jlong)low; } *************** java::io::FileDescriptor::read(void) *** 216,222 **** DWORD read; if (! ReadFile ((HANDLE)fd, &buf, 1, &read, NULL)) ! JvThrow (new IOException (JvNewStringLatin1 (winerr ()))); if (! read) return -1; else --- 229,235 ---- DWORD read; if (! ReadFile ((HANDLE)fd, &buf, 1, &read, NULL)) ! throw new IOException (JvNewStringLatin1 (winerr ())); if (! read) return -1; else *************** jint *** 227,244 **** java::io::FileDescriptor::read(jbyteArray buffer, jint offset, jint count) { if (! buffer) ! JvThrow(new java::lang::NullPointerException); jsize bsize = JvGetArrayLength (buffer); if (offset < 0 || count < 0 || offset + count > bsize) ! JvThrow (new java::lang::ArrayIndexOutOfBoundsException); jbyte *bytes = elements (buffer) + offset; DWORD read; if (! ReadFile((HANDLE)fd, bytes, count, &read, NULL)) ! JvThrow (new IOException (JvNewStringLatin1 (winerr ()))); return (jint)read; } --- 240,258 ---- java::io::FileDescriptor::read(jbyteArray buffer, jint offset, jint count) { if (! buffer) ! throw new java::lang::NullPointerException; jsize bsize = JvGetArrayLength (buffer); if (offset < 0 || count < 0 || offset + count > bsize) ! throw new java::lang::ArrayIndexOutOfBoundsException; jbyte *bytes = elements (buffer) + offset; DWORD read; if (! ReadFile((HANDLE)fd, bytes, count, &read, NULL)) ! throw new IOException (JvNewStringLatin1 (winerr ())); + if (read == 0) return -1; return (jint)read; } diff -Nrc3pad gcc-3.0.4/libjava/java/io/natFilePosix.cc gcc-3.1/libjava/java/io/natFilePosix.cc *** gcc-3.0.4/libjava/java/io/natFilePosix.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/io/natFilePosix.cc Tue Feb 12 05:52:33 2002 *************** *** 0 **** --- 1,314 ---- + // natFile.cc - Native part of File class for POSIX. + + /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #include + + #include + #include + #include + #include + #include + #include + #ifdef HAVE_UNISTD_H + #include + #endif + #include + #ifdef HAVE_DIRENT_H + #include + #endif + #include + #include + + #include + #include + #include + #include + #include + #include + #include + #include + #include + + jboolean + java::io::File::_access (jint query) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + JvAssert (query == READ || query == WRITE || query == EXISTS); + #ifdef HAVE_ACCESS + int mode; + if (query == READ) + mode = R_OK; + else if (query == WRITE) + mode = W_OK; + else + mode = F_OK; + return ::access (buf, mode) == 0; + #else + return false; + #endif + } + + jboolean + java::io::File::_stat (jint query) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + if (query == ISHIDDEN) + return (getName()->charAt(0) == '.'); + + #ifdef HAVE_STAT + struct stat sb; + if (::stat (buf, &sb)) + return false; + + JvAssert (query == DIRECTORY || query == ISFILE); + jboolean r = S_ISDIR (sb.st_mode); + return query == DIRECTORY ? r : ! r; + #else + return false; + #endif + } + + jlong + java::io::File::attr (jint query) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + #ifdef HAVE_STAT + struct stat sb; + // FIXME: not sure about return value here. + if (::stat (buf, &sb)) + return 0; + + JvAssert (query == MODIFIED || query == LENGTH); + return query == MODIFIED ? (jlong)sb.st_mtime * 1000 : sb.st_size; + #else + // There's no good choice here. + return 23; + #endif + } + + jstring + java::io::File::getCanonicalPath (void) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + char buf2[MAXPATHLEN]; + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + #ifdef HAVE_REALPATH + if (realpath (buf, buf2) == NULL) + throw new IOException (JvNewStringLatin1 (strerror (errno))); + + // FIXME: what encoding to assume for file names? This affects many + // calls. + return JvNewStringUTF (buf2); + #else + return JvNewStringUTF (buf); + #endif + } + + jboolean + java::io::File::isAbsolute (void) + { + return path->charAt(0) == '/'; + } + + jobjectArray + java::io::File::performList (java::io::FilenameFilter *filter, + java::io::FileFilter *fileFilter, + java::lang::Class *result_type) + { + /* Some systems have dirent.h, but no directory reading functions like + opendir. */ + #if defined(HAVE_DIRENT_H) && defined(HAVE_OPENDIR) + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + DIR *dir = opendir (buf); + if (! dir) + return NULL; + + java::util::ArrayList *list = new java::util::ArrayList (); + struct dirent *d; + #ifdef HAVE_READDIR_R + int name_max = pathconf (buf, _PC_NAME_MAX); + char dbuf[sizeof (struct dirent) + name_max + 1]; + while (readdir_r (dir, (struct dirent *) dbuf, &d) == 0 && d != NULL) + #else /* HAVE_READDIR_R */ + while ((d = readdir (dir)) != NULL) + #endif /* HAVE_READDIR_R */ + { + // Omit "." and "..". + if (d->d_name[0] == '.' + && (d->d_name[1] == '\0' + || (d->d_name[1] == '.' && d->d_name[2] == '\0'))) + continue; + + jstring name = JvNewStringUTF (d->d_name); + if (filter && ! filter->accept(this, name)) + continue; + + if (result_type == &java::io::File::class$) + { + java::io::File *file = new java::io::File (this, name); + if (fileFilter && ! fileFilter->accept(file)) + continue; + + list->add(file); + } + else + list->add(name); + } + + closedir (dir); + + jobjectArray ret = JvNewObjectArray (list->size(), result_type, NULL); + list->toArray(ret); + return ret; + #else /* HAVE_DIRENT_H && HAVE_OPENDIR */ + return NULL; + #endif /* HAVE_DIRENT_H && HAVE_OPENDIR */ + } + + jboolean + java::io::File::performMkdir (void) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + #ifdef HAVE_MKDIR + return ::mkdir (buf, 0755) == 0; + #else + return false; + #endif + } + + jboolean + java::io::File::performSetReadOnly (void) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + #if defined (HAVE_STAT) && defined (HAVE_CHMOD) + struct stat sb; + if (::stat (buf, &sb)) + return false; + + if (::chmod(buf, sb.st_mode & 0555)) + return false; + return true; + #else + return false; + #endif + } + + JArray< ::java::io::File *>* + java::io::File::performListRoots () + { + ::java::io::File *f = new ::java::io::File (JvNewStringLatin1 ("/")); + JArray *unixroot + = reinterpret_cast *> + (JvNewObjectArray (1, &java::io::File::class$, f)); + elements (unixroot) [0] = f; + return unixroot; + } + + jboolean + java::io::File::performRenameTo (File *dest) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + char *buf2 + = (char *) __builtin_alloca (JvGetStringUTFLength (dest->path) + 1); + total = JvGetStringUTFRegion (dest->path, 0, dest->path->length(), buf2); + buf2[total] = '\0'; + + #ifdef HAVE_RENAME + return ::rename (buf, buf2) == 0; + #else + return false; + #endif + } + + jboolean + java::io::File::performSetLastModified (jlong time) + { + #ifdef HAVE_UTIME + utimbuf tb; + + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + tb.actime = time / 1000; + tb.modtime = time / 1000; + return ::utime (buf, &tb); + #else + return false; + #endif + } + + jboolean + java::io::File::performCreate (void) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + int fd = ::open (buf, O_CREAT | O_EXCL, 0644); + + if (fd < 0) + { + if (errno == EEXIST) + return false; + throw new IOException (JvNewStringLatin1 (strerror (errno))); + } + else + { + ::close (fd); + return true; + } + } + + jboolean + java::io::File::performDelete (void) + { + char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); + jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); + buf[total] = '\0'; + + #ifdef HAVE_UNLINK + #ifdef HAVE_RMDIR + if (! ::rmdir (buf)) + return true; + if (errno == ENOTDIR) + #endif // HAVE_RMDIR + return ::unlink (buf) == 0; + #endif // HAVE_UNLINK + return false; + } + + void + java::io::File::init_native () + { + maxPathLen = MAXPATHLEN; + caseSensitive = true; + } diff -Nrc3pad gcc-3.0.4/libjava/java/io/natFileWin32.cc gcc-3.1/libjava/java/io/natFileWin32.cc *** gcc-3.0.4/libjava/java/io/natFileWin32.cc Wed Jul 18 18:38:23 2001 --- gcc-3.1/libjava/java/io/natFileWin32.cc Tue Apr 16 15:35:20 2002 *************** *** 1,6 **** ! // natFileWin32.cc - Native part of File class for Win32. ! /* Copyright (C) 1998, 1999, 2001 Red Hat, Inc. This file is part of libgcj. --- 1,6 ---- ! // natFileWin32.cc - Native part of File class. ! /* Copyright (C) 1998, 1999, 2002 Red Hat, Inc. This file is part of libgcj. *************** details. */ *** 14,19 **** --- 14,20 ---- #include #include + #undef STRICT #include #include *************** details. */ *** 22,35 **** #include #include #include #include jboolean java::io::File::_access (jint query) { ! char buf[MAX_PATH]; ! jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); ! // FIXME? buf[total] = '\0'; JvAssert (query == READ || query == WRITE || query == EXISTS); --- 23,39 ---- #include #include #include + #include #include jboolean java::io::File::_access (jint query) { ! jstring canon = getCanonicalPath(); ! if (! canon) ! return false; ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (canon) + 1); ! jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); buf[total] = '\0'; JvAssert (query == READ || query == WRITE || query == EXISTS); *************** java::io::File::_access (jint query) *** 48,60 **** jboolean java::io::File::_stat (jint query) { ! char buf[MAX_PATH]; ! jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); ! // FIXME? buf[total] = '\0'; - // FIXME: Need to handle ISHIDDEN query. - JvAssert (query == DIRECTORY || query == ISFILE); DWORD attributes = GetFileAttributes (buf); --- 52,64 ---- jboolean java::io::File::_stat (jint query) { ! jstring canon = getCanonicalPath(); ! if (! canon) ! return false; ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (canon) + 1); ! jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); buf[total] = '\0'; JvAssert (query == DIRECTORY || query == ISFILE); DWORD attributes = GetFileAttributes (buf); *************** java::io::File::_stat (jint query) *** 70,78 **** jlong java::io::File::attr (jint query) { ! char buf[MAX_PATH]; ! jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); ! // FIXME? buf[total] = '\0'; JvAssert (query == MODIFIED || query == LENGTH); --- 74,84 ---- jlong java::io::File::attr (jint query) { ! jstring canon = getCanonicalPath(); ! if (! canon) ! return false; ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (canon) + 1); ! jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); buf[total] = '\0'; JvAssert (query == MODIFIED || query == LENGTH); *************** java::io::File::attr (jint query) *** 93,104 **** jstring java::io::File::getCanonicalPath (void) { ! char buf[MAX_PATH], buf2[MAX_PATH]; jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); - // FIXME? buf[total] = '\0'; LPTSTR unused; if(!GetFullPathName(buf, MAX_PATH, buf2, &unused)) throw new IOException (JvNewStringLatin1 ("GetFullPathName failed")); --- 99,110 ---- jstring java::io::File::getCanonicalPath (void) { ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); buf[total] = '\0'; LPTSTR unused; + char buf2[MAX_PATH]; if(!GetFullPathName(buf, MAX_PATH, buf2, &unused)) throw new IOException (JvNewStringLatin1 ("GetFullPathName failed")); *************** java::io::File::isAbsolute (void) *** 123,135 **** && (path->charAt(2) == '/' || path->charAt(2) == '\\')); } ! jstringArray java::io::File::performList (java::io::FilenameFilter *filter, java::io::FileFilter *fileFilter, ! java::lang::Class *result_type) { ! char buf[MAX_PATH]; ! jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf); // FIXME? strcpy(&buf[total], "\\*.*"); --- 129,147 ---- && (path->charAt(2) == '/' || path->charAt(2) == '\\')); } ! void java::io::File::init_native() { } ! ! ! jobjectArray java::io::File::performList (java::io::FilenameFilter *filter, java::io::FileFilter *fileFilter, ! java::lang::Class *clazz) { ! jstring canon = getCanonicalPath(); ! if (! canon) ! return NULL; ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (canon) + 5); ! jsize total = JvGetStringUTFRegion (canon, 0, canon->length(), buf); // FIXME? strcpy(&buf[total], "\\*.*"); *************** java::io::File::performList (java::io::F *** 138,144 **** if (handle == INVALID_HANDLE_VALUE) return NULL; ! java::util::ArrayList *list = new java::util::ArrayList (); do { --- 150,156 ---- if (handle == INVALID_HANDLE_VALUE) return NULL; ! java::util::Vector *vec = new java::util::Vector (); do { *************** java::io::File::performList (java::io::F *** 146,165 **** { jstring name = JvNewStringUTF (data.cFileName); ! if (filter && ! filter->accept(this, name)) continue; ! ! if (result_type == &java::io::File::class$) ! { ! java::io::File *file = new java::io::File (this, name); ! if (fileFilter && ! fileFilter->accept(file)) continue; ! ! list->add(file); } else ! list->add(name); ! } } while (FindNextFile (handle, &data)); --- 158,175 ---- { jstring name = JvNewStringUTF (data.cFileName); ! if (filter && !filter->accept(this, name)) continue; ! if (clazz == &java::io::File::class$) ! { ! java::io::File *file = new java::io::File (this, name); ! if (fileFilter && !fileFilter->accept(file)) continue; ! vec->addElement (file); } else ! vec->addElement (name); ! } } while (FindNextFile (handle, &data)); *************** java::io::File::performList (java::io::F *** 168,238 **** FindClose (handle); ! jobjectArray ret = JvNewObjectArray (vec->size(), path->getClass(), NULL); vec->copyInto (ret); ! return reinterpret_cast (ret); } jboolean java::io::File::performMkdir (void) { ! char buf[MAX_PATH]; jsize total = JvGetStringUTFRegion(path, 0, path->length(), buf); - // FIXME? buf[total] = '\0'; return (CreateDirectory(buf, NULL)) ? true : false; } jboolean - java::io::File::performSetReadOnly (void) - { - // PLEASE IMPLEMENT ME - return false; - } - - JArray< ::java::io::File *>* - java::io::File::performListRoots () - { - // PLEASE IMPLEMENT ME - return NULL; - } - - jboolean java::io::File::performRenameTo (File *dest) { ! char buf[MAX_PATH]; jsize total = JvGetStringUTFRegion(path, 0, path->length(), buf); - // FIXME? buf[total] = '\0'; ! char buf2[MAX_PATH]; total = JvGetStringUTFRegion(dest->path, 0, dest->path->length(), buf2); - // FIXME? buf2[total] = '\0'; return (MoveFile(buf, buf2)) ? true : false; } jboolean - java::io::File::performSetLastModified (jlong time) - { - // PLEASE IMPLEMENT ME - return false; - } - - jboolean - java::io::File::performCreate (void) - { - // PLEASE IMPLEMENT ME - return false; - } - - jboolean java::io::File::performDelete () { ! char buf[MAX_PATH]; ! jsize total = JvGetStringUTFRegion(path, 0, path->length(), buf); ! // FIXME? buf[total] = '\0'; DWORD attributes = GetFileAttributes (buf); --- 178,219 ---- FindClose (handle); ! jobjectArray ret = JvNewObjectArray (vec->size(), clazz, NULL); vec->copyInto (ret); ! return ret; } + jboolean java::io::File::performMkdir (void) { ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); jsize total = JvGetStringUTFRegion(path, 0, path->length(), buf); buf[total] = '\0'; return (CreateDirectory(buf, NULL)) ? true : false; } jboolean java::io::File::performRenameTo (File *dest) { ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (path) + 1); jsize total = JvGetStringUTFRegion(path, 0, path->length(), buf); buf[total] = '\0'; ! char *buf2 = (char *) __builtin_alloca (JvGetStringUTFLength (dest->path) ! + 1); total = JvGetStringUTFRegion(dest->path, 0, dest->path->length(), buf2); buf2[total] = '\0'; return (MoveFile(buf, buf2)) ? true : false; } jboolean java::io::File::performDelete () { ! jstring canon = getCanonicalPath(); ! char *buf = (char *) __builtin_alloca (JvGetStringUTFLength (canon) + 1); ! jsize total = JvGetStringUTFRegion(canon, 0, canon->length(), buf); buf[total] = '\0'; DWORD attributes = GetFileAttributes (buf); *************** java::io::File::performDelete () *** 245,253 **** return (DeleteFile (buf)) ? true : false; } ! void ! java::io::File::init_native () ! { ! maxPathLen = MAX_PATH; ! caseSensitive = false; ! } --- 226,232 ---- return (DeleteFile (buf)) ? true : false; } ! jboolean java::io::File::performCreate (void) { JvFail("unimplemented\n"); } ! jboolean java::io::File::performSetReadOnly() { JvFail("unimplemented"); } ! jboolean java::io::File::performSetLastModified(jlong time) { JvFail("unimplemented"); } ! JArray* java::io::File::performListRoots() { JvFail("unimplemented"); } diff -Nrc3pad gcc-3.0.4/libjava/java/io/natObjectInputStream.cc gcc-3.1/libjava/java/io/natObjectInputStream.cc *** gcc-3.0.4/libjava/java/io/natObjectInputStream.cc Sun Nov 26 01:48:04 2000 --- gcc-3.1/libjava/java/io/natObjectInputStream.cc Sun Dec 9 00:17:07 2001 *************** *** 1,6 **** // natObjectInputStream.cc - Native part of ObjectInputStream class. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This ObjectInputStream is part of libgcj. --- 1,6 ---- // natObjectInputStream.cc - Native part of ObjectInputStream class. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This ObjectInputStream is part of libgcj. *************** java::io::ObjectInputStream::allocateObj *** 38,44 **** obj = NULL; else { - // FIXME: will this work for String? obj = JvAllocObject (klass); } } --- 38,43 ---- *************** java::io::ObjectInputStream::allocateObj *** 51,69 **** } - #define ObjectClass java::lang::Object::class$ - #define ClassClass java::lang::Class::class$ - void java::io::ObjectInputStream::callConstructor (jclass klass, jobject obj) { jstring init_name = JvNewStringLatin1 (""); JArray *arg_types ! = (JArray *) JvNewObjectArray (0, &ClassClass, NULL); ! JArray *args ! = (JArray *) JvNewObjectArray (0, &ObjectClass, NULL); ! java::lang::reflect::Method *m = klass->getPrivateMethod (init_name, arg_types); ! m->invoke (obj, args); } java::lang::reflect::Field * --- 50,73 ---- } void java::io::ObjectInputStream::callConstructor (jclass klass, jobject obj) { jstring init_name = JvNewStringLatin1 (""); + // This is a bit inefficient, and a bit of a hack, since we don't + // actually use the Method and since what is returned isn't + // technically a Method. We can't use Method.invoke as it looks up + // the declared method. JArray *arg_types ! = (JArray *) JvNewObjectArray (0, &java::lang::Class::class$, ! NULL); ! java::lang::reflect::Method *m = klass->getPrivateMethod (init_name, ! arg_types); ! // We lie about this being a constructor. If we put `true' here ! // then _Jv_CallAnyMethodA would try to allocate the object for us. ! jmethodID meth = (jmethodID) ((char *) (klass->methods) ! + m->offset); ! _Jv_CallAnyMethodA (obj, JvPrimClass (void), meth, false, arg_types, NULL); } java::lang::reflect::Field * diff -Nrc3pad gcc-3.0.4/libjava/java/lang/AbstractMethodError.java gcc-3.1/libjava/java/lang/AbstractMethodError.java *** gcc-3.0.4/libjava/java/lang/AbstractMethodError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/AbstractMethodError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // AbstractMethodError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class AbstractMethodError extends IncompatibleClassChangeError { ! public AbstractMethodError () ! { ! super (); ! } ! public AbstractMethodError (String msg) ! { ! super (msg); ! } } --- 1,78 ---- ! /* AbstractMethodError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * An AbstractMethodError is thrown when an application + * attempts to access an abstract method. Compilers typically detect + * this error, but it can be thrown at run time if the definition of a + * class has changed since the application was last compiled. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class AbstractMethodError extends IncompatibleClassChangeError { ! static final long serialVersionUID = -1654391082989018462L; ! /** ! * Create an error without a message. ! */ ! public AbstractMethodError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public AbstractMethodError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ArithmeticException.java gcc-3.1/libjava/java/lang/ArithmeticException.java *** gcc-3.0.4/libjava/java/lang/ArithmeticException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/ArithmeticException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class ArithmeticException extends RuntimeException { public ArithmeticException() ! { ! super(); ! } ! public ArithmeticException(String msg) ! { ! super(msg); ! } } --- 1,79 ---- ! /* ArithmeticException.java -- exception thrown to indicate conditions ! like divide by zero. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional circumstances. ! * In this case an ArithmeticException is thrown when things like trying ! * to divide a number by zero. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class ArithmeticException extends RuntimeException { + static final long serialVersionUID = 2256477558314496007L; + + /** + * Create an exception without a message. + */ public ArithmeticException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public ArithmeticException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ArrayIndexOutOfBoundsException.java gcc-3.1/libjava/java/lang/ArrayIndexOutOfBoundsException.java *** gcc-3.0.4/libjava/java/lang/ArrayIndexOutOfBoundsException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/ArrayIndexOutOfBoundsException.java Tue Jan 22 22:40:16 2002 *************** *** 1,37 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException { ! public ArrayIndexOutOfBoundsException() ! { super(); } ! public ArrayIndexOutOfBoundsException(int index) ! { ! this("Array index out of range: " + index); } ! public ArrayIndexOutOfBoundsException(String msg) ! { ! super(msg); } } --- 1,87 ---- ! /* ArrayIndexOutOfBoundsException.java -- exception thrown when accessing ! an illegal index. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions, in this case ! * when trying to access an illegal index. This exception is thrown when ! * accessing an index which is either negative or greater than the size of ! * the array minus one. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException { ! static final long serialVersionUID = -5116101128118950844L; ! ! /** ! * Create an exception without a message. ! */ ! public ArrayIndexOutOfBoundsException() { super(); } ! /** ! * Create an exception with a message. ! */ ! public ArrayIndexOutOfBoundsException(String s) { ! super(s); } ! /** ! * Create an exception indicating the illegal index. ! */ ! public ArrayIndexOutOfBoundsException(int index) { ! super("Array index out of range: " + index); } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ArrayStoreException.java gcc-3.1/libjava/java/lang/ArrayStoreException.java *** gcc-3.0.4/libjava/java/lang/ArrayStoreException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/ArrayStoreException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class ArrayStoreException extends RuntimeException { public ArrayStoreException() ! { ! super(); ! } ! public ArrayStoreException(String msg) ! { ! super(msg); ! } } --- 1,78 ---- ! /* ArrayStoreException.java -- exception thrown to when trying to store an ! object into an array of a different type. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions, in this case ! * when trying to store an object into an array of a different type. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class ArrayStoreException extends RuntimeException { + static final long serialVersionUID = -4522193890499838241L; + + /** + * Create an exception without a message. + */ public ArrayStoreException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public ArrayStoreException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Boolean.java gcc-3.1/libjava/java/lang/Boolean.java *** gcc-3.0.4/libjava/java/lang/Boolean.java Fri Sep 8 19:37:08 2000 --- gcc-3.1/libjava/java/lang/Boolean.java Tue Jan 22 22:40:16 2002 *************** *** 1,100 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; import java.io.Serializable; ! /** ! * @author Warren Levy ! * @date September 3, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ ! ! public final class Boolean extends Object implements Serializable { ! public static final Boolean FALSE = new Boolean(false); ! public static final Boolean TRUE = new Boolean(true); ! ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = boolean.class; ! /* The boolean value of the instance. */ ! private boolean value; ! private static final long serialVersionUID = -3665804199014368530L; ! public Boolean(boolean boolVal) ! { ! value = boolVal; ! } ! public Boolean(String strVal) ! { ! value = (strVal == null ? false : strVal.equalsIgnoreCase("true")); ! } ! public boolean booleanValue() ! { ! return value; ! } ! public boolean equals(Object obj) ! { ! /* Don't need to compare obj to null as instanceof will do this. */ ! if (obj instanceof Boolean) ! return value == ((Boolean) obj).value; ! return false; ! } ! public static boolean getBoolean(String property) ! { ! /* TBD: If a security manager exists and it doesn't permit accessing ! * the property, it will throw an exception. Should we catch it? */ ! try ! { ! String val = System.getProperty(property); ! return val == null ? false : val.equalsIgnoreCase("true"); ! } ! catch (SecurityException e) ! { ! return false; ! } ! } ! ! public int hashCode() ! { ! /* These values are from the Java Lang. Spec. (Sec 20.4.7). ! * TBD: They could be made private static final fields but they're only ! * used here (and shouldn't be used anywhere else), though it might be ! * useful to grep on something like JAVA_HASH_* values for us as ! * developers. */ ! return value ? 1231 : 1237; ! } ! ! public String toString() ! { ! return value ? "true" : "false"; ! } ! public static Boolean valueOf(String str) ! { ! if (str == null) ! return FALSE; ! else ! /* This returns a Boolean (big B), not a boolean (little b). */ ! return str.equalsIgnoreCase("true") ? TRUE : FALSE; ! } } --- 1,188 ---- ! /* Boolean.java -- object wrapper for boolean ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; import java.io.Serializable; ! /** ! * Instances of class Boolean represent primitive ! * boolean values. ! * ! * @author Paul Fisher ! * @since JDK1.0 ! */ ! public final class Boolean implements Serializable { ! static final long serialVersionUID = -3665804199014368530L; ! ! /** ! * This field is a Boolean object representing the ! * primitive value true. This instance is returned ! * by the static valueOf() methods if they return ! * a Boolean representing true. ! */ ! public static final Boolean TRUE = new Boolean(true); ! ! /** ! * This field is a Boolean object representing the ! * primitive value false. This instance is returned ! * by the static valueOf() methods if they return ! * a Boolean representing false. ! */ ! public static final Boolean FALSE = new Boolean(false); ! /** ! * The primitive type boolean is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass('Z'); ! ! /** ! * The immutable value of this Boolean. ! */ ! private final boolean value; ! ! /** ! * Create a Boolean object representing the value of the ! * argument value. In general the use of the static ! * method valueof(boolean) is more efficient since it will ! * not create a new object. ! * ! * @param value the primitive value of this Boolean ! */ ! public Boolean(boolean value) { ! this.value = value; ! } ! ! /** ! * Creates a Boolean object representing the primitive ! * true if and only if s matches ! * the string "true" ignoring case, otherwise the object will represent ! * the primitive false. In general the use of the static ! * method valueof(String) is more efficient since it will ! * not create a new object. ! * ! * @param s the String representation of true ! * or false ! */ ! public Boolean(String s) { ! value = "true".equalsIgnoreCase(s); ! } ! /** ! * Return the primitive boolean value of this ! * Boolean object. ! */ ! public boolean booleanValue() { ! return value; ! } ! /** ! * Returns the Boolean TRUE if the given boolean is ! * true, otherwise it will return the Boolean ! * FALSE. ! * ! * @since 1.4 ! */ ! public static Boolean valueOf(boolean b) { ! return b ? TRUE : FALSE; ! } ! /** ! * Returns the Boolean TRUE if and only if the given ! * String is equal, ignoring case, to the the String "true", otherwise ! * it will return the Boolean FALSE. ! */ ! public static Boolean valueOf(String s) { ! return "true".equalsIgnoreCase(s) ? TRUE : FALSE; ! } ! /** ! * Returns the integer 1231 if this object represents ! * the primitive true and the integer 1237 ! * otherwise. ! */ ! public int hashCode() { ! return (value) ? 1231 : 1237; ! } ! /** ! * If the obj is an instance of Boolean and ! * has the same primitive value as this object then true ! * is returned. In all other cases, including if the obj ! * is null, false is returned. ! * ! * @param obj possibly an instance of any Class ! * @return false is obj is an instance of ! * Boolean and has the same primitive value as this ! * object. ! */ ! public boolean equals(Object obj) { ! return (obj instanceof Boolean && value == ((Boolean)obj).value); ! } ! /** ! * If the value of the system property name matches ! * "true" ignoring case then the function returns true. */ ! public static boolean getBoolean(String name) { ! String val = System.getProperty(name); ! return ("true".equalsIgnoreCase(val)); ! } ! ! /** ! * Returns "true" if the value of the give boolean is true and ! * returns "false" if the value of the given boolean is false. ! * ! * @since 1.4 */ ! public static String toString(boolean b) ! { ! return b ? "true" : "false"; ! } ! /** ! * Returns "true" if the value of this object is true and ! * returns "false" if the value of this object is false. ! */ ! public String toString() ! { ! return (value) ? "true" : "false"; ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Byte.java gcc-3.1/libjava/java/lang/Byte.java *** gcc-3.0.4/libjava/java/lang/Byte.java Fri Feb 9 02:56:38 2001 --- gcc-3.1/libjava/java/lang/Byte.java Tue Jan 22 22:40:16 2002 *************** *** 1,88 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.lang; /** ! * @author Per Bothner ! * @date April 17, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, plus online ! * API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! * Includes JDK 1.2 methods. */ ! ! public final class Byte extends Number implements Comparable { ! byte value; ! public final static byte MIN_VALUE = -128; ! public final static byte MAX_VALUE = 127; ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = byte.class; ! private static final long serialVersionUID = -7183698231559129828L; ! public Byte(byte value) { this.value = value; } ! public Byte(String str) ! throws NumberFormatException { ! this.value = parseByte(str, 10); } ! public byte byteValue() { return value; } ! public short shortValue() { ! return value; } ! public int intValue() { ! return value; } ! public long longValue () { ! return value; } ! ! public float floatValue () { ! return (float) value; } ! public double doubleValue () { ! return (double) value; } ! public static Byte decode(String str) ! throws NumberFormatException { ! int i = (Integer.decode(str)).intValue(); ! if (i < MIN_VALUE || i > MAX_VALUE) ! throw new NumberFormatException(); ! return new Byte((byte) i); } ! public static byte parseByte(String str, int radix) ! throws NumberFormatException { int i = Integer.parseInt(str, radix); if (i < MIN_VALUE || i > MAX_VALUE) --- 1,204 ---- ! /* Byte.java -- object wrapper for byte ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; /** ! * Instances of class Byte represent primitive byte ! * values. ! * ! * Additionally, this class provides various helper functions and variables ! * useful to bytes. ! * ! * @author Paul Fisher ! * @author John Keiser ! * @author Per Bothner ! * @since JDK 1.0 */ ! public final class Byte extends Number implements Comparable { ! static final long serialVersionUID = -7183698231559129828L; ! /** ! * The minimum value a byte can represent is -128. ! */ ! public static final byte MIN_VALUE = -128; ! /** ! * The maximum value a byte can represent is 127. ! */ ! public static final byte MAX_VALUE = 127; ! /** ! * The primitive type byte is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass('B'); ! /** ! * The immutable value of this Byte. ! */ ! private final byte value; ! ! /** ! * Create a Byte object representing the value of the ! * byte argument. ! * ! * @param value the value to use ! */ ! public Byte(byte value) { this.value = value; } ! /** ! * Create a Byte object representing the value specified ! * by the String argument. ! * ! * @param s the string to convert. ! */ ! public Byte(String s) throws NumberFormatException { ! value = parseByte(s, 10); } ! /** ! * Return a hashcode representing this Object. ! * ! * Byte's hash code is calculated by simply returning its ! * value. ! * ! * @return this Object's hash code. ! */ ! public int hashCode() { return value; } ! /** ! * Returns true if obj is an instance of ! * Byte and represents the same byte value. ! * @return whether these Objects are semantically equal. ! */ ! public boolean equals(Object obj) { ! return ((obj instanceof Byte) && (value == ((Byte)obj).byteValue())); } ! /** ! * Converts the byte to a String and assumes ! * a radix of 10. ! * @param i the byte to convert to String ! * @return the String representation of the argument. ! */ ! public static String toString(byte i) { ! return Integer.toString ((int) i); } ! /** ! * Converts the Byte value to a String and ! * assumes a radix of 10. ! * @return the String representation of this Byte. ! */ ! public String toString() { ! return Integer.toString ((int) value); } ! ! /** ! * Creates a new Byte object using the String, ! * assuming a radix of 10. ! * @param s the String to convert. ! * @return the new Byte. ! * @see #Byte(java.lang.String) ! * @see #parseByte(java.lang.String) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a byte. ! */ ! public static Byte valueOf(String s) throws NumberFormatException { ! return new Byte(parseByte(s)); } ! /** ! * Creates a new Byte object using the String ! * and specified radix (base). ! * @param s the String to convert. ! * @param radix the radix (base) to convert with. ! * @return the new Byte. ! * @see #parseByte(java.lang.String,int) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a byte. ! */ ! public static Byte valueOf(String s, int radix) ! throws NumberFormatException { ! return new Byte(parseByte(s, radix)); } ! /** ! * Converts the specified String into a byte. ! * This function assumes a radix of 10. ! * ! * @param s the String to convert ! * @return the byte value of the String ! * argument. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a byte. ! */ ! public static byte parseByte(String s) throws NumberFormatException { ! return parseByte(s, 10); } ! /** ! * Converts the specified String into a byte ! * using the specified radix (base). ! * ! * @param str the String to convert ! * @param radix the radix (base) to use in the conversion ! * @return the String argument converted to byte. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a byte. ! */ ! public static byte parseByte(String str, int radix) ! throws NumberFormatException { int i = Integer.parseInt(str, radix); if (i < MIN_VALUE || i > MAX_VALUE) *************** public final class Byte extends Number i *** 90,144 **** return (byte) i; } ! public static byte parseByte(String str) ! throws NumberFormatException { ! return parseByte(str, 10); } ! ! public static Byte valueOf(String str, int radix) ! throws NumberFormatException { ! return new Byte(parseByte(str, radix)); } ! public static Byte valueOf(String str) ! throws NumberFormatException { ! return valueOf(str, 10); } ! // Added in JDK 1.2 ! public int compareTo(Byte anotherByte) { ! return this.value - anotherByte.value; } ! // Added in JDK 1.2 ! /** @throws ClassCastException */ ! public int compareTo(Object o) { ! return this.value - ((Byte) o).value; } ! public boolean equals(Object obj) { ! return (obj instanceof Byte) && ((Byte)obj).value == value; } ! // Verified that hashCode is returns plain value (see Boolean_1 test). ! public int hashCode() { return value; } ! ! public String toString() { ! return Integer.toString((int) value); } ! ! public static String toString(byte value) { ! return Integer.toString((int) value); } } --- 206,314 ---- return (byte) i; } ! /** ! * Convert the specified String into a Byte. ! * The String may represent decimal, hexadecimal, or ! * octal numbers. ! * ! * The String argument is interpreted based on the leading ! * characters. Depending on what the String begins with, the base will be ! * interpreted differently: ! * ! * ! * ! * ! * ! * ! * ! * ! *
    Leading
    Characters
    Base
    #16
    0x16
    0X16
    08
    Anything
    Else
    10
    ! * ! * @param str the String to interpret. ! * @return the value of the String as a Byte. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a byte. ! */ ! public static Byte decode(String str) throws NumberFormatException { ! int i = (Integer.decode(str)).intValue(); ! if (i < MIN_VALUE || i > MAX_VALUE) ! throw new NumberFormatException(); ! return new Byte((byte) i); } ! ! /** Return the value of this Byte as an short. ! ** @return the value of this Byte as an short. ! **/ ! public byte byteValue() { ! return value; } ! /** Return the value of this Byte as an short. ! ** @return the value of this Byte as an short. ! **/ ! public short shortValue() { ! return value; } ! /** Return the value of this Byte as an int. ! ** @return the value of this Byte as an int. ! **/ ! public int intValue() { ! return value; } ! /** Return the value of this Byte as a long. ! ** @return the value of this Byte as a long. ! **/ ! public long longValue() { ! return value; } ! /** Return the value of this Byte as a float. ! ** @return the value of this Byte as a float. ! **/ ! public float floatValue() { ! return value; } ! /** Return the value of this Byte as a double. ! ** @return the value of this Byte as a double. ! **/ ! public double doubleValue() { return value; } ! ! /** ! * Compare two Bytes numerically by comparing their ! * byte values. ! * @return a positive value if this Byte is greater ! * in value than the argument Byte; a negative value ! * if this Byte is smaller in value than the argument ! * Byte; and 0, zero, if this ! * Byte is equal in value to the argument ! * Byte. ! */ ! public int compareTo(Byte b) { ! return (int)(value - b.byteValue()); } ! ! /** ! * Behaves like compareTo(java.lang.Byte) unless the Object ! * is not a Byte. Then it throws a ! * ClassCastException. ! * @exception ClassCastException if the argument is not a ! * Byte. ! */ ! public int compareTo(Object o) { ! return compareTo((Byte)o); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/CharSequence.java gcc-3.1/libjava/java/lang/CharSequence.java *** gcc-3.0.4/libjava/java/lang/CharSequence.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/CharSequence.java Tue Jan 22 22:40:16 2002 *************** *** 0 **** --- 1,91 ---- + /* java.lang.CharSequence -- Anything that has an indexed sequence of chars + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.lang; + + /** + * General functions on a sequence of chars. This interface is implemented + * by String, StringBuffer and + * CharBuffer to give a uniform way to get chars at a certain + * index, the number of characters in the sequence and a subrange of the + * chars. Indexes start at 0 and the last index is length()-1. + *

    + * Even when classes implement this interface they are not always + * exchangeble because they might implement their compare, equals or hash + * function differently. This means that in general one should not use a + * CharSequence as keys in collections since two sequences + * with the same chars at the same indexes with the same length might not + * have the same hash code, be equal or be comparable since the are + * represented by different classes. + * + * @author Mark Wielaard (mark@klomp.org) + * + * @since 1.4 + */ + + public interface CharSequence { + + /** + * Returns the character at the given index. + * + * @exception IndexOutOfBoundsException when i < 0 or + * i > length()-1. + */ + char charAt(int i); + + /** + * Returns the length of the sequence. + */ + int length(); + + /** + * Returns a new CharSequence of the indicated range. + * + * @exception IndexOutOfBoundsException when begin < 0, + * end < 0, end > length() or + * begin > end + */ + CharSequence subSequence(int begin, int end); + + /** + * Returns the complete CharSequence as a String. + * Classes that implement this interface should return a String + * which contains only the characters in the sequence in the correct order. + */ + String toString(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Character.java gcc-3.1/libjava/java/lang/Character.java *** gcc-3.0.4/libjava/java/lang/Character.java Fri Dec 15 05:53:39 2000 --- gcc-3.1/libjava/java/lang/Character.java Sun Apr 7 07:43:37 2002 *************** *** 1,440 **** ! // Character.java - Character class. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; import java.io.Serializable; /** * @author Tom Tromey ! * @date September 10, 1998 ! */ ! ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1, ! * online API docs for JDK 1.2 beta from http://www.javasoft.com, ! * and The Unicode Standard Version 2.0. ! * Status: Believed complete and correct for JDK 1.1; 1.2 methods ! * unimplemented. */ - public final class Character implements Serializable, Comparable { ! public static final char MIN_VALUE = '\u0000'; ! public static final char MAX_VALUE = '\uffff'; ! public static final int MIN_RADIX = 2; ! public static final int MAX_RADIX = 36; ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = char.class; ! // Space. ! public static final byte SPACE_SEPARATOR = 12; ! public static final byte LINE_SEPARATOR = 13; ! public static final byte PARAGRAPH_SEPARATOR = 14; ! // Letters. ! public static final byte UPPERCASE_LETTER = 1; ! public static final byte LOWERCASE_LETTER = 2; ! public static final byte TITLECASE_LETTER = 3; ! public static final byte MODIFIER_LETTER = 4; ! public static final byte OTHER_LETTER = 5; ! // Numbers. ! public static final byte DECIMAL_DIGIT_NUMBER = 9; ! public static final byte LETTER_NUMBER = 10; ! public static final byte OTHER_NUMBER = 11; ! // Marks. ! public static final byte NON_SPACING_MARK = 6; ! public static final byte ENCLOSING_MARK = 7; ! public static final byte COMBINING_SPACING_MARK = 8; ! // Punctuation. ! public static final byte DASH_PUNCTUATION = 20; ! public static final byte START_PUNCTUATION = 21; ! public static final byte END_PUNCTUATION = 22; ! public static final byte CONNECTOR_PUNCTUATION = 23; ! public static final byte OTHER_PUNCTUATION = 24; ! // Symbols. ! public static final byte MATH_SYMBOL = 25; ! public static final byte CURRENCY_SYMBOL = 26; ! public static final byte MODIFIER_SYMBOL = 27; ! public static final byte OTHER_SYMBOL = 28; ! // Format controls. ! public static final byte CONTROL = 15; ! // Note: The JCL book says that both FORMAT and PRIVATE_USE are 18. ! // However, FORMAT is actually 16. ! public static final byte FORMAT = 16; ! // Others. ! public static final byte UNASSIGNED = 0; ! public static final byte PRIVATE_USE = 18; ! public static final byte SURROGATE = 19; ! private static final long serialVersionUID = 3786198910865385080L; ! public Character (char ch) ! { ! value = ch; ! } ! public char charValue () ! { ! return value; ! } ! // See if a character is a digit. If so, return the corresponding ! // value. Otherwise return -1. ! private static native int digit_value (char ch); ! public static int digit (char ch, int radix) ! { ! if (radix < MIN_RADIX || radix > MAX_RADIX) ! return -1; ! int d = digit_value (ch); ! if (d == -1) ! { ! if (ch >= 'A' && ch <= 'Z') ! d = ch - 'A' + 10; ! else if (ch >= 'a' && ch <= 'z') ! d = ch - 'a' + 10; ! else ! return -1; ! } ! return d >= radix ? -1 : d; ! } ! public boolean equals (Object obj) ! { ! // Don't need to compare OBJ to null as instanceof will do this. ! if (obj instanceof Character) ! return value == ((Character) obj).value; ! return false; ! } ! public static char forDigit (int d, int rdx) ! { ! if (d < 0 || d >= rdx || rdx < MIN_RADIX || rdx > MAX_RADIX) ! return '\u0000'; ! if (d < 10) ! return (char) ('0' + d); ! // The Java Language Spec says to use lowercase, while the JCL ! // says to use uppercase. We go with the former. ! return (char) ('a' + d - 10); ! } ! public static native int getNumericValue (char ch); ! public static native int getType (char ch); ! public int hashCode () ! { ! return value; ! } ! public static boolean isDefined (char ch) ! { ! return getType (ch) != UNASSIGNED; ! } ! public static boolean isDigit (char ch) ! { ! return digit_value (ch) != -1; ! } ! // The JCL book says that the argument here is a Character. That is ! // wrong. ! public static boolean isIdentifierIgnorable (char ch) ! { ! // This information comes from the Unicode Standard. It isn't ! // auto-generated as it doesn't appear in the unidata table. ! return ((ch >= '\u0000' && ch <= '\u0008') ! || (ch >= '\u000e' && ch <= '\u001b') ! // JDK 1.2 docs say that these are ignorable. The Unicode ! // Standard is somewhat ambiguous on this issue. ! || (ch >= '\u007f' && ch <= '\u009f') ! || (ch >= '\u200c' && ch <= '\u200f') ! // JCl says 200a through 200e, but that is a typo. The ! // Unicode standard says the bidi controls are 202a ! // through 202e. ! || (ch >= '\u202a' && ch <= '\u202e') ! || (ch >= '\u206a' && ch <= '\u206f') ! || ch == '\ufeff'); ! } ! public static boolean isISOControl (char c) ! { ! return ((c >= '\u0000' && c <= '\u001f') ! || (c >= '\u007f' && c <= '\u009f')); ! } ! public static boolean isJavaIdentifierPart (char ch) ! { ! if (isIdentifierIgnorable (ch) || isDigit (ch)) ! return true; ! int type = getType (ch); ! return (type == COMBINING_SPACING_MARK || type == NON_SPACING_MARK ! || type == CURRENCY_SYMBOL || type == CONNECTOR_PUNCTUATION ! || type == UPPERCASE_LETTER || type == LOWERCASE_LETTER ! || type == TITLECASE_LETTER || type == MODIFIER_LETTER ! || type == OTHER_LETTER || type == LETTER_NUMBER); ! } ! public static boolean isJavaIdentifierStart (char ch) ! { ! int type = getType (ch); ! return (type == CURRENCY_SYMBOL || type == CONNECTOR_PUNCTUATION ! || type == UPPERCASE_LETTER || type == LOWERCASE_LETTER ! || type == TITLECASE_LETTER || type == MODIFIER_LETTER ! || type == OTHER_LETTER); ! } ! // Deprecated in 1.2. ! public static boolean isJavaLetter (char ch) ! { ! return ch == '$' || ch == '_' || isLetter (ch); ! } ! // Deprecated in 1.2. ! public static boolean isJavaLetterOrDigit (char ch) ! { ! return ch == '$' || ch == '_' || isLetterOrDigit (ch); ! } ! public static boolean isLetter (char ch) ! { ! int type = getType (ch); ! return (type == UPPERCASE_LETTER || type == LOWERCASE_LETTER ! || type == TITLECASE_LETTER || type == MODIFIER_LETTER ! || type == OTHER_LETTER); ! } ! public static boolean isLetterOrDigit (char ch) ! { ! return isDigit (ch) || isLetter (ch); ! } ! public static native boolean isLowerCase (char ch); ! // Deprecated in JCL. ! public static boolean isSpace (char ch) ! { ! return ch == '\n' || ch == '\t' || ch == '\f' || ch == '\r' || ch == ' '; ! } ! public static native boolean isSpaceChar (char ch); ! public static native boolean isTitleCase (char ch); ! public static boolean isUnicodeIdentifierPart (char ch) ! { ! if (isIdentifierIgnorable (ch) || isDigit (ch)) ! return true; ! int type = getType (ch); ! return (type == CONNECTOR_PUNCTUATION || type == LETTER_NUMBER ! || type == COMBINING_SPACING_MARK || type == NON_SPACING_MARK ! || type == UPPERCASE_LETTER || type == LOWERCASE_LETTER ! || type == TITLECASE_LETTER || type == MODIFIER_LETTER ! || type == OTHER_LETTER); ! } ! public static boolean isUnicodeIdentifierStart (char ch) ! { ! return isLetter (ch); ! } ! public static native boolean isUpperCase (char ch); ! public static boolean isWhitespace (char ch) ! { ! return ((ch >= '\u0009' && ch <= '\r') ! || (ch >= '\u001c' && ch <= '\u001f') ! || (ch != '\u00a0' && ch != '\ufeff' && isSpaceChar (ch))); ! } ! public static native char toLowerCase (char ch); ! public static native char toTitleCase (char ch); ! public static native char toUpperCase (char ch); ! public String toString () ! { ! return String.valueOf(value); ! } ! public int compareTo (Character anotherCharacter) ! { ! return value - anotherCharacter.value; ! } ! public int compareTo (Object o) ! { ! return compareTo ((Character) o); ! } ! // Private data. ! private char value; ! public static class Subset ! { ! protected Subset (String name) ! { ! this.name = name; ! } ! public final boolean equals (Object obj) ! { ! return obj == this; ! } ! public final int hashCode () ! { ! return super.hashCode (); ! } ! public final String toString () ! { ! return name; ! } ! // Name of this subset. ! private String name; ! } ! public static final class UnicodeBlock extends Subset ! { ! private UnicodeBlock (String name, char start, char end) ! { ! super (name); ! this.start = start; ! this.end = end; ! } ! public static UnicodeBlock of (char c) ! { ! // A special case we need. ! if (c == '\uFEFF') ! return SPECIALS; ! // Do a binary search to find the correct subset. ! int hi = blocks.length; ! int lo = 0; ! while (hi > lo) ! { ! int mid = (hi + lo) / 2; ! UnicodeBlock ub = blocks[mid]; ! if (c < ub.start) ! hi = mid; ! else if (c > ub.end) ! lo = mid; ! else ! return ub; ! } ! return null; ! } ! // Start and end characters. ! private char start, end; ! // Everything from here to the end of UnicodeBlock is ! // automatically generated by the blocks.pl script. ! public static final UnicodeBlock BASIC_LATIN = new UnicodeBlock ("Basic Latin", '\u0000', '\u007F'); ! public static final UnicodeBlock LATIN_1_SUPPLEMENT = new UnicodeBlock ("Latin-1 Supplement", '\u0080', '\u00FF'); ! public static final UnicodeBlock LATIN_EXTENDED_A = new UnicodeBlock ("Latin Extended-A", '\u0100', '\u017F'); ! public static final UnicodeBlock LATIN_EXTENDED_B = new UnicodeBlock ("Latin Extended-B", '\u0180', '\u024F'); ! public static final UnicodeBlock IPA_EXTENSIONS = new UnicodeBlock ("IPA Extensions", '\u0250', '\u02AF'); ! public static final UnicodeBlock SPACING_MODIFIER_LETTERS = new UnicodeBlock ("Spacing Modifier Letters", '\u02B0', '\u02FF'); ! public static final UnicodeBlock COMBINING_DIACRITICAL_MARKS = new UnicodeBlock ("Combining Diacritical Marks", '\u0300', '\u036F'); ! public static final UnicodeBlock GREEK = new UnicodeBlock ("Greek", '\u0370', '\u03FF'); ! public static final UnicodeBlock CYRILLIC = new UnicodeBlock ("Cyrillic", '\u0400', '\u04FF'); ! public static final UnicodeBlock ARMENIAN = new UnicodeBlock ("Armenian", '\u0530', '\u058F'); ! public static final UnicodeBlock HEBREW = new UnicodeBlock ("Hebrew", '\u0590', '\u05FF'); ! public static final UnicodeBlock ARABIC = new UnicodeBlock ("Arabic", '\u0600', '\u06FF'); ! public static final UnicodeBlock SYRIAC__ = new UnicodeBlock ("Syriac ", '\u0700', '\u074F'); ! public static final UnicodeBlock THAANA = new UnicodeBlock ("Thaana", '\u0780', '\u07BF'); ! public static final UnicodeBlock DEVANAGARI = new UnicodeBlock ("Devanagari", '\u0900', '\u097F'); ! public static final UnicodeBlock BENGALI = new UnicodeBlock ("Bengali", '\u0980', '\u09FF'); ! public static final UnicodeBlock GURMUKHI = new UnicodeBlock ("Gurmukhi", '\u0A00', '\u0A7F'); ! public static final UnicodeBlock GUJARATI = new UnicodeBlock ("Gujarati", '\u0A80', '\u0AFF'); ! public static final UnicodeBlock ORIYA = new UnicodeBlock ("Oriya", '\u0B00', '\u0B7F'); ! public static final UnicodeBlock TAMIL = new UnicodeBlock ("Tamil", '\u0B80', '\u0BFF'); ! public static final UnicodeBlock TELUGU = new UnicodeBlock ("Telugu", '\u0C00', '\u0C7F'); ! public static final UnicodeBlock KANNADA = new UnicodeBlock ("Kannada", '\u0C80', '\u0CFF'); ! public static final UnicodeBlock MALAYALAM = new UnicodeBlock ("Malayalam", '\u0D00', '\u0D7F'); ! public static final UnicodeBlock SINHALA = new UnicodeBlock ("Sinhala", '\u0D80', '\u0DFF'); ! public static final UnicodeBlock THAI = new UnicodeBlock ("Thai", '\u0E00', '\u0E7F'); ! public static final UnicodeBlock LAO = new UnicodeBlock ("Lao", '\u0E80', '\u0EFF'); ! public static final UnicodeBlock TIBETAN = new UnicodeBlock ("Tibetan", '\u0F00', '\u0FFF'); ! public static final UnicodeBlock MYANMAR_ = new UnicodeBlock ("Myanmar ", '\u1000', '\u109F'); ! public static final UnicodeBlock GEORGIAN = new UnicodeBlock ("Georgian", '\u10A0', '\u10FF'); ! public static final UnicodeBlock HANGUL_JAMO = new UnicodeBlock ("Hangul Jamo", '\u1100', '\u11FF'); ! public static final UnicodeBlock ETHIOPIC = new UnicodeBlock ("Ethiopic", '\u1200', '\u137F'); ! public static final UnicodeBlock CHEROKEE = new UnicodeBlock ("Cherokee", '\u13A0', '\u13FF'); ! public static final UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS = new UnicodeBlock ("Unified Canadian Aboriginal Syllabics", '\u1400', '\u167F'); ! public static final UnicodeBlock OGHAM = new UnicodeBlock ("Ogham", '\u1680', '\u169F'); ! public static final UnicodeBlock RUNIC = new UnicodeBlock ("Runic", '\u16A0', '\u16FF'); ! public static final UnicodeBlock KHMER = new UnicodeBlock ("Khmer", '\u1780', '\u17FF'); ! public static final UnicodeBlock MONGOLIAN = new UnicodeBlock ("Mongolian", '\u1800', '\u18AF'); ! public static final UnicodeBlock LATIN_EXTENDED_ADDITIONAL = new UnicodeBlock ("Latin Extended Additional", '\u1E00', '\u1EFF'); ! public static final UnicodeBlock GREEK_EXTENDED = new UnicodeBlock ("Greek Extended", '\u1F00', '\u1FFF'); ! public static final UnicodeBlock GENERAL_PUNCTUATION = new UnicodeBlock ("General Punctuation", '\u2000', '\u206F'); ! public static final UnicodeBlock SUPERSCRIPTS_AND_SUBSCRIPTS = new UnicodeBlock ("Superscripts and Subscripts", '\u2070', '\u209F'); ! public static final UnicodeBlock CURRENCY_SYMBOLS = new UnicodeBlock ("Currency Symbols", '\u20A0', '\u20CF'); ! public static final UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS = new UnicodeBlock ("Combining Marks for Symbols", '\u20D0', '\u20FF'); ! public static final UnicodeBlock LETTERLIKE_SYMBOLS = new UnicodeBlock ("Letterlike Symbols", '\u2100', '\u214F'); ! public static final UnicodeBlock NUMBER_FORMS = new UnicodeBlock ("Number Forms", '\u2150', '\u218F'); ! public static final UnicodeBlock ARROWS = new UnicodeBlock ("Arrows", '\u2190', '\u21FF'); ! public static final UnicodeBlock MATHEMATICAL_OPERATORS = new UnicodeBlock ("Mathematical Operators", '\u2200', '\u22FF'); ! public static final UnicodeBlock MISCELLANEOUS_TECHNICAL = new UnicodeBlock ("Miscellaneous Technical", '\u2300', '\u23FF'); ! public static final UnicodeBlock CONTROL_PICTURES = new UnicodeBlock ("Control Pictures", '\u2400', '\u243F'); ! public static final UnicodeBlock OPTICAL_CHARACTER_RECOGNITION = new UnicodeBlock ("Optical Character Recognition", '\u2440', '\u245F'); ! public static final UnicodeBlock ENCLOSED_ALPHANUMERICS = new UnicodeBlock ("Enclosed Alphanumerics", '\u2460', '\u24FF'); ! public static final UnicodeBlock BOX_DRAWING = new UnicodeBlock ("Box Drawing", '\u2500', '\u257F'); ! public static final UnicodeBlock BLOCK_ELEMENTS = new UnicodeBlock ("Block Elements", '\u2580', '\u259F'); ! public static final UnicodeBlock GEOMETRIC_SHAPES = new UnicodeBlock ("Geometric Shapes", '\u25A0', '\u25FF'); ! public static final UnicodeBlock MISCELLANEOUS_SYMBOLS = new UnicodeBlock ("Miscellaneous Symbols", '\u2600', '\u26FF'); ! public static final UnicodeBlock DINGBATS = new UnicodeBlock ("Dingbats", '\u2700', '\u27BF'); ! public static final UnicodeBlock BRAILLE_PATTERNS = new UnicodeBlock ("Braille Patterns", '\u2800', '\u28FF'); ! public static final UnicodeBlock CJK_RADICALS_SUPPLEMENT = new UnicodeBlock ("CJK Radicals Supplement", '\u2E80', '\u2EFF'); ! public static final UnicodeBlock KANGXI_RADICALS = new UnicodeBlock ("Kangxi Radicals", '\u2F00', '\u2FDF'); ! public static final UnicodeBlock IDEOGRAPHIC_DESCRIPTION_CHARACTERS = new UnicodeBlock ("Ideographic Description Characters", '\u2FF0', '\u2FFF'); ! public static final UnicodeBlock CJK_SYMBOLS_AND_PUNCTUATION = new UnicodeBlock ("CJK Symbols and Punctuation", '\u3000', '\u303F'); ! public static final UnicodeBlock HIRAGANA = new UnicodeBlock ("Hiragana", '\u3040', '\u309F'); ! public static final UnicodeBlock KATAKANA = new UnicodeBlock ("Katakana", '\u30A0', '\u30FF'); ! public static final UnicodeBlock BOPOMOFO = new UnicodeBlock ("Bopomofo", '\u3100', '\u312F'); ! public static final UnicodeBlock HANGUL_COMPATIBILITY_JAMO = new UnicodeBlock ("Hangul Compatibility Jamo", '\u3130', '\u318F'); ! public static final UnicodeBlock KANBUN = new UnicodeBlock ("Kanbun", '\u3190', '\u319F'); ! public static final UnicodeBlock BOPOMOFO_EXTENDED = new UnicodeBlock ("Bopomofo Extended", '\u31A0', '\u31BF'); ! public static final UnicodeBlock ENCLOSED_CJK_LETTERS_AND_MONTHS = new UnicodeBlock ("Enclosed CJK Letters and Months", '\u3200', '\u32FF'); ! public static final UnicodeBlock CJK_COMPATIBILITY = new UnicodeBlock ("CJK Compatibility", '\u3300', '\u33FF'); ! public static final UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A = new UnicodeBlock ("CJK Unified Ideographs Extension A", '\u3400', '\u4DB5'); ! public static final UnicodeBlock CJK_UNIFIED_IDEOGRAPHS = new UnicodeBlock ("CJK Unified Ideographs", '\u4E00', '\u9FFF'); ! public static final UnicodeBlock YI_SYLLABLES = new UnicodeBlock ("Yi Syllables", '\uA000', '\uA48F'); ! public static final UnicodeBlock YI_RADICALS = new UnicodeBlock ("Yi Radicals", '\uA490', '\uA4CF'); ! public static final UnicodeBlock HANGUL_SYLLABLES = new UnicodeBlock ("Hangul Syllables", '\uAC00', '\uD7A3'); ! public static final UnicodeBlock SURROGATES_AREA = new UnicodeBlock ("Surrogates Area", '\uD800', '\uDFFF'); ! public static final UnicodeBlock PRIVATE_USE_AREA = new UnicodeBlock ("Private Use Area", '\uE000', '\uF8FF'); ! public static final UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS = new UnicodeBlock ("CJK Compatibility Ideographs", '\uF900', '\uFAFF'); ! public static final UnicodeBlock ALPHABETIC_PRESENTATION_FORMS = new UnicodeBlock ("Alphabetic Presentation Forms", '\uFB00', '\uFB4F'); ! public static final UnicodeBlock ARABIC_PRESENTATION_FORMS_A = new UnicodeBlock ("Arabic Presentation Forms-A", '\uFB50', '\uFDFF'); ! public static final UnicodeBlock COMBINING_HALF_MARKS = new UnicodeBlock ("Combining Half Marks", '\uFE20', '\uFE2F'); ! public static final UnicodeBlock CJK_COMPATIBILITY_FORMS = new UnicodeBlock ("CJK Compatibility Forms", '\uFE30', '\uFE4F'); ! public static final UnicodeBlock SMALL_FORM_VARIANTS = new UnicodeBlock ("Small Form Variants", '\uFE50', '\uFE6F'); ! public static final UnicodeBlock ARABIC_PRESENTATION_FORMS_B = new UnicodeBlock ("Arabic Presentation Forms-B", '\uFE70', '\uFEFE'); ! public static final UnicodeBlock HALFWIDTH_AND_FULLWIDTH_FORMS = new UnicodeBlock ("Halfwidth and Fullwidth Forms", '\uFF00', '\uFFEF'); ! public static final UnicodeBlock SPECIALS = new UnicodeBlock ("Specials", '\uFFF0', '\uFFFD'); ! private static final UnicodeBlock[] blocks = { BASIC_LATIN, LATIN_1_SUPPLEMENT, LATIN_EXTENDED_A, --- 1,905 ---- ! /* java.lang.Character -- Wrapper class for char, and Unicode subsets ! Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! /* ! * Note: This class must not be merged with Classpath. Gcj uses C-style ! * arrays (see include/java-chartables.h) to store the Unicode character ! * database, whereas Classpath uses Java objects (char[] extracted from ! * String constants) in gnu.java.lang.CharData. Gcj's approach is more ! * efficient, because there is no vtable or data relocation to worry about. ! * However, despite the difference in the database interface, the two ! * versions share identical algorithms. ! */ package java.lang; import java.io.Serializable; /** + * Wrapper class for the primitive char data type. In addition, this class + * allows one to retrieve property information and perform transformations + * on the 57,707 defined characters in the Unicode Standard, Version 3.0.0. + * java.lang.Character is designed to be very dynamic, and as such, it + * retrieves information on the Unicode character set from a separate + * database, gnu.java.lang.CharData, which can be easily upgraded. + * + *

    For predicates, boundaries are used to describe + * the set of characters for which the method will return true. + * This syntax uses fairly normal regular expression notation. + * See 5.13 of the Unicode Standard, Version 3.0, for the + * boundary specification. + * + *

    See http://www.unicode.org + * for more information on the Unicode Standard. + * * @author Tom Tromey ! * @author Paul N. Fisher ! * @author Jochen Hoenicke ! * @author Eric Blake ! * @since 1.0 ! * @status updated to 1.4 */ public final class Character implements Serializable, Comparable { ! /** ! * A subset of Unicode blocks. ! * ! * @author Paul N. Fisher ! * @author Eric Blake ! * @since 1.2 ! */ ! public static class Subset ! { ! /** The name of the subset. */ ! private final String name; ! /** ! * Construct a new subset of characters. ! * ! * @param name the name of the subset ! * @throws NullPointerException if name is null ! */ ! protected Subset(String name) ! { ! // Note that name.toString() is name, unless name was null. ! this.name = name.toString(); ! } ! /** ! * Compares two Subsets for equality. This is final, and ! * restricts the comparison on the == operator, so it returns ! * true only for the same object. ! * ! * @param o the object to compare ! * @return true if o is this ! */ ! public final boolean equals(Object o) ! { ! return o == this; ! } ! /** ! * Makes the original hashCode of Object final, to be consistent with ! * equals. ! * ! * @return the hash code for this object ! */ ! public final int hashCode() ! { ! return super.hashCode(); ! } ! /** ! * Returns the name of the subset. ! * ! * @return the name ! */ ! public final String toString() ! { ! return name; ! } ! } // class Subset ! /** ! * A family of character subsets in the Unicode specification. A character ! * is in at most one of these blocks. ! * ! * This inner class was generated automatically from ! * libjava/gnu/gcj/convert/Blocks-3.txt, by some perl scripts. ! * This Unicode definition file can be found on the ! * http://www.unicode.org website. ! * JDK 1.4 uses Unicode version 3.0.0. ! * ! * @author scripts/unicode-blocks.pl (written by Eric Blake) ! * @since 1.2 ! */ ! public static final class UnicodeBlock extends Subset ! { ! /** The start of the subset. */ ! private final char start; ! /** The end of the subset. */ ! private final char end; ! /** ! * Constructor for strictly defined blocks. ! * ! * @param start the start character of the range ! * @param end the end character of the range ! * @param name the block name ! */ ! private UnicodeBlock(char start, char end, String name) ! { ! super(name); ! this.start = start; ! this.end = end; ! } ! /** ! * Returns the Unicode character block which a character belongs to. ! * ! * @param ch the character to look up ! * @return the set it belongs to, or null if it is not in one ! */ ! public static UnicodeBlock of(char ch) ! { ! // Special case, since SPECIALS contains two ranges. ! if (ch == '\uFEFF') ! return SPECIALS; ! // Simple binary search for the correct block. ! int low = 0; ! int hi = sets.length - 1; ! while (low <= hi) ! { ! int mid = (low + hi) >> 1; ! UnicodeBlock b = sets[mid]; ! if (ch < b.start) ! hi = mid - 1; ! else if (ch > b.end) ! low = mid + 1; ! else ! return b; ! } ! return null; ! } ! /** ! * Basic Latin. ! * '\u0000' - '\u007F'. ! */ ! public final static UnicodeBlock BASIC_LATIN ! = new UnicodeBlock('\u0000', '\u007F', ! "BASIC_LATIN"); ! /** ! * Latin-1 Supplement. ! * '\u0080' - '\u00FF'. ! */ ! public final static UnicodeBlock LATIN_1_SUPPLEMENT ! = new UnicodeBlock('\u0080', '\u00FF', ! "LATIN_1_SUPPLEMENT"); ! /** ! * Latin Extended-A. ! * '\u0100' - '\u017F'. ! */ ! public final static UnicodeBlock LATIN_EXTENDED_A ! = new UnicodeBlock('\u0100', '\u017F', ! "LATIN_EXTENDED_A"); ! /** ! * Latin Extended-B. ! * '\u0180' - '\u024F'. ! */ ! public final static UnicodeBlock LATIN_EXTENDED_B ! = new UnicodeBlock('\u0180', '\u024F', ! "LATIN_EXTENDED_B"); ! /** ! * IPA Extensions. ! * '\u0250' - '\u02AF'. ! */ ! public final static UnicodeBlock IPA_EXTENSIONS ! = new UnicodeBlock('\u0250', '\u02AF', ! "IPA_EXTENSIONS"); ! /** ! * Spacing Modifier Letters. ! * '\u02B0' - '\u02FF'. ! */ ! public final static UnicodeBlock SPACING_MODIFIER_LETTERS ! = new UnicodeBlock('\u02B0', '\u02FF', ! "SPACING_MODIFIER_LETTERS"); ! /** ! * Combining Diacritical Marks. ! * '\u0300' - '\u036F'. ! */ ! public final static UnicodeBlock COMBINING_DIACRITICAL_MARKS ! = new UnicodeBlock('\u0300', '\u036F', ! "COMBINING_DIACRITICAL_MARKS"); ! /** ! * Greek. ! * '\u0370' - '\u03FF'. ! */ ! public final static UnicodeBlock GREEK ! = new UnicodeBlock('\u0370', '\u03FF', ! "GREEK"); ! /** ! * Cyrillic. ! * '\u0400' - '\u04FF'. ! */ ! public final static UnicodeBlock CYRILLIC ! = new UnicodeBlock('\u0400', '\u04FF', ! "CYRILLIC"); ! /** ! * Armenian. ! * '\u0530' - '\u058F'. ! */ ! public final static UnicodeBlock ARMENIAN ! = new UnicodeBlock('\u0530', '\u058F', ! "ARMENIAN"); ! /** ! * Hebrew. ! * '\u0590' - '\u05FF'. ! */ ! public final static UnicodeBlock HEBREW ! = new UnicodeBlock('\u0590', '\u05FF', ! "HEBREW"); ! /** ! * Arabic. ! * '\u0600' - '\u06FF'. ! */ ! public final static UnicodeBlock ARABIC ! = new UnicodeBlock('\u0600', '\u06FF', ! "ARABIC"); ! /** ! * Syriac. ! * '\u0700' - '\u074F'. ! * @since 1.4 ! */ ! public final static UnicodeBlock SYRIAC ! = new UnicodeBlock('\u0700', '\u074F', ! "SYRIAC"); ! /** ! * Thaana. ! * '\u0780' - '\u07BF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock THAANA ! = new UnicodeBlock('\u0780', '\u07BF', ! "THAANA"); ! /** ! * Devanagari. ! * '\u0900' - '\u097F'. ! */ ! public final static UnicodeBlock DEVANAGARI ! = new UnicodeBlock('\u0900', '\u097F', ! "DEVANAGARI"); ! /** ! * Bengali. ! * '\u0980' - '\u09FF'. ! */ ! public final static UnicodeBlock BENGALI ! = new UnicodeBlock('\u0980', '\u09FF', ! "BENGALI"); ! /** ! * Gurmukhi. ! * '\u0A00' - '\u0A7F'. ! */ ! public final static UnicodeBlock GURMUKHI ! = new UnicodeBlock('\u0A00', '\u0A7F', ! "GURMUKHI"); ! /** ! * Gujarati. ! * '\u0A80' - '\u0AFF'. ! */ ! public final static UnicodeBlock GUJARATI ! = new UnicodeBlock('\u0A80', '\u0AFF', ! "GUJARATI"); ! /** ! * Oriya. ! * '\u0B00' - '\u0B7F'. ! */ ! public final static UnicodeBlock ORIYA ! = new UnicodeBlock('\u0B00', '\u0B7F', ! "ORIYA"); ! /** ! * Tamil. ! * '\u0B80' - '\u0BFF'. ! */ ! public final static UnicodeBlock TAMIL ! = new UnicodeBlock('\u0B80', '\u0BFF', ! "TAMIL"); ! /** ! * Telugu. ! * '\u0C00' - '\u0C7F'. ! */ ! public final static UnicodeBlock TELUGU ! = new UnicodeBlock('\u0C00', '\u0C7F', ! "TELUGU"); ! /** ! * Kannada. ! * '\u0C80' - '\u0CFF'. ! */ ! public final static UnicodeBlock KANNADA ! = new UnicodeBlock('\u0C80', '\u0CFF', ! "KANNADA"); ! /** ! * Malayalam. ! * '\u0D00' - '\u0D7F'. ! */ ! public final static UnicodeBlock MALAYALAM ! = new UnicodeBlock('\u0D00', '\u0D7F', ! "MALAYALAM"); ! /** ! * Sinhala. ! * '\u0D80' - '\u0DFF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock SINHALA ! = new UnicodeBlock('\u0D80', '\u0DFF', ! "SINHALA"); ! /** ! * Thai. ! * '\u0E00' - '\u0E7F'. ! */ ! public final static UnicodeBlock THAI ! = new UnicodeBlock('\u0E00', '\u0E7F', ! "THAI"); ! /** ! * Lao. ! * '\u0E80' - '\u0EFF'. ! */ ! public final static UnicodeBlock LAO ! = new UnicodeBlock('\u0E80', '\u0EFF', ! "LAO"); ! /** ! * Tibetan. ! * '\u0F00' - '\u0FFF'. ! */ ! public final static UnicodeBlock TIBETAN ! = new UnicodeBlock('\u0F00', '\u0FFF', ! "TIBETAN"); ! /** ! * Myanmar. ! * '\u1000' - '\u109F'. ! * @since 1.4 ! */ ! public final static UnicodeBlock MYANMAR ! = new UnicodeBlock('\u1000', '\u109F', ! "MYANMAR"); ! /** ! * Georgian. ! * '\u10A0' - '\u10FF'. ! */ ! public final static UnicodeBlock GEORGIAN ! = new UnicodeBlock('\u10A0', '\u10FF', ! "GEORGIAN"); ! /** ! * Hangul Jamo. ! * '\u1100' - '\u11FF'. ! */ ! public final static UnicodeBlock HANGUL_JAMO ! = new UnicodeBlock('\u1100', '\u11FF', ! "HANGUL_JAMO"); ! /** ! * Ethiopic. ! * '\u1200' - '\u137F'. ! * @since 1.4 ! */ ! public final static UnicodeBlock ETHIOPIC ! = new UnicodeBlock('\u1200', '\u137F', ! "ETHIOPIC"); ! /** ! * Cherokee. ! * '\u13A0' - '\u13FF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock CHEROKEE ! = new UnicodeBlock('\u13A0', '\u13FF', ! "CHEROKEE"); ! /** ! * Unified Canadian Aboriginal Syllabics. ! * '\u1400' - '\u167F'. ! * @since 1.4 ! */ ! public final static UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS ! = new UnicodeBlock('\u1400', '\u167F', ! "UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS"); ! /** ! * Ogham. ! * '\u1680' - '\u169F'. ! * @since 1.4 ! */ ! public final static UnicodeBlock OGHAM ! = new UnicodeBlock('\u1680', '\u169F', ! "OGHAM"); ! /** ! * Runic. ! * '\u16A0' - '\u16FF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock RUNIC ! = new UnicodeBlock('\u16A0', '\u16FF', ! "RUNIC"); ! /** ! * Khmer. ! * '\u1780' - '\u17FF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock KHMER ! = new UnicodeBlock('\u1780', '\u17FF', ! "KHMER"); ! /** ! * Mongolian. ! * '\u1800' - '\u18AF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock MONGOLIAN ! = new UnicodeBlock('\u1800', '\u18AF', ! "MONGOLIAN"); ! /** ! * Latin Extended Additional. ! * '\u1E00' - '\u1EFF'. ! */ ! public final static UnicodeBlock LATIN_EXTENDED_ADDITIONAL ! = new UnicodeBlock('\u1E00', '\u1EFF', ! "LATIN_EXTENDED_ADDITIONAL"); ! /** ! * Greek Extended. ! * '\u1F00' - '\u1FFF'. ! */ ! public final static UnicodeBlock GREEK_EXTENDED ! = new UnicodeBlock('\u1F00', '\u1FFF', ! "GREEK_EXTENDED"); ! /** ! * General Punctuation. ! * '\u2000' - '\u206F'. ! */ ! public final static UnicodeBlock GENERAL_PUNCTUATION ! = new UnicodeBlock('\u2000', '\u206F', ! "GENERAL_PUNCTUATION"); ! /** ! * Superscripts and Subscripts. ! * '\u2070' - '\u209F'. ! */ ! public final static UnicodeBlock SUPERSCRIPTS_AND_SUBSCRIPTS ! = new UnicodeBlock('\u2070', '\u209F', ! "SUPERSCRIPTS_AND_SUBSCRIPTS"); ! /** ! * Currency Symbols. ! * '\u20A0' - '\u20CF'. ! */ ! public final static UnicodeBlock CURRENCY_SYMBOLS ! = new UnicodeBlock('\u20A0', '\u20CF', ! "CURRENCY_SYMBOLS"); ! /** ! * Combining Marks for Symbols. ! * '\u20D0' - '\u20FF'. ! */ ! public final static UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS ! = new UnicodeBlock('\u20D0', '\u20FF', ! "COMBINING_MARKS_FOR_SYMBOLS"); ! /** ! * Letterlike Symbols. ! * '\u2100' - '\u214F'. ! */ ! public final static UnicodeBlock LETTERLIKE_SYMBOLS ! = new UnicodeBlock('\u2100', '\u214F', ! "LETTERLIKE_SYMBOLS"); ! /** ! * Number Forms. ! * '\u2150' - '\u218F'. ! */ ! public final static UnicodeBlock NUMBER_FORMS ! = new UnicodeBlock('\u2150', '\u218F', ! "NUMBER_FORMS"); ! ! /** ! * Arrows. ! * '\u2190' - '\u21FF'. ! */ ! public final static UnicodeBlock ARROWS ! = new UnicodeBlock('\u2190', '\u21FF', ! "ARROWS"); ! ! /** ! * Mathematical Operators. ! * '\u2200' - '\u22FF'. ! */ ! public final static UnicodeBlock MATHEMATICAL_OPERATORS ! = new UnicodeBlock('\u2200', '\u22FF', ! "MATHEMATICAL_OPERATORS"); ! ! /** ! * Miscellaneous Technical. ! * '\u2300' - '\u23FF'. ! */ ! public final static UnicodeBlock MISCELLANEOUS_TECHNICAL ! = new UnicodeBlock('\u2300', '\u23FF', ! "MISCELLANEOUS_TECHNICAL"); ! ! /** ! * Control Pictures. ! * '\u2400' - '\u243F'. ! */ ! public final static UnicodeBlock CONTROL_PICTURES ! = new UnicodeBlock('\u2400', '\u243F', ! "CONTROL_PICTURES"); ! ! /** ! * Optical Character Recognition. ! * '\u2440' - '\u245F'. ! */ ! public final static UnicodeBlock OPTICAL_CHARACTER_RECOGNITION ! = new UnicodeBlock('\u2440', '\u245F', ! "OPTICAL_CHARACTER_RECOGNITION"); ! ! /** ! * Enclosed Alphanumerics. ! * '\u2460' - '\u24FF'. ! */ ! public final static UnicodeBlock ENCLOSED_ALPHANUMERICS ! = new UnicodeBlock('\u2460', '\u24FF', ! "ENCLOSED_ALPHANUMERICS"); ! ! /** ! * Box Drawing. ! * '\u2500' - '\u257F'. ! */ ! public final static UnicodeBlock BOX_DRAWING ! = new UnicodeBlock('\u2500', '\u257F', ! "BOX_DRAWING"); ! ! /** ! * Block Elements. ! * '\u2580' - '\u259F'. ! */ ! public final static UnicodeBlock BLOCK_ELEMENTS ! = new UnicodeBlock('\u2580', '\u259F', ! "BLOCK_ELEMENTS"); ! ! /** ! * Geometric Shapes. ! * '\u25A0' - '\u25FF'. ! */ ! public final static UnicodeBlock GEOMETRIC_SHAPES ! = new UnicodeBlock('\u25A0', '\u25FF', ! "GEOMETRIC_SHAPES"); ! ! /** ! * Miscellaneous Symbols. ! * '\u2600' - '\u26FF'. ! */ ! public final static UnicodeBlock MISCELLANEOUS_SYMBOLS ! = new UnicodeBlock('\u2600', '\u26FF', ! "MISCELLANEOUS_SYMBOLS"); ! ! /** ! * Dingbats. ! * '\u2700' - '\u27BF'. ! */ ! public final static UnicodeBlock DINGBATS ! = new UnicodeBlock('\u2700', '\u27BF', ! "DINGBATS"); ! ! /** ! * Braille Patterns. ! * '\u2800' - '\u28FF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock BRAILLE_PATTERNS ! = new UnicodeBlock('\u2800', '\u28FF', ! "BRAILLE_PATTERNS"); ! ! /** ! * CJK Radicals Supplement. ! * '\u2E80' - '\u2EFF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock CJK_RADICALS_SUPPLEMENT ! = new UnicodeBlock('\u2E80', '\u2EFF', ! "CJK_RADICALS_SUPPLEMENT"); ! ! /** ! * Kangxi Radicals. ! * '\u2F00' - '\u2FDF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock KANGXI_RADICALS ! = new UnicodeBlock('\u2F00', '\u2FDF', ! "KANGXI_RADICALS"); ! ! /** ! * Ideographic Description Characters. ! * '\u2FF0' - '\u2FFF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock IDEOGRAPHIC_DESCRIPTION_CHARACTERS ! = new UnicodeBlock('\u2FF0', '\u2FFF', ! "IDEOGRAPHIC_DESCRIPTION_CHARACTERS"); ! ! /** ! * CJK Symbols and Punctuation. ! * '\u3000' - '\u303F'. ! */ ! public final static UnicodeBlock CJK_SYMBOLS_AND_PUNCTUATION ! = new UnicodeBlock('\u3000', '\u303F', ! "CJK_SYMBOLS_AND_PUNCTUATION"); ! ! /** ! * Hiragana. ! * '\u3040' - '\u309F'. ! */ ! public final static UnicodeBlock HIRAGANA ! = new UnicodeBlock('\u3040', '\u309F', ! "HIRAGANA"); ! ! /** ! * Katakana. ! * '\u30A0' - '\u30FF'. ! */ ! public final static UnicodeBlock KATAKANA ! = new UnicodeBlock('\u30A0', '\u30FF', ! "KATAKANA"); ! ! /** ! * Bopomofo. ! * '\u3100' - '\u312F'. ! */ ! public final static UnicodeBlock BOPOMOFO ! = new UnicodeBlock('\u3100', '\u312F', ! "BOPOMOFO"); ! ! /** ! * Hangul Compatibility Jamo. ! * '\u3130' - '\u318F'. ! */ ! public final static UnicodeBlock HANGUL_COMPATIBILITY_JAMO ! = new UnicodeBlock('\u3130', '\u318F', ! "HANGUL_COMPATIBILITY_JAMO"); ! ! /** ! * Kanbun. ! * '\u3190' - '\u319F'. ! */ ! public final static UnicodeBlock KANBUN ! = new UnicodeBlock('\u3190', '\u319F', ! "KANBUN"); ! ! /** ! * Bopomofo Extended. ! * '\u31A0' - '\u31BF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock BOPOMOFO_EXTENDED ! = new UnicodeBlock('\u31A0', '\u31BF', ! "BOPOMOFO_EXTENDED"); ! ! /** ! * Enclosed CJK Letters and Months. ! * '\u3200' - '\u32FF'. ! */ ! public final static UnicodeBlock ENCLOSED_CJK_LETTERS_AND_MONTHS ! = new UnicodeBlock('\u3200', '\u32FF', ! "ENCLOSED_CJK_LETTERS_AND_MONTHS"); ! ! /** ! * CJK Compatibility. ! * '\u3300' - '\u33FF'. ! */ ! public final static UnicodeBlock CJK_COMPATIBILITY ! = new UnicodeBlock('\u3300', '\u33FF', ! "CJK_COMPATIBILITY"); ! ! /** ! * CJK Unified Ideographs Extension A. ! * '\u3400' - '\u4DB5'. ! * @since 1.4 ! */ ! public final static UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A ! = new UnicodeBlock('\u3400', '\u4DB5', ! "CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A"); ! ! /** ! * CJK Unified Ideographs. ! * '\u4E00' - '\u9FFF'. ! */ ! public final static UnicodeBlock CJK_UNIFIED_IDEOGRAPHS ! = new UnicodeBlock('\u4E00', '\u9FFF', ! "CJK_UNIFIED_IDEOGRAPHS"); ! ! /** ! * Yi Syllables. ! * '\uA000' - '\uA48F'. ! * @since 1.4 ! */ ! public final static UnicodeBlock YI_SYLLABLES ! = new UnicodeBlock('\uA000', '\uA48F', ! "YI_SYLLABLES"); ! ! /** ! * Yi Radicals. ! * '\uA490' - '\uA4CF'. ! * @since 1.4 ! */ ! public final static UnicodeBlock YI_RADICALS ! = new UnicodeBlock('\uA490', '\uA4CF', ! "YI_RADICALS"); ! ! /** ! * Hangul Syllables. ! * '\uAC00' - '\uD7A3'. ! */ ! public final static UnicodeBlock HANGUL_SYLLABLES ! = new UnicodeBlock('\uAC00', '\uD7A3', ! "HANGUL_SYLLABLES"); ! ! /** ! * Surrogates Area. ! * '\uD800' - '\uDFFF'. ! */ ! public final static UnicodeBlock SURROGATES_AREA ! = new UnicodeBlock('\uD800', '\uDFFF', ! "SURROGATES_AREA"); ! ! /** ! * Private Use Area. ! * '\uE000' - '\uF8FF'. ! */ ! public final static UnicodeBlock PRIVATE_USE_AREA ! = new UnicodeBlock('\uE000', '\uF8FF', ! "PRIVATE_USE_AREA"); ! ! /** ! * CJK Compatibility Ideographs. ! * '\uF900' - '\uFAFF'. ! */ ! public final static UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS ! = new UnicodeBlock('\uF900', '\uFAFF', ! "CJK_COMPATIBILITY_IDEOGRAPHS"); ! ! /** ! * Alphabetic Presentation Forms. ! * '\uFB00' - '\uFB4F'. ! */ ! public final static UnicodeBlock ALPHABETIC_PRESENTATION_FORMS ! = new UnicodeBlock('\uFB00', '\uFB4F', ! "ALPHABETIC_PRESENTATION_FORMS"); ! ! /** ! * Arabic Presentation Forms-A. ! * '\uFB50' - '\uFDFF'. ! */ ! public final static UnicodeBlock ARABIC_PRESENTATION_FORMS_A ! = new UnicodeBlock('\uFB50', '\uFDFF', ! "ARABIC_PRESENTATION_FORMS_A"); ! ! /** ! * Combining Half Marks. ! * '\uFE20' - '\uFE2F'. ! */ ! public final static UnicodeBlock COMBINING_HALF_MARKS ! = new UnicodeBlock('\uFE20', '\uFE2F', ! "COMBINING_HALF_MARKS"); ! ! /** ! * CJK Compatibility Forms. ! * '\uFE30' - '\uFE4F'. ! */ ! public final static UnicodeBlock CJK_COMPATIBILITY_FORMS ! = new UnicodeBlock('\uFE30', '\uFE4F', ! "CJK_COMPATIBILITY_FORMS"); ! ! /** ! * Small Form Variants. ! * '\uFE50' - '\uFE6F'. ! */ ! public final static UnicodeBlock SMALL_FORM_VARIANTS ! = new UnicodeBlock('\uFE50', '\uFE6F', ! "SMALL_FORM_VARIANTS"); ! ! /** ! * Arabic Presentation Forms-B. ! * '\uFE70' - '\uFEFE'. ! */ ! public final static UnicodeBlock ARABIC_PRESENTATION_FORMS_B ! = new UnicodeBlock('\uFE70', '\uFEFE', ! "ARABIC_PRESENTATION_FORMS_B"); ! ! /** ! * Halfwidth and Fullwidth Forms. ! * '\uFF00' - '\uFFEF'. ! */ ! public final static UnicodeBlock HALFWIDTH_AND_FULLWIDTH_FORMS ! = new UnicodeBlock('\uFF00', '\uFFEF', ! "HALFWIDTH_AND_FULLWIDTH_FORMS"); ! ! /** ! * Specials. ! * '\uFEFF', '\uFFF0' - '\uFFFD'. ! */ ! public final static UnicodeBlock SPECIALS ! = new UnicodeBlock('\uFFF0', '\uFFFD', ! "SPECIALS"); ! ! /** ! * The defined subsets. ! */ ! private static final UnicodeBlock sets[] = { BASIC_LATIN, LATIN_1_SUPPLEMENT, LATIN_EXTENDED_A, *************** public final class Character implements *** 447,453 **** ARMENIAN, HEBREW, ARABIC, ! SYRIAC__, THAANA, DEVANAGARI, BENGALI, --- 912,918 ---- ARMENIAN, HEBREW, ARABIC, ! SYRIAC, THAANA, DEVANAGARI, BENGALI, *************** public final class Character implements *** 462,468 **** THAI, LAO, TIBETAN, ! MYANMAR_, GEORGIAN, HANGUL_JAMO, ETHIOPIC, --- 927,933 ---- THAI, LAO, TIBETAN, ! MYANMAR, GEORGIAN, HANGUL_JAMO, ETHIOPIC, *************** public final class Character implements *** 519,525 **** SMALL_FORM_VARIANTS, ARABIC_PRESENTATION_FORMS_B, HALFWIDTH_AND_FULLWIDTH_FORMS, ! SPECIALS }; } ! } --- 984,2163 ---- SMALL_FORM_VARIANTS, ARABIC_PRESENTATION_FORMS_B, HALFWIDTH_AND_FULLWIDTH_FORMS, ! SPECIALS, }; + } // class UnicodeBlock + + /** + * The immutable value of this Character. + * + * @serial the value of this Character + */ + private final char value; + + /** + * Compatible with JDK 1.0+. + */ + private static final long serialVersionUID = 3786198910865385080L; + + /** + * Smallest value allowed for radix arguments in Java. This value is 2. + * + * @see #digit(char, int) + * @see #forDigit(int, int) + * @see Integer#toString(int, int) + * @see Integer#valueOf(String) + */ + public static final int MIN_RADIX = 2; + + /** + * Largest value allowed for radix arguments in Java. This value is 36. + * + * @see #digit(char, int) + * @see #forDigit(int, int) + * @see Integer#toString(int, int) + * @see Integer#valueOf(String) + */ + public static final int MAX_RADIX = 36; + + /** + * The minimum value the char data type can hold. + * This value is '\\u0000'. + */ + public static final char MIN_VALUE = '\u0000'; + + /** + * The maximum value the char data type can hold. + * This value is '\\uFFFF'. + */ + public static final char MAX_VALUE = '\uFFFF'; + + /** + * Class object representing the primitive char data type. + * + * @since 1.1 + */ + public static final Class TYPE = VMClassLoader.getPrimitiveClass('C'); + + /** + * Lu = Letter, Uppercase (Informative). + * + * @since 1.1 + */ + public static final byte UPPERCASE_LETTER = 1; + + /** + * Ll = Letter, Lowercase (Informative). + * + * @since 1.1 + */ + public static final byte LOWERCASE_LETTER = 2; + + /** + * Lt = Letter, Titlecase (Informative). + * + * @since 1.1 + */ + public static final byte TITLECASE_LETTER = 3; + + /** + * Mn = Mark, Non-Spacing (Normative). + * + * @since 1.1 + */ + public static final byte NON_SPACING_MARK = 6; + + /** + * Mc = Mark, Spacing Combining (Normative). + * + * @since 1.1 + */ + public static final byte COMBINING_SPACING_MARK = 8; + + /** + * Me = Mark, Enclosing (Normative). + * + * @since 1.1 + */ + public static final byte ENCLOSING_MARK = 7; + + /** + * Nd = Number, Decimal Digit (Normative). + * + * @since 1.1 + */ + public static final byte DECIMAL_DIGIT_NUMBER = 9; + + /** + * Nl = Number, Letter (Normative). + * + * @since 1.1 + */ + public static final byte LETTER_NUMBER = 10; + + /** + * No = Number, Other (Normative). + * + * @since 1.1 + */ + public static final byte OTHER_NUMBER = 11; + + /** + * Zs = Separator, Space (Normative). + * + * @since 1.1 + */ + public static final byte SPACE_SEPARATOR = 12; + + /** + * Zl = Separator, Line (Normative). + * + * @since 1.1 + */ + public static final byte LINE_SEPARATOR = 13; + + /** + * Zp = Separator, Paragraph (Normative). + * + * @since 1.1 + */ + public static final byte PARAGRAPH_SEPARATOR = 14; + + /** + * Cc = Other, Control (Normative). + * + * @since 1.1 + */ + public static final byte CONTROL = 15; + + /** + * Cf = Other, Format (Normative). + * + * @since 1.1 + */ + public static final byte FORMAT = 16; + + /** + * Cs = Other, Surrogate (Normative). + * + * @since 1.1 + */ + public static final byte SURROGATE = 19; + + /** + * Co = Other, Private Use (Normative). + * + * @since 1.1 + */ + public static final byte PRIVATE_USE = 18; + + /** + * Cn = Other, Not Assigned (Normative). + * + * @since 1.1 + */ + public static final byte UNASSIGNED = 0; + + /** + * Lm = Letter, Modifier (Informative). + * + * @since 1.1 + */ + public static final byte MODIFIER_LETTER = 4; + + /** + * Lo = Letter, Other (Informative). + * + * @since 1.1 + */ + public static final byte OTHER_LETTER = 5; + + /** + * Pc = Punctuation, Connector (Informative). + * + * @since 1.1 + */ + public static final byte CONNECTOR_PUNCTUATION = 23; + + /** + * Pd = Punctuation, Dash (Informative). + * + * @since 1.1 + */ + public static final byte DASH_PUNCTUATION = 20; + + /** + * Ps = Punctuation, Open (Informative). + * + * @since 1.1 + */ + public static final byte START_PUNCTUATION = 21; + + /** + * Pe = Punctuation, Close (Informative). + * + * @since 1.1 + */ + public static final byte END_PUNCTUATION = 22; + + /** + * Pi = Punctuation, Initial Quote (Informative). + * + * @since 1.4 + */ + public static final byte INITIAL_QUOTE_PUNCTUATION = 29; + + /** + * Pf = Punctuation, Final Quote (Informative). + * + * @since 1.4 + */ + public static final byte FINAL_QUOTE_PUNCTUATION = 30; + + /** + * Po = Punctuation, Other (Informative). + * + * @since 1.1 + */ + public static final byte OTHER_PUNCTUATION = 24; + + /** + * Sm = Symbol, Math (Informative). + * + * @since 1.1 + */ + public static final byte MATH_SYMBOL = 25; + + /** + * Sc = Symbol, Currency (Informative). + * + * @since 1.1 + */ + public static final byte CURRENCY_SYMBOL = 26; + + /** + * Sk = Symbol, Modifier (Informative). + * + * @since 1.1 + */ + public static final byte MODIFIER_SYMBOL = 27; + + /** + * So = Symbol, Other (Informative). + * + * @since 1.1 + */ + public static final byte OTHER_SYMBOL = 28; + + /** + * Undefined bidirectional character type. Undefined char values have + * undefined directionality in the Unicode specification. + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_UNDEFINED = -1; + + /** + * Strong bidirectional character type "L". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_LEFT_TO_RIGHT = 0; + + /** + * Strong bidirectional character type "R". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_RIGHT_TO_LEFT = 1; + + /** + * Strong bidirectional character type "AL". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC = 2; + + /** + * Weak bidirectional character type "EN". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_EUROPEAN_NUMBER = 3; + + /** + * Weak bidirectional character type "ES". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR = 4; + + /** + * Weak bidirectional character type "ET". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR = 5; + + /** + * Weak bidirectional character type "AN". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_ARABIC_NUMBER = 6; + + /** + * Weak bidirectional character type "CS". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR = 7; + + /** + * Weak bidirectional character type "NSM". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_NONSPACING_MARK = 8; + + /** + * Weak bidirectional character type "BN". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_BOUNDARY_NEUTRAL = 9; + + /** + * Neutral bidirectional character type "B". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_PARAGRAPH_SEPARATOR = 10; + + /** + * Neutral bidirectional character type "S". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_SEGMENT_SEPARATOR = 11; + + /** + * Strong bidirectional character type "WS". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_WHITESPACE = 12; + + /** + * Neutral bidirectional character type "ON". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_OTHER_NEUTRALS = 13; + + /** + * Strong bidirectional character type "LRE". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING = 14; + + /** + * Strong bidirectional character type "LRO". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE = 15; + + /** + * Strong bidirectional character type "RLE". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING = 16; + + /** + * Strong bidirectional character type "RLO". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE = 17; + + /** + * Weak bidirectional character type "PDF". + * + * @since 1.4 + */ + public static final byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT = 18; + + /** + * Mask for grabbing the type out of the result of readChar. + * @see #readChar(char) + */ + private static final int TYPE_MASK = 0x1F; + + /** + * Mask for grabbing the non-breaking space flag out of the result of + * readChar. + * @see #readChar(char) + */ + private static final int NO_BREAK_MASK = 0x20; + + /** + * Mask for grabbing the mirrored directionality flag out of the result + * of readChar. + * @see #readChar(char) + */ + private static final int MIRROR_MASK = 0x40; + + /** + * Grabs an attribute offset from the Unicode attribute database. The lower + * 5 bits are the character type, the next 2 bits are flags, and the top + * 9 bits are the offset into the attribute tables. Note that the top 9 + * bits are meaningless in this context; they are useful only in the native + * code. + * + * @param ch the character to look up + * @return the character's attribute offset and type + * @see #TYPE_MASK + * @see #NO_BREAK_MASK + * @see #MIRROR_MASK + */ + private static native char readChar(char ch); + + /** + * Wraps up a character. + * + * @param value the character to wrap + */ + public Character(char value) + { + this.value = value; } ! ! /** ! * Returns the character which has been wrapped by this class. ! * ! * @return the character wrapped ! */ ! public char charValue() ! { ! return value; ! } ! ! /** ! * Returns the numerical value (unsigned) of the wrapped character. ! * Range of returned values: 0x0000-0xFFFF. ! * ! * @return the value of the wrapped character ! */ ! public int hashCode() ! { ! return value; ! } ! ! /** ! * Determines if an object is equal to this object. This is only true for ! * another Character object wrapping the same value. ! * ! * @param o object to compare ! * @return true if o is a Character with the same value ! */ ! public boolean equals(Object o) ! { ! return o instanceof Character && value == ((Character) o).value; ! } ! ! /** ! * Converts the wrapped character into a String. ! * ! * @return a String containing one character -- the wrapped character ! * of this instance ! */ ! public String toString() ! { ! // This assumes that String.valueOf(char) can create a single-character ! // String more efficiently than through the public API. ! return String.valueOf(value); ! } ! ! /** ! * Returns a String of length 1 representing the specified character. ! * ! * @param ch the character to convert ! * @return a String containing the character ! * @since 1.4 ! */ ! public String toString(char ch) ! { ! // This assumes that String.valueOf(char) can create a single-character ! // String more efficiently than through the public API. ! return String.valueOf(ch); ! } ! ! /** ! * Determines if a character is a Unicode lowercase letter. For example, ! * 'a' is lowercase. ! *
    ! * lowercase = [Ll] ! * ! * @param ch character to test ! * @return true if ch is a Unicode lowercase letter, else false ! * @see #isUpperCase(char) ! * @see #isTitleCase(char) ! * @see #toLowerCase(char) ! * @see #getType(char) ! */ ! public static boolean isLowerCase(char ch) ! { ! return getType(ch) == LOWERCASE_LETTER; ! } ! ! /** ! * Determines if a character is a Unicode uppercase letter. For example, ! * 'A' is uppercase. ! *
    ! * uppercase = [Lu] ! * ! * @param ch character to test ! * @return true if ch is a Unicode uppercase letter, else false ! * @see #isLowerCase(char) ! * @see #isTitleCase(char) ! * @see #toUpperCase(char) ! * @see #getType(char) ! */ ! public static boolean isUpperCase(char ch) ! { ! return getType(ch) == UPPERCASE_LETTER; ! } ! ! /** ! * Determines if a character is a Unicode titlecase letter. For example, ! * the character "Lj" (Latin capital L with small letter j) is titlecase. ! *
    ! * titlecase = [Lt] ! * ! * @param ch character to test ! * @return true if ch is a Unicode titlecase letter, else false ! * @see #isLowerCase(char) ! * @see #isUpperCase(char) ! * @see #toTitleCase(char) ! * @see #getType(char) ! */ ! public static boolean isTitleCase(char ch) ! { ! return getType(ch) == TITLECASE_LETTER; ! } ! ! /** ! * Determines if a character is a Unicode decimal digit. For example, ! * '0' is a digit. ! *
    ! * Unicode decimal digit = [Nd] ! * ! * @param ch character to test ! * @return true if ch is a Unicode decimal digit, else false ! * @see #digit(char, int) ! * @see #forDigit(int, int) ! * @see #getType(char) ! */ ! public static boolean isDigit(char ch) ! { ! return getType(ch) == DECIMAL_DIGIT_NUMBER; ! } ! ! /** ! * Determines if a character is part of the Unicode Standard. This is an ! * evolving standard, but covers every character in the data file. ! *
    ! * defined = not [Cn] ! * ! * @param ch character to test ! * @return true if ch is a Unicode character, else false ! * @see #isDigit(char) ! * @see #isLetter(char) ! * @see #isLetterOrDigit(char) ! * @see #isLowerCase(char) ! * @see #isTitleCase(char) ! * @see #isUpperCase(char) ! */ ! public static boolean isDefined(char ch) ! { ! return getType(ch) != UNASSIGNED; ! } ! ! /** ! * Determines if a character is a Unicode letter. Not all letters have case, ! * so this may return true when isLowerCase and isUpperCase return false. ! *
    ! * letter = [Lu]|[Ll]|[Lt]|[Lm]|[Lo] ! * ! * @param ch character to test ! * @return true if ch is a Unicode letter, else false ! * @see #isDigit(char) ! * @see #isJavaIdentifierStart(char) ! * @see #isJavaLetter(char) ! * @see #isJavaLetterOrDigit(char) ! * @see #isLetterOrDigit(char) ! * @see #isLowerCase(char) ! * @see #isTitleCase(char) ! * @see #isUnicodeIdentifierStart(char) ! * @see #isUpperCase(char) ! */ ! public static boolean isLetter(char ch) ! { ! return ((1 << getType(ch)) ! & ((1 << UPPERCASE_LETTER) ! | (1 << LOWERCASE_LETTER) ! | (1 << TITLECASE_LETTER) ! | (1 << MODIFIER_LETTER) ! | (1 << OTHER_LETTER))) != 0; ! } ! ! /** ! * Determines if a character is a Unicode letter or a Unicode digit. This ! * is the combination of isLetter and isDigit. ! *
    ! * letter or digit = [Lu]|[Ll]|[Lt]|[Lm]|[Lo]|[Nd] ! * ! * @param ch character to test ! * @return true if ch is a Unicode letter or a Unicode digit, else false ! * @see #isDigit(char) ! * @see #isJavaIdentifierPart(char) ! * @see #isJavaLetter(char) ! * @see #isJavaLetterOrDigit(char) ! * @see #isLetter(char) ! * @see #isUnicodeIdentifierPart(char) ! */ ! public static boolean isLetterOrDigit(char ch) ! { ! return ((1 << getType(ch)) ! & ((1 << UPPERCASE_LETTER) ! | (1 << LOWERCASE_LETTER) ! | (1 << TITLECASE_LETTER) ! | (1 << MODIFIER_LETTER) ! | (1 << OTHER_LETTER) ! | (1 << DECIMAL_DIGIT_NUMBER))) != 0; ! } ! ! /** ! * Determines if a character can start a Java identifier. This is the ! * combination of isLetter, any character where getType returns ! * LETTER_NUMBER, currency symbols (like '$'), and connecting punctuation ! * (like '_'). ! * ! * @param ch character to test ! * @return true if ch can start a Java identifier, else false ! * @deprecated Replaced by {@link #isJavaIdentifierStart(char)} ! * @see #isJavaLetterOrDigit(char) ! * @see #isJavaIdentifierStart(char) ! * @see #isJavaIdentifierPart(char) ! * @see #isLetter(char) ! * @see #isLetterOrDigit(char) ! * @see #isUnicodeIdentifierStart(char) ! */ ! public static boolean isJavaLetter(char ch) ! { ! return isJavaIdentifierStart(ch); ! } ! ! /** ! * Determines if a character can follow the first letter in ! * a Java identifier. This is the combination of isJavaLetter (isLetter, ! * type of LETTER_NUMBER, currency, connecting punctuation) and digit, ! * numeric letter (like Roman numerals), combining marks, non-spacing marks, ! * or isIdentifierIgnorable. ! * ! * @param ch character to test ! * @return true if ch can follow the first letter in a Java identifier ! * @deprecated Replaced by {@link #isJavaIdentifierPart(char)} ! * @see #isJavaLetter(char) ! * @see #isJavaIdentifierStart(char) ! * @see #isJavaIdentifierPart(char) ! * @see #isLetter(char) ! * @see #isLetterOrDigit(char) ! * @see #isUnicodeIdentifierPart(char) ! * @see #isIdentifierIgnorable(char) ! */ ! public static boolean isJavaLetterOrDigit(char ch) ! { ! return isJavaIdentifierPart(ch); ! } ! ! /** ! * Determines if a character can start a Java identifier. This is the ! * combination of isLetter, any character where getType returns ! * LETTER_NUMBER, currency symbols (like '$'), and connecting punctuation ! * (like '_'). ! *
    ! * Java identifier start = [Lu]|[Ll]|[Lt]|[Lm]|[Lo]|[Nl]|[Sc]|[Pc] ! * ! * @param ch character to test ! * @return true if ch can start a Java identifier, else false ! * @see #isJavaIdentifierPart(char) ! * @see #isLetter(char) ! * @see #isUnicodeIdentifierStart(char) ! * @since 1.1 ! */ ! public static boolean isJavaIdentifierStart(char ch) ! { ! return ((1 << getType(ch)) ! & ((1 << UPPERCASE_LETTER) ! | (1 << LOWERCASE_LETTER) ! | (1 << TITLECASE_LETTER) ! | (1 << MODIFIER_LETTER) ! | (1 << OTHER_LETTER) ! | (1 << LETTER_NUMBER) ! | (1 << CURRENCY_SYMBOL) ! | (1 << CONNECTOR_PUNCTUATION))) != 0; ! } ! ! /** ! * Determines if a character can follow the first letter in ! * a Java identifier. This is the combination of isJavaLetter (isLetter, ! * type of LETTER_NUMBER, currency, connecting punctuation) and digit, ! * numeric letter (like Roman numerals), combining marks, non-spacing marks, ! * or isIdentifierIgnorable. ! *
    ! * Java identifier extender = ! * [Lu]|[Ll]|[Lt]|[Lm]|[Lo]|[Nl]|[Sc]|[Pc]|[Mn]|[Mc]|[Nd]|[Cf] ! * |U+0000-U+0008|U+000E-U+001B|U+007F-U+009F ! * ! * @param ch character to test ! * @return true if ch can follow the first letter in a Java identifier ! * @see #isIdentifierIgnorable(char) ! * @see #isJavaIdentifierStart(char) ! * @see #isLetterOrDigit(char) ! * @see #isUnicodeIdentifierPart(char) ! * @since 1.1 ! */ ! public static boolean isJavaIdentifierPart(char ch) ! { ! int category = getType(ch); ! return ((1 << category) ! & ((1 << UPPERCASE_LETTER) ! | (1 << LOWERCASE_LETTER) ! | (1 << TITLECASE_LETTER) ! | (1 << MODIFIER_LETTER) ! | (1 << OTHER_LETTER) ! | (1 << NON_SPACING_MARK) ! | (1 << COMBINING_SPACING_MARK) ! | (1 << DECIMAL_DIGIT_NUMBER) ! | (1 << LETTER_NUMBER) ! | (1 << CURRENCY_SYMBOL) ! | (1 << CONNECTOR_PUNCTUATION) ! | (1 << FORMAT))) != 0 ! || (category == CONTROL && isIdentifierIgnorable(ch)); ! } ! ! /** ! * Determines if a character can start a Unicode identifier. Only ! * letters can start a Unicode identifier, but this includes characters ! * in LETTER_NUMBER. ! *
    ! * Unicode identifier start = [Lu]|[Ll]|[Lt]|[Lm]|[Lo]|[Nl] ! * ! * @param ch character to test ! * @return true if ch can start a Unicode identifier, else false ! * @see #isJavaIdentifierStart(char) ! * @see #isLetter(char) ! * @see #isUnicodeIdentifierPart(char) ! * @since 1.1 ! */ ! public static boolean isUnicodeIdentifierStart(char ch) ! { ! return ((1 << getType(ch)) ! & ((1 << UPPERCASE_LETTER) ! | (1 << LOWERCASE_LETTER) ! | (1 << TITLECASE_LETTER) ! | (1 << MODIFIER_LETTER) ! | (1 << OTHER_LETTER) ! | (1 << LETTER_NUMBER))) != 0; ! } ! ! /** ! * Determines if a character can follow the first letter in ! * a Unicode identifier. This includes letters, connecting punctuation, ! * digits, numeric letters, combining marks, non-spacing marks, and ! * isIdentifierIgnorable. ! *
    ! * Unicode identifier extender = ! * [Lu]|[Ll]|[Lt]|[Lm]|[Lo]|[Nl]|[Mn]|[Mc]|[Nd]|[Pc]|[Cf]| ! * |U+0000-U+0008|U+000E-U+001B|U+007F-U+009F ! * ! * @param ch character to test ! * @return true if ch can follow the first letter in a Unicode identifier ! * @see #isIdentifierIgnorable(char) ! * @see #isJavaIdentifierPart(char) ! * @see #isLetterOrDigit(char) ! * @see #isUnicodeIdentifierStart(char) ! * @since 1.1 ! */ ! public static boolean isUnicodeIdentifierPart(char ch) ! { ! int category = getType(ch); ! return ((1 << category) ! & ((1 << UPPERCASE_LETTER) ! | (1 << LOWERCASE_LETTER) ! | (1 << TITLECASE_LETTER) ! | (1 << MODIFIER_LETTER) ! | (1 << OTHER_LETTER) ! | (1 << NON_SPACING_MARK) ! | (1 << COMBINING_SPACING_MARK) ! | (1 << DECIMAL_DIGIT_NUMBER) ! | (1 << LETTER_NUMBER) ! | (1 << CONNECTOR_PUNCTUATION) ! | (1 << FORMAT))) != 0 ! || (category == CONTROL && isIdentifierIgnorable(ch)); ! } ! ! /** ! * Determines if a character is ignorable in a Unicode identifier. This ! * includes the non-whitespace ISO control characters ('\u0000' ! * through '\u0008', '\u000E' through ! * '\u001B', and '\u007F' through ! * '\u009F'), and FORMAT characters. ! *
    ! * Unicode identifier ignorable = [Cf]|U+0000-U+0008|U+000E-U+001B ! * |U+007F-U+009F ! * ! * @param ch character to test ! * @return true if ch is ignorable in a Unicode or Java identifier ! * @see #isJavaIdentifierPart(char) ! * @see #isUnicodeIdentifierPart(char) ! * @since 1.1 ! */ ! public static boolean isIdentifierIgnorable(char ch) ! { ! return (ch <= '\u009F' && (ch < '\t' || ch >= '\u007F' ! || (ch <= '\u001B' && ch >= '\u000E'))) ! || getType(ch) == FORMAT; ! } ! ! /** ! * Converts a Unicode character into its lowercase equivalent mapping. ! * If a mapping does not exist, then the character passed is returned. ! * Note that isLowerCase(toLowerCase(ch)) does not always return true. ! * ! * @param ch character to convert to lowercase ! * @return lowercase mapping of ch, or ch if lowercase mapping does ! * not exist ! * @see #isLowerCase(char) ! * @see #isUpperCase(char) ! * @see #toTitleCase(char) ! * @see #toUpperCase(char) ! */ ! public static native char toLowerCase(char ch); ! ! /** ! * Converts a Unicode character into its uppercase equivalent mapping. ! * If a mapping does not exist, then the character passed is returned. ! * Note that isUpperCase(toUpperCase(ch)) does not always return true. ! * ! * @param ch character to convert to uppercase ! * @return uppercase mapping of ch, or ch if uppercase mapping does ! * not exist ! * @see #isLowerCase(char) ! * @see #isUpperCase(char) ! * @see #toLowerCase(char) ! * @see #toTitleCase(char) ! */ ! public static native char toUpperCase(char ch); ! ! /** ! * Converts a Unicode character into its titlecase equivalent mapping. ! * If a mapping does not exist, then the character passed is returned. ! * Note that isTitleCase(toTitleCase(ch)) does not always return true. ! * ! * @param ch character to convert to titlecase ! * @return titlecase mapping of ch, or ch if titlecase mapping does ! * not exist ! * @see #isTitleCase(char) ! * @see #toLowerCase(char) ! * @see #toUpperCase(char) ! */ ! public static native char toTitleCase(char ch); ! ! /** ! * Converts a character into a digit of the specified radix. If the radix ! * exceeds MIN_RADIX or MAX_RADIX, or if the result of getNumericValue(ch) ! * exceeds the radix, or if ch is not a decimal digit or in the case ! * insensitive set of 'a'-'z', the result is -1. ! *
    ! * character argument boundary = [Nd]|U+0041-U+005A|U+0061-U+007A ! * |U+FF21-U+FF3A|U+FF41-U+FF5A ! * ! * @param ch character to convert into a digit ! * @param radix radix in which ch is a digit ! * @return digit which ch represents in radix, or -1 not a valid digit ! * @see #MIN_RADIX ! * @see #MAX_RADIX ! * @see #forDigit(int, int) ! * @see #isDigit(char) ! * @see #getNumericValue(char) ! */ ! public static native int digit(char ch, int radix); ! ! /** ! * Returns the Unicode numeric value property of a character. For example, ! * '\\u216C' (the Roman numeral fifty) returns 50. ! * ! *

    This method also returns values for the letters A through Z, (not ! * specified by Unicode), in these ranges: '\u0041' ! * through '\u005A' (uppercase); '\u0061' ! * through '\u007A' (lowercase); and '\uFF21' ! * through '\uFF3A', '\uFF41' through ! * '\uFF5A' (full width variants). ! * ! *

    If the character lacks a numeric value property, -1 is returned. ! * If the character has a numeric value property which is not representable ! * as a nonnegative integer, such as a fraction, -2 is returned. ! * ! * character argument boundary = [Nd]|[Nl]|[No]|U+0041-U+005A|U+0061-U+007A ! * |U+FF21-U+FF3A|U+FF41-U+FF5A ! * ! * @param ch character from which the numeric value property will ! * be retrieved ! * @return the numeric value property of ch, or -1 if it does not exist, or ! * -2 if it is not representable as a nonnegative integer ! * @see #forDigit(int, int) ! * @see #digit(char, int) ! * @see #isDigit(char) ! * @since 1.1 ! */ ! public static native int getNumericValue(char ch); ! ! /** ! * Determines if a character is a ISO-LATIN-1 space. This is only the five ! * characters '\t', '\n', '\f', ! * '\r', and ' '. ! *
    ! * Java space = U+0020|U+0009|U+000A|U+000C|U+000D ! * ! * @param ch character to test ! * @return true if ch is a space, else false ! * @deprecated Replaced by {@link #isWhitespace(char)} ! * @see #isSpaceChar(char) ! * @see #isWhitespace(char) ! */ ! public static boolean isSpace(char ch) ! { ! // Performing the subtraction up front alleviates need to compare longs. ! return ch-- <= ' ' && ((1 << ch) ! & ((1 << (' ' - 1)) ! | (1 << ('\t' - 1)) ! | (1 << ('\n' - 1)) ! | (1 << ('\r' - 1)) ! | (1 << ('\f' - 1)))) != 0; ! } ! ! /** ! * Determines if a character is a Unicode space character. This includes ! * SPACE_SEPARATOR, LINE_SEPARATOR, and PARAGRAPH_SEPARATOR. ! *
    ! * Unicode space = [Zs]|[Zp]|[Zl] ! * ! * @param ch character to test ! * @return true if ch is a Unicode space, else false ! * @see #isWhitespace(char) ! * @since 1.1 ! */ ! public static boolean isSpaceChar(char ch) ! { ! return ((1 << getType(ch)) ! & ((1 << SPACE_SEPARATOR) ! | (1 << LINE_SEPARATOR) ! | (1 << PARAGRAPH_SEPARATOR))) != 0; ! } ! ! /** ! * Determines if a character is Java whitespace. This includes Unicode ! * space characters (SPACE_SEPARATOR, LINE_SEPARATOR, and ! * PARAGRAPH_SEPARATOR) except the non-breaking spaces ! * ('\u00A0', '\u2007', and '\u202F'); ! * and these characters: '\u0009', '\u000A', ! * '\u000B', '\u000C', '\u000D', ! * '\u001C', '\u001D', '\u001E', ! * and '\u001F'. ! *
    ! * Java whitespace = ([Zs] not Nb)|[Zl]|[Zp]|U+0009-U+000D|U+001C-U+001F ! * ! * @param ch character to test ! * @return true if ch is Java whitespace, else false ! * @see #isSpaceChar(char) ! * @since 1.1 ! */ ! public static boolean isWhitespace(char ch) ! { ! int attr = readChar(ch); ! return ((((1 << (attr & TYPE_MASK)) ! & ((1 << SPACE_SEPARATOR) ! | (1 << LINE_SEPARATOR) ! | (1 << PARAGRAPH_SEPARATOR))) != 0) ! && (attr & NO_BREAK_MASK) == 0) ! || (ch <= '\u001F' && ((1 << ch) ! & ((1 << '\t') ! | (1 << '\n') ! | (1 << '\u000B') ! | (1 << '\u000C') ! | (1 << '\r') ! | (1 << '\u001C') ! | (1 << '\u001D') ! | (1 << '\u001E') ! | (1 << '\u001F'))) != 0); ! } ! ! /** ! * Determines if a character has the ISO Control property. ! *
    ! * ISO Control = [Cc] ! * ! * @param ch character to test ! * @return true if ch is an ISO Control character, else false ! * @see #isSpaceChar(char) ! * @see #isWhitespace(char) ! * @since 1.1 ! */ ! public static boolean isISOControl(char ch) ! { ! return getType(ch) == CONTROL; ! } ! ! /** ! * Returns the Unicode general category property of a character. ! * ! * @param ch character from which the general category property will ! * be retrieved ! * @return the character category property of ch as an integer ! * @see #UNASSIGNED ! * @see #UPPERCASE_LETTER ! * @see #LOWERCASE_LETTER ! * @see #TITLECASE_LETTER ! * @see #MODIFIER_LETTER ! * @see #OTHER_LETTER ! * @see #NON_SPACING_MARK ! * @see #ENCLOSING_MARK ! * @see #COMBINING_SPACING_MARK ! * @see #DECIMAL_DIGIT_NUMBER ! * @see #LETTER_NUMBER ! * @see #OTHER_NUMBER ! * @see #SPACE_SEPARATOR ! * @see #LINE_SEPARATOR ! * @see #PARAGRAPH_SEPARATOR ! * @see #CONTROL ! * @see #FORMAT ! * @see #PRIVATE_USE ! * @see #SURROGATE ! * @see #DASH_PUNCTUATION ! * @see #START_PUNCTUATION ! * @see #END_PUNCTUATION ! * @see #CONNECTOR_PUNCTUATION ! * @see #OTHER_PUNCTUATION ! * @see #MATH_SYMBOL ! * @see #CURRENCY_SYMBOL ! * @see #MODIFIER_SYMBOL ! * @see #INITIAL_QUOTE_PUNCTUATION ! * @see #FINAL_QUOTE_PUNCTUATION ! * @since 1.1 ! */ ! public static native int getType(char ch); ! ! /** ! * Converts a digit into a character which represents that digit ! * in a specified radix. If the radix exceeds MIN_RADIX or MAX_RADIX, ! * or the digit exceeds the radix, then the null character '\0' ! * is returned. Otherwise the return value is in '0'-'9' and 'a'-'z'. ! *
    ! * return value boundary = U+0030-U+0039|U+0061-U+007A ! * ! * @param digit digit to be converted into a character ! * @param radix radix of digit ! * @return character representing digit in radix, or '\0' ! * @see #MIN_RADIX ! * @see #MAX_RADIX ! * @see #digit(char, int) ! */ ! public static char forDigit(int digit, int radix) ! { ! if (radix < MIN_RADIX || radix > MAX_RADIX || ! digit < 0 || digit >= radix) ! return '\0'; ! return (char) (digit < 10 ? ('0' + digit) : ('a' - 10 + digit)); ! } ! ! /** ! * Returns the Unicode directionality property of the character. This ! * is used in the visual ordering of text. ! * ! * @param ch the character to look up ! * @return the directionality constant, or DIRECTIONALITY_UNDEFINED ! * @see #DIRECTIONALITY_UNDEFINED ! * @see #DIRECTIONALITY_LEFT_TO_RIGHT ! * @see #DIRECTIONALITY_RIGHT_TO_LEFT ! * @see #DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC ! * @see #DIRECTIONALITY_EUROPEAN_NUMBER ! * @see #DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR ! * @see #DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR ! * @see #DIRECTIONALITY_ARABIC_NUMBER ! * @see #DIRECTIONALITY_COMMON_NUMBER_SEPARATOR ! * @see #DIRECTIONALITY_NONSPACING_MARK ! * @see #DIRECTIONALITY_BOUNDARY_NEUTRAL ! * @see #DIRECTIONALITY_PARAGRAPH_SEPARATOR ! * @see #DIRECTIONALITY_SEGMENT_SEPARATOR ! * @see #DIRECTIONALITY_WHITESPACE ! * @see #DIRECTIONALITY_OTHER_NEUTRALS ! * @see #DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING ! * @see #DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE ! * @see #DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING ! * @see #DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE ! * @see #DIRECTIONALITY_POP_DIRECTIONAL_FORMAT ! * @since 1.4 ! */ ! public static native byte getDirectionality(char ch); ! ! /** ! * Determines whether the character is mirrored according to Unicode. For ! * example, \u0028 (LEFT PARENTHESIS) appears as '(' in ! * left-to-right text, but ')' in right-to-left text. ! * ! * @param ch the character to look up ! * @return true if the character is mirrored ! * @since 1.4 ! */ ! public static boolean isMirrored(char ch) ! { ! return (readChar(ch) & MIRROR_MASK) != 0; ! } ! ! /** ! * Compares another Character to this Character, numerically. ! * ! * @param anotherCharacter Character to compare with this Character ! * @return a negative integer if this Character is less than ! * anotherCharacter, zero if this Character is equal, and ! * a positive integer if this Character is greater ! * @throws NullPointerException if anotherCharacter is null ! * @since 1.2 ! */ ! public int compareTo(Character anotherCharacter) ! { ! return value - anotherCharacter.value; ! } ! ! /** ! * Compares an object to this Character. Assuming the object is a ! * Character object, this method performs the same comparison as ! * compareTo(Character). ! * ! * @param o object to compare ! * @return the comparison value ! * @throws ClassCastException if o is not a Character object ! * @throws NullPointerException if o is null ! * @see #compareTo(Character) ! * @since 1.2 ! */ ! public int compareTo(Object o) ! { ! return compareTo((Character) o); ! } ! } // class Character diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Class.h gcc-3.1/libjava/java/lang/Class.h *** gcc-3.0.4/libjava/java/lang/Class.h Thu Jul 5 16:08:54 2001 --- gcc-3.1/libjava/java/lang/Class.h Fri Dec 21 19:47:50 2001 *************** details. */ *** 14,24 **** #pragma interface - #include #include #include #include #include // We declare these here to avoid including gcj/cni.h. extern "C" void _Jv_InitClass (jclass klass); --- 14,24 ---- #pragma interface #include #include #include #include + #include // We declare these here to avoid including gcj/cni.h. extern "C" void _Jv_InitClass (jclass klass); *************** enum *** 53,58 **** --- 53,59 ---- struct _Jv_Field; struct _Jv_VTable; union _Jv_word; + struct _Jv_ArrayVTable; struct _Jv_Constants { *************** struct _Jv_Constants *** 63,72 **** --- 64,83 ---- struct _Jv_Method { + // Method name. _Jv_Utf8Const *name; + // Method signature. _Jv_Utf8Const *signature; + // Access flags. _Jv_ushort accflags; + // Method's index in the vtable. + _Jv_ushort index; + // Pointer to underlying function. void *ncode; + // NULL-terminated list of exception class names; can be NULL if + // there are none such. + _Jv_Utf8Const **throws; + _Jv_Method *getNextMethod () { return this + 1; } }; *************** struct _Jv_ifaces *** 98,108 **** jshort count; }; ! // Used for vtable pointer manipulation. ! union _Jv_Self { ! char *vtable_ptr; ! jclass self; }; #define JV_PRIMITIVE_VTABLE ((_Jv_VTable *) -1) --- 109,125 ---- jshort count; }; ! struct _Jv_MethodSymbol { ! _Jv_Utf8Const *class_name; ! _Jv_Utf8Const *name; ! _Jv_Utf8Const *signature; ! }; ! ! struct _Jv_OffsetTable ! { ! jint state; ! jint offsets[]; }; #define JV_PRIMITIVE_VTABLE ((_Jv_VTable *) -1) *************** class java::lang::Class : public java::l *** 113,126 **** { public: static jclass forName (jstring className, jboolean initialize, ! java::lang::ClassLoader *loader); static jclass forName (jstring className); JArray *getClasses (void); ! java::lang::ClassLoader *getClassLoader (void) ! { ! return loader; ! } java::lang::reflect::Constructor *getConstructor (JArray *); JArray *getConstructors (void); --- 130,140 ---- { public: static jclass forName (jstring className, jboolean initialize, ! java::lang::ClassLoader *loader); static jclass forName (jstring className); JArray *getClasses (void); ! java::lang::ClassLoader *getClassLoader (void); java::lang::reflect::Constructor *getConstructor (JArray *); JArray *getConstructors (void); *************** private: *** 143,148 **** --- 157,163 ---- jint offset); java::lang::reflect::Field *getPrivateField (jstring); java::lang::reflect::Method *getPrivateMethod (jstring, JArray *); + java::security::ProtectionDomain *getProtectionDomain0 (); public: JArray *getFields (void); *************** public: *** 207,241 **** // This constructor is used to create Class object for the primitive // types. See prims.cc. ! Class (jobject cname, jbyte sig, jint len, jobject array_vtable) ! { ! using namespace java::lang::reflect; ! _Jv_Utf8Const *_Jv_makeUtf8Const (char *s, int len); ! ! // C++ ctors set the vtbl pointer to point at an offset inside the vtable ! // object. That doesn't work for Java, so this hack adjusts it back. ! ((_Jv_Self *)this)->vtable_ptr -= 2 * sizeof (void *); ! ! // We must initialize every field of the class. We do this in the ! // same order they are declared in Class.h, except for fields that ! // are initialized to NULL. ! name = _Jv_makeUtf8Const ((char *) cname, -1); ! accflags = Modifier::PUBLIC | Modifier::FINAL | Modifier::ABSTRACT; ! method_count = sig; ! size_in_bytes = len; ! vtable = JV_PRIMITIVE_VTABLE; ! state = JV_STATE_DONE; ! depth = -1; ! if (method_count != 'V') ! _Jv_NewArrayClass (this, NULL, (_Jv_VTable *) array_vtable); ! } static java::lang::Class class$; private: - Class (); - void checkMemberAccess (jint flags); void initializeClass (void); --- 222,233 ---- // This constructor is used to create Class object for the primitive // types. See prims.cc. ! Class (); static java::lang::Class class$; private: void checkMemberAccess (jint flags); void initializeClass (void); *************** private: *** 265,270 **** --- 257,263 ---- friend jobject _Jv_AllocObject (jclass, jint); friend void *_Jv_AllocObj (jint, jclass); + friend void *_Jv_AllocPtrFreeObj (jint, jclass); friend void *_Jv_AllocArray (jint, jclass); friend jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv *, jclass, jfieldID, *************** private: *** 287,292 **** --- 280,286 ---- friend void _Jv_WaitForState (jclass, int); friend void _Jv_RegisterClasses (jclass *classes); + friend void _Jv_RegisterClassHookDefault (jclass klass); friend void _Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*); friend void _Jv_UnregisterClass (jclass); friend jclass _Jv_FindClass (_Jv_Utf8Const *name, *************** private: *** 298,303 **** --- 292,301 ---- _Jv_VTable *array_vtable = 0); friend jclass _Jv_NewClass (_Jv_Utf8Const *name, jclass superclass, java::lang::ClassLoader *loader); + friend void _Jv_InitNewClassFields (jclass klass); + + // in prims.cc + friend void _Jv_InitPrimClass (jclass, char *, char, int, _Jv_ArrayVTable *); friend void _Jv_PrepareCompiledClass (jclass); friend void _Jv_PrepareConstantTimeTables (jclass); *************** private: *** 306,314 **** friend jstring _Jv_GetMethodString(jclass, _Jv_Utf8Const *); friend jshort _Jv_AppendPartialITable (jclass, jclass, void **, jshort); friend jshort _Jv_FindIIndex (jclass *, jshort *, jshort); // Return array class corresponding to element type KLASS, creating it if ! // neccessary. inline friend jclass _Jv_GetArrayClass (jclass klass, java::lang::ClassLoader *loader) { --- 304,316 ---- friend jstring _Jv_GetMethodString(jclass, _Jv_Utf8Const *); friend jshort _Jv_AppendPartialITable (jclass, jclass, void **, jshort); friend jshort _Jv_FindIIndex (jclass *, jshort *, jshort); + friend void _Jv_LinkOffsetTable (jclass); + friend void _Jv_LayoutVTableMethods (jclass klass); + friend void _Jv_SetVTableEntries (jclass, _Jv_VTable *); + friend void _Jv_MakeVTable (jclass); // Return array class corresponding to element type KLASS, creating it if ! // necessary. inline friend jclass _Jv_GetArrayClass (jclass klass, java::lang::ClassLoader *loader) { *************** private: *** 340,345 **** --- 342,349 ---- friend JV_MARKOBJ_DECL; #endif + friend class _Jv_BytecodeVerifier; + // Chain for class pool. jclass next; // Name of class. *************** private: *** 368,373 **** --- 372,381 ---- jshort static_field_count; // The vtbl for all objects of this class. _Jv_VTable *vtable; + // Virtual method offset table. + _Jv_OffsetTable *otable; + // Offset table symbols. + _Jv_MethodSymbol *otable_syms; // Interfaces implemented by this class. jclass *interfaces; // The class loader for this class. *************** private: *** 387,392 **** --- 395,402 ---- _Jv_IDispatchTable *idt; // Pointer to the class that represents an array of this class. jclass arrayclass; + // Security Domain to which this class belongs (or null). + java::security::ProtectionDomain *protectionDomain; }; #endif /* __JAVA_LANG_CLASS_H__ */ diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Class.java gcc-3.1/libjava/java/lang/Class.java *** gcc-3.0.4/libjava/java/lang/Class.java Sun May 6 14:08:26 2001 --- gcc-3.1/libjava/java/lang/Class.java Wed Apr 25 15:45:12 2001 *************** package java.lang; *** 12,17 **** --- 12,18 ---- import java.io.Serializable; import java.io.InputStream; import java.lang.reflect.*; + import java.security.*; /** * @author Tom Tromey *************** public final class Class implements Seri *** 90,95 **** --- 91,120 ---- private native Field[] _getFields (Field[] result, int offset); public native Field[] getFields () throws SecurityException; + /** + * Returns the Package in which this class is defined + * Returns null when this information is not available from the + * classloader of this class or when the classloader of this class + * is null. + * + * @since 1.2 + */ + public Package getPackage() + { + ClassLoader cl = getClassLoader(); + if (cl != null) + { + String name = getName(); + String pkg = ""; + int idx = name.lastIndexOf('.'); + if (idx >= 0) + pkg = name.substring(0, idx); + return cl.getPackage(pkg); + } + else + return null; + } + public native Class[] getInterfaces (); private final native void getSignature (StringBuffer buffer); *************** public final class Class implements Seri *** 156,161 **** --- 181,215 ---- public native Object newInstance () throws InstantiationException, IllegalAccessException; + // We need a native method to retrieve the protection domain, because we + // can't add fields to java.lang.Class that are accessible from Java. + private native ProtectionDomain getProtectionDomain0(); + + /** + * Returns the protection domain of this class. If the classloader + * did not record the protection domain when creating this class + * the unknown protection domain is returned which has a null + * code source and all permissions. + * + * @exception SecurityException if a security manager exists and the caller + * does not have RuntimePermission("getProtectionDomain"). + * + * @since 1.2 + */ + public ProtectionDomain getProtectionDomain() + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(ClassLoader.protectionDomainPermission); + + ProtectionDomain protectionDomain = getProtectionDomain0(); + + if (protectionDomain == null) + return ClassLoader.unknownProtectionDomain; + else + return protectionDomain; + } + public String toString () { if (isPrimitive ()) diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ClassCastException.java gcc-3.1/libjava/java/lang/ClassCastException.java *** gcc-3.0.4/libjava/java/lang/ClassCastException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/ClassCastException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class ClassCastException extends RuntimeException { public ClassCastException() ! { ! super(); ! } ! public ClassCastException(String msg) ! { ! super(msg); ! } } --- 1,83 ---- ! /* ClassCastException.java -- exception thrown when incorrectly trying to ! cast an object to a subclass it does not belong to. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. In this case ! * when incorrectly trying to cast an object to a subclass it does not ! * belong to. The following code generates a ClassCastException. ! *

    !  * Object o = new Vector();
    !  * String s = (String)o;
    !  * 
    ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class ClassCastException extends RuntimeException { + static final long serialVersionUID = -9223365651070458532L; + + /** + * Create an exception without a message. + */ public ClassCastException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public ClassCastException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ClassCircularityError.java gcc-3.1/libjava/java/lang/ClassCircularityError.java *** gcc-3.0.4/libjava/java/lang/ClassCircularityError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/ClassCircularityError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // ClassCircularityError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class ClassCircularityError extends LinkageError { ! public ClassCircularityError () ! { ! super (); ! } ! public ClassCircularityError (String msg) ! { ! super (msg); ! } } --- 1,76 ---- ! /* ClassCircularityError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * A ClassCircularityError is thrown when a circular dependency + * has been detected while initializing a class. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class ClassCircularityError extends LinkageError { ! static final long serialVersionUID = 1054362542914539689L; ! /** ! * Create an error without a message. ! */ ! public ClassCircularityError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public ClassCircularityError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ClassFormatError.java gcc-3.1/libjava/java/lang/ClassFormatError.java *** gcc-3.0.4/libjava/java/lang/ClassFormatError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/ClassFormatError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // ClassFormatError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class ClassFormatError extends LinkageError { ! public ClassFormatError () ! { ! super (); ! } ! public ClassFormatError (String msg) ! { ! super (msg); ! } } --- 1,75 ---- ! /* ClassFormatError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * A ClassFormatError is thrown when a Java Virtual Machine + * unable to read a class file because the file is corrupted or cannot be + * interpreted as a class file. + * + * @since JDK 1.0 + * + * @author Brian Jones + */ public class ClassFormatError extends LinkageError { ! static final long serialVersionUID = -8420114879011949195L; ! /** ! * Create an error without a message. ! */ ! public ClassFormatError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public ClassFormatError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ClassLoader.java gcc-3.1/libjava/java/lang/ClassLoader.java *** gcc-3.0.4/libjava/java/lang/ClassLoader.java Sun May 6 14:08:26 2001 --- gcc-3.1/libjava/java/lang/ClassLoader.java Fri Dec 7 23:34:12 2001 *************** import java.io.InputStream; *** 14,20 **** --- 14,27 ---- import java.io.IOException; import java.net.URL; import java.net.URLConnection; + import java.security.AllPermission; + import java.security.CodeSource; + import java.security.Permission; + import java.security.Permissions; + import java.security.Policy; + import java.security.ProtectionDomain; import java.util.Enumeration; + import java.util.HashMap; import java.util.Stack; /** *************** import java.util.Stack; *** 27,34 **** public abstract class ClassLoader { - static private ClassLoader system; private ClassLoader parent; public final ClassLoader getParent () { --- 34,41 ---- public abstract class ClassLoader { private ClassLoader parent; + private HashMap definedPackages = new HashMap(); public final ClassLoader getParent () { *************** public abstract class ClassLoader *** 38,46 **** public static ClassLoader getSystemClassLoader () { ! if (system == null) ! system = gnu.gcj.runtime.VMClassLoader.instance; ! return system; } /** --- 45,51 ---- public static ClassLoader getSystemClassLoader () { ! return gnu.gcj.runtime.VMClassLoader.instance; } /** *************** public abstract class ClassLoader *** 112,118 **** if (parent != null) return parent.loadClass (name, link); else ! c = system.findClass (name); } catch (ClassNotFoundException ex) { /* ignore, we'll try findClass */; } --- 117,123 ---- if (parent != null) return parent.loadClass (name, link); else ! c = gnu.gcj.runtime.VMClassLoader.instance.findClass (name); } catch (ClassNotFoundException ex) { /* ignore, we'll try findClass */; } *************** public abstract class ClassLoader *** 144,149 **** --- 149,176 ---- throw new ClassNotFoundException (name); } + // Protection Domain definitions + // FIXME: should there be a special protection domain used for native code? + + // The permission required to check what a classes protection domain is. + static final Permission protectionDomainPermission + = new RuntimePermission("getProtectionDomain"); + // The protection domain returned if we cannot determine it. + static ProtectionDomain unknownProtectionDomain; + // Protection domain to use when a class is defined without one specified. + static ProtectionDomain defaultProtectionDomain; + + static + { + Permissions permissions = new Permissions(); + permissions.add(new AllPermission()); + unknownProtectionDomain = new ProtectionDomain(null, permissions); + + CodeSource cs = new CodeSource(null, null); + defaultProtectionDomain = + new ProtectionDomain(cs, Policy.getPolicy().getPermissions(cs)); + } + /** * Defines a class, given the class-data. According to the JVM, this * method should not be used; instead use the variant of this method *************** public abstract class ClassLoader *** 165,173 **** protected final Class defineClass(byte[] data, int off, int len) throws ClassFormatError { ! return defineClass (null, data, off, len); } /** * Defines a class, given the class-data. This is preferable * over defineClass(byte[],off,len) since it is more --- 192,206 ---- protected final Class defineClass(byte[] data, int off, int len) throws ClassFormatError { ! return defineClass (null, data, off, len, defaultProtectionDomain); } + protected final Class defineClass(String name, byte[] data, int off, int len) + throws ClassFormatError + { + return defineClass (name, data, off, len, defaultProtectionDomain); + } + /** * Defines a class, given the class-data. This is preferable * over defineClass(byte[],off,len) since it is more *************** public abstract class ClassLoader *** 189,194 **** --- 222,228 ---- * @param data bytes in class file format. * @param off offset to start interpreting data. * @param len length of data in class file. + * @param protectionDomain security protection domain for the class. * @return the class defined. * @exception java.lang.ClassNotFoundException * @exception java.lang.LinkageError *************** public abstract class ClassLoader *** 196,202 **** protected final synchronized Class defineClass(String name, byte[] data, int off, ! int len) throws ClassFormatError { if (data==null || data.length < off+len || off<0 || len<0) --- 230,237 ---- protected final synchronized Class defineClass(String name, byte[] data, int off, ! int len, ! ProtectionDomain protectionDomain) throws ClassFormatError { if (data==null || data.length < off+len || off<0 || len<0) *************** public abstract class ClassLoader *** 209,222 **** + name + " already loaded"); try { // Since we're calling into native code here, // we better make sure that any generated // exception is to spec! ! return defineClass0 (name, data, off, len); ! } catch (ClassFormatError x) { throw x; // rethrow } catch (java.lang.VirtualMachineError x) { --- 244,260 ---- + name + " already loaded"); + if (protectionDomain == null) + protectionDomain = defaultProtectionDomain; + try { // Since we're calling into native code here, // we better make sure that any generated // exception is to spec! ! return defineClass0 (name, data, off, len, protectionDomain); ! } catch (LinkageError x) { throw x; // rethrow } catch (java.lang.VirtualMachineError x) { *************** public abstract class ClassLoader *** 236,242 **** private native Class defineClass0 (String name, byte[] data, int off, ! int len) throws ClassFormatError; /** --- 274,281 ---- private native Class defineClass0 (String name, byte[] data, int off, ! int len, ! ProtectionDomain protectionDomain) throws ClassFormatError; /** *************** public abstract class ClassLoader *** 299,304 **** --- 338,454 ---- * be called when the caller has the lock on the class object. */ private static native void markClassErrorState0(Class clazz); + /** + * Defines a new package and creates a Package object. + * The package should be defined before any class in the package is + * defined with defineClass(). The package should not yet + * be defined before in this classloader or in one of its parents (which + * means that getPackage() should return null). + * All parameters except the name of the package may be + * null. + *

    + * Subclasses should call this method from their findClass() + * implementation before calling defineClass() on a Class + * in a not yet defined Package (which can be checked by calling + * getPackage()). + * + * @param name The name of the Package + * @param specTitle The name of the specification + * @param specVendor The name of the specification designer + * @param specVersion The version of this specification + * @param implTitle The name of the implementation + * @param implVendor The vendor that wrote this implementation + * @param implVersion The version of this implementation + * @param sealed If sealed the origin of the package classes + * @return the Package object for the specified package + * + * @exception IllegalArgumentException if the package name is null or if + * it was already defined by this classloader or one of its parents. + * + * @see Package + * @since 1.2 + */ + protected Package definePackage(String name, + String specTitle, String specVendor, + String specVersion, String implTitle, + String implVendor, String implVersion, + URL sealed) + { + if (getPackage(name) != null) + throw new IllegalArgumentException("Package " + name + + " already defined"); + Package p = new Package(name, + specTitle, specVendor, specVersion, + implTitle, implVendor, implVersion, + sealed); + synchronized (definedPackages) + { + definedPackages.put(name, p); + } + return p; + } + + /** + * Returns the Package object for the requested package name. It returns + * null when the package is not defined by this classloader or one of its + * parents. + * + * @since 1.2 + */ + protected Package getPackage(String name) + { + Package p; + if (parent == null) + // XXX - Should we use the bootstrap classloader? + p = null; + else + p = parent.getPackage(name); + + if (p == null) + { + synchronized (definedPackages) + { + p = (Package) definedPackages.get(name); + } + } + + return p; + } + + /** + * Returns all Package objects defined by this classloader and its parents. + * + * @since 1.2 + */ + protected Package[] getPackages() + { + Package[] allPackages; + + // Get all our packages. + Package[] packages; + synchronized(definedPackages) + { + packages = new Package[definedPackages.size()]; + definedPackages.values().toArray(packages); + } + + // If we have a parent get all packages defined by our parents. + if (parent != null) + { + Package[] parentPackages = parent.getPackages(); + allPackages = new Package[parentPackages.length + packages.length]; + System.arraycopy(parentPackages, 0, allPackages, 0, + parentPackages.length); + System.arraycopy(packages, 0, allPackages, parentPackages.length, + packages.length); + } + else + // XXX - Should we use the bootstrap classloader? + allPackages = packages; + + return allPackages; + } + /** * Returns a class found in a system-specific way, typically * via the java.class.path system property. Loads the *************** public abstract class ClassLoader *** 312,318 **** protected final Class findSystemClass(String name) throws java.lang.ClassNotFoundException { ! return getSystemClassLoader ().loadClass (name); } /* --- 462,468 ---- protected final Class findSystemClass(String name) throws java.lang.ClassNotFoundException { ! return gnu.gcj.runtime.VMClassLoader.instance.loadClass (name); } /* diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ClassNotFoundException.java gcc-3.1/libjava/java/lang/ClassNotFoundException.java *** gcc-3.0.4/libjava/java/lang/ClassNotFoundException.java Fri Oct 27 10:33:46 2000 --- gcc-3.1/libjava/java/lang/ClassNotFoundException.java Tue Jan 22 22:40:16 2002 *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; diff -Nrc3pad gcc-3.0.4/libjava/java/lang/CloneNotSupportedException.java gcc-3.1/libjava/java/lang/CloneNotSupportedException.java *** gcc-3.0.4/libjava/java/lang/CloneNotSupportedException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/CloneNotSupportedException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class CloneNotSupportedException extends Exception { public CloneNotSupportedException() { - super(); } ! public CloneNotSupportedException(String msg) { ! super(msg); } } --- 1,88 ---- ! /* CloneNotSupportedException.java -- exception thrown to indicate that ! the object calling the clone method of Object does not implement the ! Cloneable interface. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Thrown to indicate an object should not or could not be cloned. This ! * includes the case when {@link Object#clone()} is called on an object ! * which does not implement the {@link Cloneable} interface. ! *

    ! * ! * Notice that calling clone() on an array will never produce ! * this exception, as the VM will always succeed in copying the array, or ! * cause an OutOfMemoryError first. ! * ! * @author Brian Jones ! * @author Warren Levy ! * @author Eric Blake ! * @since 1.0 ! * @see Cloneable ! * @see Object#clone() ! */ public class CloneNotSupportedException extends Exception { + /** + * compatible with JDK 1.0+ + */ + private static final long serialVersionUID = 5195511250079656443L; + + /** + * Create an exception without a message. + */ public CloneNotSupportedException() { } ! /** ! * Create an exception with a message. ! * @param s the error message ! */ ! public CloneNotSupportedException(String s) { ! super(s); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Cloneable.java gcc-3.1/libjava/java/lang/Cloneable.java *** gcc-3.0.4/libjava/java/lang/Cloneable.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Cloneable.java Tue Jan 22 22:40:16 2002 *************** *** 1,23 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public interface Cloneable { } --- 1,87 ---- ! /* Cloneable.java -- Interface for marking objects cloneable by Object.clone() ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This interface should be implemented by classes wishing to ! * support of override Object.clone(). The default ! * behaviour of clone() performs a shallow copy, but ! * subclasses often change this to perform a deep copy. Therefore, ! * it is a good idea to document how deep your clone will go. ! * If clone() is called on an object which does not ! * implement this interface, a CloneNotSupportedException ! * will be thrown. ! *

    ! * ! * This interface is simply a tagging interface; it carries no ! * requirements on methods to implement. However, it is typical for ! * a Cloneable class to implement at least equals, ! * hashCode, and clone, sometimes ! * increasing the accessibility of clone to be public. The typical ! * implementation of clone invokes super.clone() ! * rather than a constructor, but this is not a requirement. ! *

    ! * ! * If an object that implement Cloneable should not be cloned, ! * simply override the clone method to throw a ! * CloneNotSupportedException. ! *

    ! * ! * All array types implement Cloneable, and have a public ! * clone method that will never fail with a ! * CloneNotSupportedException. ! * ! * @since 1.0 ! * @author Paul Fisher ! * @author Eric Blake ! * @author Warren Levy ! * ! * @see Object#clone() ! * @see CloneNotSupportedException ! */ public interface Cloneable { + // Tagging interface only. } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Comparable.java gcc-3.1/libjava/java/lang/Comparable.java *** gcc-3.0.4/libjava/java/lang/Comparable.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Comparable.java Tue Jan 22 22:40:16 2002 *************** *** 1,22 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 8, 1998. ! */ /* Written using online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public interface Comparable { ! public int compareTo(Object o) throws ClassCastException; } --- 1,69 ---- ! /* Comparable.java -- Interface for comparaing objects to obtain an ordering ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Interface for objects that can be ordering among other ! * objects. The ordering can be total, such that two objects ! * only compare equal if they are equal by the equals method, or ! * partial such that this is not necessarily true. For ! * example, a case-sensitive dictionary order comparison of Strings ! * is total, but if it is case-insensitive it is partial, because ! * "abc" and "ABC" compare as equal even though "abc".equals("ABC") ! * returns false. ! * ! * @author Geoff Berry ! * @author Warren Levy ! * ! * @since JDK1.2 ! * @see java.util.Comparator ! */ public interface Comparable { ! /** ! * @return a negative integer if this object is less than ! * o, zero if this object is equal to o, or ! * a positive integer if this object is greater than o ! */ ! int compareTo( Object o ); } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Compiler.java gcc-3.1/libjava/java/lang/Compiler.java *** gcc-3.0.4/libjava/java/lang/Compiler.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Compiler.java Tue Jan 22 22:40:16 2002 *************** *** 1,53 **** ! // Compiler.java - Control byte->machine code compiler. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.lang; ! /** ! * @author Tom Tromey ! * @date October 23, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 */ ! public final class Compiler { ! public static Object command (Object arg) { - // Our implementation defines this to a no-op. - return null; } ! public static boolean compileClass (Class oneClass) { ! // Never succeed. ! return false; } ! ! public static boolean compileClasses (String classNames) { ! // Note the incredibly lame interface. Always fail. ! return false; } ! public static void disable () { } ! public static void enable () ! { ! } ! // Don't allow new `Compiler's to be made. ! private Compiler () ! { ! } } --- 1,122 ---- ! /* Compiler.java -- Interface for implementing a method to override ! Object.clone()comparaing objects to obtain an ordering ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.lang; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 */ ! /** ! * The Compiler class is a place holder for a JIT ! * compiler implementation does nothing unless there is such a ! * compiler by default. ! *

    ! * The system property java.compiler may contain the name ! * of a library to load with System.loadLibrary when the ! * virtual machine first starts. If so and loading the library succeeds, ! * then a function by the name of java_lang_Compiler_start() ! * in that library is called. ! * ! * Note that a VM might not have implemented any of this. ! * ! * @author Tom Tromey ! * ! * @since JDK 1.0 ! * @see System#getProperty(java.lang.String) ! * @see System#getProperty(java.lang.String,java.lang.String) ! * @see System#loadLibrary(java.lang.String) ! */ ! public final class Compiler { ! /** ! * Don't allow new `Compiler's to be made. ! */ ! private Compiler () { } ! /** ! * Compile the class named by oneClass. ! * ! * @param oneClass the class to compile ! * @return false if no compiler is available or ! * compilation failed and true if compilation succeeded. ! */ ! public static boolean compileClass (Class oneClass) { ! // Never succeed. ! return false; } ! ! /** ! * Compile the classes whose name matches classNames/code>. ! * ! * @param classNames the name of classes to compile ! * @return false if no compiler is available or ! * compilation failed and true if compilation succeeded. ! */ ! public static boolean compileClasses (String classNames) { ! // Note the incredibly lame interface. Always fail. ! return false; } ! /** ! * This method examines the argument and performs an operation ! * according to the compilers documentation. No specific operation ! * is required. ! */ ! public static Object command (Object arg) { + // Our implementation defines this to a no-op. + return null; } ! /** ! * Calling Compiler.enable() will cause the compiler ! * to resume operation if it was previously disabled. ! */ ! public static void enable () { } ! /** ! * Calling Compiler.disable() will cause the compiler ! * to be suspended. ! */ ! public static void disable () { } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Double.java gcc-3.1/libjava/java/lang/Double.java *** gcc-3.0.4/libjava/java/lang/Double.java Fri Feb 9 22:13:33 2001 --- gcc-3.1/libjava/java/lang/Double.java Tue Jan 22 22:40:16 2002 *************** *** 1,165 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! /** ! * @author Andrew Haley ! * @date September 25, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public final class Double extends Number implements Comparable { public static final double MIN_VALUE = 5e-324; public static final double MAX_VALUE = 1.7976931348623157e+308; public static final double NEGATIVE_INFINITY = -1.0d/0.0d; public static final double POSITIVE_INFINITY = 1.0d/0.0d; public static final double NaN = 0.0d/0.0d; ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = double.class; ! private double value; private static final long serialVersionUID = -9172774392245257468L; ! public native static double parseDouble (String s) ! throws NumberFormatException; ! public Double (double v) { ! value = v; } public Double (String s) throws NumberFormatException { ! value = valueOf (s).doubleValue (); } public String toString () { return toString (value); } public boolean equals (Object obj) { if (!(obj instanceof Double)) return false; ! Double d = (Double) obj; ! return doubleToLongBits (value) == doubleToLongBits (d.doubleValue ()); } public int hashCode () { long v = doubleToLongBits (value); return (int) (v ^ (v >>> 32)); } public int intValue () { return (int) value; } public long longValue () { return (long) value; } public float floatValue () { return (float) value; } public double doubleValue () { return value; } ! public byte byteValue () ! { ! return (byte) value; ! } ! ! public short shortValue () ! { ! return (short) value; ! } ! ! native static String toString (double v, boolean isFloat); ! ! public static String toString (double v) ! { ! return toString (v, false); ! } ! public static Double valueOf (String s) throws NumberFormatException { ! return new Double (parseDouble (s)); } public boolean isNaN () { return isNaN (value); } public static boolean isNaN (double v) { ! long bits = doubleToLongBits (v); ! long e = bits & 0x7ff0000000000000L; ! long f = bits & 0x000fffffffffffffL; ! ! return e == 0x7ff0000000000000L && f != 0L; } public boolean isInfinite () { return isInfinite (value); } public static boolean isInfinite (double v) { ! long bits = doubleToLongBits (v); ! long f = bits & 0x7fffffffffffffffL; ! ! return f == 0x7ff0000000000000L; } ! public static native long doubleToLongBits (double value); ! public static native long doubleToRawLongBits (double value); ! public static native double longBitsToDouble (long bits); ! public int compareTo (Double d) { ! double v = d.value; ! if (isNaN (value)) ! return isNaN (v) ? 1 : 0; ! else if (isNaN (v)) ! return -1; ! else if (value == 0.0 && v == -0.0) ! return 1; ! else if (value == -0.0 && v == 0.0) return -1; ! else if (value == v) return 0; ! return value > v ? 1 : -1; } public int compareTo (Object o) { return compareTo ((Double) o); } } --- 1,528 ---- ! /* Double.java -- object wrapper for double primitive ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! import gnu.classpath.Configuration; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * Instances of class Double represent primitive + * double values. + * + * Additionally, this class provides various helper functions and variables + * related to doubles. + * + * @author Paul Fisher + * @author Andrew Haley + * @since JDK 1.0 + */ public final class Double extends Number implements Comparable { + /** + * The minimum positive value a double may represent + * is 5e-324. + */ public static final double MIN_VALUE = 5e-324; + + /** + * The maximum positive value a double may represent + * is 1.7976931348623157e+308. + */ public static final double MAX_VALUE = 1.7976931348623157e+308; + + /** + * The value of a double representation -1.0/0.0, negative + * infinity. + */ public static final double NEGATIVE_INFINITY = -1.0d/0.0d; + + /** + * The value of a double representing 1.0/0.0, positive infinity. + */ public static final double POSITIVE_INFINITY = 1.0d/0.0d; + + /** + * All IEEE 754 values of NaN have the same value in Java. + */ public static final double NaN = 0.0d/0.0d; ! /** ! * The primitive type double is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass('D'); ! /** ! * The immutable value of this Double. ! */ ! private final double value; private static final long serialVersionUID = -9172774392245257468L; ! /** ! * Load native routines necessary for this class. ! */ ! static ! { ! if (Configuration.INIT_LOAD_LIBRARY) ! { ! System.loadLibrary ("javalang"); ! initIDs (); ! } ! } ! /** ! * Create a Double from the primitive double ! * specified. ! * ! * @param value the double argument ! */ ! public Double (double value) { ! this.value = value; } + /** + * Create a Double from the specified + * String. + * + * This method calls Double.parseDouble(). + * + * @exception NumberFormatException when the String cannot + * be parsed into a Float. + * @param s the String to convert + * @see #parseDouble(java.lang.String) + */ public Double (String s) throws NumberFormatException { ! value = parseDouble (s); } + /** + * Convert the double value of this Double + * to a String. This method calls + * Double.toString(double) to do its dirty work. + * + * @return the String representation of this Double. + * @see #toString(double) + */ public String toString () { return toString (value); } + /** + * If the Object is not null, is an + * instanceof Double, and represents + * the same primitive double value return + * true. Otherwise false is returned. + *

    + * Note that there are two differences between == and + * equals(). 0.0d == -0.0d returns true + * but new Double(0.0d).equals(new Double(-0.0d)) returns + * false. And Double.NaN == Double.NaN returns + * false, but + * new Double(Double.NaN).equals(new Double(Double.NaN)) returns + * true. + * + * @param obj the object to compare to + * @return whether the objects are semantically equal. + */ public boolean equals (Object obj) { if (!(obj instanceof Double)) return false; ! double d = ((Double) obj).value; ! // GCJ LOCAL: this implementation is probably faster than ! // Classpath's, especially once we inline doubleToLongBits. ! return doubleToLongBits (value) == doubleToLongBits (d); ! // END GCJ LOCAL } + /** + * The hashcode is the value of the expression:
    + *
    + * (int)(v^(v>>>32))
    + *
    + * where v is defined by:
    + * long v = Double.doubleToLongBits(this.longValue());
    + */ public int hashCode () { long v = doubleToLongBits (value); return (int) (v ^ (v >>> 32)); } + /** + * Return the value of this Double when cast to an + * int. + */ public int intValue () { return (int) value; } + /** + * Return the value of this Double when cast to a + * long. + */ public long longValue () { return (long) value; } + /** + * Return the value of this Double when cast to a + * float. + */ public float floatValue () { return (float) value; } + /** + * Return the primitive double value represented by this + * Double. + */ public double doubleValue () { return value; } ! /** ! * Return the result of calling new Double(java.lang.String). ! * ! * @param s the String to convert to a Double. ! * @return a new Double representing the String's ! * numeric value. ! * ! * @exception NullPointerException thrown if String is ! * null. ! * @exception NumberFormatException thrown if String cannot ! * be parsed as a double. ! * @see #Double(java.lang.String) ! * @see #parseDouble(java.lang.String) ! */ public static Double valueOf (String s) throws NumberFormatException { ! return new Double (s); } + /** + * Return true if the value of this Double + * is the same as NaN, otherwise return false. + * @return whether this Double is NaN. + */ public boolean isNaN () { return isNaN (value); } + /** + * Return true if the double has the same + * value as NaN, otherwise return false. + * + * @param v the double to compare + * @return whether the argument is NaN. + */ public static boolean isNaN (double v) { ! // This works since NaN != NaN is the only reflexive inequality ! // comparison which returns true. ! return v != v; } + /** + * Return true if the value of this Double + * is the same as NEGATIVE_INFINITY or + * POSITIVE_INFINITY, otherwise return false. + * + * @return whether this Double is (-/+) infinity. + */ public boolean isInfinite () { return isInfinite (value); } + /** + * Return true if the double has a value + * equal to either NEGATIVE_INFINITY or + * POSITIVE_INFINITY, otherwise return false. + * + * @param v the double to compare + * @return whether the argument is (-/+) infinity. + */ public static boolean isInfinite (double v) { ! return (v == POSITIVE_INFINITY || v == NEGATIVE_INFINITY); } ! /** ! * Returns 0 if the double value of the argument is ! * equal to the value of this Double. Returns a number ! * less than zero if the value of this Double is less ! * than the double value of the argument, and returns a ! * number greater than zero if the value of this Double ! * is greater than the double value of the argument. ! *
    ! * Double.NaN is greater than any number other than itself, ! * even Double.POSITIVE_INFINITY. ! *
    ! * 0.0d is greater than -0.0d. ! * ! * @param d the Double to compare to. ! * @return 0 if the Doubles are the same, < 0 if this ! * Double is less than the Double in ! * in question, or > 0 if it is greater. ! * @since 1.2 ! */ public int compareTo (Double d) { ! return compare (value, d.value); ! } ! ! /** ! * Returns 0 if the first argument is equal to the second argument. ! * Returns a number less than zero if the first argument is less than the ! * second argument, and returns a number greater than zero if the first ! * argument is greater than the second argument. ! *
    ! * Double.NaN is greater than any number other than itself, ! * even Double.POSITIVE_INFINITY. ! *
    ! * 0.0d is greater than -0.0d. ! * ! * @param x the first double to compare. ! * @param y the second double to compare. ! * @return 0 if the arguments are the same, < 0 if the ! * first argument is less than the second argument in ! * in question, or > 0 if it is greater. ! * @since 1.4 ! */ ! public static int compare (double x, double y) ! { ! if (isNaN (x)) ! return isNaN (y) ? 0 : 1; ! if (isNaN (y)) return -1; ! // recall that 0.0 == -0.0, so we convert to infinites and try again ! if (x == 0 && y == 0) ! return (int) (1 / x - 1 / y); ! if (x == y) return 0; ! return x > y ? 1 : -1; } + /** + * Compares the specified Object to this Double + * if and only if the Object is an instanceof + * Double. + * + * @param o the Object to compare to. + * @return 0 if the Doubles are the same, < 0 if this + * Double is less than the Double in + * in question, or > 0 if it is greater. + * @throws ClassCastException if the argument is not a Double + */ public int compareTo (Object o) { return compareTo ((Double) o); } + + /** + * Convert the double to a String. + *

    + * + * Floating-point string representation is fairly complex: here is a + * rundown of the possible values. "[-]" indicates that a + * negative sign will be printed if the value (or exponent) is negative. + * "<number>" means a string of digits (0-9). + * "<digit>" means a single digit (0-9). + *

    + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Value of FloatString Representation
    [+-] 0[-]0.0
    Between [+-] 10-3 and 107[-]number.number
    Other numeric value[-]<digit>.<number>E[-]<number>
    [+-] infinity[-]Infinity
    NaNNaN
    + * + * Yes, negative zero is a possible value. Note that there is + * always a . and at least one digit printed after + * it: even if the number is 3, it will be printed as 3.0. + * After the ".", all digits will be printed except trailing zeros. No + * truncation or rounding is done by this function. + * + * + * @XXX specify where we are not in accord with the spec. + * + * @param d the double to convert + * @return the String representing the double. + */ + public static String toString (double d) + { + return toString (d, false); + } + + static native String toString (double d, boolean isFloat); + + /** + * Return the long bits of the specified double. + * The result of this function can be used as the argument to + * Double.longBitsToDouble(long) to obtain the + * original double value. + * + * @param value the double to convert + * @return the bits of the double. + */ + public static native long doubleToLongBits (double value); + + /** + * Return the long bits of the specified double. + * The result of this function can be used as the argument to + * Double.longBitsToDouble(long) to obtain the + * original double value. This method differs from + * doubleToLongBits in that it does not collapse + * NaN values. + * + * @param value the double to convert + * @return the bits of the double. + */ + public static native long doubleToRawLongBits (double value); + + /** + * Return the double represented by the long + * bits specified. + * + * @param bits the long bits representing a double + * @return the double represented by the bits. + */ + public static native double longBitsToDouble (long bits); + + /** + * Parse the specified String as a double. + * + * The number is really read as n * 10exponent. The + * first number is n, and if there is an "E" + * ("e" is also acceptable), then the integer after that is + * the exponent. + *

    + * Here are the possible forms the number can take: + *
    + * + * + * + * + * + * + *
    FormExamples
    [+-]<number>[.]345., -10, 12
    [+-]<number>.<number>40.2, 80.00, -12.30
    [+-]<number>[.]E[+-]<number>80E12, -12e+7, 4.E-123
    [+-]<number>.<number>E[+-]<number>6.02e-22, -40.2E+6, 12.3e9
    + * + * "[+-]" means either a plus or minus sign may go there, or + * neither, in which case + is assumed. + *
    + * "[.]" means a dot may be placed here, but is optional. + *
    + * "<number>" means a string of digits (0-9), basically + * an integer. "<number>.<number>" is basically + * a real number, a floating-point value. + *

    + * + * Remember that a double has a limited range. If the + * number you specify is greater than Double.MAX_VALUE or less + * than -Double.MAX_VALUE, it will be set at + * Double.POSITIVE_INFINITY or + * Double.NEGATIVE_INFINITY, respectively. + *

    + * Note also that double does not have perfect precision. Many + * numbers cannot be precisely represented. The number you specify + * will be rounded to the nearest representable value. + * Double.MIN_VALUE is the margin of error for + * double values. + *

    + * If an unexpected character is found in the String, a + * NumberFormatException will be thrown. Spaces are not + * allowed, and will cause the same exception. + * + * @XXX specify where/how we are not in accord with the spec. + * + * @param str the String to convert + * @return the value of the String as a double. + * @exception NumberFormatException when the string cannot be parsed to a + * double. + * @exception NullPointerException when the string is null. + * @see #MIN_VALUE + * @see #MAX_VALUE + * @see #POSITIVE_INFINITY + * @see #NEGATIVE_INFINITY + * @since 1.2 + */ + public static native double parseDouble (String s) + throws NumberFormatException; + + /** + * Initialize JNI cache. This method is called only by the + * static initializer when using JNI. + */ + private static native void initIDs (); } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Error.java gcc-3.1/libjava/java/lang/Error.java *** gcc-3.0.4/libjava/java/lang/Error.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Error.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // Error.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class Error extends Throwable { ! public Error () ! { ! super (); ! } ! public Error (String msg) ! { ! super (msg); ! } } --- 1,82 ---- ! /* Error.java - Indication of fatal abnormal conditions ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * Applications should not try to catch errors since they indicate + * abnormal conditions. An abnormal condition is something which should not + * occur. A few errors, like ThreadDeath error do normally + * occur, but most applications should not catch it. + *

    + * A method is not required to declare any subclass of Error in + * its throws clause which might be thrown but not caught while + * executing the method.. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class Error extends Throwable { ! static final long serialVersionUID = 4980196508277280342L; ! /** ! * Create an error without a message. ! */ ! public Error() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public Error(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Exception.java gcc-3.1/libjava/java/lang/Exception.java *** gcc-3.0.4/libjava/java/lang/Exception.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Exception.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class Exception extends Throwable { public Exception() ! { ! super(); ! } ! public Exception(String msg) ! { ! super(msg); ! } } --- 1,78 ---- ! /* Exception.java -- generic exception thrown to indicate an exceptional ! condition has occurred. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with the cause of the exception, such as ! * mouse movements, keyboard clicking, etc. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class Exception extends Throwable { + static final long serialVersionUID = -3387516993124229948L; + + /** + * Create an exception without a message. + */ public Exception() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public Exception(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ExceptionInInitializerError.java gcc-3.1/libjava/java/lang/ExceptionInInitializerError.java *** gcc-3.0.4/libjava/java/lang/ExceptionInInitializerError.java Mon Mar 12 07:46:41 2001 --- gcc-3.1/libjava/java/lang/ExceptionInInitializerError.java Tue Jan 22 22:40:16 2002 *************** *** 1,85 **** ! // ExceptionInInitializerError.java ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.lang; import java.io.PrintStream; import java.io.PrintWriter; - /** - * @author Tom Tromey - * @date October 1, 1998 - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class ExceptionInInitializerError extends LinkageError { ! public ExceptionInInitializerError () ! { ! super (); ! exception = null; ! } ! public ExceptionInInitializerError (String msg) ! { ! super (msg); ! exception = null; ! } ! public ExceptionInInitializerError (Throwable e) ! { ! super (e.toString()); ! exception = e; ! } ! public Throwable getException () ! { ! return exception; ! } ! public void printStackTrace () ! { ! if (exception != null) ! { ! System.err.print (this.getClass().getName() + ": "); ! exception.printStackTrace (); ! } ! else ! super.printStackTrace (); ! } ! public void printStackTrace (PrintStream ps) ! { ! if (exception != null) ! { ! ps.print (this.getClass().getName() + ": "); ! exception.printStackTrace (ps); ! } ! else ! super.printStackTrace (ps); ! } ! public void printStackTrace (PrintWriter pw) ! { ! if (exception != null) ! { ! pw.print (this.getClass().getName() + ": "); ! exception.printStackTrace (pw); ! } ! else ! super.printStackTrace (pw); ! } ! // The exception that caused this error. ! private Throwable exception; } --- 1,155 ---- ! /* ExceptionInInitializerError.java ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; + import java.io.PrintStream; import java.io.PrintWriter; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * An ExceptionInInitializerError is thrown when an + * unexpected exception has occurred in a static initializer or the + * initializer for a static variable. + * + * @since JDK 1.1 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class ExceptionInInitializerError extends LinkageError { ! static final long serialVersionUID = 1521711792217232256L; ! private Throwable exception = null; ! /** ! * Create an error without a message. ! */ ! public ExceptionInInitializerError() ! { ! super(); ! } ! /** ! * Create an error with a message. ! */ ! public ExceptionInInitializerError(String s) ! { ! super(s); ! } ! /** ! * Creates an error an saves a reference to the Throwable ! * object. ! * ! * @param t the exception thrown ! */ ! public ExceptionInInitializerError(Throwable t) ! { ! super(t.toString()); ! exception = t; ! } ! /** ! * Return the exception that caused this error to be created. ! * @return the stored Throwable object or null ! * if this ExceptionInInitializerError has no stored ! * Throwable object. ! */ ! public Throwable getException() ! { ! return exception; ! } ! /** ! * Print a stack trace of the exception that occurred. ! */ ! public void printStackTrace() ! { ! if (exception == null) ! { ! super.printStackTrace(); ! } ! else ! { ! System.err.print(this.getClass() + ": "); ! exception.printStackTrace(); ! } ! } ! /** ! * Print a stack trace of the exception that occurred to ! * the specified PrintStream. ! */ ! public void printStackTrace(PrintStream ps) ! { ! if (exception == null) ! { ! super.printStackTrace(ps); ! } ! else ! { ! ps.print(this.getClass() + ": "); ! exception.printStackTrace(ps); ! } ! } ! ! /** ! * Print a stack trace of the exception that occurred to ! * the specified PrintWriter. ! */ ! public void printStackTrace(PrintWriter pw) ! { ! if (exception == null) ! { ! super.printStackTrace(pw); ! } ! else ! { ! pw.print(this.getClass() + ": "); ! exception.printStackTrace(pw); ! } ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Float.java gcc-3.1/libjava/java/lang/Float.java *** gcc-3.0.4/libjava/java/lang/Float.java Fri Feb 9 22:13:33 2001 --- gcc-3.1/libjava/java/lang/Float.java Tue Jan 22 22:40:16 2002 *************** *** 1,54 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! /** ! * @author Andrew Haley ! * @date September 25, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public final class Float extends Number implements Comparable { public static final float MAX_VALUE = 3.4028235e+38f; public static final float MIN_VALUE = 1.4e-45f; public static final float NEGATIVE_INFINITY = -1.0f/0.0f; public static final float POSITIVE_INFINITY = 1.0f/0.0f; public static final float NaN = 0.0f/0.0f; ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = float.class; ! private float value; private static final long serialVersionUID = -2671257302660747028L; public Float (float value) { this.value = value; } public Float (double value) { this.value = (float)value; } public Float (String s) throws NumberFormatException { ! this.value = valueOf (s).floatValue (); } public static float parseFloat (String s) throws NumberFormatException { // The spec says that parseFloat() should work like --- 1,205 ---- ! /* java.lang.Float ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! import gnu.classpath.Configuration; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * Instances of class Float represent primitive + * float values. + * + * Additionally, this class provides various helper functions and variables + * related to floats. + * + * @author Paul Fisher + * @author Andrew Haley + * @since JDK 1.0 + */ public final class Float extends Number implements Comparable { + /** + * The maximum positive value a double may represent + * is 3.4028235e+38f. + */ public static final float MAX_VALUE = 3.4028235e+38f; + + /** + * The minimum positive value a float may represent + * is 1.4e-45. + */ public static final float MIN_VALUE = 1.4e-45f; + + /** + * The value of a float representation -1.0/0.0, negative infinity. + */ public static final float NEGATIVE_INFINITY = -1.0f/0.0f; + + /** + * The value of a float representation 1.0/0.0, positive infinity. + */ public static final float POSITIVE_INFINITY = 1.0f/0.0f; + + /** + * All IEEE 754 values of NaN have the same value in Java. + */ public static final float NaN = 0.0f/0.0f; ! /** ! * The primitive type float is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass('F'); ! /** ! * The immutable value of this Float. ! */ ! private final float value; private static final long serialVersionUID = -2671257302660747028L; + static + { + if (Configuration.INIT_LOAD_LIBRARY) + { + System.loadLibrary ("javalang"); + } + } + + /** + * Create a float from the primitive Float + * specified. + * + * @param value the Float argument + */ public Float (float value) { this.value = value; } + /** + * Create a Float from the primitive double + * specified. + * + * @param value the double argument + */ public Float (double value) { this.value = (float)value; } + /** + * Create a Float from the specified String. + * + * This method calls Float.parseFloat(). + * + * @exception NumberFormatException when the String cannot + * be parsed into a Float. + * @param s the String to convert + * @see #parseFloat(java.lang.String) + */ public Float (String s) throws NumberFormatException { ! this.value = parseFloat (s); } + /** + * Parse the specified String as a float. + * + * The number is really read as n * 10exponent. The + * first number is n, and if there is an "E" + * ("e" is also acceptable), then the integer after that is + * the exponent. + *

    + * Here are the possible forms the number can take: + *
    + * + * + * + * + * + * + *
    FormExamples
    [+-]<number>[.]345., -10, 12
    [+-]<number>.<number>40.2, 80.00, -12.30
    [+-]<number>[.]E[+-]<number>80E12, -12e+7, 4.E-123
    [+-]<number>.<number>E[+-]<number>6.02e-22, -40.2E+6, 12.3e9
    + * + * "[+-]" means either a plus or minus sign may go there, or + * neither, in which case + is assumed. + *
    + * "[.]" means a dot may be placed here, but is optional. + *
    + * "<number>" means a string of digits (0-9), basically + * an integer. "<number>.<number>" is basically + * a real number, a floating-point value. + *

    + * Remember that a float has a limited range. If the + * number you specify is greater than Float.MAX_VALUE or less + * than -Float.MAX_VALUE, it will be set at + * Float.POSITIVE_INFINITY or + * Float.NEGATIVE_INFINITY, respectively. + *

    + * + * Note also that float does not have perfect precision. Many + * numbers cannot be precisely represented. The number you specify + * will be rounded to the nearest representable value. + * Float.MIN_VALUE is the margin of error for float + * values. + *

    + * If an unexpected character is found in the String, a + * NumberFormatException will be thrown. Spaces are not + * allowed and will cause this exception to be thrown. + * + * @XXX specify where/how we are not in accord with the spec. + * + * @param str the String to convert + * @return the value of the String as a float. + * @exception NumberFormatException when the string cannot be parsed to a + * float. + * @since JDK 1.2 + * @see #MIN_VALUE + * @see #MAX_VALUE + * @see #POSITIVE_INFINITY + * @see #NEGATIVE_INFINITY + */ public static float parseFloat (String s) throws NumberFormatException { // The spec says that parseFloat() should work like *************** public final class Float extends Number *** 57,170 **** return (float) Double.parseDouble (s); } public String toString () { return toString (value); } public boolean equals (Object obj) { if (!(obj instanceof Float)) return false; ! Float f = (Float) obj; ! return floatToIntBits (value) == floatToIntBits (f.floatValue ()); } public int hashCode () { return floatToIntBits (value); } public int intValue () { return (int) value; } public long longValue () { return (long) value; } public float floatValue () { return (float) value; } public double doubleValue () { return (double) value; } ! public byte byteValue () ! { ! return (byte) value; ! } ! ! public short shortValue () { ! return (short) value; } ! public static String toString (float v) ! { ! return Double.toString ((double) v, true); ! } ! public static Float valueOf (String s) throws NumberFormatException { ! return new Float (Double.valueOf (s).floatValue ()); } public boolean isNaN () { return isNaN (value); } public static boolean isNaN (float v) { ! int bits = floatToIntBits (v); ! int e = bits & 0x7f800000; ! int f = bits & 0x007fffff; ! ! return e == 0x7f800000 && f != 0; } public boolean isInfinite () { return isInfinite (value); } public static boolean isInfinite (float v) { ! int bits = floatToIntBits (v); ! int f = bits & 0x7fffffff; ! ! return f == 0x7f800000; } public static native int floatToIntBits (float value); public static native int floatToRawIntBits (float value); public static native float intBitsToFloat (int bits); ! public int compareTo (Float d) { ! float v = d.value; ! if (isNaN (value)) ! return isNaN (v) ? 1 : 0; ! else if (isNaN (v)) ! return -1; ! else if (value == 0.0 && v == -0.0) ! return 1; ! else if (value == -0.0 && v == 0.0) return -1; ! else if (value == v) return 0; ! return value > v ? 1 : -1; } public int compareTo (Object o) { return compareTo ((Float) o); --- 208,526 ---- return (float) Double.parseDouble (s); } + /** + * Convert the float value of this Float + * to a String. This method calls + * Float.toString(float) to do its dirty work. + * + * @return the String representation of this Float. + * @see #toString(float) + */ public String toString () { return toString (value); } + /** + * If the Object is not null, is an + * instanceof Float, and represents + * the same primitive float value return + * true. Otherwise false is returned. + *

    + * Note that there are two differences between == and + * equals(). 0.0f == -0.0f returns true + * but new Float(0.0f).equals(new Float(-0.0f)) returns + * false. And Float.NaN == Float.NaN returns + * false, but + * new Float(Float.NaN).equals(new Float(Float.NaN)) returns + * true. + * + * @param obj the object to compare to + * @return whether the objects are semantically equal. + */ public boolean equals (Object obj) { if (!(obj instanceof Float)) return false; ! float f = ((Float) obj).value; ! // GCJ LOCAL: this implementation is probably faster than ! // Classpath's, especially once we inline floatToIntBits. ! return floatToIntBits (value) == floatToIntBits (f); ! // END GCJ LOCAL } + /** + * Return a hashcode representing this Object. + * Float's hash code is calculated by calling the + * floatToIntBits() function. + * @return this Object's hash code. + * @see java.lang.Float.floatToIntBits(float) + */ public int hashCode () { return floatToIntBits (value); } + /** + * Return the value of this Double when cast to an + * int. + */ public int intValue () { return (int) value; } + /** + * Return the value of this Double when cast to a + * long. + */ public long longValue () { return (long) value; } + /** + * Return the value of this Double when cast to a + * float. + */ public float floatValue () { return (float) value; } + /** + * Return the primitive double value represented by this + * Double. + */ public double doubleValue () { return (double) value; } ! /** ! * Convert the float to a String. ! *

    ! * ! * Floating-point string representation is fairly complex: here is a ! * rundown of the possible values. "[-]" indicates that a ! * negative sign will be printed if the value (or exponent) is negative. ! * "<number>" means a string of digits (0-9). ! * "<digit>" means a single digit (0-9). ! *

    ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! *
    Value of FloatString Representation
    [+-] 0[-]0.0
    Between [+-] 10-3 and 107[-]number.number
    Other numeric value[-]<digit>.<number>E[-]<number>
    [+-] infinity[-]Infinity
    NaNNaN
    ! * ! * Yes, negative zero is a possible value. Note that there is ! * always a . and at least one digit printed after ! * it: even if the number is 3, it will be printed as 3.0. ! * After the ".", all digits will be printed except trailing zeros. No ! * truncation or rounding is done by this function. ! * ! * @XXX specify where we are not in accord with the spec. ! * ! * @param f the float to convert ! * @return the String representing the float. ! */ ! public static String toString (float f) { ! return Double.toString ((double) f, true); } ! /** ! * Return the result of calling new Float(java.lang.String). ! * ! * @param s the String to convert to a Float. ! * @return a new Float representing the String's ! * numeric value. ! * ! * @exception NumberFormatException thrown if String cannot ! * be parsed as a double. ! * @see #Float(java.lang.String) ! * @see #parseFloat(java.lang.String) ! */ public static Float valueOf (String s) throws NumberFormatException { ! return new Float (s); } + /** + * Return true if the value of this Float + * is the same as NaN, otherwise return false. + * @return whether this Float is NaN. + */ public boolean isNaN () { return isNaN (value); } + /** + * Return true if the float has the same + * value as NaN, otherwise return false. + * + * @param v the float to compare + * @return whether the argument is NaN. + */ public static boolean isNaN (float v) { ! // This works since NaN != NaN is the only reflexive inequality ! // comparison which returns true. ! return v != v; } + /** + * Return true if the value of this Float + * is the same as NEGATIVE_INFINITY or + * POSITIVE_INFINITY, otherwise return false. + * + * @return whether this Float is (-/+) infinity. + */ public boolean isInfinite () { return isInfinite (value); } + /** + * Return true if the float has a value + * equal to either NEGATIVE_INFINITY or + * POSITIVE_INFINITY, otherwise return false. + * + * @param v the float to compare + * @return whether the argument is (-/+) infinity. + */ public static boolean isInfinite (float v) { ! return (v == POSITIVE_INFINITY || v == NEGATIVE_INFINITY); } + /** + * Return the int bits of the specified float. + * The result of this function can be used as the argument to + * Float.intBitsToFloat(long) to obtain the + * original float value. + * + * @param value the float to convert + * @return the bits of the float. + */ public static native int floatToIntBits (float value); + + /** + * Return the int bits of the specified float. + * The result of this function can be used as the argument to + * Float.intBitsToFloat(long) to obtain the + * original float value. The difference between + * this function and floatToIntBits is that this + * function does not collapse NaN values. + * + * @param value the float to convert + * @return the bits of the float. + */ public static native int floatToRawIntBits (float value); + + /** + * Return the float represented by the long + * bits specified. + * + * @param bits the long bits representing a double + * @return the float represented by the bits. + */ public static native float intBitsToFloat (int bits); ! /** ! * Returns 0 if the float value of the argument is ! * equal to the value of this Float. Returns a number ! * less than zero if the value of this Float is less ! * than the Float value of the argument, and returns a ! * number greater than zero if the value of this Float ! * is greater than the float value of the argument. ! *
    ! * Float.NaN is greater than any number other than itself, ! * even Float.POSITIVE_INFINITY. ! *
    ! * 0.0 is greater than -0.0. ! * ! * @param f the Float to compare to. ! * @return 0 if the Floats are the same, < 0 if this ! * Float is less than the Float in ! * in question, or > 0 if it is greater. ! * ! * @since 1.2 ! */ ! public int compareTo (Float f) { ! return compare (value, f.value); ! } ! ! /** ! * Returns 0 if the first argument is equal to the second argument. ! * Returns a number less than zero if the first argument is less than the ! * second argument, and returns a number greater than zero if the first ! * argument is greater than the second argument. ! *
    ! * Float.NaN is greater than any number other than itself, ! * even Float.POSITIVE_INFINITY. ! *
    ! * 0.0 is greater than -0.0. ! * ! * @param x the first float to compare. ! * @param y the second float to compare. ! * @return 0 if the arguments are the same, < 0 if the ! * first argument is less than the second argument in ! * in question, or > 0 if it is greater. ! * @since 1.4 ! */ ! public static int compare (float x, float y) ! { ! if (isNaN (x)) ! return isNaN (y) ? 0 : 1; ! if (isNaN (y)) return -1; ! // recall that 0.0 == -0.0, so we convert to infinities and try again ! if (x == 0 && y == 0) ! return (int) (1 / x - 1 / y); ! if (x == y) return 0; ! return x > y ? 1 : -1; } + /** + * Compares the specified Object to this Float + * if and only if the Object is an instanceof + * Float. + * Otherwise it throws a ClassCastException + * + * @param o the Object to compare to. + * @return 0 if the Floats are the same, < 0 if this + * Float is less than the Float in + * in question, or > 0 if it is greater. + * @throws ClassCastException if the argument is not a Float + * + * @since 1.2 + */ public int compareTo (Object o) { return compareTo ((Float) o); diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IllegalAccessError.java gcc-3.1/libjava/java/lang/IllegalAccessError.java *** gcc-3.0.4/libjava/java/lang/IllegalAccessError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IllegalAccessError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // IllegalAccessError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class IllegalAccessError extends IncompatibleClassChangeError { ! public IllegalAccessError () ! { ! super (); ! } ! public IllegalAccessError (String msg) ! { ! super (msg); ! } } --- 1,80 ---- ! /* IllegalAccessError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * An IllegalAccessError is thrown when an attempt is made to + * call a method, or access or modify a field that the application does not + * have access to. Because this error is usually caught by a compiler, + * the error only occurs at runtime when the definition of a class has + * changed in a way that is incompatible with the previously compiled + * application. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class IllegalAccessError extends IncompatibleClassChangeError { ! static final long serialVersionUID = -8988904074992417891L; ! /** ! * Create an error without a message. ! */ ! public IllegalAccessError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public IllegalAccessError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IllegalAccessException.java gcc-3.1/libjava/java/lang/IllegalAccessException.java *** gcc-3.0.4/libjava/java/lang/IllegalAccessException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IllegalAccessException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class IllegalAccessException extends Exception { public IllegalAccessException() ! { ! super(); ! } ! public IllegalAccessException(String msg) ! { ! super(msg); ! } } --- 1,83 ---- ! /* IllegalAccessException.java -- exception thrown when trying to load a ! class that is not public and in another package. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Thrown in two cases. The first is when try to load a class that is ! * not public and in another package using specific methods from ! * ClassLoader and Class. The second case is ! * when trying to create a new instance of a class to which you do not have ! * access to the zero argument constructor as in using the ! * newsInstance method of class Class. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class IllegalAccessException extends Exception { + static final long serialVersionUID = 6616958222490762034L; + + /** + * Create an exception without a message. + */ public IllegalAccessException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public IllegalAccessException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IllegalArgumentException.java gcc-3.1/libjava/java/lang/IllegalArgumentException.java *** gcc-3.0.4/libjava/java/lang/IllegalArgumentException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IllegalArgumentException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class IllegalArgumentException extends RuntimeException { public IllegalArgumentException() ! { ! super(); ! } ! public IllegalArgumentException(String msg) ! { ! super(msg); ! } } --- 1,78 ---- ! /* IllegalArgumentException.java -- exception may be thrown when a method ! is passed an illegal or inappropriate argument. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * When a method is passed an illegal or inappropriate argument ! * this exception may be thrown. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class IllegalArgumentException extends RuntimeException { + static final long serialVersionUID = -5365630128856068164L; + + /** + * Create an exception without a message. + */ public IllegalArgumentException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public IllegalArgumentException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IllegalMonitorStateException.java gcc-3.1/libjava/java/lang/IllegalMonitorStateException.java *** gcc-3.0.4/libjava/java/lang/IllegalMonitorStateException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IllegalMonitorStateException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class IllegalMonitorStateException extends RuntimeException { public IllegalMonitorStateException() ! { ! super(); ! } ! public IllegalMonitorStateException(String msg) ! { ! super(msg); ! } } --- 1,81 ---- ! /* IllegalMonitorStateException.java -- exception thrown when a thread ! attempts to wait on an object's monitor. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * If a thread attempts to wait on an object's monitor then ! * IllegalMonitorStateException can be thrown. This ! * exception is also thrown to give a message to other threads also waiting ! * on an object's monitor without owning the monitor. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class IllegalMonitorStateException extends RuntimeException { + static final long serialVersionUID = 3713306369498869069L; + + /** + * Create an exception without a message. + */ public IllegalMonitorStateException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public IllegalMonitorStateException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IllegalStateException.java gcc-3.1/libjava/java/lang/IllegalStateException.java *** gcc-3.0.4/libjava/java/lang/IllegalStateException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IllegalStateException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class IllegalStateException extends RuntimeException { public IllegalStateException() ! { ! super(); ! } ! public IllegalStateException(String msg) ! { ! super(msg); ! } } --- 1,79 ---- ! /* IllegalStateException.java -- exception thrown when invoking a method at ! an illegal or inappropriate time. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Invoking a method at an illegal or inappropriate time can result ! * in an IllegalStateException. ! * ! * @since JDK 1.1 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class IllegalStateException extends RuntimeException { + static final long serialVersionUID = -1848914673093119416L; + + /** + * Create an exception without a message. + */ public IllegalStateException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public IllegalStateException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IllegalThreadStateException.java gcc-3.1/libjava/java/lang/IllegalThreadStateException.java *** gcc-3.0.4/libjava/java/lang/IllegalThreadStateException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IllegalThreadStateException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class IllegalThreadStateException extends IllegalArgumentException { public IllegalThreadStateException() ! { ! super(); ! } ! public IllegalThreadStateException(String msg) ! { ! super(msg); ! } } --- 1,80 ---- ! /* IllegalThreadStateException.java -- exception thrown when trying to ! suspend or resume a Thread when it is not in an appropriate state ! for the operation. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * When trying to suspend or resume an object ! * of class Thread when it is not in an appropriate state ! * for the operation. ! * ! * @since JDK 1.0 ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class IllegalThreadStateException extends IllegalArgumentException { + static final long serialVersionUID = -7626246362397460174L; + + /** + * Create an exception without a message. + */ public IllegalThreadStateException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public IllegalThreadStateException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IncompatibleClassChangeError.java gcc-3.1/libjava/java/lang/IncompatibleClassChangeError.java *** gcc-3.0.4/libjava/java/lang/IncompatibleClassChangeError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IncompatibleClassChangeError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // IncompatibleClassChangeError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class IncompatibleClassChangeError extends LinkageError { ! public IncompatibleClassChangeError () ! { ! super (); ! } ! public IncompatibleClassChangeError (String msg) ! { ! super (msg); ! } } --- 1,77 ---- ! /* IncompatibleClassChangeError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * An IncompatibleClassChangeError is thrown when the + * definition of a class used by the currently executing method has + * changed in an incompatible way. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class IncompatibleClassChangeError extends LinkageError { ! static final long serialVersionUID = -4914975503642802119L; ! /** ! * Create an error without a message. ! */ ! public IncompatibleClassChangeError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public IncompatibleClassChangeError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/IndexOutOfBoundsException.java gcc-3.1/libjava/java/lang/IndexOutOfBoundsException.java *** gcc-3.0.4/libjava/java/lang/IndexOutOfBoundsException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/IndexOutOfBoundsException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class IndexOutOfBoundsException extends RuntimeException { public IndexOutOfBoundsException() ! { ! super(); ! } ! public IndexOutOfBoundsException(String msg) ! { ! super(msg); ! } } --- 1,83 ---- ! /* IndexOutOfBoundsException.java -- exception thrown when attempting to ! access an index which is out of bounds on objects like String, Array, ! or Vector. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * This exception can be thrown to indicate an attempt to access an ! * index which is out of bounds on objects like String, Array, or Vector. ! * Usually any negative integer less than or equal to -1 and positive ! * integer greater than or equal to the size of the object is an index ! * which would be out of bounds. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class IndexOutOfBoundsException extends RuntimeException { + static final long serialVersionUID = 234122996006267687L; + + /** + * Create an exception without a message. + */ public IndexOutOfBoundsException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public IndexOutOfBoundsException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/InheritableThreadLocal.java gcc-3.1/libjava/java/lang/InheritableThreadLocal.java *** gcc-3.0.4/libjava/java/lang/InheritableThreadLocal.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/InheritableThreadLocal.java Tue Jan 22 22:40:16 2002 *************** *** 0 **** --- 1,178 ---- + /* java.lang.InheritableThreadLocal + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; + + import java.util.Iterator; + import java.util.HashSet; + import java.util.Map; + import java.util.Set; + import java.util.WeakHashMap; + + /** + * ThreadLocal whose value is inherited by child Threads. + * The value of the InheritableThreadLocal associated with the (parent) Thread + * on the moment that it creates a new (child) Thread is set as the value that + * is associated with the new (child) Thread. + *

    + * It is possible to make the value associated with the child Thread a function + * of the value that is associated with the parent Thread by overriding the + * childValue() method. + * + * @since 1.2 + * @author Mark Wielaard (mark@klomp.org) + */ + public class InheritableThreadLocal extends ThreadLocal { + + /** + * Maps Threads to a Set of InheritableThreadLocals + * (the heritage of that Thread). + * Uses a WeakHashMap so if the Thread is garbage collected the reference + * to that Set disappears. + * Both AddToHeritage access and modify it so they have to + * synchronize on the threadMap when they do. + */ + private static Map threadMap = new WeakHashMap(); + + /** + * Creates a new InheritableThreadLocal that has no values associated + * with it yet. + */ + public InheritableThreadLocal() { + super(); + } + + /** + * Determines the value associated with a newly created child Thread + * as a function of the value associated with the currently executing + * (parent) Thread. + *

    + * The default implementation just returns the parentValue. + */ + protected Object childValue(Object parentValue) { + return parentValue; + } + + /** + * Adds this InheritableThreadLocal to the heritage of the + * current Thread and returns the value of the ThreadLocal + * for the Thread. The value will be either the last value that the + * current Thread has set, or the childValue of the last value that the + * parent Thread set before the current Thread was created, or the + * initialValue of the ThreadLocal. + * + * @see ThreadLocal#get() + */ + public Object get() { + addToHeritage(); + return super.get(); + } + + /** + * Adds this InheritableThreadLocal to the heritage of the + * current Thread and sets the value of the ThreadLocal + * for the Thread. + * + * @see ThreadLocal#set(Object) + */ + public void set(Object value) { + addToHeritage(); + super.set(value); + } + + /** + * Adds this InheritableThreadLocal to the heritage + * of the current Thread. + */ + private void addToHeritage() { + Thread currentThread = Thread.currentThread(); + Set heritage; + synchronized(threadMap) { + heritage = (Set)threadMap.get(currentThread); + } + // Note that we don't have to synchronize on the heritage Set + // since only this Thread (or the parent Thread when creating + // the heritage) ever modifies it. + if (heritage == null) { + heritage = new HashSet(); + synchronized(threadMap) { + threadMap.put(currentThread, heritage); + } + } + if (!heritage.contains(this)) { + heritage.add(this); + } + } + + /** + * Generates the childValues of all InheritableThreadLocals + * that are in the heritage of the current Thread for the newly created + * childThread. + * Should be called from the contructor of java.lang.Thread. + */ + static void newChildThread(Thread childThread) { + // The currentThread is the parent of the new thread + Thread parentThread = Thread.currentThread(); + + // Inherit all the InheritableThreadLocals of the parent thread + Set heritage; + synchronized(threadMap) { + heritage = (Set)threadMap.get(parentThread); + } + // Note that we don't have to synchronize on the heritage Set + // since only this Thread (or the parent Thread when creating + // the heritage) ever modifies it. + if (heritage != null) { + synchronized(threadMap) { + threadMap.put(childThread, new HashSet(heritage)); + } + // And constructs all the new child values + // (has to be done now that we are executing in the parentThread) + Iterator it = heritage.iterator(); + while (it.hasNext()) { + InheritableThreadLocal local = + (InheritableThreadLocal) it.next(); + // Note that the parentValue cannot be null + // If it was it would not be in the heritage + Object parentValue = local.get(parentThread).getValue(); + Object childValue = local.childValue(parentValue); + ThreadLocal.Value v = new ThreadLocal.Value(childValue); + local.set(childThread, v); + } + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/InstantiationError.java gcc-3.1/libjava/java/lang/InstantiationError.java *** gcc-3.0.4/libjava/java/lang/InstantiationError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/InstantiationError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // InstantiationError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class InstantiationError extends IncompatibleClassChangeError { ! public InstantiationError () ! { ! super (); ! } ! public InstantiationError (String msg) ! { ! super (msg); ! } } --- 1,80 ---- ! /* InstantiationError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * An InstantiationError is thrown when an attempt is made to + * create an instance of an abstract class or an interface. Because this + * error is usually caught by a compiler, + * the error only occurs at runtime when the definition of a class has + * changed in a way that is incompatible with the previously compiled + * application. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class InstantiationError extends IncompatibleClassChangeError { ! static final long serialVersionUID = -4885810657349421204L; ! /** ! * Create an error without a message. ! */ ! public InstantiationError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public InstantiationError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/InstantiationException.java gcc-3.1/libjava/java/lang/InstantiationException.java *** gcc-3.0.4/libjava/java/lang/InstantiationException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/InstantiationException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class InstantiationException extends Exception { public InstantiationException() ! { ! super(); ! } ! public InstantiationException(String msg) ! { ! super(msg); ! } } --- 1,80 ---- ! /* InstantiationException.java -- exception thrown when trying to instantiate ! interfaces and abstract classes using Class.newInstance. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Interfaces and abstract classes cannot be instantiated using the ! * newInstance method of class Class. Trying ! * to do so results in this exception being thrown. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class InstantiationException extends Exception { + static final long serialVersionUID = -8441929162975509110L; + + /** + * Create an exception without a message. + */ public InstantiationException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public InstantiationException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Integer.java gcc-3.1/libjava/java/lang/Integer.java *** gcc-3.0.4/libjava/java/lang/Integer.java Mon Feb 19 03:43:39 2001 --- gcc-3.1/libjava/java/lang/Integer.java Mon Apr 15 21:06:59 2002 *************** *** 1,185 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; /** ! * @author Warren Levy ! * @date September 11, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ - public final class Integer extends Number implements Comparable { ! public static final int MAX_VALUE = 0x7FFFFFFF; public static final int MIN_VALUE = 0x80000000; ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = int.class; ! /* The int value of the instance. */ ! private int value; ! private static final long serialVersionUID = 1360826667806852920L; ! public Integer(int val) { ! value = val; } ! public Integer(String str) throws NumberFormatException { ! value = parseInt(str, 10); } ! public byte byteValue() { ! return (byte) value; } ! public double doubleValue() { ! return (double) value; } ! public float floatValue() { ! return (float) value; } ! public int intValue() { ! return value; } ! public long longValue() { ! return value; } ! public short shortValue() { ! return (short) value; } ! // Added in JDK 1.2 ! public int compareTo(Integer anotherInteger) { ! if (this.value == anotherInteger.value) ! return 0; ! // Returns just -1 or 1 on inequality; doing math might overflow the int. ! if (this.value > anotherInteger.value) ! return 1; ! return -1; } ! // Added in JDK 1.2 ! /** @throws ClassCastException */ ! public int compareTo(Object o) { ! return this.compareTo((Integer) o); } ! public static Integer decode(String str) throws NumberFormatException { ! boolean isNeg = false; ! int index = 0; ! int radix = 10; ! final int len; ! if ((len = str.length()) == 0) ! throw new NumberFormatException(); ! // Negative numbers are always radix 10. ! if (str.charAt(0) == '-') { - radix = 10; - index++; isNeg = true; ! } ! else if (str.charAt(index) == '#') ! { ! radix = 16; ! index++; ! } ! else if (str.charAt(index) == '0') ! { ! // Check if str is just "0" ! if (len == 1) ! return new Integer(0); ! index++; ! if (str.charAt(index) == 'x') { ! radix = 16; ! index++; } - else - radix = 8; } ! if (index >= len) ! throw new NumberFormatException(); ! ! return new Integer(parseInt(str, index, len, isNeg, radix)); ! } ! ! public boolean equals(Object obj) ! { ! return (obj instanceof Integer && ((Integer) obj).value == value); ! } ! public static Integer getInteger(String prop) ! { ! return getInteger(prop, null); ! } ! public static Integer getInteger(String prop, int defval) ! { ! Integer val = getInteger(prop, null); ! return val == null ? new Integer(defval) : val; } ! public static Integer getInteger(String prop, Integer defobj) { ! try ! { ! String val = System.getProperty(prop); ! if (val != null) ! return decode(val); ! } ! catch (NumberFormatException ex) ! { ! } ! return defobj; } ! public int hashCode() { ! return value; } ! public static int parseInt(String str) throws NumberFormatException { ! return parseInt(str, 10); } ! public static int parseInt(String str, int radix) throws NumberFormatException { final int len; if ((len = str.length()) == 0 || radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) throw new NumberFormatException(); --- 1,385 ---- ! /* java.lang.Integer ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; /** ! * Instances of class Integer represent primitive ! * int values. ! * ! * Additionally, this class provides various helper functions and variables ! * related to ints. ! * ! * @author Paul Fisher ! * @author John Keiser ! * @author Warren Levy ! * @since JDK 1.0 */ public final class Integer extends Number implements Comparable { ! // compatible with JDK 1.0.2+ ! private static final long serialVersionUID = 1360826667806852920L; ! ! /** ! * The minimum value an int can represent is -2147483648. ! */ public static final int MIN_VALUE = 0x80000000; ! /** ! * The maximum value an int can represent is 2147483647. ! */ ! public static final int MAX_VALUE = 0x7fffffff; ! /** ! * The primitive type int is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass ('I'); ! /** ! * The immutable value of this Integer. ! */ ! private final int value; ! /** ! * Create an Integer object representing the value of the ! * int argument. ! * ! * @param value the value to use ! */ ! public Integer(int value) { ! this.value = value; } ! /** ! * Create an Integer object representing the value of the ! * argument after conversion to an int. ! * ! * @param s the string to convert. ! */ ! public Integer(String s) throws NumberFormatException { ! value = parseInt(s, 10); } ! /** ! * Return a hashcode representing this Object. ! * ! * Integer's hash code is calculated by simply returning its ! * value. ! * ! * @return this Object's hash code. ! */ ! public int hashCode() { ! return value; } ! /** ! * If the Object is not null, is an ! * instanceof Integer, and represents ! * the same primitive int value return ! * true. Otherwise false is returned. ! */ ! public boolean equals(Object obj) { ! return obj instanceof Integer && value == ((Integer)obj).value; } ! /** ! * Get the specified system property as an Integer. ! * ! * The decode() method will be used to interpret the value of ! * the property. ! * @param nm the name of the system property ! * @return the system property as an Integer, or ! * null if the property is not found or cannot be ! * decoded as an Integer. ! * @see java.lang.System#getProperty(java.lang.String) ! * @see #decode(int) ! */ ! public static Integer getInteger(String nm) { ! return getInteger(nm, null); } ! /** ! * Get the specified system property as an Integer, or use a ! * default int value if the property is not found or is not ! * decodable. ! * ! * The decode() method will be used to interpret the value of ! * the property. ! * ! * @param nm the name of the system property ! * @param val the default value to use if the property is not found or not ! * a number. ! * @return the system property as an Integer, or the default ! * value if the property is not found or cannot be decoded as an ! * Integer. ! * @see java.lang.System#getProperty(java.lang.String) ! * @see #decode(int) ! * @see #getInteger(java.lang.String,java.lang.Integer) ! */ ! public static Integer getInteger(String nm, int val) { ! Integer result = getInteger(nm, null); ! return (result == null) ? new Integer(val) : result; } ! /** ! * Get the specified system property as an Integer, or use a ! * default Integer value if the property is not found or is ! * not decodable. ! * ! * The decode() method will be used to interpret the value of ! * the property. ! * ! * @param nm the name of the system property ! * @param val the default value to use if the property is not found or not ! * a number. ! * @return the system property as an Integer, or the default ! * value if the property is not found or cannot be decoded as an ! * Integer. ! * @see java.lang.System#getProperty(java.lang.String) ! * @see #decode(int) ! * @see #getInteger(java.lang.String,int) ! */ ! public static Integer getInteger(String nm, Integer def) { ! if (nm == null || "".equals(nm)) ! return def; ! nm = System.getProperty(nm); ! if (nm == null) return def; ! try ! { ! return decode(nm); ! } ! catch (NumberFormatException e) ! { ! return def; ! } } ! private static String toUnsignedString(int num, int exp) { ! // Use an array large enough for a binary number. ! int radix = 1 << exp; ! int mask = radix - 1; ! char[] buffer = new char[32]; ! int i = 32; ! do ! { ! buffer[--i] = Character.forDigit(num & mask, radix); ! num = num >>> exp; ! } ! while (num != 0); ! ! return String.valueOf(buffer, i, 32-i); } ! /** ! * Converts the int to a String assuming it is ! * unsigned in base 16. ! * @param i the int to convert to String ! * @return the String representation of the argument. ! */ ! public static String toHexString(int i) { ! return toUnsignedString(i, 4); ! } ! /** ! * Converts the int to a String assuming it is ! * unsigned in base 8. ! * @param i the int to convert to String ! * @return the String representation of the argument. ! */ ! public static String toOctalString(int i) ! { ! return toUnsignedString(i, 3); ! } ! /** ! * Converts the int to a String assuming it is ! * unsigned in base 2. ! * @param i the int to convert to String ! * @return the String representation of the argument. ! */ ! public static String toBinaryString(int i) ! { ! return toUnsignedString(i, 1); } ! /** ! * Converts the int to a String and assumes ! * a radix of 10. ! * @param i the int to convert to String ! * @return the String representation of the argument. ! */ ! public static String toString(int i) { ! // This is tricky: in libgcj, String.valueOf(int) is a fast native ! // implementation. In Classpath it just calls back to ! // Integer.toString(int,int). ! return String.valueOf (i); } ! /** ! * Converts the Integer value to a String and ! * assumes a radix of 10. ! * @return the String representation of this Integer. ! */ ! public String toString() { ! return toString (value); ! } ! /** ! * Converts the int to a String using ! * the specified radix (base). ! * @param i the int to convert to String. ! * @param radix the radix (base) to use in the conversion. ! * @return the String representation of the argument. ! */ ! public static String toString(int num, int radix) ! { ! if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) ! radix = 10; ! // For negative numbers, print out the absolute value w/ a leading '-'. ! // Use an array large enough for a binary number. ! char[] buffer = new char[33]; ! int i = 33; ! boolean isNeg; ! if (num < 0) { isNeg = true; ! num = -(num); ! // When the value is MIN_VALUE, it overflows when made positive ! if (num < 0) { ! buffer[--i] = Character.forDigit(-(num + radix) % radix, radix); ! num = -(num / radix); } } + else + isNeg = false; ! do ! { ! buffer[--i] = Character.forDigit(num % radix, radix); ! num /= radix; ! } ! while (num > 0); ! if (isNeg) ! buffer[--i] = '-'; ! return String.valueOf(buffer, i, 33-i); } ! /** ! * Creates a new Integer object using the String, ! * assuming a radix of 10. ! * @param s the String to convert. ! * @return the new Integer. ! * @see #Integer(java.lang.String) ! * @see #parseInt(java.lang.String) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as an int. ! */ ! public static Integer valueOf(String s) throws NumberFormatException { ! return new Integer(parseInt(s)); } ! /** ! * Creates a new Integer object using the String ! * and specified radix (base). ! * @param s the String to convert. ! * @param radix the radix (base) to convert with. ! * @return the new Integer. ! * @see #parseInt(java.lang.String,int) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as an int. ! */ ! public static Integer valueOf(String s, int radix) ! throws NumberFormatException { ! return new Integer(parseInt(s, radix)); } ! /** ! * Converts the specified String into an int. ! * This function assumes a radix of 10. ! * ! * @param s the String to convert ! * @return the int value of the String ! * argument. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as an int. ! */ ! public static int parseInt(String s) throws NumberFormatException { ! return parseInt(s, 10); } ! /** ! * Converts the specified String into an int ! * using the specified radix (base). ! * ! * @param s the String to convert ! * @param radix the radix (base) to use in the conversion ! * @return the String argument converted to int. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a int. ! */ ! public static int parseInt(String str, int radix) ! throws NumberFormatException { final int len; + if (str == null) + throw new NumberFormatException (); + if ((len = str.length()) == 0 || radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) throw new NumberFormatException(); *************** public final class Integer extends Numbe *** 199,205 **** } private static int parseInt(String str, int index, int len, boolean isNeg, ! int radix) throws NumberFormatException { int val = 0; int digval; --- 399,406 ---- } private static int parseInt(String str, int index, int len, boolean isNeg, ! int radix) ! throws NumberFormatException { int val = 0; int digval; *************** public final class Integer extends Numbe *** 228,351 **** return isNeg ? -(val) : val; } ! public static String toBinaryString(int num) ! { ! return toUnsignedString(num, 1); ! } ! ! public static String toHexString(int num) { ! return toUnsignedString(num, 4); ! } ! public static String toOctalString(int num) ! { ! return toUnsignedString(num, 3); ! } ! private static String toUnsignedString(int num, int exp) ! { ! // Use an array large enough for a binary number. ! int radix = 1 << exp; ! int mask = radix - 1; ! char[] buffer = new char[32]; ! int i = 32; ! do { ! buffer[--i] = Character.forDigit(num & mask, radix); ! num = num >>> exp; } - while (num != 0); ! return String.valueOf(buffer, i, 32-i); ! } ! public String toString() ! { ! return toString(this.value); ! } ! public static String toString(int num) ! { ! // Use an arrary large enough for "-2147483648"; i.e. 11 chars. ! char[] buffer = new char[11]; ! int i = 11; ! boolean isNeg; ! if (num < 0) ! { ! isNeg = true; ! num = -(num); ! if (num < 0) { ! // Must be MIN_VALUE, so handle this special case. ! buffer[--i] = '8'; ! num = 214748364; } } - else - isNeg = false; - - do - { - buffer[--i] = (char) ((int) '0' + (num % 10)); - num /= 10; - } - while (num > 0); ! if (isNeg) ! buffer[--i] = '-'; ! return String.valueOf(buffer, i, 11-i); } ! public static String toString(int num, int radix) { ! // Use optimized method for the typical case. ! if (radix == 10 || ! radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) ! return toString(num); ! // For negative numbers, print out the absolute value w/ a leading '-'. ! // Use an array large enough for a binary number. ! char[] buffer = new char[33]; ! int i = 33; ! boolean isNeg; ! if (num < 0) ! { ! isNeg = true; ! num = -(num); ! // When the value is MIN_VALUE, it overflows when made positive ! if (num < 0) ! { ! buffer[--i] = Character.forDigit(-(num + radix) % radix, radix); ! num = -(num / radix); ! } ! } ! else ! isNeg = false; ! do ! { ! buffer[--i] = Character.forDigit(num % radix, radix); ! num /= radix; ! } ! while (num > 0); ! if (isNeg) ! buffer[--i] = '-'; ! return String.valueOf(buffer, i, 33-i); } ! public static Integer valueOf(String str) throws NumberFormatException { ! return new Integer(parseInt(str, 10)); } ! public static Integer valueOf(String str, int radix) ! throws NumberFormatException { ! return new Integer(parseInt(str, radix)); } } --- 429,592 ---- return isNeg ? -(val) : val; } ! /** ! * Convert the specified String into an Integer. ! * The String may represent decimal, hexadecimal, or ! * octal numbers. ! * ! * The String argument is interpreted based on the leading ! * characters. Depending on what the String begins with (after an optional ! * minus sign), the base will be interpreted differently: ! * ! * ! * ! * ! * ! * ! * ! * ! *
    Leading
    Characters
    Base
    #16
    0x16
    0X16
    08
    Anything
    Else
    10
    ! * ! * If the String starts with a minus sign the result is negated. ! * ! * @param str the String to interpret. ! * @return the value of the String as an Integer. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as an int. ! */ ! public static Integer decode(String str) throws NumberFormatException { ! boolean isNeg = false; ! int index = 0; ! int radix = 10; ! final int len; ! if ((len = str.length()) == 0) ! throw new NumberFormatException("empty string"); ! if (str.charAt(index) == '-') { ! // The minus sign should be followed by at least one more char ! if (len > 1) ! { ! isNeg = true; ! index++; ! } ! else ! throw new NumberFormatException(); } ! if (str.charAt(index) == '#') ! { ! radix = 16; ! index++; ! } ! else if (str.charAt(index) == '0') ! { ! index++; ! // Check if str is just "0" or "-0" ! if (len == index) ! return new Integer(0); ! if (str.charAt(index) == 'x' || str.charAt(index) == 'X') { ! radix = 16; ! index++; } + else + radix = 8; } ! if (index >= len) ! throw new NumberFormatException("empty value"); ! return new Integer(parseInt(str, index, len, isNeg, radix)); } ! /** Return the value of this Integer as a byte. ! ** @return the value of this Integer as a byte. ! **/ ! public byte byteValue() { ! return (byte) value; ! } ! /** Return the value of this Integer as a short. ! ** @return the value of this Integer as a short. ! **/ ! public short shortValue() ! { ! return (short) value; ! } ! /** Return the value of this Integer as an int. ! ** @return the value of this Integer as an int. ! **/ ! public int intValue() ! { ! return value; ! } ! /** Return the value of this Integer as a long. ! ** @return the value of this Integer as a long. ! **/ ! public long longValue() ! { ! return value; ! } ! /** Return the value of this Integer as a float. ! ** @return the value of this Integer as a float. ! **/ ! public float floatValue() ! { ! return value; ! } ! /** Return the value of this Integer as a double. ! ** @return the value of this Integer as a double. ! **/ ! public double doubleValue() ! { ! return value; } ! /** ! * Compare two Integers numerically by comparing their ! * int values. ! * @return a positive value if this Integer is greater ! * in value than the argument Integer; a negative value ! * if this Integer is smaller in value than the argument ! * Integer; and 0, zero, if this ! * Integer is equal in value to the argument ! * Integer. ! * ! * @since 1.2 ! */ ! public int compareTo(Integer i) { ! if (this.value == i.value) ! return 0; ! ! // Returns just -1 or 1 on inequality; doing math might overflow. ! if (this.value > i.value) ! return 1; ! ! return -1; } ! /** ! * Behaves like compareTo(java.lang.Integer) unless the Object ! * is not a Integer. Then it throws a ! * ClassCastException. ! * @exception ClassCastException if the argument is not a ! * Integer. ! * ! * @since 1.2 ! */ ! public int compareTo(Object o) { ! return compareTo((Integer)o); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/InternalError.java gcc-3.1/libjava/java/lang/InternalError.java *** gcc-3.0.4/libjava/java/lang/InternalError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/InternalError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // InternalError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class InternalError extends VirtualMachineError { ! public InternalError () ! { ! super (); ! } ! public InternalError (String msg) ! { ! super (msg); ! } } --- 1,76 ---- ! /* InternalError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * An InternalError is thrown when a mystical error has + * occurred in the Java Virtual Machine. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class InternalError extends VirtualMachineError { ! static final long serialVersionUID = -9062593416125562365L; ! /** ! * Create an error without a message. ! */ ! public InternalError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public InternalError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/InterruptedException.java gcc-3.1/libjava/java/lang/InterruptedException.java *** gcc-3.0.4/libjava/java/lang/InterruptedException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/InterruptedException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class InterruptedException extends Exception { public InterruptedException() ! { ! super(); ! } ! public InterruptedException(String msg) ! { ! super(msg); ! } } --- 1,81 ---- ! /* InterruptedException.java -- exception thrown when a thread interrupts ! another thread which was previously sleeping, waiting, or paused in some ! other way. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Thrown when a thread interrupts another thread which was previously ! * sleeping, waiting, or paused in some other way. See the ! * interrupt method of class Thread. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class InterruptedException extends Exception { + static final long serialVersionUID = 6700697376100628473L; + + /** + * Create an exception without a message. + */ public InterruptedException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public InterruptedException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/LinkageError.java gcc-3.1/libjava/java/lang/LinkageError.java *** gcc-3.0.4/libjava/java/lang/LinkageError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/LinkageError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // LinkageError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class LinkageError extends Error { ! public LinkageError () ! { ! super (); ! } ! public LinkageError (String msg) ! { ! super (msg); ! } } --- 1,77 ---- ! /* LinkageError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * Subclasses of LinkageError are thrown to indicate + * a class which is depended upon by another class has incompatibly + * changed after the compilation of the latter class. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class LinkageError extends Error { ! static final long serialVersionUID = 3579600108157160122L; ! /** ! * Create an error without a message. ! */ ! public LinkageError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public LinkageError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Long.java gcc-3.1/libjava/java/lang/Long.java *** gcc-3.0.4/libjava/java/lang/Long.java Mon Feb 19 03:43:39 2001 --- gcc-3.1/libjava/java/lang/Long.java Wed Apr 3 08:23:48 2002 *************** *** 1,184 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ - public final class Long extends Number implements Comparable { ! public static final long MAX_VALUE = 0x7FFFFFFFFFFFFFFFL; public static final long MIN_VALUE = 0x8000000000000000L; ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = long.class; ! /* The long value of the instance. */ ! private long value; ! private static final long serialVersionUID = 4290774380558885855L; ! public Long(long val) { ! value = val; } ! public Long(String str) throws NumberFormatException { ! value = parseLong(str, 10); } ! public byte byteValue() { ! return (byte) value; } ! public double doubleValue() { ! return (double) value; } ! public float floatValue() { ! return (float) value; } ! public int intValue() { ! return (int) value; } ! public long longValue() { ! return value; } ! public short shortValue() { ! return (short) value; } ! // Added in JDK 1.2 ! public int compareTo(Long anotherLong) { ! if (this.value == anotherLong.value) ! return 0; ! ! // Returns just -1 or 1 on inequality; doing math might overflow the long. ! if (this.value > anotherLong.value) ! return 1; ! ! return -1; } ! // Added in JDK 1.2 ! /** @throws ClassCastException */ ! public int compareTo(Object o) { ! return this.compareTo((Long) o); } ! // Added in JDK 1.2 ! public static Long decode(String str) throws NumberFormatException ! { ! boolean isNeg = false; ! int index = 0; ! int radix = 10; ! final int len; ! if ((len = str.length()) == 0) ! throw new NumberFormatException(); ! // Negative numbers are always radix 10. ! if (str.charAt(0) == '-') { - radix = 10; - index++; isNeg = true; ! } ! else if (str.charAt(index) == '#') ! { ! radix = 16; ! index++; ! } ! else if (str.charAt(index) == '0') ! { ! // Check if str is just "0" ! if (len == 1) ! return new Long(0L); ! ! index++; ! if (str.charAt(index) == 'x') { ! radix = 16; ! index++; } - else - radix = 8; } ! if (index >= len) ! throw new NumberFormatException(); ! return new Long(parseLong(str, index, len, isNeg, radix)); ! } ! public boolean equals(Object obj) ! { ! return (obj instanceof Long && ((Long) obj).value == value); } ! public static Long getLong(String prop) { ! return getLong(prop, null); } ! ! public static Long getLong(String prop, long defval) { ! Long val = getLong(prop, null); ! return val == null ? new Long(defval) : val; ! } ! public static Long getLong(String prop, Long defobj) ! { ! try { ! String val = System.getProperty(prop); ! if (val != null) ! return decode(val); } ! catch (NumberFormatException ex) { } ! return defobj; } ! public int hashCode() { ! return (int)(this.longValue()^(this.longValue()>>>32)); } ! public static long parseLong(String str) throws NumberFormatException { ! return parseLong(str, 10); } public static long parseLong(String str, int radix) ! throws NumberFormatException { final int len; --- 1,415 ---- ! /* java.lang.Long ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; /** ! * Instances of class Double represent primitive ! * double values. ! * ! * Additionally, this class provides various helper functions and variables ! * related to longs. ! * ! * @author Paul Fisher ! * @author John Keiser ! * @author Warren Levy ! * @since JDK 1.0 */ public final class Long extends Number implements Comparable { ! // compatible with JDK 1.0.2+ ! static final long serialVersionUID = 4290774380558885855L; ! ! /** ! * The minimum value a long can represent is ! * -9223372036854775808. ! */ public static final long MIN_VALUE = 0x8000000000000000L; ! /** ! * The maximum value a long can represent is ! * 9223372036854775807. ! */ ! public static final long MAX_VALUE = 0x7fffffffffffffffL; ! /** ! * The primitive type long is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass ('J'); ! /** ! * The immutable value of this Long. ! */ ! private final long value; ! /** ! * Create a Long object representing the value of the ! * long argument. ! * ! * @param value the value to use ! */ ! public Long(long value) { ! this.value = value; } ! /** ! * Create a Long object representing the value of the ! * argument after conversion to a long. ! * ! * @param s the string to convert. ! */ ! public Long(String s) throws NumberFormatException { ! value = parseLong(s, 10); } ! /** ! * If the Object is not null, is an ! * instanceof Long, and represents ! * the same primitive long value return ! * true. Otherwise false is returned. ! */ ! public boolean equals(Object obj) { ! return obj instanceof Long && ((Long)obj).value == value; } ! /** ! * Return a hashcode representing this Object. ! * ! * Long's hash code is calculated by simply returning its ! * value. ! * ! * @return this Object's hash code. ! */ ! public int hashCode() { ! return (int)(value^(value>>>32)); } ! /** ! * Get the specified system property as a Long. ! * ! * A method similar to Integer's decode() will be ! * used to interpret the value of the property. ! * ! * @param nm the name of the system property ! * @return the system property as an Long, or ! * null if the property is not found or cannot be ! * decoded as a Long. ! * @see java.lang.System#getProperty(java.lang.String) ! * @see java.lang.Integer#decode(int) ! */ ! public static Long getLong(String nm) { ! return getLong(nm, null); } ! /** ! * Get the specified system property as an Long, or use a ! * default long value if the property is not found or is not ! * decodable. ! * ! * A method similar to Integer's decode() will be ! * used to interpret the value of the property. ! * ! * @param nm the name of the system property ! * @param val the default value to use if the property is not found or not ! * a number. ! * @return the system property as a Long, or the default ! * value if the property is not found or cannot be decoded as a ! * Long. ! * @see java.lang.System#getProperty(java.lang.String) ! * @see java.lang.Integer#decode(int) ! * @see #getLong(java.lang.String,java.lang.Long) ! */ ! public static Long getLong(String nm, long val) { ! Long result = getLong(nm, null); ! return (result == null) ? new Long(val) : result; } ! /** ! * Get the specified system property as an Long, or use a ! * default Long value if the property is not found or is ! * not decodable. ! * ! * The decode() method will be used to interpret the value of ! * the property. ! * ! * @param nm the name of the system property ! * @param val the default value to use if the property is not found or not ! * a number. ! * @return the system property as an Long, or the default ! * value if the property is not found or cannot be decoded as an ! * Long. ! * @see java.lang.System#getProperty(java.lang.String) ! * @see java.lang.Integer#decode(int) ! * @see #getLong(java.lang.String,long) ! */ ! public static Long getLong(String nm, Long def) { ! nm = System.getProperty(nm); ! if (nm == null || "".equals(nm)) ! return def; ! try ! { ! return decode(nm); ! } ! catch (NumberFormatException e) ! { ! return def; ! } } ! private static String toUnsignedString(long num, int exp) { ! // Use an array large enough for a binary number. ! int radix = 1 << exp; ! int mask = radix - 1; ! char[] buffer = new char[64]; ! int i = 64; ! do ! { ! buffer[--i] = Character.forDigit((int) num & mask, radix); ! num = num >>> exp; ! } ! while (num != 0); ! ! return String.valueOf(buffer, i, 64-i); } ! /** ! * Converts the long to a String assuming it is ! * unsigned in base 16. ! * @param i the long to convert to String ! * @return the String representation of the argument. ! */ ! public static String toHexString(long i) { ! return toUnsignedString(i, 4); } ! /** ! * Converts the long to a String assuming it is ! * unsigned in base 8. ! * @param i the long to convert to String ! * @return the String representation of the argument. ! */ ! public static String toOctalString(long i) { ! return toUnsignedString(i, 3); } ! /** ! * Converts the long to a String assuming it is ! * unsigned in base 2. ! * @param i the long to convert to String ! * @return the String representation of the argument. ! */ ! public static String toBinaryString(long i) { ! return toUnsignedString(i, 1); ! } ! /** ! * Converts the long to a String and assumes ! * a radix of 10. ! * @param num the long to convert to String ! * @return the String representation of the argument. ! */ ! public static String toString(long num) ! { ! // Use the Integer toString for efficiency if possible. ! if (num <= Integer.MAX_VALUE && num >= Integer.MIN_VALUE) ! return Integer.toString((int) num); ! // Use an array large enough for "-9223372036854775808"; i.e. 20 chars. ! char[] buffer = new char[20]; ! int i = 20; ! boolean isNeg; ! if (num < 0) { isNeg = true; ! num = -(num); ! if (num < 0) { ! // Must be MIN_VALUE, so handle this special case. ! buffer[--i] = '8'; ! num = 922337203685477580L; } } + else + isNeg = false; ! do ! { ! buffer[--i] = (char) ((int) '0' + (num % 10)); ! num /= 10; ! } ! while (num > 0); ! if (isNeg) ! buffer[--i] = '-'; ! return String.valueOf(buffer, i, 20-i); } ! /** ! * Converts the Long value to a String and ! * assumes a radix of 10. ! * @return the String representation of this Long. ! */ ! public String toString() { ! return toString(value); } ! ! /** ! * Converts the long to a String using ! * the specified radix (base). ! * @param num the long to convert to String. ! * @param radix the radix (base) to use in the conversion. ! * @return the String representation of the argument. ! */ ! public static String toString(long num, int radix) { ! // Use optimized method for the typical case. ! if (radix == 10 || ! radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) ! return toString(num); ! // Use the Integer toString for efficiency if possible. ! if (num <= Integer.MAX_VALUE && num >= Integer.MIN_VALUE) ! return Integer.toString((int) num, radix); ! ! // For negative numbers, print out the absolute value w/ a leading '-'. ! // Use an array large enough for a binary number. ! char[] buffer = new char[65]; ! int i = 65; ! boolean isNeg; ! if (num < 0) { ! isNeg = true; ! num = -(num); ! ! // When the value is MIN_VALUE, it overflows when made positive ! if (num < 0) ! { ! buffer[--i] = Character.forDigit((int) (-(num + radix) % radix), ! radix); ! num = -(num / radix); ! } } ! else ! isNeg = false; ! ! do { + buffer[--i] = Character.forDigit((int) (num % radix), radix); + num /= radix; } ! while (num > 0); ! ! if (isNeg) ! buffer[--i] = '-'; ! ! return String.valueOf(buffer, i, 65-i); ! } ! ! /** ! * Creates a new Long object using the String, ! * assuming a radix of 10. ! * @param s the String to convert. ! * @return the new Long. ! * @see #Long(java.lang.String) ! * @see #parseLong(java.lang.String) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a long. ! */ ! public static Long valueOf(String s) throws NumberFormatException ! { ! return new Long(parseLong(s)); } ! /** ! * Creates a new Long object using the String ! * and specified radix (base). ! * @param s the String to convert. ! * @param radix the radix (base) to convert with. ! * @return the new Long. ! * @see #parseLong(java.lang.String,int) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a long. ! */ ! public static Long valueOf(String s, int radix) throws NumberFormatException { ! return new Long(parseLong(s, radix)); } ! /** ! * Converts the specified String into a long. ! * This function assumes a radix of 10. ! * ! * @param s the String to convert ! * @return the long value of the String ! * argument. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a long. ! */ ! public static long parseLong(String s) throws NumberFormatException { ! return parseLong(s, 10); } + /** + * Converts the specified String into a long + * using the specified radix (base). + * + * @param s the String to convert + * @param radix the radix (base) to use in the conversion + * @return the String argument converted to long. + * @exception NumberFormatException thrown if the String + * cannot be parsed as a long. + */ public static long parseLong(String str, int radix) ! throws NumberFormatException { final int len; *************** public final class Long extends Number i *** 200,205 **** --- 431,480 ---- return parseLong(str, index, len, isNeg, radix); } + public static Long decode(String str) throws NumberFormatException + { + boolean isNeg = false; + int index = 0; + int radix = 10; + final int len; + + if ((len = str.length()) == 0) + throw new NumberFormatException(); + + // Negative numbers are always radix 10. + if (str.charAt(0) == '-') + { + radix = 10; + index++; + isNeg = true; + } + else if (str.charAt(index) == '#') + { + radix = 16; + index++; + } + else if (str.charAt(index) == '0') + { + // Check if str is just "0" + if (len == 1) + return new Long(0L); + + index++; + if (str.charAt(index) == 'x') + { + radix = 16; + index++; + } + else + radix = 8; + } + + if (index >= len) + throw new NumberFormatException(); + + return new Long(parseLong(str, index, len, isNeg, radix)); + } + private static long parseLong(String str, int index, int len, boolean isNeg, int radix) throws NumberFormatException { *************** public final class Long extends Number i *** 230,362 **** return isNeg ? -(val) : val; } ! public static String toBinaryString(long num) { ! return toUnsignedString(num, 1); } ! public static String toHexString(long num) { ! return toUnsignedString(num, 4); } ! public static String toOctalString(long num) { ! return toUnsignedString(num, 3); } ! private static String toUnsignedString(long num, int exp) { ! // Use an array large enough for a binary number. ! int radix = 1 << exp; ! long mask = radix - 1; ! char[] buffer = new char[64]; ! int i = 64; ! do ! { ! buffer[--i] = Character.forDigit((int) (num & mask), radix); ! num = num >>> exp; ! } ! while (num != 0); ! ! return String.valueOf(buffer, i, 64-i); } ! public String toString() { ! return toString(this.value); } ! public static String toString(long num) { ! // Use the Integer toString for efficiency if possible. ! if (num <= Integer.MAX_VALUE && num >= Integer.MIN_VALUE) ! return Integer.toString((int) num); ! ! // Use an arrary large enough for "-9223372036854775808"; i.e. 11 chars. ! char[] buffer = new char[20]; ! int i = 20; ! boolean isNeg; ! if (num < 0) ! { ! isNeg = true; ! num = -(num); ! if (num < 0) ! { ! // Must be MIN_VALUE, so handle this special case. ! buffer[--i] = '8'; ! num = 922337203685477580L; ! } ! } ! else ! isNeg = false; ! ! do ! { ! buffer[--i] = (char) ((int) '0' + (num % 10)); ! num /= 10; ! } ! while (num > 0); ! ! if (isNeg) ! buffer[--i] = '-'; ! ! return String.valueOf(buffer, i, 20-i); } ! public static String toString(long num, int radix) { ! // Use optimized method for the typical case. ! if (radix == 10 || ! radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) ! return toString(num); ! ! // Use the Integer toString for efficiency if possible. ! if (num <= Integer.MAX_VALUE && num >= Integer.MIN_VALUE) ! return Integer.toString((int) num, radix); ! ! // For negative numbers, print out the absolute value w/ a leading '-'. ! // Use an array large enough for a binary number. ! char[] buffer = new char[65]; ! int i = 65; ! boolean isNeg; ! if (num < 0) ! { ! isNeg = true; ! num = -(num); ! ! // When the value is MIN_VALUE, it overflows when made positive ! if (num < 0) ! { ! buffer[--i] = Character.forDigit((int) (-(num + radix) % radix), ! radix); ! num = -(num / radix); ! } ! } ! else ! isNeg = false; ! ! do ! { ! buffer[--i] = Character.forDigit((int) (num % radix), radix); ! num /= radix; ! } ! while (num > 0); ! ! if (isNeg) ! buffer[--i] = '-'; ! return String.valueOf(buffer, i, 65-i); ! } ! public static Long valueOf(String str) throws NumberFormatException ! { ! return new Long(parseLong(str, 10)); } ! ! public static Long valueOf(String str, int radix) ! throws NumberFormatException { ! return new Long(parseLong(str, radix)); } } --- 505,593 ---- return isNeg ? -(val) : val; } ! /** Return the value of this Long as an short. ! ** @return the value of this Long as an short. ! **/ ! public byte byteValue() { ! return (byte) value; } ! /** Return the value of this Long as an short. ! ** @return the value of this Long as an short. ! **/ ! public short shortValue() { ! return (short) value; } ! /** Return the value of this Long as an int. ! ** @return the value of this Long as an int. ! **/ ! public int intValue() { ! return (int) value; } ! /** Return the value of this Long as a long. ! ** @return the value of this Long as a long. ! **/ ! public long longValue() { ! return value; } ! /** Return the value of this Long as a float. ! ** @return the value of this Long as a float. ! **/ ! public float floatValue() { ! return value; } ! /** Return the value of this Long as a double. ! ** @return the value of this Long as a double. ! **/ ! public double doubleValue() { ! return value; } ! /** ! * Compare two Longs numerically by comparing their ! * long values. ! * @return a positive value if this Long is greater ! * in value than the argument Long; a negative value ! * if this Long is smaller in value than the argument ! * Long; and 0, zero, if this ! * Long is equal in value to the argument ! * Long. ! * ! * @since 1.2 ! */ ! public int compareTo(Long l) { ! if (this.value == l.value) ! return 0; ! // Returns just -1 or 1 on inequality; doing math might overflow the long. ! if (this.value > l.value) ! return 1; ! return -1; } ! ! /** ! * Behaves like compareTo(java.lang.Long) unless the Object ! * is not a Long. Then it throws a ! * ClassCastException. ! * @exception ClassCastException if the argument is not a ! * Long. ! * ! * @since 1.2 ! */ ! public int compareTo(Object o) { ! return compareTo((Long)o); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Math.java gcc-3.1/libjava/java/lang/Math.java *** gcc-3.0.4/libjava/java/lang/Math.java Fri Nov 17 04:51:25 2000 --- gcc-3.1/libjava/java/lang/Math.java Fri Feb 15 03:21:47 2002 *************** *** 1,128 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! ! This file is part of libgcj. ! ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! ! /** ! * @author Andrew Haley ! * @date September 18, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ ! ! package java.lang; ! import java.util.Random; ! public final class Math ! { ! private static Random random_; ! public static final double E = 2.7182818284590452354; ! public static final double PI = 3.14159265358979323846; ! public static native double sin (double x); ! public static native double cos (double x); ! public static native double tan (double x); - public static native double asin (double x); ! public static native double acos (double x); ! public static native double atan (double x); ! public static native double atan2(double y, double x); ! public static native double exp (double x); ! public static native double log (double x); ! public static native double sqrt (double x); ! public static native double pow (double x, double y); ! public static native double IEEEremainder (double x, double y); ! public static native double ceil (double x); ! public static native double floor (double x); ! public static native double rint (double x); ! public static native int round (float x); ! public static native long round (double x); ! ! public static synchronized double random () { ! if (random_ == null) ! random_ = new Random (); ! return random_.nextDouble (); } ! public static int abs (int n) { ! return (n < 0 ? -n : n); } ! public static long abs (long n) { ! return (n < 0 ? -n : n); } ! public static native float abs (float x); ! public static native double abs (double x); ! public static int min (int a, int b) { ! return (a < b ? a : b); } ! public static long min (long a, long b) { ! return (a < b ? a : b); } ! public static native float min (float a, float b); ! public static native double min (double a, double b); ! public static int max (int a, int b) { ! return (a < b ? b : a); } ! public static long max (long a, long b) { ! return (a < b ? b : a); } ! public static native float max (float a, float b); ! ! public static native double max (double a, double b); ! ! public static double toDegrees (double radians) { ! return radians * 180 / PI; } ! public static double toRadians (double degrees) { ! return degrees * PI / 180; } ! // Don't allow objects to be made. ! private Math () { } } - --- 1,643 ---- ! /* java.lang.Math -- common mathematical functions, native allowed ! Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.lang; ! import java.util.Random; ! import gnu.classpath.Configuration; ! /** ! * Helper class containing useful mathematical functions and constants. ! *

    ! * ! * Note that angles are specified in radians. Conversion functions are ! * provided for your convenience. ! * ! * @author Paul Fisher ! * @author John Keiser ! * @author Eric Blake ! * @since 1.0 ! */ ! public final class Math ! { ! /** ! * Math is non-instantiable ! */ ! private Math() ! { ! } ! static ! { ! if (Configuration.INIT_LOAD_LIBRARY) ! { ! System.loadLibrary("javalang"); ! } ! } ! /** ! * A random number generator, initialized on first use. ! */ ! private static Random rand; ! /** ! * The most accurate approximation to the mathematical constant e: ! * 2.718281828459045. Used in natural log and exp. ! * ! * @see #log(double) ! * @see #exp(double) ! */ ! public static final double E = 2.718281828459045; ! /** ! * The most accurate approximation to the mathematical constant pi: ! * 3.141592653589793. This is the ratio of a circle's diameter ! * to its circumference. ! */ ! public static final double PI = 3.141592653589793; ! /** ! * Take the absolute value of the argument. ! * (Absolute value means make it positive.) ! *

    ! * ! * Note that the the largest negative value (Integer.MIN_VALUE) cannot ! * be made positive. In this case, because of the rules of negation in ! * a computer, MIN_VALUE is what will be returned. ! * This is a negative value. You have been warned. ! * ! * @param i the number to take the absolute value of ! * @return the absolute value ! * @see Integer#MIN_VALUE ! */ ! public static int abs(int i) ! { ! return (i < 0) ? -i : i; ! } ! /** ! * Take the absolute value of the argument. ! * (Absolute value means make it positive.) ! *

    ! * ! * Note that the the largest negative value (Long.MIN_VALUE) cannot ! * be made positive. In this case, because of the rules of negation in ! * a computer, MIN_VALUE is what will be returned. ! * This is a negative value. You have been warned. ! * ! * @param l the number to take the absolute value of ! * @return the absolute value ! * @see Long#MIN_VALUE ! */ ! public static long abs(long l) ! { ! return (l < 0) ? -l : l; ! } ! /** ! * Take the absolute value of the argument. ! * (Absolute value means make it positive.) ! *

    ! * ! * This is equivalent, but faster than, calling ! * Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a)). ! * ! * @param f the number to take the absolute value of ! * @return the absolute value ! */ ! public static float abs(float f) ! { ! return (f <= 0) ? 0 - f : f; ! } ! /** ! * Take the absolute value of the argument. ! * (Absolute value means make it positive.) ! * ! * This is equivalent, but faster than, calling ! * Double.longBitsToDouble(Double.doubleToLongBits(a) ! * << 1) >>> 1);. ! * ! * @param d the number to take the absolute value of ! * @return the absolute value ! */ ! public static double abs(double d) ! { ! return (d <= 0) ? 0 - d : d; ! } ! /** ! * Return whichever argument is smaller. ! * ! * @param a the first number ! * @param b a second number ! * @return the smaller of the two numbers ! */ ! public static int min(int a, int b) ! { ! return (a < b) ? a : b; ! } ! /** ! * Return whichever argument is smaller. ! * ! * @param a the first number ! * @param b a second number ! * @return the smaller of the two numbers ! */ ! public static long min(long a, long b) { ! return (a < b) ? a : b; } ! /** ! * Return whichever argument is smaller. If either argument is NaN, the ! * result is NaN, and when comparing 0 and -0, -0 is always smaller. ! * ! * @param a the first number ! * @param b a second number ! * @return the smaller of the two numbers ! */ ! public static float min(float a, float b) { ! // this check for NaN, from JLS 15.21.1, saves a method call ! if (a != a) ! return a; ! // no need to check if b is NaN; < will work correctly ! // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special ! if (a == 0 && b == 0) ! return -(-a - b); ! return (a < b) ? a : b; } ! /** ! * Return whichever argument is smaller. If either argument is NaN, the ! * result is NaN, and when comparing 0 and -0, -0 is always smaller. ! * ! * @param a the first number ! * @param b a second number ! * @return the smaller of the two numbers ! */ ! public static double min(double a, double b) { ! // this check for NaN, from JLS 15.21.1, saves a method call ! if (a != a) ! return a; ! // no need to check if b is NaN; < will work correctly ! // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special ! if (a == 0 && b == 0) ! return -(-a - b); ! return (a < b) ? a : b; } ! /** ! * Return whichever argument is larger. ! * ! * @param a the first number ! * @param b a second number ! * @return the larger of the two numbers ! */ ! public static int max(int a, int b) ! { ! return (a > b) ? a : b; ! } ! /** ! * Return whichever argument is larger. ! * ! * @param a the first number ! * @param b a second number ! * @return the larger of the two numbers ! */ ! public static long max(long a, long b) ! { ! return (a > b) ? a : b; ! } ! /** ! * Return whichever argument is larger. If either argument is NaN, the ! * result is NaN, and when comparing 0 and -0, 0 is always larger. ! * ! * @param a the first number ! * @param b a second number ! * @return the larger of the two numbers ! */ ! public static float max(float a, float b) { ! // this check for NaN, from JLS 15.21.1, saves a method call ! if (a != a) ! return a; ! // no need to check if b is NaN; > will work correctly ! // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special ! if (a == 0 && b == 0) ! return a - -b; ! return (a > b) ? a : b; } ! /** ! * Return whichever argument is larger. If either argument is NaN, the ! * result is NaN, and when comparing 0 and -0, 0 is always larger. ! * ! * @param a the first number ! * @param b a second number ! * @return the larger of the two numbers ! */ ! public static double max(double a, double b) { ! // this check for NaN, from JLS 15.21.1, saves a method call ! if (a != a) ! return a; ! // no need to check if b is NaN; > will work correctly ! // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special ! if (a == 0 && b == 0) ! return a - -b; ! return (a > b) ? a : b; } ! /** ! * The trigonometric function sin. The sine of NaN or infinity is ! * NaN, and the sine of 0 retains its sign. This is accurate within 1 ulp, ! * and is semi-monotonic. ! * ! * @param a the angle (in radians) ! * @return sin(a) ! */ ! public native static double sin(double a); ! /** ! * The trigonometric function cos. The cosine of NaN or infinity is ! * NaN. This is accurate within 1 ulp, and is semi-monotonic. ! * ! * @param a the angle (in radians) ! * @return cos(a) ! */ ! public native static double cos(double a); ! /** ! * The trigonometric function tan. The tangent of NaN or infinity ! * is NaN, and the tangent of 0 retains its sign. This is accurate within 1 ! * ulp, and is semi-monotonic. ! * ! * @param a the angle (in radians) ! * @return tan(a) ! */ ! public native static double tan(double a); ! ! /** ! * The trigonometric function arcsin. The range of angles returned ! * is -pi/2 to pi/2 radians (-90 to 90 degrees). If the argument is NaN or ! * its absolute value is beyond 1, the result is NaN; and the arcsine of ! * 0 retains its sign. This is accurate within 1 ulp, and is semi-monotonic. ! * ! * @param a the sin to turn back into an angle ! * @return arcsin(a) ! */ ! public native static double asin(double a); ! ! /** ! * The trigonometric function arccos. The range of angles returned ! * is 0 to pi radians (0 to 180 degrees). If the argument is NaN or ! * its absolute value is beyond 1, the result is NaN. This is accurate ! * within 1 ulp, and is semi-monotonic. ! * ! * @param a the cos to turn back into an angle ! * @return arccos(a) ! */ ! public native static double acos(double a); ! ! /** ! * The trigonometric function arcsin. The range of angles returned ! * is -pi/2 to pi/2 radians (-90 to 90 degrees). If the argument is NaN, the ! * result is NaN; and the arctangent of 0 retains its sign. This is accurate ! * within 1 ulp, and is semi-monotonic. ! * ! * @param a the tan to turn back into an angle ! * @return arcsin(a) ! * @see #atan2(double, double) ! */ ! public native static double atan(double a); ! ! /** ! * A special version of the trigonometric function arctan, for ! * converting rectangular coordinates (x, y) to polar ! * (r, theta). This computes the arctangent of x/y in the range ! * of -pi to pi radians (-180 to 180 degrees). Special cases:

      ! *
    • If either argument is NaN, the result is NaN.
    • ! *
    • If the first argument is positive zero and the second argument is ! * positive, or the first argument is positive and finite and the second ! * argument is positive infinity, then the result is positive zero.
    • ! *
    • If the first argument is negative zero and the second argument is ! * positive, or the first argument is negative and finite and the second ! * argument is positive infinity, then the result is negative zero.
    • ! *
    • If the first argument is positive zero and the second argument is ! * negative, or the first argument is positive and finite and the second ! * argument is negative infinity, then the result is the double value ! * closest to pi.
    • ! *
    • If the first argument is negative zero and the second argument is ! * negative, or the first argument is negative and finite and the second ! * argument is negative infinity, then the result is the double value ! * closest to -pi.
    • ! *
    • If the first argument is positive and the second argument is ! * positive zero or negative zero, or the first argument is positive ! * infinity and the second argument is finite, then the result is the ! * double value closest to pi/2.
    • ! *
    • If the first argument is negative and the second argument is ! * positive zero or negative zero, or the first argument is negative ! * infinity and the second argument is finite, then the result is the ! * double value closest to -pi/2.
    • ! *
    • If both arguments are positive infinity, then the result is the ! * double value closest to pi/4.
    • ! *
    • If the first argument is positive infinity and the second argument ! * is negative infinity, then the result is the double value closest to ! * 3*pi/4.
    • ! *
    • If the first argument is negative infinity and the second argument ! * is positive infinity, then the result is the double value closest to ! * -pi/4.
    • ! *
    • If both arguments are negative infinity, then the result is the ! * double value closest to -3*pi/4.
    • ! * ! *

    This is accurate within 2 ulps, and is semi-monotonic. To get r, ! * use sqrt(x*x+y*y). ! * ! * @param y the y position ! * @param x the x position ! * @return theta in the conversion of (x, y) to (r, theta) ! * @see #atan(double) ! */ ! public native static double atan2(double y, double x); ! ! /** ! * Take ea. The opposite of log(). If the ! * argument is NaN, the result is NaN; if the argument is positive infinity, ! * the result is positive infinity; and if the argument is negative ! * infinity, the result is positive zero. This is accurate within 1 ulp, ! * and is semi-monotonic. ! * ! * @param a the number to raise to the power ! * @return the number raised to the power of e ! * @see #log(double) ! * @see #pow(double, double) ! */ ! public native static double exp(double a); ! ! /** ! * Take ln(a) (the natural log). The opposite of exp(). If the ! * argument is NaN or negative, the result is NaN; if the argument is ! * positive infinity, the result is positive infinity; and if the argument ! * is either zero, the result is negative infinity. This is accurate within ! * 1 ulp, and is semi-monotonic. ! * ! *

    Note that the way to get logb(a) is to do this: ! * ln(a) / ln(b). ! * ! * @param a the number to take the natural log of ! * @return the natural log of a ! * @see #exp(double) ! */ ! public native static double log(double a); ! ! /** ! * Take a square root. If the argument is NaN or negative, the result is ! * NaN; if the argument is positive infinity, the result is positive ! * infinity; and if the result is either zero, the result is the same. ! * This is accurate within the limits of doubles. ! * ! *

    For other roots, use pow(a, 1 / rootNumber). ! * ! * @param a the numeric argument ! * @return the square root of the argument ! * @see #pow(double, double) ! */ ! public native static double sqrt(double a); ! ! /** ! * Raise a number to a power. Special cases:

      ! *
    • If the second argument is positive or negative zero, then the result ! * is 1.0.
    • ! *
    • If the second argument is 1.0, then the result is the same as the ! * first argument.
    • ! *
    • If the second argument is NaN, then the result is NaN.
    • ! *
    • If the first argument is NaN and the second argument is nonzero, ! * then the result is NaN.
    • ! *
    • If the absolute value of the first argument is greater than 1 and ! * the second argument is positive infinity, or the absolute value of the ! * first argument is less than 1 and the second argument is negative ! * infinity, then the result is positive infinity.
    • ! *
    • If the absolute value of the first argument is greater than 1 and ! * the second argument is negative infinity, or the absolute value of the ! * first argument is less than 1 and the second argument is positive ! * infinity, then the result is positive zero.
    • ! *
    • If the absolute value of the first argument equals 1 and the second ! * argument is infinite, then the result is NaN.
    • ! *
    • If the first argument is positive zero and the second argument is ! * greater than zero, or the first argument is positive infinity and the ! * second argument is less than zero, then the result is positive zero.
    • ! *
    • If the first argument is positive zero and the second argument is ! * less than zero, or the first argument is positive infinity and the ! * second argument is greater than zero, then the result is positive ! * infinity.
    • ! *
    • If the first argument is negative zero and the second argument is ! * greater than zero but not a finite odd integer, or the first argument is ! * negative infinity and the second argument is less than zero but not a ! * finite odd integer, then the result is positive zero.
    • ! *
    • If the first argument is negative zero and the second argument is a ! * positive finite odd integer, or the first argument is negative infinity ! * and the second argument is a negative finite odd integer, then the result ! * is negative zero.
    • ! *
    • If the first argument is negative zero and the second argument is ! * less than zero but not a finite odd integer, or the first argument is ! * negative infinity and the second argument is greater than zero but not a ! * finite odd integer, then the result is positive infinity.
    • ! *
    • If the first argument is negative zero and the second argument is a ! * negative finite odd integer, or the first argument is negative infinity ! * and the second argument is a positive finite odd integer, then the result ! * is negative infinity.
    • ! *
    • If the first argument is less than zero and the second argument is a ! * finite even integer, then the result is equal to the result of raising ! * the absolute value of the first argument to the power of the second ! * argument.
    • ! *
    • If the first argument is less than zero and the second argument is a ! * finite odd integer, then the result is equal to the negative of the ! * result of raising the absolute value of the first argument to the power ! * of the second argument.
    • ! *
    • If the first argument is finite and less than zero and the second ! * argument is finite and not an integer, then the result is NaN.
    • ! *
    • If both arguments are integers, then the result is exactly equal to ! * the mathematical result of raising the first argument to the power of ! * the second argument if that result can in fact be represented exactly as ! * a double value.
    • ! * ! *

    (In the foregoing descriptions, a floating-point value is ! * considered to be an integer if and only if it is a fixed point of the ! * method {@link #ceil(double)} or, equivalently, a fixed point of the ! * method {@link #floor(double)}. A value is a fixed point of a one-argument ! * method if and only if the result of applying the method to the value is ! * equal to the value.) This is accurate within 1 ulp, and is semi-monotonic. ! * ! * @param a the number to raise ! * @param b the power to raise it to ! * @return ab ! */ ! public native static double pow(double a, double b); ! ! /** ! * Get the IEEE 754 floating point remainder on two numbers. This is the ! * value of x - y * n, where n is the closest ! * double to x / y (ties go to the even n); for a zero ! * remainder, the sign is that of x. If either argument is NaN, ! * the first argument is infinite, or the second argument is zero, the result ! * is NaN; if x is finite but y is infinte, the result is x. This is ! * accurate within the limits of doubles. ! * ! * @param x the dividend (the top half) ! * @param y the divisor (the bottom half) ! * @return the IEEE 754-defined floating point remainder of x/y ! * @see #rint(double) ! */ ! public native static double IEEEremainder(double x, double y); ! ! /** ! * Take the nearest integer that is that is greater than or equal to the ! * argument. If the argument is NaN, infinite, or zero, the result is the ! * same; if the argument is between -1 and 0, the result is negative zero. ! * Note that Math.ceil(x) == -Math.floor(-x). ! * ! * @param a the value to act upon ! * @return the nearest integer >= a ! */ ! public native static double ceil(double a); ! ! /** ! * Take the nearest integer that is that is less than or equal to the ! * argument. If the argument is NaN, infinite, or zero, the result is the ! * same. Note that Math.ceil(x) == -Math.floor(-x). ! * ! * @param a the value to act upon ! * @return the nearest integer <= a ! */ ! public native static double floor(double a); ! ! /** ! * Take the nearest integer to the argument. If it is exactly between ! * two integers, the even integer is taken. If the argument is NaN, ! * infinite, or zero, the result is the same. ! * ! * @param a the value to act upon ! * @return the nearest integer to a ! */ ! public native static double rint(double a); ! ! /** ! * Take the nearest integer to the argument. This is equivalent to ! * (int) Math.floor(a + 0.5f). If the argument is NaN, the result ! * is 0; otherwise if the argument is outside the range of int, the result ! * will be Integer.MIN_VALUE or Integer.MAX_VALUE, as appropriate. ! * ! * @param a the argument to round ! * @return the nearest integer to the argument ! * @see Integer#MIN_VALUE ! * @see Integer#MAX_VALUE ! */ ! public static int round(float a) { ! return (int) floor(a + 0.5f); } ! /** ! * Take the nearest long to the argument. This is equivalent to ! * (long) Math.floor(a + 0.5). If the argument is NaN, the ! * result is 0; otherwise if the argument is outside the range of long, the ! * result will be Long.MIN_VALUE or Long.MAX_VALUE, as appropriate. ! * ! * @param a the argument to round ! * @return the nearest long to the argument ! * @see Long#MIN_VALUE ! * @see Long#MAX_VALUE ! */ ! public static long round(double a) { ! return (long) floor(a + 0.5d); } ! /** ! * Get a random number. This behaves like Random.nextDouble(), seeded by ! * System.currentTimeMillis() when first called. In other words, the number ! * is from a pseudorandom sequence, and lies in the range [+0.0, 1.0). ! * This random sequence is only used by this method, and is threadsafe, ! * although you may want your own random number generator if it is shared ! * among threads. ! * ! * @return a random number ! * @see Random#nextDouble() ! * @see System#currentTimeMillis() ! */ ! public static synchronized double random() { ! if (rand == null) ! rand = new Random(); ! return rand.nextDouble(); } ! /** ! * Convert from degrees to radians. The formula for this is ! * radians = degrees * (pi/180); however it is not always exact given the ! * limitations of floating point numbers. ! * ! * @param degrees an angle in degrees ! * @return the angle in radians ! * @since 1.2 ! */ ! public static double toRadians(double degrees) { ! return degrees * (PI / 180); } ! /** ! * Convert from radians to degrees. The formula for this is ! * degrees = radians * (180/pi); however it is not always exact given the ! * limitations of floating point numbers. ! * ! * @param rads an angle in radians ! * @return the angle in degrees ! * @since 1.2 ! */ ! public static double toDegrees(double rads) { + return rads * (180 / PI); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NegativeArraySizeException.java gcc-3.1/libjava/java/lang/NegativeArraySizeException.java *** gcc-3.0.4/libjava/java/lang/NegativeArraySizeException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NegativeArraySizeException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class NegativeArraySizeException extends RuntimeException { public NegativeArraySizeException() ! { ! super(); ! } ! public NegativeArraySizeException(String msg) ! { ! super(msg); ! } } --- 1,79 ---- ! /* NegativeArraySizeException.java -- exception thrown when an attempt is ! made to create an array with a negative size. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Thrown when an attempt is made to create an array with a negative ! * size. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class NegativeArraySizeException extends RuntimeException { + static final long serialVersionUID = -8960118058596991861L; + + /** + * Create an exception without a message. + */ public NegativeArraySizeException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public NegativeArraySizeException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NoClassDefFoundError.java gcc-3.1/libjava/java/lang/NoClassDefFoundError.java *** gcc-3.0.4/libjava/java/lang/NoClassDefFoundError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NoClassDefFoundError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // NoClassDefFoundError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class NoClassDefFoundError extends LinkageError { ! public NoClassDefFoundError () ! { ! super (); ! } ! public NoClassDefFoundError (String msg) ! { ! super (msg); ! } } --- 1,80 ---- ! /* NoClassDefFoundError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * A NoClassDefFoundError is thrown when a classloader or the + * Java Virtual Machine tries to load a class and no definition of the class + * can be found. This could happen when using the new expression + * or during a normal method call. The reason this would occur at runtime is + * because the missing class definition existed when the currently executing + * class was compiled, but now that definition cannot be found. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class NoClassDefFoundError extends LinkageError { ! static final long serialVersionUID = 9095859863287012458L; ! /** ! * Create an error without a message. ! */ ! public NoClassDefFoundError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public NoClassDefFoundError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NoSuchFieldError.java gcc-3.1/libjava/java/lang/NoSuchFieldError.java *** gcc-3.0.4/libjava/java/lang/NoSuchFieldError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NoSuchFieldError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // NoSuchFieldError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class NoSuchFieldError extends IncompatibleClassChangeError { ! public NoSuchFieldError () ! { ! super (); ! } ! public NoSuchFieldError (String msg) ! { ! super (msg); ! } } --- 1,77 ---- ! /* NoSuchFieldError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * A NoSuchFieldError is thrown if an application attempts + * to access the field of an object and that object no longer has that + * field. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class NoSuchFieldError extends IncompatibleClassChangeError { ! static final long serialVersionUID = -3456430195886129035L; ! /** ! * Create an error without a message. ! */ ! public NoSuchFieldError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public NoSuchFieldError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NoSuchFieldException.java gcc-3.1/libjava/java/lang/NoSuchFieldException.java *** gcc-3.0.4/libjava/java/lang/NoSuchFieldException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NoSuchFieldException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class NoSuchFieldException extends Exception { public NoSuchFieldException() ! { ! super(); ! } ! public NoSuchFieldException(String msg) ! { ! super(msg); ! } } --- 1,78 ---- ! /* NoSuchFieldException.java -- exception thrown to indicate the class does ! not have the specified field. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Thrown to indicate the class does not have the specified field. ! * ! * @since JDK 1.1 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class NoSuchFieldException extends Exception { + static final long serialVersionUID = -6143714805279938260L; + + /** + * Create an exception without a message. + */ public NoSuchFieldException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public NoSuchFieldException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NoSuchMethodError.java gcc-3.1/libjava/java/lang/NoSuchMethodError.java *** gcc-3.0.4/libjava/java/lang/NoSuchMethodError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NoSuchMethodError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // NoSuchMethodError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class NoSuchMethodError extends IncompatibleClassChangeError { ! public NoSuchMethodError () ! { ! super (); ! } ! public NoSuchMethodError (String msg) ! { ! super (msg); ! } } --- 1,77 ---- ! /* NoSuchMethodError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * A NoSuchMethodError is thrown if an application attempts + * to access a method of a class, and that class no longer has that + * method. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class NoSuchMethodError extends IncompatibleClassChangeError { ! static final long serialVersionUID = -3765521442372831335L; ! /** ! * Create an error without a message. ! */ ! public NoSuchMethodError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public NoSuchMethodError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NoSuchMethodException.java gcc-3.1/libjava/java/lang/NoSuchMethodException.java *** gcc-3.0.4/libjava/java/lang/NoSuchMethodException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NoSuchMethodException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class NoSuchMethodException extends Exception { public NoSuchMethodException() ! { ! super(); ! } ! public NoSuchMethodException(String msg) ! { ! super(msg); ! } } --- 1,78 ---- ! /* NoSuchMethodException.java -- exception thrown to indicate the class ! does not have the specified method. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Thrown to indicate the class does not have the specified method. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class NoSuchMethodException extends Exception { + static final long serialVersionUID = 5034388446362600923L; + + /** + * Create an exception without a message. + */ public NoSuchMethodException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public NoSuchMethodException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NullPointerException.java gcc-3.1/libjava/java/lang/NullPointerException.java *** gcc-3.0.4/libjava/java/lang/NullPointerException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NullPointerException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class NullPointerException extends RuntimeException { public NullPointerException() ! { ! super(); ! } ! public NullPointerException(String msg) ! { ! super(msg); ! } } --- 1,79 ---- ! /* NullPointerException.java -- exception thrown when attempting to use null ! where an object is required. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Thrown when attempting to use null where an object ! * is required, such as when accessing an instance method of a null object. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class NullPointerException extends RuntimeException { + static final long serialVersionUID = 5162710183389028792L; + + /** + * Create an exception without a message. + */ public NullPointerException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public NullPointerException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Number.java gcc-3.1/libjava/java/lang/Number.java *** gcc-3.0.4/libjava/java/lang/Number.java Fri Sep 8 19:37:08 2000 --- gcc-3.1/libjava/java/lang/Number.java Tue Jan 22 22:40:16 2002 *************** *** 1,41 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; import java.io.Serializable; ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ ! public abstract class Number implements Serializable { ! public byte byteValue() // Became non-abstract in JDK 1.2 { return (byte) intValue(); } ! public abstract double doubleValue(); ! public abstract float floatValue(); ! public abstract int intValue(); ! public abstract long longValue(); ! ! public short shortValue() // Became non-abstract in JDK 1.2 { return (short) intValue(); } private static final long serialVersionUID = -8742448824652078965L; } --- 1,94 ---- ! /* java.lang.Number ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; import java.io.Serializable; ! /** ! ** Number is a generic superclass of all the numeric classes, namely ! ** Byte, Short, Integer, ! ** Long, Float, and Double. ! ** ! ** It provides ways to convert from any one value to any other. ! ** ! ** @author Paul Fisher ! ** @author John Keiser ! ** @author Warren Levy ! ** @since JDK1.0 ! **/ public abstract class Number implements Serializable { ! /** Return the value of this Number as a byte. ! ** @return the value of this Number as a byte. ! **/ ! public byte byteValue() { return (byte) intValue(); } ! /** Return the value of this Number as a short. ! ** @return the value of this Number as a short. ! **/ ! public short shortValue() { return (short) intValue(); } + /** Return the value of this Number as an int. + ** @return the value of this Number as an int. + **/ + public abstract int intValue(); + + /** Return the value of this Number as a long. + ** @return the value of this Number as a long. + **/ + public abstract long longValue(); + + /** Return the value of this Number as a float. + ** @return the value of this Number as a float. + **/ + public abstract float floatValue(); + + /** Return the value of this Number as a float. + ** @return the value of this Number as a float. + **/ + public abstract double doubleValue(); + private static final long serialVersionUID = -8742448824652078965L; } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/NumberFormatException.java gcc-3.1/libjava/java/lang/NumberFormatException.java *** gcc-3.0.4/libjava/java/lang/NumberFormatException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/NumberFormatException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class NumberFormatException extends IllegalArgumentException { public NumberFormatException() ! { ! super(); ! } ! public NumberFormatException(String msg) ! { ! super(msg); ! } } --- 1,80 ---- ! /* NumberFormatException.java -- exception may be thrown when attempting to ! convert a String to one of the numeric types, but the operation fails. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * Can be thrown when attempting to convert a String to ! * one of the numeric types, but the operation fails because the string ! * has the wrong format. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class NumberFormatException extends IllegalArgumentException { + static final long serialVersionUID = -2848938806368998894L; + + /** + * Create an exception without a message. + */ public NumberFormatException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public NumberFormatException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Object.h gcc-3.1/libjava/java/lang/Object.h *** gcc-3.0.4/libjava/java/lang/Object.h Wed Jan 17 10:22:32 2001 --- gcc-3.1/libjava/java/lang/Object.h Fri Dec 14 18:43:53 2001 *************** struct _JvObjectPrefix *** 21,28 **** { protected: // New ABI Compatibility Dummy, #1 and 2. ! virtual void nacd_1 (void) {}; // This slot really contains the Class pointer. ! virtual void nacd_2 (void) {}; // Actually the GC bitmap marking descriptor. }; class java::lang::Object : public _JvObjectPrefix --- 21,31 ---- { protected: // New ABI Compatibility Dummy, #1 and 2. ! virtual void nacd_1 (void) {}; // This slot really contains the Class pointer. ! // For IA64, the GC descriptor goes into the second word of the nacd1 descr. ! # ifndef __ia64__ ! virtual void nacd_2 (void) {}; // Actually the GC bitmap marking descriptor. ! # endif }; class java::lang::Object : public _JvObjectPrefix *************** public: *** 42,49 **** void wait (void); void wait (jlong timeout); ! friend jint _Jv_MonitorEnter (jobject obj); ! friend jint _Jv_MonitorExit (jobject obj); friend void _Jv_InitializeSyncMutex (void); friend void _Jv_FinalizeObject (jobject obj); --- 45,52 ---- void wait (void); void wait (jlong timeout); ! friend void _Jv_MonitorEnter (jobject obj); ! friend void _Jv_MonitorExit (jobject obj); friend void _Jv_InitializeSyncMutex (void); friend void _Jv_FinalizeObject (jobject obj); *************** private: *** 63,72 **** // This does not actually refer to a Java object. Instead it is a // placeholder for a piece of internal data (the synchronization // information). ! jobject sync_info; ! // Initialize the sync_info field. ! void sync_init (void); }; #endif /* __JAVA_LANG_OBJECT_H__ */ --- 66,77 ---- // This does not actually refer to a Java object. Instead it is a // placeholder for a piece of internal data (the synchronization // information). ! # ifndef JV_HASH_SYNCHRONIZATION ! jobject sync_info; ! # endif ! // Initialize the sync_info field. Not called with JV_HASH_SYNCHRONIZATION. ! void sync_init (void); }; #endif /* __JAVA_LANG_OBJECT_H__ */ diff -Nrc3pad gcc-3.0.4/libjava/java/lang/OutOfMemoryError.java gcc-3.1/libjava/java/lang/OutOfMemoryError.java *** gcc-3.0.4/libjava/java/lang/OutOfMemoryError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/OutOfMemoryError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // OutOfMemoryError.java ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class OutOfMemoryError extends VirtualMachineError { ! public OutOfMemoryError () ! { ! super (); ! } ! public OutOfMemoryError (String msg) ! { ! super (msg); ! } } --- 1,77 ---- ! /* OutOfMemoryError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * When the Java Virtual Machine is unable to allocate an object because it + * is out of memory and no more memory could be made available by the + * garbage collector an OutOfMemoryError is thrown. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class OutOfMemoryError extends VirtualMachineError { ! static final long serialVersionUID = 8228564086184010517L; ! /** ! * Create an error without a message. ! */ ! public OutOfMemoryError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public OutOfMemoryError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Package.java gcc-3.1/libjava/java/lang/Package.java *** gcc-3.0.4/libjava/java/lang/Package.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/Package.java Tue Jan 22 22:40:16 2002 *************** *** 0 **** --- 1,298 ---- + /* java.lang.Package - Everything you ever wanted to know about a package. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; + + import java.net.URL; + import java.util.NoSuchElementException; + import java.util.StringTokenizer; + + /** + * Everything you ever wanted to know about a package. This class makes it + * possible to attach specification and implementation information to a + * package as explained in the + * Package Versioning Specification + * section of the + * Product Versioning Specification. + * It also allows packages to be sealed with respect to the originating URL. + *

    + * The most useful method is the isCompatibleWith() method that + * compares a desired version of a specification with the version of the + * specification as implemented by a package. A package is considered + * compatible with another version if the version of the specification is + * equal or higher then the requested version. Version numbers are represented + * as strings of positive numbers separated by dots (e.g. "1.2.0"). + * The first number is called the major number, the second the minor, + * the third the micro, etc. A version is considered higher then another + * version if it has a bigger major number then the another version or when + * the major numbers of the versions are equal if it has a bigger minor number + * then the other version, etc. (If a version has no minor, micro, etc numbers + * then they are considered the be 0.) + * + * @since 1.2 + * @author Mark Wielaard (mark@klomp.org) + */ + public class Package + { + /** The name of the Package */ + final private String name; + + /** The name if the implementation */ + final private String implTitle; + /** The vendor that wrote this implementation */ + final private String implVendor; + /** The version of this implementation */ + final private String implVersion; + + /** The name of the specification */ + final private String specTitle; + /** The name of the specification designer */ + final private String specVendor; + /** The version of this specification */ + final private String specVersion; + + /** If sealed the origin of the package classes, otherwise null */ + final private URL sealed; + + /** + * A package local constructor for the Package class. + * All parameters except the name of the package may be + * null. + * There are no public constructors defined for Package this is a package + * local constructor that is used by java.lang.Classloader.definePackage(). + * + * @param name The name of the Package + * @param specTitle The name of the specification + * @param specVendor The name of the specification designer + * @param specVersion The version of this specification + * @param implTitle The name of the implementation + * @param implVendor The vendor that wrote this implementation + * @param implVersion The version of this implementation + * @param sealed If sealed the origin of the package classes + */ + Package(String name, + String specTitle, String specVendor, String specVersion, + String implTitle, String implVendor, String implVersion, URL sealed) + { + if (name == null) + throw new IllegalArgumentException("null Package name"); + + this.name = name; + + this.implTitle = implTitle; + this.implVendor = implVendor; + this.implVersion = implVersion; + + this.specTitle = specTitle; + this.specVendor = specVendor; + this.specVersion = specVersion; + + this.sealed = sealed; + } + + /** + * Returns the Package name. + */ + public String getName() + { + return name; + } + + /** + * Returns the name of the implementation or null if unknown. + */ + public String getImplementationTitle() + { + return implTitle; + } + + /** + * Returns the vendor that wrote this implementation or null if unknown. + */ + public String getImplementationVendor() + { + return implVendor; + } + + /** + * Returns the version of this implementation or null if unknown. + */ + public String getImplementationVersion() + { + return implVersion; + } + + /** + * Returns the name of the specification or null if unknown. + */ + public String getSpecificationTitle() + { + return specTitle; + } + + /** + * Returns the name of the specification designer or null if unknown. + */ + public String getSpecificationVendor() + { + return specVendor; + } + + /** + * Returns the version of the specification or null if unknown. + */ + public String getSpecificationVersion() + { + return specVersion; + } + + /** + * Returns true if this Package is sealed. + */ + public boolean isSealed() + { + return (sealed != null); + } + + /** + * Returns true if this Package is sealed and the origin of the classes is + * the given URL. + * + * @param url + */ + public boolean isSealed(URL url) + { + return url.equals(sealed); + } + + /** + * Checks if the version of the specification is higher or at least as high + * as the desired version. + * @param version the (minimal) desired version of the specification + * @exception NumberFormatException when either version or the + * specification version is not a correctly formatted version number + * @exception NullPointerException if the supplied version or the + * Package specification version is null. + */ + public boolean isCompatibleWith(String version) throws NumberFormatException + { + StringTokenizer versionTokens = new StringTokenizer(version, "."); + StringTokenizer specTokens = new StringTokenizer(specVersion, "."); + try + { + while (versionTokens.hasMoreElements()) + { + int vers = Integer.parseInt(versionTokens.nextToken()); + int spec = Integer.parseInt(specTokens.nextToken()); + if (spec < vers) + return false; + else if (spec > vers) + return true; + // They must be equal, next Token please! + } + } + catch (NoSuchElementException e) + { + // this must have been thrown by spec.netToken() so return false + return false; + } + + // They must have been exactly the same version. + // Or the specVersion has more subversions. That is also good. + return true; + } + + /** + * Returns the named package if it is known by the callers class loader. + * It may return null if the package is unknown, when there is no + * information on that particular package available or when the callers + * classloader is null. + * @param name the name of the desired package + */ + public static Package getPackage(String name) + { + // Get the caller's classloader + SecurityManager sm = System.getSecurityManager(); + Class c = sm.getClassContext()[1]; + ClassLoader cl = c.getClassLoader(); + + if (cl != null) + return cl.getPackage(name); + else + return null; + } + + /** + * Returns all the packages that are known to the callers class loader. + * It may return an empty array if the classloader of the caller is null. + */ + public static Package[] getPackages() + { + // Get the caller's classloader + SecurityManager sm = System.getSecurityManager(); + Class c = sm.getClassContext()[1]; + ClassLoader cl = c.getClassLoader(); + + if (cl != null) + return cl.getPackages(); + else + return new Package[0]; + } + + /** + * Returns the hashCode of the name of this package. + */ + public int hashCode() + { + return name.hashCode(); + } + + /** + * Returns a string representation of this package name, specification, + * implementation and class origin if sealed. + */ + public String toString() + { + return "package: " + name + + " spec: " + specTitle + + " version: " + specVersion + + " vendor: " + specVendor + + " implementation: " + implTitle + + " version: " + implVersion + + " vendor: " + implVendor + " sealed: " + sealed; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/PosixProcess.java gcc-3.1/libjava/java/lang/PosixProcess.java *** gcc-3.0.4/libjava/java/lang/PosixProcess.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/PosixProcess.java Mon Sep 24 04:51:50 2001 *************** import java.io.IOException; *** 26,32 **** final class ConcreteProcess extends Process { public native void destroy (); ! public native int exitValue (); public InputStream getErrorStream () { --- 26,38 ---- final class ConcreteProcess extends Process { public native void destroy (); ! ! public int exitValue () ! { ! if (! hasExited) ! throw new IllegalThreadStateException("Process has not exited"); ! return status; ! } public InputStream getErrorStream () { diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Process.java gcc-3.1/libjava/java/lang/Process.java *** gcc-3.0.4/libjava/java/lang/Process.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Process.java Tue Jan 22 22:40:16 2002 *************** *** 1,30 **** ! // Process.java - Represent spawned system process. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.lang; - import java.io.*; ! /** ! * @author Tom Tromey ! * @date October 23, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 */ public abstract class Process { ! abstract public void destroy (); ! abstract public int exitValue (); ! abstract public InputStream getErrorStream (); ! abstract public InputStream getInputStream (); ! abstract public OutputStream getOutputStream (); ! abstract public int waitFor () throws InterruptedException; } --- 1,117 ---- ! /* Process.java - Represent spawned system process. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; ! import java.io.OutputStream; ! import java.io.InputStream; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 */ + /** + * An instance of a subclass of Process is created by the + * Runtime.exec methods. Methods in Process + * provide a means to send input to a process, obtain the output from a + * subprocess, destroy a subprocess, obtain the exit value from a + * subprocess, and wait for a subprocess to complete. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + */ public abstract class Process { ! /** ! * Empty constructor does nothing. ! */ ! public Process() { } ! ! /** ! * Obtain the output stream of the subprocess. It may help to ! * associate this stream as the redirected STDIN file descriptor of ! * the subprocess. ! */ ! public abstract OutputStream getOutputStream(); ! ! /** ! * Obtain the input stream of the subprocess. It may help to ! * associate this stream as the redirected STDOUT file descriptor of ! * the subprocess. ! */ ! public abstract InputStream getInputStream(); ! ! /** ! * Obtain the error input stream of the subprocess. It may help to ! * associate this stream as the redirected STDERR file descriptor of ! * the subprocess. ! */ ! public abstract InputStream getErrorStream(); ! ! /** ! * The thread calling waitFor will block until the subprocess ! * has terminated. If the process has already terminated then the method ! * immediately returns with the exit value of the subprocess. ! * ! * @returns the exit value of the subprocess. A return of 0 ! * denotes normal process termination by convention. ! * ! * @throws InterruptedException is thrown if another thread interrupts ! * the waiting thread. The waiting thread stops waiting. ! */ ! public abstract int waitFor() ! throws InterruptedException; ! ! /** ! * When a process terminates there is associated with that termination ! * an exit value for the process to indicate why it terminated. A return ! * of 0 denotes normal process termination by convention. ! * ! * @returns the exit value of the subprocess. ! * @throws IllegalThreadStateException is thrown if the subprocess ! * represented by the subclass of this class has not yet terminated. ! */ ! public abstract int exitValue(); ! ! /** ! * Kills the subprocess and all of its children forcibly. ! */ ! public abstract void destroy(); ! } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Runnable.java gcc-3.1/libjava/java/lang/Runnable.java *** gcc-3.0.4/libjava/java/lang/Runnable.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Runnable.java Tue Jan 22 22:40:16 2002 *************** *** 1,19 **** ! // Runnable.java - Runnable interface. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.lang; ! /** ! * @author Tom Tromey ! * @date August 25, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 --- 1,42 ---- ! /* java.lang.Runnable ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.lang; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 *************** package java.lang; *** 21,27 **** * Status: Complete. */ public interface Runnable { ! public abstract void run (); } --- 44,65 ---- * Status: Complete. */ + /** + * Runnable is an interface you implement to indicate that your class can be + * executed as the main part of a Thread, among other places. When you want + * an entry point to run a piece of code, implement this interface and + * override run. + * + * @author Paul Fisher + * @author Tom Tromey + */ + public interface Runnable { ! /** ! * This method will be called by whoever wishes to run your class ! * implementing Runnable. ! * @since JDK1.0 ! */ ! void run(); } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/RuntimeException.java gcc-3.1/libjava/java/lang/RuntimeException.java *** gcc-3.0.4/libjava/java/lang/RuntimeException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/RuntimeException.java Tue Jan 22 22:40:16 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class RuntimeException extends Exception { public RuntimeException() ! { ! super(); ! } ! public RuntimeException(String msg) ! { ! super(msg); ! } } --- 1,81 ---- ! /* RuntimeException.java -- all exceptions which are subclasses of this class ! can be thrown at any time during the execution of a Java virtual machine. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * All exceptions which are subclasses of RuntimeException ! * can be thrown at any time during the execution of a Java virtual machine. ! * Methods which throw these exceptions are not required to declare them ! * in their throws clause. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class RuntimeException extends Exception { + static final long serialVersionUID = -7034897190745766939L; + + /** + * Create an exception without a message. + */ public RuntimeException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public RuntimeException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/RuntimePermission.java gcc-3.1/libjava/java/lang/RuntimePermission.java *** gcc-3.0.4/libjava/java/lang/RuntimePermission.java Fri Dec 15 06:13:35 2000 --- gcc-3.1/libjava/java/lang/RuntimePermission.java Tue Jan 22 22:40:16 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; diff -Nrc3pad gcc-3.0.4/libjava/java/lang/SecurityException.java gcc-3.1/libjava/java/lang/SecurityException.java *** gcc-3.0.4/libjava/java/lang/SecurityException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/SecurityException.java Tue Jan 22 22:40:16 2002 *************** *** 1,31 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class SecurityException extends RuntimeException { public SecurityException() ! { ! super(); ! } ! public SecurityException(String msg) ! { ! super(msg); ! } } --- 1,79 ---- ! /* SecurityException.java -- exception thrown to indicate a security ! violation. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * The security manager will throw this exception to indicate a security ! * violation. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class SecurityException extends RuntimeException { + static final long serialVersionUID = 6878364983674394167L; + + /** + * Create an exception without a message. + */ public SecurityException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public SecurityException(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/SecurityManager.java gcc-3.1/libjava/java/lang/SecurityManager.java *** gcc-3.0.4/libjava/java/lang/SecurityManager.java Fri May 19 17:55:32 2000 --- gcc-3.1/libjava/java/lang/SecurityManager.java Tue Jan 22 22:40:16 2002 *************** *** 1,268 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! // SecurityManager ! package java.lang; ! /** ! * @author Anthony Green ! * @date October 5, 1998. ! */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - */ ! import java.io.*; ! import java.net.*; ! public abstract class SecurityManager ! { ! protected boolean inCheck = false; ! public void checkAccept (String host, int port) ! { ! throw new SecurityException(); ! } ! public void checkAccess (Thread thrd) ! { ! throw new SecurityException(); ! } ! public void checkAccess (ThreadGroup thrdGroup) ! { ! throw new SecurityException(); ! } ! public void checkAwtEventQueueAccess () ! { ! throw new SecurityException(); ! } ! public void checkConnect (String host, int prt) ! { ! throw new SecurityException(); ! } ! public void checkConnect (String host, int prt, Object ctx) ! { ! throw new SecurityException(); ! } ! public void checkCreateClassLoader () ! { ! throw new SecurityException(); ! } - public void checkDelete (String fileName) - { - throw new SecurityException(); - } ! public void checkExec (String prog) ! { ! throw new SecurityException(); ! } ! public void checkExit (int stat) ! { ! throw new SecurityException(); ! } ! public void checkLink (String lib) ! { ! throw new SecurityException(); ! } ! public void checkListen (int lport) ! { ! throw new SecurityException(); ! } ! public void checkMemberAccess (Class cl, int mtype) ! { ! throw new SecurityException(); ! } ! public void checkMulticast (InetAddress maddr) ! { ! throw new SecurityException(); ! } ! public void checkMulticast (InetAddress maddr, byte ttl) ! { ! throw new SecurityException(); ! } ! public void checkPackageAccess (String pkg) ! { ! throw new SecurityException(); ! } ! public void checkPackageDefinition (String pkg) ! { ! throw new SecurityException(); ! } ! public void checkPermission (java.security.Permission perm) ! { ! throw new SecurityException(); ! } ! public void checkPrintJobAccess () ! { ! throw new SecurityException(); ! } ! public void checkPropertiesAccess () ! { ! throw new SecurityException(); ! } ! public void checkPropertyAccess (String prop) ! { ! throw new SecurityException(); ! } ! public void checkPropertyAccess (String prop, String defval) ! { ! throw new SecurityException(); ! } ! public void checkRead (FileDescriptor fd) ! { ! throw new SecurityException(); ! } ! public void checkRead (String fileName) ! { ! throw new SecurityException(); ! } ! public void checkRead (String fileName, Object ctx) ! { ! throw new SecurityException(); ! } ! public void checkSecurityAccess (String action) ! { ! throw new SecurityException(); ! } ! public void checkSetFactory () ! { ! throw new SecurityException(); ! } ! public void checkSystemClipboardAccess () ! { ! throw new SecurityException(); ! } ! public boolean checkTopLevelWindow (Object window) ! { ! throw new SecurityException(); ! } ! public void checkWrite (FileDescriptor fd) ! { ! throw new SecurityException(); ! } ! public void checkWrite (String fileName) ! { ! throw new SecurityException(); ! } ! // Note: this method is deprecated in JDK 1.2 ! protected /* native */ int classDepth (String className) ! { ! Class[] classStack = getClassContext (); ! for (int i = 0; i < classStack.length; i++) ! if (classStack[i].getName().compareTo(className) == 0) ! return i; ! return -1; ! } ! // Note: this method is deprecated in JDK 1.2 ! protected /* native */ int classLoaderDepth () ! { ! Class[] classStack = getClassContext (); ! for (int i = 0; i < classStack.length; i++) ! if (classStack[i].getClassLoader() != null) ! return i; ! return -1; ! } ! protected /* native */ ClassLoader currentClassLoader () ! { ! Class[] classStack = getClassContext (); ! for (int i = 0; i < classStack.length; i++) ! { ! ClassLoader loader = classStack[i].getClassLoader(); ! if (loader != null) ! return loader; } ! return null; ! } ! protected /* native */ Class currentLoadedClass () ! { ! Class[] classStack = getClassContext (); ! for (int i = 0; i < classStack.length; i++) ! { ! ClassLoader loader = classStack[i].getClassLoader(); ! if (loader != null) ! return classStack[i]; } - - return null; - } ! protected /* native */ Class[] getClassContext () ! { ! return new Class[0]; ! } ! // Note: this method is deprecated in JDK 1.2 ! public boolean getInCheck () ! { ! return inCheck; ! } ! public Object getSecurityContext () ! { ! // FIXME: This has yet to be implemented. ! return new String(""); ! } ! public ThreadGroup getThreadGroup () ! { ! return Thread.currentThread().getThreadGroup(); ! } ! protected boolean inClass (String className) ! { ! return (classDepth (className) != -1); ! } ! protected boolean inClassLoader () ! { ! return (classLoaderDepth () != -1); ! } ! protected SecurityManager () ! { ! if (System.getSecurityManager () != null) ! throw new SecurityException (); ! } } --- 1,776 ---- ! /* java.lang.SecurityManager ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.lang; ! import java.net.*; ! import java.util.*; ! import java.io.*; ! /** ! ** SecurityManager is a class you can extend to create ! ** your own Java security policy. By default, there is ! ** no SecurityManager installed in 1.1, which means that ! ** all things are permitted to all people.

    ! ** ! ** The default methods in this class deny all ! ** things to all people. ! ** ! ** @author John Keiser ! ** @version 1.1.0, 31 May 1998 ! ** @since JDK1.0 ! **/ ! public class SecurityManager { ! /** Tells whether or not the SecurityManager is currently ! ** performing a security check. ! **/ ! protected boolean inCheck; ! /** Tells whether or not the SecurityManager is currently ! ** performing a security check. ! ** ! ** @return whether or not the SecurityManager is ! ** currently performing a security check. ! **/ ! public boolean getInCheck() { ! return inCheck; ! } ! /** Get a list of all the classes currently executing ! ** methods on the Java stack. getClassContext()[0] is ! ** the currently executing method ! ** Spec Note: does not say whether ! ** the stack will include the getClassContext() call or ! ** the one just before it. ! ** ! ** @return an array containing all the methods on classes ! ** on the Java execution stack. ! **/ ! protected Class[] getClassContext() { ! return VMSecurityManager.getClassContext(); ! } ! /** Find the ClassLoader for the most recent class on the ! ** stack that was loaded by an explicit ClassLoader. If ! ** everything on the stack was loaded by the system ! ** classloader, null is returned. ! ** ! ** @return the most recent ClassLoader on the execution ! ** stack. ! **/ ! protected ClassLoader currentClassLoader() { ! return VMSecurityManager.currentClassLoader(); ! } ! /** Find the most recent class on the stack that was ! ** loaded by an explicit ClassLoader. If everything on ! ** the stack was loaded by the system classloader, null ! ** is returned. ! ** ! ** @return the most recent loaded Class on the execution ! ** stack. ! **/ ! protected Class currentLoadedClass() { ! Class[] c = getClassContext(); ! for(int i=0;i ! ** ! ** Currently the only methods that use this are checkRead() ! ** and checkConnect(). ! ** ! ** @see checkConnect(java.lang.String,int,java.lang.Object) ! ** @see checkRead(java.lang.String,java.lang.Object) ! **/ ! public Object getSecurityContext() { ! return new SecurityContext(getClassContext()); ! } ! /** Check if the current thread is allowed to create a ! ** ClassLoader.

    ! ** ! ** This method is called from ClassLoader.ClassLoader(), ! ** in other words, whenever a ClassLoader is created.

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.ClassLoader#ClassLoader() ! **/ ! public void checkCreateClassLoader() { ! throw new SecurityException("Cannot create new ClassLoaders."); ! } ! /** Check if the current thread is allowed to modify this ! ** other Thread.

    ! ** ! ** Called by Thread.stop(), suspend(), resume(), and ! ** interrupt(), destroy(), setPriority(), setName() and ! ** setDaemon().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param g the Thread to check against ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.Thread#stop() ! ** @see java.lang.Thread#suspend() ! ** @see java.lang.Thread#resume() ! ** @see java.lang.Thread#interrupt() ! ** @see java.lang.Thread#destroy() ! ** @see java.lang.Thread#setPriority(int) ! ** @see java.lang.Thread#setName(java.lang.String) ! ** @see java.lang.Thread#setDaemon(boolean) ! **/ ! public void checkAccess(Thread t) { ! throw new SecurityException("Cannot modify Threads."); ! } ! /** Check if the current thread is allowed to modify this ! ** ThreadGroup.

    ! ** ! ** Called by Thread.Thread() (to add a thread to the ! ** ThreadGroup), ThreadGroup.ThreadGroup() (to add this ! ** ThreadGroup to a parent), ThreadGroup.stop(), ! ** suspend(), resume(), interrupt(), destroy(), ! ** setDaemon(), and setMaxPriority().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param g the ThreadGroup to check against ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.Thread#Thread() ! ** @see java.lang.ThreadGroup#ThreadGroup() ! ** @see java.lang.ThreadGroup#stop() ! ** @see java.lang.ThreadGroup#suspend() ! ** @see java.lang.ThreadGroup#resume() ! ** @see java.lang.ThreadGroup#interrupt() ! ** @see java.lang.ThreadGroup#setDaemon(boolean) ! ** @see java.lang.ThreadGroup#setMaxPriority(int) ! **/ ! public void checkAccess(ThreadGroup g) { ! throw new SecurityException("Cannot modify ThreadGroups."); ! } ! /** Check if the current thread is allowed to exit the ! ** JVM with the given status.

    ! ** ! ** This method is called from Runtime.exit().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param status the status to exit with ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.Runtime#exit() ! ** @see java.lang.Runtime#exit(int) ! **/ ! public void checkExit(int status) { ! throw new SecurityException("Cannot exit JVM."); ! } ! /** Check if the current thread is allowed to execute the ! ** given program.

    ! ** ! ** This method is called from Runtime.exec().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param program the name of the program to exec ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.Runtime#exec(java.lang.String[],java.lang.String[]) ! **/ ! public void checkExec(String program) { ! throw new SecurityException("Cannot execute programs."); ! } ! /** Check if the current thread is allowed to link in the ! ** given native library.

    ! ** ! ** This method is called from Runtime.load() (and hence, ! ** by loadLibrary() as well).

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param filename the full name of the library to load ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.Runtime#load(java.lang.String) ! **/ ! public void checkLink(String filename) { ! throw new SecurityException("Cannot link native libraries."); ! } ! /** Check if the current thread is allowed to read the ! ** given file using the FileDescriptor.

    ! ** ! ** This method is called from ! ** FileInputStream.FileInputStream().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param desc the FileDescriptor representing the file ! ** to access ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.io.FileInputStream#FileInputStream(java.io.FileDescriptor) ! **/ ! public void checkRead(FileDescriptor desc) { ! throw new SecurityException("Cannot read files via file descriptors."); ! } ! /** Check if the current thread is allowed to read the ! ** given file.

    ! ** ! ** This method is called from ! ** FileInputStream.FileInputStream(), ! ** RandomAccessFile.RandomAccessFile(), File.exists(), ! ** canRead(), isFile(), isDirectory(), lastModified(), ! ** length() and list().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param filename the full name of the file to access ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.io.File ! ** @see java.io.FileInputStream#FileInputStream(java.lang.String) ! ** @see java.io.RandomAccessFile#RandomAccessFile(java.lang.String) ! **/ ! public void checkRead(String filename) { ! throw new SecurityException("Cannot read files via file names."); ! } ! /** Check if the current thread is allowed to read the ! ** given file. using the given SecurityContext.

    ! ** ! ** I know of no core class that calls this method.

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param filename the full name of the file to access ! ** @param securityContext the Security Context to ! ** determine access for. ! ** @exception SecurityException if the operation is not ! ** permitted. ! **/ ! public void checkRead(String filename, Object securityContext) { ! throw new SecurityException("Cannot read files via file names."); ! } ! /** Check if the current thread is allowed to write to the ! ** given file using the FileDescriptor.

    ! ** ! ** This method is called from ! ** FileOutputStream.FileOutputStream().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param desc the FileDescriptor representing the file ! ** to access ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.io.FileOutputStream#FileOutputStream(java.io.FileDescriptor) ! **/ ! public void checkWrite(FileDescriptor desc) { ! throw new SecurityException("Cannot write files via file descriptors."); ! } ! /** Check if the current thread is allowed to write to the ! ** given file.

    ! ** ! ** This method is called from ! ** FileOutputStream.FileOutputStream(), ! ** RandomAccessFile.RandomAccessFile(), ! ** File.canWrite(), mkdir(), and renameTo().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param filename the full name of the file to access ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.io.File#canWrite() ! ** @see java.io.File#mkdir() ! ** @see java.io.File#renameTo() ! ** @see java.io.FileOutputStream#FileOutputStream(java.lang.String) ! ** @see java.io.RandomAccessFile#RandomAccessFile(java.lang.String) ! **/ ! public void checkWrite(String filename) { ! throw new SecurityException("Cannot write files via file names."); ! } ! /** Check if the current thread is allowed to delete the ! ** given file.

    ! ** ! ** This method is called from File.delete().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param filename the full name of the file to delete ! ** @exception SecurityException if th operation is not ! ** permitted. ! ** @see java.io.File#delete() ! **/ ! public void checkDelete(String filename) { ! throw new SecurityException("Cannot delete files."); ! } ! /** Check if the current thread is allowed to connect to a ! ** given host on a given port.

    ! ** ! ** This method is called from Socket.Socket(). ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param host the host to connect to ! ** @param port the port to connect on ! ** @exception SecurityException if the operation is not ! ** permitted ! ** @see java.net.Socket#Socket() ! **/ ! public void checkConnect(String host, int port) { ! throw new SecurityException("Cannot make network connections."); ! } ! /** Check if the current thread is allowed to connect to a ! ** given host on a given port using a specific security ! ** context to determine access.

    ! ** ! ** This method is not called in the 1.1 core classes.

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param host the host to connect to ! ** @param port the port to connect on ! ** @param securityContext the security context to ! ** determine access with ! ** @exception SecurityException if the operation is not ! ** permitted ! **/ ! public void checkConnect(String host, int port, Object securityContext) { ! throw new SecurityException("Cannot make network connections."); ! } ! /** Check if the current thread is allowed to listen to a ! ** specific port for data.

    ! ** ! ** This method is called by ServerSocket.ServerSocket().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param port the port to listen on ! ** @exception SecurityException if the operation is not ! ** permitted ! ** @see java.net.ServerSocket#ServerSocket(int) ! **/ ! public void checkListen(int port) { ! throw new SecurityException("Cannot listen for connections."); ! } ! /** Check if the current thread is allowed to accept a ! ** connection from a particular host on a particular ! ** port.

    ! ** ! ** This method is called by ServerSocket.implAccept().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param host the host which wishes to connect ! ** @param port the port the connection will be on ! ** @exception SecurityException if the operation is not ! ** permitted ! ** @see java.net.ServerSocket#accept() ! **/ ! public void checkAccept(String host, int port) { ! throw new SecurityException("Cannot accept connections."); ! } ! /** Check if the current thread is allowed to read and ! ** write multicast to a particular address.

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @XXX where is it called? ! ** ! ** @param addr the address to multicast to. ! ** @exception SecurityException if the operation is not ! ** permitted. ! **/ ! public void checkMulticast(InetAddress addr) { ! throw new SecurityException("Cannot read or write multicast."); ! } ! /** Check if the current thread is allowed to read and ! ** write multicast to a particular address with a ! ** particular ttl value.

    ! ** ! ** SecurityManager's implementation always denies access.

    ! ** ! ** @XXX where is it called? ! ** ! ** @XXX what the hell is ttl? Expand abbreviation. ! ** ! ** @param addr the address to multicast to. ! ** @param ttl the ttl value to use ! ** @exception SecurityException if the operation is not ! ** permitted. ! **/ ! public void checkMulticast(InetAddress addr, byte ttl) { ! throw new SecurityException("Cannot read or write multicast."); ! } ! /** ! ** Check if the current thread is allowed to perform an ! ** operation that requires the specified Permission. ! ** ! ** @param perm The Permission required. ! ** @exception SecurityException If the operation is not allowed. ! **/ ! public void checkPermission(java.security.Permission perm) { ! throw new SecurityException("Operation not allowed"); ! } ! /** ! ** Check if the current thread is allowed to perform an ! ** operation that requires the specified Permission. ! ** ! ** @param perm The Permission required. ! ** @param context A security context ! ** @exception SecurityException If the operation is not allowed. ! ** @since 1.2 ! **/ ! public void checkPermission(java.security.Permission perm, ! Object context) { ! throw new SecurityException("Operation not allowed"); ! } ! /** Check if the current thread is allowed to read or ! ** write all the system properties at once.

    ! ** ! ** This method is called by System.getProperties() ! ** and setProperties().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.System#getProperties() ! ** @see java.lang.System#setProperties(java.util.Properties) ! **/ ! public void checkPropertiesAccess() { ! throw new SecurityException("Cannot access all system properties at once."); ! } ! /** Check if the current thread is allowed to read or ! ** write a particular system property.

    ! ** ! ** This method is called by System.getProperty() and ! ** setProperty().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @exception SecurityException is the operation is not ! ** permitted. ! ** @see java.lang.System#getProperty(java.lang.String) ! ** @see java.lang.System#setProperty(java.lang.String,java.lang.String) ! **/ ! public void checkPropertyAccess(String name) { ! throw new SecurityException("Cannot access individual system properties."); ! } ! /** Check if the current thread is allowed to create a ! ** top-level window. If it is not, the operation should ! ** still go through, but some sort of nonremovable ! ** warning should be placed on the window to show that it ! ** is untrusted.

    ! ** ! ** This method is called by Window.Window().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param window the window to create ! ** @see java.awt.Window#Window(java.awt.Frame) ! **/ ! public boolean checkTopLevelWindow(Object window) { ! return false; ! } ! /** Check if the current thread is allowed to create a ! ** print job.

    ! ** ! ** This method is called by Toolkit.getPrintJob(). (I ! ** assume so, at least, it just don't say nothing about ! ** it in the spec.)

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.awt.Toolkit.getPrintJob(java.awt.Frame,java.lang.String,java.util.Properties) ! **/ ! public void checkPrintJobAccess() { ! throw new SecurityException("Cannot create print jobs."); ! } ! /** Check if the current thread is allowed to use the ! ** system clipboard.

    ! ** ! ** This method is called by Toolkit.getSystemClipboard(). ! ** (I assume.)

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.awt.Toolkit#getSystemClipboard() ! **/ ! public void checkSystemClipboardAccess() { ! throw new SecurityException("Cannot access the system clipboard."); } ! /** Check if the current thread is allowed to use the AWT ! ** event queue.

    ! ** ! ** This method is called by Toolkit.getSystemEventQueue().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.awt.Toolkit#getSystemEventQueue() ! **/ ! public void checkAwtEventQueueAccess() { ! throw new SecurityException("Cannot access the AWT event queue."); ! } ! /** Check if the current thread is allowed to access the ! ** specified package at all.

    ! ** ! ** This method is called by ClassLoader.loadClass() in ! ** user-created ClassLoaders.

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param packageName the package name to check access to ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.ClassLoader#loadClass(java.lang.String,boolean) ! **/ ! public void checkPackageAccess(String packageName) { ! throw new SecurityException("Cannot access packages via the ClassLoader."); } ! /** Check if the current thread is allowed to define ! ** classes the specified package. If the class already ! ** created, though, ClassLoader.loadClass() can still ! ** return the Class if checkPackageAccess() checks out.

    ! ** ! ** This method is called by ClassLoader.loadClass() in ! ** user-created ClassLoaders.

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param packageName the package name to check access to ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.ClassLoader#loadClass(java.lang.String,boolean) ! **/ ! public void checkPackageDefinition(String packageName) { ! throw new SecurityException("Cannot load classes into any packages via the ClassLoader."); ! } ! /** Check if the current thread is allowed to set the ! ** current socket factory.

    ! ** ! ** This method is called by Socket.setSocketImplFactory(), ! ** ServerSocket.setSocketFactory(), and ! ** URL.setURLStreamHandlerFactory().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory) ! ** @see java.net.ServerSocket#setSocketFactory(java.net.SocketImplFactory) ! ** @see java.net.URL#setURLStreamHandlerFactory(java.net.URLStreamHandlerFactory) ! **/ ! public void checkSetFactory() { ! throw new SecurityException("Cannot set the socket factory."); ! } ! /** Check if the current thread is allowed to get certain ! ** types of Methods, Fields and Constructors from a Class ! ** object.

    ! ** ! ** This method is called by Class.getMethod[s](), ! ** Class.getField[s](), Class.getConstructor[s], ! ** Class.getDeclaredMethod[s](), ! ** Class.getDeclaredField[s](), and ! ** Class.getDeclaredConstructor[s]().

    ! ** ! ** SecurityManager's implementation always denies access. ! ** ! ** @param c the Class to check ! ** @param memberType the type of members to check ! ** against, either Member.DECLARED or ! ** Member.PUBLIC. ! ** @exception SecurityException if the operation is not ! ** permitted. ! ** @see java.lang.Class ! ** @see java.lang.reflect.Member#DECLARED ! ** @see java.lang.reflect.Member#PUBLIC ! **/ ! public void checkMemberAccess(Class c, int memberType) { ! throw new SecurityException("Cannot access members of classes."); ! } ! /** Test whether a particular security action may be ! ** taken. ! ** @param action the desired action to take ! ** @exception SecurityException if the action is denied. ! ** @XXX I have no idea what actions must be tested ! ** or where. ! **/ ! public void checkSecurityAccess(String action) { ! checkPermission (new java.security.SecurityPermission (action)); ! } ! /** Get the ThreadGroup that a new Thread should belong ! ** to by default.

    ! ** ! ** Called by Thread.Thread().

    ! ** ! ** SecurityManager's implementation just uses the ! ** ThreadGroup of the current Thread.

    ! ** ! ** Spec Note: it is not clear whether ! ** the new Thread is guaranteed to pass the ! ** checkAccessThreadGroup() test when using this ! ** ThreadGroup. I presume so. ! ** ! ** @return the ThreadGroup to put the new Thread into. ! **/ ! public ThreadGroup getThreadGroup() { ! return Thread.currentThread().getThreadGroup(); ! } ! public SecurityManager () { ! if (System.getSecurityManager () != null) ! throw new SecurityException (); ! } ! } ! class SecurityContext { ! Class[] classes; ! SecurityContext(Class[] classes) { ! this.classes = classes; ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Short.java gcc-3.1/libjava/java/lang/Short.java *** gcc-3.0.4/libjava/java/lang/Short.java Fri Feb 9 02:56:38 2001 --- gcc-3.1/libjava/java/lang/Short.java Tue Jan 22 22:40:16 2002 *************** *** 1,144 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.lang; /** ! * @author Per Bothner ! * @date April 17, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, plus online ! * API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! * Includes JDK 1.2 methods. */ - public final class Short extends Number implements Comparable { ! short value; ! public final static short MIN_VALUE = -32768; ! public final static short MAX_VALUE = 32767; ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public static final Class TYPE = short.class; ! private static final long serialVersionUID = 7515723908773894738L; public Short(short value) { this.value = value; } ! public Short(String str) ! throws NumberFormatException { ! this.value = parseShort(str, 10); } ! public byte byteValue() { ! return (byte) value; } ! public short shortValue() { ! return value; } ! public int intValue() { ! return value; } ! public long longValue () { ! return value; } ! public float floatValue () { ! return (float) value; } ! public double doubleValue () { ! return (double) value; } ! public static Short decode(String str) ! throws NumberFormatException { ! int i = (Integer.decode(str)).intValue(); ! if (i < MIN_VALUE || i > MAX_VALUE) ! throw new NumberFormatException(); ! return new Short((short) i); } ! public static short parseShort(String str, int radix) throws NumberFormatException { ! int i = Integer.parseInt(str, radix); if (i < MIN_VALUE || i > MAX_VALUE) throw new NumberFormatException(); return (short) i; } ! public static short parseShort(String str) ! throws NumberFormatException { ! return parseShort(str, 10); } ! public static Short valueOf(String str, int radix) ! throws NumberFormatException { ! return new Short(parseShort(str, radix)); } ! public static Short valueOf(String str) ! throws NumberFormatException { ! return valueOf(str, 10); } ! // Added in JDK 1.2 ! public int compareTo(Short anotherShort) { ! return this.value - anotherShort.value; } ! // Added in JDK 1.2 ! /** @throws ClassCastException */ ! public int compareTo(Object o) { ! return this.value - ((Short) o).value; } ! public boolean equals(Object obj) { ! return (obj instanceof Short) && ((Short) obj).value == value; } ! // Verified that hashCode is returns plain value (see Short_1 test). ! public int hashCode() { return value; } ! public String toString() { ! return Integer.toString((int) value); } ! ! public static String toString(short value) { ! return Integer.toString((int) value); } } --- 1,318 ---- ! /* java.lang.Short ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; /** ! * Instances of class Short represent primitive ! * short values. ! * ! * Additionally, this class provides various helper functions and variables ! * related to shorts. ! * ! * @author Paul Fisher ! * @author John Keiser ! * @since JDK 1.0 */ public final class Short extends Number implements Comparable { ! static final long serialVersionUID = 7515723908773894738L; ! /** ! * The minimum value a short can represent is -32768. ! */ ! public static final short MIN_VALUE = -32768; ! /** ! * The minimum value a short can represent is 32767. ! */ ! public static final short MAX_VALUE = 32767; ! /** ! * The primitive type short is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass('S'); + /** + * The immutable value of this Short. + */ + private final short value; + + /** + * Create a Short object representing the value of the + * short argument. + * + * @param value the value to use + */ public Short(short value) { this.value = value; } ! /** ! * Create a Short object representing the value of the ! * argument after conversion to a short. ! * ! * @param s the string to convert. ! */ ! public Short(String s) throws NumberFormatException { ! value = parseShort(s, 10); } ! /** ! * Return a hashcode representing this Object. ! * ! * Short's hash code is calculated by simply returning its ! * value. ! * ! * @return this Object's hash code. ! */ ! public int hashCode() { ! return value; } ! /** ! * If the Object is not null, is an ! * instanceof Short, and represents ! * the same primitive short value return ! * true. Otherwise false is returned. ! */ ! public boolean equals(Object obj) { ! return obj instanceof Short && ((Short)obj).value == value; } ! /** ! * Converts the short to a String and assumes ! * a radix of 10. ! * @param i the short to convert to String ! * @return the String representation of the argument. ! */ ! public static String toString(short i) { ! return Integer.toString((int) i); } ! /** ! * Converts the Short value to a String and ! * assumes a radix of 10. ! * @return the String representation of this Short. ! */ ! public String toString() { ! return Integer.toString ((int) value); } ! /** ! * Creates a new Short object using the String, ! * assuming a radix of 10. ! * @param s the String to convert. ! * @return the new Short. ! * @see #Short(java.lang.String) ! * @see #parseShort(java.lang.String) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a short. ! */ ! public static Short valueOf(String s) throws NumberFormatException { ! return new Short(parseShort(s)); } ! /** ! * Creates a new Short object using the String ! * and specified radix (base). ! * @param s the String to convert. ! * @param radix the radix (base) to convert with. ! * @return the new Short. ! * @see #parseShort(java.lang.String,int) ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a short. ! */ ! public static Short valueOf(String s, int radix) ! throws NumberFormatException { ! return new Short(parseShort(s, radix)); } ! /** ! * Converts the specified String into a short. ! * This function assumes a radix of 10. ! * ! * @param s the String to convert ! * @return the short value of the String ! * argument. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a short. ! */ ! public static short parseShort(String s) throws NumberFormatException { ! return parseShort(s, 10); } ! /** ! * Converts the specified String into a short ! * using the specified radix (base). ! * ! * @param s the String to convert ! * @param radix the radix (base) to use in the conversion ! * @return the String argument converted to short. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a short. ! */ ! public static short parseShort(String s, int radix) throws NumberFormatException { ! int i = Integer.parseInt(s, radix); if (i < MIN_VALUE || i > MAX_VALUE) throw new NumberFormatException(); return (short) i; } ! /** ! * Convert the specified String into a Short. ! * The String may represent decimal, hexadecimal, or ! * octal numbers. ! * ! * The String argument is interpreted based on the leading ! * characters. Depending on what the String begins with, the base will be ! * interpreted differently: ! * ! * ! * ! * ! * ! * ! * ! * ! *
    Leading
    Characters
    Base
    #16
    0x16
    0X16
    08
    Anything
    Else
    10
    ! * ! * @param s the String to interpret. ! * @return the value of the String as a Short. ! * @exception NumberFormatException thrown if the String ! * cannot be parsed as a short. ! */ ! public static Short decode(String s) throws NumberFormatException { ! int i = (Integer.decode(s)).intValue(); ! if (i < MIN_VALUE || i > MAX_VALUE) ! throw new NumberFormatException(); ! return new Short((short) i); } ! /** Return the value of this Short as an short. ! ** @return the value of this Short as an short. ! **/ ! public byte byteValue() { ! return (byte) value; } ! /** Return the value of this Short as an short. ! ** @return the value of this Short as an short. ! **/ ! public short shortValue() { ! return value; } ! /** Return the value of this Short as an int. ! ** @return the value of this Short as an int. ! **/ ! public int intValue() { ! return value; } ! /** Return the value of this Short as a long. ! ** @return the value of this Short as a long. ! **/ ! public long longValue() { ! return value; } ! /** Return the value of this Short as a float. ! ** @return the value of this Short as a float. ! **/ ! public float floatValue() { ! return value; } ! /** Return the value of this Short as a double. ! ** @return the value of this Short as a double. ! **/ ! public double doubleValue() { return value; } ! /** ! * Compare two Shorts numerically by comparing their ! * short values. ! * @return a positive value if this Short is greater ! * in value than the argument Short; a negative value ! * if this Short is smaller in value than the argument ! * Short; and 0, zero, if this ! * Short is equal in value to the argument ! * Short. ! * ! * @since 1.2 ! */ ! public int compareTo(Short s) { ! return value - s.value; } ! ! /** ! * Behaves like compareTo(java.lang.Short) unless the Object ! * is not a Short. Then it throws a ! * ClassCastException. ! * @exception ClassCastException if the argument is not a ! * Short. ! * ! * @since 1.2 ! */ ! public int compareTo(Object o) { ! return compareTo((Short)o); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/StackOverflowError.java gcc-3.1/libjava/java/lang/StackOverflowError.java *** gcc-3.0.4/libjava/java/lang/StackOverflowError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/StackOverflowError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // StackOverflowError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class StackOverflowError extends VirtualMachineError { ! public StackOverflowError () ! { ! super (); ! } ! public StackOverflowError (String msg) ! { ! super (msg); ! } } --- 1,76 ---- ! /* StackOverflowError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * A StackOverflowError is thrown when a stack overflow occurs. + * This can occur because an application recurses too deeply. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class StackOverflowError extends VirtualMachineError { ! static final long serialVersionUID = 8609175038441759607L; ! /** ! * Create an error without a message. ! */ ! public StackOverflowError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public StackOverflowError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/StrictMath.java gcc-3.1/libjava/java/lang/StrictMath.java *** gcc-3.0.4/libjava/java/lang/StrictMath.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/StrictMath.java Fri Feb 15 03:21:47 2002 *************** *** 0 **** --- 1,1843 ---- + /* java.lang.StrictMath -- common mathematical functions, strict Java + Copyright (C) 1998, 2001, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + /* + * Some of the algorithms in this class are in the public domain, as part + * of fdlibm (freely-distributable math library), available at + * http://www.netlib.org/fdlibm/, and carry the following copyright: + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + package java.lang; + + import java.util.Random; + import gnu.classpath.Configuration; + + /** + * Helper class containing useful mathematical functions and constants. + * This class mirrors {@link Math}, but is 100% portable, because it uses + * no native methods whatsoever. Also, these algorithms are all accurate + * to less than 1 ulp, and execute in strictfp mode, while + * Math is allowed to vary in its results for some functions. Unfortunately, + * this usually means StrictMath has less efficiency and speed, as Math can + * use native methods. + * + *

    The source of the various algorithms used is the fdlibm library, at:
    + * http://www.netlib.org/fdlibm/ + * + * Note that angles are specified in radians. Conversion functions are + * provided for your convenience. + * + * @author Eric Blake + * @since 1.3 + */ + public final strictfp class StrictMath + { + /** + * StrictMath is non-instantiable. + */ + private StrictMath() + { + } + + /** + * A random number generator, initialized on first use. + * + * @see #random() + */ + private static Random rand; + + /** + * The most accurate approximation to the mathematical constant e: + * 2.718281828459045. Used in natural log and exp. + * + * @see #log(double) + * @see #exp(double) + */ + public static final double E + = 2.718281828459045; // Long bits 0x4005bf0z8b145769L. + + /** + * The most accurate approximation to the mathematical constant pi: + * 3.141592653589793. This is the ratio of a circle's diameter + * to its circumference. + */ + public static final double PI + = 3.141592653589793; // Long bits 0x400921fb54442d18L. + + /** + * Take the absolute value of the argument. (Absolute value means make + * it positive.) + * + *

    Note that the the largest negative value (Integer.MIN_VALUE) cannot + * be made positive. In this case, because of the rules of negation in + * a computer, MIN_VALUE is what will be returned. + * This is a negative value. You have been warned. + * + * @param i the number to take the absolute value of + * @return the absolute value + * @see Integer#MIN_VALUE + */ + public static int abs(int i) + { + return (i < 0) ? -i : i; + } + + /** + * Take the absolute value of the argument. (Absolute value means make + * it positive.) + * + *

    Note that the the largest negative value (Long.MIN_VALUE) cannot + * be made positive. In this case, because of the rules of negation in + * a computer, MIN_VALUE is what will be returned. + * This is a negative value. You have been warned. + * + * @param l the number to take the absolute value of + * @return the absolute value + * @see Long#MIN_VALUE + */ + public static long abs(long l) + { + return (l < 0) ? -l : l; + } + + /** + * Take the absolute value of the argument. (Absolute value means make + * it positive.) + * + * @param f the number to take the absolute value of + * @return the absolute value + */ + public static float abs(float f) + { + return (f <= 0) ? 0 - f : f; + } + + /** + * Take the absolute value of the argument. (Absolute value means make + * it positive.) + * + * @param d the number to take the absolute value of + * @return the absolute value + */ + public static double abs(double d) + { + return (d <= 0) ? 0 - d : d; + } + + /** + * Return whichever argument is smaller. + * + * @param a the first number + * @param b a second number + * @return the smaller of the two numbers + */ + public static int min(int a, int b) + { + return (a < b) ? a : b; + } + + /** + * Return whichever argument is smaller. + * + * @param a the first number + * @param b a second number + * @return the smaller of the two numbers + */ + public static long min(long a, long b) + { + return (a < b) ? a : b; + } + + /** + * Return whichever argument is smaller. If either argument is NaN, the + * result is NaN, and when comparing 0 and -0, -0 is always smaller. + * + * @param a the first number + * @param b a second number + * @return the smaller of the two numbers + */ + public static float min(float a, float b) + { + // this check for NaN, from JLS 15.21.1, saves a method call + if (a != a) + return a; + // no need to check if b is NaN; < will work correctly + // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special + if (a == 0 && b == 0) + return -(-a - b); + return (a < b) ? a : b; + } + + /** + * Return whichever argument is smaller. If either argument is NaN, the + * result is NaN, and when comparing 0 and -0, -0 is always smaller. + * + * @param a the first number + * @param b a second number + * @return the smaller of the two numbers + */ + public static double min(double a, double b) + { + // this check for NaN, from JLS 15.21.1, saves a method call + if (a != a) + return a; + // no need to check if b is NaN; < will work correctly + // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special + if (a == 0 && b == 0) + return -(-a - b); + return (a < b) ? a : b; + } + + /** + * Return whichever argument is larger. + * + * @param a the first number + * @param b a second number + * @return the larger of the two numbers + */ + public static int max(int a, int b) + { + return (a > b) ? a : b; + } + + /** + * Return whichever argument is larger. + * + * @param a the first number + * @param b a second number + * @return the larger of the two numbers + */ + public static long max(long a, long b) + { + return (a > b) ? a : b; + } + + /** + * Return whichever argument is larger. If either argument is NaN, the + * result is NaN, and when comparing 0 and -0, 0 is always larger. + * + * @param a the first number + * @param b a second number + * @return the larger of the two numbers + */ + public static float max(float a, float b) + { + // this check for NaN, from JLS 15.21.1, saves a method call + if (a != a) + return a; + // no need to check if b is NaN; > will work correctly + // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special + if (a == 0 && b == 0) + return a - -b; + return (a > b) ? a : b; + } + + /** + * Return whichever argument is larger. If either argument is NaN, the + * result is NaN, and when comparing 0 and -0, 0 is always larger. + * + * @param a the first number + * @param b a second number + * @return the larger of the two numbers + */ + public static double max(double a, double b) + { + // this check for NaN, from JLS 15.21.1, saves a method call + if (a != a) + return a; + // no need to check if b is NaN; > will work correctly + // recall that -0.0 == 0.0, but [+-]0.0 - [+-]0.0 behaves special + if (a == 0 && b == 0) + return a - -b; + return (a > b) ? a : b; + } + + /** + * The trigonometric function sin. The sine of NaN or infinity is + * NaN, and the sine of 0 retains its sign. + * + * @param a the angle (in radians) + * @return sin(a) + */ + public static double sin(double a) + { + if (a == Double.NEGATIVE_INFINITY || ! (a < Double.POSITIVE_INFINITY)) + return Double.NaN; + + if (abs(a) <= PI / 4) + return sin(a, 0); + + // Argument reduction needed. + double[] y = new double[2]; + int n = remPiOver2(a, y); + switch (n & 3) + { + case 0: + return sin(y[0], y[1]); + case 1: + return cos(y[0], y[1]); + case 2: + return -sin(y[0], y[1]); + default: + return -cos(y[0], y[1]); + } + } + + /** + * The trigonometric function cos. The cosine of NaN or infinity is + * NaN. + * + * @param a the angle (in radians). + * @return cos(a). + */ + public static double cos(double a) + { + if (a == Double.NEGATIVE_INFINITY || ! (a < Double.POSITIVE_INFINITY)) + return Double.NaN; + + if (abs(a) <= PI / 4) + return cos(a, 0); + + // Argument reduction needed. + double[] y = new double[2]; + int n = remPiOver2(a, y); + switch (n & 3) + { + case 0: + return cos(y[0], y[1]); + case 1: + return -sin(y[0], y[1]); + case 2: + return -cos(y[0], y[1]); + default: + return sin(y[0], y[1]); + } + } + + /** + * The trigonometric function tan. The tangent of NaN or infinity + * is NaN, and the tangent of 0 retains its sign. + * + * @param a the angle (in radians) + * @return tan(a) + */ + public static double tan(double a) + { + if (a == Double.NEGATIVE_INFINITY || ! (a < Double.POSITIVE_INFINITY)) + return Double.NaN; + + if (abs(a) <= PI / 4) + return tan(a, 0, false); + + // Argument reduction needed. + double[] y = new double[2]; + int n = remPiOver2(a, y); + return tan(y[0], y[1], (n & 1) == 1); + } + + /** + * The trigonometric function arcsin. The range of angles returned + * is -pi/2 to pi/2 radians (-90 to 90 degrees). If the argument is NaN or + * its absolute value is beyond 1, the result is NaN; and the arcsine of + * 0 retains its sign. + * + * @param x the sin to turn back into an angle + * @return arcsin(x) + */ + public static double asin(double x) + { + boolean negative = x < 0; + if (negative) + x = -x; + if (! (x <= 1)) + return Double.NaN; + if (x == 1) + return negative ? -PI / 2 : PI / 2; + if (x < 0.5) + { + if (x < 1 / TWO_27) + return negative ? -x : x; + double t = x * x; + double p = t * (PS0 + t * (PS1 + t * (PS2 + t * (PS3 + t + * (PS4 + t * PS5))))); + double q = 1 + t * (QS1 + t * (QS2 + t * (QS3 + t * QS4))); + return negative ? -x - x * (p / q) : x + x * (p / q); + } + double w = 1 - x; // 1>|x|>=0.5. + double t = w * 0.5; + double p = t * (PS0 + t * (PS1 + t * (PS2 + t * (PS3 + t + * (PS4 + t * PS5))))); + double q = 1 + t * (QS1 + t * (QS2 + t * (QS3 + t * QS4))); + double s = sqrt(t); + if (x >= 0.975) + { + w = p / q; + t = PI / 2 - (2 * (s + s * w) - PI_L / 2); + } + else + { + w = (float) s; + double c = (t - w * w) / (s + w); + p = 2 * s * (p / q) - (PI_L / 2 - 2 * c); + q = PI / 4 - 2 * w; + t = PI / 4 - (p - q); + } + return negative ? -t : t; + } + + /** + * The trigonometric function arccos. The range of angles returned + * is 0 to pi radians (0 to 180 degrees). If the argument is NaN or + * its absolute value is beyond 1, the result is NaN. + * + * @param x the cos to turn back into an angle + * @return arccos(x) + */ + public static double acos(double x) + { + boolean negative = x < 0; + if (negative) + x = -x; + if (! (x <= 1)) + return Double.NaN; + if (x == 1) + return negative ? PI : 0; + if (x < 0.5) + { + if (x < 1 / TWO_57) + return PI / 2; + double z = x * x; + double p = z * (PS0 + z * (PS1 + z * (PS2 + z * (PS3 + z + * (PS4 + z * PS5))))); + double q = 1 + z * (QS1 + z * (QS2 + z * (QS3 + z * QS4))); + double r = x - (PI_L / 2 - x * (p / q)); + return negative ? PI / 2 + r : PI / 2 - r; + } + if (negative) // x<=-0.5. + { + double z = (1 + x) * 0.5; + double p = z * (PS0 + z * (PS1 + z * (PS2 + z * (PS3 + z + * (PS4 + z * PS5))))); + double q = 1 + z * (QS1 + z * (QS2 + z * (QS3 + z * QS4))); + double s = sqrt(z); + double w = p / q * s - PI_L / 2; + return PI - 2 * (s + w); + } + double z = (1 - x) * 0.5; // x>0.5. + double s = sqrt(z); + double df = (float) s; + double c = (z - df * df) / (s + df); + double p = z * (PS0 + z * (PS1 + z * (PS2 + z * (PS3 + z + * (PS4 + z * PS5))))); + double q = 1 + z * (QS1 + z * (QS2 + z * (QS3 + z * QS4))); + double w = p / q * s + c; + return 2 * (df + w); + } + + /** + * The trigonometric function arcsin. The range of angles returned + * is -pi/2 to pi/2 radians (-90 to 90 degrees). If the argument is NaN, the + * result is NaN; and the arctangent of 0 retains its sign. + * + * @param x the tan to turn back into an angle + * @return arcsin(x) + * @see #atan2(double, double) + */ + public static double atan(double x) + { + double lo; + double hi; + boolean negative = x < 0; + if (negative) + x = -x; + if (x >= TWO_66) + return negative ? -PI / 2 : PI / 2; + if (! (x >= 0.4375)) // |x|<7/16, or NaN. + { + if (! (x >= 1 / TWO_29)) // Small, or NaN. + return negative ? -x : x; + lo = hi = 0; + } + else if (x < 1.1875) + { + if (x < 0.6875) // 7/16<=|x|<11/16. + { + x = (2 * x - 1) / (2 + x); + hi = ATAN_0_5H; + lo = ATAN_0_5L; + } + else // 11/16<=|x|<19/16. + { + x = (x - 1) / (x + 1); + hi = PI / 4; + lo = PI_L / 4; + } + } + else if (x < 2.4375) // 19/16<=|x|<39/16. + { + x = (x - 1.5) / (1 + 1.5 * x); + hi = ATAN_1_5H; + lo = ATAN_1_5L; + } + else // 39/16<=|x|<2**66. + { + x = -1 / x; + hi = PI / 2; + lo = PI_L / 2; + } + + // Break sum from i=0 to 10 ATi*z**(i+1) into odd and even poly. + double z = x * x; + double w = z * z; + double s1 = z * (AT0 + w * (AT2 + w * (AT4 + w * (AT6 + w + * (AT8 + w * AT10))))); + double s2 = w * (AT1 + w * (AT3 + w * (AT5 + w * (AT7 + w * AT9)))); + if (hi == 0) + return negative ? x * (s1 + s2) - x : x - x * (s1 + s2); + z = hi - ((x * (s1 + s2) - lo) - x); + return negative ? -z : z; + } + + /** + * A special version of the trigonometric function arctan, for + * converting rectangular coordinates (x, y) to polar + * (r, theta). This computes the arctangent of x/y in the range + * of -pi to pi radians (-180 to 180 degrees). Special cases:

      + *
    • If either argument is NaN, the result is NaN.
    • + *
    • If the first argument is positive zero and the second argument is + * positive, or the first argument is positive and finite and the second + * argument is positive infinity, then the result is positive zero.
    • + *
    • If the first argument is negative zero and the second argument is + * positive, or the first argument is negative and finite and the second + * argument is positive infinity, then the result is negative zero.
    • + *
    • If the first argument is positive zero and the second argument is + * negative, or the first argument is positive and finite and the second + * argument is negative infinity, then the result is the double value + * closest to pi.
    • + *
    • If the first argument is negative zero and the second argument is + * negative, or the first argument is negative and finite and the second + * argument is negative infinity, then the result is the double value + * closest to -pi.
    • + *
    • If the first argument is positive and the second argument is + * positive zero or negative zero, or the first argument is positive + * infinity and the second argument is finite, then the result is the + * double value closest to pi/2.
    • + *
    • If the first argument is negative and the second argument is + * positive zero or negative zero, or the first argument is negative + * infinity and the second argument is finite, then the result is the + * double value closest to -pi/2.
    • + *
    • If both arguments are positive infinity, then the result is the + * double value closest to pi/4.
    • + *
    • If the first argument is positive infinity and the second argument + * is negative infinity, then the result is the double value closest to + * 3*pi/4.
    • + *
    • If the first argument is negative infinity and the second argument + * is positive infinity, then the result is the double value closest to + * -pi/4.
    • + *
    • If both arguments are negative infinity, then the result is the + * double value closest to -3*pi/4.
    • + * + *

    This returns theta, the angle of the point. To get r, albeit + * slightly inaccurately, use sqrt(x*x+y*y). + * + * @param y the y position + * @param x the x position + * @return theta in the conversion of (x, y) to (r, theta) + * @see #atan(double) + */ + public static double atan2(double y, double x) + { + if (x != x || y != y) + return Double.NaN; + if (x == 1) + return atan(y); + if (x == Double.POSITIVE_INFINITY) + { + if (y == Double.POSITIVE_INFINITY) + return PI / 4; + if (y == Double.NEGATIVE_INFINITY) + return -PI / 4; + return 0 * y; + } + if (x == Double.NEGATIVE_INFINITY) + { + if (y == Double.POSITIVE_INFINITY) + return 3 * PI / 4; + if (y == Double.NEGATIVE_INFINITY) + return -3 * PI / 4; + return (1 / (0 * y) == Double.POSITIVE_INFINITY) ? PI : -PI; + } + if (y == 0) + { + if (1 / (0 * x) == Double.POSITIVE_INFINITY) + return y; + return (1 / y == Double.POSITIVE_INFINITY) ? PI : -PI; + } + if (y == Double.POSITIVE_INFINITY || y == Double.NEGATIVE_INFINITY + || x == 0) + return y < 0 ? -PI / 2 : PI / 2; + + double z = abs(y / x); // Safe to do y/x. + if (z > TWO_60) + z = PI / 2 + 0.5 * PI_L; + else if (x < 0 && z < 1 / TWO_60) + z = 0; + else + z = atan(z); + if (x > 0) + return y > 0 ? z : -z; + return y > 0 ? PI - (z - PI_L) : z - PI_L - PI; + } + + /** + * Take ea. The opposite of log(). If the + * argument is NaN, the result is NaN; if the argument is positive infinity, + * the result is positive infinity; and if the argument is negative + * infinity, the result is positive zero. + * + * @param x the number to raise to the power + * @return the number raised to the power of e + * @see #log(double) + * @see #pow(double, double) + */ + public static double exp(double x) + { + if (x != x) + return x; + if (x > EXP_LIMIT_H) + return Double.POSITIVE_INFINITY; + if (x < EXP_LIMIT_L) + return 0; + + // Argument reduction. + double hi; + double lo; + int k; + double t = abs(x); + if (t > 0.5 * LN2) + { + if (t < 1.5 * LN2) + { + hi = t - LN2_H; + lo = LN2_L; + k = 1; + } + else + { + k = (int) (INV_LN2 * t + 0.5); + hi = t - k * LN2_H; + lo = k * LN2_L; + } + if (x < 0) + { + hi = -hi; + lo = -lo; + k = -k; + } + x = hi - lo; + } + else if (t < 1 / TWO_28) + return 1; + else + lo = hi = k = 0; + + // Now x is in primary range. + t = x * x; + double c = x - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5)))); + if (k == 0) + return 1 - (x * c / (c - 2) - x); + double y = 1 - (lo - x * c / (2 - c) - hi); + return scale(y, k); + } + + /** + * Take ln(a) (the natural log). The opposite of exp(). If the + * argument is NaN or negative, the result is NaN; if the argument is + * positive infinity, the result is positive infinity; and if the argument + * is either zero, the result is negative infinity. + * + *

    Note that the way to get logb(a) is to do this: + * ln(a) / ln(b). + * + * @param x the number to take the natural log of + * @return the natural log of a + * @see #exp(double) + */ + public static double log(double x) + { + if (x == 0) + return Double.NEGATIVE_INFINITY; + if (x < 0) + return Double.NaN; + if (! (x < Double.POSITIVE_INFINITY)) + return x; + + // Normalize x. + long bits = Double.doubleToLongBits(x); + int exp = (int) (bits >> 52); + if (exp == 0) // Subnormal x. + { + x *= TWO_54; + bits = Double.doubleToLongBits(x); + exp = (int) (bits >> 52) - 54; + } + exp -= 1023; // Unbias exponent. + bits = (bits & 0x000fffffffffffffL) | 0x3ff0000000000000L; + x = Double.longBitsToDouble(bits); + if (x >= SQRT_2) + { + x *= 0.5; + exp++; + } + x--; + if (abs(x) < 1 / TWO_20) + { + if (x == 0) + return exp * LN2_H + exp * LN2_L; + double r = x * x * (0.5 - 1 / 3.0 * x); + if (exp == 0) + return x - r; + return exp * LN2_H - ((r - exp * LN2_L) - x); + } + double s = x / (2 + x); + double z = s * s; + double w = z * z; + double t1 = w * (LG2 + w * (LG4 + w * LG6)); + double t2 = z * (LG1 + w * (LG3 + w * (LG5 + w * LG7))); + double r = t2 + t1; + if (bits >= 0x3ff6174a00000000L && bits < 0x3ff6b85200000000L) + { + double h = 0.5 * x * x; // Need more accuracy for x near sqrt(2). + if (exp == 0) + return x - (h - s * (h + r)); + return exp * LN2_H - ((h - (s * (h + r) + exp * LN2_L)) - x); + } + if (exp == 0) + return x - s * (x - r); + return exp * LN2_H - ((s * (x - r) - exp * LN2_L) - x); + } + + /** + * Take a square root. If the argument is NaN or negative, the result is + * NaN; if the argument is positive infinity, the result is positive + * infinity; and if the result is either zero, the result is the same. + * + *

    For other roots, use pow(x, 1/rootNumber). + * + * @param x the numeric argument + * @return the square root of the argument + * @see #pow(double, double) + */ + public static double sqrt(double x) + { + if (x < 0) + return Double.NaN; + if (x == 0 || ! (x < Double.POSITIVE_INFINITY)) + return x; + + // Normalize x. + long bits = Double.doubleToLongBits(x); + int exp = (int) (bits >> 52); + if (exp == 0) // Subnormal x. + { + x *= TWO_54; + bits = Double.doubleToLongBits(x); + exp = (int) (bits >> 52) - 54; + } + exp -= 1023; // Unbias exponent. + bits = (bits & 0x000fffffffffffffL) | 0x0010000000000000L; + if ((exp & 1) == 1) // Odd exp, double x to make it even. + bits <<= 1; + exp >>= 1; + + // Generate sqrt(x) bit by bit. + bits <<= 1; + long q = 0; + long s = 0; + long r = 0x0020000000000000L; // Move r right to left. + while (r != 0) + { + long t = s + r; + if (t <= bits) + { + s = t + r; + bits -= t; + q += r; + } + bits <<= 1; + r >>= 1; + } + + // Use floating add to round correctly. + if (bits != 0) + q += q & 1; + return Double.longBitsToDouble((q >> 1) + ((exp + 1022L) << 52)); + } + + /** + * Raise a number to a power. Special cases:

      + *
    • If the second argument is positive or negative zero, then the result + * is 1.0.
    • + *
    • If the second argument is 1.0, then the result is the same as the + * first argument.
    • + *
    • If the second argument is NaN, then the result is NaN.
    • + *
    • If the first argument is NaN and the second argument is nonzero, + * then the result is NaN.
    • + *
    • If the absolute value of the first argument is greater than 1 and + * the second argument is positive infinity, or the absolute value of the + * first argument is less than 1 and the second argument is negative + * infinity, then the result is positive infinity.
    • + *
    • If the absolute value of the first argument is greater than 1 and + * the second argument is negative infinity, or the absolute value of the + * first argument is less than 1 and the second argument is positive + * infinity, then the result is positive zero.
    • + *
    • If the absolute value of the first argument equals 1 and the second + * argument is infinite, then the result is NaN.
    • + *
    • If the first argument is positive zero and the second argument is + * greater than zero, or the first argument is positive infinity and the + * second argument is less than zero, then the result is positive zero.
    • + *
    • If the first argument is positive zero and the second argument is + * less than zero, or the first argument is positive infinity and the + * second argument is greater than zero, then the result is positive + * infinity.
    • + *
    • If the first argument is negative zero and the second argument is + * greater than zero but not a finite odd integer, or the first argument is + * negative infinity and the second argument is less than zero but not a + * finite odd integer, then the result is positive zero.
    • + *
    • If the first argument is negative zero and the second argument is a + * positive finite odd integer, or the first argument is negative infinity + * and the second argument is a negative finite odd integer, then the result + * is negative zero.
    • + *
    • If the first argument is negative zero and the second argument is + * less than zero but not a finite odd integer, or the first argument is + * negative infinity and the second argument is greater than zero but not a + * finite odd integer, then the result is positive infinity.
    • + *
    • If the first argument is negative zero and the second argument is a + * negative finite odd integer, or the first argument is negative infinity + * and the second argument is a positive finite odd integer, then the result + * is negative infinity.
    • + *
    • If the first argument is less than zero and the second argument is a + * finite even integer, then the result is equal to the result of raising + * the absolute value of the first argument to the power of the second + * argument.
    • + *
    • If the first argument is less than zero and the second argument is a + * finite odd integer, then the result is equal to the negative of the + * result of raising the absolute value of the first argument to the power + * of the second argument.
    • + *
    • If the first argument is finite and less than zero and the second + * argument is finite and not an integer, then the result is NaN.
    • + *
    • If both arguments are integers, then the result is exactly equal to + * the mathematical result of raising the first argument to the power of + * the second argument if that result can in fact be represented exactly as + * a double value.
    • + * + *

    (In the foregoing descriptions, a floating-point value is + * considered to be an integer if and only if it is a fixed point of the + * method {@link #ceil(double)} or, equivalently, a fixed point of the + * method {@link #floor(double)}. A value is a fixed point of a one-argument + * method if and only if the result of applying the method to the value is + * equal to the value.) + * + * @param x the number to raise + * @param y the power to raise it to + * @return xy + */ + public static double pow(double x, double y) + { + // Special cases first. + if (y == 0) + return 1; + if (y == 1) + return x; + if (y == -1) + return 1 / x; + if (x != x || y != y) + return Double.NaN; + + // When x < 0, yisint tells if y is not an integer (0), even(1), + // or odd (2). + int yisint = 0; + if (x < 0 && floor(y) == y) + yisint = (y % 2 == 0) ? 2 : 1; + double ax = abs(x); + double ay = abs(y); + + // More special cases, of y. + if (ay == Double.POSITIVE_INFINITY) + { + if (ax == 1) + return Double.NaN; + if (ax > 1) + return y > 0 ? y : 0; + return y < 0 ? -y : 0; + } + if (y == 2) + return x * x; + if (y == 0.5) + return sqrt(x); + + // More special cases, of x. + if (x == 0 || ax == Double.POSITIVE_INFINITY || ax == 1) + { + if (y < 0) + ax = 1 / ax; + if (x < 0) + { + if (x == -1 && yisint == 0) + ax = Double.NaN; + else if (yisint == 1) + ax = -ax; + } + return ax; + } + if (x < 0 && yisint == 0) + return Double.NaN; + + // Now we can start! + double t; + double t1; + double t2; + double u; + double v; + double w; + if (ay > TWO_31) + { + if (ay > TWO_64) // Automatic over/underflow. + return ((ax < 1) ? y < 0 : y > 0) ? Double.POSITIVE_INFINITY : 0; + // Over/underflow if x is not close to one. + if (ax < 0.9999995231628418) + return y < 0 ? Double.POSITIVE_INFINITY : 0; + if (ax >= 1.0000009536743164) + return y > 0 ? Double.POSITIVE_INFINITY : 0; + // Now |1-x| is <= 2**-20, sufficient to compute + // log(x) by x-x^2/2+x^3/3-x^4/4. + t = x - 1; + w = t * t * (0.5 - t * (1 / 3.0 - t * 0.25)); + u = INV_LN2_H * t; + v = t * INV_LN2_L - w * INV_LN2; + t1 = (float) (u + v); + t2 = v - (t1 - u); + } + else + { + long bits = Double.doubleToLongBits(ax); + int exp = (int) (bits >> 52); + if (exp == 0) // Subnormal x. + { + ax *= TWO_54; + bits = Double.doubleToLongBits(ax); + exp = (int) (bits >> 52) - 54; + } + exp -= 1023; // Unbias exponent. + ax = Double.longBitsToDouble((bits & 0x000fffffffffffffL) + | 0x3ff0000000000000L); + boolean k; + if (ax < SQRT_1_5) // |x|= 1024) // Detect overflow. + { + if (z > 1024 || p_l + OVT > z - p_h) + return negative ? Double.NEGATIVE_INFINITY + : Double.POSITIVE_INFINITY; + } + else if (z <= -1075) // Detect underflow. + { + if (z < -1075 || p_l <= z - p_h) + return negative ? -0.0 : 0; + } + + // Compute 2**(p_h+p_l). + int n = round((float) z); + p_h -= n; + t = (float) (p_l + p_h); + u = t * LN2_H; + v = (p_l - (t - p_h)) * LN2 + t * LN2_L; + z = u + v; + w = v - (z - u); + t = z * z; + t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5)))); + double r = (z * t1) / (t1 - 2) - (w + z * w); + z = scale(1 - (r - z), n); + return negative ? -z : z; + } + + /** + * Get the IEEE 754 floating point remainder on two numbers. This is the + * value of x - y * n, where n is the closest + * double to x / y (ties go to the even n); for a zero + * remainder, the sign is that of x. If either argument is NaN, + * the first argument is infinite, or the second argument is zero, the result + * is NaN; if x is finite but y is infinte, the result is x. + * + * @param x the dividend (the top half) + * @param y the divisor (the bottom half) + * @return the IEEE 754-defined floating point remainder of x/y + * @see #rint(double) + */ + public static double IEEEremainder(double x, double y) + { + // Purge off exception values. + if (x == Double.NEGATIVE_INFINITY || ! (x < Double.POSITIVE_INFINITY) + || y == 0 || y != y) + return Double.NaN; + + boolean negative = x < 0; + x = abs(x); + y = abs(y); + if (x == y || x == 0) + return 0 * x; // Get correct sign. + + // Achieve x < 2y, then take first shot at remainder. + if (y < TWO_1023) + x %= y + y; + + // Now adjust x to get correct precision. + if (y < 4 / TWO_1023) + { + if (x + x > y) + { + x -= y; + if (x + x >= y) + x -= y; + } + } + else + { + y *= 0.5; + if (x > y) + { + x -= y; + if (x >= y) + x -= y; + } + } + return negative ? -x : x; + } + + /** + * Take the nearest integer that is that is greater than or equal to the + * argument. If the argument is NaN, infinite, or zero, the result is the + * same; if the argument is between -1 and 0, the result is negative zero. + * Note that Math.ceil(x) == -Math.floor(-x). + * + * @param a the value to act upon + * @return the nearest integer >= a + */ + public static double ceil(double a) + { + return -floor(-a); + } + + /** + * Take the nearest integer that is that is less than or equal to the + * argument. If the argument is NaN, infinite, or zero, the result is the + * same. Note that Math.ceil(x) == -Math.floor(-x). + * + * @param a the value to act upon + * @return the nearest integer <= a + */ + public static double floor(double a) + { + double x = abs(a); + if (! (x < TWO_52) || (long) a == a) + return a; // No fraction bits; includes NaN and infinity. + if (x < 1) + return a >= 0 ? 0 * a : -1; // Worry about signed zero. + return a < 0 ? (long) a - 1.0 : (long) a; // Cast to long truncates. + } + + /** + * Take the nearest integer to the argument. If it is exactly between + * two integers, the even integer is taken. If the argument is NaN, + * infinite, or zero, the result is the same. + * + * @param a the value to act upon + * @return the nearest integer to a + */ + public static double rint(double a) + { + double x = abs(a); + if (! (x < TWO_52)) + return a; // No fraction bits; includes NaN and infinity. + if (x <= 0.5) + return 0 * a; // Worry about signed zero. + if (x % 2 <= 0.5) + return (long) a; // Catch round down to even. + return (long) (a + (a < 0 ? -0.5 : 0.5)); // Cast to long truncates. + } + + /** + * Take the nearest integer to the argument. This is equivalent to + * (int) Math.floor(f + 0.5f). If the argument is NaN, the + * result is 0; otherwise if the argument is outside the range of int, the + * result will be Integer.MIN_VALUE or Integer.MAX_VALUE, as appropriate. + * + * @param f the argument to round + * @return the nearest integer to the argument + * @see Integer#MIN_VALUE + * @see Integer#MAX_VALUE + */ + public static int round(float f) + { + return (int) floor(f + 0.5f); + } + + /** + * Take the nearest long to the argument. This is equivalent to + * (long) Math.floor(d + 0.5). If the argument is NaN, the + * result is 0; otherwise if the argument is outside the range of long, the + * result will be Long.MIN_VALUE or Long.MAX_VALUE, as appropriate. + * + * @param d the argument to round + * @return the nearest long to the argument + * @see Long#MIN_VALUE + * @see Long#MAX_VALUE + */ + public static long round(double d) + { + return (long) floor(d + 0.5); + } + + /** + * Get a random number. This behaves like Random.nextDouble(), seeded by + * System.currentTimeMillis() when first called. In other words, the number + * is from a pseudorandom sequence, and lies in the range [+0.0, 1.0). + * This random sequence is only used by this method, and is threadsafe, + * although you may want your own random number generator if it is shared + * among threads. + * + * @return a random number + * @see Random#nextDouble() + * @see System#currentTimeMillis() + */ + public static synchronized double random() + { + if (rand == null) + rand = new Random(); + return rand.nextDouble(); + } + + /** + * Convert from degrees to radians. The formula for this is + * radians = degrees * (pi/180); however it is not always exact given the + * limitations of floating point numbers. + * + * @param degrees an angle in degrees + * @return the angle in radians + */ + public static double toRadians(double degrees) + { + return degrees * (PI / 180); + } + + /** + * Convert from radians to degrees. The formula for this is + * degrees = radians * (180/pi); however it is not always exact given the + * limitations of floating point numbers. + * + * @param rads an angle in radians + * @return the angle in degrees + */ + public static double toDegrees(double rads) + { + return rads * (180 / PI); + } + + /** + * Constants for scaling and comparing doubles by powers of 2. The compiler + * must automatically inline constructs like (1/TWO_54), so we don't list + * negative powers of two here. + */ + private static final double + TWO_16 = 0x10000, // Long bits 0x40f0000000000000L. + TWO_20 = 0x100000, // Long bits 0x4130000000000000L. + TWO_24 = 0x1000000, // Long bits 0x4170000000000000L. + TWO_27 = 0x8000000, // Long bits 0x41a0000000000000L. + TWO_28 = 0x10000000, // Long bits 0x41b0000000000000L. + TWO_29 = 0x20000000, // Long bits 0x41c0000000000000L. + TWO_31 = 0x80000000L, // Long bits 0x41e0000000000000L. + TWO_49 = 0x2000000000000L, // Long bits 0x4300000000000000L. + TWO_52 = 0x10000000000000L, // Long bits 0x4330000000000000L. + TWO_54 = 0x40000000000000L, // Long bits 0x4350000000000000L. + TWO_57 = 0x200000000000000L, // Long bits 0x4380000000000000L. + TWO_60 = 0x1000000000000000L, // Long bits 0x43b0000000000000L. + TWO_64 = 1.8446744073709552e19, // Long bits 0x43f0000000000000L. + TWO_66 = 7.378697629483821e19, // Long bits 0x4410000000000000L. + TWO_1023 = 8.98846567431158e307; // Long bits 0x7fe0000000000000L. + + /** + * Super precision for 2/pi in 24-bit chunks, for use in + * {@link #remPiOver2()}. + */ + private static final int TWO_OVER_PI[] = { + 0xa2f983, 0x6e4e44, 0x1529fc, 0x2757d1, 0xf534dd, 0xc0db62, + 0x95993c, 0x439041, 0xfe5163, 0xabdebb, 0xc561b7, 0x246e3a, + 0x424dd2, 0xe00649, 0x2eea09, 0xd1921c, 0xfe1deb, 0x1cb129, + 0xa73ee8, 0x8235f5, 0x2ebb44, 0x84e99c, 0x7026b4, 0x5f7e41, + 0x3991d6, 0x398353, 0x39f49c, 0x845f8b, 0xbdf928, 0x3b1ff8, + 0x97ffde, 0x05980f, 0xef2f11, 0x8b5a0a, 0x6d1f6d, 0x367ecf, + 0x27cb09, 0xb74f46, 0x3f669e, 0x5fea2d, 0x7527ba, 0xc7ebe5, + 0xf17b3d, 0x0739f7, 0x8a5292, 0xea6bfb, 0x5fb11f, 0x8d5d08, + 0x560330, 0x46fc7b, 0x6babf0, 0xcfbc20, 0x9af436, 0x1da9e3, + 0x91615e, 0xe61b08, 0x659985, 0x5f14a0, 0x68408d, 0xffd880, + 0x4d7327, 0x310606, 0x1556ca, 0x73a8c9, 0x60e27b, 0xc08c6b, + }; + + /** + * Super precision for pi/2 in 24-bit chunks, for use in + * {@link #remPiOver2()}. + */ + private static final double PI_OVER_TWO[] = { + 1.570796251296997, // Long bits 0x3ff921fb40000000L. + 7.549789415861596e-8, // Long bits 0x3e74442d00000000L. + 5.390302529957765e-15, // Long bits 0x3cf8469880000000L. + 3.282003415807913e-22, // Long bits 0x3b78cc5160000000L. + 1.270655753080676e-29, // Long bits 0x39f01b8380000000L. + 1.2293330898111133e-36, // Long bits 0x387a252040000000L. + 2.7337005381646456e-44, // Long bits 0x36e3822280000000L. + 2.1674168387780482e-51, // Long bits 0x3569f31d00000000L. + }; + + /** + * More constants related to pi, used in {@link #remPiOver2()} and + * elsewhere. + */ + private static final double + PI_L = 1.2246467991473532e-16, // Long bits 0x3ca1a62633145c07L. + PIO2_1 = 1.5707963267341256, // Long bits 0x3ff921fb54400000L. + PIO2_1L = 6.077100506506192e-11, // Long bits 0x3dd0b4611a626331L. + PIO2_2 = 6.077100506303966e-11, // Long bits 0x3dd0b4611a600000L. + PIO2_2L = 2.0222662487959506e-21, // Long bits 0x3ba3198a2e037073L. + PIO2_3 = 2.0222662487111665e-21, // Long bits 0x3ba3198a2e000000L. + PIO2_3L = 8.4784276603689e-32; // Long bits 0x397b839a252049c1L. + + /** + * Natural log and square root constants, for calculation of + * {@link #exp(double)}, {@link #log(double)} and + * {@link #power(double, double)}. CP is 2/(3*ln(2)). + */ + private static final double + SQRT_1_5 = 1.224744871391589, // Long bits 0x3ff3988e1409212eL. + SQRT_2 = 1.4142135623730951, // Long bits 0x3ff6a09e667f3bcdL. + SQRT_3 = 1.7320508075688772, // Long bits 0x3ffbb67ae8584caaL. + EXP_LIMIT_H = 709.782712893384, // Long bits 0x40862e42fefa39efL. + EXP_LIMIT_L = -745.1332191019411, // Long bits 0xc0874910d52d3051L. + CP = 0.9617966939259756, // Long bits 0x3feec709dc3a03fdL. + CP_H = 0.9617967009544373, // Long bits 0x3feec709e0000000L. + CP_L = -7.028461650952758e-9, // Long bits 0xbe3e2fe0145b01f5L. + LN2 = 0.6931471805599453, // Long bits 0x3fe62e42fefa39efL. + LN2_H = 0.6931471803691238, // Long bits 0x3fe62e42fee00000L. + LN2_L = 1.9082149292705877e-10, // Long bits 0x3dea39ef35793c76L. + INV_LN2 = 1.4426950408889634, // Long bits 0x3ff71547652b82feL. + INV_LN2_H = 1.4426950216293335, // Long bits 0x3ff7154760000000L. + INV_LN2_L = 1.9259629911266175e-8; // Long bits 0x3e54ae0bf85ddf44L. + + /** + * Constants for computing {@link #log(double)}. + */ + private static final double + LG1 = 0.6666666666666735, // Long bits 0x3fe5555555555593L. + LG2 = 0.3999999999940942, // Long bits 0x3fd999999997fa04L. + LG3 = 0.2857142874366239, // Long bits 0x3fd2492494229359L. + LG4 = 0.22222198432149784, // Long bits 0x3fcc71c51d8e78afL. + LG5 = 0.1818357216161805, // Long bits 0x3fc7466496cb03deL. + LG6 = 0.15313837699209373, // Long bits 0x3fc39a09d078c69fL. + LG7 = 0.14798198605116586; // Long bits 0x3fc2f112df3e5244L. + + /** + * Constants for computing {@link #pow(double, double)}. L and P are + * coefficients for series; OVT is -(1024-log2(ovfl+.5ulp)); and DP is ???. + * The P coefficients also calculate {@link #exp(double)}. + */ + private static final double + L1 = 0.5999999999999946, // Long bits 0x3fe3333333333303L. + L2 = 0.4285714285785502, // Long bits 0x3fdb6db6db6fabffL. + L3 = 0.33333332981837743, // Long bits 0x3fd55555518f264dL. + L4 = 0.272728123808534, // Long bits 0x3fd17460a91d4101L. + L5 = 0.23066074577556175, // Long bits 0x3fcd864a93c9db65L. + L6 = 0.20697501780033842, // Long bits 0x3fca7e284a454eefL. + P1 = 0.16666666666666602, // Long bits 0x3fc555555555553eL. + P2 = -2.7777777777015593e-3, // Long bits 0xbf66c16c16bebd93L. + P3 = 6.613756321437934e-5, // Long bits 0x3f11566aaf25de2cL. + P4 = -1.6533902205465252e-6, // Long bits 0xbebbbd41c5d26bf1L. + P5 = 4.1381367970572385e-8, // Long bits 0x3e66376972bea4d0L. + DP_H = 0.5849624872207642, // Long bits 0x3fe2b80340000000L. + DP_L = 1.350039202129749e-8, // Long bits 0x3e4cfdeb43cfd006L. + OVT = 8.008566259537294e-17; // Long bits 0x3c971547652b82feL. + + /** + * Coefficients for computing {@link #sin(double)}. + */ + private static final double + S1 = -0.16666666666666632, // Long bits 0xbfc5555555555549L. + S2 = 8.33333333332249e-3, // Long bits 0x3f8111111110f8a6L. + S3 = -1.984126982985795e-4, // Long bits 0xbf2a01a019c161d5L. + S4 = 2.7557313707070068e-6, // Long bits 0x3ec71de357b1fe7dL. + S5 = -2.5050760253406863e-8, // Long bits 0xbe5ae5e68a2b9cebL. + S6 = 1.58969099521155e-10; // Long bits 0x3de5d93a5acfd57cL. + + /** + * Coefficients for computing {@link #cos(double)}. + */ + private static final double + C1 = 0.0416666666666666, // Long bits 0x3fa555555555554cL. + C2 = -1.388888888887411e-3, // Long bits 0xbf56c16c16c15177L. + C3 = 2.480158728947673e-5, // Long bits 0x3efa01a019cb1590L. + C4 = -2.7557314351390663e-7, // Long bits 0xbe927e4f809c52adL. + C5 = 2.087572321298175e-9, // Long bits 0x3e21ee9ebdb4b1c4L. + C6 = -1.1359647557788195e-11; // Long bits 0xbda8fae9be8838d4L. + + /** + * Coefficients for computing {@link #tan(double)}. + */ + private static final double + T0 = 0.3333333333333341, // Long bits 0x3fd5555555555563L. + T1 = 0.13333333333320124, // Long bits 0x3fc111111110fe7aL. + T2 = 0.05396825397622605, // Long bits 0x3faba1ba1bb341feL. + T3 = 0.021869488294859542, // Long bits 0x3f9664f48406d637L. + T4 = 8.8632398235993e-3, // Long bits 0x3f8226e3e96e8493L. + T5 = 3.5920791075913124e-3, // Long bits 0x3f6d6d22c9560328L. + T6 = 1.4562094543252903e-3, // Long bits 0x3f57dbc8fee08315L. + T7 = 5.880412408202641e-4, // Long bits 0x3f4344d8f2f26501L. + T8 = 2.464631348184699e-4, // Long bits 0x3f3026f71a8d1068L. + T9 = 7.817944429395571e-5, // Long bits 0x3f147e88a03792a6L. + T10 = 7.140724913826082e-5, // Long bits 0x3f12b80f32f0a7e9L. + T11 = -1.8558637485527546e-5, // Long bits 0xbef375cbdb605373L. + T12 = 2.590730518636337e-5; // Long bits 0x3efb2a7074bf7ad4L. + + /** + * Coefficients for computing {@link #asin(double)} and + * {@link #acos(double)}. + */ + private static final double + PS0 = 0.16666666666666666, // Long bits 0x3fc5555555555555L. + PS1 = -0.3255658186224009, // Long bits 0xbfd4d61203eb6f7dL. + PS2 = 0.20121253213486293, // Long bits 0x3fc9c1550e884455L. + PS3 = -0.04005553450067941, // Long bits 0xbfa48228b5688f3bL. + PS4 = 7.915349942898145e-4, // Long bits 0x3f49efe07501b288L. + PS5 = 3.479331075960212e-5, // Long bits 0x3f023de10dfdf709L. + QS1 = -2.403394911734414, // Long bits 0xc0033a271c8a2d4bL. + QS2 = 2.0209457602335057, // Long bits 0x40002ae59c598ac8L. + QS3 = -0.6882839716054533, // Long bits 0xbfe6066c1b8d0159L. + QS4 = 0.07703815055590194; // Long bits 0x3fb3b8c5b12e9282L. + + /** + * Coefficients for computing {@link #atan(double)}. + */ + private static final double + ATAN_0_5H = 0.4636476090008061, // Long bits 0x3fddac670561bb4fL. + ATAN_0_5L = 2.2698777452961687e-17, // Long bits 0x3c7a2b7f222f65e2L. + ATAN_1_5H = 0.982793723247329, // Long bits 0x3fef730bd281f69bL. + ATAN_1_5L = 1.3903311031230998e-17, // Long bits 0x3c7007887af0cbbdL. + AT0 = 0.3333333333333293, // Long bits 0x3fd555555555550dL. + AT1 = -0.19999999999876483, // Long bits 0xbfc999999998ebc4L. + AT2 = 0.14285714272503466, // Long bits 0x3fc24924920083ffL. + AT3 = -0.11111110405462356, // Long bits 0xbfbc71c6fe231671L. + AT4 = 0.09090887133436507, // Long bits 0x3fb745cdc54c206eL. + AT5 = -0.0769187620504483, // Long bits 0xbfb3b0f2af749a6dL. + AT6 = 0.06661073137387531, // Long bits 0x3fb10d66a0d03d51L. + AT7 = -0.058335701337905735, // Long bits 0xbfadde2d52defd9aL. + AT8 = 0.049768779946159324, // Long bits 0x3fa97b4b24760debL. + AT9 = -0.036531572744216916, // Long bits 0xbfa2b4442c6a6c2fL. + AT10 = 0.016285820115365782; // Long bits 0x3f90ad3ae322da11L. + + /** + * Helper function for reducing an angle to a multiple of pi/2 within + * [-pi/4, pi/4]. + * + * @param x the angle; not infinity or NaN, and outside pi/4 + * @param y an array of 2 doubles modified to hold the remander x % pi/2 + * @return the quadrant of the result, mod 4: 0: [-pi/4, pi/4], + * 1: [pi/4, 3*pi/4], 2: [3*pi/4, 5*pi/4], 3: [-3*pi/4, -pi/4] + */ + private static int remPiOver2(double x, double[] y) + { + boolean negative = x < 0; + x = abs(x); + double z; + int n; + if (Configuration.DEBUG && (x <= PI / 4 || x != x + || x == Double.POSITIVE_INFINITY)) + throw new InternalError("Assertion failure"); + if (x < 3 * PI / 4) // If |x| is small. + { + z = x - PIO2_1; + if ((float) x != (float) (PI / 2)) // 33+53 bit pi is good enough. + { + y[0] = z - PIO2_1L; + y[1] = z - y[0] - PIO2_1L; + } + else // Near pi/2, use 33+33+53 bit pi. + { + z -= PIO2_2; + y[0] = z - PIO2_2L; + y[1] = z - y[0] - PIO2_2L; + } + n = 1; + } + else if (x <= TWO_20 * PI / 2) // Medium size. + { + n = (int) (2 / PI * x + 0.5); + z = x - n * PIO2_1; + double w = n * PIO2_1L; // First round good to 85 bits. + y[0] = z - w; + if (n >= 32 || (float) x == (float) (w)) + { + if (x / y[0] >= TWO_16) // Second iteration, good to 118 bits. + { + double t = z; + w = n * PIO2_2; + z = t - w; + w = n * PIO2_2L - (t - z - w); + y[0] = z - w; + if (x / y[0] >= TWO_49) // Third iteration, 151 bits accuracy. + { + t = z; + w = n * PIO2_3; + z = t - w; + w = n * PIO2_3L - (t - z - w); + y[0] = z - w; + } + } + } + y[1] = z - y[0] - w; + } + else + { + // All other (large) arguments. + int e0 = (int) (Double.doubleToLongBits(x) >> 52) - 1046; + z = scale(x, -e0); // e0 = ilogb(z) - 23. + double[] tx = new double[3]; + for (int i = 0; i < 2; i++) + { + tx[i] = (int) z; + z = (z - tx[i]) * TWO_24; + } + tx[2] = z; + int nx = 2; + while (tx[nx] == 0) + nx--; + n = remPiOver2(tx, y, e0, nx); + } + if (negative) + { + y[0] = -y[0]; + y[1] = -y[1]; + return -n; + } + return n; + } + + /** + * Helper function for reducing an angle to a multiple of pi/2 within + * [-pi/4, pi/4]. + * + * @param x the positive angle, broken into 24-bit chunks + * @param y an array of 2 doubles modified to hold the remander x % pi/2 + * @param e0 the exponent of x[0] + * @param nx the last index used in x + * @return the quadrant of the result, mod 4: 0: [-pi/4, pi/4], + * 1: [pi/4, 3*pi/4], 2: [3*pi/4, 5*pi/4], 3: [-3*pi/4, -pi/4] + */ + private static int remPiOver2(double[] x, double[] y, int e0, int nx) + { + int i; + int ih; + int n; + double fw; + double z; + int[] iq = new int[20]; + double[] f = new double[20]; + double[] q = new double[20]; + boolean recompute = false; + + // Initialize jk, jz, jv, q0; note that 3>q0. + int jk = 4; + int jz = jk; + int jv = max((e0 - 3) / 24, 0); + int q0 = e0 - 24 * (jv + 1); + + // Set up f[0] to f[nx+jk] where f[nx+jk] = TWO_OVER_PI[jv+jk]. + int j = jv - nx; + int m = nx + jk; + for (i = 0; i <= m; i++, j++) + f[i] = (j < 0) ? 0 : TWO_OVER_PI[j]; + + // Compute q[0],q[1],...q[jk]. + for (i = 0; i <= jk; i++) + { + for (j = 0, fw = 0; j <= nx; j++) + fw += x[j] * f[nx + i - j]; + q[i] = fw; + } + + do + { + // Distill q[] into iq[] reversingly. + for (i = 0, j = jz, z = q[jz]; j > 0; i++, j--) + { + fw = (int) (1 / TWO_24 * z); + iq[i] = (int) (z - TWO_24 * fw); + z = q[j - 1] + fw; + } + + // Compute n. + z = scale(z, q0); + z -= 8 * floor(z * 0.125); // Trim off integer >= 8. + n = (int) z; + z -= n; + ih = 0; + if (q0 > 0) // Need iq[jz-1] to determine n. + { + i = iq[jz - 1] >> (24 - q0); + n += i; + iq[jz - 1] -= i << (24 - q0); + ih = iq[jz - 1] >> (23 - q0); + } + else if (q0 == 0) + ih = iq[jz - 1] >> 23; + else if (z >= 0.5) + ih = 2; + + if (ih > 0) // If q > 0.5. + { + n += 1; + int carry = 0; + for (i = 0; i < jz; i++) // Compute 1-q. + { + j = iq[i]; + if (carry == 0) + { + if (j != 0) + { + carry = 1; + iq[i] = 0x1000000 - j; + } + } + else + iq[i] = 0xffffff - j; + } + switch (q0) + { + case 1: // Rare case: chance is 1 in 12 for non-default. + iq[jz - 1] &= 0x7fffff; + break; + case 2: + iq[jz - 1] &= 0x3fffff; + } + if (ih == 2) + { + z = 1 - z; + if (carry != 0) + z -= scale(1, q0); + } + } + + // Check if recomputation is needed. + if (z == 0) + { + j = 0; + for (i = jz - 1; i >= jk; i--) + j |= iq[i]; + if (j == 0) // Need recomputation. + { + int k; + for (k = 1; iq[jk - k] == 0; k++); // k = no. of terms needed. + + for (i = jz + 1; i <= jz + k; i++) // Add q[jz+1] to q[jz+k]. + { + f[nx + i] = TWO_OVER_PI[jv + i]; + for (j = 0, fw = 0; j <= nx; j++) + fw += x[j] * f[nx + i - j]; + q[i] = fw; + } + jz += k; + recompute = true; + } + } + } + while (recompute); + + // Chop off zero terms. + if (z == 0) + { + jz--; + q0 -= 24; + while (iq[jz] == 0) + { + jz--; + q0 -= 24; + } + } + else // Break z into 24-bit if necessary. + { + z = scale(z, -q0); + if (z >= TWO_24) + { + fw = (int) (1 / TWO_24 * z); + iq[jz] = (int) (z - TWO_24 * fw); + jz++; + q0 += 24; + iq[jz] = (int) fw; + } + else + iq[jz] = (int) z; + } + + // Convert integer "bit" chunk to floating-point value. + fw = scale(1, q0); + for (i = jz; i >= 0; i--) + { + q[i] = fw * iq[i]; + fw *= 1 / TWO_24; + } + + // Compute PI_OVER_TWO[0,...,jk]*q[jz,...,0]. + double[] fq = new double[20]; + for (i = jz; i >= 0; i--) + { + fw = 0; + for (int k = 0; k <= jk && k <= jz - i; k++) + fw += PI_OVER_TWO[k] * q[i + k]; + fq[jz - i] = fw; + } + + // Compress fq[] into y[]. + fw = 0; + for (i = jz; i >= 0; i--) + fw += fq[i]; + y[0] = (ih == 0) ? fw : -fw; + fw = fq[0] - fw; + for (i = 1; i <= jz; i++) + fw += fq[i]; + y[1] = (ih == 0) ? fw : -fw; + return n; + } + + /** + * Helper method for scaling a double by a power of 2. + * + * @param x the double + * @param n the scale; |n| < 2048 + * @return x * 2**n + */ + private static double scale(double x, int n) + { + if (Configuration.DEBUG && abs(n) >= 2048) + throw new InternalError("Assertion failure"); + if (x == 0 || x == Double.NEGATIVE_INFINITY + || ! (x < Double.POSITIVE_INFINITY) || n == 0) + return x; + long bits = Double.doubleToLongBits(x); + int exp = (int) (bits >> 52) & 0x7ff; + if (exp == 0) // Subnormal x. + { + x *= TWO_54; + exp = ((int) (Double.doubleToLongBits(x) >> 52) & 0x7ff) - 54; + } + exp += n; + if (exp > 0x7fe) // Overflow. + return Double.POSITIVE_INFINITY * x; + if (exp > 0) // Normal. + return Double.longBitsToDouble((bits & 0x800fffffffffffffL) + | ((long) exp << 52)); + if (exp <= -54) + return 0 * x; // Underflow. + exp += 54; // Subnormal result. + x = Double.longBitsToDouble((bits & 0x800fffffffffffffL) + | ((long) exp << 52)); + return x * (1 / TWO_54); + } + + /** + * Helper trig function; computes sin in range [-pi/4, pi/4]. + * + * @param x angle within about pi/4 + * @param y tail of x, created by remPiOver2 + * @return sin(x+y) + */ + private static double sin(double x, double y) + { + if (Configuration.DEBUG && abs(x + y) > 0.7854) + throw new InternalError("Assertion failure"); + if (abs(x) < 1 / TWO_27) + return x; // If |x| ~< 2**-27, already know answer. + + double z = x * x; + double v = z * x; + double r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6))); + if (y == 0) + return x + v * (S1 + z * r); + return x - ((z * (0.5 * y - v * r) - y) - v * S1); + } + + /** + * Helper trig function; computes cos in range [-pi/4, pi/4]. + * + * @param x angle within about pi/4 + * @param y tail of x, created by remPiOver2 + * @return cos(x+y) + */ + private static double cos(double x, double y) + { + if (Configuration.DEBUG && abs(x + y) > 0.7854) + throw new InternalError("Assertion failure"); + x = abs(x); + if (x < 1 / TWO_27) + return 1; // If |x| ~< 2**-27, already know answer. + + double z = x * x; + double r = z * (C1 + z * (C2 + z * (C3 + z * (C4 + z * (C5 + z * C6))))); + + if (x < 0.3) + return 1 - (0.5 * z - (z * r - x * y)); + + double qx = (x > 0.78125) ? 0.28125 : (x * 0.25); + return 1 - qx - ((0.5 * z - qx) - (z * r - x * y)); + } + + /** + * Helper trig function; computes tan in range [-pi/4, pi/4]. + * + * @param x angle within about pi/4 + * @param y tail of x, created by remPiOver2 + * @param invert true iff -1/tan should be returned instead + * @return tan(x+y) + */ + private static double tan(double x, double y, boolean invert) + { + // PI/2 is irrational, so no double is a perfect multiple of it. + if (Configuration.DEBUG && (abs(x + y) > 0.7854 || (x == 0 && invert))) + throw new InternalError("Assertion failure"); + boolean negative = x < 0; + if (negative) + { + x = -x; + y = -y; + } + if (x < 1 / TWO_28) // If |x| ~< 2**-28, already know answer. + return (negative ? -1 : 1) * (invert ? -1 / x : x); + + double z; + double w; + boolean large = x >= 0.6744; + if (large) + { + z = PI / 4 - x; + w = PI_L / 4 - y; + x = z + w; + y = 0; + } + z = x * x; + w = z * z; + // Break x**5*(T1+x**2*T2+...) into + // x**5(T1+x**4*T3+...+x**20*T11) + // + x**5(x**2*(T2+x**4*T4+...+x**22*T12)). + double r = T1 + w * (T3 + w * (T5 + w * (T7 + w * (T9 + w * T11)))); + double v = z * (T2 + w * (T4 + w * (T6 + w * (T8 + w * (T10 + w * T12))))); + double s = z * x; + r = y + z * (s * (r + v) + y); + r += T0 * s; + w = x + r; + if (large) + { + v = invert ? -1 : 1; + return (negative ? -1 : 1) * (v - 2 * (x - (w * w / (w + v) - r))); + } + if (! invert) + return w; + + // Compute -1.0/(x+r) accurately. + z = (float) w; + v = r - (z - x); + double a = -1 / w; + double t = (float) a; + return t + a * (1 + t * z + t * v); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/String.java gcc-3.1/libjava/java/lang/String.java *** gcc-3.0.4/libjava/java/lang/String.java Sun Apr 1 21:49:48 2001 --- gcc-3.1/libjava/java/lang/String.java Tue Dec 11 18:01:40 2001 *************** *** 1,4 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** import java.util.Locale; *** 22,28 **** * Status: Complete to 1.3. */ ! public final class String implements Serializable, Comparable { private Object data; private int boffset; // Note this is a byte offset - don't use in Java code! --- 22,28 ---- * Status: Complete to 1.3. */ ! public final class String implements Serializable, Comparable, CharSequence { private Object data; private int boffset; // Note this is a byte offset - don't use in Java code! *************** public final class String implements Ser *** 32,44 **** // but it will avoid showing up as a discrepancy when comparing SUIDs. private static final long serialVersionUID = -6849794470754667710L; ! public static final Comparator CASE_INSENSITIVE_ORDER = new Comparator() { ! public int compare (Object o1, Object o2) { ! return ((String) o1).compareToIgnoreCase ((String) o2); } ! }; public String () { --- 32,75 ---- // but it will avoid showing up as a discrepancy when comparing SUIDs. private static final long serialVersionUID = -6849794470754667710L; ! /** ! * An implementation for {@link CASE_INSENSITIVE_ORDER}. ! * This must be {@link Serializable}. ! */ ! private static final class CaseInsensitiveComparator ! implements Comparator, Serializable { ! /** ! * The default private constructor generates unnecessary overhead ! */ ! CaseInsensitiveComparator() {} ! ! /** ! * Compares two Strings, using ! * String.compareToIgnoreCase(String). ! * ! * @param o1 the first string ! * @param o2 the second string ! * @return < 0, 0, or > 0 depending on the case-insensitive ! * comparison of the two strings. ! * @throws NullPointerException if either argument is null ! * @throws ClassCastException if either argument is not a String ! * @see #compareToIgnoreCase(String) ! */ ! public int compare(Object o1, Object o2) { ! return ((String) o1).compareToIgnoreCase((String) o2); } ! } ! ! /** ! * A Comparator that uses String.compareToIgnoreCase(String). ! * This comparator is {@link Serializable}. ! * ! * @since 1.2 ! */ ! public static final Comparator CASE_INSENSITIVE_ORDER ! = new CaseInsensitiveComparator(); public String () { *************** public final class String implements Ser *** 61,66 **** --- 92,107 ---- } } + // This is used by gnu.gcj.runtime.StringBuffer, so it must have + // package-private protection. It is accessed via CNI and so avoids + // ordinary protection mechanisms. + String (gnu.gcj.runtime.StringBuffer buffer) + { + // No need to synchronize or mark the buffer, since we know it is + // only used once. + init (buffer.value, 0, buffer.count, true); + } + public String (char[] data) { init(data, 0, data.length, false); *************** public final class String implements Ser *** 266,271 **** --- 307,334 ---- } } + /** + * Creates a substring of this String, starting at a specified index + * and ending at one character before a specified index. + *

    + * To implement CharSequence. + * Calls substring(beginIndex, endIndex). + * + * @param beginIndex index to start substring (base 0) + * @param endIndex index after the last character to be + * copied into the substring + * + * @return new String which is a substring of this String + * + * @exception StringIndexOutOfBoundsException + * if (beginIndex < 0 || endIndex > this.length() || beginIndex > endIndex) + */ + public CharSequence subSequence(int beginIndex, int endIndex) + throws IndexOutOfBoundsException + { + return substring(beginIndex, endIndex); + } + public String substring (int beginIndex) { return substring (beginIndex, count); *************** public final class String implements Ser *** 319,328 **** public static native String valueOf (char c); ! public static String valueOf (int i) ! { ! return Integer.toString(i); ! } public static String valueOf (long l) { --- 382,388 ---- public static native String valueOf (char c); ! public static native String valueOf (int i); public static String valueOf (long l) { diff -Nrc3pad gcc-3.0.4/libjava/java/lang/StringBuffer.java gcc-3.1/libjava/java/lang/StringBuffer.java *** gcc-3.0.4/libjava/java/lang/StringBuffer.java Sun Jan 7 20:01:46 2001 --- gcc-3.1/libjava/java/lang/StringBuffer.java Tue Jan 22 22:40:16 2002 *************** *** 1,21 **** ! // StringBuffer.java - Growable strings. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; import java.io.Serializable; - /** - * @author Tom Tromey - * @date October 23, 1998. - */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * Updated using online JDK 1.2 docs. * Believed complete and correct to JDK 1.2. --- 1,43 ---- ! /* StringBuffer.java -- Growable strings ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; import java.io.Serializable; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * Updated using online JDK 1.2 docs. * Believed complete and correct to JDK 1.2. *************** import java.io.Serializable; *** 57,63 **** * @author Tom Tromey * @see java.lang.String */ ! public final class StringBuffer implements Serializable { /** Append the String value of the argument to this StringBuffer. * Uses String.valueOf() to convert to --- 79,85 ---- * @author Tom Tromey * @see java.lang.String */ ! public final class StringBuffer implements Serializable, CharSequence { /** Append the String value of the argument to this StringBuffer. * Uses String.valueOf() to convert to *************** public final class StringBuffer implemen *** 89,98 **** * @return this StringBuffer. * @see java.lang.String#valueOf(int) */ ! public StringBuffer append (int inum) ! { ! return append (String.valueOf(inum)); ! } /** Append the String value of the argument to this StringBuffer. * Uses String.valueOf() to convert to --- 111,117 ---- * @return this StringBuffer. * @see java.lang.String#valueOf(int) */ ! public native StringBuffer append (int inum); /** Append the String value of the argument to this StringBuffer. * Uses String.valueOf() to convert to *************** public final class StringBuffer implemen *** 201,207 **** * @param index the index of the character to get, starting at 0. * @return the character at the specified index. * @exception IndexOutOfBoundsException if the desired character index ! * is not between 0 and length() - 1 (inclusive). */ public synchronized char charAt (int index) { --- 220,226 ---- * @param index the index of the character to get, starting at 0. * @return the character at the specified index. * @exception IndexOutOfBoundsException if the desired character index ! * is negative or greater then length() - 1. */ public synchronized char charAt (int index) { *************** public final class StringBuffer implemen *** 656,661 **** --- 675,702 ---- return new String (value, beginIndex, endIndex - beginIndex); } + /** + * Creates a substring of this StringBuffer, starting at a specified index + * and ending at one character before a specified index. + *

    + * To implement CharSequence. + * Calls substring(beginIndex, endIndex). + * + * @param beginIndex index to start substring (base 0) + * @param endIndex index after the last character to be + * copied into the substring + * + * @return new String which is a substring of this StringBuffer + * + * @exception StringIndexOutOfBoundsException + * if (beginIndex < 0 || endIndex > this.length() || beginIndex > endIndex) + */ + public CharSequence subSequence (int beginIndex, int endIndex) + { + return substring(beginIndex, endIndex); + } + + /** Convert this StringBuffer to a String. * @return the characters in this StringBuffer */ diff -Nrc3pad gcc-3.0.4/libjava/java/lang/StringIndexOutOfBoundsException.java gcc-3.1/libjava/java/lang/StringIndexOutOfBoundsException.java *** gcc-3.0.4/libjava/java/lang/StringIndexOutOfBoundsException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/StringIndexOutOfBoundsException.java Tue Jan 22 22:40:16 2002 *************** *** 1,37 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class StringIndexOutOfBoundsException extends IndexOutOfBoundsException { public StringIndexOutOfBoundsException() ! { ! super(); ! } ! public StringIndexOutOfBoundsException(int index) ! { ! this("String index out of range: " + index); ! } ! public StringIndexOutOfBoundsException(String msg) ! { ! super(msg); ! } } --- 1,90 ---- ! /* StringIndexOutOfBoundsException.java -- exception thrown to indicate ! an attempt to access an index which is out of bounds. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * Exceptions may be thrown by one part of a Java program and caught ! * by another in order to deal with exceptional conditions. ! * This exception can be thrown to indicate an attempt to access an ! * index which is out of bounds. ! * Any negative integer less than or equal to -1 and positive ! * integer greater than or equal to the size of the string is an index ! * which would be out of bounds. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class StringIndexOutOfBoundsException extends IndexOutOfBoundsException { + static final long serialVersionUID = -6762910422159637258L; + + /** + * Create an exception without a message. + */ public StringIndexOutOfBoundsException() ! { ! super(); ! } ! /** ! * Create an exception with a message. ! */ ! public StringIndexOutOfBoundsException(String s) ! { ! super(s); ! } ! /** ! * Create an exception noting the illegal index. ! */ ! public StringIndexOutOfBoundsException(int index) ! { ! super("String index out of range: " + index); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/System.java gcc-3.1/libjava/java/lang/System.java *** gcc-3.0.4/libjava/java/lang/System.java Mon Mar 12 07:33:57 2001 --- gcc-3.1/libjava/java/lang/System.java Sun Sep 2 06:18:48 2001 *************** public final class System *** 158,164 **** public static String getProperty (String property, String defval) { if (secman != null) ! secman.checkPropertyAccess(property, defval); if (properties == null) init_properties (); return properties.getProperty(property, defval); --- 158,164 ---- public static String getProperty (String property, String defval) { if (secman != null) ! secman.checkPropertyAccess(property); if (properties == null) init_properties (); return properties.getProperty(property, defval); diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Thread.java gcc-3.1/libjava/java/lang/Thread.java *** gcc-3.0.4/libjava/java/lang/Thread.java Fri Jan 5 00:31:45 2001 --- gcc-3.1/libjava/java/lang/Thread.java Fri Jan 4 20:38:20 2002 *************** *** 1,6 **** // Thread.java - Thread class. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // Thread.java - Thread class. ! /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** public class Thread implements Runnable *** 109,116 **** public final native void resume (); - // This method exists only to avoid a warning from the C++ compiler. - private static final native void run_ (Object obj); private final native void finish_ (); // Check the thread's interrupted status. If clear_flag is true, the --- 109,114 ---- *************** public class Thread implements Runnable *** 195,201 **** public static native void sleep (long timeout, int nanos) throws InterruptedException; ! public synchronized native void start (); public final void stop () { --- 193,199 ---- public static native void sleep (long timeout, int nanos) throws InterruptedException; ! public native void start (); public final void stop () { *************** public class Thread implements Runnable *** 204,226 **** stop (null); } ! public final synchronized native void stop (Throwable e); public final native void suspend (); private final native void initialize_native (); ! private final synchronized static String gen_name () { ! String n; ! n = "Thread-" + nextThreadNumber; ! ++nextThreadNumber; ! return n; } ! public Thread (ThreadGroup g, Runnable r, String n) { - Thread current = currentThread (); - if (g == null) { // If CURRENT is null, then we are bootstrapping the first thread. --- 202,226 ---- stop (null); } ! public final native void stop (Throwable e); public final native void suspend (); private final native void initialize_native (); ! private final native static String gen_name (); ! ! public Thread (ThreadGroup g, Runnable r, String n) { ! this (currentThread (), g, r, n); ! ! // The Class Libraries book says ``threadName cannot be null''. I ! // take this to mean NullPointerException. ! if (n == null) ! throw new NullPointerException (); } ! private Thread (Thread current, ThreadGroup g, Runnable r, String n) { if (g == null) { // If CURRENT is null, then we are bootstrapping the first thread. *************** public class Thread implements Runnable *** 233,249 **** else group = g; - group.checkAccess(); - - // The Class Libraries book says ``threadName cannot be null''. I - // take this to mean NullPointerException. - if (n == null) - throw new NullPointerException (); - - name = n; - group.addThread(this); - runnable = r; - data = null; interrupt_flag = false; alive_flag = false; --- 233,238 ---- *************** public class Thread implements Runnable *** 251,261 **** --- 240,253 ---- if (current != null) { + group.checkAccess(); + daemon_flag = current.isDaemon(); int gmax = group.getMaxPriority(); int pri = current.getPriority(); priority = (gmax < pri ? gmax : pri); context_class_loader = current.context_class_loader; + InheritableThreadLocal.newChildThread(this); } else { *************** public class Thread implements Runnable *** 263,268 **** --- 255,264 ---- priority = NORM_PRIORITY; } + name = n; + group.addThread(this); + runnable = r; + initialize_native (); } *************** public class Thread implements Runnable *** 315,323 **** private boolean startable_flag; private ClassLoader context_class_loader; ! // Our native data. private Object data; - - // Next thread number to assign. - private static int nextThreadNumber = 0; } --- 311,316 ---- private boolean startable_flag; private ClassLoader context_class_loader; ! // Our native data - points to an instance of struct natThread. private Object data; } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ThreadDeath.java gcc-3.1/libjava/java/lang/ThreadDeath.java *** gcc-3.0.4/libjava/java/lang/ThreadDeath.java Fri Sep 8 19:37:08 2000 --- gcc-3.1/libjava/java/lang/ThreadDeath.java Tue Jan 22 22:40:16 2002 *************** *** 1,19 **** ! // ThreadDeath.java - Special exception registering Thread death. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.lang; ! /** ! * @author Tom Tromey ! * @date August 26, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 --- 1,42 ---- ! /* java.lang.ThreadDeath - Special exception registering Thread death. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.lang; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 *************** package java.lang; *** 21,30 **** * Status: Complete to version 1.1 */ ! public class ThreadDeath extends Error ! { ! public ThreadDeath () ! { ! super (); ! } } --- 44,60 ---- * Status: Complete to version 1.1 */ ! /** ! ** ThreadDeath is thrown in a thread when someone calls stop() on that thread. ! ** ! ** Important: Make sure you rethrow this exception if you catch it. If you don't, the thread will not die. ! ** ! ** @author John Keiser ! ** @author Tom Tromey ! ** @version 1.1.0, 5 Feb 1998, August 26 1998 ! ** @since JDK1.0 ! ** @see java.lang.Thread#stop() ! **/ ! ! public class ThreadDeath extends Error { } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ThreadGroup.java gcc-3.1/libjava/java/lang/ThreadGroup.java *** gcc-3.0.4/libjava/java/lang/ThreadGroup.java Mon Mar 12 07:33:57 2001 --- gcc-3.1/libjava/java/lang/ThreadGroup.java Tue Jan 22 22:40:16 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; *************** public class ThreadGroup *** 510,526 **** else if (! (t instanceof ThreadDeath)) { if (thread != null) ! System.out.print("Exception in thread \"" + thread.getName() + "\" "); try { ! t.printStackTrace(); } catch (Throwable x) { // This means that something is badly screwed up with the runtime, // or perhaps someone is messing with the SecurityManager. In any // case, try to deal with it gracefully. ! System.out.println(t); System.err.println("*** Got " + x.toString() + " while trying to print stack trace"); } --- 521,538 ---- else if (! (t instanceof ThreadDeath)) { if (thread != null) ! System.err.print ("Exception in thread \"" ! + thread.getName() + "\" "); try { ! t.printStackTrace(System.err); } catch (Throwable x) { // This means that something is badly screwed up with the runtime, // or perhaps someone is messing with the SecurityManager. In any // case, try to deal with it gracefully. ! System.err.println(t); System.err.println("*** Got " + x.toString() + " while trying to print stack trace"); } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ThreadLocal.java gcc-3.1/libjava/java/lang/ThreadLocal.java *** gcc-3.0.4/libjava/java/lang/ThreadLocal.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/ThreadLocal.java Tue Jan 22 22:40:16 2002 *************** *** 0 **** --- 1,176 ---- + /* java.lang.ThreadLocal + Copyright (C) 2000 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; + + import java.util.Map; + import java.util.WeakHashMap; + + /** + * ThreadLocal objects have a different state associated with every + * Thread that accesses them. Every access to the ThreadLocal object + * (through the get() and set() methods) + * only affects the state of the object as seen by the currently + * executing Thread. + *

    + * The first time a ThreadLocal object is accessed on a particular + * Thread (and no state is associated with that Thread yet) + * the state for that Thread is set by executing the method + * initialValue(). + *

    + * An example how you can use this: + *

    +  * class Connection {
    +  *     private static ThreadLocal owner = new ThreadLocal() {
    +  *        public Object initialValue() {
    +  *            return("nobody");
    +  *        }
    +  *     };
    +  * ...
    +  * }
    +  * 
    + * Now all instances of connection can see who the owner of the currently + * executing Thread is by calling owner.get(). By default any + * Thread would be associated with 'nobody'. But the Connection object could + * offer a method that changes the owner associated with the Thread on + * which the method was called by calling owner.put("somebody"). + * (Such an owner changing method should then be guarded by security checks.) + *

    + * When a Thread is garbage collected all references to values of + * the ThreadLocal objects associated with that Thread are removed. + * + * @since 1.2 + * @author Mark Wielaard (mark@klomp.org) + */ + public class ThreadLocal { + + /** + * Trivial container to wrap the stored values. + * Needed to see if the value is null or not yet set. + * If it is not yet set we must call intialValue() once. + * Package local so InheritableThreadLocal can see it. + */ + final static class Value { + final Object value; + + Value(Object value) { + this.value = value; + } + + Object getValue() { + return value; + } + } + + /** + * Maps Threads to Values. Uses a WeakHashMap so if a Thread is garbage + * collected the reference to the Value will disappear. Only the + * set(Thread, Value) and get(Thread) methods + * access it. Since this can happen from multiple Threads simultaniously + * those methods are synchronized. + */ + private final Map valueMap = new WeakHashMap(); + + /** + * Creates a ThreadLocal object without associating any value to it + * yet. + */ + public ThreadLocal() { + } + + /** + * Gets the value associated with the ThreadLocal object for the + * currently executing Thread. If there is no value is associated + * with this Thread yet then the valued returned by the + * initialValue() method is assosiated with this Thread + * and returned. + */ + public Object get() { + Thread currentThread = Thread.currentThread(); + Value v = get(currentThread); + if (v == null) { + v = new Value(initialValue()); + set(currentThread, v); + } + return v.getValue(); + } + + /** + * Gets the Value of this ThreadLocal for a particular Thread. + * It is synchronized so the set(Thread, Value) method cannot + * simultaniously modify the valueMap from another thread. + * Package local so InheritableThreadLocal can access it when a new child + * Thread inherits values from its parent Thread. + */ + synchronized final Value get(Thread thread) { + return (Value)valueMap.get(thread); + } + + /** + * Sets the value associated with the ThreadLocal object for the + * currently executing Thread. This overrides any existing value + * associated with the current Thread and does not call the + * initialValue() method, even if this is the first + * time this Thread accesses this ThreadLocal. + */ + public void set(Object value) { + Thread currentThread = Thread.currentThread(); + Value v = new Value(value); + set(currentThread, v); + } + + /** + * Sets the Value for this ThreadLocal for a particular Thread. + * It is synchronized so the get(Thread) method cannot + * simultaniously read the valueMap from another thread. + * Package local so InheritableThreadLocal can access it when a new child + * Thread inherits values from its parent Thread. + */ + synchronized final void set(Thread thread, Value value) { + valueMap.put(thread, value); + } + + /** + * Called when get() is called and no state is associated + * with the currently executing Thread yet. + *

    + * The default implementation returns null. + */ + protected Object initialValue() { + return null; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/UnknownError.java gcc-3.1/libjava/java/lang/UnknownError.java *** gcc-3.0.4/libjava/java/lang/UnknownError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/UnknownError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // UnknownError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class UnknownError extends VirtualMachineError { ! public UnknownError () ! { ! super (); ! } ! public UnknownError (String msg) ! { ! super (msg); ! } } --- 1,74 ---- ! /* UnknownError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * An UnknownError is thrown when a serious but unknown + * problem has occurred in the Java Virtual Machine. + * + * @since JDK 1.0 + * + * @author Brian Jones + */ public class UnknownError extends VirtualMachineError { ! static final long serialVersionUID = 2524784860676771849L; ! /** ! * Create an error without a message. ! */ ! public UnknownError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public UnknownError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/UnsatisfiedLinkError.java gcc-3.1/libjava/java/lang/UnsatisfiedLinkError.java *** gcc-3.0.4/libjava/java/lang/UnsatisfiedLinkError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/UnsatisfiedLinkError.java Tue Jan 22 22:40:16 2002 *************** *** 1,34 **** ! // UnsatisfiedLinkError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ public class UnsatisfiedLinkError extends LinkageError { ! public UnsatisfiedLinkError () ! { ! super (); ! } ! public UnsatisfiedLinkError (String msg) ! { ! super (msg); ! } } --- 1,77 ---- ! /* UnsatisfiedLinkError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. */ + /** + * A UnsatisfiedLinkError is thrown if an appropriate + * native language definition of a method declared native + * cannot be found by the Java Virtual Machine. + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class UnsatisfiedLinkError extends LinkageError { ! static final long serialVersionUID = -4019343241616879428L; ! /** ! * Create an error without a message. ! */ ! public UnsatisfiedLinkError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public UnsatisfiedLinkError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/UnsupportedClassVersionError.java gcc-3.1/libjava/java/lang/UnsupportedClassVersionError.java *** gcc-3.0.4/libjava/java/lang/UnsupportedClassVersionError.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/UnsupportedClassVersionError.java Tue Jan 22 22:40:17 2002 *************** *** 0 **** --- 1,69 ---- + /* UnsupportedClassVersionError.java + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.lang; + + /** + * An UnsupportedClassVersionError is thrown when the + * Java Virtual Machine determines it does not support the major and minor + * version numbers in the class file it is attempting to read. + * + * @since JDK 1.2 + * + * @author Brian Jones + */ + public class UnsupportedClassVersionError extends ClassFormatError + { + static final long serialVersionUID = -7123279212883497373L; + + /** + * Create an error without a message. + */ + public UnsupportedClassVersionError() + { + super(); + } + + /** + * Create an error with a message. + */ + public UnsupportedClassVersionError(String s) + { + super(s); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/UnsupportedOperationException.java gcc-3.1/libjava/java/lang/UnsupportedOperationException.java *** gcc-3.0.4/libjava/java/lang/UnsupportedOperationException.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/UnsupportedOperationException.java Tue Jan 22 22:40:17 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Warren Levy ! * @date September 18, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class UnsupportedOperationException extends RuntimeException { ! public UnsupportedOperationException() { super(); } ! public UnsupportedOperationException(String msg) { ! super(msg); } } --- 1,76 ---- ! /* UnsupportedOperationException.java -- Exception thrown when an ! unsupported operation is attempted on an object ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This exception is thrown by an object when an operation is ! * requested of it that it does not support. ! * ! * @since JDK 1.2 ! * ! * @author Warren Levy ! * @date September 18, 1998. ! */ public class UnsupportedOperationException extends RuntimeException { ! static final long serialVersionUID = -1242599979055084673L; ! ! /** ! * Create an exception without a message. ! */ ! public UnsupportedOperationException() { super(); } ! /** ! * Create an exception with a message. ! */ ! public UnsupportedOperationException( String s ) { ! super(s); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/VMClassLoader.java gcc-3.1/libjava/java/lang/VMClassLoader.java *** gcc-3.0.4/libjava/java/lang/VMClassLoader.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/VMClassLoader.java Fri Oct 26 01:51:04 2001 *************** *** 0 **** --- 1,62 ---- + /* + * java.lang.ClassLoader: part of the Java Class Libraries project. + * Copyright (C) 1998, 2001 Free Software Foundation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + package java.lang; + + /** + * java.lang.VMClassLoader is a package-private helper for VMs to implement + * on behalf of java.lang.ClassLoader. + * + * @author John Keiser + * @version 1.1.0, Sep 22 1998 + * @since CP1.1 + */ + + class VMClassLoader { + + /** + * Helper to define a class using a string of bytes. + * + * @param name the name to give the class. null if unknown. + * @param data the data representing the classfile, in classfile format. + * @param offset the offset into the data where the classfile starts. + * @param len the length of the classfile data in the array. + * @return the class that was defined. + * @exception ClassFormatError if the byte array is not in proper classfile format. + */ + // Not yet needed for libgcj. + // final static native Class defineClass(ClassLoader cl, String name, + // byte[] data, int offset, int len) throws ClassFormatError; + + /** + * Helper to resolve all references to other classes from this class. + * @param c the class to resolve. + */ + // Not yet needed for libgcj. + // final static native void resolveClass(Class c); + + /** + * Helper for java.lang.Integer, Byte, etc. to get the TYPE class + * at initialization time. + * + * @param type code for the primitive type. + */ + static native Class getPrimitiveClass(char type); + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/VMSecurityManager.java gcc-3.1/libjava/java/lang/VMSecurityManager.java *** gcc-3.0.4/libjava/java/lang/VMSecurityManager.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/VMSecurityManager.java Sun Sep 2 06:18:48 2001 *************** *** 0 **** --- 1,71 ---- + /* + * java.lang.SecurityManager: part of the Java Class Libraries project. + * Copyright (C) 1998, 2001 Free Software Foundation + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + package java.lang; + + import java.net.*; + import java.util.*; + import java.io.*; + + /** + ** VMSecurityManager is a helper class for SecurityManager the VM must + ** implement. + ** + ** @author John Keiser + ** @version 1.1.0, 31 May 1998 + **/ + class VMSecurityManager + { + /** Get a list of all the classes currently executing + ** methods on the Java stack. getClassContext()[0] is + ** the currently executing method + ** Spec Note: does not say whether + ** the stack will include the getClassContext() call or + ** the one just before it. + ** + ** @return an array containing all the methods on classes + ** on the Java execution stack. + **/ + static Class[] getClassContext() + { + // FIXME: can't yet implement this for libgcj. + return new Class[0]; + } + + /** Get the current ClassLoader--the one nearest to the + ** top of the stack. + ** @return the current ClassLoader. + **/ + static ClassLoader currentClassLoader() + { + // The docs above are wrong. See the online docs. + // FIXME this implementation is a bit wrong too -- the docs say we + // must also consider ancestors of the system class loader. + Class[] classStack = getClassContext (); + for (int i = 0; i < classStack.length; i++) + { + ClassLoader loader = classStack[i].getClassLoader(); + if (loader != null) + return loader; + } + + return null; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/VerifyError.java gcc-3.1/libjava/java/lang/VerifyError.java *** gcc-3.0.4/libjava/java/lang/VerifyError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/VerifyError.java Tue Jan 22 22:40:17 2002 *************** *** 1,34 **** ! // VerifyError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class VerifyError extends LinkageError { ! public VerifyError () ! { ! super (); ! } ! public VerifyError (String msg) ! { ! super (msg); ! } } --- 1,76 ---- ! /* VerifyError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * A VerifyError is thrown if there is a security problem or + * internal inconsistency in a class file as deteced by the "verifier." + * + * @since JDK 1.0 + * + * @author Brian Jones + * @author Tom Tromey + * @date October 1, 1998 + */ public class VerifyError extends LinkageError { ! static final long serialVersionUID = 7001962396098498785L; ! /** ! * Create an error without a message. ! */ ! public VerifyError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public VerifyError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/VirtualMachineError.java gcc-3.1/libjava/java/lang/VirtualMachineError.java *** gcc-3.0.4/libjava/java/lang/VirtualMachineError.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/VirtualMachineError.java Tue Jan 22 22:40:17 2002 *************** *** 1,39 **** ! // VirtualMachineError.java ! ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang; ! ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! /* FIXME: We should consider adding some special error message when this ! * exception is thrown, or maybe if it being caught at top-level. Such ! * a message would direct the user to send a bug report to ! * gcj-bugs@cygnus.com, or something like that. --KKT */ ! public abstract class VirtualMachineError extends Error { ! public VirtualMachineError () ! { ! super (); ! } ! public VirtualMachineError (String msg) ! { ! super (msg); ! } } --- 1,77 ---- ! /* VirtualMachineError.java ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! /** ! * A VirtualMachineError or its subclasses are thrown to ! * indicate there is something wrong with the Java Virtual Machine or that ! * it does not have the resources needed for it to continue execution. ! * ! * @since JDK 1.0 ! * ! * @author Brian Jones ! * @author Tom Tromey ! * @date October 1, 1998 ! */ public abstract class VirtualMachineError extends Error { ! static final long serialVersionUID = 4161983926571568670L; ! /** ! * Create an error without a message. ! */ ! public VirtualMachineError() ! { ! super(); ! } ! ! /** ! * Create an error with a message. ! */ ! public VirtualMachineError(String s) ! { ! super(s); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Void.java gcc-3.1/libjava/java/lang/Void.java *** gcc-3.0.4/libjava/java/lang/Void.java Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/Void.java Tue Jan 22 22:40:17 2002 *************** *** 1,30 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.lang; - /** - * @author Per Bothner - * @date April 18, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Complete. */ public final class Void { ! // This initialization is seemingly circular, but it is accepted ! // by javac, and is handled specially by gcc. ! public final static Class TYPE = void.class; ! // Don't allow Void objects to be made. ! private Void () ! { ! } } --- 1,67 ---- ! /* java.lang.Void ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang; /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Complete. */ + /** + * Void is a placeholder class so that the variable Void.TYPE can be + * supported for reflection return types. + * + * @author Paul Fisher + * @author John Keiser + * @author Per Bothner + * @since JDK1.1 + */ public final class Void { ! /** ! * The return type void is represented by this ! * Class object. ! */ ! public static final Class TYPE = VMClassLoader.getPrimitiveClass('V'); ! /** ! * Don't allow Void objects to be made. ! */ ! private Void() { } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/Win32Process.java gcc-3.1/libjava/java/lang/Win32Process.java *** gcc-3.0.4/libjava/java/lang/Win32Process.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/Win32Process.java Sun Mar 10 18:00:05 2002 *************** *** 0 **** --- 1,68 ---- + // Win32Process.java - Subclass of Process for Win32 systems. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package java.lang; + + import java.io.InputStream; + import java.io.OutputStream; + import java.io.IOException; + + /** + * @author Adam Megacz + * @date Feb 24, 2002 + */ + + // This is entirely internal to our implementation. + + // NOTE: when this is implemented, we'll need to add + // HANDLE_FLAG_INHERIT in FileDescriptor and other places, to make + // sure that file descriptors aren't inherited by the child process. + // See _Jv_platform_close_on_exec. + + // This file is copied to `ConcreteProcess.java' before compilation. + // Hence the class name apparently does not match the file name. + final class ConcreteProcess extends Process + { + public void destroy () + { + throw new Error("not implemented"); + } + + public int exitValue () + { + throw new Error("not implemented"); + } + + public InputStream getErrorStream () + { + throw new Error("not implemented"); + } + + public InputStream getInputStream () + { + throw new Error("not implemented"); + } + + public OutputStream getOutputStream () + { + throw new Error("not implemented"); + } + + public int waitFor () throws InterruptedException + { + throw new Error("not implemented"); + } + + public ConcreteProcess (String[] progarray, String[] envp) throws IOException + { + throw new IOException("not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ieeefp.h gcc-3.1/libjava/java/lang/ieeefp.h *** gcc-3.0.4/libjava/java/lang/ieeefp.h Fri Jun 23 19:53:33 2000 --- gcc-3.1/libjava/java/lang/ieeefp.h Sun Mar 17 16:16:58 2002 *************** *** 5,15 **** #define __IEEE_LITTLE_ENDIAN #endif ! #ifdef __arm__ /* ARM always has big-endian words. Within those words the byte ordering ! appears to be big or little endian. Newlib doesn't seem to care about ! the byte ordering within words. */ #define __IEEE_BIG_ENDIAN #endif #ifdef __hppa__ --- 5,17 ---- #define __IEEE_LITTLE_ENDIAN #endif ! #if defined(__arm__) || defined(__thumb__) /* ARM always has big-endian words. Within those words the byte ordering ! will be big or little endian depending upon the target. */ #define __IEEE_BIG_ENDIAN + #ifdef __ARMEL__ + #define __IEEE_BYTES_LITTLE_ENDIAN + #endif #endif #ifdef __hppa__ *************** *** 96,103 **** #define __IEEE_LITTLE_ENDIAN #endif ! #ifdef __PPC__ ! #if (defined(_BIG_ENDIAN) && _BIG_ENDIAN) || (defined(_AIX) && _AIX) #define __IEEE_BIG_ENDIAN #else #if (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN) || (defined(__sun__) && __sun__) || (defined(__WIN32__) && __WIN32__) --- 98,106 ---- #define __IEEE_LITTLE_ENDIAN #endif ! #if defined (__PPC__) || defined (__ppc__) ! #if (defined(_BIG_ENDIAN) && _BIG_ENDIAN) || (defined(_AIX) && _AIX) \ ! || defined (__APPLE__) #define __IEEE_BIG_ENDIAN #else #if (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN) || (defined(__sun__) && __sun__) || (defined(__WIN32__) && __WIN32__) diff -Nrc3pad gcc-3.0.4/libjava/java/lang/mprec.c gcc-3.1/libjava/java/lang/mprec.c *** gcc-3.0.4/libjava/java/lang/mprec.c Wed Apr 7 14:52:38 1999 --- gcc-3.1/libjava/java/lang/mprec.c Fri Sep 21 07:46:32 2001 *************** _DEFUN (lo0bits, (y), unsigned long *y) *** 296,302 **** { k++; x >>= 1; ! if (!x & 1) return 32; } *y = x; --- 296,302 ---- { k++; x >>= 1; ! if (!(x & 1)) return 32; } *y = x; diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natCharacter.cc gcc-3.1/libjava/java/lang/natCharacter.cc *** gcc-3.0.4/libjava/java/lang/natCharacter.cc Tue Mar 7 19:55:26 2000 --- gcc-3.1/libjava/java/lang/natCharacter.cc Wed Mar 6 19:13:00 2002 *************** *** 1,12 **** ! // natCharacter.cc - Native part of Character class. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ #include --- 1,39 ---- ! /* java.lang.Character -- Wrapper class for char, and Unicode subsets ! Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ #include *************** details. */ *** 18,284 **** - #define asize(x) ((sizeof (x)) / sizeof (x[0])) - - static jchar - to_lower_title (jchar ch) - { - for (unsigned int i = 0; i < asize (title_to_upper_table); ++i) - { - // We can assume that the entries in the two tables are - // parallel. This is checked in the script. - if (title_to_upper_table[i][1] == ch - || title_to_upper_table[i][0] == ch) - return title_to_lower_table[i][1]; - } - return ch; - } - - static jchar - to_upper_title (jchar ch) - { - for (unsigned int i = 0; i < asize (title_to_lower_table); ++i) - { - // We can assume that the entries in the two tables are - // parallel. This is checked in the script. - if (title_to_lower_table[i][1] == ch - || title_to_lower_table[i][0] == ch) - return title_to_upper_table[i][1]; - } - return ch; - } - - jboolean - java::lang::Character::isTitleCase (jchar ch) - { - for (unsigned int i = 0; i < asize (title_to_lower_table); ++i) - { - if (title_to_lower_table[i][0] == ch) - return true; - } - return false; - } - jchar ! java::lang::Character::toTitleCase (jchar ch) ! { ! // Both titlecase mapping tables have the same length. This is ! // checked in the chartables script. ! for (unsigned int i = 0; i < asize (title_to_lower_table); ++i) ! { ! if (title_to_lower_table[i][0] == ch) ! return ch; ! if (title_to_lower_table[i][1] == ch) ! return title_to_lower_table[i][0]; ! if (title_to_upper_table[i][1] == ch) ! return title_to_upper_table[i][0]; ! } ! return toUpperCase (ch); ! } ! ! #ifdef COMPACT_CHARACTER ! ! static int ! table_search (const jchar table[][2], int table_len, jchar ch) ! { ! int low, high, i, old; ! ! low = 0; ! high = table_len; ! i = high / 2; ! ! while (true) ! { ! if (ch < table[i][0]) ! high = i; ! else if (ch > table[i][1]) ! low = i; ! else ! return i; ! ! old = i; ! i = (high + low) / 2; ! if (i == old) ! break; ! } ! ! return -1; ! } ! ! jint ! java::lang::Character::digit_value (jchar ch) ! { ! int index = table_search (digit_table, asize (digit_table), ch); ! if (index == -1) ! return -1; ! ! jchar base = digit_table[index][0]; ! // Tamil doesn't have a digit `0'. So we special-case it here. ! if (base == TAMIL_DIGIT_ONE) ! return ch - base + 1; ! return ch - base; ! } ! ! jint ! java::lang::Character::getNumericValue (jchar ch) { ! jint d = digit (ch, 36); ! if (d != -1) ! return d; ! ! for (unsigned int i = 0; i < asize (numeric_table); ++i) ! { ! if (numeric_table[i] == ch) ! return numeric_value[i]; ! } ! ! return -1; } jint ! java::lang::Character::getType (jchar ch) ! { ! int index = table_search (all_table, asize (all_table), ch); ! if (index != -1) ! return category_table[index]; ! return UNASSIGNED; ! } ! ! jboolean ! java::lang::Character::isLowerCase (jchar ch) ! { ! if (ch >= 0x2000 && ch <= 0x2fff) ! return false; ! if (table_search (lower_case_table, asize (lower_case_table), ch) != -1) ! return true; ! ! int low, high, i, old; ! ! low = 0; ! high = asize (lower_anomalous_table); ! i = high / 2; ! ! while (true) ! { ! if (ch < lower_anomalous_table[i]) ! high = i; ! else if (ch > lower_anomalous_table[i]) ! low = i; ! else ! return true; ! ! old = i; ! i = (high + low) / 2; ! if (i == old) ! break; ! } ! ! return false; ! } ! ! jboolean ! java::lang::Character::isSpaceChar (jchar ch) ! { ! return table_search (space_table, asize (space_table), ch) != -1; ! } ! ! jboolean ! java::lang::Character::isUpperCase (jchar ch) { ! if (ch >= 0x2000 && ch <= 0x2fff) ! return false; ! return table_search (upper_case_table, asize (upper_case_table), ch) != -1; } jchar ! java::lang::Character::toLowerCase (jchar ch) { ! int index = table_search (upper_case_table, asize (upper_case_table), ch); ! if (index == -1) ! return to_lower_title (ch); ! return (jchar) (ch - upper_case_table[index][0] ! + upper_case_map_table[index]); } jchar ! java::lang::Character::toUpperCase (jchar ch) { ! int index = table_search (lower_case_table, asize (lower_case_table), ch); ! if (index == -1) ! return to_upper_title (ch); ! return (jchar) (ch - lower_case_table[index][0] ! + lower_case_map_table[index]); } ! #else /* COMPACT_CHARACTER */ ! ! jint ! java::lang::Character::digit_value (jchar ch) { ! if (type_table[ch] == DECIMAL_DIGIT_NUMBER) ! return attribute_table[ch]; ! return -1; } jint ! java::lang::Character::getNumericValue (jchar ch) { ! jint d = digit (ch, 36); ! if (d != -1) ! return d; ! ! // Some characters require two attributes. We special-case them here. ! if (ch >= ROMAN_START && ch <= ROMAN_END) ! return secondary_attribute_table[ch - ROMAN_START]; ! if (type_table[ch] == LETTER_NUMBER || type_table[ch] == OTHER_NUMBER) ! return attribute_table[ch]; ! return -1; } jint ! java::lang::Character::getType (jchar ch) ! { ! return type_table[ch]; ! } ! ! jboolean ! java::lang::Character::isLowerCase (jchar ch) ! { ! if (ch >= 0x2000 && ch <= 0x2fff) ! return false; ! return type_table[ch] == LOWERCASE_LETTER; ! } ! ! jboolean ! java::lang::Character::isSpaceChar (jchar ch) ! { ! return (type_table[ch] == SPACE_SEPARATOR ! || type_table[ch] == LINE_SEPARATOR ! || type_table[ch] == PARAGRAPH_SEPARATOR); ! } ! ! jboolean ! java::lang::Character::isUpperCase (jchar ch) ! { ! if (ch >= 0x2000 && ch <= 0x2fff) ! return false; ! return type_table[ch] == UPPERCASE_LETTER; ! } ! ! jchar ! java::lang::Character::toLowerCase (jchar ch) { ! if (type_table[ch] == UPPERCASE_LETTER) ! return attribute_table[ch]; ! return to_lower_title (ch); } ! jchar ! java::lang::Character::toUpperCase (jchar ch) { ! if (type_table[ch] == LOWERCASE_LETTER) ! return attribute_table[ch]; ! return to_upper_title (ch); } - - #endif /* COMPACT_CHARACTER */ --- 45,113 ---- jchar ! java::lang::Character::readChar(jchar ch) { ! // Perform 16-bit addition to find the correct entry in data. ! return data[(jchar) (blocks[ch >> SHIFT] + ch)]; } jint ! java::lang::Character::getType(jchar ch) { ! // Perform 16-bit addition to find the correct entry in data. ! return (jint) (data[(jchar) (blocks[ch >> SHIFT] + ch)] & TYPE_MASK); } jchar ! java::lang::Character::toLowerCase(jchar ch) { ! return (jchar) (ch + lower[readChar(ch) >> 7]); } jchar ! java::lang::Character::toUpperCase(jchar ch) { ! return (jchar) (ch + upper[readChar(ch) >> 7]); } ! jchar ! java::lang::Character::toTitleCase(jchar ch) { ! // As title is short, it doesn't hurt to exhaustively iterate over it. ! for (int i = title_length - 2; i >= 0; i -= 2) ! if (title[i] == ch) ! return title[i + 1]; ! return toUpperCase(ch); } jint ! java::lang::Character::digit(jchar ch, jint radix) { ! if (radix < MIN_RADIX || radix > MAX_RADIX) ! return (jint) -1; ! jchar attr = readChar(ch); ! if (((1 << (attr & TYPE_MASK)) ! & ((1 << UPPERCASE_LETTER) ! | (1 << LOWERCASE_LETTER) ! | (1 << DECIMAL_DIGIT_NUMBER)))) ! { ! // Signedness doesn't matter; 0xffff vs. -1 are both rejected. ! jint digit = (jint) numValue[attr >> 7]; ! return (digit >= 0 && digit < radix) ? digit : (jint) -1; ! } ! return (jint) -1; } jint ! java::lang::Character::getNumericValue(jchar ch) { ! // numValue is stored as an array of jshort, since 10000 is the maximum. ! return (jint) numValue[readChar(ch) >> 7]; } ! jbyte ! java::lang::Character::getDirectionality(jchar ch) { ! return direction[readChar(ch) >> 7]; } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natClass.cc gcc-3.1/libjava/java/lang/natClass.cc *** gcc-3.0.4/libjava/java/lang/natClass.cc Sun Sep 30 03:50:39 2001 --- gcc-3.1/libjava/java/lang/natClass.cc Fri Dec 21 19:47:50 2001 *************** details. */ *** 34,39 **** --- 34,40 ---- #include #include #include + #include #include #include #include *************** details. */ *** 42,47 **** --- 43,49 ---- #include #include #include + #include #include #include #include *************** details. */ *** 60,91 **** #define FieldClass java::lang::reflect::Field::class$ #define ConstructorClass java::lang::reflect::Constructor::class$ - // Some constants we use to look up the class initializer. - static _Jv_Utf8Const *void_signature = _Jv_makeUtf8Const ("()V", 3); - static _Jv_Utf8Const *clinit_name = _Jv_makeUtf8Const ("", 8); - static _Jv_Utf8Const *init_name = _Jv_makeUtf8Const ("", 6); - static _Jv_Utf8Const *finit_name = _Jv_makeUtf8Const ("finit$", 6); - // The legacy `$finit$' method name, which still needs to be - // recognized as equivalent to the now prefered `finit$' name. - static _Jv_Utf8Const *finit_leg_name = _Jv_makeUtf8Const ("$finit$", 7); - jclass java::lang::Class::forName (jstring className, jboolean initialize, java::lang::ClassLoader *loader) { if (! className) ! JvThrow (new java::lang::NullPointerException); jsize length = _Jv_GetStringUTFLength (className); char buffer[length]; _Jv_GetStringUTFRegion (className, 0, length, buffer); - // FIXME: should check syntax of CLASSNAME and throw - // IllegalArgumentException on failure. _Jv_Utf8Const *name = _Jv_makeUtf8Const (buffer, length); // FIXME: should use bootstrap class loader if loader is null. jclass klass = (buffer[0] == '[' ? _Jv_FindClassFromSignature (name->data, loader) --- 62,87 ---- #define FieldClass java::lang::reflect::Field::class$ #define ConstructorClass java::lang::reflect::Constructor::class$ + using namespace gcj; + jclass java::lang::Class::forName (jstring className, jboolean initialize, java::lang::ClassLoader *loader) { if (! className) ! throw new java::lang::NullPointerException; jsize length = _Jv_GetStringUTFLength (className); char buffer[length]; _Jv_GetStringUTFRegion (className, 0, length, buffer); _Jv_Utf8Const *name = _Jv_makeUtf8Const (buffer, length); + if (! _Jv_VerifyClassName (name)) + throw new java::lang::ClassNotFoundException (className); + // FIXME: should use bootstrap class loader if loader is null. jclass klass = (buffer[0] == '[' ? _Jv_FindClassFromSignature (name->data, loader) *************** java::lang::Class::forName (jstring clas *** 93,99 **** if (klass == NULL) throw new java::lang::ClassNotFoundException (className); ! if (initialize) _Jv_InitClass (klass); --- 89,95 ---- if (klass == NULL) throw new java::lang::ClassNotFoundException (className); ! if (initialize) _Jv_InitClass (klass); *************** java::lang::Class::forName (jstring clas *** 107,112 **** --- 103,131 ---- return forName (className, true, NULL); } + java::lang::ClassLoader * + java::lang::Class::getClassLoader (void) + { + #if 0 + // FIXME: the checks we need to do are more complex. See the spec. + // Currently we can't implement them. + java::lang::SecurityManager *s = java::lang::System::getSecurityManager(); + if (s != NULL) + s->checkPermission (new RuntimePermission (JvNewStringLatin1 ("getClassLoader"))); + #endif + + // The spec requires us to return `null' for primitive classes. In + // other cases we have the option of returning `null' for classes + // loaded with the bootstrap loader. All gcj-compiled classes which + // are linked into the application used to return `null' here, but + // that confuses some poorly-written applications. It is a useful + // and apparently harmless compatibility hack to simply never return + // `null' instead. + if (isPrimitive ()) + return NULL; + return loader ? loader : ClassLoader::getSystemClassLoader (); + } + java::lang::reflect::Constructor * java::lang::Class::getConstructor (JArray *param_types) { *************** java::lang::Class::getConstructor (JArra *** 131,137 **** return cons; } } ! JvThrow (new java::lang::NoSuchMethodException); } JArray * --- 150,156 ---- return cons; } } ! throw new java::lang::NoSuchMethodException; } JArray * *************** java::lang::Class::getDeclaredConstructo *** 196,202 **** return cons; } } ! JvThrow (new java::lang::NoSuchMethodException); } java::lang::reflect::Field * --- 215,221 ---- return cons; } } ! throw new java::lang::NoSuchMethodException; } java::lang::reflect::Field * *************** java::lang::Class::getDeclaredField (jst *** 243,249 **** rfield->name = name; return rfield; } ! JvThrow (new java::lang::NoSuchFieldException (name)); } JArray * --- 262,268 ---- rfield->name = name; return rfield; } ! throw new java::lang::NoSuchFieldException (name); } JArray * *************** java::lang::Class::getSignature (JArray< *** 291,300 **** { java::lang::StringBuffer *buf = new java::lang::StringBuffer (); buf->append((jchar) '('); - jclass *v = elements (param_types); // A NULL param_types means "no parameters". if (param_types != NULL) { for (int i = 0; i < param_types->length; ++i) v[i]->getSignature(buf); } --- 310,319 ---- { java::lang::StringBuffer *buf = new java::lang::StringBuffer (); buf->append((jchar) '('); // A NULL param_types means "no parameters". if (param_types != NULL) { + jclass *v = elements (param_types); for (int i = 0; i < param_types->length; ++i) v[i]->getSignature(buf); } *************** java::lang::Class::getDeclaredMethod (js *** 326,332 **** return rmethod; } } ! JvThrow (new java::lang::NoSuchMethodException); } JArray * --- 345,351 ---- return rmethod; } } ! throw new java::lang::NoSuchMethodException; } JArray * *************** java::lang::Class::getDeclaredMethods (v *** 341,349 **** if (method->name == NULL || _Jv_equalUtf8Consts (method->name, clinit_name) || _Jv_equalUtf8Consts (method->name, init_name) ! || _Jv_equalUtf8Consts (method->name, finit_name) ! // Backward compatibility hack: match the legacy `$finit$' name ! || _Jv_equalUtf8Consts (method->name, finit_leg_name)) continue; numMethods++; } --- 360,366 ---- if (method->name == NULL || _Jv_equalUtf8Consts (method->name, clinit_name) || _Jv_equalUtf8Consts (method->name, init_name) ! || _Jv_equalUtf8Consts (method->name, finit_name)) continue; numMethods++; } *************** java::lang::Class::getDeclaredMethods (v *** 357,365 **** if (method->name == NULL || _Jv_equalUtf8Consts (method->name, clinit_name) || _Jv_equalUtf8Consts (method->name, init_name) ! || _Jv_equalUtf8Consts (method->name, finit_name) ! // Backward compatibility hack: match the legacy `$finit$' name ! || _Jv_equalUtf8Consts (method->name, finit_leg_name)) continue; java::lang::reflect::Method* rmethod = new java::lang::reflect::Method (); --- 374,380 ---- if (method->name == NULL || _Jv_equalUtf8Consts (method->name, clinit_name) || _Jv_equalUtf8Consts (method->name, init_name) ! || _Jv_equalUtf8Consts (method->name, finit_name)) continue; java::lang::reflect::Method* rmethod = new java::lang::reflect::Method (); *************** java::lang::Class::getName (void) *** 382,387 **** --- 397,404 ---- JArray * java::lang::Class::getClasses (void) { + // FIXME: security checking. + // Until we have inner classes, it always makes sense to return an // empty array. JArray *result *************** java::lang::Class::_getFields (JArray * java::lang::Class::getFields (void) { + // FIXME: security checking. + using namespace java::lang::reflect; int count = _getFields (NULL, 0); *************** java::lang::Class::getMethod (jstring na *** 502,508 **** } } } ! JvThrow (new java::lang::NoSuchMethodException); } // This is a very slow implementation, since it re-scans all the --- 521,527 ---- } } } ! throw new java::lang::NoSuchMethodException; } // This is a very slow implementation, since it re-scans all the *************** java::lang::Class::_getMethods (JArrayname == NULL || _Jv_equalUtf8Consts (method->name, clinit_name) || _Jv_equalUtf8Consts (method->name, init_name) ! || _Jv_equalUtf8Consts (method->name, finit_name) ! // Backward compatibility hack: match the legacy `$finit$' name ! || _Jv_equalUtf8Consts (method->name, finit_leg_name)) continue; // Only want public methods. if (! java::lang::reflect::Modifier::isPublic (method->accflags)) --- 541,547 ---- if (method->name == NULL || _Jv_equalUtf8Consts (method->name, clinit_name) || _Jv_equalUtf8Consts (method->name, init_name) ! || _Jv_equalUtf8Consts (method->name, finit_name)) continue; // Only want public methods. if (! java::lang::reflect::Modifier::isPublic (method->accflags)) *************** java::lang::Class::newInstance (void) *** 647,665 **** // FIXME: we special-case one check here just to pass a Plum Hall // test. Once access checking is implemented, remove this. if (this == &ClassClass) ! JvThrow (new java::lang::IllegalAccessException); if (isPrimitive () || isInterface () || isArray () || java::lang::reflect::Modifier::isAbstract(accflags)) ! JvThrow (new java::lang::InstantiationException); _Jv_InitClass (this); _Jv_Method *meth = _Jv_GetMethodLocal (this, init_name, void_signature); if (! meth) ! JvThrow (new java::lang::NoSuchMethodException); jobject r = JvAllocObject (this); ((void (*) (jobject)) meth->ncode) (r); --- 664,682 ---- // FIXME: we special-case one check here just to pass a Plum Hall // test. Once access checking is implemented, remove this. if (this == &ClassClass) ! throw new java::lang::IllegalAccessException; if (isPrimitive () || isInterface () || isArray () || java::lang::reflect::Modifier::isAbstract(accflags)) ! throw new java::lang::InstantiationException; _Jv_InitClass (this); _Jv_Method *meth = _Jv_GetMethodLocal (this, init_name, void_signature); if (! meth) ! throw new java::lang::NoSuchMethodException; jobject r = JvAllocObject (this); ((void (*) (jobject)) meth->ncode) (r); *************** java::lang::Class::finalize (void) *** 680,686 **** void java::lang::Class::initializeClass (void) { ! // jshort-circuit to avoid needless locking. if (state == JV_STATE_DONE) return; --- 697,703 ---- void java::lang::Class::initializeClass (void) { ! // short-circuit to avoid needless locking. if (state == JV_STATE_DONE) return; *************** java::lang::Class::initializeClass (void *** 703,709 **** _Jv_PrepareCompiledClass (this); } } ! if (state <= JV_STATE_LINKED) _Jv_PrepareConstantTimeTables (this); --- 720,726 ---- _Jv_PrepareCompiledClass (this); } } ! if (state <= JV_STATE_LINKED) _Jv_PrepareConstantTimeTables (this); *************** java::lang::Class::initializeClass (void *** 715,721 **** wait (); // Steps 3 & 4. ! if (state == JV_STATE_DONE || state == JV_STATE_IN_PROGRESS || thread == self) { _Jv_MonitorExit (this); return; --- 732,740 ---- wait (); // Steps 3 & 4. ! if (state == JV_STATE_DONE ! || state == JV_STATE_IN_PROGRESS ! || thread == self) { _Jv_MonitorExit (this); return; *************** java::lang::Class::initializeClass (void *** 725,731 **** if (state == JV_STATE_ERROR) { _Jv_MonitorExit (this); ! JvThrow (new java::lang::NoClassDefFoundError); } // Step 6. --- 744,750 ---- if (state == JV_STATE_ERROR) { _Jv_MonitorExit (this); ! throw new java::lang::NoClassDefFoundError; } // Step 6. *************** java::lang::Class::initializeClass (void *** 776,782 **** state = JV_STATE_ERROR; notifyAll (); _Jv_MonitorExit (this); ! JvThrow (except); } _Jv_MonitorEnter (this); --- 795,801 ---- state = JV_STATE_ERROR; notifyAll (); _Jv_MonitorExit (this); ! throw except; } _Jv_MonitorEnter (this); *************** _Jv_LookupInterfaceMethod (jclass klass, *** 880,900 **** continue; if (Modifier::isStatic(meth->accflags)) ! JvThrow (new java::lang::IncompatibleClassChangeError ! (_Jv_GetMethodString (klass, meth->name))); if (Modifier::isAbstract(meth->accflags)) ! JvThrow (new java::lang::AbstractMethodError ! (_Jv_GetMethodString (klass, meth->name))); if (! Modifier::isPublic(meth->accflags)) ! JvThrow (new java::lang::IllegalAccessError ! (_Jv_GetMethodString (klass, meth->name))); _Jv_AddMethodToCache (klass, meth); return meth->ncode; } ! JvThrow (new java::lang::IncompatibleClassChangeError); ! return NULL; // Placate compiler. } // Fast interface method lookup by index. --- 899,918 ---- continue; if (Modifier::isStatic(meth->accflags)) ! throw new java::lang::IncompatibleClassChangeError ! (_Jv_GetMethodString (klass, meth->name)); if (Modifier::isAbstract(meth->accflags)) ! throw new java::lang::AbstractMethodError ! (_Jv_GetMethodString (klass, meth->name)); if (! Modifier::isPublic(meth->accflags)) ! throw new java::lang::IllegalAccessError ! (_Jv_GetMethodString (klass, meth->name)); _Jv_AddMethodToCache (klass, meth); return meth->ncode; } ! throw new java::lang::IncompatibleClassChangeError; } // Fast interface method lookup by index. *************** _Jv_CheckCast (jclass c, jobject obj) *** 999,1005 **** { if (__builtin_expect (obj != NULL && ! _Jv_IsAssignableFrom(c, JV_CLASS (obj)), false)) ! JvThrow (new java::lang::ClassCastException); return obj; } --- 1017,1028 ---- { if (__builtin_expect (obj != NULL && ! _Jv_IsAssignableFrom(c, JV_CLASS (obj)), false)) ! throw new java::lang::ClassCastException ! ((new java::lang::StringBuffer ! (obj->getClass()->getName()))->append ! (JvNewStringUTF(" cannot be cast to "))->append ! (c->getName())->toString()); ! return obj; } *************** _Jv_CheckArrayStore (jobject arr, jobjec *** 1013,1019 **** jclass obj_class = JV_CLASS (obj); if (__builtin_expect (! _Jv_IsAssignableFrom (elt_class, obj_class), false)) ! JvThrow (new java::lang::ArrayStoreException); } } --- 1036,1042 ---- jclass obj_class = JV_CLASS (obj); if (__builtin_expect (! _Jv_IsAssignableFrom (elt_class, obj_class), false)) ! throw new java::lang::ArrayStoreException; } } *************** _Jv_GenerateITable (jclass klass, _Jv_if *** 1186,1193 **** { jclass iface = ifaces->list[i]; itable_offsets[i] = itable_pos; ! itable_pos = _Jv_AppendPartialITable (klass, iface, itable, ! itable_pos); /* Create interface dispatch table for iface */ if (iface->idt == NULL) --- 1209,1215 ---- { jclass iface = ifaces->list[i]; itable_offsets[i] = itable_pos; ! itable_pos = _Jv_AppendPartialITable (klass, iface, itable, itable_pos); /* Create interface dispatch table for iface */ if (iface->idt == NULL) *************** _Jv_GetMethodString (jclass klass, _Jv_U *** 1220,1226 **** void _Jv_ThrowNoSuchMethodError () { ! JvThrow (new java::lang::NoSuchMethodError ()); } // Each superinterface of a class (i.e. each interface that the class --- 1242,1248 ---- void _Jv_ThrowNoSuchMethodError () { ! throw new java::lang::NoSuchMethodError; } // Each superinterface of a class (i.e. each interface that the class *************** _Jv_AppendPartialITable (jclass klass, j *** 1263,1276 **** else if (meth) { if (Modifier::isStatic(meth->accflags)) ! JvThrow (new java::lang::IncompatibleClassChangeError ! (_Jv_GetMethodString (klass, meth->name))); if (Modifier::isAbstract(meth->accflags)) ! JvThrow (new java::lang::AbstractMethodError ! (_Jv_GetMethodString (klass, meth->name))); if (! Modifier::isPublic(meth->accflags)) ! JvThrow (new java::lang::IllegalAccessError ! (_Jv_GetMethodString (klass, meth->name))); itable[pos] = meth->ncode; } --- 1285,1298 ---- else if (meth) { if (Modifier::isStatic(meth->accflags)) ! throw new java::lang::IncompatibleClassChangeError ! (_Jv_GetMethodString (klass, meth->name)); if (Modifier::isAbstract(meth->accflags)) ! throw new java::lang::AbstractMethodError ! (_Jv_GetMethodString (klass, meth->name)); if (! Modifier::isPublic(meth->accflags)) ! throw new java::lang::IllegalAccessError ! (_Jv_GetMethodString (klass, meth->name)); itable[pos] = meth->ncode; } *************** java::lang::Class::getPrivateMethod (jst *** 1405,1411 **** int i = klass->isPrimitive () ? 0 : klass->method_count; while (--i >= 0) { - // FIXME: access checks. if (_Jv_equalUtf8Consts (klass->methods[i].name, utf_name) && _Jv_equaln (klass->methods[i].signature, partial_sig, p_len)) { --- 1427,1432 ---- *************** java::lang::Class::getPrivateMethod (jst *** 1420,1424 **** } } } ! JvThrow (new java::lang::NoSuchMethodException); } --- 1441,1643 ---- } } } ! throw new java::lang::NoSuchMethodException; ! } ! ! // Private accessor method for Java code to retrieve the protection domain. ! java::security::ProtectionDomain * ! java::lang::Class::getProtectionDomain0 () ! { ! return protectionDomain; ! } ! ! // Functions for indirect dispatch (symbolic virtual method binding) support. ! ! // Resolve entries in the virtual method offset symbol table ! // (klass->otable_syms). The vtable offset (in bytes) for each resolved method ! // is placed at the corresponding position in the virtual method offset table ! // (klass->otable). A single otable and otable_syms pair may be shared by many ! // classes. ! void ! _Jv_LinkOffsetTable(jclass klass) ! { ! //// FIXME: Need to lock the otable //// ! ! if (klass->otable == NULL ! || klass->otable->state != 0) ! return; ! ! klass->otable->state = 1; ! ! int index = 0; ! _Jv_MethodSymbol sym = klass->otable_syms[0]; ! ! while (sym.name != NULL) ! { ! jclass target_class = _Jv_FindClass (sym.class_name, NULL); ! _Jv_Method *meth = NULL; ! ! if (target_class != NULL) ! if (target_class->isInterface()) ! { ! // FIXME: This does not yet fully conform to binary compatibility ! // rules. It will break if a declaration is moved into a ! // superinterface. ! for (int i=0; i < target_class->method_count; i++) ! { ! meth = &target_class->methods[i]; ! if (_Jv_equalUtf8Consts (sym.name, meth->name) ! && _Jv_equalUtf8Consts (sym.signature, meth->signature)) ! { ! klass->otable->offsets[index] = i + 1; ! break; ! } ! } ! } ! else ! { ! // If the target class does not have a vtable_method_count yet, ! // then we can't tell the offsets for its methods, so we must lay ! // it out now. ! if (target_class->vtable_method_count == -1) ! { ! JvSynchronize sync (target_class); ! _Jv_LayoutVTableMethods (target_class); ! } ! ! meth = _Jv_LookupDeclaredMethod(target_class, sym.name, ! sym.signature); ! ! if (meth != NULL) ! { ! klass->otable->offsets[index] = ! _Jv_VTable::idx_to_offset (meth->index); ! } ! } ! ! if (meth == NULL) ! // FIXME: This should be special index for ThrowNoSuchMethod(). ! klass->otable->offsets[index] = -1; ! ! sym = klass->otable_syms[++index]; ! } ! } ! ! // Returns true if METH should get an entry in a VTable. ! static bool ! isVirtualMethod (_Jv_Method *meth) ! { ! using namespace java::lang::reflect; ! return (((meth->accflags & (Modifier::STATIC | Modifier::PRIVATE)) == 0) ! && meth->name->data[0] != '<'); ! } ! ! // Prepare virtual method declarations in KLASS, and any superclasses as ! // required, by determining their vtable index, setting method->index, and ! // finally setting the class's vtable_method_count. Must be called with the ! // lock for KLASS held. ! void ! _Jv_LayoutVTableMethods (jclass klass) ! { ! if (klass->vtable != NULL || klass->isInterface() ! || klass->vtable_method_count != -1) ! return; ! ! jclass superclass = klass->superclass; ! ! if (superclass != NULL && superclass->vtable_method_count == -1) ! { ! JvSynchronize sync (superclass); ! _Jv_LayoutVTableMethods (superclass); ! } ! ! int index = (superclass == NULL ? 0 : superclass->vtable_method_count); ! ! for (int i = 0; i < klass->method_count; ++i) ! { ! _Jv_Method *meth = &klass->methods[i]; ! _Jv_Method *super_meth = NULL; ! ! if (!isVirtualMethod(meth)) ! continue; ! ! if (superclass != NULL) ! super_meth = _Jv_LookupDeclaredMethod (superclass, meth->name, ! meth->signature); ! ! if (super_meth) ! meth->index = super_meth->index; ! else ! meth->index = index++; ! } ! ! klass->vtable_method_count = index; ! } ! ! // Set entries in VTABLE for virtual methods declared in KLASS. If KLASS has ! // an immediate abstract parent, recursivly do its methods first. ! void ! _Jv_SetVTableEntries (jclass klass, _Jv_VTable *vtable) ! { ! using namespace java::lang::reflect; ! ! jclass superclass = klass->getSuperclass(); ! ! if (superclass != NULL && (superclass->getModifiers() & Modifier::ABSTRACT)) ! _Jv_SetVTableEntries (superclass, vtable); ! ! for (int i = klass->method_count - 1; i >= 0; i--) ! { ! _Jv_Method *meth = &klass->methods[i]; ! if (!isVirtualMethod(meth)) ! continue; ! vtable->set_method(meth->index, meth->ncode); ! } ! } ! ! // Allocate and lay out the virtual method table for KLASS. This will also ! // cause vtables to be generated for any non-abstract superclasses, and ! // virtual method layout to occur for any abstract superclasses. Must be ! // called with monitor lock for KLASS held. ! void ! _Jv_MakeVTable (jclass klass) ! { ! using namespace java::lang::reflect; ! ! if (klass->vtable != NULL || klass->isInterface() ! || (klass->accflags & Modifier::ABSTRACT)) ! return; ! ! // out before we can create a vtable. ! if (klass->vtable_method_count == -1) ! _Jv_LayoutVTableMethods (klass); ! ! // Allocate the new vtable. ! _Jv_VTable *vtable = _Jv_VTable::new_vtable (klass->vtable_method_count); ! klass->vtable = vtable; ! ! // Copy the vtable of the closest non-abstract superclass. ! jclass superclass = klass->superclass; ! if (superclass != NULL) ! { ! while ((superclass->accflags & Modifier::ABSTRACT) != 0) ! superclass = superclass->superclass; ! ! if (superclass->vtable == NULL) ! { ! JvSynchronize sync (superclass); ! _Jv_MakeVTable (superclass); ! } ! ! for (int i = 0; i < superclass->vtable_method_count; ++i) ! vtable->set_method (i, superclass->vtable->get_method (i)); ! } ! ! // Set the class pointer and GC descriptor. ! vtable->clas = klass; ! vtable->gc_descr = _Jv_BuildGCDescr (klass); ! ! // For each virtual declared in klass and any immediate abstract ! // superclasses, set new vtable entry or override an old one. ! _Jv_SetVTableEntries (klass, vtable); } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natClassLoader.cc gcc-3.1/libjava/java/lang/natClassLoader.cc *** gcc-3.0.4/libjava/java/lang/natClassLoader.cc Sat Sep 22 01:34:48 2001 --- gcc-3.1/libjava/java/lang/natClassLoader.cc Tue Apr 2 22:19:55 2002 *************** *** 1,6 **** // natClassLoader.cc - Implementation of java.lang.ClassLoader native methods. ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natClassLoader.cc - Implementation of java.lang.ClassLoader native methods. ! /* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 33,40 **** --- 33,43 ---- #include #include #include + #include + #include #include #include + #include #include #include *************** java::lang::Class * *** 52,62 **** java::lang::ClassLoader::defineClass0 (jstring name, jbyteArray data, jint offset, ! jint length) { #ifdef INTERPRETER jclass klass; klass = (jclass) JvAllocObject (&ClassClass, sizeof (_Jv_InterpClass)); // synchronize on the class, so that it is not // attempted initialized until we're done loading. --- 55,67 ---- java::lang::ClassLoader::defineClass0 (jstring name, jbyteArray data, jint offset, ! jint length, ! java::security::ProtectionDomain *pd) { #ifdef INTERPRETER jclass klass; klass = (jclass) JvAllocObject (&ClassClass, sizeof (_Jv_InterpClass)); + _Jv_InitNewClassFields (klass); // synchronize on the class, so that it is not // attempted initialized until we're done loading. *************** java::lang::ClassLoader::defineClass0 (j *** 71,78 **** _Jv_Utf8Const * name2 = _Jv_makeUtf8Const (name); if (! _Jv_VerifyClassName (name2)) ! JvThrow (new java::lang::ClassFormatError ! (JvNewStringLatin1 ("erroneous class name"))); klass->name = name2; } --- 76,83 ---- _Jv_Utf8Const * name2 = _Jv_makeUtf8Const (name); if (! _Jv_VerifyClassName (name2)) ! throw new java::lang::ClassFormatError ! (JvNewStringLatin1 ("erroneous class name")); klass->name = name2; } *************** java::lang::ClassLoader::defineClass0 (j *** 95,102 **** // anything but ClassNotFoundException, // or some kind of Error. ! JvThrow (ex); } // if everything proceeded sucessfully, we're loaded. JvAssert (klass->state == JV_STATE_LOADED); --- 100,112 ---- // anything but ClassNotFoundException, // or some kind of Error. ! // FIXME: Rewrite this as a cleanup instead of ! // as a catch handler. ! ! throw ex; } + + klass->protectionDomain = pd; // if everything proceeded sucessfully, we're loaded. JvAssert (klass->state == JV_STATE_LOADED); *************** _Jv_WaitForState (jclass klass, int stat *** 142,150 **** _Jv_MonitorExit (klass); if (klass->state == JV_STATE_ERROR) ! { ! _Jv_Throw (new java::lang::LinkageError ()); ! } } // Finish linking a class. Only called from ClassLoader::resolveClass. --- 152,158 ---- _Jv_MonitorExit (klass); if (klass->state == JV_STATE_ERROR) ! throw new java::lang::LinkageError; } // Finish linking a class. Only called from ClassLoader::resolveClass. *************** java::lang::ClassLoader::markClassErrorS *** 169,174 **** --- 177,191 ---- klass->notifyAll (); } + jclass + java::lang::VMClassLoader::getPrimitiveClass (jchar type) + { + char sig[2]; + sig[0] = (char) type; + sig[1] = '\0'; + return _Jv_FindClassFromSignature (sig, NULL); + } + // This is the findClass() implementation for the System classloader. It is // the only native method in VMClassLoader, so we define it here. jclass *************** gnu::gcj::runtime::VMClassLoader::findCl *** 179,191 **** if (! klass) { ! // Turn `gnu.pkg.quux' into `gnu-pkg-quux'. Then search for a ! // module named (eg, on Linux) `gnu-pkg-quux.so', followed by ! // `gnu-pkg.so' and `gnu.so'. If loading one of these causes ! // the class to appear in the cache, then use it. ! jstring so_base_name = name->replace ('.', '-'); ! while (! klass && so_base_name && so_base_name->length() > 0) { using namespace ::java::lang; Runtime *rt = Runtime::getRuntime(); --- 196,210 ---- if (! klass) { ! // Turn `gnu.pkg.quux' into `lib-gnu-pkg-quux'. Then search for ! // a module named (eg, on Linux) `lib-gnu-pkg-quux.so', followed ! // by `lib-gnu-pkg.so' and `lib-gnu.so'. If loading one of ! // these causes the class to appear in the cache, then use it. ! java::lang::StringBuffer *sb = new java::lang::StringBuffer (JvNewStringLatin1("lib-")); ! jstring so_base_name = (sb->append (name)->toString ())->replace ('.', '-'); ! // Compare against `3' because that is the length of "lib". ! while (! klass && so_base_name && so_base_name->length() > 3) { using namespace ::java::lang; Runtime *rt = Runtime::getRuntime(); *************** gnu::gcj::runtime::VMClassLoader::findCl *** 201,212 **** klass = _Jv_FindClassInCache (name_u, 0); } } ! // Now try loading using the interpreter. if (! klass) { klass = java::net::URLClassLoader::findClass (name); ! } return klass; } --- 220,231 ---- klass = _Jv_FindClassInCache (name_u, 0); } } ! // Now try loading using the interpreter. if (! klass) { klass = java::net::URLClassLoader::findClass (name); ! } return klass; } *************** java::lang::ClassLoader::findLoadedClass *** 217,223 **** return _Jv_FindClassInCache (_Jv_makeUtf8Const (name), this); } - /** This function does class-preparation for compiled classes. NOTE: It contains replicated functionality from _Jv_ResolvePoolEntry, and this is intentional, since that function --- 236,241 ---- *************** _Jv_PrepareCompiledClass (jclass klass) *** 249,255 **** if (! found) { jstring str = _Jv_NewStringUTF (name->data); ! JvThrow (new java::lang::ClassNotFoundException (str)); } pool->data[index].clazz = found; --- 267,273 ---- if (! found) { jstring str = _Jv_NewStringUTF (name->data); ! throw new java::lang::ClassNotFoundException (str); } pool->data[index].clazz = found; *************** _Jv_PrepareCompiledClass (jclass klass) *** 275,286 **** for (int n = JvNumStaticFields (klass); n > 0; --n) { int mod = f->getModifiers (); ! // Maybe the compiler should mark these with ! // _Jv_FIELD_CONSTANT_VALUE? For now we just know that this ! // only happens for constant strings. if (f->getClass () == &StringClass ! && java::lang::reflect::Modifier::isStatic (mod) ! && java::lang::reflect::Modifier::isFinal (mod)) { jstring *strp = (jstring *) f->u.addr; if (*strp) --- 293,302 ---- for (int n = JvNumStaticFields (klass); n > 0; --n) { int mod = f->getModifiers (); ! // If we have a static String field with a non-null initial ! // value, we know it points to a Utf8Const. if (f->getClass () == &StringClass ! && java::lang::reflect::Modifier::isStatic (mod)) { jstring *strp = (jstring *) f->u.addr; if (*strp) *************** _Jv_PrepareCompiledClass (jclass klass) *** 292,297 **** --- 308,319 ---- } #endif /* INTERPRETER */ + if (klass->vtable == NULL) + _Jv_MakeVTable(klass); + + if (klass->otable != NULL && klass->otable->state == 0) + _Jv_LinkOffsetTable(klass); + klass->notifyAll (); } *************** _Jv_RegisterInitiatingLoader (jclass kla *** 411,440 **** } // This function is called many times during startup, before main() is ! // run. We do our runtime initialization here the very first time we ! // are called. At that point in time we know for certain we are ! // running single-threaded, so we don't need to lock when modifying ! // `init'. CLASSES is NULL-terminated. void _Jv_RegisterClasses (jclass *classes) { - static bool init = false; - - if (! init) - { - init = true; - _Jv_InitThreads (); - _Jv_InitGC (); - _Jv_InitializeSyncMutex (); - } - - JvSynchronize sync (&ClassClass); for (; *classes; ++classes) { jclass klass = *classes; ! jint hash = HASH_UTF (klass->name); ! klass->next = loaded_classes[hash]; ! loaded_classes[hash] = klass; // registering a compiled class causes // it to be immediately "prepared". --- 433,450 ---- } // This function is called many times during startup, before main() is ! // run. At that point in time we know for certain we are running ! // single-threaded, so we don't need to lock when adding classes to the ! // class chain. At all other times, the caller should synchronize on ! // Class::class$. void _Jv_RegisterClasses (jclass *classes) { for (; *classes; ++classes) { jclass klass = *classes; ! ! (*_Jv_RegisterClassHook) (klass); // registering a compiled class causes // it to be immediately "prepared". *************** _Jv_RegisterClasses (jclass *classes) *** 444,449 **** --- 454,503 ---- } void + _Jv_RegisterClassHookDefault (jclass klass) + { + jint hash = HASH_UTF (klass->name); + + jclass check_class = loaded_classes[hash]; + + // If the class is already registered, don't re-register it. + while (check_class != NULL) + { + if (check_class == klass) + { + // If you get this, it means you have the same class in two + // different libraries. + #define TEXT "Duplicate class registration: " + // We size-limit MESSAGE so that you can't trash the stack. + char message[200]; + strcpy (message, TEXT); + strncpy (message + sizeof (TEXT) - 1, klass->name->data, + sizeof (message) - sizeof (TEXT)); + message[sizeof (message) - 1] = '\0'; + if (! gcj::runtimeInitialized) + JvFail (message); + else + { + java::lang::String *str = JvNewStringLatin1 (message); + throw new java::lang::VirtualMachineError (str); + } + } + + check_class = check_class->next; + } + + klass->next = loaded_classes[hash]; + loaded_classes[hash] = klass; + } + + // A pointer to a function that actually registers a class. + // Normally _Jv_RegisterClassHookDefault, but could be some other function + // that registers the class in e.g. a ClassLoader-local table. + // Should synchronize on Class:class$ while setting/restore this variable. + + void (*_Jv_RegisterClassHook) (jclass cl) = _Jv_RegisterClassHookDefault; + + void _Jv_RegisterClass (jclass klass) { jclass classes[2]; *************** _Jv_FindClass (_Jv_Utf8Const *name, java *** 474,485 **** } else { ! java::lang::ClassLoader *sys = java::lang::ClassLoader::system; ! if (sys == NULL) ! { ! _Jv_InitClass (&ClassLoaderClass); ! sys = java::lang::ClassLoader::getSystemClassLoader (); ! } // Load using the bootstrap loader jvmspec 5.3.1. klass = sys->loadClass (sname, false); --- 528,535 ---- } else { ! java::lang::ClassLoader *sys ! = java::lang::ClassLoader::getSystemClassLoader (); // Load using the bootstrap loader jvmspec 5.3.1. klass = sys->loadClass (sname, false); *************** _Jv_FindClass (_Jv_Utf8Const *name, java *** 499,514 **** return klass; } ! jclass ! _Jv_NewClass (_Jv_Utf8Const *name, jclass superclass, ! java::lang::ClassLoader *loader) { - jclass ret = (jclass) JvAllocObject (&ClassClass); - ret->next = NULL; ! ret->name = name; ret->accflags = 0; ! ret->superclass = superclass; ret->constants.size = 0; ret->constants.tags = NULL; ret->constants.data = NULL; --- 549,561 ---- return klass; } ! void ! _Jv_InitNewClassFields (jclass ret) { ret->next = NULL; ! ret->name = NULL; ret->accflags = 0; ! ret->superclass = NULL; ret->constants.size = 0; ret->constants.tags = NULL; ret->constants.data = NULL; *************** _Jv_NewClass (_Jv_Utf8Const *name, jclas *** 521,527 **** ret->static_field_count = 0; ret->vtable = NULL; ret->interfaces = NULL; ! ret->loader = loader; ret->interface_count = 0; ret->state = JV_STATE_NOTHING; ret->thread = NULL; --- 568,574 ---- ret->static_field_count = 0; ret->vtable = NULL; ret->interfaces = NULL; ! ret->loader = NULL; ret->interface_count = 0; ret->state = JV_STATE_NOTHING; ret->thread = NULL; *************** _Jv_NewClass (_Jv_Utf8Const *name, jclas *** 529,534 **** --- 576,592 ---- ret->ancestors = NULL; ret->idt = NULL; ret->arrayclass = NULL; + } + + jclass + _Jv_NewClass (_Jv_Utf8Const *name, jclass superclass, + java::lang::ClassLoader *loader) + { + jclass ret = (jclass) JvAllocObject (&ClassClass); + _Jv_InitNewClassFields (ret); + ret->name = name; + ret->superclass = superclass; + ret->loader = loader; _Jv_RegisterClass (ret); *************** _Jv_NewArrayClass (jclass element, java: *** 556,562 **** return; if (element->isPrimitive()) ! len = 3; else len = element->name->length + 5; --- 614,624 ---- return; if (element->isPrimitive()) ! { ! if (element == JvPrimClass (void)) ! throw new java::lang::ClassNotFoundException (); ! len = 3; ! } else len = element->name->length + 5; *************** _Jv_NewArrayClass (jclass element, java: *** 615,621 **** array_class->interface_count = sizeof interfaces / sizeof interfaces[0]; // Since all array classes have the same interface dispatch table, we can ! // cache one and reuse it. It is not neccessary to synchronize this. if (!array_idt) { _Jv_PrepareConstantTimeTables (array_class); --- 677,683 ---- array_class->interface_count = sizeof interfaces / sizeof interfaces[0]; // Since all array classes have the same interface dispatch table, we can ! // cache one and reuse it. It is not necessary to synchronize this. if (!array_idt) { _Jv_PrepareConstantTimeTables (array_class); diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natDouble.cc gcc-3.1/libjava/java/lang/natDouble.cc *** gcc-3.0.4/libjava/java/lang/natDouble.cc Sat Mar 24 00:57:05 2001 --- gcc-3.1/libjava/java/lang/natDouble.cc Mon Apr 15 03:12:06 2002 *************** jdouble *** 161,169 **** --- 161,179 ---- java::lang::Double::parseDouble(jstring str) { int length = str->length(); + while (length > 0 && Character::isWhitespace(str->charAt(length - 1))) length--; + + // The String could end with a f/F/d/D which is valid but we don't need. + if (length > 0) + { + jchar last = str->charAt(length-1); + if (last == 'f' || last == 'F' || last == 'd' || last == 'D') + length--; + } + jsize start = 0; while (length > 0 && Character::isWhitespace(str->charAt(start))) *************** java::lang::Double::parseDouble(jstring *** 184,188 **** if (endptr == data + blength) return val; } ! _Jv_Throw (new NumberFormatException); } --- 194,204 ---- if (endptr == data + blength) return val; } ! throw new NumberFormatException(str); ! } ! ! void ! java::lang::Double::initIDs() ! { ! // Not used in libgcj } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natMath.cc gcc-3.1/libjava/java/lang/natMath.cc *** gcc-3.0.4/libjava/java/lang/natMath.cc Sat Dec 2 00:28:44 2000 --- gcc-3.1/libjava/java/lang/natMath.cc Fri Feb 15 05:53:29 2002 *************** *** 1,4 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 27,34 **** #include "fdlibm.h" - extern "C" float fabsf (float); - jdouble java::lang::Math::cos(jdouble x) { return (jdouble)::cos((double)x); --- 27,32 ---- *************** jdouble java::lang::Math::IEEEremainder( *** 89,133 **** return (jdouble)::__ieee754_remainder((double)y, (double)x); } - jdouble java::lang::Math::abs(jdouble x) - { - return (jdouble)::fabs((double)x); - } - - jfloat java::lang::Math::abs(jfloat x) - { - return (jfloat)::fabsf((float)x); - } - jdouble java::lang::Math::rint(jdouble x) { return (jdouble)::rint((double)x); } - jint java::lang::Math::round(jfloat x) - { - if (x != x) - return 0; - if (x <= (jfloat)java::lang::Integer::MIN_VALUE) - return java::lang::Integer::MIN_VALUE; - if (x >= (jfloat)java::lang::Integer::MAX_VALUE) - return java::lang::Integer::MAX_VALUE; - - return (jint)::rintf((float)x); - } - - jlong java::lang::Math::round(jdouble x) - { - if (x != x) - return 0; - if (x <= (jdouble)java::lang::Long::MIN_VALUE) - return java::lang::Long::MIN_VALUE; - if (x >= (jdouble)java::lang::Long::MAX_VALUE) - return java::lang::Long::MAX_VALUE; - - return (jlong)::rint((double)x); - } - jdouble java::lang::Math::floor(jdouble x) { return (jdouble)::floor((double)x); --- 87,97 ---- *************** isNaN (jint bits) *** 158,205 **** return e == 0x7f800000 && f != 0; } - jfloat - java::lang::Math::min(jfloat a, jfloat b) - { - jint abits = floatToIntBits (a); - jint bbits = floatToIntBits (b); - - if (isNaN (abits) || isNaN (bbits)) - return java::lang::Float::NaN; - - if (abits >= 0) // a is +ve - return bbits < 0 ? b // a is +ve, b is -ve. - // a and b are both +ve, so compare magnitudes: the number with - // the smallest magnitude is the smallest - : (abits < bbits ? a : b); - else // a is -ve - return bbits >= 0 ? a // a is -ve, b is +ve. - // a and b are both -ve, so compare magnitudes: the number with - // the biggest magnitude is the smallest - : (abits > bbits ? a : b); - } - - jfloat - java::lang::Math::max(jfloat a, jfloat b) - { - jint abits = floatToIntBits (a); - jint bbits = floatToIntBits (b); - - if (isNaN (abits) || isNaN (bbits)) - return java::lang::Float::NaN; - - if (abits >= 0) // a is +ve - return bbits < 0 ? a // a is +ve, b is -ve. - // a and b are both +ve, so compare magnitudes: the number with - // the smallest magnitude is the smallest - : (abits > bbits ? a : b); - else // a is -ve - return bbits >= 0 ? b // a is -ve, b is +ve. - // a and b are both -ve, so compare magnitudes: the number with - // the biggest magnitude is the smallest - : (abits < bbits ? a : b); - } - static inline jlong doubleToLongBits (jdouble value) { --- 122,127 ---- *************** isNaN (jlong bits) *** 220,265 **** return e == 0x7ff0000000000000LL && f != 0LL; } - - jdouble - java::lang::Math::min(jdouble a, jdouble b) - { - jlong abits = doubleToLongBits (a); - jlong bbits = doubleToLongBits (b); - - if (isNaN (abits) || isNaN (bbits)) - return java::lang::Double::NaN; - - if (abits >= 0LL) // a is +ve - return bbits < 0LL ? b // a is +ve, b is -ve. - // a and b are both +ve, so compare magnitudes: the number with - // the smallest magnitude is the smallest - : (abits < bbits ? a : b); - else // a is -ve - return bbits >= 0LL ? a // a is -ve, b is +ve. - // a and b are both -ve, so compare magnitudes: the number with - // the biggest magnitude is the smallest - : (abits > bbits ? a : b); - } - - jdouble - java::lang::Math::max(jdouble a, jdouble b) - { - jlong abits = doubleToLongBits (a); - jlong bbits = doubleToLongBits (b); - - if (isNaN (abits) || isNaN (bbits)) - return java::lang::Double::NaN; - - if (abits >= 0LL) // a is +ve - return bbits < 0LL ? a // a is +ve, b is -ve. - // a and b are both +ve, so compare magnitudes: the number with - // the smallest magnitude is the smallest - : (abits > bbits ? a : b); - else // a is -ve - return bbits >= 0LL ? b // a is -ve, b is +ve. - // a and b are both -ve, so compare magnitudes: the number with - // the biggest magnitude is the smallest - : (abits < bbits ? a : b); - } - --- 142,144 ---- diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natObject.cc gcc-3.1/libjava/java/lang/natObject.cc *** gcc-3.0.4/libjava/java/lang/natObject.cc Fri Oct 6 01:49:31 2000 --- gcc-3.1/libjava/java/lang/natObject.cc Sun Mar 10 03:30:52 2002 *************** *** 1,6 **** // natObject.cc - Implementation of the Object class. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natObject.cc - Implementation of the Object class. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 28,33 **** --- 28,37 ---- #include #include + #ifdef LOCK_DEBUG + # include + #endif + // This is used to represent synchronization information. *************** java::lang::Object::clone (void) *** 90,96 **** else { if (! java::lang::Cloneable::class$.isAssignableFrom(klass)) ! JvThrow (new CloneNotSupportedException); size = klass->size(); r = JvAllocObject (klass, size); --- 94,100 ---- else { if (! java::lang::Cloneable::class$.isAssignableFrom(klass)) ! throw new CloneNotSupportedException; size = klass->size(); r = JvAllocObject (klass, size); *************** java::lang::Object::clone (void) *** 100,110 **** --- 104,129 ---- return r; } + void + _Jv_FinalizeObject (jobject obj) + { + // Ignore exceptions. From section 12.6 of the Java Language Spec. + try + { + obj->finalize (); + } + catch (java::lang::Throwable *t) + { + // Ignore. + } + } + // // Synchronization code. // + #ifndef JV_HASH_SYNCHRONIZATION // This global is used to make sure that only one thread sets an // object's `sync_info' field. static _Jv_Mutex_t sync_mutex; *************** java::lang::Object::sync_init (void) *** 153,159 **** // been finalized. So if we just reinitialize the old one, // we'll never be able to (re-)destroy the mutex and/or // condition variable. ! si = (_Jv_SyncInfo *) _Jv_AllocBytesChecked (sizeof (_Jv_SyncInfo)); _Jv_MutexInit (&si->mutex); _Jv_CondInit (&si->condition); #if defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy) --- 172,178 ---- // been finalized. So if we just reinitialize the old one, // we'll never be able to (re-)destroy the mutex and/or // condition variable. ! si = (_Jv_SyncInfo *) _Jv_AllocBytes (sizeof (_Jv_SyncInfo)); _Jv_MutexInit (&si->mutex); _Jv_CondInit (&si->condition); #if defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy) *************** java::lang::Object::notify (void) *** 173,180 **** sync_init (); _Jv_SyncInfo *si = (_Jv_SyncInfo *) sync_info; if (__builtin_expect (_Jv_CondNotify (&si->condition, &si->mutex), false)) ! JvThrow (new IllegalMonitorStateException(JvNewStringLatin1 ! ("current thread not owner"))); } void --- 192,199 ---- sync_init (); _Jv_SyncInfo *si = (_Jv_SyncInfo *) sync_info; if (__builtin_expect (_Jv_CondNotify (&si->condition, &si->mutex), false)) ! throw new IllegalMonitorStateException(JvNewStringLatin1 ! ("current thread not owner")); } void *************** java::lang::Object::notifyAll (void) *** 184,191 **** sync_init (); _Jv_SyncInfo *si = (_Jv_SyncInfo *) sync_info; if (__builtin_expect (_Jv_CondNotifyAll (&si->condition, &si->mutex), false)) ! JvThrow (new IllegalMonitorStateException(JvNewStringLatin1 ! ("current thread not owner"))); } void --- 203,210 ---- sync_init (); _Jv_SyncInfo *si = (_Jv_SyncInfo *) sync_info; if (__builtin_expect (_Jv_CondNotifyAll (&si->condition, &si->mutex), false)) ! throw new IllegalMonitorStateException(JvNewStringLatin1 ! ("current thread not owner")); } void *************** java::lang::Object::wait (jlong timeout, *** 194,209 **** if (__builtin_expect (INIT_NEEDED (this), false)) sync_init (); if (__builtin_expect (timeout < 0 || nanos < 0 || nanos > 999999, false)) ! JvThrow (new IllegalArgumentException); _Jv_SyncInfo *si = (_Jv_SyncInfo *) sync_info; switch (_Jv_CondWait (&si->condition, &si->mutex, timeout, nanos)) { case _JV_NOT_OWNER: ! JvThrow (new IllegalMonitorStateException (JvNewStringLatin1 ! ("current thread not owner"))); case _JV_INTERRUPTED: if (Thread::interrupted ()) ! JvThrow (new InterruptedException); } } --- 213,228 ---- if (__builtin_expect (INIT_NEEDED (this), false)) sync_init (); if (__builtin_expect (timeout < 0 || nanos < 0 || nanos > 999999, false)) ! throw new IllegalArgumentException; _Jv_SyncInfo *si = (_Jv_SyncInfo *) sync_info; switch (_Jv_CondWait (&si->condition, &si->mutex, timeout, nanos)) { case _JV_NOT_OWNER: ! throw new IllegalMonitorStateException (JvNewStringLatin1 ! ("current thread not owner")); case _JV_INTERRUPTED: if (Thread::interrupted ()) ! throw new InterruptedException; } } *************** _Jv_InitializeSyncMutex (void) *** 219,258 **** _Jv_MutexInit (&sync_mutex); } ! jint _Jv_MonitorEnter (jobject obj) { #ifndef HANDLE_SEGV if (__builtin_expect (! obj, false)) ! JvThrow (new java::lang::NullPointerException); #endif if (__builtin_expect (INIT_NEEDED (obj), false)) obj->sync_init (); _Jv_SyncInfo *si = (_Jv_SyncInfo *) obj->sync_info; ! return _Jv_MutexLock (&si->mutex); } ! jint _Jv_MonitorExit (jobject obj) { JvAssert (obj); JvAssert (! INIT_NEEDED (obj)); _Jv_SyncInfo *si = (_Jv_SyncInfo *) obj->sync_info; if (__builtin_expect (_Jv_MutexUnlock (&si->mutex), false)) ! JvThrow (new java::lang::IllegalMonitorStateException); ! return 0; } void ! _Jv_FinalizeObject (jobject obj) { ! // Ignore exceptions. From section 12.6 of the Java Language Spec. ! try { ! obj->finalize (); } ! catch (java::lang::Throwable *t) { ! // Ignore. } } --- 238,1255 ---- _Jv_MutexInit (&sync_mutex); } ! void _Jv_MonitorEnter (jobject obj) { #ifndef HANDLE_SEGV if (__builtin_expect (! obj, false)) ! throw new java::lang::NullPointerException; #endif if (__builtin_expect (INIT_NEEDED (obj), false)) obj->sync_init (); _Jv_SyncInfo *si = (_Jv_SyncInfo *) obj->sync_info; ! _Jv_MutexLock (&si->mutex); ! // FIXME: In the Windows case, this can return a nonzero error code. ! // We should turn that into some exception ... } ! void _Jv_MonitorExit (jobject obj) { JvAssert (obj); JvAssert (! INIT_NEEDED (obj)); _Jv_SyncInfo *si = (_Jv_SyncInfo *) obj->sync_info; if (__builtin_expect (_Jv_MutexUnlock (&si->mutex), false)) ! throw new java::lang::IllegalMonitorStateException; } + #else /* JV_HASH_SYNCHRONIZATION */ + + // FIXME: We shouldn't be calling GC_register_finalizer directly. + #ifndef HAVE_BOEHM_GC + # error Hash synchronization currently requires boehm-gc + // That's actually a bit of a lie: It should also work with the null GC, + // probably even better than the alternative. + // To really support alternate GCs here, we would need to widen the + // interface to finalization, since we sometimes have to register a + // second finalizer for an object that already has one. + // We might also want to move the GC interface to a .h file, since + // the number of procedure call levels involved in some of these + // operations is already ridiculous, and would become worse if we + // went through the proper intermediaries. + #else + # include "gc.h" + #endif + + // What follows currenly assumes a Linux-like platform. + // Some of it specifically assumes X86 or IA64 Linux, though that + // should be easily fixable. + + // A Java monitor implemention based on a table of locks. + // Each entry in the table describes + // locks held for objects that hash to that location. + // This started out as a reimplementation of the technique used in SGIs JVM, + // for which we obtained permission from SGI. + // But in fact, this ended up quite different, though some ideas are + // still shared with the original. + // It was also influenced by some of the published IBM work, + // though it also differs in many ways from that. + // We could speed this up if we had a way to atomically update + // an entire cache entry, i.e. 2 contiguous words of memory. + // That would usually be the case with a 32 bit ABI on a 64 bit processor. + // But we don't currently go out of our way to target those. + // I don't know how to do much better with a N bit ABI on a processor + // that can atomically update only N bits at a time. + // Author: Hans-J. Boehm (Hans_Boehm@hp.com, boehm@acm.org) + + #include + #include + #include // for usleep, sysconf. + #include // for sched_yield. + #include + #include + + // Try to determine whether we are on a multiprocessor, i.e. whether + // spinning may be profitable. + // This should really use a suitable autoconf macro. + // False is the conservative answer, though the right one is much better. + static bool + is_mp() + { + #ifdef _SC_NPROCESSORS_ONLN + long nprocs = sysconf(_SC_NPROCESSORS_ONLN); + return (nprocs > 1); + #else + return false; + #endif + } + + // A call to keep_live(p) forces p to be accessible to the GC + // at this point. + inline static void + keep_live(obj_addr_t p) + { + __asm__ __volatile__("" : : "rm"(p) : "memory"); + } + + // Each hash table entry holds a single preallocated "lightweight" lock. + // In addition, it holds a chain of "heavyweight" locks. Lightweight + // locks do not support Object.wait(), and are converted to heavyweight + // status in response to contention. Unlike the SGI scheme, both + // ligtweight and heavyweight locks in one hash entry can be simultaneously + // in use. (The SGI scheme requires that we be able to acquire a heavyweight + // lock on behalf of another thread, and can thus convert a lock we don't + // hold to heavyweight status. Here we don't insist on that, and thus + // let the original holder of the lighweight lock keep it.) + + struct heavy_lock { + void * reserved_for_gc; + struct heavy_lock *next; // Hash chain link. + // Traced by GC. + void * old_client_data; // The only other field traced by GC. + GC_finalization_proc old_finalization_proc; + obj_addr_t address; // Object to which this lock corresponds. + // Should not be traced by GC. + // Cleared as heavy_lock is destroyed. + // Together with the rest of the hevy lock + // chain, this is protected by the lock + // bit in the hash table entry to which + // the chain is attached. + _Jv_SyncInfo si; + // The remaining fields save prior finalization info for + // the object, which we needed to replace in order to arrange + // for cleanup of the lock structure. + }; + + #ifdef LOCK_DEBUG void ! print_hl_list(heavy_lock *hl) { ! heavy_lock *p = hl; ! for (; 0 != p; p = p->next) ! fprintf (stderr, "(hl = %p, addr = %p)", p, (void *)(p -> address)); ! } ! #endif /* LOCK_DEBUG */ ! ! #if defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy) ! // If we have to run a destructor for a sync_info member, then this ! // function could be registered as a finalizer for the sync_info. ! // In fact, we now only invoke it explicitly. ! static inline void ! heavy_lock_finalization_proc (heavy_lock *hl) ! { ! #if defined (_Jv_HaveCondDestroy) ! _Jv_CondDestroy (&hl->si.condition); ! #endif ! #if defined (_Jv_HaveMutexDestroy) ! _Jv_MutexDestroy (&hl->si.mutex); ! #endif ! hl->si.init = false; ! } ! #endif /* defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy) */ ! ! // We convert the lock back to lightweight status when ! // we exit, so that a single contention episode doesn't doom the lock ! // forever. But we also need to make sure that lock structures for dead ! // objects are eventually reclaimed. We do that in a an additional ! // finalizer on the underlying object. ! // Note that if the corresponding object is dead, it is safe to drop ! // the heavy_lock structure from its list. It is not necessarily ! // safe to deallocate it, since the unlock code could still be running. ! ! struct hash_entry { ! volatile obj_addr_t address; // Address of object for which lightweight ! // k is held. ! // We assume the 3 low order bits are zero. ! // With the Boehm collector and bitmap ! // allocation, objects of size 4 bytes are ! // broken anyway. Thus this is primarily ! // a constraint on statically allocated ! // objects used for synchronization. ! // This allows us to use the low order ! // bits as follows: ! # define LOCKED 1 // This hash entry is locked, and its ! // state may be invalid. ! // The lock protects both the hash_entry ! // itself (except for the light_count ! // and light_thr_id fields, which ! // are protected by the lightweight ! // lock itself), and any heavy_monitor ! // structures attached to it. ! # define HEAVY 2 // There may be heavyweight locks ! // associated with this cache entry. ! // The lightweight entry is still valid, ! // if the leading bits of the address ! // field are nonzero. ! // Set if heavy_count is > 0 . ! // Stored redundantly so a single ! // compare-and-swap works in the easy case. ! # define REQUEST_CONVERSION 4 // The lightweight lock is held. But ! // one or more other threads have tried ! // to acquire the lock, and hence request ! // conversion to heavyweight status. ! # define FLAGS (LOCKED | HEAVY | REQUEST_CONVERSION) ! volatile _Jv_ThreadId_t light_thr_id; ! // Thr_id of holder of lightweight lock. ! // Only updated by lightweight lock holder. ! // Must be recognizably invalid if the ! // lightweight lock is not held. ! # define INVALID_THREAD_ID 0 // Works for Linux? ! // If zero doesn't work, we have to ! // initialize lock table. ! volatile unsigned short light_count; ! // Number of times the lightweight lock ! // is held minus one. Zero if lightweight ! // lock is not held. ! unsigned short heavy_count; // Total number of times heavyweight locks ! // associated with this hash entry are held ! // or waiting to be acquired. ! // Threads in wait() are included eventhough ! // they have temporarily released the lock. ! struct heavy_lock * heavy_locks; ! // Chain of heavy locks. Protected ! // by lockbit for he. Locks may ! // remain allocated here even if HEAVY ! // is not set and heavy_count is 0. ! // If a lightweight and heavyweight lock ! // correspond to the same address, the ! // lightweight lock is the right one. ! }; ! ! #ifndef JV_SYNC_TABLE_SZ ! # define JV_SYNC_TABLE_SZ 2048 ! #endif ! ! hash_entry light_locks[JV_SYNC_TABLE_SZ]; ! ! #define JV_SYNC_HASH(p) (((long)p ^ ((long)p >> 10)) % JV_SYNC_TABLE_SZ) ! ! // Note that the light_locks table is scanned conservatively by the ! // collector. It is essential the the heavy_locks field is scanned. ! // Currently the address field may or may not cause the associated object ! // to be retained, depending on whether flag bits are set. ! // This means that we can conceivable get an unexpected deadlock if ! // 1) Object at address A is locked. ! // 2) The client drops A without unlocking it. ! // 3) Flag bits in the address entry are set, so the collector reclaims ! // the object at A. ! // 4) A is reallocated, and an attempt is made to lock the result. ! // This could be fixed by scanning light_locks in a more customized ! // manner that ignores the flag bits. But it can only happen with hand ! // generated semi-illegal .class files, and then it doesn't present a ! // security hole. ! ! #ifdef LOCK_DEBUG ! void print_he(hash_entry *he) ! { ! fprintf(stderr, "lock hash entry = %p, index = %d, address = 0x%lx\n" ! "\tlight_thr_id = 0x%lx, light_count = %d, " ! "heavy_count = %d\n\theavy_locks:", he, ! he - light_locks, he -> address, he -> light_thr_id, ! he -> light_count, he -> heavy_count); ! print_hl_list(he -> heavy_locks); ! fprintf(stderr, "\n"); ! } ! #endif /* LOCK_DEBUG */ ! ! static bool mp = false; // Known multiprocesssor. ! ! // Wait for roughly 2^n units, touching as little memory as possible. ! static void ! spin(unsigned n) ! { ! const unsigned MP_SPINS = 10; ! const unsigned YIELDS = 4; ! const unsigned SPINS_PER_UNIT = 30; ! const unsigned MIN_SLEEP_USECS = 2001; // Shorter times spin under Linux. ! const unsigned MAX_SLEEP_USECS = 200000; ! static unsigned spin_limit = 0; ! static unsigned yield_limit = YIELDS; ! static bool spin_initialized = false; ! ! if (!spin_initialized) { ! mp = is_mp(); ! if (mp) ! { ! spin_limit = MP_SPINS; ! yield_limit = MP_SPINS + YIELDS; ! } ! spin_initialized = true; } ! if (n < spin_limit) { ! unsigned i = SPINS_PER_UNIT << n; ! for (; i > 0; --i) ! __asm__ __volatile__(""); ! } ! else if (n < yield_limit) ! { ! sched_yield(); ! } ! else ! { ! unsigned duration = MIN_SLEEP_USECS << (n - yield_limit); ! if (n >= 15 + yield_limit || duration > MAX_SLEEP_USECS) ! duration = MAX_SLEEP_USECS; ! usleep(duration); } } + + // Wait for a hash entry to become unlocked. + static void + wait_unlocked (hash_entry *he) + { + unsigned i = 0; + while (he -> address & LOCKED) + spin (i++); + } + + // Return the heavy lock for addr if it was already allocated. + // The client passes in the appropriate hash_entry. + // We hold the lock for he. + static inline heavy_lock * + find_heavy (obj_addr_t addr, hash_entry *he) + { + heavy_lock *hl = he -> heavy_locks; + while (hl != 0 && hl -> address != addr) hl = hl -> next; + return hl; + } + + // Unlink the heavy lock for the given address from its hash table chain. + // Dies miserably and conspicuously if it's not there, since that should + // be impossible. + static inline void + unlink_heavy (obj_addr_t addr, hash_entry *he) + { + heavy_lock **currentp = &(he -> heavy_locks); + while ((*currentp) -> address != addr) + currentp = &((*currentp) -> next); + *currentp = (*currentp) -> next; + } + + // Finalization procedure for objects that have associated heavy-weight + // locks. This may replace the real finalization procedure. + static void + heavy_lock_obj_finalization_proc (void *obj, void *cd) + { + heavy_lock *hl = (heavy_lock *)cd; + obj_addr_t addr = (obj_addr_t)obj; + hash_entry *he = light_locks + JV_SYNC_HASH(addr); + obj_addr_t he_address = (he -> address & ~LOCKED); + + // Acquire lock bit immediately. It's possible that the hl was already + // destroyed while we were waiting for the finalizer to run. If it + // was, the address field was set to zero. The address filed access is + // protected by the lock bit to ensure that we do this exactly once. + // The lock bit also protects updates to the objects finalizer. + while (!compare_and_swap(&(he -> address), he_address, he_address|LOCKED )) + { + // Hash table entry is currently locked. We can't safely + // touch the list of heavy locks. + wait_unlocked(he); + he_address = (he -> address & ~LOCKED); + } + if (0 == hl -> address) + { + // remove_all_heavy destroyed hl, and took care of the real finalizer. + release_set(&(he -> address), he_address); + return; + } + assert(hl -> address == addr); + GC_finalization_proc old_finalization_proc = hl -> old_finalization_proc; + if (old_finalization_proc != 0) + { + // We still need to run a real finalizer. In an idealized + // world, in which people write thread-safe finalizers, that is + // likely to require synchronization. Thus we reregister + // ourselves as the only finalizer, and simply run the real one. + // Thus we don't clean up the lock yet, but we're likely to do so + // on the next GC cycle. + // It's OK if remove_all_heavy actually destroys the heavy lock, + // since we've updated old_finalization_proc, and thus the user's + // finalizer won't be rerun. + void * old_client_data = hl -> old_client_data; + hl -> old_finalization_proc = 0; + hl -> old_client_data = 0; + # ifdef HAVE_BOEHM_GC + GC_REGISTER_FINALIZER_NO_ORDER(obj, heavy_lock_obj_finalization_proc, cd, 0, 0); + # endif + release_set(&(he -> address), he_address); + old_finalization_proc(obj, old_client_data); + } + else + { + // The object is really dead, although it's conceivable that + // some thread may still be in the process of releasing the + // heavy lock. Unlink it and, if necessary, register a finalizer + // to destroy sync_info. + unlink_heavy(addr, he); + hl -> address = 0; // Don't destroy it again. + release_set(&(he -> address), he_address); + # if defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy) + // Make sure lock is not held and then destroy condvar and mutex. + _Jv_MutexLock(&(hl->si.mutex)); + _Jv_MutexUnlock(&(hl->si.mutex)); + heavy_lock_finalization_proc (hl); + # endif + } + } + + // We hold the lock on he, and heavy_count is 0. + // Release the lock by replacing the address with new_address_val. + // Remove all heavy locks on the list. Note that the only possible way + // in which a lock may still be in use is if it's in the process of + // being unlocked. + static void + remove_all_heavy (hash_entry *he, obj_addr_t new_address_val) + { + assert(he -> heavy_count == 0); + assert(he -> address & LOCKED); + heavy_lock *hl = he -> heavy_locks; + he -> heavy_locks = 0; + // We would really like to release the lock bit here. Unfortunately, that + // Creates a race between or finalizer removal, and the potential + // reinstallation of a new finalizer as a new heavy lock is created. + // This may need to be revisited. + for(; 0 != hl; hl = hl->next) + { + obj_addr_t obj = hl -> address; + assert(0 != obj); // If this was previously finalized, it should no + // longer appear on our list. + hl -> address = 0; // Finalization proc might still see it after we + // finish. + GC_finalization_proc old_finalization_proc = hl -> old_finalization_proc; + void * old_client_data = hl -> old_client_data; + # ifdef HAVE_BOEHM_GC + // Remove our finalization procedure. + // Reregister the clients if applicable. + GC_REGISTER_FINALIZER_NO_ORDER((GC_PTR)obj, old_finalization_proc, + old_client_data, 0, 0); + // Note that our old finalization procedure may have been + // previously determined to be runnable, and may still run. + // FIXME - direct dependency on boehm GC. + # endif + # if defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy) + // Wait for a possible lock holder to finish unlocking it. + // This is only an issue if we have to explicitly destroy the mutex + // or possibly if we have to destroy a condition variable that is + // still being notified. + _Jv_MutexLock(&(hl->si.mutex)); + _Jv_MutexUnlock(&(hl->si.mutex)); + heavy_lock_finalization_proc (hl); + # endif + } + release_set(&(he -> address), new_address_val); + } + + // We hold the lock on he and heavy_count is 0. + // We release it by replacing the address field with new_address_val. + // Remove all heavy locks on the list if the list is sufficiently long. + // This is called periodically to avoid very long lists of heavy locks. + // This seems to otherwise become an issue with SPECjbb, for example. + static inline void + maybe_remove_all_heavy (hash_entry *he, obj_addr_t new_address_val) + { + static const int max_len = 5; + heavy_lock *hl = he -> heavy_locks; + + for (int i = 0; i < max_len; ++i) + { + if (0 == hl) + { + release_set(&(he -> address), new_address_val); + return; + } + hl = hl -> next; + } + remove_all_heavy(he, new_address_val); + } + + // Allocate a new heavy lock for addr, returning its address. + // Assumes we already have the hash_entry locked, and there + // is currently no lightweight or allocated lock for addr. + // We register a finalizer for addr, which is responsible for + // removing the heavy lock when addr goes away, in addition + // to the responsibilities of any prior finalizer. + // This unfortunately holds the lock bit for the hash entry while it + // allocates two objects (on for the finalizer). + // It would be nice to avoid that somehow ... + static heavy_lock * + alloc_heavy(obj_addr_t addr, hash_entry *he) + { + heavy_lock * hl = (heavy_lock *) _Jv_AllocTraceTwo(sizeof (heavy_lock)); + + hl -> address = addr; + _Jv_MutexInit (&(hl -> si.mutex)); + _Jv_CondInit (&(hl -> si.condition)); + # if defined (_Jv_HaveCondDestroy) || defined (_Jv_HaveMutexDestroy) + hl->si.init = true; // needed ? + # endif + hl -> next = he -> heavy_locks; + he -> heavy_locks = hl; + // FIXME: The only call that cheats and goes directly to the GC interface. + # ifdef HAVE_BOEHM_GC + GC_REGISTER_FINALIZER_NO_ORDER( + (void *)addr, heavy_lock_obj_finalization_proc, + hl, &hl->old_finalization_proc, + &hl->old_client_data); + # endif /* HAVE_BOEHM_GC */ + return hl; + } + + // Return the heavy lock for addr, allocating if necessary. + // Assumes we have the cache entry locked, and there is no lightweight + // lock for addr. + static heavy_lock * + get_heavy(obj_addr_t addr, hash_entry *he) + { + heavy_lock *hl = find_heavy(addr, he); + if (0 == hl) + hl = alloc_heavy(addr, he); + return hl; + } + + void + _Jv_MonitorEnter (jobject obj) + { + obj_addr_t addr = (obj_addr_t)obj; + obj_addr_t address; + unsigned hash = JV_SYNC_HASH(addr); + hash_entry * he = light_locks + hash; + _Jv_ThreadId_t self = _Jv_ThreadSelf(); + unsigned count; + const unsigned N_SPINS = 18; + + // We need to somehow check that addr is not NULL on the fast path. + // A very predictable + // branch on a register value is probably cheaper than dereferencing addr. + // We could also permanently lock the NULL entry in the hash table. + // But it's not clear that's cheaper either. + if (__builtin_expect(!addr, false)) + throw new java::lang::NullPointerException; + + assert(!(addr & FLAGS)); + retry: + if (__builtin_expect(compare_and_swap(&(he -> address), + 0, addr),true)) + { + assert(he -> light_thr_id == INVALID_THREAD_ID); + assert(he -> light_count == 0); + he -> light_thr_id = self; + // Count fields are set correctly. Heavy_count was also zero, + // but can change asynchronously. + // This path is hopefully both fast and the most common. + return; + } + address = he -> address; + if ((address & ~(HEAVY | REQUEST_CONVERSION)) == addr) + { + if (he -> light_thr_id == self) + { + // We hold the lightweight lock, and it's for the right + // address. + count = he -> light_count; + if (count == USHRT_MAX) + { + // I think most JVMs don't check for this. + // But I'm not convinced I couldn't turn this into a security + // hole, even with a 32 bit counter. + throw new java::lang::IllegalMonitorStateException( + JvNewStringLatin1("maximum monitor nesting level exceeded")); + } + he -> light_count = count + 1; + return; + } + else + { + // Lightweight lock is held, but by somone else. + // Spin a few times. This avoids turning this into a heavyweight + // lock if the current holder is about to release it. + for (unsigned int i = 0; i < N_SPINS; ++i) + { + if ((he -> address & ~LOCKED) != (address & ~LOCKED)) goto retry; + spin(i); + } + address &= ~LOCKED; + if (!compare_and_swap(&(he -> address), address, address | LOCKED )) + { + wait_unlocked(he); + goto retry; + } + heavy_lock *hl = get_heavy(addr, he); + ++ (he -> heavy_count); + // The hl lock acquisition can't block for long, since it can + // only be held by other threads waiting for conversion, and + // they, like us, drop it quickly without blocking. + _Jv_MutexLock(&(hl->si.mutex)); + assert(he -> address == address | LOCKED ); + release_set(&(he -> address), (address | REQUEST_CONVERSION | HEAVY)); + // release lock on he + while ((he -> address & ~FLAGS) == (address & ~FLAGS)) + { + // Once converted, the lock has to retain heavyweight + // status, since heavy_count > 0 . + _Jv_CondWait (&(hl->si.condition), &(hl->si.mutex), 0, 0); + } + keep_live(addr); + // Guarantee that hl doesn't get unlinked by finalizer. + // This is only an issue if the client fails to release + // the lock, which is unlikely. + assert(he -> address & HEAVY); + // Lock has been converted, we hold the heavyweight lock, + // heavy_count has been incremented. + return; + } + } + obj_addr_t was_heavy = (address & HEAVY); + address &= ~LOCKED; + if (!compare_and_swap(&(he -> address), address, (address | LOCKED ))) + { + wait_unlocked(he); + goto retry; + } + if ((address & ~(HEAVY | REQUEST_CONVERSION)) == 0) + { + // Either was_heavy is true, or something changed out from under us, + // since the initial test for 0 failed. + assert(!(address & REQUEST_CONVERSION)); + // Can't convert a nonexistent lightweight lock. + heavy_lock *hl; + hl = (was_heavy? find_heavy(addr, he) : 0); + if (0 == hl) + { + // It is OK to use the lighweight lock, since either the + // heavyweight lock does not exist, or none of the + // heavyweight locks currently exist. Future threads + // trying to acquire the lock will see the lightweight + // one first and use that. + he -> light_thr_id = self; // OK, since nobody else can hold + // light lock or do this at the same time. + assert(he -> light_count == 0); + assert(was_heavy == (he -> address & HEAVY)); + release_set(&(he -> address), (addr | was_heavy)); + } + else + { + // Must use heavy lock. + ++ (he -> heavy_count); + assert(0 == (address & ~HEAVY)); + release_set(&(he -> address), HEAVY); + _Jv_MutexLock(&(hl->si.mutex)); + keep_live(addr); + } + return; + } + // Lightweight lock is held, but does not correspond to this object. + // We hold the lock on the hash entry, and he -> address can't + // change from under us. Neither can the chain of heavy locks. + { + assert(0 == he -> heavy_count || (address & HEAVY)); + heavy_lock *hl = get_heavy(addr, he); + ++ (he -> heavy_count); + release_set(&(he -> address), address | HEAVY); + _Jv_MutexLock(&(hl->si.mutex)); + keep_live(addr); + } + } + + + void + _Jv_MonitorExit (jobject obj) + { + obj_addr_t addr = (obj_addr_t)obj; + _Jv_ThreadId_t self = _Jv_ThreadSelf(); + unsigned hash = JV_SYNC_HASH(addr); + hash_entry * he = light_locks + hash; + _Jv_ThreadId_t light_thr_id; + unsigned count; + obj_addr_t address; + + retry: + light_thr_id = he -> light_thr_id; + // Unfortunately, it turns out we always need to read the address + // first. Even if we are going to update it with compare_and_swap, + // we need to reset light_thr_id, and that's not safe unless we know + // that we hold the lock. + address = he -> address; + // First the (relatively) fast cases: + if (__builtin_expect(light_thr_id == self, true)) + // Above must fail if addr == 0 . + { + count = he -> light_count; + if (__builtin_expect((address & ~HEAVY) == addr, true)) + { + if (count != 0) + { + // We held the lightweight lock all along. Thus the values + // we saw for light_thr_id and light_count must have been valid. + he -> light_count = count - 1; + return; + } + else + { + // We hold the lightweight lock once. + he -> light_thr_id = INVALID_THREAD_ID; + if (compare_and_swap_release(&(he -> address), address, + address & HEAVY)) + return; + else + { + he -> light_thr_id = light_thr_id; // Undo prior damage. + goto retry; + } + } + } + // else lock is not for this address, conversion is requested, + // or the lock bit in the address field is set. + } + else + { + if (__builtin_expect(!addr, false)) + throw new java::lang::NullPointerException; + if ((address & ~(HEAVY | REQUEST_CONVERSION)) == addr) + { + # ifdef LOCK_DEBUG + fprintf(stderr, "Lightweight lock held by other thread\n\t" + "light_thr_id = 0x%lx, self = 0x%lx, " + "address = 0x%lx, pid = %d\n", + light_thr_id, self, address, getpid()); + print_he(he); + for(;;) {} + # endif + // Someone holds the lightweight lock for this object, and + // it can't be us. + throw new java::lang::IllegalMonitorStateException( + JvNewStringLatin1("current thread not owner")); + } + else + count = he -> light_count; + } + if (address & LOCKED) + { + wait_unlocked(he); + goto retry; + } + // Now the unlikely cases. + // We do know that: + // - Address is set, and doesn't contain the LOCKED bit. + // - If address refers to the same object as addr, then he -> light_thr_id + // refers to this thread, and count is valid. + // - The case in which we held the lightweight lock has been + // completely handled, except for the REQUEST_CONVERSION case. + // + if ((address & ~FLAGS) == addr) + { + // The lightweight lock is assigned to this object. + // Thus we must be in the REQUEST_CONVERSION case. + if (0 != count) + { + // Defer conversion until we exit completely. + he -> light_count = count - 1; + return; + } + assert(he -> light_thr_id == self); + assert(address & REQUEST_CONVERSION); + // Conversion requested + // Convert now. + if (!compare_and_swap(&(he -> address), address, address | LOCKED)) + goto retry; + heavy_lock *hl = find_heavy(addr, he); + assert (0 != hl); + // Requestor created it. + he -> light_count = 0; + assert(he -> heavy_count > 0); + // was incremented by requestor. + _Jv_MutexLock(&(hl->si.mutex)); + // Release the he lock after acquiring the mutex. + // Otherwise we can accidentally + // notify a thread that has already seen a heavyweight + // lock. + he -> light_thr_id = INVALID_THREAD_ID; + release_set(&(he -> address), HEAVY); + // lightweight lock now unused. + _Jv_CondNotifyAll(&(hl->si.condition), &(hl->si.mutex)); + _Jv_MutexUnlock(&(hl->si.mutex)); + // heavy_count was already incremented by original requestor. + keep_live(addr); + return; + } + // lightweight lock not for this object. + assert(!(address & LOCKED)); + assert((address & ~FLAGS) != addr); + if (!compare_and_swap(&(he -> address), address, address | LOCKED)) + goto retry; + heavy_lock *hl = find_heavy(addr, he); + if (NULL == hl) + { + # ifdef LOCK_DEBUG + fprintf(stderr, "Failed to find heavyweight lock for addr 0x%lx" + " pid = %d\n", addr, getpid()); + print_he(he); + for(;;) {} + # endif + throw new java::lang::IllegalMonitorStateException( + JvNewStringLatin1("current thread not owner")); + } + assert(address & HEAVY); + count = he -> heavy_count; + assert(count > 0); + --count; + he -> heavy_count = count; + if (0 == count) + { + const unsigned test_freq = 16; // Power of 2 + static volatile unsigned counter = 0; + unsigned my_counter = counter; + + counter = my_counter + 1; + if (my_counter%test_freq == 0) + { + // Randomize the interval length a bit. + counter = my_counter + (my_counter >> 4) % (test_freq/2); + // Unlock mutex first, to avoid self-deadlock, or worse. + _Jv_MutexUnlock(&(hl->si.mutex)); + maybe_remove_all_heavy(he, address &~HEAVY); + // release lock bit, preserving + // REQUEST_CONVERSION + // and object address. + } + else + { + release_set(&(he -> address), address &~HEAVY); + _Jv_MutexUnlock(&(hl->si.mutex)); + // Unlock after releasing the lock bit, so that + // we don't switch to another thread prematurely. + } + } + else + { + release_set(&(he -> address), address); + _Jv_MutexUnlock(&(hl->si.mutex)); + } + keep_live(addr); + } + + // The rest of these are moderately thin veneers on _Jv_Cond ops. + // The current version of Notify might be able to make the pthread + // call AFTER releasing the lock, thus saving some context switches?? + + void + java::lang::Object::wait (jlong timeout, jint nanos) + { + obj_addr_t addr = (obj_addr_t)this; + _Jv_ThreadId_t self = _Jv_ThreadSelf(); + unsigned hash = JV_SYNC_HASH(addr); + hash_entry * he = light_locks + hash; + unsigned count; + obj_addr_t address; + heavy_lock *hl; + + if (__builtin_expect (timeout < 0 || nanos < 0 || nanos > 999999, false)) + throw new IllegalArgumentException; + retry: + address = he -> address; + address &= ~LOCKED; + if (!compare_and_swap(&(he -> address), address, address | LOCKED)) + { + wait_unlocked(he); + goto retry; + } + // address does not have the lock bit set. We hold the lock on he. + if ((address & ~FLAGS) == addr) + { + // Convert to heavyweight. + if (he -> light_thr_id != self) + { + # ifdef LOCK_DEBUG + fprintf(stderr, "Found wrong lightweight lock owner in wait " + "address = 0x%lx pid = %d\n", address, getpid()); + print_he(he); + for(;;) {} + # endif + release_set(&(he -> address), address); + throw new IllegalMonitorStateException (JvNewStringLatin1 + ("current thread not owner")); + } + count = he -> light_count; + hl = get_heavy(addr, he); + he -> light_count = 0; + he -> heavy_count += count + 1; + for (unsigned i = 0; i <= count; ++i) + _Jv_MutexLock(&(hl->si.mutex)); + // Again release the he lock after acquiring the mutex. + he -> light_thr_id = INVALID_THREAD_ID; + release_set(&(he -> address), HEAVY); // lightweight lock now unused. + if (address & REQUEST_CONVERSION) + _Jv_CondNotify (&(hl->si.condition), &(hl->si.mutex)); + } + else /* We should hold the heavyweight lock. */ + { + hl = find_heavy(addr, he); + release_set(&(he -> address), address); + if (0 == hl) + { + # ifdef LOCK_DEBUG + fprintf(stderr, "Couldn't find heavy lock in wait " + "addr = 0x%lx pid = %d\n", addr, getpid()); + print_he(he); + for(;;) {} + # endif + throw new IllegalMonitorStateException (JvNewStringLatin1 + ("current thread not owner")); + } + assert(address & HEAVY); + } + switch (_Jv_CondWait (&(hl->si.condition), &(hl->si.mutex), timeout, nanos)) + { + case _JV_NOT_OWNER: + throw new IllegalMonitorStateException (JvNewStringLatin1 + ("current thread not owner")); + case _JV_INTERRUPTED: + if (Thread::interrupted ()) + throw new InterruptedException; + } + } + + void + java::lang::Object::notify (void) + { + obj_addr_t addr = (obj_addr_t)this; + _Jv_ThreadId_t self = _Jv_ThreadSelf(); + unsigned hash = JV_SYNC_HASH(addr); + hash_entry * he = light_locks + hash; + heavy_lock *hl; + obj_addr_t address; + int result; + + retry: + address = ((he -> address) & ~LOCKED); + if (!compare_and_swap(&(he -> address), address, address | LOCKED)) + { + wait_unlocked(he); + goto retry; + } + if ((address & ~FLAGS) == addr && he -> light_thr_id == self) + { + // We hold lightweight lock. Since it has not + // been inflated, there are no waiters. + release_set(&(he -> address), address); // unlock + return; + } + hl = find_heavy(addr, he); + // Hl can't disappear since we point to the underlying object. + // It's important that we release the lock bit before the notify, since + // otherwise we will try to wake up thee target while we still hold the + // bit. This results in lock bit contention, which we don't handle + // terribly well. + release_set(&(he -> address), address); // unlock + if (0 == hl) + { + throw new IllegalMonitorStateException(JvNewStringLatin1 + ("current thread not owner")); + return; + } + result = _Jv_CondNotify(&(hl->si.condition), &(hl->si.mutex)); + keep_live(addr); + if (__builtin_expect (result, 0)) + throw new IllegalMonitorStateException(JvNewStringLatin1 + ("current thread not owner")); + } + + void + java::lang::Object::notifyAll (void) + { + obj_addr_t addr = (obj_addr_t)this; + _Jv_ThreadId_t self = _Jv_ThreadSelf(); + unsigned hash = JV_SYNC_HASH(addr); + hash_entry * he = light_locks + hash; + heavy_lock *hl; + obj_addr_t address; + int result; + + retry: + address = (he -> address) & ~LOCKED; + if (!compare_and_swap(&(he -> address), address, address | LOCKED)) + { + wait_unlocked(he); + goto retry; + } + hl = find_heavy(addr, he); + if ((address & ~FLAGS) == addr && he -> light_thr_id == self) + { + // We hold lightweight lock. Since it has not + // been inflated, there are no waiters. + release_set(&(he -> address), address); // unlock + return; + } + release_set(&(he -> address), address); // unlock + if (0 == hl) + { + throw new IllegalMonitorStateException(JvNewStringLatin1 + ("current thread not owner")); + } + result = _Jv_CondNotifyAll(&(hl->si.condition), &(hl->si.mutex)); + if (__builtin_expect (result, 0)) + throw new IllegalMonitorStateException(JvNewStringLatin1 + ("current thread not owner")); + } + + // This is declared in Java code and in Object.h. + // It should never be called with JV_HASH_SYNCHRONIZATION + void + java::lang::Object::sync_init (void) + { + throw new IllegalMonitorStateException(JvNewStringLatin1 + ("internal error: sync_init")); + } + + // This is called on startup and declared in Object.h. + // For now we just make it a no-op. + void + _Jv_InitializeSyncMutex (void) + { + } + + #endif /* JV_HASH_SYNCHRONIZATION */ + diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natPosixProcess.cc gcc-3.1/libjava/java/lang/natPosixProcess.cc *** gcc-3.0.4/libjava/java/lang/natPosixProcess.cc Wed Sep 6 18:14:15 2000 --- gcc-3.1/libjava/java/lang/natPosixProcess.cc Wed Mar 6 05:14:38 2002 *************** *** 1,6 **** // natPosixProcess.cc - Native side of POSIX process code. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natPosixProcess.cc - Native side of POSIX process code. ! /* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation This file is part of libgcj. *************** java::lang::ConcreteProcess::destroy (vo *** 49,75 **** } jint - java::lang::ConcreteProcess::exitValue (void) - { - if (! hasExited) - { - int wstat; - pid_t r = waitpid ((pid_t) pid, &wstat, WNOHANG); - if (r == -1) - { - jstring x = JvNewStringLatin1 (strerror (errno)); - _Jv_Throw (new IllegalThreadStateException (x)); - } - - hasExited = true; - // Just use the raw status. FIXME: what is right? - status = wstat; - } - - return status; - } - - jint java::lang::ConcreteProcess::waitFor (void) { if (! hasExited) --- 49,54 ---- *************** java::lang::ConcreteProcess::waitFor (vo *** 77,91 **** int wstat; int r = waitpid ((pid_t) pid, &wstat, 0); ! if (r != -1) { hasExited = true; - // Just use the raw status. FIXME: what is right? - status = wstat; - } ! if (java::lang::Thread::interrupted()) ! _Jv_Throw (new InterruptedException (JvNewStringLatin1 ("wait interrupted"))); } return status; --- 56,76 ---- int wstat; int r = waitpid ((pid_t) pid, &wstat, 0); ! if (r == -1) ! { ! if (java::lang::Thread::interrupted()) ! throw new InterruptedException (JvNewStringLatin1 (strerror ! (errno))); ! } ! else { hasExited = true; ! if (WIFEXITED (wstat)) ! status = WEXITSTATUS (wstat); ! else ! status = -1; ! } } return status; *************** cleanup (char **args, char **env) *** 118,153 **** } } static void ! fail (int error_value, char **args, char **env, ! int *one = NULL, int *two = NULL, ! int *three = NULL, int *four = NULL, ! java::lang::Throwable *t = NULL) { ! cleanup (args, env); ! if (one != NULL) ! { ! close (one[0]); ! close (one[1]); ! } ! if (two != NULL) ! { ! close (two[0]); ! close (two[1]); ! } ! if (three != NULL) ! { ! close (three[0]); ! close (three[1]); ! } ! if (four != NULL) ! { ! close (four[0]); ! close (four[1]); ! } ! if (t == NULL) ! t = new java::io::IOException (JvNewStringLatin1 (strerror (error_value))); ! throw t; } void --- 103,117 ---- } } + // This makes our error handling a bit simpler and it lets us avoid + // thread bugs where we close a possibly-reopened file descriptor for + // a second time. static void ! myclose (int &fd) { ! if (fd != -1) ! close (fd); ! fd = -1; } void *************** java::lang::ConcreteProcess::startProces *** 158,178 **** hasExited = false; ! if (! progarray) ! throw new NullPointerException; ! ! // Transform arrays to native form. ! char **args = (char **) _Jv_Malloc ((progarray->length + 1) ! * sizeof (char *)); char **env = NULL; ! ! // Initialize so we can gracefully recover. ! jstring *elts = elements (progarray); ! for (int i = 0; i <= progarray->length; ++i) ! args[i] = NULL; try { for (int i = 0; i < progarray->length; ++i) args[i] = new_string (elts[i]); args[progarray->length] = NULL; --- 122,155 ---- hasExited = false; ! // Initialize all locals here to make cleanup simpler. ! char **args = NULL; char **env = NULL; ! int inp[2], outp[2], errp[2], msgp[2]; ! inp[0] = -1; ! inp[1] = -1; ! outp[0] = -1; ! outp[1] = -1; ! errp[0] = -1; ! errp[1] = -1; ! msgp[0] = -1; ! msgp[1] = -1; ! java::lang::Throwable *exc = NULL; ! errorStream = NULL; ! inputStream = NULL; ! outputStream = NULL; try { + // Transform arrays to native form. + args = (char **) _Jv_Malloc ((progarray->length + 1) + * sizeof (char *)); + + // Initialize so we can gracefully recover. + jstring *elts = elements (progarray); + for (int i = 0; i <= progarray->length; ++i) + args[i] = NULL; + for (int i = 0; i < progarray->length; ++i) args[i] = new_string (elts[i]); args[progarray->length] = NULL; *************** java::lang::ConcreteProcess::startProces *** 190,292 **** env[i] = new_string (elts[i]); env[envp->length] = NULL; } - } - catch (java::lang::OutOfMemoryError *oome) - { - fail (0, args, env, NULL, NULL, NULL, NULL, oome); - throw oome; - } - - // Create pipes for I/O. MSGP is for communicating exec() status. - int inp[2], outp[2], errp[2], msgp[2]; ! if (pipe (inp)) ! fail (errno, args, env); ! if (pipe (outp)) ! fail (errno, args, env, inp); ! if (pipe (errp)) ! fail (errno, args, env, inp, outp); ! if (pipe (msgp)) ! fail (errno, args, env, inp, outp, errp); ! if (fcntl (msgp[1], F_SETFD, FD_CLOEXEC)) ! fail (errno, args, env, inp, outp, errp, msgp); ! // We create the streams before forking. Otherwise if we had an ! // error while creating the streams we would have run the child with ! // no way to communicate with it. ! try ! { errorStream = new FileInputStream (new FileDescriptor (errp[0])); inputStream = new FileInputStream (new FileDescriptor (inp[0])); outputStream = new FileOutputStream (new FileDescriptor (outp[1])); - } - catch (java::lang::Throwable *t) - { - fail (0, args, env, inp, outp, errp, msgp, t); - } ! // We don't use vfork() because that would cause the local ! // environment to be set by the child. ! if ((pid = (jlong) fork ()) == -1) ! fail (errno, args, env, inp, outp, errp, msgp); ! if (pid == 0) ! { ! // Child process, so remap descriptors and exec. ! if (envp) ! { ! // preserve PATH unless specified explicitly ! char *path_val = getenv ("PATH"); ! environ = env; ! if (getenv ("PATH") == NULL) { ! char *path_env = (char *) _Jv_Malloc (strlen (path_val) + 5 + 1); ! strcpy (path_env, "PATH="); ! strcat (path_env, path_val); ! putenv (path_env); } - } - - // We ignore errors from dup2 because they should never occur. - dup2 (outp[0], 0); - dup2 (inp[1], 1); - dup2 (errp[1], 2); ! close (inp[0]); ! close (inp[1]); ! close (errp[0]); ! close (errp[1]); ! close (outp[0]); ! close (outp[1]); ! close (msgp[0]); ! execvp (args[0], args); ! // Send the parent notification that the exec failed. ! char c = errno; ! write (msgp[1], &c, 1); ! _exit (127); } ! // Parent. Close extra file descriptors and mark ours as ! // close-on-exec. ! close (outp[0]); ! close (inp[1]); ! close (errp[1]); ! close (msgp[1]); ! char c; ! int r = read (msgp[0], &c, 1); ! if (r == -1) ! fail (errno, args, env, inp, outp, errp, msgp); ! else if (r != 0) ! fail (c, args, env, inp, outp, errp, msgp); ! close (msgp[0]); cleanup (args, env); ! fcntl (outp[1], F_SETFD, 1); ! fcntl (inp[0], F_SETFD, 1); ! fcntl (errp[0], F_SETFD, 1); } --- 167,317 ---- env[i] = new_string (elts[i]); env[envp->length] = NULL; } ! // Create pipes for I/O. MSGP is for communicating exec() ! // status. ! if (pipe (inp) || pipe (outp) || pipe (errp) || pipe (msgp) ! || fcntl (msgp[1], F_SETFD, FD_CLOEXEC)) ! throw new IOException (JvNewStringLatin1 (strerror (errno))); ! // We create the streams before forking. Otherwise if we had an ! // error while creating the streams we would have run the child ! // with no way to communicate with it. errorStream = new FileInputStream (new FileDescriptor (errp[0])); inputStream = new FileInputStream (new FileDescriptor (inp[0])); outputStream = new FileOutputStream (new FileDescriptor (outp[1])); ! // We don't use vfork() because that would cause the local ! // environment to be set by the child. ! if ((pid = (jlong) fork ()) == -1) ! throw new IOException (JvNewStringLatin1 (strerror (errno))); ! if (pid == 0) ! { ! // Child process, so remap descriptors and exec. ! if (envp) { ! // Preserve PATH and LD_LIBRARY_PATH unless specified ! // explicitly. ! char *path_val = getenv ("PATH"); ! char *ld_path_val = getenv ("LD_LIBRARY_PATH"); ! environ = env; ! if (getenv ("PATH") == NULL) ! { ! char *path_env = (char *) _Jv_Malloc (strlen (path_val) ! + 5 + 1); ! strcpy (path_env, "PATH="); ! strcat (path_env, path_val); ! putenv (path_env); ! } ! if (getenv ("LD_LIBRARY_PATH") == NULL) ! { ! char *ld_path_env ! = (char *) _Jv_Malloc (strlen (ld_path_val) + 16 + 1); ! strcpy (ld_path_env, "LD_LIBRARY_PATH="); ! strcat (ld_path_env, ld_path_val); ! putenv (ld_path_env); ! } } ! // We ignore errors from dup2 because they should never occur. ! dup2 (outp[0], 0); ! dup2 (inp[1], 1); ! dup2 (errp[1], 2); ! // Use close and not myclose -- we're in the child, and we ! // aren't worried about the possible race condition. ! close (inp[0]); ! close (inp[1]); ! close (errp[0]); ! close (errp[1]); ! close (outp[0]); ! close (outp[1]); ! close (msgp[0]); ! execvp (args[0], args); ! ! // Send the parent notification that the exec failed. ! char c = errno; ! write (msgp[1], &c, 1); ! _exit (127); ! } ! ! // Parent. Close extra file descriptors and mark ours as ! // close-on-exec. ! myclose (outp[0]); ! myclose (inp[1]); ! myclose (errp[1]); ! myclose (msgp[1]); ! ! char c; ! int r = read (msgp[0], &c, 1); ! if (r == -1) ! throw new IOException (JvNewStringLatin1 (strerror (errno))); ! else if (r != 0) ! throw new IOException (JvNewStringLatin1 (strerror (c))); } + catch (java::lang::Throwable *thrown) + { + // Do some cleanup we only do on failure. If a stream object + // has been created, we must close the stream itself (to avoid + // duplicate closes when the stream object is collected). + // Otherwise we simply close the underlying file descriptor. + // We ignore errors here as they are uninteresting. ! try ! { ! if (inputStream != NULL) ! inputStream->close (); ! else ! myclose (inp[0]); ! } ! catch (java::lang::Throwable *ignore) ! { ! } ! try ! { ! if (outputStream != NULL) ! outputStream->close (); ! else ! myclose (outp[1]); ! } ! catch (java::lang::Throwable *ignore) ! { ! } ! try ! { ! if (errorStream != NULL) ! errorStream->close (); ! else ! myclose (errp[0]); ! } ! catch (java::lang::Throwable *ignore) ! { ! } ! ! // These are potentially duplicate, but it doesn't matter due to ! // the use of myclose. ! myclose (outp[0]); ! myclose (inp[1]); ! myclose (errp[1]); ! myclose (msgp[1]); ! ! exc = thrown; ! } ! ! myclose (msgp[0]); cleanup (args, env); ! if (exc != NULL) ! throw exc; ! else ! { ! fcntl (outp[1], F_SETFD, FD_CLOEXEC); ! fcntl (inp[0], F_SETFD, FD_CLOEXEC); ! fcntl (errp[0], F_SETFD, FD_CLOEXEC); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natRuntime.cc gcc-3.1/libjava/java/lang/natRuntime.cc *** gcc-3.0.4/libjava/java/lang/natRuntime.cc Sat Sep 29 06:07:30 2001 --- gcc-3.1/libjava/java/lang/natRuntime.cc Tue Oct 16 08:35:17 2001 *************** details. */ *** 18,23 **** --- 18,24 ---- #include #include #include + #include #include *************** _Jv_FindSymbolInExecutable (const char * *** 72,77 **** --- 73,86 ---- return NULL; } + #else + + void * + _Jv_FindSymbolInExecutable (const char *symname) + { + return NULL; + } + #endif /* USE_LTDL */ void *************** java::lang::Runtime::_load (jstring path *** 129,142 **** #endif jsize total = JvGetStringUTFRegion (path, 0, path->length(), &buf[offset]); buf[offset + total] = '\0'; // FIXME: make sure path is absolute. ! lt_dlhandle h = do_search ? lt_dlopenext (buf) : lt_dlopen (buf); if (h == NULL) { const char *msg = lt_dlerror (); jstring str = path->concat (JvNewStringLatin1 (": ")); str = str->concat (JvNewStringLatin1 (msg)); ! _Jv_Throw (new UnsatisfiedLinkError (str)); } add_library (h); --- 138,158 ---- #endif jsize total = JvGetStringUTFRegion (path, 0, path->length(), &buf[offset]); buf[offset + total] = '\0'; + lt_dlhandle h; // FIXME: make sure path is absolute. ! { ! // Synchronize on java.lang.Class. This is to protect the class chain from ! // concurrent modification by class registration calls which may be run ! // during the dlopen(). ! JvSynchronize sync (&java::lang::Class::class$); ! h = do_search ? lt_dlopenext (buf) : lt_dlopen (buf); ! } if (h == NULL) { const char *msg = lt_dlerror (); jstring str = path->concat (JvNewStringLatin1 (": ")); str = str->concat (JvNewStringLatin1 (msg)); ! throw new UnsatisfiedLinkError (str); } add_library (h); *************** java::lang::Runtime::_load (jstring path *** 154,167 **** if (vers != JNI_VERSION_1_1 && vers != JNI_VERSION_1_2) { // FIXME: unload the library. ! _Jv_Throw (new UnsatisfiedLinkError (JvNewStringLatin1 ("unrecognized version from JNI_OnLoad"))); } } #else ! _Jv_Throw (new UnknownError ! (JvNewStringLatin1 (do_search ! ? "Runtime.loadLibrary not implemented" ! : "Runtime.load not implemented"))); #endif /* USE_LTDL */ } --- 170,183 ---- if (vers != JNI_VERSION_1_1 && vers != JNI_VERSION_1_2) { // FIXME: unload the library. ! throw new UnsatisfiedLinkError (JvNewStringLatin1 ("unrecognized version from JNI_OnLoad")); } } #else ! throw new UnknownError ! (JvNewStringLatin1 (do_search ! ? "Runtime.loadLibrary not implemented" ! : "Runtime.load not implemented")); #endif /* USE_LTDL */ } *************** java::lang::Runtime::init (void) *** 200,206 **** void java::lang::Runtime::runFinalization (void) { ! _Jv_RunFinalizers (); } jlong --- 216,222 ---- void java::lang::Runtime::runFinalization (void) { ! gnu::gcj::runtime::FinalizerThread::finalizerReady (); } jlong diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natString.cc gcc-3.1/libjava/java/lang/natString.cc *** gcc-3.0.4/libjava/java/lang/natString.cc Tue Apr 10 22:13:08 2001 --- gcc-3.1/libjava/java/lang/natString.cc Thu Nov 15 02:22:52 2001 *************** java::lang::String::rehash() *** 121,128 **** if (strhash == NULL) { strhash_size = 1024; ! strhash = (jstring *) _Jv_AllocBytesChecked (strhash_size ! * sizeof (jstring)); memset (strhash, 0, strhash_size * sizeof (jstring)); } else --- 121,127 ---- if (strhash == NULL) { strhash_size = 1024; ! strhash = (jstring *) _Jv_AllocBytes (strhash_size * sizeof (jstring)); memset (strhash, 0, strhash_size * sizeof (jstring)); } else *************** java::lang::String::rehash() *** 130,137 **** int i = strhash_size; jstring* ptr = strhash + i; int nsize = strhash_size * 2; ! jstring *next = (jstring *) _Jv_AllocBytesChecked (nsize ! * sizeof (jstring)); memset (next, 0, nsize * sizeof (jstring)); while (--i >= 0) --- 129,135 ---- int i = strhash_size; jstring* ptr = strhash + i; int nsize = strhash_size * 2; ! jstring *next = (jstring *) _Jv_AllocBytes (nsize * sizeof (jstring)); memset (next, 0, nsize * sizeof (jstring)); while (--i >= 0) *************** _Jv_GetStringUTFRegion (jstring str, jsi *** 341,353 **** return dptr - buf; } jstring _Jv_AllocString(jsize len) { jsize sz = sizeof(java::lang::String) + len * sizeof(jchar); ! jstring obj = (jstring) JvAllocObject(&StringClass, sz); ! obj->data = obj; obj->boffset = sizeof(java::lang::String); obj->count = len; --- 339,407 ---- return dptr - buf; } + /* Put printed (decimal) representation of NUM in a buffer. + BUFEND marks the end of the buffer, which must be at least 11 jchars long. + Returns the COUNT of jchars written. The result is in + (BUFEND - COUNT) (inclusive) upto (BUFEND) (exclusive). */ + + jint + _Jv_FormatInt (jchar* bufend, jint num) + { + register jchar* ptr = bufend; + jboolean isNeg; + if (num < 0) + { + isNeg = true; + num = -(num); + if (num < 0) + { + // Must be MIN_VALUE, so handle this special case. + // FIXME use 'unsigned jint' for num. + *--ptr = '8'; + num = 214748364; + } + } + else + isNeg = false; + + do + { + *--ptr = (jchar) ((int) '0' + (num % 10)); + num /= 10; + } + while (num > 0); + + if (isNeg) + *--ptr = '-'; + return bufend - ptr; + } + + jstring + java::lang::String::valueOf (jint num) + { + // Use an array large enough for "-2147483648"; i.e. 11 chars. + jchar buffer[11]; + int i = _Jv_FormatInt (buffer+11, num); + return _Jv_NewString (buffer+11-i, i); + } + jstring _Jv_AllocString(jsize len) { jsize sz = sizeof(java::lang::String) + len * sizeof(jchar); ! // We assert that for strings allocated this way, the data field ! // will always point to the object itself. Thus there is no reason ! // for the garbage collector to scan any of it. ! // Furthermore, we're about to overwrite the string data, so ! // initialization of the object is not an issue. ! #ifdef ENABLE_JVMPI ! jstring obj = (jstring) _Jv_AllocPtrFreeObject(&StringClass, sz); ! #else ! // Class needs no initialization, and there is no finalizer, so ! // we can go directly to the collector's allocator interface. ! jstring obj = (jstring) _Jv_AllocPtrFreeObj(sz, &StringClass); ! #endif obj->data = obj; obj->boffset = sizeof(java::lang::String); obj->count = len; *************** java::lang::String::init(jcharArray char *** 387,397 **** jboolean dont_copy) { if (! chars) ! JvThrow (new NullPointerException); jsize data_size = JvGetArrayLength (chars); if (offset < 0 || count < 0 || offset + count < 0 || offset + count > data_size) ! JvThrow (new StringIndexOutOfBoundsException()); jcharArray array; jchar *pdst; if (! dont_copy) --- 441,451 ---- jboolean dont_copy) { if (! chars) ! throw new NullPointerException; jsize data_size = JvGetArrayLength (chars); if (offset < 0 || count < 0 || offset + count < 0 || offset + count > data_size) ! throw new ArrayIndexOutOfBoundsException; jcharArray array; jchar *pdst; if (! dont_copy) *************** java::lang::String::init(jbyteArray asci *** 417,427 **** jint count) { if (! ascii) ! JvThrow (new NullPointerException); jsize data_size = JvGetArrayLength (ascii); if (offset < 0 || count < 0 || offset + count < 0 || offset + count > data_size) ! JvThrow (new java::lang::StringIndexOutOfBoundsException()); jcharArray array = JvNewCharArray(count); jbyte *psrc = elements (ascii) + offset; jchar *pdst = elements (array); --- 471,481 ---- jint count) { if (! ascii) ! throw new NullPointerException; jsize data_size = JvGetArrayLength (ascii); if (offset < 0 || count < 0 || offset + count < 0 || offset + count > data_size) ! throw new ArrayIndexOutOfBoundsException; jcharArray array = JvNewCharArray(count); jbyte *psrc = elements (ascii) + offset; jchar *pdst = elements (array); *************** java::lang::String::init (jbyteArray byt *** 440,450 **** jstring encoding) { if (! bytes) ! JvThrow (new NullPointerException); jsize data_size = JvGetArrayLength (bytes); if (offset < 0 || count < 0 || offset + count < 0 || offset + count > data_size) ! JvThrow (new StringIndexOutOfBoundsException); jcharArray array = JvNewCharArray (count); gnu::gcj::convert::BytesToUnicode *converter = gnu::gcj::convert::BytesToUnicode::getDecoder(encoding); --- 494,504 ---- jstring encoding) { if (! bytes) ! throw new NullPointerException; jsize data_size = JvGetArrayLength (bytes); if (offset < 0 || count < 0 || offset + count < 0 || offset + count > data_size) ! throw new ArrayIndexOutOfBoundsException; jcharArray array = JvNewCharArray (count); gnu::gcj::convert::BytesToUnicode *converter = gnu::gcj::convert::BytesToUnicode::getDecoder(encoding); *************** java::lang::String::init (jbyteArray byt *** 469,474 **** --- 523,529 ---- avail -= done; } } + converter->done (); this->data = array; this->boffset = (char *) elements (array) - (char *) array; this->count = outpos; *************** jchar *** 502,508 **** java::lang::String::charAt(jint i) { if (i < 0 || i >= count) ! JvThrow (new java::lang::StringIndexOutOfBoundsException()); return JvGetStringChars(this)[i]; } --- 557,563 ---- java::lang::String::charAt(jint i) { if (i < 0 || i >= count) ! throw new java::lang::StringIndexOutOfBoundsException; return JvGetStringChars(this)[i]; } *************** java::lang::String::getChars(jint srcBeg *** 511,519 **** jcharArray dst, jint dstBegin) { jint dst_length = JvGetArrayLength (dst); ! if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count ! || dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) ! JvThrow (new java::lang::StringIndexOutOfBoundsException()); jchar *dPtr = elements (dst) + dstBegin; jchar *sPtr = JvGetStringChars (this) + srcBegin; jint i = srcEnd-srcBegin; --- 566,575 ---- jcharArray dst, jint dstBegin) { jint dst_length = JvGetArrayLength (dst); ! if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count) ! throw new java::lang::StringIndexOutOfBoundsException; ! if (dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) ! throw new ArrayIndexOutOfBoundsException; jchar *dPtr = elements (dst) + dstBegin; jchar *sPtr = JvGetStringChars (this) + srcBegin; jint i = srcEnd-srcBegin; *************** java::lang::String::getBytes (jstring en *** 549,554 **** --- 605,611 ---- todo -= converted; } } + converter->done (); if (bufpos == buflen) return buffer; jbyteArray result = JvNewByteArray(bufpos); *************** java::lang::String::getBytes(jint srcBeg *** 561,569 **** jbyteArray dst, jint dstBegin) { jint dst_length = JvGetArrayLength (dst); ! if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count ! || dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) ! JvThrow (new java::lang::StringIndexOutOfBoundsException()); jbyte *dPtr = elements (dst) + dstBegin; jchar *sPtr = JvGetStringChars (this) + srcBegin; jint i = srcEnd-srcBegin; --- 618,627 ---- jbyteArray dst, jint dstBegin) { jint dst_length = JvGetArrayLength (dst); ! if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count) ! throw new java::lang::StringIndexOutOfBoundsException; ! if (dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) ! throw new ArrayIndexOutOfBoundsException; jbyte *dPtr = elements (dst) + dstBegin; jchar *sPtr = JvGetStringChars (this) + srcBegin; jint i = srcEnd-srcBegin; *************** jstring *** 754,760 **** java::lang::String::substring (jint beginIndex, jint endIndex) { if (beginIndex < 0 || endIndex > count || beginIndex > endIndex) ! JvThrow (new StringIndexOutOfBoundsException()); if (beginIndex == 0 && endIndex == count) return this; jint newCount = endIndex - beginIndex; --- 812,818 ---- java::lang::String::substring (jint beginIndex, jint endIndex) { if (beginIndex < 0 || endIndex > count || beginIndex > endIndex) ! throw new StringIndexOutOfBoundsException; if (beginIndex == 0 && endIndex == count) return this; jint newCount = endIndex - beginIndex; *************** java::lang::String::valueOf(jcharArray d *** 953,959 **** { jint data_length = JvGetArrayLength (data); if (offset < 0 || count < 0 || offset+count > data_length) ! JvThrow (new java::lang::IndexOutOfBoundsException()); jstring result = JvAllocString(count); jchar *sPtr = elements (data) + offset; jchar *dPtr = JvGetStringChars(result); --- 1011,1017 ---- { jint data_length = JvGetArrayLength (data); if (offset < 0 || count < 0 || offset+count > data_length) ! throw new ArrayIndexOutOfBoundsException; jstring result = JvAllocString(count); jchar *sPtr = elements (data) + offset; jchar *dPtr = JvGetStringChars(result); diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natStringBuffer.cc gcc-3.1/libjava/java/lang/natStringBuffer.cc *** gcc-3.0.4/libjava/java/lang/natStringBuffer.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/natStringBuffer.cc Tue May 22 04:38:35 2001 *************** *** 0 **** --- 1,30 ---- + // natStringBuffer.cc - Implementation of java.lang.StringBuffer native methods. + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #include + #include + #include + + java::lang::StringBuffer* + java::lang::StringBuffer::append (jint num) + { + // Use an array large enough for "-2147483648"; i.e. 11 chars. + jchar buffer[11]; + int i = _Jv_FormatInt (buffer+11, num); + JvSynchronize dummy (this); + jint needed = count + i; + ensureCapacity_unsynchronized (needed); + jchar* dst = elements (value) + count; + jchar* src = buffer+11-i; + while (--i >= 0) + *dst++ = *src++; + count = needed; + return this; + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natSystem.cc gcc-3.1/libjava/java/lang/natSystem.cc *** gcc-3.0.4/libjava/java/lang/natSystem.cc Fri Apr 20 09:41:11 2001 --- gcc-3.1/libjava/java/lang/natSystem.cc Sun Apr 7 11:30:08 2002 *************** *** 1,6 **** // natSystem.cc - Native code implementing System class. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natSystem.cc - Native code implementing System class. ! /* Copyright (C) 1998, 1999, 2000, 2001 , 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 14,20 **** #include #include ! #include "posix.h" #ifdef HAVE_PWD_H #include --- 14,20 ---- #include #include ! #include "platform.h" #ifdef HAVE_PWD_H #include *************** java::lang::System::arraycopy (jobject s *** 158,166 **** jlong java::lang::System::currentTimeMillis (void) { ! struct timeval tv; ! _Jv_gettimeofday (&tv); ! return (jlong) tv.tv_sec * 1000 + tv.tv_usec / 1000; } jint --- 158,164 ---- jlong java::lang::System::currentTimeMillis (void) { ! return _Jv_platform_gettimeofday (); } jint *************** java::lang::System::getSystemTimeZone (v *** 242,249 **** { struct tm *tim; time_t current_time; - char **tzinfo, *tzid; long tzoffset; current_time = time(0); --- 240,248 ---- { struct tm *tim; time_t current_time; long tzoffset; + const char *tz1, *tz2; + char *tzid; current_time = time(0); *************** java::lang::System::getSystemTimeZone (v *** 259,292 **** // is available, esp. if tzname is valid. // Richard Earnshaw has suggested using difftime to // calculate between gmtime and localtime (and accounting for possible ! // daylight savings time) as an alternative. Also note that this same ! // issue exists in java/util/natGregorianCalendar.cc. tzoffset = 0L; #endif ! tzinfo = tzname; if ((tzoffset % 3600) == 0) tzoffset = tzoffset / 3600; ! if (!strcmp(tzinfo[0], tzinfo[1])) ! { ! tzid = (char*) _Jv_Malloc (strlen(tzinfo[0]) + 6); ! if (!tzid) ! return NULL; ! ! sprintf(tzid, "%s%ld", tzinfo[0], tzoffset); ! } ! else ! { ! tzid = (char*) _Jv_Malloc (strlen(tzinfo[0]) + strlen(tzinfo[1]) + 6); ! if (!tzid) ! return NULL; ! ! sprintf(tzid, "%s%ld%s", tzinfo[0], tzoffset, tzinfo[1]); ! } ! jstring retval = JvNewStringUTF (tzid); _Jv_Free (tzid); return retval; } --- 258,287 ---- // is available, esp. if tzname is valid. // Richard Earnshaw has suggested using difftime to // calculate between gmtime and localtime (and accounting for possible ! // daylight savings time) as an alternative. tzoffset = 0L; #endif ! ! #ifdef HAVE_TM_ZONE ! tz1 = tim->tm_zone; ! tz2 = ""; ! #elif defined (HAVE_TZNAME) ! tz1 = tzname[0]; ! tz2 = strcmp (tzname[0], tzname[1]) ? tzname[1] : ""; ! #else ! // Some targets have no concept of timezones. ! tz1 = "???"; ! tz2 = tz1; ! #endif if ((tzoffset % 3600) == 0) tzoffset = tzoffset / 3600; ! tzid = (char*) _Jv_Malloc (strlen(tz1) + strlen(tz2) + 6); ! sprintf(tzid, "%s%ld%s", tz1, tzoffset, tz2); jstring retval = JvNewStringUTF (tzid); _Jv_Free (tzid); + return retval; } *************** java::lang::System::init_properties (voi *** 306,346 **** // A mixture of the Java Product Versioning Specification // (introduced in 1.2), and earlier versioning properties. ! SET ("java.version", VERSION); ! SET ("java.vendor", "Free Software Foundation"); SET ("java.vendor.url", "http://gcc.gnu.org/java/"); ! SET ("java.class.version", GCJVERSION); ! SET ("java.vm.specification.version", "1.1"); SET ("java.vm.specification.name", "Java(tm) Virtual Machine Specification"); SET ("java.vm.specification.vendor", "Sun Microsystems Inc."); ! SET ("java.vm.version", GCJVERSION); ! SET ("java.vm.vendor", "Free Software Foundation"); ! SET ("java.vm.name", "libgcj"); ! SET ("java.specification.version", "1.1"); ! SET ("java.specification.name", "Java(tm) Language Specification"); SET ("java.specification.vendor", "Sun Microsystems Inc."); ! // FIXME: how to set this given location-independence? ! // SET ("java.home", "FIXME"); SET ("file.encoding", default_file_encoding); - #ifdef WIN32 - SET ("file.separator", "\\"); - SET ("path.separator", ";"); - SET ("line.separator", "\r\n"); - SET ("java.io.tmpdir", "C:\\temp"); - #else - // Unix. - SET ("file.separator", "/"); - SET ("path.separator", ":"); - SET ("line.separator", "\n"); - char *tmpdir = ::getenv("TMPDIR"); - if (! tmpdir) - tmpdir = "/tmp"; - SET ("java.io.tmpdir", tmpdir); - #endif - #ifdef HAVE_UNAME struct utsname u; if (! uname (&u)) --- 301,338 ---- // A mixture of the Java Product Versioning Specification // (introduced in 1.2), and earlier versioning properties. ! SET ("java.version", GCJVERSION); ! SET ("java.vendor", "Free Software Foundation, Inc."); SET ("java.vendor.url", "http://gcc.gnu.org/java/"); ! SET ("java.class.version", "46.0"); ! SET ("java.vm.specification.version", "1.0"); SET ("java.vm.specification.name", "Java(tm) Virtual Machine Specification"); SET ("java.vm.specification.vendor", "Sun Microsystems Inc."); ! SET ("java.vm.version", __VERSION__); ! SET ("java.vm.vendor", "Free Software Foundation, Inc."); ! SET ("java.vm.name", "GNU libgcj"); ! SET ("java.specification.version", "1.3"); ! SET ("java.specification.name", "Java(tm) Platform API Specification"); SET ("java.specification.vendor", "Sun Microsystems Inc."); ! char value[100]; ! #define NAME "GNU libgcj " ! strcpy (value, NAME); ! strncpy (value + sizeof (NAME) - 1, __VERSION__, ! sizeof(value) - sizeof(NAME)); ! value[sizeof (value) - 1] = '\0'; ! jstring version = JvNewStringLatin1 (value); ! newprops->put (JvNewStringLatin1 ("java.fullversion"), version); ! newprops->put (JvNewStringLatin1 ("java.vm.info"), version); ! ! // This definition is rather arbitrary: we choose $(prefix). In ! // part we do this because most people specify only --prefix and ! // nothing else when installing gcj. Plus, people are free to ! // redefine `java.home' with `-D' if necessary. ! SET ("java.home", PREFIX); SET ("file.encoding", default_file_encoding); #ifdef HAVE_UNAME struct utsname u; if (! uname (&u)) *************** java::lang::System::init_properties (voi *** 416,423 **** #endif /* HAVE_GETCWD */ // Set user locale properties based on setlocale() ! #ifdef HAVE_SETLOCALE ! char *locale = setlocale (LC_ALL, ""); if (locale && strlen (locale) >= 2) { char buf[3]; --- 408,421 ---- #endif /* HAVE_GETCWD */ // Set user locale properties based on setlocale() ! #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) ! // We let the user choose the locale. However, since Java differs ! // from POSIX, we arbitrarily pick LC_MESSAGES as determining the ! // Java locale. We can't use LC_ALL because it might return a full ! // list of all the settings. If we don't have LC_MESSAGES then we ! // just default to `en_US'. ! setlocale (LC_ALL, ""); ! char *locale = setlocale (LC_MESSAGES, ""); if (locale && strlen (locale) >= 2) { char buf[3]; *************** java::lang::System::init_properties (voi *** 435,443 **** } } else ! #endif /* HAVE_SETLOCALE */ { SET ("user.language", "en"); } // Set the "user.timezone" property. --- 433,442 ---- } } else ! #endif /* HAVE_SETLOCALE and HAVE_LC_MESSAGES */ { SET ("user.language", "en"); + SET ("user.region", "US"); } // Set the "user.timezone" property. *************** java::lang::System::init_properties (voi *** 459,464 **** --- 458,464 ---- } // Set the system properties from the user's environment. + #ifndef DISABLE_GETENV_PROPERTIES if (_Jv_Environment_Properties) { size_t i = 0; *************** java::lang::System::init_properties (voi *** 470,475 **** --- 470,476 ---- i++; } } + #endif if (_Jv_Jar_Class_Path) newprops->put(JvNewStringLatin1 ("java.class.path"), *************** java::lang::System::init_properties (voi *** 498,503 **** --- 499,508 ---- newprops->put(JvNewStringLatin1 ("java.class.path"), sb->toString ()); } + + // Allow platform specific settings and overrides. + _Jv_platform_initProperties (newprops); + // Finally, set the field. This ensures that concurrent getProperty() // calls will return initialized values without requiring them to be // synchronized in the common case. diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natThread.cc gcc-3.1/libjava/java/lang/natThread.cc *** gcc-3.0.4/libjava/java/lang/natThread.cc Sat Dec 30 12:18:39 2000 --- gcc-3.1/libjava/java/lang/natThread.cc Sun Aug 26 11:30:09 2001 *************** *** 1,6 **** // natThread.cc - Native part of Thread class. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natThread.cc - Native part of Thread class. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** java::lang::Thread::initialize_native (v *** 59,65 **** { natThread *nt = (natThread *) _Jv_AllocBytes (sizeof (natThread)); ! // The native thread data is kept in a Object field, not a rawdata, so that // the GC allocator can be used and a finalizer run after the thread becomes // unreachable. Note that this relies on the GC's ability to finalize // non-Java objects. FIXME? --- 59,65 ---- { natThread *nt = (natThread *) _Jv_AllocBytes (sizeof (natThread)); ! // The native thread data is kept in a Object field, not a RawData, so that // the GC allocator can be used and a finalizer run after the thread becomes // unreachable. Note that this relies on the GC's ability to finalize // non-Java objects. FIXME? *************** jint *** 87,93 **** java::lang::Thread::countStackFrames (void) { // NOTE: This is deprecated in JDK 1.2. ! JvFail ("java::lang::Thread::countStackFrames unimplemented"); return 0; } --- 87,94 ---- java::lang::Thread::countStackFrames (void) { // NOTE: This is deprecated in JDK 1.2. ! throw new UnsupportedOperationException ! (JvNewStringLatin1 ("Thread.countStackFrames unimplemented")); return 0; } *************** java::lang::Thread::destroy (void) *** 102,108 **** { // NOTE: This is marked as unimplemented in the JDK 1.2 // documentation. ! JvFail ("java::lang::Thread::destroy unimplemented"); } void --- 103,110 ---- { // NOTE: This is marked as unimplemented in the JDK 1.2 // documentation. ! throw new UnsupportedOperationException ! (JvNewStringLatin1 ("Thread.destroy unimplemented")); } void *************** void *** 116,122 **** java::lang::Thread::join (jlong millis, jint nanos) { if (millis < 0 || nanos < 0 || nanos > 999999) ! _Jv_Throw (new IllegalArgumentException); Thread *current = currentThread (); --- 118,124 ---- java::lang::Thread::join (jlong millis, jint nanos) { if (millis < 0 || nanos < 0 || nanos > 999999) ! throw new IllegalArgumentException; Thread *current = currentThread (); *************** java::lang::Thread::join (jlong millis, *** 135,148 **** _Jv_MutexUnlock (&nt->join_mutex); if (current->isInterrupted (true)) ! _Jv_Throw (new InterruptedException); } void java::lang::Thread::resume (void) { checkAccess (); ! JvFail ("java::lang::Thread::resume unimplemented"); } void --- 137,151 ---- _Jv_MutexUnlock (&nt->join_mutex); if (current->isInterrupted (true)) ! throw new InterruptedException; } void java::lang::Thread::resume (void) { checkAccess (); ! throw new UnsupportedOperationException ! (JvNewStringLatin1 ("Thread.resume unimplemented")); } void *************** java::lang::Thread::setPriority (jint ne *** 150,156 **** { checkAccess (); if (newPriority < MIN_PRIORITY || newPriority > MAX_PRIORITY) ! _Jv_Throw (new IllegalArgumentException); jint gmax = group->getMaxPriority(); if (newPriority > gmax) --- 153,159 ---- { checkAccess (); if (newPriority < MIN_PRIORITY || newPriority > MAX_PRIORITY) ! throw new IllegalArgumentException; jint gmax = group->getMaxPriority(); if (newPriority > gmax) *************** void *** 165,171 **** java::lang::Thread::sleep (jlong millis, jint nanos) { if (millis < 0 || nanos < 0 || nanos > 999999) ! _Jv_Throw (new IllegalArgumentException); if (millis == 0 && nanos == 0) ++nanos; --- 168,174 ---- java::lang::Thread::sleep (jlong millis, jint nanos) { if (millis < 0 || nanos < 0 || nanos > 999999) ! throw new IllegalArgumentException; if (millis == 0 && nanos == 0) ++nanos; *************** java::lang::Thread::sleep (jlong millis, *** 180,186 **** _Jv_MutexUnlock (&nt->join_mutex); if (current->isInterrupted (true)) ! _Jv_Throw (new InterruptedException); } void --- 183,189 ---- _Jv_MutexUnlock (&nt->join_mutex); if (current->isInterrupted (true)) ! throw new InterruptedException; } void *************** java::lang::Thread::finish_ () *** 213,224 **** _Jv_MutexUnlock (&nt->join_mutex); } ! void ! java::lang::Thread::run_ (jobject obj) { - java::lang::Thread *thread = (java::lang::Thread *) obj; - try - { #ifdef ENABLE_JVMPI if (_Jv_JVMPI_Notify_THREAD_START) { --- 216,226 ---- _Jv_MutexUnlock (&nt->join_mutex); } ! // Run once at thread startup, either when thread is attached or when ! // _Jv_ThreadRun is called. ! static void ! _Jv_NotifyThreadStart (java::lang::Thread* thread) { #ifdef ENABLE_JVMPI if (_Jv_JVMPI_Notify_THREAD_START) { *************** java::lang::Thread::run_ (jobject obj) *** 272,278 **** --- 274,287 ---- _Jv_EnableGC (); } #endif + } + void + _Jv_ThreadRun (java::lang::Thread* thread) + { + try + { + _Jv_NotifyThreadStart (thread); thread->run (); } catch (java::lang::Throwable *t) *************** java::lang::Thread::start (void) *** 299,325 **** // Its illegal to re-start() a thread, even if its dead. if (!startable_flag) ! _Jv_Throw (new IllegalThreadStateException); alive_flag = true; startable_flag = false; natThread *nt = (natThread *) data; ! _Jv_ThreadStart (this, nt->thread, (_Jv_ThreadStartFunc *) &run_); } void java::lang::Thread::stop (java::lang::Throwable *) { ! _Jv_Throw (new UnsupportedOperationException ! (JvNewStringLatin1 ("java::lang::Thread::stop unimplemented"))); } void java::lang::Thread::suspend (void) { checkAccess (); ! _Jv_Throw (new UnsupportedOperationException ! (JvNewStringLatin1 ("java::lang::Thread::suspend unimplemented"))); } void --- 308,362 ---- // Its illegal to re-start() a thread, even if its dead. if (!startable_flag) ! throw new IllegalThreadStateException; alive_flag = true; startable_flag = false; natThread *nt = (natThread *) data; ! _Jv_ThreadStart (this, nt->thread, (_Jv_ThreadStartFunc *) &_Jv_ThreadRun); } void java::lang::Thread::stop (java::lang::Throwable *) { ! throw new UnsupportedOperationException ! (JvNewStringLatin1 ("Thread.stop unimplemented")); } void java::lang::Thread::suspend (void) { checkAccess (); ! throw new UnsupportedOperationException ! (JvNewStringLatin1 ("Thread.suspend unimplemented")); ! } ! ! static int nextThreadNumber = 0; ! ! jstring ! java::lang::Thread::gen_name (void) ! { ! jint i; ! jclass sync = &java::lang::Thread::class$; ! { ! JvSynchronize dummy(sync); ! i = ++nextThreadNumber; ! } ! ! // Use an array large enough for "-2147483648"; i.e. 11 chars, + "Thread-". ! jchar buffer[7+11]; ! jchar *bufend = (jchar *) ((char *) buffer + sizeof(buffer)); ! i = _Jv_FormatInt (bufend, i); ! jchar *ptr = bufend - i; ! // Prepend "Thread-". ! *--ptr = '-'; ! *--ptr = 'd'; ! *--ptr = 'a'; ! *--ptr = 'e'; ! *--ptr = 'r'; ! *--ptr = 'h'; ! *--ptr = 'T'; ! return JvNewString (ptr, bufend - ptr); } void *************** _Jv_SetCurrentJNIEnv (JNIEnv *env) *** 344,346 **** --- 381,425 ---- JvAssert (t != NULL); ((natThread *) t->data)->jni_env = env; } + + // Attach the current native thread to an existing (but unstarted) Thread + // object. Returns -1 on failure, 0 upon success. + jint + _Jv_AttachCurrentThread(java::lang::Thread* thread) + { + if (thread == NULL || thread->startable_flag == false) + return -1; + thread->startable_flag = false; + thread->alive_flag = true; + natThread *nt = (natThread *) thread->data; + _Jv_ThreadRegister (nt->thread); + return 0; + } + + java::lang::Thread* + _Jv_AttachCurrentThread(jstring name, java::lang::ThreadGroup* group) + { + java::lang::Thread *thread = _Jv_ThreadCurrent (); + if (thread != NULL) + return thread; + if (name == NULL) + name = java::lang::Thread::gen_name (); + thread = new java::lang::Thread (NULL, group, NULL, name); + _Jv_AttachCurrentThread (thread); + _Jv_NotifyThreadStart (thread); + return thread; + } + + jint + _Jv_DetachCurrentThread (void) + { + java::lang::Thread *t = _Jv_ThreadCurrent (); + if (t == NULL) + return -1; + + _Jv_ThreadUnRegister (); + // Release the monitors. + t->finish_ (); + + return 0; + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/natThrowable.cc gcc-3.1/libjava/java/lang/natThrowable.cc *** gcc-3.0.4/libjava/java/lang/natThrowable.cc Sun May 13 07:10:25 2001 --- gcc-3.1/libjava/java/lang/natThrowable.cc Thu Feb 7 19:26:06 2002 *************** *** 1,6 **** // natThrowable.cc - Superclass for all exceptions. ! /* Copyright (C) 2000 Red Hat Inc This file is part of libgcj. --- 1,6 ---- // natThrowable.cc - Superclass for all exceptions. ! /* Copyright (C) 2000 Free Software Foundation, Inc This file is part of libgcj. diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ref/PhantomReference.java gcc-3.1/libjava/java/lang/ref/PhantomReference.java *** gcc-3.0.4/libjava/java/lang/ref/PhantomReference.java Mon Dec 11 03:47:48 2000 --- gcc-3.1/libjava/java/lang/ref/PhantomReference.java Tue Jan 22 22:40:18 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang.ref; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.ref; diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ref/Reference.java gcc-3.1/libjava/java/lang/ref/Reference.java *** gcc-3.0.4/libjava/java/lang/ref/Reference.java Mon Dec 11 03:47:48 2000 --- gcc-3.1/libjava/java/lang/ref/Reference.java Tue Jan 22 22:40:18 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang.ref; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.ref; *************** public abstract class Reference *** 64,71 **** /** * The underlying object. This field is handled in a special way by * the garbage collection. */ ! Object referent; /** * The queue this reference is registered on. This is null, if this --- 75,95 ---- /** * The underlying object. This field is handled in a special way by * the garbage collection. + * GCJ LOCAL: + * This is a RawData because it must be disguised from the GC. + * END GCJ LOCAL */ ! gnu.gcj.RawData referent; ! ! /** ! * This is like REFERENT but is not scanned by the GC. We keep a ! * copy around so that we can see when clear() has been called. ! * GCJ LOCAL: ! * This field doesn't exist in Classpath; we use it to detect ! * clearing. ! * END GCJ LOCAL ! */ ! gnu.gcj.RawData copy; /** * The queue this reference is registered on. This is null, if this *************** public abstract class Reference *** 97,103 **** */ Reference(Object ref) { ! referent = ref; } /** --- 121,127 ---- */ Reference(Object ref) { ! create (ref); } /** *************** public abstract class Reference *** 112,122 **** { if (q == null) throw new NullPointerException(); - referent = ref; queue = q; } /** * Returns the object, this reference refers to. * @return the object, this reference refers to, or null if the * reference was cleared. --- 136,151 ---- { if (q == null) throw new NullPointerException(); queue = q; + create (ref); } /** + * Notifies the VM that a new Reference has been created. + */ + private native void create (Object o); + + /** * Returns the object, this reference refers to. * @return the object, this reference refers to, or null if the * reference was cleared. *************** public abstract class Reference *** 138,143 **** --- 167,173 ---- public void clear() { referent = null; + copy = null; } /** diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ref/ReferenceQueue.java gcc-3.1/libjava/java/lang/ref/ReferenceQueue.java *** gcc-3.0.4/libjava/java/lang/ref/ReferenceQueue.java Mon Dec 11 03:47:48 2000 --- gcc-3.1/libjava/java/lang/ref/ReferenceQueue.java Tue Jan 22 22:40:18 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang.ref; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.ref; diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ref/SoftReference.java gcc-3.1/libjava/java/lang/ref/SoftReference.java *** gcc-3.0.4/libjava/java/lang/ref/SoftReference.java Mon Dec 11 03:47:48 2000 --- gcc-3.1/libjava/java/lang/ref/SoftReference.java Tue Jan 22 22:40:18 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang.ref; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.ref; diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ref/WeakReference.java gcc-3.1/libjava/java/lang/ref/WeakReference.java *** gcc-3.0.4/libjava/java/lang/ref/WeakReference.java Mon Dec 11 03:47:48 2000 --- gcc-3.1/libjava/java/lang/ref/WeakReference.java Tue Jan 22 22:40:18 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.lang.ref; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.ref; diff -Nrc3pad gcc-3.0.4/libjava/java/lang/ref/natReference.cc gcc-3.1/libjava/java/lang/ref/natReference.cc *** gcc-3.0.4/libjava/java/lang/ref/natReference.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/lang/ref/natReference.cc Wed Oct 3 16:47:02 2001 *************** *** 0 **** --- 1,304 ---- + // natReference.cc - Native code for References + + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + // Written by Tom Tromey + + #include + + #include + #include + #include + #include + #include + #include + #include + #include + + static void finalize_reference (jobject ref); + static void finalize_referred_to_object (jobject obj); + + + + enum weight + { + SOFT = 0, + WEAK = 1, + FINALIZE = 2, + PHANTOM = 3, + + // This is used to mark the head of a list. + HEAD = 4, + + // This is used to mark a deleted item. + DELETED = 5 + }; + + // Objects of this type are used in the hash table to keep track of + // the mapping between a finalizable object and the various References + // which refer to it. + struct object_list + { + // The reference object. This is NULL for FINALIZE weight. + jobject reference; + + // The weight of this object. + enum weight weight; + + // Next in list. + object_list *next; + }; + + // Hash table used to hold mapping from object to References. The + // object_list item in the hash holds the object itself in the + // reference field; chained to it are all the references sorted in + // order of weight (lowest first). + static object_list *hash = NULL; + + // Number of slots used in HASH. + static int hash_count = 0; + + // Number of slots total in HASH. Must be power of 2. + static int hash_size = 0; + + static object_list * + find_slot (jobject key) + { + jint hcode = _Jv_HashCode (key); + /* step must be non-zero, and relatively prime with hash_size. */ + jint step = (hcode ^ (hcode >> 16)) | 1; + int start_index = hcode & (hash_size - 1); + int index = start_index; + int deleted_index = -1; + for (;;) + { + object_list *ptr = &hash[index]; + if (ptr->reference == key) + return ptr; + else if (ptr->reference == NULL) + { + if (deleted_index == -1) + return ptr; + else + return &hash[deleted_index]; + } + else if (ptr->weight == DELETED) + deleted_index = index; + index = (index + step) & (hash_size - 1); + JvAssert (index != start_index); + } + } + + static void + rehash () + { + if (hash == NULL) + { + hash_size = 1024; + hash = (object_list *) _Jv_Malloc (hash_size * sizeof (object_list)); + memset (hash, 0, hash_size * sizeof (object_list)); + } + else + { + object_list *old = hash; + int i = hash_size; + + hash_size *= 2; + hash = (object_list *) _Jv_Malloc (hash_size * sizeof (object_list)); + memset (hash, 0, hash_size * sizeof (object_list)); + + while (--i >= 0) + { + if (old[i].reference == NULL || old[i].weight == DELETED) + continue; + object_list *newslot = find_slot (old[i].reference); + *newslot = old[i]; + } + + _Jv_Free (old); + } + } + + // Remove a Reference. + static void + remove_from_hash (jobject obj) + { + java::lang::ref::Reference *ref + = reinterpret_cast (obj); + object_list *head = find_slot (ref->copy); + object_list **link = &head->next; + head = head->next; + + while (head && head->reference != ref) + { + link = &head->next; + head = head->next; + } + + // Remove the slot. + if (head) + { + *link = head->next; + _Jv_Free (head); + } + } + + // FIXME what happens if an object's finalizer creates a Reference to + // the object, and the object has never before been added to the hash? + // Madness! + + // Add an item to the hash table. If the item is new, we also add a + // finalizer item. We keep items in the hash table until they are + // completely collected; this lets us know when an item is new, even + // if it has been resurrected after its finalizer has been run. + static void + add_to_hash (java::lang::ref::Reference *the_reference) + { + JvSynchronize sync (java::lang::ref::Reference::lock); + + if (3 * hash_count >= 2 * hash_size) + rehash (); + + jobject referent = the_reference->referent; + object_list *item = find_slot (referent); + if (item->reference == NULL) + { + // New item, so make an entry for the finalizer. + item->reference = referent; + item->weight = HEAD; + + item->next = (object_list *) _Jv_Malloc (sizeof (object_list)); + item->next->reference = NULL; + item->next->weight = FINALIZE; + item->next->next = NULL; + ++hash_count; + } + + object_list *n = (object_list *) _Jv_Malloc (sizeof (object_list)); + n->reference = the_reference; + + enum weight w = PHANTOM; + if (java::lang::ref::SoftReference::class$.isInstance (the_reference)) + w = SOFT; + else if (java::lang::ref::WeakReference::class$.isInstance (the_reference)) + w = WEAK; + n->weight = w; + + object_list **link = &item->next; + object_list *iter = *link; + while (iter && iter->weight < n->weight) + { + link = &iter->next; + iter = *link; + } + n->next = (*link) ? (*link)->next : NULL; + *link = n; + } + + // This is called when an object is ready to be finalized. This + // actually implements the appropriate Reference semantics. + static void + finalize_referred_to_object (jobject obj) + { + JvSynchronize sync (java::lang::ref::Reference::lock); + + object_list *list = find_slot (obj); + object_list *head = list->next; + if (head == NULL) + { + // We have a truly dead object: the object's finalizer has been + // run, all the object's references have been processed, and the + // object is unreachable. There is, at long last, no way to + // resurrect it. + list->weight = DELETED; + --hash_count; + return; + } + + enum weight w = head->weight; + if (w == FINALIZE) + { + // If we have a Reference A to a Reference B, and B is + // finalized, then we have to take special care to make sure + // that B is properly deregistered. This is super gross. FIXME + // will it fail if B's finalizer resurrects B? + if (java::lang::ref::Reference::class$.isInstance (obj)) + finalize_reference (obj); + else + _Jv_FinalizeObject (obj); + list->next = head->next; + _Jv_Free (head); + } + else if (w != SOFT || _Jv_GCCanReclaimSoftReference (obj)) + { + // If we just decided to reclaim a soft reference, we might as + // well do all the weak references at the same time. + if (w == SOFT) + w = WEAK; + + while (head && head->weight <= w) + { + java::lang::ref::Reference *ref + = reinterpret_cast (head->reference); + // If the copy is already NULL then the user must have + // called Reference.clear(). + if (ref->copy != NULL) + { + if (w == PHANTOM) + ref->referent = ref->copy; + else + ref->copy = NULL; + ref->enqueue (); + } + + object_list *next = head->next; + _Jv_Free (head); + head = next; + } + list->next = head; + } + + // Re-register this finalizer. We always re-register because we + // can't know until the next collection cycle whether or not the + // object is truly unreachable. + _Jv_RegisterFinalizer (obj, finalize_referred_to_object); + } + + // This is called when a Reference object is finalized. If there is a + // Reference pointing to this Reference then that case is handled by + // finalize_referred_to_object. + static void + finalize_reference (jobject ref) + { + JvSynchronize sync (java::lang::ref::Reference::lock); + remove_from_hash (ref); + // The user might have a subclass of Reference with a finalizer. + _Jv_FinalizeObject (ref); + } + + void + ::java::lang::ref::Reference::create (jobject ref) + { + // Nothing says you can't make a Reference with a NULL referent. + // But there's nothing to do in such a case. + referent = reinterpret_cast (ref); + copy = referent; + if (referent != NULL) + { + JvSynchronize sync (java::lang::ref::Reference::lock); + // `this' is a new Reference object. We register a new + // finalizer for pointed-to object and we arrange a special + // finalizer for ourselves as well. + _Jv_RegisterFinalizer (this, finalize_reference); + _Jv_RegisterFinalizer (referent, finalize_referred_to_object); + jobject *objp = reinterpret_cast (&referent); + _Jv_GCRegisterDisappearingLink (objp); + add_to_hash (this); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/AccessibleObject.java gcc-3.1/libjava/java/lang/reflect/AccessibleObject.java *** gcc-3.0.4/libjava/java/lang/reflect/AccessibleObject.java Sat Nov 18 02:30:29 2000 --- gcc-3.1/libjava/java/lang/reflect/AccessibleObject.java Tue Jan 22 22:40:20 2002 *************** *** 1,53 **** ! // AccessibleObject.java - Base for reflection objects. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation - This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.lang.reflect; /** * @author Tom Tromey ! * @date December 12, 1998 ! */ ! /* Written using JDK 1.2 beta docs. ! * Status: Believed complete and correct. */ - public class AccessibleObject { ! protected AccessibleObject () { - flag = false; } ! public boolean isAccessible () { return flag; } ! public static void setAccessible (AccessibleObject[] array, boolean flag) { ! checkPermission (); ! for (int i = 0; i < array.length; ++i) ! array[i].flag = flag; } ! public void setAccessible (boolean flag) { ! checkPermission (); ! this.flag = flag; } ! private static final void checkPermission () { SecurityManager sm = System.getSecurityManager(); ! // FIXME: sm.checkPermission(ReflectPermission ("suppressAccessChecks")) } ! private boolean flag; } --- 1,180 ---- ! /* java.lang.reflect.AccessibleObject ! Copyright (C) 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.reflect; /** + * This class is the superclass of various reflection classes, and + * allows sufficiently trusted code to bypass normal restrictions to + * do necessary things like invoke private methods outside of the + * class during Serialization. If you don't have a good reason + * to mess with this, don't try. Fortunately, there are adequate + * security checks before you can set a reflection object as accessible. + * * @author Tom Tromey ! * @author Eric Blake ! * @see Field ! * @see Constructor ! * @see Method ! * @see ReflectPermission ! * @since 1.2 ! * @status updated to 1.4 */ public class AccessibleObject { ! /** ! * True if this object is marked accessible, which means the reflected ! * object bypasses normal security checks. NOTEDon't try messing ! * with this by reflection. You'll mess yourself up. ! */ ! // default visibility for use by inherited classes ! boolean flag = false; ! ! /** ! * Only the three reflection classes that extend this can create an ! * accessible object. This is not serializable for security reasons. ! */ ! protected AccessibleObject() { } ! /** ! * Return the accessibility status of this object. ! * ! * @return true if this object bypasses security checks ! */ ! public boolean isAccessible() { return flag; } ! /** ! * Convenience method to set the flag on a number of objects with a single ! * security check. If a security manager exists, it is checked for ! * ReflectPermission("suppressAccessChecks").

    ! * ! * If flag is true, and the initial security check succeeds, ! * this can still fail if a forbidden object is encountered, leaving the ! * array half-modified. At the moment, the forbidden members are:
    ! *

      ! *
    • Any Constructor for java.lang.Class
    • ! *
    • Any AccessibleObject for java.lang.reflect.AccessibleObject ! * (this is not specified by Sun, but it closes a big security hole ! * where you can use reflection to bypass the security checks that ! * reflection is supposed to provide)
    • ! *
    ! * (Sun has not specified others, but good candidates might include ! * ClassLoader, String, and such. However, the more checks we do, the ! * slower this method gets). ! * ! * @param array the array of accessible objects ! * @param flag the desired state of accessibility, true to bypass security ! * @throws NullPointerException if array is null ! * @throws SecurityException if the request is denied ! * @see SecurityManager#checkPermission(java.security.Permission) ! * @see RuntimePermission ! */ ! public static void setAccessible(AccessibleObject[] array, boolean flag) { ! checkPermission(); ! for (int i = 0; i < array.length; i++) ! array[i].secureSetAccessible(flag); } ! /** ! * Sets the accessibility flag for this reflection object. If a security ! * manager exists, it is checked for ! * ReflectPermission("suppressAccessChecks").

    ! * ! * If flag is true, and the initial security check succeeds, ! * this will still fail for a forbidden object. At the moment, the ! * forbidden members are:
    ! *

      ! *
    • Any Constructor for java.lang.Class
    • ! *
    • Any AccessibleObject for java.lang.reflect.AccessibleObject ! * (this is not specified by Sun, but it closes a big security hole ! * where you can use reflection to bypass the security checks that ! * reflection is supposed to provide)
    • ! *
    ! * (Sun has not specified others, but good candidates might include ! * ClassLoader, String, and such. However, the more checks we do, the ! * slower this method gets). ! * ! * @param flag the desired state of accessibility, true to bypass security ! * @throws NullPointerException if array is null ! * @throws SecurityException if the request is denied ! * @see SecurityManager#checkPermission(java.security.Permission) ! * @see RuntimePermission ! */ ! public void setAccessible(boolean flag) { ! checkPermission(); ! secureSetAccessible(flag); } ! /** ! * Performs the specified security check, for ! * ReflectPermission("suppressAccessChecks"). ! * ! * @throws SecurityException if permission is denied ! */ ! private static final void checkPermission() { SecurityManager sm = System.getSecurityManager(); ! if (sm != null) ! sm.checkPermission(new ReflectPermission("suppressAccessChecks")); } ! /** ! * Performs the actual accessibility change, this must always be invoked ! * after calling checkPermission. ! * ! * @param flag the desired status ! * @throws SecurityException if flag is true and this is one of the ! * forbidden members mentioned in {@link setAccessible(boolean)}. ! */ ! private final void secureSetAccessible(boolean flag) ! { ! if (flag && ! ((this instanceof Constructor ! && ((Constructor) this).getDeclaringClass() == Class.class) ! || ((Member) this).getDeclaringClass() == AccessibleObject.class)) ! throw new SecurityException("Cannot make object accessible: " + this); ! this.flag = flag; ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/Constructor.java gcc-3.1/libjava/java/lang/reflect/Constructor.java *** gcc-3.0.4/libjava/java/lang/reflect/Constructor.java Thu Mar 22 06:22:20 2001 --- gcc-3.1/libjava/java/lang/reflect/Constructor.java Wed Nov 14 23:42:38 2001 *************** public final class Constructor extends A *** 75,87 **** if (parameter_types == null) getType (); StringBuffer b = new StringBuffer (); ! b.append(Modifier.toString(getModifiers())); b.append(" "); ! b.append(getName()); b.append("("); for (int i = 0; i < parameter_types.length; ++i) { ! b.append(parameter_types[i].getName()); if (i < parameter_types.length - 1) b.append(","); } --- 75,87 ---- if (parameter_types == null) getType (); StringBuffer b = new StringBuffer (); ! Modifier.toString(getModifiers(), b); b.append(" "); ! Method.appendClassName (b, declaringClass); b.append("("); for (int i = 0; i < parameter_types.length; ++i) { ! Method.appendClassName (b, parameter_types[i]); if (i < parameter_types.length - 1) b.append(","); } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/Field.java gcc-3.1/libjava/java/lang/reflect/Field.java *** gcc-3.0.4/libjava/java/lang/reflect/Field.java Mon Sep 11 22:49:29 2000 --- gcc-3.1/libjava/java/lang/reflect/Field.java Wed Oct 24 18:06:48 2001 *************** *** 1,4 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** public final class Field extends Accessi *** 32,37 **** --- 32,43 ---- // Offset in bytes from the start of declaringClass's fields array. private int offset; + // This is instantiated by Class sometimes, but it uses C++ and + // avoids the Java protection check. + Field () + { + } + public boolean equals (Object fld) { if (! (fld instanceof Field)) *************** public final class Field extends Accessi *** 138,144 **** private native double getDouble (Class caller, Object obj) throws IllegalArgumentException, IllegalAccessException; ! public native Object get (Class caller, Object obj) throws IllegalArgumentException, IllegalAccessException; public void setByte (Object obj, byte b) --- 144,150 ---- private native double getDouble (Class caller, Object obj) throws IllegalArgumentException, IllegalAccessException; ! private native Object get (Class caller, Object obj) throws IllegalArgumentException, IllegalAccessException; public void setByte (Object obj, byte b) *************** public final class Field extends Accessi *** 189,216 **** setBoolean(null, obj, b); } ! public native void setByte (Class caller, Object obj, byte b) throws IllegalArgumentException, IllegalAccessException; ! public native void setShort (Class caller, Object obj, short s) throws IllegalArgumentException, IllegalAccessException; ! public native void setInt (Class caller, Object obj, int i) throws IllegalArgumentException, IllegalAccessException; ! public native void setLong (Class caller, Object obj, long l) throws IllegalArgumentException, IllegalAccessException; ! public native void setFloat (Class caller, Object obj, float f) throws IllegalArgumentException, IllegalAccessException; ! public native void setDouble (Class caller, Object obj, double d) throws IllegalArgumentException, IllegalAccessException; ! public native void setChar (Class caller, Object obj, char c) throws IllegalArgumentException, IllegalAccessException; ! public native void setBoolean (Class caller, Object obj, boolean b) throws IllegalArgumentException, IllegalAccessException; private native void set (Class caller, Object obj, Object val, Class type) --- 195,222 ---- setBoolean(null, obj, b); } ! private native void setByte (Class caller, Object obj, byte b) throws IllegalArgumentException, IllegalAccessException; ! private native void setShort (Class caller, Object obj, short s) throws IllegalArgumentException, IllegalAccessException; ! private native void setInt (Class caller, Object obj, int i) throws IllegalArgumentException, IllegalAccessException; ! private native void setLong (Class caller, Object obj, long l) throws IllegalArgumentException, IllegalAccessException; ! private native void setFloat (Class caller, Object obj, float f) throws IllegalArgumentException, IllegalAccessException; ! private native void setDouble (Class caller, Object obj, double d) throws IllegalArgumentException, IllegalAccessException; ! private native void setChar (Class caller, Object obj, char c) throws IllegalArgumentException, IllegalAccessException; ! private native void setBoolean (Class caller, Object obj, boolean b) throws IllegalArgumentException, IllegalAccessException; private native void set (Class caller, Object obj, Object val, Class type) *************** public final class Field extends Accessi *** 222,228 **** set(null, object, value); } ! public void set (Class caller, Object object, Object value) throws IllegalArgumentException, IllegalAccessException { Class type = getType(); --- 228,234 ---- set(null, object, value); } ! private void set (Class caller, Object object, Object value) throws IllegalArgumentException, IllegalAccessException { Class type = getType(); *************** public final class Field extends Accessi *** 257,265 **** Modifier.toString(mods, sbuf); sbuf.append(' '); } ! sbuf.append(getType().getName()); sbuf.append(' '); ! sbuf.append(getDeclaringClass().getName()); sbuf.append('.'); sbuf.append(getName()); return sbuf.toString(); --- 263,271 ---- Modifier.toString(mods, sbuf); sbuf.append(' '); } ! Method.appendClassName (sbuf, getType ()); sbuf.append(' '); ! Method.appendClassName (sbuf, getDeclaringClass()); sbuf.append('.'); sbuf.append(getName()); return sbuf.toString(); diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/InvocationTargetException.java gcc-3.1/libjava/java/lang/reflect/InvocationTargetException.java *** gcc-3.0.4/libjava/java/lang/reflect/InvocationTargetException.java Fri Sep 8 19:37:08 2000 --- gcc-3.1/libjava/java/lang/reflect/InvocationTargetException.java Tue Jan 22 22:40:20 2002 *************** *** 1,75 **** ! // InvocationTargetException.java - Wrapper exception for reflection. ! ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.lang.reflect; import java.io.PrintStream; import java.io.PrintWriter; - /** - * @author Tom Tromey - * @date December 12, 1998 - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Believed complete and correct. */ ! public class InvocationTargetException extends Exception { ! public Throwable getTargetException () { ! return target; } ! ! protected InvocationTargetException () { ! super (); ! target = null; } ! ! public InvocationTargetException (Throwable exception) { ! super (); ! target = exception; } ! ! public InvocationTargetException (Throwable exception, String msg) { ! super (msg); ! target = exception; } ! // This is from JDK 1.2. ! public void printStackTrace () { ! if (target != null) target.printStackTrace(); } ! // This is from JDK 1.2. ! public void printStackTrace (PrintStream s) { ! if (target != null) ! target.printStackTrace(s); } ! // This is from JDK 1.2. ! public void printStackTrace (PrintWriter wr) { ! if (target != null) ! target.printStackTrace(wr); } - - // The wrapped exception. The name is specified by the - // serialization spec. - private Throwable target; - - private static final long serialVersionUID = 4085088731926701167L; } --- 1,139 ---- ! /* InvocationTargetException.java - Wrapper exception for reflection ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.lang.reflect; + import java.io.PrintStream; import java.io.PrintWriter; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Believed complete and correct. */ ! /** ! * InvocationTargetException is sort of a way to "wrap" whatever exception ! * comes up when a method or constructor is called via Reflection. ! * ! * @author John Keiser ! * @version 1.1.0, 31 May 1998 ! * @author Tom Tromey ! * @date December 12, 1998 ! * ! * @see Method#invoke(Object,Object[]) ! * @see Constructor#newInstance(Object[]) ! */ ! ! public class InvocationTargetException extends Exception { ! static final long serialVersionUID = 4085088731926701167L; ! ! private Throwable target = null; ! ! protected InvocationTargetException() { ! super(); } ! ! /** ! * Create an InvocationTargetException using another ! * exception. ! * @param targetException the exception to wrap ! */ ! public InvocationTargetException(Throwable targetException) { ! super(targetException.toString()); ! target = targetException; } ! ! /** ! * Create an InvocationTargetException using another ! * exception and an error message. ! * ! * @param targetException the exception to wrap ! * @param err an extra reason for the exception-throwing ! */ ! public InvocationTargetException(Throwable targetException, String err) { ! super(err); ! target = targetException; } ! ! /** ! * Get the wrapped (targeted) exception. ! * ! * @return the targeted exception. ! */ ! public Throwable getTargetException() { ! return target; } ! public void printStackTrace() { ! if (target == null) ! super.printStackTrace(); ! else ! { ! System.err.print(this.getClass() + ": "); target.printStackTrace(); + } } ! public void printStackTrace(PrintStream ps) { ! if (target == null) ! super.printStackTrace(ps); ! else ! { ! ps.print(this.getClass() + ": "); ! target.printStackTrace(ps); ! } } ! public void printStackTrace(PrintWriter pw) { ! if (target == null) ! super.printStackTrace(pw); ! else ! { ! pw.print(this.getClass() + ": "); ! target.printStackTrace(pw); ! } } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/Member.java gcc-3.1/libjava/java/lang/reflect/Member.java *** gcc-3.0.4/libjava/java/lang/reflect/Member.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/lang/reflect/Member.java Tue Jan 22 22:40:20 2002 *************** *** 1,26 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.lang.reflect; ! /** ! * @author Per Bothner ! * @date September 27, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition. ! * Status: Believed complete and correct. */ - public interface Member { ! public static final int PUBLIC = 0; ! public static final int DECLARED = 1; ! public Class getDeclaringClass (); ! public int getModifiers (); ! public String getName(); } --- 1,100 ---- ! /* java.lang.reflect.Member - common query methods in reflection ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.reflect; ! /** ! * Member is an interface that represents any member of a class (field or ! * method) or a constructor. You can get information about the declaring ! * class, name or modifiers of the member with this interface. ! * ! * @author John Keiser ! * @author Per Bothner ! * @author Eric Blake ! * @see Class ! * @see Field ! * @see Method ! * @see Constructor ! * @since 1.1 ! * @status updated to 1.4 */ public interface Member { ! /** ! * Represents all members, whether public, private, protected or ! * package-protected, but only which are declared in this class. ! * Used in SecurityManager.checkMemberAccess() to determine the ! * type of members to access. ! * @see SecurityManager#checkMemberAccess() ! */ ! int DECLARED = 1; ! ! /** ! * Represents public members only, but includes all inherited members. ! * Used in SecurityManager.checkMemberAccess() to determine the type of ! * members to access. ! * @see SecurityManager#checkMemberAccess() ! */ ! int PUBLIC = 0; ! ! /** ! * Gets the class that declared this member. This is not the class where ! * this method was called, or even the class where this Member object ! * came to life, but the class that declares the member this represents. ! * ! * @return the class that declared this member ! */ ! Class getDeclaringClass(); ! ! /** ! * Gets the simple name of this member. This will be a valid Java ! * identifier, with no qualification. ! * ! * @return the name of this member ! */ ! String getName(); ! ! /** ! * Gets the modifiers this member uses. Use the Modifier ! * class to interpret the values. ! * ! * @return an integer representing the modifiers to this Member ! * @see Modifier ! */ ! int getModifiers(); } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/Method.java gcc-3.1/libjava/java/lang/reflect/Method.java *** gcc-3.0.4/libjava/java/lang/reflect/Method.java Thu Mar 22 06:22:20 2001 --- gcc-3.1/libjava/java/lang/reflect/Method.java Fri Aug 24 17:24:44 2001 *************** import gnu.gcj.RawData; *** 25,48 **** public final class Method extends AccessibleObject implements Member { public boolean equals (Object obj) ! { ! if (! (obj instanceof Method)) ! return false; ! Method m = (Method) obj; ! return declaringClass == m.declaringClass && offset == m.offset; ! } public Class getDeclaringClass () ! { ! return declaringClass; ! } public Class[] getExceptionTypes () ! { ! if (exception_types == null) ! getType(); ! return (Class[]) exception_types.clone(); ! } public native int getModifiers (); --- 25,48 ---- public final class Method extends AccessibleObject implements Member { public boolean equals (Object obj) ! { ! if (! (obj instanceof Method)) ! return false; ! Method m = (Method) obj; ! return declaringClass == m.declaringClass && offset == m.offset; ! } public Class getDeclaringClass () ! { ! return declaringClass; ! } public Class[] getExceptionTypes () ! { ! if (exception_types == null) ! getType(); ! return (Class[]) exception_types.clone(); ! } public native int getModifiers (); *************** public final class Method extends Access *** 51,112 **** private native void getType (); public Class[] getParameterTypes () ! { ! if (parameter_types == null) ! getType(); ! return (Class[]) parameter_types.clone(); ! } public Class getReturnType () ! { ! if (return_type == null) ! getType(); ! return return_type; ! } public int hashCode () ! { ! // FIXME. ! return getName().hashCode() + declaringClass.getName().hashCode(); ! } public native Object invoke (Object obj, Object[] args) throws IllegalAccessException, IllegalArgumentException, ! InvocationTargetException; public String toString () ! { ! if (parameter_types == null) ! getType (); ! StringBuffer b = new StringBuffer (); ! Modifier.toString(getModifiers(), b); ! b.append(" "); ! b.append(return_type.getName()); ! b.append(" "); ! b.append(declaringClass.getName()); ! b.append("."); ! b.append(getName()); ! b.append("("); ! for (int i = 0; i < parameter_types.length; ++i) ! { ! b.append(parameter_types[i].getName()); ! if (i < parameter_types.length - 1) ! b.append(","); ! } ! b.append(")"); ! if (exception_types.length > 0) ! { ! b.append(" throws "); ! for (int i = 0; i < exception_types.length; ++i) ! { ! b.append(exception_types[i].getName()); ! if (i < exception_types.length - 1) ! b.append(","); ! } ! } ! return b.toString(); ! } private Method () { --- 51,132 ---- private native void getType (); public Class[] getParameterTypes () ! { ! if (parameter_types == null) ! getType(); ! return (Class[]) parameter_types.clone(); ! } public Class getReturnType () ! { ! if (return_type == null) ! getType(); ! return return_type; ! } public int hashCode () ! { ! // FIXME. ! return getName().hashCode() + declaringClass.getName().hashCode(); ! } public native Object invoke (Object obj, Object[] args) throws IllegalAccessException, IllegalArgumentException, ! InvocationTargetException; ! ! // Append a class name to a string buffer. We try to print the ! // fully-qualified name, the way that a Java programmer would expect ! // it to be written. Weirdly, Class has no appropriate method for ! // this. ! static void appendClassName (StringBuffer buf, Class k) ! { ! if (k.isArray ()) ! { ! appendClassName (buf, k.getComponentType ()); ! buf.append ("[]"); ! } ! else ! { ! // This is correct for primitive and reference types. Really ! // we'd like `Main$Inner' to be printed as `Main.Inner', I ! // think, but that is a pain. ! buf.append (k.getName ()); ! } ! } public String toString () ! { ! if (parameter_types == null) ! getType (); ! StringBuffer b = new StringBuffer (); ! Modifier.toString(getModifiers(), b); ! b.append(" "); ! appendClassName (b, return_type); ! b.append(" "); ! appendClassName (b, declaringClass); ! b.append("."); ! b.append(getName()); ! b.append("("); ! for (int i = 0; i < parameter_types.length; ++i) ! { ! appendClassName (b, parameter_types[i]); ! if (i < parameter_types.length - 1) ! b.append(","); ! } ! b.append(")"); ! if (exception_types.length > 0) ! { ! b.append(" throws "); ! for (int i = 0; i < exception_types.length; ++i) ! { ! appendClassName (b, exception_types[i]); ! if (i < exception_types.length - 1) ! b.append(","); ! } ! } ! return b.toString(); ! } private Method () { diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/Modifier.java gcc-3.1/libjava/java/lang/reflect/Modifier.java *** gcc-3.0.4/libjava/java/lang/reflect/Modifier.java Thu Jul 27 23:57:06 2000 --- gcc-3.1/libjava/java/lang/reflect/Modifier.java Thu Apr 4 08:32:33 2002 *************** *** 1,141 **** ! // Modifier.java - Process modifier values. ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! /** ! * @author Tom Tromey ! * @date October 1, 1998 ! */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct to version 1.2. - */ package java.lang.reflect; public class Modifier { ! public static final int PUBLIC = 0x001; ! public static final int PRIVATE = 0x002; ! public static final int PROTECTED = 0x004; ! public static final int STATIC = 0x008; ! public static final int FINAL = 0x010; ! public static final int SYNCHRONIZED = 0x020; ! public static final int VOLATILE = 0x040; ! public static final int TRANSIENT = 0x080; ! public static final int NATIVE = 0x100; ! public static final int INTERFACE = 0x200; ! public static final int ABSTRACT = 0x400; ! public static final int STRICT = 0x800; ! // This is only used by the C++ code, so it is not public. static final int ALL_FLAGS = 0xfff; ! public static boolean isAbstract (int mod) { return (mod & ABSTRACT) != 0; } ! public static boolean isFinal (int mod) { return (mod & FINAL) != 0; } ! public static boolean isInterface (int mod) { return (mod & INTERFACE) != 0; } ! public static boolean isNative (int mod) { return (mod & NATIVE) != 0; } ! public static boolean isPrivate (int mod) { return (mod & PRIVATE) != 0; } ! public static boolean isProtected (int mod) { return (mod & PROTECTED) != 0; } ! public static boolean isPublic (int mod) { return (mod & PUBLIC) != 0; } ! public static boolean isStatic (int mod) { return (mod & STATIC) != 0; } ! public static boolean isStrict (int mod) { return (mod & STRICT) != 0; } ! public static boolean isSynchronized (int mod) { return (mod & SYNCHRONIZED) != 0; } ! public static boolean isTransient (int mod) { return (mod & TRANSIENT) != 0; } ! public static boolean isVolatile (int mod) { return (mod & VOLATILE) != 0; } ! public static String toString (int mod) { ! StringBuffer r = new StringBuffer (); ! toString(mod, r); ! return r.toString(); } ! static void toString (int mod, StringBuffer r) { ! if (isPublic (mod)) r.append("public "); ! if (isProtected (mod)) r.append("protected "); ! if (isPrivate (mod)) r.append("private "); ! if (isAbstract (mod)) r.append("abstract "); ! if (isStatic (mod)) r.append("static "); ! if (isFinal (mod)) r.append("final "); ! if (isTransient (mod)) r.append("transient "); ! if (isVolatile (mod)) r.append("volatile "); ! if (isNative (mod)) ! r.append("native "); ! if (isSynchronized (mod)) r.append("synchronized "); ! if (isInterface (mod)) r.append("interface "); ! if (isStrict (mod)) ! r.append("strict "); ! // Trim trailing space. ! int l = r.length(); ! if (l > 0) ! r.setLength(l - 1); } } --- 1,332 ---- ! /* java.lang.reflect.Modifier ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.lang.reflect; + /** + * Modifier is a helper class with static methods to determine whether an + * int returned from getModifiers() represents static, public, protected, + * native, final, etc... and provides an additional method to print + * out all of the modifiers in an int in order. + *

    + * The methods in this class use the bitmask values in the VM spec to + * determine the modifiers of an int. This means that a VM must return a + * standard mask, conformant with the VM spec. I don't know if this is how + * Sun does it, but I'm willing to bet money that it is. + * + * @author John Keiser + * @author Tom Tromey + * @author Eric Blake + * @see Member#getModifiers() + * @see Method#getModifiers() + * @see Field#getModifiers() + * @see Constructor#getModifiers() + * @see Class#getModifiers() + * @since 1.1 + */ public class Modifier { ! /** This constructor really shouldn't be here ... there are no ! * instance methods or variables of this class, so instantiation is ! * worthless. However, this function is in the 1.1 spec, so it is added ! * for completeness. ! */ ! public Modifier() ! { ! } ! /** ! * Public: accessible from any other class. ! */ ! public static final int PUBLIC = 0x0001; ! ! /** ! * Private: accessible only from the same enclosing class. ! */ ! public static final int PRIVATE = 0x0002; ! ! /** ! * Protected: accessible only to subclasses, or within the package. ! */ ! public static final int PROTECTED = 0x0004; ! ! /** ! * Static:

      ! *
    • Class: no enclosing instance for nested class.
    • ! *
    • Field or Method: can be accessed or invoked without an ! * instance of the declaring class.
    • ! *
    ! */ ! public static final int STATIC = 0x0008; ! ! /** ! * Final:
      ! *
    • Class: no subclasses allowed.
    • ! *
    • Field: cannot be changed.
    • ! *
    • Method: cannot be overriden.
    • ! *
    ! */ ! public static final int FINAL = 0x0010; ! ! /** ! * Synchronized: Method: lock the class while calling this method. ! */ ! public static final int SYNCHRONIZED = 0x0020; ! ! /** ! * Volatile: Field: cannot be cached. ! */ ! public static final int VOLATILE = 0x0040; ! ! /** ! * Transient: Field: not serialized or deserialized. ! */ ! public static final int TRANSIENT = 0x0080; ! ! /** ! * Native: Method: use JNI to call this method. ! */ ! public static final int NATIVE = 0x0100; ! ! /** ! * Interface: Class: is an interface. ! */ ! public static final int INTERFACE = 0x0200; ! ! /** ! * Abstract:
      ! *
    • Class: may not be instantiated.
    • ! *
    • Method: may not be called.
    • ! *
    ! */ ! public static final int ABSTRACT = 0x0400; ! ! /** ! * Strictfp: Method: expressions are FP-strict.

    ! * Also used as a modifier for classes, to mean that all initializers ! * and constructors are FP-strict, but does not show up in ! * Class.getModifiers. ! */ ! public static final int STRICT = 0x0800; ! ! ! /** ! * Super - treat invokespecial as polymorphic so that super.foo() works ! * according to the JLS. This is a reuse of the synchronized constant ! * to patch a hole in JDK 1.0. *shudder*. ! */ ! static final int SUPER = 0x0020; ! ! /** ! * All the flags, only used by code in this package. ! */ static final int ALL_FLAGS = 0xfff; ! /** ! * Check whether the given modifier is abstract. ! * @param mod the modifier. ! * @return true if abstract, false otherwise. ! */ ! public static boolean isAbstract(int mod) { return (mod & ABSTRACT) != 0; } ! /** ! * Check whether the given modifier is final. ! * @param mod the modifier. ! * @return true if final, false otherwise. ! */ ! public static boolean isFinal(int mod) { return (mod & FINAL) != 0; } ! /** ! * Check whether the given modifier is an interface. ! * @param mod the modifier. ! * @return true if an interface, false otherwise. ! */ ! public static boolean isInterface(int mod) { return (mod & INTERFACE) != 0; } ! /** ! * Check whether the given modifier is native. ! * @param mod the modifier. ! * @return true if native, false otherwise. ! */ ! public static boolean isNative(int mod) { return (mod & NATIVE) != 0; } ! /** ! * Check whether the given modifier is private. ! * @param mod the modifier. ! * @return true if private, false otherwise. ! */ ! public static boolean isPrivate(int mod) { return (mod & PRIVATE) != 0; } ! /** ! * Check whether the given modifier is protected. ! * @param mod the modifier. ! * @return true if protected, false otherwise. ! */ ! public static boolean isProtected(int mod) { return (mod & PROTECTED) != 0; } ! /** ! * Check whether the given modifier is public. ! * @param mod the modifier. ! * @return true if public, false otherwise. ! */ ! public static boolean isPublic(int mod) { return (mod & PUBLIC) != 0; } ! /** ! * Check whether the given modifier is static. ! * @param mod the modifier. ! * @return true if static, false otherwise. ! */ ! public static boolean isStatic(int mod) { return (mod & STATIC) != 0; } ! /** ! * Check whether the given modifier is strictfp. ! * @param mod the modifier. ! * @return true if strictfp, false otherwise. ! */ ! public static boolean isStrict(int mod) { return (mod & STRICT) != 0; } ! /** ! * Check whether the given modifier is synchronized. ! * @param mod the modifier. ! * @return true if synchronized, false otherwise. ! */ ! public static boolean isSynchronized(int mod) { return (mod & SYNCHRONIZED) != 0; } ! /** ! * Check whether the given modifier is transient. ! * @param mod the modifier. ! * @return true if transient, false otherwise. ! */ ! public static boolean isTransient(int mod) { return (mod & TRANSIENT) != 0; } ! /** ! * Check whether the given modifier is volatile. ! * @param mod the modifier. ! * @return true if volatile, false otherwise. ! */ ! public static boolean isVolatile(int mod) { return (mod & VOLATILE) != 0; } ! /** ! * Get a string representation of all the modifiers represented by the ! * given int. The keywords are printed in this order: ! * <public|protected|private> abstract static final transient ! * volatile synchronized native strictfp interface. ! * ! * @param mod the modifier. ! * @return the String representing the modifiers. ! */ ! public static String toString(int mod) { ! return toString(mod, new StringBuffer()).toString(); } ! /** ! * Package helper method that can take a StringBuffer. ! * @param mod the modifier ! * @param r the StringBuffer to which the String representation is appended ! * @return r, with information appended ! */ ! static StringBuffer toString(int mod, StringBuffer r) { ! if (isPublic(mod)) r.append("public "); ! if (isProtected(mod)) r.append("protected "); ! if (isPrivate(mod)) r.append("private "); ! if (isAbstract(mod)) r.append("abstract "); ! if (isStatic(mod)) r.append("static "); ! if (isFinal(mod)) r.append("final "); ! if (isTransient(mod)) r.append("transient "); ! if (isVolatile(mod)) r.append("volatile "); ! if (isSynchronized(mod)) r.append("synchronized "); ! if (isNative(mod)) ! r.append("native "); ! if (isStrict(mod)) ! r.append("strictfp "); ! if (isInterface(mod)) r.append("interface "); ! // Trim trailing space. ! if ((mod & ALL_FLAGS) != 0) ! r.setLength(r.length() - 1); ! return r; } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/ReflectPermission.java gcc-3.1/libjava/java/lang/reflect/ReflectPermission.java *** gcc-3.0.4/libjava/java/lang/reflect/ReflectPermission.java Mon Nov 20 18:25:41 2000 --- gcc-3.1/libjava/java/lang/reflect/ReflectPermission.java Tue Jan 22 22:40:20 2002 *************** *** 1,22 **** ! // ReflectPermission.java - Process modifier values. ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! /** ! * @author Tom Tromey ! * @date November 18, 2000 ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct to version 1.2. */ package java.lang.reflect; --- 1,43 ---- ! /* ReflectPermission.java - named permission for reflaction ! Copyright (C) 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. */ package java.lang.reflect; *************** import java.security.BasicPermission; *** 25,50 **** /** * This class implements permissions for reflection. This is a named ! * permission, and the only defined name is suppressAccessChecks. */ ! public final class ReflectPermission extends BasicPermission { /** * Construct a ReflectPermission with the given name. * @param name The permission name */ ! public ReflectPermission (String name) { ! super (name); } /** * Construct a ReflectPermission with the given name. * @param name The permission name ! * @param actions The actions; this is ignored and should be null. */ ! public ReflectPermission (String name, String actions) { ! super (name, actions); } } --- 46,102 ---- /** * This class implements permissions for reflection. This is a named ! * permission, and the only defined name is suppressAccessChecks, which ! * allows suppression of normal Java objects when using reflection. ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! * ! *
    Permission Target NameWhat Permission AllowsRisk of Allowing Permission
    suppressAccessChecksAbility to access fields, invoke methods, and construct objects ! * via reflection, including non-public members in contexts where ! * such access is not legal at compile-time.This is dangerous. It exposes possibly confidential information, ! * and malicious code could interfere with the internals of the Virtual ! * Machine by corrupting private data.
    ! * ! * @author Tom Tromey ! * @author Eric Blake ! * @since 1.2 ! * @status updated to 1.4 */ ! public final class ReflectPermission ! extends BasicPermission { /** + * Compatible with JDK 1.2. + */ + private static final long serialVersionUID = 7412737110241507485L; + + /** * Construct a ReflectPermission with the given name. + * * @param name The permission name */ ! public ReflectPermission(String name) { ! super(name); } /** * Construct a ReflectPermission with the given name. + * * @param name The permission name ! * @param actions The actions; this is ignored and should be null */ ! public ReflectPermission(String name, String actions) { ! super(name, actions); } } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/natArray.cc gcc-3.1/libjava/java/lang/reflect/natArray.cc *** gcc-3.0.4/libjava/java/lang/reflect/natArray.cc Mon Jan 8 23:28:56 2001 --- gcc-3.1/libjava/java/lang/reflect/natArray.cc Tue Oct 2 13:44:32 2001 *************** *** 1,6 **** // natField.cc - Implementation of java.lang.reflect.Field native methods. ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natField.cc - Implementation of java.lang.reflect.Field native methods. ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** java::lang::reflect::Array::newInstance *** 43,53 **** } jobject ! java::lang::reflect::Array::newInstance (jclass componentType, jintArray dimensions) { jint ndims = dimensions->length; if (ndims == 0) ! return componentType->newInstance (); jint* dims = elements (dimensions); if (ndims == 1) return newInstance (componentType, dims[0]); --- 43,54 ---- } jobject ! java::lang::reflect::Array::newInstance (jclass componentType, ! jintArray dimensions) { jint ndims = dimensions->length; if (ndims == 0) ! throw new java::lang::IllegalArgumentException (); jint* dims = elements (dimensions); if (ndims == 1) return newInstance (componentType, dims[0]); *************** java::lang::reflect::Array::getLength (j *** 64,70 **** { jclass arrayType = array->getClass(); if (! arrayType->isArray ()) ! JvThrow (new java::lang::IllegalArgumentException()); return ((__JArray*) array)->length; } --- 65,71 ---- { jclass arrayType = array->getClass(); if (! arrayType->isArray ()) ! throw new java::lang::IllegalArgumentException; return ((__JArray*) array)->length; } *************** java::lang::reflect::Array::getElementTy *** 73,79 **** { jclass arrayType = array->getClass(); if (! arrayType->isArray ()) ! JvThrow (new java::lang::IllegalArgumentException()); jint length = ((__JArray*) array)->length; if ((_Jv_uint) index >= (_Jv_uint) length) _Jv_ThrowBadArrayIndex(index); --- 74,80 ---- { jclass arrayType = array->getClass(); if (! arrayType->isArray ()) ! throw new java::lang::IllegalArgumentException; jint length = ((__JArray*) array)->length; if ((_Jv_uint) index >= (_Jv_uint) length) _Jv_ThrowBadArrayIndex(index); *************** java::lang::reflect::Array::getBoolean ( *** 86,92 **** jclass elementType = getElementType (array, index); if (elementType == JvPrimClass (boolean)) return elements ((jbooleanArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jchar --- 87,93 ---- jclass elementType = getElementType (array, index); if (elementType == JvPrimClass (boolean)) return elements ((jbooleanArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jchar *************** java::lang::reflect::Array::getChar (job *** 95,101 **** jclass elementType = getElementType (array, index); if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jbyte --- 96,102 ---- jclass elementType = getElementType (array, index); if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jbyte *************** java::lang::reflect::Array::getByte (job *** 104,110 **** jclass elementType = getElementType (array, index); if (elementType == JvPrimClass (byte)) return elements ((jbyteArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jshort --- 105,111 ---- jclass elementType = getElementType (array, index); if (elementType == JvPrimClass (byte)) return elements ((jbyteArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jshort *************** java::lang::reflect::Array::getShort (jo *** 115,121 **** return elements ((jshortArray) array) [index]; if (elementType == JvPrimClass (byte)) return elements ((jbyteArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jint --- 116,122 ---- return elements ((jshortArray) array) [index]; if (elementType == JvPrimClass (byte)) return elements ((jbyteArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jint *************** java::lang::reflect::Array::getInt (jobj *** 130,136 **** return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jlong --- 131,137 ---- return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jlong *************** java::lang::reflect::Array::getLong (job *** 147,153 **** return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jfloat --- 148,154 ---- return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jfloat *************** java::lang::reflect::Array::getFloat (jo *** 166,172 **** return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jdouble --- 167,173 ---- return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jdouble *************** java::lang::reflect::Array::getDouble (j *** 187,193 **** return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! JvThrow (new java::lang::IllegalArgumentException()); } jobject --- 188,194 ---- return elements ((jbyteArray) array) [index]; if (elementType == JvPrimClass (char)) return elements ((jcharArray) array) [index]; ! throw new java::lang::IllegalArgumentException; } jobject *************** java::lang::reflect::Array::get (jobject *** 218,224 **** else return java::lang::Boolean::FALSE; } ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 219,225 ---- else return java::lang::Boolean::FALSE; } ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setChar (job *** 236,242 **** else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 237,243 ---- else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setByte (job *** 256,262 **** else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 257,263 ---- else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setShort (jo *** 274,280 **** else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 275,281 ---- else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setInt (jobj *** 290,296 **** else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 291,297 ---- else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setLong (job *** 304,310 **** else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 305,311 ---- else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setFloat (jo *** 316,322 **** else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 317,323 ---- else if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setDouble (j *** 326,332 **** if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 327,333 ---- if (elementType == JvPrimClass (double)) elements ((jdoubleArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::setBoolean ( *** 337,343 **** if (elementType == JvPrimClass (boolean)) elements ((jbooleanArray) array) [index] = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void --- 338,344 ---- if (elementType == JvPrimClass (boolean)) elements ((jbooleanArray) array) [index] = value; else ! throw new java::lang::IllegalArgumentException; } void *************** java::lang::reflect::Array::set (jobject *** 345,350 **** jobject value, jclass elType) { if (! _Jv_IsInstanceOf (value, elType)) ! JvThrow (new java::lang::IllegalArgumentException ()); elements ((jobjectArray) array) [index] = value; } --- 346,351 ---- jobject value, jclass elType) { if (! _Jv_IsInstanceOf (value, elType)) ! throw new java::lang::IllegalArgumentException; elements ((jobjectArray) array) [index] = value; } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/natConstructor.cc gcc-3.1/libjava/java/lang/reflect/natConstructor.cc *** gcc-3.0.4/libjava/java/lang/reflect/natConstructor.cc Thu Mar 22 06:34:58 2001 --- gcc-3.1/libjava/java/lang/reflect/natConstructor.cc Mon Mar 26 07:05:32 2001 *************** *** 1,6 **** // natConstructor.cc - Native code for Constructor class. ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natConstructor.cc - Native code for Constructor class. ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** java::lang::reflect::Constructor::newIns *** 48,54 **** using namespace java::lang::reflect; if (Modifier::isAbstract (declaringClass->getModifiers())) ! JvThrow (new InstantiationException); jmethodID meth = _Jv_FromReflectedConstructor (this); // In the constructor case the return type is the type of the --- 48,54 ---- using namespace java::lang::reflect; if (Modifier::isAbstract (declaringClass->getModifiers())) ! throw new InstantiationException; jmethodID meth = _Jv_FromReflectedConstructor (this); // In the constructor case the return type is the type of the diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/natField.cc gcc-3.1/libjava/java/lang/reflect/natField.cc *** gcc-3.0.4/libjava/java/lang/reflect/natField.cc Fri Mar 23 19:12:19 2001 --- gcc-3.1/libjava/java/lang/reflect/natField.cc Wed Jan 23 19:42:18 2002 *************** details. */ *** 16,21 **** --- 16,22 ---- #include #include #include + #include #include #include #include *************** getAddr (java::lang::reflect::Field* fie *** 79,87 **** else { if (obj == NULL) ! _Jv_Throw (new java::lang::NullPointerException ()); if (! _Jv_IsInstanceOf (obj, field->getDeclaringClass())) ! JvThrow (new java::lang::IllegalArgumentException ()); return (void*) ((char*) obj + fld->getOffset ()); } } --- 80,88 ---- else { if (obj == NULL) ! throw new java::lang::NullPointerException; if (! _Jv_IsInstanceOf (obj, field->getDeclaringClass())) ! throw new java::lang::IllegalArgumentException; return (void*) ((char*) obj + fld->getOffset ()); } } *************** getBoolean (jclass cls, void* addr) *** 91,97 **** { if (cls == JvPrimClass (boolean)) return * (jboolean *) addr; ! _Jv_Throw (new java::lang::IllegalArgumentException()); } static jchar --- 92,98 ---- { if (cls == JvPrimClass (boolean)) return * (jboolean *) addr; ! throw new java::lang::IllegalArgumentException; } static jchar *************** getChar (jclass cls, void* addr) *** 99,105 **** { if (cls == JvPrimClass (char)) return * (jchar *) addr; ! _Jv_Throw (new java::lang::IllegalArgumentException()); } static jbyte --- 100,106 ---- { if (cls == JvPrimClass (char)) return * (jchar *) addr; ! throw new java::lang::IllegalArgumentException; } static jbyte *************** getByte (jclass cls, void* addr) *** 107,113 **** { if (cls == JvPrimClass (byte)) return * (jbyte *) addr; ! _Jv_Throw (new java::lang::IllegalArgumentException()); } static jshort --- 108,114 ---- { if (cls == JvPrimClass (byte)) return * (jbyte *) addr; ! throw new java::lang::IllegalArgumentException; } static jshort *************** getShort (jclass cls, void* addr) *** 117,123 **** return * (jshort *) addr; if (cls == JvPrimClass (byte)) return * (jbyte *) addr; ! _Jv_Throw (new java::lang::IllegalArgumentException()); } static jint --- 118,124 ---- return * (jshort *) addr; if (cls == JvPrimClass (byte)) return * (jbyte *) addr; ! throw new java::lang::IllegalArgumentException; } static jint *************** getInt (jclass cls, void* addr) *** 131,137 **** return * (jchar *) addr; if (cls == JvPrimClass (byte)) return * (jbyte *) addr; ! _Jv_Throw (new java::lang::IllegalArgumentException()); } static jlong --- 132,138 ---- return * (jchar *) addr; if (cls == JvPrimClass (byte)) return * (jbyte *) addr; ! throw new java::lang::IllegalArgumentException; } static jlong *************** java::lang::reflect::Field::get (jclass *** 249,255 **** else return java::lang::Boolean::FALSE; } ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 250,265 ---- else return java::lang::Boolean::FALSE; } ! throw new java::lang::IllegalArgumentException; ! } ! ! static void* ! setAddr (java::lang::reflect::Field* field, jclass caller, jobject obj) ! { ! void *addr = getAddr(field, caller, obj); ! if (field->getModifiers() & java::lang::reflect::Modifier::FINAL) ! throw new java::lang::IllegalAccessException(); ! return addr; } static void *************** setBoolean (jclass type, void *addr, jbo *** 258,264 **** if (type == JvPrimClass (boolean)) * (jboolean *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 268,274 ---- if (type == JvPrimClass (boolean)) * (jboolean *) addr = value; else ! throw new java::lang::IllegalArgumentException; } static void *************** setChar (jclass type, void *addr, jchar *** 275,281 **** else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 285,291 ---- else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! throw new java::lang::IllegalArgumentException; } static void *************** setByte (jclass type, void *addr, jbyte *** 294,300 **** else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 304,310 ---- else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! throw new java::lang::IllegalArgumentException; } static void *************** setShort (jclass type, void *addr, jshor *** 311,317 **** else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 321,327 ---- else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! throw new java::lang::IllegalArgumentException; } static void *************** setInt (jclass type, void *addr, jint va *** 326,332 **** else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 336,342 ---- else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! throw new java::lang::IllegalArgumentException; } static void *************** setLong (jclass type, void *addr, jlong *** 339,345 **** else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 349,355 ---- else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! throw new java::lang::IllegalArgumentException; } static void *************** setFloat (jclass type, void *addr, jfloa *** 350,356 **** else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } static void --- 360,366 ---- else if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! throw new java::lang::IllegalArgumentException; } static void *************** setDouble (jclass type, void *addr, jdou *** 359,427 **** if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! JvThrow (new java::lang::IllegalArgumentException()); } void java::lang::reflect::Field::setBoolean (jclass caller, jobject obj, jboolean b) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setBoolean (fld->type, getAddr (this, caller, obj), b); } void java::lang::reflect::Field::setChar (jclass caller, jobject obj, jchar c) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setChar (fld->type, getAddr (this, caller, obj), c); } void java::lang::reflect::Field::setByte (jclass caller, jobject obj, jbyte b) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setByte (fld->type, getAddr (this, caller, obj), b); } void java::lang::reflect::Field::setShort (jclass caller, jobject obj, jshort s) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setShort (fld->type, getAddr (this, caller, obj), s); } void java::lang::reflect::Field::setInt (jclass caller, jobject obj, jint i) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setInt (fld->type, getAddr (this, caller, obj), i); } void java::lang::reflect::Field::setLong (jclass caller, jobject obj, jlong l) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setLong (fld->type, getAddr (this, caller, obj), l); } void java::lang::reflect::Field::setFloat (jclass caller, jobject obj, jfloat f) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setFloat (fld->type, getAddr (this, caller, obj), f); } void java::lang::reflect::Field::setDouble (jclass caller, jobject obj, jdouble d) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setDouble (fld->type, getAddr (this, caller, obj), d); } void ! java::lang::reflect::Field::set (jclass caller, jobject object, jobject value, jclass type) { ! if (! _Jv_IsInstanceOf (value, type)) ! JvThrow (new java::lang::IllegalArgumentException ()); ! void* addr = getAddr (this, caller, object); * (jobject*) addr = value; } --- 369,438 ---- if (type == JvPrimClass (double)) * (jdouble *) addr = value; else ! throw new java::lang::IllegalArgumentException; } void java::lang::reflect::Field::setBoolean (jclass caller, jobject obj, jboolean b) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setBoolean (fld->type, setAddr (this, caller, obj), b); } void java::lang::reflect::Field::setChar (jclass caller, jobject obj, jchar c) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setChar (fld->type, setAddr (this, caller, obj), c); } void java::lang::reflect::Field::setByte (jclass caller, jobject obj, jbyte b) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setByte (fld->type, setAddr (this, caller, obj), b); } void java::lang::reflect::Field::setShort (jclass caller, jobject obj, jshort s) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setShort (fld->type, setAddr (this, caller, obj), s); } void java::lang::reflect::Field::setInt (jclass caller, jobject obj, jint i) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setInt (fld->type, setAddr (this, caller, obj), i); } void java::lang::reflect::Field::setLong (jclass caller, jobject obj, jlong l) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setLong (fld->type, setAddr (this, caller, obj), l); } void java::lang::reflect::Field::setFloat (jclass caller, jobject obj, jfloat f) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setFloat (fld->type, setAddr (this, caller, obj), f); } void java::lang::reflect::Field::setDouble (jclass caller, jobject obj, jdouble d) { jfieldID fld = _Jv_FromReflectedField (this); ! ::setDouble (fld->type, setAddr (this, caller, obj), d); } void ! java::lang::reflect::Field::set (jclass caller, jobject object, jobject value, ! jclass type) { ! void* addr = setAddr (this, caller, object); ! if (value != NULL && ! _Jv_IsInstanceOf (value, type)) ! throw new java::lang::IllegalArgumentException; * (jobject*) addr = value; } diff -Nrc3pad gcc-3.0.4/libjava/java/lang/reflect/natMethod.cc gcc-3.1/libjava/java/lang/reflect/natMethod.cc *** gcc-3.0.4/libjava/java/lang/reflect/natMethod.cc Mon Jan 8 23:28:56 2001 --- gcc-3.1/libjava/java/lang/reflect/natMethod.cc Fri Mar 1 13:41:16 2002 *************** *** 1,6 **** // natMethod.cc - Native code for Method class. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natMethod.cc - Native code for Method class. ! /* Copyright (C) 1998, 1999, 2000, 2001 , 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 10,19 **** #include - #if HAVE_ALLOCA_H - #include - #endif - #include #include #include --- 10,15 ---- *************** details. */ *** 38,50 **** #include #include - // FIXME: remove these - #define ObjectClass java::lang::Object::class$ - #define ClassClass java::lang::Class::class$ - #include #include // FIXME: remove these. #define BooleanClass java::lang::Boolean::class$ --- 34,46 ---- #include #include #include + #if USE_LIBFFI #include + #else + #include + #endif // FIXME: remove these. #define BooleanClass java::lang::Boolean::class$ *************** can_widen (jclass from, jclass to) *** 100,112 **** // Boolean arguments may not be widened. if (fromx == BOOLEAN && tox != BOOLEAN) return false; ! // Special-case short->char conversions. ! if (fromx == SHORT && tox == CHAR) return false; return fromx <= tox; } static inline ffi_type * get_ffi_type (jclass klass) { --- 96,109 ---- // Boolean arguments may not be widened. if (fromx == BOOLEAN && tox != BOOLEAN) return false; ! // Nothing promotes to char. ! if (tox == CHAR && fromx != CHAR) return false; return fromx <= tox; } + #ifdef USE_LIBFFI static inline ffi_type * get_ffi_type (jclass klass) { *************** get_ffi_type (jclass klass) *** 148,153 **** --- 145,151 ---- return r; } + #endif // USE_LIBFFI jobject java::lang::reflect::Method::invoke (jobject obj, jobjectArray args) *************** java::lang::reflect::Method::invoke (job *** 160,168 **** { jclass k = obj ? obj->getClass() : NULL; if (! obj) ! JvThrow (new java::lang::NullPointerException); if (! declaringClass->isAssignableFrom(k)) ! JvThrow (new java::lang::IllegalArgumentException); // FIXME: access checks. // Find the possibly overloaded method based on the runtime type --- 158,166 ---- { jclass k = obj ? obj->getClass() : NULL; if (! obj) ! throw new java::lang::NullPointerException; if (! declaringClass->isAssignableFrom(k)) ! throw new java::lang::IllegalArgumentException; // FIXME: access checks. // Find the possibly overloaded method based on the runtime type *************** java::lang::reflect::Method::getName () *** 194,207 **** void java::lang::reflect::Method::getType () { ! _Jv_GetTypesFromSignature (_Jv_FromReflectedMethod (this), declaringClass, ¶meter_types, &return_type); ! // FIXME: for now we have no way to get exception information. ! exception_types = (JArray *) JvNewObjectArray (0, &ClassClass, ! NULL); } void --- 192,218 ---- void java::lang::reflect::Method::getType () { ! _Jv_Method *method = _Jv_FromReflectedMethod (this); ! _Jv_GetTypesFromSignature (method, declaringClass, ¶meter_types, &return_type); ! int count = 0; ! if (method->throws != NULL) ! { ! while (method->throws[count] != NULL) ! ++count; ! } ! ! exception_types ! = (JArray *) JvNewObjectArray (count, ! &java::lang::Class::class$, ! NULL); ! jclass *elts = elements (exception_types); ! for (int i = 0; i < count; ++i) ! elts[i] = _Jv_FindClassFromSignature (method->throws[i]->data, ! declaringClass->getClassLoader ()); } void *************** _Jv_GetTypesFromSignature (jmethodID met *** 248,254 **** } JArray *args = (JArray *) ! JvNewObjectArray (numArgs, &ClassClass, NULL); jclass* argPtr = elements (args); for (ptr = sig->data; *ptr != '\0'; ptr++) { --- 259,265 ---- } JArray *args = (JArray *) ! JvNewObjectArray (numArgs, &java::lang::Class::class$, NULL); jclass* argPtr = elements (args); for (ptr = sig->data; *ptr != '\0'; ptr++) { *************** _Jv_CallAnyMethodA (jobject obj, *** 312,317 **** --- 323,329 ---- jvalue *args, jvalue *result) { + #ifdef USE_LIBFFI JvAssert (! is_constructor || ! obj); JvAssert (! is_constructor || return_type); *************** _Jv_CallAnyMethodA (jobject obj, *** 332,339 **** rtype = &ffi_type_void; else rtype = get_ffi_type (return_type); ! ffi_type **argtypes = (ffi_type **) alloca (param_count ! * sizeof (ffi_type *)); jclass *paramelts = elements (parameter_types); --- 344,351 ---- rtype = &ffi_type_void; else rtype = get_ffi_type (return_type); ! ffi_type **argtypes = (ffi_type **) __builtin_alloca (param_count ! * sizeof (ffi_type *)); jclass *paramelts = elements (parameter_types); *************** _Jv_CallAnyMethodA (jobject obj, *** 376,383 **** // FIXME: throw some kind of VirtualMachineError here. } ! char *p = (char *) alloca (size); ! void **values = (void **) alloca (param_count * sizeof (void *)); i = 0; if (needs_this) --- 388,395 ---- // FIXME: throw some kind of VirtualMachineError here. } ! char *p = (char *) __builtin_alloca (size); ! void **values = (void **) __builtin_alloca (param_count * sizeof (void *)); i = 0; if (needs_this) *************** _Jv_CallAnyMethodA (jobject obj, *** 411,419 **** Throwable *ex = NULL; try { ! ffi_call (&cif, (void (*)()) meth->ncode, result, values); } catch (Throwable *ex2) { --- 423,440 ---- Throwable *ex = NULL; + union + { + ffi_arg i; + jobject o; + jlong l; + jfloat f; + jdouble d; + } ffi_result; + try { ! ffi_call (&cif, (void (*)()) meth->ncode, &ffi_result, values); } catch (Throwable *ex2) { *************** _Jv_CallAnyMethodA (jobject obj, *** 424,433 **** --- 445,497 ---- ex = new InvocationTargetException (ex2); } + // Since ffi_call returns integer values promoted to a word, use + // a narrowing conversion for jbyte, jchar, etc. results. + // Note that boolean is handled either by the FFI_TYPE_SINT8 or + // FFI_TYPE_SINT32 case. if (is_constructor) result->l = obj; + else + { + switch (rtype->type) + { + case FFI_TYPE_VOID: + break; + case FFI_TYPE_SINT8: + result->b = (jbyte)ffi_result.i; + break; + case FFI_TYPE_SINT16: + result->s = (jshort)ffi_result.i; + break; + case FFI_TYPE_UINT16: + result->c = (jchar)ffi_result.i; + break; + case FFI_TYPE_SINT32: + result->i = (jint)ffi_result.i; + break; + case FFI_TYPE_SINT64: + result->j = (jlong)ffi_result.l; + break; + case FFI_TYPE_FLOAT: + result->f = (jfloat)ffi_result.f; + break; + case FFI_TYPE_DOUBLE: + result->d = (jdouble)ffi_result.d; + break; + case FFI_TYPE_POINTER: + result->l = (jobject)ffi_result.o; + break; + default: + JvFail ("Unknown ffi_call return type"); + break; + } + } return ex; + #else + throw new java::lang::UnsupportedOperationException; + return 0; + #endif // USE_LIBFFI } // This is another version of _Jv_CallAnyMethodA, but this one does *************** _Jv_CallAnyMethodA (jobject obj, *** 447,453 **** // The JDK accepts this, so we do too. } else if (parameter_types->length != args->length) ! JvThrow (new java::lang::IllegalArgumentException); int param_count = parameter_types->length; --- 511,517 ---- // The JDK accepts this, so we do too. } else if (parameter_types->length != args->length) ! throw new java::lang::IllegalArgumentException; int param_count = parameter_types->length; *************** _Jv_CallAnyMethodA (jobject obj, *** 469,475 **** if (! argelts[i] || ! k || ! can_widen (k, paramelts[i])) ! JvThrow (new java::lang::IllegalArgumentException); if (paramelts[i] == JvPrimClass (boolean)) COPY (&argvals[i], --- 533,539 ---- if (! argelts[i] || ! k || ! can_widen (k, paramelts[i])) ! throw new java::lang::IllegalArgumentException; if (paramelts[i] == JvPrimClass (boolean)) COPY (&argvals[i], *************** _Jv_CallAnyMethodA (jobject obj, *** 499,505 **** else { if (argelts[i] && ! paramelts[i]->isAssignableFrom (k)) ! JvThrow (new java::lang::IllegalArgumentException); COPY (&argvals[i], argelts[i], jobject); } } --- 563,569 ---- else { if (argelts[i] && ! paramelts[i]->isAssignableFrom (k)) ! throw new java::lang::IllegalArgumentException; COPY (&argvals[i], argelts[i], jobject); } } *************** _Jv_CallAnyMethodA (jobject obj, *** 514,520 **** &ret_value); if (ex) ! JvThrow (ex); jobject r; #define VAL(Wrapper, Field) (new Wrapper (ret_value.Field)) --- 578,584 ---- &ret_value); if (ex) ! throw ex; jobject r; #define VAL(Wrapper, Field) (new Wrapper (ret_value.Field)) diff -Nrc3pad gcc-3.0.4/libjava/java/lang/strtod.c gcc-3.1/libjava/java/lang/strtod.c *** gcc-3.0.4/libjava/java/lang/strtod.c Wed Apr 7 14:52:39 1999 --- gcc-3.1/libjava/java/lang/strtod.c Tue Oct 9 22:54:25 2001 *************** dig_done: *** 242,257 **** if (esign) e = -e; } - else - { - /* No exponent after an 'E' : that's an error. */ - ptr->_errno = EINVAL; - e = 0; - goto ret; - } } else ! s = s00; } if (!nd) { --- 242,256 ---- if (esign) e = -e; } } else ! { ! /* No exponent after an 'E' : that's an error. */ ! ptr->_errno = EINVAL; ! e = 0; ! s = s00; ! goto ret; ! } } if (!nd) { diff -Nrc3pad gcc-3.0.4/libjava/java/math/BigDecimal.java gcc-3.1/libjava/java/math/BigDecimal.java *** gcc-3.0.4/libjava/java/math/BigDecimal.java Wed Jan 10 10:26:34 2001 --- gcc-3.1/libjava/java/math/BigDecimal.java Tue Jan 22 22:40:22 2002 *************** along with GNU Classpath; see the file C *** 18,34 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.math; import java.math.BigInteger; ! public class BigDecimal extends Number implements Comparable { private BigInteger intVal; private int scale; private static final long serialVersionUID = 6108874887143696463L; --- 18,46 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.math; import java.math.BigInteger; ! public class BigDecimal extends Number implements Comparable ! { private BigInteger intVal; private int scale; private static final long serialVersionUID = 6108874887143696463L; *************** public class BigDecimal extends Number i *** 63,78 **** public BigDecimal (double num) throws NumberFormatException { ! this (Double.toString (num)); } public BigDecimal (String num) throws NumberFormatException { ! int point = num.indexOf('.'); ! this.intVal = new BigInteger (point == -1 ? num : ! num.substring (0, point) + ! num.substring (point + 1)); ! scale = num.length() - (point == -1 ? num.length () : point + 1); } public static BigDecimal valueOf (long val) --- 75,193 ---- public BigDecimal (double num) throws NumberFormatException { ! if (Double.isInfinite (num) || Double.isNaN (num)) ! throw new NumberFormatException ("invalid argument: " + num); ! // Note we can't convert NUM to a String and then use the ! // String-based constructor. The BigDecimal documentation makes ! // it clear that the two constructors work differently. ! ! final int mantissaBits = 52; ! final int exponentBits = 11; ! final long mantMask = (1L << mantissaBits) - 1; ! final long expMask = (1L << exponentBits) - 1; ! ! long bits = Double.doubleToLongBits (num); ! long mantissa = bits & mantMask; ! long exponent = (bits >>> mantissaBits) & expMask; ! boolean denormal = exponent == 0; ! // Correct the exponent for the bias. ! exponent -= denormal ? 1022 : 1023; ! // Now correct the exponent to account for the bits to the right ! // of the decimal. ! exponent -= mantissaBits; ! // Ordinary numbers have an implied leading `1' bit. ! if (! denormal) ! mantissa |= (1L << mantissaBits); ! ! // Shave off factors of 10. ! while (exponent < 0 && (mantissa & 1) == 0) ! { ! ++exponent; ! mantissa >>= 1; ! } ! ! intVal = BigInteger.valueOf (bits < 0 ? - mantissa : mantissa); ! if (exponent < 0) ! { ! // We have MANTISSA * 2 ^ (EXPONENT). ! // Since (1/2)^N == 5^N * 10^-N we can easily convert this ! // into a power of 10. ! scale = (int) (- exponent); ! BigInteger mult = BigInteger.valueOf (5).pow (scale); ! intVal = intVal.multiply (mult); ! } ! else ! { ! intVal = intVal.shiftLeft ((int) exponent); ! scale = 0; ! } } public BigDecimal (String num) throws NumberFormatException { ! int len = num.length(); ! int start = 0, point = 0; ! int dot = -1; ! boolean negative = false; ! if (num.charAt(0) == '+') ! { ! ++start; ! ++point; ! } ! else if (num.charAt(0) == '-') ! { ! ++start; ! ++point; ! negative = true; ! } ! ! while (point < len) ! { ! char c = num.charAt (point); ! if (c == '.') ! { ! if (dot >= 0) ! throw new NumberFormatException ("multiple `.'s in number"); ! dot = point; ! } ! else if (c == 'e' || c == 'E') ! break; ! else if (Character.digit (c, 10) < 0) ! throw new NumberFormatException ("unrecognized character: " + c); ! ++point; ! } ! ! String val; ! if (dot >= 0) ! { ! val = num.substring (start, dot) + num.substring (dot + 1, point); ! scale = point - 1 - dot; ! } ! else ! { ! val = num.substring (start, point); ! scale = 0; ! } ! if (val.length () == 0) ! throw new NumberFormatException ("no digits seen"); ! ! if (negative) ! val = "-" + val; ! intVal = new BigInteger (val); ! ! // Now parse exponent. ! if (point < len) ! { ! int exp = Integer.parseInt (num.substring (point + 1)); ! exp -= scale; ! if (exp > 0) ! { ! intVal = intVal.multiply (BigInteger.valueOf (10).pow (exp)); ! scale = 0; ! } ! else ! scale = - exp; ! } } public static BigDecimal valueOf (long val) *************** public class BigDecimal extends Number i *** 338,344 **** intVal.divide (BigInteger.valueOf (10).pow (scale)); } - public int intValue () { return toBigInteger ().intValue (); --- 453,458 ---- diff -Nrc3pad gcc-3.0.4/libjava/java/math/BigInteger.java gcc-3.1/libjava/java/math/BigInteger.java *** gcc-3.0.4/libjava/java/math/BigInteger.java Sat Mar 3 07:27:59 2001 --- gcc-3.1/libjava/java/math/BigInteger.java Thu Feb 14 23:16:05 2002 *************** *** 1,15 **** ! // BigInteger.java -- an arbitrary-precision integer ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.math; ! import gnu.gcj.math.*; import java.util.Random; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; --- 1,43 ---- ! /* java.math.BigInteger -- Arbitary precision integers ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.math; ! ! import gnu.java.math.MPN; import java.util.Random; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; *************** import java.io.IOException; *** 24,30 **** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998) and * "Applied Cryptography, Second Edition" by Bruce Schneier (Wiley, 1996). - * * Based primarily on IntNum.java BitOps.java by Per Bothner * (found in Kawa 1.6.62). --- 52,57 ---- *************** public class BigInteger extends Number i *** 147,164 **** if (numBits < 0) throw new IllegalArgumentException(); ! // Result is always positive so tack on an extra zero word, it will be ! // canonicalized out later if necessary. ! int nwords = numBits / 32 + 2; ! words = new int[nwords]; ! words[--nwords] = 0; ! words[--nwords] = rnd.nextInt() >>> (numBits % 32); ! while (--nwords >= 0) ! words[nwords] = rnd.nextInt(); ! BigInteger result = make(words, words.length); ! this.ival = result.ival; ! this.words = result.words; } public BigInteger(int bitLength, int certainty, Random rnd) --- 174,206 ---- if (numBits < 0) throw new IllegalArgumentException(); ! init(numBits, rnd); ! } ! private void init(int numBits, Random rnd) ! { ! int highbits = numBits & 31; ! if (highbits > 0) ! highbits = rnd.nextInt() >>> (32 - highbits); ! int nwords = numBits / 32; ! ! while (highbits == 0 && nwords > 0) ! { ! highbits = rnd.nextInt(); ! --nwords; ! } ! if (nwords == 0 && highbits >= 0) ! { ! ival = highbits; ! } ! else ! { ! ival = highbits < 0 ? nwords + 2 : nwords + 1; ! words = new int[ival]; ! words[nwords] = highbits; ! while (--nwords >= 0) ! words[nwords] = rnd.nextInt(); ! } } public BigInteger(int bitLength, int certainty, Random rnd) *************** public class BigInteger extends Number i *** 171,179 **** if (isProbablePrime(certainty)) return; ! BigInteger next = new BigInteger(bitLength, rnd); ! this.ival = next.ival; ! this.words = next.words; } } --- 213,219 ---- if (isProbablePrime(certainty)) return; ! init(bitLength, rnd); } } *************** public class BigInteger extends Number i *** 220,232 **** private static int[] byteArrayToIntArray(byte[] bytes, int sign) { // Determine number of words needed. ! int[] words = new int[(bytes.length + 3) / 4 + 1]; int nwords = words.length; - // For simplicity, tack on an extra word of sign at the front, - // it will be canonicalized out later. */ - words[--nwords] = sign; - // Create a int out of modulo 4 high order bytes. int bptr = 0; int word = sign; --- 260,268 ---- private static int[] byteArrayToIntArray(byte[] bytes, int sign) { // Determine number of words needed. ! int[] words = new int[bytes.length/4 + 1]; int nwords = words.length; // Create a int out of modulo 4 high order bytes. int bptr = 0; int word = sign; *************** public class BigInteger extends Number i *** 1402,1408 **** MPN.rshift0 (words, x.words, word_count, d_len, count); ival = d_len; if (neg) ! words[d_len-1] |= -1 << (32 - count); } } } --- 1438,1444 ---- MPN.rshift0 (words, x.words, word_count, d_len, count); ival = d_len; if (neg) ! words[d_len-1] |= -2 << (31 - count); } } } diff -Nrc3pad gcc-3.0.4/libjava/java/net/Authenticator.java gcc-3.1/libjava/java/net/Authenticator.java *** gcc-3.0.4/libjava/java/net/Authenticator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/net/Authenticator.java Tue Jan 22 22:40:23 2002 *************** *** 0 **** --- 1,280 ---- + /* Authenticator.java -- Abstract class for obtaining authentication info + Copyright (C) 1998,2000 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.net; + + /** + * Sometimes a network operation (such as hitting a password protected + * web site) will require authentication information in the form of a + * username and password. This abstract class provides a model for + * obtaining that information. + *

    + * To make use of this feature, a programmer must create a subclass of + * Authenticator that knows how to obtain the necessary info. An example + * would be a class that popped up a dialog box to prompt the user. + * After creating an instance of that subclass, the static setDefault + * method of this class is called to set up that instance as the object + * to use on subsequent calls to obtain authorization. + * + * @since 1.2 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public abstract class Authenticator + { + + /*************************************************************************/ + + /* + * Class Variables + */ + + /** + * This is the default Authenticator object to use for password requests + */ + private static Authenticator default_authenticator; + + /*************************************************************************/ + + /* + * Instance Variables + */ + + /** + * InternetAddress of the site requesting authentication + */ + private InetAddress addr; + + /** + * The port number of the site requesting authentication + */ + private int port; + + /** + * The protocol name of the site requesting authentication + */ + private String protocol; + + /** + * The prompt to display to the user when requesting authentication info + */ + private String prompt; + + /** + * The authentication scheme in use + */ + private String scheme; + + /*************************************************************************/ + + /* + * Class Methods + */ + + /** + * This method sets the default Authenticator object (an + * instance of a + * subclass of Authenticator) to use when prompting the user for + * information. Note that this method checks to see if the caller is + * allowed to set this value (the "setDefaultAuthenticator" permission) + * and throws a SecurityException if it is not. + * + * @param def_auth The new default Authenticator object to use + * + * @exception SecurityException If the caller does not have permission + * to perform this operation + */ + public static void + setDefault(Authenticator def_auth) + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new NetPermission("setDefaultAuthenticator")); + + default_authenticator = def_auth; + } + + /*************************************************************************/ + + /** + * This method is called whenever a username and password for a given + * network operation is required. First, a security check is made to see + * if the caller has the "requestPasswordAuthentication" + * permission. If not, the method thows an exception. If there is no + * default Authenticator object, the method then returns + * null. Otherwise, the default authenticators's instance + * variables are initialized and it's getPasswordAuthentication + * method is called to get the actual authentication information to return. + * + * @param addr The address requesting authentication + * @param port The port requesting authentication + * @param protocol The protocol requesting authentication + * @param prompt The prompt to display to the user when requesting + authentication info + * @param scheme The authentication scheme in use + * + * @return A PasswordAuthentication object with the user's + * authentication info. + * + * @exception SecurityException If the caller does not have permission to + * perform this operation + */ + public static PasswordAuthentication + requestPasswordAuthentication(InetAddress addr, int port, String protocol, + String prompt, String scheme) + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new NetPermission("requestPasswordAuthentication")); + + if (default_authenticator == null) + return(null); + + default_authenticator.addr = addr; + default_authenticator.port = port; + default_authenticator.protocol = protocol; + default_authenticator.prompt = prompt; + default_authenticator.scheme = scheme; + + return(default_authenticator.getPasswordAuthentication()); + } + + /*************************************************************************/ + + /* + * Constructors + */ + + /** + * Default, no-argument constructor for subclasses to call. + */ + public + Authenticator() + { + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * This method returns the address of the site that is requesting + * authentication. + * + * @return The requesting site + */ + protected final InetAddress + getRequestingSite() + { + return(addr); + } + + /*************************************************************************/ + + /** + * This method returns the port of the site that is requesting + * authentication. + * + * @return The requesting port + */ + protected final int + getRequestingPort() + { + return(port); + } + + /*************************************************************************/ + + /** + * This method returns the requesting protocol of the operation that is + * requesting authentication + * + * @return The requesting protocol + */ + protected final String + getRequestingProtocol() + { + return(protocol); + } + + /*************************************************************************/ + + /** + * Returns the prompt that should be used when requesting authentication + * information from the user + * + * @return The user prompt + */ + protected final String + getRequestingPrompt() + { + return(prompt); + } + + /*************************************************************************/ + + /** + * This method returns the authentication scheme in use + * + * @return The authentication scheme + */ + protected final String + getRequestingScheme() + { + return(scheme); + } + + /*************************************************************************/ + + /** + * This method is called whenever a request for authentication is made. It + * can call the other getXXX methods to determine the information relevant + * to this request. Subclasses should override this method, which returns + * null by default. + * + * @return The PasswordAuthentication information + */ + protected PasswordAuthentication + getPasswordAuthentication() + { + return(null); + } + + } // class Authenticator + diff -Nrc3pad gcc-3.0.4/libjava/java/net/BindException.java gcc-3.1/libjava/java/net/BindException.java *** gcc-3.0.4/libjava/java/net/BindException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/BindException.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // BindException.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,41 ---- ! /* BindException.java -- An exception occurred while binding to a socket ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,35 **** * Status: Believed complete and correct. */ public class BindException extends SocketException { - public BindException() - { - super(); - } ! public BindException(String msg) ! { ! super(msg); ! } } --- 43,86 ---- * Status: Believed complete and correct. */ + /** + * This exception indicates that an error occurred while attempting to bind + * socket to a particular port. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date March 5, 1999. + */ public class BindException extends SocketException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of BindException without ! * a descriptive error message. ! */ ! public ! BindException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of BindException with ! * a descriptive error message, such as the text from strerror(3). ! * ! * @param message A message describing the error that occurred. ! */ ! public ! BindException(String message) ! { ! super(message); } + + } // class BindException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/ConnectException.java gcc-3.1/libjava/java/net/ConnectException.java *** gcc-3.0.4/libjava/java/net/ConnectException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/ConnectException.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // ConnectException.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,42 ---- ! /* ConnectException.java -- An exception occurred while connecting to a host ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,35 **** * Status: Believed complete and correct. */ public class ConnectException extends SocketException { - public ConnectException() - { - super(); - } ! public ConnectException(String msg) ! { ! super(msg); ! } } --- 44,88 ---- * Status: Believed complete and correct. */ + /** + * This exception indicates that an error occurred while attempting to + * connect to a remote host. Often this indicates that the remote host + * refused the connection (ie, is not listening on the target socket). + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date March 5, 1999. + */ public class ConnectException extends SocketException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of ConnectException without ! * a descriptive error message. ! */ ! public ! ConnectException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of ConnectException with ! * a descriptive error message, such as the text from strerror(3). ! * ! * @param message A message describing the error that occurred. ! */ ! public ! ConnectException(String message) ! { ! super(message); } + + } // class ConnectException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/ContentHandler.java gcc-3.1/libjava/java/net/ContentHandler.java *** gcc-3.0.4/libjava/java/net/ContentHandler.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/ContentHandler.java Tue Jan 22 22:40:23 2002 *************** *** 1,29 **** ! // ContentHandler.java - Superclass of classes that read from a URLConnection. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.net; import java.io.IOException; /** - * @author Warren Levy - * @date March 5, 1999. - */ - - /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ public abstract class ContentHandler { ! public abstract Object getContent(URLConnection urlc) throws IOException; ! } --- 1,91 ---- ! /* ContentHandler.java -- Abstract class for handling content from URL's ! Copyright (C) 1998, 1999 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; import java.io.IOException; /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ + /** + * This is an abstract class that is the superclass for classes that read + * objects from URL's. Calling the getContent() method in the + * URL class or the URLConnection class will cause + * an instance of a subclass of ContentHandler to be created for + * the MIME type of the object being downloaded from the URL. Thus, this + * class is seldom needed by applications/applets directly, but only + * indirectly through methods in other classes. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + */ public abstract class ContentHandler { ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * Default, no-argument constructor. ! */ ! public ContentHandler() { } ! ! /*************************************************************************/ ! ! /** ! * This method reads from the InputStream of the passed in URL ! * connection and uses the data downloaded to create an Object ! * represening the content. For example, if the URL is pointing to a GIF ! * file, this method might return an Image object. This method ! * must be implemented by subclasses. ! * ! * @param urlc A URLConnection object to read data from. ! * ! * @return An object representing the data read ! * ! * @exception IOException If an error occurs ! */ ! public abstract Object getContent(URLConnection urlc) throws IOException; ! ! } // class ContentHandler diff -Nrc3pad gcc-3.0.4/libjava/java/net/ContentHandlerFactory.java gcc-3.1/libjava/java/net/ContentHandlerFactory.java *** gcc-3.0.4/libjava/java/net/ContentHandlerFactory.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/ContentHandlerFactory.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // ContentHandlerFactory.java - Abstract Content Handler factory. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,42 ---- ! /* ContentHandlerFactory.java -- Interface for creating content handlers ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,27 **** * Status: Believed complete and correct. */ ! public abstract interface ContentHandlerFactory { ! public ContentHandler createContentHandler(String mimetype); ! } --- 44,69 ---- * Status: Believed complete and correct. */ ! /** ! * This interface maps MIME types to ContentHandler objects. It consists ! * of one method that, when passed a MIME type, returns a handler for that ! * type. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ ! public interface ContentHandlerFactory { ! /** ! * This method is passed a MIME type as a string and is responsible for ! * returning the appropriate ContentType object. ! * ! * @param mime_type The MIME type to map to a ContentHandler ! * ! * @return The ContentHandler for the passed in MIME type ! */ ! ContentHandler ! createContentHandler(String mime_type); ! ! } // interface ContentHandlerFactory ! diff -Nrc3pad gcc-3.0.4/libjava/java/net/DatagramPacket.java gcc-3.1/libjava/java/net/DatagramPacket.java *** gcc-3.0.4/libjava/java/net/DatagramPacket.java Thu May 4 15:50:34 2000 --- gcc-3.1/libjava/java/net/DatagramPacket.java Tue Jan 22 22:40:23 2002 *************** *** 1,35 **** ! // DatagramPacket.java - Represents packets in a connectionless protocol. ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date April 28, 1999. ! */ ! /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ public final class DatagramPacket { private byte[] buffer; private int offset; private int length; private InetAddress address; private int port; ! // JDK1.2 public DatagramPacket(byte[] buf, int offset, int length) { if (buf == null) --- 1,110 ---- ! /* DatagramPacket.java -- Class to model a packet to be sent via UDP ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.net; ! ! /* * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ + /** + * This class models a packet of data that is to be sent across the network + * using a connectionless protocol such as UDP. It contains the data + * to be send, as well as the destination address and port. Note that + * datagram packets can arrive in any order and are not guaranteed to be + * delivered at all. + *

    + * This class can also be used for receiving data from the network. + *

    + * Note that for all method below where the buffer length passed by the + * caller cannot exceed the actually length of the byte array passed as + * the buffer, if this condition is not true, then the method silently + * reduces the length value to maximum allowable value. + * + * Written using on-line Java Platform 1.2 API Specification, as well + * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). + * Status: Believed complete and correct. + * + * @author Warren Levy + * @author Aarom M. Renn (arenn@urbanophile.com) (Documentation comments) + * @date April 28, 1999. + */ + public final class DatagramPacket { + /** + * The data buffer to send + */ private byte[] buffer; + + /** + * This is the offset into the buffer to start sending from or receiving to. + */ private int offset; + + /** + * The length of the data buffer to send + */ private int length; + + /** + * The address to which the packet should be sent or from which it + * was received + */ private InetAddress address; + + /** + * The port to which the packet should be sent or from which it was + * was received. + */ private int port; ! /** ! * This method initializes a new instance of DatagramPacket ! * which has the specified buffer, offset, and length. ! * ! * @param buf The buffer for holding the incoming datagram. ! * @param offset The offset into the buffer to start writing. ! * @param length The maximum number of bytes to read. ! * ! * @since Java 1.2 ! */ public DatagramPacket(byte[] buf, int offset, int length) { if (buf == null) *************** public final class DatagramPacket *** 49,60 **** this.port = -1; } public DatagramPacket(byte[] buf, int length) { this(buf, 0, length); } ! // JDK1.2 public DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) { --- 124,153 ---- this.port = -1; } + /** + * Initializes a new instance of DatagramPacket for + * receiving packets from the network. + * + * @param buf A buffer for storing the returned packet data + * @param length The length of the buffer (must be <= buf.length) + */ public DatagramPacket(byte[] buf, int length) { this(buf, 0, length); } ! /** ! * Initializes a new instance of DatagramPacket for ! * transmitting packets across the network. ! * ! * @param buf A buffer containing the data to send ! * @param offset The offset into the buffer to start writing from. ! * @param len The length of the buffer (must be <= buf.length) ! * @param addr The address to send to ! * @param port The port to send to ! * ! * @since Java 1.2 ! */ public DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) { *************** public final class DatagramPacket *** 79,115 **** this.port = port; } public DatagramPacket(byte[] buf, int length, InetAddress address, int port) { this(buf, 0, length, address, port); } public synchronized InetAddress getAddress() { return address; } public synchronized int getPort() { return port; } public synchronized byte[] getData() { return buffer; } ! // JDK1.2 public synchronized int getOffset() { return offset; } public synchronized int getLength() { return length; } public synchronized void setAddress(InetAddress iaddr) { if (iaddr == null) --- 172,257 ---- this.port = port; } + /** + * Initializes a new instance of DatagramPacket for + * transmitting packets across the network. + * + * @param buf A buffer containing the data to send + * @param length The length of the buffer (must be <= buf.length) + * @param address The address to send to + * @param port The port to send to + */ public DatagramPacket(byte[] buf, int length, InetAddress address, int port) { this(buf, 0, length, address, port); } + /** + * Returns the address that this packet is being sent to or, if it was used + * to receive a packet, the address that is was received from. If the + * constructor that doesn not take an address was used to create this object + * and no packet was actually read into this object, then this method + * returns null. + * + * @return The address for this packet. + */ public synchronized InetAddress getAddress() { return address; } + /** + * Returns the port number this packet is being sent to or, if it was used + * to receive a packet, the port that it was received from. If the + * constructor that doesn not take an address was used to create this object + * and no packet was actually read into this object, then this method + * will return 0. + * + * @return The port number for this packet + */ public synchronized int getPort() { return port; } + /** + * Returns the data buffer for this packet + * + * @return This packet's data buffer + */ public synchronized byte[] getData() { return buffer; } ! /** ! * This method returns the current offset value into the data buffer ! * where data will be sent from. ! * ! * @return The buffer offset. ! * ! * @since Java 1.2 ! */ public synchronized int getOffset() { return offset; } + /** + * Returns the length of the data in the buffer + * + * @return The length of the data + */ public synchronized int getLength() { return length; } + /** + * This sets the address to which the data packet will be transmitted. + * + * @param addr The destination address + */ public synchronized void setAddress(InetAddress iaddr) { if (iaddr == null) *************** public final class DatagramPacket *** 118,123 **** --- 260,270 ---- address = iaddr; } + /** + * This sets the port to which the data packet will be transmitted. + * + * @param port The destination port + */ public synchronized void setPort(int iport) { if (iport < 0 || iport > 65535) *************** public final class DatagramPacket *** 126,131 **** --- 273,283 ---- port = iport; } + /** + * Sets the data buffer for this packet. + * + * @param buf The new buffer for this packet + */ public synchronized void setData(byte[] buf) { // This form of setData requires setLength to be called separately *************** public final class DatagramPacket *** 136,142 **** buffer = buf; } ! // JDK1.2 public synchronized void setData(byte[] buf, int offset, int length) { // This form of setData must be used if offset is to be changed. --- 288,302 ---- buffer = buf; } ! /** ! * This method sets the data buffer for the packet. ! * ! * @param buf The byte array containing the data for this packet. ! * @param offset The offset into the buffer to start reading data from. ! * @param length The number of bytes of data in the buffer. ! * ! * @since Java 1.2 ! */ public synchronized void setData(byte[] buf, int offset, int length) { // This form of setData must be used if offset is to be changed. *************** public final class DatagramPacket *** 156,161 **** --- 316,326 ---- this.length = length; } + /** + * Sets the length of the data in the buffer. + * + * @param length The new length. (Where len <= buf.length) + */ public synchronized void setLength(int length) { if (length < 0) *************** public final class DatagramPacket *** 166,169 **** this.length = length; } ! } --- 331,335 ---- this.length = length; } ! } // class DatagramPacket ! diff -Nrc3pad gcc-3.0.4/libjava/java/net/DatagramSocket.java gcc-3.1/libjava/java/net/DatagramSocket.java *** gcc-3.0.4/libjava/java/net/DatagramSocket.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/DatagramSocket.java Sun Jan 13 11:59:37 2002 *************** public class DatagramSocket *** 28,39 **** public DatagramSocket() throws SocketException { ! this(0, ServerSocket.ANY_IF); } public DatagramSocket(int port) throws SocketException { ! this(port, ServerSocket.ANY_IF); } public DatagramSocket(int port, InetAddress laddr) throws SocketException --- 28,39 ---- public DatagramSocket() throws SocketException { ! this(0, null); } public DatagramSocket(int port) throws SocketException { ! this(port, null); } public DatagramSocket(int port, InetAddress laddr) throws SocketException *************** public class DatagramSocket *** 66,72 **** if (this instanceof MulticastSocket) impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true)); ! impl.bind(port, laddr == null ? ServerSocket.ANY_IF : laddr); } public void close() --- 66,72 ---- if (this instanceof MulticastSocket) impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true)); ! impl.bind(port, laddr == null ? InetAddress.ANY_IF : laddr); } public void close() *************** public class DatagramSocket *** 180,202 **** // { // } ! // JDK1.2 ! // public int getReceiveBufferSize() throws SocketException ! // { ! // } ! // JDK1.2 ! // public int getSendBufferSize() throws SocketException ! // { ! // } ! // JDK1.2 ! // public void setReceiveBufferSize(int size) throws SocketException ! // { ! // } ! // JDK1.2 ! // public void setSendBufferSize(int size) throws SocketException ! // { ! // } } --- 180,262 ---- // { // } ! /** ! * This method returns the value of the system level socket option ! * SO_RCVBUF, which is used by the operating system to tune buffer ! * sizes for data transfers. ! * ! * @return The receive buffer size. ! * ! * @exception SocketException If an error occurs. ! * ! * @since 1.2 ! */ ! public int getReceiveBufferSize() throws SocketException ! { ! Object obj = impl.getOption(SocketOptions.SO_RCVBUF); ! ! if (obj instanceof Integer) ! return(((Integer)obj).intValue()); ! else ! throw new SocketException("Unexpected type"); ! } ! /** ! * This method returns the value of the system level socket option ! * SO_SNDBUF, which is used by the operating system to tune buffer ! * sizes for data transfers. ! * ! * @return The send buffer size. ! * ! * @exception SocketException If an error occurs. ! * ! * @since 1.2 ! */ ! public int getSendBufferSize() throws SocketException ! { ! Object obj = impl.getOption(SocketOptions.SO_SNDBUF); ! if (obj instanceof Integer) ! return(((Integer)obj).intValue()); ! else ! throw new SocketException("Unexpected type"); ! } ! /** ! * This method sets the value for the system level socket option ! * SO_RCVBUF to the specified value. Note that valid values for this ! * option are specific to a given operating system. ! * ! * @param size The new receive buffer size. ! * ! * @exception SocketException If an error occurs. ! * ! * @since 1.2 ! */ ! public void setReceiveBufferSize(int size) throws SocketException ! { ! if (size < 0) ! throw new IllegalArgumentException("Buffer size is less than 0"); ! ! impl.setOption(SocketOptions.SO_RCVBUF, new Integer(size)); ! } ! ! /** ! * This method sets the value for the system level socket option ! * SO_SNDBUF to the specified value. Note that valid values for this ! * option are specific to a given operating system. ! * ! * @param size The new send buffer size. ! * ! * @exception SocketException If an error occurs. ! * ! * @since 1.2 ! */ ! public void setSendBufferSize(int size) throws SocketException ! { ! if (size < 0) ! throw new IllegalArgumentException("Buffer size is less than 0"); ! ! impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size)); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/net/DatagramSocketImpl.java gcc-3.1/libjava/java/net/DatagramSocketImpl.java *** gcc-3.0.4/libjava/java/net/DatagramSocketImpl.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/DatagramSocketImpl.java Thu Feb 14 23:16:06 2002 *************** *** 1,62 **** ! // DatagramSocketImpl.java - Abstract datagram socket implementation. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.net; import java.io.IOException; import java.io.FileDescriptor; /** - * @author Warren Levy - * @date May 3, 1999. - */ - - /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ - public abstract class DatagramSocketImpl implements SocketOptions { protected int localPort; protected FileDescriptor fd; public DatagramSocketImpl() { } protected abstract void bind(int lport, InetAddress laddr) ! throws SocketException; protected abstract void close(); protected abstract void create() throws SocketException; protected abstract int peek(InetAddress i) throws IOException; protected abstract void send(DatagramPacket p) throws IOException; protected abstract void receive(DatagramPacket p) throws IOException; protected abstract void setTTL(byte ttl) throws IOException; protected abstract byte getTTL() throws IOException; protected abstract void setTimeToLive(int ttl) throws IOException; protected abstract int getTimeToLive() throws IOException; protected abstract void join(InetAddress inetaddr) throws IOException; - protected abstract void leave(InetAddress inetaddr) throws IOException; ! public abstract Object getOption(int optID) throws SocketException; ! public abstract void setOption(int optID, Object value) ! throws SocketException; protected FileDescriptor getFileDescriptor() { return fd; } protected int getLocalPort() { return localPort; } } --- 1,236 ---- ! /* DatagramSocketImpl.java -- Abstract class for UDP socket implementations ! Copyright (C) 1998, 1999 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; + import java.io.IOException; import java.io.FileDescriptor; /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. + * + *

    This abstract class models a datagram socket implementation. An + * actual implementation class would implement these methods, probably + * via redirecting them to native code. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy */ public abstract class DatagramSocketImpl implements SocketOptions { + + /** + * The local port to which this socket is bound + */ protected int localPort; + + /** + * The FileDescriptor object for this object. + */ protected FileDescriptor fd; + /** + * Default, no-argument constructor for subclasses to call. + */ public DatagramSocketImpl() { } + /** + * This method binds the socket to the specified local port and address. + * + * @param lport The port number to bind to + * @param laddr The address to bind to + * + * @exception SocketException If an error occurs + */ protected abstract void bind(int lport, InetAddress laddr) ! throws SocketException; ! ! /** ! * This methods closes the socket ! */ protected abstract void close(); + + /** + * Creates a new datagram socket. + * + * @exception SocketException If an error occurs + */ protected abstract void create() throws SocketException; + + /** + * Takes a peek at the next packet received in order to retrieve the + * address of the sender + * + * @param i The InetAddress to fill in with the information about the + * sender if the next packet + * + * @return The port number of the sender of the packet + * + * @exception IOException If an error occurs + */ protected abstract int peek(InetAddress i) throws IOException; + + /** + * Transmits the specified packet of data to the network. The destination + * host and port should be encoded in the packet. + * + * @param p The packet to send + * + * @exception IOException If an error occurs + */ protected abstract void send(DatagramPacket p) throws IOException; + + /** + * Receives a packet of data from the network Will block until a packet + * arrives. The packet info in populated into the passed in + * DatagramPacket object. + * + * @param p A place to store the incoming packet. + * + * @exception IOException If an error occurs + */ protected abstract void receive(DatagramPacket p) throws IOException; + + /** + * Sets the Time to Live (TTL) setting on this socket to the specified + * value. Use setTimeToLive(int) instead. + * + * @param ttl The new Time to Live value + * + * @exception IOException If an error occurs + * @deprecated + */ protected abstract void setTTL(byte ttl) throws IOException; + + /** + * This method returns the current Time to Live (TTL) setting on this + * socket. Use getTimeToLive() instead. + * + * @exception IOException If an error occurs + * @deprecated + */ protected abstract byte getTTL() throws IOException; + + /** + * Sets the Time to Live (TTL) setting on this socket to the specified + * value. + * + * @param ttl The new Time to Live value + * + * @exception IOException If an error occurs + */ protected abstract void setTimeToLive(int ttl) throws IOException; + + /** + * This method returns the current Time to Live (TTL) setting on this + * socket. + * + * @exception IOException If an error occurs + */ protected abstract int getTimeToLive() throws IOException; + + /** + * Causes this socket to join the specified multicast group + * + * @param inetaddr The multicast address to join with + * + * @exception IOException If an error occurs + */ protected abstract void join(InetAddress inetaddr) throws IOException; ! /** ! * Causes the socket to leave the specified multicast group. ! * ! * @param inetaddr The multicast address to leave ! * ! * @exception IOException If an error occurs ! */ ! protected abstract void leave(InetAddress inetaddr) throws IOException; + /** + * Returns the FileDescriptor for this socket + */ protected FileDescriptor getFileDescriptor() { return fd; } + /** + * Returns the local port this socket is bound to + */ protected int getLocalPort() { return localPort; } + + /** + * Sets the specified option on a socket to the passed in object. For + * options that take an integer argument, the passed in object is an + * Integer. For options that are set to on or off, the + * value passed will be a Boolean. The option_id + * parameter is one of the defined constants in the superinterface. + * + * @param option_id The identifier of the option + * @param val The value to set the option to + * + * @exception SocketException If an error occurs + * @XXX This redeclaration from SocketOptions is a workaround to a gcj bug. + */ + public abstract void setOption(int option_id, Object val) + throws SocketException; + + /** + * Returns the current setting of the specified option. The + * Object returned will be an Integer for options + * that have integer values. For options that are set to on or off, a + * Boolean will be returned. The option_id + * is one of the defined constants in the superinterface. + * + * @param option_id The option identifier + * + * @return The current value of the option + * + * @exception SocketException If an error occurs + * @XXX This redeclaration from SocketOptions is a workaround to a gcj bug. + */ + public abstract Object getOption(int option_id) throws SocketException; } diff -Nrc3pad gcc-3.0.4/libjava/java/net/FileNameMap.java gcc-3.1/libjava/java/net/FileNameMap.java *** gcc-3.0.4/libjava/java/net/FileNameMap.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/FileNameMap.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // FileNameMap.java - Abstract interface to map from a File Name to MIME type. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,42 ---- ! /* FileNameMap.java -- Maps filenames to MIME types ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,27 **** * Status: Believed complete and correct. */ ! public abstract interface FileNameMap { ! public String getContentTypeFor(String fileName); ! } --- 44,68 ---- * Status: Believed complete and correct. */ ! /** ! * This interface has one method which, when passed a filename, returns ! * the MIME type associated with that filename. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ ! public interface FileNameMap { ! /** ! * This method is passed a filename and is responsible for determining ! * the appropriate MIME type for that file. ! * ! * @param filename The name of the file to generate a MIME type for. ! * ! * @return The MIME type for the filename passed in. ! */ ! String ! getContentTypeFor(String filename); ! ! } // interface FileNameMap ! diff -Nrc3pad gcc-3.0.4/libjava/java/net/InetAddress.java gcc-3.1/libjava/java/net/InetAddress.java *** gcc-3.0.4/libjava/java/net/InetAddress.java Fri Nov 3 07:43:06 2000 --- gcc-3.1/libjava/java/net/InetAddress.java Sat Jan 12 10:11:13 2002 *************** public final class InetAddress implement *** 240,245 **** --- 240,249 ---- return lookup(host, null, true); } + static final byte[] zeros = {0,0,0,0}; + /* dummy InetAddress, used to bind socket to any (all) network interfaces */ + static final InetAddress ANY_IF = new InetAddress(zeros, null); + private static final byte[] localhostAddress = { 127, 0, 0, 1 }; private static native String getLocalHostname (); diff -Nrc3pad gcc-3.0.4/libjava/java/net/MalformedURLException.java gcc-3.1/libjava/java/net/MalformedURLException.java *** gcc-3.0.4/libjava/java/net/MalformedURLException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/MalformedURLException.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // MalformedURLException.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,41 ---- ! /* MalformedURLException.java -- A URL was not in a valid format ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,35 **** * Status: Believed complete and correct. */ public class MalformedURLException extends java.io.IOException { - public MalformedURLException() - { - super(); - } ! public MalformedURLException(String msg) ! { ! super(msg); ! } } --- 43,86 ---- * Status: Believed complete and correct. */ + /** + * This exception indicates that a URL passed to an object was not in a + * valid format. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date March 5, 1999. + */ public class MalformedURLException extends java.io.IOException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of MalformedURLException without ! * a descriptive error message. ! */ ! public ! MalformedURLException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of MalformedURLException without ! * a descriptive error message. ! * ! * @param message A message describing the error that occurred. ! */ ! public ! MalformedURLException(String message) ! { ! super(message); } + + } // class MalformedURLException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/MulticastSocket.java gcc-3.1/libjava/java/net/MulticastSocket.java *** gcc-3.0.4/libjava/java/net/MulticastSocket.java Thu May 4 15:50:34 2000 --- gcc-3.1/libjava/java/net/MulticastSocket.java Tue Jan 22 22:40:23 2002 *************** *** 1,50 **** ! // MulticastSocket.java ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.net; - import java.io.IOException; ! /** ! * @author Warren Levy ! * @date May 18, 1999. ! */ ! /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ public class MulticastSocket extends DatagramSocket { // FIXME: the local addr bound to the multicast socket can be reused; // unlike unicast sockets. It binds to any available network interface. // See p.1159 JCL book. public MulticastSocket() throws IOException { ! super(0, ServerSocket.ANY_IF); } public MulticastSocket(int port) throws IOException { ! super(port, ServerSocket.ANY_IF); } public InetAddress getInterface() throws SocketException { // FIXME: Is it possible that an InetAddress wasn't returned from getOption? return (InetAddress) impl.getOption(SocketOptions.IP_MULTICAST_IF); } ! // Deprecated in JDK1.2 public byte getTTL() throws IOException { // Use getTTL here rather than getTimeToLive in case we're using an impl --- 1,119 ---- ! /* MulticastSocket.java -- Class for using multicast sockets ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; ! import java.io.IOException; ! /* * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ + /** + * This class models a multicast UDP socket. A multicast address is a + * class D internet address (one whose most significant bits are 1110). + * A multicast group consists of a multicast address and a well known + * port number. All members of the group listening on that address and + * port will receive all the broadcasts to the group. + *

    + * Please note that applets are not allowed to use multicast sockets + * + * Written using on-line Java Platform 1.2 API Specification, as well + * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). + * Status: Believed complete and correct. + * + * @author Warren Levy + * @author Aaron M. Renn (arenn@urbanophile.com) (Documentation comments) + * @date May 18, 1999. + */ public class MulticastSocket extends DatagramSocket { // FIXME: the local addr bound to the multicast socket can be reused; // unlike unicast sockets. It binds to any available network interface. // See p.1159 JCL book. + /** + * Create a MulticastSocket that this not bound to any address + * + * @exception IOException If an error occurs + */ public MulticastSocket() throws IOException { ! super(0, null); } + /** + * Create a multicast socket bound to the specified port + * + * @param The port to bind to + * + * @exception IOException If an error occurs + */ public MulticastSocket(int port) throws IOException { ! super(port, null); } + /** + * Returns the interface being used for multicast packets + * + * @return The multicast interface + * + * @exception SocketException If an error occurs + */ public InetAddress getInterface() throws SocketException { // FIXME: Is it possible that an InetAddress wasn't returned from getOption? return (InetAddress) impl.getOption(SocketOptions.IP_MULTICAST_IF); } ! /** ! * Returns the current value of the "Time to Live" option. This is the ! * number of hops a packet can make before it "expires". This method id ! * deprecated. Use getTimeToLive instead. ! * ! * @return The TTL value ! * ! * @exception IOException If an error occurs ! * ! * @deprecated Replaced by getTimeToLive() in Java 1.2 ! */ public byte getTTL() throws IOException { // Use getTTL here rather than getTimeToLive in case we're using an impl *************** public class MulticastSocket extends Dat *** 53,70 **** return impl.getTTL(); } ! // JDK1.2 public int getTimeToLive() throws IOException { return impl.getTimeToLive(); } public void setInterface(InetAddress inf) throws SocketException { impl.setOption(SocketOptions.IP_MULTICAST_IF, inf); } ! // Deprecated in JDK1.2 public void setTTL(byte ttl) throws IOException { // Use setTTL here rather than setTimeToLive in case we're using an impl --- 122,164 ---- return impl.getTTL(); } ! /** ! * Returns the current value of the "Time to Live" option. This is the ! * number of hops a packet can make before it "expires". ! * ! * @return The TTL value ! * ! * @exception IOException If an error occurs ! * ! * @since Java 1.2 ! */ public int getTimeToLive() throws IOException { return impl.getTimeToLive(); } + /** + * Sets the interface to use for multicast packets. + * + * @param addr The new interface to use + * + * @exception SocketException If an error occurs + */ public void setInterface(InetAddress inf) throws SocketException { impl.setOption(SocketOptions.IP_MULTICAST_IF, inf); } ! /** ! * Sets the "Time to Live" value for a socket. The value must be between ! * 1 and 255. ! * ! * @param ttl The new TTL value ! * ! * @exception IOException If an error occurs ! * ! * @deprecated Replaced by setTimeToLive in Java 1.2 ! */ public void setTTL(byte ttl) throws IOException { // Use setTTL here rather than setTimeToLive in case we're using an impl *************** public class MulticastSocket extends Dat *** 73,79 **** impl.setTTL(ttl); } ! // JDK1.2 public void setTimeToLive(int ttl) throws IOException { if (ttl <= 0 || ttl > 255) --- 167,182 ---- impl.setTTL(ttl); } ! /** ! * Sets the "Time to Live" value for a socket. The value must be between ! * 1 and 255. ! * ! * @param ttl The new TTL value ! * ! * @exception IOException If an error occurs ! * ! * @since Java 1.2 ! */ public void setTimeToLive(int ttl) throws IOException { if (ttl <= 0 || ttl > 255) *************** public class MulticastSocket extends Dat *** 82,87 **** --- 185,197 ---- impl.setTimeToLive(ttl); } + /** + * Joins the specified mulitcast group. + * + * @param addr The address of the group to join + * + * @exception IOException If an error occurs + */ public void joinGroup(InetAddress mcastaddr) throws IOException { if (! mcastaddr.isMulticastAddress()) *************** public class MulticastSocket extends Dat *** 94,99 **** --- 204,216 ---- impl.join(mcastaddr); } + /** + * Leaves the specified multicast group + * + * @param addr The address of the group to leave + * + * @exception IOException If an error occurs + */ public void leaveGroup(InetAddress mcastaddr) throws IOException { if (! mcastaddr.isMulticastAddress()) *************** public class MulticastSocket extends Dat *** 106,111 **** --- 223,238 ---- impl.leave(mcastaddr); } + /** + * Sends a packet of data to a multicast address with a TTL that is + * different from the default TTL on this socket. The default TTL for + * the socket is not changed. + * + * @param packet The packet of data to send + * @param ttl The TTL for this packet + * + * @exception IOException If an error occurs + */ public synchronized void send(DatagramPacket p, byte ttl) throws IOException { SecurityManager s = System.getSecurityManager(); *************** public class MulticastSocket extends Dat *** 123,126 **** impl.send(p); impl.setTimeToLive(oldttl); } ! } --- 250,253 ---- impl.send(p); impl.setTimeToLive(oldttl); } ! } // class MulticastSocket diff -Nrc3pad gcc-3.0.4/libjava/java/net/NetPermission.java gcc-3.1/libjava/java/net/NetPermission.java *** gcc-3.0.4/libjava/java/net/NetPermission.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/net/NetPermission.java Tue Jan 22 22:40:23 2002 *************** *** 0 **** --- 1,76 ---- + /* NetPermission.java -- A class for basic miscellaneous network permission + Copyright (C) 1998, 2000 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.net; + + import java.security.BasicPermission; + + /** + * This class is used to model miscellaneous network permissions. It is + * a subclass of BasicPermission. This means that it models a "boolean" + * permission. One that you either have or do not have. Thus there is + * no permitted action list associated with this object. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public final class NetPermission extends BasicPermission + implements java.io.Serializable + { + /** + * Initializes a new instance of NetPermission with the + * specified name. + * + * @param name The name of this permission. + */ + public NetPermission(String name) + { + super(name); + } + + /** + * Initializes a new instance of NetPermission with the + * specified name and value. Note that the value field is irrelevant and is + * ignored. This constructor should never need to be used. + * + * @param name The name of this permission + * @param perms The permitted actions of this permission (ignored) + */ + public NetPermission(String name, String perms) + { + super(name); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/net/NoRouteToHostException.java gcc-3.1/libjava/java/net/NoRouteToHostException.java *** gcc-3.0.4/libjava/java/net/NoRouteToHostException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/NoRouteToHostException.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // NoRouteToHostException.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,42 ---- ! /* NoRouteToHostException.java -- Cannot connect to a host ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,35 **** * Status: Believed complete and correct. */ public class NoRouteToHostException extends SocketException { - public NoRouteToHostException() - { - super(); - } ! public NoRouteToHostException(String msg) ! { ! super(msg); ! } } --- 44,87 ---- * Status: Believed complete and correct. */ + /** + * This exception indicates that there is no TCP/IP route to the requested + * host. This is often due to a misconfigured routing table. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date March 5, 1999. + */ public class NoRouteToHostException extends SocketException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes an instance of NoRouteToHostException ! * without a descriptive error message. ! */ ! public ! NoRouteToHostException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes an instance of NoRouteToHostException ! * witha descriptive error message, such as the text from strerror(3). ! * ! * @param message A message describing the error that occurred. ! */ ! public ! NoRouteToHostException(String message) ! { ! super(message); } + + } // class NoRouteToHostException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/PasswordAuthentication.java gcc-3.1/libjava/java/net/PasswordAuthentication.java *** gcc-3.0.4/libjava/java/net/PasswordAuthentication.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/net/PasswordAuthentication.java Tue Jan 22 22:40:23 2002 *************** *** 0 **** --- 1,115 ---- + /* PasswordAuthentication.java -- Container class for username/password pairs + Copyright (C) 1998,2000 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.net; + + /** + * This class serves a container for username/password pairs. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public final class PasswordAuthentication + { + + /*************************************************************************/ + + /* + * Instance Variables + */ + + /** + * The username + */ + private String username; + + /** + * The password + */ + private char[] password; + + /*************************************************************************/ + + /* + * Constructors + */ + + /** + * Creates a new PasswordAuthentication object from the specified username + * and password. + * + * @param username The username for this object + * @param password The password for this object + */ + public + PasswordAuthentication(String username, char[] password) + { + this.username = username; + this.password = password; + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * Returns the username associated with this object + * + * @return The username + */ + public String + getUserName() + { + return(username); + } + + /*************************************************************************/ + + /** + * Returns the password associated with this object + * + * @return The password + */ + public char[] + getPassword() + { + return(password); + } + + } // class PasswordAuthentication + diff -Nrc3pad gcc-3.0.4/libjava/java/net/PlainDatagramSocketImpl.java gcc-3.1/libjava/java/net/PlainDatagramSocketImpl.java *** gcc-3.0.4/libjava/java/net/PlainDatagramSocketImpl.java Fri Dec 8 10:28:32 2000 --- gcc-3.1/libjava/java/net/PlainDatagramSocketImpl.java Thu Mar 28 02:36:51 2002 *************** class PlainDatagramSocketImpl extends Da *** 67,93 **** public native Object getOption(int optID) throws SocketException; private native void mcastGrp(InetAddress inetaddr, boolean join) throws IOException; ! ! protected void close() ! { ! // FIXME: The close method in each of the DatagramSocket* classes does ! // not throw an IOException. The issue is that FileDescriptor.close() ! // in natFileDescriptorPosix.cc can throw one, so we have to catch ! // it here. It seems that FileDescriptor.close is properly throwing ! // the IOException on errors since many of the java.io classes depend ! // on that. This probably requires a bit more research but for now, ! // we'll catch the IOException here. ! try ! { ! if (fd.valid()) ! fd.close(); ! } ! catch (IOException e) ! { ! System.err.println("PlainDatagramSocketImpl.close: Error closing - " + ! e.getMessage()); ! } ! } // Deprecated in JDK 1.2. protected byte getTTL() throws IOException --- 67,73 ---- public native Object getOption(int optID) throws SocketException; private native void mcastGrp(InetAddress inetaddr, boolean join) throws IOException; ! protected native void close(); // Deprecated in JDK 1.2. protected byte getTTL() throws IOException *************** class PlainDatagramSocketImpl extends Da *** 110,113 **** --- 90,103 ---- { mcastGrp(inetaddr, false); } + + protected void finalize() throws Throwable + { + synchronized (this) + { + if (fnum != -1) + close(); + } + super.finalize(); + } } diff -Nrc3pad gcc-3.0.4/libjava/java/net/PlainSocketImpl.java gcc-3.1/libjava/java/net/PlainSocketImpl.java *** gcc-3.0.4/libjava/java/net/PlainSocketImpl.java Fri Dec 8 10:28:32 2000 --- gcc-3.1/libjava/java/net/PlainSocketImpl.java Thu Mar 28 02:36:51 2002 *************** *** 1,6 **** // PlainSocketImpl.java - Implementation of SocketImpl. ! /* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // PlainSocketImpl.java - Implementation of SocketImpl. ! /* Copyright (C) 1999 , 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 11,27 **** package java.net; import java.io.*; - /** - * @author Per Bothner - * @date February 22, 1999. - */ /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ - class PlainSocketImpl extends SocketImpl { // These fields are mirrored for use in native code to avoid cpp conflicts --- 11,26 ---- package java.net; import java.io.*; /** + * The standard GCJ socket implementation. * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. + * + * @author Per Bothner + * @author Nic Ferrier */ class PlainSocketImpl extends SocketImpl { // These fields are mirrored for use in native code to avoid cpp conflicts *************** class PlainSocketImpl extends SocketImpl *** 35,40 **** --- 34,46 ---- _Jv_SO_SNDBUF_ = SocketOptions.SO_SNDBUF, _Jv_SO_RCVBUF_ = SocketOptions.SO_RCVBUF; + /** + * The OS file handle representing the socket. + * This is used for reads and writes to/from the socket and + * to close it. + * + * When the socket is closed this is reset to -1. + */ int fnum = -1; // This value is set/read by setOption/getOption. *************** class PlainSocketImpl extends SocketImpl *** 62,98 **** protected native void listen (int backlog) throws IOException; private native void accept (PlainSocketImpl s) throws IOException; protected void accept (SocketImpl s) throws IOException { accept((PlainSocketImpl) s); } private InputStream in; private OutputStream out; protected InputStream getInputStream() throws IOException { - // FIXME: TODO - Implement class SocketInputStream timeouts in read(); if (in == null) ! in = new FileInputStream (fd); return in; } protected OutputStream getOutputStream() throws IOException { if (out == null) ! out = new FileOutputStream (fd); return out; } ! protected int available () throws IOException { ! return in.available(); } ! protected void close () throws IOException { ! if (fd.valid()) ! fd.close(); } } --- 68,210 ---- protected native void listen (int backlog) throws IOException; private native void accept (PlainSocketImpl s) throws IOException; + protected void accept (SocketImpl s) throws IOException { accept((PlainSocketImpl) s); } + protected native int available() throws IOException; + + protected native void close () throws IOException; + + + // Stream handling. + + /** A cached copy of the in stream for reading from the socket. */ private InputStream in; + + /** A cached copy of the out stream for writing to the socket. */ private OutputStream out; + + // The native read methods. + + private native int read() throws IOException; + + private native int read(byte[] buffer, int offset, int count) + throws IOException; + + + // The native write methods. + + private native void write(int c) throws IOException; + + private native void write(byte[] buffer, int offset, int count) + throws IOException; + + protected void finalize() throws Throwable + { + synchronized (this) + { + if (fnum != -1) + try + { + close(); + } + catch (IOException ex) + { + // ignore + } + } + super.finalize(); + } + + /** @return the input stream attached to the socket. + */ protected InputStream getInputStream() throws IOException { if (in == null) ! in = new SocketInputStream(); return in; } + /** @return the output stream attached to the socket. + */ protected OutputStream getOutputStream() throws IOException { if (out == null) ! out = new SocketOutputStream(); return out; } ! /** ! * A stream which reads from the socket implementation. ! * ! * @author Nic Ferrier ! */ ! class SocketInputStream ! extends InputStream { ! SocketInputStream() ! { ! } ! ! public final void close() throws IOException ! { ! PlainSocketImpl.this.close(); ! } ! ! public final int available() throws IOException ! { ! return PlainSocketImpl.this.available(); ! } ! ! public final int read() throws IOException ! { ! return PlainSocketImpl.this.read(); ! } ! ! public final int read(byte[] buffer, int offset, int length) ! throws IOException ! { ! return PlainSocketImpl.this.read(buffer, offset, length); ! } ! ! public final int read(byte[] buffer) ! throws IOException ! { ! return PlainSocketImpl.this.read(buffer, 0, buffer.length); ! } } ! /** A stream which writes to the socket implementation. ! * ! * @author Nic Ferrier ! */ ! class SocketOutputStream ! extends OutputStream { ! public final void close() throws IOException ! { ! PlainSocketImpl.this.close(); ! } ! ! public final void write(int c) throws IOException ! { ! PlainSocketImpl.this.write(c); ! } ! ! public final void write(byte[] buffer, int offset, int length) ! throws IOException ! { ! PlainSocketImpl.this.write(buffer, offset, length); ! } ! ! public final void write(byte[] buffer) ! throws IOException ! { ! PlainSocketImpl.this.write(buffer, 0, buffer.length); ! } } } diff -Nrc3pad gcc-3.0.4/libjava/java/net/ProtocolException.java gcc-3.1/libjava/java/net/ProtocolException.java *** gcc-3.0.4/libjava/java/net/ProtocolException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/ProtocolException.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // ProtocolException.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,41 ---- ! /* ProtocolException.java -- A low level protocol error occurred ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,35 **** * Status: Believed complete and correct. */ public class ProtocolException extends java.io.IOException { - public ProtocolException() - { - super(); - } ! public ProtocolException(String msg) ! { ! super(msg); ! } } --- 43,87 ---- * Status: Believed complete and correct. */ + /** + * This exception indicates that some sort of low level protocol + * exception occurred. Look in the descriptive message (if any) for + * details on what went wrong + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date March 5, 1999. + */ public class ProtocolException extends java.io.IOException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of ProtocolException ! * without a descriptive error message. ! */ ! public ! ProtocolException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of ProtocolException ! * with a descriptive error message. ! * ! * @param message A message describing the error that occurred. ! */ ! public ! ProtocolException(String message) ! { ! super(message); } + + } // class ProtocolException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/ServerSocket.java gcc-3.1/libjava/java/net/ServerSocket.java *** gcc-3.0.4/libjava/java/net/ServerSocket.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/ServerSocket.java Tue Jan 22 22:40:23 2002 *************** *** 1,111 **** ! // ServerSocket.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! /** ! * @author Per Bothner ! * @date January 6, 1999. ! */ ! /** Written using on-line Java Platform 1.2 API Specification. ! * Status: I believe all methods are implemented. ! */ package java.net; - import java.io.*; public class ServerSocket { - static SocketImplFactory factory; - SocketImpl impl; ! static final byte[] zeros = {0,0,0,0}; ! /* dummy InetAddress, used to bind socket to any (all) network interfaces */ ! static final InetAddress ANY_IF = new InetAddress(zeros, null); public ServerSocket (int port) throws java.io.IOException { this(port, 50); } public ServerSocket (int port, int backlog) throws java.io.IOException { ! this(port, backlog, ANY_IF); } public ServerSocket (int port, int backlog, InetAddress bindAddr) throws java.io.IOException { ! if (factory == null) ! this.impl = new PlainSocketImpl(); ! else ! this.impl = factory.createSocketImpl(); SecurityManager s = System.getSecurityManager(); if (s != null) s.checkListen(port); impl.create(true); ! impl.bind(bindAddr == null ? ANY_IF : bindAddr, port); impl.listen(backlog); } public InetAddress getInetAddress() { return impl.getInetAddress(); } public int getLocalPort() { return impl.getLocalPort(); } public Socket accept () throws IOException { ! Socket s = new Socket(Socket.factory == null ? new PlainSocketImpl() ! : Socket.factory.createSocketImpl()); implAccept (s); return s; } protected final void implAccept (Socket s) throws IOException { impl.accept(s.impl); } public void close () throws IOException { impl.close(); } ! public synchronized void setSoTimeout (int timeout) throws SocketException { if (timeout < 0) ! throw new IllegalArgumentException("Invalid timeout: " + timeout); impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout)); } ! public synchronized int getSoTimeout () throws SocketException { Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT); ! if (timeout instanceof Integer) ! return ((Integer)timeout).intValue(); ! else ! return 0; } public String toString () { ! return "ServerSocket" + impl.toString(); } public static synchronized void setSocketFactory (SocketImplFactory fac) throws IOException { --- 1,276 ---- ! /* ServerSocket.java -- Class for implementing server side sockets ! Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; + import java.io.IOException; + + /* Written using on-line Java Platform 1.2 API Specification. + * Status: I believe all methods are implemented. + */ + + /** + * This class models server side sockets. The basic model is that the + * server socket is created and bound to some well known port. It then + * listens for and accepts connections. At that point the client and + * server sockets are ready to communicate with one another utilizing + * whatever application layer protocol they desire. + *

    + * As with the Socket class, most instance methods of this class + * simply redirect their calls to an implementation class. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Per Bothner (bothner@cygnus.com) + */ public class ServerSocket { ! // Class Variables ! ! /** ! * This is the user defined SocketImplFactory, if one is supplied ! */ ! private static SocketImplFactory factory; ! ! // Instance Variables + /** + * This is the SocketImp object to which most instance methods in this + * class are redirected + */ + private SocketImpl impl; + + /** + * Private constructor that simply sets the implementation. + */ + private ServerSocket() + { + if (factory != null) + impl = factory.createSocketImpl(); + else + impl = new PlainSocketImpl(); + } + + /** + * Creates a server socket and binds it to the specified port. If the + * port number is 0, a random free port will be chosen. The pending + * connection queue on this socket will be set to 50. + * + * @param port The port number to bind to + * + * @exception IOException If an error occurs + */ public ServerSocket (int port) throws java.io.IOException { this(port, 50); } + /** + * Creates a server socket and binds it to the specified port. If the + * port number is 0, a random free port will be chosen. The pending + * connection queue on this socket will be set to the value passed as + * arg2. + * + * @param port The port number to bind to + * @param backlog The length of the pending connection queue + * + * @exception IOException If an error occurs + */ public ServerSocket (int port, int backlog) throws java.io.IOException { ! this(port, backlog, null); } + /** + * Creates a server socket and binds it to the specified port. If the + * port number is 0, a random free port will be chosen. The pending + * connection queue on this socket will be set to the value passed as + * backlog. The third argument specifies a particular local address to + * bind t or null to bind to all local address. + * + * @param port The port number to bind to + * @param backlog The length of the pending connection queue + * @param bindAddr The address to bind to, or null to bind to all addresses + * + * @exception IOException If an error occurs + */ public ServerSocket (int port, int backlog, InetAddress bindAddr) throws java.io.IOException { ! this(); ! if (impl == null) ! throw new IOException("Cannot initialize Socket implementation"); ! SecurityManager s = System.getSecurityManager(); if (s != null) s.checkListen(port); + + if (bindAddr == null) + bindAddr = InetAddress.ANY_IF; + impl.create(true); ! impl.bind(bindAddr, port); impl.listen(backlog); } + /** + * This method returns the local address to which this socket is bound + * + * @return The socket's local address + */ public InetAddress getInetAddress() { return impl.getInetAddress(); } + /** + * This method returns the local port number to which this socket is bound + * + * @return The socket's port number + */ public int getLocalPort() { return impl.getLocalPort(); } + /** + * Accepts a new connection and returns a connected Socket + * instance representing that connection. This method will block until a + * connection is available. + * + * @exception IOException If an error occurs + */ public Socket accept () throws IOException { ! Socket s = new Socket(); implAccept (s); + return s; } + /** + * This protected method is used to help subclasses override + * ServerSocket.accept(). The passed in socket will be + * connected when this method returns. + * + * @param socket The socket that is used for the accepted connection + * + * @exception IOException If an error occurs + */ protected final void implAccept (Socket s) throws IOException { impl.accept(s.impl); } + /** + * Closes this socket and stops listening for connections + * + * @exception IOException If an error occurs + */ public void close () throws IOException { impl.close(); } ! /** ! * Sets the value of SO_TIMEOUT. A value of 0 implies that SO_TIMEOUT is ! * disabled (ie, operations never time out). This is the number of ! * milliseconds a socket operation can block before an ! * InterruptedIOException is thrown. ! * ! * @param timeout The new SO_TIMEOUT value ! * ! * @exception IOException If an error occurs ! */ ! public void setSoTimeout (int timeout) throws SocketException { if (timeout < 0) ! throw new IllegalArgumentException("SO_TIMEOUT value must be >= 0"); impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout)); } ! /** ! * Retrieves the current value of the SO_TIMEOUT setting. A value of 0 ! * implies that SO_TIMEOUT is disabled (ie, operations never time out). ! * This is the number of milliseconds a socket operation can block before ! * an InterruptedIOException is thrown. ! * ! * @return The value of SO_TIMEOUT ! * ! * @exception IOException If an error occurs ! */ ! public int getSoTimeout () throws IOException { Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT); ! ! if (!(timeout instanceof Integer)) ! throw new IOException("Internal Error"); ! ! return ((Integer)timeout).intValue(); } + /** + * Returns the value of this socket as a String. + * + * @return This socket represented as a String. + */ public String toString () { ! return "ServerSocket " + impl.toString(); } + // Class methods + + /** + * Sets the SocketImplFactory for all + * ServerSocket's. This may only be done + * once per virtual machine. Subsequent attempts will generate an + * exception. Note that a SecurityManager check is made prior + * to setting the factory. If insufficient privileges exist to set the + * factory, an exception will be thrown + * + * @exception SecurityException If this operation is not allowed by the + * SecurityManager. + * @exception SocketException If the factory object is already defined + * @exception IOException If any other error occurs + */ public static synchronized void setSocketFactory (SocketImplFactory fac) throws IOException { diff -Nrc3pad gcc-3.0.4/libjava/java/net/Socket.java gcc-3.1/libjava/java/net/Socket.java *** gcc-3.0.4/libjava/java/net/Socket.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/Socket.java Tue Jan 22 22:40:23 2002 *************** *** 1,263 **** ! // Socket.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! /** ! * @author Per Bothner ! * @date January 6, 1999. ! */ ! /** Written using on-line Java Platform 1.2 API Specification. ! * Status: I believe all methods are implemented. ! */ package java.net; import java.io.*; public class Socket { static SocketImplFactory factory; SocketImpl impl; protected Socket () { } protected Socket (SocketImpl impl) throws SocketException { this.impl = impl; } public Socket (String host, int port) throws UnknownHostException, IOException { ! this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); ! SecurityManager s = System.getSecurityManager(); ! if (s != null) ! s.checkConnect(host, port); ! impl.create(true); ! // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, ! // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as ! // that default. JDK 1.2 doc infers not to do a bind. ! impl.connect(host, port); } public Socket (InetAddress address, int port) throws IOException { ! this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); ! SecurityManager s = System.getSecurityManager(); ! if (s != null) ! s.checkConnect(address.getHostName(), port); ! impl.create(true); ! // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, ! // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as ! // that default. JDK 1.2 doc infers not to do a bind. ! impl.connect(address, port); } public Socket (String host, int port, InetAddress localAddr, int localPort) throws IOException { ! this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); ! SecurityManager s = System.getSecurityManager(); ! if (s != null) ! s.checkConnect(host, port); ! impl.create(true); ! // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress(). ! impl.bind(localAddr, localPort); ! impl.connect(host, port); } public Socket (InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException { ! this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl()); ! SecurityManager s = System.getSecurityManager(); ! if (s != null) ! s.checkConnect(address.getHostName(), port); ! impl.create(true); ! // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress(). ! impl.bind(localAddr, localPort); ! impl.connect(address, port); } /** ! * @deprecated Use DatagramSocket instead for UDP transport. */ public Socket (String host, int port, boolean stream) throws IOException { ! impl = factory == null ? new PlainSocketImpl() ! : factory.createSocketImpl(); ! impl.create(stream); ! SecurityManager s = System.getSecurityManager(); ! if (s != null) ! s.checkConnect(host, port); ! // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, ! // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as ! // that default. JDK 1.2 doc infers not to do a bind. ! impl.connect(host, port); } /** ! * @deprecated Use DatagramSocket instead for UDP transport. */ public Socket (InetAddress host, int port, boolean stream) throws IOException { ! impl = factory == null ? new PlainSocketImpl() ! : factory.createSocketImpl(); impl.create(stream); ! SecurityManager s = System.getSecurityManager(); ! if (s != null) ! s.checkConnect(host.getHostName(), port); // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as // that default. JDK 1.2 doc infers not to do a bind. ! impl.connect(host, port); } public InetAddress getInetAddress () { ! return impl.getInetAddress(); } public InetAddress getLocalAddress () { ! // FIXME: see note in DatagramSocket.java about checkConnect() and security try { ! return (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR); } ! catch (SocketException x) { ! // (hopefully) shouldn't happen ! System.err.println(x); ! throw new java.lang.InternalError("Error in PlainSocketImpl.getOption"); } } public int getPort () { ! return impl.getPort(); } public int getLocalPort () { ! return impl.getLocalPort(); } public InputStream getInputStream () throws IOException { ! return impl.getInputStream(); } public OutputStream getOutputStream () throws IOException { ! return impl.getOutputStream(); } public void setTcpNoDelay (boolean on) throws SocketException { ! impl.setOption( SocketOptions.TCP_NODELAY, new Boolean(on) ); } public boolean getTcpNoDelay() throws SocketException { ! Boolean bool = (Boolean)impl.getOption( SocketOptions.TCP_NODELAY ); ! return bool.booleanValue(); } public void setSoLinger(boolean on, int linger) throws SocketException { ! if ( on && (linger >= 0) ) { ! if (linger > 65535) ! linger = 65535; ! impl.setOption( SocketOptions.SO_LINGER, new Integer(linger) ); ! } ! else if ( on && (linger < 0) ) ! throw new IllegalArgumentException("SO_LINGER must be >= 0"); else ! impl.setOption( SocketOptions.SO_LINGER, new Boolean(false) ); } public int getSoLinger() throws SocketException { ! Object linger = impl.getOption(SocketOptions.SO_LINGER); ! if (linger instanceof Integer) ! return ((Integer)linger).intValue(); else return -1; } public synchronized void setSoTimeout (int timeout) throws SocketException { if (timeout < 0) ! throw new IllegalArgumentException("Invalid timeout: " + timeout); ! impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout)); } public synchronized int getSoTimeout () throws SocketException { Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT); ! if (timeout instanceof Integer) ! return ((Integer)timeout).intValue(); else return 0; } ! // JDK1.2 public void setSendBufferSize (int size) throws SocketException { if (size <= 0) ! throw new IllegalArgumentException("Invalid buffer size: " + size); ! impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size)); } ! // JDK1.2 public int getSendBufferSize () throws SocketException { ! Integer buf = (Integer)impl.getOption(SocketOptions.SO_SNDBUF); ! return buf.intValue(); } ! // JDK1.2 public void setReceiveBufferSize (int size) throws SocketException { ! if (size <= 0) ! throw new IllegalArgumentException("Invalid buffer size: " + size); impl.setOption(SocketOptions.SO_RCVBUF, new Integer(size)); } ! // JDK1.2 public int getReceiveBufferSize () throws SocketException { ! Integer buf = (Integer)impl.getOption(SocketOptions.SO_RCVBUF); ! return buf.intValue(); } public synchronized void close () throws IOException { ! impl.close(); } public String toString () { ! return "Socket" + impl.toString(); } public static synchronized void setSocketImplFactory (SocketImplFactory fac) throws IOException { factory = fac; } } --- 1,670 ---- ! /* Socket.java -- Client socket implementation ! Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; + import java.io.*; + /* Written using on-line Java Platform 1.2 API Specification. + * Status: I believe all methods are implemented. + */ + + /** + * This class models a client site socket. A socket is a TCP/IP endpoint + * for network communications conceptually similar to a file handle. + *

    + * This class does not actually do any work. Instead, it redirects all of + * its calls to a socket implementation object which implements the + * SocketImpl interface. The implementation class is + * instantiated by factory class that implements the + * SocketImplFactory interface. A default + * factory is provided, however the factory may be set by a call to + * the setSocketImplFactory method. Note that this may only be + * done once per virtual machine. If a subsequent attempt is made to set the + * factory, a SocketException will be thrown. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Per Bothner (bothner@cygnus.com) + */ public class Socket { + + // Class Variables + + /** + * This is the user SocketImplFactory for this class. If this variable is + * null, a default factory is used. + */ static SocketImplFactory factory; + + // Instance Variables + + /** + * The implementation object to which calls are redirected + */ SocketImpl impl; + // Constructors + + /** + * Initializes a new instance of Socket object without + * connecting to a remote host. This useful for subclasses of socket that + * might want this behavior. + */ protected Socket () { + if (factory != null) + impl = factory.createSocketImpl(); + else + impl = new PlainSocketImpl(); } + /** + * Initializes a new instance of Socket object without + * connecting to a remote host. This is useful for subclasses of socket + * that might want this behavior. + *

    + * Additionally, this socket will be created using the supplied + * implementation class instead the default class or one returned by a + * factory. This value can be null, but if it is, all instance + * methods in Socket should be overridden because most of them + * rely on this value being populated. + * + * @param impl The SocketImpl to use for this + * Socket + * + * @exception SocketException If an error occurs + */ protected Socket (SocketImpl impl) throws SocketException { this.impl = impl; } + /** + * Initializes a new instance of Socket and connects to the + * hostname and port specified as arguments. + * + * @param host The name of the host to connect to + * @param port The port number to connect to + * + * @exception UnknownHostException If the hostname cannot be resolved to a + * network address. + * @exception IOException If an error occurs + */ public Socket (String host, int port) throws UnknownHostException, IOException { ! this(InetAddress.getByName(host), port, null, 0, true); } + /** + * Initializes a new instance of Socket and connects to the + * address and port number specified as arguments. + * + * @param address The address to connect to + * @param port The port number to connect to + * + * @exception IOException If an error occurs + */ public Socket (InetAddress address, int port) throws IOException { ! this(address, port, null, 0, true); } + /** + * Initializes a new instance of Socket that connects to the + * named host on the specified port and binds to the specified local address + * and port. + * + * @param host The name of the remote host to connect to. + * @param port The remote port to connect to. + * @param loadAddr The local address to bind to. + * @param localPort The local port to bind to. + * + * @exception SecurityException If the SecurityManager + * exists and does not allow a connection to the specified host/port or + * binding to the specified local host/port. + * @exception IOException If a connection error occurs. + */ public Socket (String host, int port, InetAddress localAddr, int localPort) throws IOException { ! this(InetAddress.getByName(host), port, localAddr, localPort, true); } + /** + * Initializes a new instance of Socket and connects to the + * address and port number specified as arguments, plus binds to the + * specified local address and port. + * + * @param address The remote address to connect to + * @param port The remote port to connect to + * @param localAddr The local address to connect to + * @param localPort The local port to connect to + * + * @exception IOException If an error occurs + */ public Socket (InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException { ! this(address, port, localAddr, localPort, true); } /** ! * Initializes a new instance of Socket and connects to the ! * hostname and port specified as arguments. If the stream argument is set ! * to true, then a stream socket is created. If it is ! * false, a datagram socket is created. ! * ! * @param host The name of the host to connect to ! * @param port The port to connect to ! * @param stream true for a stream socket, false ! * for a datagram socket ! * ! * @exception IOException If an error occurs ! * ! * @deprecated Use the DatagramSocket class to create ! * datagram oriented sockets. */ public Socket (String host, int port, boolean stream) throws IOException { ! this(InetAddress.getByName(host), port, null, 0, stream); } /** ! * Initializes a new instance of Socket and connects to the ! * address and port number specified as arguments. If the stream param is ! * true, a stream socket will be created, otherwise a datagram ! * socket is created. ! * ! * @param host The address to connect to ! * @param port The port number to connect to ! * @param stream true to create a stream socket, ! * false to create a datagram socket. ! * ! * @exception IOException If an error occurs ! * ! * @deprecated Use the DatagramSocket class to create ! * datagram oriented sockets. */ public Socket (InetAddress host, int port, boolean stream) throws IOException { ! this(host, port, null, 0, stream); ! } ! ! /** ! * This constructor is where the real work takes place. Connect to the ! * specified address and port. Use default local values if not specified, ! * otherwise use the local host and port passed in. Create as stream or ! * datagram based on "stream" argument. ! *

    ! * ! * @param raddr The remote address to connect to ! * @param rport The remote port to connect to ! * @param laddr The local address to connect to ! * @param lport The local port to connect to ! * @param stream true for a stream socket, false for a datagram socket ! * ! * @exception IOException If an error occurs ! */ ! private Socket(InetAddress raddr, int rport, InetAddress laddr, int lport, ! boolean stream) throws IOException ! { ! this(); ! if (impl == null) ! throw new IOException("Cannot initialize Socket implementation"); ! ! SecurityManager sm = System.getSecurityManager(); ! if (sm != null) ! sm.checkConnect(raddr.getHostName(), rport); ! impl.create(stream); ! // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port, // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as // that default. JDK 1.2 doc infers not to do a bind. ! if (laddr != null) ! impl.bind(laddr, lport); ! ! if (raddr != null) ! impl.connect(raddr, rport); } + /** + * Returns the address of the remote end of the socket. If this socket + * is not connected, then null is returned. + * + * @return The remote address this socket is connected to + */ public InetAddress getInetAddress () { ! if (impl != null) ! return impl.getInetAddress(); ! ! return null; } + /** + * Returns the local address to which this socket is bound. If this socket + * is not connected, then null is returned. + * + * @return The local address + */ public InetAddress getLocalAddress () { ! if (impl == null) ! return null; ! ! InetAddress addr = null; try { ! addr = (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR); } ! catch(SocketException e) { ! // (hopefully) shouldn't happen ! // throw new java.lang.InternalError ! // ("Error in PlainSocketImpl.getOption"); ! return null; } + + // FIXME: According to libgcj, checkConnect() is supposed to be called + // before performing this operation. Problems: 1) We don't have the + // addr until after we do it, so we do a post check. 2). The docs I + // see don't require this in the Socket case, only DatagramSocket, but + // we'll assume they mean both. + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkConnect(addr.getHostName(), getLocalPort()); + + return addr; } + /** + * Returns the port number of the remote end of the socket connection. If + * this socket is not connected, then -1 is returned. + * + * @return The remote port this socket is connected to + */ public int getPort () { ! if (impl != null) ! return impl.getPort(); ! ! return -1; } + /** + * Returns the local port number to which this socket is bound. If this + * socket is not connected, then -1 is returned. + * + * @return The local port + */ public int getLocalPort () { ! if (impl != null) ! return impl.getLocalPort(); ! ! return -1; } + /** + * Returns an InputStream for reading from this socket. + * + * @return The InputStream object + * + * @exception IOException If an error occurs or Socket is not connected + */ public InputStream getInputStream () throws IOException { ! if (impl != null) ! return(impl.getInputStream()); ! ! throw new IOException("Not connected"); } + /** + * Returns an OutputStream for writing to this socket. + * + * @return The OutputStream object + * + * @exception IOException If an error occurs or Socket is not connected + */ public OutputStream getOutputStream () throws IOException { ! if (impl != null) ! return impl.getOutputStream(); ! ! throw new IOException("Not connected"); } + /** + * Sets the TCP_NODELAY option on the socket. + * + * @param on true to enable, false to disable + * + * @exception SocketException If an error occurs or Socket is not connected + */ public void setTcpNoDelay (boolean on) throws SocketException { ! if (impl == null) ! throw new SocketException("Not connected"); ! ! impl.setOption(SocketOptions.TCP_NODELAY, new Boolean(on)); } + /** + * Tests whether or not the TCP_NODELAY option is set on the socket. + * Returns true if enabled, false if disabled. When on it disables the + * Nagle algorithm which means that packets are always send immediatly and + * never merged together to reduce network trafic. + * + * @return Whether or not TCP_NODELAY is set + * + * @exception SocketException If an error occurs or Socket not connected + */ public boolean getTcpNoDelay() throws SocketException { ! if (impl == null) ! throw new SocketException("Not connected"); ! ! Object on = impl.getOption(SocketOptions.TCP_NODELAY); ! ! if (on instanceof Boolean) ! return(((Boolean)on).booleanValue()); ! else ! throw new SocketException("Internal Error"); } + /** + * Sets the value of the SO_LINGER option on the socket. If the + * SO_LINGER option is set on a socket and there is still data waiting to + * be sent when the socket is closed, then the close operation will block + * until either that data is delivered or until the timeout period + * expires. The linger interval is specified in hundreths of a second + * (platform specific?) + * + * @param on true to enable SO_LINGER, false to disable + * @param linger The SO_LINGER timeout in hundreths of a second or -1 if + * SO_LINGER not set. + * + * @exception SocketException If an error occurs or Socket not connected + */ public void setSoLinger(boolean on, int linger) throws SocketException { ! if (impl == null) ! throw new SocketException("No socket created"); ! ! if (on == true) { ! if (linger < 0) ! throw new IllegalArgumentException("SO_LINGER must be >= 0"); ! ! if (linger > 65535) ! linger = 65535; ! ! impl.setOption(SocketOptions.SO_LINGER, new Integer(linger)); ! } else ! { ! impl.setOption(SocketOptions.SO_LINGER, new Boolean(false)); ! } } + /** + * Returns the value of the SO_LINGER option on the socket. If the + * SO_LINGER option is set on a socket and there is still data waiting to + * be sent when the socket is closed, then the close operation will block + * until either that data is delivered or until the timeout period + * expires. This method either returns the timeouts (in hundredths of + * of a second (platform specific?)) if SO_LINGER is set, or -1 if + * SO_LINGER is not set. + * + * @return The SO_LINGER timeout in hundreths of a second or -1 + * if SO_LINGER not set + * + * @exception SocketException If an error occurs or Socket is not connected + */ public int getSoLinger() throws SocketException { ! if (impl == null) ! throw new SocketException("Not connected"); ! ! Object linger = impl.getOption(SocketOptions.SO_LINGER); ! if (linger instanceof Integer) ! return(((Integer)linger).intValue()); else return -1; } + /** + * Sets the value of the SO_TIMEOUT option on the socket. If this value + * is set, and an read/write is performed that does not complete within + * the timeout period, a short count is returned (or an EWOULDBLOCK signal + * would be sent in Unix if no data had been read). A value of 0 for + * this option implies that there is no timeout (ie, operations will + * block forever). On systems that have separate read and write timeout + * values, this method returns the read timeout. This + * value is in thousandths of a second (****????*****) + * + * @param timeout The length of the timeout in thousandth's of a second or + * 0 if not set + * + * @exception SocketException If an error occurs or Socket not connected + */ public synchronized void setSoTimeout (int timeout) throws SocketException { + if (impl == null) + throw new SocketException("Not connected"); + if (timeout < 0) ! throw new IllegalArgumentException("SO_TIMEOUT value must be >= 0"); ! impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout)); } + /** + * Returns the value of the SO_TIMEOUT option on the socket. If this value + * is set, and an read/write is performed that does not complete within + * the timeout period, a short count is returned (or an EWOULDBLOCK signal + * would be sent in Unix if no data had been read). A value of 0 for + * this option implies that there is no timeout (ie, operations will + * block forever). On systems that have separate read and write timeout + * values, this method returns the read timeout. This + * value is in thousandths of a second (implementation specific?). + * + * @return The length of the timeout in thousandth's of a second or 0 + * if not set + * + * @exception SocketException If an error occurs or Socket not connected + */ public synchronized int getSoTimeout () throws SocketException { + if (impl == null) + throw new SocketException("Not connected"); + Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT); ! if (timeout instanceof Integer) ! return(((Integer)timeout).intValue()); else return 0; } ! /** ! * This method sets the value for the system level socket option ! * SO_SNDBUF to the specified value. Note that valid values for this ! * option are specific to a given operating system. ! * ! * @param size The new send buffer size. ! * ! * @exception SocketException If an error occurs or Socket not connected ! * ! * @since Java 1.2 ! */ public void setSendBufferSize (int size) throws SocketException { + if (impl == null) + throw new SocketException("Not connected"); + if (size <= 0) ! throw new IllegalArgumentException("SO_SNDBUF value must be > 0"); ! impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size)); } ! /** ! * This method returns the value of the system level socket option ! * SO_SNDBUF, which is used by the operating system to tune buffer ! * sizes for data transfers. ! * ! * @return The send buffer size. ! * ! * @exception SocketException If an error occurs or socket not connected ! * ! * @since Java 1.2 ! */ public int getSendBufferSize () throws SocketException { ! if (impl == null) ! throw new SocketException("Not connected"); ! ! Object buf = impl.getOption(SocketOptions.SO_SNDBUF); ! ! if (buf instanceof Integer) ! return(((Integer)buf).intValue()); ! else ! throw new SocketException("Internal Error: Unexpected type"); } ! /** ! * This method sets the value for the system level socket option ! * SO_RCVBUF to the specified value. Note that valid values for this ! * option are specific to a given operating system. ! * ! * @param size The new receive buffer size. ! * ! * @exception SocketException If an error occurs or Socket is not connected ! * ! * @since Java 1.2 ! */ public void setReceiveBufferSize (int size) throws SocketException { ! if (impl == null) ! throw new SocketException("Not connected"); + if (size <= 0) + throw new IllegalArgumentException("SO_RCVBUF value must be > 0"); + impl.setOption(SocketOptions.SO_RCVBUF, new Integer(size)); } ! /** ! * This method returns the value of the system level socket option ! * SO_RCVBUF, which is used by the operating system to tune buffer ! * sizes for data transfers. ! * ! * @return The receive buffer size. ! * ! * @exception SocketException If an error occurs or Socket is not connected ! * ! * @since Java 1.2 ! */ public int getReceiveBufferSize () throws SocketException { ! if (impl == null) ! throw new SocketException("Not connected"); ! ! Object buf = impl.getOption(SocketOptions.SO_RCVBUF); ! ! if (buf instanceof Integer) ! return(((Integer)buf).intValue()); ! else ! throw new SocketException("Internal Error: Unexpected type"); } + /** + * Closes the socket. + * + * @exception IOException If an error occurs + */ public synchronized void close () throws IOException { ! if (impl != null) ! impl.close(); } + /** + * Converts this Socket to a String. + * + * @return The String representation of this Socket + */ public String toString () { ! return("Socket " + impl); } + // Class Methods + + /** + * Sets the SocketImplFactory. This may be done only once per + * virtual machine. Subsequent attempts will generate a + * SocketException. Note that a SecurityManager + * check is made prior to setting the factory. If + * insufficient privileges exist to set the factory, then an + * IOException will be thrown. + * + * @exception SecurityException If the SecurityManager does + * not allow this operation. + * @exception SocketException If the SocketImplFactory is already defined + * @exception IOException If any other error occurs + */ public static synchronized void setSocketImplFactory (SocketImplFactory fac) throws IOException { + // See if already set + if (factory != null) + throw new SocketException("SocketImplFactory already defined"); + + // Check permissions + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSetFactory(); + factory = fac; } } diff -Nrc3pad gcc-3.0.4/libjava/java/net/SocketException.java gcc-3.1/libjava/java/net/SocketException.java *** gcc-3.0.4/libjava/java/net/SocketException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/SocketException.java Tue Jan 22 22:40:23 2002 *************** *** 1,33 **** ! // SocketException.java - Base class for networking exceptions ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.net; ! /** ! * @author Per Bothner ! * @date January 6, 1999. */ ! /** Written using on-line Java Platform 1.2 API Specification. ! * Believed complete and correct. */ - public class SocketException extends java.io.IOException { - public SocketException () - { - super(); - } ! public SocketException (String s) ! { ! super(s); ! } } --- 1,85 ---- ! /* SocketException.java -- An exception occurred while performing a socket op ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; ! /* Written using on-line Java Platform 1.2 API Specification. ! * Believed complete and correct. */ ! /** ! * This exception indicates that a generic error occurred related to an ! * operation on a socket. Check the descriptive message (if any) for ! * details on the nature of this error ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Per Bothner ! * @date January 6, 1999. */ public class SocketException extends java.io.IOException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of SocketException without ! * a descriptive error message. ! */ ! public ! SocketException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Initializes a new instance of SocketException without + * a descriptive error message. + * + * @param message A message describing the error that occurred. + */ + public + SocketException(String message) + { + super(message); + } + + } // class SocketException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/SocketImpl.java gcc-3.1/libjava/java/net/SocketImpl.java *** gcc-3.0.4/libjava/java/net/SocketImpl.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/SocketImpl.java Thu Feb 14 23:16:06 2002 *************** *** 1,76 **** ! // SocketImpl.java - Abstract socket implementation. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.net; - import java.io.*; ! /** ! * @author Per Bothner ! * @date January 6, 1999. ! */ ! /** Written using on-line Java Platform 1.2 API Specification. ! * Believed complete and correct. ! */ public abstract class SocketImpl implements SocketOptions { protected InetAddress address; protected FileDescriptor fd; protected int localport; protected int port; ! public SocketImpl () { } ! protected abstract void create (boolean stream) throws IOException; ! protected abstract void connect (String host, int port) throws IOException; ! protected abstract void connect (InetAddress host, int port) throws IOException; ! protected abstract void bind (InetAddress host, int port) throws IOException; ! protected abstract void listen (int backlog) throws IOException; ! protected abstract void accept (SocketImpl s) throws IOException; protected abstract InputStream getInputStream() throws IOException; protected abstract OutputStream getOutputStream() throws IOException; ! protected abstract int available () throws IOException; ! protected abstract void close () throws IOException; ! protected FileDescriptor getFileDescriptor () { return fd; } ! protected InetAddress getInetAddress () { return address; } ! protected int getPort () { return port; } ! protected int getLocalPort () { return localport; } ! public abstract Object getOption(int optID) throws SocketException; ! public abstract void setOption(int optID, Object value) throws SocketException; ! public String toString () ! { ! return "[addr=" + address.toString() + ",port=" + Integer.toString(port) + ! ",localport=" + Integer.toString(localport) + "]"; ! } } --- 1,267 ---- ! /* SocketImpl.java -- Abstract socket implementation class ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; ! import java.io.*; ! /* Written using on-line Java Platform 1.2 API Specification. ! * Believed complete and correct. ! */ + /** + * This abstract class serves as the parent class for socket implementations. + * The implementation class serves an intermediary to native routines that + * perform system specific socket operations. + *

    + * A default implementation is provided by the system, but this can be + * changed via installing a SocketImplFactory (through a call + * to the static method Socket.setSocketImplFactory). A + * subclass of Socket can also pass in a SocketImpl + * to the Socket(SocketImpl) constructor to use an + * implementation different from the system default without installing + * a factory. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Per Bothner + */ public abstract class SocketImpl implements SocketOptions { + /** + * The address of the remote end of the socket connection + */ protected InetAddress address; + /** + * A FileDescriptor object representing this socket connection. + */ protected FileDescriptor fd; + /** + * The port number the socket is bound to locally + */ protected int localport; + /** + * The port number of the remote end of the socket connection + */ protected int port; ! /** ! * Default, no-argument constructor for use by subclasses. ! */ ! public SocketImpl() { } ! /** ! * Creates a new socket that is not bound to any local address/port and ! * is not connected to any remote address/port. This will be created as ! * a stream socket if the stream parameter is true, or a datagram socket ! * if the stream parameter is false. ! * ! * @param stream true for a stream socket, false for a datagram socket ! */ ! protected abstract void create(boolean stream) throws IOException; ! /** ! * Connects to the remote hostname and port specified as arguments. ! * ! * @param host The remote hostname to connect to ! * @param port The remote port to connect to ! * ! * @exception IOException If an error occurs ! */ ! protected abstract void connect(String host, int port) throws IOException; ! /** ! * Connects to the remote address and port specified as arguments. ! * ! * @param host The remote address to connect to ! * @param port The remote port to connect to ! * ! * @exception IOException If an error occurs ! */ ! protected abstract void connect(InetAddress host, int port) throws IOException; ! /** ! * Binds to the specified port on the specified addr. Note that this addr ! * must represent a local IP address. ! *

    ! * Note that it is unspecified how to bind to all interfaces on the localhost ! * (INADDR_ANY). ! * ! * @param host The address to bind to ! * @param port The port number to bind to ! * ! * @exception IOException If an error occurs ! */ ! protected abstract void bind(InetAddress host, int port) throws IOException; ! /** ! * Starts listening for connections on a socket. The backlog parameter ! * is how many pending connections will queue up waiting to be serviced ! * before being accept'ed. If the queue of pending requests exceeds this ! * number, additional connections will be refused. ! * ! * @param backlog The length of the pending connection queue ! * ! * @exception IOException If an error occurs ! */ ! protected abstract void listen(int backlog) throws IOException; ! /** ! * Accepts a connection on this socket. ! * ! * @param s The implementation object for the accepted connection. ! * ! * @exception IOException If an error occurs ! */ ! protected abstract void accept(SocketImpl s) throws IOException; + /** + * Returns an InputStream object for reading from this socket. + * + * @return An InputStream for reading from this socket. + * + * @exception IOException If an error occurs + */ protected abstract InputStream getInputStream() throws IOException; + /** + * Returns an OutputStream object for writing to this socket + * + * @return An OutputStream for writing to this socket. + * + * @exception IOException If an error occurs. + */ protected abstract OutputStream getOutputStream() throws IOException; ! /** ! * Returns the number of bytes that the caller can read from this socket ! * without blocking. ! * ! * @return The number of readable bytes before blocking ! * ! * @exception IOException If an error occurs ! */ ! protected abstract int available() throws IOException; ! /** ! * Closes the socket. This will normally cause any resources, such as the ! * InputStream, OutputStream and associated file descriptors to be freed. ! *

    ! * Note that if the SO_LINGER option is set on this socket, then the ! * operation could block. ! * ! * @exception IOException If an error occurs ! */ ! protected abstract void close() throws IOException; ! /** ! * Returns the FileDescriptor objects for this socket. ! * ! * @return A FileDescriptor for this socket. ! */ ! protected FileDescriptor getFileDescriptor() { return fd; } ! /** ! * Returns the remote address this socket is connected to ! * ! * @return The remote address ! */ ! protected InetAddress getInetAddress() { return address; } ! /** ! * Returns the remote port this socket is connected to ! * ! * @return The remote port ! */ ! protected int getPort() { return port; } ! /** ! * Returns the local port this socket is bound to ! * ! * @return The local port ! */ ! protected int getLocalPort() { return localport; } ! /** ! * Returns a String representing the remote host and port of ! * this socket. ! * ! * @return A String for this socket. ! */ ! public String toString() ! { ! return "[addr=" + address.toString() + ",port=" + Integer.toString(port) ! + ",localport=" + Integer.toString(localport) + "]"; ! } ! /** ! * Sets the specified option on a socket to the passed in object. For ! * options that take an integer argument, the passed in object is an ! * Integer. For options that are set to on or off, the ! * value passed will be a Boolean. The option_id ! * parameter is one of the defined constants in the superinterface. ! * ! * @param option_id The identifier of the option ! * @param val The value to set the option to ! * ! * @exception SocketException If an error occurs ! * @XXX This redeclaration from SocketOptions is a workaround to a gcj bug. ! */ ! public abstract void setOption(int option_id, Object val) throws SocketException; ! /** ! * Returns the current setting of the specified option. The ! * Object returned will be an Integer for options ! * that have integer values. For options that are set to on or off, a ! * Boolean will be returned. The option_id ! * is one of the defined constants in the superinterface. ! * ! * @param option_id The option identifier ! * ! * @return The current value of the option ! * ! * @exception SocketException If an error occurs ! * @XXX This redeclaration from SocketOptions is a workaround to a gcj bug. ! */ ! public abstract Object getOption(int option_id) throws SocketException; } diff -Nrc3pad gcc-3.0.4/libjava/java/net/SocketImplFactory.java gcc-3.1/libjava/java/net/SocketImplFactory.java *** gcc-3.0.4/libjava/java/net/SocketImplFactory.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/SocketImplFactory.java Tue Jan 22 22:40:23 2002 *************** *** 1,25 **** ! // SocketImplFactory.java - Abstract socket implementation factory. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Per Bothner ! * @date January 6, 1999. ! */ /** Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ ! public abstract interface SocketImplFactory { ! public SocketImpl createSocketImpl (); ! } --- 1,63 ---- ! /* SocketImplFactory.java -- Interface to create a SocketImpl object ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.net; /** Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ ! /** ! * This interface defines one method which returns a SocketImpl object. ! * This should not be needed by ordinary applications. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Per Bothner ! */ ! public interface SocketImplFactory { ! /** ! * This method returns an instance of the SocketImpl object ! * ! * @return A SocketImpl object ! */ ! SocketImpl ! createSocketImpl(); ! ! } // interface SocketImplFactory ! diff -Nrc3pad gcc-3.0.4/libjava/java/net/SocketOptions.java gcc-3.1/libjava/java/net/SocketOptions.java *** gcc-3.0.4/libjava/java/net/SocketOptions.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/SocketOptions.java Tue Jan 22 22:40:23 2002 *************** *** 1,40 **** ! // SocketOptions.java - Interface for get/set socket options. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date May 3, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ ! public abstract interface SocketOptions { - public static final int TCP_NODELAY = 0x1; - public static final int SO_BINDADDR = 0xF; - public static final int SO_REUSEADDR = 0x4; - public static final int IP_MULTICAST_IF = 0x10; - public static final int SO_LINGER = 0x80; - public static final int SO_TIMEOUT = 0x1006; ! // JDK1.2 ! public static final int SO_SNDBUF = 0x1001; ! // JDK1.2 ! public static final int SO_RCVBUF = 0x1002; - public void setOption(int optID, Object value) throws SocketException; - public Object getOption(int optID) throws SocketException; - } --- 1,146 ---- ! /* SocketOptions.java -- Implements options for sockets (duh!) ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ ! /** ! * This interface is used by SocketImpl and ! * DatagramSocketImpl to implement options ! * on sockets. ! * ! * @since 1.2 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ ! public interface SocketOptions { ! /*************************************************************************/ ! /* ! * Static Variables ! */ ! ! /** ! * Option id for the SO_LINGER value ! */ ! static final int SO_LINGER = 0x80; // 128 ! ! /** ! * Option id for the SO_TIMEOUT value ! */ ! static final int SO_TIMEOUT = 0x1006; // 4102 ! ! /** ! * Retrieve the local address to which the socket is bound. ! */ ! static final int SO_BINDADDR = 0x0F; // 15 ! ! /** ! * Option id for the send buffer size ! * @since 1.2 ! */ ! static final int SO_SNDBUF = 0x1001; // 4097 ! ! /** ! * Option id for the receive buffer size ! * @since 1.2 ! */ ! static final int SO_RCVBUF = 0x1002; // 4098 ! ! /** ! * Sets the SO_REUSEADDR parameter on a socket ! */ ! static final int SO_REUSEADDR = 0x04; // 4 ! ! /** ! * Option id for the TCP_NODELAY value ! */ ! static final int TCP_NODELAY = 0x01; // 1 ! ! /** ! * Options id for the IP_MULTICAST_IF value ! */ ! static final int IP_MULTICAST_IF = 0x10; // 16 ! ! /*************************************************************************/ ! ! /* ! * Interface Methods ! */ ! ! /** ! * Sets the specified option on a socket to the passed in object. For ! * options that take an integer argument, the passed in object is an ! * Integer. For options that are set to on or off, the ! * value passed will be a Boolean. The option_id ! * parameter is one of the defined constants in this interface. ! * ! * @param option_id The identifier of the option ! * @param val The value to set the option to ! * ! * @exception SocketException If an error occurs ! */ ! void ! setOption(int option_id, Object val) throws SocketException; ! ! /*************************************************************************/ ! ! /** ! * Returns the current setting of the specified option. The ! * Object returned will be an Integer for options ! * that have integer values. For options that are set to on or off, a ! * Boolean will be returned. The option_id ! * is one of the defined constants in this interface. ! * ! * @param option_id The option identifier ! * ! * @return The current value of the option ! * ! * @exception SocketException If an error occurs ! */ ! Object ! getOption(int option_id) throws SocketException; ! ! } // interface SocketOptions diff -Nrc3pad gcc-3.0.4/libjava/java/net/SocketPermission.java gcc-3.1/libjava/java/net/SocketPermission.java *** gcc-3.0.4/libjava/java/net/SocketPermission.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/net/SocketPermission.java Tue Jan 22 22:40:23 2002 *************** *** 0 **** --- 1,388 ---- + /* SocketPermission.java -- Class modeling permissions for socket operations + Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.net; + + import java.security.Permission; + import java.security.PermissionCollection; + + /** + * This class models a specific set of permssions for connecting to a + * host. There are two elements to this, the host/port combination and + * the permission list. + *

    + * The host/port combination is specified as followed + *

    + *

    +  * hostname[:[-]port[-[port]]]
    +  * 
    + *

    + * The hostname portion can be either a hostname or IP address. If it is + * a hostname, a wildcard is allowed in hostnames. This wildcard is a "*" + * and matches one or more characters. Only one "*" may appear in the + * host and it must be the leftmost character. For example, + * "*.urbanophile.com" matches all hosts in the "urbanophile.com" domain. + *

    + * The port portion can be either a single value, or a range of values + * treated as inclusive. The first or the last port value in the range + * can be omitted in which case either the minimum or maximum legal + * value for a port (respectively) is used by default. Here are some + * examples: + *

      + *
    • 8080 - Represents port 8080 only + *
    • 2000-3000 - Represents ports 2000 through 3000 inclusive + *
    • -4000 - Represents ports 0 through 4000 inclusive + *
    • 1024- - Represents ports 1024 through 65535 inclusive + *

    + * The permission list is a comma separated list of individual permissions. + * These individual permissions are: + *

    + * accept
    + * connect
    + * listen
    + * resolve
    + *

    + * The "listen" permission is only relevant if the host is localhost. If + * any permission at all is specified, then resolve permission is implied to + * exist. + *

    + * Here are a variety of examples of how to create SocketPermission's + *

    +  * SocketPermission("www.urbanophile.com", "connect");
    +  *   Can connect to any port on www.urbanophile.com
    +  * SocketPermission("www.urbanophile.com:80", "connect,accept");
    +  *   Can connect to or accept connections from www.urbanophile.com on port 80
    +  * SocketPermission("localhost:1024-", "listen,accept,connect");
    +  *   Can connect to, accept from, an listen on any local port number 1024 and up.
    +  * SocketPermission("*.edu", "connect");
    +  *   Can connect to any host in the edu domain
    +  * SocketPermission("197.197.20.1", "accept");
    +  *   Can accept connections from 197.197.20.1
    +  * 

    + * + * @since 1.2 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public final class SocketPermission extends Permission + implements java.io.Serializable + { + + // FIXME: Needs serialization work, including readObject/writeObject methods. + /** + * A hostname/port combination as described above + */ + private transient String hostport; + + /** + * A comma separated list of actions for which we have permission + */ + private String actions; + + /** + * Initializes a new instance of SocketPermission with the + * specified host/port combination and actions string. + * + * @param hostport The hostname/port number combination + * @param perms The actions string + */ + public SocketPermission(String hostport, String actions) + { + super(hostport); + + this.hostport = hostport; + this.actions = actions; + } + + /** + * Tests this object for equality against another. This will be true if + * and only if the passed object is an instance of + * SocketPermission and both its hostname/port combination + * and permissions string are identical. + * + * @param obj The object to test against for equality + * + * @return true if object is equal to this object, + * false otherwise. + */ + public boolean equals(Object obj) + { + if (obj == null) + return (false); + + if (!(obj instanceof SocketPermission)) + return (false); + + if (((SocketPermission) obj).hostport.equals(hostport)) + if (((SocketPermission) obj).actions.equals(actions)) + return (true); + + return (false); + } + + /** + * Returns a hash code value for this object. Overrides the + * Permission.hashCode() + * + * @return A hash code + */ + public int hashCode() + { + int hash = 100; + + // FIXME: Get a real hash function + for (int i = 0; i < hostport.length(); i++) + hash = hash + (int) hostport.charAt(i) * 7; + + return (hash); + } + + /** + * Returns the list of permission actions in this object in canonical + * order. The canonical order is "connect,listen,accept,resolve" + * + * @return The permitted action string. + */ + public String getActions() + { + boolean found = false; + StringBuffer sb = new StringBuffer(""); + + if (actions.indexOf("connect") != -1) + { + sb.append("connect"); + found = true; + } + + if (actions.indexOf("listen") != -1) + if (found) + sb.append(",listen"); + else + { + sb.append("listen"); + found = true; + } + + if (actions.indexOf("accept") != -1) + if (found) + sb.append(",accept"); + else + { + sb.append("accept"); + found = true; + } + + if (found) + sb.append(",resolve"); + else if (actions.indexOf("resolve") != -1) + sb.append("resolve"); + + return (sb.toString()); + } + + /** + * Returns a new PermissionCollection object that can hold + * SocketPermission's. + * + * @return A new PermissionCollection. + */ + public PermissionCollection newPermissionCollection() + { + // FIXME: Implement + + return (null); + } + + /** + * Returns true if the permission object passed it is implied by the + * this permission. This will be true if + *

      + *
    • The argument is of type SocketPermission + *
    • The actions list of the argument are in this object's actions + *
    • The port range of the argument is within this objects port range + *
    • The hostname is equal to or a subset of this objects hostname + *
    + *

    + * The argument's hostname will be a subset of this object's hostname if: + *

      + *
    • The argument's hostname or IP address is equal to this object's. + *
    • The argument's canonical hostname is equal to this object's. + *
    • The argument's canonical name matches this domains hostname with wildcards + *
    + * + * @param perm The Permission to check against + * + * @return true if the Permission is implied by + * this object, false otherwise. + */ + public boolean implies(Permission perm) + { + SocketPermission p; + + // First make sure we are the right object type + if (perm instanceof SocketPermission) + p = (SocketPermission) perm; + else + return (false); + + // Next check the actions + String ourlist = getActions(); + String theirlist = p.getActions(); + + if (!ourlist.startsWith(theirlist)) + return (false); + + // Now check ports + int ourfirstport = 0, ourlastport = 0, theirfirstport = 0, theirlastport = + 0; + + // Get ours + if (hostport.indexOf(":") == -1) + { + ourfirstport = 0; + ourlastport = 65535; + } + else + { + // FIXME: Needs bulletproofing. + // This will dump if hostport if all sorts of bad data was passed to + // the constructor + String range = hostport.substring(hostport.indexOf(":") + 1); + if (range.startsWith("-")) + ourfirstport = 0; + else if (range.indexOf("-") == -1) + ourfirstport = Integer.parseInt(range); + else + ourfirstport = + Integer.parseInt(range.substring(0, range.indexOf("-"))); + + if (range.endsWith("-")) + ourlastport = 65535; + else if (range.indexOf("-") == -1) + ourlastport = Integer.parseInt(range); + else + ourlastport = + Integer.parseInt(range. + substring(range.indexOf("-") + 1, + range.length())); + } + + // Get theirs + if (p.hostport.indexOf(":") == -1) + { + theirfirstport = 0; + ourlastport = 65535; + } + else + { + // This will dump if hostport if all sorts of bad data was passed to + // the constructor + String range = p.hostport.substring(hostport.indexOf(":") + 1); + if (range.startsWith("-")) + theirfirstport = 0; + else if (range.indexOf("-") == -1) + theirfirstport = Integer.parseInt(range); + else + theirfirstport = + Integer.parseInt(range.substring(0, range.indexOf("-"))); + + if (range.endsWith("-")) + theirlastport = 65535; + else if (range.indexOf("-") == -1) + theirlastport = Integer.parseInt(range); + else + theirlastport = + Integer.parseInt(range. + substring(range.indexOf("-") + 1, + range.length())); + } + + // Now check them + if ((theirfirstport < ourfirstport) || (theirlastport > ourlastport)) + return (false); + + // Finally we can check the hosts + String ourhost, theirhost; + + // Get ours + if (hostport.indexOf(":") == -1) + ourhost = hostport; + else + ourhost = hostport.substring(0, hostport.indexOf(":")); + + // Get theirs + if (p.hostport.indexOf(":") == -1) + theirhost = p.hostport; + else + theirhost = p.hostport.substring(0, p.hostport.indexOf(":")); + + // Are they equal? + if (ourhost.equals(theirhost)) + return (true); + + // Try the canonical names + String ourcanonical = null, theircanonical = null; + try + { + ourcanonical = InetAddress.getByName(ourhost).getHostName(); + theircanonical = InetAddress.getByName(theirhost).getHostName(); + } + catch (UnknownHostException e) + { + // Who didn't resolve? Just assume current address is canonical enough + // Is this ok to do? + if (ourcanonical == null) + ourcanonical = ourhost; + if (theircanonical == null) + theircanonical = theirhost; + } + + if (ourcanonical.equals(theircanonical)) + return (true); + + // Well, last chance. Try for a wildcard + if (ourhost.indexOf("*.") != -1) + { + String wild_domain = ourhost.substring(ourhost.indexOf("*" + 1)); + if (theircanonical.endsWith(wild_domain)) + return (true); + } + + // Didn't make it + return (false); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/net/URL.java gcc-3.1/libjava/java/net/URL.java *** gcc-3.0.4/libjava/java/net/URL.java Fri Sep 8 19:37:09 2000 --- gcc-3.1/libjava/java/net/URL.java Sat Feb 23 00:15:48 2002 *************** *** 1,6 **** // URL.java - A Uniform Resource Locator. ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // URL.java - A Uniform Resource Locator. ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation This file is part of libgcj. *************** public final class URL implements Serial *** 76,82 **** this.handler = setURLStreamHandler(protocol); if (this.handler == null) ! throw new MalformedURLException("Handler for protocol not found"); this.host = host; --- 76,82 ---- this.handler = setURLStreamHandler(protocol); if (this.handler == null) ! throw new MalformedURLException("Protocol handler not found: " + protocol); this.host = host; *************** public final class URL implements Serial *** 175,181 **** this.handler = setURLStreamHandler(protocol); if (this.handler == null) ! throw new MalformedURLException("Handler for protocol not found"); // JDK 1.2 doc for parseURL specifically states that any '#' ref // is to be excluded by passing the 'limit' as the indexOf the '#' --- 175,181 ---- this.handler = setURLStreamHandler(protocol); if (this.handler == null) ! throw new MalformedURLException("Protocol handler not found: " + protocol); // JDK 1.2 doc for parseURL specifically states that any '#' ref // is to be excluded by passing the 'limit' as the indexOf the '#' *************** public final class URL implements Serial *** 219,224 **** --- 219,230 ---- return file; } + public String getPath() + { + int quest = file.indexOf('?'); + return quest < 0 ? file : file.substring(0, quest); + } + public String getHost() { return host; *************** public final class URL implements Serial *** 274,289 **** public boolean sameFile(URL other) { ! // This comparison is very conservative. It assumes that any ! // field can be null. ! return (other != null ! && port == other.port ! && ((protocol == null && other.protocol == null) ! || (protocol != null && protocol.equals(other.protocol))) ! && ((host == null && other.host == null) ! || (host != null && host.equals(other.host))) ! && ((file == null && other.file == null) ! || (file != null && file.equals(other.file)))); } protected void set(String protocol, String host, int port, String file, --- 280,286 ---- public boolean sameFile(URL other) { ! return handler.sameFile(this, other); } protected void set(String protocol, String host, int port, String file, *************** public final class URL implements Serial *** 339,344 **** --- 336,345 ---- // If a non-default factory has been set, use it to find the protocol. if (factory != null) handler = factory.createURLStreamHandler(protocol); + else if (protocol.equals ("core")) + { + handler = new gnu.gcj.protocol.core.Handler (); + } else if (protocol.equals ("file")) { // This is an interesting case. It's tempting to think that we diff -Nrc3pad gcc-3.0.4/libjava/java/net/URLDecoder.java gcc-3.1/libjava/java/net/URLDecoder.java *** gcc-3.0.4/libjava/java/net/URLDecoder.java Mon Jan 15 07:58:16 2001 --- gcc-3.1/libjava/java/net/URLDecoder.java Tue Jan 22 22:40:23 2002 *************** along with GNU Classpath; see the file C *** 18,83 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.net; import java.io.UnsupportedEncodingException; ! /** ! * This utility class contains one static method that converts a * string encoded in the x-www-form-urlencoded format to the original ! * text. The x-www-form-urlencoded format ! * replaces certain disallowed characters with ! * encoded equivalents. All upper case and lower case letters in the ! * US alphabet remain as is, the space character (' ') is replaced with ! * '+' sign, and all other characters are converted to a "%XX" format ! * where XX is the hexadecimal representation of that character. Note ! * that since unicode characters are 16 bits, and this method encodes only ! * 8 bits of information, the lower 8 bits of the character are used. *

    * This method is very useful for decoding strings sent to CGI scripts * ! * Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. * * @since 1.2 * * @author Warren Levy * @author Aaron M. Renn (arenn@urbanophile.com) (documentation comments) ! * @date April 22, 1999. */ public class URLDecoder { ! /** * This method translates the passed in string from x-www-form-urlencoded ! * format and returns it. * ! * @param source The String to convert * ! * @return The converted String */ public static String decode(String s) { String str = s.replace('+', ' '); ! String result = ""; int i; int start = 0; while ((i = str.indexOf('%', start)) >= 0) { ! result = result + str.substring(start, i) + ! (char) Integer.parseInt(str.substring(i + 1, i + 3), 16); ! start = i + 3; } if (start < str.length()) ! result = result + str.substring(start); ! return result; } - } // class URLDecoder --- 18,169 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; import java.io.UnsupportedEncodingException; ! /** ! * This utility class contains static methods that converts a * string encoded in the x-www-form-urlencoded format to the original ! * text. The x-www-form-urlencoded format replaces certain disallowed ! * characters with encoded equivalents. All upper case and lower case ! * letters in the US alphabet remain as is, the space character (' ') ! * is replaced with '+' sign, and all other characters are converted to a ! * "%XX" format where XX is the hexadecimal representation of that character ! * in a given character encoding (default is "UTF-8"). *

    * This method is very useful for decoding strings sent to CGI scripts * ! * Written using on-line Java Platform 1.2/1.4 API Specification. * Status: Believed complete and correct. * * @since 1.2 * * @author Warren Levy * @author Aaron M. Renn (arenn@urbanophile.com) (documentation comments) ! * @author Mark Wielaard (mark@klomp.org) */ public class URLDecoder { ! /** * This method translates the passed in string from x-www-form-urlencoded ! * format using the default encoding "UTF-8" to decode the hex encoded ! * unsafe characters. * ! * @param s the String to convert * ! * @return the converted String */ public static String decode(String s) { + try + { + return decode(s, "UTF-8"); + } + catch (UnsupportedEncodingException uee) + { + // Should never happen since UTF-8 encoding should always be supported + return s; + } + } + + /** + * This method translates the passed in string from x-www-form-urlencoded + * format using the given character encoding to decode the hex encoded + * unsafe characters. + *

    + * This implementation will decode the string even if it contains + * unsafe characters (characters that should have been encoded) or if the + * two characters following a % do not represent a hex encoded byte. + * In those cases the unsafe character or the % character will be added + * verbatim to the decoded result. + * + * @param s the String to convert + * @param encoding the character encoding to use the decode the hex encoded + * unsafe characters + * + * @return the converted String + * + * @since 1.4 + */ + public static String decode(String s, String encoding) + throws UnsupportedEncodingException + { + StringBuffer result = new StringBuffer(); + + // First convert all '+' characters to spaces. String str = s.replace('+', ' '); ! ! // Then go through the whole string looking for byte encoded characters int i; int start = 0; + byte[] bytes = null; + int length = str.length(); while ((i = str.indexOf('%', start)) >= 0) { ! // Add all non-encoded characters to the result buffer ! result.append(str.substring(start, i)); ! start = i; ! ! // Get all consecutive encoded bytes ! while ((i+2 < length) && (str.charAt(i) == '%')) ! i += 3; ! ! // Decode all these bytes ! if ((bytes == null) || (bytes.length < ((i-start)/3))) ! bytes = new byte[((i-start)/3)]; ! ! int index = 0; ! try ! { ! while (start < i) ! { ! String sub = str.substring(start + 1, start + 3); ! bytes[index] = (byte)Integer.parseInt(sub, 16); ! index++; ! start += 3; ! } ! } ! catch (NumberFormatException nfe) ! { ! // One of the hex encoded strings was bad ! } ! ! // Add the bytes as characters according to the given encoding ! result.append(new String(bytes, 0, index, encoding)); ! ! // Make sure we skip to just after a % sign ! // There might not have been enough encoded characters after the % ! // or the hex chars were not actually hex chars (NumberFormatException) ! if (start < length && s.charAt(start) == '%') ! { ! result.append('%'); ! start++; ! } } + // Add any characters left if (start < str.length()) ! result.append(str.substring(start)); ! return result.toString(); } + } // class URLDecoder diff -Nrc3pad gcc-3.0.4/libjava/java/net/URLEncoder.java gcc-3.1/libjava/java/net/URLEncoder.java *** gcc-3.0.4/libjava/java/net/URLEncoder.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/URLEncoder.java Tue Jan 22 22:40:23 2002 *************** *** 1,71 **** ! // URLEncoder.java - Provides a method for encoding strings according to ! // application/x-www-form-urlencoded MIME type. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.net; - import java.io.UnsupportedEncodingException; ! /** ! * @author Warren Levy ! * @date April 22, 1999. ! */ /** ! * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ public class URLEncoder { ! // This method, per the JCL, is conservative in that it encodes ! // some "allowable" characters as % triplets. public static String encode(String s) { - // Get the bytes in ISO-Latin-1 (i.e. 8859_1) per the JCL. - // Even though it is the default in most cases, it's specified here - // just in case System.getProperty("file.encoding") is not "8859_1". - String result = ""; try { ! byte[] buf = s.getBytes("8859_1"); ! int start = 0; ! for (int i = 0; i < buf.length; i++) ! // For efficiency, check the byte in order of most likely ! // possibility so as to minimize the number of comparisons. ! // Hence, exclude all the alphanumeric & allowed special chars first. ! if ((buf[i] >= 'a' && buf[i] <= 'z') || ! (buf[i] >= 'A' && buf[i] <= 'Z') || ! (buf[i] >= '0' && buf[i] <= '9') || ! buf[i] == '-' || buf[i] == '_' || buf[i] == '.' || buf[i] == '*') ! ; // This is the most likely case so exclude first for efficiency. ! else if (buf[i] == ' ') ! buf[i] = (byte) '+'; // Replace space char with plus symbol. ! else ! { ! result = result + new String(buf, start, i - start, "8859_1") + ! "%" + Integer.toHexString(((int) buf[i]) & 0xFF); ! start = i + 1; ! } ! ! // Append remainder of allowable chars from the string, if any. ! if (start < buf.length) ! result = result + ! new String(buf, start, buf.length - start, "8859_1"); } ! catch (UnsupportedEncodingException ex) { ! // This should never happen as "8859_1" is the default encoding. return s; } ! return result; } ! } --- 1,164 ---- ! /* URLEncoder.java -- Class to convert strings to a properly encoded URL ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.net; ! import java.io.UnsupportedEncodingException; /** ! * Written using on-line Java Platform 1.2/1.4 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ + /** + * This utility class contains static methods that converts a + * string into a fully encoded URL string in x-www-form-urlencoded + * format. This format replaces certain disallowed characters with + * encoded equivalents. All upper case and lower case letters in the + * US alphabet remain as is, the space character (' ') is replaced with + * '+' sign, and all other characters are converted to a "%XX" format + * where XX is the hexadecimal representation of that character in a + * certain encoding (by default "UTF-8"). + *

    + * This method is very useful for encoding strings to be sent to CGI scripts + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @author Mark Wielaard (mark@klomp.org) + */ public class URLEncoder { ! /** ! * This method translates the passed in string into x-www-form-urlencoded ! * format using the standard "UTF-8" character encoding to hex-encode the ! * unsafe characters. ! * ! * @param s The String to convert ! * ! * @return The converted String ! */ public static String encode(String s) { try { ! return encode(s, "UTF-8"); } ! catch (UnsupportedEncodingException uee) { ! // Should never happen since UTF-8 should always be supported return s; } + } ! /** ! * This method translates the passed in string into x-www-form-urlencoded ! * format using the character encoding to hex-encode the unsafe characters. ! * ! * @param s The String to convert ! * @param encoding The encoding to use for unsafe characters ! * ! * @return The converted String ! * ! * @since 1.4 ! */ ! public static String encode(String s, String encoding) ! throws UnsupportedEncodingException ! { ! StringBuffer result = new StringBuffer(); ! int length = s.length(); ! int start = 0; ! int i = 0; ! ! while (true) ! { ! while ( i < length && isSafe(s.charAt(i)) ) ! i++; ! ! // Safe character can just be added ! result.append(s.substring(start, i)); ! ! // Are we done? ! if (i >= length) ! return result.toString(); ! else if (s.charAt(i) == ' ') ! { ! result.append('+'); // Replace space char with plus symbol. ! i++; ! } ! else ! { ! // Get all unsafe characters ! start = i; ! char c; ! while ( i < length && (c = s.charAt(i)) != ' ' && !isSafe(c) ) ! i++; ! ! // Convert them to %XY encoded strings ! String unsafe = s.substring(start,i); ! byte bytes[] = unsafe.getBytes(encoding); ! for (int j = 0; j < bytes.length; j++) ! { ! result.append('%'); ! result.append(Integer.toHexString(((int) bytes[j]) & 0xFF)); ! } ! } ! start = i; ! } } ! ! /** ! * Private static method that returns true if the given char is either ! * a uppercase or lowercase letter from 'a' till 'z', or a digit froim ! * '0' till '9', or one of the characters '-', '_', '.' or '*'. Such ! * 'safe' character don't have to be url encoded. ! */ ! private static boolean isSafe(char c) ! { ! return ((c >= 'a' && c <= 'z') || ! (c >= 'A' && c <= 'Z') || ! (c >= '0' && c <= '9') || ! c == '-' || c == '_' || c == '.' || c == '*'); ! } ! ! /** ! * Private constructor that does nothing. Included to avoid a default ! * public constructor being created by the compiler. ! */ ! private URLEncoder() { } ! ! } // class URLEncoder diff -Nrc3pad gcc-3.0.4/libjava/java/net/URLStreamHandler.java gcc-3.1/libjava/java/net/URLStreamHandler.java *** gcc-3.0.4/libjava/java/net/URLStreamHandler.java Mon Mar 19 23:23:44 2001 --- gcc-3.1/libjava/java/net/URLStreamHandler.java Sat Feb 23 00:15:48 2002 *************** *** 1,6 **** // URLStreamHandler.java - Superclass of all stream protocol handlers. ! /* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // URLStreamHandler.java - Superclass of all stream protocol handlers. ! /* Copyright (C) 1999, 2002 Free Software Foundation This file is part of libgcj. *************** public abstract class URLStreamHandler *** 84,100 **** else if (file == null || file.length() <= 0) { // No file context available; just spec for file. ! file = "/" + spec.substring(start, limit); } else if (start < limit) { // Context is available, but only override it if there is a new file. - // FIXME: unsure to what extent `/` and File.separatorChar - // can mix in URLs. Ignore File.separatorChar for now. file = file.substring(0, file.lastIndexOf('/')) ! + "/" + spec.substring(start, limit); } int index; // Replace "/./" with "/". This probably isn't very efficient in --- 84,103 ---- else if (file == null || file.length() <= 0) { // No file context available; just spec for file. ! file = spec.substring(start, limit); } else if (start < limit) { // Context is available, but only override it if there is a new file. file = file.substring(0, file.lastIndexOf('/')) ! + '/' + spec.substring(start, limit); } + u.set(u.getProtocol(), host, port, file, u.getRef()); + } + + private static String canonicalizeFilename(String file) + { int index; // Replace "/./" with "/". This probably isn't very efficient in *************** public abstract class URLStreamHandler *** 113,122 **** else break; } ! ! u.set(u.getProtocol(), host, port, file, u.getRef()); } ! protected void setURL(URL u, String protocol, String host, int port, String file, String ref) { --- 116,148 ---- else break; } ! return file; } ! ! public boolean sameFile(URL url1, URL url2) ! { ! if (url1 == url2) ! return true; ! // This comparison is very conservative. It assumes that any ! // field can be null. ! if (url1 == null || url2 == null || url1.getPort() != url2.getPort()) ! return false; ! String s1, s2; ! s1 = url1.getProtocol(); ! s2 = url2.getProtocol(); ! if (s1 != s2 && (s1 == null || ! s1.equals(s2))) ! return false; ! s1 = url1.getHost(); ! s2 = url2.getHost(); ! if (s1 != s2 && (s1 == null || ! s1.equals(s2))) ! return false; ! s1 = canonicalizeFilename(url1.getFile()); ! s2 = canonicalizeFilename(url2.getFile()); ! if (s1 != s2 && (s1 == null || ! s1.equals(s2))) ! return false; ! return true; ! } ! protected void setURL(URL u, String protocol, String host, int port, String file, String ref) { diff -Nrc3pad gcc-3.0.4/libjava/java/net/URLStreamHandlerFactory.java gcc-3.1/libjava/java/net/URLStreamHandlerFactory.java *** gcc-3.0.4/libjava/java/net/URLStreamHandlerFactory.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/URLStreamHandlerFactory.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // URLStreamHandlerFactory.java - Abstract URL Stream Handler factory. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,41 ---- ! /* URLStreamHandlerFactory.java -- Maps protocols to URLStreamHandlers ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,27 **** * Status: Believed complete and correct. */ ! public abstract interface URLStreamHandlerFactory { ! public URLStreamHandler createURLStreamHandler(String protocol); ! } --- 43,68 ---- * Status: Believed complete and correct. */ ! /** ! * This interface contains one method which maps the protocol portion of ! * a URL (eg, "http" in "http://www.urbanophile.com/arenn/") to a ! * URLStreamHandler object. ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! * @author Warren Levy ! */ ! public interface URLStreamHandlerFactory { ! /** ! * This method maps the protocol portion of a URL to a URLStreamHandler ! * object. ! * ! * @param protocol The protocol name to map ("http", "ftp", etc). ! * ! * @return The URLStreamHandler for the specified protocol ! */ ! URLStreamHandler ! createURLStreamHandler(String protocol); ! ! } // interface URLStreamHandlerFactory ! diff -Nrc3pad gcc-3.0.4/libjava/java/net/UnknownHostException.java gcc-3.1/libjava/java/net/UnknownHostException.java *** gcc-3.0.4/libjava/java/net/UnknownHostException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/UnknownHostException.java Tue Jan 22 22:40:23 2002 *************** *** 1,34 **** ! // UnknownHostException.java ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Per Bothner ! * @date January 6, 1999. ! */ /* * Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ public class UnknownHostException extends java.io.IOException { - public UnknownHostException () - { - super(); - } ! public UnknownHostException (String host) ! { ! super(host); ! } } --- 1,88 ---- ! /* UnknownHostException.java -- The hostname is not unknown ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /* * Written using on-line Java Platform 1.2 API Specification. * Status: Believed complete and correct. */ + /** + * This exception indicates that an attempt was made to reference a hostname + * or IP address that is not valid. This could possibly indicate that a + * DNS problem has occurred, but most often means that the host was not + * correctly specified. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Per Bothner + * @date January 6, 1999. + */ public class UnknownHostException extends java.io.IOException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of UnknownHostException ! * without a descriptive error message. ! */ ! public ! UnknownHostException() ! { ! super(); } + + /*************************************************************************/ + + /** + * Initializes a new instance of UnknownHostException + * with a descriptive error message, such as the name of the host + * that could not be resolved. + * + * @param message A message describing the error that occurrred. + */ + public + UnknownHostException(String message) + { + super(message); + } + + } // class UnknownHostException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/UnknownServiceException.java gcc-3.1/libjava/java/net/UnknownServiceException.java *** gcc-3.0.4/libjava/java/net/UnknownServiceException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/net/UnknownServiceException.java Tue Jan 22 22:40:23 2002 *************** *** 1,19 **** ! // UnknownServiceException.java ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.net; ! /** ! * @author Warren Levy ! * @date March 5, 1999. ! */ /** * Written using on-line Java Platform 1.2 API Specification, as well --- 1,41 ---- ! /* UnknownServiceException.java -- A service error occurred ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.net; /** * Written using on-line Java Platform 1.2 API Specification, as well *************** package java.net; *** 21,35 **** * Status: Believed complete and correct. */ public class UnknownServiceException extends java.io.IOException { - public UnknownServiceException() - { - super(); - } ! public UnknownServiceException(String msg) ! { ! super(msg); ! } } --- 43,88 ---- * Status: Believed complete and correct. */ + /** + * Contrary to what you might think, this does not indicate that the + * TCP/IP service name specified was invalid. Instead it indicates that + * the MIME type returned from a URL could not be determined or that an + * attempt was made to write to a read-only URL. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Warren Levy + * @date March 5, 1999. + */ public class UnknownServiceException extends java.io.IOException { ! /* ! * Constructors ! */ ! ! /** ! * Initializes a new instance of UnknownServiceException ! * without a descriptive error message. ! */ ! public ! UnknownServiceException() ! { ! super(); ! } ! ! /*************************************************************************/ ! ! /** ! * Initializes a new instance of UnknownServiceException ! * without a descriptive error message. ! * ! * @param message A message describing the error that occurred. ! */ ! public ! UnknownServiceException(String message) ! { ! super(message); } + + } // class UnknownServiceException + diff -Nrc3pad gcc-3.0.4/libjava/java/net/natInetAddress.cc gcc-3.1/libjava/java/net/natInetAddress.cc *** gcc-3.0.4/libjava/java/net/natInetAddress.cc Wed Apr 25 20:30:09 2001 --- gcc-3.1/libjava/java/net/natInetAddress.cc Mon Mar 4 20:02:19 2002 *************** *** 1,6 **** // natInetAddress.cc ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // natInetAddress.cc ! /* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 10,19 **** #include ! #ifdef USE_WINSOCK #include #include #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 64 --- 10,20 ---- #include ! #ifdef WIN32 #include #include + #undef STRICT #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 64 *************** details. */ *** 42,48 **** #include #endif ! #endif /* USE_WINSOCK */ #include #include --- 43,49 ---- #include #endif ! #endif /* WIN32 */ #include #include *************** java::net::InetAddress::aton (jstring ho *** 95,101 **** if (len < 100) hostname = buf; else ! hostname = (char*) _Jv_AllocBytesChecked (len+1); JvGetStringUTFRegion (host, 0, host->length(), hostname); buf[len] = '\0'; char* bytes = NULL; --- 96,102 ---- if (len < 100) hostname = buf; else ! hostname = (char*) _Jv_AllocBytes (len+1); JvGetStringUTFRegion (host, 0, host->length(), hostname); buf[len] = '\0'; char* bytes = NULL; *************** java::net::InetAddress::lookup (jstring *** 180,186 **** if (len < 100) hostname = buf; else ! hostname = (char*) _Jv_AllocBytesChecked (len+1); JvGetStringUTFRegion (host, 0, host->length(), hostname); buf[len] = '\0'; #ifdef HAVE_GETHOSTBYNAME_R --- 181,187 ---- if (len < 100) hostname = buf; else ! hostname = (char*) _Jv_AllocBytes (len+1); JvGetStringUTFRegion (host, 0, host->length(), hostname); buf[len] = '\0'; #ifdef HAVE_GETHOSTBYNAME_R *************** java::net::InetAddress::lookup (jstring *** 201,207 **** if (! ok && herr == ERANGE) { size_r *= 2; ! buffer_r = (char *) _Jv_AllocBytesChecked (size_r); } else #endif /* HAVE_STRUCT_HOSTENT_DATA */ --- 202,208 ---- if (! ok && herr == ERANGE) { size_r *= 2; ! buffer_r = (char *) _Jv_AllocBytes (size_r); } else #endif /* HAVE_STRUCT_HOSTENT_DATA */ *************** java::net::InetAddress::lookup (jstring *** 255,261 **** if (! ok && herr == ERANGE) { size_r *= 2; ! buffer_r = (char *) _Jv_AllocBytesChecked (size_r); } else #endif /* HAVE_STRUCT_HOSTENT_DATA */ --- 256,262 ---- if (! ok && herr == ERANGE) { size_r *= 2; ! buffer_r = (char *) _Jv_AllocBytes (size_r); } else #endif /* HAVE_STRUCT_HOSTENT_DATA */ diff -Nrc3pad gcc-3.0.4/libjava/java/net/natPlainDatagramSocketImpl.cc gcc-3.1/libjava/java/net/natPlainDatagramSocketImpl.cc *** gcc-3.0.4/libjava/java/net/natPlainDatagramSocketImpl.cc Wed Aug 1 17:49:21 2001 --- gcc-3.1/libjava/java/net/natPlainDatagramSocketImpl.cc Mon Apr 15 03:21:58 2002 *************** *** 1,4 **** ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1999, 2000, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 8,23 **** #include ! #ifdef USE_WINSOCK ! #include ! #include #include #include #ifndef ENOPROTOOPT #define ENOPROTOOPT 109 #endif ! #else /* USE_WINSOCK */ ! #include "posix.h" #ifdef HAVE_SYS_SOCKET_H #include #endif --- 8,29 ---- #include ! #include ! ! #ifdef WIN32 #include #include #ifndef ENOPROTOOPT #define ENOPROTOOPT 109 #endif ! ! static inline int ! close(int s) ! { ! return closesocket(s); ! } ! ! #else /* WIN32 */ #ifdef HAVE_SYS_SOCKET_H #include #endif *************** details. */ *** 29,41 **** #endif #include #include ! #endif /* USE_WINSOCK */ #if HAVE_BSTRING_H // Needed for bzero, implicitly used by FD_ZERO on IRIX 5.2 #include #endif // Avoid macro definitions of bind from system headers, e.g. on // Solaris 7 with _XOPEN_SOURCE. FIXME static inline int --- 35,48 ---- #endif #include #include ! #endif /* WIN32 */ #if HAVE_BSTRING_H // Needed for bzero, implicitly used by FD_ZERO on IRIX 5.2 #include #endif + #ifndef DISABLE_JAVA_NET // Avoid macro definitions of bind from system headers, e.g. on // Solaris 7 with _XOPEN_SOURCE. FIXME static inline int *************** _Jv_bind (int fd, struct sockaddr *addr, *** 43,48 **** --- 50,56 ---- { return ::bind (fd, addr, addrlen); } + #endif /* DISABLE_JAVA_NET */ #ifdef bind #undef bind *************** _Jv_bind (int fd, struct sockaddr *addr, *** 50,56 **** #include #include - #include #include #include #include --- 58,63 ---- *************** java::net::PlainDatagramSocketImpl::peek *** 90,95 **** --- 97,109 ---- } void + java::net::PlainDatagramSocketImpl::close () + { + throw new java::io::IOException ( + JvNewStringLatin1 ("DatagramSocketImpl.close: unimplemented")); + } + + void java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket *) { throw new java::io::IOException ( *************** java::net::PlainDatagramSocketImpl::crea *** 184,198 **** char* strerr = strerror (errno); throw new java::net::SocketException (JvNewStringUTF (strerr)); } fnum = sock; - fd = new java::io::FileDescriptor (sock); } void java::net::PlainDatagramSocketImpl::bind (jint lport, java::net::InetAddress *host) { - // FIXME: prob. need to do a setsockopt with SO_BROADCAST to allow multicast. union SockAddr u; struct sockaddr *ptr = (struct sockaddr *) &u.address; // FIXME: Use getaddrinfo() to get actual protocol instead of assuming ipv4. --- 198,215 ---- char* strerr = strerror (errno); throw new java::net::SocketException (JvNewStringUTF (strerr)); } + + _Jv_platform_close_on_exec (sock); + + // We use fnum in place of fd here. From leaving fd null we avoid + // the double close problem in FileDescriptor.finalize. fnum = sock; } void java::net::PlainDatagramSocketImpl::bind (jint lport, java::net::InetAddress *host) { union SockAddr u; struct sockaddr *ptr = (struct sockaddr *) &u.address; // FIXME: Use getaddrinfo() to get actual protocol instead of assuming ipv4. *************** java::net::PlainDatagramSocketImpl::bind *** 231,236 **** --- 248,258 ---- localPort = ntohs (u.address.sin_port); else goto error; + /* Allow broadcast by default. */ + int broadcast = 1; + if (::setsockopt (fnum, SOL_SOCKET, SO_BROADCAST, (char *) &broadcast, + sizeof (broadcast)) != 0) + goto error; return; } error: *************** java::net::PlainDatagramSocketImpl::peek *** 276,281 **** --- 298,317 ---- throw new java::io::IOException (JvNewStringUTF (strerr)); } + // Close(shutdown) the socket. + void + java::net::PlainDatagramSocketImpl::close () + { + // Avoid races from asynchronous finalization. + JvSynchronize sync (this); + + // The method isn't declared to throw anything, so we disregard + // the return value. + ::close (fnum); + fnum = -1; + timeout = 0; + } + void java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket *p) { *************** java::net::PlainDatagramSocketImpl::rece *** 322,327 **** --- 358,365 ---- jbyte *dbytes = elements (p->getData()); ssize_t retlen = 0; + // FIXME: implement timeout support for Win32 + #ifndef WIN32 // Do timeouts via select since SO_RCVTIMEO is not always available. if (timeout > 0) { *************** java::net::PlainDatagramSocketImpl::rece *** 337,342 **** --- 375,381 ---- else if (retval == 0) throw new java::io::InterruptedIOException (); } + #endif /* WIN32 */ retlen = ::recvfrom (fnum, (char *) dbytes, p->getLength(), 0, (sockaddr*) &u, diff -Nrc3pad gcc-3.0.4/libjava/java/net/natPlainSocketImpl.cc gcc-3.1/libjava/java/net/natPlainSocketImpl.cc *** gcc-3.0.4/libjava/java/net/natPlainSocketImpl.cc Wed Aug 1 17:49:21 2001 --- gcc-3.1/libjava/java/net/natPlainSocketImpl.cc Mon Apr 15 03:21:58 2002 *************** *** 1,4 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation This file is part of libgcj. *************** Libgcj License. Please consult the file *** 7,31 **** details. */ #include ! #ifndef DISABLE_JAVA_NET ! #ifdef USE_WINSOCK #include #include #include #include #ifndef ENOPROTOOPT #define ENOPROTOOPT 109 #endif ! #else /* USE_WINSOCK */ ! #include "posix.h" #include #include #include #include #include ! #endif /* USE_WINSOCK */ #endif /* DISABLE_JAVA_NET */ #if HAVE_BSTRING_H --- 7,57 ---- details. */ #include ! #include #ifndef DISABLE_JAVA_NET ! #ifdef WIN32 #include #include #include #include + #undef STRICT + #undef MAX_PRIORITY + #undef MIN_PRIORITY + #undef FIONREAD + + // These functions make the Win32 socket API look more POSIXy + static inline int + close(int s) + { + return closesocket(s); + } + + static inline int + write(int s, void *buf, int len) + { + return send(s, (char*)buf, len, 0); + } + + static inline int + read(int s, void *buf, int len) + { + return recv(s, (char*)buf, len, 0); + } + + // these errors cannot occur on Win32 + #define ENOTCONN 0 + #define ECONNRESET 0 #ifndef ENOPROTOOPT #define ENOPROTOOPT 109 #endif ! #else /* WIN32 */ #include #include #include #include #include ! #endif /* WIN32 */ #endif /* DISABLE_JAVA_NET */ #if HAVE_BSTRING_H *************** details. */ *** 37,42 **** --- 63,70 ---- typedef int socklen_t; #endif + #ifndef DISABLE_JAVA_NET + // Avoid macro definitions of bind, connect from system headers, e.g. on // Solaris 7 with _XOPEN_SOURCE. FIXME static inline int *************** _Jv_accept (int fd, struct sockaddr *add *** 70,79 **** #undef accept #endif #include #include #include - #include #include #include #include --- 98,108 ---- #undef accept #endif + #endif /* DISABLE_JAVA_NET */ + #include #include #include #include #include #include *************** _Jv_accept (int fd, struct sockaddr *add *** 85,92 **** #include #include #include ! ! #define BooleanClass java::lang::Boolean::class$ #ifdef DISABLE_JAVA_NET --- 114,123 ---- #include #include #include ! #include ! #include ! #include ! #include #ifdef DISABLE_JAVA_NET *************** java::net::PlainSocketImpl::getOption (j *** 139,144 **** --- 170,217 ---- JvNewStringLatin1 ("SocketImpl.getOption: unimplemented")); } + jint + java::net::PlainSocketImpl::read(void) + { + throw new SocketException ( + JvNewStringLatin1 ("SocketImpl.read: unimplemented")); + } + + jint + java::net::PlainSocketImpl::read(jbyteArray buffer, jint offset, jint count) + { + throw new SocketException ( + JvNewStringLatin1 ("SocketImpl.read: unimplemented")); + } + + void + java::net::PlainSocketImpl::write(jint b) + { + throw new SocketException ( + JvNewStringLatin1 ("SocketImpl.write: unimplemented")); + } + + void + java::net::PlainSocketImpl::write(jbyteArray b, jint offset, jint len) + { + throw new SocketException ( + JvNewStringLatin1 ("SocketImpl.write: unimplemented")); + } + + jint + java::net::PlainSocketImpl::available(void) + { + throw new SocketException ( + JvNewStringLatin1 ("SocketImpl.available: unimplemented")); + } + + void + java::net::PlainSocketImpl::close(void) + { + throw new SocketException ( + JvNewStringLatin1 ("SocketImpl.close: unimplemented")); + } + #else /* DISABLE_JAVA_NET */ union SockAddr *************** java::net::PlainSocketImpl::create (jboo *** 158,165 **** char* strerr = strerror (errno); throw new java::io::IOException (JvNewStringUTF (strerr)); } fnum = sock; - fd = new java::io::FileDescriptor (sock); } void --- 231,242 ---- char* strerr = strerror (errno); throw new java::io::IOException (JvNewStringUTF (strerr)); } + + _Jv_platform_close_on_exec (sock); + + // We use fnum in place of fd here. From leaving fd null we avoid + // the double close problem in FileDescriptor.finalize. fnum = sock; } void *************** java::net::PlainSocketImpl::accept (java *** 277,282 **** --- 354,361 ---- socklen_t addrlen = sizeof(u); int new_socket = 0; + // FIXME: implement timeout support for Win32 + #ifndef WIN32 // Do timeouts via select since SO_RCVTIMEO is not always available. if (timeout > 0) { *************** java::net::PlainSocketImpl::accept (java *** 293,302 **** --- 372,385 ---- throw new java::io::InterruptedIOException ( JvNewStringUTF("Accept timed out")); } + #endif /* WIN32 */ new_socket = _Jv_accept (fnum, (sockaddr*) &u, &addrlen); if (new_socket < 0) goto error; + + _Jv_platform_close_on_exec (new_socket); + jbyteArray raddr; jint rport; if (u.address.sin_family == AF_INET) *************** java::net::PlainSocketImpl::accept (java *** 320,339 **** s->localport = localport; s->address = new InetAddress (raddr, NULL); s->port = rport; - s->fd = new java::io::FileDescriptor (new_socket); return; error: char* strerr = strerror (errno); throw new java::io::IOException (JvNewStringUTF (strerr)); } void java::net::PlainSocketImpl::setOption (jint optID, java::lang::Object *value) { int val; socklen_t val_len = sizeof (val); ! if (_Jv_IsInstanceOf (value, &BooleanClass)) { java::lang::Boolean *boolobj = static_cast (value); --- 403,683 ---- s->localport = localport; s->address = new InetAddress (raddr, NULL); s->port = rport; return; error: char* strerr = strerror (errno); throw new java::io::IOException (JvNewStringUTF (strerr)); } + // Close(shutdown) the socket. + void + java::net::PlainSocketImpl::close() + { + // Avoid races from asynchronous finalization. + JvSynchronize sync (this); + + // should we use shutdown here? how would that effect so_linger? + int res = ::close (fnum); + + if (res == -1) + { + // These three errors are not errors according to tests performed + // on the reference implementation. + if (errno != ENOTCONN && errno != ECONNRESET && errno != EBADF) + throw new java::io::IOException (JvNewStringUTF (strerror (errno))); + } + // Safe place to reset the file pointer. + fnum = -1; + timeout = 0; + } + + // Write a byte to the socket. + void + java::net::PlainSocketImpl::write(jint b) + { + jbyte d =(jbyte) b; + int r = 0; + + while (r != 1) + { + r = ::write (fnum, &d, 1); + if (r == -1) + { + if (java::lang::Thread::interrupted()) + { + java::io::InterruptedIOException *iioe + = new java::io::InterruptedIOException + (JvNewStringLatin1 (strerror (errno))); + iioe->bytesTransferred = 0; + throw iioe; + } + // Some errors should not cause exceptions. + if (errno != ENOTCONN && errno != ECONNRESET && errno != EBADF) + throw new java::io::IOException (JvNewStringUTF (strerror (errno))); + break; + } + } + } + + // Write some bytes to the socket. + void + java::net::PlainSocketImpl::write(jbyteArray b, jint offset, jint len) + { + if (! b) + throw new java::lang::NullPointerException; + if (offset < 0 || len < 0 || offset + len > JvGetArrayLength (b)) + throw new java::lang::ArrayIndexOutOfBoundsException; + + jbyte *bytes = elements (b) + offset; + int written = 0; + while (len > 0) + { + int r = ::write (fnum, bytes, len); + if (r == -1) + { + if (java::lang::Thread::interrupted()) + { + java::io::InterruptedIOException *iioe + = new java::io::InterruptedIOException + (JvNewStringLatin1 (strerror (errno))); + iioe->bytesTransferred = written; + throw iioe; + } + // Some errors should not cause exceptions. + if (errno != ENOTCONN && errno != ECONNRESET && errno != EBADF) + throw new java::io::IOException (JvNewStringUTF (strerror (errno))); + break; + } + written += r; + len -= r; + bytes += r; + } + } + + + // Read a single byte from the socket. + jint + java::net::PlainSocketImpl::read(void) + { + jbyte b; + + // FIXME: implement timeout support for Win32 + #ifndef WIN32 + // Do timeouts via select. + if (timeout > 0) + { + // Create the file descriptor set. + fd_set read_fds; + FD_ZERO (&read_fds); + FD_SET (fnum,&read_fds); + // Create the timeout struct based on our internal timeout value. + struct timeval timeout_value; + timeout_value.tv_sec = timeout / 1000; + timeout_value.tv_usec = (timeout % 1000) * 1000; + // Select on the fds. + int sel_retval = _Jv_select (fnum + 1, &read_fds, NULL, NULL, &timeout_value); + // If select returns 0 we've waited without getting data... + // that means we've timed out. + if (sel_retval == 0) + throw new java::io::InterruptedIOException + (JvNewStringUTF ("read timed out") ); + // If select returns ok we know we either got signalled or read some data... + // either way we need to try to read. + } + #endif /* WIN32 */ + + int r = ::read (fnum, &b, 1); + + if (r == 0) + return -1; + if (java::lang::Thread::interrupted()) + { + java::io::InterruptedIOException *iioe = + new java::io::InterruptedIOException + (JvNewStringUTF("read interrupted")); + iioe->bytesTransferred = r == -1 ? 0 : r; + throw iioe; + } + else if (r == -1) + { + // Some errors cause us to return end of stream... + if (errno == ENOTCONN) + return -1; + // Other errors need to be signalled. + throw new java::io::IOException (JvNewStringUTF (strerror (errno))); + } + return b & 0xFF; + } + + // Read count bytes into the buffer, starting at offset. + jint + java::net::PlainSocketImpl::read(jbyteArray buffer, jint offset, jint count) + { + if (! buffer) + throw new java::lang::NullPointerException; + jsize bsize = JvGetArrayLength (buffer); + if (offset < 0 || count < 0 || offset + count > bsize) + throw new java::lang::ArrayIndexOutOfBoundsException; + jbyte *bytes = elements (buffer) + offset; + + // FIXME: implement timeout support for Win32 + #ifndef WIN32 + // Do timeouts via select. + if (timeout > 0) + { + // Create the file descriptor set. + fd_set read_fds; + FD_ZERO (&read_fds); + FD_SET (fnum, &read_fds); + // Create the timeout struct based on our internal timeout value. + struct timeval timeout_value; + timeout_value.tv_sec = timeout / 1000; + timeout_value.tv_usec =(timeout % 1000) * 1000; + // Select on the fds. + int sel_retval = _Jv_select (fnum + 1, &read_fds, NULL, NULL, &timeout_value); + // We're only interested in the 0 return. + // error returns still require us to try to read + // the socket to see what happened. + if (sel_retval == 0) + { + java::io::InterruptedIOException *iioe = + new java::io::InterruptedIOException + (JvNewStringUTF ("read interrupted")); + iioe->bytesTransferred = 0; + throw iioe; + } + } + #endif + + // Read the socket. + int r = ::recv (fnum, (char *) bytes, count, 0); + if (r == 0) + return -1; + if (java::lang::Thread::interrupted()) + { + java::io::InterruptedIOException *iioe = + new java::io::InterruptedIOException + (JvNewStringUTF ("read interrupted")); + iioe->bytesTransferred = r == -1 ? 0 : r; + throw iioe; + } + else if (r == -1) + { + // Some errors cause us to return end of stream... + if (errno == ENOTCONN) + return -1; + // Other errors need to be signalled. + throw new java::io::IOException (JvNewStringUTF (strerror (errno))); + } + return r; + } + + // How many bytes are available? + jint + java::net::PlainSocketImpl::available(void) + { + #if defined(FIONREAD) || defined(HAVE_SELECT) + long num = 0; + int r = 0; + bool num_set = false; + + #if defined(FIONREAD) + r = ::ioctl (fnum, FIONREAD, &num); + if (r == -1 && errno == ENOTTY) + { + // If the ioctl doesn't work, we don't care. + r = 0; + num = 0; + } + else + num_set = true; + #elif defined(HAVE_SELECT) + if (fnum < 0) + { + errno = EBADF; + r = -1; + } + #endif + + if (r == -1) + { + posix_error: + throw new java::io::IOException(JvNewStringUTF(strerror(errno))); + + } + + // If we didn't get anything we can use select. + + #if defined(HAVE_SELECT) + if (! num_set) + { + fd_set rd; + FD_ZERO (&rd); + FD_SET (fnum, &rd); + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + r = _Jv_select (fnum + 1, &rd, NULL, NULL, &tv); + if(r == -1) + goto posix_error; + num = r == 0 ? 0 : 1; + } + #endif /* HAVE_SELECT */ + + return (jint) num; + #else + throw new java::io::IOException (JvNewStringUTF ("unimplemented")); + #endif + } + + void java::net::PlainSocketImpl::setOption (jint optID, java::lang::Object *value) { int val; socklen_t val_len = sizeof (val); ! if (_Jv_IsInstanceOf (value, &java::lang::Boolean::class$)) { java::lang::Boolean *boolobj = static_cast (value); *************** java::net::PlainSocketImpl::setOption (j *** 347,358 **** val = 0; } } ! else // assume value is an Integer { java::lang::Integer *intobj = static_cast (value); val = (int) intobj->intValue(); } switch (optID) { --- 691,706 ---- val = 0; } } ! else if (_Jv_IsInstanceOf (value, &java::lang::Integer::class$)) { java::lang::Integer *intobj = static_cast (value); val = (int) intobj->intValue(); } + else + { + throw new java::lang::IllegalArgumentException (JvNewStringLatin1 ("`value' must be Boolean or Integer")); + } switch (optID) { diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/AccessException.java gcc-3.1/libjava/java/rmi/AccessException.java *** gcc-3.0.4/libjava/java/rmi/AccessException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/AccessException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class AccessException + extends RemoteException { + + public static final long serialVersionUID = 6314925228044966088l; + + public AccessException(String s) { + super(s); + } + + public AccessException(String s, Exception e) { + super (s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/AlreadyBoundException.java gcc-3.1/libjava/java/rmi/AlreadyBoundException.java *** gcc-3.0.4/libjava/java/rmi/AlreadyBoundException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/AlreadyBoundException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,51 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class AlreadyBoundException + extends Exception { + + public AlreadyBoundException() { + super(); + } + + public AlreadyBoundException(String s) { + super (s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/ConnectException.java gcc-3.1/libjava/java/rmi/ConnectException.java *** gcc-3.0.4/libjava/java/rmi/ConnectException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/ConnectException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,52 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class ConnectException + extends RemoteException { + + + public ConnectException(String s) { + super(s); + } + + public ConnectException(String s, Exception e) { + super (s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/ConnectIOException.java gcc-3.1/libjava/java/rmi/ConnectIOException.java *** gcc-3.0.4/libjava/java/rmi/ConnectIOException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/ConnectIOException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,52 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class ConnectIOException + extends RemoteException { + + + public ConnectIOException(String s) { + super(s); + } + + public ConnectIOException(String s, Exception e) { + super (s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/MarshalException.java gcc-3.1/libjava/java/rmi/MarshalException.java *** gcc-3.0.4/libjava/java/rmi/MarshalException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/MarshalException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,52 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class MarshalException + extends RemoteException { + + + public MarshalException(String s) { + super(s); + } + + public MarshalException(String s, Exception e) { + super (s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/MarshalledObject.java gcc-3.1/libjava/java/rmi/MarshalledObject.java *** gcc-3.0.4/libjava/java/rmi/MarshalledObject.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/MarshalledObject.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,61 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + import java.io.Serializable; + + public final class MarshalledObject + extends Object implements Serializable { + + public MarshalledObject(Object obj) { + throw new Error("Not implemented"); + } + + public boolean equals(Object obj) { + throw new Error("Not implemented"); + } + + public Object get() { + throw new Error("Not implemented"); + } + + public int hashCode() { + throw new Error("Not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/Naming.java gcc-3.1/libjava/java/rmi/Naming.java *** gcc-3.0.4/libjava/java/rmi/Naming.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/Naming.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,80 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + import java.net.MalformedURLException; + import java.net.URL; + import java.rmi.registry.Registry; + import java.rmi.registry.LocateRegistry; + + public final class Naming { + + public static Remote lookup(String name) throws NotBoundException, MalformedURLException, RemoteException { + URL u = new URL("http:" + name); + return (getRegistry(u).lookup(u.getFile().substring(1))); + } + + public static void bind(String name, Remote obj) throws AlreadyBoundException, MalformedURLException, RemoteException { + URL u = new URL("http:" + name); + getRegistry(u).bind(u.getFile().substring(1), obj); + } + + public static void unbind(String name) throws RemoteException, NotBoundException, MalformedURLException { + URL u = new URL("http:" + name); + getRegistry(u).unbind(u.getFile().substring(1)); + } + + public static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException { + URL u = new URL("http:" + name); + getRegistry(u).rebind(u.getFile().substring(1), obj); + } + + public static String[] list(String name) throws RemoteException, MalformedURLException { + return (getRegistry(new URL("http:" + name)).list()); + } + + private static Registry getRegistry(URL u) throws RemoteException { + if (u.getPort() == -1) { + return (LocateRegistry.getRegistry(u.getHost())); + } + else { + return (LocateRegistry.getRegistry(u.getHost(), u.getPort())); + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/NoSuchObjectException.java gcc-3.1/libjava/java/rmi/NoSuchObjectException.java *** gcc-3.0.4/libjava/java/rmi/NoSuchObjectException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/NoSuchObjectException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,49 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class NoSuchObjectException + extends RemoteException { + + public static final long serialVersionUID = 6619395951570472985L; + + public NoSuchObjectException(String s) { + super(s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/NotBoundException.java gcc-3.1/libjava/java/rmi/NotBoundException.java *** gcc-3.0.4/libjava/java/rmi/NotBoundException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/NotBoundException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class NotBoundException + extends Exception { + + public static final long serialVersionUID = -1857741824849069317l; + + public NotBoundException() { + super(); + } + + public NotBoundException(String s) { + super (s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/RMISecurityException.java gcc-3.1/libjava/java/rmi/RMISecurityException.java *** gcc-3.0.4/libjava/java/rmi/RMISecurityException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/RMISecurityException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + import java.lang.SecurityException; + + public class RMISecurityException + extends SecurityException { + + public RMISecurityException(String n) { + super(n); + } + + public RMISecurityException(String n, String a) { + super(n); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/RMISecurityManager.java gcc-3.1/libjava/java/rmi/RMISecurityManager.java *** gcc-3.0.4/libjava/java/rmi/RMISecurityManager.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/RMISecurityManager.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,149 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + import java.io.FileDescriptor; + import java.lang.Thread; + import java.lang.Class; + import java.lang.SecurityManager; + import java.net.InetAddress; + import java.security.Permission; + + public class RMISecurityManager extends SecurityManager { + + public RMISecurityManager() { + } + + public void checkAccept(String host, int port) { + } + + public void checkAccess(Thread g) { + } + + public void checkAccess(ThreadGroup g) { + } + + public void checkAwtEventQueueAccess() { + } + + public void checkConnect(String host, int port) { + } + + public void checkConnect(String host, int port, Object context) { + } + + public void checkCreateClassLoader() { + } + + public void checkDelete(String file) { + } + + public void checkExec(String cmd) { + } + + public void checkExit(int status) { + } + + public void checkLink(String lib) { + } + + public void checkListen(int port) { + } + + public void checkMemberAccess ( Class clazz, int which ) { + } + + public void checkMulticast(InetAddress maddr) { + } + + public void checkMulticast(InetAddress maddr, byte ttl) { + } + + public void checkPackageAccess(String pkg) { + } + + public void checkPackageDefinition(String pkg) { + } + + public void checkPermission(Permission perm) { + } + + public void checkPermission(Permission perm, Object context) { + } + + public void checkPrintJobAccess() { + } + + public void checkPropertiesAccess() { + } + + public void checkPropertyAccess(String key) { + } + + /* public void checkPropertyAccess(String key, String def) { + }*/ + + public void checkRead(FileDescriptor fd) { + } + + public void checkRead(String file) { + } + + public void checkRead(String file, Object context) { + } + + public void checkSecurityAccess(String action) { + } + + public void checkSetFactory() { + } + + public void checkSystemClipboardAccess() { + } + + public boolean checkTopLevelWindow(Object window) { + return (true); + } + + public void checkWrite(FileDescriptor fd) { + } + + public void checkWrite(String file) { + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/Remote.java gcc-3.1/libjava/java/rmi/Remote.java *** gcc-3.0.4/libjava/java/rmi/Remote.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/Remote.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,41 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public interface Remote { + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/RemoteException.java gcc-3.1/libjava/java/rmi/RemoteException.java *** gcc-3.0.4/libjava/java/rmi/RemoteException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/RemoteException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,95 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + import java.lang.Throwable; + import java.io.IOException; + import java.io.PrintStream; + import java.io.PrintWriter; + + + public class RemoteException + extends IOException { + + public static final long serialVersionUID = -5148567311918794206l; + + public Throwable detail; + + public RemoteException() { + super(); + detail = null; + } + + public RemoteException(String s) { + super(s); + detail = null; + } + + public RemoteException(String s, Throwable e) { + super(s); + detail = e; + } + + public String getMessage() { + if (detail == null) { + return (super.getMessage()); + } + else { + return (super.getMessage() + "; nested exception is: " + detail.getMessage()); + } + } + + public void printStackTrace(PrintStream s) { + if (detail != null) { + detail.printStackTrace(s); + } + super.printStackTrace(s); + } + + public void printStackTrace(PrintWriter s) { + if (detail != null) { + detail.printStackTrace(s); + } + super.printStackTrace(s); + } + + public void printStackTrace() { + printStackTrace(System.err); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/ServerError.java gcc-3.1/libjava/java/rmi/ServerError.java *** gcc-3.0.4/libjava/java/rmi/ServerError.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/ServerError.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,47 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class ServerError + extends RemoteException { + + public ServerError(String s, Error e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/ServerException.java gcc-3.1/libjava/java/rmi/ServerException.java *** gcc-3.0.4/libjava/java/rmi/ServerException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/ServerException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class ServerException + extends RemoteException { + + public static final long serialVersionUID = -4775845313121906682l; + + public ServerException(String s) { + super(s); + } + + public ServerException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/ServerRuntimeException.java gcc-3.1/libjava/java/rmi/ServerRuntimeException.java *** gcc-3.0.4/libjava/java/rmi/ServerRuntimeException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/ServerRuntimeException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,47 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class ServerRuntimeException + extends RemoteException { + + public ServerRuntimeException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/StubNotFoundException.java gcc-3.1/libjava/java/rmi/StubNotFoundException.java *** gcc-3.0.4/libjava/java/rmi/StubNotFoundException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/StubNotFoundException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,51 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class StubNotFoundException + extends RemoteException { + + public StubNotFoundException(String s) { + super(s); + } + + public StubNotFoundException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/UnexpectedException.java gcc-3.1/libjava/java/rmi/UnexpectedException.java *** gcc-3.0.4/libjava/java/rmi/UnexpectedException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/UnexpectedException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,51 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class UnexpectedException + extends RemoteException { + + public UnexpectedException(String s) { + super(s); + } + + public UnexpectedException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/UnknownHostException.java gcc-3.1/libjava/java/rmi/UnknownHostException.java *** gcc-3.0.4/libjava/java/rmi/UnknownHostException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/UnknownHostException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,51 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class UnknownHostException + extends RemoteException { + + public UnknownHostException(String s) { + super(s); + } + + public UnknownHostException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/UnmarshalException.java gcc-3.1/libjava/java/rmi/UnmarshalException.java *** gcc-3.0.4/libjava/java/rmi/UnmarshalException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/UnmarshalException.java Tue Jan 22 22:40:24 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi; + + public class UnmarshalException + extends RemoteException { + + public static final long serialVersionUID = 594380845140740218l; + + public UnmarshalException(String s) { + super(s); + } + + public UnmarshalException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/Activatable.java gcc-3.1/libjava/java/rmi/activation/Activatable.java *** gcc-3.0.4/libjava/java/rmi/activation/Activatable.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/Activatable.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,103 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.rmi.server.RemoteServer; + import java.rmi.server.RMIClientSocketFactory; + import java.rmi.server.RMIServerSocketFactory; + import java.rmi.RemoteException; + import java.rmi.Remote; + import java.rmi.NoSuchObjectException; + import java.rmi.MarshalledObject; + + public abstract class Activatable + extends RemoteServer { + + protected Activatable(String location, MarshalledObject data, boolean restart, int port) throws ActivationException, RemoteException { + throw new Error("Not implemented"); + } + + protected Activatable(String location, MarshalledObject data, boolean restart, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws ActivationException, RemoteException { + throw new Error("Not implemented"); + } + + protected Activatable(ActivationID id, int port) throws RemoteException { + throw new Error("Not implemented"); + } + + protected Activatable(ActivationID id, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException { + throw new Error("Not implemented"); + } + + protected ActivationID getID() { + throw new Error("Not implemented"); + } + + public static Remote register(ActivationDesc desc) throws UnknownGroupException, ActivationException, RemoteException { + throw new Error("Not implemented"); + } + + public static boolean inactive(ActivationID id) throws UnknownObjectException, ActivationException, RemoteException { + throw new Error("Not implemented"); + } + + public static void unregister(ActivationID id) throws UnknownObjectException, ActivationException, RemoteException { + throw new Error("Not implemented"); + } + + public static ActivationID exportObject(Remote obj, String location, MarshalledObject data, boolean restart, int port) throws ActivationException, RemoteException { + throw new Error("Not implemented"); + } + + public static ActivationID exportObject(Remote obj, String location, MarshalledObject data, boolean restart, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws ActivationException, RemoteException { + throw new Error("Not implemented"); + } + + public static Remote exportObject(Remote obj, ActivationID id, int port) throws RemoteException { + throw new Error("Not implemented"); + } + + public static Remote exportObject(Remote obj, ActivationID id, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException { + throw new Error("Not implemented"); + } + + public static boolean unexportObject(Remote obj, boolean force) throws NoSuchObjectException { + throw new Error("Not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivateFailedException.java gcc-3.1/libjava/java/rmi/activation/ActivateFailedException.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivateFailedException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivateFailedException.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.rmi.RemoteException; + + public class ActivateFailedException + extends RemoteException { + + public ActivateFailedException(String s) { + super(s); + } + + public ActivateFailedException(String s, Exception ex) { + super(s, ex); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationDesc.java gcc-3.1/libjava/java/rmi/activation/ActivationDesc.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationDesc.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationDesc.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,112 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.io.Serializable; + import java.rmi.MarshalledObject; + + public final class ActivationDesc + implements Serializable { + + private ActivationGroupID groupid; + private String classname; + private String location; + private MarshalledObject data; + private boolean restart; + + public ActivationDesc(String className, String location, MarshalledObject data) throws ActivationException { + this(ActivationGroup.currentGroupID(), className, location, data, false); + } + + public ActivationDesc(String className, String location, MarshalledObject data, boolean restart) throws ActivationException { + this(ActivationGroup.currentGroupID(), className, location, data, restart); + } + + public ActivationDesc(ActivationGroupID groupID, String className, String location, MarshalledObject data) { + this(groupID, className, location, data, false); + } + + public ActivationDesc(ActivationGroupID groupID, String className, String location, MarshalledObject data, boolean restart) { + this.groupid = groupID; + this.classname = className; + this.location = location; + this.data = data; + this.restart = restart; + } + + public ActivationGroupID getGroupID() { + return (groupid); + } + + public String getClassName() { + return (classname); + } + + public String getLocation() { + return (location); + } + + public MarshalledObject getData() { + return (data); + } + + public boolean getRestartMode() { + return (restart); + } + + public boolean equals(Object obj) { + if (!(obj instanceof ActivationDesc)) { + return (false); + } + ActivationDesc that = (ActivationDesc)obj; + + if (this.groupid.equals(that.groupid) && + this.classname.equals(that.classname) && + this.location.equals(that.location) && + this.data.equals(that.data) && + this.restart == that.restart) { + return (true); + } + return (false); + } + + public int hashCode() { + return (groupid.hashCode() ^ classname.hashCode() ^ location.hashCode() ^ data.hashCode()); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationException.java gcc-3.1/libjava/java/rmi/activation/ActivationException.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationException.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,88 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.io.PrintStream; + import java.io.PrintWriter; + + public class ActivationException + extends Exception { + + public Throwable detail; + + public ActivationException() { + super(); + } + + public ActivationException(String s) { + super(s); + } + + public ActivationException(String s, Throwable ex) { + super(s); + detail = ex; + } + + public String getMessage() { + if (detail == null) { + return (super.getMessage()); + } + else { + return (super.getMessage() + ":" + detail.getMessage()); + } + } + + public void printStackTrace(PrintStream s) { + if (detail != null) { + detail.printStackTrace(s); + } + super.printStackTrace(s); + } + + public void printStackTrace() { + printStackTrace(System.err); + } + + public void printStackTrace(PrintWriter s) { + if (detail != null) { + detail.printStackTrace(s); + } + super.printStackTrace(s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationGroup.java gcc-3.1/libjava/java/rmi/activation/ActivationGroup.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationGroup.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationGroup.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,83 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.rmi.server.UnicastRemoteObject; + import java.rmi.RemoteException; + import java.rmi.Remote; + import java.rmi.MarshalledObject; + + public abstract class ActivationGroup + extends UnicastRemoteObject + implements ActivationInstantiator { + + protected ActivationGroup(ActivationGroupID groupID) throws RemoteException { + throw new Error("Not implemented"); + } + + public boolean inactiveObject(ActivationID id) throws ActivationException, UnknownObjectException, RemoteException { + throw new Error("Not implemented"); + } + + public abstract void activeObject(ActivationID id, Remote obj) throws ActivationException, UnknownObjectException, RemoteException; + + public static ActivationGroup createGroup(ActivationGroupID id, ActivationGroupDesc desc, long incarnation) throws ActivationException { + throw new Error("Not implemented"); + } + + public static ActivationGroupID currentGroupID() { + throw new Error("Not implemented"); + } + + public static void setSystem(ActivationSystem system) throws ActivationException { + throw new Error("Not implemented"); + } + + public static ActivationSystem getSystem() throws ActivationException { + throw new Error("Not implemented"); + } + + protected void activeObject(ActivationID id, MarshalledObject mobj) throws ActivationException, UnknownObjectException, RemoteException { + throw new Error("Not implemented"); + } + + protected void inactiveGroup() throws UnknownGroupException, RemoteException { + throw new Error("Not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationGroupDesc.java gcc-3.1/libjava/java/rmi/activation/ActivationGroupDesc.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationGroupDesc.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationGroupDesc.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,130 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.io.Serializable; + import java.util.Properties; + import java.rmi.MarshalledObject; + + public final class ActivationGroupDesc + implements Serializable { + + public static class CommandEnvironment + implements Serializable { + + private String cmdpath; + private String[] argv; + + public CommandEnvironment(String cmdpath, String[] argv) { + this.cmdpath = cmdpath; + this.argv = argv; + } + + public String getCommandPath() { + return (cmdpath); + } + + public String[] getCommandOptions() { + return (argv); + } + + public boolean equals(Object obj) { + if (!(obj instanceof CommandEnvironment)) { + return (false); + } + CommandEnvironment that = (CommandEnvironment)obj; + + if (!this.cmdpath.equals(that.cmdpath)) { + return (false); + } + + int len = this.argv.length; + if (len != that.argv.length) { + return (false); + } + for (int i = 0; i < len; i++) { + if (!this.argv[i].equals(that.argv[i])) { + return (false); + } + } + return (true); + } + + public int hashCode() { + return (cmdpath.hashCode()); // Not a very good hash code. + } + + } + + public ActivationGroupDesc(Properties overrides, ActivationGroupDesc.CommandEnvironment cmd) { + throw new Error("Not implemented"); + } + + public ActivationGroupDesc(String className, String location, MarshalledObject data, Properties overrides, ActivationGroupDesc.CommandEnvironment cmd) { + throw new Error("Not implemented"); + } + + public String getClassName() { + throw new Error("Not implemented"); + } + + public String getLocation() { + throw new Error("Not implemented"); + } + + public MarshalledObject getData() { + throw new Error("Not implemented"); + } + + public Properties getPropertyOverrides() { + throw new Error("Not implemented"); + } + + public ActivationGroupDesc.CommandEnvironment getCommandEnvironment() { + throw new Error("Not implemented"); + } + + public boolean equals(Object obj) { + throw new Error("Not implemented"); + } + + public int hashCode() { + throw new Error("Not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationGroupID.java gcc-3.1/libjava/java/rmi/activation/ActivationGroupID.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationGroupID.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationGroupID.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,69 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.io.Serializable; + + public class ActivationGroupID + implements Serializable { + + private ActivationSystem system; + + public ActivationGroupID(ActivationSystem system) { + this.system = system; + } + + public ActivationSystem getSystem() { + return (system); + } + + public int hashCode() { + return (system.hashCode()); + } + + public boolean equals(Object obj) { + if (obj instanceof ActivationGroupID) { + ActivationGroupID that = (ActivationGroupID)obj; + if (this.system.equals(that.system)) { + return (true); + } + } + return (false); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationID.java gcc-3.1/libjava/java/rmi/activation/ActivationID.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationID.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationID.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,71 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.io.Serializable; + import java.rmi.Remote; + import java.rmi.RemoteException; + + public class ActivationID + implements Serializable { + + private Activator activator; + + public ActivationID(Activator activator) { + this.activator = activator; + } + + public Remote activate(boolean force) throws ActivationException, UnknownObjectException, RemoteException { + throw new Error("Not implemented"); + } + + public int hashCode() { + return (activator.hashCode()); + } + + public boolean equals(Object obj) { + if (obj instanceof ActivationID) { + ActivationID that = (ActivationID)obj; + if (this.activator.equals(that.activator)) { + return (true); + } + } + return (false); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationInstantiator.java gcc-3.1/libjava/java/rmi/activation/ActivationInstantiator.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationInstantiator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationInstantiator.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,49 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.rmi.MarshalledObject; + + public interface ActivationInstantiator + extends Remote { + + public MarshalledObject newInstance(ActivationID id, ActivationDesc desc) throws ActivationException, RemoteException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationMonitor.java gcc-3.1/libjava/java/rmi/activation/ActivationMonitor.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationMonitor.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationMonitor.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,51 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.rmi.MarshalledObject; + + public interface ActivationMonitor + extends Remote { + + public void inactiveObject(ActivationID id) throws UnknownObjectException, RemoteException; + public void activeObject(ActivationID id, MarshalledObject obj) throws UnknownObjectException, RemoteException; + public void inactiveGroup(ActivationGroupID id, long incarnation) throws UnknownGroupException, RemoteException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/ActivationSystem.java gcc-3.1/libjava/java/rmi/activation/ActivationSystem.java *** gcc-3.0.4/libjava/java/rmi/activation/ActivationSystem.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/ActivationSystem.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,59 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.rmi.Remote; + import java.rmi.RemoteException; + + public interface ActivationSystem + extends Remote { + + public static final int SYSTEM_PORT = 0; // XXX + + public ActivationID registerObject(ActivationDesc desc) throws ActivationException, UnknownGroupException, RemoteException; + public void unregisterObject(ActivationID id) throws ActivationException, UnknownObjectException, RemoteException; + public ActivationGroupID registerGroup(ActivationGroupDesc desc) throws ActivationException, RemoteException; + public ActivationMonitor activeGroup(ActivationGroupID id, ActivationInstantiator group, long incarnation) throws UnknownGroupException, ActivationException, RemoteException; + public void unregisterGroup(ActivationGroupID id) throws ActivationException, UnknownGroupException, RemoteException; + public void shutdown() throws RemoteException; + public ActivationDesc setActivationDesc(ActivationID id, ActivationDesc desc) throws ActivationException, UnknownObjectException, UnknownGroupException, RemoteException; + public ActivationGroupDesc setActivationGroupDesc(ActivationGroupID id, ActivationGroupDesc desc) throws ActivationException, UnknownGroupException, RemoteException; + public ActivationDesc getActivationDesc(ActivationID id) throws ActivationException, UnknownObjectException, RemoteException; + public ActivationGroupDesc getActivationGroupDesc(ActivationGroupID id) throws ActivationException, UnknownGroupException, RemoteException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/Activator.java gcc-3.1/libjava/java/rmi/activation/Activator.java *** gcc-3.0.4/libjava/java/rmi/activation/Activator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/Activator.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,49 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.rmi.MarshalledObject; + + public interface Activator + extends Remote { + + public MarshalledObject activate(ActivationID id, boolean force) throws ActivationException, UnknownObjectException, RemoteException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/UnknownGroupException.java gcc-3.1/libjava/java/rmi/activation/UnknownGroupException.java *** gcc-3.0.4/libjava/java/rmi/activation/UnknownGroupException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/UnknownGroupException.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,47 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + public class UnknownGroupException + extends ActivationException { + + public UnknownGroupException(String s) { + super(s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/activation/UnknownObjectException.java gcc-3.1/libjava/java/rmi/activation/UnknownObjectException.java *** gcc-3.0.4/libjava/java/rmi/activation/UnknownObjectException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/activation/UnknownObjectException.java Tue Jan 22 22:40:25 2002 *************** *** 0 **** --- 1,47 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.activation; + + public class UnknownObjectException + extends ActivationException { + + public UnknownObjectException(String s) { + super(s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/dgc/DGC.java gcc-3.1/libjava/java/rmi/dgc/DGC.java *** gcc-3.0.4/libjava/java/rmi/dgc/DGC.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/dgc/DGC.java Tue Jan 22 22:40:26 2002 *************** *** 0 **** --- 1,51 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.dgc; + + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.rmi.server.ObjID; + + public interface DGC + extends Remote { + + public Lease dirty(ObjID[] ids, long sequenceNum, Lease lease) throws RemoteException; + + public void clean(ObjID[] ids, long sequenceNum, VMID vmid, boolean strong) throws RemoteException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/dgc/Lease.java gcc-3.1/libjava/java/rmi/dgc/Lease.java *** gcc-3.0.4/libjava/java/rmi/dgc/Lease.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/dgc/Lease.java Tue Jan 22 22:40:26 2002 *************** *** 0 **** --- 1,68 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.dgc; + + import java.io.Serializable; + import java.rmi.dgc.VMID; + + public final class Lease + implements Serializable { + + static final long serialVersionUID = -5713411624328831948L; + + private VMID vmid; + private long value; + + public Lease(VMID id, long duration) { + vmid = id; + value = duration; + } + + public VMID getVMID() { + return (vmid); + } + + public long getValue() { + return (value); + } + + public String toString() { + return ("[" + vmid.toString() + ", " + Long.toString(value) + "]"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/dgc/VMID.java gcc-3.1/libjava/java/rmi/dgc/VMID.java *** gcc-3.0.4/libjava/java/rmi/dgc/VMID.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/dgc/VMID.java Tue Jan 22 22:40:26 2002 *************** *** 0 **** --- 1,116 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.dgc; + + import java.io.Serializable; + import java.rmi.server.UID; + import java.net.InetAddress; + import java.net.UnknownHostException; + + public final class VMID + implements Serializable { + + static final long serialVersionUID = -538642295484486218L; + static final boolean areWeUnique; + static byte[] localAddr; + + private byte[] addr; + private UID uid; + + static { + byte[] addr; + boolean awu = true; + try { + addr = InetAddress.getLocalHost().getAddress(); + if (addr[0] == 127 && addr[1] == 0 && addr[2] == 0 && addr[3] == 1) { + awu = false; + } + } + catch (UnknownHostException _) { + addr = new byte[]{ 127, 0, 0, 1 }; + awu = false; + } + localAddr = addr; + areWeUnique = awu; + } + + public VMID() { + addr = localAddr; + uid = new UID(); + } + + public static boolean isUnique() { + return (areWeUnique); + } + + public int hashCode() { + return (super.hashCode()); + } + + public boolean equals(Object obj) { + if (!(obj instanceof VMID)) { + return (false); + } + VMID other = (VMID)obj; + if (addr.length != other.addr.length) { + return (false); + } + for (int i = addr.length - 1; i >= 0; i--) { + if (addr[i] != other.addr[i]) { + return (false); + } + } + return (uid.equals(other.uid)); + } + + public String toString() { + StringBuffer buf = new StringBuffer("[VMID: "); + for (int i = 0; i < addr.length; i++) { + if (i > 0) { + buf.append("."); + } + buf.append(Integer.toString(addr[i])); + } + buf.append(" "); + buf.append(uid.toString()); + buf.append("]"); + + return (buf.toString()); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/registry/LocateRegistry.java gcc-3.1/libjava/java/rmi/registry/LocateRegistry.java *** gcc-3.0.4/libjava/java/rmi/registry/LocateRegistry.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/registry/LocateRegistry.java Tue Jan 22 22:40:28 2002 *************** *** 0 **** --- 1,85 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.registry; + + import java.io.IOException; + import java.rmi.RemoteException; + import java.rmi.server.RMIClientSocketFactory; + import java.rmi.server.RMIServerSocketFactory; + import java.rmi.server.RMISocketFactory; + import java.rmi.server.RemoteRef; + import java.rmi.server.ObjID; + import java.net.Socket; + + import gnu.java.rmi.server.UnicastRef; + import gnu.java.rmi.server.UnicastServerRef; + import gnu.java.rmi.registry.RegistryImpl; + import gnu.java.rmi.registry.RegistryImpl_Stub; + + public final class LocateRegistry { + + public static Registry getRegistry() throws RemoteException { + return (getRegistry("localhost", Registry.REGISTRY_PORT)); + } + + public static Registry getRegistry(int port) throws RemoteException { + return (getRegistry("localhost", port)); + } + + public static Registry getRegistry(String host) throws RemoteException { + return (getRegistry(host, Registry.REGISTRY_PORT)); + } + + public static Registry getRegistry(String host, int port) throws RemoteException { + return (getRegistry(host, port, RMISocketFactory.getSocketFactory())); + } + + public static Registry getRegistry(String host, int port, RMIClientSocketFactory csf) throws RemoteException { + RemoteRef ref = new UnicastRef(new ObjID(ObjID.REGISTRY_ID), host, port, csf); + return (new RegistryImpl_Stub(ref)); + } + + public static Registry createRegistry(int port) throws RemoteException { + return (createRegistry(port, RMISocketFactory.getSocketFactory(), RMISocketFactory.getSocketFactory())); + } + + public static Registry createRegistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException { + return (new RegistryImpl(port, csf, ssf)); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/registry/Registry.java gcc-3.1/libjava/java/rmi/registry/Registry.java *** gcc-3.0.4/libjava/java/rmi/registry/Registry.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/registry/Registry.java Tue Jan 22 22:40:28 2002 *************** *** 0 **** --- 1,61 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.registry; + + import java.rmi.RemoteException; + import java.rmi.NotBoundException; + import java.rmi.AccessException; + import java.rmi.AlreadyBoundException; + import java.rmi.Remote; + + public interface Registry + extends Remote { + + public static int REGISTRY_PORT = 1099; + + public Remote lookup(String name) throws RemoteException, NotBoundException, AccessException; + + public void bind(String name, Remote obj) throws RemoteException, AlreadyBoundException, AccessException; + + public void unbind(String name) throws RemoteException, NotBoundException, AccessException; + + public void rebind(String name, Remote obj) throws RemoteException, AccessException; + + public String[] list() throws RemoteException, AccessException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/registry/RegistryHandler.java gcc-3.1/libjava/java/rmi/registry/RegistryHandler.java *** gcc-3.0.4/libjava/java/rmi/registry/RegistryHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/registry/RegistryHandler.java Tue Jan 22 22:40:28 2002 *************** *** 0 **** --- 1,49 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.registry; + + import java.rmi.RemoteException; + import java.rmi.UnknownHostException; + + public interface RegistryHandler { + + public Registry registryStub(String host, int port) throws RemoteException, UnknownHostException; + + public Registry registryImpl(int port) throws RemoteException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/ExportException.java gcc-3.1/libjava/java/rmi/server/ExportException.java *** gcc-3.0.4/libjava/java/rmi/server/ExportException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/ExportException.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.rmi.RemoteException; + + public class ExportException + extends RemoteException { + + public ExportException(String s) { + super(s); + } + + public ExportException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/LoaderHandler.java gcc-3.1/libjava/java/rmi/server/LoaderHandler.java *** gcc-3.0.4/libjava/java/rmi/server/LoaderHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/LoaderHandler.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,54 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.net.MalformedURLException; + import java.net.URL; + + + public interface LoaderHandler { + + public static final String packagePrefix = ""; + + public Class loadClass(String name) throws MalformedURLException, ClassNotFoundException; + + public Class loadClass(URL codebase, String name) throws MalformedURLException, ClassNotFoundException; + + public Object getSecurityContext(ClassLoader loader); + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/LogStream.java gcc-3.1/libjava/java/rmi/server/LogStream.java *** gcc-3.0.4/libjava/java/rmi/server/LogStream.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/LogStream.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,102 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.io.PrintStream; + import java.io.OutputStream; + import java.io.IOException; + + public class LogStream + extends PrintStream { + + public static final int SILENT = 0; + public static final int BRIEF = 1; + public static final int VERBOSE = 2; + + private static PrintStream defStream; + + private LogStream(OutputStream s) { + super(s); + } + + public static LogStream log(String name) { + throw new Error("Not implemented"); + } + + public static PrintStream getDefaultStream() { + return (defStream); + } + + public static void setDefaultStream(PrintStream s) { + defStream = s; + } + + public OutputStream getOutputStream() { + return (out); + } + + public void setOutputStream(OutputStream s) { + out = s; + } + + public void write(int b) { + super.write(b); + } + + public void write(byte[] b, int off, int len) { + super.write(b, off, len); + } + + public String toString() { + throw new Error("Not implemented"); + } + + public static int parseLevel(String s) { + if (s.equalsIgnoreCase("silent")) { + return (SILENT); + } + if (s.equalsIgnoreCase("brief")) { + return (BRIEF); + } + if (s.equalsIgnoreCase("verbose")) { + return (VERBOSE); + } + return (SILENT); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/ObjID.java gcc-3.1/libjava/java/rmi/server/ObjID.java *** gcc-3.0.4/libjava/java/rmi/server/ObjID.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/ObjID.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,105 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.io.Serializable; + import java.io.ObjectOutput; + import java.io.ObjectInput; + import java.io.IOException; + import java.lang.Math; + import java.io.DataInput; + import java.io.DataOutput; + import java.util.Random; + + public final class ObjID + implements Serializable { + + static final long serialVersionUID = -6386392263968365220L; + + private static long next = 0x8000000000000000L; + private static final Object lock = ObjID.class; + + public static final int REGISTRY_ID = 0; + public static final int ACTIVATOR_ID = 1; + public static final int DGC_ID = 2; + + private long objNum; + private UID space; + + public ObjID() { + synchronized (lock) { + objNum = next++; + } + space = new UID(); + } + + public ObjID(int num) { + objNum = (long)num; + space = new UID((short)0); + } + + public void write(ObjectOutput out) throws IOException { + DataOutput dout = (DataOutput)out; + dout.writeLong(objNum); + space.write(dout); + } + + public static ObjID read(ObjectInput in) throws IOException { + DataInput din = (DataInput)in; + ObjID id = new ObjID(); + id.objNum = din.readLong(); + id.space = UID.read(din); + return (id); + } + + public int hashCode() { + return ((int)objNum); + } + + public boolean equals(Object obj) { + if (obj instanceof ObjID && this.objNum == ((ObjID)obj).objNum) { + return (true); + } + return (false); + } + + public String toString() { + return ("[objNum: " + objNum + ", " + space + "]"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/Operation.java gcc-3.1/libjava/java/rmi/server/Operation.java *** gcc-3.0.4/libjava/java/rmi/server/Operation.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/Operation.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,56 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + public class Operation { + + private String operation; + + public Operation(String op) { + operation = op; + } + + public String getOperation() { + return (operation); + } + + public String toString() { + return (operation); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RMIClassLoader.java gcc-3.1/libjava/java/rmi/server/RMIClassLoader.java *** gcc-3.0.4/libjava/java/rmi/server/RMIClassLoader.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RMIClassLoader.java Thu Feb 14 23:16:07 2002 *************** *** 0 **** --- 1,125 ---- + /* RMIClassLoader.java + Copyright (c) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.net.URL; + import java.net.URLConnection; + import java.io.IOException; + import java.io.DataInputStream; + import java.net.MalformedURLException; + import java.util.StringTokenizer; + + public class RMIClassLoader + { + + static private class MyClassLoader extends ClassLoader + { + /** + * Non-private constructor to reduce bytecode emitted. + */ + MyClassLoader() + { + } + + Class defineClass(String name, byte[] data) + { + return defineClass(name, data, 0, data.length); + } + } + + static private MyClassLoader loader = new MyClassLoader(); + + /** + * @deprecated + */ + public static Class loadClass(String name) + throws MalformedURLException, ClassNotFoundException + { + return loadClass(System.getProperty("java.rmi.server.codebase"), name); + } + + public static Class loadClass(URL codebase, String name) + throws MalformedURLException, ClassNotFoundException + { + URL u = new URL(codebase, name + ".class"); + try + { + URLConnection conn = u.openConnection(); + DataInputStream strm = new DataInputStream(conn.getInputStream()); + byte data[] = new byte[conn.getContentLength()]; + strm.readFully(data); + return loader.defineClass(name, data); + } + catch (IOException _) + { + throw new ClassNotFoundException(name); + } + } + + public static Class loadClass(String codebase, String name) + throws MalformedURLException, ClassNotFoundException + { + StringTokenizer tok = new StringTokenizer(codebase, ":"); + while (tok.hasMoreTokens()) + { + try + { + return loadClass(new URL(tok.nextToken()), name); + } + catch (ClassNotFoundException _) + { + // Ignore - try the next one. + } + } + throw new ClassNotFoundException(name); + } + + public static String getClassAnnotation(Class cl) + { + return null; // We don't yet do this. + } + + /** + * @deprecated + */ + public static Object getSecurityContext(ClassLoader loader) + { + throw new Error("Not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RMIClientSocketFactory.java gcc-3.1/libjava/java/rmi/server/RMIClientSocketFactory.java *** gcc-3.0.4/libjava/java/rmi/server/RMIClientSocketFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RMIClientSocketFactory.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,47 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.net.Socket; + import java.io.IOException; + + public interface RMIClientSocketFactory { + + public Socket createSocket(String host, int port) throws IOException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RMIFailureHandler.java gcc-3.1/libjava/java/rmi/server/RMIFailureHandler.java *** gcc-3.0.4/libjava/java/rmi/server/RMIFailureHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RMIFailureHandler.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,44 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + public interface RMIFailureHandler { + + public boolean failure(Exception ex); + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RMIServerSocketFactory.java gcc-3.1/libjava/java/rmi/server/RMIServerSocketFactory.java *** gcc-3.0.4/libjava/java/rmi/server/RMIServerSocketFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RMIServerSocketFactory.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,47 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.net.ServerSocket; + import java.io.IOException; + + public interface RMIServerSocketFactory { + + public ServerSocket createServerSocket(int port) throws IOException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RMISocketFactory.java gcc-3.1/libjava/java/rmi/server/RMISocketFactory.java *** gcc-3.0.4/libjava/java/rmi/server/RMISocketFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RMISocketFactory.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,84 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.net.Socket; + import java.net.ServerSocket; + import java.io.IOException; + import gnu.java.rmi.server.RMIDefaultSocketFactory; + + public abstract class RMISocketFactory + implements RMIClientSocketFactory, RMIServerSocketFactory { + + static private RMISocketFactory defaultFactory; + static private RMISocketFactory currentFactory; + static private RMIFailureHandler currentHandler; + + static { + defaultFactory = new RMIDefaultSocketFactory(); + currentFactory = defaultFactory; + } + + public RMISocketFactory() { + } + + public abstract Socket createSocket(String host, int port) throws IOException; + + public abstract ServerSocket createServerSocket(int port) throws IOException; + + public static void setSocketFactory(RMISocketFactory fac) throws IOException { + currentFactory = fac; + } + + public static RMISocketFactory getSocketFactory() { + return (currentFactory); + } + + public static RMISocketFactory getDefaultSocketFactory() { + return (defaultFactory); + } + + public static void setFailureHandler(RMIFailureHandler fh) { + currentHandler = fh; + } + + public static RMIFailureHandler getFailureHandler() { + return (currentHandler); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RemoteCall.java gcc-3.1/libjava/java/rmi/server/RemoteCall.java *** gcc-3.0.4/libjava/java/rmi/server/RemoteCall.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RemoteCall.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,56 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.lang.Exception; + import java.io.IOException; + import java.io.ObjectOutput; + import java.io.ObjectInput; + import java.io.StreamCorruptedException; + + public interface RemoteCall { + + public ObjectOutput getOutputStream() throws IOException; + public void releaseOutputStream() throws IOException; + public ObjectInput getInputStream() throws IOException; + public void releaseInputStream() throws IOException; + public ObjectOutput getResultStream(boolean success) throws IOException, StreamCorruptedException; + public void executeCall() throws Exception; + public void done() throws IOException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RemoteObject.java gcc-3.1/libjava/java/rmi/server/RemoteObject.java *** gcc-3.0.4/libjava/java/rmi/server/RemoteObject.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RemoteObject.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,129 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.io.Serializable; + import java.rmi.Remote; + import java.rmi.NoSuchObjectException; + import java.rmi.UnmarshalException; + import java.rmi.server.RemoteRef; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; + import java.io.IOException; + import java.lang.ClassNotFoundException; + import java.lang.InstantiationException; + import java.lang.IllegalAccessException; + + public abstract class RemoteObject + implements Remote, Serializable { + + public static final long serialVersionUID = -3215090123894869218l; + + protected transient RemoteRef ref; + + protected RemoteObject() { + this(null); + } + + protected RemoteObject(RemoteRef newref) { + ref = newref; + } + + public RemoteRef getRef() { + return (ref); + } + + public static Remote toStub(Remote obj) throws NoSuchObjectException { + throw new Error("Not implemented"); + } + + public int hashCode() { + if (ref == null) { + return (0); + } + else { + return (ref.hashCode()); + } + } + + public boolean equals(Object obj) { + // We only compare references. + return (this == obj); + } + + public String toString() { + return (ref.toString()); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + String cname = in.readUTF(); + if (!cname.equals("")) { + cname = RemoteRef.packagePrefix + '.' + cname; + try { + Class cls = Class.forName(cname); + ref = (RemoteRef)cls.newInstance(); + } + catch (InstantiationException e1) { + throw new UnmarshalException("failed to create ref"); + } + catch (IllegalAccessException e2) { + throw new UnmarshalException("failed to create ref"); + } + ref.readExternal(in); + } + else { + ref = (RemoteRef)in.readObject(); + } + } + + private void writeObject(ObjectOutputStream out) throws IOException, ClassNotFoundException { + if (ref == null) { + throw new UnmarshalException("no ref to serialize"); + } + String cname = ref.getRefClass(out); + if (cname != null && cname.length() > 0) { + out.writeUTF(cname); + ref.writeExternal(out); + } + else { + out.writeUTF(""); + out.writeObject(ref); + } + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RemoteRef.java gcc-3.1/libjava/java/rmi/server/RemoteRef.java *** gcc-3.0.4/libjava/java/rmi/server/RemoteRef.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RemoteRef.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,61 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.lang.reflect.Method; + import java.io.Externalizable; + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.io.ObjectOutput; + + public interface RemoteRef + extends Externalizable { + + public static final long serialVersionUID = 0; + public static final String packagePrefix = "gnu.java.rmi.server"; + + public void invoke(RemoteCall call) throws Exception; + public Object invoke(Remote obj, Method method, Object[] params, long opnum) throws Exception; + public RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash) throws RemoteException; + public void done(RemoteCall call) throws RemoteException; + public boolean remoteEquals(RemoteRef ref); + public int remoteHashCode(); + public String getRefClass(ObjectOutput out); + public String remoteToString(); + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RemoteServer.java gcc-3.1/libjava/java/rmi/server/RemoteServer.java *** gcc-3.0.4/libjava/java/rmi/server/RemoteServer.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RemoteServer.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,66 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.io.OutputStream; + import java.io.PrintStream; + + public abstract class RemoteServer + extends RemoteObject { + + protected RemoteServer() { + super(); + } + + protected RemoteServer(RemoteRef ref) { + super(ref); + } + + public static String getClientHost() throws ServerNotActiveException { + throw new Error("Not implemented"); + } + + public static void setLog(OutputStream out) { + throw new Error("Not implemented"); + } + + public static PrintStream getLog() { + throw new Error("Not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/RemoteStub.java gcc-3.1/libjava/java/rmi/server/RemoteStub.java *** gcc-3.0.4/libjava/java/rmi/server/RemoteStub.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/RemoteStub.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,57 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + public abstract class RemoteStub + extends RemoteObject { + + public static final long serialVersionUID = -1585587260594494182l; + + protected RemoteStub() { + super(); + } + + protected RemoteStub(RemoteRef ref) { + super(ref); + } + + protected static void setRef(RemoteStub stub, RemoteRef ref) { + stub.ref = ref; + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/ServerCloneException.java gcc-3.1/libjava/java/rmi/server/ServerCloneException.java *** gcc-3.0.4/libjava/java/rmi/server/ServerCloneException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/ServerCloneException.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,86 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.lang.CloneNotSupportedException; + import java.io.PrintStream; + import java.io.PrintWriter; + + public class ServerCloneException + extends CloneNotSupportedException { + + public Exception detail; + + public ServerCloneException(String s) { + super(s); + detail = null; + } + + public ServerCloneException(String s, Exception e) { + super(s); + detail = e; + } + + public String getMessage() { + if (detail != null) { + return (super.getMessage() + ":" + detail.getMessage()); + } + else { + return (super.getMessage()); + } + } + + public void printStackTrace(PrintStream s) { + if (detail != null) { + detail.printStackTrace(s); + } + super.printStackTrace(s); + } + + public void printStackTrace() { + printStackTrace(System.err); + } + + public void printStackTrace(PrintWriter s) { + if (detail != null) { + detail.printStackTrace(s); + } + super.printStackTrace(s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/ServerNotActiveException.java gcc-3.1/libjava/java/rmi/server/ServerNotActiveException.java *** gcc-3.0.4/libjava/java/rmi/server/ServerNotActiveException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/ServerNotActiveException.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.lang.Exception; + + public class ServerNotActiveException + extends Exception { + + public ServerNotActiveException() { + super(); + } + + public ServerNotActiveException(String s) { + super(s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/ServerRef.java gcc-3.1/libjava/java/rmi/server/ServerRef.java *** gcc-3.0.4/libjava/java/rmi/server/ServerRef.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/ServerRef.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.rmi.server.RemoteStub; + import java.rmi.Remote; + import java.rmi.RemoteException; + import java.rmi.server.ServerNotActiveException; + + public interface ServerRef + extends RemoteRef { + + public static final long serialVersionUID = 0; + + public RemoteStub exportObject(Remote obj, Object data) throws RemoteException; + public String getClientHost() throws ServerNotActiveException; + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/Skeleton.java gcc-3.1/libjava/java/rmi/server/Skeleton.java *** gcc-3.0.4/libjava/java/rmi/server/Skeleton.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/Skeleton.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,49 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.rmi.Remote; + import java.lang.Exception; + import java.rmi.server.RemoteCall; + + public interface Skeleton { + + public void dispatch(Remote obj, RemoteCall theCall, int opnum, long hash) throws Exception; + public Operation[] getOperations(); + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/SkeletonMismatchException.java gcc-3.1/libjava/java/rmi/server/SkeletonMismatchException.java *** gcc-3.0.4/libjava/java/rmi/server/SkeletonMismatchException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/SkeletonMismatchException.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,51 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.rmi.RemoteException; + + public class SkeletonMismatchException + extends RemoteException { + + public static final long serialVersionUID = -7780460454818859281l; + + public SkeletonMismatchException(String s) { + super(s); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/SkeletonNotFoundException.java gcc-3.1/libjava/java/rmi/server/SkeletonNotFoundException.java *** gcc-3.0.4/libjava/java/rmi/server/SkeletonNotFoundException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/SkeletonNotFoundException.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.rmi.RemoteException; + + public class SkeletonNotFoundException + extends RemoteException { + + public SkeletonNotFoundException(String s) { + super(s); + } + + public SkeletonNotFoundException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/SocketSecurityException.java gcc-3.1/libjava/java/rmi/server/SocketSecurityException.java *** gcc-3.0.4/libjava/java/rmi/server/SocketSecurityException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/SocketSecurityException.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,53 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.rmi.server.ExportException; + + public class SocketSecurityException + extends ExportException { + + public SocketSecurityException(String s) { + super(s); + } + + public SocketSecurityException(String s, Exception e) { + super(s, e); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/UID.java gcc-3.1/libjava/java/rmi/server/UID.java *** gcc-3.0.4/libjava/java/rmi/server/UID.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/UID.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,130 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.io.Serializable; + import java.io.DataOutput; + import java.io.DataInput; + import java.io.IOException; + import java.util.Random; + import java.lang.Thread; + import java.lang.InterruptedException; + + public final class UID + implements Serializable { + + public static final long serialVersionUID = 1086053664494604050L; + + private static final Object lock = UID.class; + private static long baseTime = System.currentTimeMillis(); + private static short nextCount = Short.MIN_VALUE; + // This is sun's algorithm - don't ask me why ... + private static final int uniqueNr = (new Object()).hashCode(); + + private int unique; + private long time; + private short count; + + /** + * This is sun's algorithm - don't ask me why ... + */ + public UID() { + synchronized (lock) { + if (count == Short.MAX_VALUE) { + long newtime; + for (;;) { + newtime = System.currentTimeMillis(); + if (newtime - baseTime > 1000) { + break; + } + try { + Thread.sleep(1000); + } + catch (InterruptedException _) { + } + } + baseTime = newtime; + nextCount = Short.MIN_VALUE; + } + count = nextCount++; + unique = uniqueNr; + time = baseTime; + } + } + + public UID(short num) { + unique = (int)num; + time = 0; + count = 0; + } + + public int hashCode() { + return (unique); + } + + public boolean equals(Object obj) { + if (obj instanceof UID) { + UID uid = (UID)obj; + if (this.unique == uid.unique && + this.time == uid.time && + this.count == uid.count) { + return (true); + } + } + return (false); + } + + public String toString() { + return ("[UID: " + unique + "," + time + "," + count + "]"); + } + + public void write(DataOutput out) throws IOException { + out.writeInt(unique); + out.writeLong(time); + out.writeShort(count); + } + + public static UID read(DataInput in) throws IOException { + UID id = new UID(); + id.unique = in.readInt(); + id.time = in.readLong(); + id.count = in.readShort(); + return (id); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/UnicastRemoteObject.java gcc-3.1/libjava/java/rmi/server/UnicastRemoteObject.java *** gcc-3.0.4/libjava/java/rmi/server/UnicastRemoteObject.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/UnicastRemoteObject.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,86 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + import java.rmi.RemoteException; + import java.rmi.Remote; + import java.rmi.server.RemoteRef; + import java.rmi.NoSuchObjectException; + import gnu.java.rmi.server.UnicastServerRef; + + public class UnicastRemoteObject + extends RemoteServer { + + protected UnicastRemoteObject() throws RemoteException { + this(0); + } + + protected UnicastRemoteObject(int port) throws RemoteException { + this(port, RMISocketFactory.getSocketFactory(), RMISocketFactory.getSocketFactory()); + } + + protected UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException { + super(new UnicastServerRef(new ObjID(), port, ssf)); + } + + protected UnicastRemoteObject(RemoteRef ref) throws RemoteException { + super((UnicastServerRef)ref); + } + + public Object clone() throws CloneNotSupportedException { + throw new Error("Not implemented"); + } + + public static RemoteStub exportObject(Remote obj) throws RemoteException { + UnicastServerRef sref = (UnicastServerRef)((RemoteObject)obj).getRef(); + return (sref.exportObject(obj)); + } + + public static Remote exportObject(Remote obj, int port) throws RemoteException { + return (exportObject(obj)); + } + + public static Remote exportObject(Remote obj, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException { + return (exportObject(obj)); + } + + public static boolean unexportObject(Remote obj, boolean force) throws NoSuchObjectException { + throw new Error("Not implemented"); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/rmi/server/Unreferenced.java gcc-3.1/libjava/java/rmi/server/Unreferenced.java *** gcc-3.0.4/libjava/java/rmi/server/Unreferenced.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/rmi/server/Unreferenced.java Tue Jan 22 22:40:29 2002 *************** *** 0 **** --- 1,44 ---- + /* + Copyright (c) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.rmi.server; + + public interface Unreferenced { + + public void unreferenced(); + + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AccessControlContext.java gcc-3.1/libjava/java/security/AccessControlContext.java *** gcc-3.0.4/libjava/java/security/AccessControlContext.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/AccessControlContext.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,175 ---- + /* AccessControlContext.java --- Access Control Context Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + AccessControlContext makes system resource access decsion + based on permission rights. + + It is used for a specific context and has only one method + checkPermission. It is similar to AccessController except + that it makes decsions based on the current context instead + of the the current thread. + + It is created by call AccessController.getContext method. + + @author Mark Benvenuto + @since JDK 1.2 + */ + public final class AccessControlContext + { + private ProtectionDomain protectionDomain[]; + private DomainCombiner combiner; + + /** + Construct a new AccessControlContext with the specified + ProtectionDomains. context must not be + null and duplicates will be removed. + + @param context The ProtectionDomains to use + */ + public AccessControlContext(ProtectionDomain[]context) + { + int i, j, k, count = context.length, count2 = 0; + for (i = 0, j = 0; i < count; i++) + { + for (k = 0; k < i; k++) + if (context[k] == protectionDomain[i]) + break; + if (k != i) //it means previous loop did not complete + continue; + + count2++; + } + + protectionDomain = new ProtectionDomain[count2]; + for (i = 0, j = 0; i < count2; i++) + { + for (k = 0; k < i; k++) + if (context[k] == protectionDomain[i]) + break; + if (k != i) //it means previous loop did not complete + continue; + + protectionDomain[j++] = context[i]; + } + } + + /** + Construct a new AccessControlContext with the specified + ProtectionDomains and DomainCombiner + + @param context The ProtectionDomains to use + + @since JDK 1.3 + */ + public AccessControlContext(AccessControlContext acc, + DomainCombiner combiner) + { + this(acc.protectionDomain); + this.combiner = combiner; + } + + /** + Returns the Domain Combiner associated with the AccessControlContext + + @returns the DomainCombiner + */ + public DomainCombiner getDomainCombiner() + { + return combiner; + } + + /** + Determines whether or not the specific permission is granted + depending on the context it is within. + + @param perm a permission to check + + @throws AccessControlException if the permssion is not permitted + */ + public void checkPermission(Permission perm) throws AccessControlException + { + for (int i = 0; i < protectionDomain.length; i++) + if (protectionDomain[i].implies(perm) == true) + return; + + throw new AccessControlException("Permission not granted"); + } + + /** + Checks if two AccessControlContexts are equal. + + It first checks if obj is an AccessControlContext class, and + then checks if each ProtectionDomain matches. + + @param obj The object to compare this class to + + @return true if equal, false otherwise + */ + public boolean equals(Object obj) + { + if (obj instanceof AccessControlContext) + { + AccessControlContext acc = (AccessControlContext) obj; + + if (acc.protectionDomain.length != protectionDomain.length) + return false; + + for (int i = 0; i < protectionDomain.length; i++) + if (acc.protectionDomain[i] != protectionDomain[i]) + return false; + return true; + } + return false; + } + + /** + Computes a hash code of this class + + @return a hash code representing this class + */ + public int hashCode() + { + int h = 0; + for (int i = 0; i < protectionDomain.length; i++) + h ^= protectionDomain[i].hashCode(); + + return h; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AccessControlException.java gcc-3.1/libjava/java/security/AccessControlException.java *** gcc-3.0.4/libjava/java/security/AccessControlException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/AccessControlException.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,91 ---- + /* AccessControlException.java -- Permission is denied + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This exception is thrown when the AccessController denies + * an attempt to perform an operation. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class AccessControlException extends SecurityException + { + /** + * The Permission associated with this exception + */ + private Permission perm; + + /** + * This method initializes a new instance of AccessControlException + * with a descriptive error message. There will be no Permission + * object associated with this exception. + * + * @param msg The descriptive error message + */ + public AccessControlException(String msg) + { + super(msg); + } + + /** + * This method initializes a new instance of AccessControlException + * with a descriptive error message and an instance of Permission + * that is the permission that caused the exception to be thrown. + * + * @param msg The descriptive error message + * @param perm The Permission object that caused this exception. + */ + public AccessControlException(String msg, Permission perm) + { + super(msg); + this.perm = perm; + } + + /** + * This method returns the Permission object that caused + * this exception to be thrown. + * + * @return The requested Permission object, or null if none is available. + */ + public Permission getPermission() + { + return (perm); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AccessController.java gcc-3.1/libjava/java/security/AccessController.java *** gcc-3.0.4/libjava/java/security/AccessController.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/AccessController.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,197 ---- + /* AccessController.java --- Access control context and permission checker + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * Access control context and permission checker. + * Can check permissions in the access control context of the current thread + * through the checkPermission() method. + * Manipulates the access control context for code that needs to be executed + * the protection domain of the calling class (by explicitly ignoring the + * context of the calling code) in the doPriviliged() methods. + * And provides a getContext() method which gives the access + * control context of the current thread that can be used for checking + * permissions at a later time and/or in another thread. + *

    + * XXX - Mostly a stub implementation at the moment. Needs native support + * from the VM to function correctly. XXX - Do not forget to think about + * how to handle java.lang.reflect.Method.invoke() on the + * doPrivileged() methods. + * + * @author Mark Wielaard (mark@klomp.org) + * @since 1.2 + */ + public final class AccessController + { + /** + * This class only has static methods so there is no public contructor. + */ + private AccessController() + { + } + + /** + * Checks wether the access control context of the current thread allows + * the given Permission. Throws an AccessControlException + * when the permission is not allowed in the current context. Otherwise + * returns silently without throwing an exception. + * + * @param perm the permission to be checked. + * @exception AccessControlException thrown if the current context does not + * allow the given permission. + */ + public static void checkPermission(Permission perm) + throws AccessControlException + { + getContext().checkPermission(perm); + } + + /** + * Calls the run() method of the given action with as + * (initial) access control context only the protection domain of the + * calling class. Calls to checkPermission() in the + * run() method ignore all earlier protection domains of + * classes in the call chain. Note that the protection domains of classes + * called by the code in the run() method are not ignored. + * + * @param action the PrivilegedAction whose run() + * should be be called. + * @returns the result of the action.run() method. + */ + public static Object doPrivileged(PrivilegedAction action) + { + return action.run(); + } + + /** + * Calls the run() method of the given action with as + * (initial) access control context the given context combined with the + * protection domain of the calling class. Calls to + * checkPermission() in the run() method ignore + * all earlier protection domains of classes in the call chain, but add + * checks for the protection domains given in the supplied context. + * + * @param action the PrivilegedAction whose run() + * should be be called. + * @param context the AccessControlContext whose protection + * domains should be added to the protection domain of the calling class. + * @returns the result of the action.run() method. + */ + public static Object doPrivileged(PrivilegedAction action, + AccessControlContext context) + { + return action.run(); + } + + /** + * Calls the run() method of the given action with as + * (initial) access control context only the protection domain of the + * calling class. Calls to checkPermission() in the + * run() method ignore all earlier protection domains of + * classes in the call chain. Note that the protection domains of classes + * called by the code in the run() method are not ignored. + * If the run() method throws an exception then this method + * will wrap that exception in an PrivilegedActionException. + * + * @param action the PrivilegedExceptionAction whose + * run() should be be called. + * @returns the result of the action.run() method. + * @exception PriviligedActionException wrapped around any exception that + * is thrown in the run() method. + */ + public static Object doPrivileged(PrivilegedExceptionAction action) + throws PrivilegedActionException + { + + try + { + return action.run(); + } + catch (Exception e) + { + throw new PrivilegedActionException(e); + } + } + + /** + * Calls the run() method of the given action with as + * (initial) access control context the given context combined with the + * protection domain of the calling class. Calls to + * checkPermission() in the run() method ignore + * all earlier protection domains of classes in the call chain, but add + * checks for the protection domains given in the supplied context. + * If the run() method throws an exception then this method + * will wrap that exception in an PrivilegedActionException. + * + * @param action the PrivilegedExceptionAction whose + * run() should be be called. + * @param context the AccessControlContext whose protection + * domains should be added to the protection domain of the calling class. + * @returns the result of the action.run() method. + * @exception PriviligedActionException wrapped around any exception that + * is thrown in the run() method. + */ + public static Object doPrivileged(PrivilegedExceptionAction action, + AccessControlContext context) + throws PrivilegedActionException + { + + try + { + return action.run(); + } + catch (Exception e) + { + throw new PrivilegedActionException(e); + } + } + + /** + * Returns the complete access control context of the current thread. + *

    + * XXX - Should this include all the protection domains in the call chain + * or only the domains till the last doPrivileged() call? + *

    + * XXX - needs native support. Currently returns an empty context. + */ + public static AccessControlContext getContext() + { + // For now just return an new empty context + return new AccessControlContext(new ProtectionDomain[0]); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AlgorithmParameterGenerator.java gcc-3.1/libjava/java/security/AlgorithmParameterGenerator.java *** gcc-3.0.4/libjava/java/security/AlgorithmParameterGenerator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/AlgorithmParameterGenerator.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,230 ---- + /* AlgorithmParameterGenerator.java --- Algorithm Parameter Generator + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.security.spec.AlgorithmParameterSpec; + + /** + AlgorithmParameterGenerator is used to generate + algorithm parameters for specified algorithms. + This class is used to generate the algorithm parameters + for a specific algorithm. + + @since JDK 1.2 + @author Mark Benvenuto + */ + public class AlgorithmParameterGenerator + { + private AlgorithmParameterGeneratorSpi paramGenSpi; + private Provider provider; + private String algorithm; + + /** + Creates an instance of AlgorithmParameters + + @param paramSpi A parameters engine to use + @param provider A provider to use + @param algorithm The algorithm + */ + protected AlgorithmParameterGenerator(AlgorithmParameterGeneratorSpi + paramGenSpi, Provider provider, + String algorithm) + { + this.paramGenSpi = paramGenSpi; + this.provider = provider; + this.algorithm = algorithm; + } + + /** + Returns the name of the algorithm used + + @return A string with the name of the algorithm + */ + public final String getAlgorithm() + { + return algorithm; + } + + /** + Gets an instance of the AlgorithmParameterGenerator class + which generates algorithm parameters for the specified algorithm. + If the algorithm is not found then, it throws NoSuchAlgorithmException. + + @param algorithm the name of algorithm to choose + @return a AlgorithmParameterGenerator repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by providers + */ + public static AlgorithmParameterGenerator getInstance(String algorithm) + throws NoSuchAlgorithmException + { + Provider[] p = Security.getProviders(); + + for (int i = 0; i < p.length; i++) + { + String classname = + p[i].getProperty("AlgorithmParameterGenerator." + algorithm); + if (classname != null) + return getInstance(classname, algorithm, p[i]); + } + + throw new NoSuchAlgorithmException(algorithm); + } + + /** + Gets an instance of the AlgorithmParameterGenerator class + which generates algorithm parameters for the specified algorithm. + If the algorithm is not found then, it throws NoSuchAlgorithmException. + + @param algorithm the name of algorithm to choose + @param provider the name of the provider to find the algorithm in + @return a AlgorithmParameterGenerator repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider + @throws NoSuchProviderException if the provider is not found + */ + public static AlgorithmParameterGenerator getInstance(String algorithm, + String provider) + throws NoSuchAlgorithmException, NoSuchProviderException + { + Provider p = Security.getProvider(provider); + if (p == null) + throw new NoSuchProviderException(); + + return getInstance(p. + getProperty("AlgorithmParameterGenerator." + + algorithm), algorithm, p); + } + + private static AlgorithmParameterGenerator getInstance(String classname, + String algorithm, + Provider provider) + throws NoSuchAlgorithmException + { + + try + { + return new + AlgorithmParameterGenerator((AlgorithmParameterGeneratorSpi) Class. + forName(classname).newInstance(), + provider, algorithm); + } + catch (ClassNotFoundException cnfe) + { + throw new NoSuchAlgorithmException("Class not found"); + } + catch (InstantiationException ie) + { + throw new NoSuchAlgorithmException("Class instantiation failed"); + } + catch (IllegalAccessException iae) + { + throw new NoSuchAlgorithmException("Illegal Access"); + } + } + + /** + Gets the provider that the class is from. + + @return the provider of this class + */ + public final Provider getProvider() + { + return provider; + } + + /** + Initializes the Algorithm Parameter Generator with the specified + size. (Since no source of randomness is supplied, a default + one is supplied). + + @param size size (in bits) to use + */ + public final void init(int size) + { + init(size, new SecureRandom()); + } + + /** + Initializes the Algorithm Parameter Generator with the specified + size and source of randomness. + + @param size size (in bits) to use + @param random source of randomness to use + */ + public final void init(int size, SecureRandom random) + { + paramGenSpi.engineInit(size, random); + } + + /** + Initializes the Algorithm Parameter Generator with the specified + AlgorithmParameterSpec. (Since no source of randomness is supplied, + a default one is supplied). + + @param genParamSpec the AlgorithmParameterSpec class to use + */ + public final void init(AlgorithmParameterSpec genParamSpec) throws + InvalidAlgorithmParameterException + { + init(genParamSpec, new SecureRandom()); + } + + /** + Initializes the Algorithm Parameter Generator with the specified + AlgorithmParameterSpec and source of randomness. + + @param genParamSpec the AlgorithmParameterSpec class to use + @param random source of randomness to use + */ + public final void init(AlgorithmParameterSpec genParamSpec, + SecureRandom random) throws + InvalidAlgorithmParameterException + { + paramGenSpi.engineInit(genParamSpec, random); + } + + /** + Generate a new set of AlgorithmParameters. + + @returns a new set of algorithm parameters + */ + public final AlgorithmParameters generateParameters() + { + return paramGenSpi.engineGenerateParameters(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AlgorithmParameterGeneratorSpi.java gcc-3.1/libjava/java/security/AlgorithmParameterGeneratorSpi.java *** gcc-3.0.4/libjava/java/security/AlgorithmParameterGeneratorSpi.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/AlgorithmParameterGeneratorSpi.java Tue Jan 22 22:40:30 2002 *************** *** 1,25 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; /** ! * @author Warren Levy ! * @date February 7, 2000. ! */ ! /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Stubbed. */ - - // JDK1.2 public abstract class AlgorithmParameterGeneratorSpi { ! // FIXME: Stubbed. } --- 1,94 ---- ! /* AlgorithmParameterGeneratorSpi.java --- Algorithm Parameter Generator SPI ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; + import java.security.spec.AlgorithmParameterSpec; /** ! AlgorithmParameterGeneratorSpi is the Service Provider ! Interface for the AlgorithmParameterGenerator class. ! This class is used to generate the algorithm parameters ! for a specific algorithm. ! @since JDK 1.2 ! @author Mark Benvenuto */ public abstract class AlgorithmParameterGeneratorSpi { ! ! /** ! Constructs a new AlgorithmParameterGeneratorSpi ! */ ! public AlgorithmParameterGeneratorSpi() ! { ! } ! ! /** ! Initializes the parameter generator with the specified size ! and SecureRandom ! ! @param size the size( in number of bits) ! @param random the SecureRandom class to use for randomness ! */ ! protected abstract void engineInit(int size, SecureRandom random); ! ! /** ! Initializes the parameter generator with the specified ! AlgorithmParameterSpec and SecureRandom classes. ! ! If genParamSpec is an invalid AlgorithmParameterSpec for this ! AlgorithmParameterGeneratorSpi then it throws ! InvalidAlgorithmParameterException ! ! @param genParamSpec the AlgorithmParameterSpec class to use ! @param random the SecureRandom class to use for randomness ! ! @throws InvalidAlgorithmParameterException genParamSpec is invalid ! */ ! protected abstract void engineInit(AlgorithmParameterSpec genParamSpec, ! SecureRandom random) throws ! InvalidAlgorithmParameterException; ! ! ! /** ! Generate a new set of AlgorithmParameters. ! ! @returns a new set of algorithm parameters ! */ ! protected abstract AlgorithmParameters engineGenerateParameters(); ! } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AlgorithmParameters.java gcc-3.1/libjava/java/security/AlgorithmParameters.java *** gcc-3.0.4/libjava/java/security/AlgorithmParameters.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/AlgorithmParameters.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,276 ---- + /* AlgorithmParameters.java --- Algorithm Parameters Implementation Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security; + import java.security.spec.InvalidParameterSpecException; + import java.security.spec.AlgorithmParameterSpec; + import java.io.IOException; + + /** + AlgorithmParameters is the Algorithm Parameters class which + provides an interface through which to modify parameters for + classes. This class is used to manage the algorithm parameters. + + @since JDK 1.2 + @author Mark Benvenuto + */ + public class AlgorithmParameters + { + private AlgorithmParametersSpi paramSpi; + private Provider provider; + private String algorithm; + + /** + Creates an instance of AlgorithmParameters + + @param paramSpi A parameters engine to use + @param provider A provider to use + @param algorithm The algorithm + */ + protected AlgorithmParameters(AlgorithmParametersSpi paramSpi, + Provider provider, String algorithm) + { + this.paramSpi = paramSpi; + this.provider = provider; + this.algorithm = algorithm; + } + + /** + Returns the name of the algorithm used + + @return A string with the name of the algorithm + */ + public final String getAlgorithm() + { + return algorithm; + } + + /** + Gets an instance of the AlgorithmParameters class representing + the specified algorithm parameters. If the algorithm is not + found then, it throws NoSuchAlgorithmException. + + The returned AlgorithmParameters must still be intialized with + init(). + + @param algorithm the name of algorithm to choose + @return a AlgorithmParameters repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by providers + */ + public static AlgorithmParameters getInstance(String algorithm) throws + NoSuchAlgorithmException + { + Provider[] p = Security.getProviders(); + + for (int i = 0; i < p.length; i++) + { + String classname = + p[i].getProperty("AlgorithmParameters." + algorithm); + if (classname != null) + return getInstance(classname, algorithm, p[i]); + } + + throw new NoSuchAlgorithmException(algorithm); + } + + /** + Gets an instance of the AlgorithmParameters class representing + the specified algorithm parameters from the specified provider. + If the algorithm is not found then, it throws + NoSuchAlgorithmException. If the provider is not found, then + it throws NoSuchProviderException. + + The returned AlgorithmParameters must still be intialized with + init(). + + @param algorithm the name of algorithm to choose + @param provider the name of the provider to find the algorithm in + @return a AlgorithmParameters repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider + @throws NoSuchProviderException if the provider is not found + */ + public static AlgorithmParameters getInstance(String algorithm, + String provider) throws + NoSuchAlgorithmException, NoSuchProviderException + { + Provider p = Security.getProvider(provider); + if (p == null) + throw new NoSuchProviderException(); + + return getInstance(p.getProperty("AlgorithmParameters." + algorithm), + algorithm, p); + } + + private static AlgorithmParameters getInstance(String classname, + String algorithm, + Provider provider) + throws NoSuchAlgorithmException + { + + try + { + return new AlgorithmParameters((AlgorithmParametersSpi) Class. + forName(classname).newInstance(), + provider, algorithm); + } + catch (ClassNotFoundException cnfe) + { + throw new NoSuchAlgorithmException("Class not found"); + } + catch (InstantiationException ie) + { + throw new NoSuchAlgorithmException("Class instantiation failed"); + } + catch (IllegalAccessException iae) + { + throw new NoSuchAlgorithmException("Illegal Access"); + } + } + + /** + Gets the provider that the class is from. + + @return the provider of this class + */ + public final Provider getProvider() + { + return provider; + } + + /** + Initializes the engine with the specified + AlgorithmParameterSpec class. + + @param paramSpec A AlgorithmParameterSpec to initialize with + + @throws InvalidParameterSpecException For an inapporiate ParameterSpec class + */ + public final void init(AlgorithmParameterSpec paramSpec) throws + InvalidParameterSpecException + { + paramSpi.engineInit(paramSpec); + } + + /** + Initializes the engine with the specified + parameters stored in the byte array and decodes them + according to the ASN.1 specification. If the ASN.1 + specification exists then it succeeds or else it throws + IOException. + + @param params Parameters to initialize with + + @throws IOException Decoding Error + */ + public final void init(byte[]params) throws IOException + { + paramSpi.engineInit(params); + } + + /** + Initializes the engine with the specified + parameters stored in the byte array and decodes them + according to the specified decoding specification. + If format is null, then it is decoded using the ASN.1 + specification if it exists or else it throws + IOException. + + @param params Parameters to initialize with + @param format Name of decoding format to use + + @throws IOException Decoding Error + */ + public final void init(byte[]params, String format) throws IOException + { + paramSpi.engineInit(params, format); + } + + /** + Returns a specification of this AlgorithmParameters object. + paramSpec identifies the class to return the AlgortihmParameters + in. + + @param paramSpec Class to return AlgorithmParameters in + + @return the parameter specification + + @throws InvalidParameterSpecException if the paramSpec is an invalid parameter class + */ + public final AlgorithmParameterSpec getParameterSpec(Class paramSpec) throws + InvalidParameterSpecException + { + return paramSpi.engineGetParameterSpec(paramSpec); + } + + /** + Returns the parameters in the default encoding format. + The primary encoding format is ASN.1 format if it exists + for the specified type. + + @return byte array representing the parameters + */ + public final byte[] getEncoded() throws IOException + { + return paramSpi.engineGetEncoded(); + } + + /** + Returns the parameters in the specified encoding format. + If format is null then the + primary encoding format is used, the ASN.1 format, + if it exists for the specified type. + + @return byte array representing the parameters + */ + public final byte[] getEncoded(String format) throws IOException + { + return paramSpi.engineGetEncoded(format); + } + + /** + Returns a string representation of the encoding format + + @return a string containing the string representation + */ + public final String toString() + { + return paramSpi.engineToString(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AlgorithmParametersSpi.java gcc-3.1/libjava/java/security/AlgorithmParametersSpi.java *** gcc-3.0.4/libjava/java/security/AlgorithmParametersSpi.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/AlgorithmParametersSpi.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,145 ---- + /* AlgorithmParametersSpi.java --- Algorithm Parameters SPI + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.security.spec.InvalidParameterSpecException; + import java.security.spec.AlgorithmParameterSpec; + import java.io.IOException; + + /** + AlgorithmParametersSpi is the Service Provider Interface + for the Algorithm Parameters class. This class is used + to manage the algorithm parameters. + + @since JDK 1.2 + @author Mark Benvenuto + */ + public abstract class AlgorithmParametersSpi + { + /** + Creates a new instance of AlgorithmParametersSpi + */ + public AlgorithmParametersSpi() + { + } + + /** + Initializes the engine with the specified + AlgorithmParameterSpec class. + + @param paramSpec A AlgorithmParameterSpec to initialize with + + @throws InvalidParameterSpecException For an inapporiate ParameterSpec class + */ + protected abstract void engineInit(AlgorithmParameterSpec paramSpec) throws + InvalidParameterSpecException; + + /** + Initializes the engine with the specified + parameters stored in the byte array and decodes them + according to the ASN.1 specification. If the ASN.1 + specification exists then it succeeds or else it throws + IOException. + + @param params Parameters to initialize with + + @throws IOException Decoding Error + */ + protected abstract void engineInit(byte[]params) throws IOException; + + /** + Initializes the engine with the specified + parameters stored in the byte array and decodes them + according to the specified decoding specification. + If format is null, then it is decoded using the ASN.1 + specification if it exists or else it throws + IOException. + + @param params Parameters to initialize with + @param format Name of decoding format to use + + @throws IOException Decoding Error + */ + protected abstract void engineInit(byte[]params, + String format) throws IOException; + + + /** + Returns a specification of this AlgorithmParameters object. + paramSpec identifies the class to return the AlgortihmParameters + in. + + @param paramSpec Class to return AlgorithmParameters in + + @return the parameter specification + + @throws InvalidParameterSpecException if the paramSpec is an invalid parameter class + */ + protected abstract AlgorithmParameterSpec engineGetParameterSpec(Class + paramSpec) + throws InvalidParameterSpecException; + + + /** + Returns the parameters in the default encoding format. + The primary encoding format is ASN.1 format if it exists + for the specified type. + + @return byte array representing the parameters + */ + protected abstract byte[] engineGetEncoded() throws IOException; + + + /** + Returns the parameters in the specified encoding format. + If format is null then the + primary encoding format is used, the ASN.1 format, + if it exists for the specified type. + + @return byte array representing the parameters + */ + protected abstract byte[] engineGetEncoded(String format) throws + IOException; + + /** + Returns a string describing the parameters in the + AlgorithmParametersSpi class. + + @return A string representing the format of the parameters. + */ + protected abstract String engineToString(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/AllPermission.java gcc-3.1/libjava/java/security/AllPermission.java *** gcc-3.0.4/libjava/java/security/AllPermission.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/AllPermission.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,134 ---- + /* AllPermission.java -- Permission to do anything + Copyright (C) 1998, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This class is a permission that implies all other permissions. Granting + * this permission effectively grants all others. Extreme caution should + * be exercised in granting this permission. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public final class AllPermission extends Permission + { + /** + * This method initializes a new instance of AllPermission. It + * performs no actions. + */ + public AllPermission() + { + super("all"); + } + + /** + * This method initializes a new instance of AllPermission. The + * arguments passed to this method are used to set internal field for the + * permission name. However, these are not used in + * determining the actual permissions granted. This class always will + * return true in its implies method. + * + * @param name The name of this permission. + * @param actions The action list for this permission - ignored in this class. + */ + public AllPermission(String name, String actions) + { + super(name); + } + + /** + * This method always returns true to indicate that this + * permission always implies that any other permission is also granted. + * + * @param perm The Permission to test against - ignored in this class. + * + * @return Always returns true + */ + public boolean implies(Permission perm) + { + return (true); + } + + /** + * This method tests this class for equality against another Object. + * This will return true if and only if the specified + * Object is an instance of AllPermission. + * + * @param obj The Object to test for equality to this object + */ + public boolean equals(Object obj) + { + if (obj instanceof AllPermission) + return (true); + + return (false); + } + + /** + * This method returns a hash code for this object. + * + * @return A hash value for this object. + */ + public int hashCode() + { + return (System.identityHashCode(this)); + } + + /** + * This method returns the list of actions associated with this object. + * This will always be the empty string ("") for this class. + * + * @return The action list. + */ + public String getActions() + { + return (""); + } + + /** + * This method returns a new instance of PermissionCollection + * suitable for holding instance of AllPermission. + * + * @return A new PermissionCollection. + */ + public PermissionCollection newPermissionCollection() + { + return (null); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/BasicPermission.java gcc-3.1/libjava/java/security/BasicPermission.java *** gcc-3.0.4/libjava/java/security/BasicPermission.java Fri May 19 17:55:33 2000 --- gcc-3.1/libjava/java/security/BasicPermission.java Thu Feb 14 23:16:08 2002 *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.security; *************** import java.util.Hashtable; *** 32,65 **** import java.util.Enumeration; /** ! * This class implements a simple model for named permissions without an ! * associated action list. That is, either the named permission is granted ! * or it is not. ! *

    ! * It also supports trailing wildcards to allow the ! * easy granting of permissions in a hierarchical fashion. (For example, ! * the name "org.gnu.*" might grant all permissions under the "org.gnu" ! * permissions hierarchy). The only valid wildcard character is a '*' ! * which matches anything. It must be the rightmost element in the ! * permission name and must follow a '.' or else the Permission name must ! * consist of only a '*'. Any other occurrence of a '*' is not valid. ! *

    ! * This class ignores the action list. Subclasses can choose to implement ! * actions on top of this class if desired. ! * ! * @version 0.1 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class BasicPermission extends Permission implements Serializable { - - /*************************************************************************/ - - /* - * Constructors - */ - /** * This method initializes a new instance of BasicPermission * with the specified name. If the name contains an illegal wildcard --- 42,70 ---- import java.util.Enumeration; /** ! * This class implements a simple model for named permissions without an ! * associated action list. That is, either the named permission is granted ! * or it is not. ! *

    ! * It also supports trailing wildcards to allow the ! * easy granting of permissions in a hierarchical fashion. (For example, ! * the name "org.gnu.*" might grant all permissions under the "org.gnu" ! * permissions hierarchy). The only valid wildcard character is a '*' ! * which matches anything. It must be the rightmost element in the ! * permission name and must follow a '.' or else the Permission name must ! * consist of only a '*'. Any other occurrence of a '*' is not valid. ! *

    ! * This class ignores the action list. Subclasses can choose to implement ! * actions on top of this class if desired. ! * ! * @version 0.1 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class BasicPermission extends java.security.Permission ! implements Serializable ! // FIXME extends with fully qualified classname as workaround for gcj 3.0.4 { /** * This method initializes a new instance of BasicPermission * with the specified name. If the name contains an illegal wildcard *************** public abstract class BasicPermission ex *** 70,92 **** * @exception IllegalArgumentException If the name contains an invalid wildcard character * @exception NullPointerException If the name is null */ ! public ! BasicPermission(String name) throws IllegalArgumentException, NullPointerException { super(name); if (name.indexOf("*") != -1) { if (!name.endsWith(".*") && !name.equals("*")) ! throw new IllegalArgumentException("Bad wildcard: " + name); if (name.indexOf("*") != name.lastIndexOf("*")) ! throw new IllegalArgumentException("Bad wildcard: " + name); } } - /*************************************************************************/ - /** * This method initializes a new instance of BasicPermission * with the specified name. If the name contains an illegal wildcard --- 75,95 ---- * @exception IllegalArgumentException If the name contains an invalid wildcard character * @exception NullPointerException If the name is null */ ! public BasicPermission(String name) ! throws IllegalArgumentException, NullPointerException { super(name); if (name.indexOf("*") != -1) { if (!name.endsWith(".*") && !name.equals("*")) ! throw new IllegalArgumentException("Bad wildcard: " + name); if (name.indexOf("*") != name.lastIndexOf("*")) ! throw new IllegalArgumentException("Bad wildcard: " + name); } } /** * This method initializes a new instance of BasicPermission * with the specified name. If the name contains an illegal wildcard *************** public abstract class BasicPermission ex *** 99,113 **** * @exception IllegalArgumentException If the name contains an invalid wildcard character * @exception NullPointerException If the name is null */ ! public ! BasicPermission(String name, String actions) throws IllegalArgumentException, NullPointerException { // ignore actions this(name); } - /*************************************************************************/ - /** * This method tests to see if the specified permission is implied by * this permission. This will be true if the following conditions are met: --- 102,114 ---- * @exception IllegalArgumentException If the name contains an invalid wildcard character * @exception NullPointerException If the name is null */ ! public BasicPermission(String name, String actions) ! throws IllegalArgumentException, NullPointerException { // ignore actions this(name); } /** * This method tests to see if the specified permission is implied by * this permission. This will be true if the following conditions are met: *************** public abstract class BasicPermission ex *** 124,131 **** * * @return true if the specified permission is implied by this one or false otherwise. */ ! public boolean ! implies(Permission perm) { if (!(perm instanceof BasicPermission)) return false; --- 125,131 ---- * * @return true if the specified permission is implied by this one or false otherwise. */ ! public boolean implies(Permission perm) { if (!(perm instanceof BasicPermission)) return false; *************** public abstract class BasicPermission ex *** 144,151 **** return false; } - /*************************************************************************/ - /** * This method tests to see if this object is equal to the specified * Object. This will be true if and only if the specified --- 144,149 ---- *************** public abstract class BasicPermission ex *** 160,179 **** * * @return true if the specified Object is equal to this object or false otherwise. */ ! public boolean ! equals(Object obj) { if (!(obj instanceof BasicPermission)) ! return(false); ! if (!getName().equals(((BasicPermission)obj).getName())) ! return(false); ! return(true); } - /*************************************************************************/ - /** * This method returns a hash code for this permission object. The hash * code returned is the value returned by calling the hashCode --- 158,174 ---- * * @return true if the specified Object is equal to this object or false otherwise. */ ! public boolean equals(Object obj) { if (!(obj instanceof BasicPermission)) ! return (false); ! if (!getName().equals(((BasicPermission) obj).getName())) ! return (false); ! return (true); } /** * This method returns a hash code for this permission object. The hash * code returned is the value returned by calling the hashCode *************** public abstract class BasicPermission ex *** 181,194 **** * * @return A hash value for this object */ ! public int ! hashCode() { ! return(getName().hashCode()); } - /*************************************************************************/ - /** * This method returns a list of the actions associated with this * permission. This method always returns the empty string ("") since --- 176,186 ---- * * @return A hash value for this object */ ! public int hashCode() { ! return (getName().hashCode()); } /** * This method returns a list of the actions associated with this * permission. This method always returns the empty string ("") since *************** public abstract class BasicPermission ex *** 196,209 **** * * @return The action list. */ ! public String ! getActions() { ! return(""); } - /*************************************************************************/ - /** * This method returns an instance of PermissionCollection * suitable for storing BasicPermission objects. This returns --- 188,198 ---- * * @return The action list. */ ! public String getActions() { ! return (""); } /** * This method returns an instance of PermissionCollection * suitable for storing BasicPermission objects. This returns *************** public abstract class BasicPermission ex *** 214,271 **** * * @return A new empty PermissionCollection object. */ ! public PermissionCollection ! newPermissionCollection() { ! return new PermissionCollection() { ! Hashtable permissions = new Hashtable(); ! boolean allAllowed = false; ! ! public void add(Permission permission) ! { ! if (isReadOnly()) ! throw new IllegalStateException("readonly"); ! BasicPermission bp = (BasicPermission) permission; ! String name = bp.getName(); ! if (name.equals("*")) ! allAllowed = true; ! permissions.put(name, bp); ! } ! ! public boolean implies(Permission permission) ! { ! if (!(permission instanceof BasicPermission)) ! return false; ! ! if (allAllowed) ! return true; ! BasicPermission toImply = (BasicPermission) permission; ! String name = toImply.getName(); ! if (name.equals("*")) ! return false; ! int prefixLength = name.length(); ! if (name.endsWith("*")) ! prefixLength -= 2; ! while (true) { if (permissions.get(name) != null) return true; ! prefixLength = name.lastIndexOf('.', prefixLength); if (prefixLength < 0) return false; name = name.substring(0, prefixLength + 1) + '*'; } ! } ! ! public Enumeration elements() ! { ! return permissions.elements(); ! } ! }; } ! } // class BasicPermission --- 203,260 ---- * * @return A new empty PermissionCollection object. */ ! public PermissionCollection newPermissionCollection() { ! return new PermissionCollection() ! { ! Hashtable permissions = new Hashtable(); ! boolean allAllowed = false; ! ! public void add(Permission permission) { ! if (isReadOnly()) ! throw new IllegalStateException("readonly"); ! BasicPermission bp = (BasicPermission) permission; ! String name = bp.getName(); ! if (name.equals("*")) ! allAllowed = true; ! permissions.put(name, bp); ! } ! public boolean implies(Permission permission) ! { ! if (!(permission instanceof BasicPermission)) ! return false; ! if (allAllowed) ! return true; ! BasicPermission toImply = (BasicPermission) permission; ! String name = toImply.getName(); ! if (name.equals("*")) ! return false; ! ! int prefixLength = name.length(); ! if (name.endsWith("*")) ! prefixLength -= 2; ! ! while (true) ! { if (permissions.get(name) != null) return true; ! prefixLength = name.lastIndexOf('.', prefixLength); if (prefixLength < 0) return false; name = name.substring(0, prefixLength + 1) + '*'; } ! } ! ! public Enumeration elements() ! { ! return permissions.elements(); ! } ! }; } ! } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Certificate.java gcc-3.1/libjava/java/security/Certificate.java *** gcc-3.0.4/libjava/java/security/Certificate.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/Certificate.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,125 ---- + /* Certificate.java -- Interface for modeling digital certificates + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + import java.io.InputStream; + import java.io.OutputStream; + import java.io.IOException; + + /** + * This interface models a digital certificate which verifies the + * authenticity of a party. This class simply allows certificate + * information to be queried, it does not guarantee that the certificate + * is valid. + *

    + * This class is deprecated in favor of the new java.security.cert package. + * It exists for backward compatibility only. + * + * @deprecated + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface Certificate + { + + /** + * This method returns the Principal that is guaranteeing + * this certificate. + * + * @return The Principal guaranteeing the certificate + */ + public abstract Principal getGuarantor(); + + /** + * This method returns the Principal being guaranteed by + * this certificate. + * + * @return The Principal guaranteed by this certificate. + */ + public abstract Principal getPrincipal(); + + /** + * This method returns the public key for the Principal that + * is being guaranteed. + * + * @return The PublicKey of the Principal being guaranteed + */ + public abstract PublicKey getPublicKey(); + + /** + * This method returns the encoding format of the certificate (e.g., "PGP", + * "X.509"). This format is used by the encodedecode methods. + * + * @return The encoding format being used + */ + public abstract String getFormat(); + + /** + * This method writes the certificate to an OutputStream in + * a format that can be understood by the decode method. + * + * @param out The OutputStream to write to. + * + * @exception KeyException If there is a problem with the internals of this certificate + * @exception IOException If an error occurs writing to the stream. + */ + public abstract void + encode(OutputStream out) throws KeyException, IOException; + + /** + * This method reads an encoded certificate from an InputStream. + * + * @param in The InputStream to read from. + * + * @param KeyException If there is a problem with the certificate data + * @param IOException If an error occurs reading from the stream. + */ + public abstract void + decode(InputStream in) throws KeyException, IOException; + + /** + * This method returns a String representation of the contents + * of this certificate. + * + * @param detail true to provided detailed information about this certificate, false otherwise + */ + public abstract String toString(boolean detail); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/CodeSource.java gcc-3.1/libjava/java/security/CodeSource.java *** gcc-3.0.4/libjava/java/security/CodeSource.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/CodeSource.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,327 ---- + /* CodeSource.java -- Code location and certifcates + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + import java.io.Serializable; + import java.net.URL; + import java.net.SocketPermission; + + /** + * This class represents a location from which code is loaded (as + * represented by a URL) and the list of certificates that are used to + * check the signatures of signed code loaded from this source. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class CodeSource implements Serializable + { + private static final String linesep = System.getProperty("line.separator"); + + /** + * This is the URL that represents the code base from which code will + * be loaded. + */ + private URL location; + + /** + * This is the list of certificates for this code base + */ + // What is the serialized form of this? + private java.security.cert.Certificate[] certs; + + /** + * This method initializes a new instance of CodeSource that + * loads code from the specified URL location and which uses the + * specified certificates for verifying signatures. + * + * @param location The location from which code will be loaded + * @param certs The list of certificates used for verifying signatures on code from this source + */ + public CodeSource(URL location, java.security.cert.Certificate[] certs) + { + this.location = location; + this.certs = certs; + } + + /** + * This method returns the URL specifying the location from which code + * will be loaded under this CodeSource. + * + * @return The code location for this CodeSource. + */ + public final URL getLocation() + { + return location; + } + + /** + * This method returns the list of digital certificates that can be used + * to verify the signatures of code loaded under this CodeSource. + * + * @return The certifcate list for this CodeSource. + */ + public final java.security.cert.Certificate[] getCertificates() + { + return certs; + } + + /** + * This method tests to see if a specified CodeSource is + * implied by this object. Effectively, to meet this test, the specified + * object must have all the certifcates this object has (but may have + * more) and must have a location that is a subset of this object's. In order + * for this object to imply the specified object, the following must be + * true: + *

    + *

      + *
    1. The specified CodeSource must not be null. + *
    2. If the specified CodeSource has a certificate list, + * all of that object's certificates must be present in the certificate + * list of this object. + *
    3. If this object does not have a null location, then + * the following addtional tests must be passed. + *
        + *
      1. The specified CodeSource must not have a null location. + *
      2. The specified CodeSource's location must be equal to + * this object's location, or
        + *
          + *
        • The specifiec CodeSource's location protocol, port, + * and ref (aka, anchor) must equal this objects, and + *
        • The specified CodeSource's location host must imply this + * object's location host, as determined by contructing + * SocketPermission objects from each with no action list and + * using that classes's implies method. And, + *
        • If this object's location file ends with a '/', then the specified + * object's location file must start with this object's location file. + * Otherwise, the specified object's location file must start with this + * object's location file with the '/' character appended to it. + *
        + *
      + *
    + * + * @param cs The CodeSource to test against this object + * + * @return true if this specified CodeSource is specified by this object, false otherwise. + */ + public boolean implies(CodeSource cs) + { + if (cs == null) + return false; + + // First check the certificate list + java.security.cert.Certificate[] their_certs = cs.getCertificates(); + java.security.cert.Certificate[] our_certs = getCertificates(); + + if (our_certs != null) + { + if (their_certs == null) + return false; + + for (int i = 0; i < our_certs.length; i++) + { + int j; + for (j = 0; j < their_certs.length; j++) + if (our_certs[i].equals(their_certs[j])) + break; + + if (j == their_certs.length) + return false; + } + } + + // Next check the location + URL their_loc = getLocation(); + URL our_loc = getLocation(); + + if (our_loc == null) + return true; + else if (their_loc == null) + return false; + + if (!our_loc.getProtocol().equals(their_loc.getProtocol())) + return false; + + if (our_loc.getPort() != -1) + if (our_loc.getPort() != their_loc.getPort()) + return false; + + if (our_loc.getRef() != null) + if (!our_loc.getRef().equals(their_loc.getRef())) + return false; + + // See javadoc comments for what we are doing here. + if (our_loc.getHost() != null) + { + String their_host = their_loc.getHost(); + if (their_host == null) + return false; + + SocketPermission our_sockperm = + new SocketPermission(our_loc.getHost(), "accept"); + SocketPermission their_sockperm = + new SocketPermission(their_host, "accept"); + + if (!our_sockperm.implies(their_sockperm)) + return false; + } + + String our_file = our_loc.getFile(); + if (our_file != null) + { + if (!our_file.endsWith("/")) + our_file = our_file + "/"; + + String their_file = their_loc.getFile(); + if (their_file == null) + return false; + + if (!their_file.startsWith(our_file)) + return false; + } + + return true; + } + + /** + * This method tests the specified Object for equality with + * this object. This will be true if and only if: + *

    + *

      + *
    • The specified object is not null. + *
    • The specified object is an instance of CodeSource. + *
    • The specified object's location is the same as this object's. + *
    • The specified object's certificate list contains the exact same + * entries as the object's. Note that the order of the certificate lists + * is not significant. + *
    + * + * @param obj The Object to test against. + * + * @return true if the specified object is equal to this one, false otherwise. + */ + public boolean equals(Object obj) + { + if (obj == null) + return false; + + if (!(obj instanceof CodeSource)) + return false; + + CodeSource cs = (CodeSource) obj; + + // First check the certificate list + java.security.cert.Certificate[] their_certs = cs.getCertificates(); + java.security.cert.Certificate[] our_certs = getCertificates(); + + if ((our_certs == null) && (their_certs != null)) + return false; + else if ((our_certs != null) && (their_certs == null)) + return false; + + if (our_certs != null) + { + if (our_certs.length != their_certs.length) + return false; + + for (int i = 0; i < our_certs.length; i++) + { + int j; + for (j = 0; j < their_certs.length; j++) + if (our_certs[i].equals(their_certs[j])) + break; + + if (j == their_certs.length) + return false; + } + } + + // Now the location + URL their_loc = cs.getLocation(); + URL our_loc = getLocation(); + + if ((our_loc == null) && (their_loc != null)) + return false; + + if (!our_loc.equals(their_loc)) + return false; + + return true; + } + + /** + * This method returns a hash value for this object. + * + * @return A hash value for this object. + */ + public int hashCode() + { + URL location = getLocation(); + if (location == null) + return System.identityHashCode(this); + + return location.hashCode(); + } + + /** + * This method returns a String that represents this object. + * This String will contain the object's hash code, location, + * and certificate list. + * + * @return A String for this object + */ + public String toString() + { + StringBuffer sb = new StringBuffer(""); + + sb.append(super.toString() + " (" + linesep); + sb.append("Location: " + getLocation() + linesep); + + java.security.cert.Certificate[] certs = getCertificates(); + if (certs == null) + sb.append("" + linesep); + else + for (int i = 0; i < certs.length; i++) + sb.append(certs[i] + linesep); + + sb.append(")" + linesep); + + return sb.toString(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/DigestException.java gcc-3.1/libjava/java/security/DigestException.java *** gcc-3.0.4/libjava/java/security/DigestException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/DigestException.java Tue Jan 22 22:40:30 2002 *************** *** 1,30 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.security; ! /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public class DigestException extends GeneralSecurityException { public DigestException() { super(); } public DigestException(String msg) { super(msg); --- 1,67 ---- ! /* DigestException.java -- A generic message digest exception ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.security; /** ! * This exception indicates that a generic message digest exception has ! * occurred. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public class DigestException extends GeneralSecurityException { + /** + * This method initializes a new DigestException with no + * descriptive message. + */ public DigestException() { super(); } + /** + * This method initializes a new instance of DigestException + * with a descriptive error message. + * + * @param msg The descriptive message + */ public DigestException(String msg) { super(msg); diff -Nrc3pad gcc-3.0.4/libjava/java/security/DigestInputStream.java gcc-3.1/libjava/java/security/DigestInputStream.java *** gcc-3.0.4/libjava/java/security/DigestInputStream.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/DigestInputStream.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,166 ---- + /* DigestInputStream.java --- An Input stream tied to a message digest + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + //import java.security.MessageDigest; + import java.io.InputStream; + import java.io.FilterInputStream; + import java.io.IOException; + + /** + DigestInputStream is a class that ties an InputStream with a + MessageDigest. The Message Digest is used by the class to + update it self as bytes are read from the InputStream. + + The updating to the digest depends on the on flag which is set + to true by default to tell the class to update the data + in the message digest. + + @version 0.0 + @author Mark Benvenuto + */ + public class DigestInputStream extends FilterInputStream + { + /** + The message digest for the DigestInputStream + */ + protected MessageDigest digest; + + //Manages the on flag + private boolean state = true; + + /** + Constructs a new DigestInputStream. + It associates a MessageDigest with the stream to + compute the stream as data is written. + + @param stream An InputStream to associate this stream with + @param digest A MessageDigest to hash the stream with + */ + public DigestInputStream(InputStream stream, MessageDigest digest) + { + super(stream); + //this.in = stream; + this.digest = digest; + } + + /** + Returns the MessageDigest associated with this DigestInputStream + + @return The MessageDigest used to hash this stream + */ + public MessageDigest getMessageDigest() + { + return digest; + } + + /** + Sets the current MessageDigest to current parameter + + @param digest A MessageDigest to associate with this stream + */ + public void setMessageDigest(MessageDigest digest) + { + this.digest = digest; + } + + /** + Reads a byte from the input stream and updates the digest. + This method reads the underlying input stream and if the + on flag is true then updates the message digest. + + @return Returns a byte from the input stream, -1 is returned to indicate that + the end of stream was reached before this read call + + @throws IOException if an IO error occurs in the underlying input stream, + this error is thrown + */ + public int read() throws IOException + { + int temp = in.read(); + + if (state == true && temp != -1) + digest.update((byte) temp); + + return temp; + } + + /** + Reads bytes from the input stream and updates the digest. + This method reads the underlying input stream and if the + on flag is true then updates the message digest. + + @param b a byte array to store the data from the input stream + @param off an offset to start at in the array + @param len length of data to read + @return Returns count of bytes read, -1 is returned to indicate that + the end of stream was reached before this read call + + @throws IOException if an IO error occurs in the underlying input stream, + this error is thrown + */ + public int read(byte[]b, int off, int len) throws IOException + { + int temp = in.read(b, off, len); + + if (state == true && temp != -1) + digest.update(b, off, len); + + return temp; + } + + /** + Sets the flag specifing if this DigestInputStream updates the + digest in the write() methods. The default is on; + + @param on True means it digests stream, false means it does not + */ + public void on(boolean on) + { + state = on; + } + + /** + Converts the input stream and underlying message digest to a string. + + @return A string representing the input stream and message digest. + */ + public String toString() + { + return "[Digest Input Stream] " + digest.toString(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/DigestOutputStream.java gcc-3.1/libjava/java/security/DigestOutputStream.java *** gcc-3.0.4/libjava/java/security/DigestOutputStream.java Fri May 19 17:55:33 2000 --- gcc-3.1/libjava/java/security/DigestOutputStream.java Tue Jan 22 22:40:30 2002 *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.security; *************** import java.io.IOException; *** 42,53 **** @version 0.0 @author Mark Benvenuto ! */ public class DigestOutputStream extends FilterOutputStream { /** The message digest for the DigestOutputStream ! */ protected MessageDigest digest; //Manages the on flag --- 52,63 ---- @version 0.0 @author Mark Benvenuto ! */ public class DigestOutputStream extends FilterOutputStream { /** The message digest for the DigestOutputStream ! */ protected MessageDigest digest; //Manages the on flag *************** public class DigestOutputStream extends *** 60,69 **** @param stream An OutputStream to associate this stream with @param digest A MessageDigest to hash the stream with ! */ ! public DigestOutputStream (OutputStream stream, MessageDigest digest) { ! super (stream); this.digest = digest; } --- 70,79 ---- @param stream An OutputStream to associate this stream with @param digest A MessageDigest to hash the stream with ! */ ! public DigestOutputStream(OutputStream stream, MessageDigest digest) { ! super(stream); this.digest = digest; } *************** public class DigestOutputStream extends *** 71,88 **** Returns the MessageDigest associated with this DigestOutputStream @return The MessageDigest used to hash this stream ! */ ! public MessageDigest getMessageDigest () { return digest; } ! /** Sets the current MessageDigest to current parameter ! @param digest A MessageDigest to associate with this stream ! */ ! public void setMessageDigest (MessageDigest digest) { this.digest = digest; } --- 81,98 ---- Returns the MessageDigest associated with this DigestOutputStream @return The MessageDigest used to hash this stream ! */ ! public MessageDigest getMessageDigest() { return digest; } ! /** Sets the current MessageDigest to current parameter ! @param digest A MessageDigest to associate with this stream ! */ ! public void setMessageDigest(MessageDigest digest) { this.digest = digest; } *************** public class DigestOutputStream extends *** 93,108 **** the underlying output stream. @param b A byte to write to the output stream ! @exception IOException if the underlying output stream cannot write the byte, this is thrown. ! */ ! public void write (int b) throws IOException { if (state) ! digest.update ((byte)b); ! ! super.write (b); } /** --- 103,118 ---- the underlying output stream. @param b A byte to write to the output stream ! @exception IOException if the underlying output stream cannot write the byte, this is thrown. ! */ ! public void write(int b) throws IOException { if (state) ! digest.update((byte) b); ! ! super.write(b); } /** *************** public class DigestOutputStream extends *** 115,127 **** @exception IOException if the underlying output stream cannot write the bytes, this is thrown. ! */ ! public void write (byte[] b, int off, int len) throws IOException { if (state) ! digest.update (b, off, len); ! super.write (b, off, len); } /** --- 125,137 ---- @exception IOException if the underlying output stream cannot write the bytes, this is thrown. ! */ ! public void write(byte[]b, int off, int len) throws IOException { if (state) ! digest.update(b, off, len); ! super.write(b, off, len); } /** *************** public class DigestOutputStream extends *** 129,136 **** digest in the write() methods. The default is on; @param on True means it digests stream, false means it does not ! */ ! public void on (boolean on) { state = on; } --- 139,146 ---- digest in the write() methods. The default is on; @param on True means it digests stream, false means it does not ! */ ! public void on(boolean on) { state = on; } *************** public class DigestOutputStream extends *** 139,145 **** Converts the output stream and underlying message digest to a string. @return A string representing the output stream and message digest. ! */ public String toString() { return "[Digest Output Stream] " + digest.toString(); --- 149,155 ---- Converts the output stream and underlying message digest to a string. @return A string representing the output stream and message digest. ! */ public String toString() { return "[Digest Output Stream] " + digest.toString(); diff -Nrc3pad gcc-3.0.4/libjava/java/security/DomainCombiner.java gcc-3.1/libjava/java/security/DomainCombiner.java *** gcc-3.0.4/libjava/java/security/DomainCombiner.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/DomainCombiner.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,64 ---- + /* DomainCombiner.java - Combines ProtectionDomains + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + A public interface used to combine two ProtectionDomains in a new + ProtectionDomain and update the current Protection Domains + associated with the current AccessControllerContext. + + It can add, subtract, or update ProtectionDomains or possibly + remove duplicates or any possible complex action but just not add + ones that do not already exist in either array. + + @since JDK 1.3 + @author Mark Benvenuto + */ + public interface DomainCombiner + { + /** + Combines the current ProtectionDomains of the Thread with new + ProtectionDomains. + + @param currentDomains - the ProtectionDomains for the current thread. + @param assignedDomains - ProtectionsDomains to add + @returns a new array of all the ProtectionDomains + */ + public ProtectionDomain[] combine(ProtectionDomain[]currentDomains, + ProtectionDomain[]assignedDomains); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/DummyKeyPairGenerator.java gcc-3.1/libjava/java/security/DummyKeyPairGenerator.java *** gcc-3.0.4/libjava/java/security/DummyKeyPairGenerator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/DummyKeyPairGenerator.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,66 ---- + /* DummyKeyPairGenerator.java + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.security.spec.AlgorithmParameterSpec; + + final class DummyKeyPairGenerator extends KeyPairGenerator + { + private KeyPairGeneratorSpi kpgSpi = null; + + public DummyKeyPairGenerator(KeyPairGeneratorSpi kpgSpi, String algorithm) + { + super(algorithm); + this.kpgSpi = kpgSpi; + } + + public void initialize(int keysize, SecureRandom random) + { + kpgSpi.initialize(keysize, random); + } + + public void initialize(AlgorithmParameterSpec params, SecureRandom random) + throws InvalidAlgorithmParameterException + { + kpgSpi.initialize(params, random); + } + + public KeyPair generateKeyPair() + { + return kpgSpi.generateKeyPair(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/DummyMessageDigest.java gcc-3.1/libjava/java/security/DummyMessageDigest.java *** gcc-3.0.4/libjava/java/security/DummyMessageDigest.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/DummyMessageDigest.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,73 ---- + /* DummyMessageDigest.java + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + import java.security.MessageDigest; + import java.security.MessageDigestSpi; + import java.security.DigestException; + + final class DummyMessageDigest extends MessageDigest + { + private MessageDigestSpi mdSpi = null; + + public DummyMessageDigest(MessageDigestSpi mdSpi, String algorithm) + { + super(algorithm); + this.mdSpi = mdSpi; + } + + protected void engineUpdate(byte input) + { + mdSpi.engineUpdate(input); + } + + protected void engineUpdate(byte[]input, int offset, int len) + { + mdSpi.engineUpdate(input, offset, len); + } + + protected byte[] engineDigest() + { + return mdSpi.engineDigest(); + } + + protected void engineReset() + { + mdSpi.engineReset(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/DummySignature.java gcc-3.1/libjava/java/security/DummySignature.java *** gcc-3.0.4/libjava/java/security/DummySignature.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/DummySignature.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,94 ---- + /* DummySignature.java + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + final class DummySignature extends Signature + { + private SignatureSpi sigSpi = null; + + public DummySignature(SignatureSpi sigSpi, String algorithm) + { + super(algorithm); + this.sigSpi = sigSpi; + } + + protected void engineInitVerify(PublicKey publicKey) + throws InvalidKeyException + { + sigSpi.engineInitVerify(publicKey); + } + + protected void engineInitSign(PrivateKey privateKey) + throws InvalidKeyException + { + sigSpi.engineInitSign(privateKey); + } + + protected void engineUpdate(byte b) throws SignatureException + { + sigSpi.engineUpdate(b); + } + + protected void engineUpdate(byte[]b, int off, int len) + throws SignatureException + { + sigSpi.engineUpdate(b, off, len); + } + + protected byte[] engineSign() throws SignatureException + { + return sigSpi.engineSign(); + } + + protected boolean engineVerify(byte[]sigBytes) throws SignatureException + { + return sigSpi.engineVerify(sigBytes); + } + + protected void engineSetParameter(String param, Object value) + throws InvalidParameterException + { + sigSpi.engineSetParameter(param, value); + } + + protected Object engineGetParameter(String param) + throws InvalidParameterException + { + return sigSpi.engineGetParameter(param); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/GeneralSecurityException.java gcc-3.1/libjava/java/security/GeneralSecurityException.java *** gcc-3.0.4/libjava/java/security/GeneralSecurityException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/GeneralSecurityException.java Tue Jan 22 22:40:30 2002 *************** *** 1,31 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.security; ! /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - - // JDK1.2 public class GeneralSecurityException extends Exception { public GeneralSecurityException() { super(); } public GeneralSecurityException(String msg) { super(msg); --- 1,72 ---- ! /* GeneralSecurityException.java -- Common superclass of security exceptions ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.security; /** ! * This class is the common superclass of all security exceptions. All ! * exceptions in java.security extend this class with the exception (no ! * pun intended) of AccessControlException and ! * CertificateException which extend SecurityException ! * and ProviderException which extens RuntimeException. ! * and InvalidParamterException which extends ! * IllegalArgumentException. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public class GeneralSecurityException extends Exception { + /** + * This method initializes a new instance of GeneralSecurityException + * with no descriptive error message. + */ public GeneralSecurityException() { super(); } + /** + * This method initializes a new instance of GeneralSecurityException + * with a descriptive error message. + * + * @param msg The descriptive error message. + */ public GeneralSecurityException(String msg) { super(msg); diff -Nrc3pad gcc-3.0.4/libjava/java/security/Guard.java gcc-3.1/libjava/java/security/Guard.java *** gcc-3.0.4/libjava/java/security/Guard.java Fri May 19 17:55:33 2000 --- gcc-3.1/libjava/java/security/Guard.java Tue Jan 22 22:40:30 2002 *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,54 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security; /** ! * This interface specifies a mechanism for querying whether or not ! * access is allowed to a guarded object. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public interface Guard { ! /** ! * This method tests whether or not access is allowed to the specified ! * guarded object. Access is allowed if this method returns silently. If ! * access is denied, an exception is generated. ! * ! * @param obj The Object to test ! * ! * @exception SecurityException If access to the object is denied. ! */ ! public abstract void ! checkGuard(Object obj) throws SecurityException; ! ! } // interface Guard ! --- 18,61 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.security; /** ! * This interface specifies a mechanism for querying whether or not ! * access is allowed to a guarded object. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public interface Guard { + /** + * This method tests whether or not access is allowed to the specified + * guarded object. Access is allowed if this method returns silently. If + * access is denied, an exception is generated. + * + * @param obj The Object to test + * + * @exception SecurityException If access to the object is denied. + */ + public abstract void checkGuard(Object obj) throws SecurityException; ! } diff -Nrc3pad gcc-3.0.4/libjava/java/security/GuardedObject.java gcc-3.1/libjava/java/security/GuardedObject.java *** gcc-3.0.4/libjava/java/security/GuardedObject.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/GuardedObject.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,95 ---- + /* GuardedObject.java -- An object protected by a Guard + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + import java.io.Serializable; + + /** + * This class is an object that is guarded by a Guard object. + * The object that is being guarded is retrieved by a call to the only + * method in this class - getObject. That method returns the + * guarded Object after first checking with the + * Guard. If the Guard disallows access, an + * exception will be thrown. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class GuardedObject implements Serializable + { + /** + * This is the Guard that is protecting the object. + */ + private Guard guard; + + /** + * This is the object that is being guarded. + */ + private Object object; + + /** + * This method initializes a new instance of GuardedObject + * that protects the specified Object using the specified + * Guard + * + * @param object The Object to guard + * @param guard The Guard that is protecting the object. + */ + public GuardedObject(Object object, Guard guard) + { + this.object = object; + this.guard = guard; + } + + /** + * This method first call the checkGuard method on the + * Guard object protecting the guarded object. If the + * Guard disallows access, an exception is thrown, otherwise + * the Object is returned. + * + * @return The object being guarded + * + * @exception SecurityException If the Guard disallows access to the object. + */ + public Object getObject() throws SecurityException + { + guard.checkGuard(object); + return (object); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Identity.java gcc-3.1/libjava/java/security/Identity.java *** gcc-3.0.4/libjava/java/security/Identity.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/Identity.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,374 ---- + /* Identity.java --- Identity Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.io.Serializable; + import java.util.Vector; + + /** + The Identity class is used to repsent people and companies that + can be authenticated using public key encryption. The identities + can also be abstract objects such as smart cards. + + Identity object store a name and public key for each identity. + The names cannot be changed and the identities can be scoped. + Each identity (name and public key) within a scope is unique + to that scope. + + Each identity has a set of ceritificates which all specify the + same public key but not necessarily the same name. + + The Identity class can be subclassed to allow additional + information to be attached to it. + + @since JDK 1.1 + + @deprecated Use java.security.KeyStore, the java.security.cert + package, and java.security.Principal. + + @author Mark Benvenuto + */ + public abstract class Identity implements Principal, Serializable + { + private String name; + private IdentityScope scope; + private PublicKey publicKey; + private String info; + private Vector certificates; + + /** + Creates a new instance of Identity from Serialized Data + */ + protected Identity() + { + } + + /** + Creates a new instance of Identity with the specified name + and IdentityScope. + + @param name the name to use + @param scope the scope to use + + @throws KeyManagementException if the identity is already + present + */ + public Identity(String name, IdentityScope scope) + throws KeyManagementException + { + this.name = name; + this.scope = scope; + } + + /** + Creates a new instance of Identity with the specified name + and no scope. + + @param name the name to use + */ + public Identity(String name) + { + this.name = name; + this.scope = null; + } + + /** + Gets the name for this Identity. + + @return the name + */ + public final String getName() + { + return name; + } + + /** + Gets the scope for this Identity. + + @return the scope + */ + public final IdentityScope getScope() + { + return scope; + } + + /** + Gets the public key for this identity. + + @return the public key + */ + public PublicKey getPublicKey() + { + return publicKey; + } + + /** + Sets the public key for this identity. + The old key and all certificates are removed. + + This class checks the security manager with the call + checkSecurityAccess with "setIdentityPublicKey". + + @param key the public key to use + + @throws KeyManagementException if this public key is used by + another identity in the current scope. + @throws SecurityException - if the security manager denies + access to "setIdentityPublicKey" + */ + public void setPublicKey(PublicKey key) throws KeyManagementException + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("setIdentityPublicKey"); + + this.publicKey = key; + } + + /** + Sets the general information string. + + This class checks the security manager with the call + checkSecurityAccess with "setIdentityInfo". + + @param info the general information string. + + @throws SecurityException - if the security manager denies + access to "setIdentityInfo" + */ + public void setInfo(String info) + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("setIdentityInfo"); + + this.info = info; + } + + /** + Gets the general information string. + + @return the string + */ + public String getInfo() + { + return info; + } + + /** + Adds a certificate to the list of ceritificates for this + identity. The public key in this certificate must match the + existing public key if it exists. + + This class checks the security manager with the call + checkSecurityAccess with "addIdentityCertificate". + + @param certificate the certificate to add + + @throws KeyManagementException if the certificate is invalid + or the public key conflicts + @throws SecurityException - if the security manager denies + access to "addIdentityCertificate" + */ + public void addCertificate(java.security.Certificate certificate) + throws KeyManagementException + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("addIdentityCertificate"); + + //Check public key of this certificate against the first one + //in the vector + if (certificates.size() > 0) + { + if (((Certificate) certificates.firstElement()).getPublicKey() != + publicKey) + throw new KeyManagementException("Public key does not match"); + } + certificates.addElement(certificate); + } + + /** + Removes a certificate from the list of ceritificates for this + identity. + + This class checks the security manager with the call + checkSecurityAccess with "removeIdentityCertificate". + + @param certificate the certificate to add + + @throws KeyManagementException if the certificate is invalid + @throws SecurityException - if the security manager denies + access to "removeIdentityCertificate" + */ + public void removeCertificate(Certificate certificate) + throws KeyManagementException + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("removeIdentityCertificate"); + + if (certificates.contains(certificate) == false) + throw new KeyManagementException("Certificate not found"); + + certificates.removeElement(certificate); + } + + /** + Returns an array of certificates for this identity. + + @returns array of certificates + */ + public Certificate[] certificates() + { + Certificate certs[] = new Certificate[certificates.size()]; + int max = certificates.size(); + for (int i = 0; i < max; i++) + certs[i] = (Certificate) certificates.elementAt(i); + return certs; + } + + /** + Checks for equality between this Identity and the specified + object. If first checks if they are the same object, then + if the name and scope matches and returns true if successful. + If these tests fail, identityEquals is called. + + @return true if they are equal, false otherwise + */ + public final boolean equals(Object identity) + { + if (identity instanceof Identity) + { + if (identity == this) + return true; + + if ((((Identity) identity).getName() == this.name) && + (((Identity) identity).getScope() == this.scope)) + return true; + + return identityEquals((Identity) identity); + } + return false; + } + + /** + Checks for equality between this Identity and the specified + object. A subclass should override this method. The default + behavior is to return true if the public key and names match. + + @return true if they are equal, false otherwise + */ + protected boolean identityEquals(Identity identity) + { + return ((identity.getName() == this.name) && + (identity.getPublicKey() == this.publicKey)); + } + + /** + Returns a string representing this Identity. + + This class checks the security manager with the call + checkSecurityAccess with "printIdentity". + + @returns a string representing this Identity. + + @throws SecurityException - if the security manager denies + access to "printIdentity" + */ + public String toString() + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("printIdentity"); + + /* TODO: Insert proper format here */ + return (name + ":@" + scope + " Public Key: " + publicKey); + } + + /** + Returns a detailed string representing this Identity. + + This class checks the security manager with the call + checkSecurityAccess with "printIdentity". + + @param detailed indicates whether or not to provide detailed + information + + @returns a string representing this Identity. + + @throws SecurityException - if the security manager denies + access to "printIdentity" + */ + public String toString(boolean detailed) + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("printIdentity"); + + if (detailed) + { + /* TODO: Insert proper detailed format here */ + return (name + ":@" + scope + " Public Key: " + publicKey); + } + else + { + /* TODO: Insert proper format here */ + return (name + ":@" + scope + " Public Key: " + publicKey); + } + } + + /** + Gets the hashcode for this Identity. + + @returns the hashcode + */ + public int hashCode() + { + int ret = name.hashCode(); + if (publicKey != null) + ret |= publicKey.hashCode(); + if (scope != null) + ret |= scope.hashCode(); + if (info != null) + ret |= info.hashCode(); + if (certificates != null) + ret |= certificates.hashCode(); + + return ret; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/IdentityScope.java gcc-3.1/libjava/java/security/IdentityScope.java *** gcc-3.0.4/libjava/java/security/IdentityScope.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/IdentityScope.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,216 ---- + /* IdentityScope.java --- IdentityScope Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.util.Enumeration; + + /** + IdentityScope represents a scope of an identity. IdentityScope + is also an Identity and can have a name and scope along with + the other qualitites identities posses. + + An IdentityScope contains other Identity objects. All Identity + objects are manipulated in the scope the same way. The scope + is suppose to apply different scope to different type of + Identities. + + No identity within the same scope can have the same public key. + + @since JDK 1.1 + + @deprecated Use java.security.KeyStore, the java.security.cert + package, and java.security.Principal. + + @author Mark Benvenuto + */ + public abstract class IdentityScope extends Identity + { + private static IdentityScope systemScope = null; + + /** + Creates a new instance of IdentityScope from Serialized Data + */ + protected IdentityScope() + { + super(); + } + + /** + Creates a new instance of IdentityScope with the specified name + and no scope. + + @param name the name to use + */ + public IdentityScope(String name) + { + super(name); + } + + /** + Creates a new instance of IdentityScope with the specified name + and IdentityScope. + + @param name the name to use + @param scope the scope to use + + @throws KeyManagementException if the identity scope is already + present + */ + public IdentityScope(String name, IdentityScope scope) + throws KeyManagementException + { + super(name, scope); + } + + /** + Gets the system's Scope. + */ + public static IdentityScope getSystemScope() + { + if (systemScope == null) + { + //Load it + //systemScope; + } + return systemScope; + } + + /** + Sets the scope of the system. + + This class checks the security manager with the call + checkSecurityAccess with "setSystemScope". + + @param scope the new sustem scope + + @throws SecurityException - if the security manager denies + access to "setSystemScope" + */ + protected static void setSystemScope(IdentityScope scope) + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("setSystemScope"); + + systemScope = scope; + } + + /** + Gets the number of entries within this IdentityScope. + + @returns the number of entries + */ + public abstract int size(); + + /** + Gets the specified Identity within this scope + by specified name. + + @param name name of Identity to get + + @returns an identity representing the name or null if it + cannot be found + */ + public abstract Identity getIdentity(String name); + + /** + Gets the specified Identity within this scope + by the specified Principal. + + @param principal The Principal of the Identity to get + + @returns an identity representing the principal or null if it + cannot be found + */ + public Identity getIdentity(Principal principal) + { + return getIdentity(principal.getName()); + } + + /** + Gets the specified Identity within this scope + by the specified public key. + + @param key the PublicKey of the Identity to get + + @returns an identity representing the public key or null if it + cannot be found + */ + public abstract Identity getIdentity(PublicKey key); + + /** + Adds an identity to his scope. + + @param identity the identity to add + + @throws KeyManagementException if it is an invalid identity, + an identity with the same key exists, or another error + occurs. + */ + public abstract void addIdentity(Identity identity) + throws KeyManagementException; + + /** + Removes an identity to his scope. + + @param identity the identity to remove + + @throws KeyManagementException if it is a missing identity, + or another error occurs. + */ + public abstract void removeIdentity(Identity identity) + throws KeyManagementException; + + /** + Returns an Enumeration of identities. + + @returns an enumeration of the identities. + */ + public abstract Enumeration identities(); + + /** + Returns a string representing this IdentityScope. + It includes the name, the scope name, and number of identities. + + @returns a string representing this IdentityScope. + */ + public String toString() + { + return (super.getName() + " " + super.getScope().getName() + + " " + size()); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/InvalidAlgorithmParameterException.java gcc-3.1/libjava/java/security/InvalidAlgorithmParameterException.java *** gcc-3.0.4/libjava/java/security/InvalidAlgorithmParameterException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/InvalidAlgorithmParameterException.java Tue Jan 22 22:40:30 2002 *************** *** 1,10 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; --- 1,39 ---- ! /* InvalidAlgorithmParameterException.java ! Copyright (C) 2000 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; diff -Nrc3pad gcc-3.0.4/libjava/java/security/InvalidKeyException.java gcc-3.1/libjava/java/security/InvalidKeyException.java *** gcc-3.0.4/libjava/java/security/InvalidKeyException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/InvalidKeyException.java Tue Jan 22 22:40:30 2002 *************** *** 1,10 **** /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; --- 1,38 ---- /* Copyright (C) 2000 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; diff -Nrc3pad gcc-3.0.4/libjava/java/security/InvalidParameterException.java gcc-3.1/libjava/java/security/InvalidParameterException.java *** gcc-3.0.4/libjava/java/security/InvalidParameterException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/InvalidParameterException.java Tue Jan 22 22:40:30 2002 *************** *** 1,10 **** /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; --- 1,38 ---- /* Copyright (C) 2000 Free Software Foundation ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; diff -Nrc3pad gcc-3.0.4/libjava/java/security/Key.java gcc-3.1/libjava/java/security/Key.java *** gcc-3.0.4/libjava/java/security/Key.java Thu Oct 5 23:57:16 2000 --- gcc-3.1/libjava/java/security/Key.java Tue Jan 22 22:40:30 2002 *************** *** 1,28 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security; import java.io.Serializable; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public interface Key extends Serializable { public static final long serialVersionUID = 6603384152749567654L; ! public String getAlgorithm(); ! public String getFormat(); ! public byte[] getEncoded(); } --- 1,86 ---- ! /* Key.java -- A abstract representation of a digital key ! Copyright (C) 1998, 2000 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; + import java.io.Serializable; /** ! * This interfaces models the base characteristics that all keys must ! * have. These are: a key algorithm, an encoded form, and a format used ! * to encode the key. Specific key types inherit from this interface. ! *

    ! * Note that since this interface extends Serializable, all ! * keys may be serialized. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface Key extends Serializable { + /** + * The verion identifier used for serialization. + */ public static final long serialVersionUID = 6603384152749567654L; ! /** ! * This method returns the name of the algorithm for this key. This is a ! * String such as "RSA". ! * ! * @return The name of the algorithm in use ! */ ! public abstract String getAlgorithm(); ! ! /** ! * This method returns the name of the encoding format for this key. This ! * is the name of the ASN.1 data format used for this key, such as ! * "X.509" or "PKCS#8". This method returns null if this key ! * does not have an encoding format. ! * ! * @return The name of the encoding format for this key, or null if there is no such format. ! */ ! public abstract String getFormat(); ! ! /** ! * This method returns the encoded form of the key. If this key does not ! * support encoding, this method returns null ! * ! * @return The encoded form of the key, or null if no encoded form is available. ! */ ! public abstract byte[] getEncoded(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyException.java gcc-3.1/libjava/java/security/KeyException.java *** gcc-3.0.4/libjava/java/security/KeyException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/KeyException.java Tue Jan 22 22:40:30 2002 *************** *** 1,30 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.security; ! /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public class KeyException extends GeneralSecurityException { public KeyException() { super(); } public KeyException(String msg) { super(msg); --- 1,66 ---- ! /* KeyException.java -- Thrown when there is a problem with a key ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.security; /** ! * This exception is thrown when there is a problem with a key. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public class KeyException extends GeneralSecurityException { + /** + * This method initializes a new instance of KeyException + * with no descriptive message. + */ public KeyException() { super(); } + /** + * This method initializes a new instance of KeyException + * with a descriptive message. + * + * @param msg The descriptive message. + */ public KeyException(String msg) { super(msg); diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyFactory.java gcc-3.1/libjava/java/security/KeyFactory.java *** gcc-3.0.4/libjava/java/security/KeyFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/KeyFactory.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,243 ---- + /* KeyFactory.java --- Key Factory Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.security.spec.KeySpec; + import java.security.spec.InvalidKeySpecException; + + /** + Key factories are used to convert keys (opaque cryptographic + keys of type Key) into key specifications (transparent + representations of the underlying key material). + + Key factories are bi-directional. They allow a key class + to be converted into a key specification (key material) and + back again. + + For example DSA public keys can be specified as + DSAPublicKeySpec or X509EncodedKeySpec. The key factory + translate these key specifications. + + @since JDK 1.2 + @author Mark Benvenuto + */ + public class KeyFactory + { + private KeyFactorySpi keyFacSpi; + private Provider provider; + private String algorithm; + + /** + Constructs a new keyFactory with the specified parameters. + + @param keyFacSpi Key Factory SPI to use + @param provider the provider of the Key Factory SPI + @param algorithm the name of the key algorithm for this key factory + */ + protected KeyFactory(KeyFactorySpi keyFacSpi, Provider provider, + String algorithm) + { + this.keyFacSpi = keyFacSpi; + this.provider = provider; + this.algorithm = algorithm; + } + + /** + Gets an instance of the KeyFactory class representing + the specified key factory. If the algorithm is not + found then, it throws NoSuchAlgorithmException. + + @param algorithm the name of algorithm to choose + @return a KeyFactory repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by providers + */ + public static KeyFactory getInstance(String algorithm) + throws NoSuchAlgorithmException + { + Provider[] p = Security.getProviders(); + + for (int i = 0; i < p.length; i++) + { + String classname = p[i].getProperty("KeyFactory." + algorithm); + if (classname != null) + return getInstance(classname, algorithm, p[i]); + } + + throw new NoSuchAlgorithmException(algorithm); + } + + /** + Gets an instance of the KeyFactory class representing + the specified key factory from the specified provider. + If the algorithm is not found then, it throws + NoSuchAlgorithmException. If the provider is not found, then + it throws NoSuchProviderException. + + @param algorithm the name of algorithm to choose + @param provider the name of the provider to find the algorithm in + @return a KeyFactory repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider + @throws NoSuchProviderException if the provider is not found + */ + public static KeyFactory getInstance(String algorithm, String provider) + throws NoSuchAlgorithmException, NoSuchProviderException + { + Provider p = Security.getProvider(provider); + if (p == null) + throw new NoSuchProviderException(); + + return getInstance(p.getProperty("KeyFactory." + algorithm), + algorithm, p); + } + + private static KeyFactory getInstance(String classname, + String algorithm, + Provider provider) + throws NoSuchAlgorithmException + { + + try + { + return new KeyFactory((KeyFactorySpi) Class.forName(classname). + newInstance(), provider, algorithm); + } + catch (ClassNotFoundException cnfe) + { + throw new NoSuchAlgorithmException("Class not found"); + } + catch (InstantiationException ie) + { + throw new NoSuchAlgorithmException("Class instantiation failed"); + } + catch (IllegalAccessException iae) + { + throw new NoSuchAlgorithmException("Illegal Access"); + } + } + + /** + Gets the provider that the class is from. + + @return the provider of this class + */ + public final Provider getProvider() + { + return provider; + } + + /** + Returns the name of the algorithm used + + @return A string with the name of the algorithm + */ + public final String getAlgorithm() + { + return algorithm; + } + + /** + Generates a public key from the provided key specification. + + @param keySpec key specification + + @return the public key + + @throws InvalidKeySpecException invalid key specification for + this key factory to produce a public key + */ + public final PublicKey generatePublic(KeySpec keySpec) throws + InvalidKeySpecException + { + return keyFacSpi.engineGeneratePublic(keySpec); + } + + /** + Generates a private key from the provided key specification. + + @param keySpec key specification + + @return the private key + + @throws InvalidKeySpecException invalid key specification for + this key factory to produce a private key + */ + public final PrivateKey generatePrivate(KeySpec keySpec) throws + InvalidKeySpecException + { + return keyFacSpi.engineGeneratePrivate(keySpec); + } + + /** + Returns a key specification for the given key. keySpec + identifies the specification class to return the key + material in. + + @param key the key + @param keySpec the specification class to return the + key material in. + + @return the key specification in an instance of the requested + specification class + + @throws InvalidKeySpecException the requested key specification + is inappropriate for this key or the key is + unrecognized. + */ + public final KeySpec getKeySpec(Key key, Class keySpec) + throws InvalidKeySpecException + { + return keyFacSpi.engineGetKeySpec(key, keySpec); + } + + /** + Translates the key from an unknown or untrusted provider + into a key for this key factory. + + @param the key from an unknown or untrusted provider + + @return the translated key + + @throws InvalidKeySpecException if the key cannot be + processed by this key factory + */ + public final Key translateKey(Key key) throws InvalidKeyException + { + return keyFacSpi.engineTranslateKey(key); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyFactorySpi.java gcc-3.1/libjava/java/security/KeyFactorySpi.java *** gcc-3.0.4/libjava/java/security/KeyFactorySpi.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/KeyFactorySpi.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,131 ---- + /* KeyFactorySpi.java --- Key Factory Service Provider Interface + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.security.spec.KeySpec; + import java.security.spec.InvalidKeySpecException; + + /** + KeyFactorySpi is the Service Provider Interface (SPI) for the + KeyFactory class. This is the interface for providers to + supply to implement a key factory for an algorithm. + + Key factories are used to convert keys (opaque cryptographic + keys of type Key) into key specifications (transparent + representations of the underlying key material). + + Key factories are bi-directional. They allow a key class + to be converted into a key specification (key material) and + back again. + + For example DSA public keys can be specified as + DSAPublicKeySpec or X509EncodedKeySpec. The key factory + translate these key specifications. + + @since JDK 1.2 + @author Mark Benvenuto + */ + public abstract class KeyFactorySpi + { + /** + Constucts a new KeyFactorySpi. + */ + public KeyFactorySpi() + { + } + + /** + Generates a public key from the provided key specification. + + @param keySpec key specification + + @return the public key + + @throws InvalidKeySpecException invalid key specification for + this key factory to produce a public key + */ + protected abstract PublicKey engineGeneratePublic(KeySpec keySpec) + throws InvalidKeySpecException; + + + /** + Generates a private key from the provided key specification. + + @param keySpec key specification + + @return the private key + + @throws InvalidKeySpecException invalid key specification for + this key factory to produce a private key + */ + protected abstract PrivateKey engineGeneratePrivate(KeySpec keySpec) + throws InvalidKeySpecException; + + /** + Returns a key specification for the given key. keySpec + identifies the specification class to return the key + material in. + + @param key the key + @param keySpec the specification class to return the + key material in. + + @return the key specification in an instance of the requested + specification class + + @throws InvalidKeySpecException the requested key specification + is inappropriate for this key or the key is + unrecognized. + */ + protected abstract KeySpec engineGetKeySpec(Key key, Class keySpec) + throws InvalidKeySpecException; + + + /** + Translates the key from an unknown or untrusted provider + into a key for this key factory. + + @param the key from an unknown or untrusted provider + + @return the translated key + + @throws InvalidKeySpecException if the key cannot be + processed by this key factory + */ + protected abstract Key engineTranslateKey(Key key) + throws InvalidKeyException; + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyManagementException.java gcc-3.1/libjava/java/security/KeyManagementException.java *** gcc-3.0.4/libjava/java/security/KeyManagementException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/KeyManagementException.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,69 ---- + /* KeyManagementException.java -- What it says + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This exception is thrown whenever a problem related to the management of + * security keys is encountered. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class KeyManagementException extends KeyException + { + /** + * This method initializes a new instance of KeyManagementException + * with no descriptive error message. + */ + public KeyManagementException() + { + super(); + } + + /** + * This method initializes a new instance of KeyManagementException + * with a descriptive error message. + * + * @param msg The descriptive error message + */ + public KeyManagementException(String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyPair.java gcc-3.1/libjava/java/security/KeyPair.java *** gcc-3.0.4/libjava/java/security/KeyPair.java Tue Jun 27 05:10:03 2000 --- gcc-3.1/libjava/java/security/KeyPair.java Tue Jan 22 22:40:30 2002 *************** *** 1,41 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security; /** ! * @author Tom Tromey ! * @date February 9, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ ! ! public class KeyPair implements java.io.Serializable { ! public KeyPair (PublicKey publicKey, PrivateKey privateKey) { this.publicKey = publicKey; this.privateKey = privateKey; } ! public PublicKey getPublic () { return publicKey; } ! public PrivateKey getPrivate () { return privateKey; } - - // The keys. - private PublicKey publicKey; - private PrivateKey privateKey; } --- 1,85 ---- ! /* KeyPair.java --- Key Pair Class ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; + import java.io.Serializable; /** ! KeyPair serves as a simple container for public and private keys. ! If properly initialized, this class should be treated like the ! private key since it contains it and take approriate security ! measures. ! @author Mark Benvenuto */ ! public final class KeyPair implements Serializable { ! private PublicKey publicKey; ! private PrivateKey privateKey; ! ! /** ! Initializes the KeyPair with a pubilc and private key. ! ! @param publicKey Public Key to store ! @param privateKey Private Key to store ! */ ! public KeyPair(PublicKey publicKey, PrivateKey privateKey) { this.publicKey = publicKey; this.privateKey = privateKey; } ! /** ! Returns the public key stored in the KeyPair ! ! @return The public key ! */ ! public PublicKey getPublic() { return publicKey; } ! /** ! Returns the private key stored in the KeyPair ! ! @return The private key ! */ ! public PrivateKey getPrivate() { return privateKey; } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyPairGenerator.java gcc-3.1/libjava/java/security/KeyPairGenerator.java *** gcc-3.0.4/libjava/java/security/KeyPairGenerator.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/KeyPairGenerator.java Tue Jan 22 22:40:30 2002 *************** *** 1,86 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; /** ! * @author Warren Levy ! * @date February 10, 2000. ! */ ! /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Partially implemented to the 1.1 spec. ! * It is known not to comply with the 1.2 spec. ! */ public abstract class KeyPairGenerator extends KeyPairGeneratorSpi { protected KeyPairGenerator(String algorithm) { ! name = algorithm; } ! public static KeyPairGenerator getInstance(String algorithm) ! throws NoSuchAlgorithmException { String name = "KeyPairGenerator." + algorithm; ! Provider[] provs = Security.getProviders(); ! for (int i = 0; i < provs.length; ++i) { ! String val = provs[i].getProperty(name); ! if (val != null) ! { ! try ! { ! return (KeyPairGenerator) Class.forName(val).newInstance(); ! } ! catch (Throwable _) ! { ! // We just ignore failures. ! } ! } } throw new NoSuchAlgorithmException(algorithm); } public static KeyPairGenerator getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { - String name = "KeyPairGenerator." + algorithm; Provider p = Security.getProvider(provider); if (p == null) ! throw new NoSuchProviderException(provider); ! String val = p.getProperty(name); ! if (val != null) { ! try ! { ! return (KeyPairGenerator) Class.forName(val).newInstance(); ! } ! catch (Throwable _) { ! // Nothing. } } ! throw new NoSuchAlgorithmException(algorithm); } ! public String getAlgorithm() { ! return name; } ! public abstract void initialize(int strength, SecureRandom random); ! public abstract KeyPair generateKeyPair(); ! // Algorithm name. ! private String name; } --- 1,267 ---- ! /* KeyPairGenerator.java --- Key Pair Generator Class ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; + import java.security.spec.AlgorithmParameterSpec; /** ! KeyPairGenerator is the class used to generate key pairs ! for a security algorithm. ! The KeyPairGenerator is created with the getInstance() ! methods. The class is used to generate public and private ! keys for an algorithm and associate it with ! algorithm parameters. + @author Mark Benvenuto + */ public abstract class KeyPairGenerator extends KeyPairGeneratorSpi { + private Provider provider; + private String algorithm; + + /** + Constructs a new KeyPairGenerator + + @param algorithm the algorithm to use + */ protected KeyPairGenerator(String algorithm) { ! this.algorithm = algorithm; ! this.provider = null; } ! /** ! Returns the name of the algorithm used ! ! @return A string with the name of the algorithm ! */ ! public String getAlgorithm() { + return algorithm; + } + + /** + Gets an instance of the KeyPairGenerator class + which generates key pairs for the specified algorithm. + If the algorithm is not found then, it throws NoSuchAlgorithmException. + + @param algorithm the name of algorithm to choose + @return a AlgorithmParameterGenerator repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by providers + */ + public static KeyPairGenerator getInstance(String algorithm) throws + NoSuchAlgorithmException + { + Provider[] p = Security.getProviders(); + String name = "KeyPairGenerator." + algorithm; ! for (int i = 0; i < p.length; i++) { ! String classname = p[i].getProperty(name); ! if (classname != null) ! return getInstance(classname, algorithm, p[i]); } throw new NoSuchAlgorithmException(algorithm); } + /** + Gets an instance of the KeyPairGenerator class + which generates key pairs for the specified algorithm. + If the algorithm is not found then, it throws NoSuchAlgorithmException. + + @param algorithm the name of algorithm to choose + @param provider the name of the provider to find the algorithm in + @return a AlgorithmParameterGenerator repesenting the desired algorithm + + @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider + @throws NoSuchProviderException if the provider is not found + */ public static KeyPairGenerator getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { Provider p = Security.getProvider(provider); if (p == null) ! throw new NoSuchProviderException(); ! ! return getInstance(p.getProperty("KeyPairGenerator." + algorithm), ! algorithm, p); ! } ! ! private static KeyPairGenerator getInstance(String classname, ! String algorithm, ! Provider provider) ! throws NoSuchAlgorithmException ! { ! try { ! Object o = Class.forName(classname).newInstance(); ! KeyPairGenerator kpg; ! if (o instanceof KeyPairGeneratorSpi) ! kpg = ! (KeyPairGenerator) (new ! DummyKeyPairGenerator((KeyPairGeneratorSpi) o, ! algorithm)); ! else { ! kpg = (KeyPairGenerator) o; ! kpg.algorithm = algorithm; } + + kpg.provider = provider; + return kpg; } + catch (ClassNotFoundException cnfe) + { + throw new NoSuchAlgorithmException("Class not found"); + } + catch (InstantiationException ie) + { + throw new NoSuchAlgorithmException("Class instantiation failed"); + } + catch (IllegalAccessException iae) + { + throw new NoSuchAlgorithmException("Illegal Access"); + } + } ! /** ! Gets the provider that the class is from. ! ! @return the provider of this class ! */ ! public final Provider getProvider() ! { ! return provider; } ! /** ! Initializes the KeyPairGenerator for the specified key size. ! (Since no source of randomness is specified, a default one is ! provided.) ! ! @param keysize Size of key to generate ! */ ! public void initialize(int keysize) { ! initialize(keysize, new SecureRandom()); } ! /** ! Initializes the KeyPairGenerator for the specified key size ! and specified SecureRandom. ! @param keysize Size of key to generate ! @param random SecureRandom to use ! ! @since JDK 1.2 ! */ ! public void initialize(int keysize, SecureRandom random) ! { ! initialize(keysize, random); ! } ! ! /** ! Initializes the KeyPairGenerator with the specified ! AlgorithmParameterSpec class. ! (Since no source of randomness is specified, a default one is ! provided.) ! ! @param params AlgorithmParameterSpec to initialize with ! ! @since JDK 1.2 ! */ ! public void initialize(AlgorithmParameterSpec params) ! throws InvalidAlgorithmParameterException ! { ! initialize(params, new SecureRandom()); ! } ! ! /** ! Initializes the KeyPairGenerator with the specified ! AlgorithmParameterSpec class and specified SecureRandom. ! ! @param params AlgorithmParameterSpec to initialize with ! @param random SecureRandom to use ! ! @since JDK 1.2 ! */ ! public void initialize(AlgorithmParameterSpec params, SecureRandom random) ! throws InvalidAlgorithmParameterException ! { ! super.initialize(params, random); ! } ! ! /** ! Generates a KeyPair according the rules for the algorithm. ! Unless intialized, algorithm defaults will be used. It ! creates a unique key pair each time. ! ! Same as generateKeyPair(); ! ! @return a key pair ! */ ! public final KeyPair genKeyPair() ! { ! try ! { ! return getInstance("DSA", "GNU").generateKeyPair(); ! } ! catch (Exception e) ! { ! System.err.println("genKeyPair failed: " + e); ! e.printStackTrace(); ! return null; ! } ! } ! ! /** ! Generates a KeyPair according the rules for the algorithm. ! Unless intialized, algorithm defaults will be used. It ! creates a unique key pair each time. ! ! Same as genKeyPair(); ! ! @return a key pair ! */ ! public KeyPair generateKeyPair() ! { ! return genKeyPair(); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyPairGeneratorSpi.java gcc-3.1/libjava/java/security/KeyPairGeneratorSpi.java *** gcc-3.0.4/libjava/java/security/KeyPairGeneratorSpi.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/KeyPairGeneratorSpi.java Tue Jan 22 22:40:30 2002 *************** *** 1,26 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; /** ! * @author Warren Levy ! * @date February 7, 2000. ! */ ! /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Partially implemented. */ - - // JDK1.2 public abstract class KeyPairGeneratorSpi { public abstract void initialize(int keysize, SecureRandom random); public abstract KeyPair generateKeyPair(); } --- 1,93 ---- ! /* KeyPairGeneratorSpi.java --- Key Pair Generator SPI Class ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; + import java.security.spec.AlgorithmParameterSpec; /** ! KeyPairGeneratorSpi is the interface used to generate key pairs ! for security algorithms. ! @author Mark Benvenuto */ public abstract class KeyPairGeneratorSpi { + /** + Constructs a new KeyPairGeneratorSpi + */ + public KeyPairGeneratorSpi() + { + } + + /** + Initialize the KeyPairGeneratorSpi with the specified + key size and source of randomness + + @param keysize size of the key to generate + @param random A SecureRandom source of randomness + */ public abstract void initialize(int keysize, SecureRandom random); + + /** + Initialize the KeyPairGeneratorSpi with the specified + AlgorithmParameterSpec and source of randomness + + This is a concrete method. It may be overridden by the provider + and if the AlgorithmParameterSpec class is invalid + throw InvalidAlgorithmParameterException. By default this + method just throws UnsupportedOperationException. + + @param params A AlgorithmParameterSpec to intialize with + @param random A SecureRandom source of randomness + + @throws InvalidAlgorithmParameterException + */ + public void initialize(AlgorithmParameterSpec params, SecureRandom random) + throws InvalidAlgorithmParameterException + { + throw new java.lang.UnsupportedOperationException(); + } + + /** + Generates a KeyPair according the rules for the algorithm. + Unless intialized, algorithm defaults will be used. It + creates a unique key pair each time. + + @return a key pair + */ public abstract KeyPair generateKeyPair(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyStore.java gcc-3.1/libjava/java/security/KeyStore.java *** gcc-3.0.4/libjava/java/security/KeyStore.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/KeyStore.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,458 ---- + /* KeyStore.java --- Key Store Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.io.InputStream; + import java.io.IOException; + import java.io.OutputStream; + import java.security.cert.CertificateException; + import java.util.Date; + import java.util.Enumeration; + + /** + Keystore represents an in-memory collection of keys and + certificates. There are two types of entries: + + * Key Entry + + This type of keystore entry store sensitive crytographic key + information in a protected format.Typically this is a secret + key or a private key with a certificate chain. + + + * Trusted Ceritificate Entry + + This type of keystore entry contains a single public key + certificate belonging to annother entity. It is called trusted + because the keystore owner trusts that the certificates + belongs to the subject (owner) of the certificate. + + The keystore contains an "alias" string for each entry. + + The structure and persistentence of the key store is not + specified. Any method could be used to protect sensitive + (private or secret) keys. Smart cards or integrated + cryptographic engines could be used or the keystore could + be simply stored in a file. + */ + public class KeyStore + { + private KeyStoreSpi keyStoreSpi; + private Provider provider; + private String type; + + /** + Creates an instance of KeyStore + + @param keyStoreSpi A KeyStore engine to use + @param provider A provider to use + @param type The type of KeyStore + */ + protected KeyStore(KeyStoreSpi keyStoreSpi, Provider provider, String type) + { + this.keyStoreSpi = keyStoreSpi; + this.provider = provider; + this.type = type; + } + + /** + Gets an instance of the KeyStore class representing + the specified keystore. If the type is not + found then, it throws CertificateException. + + @param type the type of certificate to choose + + @return a KeyStore repesenting the desired type + + @throws KeyStoreException if the type of keystore is not implemented by providers + */ + public static KeyStore getInstance(String type) throws KeyStoreException + { + Provider[] p = Security.getProviders(); + + for (int i = 0; i < p.length; i++) + { + String classname = p[i].getProperty("KeyStore." + type); + if (classname != null) + return getInstance(classname, type, p[i]); + } + + throw new KeyStoreException(type); + } + + /** + Gets an instance of the KeyStore class representing + the specified key store from the specified provider. + If the type is not found then, it throws CertificateException. + If the provider is not found, then it throws + NoSuchProviderException. + + @param type the type of certificate to choose + + @return a KeyStore repesenting the desired type + + @throws KeyStoreException if the type of keystore is not implemented by providers + @throws NoSuchProviderException if the provider is not found + */ + public static KeyStore getInstance(String type, String provider) + throws KeyStoreException, NoSuchProviderException + { + Provider p = Security.getProvider(provider); + if (p == null) + throw new NoSuchProviderException(); + + return getInstance(p.getProperty("KeyStore." + type), type, p); + } + + private static KeyStore getInstance(String classname, + String type, + Provider provider) + throws KeyStoreException + { + try + { + return new KeyStore((KeyStoreSpi) Class.forName(classname). + newInstance(), provider, type); + } + catch (ClassNotFoundException cnfe) + { + throw new KeyStoreException("Class not found"); + } + catch (InstantiationException ie) + { + throw new KeyStoreException("Class instantiation failed"); + } + catch (IllegalAccessException iae) + { + throw new KeyStoreException("Illegal Access"); + } + } + + + /** + Gets the provider that the class is from. + + @return the provider of this class + */ + public final Provider getProvider() + { + return provider; + } + + /** + Returns the type of the KeyStore supported + + @return A string with the type of KeyStore + */ + public final String getType() + { + return type; + } + + /** + Returns the key associated with given alias using the + supplied password. + + @param alias an alias for the key to get + @param password password to access key with + + @return the requested key, or null otherwise + + @throws NoSuchAlgorithmException if there is no algorithm + for recovering the key + @throws UnrecoverableKeyException key cannot be reocovered + (wrong password). + */ + public final Key getKey(String alias, char[]password) + throws KeyStoreException, NoSuchAlgorithmException, + UnrecoverableKeyException + { + return keyStoreSpi.engineGetKey(alias, password); + } + + /** + Gets a Certificate chain for the specified alias. + + @param alias the alias name + + @return a chain of Certificates ( ordered from the user's + certificate to the Certificate Authority's ) or + null if the alias does not exist or there is no + certificate chain for the alias ( the alias refers + to a trusted certificate entry or there is no entry). + */ + public final java.security.cert. + Certificate[] getCertificateChain(String alias) throws KeyStoreException + { + return keyStoreSpi.engineGetCertificateChain(alias); + } + + /** + Gets a Certificate for the specified alias. + + If there is a trusted certificate entry then that is returned. + it there is a key entry with a certificate chain then the + first certificate is return or else null. + + @param alias the alias name + + @return a Certificate or null if the alias does not exist + or there is no certificate for the alias + */ + public final java.security.cert.Certificate getCertificate(String alias) + throws KeyStoreException + { + return keyStoreSpi.engineGetCertificate(alias); + } + + /** + Gets entry creation date for the specified alias. + + @param alias the alias name + + @returns the entry creation date or null + */ + public final Date getCreationDate(String alias) throws KeyStoreException + { + return keyStoreSpi.engineGetCreationDate(alias); + } + + /** + Assign the key to the alias in the keystore, protecting it + with the given password. It will overwrite an existing + entry and if the key is a PrivateKey, also add the + certificate chain representing the corresponding public key. + + @param alias the alias name + @param key the key to add + @password the password to protect with + @param chain the certificate chain for the corresponding + public key + + @throws KeyStoreException if it fails + */ + public final void setKeyEntry(String alias, Key key, char[]password, + java.security.cert. + Certificate[]chain) throws KeyStoreException + { + keyStoreSpi.engineSetKeyEntry(alias, key, password, chain); + } + + /** + Assign the key to the alias in the keystore. It will overwrite + an existing entry and if the key is a PrivateKey, also + add the certificate chain representing the corresponding + public key. + + @param alias the alias name + @param key the key to add + @param chain the certificate chain for the corresponding + public key + + @throws KeyStoreException if it fails + */ + public final void setKeyEntry(String alias, byte[]key, + java.security.cert. + Certificate[]chain) throws KeyStoreException + { + keyStoreSpi.engineSetKeyEntry(alias, key, chain); + } + + /** + Assign the certificate to the alias in the keystore. It + will overwrite an existing entry. + + @param alias the alias name + @param cert the certificate to add + + @throws KeyStoreException if it fails + */ + public final void setCertificateEntry(String alias, + java.security.cert. + Certificate cert) throws + KeyStoreException + { + keyStoreSpi.engineSetCertificateEntry(alias, cert); + } + + /** + Deletes the entry for the specified entry. + + @param alias the alias name + + @throws KeyStoreException if it fails + */ + public final void deleteEntry(String alias) throws KeyStoreException + { + keyStoreSpi.engineDeleteEntry(alias); + } + + /** + Generates a list of all the aliases in the keystore. + + @return an Enumeration of the aliases + */ + public final Enumeration aliases() throws KeyStoreException + { + return keyStoreSpi.engineAliases(); + } + + /** + Determines if the keystore contains the specified alias. + + @param alias the alias name + + @return true if it contains the alias, false otherwise + */ + public final boolean containsAlias(String alias) throws KeyStoreException + { + return keyStoreSpi.engineContainsAlias(alias); + } + + /** + Returns the number of entries in the keystore. + + @returns the number of keystore entries. + */ + public final int size() throws KeyStoreException + { + return keyStoreSpi.engineSize(); + } + + /** + Determines if the keystore contains a key entry for + the specified alias. + + @param alias the alias name + + @return true if it is a key entry, false otherwise + */ + public final boolean isKeyEntry(String alias) throws KeyStoreException + { + return keyStoreSpi.engineIsKeyEntry(alias); + } + + + /** + Determines if the keystore contains a certificate entry for + the specified alias. + + @param alias the alias name + + @return true if it is a certificate entry, false otherwise + */ + public final boolean isCertificateEntry(String alias) + throws KeyStoreException + { + return keyStoreSpi.engineIsCertificateEntry(alias); + } + + /** + Determines if the keystore contains the specified certificate + entry and returns the alias. + + It checks every entry and for a key entry checks only the + first certificate in the chain. + + @param cert Certificate to look for + + @return alias of first matching certificate, null if it + does not exist. + */ + public final String getCertificateAlias(java.security.cert.Certificate cert) + throws KeyStoreException + { + return keyStoreSpi.engineGetCertificateAlias(cert); + } + + /** + Stores the keystore in the specified output stream and it + uses the specified key it keep it secure. + + @param stream the output stream to save the keystore to + @param password the password to protect the keystore integrity with + + @throws IOException if an I/O error occurs. + @throws NoSuchAlgorithmException the data integrity algorithm + used cannot be found. + @throws CertificateException if any certificates could not be + stored in the output stream. + */ + public final void store(OutputStream stream, char[]password) + throws KeyStoreException, IOException, NoSuchAlgorithmException, + CertificateException + { + keyStoreSpi.engineStore(stream, password); + } + + /** + Loads the keystore from the specified input stream and it + uses the specified password to check for integrity if supplied. + + @param stream the input stream to load the keystore from + @param password the password to check the keystore integrity with + + @throws IOException if an I/O error occurs. + @throws NoSuchAlgorithmException the data integrity algorithm + used cannot be found. + @throws CertificateException if any certificates could not be + stored in the output stream. + */ + public final void load(InputStream stream, char[]password) + throws IOException, NoSuchAlgorithmException, CertificateException + { + keyStoreSpi.engineLoad(stream, password); + } + + /** + Returns the default KeyStore type. This method looks up the + type in /lib/security/java.security with the + property "keystore.type" or if that fails then "jks" . + */ + public static final String getDefaultType() + { + String tmp; + //Security reads every property in java.security so it + //will return this property if it exists. + tmp = Security.getProperty("keystore.type"); + + if (tmp == null) + tmp = "jks"; + + return tmp; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyStoreException.java gcc-3.1/libjava/java/security/KeyStoreException.java *** gcc-3.0.4/libjava/java/security/KeyStoreException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/KeyStoreException.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,68 ---- + /* KeyStoreException.java -- Indicates a problem with the key store + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * Indicates a problem with the key store. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class KeyStoreException extends GeneralSecurityException + { + /** + * This method initializes a new KeyStoreException with no + * detailed error message. + */ + public KeyStoreException() + { + super(); + } + + /** + * This method initializes a new KeyStoreException with a + * detailed error message. + * + * @param msg The descriptive error message. + */ + public KeyStoreException(String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/KeyStoreSpi.java gcc-3.1/libjava/java/security/KeyStoreSpi.java *** gcc-3.0.4/libjava/java/security/KeyStoreSpi.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/KeyStoreSpi.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,273 ---- + /* KeyStoreSpi.java --- Key Store Service Provider Interface + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.io.InputStream; + import java.io.IOException; + import java.io.OutputStream; + import java.security.cert.CertificateException; + import java.util.Date; + import java.util.Enumeration; + + /** + KeyStoreSpi is the Service Provider Interface (SPI) for the + KeyStore class. This is the interface for providers to + supply to implement a keystore for a particular keystore + type. + + @since JDK 1.2 + @author Mark Benvenuto + */ + public abstract class KeyStoreSpi + { + /** + Constructs a new KeyStoreSpi + */ + public KeyStoreSpi() + { + } + + /** + Returns the key associated with given alias using the + supplied password. + + @param alias an alias for the key to get + @param password password to access key with + + @return the requested key, or null otherwise + + @throws NoSuchAlgorithmException if there is no algorithm + for recovering the key + @throws UnrecoverableKeyException key cannot be reocovered + (wrong password). + */ + public abstract Key engineGetKey(String alias, char[]password) + throws NoSuchAlgorithmException, UnrecoverableKeyException; + + /** + Gets a Certificate chain for the specified alias. + + @param alias the alias name + + @return a chain of Certificates ( ordered from the user's + certificate to the Certificate Authority's ) or + null if the alias does not exist or there is no + certificate chain for the alias ( the alias refers + to a trusted certificate entry or there is no entry). + */ + public abstract java.security.cert. + Certificate[] engineGetCertificateChain(String alias); + + + /** + Gets a Certificate for the specified alias. + + If there is a trusted certificate entry then that is returned. + it there is a key entry with a certificate chain then the + first certificate is return or else null. + + @param alias the alias name + + @return a Certificate or null if the alias does not exist + or there is no certificate for the alias + */ + public abstract java.security.cert. + Certificate engineGetCertificate(String alias); + + /** + Gets entry creation date for the specified alias. + + @param alias the alias name + + @returns the entry creation date or null + */ + public abstract Date engineGetCreationDate(String alias); + + /** + Assign the key to the alias in the keystore, protecting it + with the given password. It will overwrite an existing + entry and if the key is a PrivateKey, also add the + certificate chain representing the corresponding public key. + + @param alias the alias name + @param key the key to add + @password the password to protect with + @param chain the certificate chain for the corresponding + public key + + @throws KeyStoreException if it fails + */ + public abstract void engineSetKeyEntry(String alias, Key key, + char[]password, + java.security.cert. + Certificate[]chain) throws + KeyStoreException; + + /** + Assign the key to the alias in the keystore. It will overwrite + an existing entry and if the key is a PrivateKey, also + add the certificate chain representing the corresponding + public key. + + @param alias the alias name + @param key the key to add + @param chain the certificate chain for the corresponding + public key + + @throws KeyStoreException if it fails + */ + public abstract void engineSetKeyEntry(String alias, byte[]key, + java.security.cert. + Certificate[]chain) throws + KeyStoreException; + + + /** + Assign the certificate to the alias in the keystore. It + will overwrite an existing entry. + + @param alias the alias name + @param cert the certificate to add + + @throws KeyStoreException if it fails + */ + public abstract void engineSetCertificateEntry(String alias, + java.security.cert. + Certificate cert) throws + KeyStoreException; + + /** + Deletes the entry for the specified entry. + + @param alias the alias name + + @throws KeyStoreException if it fails + */ + public abstract void engineDeleteEntry(String alias) + throws KeyStoreException; + + /** + Generates a list of all the aliases in the keystore. + + @return an Enumeration of the aliases + */ + public abstract Enumeration engineAliases(); + + /** + Determines if the keystore contains the specified alias. + + @param alias the alias name + + @return true if it contains the alias, false otherwise + */ + public abstract boolean engineContainsAlias(String alias); + + /** + Returns the number of entries in the keystore. + + @returns the number of keystore entries. + */ + public abstract int engineSize(); + + /** + Determines if the keystore contains a key entry for + the specified alias. + + @param alias the alias name + + @return true if it is a key entry, false otherwise + */ + public abstract boolean engineIsKeyEntry(String alias); + + /** + Determines if the keystore contains a certificate entry for + the specified alias. + + @param alias the alias name + + @return true if it is a certificate entry, false otherwise + */ + public abstract boolean engineIsCertificateEntry(String alias); + + /** + Determines if the keystore contains the specified certificate + entry and returns the alias. + + It checks every entry and for a key entry checks only the + first certificate in the chain. + + @param cert Certificate to look for + + @return alias of first matching certificate, null if it + does not exist. + */ + public abstract String engineGetCertificateAlias(java.security.cert. + Certificate cert); + + /** + Stores the keystore in the specified output stream and it + uses the specified key it keep it secure. + + @param stream the output stream to save the keystore to + @param password the password to protect the keystore integrity with + + @throws IOException if an I/O error occurs. + @throws NoSuchAlgorithmException the data integrity algorithm + used cannot be found. + @throws CertificateException if any certificates could not be + stored in the output stream. + */ + public abstract void engineStore(OutputStream stream, char[]password) + throws IOException, NoSuchAlgorithmException, CertificateException; + + + /** + Loads the keystore from the specified input stream and it + uses the specified password to check for integrity if supplied. + + @param stream the input stream to load the keystore from + @param password the password to check the keystore integrity with + + @throws IOException if an I/O error occurs. + @throws NoSuchAlgorithmException the data integrity algorithm + used cannot be found. + @throws CertificateException if any certificates could not be + stored in the output stream. + */ + public abstract void engineLoad(InputStream stream, char[]password) + throws IOException, NoSuchAlgorithmException, CertificateException; + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/MessageDigest.java gcc-3.1/libjava/java/security/MessageDigest.java *** gcc-3.0.4/libjava/java/security/MessageDigest.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/MessageDigest.java Tue Jan 22 22:40:30 2002 *************** *** 1,144 **** ! // MessageDigest.java ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.security; ! /** ! * @author Tom Tromey ! * @date February 11, 2000. ! */ ! /** ! * Written using on-line Java Platform 1.1 API Specification. ! * Status: Believed complete and correct to 1.1 spec. ! * It is known not to comply with the 1.2 spec. ! */ ! public abstract class MessageDigest { ! protected MessageDigest (String algorithm) { ! name = algorithm; } ! public static MessageDigest getInstance (String algorithm) throws NoSuchAlgorithmException { String name = "MessageDigest." + algorithm; ! Provider[] provs = Security.getProviders (); ! for (int i = 0; i < provs.length; ++i) { ! String val = provs[i].getProperty (name); ! if (val != null) ! { ! try ! { ! return (MessageDigest) Class.forName(val).newInstance (); ! } ! catch (Throwable _) ! { ! // We just ignore failures. ! } ! } } ! throw new NoSuchAlgorithmException (algorithm); } ! public static MessageDigest getInstance (String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { ! String name = "MessageDigest." + algorithm; ! Provider p = Security.getProvider (provider); if (p == null) ! throw new NoSuchProviderException (provider); ! String val = p.getProperty (name); ! if (val != null) { ! try ! { ! return (MessageDigest) Class.forName(val).newInstance (); ! } ! catch (Throwable _) ! { ! // Nothing. ! } } ! throw new NoSuchAlgorithmException (algorithm); } ! public void update (byte input) { ! engineUpdate (input); } ! public void update (byte[] input, int offset, int len) { ! engineUpdate (input, offset, len); } ! public void update (byte[] input) { ! engineUpdate (input, 0, input.length); } ! public byte[] digest () { ! return engineDigest (); } ! public byte[] digest (byte[] input) { ! update (input); ! return engineDigest (); } ! public String toString () { ! // There is no spec for this. ! return "[MessageDigest: " + name + "]"; } ! public static boolean isEqual (byte[] digesta, byte[] digestb) { - if (digesta == digestb) - return true; if (digesta.length != digestb.length) return false; for (int i = digesta.length - 1; i >= 0; --i) if (digesta[i] != digestb[i]) return false; return true; } ! public void reset () { ! engineReset (); } ! public final String getAlgorithm () { ! return name; } ! protected abstract void engineUpdate (byte input); ! protected abstract void engineUpdate (byte input[], int offset, int len); ! protected abstract byte[] engineDigest (); ! protected abstract void engineReset (); public Object clone() throws CloneNotSupportedException { ! return super.clone (); } - // Algorithm name. - private String name; } --- 1,327 ---- ! /* MessageDigest.java --- The message digest interface. ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.security; ! ! public abstract class MessageDigest extends MessageDigestSpi { ! private String algorithm; ! private Provider provider; ! private byte[] lastDigest; ! ! /** ! Creates a MessageDigest representing the specified ! algorithm. ! ! @param algorithm the name of digest algorithm to choose ! */ ! protected MessageDigest(String algorithm) { ! this.algorithm = algorithm; ! provider = null; } ! /** ! Gets an instance of the MessageDigest class representing ! the specified digest. If the algorithm is not found then, ! it throws NoSuchAlgorithmException. ! ! @param algorithm the name of digest algorithm to choose ! @return a MessageDigest representing the desired algorithm ! ! @exception NoSuchAlgorithmException if the algorithm is not implemented by providers ! */ ! public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException { + Provider[] p = Security.getProviders(); String name = "MessageDigest." + algorithm; ! ! for (int i = 0; i < p.length; i++) { ! String classname = p[i].getProperty(name); ! if (classname != null) ! return getInstance(classname, algorithm, p[i]); } ! throw new NoSuchAlgorithmException(algorithm); } ! /** ! Gets an instance of the MessageDigest class representing ! the specified digest from the specified provider. If the ! algorithm is not found then, it throws NoSuchAlgorithmException. ! If the provider is not found, then it throws ! NoSuchProviderException. ! ! @param algorithm the name of digest algorithm to choose ! @param provider the name of the provider to find the algorithm in ! @return a MessageDigest representing the desired algorithm ! ! @exception NoSuchAlgorithmException if the algorithm is not implemented by the provider ! @exception NoSuchProviderException if the provider is not found ! */ ! ! public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { ! Provider p = Security.getProvider(provider); ! if (p == null) ! throw new NoSuchProviderException(provider); ! ! return getInstance(p.getProperty("MessageDigest." + algorithm), ! algorithm, p); ! } ! ! private static MessageDigest getInstance(String classname, ! String algorithm, ! Provider provider) ! throws NoSuchAlgorithmException ! { ! if (classname == null) ! throw new NoSuchAlgorithmException(algorithm); ! ! try { ! MessageDigest m = ! (MessageDigest) Class.forName(classname).newInstance(); ! m.algorithm = algorithm; ! m.provider = provider; ! return m; ! } ! catch (ClassNotFoundException cnfe) ! { ! throw new NoSuchAlgorithmException(algorithm + ": Class not found."); ! } ! catch (InstantiationException ie) ! { ! throw new NoSuchAlgorithmException(algorithm ! + ": Class instantiation failed."); } + catch (IllegalAccessException iae) + { + throw new NoSuchAlgorithmException(algorithm + ": Illegal Access"); + } + } ! ! /** ! Gets the provider that the MessageDigest is from. ! ! @return the provider the this MessageDigest ! */ ! public final Provider getProvider() ! { ! return provider; } ! /** ! Updates the digest with the byte. ! ! @param input byte to update the digest with ! */ ! public void update(byte input) { ! engineUpdate(input); } ! /** ! Updates the digest with the bytes from the array from the ! specified offset to the specified length. ! ! @param input bytes to update the digest with ! @param offset the offset to start at ! @param len length of the data to update with ! */ ! public void update(byte[]input, int offset, int len) { ! engineUpdate(input, 0, input.length); } ! /** ! Updates the digest with the bytes from the array. ! ! @param input bytes to update the digest with ! */ ! public void update(byte[]input) { ! engineUpdate(input, 0, input.length); } ! /** ! Computes the digest of the stored data. ! ! @return a byte array representing the message digest ! */ ! public byte[] digest() { ! return lastDigest = engineDigest(); } ! /** ! Computes the final digest of the stored bytes and returns ! them. ! ! @param buf An array of bytes to store the digest ! @param offset An offset to start storing the digest at ! @param len The length of the buffer ! @return Returns the length of the buffer ! */ ! public int digest(byte[]buf, int offset, int len) throws DigestException { ! return engineDigest(buf, offset, len); } ! /** ! Computes a final update using the input array of bytes, ! then computes a final digest and returns it. It calls ! update(input) and then digest(); ! ! @param buf An array of bytes to perform final update with ! @return a byte array representing the message digest ! */ ! public byte[] digest(byte[]input) { ! update(input); ! return digest(); } ! /** ! Returns a representation of the MessageDigest as a String. ! ! @return a string representing the message digest ! */ ! public String toString() ! { ! return (getClass()).getName() ! + " Message Digest <" + digestToString() + ">"; ! } ! ! /** ! Does a simple byte comparison of the two digests. ! ! @param digesta first digest to compare ! @param digestb second digest to compare ! @return true if they are equal, false otherwise ! */ ! public static boolean isEqual(byte[]digesta, byte[]digestb) { if (digesta.length != digestb.length) return false; + for (int i = digesta.length - 1; i >= 0; --i) if (digesta[i] != digestb[i]) return false; + return true; } ! ! /** ! Resets the message digest. ! */ ! public void reset() { ! engineReset(); } ! /** ! Gets the name of the algorithm currently used. ! The names of algorithms are usually SHA-1 or MD5. ! ! @return name of algorithm. ! */ ! public final String getAlgorithm() { ! return algorithm; } ! /** ! Gets the length of the message digest. ! The default is zero which means that this message digest ! does not implement this function. ! ! @return length of the message digest ! */ ! public final int getDigestLength() ! { ! return engineGetDigestLength(); ! } ! ! /** ! Returns a clone of this class if supported. ! If it does not then it throws CloneNotSupportedException. ! The cloning of this class depends on whether the subclass ! MessageDigestSpi implements Cloneable which contains the ! actual implementation of the appropriate algorithm. ! ! @return clone of this class + @exception CloneNotSupportedException this class does not support cloning + */ public Object clone() throws CloneNotSupportedException { ! if (this instanceof Cloneable) ! return super.clone(); ! else ! throw new CloneNotSupportedException(); ! } ! ! private String digestToString() ! { ! byte[] digest = lastDigest; ! ! if (digest == null) ! return "incomplete"; ! ! StringBuffer buf = new StringBuffer(); ! int len = digest.length; ! for (int i = 0; i < len; ++i) ! { ! byte b = digest[i]; ! byte high = (byte) ((b & 0xff) >>> 4); ! byte low = (byte) (b & 0xf); ! ! buf.append(high > 9 ? ('a' - 10) + high : '0' + high); ! buf.append(low > 9 ? ('a' - 10) + low : '0' + low); ! } ! ! return buf.toString(); } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/MessageDigestSpi.java gcc-3.1/libjava/java/security/MessageDigestSpi.java *** gcc-3.0.4/libjava/java/security/MessageDigestSpi.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/MessageDigestSpi.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,158 ---- + /* MessageDigestSpi.java --- The message digest service provider interface. + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + This is the Service Provider Interface (SPI) for MessageDigest + class in java.security. It provides the back end functionality + for the MessageDigest class so that it can compute message + hashes. The default hashes are SHA-1 and MD5. A message hash + takes data of arbitrary length and produces a unique number + representing it. + + Cryptography service providers who want to implement their + own message digest hashes need only to subclass this class. + + The implementation of a Cloneable interface is left to up to + the programmer of a subclass. + + @version 0.0 + + @author Mark Benvenuto + */ + public abstract class MessageDigestSpi + { + /** + Default constructor of the MessageDigestSpi class + */ + public MessageDigestSpi() + { + } + + /** + Returns the length of the digest. It may be overridden by the + provider to return the length of the digest. Default is to + return 0. It is concrete for backwards compatibility with JDK1.1 + message digest classes. + + @return Length of Digest in Bytes + + @since 1.2 + */ + protected int engineGetDigestLength() + { + return 0; + } + + /** + Updates the digest with the specified byte. + + @param input the byte to update digest with + */ + protected abstract void engineUpdate(byte input); + + + /** + Updates the digest with the specified bytes starting with the + offset and proceeding for the specified length. + + @param input the byte array to update digest with + @param offset the offset of the byte to start with + @param len the number of the bytes to update with + */ + protected abstract void engineUpdate(byte[]input, int offset, int len); + + /** + Computes the final digest of the stored bytes and returns + them. It performs any necessary padding. The message digest + should reset sensitive data after performing the digest. + + @return An array of bytes containing the digest + */ + protected abstract byte[] engineDigest(); + + /** + Computes the final digest of the stored bytes and returns + them. It performs any necessary padding. The message digest + should reset sensitive data after performing the digest. This + method is left concrete for backwards compatibility with JDK1.1 + message digest classes. + + @param buf An array of bytes to store the digest + @param offset An offset to start storing the digest at + @param len The length of the buffer + @return Returns the length of the buffer + + @since 1.2 + */ + protected int engineDigest(byte[]buf, int offset, int len) + throws DigestException + { + if (engineGetDigestLength() > len) + throw new DigestException("Buffer is too small."); + + byte tmp[] = engineDigest(); + if (tmp.length > len) + throw new DigestException("Buffer is too small"); + + System.arraycopy(tmp, 0, buf, offset, tmp.length); + return tmp.length; + } + + /** + Resets the digest engine. Reinitializes internal variables + and clears sensitive data. + */ + protected abstract void engineReset(); + + /** + Returns a clone of this class. + + If cloning is not supported, then by default the class throws a + CloneNotSupportedException. The MessageDigestSpi provider + implementation has to overload this class in order to be + cloneable. + */ + public Object clone() throws CloneNotSupportedException + { + if (this instanceof Cloneable) + return super.clone(); + else + throw new CloneNotSupportedException(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/NoSuchAlgorithmException.java gcc-3.1/libjava/java/security/NoSuchAlgorithmException.java *** gcc-3.0.4/libjava/java/security/NoSuchAlgorithmException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/security/NoSuchAlgorithmException.java Tue Jan 22 22:40:30 2002 *************** *** 1,20 **** ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security; ! ! public class NoSuchAlgorithmException extends Exception { public NoSuchAlgorithmException() { super(); } public NoSuchAlgorithmException(String msg) { super(msg); --- 1,67 ---- ! /* NoSuchAlgorithmException.java -- What it says ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; ! ! /** ! * This exception is thrown when the requested security algorithm is ! * not available ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public class NoSuchAlgorithmException extends GeneralSecurityException { + /** + * This method initializes a new instance of NoSuchAlgorithmException + * with no descriptive error message. + */ public NoSuchAlgorithmException() { super(); } + /** + * This method initializes a new instance of NoSuchAlgorithmException + * with a descriptive error message. + * + * @param msg The descriptive error message + */ public NoSuchAlgorithmException(String msg) { super(msg); diff -Nrc3pad gcc-3.0.4/libjava/java/security/NoSuchProviderException.java gcc-3.1/libjava/java/security/NoSuchProviderException.java *** gcc-3.0.4/libjava/java/security/NoSuchProviderException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/NoSuchProviderException.java Tue Jan 22 22:40:30 2002 *************** *** 1,30 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.security; ! /** ! * @author Warren Levy ! * @date February 4, 2000. ! */ /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public class NoSuchProviderException extends GeneralSecurityException { public NoSuchProviderException() { super(); } public NoSuchProviderException(String msg) { super(msg); --- 1,67 ---- ! /* NoSuchProviderException.java -- What it says ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.security; /** ! * This exception is thrown when the requested security provider is ! * not available. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public class NoSuchProviderException extends GeneralSecurityException { + /** + * This method initializes a new instance of NoSuchProviderException + * with no descriptive error message. + */ public NoSuchProviderException() { super(); } + /** + * This method initializes a new instance of NoSuchProviderException + * with a descriptive error message. + * + * @param msg The descriptive error message. + */ public NoSuchProviderException(String msg) { super(msg); diff -Nrc3pad gcc-3.0.4/libjava/java/security/Permission.java gcc-3.1/libjava/java/security/Permission.java *** gcc-3.0.4/libjava/java/security/Permission.java Fri May 19 17:55:33 2000 --- gcc-3.1/libjava/java/security/Permission.java Tue Jan 22 22:40:30 2002 *************** *** 1,5 **** /* Permission.java -- The superclass for all permission objects ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Permission.java -- The superclass for all permission objects ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,191 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security; import java.io.Serializable; /** ! * This class is the abstract superclass of all classes that implement ! * the concept of a permission. A permission consists of a permission name ! * and optionally a list of actions that relate to the permission. The ! * actual meaning of the name of the permission is defined only in the ! * context of a subclass. It may name a resource to which access permissions ! * are granted (for example, the name of a file) or it might represent ! * something else entirely. Similarly, the action list only has meaning ! * within the context of a subclass. Some permission names may have no ! * actions associated with them. That is, you either have the permission ! * or you don't. ! * ! * The most important method in this class is implies. This ! * checks whether if one has this permission, then the specified ! * permission is also implied. As a conceptual example, consider the ! * permissions "Read All Files" and "Read File foo". The permission ! * "Read All Files" implies that the caller has permission to read the ! * file foo. ! * ! * Permission's are not dynamic objects. Once created, a ! * Permission's name and action list cannot be changed. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class Permission implements Guard, Serializable ! { ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * This is the name assigned to this permission object. ! */ ! protected String name; // Taken from the serializable form information ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * This method initializes a new instance of Permission to ! * have the specified name. ! */ ! public ! Permission(String name) ! { ! this.name = name; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods */ ! ! /** ! * This method returns the name of this Permission ! * ! * @return The name of this Permission ! */ ! public String ! getName() { ! return(name); ! } ! ! /*************************************************************************/ ! ! /** ! * This method returns the list of actions for this Permission ! * as a String. ! * ! * @return The action list for this Permission. ! */ ! public abstract String ! getActions(); ! /*************************************************************************/ ! /** ! * This method implements the Guard interface for this class. ! * It calls the checkPermission method in ! * SecurityManager with this Permission as its ! * argument. This method returns silently if the security check succeeds ! * or throws an exception if it fails. ! * ! * @param obj The Object being guarded - ignored by this class ! * ! * @exception SecurityException If the security check fails ! */ ! public void ! checkGuard(Object obj) throws SecurityException ! { ! SecurityManager sm = System.getSecurityManager(); ! // if (sm != null) ! // sm.checkPermission(this); ! } ! ! /*************************************************************************/ ! /** ! * This method tests whether this Permission implies that the ! * specified Permission is also granted. ! * ! * @param perm The Permission to test against ! * ! * @return true if the specified Permission is implied by this one, false otherwise. ! */ ! public abstract boolean ! implies(Permission perm); ! /*************************************************************************/ ! /** ! * This method returns a hash code for this Permission. ! * ! * @return A hash value. ! */ ! public abstract int ! hashCode(); ! /*************************************************************************/ ! /** ! * This method returns a String representation of this ! * Permission object. ! * ! * @return This object as a String. ! */ ! public String ! toString() ! { ! return("'\"" + getClass().getName() + "\" \"" + getName() + ! "\"" + " \"" + getActions() + "\")'"); ! } ! /*************************************************************************/ ! /** ! * This method returns an empty PermissionCollection object ! * that can store permissions of this type, or null if no ! * such collection is defined. ! * ! * @return A new PermissionCollection ! */ ! public PermissionCollection ! newPermissionCollection() ! { ! return(null); } - - } // class Permission - --- 18,165 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.security; import java.io.Serializable; /** ! * This class is the abstract superclass of all classes that implement ! * the concept of a permission. A permission consists of a permission name ! * and optionally a list of actions that relate to the permission. The ! * actual meaning of the name of the permission is defined only in the ! * context of a subclass. It may name a resource to which access permissions ! * are granted (for example, the name of a file) or it might represent ! * something else entirely. Similarly, the action list only has meaning ! * within the context of a subclass. Some permission names may have no ! * actions associated with them. That is, you either have the permission ! * or you don't. ! * ! * The most important method in this class is implies. This ! * checks whether if one has this permission, then the specified ! * permission is also implied. As a conceptual example, consider the ! * permissions "Read All Files" and "Read File foo". The permission ! * "Read All Files" implies that the caller has permission to read the ! * file foo. ! * ! * Permission's are not dynamic objects. Once created, a ! * Permission's name and action list cannot be changed. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public abstract class Permission implements Guard, Serializable { ! /** ! * This is the name assigned to this permission object. ! */ ! private String name; // Taken from the serializable form information ! /** ! * This method initializes a new instance of Permission to ! * have the specified name. ! */ ! public Permission(String name) ! { ! this.name = name; ! } ! /** ! * This method returns the name of this Permission ! * ! * @return The name of this Permission ! */ ! public final String getName() ! { ! return (name); ! } ! /** ! * This method returns the list of actions for this Permission ! * as a String. ! * ! * @return The action list for this Permission. ! */ ! public abstract String getActions(); ! /** ! * This method implements the Guard interface for this class. ! * It calls the checkPermission method in ! * SecurityManager with this Permission as its ! * argument. This method returns silently if the security check succeeds ! * or throws an exception if it fails. ! * ! * @param obj The Object being guarded - ignored by this class ! * ! * @exception SecurityException If the security check fails ! */ ! public void checkGuard(Object obj) throws SecurityException ! { ! SecurityManager sm = System.getSecurityManager(); ! if (sm != null) ! sm.checkPermission(this); ! } ! /** ! * Check to see if this object equals OBJ. ! */ ! public abstract boolean equals (Object obj); ! /** ! * This method tests whether this Permission implies that the ! * specified Permission is also granted. ! * ! * @param perm The Permission to test against ! * ! * @return true if the specified Permission is implied by this one, false otherwise. ! */ ! public abstract boolean implies(Permission perm); ! /** ! * This method returns a hash code for this Permission. ! * ! * @return A hash value. ! */ ! public abstract int hashCode(); ! /** ! * This method returns a String representation of this ! * Permission object. ! * ! * @return This object as a String. ! */ ! public String toString() ! { ! return ("'\"" + getClass().getName() + "\" \"" + getName() + ! "\"" + " \"" + getActions() + "\")'"); ! } ! /** ! * This method returns an empty PermissionCollection object ! * that can store permissions of this type, or null if no ! * such collection is defined. ! * ! * @return A new PermissionCollection ! */ ! public PermissionCollection newPermissionCollection() ! { ! return null; ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/PermissionCollection.java gcc-3.1/libjava/java/security/PermissionCollection.java *** gcc-3.0.4/libjava/java/security/PermissionCollection.java Fri May 19 17:55:33 2000 --- gcc-3.1/libjava/java/security/PermissionCollection.java Tue Jan 22 22:40:30 2002 *************** *** 1,5 **** /* PermissionCollection.java -- A collection of permission objects ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* PermissionCollection.java -- A collection of permission objects ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,207 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security; import java.io.Serializable; import java.util.Enumeration; ! /** ! * This class models a group of Java permissions. It has convenient ! * methods for determining whether or not a given permission is implied ! * by any of the permissions in this collection. ! *

    ! * Some care must be taken in storing permissions. First, a collection of ! * the appropriate type must be created. This is done by calling the ! * newPermissionCollection method on an object of the ! * permission class you wish to add to the collection. If this method ! * returns null, any type of PermissionCollection ! * can be used to store permissions of that type. However, if a ! * PermissionCollection collection object is returned, that ! * type must be used. ! *

    ! * The PermissionCollection's returned ! * by the newPermissionCollection instance in a subclass of ! * Permission is a homogeneous collection. It only will ! * hold permissions of one specified type - instances of the class that ! * created it. Not all PermissionCollection subclasses ! * have to hold permissions of only one type however. For example, ! * the Permissions class holds permissions of many types. ! *

    ! * Since the newPermissionCollection in Permission ! * itself returns null, by default a permission can be stored ! * in any type of collection unless it overrides that method to create its ! * own collection type. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class PermissionCollection extends Object implements Serializable ! { ! ! /*************************************************************************/ ! ! /* ! * Class Variables ! */ ! ! public static final String linesep = null; ! ! static ! { ! String linesep = System.getProperty("line.separator"); ! if (linesep == null); ! linesep = "\n"; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * Indicates whether or not this collection is read only. ! */ ! private boolean readOnly; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * This method initializes a new instance of PermissionCollection. ! * This is provided only as a default constructor and does nothing in this ! * class. ! */ ! public ! PermissionCollection() ! { ! ; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * This method tests whether or not this PermissionCollection ! * object is read only. ! * ! * @return true if this collection is read only, false otherwise ! */ ! public boolean ! isReadOnly() { ! return(readOnly); ! } ! ! /*************************************************************************/ ! /** ! * This method sets this PermissionCollection object to be ! * read only. No further permissions can be added to it after calling this ! * method. ! */ ! public void ! setReadOnly() ! { ! readOnly = true; ! } ! /*************************************************************************/ ! /** ! * This method adds a new Permission object to the collection. ! * ! * @param perm The Permission to add. ! * ! * @exception SecurityException If the collection is marked read only. ! * @exception IllegalArgumentException If a permission of the specified type cannot be added ! */ ! public abstract void ! add(Permission perm) throws SecurityException, IllegalArgumentException; ! /*************************************************************************/ ! /** ! * This method returns an Enumeration of all the objects in ! * this collection. ! * ! * @return An Enumeration of this collection's objects. ! */ ! public abstract Enumeration ! elements(); ! /*************************************************************************/ ! /** ! * This method tests whether the specified Permission object is ! * implied by this collection of Permission objects. ! * ! * @param perm The Permission object to test. ! * ! * @return true if the specified Permission is implied by this collection, false otherwise. ! */ ! public abstract boolean ! implies(Permission perm); ! /*************************************************************************/ ! /** ! * This method returns a String representation of this ! * collection. It will print the class name and has code in the same ! * manner as Object.toString() then print a listing of all ! * the Permission objects contained. ! * ! * @return A String representing this object. ! */ ! public String ! toString() ! { ! StringBuffer sb = new StringBuffer(""); ! sb.append(super.toString() + " (" + linesep); ! Enumeration e = elements(); ! while (e.hasMoreElements()) ! { ! Object obj = e.nextElement(); ! if (obj instanceof Permission) ! sb.append(((Permission)obj).toString() + linesep); ! } ! sb.append(")" + linesep); ! return(sb.toString()); } - - } // class PermissionCollection - --- 18,175 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.security; import java.io.Serializable; import java.util.Enumeration; ! /** ! * This class models a group of Java permissions. It has convenient ! * methods for determining whether or not a given permission is implied ! * by any of the permissions in this collection. ! *

    ! * Some care must be taken in storing permissions. First, a collection of ! * the appropriate type must be created. This is done by calling the ! * newPermissionCollection method on an object of the ! * permission class you wish to add to the collection. If this method ! * returns null, any type of PermissionCollection ! * can be used to store permissions of that type. However, if a ! * PermissionCollection collection object is returned, that ! * type must be used. ! *

    ! * The PermissionCollection's returned ! * by the newPermissionCollection instance in a subclass of ! * Permission is a homogeneous collection. It only will ! * hold permissions of one specified type - instances of the class that ! * created it. Not all PermissionCollection subclasses ! * have to hold permissions of only one type however. For example, ! * the Permissions class holds permissions of many types. ! *

    ! * Since the newPermissionCollection in Permission ! * itself returns null, by default a permission can be stored ! * in any type of collection unless it overrides that method to create its ! * own collection type. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class PermissionCollection ! extends Object ! implements Serializable { ! private static final String linesep = null; ! static ! { ! String linesep = System.getProperty("line.separator"); ! if (linesep == null); ! linesep = "\n"; ! } ! /** ! * Indicates whether or not this collection is read only. ! */ ! private boolean readOnly; ! /** ! * This method initializes a new instance of PermissionCollection. ! * This is provided only as a default constructor and does nothing in this ! * class. ! */ ! public PermissionCollection() ! { ! } ! /** ! * This method tests whether or not this PermissionCollection ! * object is read only. ! * ! * @return true if this collection is read only, false otherwise ! */ ! public boolean isReadOnly() ! { ! return (readOnly); ! } ! /** ! * This method sets this PermissionCollection object to be ! * read only. No further permissions can be added to it after calling this ! * method. ! */ ! public void setReadOnly() ! { ! readOnly = true; ! } ! /** ! * This method adds a new Permission object to the collection. ! * ! * @param perm The Permission to add. ! * ! * @exception SecurityException If the collection is marked read only. ! * @exception IllegalArgumentException If a permission of the specified type cannot be added ! */ ! public abstract void ! add(Permission perm) throws SecurityException, IllegalArgumentException; ! /** ! * This method returns an Enumeration of all the objects in ! * this collection. ! * ! * @return An Enumeration of this collection's objects. ! */ ! public abstract Enumeration elements(); ! /** ! * This method tests whether the specified Permission object is ! * implied by this collection of Permission objects. ! * ! * @param perm The Permission object to test. ! * ! * @return true if the specified Permission is implied by this collection, false otherwise. ! */ ! public abstract boolean implies(Permission perm); ! /** ! * This method returns a String representation of this ! * collection. It will print the class name and has code in the same ! * manner as Object.toString() then print a listing of all ! * the Permission objects contained. ! * ! * @return A String representing this object. ! */ ! public String toString() ! { ! StringBuffer sb = new StringBuffer(""); ! sb.append(super.toString() + " (" + linesep); ! Enumeration e = elements(); ! while (e.hasMoreElements()) ! { ! Object obj = e.nextElement(); ! if (obj instanceof Permission) ! sb.append(((Permission) obj).toString() + linesep); ! } ! sb.append(")" + linesep); ! return (sb.toString()); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Permissions.java gcc-3.1/libjava/java/security/Permissions.java *** gcc-3.0.4/libjava/java/security/Permissions.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/Permissions.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,270 ---- + /* Permissions.java -- A collection of permission collections + Copyright (C) 1998, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + import java.io.Serializable; + import java.util.Hashtable; + import java.util.Enumeration; + import java.util.NoSuchElementException; + + /** + * This class is a heterogeneous collection of permissions. It is + * organized as a collection of PermissionCollection's stored + * in a hashtable. Each individual PermissionCollection + * contains permissions of a single type. If a specific type of + * Permission does not provide a collection type to use + * via its newPermissionCollection method, then a default + * collection type which stores its permissions in a hash table will be + * used. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public final class Permissions + extends PermissionCollection + implements Serializable + { + /** + * Holds instances of AllPermission. + */ + private PermissionCollection allPermission; + + /** + * This is the Hashtable that contains our collections. + */ + Hashtable perms = new Hashtable(); + + /** + * This method initializes a new instance of Permissions. + */ + public Permissions() + { + } + + /** + * This method adds a new Permission to this collection. It + * will be stored in a PermissionCollection of the appropriate + * type, as determined by calling newPermissionCollection on + * the specified permission (if an appropriate collection does not already + * exist). If this object does not specify a particular type of collection, + * a default collection which stores in permissions in a hash table will + * be used. + * + * @param perm The Permission object to be added to this collection. + * + * @exception SecurityException If this collection is marked as read only. + * @exception IllegalArgumentException If the specified Permission cannot be added to this collection + */ + public void add(Permission perm) + throws SecurityException, IllegalArgumentException + { + if (isReadOnly()) + throw new SecurityException("PermissionCollection is read only"); + + if (perm instanceof AllPermission) + { + if (allPermission == null) + { + allPermission = new + DefaultPermissionCollection("java.security.AllPermission"); + + perms.put("java.security.AllPermission", allPermission); + } + } + else + { + Object obj = perms.get(perm.getClass().getName()); + if (obj != null) + { + if (!(obj instanceof PermissionCollection)) + throw new RuntimeException("Internal error in Permissions"); + + ((PermissionCollection) obj).add(perm); + } + else + { + PermissionCollection pc = perm.newPermissionCollection(); + if (pc == null) + pc = new DefaultPermissionCollection(perm.getClass().getName()); + + pc.add(perm); + + perms.put(perm.getClass().getName(), pc); + } + } + } + + /** + * This method tests whether or not the specified Permission + * is implied by this PermissionCollection. + * + * @param perm The Permission to test. + * + * @return true if the specified permission is implied by this PermissionCollection, or false otherwise. + */ + public boolean implies(Permission perm) + { + if (allPermission != null) + return (true); + + Object obj = perms.get(perm.getClass().getName()); + if (obj == null) + return (false); + + if (!(obj instanceof PermissionCollection)) + return (false); + + return (((PermissionCollection) obj).implies(perm)); + } + + /** + * This method returns an Enumeration which contains a + * list of all Permission objects contained in this + * collection. + * + * @return An Enumeration of this collection's elements. + */ + public Enumeration elements() + { + return new Enumeration() + { + Enumeration main_enum = perms.elements(); + Enumeration sub_enum; + + public boolean hasMoreElements() + { + if (sub_enum == null) + if (main_enum == null) + return (false); + else + { + if (!main_enum.hasMoreElements()) + return (false); + else + { + try + { + PermissionCollection pc = + (PermissionCollection) main_enum.nextElement(); + sub_enum = pc.elements(); + } + catch (NoSuchElementException e) + { + return (false); + } + } + } + else if (!sub_enum.hasMoreElements()) + { + sub_enum = null; + return (hasMoreElements()); + } + + return (true); + } + + public Object nextElement() throws NoSuchElementException + { + if (!hasMoreElements()) + throw new NoSuchElementException(); + + return (sub_enum.nextElement()); + } + }; + } + + static class DefaultPermissionCollection extends PermissionCollection + implements Serializable + { + + // Type of Permission we can store + private Class permcls; + + // Hashtable where we store permissions. + private Hashtable perms = new Hashtable(); + + DefaultPermissionCollection(String permtype) throws IllegalArgumentException + { + try + { + permcls = Class.forName(permtype); + } + catch(ClassNotFoundException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } + + public void add(Permission perm) + throws SecurityException, IllegalArgumentException + { + if (isReadOnly()) + throw new SecurityException("PermissionCollection is read only"); + + if (!permcls.isInstance(perm)) + throw new IllegalArgumentException("Wrong permission type: " + + perm.getClass().getName()); + + if (perms.get(perm.getName()) != null) + throw new IllegalArgumentException("Duplicate permission: " + + perm.getName()); + + perms.put(perm.getName(), perm); + } + + public boolean implies(Permission perm) + { + Object obj = perms.get(perm.getName()); + if (obj == null) + return(false); + + if (!(obj instanceof Permission)) + return(false); + + Permission p = (Permission)obj; + + return(p.implies(perm)); + } + + public Enumeration elements() + { + return(perms.elements()); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Policy.java gcc-3.1/libjava/java/security/Policy.java *** gcc-3.0.4/libjava/java/security/Policy.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/Policy.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,161 ---- + /* Policy.java --- Policy Manager Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + Policy is an abstract class for managing the system security + policy for the Java application environment. It specifies + which permissions are available for code from various + sources. The security policy is represented through a + subclass of Policy. + + Only one Policy is in effect at any time. ProtectionDomain + initializes itself with information from this class on the + set of permssions to grant. + + The location for the actual Policy could be anywhere in any + form because it depends on the Policy implementation. The + default system is in a flat ASCII file or it could be in a + database. + + The current installed Policy can be accessed with getPolicy + and changed with setPolicy if the code has the correct + permissions. + + The refresh method causes the Policy class to refresh/reload + its configuration. The method used to refresh depends on the + Policy implementation. + + When a protection domain initializes its permissions it uses + code like: + + policy = Policy.getPolicy(); + permissionCollection perms = policy.getPermissions(MyCodeSource) + + The protection domain passes the Policy handler a CodeSource + object which contains the codebase URL and public key. The + Policy implementation then returns the proper set of + permissions for the CodeSource. + + The default Policy implementation can be changed by setting + the "policy.provider" security provider in java.security + to the correct Policy implementation class. + + @author Mark Benvenuto + + @since JDK 1.2 + */ + public abstract class Policy + { + // FIXME: The class name of the Policy provider should really be sourced + // from the "java.security" configuration file. For now, just hard-code + // a stub implementation. + static private Policy currentPolicy + = new gnu.java.security.provider.DefaultPolicy(); + + /** + Constructs a new Policy class. + */ + public Policy() + { + } + + /** + Gets the currently installed Policy handler. The value should + not be cached as it can be changed by setPolicy. This + function first calls SecurityManager.checkPermission + with SecurityPermission("getPolicy") to check + if the caller has Permission to get the current Policy. + + @return the current Policy + + @throws SecurityException if the security manager exists + the caller does not have permission to + getPolicy. + */ + public static Policy getPolicy() + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new SecurityPermission("getPolicy")); + + return currentPolicy; + } + + /** + Sets the currently installed Policy handler. This + function first calls SecurityManager.checkPermission + with SecurityPermission("setPolicy") to check + if the caller has Permission to get the current Policy. + + @param policy the new Policy to use + + @throws SecurityException if the security manager exists + the caller does not have permission to + getPolicy. + */ + public static void setPolicy(Policy policy) + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new SecurityPermission("setPolicy")); + + currentPolicy = policy; + } + + + /** + Evalutes the global policy and returns a set of Permissions + allowed for the specified CodeSource. + + @param codesource The CodeSource to get Permission for + + @return a set of permissions for codesource specified by + the current policy + + @throws SecurityException if the current thread does not + have permission to call getPermissions + */ + public abstract PermissionCollection getPermissions(CodeSource codesource); + + /** + Refreshes and/or reloads the current Policy. The actual + behavior of this method depends on the implementation. + */ + public abstract void refresh(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Principal.java gcc-3.1/libjava/java/security/Principal.java *** gcc-3.0.4/libjava/java/security/Principal.java Wed Jun 28 01:31:42 2000 --- gcc-3.1/libjava/java/security/Principal.java Tue Jan 22 22:40:30 2002 *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,85 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security; /** ! * This interface models an entity (such as a user or a certificate authority) ! * for the purposes of applying the Java security model. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public interface Principal { ! /** ! * This method returns a String that names this ! * Principal. ! * ! * @return The name of this Principal. ! */ ! public abstract String ! getName(); ! ! /*************************************************************************/ ! ! /** ! * This method tests another Principal object for equality ! * with this one. ! * ! * @param obj The Object (which is a Principal) to test for equality against. ! * ! * @return true if the specified Principal is equal to this one, false otherwise. ! */ ! public abstract boolean ! equals(Object obj); ! ! /*************************************************************************/ ! ! /** ! * This method returns a hash code value for this Principal. ! * ! * @return A hash value ! */ ! public abstract int ! hashCode(); ! ! /*************************************************************************/ ! ! /** ! * This method returns a String representation of this ! * Principal. ! * ! * @return This Principal represented as a String. ! */ ! public abstract String ! toString(); ! } // interface Principal --- 18,82 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.security; /** ! * This interface models an entity (such as a user or a certificate authority) ! * for the purposes of applying the Java security model. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public interface Principal { + /** + * This method returns a String that names this + * Principal. + * + * @return The name of this Principal. + */ + public abstract String getName(); ! /** ! * This method tests another Principal object for equality ! * with this one. ! * ! * @param obj The Object (which is a Principal) to test for equality against. ! * ! * @return true if the specified Principal is equal to this one, false otherwise. ! */ ! public abstract boolean equals(Object obj); ! /** ! * This method returns a hash code value for this Principal. ! * ! * @return A hash value ! */ ! public abstract int hashCode(); + /** + * This method returns a String representation of this + * Principal. + * + * @return This Principal represented as a String. + */ + public abstract String toString(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/PrivateKey.java gcc-3.1/libjava/java/security/PrivateKey.java *** gcc-3.0.4/libjava/java/security/PrivateKey.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/PrivateKey.java Tue Jan 22 22:40:30 2002 *************** *** 1,24 **** ! /* Copyright (C) 2000 Free Software Foundation - This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public interface PrivateKey extends Key { - // This interface contains no methods or constants. It merely serves - // to group (and provide type safety for) all private key interfaces. } --- 1,51 ---- ! /* PrivateKey.java -- "Super-interface" for all private keys ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; /** ! * This interface specified no methods. In simply provides a common ! * super-interface for all algorithm specific private key values. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface PrivateKey extends Key { } diff -Nrc3pad gcc-3.0.4/libjava/java/security/PrivilegedAction.java gcc-3.1/libjava/java/security/PrivilegedAction.java *** gcc-3.0.4/libjava/java/security/PrivilegedAction.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/PrivilegedAction.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,60 ---- + /* PrivilegedAction.java -- Perform a privileged action + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This interface specifes a single run method that + * executes a privileged operation. This method is called by + * AccessController.doPrivileged() after that method + * activiates the required privileges. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface PrivilegedAction + { + /** + * This method performs an operation that requires higher privileges to + * perform. It is called when a section of code invokes + * AccessController.doPrivileged(). + * + * @return obj An implementation dependent return value + */ + public abstract Object run(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/PrivilegedActionException.java gcc-3.1/libjava/java/security/PrivilegedActionException.java *** gcc-3.0.4/libjava/java/security/PrivilegedActionException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/PrivilegedActionException.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,113 ---- + /* PrivilegedActionException.java -- An exception occurred in a + privileged action. + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + import java.io.PrintStream; + import java.io.PrintWriter; + + /** + * This exception is thrown when an exception is thrown during a + * privileged action being performed with the + * AccessController.doPrivileged() method. It wrappers the + * actual exception thrown in the privileged code. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class PrivilegedActionException extends Exception + { + + /** + * This is the actual exception that occurred + */ + private Exception e; + + /** + * This method initializes a new instance of PrivilegedActionException + * that wrappers the specified Exception. + * + * @param e The Exception to wrapper + */ + public PrivilegedActionException(Exception e) + { + this.e = e; + } + + /** + * This method returns the underlying Exception that caused + * this exception to be raised. + * + * @return The wrappered Exception. + */ + public Exception getException() + { + return (e); + } + + /** + * This method prints the stack trace of the wrappered exception. + */ + public void printStackTrace() + { + e.printStackTrace(); + } + + /** + * This method prints the stack trace of the wrappered exception to the + * specified PrintStream. + * + * @param ps The PrintStream to print the stack trace to. + */ + public void printStackTrace(PrintStream ps) + { + e.printStackTrace(ps); + } + + /** + * This method prints the stack trace of the wrappered exception to the + * specified PrintWriter. + * + * @param pw The PrintWriter to print the stack trace to. + */ + public void printStackTrace(PrintWriter pw) + { + e.printStackTrace(pw); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/PrivilegedExceptionAction.java gcc-3.1/libjava/java/security/PrivilegedExceptionAction.java *** gcc-3.0.4/libjava/java/security/PrivilegedExceptionAction.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/PrivilegedExceptionAction.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,63 ---- + /* PrivilegedExceptionAction.java -- Perform a privileged operation + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This interface defines a method that is called by + * AccessController.doPrivileged() in order to perform a + * privileged operation with higher privileges enabled. This interface + * differs from PrivilegedAction in that the run + * method in this interface may throw a checked exception. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface PrivilegedExceptionAction + { + /** + * This method performs an operation that requires higher privileges to + * successfully complete. It is called when a section of code invokes + * AccessController.doPrivileged(). + * + * @return obj An implementation defined return value. + * + * @exception Exception An implementation specific exception. + */ + public abstract Object run() throws Exception; + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/ProtectionDomain.java gcc-3.1/libjava/java/security/ProtectionDomain.java *** gcc-3.0.4/libjava/java/security/ProtectionDomain.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/ProtectionDomain.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,143 ---- + /* ProtectionDomain.java -- A security domain + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This class represents a group of classes, along with the permissions + * they are granted. The classes are identified by a CodeSource. + * Thus, any class loaded from the specified CodeSource is + * treated as part of this domain. The set of permissions is represented + * by a PermissionCollection. + *

    + * Every class in the system will belong to one and only one + * ProtectionDomain. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class ProtectionDomain + { + private static final String linesep = System.getProperty("line.separator"); + + /** + * This is the CodeSource for this protection domain + */ + private CodeSource code_source; + + /** + * This is the set of permissions granted to this domain + */ + private PermissionCollection perms; + + /** + * This method initializes a new instance of ProtectionDomain + * representing the specified CodeSource and permission set. + * No permissions may be added to the PermissionCollection + * and this contructor will call the setReadOnly method on + * the specified permission set. + * + * @param code_source The CodeSource for this domain + * @param perms The permission set for this domain + * + * @see java.security.PermissionCollection#setReadOnly() + */ + public ProtectionDomain(CodeSource code_source, PermissionCollection perms) + { + this.code_source = code_source; + this.perms = perms; + if (perms != null) + perms.setReadOnly(); + } + + /** + * This method returns the CodeSource for this domain. + * + * @return This domain's CodeSource. + */ + public final CodeSource getCodeSource() + { + return code_source; + } + + /** + * This method returns the set of permissions granted to this domain. + * + * @return The permission set for this domain + */ + public final PermissionCollection getPermissions() + { + return perms; + } + + /** + * This method tests whether or not the specified Permission is + * implied by the set of permissions granted to this domain. + * + * @param perm The Permission to test. + * + * @return true if the specified Permission is implied for this domain, false otherwise. + */ + public boolean implies(Permission perm) + { + PermissionCollection pc = getPermissions(); + if (pc == null) + return (false); + + return (pc.implies(perm)); + } + + /** + * This method returns a String representation of this + * object. It will print the CodeSource and + * permission set associated with this domain. + * + * @return A String representation of this object. + */ + public String toString() + { + StringBuffer sb = new StringBuffer(""); + + sb.append(super.toString() + " (" + linesep); + sb.append(code_source.toString()); + sb.append(perms.toString()); + sb.append(")" + linesep); + + return sb.toString(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Provider.java gcc-3.1/libjava/java/security/Provider.java *** gcc-3.0.4/libjava/java/security/Provider.java Thu Oct 5 23:57:16 2000 --- gcc-3.1/libjava/java/security/Provider.java Tue Jan 22 22:40:30 2002 *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.security; *************** import java.io.Serializable; *** 31,199 **** import java.util.Properties; /** ! * This class represents a Java security architecture service provider. ! * The services provided by a such a provider can range from security ! * algorithms to key generation. ! *

    ! * Providers are installed by name and verion number. There is one ! * standard provider supplied with the class library. This is the ! * "GNU" provider, which can also be accessed by the alias "SUN" for ! * compatibility with the JDK. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ ! public abstract class Provider extends Properties implements Serializable ! { ! ! /*************************************************************************/ ! ! /* ! * Instance Variables ! */ ! ! /** ! * This is a textual description of the provider ! */ ! private String info; ! ! /** ! * This is the name of the provider ! */ ! private String name; ! ! /** ! * This is the version number of the provider ! */ ! private double version; ! ! private static final long serialVersionUID = -4298000515446427739L; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * This method initializes a new instance of Provider to have ! * the specified name, version, and description information. ! * ! * @param name The name to assign to this Provider. ! * @param version The version number for this Provider. ! * @param info A textual description of this provider. ! */ ! protected ! Provider(String name, double version, String info) ! { ! this.name = name; ! this.version = version; ! this.info = info; ! } ! ! /*************************************************************************/ ! ! /* ! * Instance Methods */ ! ! /** ! * This method returns the name assigned to this Provider. ! * ! * @return The Provider's name. ! */ ! public String ! getName() ! { ! return(name); ! } ! ! /*************************************************************************/ ! ! /** ! * This method retunrs the version number of this Provider. ! * ! * @return The Provider's version number. ! */ ! public double ! getVersion() { ! return(version); ! } ! /*************************************************************************/ ! /** ! * This method returns a textual description of the Provider. ! * ! * @return A description of the Provider. ! */ ! public String ! getInfo() ! { ! return(info); ! } ! /*************************************************************************/ ! /** ! * This method sets the specified key to have the specified value. ! * ! * @param key The property key ! * @param value The property value ! * ! * @return The previous value for this key, or null if no previous value. ! */ ! public Object ! put(Object key, Object value) ! { ! return(super.put(key, value)); ! } ! /*************************************************************************/ ! /** ! * This method removes the specified key entry (and its associated value) ! * from the property mapping list. ! * ! * @param key The key to remove ! * ! * @return The previous value for this key, or null if no previous value. ! */ ! public Object ! remove(Object key) ! { ! return(super.remove(key)); ! } ! /*************************************************************************/ ! /** ! * This method clears the entire property list such that it no longer ! * contains the properties used to look up the services provided by ! * the Provider. ! */ ! public void ! clear() ! { ! super.clear(); ! } ! /*************************************************************************/ ! /** ! * This method returns a String representation of this ! * object. This will include the Provider name and ! * version number. ! * ! * @return A String representation of this object. ! */ ! public String ! toString() ! { ! return(getClass().getName() + ": name=" + getName() + " version=" + version); } - - } // class Provider - --- 41,167 ---- import java.util.Properties; /** ! * This class represents a Java security architecture service provider. ! * The services provided by a such a provider can range from security ! * algorithms to key generation. ! *

    ! * Providers are installed by name and verion number. There is one ! * standard provider supplied with the class library. This is the ! * "GNU" provider, which can also be accessed by the alias "SUN" for ! * compatibility with the JDK. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public abstract class Provider extends Properties implements Serializable { ! /** ! * This is a textual description of the provider ! */ ! private String info; ! /** ! * This is the name of the provider ! */ ! private String name; ! /** ! * This is the version number of the provider ! */ ! private double version; ! /** ! * This method initializes a new instance of Provider to have ! * the specified name, version, and description information. ! * ! * @param name The name to assign to this Provider. ! * @param version The version number for this Provider. ! * @param info A textual description of this provider. ! */ ! protected Provider(String name, double version, String info) ! { ! this.name = name; ! this.version = version; ! this.info = info; ! } ! /** ! * This method returns the name assigned to this Provider. ! * ! * @return The Provider's name. ! */ ! public String getName() ! { ! return (name); ! } ! /** ! * This method retunrs the version number of this Provider. ! * ! * @return The Provider's version number. ! */ ! public double getVersion() ! { ! return (version); ! } ! /** ! * This method returns a textual description of the Provider. ! * ! * @return A description of the Provider. ! */ ! public String getInfo() ! { ! return (info); ! } ! /** ! * This method sets the specified key to have the specified value. ! * ! * @param key The property key ! * @param value The property value ! * ! * @return The previous value for this key, or null if no previous value. ! */ ! public Object put(Object key, Object value) ! { ! return (super.put(key, value)); ! } ! /** ! * This method removes the specified key entry (and its associated value) ! * from the property mapping list. ! * ! * @param key The key to remove ! * ! * @return The previous value for this key, or null if no previous value. ! */ ! public Object remove(Object key) ! { ! return (super.remove(key)); ! } ! /** ! * This method clears the entire property list such that it no longer ! * contains the properties used to look up the services provided by ! * the Provider. ! */ ! public void clear() ! { ! super.clear(); ! } ! /** ! * This method returns a String representation of this ! * object. This will include the Provider name and ! * version number. ! * ! * @return A String representation of this object. ! */ ! public String toString() ! { ! return (getClass().getName() + ": name=" + getName() + " version=" + ! version); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/ProviderException.java gcc-3.1/libjava/java/security/ProviderException.java *** gcc-3.0.4/libjava/java/security/ProviderException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/ProviderException.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,69 ---- + /* ProviderException.java -- Generic security provider runtime exception + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This exception indicates that a runtime problem was encounterd with + * a security provider. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class ProviderException extends RuntimeException + { + /** + * This method initializes a new instance of ProviderException + * with no descriptive error message. + */ + public ProviderException() + { + super(); + } + + /** + * This method initializes a new instance of ProviderException + * with a descriptive error message. + * + * @param msg The descriptive error message. + */ + public ProviderException(String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/PublicKey.java gcc-3.1/libjava/java/security/PublicKey.java *** gcc-3.0.4/libjava/java/security/PublicKey.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/PublicKey.java Tue Jan 22 22:40:30 2002 *************** *** 1,24 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public interface PublicKey extends Key { - // This interface contains no methods or constants. It merely serves - // to group (and provide type safety for) all private key interfaces. } --- 1,50 ---- ! /* PublicKey.java -- "Super-interface" for all public keys ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; /** ! * This interface specified no methods. In simply provides a common ! * super-interface for all algorithm specific public key values. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface PublicKey extends Key { } diff -Nrc3pad gcc-3.0.4/libjava/java/security/SecureClassLoader.java gcc-3.1/libjava/java/security/SecureClassLoader.java *** gcc-3.0.4/libjava/java/security/SecureClassLoader.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/SecureClassLoader.java Tue Jan 22 22:40:30 2002 *************** *** 1,24 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; ! // JDK1.2 ! public class SecureClassLoader extends ClassLoader { ! public SecureClassLoader () ! { ! this (null); ! } ! public SecureClassLoader (ClassLoader parent) ! { ! super (parent); ! } ! } --- 1,107 ---- ! /* SecureClassLoader.java --- A Secure Class Loader ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; ! /** ! A Secure Class Loader for loading classes with additional ! support for specifying code source and permissions when ! they are retrieved by the system policy handler. ! ! @since JDK 1.2 ! ! @author Mark Benvenuto ! */ ! public class SecureClassLoader extends ClassLoader { ! protected SecureClassLoader(ClassLoader parent) ! { ! super(parent); ! // FIXME: What else? ! } ! protected SecureClassLoader() ! { ! // FIXME: What do we need to do here? ! } ! ! /** ! Creates a class using an array of bytes and a ! CodeSource. + @param name the name to give the class. null if unknown. + @param b the data representing the classfile, in classfile format. + @param off the offset into the data where the classfile starts. + @param len the length of the classfile data in the array. + @param cs the CodeSource for the class + + @return the class that was defined and optional CodeSource. + + @exception ClassFormatError if the byte array is not in proper classfile format. + */ + protected final Class defineClass(String name, byte[] b, int off, int len, + CodeSource cs) + { + // FIXME: Need to cache ProtectionDomains according to 1.3 docs. + ProtectionDomain protectionDomain = + new ProtectionDomain(cs, getPermissions(cs)); + try + { + return super.defineClass(name, b, off, len, protectionDomain); + } + catch (ClassFormatError cfe) + { + return null; + } + } + + /** + Returns a PermissionCollection for the specified CodeSource. + The default implmentation invokes + java.security.Policy.getPermissions. + + This method is called by defineClass that takes a CodeSource + arguement to build a proper ProtectionDomain for the class + being defined. + + */ + protected PermissionCollection getPermissions(CodeSource cs) + { + Policy policy = Policy.getPolicy(); + return policy.getPermissions(cs); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/SecureRandom.java gcc-3.1/libjava/java/security/SecureRandom.java *** gcc-3.0.4/libjava/java/security/SecureRandom.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/SecureRandom.java Tue Jan 22 22:40:30 2002 *************** *** 1,25 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; import java.util.Random; /** ! * @author Warren Levy ! * @date February 7, 2000. ! */ ! /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Stubbed. */ - public class SecureRandom extends Random { ! // FIXME: Stubbed. } --- 1,371 ---- ! /* SecureRandom.java --- Secure Random class implmentation ! Copyright (C) 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; + import java.io.Serializable; import java.util.Random; + import java.util.Enumeration; /** ! SecureRandom is the class interface for using SecureRandom ! providers. It provides an interface to the SecureRandomSpi ! engine so that programmers can generate pseudo-random numbers. ! @author Mark Benvenuto */ public class SecureRandom extends Random { ! //Serialized Field ! long counter = 0; //Serialized ! MessageDigest digest = null; ! Provider provider = null; ! byte[] randomBytes = null; //Always null ! int randomBytesUsed = 0; ! SecureRandomSpi secureRandomSpi = null; ! byte[] state = null; ! ! /** ! Default constructor for SecureRandom. It constructs a ! new SecureRandom by instantating the first SecureRandom ! algorithm in the default security provier. ! ! It is not seeded and should be seeded using setSeed or else ! on the first call to getnextBytes it will force a seed. ! ! It is maintained for backwards compatibility and programs ! should use getInstance. ! */ ! public SecureRandom() ! { ! Provider p[] = Security.getProviders(); ! ! //Format of Key: SecureRandom.algname ! String key; ! ! String classname = null; ! int i, flag = 0; ! Enumeration e; ! for (i = 0; i < p.length; i++) ! { ! e = p[i].propertyNames(); ! while (e.hasMoreElements()) ! { ! key = (String) e.nextElement(); ! if (key.startsWith("SecureRandom.")) ! if ((classname = p[i].getProperty(key)) != null) ! break; ! } ! if (classname != null) ! break; ! } ! ! //if( classname == null) ! // throw new NoSuchAlgorithmException(); ! ! try ! { ! this.secureRandomSpi = ! (SecureRandomSpi) Class.forName(classname).newInstance(); ! ! //s.algorithm = algorithm; ! this.provider = p[i]; ! } ! catch (ClassNotFoundException cnfe) ! { ! //throw new NoSuchAlgorithmException("Class not found"); ! } ! catch (InstantiationException ie) ! { ! //throw new NoSuchAlgorithmException("Class instantiation failed"); ! } ! catch (IllegalAccessException iae) ! { ! //throw new NoSuchAlgorithmException("Illegal Access"); ! } ! } ! ! /** ! A constructor for SecureRandom. It constructs a new ! SecureRandom by instantating the first SecureRandom algorithm ! in the default security provier. ! ! It is seeded with the passed function and is useful if the user ! has access to hardware random device (like a radiation detector). ! ! It is maintained for backwards compatibility and programs ! should use getInstance. ! ! @param seed Seed bytes for class ! */ ! public SecureRandom(byte[] seed) ! { ! this(); ! setSeed(seed); ! } ! ! /** ! A constructor for SecureRandom. It constructs a new ! SecureRandom using the specified SecureRandomSpi from ! the specified security provier. ! ! @param secureRandomSpi A SecureRandomSpi class ! @param provider A Provider class ! */ ! protected SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider) ! { ! this.secureRandomSpi = secureRandomSpi; ! this.provider = provider; ! } ! ! /** ! Returns an instance of a SecureRandom. It creates the class ! for the specified algorithm if it exists from a provider. ! ! @param algorithm A SecureRandom algorithm to use ! ! @return Returns a new SecureRandom implmenting the chosen algorithm ! ! @throws NoSuchAlgorithmException if the algorithm cannot be found ! */ ! public static SecureRandom getInstance(String algorithm) throws ! NoSuchAlgorithmException ! { ! Provider p[] = Security.getProviders(); ! ! //Format of Key: SecureRandom.algname ! StringBuffer key = new StringBuffer("SecureRandom."); ! key.append(algorithm); ! ! String classname = null; ! int i; ! for (i = 0; i < p.length; i++) ! { ! if ((classname = p[i].getProperty(key.toString())) != null) ! break; ! } ! ! if (classname == null) ! throw new NoSuchAlgorithmException(); ! ! try ! { ! return new SecureRandom((SecureRandomSpi) Class.forName(classname). ! newInstance(), p[i]); ! } ! catch (ClassNotFoundException cnfe) ! { ! throw new NoSuchAlgorithmException("Class not found"); ! } ! catch (InstantiationException ie) ! { ! throw new NoSuchAlgorithmException("Class instantiation failed"); ! } ! catch (IllegalAccessException iae) ! { ! throw new NoSuchAlgorithmException("Illegal Access"); ! } ! ! } ! ! /** ! Returns an instance of a SecureRandom. It creates the class ! for the specified algorithm from the specified provider. ! ! @param algorithm A SecureRandom algorithm to use ! @param provider A security provider to use ! ! @return Returns a new SecureRandom implmenting the chosen algorithm ! ! @throws NoSuchAlgorithmException if the algorithm cannot be found ! @throws NoSuchProviderException if the provider cannot be found ! */ ! public static SecureRandom getInstance(String algorithm, ! String provider) throws ! NoSuchAlgorithmException, NoSuchProviderException ! { ! Provider p = Security.getProvider(provider); ! if (p == null) ! throw new NoSuchProviderException(); ! ! //Format of Key: SecureRandom.algName ! StringBuffer key = new StringBuffer("SecureRandom."); ! key.append(algorithm); ! ! String classname = p.getProperty(key.toString()); ! if (classname == null) ! throw new NoSuchAlgorithmException(); ! ! try ! { ! return new SecureRandom((SecureRandomSpi) Class.forName(classname). ! newInstance(), p); ! } ! catch (ClassNotFoundException cnfe) ! { ! throw new NoSuchAlgorithmException("Class not found"); ! } ! catch (InstantiationException ie) ! { ! throw new NoSuchAlgorithmException("Class instantiation failed"); ! } ! catch (IllegalAccessException iae) ! { ! throw new NoSuchAlgorithmException("Illegal Access"); ! } ! ! } ! ! /** ! Returns the provider being used by the current SecureRandom class. ! ! @return The provider from which this SecureRandom was attained ! */ ! public final Provider getProvider() ! { ! return provider; ! } ! ! /** ! Seeds the SecureRandom. The class is re-seeded for each call and ! each seed builds on the previous seed so as not to weaken security. ! ! @param seed seed bytes to seed with ! */ ! public void setSeed(byte[] seed) ! { ! secureRandomSpi.engineSetSeed(seed); ! } ! ! /** ! Seeds the SecureRandom. The class is re-seeded for each call and ! each seed builds on the previous seed so as not to weaken security. ! ! @param seed 8 seed bytes to seed with ! */ ! public void setSeed(long seed) ! { ! // This particular setSeed will be called by Random.Random(), via ! // our own constructor, before secureRandomSpi is initialized. In ! // this case we can't call a method on secureRandomSpi, and we ! // definitely don't want to throw a NullPointerException. ! // Therefore we test. ! if (secureRandomSpi != null) ! { ! byte tmp[] = { (byte) (0xff & (seed >> 56)), ! (byte) (0xff & (seed >> 48)), ! (byte) (0xff & (seed >> 40)), ! (byte) (0xff & (seed >> 32)), ! (byte) (0xff & (seed >> 24)), ! (byte) (0xff & (seed >> 16)), ! (byte) (0xff & (seed >> 8)), ! (byte) (0xff & seed) ! }; ! secureRandomSpi.engineSetSeed(tmp); ! } ! } ! ! /** ! Generates a user specified number of bytes. This function ! is the basis for all the random functions. ! ! @param bytes array to store generated bytes in ! */ ! public void nextBytes(byte[] bytes) ! { ! randomBytesUsed += bytes.length; ! counter++; ! secureRandomSpi.engineNextBytes(bytes); ! } ! ! /** ! Generates an integer containing the user specified ! number of random bits. It is right justified and padded ! with zeros. ! ! @param numBits number of random bits to get, 0 <= numBits <= 32; ! ! @return the random bits ! */ ! protected final int next(int numBits) ! { ! if (numBits == 0) ! return 0; ! ! byte tmp[] = new byte[numBits / 8 + (1 * (numBits % 8))]; ! ! secureRandomSpi.engineNextBytes(tmp); ! randomBytesUsed += tmp.length; ! counter++; ! ! int ret = 0; ! ! for (int i = 0; i < tmp.length; i++) ! ret |= tmp[i] << (8 * i); ! ! return ret; ! } ! ! /** ! Returns the given number of seed bytes. This method is ! maintained only for backwards capability. ! ! @param numBytes number of seed bytes to get ! ! @return an array containing the seed bytes ! */ ! public static byte[] getSeed(int numBytes) ! { ! byte tmp[] = new byte[numBytes]; ! ! new Random().nextBytes(tmp); ! return tmp; ! //return secureRandomSpi.engineGenerateSeed( numBytes ); ! } ! ! /** ! Returns the specified number of seed bytes. ! ! @param numBytes number of seed bytes to get ! ! @return an array containing the seed bytes ! */ ! public byte[] generateSeed(int numBytes) ! { ! return secureRandomSpi.engineGenerateSeed(numBytes); ! } ! } diff -Nrc3pad gcc-3.0.4/libjava/java/security/SecureRandomSpi.java gcc-3.1/libjava/java/security/SecureRandomSpi.java *** gcc-3.0.4/libjava/java/security/SecureRandomSpi.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/SecureRandomSpi.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,83 ---- + /* SecureRandomSpi.java --- Secure Random Service Provider Interface + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.io.Serializable; + + /** + SecureRandomSpi is the Service Provider Interface for SecureRandom + providers. It provides an interface for providers to the + SecureRandom engine to write their own pseudo-random number + generator. + + @since JDK 1.2 + + @author Mark Benvenuto + */ + public abstract class SecureRandomSpi implements Serializable + { + /** + Default Constructor for SecureRandomSpi + */ + public SecureRandomSpi() + { + } + + /** + Updates the seed for SecureRandomSpi but does not reset seed. + It does to this so repeated called never decrease randomness. + */ + protected abstract void engineSetSeed(byte[] seed); + + /** + Gets a user specified number of bytes depending on the length + of the array? + + @param bytes array to fill with random bytes + */ + protected abstract void engineNextBytes(byte[] bytes); + + /** + Gets a user specified number of bytes specified by the + parameter. + + @param numBytes number of random bytes to generate + + @return an array full of random bytes + */ + protected abstract byte[] engineGenerateSeed(int numBytes); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Security.java gcc-3.1/libjava/java/security/Security.java *** gcc-3.0.4/libjava/java/security/Security.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/Security.java Tue Jan 22 22:40:30 2002 *************** *** 1,107 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.security; import java.util.Enumeration; import java.util.Properties; - import java.util.Vector; /** ! * @author Tom Tromey ! * @date February 8, 2000. ! */ ! /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Still missing the deprecated getAlgorithmProperty method. */ ! public final class Security { ! public static int insertProviderAt (Provider provider, int position) { ! SecurityManager sm = System.getSecurityManager (); ! if (sm != null) { - // FIXME: need SecurityPermission. - // sm.checkSecurityAccess ("insertProvider." + provider.getName ()); } - if (providers.indexOf (provider) != -1) - return -1; - if (position > providers.size ()) - position = providers.size (); - providers.insertElementAt (provider, position); - return providers.indexOf (provider); } ! public static int addProvider (Provider provider) { ! return insertProviderAt (provider, providers.size ()); } ! public static void removeProvider (String name) { ! SecurityManager sm = System.getSecurityManager (); if (sm != null) { ! // FIXME: need SecurityPermission. ! // sm.checkSecurityAccess ("removeProvider." + name); } ! Provider p = getProvider (name); ! if (p != null) ! providers.removeElement (p); } ! public static Provider[] getProviders () { ! Provider[] r = new Provider[providers.size ()]; ! providers.copyInto (r); ! return r; } ! public static Provider getProvider (String name) { ! Enumeration e = providers.elements (); ! while (e.hasMoreElements ()) { ! Provider p = (Provider) e.nextElement (); ! if (name.equals (p.getName ())) ! return p; } - return null; } ! public static String getProperty (String key) { ! SecurityManager sm = System.getSecurityManager (); ! if (sm != null) { ! // FIXME: need SecurityPermission. ! // sm.checkSecurityAccess ("getProperty." + key); } ! return props.getProperty (key); } ! public static void setProperty (String key, String value) { ! SecurityManager sm = System.getSecurityManager (); if (sm != null) ! { ! // FIXME: need SecurityPermission. ! // sm.checkSecurityAccess ("setProperty." + key); ! } ! props.setProperty (key, value); } - // The providers we list. - private static Vector providers = new Vector (); ! // Security propertiesl ! private static Properties props = new Properties (); } --- 1,320 ---- ! /* Security.java --- Java base security class implmentation ! Copyright (C) 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.io.File; + import java.io.FileInputStream; + import java.io.IOException; + import java.io.FileNotFoundException; + import java.security.Provider; + import java.util.Vector; import java.util.Enumeration; import java.util.Properties; /** ! Security class that loads the Providers and provides an ! interface to security properties. ! @author Mark Benvenuto */ ! public final class Security extends Object { ! private static Vector providers = new Vector(); ! private static Properties secprops; ! ! static { ! loadProviders(System.getProperty("java.vm.name")); ! loadProviders("classpath"); ! } ! ! // This class can't be instantiated. ! private Security () ! { ! } ! ! private static void loadProviders(String vendor) ! { ! if (vendor == null) ! return; ! ! String separator = System.getProperty("file.separator"); ! String secfilestr = (System.getProperty("java.home") + ! separator + "lib" + ! separator + "security" + ! separator + vendor + ".security"); ! ! try ! { ! FileInputStream fin = new FileInputStream(secfilestr); ! secprops = new Properties(); ! secprops.load(fin); ! ! int i = 1; ! String name; ! ! while ((name = secprops.getProperty("security.provider." + i++)) != ! null) ! { ! Exception exception = null; ! ! try ! { ! providers.addElement(Class.forName(name).newInstance()); ! i++; ! } ! catch (ClassNotFoundException x) ! { ! exception = x; ! } ! catch (InstantiationException x) ! { ! exception = x; ! } ! catch (IllegalAccessException x) ! { ! exception = x; ! } ! if (exception != null) ! System.err.println ("Error loading security provider " + name ! + ": " + exception); ! } ! } ! catch (FileNotFoundException ignored) ! { ! // Actually we probibly shouldn't ignore these, once the security ! // properties file is actually installed somewhere. ! } ! catch (IOException ignored) { } } ! /** ! Gets a specific property for an algorithm. This is used to produce specialized ! algorithm parsers. ! ! @deprecated it used to a return the value of a propietary property ! for the "SUN" Cryptographic Service Provider to obtain ! algorithm-specific parameters. Used AlogorithmParameters and ! KeyFactory instead. ! ! @param algName name of algorithm to get property of ! @param propName name of property to check ! ! @return a string containing the value of the property ! */ ! public static String getAlgorithmProperty(String algName, String propName) { ! /* TODO: Figure out what this actually does */ ! return null; } ! /** ! Adds a new provider at the specified position. This allows dynamic loading ! of providers. It will check for duplication of providers. ! ! This class checks the security manager with the call checkSecurityAccess ! with "insertProvider."+provider.getName() to see if the user can add this ! provider. ! ! @param provider the provider to add ! @param position position to add the provider at ! ! @return the position the provider was added at, or -1 if a duplicate provider ! was found ! ! @throws SecurityException - if the security manager denies access to add a ! new provider ! */ ! public static int insertProviderAt(Provider provider, int position) { ! SecurityManager sm = System.getSecurityManager(); if (sm != null) + sm.checkSecurityAccess("insertProvider." + provider.getName()); + + int max = providers.size (); + for (int i = 0; i < max; i++) { ! if (((Provider) providers.elementAt(i)).getName() == ! provider.getName()) ! return -1; } ! ! if (position < 0) ! position = 0; ! if (position > max) ! position = max; ! ! providers.insertElementAt(provider, position); ! ! return position; } ! ! /** ! Adds a new provider. This allows dynamic loading ! of providers. It will check for duplication of providers. ! ! This method checks the security manager with the call checkSecurityAccess ! with "insertProvider."+provider.getName() to see if the user can add this ! provider. ! ! @param provider the provider to add ! ! @return the position the provider was added at, or -1 if a duplicate provider ! was found ! ! @throws SecurityException - if the security manager denies access to add a ! new provider ! */ ! public static int addProvider(Provider provider) { ! return insertProviderAt (provider, providers.size ()); } ! /** ! Removes a provider. This allows dynamic unloading ! of providers. It will automatically shift up providers to a higher ! ranking. If the provider is not installed, it fails silently. ! ! This method checks the security manager with the call checkSecurityAccess ! with "removeProvider."+provider.getName() to see if the user can remove this ! provider. ! ! @param name name of the provider to add ! ! @throws SecurityException - if the security manager denies access to remove a ! new provider ! */ ! public static void removeProvider(String name) { ! SecurityManager sm = System.getSecurityManager(); ! if (sm != null) ! sm.checkSecurityAccess("removeProvider." + name); ! ! Provider p = null; ! int max = providers.size (); ! for (int i = 0; i < max; i++) { ! if (((Provider) providers.elementAt(i)).getName() == name) ! { ! providers.remove(i); ! break; ! } } } ! /** ! Returns array containing all the providers. It is in the preference order ! of the providers. ! ! @return an array of installed providers ! */ ! public static Provider[] getProviders() { ! Provider array[] = new Provider[providers.size ()]; ! providers.copyInto (array); ! return array; ! } ! ! /** ! Returns the provider with the specified name. It will return null ! if the provider cannot be found. ! ! @param name name of the requested provider ! ! @return requested provider ! */ ! public static Provider getProvider(String name) ! { ! Provider p = null; ! int max = providers.size (); ! for (int i = 0; i < max; i++) { ! p = (Provider) providers.elementAt(i); ! if (p.getName() == name) ! break; } ! return p; } ! /** ! Gets the value of a security property. ! ! This method checks the security manager with the call checkSecurityAccess ! with "getProperty."+key to see if the user can get this property. ! ! @param key property to get ! ! @return value of the property ! ! @throws SecurityException - if the security manager denies access to ! getting a property ! */ ! public static String getProperty(String key) { ! SecurityManager sm = System.getSecurityManager(); if (sm != null) ! sm.checkSecurityAccess("getProperty." + key); ! ! return secprops.getProperty(key); } ! /** ! Sets the value of a security property. ! ! This method checks the security manager with the call checkSecurityAccess ! with "setProperty."+key to see if the user can get this property. ! ! @param key property to set ! @param datnum new value of property ! ! @throws SecurityException - if the security manager denies access to ! setting a property ! */ ! public static void setProperty(String key, String datnum) ! { ! SecurityManager sm = System.getSecurityManager(); ! if (sm != null) ! sm.checkSecurityAccess("setProperty." + key); ! ! secprops.put(key, datnum); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/SecurityPermission.java gcc-3.1/libjava/java/security/SecurityPermission.java *** gcc-3.0.4/libjava/java/security/SecurityPermission.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/SecurityPermission.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,109 ---- + /* SecurityPermission.java -- Class for named security permissions + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This class provides a mechanism for specified named permissions + * related to the Java security framework. These permissions have no + * associated actions list. They are either granted or no granted. + *

    + * The list of valid permission names is: + *

      + *
    • getPolicy - Allows retrieval of the system security policy. + *
    • setPolicy - Allows the security policy to be changed. + *
    • getProperty.<key> - Allows retrieval of the value of the named + * property or all properties if <key> is a '*'. + *
    • setProperty.<key> - Allows changing of the value of the named + * property or all properties if <key> is a '*'. + *
    • insertProvider.<key> - Allows the named provider to be added, + * or any provide if the key is '*'. + *
    • removeProvider.<key> - Allows the named provider to be removed, + * or any provide if the key is '*'. + *
    • setSystemScope - Allows the system identity scope to be set. + *
    • setIdentityPublicKey - Allows the public key of an Identity to be set. + *
    • SetIdentityInfo - Allows the description of an Identity to be set. + *
    • addIdentityCertificate - Allows a certificate to be set for the public + * key of an identity. + *
    • removeIdentityCertificate - Allows a certificate to be removed from the + * public key of an identity. + *
    • clearProviderProperties.<key%gt; - Allows the properties of the + * named provider to be cleared, or all providers if key is '*'. + *
    • putProviderProperty.<key%gt; - Allows the properties of the + * named provider to be changed, or all providers if key is '*'. + *
    • removeProviderProperty.<key%gt; - Allows the properties of the + * named provider to be deleted, or all providers if key is '*'. + *
    • getSignerPrivateKey - Allows the retrieval of the private key for + * a signer. + *
    • setSignerKeyPair - Allows the public and private key of a Signer to + * be changed. + *
    + *

    + * There is some degree of security risk in granting any of these permissions. + * Some of them can completely compromise system security. Please exercise + * extreme caution in granting these permissions. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public final class SecurityPermission extends BasicPermission + { + /** + * This method initializes a new instance of SecurityPermission + * to have the specified name. + * + * @param name The name to assign to this permission. + */ + public SecurityPermission(String name) + { + super(name); + } + + /** + * This method initializes a new instance of SecurityPermission + * to have the specified name. The actions parameter is ignored in this + * class. + * + * @param name The name to assign to this permission. + * @param actions The action list for this permission - ignored. + */ + public SecurityPermission(String name, String actions) + { + super(name, actions); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Signature.java gcc-3.1/libjava/java/security/Signature.java *** gcc-3.0.4/libjava/java/security/Signature.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/Signature.java Tue Jan 22 22:40:30 2002 *************** *** 1,173 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security; /** ! * @author Tom Tromey ! * @date February 11, 2000. ! */ ! /** ! * Written using on-line Java Platform 1.1 API Specification. ! * Status: Believed complete and correct to 1.1 spec. ! * It is known not to comply with the 1.2 spec. ! */ ! public abstract class Signature { ! protected Signature (String name) { state = UNINITIALIZED; - this.name = name; } ! public static Signature getInstance (String algorithm) throws NoSuchAlgorithmException { String name = "Signature." + algorithm; ! Provider[] provs = Security.getProviders (); ! for (int i = 0; i < provs.length; ++i) { ! String val = provs[i].getProperty (name); ! if (val != null) ! { ! try ! { ! return (Signature) Class.forName(val).newInstance (); ! } ! catch (Throwable _) ! { ! // We just ignore failures. ! } ! } } ! throw new NoSuchAlgorithmException (algorithm); } ! public static Signature getInstance (String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { ! String name = "Signature." + algorithm; ! Provider p = Security.getProvider (provider); if (p == null) ! throw new NoSuchProviderException (provider); ! String val = p.getProperty (name); ! if (val != null) { ! try ! { ! return (Signature) Class.forName(val).newInstance (); ! } ! catch (Throwable _) { ! // Nothing. } } ! throw new NoSuchAlgorithmException (algorithm); } ! public final void initVerify (PublicKey publicKey) throws InvalidKeyException { ! engineInitVerify (publicKey); } ! public final void initSign (PrivateKey privateKey) throws InvalidKeyException { ! engineInitSign (privateKey); } ! public final byte[] sign () ! throws SignatureException { ! return engineSign (); } ! public final boolean verify (byte[] signature) throws SignatureException { ! return engineVerify (signature); } ! public final void update (byte b) ! throws SignatureException { ! engineUpdate (b); } ! public final void update (byte[] data) ! throws SignatureException { ! engineUpdate (data, 0, data.length); } ! public final void update (byte[] data, int off, int len) throws SignatureException { ! engineUpdate (data, off, len); } ! public final String getAlgorithm () { ! return name; } ! public String toString () { ! // There is no spec for this. FIXME: this is a bad choice. ! return name + "; state = " + state; } ! public final void setParameter (String param, Object value) throws InvalidParameterException { ! engineSetParameter (param, value); } ! public final Object getParameter (String param) ! throws InvalidParameterException { ! return engineGetParameter (param); } ! protected abstract void engineInitVerify (PublicKey publicKey) ! throws InvalidKeyException; ! protected abstract void engineInitSign (PrivateKey privateKey) ! throws InvalidKeyException; ! protected abstract void engineUpdate (byte b) ! throws SignatureException; ! protected abstract void engineUpdate (byte[] b, int off, int len) ! throws SignatureException; ! protected abstract byte[] engineSign () ! throws SignatureException; ! protected abstract boolean engineVerify (byte[] sigBytes) ! throws SignatureException; ! protected abstract void engineSetParameter (String param, Object value) ! throws InvalidParameterException; ! protected abstract Object engineGetParameter (String param) ! throws InvalidParameterException; ! public Object clone() throws CloneNotSupportedException { ! return super.clone (); } ! protected static final int UNINITIALIZED = 0; ! protected static final int SIGN = 2; ! protected static final int VERIFY = 3; ! // Current state. ! protected int state; ! // Name of this object. ! private String name; } --- 1,499 ---- ! /* Signature.java --- Signature Class ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security; + import java.security.spec.AlgorithmParameterSpec; /** ! Signature is used to provide an interface to digital signature ! algorithms. Digital signatures provide authentication and data ! integrity of digital data. ! The GNU provider provides the NIST standard DSA which uses DSA ! and SHA-1. It can be specified by SHA/DSA, SHA-1/DSA or its ! OID. If the RSA signature algorithm is provided then ! it could be MD2/RSA. MD5/RSA, or SHA-1/RSA. The algorithm must ! be specified because there is no default. ! Signature provides implementation-independent algorithms which ! are requested by the user through getInstance. It can be ! requested by specifying just the algorithm name or by ! specifying both the algorithm name and provider name. ! ! The three phases of using Signature are: ! ! 1. Initialing ! ! * It must be initialized with a private key for ! signing. ! * It must be initialized with a public key for ! verifying. ! ! 2. Updating ! ! Update the bytes for signing or verifying with calls ! to update. ! ! 3. Signing or Verify the signature on the currently stored ! bytes by calling sign or verify. ! ! @author Mark Benvenuto ! @since JDK 1.1 ! */ ! public abstract class Signature extends SignatureSpi { ! /** ! Possible state variable which signifies if it has not been ! initialized. ! */ ! protected static final int UNINITIALIZED = 1; ! ! /** ! Possible state variable which signifies if it has been ! initialized for signing. ! */ ! protected static final int SIGN = 2; ! ! /** ! Possible state variable which signifies if it has been ! initialized for verifying. ! */ ! protected static final int VERIFY = 3; ! ! /** ! State of this Signature class. ! */ ! protected int state = UNINITIALIZED; ! ! private String algorithm; ! private Provider provider; ! ! /** ! Creates a new signature for this algorithm. ! ! @param algorithm the algorithm to use ! */ ! protected Signature(String algorithm) { + this.algorithm = algorithm; state = UNINITIALIZED; } ! /** ! Gets an instance of the Signature class representing ! the specified signature. If the algorithm is not found then, ! it throws NoSuchAlgorithmException. ! ! @param algorithm the name of signature algorithm to choose ! @return a Signature repesenting the desired algorithm ! ! @throws NoSuchAlgorithmException if the algorithm is not implemented by providers ! */ ! public static Signature getInstance(String algorithm) throws NoSuchAlgorithmException { String name = "Signature." + algorithm; ! Provider[] p = Security.getProviders(); ! ! for (int i = 0; i < p.length; i++) { ! String classname = p[i].getProperty(name); ! if (classname != null) ! return getInstance(classname, algorithm, p[i]); } ! throw new NoSuchAlgorithmException(algorithm); } ! /** ! Gets an instance of the Signature class representing ! the specified signature from the specified provider. If the ! algorithm is not found then, it throws NoSuchAlgorithmException. ! If the provider is not found, then it throws ! NoSuchProviderException. ! ! @param algorithm the name of signature algorithm to choose ! @param provider the name of the provider to find the algorithm in ! @return a Signature repesenting the desired algorithm ! ! @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider ! @throws NoSuchProviderException if the provider is not found ! */ ! public static Signature getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { ! Provider p = Security.getProvider(provider); if (p == null) ! throw new NoSuchProviderException(); ! ! return getInstance(p.getProperty("Signature." + algorithm), algorithm, p); ! } ! ! private static Signature getInstance(String classname, ! String algorithm, ! Provider provider) ! throws NoSuchAlgorithmException ! { ! try { ! Object o = Class.forName(classname).newInstance(); ! Signature sig; ! if (o instanceof SignatureSpi) ! sig = (Signature) (new DummySignature((SignatureSpi) o, algorithm)); ! else { ! sig = (Signature) o; ! sig.algorithm = algorithm; } + + sig.provider = provider; + return sig; } + catch (ClassNotFoundException cnfe) + { + throw new NoSuchAlgorithmException("Class not found"); + } + catch (InstantiationException ie) + { + throw new NoSuchAlgorithmException("Class instantiation failed"); + } + catch (IllegalAccessException iae) + { + throw new NoSuchAlgorithmException("Illegal Access"); + } + } ! /** ! Gets the provider that the Signature is from. ! ! @return the provider the this Signature ! */ ! public final Provider getProvider() ! { ! return provider; } ! /** ! Initializes this class with the public key for ! verification purposes. ! ! @param publicKey the public key to verify with ! ! @throws InvalidKeyException invalid key ! */ ! public final void initVerify(PublicKey publicKey) throws InvalidKeyException ! { ! state = VERIFY; ! engineInitVerify(publicKey); ! } ! ! /** ! Verify Signature with a certificate. This is a FIPS 140-1 compatible method ! since it verifies a signature with a certificate. ! ! If the certificate is an X.509 certificate, has a KeyUsage parameter and ! the parameter indicates this key is not to be used for signing then an ! error is returned. ! ! @param certificate a certificate containing a public key to verify with ! */ ! public final void initVerify(java.security.cert.Certificate certificate) throws InvalidKeyException { ! state = VERIFY; ! if (certificate.getType().equals("X509")) ! { ! java.security.cert.X509Certificate cert = ! (java.security.cert.X509Certificate) certificate; ! ! boolean[]array = cert.getKeyUsage(); ! if (array != null && array[0] == false) ! throw new InvalidKeyException ! ("KeyUsage of this Certificate indicates it cannot be used for digital signing"); ! } ! this.initVerify(certificate.getPublicKey()); } ! /** ! Initializes this class with the private key for ! signing purposes. ! ! @param privateKey the private key to sign with ! ! @throws InvalidKeyException invalid key ! */ ! public final void initSign(PrivateKey privateKey) throws InvalidKeyException ! { ! state = SIGN; ! engineInitSign(privateKey); ! } ! ! /** ! Initializes this class with the private key and source ! of randomness for signing purposes. ! ! @param privateKey the private key to sign with ! @param random Source of randomness ! ! @throws InvalidKeyException invalid key ! ! @since JDK 1.2 ! */ ! public final void initSign(PrivateKey privateKey, SecureRandom random) throws InvalidKeyException { ! state = SIGN; ! engineInitSign(privateKey, random); } ! ! /** ! Returns the signature bytes of all the data fed to this class. ! The format of the output depends on the underlying signature ! algorithm. ! ! @return the signature ! ! @throws SignatureException engine not properly initialized ! */ ! public final byte[] sign() throws SignatureException { ! if (state == SIGN) ! { ! state = UNINITIALIZED; ! return engineSign(); ! } ! else ! throw new SignatureException(); } ! /** ! Generates signature bytes of all the data fed to this class ! and outputs it to the passed array. The format of the ! output depends on the underlying signature algorithm. ! ! After calling this method, the signature is reset to its ! initial state and can be used to generate additional ! signatures. ! ! @param outbuff array of bytes ! @param offset the offset to start at in the array ! @param len the length of the bytes to put into the array. ! Neither this method or the GNU provider will ! return partial digests. If len is less than the ! signature length, this method will throw ! SignatureException. If it is greater than or equal ! then it is ignored. ! ! @return number of bytes in outbuf ! ! @throws SignatureException engine not properly initialized ! ! @since JDK 1.2 ! */ ! public final int sign(byte[]outbuf, int offset, int len) throws SignatureException { ! if (state == SIGN) ! { ! state = UNINITIALIZED; ! return engineSign(outbuf, offset, len); ! } ! else ! throw new SignatureException(); } ! /** ! Verifies the passed signature. ! ! @param signature the signature bytes to verify ! ! @return true if verified, false otherwise ! ! @throws SignatureException engine not properly initialized ! or wrong signature ! */ ! public final boolean verify(byte[]signature) throws SignatureException { ! if (state == VERIFY) ! { ! state = UNINITIALIZED; ! return engineVerify(signature); ! } ! else ! throw new SignatureException(); } ! /** ! Updates the data to be signed or verified with the specified ! byte. ! ! @param b byte to update with ! ! @throws SignatureException Engine not properly initialized ! */ ! public final void update(byte b) throws SignatureException { ! if (state != UNINITIALIZED) ! engineUpdate(b); ! else ! throw new SignatureException(); } ! /** ! Updates the data to be signed or verified with the specified ! bytes. ! ! @param data array of bytes ! ! @throws SignatureException engine not properly initialized ! */ ! public final void update(byte[]data) throws SignatureException ! { ! if (state != UNINITIALIZED) ! engineUpdate(data, 0, data.length); ! else ! throw new SignatureException(); ! } ! ! /** ! Updates the data to be signed or verified with the specified ! bytes. ! ! @param data array of bytes ! @param off the offset to start at in the array ! @param len the length of the bytes to use in the array ! ! @throws SignatureException engine not properly initialized ! */ ! public final void update(byte[]data, int off, int len) throws SignatureException { ! if (state != UNINITIALIZED) ! engineUpdate(data, off, len); ! else ! throw new SignatureException(); } ! /** ! Gets the name of the algorithm currently used. ! The names of algorithms are usually SHA/DSA or SHA/RSA. ! ! @return name of algorithm. ! */ ! public final String getAlgorithm() { ! return algorithm; } ! /** ! Returns a representation of the Signature as a String ! ! @return a string representing the signature ! */ ! public String toString() { ! return (algorithm + " Signature"); } ! /** ! Sets the specified algorithm parameter to the specified value. ! ! @param param parameter name ! @param value parameter value ! ! @throws InvalidParameterException invalid parameter, parameter ! already set and cannot set again, a security exception, ! etc. ! ! @deprecated use the other setParameter ! */ ! public final void setParameter(String param, Object value) throws InvalidParameterException { ! engineSetParameter(param, value); } ! /** ! Sets the signature engine with the specified ! AlgorithmParameterSpec; ! ! By default this always throws UnsupportedOperationException ! if not overridden; ! ! @param params the parameters ! ! @throws InvalidParameterException invalid parameter, parameter ! already set and cannot set again, a security exception, ! etc. ! */ ! public final void setParameter(AlgorithmParameterSpec params) ! throws InvalidAlgorithmParameterException { ! engineSetParameter(params); } ! /** ! Gets the value for the specified algorithm parameter. ! @param param parameter name ! ! @return parameter value ! ! @throws InvalidParameterException invalid parameter ! ! @deprecated use the other getParameter ! */ ! public final Object getParameter(String param) ! throws InvalidParameterException { ! return engineGetParameter(param); } ! /** ! Returns a clone if cloneable. ! @return a clone if cloneable. ! @throws CloneNotSupportedException if the implementation does ! not support cloning ! */ ! public Object clone() throws CloneNotSupportedException ! { ! throw new CloneNotSupportedException(); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/security/SignatureException.java gcc-3.1/libjava/java/security/SignatureException.java *** gcc-3.0.4/libjava/java/security/SignatureException.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/SignatureException.java Tue Jan 22 22:40:30 2002 *************** *** 1,30 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.security; ! /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ /** ! * Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public class SignatureException extends GeneralSecurityException { public SignatureException() { super(); } public SignatureException(String msg) { super(msg); --- 1,65 ---- ! /* SignatureException.java -- Generic error in signature ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package java.security; /** ! * This exception is thrown when a problem is encountered with a ! * digital signature. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public class SignatureException extends GeneralSecurityException { + /** + * This method initializes a new instance of SignatureException + * with no descriptive error message. + */ public SignatureException() { super(); } + /** + * This method initializes a new instance of SignatureException + * with a descriptive error message. + */ public SignatureException(String msg) { super(msg); diff -Nrc3pad gcc-3.0.4/libjava/java/security/SignatureSpi.java gcc-3.1/libjava/java/security/SignatureSpi.java *** gcc-3.0.4/libjava/java/security/SignatureSpi.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/SignatureSpi.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,254 ---- + /* SignatureSpi.java --- Signature Service Provider Interface + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.security.spec.AlgorithmParameterSpec; + + /** + SignatureSpi defines the Service Provider Interface (SPI) + for the Signature class. The signature class provides an + interface to a digital signature algorithm. Digital signatures + are used for authentication and integrity of data. + + @author Mark Benvenuto + + @since JDK 1.2 + */ + public abstract class SignatureSpi + { + /** + Source of randomness + */ + protected SecureRandom appRandom; + + /** + Creates a new instance of SignatureSpi. + */ + public SignatureSpi() + { + appRandom = null; + } + + /** + Initializes this class with the public key for + verification purposes. + + @param publicKey the public key to verify with + + @throws InvalidKeyException invalid key + */ + protected abstract void engineInitVerify(PublicKey publicKey) + throws InvalidKeyException; + + /** + Initializes this class with the private key for + signing purposes. + + @param privateKey the private key to sign with + + @throws InvalidKeyException invalid key + */ + protected abstract void engineInitSign(PrivateKey privateKey) + throws InvalidKeyException; + + /** + Initializes this class with the private key and source + of randomness for signing purposes. + + This cannot be abstract backward compatibility reasons + + @param privateKey the private key to sign with + @param random Source of randomness + + @throws InvalidKeyException invalid key + + @since JDK 1.2 + */ + protected void engineInitSign(PrivateKey privateKey, SecureRandom random) + throws InvalidKeyException + { + appRandom = random; + engineInitSign(privateKey); + } + + /** + Updates the data to be signed or verified with the specified + byte. + + @param b byte to update with + + @throws SignatureException Engine not properly initialized + */ + protected abstract void engineUpdate(byte b) throws SignatureException; + + /** + Updates the data to be signed or verified with the specified + bytes. + + @param b array of bytes + @param off the offset to start at in the array + @param len the length of the bytes to use in the array + + @throws SignatureException engine not properly initialized + */ + protected abstract void engineUpdate(byte[] b, int off, int len) + throws SignatureException; + + /** + Returns the signature bytes of all the data fed to this class. + The format of the output depends on the underlying signature + algorithm. + + @return the signature + + @throws SignatureException engine not properly initialized + */ + protected abstract byte[] engineSign() throws SignatureException; + + /** + Generates signature bytes of all the data fed to this class + and outputs it to the passed array. The format of the + output depends on the underlying signature algorithm. + + This cannot be abstract backward compatibility reasons. + After calling this method, the signature is reset to its + initial state and can be used to generate additional + signatures. + + @param outbuff array of bytes + @param offset the offset to start at in the array + @param len the length of the bytes to put into the array. + Neither this method or the GNU provider will + return partial digests. If len is less than the + signature length, this method will throw + SignatureException. If it is greater than or equal + then it is ignored. + + @return number of bytes in outbuf + + @throws SignatureException engine not properly initialized + + @since JDK 1.2 + */ + protected int engineSign(byte[] outbuf, int offset, int len) + throws SignatureException + { + byte tmp[] = engineSign(); + + if (tmp.length > len) + throw new SignatureException("Invalid Length"); + + System.arraycopy(outbuf, offset, tmp, 0, tmp.length); + + return tmp.length; + } + + /** + Verifies the passed signature. + + @param sigBytes the signature bytes to verify + + @return true if verified, false otherwise + + @throws SignatureException engine not properly initialized + or wrong signature + */ + protected abstract boolean engineVerify(byte[] sigBytes) + throws SignatureException; + + /** + Sets the specified algorithm parameter to the specified value. + + @param param parameter name + @param value parameter value + + @throws InvalidParameterException invalid parameter, parameter + already set and cannot set again, a security exception, + etc. + + @deprecated use the other setParameter + */ + protected abstract void engineSetParameter(String param, Object value) + throws InvalidParameterException; + + /** + Sets the signature engine with the specified + AlgorithmParameterSpec; + + This cannot be abstract backward compatibility reasons + By default this always throws UnsupportedOperationException + if not overridden; + + @param params the parameters + + @throws InvalidParameterException invalid parameter, parameter + already set and cannot set again, a security exception, + etc. + */ + protected void engineSetParameter(AlgorithmParameterSpec params) + throws InvalidAlgorithmParameterException + { + throw new UnsupportedOperationException(); + } + + /** + Gets the value for the specified algorithm parameter. + + @param param parameter name + + @return parameter value + + @throws InvalidParameterException invalid parameter + + @deprecated use the other getParameter + */ + protected abstract Object engineGetParameter(String param) + throws InvalidParameterException; + + /** + Returns a clone if cloneable. + + @return a clone if cloneable. + + @throws CloneNotSupportedException if the implementation does + not support cloning + */ + public Object clone() throws CloneNotSupportedException + { + throw new CloneNotSupportedException(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/SignedObject.java gcc-3.1/libjava/java/security/SignedObject.java *** gcc-3.0.4/libjava/java/security/SignedObject.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/SignedObject.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,177 ---- + /* SignedObject.java --- Signed Object Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + import java.io.ByteArrayInputStream; + import java.io.ByteArrayOutputStream; + import java.io.IOException; + import java.io.ObjectInputStream; + import java.io.ObjectOutputStream; + import java.io.Serializable; + + /** + SignedObject is used for storing rutime objects whose integrity + cannot be compromised without being detected. + + SignedObject contains a Serializable object which is yet to be + signed and its signature. + + The signed copy is a "deep copy" (in serialized form) of the + original object. Any changes to the original will not affect + the original. + + Several things to note are that, first there is no need to + initialize the signature engine as this class will handle that + automatically. Second, verification will only succeed if the + public key corresponds to the private key used to generate + the SignedObject. + + For fexibility, the signature engine can be specified in the + constructor or the verify method. The programmer who writes + code that verifies the SignedObject has not changed should be + aware of the Signature engine they use. A malicious Signature + may choose to always return true on verification and + bypass the secrity check. + + The GNU provider provides the NIST standard DSA which uses DSA + and SHA-1. It can be specified by SHA/DSA, SHA-1/DSA or its + OID. If the RSA signature algorithm is provided then + it could be MD2/RSA. MD5/RSA, or SHA-1/RSA. The algorithm must + be specified because there is no default. + + @author Mark Benvenuto + + @since JDK 1.2 + */ + public final class SignedObject implements Serializable + { + private byte[] content; + private byte[] signature; + private String thealgorithm; + + /** + Constructs a new SignedObject from a Serializeable object. The + object is signed with private key and signature engine + + @param object the object to sign + @param signingKey the key to sign with + @param signingEngine the signature engine to use + + @throws IOException serialization error occurred + @throws InvalidKeyException invalid key + @throws SignatureException signing error + */ + public SignedObject(Serializable object, PrivateKey signingKey, + Signature signingEngine) throws IOException, + InvalidKeyException, SignatureException + { + thealgorithm = signingEngine.getAlgorithm(); + + ByteArrayOutputStream ostream = new ByteArrayOutputStream(); + ObjectOutputStream p = new ObjectOutputStream(ostream); + p.writeObject(object); + p.flush(); + + content = ostream.toByteArray(); + + signingEngine.initSign(signingKey); + signingEngine.update(content); + signature = signingEngine.sign(); + } + + /** + Returns the encapsulated object. The object is + de-serialized before being returned. + + @return the encapsulated object + + @throws IOException de-serialization error occurred + @throws ClassNotFoundException de-serialization error occurred + */ + public Object getObject() throws IOException, ClassNotFoundException + { + ByteArrayInputStream istream = new ByteArrayInputStream(content); + + return new ObjectInputStream(istream).readObject(); + } + + /** + Returns the signature of the encapsulated object. + + @return a byte array containing the signature + */ + public byte[] getSignature() + { + return signature; + } + + /** + Returns the name of the signature algorithm. + + @return the name of the signature algorithm. + */ + public String getAlgorithm() + { + return thealgorithm; + } + + /** + Verifies the SignedObject by checking that the signature that + this class contains for the encapsulated object. + + @param verificationKey the public key to use + @param verificationEngine the signature engine to use + + @return true if signature is correct, false otherwise + + @throws InvalidKeyException invalid key + @throws SignatureException signature verification failed + */ + public boolean verify(PublicKey verificationKey, + Signature verificationEngine) throws + InvalidKeyException, SignatureException + { + verificationEngine.initVerify(verificationKey); + verificationEngine.update(content); + return verificationEngine.verify(signature); + } + + // readObject is called to restore the state of the SignedObject from a + // stream. + //private void readObject(ObjectInputStream s) + // throws IOException, ClassNotFoundException + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/Signer.java gcc-3.1/libjava/java/security/Signer.java *** gcc-3.0.4/libjava/java/security/Signer.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/Signer.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,153 ---- + /* Signer.java --- Signer Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + Signer is a subclass used to store a digital signature key with + an Identity. + + @author Mark Benvenuto + + @since JDK 1.1 + */ + public abstract class Signer extends Identity + { + private PrivateKey privateKey = null; + + /** + Constructs a new Signer. + */ + protected Signer() + { + } + + /** + Constructs a new Signer with the specified name. + + @param name the name of the identity. + */ + public Signer(String name) + { + super(name); + } + + /** + Constructs a new Signer with the specifid name and + IdentityScope. + + @param name the name of the identity. + @scope the IdentityScope to use + + @throws KeyManagementException if duplicate identity name + within scope + */ + public Signer(String name, IdentityScope scope) + throws KeyManagementException + { + super(name, scope); + } + + /** + Returns the private key for this signer. + + This class checks the security manager with the call + checkSecurityAccess with "getSignerPrivateKey". + + @returns the private key for the signer + + @throws SecurityException - if the security manager denies + access to "getSignerPrivateKey" + */ + public PrivateKey getPrivateKey() + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("getSignerPrivateKey"); + + return privateKey; + } + + /** + Specifies the KeyPair associated with this Signer. + + This class checks the security manager with the call + checkSecurityAccess with "setSignerKeyPair". + + @param pair the keyPair + + @throws InvalidParameterException invalidly intialized key pair + @throws KeyException another key error + @throws SecurityException - if the security manager denies + access to "getSignerPrivateKey" + */ + public final void setKeyPair(KeyPair pair) + throws InvalidParameterException, KeyException + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkSecurityAccess("setSignerKeyPair"); + + try + { + if (pair.getPublic() != null) + setPublicKey(pair.getPublic()); + else + throw new InvalidParameterException(); + + } + catch (KeyManagementException kme) + { + throw new KeyException(); + } + + if (pair.getPrivate() != null) + privateKey = pair.getPrivate(); + else + throw new InvalidParameterException(); + } + + /** + Returns a string representing this Signer. + + @returns a string representing this Signer. + */ + public String toString() + { + return (getName() + ": " + privateKey); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/UnrecoverableKeyException.java gcc-3.1/libjava/java/security/UnrecoverableKeyException.java *** gcc-3.0.4/libjava/java/security/UnrecoverableKeyException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/UnrecoverableKeyException.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,69 ---- + /* UnrecoverableKeyException.java -- Cannot recover a key from the key store + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + /** + * This exception is thrown when a key cannot be recovered from the key + * store. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class UnrecoverableKeyException extends GeneralSecurityException + { + /** + * This method initializes a new instance of UnrecoverableKeyException + * with no descriptive error message. + */ + public UnrecoverableKeyException() + { + super(); + } + + /** + * This method initializes a new instance of UnrecoverableKeyException + * with a descriptive error message. + * + * @param msg The descriptive error message. + */ + public UnrecoverableKeyException(String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/UnresolvedPermission.java gcc-3.1/libjava/java/security/UnresolvedPermission.java *** gcc-3.0.4/libjava/java/security/UnresolvedPermission.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/UnresolvedPermission.java Tue Jan 22 22:40:30 2002 *************** *** 0 **** --- 1,199 ---- + /* UnresolvedPermission.java -- Placeholder for unresolved permissions. + Copyright (C) 1998, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security; + + import java.io.Serializable; + // All uses of Certificate in this file refer to this class. + import java.security.cert.Certificate; + + /** + * This class is used to hold instances of all permissions that cannot + * be resolved to available permission classes when the security + * Policy object is instantiated. This may happen when the + * necessary security class has not yet been downloaded from the network. + *

    + * Instances of this class are re-resolved when AccessController + * check is done. At that time, a scan is made of all existing + * UnresolvedPermission objects and they are converted to + * objects of the appropriate permission type if the class for that type + * is then available. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public final class UnresolvedPermission + extends Permission + implements Serializable + { + + /** + * The list of actions associated with this permission object + */ + private String actions; + + /** + * The list of Certificates associated with this object + */ + private Certificate[] certs; + + /** + * The name of the class this object should be resolved to. + */ + private String type; + + /** + * This method initializes a new instance of UnresolvedPermission + * with all the information necessary to resolve it to an instance of the + * proper class at a future time. + * + * @param type The name of the desired class this permission should be resolved to + * @param name The name of this permission + * @param actions The action list for this permission + * @param certs The list of certificates this permission's class was signed with + */ + public UnresolvedPermission(String type, String name, String actions, + Certificate[] certs) + { + super(name); + + this.type = type; + this.actions = actions; + this.certs = certs; + } + + /** + * This method returns the list of actions associated with this + * permission. + * + * @return The action list + */ + public String getActions() + { + return (actions); + } + + /** + * This method returns false always to indicate that this + * permission does not imply the specified permission. An + * UnresolvedPermission never grants any permissions. + * + * @param perm The Permission object to test against - ignored by this class + * + * @return false to indicate this permission does not imply the specified permission. + */ + public boolean implies(Permission perm) + { + return (false); + } + + /** + * This method tests this permission for equality against the specified + * Object. This will be true if and only if the following + * conditions are met: + *

    + *

      + *
    • The specified Object is an instance of + * UnresolvedPermission, or a subclass. + *
    • The specified permission has the same type (i.e., desired class name) + * as this permission. + *
    • The specified permission has the same name as this one. + *
    • The specified permissoin has the same action list as this one. + *
    • The specified permission has the same certificate list as this one. + *
    + * + * @param obj The Object to test for equality + * + * @return true if the specified object is equal to this one, false otherwise. + */ + public boolean equals(Object obj) + { + if (!(obj instanceof UnresolvedPermission)) + return (false); + + UnresolvedPermission up = (UnresolvedPermission) obj; + + if (!getName().equals(up.getName())) + return (false); + + if (!getActions().equals(up.getActions())) + return (false); + + if (!type.equals(up.type)) + return (false); + + if (!certs.equals(up.certs)) + return (false); + + return (true); + } + + /** + * Returns a hash code value for this object. + * + * @return A hash value + */ + public int hashCode() + { + return (System.identityHashCode(this)); + } + + /** + * This method returns a String representation of this + * class. The format is: '(unresolved "ClassName "name" "actions")' + * + * @return A String representation of this object + */ + public String toString() + { + return "(unresolved " + type + " " + getName() + " " + getActions() + ")"; + } + + /** + * This class returns a PermissionCollection object that can + * be used to store instances of UnresolvedPermission. If + * null is returned, the caller is free to use any desired + * PermissionCollection. + * + * @return A new PermissionCollection. + */ + public PermissionCollection newPermissionCollection() + { + return (null); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/Acl.java gcc-3.1/libjava/java/security/acl/Acl.java *** gcc-3.0.4/libjava/java/security/acl/Acl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/Acl.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,149 ---- + /* Acl.java -- An access control list + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + import java.security.Principal; + import java.util.Enumeration; + + /** + * A Java access control list (ACL) is a group of individual ACL entries. + * These entries consist of a Principal and a list of + * permissions this Principal is either granted or denied. + * A given Principal can have at most one positive ACL entry + * (i.e., one that grants permissions) and one negative ACL entry (i.e., one + * that denies permissions). If a given permission is both granted and + * denied, the ACL treats it as if it were never granted or denied. If + * both a Principal and a Group to which the + * Principal belongs have an ACL entry, the permissions for + * the individual Principal take precedence over the + * permissions of the Group if there is a conflict. + *

    Owner interface + * and so an ACL has owners. Actions which modify the ACL are restricted + * to owners. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface Acl extends Owner + { + + /** + * This method returns the name of this ACL. + * + * @return The name of this ACL + */ + public abstract String getName(); + + /** + * This method sets the name of the ACL + * + * @param caller The Principal requesting the action. + * @param name The new name for this ACL. + * + * @exception NotOwnerException If the caller is not an owner of this ACL. + */ + public abstract void setName(Principal caller, String name) + throws NotOwnerException; + + /** + * This method adds the specified entry to the ACL + * + * @param caller The Principal requesting the addition + * @param entry The ACL entry to add + * + * @return true if the entry was added, false if there is already an entry of the same type for the Principal. + * + * @exception NotOwnerException If the caller is not an owner of this ACL. + */ + public abstract boolean addEntry(Principal caller, AclEntry entry) + throws NotOwnerException; + + /** + * This method delets the specified entry from the ACL + * + * @param caller The Principal requesting the deletion. + * @param entry The ACL entry to delete + * + * @return true if the entry was deleted, or false if this entry was not part of the ACL to begin with + * + * @exception NotOwnerException If the caller is not an owner of this ACL. + */ + public abstract boolean removeEntry(Principal caller, AclEntry entry) + throws NotOwnerException; + + /** + * This method returns a list of all the entries in the ACL as an + * Enumeration. + * + * @return An enumeration of the ACL entries + */ + public abstract Enumeration entries(); + + /** + * This method tests whether or not the specified Principal + * has the specified Permission + * + * @param user The Principal to test + * @param perm The Permission to test for + * + * @return true if the user has been granted the permission, false otherwise + */ + public abstract boolean checkPermission(Principal user, Permission perm); + + /** + * This method returns a list of Permission's that are granted + * to a particular Principal. This includes any permissions + * that are granted to Group's to which the Principal + * belongs unless they are overridden by a negative ACL. This permission + * list is returned as an Enumeration. + * + * @param user The Principal to retrieve permissions for. + * + * @return A list of permissions for the Principal. + */ + public abstract Enumeration getPermissions(Principal user); + + /** + * This method returns the ACL as a String + * + * @return A String representation of this ACL + */ + public abstract String toString(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/AclEntry.java gcc-3.1/libjava/java/security/acl/AclEntry.java *** gcc-3.0.4/libjava/java/security/acl/AclEntry.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/AclEntry.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,143 ---- + /* AclEntry.java -- An entry in an ACL list. + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + import java.security.Principal; + import java.util.Enumeration; + + /** + * This interface models an entry in an access control list (ACL). Java + * ACL's consist of a list of entries, where each consists of a + * Principal and a list of Permission's which + * have been granted to that Principal. An ACL can also + * be negative, which indicates that the list of + * Permission's is a list of permissions that are not + * granted to the Principal. A Principal can + * have at most one regular (or positive) ACL entry and one negative + * ACL entry. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface AclEntry extends Cloneable + { + /** + * This method returns the Principal associated with this + * ACL entry. + * + * @return The Principal for this ACL entry + */ + public abstract Principal getPrincipal(); + + /** + * This method sets ths Principal associated with this + * ACL entry. This operation will only succeed if there is not already + * a Principal assigned. + * + * @param user The Principal for this ACL entry + * + * @return true if the Principal was successfully set or false if this entry already has a Principal. + */ + public abstract boolean setPrincipal(Principal user); + + /** + * This method sets this ACL entry to be a negative entry, indicating + * that it contains a list of permissions that are not granted + * to the entry's Principal. Note that there is no way to + * undo this operation. + */ + public abstract void setNegativePermissions(); + + /** + * This method tests whether or not this ACL entry is a negative entry or not. + * + * @return true if this ACL entry is negative, false otherwise + */ + public abstract boolean isNegative(); + + /** + * This method adds the specified permission to this ACL entry. + * + * @param perm The Permission to add + * + * @return true if the permission was added or false if it was already set for this entry + */ + public abstract boolean addPermission(Permission permission); + + /** + * This method deletes the specified permission to this ACL entry. + * + * @param perm The Permission to delete from this ACL entry. + * + * @return true if the permission was successfully deleted or false if the permission was not part of this ACL to begin with + */ + public abstract boolean removePermission(Permission perm); + + /** + * This method tests whether or not the specified permission is associated + * with this ACL entry. + * + * @param perm The Permission to test + * + * @return true if this permission is associated with this entry or false otherwise + */ + public abstract boolean checkPermission(Permission permission); + + /** + * This method returns a list of all Permission objects + * associated with this ACL entry as an Enumeration. + * + * @return A list of permissions for this ACL entry + */ + public abstract Enumeration permissions(); + + /** + * This method returns this object as a String. + * + * @return A String representation of this object + */ + public abstract String toString(); + + /** + * This method returns a clone of this ACL entry + * + * @return A clone of this ACL entry + */ + public abstract Object clone(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/AclNotFoundException.java gcc-3.1/libjava/java/security/acl/AclNotFoundException.java *** gcc-3.0.4/libjava/java/security/acl/AclNotFoundException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/AclNotFoundException.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,57 ---- + /* AclNotFoundException.java -- What it says + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + /** + * This exception is thrown when a requested access control list (ACL) is + * not found. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class AclNotFoundException extends Exception + { + /** + * Initializes a new instance of this class with no descriptive message + */ + public AclNotFoundException() + { + super(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/Group.java gcc-3.1/libjava/java/security/acl/Group.java *** gcc-3.0.4/libjava/java/security/acl/Group.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/Group.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,90 ---- + /* Group.java -- Represents a group of Principals + Copyright (C) 1998, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + import java.security.Principal; + import java.util.Enumeration; + + /** + * This interface represents a group of Principals. Note that + * since this interface extends Principal, a Group + * can be used where ever a Principal is requested. This + * includes arguments to the methods in this interface. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface Group extends Principal + { + /** + * This method adds a new Principal to this group. + * + * @param user The new Principal to add + * + * @return true if the user was successfully added or false if the user is already a member + */ + public abstract boolean addMember(Principal user); + + /** + * This method deletes a member from the group. + * + * @param user The Principal to delete + * + * @return true if the user was successfully deleted or false if the user is not a member of the group + */ + public abstract boolean removeMember(Principal user); + + /** + * This method tests whether or not a given Principal is a + * member of this group. + * + * @param user The Principal to test for membership + * + * @return true if the user is member, false otherwise + */ + public abstract boolean isMember(Principal member); + + /** + * This method returns a list of all members of the group as an + * Enumeration. + * + * @return The list of all members of the group + */ + public abstract Enumeration members(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/LastOwnerException.java gcc-3.1/libjava/java/security/acl/LastOwnerException.java *** gcc-3.0.4/libjava/java/security/acl/LastOwnerException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/LastOwnerException.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,58 ---- + /* LastOwnerException.java -- User attempted to delete last ACL owner + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + /** + * This exception is thrown when an attempt is made to delete the last owner + * of an access control list (ACL) + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class LastOwnerException extends java.lang.Exception + { + /** + * Initialize a new instance of LastOwnerException that does + * not have a log message. + */ + public LastOwnerException() + { + super(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/NotOwnerException.java gcc-3.1/libjava/java/security/acl/NotOwnerException.java *** gcc-3.0.4/libjava/java/security/acl/NotOwnerException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/NotOwnerException.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,60 ---- + /* NotOwnerException.java -- Attempt to modify an unowned ACL + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + /** + * This exception is thrown whenever an operation is attempted that requires + * the caller to be the owner of the access control list (ACL) when the caller + * is in fact not the owner of the ACL. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class NotOwnerException extends java.lang.Exception + { + + /** + * Initializes a new instance of NotOwnerException that does + * not have a descriptive message. + */ + public NotOwnerException() + { + super(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/Owner.java gcc-3.1/libjava/java/security/acl/Owner.java *** gcc-3.0.4/libjava/java/security/acl/Owner.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/Owner.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,95 ---- + /* Owner.java -- ACL owner + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + import java.security.Principal; + + /** + * This interface provides a mechanism for maintaining a list of owners + * of an access control list (ACL). Since a Principal must + * be an owner in order to modify the owner list, a mechanism must be + * provided to specify the initial owner of the ACL. The proper way to do + * this is for the implementing class to specify the initial owner in + * the contructor for that class. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface Owner + { + /** + * This method adds an owner to the access control list (ACL). Only a + * Principal who is already an owner can perform this operation. + * + * @param caller The Principal who is requesting that an owner be added + * @param owner The Principal to add as a new owner + * + * @param true if the new owner was successfully added or false if the specified new owner is already an owner + * + * @exception NotOwnerException If the caller is not already an owner of this ACL + */ + public abstract boolean addOwner(Principal caller, Principal owner) + throws NotOwnerException; + + /** + * This method delets an owner from the access control list (ACL). Only a + * Principal who is an owner can perform this operation. An + * owner can delete itself from the list. If there is only one + * owner remaining on this list, any attempt to delete it will throw an + * exception. + * + * @param caller The Principal who is requesting that an owner be deleted + * @param owner The Principal to delete as an owner + * + * @param true if the new owner was successfully deleted or false if the specified owner is not currently an owner + * + * @exception NotOwnerException If the caller is not already an owner of this ACL + * @exception LastOwnerException If completing the operation would delete the last ACL owner + */ + public abstract boolean deleteOwner(Principal caller, Principal owner) + throws NotOwnerException, LastOwnerException; + + /** + * This method tests whether or not a given Principal is an + * owner of this access control list (ACL). + * + * @return true if the Principal is an owner, false otherwise + */ + public abstract boolean isOwner(Principal owner); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/acl/Permission.java gcc-3.1/libjava/java/security/acl/Permission.java *** gcc-3.0.4/libjava/java/security/acl/Permission.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/acl/Permission.java Tue Jan 22 22:40:32 2002 *************** *** 0 **** --- 1,67 ---- + /* Permission.java -- Information about an ACL permission + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.acl; + + /** + * This interface provides information about a permission that can be + * granted. Note that this is not the same as the class + * java.security.Permission. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface Permission + { + /** + * This method tests whether or not a specified Permission + * (passed as an Object) is the same as this permission. + * + * @param perm The permission to check for equality + * + * @return true if the specified permission is the same as this one, false otherwise + */ + public abstract boolean equals(Object perm); + + /** + * This method returns this Permission as a String. + * + * @return A String representing this permission. + */ + public String toString(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CRL.java gcc-3.1/libjava/java/security/cert/CRL.java *** gcc-3.0.4/libjava/java/security/cert/CRL.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CRL.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CRLException.java gcc-3.1/libjava/java/security/cert/CRLException.java *** gcc-3.0.4/libjava/java/security/cert/CRLException.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CRLException.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/Certificate.java gcc-3.1/libjava/java/security/cert/Certificate.java *** gcc-3.0.4/libjava/java/security/cert/Certificate.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/Certificate.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CertificateEncodingException.java gcc-3.1/libjava/java/security/cert/CertificateEncodingException.java *** gcc-3.0.4/libjava/java/security/cert/CertificateEncodingException.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CertificateEncodingException.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CertificateException.java gcc-3.1/libjava/java/security/cert/CertificateException.java *** gcc-3.0.4/libjava/java/security/cert/CertificateException.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CertificateException.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CertificateExpiredException.java gcc-3.1/libjava/java/security/cert/CertificateExpiredException.java *** gcc-3.0.4/libjava/java/security/cert/CertificateExpiredException.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CertificateExpiredException.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CertificateFactory.java gcc-3.1/libjava/java/security/cert/CertificateFactory.java *** gcc-3.0.4/libjava/java/security/cert/CertificateFactory.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CertificateFactory.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CertificateFactorySpi.java gcc-3.1/libjava/java/security/cert/CertificateFactorySpi.java *** gcc-3.0.4/libjava/java/security/cert/CertificateFactorySpi.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CertificateFactorySpi.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CertificateNotYetValidException.java gcc-3.1/libjava/java/security/cert/CertificateNotYetValidException.java *** gcc-3.0.4/libjava/java/security/cert/CertificateNotYetValidException.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CertificateNotYetValidException.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/CertificateParsingException.java gcc-3.1/libjava/java/security/cert/CertificateParsingException.java *** gcc-3.0.4/libjava/java/security/cert/CertificateParsingException.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/CertificateParsingException.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/X509CRL.java gcc-3.1/libjava/java/security/cert/X509CRL.java *** gcc-3.0.4/libjava/java/security/cert/X509CRL.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/X509CRL.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/X509CRLEntry.java gcc-3.1/libjava/java/security/cert/X509CRLEntry.java *** gcc-3.0.4/libjava/java/security/cert/X509CRLEntry.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/X509CRLEntry.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/X509Certificate.java gcc-3.1/libjava/java/security/cert/X509Certificate.java *** gcc-3.0.4/libjava/java/security/cert/X509Certificate.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/X509Certificate.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; *************** public abstract class X509Certificate ex *** 288,294 **** @return the DER encoded tbsCertificate ! @throws CertificateEncodingException if encoding error occured */ public abstract byte[] getTBSCertificate() throws CertificateEncodingException; --- 299,305 ---- @return the DER encoded tbsCertificate ! @throws CertificateEncodingException if encoding error occurred */ public abstract byte[] getTBSCertificate() throws CertificateEncodingException; diff -Nrc3pad gcc-3.0.4/libjava/java/security/cert/X509Extension.java gcc-3.1/libjava/java/security/cert/X509Extension.java *** gcc-3.0.4/libjava/java/security/cert/X509Extension.java Sat Aug 19 18:19:41 2000 --- gcc-3.1/libjava/java/security/cert/X509Extension.java Tue Jan 22 22:40:33 2002 *************** along with GNU Classpath; see the file C *** 18,35 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.security.cert; import java.util.Set; /** ! Public abstract interface for the X.509 Extension. This is used for X.509 v3 Certificates and CRL v2 (Certificate Revocation Lists) for managing attributes assoicated with --- 18,46 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.cert; import java.util.Set; /** ! Public interface for the X.509 Extension. This is used for X.509 v3 Certificates and CRL v2 (Certificate Revocation Lists) for managing attributes assoicated with *************** import java.util.Set; *** 61,67 **** @since JDK 1.2 */ ! public abstract interface X509Extension { /** --- 72,78 ---- @since JDK 1.2 */ ! public interface X509Extension { /** *************** public abstract interface X509Extension *** 95,101 **** /** Returns the DER encoded OCTET string for the specified extension value identified by a OID. The OID is a string ! of number seperated by periods. Ex: 12.23.45.67 */ public byte[] getExtensionValue(String oid); --- 106,112 ---- /** Returns the DER encoded OCTET string for the specified extension value identified by a OID. The OID is a string ! of number separated by periods. Ex: 12.23.45.67 */ public byte[] getExtensionValue(String oid); diff -Nrc3pad gcc-3.0.4/libjava/java/security/classpath.security gcc-3.1/libjava/java/security/classpath.security *** gcc-3.0.4/libjava/java/security/classpath.security Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/classpath.security Thu Oct 18 00:03:48 2001 *************** *** 0 **** --- 1 ---- + security.provider.1=gnu.java.security.provider.Gnu diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/DSAKey.java gcc-3.1/libjava/java/security/interfaces/DSAKey.java *** gcc-3.0.4/libjava/java/security/interfaces/DSAKey.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/interfaces/DSAKey.java Tue Jan 22 22:40:34 2002 *************** *** 1,23 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security.interfaces; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public interface DSAKey { ! public DSAParams getParams(); } --- 1,56 ---- ! /* DSAKey.java -- Interface for Digital Signature Algorithm key ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.interfaces; /** ! * This interface is implemented by a class to return the parameters ! * of a Digital Signature Algorithm (DSA) public or private key. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface DSAKey { ! /** ! * This method returns non-secret parameters of the DSA key ! * ! * @return The DSA parameters ! */ ! public abstract DSAParams getParams(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/DSAKeyPairGenerator.java gcc-3.1/libjava/java/security/interfaces/DSAKeyPairGenerator.java *** gcc-3.0.4/libjava/java/security/interfaces/DSAKeyPairGenerator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/interfaces/DSAKeyPairGenerator.java Tue Jan 22 22:40:34 2002 *************** *** 0 **** --- 1,86 ---- + /* DSAKeyPairGenerator.java -- Initialize a DSA key generator + Copyright (C) 1998 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.interfaces; + + import java.security.SecureRandom; + import java.security.InvalidParameterException; + + /** + * This interface contains methods for intializing a Digital Signature + * Algorithm key generation engine. The initialize methods may be called + * any number of times. If no explicity initialization call is made, then + * the engine defaults to generating 1024-bit keys using pre-calculated + * base, prime, and subprime values. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface DSAKeyPairGenerator + { + /** + * Initializes the key generator with the specified DSA parameters and + * random bit source + * + * @param params The DSA parameters to use + * @param random The random bit source to use + * + * @exception InvalidParameterException If the parameters passed are not valid + */ + public abstract void initialize(DSAParams params, SecureRandom random) + throws InvalidParameterException; + + /** + * Initializes the key generator to a give modulus. If the genParams + * value is true then new base, prime, and subprime values + * will be generated for the given modulus. If not, the pre-calculated + * values will be used. If no pre-calculated values exist for the specified + * modulus, an exception will be thrown. It is guaranteed that there will + * always be pre-calculated values for all modulus values between 512 and + * 1024 bits inclusives. + * + * @param modlen The modulus length + * @param genParams true to generate new DSA parameters, false otherwise + * @param random The random bit source to use + * + * @exception InvalidParameterException If a parameter is invalid + */ + public abstract void initialize(int modlen, boolean genParams, + SecureRandom random) + throws InvalidParameterException; + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/DSAParams.java gcc-3.1/libjava/java/security/interfaces/DSAParams.java *** gcc-3.0.4/libjava/java/security/interfaces/DSAParams.java Fri Mar 10 02:43:56 2000 --- gcc-3.1/libjava/java/security/interfaces/DSAParams.java Tue Jan 22 22:40:34 2002 *************** *** 1,26 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security.interfaces; import java.math.BigInteger; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public interface DSAParams { ! public BigInteger getP(); ! public BigInteger getQ(); ! public BigInteger getG(); } --- 1,72 ---- ! /* DSAParams.java -- Digital Signature Algorithm parameter access ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.interfaces; + import java.math.BigInteger; /** ! * This interface allows the Digital Signature Algorithm (DSA) parameters ! * to be queried. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface DSAParams { ! /** ! * Returns the base, or 'g' value ! * ! * @return The DSA base value ! */ ! public abstract BigInteger getG(); ! ! /** ! * Returns the prime, or 'p' value ! * ! * @return The DSA prime value ! */ ! public abstract BigInteger getP(); ! ! /** ! * Returns the subprime, or 'q' value ! * ! * @return The DSA subprime value ! */ ! public abstract BigInteger getQ(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/DSAPrivateKey.java gcc-3.1/libjava/java/security/interfaces/DSAPrivateKey.java *** gcc-3.0.4/libjava/java/security/interfaces/DSAPrivateKey.java Thu Oct 5 23:57:16 2000 --- gcc-3.1/libjava/java/security/interfaces/DSAPrivateKey.java Tue Jan 22 22:40:34 2002 *************** *** 1,27 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security.interfaces; import java.security.PrivateKey; import java.math.BigInteger; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public interface DSAPrivateKey extends DSAKey, PrivateKey { ! public static final long serialVersionUID = 7776497482533790279L; ! public BigInteger getX(); } --- 1,56 ---- ! /* DSAPublicKey.java -- A Digital Signature Algorithm private key ! Copyright (C) 1998, 2000 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.interfaces; + import java.security.PrivateKey; import java.math.BigInteger; /** ! * This interface models a Digital Signature Algorithm (DSA) private key ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface DSAPrivateKey extends DSAKey, PrivateKey { ! /** ! * This method returns the value of the DSA private key ! */ public BigInteger getX(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/DSAPublicKey.java gcc-3.1/libjava/java/security/interfaces/DSAPublicKey.java *** gcc-3.0.4/libjava/java/security/interfaces/DSAPublicKey.java Thu Oct 5 23:57:16 2000 --- gcc-3.1/libjava/java/security/interfaces/DSAPublicKey.java Tue Jan 22 22:40:34 2002 *************** *** 1,27 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security.interfaces; import java.security.PublicKey; import java.math.BigInteger; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - public interface DSAPublicKey extends DSAKey, PublicKey { ! public static final long serialVersionUID = 1234526332779022332L; ! public BigInteger getY(); } --- 1,56 ---- ! /* DSAPublicKey.java -- A Digital Signature Algorithm public key ! Copyright (C) 1998, 2000 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.interfaces; + import java.security.PublicKey; import java.math.BigInteger; /** ! * This interface models a Digital Signature Algorithm (DSA) public key ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface DSAPublicKey extends DSAKey, PublicKey { ! /** ! * This method returns the value of the DSA public key ! */ public BigInteger getY(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/RSAKey.java gcc-3.1/libjava/java/security/interfaces/RSAKey.java *** gcc-3.0.4/libjava/java/security/interfaces/RSAKey.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/interfaces/RSAKey.java Tue Jan 22 22:40:34 2002 *************** *** 0 **** --- 1,55 ---- + /* RSAKey.java --- A generic RSA Key interface + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.interfaces; + + /** + A generic RSA Key interface for public and private keys + + @since JDK 1.3 + + @author Mark Benvenuto + */ + public interface RSAKey + { + /** + Generates a modulus. + + @returns a modulus + */ + public java.math.BigInteger getModulus(); + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/RSAPrivateCrtKey.java gcc-3.1/libjava/java/security/interfaces/RSAPrivateCrtKey.java *** gcc-3.0.4/libjava/java/security/interfaces/RSAPrivateCrtKey.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/interfaces/RSAPrivateCrtKey.java Tue Jan 22 22:40:34 2002 *************** *** 1,30 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security.interfaces; import java.math.BigInteger; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ - - // JDK1.2 public interface RSAPrivateCrtKey extends RSAPrivateKey { ! public BigInteger getPublicExponent(); ! public BigInteger getPrimeP(); ! public BigInteger getPrimeQ(); ! public BigInteger getPrimeExponentP(); ! public BigInteger getPrimeExponentQ(); ! public BigInteger getCrtCoefficient(); } --- 1,93 ---- ! /* RSAPrivateCrtKey.java -- An RSA private key in CRT format ! Copyright (C) 1998 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.interfaces; + import java.math.BigInteger; /** ! * This interface provides access to information about an RSA private ! * key in Chinese Remainder Theorem (CRT) format. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ public interface RSAPrivateCrtKey extends RSAPrivateKey { ! /** ! * Returns the public exponent for this key ! * ! * @return The public exponent for this key ! */ ! public abstract BigInteger getPublicExponent(); ! ! /** ! * Returns the primeP value ! * ! * @return The primeP value ! */ ! public abstract BigInteger getPrimeP(); ! ! /** ! * Returns the primeQ value ! * ! * @return The primeQ value ! */ ! public abstract BigInteger getPrimeQ(); ! ! /** ! * Returns the primeExponentP ! * ! * @return The primeExponentP ! */ ! public abstract BigInteger getPrimeExponentP(); ! ! /** ! * Returns the primeExponentQ ! * ! * @return The primeExponentQ ! */ ! public abstract BigInteger getPrimeExponentQ(); ! ! /** ! * Returns the CRT coefficient ! * ! * @return The CRT coefficient ! */ ! public abstract BigInteger getCrtCoefficient(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/RSAPrivateKey.java gcc-3.1/libjava/java/security/interfaces/RSAPrivateKey.java *** gcc-3.0.4/libjava/java/security/interfaces/RSAPrivateKey.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/interfaces/RSAPrivateKey.java Tue Jan 22 22:40:34 2002 *************** *** 1,27 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security.interfaces; import java.security.PrivateKey; import java.math.BigInteger; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ ! ! // JDK1.2 ! public interface RSAPrivateKey extends PrivateKey { ! public BigInteger getModulus(); ! public BigInteger getPrivateExponent(); } --- 1,58 ---- ! /* RSAPrivateKey.java -- An RSA private key ! Copyright (C) 1998, 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.interfaces; + import java.security.PrivateKey; import java.math.BigInteger; /** ! * This interface provides access to information about an RSA private key. ! * ! * @version 0.1 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public interface RSAPrivateKey extends PrivateKey, RSAKey { ! /** ! * Returns the private exponent value for this key ! * ! * @return The private exponent value for this key ! */ ! public abstract BigInteger getPrivateExponent(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/interfaces/RSAPublicKey.java gcc-3.1/libjava/java/security/interfaces/RSAPublicKey.java *** gcc-3.0.4/libjava/java/security/interfaces/RSAPublicKey.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/interfaces/RSAPublicKey.java Tue Jan 22 22:40:34 2002 *************** *** 1,27 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.security.interfaces; import java.security.PublicKey; import java.math.BigInteger; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. */ ! ! // JDK1.2 ! public interface RSAPublicKey extends PublicKey { ! public BigInteger getModulus(); ! public BigInteger getPublicExponent(); } --- 1,58 ---- ! /* RSAPublicKey.java -- An RSA public key ! Copyright (C) 1998, 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.interfaces; + import java.security.PublicKey; import java.math.BigInteger; /** ! * This interface provides access to information about an RSA public key. ! * ! * @version 0.1 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) */ ! public interface RSAPublicKey extends PublicKey, RSAKey { ! /** ! * Returns the public exponent value for this key ! * ! * @return The public exponent value for this key ! */ ! public abstract BigInteger getPublicExponent(); } diff -Nrc3pad gcc-3.0.4/libjava/java/security/libgcj.security gcc-3.1/libjava/java/security/libgcj.security *** gcc-3.0.4/libjava/java/security/libgcj.security Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/libgcj.security Thu Oct 18 00:03:48 2001 *************** *** 0 **** --- 1,2 ---- + # This properties file is used when looking for gcj-specific + # security providers. By default there are none such. diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/AlgorithmParameterSpec.java gcc-3.1/libjava/java/security/spec/AlgorithmParameterSpec.java *** gcc-3.0.4/libjava/java/security/spec/AlgorithmParameterSpec.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/spec/AlgorithmParameterSpec.java Tue Jan 22 22:40:35 2002 *************** *** 1,25 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security.spec; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. ! */ ! ! // JDK1.2 public interface AlgorithmParameterSpec { - // This interface contains no methods or constants. Its only purpose is - // to group (and provide type safety for) all key specifications. } --- 1,52 ---- ! /* AlgorithmParameterSpec.java --- Algorithm Parameter Spec Interface ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.spec; /** ! A transparent interface for Algorithm Parameter Specifications. ! It contains no member functions. It is used to group ! algorithm parameter classes. ! @since JDK 1.2 ! ! @author Mark Benvenuto ! */ public interface AlgorithmParameterSpec { } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/DSAParameterSpec.java gcc-3.1/libjava/java/security/spec/DSAParameterSpec.java *** gcc-3.0.4/libjava/java/security/spec/DSAParameterSpec.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/spec/DSAParameterSpec.java Tue Jan 22 22:40:35 2002 *************** *** 0 **** --- 1,100 ---- + /* DSAParameterSpec.java --- DSA Parameter Specificaton class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security.spec; + import java.security.interfaces.DSAParams; + import java.math.BigInteger; + + /** + DSA Parameter class Specification. Used to maintain the DSA + Parameters. + + @since JDK 1.2 + + @author Mark Benvenuto + */ + public class DSAParameterSpec extends Object implements AlgorithmParameterSpec, DSAParams + { + private BigInteger p = null; + private BigInteger q = null; + private BigInteger g = null; + + /** + Constructs a new DSAParameterSpec with the specified p, q, and g. + + @param p the prime + @param q the sub-prime + @param g the base + */ + public DSAParameterSpec(BigInteger p, BigInteger q, BigInteger g) + { + this.p = p; + this.q = q; + this.g = g; + } + /** + Returns p for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getP() + { + return this.q; + } + + /** + Returns p for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getQ() + { + return this.q; + } + + /** + Returns g for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getG() + { + return this.g; + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/DSAPrivateKeySpec.java gcc-3.1/libjava/java/security/spec/DSAPrivateKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/DSAPrivateKeySpec.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/spec/DSAPrivateKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 0 **** --- 1,113 ---- + /* DSAPrivateKeySpec.java --- DSA Private Key Specificaton class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security.spec; + import java.math.BigInteger; + + /** + DSA Private Key class Specification. Used to maintain the DSA + Private Keys. + + @since JDK 1.2 + + @author Mark Benvenuto + */ + public class DSAPrivateKeySpec extends Object implements KeySpec + { + private BigInteger x = null; + private BigInteger p = null; + private BigInteger q = null; + private BigInteger g = null; + + /** + Constructs a new DSAPrivateKeySpec with the specified x, p, q, and g. + + @param x the private key + @param p the prime + @param q the sub-prime + @param g the base + */ + public DSAPrivateKeySpec(BigInteger x, BigInteger p, BigInteger q, BigInteger g) + { + this.x = x; + this.p = p; + this.q = q; + this.g = g; + } + + /** + Returns private key x for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getX() + { + return this.x; + } + + /** + Returns p for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getP() + { + return this.q; + } + + /** + Returns p for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getQ() + { + return this.q; + } + + /** + Returns g for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getG() + { + return this.g; + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/DSAPublicKeySpec.java gcc-3.1/libjava/java/security/spec/DSAPublicKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/DSAPublicKeySpec.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/spec/DSAPublicKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 0 **** --- 1,113 ---- + /* DSAPublicKeySpec.java --- DSA Public Key Specificaton class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security.spec; + import java.math.BigInteger; + + /** + DSA Public Key class Specification. Used to maintain the DSA + Public Keys. + + @since JDK 1.2 + + @author Mark Benvenuto + */ + public class DSAPublicKeySpec extends Object implements KeySpec + { + private BigInteger y = null; + private BigInteger p = null; + private BigInteger q = null; + private BigInteger g = null; + + /** + Constructs a new DSAPublicKeySpec with the specified y, p, q, and g. + + @param y the public key + @param p the prime + @param q the sub-prime + @param g the base + */ + public DSAPublicKeySpec(BigInteger x, BigInteger p, BigInteger q, BigInteger g) + { + this.y = y; + this.p = p; + this.q = q; + this.g = g; + } + + /** + Returns public key y for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getY() + { + return this.y; + } + + /** + Returns p for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getP() + { + return this.q; + } + + /** + Returns p for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getQ() + { + return this.q; + } + + /** + Returns g for the DSA algorithm. + + @return Returns the requested BigInteger + */ + public BigInteger getG() + { + return this.g; + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/EncodedKeySpec.java gcc-3.1/libjava/java/security/spec/EncodedKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/EncodedKeySpec.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/spec/EncodedKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 0 **** --- 1,85 ---- + /* EncodedKeySpec.java --- Encoded Key Specificaton class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security.spec; + + /** + Encoded Key Specification class which is used to store + byte encoded keys. + + @since JDK 1.2 + + @author Mark Benvenuto + */ + public abstract class EncodedKeySpec implements KeySpec + { + + private byte[] encodedKey; + + /** + Constructs a new EncodedKeySpec with the specified encoded key. + + @param encodedKey A key to store + */ + public EncodedKeySpec(byte[] encodedKey) + { + this.encodedKey = encodedKey; + } + + /** + Gets the encoded key in byte format. + + @returns the encoded key + */ + public byte[] getEncoded() + { + return this.encodedKey; + } + + /** + Returns the name of the key format used. + + This name is the format such as "PKCS#8" or "X.509" which + if it matches a Key class name of the same type can be + transformed using the apporiate KeyFactory. + + @return a string representing the name + */ + public abstract String getFormat(); + + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/InvalidKeySpecException.java gcc-3.1/libjava/java/security/spec/InvalidKeySpecException.java *** gcc-3.0.4/libjava/java/security/spec/InvalidKeySpecException.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/spec/InvalidKeySpecException.java Tue Jan 22 22:40:35 2002 *************** *** 1,33 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.security.spec; import java.security.GeneralSecurityException; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. ! */ ! // JDK1.2 ! public class InvalidKeySpecException extends GeneralSecurityException { ! public InvalidKeySpecException() { super(); } public InvalidKeySpecException(String msg) { ! super(msg); } } --- 1,70 ---- ! /* InvalidKeySpecException.java --- Invalid KeySpec Exception ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.spec; import java.security.GeneralSecurityException; /** ! Exception for an invalid key specification. ! @since JDK 1.2 ! @author Mark Benvenuto ! */ ! public class InvalidKeySpecException extends GeneralSecurityException { ! ! /** ! Constructs an InvalidKeySpecException without a message string. ! */ ! public InvalidKeySpecException() { super(); } + /** + Constructs an InvalidKeySpecException with a message string. + + @param msg A message to display with exception + */ public InvalidKeySpecException(String msg) { ! super( msg ); } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/InvalidParameterSpecException.java gcc-3.1/libjava/java/security/spec/InvalidParameterSpecException.java *** gcc-3.0.4/libjava/java/security/spec/InvalidParameterSpecException.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/spec/InvalidParameterSpecException.java Tue Jan 22 22:40:35 2002 *************** *** 1,33 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.security.spec; import java.security.GeneralSecurityException; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. ! */ ! // JDK1.2 public class InvalidParameterSpecException extends GeneralSecurityException { ! public InvalidParameterSpecException() { super(); } ! public InvalidParameterSpecException(String msg) { ! super(msg); } } --- 1,70 ---- ! /* InvalidParameterSpecException.java --- Invalid ParameterSpec Exception ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.security.spec; import java.security.GeneralSecurityException; /** ! Exception for an invalid algorithm specification. ! @since JDK 1.2 ! @author Mark Benvenuto ! */ public class InvalidParameterSpecException extends GeneralSecurityException { ! ! /** ! Constructs an InvalidParameterSpecException without a message string. ! */ ! public InvalidParameterSpecException() { super(); } ! /** ! Constructs an InvalidParameterSpecException with a message string. ! ! @param msg A message to display with exception ! */ ! public InvalidParameterSpecException(String msg) { ! super( msg ); } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/KeySpec.java gcc-3.1/libjava/java/security/spec/KeySpec.java *** gcc-3.0.4/libjava/java/security/spec/KeySpec.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/spec/KeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 1,25 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security.spec; /** ! * @author Warren Levy ! * @date February 1, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Believed complete and correct. ! */ ! ! // JDK1.2 ! public interface KeySpec { - // This interface contains no methods or constants. Its only purpose is - // to group (and provide type safety for) all key specifications. } --- 1,52 ---- ! /* KeySpec.java --- Key Specification interface ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.spec; /** ! A transparent interface for Key Specifications. ! It contains no member functions. It is used to group ! key classes. ! @since JDK 1.2 ! ! @author Mark Benvenuto ! */ ! public interface KeySpec { } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/PKCS8EncodedKeySpec.java gcc-3.1/libjava/java/security/spec/PKCS8EncodedKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/PKCS8EncodedKeySpec.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/spec/PKCS8EncodedKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 0 **** --- 1,81 ---- + /* PKCS8EncodedKeySpec.java --- PKCS8 Encoded Key Specificaton class + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security.spec; + + /** + PKCS8 Encoded Key Specification class which is used to store + "PKCS#8" byte encoded keys. + + @since JDK 1.2 + + @author Mark Benvenuto + */ + public class PKCS8EncodedKeySpec extends EncodedKeySpec + { + /** + Constructs a new PKCS8EncodedKeySpec with the specified encoded key. + + @param encodedKey A key to store, assumed to be "PKCS#8" + */ + public PKCS8EncodedKeySpec(byte[] encodedKey) + { + super( encodedKey ); + } + + /** + Gets the encoded key in byte format. + + @returns the encoded key + */ + public byte[] getEncoded() + { + return super.getEncoded(); + } + + /** + Returns the name of the key format used which is "PKCS#8" + + @return a string representing the name + */ + public final String getFormat() + { + return "PKCS#8"; + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/RSAKeyGenParameterSpec.java gcc-3.1/libjava/java/security/spec/RSAKeyGenParameterSpec.java *** gcc-3.0.4/libjava/java/security/spec/RSAKeyGenParameterSpec.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/spec/RSAKeyGenParameterSpec.java Tue Jan 22 22:40:35 2002 *************** *** 0 **** --- 1,97 ---- + /* RSAKeyGenParameterSpec.java --- RSA Key Generator Parameter Spec Class + Copyright (C) 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security.spec; + import java.math.BigInteger; + + /** + This class generates a set of RSA Key parameters used in the generation + of RSA keys. + + @since JDK 1.3 + + @author Mark Benvenuto + */ + public class RSAKeyGenParameterSpec implements AlgorithmParameterSpec + { + private int keysize; + private BigInteger publicExponent; + + /** + Public Exponent F0 = 3 + */ + public static final BigInteger F0 = new BigInteger("3"); + + /** + Public Exponent F4 = 3 + */ + public static final BigInteger F4 = new BigInteger("65537"); + + /** + Create a new RSAKeyGenParameterSpec to store the RSA key's keysize + and public exponent + + @param keysize Modulus size of key in bits + @param publicExponent - the exponent + */ + public RSAKeyGenParameterSpec(int keysize, BigInteger publicExponent) + { + this.keysize = keysize; + this.publicExponent = publicExponent; + } + + /** + Return the size of the key. + + @return the size of the key. + */ + public int getKeysize() + { + return keysize; + } + + /** + Return the public exponent. + + @return the public exponent. + */ + public BigInteger getPublicExponent() + { + return publicExponent; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/RSAPrivateCrtKeySpec.java gcc-3.1/libjava/java/security/spec/RSAPrivateCrtKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/RSAPrivateCrtKeySpec.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/spec/RSAPrivateCrtKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 1,23 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security.spec; /** ! * @author Warren Levy ! * @date February 7, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Stubbed. ! */ ! ! // JDK1.2 public class RSAPrivateCrtKeySpec extends RSAPrivateKeySpec { } --- 1,151 ---- ! /* RSAPrivateCrtKeySpec.java --- RSA Private Certificate Key Specificaton class ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.spec; + import java.math.BigInteger; /** ! RSA Private Certificate Key class Specification. Used to ! maintain the RSA Private Certificate Keys with the ! Chinese Remainder Theorem(CRT) as specified by PKCS#1. ! @since JDK 1.2 ! ! @author Mark Benvenuto ! */ public class RSAPrivateCrtKeySpec extends RSAPrivateKeySpec { + private BigInteger publicExponent; + private BigInteger primeP; + private BigInteger primeQ; + private BigInteger primeExponentP; + private BigInteger primeExponentQ; + private BigInteger crtCoefficient; + + /** + Constructs a new RSAPrivateKeySpec with the specified + variables. + + @param modulus the RSA modulus + @param publicExponent the public key exponent + @param privateExponent the private key exponent + @param primeP the prime P + @param primeQ the prime Q + @param primeExponentP the prime exponent P + @param primeExponentQ the prime exponent P + @param crtCoefficient the CRT coefficient + */ + public RSAPrivateCrtKeySpec(BigInteger modulus, + BigInteger publicExponent, + BigInteger privateExponent, + BigInteger primeP, + BigInteger primeQ, + BigInteger primeExponentP, + BigInteger primeExponentQ, + BigInteger crtCoefficient) + { + super( modulus, privateExponent); + this.publicExponent = publicExponent; + this.primeP = primeP; + this.primeQ = primeQ; + this.primeExponentP = primeExponentP; + this.primeExponentQ = primeExponentQ; + this.crtCoefficient = crtCoefficient; + } + + /** + Gets the RSA public exponent. + + @return the RSA public exponent + */ + public BigInteger getPublicExponent() + { + return this.publicExponent; + } + + /** + Gets the RSA prime P. + + @return the RSA prime P + */ + public BigInteger getPrimeP() + { + return this.primeP; + } + + /** + Gets the RSA prime Q. + + @return the RSA prime Q + */ + public BigInteger getPrimeQ() + { + return this.primeQ; + } + + /** + Gets the RSA prime exponent P. + + @return the RSA prime exponent P + */ + public BigInteger getPrimeExponentP() + { + return this.primeExponentP; + } + + /** + Gets the RSA prime exponent P. + + @return the RSA prime exponent Q + */ + public BigInteger getPrimeExponentQ() + { + return this.primeExponentQ; + } + + /** + Gets the RSA CRT coefficient. + + @return the RSA CRT coefficient + */ + public BigInteger getCrtCoefficient() + { + return this.crtCoefficient; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/RSAPrivateKeySpec.java gcc-3.1/libjava/java/security/spec/RSAPrivateKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/RSAPrivateKeySpec.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/spec/RSAPrivateKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 1,23 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security.spec; /** ! * @author Warren Levy ! * @date February 7, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Stubbed. ! */ ! ! // JDK1.2 public class RSAPrivateKeySpec implements KeySpec { } --- 1,88 ---- ! /* RSAPrivateKeySpec.java --- RSA Private Key Specificaton class ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.spec; + import java.math.BigInteger; /** ! RSA Private Key class Specification. Used to maintain the RSA ! Private Keys. ! @since JDK 1.2 ! ! @author Mark Benvenuto ! */ public class RSAPrivateKeySpec implements KeySpec { + private BigInteger modulus; + private BigInteger privateExponent; + + /** + Constructs a new RSAPrivateKeySpec with the specified + modulus and privateExponent. + + @param modulus the RSA modulus + @param privateExponent the private key exponent + */ + public RSAPrivateKeySpec(BigInteger modulus, BigInteger privateExponent) + { + this.modulus = modulus; + this.privateExponent = privateExponent; + } + + /** + Gets the RSA modulus. + + @return the RSA modulus + */ + public BigInteger getModulus() + { + return this.modulus; + } + + /** + Gets the RSA private exponent. + + @return the RSA private exponent + */ + public BigInteger getPrivateExponent() + { + return this.privateExponent; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/RSAPublicKeySpec.java gcc-3.1/libjava/java/security/spec/RSAPublicKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/RSAPublicKeySpec.java Fri Mar 10 02:43:57 2000 --- gcc-3.1/libjava/java/security/spec/RSAPublicKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 1,23 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.security.spec; /** ! * @author Warren Levy ! * @date February 10, 2000. ! */ ! /* Written using on-line Java Platform 1.2 API Specification. ! * Status: Stubbed. ! */ ! ! // JDK1.2 public class RSAPublicKeySpec implements KeySpec { } --- 1,88 ---- ! /* RSAPublicKeySpec.java --- RSA Public Key Specificaton class ! Copyright (C) 1999 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.security.spec; + import java.math.BigInteger; /** ! RSA Public Key class Specification. Used to maintain the RSA ! Public Keys. ! @since JDK 1.2 ! ! @author Mark Benvenuto ! */ public class RSAPublicKeySpec implements KeySpec { + private BigInteger modulus; + private BigInteger publicExponent; + + /** + Constructs a new RSAPublicKeySpec with the specified + modulus and publicExponent. + + @param modulus the RSA modulus + @param publicExponent the public key exponent + */ + public RSAPublicKeySpec(BigInteger modulus, BigInteger publicExponent) + { + this.modulus = modulus; + this.publicExponent = publicExponent; + } + + /** + Gets the RSA modulus. + + @return the RSA modulus + */ + public BigInteger getModulus() + { + return this.modulus; + } + + /** + Gets the RSA public exponent. + + @return the RSA public exponent + */ + public BigInteger getPublicExponent() + { + return this.publicExponent; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/security/spec/X509EncodedKeySpec.java gcc-3.1/libjava/java/security/spec/X509EncodedKeySpec.java *** gcc-3.0.4/libjava/java/security/spec/X509EncodedKeySpec.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/security/spec/X509EncodedKeySpec.java Tue Jan 22 22:40:35 2002 *************** *** 0 **** --- 1,82 ---- + /* X509EncodedKeySpec.java --- X.509 Encoded Key Specificaton class + Copyright (C) 1999, 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.security.spec; + + /** + X.509 Encoded Key Specification class which is used to store + "X.509" byte encoded keys. + + @since JDK 1.2 + + @author Mark Benvenuto + */ + public class X509EncodedKeySpec extends EncodedKeySpec + { + + /** + Constructs a new X509EncodedKeySpec with the specified encoded key. + + @param encodedKey A key to store, assumed to be "X.509" + */ + public X509EncodedKeySpec(byte[] encodedKey) + { + super( encodedKey ); + } + + /** + Gets the encoded key in byte format. + + @returns the encoded key + */ + public byte[] getEncoded() + { + return super.getEncoded(); + } + + /** + Returns the name of the key format used which is "X.509" + + @return a string representing the name + */ + public final String getFormat() + { + return "X.509"; + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Array.java gcc-3.1/libjava/java/sql/Array.java *** gcc-3.0.4/libjava/java/sql/Array.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Array.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/BatchUpdateException.java gcc-3.1/libjava/java/sql/BatchUpdateException.java *** gcc-3.0.4/libjava/java/sql/BatchUpdateException.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/BatchUpdateException.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Blob.java gcc-3.1/libjava/java/sql/Blob.java *** gcc-3.0.4/libjava/java/sql/Blob.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Blob.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/CallableStatement.java gcc-3.1/libjava/java/sql/CallableStatement.java *** gcc-3.0.4/libjava/java/sql/CallableStatement.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/CallableStatement.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Clob.java gcc-3.1/libjava/java/sql/Clob.java *** gcc-3.0.4/libjava/java/sql/Clob.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Clob.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Connection.java gcc-3.1/libjava/java/sql/Connection.java *** gcc-3.0.4/libjava/java/sql/Connection.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Connection.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/DataTruncation.java gcc-3.1/libjava/java/sql/DataTruncation.java *** gcc-3.0.4/libjava/java/sql/DataTruncation.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/DataTruncation.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/DatabaseMetaData.java gcc-3.1/libjava/java/sql/DatabaseMetaData.java *** gcc-3.0.4/libjava/java/sql/DatabaseMetaData.java Sat Jan 6 23:28:40 2001 --- gcc-3.1/libjava/java/sql/DatabaseMetaData.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; *************** public static final int bestRowUnknown = *** 47,53 **** public static final int bestRowNotPseudo = 1; /** ! * The best row identifer is a pseudo-column. */ public static final int bestRowPseudo = 2; --- 58,64 ---- public static final int bestRowNotPseudo = 1; /** ! * The best row identifier is a pseudo-column. */ public static final int bestRowPseudo = 2; *************** public static final int bestRowPseudo = *** 58,69 **** public static final int bestRowTemporary = 0; /** ! * The best row identifer is valid to the end of the transaction. */ public static final int bestRowTransaction = 1; /** ! * The best row identifer is valid to the end of the session. */ public static final int bestRowSession = 2; --- 69,80 ---- public static final int bestRowTemporary = 0; /** ! * The best row identifier is valid to the end of the transaction. */ public static final int bestRowTransaction = 1; /** ! * The best row identifier is valid to the end of the session. */ public static final int bestRowSession = 2; *************** supportsBatchUpdates() throws SQLExcepti *** 2696,2702 **** *

  • TYPE_SCEHM - The schema name, which may be null. *
  • TYPE_NAME - The user defined data type name. *
  • CLASS_NAME - The Java class name this type maps to. ! *
  • DATA_TYPE - A type identifer from Types for this type. * This will be one of JAVA_OBJECT, STRUCT, or * DISTINCT. *
  • REMARKS - Comments about this data type. --- 2707,2713 ---- *
  • TYPE_SCEHM - The schema name, which may be null. *
  • TYPE_NAME - The user defined data type name. *
  • CLASS_NAME - The Java class name this type maps to. ! *
  • DATA_TYPE - A type identifier from Types for this type. * This will be one of JAVA_OBJECT, STRUCT, or * DISTINCT. *
  • REMARKS - Comments about this data type. *************** supportsBatchUpdates() throws SQLExcepti *** 2708,2714 **** * @param schema The schema to retrieve information from, or the empty string * to return entities not associated with a schema. * @param typePattern The type name pattern to match. ! * @param types The type identifer patterns (from Types) to * match. * * @return A ResultSet with the requested type information --- 2719,2725 ---- * @param schema The schema to retrieve information from, or the empty string * to return entities not associated with a schema. * @param typePattern The type name pattern to match. ! * @param types The type identifier patterns (from Types) to * match. * * @return A ResultSet with the requested type information diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Date.java gcc-3.1/libjava/java/sql/Date.java *** gcc-3.0.4/libjava/java/sql/Date.java Tue Oct 10 23:09:07 2000 --- gcc-3.1/libjava/java/sql/Date.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Driver.java gcc-3.1/libjava/java/sql/Driver.java *** gcc-3.0.4/libjava/java/sql/Driver.java Tue Apr 11 09:21:53 2000 --- gcc-3.1/libjava/java/sql/Driver.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/DriverManager.java gcc-3.1/libjava/java/sql/DriverManager.java *** gcc-3.0.4/libjava/java/sql/DriverManager.java Thu Dec 28 22:21:36 2000 --- gcc-3.1/libjava/java/sql/DriverManager.java Tue Jan 22 22:40:36 2002 *************** *** 1,5 **** /* DriverManager.java -- Manage JDBC drivers ! Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* DriverManager.java -- Manage JDBC drivers ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; *************** getDrivers() *** 264,271 **** while(e.hasMoreElements()) { Object obj = e.nextElement(); ! if (!obj.getClass().getClassLoader().equals(cl)) ! continue; v.addElement(obj); } --- 275,287 ---- while(e.hasMoreElements()) { Object obj = e.nextElement(); ! ! ClassLoader loader = obj.getClass().getClassLoader(); ! ! if (loader == null) ! loader = ClassLoader.getSystemClassLoader(); ! if (!loader.equals(cl)) ! continue; v.addElement(obj); } diff -Nrc3pad gcc-3.0.4/libjava/java/sql/DriverPropertyInfo.java gcc-3.1/libjava/java/sql/DriverPropertyInfo.java *** gcc-3.0.4/libjava/java/sql/DriverPropertyInfo.java Tue Apr 11 09:21:53 2000 --- gcc-3.1/libjava/java/sql/DriverPropertyInfo.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/PreparedStatement.java gcc-3.1/libjava/java/sql/PreparedStatement.java *** gcc-3.0.4/libjava/java/sql/PreparedStatement.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/PreparedStatement.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Ref.java gcc-3.1/libjava/java/sql/Ref.java *** gcc-3.0.4/libjava/java/sql/Ref.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Ref.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/ResultSet.java gcc-3.1/libjava/java/sql/ResultSet.java *** gcc-3.0.4/libjava/java/sql/ResultSet.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/ResultSet.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/ResultSetMetaData.java gcc-3.1/libjava/java/sql/ResultSetMetaData.java *** gcc-3.0.4/libjava/java/sql/ResultSetMetaData.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/ResultSetMetaData.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/SQLData.java gcc-3.1/libjava/java/sql/SQLData.java *** gcc-3.0.4/libjava/java/sql/SQLData.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/SQLData.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/SQLException.java gcc-3.1/libjava/java/sql/SQLException.java *** gcc-3.0.4/libjava/java/sql/SQLException.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/SQLException.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/SQLInput.java gcc-3.1/libjava/java/sql/SQLInput.java *** gcc-3.0.4/libjava/java/sql/SQLInput.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/SQLInput.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/SQLOutput.java gcc-3.1/libjava/java/sql/SQLOutput.java *** gcc-3.0.4/libjava/java/sql/SQLOutput.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/SQLOutput.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/SQLWarning.java gcc-3.1/libjava/java/sql/SQLWarning.java *** gcc-3.0.4/libjava/java/sql/SQLWarning.java Wed Dec 27 01:58:23 2000 --- gcc-3.1/libjava/java/sql/SQLWarning.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Statement.java gcc-3.1/libjava/java/sql/Statement.java *** gcc-3.0.4/libjava/java/sql/Statement.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Statement.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Struct.java gcc-3.1/libjava/java/sql/Struct.java *** gcc-3.0.4/libjava/java/sql/Struct.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Struct.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Time.java gcc-3.1/libjava/java/sql/Time.java *** gcc-3.0.4/libjava/java/sql/Time.java Tue Oct 10 23:09:07 2000 --- gcc-3.1/libjava/java/sql/Time.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Timestamp.java gcc-3.1/libjava/java/sql/Timestamp.java *** gcc-3.0.4/libjava/java/sql/Timestamp.java Tue Oct 10 23:09:07 2000 --- gcc-3.1/libjava/java/sql/Timestamp.java Tue Jan 22 22:40:36 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; diff -Nrc3pad gcc-3.0.4/libjava/java/sql/Types.java gcc-3.1/libjava/java/sql/Types.java *** gcc-3.0.4/libjava/java/sql/Types.java Fri Dec 1 01:48:34 2000 --- gcc-3.1/libjava/java/sql/Types.java Tue Jan 22 22:40:36 2002 *************** *** 1,5 **** /* Types.java -- SQL type constants ! Copyright (C) 1999 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Types.java -- SQL type constants ! Copyright (C) 1999, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.sql; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.sql; *************** public static final int BLOB = 2004; *** 67,71 **** --- 78,87 ---- public static final int CLOB = 2005; public static final int REF = 2006; + // This class can't be instantiated. + private Types () + { + } + } // class Types diff -Nrc3pad gcc-3.0.4/libjava/java/text/Annotation.java gcc-3.1/libjava/java/text/Annotation.java *** gcc-3.0.4/libjava/java/text/Annotation.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/text/Annotation.java Tue Jan 22 22:40:37 2002 *************** *** 0 **** --- 1,113 ---- + /* Annotation.java -- Wrapper for a text attribute object + Copyright (C) 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.text; + + /** + * This class is used as a wrapper for a text attribute object. Annotation + * objects are associated with a specific range of text. Changing either + * the text range or the underlying text invalidates the object. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class Annotation + { + + /* + * Instance Variables + */ + + /** + * This is the attribute object being wrappered + */ + private Object attrib; + + /*************************************************************************/ + + /** + * Constructors + */ + + /** + * This method initializes a new instance of Annotation to + * wrapper the specified text attribute object. + * + * @param attrib The text attribute Object to wrapper. + */ + public + Annotation(Object attrib) + { + this.attrib = attrib; + } + + /*************************************************************************/ + + /* + * Instance Variables + */ + + /** + * This method returns the text attribute object this Annotation + * instance is wrappering. + * + * @return The text attribute object for this Annotation. + */ + public Object + getValue() + { + return(attrib); + } + + /*************************************************************************/ + + /** + * This method returns a String representation of this + * object. + * + * @return This object as a String. + */ + public String + toString() + { + return(getClass().getName() + "[value=" + attrib.toString() + "]"); + } + + } // class Annotation + diff -Nrc3pad gcc-3.0.4/libjava/java/text/AttributedCharacterIterator.java gcc-3.1/libjava/java/text/AttributedCharacterIterator.java *** gcc-3.0.4/libjava/java/text/AttributedCharacterIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/text/AttributedCharacterIterator.java Tue Jan 22 22:40:37 2002 *************** *** 0 **** --- 1,344 ---- + /* AttributedCharacterIterator.java -- Iterate over attributes + Copyright (C) 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.text; + + import java.io.Serializable; + import java.io.InvalidObjectException; + import java.util.Set; + import java.util.Map; + + /** + * This interface extends the CharacterIterator interface + * in order to support iteration over character attributes as well as + * over the characters themselves. + *

    + * In addition to attributes of specific characters, this interface + * supports the concept of the "attribute run", which is an attribute + * that is defined for a particular value across an entire range of + * characters or which is undefined over a range of characters. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public interface AttributedCharacterIterator extends CharacterIterator + { + + /* + * Inner Classes + */ + + /** + * This class defines attribute keys that are used as text attributes. + */ + public static class Attribute implements Serializable + { + + /*************************************************************************/ + + /* + * Static Variables + */ + + /** + * This is the attribute for the language of the text. The value of + * attributes of this key type are instances of Locale. + */ + public static final Attribute LANGUAGE = new Attribute("LANGUAGE"); + + /** + * This is the attribute for the reading form of text. This is used + * for storing pronunciation along with the written text for languages + * which need it. The value of attributes of this key type are + * instances of Annotation which wrappers a String. + */ + public static final Attribute READING = new Attribute("READING"); + + /** + * This is the attribute for input method segments. The value of attributes + * of this key type are instances of Annotation which wrapper + * a String. + */ + public static final Attribute INPUT_METHOD_SEGMENT = + new Attribute("INPUT_METHOD_SEGMENT"); + + /*************************************************************************/ + + /* + * Instance Variables + */ + + /** + * This is the name of the attribute key + * @serial + */ + private String name; + + /*************************************************************************/ + + /* + * Constructors + */ + + /** + * This method initializes a new instance of this class with the specified + * name. + * + * @param name The name of this attribute key. + */ + protected + Attribute(String name) + { + this.name = name; + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * This method returns the name of this attribute. + * + * @return The attribute name + */ + protected String + getName() + { + return(name); + } + + /*************************************************************************/ + + /** + * This method resolves an instance of AttributedCharacterIterator.Attribute + * that is being deserialized to one of the three pre-defined attribute + * constants. It does this by comparing the names of the attributes. The + * constant that the deserialized object resolves to is returned. + * + * @return The resolved contant value + * + * @exception InvalidObjectException If the object being deserialized cannot be resolved. + */ + protected Object + readResolve() throws InvalidObjectException + { + if (this.equals(READING)) + return(READING); + + if (this.equals(LANGUAGE)) + return(LANGUAGE); + + if (this.equals(INPUT_METHOD_SEGMENT)) + return(INPUT_METHOD_SEGMENT); + + throw new InvalidObjectException("Can't resolve Attribute: " + getName()); + } + + /*************************************************************************/ + + /** + * This method tests this object for equality against the specified object. + * The two objects will be considered equal if and only if: + *

      + *
    • The specified object is not null. + *
    • The specified object is an instance of AttributedCharacterIterator.Attribute. + *
    • The specified object has the same attribute name as this object. + *
    + * + * @param The Object to test for equality against this object. + * + * @return true if the specified object is equal to this one, false otherwise. + */ + public final boolean + equals(Object obj) + { + if (obj == this) + return(true); + else + return(false); + } + + /*************************************************************************/ + + /** + * This method returns a hash value for this object. + * + * @return A hash value for this object. + */ + public final int + hashCode() + { + return(super.hashCode()); + } + + /*************************************************************************/ + + /** + * This method returns a String representation of this object. + * + * @return A String representation of this object. + */ + public String + toString() + { + return(getClass().getName() + "(" + getName() + ")"); + } + + } // Inner class Attribute + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * This method returns a list of all keys that are defined for the + * text range. This can be an empty list if no attributes are defined. + * + * @return A list of keys + */ + public abstract Set + getAllAttributeKeys(); + + /*************************************************************************/ + + /** + * This method returns a Map of the attributed defined for + * the current character. + * + * @return A Map of the attributes for the current character. + */ + public abstract Map + getAttributes(); + + /*************************************************************************/ + + /** + * This method returns the value of the specified attribute for the + * current character. If the attribute is not defined for the current + * character, null is returned. + * + * @param attrib The attribute to retrieve the value of. + * + * @return The value of the specified attribute + */ + public abstract Object + getAttribute(AttributedCharacterIterator.Attribute attrib); + + /*************************************************************************/ + + /** + * This method returns the index of the first character in the run that + * contains all attributes defined for the current character. + * + * @return The start index of the run + */ + public abstract int + getRunStart(); + + /*************************************************************************/ + + /** + * This method returns the index of the first character in the run that + * contains all attributes in the specified Set defined for + * the current character. + * + * @param attribs The Set of attributes. + * + * @return The start index of the run. + */ + public abstract int + getRunStart(Set attribs); + + /*************************************************************************/ + + /** + * This method returns the index of the first character in the run that + * contains the specified attribute defined for the current character. + * + * @param attrib The attribute. + * + * @return The start index of the run. + */ + public abstract int + getRunStart(AttributedCharacterIterator.Attribute attrib); + + /*************************************************************************/ + + /** + * This method returns the index of the character after the end of the run + * that contains all attributed defined for the current character. + * + * @return The end index of the run. + */ + public abstract int + getRunLimit(); + + /*************************************************************************/ + + /** + * This method returns the index of the character after the end of the run + * that contains all attributes in the specified Set defined + * for the current character. + * + * @param attribs The Set of attributes. + * + * @return The end index of the run. + */ + public abstract int + getRunLimit(Set attribs); + + /*************************************************************************/ + + /** + * This methods returns the index of the character after the end of the run + * that contains the specified attribute defined for the current character. + * + * @param attrib The attribute. + * + * @return The end index of the run. + */ + public abstract int + getRunLimit(AttributedCharacterIterator.Attribute attrib); + + } // interface AttributedCharacterIterator + diff -Nrc3pad gcc-3.0.4/libjava/java/text/AttributedString.java gcc-3.1/libjava/java/text/AttributedString.java *** gcc-3.0.4/libjava/java/text/AttributedString.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/text/AttributedString.java Tue Jan 22 22:40:37 2002 *************** *** 0 **** --- 1,442 ---- + /* AttributedString.java -- Models text with attributes + Copyright (C) 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.text; + + import java.util.Iterator; + import java.util.Hashtable; + import java.util.HashSet; + import java.util.Map; + import java.util.Set; + + /** + * This class models a String with attributes over various + * subranges of the string. It allows applications to access this + * information via the AttributedCharcterIterator interface. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + public class AttributedString + { + + /*************************************************************************/ + + /* + * Inner Classes + */ + + /** + * This class contains the attributes and ranges of text over which + * that attributes apply. + */ + final class AttributeRange + { + + /* + * Instance Variables + */ + + /** + * A Map of the attributes + */ + Map attribs; + + /** + * The beginning index of the attributes + */ + int begin_index; + + /** + * The ending index of the attributes + */ + int end_index; + + /*************************************************************************/ + + /* + * Constructors + */ + + AttributeRange(Map attribs, int begin_index, int end_index) + { + this.attribs = attribs; + this.begin_index = begin_index; + this.end_index = end_index; + } + + } // Inner class AttributeRange + + /*************************************************************************/ + + /* + * Instance Variables + */ + + /** + * This object holds the string we are representing. + */ + private StringCharacterIterator sci; + + /** + * This is the attribute information + */ + private AttributeRange[] attribs; + + /*************************************************************************/ + + /* + * Constructors + */ + + /** + * This method initializes a new instance of AttributedString + * that represents the specified String with no attributes. + * + * @param str The String to be attributed. + */ + public + AttributedString(String str) + { + sci = new StringCharacterIterator(str); + attribs = new AttributeRange[0]; + } + + /*************************************************************************/ + + /** + * This method initializes a new instance of AttributedString + * that represents that specified String with the specified + * attributes over the entire length of the String. + * + * @param str The String to be attributed. + * @param attributes The attribute list. + */ + public + AttributedString(String str, Map attributes) + { + this(str); + + attribs = new AttributeRange[1]; + attribs[0] = new AttributeRange(attributes, 0, str.length()); + } + + /*************************************************************************/ + + /** + * This method initializes a new instance of AttributedString + * that will use the text and attribute information from the specified + * AttributedCharacterIterator. + * + * @param aci The AttributedCharacterIterator containing the text and attribute information. + */ + public + AttributedString(AttributedCharacterIterator aci) + { + this(aci, aci.getBeginIndex(), aci.getEndIndex(), null); + } + + /*************************************************************************/ + + /** + * This method initializes a new instance of AttributedString + * that will use the text and attribute information from the specified + * subrange of the specified AttributedCharacterIterator. + * + * @param aci The AttributedCharacterIterator containing the text and attribute information. + * @param begin_index The beginning index of the text subrange. + * @param end_index The ending index of the text subrange. + */ + public + AttributedString(AttributedCharacterIterator aci, int begin_index, + int end_index) + { + this(aci, begin_index, end_index, null); + } + + /*************************************************************************/ + + /** + * This method initializes a new instance of AttributedString + * that will use the text and attribute information from the specified + * subrange of the specified AttributedCharacterIterator. + * Only attributes from the source iterator that are present in the + * specified array of attributes will be included in the attribute list + * for this object. + * + * @param aci The AttributedCharacterIterator containing the text and attribute information. + * @param begin_index The beginning index of the text subrange. + * @param end_index The ending index of the text subrange. + * @param attributes A list of attributes to include from the iterator, or null to include all attributes. + */ + public + AttributedString(AttributedCharacterIterator aci, int begin_index, + int end_index, AttributedCharacterIterator.Attribute[] attributes) + { + // Validate some arguments + if ((begin_index < 0) || (end_index < begin_index)) + throw new IllegalArgumentException("Bad index values"); + + StringBuffer sb = new StringBuffer(""); + + // Get the valid attribute list + Set all_attribs = aci.getAllAttributeKeys(); + if (attributes != null) + { + Set valid_attribs = new HashSet(); + Iterator iter = all_attribs.iterator(); + while (iter.hasNext()) + { + Object obj = iter.next(); + + int i; + for (i = 0; i < attributes.length; i++) + if (obj.equals(attributes[0])) + break; + + if (i == attributes.length) + continue; + + valid_attribs.add(obj); + } + + all_attribs = valid_attribs; + } + + // Loop through and extract the attributes + char c = aci.setIndex(begin_index); + + do + { + sb.append(c); + + Iterator iter = all_attribs.iterator(); + while(iter.hasNext()) + { + Object obj = iter.next(); + + // What should we do if this is not true? + if (!(obj instanceof AttributedCharacterIterator.Attribute)) + continue; + + AttributedCharacterIterator.Attribute attrib = + (AttributedCharacterIterator.Attribute)obj; + + // Make sure the attribute is defined. + int rl = aci.getRunLimit(attrib); + if (rl == -1) + continue; + if (rl > end_index) + rl = end_index; + rl -= begin_index; + + // Check to see if we already processed this one + int rs = aci.getRunStart(attrib); + if ((rs < aci.getIndex()) && (aci.getIndex() != begin_index)) + continue; + + // If the attribute run starts before the beginning index, we + // need to junk it if it is an Annotation. + Object attrib_obj = aci.getAttribute(attrib); + if (rs < begin_index) + { + if (attrib_obj instanceof Annotation) + continue; + + rs = begin_index; + } + else + { + rs -= begin_index; + } + + // Create a map object. Yes this will only contain one attribute + Map new_map = new Hashtable(); + new_map.put(attrib, attrib_obj); + + // Add it to the attribute list. Yes this is a bad way to do things. + AttributeRange[] new_list = new AttributeRange[attribs.length + 1]; + System.arraycopy(attribs, 0, new_list, 0, attribs.length); + attribs = new_list; + attribs[attribs.length - 1] = new AttributeRange(new_map, rs, rl); + } + + c = aci.next(); + } + while(c != CharacterIterator.DONE); + + sci = new StringCharacterIterator(sb.toString()); + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + /** + * This method adds a new attribute that will cover the entire string. + * + * @param attrib The attribute to add. + * @param value The value of the attribute. + */ + public void + addAttribute(AttributedCharacterIterator.Attribute attrib, Object value) + { + addAttribute(attrib, value, 0, sci.getEndIndex() - 1); + } + + /*************************************************************************/ + + /** + * This method adds a new attribute that will cover the specified subrange + * of the string. + * + * @param attrib The attribute to add. + * @param value The value of the attribute. + * @param begin_index The beginning index of the subrange. + * @param end_index The ending index of the subrange. + * + * @exception IllegalArgumentException If attribute is null or the subrange is not valid. + */ + public void + addAttribute(AttributedCharacterIterator.Attribute attrib, Object value, + int begin_index, int end_index) + { + if (attrib == null) + throw new IllegalArgumentException("null attribute"); + + Hashtable ht = new Hashtable(); + ht.put(attrib, value); + + addAttributes(ht, begin_index, end_index); + } + + /*************************************************************************/ + + /** + * This method adds all of the attributes in the specified list to the + * specified subrange of the string. + * + * @param attributes The list of attributes. + * @param begin_index The beginning index. + * @param end_index The ending index + * + * @param IllegalArgumentException If the list is null or the subrange is not valid. + */ + public void + addAttributes(Map attributes, int begin_index, int end_index) + { + if (attributes == null) + throw new IllegalArgumentException("null attribute"); + + if ((begin_index < 0) || (end_index > sci.getEndIndex()) || + (end_index < begin_index)) + throw new IllegalArgumentException("bad range"); + + AttributeRange[] new_list = new AttributeRange[attribs.length + 1]; + System.arraycopy(attribs, 0, new_list, 0, attribs.length); + attribs = new_list; + attribs[attribs.length - 1] = new AttributeRange(attributes, begin_index, + end_index); + } + + /*************************************************************************/ + + /** + * This method returns an AttributedCharacterIterator that + * will iterate over the entire string. + * + * @return An AttributedCharacterIterator for the entire string. + */ + public AttributedCharacterIterator + getIterator() + { + return(new AttributedStringIterator(sci, attribs, 0, sci.getEndIndex() - 1, + null)); + } + + /*************************************************************************/ + + /** + * This method returns an AttributedCharacterIterator that + * will iterate over the entire string. This iterator will return information + * about the list of attributes in the specified array. Attributes not in + * the array may or may not be returned by the iterator. If the specified + * array is null, all attributes will be returned. + * + * @param attributes A list of attributes to include in the returned iterator. + * + * @return An AttributedCharacterIterator for this string. + */ + public AttributedCharacterIterator + getIterator(AttributedCharacterIterator.Attribute[] attributes) + { + return(getIterator(attributes, 0, sci.getEndIndex() - 1)); + } + + /*************************************************************************/ + + /** + * This method returns an AttributedCharacterIterator that + * will iterate over the specified subrange. This iterator will return information + * about the list of attributes in the specified array. Attributes not in + * the array may or may not be returned by the iterator. If the specified + * array is null, all attributes will be returned. + * + * @param attributes A list of attributes to include in the returned iterator. + * @param begin_index The beginning index of the subrange. + * @param end_index The ending index of the subrange. + * + * @return An AttributedCharacterIterator for this string. + */ + public AttributedCharacterIterator + getIterator(AttributedCharacterIterator.Attribute[] attributes, + int begin_index, int end_index) + { + if ((begin_index < 0) || (end_index > sci.getEndIndex()) || + (end_index < begin_index)) + throw new IllegalArgumentException("bad range"); + + return(new AttributedStringIterator(sci, attribs, begin_index, end_index, + attributes)); + } + + } // class AttributedString + diff -Nrc3pad gcc-3.0.4/libjava/java/text/AttributedStringIterator.java gcc-3.1/libjava/java/text/AttributedStringIterator.java *** gcc-3.0.4/libjava/java/text/AttributedStringIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/text/AttributedStringIterator.java Tue Jan 22 22:40:37 2002 *************** *** 0 **** --- 1,362 ---- + /* AttributedStringIterator.java -- Class to iterate over AttributedString + Copyright (C) 1998, 1999 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.text; + + import java.util.Set; + import java.util.HashSet; + import java.util.Map; + import java.util.HashMap; + import java.util.Iterator; + + /** + * This class implements the AttributedCharacterIterator interface. It + * is used by AttributedString.getIterator(). + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ + class AttributedStringIterator implements AttributedCharacterIterator + { + + /*************************************************************************/ + + /** + * Instance Variables + */ + + /** + * The character iterator containing the text + */ + private CharacterIterator ci; + + /** + * The list of attributes and ranges + */ + private AttributedString.AttributeRange[] attribs; + + /** + * The list of attributes that the user is interested in. We may, + * at our option, not return any other attributes. + */ + private AttributedCharacterIterator.Attribute[] restricts; + + /*************************************************************************/ + + /* + * Constructors + */ + + AttributedStringIterator(StringCharacterIterator sci, + AttributedString.AttributeRange[] attribs, + int begin_index, int end_index, + AttributedCharacterIterator.Attribute[] restricts) + { + this.ci = new StringCharacterIterator(sci, begin_index, end_index); + this.attribs = attribs; + this.restricts = restricts; + } + + /*************************************************************************/ + + /* + * Instance Methods + */ + + // First we have a bunch of stupid redirects. If StringCharacterIterator + // weren't final, I just would have extended that for this class. Alas, no. + + public Object + clone() + { + return(ci.clone()); + } + + public char + current() + { + return(ci.current()); + } + + public char + next() + { + return(ci.next()); + } + + public char + previous() + { + return(ci.previous()); + } + + public char + first() + { + return(ci.first()); + } + + public char + last() + { + return(ci.last()); + } + + public int + getIndex() + { + return(ci.getIndex()); + } + + public char + setIndex(int index) + { + return(ci.setIndex(index)); + } + + public int + getBeginIndex() + { + return(ci.getBeginIndex()); + } + + public int + getEndIndex() + { + return(ci.getEndIndex()); + } + + /* + * Here is where the AttributedCharacterIterator methods start. + */ + + /*************************************************************************/ + + /** + * Returns a list of all the attribute keys that are defined anywhere + * on this string. + */ + public Set + getAllAttributeKeys() + { + HashSet s = new HashSet(); + if (attribs == null) + return(s); + + for (int i = 0; i < attribs.length; i++) + { + Set key_set = attribs[i].attribs.keySet(); + Iterator iter = key_set.iterator(); + while (iter.hasNext()) + { + s.add(iter.next()); + } + } + + return(s); + } + + /*************************************************************************/ + + /** + * Various methods that determine how far the run extends for various + * attribute combinations. + */ + + public int + getRunLimit() + { + return(getRunLimit(getAttributes().keySet())); + } + + public int + getRunLimit(AttributedCharacterIterator.Attribute attrib) + { + HashSet s = new HashSet(); + s.add(attrib); + + return(getRunLimit(s)); + } + + public synchronized int + getRunLimit(Set attribute_set) + { + int orig_index = ci.getIndex(); + int run_limit; + + do + { + run_limit = ci.getIndex(); + + Map attribute_map = getAttributes(); + + boolean found = false; + Iterator iter = attribute_set.iterator(); + while(iter.hasNext()) + if (!attribute_map.containsKey(iter.next())) + { + found = true; + break; + } + + if (found) + break; + } + while (ci.next() != CharacterIterator.DONE); + + boolean hit_end = (ci.previous() == CharacterIterator.DONE); + + ci.setIndex(orig_index); + + if (run_limit == orig_index) + return(-1); // No characters match the given attributes + // else if (!hit_end) + // --run_limit; + + return(run_limit); + } + + /*************************************************************************/ + + /** + * Various methods that determine where the run begins for various + * attribute combinations. + */ + + public int + getRunStart() + { + return(getRunStart(getAttributes().keySet())); + } + + public int + getRunStart(AttributedCharacterIterator.Attribute attrib) + { + HashSet s = new HashSet(); + s.add(attrib); + + return(getRunStart(s)); + } + + public int + getRunStart(Set attribute_set) + { + int orig_index = ci.getIndex(); + int run_start; + + do + { + run_start = ci.getIndex(); + + Map attribute_map = getAttributes(); + + Iterator iter = attribute_set.iterator(); + while(iter.hasNext()) + if (!attribute_map.containsKey(iter.next())) + break; + + if (iter.hasNext()) + break; + } + while (ci.previous() != CharacterIterator.DONE); + + boolean hit_beginning = (ci.previous() == CharacterIterator.DONE); + + ci.setIndex(orig_index); + + if (run_start == orig_index) + return(-1); // No characters match the given attributes + else if (!hit_beginning) + ++run_start; + + return(run_start); + } + + /*************************************************************************/ + + public Object + getAttribute(AttributedCharacterIterator.Attribute attrib) + { + if (attribs == null) + return(null); + + for (int i = 0; i < attribs.length; i++) + { + Set key_set = attribs[i].attribs.keySet(); + Iterator iter = key_set.iterator(); + while (iter.hasNext()) + { + Object obj = iter.next(); + + // Check for attribute match and range match + if (obj.equals(attrib)) + if ((ci.getIndex() >= attribs[i].begin_index) && + (ci.getIndex() <= attribs[i].end_index)) + return(attribs[i].attribs.get(obj)); + } + } + + return(null); + } + + /*************************************************************************/ + + /** + * Return a list of all the attributes and values defined for this + * character + */ + public Map + getAttributes() + { + HashMap m = new HashMap(); + if (attribs == null) + return(m); + + for (int i = 0; i < attribs.length; i++) + { + if ((ci.getIndex() >= attribs[i].begin_index) && + (ci.getIndex() <= attribs[i].end_index)) + m.putAll(attribs[i].attribs); + } + + return(m); + } + + } // class AttributedStringIterator + diff -Nrc3pad gcc-3.0.4/libjava/java/text/BreakIterator.java gcc-3.1/libjava/java/text/BreakIterator.java *** gcc-3.0.4/libjava/java/text/BreakIterator.java Fri Sep 8 19:37:09 2000 --- gcc-3.1/libjava/java/text/BreakIterator.java Tue Jan 22 22:40:37 2002 *************** *** 1,12 **** ! // BreakIterator.java - Iterate over logical breaks in text. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; --- 1,40 ---- ! /* BreakIterator.java -- Breaks text into elements ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** import java.util.MissingResourceExceptio *** 15,45 **** import java.util.ResourceBundle; /** * @author Tom Tromey * @date March 19, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct to 1.1. */ - public abstract class BreakIterator implements Cloneable { // The value was discovered by writing a test program. public static final int DONE = -1; protected BreakIterator () { } public abstract int current (); public abstract int first (); public abstract int following (int pos); public static synchronized Locale[] getAvailableLocales () { ! // FIXME. ! return null; } private static BreakIterator getInstance (String type, Locale loc) --- 43,117 ---- import java.util.ResourceBundle; /** + * This class iterates over text elements such as words, lines, sentences, + * and characters. It can only iterate over one of these text elements at + * a time. An instance of this class configured for the desired iteration + * type is created by calling one of the static factory methods, not + * by directly calling a constructor. + * * @author Tom Tromey + * @author Aaron M. Renn (arenn@urbanophile.com) * @date March 19, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct to 1.1. */ public abstract class BreakIterator implements Cloneable { + /** + * This value is returned by the next() and + * previous in order to indicate that the end of the + * text has been reached. + */ // The value was discovered by writing a test program. public static final int DONE = -1; + /** + * This method initializes a new instance of BreakIterator. + * This protected constructor is available to subclasses as a default + * no-arg superclass constructor. + */ protected BreakIterator () { } + /** + * This method returns the index of the current text element boundary. + * + * @return The current text boundary. + */ public abstract int current (); + + /** + * This method returns the first text element boundary in the text being + * iterated over. + * + * @return The first text boundary. + */ public abstract int first (); + + /** + * This methdod returns the offset of the text element boundary following + * the specified offset. + * + * @param offset The text index from which to find the next text boundary. + * + * @param The next text boundary following the specified index. + */ public abstract int following (int pos); + /** + * This method returns a list of locales for which instances of + * BreakIterator are available. + * + * @return A list of available locales + */ public static synchronized Locale[] getAvailableLocales () { ! Locale[] l = new Locale[1]; ! l[0] = Locale.US; ! return l; } private static BreakIterator getInstance (String type, Locale loc) *************** public abstract class BreakIterator impl *** 48,54 **** try { ResourceBundle res ! = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc); className = res.getString(type); } catch (MissingResourceException x) --- 120,127 ---- try { ResourceBundle res ! = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", ! loc); className = res.getString(type); } catch (MissingResourceException x) *************** public abstract class BreakIterator impl *** 74,133 **** } } public static BreakIterator getCharacterInstance () { return getCharacterInstance (Locale.getDefault()); } public static BreakIterator getCharacterInstance (Locale loc) { BreakIterator r = getInstance ("CharacterIterator", loc); if (r == null) ! r = new gnu.gcj.text.CharacterBreakIterator (); return r; } public static BreakIterator getLineInstance () { return getLineInstance (Locale.getDefault()); } public static BreakIterator getLineInstance (Locale loc) { BreakIterator r = getInstance ("LineIterator", loc); if (r == null) ! r = new gnu.gcj.text.LineBreakIterator (); return r; } public static BreakIterator getSentenceInstance () { return getSentenceInstance (Locale.getDefault()); } public static BreakIterator getSentenceInstance (Locale loc) { BreakIterator r = getInstance ("SentenceIterator", loc); if (r == null) ! r = new gnu.gcj.text.SentenceBreakIterator (); return r; } public abstract CharacterIterator getText (); public static BreakIterator getWordInstance () { return getWordInstance (Locale.getDefault()); } public static BreakIterator getWordInstance (Locale loc) { BreakIterator r = getInstance ("WordIterator", loc); if (r == null) ! r = new gnu.gcj.text.WordBreakIterator (); return r; } public boolean isBoundary (int pos) { if (pos == 0) --- 147,281 ---- } } + /** + * This method returns an instance of BreakIterator that will + * iterate over characters as defined in the default locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getCharacterInstance () { return getCharacterInstance (Locale.getDefault()); } + /** + * This method returns an instance of BreakIterator that will + * iterate over characters as defined in the specified locale. If the + * desired locale is not available, the default locale is used. + * + * @param locale The desired locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getCharacterInstance (Locale loc) { BreakIterator r = getInstance ("CharacterIterator", loc); if (r == null) ! r = new gnu.java.text.CharacterBreakIterator (); return r; } + /** + * This method returns an instance of BreakIterator that will + * iterate over line breaks as defined in the default locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getLineInstance () { return getLineInstance (Locale.getDefault()); } + /** + * This method returns an instance of BreakIterator that will + * iterate over line breaks as defined in the specified locale. If the + * desired locale is not available, the default locale is used. + * + * @param locale The desired locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getLineInstance (Locale loc) { BreakIterator r = getInstance ("LineIterator", loc); if (r == null) ! r = new gnu.java.text.LineBreakIterator (); return r; } + /** + * This method returns an instance of BreakIterator that will + * iterate over sentences as defined in the default locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getSentenceInstance () { return getSentenceInstance (Locale.getDefault()); } + /** + * This method returns an instance of BreakIterator that will + * iterate over sentences as defined in the specified locale. If the + * desired locale is not available, the default locale is used. + * + * @param locale The desired locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getSentenceInstance (Locale loc) { BreakIterator r = getInstance ("SentenceIterator", loc); if (r == null) ! r = new gnu.java.text.SentenceBreakIterator (); return r; } + /** + * This method returns the text this object is iterating over as a + * CharacterIterator. + * + * @param The text being iterated over. + */ public abstract CharacterIterator getText (); + /** + * This method returns an instance of BreakIterator that will + * iterate over words as defined in the default locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getWordInstance () { return getWordInstance (Locale.getDefault()); } + /** + * This method returns an instance of BreakIterator that will + * iterate over words as defined in the specified locale. If the + * desired locale is not available, the default locale is used. + * + * @param locale The desired locale. + * + * @return A BreakIterator instance for the default locale. + */ public static BreakIterator getWordInstance (Locale loc) { BreakIterator r = getInstance ("WordIterator", loc); if (r == null) ! r = new gnu.java.text.WordBreakIterator (); return r; } + /** + * This method tests whether or not the specified position is a text + * element boundary. + * + * @param offset The text position to test. + * + * @return true if the position is a boundary, + * false otherwise. + */ public boolean isBoundary (int pos) { if (pos == 0) *************** public abstract class BreakIterator impl *** 135,144 **** --- 283,323 ---- return following (pos - 1) == pos; } + /** + * This method returns the last text element boundary in the text being + * iterated over. + * + * @return The last text boundary. + */ public abstract int last (); + + /** + * This method returns the text element boundary following the current + * text position. + * + * @return The next text boundary. + */ public abstract int next (); + + /** + * This method returns the n'th text element boundary following the current + * text position. + * + * @param n The number of text element boundaries to skip. + * + * @return The next text boundary. + */ public abstract int next (int n); + /** + * This methdod returns the offset of the text element boundary preceding + * the specified offset. + * + * @param offset The text index from which to find the preceding + * text boundary. + * + * @returns The next text boundary preceding the specified index. + */ public int preceding (int pos) { if (following (pos) == DONE) *************** public abstract class BreakIterator impl *** 148,159 **** --- 327,355 ---- return current (); } + /** + * This method returns the text element boundary preceding the current + * text position. + * + * @return The previous text boundary. + */ public abstract int previous (); + /** + * This method sets the text string to iterate over. + * + * @param str The String to iterate over. + */ public void setText (String newText) { setText (new StringCharacterIterator (newText)); } + /** + * This method sets the text to iterate over from the specified + * CharacterIterator. + * + * @param ci The desired CharacterIterator. + */ public abstract void setText (CharacterIterator newText); } diff -Nrc3pad gcc-3.0.4/libjava/java/text/CharacterIterator.java gcc-3.1/libjava/java/text/CharacterIterator.java *** gcc-3.0.4/libjava/java/text/CharacterIterator.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/text/CharacterIterator.java Tue Jan 22 22:40:37 2002 *************** *** 1,36 **** ! // CharacterIterator.java - Protocol for iterating over Unicode characters. ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; /** ! * @author Tom Tromey ! * @date February 22, 1999 ! */ ! /* Written using "Java Class Libraries", 2nd edition, plus online ! * API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct to 1.1. ! */ ! public interface CharacterIterator extends Cloneable { ! public abstract Object clone (); public abstract char current (); public abstract char first (); public abstract int getBeginIndex (); public abstract int getEndIndex (); - public abstract int getIndex (); - public abstract char last (); - public abstract char next (); - public abstract char previous (); - public abstract char setIndex (int idx); ! public static final char DONE = '\uffff'; } --- 1,174 ---- ! /* CharacterIterator.java -- Iterate over a character range ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; /** ! * This interface defines a mechanism for iterating over a range of ! * characters. For a given range of text, a beginning and ending index, ! * as well as a current index are defined. These values can be queried ! * by the methods in this interface. Additionally, various methods allow ! * the index to be set. ! * ! * @version 0.0 ! * ! * @author Aaron M. Renn (arenn@urbanophile.com) ! */ public interface CharacterIterator extends Cloneable { ! ! /*************************************************************************/ ! ! /* ! * Static Variables ! */ ! ! /** ! * This is a special constant value that is returned when the beginning or ! * end of the character range has been reached. ! */ ! public static final char DONE = '\uFFFF'; ! ! /*************************************************************************/ ! ! /* ! * Instance Methods ! */ ! ! /** ! * This method returns the character at the current index position ! * ! * @return The character at the current index position. ! */ public abstract char current (); + + /*************************************************************************/ + + /** + * This method increments the current index and then returns the character + * at the new index value. If the index is already at getEndIndex() - 1, + * it will not be incremented. + * + * @return The character at the position of the incremented index value, or DONE if the index has reached getEndIndex() - 1 + */ + public abstract char next (); + + /*************************************************************************/ + + /** + * This method decrements the current index and then returns the character + * at the new index value. If the index value is already at the beginning + * index, it will not be decremented. + * + * @return The character at the position of the decremented index value, or DONE if index was already equal to the beginning index value. + */ + public abstract char previous (); + + /*************************************************************************/ + + /** + * This method sets the index value to the beginning of the range and returns + * the character there. + * + * @return The character at the beginning of the range, or DONE if the range is empty. + */ public abstract char first (); + + /*************************************************************************/ + + /** + * This method sets the index value to getEndIndex() - 1 and + * returns the character there. If the range is empty, then the index value + * will be set equal to the beginning index. + * + * @return The character at the end of the range, or DONE if the range is empty. + */ + public abstract char last (); + + /*************************************************************************/ + + /** + * This method returns the current value of the index. + * + * @return The current index value + */ + public abstract int getIndex (); + + /*************************************************************************/ + + /** + * This method sets the value of the index to the specified value, then + * returns the character at that position. + * + * @param index The new index value. + * + * @return The character at the new index value or DONE if the index value is equal to getEndIndex. + */ + public abstract char setIndex (int index) throws IllegalArgumentException; + + /*************************************************************************/ + + /** + * This method returns the character position of the first character in the + * range. + * + * @return The index of the first character in the range. + */ public abstract int getBeginIndex (); + + /*************************************************************************/ + + /** + * This method returns the character position of the end of the text range. + * This will actually be the index of the first character following the + * end of the range. In the event the text range is empty, this will be + * equal to the first character in the range. + * + * @return The index of the end of the range. + */ public abstract int getEndIndex (); ! /*************************************************************************/ ! ! /** ! * This method creates a copy of this CharacterIterator. ! * ! * @return A copy of this CharacterIterator. ! */ ! public abstract Object clone (); } diff -Nrc3pad gcc-3.0.4/libjava/java/text/ChoiceFormat.java gcc-3.1/libjava/java/text/ChoiceFormat.java *** gcc-3.0.4/libjava/java/text/ChoiceFormat.java Tue Oct 10 23:09:08 2000 --- gcc-3.1/libjava/java/text/ChoiceFormat.java Tue Jan 22 22:40:37 2002 *************** *** 1,306 **** ! // ChoiceFormat.java - Formatter for `switch'-like string substitution. ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; import java.util.Vector; /** * @author Tom Tromey * @date March 9, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Believed complete and correct to 1.1. */ - public class ChoiceFormat extends NumberFormat { ! // Note: we assume the same kind of quoting rules apply here. ! // This isn't explicitly documented. But for instance we accept ! // '#' as a literal hash in a format string. public void applyPattern (String newPattern) ! { ! int index = 0, max = newPattern.length(); ! Vector stringVec = new Vector (); ! Vector limitVec = new Vector (); ! StringBuffer buf = new StringBuffer (); ! ! while (true) ! { ! // Find end of double. ! int dstart = index; ! while (index < max) ! { ! char c = newPattern.charAt(index); ! if (c == '#' || c == '\u2064' || c == '<') ! break; ! ++index; ! } ! ! if (index == max) ! throw new IllegalArgumentException ("unexpected end of text"); ! Double d = new Double (newPattern.substring(dstart, index)); ! if (newPattern.charAt(index) == '<') ! d = new Double (nextDouble (d.doubleValue())); ! limitVec.addElement(d); ! // Scan text. ! ++index; ! buf.setLength(0); ! while (index < max) ! { ! char c = newPattern.charAt(index); ! if (c == '\'' && index < max + 1 ! && newPattern.charAt(index + 1) == '\'') ! { ! buf.append(c); ! ++index; ! } ! else if (c == '\'' && index < max + 2) ! { ! buf.append(newPattern.charAt(index + 1)); ! index += 2; ! } ! else if (c == '|') ! break; ! else buf.append(c); ! ++index; ! } ! stringVec.addElement(buf.toString()); ! if (index == max) ! break; ! ++index; ! } ! choiceFormats = new String[stringVec.size()]; ! stringVec.copyInto(choiceFormats); ! choiceLimits = new double[limitVec.size()]; ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! Double d = (Double) limitVec.elementAt(i); ! choiceLimits[i] = d.doubleValue(); ! } ! } public ChoiceFormat (String newPattern) ! { ! super (); ! applyPattern (newPattern); ! } public ChoiceFormat (double[] choiceLimits, String[] choiceFormats) ! { ! super (); ! setChoices (choiceLimits, choiceFormats); ! } ! ! public Object clone () ! { ! return new ChoiceFormat (choiceLimits, choiceFormats); ! } public boolean equals (Object obj) ! { ! if (! (obj instanceof ChoiceFormat)) ! return false; ! ChoiceFormat cf = (ChoiceFormat) obj; ! if (choiceLimits.length != cf.choiceLimits.length) ! return false; ! for (int i = choiceLimits.length - 1; i >= 0; --i) ! { ! if (choiceLimits[i] != cf.choiceLimits[i] ! || !choiceFormats[i].equals(cf.choiceFormats[i])) ! return false; ! } ! return true; ! } public StringBuffer format (long num, StringBuffer appendBuf, FieldPosition pos) ! { ! return format ((double) num, appendBuf, pos); ! } public StringBuffer format (double num, StringBuffer appendBuf, FieldPosition pos) ! { ! if (choiceLimits.length == 0) ! return appendBuf; ! int index = 0; ! if (! Double.isNaN(num) && num >= choiceLimits[0]) ! { ! for (; index < choiceLimits.length - 1; ++index) ! { ! if (choiceLimits[index] <= num ! && index != choiceLimits.length - 2 ! && num < choiceLimits[index + 1]) ! break; ! } ! } ! return appendBuf.append(choiceFormats[index]); ! } public Object[] getFormats () ! { ! return (Object[]) choiceFormats.clone(); ! } public double[] getLimits () ! { ! return (double[]) choiceLimits.clone(); ! } public int hashCode () ! { ! int hash = 0; ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! long v = Double.doubleToLongBits(choiceLimits[i]); ! hash ^= (v ^ (v >>> 32)); ! hash ^= choiceFormats[i].hashCode(); ! } ! return hash; ! } public static final double nextDouble (double d) ! { ! return nextDouble (d, true); ! } public static double nextDouble (double d, boolean next) ! { ! if (Double.isInfinite(d) || Double.isNaN(d)) ! return d; ! long bits = Double.doubleToLongBits(d); ! long mantMask = (1L << mantissaBits) - 1; ! long mantissa = bits & mantMask; ! long expMask = (1L << exponentBits) - 1; ! long exponent = (bits >>> mantissaBits) & expMask; ! if (next ^ (bits < 0)) // Increment magnitude ! { ! if (mantissa == (1L << mantissaBits) - 1) ! { ! mantissa = 0L; ! exponent++; ! // Check for absolute overflow. ! if (exponent >= (1L << mantissaBits)) ! return (bits > 0) ? Double.POSITIVE_INFINITY ! : Double.NEGATIVE_INFINITY; ! } ! else ! mantissa++; ! } ! else // Decrement magnitude ! { ! if (exponent == 0L && mantissa == 0L) ! { ! // The only case where there is a change of sign ! return next ? Double.MIN_VALUE : -Double.MIN_VALUE; ! } ! else ! { ! if (mantissa == 0L) ! { ! mantissa = (1L << mantissaBits) - 1; ! exponent--; ! } ! else ! mantissa--; ! } ! } ! long result = bits < 0 ? 1 : 0; ! result = (result << exponentBits) | exponent; ! result = (result << mantissaBits) | mantissa; ! return Double.longBitsToDouble(result); ! } public Number parse (String sourceStr, ParsePosition pos) ! { ! int index = pos.getIndex(); ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! if (sourceStr.startsWith(choiceFormats[i], index)) ! { ! pos.setIndex(index + choiceFormats[i].length()); ! return new Double (choiceLimits[i]); ! } ! } ! pos.setErrorIndex(index); ! return new Double (Double.NaN); ! } public static final double previousDouble (double d) ! { ! return nextDouble (d, false); ! } public void setChoices (double[] choiceLimits, String[] choiceFormats) ! { ! if (choiceLimits == null || choiceFormats == null) ! throw new NullPointerException (); ! if (choiceLimits.length != choiceFormats.length) ! throw new IllegalArgumentException (); ! this.choiceFormats = (String[]) choiceFormats.clone(); ! this.choiceLimits = (double[]) choiceLimits.clone(); ! } private final void quoteString (StringBuffer dest, String text) ! { ! int max = text.length(); ! for (int i = 0; i < max; ++i) ! { ! char c = text.charAt(i); ! if (c == '\'') ! { ! dest.append(c); ! dest.append(c); ! } ! else if (c == '#' || c == '|' || c == '\u2064' || c == '<') ! { ! dest.append('\''); ! dest.append(c); ! dest.append('\''); ! } ! else dest.append(c); ! } ! } public String toPattern () ! { ! StringBuffer result = new StringBuffer (); ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! result.append(choiceLimits[i]); ! result.append('#'); ! quoteString (result, choiceFormats[i]); ! } ! return result.toString(); ! } ! // Formats and limits. private String[] choiceFormats; private double[] choiceLimits; // Number of mantissa bits in double. --- 1,498 ---- ! /* ChoiceFormat.java -- Format over a range of numbers ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; import java.util.Vector; /** + * This class allows a format to be specified based on a range of numbers. + * To use this class, first specify two lists of formats and range terminators. + * These lists must be arrays of equal length. The format of index + * i will be selected for value X if + * terminator[i] <= X < limit[i + 1]. If the value X is not + * included in any range, then either the first or last format will be + * used depending on whether the value X falls outside the range. + *

    + * This sounds complicated, but that is because I did a poor job of + * explaining it. Consider the following example: + *

    + *

    +  * terminators = { 1, ChoiceFormat.nextDouble(1) }
    +  * formats = { "file", "files" }
    +  * 
    + *

    + * In this case if the actual number tested is one or less, then the word + * "file" is used as the format value. If the number tested is greater than + * one, then "files" is used. This allows plurals to be handled + * gracefully. Note the use of the method nextDouble. This + * method selects the next highest double number than its argument. This + * effectively makes any double greater than 1.0 cause the "files" string + * to be selected. (Note that all terminator values are specified as + * doubles. + *

    + * Note that in order for this class to work properly, the range terminator + * array must be sorted in ascending order and the format string array + * must be the same length as the terminator array. + * * @author Tom Tromey + * @author Aaron M. Renn (arenn@urbanophile.com) * @date March 9, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Believed complete and correct to 1.1. */ public class ChoiceFormat extends NumberFormat { ! /** ! * This method sets new range terminators and format strings for this ! * object based on the specified pattern. This pattern is of the form ! * "term#string|term#string...". For example "1#Sunday|2#Monday|#Tuesday". ! * ! * @param pattern The pattern of terminators and format strings. ! * ! * @exception IllegalArgumentException If the pattern is not valid ! */ public void applyPattern (String newPattern) ! { ! // Note: we assume the same kind of quoting rules apply here. ! // This isn't explicitly documented. But for instance we accept ! // '#' as a literal hash in a format string. ! int index = 0, max = newPattern.length(); ! Vector stringVec = new Vector (); ! Vector limitVec = new Vector (); ! StringBuffer buf = new StringBuffer (); ! ! while (true) ! { ! // Find end of double. ! int dstart = index; ! while (index < max) ! { ! char c = newPattern.charAt(index); ! if (c == '#' || c == '\u2064' || c == '<') ! break; ! ++index; ! } ! ! if (index == max) ! throw new IllegalArgumentException ("unexpected end of text"); ! Double d = new Double (newPattern.substring(dstart, index)); ! if (newPattern.charAt(index) == '<') ! d = new Double (nextDouble (d.doubleValue())); ! limitVec.addElement(d); ! // Scan text. ! ++index; ! buf.setLength(0); ! while (index < max) ! { ! char c = newPattern.charAt(index); ! if (c == '\'' && index < max + 1 ! && newPattern.charAt(index + 1) == '\'') ! { buf.append(c); ! ++index; ! } ! else if (c == '\'' && index < max + 2) ! { ! buf.append(newPattern.charAt(index + 1)); ! index += 2; ! } ! else if (c == '|') ! break; ! else ! buf.append(c); ! ++index; ! } ! stringVec.addElement(buf.toString()); ! if (index == max) ! break; ! ++index; ! } ! choiceFormats = new String[stringVec.size()]; ! stringVec.copyInto(choiceFormats); ! choiceLimits = new double[limitVec.size()]; ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! Double d = (Double) limitVec.elementAt(i); ! choiceLimits[i] = d.doubleValue(); ! } ! } + /** + * This method initializes a new instance of ChoiceFormat that + * generates its range terminator and format string arrays from the + * specified pattern. This pattern is of the form + * "term#string|term#string...". For example "1#Sunday|2#Monday|#Tuesday". + * This is the same pattern type used by the applyPattern + * method. + * + * @param pattern The pattern of terminators and format strings. + * + * @exception IllegalArgumentException If the pattern is not valid + */ public ChoiceFormat (String newPattern) ! { ! super (); ! applyPattern (newPattern); ! } + /** + * This method initializes a new instance of ChoiceFormat that + * will use the specified range terminators and format strings. + * + * @param choiceLimits The array of range terminators + * @param choiceFormats The array of format strings + */ public ChoiceFormat (double[] choiceLimits, String[] choiceFormats) ! { ! super (); ! setChoices (choiceLimits, choiceFormats); ! } + /** + * This method tests this object for equality with the specified + * object. This will be true if and only if: + *

      + *
    • The specified object is not null. + *
    • The specified object is an instance of ChoiceFormat. + *
    • The termination ranges and format strings are identical to + * this object's. + *
    + * + * @param obj The object to test for equality against. + * + * @return true if the specified object is equal to + * this one, false otherwise. + */ public boolean equals (Object obj) ! { ! if (! (obj instanceof ChoiceFormat)) ! return false; ! ChoiceFormat cf = (ChoiceFormat) obj; ! if (choiceLimits.length != cf.choiceLimits.length) ! return false; ! for (int i = choiceLimits.length - 1; i >= 0; --i) ! { ! if (choiceLimits[i] != cf.choiceLimits[i] ! || !choiceFormats[i].equals(cf.choiceFormats[i])) ! return false; ! } ! return true; ! } + /** + * This method appends the appropriate format string to the specified + * StringBuffer based on the supplied long + * argument. + * + * @param number The number used for determine (based on the range + * terminators) which format string to append. + * @param sb The StringBuffer to append the format string to. + * @param status Unused. + * + * @return The StringBuffer with the format string appended. + */ public StringBuffer format (long num, StringBuffer appendBuf, FieldPosition pos) ! { ! return format ((double) num, appendBuf, pos); ! } + /** + * This method appends the appropriate format string to the specified + * StringBuffer based on the supplied double + * argument. + * + * @param number The number used for determine (based on the range + * terminators) which format string to append. + * @param sb The StringBuffer to append the format string to. + * @param status Unused. + * + * @return The StringBuffer with the format string appended. + */ public StringBuffer format (double num, StringBuffer appendBuf, FieldPosition pos) ! { ! if (choiceLimits.length == 0) ! return appendBuf; ! int index = 0; ! if (! Double.isNaN(num) && num >= choiceLimits[0]) ! { ! for (; index < choiceLimits.length - 1; ++index) ! { ! if (choiceLimits[index] <= num ! && index != choiceLimits.length - 2 ! && num < choiceLimits[index + 1]) ! break; ! } ! } ! return appendBuf.append(choiceFormats[index]); ! } + /** + * This method returns the list of format strings in use. + * + * @return The list of format objects. + */ public Object[] getFormats () ! { ! return (Object[]) choiceFormats.clone(); ! } + /** + * This method returns the list of range terminators in use. + * + * @return The list of range terminators. + */ public double[] getLimits () ! { ! return (double[]) choiceLimits.clone(); ! } + /** + * This method returns a hash value for this object + * + * @return A hash value for this object. + */ public int hashCode () ! { ! int hash = 0; ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! long v = Double.doubleToLongBits(choiceLimits[i]); ! hash ^= (v ^ (v >>> 32)); ! hash ^= choiceFormats[i].hashCode(); ! } ! return hash; ! } + /** + * This method returns the lowest possible double greater than the + * specified double. If the specified double value is equal to + * Double.NaN then that is the value returned. + * + * @param d The specified double + * + * @return The lowest double value greater than the specified double. + */ public static final double nextDouble (double d) ! { ! return nextDouble (d, true); ! } + /** + * This method returns a double that is either the next highest double + * or next lowest double compared to the specified double depending on the + * value of the passed boolean parameter. If the boolean parameter is + * true, then the lowest possible double greater than the + * specified double will be returned. Otherwise the highest possible + * double less than the specified double will be returned. + * + * @param d The specified double + * @param positive true to return the next highest + * double, false otherwise. + * + * @return The next highest or lowest double value. + */ public static double nextDouble (double d, boolean next) ! { ! if (Double.isInfinite(d) || Double.isNaN(d)) ! return d; ! long bits = Double.doubleToLongBits(d); ! long mantMask = (1L << mantissaBits) - 1; ! long mantissa = bits & mantMask; ! long expMask = (1L << exponentBits) - 1; ! long exponent = (bits >>> mantissaBits) & expMask; ! if (next ^ (bits < 0)) // Increment magnitude ! { ! if (mantissa == (1L << mantissaBits) - 1) ! { ! mantissa = 0L; ! exponent++; ! // Check for absolute overflow. ! if (exponent >= (1L << mantissaBits)) ! return (bits > 0) ? Double.POSITIVE_INFINITY ! : Double.NEGATIVE_INFINITY; ! } ! else ! mantissa++; ! } ! else // Decrement magnitude ! { ! if (exponent == 0L && mantissa == 0L) ! { ! // The only case where there is a change of sign ! return next ? Double.MIN_VALUE : -Double.MIN_VALUE; ! } ! else ! { ! if (mantissa == 0L) ! { ! mantissa = (1L << mantissaBits) - 1; ! exponent--; ! } ! else ! mantissa--; ! } ! } ! long result = bits < 0 ? 1 : 0; ! result = (result << exponentBits) | exponent; ! result = (result << mantissaBits) | mantissa; ! return Double.longBitsToDouble(result); ! } + /** + * I'm not sure what this method is really supposed to do, as it is + * not documented. + */ public Number parse (String sourceStr, ParsePosition pos) ! { ! int index = pos.getIndex(); ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! if (sourceStr.startsWith(choiceFormats[i], index)) ! { ! pos.setIndex(index + choiceFormats[i].length()); ! return new Double (choiceLimits[i]); ! } ! } ! pos.setErrorIndex(index); ! return new Double (Double.NaN); ! } + /** + * This method returns the highest possible double less than the + * specified double. If the specified double value is equal to + * Double.NaN then that is the value returned. + * + * @param d The specified double + * + * @return The highest double value less than the specified double. + */ public static final double previousDouble (double d) ! { ! return nextDouble (d, false); ! } + /** + * This method sets new range terminators and format strings for this + * object. + * + * @param choiceLimits The new range terminators + * @param choiceFormats The new choice formats + */ public void setChoices (double[] choiceLimits, String[] choiceFormats) ! { ! if (choiceLimits == null || choiceFormats == null) ! throw new NullPointerException (); ! if (choiceLimits.length != choiceFormats.length) ! throw new IllegalArgumentException (); ! this.choiceFormats = (String[]) choiceFormats.clone(); ! this.choiceLimits = (double[]) choiceLimits.clone(); ! } private final void quoteString (StringBuffer dest, String text) ! { ! int max = text.length(); ! for (int i = 0; i < max; ++i) ! { ! char c = text.charAt(i); ! if (c == '\'') ! { dest.append(c); ! dest.append(c); ! } ! else if (c == '#' || c == '|' || c == '\u2064' || c == '<') ! { ! dest.append('\''); ! dest.append(c); ! dest.append('\''); ! } ! else ! dest.append(c); ! } ! } + /** + * This method returns the range terminator list and format string list + * as a String suitable for using with the + * applyPattern method. + * + * @return A pattern string for this object + */ public String toPattern () ! { ! StringBuffer result = new StringBuffer (); ! for (int i = 0; i < choiceLimits.length; ++i) ! { ! result.append(choiceLimits[i]); ! result.append('#'); ! quoteString (result, choiceFormats[i]); ! } ! return result.toString(); ! } ! /** ! * This is the list of format strings. Note that this variable is ! * specified by the serialization spec of this class. ! */ private String[] choiceFormats; + + /** + * This is the list of range terminator values. Note that this variable is + * specified by the serialization spec of this class. + */ private double[] choiceLimits; // Number of mantissa bits in double. diff -Nrc3pad gcc-3.0.4/libjava/java/text/CollationElementIterator.java gcc-3.1/libjava/java/text/CollationElementIterator.java *** gcc-3.0.4/libjava/java/text/CollationElementIterator.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/text/CollationElementIterator.java Tue Dec 18 17:27:43 2001 *************** *** 1,6 **** // CollationElementIterator.java - Iterate over decomposed characters. ! /* Copyright (C) 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // CollationElementIterator.java - Iterate over decomposed characters. ! /* Copyright (C) 1999, 2001 Free Software Foundation This file is part of libgcj. *************** public final class CollationElementItera *** 45,57 **** public static final short secondaryOrder (int order) { // From the JDK 1.2 spec. ! return (order >>> 8) & 255; } public static final short tertiaryOrder (int order) { // From the JDK 1.2 spec. ! return order & 255; } // Non-public constructor. --- 45,57 ---- public static final short secondaryOrder (int order) { // From the JDK 1.2 spec. ! return (short) ((order >>> 8) & 255); } public static final short tertiaryOrder (int order) { // From the JDK 1.2 spec. ! return (short) (order & 255); } // Non-public constructor. diff -Nrc3pad gcc-3.0.4/libjava/java/text/Collator.java gcc-3.1/libjava/java/text/Collator.java *** gcc-3.0.4/libjava/java/text/Collator.java Wed Dec 6 21:14:14 2000 --- gcc-3.1/libjava/java/text/Collator.java Tue Jan 22 22:40:37 2002 *************** *** 1,12 **** ! // Collator.java - Locale-sensitive string comparison. ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; --- 1,40 ---- ! /* Collator.java -- Perform locale dependent String comparisons. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** import java.util.ResourceBundle; *** 16,53 **** import java.util.Comparator; /** * @author Tom Tromey * @date March 18, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Mostly complete, but parts stubbed out. Look for FIXME. */ - public abstract class Collator implements Comparator, Cloneable { ! public static final int NO_DECOMPOSITION = 0; ! public static final int CANONICAL_DECOMPOSITION = 1; ! public static final int FULL_DECOMPOSITION = 2; ! public static final int PRIMARY = 0; public static final int SECONDARY = 1; public static final int TERTIARY = 2; public static final int IDENTICAL = 3; protected Collator () { strength = TERTIARY; decmp = CANONICAL_DECOMPOSITION; } public abstract int compare (String source, String target); public int compare (Object o1, Object o2) { return compare ((String) o1, (String) o2); } public boolean equals (Object obj) { if (! (obj instanceof Collator)) --- 44,200 ---- import java.util.Comparator; /** + * This class is the abstract superclass of classes which perform + * locale dependent String comparisons. A caller requests + * an instance of Collator for a particular locale using + * the getInstance() static method in this class. That method + * will return a locale specific subclass of Collator which + * can be used to perform String comparisons for that locale. + * If a subclass of Collator cannot be located for a particular + * locale, a default instance for the current locale will be returned. + * + * In addition to setting the correct locale, there are two additional + * settings that can be adjusted to affect String comparisons: + * strength and decomposition. The strength value determines the level + * of signficance of character differences required for them to sort + * differently. (For example, whether or not capital letters are considered + * different from lower case letters). The decomposition value affects how + * variants of the same character are treated for sorting purposes. (For + * example, whether or not an accent is signficant or not). These settings + * are described in detail in the documentation for the methods and values + * that are related to them. + * * @author Tom Tromey + * @author Aaron M. Renn (arenn@urbanophile.com) * @date March 18, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Mostly complete, but parts stubbed out. Look for FIXME. */ public abstract class Collator implements Comparator, Cloneable { ! /** ! * This constant is a strength value which indicates that only primary ! * differences between characters will be considered signficant. As an ! * example, two completely different English letters such as 'a' and 'b' ! * are considered to have a primary difference. ! */ public static final int PRIMARY = 0; + + /** + * This constant is a strength value which indicates that only secondary + * or primary differences between characters will be considered + * significant. An example of a secondary difference between characters + * are instances of the same letter with different accented forms. + */ public static final int SECONDARY = 1; + + /** + * This constant is a strength value which indicates that tertiary, + * secondary, and primary differences will be considered during sorting. + * An example of a tertiary difference is capitalization of a given letter. + * This is the default value for the strength setting. + */ public static final int TERTIARY = 2; + + /** + * This constant is a strength value which indicates that any difference + * at all between character values are considered significant. + */ public static final int IDENTICAL = 3; + + /** + * This constant indicates that accented characters won't be decomposed + * when performing comparisons. This will yield the fastest results, but + * will only work correctly in call cases for languages which do not + * use accents such as English. + */ + public static final int NO_DECOMPOSITION = 0; + + /** + * This constant indicates that only characters which are canonical variants + * in Unicode 2.0 will be decomposed prior to performing comparisons. This + * will cause accented languages to be sorted correctly. This is the + * default decomposition value. + */ + public static final int CANONICAL_DECOMPOSITION = 1; + + /** + * This constant indicates that both canonical variants and compatibility + * variants in Unicode 2.0 will be decomposed prior to performing + * comparisons. This is the slowest mode, but is required to get the + * correct sorting for certain languages with certain special formats. + */ + public static final int FULL_DECOMPOSITION = 2; + /** + * This method initializes a new instance of Collator to have + * the default strength (TERTIARY) and decomposition + * (CANONICAL_DECOMPOSITION) settings. This constructor is protected and + * is for use by subclasses only. Non-subclass callers should use the + * static getInstance() methods of this class to instantiate + * Collation objects for the desired locale. + */ protected Collator () { strength = TERTIARY; decmp = CANONICAL_DECOMPOSITION; } + /** + * This method compares the two String's and returns an + * integer indicating whether or not the first argument is less than, + * equal to, or greater than the second argument. The comparison is + * performed according to the rules of the locale for this + * Collator and the strength and decomposition rules in + * effect. + * + * @param str1 The first object to compare + * @param str2 The second object to compare + * + * @return A negative integer if str1 < str2, 0 if str1 == str2, or + * a positive integer if str1 > str2. + */ public abstract int compare (String source, String target); + /** + * This method compares the two Object's and returns an + * integer indicating whether or not the first argument is less than, + * equal to, or greater than the second argument. These two objects + * must be String's or an exception will be thrown. + * + * @param obj1 The first object to compare + * @param obj2 The second object to compare + * + * @return A negative integer if obj1 < obj2, 0 if obj1 == obj2, or + * a positive integer if obj1 > obj2. + * + * @exception ClassCastException If the arguments are not instances + * of String. + */ public int compare (Object o1, Object o2) { return compare ((String) o1, (String) o2); } + /** + * This method tests the specified object for equality against this + * object. This will be true if and only if the following conditions are + * met: + *
      + *
    • The specified object is not null. + *
    • The specified object is an instance of Collator. + *
    • The specified object has the same strength and decomposition + * settings as this object. + *
    + * + * @param obj The Object to test for equality against + * this object. + * + * @return true if the specified object is equal to + * this one, false otherwise. + */ public boolean equals (Object obj) { if (! (obj instanceof Collator)) *************** public abstract class Collator implement *** 56,97 **** return decmp == c.decmp && strength == c.strength; } public boolean equals (String source, String target) { return compare (source, target) == 0; } public Object clone () { ! return super.clone (); } public static synchronized Locale[] getAvailableLocales () { ! // FIXME. ! return null; } public abstract CollationKey getCollationKey (String source); public synchronized int getDecomposition () { return decmp; } public static Collator getInstance () { return getInstance (Locale.getDefault()); } public static Collator getInstance (Locale loc) { ResourceBundle res; String pattern; try { ! res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc); ! pattern = res.getString("collatorRule"); } catch (MissingResourceException x) { --- 203,310 ---- return decmp == c.decmp && strength == c.strength; } + /** + * This method tests whether the specified String's are equal + * according to the collation rules for the locale of this object and + * the current strength and decomposition settings. + * + * @param str1 The first String to compare + * @param str2 The second String to compare + * + * @return true if the two strings are equal, + * false otherwise. + */ public boolean equals (String source, String target) { return compare (source, target) == 0; } + /** + * This method returns a copy of this Collator object. + * + * @return A duplicate of this object. + */ public Object clone () { ! try ! { ! return super.clone (); ! } ! catch (CloneNotSupportedException _) ! { ! return null; ! } } + /** + * This method returns an array of Locale objects which is + * the list of locales for which Collator objects exist. + * + * @return The list of locales for which Collator's exist. + */ public static synchronized Locale[] getAvailableLocales () { ! // FIXME ! Locale[] l = new Locale[1]; ! l[0] = Locale.US; ! return l; } + /** + * This method transforms the specified String into a + * CollationKey for faster comparisons. This is useful when + * comparisons against a string might be performed multiple times, such + * as during a sort operation. + * + * @param str The String to convert. + * + * @return A CollationKey for the specified String. + */ public abstract CollationKey getCollationKey (String source); + /** + * This method returns the current decomposition setting for this + * object. This * will be one of NO_DECOMPOSITION, + * CANONICAL_DECOMPOSITION, or * FULL_DECOMPOSITION. See the + * documentation for those constants for an * explanation of this + * setting. + * + * @return The current decomposition setting. + */ public synchronized int getDecomposition () { return decmp; } + /** + * This method returns an instance of Collator for the + * default locale. + * + * @return A Collator for the default locale. + */ public static Collator getInstance () { return getInstance (Locale.getDefault()); } + /** + * This method returns an instance of Collator for the + * specified locale. If no Collator exists for the desired + * locale, a Collator for the default locale will be returned. + * + * @param locale The desired localed to load a Collator for. + * + * @return A Collator for the requested locale + */ public static Collator getInstance (Locale loc) { ResourceBundle res; String pattern; try { ! res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", ! loc); ! pattern = res.getString("collation_rules"); } catch (MissingResourceException x) { *************** public abstract class Collator implement *** 107,119 **** --- 320,356 ---- } } + /** + * This method returns the current strength setting for this object. This + * will be one of PRIMARY, SECONDARY, TERTIARY, or IDENTICAL. See the + * documentation for those constants for an explanation of this setting. + * + * @return The current strength setting. + */ public synchronized int getStrength () { return strength; } + /** + * This method returns a hash code value for this object. + * + * @return A hash value for this object. + */ public abstract int hashCode (); + /** + * This method sets the decomposition setting for this object to the + * specified value. This must be one of NO_DECOMPOSITION, + * CANONICAL_DECOMPOSITION, or FULL_DECOMPOSITION. Otherwise an + * exception will be thrown. See the documentation for those + * contants for an explanation of this setting. + * + * @param decmp The new decomposition setting. + * + * @exception IllegalArgumentException If the requested + * decomposition setting is not valid. + */ public synchronized void setDecomposition (int mode) { if (mode != NO_DECOMPOSITION *************** public abstract class Collator implement *** 123,128 **** --- 360,376 ---- decmp = mode; } + /** + * This method sets the strength setting for this object to the specified + * value. This must be one of PRIMARY, SECONDARY, TERTIARY, or IDENTICAL. + * Otherwise an exception is thrown. See the documentation for these + * constants for an explanation of this setting. + * + * @param strength The new strength setting. + * + * @exception IllegalArgumentException If the requested strength + * setting value is not valid. + */ public synchronized void setStrength (int strength) { if (strength != PRIMARY && strength != SECONDARY *************** public abstract class Collator implement *** 134,140 **** // Decompose a single character and append results to the buffer. native final void decomposeCharacter (char c, StringBuffer buf); ! // These names are fixed by the serialization spec. int decmp; int strength; } --- 382,394 ---- // Decompose a single character and append results to the buffer. native final void decomposeCharacter (char c, StringBuffer buf); ! /** ! * This is the current collation decomposition setting. ! */ int decmp; + + /** + * This is the current collation strength setting. + */ int strength; } diff -Nrc3pad gcc-3.0.4/libjava/java/text/DateFormat.java gcc-3.1/libjava/java/text/DateFormat.java *** gcc-3.0.4/libjava/java/text/DateFormat.java Tue Oct 10 23:09:08 2000 --- gcc-3.1/libjava/java/text/DateFormat.java Tue Jan 22 22:40:37 2002 *************** *** 1,10 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; --- 1,40 ---- ! /* DateFormat.java -- Class for formatting/parsing date/times ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** public abstract class DateFormat extends *** 25,59 **** protected NumberFormat numberFormat; // (Values determined using a test program.) ! public final static int FULL = 0; ! public final static int LONG = 1; ! public final static int MEDIUM = 2; ! public final static int SHORT = 3; ! public final static int DEFAULT = MEDIUM; ! public final static int ERA_FIELD = 0; ! public final static int YEAR_FIELD = 1; ! public final static int MONTH_FIELD = 2; ! public final static int DATE_FIELD = 3; ! public final static int HOUR_OF_DAY1_FIELD = 4; ! public final static int HOUR_OF_DAY0_FIELD = 5; ! public final static int MINUTE_FIELD = 6; ! public final static int SECOND_FIELD = 7; ! public final static int MILLISECOND_FIELD = 8; ! public final static int DAY_OF_WEEK_FIELD = 9; ! public final static int DAY_OF_YEAR_FIELD = 10; ! public final static int DAY_OF_WEEK_IN_MONTH_FIELD = 11; ! public final static int WEEK_OF_YEAR_FIELD = 12; ! public final static int WEEK_OF_MONTH_FIELD = 13; ! public final static int AM_PM_FIELD = 14; ! public final static int HOUR1_FIELD = 15; ! public final static int HOUR0_FIELD = 16; ! public final static int TIMEZONE_FIELD = 17; protected DateFormat () { } public boolean equals (Object obj) { if (! (obj instanceof DateFormat)) --- 55,114 ---- protected NumberFormat numberFormat; // (Values determined using a test program.) ! public static final int FULL = 0; ! public static final int LONG = 1; ! public static final int MEDIUM = 2; ! public static final int SHORT = 3; ! public static final int DEFAULT = MEDIUM; ! /* These constants need to have these exact values. They ! * correspond to index positions within the localPatternChars ! * string for a given locale. For example, the US locale uses ! * the string "GyMdkHmsSEDFwWahKz", where 'G' is the character ! * for era, 'y' for year, and so on down to 'z' for time zone. ! */ ! public static final int ERA_FIELD = 0; ! public static final int YEAR_FIELD = 1; ! public static final int MONTH_FIELD = 2; ! public static final int DATE_FIELD = 3; ! public static final int HOUR_OF_DAY1_FIELD = 4; ! public static final int HOUR_OF_DAY0_FIELD = 5; ! public static final int MINUTE_FIELD = 6; ! public static final int SECOND_FIELD = 7; ! public static final int MILLISECOND_FIELD = 8; ! public static final int DAY_OF_WEEK_FIELD = 9; ! public static final int DAY_OF_YEAR_FIELD = 10; ! public static final int DAY_OF_WEEK_IN_MONTH_FIELD = 11; ! public static final int WEEK_OF_YEAR_FIELD = 12; ! public static final int WEEK_OF_MONTH_FIELD = 13; ! public static final int AM_PM_FIELD = 14; ! public static final int HOUR1_FIELD = 15; ! public static final int HOUR0_FIELD = 16; ! public static final int TIMEZONE_FIELD = 17; + /** + * This method initializes a new instance of DateFormat. + */ protected DateFormat () { } + /** + * This method tests this object for equality against the specified object. + * The two objects will be considered equal if an only if the specified + * object: + *

    + *

      + *
    • Is not null. + *
    • Is an instance of DateFormat. + *
    • Has the same calendar and numberFormat field values as this object. + *
    + * + * @param obj The object to test for equality against. + * + * @return true if the specified object is equal to this object, + * false otherwise. + */ public boolean equals (Object obj) { if (! (obj instanceof DateFormat)) *************** public abstract class DateFormat extends *** 62,81 **** return calendar.equals(d.calendar) && numberFormat.equals(d.numberFormat); } public Object clone () { // We know the superclass just call's Object's generic cloner. return super.clone (); } public final StringBuffer format (Object obj, StringBuffer buf, FieldPosition pos) { if (obj instanceof Number) ! return format (new Date(((Number) obj).longValue()), buf, pos); return format ((Date) obj, buf, pos); } public final String format (Date date) { StringBuffer sb = new StringBuffer (); --- 117,162 ---- return calendar.equals(d.calendar) && numberFormat.equals(d.numberFormat); } + /** + * This method returns a copy of this object. + * + * @return A copy of this object. + */ public Object clone () { // We know the superclass just call's Object's generic cloner. return super.clone (); } + /** + * This method formats the specified Object into a date string + * and appends it to the specified StringBuffer. + * The specified object must be an instance of Number or + * Date or an IllegalArgumentException will be + * thrown. + * + * @param obj The Object to format. + * @param toAppendTo The StringBuffer to append the resultant + * String to. + * @param fieldPosition Is updated to the start and end index of the + * specified field. + * + * @return The StringBuffer supplied on input, with the + * formatted date/time appended. + */ public final StringBuffer format (Object obj, StringBuffer buf, FieldPosition pos) { if (obj instanceof Number) ! obj = new Date(((Number) obj).longValue()); return format ((Date) obj, buf, pos); } + /** + * Formats the date argument according to the pattern specified. + * + * @param date The formatted date. + */ public final String format (Date date) { StringBuffer sb = new StringBuffer (); *************** public abstract class DateFormat extends *** 83,96 **** return sb.toString(); } public abstract StringBuffer format (Date date, StringBuffer buf, FieldPosition pos); public static Locale[] getAvailableLocales () { ! return null; // FIXME } public Calendar getCalendar () { return calendar; --- 164,205 ---- return sb.toString(); } + /** + * This method formats a Date into a string and appends it + * to the specified StringBuffer. + * + * @param date The Date value to format. + * @param toAppendTo The StringBuffer to append the resultant + * String to. + * @param fieldPosition Is updated to the start and end index of the + * specified field. + * + * @return The StringBuffer supplied on input, with the + * formatted date/time appended. + */ public abstract StringBuffer format (Date date, StringBuffer buf, FieldPosition pos); + /** + * This method returns a list of available locales supported by this + * class. + */ public static Locale[] getAvailableLocales () { ! // FIXME ! Locale[] l = new Locale[1]; ! l[0] = Locale.US; ! return l; } + /** + * This method returns the Calendar object being used by + * this object to parse/format datetimes. + * + * @return The Calendar being used by this object. + * + * @see java.util.Calendar + */ public Calendar getCalendar () { return calendar; *************** public abstract class DateFormat extends *** 112,118 **** ResourceBundle res; try { ! res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc); } catch (MissingResourceException x) { --- 221,228 ---- ResourceBundle res; try { ! res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", ! loc); } catch (MissingResourceException x) { *************** public abstract class DateFormat extends *** 199,230 **** --- 309,385 ---- return new SimpleDateFormat (pattern, loc); } + /** + * This method returns an instance of DateFormat that will + * format using the default formatting style for dates. + * + * @return A new DateFormat instance. + */ public static final DateFormat getDateInstance () { return getDateInstance (DEFAULT, Locale.getDefault()); } + /** + * This method returns an instance of DateFormat that will + * format using the specified formatting style for dates. + * + * @param style The type of formatting to perform. + * + * @return A new DateFormat instance. + */ public static final DateFormat getDateInstance (int style) { return getDateInstance (style, Locale.getDefault()); } + /** + * This method returns an instance of DateFormat that will + * format using the specified formatting style for dates. The specified + * localed will be used in place of the default. + * + * @param style The type of formatting to perform. + * @param aLocale The desired locale. + * + * @return A new DateFormat instance. + */ public static final DateFormat getDateInstance (int style, Locale loc) { return computeInstance (style, loc, true, false); } + /** + * This method returns a new instance of DateFormat that + * formats both dates and times using the SHORT style. + * + * @return A new DateFormatinstance. + */ public static final DateFormat getDateTimeInstance () { return getDateTimeInstance (DEFAULT, DEFAULT, Locale.getDefault()); } + /** + * This method returns a new instance of DateFormat that + * formats both dates and times using the DEFAULT style. + * + * @return A new DateFormatinstance. + */ public static final DateFormat getDateTimeInstance (int dateStyle, int timeStyle) { return getDateTimeInstance (dateStyle, timeStyle, Locale.getDefault()); } + /** + * This method returns a new instance of DateFormat that + * formats both dates and times using the specified styles. + * + * @param dateStyle The desired style for date formatting. + * @param timeStyle The desired style for time formatting + * + * @return A new DateFormatinstance. + */ public static final DateFormat getDateTimeInstance (int dateStyle, int timeStyle, Locale loc) *************** public abstract class DateFormat extends *** 232,268 **** --- 387,470 ---- return computeInstance (dateStyle, timeStyle, loc, true, true); } + /** + * This method returns a new instance of DateFormat that + * formats both dates and times using the SHORT style. + * + * @return A new DateFormatinstance. + */ public static final DateFormat getInstance () { // JCL book says SHORT. return getDateTimeInstance (SHORT, SHORT, Locale.getDefault()); } + /** + * This method returns the NumberFormat object being used + * by this object to parse/format time values. + * + * @return The NumberFormat in use by this object. + */ public NumberFormat getNumberFormat () { return numberFormat; } + /** + * This method returns an instance of DateFormat that will + * format using the default formatting style for times. + * + * @return A new DateFormat instance. + */ public static final DateFormat getTimeInstance () { return getTimeInstance (DEFAULT, Locale.getDefault()); } + /** + * This method returns an instance of DateFormat that will + * format using the specified formatting style for times. + * + * @param style The type of formatting to perform. + * + * @return A new DateFormat instance. + */ public static final DateFormat getTimeInstance (int style) { return getTimeInstance (style, Locale.getDefault()); } + /** + * This method returns an instance of DateFormat that will + * format using the specified formatting style for times. The specified + * localed will be used in place of the default. + * + * @param style The type of formatting to perform. + * @param aLocale The desired locale. + * + * @return A new DateFormat instance. + */ public static final DateFormat getTimeInstance (int style, Locale loc) { return computeInstance (style, loc, false, true); } + /** + * This method returns the TimeZone object being used by + * this instance. + * + * @return The time zone in use. + */ public TimeZone getTimeZone () { return calendar.getTimeZone(); } + /** + * This method returns a hash value for this object. + * + * @return A hash value for this object. + */ public int hashCode () { int hash = calendar.hashCode(); *************** public abstract class DateFormat extends *** 271,281 **** --- 473,497 ---- return hash; } + /** + * This method indicates whether or not the parsing of date and time + * values should be done in a lenient value. + * + * @return true if date/time parsing is lenient, + * false otherwise. + */ public boolean isLenient () { return calendar.isLenient(); } + /** + * This method parses the specified date/time string. + * + * @return The resultant date. + * + * @exception ParseException If the specified string cannot be parsed. + */ public Date parse (String source) throws ParseException { ParsePosition pos = new ParsePosition(0); *************** public abstract class DateFormat extends *** 290,317 **** --- 506,584 ---- return result; } + /** + * This method parses the specified String into a + * Date. The pos argument contains the + * starting parse position on method entry and the ending parse + * position on method exit. + * + * @param text The string to parse. + * @param pos The starting parse position in entry, the ending parse + * position on exit. + * + * @return The parsed date, or null if the string cannot + * be parsed. + */ public abstract Date parse (String source, ParsePosition pos); + /** + * This method is identical to parse(String, ParsePosition), + * but returns its result as an Object instead of a + * Date. + * + * @param source The string to parse. + * @param pos The starting parse position in entry, the ending parse + * position on exit. + * + * @return The parsed date, or null if the string cannot + * be parsed. + */ public Object parseObject (String source, ParsePosition pos) { return parse(source, pos); } + /** + * This method specified the Calendar that should be used + * by this object to parse/format datetimes. + * + * @param The new Calendar for this object. + * + * @see java.util.Calendar + */ public void setCalendar (Calendar calendar) { this.calendar = calendar; } + /** + * This method specifies whether or not this object should be lenient in + * the syntax it accepts while parsing date/time values. + * + * @param lenient true if parsing should be lenient, + * false otherwise. + */ public void setLenient (boolean lenient) { calendar.setLenient(lenient); } + /** + * This method specifies the NumberFormat object that should + * be used by this object to parse/format times. + * + * @param The NumberFormat in use by this object. + */ public void setNumberFormat (NumberFormat numberFormat) { this.numberFormat = numberFormat; } + /** + * This method sets the time zone that should be used by this object. + * + * @param The new time zone. + */ public void setTimeZone (TimeZone timeZone) { calendar.setTimeZone(timeZone); diff -Nrc3pad gcc-3.0.4/libjava/java/text/DateFormatSymbols.java gcc-3.1/libjava/java/text/DateFormatSymbols.java *** gcc-3.0.4/libjava/java/text/DateFormatSymbols.java Tue Jan 9 07:07:51 2001 --- gcc-3.1/libjava/java/text/DateFormatSymbols.java Tue Jan 22 22:40:37 2002 *************** *** 1,10 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; --- 1,40 ---- ! /* ChoiceFormat.java -- Format over a range of numbers ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** import java.util.MissingResourceExceptio *** 13,28 **** import java.util.ResourceBundle; /** * @author Per Bothner * @date October 24, 1998. */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3. * Status: Believed complete and correct. */ ! ! public class DateFormatSymbols extends Object ! implements java.io.Serializable, Cloneable { String[] ampms; String[] eras; --- 43,57 ---- import java.util.ResourceBundle; /** + * This class acts as container for locale specific date/time formatting + * information such as the days of the week and the months of the year. * @author Per Bothner * @date October 24, 1998. */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3. * Status: Believed complete and correct. */ ! public class DateFormatSymbols implements java.io.Serializable, Cloneable { String[] ampms; String[] eras; *************** public class DateFormatSymbols extends O *** 36,98 **** private static final long serialVersionUID = -5987973545549424702L; // The order of these prefixes must be the same as in DateFormat ! // FIXME: XXX: Note that this differs from the Classpath implemention ! // in that there is no "default" entry; that is due to differing ! // implementations where DateFormat.DEFAULT is MEDIUM here but 4 in ! // Classpath (the JCL says it should be MEDIUM). That will need to be ! // resolved in the merge. ! private static final String[] formatPrefixes = { "full", "long", "medium", "short" }; ! ! private static final String[] ampmsDefault = {"AM", "PM" }; ! private static final String[] erasDefault = {"BC", "AD" }; ! // localPatternCharsDefault is used by SimpleDateFormat. ! private static final String localPatternCharsDefault ! = "GyMdkHmsSEDFwWahKz"; ! private static final String[] monthsDefault = { ! "January", "February", "March", "April", "May", "June", ! "July", "August", "September", "October", "November", "December", "" ! }; ! private static final String[] shortMonthsDefault = { ! "Jan", "Feb", "Mar", "Apr", "May", "Jun", ! "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "" ! }; ! private static final String[] shortWeekdaysDefault = { ! "", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ! }; ! private static final String[] weekdaysDefault = { ! "", "Sunday", "Monday", "Tuesday", ! "Wednesday", "Thursday", "Friday", "Saturday" ! }; ! ! private static String[][] zoneStringsDefault = { ! { "GMT", "Greenwich Mean Time", "GMT", ! /**/ "Greenwich Mean Time", "GMT", "GMT" }, ! { "PST", "Pacific Standard Time", "PST", ! /**/ "Pacific Daylight Time", "PDT", "San Francisco" }, ! { "MST", "Mountain Standard Time", "MST", ! /**/ "Mountain Daylight Time", "MDT", "Denver" }, ! { "PNT", "Mountain Standard Time", "MST", ! /**/ "Mountain Standard Time", "MST", "Phoenix" }, ! { "CST", "Central Standard Time", "CST", ! /**/ "Central Daylight Time", "CDT", "Chicago" }, ! { "EST", "Eastern Standard Time", "EST", ! /**/ "Eastern Daylight Time", "EDT", "Boston" }, ! { "IET", "Eastern Standard Time", "EST", ! /**/ "Eastern Standard Time", "EST", "Indianapolis" }, ! { "PRT", "Atlantic Standard Time", "AST", ! /**/ "Atlantic Daylight Time", "ADT", "Halifax" }, ! { "CNT", "Newfoundland Standard Time", "NST", ! /**/ "Newfoundland Daylight Time", "NDT", "St. Johns" }, ! { "ECT", "Central European Standard Time", "CET", ! /**/ "Central European Daylight Time", "CEST", "Paris" }, ! { "CTT", "China Standard Time", "CST", ! /**/ "China Standard Time", "CST", "Shanghai" }, ! { "JST", "Japan Standard Time", "JST", ! /**/ "Japan Standard Time", "JST", "Tokyo" }, ! { "HST", "Hawaii Standard Time", "HST", ! /**/ "Hawaii Standard Time", "HST", "Honolulu" }, ! { "AST", "Alaska Standard Time", "AKST", ! /**/ "Alaska Daylight Time", "AKDT", "Anchorage" } }; // These are each arrays with a value for SHORT, MEDIUM, LONG, FULL, --- 65,73 ---- private static final long serialVersionUID = -5987973545549424702L; // The order of these prefixes must be the same as in DateFormat ! private static final String[] formatPrefixes = ! { ! "full", "long", "medium", "short" }; // These are each arrays with a value for SHORT, MEDIUM, LONG, FULL, *************** public class DateFormatSymbols extends O *** 113,258 **** return values; } ! private final Object safeGetResource (ResourceBundle res, ! String key, Object def) { ! if (res != null) ! { ! try ! { ! return res.getObject(key); ! } ! catch (MissingResourceException x) ! { ! } ! } ! return def; ! } ! public DateFormatSymbols (Locale locale) ! { ! ResourceBundle res; ! try ! { ! res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", locale); ! } ! catch (MissingResourceException x) ! { ! res = null; ! } ! ampms = (String[]) safeGetResource (res, "ampm", ampmsDefault); ! eras = (String[]) safeGetResource (res, "eras", erasDefault); ! localPatternChars = (String) safeGetResource (res, "datePatternChars", ! localPatternCharsDefault); ! months = (String[]) safeGetResource (res, "months", monthsDefault); ! shortMonths = (String[]) safeGetResource (res, "shortMonths", ! shortMonthsDefault); ! shortWeekdays = (String[]) safeGetResource (res, "shortWeekdays", ! shortWeekdaysDefault); ! weekdays = (String[]) safeGetResource (res, "weekdays", weekdaysDefault); ! zoneStrings = (String[][]) safeGetResource (res, "zoneStrings", ! zoneStringsDefault); dateFormats = formatsForKey(res, "DateFormat"); timeFormats = formatsForKey(res, "TimeFormat"); } ! public DateFormatSymbols () { this (Locale.getDefault()); } ! // Copy constructor. ! private DateFormatSymbols (DateFormatSymbols old) ! { ! ampms = old.ampms; ! eras = old.eras; ! localPatternChars = old.localPatternChars; ! months = old.months; ! shortMonths = old.shortMonths; ! shortWeekdays = old.shortWeekdays; ! weekdays = old.weekdays; ! zoneStrings = old.zoneStrings; ! dateFormats = old.dateFormats; ! timeFormats = old.timeFormats; ! } ! public String[] getAmPmStrings() { return ampms; } public String[] getEras() { return eras; } ! public String getLocalPatternChars() { return localPatternChars; } public String[] getMonths () { return months; } public String[] getShortMonths () { return shortMonths; } public String[] getShortWeekdays () { return shortWeekdays; } public String[] getWeekdays () { return weekdays; } public String[] [] getZoneStrings () { return zoneStrings; } public void setAmPmStrings (String[] value) { ampms = value; } public void setEras (String[] value) { eras = value; } public void setLocalPatternChars (String value) { localPatternChars = value; } public void setMonths (String[] value) { months = value; } public void setShortMonths (String[] value) { shortMonths = value; } public void setShortWeekdays (String[] value) { shortWeekdays = value; } public void setWeekdays (String[] value) { weekdays = value; } public void setZoneStrings (String[][] value) { zoneStrings = value; --- 88,399 ---- return values; } ! /** ! * This method initializes a new instance of DateFormatSymbols ! * by loading the date format information for the specified locale. ! * ! * @param locale The locale for which date formatting symbols should ! * be loaded. ! */ ! public DateFormatSymbols (Locale locale) throws MissingResourceException { ! ResourceBundle res ! = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", locale); ! ampms = res.getStringArray ("ampms"); ! eras = res.getStringArray ("eras"); ! localPatternChars = res.getString ("localPatternChars"); ! months = res.getStringArray ("months"); ! shortMonths = res.getStringArray ("shortMonths"); ! shortWeekdays = res.getStringArray ("shortWeekdays"); ! weekdays = res.getStringArray ("weekdays"); ! zoneStrings = (String[][]) res.getObject ("zoneStrings"); dateFormats = formatsForKey(res, "DateFormat"); timeFormats = formatsForKey(res, "TimeFormat"); } ! /** ! * This method loads the format symbol information for the default ! * locale. ! */ ! public DateFormatSymbols () throws MissingResourceException { this (Locale.getDefault()); } ! /** ! * This method returns the list of strings used for displaying AM or PM. ! * This is a two element String array indexed by ! * Calendar.AM and Calendar.PM ! * ! * @return The list of AM/PM display strings. ! */ public String[] getAmPmStrings() { return ampms; } + /** + * This method returns the list of strings used for displaying eras + * (e.g., "BC" and "AD"). This is a two element String + * array indexed by Calendar.BC and Calendar.AD. + * + * @return The list of era disply strings. + */ public String[] getEras() { return eras; } ! /** ! * This method returns the pattern character information for this ! * object. This is an 18 character string that contains the characters ! * that are used in creating the date formatting strings in ! * SimpleDateFormat. The following are the character ! * positions in the string and which format character they correspond ! * to (the character in parentheses is the default value in the US English ! * locale): ! *

    ! *

      ! *
    • 0 - era (G) ! *
    • 1 - year (y) ! *
    • 2 - month (M) ! *
    • 4 - hour out of 12, from 1-12 (h) ! *
    • 5 - hour out of 24, from 0-23 (H) ! *
    • 6 - minute (m) ! *
    • 7 - second (s) ! *
    • 8 - millisecond (S) ! *
    • 9 - date of week (E) ! *
    • 10 - date of year (D) ! *
    • 11 - day of week in month, eg. "4th Thur in Nov" (F) ! *
    • 12 - week in year (w) ! *
    • 13 - week in month (W) ! *
    • 14 - am/pm (a) ! *
    • 15 - hour out of 24, from 1-24 (k) ! *
    • 16 - hour out of 12, from 0-11 (K) ! *
    • 17 - time zone (z) ! *
    ! * ! * @return The format patter characters ! */ public String getLocalPatternChars() { return localPatternChars; } + /** + * This method returns the list of strings used for displaying month + * names (e.g., "January" and "February"). This is a thirteen element + * string array indexed by Calendar.JANUARY through + * Calendar.UNDECEMBER. Note that there are thirteen + * elements because some calendars have thriteen months. + * + * @return The list of month display strings. + */ public String[] getMonths () { return months; } + /** + * This method returns the list of strings used for displaying abbreviated + * month names (e.g., "Jan" and "Feb"). This is a thirteen element + * String array indexed by Calendar.JANUARY + * through Calendar.UNDECEMBER. Note that there are thirteen + * elements because some calendars have thirteen months. + * + * @return The list of abbreviated month display strings. + */ public String[] getShortMonths () { return shortMonths; } + /** + * This method returns the list of strings used for displaying abbreviated + * weekday names (e.g., "Sun" and "Mon"). This is an eight element + * String array indexed by Calendar.SUNDAY + * through Calendar.SATURDAY. Note that the first element + * of this array is ignored. + * + * @return This list of abbreviated weekday display strings. + */ public String[] getShortWeekdays () { return shortWeekdays; } + /** + * This method returns the list of strings used for displaying weekday + * names (e.g., "Sunday" and "Monday"). This is an eight element + * String array indexed by Calendar.SUNDAY + * through Calendar.SATURDAY. Note that the first element + * of this array is ignored. + * + * @return This list of weekday display strings. + */ public String[] getWeekdays () { return weekdays; } + /** + * This method returns this list of localized timezone display strings. + * This is a two dimensional String array where each row in + * the array contains five values: + *

    + *

      + *
    • 0 - The non-localized time zone id string. + *
    • 1 - The long name of the time zone (standard time). + *
    • 2 - The short name of the time zone (standard time). + *
    • 3 - The long name of the time zone (daylight savings time). + *
    • 4 - the short name of the time zone (daylight savings time). + * + * @return The list of time zone display strings. + */ public String[] [] getZoneStrings () { return zoneStrings; } + /** + * This method sets the list of strings used to display AM/PM values to + * the specified list. + * This is a two element String array indexed by + * Calendar.AM and Calendar.PM + * + * @param ampms The new list of AM/PM display strings. + */ public void setAmPmStrings (String[] value) { ampms = value; } + /** + * This method sets the list of strings used to display time eras to + * to the specified list. + * This is a two element String + * array indexed by Calendar.BC and Calendar.AD. + * + * @param eras The new list of era disply strings. + */ public void setEras (String[] value) { eras = value; } + /** + * This method sets the list of characters used to specific date/time + * formatting strings. + * This is an 18 character string that contains the characters + * that are used in creating the date formatting strings in + * SimpleDateFormat. The following are the character + * positions in the string and which format character they correspond + * to (the character in parentheses is the default value in the US English + * locale): + *

      + *

        + *
      • 0 - era (G) + *
      • 1 - year (y) + *
      • 2 - month (M) + *
      • 4 - hour out of 12, from 1-12 (h) + *
      • 5 - hour out of 24, from 0-23 (H) + *
      • 6 - minute (m) + *
      • 7 - second (s) + *
      • 8 - millisecond (S) + *
      • 9 - date of week (E) + *
      • 10 - date of year (D) + *
      • 11 - day of week in month, eg. "4th Thur in Nov" (F) + *
      • 12 - week in year (w) + *
      • 13 - week in month (W) + *
      • 14 - am/pm (a) + *
      • 15 - hour out of 24, from 1-24 (k) + *
      • 16 - hour out of 12, from 0-11 (K) + *
      • 17 - time zone (z) + *
      + * + * @param localPatternChars The new format patter characters + */ public void setLocalPatternChars (String value) { localPatternChars = value; } + /** + * This method sets the list of strings used to display month names. + * This is a thirteen element + * string array indexed by Calendar.JANUARY through + * Calendar.UNDECEMBER. Note that there are thirteen + * elements because some calendars have thriteen months. + * + * @param months The list of month display strings. + */ public void setMonths (String[] value) { months = value; } + /** + * This method sets the list of strings used to display abbreviated month + * names. + * This is a thirteen element + * String array indexed by Calendar.JANUARY + * through Calendar.UNDECEMBER. Note that there are thirteen + * elements because some calendars have thirteen months. + * + * @param shortMonths The new list of abbreviated month display strings. + */ public void setShortMonths (String[] value) { shortMonths = value; } + /** + * This method sets the list of strings used to display abbreviated + * weekday names. + * This is an eight element + * String array indexed by Calendar.SUNDAY + * through Calendar.SATURDAY. Note that the first element + * of this array is ignored. + * + * @param shortWeekdays This list of abbreviated weekday display strings. + */ public void setShortWeekdays (String[] value) { shortWeekdays = value; } + /** + * This method sets the list of strings used to display weekday names. + * This is an eight element + * String array indexed by Calendar.SUNDAY + * through Calendar.SATURDAY. Note that the first element + * of this array is ignored. + * + * @param weekdays This list of weekday display strings. + */ public void setWeekdays (String[] value) { weekdays = value; } + /** + * This method sets the list of display strings for time zones. + * This is a two dimensional String array where each row in + * the array contains five values: + *

      + *

        + *
      • 0 - The non-localized time zone id string. + *
      • 1 - The long name of the time zone (standard time). + *
      • 2 - The short name of the time zone (standard time). + *
      • 3 - The long name of the time zone (daylight savings time). + *
      • 4 - the short name of the time zone (daylight savings time). + * + * @return The list of time zone display strings. + */ public void setZoneStrings (String[][] value) { zoneStrings = value; *************** public class DateFormatSymbols extends O *** 292,300 **** return hash; } public boolean equals (Object obj) { ! if (obj == null || ! (obj instanceof DateFormatSymbols)) return false; DateFormatSymbols other = (DateFormatSymbols) obj; return (equals(ampms, other.ampms) --- 433,456 ---- return hash; } + /** + * This method tests a specified object for equality against this object. + * This will be true if and only if the specified object: + *

        + *

          + *
        • Is not null. + *
        • Is an instance of DateFormatSymbols. + *
        • Contains identical formatting symbols to this object. + *
        + * + * @param obj The Object to test for equality against. + * + * @return true if the specified object is equal to this one, + * false otherwise. + */ public boolean equals (Object obj) { ! if (! (obj instanceof DateFormatSymbols)) return false; DateFormatSymbols other = (DateFormatSymbols) obj; return (equals(ampms, other.ampms) *************** public class DateFormatSymbols extends O *** 307,317 **** && equals(zoneStrings, other.zoneStrings)); } public Object clone () { ! return new DateFormatSymbols (this); } public int hashCode () { return (hashCode(ampms) --- 463,490 ---- && equals(zoneStrings, other.zoneStrings)); } + /** + * Returns a new copy of this object. + * + * @param A copy of this object + */ public Object clone () { ! try ! { ! return super.clone (); ! } ! catch (CloneNotSupportedException e) ! { ! return null; ! } } + /** + * This method returns a hash value for this object. + * + * @return A hash value for this object. + */ public int hashCode () { return (hashCode(ampms) diff -Nrc3pad gcc-3.0.4/libjava/java/text/DecimalFormat.java gcc-3.1/libjava/java/text/DecimalFormat.java *** gcc-3.0.4/libjava/java/text/DecimalFormat.java Tue Oct 10 23:09:08 2000 --- gcc-3.1/libjava/java/text/DecimalFormat.java Tue Jan 22 22:40:37 2002 *************** *** 1,12 **** ! // DecimalFormat.java - Localized number formatting. ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.text; --- 1,39 ---- ! /* DecimalFormat.java -- Formats and parses numbers ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** import java.io.IOException; *** 26,32 **** * Note however that the docs are very unclear about how format parsing * should work. No doubt there are problems here. */ - public class DecimalFormat extends NumberFormat { // This is a helper for applyPatternWithSymbols. It reads a prefix --- 53,58 ---- *************** public class DecimalFormat extends Numbe *** 34,973 **** private final int scanFix (String pattern, int index, StringBuffer buf, String patChars, DecimalFormatSymbols syms, boolean is_suffix) ! { ! int len = pattern.length(); ! buf.setLength(0); ! boolean multiplierSet = false; ! while (index < len) ! { ! char c = pattern.charAt(index); ! if (c == '\'' && index + 1 < len ! && pattern.charAt(index + 1) == '\'') ! { ! buf.append(c); ! ++index; ! } ! else if (c == '\'' && index + 2 < len ! && pattern.charAt(index + 2) == '\'') ! { ! buf.append(pattern.charAt(index + 1)); ! index += 2; ! } ! else if (c == '\u00a4') ! { ! if (index + 1 < len && pattern.charAt(index + 1) == '\u00a4') ! { ! buf.append(syms.getInternationalCurrencySymbol()); ! ++index; ! } ! else ! buf.append(syms.getCurrencySymbol()); ! } ! else if (is_suffix && c == syms.getPercent()) ! { ! if (multiplierSet) ! throw new IllegalArgumentException ("multiplier already set " + ! "- index: " + index); ! multiplierSet = true; ! multiplier = 100; ! buf.append(c); ! } ! else if (is_suffix && c == syms.getPerMill()) ! { ! if (multiplierSet) ! throw new IllegalArgumentException ("multiplier already set " + ! "- index: " + index); ! multiplierSet = true; ! multiplier = 1000; ! buf.append(c); ! } ! else if (patChars.indexOf(c) != -1) ! { ! // This is a pattern character. ! break; ! } ! else buf.append(c); ! ++index; ! } ! return index; ! } // A helper which reads a number format. private final int scanFormat (String pattern, int index, String patChars, DecimalFormatSymbols syms, boolean is_positive) ! { ! int max = pattern.length(); ! int countSinceGroup = 0; ! int zeroCount = 0; ! boolean saw_group = false; ! // ! // Scan integer part. ! // ! while (index < max) ! { ! char c = pattern.charAt(index); ! if (c == syms.getDigit()) ! { ! if (zeroCount > 0) ! throw new IllegalArgumentException ("digit mark following " + ! "zero - index: " + index); ! ++countSinceGroup; ! } ! else if (c == syms.getZeroDigit()) ! { ! ++zeroCount; ! ++countSinceGroup; ! } ! else if (c == syms.getGroupingSeparator()) ! { ! countSinceGroup = 0; ! saw_group = true; ! } ! else ! break; ! ++index; ! } ! // We can only side-effect when parsing the positive format. ! if (is_positive) ! { ! groupingUsed = saw_group; ! groupingSize = (byte) countSinceGroup; ! minimumIntegerDigits = zeroCount; ! } ! // Early termination. ! if (index == max || pattern.charAt(index) == syms.getGroupingSeparator()) ! { ! if (is_positive) ! decimalSeparatorAlwaysShown = false; ! return index; ! } ! if (pattern.charAt(index) == syms.getDecimalSeparator()) ! { ! ++index; ! // ! // Scan fractional part. ! // ! int hashCount = 0; ! zeroCount = 0; ! while (index < max) ! { ! char c = pattern.charAt(index); ! if (c == syms.getZeroDigit()) ! { ! if (hashCount > 0) ! throw new IllegalArgumentException ("zero mark " + ! "following digit - index: " + index); ! ++zeroCount; ! } ! else if (c == syms.getDigit()) ! { ! ++hashCount; ! } ! else if (c != syms.getExponential() ! && c != syms.getPatternSeparator() ! && patChars.indexOf(c) != -1) ! throw new IllegalArgumentException ("unexpected special " + ! "character - index: " + index); ! else ! break; ! ++index; ! } ! if (is_positive) ! { ! maximumFractionDigits = hashCount + zeroCount; ! minimumFractionDigits = zeroCount; ! } ! if (index == max) ! return index; ! } ! if (pattern.charAt(index) == syms.getExponential()) ! { ! // ! // Scan exponential format. ! // ! zeroCount = 0; ! ++index; ! while (index < max) ! { ! char c = pattern.charAt(index); ! if (c == syms.getZeroDigit()) ! ++zeroCount; ! else if (c == syms.getDigit()) ! { ! if (zeroCount > 0) ! throw new ! IllegalArgumentException ("digit mark following zero " + ! "in exponent - index: " + ! index); ! } ! else if (patChars.indexOf(c) != -1) ! throw new IllegalArgumentException ("unexpected special " + ! "character - index: " + ! index); ! else ! break; ! ++index; ! } ! if (is_positive) ! { ! useExponentialNotation = true; ! minExponentDigits = (byte) zeroCount; ! } ! } ! return index; ! } // This helper function creates a string consisting of all the // characters which can appear in a pattern and must be quoted. private final String patternChars (DecimalFormatSymbols syms) ! { ! StringBuffer buf = new StringBuffer (); ! buf.append(syms.getDecimalSeparator()); ! buf.append(syms.getDigit()); ! buf.append(syms.getExponential()); ! buf.append(syms.getGroupingSeparator()); ! // Adding this one causes pattern application to fail. ! // Of course, omitting is causes toPattern to fail. ! // ... but we already have bugs there. FIXME. ! // buf.append(syms.getMinusSign()); ! buf.append(syms.getPatternSeparator()); ! buf.append(syms.getPercent()); ! buf.append(syms.getPerMill()); ! buf.append(syms.getZeroDigit()); ! buf.append('\u00a4'); ! return buf.toString(); ! } private final void applyPatternWithSymbols (String pattern, DecimalFormatSymbols syms) ! { ! // Initialize to the state the parser expects. ! negativePrefix = ""; ! negativeSuffix = ""; ! positivePrefix = ""; ! positiveSuffix = ""; ! decimalSeparatorAlwaysShown = false; ! groupingSize = 0; ! minExponentDigits = 0; ! multiplier = 1; ! useExponentialNotation = false; ! groupingUsed = false; ! maximumFractionDigits = 0; ! maximumIntegerDigits = 309; ! minimumFractionDigits = 0; ! minimumIntegerDigits = 1; ! StringBuffer buf = new StringBuffer (); ! String patChars = patternChars (syms); ! int max = pattern.length(); ! int index = scanFix (pattern, 0, buf, patChars, syms, false); ! positivePrefix = buf.toString(); ! index = scanFormat (pattern, index, patChars, syms, true); ! index = scanFix (pattern, index, buf, patChars, syms, true); ! positiveSuffix = buf.toString(); ! if (index == pattern.length()) ! { ! // No negative info. ! negativePrefix = null; ! negativeSuffix = null; ! } ! else ! { ! if (pattern.charAt(index) != syms.getPatternSeparator()) ! throw new IllegalArgumentException ("separator character " + ! "expected - index: " + index); ! index = scanFix (pattern, index + 1, buf, patChars, syms, false); ! negativePrefix = buf.toString(); ! // We parse the negative format for errors but we don't let ! // it side-effect this object. ! index = scanFormat (pattern, index, patChars, syms, false); ! index = scanFix (pattern, index, buf, patChars, syms, true); ! negativeSuffix = buf.toString(); ! if (index != pattern.length()) ! throw new IllegalArgumentException ("end of pattern expected " + ! "- index: " + index); ! } ! } public void applyLocalizedPattern (String pattern) ! { ! // JCL p. 638 claims this throws a ParseException but p. 629 ! // contradicts this. Empirical tests with patterns of "0,###.0" ! // and "#.#.#" corroborate the p. 629 statement that an ! // IllegalArgumentException is thrown. ! applyPatternWithSymbols (pattern, symbols); ! } public void applyPattern (String pattern) ! { ! // JCL p. 638 claims this throws a ParseException but p. 629 ! // contradicts this. Empirical tests with patterns of "0,###.0" ! // and "#.#.#" corroborate the p. 629 statement that an ! // IllegalArgumentException is thrown. ! applyPatternWithSymbols (pattern, nonLocalizedSymbols); ! } public Object clone () ! { ! return new DecimalFormat (this); ! } ! ! private DecimalFormat (DecimalFormat dup) ! { ! decimalSeparatorAlwaysShown = dup.decimalSeparatorAlwaysShown; ! groupingSize = dup.groupingSize; ! minExponentDigits = dup.minExponentDigits; ! multiplier = dup.multiplier; ! negativePrefix = dup.negativePrefix; ! negativeSuffix = dup.negativeSuffix; ! positivePrefix = dup.positivePrefix; ! positiveSuffix = dup.positiveSuffix; ! symbols = (DecimalFormatSymbols) dup.symbols.clone(); ! useExponentialNotation = dup.useExponentialNotation; ! } public DecimalFormat () ! { ! this ("#,##0.###"); ! } public DecimalFormat (String pattern) ! { ! this (pattern, new DecimalFormatSymbols ()); ! } public DecimalFormat (String pattern, DecimalFormatSymbols symbols) ! { ! this.symbols = symbols; ! applyPattern (pattern); ! } private final boolean equals (String s1, String s2) ! { ! if (s1 == null || s2 == null) ! return s1 == s2; ! return s1.equals(s2); ! } public boolean equals (Object obj) ! { ! if (! (obj instanceof DecimalFormat)) ! return false; ! DecimalFormat dup = (DecimalFormat) obj; ! return (decimalSeparatorAlwaysShown == dup.decimalSeparatorAlwaysShown ! && groupingSize == dup.groupingSize ! && minExponentDigits == dup.minExponentDigits ! && multiplier == dup.multiplier ! && equals(negativePrefix, dup.negativePrefix) ! && equals(negativeSuffix, dup.negativeSuffix) ! && equals(positivePrefix, dup.positivePrefix) ! && equals(positiveSuffix, dup.positiveSuffix) ! && symbols.equals(dup.symbols) ! && useExponentialNotation == dup.useExponentialNotation); ! } public StringBuffer format (double number, StringBuffer dest, FieldPosition fieldPos) ! { ! // A very special case. ! if (Double.isNaN(number)) ! { ! dest.append(symbols.getNaN()); ! if (fieldPos != null && fieldPos.getField() == INTEGER_FIELD) ! { ! int index = dest.length(); ! fieldPos.setBeginIndex(index - symbols.getNaN().length()); ! fieldPos.setEndIndex(index); ! } ! return dest; ! } ! boolean is_neg = number < 0; ! if (is_neg) ! { ! if (negativePrefix != null) ! dest.append(negativePrefix); ! else ! { ! dest.append(symbols.getMinusSign()); ! dest.append(positivePrefix); ! } ! number = - number; ! } ! else ! dest.append(positivePrefix); ! int integerBeginIndex = dest.length(); ! int integerEndIndex = 0; ! if (Double.isInfinite (number)) ! { ! dest.append(symbols.getInfinity()); ! integerEndIndex = dest.length(); ! } ! else ! { ! number *= multiplier; ! // Compute exponent. ! long exponent = 0; ! double baseNumber; ! if (useExponentialNotation) ! { ! exponent = (long) (Math.log(number) / Math.log(10)); ! if (minimumIntegerDigits > 0) ! exponent -= minimumIntegerDigits - 1; ! baseNumber = (long) (number / Math.pow(10.0, exponent)); ! } ! else ! baseNumber = number; ! // Round to the correct number of digits. ! baseNumber += 5 * Math.pow(10.0, - maximumFractionDigits - 1); ! int index = dest.length(); ! double intPart = Math.floor(baseNumber); ! int count = 0; ! while (count < maximumIntegerDigits ! && (intPart > 0 || count < minimumIntegerDigits)) ! { ! long dig = (long) (intPart % 10); ! intPart = Math.floor(intPart / 10); ! // Append group separator if required. ! if (groupingUsed && count > 0 && count % groupingSize == 0) ! dest.insert(index, symbols.getGroupingSeparator()); ! dest.insert(index, (char) (symbols.getZeroDigit() + dig)); ! ++count; ! } ! integerEndIndex = dest.length(); ! int decimal_index = integerEndIndex; ! int consecutive_zeros = 0; ! int total_digits = 0; ! // Strip integer part from NUMBER. ! double fracPart = baseNumber - Math.floor(baseNumber); ! for (count = 0; ! count < maximumFractionDigits ! && (fracPart != 0 || count < minimumFractionDigits); ! ++count) ! { ! ++total_digits; ! fracPart *= 10; ! long dig = (long) fracPart; ! if (dig == 0) ! ++consecutive_zeros; ! else ! consecutive_zeros = 0; ! dest.append((char) (symbols.getZeroDigit() + dig)); ! // Strip integer part from FRACPART. ! fracPart = fracPart - Math.floor (fracPart); ! } ! // Strip extraneous trailing `0's. We can't always detect ! // these in the loop. ! int extra_zeros = Math.min (consecutive_zeros, ! total_digits - minimumFractionDigits); ! if (extra_zeros > 0) ! { ! dest.setLength(dest.length() - extra_zeros); ! total_digits -= extra_zeros; ! } ! // If required, add the decimal symbol. ! if (decimalSeparatorAlwaysShown ! || total_digits > 0) ! { ! dest.insert(decimal_index, symbols.getDecimalSeparator()); ! if (fieldPos != null && fieldPos.getField() == FRACTION_FIELD) ! { ! fieldPos.setBeginIndex(decimal_index + 1); ! fieldPos.setEndIndex(dest.length()); ! } ! } ! // Finally, print the exponent. ! if (useExponentialNotation) ! { ! dest.append(symbols.getExponential()); ! dest.append(exponent < 0 ? '-' : '+'); ! index = dest.length(); ! for (count = 0; ! exponent > 0 || count < minExponentDigits; ! ++count) ! { ! long dig = exponent % 10; ! exponent /= 10; ! dest.insert(index, (char) (symbols.getZeroDigit() + dig)); ! } ! } ! } ! if (fieldPos != null && fieldPos.getField() == INTEGER_FIELD) ! { ! fieldPos.setBeginIndex(integerBeginIndex); ! fieldPos.setEndIndex(integerEndIndex); ! } ! dest.append((is_neg && negativeSuffix != null) ! ? negativeSuffix ! : positiveSuffix); ! return dest; ! } public StringBuffer format (long number, StringBuffer dest, FieldPosition fieldPos) ! { ! // If using exponential notation, we just format as a double. ! if (useExponentialNotation) ! return format ((double) number, dest, fieldPos); ! boolean is_neg = number < 0; ! if (is_neg) ! { ! if (negativePrefix != null) ! dest.append(negativePrefix); ! else ! { ! dest.append(symbols.getMinusSign()); ! dest.append(positivePrefix); ! } ! number = - number; ! } ! else ! dest.append(positivePrefix); ! int integerBeginIndex = dest.length(); ! int index = dest.length(); ! int count = 0; ! while (count < maximumIntegerDigits ! && (number > 0 || count < minimumIntegerDigits)) ! { ! long dig = number % 10; ! number /= 10; ! // NUMBER and DIG will be less than 0 if the original number ! // was the most negative long. ! if (dig < 0) ! { ! dig = - dig; ! number = - number; ! } ! // Append group separator if required. ! if (groupingUsed && count > 0 && count % groupingSize == 0) ! dest.insert(index, symbols.getGroupingSeparator()); ! dest.insert(index, (char) (symbols.getZeroDigit() + dig)); ! ++count; ! } ! if (fieldPos != null && fieldPos.getField() == INTEGER_FIELD) ! { ! fieldPos.setBeginIndex(integerBeginIndex); ! fieldPos.setEndIndex(dest.length()); ! } ! if (decimalSeparatorAlwaysShown || minimumFractionDigits > 0) ! { ! dest.append(symbols.getDecimalSeparator()); ! if (fieldPos != null && fieldPos.getField() == FRACTION_FIELD) ! { ! fieldPos.setBeginIndex(dest.length()); ! fieldPos.setEndIndex(dest.length() + minimumFractionDigits); ! } ! } ! for (count = 0; count < minimumFractionDigits; ++count) ! dest.append(symbols.getZeroDigit()); ! dest.append((is_neg && negativeSuffix != null) ! ? negativeSuffix ! : positiveSuffix); ! return dest; ! } public DecimalFormatSymbols getDecimalFormatSymbols () ! { ! return symbols; ! } public int getGroupingSize () ! { ! return groupingSize; ! } public int getMultiplier () ! { ! return multiplier; ! } public String getNegativePrefix () ! { ! return negativePrefix; ! } public String getNegativeSuffix () ! { ! return negativeSuffix; ! } public String getPositivePrefix () ! { ! return positivePrefix; ! } public String getPositiveSuffix () ! { ! return positiveSuffix; ! } public int hashCode () ! { ! int hash = (negativeSuffix.hashCode() ^ negativePrefix.hashCode() ! ^positivePrefix.hashCode() ^ positiveSuffix.hashCode()); ! // FIXME. ! return hash; ! } public boolean isDecimalSeparatorAlwaysShown () ! { ! return decimalSeparatorAlwaysShown; ! } public Number parse (String str, ParsePosition pos) ! { ! // Our strategy is simple: copy the text into a buffer, ! // translating or omitting locale-specific information. Then ! // let Double or Long convert the number for us. ! boolean is_neg = false; ! int index = pos.getIndex(); ! StringBuffer buf = new StringBuffer (); // We have to check both prefixes, because one might be empty. // We want to pick the longest prefix that matches. ! boolean got_pos = str.startsWith(positivePrefix, index); ! String np = (negativePrefix != null ! ? negativePrefix ! : positivePrefix + symbols.getMinusSign()); ! boolean got_neg = str.startsWith(np, index); ! if (got_pos && got_neg) ! { ! // By checking this way, we preserve ambiguity in the case ! // where the negative format differs only in suffix. We ! // check this again later. ! if (np.length() > positivePrefix.length()) ! { ! is_neg = true; ! index += np.length(); ! } ! else ! index += positivePrefix.length(); ! } ! else if (got_neg) ! { ! is_neg = true; ! index += np.length(); ! } ! else if (got_pos) ! index += positivePrefix.length(); ! else ! { ! pos.setErrorIndex (index); ! return null; ! } ! // FIXME: handle Inf and NaN. // FIXME: do we have to respect minimum/maxmimum digit stuff? // What about leading zeros? What about multiplier? ! int start_index = index; ! int max = str.length(); ! char zero = symbols.getZeroDigit(); ! int last_group = -1; ! boolean int_part = true; ! boolean exp_part = false; ! for (; index < max; ++index) ! { ! char c = str.charAt(index); ! // FIXME: what about grouping size? ! if (groupingUsed && c == symbols.getGroupingSeparator()) ! { ! if (last_group != -1 ! && (index - last_group) % groupingSize != 0) ! { ! pos.setErrorIndex(index); ! return null; ! } ! last_group = index; ! } ! else if (c >= zero && c <= zero + 9) ! { ! buf.append((char) (c - zero + '0')); ! exp_part = false; ! } ! else if (parseIntegerOnly) ! break; ! else if (c == symbols.getDecimalSeparator()) ! { ! if (last_group != -1 ! && (index - last_group) % groupingSize != 0) ! { ! pos.setErrorIndex(index); ! return null; ! } ! buf.append('.'); ! int_part = false; ! } ! else if (c == symbols.getExponential()) ! { ! buf.append('E'); ! int_part = false; ! exp_part = true; ! } ! else if (exp_part ! && (c == '+' || c == '-' || c == symbols.getMinusSign())) ! { ! // For exponential notation. ! buf.append(c); ! } ! else ! break; ! } ! if (index == start_index) ! { ! // Didn't see any digits. ! pos.setErrorIndex(index); ! return null; ! } ! // Check the suffix. We must do this before converting the ! // buffer to a number to handle the case of a number which is ! // the most negative Long. ! boolean got_pos_suf = str.startsWith(positiveSuffix, index); ! String ns = (negativePrefix == null ? positiveSuffix : negativeSuffix); ! boolean got_neg_suf = str.startsWith(ns, index); ! if (is_neg) ! { ! if (! got_neg_suf) ! { ! pos.setErrorIndex(index); ! return null; ! } ! } ! else if (got_pos && got_neg && got_neg_suf) ! { ! is_neg = true; ! } ! else if (got_pos != got_pos_suf && got_neg != got_neg_suf) ! { ! pos.setErrorIndex(index); ! return null; ! } ! String suffix = is_neg ? ns : positiveSuffix; ! if (is_neg) ! buf.insert(0, '-'); ! String t = buf.toString(); ! Number result = null; ! try ! { ! result = new Long (t); ! } ! catch (NumberFormatException x1) ! { ! try ! { ! result = new Double (t); ! } ! catch (NumberFormatException x2) ! { ! } ! } ! if (result == null) ! { ! pos.setErrorIndex(index); ! return null; ! } ! pos.setIndex(index + suffix.length()); ! return result; ! } public void setDecimalFormatSymbols (DecimalFormatSymbols newSymbols) ! { ! symbols = newSymbols; ! } public void setDecimalSeparatorAlwaysShown (boolean newValue) ! { ! decimalSeparatorAlwaysShown = newValue; ! } public void setGroupingSize (int groupSize) ! { ! groupingSize = (byte) groupSize; ! } public void setMaximumFractionDigits (int newValue) ! { ! maximumFractionDigits = Math.min(newValue, 340); ! } public void setMaximumIntegerDigits (int newValue) ! { ! maximumIntegerDigits = Math.min(newValue, 309); ! } public void setMinimumFractionDigits (int newValue) ! { ! minimumFractionDigits = Math.min(newValue, 340); ! } public void setMinimumIntegerDigits (int newValue) ! { ! minimumIntegerDigits = Math.min(newValue, 309); ! } public void setMultiplier (int newValue) ! { ! multiplier = newValue; ! } public void setNegativePrefix (String newValue) ! { ! negativePrefix = newValue; ! } public void setNegativeSuffix (String newValue) ! { ! negativeSuffix = newValue; ! } public void setPositivePrefix (String newValue) ! { ! positivePrefix = newValue; ! } public void setPositiveSuffix (String newValue) ! { ! positiveSuffix = newValue; ! } private final void quoteFix (StringBuffer buf, String text, String patChars) ! { ! int len = text.length(); ! for (int index = 0; index < len; ++index) ! { ! char c = text.charAt(index); ! if (patChars.indexOf(c) != -1) ! { ! buf.append('\''); ! buf.append(c); ! buf.append('\''); ! } ! else buf.append(c); ! } ! } private final String computePattern (DecimalFormatSymbols syms) ! { ! StringBuffer mainPattern = new StringBuffer (); ! // We have to at least emit a zero for the minimum number of ! // digits. Past that we need hash marks up to the grouping ! // separator (and one beyond). ! int total_digits = Math.max(minimumIntegerDigits, ! groupingUsed ? groupingSize + 1: 0); ! for (int i = 0; i < total_digits - minimumIntegerDigits; ++i) ! mainPattern.append(syms.getDigit()); ! for (int i = total_digits - minimumIntegerDigits; i < total_digits; ++i) ! mainPattern.append(syms.getZeroDigit()); ! // Inserting the gropuing operator afterwards is easier. ! if (groupingUsed) ! mainPattern.insert(mainPattern.length() - groupingSize, ! syms.getGroupingSeparator()); ! // See if we need decimal info. ! if (minimumFractionDigits > 0 || maximumFractionDigits > 0 ! || decimalSeparatorAlwaysShown) ! mainPattern.append(syms.getDecimalSeparator()); ! for (int i = 0; i < minimumFractionDigits; ++i) ! mainPattern.append(syms.getZeroDigit()); ! for (int i = minimumFractionDigits; i < maximumFractionDigits; ++i) ! mainPattern.append(syms.getDigit()); ! if (useExponentialNotation) ! { ! mainPattern.append(syms.getExponential()); ! for (int i = 0; i < minExponentDigits; ++i) ! mainPattern.append(syms.getZeroDigit()); ! if (minExponentDigits == 0) ! mainPattern.append(syms.getDigit()); ! } ! String main = mainPattern.toString(); ! String patChars = patternChars (syms); ! mainPattern.setLength(0); ! quoteFix (mainPattern, positivePrefix, patChars); ! mainPattern.append(main); ! quoteFix (mainPattern, positiveSuffix, patChars); ! if (negativePrefix != null) ! { ! quoteFix (mainPattern, negativePrefix, patChars); ! mainPattern.append(main); ! quoteFix (mainPattern, negativeSuffix, patChars); ! } ! return mainPattern.toString(); ! } public String toLocalizedPattern () ! { ! return computePattern (symbols); ! } public String toPattern () ! { ! return computePattern (nonLocalizedSymbols); ! } // These names are fixed by the serialization spec. private boolean decimalSeparatorAlwaysShown; --- 60,991 ---- private final int scanFix (String pattern, int index, StringBuffer buf, String patChars, DecimalFormatSymbols syms, boolean is_suffix) ! { ! int len = pattern.length(); ! buf.setLength(0); ! boolean multiplierSet = false; ! while (index < len) ! { ! char c = pattern.charAt(index); ! if (c == '\'' && index + 1 < len ! && pattern.charAt(index + 1) == '\'') ! { buf.append(c); ! ++index; ! } ! else if (c == '\'' && index + 2 < len ! && pattern.charAt(index + 2) == '\'') ! { ! buf.append(pattern.charAt(index + 1)); ! index += 2; ! } ! else if (c == '\u00a4') ! { ! if (index + 1 < len && pattern.charAt(index + 1) == '\u00a4') ! { ! buf.append(syms.getInternationalCurrencySymbol()); ! ++index; ! } ! else ! buf.append(syms.getCurrencySymbol()); ! } ! else if (is_suffix && c == syms.getPercent()) ! { ! if (multiplierSet) ! throw new IllegalArgumentException ("multiplier already set " + ! "- index: " + index); ! multiplierSet = true; ! multiplier = 100; ! buf.append(c); ! } ! else if (is_suffix && c == syms.getPerMill()) ! { ! if (multiplierSet) ! throw new IllegalArgumentException ("multiplier already set " + ! "- index: " + index); ! multiplierSet = true; ! multiplier = 1000; ! buf.append(c); ! } ! else if (patChars.indexOf(c) != -1) ! { ! // This is a pattern character. ! break; ! } ! else ! buf.append(c); ! ++index; ! } ! return index; ! } // A helper which reads a number format. private final int scanFormat (String pattern, int index, String patChars, DecimalFormatSymbols syms, boolean is_positive) ! { ! int max = pattern.length(); ! int countSinceGroup = 0; ! int zeroCount = 0; ! boolean saw_group = false; ! // ! // Scan integer part. ! // ! while (index < max) ! { ! char c = pattern.charAt(index); ! if (c == syms.getDigit()) ! { ! if (zeroCount > 0) ! throw new IllegalArgumentException ("digit mark following " + ! "zero - index: " + index); ! ++countSinceGroup; ! } ! else if (c == syms.getZeroDigit()) ! { ! ++zeroCount; ! ++countSinceGroup; ! } ! else if (c == syms.getGroupingSeparator()) ! { ! countSinceGroup = 0; ! saw_group = true; ! } ! else ! break; ! ++index; ! } ! // We can only side-effect when parsing the positive format. ! if (is_positive) ! { ! groupingUsed = saw_group; ! groupingSize = (byte) countSinceGroup; ! minimumIntegerDigits = zeroCount; ! } ! // Early termination. ! if (index == max || pattern.charAt(index) == syms.getGroupingSeparator()) ! { ! if (is_positive) ! decimalSeparatorAlwaysShown = false; ! return index; ! } ! if (pattern.charAt(index) == syms.getDecimalSeparator()) ! { ! ++index; ! // ! // Scan fractional part. ! // ! int hashCount = 0; ! zeroCount = 0; ! while (index < max) ! { ! char c = pattern.charAt(index); ! if (c == syms.getZeroDigit()) ! { ! if (hashCount > 0) ! throw new IllegalArgumentException ("zero mark " + ! "following digit - index: " + index); ! ++zeroCount; ! } ! else if (c == syms.getDigit()) ! { ! ++hashCount; ! } ! else if (c != syms.getExponential() ! && c != syms.getPatternSeparator() ! && patChars.indexOf(c) != -1) ! throw new IllegalArgumentException ("unexpected special " + ! "character - index: " + index); ! else ! break; ! ++index; ! } ! if (is_positive) ! { ! maximumFractionDigits = hashCount + zeroCount; ! minimumFractionDigits = zeroCount; ! } ! if (index == max) ! return index; ! } ! if (pattern.charAt(index) == syms.getExponential()) ! { ! // ! // Scan exponential format. ! // ! zeroCount = 0; ! ++index; ! while (index < max) ! { ! char c = pattern.charAt(index); ! if (c == syms.getZeroDigit()) ! ++zeroCount; ! else if (c == syms.getDigit()) ! { ! if (zeroCount > 0) ! throw new ! IllegalArgumentException ("digit mark following zero " + ! "in exponent - index: " + ! index); ! } ! else if (patChars.indexOf(c) != -1) ! throw new IllegalArgumentException ("unexpected special " + ! "character - index: " + ! index); ! else ! break; ! ++index; ! } ! if (is_positive) ! { ! useExponentialNotation = true; ! minExponentDigits = (byte) zeroCount; ! } ! } ! return index; ! } // This helper function creates a string consisting of all the // characters which can appear in a pattern and must be quoted. private final String patternChars (DecimalFormatSymbols syms) ! { ! StringBuffer buf = new StringBuffer (); ! buf.append(syms.getDecimalSeparator()); ! buf.append(syms.getDigit()); ! buf.append(syms.getExponential()); ! buf.append(syms.getGroupingSeparator()); ! // Adding this one causes pattern application to fail. ! // Of course, omitting is causes toPattern to fail. ! // ... but we already have bugs there. FIXME. ! // buf.append(syms.getMinusSign()); ! buf.append(syms.getPatternSeparator()); ! buf.append(syms.getPercent()); ! buf.append(syms.getPerMill()); ! buf.append(syms.getZeroDigit()); ! buf.append('\u00a4'); ! return buf.toString(); ! } private final void applyPatternWithSymbols (String pattern, DecimalFormatSymbols syms) ! { ! // Initialize to the state the parser expects. ! negativePrefix = ""; ! negativeSuffix = ""; ! positivePrefix = ""; ! positiveSuffix = ""; ! decimalSeparatorAlwaysShown = false; ! groupingSize = 0; ! minExponentDigits = 0; ! multiplier = 1; ! useExponentialNotation = false; ! groupingUsed = false; ! maximumFractionDigits = 0; ! maximumIntegerDigits = 309; ! minimumFractionDigits = 0; ! minimumIntegerDigits = 1; ! StringBuffer buf = new StringBuffer (); ! String patChars = patternChars (syms); ! int max = pattern.length(); ! int index = scanFix (pattern, 0, buf, patChars, syms, false); ! positivePrefix = buf.toString(); ! index = scanFormat (pattern, index, patChars, syms, true); ! index = scanFix (pattern, index, buf, patChars, syms, true); ! positiveSuffix = buf.toString(); ! if (index == pattern.length()) ! { ! // No negative info. ! negativePrefix = null; ! negativeSuffix = null; ! } ! else ! { ! if (pattern.charAt(index) != syms.getPatternSeparator()) ! throw new IllegalArgumentException ("separator character " + ! "expected - index: " + index); ! index = scanFix (pattern, index + 1, buf, patChars, syms, false); ! negativePrefix = buf.toString(); ! // We parse the negative format for errors but we don't let ! // it side-effect this object. ! index = scanFormat (pattern, index, patChars, syms, false); ! index = scanFix (pattern, index, buf, patChars, syms, true); ! negativeSuffix = buf.toString(); ! if (index != pattern.length()) ! throw new IllegalArgumentException ("end of pattern expected " + ! "- index: " + index); ! } ! } public void applyLocalizedPattern (String pattern) ! { ! // JCL p. 638 claims this throws a ParseException but p. 629 ! // contradicts this. Empirical tests with patterns of "0,###.0" ! // and "#.#.#" corroborate the p. 629 statement that an ! // IllegalArgumentException is thrown. ! applyPatternWithSymbols (pattern, symbols); ! } public void applyPattern (String pattern) ! { ! // JCL p. 638 claims this throws a ParseException but p. 629 ! // contradicts this. Empirical tests with patterns of "0,###.0" ! // and "#.#.#" corroborate the p. 629 statement that an ! // IllegalArgumentException is thrown. ! applyPatternWithSymbols (pattern, nonLocalizedSymbols); ! } public Object clone () ! { ! DecimalFormat c = (DecimalFormat) super.clone (); ! c.symbols = (DecimalFormatSymbols) symbols.clone (); ! return c; ! } public DecimalFormat () ! { ! this ("#,##0.###"); ! } public DecimalFormat (String pattern) ! { ! this (pattern, new DecimalFormatSymbols ()); ! } public DecimalFormat (String pattern, DecimalFormatSymbols symbols) ! { ! this.symbols = symbols; ! applyPattern (pattern); ! } private final boolean equals (String s1, String s2) ! { ! if (s1 == null || s2 == null) ! return s1 == s2; ! return s1.equals(s2); ! } public boolean equals (Object obj) ! { ! if (! (obj instanceof DecimalFormat)) ! return false; ! DecimalFormat dup = (DecimalFormat) obj; ! return (decimalSeparatorAlwaysShown == dup.decimalSeparatorAlwaysShown ! && groupingSize == dup.groupingSize ! && minExponentDigits == dup.minExponentDigits ! && multiplier == dup.multiplier ! && equals(negativePrefix, dup.negativePrefix) ! && equals(negativeSuffix, dup.negativeSuffix) ! && equals(positivePrefix, dup.positivePrefix) ! && equals(positiveSuffix, dup.positiveSuffix) ! && symbols.equals(dup.symbols) ! && useExponentialNotation == dup.useExponentialNotation); ! } public StringBuffer format (double number, StringBuffer dest, FieldPosition fieldPos) ! { ! // A very special case. ! if (Double.isNaN(number)) ! { ! dest.append(symbols.getNaN()); ! if (fieldPos != null && fieldPos.getField() == INTEGER_FIELD) ! { ! int index = dest.length(); ! fieldPos.setBeginIndex(index - symbols.getNaN().length()); ! fieldPos.setEndIndex(index); ! } ! return dest; ! } ! boolean is_neg = number < 0; ! if (is_neg) ! { ! if (negativePrefix != null) ! dest.append(negativePrefix); ! else ! { ! dest.append(symbols.getMinusSign()); ! dest.append(positivePrefix); ! } ! number = - number; ! } ! else ! dest.append(positivePrefix); ! int integerBeginIndex = dest.length(); ! int integerEndIndex = 0; ! if (Double.isInfinite (number)) ! { ! dest.append(symbols.getInfinity()); ! integerEndIndex = dest.length(); ! } ! else ! { ! number *= multiplier; ! // Compute exponent. ! long exponent = 0; ! double baseNumber; ! if (useExponentialNotation) ! { ! exponent = (long) Math.floor (Math.log(number) / Math.log(10)); ! if (minimumIntegerDigits > 0) ! exponent -= minimumIntegerDigits - 1; ! baseNumber = (long) (number / Math.pow(10.0, exponent)); ! } ! else ! baseNumber = number; ! // Round to the correct number of digits. ! baseNumber += 5 * Math.pow(10.0, - maximumFractionDigits - 1); ! int index = dest.length(); ! double intPart = Math.floor(baseNumber); ! int count = 0; ! while (count < maximumIntegerDigits ! && (intPart > 0 || count < minimumIntegerDigits)) ! { ! long dig = (long) (intPart % 10); ! intPart = Math.floor(intPart / 10); ! // Append group separator if required. ! if (groupingUsed && count > 0 && count % groupingSize == 0) ! dest.insert(index, symbols.getGroupingSeparator()); ! dest.insert(index, (char) (symbols.getZeroDigit() + dig)); ! ++count; ! } ! integerEndIndex = dest.length(); ! int decimal_index = integerEndIndex; ! int consecutive_zeros = 0; ! int total_digits = 0; ! // Strip integer part from NUMBER. ! double fracPart = baseNumber - Math.floor(baseNumber); ! for (count = 0; ! count < maximumFractionDigits ! && (fracPart != 0 || count < minimumFractionDigits); ! ++count) ! { ! ++total_digits; ! fracPart *= 10; ! long dig = (long) fracPart; ! if (dig == 0) ! ++consecutive_zeros; ! else ! consecutive_zeros = 0; ! dest.append((char) (symbols.getZeroDigit() + dig)); ! // Strip integer part from FRACPART. ! fracPart = fracPart - Math.floor (fracPart); ! } ! // Strip extraneous trailing `0's. We can't always detect ! // these in the loop. ! int extra_zeros = Math.min (consecutive_zeros, ! total_digits - minimumFractionDigits); ! if (extra_zeros > 0) ! { ! dest.setLength(dest.length() - extra_zeros); ! total_digits -= extra_zeros; ! } ! // If required, add the decimal symbol. ! if (decimalSeparatorAlwaysShown ! || total_digits > 0) ! { ! dest.insert(decimal_index, symbols.getDecimalSeparator()); ! if (fieldPos != null && fieldPos.getField() == FRACTION_FIELD) ! { ! fieldPos.setBeginIndex(decimal_index + 1); ! fieldPos.setEndIndex(dest.length()); ! } ! } ! // Finally, print the exponent. ! if (useExponentialNotation) ! { ! dest.append(symbols.getExponential()); ! if (exponent < 0) ! { ! dest.append (symbols.getMinusSign ()); ! exponent = - exponent; ! } ! index = dest.length(); ! for (count = 0; ! exponent > 0 || count < minExponentDigits; ! ++count) ! { ! long dig = exponent % 10; ! exponent /= 10; ! dest.insert(index, (char) (symbols.getZeroDigit() + dig)); ! } ! } ! } ! if (fieldPos != null && fieldPos.getField() == INTEGER_FIELD) ! { ! fieldPos.setBeginIndex(integerBeginIndex); ! fieldPos.setEndIndex(integerEndIndex); ! } ! dest.append((is_neg && negativeSuffix != null) ! ? negativeSuffix ! : positiveSuffix); ! return dest; ! } public StringBuffer format (long number, StringBuffer dest, FieldPosition fieldPos) ! { ! // If using exponential notation, we just format as a double. ! if (useExponentialNotation) ! return format ((double) number, dest, fieldPos); ! boolean is_neg = number < 0; ! if (is_neg) ! { ! if (negativePrefix != null) ! dest.append(negativePrefix); ! else ! { ! dest.append(symbols.getMinusSign()); ! dest.append(positivePrefix); ! } ! number = - number; ! } ! else ! dest.append(positivePrefix); ! int integerBeginIndex = dest.length(); ! int index = dest.length(); ! int count = 0; ! while (count < maximumIntegerDigits ! && (number > 0 || count < minimumIntegerDigits)) ! { ! long dig = number % 10; ! number /= 10; ! // NUMBER and DIG will be less than 0 if the original number ! // was the most negative long. ! if (dig < 0) ! { ! dig = - dig; ! number = - number; ! } ! // Append group separator if required. ! if (groupingUsed && count > 0 && count % groupingSize == 0) ! dest.insert(index, symbols.getGroupingSeparator()); ! dest.insert(index, (char) (symbols.getZeroDigit() + dig)); ! ++count; ! } ! if (fieldPos != null && fieldPos.getField() == INTEGER_FIELD) ! { ! fieldPos.setBeginIndex(integerBeginIndex); ! fieldPos.setEndIndex(dest.length()); ! } ! if (decimalSeparatorAlwaysShown || minimumFractionDigits > 0) ! { ! dest.append(symbols.getDecimalSeparator()); ! if (fieldPos != null && fieldPos.getField() == FRACTION_FIELD) ! { ! fieldPos.setBeginIndex(dest.length()); ! fieldPos.setEndIndex(dest.length() + minimumFractionDigits); ! } ! } ! for (count = 0; count < minimumFractionDigits; ++count) ! dest.append(symbols.getZeroDigit()); ! dest.append((is_neg && negativeSuffix != null) ! ? negativeSuffix ! : positiveSuffix); ! return dest; ! } public DecimalFormatSymbols getDecimalFormatSymbols () ! { ! return symbols; ! } public int getGroupingSize () ! { ! return groupingSize; ! } public int getMultiplier () ! { ! return multiplier; ! } public String getNegativePrefix () ! { ! return negativePrefix; ! } public String getNegativeSuffix () ! { ! return negativeSuffix; ! } public String getPositivePrefix () ! { ! return positivePrefix; ! } public String getPositiveSuffix () ! { ! return positiveSuffix; ! } public int hashCode () ! { ! int hash = (negativeSuffix.hashCode() ^ negativePrefix.hashCode() ! ^positivePrefix.hashCode() ^ positiveSuffix.hashCode()); ! // FIXME. ! return hash; ! } public boolean isDecimalSeparatorAlwaysShown () ! { ! return decimalSeparatorAlwaysShown; ! } public Number parse (String str, ParsePosition pos) ! { ! // Our strategy is simple: copy the text into a buffer, ! // translating or omitting locale-specific information. Then ! // let Double or Long convert the number for us. ! boolean is_neg = false; ! int index = pos.getIndex(); ! StringBuffer buf = new StringBuffer (); // We have to check both prefixes, because one might be empty. // We want to pick the longest prefix that matches. ! boolean got_pos = str.startsWith(positivePrefix, index); ! String np = (negativePrefix != null ! ? negativePrefix ! : positivePrefix + symbols.getMinusSign()); ! boolean got_neg = str.startsWith(np, index); ! if (got_pos && got_neg) ! { ! // By checking this way, we preserve ambiguity in the case ! // where the negative format differs only in suffix. We ! // check this again later. ! if (np.length() > positivePrefix.length()) ! { ! is_neg = true; ! index += np.length(); ! } ! else ! index += positivePrefix.length(); ! } ! else if (got_neg) ! { ! is_neg = true; ! index += np.length(); ! } ! else if (got_pos) ! index += positivePrefix.length(); ! else ! { ! pos.setErrorIndex (index); ! return null; ! } ! // FIXME: handle Inf and NaN. // FIXME: do we have to respect minimum/maxmimum digit stuff? // What about leading zeros? What about multiplier? ! int start_index = index; ! int max = str.length(); ! char zero = symbols.getZeroDigit(); ! int last_group = -1; ! boolean int_part = true; ! boolean exp_part = false; ! for (; index < max; ++index) ! { ! char c = str.charAt(index); ! // FIXME: what about grouping size? ! if (groupingUsed && c == symbols.getGroupingSeparator()) ! { ! if (last_group != -1 ! && (index - last_group) % groupingSize != 0) ! { ! pos.setErrorIndex(index); ! return null; ! } ! last_group = index; ! } ! else if (c >= zero && c <= zero + 9) ! { ! buf.append((char) (c - zero + '0')); ! exp_part = false; ! } ! else if (parseIntegerOnly) ! break; ! else if (c == symbols.getDecimalSeparator()) ! { ! if (last_group != -1 ! && (index - last_group) % groupingSize != 0) ! { ! pos.setErrorIndex(index); ! return null; ! } ! buf.append('.'); ! int_part = false; ! } ! else if (c == symbols.getExponential()) ! { ! buf.append('E'); ! int_part = false; ! exp_part = true; ! } ! else if (exp_part ! && (c == '+' || c == '-' || c == symbols.getMinusSign())) ! { ! // For exponential notation. ! buf.append(c); ! } ! else ! break; ! } ! if (index == start_index) ! { ! // Didn't see any digits. ! pos.setErrorIndex(index); ! return null; ! } ! // Check the suffix. We must do this before converting the ! // buffer to a number to handle the case of a number which is ! // the most negative Long. ! boolean got_pos_suf = str.startsWith(positiveSuffix, index); ! String ns = (negativePrefix == null ? positiveSuffix : negativeSuffix); ! boolean got_neg_suf = str.startsWith(ns, index); ! if (is_neg) ! { ! if (! got_neg_suf) ! { ! pos.setErrorIndex(index); ! return null; ! } ! } ! else if (got_pos && got_neg && got_neg_suf) ! { ! is_neg = true; ! } ! else if (got_pos != got_pos_suf && got_neg != got_neg_suf) ! { ! pos.setErrorIndex(index); ! return null; ! } ! String suffix = is_neg ? ns : positiveSuffix; ! if (is_neg) ! buf.insert(0, '-'); ! String t = buf.toString(); ! Number result = null; ! try ! { ! result = new Long (t); ! } ! catch (NumberFormatException x1) ! { ! try ! { ! result = new Double (t); ! } ! catch (NumberFormatException x2) ! { ! } ! } ! if (result == null) ! { ! pos.setErrorIndex(index); ! return null; ! } ! pos.setIndex(index + suffix.length()); ! return result; ! } public void setDecimalFormatSymbols (DecimalFormatSymbols newSymbols) ! { ! symbols = newSymbols; ! } public void setDecimalSeparatorAlwaysShown (boolean newValue) ! { ! decimalSeparatorAlwaysShown = newValue; ! } public void setGroupingSize (int groupSize) ! { ! groupingSize = (byte) groupSize; ! } public void setMaximumFractionDigits (int newValue) ! { ! maximumFractionDigits = Math.min(newValue, 340); ! } public void setMaximumIntegerDigits (int newValue) ! { ! maximumIntegerDigits = Math.min(newValue, 309); ! } public void setMinimumFractionDigits (int newValue) ! { ! minimumFractionDigits = Math.min(newValue, 340); ! } public void setMinimumIntegerDigits (int newValue) ! { ! minimumIntegerDigits = Math.min(newValue, 309); ! } public void setMultiplier (int newValue) ! { ! multiplier = newValue; ! } public void setNegativePrefix (String newValue) ! { ! negativePrefix = newValue; ! } public void setNegativeSuffix (String newValue) ! { ! negativeSuffix = newValue; ! } public void setPositivePrefix (String newValue) ! { ! positivePrefix = newValue; ! } public void setPositiveSuffix (String newValue) ! { ! positiveSuffix = newValue; ! } private final void quoteFix (StringBuffer buf, String text, String patChars) ! { ! int len = text.length(); ! for (int index = 0; index < len; ++index) ! { ! char c = text.charAt(index); ! if (patChars.indexOf(c) != -1) ! { ! buf.append('\''); buf.append(c); ! buf.append('\''); ! } ! else ! buf.append(c); ! } ! } private final String computePattern (DecimalFormatSymbols syms) ! { ! StringBuffer mainPattern = new StringBuffer (); ! // We have to at least emit a zero for the minimum number of ! // digits. Past that we need hash marks up to the grouping ! // separator (and one beyond). ! int total_digits = Math.max(minimumIntegerDigits, ! groupingUsed ? groupingSize + 1: 0); ! for (int i = 0; i < total_digits - minimumIntegerDigits; ++i) ! mainPattern.append(syms.getDigit()); ! for (int i = total_digits - minimumIntegerDigits; i < total_digits; ++i) ! mainPattern.append(syms.getZeroDigit()); ! // Inserting the gropuing operator afterwards is easier. ! if (groupingUsed) ! mainPattern.insert(mainPattern.length() - groupingSize, ! syms.getGroupingSeparator()); ! // See if we need decimal info. ! if (minimumFractionDigits > 0 || maximumFractionDigits > 0 ! || decimalSeparatorAlwaysShown) ! mainPattern.append(syms.getDecimalSeparator()); ! for (int i = 0; i < minimumFractionDigits; ++i) ! mainPattern.append(syms.getZeroDigit()); ! for (int i = minimumFractionDigits; i < maximumFractionDigits; ++i) ! mainPattern.append(syms.getDigit()); ! if (useExponentialNotation) ! { ! mainPattern.append(syms.getExponential()); ! for (int i = 0; i < minExponentDigits; ++i) ! mainPattern.append(syms.getZeroDigit()); ! if (minExponentDigits == 0) ! mainPattern.append(syms.getDigit()); ! } ! String main = mainPattern.toString(); ! String patChars = patternChars (syms); ! mainPattern.setLength(0); ! quoteFix (mainPattern, positivePrefix, patChars); ! mainPattern.append(main); ! quoteFix (mainPattern, positiveSuffix, patChars); ! if (negativePrefix != null) ! { ! quoteFix (mainPattern, negativePrefix, patChars); ! mainPattern.append(main); ! quoteFix (mainPattern, negativeSuffix, patChars); ! } ! return mainPattern.toString(); ! } public String toLocalizedPattern () ! { ! return computePattern (symbols); ! } public String toPattern () ! { ! return computePattern (nonLocalizedSymbols); ! } // These names are fixed by the serialization spec. private boolean decimalSeparatorAlwaysShown; diff -Nrc3pad gcc-3.0.4/libjava/java/text/DecimalFormatSymbols.java gcc-3.1/libjava/java/text/DecimalFormatSymbols.java *** gcc-3.0.4/libjava/java/text/DecimalFormatSymbols.java Wed Dec 6 21:14:14 2000 --- gcc-3.1/libjava/java/text/DecimalFormatSymbols.java Tue Jan 22 22:40:37 2002 *************** *** 1,12 **** ! // DecimalFormatSymbols.java - Symbols used to format numbers. ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; --- 1,40 ---- ! /* DecimalFormatSymbols.java -- Format symbols used by DecimalFormat ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** import java.io.ObjectInputStream; *** 18,319 **** import java.io.IOException; /** * @author Tom Tromey * @date February 24, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Believed complete and correct to 1.2. */ - public final class DecimalFormatSymbols implements Cloneable, Serializable { public Object clone () ! { ! return new DecimalFormatSymbols (this); ! } ! ! private DecimalFormatSymbols (DecimalFormatSymbols orig) ! { ! this.currencySymbol = orig.currencySymbol; ! this.decimalSeparator = orig.decimalSeparator; ! this.digit = orig.digit; ! this.exponential = orig.exponential; ! this.groupingSeparator = orig.groupingSeparator; ! this.infinity = orig.infinity; ! this.intlCurrencySymbol = orig.intlCurrencySymbol; ! this.monetarySeparator = orig.monetarySeparator; ! this.minusSign = orig.minusSign; ! this.NaN = orig.NaN; ! this.patternSeparator = orig.patternSeparator; ! this.percent = orig.percent; ! this.perMill = orig.perMill; ! this.zeroDigit = orig.zeroDigit; ! } public DecimalFormatSymbols () ! { ! this (Locale.getDefault()); ! } private final String safeGetString (ResourceBundle bundle, String name, String def) ! { ! if (bundle != null) ! { ! try ! { ! return bundle.getString(name); ! } ! catch (MissingResourceException x) ! { ! } ! } ! return def; ! } private final char safeGetChar (ResourceBundle bundle, String name, char def) ! { ! String r = null; ! if (bundle != null) ! { ! try ! { ! r = bundle.getString(name); ! } ! catch (MissingResourceException x) ! { ! } ! } ! if (r == null || r.length() < 1) ! return def; ! return r.charAt(0); ! } public DecimalFormatSymbols (Locale loc) ! { ! ResourceBundle res; ! try ! { ! res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc); ! } ! catch (MissingResourceException x) ! { ! res = null; ! } ! currencySymbol = safeGetString (res, "currencySymbol", "$"); ! decimalSeparator = safeGetChar (res, "decimalSeparator", '.'); ! digit = safeGetChar (res, "digit", '#'); ! exponential = safeGetChar (res, "exponential", 'E'); ! groupingSeparator = safeGetChar (res, "groupingSeparator", ','); ! infinity = safeGetString (res, "infinity", "\u221e"); ! // FIXME: default? ! intlCurrencySymbol = safeGetString (res, "intlCurrencySymbol", "$"); ! try ! { ! monetarySeparator = safeGetChar (res, "monetarySeparator", '.'); ! } ! catch (MissingResourceException x) ! { ! monetarySeparator = decimalSeparator; ! } ! minusSign = safeGetChar (res, "minusSign", '-'); ! NaN = safeGetString (res, "NaN", "\ufffd"); ! patternSeparator = safeGetChar (res, "patternSeparator", ';'); ! percent = safeGetChar (res, "percent", '%'); ! perMill = safeGetChar (res, "perMill", '\u2030'); ! zeroDigit = safeGetChar (res, "zeroDigit", '0'); ! } public boolean equals (Object obj) ! { ! if (! (obj instanceof DecimalFormatSymbols)) ! return false; ! DecimalFormatSymbols dfs = (DecimalFormatSymbols) obj; ! return (currencySymbol.equals(dfs.currencySymbol) ! && decimalSeparator == dfs.decimalSeparator ! && digit == dfs.digit ! && exponential == dfs.exponential ! && groupingSeparator == dfs.groupingSeparator ! && infinity.equals(dfs.infinity) ! && intlCurrencySymbol.equals(dfs.intlCurrencySymbol) ! && minusSign == dfs.minusSign ! && monetarySeparator == dfs.monetarySeparator ! && NaN.equals(dfs.NaN) ! && patternSeparator == dfs.patternSeparator ! && percent == dfs.percent ! && perMill == dfs.perMill ! && zeroDigit == dfs.zeroDigit); ! } public String getCurrencySymbol () ! { ! return currencySymbol; ! } public char getDecimalSeparator () ! { ! return decimalSeparator; ! } public char getDigit () ! { ! return digit; ! } // This is our own extension. char getExponential () ! { ! return exponential; ! } public char getGroupingSeparator () ! { ! return groupingSeparator; ! } public String getInfinity () ! { ! return infinity; ! } public String getInternationalCurrencySymbol () ! { ! return intlCurrencySymbol; ! } public char getMinusSign () ! { ! return minusSign; ! } public char getMonetaryDecimalSeparator () ! { ! return monetarySeparator; ! } public String getNaN () ! { ! return NaN; ! } public char getPatternSeparator () ! { ! return patternSeparator; ! } public char getPercent () ! { ! return percent; ! } public char getPerMill () ! { ! return perMill; ! } public char getZeroDigit () ! { ! return zeroDigit; ! } public int hashCode () ! { ! // Compute based on zero digit, grouping separator, and decimal ! // separator -- JCL book. This probably isn't a very good hash ! // code. ! return zeroDigit << 16 + groupingSeparator << 8 + decimalSeparator; ! } public void setCurrencySymbol (String currency) ! { ! currencySymbol = currency; ! } public void setDecimalSeparator (char decimalSep) ! { ! decimalSeparator = decimalSep; ! } public void setDigit (char digit) ! { ! this.digit = digit; ! } // This is our own extension. void setExponential (char exp) ! { ! exponential = exp; ! } public void setGroupingSeparator (char groupSep) ! { ! groupingSeparator = groupSep; ! } public void setInfinity (String infinity) ! { ! this.infinity = infinity; ! } public void setInternationalCurrencySymbol (String currency) ! { ! intlCurrencySymbol = currency; ! } public void setMinusSign (char minusSign) ! { ! this.minusSign = minusSign; ! } public void setMonetaryDecimalSeparator (char decimalSep) ! { ! monetarySeparator = decimalSep; ! } public void setNaN (String nan) ! { ! NaN = nan; ! } public void setPatternSeparator (char patternSep) ! { ! patternSeparator = patternSep; ! } public void setPercent (char percent) ! { ! this.percent = percent; ! } public void setPerMill (char perMill) ! { ! this.perMill = perMill; ! } public void setZeroDigit (char zeroDigit) ! { ! this.zeroDigit = zeroDigit; ! } ! // The names of the instance variables are fixed by the ! // serialization spec. private String currencySymbol; private char decimalSeparator; private char digit; private char exponential; private char groupingSeparator; private String infinity; private String intlCurrencySymbol; private char minusSign; private char monetarySeparator; private String NaN; private char patternSeparator; private char percent; private char perMill; private int serialVersionOnStream = 1; private char zeroDigit; private static final long serialVersionUID = 5772796243397350300L; private void readObject(ObjectInputStream stream) --- 46,569 ---- import java.io.IOException; /** + * This class is a container for the symbols used by + * DecimalFormat to format numbers and currency. These are + * normally handled automatically, but an application can override + * values as desired using this class. + * * @author Tom Tromey + * @author Aaron M. Renn (arenn@urbanophile.com) * @date February 24, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Believed complete and correct to 1.2. */ public final class DecimalFormatSymbols implements Cloneable, Serializable { public Object clone () ! { ! try ! { ! return super.clone (); ! } ! catch(CloneNotSupportedException e) ! { ! return null; ! } ! } + /** + * This method initializes a new instance of + * DecimalFormatSymbols for the default locale. + */ public DecimalFormatSymbols () ! { ! this (Locale.getDefault()); ! } private final String safeGetString (ResourceBundle bundle, String name, String def) ! { ! if (bundle != null) ! { ! try ! { ! return bundle.getString(name); ! } ! catch (MissingResourceException x) ! { ! } ! } ! return def; ! } private final char safeGetChar (ResourceBundle bundle, String name, char def) ! { ! String r = null; ! if (bundle != null) ! { ! try ! { ! r = bundle.getString(name); ! } ! catch (MissingResourceException x) ! { ! } ! } ! if (r == null || r.length() < 1) ! return def; ! return r.charAt(0); ! } + /** + * This method initializes a new instance of + * DecimalFormatSymbols for the specified locale. + * + * @param locale The local to load symbols for. + */ public DecimalFormatSymbols (Locale loc) ! { ! ResourceBundle res; ! try ! { ! res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", ! loc); ! } ! catch (MissingResourceException x) ! { ! res = null; ! } ! currencySymbol = safeGetString (res, "currencySymbol", "$"); ! decimalSeparator = safeGetChar (res, "decimalSeparator", '.'); ! digit = safeGetChar (res, "digit", '#'); ! exponential = safeGetChar (res, "exponential", 'E'); ! groupingSeparator = safeGetChar (res, "groupingSeparator", ','); ! infinity = safeGetString (res, "infinity", "\u221e"); ! // FIXME: default? ! intlCurrencySymbol = safeGetString (res, "intlCurrencySymbol", "$"); ! try ! { ! monetarySeparator = safeGetChar (res, "monetarySeparator", '.'); ! } ! catch (MissingResourceException x) ! { ! monetarySeparator = decimalSeparator; ! } ! minusSign = safeGetChar (res, "minusSign", '-'); ! NaN = safeGetString (res, "NaN", "\ufffd"); ! patternSeparator = safeGetChar (res, "patternSeparator", ';'); ! percent = safeGetChar (res, "percent", '%'); ! perMill = safeGetChar (res, "perMill", '\u2030'); ! zeroDigit = safeGetChar (res, "zeroDigit", '0'); ! } + /** + * This method this this object for equality against the specified object. + * This will be true if and only if the following criteria are met with + * regard to the specified object: + *

        + *

          + *
        • It is not null. + *
        • It is an instance of DecimalFormatSymbols + *
        • All of its symbols are identical to the symbols in this object. + *
        + * + * @return true if the specified object is equal to this + * object, false otherwise. + */ public boolean equals (Object obj) ! { ! if (! (obj instanceof DecimalFormatSymbols)) ! return false; ! DecimalFormatSymbols dfs = (DecimalFormatSymbols) obj; ! return (currencySymbol.equals(dfs.currencySymbol) ! && decimalSeparator == dfs.decimalSeparator ! && digit == dfs.digit ! && exponential == dfs.exponential ! && groupingSeparator == dfs.groupingSeparator ! && infinity.equals(dfs.infinity) ! && intlCurrencySymbol.equals(dfs.intlCurrencySymbol) ! && minusSign == dfs.minusSign ! && monetarySeparator == dfs.monetarySeparator ! && NaN.equals(dfs.NaN) ! && patternSeparator == dfs.patternSeparator ! && percent == dfs.percent ! && perMill == dfs.perMill ! && zeroDigit == dfs.zeroDigit); ! } + /** + * This method returns the currency symbol in local format. For example, + * "$" for Canadian dollars. + * + * @return The currency symbol in local format. + */ public String getCurrencySymbol () ! { ! return currencySymbol; ! } + /** + * This method returns the character used as the decimal point. + * + * @return The character used as the decimal point. + */ public char getDecimalSeparator () ! { ! return decimalSeparator; ! } + /** + * This method returns the character used to represent a digit in a + * format pattern string. + * + * @return The character used to represent a digit in a format + * pattern string. + */ public char getDigit () ! { ! return digit; ! } // This is our own extension. char getExponential () ! { ! return exponential; ! } + /** + * This method sets the character used to separate groups of digits. For + * example, the United States uses a comma (,) to separate thousands in + * a number. + * + * @return The character used to separate groups of digits. + */ public char getGroupingSeparator () ! { ! return groupingSeparator; ! } + /** + * This method returns the character used to represent infinity. + * + * @return The character used to represent infinity. + */ public String getInfinity () ! { ! return infinity; ! } + /** + * This method returns the currency symbol in international format. For + * example, "C$" for Canadian dollars. + * + * @return The currency symbol in international format. + */ public String getInternationalCurrencySymbol () ! { ! return intlCurrencySymbol; ! } + /** + * This method returns the character used to represent the minus sign. + * + * @return The character used to represent the minus sign. + */ public char getMinusSign () ! { ! return minusSign; ! } + /** + * This method returns the character used to represent the decimal + * point for currency values. + * + * @return The decimal point character used in currency values. + */ public char getMonetaryDecimalSeparator () ! { ! return monetarySeparator; ! } + /** + * This method returns the string used to represent the NaN (not a number) + * value. + * + * @return The string used to represent NaN + */ public String getNaN () ! { ! return NaN; ! } + /** + * This method returns the character used to separate positive and negative + * subpatterns in a format pattern. + * + * @return The character used to separate positive and negative subpatterns + * in a format pattern. + */ public char getPatternSeparator () ! { ! return patternSeparator; ! } + /** + * This method returns the character used as the percent sign. + * + * @return The character used as the percent sign. + */ public char getPercent () ! { ! return percent; ! } + /** + * This method returns the character used as the per mille character. + * + * @return The per mille character. + */ public char getPerMill () ! { ! return perMill; ! } + /** + * This method returns the character used to represent the digit zero. + * + * @return The character used to represent the digit zero. + */ public char getZeroDigit () ! { ! return zeroDigit; ! } + /** + * This method returns a hash value for this object. + * + * @return A hash value for this object. + */ public int hashCode () ! { ! // Compute based on zero digit, grouping separator, and decimal ! // separator -- JCL book. This probably isn't a very good hash ! // code. ! return zeroDigit << 16 + groupingSeparator << 8 + decimalSeparator; ! } + /** + * This method sets the currency symbol to the specified value. + * + * @param currencySymbol The new currency symbol + */ public void setCurrencySymbol (String currency) ! { ! currencySymbol = currency; ! } + /** + * This method sets the decimal point character to the specified value. + * + * @param decimalSeparator The new decimal point character + */ public void setDecimalSeparator (char decimalSep) ! { ! decimalSeparator = decimalSep; ! } + /** + * This method sets the character used to represents a digit in a format + * string to the specified value. + * + * @param digit The character used to represent a digit in a format pattern. + */ public void setDigit (char digit) ! { ! this.digit = digit; ! } // This is our own extension. void setExponential (char exp) ! { ! exponential = exp; ! } + /** + * This method sets the character used to separate groups of digits. + * + * @param groupingSeparator The character used to separate groups of digits. + */ public void setGroupingSeparator (char groupSep) ! { ! groupingSeparator = groupSep; ! } + /** + * This method sets the string used to represents infinity. + * + * @param infinity The string used to represent infinity. + */ public void setInfinity (String infinity) ! { ! this.infinity = infinity; ! } + /** + * This method sets the international currency symbols to the + * specified value. + * + * @param intlCurrencySymbol The new international currency symbol. + */ public void setInternationalCurrencySymbol (String currency) ! { ! intlCurrencySymbol = currency; ! } + /** + * This method sets the character used to represent the minus sign. + * + * @param minusSign The character used to represent the minus sign. + */ public void setMinusSign (char minusSign) ! { ! this.minusSign = minusSign; ! } + /** + * This method sets the character used for the decimal point in currency + * values. + * + * @param monetarySeparator The decimal point character used in + * currency values. + */ public void setMonetaryDecimalSeparator (char decimalSep) ! { ! monetarySeparator = decimalSep; ! } + /** + * This method sets the string used to represent the NaN (not a + * number) value. + * + * @param NaN The string used to represent NaN + */ public void setNaN (String nan) ! { ! NaN = nan; ! } + /** + * This method sets the character used to separate positive and negative + * subpatterns in a format pattern. + * + * @param patternSeparator The character used to separate positive and + * negative subpatterns in a format pattern. + */ public void setPatternSeparator (char patternSep) ! { ! patternSeparator = patternSep; ! } + /** + * This method sets the character used as the percent sign. + * + * @param percent The character used as the percent sign. + */ public void setPercent (char percent) ! { ! this.percent = percent; ! } + /** + * This method sets the character used as the per mille character. + * + * @param perMill The per mille character. + */ public void setPerMill (char perMill) ! { ! this.perMill = perMill; ! } + /** + * This method sets the character used to represent the digit zero. + * + * @param zeroDigit The character used to represent the digit zero. + */ public void setZeroDigit (char zeroDigit) ! { ! this.zeroDigit = zeroDigit; ! } ! /** ! * @serial A string used for the local currency ! */ private String currencySymbol; + /** + * @serial The char used to separate decimals in a number. + */ private char decimalSeparator; + /** + * @serial This is the char used to represent a digit in + * a format specification. + */ private char digit; + /** + * @serial This is the char used to represent the exponent + * separator in exponential notation. + */ private char exponential; + /** + * @serial This separates groups of thousands in numbers. + */ private char groupingSeparator; + /** + * @serial This string represents infinity. + */ private String infinity; + /** + * @serial This string represents the local currency in an international + * context, eg, "C$" for Canadian dollars. + */ private String intlCurrencySymbol; + /** + * @serial This is the character used to represent the minus sign. + */ private char minusSign; + /** + * @serial This character is used to separate decimals when formatting + * currency values. + */ private char monetarySeparator; + /** + * @serial This string is used the represent the Java NaN value for + * "not a number". + */ private String NaN; + /** + * @serial This is the character used to separate positive and negative + * subpatterns in a format pattern. + */ private char patternSeparator; + /** + * @serial This is the percent symbols + */ private char percent; + /** + * @serial This character is used for the mille percent sign. + */ private char perMill; + /** + * @serial This value represents the type of object being de-serialized. + * 0 indicates a pre-Java 1.1.6 version, 1 indicates 1.1.6 or later. + */ private int serialVersionOnStream = 1; + /** + * @serial This is the character used to represent 0. + */ private char zeroDigit; + private static final long serialVersionUID = 5772796243397350300L; private void readObject(ObjectInputStream stream) diff -Nrc3pad gcc-3.0.4/libjava/java/text/FieldPosition.java gcc-3.1/libjava/java/text/FieldPosition.java *** gcc-3.0.4/libjava/java/text/FieldPosition.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/text/FieldPosition.java Tue Jan 22 22:40:37 2002 *************** *** 1,65 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; /** * @author Per Bothner - * @date October 25, 1998. - */ - /* Written using "Java Class Libraries", 2nd edition, plus online - * API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct. - * Includes JDK 1.2 methods. */ - public class FieldPosition { ! int field; ! int beginIndex; ! int endIndex; ! public FieldPosition (int field) { ! this.field = field; } public int getField () { ! return field; } public int getBeginIndex () { ! return beginIndex; } ! public int getEndIndex () { ! return endIndex; } ! public void setBeginIndex (int index) { ! beginIndex = index; } ! public void setEndIndex (int index) { ! endIndex = index; } public boolean equals (Object obj) { if (! (obj instanceof FieldPosition)) return false; ! FieldPosition other = (FieldPosition) obj; ! return (field == other.field ! && beginIndex == other.beginIndex && endIndex == other.endIndex); } } --- 1,166 ---- ! /* FieldPosition.java -- Keeps track of field positions while formatting ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; /** + * This class is used by the java.text formatting classes to track + * field positions. A field position is defined by an identifier value + * and begin and end index positions. The formatting classes in java.text + * typically define constant values for the field identifiers. + * + * @author Aaron M. Renn (arenn@urbanophile.com) * @author Per Bothner */ public class FieldPosition { ! /** ! * This is the field identifier value. ! */ ! private int field_id; ! /** ! * This is the beginning index of the field. ! */ ! private int begin; ! ! /** ! * This is the ending index of the field. ! */ ! private int end; ! ! /** ! * This method initializes a new instance of FieldPosition to ! * have the specified field id. ! * ! * @param field_id The field identifier value. ! */ ! public FieldPosition (int field_id) { ! this.field_id = field_id; } + /** + * This method returns the field identifier value for this object. + * + * @return The field identifier. + */ public int getField () { ! return field_id; } + /** + * This method returns the beginning index for this field. + * + * @return The beginning index. + */ public int getBeginIndex () { ! return begin; } ! /** ! * This method sets the beginning index of this field to the specified value. ! * ! * @param begin The new beginning index. ! */ ! public void setBeginIndex (int begin) { ! this.begin = begin; } ! /** ! * This method returns the ending index for the field. ! * ! * @return The ending index. ! */ ! public int getEndIndex () { ! return end; } ! /** ! * This method sets the ending index of this field to the specified value. ! * ! * @param end The new ending index. ! */ ! public void setEndIndex (int end) { ! this.end = end; } + /** + * This method tests this object for equality against the specified object. + * The objects will be considered equal if and only if: + *

        + *

          + *
        • The specified object is not null. + *
        • The specified object is an instance of FieldPosition. + *
        • The specified object has the same field identifier and beginning + * and ending index as this object. + *
        + * + * @param obj The object to test for equality to this object. + * + * @return true if the specified object is equal to + * this object, false otherwise. + */ public boolean equals (Object obj) { if (! (obj instanceof FieldPosition)) return false; ! ! FieldPosition fp = (FieldPosition) obj; ! return (field_id == fp.field_id ! && begin == fp.begin ! && end == fp.end); ! } ! ! /** ! * This method returns a String representation of this ! * object. ! * ! * @return A String representation of this object. ! */ ! public String toString () ! { ! return (getClass ().getName () + "[field=" + getField () + ",beginIndex=" ! + getBeginIndex () + ",endIndex=" + getEndIndex () + "]"); } } diff -Nrc3pad gcc-3.0.4/libjava/java/text/Format.java gcc-3.1/libjava/java/text/Format.java *** gcc-3.0.4/libjava/java/text/Format.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/text/Format.java Tue Jan 22 22:40:37 2002 *************** *** 1,44 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; /** * @author Per Bothner - * @date October 25, 1998. */ ! /* Written using "Java Class Libraries", 2nd edition, plus online ! * API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct. ! */ ! ! public abstract class Format implements java.io.Serializable, Cloneable { public Format () { } ! public abstract StringBuffer format (Object obj, ! StringBuffer sbuf, FieldPosition pos); ! ! public final String format (Object obj) { ! StringBuffer sbuf = new StringBuffer(); ! format(obj, sbuf, new FieldPosition(0)); ! return sbuf.toString(); } ! public abstract Object parseObject (String source, ParsePosition pos); ! public Object parseObject (String source) throws ParseException { ParsePosition pos = new ParsePosition(0); ! Object result = parseObject (source, pos); if (result == null) { int index = pos.getErrorIndex(); --- 1,122 ---- ! /* Format.java -- Abstract superclass for formatting/parsing strings. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; + import java.io.Serializable; + /** + * This class is the abstract superclass of classes that format and parse + * data to/from Strings. It is guaranteed that any + * String produced by a concrete subclass of Format + * will be parseable by that same subclass. + *

        + * In addition to implementing the abstract methods in this class, subclasses + * should provide static factory methods of the form + * getInstance() and getInstance(Locale) if the + * subclass loads different formatting/parsing schemes based on locale. + * These subclasses should also implement a static method called + * getAvailableLocales() which returns an array of + * available locales in the current runtime environment. + * + * @author Aaron M. Renn (arenn@urbanophile.com) * @author Per Bothner */ ! public abstract class Format implements Serializable, Cloneable { + /** + * This method initializes a new instance of Format. + * It performs no actions, but acts as a default constructor for + * subclasses. + */ public Format () { } ! /** ! * This method formats an Object into a String. ! * ! * @param obj The Object to format. ! * ! * @return The formatted String. ! * ! * @exception IllegalArgumentException If the Object ! * cannot be formatted. ! */ ! public final String format(Object obj) throws IllegalArgumentException { ! StringBuffer sb = new StringBuffer (); ! format (obj, sb, new FieldPosition (0)); ! return sb.toString (); } ! /** ! * This method formats an Object into a String and ! * appends the String to a StringBuffer. ! * ! * @param obj The Object to format. ! * @param sb The StringBuffer to append to. ! * @param pos The desired FieldPosition, which is also ! * updated by this call. ! * ! * @return The updated StringBuffer. ! * ! * @exception IllegalArgumentException If the Object ! * cannot be formatted. ! */ ! public abstract StringBuffer format (Object obj, StringBuffer sb, ! FieldPosition pos) ! throws IllegalArgumentException; ! /** ! * This method parses a String and converts the parsed ! * contents into an Object. ! * ! * @param str The String to parse. ! * ! * @return The resulting Object. ! * ! * @exception ParseException If the String cannot be parsed. ! */ ! public Object parseObject (String str) throws ParseException { ParsePosition pos = new ParsePosition(0); ! Object result = parseObject (str, pos); if (result == null) { int index = pos.getErrorIndex(); *************** public abstract class Format implements *** 49,56 **** return result; } public Object clone () { ! return super.clone (); } } --- 127,159 ---- return result; } + /** + * This method parses a String and converts the parsed + * contents into an Object. + * + * @param str The String to parse. + * @param pos The starting parse index on input, the ending parse + * index on output. + * + * @return The parsed Object, or null in + * case of error. + */ + public abstract Object parseObject (String str, ParsePosition pos); + + /** + * Creates a copy of this object. + * + * @return The copied Object. + */ public Object clone () { ! try ! { ! return super.clone (); ! } ! catch (CloneNotSupportedException e) ! { ! return null; ! } } } diff -Nrc3pad gcc-3.0.4/libjava/java/text/MessageFormat.java gcc-3.1/libjava/java/text/MessageFormat.java *** gcc-3.0.4/libjava/java/text/MessageFormat.java Mon Apr 2 19:55:21 2001 --- gcc-3.1/libjava/java/text/MessageFormat.java Tue Jan 22 22:40:37 2002 *************** *** 1,12 **** ! // MessageFormat.java - Localized message formatting. ! /* Copyright (C) 1999, 2001 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; --- 1,40 ---- ! /* MessageFormat.java - Localized message formatting. ! Copyright (C) 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** import java.util.Vector; *** 16,21 **** --- 44,50 ---- /** * @author Tom Tromey + * @author Jorge Aliss * @date March 3, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online *************** import java.util.Vector; *** 23,29 **** * Status: Believed complete and correct to 1.2, except serialization. * and parsing. */ - final class MessageFormatElement { // Argument number. --- 52,57 ---- *************** final class MessageFormatElement *** 47,123 **** // Recompute the locale-based formatter. void setLocale (Locale loc) ! { ! if (type == null) ! ; ! else if (type.equals("number")) ! { ! formatClass = java.lang.Number.class; ! if (style == null) ! format = NumberFormat.getInstance(loc); ! else if (style.equals("currency")) ! format = NumberFormat.getCurrencyInstance(loc); ! else if (style.equals("percent")) ! format = NumberFormat.getPercentInstance(loc); ! else if (style.equals("integer")) ! { ! NumberFormat nf = NumberFormat.getNumberInstance(loc); ! nf.setMaximumFractionDigits(0); ! nf.setGroupingUsed(false); ! format = nf; ! } ! else ! { ! format = NumberFormat.getNumberInstance(loc); ! DecimalFormat df = (DecimalFormat) format; ! try ! { ! df.applyPattern(style); ! } ! catch (ParseException x) ! { ! throw new IllegalArgumentException (x.getMessage()); ! } ! } ! } ! else if (type.equals("time") || type.equals("date")) ! { ! formatClass = java.util.Date.class; ! int val = DateFormat.DEFAULT; ! if (style == null) ! ; ! else if (style.equals("short")) ! val = DateFormat.SHORT; ! else if (style.equals("medium")) ! val = DateFormat.MEDIUM; ! else if (style.equals("long")) ! val = DateFormat.LONG; ! else if (style.equals("full")) ! val = DateFormat.FULL; ! if (type.equals("time")) ! format = DateFormat.getTimeInstance(val, loc); ! else ! format = DateFormat.getDateInstance(val, loc); ! if (style != null && val == DateFormat.DEFAULT) ! { ! SimpleDateFormat sdf = (SimpleDateFormat) format; ! sdf.applyPattern(style); ! } ! } ! else if (type.equals("choice")) ! { ! formatClass = java.lang.Number.class; ! if (style == null) ! throw new ! IllegalArgumentException ("style required for choice format"); ! format = new ChoiceFormat (style); ! } ! } } public class MessageFormat extends Format --- 75,144 ---- // Recompute the locale-based formatter. void setLocale (Locale loc) ! { ! if (type == null) ! ; ! else if (type.equals("number")) ! { ! formatClass = java.lang.Number.class; ! if (style == null) ! format = NumberFormat.getInstance(loc); ! else if (style.equals("currency")) ! format = NumberFormat.getCurrencyInstance(loc); ! else if (style.equals("percent")) ! format = NumberFormat.getPercentInstance(loc); ! else if (style.equals("integer")) ! { ! NumberFormat nf = NumberFormat.getNumberInstance(loc); ! nf.setMaximumFractionDigits(0); ! nf.setGroupingUsed(false); ! format = nf; ! } ! else ! { ! format = NumberFormat.getNumberInstance(loc); ! DecimalFormat df = (DecimalFormat) format; ! df.applyPattern(style); ! } ! } ! else if (type.equals("time") || type.equals("date")) ! { ! formatClass = java.util.Date.class; ! int val = DateFormat.DEFAULT; ! if (style == null) ! ; ! else if (style.equals("short")) ! val = DateFormat.SHORT; ! else if (style.equals("medium")) ! val = DateFormat.MEDIUM; ! else if (style.equals("long")) ! val = DateFormat.LONG; ! else if (style.equals("full")) ! val = DateFormat.FULL; ! if (type.equals("time")) ! format = DateFormat.getTimeInstance(val, loc); ! else ! format = DateFormat.getDateInstance(val, loc); ! if (style != null && val == DateFormat.DEFAULT) ! { ! SimpleDateFormat sdf = (SimpleDateFormat) format; ! sdf.applyPattern(style); ! } ! } ! else if (type.equals("choice")) ! { ! formatClass = java.lang.Number.class; ! if (style == null) ! throw new ! IllegalArgumentException ("style required for choice format"); ! format = new ChoiceFormat (style); ! } ! } } public class MessageFormat extends Format *************** public class MessageFormat extends Forma *** 127,529 **** // string. Throws IllegalArgumentException on error. private static final int scanString (String pat, int index, StringBuffer buffer) ! { ! int max = pat.length(); ! buffer.setLength(0); ! for (; index < max; ++index) ! { ! char c = pat.charAt(index); ! if (c == '\'' && index + 2 < max && pat.charAt(index + 2) == '\'') ! { ! buffer.append(pat.charAt(index + 1)); ! index += 2; ! } ! else if (c == '\'' && index + 1 < max ! && pat.charAt(index + 1) == '\'') ! { ! buffer.append(c); ! ++index; ! } ! else if (c == '{') ! break; ! else if (c == '}') ! throw new IllegalArgumentException (); ! else buffer.append(c); ! } ! return index; ! } // This helper retrieves a single part of a format element. Returns // the index of the terminating character. private static final int scanFormatElement (String pat, int index, StringBuffer buffer, char term) ! { ! int max = pat.length(); ! buffer.setLength(0); ! int brace_depth = 1; ! for (; index < max; ++index) ! { ! char c = pat.charAt(index); ! if (c == '\'' && index + 2 < max && pat.charAt(index + 2) == '\'') ! { ! buffer.append(c); ! buffer.append(pat.charAt(index + 1)); ! buffer.append(c); ! index += 2; ! } ! else if (c == '\'' && index + 1 < max ! && pat.charAt(index + 1) == '\'') ! { ! buffer.append(c); ! ++index; ! } ! else if (c == '{') ! { ! buffer.append(c); ! ++brace_depth; ! } ! else if (c == '}') ! { ! if (--brace_depth == 0) ! break; ! buffer.append(c); ! } ! // Check for TERM after braces, because TERM might be `}'. ! else if (c == term) ! break; ! else buffer.append(c); ! } ! return index; ! } // This is used to parse a format element and whatever non-format // text might trail it. private static final int scanFormat (String pat, int index, StringBuffer buffer, Vector elts, Locale locale) ! { ! MessageFormatElement mfe = new MessageFormatElement (); ! elts.addElement(mfe); ! int max = pat.length(); ! // Skip the opening `{'. ! ++index; ! // Fetch the argument number. ! index = scanFormatElement (pat, index, buffer, ','); ! try ! { ! mfe.argNumber = Integer.parseInt(buffer.toString()); ! } ! catch (NumberFormatException nfx) ! { ! throw new IllegalArgumentException (); ! } ! // Extract the element format. ! if (index < max && pat.charAt(index) == ',') ! { ! index = scanFormatElement (pat, index + 1, buffer, ','); ! mfe.type = buffer.toString(); ! // Extract the style. ! if (index < max && pat.charAt(index) == ',') ! { ! index = scanFormatElement (pat, index + 1, buffer, '}'); ! mfe.style = buffer.toString (); ! } ! } ! // Advance past the last terminator. ! if (index >= max || pat.charAt(index) != '}') ! throw new IllegalArgumentException (); ! ++index; ! // Now fetch trailing string. ! index = scanString (pat, index, buffer); ! mfe.trailer = buffer.toString (); ! mfe.setLocale(locale); ! return index; ! } public void applyPattern (String newPattern) ! { ! pattern = newPattern; ! StringBuffer tempBuffer = new StringBuffer (); ! int index = scanString (newPattern, 0, tempBuffer); ! leader = tempBuffer.toString(); ! Vector elts = new Vector (); ! while (index < newPattern.length()) ! index = scanFormat (newPattern, index, tempBuffer, elts, locale); ! elements = new MessageFormatElement[elts.size()]; ! elts.copyInto(elements); ! } public Object clone () ! { ! MessageFormat c = new MessageFormat (); ! c.setLocale(locale); ! c.applyPattern(pattern); ! return (Object) c; ! } public boolean equals (Object obj) ! { ! if (! (obj instanceof MessageFormat)) ! return false; ! MessageFormat mf = (MessageFormat) obj; ! return (pattern.equals(mf.pattern) ! && locale.equals(mf.locale)); ! } public static String format (String pattern, Object arguments[]) ! { ! MessageFormat mf = new MessageFormat (pattern); ! StringBuffer sb = new StringBuffer (); ! FieldPosition fp = new FieldPosition (NumberFormat.INTEGER_FIELD); ! return mf.format(arguments, sb, fp).toString(); ! } public final StringBuffer format (Object arguments[], StringBuffer appendBuf, FieldPosition ignore) ! { ! appendBuf.append(leader); ! for (int i = 0; i < elements.length; ++i) ! { ! if (elements[i].argNumber >= arguments.length) ! throw new IllegalArgumentException (); ! Object thisArg = arguments[elements[i].argNumber]; ! Format formatter = null; ! if (elements[i].setFormat != null) ! formatter = elements[i].setFormat; ! else if (elements[i].format != null) ! { ! if (elements[i].formatClass != null ! && ! elements[i].formatClass.isInstance(thisArg)) ! throw new IllegalArgumentException (); ! formatter = elements[i].format; ! } ! else if (thisArg instanceof Number) ! formatter = NumberFormat.getInstance(locale); ! else if (thisArg instanceof Date) ! formatter = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale); ! else ! appendBuf.append(thisArg); ! if (formatter != null) ! { ! // Special-case ChoiceFormat. ! if (formatter instanceof ChoiceFormat) ! { ! StringBuffer buf = new StringBuffer (); ! // FIXME: don't actually know what is correct here. ! // Can a sub-format refer to any argument, or just ! // the single argument passed to it? Must test ! // against JDK. ! formatter.format(thisArg, buf, ignore); ! MessageFormat mf = new MessageFormat (); ! mf.setLocale(locale); ! mf.applyPattern(buf.toString()); ! formatter = mf; ! } ! formatter.format(thisArg, appendBuf, ignore); ! } ! appendBuf.append(elements[i].trailer); ! } ! return appendBuf; ! } public final StringBuffer format (Object singleArg, StringBuffer appendBuf, FieldPosition ignore) ! { ! Object[] args; ! if (singleArg instanceof Object[]) ! { ! // This isn't specified in any manual, but it follows the ! // JDK implementation. ! args = (Object[]) singleArg; ! } ! else ! { ! args = new Object[1]; ! args[0] = singleArg; ! } ! return format (args, appendBuf, ignore); ! } public Format[] getFormats () ! { ! Format[] f = new Format[elements.length]; ! for (int i = elements.length - 1; i >= 0; --i) ! f[i] = elements[i].setFormat; ! return f; ! } public Locale getLocale () ! { ! return locale; ! } public int hashCode () ! { ! // FIXME: not a very good hash. ! return pattern.hashCode() + locale.hashCode(); ! } private MessageFormat () ! { ! } public MessageFormat (String pattern) ! { ! locale = Locale.getDefault(); ! applyPattern (pattern); ! } public Object[] parse (String sourceStr, ParsePosition pos) ! { ! // Check initial text. ! int index = pos.getIndex(); ! if (! sourceStr.startsWith(leader, index)) ! { ! pos.setErrorIndex(index); ! return null; ! } ! index += leader.length(); ! Vector results = new Vector (elements.length, 1); ! // Now check each format. ! for (int i = 0; i < elements.length; ++i) ! { ! Format formatter = null; ! if (elements[i].setFormat != null) ! formatter = elements[i].setFormat; ! else if (elements[i].format != null) ! formatter = elements[i].format; ! Object value = null; ! if (formatter instanceof ChoiceFormat) ! { ! // We must special-case a ChoiceFormat because it might ! // have recursive formatting. ! ChoiceFormat cf = (ChoiceFormat) formatter; ! String[] formats = (String[]) cf.getFormats(); ! double[] limits = (double[]) cf.getLimits(); ! MessageFormat subfmt = new MessageFormat (); ! subfmt.setLocale(locale); ! ParsePosition subpos = new ParsePosition (index); ! int j; ! for (j = 0; value == null && j < limits.length; ++j) ! { ! subfmt.applyPattern(formats[j]); ! subpos.setIndex(index); ! value = subfmt.parse(sourceStr, subpos); ! } ! if (value != null) ! { ! index = subpos.getIndex(); ! value = new Double (limits[j]); ! } ! } ! else if (formatter != null) ! { ! pos.setIndex(index); ! value = formatter.parseObject(sourceStr, pos); ! if (value != null) ! index = pos.getIndex(); ! } ! else ! { ! // We have a String format. This can lose in a number ! // of ways, but we give it a shot. ! int next_index = sourceStr.indexOf(elements[i].trailer, index); ! if (next_index == -1) ! { ! pos.setErrorIndex(index); ! return null; ! } ! value = sourceStr.substring(index, next_index); ! index = next_index; ! } ! if (value == null ! || ! sourceStr.startsWith(elements[i].trailer, index)) ! { ! pos.setErrorIndex(index); ! return null; ! } ! if (elements[i].argNumber >= results.size()) ! results.setSize(elements[i].argNumber + 1); ! results.setElementAt(value, elements[i].argNumber); ! index += elements[i].trailer.length(); ! } ! Object[] r = new Object[results.size()]; ! results.copyInto(r); ! return r; ! } public Object[] parse (String sourceStr) throws ParseException ! { ! ParsePosition pp = new ParsePosition (0); ! Object[] r = parse (sourceStr, pp); ! if (r == null) ! throw new ParseException ("couldn't parse string", pp.getErrorIndex()); ! return r; ! } public Object parseObject (String sourceStr, ParsePosition pos) ! { ! return parse (sourceStr, pos); ! } public void setFormat (int variableNum, Format newFormat) ! { ! elements[variableNum].setFormat = newFormat; ! } public void setFormats (Format[] newFormats) ! { ! if (newFormats.length < elements.length) ! throw new IllegalArgumentException (); ! int len = Math.min(newFormats.length, elements.length); ! for (int i = 0; i < len; ++i) ! elements[i].setFormat = newFormats[i]; ! } public void setLocale (Locale loc) ! { ! locale = loc; ! if (elements != null) ! { ! for (int i = 0; i < elements.length; ++i) ! elements[i].setLocale(loc); ! } ! } public String toPattern () ! { ! return pattern; ! } // The pattern string. private String pattern; --- 148,616 ---- // string. Throws IllegalArgumentException on error. private static final int scanString (String pat, int index, StringBuffer buffer) ! { ! int max = pat.length(); ! buffer.setLength(0); ! for (; index < max; ++index) ! { ! char c = pat.charAt(index); ! if (c == '\'' && index + 2 < max && pat.charAt(index + 2) == '\'') ! { ! buffer.append(pat.charAt(index + 1)); ! index += 2; ! } ! else if (c == '\'' && index + 1 < max ! && pat.charAt(index + 1) == '\'') ! { buffer.append(c); ! ++index; ! } ! else if (c == '{') ! break; ! else if (c == '}') ! throw new IllegalArgumentException (); ! else ! buffer.append(c); ! } ! return index; ! } // This helper retrieves a single part of a format element. Returns // the index of the terminating character. private static final int scanFormatElement (String pat, int index, StringBuffer buffer, char term) ! { ! int max = pat.length(); ! buffer.setLength(0); ! int brace_depth = 1; ! for (; index < max; ++index) ! { ! char c = pat.charAt(index); ! if (c == '\'' && index + 2 < max && pat.charAt(index + 2) == '\'') ! { buffer.append(c); ! buffer.append(pat.charAt(index + 1)); ! buffer.append(c); ! index += 2; ! } ! else if (c == '\'' && index + 1 < max ! && pat.charAt(index + 1) == '\'') ! { ! buffer.append(c); ! ++index; ! } ! else if (c == '{') ! { ! buffer.append(c); ! ++brace_depth; ! } ! else if (c == '}') ! { ! if (--brace_depth == 0) ! break; ! buffer.append(c); ! } ! // Check for TERM after braces, because TERM might be `}'. ! else if (c == term) ! break; ! else ! buffer.append(c); ! } ! return index; ! } // This is used to parse a format element and whatever non-format // text might trail it. private static final int scanFormat (String pat, int index, StringBuffer buffer, Vector elts, Locale locale) ! { ! MessageFormatElement mfe = new MessageFormatElement (); ! elts.addElement(mfe); ! int max = pat.length(); ! // Skip the opening `{'. ! ++index; ! // Fetch the argument number. ! index = scanFormatElement (pat, index, buffer, ','); ! try ! { ! mfe.argNumber = Integer.parseInt(buffer.toString()); ! } ! catch (NumberFormatException nfx) ! { ! throw new IllegalArgumentException (); ! } ! // Extract the element format. ! if (index < max && pat.charAt(index) == ',') ! { ! index = scanFormatElement (pat, index + 1, buffer, ','); ! mfe.type = buffer.toString(); ! // Extract the style. ! if (index < max && pat.charAt(index) == ',') ! { ! index = scanFormatElement (pat, index + 1, buffer, '}'); ! mfe.style = buffer.toString (); ! } ! } ! // Advance past the last terminator. ! if (index >= max || pat.charAt(index) != '}') ! throw new IllegalArgumentException (); ! ++index; ! // Now fetch trailing string. ! index = scanString (pat, index, buffer); ! mfe.trailer = buffer.toString (); ! mfe.setLocale(locale); ! return index; ! } + /** + * Applies the specified pattern to this MessageFormat. + * + * @param aPattern The Pattern + */ public void applyPattern (String newPattern) ! { ! pattern = newPattern; ! StringBuffer tempBuffer = new StringBuffer (); ! int index = scanString (newPattern, 0, tempBuffer); ! leader = tempBuffer.toString(); ! Vector elts = new Vector (); ! while (index < newPattern.length()) ! index = scanFormat (newPattern, index, tempBuffer, elts, locale); ! elements = new MessageFormatElement[elts.size()]; ! elts.copyInto(elements); ! } + /** + * Overrides Format.clone() + */ public Object clone () ! { ! MessageFormat c = (MessageFormat) super.clone (); ! c.elements = (MessageFormatElement[]) elements.clone (); ! return c; ! } + /** + * Overrides Format.equals(Object obj) + */ public boolean equals (Object obj) ! { ! if (! (obj instanceof MessageFormat)) ! return false; ! MessageFormat mf = (MessageFormat) obj; ! return (pattern.equals(mf.pattern) ! && locale.equals(mf.locale)); ! } + /** + * A convinience method to format patterns. + * + * @param aPattern The pattern used when formatting. + * @param arguments The array containing the objects to be formatted. + */ public static String format (String pattern, Object arguments[]) ! { ! MessageFormat mf = new MessageFormat (pattern); ! StringBuffer sb = new StringBuffer (); ! FieldPosition fp = new FieldPosition (NumberFormat.INTEGER_FIELD); ! return mf.format(arguments, sb, fp).toString(); ! } + /** + * Returns the pattern with the formatted objects. + * + * @param source The array containing the objects to be formatted. + * @param result The StringBuffer where the text is appened. + * @param fp A FieldPosition object (it is ignored). + */ public final StringBuffer format (Object arguments[], StringBuffer appendBuf, FieldPosition ignore) ! { ! appendBuf.append(leader); ! for (int i = 0; i < elements.length; ++i) ! { ! if (elements[i].argNumber >= arguments.length) ! throw new IllegalArgumentException (); ! Object thisArg = arguments[elements[i].argNumber]; ! Format formatter = null; ! if (elements[i].setFormat != null) ! formatter = elements[i].setFormat; ! else if (elements[i].format != null) ! { ! if (elements[i].formatClass != null ! && ! elements[i].formatClass.isInstance(thisArg)) ! throw new IllegalArgumentException (); ! formatter = elements[i].format; ! } ! else if (thisArg instanceof Number) ! formatter = NumberFormat.getInstance(locale); ! else if (thisArg instanceof Date) ! formatter = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale); ! else ! appendBuf.append(thisArg); ! if (formatter != null) ! { ! // Special-case ChoiceFormat. ! if (formatter instanceof ChoiceFormat) ! { ! StringBuffer buf = new StringBuffer (); ! // FIXME: don't actually know what is correct here. ! // Can a sub-format refer to any argument, or just ! // the single argument passed to it? Must test ! // against JDK. ! formatter.format(thisArg, buf, ignore); ! MessageFormat mf = new MessageFormat (); ! mf.setLocale(locale); ! mf.applyPattern(buf.toString()); ! formatter = mf; ! } ! formatter.format(thisArg, appendBuf, ignore); ! } ! appendBuf.append(elements[i].trailer); ! } ! return appendBuf; ! } + /** + * Returns the pattern with the formatted objects. + * + * @param source The object to be formatted. + * @param result The StringBuffer where the text is appened. + * @param fp A FieldPosition object (it is ignored). + */ public final StringBuffer format (Object singleArg, StringBuffer appendBuf, FieldPosition ignore) ! { ! Object[] args; ! if (singleArg instanceof Object[]) ! { ! // This isn't specified in any manual, but it follows the ! // JDK implementation. ! args = (Object[]) singleArg; ! } ! else ! { ! args = new Object[1]; ! args[0] = singleArg; ! } ! return format (args, appendBuf, ignore); ! } + /** + * Returns an array with the Formats for + * the arguments. + */ public Format[] getFormats () ! { ! Format[] f = new Format[elements.length]; ! for (int i = elements.length - 1; i >= 0; --i) ! f[i] = elements[i].setFormat; ! return f; ! } + /** + * Returns the locale. + */ public Locale getLocale () ! { ! return locale; ! } + /** + * Overrides Format.hashCode() + */ public int hashCode () ! { ! // FIXME: not a very good hash. ! return pattern.hashCode() + locale.hashCode(); ! } private MessageFormat () ! { ! } + /** + * Creates a new MessageFormat object with + * the specified pattern + * + * @param aPattern The Pattern + */ public MessageFormat (String pattern) ! { ! locale = Locale.getDefault(); ! applyPattern (pattern); ! } public Object[] parse (String sourceStr, ParsePosition pos) ! { ! // Check initial text. ! int index = pos.getIndex(); ! if (! sourceStr.startsWith(leader, index)) ! { ! pos.setErrorIndex(index); ! return null; ! } ! index += leader.length(); ! Vector results = new Vector (elements.length, 1); ! // Now check each format. ! for (int i = 0; i < elements.length; ++i) ! { ! Format formatter = null; ! if (elements[i].setFormat != null) ! formatter = elements[i].setFormat; ! else if (elements[i].format != null) ! formatter = elements[i].format; ! Object value = null; ! if (formatter instanceof ChoiceFormat) ! { ! // We must special-case a ChoiceFormat because it might ! // have recursive formatting. ! ChoiceFormat cf = (ChoiceFormat) formatter; ! String[] formats = (String[]) cf.getFormats(); ! double[] limits = (double[]) cf.getLimits(); ! MessageFormat subfmt = new MessageFormat (); ! subfmt.setLocale(locale); ! ParsePosition subpos = new ParsePosition (index); ! int j; ! for (j = 0; value == null && j < limits.length; ++j) ! { ! subfmt.applyPattern(formats[j]); ! subpos.setIndex(index); ! value = subfmt.parse(sourceStr, subpos); ! } ! if (value != null) ! { ! index = subpos.getIndex(); ! value = new Double (limits[j]); ! } ! } ! else if (formatter != null) ! { ! pos.setIndex(index); ! value = formatter.parseObject(sourceStr, pos); ! if (value != null) ! index = pos.getIndex(); ! } ! else ! { ! // We have a String format. This can lose in a number ! // of ways, but we give it a shot. ! int next_index = sourceStr.indexOf(elements[i].trailer, index); ! if (next_index == -1) ! { ! pos.setErrorIndex(index); ! return null; ! } ! value = sourceStr.substring(index, next_index); ! index = next_index; ! } ! if (value == null ! || ! sourceStr.startsWith(elements[i].trailer, index)) ! { ! pos.setErrorIndex(index); ! return null; ! } ! if (elements[i].argNumber >= results.size()) ! results.setSize(elements[i].argNumber + 1); ! results.setElementAt(value, elements[i].argNumber); ! index += elements[i].trailer.length(); ! } ! Object[] r = new Object[results.size()]; ! results.copyInto(r); ! return r; ! } public Object[] parse (String sourceStr) throws ParseException ! { ! ParsePosition pp = new ParsePosition (0); ! Object[] r = parse (sourceStr, pp); ! if (r == null) ! throw new ParseException ("couldn't parse string", pp.getErrorIndex()); ! return r; ! } public Object parseObject (String sourceStr, ParsePosition pos) ! { ! return parse (sourceStr, pos); ! } + /** + * Sets the format for the argument at an specified + * index. + * + * @param index The index. + * @format The Format object. + */ public void setFormat (int variableNum, Format newFormat) ! { ! elements[variableNum].setFormat = newFormat; ! } + /** + * Sets the formats for the arguments. + * + * @param formats An array of Format objects. + */ public void setFormats (Format[] newFormats) ! { ! if (newFormats.length < elements.length) ! throw new IllegalArgumentException (); ! int len = Math.min(newFormats.length, elements.length); ! for (int i = 0; i < len; ++i) ! elements[i].setFormat = newFormats[i]; ! } + /** + * Sets the locale. + * + * @param locale A Locale + */ public void setLocale (Locale loc) ! { ! locale = loc; ! if (elements != null) ! { ! for (int i = 0; i < elements.length; ++i) ! elements[i].setLocale(loc); ! } ! } + /** + * Returns the pattern. + */ public String toPattern () ! { ! return pattern; ! } // The pattern string. private String pattern; diff -Nrc3pad gcc-3.0.4/libjava/java/text/NumberFormat.java gcc-3.1/libjava/java/text/NumberFormat.java *** gcc-3.0.4/libjava/java/text/NumberFormat.java Fri Dec 15 06:23:28 2000 --- gcc-3.1/libjava/java/text/NumberFormat.java Tue Jan 22 22:40:37 2002 *************** *** 1,10 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; --- 1,40 ---- ! /* NumberFormat.java -- Formats and parses numbers ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** import java.io.ObjectOutputStream; *** 16,65 **** import java.io.IOException; /** * @author Tom Tromey * @date March 4, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Believed complete and correct to 1.2, except getAvailableLocales. */ - public abstract class NumberFormat extends Format implements Cloneable { public static final int INTEGER_FIELD = 0; public static final int FRACTION_FIELD = 1; public final String format (long number) ! { ! StringBuffer sbuf = new StringBuffer(50); ! format (number, sbuf, null); ! return sbuf.toString(); ! } public final StringBuffer format (Object obj, StringBuffer sbuf, FieldPosition pos) ! { ! if (obj instanceof Number) ! return format(((Number) obj).doubleValue(), sbuf, pos); ! else ! throw new IllegalArgumentException ! ("Cannot format given Object as a Number"); ! } public abstract StringBuffer format (double number, StringBuffer sbuf, FieldPosition pos); public abstract StringBuffer format (long number, StringBuffer sbuf, FieldPosition pos); ! public Object clone () ! { ! // We know the superclass just uses Object's generic cloner. ! // Why not just inherit? Because the online docs specify that ! // this method exists for this class. ! return super.clone (); ! } ! public boolean equals (Object obj) { if (! (obj instanceof NumberFormat)) --- 46,153 ---- import java.io.IOException; /** + * This is the abstract superclass of all classes which format and + * parse numeric values such as decimal numbers, integers, currency values, + * and percentages. These classes perform their parsing and formatting + * in a locale specific manner, accounting for such items as differing + * currency symbols and thousands separators. + *

        + * To create an instance of a concrete subclass of NumberFormat, + * do not call a class constructor directly. Instead, use one of the + * static factory methods in this class such as + * getCurrencyInstance. + * * @author Tom Tromey + * @author Aaron M. Renn (arenn@urbanophile.com) * @date March 4, 1999 */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 from http://www.javasoft.com. * Status: Believed complete and correct to 1.2, except getAvailableLocales. */ public abstract class NumberFormat extends Format implements Cloneable { + /** + * This is a constant used to create a FieldPosition object + * that will return the integer portion of a formatted number. + */ public static final int INTEGER_FIELD = 0; + + /** + * This is a constant used to create a FieldPosition object + * that will return the fractional portion of a formatted number. + */ public static final int FRACTION_FIELD = 1; + /** + * This method is a specialization of the format method that performs + * a simple formatting of the specified long number. + * + * @param number The long to format. + * + * @return The formatted number + */ public final String format (long number) ! { ! StringBuffer sbuf = new StringBuffer(50); ! format (number, sbuf, null); ! return sbuf.toString(); ! } public final StringBuffer format (Object obj, StringBuffer sbuf, FieldPosition pos) ! { ! if (obj instanceof Number) ! return format(((Number) obj).doubleValue(), sbuf, pos); ! else ! throw new IllegalArgumentException ! ("Cannot format given Object as a Number"); ! } + /** + * This method formats the specified double and appends it to + * a StringBuffer. + * + * @param number The double to format. + * @param sb The StringBuffer to append the formatted number to. + * @param pos The desired FieldPosition. + * + * @return The StringBuffer with the appended number. + */ public abstract StringBuffer format (double number, StringBuffer sbuf, FieldPosition pos); + /** + * This method formats the specified long and appends it to + * a StringBuffer. + * + * @param number The long to format. + * @param sb The StringBuffer to append the formatted number to. + * @param pos The desired FieldPosition. + * + * @return The StringBuffer with the appended number. + */ public abstract StringBuffer format (long number, StringBuffer sbuf, FieldPosition pos); ! /** ! * This method tests the specified object for equality against this object. ! * This will be true if the following conditions are met: ! *

        ! *

          ! *
        • The specified object is not null. ! *
        • The specified object is an instance of NumberFormat. ! *
        ! *

        ! * Since this method does not test much, it is highly advised that ! * concrete subclasses override this method. ! * ! * @param obj The Object to test against equality with ! * this object. ! * ! * @return true if the specified object is equal to ! * this object, false otherwise. ! */ public boolean equals (Object obj) { if (! (obj instanceof NumberFormat)) *************** public abstract class NumberFormat exten *** 73,254 **** && parseIntegerOnly == nf.parseIntegerOnly); } public static Locale[] getAvailableLocales () ! { ! // FIXME. ! return null; ! } private static final NumberFormat computeInstance (Locale loc, String resource, String def) ! { ! ResourceBundle res; ! try ! { ! res = ResourceBundle.getBundle("gnu.gcj.text.LocaleData", loc); ! } ! catch (MissingResourceException x) ! { ! res = null; ! } ! String fmt; ! try ! { ! fmt = res == null ? def : res.getString(resource); ! } ! catch (MissingResourceException x) ! { ! fmt = def; ! } ! DecimalFormatSymbols dfs = new DecimalFormatSymbols (loc); ! return new DecimalFormat (fmt, dfs); ! } public static final NumberFormat getCurrencyInstance () ! { ! return getCurrencyInstance (Locale.getDefault()); ! } public static NumberFormat getCurrencyInstance (Locale loc) ! { ! return computeInstance (loc, "currencyFormat", "$#,##0.00;($#,##0.00)"); ! } public static final NumberFormat getInstance () ! { ! return getInstance (Locale.getDefault()); ! } public static NumberFormat getInstance (Locale loc) ! { ! // For now always return a number instance. ! return getNumberInstance (loc); ! } public int getMaximumFractionDigits () ! { ! return maximumFractionDigits; ! } public int getMaximumIntegerDigits () ! { ! return maximumIntegerDigits; ! } public int getMinimumFractionDigits () ! { ! return minimumFractionDigits; ! } public int getMinimumIntegerDigits () ! { ! return minimumIntegerDigits; ! } public static final NumberFormat getNumberInstance () ! { ! return getNumberInstance (Locale.getDefault()); ! } public static NumberFormat getNumberInstance (Locale loc) ! { ! return computeInstance (loc, "numberFormat", "#,##0.###"); ! } public static final NumberFormat getPercentInstance () ! { ! return getPercentInstance (Locale.getDefault()); ! } public static NumberFormat getPercentInstance (Locale loc) ! { ! return computeInstance (loc, "percentFormat", "#,##0%"); ! } public int hashCode () ! { ! int hash = super.hashCode(); ! hash ^= (maximumFractionDigits + maximumIntegerDigits ! + minimumFractionDigits + minimumIntegerDigits); ! if (groupingUsed) ! hash ^= 0xf0f0; ! if (parseIntegerOnly) ! hash ^= 0x0f0f; ! return hash; ! } public boolean isGroupingUsed () ! { ! return groupingUsed; ! } public boolean isParseIntegerOnly () ! { ! return parseIntegerOnly; ! } public NumberFormat () ! { ! } public abstract Number parse (String sourceStr, ParsePosition pos); public Number parse (String sourceStr) throws ParseException ! { ! ParsePosition pp = new ParsePosition (0); ! Number r = parse (sourceStr, pp); ! if (r == null) ! { ! int index = pp.getErrorIndex(); ! if (index < 0) ! index = pp.getIndex(); ! throw new ParseException ("couldn't parse number", index); ! } ! return r; ! } public final Object parseObject (String sourceStr, ParsePosition pos) ! { ! return parse (sourceStr, pos); ! } public void setGroupingUsed (boolean newValue) ! { ! groupingUsed = newValue; ! } public void setMaximumFractionDigits (int newValue) ! { ! maximumFractionDigits = newValue; ! } public void setMaximumIntegerDigits (int newValue) ! { ! maximumIntegerDigits = newValue; ! } public void setMinimumFractionDigits (int newValue) ! { ! minimumFractionDigits = newValue; ! } public void setMinimumIntegerDigits (int newValue) ! { ! minimumIntegerDigits = newValue; ! } public void setParseIntegerOnly (boolean value) ! { ! parseIntegerOnly = value; ! } public final String format (double number) ! { ! StringBuffer sbuf = new StringBuffer(50); ! format (number, sbuf, null); ! return sbuf.toString(); ! } // These field names are fixed by the serialization spec. boolean groupingUsed; --- 161,566 ---- && parseIntegerOnly == nf.parseIntegerOnly); } + /** + * This method returns a list of locales for which concrete instances + * of NumberFormat subclasses may be created. + * + * @return The list of available locales. + */ public static Locale[] getAvailableLocales () ! { ! Locale[] list = new Locale[1]; ! list[0] = Locale.US; ! return list; ! } private static final NumberFormat computeInstance (Locale loc, String resource, String def) ! { ! ResourceBundle res; ! try ! { ! res = ResourceBundle.getBundle("gnu.java.locale.LocaleInformation", ! loc); ! } ! catch (MissingResourceException x) ! { ! res = null; ! } ! String fmt; ! try ! { ! fmt = res == null ? def : res.getString(resource); ! } ! catch (MissingResourceException x) ! { ! fmt = def; ! } ! DecimalFormatSymbols dfs = new DecimalFormatSymbols (loc); ! return new DecimalFormat (fmt, dfs); ! } + /** + * This method returns an instance of NumberFormat suitable + * for formatting and parsing currency values in the default locale. + * + * @return An instance of NumberFormat for handling currencies. + */ public static final NumberFormat getCurrencyInstance () ! { ! return getCurrencyInstance (Locale.getDefault()); ! } + /** + * This method returns an instance of NumberFormat suitable + * for formatting and parsing currency values in the specified locale. + * + * @return An instance of NumberFormat for handling currencies. + */ public static NumberFormat getCurrencyInstance (Locale loc) ! { ! return computeInstance (loc, "currencyFormat", "$#,##0.00;($#,##0.00)"); ! } + /** + * This method returns a default instance for the default locale. This + * will be a concrete subclass of NumberFormat, but the + * actual class returned is dependent on the locale. + * + * @return An instance of the default NumberFormat class. + */ public static final NumberFormat getInstance () ! { ! return getInstance (Locale.getDefault()); ! } + /** + * This method returns a default instance for the specified locale. This + * will be a concrete subclass of NumberFormat, but the + * actual class returned is dependent on the locale. + * + * @param locale The desired locale. + * + * @return An instance of the default NumberFormat class. + */ public static NumberFormat getInstance (Locale loc) ! { ! // For now always return a number instance. ! return getNumberInstance (loc); ! } + /** + * This method returns the maximum number of digits allowed in the fraction + * portion of a number. + * + * @return The maximum number of digits allowed in the fraction + * portion of a number. + */ public int getMaximumFractionDigits () ! { ! return maximumFractionDigits; ! } + /** + * This method returns the maximum number of digits allowed in the integer + * portion of a number. + * + * @return The maximum number of digits allowed in the integer + * portion of a number. + */ public int getMaximumIntegerDigits () ! { ! return maximumIntegerDigits; ! } + /** + * This method returns the minimum number of digits allowed in the fraction + * portion of a number. + * + * @return The minimum number of digits allowed in the fraction + * portion of a number. + */ public int getMinimumFractionDigits () ! { ! return minimumFractionDigits; ! } + /** + * This method returns the minimum number of digits allowed in the integer + * portion of a number. + * + * @return The minimum number of digits allowed in the integer + * portion of a number. + */ public int getMinimumIntegerDigits () ! { ! return minimumIntegerDigits; ! } + /** + * This method returns a default instance for the specified locale. This + * will be a concrete subclass of NumberFormat, but the + * actual class returned is dependent on the locale. + * + * @param locale The desired locale. + * + * @return An instance of the default NumberFormat class. + */ public static final NumberFormat getNumberInstance () ! { ! return getNumberInstance (Locale.getDefault()); ! } + /** + * This method returns a general purpose number formatting and parsing + * class for the default locale. This will be a concrete subclass of + * NumberFormat, but the actual class returned is dependent + * on the locale. + * + * @return An instance of a generic number formatter for the default locale. + */ public static NumberFormat getNumberInstance (Locale loc) ! { ! return computeInstance (loc, "numberFormat", "#,##0.###"); ! } + /** + * This method returns an instance of NumberFormat suitable + * for formatting and parsing percentage values in the default locale. + * + * @return An instance of NumberFormat for handling percentages. + */ public static final NumberFormat getPercentInstance () ! { ! return getPercentInstance (Locale.getDefault()); ! } + /** + * This method returns an instance of NumberFormat suitable + * for formatting and parsing percentage values in the specified locale. + * + * @param locale The desired locale. + * + * @return An instance of NumberFormat for handling percentages. + */ public static NumberFormat getPercentInstance (Locale loc) ! { ! return computeInstance (loc, "percentFormat", "#,##0%"); ! } + /** + * This method returns a hash value for this object. + * + * @return The hash code. + */ public int hashCode () ! { ! int hash = super.hashCode(); ! hash ^= (maximumFractionDigits + maximumIntegerDigits ! + minimumFractionDigits + minimumIntegerDigits); ! if (groupingUsed) ! hash ^= 0xf0f0; ! if (parseIntegerOnly) ! hash ^= 0x0f0f; ! return hash; ! } + /** + * This method tests whether or not grouping is in use. Grouping is + * a method of marking separations in numbers, such as thousand separators + * in the US English locale. The grouping positions and symbols are all + * locale specific. As an example, with grouping disabled, the number one + * million would appear as "1000000". With grouping enabled, this number + * might appear as "1,000,000". (Both of these assume the US English + * locale). + * + * @return true if grouping is enabled, + * false otherwise. + */ public boolean isGroupingUsed () ! { ! return groupingUsed; ! } + /** + * This method tests whether or not only integer values should be parsed. + * If this class is parsing only integers, parsing stops at the decimal + * point. + * + * @return true if only integers are parsed, + * false otherwise. + */ public boolean isParseIntegerOnly () ! { ! return parseIntegerOnly; ! } + /** + * This is a default constructor for use by subclasses. + */ public NumberFormat () ! { ! } + /** + * This method parses the specified string into a Number. This + * will be a Long if possible, otherwise it will be a + * Double. If no number can be parsed, no exception is + * thrown. Instead, the parse position remains at its initial index. + * + * @param str The string to parse. + * @param pp The desired ParsePosition. + * + * @return The parsed Number + */ public abstract Number parse (String sourceStr, ParsePosition pos); + /** + * This method parses the specified string into a Number. This + * will be a Long if possible, otherwise it will be a + * Double. If no number can be parsed, an exception will be + * thrown. + * + * @param str The string to parse. + * + * @return The parsed Number + * + * @exception ParseException If no number can be parsed. + */ public Number parse (String sourceStr) throws ParseException ! { ! ParsePosition pp = new ParsePosition (0); ! Number r = parse (sourceStr, pp); ! if (r == null) ! { ! int index = pp.getErrorIndex(); ! if (index < 0) ! index = pp.getIndex(); ! throw new ParseException ("couldn't parse number", index); ! } ! return r; ! } + /** + * This method parses the specified string into an Object. This + * will be a Long if possible, otherwise it will be a + * Double. If no number can be parsed, no exception is + * thrown. Instead, the parse position remains at its initial index. + * + * @param str The string to parse. + * @param pp The desired ParsePosition. + * + * @return The parsed Object + */ public final Object parseObject (String sourceStr, ParsePosition pos) ! { ! return parse (sourceStr, pos); ! } + /** + * This method sets the grouping behavior of this formatter. Grouping is + * a method of marking separations in numbers, such as thousand separators + * in the US English locale. The grouping positions and symbols are all + * locale specific. As an example, with grouping disabled, the number one + * million would appear as "1000000". With grouping enabled, this number + * might appear as "1,000,000". (Both of these assume the US English + * locale). + * + * @param groupingUsed true to enable grouping, + * false to disable it. + */ public void setGroupingUsed (boolean newValue) ! { ! groupingUsed = newValue; ! } + /** + * This method sets the maximum number of digits allowed in the fraction + * portion of a number to the specified value. If this is less than the + * current minimum allowed digits, the minimum allowed digits value will + * be lowered to be equal to the new maximum allowed digits value. + * + * @param maximumFractionDigits The new maximum fraction digits value. + */ public void setMaximumFractionDigits (int newValue) ! { ! maximumFractionDigits = newValue; ! if (getMinimumFractionDigits () > maximumFractionDigits) ! setMinimumFractionDigits (maximumFractionDigits); ! } + /** + * This method sets the maximum number of digits allowed in the integer + * portion of a number to the specified value. If this is less than the + * current minimum allowed digits, the minimum allowed digits value will + * be lowered to be equal to the new maximum allowed digits value. + * + * @param maximumIntegerDigits The new maximum integer digits value. + */ public void setMaximumIntegerDigits (int newValue) ! { ! maximumIntegerDigits = newValue; ! if (getMinimumIntegerDigits () > maximumIntegerDigits) ! setMinimumIntegerDigits (maximumIntegerDigits); ! } + /** + * This method sets the minimum number of digits allowed in the fraction + * portion of a number to the specified value. If this is greater than the + * current maximum allowed digits, the maximum allowed digits value will + * be raised to be equal to the new minimum allowed digits value. + * + * @param minimumFractionDigits The new minimum fraction digits value. + */ public void setMinimumFractionDigits (int newValue) ! { ! minimumFractionDigits = newValue; ! if (getMaximumFractionDigits () < minimumFractionDigits) ! setMaximumFractionDigits (minimumFractionDigits); ! } + /** + * This method sets the minimum number of digits allowed in the integer + * portion of a number to the specified value. If this is greater than the + * current maximum allowed digits, the maximum allowed digits value will + * be raised to be equal to the new minimum allowed digits value. + * + * @param minimumIntegerDigits The new minimum integer digits value. + */ public void setMinimumIntegerDigits (int newValue) ! { ! minimumIntegerDigits = newValue; ! if (getMaximumIntegerDigits () < minimumIntegerDigits) ! setMaximumIntegerDigits (minimumIntegerDigits); ! } + /** + * This method sets the parsing behavior of this object to parse only + * integers or not. + * + * @param parseIntegerOnly true to parse only integers, + * false otherwise. + */ public void setParseIntegerOnly (boolean value) ! { ! parseIntegerOnly = value; ! } + /** + * This method is a specialization of the format method that performs + * a simple formatting of the specified double number. + * + * @param number The double to format. + * + * @return The formatted number + */ public final String format (double number) ! { ! StringBuffer sbuf = new StringBuffer(50); ! format (number, sbuf, null); ! return sbuf.toString(); ! } // These field names are fixed by the serialization spec. boolean groupingUsed; diff -Nrc3pad gcc-3.0.4/libjava/java/text/ParseException.java gcc-3.1/libjava/java/text/ParseException.java *** gcc-3.0.4/libjava/java/text/ParseException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/text/ParseException.java Tue Jan 22 22:40:37 2002 *************** *** 1,34 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; - /** - * @author Per Bothner - * @date October 25, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class ParseException extends Exception { - private int errorOffset; ! public ParseException (String msg, int errorOffset) ! { ! super(msg); ! this.errorOffset = errorOffset; ! } ! public int getErrorOffset () ! { ! return errorOffset; ! } } --- 1,102 ---- ! /* ParseException.java -- An error occurred while parsing. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; /* Written using "Java Class Libraries", 2nd edition, plus online * API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ + /** + * This exception is thrown when an unexpected error occurs during parsing. + * + * @version 0.0 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Per Bothner + * @date October 25, 1998. + */ public class ParseException extends Exception { ! /* ! * Instance Variables ! */ ! /** ! * This is the position where the error was encountered. ! */ ! private int errorOffset; ! ! /*************************************************************************/ ! ! /* ! * Constructors ! */ ! ! /** ! * This method initializes a new instance of ParseException ! * with a detailed error message and a error position. ! * ! * @param msg The descriptive message describing the error. ! * @param offset The position where the error was encountered. ! */ ! public ! ParseException(String s, int offset) ! { ! super(s); ! ! errorOffset = offset; ! } ! ! /*************************************************************************/ ! ! /** ! * This method returns the position where the error occurred. ! * ! * @return The position where the error occurred. ! */ ! public int ! getErrorOffset() ! { ! return(errorOffset); } + + } // class ParseException + diff -Nrc3pad gcc-3.0.4/libjava/java/text/ParsePosition.java gcc-3.1/libjava/java/text/ParsePosition.java *** gcc-3.0.4/libjava/java/text/ParsePosition.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/text/ParsePosition.java Tue Jan 22 22:40:37 2002 *************** *** 1,59 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; /** * @author Per Bothner - * @date October 25, 1998. - */ - /* Written using "Java Class Libraries", 2nd edition, plus online - * API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct. - * Includes JDK 1.2 methods. */ - public class ParsePosition { ! int index; ! int errorIndex; public ParsePosition (int index) { this.index = index; ! errorIndex = -1; } public int getIndex () { return index; } public void setIndex (int index) { this.index = index; } public int getErrorIndex () { ! return errorIndex; } ! public void setErrorIndex (int ei) { ! errorIndex = ei; } public boolean equals (Object obj) { ! if (obj != null || ! (obj instanceof ParsePosition)) return false; ParsePosition other = (ParsePosition) obj; ! return index == other.index && errorIndex == other.errorIndex; } } --- 1,151 ---- ! /* ParsePosition.java -- Keep track of position while parsing. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; /** + * This class is used to keep track of the current position during parsing + * operations. + * + * @author Aaron M. Renn (arenn@urbanophile.com) * @author Per Bothner */ public class ParsePosition { ! /** ! * This is the index of the current parse position. ! */ ! private int index; ! ! /** ! * This is the index of the position where an error occurred during parsing. ! */ ! private int error_index; + /** + * This method initializes a new instance of ParsePosition to + * have the specified initial index value. + * + * @param index The initial parsing index. + */ public ParsePosition (int index) { this.index = index; ! error_index = -1; } + /** + * This method returns the current parsing index. + * + * @return The current parsing index + */ public int getIndex () { return index; } + /** + * This method sets the current parsing index to the specified value. + * + * @param index The new parsing index. + */ public void setIndex (int index) { this.index = index; } + /** + * This method returns the error index value. This value defaults to -1 + * unless explicitly set to another value. + * + * @return The error index. + */ public int getErrorIndex () { ! return error_index; } ! /** ! * This method sets the error index to the specified value. ! * ! * @param error_index The new error index ! */ ! public void setErrorIndex (int error_index) { ! this.error_index = error_index; } + /** + * This method tests the specified object for equality with this + * object. The two objects will be considered equal if and only if + * all of the following conditions are met. + *

        + *

          + *
        • The specified object is not null. + *
        • The specified object is an instance of ParsePosition. + *
        • The specified object has the same index and error index as + * this object. + *
        + * + * @param obj The Object to test for equality against + * this object. + * + * @return true if the specified object is equal to + * this object, false otherwise. + */ public boolean equals (Object obj) { ! if (! (obj instanceof ParsePosition)) return false; + ParsePosition other = (ParsePosition) obj; ! return index == other.index && error_index == other.error_index; ! } ! ! /** ! * This method returns a String representation of this ! * object. ! * ! * @return A String that represents this object. ! */ ! public String toString () ! { ! return (getClass ().getName () + "[index=" + getIndex () ! + ",errorIndex=" + getErrorIndex () + "]"); } } diff -Nrc3pad gcc-3.0.4/libjava/java/text/RuleBasedCollator.java gcc-3.1/libjava/java/text/RuleBasedCollator.java *** gcc-3.0.4/libjava/java/text/RuleBasedCollator.java Sat Nov 18 02:29:13 2000 --- gcc-3.1/libjava/java/text/RuleBasedCollator.java Fri Sep 7 00:15:47 2001 *************** *** 1,6 **** // RuleBasedCollator.java - Concrete class for locale-based string compare. ! /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // RuleBasedCollator.java - Concrete class for locale-based string compare. ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** public class RuleBasedCollator extends C *** 39,45 **** { public Object clone () { ! return new RuleBasedCollator (this); } // A helper for CollationElementIterator.next(). --- 39,48 ---- { public Object clone () { ! RuleBasedCollator c = (RuleBasedCollator) super.clone (); ! c.map = (Hashtable) map.clone (); ! c.prefixes = (Hashtable) map.clone (); ! return c; } // A helper for CollationElementIterator.next(). *************** public class RuleBasedCollator extends C *** 352,368 **** } } - // This is a helper for clone. - private RuleBasedCollator (RuleBasedCollator other) - { - frenchAccents = other.frenchAccents; - rules = other.rules; - decmp = other.decmp; - strength = other.strength; - map = other.map; - prefixes = other.prefixes; - } - // True if we are using French-style accent ordering. private boolean frenchAccents; --- 355,360 ---- diff -Nrc3pad gcc-3.0.4/libjava/java/text/SimpleDateFormat.java gcc-3.1/libjava/java/text/SimpleDateFormat.java *** gcc-3.0.4/libjava/java/text/SimpleDateFormat.java Fri Apr 20 09:41:11 2001 --- gcc-3.1/libjava/java/text/SimpleDateFormat.java Tue Jan 22 22:40:37 2002 *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.text; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; *************** public class SimpleDateFormat extends Da *** 62,69 **** private transient Vector tokens; private DateFormatSymbols formatData; // formatData ! private Date defaultCenturyStart = ! new Date(System.currentTimeMillis() - (80*365*24*60*60*1000)); private String pattern; private int serialVersionOnStream = 1; // 0 indicates JDK1.1.3 or earlier private static final long serialVersionUID = 4774881970558875024L; --- 73,80 ---- private transient Vector tokens; private DateFormatSymbols formatData; // formatData ! private Date defaultCenturyStart; ! private transient int defaultCentury; private String pattern; private int serialVersionOnStream = 1; // 0 indicates JDK1.1.3 or earlier private static final long serialVersionUID = 4774881970558875024L; *************** public class SimpleDateFormat extends Da *** 79,88 **** stream.defaultReadObject(); if (serialVersionOnStream < 1) { ! defaultCenturyStart = ! new Date(System.currentTimeMillis() - (80*365*24*60*60*1000)); serialVersionOnStream = 1; } // Set up items normally taken care of by the constructor. tokens = new Vector(); --- 90,101 ---- stream.defaultReadObject(); if (serialVersionOnStream < 1) { ! computeCenturyStart (); serialVersionOnStream = 1; } + else + // Ensure that defaultCentury gets set. + set2DigitYearStart(defaultCenturyStart); // Set up items normally taken care of by the constructor. tokens = new Vector(); *************** public class SimpleDateFormat extends Da *** 161,171 **** super(); Locale locale = Locale.getDefault(); calendar = new GregorianCalendar(locale); tokens = new Vector(); formatData = new DateFormatSymbols(locale); ! pattern = formatData.dateFormats[DEFAULT]+' '+formatData.timeFormats[DEFAULT]; compileFormat(pattern); numberFormat = NumberFormat.getInstance(locale); } /** --- 174,187 ---- super(); Locale locale = Locale.getDefault(); calendar = new GregorianCalendar(locale); + computeCenturyStart(); tokens = new Vector(); formatData = new DateFormatSymbols(locale); ! pattern = (formatData.dateFormats[DEFAULT] + ' ' ! + formatData.timeFormats[DEFAULT]); compileFormat(pattern); numberFormat = NumberFormat.getInstance(locale); + numberFormat.setGroupingUsed (false); } /** *************** public class SimpleDateFormat extends Da *** 185,212 **** { super(); calendar = new GregorianCalendar(locale); tokens = new Vector(); formatData = new DateFormatSymbols(locale); compileFormat(pattern); this.pattern = pattern; numberFormat = NumberFormat.getInstance(locale); } /** * Creates a date formatter using the specified pattern. The * specified DateFormatSymbols will be used when formatting. */ ! public SimpleDateFormat(String pattern, DateFormatSymbols formatData) { super(); calendar = new GregorianCalendar(); ! // FIXME: XXX: Is it really necessary to set the timezone? ! // The Calendar constructor is supposed to take care of this. ! calendar.setTimeZone(TimeZone.getDefault()); tokens = new Vector(); this.formatData = formatData; compileFormat(pattern); this.pattern = pattern; numberFormat = NumberFormat.getInstance(); } // What is the difference between localized and unlocalized? The --- 201,230 ---- { super(); calendar = new GregorianCalendar(locale); + computeCenturyStart(); tokens = new Vector(); formatData = new DateFormatSymbols(locale); compileFormat(pattern); this.pattern = pattern; numberFormat = NumberFormat.getInstance(locale); + numberFormat.setGroupingUsed (false); } /** * Creates a date formatter using the specified pattern. The * specified DateFormatSymbols will be used when formatting. */ ! public SimpleDateFormat(String pattern, DateFormatSymbols formatData) ! { super(); calendar = new GregorianCalendar(); ! computeCenturyStart (); tokens = new Vector(); this.formatData = formatData; compileFormat(pattern); this.pattern = pattern; numberFormat = NumberFormat.getInstance(); + numberFormat.setGroupingUsed (false); } // What is the difference between localized and unlocalized? The *************** public class SimpleDateFormat extends Da *** 303,308 **** --- 321,330 ---- public void set2DigitYearStart(Date date) { defaultCenturyStart = date; + calendar.clear(); + calendar.setTime(date); + int year = calendar.get(Calendar.YEAR); + defaultCentury = year - (year % 100); } /** *************** public class SimpleDateFormat extends Da *** 377,386 **** * appending to the specified StringBuffer. The input StringBuffer * is returned as output for convenience. */ ! public StringBuffer format(Date date, StringBuffer buffer, FieldPosition pos) { String temp; ! Calendar theCalendar = (Calendar) calendar.clone(); ! theCalendar.setTime(date); // go through vector, filling in fields where applicable, else toString Enumeration e = tokens.elements(); --- 399,408 ---- * appending to the specified StringBuffer. The input StringBuffer * is returned as output for convenience. */ ! public StringBuffer format(Date date, StringBuffer buffer, FieldPosition pos) ! { String temp; ! calendar.setTime(date); // go through vector, filling in fields where applicable, else toString Enumeration e = tokens.elements(); *************** public class SimpleDateFormat extends Da *** 391,400 **** int beginIndex = buffer.length(); switch (p.field) { case ERA_FIELD: ! buffer.append(formatData.eras[theCalendar.get(Calendar.ERA)]); break; case YEAR_FIELD: ! temp = String.valueOf(theCalendar.get(Calendar.YEAR)); if (p.size < 4) buffer.append(temp.substring(temp.length()-2)); else --- 413,422 ---- int beginIndex = buffer.length(); switch (p.field) { case ERA_FIELD: ! buffer.append(formatData.eras[calendar.get(Calendar.ERA)]); break; case YEAR_FIELD: ! temp = String.valueOf(calendar.get(Calendar.YEAR)); if (p.size < 4) buffer.append(temp.substring(temp.length()-2)); else *************** public class SimpleDateFormat extends Da *** 402,461 **** break; case MONTH_FIELD: if (p.size < 3) ! withLeadingZeros(theCalendar.get(Calendar.MONTH)+1,p.size,buffer); else if (p.size < 4) ! buffer.append(formatData.shortMonths[theCalendar.get(Calendar.MONTH)]); else ! buffer.append(formatData.months[theCalendar.get(Calendar.MONTH)]); break; case DATE_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.DATE),p.size,buffer); break; case HOUR_OF_DAY1_FIELD: // 1-24 ! withLeadingZeros(((theCalendar.get(Calendar.HOUR_OF_DAY)+23)%24)+1,p.size,buffer); break; case HOUR_OF_DAY0_FIELD: // 0-23 ! withLeadingZeros(theCalendar.get(Calendar.HOUR_OF_DAY),p.size,buffer); break; case MINUTE_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.MINUTE),p.size,buffer); break; case SECOND_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.SECOND),p.size,buffer); break; case MILLISECOND_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.MILLISECOND),p.size,buffer); break; case DAY_OF_WEEK_FIELD: if (p.size < 4) ! buffer.append(formatData.shortWeekdays[theCalendar.get(Calendar.DAY_OF_WEEK)]); else ! buffer.append(formatData.weekdays[theCalendar.get(Calendar.DAY_OF_WEEK)]); break; case DAY_OF_YEAR_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.DAY_OF_YEAR),p.size,buffer); break; case DAY_OF_WEEK_IN_MONTH_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.DAY_OF_WEEK_IN_MONTH),p.size,buffer); break; case WEEK_OF_YEAR_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.WEEK_OF_YEAR),p.size,buffer); break; case WEEK_OF_MONTH_FIELD: ! withLeadingZeros(theCalendar.get(Calendar.WEEK_OF_MONTH),p.size,buffer); break; case AM_PM_FIELD: ! buffer.append(formatData.ampms[theCalendar.get(Calendar.AM_PM)]); break; case HOUR1_FIELD: // 1-12 ! withLeadingZeros(((theCalendar.get(Calendar.HOUR)+11)%12)+1,p.size,buffer); break; case HOUR0_FIELD: // 0-11 ! withLeadingZeros(theCalendar.get(Calendar.HOUR),p.size,buffer); break; case TIMEZONE_FIELD: ! TimeZone zone = theCalendar.getTimeZone(); ! boolean isDST = theCalendar.get(Calendar.DST_OFFSET) != 0; // FIXME: XXX: This should be a localized time zone. String zoneID = zone.getDisplayName(isDST, p.size > 3 ? TimeZone.LONG : TimeZone.SHORT); buffer.append(zoneID); --- 424,483 ---- break; case MONTH_FIELD: if (p.size < 3) ! withLeadingZeros(calendar.get(Calendar.MONTH)+1,p.size,buffer); else if (p.size < 4) ! buffer.append(formatData.shortMonths[calendar.get(Calendar.MONTH)]); else ! buffer.append(formatData.months[calendar.get(Calendar.MONTH)]); break; case DATE_FIELD: ! withLeadingZeros(calendar.get(Calendar.DATE),p.size,buffer); break; case HOUR_OF_DAY1_FIELD: // 1-24 ! withLeadingZeros(((calendar.get(Calendar.HOUR_OF_DAY)+23)%24)+1,p.size,buffer); break; case HOUR_OF_DAY0_FIELD: // 0-23 ! withLeadingZeros(calendar.get(Calendar.HOUR_OF_DAY),p.size,buffer); break; case MINUTE_FIELD: ! withLeadingZeros(calendar.get(Calendar.MINUTE),p.size,buffer); break; case SECOND_FIELD: ! withLeadingZeros(calendar.get(Calendar.SECOND),p.size,buffer); break; case MILLISECOND_FIELD: ! withLeadingZeros(calendar.get(Calendar.MILLISECOND),p.size,buffer); break; case DAY_OF_WEEK_FIELD: if (p.size < 4) ! buffer.append(formatData.shortWeekdays[calendar.get(Calendar.DAY_OF_WEEK)]); else ! buffer.append(formatData.weekdays[calendar.get(Calendar.DAY_OF_WEEK)]); break; case DAY_OF_YEAR_FIELD: ! withLeadingZeros(calendar.get(Calendar.DAY_OF_YEAR),p.size,buffer); break; case DAY_OF_WEEK_IN_MONTH_FIELD: ! withLeadingZeros(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH),p.size,buffer); break; case WEEK_OF_YEAR_FIELD: ! withLeadingZeros(calendar.get(Calendar.WEEK_OF_YEAR),p.size,buffer); break; case WEEK_OF_MONTH_FIELD: ! withLeadingZeros(calendar.get(Calendar.WEEK_OF_MONTH),p.size,buffer); break; case AM_PM_FIELD: ! buffer.append(formatData.ampms[calendar.get(Calendar.AM_PM)]); break; case HOUR1_FIELD: // 1-12 ! withLeadingZeros(((calendar.get(Calendar.HOUR)+11)%12)+1,p.size,buffer); break; case HOUR0_FIELD: // 0-11 ! withLeadingZeros(calendar.get(Calendar.HOUR),p.size,buffer); break; case TIMEZONE_FIELD: ! TimeZone zone = calendar.getTimeZone(); ! boolean isDST = calendar.get(Calendar.DST_OFFSET) != 0; // FIXME: XXX: This should be a localized time zone. String zoneID = zone.getDisplayName(isDST, p.size > 3 ? TimeZone.LONG : TimeZone.SHORT); buffer.append(zoneID); *************** public class SimpleDateFormat extends Da *** 475,481 **** return buffer; } ! private void withLeadingZeros(int value, int length, StringBuffer buffer) { String valStr = String.valueOf(value); for (length -= valStr.length(); length > 0; length--) buffer.append('0'); --- 497,504 ---- return buffer; } ! private void withLeadingZeros(int value, int length, StringBuffer buffer) ! { String valStr = String.valueOf(value); for (length -= valStr.length(); length > 0; length--) buffer.append('0'); *************** public class SimpleDateFormat extends Da *** 508,514 **** --- 531,539 ---- int fmt_max = pattern.length(); calendar.clear(); + boolean saw_timezone = false; int quote_start = -1; + boolean is2DigitYear = false; for (; fmt_index < fmt_max; ++fmt_index) { char ch = pattern.charAt(fmt_index); *************** public class SimpleDateFormat extends Da *** 541,547 **** int first = fmt_index; while (++fmt_index < fmt_max && pattern.charAt(fmt_index) == ch) ; ! int count = fmt_index - first; --fmt_index; // We can handle most fields automatically: most either are --- 566,572 ---- int first = fmt_index; while (++fmt_index < fmt_max && pattern.charAt(fmt_index) == ch) ; ! int fmt_count = fmt_index - first; --fmt_index; // We can handle most fields automatically: most either are *************** public class SimpleDateFormat extends Da *** 553,559 **** boolean is_numeric = true; String[] match = null; int offset = 0; ! int zone_number = 0; switch (ch) { case 'd': --- 578,584 ---- boolean is_numeric = true; String[] match = null; int offset = 0; ! boolean maybe2DigitYear = false; switch (ch) { case 'd': *************** public class SimpleDateFormat extends Da *** 569,575 **** is_numeric = false; offset = 1; calendar_field = Calendar.DAY_OF_WEEK; ! match = (count <= 3 ? formatData.getShortWeekdays() : formatData.getWeekdays()); break; --- 594,600 ---- is_numeric = false; offset = 1; calendar_field = Calendar.DAY_OF_WEEK; ! match = (fmt_count <= 3 ? formatData.getShortWeekdays() : formatData.getWeekdays()); break; *************** public class SimpleDateFormat extends Da *** 581,600 **** break; case 'M': calendar_field = Calendar.MONTH; ! if (count <= 2) offset = -1; else { is_numeric = false; ! match = (count <= 3 ? formatData.getShortMonths() : formatData.getMonths()); } break; case 'y': calendar_field = Calendar.YEAR; ! if (count <= 2) ! offset = 1900; break; case 'K': calendar_field = Calendar.HOUR; --- 606,625 ---- break; case 'M': calendar_field = Calendar.MONTH; ! if (fmt_count <= 2) offset = -1; else { is_numeric = false; ! match = (fmt_count <= 3 ? formatData.getShortMonths() : formatData.getMonths()); } break; case 'y': calendar_field = Calendar.YEAR; ! if (fmt_count <= 2) ! maybe2DigitYear = true; break; case 'K': calendar_field = Calendar.HOUR; *************** public class SimpleDateFormat extends Da *** 642,652 **** } if (k != strings.length) { ! if (k > 2) ! ; // FIXME: dst. ! zone_number = 0; // FIXME: dst. ! // FIXME: raw offset to SimpleTimeZone const. ! calendar.setTimeZone(new SimpleTimeZone (1, strings[0])); pos.setIndex(index + strings[k].length()); break; } --- 667,683 ---- } if (k != strings.length) { ! found_zone = true; ! saw_timezone = true; ! TimeZone tz = TimeZone.getTimeZone (strings[0]); ! calendar.setTimeZone (tz); ! calendar.set (Calendar.ZONE_OFFSET, tz.getRawOffset ()); ! offset = 0; ! if (k > 2 && tz instanceof SimpleTimeZone) ! { ! SimpleTimeZone stz = (SimpleTimeZone) tz; ! offset = stz.getDSTSavings (); ! } pos.setIndex(index + strings[k].length()); break; } *************** public class SimpleDateFormat extends Da *** 664,672 **** // Compute the value we should assign to the field. int value; if (is_numeric) { ! numberFormat.setMinimumIntegerDigits(count); Number n = numberFormat.parse(dateStr, pos); if (pos == null || ! (n instanceof Long)) return null; --- 695,706 ---- // Compute the value we should assign to the field. int value; + int index = -1; if (is_numeric) { ! numberFormat.setMinimumIntegerDigits(fmt_count); ! if (maybe2DigitYear) ! index = pos.getIndex(); Number n = numberFormat.parse(dateStr, pos); if (pos == null || ! (n instanceof Long)) return null; *************** public class SimpleDateFormat extends Da *** 674,680 **** } else if (match != null) { ! int index = pos.getIndex(); int i; for (i = offset; i < match.length; ++i) { --- 708,714 ---- } else if (match != null) { ! index = pos.getIndex(); int i; for (i = offset; i < match.length; ++i) { *************** public class SimpleDateFormat extends Da *** 690,703 **** value = i; } else ! value = zone_number; // Assign the value and move on. calendar.set(calendar_field, value); } try { return calendar.getTime(); } catch (IllegalArgumentException x) --- 724,763 ---- value = i; } else ! value = offset; ! ! if (maybe2DigitYear) ! { ! // Parse into default century if the numeric year string has ! // exactly 2 digits. ! int digit_count = pos.getIndex() - index; ! if (digit_count == 2) ! is2DigitYear = true; ! } // Assign the value and move on. calendar.set(calendar_field, value); } + + if (is2DigitYear) + { + // Apply the 80-20 heuristic to dermine the full year based on + // defaultCenturyStart. + int year = defaultCentury + calendar.get(Calendar.YEAR); + calendar.set(Calendar.YEAR, year); + if (calendar.getTime().compareTo(defaultCenturyStart) < 0) + calendar.set(Calendar.YEAR, year + 100); + } try { + if (! saw_timezone) + { + // Use the real rules to determine whether or not this + // particular time is in daylight savings. + calendar.clear (Calendar.DST_OFFSET); + calendar.clear (Calendar.ZONE_OFFSET); + } return calendar.getTime(); } catch (IllegalArgumentException x) *************** public class SimpleDateFormat extends Da *** 706,709 **** --- 766,778 ---- return null; } } + + // Compute the start of the current century as defined by + // get2DigitYearStart. + private void computeCenturyStart() + { + int year = calendar.get(Calendar.YEAR); + calendar.set(Calendar.YEAR, year - 80); + set2DigitYearStart(calendar.getTime()); + } } diff -Nrc3pad gcc-3.0.4/libjava/java/text/StringCharacterIterator.java gcc-3.1/libjava/java/text/StringCharacterIterator.java *** gcc-3.0.4/libjava/java/text/StringCharacterIterator.java Sat Nov 18 02:29:13 2000 --- gcc-3.1/libjava/java/text/StringCharacterIterator.java Tue Jan 22 22:40:37 2002 *************** *** 1,149 **** ! // StringCharacterIterator.java - Iterate over string of Unicode characters. ! /* Copyright (C) 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.text; /** * @author Tom Tromey - * @date February 22, 1999 - */ - /* Written using "Java Class Libraries", 2nd edition, plus online - * API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct to 1.1. */ - public final class StringCharacterIterator implements CharacterIterator { ! public Object clone () { ! return (Object) new StringCharacterIterator (text, begin, end, pos); } ! public char current () { ! // This follows JDK 1.2 semantics and not 1.1 semantics. ! // In 1.1 we would throw an exception if begin==end. ! return (pos < end) ? text.charAt(pos) : CharacterIterator.DONE; } ! public boolean equals (Object obj) { ! if (! (obj instanceof StringCharacterIterator)) ! return false; ! StringCharacterIterator sci = (StringCharacterIterator) obj; ! // The spec says "the same text". We take this to mean equals, ! // not ==. ! return (pos == sci.pos ! && begin == sci.begin ! && end == sci.end ! && text.equals(sci.text)); } ! public char first () { ! pos = begin; ! return current (); } ! public int getBeginIndex () { ! return begin; } ! public int getEndIndex () { ! return end; } ! public int getIndex () { ! return pos; } ! public int hashCode () { ! // FIXME: this is a terrible hash code. Find a better one. ! return text.hashCode() + pos + begin + end; } public char last () { ! pos = end; return current (); } ! public char next () { ! if (pos == end) ! return CharacterIterator.DONE; ! ++pos; ! return current (); } ! public char previous () { ! if (pos == begin) ! return CharacterIterator.DONE; ! --pos; return current (); } ! public char setIndex (int idx) { ! // In 1.1 we would throw an error if `idx == end'. ! if (idx < begin || idx > end) ! throw new IllegalArgumentException (); ! pos = idx; ! return current (); } ! public StringCharacterIterator (String text) { ! this (text, 0, text.length(), 0); } ! public StringCharacterIterator (String text, int pos) { ! this (text, 0, text.length(), pos); } ! public StringCharacterIterator (String text, int begin, int end, int pos) { ! if (begin < 0 || begin > end || end > text.length() ! // In 1.1 we would also throw if `pos == end'. ! || pos < begin || pos > end) ! throw new IllegalArgumentException (); ! this.text = text; ! this.begin = begin; ! this.end = end; ! this.pos = pos; } ! // The online 1.2 docs say that this is "package visible" in the ! // method description, but they also say it is public. We choose ! // the latter for compatibility with the actual implementation. public void setText (String text) { this.text = text; this.begin = 0; this.end = text.length (); ! this.pos = 0; } - - // String to iterate over. - private String text; - // Current position. - private int pos; - // Start position in string. - private int begin; - // End position in string. - private int end; } --- 1,356 ---- ! /* StringCharacterIterator.java -- Iterate over a character range in a string ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.text; /** + * This class iterates over a range of characters in a String. + * For a given range of text, a beginning and ending index, + * as well as a current index are defined. These values can be queried + * by the methods in this interface. Additionally, various methods allow + * the index to be set. + * + * @author Aaron M. Renn (arenn@urbanophile.com) * @author Tom Tromey */ public final class StringCharacterIterator implements CharacterIterator { ! /** ! * This is the string to iterate over ! */ ! private String text; ! ! /** ! * This is the value of the start position of the text range. ! */ ! private int begin; ! ! /** ! * This is the value of the ending position of the text range. ! */ ! private int end; ! ! /** ! * This is the current value of the scan index. ! */ ! private int index; ! ! /** ! * This method initializes a new instance of ! * StringCharacterIterator to iterate over the entire ! * text of the specified String. The initial index ! * value will be set to the first character in the string. ! * ! * @param text The String to iterate through. ! */ ! public StringCharacterIterator (String text) { ! this (text, 0, text.length (), 0); } ! /*************************************************************************/ ! ! /** ! * This method initializes a new instance of ! * StringCharacterIterator to iterate over the entire ! * text of the specified String. The initial index ! * value will be set to the specified value. ! * ! * @param text The String to iterate through. ! * @param index The initial index position. ! */ ! public StringCharacterIterator (String text, int index) { ! this (text, 0, text.length (), index); } ! /*************************************************************************/ ! ! /** ! * This method initializes a new instance of ! * StringCharacterIterator that iterates over the text ! * in a subrange of the specified String. The ! * beginning and end of the range are specified by the caller, as is ! * the initial index position. ! * ! * @param text The String to iterate through. ! * @param begin The beginning position in the character range. ! * @param end The ending position in the character range. ! * @param index The initial index position. ! * ! * @param IllegalArgumentException If any of the range values are ! * invalid. ! */ ! public StringCharacterIterator (String text, int begin, int end, int index) { ! int len = text.length (); ! ! if ((begin < 0) || (begin > len)) ! throw new IllegalArgumentException ("Bad begin position"); ! ! if ((end < begin) || (end > len)) ! throw new IllegalArgumentException ("Bad end position"); ! ! if ((index < begin) || (index > end)) ! throw new IllegalArgumentException ("Bad initial index position"); ! ! this.text = text; ! this.begin = begin; ! this.end = end; ! this.index = index; } ! /** ! * This is a package level constructor that copies the text out of ! * an existing StringCharacterIterator and resets the beginning and ! * ending index. ! * ! * @param scci The StringCharacterIterator to copy the info from ! * @param begin The beginning index of the range we are interested in. ! * @param end The ending index of the range we are interested in. ! */ ! StringCharacterIterator (StringCharacterIterator sci, int begin, int end) { ! this (sci.text, begin, end, begin); } ! /** ! * This method returns the character at the current index position ! * ! * @return The character at the current index position. ! */ ! public char current () { ! return (index < end) ? text.charAt (index) : DONE; } ! /*************************************************************************/ ! ! /** ! * This method increments the current index and then returns the ! * character at the new index value. If the index is already at ! * getEndIndex () - 1, it will not be incremented. ! * ! * @return The character at the position of the incremented index ! * value, or DONE if the index has reached ! * getEndIndex () - 1. ! */ ! public char next () { ! if (index == end) ! return DONE; ! ! ++index; ! return current (); } ! /*************************************************************************/ ! ! /** ! * This method decrements the current index and then returns the ! * character at the new index value. If the index value is already ! * at the beginning index, it will not be decremented. ! * ! * @return The character at the position of the decremented index ! * value, or DONE if index was already equal to the ! * beginning index value. ! */ ! public char previous () { ! if (index == begin) ! return DONE; ! ! --index; ! return current (); } ! /*************************************************************************/ ! ! /** ! * This method sets the index value to the beginning of the range and returns ! * the character there. ! * ! * @return The character at the beginning of the range, or ! * DONE if the range is empty. ! */ ! public char first () { ! index = begin; ! return current (); } + /*************************************************************************/ + + /** + * This method sets the index value to getEndIndex () - 1 and + * returns the character there. If the range is empty, then the index value + * will be set equal to the beginning index. + * + * @return The character at the end of the range, or + * DONE if the range is empty. + */ public char last () { ! if (end == begin) ! return DONE; ! ! index = end - 1; return current (); } ! /*************************************************************************/ ! ! /** ! * This method returns the current value of the index. ! * ! * @return The current index value ! */ ! public int getIndex () { ! return index; } ! /*************************************************************************/ ! ! /** ! * This method sets the value of the index to the specified value, then ! * returns the character at that position. ! * ! * @param index The new index value. ! * ! * @return The character at the new index value or DONE ! * if the index value is equal to getEndIndex. ! * ! * @exception IllegalArgumentException If the specified index is not valid ! */ ! public char setIndex (int index) { ! if ((index < begin) || (index > end)) ! throw new IllegalArgumentException ("Bad index specified"); ! ! this.index = index; return current (); } ! /*************************************************************************/ ! ! /** ! * This method returns the character position of the first character in the ! * range. ! * ! * @return The index of the first character in the range. ! */ ! public int getBeginIndex () { ! return begin; } ! /*************************************************************************/ ! ! /** ! * This method returns the character position of the end of the text range. ! * This will actually be the index of the first character following the ! * end of the range. In the event the text range is empty, this will be ! * equal to the first character in the range. ! * ! * @return The index of the end of the range. ! */ ! public int getEndIndex () { ! return end; } ! /*************************************************************************/ ! ! /** ! * This method creates a copy of this CharacterIterator. ! * ! * @return A copy of this CharacterIterator. ! */ ! public Object clone () { ! return new StringCharacterIterator (text, begin, end, index); } ! /*************************************************************************/ ! ! /** ! * This method tests this object for equality againt the specified ! * object. This will be true if and only if the specified object: ! *

        ! *

          ! *
        • is not null. ! *
        • is an instance of StringCharacterIterator ! *
        • has the same text as this object ! *
        • has the same beginning, ending, and current index as this object. ! *
        ! * ! * @param obj The object to test for equality against. ! * ! * @return true if the specified object is equal to this ! * object, false otherwise. ! */ ! public boolean equals (Object obj) { ! if (! (obj instanceof StringCharacterIterator)) ! return false; ! StringCharacterIterator sci = (StringCharacterIterator) obj; ! ! return (begin == sci.begin ! && end == sci.end ! && index == sci.index ! && text.equals (sci.text)); } ! /*************************************************************************/ ! ! /** ! * This method allows other classes in java.text to change the value ! * of the underlying text being iterated through. ! * ! * @param text The new String to iterate through. ! */ public void setText (String text) { this.text = text; this.begin = 0; this.end = text.length (); ! this.index = 0; } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/AbstractCollection.java gcc-3.1/libjava/java/util/AbstractCollection.java *** gcc-3.0.4/libjava/java/util/AbstractCollection.java Mon Dec 11 03:47:47 2000 --- gcc-3.1/libjava/java/util/AbstractCollection.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* AbstractCollection.java -- Abstract implementation of most of Collection ! Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* AbstractCollection.java -- Abstract implementation of most of Collection ! Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.lang.reflect.Array; *** 42,118 **** * backing data structure allows for a more efficient implementation. The * precise implementation used by AbstractCollection is documented, so that * subclasses can tell which methods could be implemented more efficiently. */ public abstract class AbstractCollection implements Collection { /** * Return an Iterator over this collection. The iterator must provide the * hasNext and next methods and should in addition provide remove if the * collection is modifiable. */ public abstract Iterator iterator(); /** ! * Return the number of elements in this collection. */ public abstract int size(); /** ! * Add an object to the collection. This implementation always throws an ! * UnsupportedOperationException - it should be overridden if the collection ! * is to be modifiable. * * @param o the object to add * @return true if the add operation caused the Collection to change ! * @exception UnsupportedOperationException if the add operation is not ! * supported on this collection */ public boolean add(Object o) { ! throw new java.lang.UnsupportedOperationException(); } /** ! * Add all the elements of a given collection to this collection. This ! * implementation obtains an Iterator over the given collection and iterates ! * over it, adding each element with the add(Object) method (thus this method ! * will fail with an UnsupportedOperationException if the add method does). * * @param c the collection to add the elements of to this collection * @return true if the add operation caused the Collection to change ! * @exception UnsupportedOperationException if the add operation is not ! * supported on this collection */ public boolean addAll(Collection c) { Iterator itr = c.iterator(); - int size = c.size(); boolean modified = false; ! for (int pos = 0; pos < size; pos++) ! { ! modified |= add(itr.next()); ! } return modified; } /** ! * Remove all elements from the collection. This implementation obtains an ! * iterator over the collection and calls next and remove on it repeatedly ! * (thus this method will fail with an UnsupportedOperationException if the ! * Iterator's remove method does) until there are no more elements to remove. * Many implementations will have a faster way of doing this. * ! * @exception UnsupportedOperationException if the Iterator returned by ! * iterator does not provide an implementation of remove */ public void clear() { Iterator itr = iterator(); ! int size = size(); ! for (int pos = 0; pos < size; pos++) { ! itr.next(); ! itr.remove(); } } --- 53,171 ---- * backing data structure allows for a more efficient implementation. The * precise implementation used by AbstractCollection is documented, so that * subclasses can tell which methods could be implemented more efficiently. + *

        + * + * The programmer should provide a no-argument constructor, and one that + * accepts another Collection, as recommended by the Collection interface. + * Unfortunately, there is no way to enforce this in Java. + * + * @author Original author unknown + * @author Bryce McKinlay + * @author Eric Blake + * @see Collection + * @see AbstractSet + * @see AbstractList + * @since 1.2 + * @status updated to 1.4 */ public abstract class AbstractCollection implements Collection { /** + * The main constructor, for use by subclasses. + */ + protected AbstractCollection() + { + } + + /** * Return an Iterator over this collection. The iterator must provide the * hasNext and next methods and should in addition provide remove if the * collection is modifiable. + * + * @return an iterator */ public abstract Iterator iterator(); /** ! * Return the number of elements in this collection. If there are more than ! * Integer.MAX_VALUE elements, return Integer.MAX_VALUE. ! * ! * @return the size */ public abstract int size(); /** ! * Add an object to the collection (optional operation). This implementation ! * always throws an UnsupportedOperationException - it should be ! * overridden if the collection is to be modifiable. If the collection ! * does not accept duplicates, simply return false. Collections may specify ! * limitations on what may be added. * * @param o the object to add * @return true if the add operation caused the Collection to change ! * @throws UnsupportedOperationException if the add operation is not ! * supported on this collection ! * @throws NullPointerException if the collection does not support null ! * @throws ClassCastException if the object is of the wrong type ! * @throws IllegalArgumentException if some aspect of the object prevents ! * it from being added */ public boolean add(Object o) { ! throw new UnsupportedOperationException(); } /** ! * Add all the elements of a given collection to this collection (optional ! * operation). This implementation obtains an Iterator over the given ! * collection and iterates over it, adding each element with the ! * add(Object) method (thus this method will fail with an ! * UnsupportedOperationException if the add method does). The behavior is ! * unspecified if the specified collection is modified during the iteration, ! * including the special case of trying addAll(this) on a non-empty ! * collection. * * @param c the collection to add the elements of to this collection * @return true if the add operation caused the Collection to change ! * @throws UnsupportedOperationException if the add operation is not ! * supported on this collection ! * @throws NullPointerException if this collection does not support null, ! * or if the specified collection is null ! * @throws ClassCastException if an object in c is of the wrong type ! * @throws IllegalArgumentException if some aspect of an object in c prevents ! * it from being added ! * @see #add(Object) */ public boolean addAll(Collection c) { Iterator itr = c.iterator(); boolean modified = false; ! int pos = c.size(); ! while (--pos >= 0) ! modified |= add(itr.next()); return modified; } /** ! * Remove all elements from the collection (optional operation). This ! * implementation obtains an iterator over the collection and calls next ! * and remove on it repeatedly (thus this method will fail with an ! * UnsupportedOperationException if the Iterator's remove method does) ! * until there are no more elements to remove. * Many implementations will have a faster way of doing this. * ! * @throws UnsupportedOperationException if the Iterator returned by ! * iterator does not provide an implementation of remove ! * @see Iterator#remove() */ public void clear() { Iterator itr = iterator(); ! int pos = size(); ! while (--pos >= 0) { ! itr.next(); ! itr.remove(); } } *************** public abstract class AbstractCollection *** 130,141 **** public boolean contains(Object o) { Iterator itr = iterator(); ! int size = size(); ! for (int pos = 0; pos < size; pos++) ! { ! if (o == null ? itr.next() == null : o.equals(itr.next())) ! return true; ! } return false; } --- 183,192 ---- public boolean contains(Object o) { Iterator itr = iterator(); ! int pos = size(); ! while (--pos >= 0) ! if (equals(o, itr.next())) ! return true; return false; } *************** public abstract class AbstractCollection *** 147,163 **** * * @param c the collection to test against * @return true if this collection contains all the elements in the given ! * collection */ public boolean containsAll(Collection c) { Iterator itr = c.iterator(); ! int size = c.size(); ! for (int pos = 0; pos < size; pos++) ! { ! if (!contains(itr.next())) ! return false; ! } return true; } --- 198,214 ---- * * @param c the collection to test against * @return true if this collection contains all the elements in the given ! * collection ! * @throws NullPointerException if the given collection is null ! * @see #contains(Object) */ public boolean containsAll(Collection c) { Iterator itr = c.iterator(); ! int pos = c.size(); ! while (--pos >= 0) ! if (!contains(itr.next())) ! return false; return true; } *************** public abstract class AbstractCollection *** 166,171 **** --- 217,223 ---- * size() == 0. * * @return true if this collection is empty. + * @see #size() */ public boolean isEmpty() { *************** public abstract class AbstractCollection *** 173,264 **** } /** ! * Remove a single instance of an object from this collection. That is, ! * remove one element e such that (o == null ? e == null : o.equals(e)), if ! * such an element exists. This implementation obtains an iterator over the ! * collection and iterates over it, testing each element for equality with ! * the given object. If it is equal, it is removed by the iterator's remove ! * method (thus this method will fail with an UnsupportedOperationException ! * if the Iterator's remove method does). After the first element has been * removed, true is returned; if the end of the collection is reached, false * is returned. * * @param o the object to remove from this collection * @return true if the remove operation caused the Collection to change, or ! * equivalently if the collection did contain o. ! * @exception UnsupportedOperationException if this collection's Iterator ! * does not support the remove method */ public boolean remove(Object o) { Iterator itr = iterator(); ! int size = size(); ! for (int pos = 0; pos < size; pos++) ! { ! if (o == null ? itr.next() == null : o.equals(itr.next())) ! { ! itr.remove(); ! return true; ! } ! } return false; } /** * Remove from this collection all its elements that are contained in a given ! * collection. This implementation iterates over this collection, and for ! * each element tests if it is contained in the given collection. If so, it ! * is removed by the Iterator's remove method (thus this method will fail ! * with an UnsupportedOperationException if the Iterator's remove method ! * does). * * @param c the collection to remove the elements of * @return true if the remove operation caused the Collection to change ! * @exception UnsupportedOperationException if this collection's Iterator ! * does not support the remove method */ public boolean removeAll(Collection c) { Iterator itr = iterator(); - int size = size(); boolean modified = false; ! for (int pos = 0; pos < size; pos++) ! { ! if (c.contains(itr.next())) ! { ! itr.remove(); ! modified = true; ! } ! } return modified; } /** * Remove from this collection all its elements that are not contained in a ! * given collection. This implementation iterates over this collection, and ! * for each element tests if it is contained in the given collection. If not, ! * it is removed by the Iterator's remove method (thus this method will fail ! * with an UnsupportedOperationException if the Iterator's remove method ! * does). * * @param c the collection to retain the elements of * @return true if the remove operation caused the Collection to change ! * @exception UnsupportedOperationException if this collection's Iterator ! * does not support the remove method */ public boolean retainAll(Collection c) { Iterator itr = iterator(); - int size = size(); boolean modified = false; ! for (int pos = 0; pos < size; pos++) ! { ! if (!c.contains(itr.next())) ! { ! itr.remove(); ! modified = true; ! } ! } return modified; } --- 225,355 ---- } /** ! * Remove a single instance of an object from this collection (optional ! * operation). That is, remove one element e such that ! * (o == null ? e == null : o.equals(e)), if such an element ! * exists. This implementation obtains an iterator over the collection ! * and iterates over it, testing each element for equality with the given ! * object. If it is equal, it is removed by the iterator's remove method ! * (thus this method will fail with an UnsupportedOperationException if ! * the Iterator's remove method does). After the first element has been * removed, true is returned; if the end of the collection is reached, false * is returned. * * @param o the object to remove from this collection * @return true if the remove operation caused the Collection to change, or ! * equivalently if the collection did contain o. ! * @throws UnsupportedOperationException if this collection's Iterator ! * does not support the remove method ! * @see Iterator#remove() */ public boolean remove(Object o) { Iterator itr = iterator(); ! int pos = size(); ! while (--pos >= 0) ! if (equals(o, itr.next())) ! { ! itr.remove(); ! return true; ! } return false; } /** * Remove from this collection all its elements that are contained in a given ! * collection (optional operation). This implementation iterates over this ! * collection, and for each element tests if it is contained in the given ! * collection. If so, it is removed by the Iterator's remove method (thus ! * this method will fail with an UnsupportedOperationException if the ! * Iterator's remove method does). * * @param c the collection to remove the elements of * @return true if the remove operation caused the Collection to change ! * @throws UnsupportedOperationException if this collection's Iterator ! * does not support the remove method ! * @see Iterator#remove() */ public boolean removeAll(Collection c) { + return removeAllInternal(c); + } + + /** + * Remove from this collection all its elements that are contained in a given + * collection (optional operation). This implementation iterates over this + * collection, and for each element tests if it is contained in the given + * collection. If so, it is removed by the Iterator's remove method (thus + * this method will fail with an UnsupportedOperationException if the + * Iterator's remove method does). This method is necessary for ArrayList, + * which cannot publicly override removeAll but can optimize this call. + * + * @param c the collection to remove the elements of + * @return true if the remove operation caused the Collection to change + * @throws UnsupportedOperationException if this collection's Iterator + * does not support the remove method + * @see Iterator#remove() + */ + boolean removeAllInternal(Collection c) + { Iterator itr = iterator(); boolean modified = false; ! int pos = size(); ! while (--pos >= 0) ! if (c.contains(itr.next())) ! { ! itr.remove(); ! modified = true; ! } return modified; } /** * Remove from this collection all its elements that are not contained in a ! * given collection (optional operation). This implementation iterates over ! * this collection, and for each element tests if it is contained in the ! * given collection. If not, it is removed by the Iterator's remove method ! * (thus this method will fail with an UnsupportedOperationException if ! * the Iterator's remove method does). * * @param c the collection to retain the elements of * @return true if the remove operation caused the Collection to change ! * @throws UnsupportedOperationException if this collection's Iterator ! * does not support the remove method ! * @see Iterator#remove() */ public boolean retainAll(Collection c) { + return retainAllInternal(c); + } + + /** + * Remove from this collection all its elements that are not contained in a + * given collection (optional operation). This implementation iterates over + * this collection, and for each element tests if it is contained in the + * given collection. If not, it is removed by the Iterator's remove method + * (thus this method will fail with an UnsupportedOperationException if + * the Iterator's remove method does). This method is necessary for + * ArrayList, which cannot publicly override retainAll but can optimize + * this call. + * + * @param c the collection to retain the elements of + * @return true if the remove operation caused the Collection to change + * @throws UnsupportedOperationException if this collection's Iterator + * does not support the remove method + * @see Iterator#remove() + */ + boolean retainAllInternal(Collection c) + { Iterator itr = iterator(); boolean modified = false; ! int pos = size(); ! while (--pos >= 0) ! if (!c.contains(itr.next())) ! { ! itr.remove(); ! modified = true; ! } return modified; } *************** public abstract class AbstractCollection *** 266,283 **** * Return an array containing the elements of this collection. This * implementation creates an Object array of size size() and then iterates * over the collection, setting each element of the array from the value ! * returned by the iterator. * * @return an array containing the elements of this collection */ public Object[] toArray() { Iterator itr = iterator(); ! Object[]a = new Object[size()]; ! for (int pos = 0; pos < a.length; pos++) ! { ! a[pos] = itr.next(); ! } return a; } --- 357,374 ---- * Return an array containing the elements of this collection. This * implementation creates an Object array of size size() and then iterates * over the collection, setting each element of the array from the value ! * returned by the iterator. The returned array is safe, and is not backed ! * by the collection. * * @return an array containing the elements of this collection */ public Object[] toArray() { Iterator itr = iterator(); ! int size = size(); ! Object[] a = new Object[size]; ! for (int pos = 0; pos < size; pos++) ! a[pos] = itr.next(); return a; } *************** public abstract class AbstractCollection *** 293,321 **** * obtained over the collection and the elements are placed in the array as * they are returned by the iterator. Finally the first spare element, if * any, of the array is set to null, and the created array is returned. * * @param a the array to copy into, or of the correct run-time type * @return the array that was produced ! * @exception ClassCastException if the type of the array precludes holding ! * one of the elements of the Collection */ ! public Object[] toArray(Object[]a) { int size = size(); if (a.length < size) ! { ! a = (Object[])Array.newInstance(a.getClass().getComponentType(), ! size); ! } Iterator itr = iterator(); for (int pos = 0; pos < size; pos++) ! { ! a[pos] = itr.next(); ! } ! if (a.length > size) ! { ! a[size] = null; ! } return a; } --- 384,412 ---- * obtained over the collection and the elements are placed in the array as * they are returned by the iterator. Finally the first spare element, if * any, of the array is set to null, and the created array is returned. + * The returned array is safe; it is not backed by the collection. Note that + * null may not mark the last element, if the collection allows null + * elements. * * @param a the array to copy into, or of the correct run-time type * @return the array that was produced ! * @throws NullPointerException if the given array is null ! * @throws ArrayStoreException if the type of the array precludes holding ! * one of the elements of the Collection */ ! public Object[] toArray(Object[] a) { int size = size(); if (a.length < size) ! a = (Object[]) Array.newInstance(a.getClass().getComponentType(), ! size); ! else if (a.length > size) ! a[size] = null; ! Iterator itr = iterator(); for (int pos = 0; pos < size; pos++) ! a[pos] = itr.next(); ! return a; } *************** public abstract class AbstractCollection *** 331,345 **** public String toString() { Iterator itr = iterator(); - int size = size(); StringBuffer r = new StringBuffer("["); ! for (int pos = 0; pos < size; pos++) { ! r.append(itr.next()); ! if (pos < size - 1) ! r.append(", "); } r.append("]"); return r.toString(); } } --- 422,462 ---- public String toString() { Iterator itr = iterator(); StringBuffer r = new StringBuffer("["); ! for (int pos = size(); pos > 0; pos--) { ! r.append(itr.next()); ! if (pos > 1) ! r.append(", "); } r.append("]"); return r.toString(); } + + /** + * Compare two objects according to Collection semantics. + * + * @param o1 the first object + * @param o2 the second object + * @return o1 == null ? o2 == null : o1.equals(o2) + */ + // Package visible for use throughout java.util. + // It may be inlined since it is final. + static final boolean equals(Object o1, Object o2) + { + return o1 == null ? o2 == null : o1.equals(o2); + } + + /** + * Hash an object according to Collection semantics. + * + * @param o the object to hash + * @return o1 == null ? 0 : o1.hashCode() + */ + // Package visible for use throughout java.util. + // It may be inlined since it is final. + static final int hashCode(Object o) + { + return o == null ? 0 : o.hashCode(); + } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/AbstractList.java gcc-3.1/libjava/java/util/AbstractList.java *** gcc-3.0.4/libjava/java/util/AbstractList.java Fri Nov 3 03:58:05 2000 --- gcc-3.1/libjava/java/util/AbstractList.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* AbstractList.java -- Abstract implementation of most of List ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* AbstractList.java -- Abstract implementation of most of List ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,91 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Doc comments for almost everything. - // ~ Better general commenting package java.util; /** * A basic implementation of most of the methods in the List interface to make ! * it easier to create a List based on a random-access data structure. To ! * create an unmodifiable list, it is only necessary to override the size() and ! * get(int) methods (this contrasts with all other abstract collection classes ! * which require an iterator to be provided). To make the list modifiable, the ! * set(int, Object) method should also be overridden, and to make the list ! * resizable, the add(int, Object) and remove(int) methods should be overridden ! * too. Other methods should be overridden if the backing data structure allows ! * for a more efficient implementation. The precise implementation used by ! * AbstractList is documented, so that subclasses can tell which methods could ! * be implemented more efficiently. */ public abstract class AbstractList extends AbstractCollection implements List { /** * A count of the number of structural modifications that have been made to ! * the list (that is, insertions and removals). */ ! protected transient int modCount = 0; public abstract Object get(int index); public void add(int index, Object o) { throw new UnsupportedOperationException(); } public boolean add(Object o) { add(size(), o); return true; } public boolean addAll(int index, Collection c) { Iterator itr = c.iterator(); int size = c.size(); ! for (int pos = 0; pos < size; pos++) ! { ! add(index++, itr.next()); ! } ! return (size > 0); } public void clear() { removeRange(0, size()); } public boolean equals(Object o) { if (o == this) return true; ! if (!(o instanceof List)) return false; int size = size(); if (size != ((List) o).size()) --- 18,227 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; /** * A basic implementation of most of the methods in the List interface to make ! * it easier to create a List based on a random-access data structure. If ! * the list is sequential (such as a linked list), use AbstractSequentialList. ! * To create an unmodifiable list, it is only necessary to override the ! * size() and get(int) methods (this contrasts with all other abstract ! * collection classes which require an iterator to be provided). To make the ! * list modifiable, the set(int, Object) method should also be overridden, and ! * to make the list resizable, the add(int, Object) and remove(int) methods ! * should be overridden too. Other methods should be overridden if the ! * backing data structure allows for a more efficient implementation. ! * The precise implementation used by AbstractList is documented, so that ! * subclasses can tell which methods could be implemented more efficiently. ! *

        ! * ! * As recommended by Collection and List, the subclass should provide at ! * least a no-argument and a Collection constructor. This class is not ! * synchronized. ! * ! * @author Original author unknown ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see Collection ! * @see List ! * @see AbstractSequentialList ! * @see AbstractCollection ! * @see ListIterator ! * @since 1.2 ! * @status updated to 1.4 */ public abstract class AbstractList extends AbstractCollection implements List { /** * A count of the number of structural modifications that have been made to ! * the list (that is, insertions and removals). Structural modifications ! * are ones which change the list size or affect how iterations would ! * behave. This field is available for use by Iterator and ListIterator, ! * in order to throw a {@link ConcurrentModificationException} in response ! * to the next operation on the iterator. This fail-fast behavior ! * saves the user from many subtle bugs otherwise possible from concurrent ! * modification during iteration. ! *

        ! * ! * To make lists fail-fast, increment this field by just 1 in the ! * add(int, Object) and remove(int) methods. ! * Otherwise, this field may be ignored. */ ! protected int modCount; ! ! /** ! * The main constructor, for use by subclasses. ! */ ! protected AbstractList() ! { ! } + /** + * Returns the elements at the specified position in the list. + * + * @param index the element to return + * @return the element at that position + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + */ public abstract Object get(int index); + /** + * Insert an element into the list at a given position (optional operation). + * This shifts all existing elements from that position to the end one + * index to the right. This version of add has no return, since it is + * assumed to always succeed if there is no exception. This implementation + * always throws UnsupportedOperationException, and must be overridden to + * make a modifiable List. If you want fail-fast iterators, be sure to + * increment modCount when overriding this. + * + * @param index the location to insert the item + * @param o the object to insert + * @throws UnsupportedOperationException if this list does not support the + * add operation + * @throws IndexOutOfBoundsException if index < 0 || index > size() + * @throws ClassCastException if o cannot be added to this list due to its + * type + * @throws IllegalArgumentException if o cannot be added to this list for + * some other reason + * @see #modCount + */ public void add(int index, Object o) { throw new UnsupportedOperationException(); } + /** + * Add an element to the end of the list (optional operation). If the list + * imposes restraints on what can be inserted, such as no null elements, + * this should be documented. This implementation calls + * add(size(), o);, and will fail if that version does. + * + * @param o the object to add + * @return true, as defined by Collection for a modified list + * @throws UnsupportedOperationException if this list does not support the + * add operation + * @throws ClassCastException if o cannot be added to this list due to its + * type + * @throws IllegalArgumentException if o cannot be added to this list for + * some other reason + * @see #add(int, Object) + */ public boolean add(Object o) { add(size(), o); return true; } + /** + * Insert the contents of a collection into the list at a given position + * (optional operation). Shift all elements at that position to the right + * by the number of elements inserted. This operation is undefined if + * this list is modified during the operation (for example, if you try + * to insert a list into itself). This implementation uses the iterator of + * the collection, repeatedly calling add(int, Object); this will fail + * if add does. This can often be made more efficient. + * + * @param index the location to insert the collection + * @param c the collection to insert + * @return true if the list was modified by this action, that is, if c is + * non-empty + * @throws UnsupportedOperationException if this list does not support the + * addAll operation + * @throws IndexOutOfBoundsException if index < 0 || index > size() + * @throws ClassCastException if some element of c cannot be added to this + * list due to its type + * @throws IllegalArgumentException if some element of c cannot be added + * to this list for some other reason + * @throws NullPointerException if the specified collection is null + * @see #add(int, Object) + */ public boolean addAll(int index, Collection c) { Iterator itr = c.iterator(); int size = c.size(); ! for (int pos = size; pos > 0; pos--) ! add(index++, itr.next()); ! return size > 0; } + /** + * Clear the list, such that a subsequent call to isEmpty() would return + * true (optional operation). This implementation calls + * removeRange(0, size()), so it will fail unless remove + * or removeRange is overridden. + * + * @throws UnsupportedOperationException if this list does not support the + * clear operation + * @see #remove(int) + * @see #removeRange(int, int) + */ public void clear() { removeRange(0, size()); } + /** + * Test whether this list is equal to another object. A List is defined to be + * equal to an object if and only if that object is also a List, and the two + * lists have the same sequence. Two lists l1 and l2 are equal if and only + * if l1.size() == l2.size(), and for every integer n between 0 + * and l1.size() - 1 inclusive, l1.get(n) == null ? + * l2.get(n) == null : l1.get(n).equals(l2.get(n)). + *

        + * + * This implementation returns true if the object is this, or false if the + * object is not a List. Otherwise, it iterates over both lists (with + * iterator()), returning false if two elements compare false or one list + * is shorter, and true if the iteration completes successfully. + * + * @param o the object to test for equality with this list + * @return true if o is equal to this list + * @see Object#equals(Object) + * @see #hashCode() + */ public boolean equals(Object o) { if (o == this) return true; ! if (! (o instanceof List)) return false; int size = size(); if (size != ((List) o).size()) *************** public abstract class AbstractList exten *** 94,170 **** Iterator itr1 = iterator(); Iterator itr2 = ((List) o).iterator(); ! for (int pos = 0; pos < size; pos++) ! { ! Object e = itr1.next(); ! if (e == null ? itr2.next() != null : !e.equals(itr2.next())) ! return false; ! } return true; } public int hashCode() { int hashCode = 1; Iterator itr = iterator(); ! int size = size(); ! for (int pos = 0; pos < size; pos++) ! { ! Object obj = itr.next(); ! hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode()); ! } return hashCode; } public int indexOf(Object o) { ! ListIterator itr = listIterator(0); int size = size(); for (int pos = 0; pos < size; pos++) ! { ! if (o == null ? itr.next() == null : o.equals(itr.next())) ! return pos; ! } return -1; } public Iterator iterator() { ! return new AbstractListItr(0); } public int lastIndexOf(Object o) { ! int size = size(); ! ListIterator itr = listIterator(size); ! for (int pos = size; pos > 0; pos--) ! { ! if (o == null ? itr.previous() == null : o.equals(itr.previous())) ! return pos - 1; ! } return -1; } /** ! * Return an Iterator over this List. This implementation calls ! * listIterator(0). * ! * @return an Iterator over this List */ public ListIterator listIterator() { return listIterator(0); } ! public ListIterator listIterator(int index) { if (index < 0 || index > size()) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size()); ! return new AbstractListItr(index); } public Object remove(int index) { throw new UnsupportedOperationException(); --- 230,501 ---- Iterator itr1 = iterator(); Iterator itr2 = ((List) o).iterator(); ! while (--size >= 0) ! if (! equals(itr1.next(), itr2.next())) ! return false; return true; } + /** + * Obtain a hash code for this list. In order to obey the general contract of + * the hashCode method of class Object, this value is calculated as follows: + *

        +    *   hashCode = 1;
        +    *   Iterator i = list.iterator();
        +    *   while (i.hasNext())
        +    *     {
        +    *       Object obj = i.next();
        +    *       hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode());
        +    *     }
        +    * 
        + * This ensures that the general contract of Object.hashCode() is adhered to. + * + * @return the hash code of this list + * @see Object#hashCode() + * @see #equals(Object) + */ public int hashCode() { int hashCode = 1; Iterator itr = iterator(); ! int pos = size(); ! while (--pos >= 0) ! hashCode = 31 * hashCode + hashCode(itr.next()); return hashCode; } + /** + * Obtain the first index at which a given object is to be found in this + * list. This implementation follows a listIterator() until a match is found, + * or returns -1 if the list end is reached. + * + * @param o the object to search for + * @return the least integer n such that o == null ? get(n) == null : + * o.equals(get(n)), or -1 if there is no such index + */ public int indexOf(Object o) { ! ListIterator itr = listIterator(); int size = size(); for (int pos = 0; pos < size; pos++) ! if (equals(o, itr.next())) ! return pos; return -1; } + /** + * Obtain an Iterator over this list, whose sequence is the list order. + * This implementation uses size(), get(int), and remove(int) of the + * backing list, and does not support remove unless the list does. This + * implementation is fail-fast if you correctly maintain modCount. + * Also, this implementation is specified by Sun to be distinct from + * listIterator, although you could easily implement it as + * return listIterator(0). + * + * @return an Iterator over the elements of this list, in order + * @see #modCount + */ public Iterator iterator() { ! // Bah, Sun's implementation forbids using listIterator(0). ! return new Iterator() ! { ! private int pos = 0; ! private int size = size(); ! private int last = -1; ! private int knownMod = modCount; ! ! // This will get inlined, since it is private. ! private void checkMod() ! { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! } ! ! public boolean hasNext() ! { ! checkMod(); ! return pos < size; ! } ! ! public Object next() ! { ! checkMod(); ! if (pos == size) ! throw new NoSuchElementException(); ! last = pos; ! return get(pos++); ! } ! ! public void remove() ! { ! checkMod(); ! if (last < 0) ! throw new IllegalStateException(); ! AbstractList.this.remove(last); ! pos--; ! size--; ! last = -1; ! knownMod = modCount; ! } ! }; } + /** + * Obtain the last index at which a given object is to be found in this + * list. This implementation grabs listIterator(size()), then searches + * backwards for a match or returns -1. + * + * @return the greatest integer n such that o == null ? get(n) == null + * : o.equals(get(n)), or -1 if there is no such index + */ public int lastIndexOf(Object o) { ! int pos = size(); ! ListIterator itr = listIterator(pos); ! while (--pos >= 0) ! if (equals(o, itr.previous())) ! return pos; return -1; } /** ! * Obtain a ListIterator over this list, starting at the beginning. This ! * implementation returns listIterator(0). * ! * @return a ListIterator over the elements of this list, in order, starting ! * at the beginning */ public ListIterator listIterator() { return listIterator(0); } ! /** ! * Obtain a ListIterator over this list, starting at a given position. ! * A first call to next() would return the same as get(index), and a ! * first call to previous() would return the same as get(index - 1). ! *

        ! * ! * This implementation uses size(), get(int), set(int, Object), ! * add(int, Object), and remove(int) of the backing list, and does not ! * support remove, set, or add unless the list does. This implementation ! * is fail-fast if you correctly maintain modCount. ! * ! * @param index the position, between 0 and size() inclusive, to begin the ! * iteration from ! * @return a ListIterator over the elements of this list, in order, starting ! * at index ! * @throws IndexOutOfBoundsException if index < 0 || index > size() ! * @see #modCount ! */ ! public ListIterator listIterator(final int index) { if (index < 0 || index > size()) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" ! + size()); ! return new ListIterator() ! { ! private int knownMod = modCount; ! private int position = index; ! private int lastReturned = -1; ! private int size = size(); ! ! // This will get inlined, since it is private. ! private void checkMod() ! { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! } ! ! public boolean hasNext() ! { ! checkMod(); ! return position < size; ! } ! ! public boolean hasPrevious() ! { ! checkMod(); ! return position > 0; ! } ! ! public Object next() ! { ! checkMod(); ! if (position == size) ! throw new NoSuchElementException(); ! lastReturned = position; ! return get(position++); ! } ! ! public Object previous() ! { ! checkMod(); ! if (position == 0) ! throw new NoSuchElementException(); ! lastReturned = --position; ! return get(lastReturned); ! } ! ! public int nextIndex() ! { ! checkMod(); ! return position; ! } ! ! public int previousIndex() ! { ! checkMod(); ! return position - 1; ! } ! ! public void remove() ! { ! checkMod(); ! if (lastReturned < 0) ! throw new IllegalStateException(); ! AbstractList.this.remove(lastReturned); ! size--; ! position = lastReturned; ! lastReturned = -1; ! knownMod = modCount; ! } ! ! public void set(Object o) ! { ! checkMod(); ! if (lastReturned < 0) ! throw new IllegalStateException(); ! AbstractList.this.set(lastReturned, o); ! } ! ! public void add(Object o) ! { ! checkMod(); ! AbstractList.this.add(position++, o); ! size++; ! lastReturned = -1; ! knownMod = modCount; ! } ! }; } + /** + * Remove the element at a given position in this list (optional operation). + * Shifts all remaining elements to the left to fill the gap. This + * implementation always throws an UnsupportedOperationException. + * If you want fail-fast iterators, be sure to increment modCount when + * overriding this. + * + * @param index the position within the list of the object to remove + * @return the object that was removed + * @throws UnsupportedOperationException if this list does not support the + * remove operation + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + * @see #modCount + */ public Object remove(int index) { throw new UnsupportedOperationException(); *************** public abstract class AbstractList exten *** 175,182 **** * removeRange methods of the class which implements subList, which are * difficult for subclasses to override directly. Therefore, this method * should be overridden instead by the more efficient implementation, if one ! * exists. *

        * This implementation first checks for illegal or out of range arguments. It * then obtains a ListIterator over the list using listIterator(fromIndex). * It then calls next() and remove() on this iterator repeatedly, toIndex - --- 506,515 ---- * removeRange methods of the class which implements subList, which are * difficult for subclasses to override directly. Therefore, this method * should be overridden instead by the more efficient implementation, if one ! * exists. Overriding this can reduce quadratic efforts to constant time ! * in some cases! *

        + * * This implementation first checks for illegal or out of range arguments. It * then obtains a ListIterator over the list using listIterator(fromIndex). * It then calls next() and remove() on this iterator repeatedly, toIndex - *************** public abstract class AbstractList exten *** 190,341 **** ListIterator itr = listIterator(fromIndex); for (int index = fromIndex; index < toIndex; index++) { ! itr.next(); ! itr.remove(); } } public Object set(int index, Object o) { throw new UnsupportedOperationException(); } public List subList(int fromIndex, int toIndex) { if (fromIndex > toIndex) throw new IllegalArgumentException(fromIndex + " > " + toIndex); if (fromIndex < 0 || toIndex > size()) throw new IndexOutOfBoundsException(); return new SubList(this, fromIndex, toIndex); } ! class AbstractListItr implements ListIterator ! { ! private int knownMod = modCount; ! private int position; ! private int lastReturned = -1; ! private int size = size(); ! ! AbstractListItr(int start_pos) ! { ! this.position = start_pos; ! } ! ! private void checkMod() ! { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! } ! ! public boolean hasNext() ! { ! checkMod(); ! return position < size; ! } ! ! public boolean hasPrevious() ! { ! checkMod(); ! return position > 0; ! } ! ! public Object next() ! { ! checkMod(); ! if (position < size) ! { ! lastReturned = position++; ! return get(lastReturned); ! } ! else ! { ! throw new NoSuchElementException(); ! } ! } ! ! public Object previous() ! { ! checkMod(); ! if (position > 0) ! { ! lastReturned = --position; ! return get(lastReturned); ! } ! else ! { ! throw new NoSuchElementException(); ! } ! } ! ! public int nextIndex() ! { ! checkMod(); ! return position; ! } ! ! public int previousIndex() ! { ! checkMod(); ! return position - 1; ! } ! ! public void remove() ! { ! checkMod(); ! if (lastReturned < 0) ! { ! throw new IllegalStateException(); ! } ! AbstractList.this.remove(lastReturned); ! knownMod++; ! position = lastReturned; ! lastReturned = -1; ! } ! ! public void set(Object o) ! { ! checkMod(); ! if (lastReturned < 0) ! throw new IllegalStateException(); ! AbstractList.this.set(lastReturned, o); ! } ! ! public void add(Object o) ! { ! checkMod(); ! AbstractList.this.add(position++, o); ! lastReturned = -1; ! knownMod++; ! } ! } // AbstractList.Iterator ! } ! class SubList extends AbstractList { ! private AbstractList backingList; ! private int offset; private int size; ! public SubList(AbstractList backing, int fromIndex, int toIndex) { backingList = backing; ! modCount = backingList.modCount; offset = fromIndex; size = toIndex - fromIndex; } /** * This method checks the two modCount fields to ensure that there has ! * not been a concurrent modification. It throws an exception if there ! * has been, and otherwise returns normally. ! * Note that since this method is private, it will be inlined. * ! * @exception ConcurrentModificationException if there has been a ! * concurrent modification. */ private void checkMod() { if (modCount != backingList.modCount) --- 523,653 ---- ListIterator itr = listIterator(fromIndex); for (int index = fromIndex; index < toIndex; index++) { ! itr.next(); ! itr.remove(); } } + /** + * Replace an element of this list with another object (optional operation). + * This implementation always throws an UnsupportedOperationException. + * + * @param index the position within this list of the element to be replaced + * @param o the object to replace it with + * @return the object that was replaced + * @throws UnsupportedOperationException if this list does not support the + * set operation + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + * @throws ClassCastException if o cannot be added to this list due to its + * type + * @throws IllegalArgumentException if o cannot be added to this list for + * some other reason + */ public Object set(int index, Object o) { throw new UnsupportedOperationException(); } + /** + * Obtain a List view of a subsection of this list, from fromIndex + * (inclusive) to toIndex (exclusive). If the two indices are equal, the + * sublist is empty. The returned list should be modifiable if and only + * if this list is modifiable. Changes to the returned list should be + * reflected in this list. If this list is structurally modified in + * any way other than through the returned list, the result of any subsequent + * operations on the returned list is undefined. + *

        + * + * This implementation returns a subclass of AbstractList. It stores, in + * private fields, the offset and size of the sublist, and the expected + * modCount of the backing list. If the backing list implements RandomAccess, + * the sublist will also. + *

        + * + * The subclass's set(int, Object), get(int), + * add(int, Object), remove(int), + * addAll(int, Collection) and + * removeRange(int, int) methods all delegate to the + * corresponding methods on the backing abstract list, after + * bounds-checking the index and adjusting for the offset. The + * addAll(Collection c) method merely returns addAll(size, c). + * The listIterator(int) method returns a "wrapper object" + * over a list iterator on the backing list, which is created with the + * corresponding method on the backing list. The iterator() + * method merely returns listIterator(), and the size() method + * merely returns the subclass's size field. + *

        + * + * All methods first check to see if the actual modCount of the backing + * list is equal to its expected value, and throw a + * ConcurrentModificationException if it is not. + * + * @param fromIndex the index that the returned list should start from + * (inclusive) + * @param toIndex the index that the returned list should go to (exclusive) + * @return a List backed by a subsection of this list + * @throws IndexOutOfBoundsException if fromIndex < 0 + * || toIndex > size() + * @throws IllegalArgumentException if fromIndex > toIndex + * @see ConcurrentModificationException + * @see RandomAccess + */ public List subList(int fromIndex, int toIndex) { + // This follows the specification of AbstractList, but is inconsistent + // with the one in List. Don't you love Sun's inconsistencies? if (fromIndex > toIndex) throw new IllegalArgumentException(fromIndex + " > " + toIndex); if (fromIndex < 0 || toIndex > size()) throw new IndexOutOfBoundsException(); + if (this instanceof RandomAccess) + return new RandomAccessSubList(this, fromIndex, toIndex); return new SubList(this, fromIndex, toIndex); } ! } // class AbstractList + /** + * This class follows the implementation requirements set forth in + * {@link AbstractList#subList(int, int)}. Some compilers have problems + * with AbstractList.this.modCount if this class is nested in AbstractList, + * even though the JLS defines that to be legal, so we make it a top-level + * class. + * + * @author Original author unknown + * @author Eric Blake + */ class SubList extends AbstractList { ! private final AbstractList backingList; ! private final int offset; private int size; ! /** ! * Construct the sublist. ! * ! * @param backing the list this comes from ! * @param fromIndex the lower bound, inclusive ! * @param toIndex the upper bound, exclusive ! */ ! SubList(AbstractList backing, int fromIndex, int toIndex) { backingList = backing; ! modCount = backing.modCount; offset = fromIndex; size = toIndex - fromIndex; } /** * This method checks the two modCount fields to ensure that there has ! * not been a concurrent modification, returning if all is okay. * ! * @throws ConcurrentModificationException if the backing list has been ! * modified externally to this sublist */ + // This will get inlined, since it is private. private void checkMod() { if (modCount != backingList.modCount) *************** class SubList extends AbstractList *** 345,389 **** /** * This method checks that a value is between 0 and size (inclusive). If * it is not, an exception is thrown. - * Note that since this method is private, it will be inlined. * ! * @exception IndexOutOfBoundsException if the value is out of range. */ private void checkBoundsInclusive(int index) { if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); } /** * This method checks that a value is between 0 (inclusive) and size * (exclusive). If it is not, an exception is thrown. - * Note that since this method is private, it will be inlined. * ! * @exception IndexOutOfBoundsException if the value is out of range. */ private void checkBoundsExclusive(int index) { if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); } public int size() { checkMod(); return size; } public Object set(int index, Object o) { checkMod(); checkBoundsExclusive(index); ! o = backingList.set(index + offset, o); ! return o; } public Object get(int index) { checkMod(); --- 657,720 ---- /** * This method checks that a value is between 0 and size (inclusive). If * it is not, an exception is thrown. * ! * @param index the value to check ! * @throws IndexOutOfBoundsException if the value is out of range */ + // This will get inlined, since it is private. private void checkBoundsInclusive(int index) { if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" ! + size); } /** * This method checks that a value is between 0 (inclusive) and size * (exclusive). If it is not, an exception is thrown. * ! * @param index the value to check ! * @throws IndexOutOfBoundsException if the value is out of range */ + // This will get inlined, since it is private. private void checkBoundsExclusive(int index) { if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" ! + size); } + /** + * Specified by AbstractList.subList to return the private field size. + * + * @return the sublist size + */ public int size() { checkMod(); return size; } + /** + * Specified by AbstractList.subList to delegate to the backing list. + * + * @param index the location to modify + * @param o the new value + * @return the old value + */ public Object set(int index, Object o) { checkMod(); checkBoundsExclusive(index); ! return backingList.set(index + offset, o); } + /** + * Specified by AbstractList.subList to delegate to the backing list. + * + * @param index the location to get from + * @return the object at that location + */ public Object get(int index) { checkMod(); *************** class SubList extends AbstractList *** 391,452 **** return backingList.get(index + offset); } public void add(int index, Object o) { checkMod(); checkBoundsInclusive(index); backingList.add(index + offset, o); - this.modCount++; size++; } public Object remove(int index) { checkMod(); checkBoundsExclusive(index); Object o = backingList.remove(index + offset); - this.modCount++; size--; return o; } ! public void removeRange(int fromIndex, int toIndex) { checkMod(); - checkBoundsExclusive(fromIndex); - checkBoundsInclusive(toIndex); - // this call will catch the toIndex < fromIndex condition backingList.removeRange(offset + fromIndex, offset + toIndex); - this.modCount = backingList.modCount; size -= toIndex - fromIndex; } public boolean addAll(int index, Collection c) { checkMod(); checkBoundsInclusive(index); int csize = c.size(); boolean result = backingList.addAll(offset + index, c); - this.modCount = backingList.modCount; size += csize; return result; } public Iterator iterator() { ! return listIterator(0); } public ListIterator listIterator(final int index) ! { checkMod(); checkBoundsInclusive(index); ! return new ListIterator() { ! ListIterator i = backingList.listIterator(index + offset); ! int position = index; public boolean hasNext() { --- 722,830 ---- return backingList.get(index + offset); } + /** + * Specified by AbstractList.subList to delegate to the backing list. + * + * @param index the index to insert at + * @param o the object to add + */ public void add(int index, Object o) { checkMod(); checkBoundsInclusive(index); backingList.add(index + offset, o); size++; + modCount = backingList.modCount; } + /** + * Specified by AbstractList.subList to delegate to the backing list. + * + * @param index the index to remove + * @return the removed object + */ public Object remove(int index) { checkMod(); checkBoundsExclusive(index); Object o = backingList.remove(index + offset); size--; + modCount = backingList.modCount; return o; } ! /** ! * Specified by AbstractList.subList to delegate to the backing list. ! * This does no bounds checking, as it assumes it will only be called ! * by trusted code like clear() which has already checked the bounds. ! * ! * @param fromIndex the lower bound, inclusive ! * @param toIndex the upper bound, exclusive ! */ ! protected void removeRange(int fromIndex, int toIndex) { checkMod(); backingList.removeRange(offset + fromIndex, offset + toIndex); size -= toIndex - fromIndex; + modCount = backingList.modCount; } + /** + * Specified by AbstractList.subList to delegate to the backing list. + * + * @param index the location to insert at + * @param c the collection to insert + * @return true if this list was modified, in other words, c is non-empty + */ public boolean addAll(int index, Collection c) { checkMod(); checkBoundsInclusive(index); int csize = c.size(); boolean result = backingList.addAll(offset + index, c); size += csize; + modCount = backingList.modCount; return result; } + /** + * Specified by AbstractList.subList to return addAll(size, c). + * + * @param c the collection to insert + * @return true if this list was modified, in other words, c is non-empty + */ + public boolean addAll(Collection c) + { + return addAll(size, c); + } + + /** + * Specified by AbstractList.subList to return listIterator(). + * + * @return an iterator over the sublist + */ public Iterator iterator() { ! return listIterator(); } + /** + * Specified by AbstractList.subList to return a wrapper around the + * backing list's iterator. + * + * @param index the start location of the iterator + * @return a list iterator over the sublist + */ public ListIterator listIterator(final int index) ! { checkMod(); checkBoundsInclusive(index); ! return new ListIterator() { ! private final ListIterator i = backingList.listIterator(index + offset); ! private int position = index; public boolean hasNext() { *************** class SubList extends AbstractList *** 462,505 **** public Object next() { ! if (position < size) ! { ! Object o = i.next(); ! position++; ! return o; ! } ! else throw new NoSuchElementException(); } public Object previous() { ! if (position > 0) ! { ! Object o = i.previous(); ! position--; ! return o; ! } ! else throw new NoSuchElementException(); } public int nextIndex() { ! return offset + i.nextIndex(); } public int previousIndex() { ! return offset + i.previousIndex(); } public void remove() { i.remove(); - modCount++; size--; position = nextIndex(); } public void set(Object o) --- 840,875 ---- public Object next() { ! if (position == size) throw new NoSuchElementException(); + position++; + return i.next(); } public Object previous() { ! if (position == 0) throw new NoSuchElementException(); + position--; + return i.previous(); } public int nextIndex() { ! return i.nextIndex() - offset; } public int previousIndex() { ! return i.previousIndex() - offset; } public void remove() { i.remove(); size--; position = nextIndex(); + modCount = backingList.modCount; } public void set(Object o) *************** class SubList extends AbstractList *** 510,523 **** public void add(Object o) { i.add(o); - modCount++; size++; position++; } // Here is the reason why the various modCount fields are mostly // ignored in this wrapper listIterator. ! // IF the backing listIterator is failfast, then the following holds: // Using any other method on this list will call a corresponding // method on the backing list *after* the backing listIterator // is created, which will in turn cause a ConcurrentModException --- 880,893 ---- public void add(Object o) { i.add(o); size++; position++; + modCount = backingList.modCount; } // Here is the reason why the various modCount fields are mostly // ignored in this wrapper listIterator. ! // If the backing listIterator is failfast, then the following holds: // Using any other method on this list will call a corresponding // method on the backing list *after* the backing listIterator // is created, which will in turn cause a ConcurrentModException *************** class SubList extends AbstractList *** 530,538 **** // only, but somewhat pointless when the list can be changed under // us. // Either way, no explicit handling of modCount is needed. ! // However modCount++ must be executed in add and remove, and size ! // must also be updated in these two methods, since they do not go ! // through the corresponding methods of the subList. }; } ! } // SubList --- 900,930 ---- // only, but somewhat pointless when the list can be changed under // us. // Either way, no explicit handling of modCount is needed. ! // However modCount = backingList.modCount must be executed in add ! // and remove, and size must also be updated in these two methods, ! // since they do not go through the corresponding methods of the subList. }; } ! } // class SubList ! ! /** ! * This class is a RandomAccess version of SubList, as required by ! * {@link AbstractList#subList(int, int)}. ! * ! * @author Eric Blake ! */ ! final class RandomAccessSubList extends SubList ! implements RandomAccess ! { ! /** ! * Construct the sublist. ! * ! * @param backing the list this comes from ! * @param fromIndex the lower bound, inclusive ! * @param toIndex the upper bound, exclusive ! */ ! RandomAccessSubList(AbstractList backing, int fromIndex, int toIndex) ! { ! super(backing, fromIndex, toIndex); ! } ! } // class RandomAccessSubList diff -Nrc3pad gcc-3.0.4/libjava/java/util/AbstractMap.java gcc-3.1/libjava/java/util/AbstractMap.java *** gcc-3.0.4/libjava/java/util/AbstractMap.java Mon Dec 11 03:47:47 2000 --- gcc-3.1/libjava/java/util/AbstractMap.java Mon Apr 8 00:24:46 2002 *************** *** 1,5 **** /* AbstractMap.java -- Abstract implementation of most of Map ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* AbstractMap.java -- Abstract implementation of most of Map ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,285 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // comments - // test suite package java.util; public abstract class AbstractMap implements Map { /** ! * Remove all entries from this Map. This default implementation calls ! * entrySet().clear(). * ! * @throws UnsupportedOperationException ! * @specnote The JCL book claims that this implementation always throws ! * UnsupportedOperationException, while the online docs claim it ! * calls entrySet().clear(). We take the later to be correct. */ public void clear() { entrySet().clear(); } public boolean containsKey(Object key) { ! Object k; ! Set es = entrySet(); ! Iterator entries = es.iterator(); ! int size = size(); ! for (int pos = 0; pos < size; pos++) ! { ! k = ((Map.Entry) entries.next()).getKey(); ! if (key == null ? k == null : key.equals(k)) ! return true; ! } return false; } public boolean containsValue(Object value) { ! Object v; ! Set es = entrySet(); ! Iterator entries = es.iterator(); ! int size = size(); ! for (int pos = 0; pos < size; pos++) ! { ! v = ((Map.Entry) entries.next()).getValue(); ! if (value == null ? v == null : value.equals(v)) ! return true; ! } return false; } public abstract Set entrySet(); public boolean equals(Object o) { ! if (o == this) ! return true; ! if (!(o instanceof Map)) ! return false; ! ! Map m = (Map) o; ! Set s = m.entrySet(); ! Iterator itr = entrySet().iterator(); ! int size = size(); ! ! if (m.size() != size) ! return false; ! ! for (int pos = 0; pos < size; pos++) ! { ! if (!s.contains(itr.next())) ! return false; ! } ! return true; } public Object get(Object key) { ! Set s = entrySet(); ! Iterator entries = s.iterator(); ! int size = size(); ! ! for (int pos = 0; pos < size; pos++) { ! Map.Entry entry = (Map.Entry) entries.next(); ! Object k = entry.getKey(); ! if (key == null ? k == null : key.equals(k)) ! return entry.getValue(); } - return null; } public int hashCode() { ! int hashcode = 0; ! Iterator itr = entrySet().iterator(); ! int size = size(); ! for (int pos = 0; pos < size; pos++) ! { ! hashcode += itr.next().hashCode(); ! } ! return hashcode; } public boolean isEmpty() { return size() == 0; } public Set keySet() { ! if (this.keySet == null) { ! this.keySet = new AbstractSet() ! { ! public int size() ! { ! return AbstractMap.this.size(); ! } ! ! public boolean contains(Object key) ! { ! return AbstractMap.this.containsKey(key); ! } ! public Iterator iterator() ! { ! return new Iterator() ! { ! Iterator map_iterator = AbstractMap.this.entrySet().iterator(); ! public boolean hasNext() ! { ! return map_iterator.hasNext(); ! } ! public Object next() ! { ! return ((Map.Entry) map_iterator.next()).getKey(); ! } ! public void remove() ! { ! map_iterator.remove(); ! } ! }; ! } ! }; ! } ! return this.keySet; } public Object put(Object key, Object value) { throw new UnsupportedOperationException(); } public void putAll(Map m) { - Map.Entry entry; Iterator entries = m.entrySet().iterator(); ! int size = m.size(); ! ! for (int pos = 0; pos < size; pos++) { ! entry = (Map.Entry) entries.next(); ! put(entry.getKey(), entry.getValue()); } } public Object remove(Object key) { Iterator entries = entrySet().iterator(); ! int size = size(); ! ! for (int pos = 0; pos < size; pos++) { ! Map.Entry entry = (Map.Entry) entries.next(); ! Object k = entry.getKey(); ! if (key == null ? k == null : key.equals(k)) ! { ! Object value = entry.getValue(); ! entries.remove(); ! return value; ! } } - return null; } public int size() { return entrySet().size(); } public String toString() { Iterator entries = entrySet().iterator(); - int size = size(); StringBuffer r = new StringBuffer("{"); ! for (int pos = 0; pos < size; pos++) { ! // Append the toString value of the entries rather than calling ! // getKey/getValue. This is more efficient and it matches the JDK ! // behaviour. ! r.append(entries.next()); ! if (pos < size - 1) ! r.append(", "); } r.append("}"); return r.toString(); } public Collection values() { ! if (this.valueCollection == null) { ! this.valueCollection = new AbstractCollection() ! { ! public int size() ! { ! return AbstractMap.this.size(); ! } ! public Iterator iterator() ! { ! return new Iterator() ! { ! Iterator map_iterator = AbstractMap.this.entrySet().iterator(); ! public boolean hasNext() ! { ! return map_iterator.hasNext(); ! } ! public Object next() ! { ! return ((Map.Entry) map_iterator.next()).getValue(); ! } ! public void remove() ! { ! map_iterator.remove(); ! } ! }; ! } ! }; ! } ! return this.valueCollection; } ! private Collection valueCollection = null; ! private Set keySet = null; } --- 18,521 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; + /** + * An abstract implementation of Map to make it easier to create your own + * implementations. In order to create an unmodifiable Map, subclass + * AbstractMap and implement the entrySet (usually via an + * AbstractSet). To make it modifiable, also implement put, + * and have entrySet().iterator() support remove. + *

        + * + * It is recommended that classes which extend this support at least the + * no-argument constructor, and a constructor which accepts another Map. + * Further methods in this class may be overridden if you have a more + * efficient implementation. + * + * @author Original author unknown + * @author Bryce McKinlay + * @author Eric Blake + * @see Map + * @see Collection + * @see HashMap + * @see LinkedHashMap + * @see TreeMap + * @see WeakHashMap + * @see IdentityHashMap + * @since 1.2 + * @status updated to 1.4 + */ public abstract class AbstractMap implements Map { + /** An "enum" of iterator types. */ + // Package visible for use by subclasses. + static final int KEYS = 0, + VALUES = 1, + ENTRIES = 2; + /** ! * The cache for {@link #keySet()}. ! */ ! // Package visible for use by subclasses. ! Set keys; ! ! /** ! * The cache for {@link #values()}. ! */ ! // Package visible for use by subclasses. ! Collection values; ! ! /** ! * The main constructor, for use by subclasses. ! */ ! protected AbstractMap() ! { ! } ! ! /** ! * Remove all entries from this Map (optional operation). This default ! * implementation calls entrySet().clear(). NOTE: If the entry set does ! * not permit clearing, then this will fail, too. Subclasses often ! * override this for efficiency. Your implementation of entrySet() should ! * not call AbstractMap.clear unless you want an infinite loop. * ! * @throws UnsupportedOperationException if entrySet().clear() ! * does not support clearing. ! * @see Set#clear() */ public void clear() { entrySet().clear(); } + /** + * Create a shallow copy of this Map, no keys or values are copied. The + * default implementation simply calls super.clone(). + * + * @return the shallow clone + * @throws CloneNotSupportedException if a subclass is not Cloneable + * @see Cloneable + * @see Object#clone() + */ + protected Object clone() throws CloneNotSupportedException + { + AbstractMap copy = (AbstractMap) super.clone(); + // Clear out the caches; they are stale. + copy.keys = null; + copy.values = null; + return copy; + } + + /** + * Returns true if this contains a mapping for the given key. This + * implementation does a linear search, O(n), over the + * entrySet(), returning true if a match + * is found, false if the iteration ends. Many subclasses + * can implement this more efficiently. + * + * @param key the key to search for + * @return true if the map contains the key + * @throws NullPointerException if key is null but the map + * does not permit null keys + * @see #containsValue(Object) + */ public boolean containsKey(Object key) { ! Iterator entries = entrySet().iterator(); ! int pos = size(); ! while (--pos >= 0) ! if (equals(key, ((Map.Entry) entries.next()).getKey())) ! return true; return false; } + /** + * Returns true if this contains at least one mapping with the given value. + * This implementation does a linear search, O(n), over the + * entrySet(), returning true if a match + * is found, false if the iteration ends. A match is + * defined as (value == null ? v == null : value.equals(v)) + * Subclasses are unlikely to implement this more efficiently. + * + * @param value the value to search for + * @return true if the map contains the value + * @see #containsKey(Object) + */ public boolean containsValue(Object value) { ! Iterator entries = entrySet().iterator(); ! int pos = size(); ! while (--pos >= 0) ! if (equals(value, ((Map.Entry) entries.next()).getValue())) ! return true; return false; } + /** + * Returns a set view of the mappings in this Map. Each element in the + * set must be an implementation of Map.Entry. The set is backed by + * the map, so that changes in one show up in the other. Modifications + * made while an iterator is in progress cause undefined behavior. If + * the set supports removal, these methods must be valid: + * Iterator.remove, Set.remove, + * removeAll, retainAll, and clear. + * Element addition is not supported via this set. + * + * @return the entry set + * @see Map.Entry + */ public abstract Set entrySet(); + /** + * Compares the specified object with this map for equality. Returns + * true if the other object is a Map with the same mappings, + * that is,
        + * o instanceof Map && entrySet().equals(((Map) o).entrySet(); + * + * @param o the object to be compared + * @return true if the object equals this map + * @see Set#equals(Object) + */ public boolean equals(Object o) { ! return (o == this || ! (o instanceof Map && ! entrySet().equals(((Map) o).entrySet()))); } + /** + * Returns the value mapped by the given key. Returns null if + * there is no mapping. However, in Maps that accept null values, you + * must rely on containsKey to determine if a mapping exists. + * This iteration takes linear time, searching entrySet().iterator() of + * the key. Many implementations override this method. + * + * @param key the key to look up + * @return the value associated with the key, or null if key not in map + * @throws NullPointerException if this map does not accept null keys + * @see #containsKey(Object) + */ public Object get(Object key) { ! Iterator entries = entrySet().iterator(); ! int pos = size(); ! while (--pos >= 0) { ! Map.Entry entry = (Map.Entry) entries.next(); ! if (equals(key, entry.getKey())) ! return entry.getValue(); } return null; } + /** + * Returns the hash code for this map. As defined in Map, this is the sum + * of all hashcodes for each Map.Entry object in entrySet, or basically + * entrySet().hashCode(). + * + * @return the hash code + * @see Map.Entry#hashCode() + * @see Set#hashCode() + */ public int hashCode() { ! return entrySet().hashCode(); } + /** + * Returns true if the map contains no mappings. This is implemented by + * size() == 0. + * + * @return true if the map is empty + * @see #size() + */ public boolean isEmpty() { return size() == 0; } + /** + * Returns a set view of this map's keys. The set is backed by the map, + * so changes in one show up in the other. Modifications while an iteration + * is in progress produce undefined behavior. The set supports removal + * if entrySet() does, but does not support element addition. + *

        + * + * This implementation creates an AbstractSet, where the iterator wraps + * the entrySet iterator, size defers to the Map's size, and contains + * defers to the Map's containsKey. The set is created on first use, and + * returned on subsequent uses, although since no synchronization occurs, + * there is a slight possibility of creating two sets. + * + * @return a Set view of the keys + * @see Set#iterator() + * @see #size() + * @see #containsKey(Object) + * @see #values() + */ public Set keySet() { ! if (keys == null) ! keys = new AbstractSet() { ! public int size() ! { ! return AbstractMap.this.size(); ! } ! public boolean contains(Object key) ! { ! return containsKey(key); ! } ! public Iterator iterator() ! { ! return new Iterator() ! { ! private final Iterator map_iterator = entrySet().iterator(); ! public boolean hasNext() ! { ! return map_iterator.hasNext(); ! } ! public Object next() ! { ! return ((Map.Entry) map_iterator.next()).getKey(); ! } ! public void remove() ! { ! map_iterator.remove(); ! } ! }; ! } ! }; ! return keys; } + /** + * Associates the given key to the given value (optional operation). If the + * map already contains the key, its value is replaced. This implementation + * simply throws an UnsupportedOperationException. Be aware that in a map + * that permits null values, a null return does not always + * imply that the mapping was created. + * + * @param key the key to map + * @param value the value to be mapped + * @return the previous value of the key, or null if there was no mapping + * @throws UnsupportedOperationException if the operation is not supported + * @throws ClassCastException if the key or value is of the wrong type + * @throws IllegalArgumentException if something about this key or value + * prevents it from existing in this map + * @throws NullPointerException if the map forbids null keys or values + * @see #containsKey(Object) + */ public Object put(Object key, Object value) { throw new UnsupportedOperationException(); } + /** + * Copies all entries of the given map to this one (optional operation). If + * the map already contains a key, its value is replaced. This implementation + * simply iterates over the map's entrySet(), calling put, + * so it is not supported if puts are not. + * + * @param m the mapping to load into this map + * @throws UnsupportedOperationException if the operation is not supported + * @throws ClassCastException if a key or value is of the wrong type + * @throws IllegalArgumentException if something about a key or value + * prevents it from existing in this map + * @throws NullPointerException if the map forbids null keys or values, or + * if m is null. + * @see #put(Object, Object) + */ public void putAll(Map m) { Iterator entries = m.entrySet().iterator(); ! int pos = m.size(); ! while (--pos >= 0) { ! Map.Entry entry = (Map.Entry) entries.next(); ! put(entry.getKey(), entry.getValue()); } } + /** + * Removes the mapping for this key if present (optional operation). This + * implementation iterates over the entrySet searching for a matching + * key, at which point it calls the iterator's remove method. + * It returns the result of getValue() on the entry, if found, + * or null if no entry is found. Note that maps which permit null values + * may also return null if the key was removed. If the entrySet does not + * support removal, this will also fail. This is O(n), so many + * implementations override it for efficiency. + * + * @param key the key to remove + * @return the value the key mapped to, or null if not present + * @throws UnsupportedOperationException if deletion is unsupported + * @see Iterator#remove() + */ public Object remove(Object key) { Iterator entries = entrySet().iterator(); ! int pos = size(); ! while (--pos >= 0) { ! Map.Entry entry = (Map.Entry) entries.next(); ! if (equals(key, entry.getKey())) ! { ! // Must get the value before we remove it from iterator. ! Object r = entry.getValue(); ! entries.remove(); ! return r; ! } } return null; } + /** + * Returns the number of key-value mappings in the map. If there are more + * than Integer.MAX_VALUE mappings, return Integer.MAX_VALUE. This is + * implemented as entrySet().size(). + * + * @return the number of mappings + * @see Set#size() + */ public int size() { return entrySet().size(); } + /** + * Returns a String representation of this map. This is a listing of the + * map entries (which are specified in Map.Entry as being + * getKey() + "=" + getValue()), separated by a comma and + * space (", "), and surrounded by braces ('{' and '}'). This implementation + * uses a StringBuffer and iterates over the entrySet to build the String. + * Note that this can fail with an exception if underlying keys or + * values complete abruptly in toString(). + * + * @return a String representation + * @see Map.Entry#toString() + */ public String toString() { Iterator entries = entrySet().iterator(); StringBuffer r = new StringBuffer("{"); ! for (int pos = size(); pos > 0; pos--) { ! Map.Entry entry = (Map.Entry) entries.next(); ! r.append(entry.getKey()); ! r.append('='); ! r.append(entry.getValue()); ! if (pos > 1) ! r.append(", "); } r.append("}"); return r.toString(); } + /** + * Returns a collection or bag view of this map's values. The collection + * is backed by the map, so changes in one show up in the other. + * Modifications while an iteration is in progress produce undefined + * behavior. The collection supports removal if entrySet() does, but + * does not support element addition. + *

        + * + * This implementation creates an AbstractCollection, where the iterator + * wraps the entrySet iterator, size defers to the Map's size, and contains + * defers to the Map's containsValue. The collection is created on first + * use, and returned on subsequent uses, although since no synchronization + * occurs, there is a slight possibility of creating two collections. + * + * @return a Collection view of the values + * @see Collection#iterator() + * @see #size() + * @see #containsValue(Object) + * @see #keySet() + */ public Collection values() { ! if (values == null) ! values = new AbstractCollection() { ! public int size() ! { ! return AbstractMap.this.size(); ! } ! public Iterator iterator() ! { ! return new Iterator() ! { ! private final Iterator map_iterator = entrySet().iterator(); ! public boolean hasNext() ! { ! return map_iterator.hasNext(); ! } ! public Object next() ! { ! return ((Map.Entry) map_iterator.next()).getValue(); ! } ! public void remove() ! { ! map_iterator.remove(); ! } ! }; ! } ! }; ! return values; ! } ! /** ! * Compare two objects according to Collection semantics. ! * ! * @param o1 the first object ! * @param o2 the second object ! * @return o1 == null ? o2 == null : o1.equals(o2) ! */ ! // Package visible for use throughout java.util. ! // It may be inlined since it is final. ! static final boolean equals(Object o1, Object o2) ! { ! return o1 == null ? o2 == null : o1.equals(o2); } ! /** ! * Hash an object according to Collection semantics. ! * ! * @param o the object to hash ! * @return o1 == null ? 0 : o1.hashCode() ! */ ! // Package visible for use throughout java.util. ! // It may be inlined since it is final. ! static final int hashCode(Object o) ! { ! return o == null ? 0 : o.hashCode(); ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/AbstractSequentialList.java gcc-3.1/libjava/java/util/AbstractSequentialList.java *** gcc-3.0.4/libjava/java/util/AbstractSequentialList.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/AbstractSequentialList.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* AbstractSequentialList.java -- List implementation for sequential access ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* AbstractSequentialList.java -- List implementation for sequential access ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,124 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Lots of doc comments still missing. - // ~ The class comment should include a description of what should be overridden - // to provide what features, as should the listIterator comment. package java.util; /** * Abstract superclass to make it easier to implement the List interface when ! * backed by a sequential-access store, such as a linked list. */ public abstract class AbstractSequentialList extends AbstractList { /** * Returns a ListIterator over the list, starting from position index. * Subclasses must provide an implementation of this method. * ! * @exception IndexOutOfBoundsException if index < 0 || index > size() */ public abstract ListIterator listIterator(int index); /** ! * Add an element to the list at a given index. This implementation obtains a ! * ListIterator positioned at the specified index, and then adds the element ! * using the ListIterator's add method. * ! * @param index the position to add the element ! * @param o the element to insert ! * @exception IndexOutOfBoundsException if index < 0 || index > size() ! * @exception UnsupportedOperationException if the iterator returned by ! * listIterator(index) does not support the add method. */ public void add(int index, Object o) { ! ListIterator i = listIterator(index); ! i.add(o); } /** ! * @specnote The spec in the JDK1.3 online docs is wrong. The implementation ! * should not call next() to skip over new elements as they are ! * added, because iterator.add() should add new elements BEFORE ! * the cursor. */ public boolean addAll(int index, Collection c) { - boolean modified = false; Iterator ci = c.iterator(); int size = c.size(); ListIterator i = listIterator(index); ! for (int pos = 0; pos < size; pos++) ! { ! i.add(ci.next()); ! } ! return (size > 0); } public Object get(int index) { ! ListIterator i = listIterator(index); ! if (index < 0 || index > size()) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size()); ! return i.next(); } /** ! * Return an Iterator over this List. This implementation returns ! * listIterator(). * ! * @return an Iterator over this List */ public Iterator iterator() { return listIterator(); } public Object remove(int index) { ListIterator i = listIterator(index); - if (index < 0 || index > size()) - throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + - size()); Object removed = i.next(); i.remove(); return removed; } public Object set(int index, Object o) { ListIterator i = listIterator(index); - if (index < 0 || index > size()) - throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + - size()); Object old = i.next(); i.set(o); return old; --- 18,227 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; /** * Abstract superclass to make it easier to implement the List interface when ! * backed by a sequential-access store, such as a linked list. For random ! * access data, use AbstractList. This class implements the random access ! * methods (get, set, add, and ! * remove) atop the list iterator, opposite of AbstractList's ! * approach of implementing the iterator atop random access. ! *

        ! * ! * To implement a list, you need an implementation for size() ! * and listIterator. With just hasNext, ! * next, hasPrevious, previous, ! * nextIndex, and previousIndex, you have an ! * unmodifiable list. For a modifiable one, add set, and for ! * a variable-size list, add add and remove. ! *

        ! * ! * The programmer should provide a no-argument constructor, and one that ! * accepts another Collection, as recommended by the Collection interface. ! * Unfortunately, there is no way to enforce this in Java. ! * ! * @author Original author unknown ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see Collection ! * @see List ! * @see AbstractList ! * @see AbstractCollection ! * @see ListIterator ! * @see LinkedList ! * @since 1.2 ! * @status updated to 1.4 */ public abstract class AbstractSequentialList extends AbstractList { /** + * The main constructor, for use by subclasses. + */ + protected AbstractSequentialList() + { + } + + /** * Returns a ListIterator over the list, starting from position index. * Subclasses must provide an implementation of this method. * ! * @param index the starting position of the list ! * @return the list iterator ! * @throws IndexOutOfBoundsException if index < 0 || index > size() */ public abstract ListIterator listIterator(int index); /** ! * Insert an element into the list at a given position (optional operation). ! * This shifts all existing elements from that position to the end one ! * index to the right. This version of add has no return, since it is ! * assumed to always succeed if there is no exception. This iteration ! * uses listIterator(index).add(o). * ! * @param index the location to insert the item ! * @param o the object to insert ! * @throws UnsupportedOperationException if this list does not support the ! * add operation ! * @throws IndexOutOfBoundsException if index < 0 || index > size() ! * @throws ClassCastException if o cannot be added to this list due to its ! * type ! * @throws IllegalArgumentException if o cannot be added to this list for ! * some other reason */ public void add(int index, Object o) { ! listIterator(index).add(o); } /** ! * Insert the contents of a collection into the list at a given position ! * (optional operation). Shift all elements at that position to the right ! * by the number of elements inserted. This operation is undefined if ! * this list is modified during the operation (for example, if you try ! * to insert a list into itself). ! *

        ! * ! * This implementation grabs listIterator(index), then proceeds to use add ! * for each element returned by c's iterator. Sun's online specs are wrong, ! * claiming that this also calls next(): listIterator.add() correctly ! * skips the added element. ! * ! * @param index the location to insert the collection ! * @param c the collection to insert ! * @return true if the list was modified by this action, that is, if c is ! * non-empty ! * @throws UnsupportedOperationException if this list does not support the ! * addAll operation ! * @throws IndexOutOfBoundsException if index < 0 || index > size() ! * @throws ClassCastException if some element of c cannot be added to this ! * list due to its type ! * @throws IllegalArgumentException if some element of c cannot be added ! * to this list for some other reason ! * @throws NullPointerException if the specified collection is null ! * @see #add(int, Object) */ public boolean addAll(int index, Collection c) { Iterator ci = c.iterator(); int size = c.size(); ListIterator i = listIterator(index); ! for (int pos = size; pos > 0; pos--) ! i.add(ci.next()); ! return size > 0; } + /** + * Get the element at a given index in this list. This implementation + * returns listIterator(index).next(). + * + * @param index the index of the element to be returned + * @return the element at index index in this list + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + */ public Object get(int index) { ! // This is a legal listIterator position, but an illegal get. ! if (index == size()) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" ! + size()); ! return listIterator(index).next(); } /** ! * Obtain an Iterator over this list, whose sequence is the list order. This ! * implementation returns listIterator(). * ! * @return an Iterator over the elements of this list, in order */ public Iterator iterator() { return listIterator(); } + /** + * Remove the element at a given position in this list (optional operation). + * Shifts all remaining elements to the left to fill the gap. This + * implementation uses listIterator(index) and ListIterator.remove(). + * + * @param index the position within the list of the object to remove + * @return the object that was removed + * @throws UnsupportedOperationException if this list does not support the + * remove operation + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + */ public Object remove(int index) { + // This is a legal listIterator position, but an illegal remove. + if (index == size()) + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + + size()); ListIterator i = listIterator(index); Object removed = i.next(); i.remove(); return removed; } + /** + * Replace an element of this list with another object (optional operation). + * This implementation uses listIterator(index) and ListIterator.set(o). + * + * @param index the position within this list of the element to be replaced + * @param o the object to replace it with + * @return the object that was replaced + * @throws UnsupportedOperationException if this list does not support the + * set operation + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + * @throws ClassCastException if o cannot be added to this list due to its + * type + * @throws IllegalArgumentException if o cannot be added to this list for + * some other reason + */ public Object set(int index, Object o) { + // This is a legal listIterator position, but an illegal set. + if (index == size()) + throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + + size()); ListIterator i = listIterator(index); Object old = i.next(); i.set(o); return old; diff -Nrc3pad gcc-3.0.4/libjava/java/util/AbstractSet.java gcc-3.1/libjava/java/util/AbstractSet.java *** gcc-3.0.4/libjava/java/util/AbstractSet.java Mon Dec 11 03:47:47 2000 --- gcc-3.1/libjava/java/util/AbstractSet.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* AbstractSet.java -- Abstract implementation of most of Set ! Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* AbstractSet.java -- Abstract implementation of most of Set ! Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** package java.util; *** 35,44 **** --- 46,73 ---- * on them - specifically, no element may be in the set more than once). This * class simply provides implementations of equals() and hashCode() to fulfil * the requirements placed on them by the Set interface. + * + * @author Original author unknown + * @author Eric Blake + * @see Collection + * @see AbstractCollection + * @see Set + * @see HashSet + * @see TreeSet + * @see LinkedHashSet + * @since 1.2 + * @status updated to 1.4 */ public abstract class AbstractSet extends AbstractCollection implements Set { /** + * The main constructor, for use by subclasses. + */ + protected AbstractSet() + { + } + + /** * Tests whether the given object is equal to this Set. This implementation * first checks whether this set is the given object, and returns * true if so. Otherwise, if o is a Set and is the same size as this one, it *************** public abstract class AbstractSet extend *** 50,61 **** */ public boolean equals(Object o) { ! if (o == this) ! return true; ! else if (o instanceof Set && ((Set) o).size() == size()) ! return containsAll((Collection) o); ! else ! return false; } /** --- 79,87 ---- */ public boolean equals(Object o) { ! return (o == this || ! (o instanceof Set && ((Set) o).size() == size() ! && containsAll((Collection) o))); } /** *************** public abstract class AbstractSet extend *** 69,82 **** public int hashCode() { Iterator itr = iterator(); - int size = size(); int hash = 0; ! for (int pos = 0; pos < size; pos++) { ! Object obj = itr.next(); ! if (obj != null) ! hash += obj.hashCode(); } ! return hash; } } --- 95,139 ---- public int hashCode() { Iterator itr = iterator(); int hash = 0; ! int pos = size(); ! while (--pos >= 0) ! hash += hashCode(itr.next()); ! return hash; ! } ! ! /** ! * Removes from this set all elements in the given collection (optional ! * operation). This implementation uses size() to determine ! * the smaller collection. Then, if this set is smaller, it iterates ! * over the set, calling Iterator.remove if the collection contains ! * the element. If this set is larger, it iterates over the collection, ! * calling Set.remove for all elements in the collection. Note that ! * this operation will fail if a remove methods is not supported. ! * ! * @param c the collection of elements to remove ! * @return true if the set was modified as a result ! * @throws UnsupportedOperationException if remove is not supported ! * @throws NullPointerException if the collection is null ! * @see AbstractCollection#remove(Object) ! * @see Collection#contains(Object) ! * @see Iterator#remove() ! */ ! public boolean removeAll(Collection c) ! { ! int oldsize = size(); ! int count = c.size(); ! Iterator i; ! if (oldsize < count) { ! for (i = iterator(), count = oldsize; count > 0; count--) ! if (c.contains(i.next())) ! i.remove(); } ! else ! for (i = c.iterator(); count > 0; count--) ! remove(i.next()); ! return oldsize != size(); } + } diff -Nrc3pad gcc-3.0.4/libjava/java/util/ArrayList.java gcc-3.1/libjava/java/util/ArrayList.java *** gcc-3.0.4/libjava/java/util/ArrayList.java Sun Dec 17 11:51:14 2000 --- gcc-3.1/libjava/java/util/ArrayList.java Sun Apr 7 07:42:30 2002 *************** *** 1,6 **** /* ArrayList.java -- JDK1.2's answer to Vector; this is an array-backed implementation of the List interface ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- /* ArrayList.java -- JDK1.2's answer to Vector; this is an array-backed implementation of the List interface ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.ObjectInputStream; *** 35,418 **** import java.io.ObjectOutputStream; /** ! * An array-backed implementation of the List interface. ArrayList ! * performs well on simple tasks: random access into a list, appending ! * to or removing from the end of a list, checking the size, &c. * ! * @author Jon A. Zeppieri ! * @version $Id: ArrayList.java,v 1.6 2000/12/17 11:51:14 bryce Exp $ ! * @see java.util.AbstractList ! * @see java.util.List */ public class ArrayList extends AbstractList ! implements List, Cloneable, Serializable { ! /** the default capacity for new ArrayLists */ private static final int DEFAULT_CAPACITY = 16; ! /** the number of elements in this list */ ! int size; ! /** where the data is stored */ ! transient Object[] data; ! /** ! * Construct a new ArrayList with the supplied initial capacity. * ! * @param capacity Initial capacity of this ArrayList */ public ArrayList(int capacity) { data = new Object[capacity]; } - /** ! * Construct a new ArrayList with the default capcity */ public ArrayList() { this(DEFAULT_CAPACITY); } ! /** * Construct a new ArrayList, and initialize it with the elements ! * in the supplied Collection; Sun specs say that the initial ! * capacity is 110% of the Collection's size. * * @param c the collection whose elements will initialize this list */ public ArrayList(Collection c) { ! this((int) (c.size() * 1.1)); addAll(c); } /** * Guarantees that this list will have at least enough capacity to ! * hold minCapacity elements. * - * @specnote This implementation will grow the list to - * max(current * 2, minCapacity) if (minCapacity > current). The JCL says - * explictly that "this method increases its capacity to minCap", while - * the JDK 1.3 online docs specify that the list will grow to at least the - * size specified. * @param minCapacity the minimum guaranteed capacity */ public void ensureCapacity(int minCapacity) { - Object[] newData; int current = data.length; if (minCapacity > current) { ! newData = new Object[Math.max((current * 2), minCapacity)]; ! System.arraycopy(data, 0, newData, 0, size); ! data = newData; } } /** ! * Appends the supplied element to the end of this list. * ! * @param e the element to be appended to this list */ ! public boolean add(Object e) { ! modCount++; ! if (size == data.length) ! ensureCapacity(size + 1); ! data[size++] = e; ! return true; } /** ! * Retrieves the element at the user-supplied index. * ! * @param index the index of the element we are fetching ! * @throws IndexOutOfBoundsException (iIndex < 0) || (iIndex >= size()) */ ! public Object get(int index) { ! if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! return data[index]; } /** ! * Returns the number of elements in this list */ ! public int size() { ! return size; } /** ! * Removes the element at the user-supplied index * ! * @param iIndex the index of the element to be removed ! * @return the removed Object ! * @throws IndexOutOfBoundsException (iIndex < 0) || (iIndex >= size()) */ ! public Object remove(int index) { ! modCount++; ! if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! Object r = data[index]; ! if (index != --size) ! System.arraycopy(data, (index + 1), data, index, (size - index)); ! data[size] = null; ! return r; } /** ! * Removes all elements in the half-open interval [iFromIndex, iToIndex). * ! * @param fromIndex the first index which will be removed ! * @param toIndex one greater than the last index which will be ! * removed */ ! protected void removeRange(int fromIndex, int toIndex) { ! modCount++; ! if (fromIndex != toIndex) { ! System.arraycopy(data, toIndex, data, fromIndex, size - toIndex); ! size -= (toIndex - fromIndex); } } /** * Adds the supplied element at the specified index, shifting all * elements currently at that index or higher one to the right. * ! * @param index the index at which the element is being added ! * @param e the item being added */ public void add(int index, Object e) { modCount++; - if (index < 0 || index > size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + - size); if (size == data.length) ensureCapacity(size + 1); if (index != size) ! System.arraycopy(data, index, data, index + 1, size - index); data[index] = e; size++; } ! /** ! * Add each element in the supplied Collection to this List. * ! * @param c a Collection containing elements to be ! * added to this List */ public boolean addAll(Collection c) { return addAll(size, c); } ! /** * Add all elements in the supplied collection, inserting them beginning * at the specified index. * ! * @param index the index at which the elements will be inserted ! * @param c the Collection containing the elements to be ! * inserted */ public boolean addAll(int index, Collection c) { ! if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! modCount++; Iterator itr = c.iterator(); int csize = c.size(); if (csize + size > data.length) ensureCapacity(size + csize); int end = index + csize; if (size > 0 && index != size) ! System.arraycopy(data, index, data, end, csize); size += csize; ! for (; index < end; index++) ! { ! data[index] = itr.next(); ! } ! return (csize > 0); } /** ! * Creates a shallow copy of this ArrayList */ ! public Object clone() { ! ArrayList clone = null; ! try { ! clone = (ArrayList) super.clone(); ! clone.data = new Object[data.length]; ! System.arraycopy(data, 0, clone.data, 0, size); } ! catch (CloneNotSupportedException e) {} ! return clone; } ! /** ! * Returns true iff oElement is in this ArrayList. * ! * @param e the element whose inclusion in the List is being ! * tested */ ! public boolean contains(Object e) { ! return (indexOf(e) != -1); } /** ! * Returns the lowest index at which oElement appears in this List, or ! * -1 if it does not appear. * ! * @param e the element whose inclusion in the List is being ! * tested */ ! public int indexOf(Object e) { ! for (int i = 0; i < size; i++) ! { ! if (e == null ? data[i] == null : e.equals(data[i])) ! return i; ! } ! return -1; } /** ! * Returns the highest index at which oElement appears in this List, or ! * -1 if it does not appear. * ! * @param e the element whose inclusion in the List is being ! * tested */ ! public int lastIndexOf(Object e) { int i; - for (i = size - 1; i >= 0; i--) - { - if (e == null ? data[i] == null : e.equals(data[i])) - return i; - } - return -1; - } - - /** - * Removes all elements from this List - */ - public void clear() - { modCount++; ! for (int i = 0; i < size; i++) ! { ! data[i] = null; ! } ! size = 0; } /** ! * Sets the element at the specified index. * ! * @param index the index at which the element is being set ! * @param e the element to be set ! * @return the element previously at the specified index, or null if ! * none was there */ ! public Object set(int index, Object e) { ! Object result; ! if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! result = data[index]; ! // SEH: no structural change, so don't update modCount ! data[index] = e; ! return result; ! } ! /** ! * Returns an Object Array containing all of the elements in this ArrayList ! */ ! public Object[] toArray() ! { ! Object[] array = new Object[size]; ! System.arraycopy(data, 0, array, 0, size); ! return array; } /** ! * Returns an Array whose component type is the runtime component type of ! * the passed-in Array. The returned Array is populated with all of the ! * elements in this ArrayList. If the passed-in Array is not large enough ! * to store all of the elements in this List, a new Array will be created ! * and returned; if the passed-in Array is larger than the size ! * of this List, then size() index will be set to null. * ! * @param array the passed-in Array */ ! public Object[] toArray(Object[] array) { ! if (array.length < size) ! array = (Object[]) Array.newInstance(array.getClass().getComponentType(), ! size); ! else if (array.length > size) ! array[size] = null; ! System.arraycopy(data, 0, array, 0, size); ! return array; } /** ! * Trims the capacity of this List to be equal to its size; ! * a memory saver. */ ! public void trimToSize() ! { ! // not a structural change from the perspective of iterators on this list, ! // so don't update modCount ! Object[] newData = new Object[size]; ! System.arraycopy(data, 0, newData, 0, size); ! data = newData; ! } ! ! private void writeObject(ObjectOutputStream out) throws IOException ! { ! int i; ! ! // The 'size' field. ! out.defaultWriteObject(); ! ! // FIXME: Do we really want to serialize unused list entries?? ! out.writeInt(data.length); ! for (i = 0; i < data.length; i++) ! out.writeObject(data[i]); ! } ! ! private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - int i; - int capacity; - // the `size' field. ! in.defaultReadObject(); ! ! capacity = in.readInt(); data = new Object[capacity]; ! ! for (i = 0; i < capacity; i++) ! data[i] = in.readObject(); } } --- 46,584 ---- import java.io.ObjectOutputStream; /** ! * An array-backed implementation of the List interface. This implements ! * all optional list operations, and permits null elements, so that it is ! * better than Vector, which it replaces. Random access is roughly constant ! * time, and iteration is roughly linear time, so it is nice and fast, with ! * less overhead than a LinkedList. ! *

        * ! * Each list has a capacity, and as the array reaches that capacity it ! * is automatically transferred to a larger array. You also have access to ! * ensureCapacity and trimToSize to control the backing array's size, avoiding ! * reallocation or wasted memory. ! *

        ! * ! * ArrayList is not synchronized, so if you need multi-threaded access, ! * consider using:
        ! * List l = Collections.synchronizedList(new ArrayList(...)); ! *

        ! * ! * The iterators are fail-fast, meaning that any structural ! * modification, except for remove() called on the iterator ! * itself, cause the iterator to throw a ! * {@link ConcurrentModificationException} rather than exhibit ! * non-deterministic behavior. ! * ! * @author Jon A. Zeppieri ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see Collection ! * @see List ! * @see LinkedList ! * @see Vector ! * @see Collections#synchronizedList(List) ! * @see AbstractList ! * @status updated to 1.4 */ public class ArrayList extends AbstractList ! implements List, RandomAccess, Cloneable, Serializable { ! /** ! * Compatible with JDK 1.2 ! */ ! private static final long serialVersionUID = 8683452581122892189L; ! ! /** ! * The default capacity for new ArrayLists. ! */ private static final int DEFAULT_CAPACITY = 16; ! /** ! * The number of elements in this list. ! * @serial the list size ! */ ! private int size; ! /** ! * Where the data is stored. ! */ ! private transient Object[] data; ! /** ! * Construct a new ArrayList with the supplied initial capacity. * ! * @param capacity initial capacity of this ArrayList ! * @throws IllegalArgumentException if capacity is negative */ public ArrayList(int capacity) { + // Must explicitly check, to get correct exception. + if (capacity < 0) + throw new IllegalArgumentException(); data = new Object[capacity]; } /** ! * Construct a new ArrayList with the default capcity (16). */ public ArrayList() { this(DEFAULT_CAPACITY); } ! /** * Construct a new ArrayList, and initialize it with the elements ! * in the supplied Collection. The initial capacity is 110% of the ! * Collection's size. * * @param c the collection whose elements will initialize this list + * @throws NullPointerException if c is null */ public ArrayList(Collection c) { ! this((int) (c.size() * 1.1f)); addAll(c); } /** + * Trims the capacity of this List to be equal to its size; + * a memory saver. + */ + public void trimToSize() + { + // Not a structural change from the perspective of iterators on this list, + // so don't update modCount. + if (size != data.length) + { + Object[] newData = new Object[size]; + System.arraycopy(data, 0, newData, 0, size); + data = newData; + } + } + + /** * Guarantees that this list will have at least enough capacity to ! * hold minCapacity elements. This implementation will grow the list to ! * max(current * 2, minCapacity) if (minCapacity > current). The JCL says ! * explictly that "this method increases its capacity to minCap", while ! * the JDK 1.3 online docs specify that the list will grow to at least the ! * size specified. * * @param minCapacity the minimum guaranteed capacity */ public void ensureCapacity(int minCapacity) { int current = data.length; if (minCapacity > current) { ! Object[] newData = new Object[Math.max(current * 2, minCapacity)]; ! System.arraycopy(data, 0, newData, 0, size); ! data = newData; } } /** ! * Returns the number of elements in this list. * ! * @return the list size */ ! public int size() { ! return size; } /** ! * Checks if the list is empty. * ! * @return true if there are no elements */ ! public boolean isEmpty() { ! return size == 0; } /** ! * Returns true iff element is in this ArrayList. ! * ! * @param e the element whose inclusion in the List is being tested ! * @return true if the list contains e */ ! public boolean contains(Object e) { ! return indexOf(e) != -1; } /** ! * Returns the lowest index at which element appears in this List, or ! * -1 if it does not appear. * ! * @param e the element whose inclusion in the List is being tested ! * @return the index where e was found */ ! public int indexOf(Object e) { ! for (int i = 0; i < size; i++) ! if (equals(e, data[i])) ! return i; ! return -1; } /** ! * Returns the highest index at which element appears in this List, or ! * -1 if it does not appear. * ! * @param e the element whose inclusion in the List is being tested ! * @return the index where e was found */ ! public int lastIndexOf(Object e) { ! for (int i = size - 1; i >= 0; i--) ! if (equals(e, data[i])) ! return i; ! return -1; ! } ! ! /** ! * Creates a shallow copy of this ArrayList (elements are not cloned). ! * ! * @return the cloned object ! */ ! public Object clone() ! { ! ArrayList clone = null; ! try { ! clone = (ArrayList) super.clone(); ! clone.data = (Object[]) data.clone(); ! } ! catch (CloneNotSupportedException e) ! { ! // Impossible to get here. } + return clone; + } + + /** + * Returns an Object array containing all of the elements in this ArrayList. + * The array is independent of this list. + * + * @return an array representation of this list + */ + public Object[] toArray() + { + Object[] array = new Object[size]; + System.arraycopy(data, 0, array, 0, size); + return array; + } + + /** + * Returns an Array whose component type is the runtime component type of + * the passed-in Array. The returned Array is populated with all of the + * elements in this ArrayList. If the passed-in Array is not large enough + * to store all of the elements in this List, a new Array will be created + * and returned; if the passed-in Array is larger than the size + * of this List, then size() index will be set to null. + * + * @param a the passed-in Array + * @return an array representation of this list + * @throws ArrayStoreException if the runtime type of a does not allow + * an element in this list + * @throws NullPointerException if a is null + */ + public Object[] toArray(Object[] a) + { + if (a.length < size) + a = (Object[]) Array.newInstance(a.getClass().getComponentType(), + size); + else if (a.length > size) + a[size] = null; + System.arraycopy(data, 0, a, 0, size); + return a; + } + + /** + * Retrieves the element at the user-supplied index. + * + * @param index the index of the element we are fetching + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + */ + public Object get(int index) + { + checkBoundExclusive(index); + return data[index]; + } + + /** + * Sets the element at the specified index. + * + * @param index the index at which the element is being set + * @param e the element to be set + * @return the element previously at the specified index + * @throws IndexOutOfBoundsException if index < 0 || index >= 0 + */ + public Object set(int index, Object e) + { + checkBoundExclusive(index); + Object result = data[index]; + data[index] = e; + return result; + } + + /** + * Appends the supplied element to the end of this list. + * + * @param e the element to be appended to this list + * @return true, the add will always succeed + */ + public boolean add(Object e) + { + modCount++; + if (size == data.length) + ensureCapacity(size + 1); + data[size++] = e; + return true; } /** * Adds the supplied element at the specified index, shifting all * elements currently at that index or higher one to the right. * ! * @param index the index at which the element is being added ! * @param e the item being added ! * @throws IndexOutOfBoundsException if index < 0 || index > size() */ public void add(int index, Object e) { + checkBoundInclusive(index); modCount++; if (size == data.length) ensureCapacity(size + 1); if (index != size) ! System.arraycopy(data, index, data, index + 1, size - index); data[index] = e; size++; } ! /** ! * Removes the element at the user-supplied index. * ! * @param index the index of the element to be removed ! * @return the removed Object ! * @throws IndexOutOfBoundsException if index < 0 || index >= size() ! */ ! public Object remove(int index) ! { ! checkBoundExclusive(index); ! Object r = data[index]; ! modCount++; ! if (index != --size) ! System.arraycopy(data, index + 1, data, index, size - index); ! // Aid for garbage collection by releasing this pointer. ! data[size] = null; ! return r; ! } ! ! /** ! * Removes all elements from this List ! */ ! public void clear() ! { ! if (size > 0) ! { ! modCount++; ! // Allow for garbage collection. ! Arrays.fill(data, 0, size, null); ! size = 0; ! } ! } ! ! /** ! * Add each element in the supplied Collection to this List. It is undefined ! * what happens if you modify the list while this is taking place; for ! * example, if the collection contains this list. ! * ! * @param c a Collection containing elements to be added to this List ! * @return true if the list was modified, in other words c is not empty ! * @throws NullPointerException if c is null */ public boolean addAll(Collection c) { return addAll(size, c); } ! /** * Add all elements in the supplied collection, inserting them beginning * at the specified index. * ! * @param index the index at which the elements will be inserted ! * @param c the Collection containing the elements to be inserted ! * @throws IndexOutOfBoundsException if index < 0 || index > 0 ! * @throws NullPointerException if c is null */ public boolean addAll(int index, Collection c) { ! checkBoundInclusive(index); Iterator itr = c.iterator(); int csize = c.size(); + modCount++; if (csize + size > data.length) ensureCapacity(size + csize); int end = index + csize; if (size > 0 && index != size) ! System.arraycopy(data, index, data, end, size - index); size += csize; ! for ( ; index < end; index++) ! data[index] = itr.next(); ! return csize > 0; } /** ! * Removes all elements in the half-open interval [fromIndex, toIndex). ! * Does nothing when toIndex is equal to fromIndex. ! * ! * @param fromIndex the first index which will be removed ! * @param toIndex one greater than the last index which will be removed ! * @throws IndexOutOfBoundsException if fromIndex > toIndex */ ! protected void removeRange(int fromIndex, int toIndex) { ! int change = toIndex - fromIndex; ! if (change > 0) { ! modCount++; ! System.arraycopy(data, toIndex, data, fromIndex, size - toIndex); ! size -= change; } ! else if (change < 0) ! throw new IndexOutOfBoundsException(); } ! /** ! * Checks that the index is in the range of possible elements (inclusive). * ! * @param index the index to check ! * @throws IndexOutOfBoundsException if index > size */ ! private void checkBoundInclusive(int index) { ! // Implementation note: we do not check for negative ranges here, since ! // use of a negative index will cause an ArrayIndexOutOfBoundsException, ! // a subclass of the required exception, with no effort on our part. ! if (index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size: " ! + size); } /** ! * Checks that the index is in the range of existing elements (exclusive). * ! * @param index the index to check ! * @throws IndexOutOfBoundsException if index >= size */ ! private void checkBoundExclusive(int index) { ! // Implementation note: we do not check for negative ranges here, since ! // use of a negative index will cause an ArrayIndexOutOfBoundsException, ! // a subclass of the required exception, with no effort on our part. ! if (index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size: " ! + size); } /** ! * Remove from this list all elements contained in the given collection. ! * This is not public, due to Sun's API, but this performs in linear ! * time while the default behavior of AbstractList would be quadratic. * ! * @param c the collection to filter out ! * @return true if this list changed ! * @throws NullPointerException if c is null */ ! boolean removeAllInternal(Collection c) { int i; + int j; + for (i = 0; i < size; i++) + if (c.contains(data[i])) + break; + if (i == size) + return false; modCount++; ! for (j = i++; i < size; i++) ! if (! c.contains(data[i])) ! data[j++] = data[i]; ! size -= i - j; ! return true; } /** ! * Retain in this vector only the elements contained in the given collection. ! * This is not public, due to Sun's API, but this performs in linear ! * time while the default behavior of AbstractList would be quadratic. * ! * @param c the collection to filter by ! * @return true if this vector changed ! * @throws NullPointerException if c is null ! * @since 1.2 */ ! boolean retainAllInternal(Collection c) { ! int i; ! int j; ! for (i = 0; i < size; i++) ! if (! c.contains(data[i])) ! break; ! if (i == size) ! return false; ! modCount++; ! for (j = i++; i < size; i++) ! if (c.contains(data[i])) ! data[j++] = data[i]; ! size -= i - j; ! return true; } /** ! * Serializes this object to the given stream. * ! * @param out the stream to write to ! * @throws IOException if the underlying stream fails ! * @serialData the size field (int), the length of the backing array ! * (int), followed by its elements (Objects) in proper order. */ ! private void writeObject(ObjectOutputStream s) throws IOException { ! // The 'size' field. ! s.defaultWriteObject(); ! // We serialize unused list entries to preserve capacity. ! int len = data.length; ! s.writeInt(len); ! for (int i = 0; i < len; i++) ! s.writeObject(data[i]); } /** ! * Deserializes this object from the given stream. ! * ! * @param in the stream to read from ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @serialData the size field (int), the length of the backing array ! * (int), followed by its elements (Objects) in proper order. */ ! private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { // the `size' field. ! s.defaultReadObject(); ! int capacity = s.readInt(); data = new Object[capacity]; ! for (int i = 0; i < capacity; i++) ! data[i] = s.readObject(); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Arrays.java gcc-3.1/libjava/java/util/Arrays.java *** gcc-3.0.4/libjava/java/util/Arrays.java Wed Feb 7 09:32:46 2001 --- gcc-3.1/libjava/java/util/Arrays.java Thu Apr 4 12:02:36 2002 *************** *** 1,5 **** /* Arrays.java -- Utility class with methods to operate on arrays ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Arrays.java -- Utility class with methods to operate on arrays ! Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,40 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Fix the behaviour of sort and binarySearch as applied to float and double - // arrays containing NaN values. See the JDC, bug ID 4143272. package java.util; /** * This class contains various static utility methods performing operations on * arrays, and a method to provide a List "view" of an array to facilitate ! * using arrays with Collection-based APIs. */ public class Arrays { --- 18,68 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; + import java.io.Serializable; + import java.lang.reflect.Array; + /** * This class contains various static utility methods performing operations on * arrays, and a method to provide a List "view" of an array to facilitate ! * using arrays with Collection-based APIs. All methods throw a ! * {@link NullPointerException} if the parameter array is null. ! *

        ! * ! * Implementations may use their own algorithms, but must obey the general ! * properties; for example, the sort must be stable and n*log(n) complexity. ! * Sun's implementation of sort, and therefore ours, is a tuned quicksort, ! * adapted from Jon L. Bentley and M. Douglas McIlroy's "Engineering a Sort ! * Function", Software-Practice and Experience, Vol. 23(11) P. 1249-1265 ! * (November 1993). This algorithm offers n*log(n) performance on many data ! * sets that cause other quicksorts to degrade to quadratic performance. ! * ! * @author Original author unknown ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see Comparable ! * @see Comparator ! * @since 1.2 ! * @status updated to 1.4 */ public class Arrays { *************** public class Arrays *** 45,58 **** { } ! private static Comparator defaultComparator = new Comparator() ! { ! public int compare(Object o1, Object o2) ! { ! return ((Comparable) o1).compareTo(o2); ! } ! }; ! /** * Perform a binary search of a byte array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this --- 73,80 ---- { } ! ! // binarySearch /** * Perform a binary search of a byte array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this *************** public class Arrays *** 63,94 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(byte[]a, byte key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final byte d = a[mid]; ! if (d == key) ! { ! return mid; ! } ! else if (d > key) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } } return -mid - 1; } --- 85,110 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(byte[] a, byte key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final byte d = a[mid]; ! if (d == key) ! return mid; ! else if (d > key) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop. ! low = ++mid; } return -mid - 1; } *************** public class Arrays *** 103,140 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(char[]a, char key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final char d = a[mid]; ! if (d == key) ! { ! return mid; ! } ! else if (d > key) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } } return -mid - 1; } /** ! * Perform a binary search of a double array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the --- 119,150 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(char[] a, char key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final char d = a[mid]; ! if (d == key) ! return mid; ! else if (d > key) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop. ! low = ++mid; } return -mid - 1; } /** ! * Perform a binary search of a short array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the *************** public class Arrays *** 143,180 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(double[]a, double key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final double d = a[mid]; ! if (d == key) ! { ! return mid; ! } ! else if (d > key) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } } return -mid - 1; } /** ! * Perform a binary search of a float array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the --- 153,184 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(short[] a, short key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final short d = a[mid]; ! if (d == key) ! return mid; ! else if (d > key) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop. ! low = ++mid; } return -mid - 1; } /** ! * Perform a binary search of an int array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the *************** public class Arrays *** 183,220 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(float[]a, float key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final float d = a[mid]; ! if (d == key) ! { ! return mid; ! } ! else if (d > key) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } } return -mid - 1; } /** ! * Perform a binary search of an int array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the --- 187,218 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(int[] a, int key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final int d = a[mid]; ! if (d == key) ! return mid; ! else if (d > key) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop. ! low = ++mid; } return -mid - 1; } /** ! * Perform a binary search of a long array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the *************** public class Arrays *** 223,260 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(int[]a, int key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final int d = a[mid]; ! if (d == key) ! { ! return mid; ! } ! else if (d > key) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } } return -mid - 1; } /** ! * Perform a binary search of a long array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the --- 221,252 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(long[] a, long key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final long d = a[mid]; ! if (d == key) ! return mid; ! else if (d > key) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop. ! low = ++mid; } return -mid - 1; } /** ! * Perform a binary search of a float array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the *************** public class Arrays *** 263,300 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(long[]a, long key) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final long d = a[mid]; ! if (d == key) ! { ! return mid; ! } ! else if (d > key) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } } return -mid - 1; } /** ! * Perform a binary search of a short array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the --- 255,287 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(float[] a, float key) { + // Must use Float.compare to take into account NaN, +-0. int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final int r = Float.compare(a[mid], key); ! if (r == 0) ! return mid; ! else if (r > 0) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop ! low = ++mid; } return -mid - 1; } /** ! * Perform a binary search of a double array for a key. The array must be * sorted (as by the sort() method) - if it is not, the behaviour of this * method is undefined, and may be an infinite loop. If the array contains * the key more than once, any one of them may be found. Note: although the *************** public class Arrays *** 303,365 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. ! */ ! public static int binarySearch(short[]a, short key) ! { ! int low = 0; ! int hi = a.length - 1; ! int mid = 0; ! while (low <= hi) ! { ! mid = (low + hi) >> 1; ! final short d = a[mid]; ! if (d == key) ! { ! return mid; ! } ! else if (d > key) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } ! } ! return -mid - 1; ! } ! ! /** ! * This method does the work for the Object binary search methods. ! * @exception NullPointerException if the specified comparator is null. ! * @exception ClassCastException if the objects are not comparable by c. */ ! private static int objectSearch(Object[]a, Object key, final Comparator c) { int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final int d = c.compare(key, a[mid]); ! if (d == 0) ! { ! return mid; ! } ! else if (d < 0) ! { ! hi = mid - 1; ! } ! else ! { ! // This gets the insertion point right on the last loop ! low = ++mid; ! } } return -mid - 1; } --- 290,316 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. */ ! public static int binarySearch(double[] a, double key) { + // Must use Double.compare to take into account NaN, +-0. int low = 0; int hi = a.length - 1; int mid = 0; while (low <= hi) { ! mid = (low + hi) >> 1; ! final int r = Double.compare(a[mid], key); ! if (r == 0) ! return mid; ! else if (r > 0) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop ! low = ++mid; } return -mid - 1; } *************** public class Arrays *** 376,391 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. ! * @exception ClassCastException if key could not be compared with one of the ! * elements of a ! * @exception NullPointerException if a null element has compareTo called */ ! public static int binarySearch(Object[]a, Object key) { ! return objectSearch(a, key, defaultComparator); } /** --- 327,342 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. ! * @throws ClassCastException if key could not be compared with one of the ! * elements of a ! * @throws NullPointerException if a null element in a is compared */ ! public static int binarySearch(Object[] a, Object key) { ! return binarySearch(a, key, null); } /** *************** public class Arrays *** 400,742 **** * * @param a the array to search (must be sorted) * @param key the value to search for ! * @param c the comparator by which the array is sorted ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. ! * @exception ClassCastException if key could not be compared with one of the ! * elements of a */ ! public static int binarySearch(Object[]a, Object key, Comparator c) { ! return objectSearch(a, key, c); } /** ! * Compare two byte arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(byte[]a1, byte[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } return false; } /** ! * Compare two char arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(char[]a1, char[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } /** ! * Compare two double arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(double[]a1, double[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } /** ! * Compare two float arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(float[]a1, float[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } /** ! * Compare two long arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(long[]a1, long[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } /** ! * Compare two short arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(short[]a1, short[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } /** ! * Compare two boolean arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(boolean[]a1, boolean[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } /** ! * Compare two int arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(int[]a1, int[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (a1[i] != a2[i]) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } --- 351,660 ---- * * @param a the array to search (must be sorted) * @param key the value to search for ! * @param c the comparator by which the array is sorted; or null to ! * use the elements' natural order ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. ! * @throws ClassCastException if key could not be compared with one of the ! * elements of a ! * @throws NullPointerException if a null element is compared with natural ! * ordering (only possible when c is null) */ ! public static int binarySearch(Object[] a, Object key, Comparator c) { ! int low = 0; ! int hi = a.length - 1; ! int mid = 0; ! while (low <= hi) ! { ! mid = (low + hi) >> 1; ! final int d = Collections.compare(key, a[mid], c); ! if (d == 0) ! return mid; ! else if (d < 0) ! hi = mid - 1; ! else ! // This gets the insertion point right on the last loop ! low = ++mid; ! } ! return -mid - 1; } + + // equals /** ! * Compare two boolean arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(boolean[] a1, boolean[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (a1[i] != a2[i]) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } /** ! * Compare two byte arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(byte[] a1, byte[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (a1[i] != a2[i]) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } /** ! * Compare two char arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(char[] a1, char[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (a1[i] != a2[i]) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } /** ! * Compare two short arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(short[] a1, short[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (a1[i] != a2[i]) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } /** ! * Compare two int arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(int[] a1, int[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (a1[i] != a2[i]) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } /** ! * Compare two long arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(long[] a1, long[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (a1[i] != a2[i]) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } /** ! * Compare two float arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(float[] a1, float[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! ! // Must use Float.compare to take into account NaN, +-0. try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (Float.compare(a1[i], a2[i]) != 0) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } /** ! * Compare two double arrays for equality. * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a2 is of the same length ! * as a1, and for each 0 <= i < a1.length, a1[i] == a2[i] */ ! public static boolean equals(double[] a1, double[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! ! // Must use Double.compare to take into account NaN, +-0. try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (Double.compare(a1[i], a2[i]) != 0) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } *************** public class Arrays *** 745,798 **** * * @param a1 the first array to compare * @param a2 the second array to compare ! * @returns true if a1 and a2 are both null, or if a1 is of the same length ! * as a2, and for each 0 <= i < a.length, a1[i] == null ? a2[i] == null : ! * a1[i].equals(a2[i]). */ ! public static boolean equals(Object[]a1, Object[]a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! { ! return true; ! } ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! for (int i = 0; i < a1.length; i++) ! { ! if (!(a1[i] == null ? a2[i] == null : a1[i].equals(a2[i]))) ! { ! return false; ! } ! } ! return true; ! } ! ! // If a1 == null or a2 == null but not both then we will get a NullPointer } catch (NullPointerException e) { } - return false; } /** * Fill an array with a boolean value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(boolean[]a, boolean val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } --- 663,708 ---- * * @param a1 the first array to compare * @param a2 the second array to compare ! * @return true if a1 and a2 are both null, or if a1 is of the same length ! * as a2, and for each 0 <= i < a.length, a1[i] == null ? ! * a2[i] == null : a1[i].equals(a2[i]). */ ! public static boolean equals(Object[] a1, Object[] a2) { // Quick test which saves comparing elements of the same array, and also // catches the case that both are null. if (a1 == a2) ! return true; ! try { ! // If they're the same length, test each element ! if (a1.length == a2.length) ! { ! int i = a1.length; ! while (--i >= 0) ! if (! AbstractCollection.equals(a1[i], a2[i])) ! return false; ! return true; ! } } catch (NullPointerException e) { + // If one is null, we get a harmless NullPointerException } return false; } + + // fill /** * Fill an array with a boolean value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(boolean[] a, boolean val) { fill(a, 0, a.length, val); } *************** public class Arrays *** 803,815 **** * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(boolean[]a, int fromIndex, int toIndex, boolean val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** --- 713,728 ---- * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(boolean[] a, int fromIndex, int toIndex, boolean val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** *************** public class Arrays *** 818,828 **** * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(byte[]a, byte val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } --- 731,738 ---- * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(byte[] a, byte val) { fill(a, 0, a.length, val); } *************** public class Arrays *** 833,845 **** * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(byte[]a, int fromIndex, int toIndex, byte val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** --- 743,758 ---- * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(byte[] a, int fromIndex, int toIndex, byte val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** *************** public class Arrays *** 848,858 **** * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(char[]a, char val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } --- 761,768 ---- * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(char[] a, char val) { fill(a, 0, a.length, val); } *************** public class Arrays *** 863,1025 **** * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(char[]a, int fromIndex, int toIndex, char val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** ! * Fill an array with a double value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(double[]a, double val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a double value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(double[]a, int fromIndex, int toIndex, double val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** ! * Fill an array with a float value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(float[]a, float val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a float value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(float[]a, int fromIndex, int toIndex, float val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** ! * Fill an array with an int value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(int[]a, int val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } /** ! * Fill a range of an array with an int value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(int[]a, int fromIndex, int toIndex, int val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** ! * Fill an array with a long value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(long[]a, long val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a long value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(long[]a, int fromIndex, int toIndex, long val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** ! * Fill an array with a short value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(short[]a, short val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a short value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with */ ! public static void fill(short[]a, int fromIndex, int toIndex, short val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } /** --- 773,938 ---- * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(char[] a, int fromIndex, int toIndex, char val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** ! * Fill an array with a short value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(short[] a, short val) { fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a short value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(short[] a, int fromIndex, int toIndex, short val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** ! * Fill an array with an int value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(int[] a, int val) { fill(a, 0, a.length, val); } /** ! * Fill a range of an array with an int value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(int[] a, int fromIndex, int toIndex, int val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** ! * Fill an array with a long value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(long[] a, long val) { fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a long value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(long[] a, int fromIndex, int toIndex, long val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** ! * Fill an array with a float value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(float[] a, float val) { fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a float value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(float[] a, int fromIndex, int toIndex, float val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** ! * Fill an array with a double value. * * @param a the array to fill * @param val the value to fill it with */ ! public static void fill(double[] a, double val) { fill(a, 0, a.length, val); } /** ! * Fill a range of an array with a double value. * * @param a the array to fill * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length */ ! public static void fill(double[] a, int fromIndex, int toIndex, double val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } /** *************** public class Arrays *** 1027,1040 **** * * @param a the array to fill * @param val the value to fill it with ! * @exception ClassCastException if val is not an instance of the element ! * type of a. */ ! public static void fill(Object[]a, Object val) { - // This implementation is slightly inefficient timewise, but the extra - // effort over inlining it is O(1) and small, and I refuse to repeat code - // if it can be helped. fill(a, 0, a.length, val); } --- 940,950 ---- * * @param a the array to fill * @param val the value to fill it with ! * @throws ClassCastException if val is not an instance of the element ! * type of a. */ ! public static void fill(Object[] a, Object val) { fill(a, 0, a.length, val); } *************** public class Arrays *** 1045,1970 **** * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with ! * @exception ClassCastException if val is not an instance of the element ! * type of a. */ ! public static void fill(Object[]a, int fromIndex, int toIndex, Object val) { for (int i = fromIndex; i < toIndex; i++) ! { ! a[i] = val; ! } } // Thanks to Paul Fisher for finding this quicksort algorithm ! // as specified by Sun and porting it to Java. /** ! * Sort a byte array into ascending order. The sort algorithm is an optimised ! * quicksort, as described in Jon L. Bentley and M. Douglas McIlroy's ! * "Engineering a Sort Function", Software-Practice and Experience, Vol. ! * 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n) ! * performance on many arrays that would take quadratic time with a standard ! * quicksort. * ! * @param a the array to sort */ ! public static void sort(byte[]a) { qsort(a, 0, a.length); } public static void sort(byte[] a, int fromIndex, int toIndex) { ! qsort(a, fromIndex, toIndex); } ! private static int med3(int a, int b, int c, byte[]d) { ! return d[a] < d[b] ? ! (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a); } ! private static void swap(int i, int j, byte[]a) { byte c = a[i]; a[i] = a[j]; a[j] = c; } ! private static void qsort(byte[]a, int start, int n) { ! // use an insertion sort on small arrays ! if (n <= 7) { ! for (int i = start + 1; i < start + n; i++) ! for (int j = i; j > 0 && a[j - 1] > a[j]; j--) ! swap(j, j - 1, a); ! return; } ! int pm = n / 2; // small arrays, middle element ! if (n > 7) ! { ! int pl = start; ! int pn = start + n - 1; ! if (n > 40) ! { // big arrays, pseudomedian of 9 ! int s = n / 8; ! pl = med3(pl, pl + s, pl + 2 * s, a); ! pm = med3(pm - s, pm, pm + s, a); ! pn = med3(pn - 2 * s, pn - s, pn, a); ! } ! pm = med3(pl, pm, pn, a); // mid-size, med of 3 } ! int pa, pb, pc, pd, pv; ! int r; ! pv = start; ! swap(pv, pm, a); ! pa = pb = start; ! pc = pd = start + n - 1; ! for (;;) { ! while (pb <= pc && (r = a[pb] - a[pv]) <= 0) ! { ! if (r == 0) ! { ! swap(pa, pb, a); ! pa++; ! } ! pb++; ! } ! while (pc >= pb && (r = a[pc] - a[pv]) >= 0) ! { ! if (r == 0) ! { ! swap(pc, pd, a); ! pd--; ! } ! pc--; ! } ! if (pb > pc) ! break; ! swap(pb, pc, a); ! pb++; ! pc--; } - int pn = start + n; - int s; - s = Math.min(pa - start, pb - pa); - vecswap(start, pb - s, s, a); - s = Math.min(pd - pc, pn - pd - 1); - vecswap(pb, pn - s, s, a); - if ((s = pb - pa) > 1) - qsort(a, start, s); - if ((s = pd - pc) > 1) - qsort(a, pn - s, s); - } ! private static void vecswap(int i, int j, int n, byte[]a) ! { ! for (; n > 0; i++, j++, n--) ! swap(i, j, a); } /** ! * Sort a char array into ascending order. The sort algorithm is an optimised ! * quicksort, as described in Jon L. Bentley and M. Douglas McIlroy's ! * "Engineering a Sort Function", Software-Practice and Experience, Vol. ! * 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n) ! * performance on many arrays that would take quadratic time with a standard ! * quicksort. * ! * @param a the array to sort */ ! public static void sort(char[]a) { qsort(a, 0, a.length); } public static void sort(char[] a, int fromIndex, int toIndex) { ! qsort(a, fromIndex, toIndex); } ! private static int med3(int a, int b, int c, char[]d) { ! return d[a] < d[b] ? ! (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a); } ! private static void swap(int i, int j, char[]a) { char c = a[i]; a[i] = a[j]; a[j] = c; } ! private static void qsort(char[]a, int start, int n) { ! // use an insertion sort on small arrays ! if (n <= 7) { ! for (int i = start + 1; i < start + n; i++) ! for (int j = i; j > 0 && a[j - 1] > a[j]; j--) ! swap(j, j - 1, a); ! return; } ! int pm = n / 2; // small arrays, middle element ! if (n > 7) ! { ! int pl = start; ! int pn = start + n - 1; ! if (n > 40) ! { // big arrays, pseudomedian of 9 ! int s = n / 8; ! pl = med3(pl, pl + s, pl + 2 * s, a); ! pm = med3(pm - s, pm, pm + s, a); ! pn = med3(pn - 2 * s, pn - s, pn, a); ! } ! pm = med3(pl, pm, pn, a); // mid-size, med of 3 } ! int pa, pb, pc, pd, pv; ! int r; ! pv = start; ! swap(pv, pm, a); ! pa = pb = start; ! pc = pd = start + n - 1; ! for (;;) { ! while (pb <= pc && (r = a[pb] - a[pv]) <= 0) ! { ! if (r == 0) ! { ! swap(pa, pb, a); ! pa++; ! } ! pb++; ! } ! while (pc >= pb && (r = a[pc] - a[pv]) >= 0) ! { ! if (r == 0) ! { ! swap(pc, pd, a); ! pd--; ! } ! pc--; ! } ! if (pb > pc) ! break; ! swap(pb, pc, a); ! pb++; ! pc--; } - int pn = start + n; - int s; - s = Math.min(pa - start, pb - pa); - vecswap(start, pb - s, s, a); - s = Math.min(pd - pc, pn - pd - 1); - vecswap(pb, pn - s, s, a); - if ((s = pb - pa) > 1) - qsort(a, start, s); - if ((s = pd - pc) > 1) - qsort(a, pn - s, s); - } ! private static void vecswap(int i, int j, int n, char[]a) ! { ! for (; n > 0; i++, j++, n--) ! swap(i, j, a); } /** ! * Sort a double array into ascending order. The sort algorithm is an ! * optimised quicksort, as described in Jon L. Bentley and M. Douglas ! * McIlroy's "Engineering a Sort Function", Software-Practice and Experience, ! * Vol. 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n) ! * performance on many arrays that would take quadratic time with a standard ! * quicksort. Note that this implementation, like Sun's, has undefined ! * behaviour if the array contains any NaN values. * ! * @param a the array to sort */ ! public static void sort(double[]a) { qsort(a, 0, a.length); } ! public static void sort(double[] a, int fromIndex, int toIndex) { ! qsort(a, fromIndex, toIndex); } ! private static int med3(int a, int b, int c, double[]d) { ! return d[a] < d[b] ? ! (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a); } ! private static void swap(int i, int j, double[]a) { ! double c = a[i]; a[i] = a[j]; a[j] = c; } ! private static void qsort(double[]a, int start, int n) { ! // use an insertion sort on small arrays ! if (n <= 7) { ! for (int i = start + 1; i < start + n; i++) ! for (int j = i; j > 0 && a[j - 1] > a[j]; j--) ! swap(j, j - 1, a); ! return; } ! int pm = n / 2; // small arrays, middle element ! if (n > 7) ! { ! int pl = start; ! int pn = start + n - 1; ! if (n > 40) ! { // big arrays, pseudomedian of 9 ! int s = n / 8; ! pl = med3(pl, pl + s, pl + 2 * s, a); ! pm = med3(pm - s, pm, pm + s, a); ! pn = med3(pn - 2 * s, pn - s, pn, a); ! } ! pm = med3(pl, pm, pn, a); // mid-size, med of 3 } ! int pa, pb, pc, pd, pv; ! double r; ! pv = start; ! swap(pv, pm, a); ! pa = pb = start; ! pc = pd = start + n - 1; ! for (;;) { ! while (pb <= pc && (r = a[pb] - a[pv]) <= 0) ! { ! if (r == 0) ! { ! swap(pa, pb, a); ! pa++; ! } ! pb++; ! } ! while (pc >= pb && (r = a[pc] - a[pv]) >= 0) ! { ! if (r == 0) ! { ! swap(pc, pd, a); ! pd--; ! } ! pc--; ! } ! if (pb > pc) ! break; ! swap(pb, pc, a); ! pb++; ! pc--; } - int pn = start + n; - int s; - s = Math.min(pa - start, pb - pa); - vecswap(start, pb - s, s, a); - s = Math.min(pd - pc, pn - pd - 1); - vecswap(pb, pn - s, s, a); - if ((s = pb - pa) > 1) - qsort(a, start, s); - if ((s = pd - pc) > 1) - qsort(a, pn - s, s); - } ! private static void vecswap(int i, int j, int n, double[]a) ! { ! for (; n > 0; i++, j++, n--) ! swap(i, j, a); } /** ! * Sort a float array into ascending order. The sort algorithm is an ! * optimised quicksort, as described in Jon L. Bentley and M. Douglas ! * McIlroy's "Engineering a Sort Function", Software-Practice and Experience, ! * Vol. 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n) ! * performance on many arrays that would take quadratic time with a standard ! * quicksort. Note that this implementation, like Sun's, has undefined ! * behaviour if the array contains any NaN values. * ! * @param a the array to sort */ ! public static void sort(float[]a) { qsort(a, 0, a.length); } ! public static void sort(float[] a, int fromIndex, int toIndex) { ! qsort(a, fromIndex, toIndex); } ! private static int med3(int a, int b, int c, float[]d) { ! return d[a] < d[b] ? ! (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a); } ! private static void swap(int i, int j, float[]a) { ! float c = a[i]; a[i] = a[j]; a[j] = c; } ! private static void qsort(float[]a, int start, int n) { ! // use an insertion sort on small arrays ! if (n <= 7) { ! for (int i = start + 1; i < start + n; i++) ! for (int j = i; j > 0 && a[j - 1] > a[j]; j--) ! swap(j, j - 1, a); ! return; } ! int pm = n / 2; // small arrays, middle element ! if (n > 7) ! { ! int pl = start; ! int pn = start + n - 1; ! if (n > 40) ! { // big arrays, pseudomedian of 9 ! int s = n / 8; ! pl = med3(pl, pl + s, pl + 2 * s, a); ! pm = med3(pm - s, pm, pm + s, a); ! pn = med3(pn - 2 * s, pn - s, pn, a); ! } ! pm = med3(pl, pm, pn, a); // mid-size, med of 3 } ! int pa, pb, pc, pd, pv; ! float r; ! pv = start; ! swap(pv, pm, a); ! pa = pb = start; ! pc = pd = start + n - 1; ! for (;;) { ! while (pb <= pc && (r = a[pb] - a[pv]) <= 0) ! { ! if (r == 0) ! { ! swap(pa, pb, a); ! pa++; ! } ! pb++; ! } ! while (pc >= pb && (r = a[pc] - a[pv]) >= 0) ! { ! if (r == 0) ! { ! swap(pc, pd, a); ! pd--; ! } ! pc--; ! } ! if (pb > pc) ! break; ! swap(pb, pc, a); ! pb++; ! pc--; } - int pn = start + n; - int s; - s = Math.min(pa - start, pb - pa); - vecswap(start, pb - s, s, a); - s = Math.min(pd - pc, pn - pd - 1); - vecswap(pb, pn - s, s, a); - if ((s = pb - pa) > 1) - qsort(a, start, s); - if ((s = pd - pc) > 1) - qsort(a, pn - s, s); - } ! private static void vecswap(int i, int j, int n, float[]a) ! { ! for (; n > 0; i++, j++, n--) ! swap(i, j, a); } /** ! * Sort an int array into ascending order. The sort algorithm is an optimised ! * quicksort, as described in Jon L. Bentley and M. Douglas McIlroy's ! * "Engineering a Sort Function", Software-Practice and Experience, Vol. ! * 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n) ! * performance on many arrays that would take quadratic time with a standard ! * quicksort. * ! * @param a the array to sort */ ! public static void sort(int[]a) { qsort(a, 0, a.length); } ! public static void sort(int[] a, int fromIndex, int toIndex) { ! qsort(a, fromIndex, toIndex); } ! private static int med3(int a, int b, int c, int[]d) { ! return d[a] < d[b] ? ! (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a); } ! private static void swap(int i, int j, int[]a) { ! int c = a[i]; a[i] = a[j]; a[j] = c; } ! private static void qsort(int[]a, int start, int n) { ! // use an insertion sort on small arrays ! if (n <= 7) { ! for (int i = start + 1; i < start + n; i++) ! for (int j = i; j > 0 && a[j - 1] > a[j]; j--) ! swap(j, j - 1, a); ! return; } ! int pm = n / 2; // small arrays, middle element ! if (n > 7) ! { ! int pl = start; ! int pn = start + n - 1; ! if (n > 40) ! { // big arrays, pseudomedian of 9 ! int s = n / 8; ! pl = med3(pl, pl + s, pl + 2 * s, a); ! pm = med3(pm - s, pm, pm + s, a); ! pn = med3(pn - 2 * s, pn - s, pn, a); ! } ! pm = med3(pl, pm, pn, a); // mid-size, med of 3 } ! int pa, pb, pc, pd, pv; ! int r; ! pv = start; ! swap(pv, pm, a); ! pa = pb = start; ! pc = pd = start + n - 1; ! for (;;) { ! while (pb <= pc && (r = a[pb] - a[pv]) <= 0) ! { ! if (r == 0) ! { ! swap(pa, pb, a); ! pa++; ! } ! pb++; ! } ! while (pc >= pb && (r = a[pc] - a[pv]) >= 0) ! { ! if (r == 0) ! { ! swap(pc, pd, a); ! pd--; ! } ! pc--; ! } ! if (pb > pc) ! break; ! swap(pb, pc, a); ! pb++; ! pc--; } - int pn = start + n; - int s; - s = Math.min(pa - start, pb - pa); - vecswap(start, pb - s, s, a); - s = Math.min(pd - pc, pn - pd - 1); - vecswap(pb, pn - s, s, a); - if ((s = pb - pa) > 1) - qsort(a, start, s); - if ((s = pd - pc) > 1) - qsort(a, pn - s, s); - } ! private static void vecswap(int i, int j, int n, int[]a) ! { ! for (; n > 0; i++, j++, n--) ! swap(i, j, a); } /** ! * Sort a long array into ascending order. The sort algorithm is an optimised ! * quicksort, as described in Jon L. Bentley and M. Douglas McIlroy's ! * "Engineering a Sort Function", Software-Practice and Experience, Vol. ! * 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n) ! * performance on many arrays that would take quadratic time with a standard ! * quicksort. * ! * @param a the array to sort */ ! public static void sort(long[]a) { qsort(a, 0, a.length); } ! public static void sort(long[] a, int fromIndex, int toIndex) { ! qsort(a, fromIndex, toIndex); } ! private static int med3(int a, int b, int c, long[]d) { ! return d[a] < d[b] ? ! (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a); } ! private static void swap(int i, int j, long[]a) { ! long c = a[i]; a[i] = a[j]; a[j] = c; } ! private static void qsort(long[]a, int start, int n) { ! // use an insertion sort on small arrays ! if (n <= 7) { ! for (int i = start + 1; i < start + n; i++) ! for (int j = i; j > 0 && a[j - 1] > a[j]; j--) ! swap(j, j - 1, a); ! return; } ! int pm = n / 2; // small arrays, middle element ! if (n > 7) ! { ! int pl = start; ! int pn = start + n - 1; ! if (n > 40) ! { // big arrays, pseudomedian of 9 ! int s = n / 8; ! pl = med3(pl, pl + s, pl + 2 * s, a); ! pm = med3(pm - s, pm, pm + s, a); ! pn = med3(pn - 2 * s, pn - s, pn, a); ! } ! pm = med3(pl, pm, pn, a); // mid-size, med of 3 } ! int pa, pb, pc, pd, pv; ! long r; ! pv = start; ! swap(pv, pm, a); ! pa = pb = start; ! pc = pd = start + n - 1; ! for (;;) { ! while (pb <= pc && (r = a[pb] - a[pv]) <= 0) ! { ! if (r == 0) ! { ! swap(pa, pb, a); ! pa++; ! } ! pb++; ! } ! while (pc >= pb && (r = a[pc] - a[pv]) >= 0) ! { ! if (r == 0) ! { ! swap(pc, pd, a); ! pd--; ! } ! pc--; ! } ! if (pb > pc) ! break; ! swap(pb, pc, a); ! pb++; ! pc--; } - int pn = start + n; - int s; - s = Math.min(pa - start, pb - pa); - vecswap(start, pb - s, s, a); - s = Math.min(pd - pc, pn - pd - 1); - vecswap(pb, pn - s, s, a); - if ((s = pb - pa) > 1) - qsort(a, start, s); - if ((s = pd - pc) > 1) - qsort(a, pn - s, s); - } ! private static void vecswap(int i, int j, int n, long[]a) ! { ! for (; n > 0; i++, j++, n--) ! swap(i, j, a); } /** ! * Sort a short array into ascending order. The sort algorithm is an ! * optimised quicksort, as described in Jon L. Bentley and M. Douglas ! * McIlroy's "Engineering a Sort Function", Software-Practice and Experience, ! * Vol. 23(11) P. 1249-1265 (November 1993). This algorithm gives nlog(n) ! * performance on many arrays that would take quadratic time with a standard ! * quicksort. * ! * @param a the array to sort */ ! public static void sort(short[]a) { qsort(a, 0, a.length); } ! public static void sort(short[] a, int fromIndex, int toIndex) { ! qsort(a, fromIndex, toIndex); } ! private static int med3(int a, int b, int c, short[]d) { ! return d[a] < d[b] ? ! (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a); } ! private static void swap(int i, int j, short[]a) { ! short c = a[i]; a[i] = a[j]; a[j] = c; } ! private static void qsort(short[]a, int start, int n) ! { ! // use an insertion sort on small arrays ! if (n <= 7) ! { ! for (int i = start + 1; i < start + n; i++) ! for (int j = i; j > 0 && a[j - 1] > a[j]; j--) ! swap(j, j - 1, a); ! return; ! } ! ! int pm = n / 2; // small arrays, middle element ! if (n > 7) ! { ! int pl = start; ! int pn = start + n - 1; ! ! if (n > 40) ! { // big arrays, pseudomedian of 9 ! int s = n / 8; ! pl = med3(pl, pl + s, pl + 2 * s, a); ! pm = med3(pm - s, pm, pm + s, a); ! pn = med3(pn - 2 * s, pn - s, pn, a); ! } ! pm = med3(pl, pm, pn, a); // mid-size, med of 3 ! } ! ! int pa, pb, pc, pd, pv; ! int r; ! ! pv = start; ! swap(pv, pm, a); ! pa = pb = start; ! pc = pd = start + n - 1; ! ! for (;;) ! { ! while (pb <= pc && (r = a[pb] - a[pv]) <= 0) ! { ! if (r == 0) ! { ! swap(pa, pb, a); ! pa++; ! } ! pb++; ! } ! while (pc >= pb && (r = a[pc] - a[pv]) >= 0) ! { ! if (r == 0) ! { ! swap(pc, pd, a); ! pd--; ! } ! pc--; ! } ! if (pb > pc) ! break; ! swap(pb, pc, a); ! pb++; ! pc--; ! } ! int pn = start + n; ! int s; ! s = Math.min(pa - start, pb - pa); ! vecswap(start, pb - s, s, a); ! s = Math.min(pd - pc, pn - pd - 1); ! vecswap(pb, pn - s, s, a); ! if ((s = pb - pa) > 1) ! qsort(a, start, s); ! if ((s = pd - pc) > 1) ! qsort(a, pn - s, s); ! } ! ! private static void vecswap(int i, int j, int n, short[]a) { ! for (; n > 0; i++, j++, n--) swap(i, j, a); } /** ! * The bulk of the work for the object sort routines. In general, ! * the code attempts to be simple rather than fast, the idea being ! * that a good optimising JIT will be able to optimise it better ! * than I can, and if I try it will make it more confusing for the ! * JIT. */ ! private static void mergeSort(Object[]a, int from, int to, Comparator c) { ! // First presort the array in chunks of length 6 with insertion sort. ! // mergesort would give too much overhead for this length. ! for (int chunk = from; chunk < to; chunk += 6) { ! int end = Math.min(chunk + 6, to); ! for (int i = chunk + 1; i < end; i++) ! { ! if (c.compare(a[i - 1], a[i]) > 0) ! { ! // not already sorted ! int j = i; ! Object elem = a[j]; ! do ! { ! a[j] = a[j - 1]; ! j--; ! } ! while (j > chunk && c.compare(a[j - 1], elem) > 0); ! a[j] = elem; ! } ! } } ! int len = to - from; ! // If length is smaller or equal 6 we are done. ! if (len <= 6) ! return; ! ! Object[]src = a; ! Object[]dest = new Object[len]; ! Object[]t = null; // t is used for swapping src and dest ! // The difference of the fromIndex of the src and dest array. ! int srcDestDiff = -from; ! // The merges are done in this loop ! for (int size = 6; size < len; size <<= 1) ! { ! for (int start = from; start < to; start += size << 1) ! { ! // mid ist the start of the second sublist; ! // end the start of the next sublist (or end of array). ! int mid = start + size; ! int end = Math.min(to, mid + size); ! // The second list is empty or the elements are already in ! // order - no need to merge ! if (mid >= end || c.compare(src[mid - 1], src[mid]) <= 0) ! { ! System.arraycopy(src, start, ! dest, start + srcDestDiff, end - start); ! // The two halves just need swapping - no need to merge ! } ! else if (c.compare(src[start], src[end - 1]) > 0) ! { ! System.arraycopy(src, start, ! dest, end - size + srcDestDiff, size); ! System.arraycopy(src, mid, ! dest, start + srcDestDiff, end - mid); ! } ! else ! { ! // Declare a lot of variables to save repeating ! // calculations. Hopefully a decent JIT will put these ! // in registers and make this fast ! int p1 = start; ! int p2 = mid; ! int i = start + srcDestDiff; ! // The main merge loop; terminates as soon as either ! // half is ended ! while (p1 < mid && p2 < end) ! { ! dest[i++] = ! src[c.compare(src[p1], src[p2]) <= 0 ? p1++ : p2++]; ! } ! // Finish up by copying the remainder of whichever half ! // wasn't finished. ! if (p1 < mid) ! System.arraycopy(src, p1, dest, i, mid - p1); ! else ! System.arraycopy(src, p2, dest, i, end - p2); ! } ! } ! // swap src and dest ready for the next merge ! t = src; ! src = dest; ! dest = t; ! from += srcDestDiff; ! to += srcDestDiff; ! srcDestDiff = -srcDestDiff; ! } ! // make sure the result ends up back in the right place. Note ! // that src and dest may have been swapped above, so src ! // contains the sorted array. ! if (src != a) ! { ! // Note that from == 0. ! System.arraycopy(src, 0, a, srcDestDiff, to); ! } } /** --- 955,2152 ---- * @param fromIndex the index to fill from, inclusive * @param toIndex the index to fill to, exclusive * @param val the value to fill with ! * @throws ClassCastException if val is not an instance of the element ! * type of a. ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > a.length */ ! public static void fill(Object[] a, int fromIndex, int toIndex, Object val) { + if (fromIndex > toIndex) + throw new IllegalArgumentException(); for (int i = fromIndex; i < toIndex; i++) ! a[i] = val; } + + // sort // Thanks to Paul Fisher for finding this quicksort algorithm ! // as specified by Sun and porting it to Java. The algorithm is an optimised ! // quicksort, as described in Jon L. Bentley and M. Douglas McIlroy's ! // "Engineering a Sort Function", Software-Practice and Experience, Vol. ! // 23(11) P. 1249-1265 (November 1993). This algorithm gives n*log(n) ! // performance on many arrays that would take quadratic time with a standard ! // quicksort. /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. * ! * @param a the byte array to sort */ ! public static void sort(byte[] a) { qsort(a, 0, a.length); } + /** + * Performs a stable sort on the elements, arranging them according to their + * natural order. + * + * @param a the byte array to sort + * @param fromIndex the first index to sort (inclusive) + * @param toIndex the last index to sort (exclusive) + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length + */ public static void sort(byte[] a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException(); ! qsort(a, fromIndex, toIndex - fromIndex); } ! /** ! * Finds the index of the median of three array elements. ! * ! * @param a the first index ! * @param b the second index ! * @param c the third index ! * @param d the array ! * @return the index (a, b, or c) which has the middle value of the three ! */ ! private static int med3(int a, int b, int c, byte[] d) { ! return (d[a] < d[b] ! ? (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a)); } ! /** ! * Swaps the elements at two locations of an array ! * ! * @param i the first index ! * @param j the second index ! * @param a the array ! */ ! private static void swap(int i, int j, byte[] a) { byte c = a[i]; a[i] = a[j]; a[j] = c; } ! /** ! * Swaps two ranges of an array. ! * ! * @param i the first range start ! * @param j the second range start ! * @param n the element count ! * @param a the array ! */ ! private static void vecswap(int i, int j, int n, byte[] a) { ! for ( ; n > 0; i++, j++, n--) ! swap(i, j, a); ! } ! ! /** ! * Performs a recursive modified quicksort. ! * ! * @param a the array to sort ! * @param from the start index (inclusive) ! * @param count the number of elements to sort ! */ ! private static void qsort(byte[] array, int from, int count) ! { ! // Use an insertion sort on small arrays. ! if (count <= 7) { ! for (int i = from + 1; i < from + count; i++) ! for (int j = i; j > 0 && array[j - 1] > array[j]; j--) ! swap(j, j - 1, array); ! return; } ! // Determine a good median element. ! int mid = count / 2; ! int lo = from; ! int hi = from + count - 1; ! if (count > 40) ! { // big arrays, pseudomedian of 9 ! int s = count / 8; ! lo = med3(lo, lo + s, lo + 2 * s, array); ! mid = med3(mid - s, mid, mid + s, array); ! hi = med3(hi - 2 * s, hi - s, hi, array); } + mid = med3(lo, mid, hi, array); ! int a, b, c, d; ! int comp; ! // Pull the median element out of the fray, and use it as a pivot. ! swap(from, mid, array); ! a = b = from; ! c = d = from + count - 1; ! // Repeatedly move b and c to each other, swapping elements so ! // that all elements before index b are less than the pivot, and all ! // elements after index c are greater than the pivot. a and b track ! // the elements equal to the pivot. ! while (true) { ! while (b <= c && (comp = array[b] - array[from]) <= 0) ! { ! if (comp == 0) ! { ! swap(a, b, array); ! a++; ! } ! b++; ! } ! while (c >= b && (comp = array[c] - array[from]) >= 0) ! { ! if (comp == 0) ! { ! swap(c, d, array); ! d--; ! } ! c--; ! } ! if (b > c) ! break; ! swap(b, c, array); ! b++; ! c--; } ! // Swap pivot(s) back in place, the recurse on left and right sections. ! hi = from + count; ! int span; ! span = Math.min(a - from, b - a); ! vecswap(from, b - span, span, array); ! ! span = Math.min(d - c, hi - d - 1); ! vecswap(b, hi - span, span, array); ! ! span = b - a; ! if (span > 1) ! qsort(array, from, span); ! ! span = d - c; ! if (span > 1) ! qsort(array, hi - span, span); } /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. * ! * @param a the char array to sort */ ! public static void sort(char[] a) { qsort(a, 0, a.length); } + /** + * Performs a stable sort on the elements, arranging them according to their + * natural order. + * + * @param a the char array to sort + * @param fromIndex the first index to sort (inclusive) + * @param toIndex the last index to sort (exclusive) + * @throws IllegalArgumentException if fromIndex > toIndex + * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 + * || toIndex > a.length + */ public static void sort(char[] a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException(); ! qsort(a, fromIndex, toIndex - fromIndex); } ! /** ! * Finds the index of the median of three array elements. ! * ! * @param a the first index ! * @param b the second index ! * @param c the third index ! * @param d the array ! * @return the index (a, b, or c) which has the middle value of the three ! */ ! private static int med3(int a, int b, int c, char[] d) { ! return (d[a] < d[b] ! ? (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a)); } ! /** ! * Swaps the elements at two locations of an array ! * ! * @param i the first index ! * @param j the second index ! * @param a the array ! */ ! private static void swap(int i, int j, char[] a) { char c = a[i]; a[i] = a[j]; a[j] = c; } ! /** ! * Swaps two ranges of an array. ! * ! * @param i the first range start ! * @param j the second range start ! * @param n the element count ! * @param a the array ! */ ! private static void vecswap(int i, int j, int n, char[] a) { ! for ( ; n > 0; i++, j++, n--) ! swap(i, j, a); ! } ! ! /** ! * Performs a recursive modified quicksort. ! * ! * @param a the array to sort ! * @param from the start index (inclusive) ! * @param count the number of elements to sort ! */ ! private static void qsort(char[] array, int from, int count) ! { ! // Use an insertion sort on small arrays. ! if (count <= 7) { ! for (int i = from + 1; i < from + count; i++) ! for (int j = i; j > 0 && array[j - 1] > array[j]; j--) ! swap(j, j - 1, array); ! return; } ! // Determine a good median element. ! int mid = count / 2; ! int lo = from; ! int hi = from + count - 1; ! if (count > 40) ! { // big arrays, pseudomedian of 9 ! int s = count / 8; ! lo = med3(lo, lo + s, lo + 2 * s, array); ! mid = med3(mid - s, mid, mid + s, array); ! hi = med3(hi - 2 * s, hi - s, hi, array); } + mid = med3(lo, mid, hi, array); ! int a, b, c, d; ! int comp; ! // Pull the median element out of the fray, and use it as a pivot. ! swap(from, mid, array); ! a = b = from; ! c = d = from + count - 1; ! // Repeatedly move b and c to each other, swapping elements so ! // that all elements before index b are less than the pivot, and all ! // elements after index c are greater than the pivot. a and b track ! // the elements equal to the pivot. ! while (true) { ! while (b <= c && (comp = array[b] - array[from]) <= 0) ! { ! if (comp == 0) ! { ! swap(a, b, array); ! a++; ! } ! b++; ! } ! while (c >= b && (comp = array[c] - array[from]) >= 0) ! { ! if (comp == 0) ! { ! swap(c, d, array); ! d--; ! } ! c--; ! } ! if (b > c) ! break; ! swap(b, c, array); ! b++; ! c--; } ! // Swap pivot(s) back in place, the recurse on left and right sections. ! hi = from + count; ! int span; ! span = Math.min(a - from, b - a); ! vecswap(from, b - span, span, array); ! ! span = Math.min(d - c, hi - d - 1); ! vecswap(b, hi - span, span, array); ! ! span = b - a; ! if (span > 1) ! qsort(array, from, span); ! ! span = d - c; ! if (span > 1) ! qsort(array, hi - span, span); } /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. * ! * @param a the short array to sort */ ! public static void sort(short[] a) { qsort(a, 0, a.length); } ! /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. ! * ! * @param a the short array to sort ! * @param fromIndex the first index to sort (inclusive) ! * @param toIndex the last index to sort (exclusive) ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > a.length ! */ ! public static void sort(short[] a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException(); ! qsort(a, fromIndex, toIndex - fromIndex); } ! /** ! * Finds the index of the median of three array elements. ! * ! * @param a the first index ! * @param b the second index ! * @param c the third index ! * @param d the array ! * @return the index (a, b, or c) which has the middle value of the three ! */ ! private static int med3(int a, int b, int c, short[] d) { ! return (d[a] < d[b] ! ? (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a)); } ! /** ! * Swaps the elements at two locations of an array ! * ! * @param i the first index ! * @param j the second index ! * @param a the array ! */ ! private static void swap(int i, int j, short[] a) { ! short c = a[i]; a[i] = a[j]; a[j] = c; } ! /** ! * Swaps two ranges of an array. ! * ! * @param i the first range start ! * @param j the second range start ! * @param n the element count ! * @param a the array ! */ ! private static void vecswap(int i, int j, int n, short[] a) { ! for ( ; n > 0; i++, j++, n--) ! swap(i, j, a); ! } ! ! /** ! * Performs a recursive modified quicksort. ! * ! * @param a the array to sort ! * @param from the start index (inclusive) ! * @param count the number of elements to sort ! */ ! private static void qsort(short[] array, int from, int count) ! { ! // Use an insertion sort on small arrays. ! if (count <= 7) { ! for (int i = from + 1; i < from + count; i++) ! for (int j = i; j > 0 && array[j - 1] > array[j]; j--) ! swap(j, j - 1, array); ! return; } ! // Determine a good median element. ! int mid = count / 2; ! int lo = from; ! int hi = from + count - 1; ! if (count > 40) ! { // big arrays, pseudomedian of 9 ! int s = count / 8; ! lo = med3(lo, lo + s, lo + 2 * s, array); ! mid = med3(mid - s, mid, mid + s, array); ! hi = med3(hi - 2 * s, hi - s, hi, array); } + mid = med3(lo, mid, hi, array); ! int a, b, c, d; ! int comp; ! // Pull the median element out of the fray, and use it as a pivot. ! swap(from, mid, array); ! a = b = from; ! c = d = from + count - 1; ! // Repeatedly move b and c to each other, swapping elements so ! // that all elements before index b are less than the pivot, and all ! // elements after index c are greater than the pivot. a and b track ! // the elements equal to the pivot. ! while (true) { ! while (b <= c && (comp = array[b] - array[from]) <= 0) ! { ! if (comp == 0) ! { ! swap(a, b, array); ! a++; ! } ! b++; ! } ! while (c >= b && (comp = array[c] - array[from]) >= 0) ! { ! if (comp == 0) ! { ! swap(c, d, array); ! d--; ! } ! c--; ! } ! if (b > c) ! break; ! swap(b, c, array); ! b++; ! c--; } ! // Swap pivot(s) back in place, the recurse on left and right sections. ! hi = from + count; ! int span; ! span = Math.min(a - from, b - a); ! vecswap(from, b - span, span, array); ! ! span = Math.min(d - c, hi - d - 1); ! vecswap(b, hi - span, span, array); ! ! span = b - a; ! if (span > 1) ! qsort(array, from, span); ! ! span = d - c; ! if (span > 1) ! qsort(array, hi - span, span); } /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. * ! * @param a the int array to sort */ ! public static void sort(int[] a) { qsort(a, 0, a.length); } ! /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. ! * ! * @param a the int array to sort ! * @param fromIndex the first index to sort (inclusive) ! * @param toIndex the last index to sort (exclusive) ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > a.length ! */ ! public static void sort(int[] a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException(); ! qsort(a, fromIndex, toIndex - fromIndex); } ! /** ! * Finds the index of the median of three array elements. ! * ! * @param a the first index ! * @param b the second index ! * @param c the third index ! * @param d the array ! * @return the index (a, b, or c) which has the middle value of the three ! */ ! private static int med3(int a, int b, int c, int[] d) { ! return (d[a] < d[b] ! ? (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a)); } ! /** ! * Swaps the elements at two locations of an array ! * ! * @param i the first index ! * @param j the second index ! * @param a the array ! */ ! private static void swap(int i, int j, int[] a) { ! int c = a[i]; a[i] = a[j]; a[j] = c; } ! /** ! * Swaps two ranges of an array. ! * ! * @param i the first range start ! * @param j the second range start ! * @param n the element count ! * @param a the array ! */ ! private static void vecswap(int i, int j, int n, int[] a) { ! for ( ; n > 0; i++, j++, n--) ! swap(i, j, a); ! } ! ! /** ! * Compares two integers in natural order, since a - b is inadequate. ! * ! * @param a the first int ! * @param b the second int ! * @return < 0, 0, or > 0 accorting to the comparison ! */ ! private static int compare(int a, int b) ! { ! return a < b ? -1 : a == b ? 0 : 1; ! } ! ! /** ! * Performs a recursive modified quicksort. ! * ! * @param a the array to sort ! * @param from the start index (inclusive) ! * @param count the number of elements to sort ! */ ! private static void qsort(int[] array, int from, int count) ! { ! // Use an insertion sort on small arrays. ! if (count <= 7) { ! for (int i = from + 1; i < from + count; i++) ! for (int j = i; j > 0 && array[j - 1] > array[j]; j--) ! swap(j, j - 1, array); ! return; } ! // Determine a good median element. ! int mid = count / 2; ! int lo = from; ! int hi = from + count - 1; ! if (count > 40) ! { // big arrays, pseudomedian of 9 ! int s = count / 8; ! lo = med3(lo, lo + s, lo + 2 * s, array); ! mid = med3(mid - s, mid, mid + s, array); ! hi = med3(hi - 2 * s, hi - s, hi, array); } + mid = med3(lo, mid, hi, array); ! int a, b, c, d; ! int comp; ! // Pull the median element out of the fray, and use it as a pivot. ! swap(from, mid, array); ! a = b = from; ! c = d = from + count - 1; ! // Repeatedly move b and c to each other, swapping elements so ! // that all elements before index b are less than the pivot, and all ! // elements after index c are greater than the pivot. a and b track ! // the elements equal to the pivot. ! while (true) { ! while (b <= c && (comp = compare(array[b], array[from])) <= 0) ! { ! if (comp == 0) ! { ! swap(a, b, array); ! a++; ! } ! b++; ! } ! while (c >= b && (comp = compare(array[c], array[from])) >= 0) ! { ! if (comp == 0) ! { ! swap(c, d, array); ! d--; ! } ! c--; ! } ! if (b > c) ! break; ! swap(b, c, array); ! b++; ! c--; } ! // Swap pivot(s) back in place, the recurse on left and right sections. ! hi = from + count; ! int span; ! span = Math.min(a - from, b - a); ! vecswap(from, b - span, span, array); ! ! span = Math.min(d - c, hi - d - 1); ! vecswap(b, hi - span, span, array); ! ! span = b - a; ! if (span > 1) ! qsort(array, from, span); ! ! span = d - c; ! if (span > 1) ! qsort(array, hi - span, span); } /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. * ! * @param a the long array to sort */ ! public static void sort(long[] a) { qsort(a, 0, a.length); } ! /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. ! * ! * @param a the long array to sort ! * @param fromIndex the first index to sort (inclusive) ! * @param toIndex the last index to sort (exclusive) ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > a.length ! */ ! public static void sort(long[] a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException(); ! qsort(a, fromIndex, toIndex - fromIndex); } ! /** ! * Finds the index of the median of three array elements. ! * ! * @param a the first index ! * @param b the second index ! * @param c the third index ! * @param d the array ! * @return the index (a, b, or c) which has the middle value of the three ! */ ! private static int med3(int a, int b, int c, long[] d) { ! return (d[a] < d[b] ! ? (d[b] < d[c] ? b : d[a] < d[c] ? c : a) ! : (d[b] > d[c] ? b : d[a] > d[c] ? c : a)); } ! /** ! * Swaps the elements at two locations of an array ! * ! * @param i the first index ! * @param j the second index ! * @param a the array ! */ ! private static void swap(int i, int j, long[] a) { ! long c = a[i]; a[i] = a[j]; a[j] = c; } ! /** ! * Swaps two ranges of an array. ! * ! * @param i the first range start ! * @param j the second range start ! * @param n the element count ! * @param a the array ! */ ! private static void vecswap(int i, int j, int n, long[] a) { ! for ( ; n > 0; i++, j++, n--) ! swap(i, j, a); ! } ! ! /** ! * Compares two longs in natural order, since a - b is inadequate. ! * ! * @param a the first long ! * @param b the second long ! * @return < 0, 0, or > 0 accorting to the comparison ! */ ! private static int compare(long a, long b) ! { ! return a < b ? -1 : a == b ? 0 : 1; ! } ! ! /** ! * Performs a recursive modified quicksort. ! * ! * @param a the array to sort ! * @param from the start index (inclusive) ! * @param count the number of elements to sort ! */ ! private static void qsort(long[] array, int from, int count) ! { ! // Use an insertion sort on small arrays. ! if (count <= 7) { ! for (int i = from + 1; i < from + count; i++) ! for (int j = i; j > 0 && array[j - 1] > array[j]; j--) ! swap(j, j - 1, array); ! return; } ! // Determine a good median element. ! int mid = count / 2; ! int lo = from; ! int hi = from + count - 1; ! if (count > 40) ! { // big arrays, pseudomedian of 9 ! int s = count / 8; ! lo = med3(lo, lo + s, lo + 2 * s, array); ! mid = med3(mid - s, mid, mid + s, array); ! hi = med3(hi - 2 * s, hi - s, hi, array); } + mid = med3(lo, mid, hi, array); ! int a, b, c, d; ! int comp; ! // Pull the median element out of the fray, and use it as a pivot. ! swap(from, mid, array); ! a = b = from; ! c = d = from + count - 1; ! // Repeatedly move b and c to each other, swapping elements so ! // that all elements before index b are less than the pivot, and all ! // elements after index c are greater than the pivot. a and b track ! // the elements equal to the pivot. ! while (true) { ! while (b <= c && (comp = compare(array[b], array[from])) <= 0) ! { ! if (comp == 0) ! { ! swap(a, b, array); ! a++; ! } ! b++; ! } ! while (c >= b && (comp = compare(array[c], array[from])) >= 0) ! { ! if (comp == 0) ! { ! swap(c, d, array); ! d--; ! } ! c--; ! } ! if (b > c) ! break; ! swap(b, c, array); ! b++; ! c--; } ! // Swap pivot(s) back in place, the recurse on left and right sections. ! hi = from + count; ! int span; ! span = Math.min(a - from, b - a); ! vecswap(from, b - span, span, array); ! ! span = Math.min(d - c, hi - d - 1); ! vecswap(b, hi - span, span, array); ! ! span = b - a; ! if (span > 1) ! qsort(array, from, span); ! ! span = d - c; ! if (span > 1) ! qsort(array, hi - span, span); } /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. * ! * @param a the float array to sort */ ! public static void sort(float[] a) { qsort(a, 0, a.length); } ! /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. ! * ! * @param a the float array to sort ! * @param fromIndex the first index to sort (inclusive) ! * @param toIndex the last index to sort (exclusive) ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > a.length ! */ ! public static void sort(float[] a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException(); ! qsort(a, fromIndex, toIndex - fromIndex); } ! /** ! * Finds the index of the median of three array elements. ! * ! * @param a the first index ! * @param b the second index ! * @param c the third index ! * @param d the array ! * @return the index (a, b, or c) which has the middle value of the three ! */ ! private static int med3(int a, int b, int c, float[] d) { ! return (Float.compare(d[a], d[b]) < 0 ! ? (Float.compare(d[b], d[c]) < 0 ? b ! : Float.compare(d[a], d[c]) < 0 ? c : a) ! : (Float.compare(d[b], d[c]) > 0 ? b ! : Float.compare(d[a], d[c]) > 0 ? c : a)); } ! /** ! * Swaps the elements at two locations of an array ! * ! * @param i the first index ! * @param j the second index ! * @param a the array ! */ ! private static void swap(int i, int j, float[] a) { ! float c = a[i]; a[i] = a[j]; a[j] = c; } ! /** ! * Swaps two ranges of an array. ! * ! * @param i the first range start ! * @param j the second range start ! * @param n the element count ! * @param a the array ! */ ! private static void vecswap(int i, int j, int n, float[] a) { ! for ( ; n > 0; i++, j++, n--) ! swap(i, j, a); ! } ! ! /** ! * Performs a recursive modified quicksort. ! * ! * @param a the array to sort ! * @param from the start index (inclusive) ! * @param count the number of elements to sort ! */ ! private static void qsort(float[] array, int from, int count) ! { ! // Use an insertion sort on small arrays. ! if (count <= 7) { ! for (int i = from + 1; i < from + count; i++) ! for (int j = i; ! j > 0 && Float.compare(array[j - 1], array[j]) > 0; ! j--) ! { ! swap(j, j - 1, array); ! } ! return; } ! // Determine a good median element. ! int mid = count / 2; ! int lo = from; ! int hi = from + count - 1; ! if (count > 40) ! { // big arrays, pseudomedian of 9 ! int s = count / 8; ! lo = med3(lo, lo + s, lo + 2 * s, array); ! mid = med3(mid - s, mid, mid + s, array); ! hi = med3(hi - 2 * s, hi - s, hi, array); } + mid = med3(lo, mid, hi, array); ! int a, b, c, d; ! int comp; ! // Pull the median element out of the fray, and use it as a pivot. ! swap(from, mid, array); ! a = b = from; ! c = d = from + count - 1; ! // Repeatedly move b and c to each other, swapping elements so ! // that all elements before index b are less than the pivot, and all ! // elements after index c are greater than the pivot. a and b track ! // the elements equal to the pivot. ! while (true) { ! while (b <= c && (comp = Float.compare(array[b], array[from])) <= 0) ! { ! if (comp == 0) ! { ! swap(a, b, array); ! a++; ! } ! b++; ! } ! while (c >= b && (comp = Float.compare(array[c], array[from])) >= 0) ! { ! if (comp == 0) ! { ! swap(c, d, array); ! d--; ! } ! c--; ! } ! if (b > c) ! break; ! swap(b, c, array); ! b++; ! c--; } ! // Swap pivot(s) back in place, the recurse on left and right sections. ! hi = from + count; ! int span; ! span = Math.min(a - from, b - a); ! vecswap(from, b - span, span, array); ! ! span = Math.min(d - c, hi - d - 1); ! vecswap(b, hi - span, span, array); ! ! span = b - a; ! if (span > 1) ! qsort(array, from, span); ! ! span = d - c; ! if (span > 1) ! qsort(array, hi - span, span); } /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. * ! * @param a the double array to sort */ ! public static void sort(double[] a) { qsort(a, 0, a.length); } ! /** ! * Performs a stable sort on the elements, arranging them according to their ! * natural order. ! * ! * @param a the double array to sort ! * @param fromIndex the first index to sort (inclusive) ! * @param toIndex the last index to sort (exclusive) ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @throws ArrayIndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > a.length ! */ ! public static void sort(double[] a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException(); ! qsort(a, fromIndex, toIndex - fromIndex); } ! /** ! * Finds the index of the median of three array elements. ! * ! * @param a the first index ! * @param b the second index ! * @param c the third index ! * @param d the array ! * @return the index (a, b, or c) which has the middle value of the three ! */ ! private static int med3(int a, int b, int c, double[] d) { ! return (Double.compare(d[a], d[b]) < 0 ! ? (Double.compare(d[b], d[c]) < 0 ? b ! : Double.compare(d[a], d[c]) < 0 ? c : a) ! : (Double.compare(d[b], d[c]) > 0 ? b ! : Double.compare(d[a], d[c]) > 0 ? c : a)); } ! /** ! * Swaps the elements at two locations of an array ! * ! * @param i the first index ! * @param j the second index ! * @param a the array ! */ ! private static void swap(int i, int j, double[] a) { ! double c = a[i]; a[i] = a[j]; a[j] = c; } ! /** ! * Swaps two ranges of an array. ! * ! * @param i the first range start ! * @param j the second range start ! * @param n the element count ! * @param a the array ! */ ! private static void vecswap(int i, int j, int n, double[] a) { ! for ( ; n > 0; i++, j++, n--) swap(i, j, a); } /** ! * Performs a recursive modified quicksort. ! * ! * @param a the array to sort ! * @param from the start index (inclusive) ! * @param count the number of elements to sort */ ! private static void qsort(double[] array, int from, int count) { ! // Use an insertion sort on small arrays. ! if (count <= 7) { ! for (int i = from + 1; i < from + count; i++) ! for (int j = i; ! j > 0 && Double.compare(array[j - 1], array[j]) > 0; ! j--) ! { ! swap(j, j - 1, array); ! } ! return; } ! // Determine a good median element. ! int mid = count / 2; ! int lo = from; ! int hi = from + count - 1; ! if (count > 40) ! { // big arrays, pseudomedian of 9 ! int s = count / 8; ! lo = med3(lo, lo + s, lo + 2 * s, array); ! mid = med3(mid - s, mid, mid + s, array); ! hi = med3(hi - 2 * s, hi - s, hi, array); ! } ! mid = med3(lo, mid, hi, array); ! int a, b, c, d; ! int comp; ! // Pull the median element out of the fray, and use it as a pivot. ! swap(from, mid, array); ! a = b = from; ! c = d = from + count - 1; ! // Repeatedly move b and c to each other, swapping elements so ! // that all elements before index b are less than the pivot, and all ! // elements after index c are greater than the pivot. a and b track ! // the elements equal to the pivot. ! while (true) ! { ! while (b <= c && (comp = Double.compare(array[b], array[from])) <= 0) ! { ! if (comp == 0) ! { ! swap(a, b, array); ! a++; ! } ! b++; ! } ! while (c >= b && (comp = Double.compare(array[c], array[from])) >= 0) ! { ! if (comp == 0) ! { ! swap(c, d, array); ! d--; ! } ! c--; ! } ! if (b > c) ! break; ! swap(b, c, array); ! b++; ! c--; ! } ! // Swap pivot(s) back in place, the recurse on left and right sections. ! hi = from + count; ! int span; ! span = Math.min(a - from, b - a); ! vecswap(from, b - span, span, array); ! span = Math.min(d - c, hi - d - 1); ! vecswap(b, hi - span, span, array); ! span = b - a; ! if (span > 1) ! qsort(array, from, span); ! span = d - c; ! if (span > 1) ! qsort(array, hi - span, span); } /** *************** public class Arrays *** 1972,1989 **** * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(nlog(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @exception ClassCastException if any two elements are not mutually ! * comparable ! * @exception NullPointerException if an element is null (since ! * null.compareTo cannot work) */ ! public static void sort(Object[]a) { ! mergeSort(a, 0, a.length, defaultComparator); } /** --- 2154,2172 ---- * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(n*log(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @throws ClassCastException if any two elements are not mutually ! * comparable ! * @throws NullPointerException if an element is null (since ! * null.compareTo cannot work) ! * @see Comparable */ ! public static void sort(Object[] a) { ! sort(a, 0, a.length, null); } /** *************** public class Arrays *** 1991,2007 **** * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(nlog(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @param c a Comparator to use in sorting the array ! * @exception ClassCastException if any two elements are not mutually ! * comparable by the Comparator provided */ ! public static void sort(Object[]a, Comparator c) { ! mergeSort(a, 0, a.length, c); } /** --- 2174,2193 ---- * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(n*log(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @param c a Comparator to use in sorting the array; or null to indicate ! * the elements' natural order ! * @throws ClassCastException if any two elements are not mutually ! * comparable by the Comparator provided ! * @throws NullPointerException if a null element is compared with natural ! * ordering (only possible when c is null) */ ! public static void sort(Object[] a, Comparator c) { ! sort(a, 0, a.length, c); } /** *************** public class Arrays *** 2009,2032 **** * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(nlog(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @param fromIndex the index of the first element to be sorted. ! * @param toIndex the index of the last element to be sorted plus one. ! * @exception ClassCastException if any two elements are not mutually ! * comparable by the Comparator provided ! * @exception ArrayIndexOutOfBoundsException, if fromIndex and toIndex ! * are not in range. ! * @exception IllegalArgumentException if fromIndex > toIndex */ ! public static void sort(Object[]a, int fromIndex, int toIndex) { ! if (fromIndex > toIndex) ! throw new IllegalArgumentException("fromIndex " + fromIndex ! + " > toIndex " + toIndex); ! mergeSort(a, fromIndex, toIndex, defaultComparator); } /** --- 2195,2217 ---- * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(n*log(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @param fromIndex the index of the first element to be sorted ! * @param toIndex the index of the last element to be sorted plus one ! * @throws ClassCastException if any two elements are not mutually ! * comparable ! * @throws NullPointerException if an element is null (since ! * null.compareTo cannot work) ! * @throws ArrayIndexOutOfBoundsException, if fromIndex and toIndex ! * are not in range. ! * @throws IllegalArgumentException if fromIndex > toIndex */ ! public static void sort(Object[] a, int fromIndex, int toIndex) { ! sort(a, fromIndex, toIndex, null); } /** *************** public class Arrays *** 2034,2089 **** * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(nlog(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @param fromIndex the index of the first element to be sorted. ! * @param toIndex the index of the last element to be sorted plus one. ! * @param c a Comparator to use in sorting the array ! * @exception ClassCastException if any two elements are not mutually ! * comparable by the Comparator provided ! * @exception ArrayIndexOutOfBoundsException, if fromIndex and toIndex ! * are not in range. ! * @exception IllegalArgumentException if fromIndex > toIndex */ ! public static void sort(Object[]a, int fromIndex, int toIndex, Comparator c) { if (fromIndex > toIndex) throw new IllegalArgumentException("fromIndex " + fromIndex ! + " > toIndex " + toIndex); ! mergeSort(a, fromIndex, toIndex, c); } /** * Returns a list "view" of the specified array. This method is intended to * make it easy to use the Collections API with existing array-based APIs and ! * programs. * * @param a the array to return a view of ! * @returns a fixed-size list, changes to which "write through" to the array */ ! public static List asList(final Object[]a) { ! if (a == null) ! { ! throw new NullPointerException(); ! } ! ! return new ListImpl(a); } - /** ! * Inner class used by asList(Object[]) to provide a list interface ! * to an array. The methods are all simple enough to be self documenting. ! * Note: When Sun fully specify serialized forms, this class will have to ! * be renamed. */ ! private static class ListImpl extends AbstractList { ! ListImpl(Object[]a) { this.a = a; } --- 2219,2413 ---- * guaranteed to be stable, that is, equal elements will not be reordered. * The sort algorithm is a mergesort with the merge omitted if the last * element of one half comes before the first element of the other half. This ! * algorithm gives guaranteed O(n*log(n)) time, at the expense of making a * copy of the array. * * @param a the array to be sorted ! * @param fromIndex the index of the first element to be sorted ! * @param toIndex the index of the last element to be sorted plus one ! * @param c a Comparator to use in sorting the array; or null to indicate ! * the elements' natural order ! * @throws ClassCastException if any two elements are not mutually ! * comparable by the Comparator provided ! * @throws ArrayIndexOutOfBoundsException, if fromIndex and toIndex ! * are not in range. ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @throws NullPointerException if a null element is compared with natural ! * ordering (only possible when c is null) */ ! public static void sort(Object[] a, int fromIndex, int toIndex, Comparator c) { if (fromIndex > toIndex) throw new IllegalArgumentException("fromIndex " + fromIndex ! + " > toIndex " + toIndex); ! ! // In general, the code attempts to be simple rather than fast, the ! // idea being that a good optimising JIT will be able to optimise it ! // better than I can, and if I try it will make it more confusing for ! // the JIT. First presort the array in chunks of length 6 with insertion ! // sort. A mergesort would give too much overhead for this length. ! for (int chunk = fromIndex; chunk < toIndex; chunk += 6) ! { ! int end = Math.min(chunk + 6, toIndex); ! for (int i = chunk + 1; i < end; i++) ! { ! if (Collections.compare(a[i - 1], a[i], c) > 0) ! { ! // not already sorted ! int j = i; ! Object elem = a[j]; ! do ! { ! a[j] = a[j - 1]; ! j--; ! } ! while (j > chunk ! && Collections.compare(a[j - 1], elem, c) > 0); ! a[j] = elem; ! } ! } ! } ! ! int len = toIndex - fromIndex; ! // If length is smaller or equal 6 we are done. ! if (len <= 6) ! return; ! ! Object[] src = a; ! Object[] dest = new Object[len]; ! Object[] t = null; // t is used for swapping src and dest ! ! // The difference of the fromIndex of the src and dest array. ! int srcDestDiff = -fromIndex; ! ! // The merges are done in this loop ! for (int size = 6; size < len; size <<= 1) ! { ! for (int start = fromIndex; start < toIndex; start += size << 1) ! { ! // mid is the start of the second sublist; ! // end the start of the next sublist (or end of array). ! int mid = start + size; ! int end = Math.min(toIndex, mid + size); ! ! // The second list is empty or the elements are already in ! // order - no need to merge ! if (mid >= end ! || Collections.compare(src[mid - 1], src[mid], c) <= 0) ! { ! System.arraycopy(src, start, ! dest, start + srcDestDiff, end - start); ! ! // The two halves just need swapping - no need to merge ! } ! else if (Collections.compare(src[start], src[end - 1], c) > 0) ! { ! System.arraycopy(src, start, ! dest, end - size + srcDestDiff, size); ! System.arraycopy(src, mid, ! dest, start + srcDestDiff, end - mid); ! ! } ! else ! { ! // Declare a lot of variables to save repeating ! // calculations. Hopefully a decent JIT will put these ! // in registers and make this fast ! int p1 = start; ! int p2 = mid; ! int i = start + srcDestDiff; ! ! // The main merge loop; terminates as soon as either ! // half is ended ! while (p1 < mid && p2 < end) ! { ! dest[i++] = ! src[(Collections.compare(src[p1], src[p2], c) <= 0 ! ? p1++ : p2++)]; ! } ! ! // Finish up by copying the remainder of whichever half ! // wasn't finished. ! if (p1 < mid) ! System.arraycopy(src, p1, dest, i, mid - p1); ! else ! System.arraycopy(src, p2, dest, i, end - p2); ! } ! } ! // swap src and dest ready for the next merge ! t = src; ! src = dest; ! dest = t; ! fromIndex += srcDestDiff; ! toIndex += srcDestDiff; ! srcDestDiff = -srcDestDiff; ! } ! ! // make sure the result ends up back in the right place. Note ! // that src and dest may have been swapped above, so src ! // contains the sorted array. ! if (src != a) ! { ! // Note that fromIndex == 0. ! System.arraycopy(src, 0, a, srcDestDiff, toIndex); ! } } /** * Returns a list "view" of the specified array. This method is intended to * make it easy to use the Collections API with existing array-based APIs and ! * programs. Changes in the list or the array show up in both places. The ! * list does not support element addition or removal, but does permit ! * value modification. The returned list implements both Serializable and ! * RandomAccess. * * @param a the array to return a view of ! * @return a fixed-size list, changes to which "write through" to the array ! * @see Serializable ! * @see RandomAccess ! * @see Arrays.ArrayList */ ! public static List asList(final Object[] a) { ! return new Arrays.ArrayList(a); } /** ! * Inner class used by {@link #asList(Object[])} to provide a list interface ! * to an array. The name, though it clashes with java.util.ArrayList, is ! * Sun's choice for Serialization purposes. Element addition and removal ! * is prohibited, but values can be modified. ! * ! * @author Eric Blake ! * @status updated to 1.4 */ ! private static final class ArrayList extends AbstractList ! implements Serializable, RandomAccess { ! // We override the necessary methods, plus others which will be much ! // more efficient with direct iteration rather than relying on iterator(). ! ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -2764017481108945198L; ! ! /** ! * The array we are viewing. ! * @serial the array ! */ ! private final Object[] a; ! ! /** ! * Construct a list view of the array. ! * @param a the array to view ! * @throws NullPointerException if a is null ! */ ! ArrayList(Object[] a) { + // We have to explicitly check. + if (a == null) + throw new NullPointerException(); this.a = a; } *************** public class Arrays *** 2104,2109 **** return old; } ! private Object[] a; } } --- 2428,2472 ---- return old; } ! public boolean contains(Object o) ! { ! return lastIndexOf(o) >= 0; ! } ! ! public int indexOf(Object o) ! { ! int size = a.length; ! for (int i = 0; i < size; i++) ! if (this.equals(o, a[i])) ! return i; ! return -1; ! } ! ! public int lastIndexOf(Object o) ! { ! int i = a.length; ! while (--i >= 0) ! if (this.equals(o, a[i])) ! return i; ! return -1; ! } ! ! public Object[] toArray() ! { ! return (Object[]) a.clone(); ! } ! ! public Object[] toArray(Object[] array) ! { ! int size = a.length; ! if (array.length < size) ! array = (Object[]) ! Array.newInstance(array.getClass().getComponentType(), size); ! else if (array.length > size) ! array[size] = null; ! ! System.arraycopy(a, 0, array, 0, size); ! return array; ! } } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/BasicMapEntry.java gcc-3.1/libjava/java/util/BasicMapEntry.java *** gcc-3.0.4/libjava/java/util/BasicMapEntry.java Thu Dec 21 02:00:15 2000 --- gcc-3.1/libjava/java/util/BasicMapEntry.java Tue Jan 22 22:40:38 2002 *************** *** 1,6 **** /* BasicMapEntry.java -- a class providing a plain-vanilla implementation of the Map.Entry interface; could be used anywhere in java.util ! Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- /* BasicMapEntry.java -- a class providing a plain-vanilla implementation of the Map.Entry interface; could be used anywhere in java.util ! Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 19,82 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; /** ! * A class which implements Map.Entry. It is shared by HashMap, TreeMap, and ! * Hashtable. * ! * @author Jon Zeppieri ! * @version $Revision: 1.3 $ ! * @modified $Id: BasicMapEntry.java,v 1.3 2000/12/21 02:00:15 bryce Exp $ */ class BasicMapEntry implements Map.Entry { Object key; Object value; BasicMapEntry(Object newKey, Object newValue) { key = newKey; value = newValue; } public final boolean equals(Object o) { ! if (!(o instanceof Map.Entry)) return false; Map.Entry e = (Map.Entry) o; ! return (key == null ? e.getKey() == null : key.equals(e.getKey()) ! && value == null ? e.getValue() == null ! : value.equals(e.getValue())); } public final Object getKey() { return key; } public final Object getValue() { return value; } public final int hashCode() { ! int kc = (key == null ? 0 : key.hashCode()); ! int vc = (value == null ? 0 : value.hashCode()); ! return kc ^ vc; } ! /** ! * sets the value of this Map.Entry. Note that this is overriden by ! * Hashtable.Entry, which does not permit a null value. */ public Object setValue(Object newVal) { --- 19,152 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /** ! * A class which implements Map.Entry. It is shared by HashMap, TreeMap, ! * Hashtable, and Collections. It is not specified by the JDK, but makes ! * life much easier. * ! * @author Jon Zeppieri ! * @author Eric Blake */ class BasicMapEntry implements Map.Entry { + /** + * The key. Package visible for direct manipulation. + */ Object key; + + /** + * The value. Package visible for direct manipulation. + */ Object value; + /** + * Basic constructor initializes the fields. + * @param newKey the key + * @param newValue the value + */ BasicMapEntry(Object newKey, Object newValue) { key = newKey; value = newValue; } + /** + * Compares the specified object with this entry. Returns true only if + * the object is a mapping of identical key and value. In other words, + * this must be: + *

        +    * (o instanceof Map.Entry) &&
        +    * (getKey() == null ? ((HashMap) o).getKey() == null
        +    *                   : getKey().equals(((HashMap) o).getKey())) &&
        +    * (getValue() == null ? ((HashMap) o).getValue() == null
        +    *                   : getValue().equals(((HashMap) o).getValue()))
        +    * 
        + * + * @param o the object to compare + * @return true if it is equal + */ public final boolean equals(Object o) { ! if (! (o instanceof Map.Entry)) return false; + // Optimize for our own entries. + if (o instanceof BasicMapEntry) + { + BasicMapEntry e = (BasicMapEntry) o; + return (AbstractCollection.equals(key, e.key) + && AbstractCollection.equals(value, e.value)); + } Map.Entry e = (Map.Entry) o; ! return (AbstractCollection.equals(key, e.getKey()) ! && AbstractCollection.equals(value, e.getValue())); } + /** + * Get the key corresponding to this entry. + * + * @return the key + */ public final Object getKey() { return key; } + /** + * Get the value corresponding to this entry. If you already called + * Iterator.remove(), the behavior undefined, but in this case it works. + * + * @return the value + */ public final Object getValue() { return value; } + /** + * Returns the hash code of the entry. This is defined as the exclusive-or + * of the hashcodes of the key and value (using 0 for null). In other + * words, this must be: + *
        +    *  (getKey() == null ? 0 : getKey().hashCode()) ^
        +    *  (getValue() == null ? 0 : getValue().hashCode())
        +    * 
        + * + * @return the hash code + */ public final int hashCode() { ! return (AbstractCollection.hashCode(key) ! ^ AbstractCollection.hashCode(value)); } ! /** ! * Replaces the value with the specified object. This writes through ! * to the map, unless you have already called Iterator.remove(). It ! * may be overridden to restrict a null value. ! * ! * @param newVal the new value to store ! * @return the old value ! * @throws NullPointerException if the map forbids null values */ public Object setValue(Object newVal) { *************** class BasicMapEntry implements Map.Entry *** 85,90 **** --- 155,166 ---- return r; } + /** + * This provides a string representation of the entry. It is of the form + * "key=value", where string concatenation is used on key and value. + * + * @return the string representation + */ public final String toString() { return key + "=" + value; diff -Nrc3pad gcc-3.0.4/libjava/java/util/BitSet.java gcc-3.1/libjava/java/util/BitSet.java *** gcc-3.0.4/libjava/java/util/BitSet.java Wed Dec 6 21:26:32 2000 --- gcc-3.1/libjava/java/util/BitSet.java Mon Apr 1 20:00:31 2002 *************** *** 1,6 **** ! // BitSet - A vector of bits. ! ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of GNU Classpath. --- 1,5 ---- ! /* BitSet.java -- A vector of bits. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; import java.io.Serializable; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; import java.io.Serializable; *************** import java.io.Serializable; *** 50,71 **** * while another thread is simultaneously modifying it, the results are * undefined. * - * @specnote Historically, there has been some confusion as to whether or not - * this class should be synchronized. From an efficiency perspective, - * it is very undesirable to synchronize it because multiple locks - * and explicit lock ordering are required to safely synchronize some - * methods. The JCL 1.2 supplement book specifies that as of JDK - * 1.2, the class is no longer synchronized. - * * @author Jochen Hoenicke * @author Tom Tromey ! * @date October 23, 1998. ! * @status API complete to JDK 1.3. */ public class BitSet implements Cloneable, Serializable { /** ! * Create a new empty bit set. */ public BitSet() { --- 60,91 ---- * while another thread is simultaneously modifying it, the results are * undefined. * * @author Jochen Hoenicke * @author Tom Tromey ! * @author Eric Blake ! * @status updated to 1.4 */ public class BitSet implements Cloneable, Serializable { /** ! * Compatible with JDK 1.0. ! */ ! private static final long serialVersionUID = 7997698588986878753L; ! ! /** ! * A common mask. ! */ ! private static final int LONG_MASK = 0x3f; ! ! /** ! * The actual bits. ! * @serial the i'th bit is in bits[i/64] at position i%64 (where position ! * 0 is the least significant). ! */ ! private long[] bits; ! ! /** ! * Create a new empty bit set. All bits are initially false. */ public BitSet() { *************** public class BitSet implements Cloneable *** 75,92 **** /** * Create a new empty bit set, with a given size. This * constructor reserves enough space to represent the integers ! * from 0 to nbits-1. ! * @param nbits the initial size of the bit set. ! * @throws NegativeArraySizeException if the specified initial ! * size is negative. ! * @require nbits >= 0 */ public BitSet(int nbits) { if (nbits < 0) throw new NegativeArraySizeException(); ! int length = nbits / 64; ! if (nbits % 64 != 0) ++length; bits = new long[length]; } --- 95,112 ---- /** * Create a new empty bit set, with a given size. This * constructor reserves enough space to represent the integers ! * from 0 to nbits-1. ! * ! * @param nbits the initial size of the bit set ! * @throws NegativeArraySizeException if nbits < 0 */ public BitSet(int nbits) { if (nbits < 0) throw new NegativeArraySizeException(); ! ! int length = nbits >>> 6; ! if ((nbits & LONG_MASK) != 0) ++length; bits = new long[length]; } *************** public class BitSet implements Cloneable *** 95,102 **** * Performs the logical AND operation on this bit set and the * given set. This means it builds the intersection * of the two sets. The result is stored into this bit set. ! * @param set the second bit set. ! * @require set != null */ public void and(BitSet bs) { --- 115,123 ---- * Performs the logical AND operation on this bit set and the * given set. This means it builds the intersection * of the two sets. The result is stored into this bit set. ! * ! * @param set the second bit set ! * @throws NullPointerException if set is null */ public void and(BitSet bs) { *************** public class BitSet implements Cloneable *** 104,166 **** int i; for (i = 0; i < max; ++i) bits[i] &= bs.bits[i]; ! for (; i < bits.length; ++i) ! bits[i] = 0; } /** * Performs the logical AND operation on this bit set and the * complement of the given set. This means it * selects every element in the first set, that isn't in the ! * second set. The result is stored into this bit set. ! * @param set the second bit set. ! * @require set != null ! * @since JDK1.2 */ public void andNot(BitSet bs) { ! int max = Math.min(bits.length, bs.bits.length); ! int i; ! for (i = 0; i < max; ++i) bits[i] &= ~bs.bits[i]; } /** * Removes the integer bitIndex from this set. That is * the corresponding bit is cleared. If the index is not in the set, * this method does nothing. ! * @param bitIndex a non-negative integer. ! * @exception ArrayIndexOutOfBoundsException if the specified bit index ! * is negative. ! * @require bitIndex >= 0 */ public void clear(int pos) { ! if (pos < 0) ! throw new IndexOutOfBoundsException(); ! int bit = pos % 64; ! int offset = pos / 64; ensure(offset); ! bits[offset] &= ~(1L << bit); } /** * Create a clone of this bit set, that is an instance of the same * class and contains the same elements. But it doesn't change when * this bit set changes. * @return the clone of this object. */ public Object clone() { ! BitSet bs = new BitSet(bits.length * 64); ! System.arraycopy(bits, 0, bs.bits, 0, bits.length); ! return bs; } /** * Returns true if the obj is a bit set that contains * exactly the same elements as this bit set, otherwise false. ! * @return true if obj equals this bit set. */ public boolean equals(Object obj) { --- 125,267 ---- int i; for (i = 0; i < max; ++i) bits[i] &= bs.bits[i]; ! while (i < bits.length) ! bits[i++] = 0; } /** * Performs the logical AND operation on this bit set and the * complement of the given set. This means it * selects every element in the first set, that isn't in the ! * second set. The result is stored into this bit set. ! * ! * @param set the second bit set ! * @throws NullPointerException if set is null ! * @since 1.2 */ public void andNot(BitSet bs) { ! int i = Math.min(bits.length, bs.bits.length); ! while (--i >= 0) bits[i] &= ~bs.bits[i]; } /** + * Returns the number of bits set to true. + * + * @return the number of true bits + * @since 1.4 + */ + public int cardinality() + { + int card = 0; + for (int i = bits.length - 1; i >= 0; i--) + { + long a = bits[i]; + // Take care of common cases. + if (a == 0) + continue; + if (a == -1) + { + card += 64; + continue; + } + + // Successively collapse alternating bit groups into a sum. + a = ((a >> 1) & 0x5555555555555555L) + (a & 0x5555555555555555L); + a = ((a >> 2) & 0x3333333333333333L) + (a & 0x3333333333333333L); + int b = (int) ((a >>> 32) + a); + b = ((b >> 4) & 0x0f0f0f0f) + (b & 0x0f0f0f0f); + b = ((b >> 8) & 0x00ff00ff) + (b & 0x00ff00ff); + card += ((b >> 16) & 0x0000ffff) + (b & 0x0000ffff); + } + return card; + } + + /** + * Sets all bits in the set to false. + * + * @since 1.4 + */ + public void clear() + { + Arrays.fill(bits, 0); + } + + /** * Removes the integer bitIndex from this set. That is * the corresponding bit is cleared. If the index is not in the set, * this method does nothing. ! * ! * @param bitIndex a non-negative integer ! * @throws IndexOutOfBoundsException if bitIndex < 0 */ public void clear(int pos) { ! int offset = pos >> 6; ensure(offset); ! // ArrayIndexOutOfBoundsException subclasses IndexOutOfBoundsException, ! // so we'll just let that be our exception. ! bits[offset] &= ~(1L << pos); ! } ! ! /** ! * Sets the bits between from (inclusive) and to (exclusive) to false. ! * ! * @param from the start range (inclusive) ! * @param to the end range (exclusive) ! * @throws IndexOutOfBoundsException if from < 0 || from > to ! * @since 1.4 ! */ ! public void clear(int from, int to) ! { ! if (from < 0 || from > to) ! throw new IndexOutOfBoundsException(); ! if (from == to) ! return; ! int lo_offset = from >>> 6; ! int hi_offset = to >>> 6; ! ensure(hi_offset); ! if (lo_offset == hi_offset) ! { ! bits[hi_offset] &= ((1L << from) - 1) | (-1L << to); ! return; ! } ! ! bits[lo_offset] &= (1L << from) - 1; ! bits[hi_offset] &= -1L << to; ! for (int i = lo_offset + 1; i < hi_offset; i++) ! bits[i] = 0; } /** * Create a clone of this bit set, that is an instance of the same * class and contains the same elements. But it doesn't change when * this bit set changes. + * * @return the clone of this object. */ public Object clone() { ! try ! { ! BitSet bs = (BitSet) super.clone(); ! bs.bits = (long[]) bits.clone(); ! return bs; ! } ! catch (CloneNotSupportedException e) ! { ! // Impossible to get here. ! return null; ! } } /** * Returns true if the obj is a bit set that contains * exactly the same elements as this bit set, otherwise false. ! * ! * @param obj the object to compare to ! * @return true if obj equals this bit set */ public boolean equals(Object obj) { *************** public class BitSet implements Cloneable *** 171,212 **** int i; for (i = 0; i < max; ++i) if (bits[i] != bs.bits[i]) ! return false; // If one is larger, check to make sure all extra bits are 0. for (int j = i; j < bits.length; ++j) if (bits[j] != 0) ! return false; for (int j = i; j < bs.bits.length; ++j) if (bs.bits[j] != 0) ! return false; return true; } /** ! * Returns true if the integer bitIndex is in this bit ! * set, otherwise false. ! * @param bitIndex a non-negative integer ! * @return the value of the bit at the specified index. ! * @exception ArrayIndexOutOfBoundsException if the specified bit index ! * is negative. ! * @require bitIndex >= 0 */ ! public boolean get(int pos) { ! if (pos < 0) throw new IndexOutOfBoundsException(); ! int bit = pos % 64; ! int offset = pos / 64; if (offset >= bits.length) return false; ! return (bits[offset] & (1L << bit)) == 0 ? false : true; } /** ! * Returns a hash code value for this bit set. The hash code of * two bit sets containing the same integers is identical. The algorithm * used to compute it is as follows: * --- 272,395 ---- int i; for (i = 0; i < max; ++i) if (bits[i] != bs.bits[i]) ! return false; // If one is larger, check to make sure all extra bits are 0. for (int j = i; j < bits.length; ++j) if (bits[j] != 0) ! return false; for (int j = i; j < bs.bits.length; ++j) if (bs.bits[j] != 0) ! return false; return true; } /** ! * Sets the bit at the index to the opposite value. ! * ! * @param index the index of the bit ! * @throws IndexOutOfBoundsException if index is negative ! * @since 1.4 */ ! public void flip(int index) { ! int offset = index >> 6; ! ensure(offset); ! // ArrayIndexOutOfBoundsException subclasses IndexOutOfBoundsException, ! // so we'll just let that be our exception. ! bits[offset] ^= 1L << index; ! } ! ! /** ! * Sets a range of bits to the opposite value. ! * ! * @param from the low index (inclusive) ! * @param to the high index (exclusive) ! * @throws IndexOutOfBoundsException if from > to || from < 0 ! * @since 1.4 ! */ ! public void flip(int from, int to) ! { ! if (from < 0 || from > to) throw new IndexOutOfBoundsException(); + if (from == to) + return; + int lo_offset = from >>> 6; + int hi_offset = to >>> 6; + ensure(hi_offset); + if (lo_offset == hi_offset) + { + bits[hi_offset] ^= (-1L << from) & ((1L << to) - 1); + return; + } ! bits[lo_offset] ^= -1L << from; ! bits[hi_offset] ^= (1L << to) - 1; ! for (int i = lo_offset + 1; i < hi_offset; i++) ! bits[i] ^= -1; ! } + /** + * Returns true if the integer bitIndex is in this bit + * set, otherwise false. + * + * @param pos a non-negative integer + * @return the value of the bit at the specified index + * @throws IndexOutOfBoundsException if the index is negative + */ + public boolean get(int pos) + { + int offset = pos >> 6; if (offset >= bits.length) return false; + // ArrayIndexOutOfBoundsException subclasses IndexOutOfBoundsException, + // so we'll just let that be our exception. + return (bits[offset] & (1L << pos)) != 0; + } ! /** ! * Returns a new BitSet composed of a range of bits from ! * this one. ! * ! * @param from the low index (inclusive) ! * @param to the high index (exclusive) ! * @throws IndexOutOfBoundsException if from > to || from < 0 ! * @since 1.4 ! */ ! public BitSet get(int from, int to) ! { ! if (from < 0 || from > to) ! throw new IndexOutOfBoundsException(); ! BitSet bs = new BitSet(to - from); ! int lo_offset = from >>> 6; ! if (lo_offset >= bits.length) ! return bs; ! ! int lo_bit = from & LONG_MASK; ! int hi_offset = to >>> 6; ! if (lo_bit == 0) ! { ! int len = Math.min(hi_offset - lo_offset + 1, bits.length - lo_offset); ! System.arraycopy(bits, lo_offset, bs.bits, 0, len); ! if (hi_offset < bits.length) ! bs.bits[hi_offset - lo_offset] &= (1L << to) - 1; ! return bs; ! } ! ! int len = Math.min(hi_offset, bits.length - 1); ! int reverse = ~lo_bit; ! int i; ! for (i = 0; lo_offset < len; lo_offset++, i++) ! bs.bits[i] = ((bits[lo_offset] >>> lo_bit) ! | (bits[lo_offset + 1] << reverse)); ! if ((to & LONG_MASK) > lo_bit) ! bs.bits[i++] = bits[lo_offset] >>> lo_bit; ! if (hi_offset < bits.length) ! bs.bits[i - 1] &= (1L << (to - from)) - 1; ! return bs; } /** ! * Returns a hash code value for this bit set. The hash code of * two bit sets containing the same integers is identical. The algorithm * used to compute it is as follows: * *************** public class BitSet implements Cloneable *** 233,253 **** * * * Note that the hash code values changes, if the set is changed. * @return the hash code value for this bit set. */ public int hashCode() { long h = 1234; ! for (int i = bits.length - 1; i >= 0; --i) ! h ^= bits[i] * (i + 1); return (int) ((h >> 32) ^ h); } /** * Returns the logical number of bits actually used by this bit * set. It returns the index of the highest set bit plus one. * Note that this method doesn't return the number of set bits. ! * @return the index of the highest set bit plus one. */ public int length() { --- 416,470 ---- * * * Note that the hash code values changes, if the set is changed. + * * @return the hash code value for this bit set. */ public int hashCode() { long h = 1234; ! for (int i = bits.length; i > 0; ) ! h ^= i * bits[--i]; return (int) ((h >> 32) ^ h); } /** + * Returns true if the specified BitSet and this one share at least one + * common true bit. + * + * @param set the set to check for intersection + * @return true if the sets intersect + * @throws NullPointerException if set is null + * @since 1.4 + */ + public boolean intersects(BitSet set) + { + int i = Math.min(bits.length, set.bits.length); + while (--i >= 0) + if ((bits[i] & set.bits[i]) != 0) + return true; + return false; + } + + /** + * Returns true if this set contains no true bits. + * + * @return true if all bits are false + * @since 1.4 + */ + public boolean isEmpty() + { + for (int i = bits.length - 1; i >= 0; i--) + if (bits[i] != 0) + return false; + return true; + } + + /** * Returns the logical number of bits actually used by this bit * set. It returns the index of the highest set bit plus one. * Note that this method doesn't return the number of set bits. ! * ! * @return the index of the highest set bit plus one. */ public int length() { *************** public class BitSet implements Cloneable *** 266,319 **** // b >= 0 checks if the highest bit is zero. while (b >= 0) { ! --len; ! b <<= 1; } return len; } /** * Performs the logical OR operation on this bit set and the * given set. This means it builds the union * of the two sets. The result is stored into this bit set, which * grows as necessary. ! * @param set the second bit set. ! * @exception OutOfMemoryError if the current set can't grow. ! * @require set != null */ public void or(BitSet bs) { ensure(bs.bits.length - 1); ! int i; ! for (i = 0; i < bs.bits.length; ++i) bits[i] |= bs.bits[i]; } /** ! * Add the integer bitIndex to this set. That is * the corresponding bit is set to true. If the index was already in * the set, this method does nothing. The size of this structure * is automatically increased as necessary. ! * @param bitIndex a non-negative integer. ! * @exception ArrayIndexOutOfBoundsException if the specified bit index ! * is negative. ! * @require bitIndex >= 0 */ public void set(int pos) { ! if (pos < 0) ! throw new IndexOutOfBoundsException(); ! int bit = pos % 64; ! int offset = pos / 64; ensure(offset); ! bits[offset] |= 1L << bit; } /** * Returns the number of bits actually used by this bit set. Note ! * that this method doesn't return the number of set bits. ! * @returns the number of bits currently used. */ public int size() { --- 483,668 ---- // b >= 0 checks if the highest bit is zero. while (b >= 0) { ! --len; ! b <<= 1; } return len; } /** + * Returns the index of the next false bit, from the specified bit + * (inclusive). + * + * @param from the start location + * @return the first false bit + * @throws IndexOutOfBoundsException if from is negative + * @since 1.4 + */ + public int nextClearBit(int from) + { + int offset = from >> 6; + long mask = 1L << from; + while (offset < bits.length) + { + // ArrayIndexOutOfBoundsException subclasses IndexOutOfBoundsException, + // so we'll just let that be our exception. + long h = bits[offset]; + do + { + if ((h & mask) == 0) + return from; + mask <<= 1; + from++; + } + while (mask != 0); + mask = 1; + offset++; + } + return from; + } + + /** + * Returns the index of the next true bit, from the specified bit + * (inclusive). If there is none, -1 is returned. You can iterate over + * all true bits with this loop:
        + *
        +    * for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1))
        +    *   { // operate on i here }
        +    * 
        + * + * @param from the start location + * @return the first true bit, or -1 + * @throws IndexOutOfBoundsException if from is negative + * @since 1.4 + */ + public int nextSetBit(int from) + { + int offset = from >> 6; + long mask = 1L << from; + while (offset < bits.length) + { + // ArrayIndexOutOfBoundsException subclasses IndexOutOfBoundsException, + // so we'll just let that be our exception. + long h = bits[offset]; + do + { + if ((h & mask) != 0) + return from; + mask <<= 1; + from++; + } + while (mask != 0); + mask = 1; + offset++; + } + return -1; + } + + /** * Performs the logical OR operation on this bit set and the * given set. This means it builds the union * of the two sets. The result is stored into this bit set, which * grows as necessary. ! * ! * @param bs the second bit set ! * @throws NullPointerException if bs is null */ public void or(BitSet bs) { ensure(bs.bits.length - 1); ! for (int i = bs.bits.length - 1; i >= 0; i--) bits[i] |= bs.bits[i]; } /** ! * Add the integer bitIndex to this set. That is * the corresponding bit is set to true. If the index was already in * the set, this method does nothing. The size of this structure * is automatically increased as necessary. ! * ! * @param pos a non-negative integer. ! * @throws IndexOutOfBoundsException if pos is negative */ public void set(int pos) { ! int offset = pos >> 6; ensure(offset); ! // ArrayIndexOutOfBoundsException subclasses IndexOutOfBoundsException, ! // so we'll just let that be our exception. ! bits[offset] |= 1L << pos; ! } ! ! /** ! * Sets the bit at the given index to the specified value. The size of ! * this structure is automatically increased as necessary. ! * ! * @param index the position to set ! * @param value the value to set it to ! * @throws IndexOutOfBoundsException if index is negative ! * @since 1.4 ! */ ! public void set(int index, boolean value) ! { ! if (value) ! set(index); ! else ! clear(index); ! } ! ! /** ! * Sets the bits between from (inclusive) and to (exclusive) to true. ! * ! * @param from the start range (inclusive) ! * @param to the end range (exclusive) ! * @throws IndexOutOfBoundsException if from < 0 || from > to ! * @since 1.4 ! */ ! public void set(int from, int to) ! { ! if (from < 0 || from > to) ! throw new IndexOutOfBoundsException(); ! if (from == to) ! return; ! int lo_offset = from >>> 6; ! int hi_offset = to >>> 6; ! ensure(hi_offset); ! if (lo_offset == hi_offset) ! { ! bits[hi_offset] |= (-1L << from) & ((1L << to) - 1); ! return; ! } ! ! bits[lo_offset] |= -1L << from; ! bits[hi_offset] |= (1L << to) - 1; ! for (int i = lo_offset + 1; i < hi_offset; i++) ! bits[i] = -1; ! } ! ! /** ! * Sets the bits between from (inclusive) and to (exclusive) to the ! * specified value. ! * ! * @param from the start range (inclusive) ! * @param to the end range (exclusive) ! * @param value the value to set it to ! * @throws IndexOutOfBoundsException if from < 0 || from > to ! * @since 1.4 ! */ ! public void set(int from, int to, boolean value) ! { ! if (value) ! set(from, to); ! else ! clear(from, to); } /** * Returns the number of bits actually used by this bit set. Note ! * that this method doesn't return the number of set bits, and that ! * future requests for larger bits will make this automatically grow. ! * ! * @return the number of bits currently used. */ public int size() { *************** public class BitSet implements Cloneable *** 324,355 **** * Returns the string representation of this bit set. This * consists of a comma separated list of the integers in this set * surrounded by curly braces. There is a space after each comma. * @return the string representation. */ public String toString() { ! String r = "{"; boolean first = true; for (int i = 0; i < bits.length; ++i) { ! long bit = 1; ! long word = bits[i]; ! if (word == 0) ! continue; ! for (int j = 0; j < 64; ++j) ! { ! if ((word & bit) != 0) ! { ! if (!first) ! r += ", "; ! r += Integer.toString(64 * i + j); ! first = false; ! } ! bit <<= 1; ! } } ! ! return r += "}"; } /** --- 673,704 ---- * Returns the string representation of this bit set. This * consists of a comma separated list of the integers in this set * surrounded by curly braces. There is a space after each comma. + * A sample string is thus "{1, 3, 53}". * @return the string representation. */ public String toString() { ! StringBuffer r = new StringBuffer("{"); boolean first = true; for (int i = 0; i < bits.length; ++i) { ! long bit = 1; ! long word = bits[i]; ! if (word == 0) ! continue; ! for (int j = 0; j < 64; ++j) ! { ! if ((word & bit) != 0) ! { ! if (! first) ! r.append(", "); ! r.append(64 * i + j); ! first = false; ! } ! bit <<= 1; ! } } ! return r.append("}").toString(); } /** *************** public class BitSet implements Cloneable *** 357,388 **** * given set. This means it builds the symmetric * remainder of the two sets (the elements that are in one set, * but not in the other). The result is stored into this bit set, ! * which grows as necessary. ! * @param set the second bit set. ! * @exception OutOfMemoryError if the current set can't grow. ! * @require set != null */ public void xor(BitSet bs) { ensure(bs.bits.length - 1); ! int i; ! for (i = 0; i < bs.bits.length; ++i) bits[i] ^= bs.bits[i]; } ! // Make sure the vector is big enough. private final void ensure(int lastElt) { ! if (lastElt + 1 > bits.length) { ! long[] nd = new long[lastElt + 1]; ! System.arraycopy(bits, 0, nd, 0, bits.length); ! bits = nd; } } - - // The actual bits. - long[] bits; - - private static final long serialVersionUID = 7997698588986878753L; } --- 706,735 ---- * given set. This means it builds the symmetric * remainder of the two sets (the elements that are in one set, * but not in the other). The result is stored into this bit set, ! * which grows as necessary. ! * ! * @param bs the second bit set ! * @throws NullPointerException if bs is null */ public void xor(BitSet bs) { ensure(bs.bits.length - 1); ! for (int i = bs.bits.length - 1; i >= 0; i--) bits[i] ^= bs.bits[i]; } ! /** ! * Make sure the vector is big enough. ! * ! * @param lastElt the size needed for the bits array ! */ private final void ensure(int lastElt) { ! if (lastElt >= bits.length) { ! long[] nd = new long[lastElt + 1]; ! System.arraycopy(bits, 0, nd, 0, bits.length); ! bits = nd; } } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Calendar.java gcc-3.1/libjava/java/util/Calendar.java *** gcc-3.0.4/libjava/java/util/Calendar.java Thu Dec 28 05:55:56 2000 --- gcc-3.1/libjava/java/util/Calendar.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* java.util.Calendar ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* java.util.Calendar ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.*; *** 54,60 **** * * When computing the date from time fields, it may happen, that there * are either two few fields set, or some fields are inconsistent. This ! * cases will handled in a calender specific way. Missing fields are * replaced by the fields of the epoch: 1970 January 1 00:00.
        * * To understand, how the day of year is computed out of the fields --- 65,71 ---- * * When computing the date from time fields, it may happen, that there * are either two few fields set, or some fields are inconsistent. This ! * cases will handled in a calendar specific way. Missing fields are * replaced by the fields of the epoch: 1970 January 1 00:00.
        * * To understand, how the day of year is computed out of the fields *************** public abstract class Calendar implement *** 356,362 **** private static final String bundleName = "gnu.java.locale.Calendar"; /** ! * Constructs a new Calender with the default time zone and the default * locale. */ protected Calendar() --- 367,373 ---- private static final String bundleName = "gnu.java.locale.Calendar"; /** ! * Constructs a new Calendar with the default time zone and the default * locale. */ protected Calendar() *************** public abstract class Calendar implement *** 365,371 **** } /** ! * Constructs a new Calender with the given time zone and the given * locale. * @param zone a time zone. * @param locale a locale. --- 376,382 ---- } /** ! * Constructs a new Calendar with the given time zone and the given * locale. * @param zone a time zone. * @param locale a locale. *************** public abstract class Calendar implement *** 445,451 **** } /** ! * Gets the set of locales for which a Calendar is availiable. * @exception MissingResourceException if locale data couldn't be found. * @return the set of locales. */ --- 456,462 ---- } /** ! * Gets the set of locales for which a Calendar is available. * @exception MissingResourceException if locale data couldn't be found. * @return the set of locales. */ *************** public abstract class Calendar implement *** 483,489 **** } /** ! * Sets this Calender's time to the given Date. All time fields * are invalidated by this method. */ public final void setTime(Date date) --- 494,500 ---- } /** ! * Sets this Calendar's time to the given Date. All time fields * are invalidated by this method. */ public final void setTime(Date date) *************** public abstract class Calendar implement *** 503,509 **** } /** ! * Sets this Calender's time to the given Time. All time fields * are invalidated by this method. * @param time the time in milliseconds since the epoch */ --- 514,520 ---- } /** ! * Sets this Calendar's time to the given Time. All time fields * are invalidated by this method. * @param time the time in milliseconds since the epoch */ *************** public abstract class Calendar implement *** 522,527 **** --- 533,541 ---- */ public final int get(int field) { + // If the requested field is invalid, force all fields to be recomputed. + if (!isSet[field]) + areFieldsSet = false; complete(); return fields[field]; } *************** public abstract class Calendar implement *** 546,556 **** */ public final void set(int field, int value) { - if (!areFieldsSet) - computeFields(); isTimeSet = false; fields[field] = value; isSet[field] = true; } /** --- 560,590 ---- */ public final void set(int field, int value) { isTimeSet = false; fields[field] = value; isSet[field] = true; + switch (field) + { + case YEAR: + case MONTH: + case DATE: + isSet[WEEK_OF_YEAR] = false; + isSet[DAY_OF_YEAR] = false; + isSet[WEEK_OF_MONTH] = false; + isSet[DAY_OF_WEEK] = false; + isSet[DAY_OF_WEEK_IN_MONTH] = false; + break; + case AM_PM: + isSet[HOUR_OF_DAY] = false; + break; + case HOUR_OF_DAY: + isSet[AM_PM] = false; + isSet[HOUR] = false; + break; + case HOUR: + isSet[HOUR_OF_DAY] = false; + break; + } } /** *************** public abstract class Calendar implement *** 561,573 **** */ public final void set(int year, int month, int date) { - if (!areFieldsSet) - computeFields(); isTimeSet = false; fields[YEAR] = year; fields[MONTH] = month; fields[DATE] = date; isSet[YEAR] = isSet[MONTH] = isSet[DATE] = true; } /** --- 595,610 ---- */ public final void set(int year, int month, int date) { isTimeSet = false; fields[YEAR] = year; fields[MONTH] = month; fields[DATE] = date; isSet[YEAR] = isSet[MONTH] = isSet[DATE] = true; + isSet[WEEK_OF_YEAR] = false; + isSet[DAY_OF_YEAR] = false; + isSet[WEEK_OF_MONTH] = false; + isSet[DAY_OF_WEEK] = false; + isSet[DAY_OF_WEEK_IN_MONTH] = false; } /** *************** public abstract class Calendar implement *** 584,589 **** --- 621,628 ---- fields[HOUR_OF_DAY] = hour; fields[MINUTE] = minute; isSet[HOUR_OF_DAY] = isSet[MINUTE] = true; + isSet[AM_PM] = false; + isSet[HOUR] = false; } /** *************** public abstract class Calendar implement *** 611,617 **** isTimeSet = false; areFieldsSet = false; for (int i = 0; i < FIELD_COUNT; i++) ! isSet[i] = false; } /** --- 650,659 ---- isTimeSet = false; areFieldsSet = false; for (int i = 0; i < FIELD_COUNT; i++) ! { ! isSet[i] = false; ! fields[i] = 0; ! } } /** *************** public abstract class Calendar implement *** 623,628 **** --- 665,671 ---- isTimeSet = false; areFieldsSet = false; isSet[field] = false; + fields[field] = 0; } /** *************** public abstract class Calendar implement *** 647,656 **** } /** ! * Compares the given calender with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, that represents ! * the same time (but doesn't neccessary have the same fields). */ public boolean equals(Object o) { --- 690,699 ---- } /** ! * Compares the given calendar with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, that represents ! * the same time (but doesn't necessary have the same fields). */ public boolean equals(Object o) { *************** public abstract class Calendar implement *** 670,679 **** } /** ! * Compares the given calender with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, and this calendar ! * represents a smaller time than the calender o. * @exception ClassCastException if o is not an calendar. * @since JDK1.2 you don't need to override this method */ --- 713,722 ---- } /** ! * Compares the given calendar with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, and this calendar ! * represents a smaller time than the calendar o. * @exception ClassCastException if o is not an calendar. * @since JDK1.2 you don't need to override this method */ *************** public abstract class Calendar implement *** 683,692 **** } /** ! * Compares the given calender with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, and this calendar ! * represents a bigger time than the calender o. * @exception ClassCastException if o is not an calendar. * @since JDK1.2 you don't need to override this method */ --- 726,735 ---- } /** ! * Compares the given calendar with this. * @param o the object to that we should compare. * @return true, if the given object is a calendar, and this calendar ! * represents a bigger time than the calendar o. * @exception ClassCastException if o is not an calendar. * @since JDK1.2 you don't need to override this method */ *************** public abstract class Calendar implement *** 860,882 **** /** * Gets the actual minimum value that is allowed for the specified field. ! * This value is dependant on the values of the other fields. * @param field the time field. One of the time field constants. * @return the actual minimum value. * @since jdk1.2 */ // FIXME: XXX: Not abstract in JDK 1.2. ! // public abstract int getActualMinimum(int field); /** * Gets the actual maximum value that is allowed for the specified field. ! * This value is dependant on the values of the other fields. * @param field the time field. One of the time field constants. * @return the actual maximum value. * @since jdk1.2 */ // FIXME: XXX: Not abstract in JDK 1.2. ! // public abstract int getActualMaximum(int field); /** * Return a clone of this object. --- 903,925 ---- /** * Gets the actual minimum value that is allowed for the specified field. ! * This value is dependent on the values of the other fields. * @param field the time field. One of the time field constants. * @return the actual minimum value. * @since jdk1.2 */ // FIXME: XXX: Not abstract in JDK 1.2. ! public abstract int getActualMinimum(int field); /** * Gets the actual maximum value that is allowed for the specified field. ! * This value is dependent on the values of the other fields. * @param field the time field. One of the time field constants. * @return the actual maximum value. * @since jdk1.2 */ // FIXME: XXX: Not abstract in JDK 1.2. ! public abstract int getActualMaximum(int field); /** * Return a clone of this object. diff -Nrc3pad gcc-3.0.4/libjava/java/util/Collection.java gcc-3.1/libjava/java/util/Collection.java *** gcc-3.0.4/libjava/java/util/Collection.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/Collection.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* Collection.java -- Interface that represents a collection of objects ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Collection.java -- Interface that represents a collection of objects ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,32 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Maybe some more @see clauses would be helpful. package java.util; --- 18,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; *************** package java.util; *** 57,65 **** * and returns a collection containing the same elements (that is, creates a * copy of the argument using its own implementation). * ! * @see java.util.List ! * @see java.util.Set ! * @see java.util.AbstractCollection */ public interface Collection { --- 65,87 ---- * and returns a collection containing the same elements (that is, creates a * copy of the argument using its own implementation). * ! * @author Original author unknown ! * @author Eric Blake ! * @see List ! * @see Set ! * @see Map ! * @see SortedSet ! * @see SortedMap ! * @see HashSet ! * @see TreeSet ! * @see ArrayList ! * @see LinkedList ! * @see Vector ! * @see Collections ! * @see Arrays ! * @see AbstractCollection ! * @since 1.2 ! * @status updated to 1.4 */ public interface Collection { *************** public interface Collection *** 67,78 **** * Add an element to this collection. * * @param o the object to add. ! * @returns true if the collection was modified as a result of this action. ! * @exception UnsupportedOperationException if this collection does not * support the add operation. ! * @exception ClassCastException if o cannot be added to this collection due * to its type. ! * @exception IllegalArgumentException if o cannot be added to this * collection for some other reason. */ boolean add(Object o); --- 89,100 ---- * Add an element to this collection. * * @param o the object to add. ! * @return true if the collection was modified as a result of this action. ! * @throws UnsupportedOperationException if this collection does not * support the add operation. ! * @throws ClassCastException if o cannot be added to this collection due * to its type. ! * @throws IllegalArgumentException if o cannot be added to this * collection for some other reason. */ boolean add(Object o); *************** public interface Collection *** 81,92 **** * Add the contents of a given collection to this collection. * * @param c the collection to add. ! * @returns true if the collection was modified as a result of this action. ! * @exception UnsupportedOperationException if this collection does not * support the addAll operation. ! * @exception ClassCastException if some element of c cannot be added to this * collection due to its type. ! * @exception IllegalArgumentException if some element of c cannot be added * to this collection for some other reason. */ boolean addAll(Collection c); --- 103,114 ---- * Add the contents of a given collection to this collection. * * @param c the collection to add. ! * @return true if the collection was modified as a result of this action. ! * @throws UnsupportedOperationException if this collection does not * support the addAll operation. ! * @throws ClassCastException if some element of c cannot be added to this * collection due to its type. ! * @throws IllegalArgumentException if some element of c cannot be added * to this collection for some other reason. */ boolean addAll(Collection c); *************** public interface Collection *** 95,101 **** * Clear the collection, such that a subsequent call to isEmpty() would * return true. * ! * @exception UnsupportedOperationException if this collection does not * support the clear operation. */ void clear(); --- 117,123 ---- * Clear the collection, such that a subsequent call to isEmpty() would * return true. * ! * @throws UnsupportedOperationException if this collection does not * support the clear operation. */ void clear(); *************** public interface Collection *** 105,111 **** * elements. * * @param o the element to look for. ! * @returns true if this collection contains at least one element e such that * o == null ? e == null : o.equals(e). */ boolean contains(Object o); --- 127,133 ---- * elements. * * @param o the element to look for. ! * @return true if this collection contains at least one element e such that * o == null ? e == null : o.equals(e). */ boolean contains(Object o); *************** public interface Collection *** 114,120 **** * Test whether this collection contains every element in a given collection. * * @param c the collection to test for. ! * @returns true if for every element o in c, contains(o) would return true. */ boolean containsAll(Collection c); --- 136,142 ---- * Test whether this collection contains every element in a given collection. * * @param c the collection to test for. ! * @return true if for every element o in c, contains(o) would return true. */ boolean containsAll(Collection c); *************** public interface Collection *** 132,138 **** * preserve the symmetry of the relation. * * @param o the object to compare to this collection. ! * @returns true if the o is equal to this collection. */ boolean equals(Object o); --- 154,160 ---- * preserve the symmetry of the relation. * * @param o the object to compare to this collection. ! * @return true if the o is equal to this collection. */ boolean equals(Object o); *************** public interface Collection *** 148,168 **** * method renders it impossible to correctly implement both Set and List, as * the required implementations are mutually exclusive. * ! * @returns a hash code for this collection. */ int hashCode(); /** * Test whether this collection is empty, that is, if size() == 0. * ! * @returns true if this collection contains no elements. */ boolean isEmpty(); /** * Obtain an Iterator over this collection. * ! * @returns an Iterator over the elements of this collection, in any order. */ Iterator iterator(); --- 170,190 ---- * method renders it impossible to correctly implement both Set and List, as * the required implementations are mutually exclusive. * ! * @return a hash code for this collection. */ int hashCode(); /** * Test whether this collection is empty, that is, if size() == 0. * ! * @return true if this collection contains no elements. */ boolean isEmpty(); /** * Obtain an Iterator over this collection. * ! * @return an Iterator over the elements of this collection, in any order. */ Iterator iterator(); *************** public interface Collection *** 172,180 **** * : o.equals(e)
        . * * @param o the object to remove. ! * @returns true if the collection changed as a result of this call, that is, * if the collection contained at least one occurrence of o. ! * @exception UnsupportedOperationException if this collection does not * support the remove operation. */ boolean remove(Object o); --- 194,202 ---- * : o.equals(e). * * @param o the object to remove. ! * @return true if the collection changed as a result of this call, that is, * if the collection contained at least one occurrence of o. ! * @throws UnsupportedOperationException if this collection does not * support the remove operation. */ boolean remove(Object o); *************** public interface Collection *** 183,190 **** * Remove all elements of a given collection from this collection. That is, * remove every element e such that c.contains(e). * ! * @returns true if this collection was modified as a result of this call. ! * @exception UnsupportedOperationException if this collection does not * support the removeAll operation. */ boolean removeAll(Collection c); --- 205,212 ---- * Remove all elements of a given collection from this collection. That is, * remove every element e such that c.contains(e). * ! * @return true if this collection was modified as a result of this call. ! * @throws UnsupportedOperationException if this collection does not * support the removeAll operation. */ boolean removeAll(Collection c); *************** public interface Collection *** 193,200 **** * Remove all elements of this collection that are not contained in a given * collection. That is, remove every element e such that !c.contains(e). * ! * @returns true if this collection was modified as a result of this call. ! * @exception UnsupportedOperationException if this collection does not * support the retainAll operation. */ boolean retainAll(Collection c); --- 215,222 ---- * Remove all elements of this collection that are not contained in a given * collection. That is, remove every element e such that !c.contains(e). * ! * @return true if this collection was modified as a result of this call. ! * @throws UnsupportedOperationException if this collection does not * support the retainAll operation. */ boolean retainAll(Collection c); *************** public interface Collection *** 202,215 **** /** * Get the number of elements in this collection. * ! * @returns the number of elements in the collection. */ int size(); /** * Copy the current contents of this collection into an array. * ! * @returns an array of type Object[] and length equal to the size of this * collection, containing the elements currently in this collection, in * any order. */ --- 224,237 ---- /** * Get the number of elements in this collection. * ! * @return the number of elements in the collection. */ int size(); /** * Copy the current contents of this collection into an array. * ! * @return an array of type Object[] and length equal to the size of this * collection, containing the elements currently in this collection, in * any order. */ *************** public interface Collection *** 227,235 **** * if it is known that this collection does not contain any null elements. * * @param a the array to copy this collection into. ! * @returns an array containing the elements currently in this collection, in * any order. ! * @exception ArrayStoreException if the type of any element of the * collection is not a subtype of the element type of a. */ Object[] toArray(Object[] a); --- 249,257 ---- * if it is known that this collection does not contain any null elements. * * @param a the array to copy this collection into. ! * @return an array containing the elements currently in this collection, in * any order. ! * @throws ArrayStoreException if the type of any element of the * collection is not a subtype of the element type of a. */ Object[] toArray(Object[] a); diff -Nrc3pad gcc-3.0.4/libjava/java/util/Collections.java gcc-3.1/libjava/java/util/Collections.java *** gcc-3.0.4/libjava/java/util/Collections.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/Collections.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* Collections.java -- Utility class with methods to operate on collections ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Collections.java -- Utility class with methods to operate on collections ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,33 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Serialization is very much broken. Blame Sun for not specifying it. - // ~ The synchronized* and unmodifiable* methods don't have doc-comments. package java.util; --- 18,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; *************** import java.io.Serializable; *** 40,49 **** --- 47,101 ---- * are unaware of collections, a method to return a list which consists of * multiple copies of one element, and methods which "wrap" collections to give * them extra properties, such as thread-safety and unmodifiability. + *

        + * + * All methods which take a collection throw a {@link NullPointerException} if + * that collection is null. Algorithms which can change a collection may, but + * are not required, to throw the {@link UnsupportedOperationException} that + * the underlying collection would throw during an attempt at modification. + * For example, + * Collections.singleton("").addAll(Collections.EMPTY_SET) + * does not throw a exception, even though addAll is an unsupported operation + * on a singleton; the reason for this is that addAll did not attempt to + * modify the set. + * + * @author Original author unknown + * @author Bryce McKinlay + * @author Eric Blake + * @see Collection + * @see Set + * @see List + * @see Map + * @see Arrays + * @since 1.2 + * @status updated to 1.4 */ public class Collections { /** + * Constant used to decide cutoff for when a non-RandomAccess list should + * be treated as sequential-access. Basically, quadratic behavior is + * acceptible for small lists when the overhead is so small in the first + * place. I arbitrarily set it to 16, so it may need some tuning. + */ + private static final int LARGE_LIST_SIZE = 16; + + /** + * Determines if a list should be treated as a sequential-access one. + * Rather than the old method of JDK 1.3 of assuming only instanceof + * AbstractSequentialList should be sequential, this uses the new method + * of JDK 1.4 of assuming anything that does NOT implement RandomAccess + * and exceeds a large (unspecified) size should be sequential. + * + * @param l the list to check + * @return true if it should be treated as sequential-access + */ + private static boolean isSequential(List l) + { + return ! (l instanceof RandomAccess) && l.size() > LARGE_LIST_SIZE; + } + + /** * This class is non-instantiable. */ private Collections() *************** public class Collections *** 51,250 **** } /** ! * An immutable, empty Set. ! * Note: This implementation isn't Serializable, although it should be by the ! * spec. */ ! public static final Set EMPTY_SET = new AbstractSet() { public int size() { return 0; } ! // This is really cheating! I think it's perfectly valid, though - the ! // more conventional code is here, commented out, in case anyone disagrees. public Iterator iterator() { ! return EMPTY_LIST.iterator(); } ! // public Iterator iterator() { ! // return new Iterator() { ! // ! // public boolean hasNext() { ! // return false; ! // } ! // ! // public Object next() { ! // throw new NoSuchElementException(); ! // } ! // ! // public void remove() { ! // throw new UnsupportedOperationException(); ! // } ! // }; ! // } ! ! }; /** ! * An immutable, empty List. ! * Note: This implementation isn't serializable, although it should be by the ! * spec. */ ! public static final List EMPTY_LIST = new AbstractList() { public int size() { return 0; } public Object get(int index) { throw new IndexOutOfBoundsException(); } ! }; /** ! * An immutable, empty Map. ! * Note: This implementation isn't serializable, although it should be by the ! * spec. */ ! public static final Map EMPTY_MAP = new AbstractMap() { public Set entrySet() { return EMPTY_SET; } ! }; /** * Compare two objects with or without a Comparator. If c is null, uses the * natural ordering. Slightly slower than doing it inline if the JVM isn't * clever, but worth it for removing a duplicate of the search code. ! * Note: This same code is used in Arrays (for sort as well as search) ! */ ! private static int compare(Object o1, Object o2, Comparator c) ! { ! if (c == null) ! { ! return ((Comparable) o1).compareTo(o2); ! } ! else ! { ! return c.compare(o1, o2); ! } ! } ! ! /** ! * The hard work for the search routines. If the Comparator given is null, ! * uses the natural ordering of the elements. */ ! private static int search(List l, Object key, final Comparator c) { ! int pos = 0; ! ! // We use a linear search using an iterator if we can guess that the list ! // is sequential-access. ! if (l instanceof AbstractSequentialList) ! { ! ListIterator itr = l.listIterator(); ! for (int i = l.size() - 1; i >= 0; --i) ! { ! final int d = compare(key, itr.next(), c); ! if (d == 0) ! { ! return pos; ! } ! else if (d < 0) ! { ! return -pos - 1; ! } ! pos++; ! } ! ! // We assume the list is random-access, and use a binary search ! } ! else ! { ! int low = 0; ! int hi = l.size() - 1; ! while (low <= hi) ! { ! pos = (low + hi) >> 1; ! final int d = compare(key, l.get(pos), c); ! if (d == 0) ! { ! return pos; ! } ! else if (d < 0) ! { ! hi = pos - 1; ! } ! else ! { ! low = ++pos; // This gets the insertion point right on the last loop ! } ! } ! } ! ! // If we failed to find it, we do the same whichever search we did. ! return -pos - 1; } /** * Perform a binary search of a List for a key, using the natural ordering of * the elements. The list must be sorted (as by the sort() method) - if it is ! * not, the behaviour of this method is undefined, and may be an infinite * loop. Further, the key must be comparable with every item in the list. If ! * the list contains the key more than once, any one of them may be found. To ! * avoid pathological behaviour on sequential-access lists, a linear search ! * is used if (l instanceof AbstractSequentialList). Note: although the * specification allows for an infinite loop if the list is unsorted, it will * not happen in this (Classpath) implementation. * * @param l the list to search (must be sorted) * @param key the value to search for ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. ! * @exception ClassCastException if key could not be compared with one of the ! * elements of l ! * @exception NullPointerException if a null element has compareTo called */ public static int binarySearch(List l, Object key) { ! return search(l, key, null); } /** * Perform a binary search of a List for a key, using a supplied Comparator. * The list must be sorted (as by the sort() method with the same Comparator) ! * - if it is not, the behaviour of this method is undefined, and may be an * infinite loop. Further, the key must be comparable with every item in the * list. If the list contains the key more than once, any one of them may be ! * found. To avoid pathological behaviour on sequential-access lists, a ! * linear search is used if (l instanceof AbstractSequentialList). Note: ! * although the specification allows for an infinite loop if the list is ! * unsorted, it will not happen in this (Classpath) implementation. * * @param l the list to search (must be sorted) * @param key the value to search for * @param c the comparator by which the list is sorted ! * @returns the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value. ! * @exception ClassCastException if key could not be compared with one of the ! * elements of l */ public static int binarySearch(List l, Object key, Comparator c) { ! if (c == null) { ! throw new NullPointerException(); } ! return search(l, key, c); } /** --- 103,390 ---- } /** ! * An immutable, serializable, empty Set. ! * @see Serializable */ ! public static final Set EMPTY_SET = new EmptySet(); ! ! private static final Iterator EMPTY_ITERATOR = new Iterator() ! { ! public boolean hasNext() ! { ! return false; ! } ! ! public Object next() ! { ! throw new NoSuchElementException(); ! } ! ! public void remove() ! { ! throw new UnsupportedOperationException(); ! } ! }; ! ! /** ! * The implementation of {@link #EMPTY_SET}. This class name is required ! * for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class EmptySet extends AbstractSet ! implements Serializable { + /** + * Compatible with JDK 1.4. + */ + private static final long serialVersionUID = 1582296315990362920L; + + /** + * A private constructor adds overhead. + */ + EmptySet() + { + } + + /** + * The size: always 0! + */ public int size() { return 0; } ! /** ! * Returns an iterator that does not iterate. ! */ public Iterator iterator() { ! return EMPTY_ITERATOR; } + } // class EmptySet ! /** ! * An immutable, serializable, empty List, which implements RandomAccess. ! * @see Serializable ! * @see RandomAccess ! */ ! public static final List EMPTY_LIST = new EmptyList(); /** ! * The implementation of {@link #EMPTY_LIST}. This class name is required ! * for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake */ ! private static final class EmptyList extends AbstractList ! implements Serializable, RandomAccess { + /** + * Compatible with JDK 1.4. + */ + private static final long serialVersionUID = 8842843931221139166L; + + /** + * A private constructor adds overhead. + */ + EmptyList() + { + } + + /** + * The size is always 0. + */ public int size() { return 0; } + /** + * No matter the index, it is out of bounds. + */ public Object get(int index) { throw new IndexOutOfBoundsException(); } ! ! /** ! * Returns an iterator that does not iterate. Optional, but avoids ! * allocation of an iterator in AbstractList. ! */ ! public Iterator iterator() ! { ! return EMPTY_ITERATOR; ! } ! } // class EmptyList /** ! * An immutable, serializable, empty Map. ! * @see Serializable */ ! public static final Map EMPTY_MAP = new EmptyMap(); ! ! /** ! * The implementation of {@link #EMPTY_MAP}. This class name is required ! * for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class EmptyMap extends AbstractMap ! implements Serializable { + /** + * Compatible with JDK 1.4. + */ + private static final long serialVersionUID = 6428348081105594320L; + + /** + * A private constructor adds overhead. + */ + EmptyMap() + { + } + + /** + * There are no entries. + */ public Set entrySet() { return EMPTY_SET; } ! ! /** ! * Size is always 0. ! */ ! public int size() ! { ! return 0; ! } ! ! /** ! * No entries. Technically, EMPTY_SET, while more specific than a general ! * Collection, will work. Besides, that's what the JDK uses! ! */ ! public Collection values() ! { ! return EMPTY_SET; ! } ! } // class EmptyMap /** * Compare two objects with or without a Comparator. If c is null, uses the * natural ordering. Slightly slower than doing it inline if the JVM isn't * clever, but worth it for removing a duplicate of the search code. ! * Note: This code is also used in Arrays (for sort as well as search). */ ! static final int compare(Object o1, Object o2, Comparator c) { ! return c == null ? ((Comparable) o1).compareTo(o2) : c.compare(o1, o2); } /** * Perform a binary search of a List for a key, using the natural ordering of * the elements. The list must be sorted (as by the sort() method) - if it is ! * not, the behavior of this method is undefined, and may be an infinite * loop. Further, the key must be comparable with every item in the list. If ! * the list contains the key more than once, any one of them may be found. ! *

        ! * ! * This algorithm behaves in log(n) time for {@link RandomAccess} lists, ! * and uses a linear search with O(n) link traversals and log(n) comparisons ! * with {@link AbstractSequentialList} lists. Note: although the * specification allows for an infinite loop if the list is unsorted, it will * not happen in this (Classpath) implementation. * * @param l the list to search (must be sorted) * @param key the value to search for ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value ! * @throws ClassCastException if key could not be compared with one of the ! * elements of l ! * @throws NullPointerException if a null element has compareTo called ! * @see #sort(List) */ public static int binarySearch(List l, Object key) { ! return binarySearch(l, key, null); } /** * Perform a binary search of a List for a key, using a supplied Comparator. * The list must be sorted (as by the sort() method with the same Comparator) ! * - if it is not, the behavior of this method is undefined, and may be an * infinite loop. Further, the key must be comparable with every item in the * list. If the list contains the key more than once, any one of them may be ! * found. If the comparator is null, the elements' natural ordering is used. ! *

        ! * ! * This algorithm behaves in log(n) time for {@link RandomAccess} lists, ! * and uses a linear search with O(n) link traversals and log(n) comparisons ! * with {@link AbstractSequentialList} lists. Note: although the ! * specification allows for an infinite loop if the list is unsorted, it will ! * not happen in this (Classpath) implementation. * * @param l the list to search (must be sorted) * @param key the value to search for * @param c the comparator by which the list is sorted ! * @return the index at which the key was found, or -n-1 if it was not ! * found, where n is the index of the first value higher than key or ! * a.length if there is no such value ! * @throws ClassCastException if key could not be compared with one of the ! * elements of l ! * @throws NullPointerException if a null element is compared with natural ! * ordering (only possible when c is null) ! * @see #sort(List, Comparator) */ public static int binarySearch(List l, Object key, Comparator c) { ! int pos = 0; ! int low = 0; ! int hi = l.size() - 1; ! ! // We use a linear search with log(n) comparisons using an iterator ! // if the list is sequential-access. ! if (isSequential(l)) { ! ListIterator itr = l.listIterator(); ! int i = 0; ! while (low <= hi) ! { ! pos = (low + hi) >> 1; ! if (i < pos) ! for ( ; i != pos; i++, itr.next()); ! else ! for ( ; i != pos; i--, itr.previous()); ! final int d = compare(key, itr.next(), c); ! if (d == 0) ! return pos; ! else if (d < 0) ! hi = pos - 1; ! else ! // This gets the insertion point right on the last loop ! low = ++pos; ! } } ! else ! { ! while (low <= hi) ! { ! pos = (low + hi) >> 1; ! final int d = compare(key, l.get(pos), c); ! if (d == 0) ! return pos; ! else if (d < 0) ! hi = pos - 1; ! else ! // This gets the insertion point right on the last loop ! low = ++pos; ! } ! } ! ! // If we failed to find it, we do the same whichever search we did. ! return -pos - 1; } /** *************** public class Collections *** 252,281 **** * source list, the remaining elements are unaffected. This method runs in * linear time. * ! * @param dest the destination list. ! * @param source the source list. ! * @exception IndexOutOfBoundsException if the destination list is shorter ! * than the source list (the elements that can be copied will be, prior to ! * the exception being thrown). ! * @exception UnsupportedOperationException if dest.listIterator() does not ! * support the set operation. */ public static void copy(List dest, List source) { Iterator i1 = source.iterator(); ListIterator i2 = dest.listIterator(); ! try ! { ! for (int i = source.size() - 1; i >= 0; --i) ! { ! i2.next(); ! i2.set(i1.next()); ! } ! } ! catch (NoSuchElementException x) { ! throw new IndexOutOfBoundsException("Source doesn't fit in dest."); } } --- 392,417 ---- * source list, the remaining elements are unaffected. This method runs in * linear time. * ! * @param dest the destination list ! * @param source the source list ! * @throws IndexOutOfBoundsException if the destination list is shorter ! * than the source list (the destination will be unmodified) ! * @throws UnsupportedOperationException if dest.listIterator() does not ! * support the set operation */ public static void copy(List dest, List source) { + int pos = source.size(); + if (dest.size() < pos) + throw new IndexOutOfBoundsException("Source does not fit in dest"); + Iterator i1 = source.iterator(); ListIterator i2 = dest.listIterator(); ! while (--pos >= 0) { ! i2.next(); ! i2.set(i1.next()); } } *************** public class Collections *** 284,290 **** * with legacy APIs that require an Enumeration as input. * * @param c the Collection to iterate over ! * @returns an Enumeration backed by an Iterator over c */ public static Enumeration enumeration(Collection c) { --- 420,426 ---- * with legacy APIs that require an Enumeration as input. * * @param c the Collection to iterate over ! * @return an Enumeration backed by an Iterator over c */ public static Enumeration enumeration(Collection c) { *************** public class Collections *** 308,315 **** * * @param l the list to fill. * @param val the object to vill the list with. ! * @exception UnsupportedOperationException if l.listIterator() does not ! * support the set operation. */ public static void fill(List l, Object val) { --- 444,451 ---- * * @param l the list to fill. * @param val the object to vill the list with. ! * @throws UnsupportedOperationException if l.listIterator() does not ! * support the set operation. */ public static void fill(List l, Object val) { *************** public class Collections *** 322,351 **** } /** * Find the maximum element in a Collection, according to the natural * ordering of the elements. This implementation iterates over the * Collection, so it works in linear time. * * @param c the Collection to find the maximum element of ! * @returns the maximum element of c * @exception NoSuchElementException if c is empty * @exception ClassCastException if elements in c are not mutually comparable * @exception NullPointerException if null.compareTo is called */ public static Object max(Collection c) { ! Iterator itr = c.iterator(); ! Comparable max = (Comparable) itr.next(); // throws NoSuchElementException ! int csize = c.size(); ! for (int i = 1; i < csize; i++) ! { ! Object o = itr.next(); ! if (max.compareTo(o) < 0) ! { ! max = (Comparable) o; ! } ! } ! return max; } /** --- 458,538 ---- } /** + * Returns the starting index where the specified sublist first occurs + * in a larger list, or -1 if there is no matching position. If + * target.size() > source.size(), this returns -1, + * otherwise this implementation uses brute force, checking for + * source.sublist(i, i + target.size()).equals(target) + * for all possible i. + * + * @param source the list to search + * @param target the sublist to search for + * @return the index where found, or -1 + * @since 1.4 + */ + public static int indexOfSubList(List source, List target) + { + int ssize = source.size(); + for (int i = 0, j = target.size(); j <= ssize; i++, j++) + if (source.subList(i, j).equals(target)) + return i; + return -1; + } + + /** + * Returns the starting index where the specified sublist last occurs + * in a larger list, or -1 if there is no matching position. If + * target.size() > source.size(), this returns -1, + * otherwise this implementation uses brute force, checking for + * source.sublist(i, i + target.size()).equals(target) + * for all possible i. + * + * @param source the list to search + * @param target the sublist to search for + * @return the index where found, or -1 + * @since 1.4 + */ + public static int lastIndexOfSubList(List source, List target) + { + int ssize = source.size(); + for (int i = ssize - target.size(), j = ssize; i >= 0; i--, j--) + if (source.subList(i, j).equals(target)) + return i; + return -1; + } + + /** + * Returns an array list holding the elements visited by a given + * Enumeration. This method exists for interoperability between legacy + * APIs and the new Collection API. + * + * @param e the enumeration to put in a list + * @return a list containing the enumeration elements + * @see ArrayList + * @since 1.4 + */ + public static List list(Enumeration e) + { + List l = new ArrayList(); + while (e.hasMoreElements()) + l.add(e.nextElement()); + return l; + } + + /** * Find the maximum element in a Collection, according to the natural * ordering of the elements. This implementation iterates over the * Collection, so it works in linear time. * * @param c the Collection to find the maximum element of ! * @return the maximum element of c * @exception NoSuchElementException if c is empty * @exception ClassCastException if elements in c are not mutually comparable * @exception NullPointerException if null.compareTo is called */ public static Object max(Collection c) { ! return max(c, null); } /** *************** public class Collections *** 354,373 **** * works in linear time. * * @param c the Collection to find the maximum element of ! * @param order the Comparator to order the elements by ! * @returns the maximum element of c ! * @exception NoSuchElementException if c is empty ! * @exception ClassCastException if elements in c are not mutually comparable */ public static Object max(Collection c, Comparator order) { Iterator itr = c.iterator(); ! Object max = itr.next(); // throws NoSuchElementException int csize = c.size(); for (int i = 1; i < csize; i++) { Object o = itr.next(); ! if (order.compare(max, o) < 0) max = o; } return max; --- 541,563 ---- * works in linear time. * * @param c the Collection to find the maximum element of ! * @param order the Comparator to order the elements by, or null for natural ! * ordering ! * @return the maximum element of c ! * @throws NoSuchElementException if c is empty ! * @throws ClassCastException if elements in c are not mutually comparable ! * @throws NullPointerException if null is compared by natural ordering ! * (only possible when order is null) */ public static Object max(Collection c, Comparator order) { Iterator itr = c.iterator(); ! Object max = itr.next(); // throws NoSuchElementException int csize = c.size(); for (int i = 1; i < csize; i++) { Object o = itr.next(); ! if (compare(max, o, order) < 0) max = o; } return max; *************** public class Collections *** 379,401 **** * Collection, so it works in linear time. * * @param c the Collection to find the minimum element of ! * @returns the minimum element of c ! * @exception NoSuchElementException if c is empty ! * @exception ClassCastException if elements in c are not mutually comparable ! * @exception NullPointerException if null.compareTo is called */ public static Object min(Collection c) { ! Iterator itr = c.iterator(); ! Comparable min = (Comparable) itr.next(); // throws NoSuchElementException ! int csize = c.size(); ! for (int i = 1; i < csize; i++) ! { ! Object o = itr.next(); ! if (min.compareTo(o) > 0) ! min = (Comparable) o; ! } ! return min; } /** --- 569,582 ---- * Collection, so it works in linear time. * * @param c the Collection to find the minimum element of ! * @return the minimum element of c ! * @throws NoSuchElementException if c is empty ! * @throws ClassCastException if elements in c are not mutually comparable ! * @throws NullPointerException if null.compareTo is called */ public static Object min(Collection c) { ! return min(c, null); } /** *************** public class Collections *** 404,413 **** * works in linear time. * * @param c the Collection to find the minimum element of ! * @param order the Comparator to order the elements by ! * @returns the minimum element of c ! * @exception NoSuchElementException if c is empty ! * @exception ClassCastException if elements in c are not mutually comparable */ public static Object min(Collection c, Comparator order) { --- 585,597 ---- * works in linear time. * * @param c the Collection to find the minimum element of ! * @param order the Comparator to order the elements by, or null for natural ! * ordering ! * @return the minimum element of c ! * @throws NoSuchElementException if c is empty ! * @throws ClassCastException if elements in c are not mutually comparable ! * @throws NullPointerException if null is compared by natural ordering ! * (only possible when order is null) */ public static Object min(Collection c, Comparator order) { *************** public class Collections *** 417,423 **** for (int i = 1; i < csize; i++) { Object o = itr.next(); ! if (order.compare(min, o) > 0) min = o; } return min; --- 601,607 ---- for (int i = 1; i < csize; i++) { Object o = itr.next(); ! if (compare(min, o, order) > 0) min = o; } return min; *************** public class Collections *** 426,479 **** /** * Creates an immutable list consisting of the same object repeated n times. * The returned object is tiny, consisting of only a single reference to the ! * object and a count of the number of elements. It is Serializable. * * @param n the number of times to repeat the object * @param o the object to repeat ! * @returns a List consisting of n copies of o ! * @throws IllegalArgumentException if n < 0 */ - // It's not Serializable, because the serialized form is unspecced. - // Also I'm only assuming that it should be because I don't think it's - // stated - I just would be amazed if it isn't... public static List nCopies(final int n, final Object o) { ! // Check for insane arguments ! if (n < 0) ! { throw new IllegalArgumentException(); ! } ! // Create a minimal implementation of List ! return new AbstractList() { ! public int size() ! { ! return n; ! } ! public Object get(int index) ! { ! if (index < 0 || index >= n) ! { ! throw new IndexOutOfBoundsException(); ! } ! return o; ! } ! }; } /** * Reverse a given list. This method works in linear time. * ! * @param l the list to reverse. ! * @exception UnsupportedOperationException if l.listIterator() does not ! * support the set operation. */ public static void reverse(List l) { ListIterator i1 = l.listIterator(); ! int pos1 = 0; int pos2 = l.size(); ListIterator i2 = l.listIterator(pos2); while (pos1 < pos2) --- 610,791 ---- /** * Creates an immutable list consisting of the same object repeated n times. * The returned object is tiny, consisting of only a single reference to the ! * object and a count of the number of elements. It is Serializable, and ! * implements RandomAccess. You can use it in tandem with List.addAll for ! * fast list construction. * * @param n the number of times to repeat the object * @param o the object to repeat ! * @return a List consisting of n copies of o ! * @throws IllegalArgumentException if n < 0 ! * @see List#addAll(Collection) ! * @see Serializable ! * @see RandomAccess */ public static List nCopies(final int n, final Object o) { ! return new CopiesList(n, o); ! } ! ! /** ! * The implementation of {@link #nCopies(int, Object)}. This class name ! * is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class CopiesList extends AbstractList ! implements Serializable, RandomAccess ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 2739099268398711800L; ! ! /** ! * The count of elements in this list. ! * @serial the list size ! */ ! private final int n; ! ! /** ! * The repeated list element. ! * @serial the list contents ! */ ! private final Object element; ! ! /** ! * Constructs the list. ! * ! * @param n the count ! * @param o the object ! * @throws IllegalArgumentException if n < 0 ! */ ! CopiesList(int n, Object o) ! { ! if (n < 0) throw new IllegalArgumentException(); ! this.n = n; ! element = o; ! } ! /** ! * The size is fixed. ! */ ! public int size() { ! return n; ! } ! /** ! * The same element is returned. ! */ ! public Object get(int index) ! { ! if (index < 0 || index >= n) ! throw new IndexOutOfBoundsException(); ! return element; ! } ! ! // The remaining methods are optional, but provide a performance ! // advantage by not allocating unnecessary iterators in AbstractList. ! /** ! * This list only contains one element. ! */ ! public boolean contains(Object o) ! { ! return n > 0 && equals(o, element); ! } ! ! /** ! * The index is either 0 or -1. ! */ ! public int indexOf(Object o) ! { ! return (n > 0 && equals(o, element)) ? 0 : -1; ! } ! ! /** ! * The index is either n-1 or -1. ! */ ! public int lastIndexOf(Object o) ! { ! return equals(o, element) ? n - 1 : -1; ! } ! ! /** ! * A subList is just another CopiesList. ! */ ! public List subList(int from, int to) ! { ! if (from < 0 || to > n) ! throw new IndexOutOfBoundsException(); ! return new CopiesList(to - from, element); ! } ! ! /** ! * The array is easy. ! */ ! public Object[] toArray() ! { ! Object[] a = new Object[n]; ! Arrays.fill(a, element); ! return a; ! } ! ! /** ! * The string is easy to generate. ! */ ! public String toString() ! { ! StringBuffer r = new StringBuffer("{"); ! for (int i = n - 1; --i > 0; ) ! r.append(element).append(", "); ! r.append(element).append("}"); ! return r.toString(); ! } ! } // class CopiesList ! ! /** ! * Replace all instances of one object with another in the specified list. ! * The list does not change size. An element e is replaced if ! * oldval == null ? e == null : oldval.equals(e). ! * ! * @param list the list to iterate over ! * @param oldval the element to replace ! * @param newval the new value for the element ! * @return true if a replacement occurred ! * @throws UnsupportedOperationException if the list iterator does not allow ! * for the set operation ! * @throws ClassCastException newval is of a type which cannot be added ! * to the list ! * @throws IllegalArgumentException some other aspect of newval stops ! * it being added to the list ! * @since 1.4 ! */ ! public static boolean replaceAll(List list, Object oldval, Object newval) ! { ! ListIterator itr = list.listIterator(); ! boolean replace_occured = false; ! for (int i = list.size(); --i >= 0; ) ! if (AbstractCollection.equals(oldval, itr.next())) ! { ! itr.set(newval); ! replace_occured = true; ! } ! return replace_occured; } /** * Reverse a given list. This method works in linear time. * ! * @param l the list to reverse ! * @throws UnsupportedOperationException if l.listIterator() does not ! * support the set operation */ public static void reverse(List l) { ListIterator i1 = l.listIterator(); ! int pos1 = 1; int pos2 = l.size(); ListIterator i2 = l.listIterator(pos2); while (pos1 < pos2) *************** public class Collections *** 486,527 **** } } ! static class ReverseComparator implements Comparator, Serializable { public int compare(Object a, Object b) { ! return -((Comparable) a).compareTo(b); } } ! ! static ReverseComparator rcInstance = new ReverseComparator(); ! /** ! * Get a comparator that implements the reverse of natural ordering. This is ! * intended to make it easy to sort into reverse order, by simply passing ! * Collections.reverseOrder() to the sort method. The return value of this ! * method is Serializable. */ ! public static Comparator reverseOrder() { ! return rcInstance; } /** * Shuffle a list according to a default source of randomness. The algorithm ! * used would result in a perfectly fair shuffle (that is, each element would ! * have an equal chance of ending up in any position) with a perfect source ! * of randomness; in practice the results are merely very close to perfect. *

        - * This method operates in linear time on a random-access list, but may take - * quadratic time on a sequential-access list. - * Note: this (classpath) implementation will never take quadratic time, but - * it does make a copy of the list. This is in line with the behaviour of the - * sort methods and seems preferable. * ! * @param l the list to shuffle. ! * @exception UnsupportedOperationException if l.listIterator() does not ! * support the set operation. */ public static void shuffle(List l) { --- 798,949 ---- } } ! /** ! * Get a comparator that implements the reverse of natural ordering. In ! * other words, this sorts Comparable objects opposite of how their ! * compareTo method would sort. This makes it easy to sort into reverse ! * order, by simply passing Collections.reverseOrder() to the sort method. ! * The return value of this method is Serializable. ! * ! * @return a comparator that imposes reverse natural ordering ! * @see Comparable ! * @see Serializable ! */ ! public static Comparator reverseOrder() ! { ! return rcInstance; ! } ! ! /** ! * The object for {@link #reverseOrder()}. ! */ ! static private final ReverseComparator rcInstance = new ReverseComparator(); ! ! /** ! * The implementation of {@link #reverseOrder()}. This class name ! * is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class ReverseComparator ! implements Comparator, Serializable { + /** + * Compatible with JDK 1.4. + */ + static private final long serialVersionUID = 7207038068494060240L; + + /** + * A private constructor adds overhead. + */ + ReverseComparator() + { + } + + /** + * Compare two objects in reverse natural order. + * + * @param a the first object + * @param b the second object + * @return <, ==, or > 0 according to b.compareTo(a) + */ public int compare(Object a, Object b) { ! return ((Comparable) b).compareTo(a); } } ! /** ! * Rotate the elements in a list by a specified distance. After calling this ! * method, the element now at index i was formerly at index ! * (i - distance) mod list.size(). The list size is unchanged. ! *

        ! * ! * For example, suppose a list contains [t, a, n, k, s]. After ! * either Collections.rotate(l, 4) or ! * Collections.rotate(l, -1), the new contents are ! * [s, t, a, n, k]. This can be applied to sublists to rotate ! * just a portion of the list. For example, to move element a ! * forward two positions in the original example, use ! * Collections.rotate(l.subList(1, 3+1), -1), which will ! * result in [t, n, k, a, s]. ! *

        ! * ! * If the list is small or implements {@link RandomAccess}, the ! * implementation exchanges the first element to its destination, then the ! * displaced element, and so on until a circuit has been completed. The ! * process is repeated if needed on the second element, and so forth, until ! * all elements have been swapped. For large non-random lists, the ! * implementation breaks the list into two sublists at index ! * -distance mod size, calls {@link #reverse(List)} on the ! * pieces, then reverses the overall list. ! * ! * @param list the list to rotate ! * @param distance the distance to rotate by; unrestricted in value ! * @throws UnsupportedOperationException if the list does not support set ! * @since 1.4 */ ! public static void rotate(List list, int distance) { ! int size = list.size(); ! distance %= size; ! if (distance == 0) ! return; ! if (distance < 0) ! distance += size; ! ! if (isSequential(list)) ! { ! reverse(list); ! reverse(list.subList(0, distance)); ! reverse(list.subList(distance, size)); ! } ! else ! { ! // Determine the least common multiple of distance and size, as there ! // are (distance / LCM) loops to cycle through. ! int a = size; ! int lcm = distance; ! int b = a % lcm; ! while (b != 0) ! { ! a = lcm; ! lcm = b; ! b = a % lcm; ! } ! ! // Now, make the swaps. We must take the remainder every time through ! // the inner loop so that we don't overflow i to negative values. ! while (--lcm >= 0) ! { ! Object o = list.get(lcm); ! for (int i = lcm + distance; i != lcm; i = (i + distance) % size) ! o = list.set(i, o); ! list.set(lcm, o); ! } ! } } /** * Shuffle a list according to a default source of randomness. The algorithm ! * used iterates backwards over the list, swapping each element with an ! * element randomly selected from the elements in positions less than or ! * equal to it (using r.nextInt(int)). *

        * ! * This algorithm would result in a perfectly fair shuffle (that is, each ! * element would have an equal chance of ending up in any position) if r were ! * a perfect source of randomness. In practice the results are merely very ! * close to perfect. ! *

        ! * ! * This method operates in linear time. To do this on large lists which do ! * not implement {@link RandomAccess}, a temporary array is used to acheive ! * this speed, since it would be quadratic access otherwise. ! * ! * @param l the list to shuffle ! * @throws UnsupportedOperationException if l.listIterator() does not ! * support the set operation */ public static void shuffle(List l) { *************** public class Collections *** 536,546 **** shuffle(l, defaultRandom); } ! /** Cache a single Random object for use by shuffle(List). This improves ! * performance as well as ensuring that sequential calls to shuffle() will ! * not result in the same shuffle order occuring: the resolution of ! * System.currentTimeMillis() is not sufficient to guarantee a unique seed. ! */ private static Random defaultRandom = null; /** --- 958,969 ---- shuffle(l, defaultRandom); } ! /** ! * Cache a single Random object for use by shuffle(List). This improves ! * performance as well as ensuring that sequential calls to shuffle() will ! * not result in the same shuffle order occurring: the resolution of ! * System.currentTimeMillis() is not sufficient to guarantee a unique seed. ! */ private static Random defaultRandom = null; /** *************** public class Collections *** 549,697 **** * element randomly selected from the elements in positions less than or * equal to it (using r.nextInt(int)). *

        * This algorithm would result in a perfectly fair shuffle (that is, each * element would have an equal chance of ending up in any position) if r were * a perfect source of randomness. In practise (eg if r = new Random()) the * results are merely very close to perfect. *

        - * This method operates in linear time on a random-access list, but may take - * quadratic time on a sequential-access list. - * Note: this (classpath) implementation will never take quadratic time, but - * it does make a copy of the list. This is in line with the behaviour of the - * sort methods and seems preferable. * ! * @param l the list to shuffle. ! * @param r the source of randomness to use for the shuffle. ! * @exception UnsupportedOperationException if l.listIterator() does not ! * support the set operation. */ public static void shuffle(List l, Random r) { - Object[] a = l.toArray(); // Dump l into an array int lsize = l.size(); ListIterator i = l.listIterator(lsize); ! // Iterate backwards over l ! for (int pos = lsize - 1; pos >= 0; --pos) { // Obtain a random position to swap with. pos + 1 is used so that the // range of the random number includes the current position. int swap = r.nextInt(pos + 1); ! // Swap the swapth element of the array with the next element of the ! // list. ! Object o = a[swap]; ! a[swap] = a[pos]; ! a[pos] = o; - // Set the element in the original list accordingly. - i.previous(); i.set(o); } } /** * Obtain an immutable Set consisting of a single element. The return value * of this method is Serializable. * ! * @param o the single element. ! * @returns an immutable Set containing only o. */ ! // It's not serializable because the spec is broken. ! public static Set singleton(final Object o) { ! return new AbstractSet() { ! public int size() ! { ! return 1; ! } ! public Iterator iterator() { ! return new Iterator() ! { ! private boolean hasNext = true; ! public boolean hasNext() ! { ! return hasNext; ! } ! public Object next() ! { ! if (hasNext) ! { ! hasNext = false; ! return o; ! } ! else ! { ! throw new NoSuchElementException(); ! } ! } ! public void remove() ! { ! throw new UnsupportedOperationException(); ! } ! }; ! } ! }; ! } /** * Obtain an immutable List consisting of a single element. The return value ! * of this method is Serializable. * ! * @param o the single element. ! * @returns an immutable List containing only o. */ ! // It's not serializable because the spec is broken. ! public static List singletonList(final Object o) { ! return new AbstractList() { ! public int size() ! { ! return 1; ! } ! public Object get(int index) ! { ! if (index == 0) ! { ! throw new IndexOutOfBoundsException(); ! } ! else ! { ! return o; ! } ! } ! }; ! } /** ! * Obtain an immutable Map consisting of a single key value pair. * The return value of this method is Serializable. * ! * @param key the single key. ! * @param value the single value. ! * @returns an immutable Map containing only the single key value pair. */ ! // It's not serializable because the spec is broken. ! public static Map singletonMap(final Object key, final Object value) { ! return new AbstractMap() ! { ! public Set entrySet() ! { ! return singleton(new HashMap.Entry(key, value)); ! } ! }; } /** * Sort a list according to the natural ordering of its elements. The list * must be modifiable, but can be of fixed size. The sort algorithm is * precisely that used by Arrays.sort(Object[]), which offers guaranteed --- 972,1441 ---- * element randomly selected from the elements in positions less than or * equal to it (using r.nextInt(int)). *

        + * * This algorithm would result in a perfectly fair shuffle (that is, each * element would have an equal chance of ending up in any position) if r were * a perfect source of randomness. In practise (eg if r = new Random()) the * results are merely very close to perfect. *

        * ! * This method operates in linear time. To do this on large lists which do ! * not implement {@link RandomAccess}, a temporary array is used to acheive ! * this speed, since it would be quadratic access otherwise. ! * ! * @param l the list to shuffle ! * @param r the source of randomness to use for the shuffle ! * @throws UnsupportedOperationException if l.listIterator() does not ! * support the set operation */ public static void shuffle(List l, Random r) { int lsize = l.size(); ListIterator i = l.listIterator(lsize); + boolean sequential = isSequential(l); + Object[] a = null; // stores a copy of the list for the sequential case ! if (sequential) ! a = l.toArray(); ! ! for (int pos = lsize - 1; pos > 0; --pos) { // Obtain a random position to swap with. pos + 1 is used so that the // range of the random number includes the current position. int swap = r.nextInt(pos + 1); ! // Swap the desired element. ! Object o; ! if (sequential) ! { ! o = a[swap]; ! a[swap] = i.previous(); ! } ! else ! o = l.set(swap, i.previous()); i.set(o); } } + /** * Obtain an immutable Set consisting of a single element. The return value * of this method is Serializable. * ! * @param o the single element ! * @return an immutable Set containing only o ! * @see Serializable */ ! public static Set singleton(Object o) { ! return new SingletonSet(o); ! } ! ! /** ! * The implementation of {@link #singleton(Object)}. This class name ! * is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class SingletonSet extends AbstractSet ! implements Serializable ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 3193687207550431679L; ! ! ! /** ! * The single element; package visible for use in nested class. ! * @serial the singleton ! */ ! final Object element; ! ! /** ! * Construct a singleton. ! * @param o the element ! */ ! SingletonSet(Object o) { ! element = o; ! } ! /** ! * The size: always 1! ! */ ! public int size() ! { ! return 1; ! } ! ! /** ! * Returns an iterator over the lone element. ! */ ! public Iterator iterator() ! { ! return new Iterator() { ! private boolean hasNext = true; ! public boolean hasNext() ! { ! return hasNext; ! } ! public Object next() ! { ! if (hasNext) ! { ! hasNext = false; ! return element; ! } ! else ! throw new NoSuchElementException(); ! } ! public void remove() ! { ! throw new UnsupportedOperationException(); ! } ! }; ! } ! ! // The remaining methods are optional, but provide a performance ! // advantage by not allocating unnecessary iterators in AbstractSet. ! /** ! * The set only contains one element. ! */ ! public boolean contains(Object o) ! { ! return equals(o, element); ! } ! ! /** ! * This is true if the other collection only contains the element. ! */ ! public boolean containsAll(Collection c) ! { ! Iterator i = c.iterator(); ! int pos = c.size(); ! while (--pos >= 0) ! if (! equals(i.next(), element)) ! return false; ! return true; ! } ! ! /** ! * The hash is just that of the element. ! */ ! public int hashCode() ! { ! return hashCode(element); ! } ! ! /** ! * Returning an array is simple. ! */ ! public Object[] toArray() ! { ! return new Object[] {element}; ! } ! ! /** ! * Obvious string. ! */ ! public String toString() ! { ! return "[" + element + "]"; ! } ! } // class SingletonSet /** * Obtain an immutable List consisting of a single element. The return value ! * of this method is Serializable, and implements RandomAccess. * ! * @param o the single element ! * @return an immutable List containing only o ! * @see Serializable ! * @see RandomAccess ! * @since 1.3 */ ! public static List singletonList(Object o) { ! return new SingletonList(o); ! } ! ! /** ! * The implementation of {@link #singletonList(Object)}. This class name ! * is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class SingletonList extends AbstractList ! implements Serializable, RandomAccess ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 3093736618740652951L; ! ! /** ! * The single element. ! * @serial the singleton ! */ ! private final Object element; ! ! /** ! * Construct a singleton. ! * @param o the element ! */ ! SingletonList(Object o) { ! element = o; ! } ! /** ! * The size: always 1! ! */ ! public int size() ! { ! return 1; ! } ! ! /** ! * Only index 0 is valid. ! */ ! public Object get(int index) ! { ! if (index == 0) ! return element; ! throw new IndexOutOfBoundsException(); ! } ! ! // The remaining methods are optional, but provide a performance ! // advantage by not allocating unnecessary iterators in AbstractList. ! /** ! * The set only contains one element. ! */ ! public boolean contains(Object o) ! { ! return equals(o, element); ! } ! ! /** ! * This is true if the other collection only contains the element. ! */ ! public boolean containsAll(Collection c) ! { ! Iterator i = c.iterator(); ! int pos = c.size(); ! while (--pos >= 0) ! if (! equals(i.next(), element)) ! return false; ! return true; ! } ! ! /** ! * Speed up the hashcode computation. ! */ ! public int hashCode() ! { ! return 31 + hashCode(element); ! } ! ! /** ! * Either the list has it or not. ! */ ! public int indexOf(Object o) ! { ! return equals(o, element) ? 0 : -1; ! } ! ! /** ! * Either the list has it or not. ! */ ! public int lastIndexOf(Object o) ! { ! return equals(o, element) ? 0 : -1; ! } ! ! /** ! * Sublists are limited in scope. ! */ ! public List subList(int from, int to) ! { ! if (from == to && (to == 0 || to == 1)) ! return EMPTY_LIST; ! if (from == 0 && to == 1) ! return this; ! if (from > to) ! throw new IllegalArgumentException(); ! throw new IndexOutOfBoundsException(); ! } ! ! /** ! * Returning an array is simple. ! */ ! public Object[] toArray() ! { ! return new Object[] {element}; ! } ! ! /** ! * Obvious string. ! */ ! public String toString() ! { ! return "[" + element + "]"; ! } ! } // class SingletonList /** ! * Obtain an immutable Map consisting of a single key-value pair. * The return value of this method is Serializable. * ! * @param key the single key ! * @param value the single value ! * @return an immutable Map containing only the single key-value pair ! * @see Serializable ! * @since 1.3 */ ! public static Map singletonMap(Object key, Object value) { ! return new SingletonMap(key, value); } /** + * The implementation of {@link #singletonMap(Object)}. This class name + * is required for compatibility with Sun's JDK serializability. + * + * @author Eric Blake + */ + private static final class SingletonMap extends AbstractMap + implements Serializable + { + /** + * Compatible with JDK 1.4. + */ + private static final long serialVersionUID = -6979724477215052911L; + + /** + * The single key. + * @serial the singleton key + */ + private final Object k; + + /** + * The corresponding value. + * @serial the singleton value + */ + private final Object v; + + /** + * Cache the entry set. + */ + private transient Set entries; + + /** + * Construct a singleton. + * @param key the key + * @param value the value + */ + SingletonMap(Object key, Object value) + { + k = key; + v = value; + } + + /** + * There is a single immutable entry. + */ + public Set entrySet() + { + if (entries == null) + entries = singleton(new BasicMapEntry(k, v) + { + public Object setValue(Object o) + { + throw new UnsupportedOperationException(); + } + }); + return entries; + } + + // The remaining methods are optional, but provide a performance + // advantage by not allocating unnecessary iterators in AbstractMap. + /** + * Single entry. + */ + public boolean containsKey(Object key) + { + return equals(key, k); + } + + /** + * Single entry. + */ + public boolean containsValue(Object value) + { + return equals(value, v); + } + + /** + * Single entry. + */ + public Object get(Object key) + { + return equals(key, k) ? v : null; + } + + /** + * Calculate the hashcode directly. + */ + public int hashCode() + { + return hashCode(k) ^ hashCode(v); + } + + /** + * Return the keyset. + */ + public Set keySet() + { + if (keys == null) + keys = singleton(k); + return keys; + } + + /** + * The size: always 1! + */ + public int size() + { + return 1; + } + + /** + * Return the values. Technically, a singleton, while more specific than + * a general Collection, will work. Besides, that's what the JDK uses! + */ + public Collection values() + { + if (values == null) + values = singleton(v); + return values; + } + + /** + * Obvious string. + */ + public String toString() + { + return "{" + k + "=" + v + "}"; + } + } // class SingletonMap + + /** * Sort a list according to the natural ordering of its elements. The list * must be modifiable, but can be of fixed size. The sort algorithm is * precisely that used by Arrays.sort(Object[]), which offers guaranteed *************** public class Collections *** 700,718 **** * the array. * * @param l the List to sort ! * @exception ClassCastException if some items are not mutually comparable ! * @exception UnsupportedOperationException if the List is not modifiable */ public static void sort(List l) { ! Object[] a = l.toArray(); ! Arrays.sort(a); ! ListIterator i = l.listIterator(); ! for (int pos = 0; pos < a.length; pos++) ! { ! i.next(); ! i.set(a[pos]); ! } } /** --- 1444,1457 ---- * the array. * * @param l the List to sort ! * @throws ClassCastException if some items are not mutually comparable ! * @throws UnsupportedOperationException if the List is not modifiable ! * @throws NullPointerException if some element is null ! * @see Arrays#sort(Object[]) */ public static void sort(List l) { ! sort(l, null); } /** *************** public class Collections *** 724,1817 **** * the array. * * @param l the List to sort ! * @param c the Comparator specifying the ordering for the elements ! * @exception ClassCastException if c will not compare some pair of items ! * @exception UnsupportedOperationException if the List is not modifiable */ public static void sort(List l, Comparator c) { Object[] a = l.toArray(); Arrays.sort(a, c); ! ListIterator i = l.listIterator(); ! for (int pos = 0; pos < a.length; pos++) { ! i.next(); i.set(a[pos]); } } ! // All the methods from here on in require doc-comments. public static Collection synchronizedCollection(Collection c) { return new SynchronizedCollection(c); } - public static List synchronizedList(List l) - { - return new SynchronizedList(l); - } - public static Map synchronizedMap(Map m) - { - return new SynchronizedMap(m); - } - public static Set synchronizedSet(Set s) - { - return new SynchronizedSet(s); - } - public static SortedMap synchronizedSortedMap(SortedMap m) - { - return new SynchronizedSortedMap(m); - } - public static SortedSet synchronizedSortedSet(SortedSet s) - { - return new SynchronizedSortedSet(s); - } - public static Collection unmodifiableCollection(Collection c) - { - return new UnmodifiableCollection(c); - } - public static List unmodifiableList(List l) - { - return new UnmodifiableList(l); - } - public static Map unmodifiableMap(Map m) - { - return new UnmodifiableMap(m); - } - public static Set unmodifiableSet(Set s) - { - return new UnmodifiableSet(s); - } - public static SortedMap unmodifiableSortedMap(SortedMap m) - { - return new UnmodifiableSortedMap(m); - } - public static SortedSet unmodifiableSortedSet(SortedSet s) - { - return new UnmodifiableSortedSet(s); - } - - // Sun's spec will need to be checked for the precise names of these - // classes, for serializability's sake. However, from what I understand, - // serialization is broken for these classes anyway. - - // Note: although this code is largely uncommented, it is all very - // mechanical and there's nothing really worth commenting. - // When serialization of these classes works, we'll need doc-comments on - // them to document the serialized form. ! private static class UnmodifiableIterator implements Iterator { ! private Iterator i; ! ! public UnmodifiableIterator(Iterator i) ! { ! this.i = i; ! } ! ! public Object next() ! { ! return i.next(); ! } ! public boolean hasNext() ! { ! return i.hasNext(); ! } ! public void remove() ! { ! throw new UnsupportedOperationException(); ! } ! } ! private static class UnmodifiableListIterator extends UnmodifiableIterator ! implements ListIterator ! { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! private ListIterator li; ! public UnmodifiableListIterator(ListIterator li) ! { ! super(li); ! this.li = li; ! } ! public boolean hasPrevious() ! { ! return li.hasPrevious(); ! } ! public Object previous() ! { ! return li.previous(); ! } ! public int nextIndex() ! { ! return li.nextIndex(); ! } ! public int previousIndex() ! { ! return li.previousIndex(); ! } ! public void add(Object o) ! { ! throw new UnsupportedOperationException(); ! } ! public void set(Object o) { ! throw new UnsupportedOperationException(); } - } - - private static class UnmodifiableCollection implements Collection, - Serializable - { - Collection c; ! public UnmodifiableCollection(Collection c) { this.c = c; } public boolean add(Object o) { ! throw new UnsupportedOperationException(); } ! public boolean addAll(Collection c) { ! throw new UnsupportedOperationException(); } public void clear() { ! throw new UnsupportedOperationException(); } public boolean contains(Object o) { ! return c.contains(o); } public boolean containsAll(Collection c1) { ! return c.containsAll(c1); } public boolean isEmpty() { ! return c.isEmpty(); } public Iterator iterator() { ! return new UnmodifiableIterator(c.iterator()); } public boolean remove(Object o) { ! throw new UnsupportedOperationException(); } ! public boolean removeAll(Collection c) { ! throw new UnsupportedOperationException(); } ! public boolean retainAll(Collection c) { ! throw new UnsupportedOperationException(); } public int size() { ! return c.size(); } public Object[] toArray() { ! return c.toArray(); } ! public Object[] toArray(Object[]a) { ! return c.toArray(a); } public String toString() { ! return c.toString(); } } ! private static class UnmodifiableList extends UnmodifiableCollection implements List { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! List l; ! public UnmodifiableList(List l) { super(l); ! this.l = l; } public void add(int index, Object o) { ! throw new UnsupportedOperationException(); } public boolean addAll(int index, Collection c) { ! throw new UnsupportedOperationException(); } public boolean equals(Object o) { ! return l.equals(o); } public Object get(int index) { ! return l.get(index); } public int hashCode() { ! return l.hashCode(); } public int indexOf(Object o) { ! return l.indexOf(o); } public int lastIndexOf(Object o) { ! return l.lastIndexOf(o); } public ListIterator listIterator() { ! return new UnmodifiableListIterator(l.listIterator()); } public ListIterator listIterator(int index) { ! return new UnmodifiableListIterator(l.listIterator(index)); } public Object remove(int index) { ! throw new UnsupportedOperationException(); } public Object set(int index, Object o) { ! throw new UnsupportedOperationException(); } public List subList(int fromIndex, int toIndex) { ! return new UnmodifiableList(l.subList(fromIndex, toIndex)); } ! } ! private static class UnmodifiableSet extends UnmodifiableCollection ! implements Set { ! public UnmodifiableSet(Set s) { ! super(s); } ! public boolean equals(Object o) { ! return c.equals(o); } ! public int hashCode() { ! return c.hashCode(); } ! } ! private static class UnmodifiableSortedSet extends UnmodifiableSet ! implements SortedSet { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! private SortedSet ss; ! public UnmodifiableSortedSet(SortedSet ss) { ! super(ss); ! this.ss = ss; } ! public Comparator comparator() { ! return ss.comparator(); } ! public Object first() { ! return ss.first(); } ! public Object last() { ! return ss.last(); } ! public SortedSet headSet(Object toElement) { ! return new UnmodifiableSortedSet(ss.headSet(toElement)); } ! public SortedSet tailSet(Object fromElement) { ! return new UnmodifiableSortedSet(ss.tailSet(fromElement)); } ! public SortedSet subSet(Object fromElement, Object toElement) { ! return new UnmodifiableSortedSet(ss.subSet(fromElement, toElement)); } } ! private static class UnmodifiableMap implements Map, Serializable { ! Map m; ! public UnmodifiableMap(Map m) { this.m = m; } public void clear() { ! throw new UnsupportedOperationException(); } public boolean containsKey(Object key) { ! return m.containsKey(key); } public boolean containsValue(Object value) { ! return m.containsValue(value); } // This is one of the ickiest cases of nesting I've ever seen. It just ! // means "return an UnmodifiableSet, except that the iterator() method ! // returns an UnmodifiableIterator whos next() method returns an ! // unmodifiable wrapper around its normal return value". public Set entrySet() { ! return new UnmodifiableSet(m.entrySet()) { ! public Iterator iterator() ! { ! return new UnmodifiableIterator(c.iterator()) ! { ! public Object next() ! { ! final Map.Entry e = (Map.Entry) super.next(); ! return new Map.Entry() ! { ! public Object getKey() ! { ! return e.getKey(); ! } ! public Object getValue() ! { ! return e.getValue(); ! } ! public Object setValue(Object value) ! { ! throw new UnsupportedOperationException(); ! } ! public int hashCode() ! { ! return e.hashCode(); ! } ! public boolean equals(Object o) ! { ! return e.equals(o); ! } ! }; ! } ! }; ! } ! }; } public boolean equals(Object o) { ! return m.equals(o); } public Object get(Object key) { ! return m.get(key); ! } ! public Object put(Object key, Object value) ! { ! throw new UnsupportedOperationException(); } public int hashCode() { ! return m.hashCode(); } public boolean isEmpty() { ! return m.isEmpty(); } public Set keySet() { ! return new UnmodifiableSet(m.keySet()); } ! public void putAll(Map m) { ! throw new UnsupportedOperationException(); } public Object remove(Object o) { ! throw new UnsupportedOperationException(); } public int size() { ! return m.size(); } ! public Collection values() { ! return new UnmodifiableCollection(m.values()); } ! public String toString() { ! return m.toString(); } } ! private static class UnmodifiableSortedMap extends UnmodifiableMap ! implements SortedMap { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! private SortedMap sm; ! public UnmodifiableSortedMap(SortedMap sm) { ! super(sm); ! this.sm = sm; } ! public Comparator comparator() { ! return sm.comparator(); } ! public Object firstKey() { ! return sm.firstKey(); } ! public Object lastKey() { ! return sm.lastKey(); } ! public SortedMap headMap(Object toKey) { ! return new UnmodifiableSortedMap(sm.headMap(toKey)); } ! public SortedMap tailMap(Object fromKey) { ! return new UnmodifiableSortedMap(sm.tailMap(fromKey)); } ! public SortedMap subMap(Object fromKey, Object toKey) { ! return new UnmodifiableSortedMap(sm.subMap(fromKey, toKey)); } - } ! // All the "Synchronized" wrapper objects include a "sync" field which ! // specifies what object to synchronize on. That way, nested wrappers such as ! // UnmodifiableMap.keySet synchronize on the right things. ! ! private static class SynchronizedIterator implements Iterator ! { ! Object sync; ! private Iterator i; ! public SynchronizedIterator(Object sync, Iterator i) { ! this.sync = sync; ! this.i = i; } ! public Object next() { ! synchronized(sync) ! { ! return i.next(); ! } } ! public boolean hasNext() { ! synchronized(sync) ! { ! return i.hasNext(); ! } } ! public void remove() { ! synchronized(sync) ! { ! i.remove(); ! } } } ! private static class SynchronizedListIterator extends SynchronizedIterator ! implements ListIterator { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! private ListIterator li; ! public SynchronizedListIterator(Object sync, ListIterator li) { ! super(sync, li); ! this.li = li; } ! public boolean hasPrevious() { ! synchronized(sync) ! { ! return li.hasPrevious(); ! } } ! public Object previous() { ! synchronized(sync) ! { ! return li.previous(); ! } } ! public int nextIndex() { ! synchronized(sync) ! { ! return li.nextIndex(); ! } } ! public int previousIndex() { ! synchronized(sync) ! { ! return li.previousIndex(); ! } } ! public void add(Object o) { ! synchronized(sync) ! { ! li.add(o); ! } } ! public void set(Object o) { ! synchronized(sync) ! { ! li.set(o); ! } } } ! private static class SynchronizedCollection implements Collection, ! Serializable { ! Object sync; ! Collection c; ! public SynchronizedCollection(Collection c) ! { ! this.sync = this; ! this.c = c; ! } ! public SynchronizedCollection(Object sync, Collection c) { this.c = c; ! this.sync = sync; } public boolean add(Object o) { ! synchronized(sync) ! { ! return c.add(o); ! } } ! public boolean addAll(Collection col) { ! synchronized(sync) ! { ! return c.addAll(col); ! } } public void clear() { ! synchronized(sync) ! { ! c.clear(); ! } } public boolean contains(Object o) { ! synchronized(sync) ! { ! return c.contains(o); ! } } public boolean containsAll(Collection c1) { ! synchronized(sync) ! { ! return c.containsAll(c1); ! } } public boolean isEmpty() { ! synchronized(sync) ! { ! return c.isEmpty(); ! } } public Iterator iterator() { ! synchronized(sync) ! { ! return new SynchronizedIterator(sync, c.iterator()); ! } } public boolean remove(Object o) { ! synchronized(sync) ! { ! return c.remove(o); ! } } ! public boolean removeAll(Collection col) { ! synchronized(sync) ! { ! return c.removeAll(col); ! } } ! public boolean retainAll(Collection col) { ! synchronized(sync) ! { ! return c.retainAll(col); ! } } public int size() { ! synchronized(sync) ! { ! return c.size(); ! } } public Object[] toArray() { ! synchronized(sync) ! { ! return c.toArray(); ! } } ! public Object[] toArray(Object[]a) { ! synchronized(sync) ! { ! return c.toArray(a); ! } } public String toString() { ! synchronized(sync) ! { ! return c.toString(); ! } } ! } ! private static class SynchronizedList extends SynchronizedCollection ! implements List { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! List l; ! public SynchronizedList(Object sync, List l) { ! super(sync, l); ! this.l = l; } ! public SynchronizedList(List l) { super(l); ! this.l = l; } public void add(int index, Object o) { ! synchronized(sync) ! { ! l.add(index, o); ! } } public boolean addAll(int index, Collection c) { ! synchronized(sync) ! { ! return l.addAll(index, c); ! } } public boolean equals(Object o) { ! synchronized(sync) ! { ! return l.equals(o); ! } } public Object get(int index) { ! synchronized(sync) ! { ! return l.get(index); ! } } public int hashCode() { ! synchronized(sync) ! { ! return l.hashCode(); ! } } public int indexOf(Object o) { ! synchronized(sync) ! { ! return l.indexOf(o); ! } } public int lastIndexOf(Object o) { ! synchronized(sync) ! { ! return l.lastIndexOf(o); ! } } public ListIterator listIterator() { ! synchronized(sync) ! { ! return new SynchronizedListIterator(sync, l.listIterator()); ! } } public ListIterator listIterator(int index) { ! synchronized(sync) ! { ! return new SynchronizedListIterator(sync, l.listIterator(index)); ! } } public Object remove(int index) { ! synchronized(sync) ! { ! return l.remove(index); ! } ! } ! public boolean remove(Object o) ! { ! synchronized(sync) ! { ! return l.remove(o); ! } } public Object set(int index, Object o) { ! synchronized(sync) ! { ! return l.set(index, o); ! } } public List subList(int fromIndex, int toIndex) { ! synchronized(sync) ! { ! return new SynchronizedList(l.subList(fromIndex, toIndex)); ! } } ! } ! private static class SynchronizedSet extends SynchronizedCollection ! implements Set { ! public SynchronizedSet(Object sync, Set s) ! { ! super(sync, s); ! } ! public SynchronizedSet(Set s) ! { ! super(s); ! } ! public boolean equals(Object o) ! { ! synchronized(sync) ! { ! return c.equals(o); ! } ! } ! public int hashCode() { ! synchronized(sync) ! { ! return c.hashCode(); ! } } ! } ! private static class SynchronizedSortedSet extends SynchronizedSet ! implements SortedSet { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! private SortedSet ss; ! public SynchronizedSortedSet(Object sync, SortedSet ss) ! { ! super(sync, ss); ! this.ss = ss; ! } ! public SynchronizedSortedSet(SortedSet ss) { ! super(ss); ! this.ss = ss; } ! public Comparator comparator() { ! synchronized(sync) ! { ! return ss.comparator(); ! } } ! public Object first() { ! synchronized(sync) ! { ! return ss.first(); ! } } ! public Object last() { ! synchronized(sync) ! { ! return ss.last(); ! } } ! public SortedSet headSet(Object toElement) { ! synchronized(sync) ! { ! return new SynchronizedSortedSet(sync, ss.headSet(toElement)); ! } } ! public SortedSet tailSet(Object fromElement) { ! synchronized(sync) ! { ! return new SynchronizedSortedSet(sync, ss.tailSet(fromElement)); ! } } ! public SortedSet subSet(Object fromElement, Object toElement) { ! synchronized(sync) ! { ! return new SynchronizedSortedSet(sync, ! ss.subSet(fromElement, toElement)); ! } } } ! private static class SynchronizedMap implements Map, Serializable { ! Object sync; ! Map m; ! public SynchronizedMap(Object sync, Map m) ! { ! this.sync = sync; ! this.m = m; ! } ! public SynchronizedMap(Map m) { this.m = m; ! this.sync = this; } public void clear() { ! synchronized(sync) ! { ! m.clear(); ! } } public boolean containsKey(Object key) { ! synchronized(sync) ! { ! return m.containsKey(key); ! } } public boolean containsValue(Object value) { ! synchronized(sync) ! { ! return m.containsValue(value); ! } } - // This is one of the ickiest cases of nesting I've ever seen. It just - // means "return a SynchronizedSet, except that the iterator() method - // returns an SynchronizedIterator whos next() method returns a - // synchronized wrapper around its normal return value". public Set entrySet() { ! synchronized(sync) { ! return new SynchronizedSet(sync, m.entrySet()) { ! public Iterator iterator() ! { ! synchronized(SynchronizedMap.this.sync) { ! return new SynchronizedIterator(SynchronizedMap.this.sync, ! c.iterator()) ! { ! public Object next() ! { ! synchronized(SynchronizedMap.this.sync) ! { ! final Map.Entry e = (Map.Entry) super.next(); ! return new Map.Entry() ! { ! public Object getKey() ! { ! synchronized(SynchronizedMap.this.sync) ! { ! return e.getKey(); ! } ! } ! public Object getValue() ! { ! synchronized(SynchronizedMap.this.sync) ! { ! return e.getValue(); ! } ! } ! public Object setValue(Object value) ! { ! synchronized(SynchronizedMap.this.sync) ! { ! return e.setValue(value); ! } ! } ! public int hashCode() ! { ! synchronized(SynchronizedMap.this.sync) ! { ! return e.hashCode(); ! } ! } ! public boolean equals(Object o) ! { ! synchronized(SynchronizedMap.this.sync) ! { ! return e.equals(o); ! } ! } ! }; ! } ! } ! }; ! } ! } }; } ! } public boolean equals(Object o) { ! synchronized(sync) ! { ! return m.equals(o); ! } } public Object get(Object key) { ! synchronized(sync) ! { ! return m.get(key); ! } } public Object put(Object key, Object value) { ! synchronized(sync) ! { ! return m.put(key, value); ! } } public int hashCode() { ! synchronized(sync) ! { ! return m.hashCode(); ! } } public boolean isEmpty() { ! synchronized(sync) ! { ! return m.isEmpty(); ! } } public Set keySet() { ! synchronized(sync) ! { ! return new SynchronizedSet(sync, m.keySet()); ! } } ! public void putAll(Map map) { ! synchronized(sync) ! { ! m.putAll(map); ! } } public Object remove(Object o) { ! synchronized(sync) ! { ! return m.remove(o); ! } } public int size() { ! synchronized(sync) ! { ! return m.size(); ! } } ! public Collection values() { ! synchronized(sync) ! { ! return new SynchronizedCollection(sync, m.values()); ! } } ! public String toString() { ! synchronized(sync) ! { ! return m.toString(); ! } } } ! private static class SynchronizedSortedMap extends SynchronizedMap ! implements SortedMap { ! // This is stored both here and in the superclass, to avoid excessive ! // casting. ! private SortedMap sm; ! public SynchronizedSortedMap(Object sync, SortedMap sm) { ! super(sync, sm); ! this.sm = sm; } ! public SynchronizedSortedMap(SortedMap sm) { super(sm); this.sm = sm; --- 1463,3359 ---- * the array. * * @param l the List to sort ! * @param c the Comparator specifying the ordering for the elements, or ! * null for natural ordering ! * @throws ClassCastException if c will not compare some pair of items ! * @throws UnsupportedOperationException if the List is not modifiable ! * @throws NullPointerException if null is compared by natural ordering ! * (only possible when c is null) ! * @see Arrays#sort(Object[], Comparator) */ public static void sort(List l, Comparator c) { Object[] a = l.toArray(); Arrays.sort(a, c); ! ListIterator i = l.listIterator(a.length); ! for (int pos = a.length; --pos >= 0; ) { ! i.previous(); i.set(a[pos]); } } ! /** ! * Swaps the elements at the specified positions within the list. Equal ! * positions have no effect. ! * ! * @param l the list to work on ! * @param i the first index to swap ! * @param j the second index ! * @throws UnsupportedOperationException if list.set is not supported ! * @throws IndexOutOfBoundsException if either i or j is < 0 or >= ! * list.size() ! * @since 1.4 ! */ ! public static void swap(List l, int i, int j) ! { ! l.set(i, l.set(j, l.get(i))); ! } + /** + * Returns a synchronized (thread-safe) collection wrapper backed by the + * given collection. Notice that element access through the iterators + * is thread-safe, but if the collection can be structurally modified + * (adding or removing elements) then you should synchronize around the + * iteration to avoid non-deterministic behavior:
        + *

        +    * Collection c = Collections.synchronizedCollection(new Collection(...));
        +    * ...
        +    * synchronized (c)
        +    *   {
        +    *     Iterator i = c.iterator();
        +    *     while (i.hasNext())
        +    *       foo(i.next());
        +    *   }
        +    * 

        + * + * Since the collection might be a List or a Set, and those have incompatible + * equals and hashCode requirements, this relies on Object's implementation + * rather than passing those calls on to the wrapped collection. The returned + * Collection implements Serializable, but can only be serialized if + * the collection it wraps is likewise Serializable. + * + * @param c the collection to wrap + * @return a synchronized view of the collection + * @see Serializable + */ public static Collection synchronizedCollection(Collection c) { return new SynchronizedCollection(c); } ! /** ! * The implementation of {@link #synchronizedCollection(Collection)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * Package visible, so that collections such as the one for ! * Hashtable.values() can specify which object to synchronize on. ! * ! * @author Eric Blake ! */ ! static class SynchronizedCollection ! implements Collection, Serializable { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 3053995032091335093L; ! /** ! * The wrapped collection. Package visible for use by subclasses. ! * @serial the real collection ! */ ! final Collection c; ! /** ! * The object to synchronize on. When an instance is created via public ! * methods, it will be this; but other uses like SynchronizedMap.values() ! * must specify another mutex. Package visible for use by subclasses. ! * @serial the lock ! */ ! final Object mutex; ! /** ! * Wrap a given collection. ! * @param c the collection to wrap ! * @throws NullPointerException if c is null ! */ ! SynchronizedCollection(Collection c) { ! this.c = c; ! mutex = this; ! if (c == null) ! throw new NullPointerException(); } ! /** ! * Called only by trusted code to specify the mutex as well as the ! * collection. ! * @param sync the mutex ! * @param c the collection ! */ ! SynchronizedCollection(Object sync, Collection c) { this.c = c; + mutex = sync; } public boolean add(Object o) { ! synchronized (mutex) ! { ! return c.add(o); ! } } ! ! public boolean addAll(Collection col) { ! synchronized (mutex) ! { ! return c.addAll(col); ! } } + public void clear() { ! synchronized (mutex) ! { ! c.clear(); ! } } + public boolean contains(Object o) { ! synchronized (mutex) ! { ! return c.contains(o); ! } } + public boolean containsAll(Collection c1) { ! synchronized (mutex) ! { ! return c.containsAll(c1); ! } } + public boolean isEmpty() { ! synchronized (mutex) ! { ! return c.isEmpty(); ! } } + public Iterator iterator() { ! synchronized (mutex) ! { ! return new SynchronizedIterator(mutex, c.iterator()); ! } } + public boolean remove(Object o) { ! synchronized (mutex) ! { ! return c.remove(o); ! } } ! ! public boolean removeAll(Collection col) { ! synchronized (mutex) ! { ! return c.removeAll(col); ! } } ! ! public boolean retainAll(Collection col) { ! synchronized (mutex) ! { ! return c.retainAll(col); ! } } + public int size() { ! synchronized (mutex) ! { ! return c.size(); ! } } + public Object[] toArray() { ! synchronized (mutex) ! { ! return c.toArray(); ! } } ! ! public Object[] toArray(Object[] a) { ! synchronized (mutex) ! { ! return c.toArray(a); ! } } + public String toString() { ! synchronized (mutex) ! { ! return c.toString(); ! } ! } ! } // class SynchronizedCollection ! ! /** ! * The implementation of the various iterator methods in the ! * synchronized classes. These iterators must "sync" on the same object ! * as the collection they iterate over. ! * ! * @author Eric Blake ! */ ! private static class SynchronizedIterator implements Iterator ! { ! /** ! * The object to synchronize on. Package visible for use by subclass. ! */ ! final Object mutex; ! ! /** ! * The wrapped iterator. ! */ ! private final Iterator i; ! ! /** ! * Only trusted code creates a wrapper, with the specified sync. ! * @param sync the mutex ! * @param i the wrapped iterator ! */ ! SynchronizedIterator(Object sync, Iterator i) ! { ! this.i = i; ! mutex = sync; ! } ! ! public Object next() ! { ! synchronized (mutex) ! { ! return i.next(); ! } ! } ! ! public boolean hasNext() ! { ! synchronized (mutex) ! { ! return i.hasNext(); ! } ! } ! ! public void remove() ! { ! synchronized (mutex) ! { ! i.remove(); ! } } + } // class SynchronizedIterator + + /** + * Returns a synchronized (thread-safe) list wrapper backed by the + * given list. Notice that element access through the iterators + * is thread-safe, but if the list can be structurally modified + * (adding or removing elements) then you should synchronize around the + * iteration to avoid non-deterministic behavior:
        + *

        +    * List l = Collections.synchronizedList(new List(...));
        +    * ...
        +    * synchronized (l)
        +    *   {
        +    *     Iterator i = l.iterator();
        +    *     while (i.hasNext())
        +    *       foo(i.next());
        +    *   }
        +    * 

        + * + * The returned List implements Serializable, but can only be serialized if + * the list it wraps is likewise Serializable. In addition, if the wrapped + * list implements RandomAccess, this does too. + * + * @param l the list to wrap + * @return a synchronized view of the list + * @see Serializable + * @see RandomAccess + */ + public static List synchronizedList(List l) + { + if (l instanceof RandomAccess) + return new SynchronizedRandomAccessList(l); + return new SynchronizedList(l); } ! /** ! * The implementation of {@link #synchronizedList(List)} for sequential ! * lists. This class name is required for compatibility with Sun's JDK ! * serializability. Package visible, so that lists such as Vector.subList() ! * can specify which object to synchronize on. ! * ! * @author Eric Blake ! */ ! static class SynchronizedList extends SynchronizedCollection implements List { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -7754090372962971524L; ! /** ! * The wrapped list; stored both here and in the superclass to avoid ! * excessive casting. Package visible for use by subclass. ! * @serial the wrapped list ! */ ! final List list; ! ! /** ! * Wrap a given list. ! * @param l the list to wrap ! * @throws NullPointerException if l is null ! */ ! SynchronizedList(List l) { super(l); ! list = l; ! } ! ! /** ! * Called only by trusted code to specify the mutex as well as the list. ! * @param sync the mutex ! * @param l the list ! */ ! SynchronizedList(Object sync, List l) ! { ! super(sync, l); ! list = l; } public void add(int index, Object o) { ! synchronized (mutex) ! { ! list.add(index, o); ! } } + public boolean addAll(int index, Collection c) { ! synchronized (mutex) ! { ! return list.addAll(index, c); ! } } + public boolean equals(Object o) { ! synchronized (mutex) ! { ! return list.equals(o); ! } } + public Object get(int index) { ! synchronized (mutex) ! { ! return list.get(index); ! } } + public int hashCode() { ! synchronized (mutex) ! { ! return list.hashCode(); ! } } + public int indexOf(Object o) { ! synchronized (mutex) ! { ! return list.indexOf(o); ! } } + public int lastIndexOf(Object o) { ! synchronized (mutex) ! { ! return list.lastIndexOf(o); ! } } + public ListIterator listIterator() { ! synchronized (mutex) ! { ! return new SynchronizedListIterator(mutex, list.listIterator()); ! } } + public ListIterator listIterator(int index) { ! synchronized (mutex) ! { ! return new SynchronizedListIterator(mutex, list.listIterator(index)); ! } } + public Object remove(int index) { ! synchronized (mutex) ! { ! return list.remove(index); ! } } + public Object set(int index, Object o) { ! synchronized (mutex) ! { ! return list.set(index, o); ! } } + public List subList(int fromIndex, int toIndex) { ! synchronized (mutex) ! { ! return new SynchronizedList(mutex, list.subList(fromIndex, toIndex)); ! } } ! } // class SynchronizedList ! /** ! * The implementation of {@link #synchronizedList(List)} for random-access ! * lists. This class name is required for compatibility with Sun's JDK ! * serializability. ! * ! * @author Eric Blake ! */ ! private static final class SynchronizedRandomAccessList ! extends SynchronizedList implements RandomAccess { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 1530674583602358482L; ! ! /** ! * Wrap a given list. ! * @param l the list to wrap ! * @throws NullPointerException if l is null ! */ ! SynchronizedRandomAccessList(List l) { ! super(l); } ! ! /** ! * Called only by trusted code to specify the mutex as well as the ! * collection. ! * @param sync the mutex ! * @param l the list ! */ ! SynchronizedRandomAccessList(Object sync, List l) { ! super(sync, l); } ! ! public List subList(int fromIndex, int toIndex) { ! synchronized (mutex) ! { ! return new SynchronizedRandomAccessList(mutex, ! list.subList(fromIndex, ! toIndex)); ! } } ! } // class SynchronizedRandomAccessList ! /** ! * The implementation of {@link SynchronizedList#listIterator()}. This ! * iterator must "sync" on the same object as the list it iterates over. ! * ! * @author Eric Blake ! */ ! private static final class SynchronizedListIterator ! extends SynchronizedIterator implements ListIterator { ! /** ! * The wrapped iterator, stored both here and in the superclass to ! * avoid excessive casting. ! */ ! private final ListIterator li; ! /** ! * Only trusted code creates a wrapper, with the specified sync. ! * @param sync the mutex ! * @param li the wrapped iterator ! */ ! SynchronizedListIterator(Object sync, ListIterator li) { ! super(sync, li); ! this.li = li; } ! public void add(Object o) { ! synchronized (mutex) ! { ! li.add(o); ! } } ! public boolean hasPrevious() { ! synchronized (mutex) ! { ! return li.hasPrevious(); ! } } ! ! public int nextIndex() { ! synchronized (mutex) ! { ! return li.nextIndex(); ! } } ! ! public Object previous() { ! synchronized (mutex) ! { ! return li.previous(); ! } } ! ! public int previousIndex() { ! synchronized (mutex) ! { ! return li.previousIndex(); ! } } ! ! public void set(Object o) { ! synchronized (mutex) ! { ! li.set(o); ! } } + } // class SynchronizedListIterator + + /** + * Returns a synchronized (thread-safe) map wrapper backed by the given + * map. Notice that element access through the collection views and their + * iterators are thread-safe, but if the map can be structurally modified + * (adding or removing elements) then you should synchronize around the + * iteration to avoid non-deterministic behavior:
        + *

        +    * Map m = Collections.synchronizedMap(new Map(...));
        +    * ...
        +    * Set s = m.keySet(); // safe outside a synchronized block
        +    * synchronized (m) // synch on m, not s
        +    *   {
        +    *     Iterator i = s.iterator();
        +    *     while (i.hasNext())
        +    *       foo(i.next());
        +    *   }
        +    * 

        + * + * The returned Map implements Serializable, but can only be serialized if + * the map it wraps is likewise Serializable. + * + * @param m the map to wrap + * @return a synchronized view of the map + * @see Serializable + */ + public static Map synchronizedMap(Map m) + { + return new SynchronizedMap(m); } ! /** ! * The implementation of {@link #synchronizedMap(Map)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static class SynchronizedMap implements Map, Serializable { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 1978198479659022715L; ! /** ! * The wrapped map. ! * @serial the real map ! */ ! private final Map m; ! ! /** ! * The object to synchronize on. When an instance is created via public ! * methods, it will be this; but other uses like ! * SynchronizedSortedMap.subMap() must specify another mutex. Package ! * visible for use by subclass. ! * @serial the lock ! */ ! final Object mutex; ! ! /** ! * Cache the entry set. ! */ ! private transient Set entries; ! ! /** ! * Cache the key set. ! */ ! private transient Set keys; ! ! /** ! * Cache the value collection. ! */ ! private transient Collection values; ! ! /** ! * Wrap a given map. ! * @param m the map to wrap ! * @throws NullPointerException if m is null ! */ ! SynchronizedMap(Map m) { this.m = m; + mutex = this; + if (m == null) + throw new NullPointerException(); + } + + /** + * Called only by trusted code to specify the mutex as well as the map. + * @param sync the mutex + * @param m the map + */ + SynchronizedMap(Object sync, Map m) + { + this.m = m; + mutex = sync; } public void clear() { ! synchronized (mutex) ! { ! m.clear(); ! } } + public boolean containsKey(Object key) { ! synchronized (mutex) ! { ! return m.containsKey(key); ! } } + public boolean containsValue(Object value) { ! synchronized (mutex) ! { ! return m.containsValue(value); ! } } // This is one of the ickiest cases of nesting I've ever seen. It just ! // means "return a SynchronizedSet, except that the iterator() method ! // returns an SynchronizedIterator whose next() method returns a ! // synchronized wrapper around its normal return value". public Set entrySet() { ! // Define this here to spare some nesting. ! class SynchronizedMapEntry implements Map.Entry { ! final Map.Entry e; ! SynchronizedMapEntry(Object o) ! { ! e = (Map.Entry) o; ! } ! public boolean equals(Object o) ! { ! synchronized (mutex) ! { ! return e.equals(o); ! } ! } ! public Object getKey() ! { ! synchronized (mutex) ! { ! return e.getKey(); ! } ! } ! public Object getValue() ! { ! synchronized (mutex) ! { ! return e.getValue(); ! } ! } ! public int hashCode() ! { ! synchronized (mutex) ! { ! return e.hashCode(); ! } ! } ! public Object setValue(Object value) ! { ! synchronized (mutex) ! { ! return e.setValue(value); ! } ! } ! public String toString() ! { ! synchronized (mutex) ! { ! return e.toString(); ! } ! } ! } // class SynchronizedMapEntry ! ! // Now the actual code. ! if (entries == null) ! synchronized (mutex) ! { ! entries = new SynchronizedSet(mutex, m.entrySet()) ! { ! public Iterator iterator() ! { ! synchronized (super.mutex) ! { ! return new SynchronizedIterator(super.mutex, c.iterator()) ! { ! public Object next() ! { ! synchronized (super.mutex) ! { ! return new SynchronizedMapEntry(super.next()); ! } ! } ! }; ! } ! } ! }; ! } ! return entries; } + public boolean equals(Object o) { ! synchronized (mutex) ! { ! return m.equals(o); ! } } + public Object get(Object key) { ! synchronized (mutex) ! { ! return m.get(key); ! } } + public int hashCode() { ! synchronized (mutex) ! { ! return m.hashCode(); ! } } + public boolean isEmpty() { ! synchronized (mutex) ! { ! return m.isEmpty(); ! } } + public Set keySet() { ! if (keys == null) ! synchronized (mutex) ! { ! keys = new SynchronizedSet(mutex, m.keySet()); ! } ! return keys; } ! ! public Object put(Object key, Object value) { ! synchronized (mutex) ! { ! return m.put(key, value); ! } ! } ! ! public void putAll(Map map) ! { ! synchronized (mutex) ! { ! m.putAll(map); ! } } + public Object remove(Object o) { ! synchronized (mutex) ! { ! return m.remove(o); ! } } + public int size() { ! synchronized (mutex) ! { ! return m.size(); ! } } ! ! public String toString() { ! synchronized (mutex) ! { ! return m.toString(); ! } } ! ! public Collection values() { ! if (values == null) ! synchronized (mutex) ! { ! values = new SynchronizedCollection(mutex, m.values()); ! } ! return values; } + } // class SynchronizedMap + + /** + * Returns a synchronized (thread-safe) set wrapper backed by the given + * set. Notice that element access through the iterator is thread-safe, but + * if the set can be structurally modified (adding or removing elements) + * then you should synchronize around the iteration to avoid + * non-deterministic behavior:
        + *

        +    * Set s = Collections.synchronizedSet(new Set(...));
        +    * ...
        +    * synchronized (s)
        +    *   {
        +    *     Iterator i = s.iterator();
        +    *     while (i.hasNext())
        +    *       foo(i.next());
        +    *   }
        +    * 

        + * + * The returned Set implements Serializable, but can only be serialized if + * the set it wraps is likewise Serializable. + * + * @param s the set to wrap + * @return a synchronized view of the set + * @see Serializable + */ + public static Set synchronizedSet(Set s) + { + return new SynchronizedSet(s); } ! /** ! * The implementation of {@link #synchronizedSet(Set)}. This class ! * name is required for compatibility with Sun's JDK serializability. ! * Package visible, so that sets such as Hashtable.keySet() ! * can specify which object to synchronize on. ! * ! * @author Eric Blake ! */ ! static class SynchronizedSet extends SynchronizedCollection ! implements Set { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 487447009682186044L; ! /** ! * Wrap a given set. ! * @param s the set to wrap ! * @throws NullPointerException if s is null ! */ ! SynchronizedSet(Set s) { ! super(s); } ! /** ! * Called only by trusted code to specify the mutex as well as the set. ! * @param sync the mutex ! * @param s the set ! */ ! SynchronizedSet(Object sync, Set s) { ! super(sync, s); } ! ! public boolean equals(Object o) { ! synchronized (mutex) ! { ! return c.equals(o); ! } } ! ! public int hashCode() { ! synchronized (mutex) ! { ! return c.hashCode(); ! } } ! } // class SynchronizedSet ! ! /** ! * Returns a synchronized (thread-safe) sorted map wrapper backed by the ! * given map. Notice that element access through the collection views, ! * subviews, and their iterators are thread-safe, but if the map can be ! * structurally modified (adding or removing elements) then you should ! * synchronize around the iteration to avoid non-deterministic behavior:
        ! *

        !    * SortedMap m = Collections.synchronizedSortedMap(new SortedMap(...));
        !    * ...
        !    * Set s = m.keySet(); // safe outside a synchronized block
        !    * SortedMap m2 = m.headMap(foo); // safe outside a synchronized block
        !    * Set s2 = m2.keySet(); // safe outside a synchronized block
        !    * synchronized (m) // synch on m, not m2, s or s2
        !    *   {
        !    *     Iterator i = s.iterator();
        !    *     while (i.hasNext())
        !    *       foo(i.next());
        !    *     i = s2.iterator();
        !    *     while (i.hasNext())
        !    *       bar(i.next());
        !    *   }
        !    * 

        ! * ! * The returned SortedMap implements Serializable, but can only be ! * serialized if the map it wraps is likewise Serializable. ! * ! * @param m the sorted map to wrap ! * @return a synchronized view of the sorted map ! * @see Serializable ! */ ! public static SortedMap synchronizedSortedMap(SortedMap m) ! { ! return new SynchronizedSortedMap(m); ! } ! ! /** ! * The implementation of {@link #synchronizedSortedMap(SortedMap)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class SynchronizedSortedMap extends SynchronizedMap ! implements SortedMap ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -8798146769416483793L; ! ! /** ! * The wrapped map; stored both here and in the superclass to avoid ! * excessive casting. ! * @serial the wrapped map ! */ ! private final SortedMap sm; ! ! /** ! * Wrap a given map. ! * @param sm the map to wrap ! * @throws NullPointerException if sm is null ! */ ! SynchronizedSortedMap(SortedMap sm) { ! super(sm); ! this.sm = sm; } ! ! /** ! * Called only by trusted code to specify the mutex as well as the map. ! * @param sync the mutex ! * @param sm the map ! */ ! SynchronizedSortedMap(Object sync, SortedMap sm) { ! super(sync, sm); ! this.sm = sm; } ! ! public Comparator comparator() { ! synchronized (mutex) ! { ! return sm.comparator(); ! } } ! public Object firstKey() ! { ! synchronized (mutex) ! { ! return sm.firstKey(); ! } ! } ! public SortedMap headMap(Object toKey) { ! synchronized (mutex) ! { ! return new SynchronizedSortedMap(mutex, sm.headMap(toKey)); ! } } ! public Object lastKey() { ! synchronized (mutex) ! { ! return sm.lastKey(); ! } } ! ! public SortedMap subMap(Object fromKey, Object toKey) { ! synchronized (mutex) ! { ! return new SynchronizedSortedMap(mutex, sm.subMap(fromKey, toKey)); ! } } ! ! public SortedMap tailMap(Object fromKey) { ! synchronized (mutex) ! { ! return new SynchronizedSortedMap(mutex, sm.tailMap(fromKey)); ! } } + } // class SynchronizedSortedMap + + /** + * Returns a synchronized (thread-safe) sorted set wrapper backed by the + * given set. Notice that element access through the iterator and through + * subviews are thread-safe, but if the set can be structurally modified + * (adding or removing elements) then you should synchronize around the + * iteration to avoid non-deterministic behavior:
        + *

        +    * SortedSet s = Collections.synchronizedSortedSet(new SortedSet(...));
        +    * ...
        +    * SortedSet s2 = s.headSet(foo); // safe outside a synchronized block
        +    * synchronized (s) // synch on s, not s2
        +    *   {
        +    *     Iterator i = s2.iterator();
        +    *     while (i.hasNext())
        +    *       foo(i.next());
        +    *   }
        +    * 

        + * + * The returned SortedSet implements Serializable, but can only be + * serialized if the set it wraps is likewise Serializable. + * + * @param s the sorted set to wrap + * @return a synchronized view of the sorted set + * @see Serializable + */ + public static SortedSet synchronizedSortedSet(SortedSet s) + { + return new SynchronizedSortedSet(s); } ! /** ! * The implementation of {@link #synchronizedSortedSet(SortedSet)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class SynchronizedSortedSet extends SynchronizedSet ! implements SortedSet { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 8695801310862127406L; ! /** ! * The wrapped set; stored both here and in the superclass to avoid ! * excessive casting. ! * @serial the wrapped set ! */ ! private final SortedSet ss; ! ! /** ! * Wrap a given set. ! * @param ss the set to wrap ! * @throws NullPointerException if ss is null ! */ ! SynchronizedSortedSet(SortedSet ss) { ! super(ss); ! this.ss = ss; } ! /** ! * Called only by trusted code to specify the mutex as well as the set. ! * @param sync the mutex ! * @param l the list ! */ ! SynchronizedSortedSet(Object sync, SortedSet ss) { ! super(sync, ss); ! this.ss = ss; } ! ! public Comparator comparator() { ! synchronized (mutex) ! { ! return ss.comparator(); ! } } ! ! public Object first() { ! synchronized (mutex) ! { ! return ss.first(); ! } } ! ! public SortedSet headSet(Object toElement) { ! synchronized (mutex) ! { ! return new SynchronizedSortedSet(mutex, ss.headSet(toElement)); ! } } ! ! public Object last() { ! synchronized (mutex) ! { ! return ss.last(); ! } } ! ! public SortedSet subSet(Object fromElement, Object toElement) { ! synchronized (mutex) ! { ! return new SynchronizedSortedSet(mutex, ! ss.subSet(fromElement, toElement)); ! } ! } ! ! public SortedSet tailSet(Object fromElement) ! { ! synchronized (mutex) ! { ! return new SynchronizedSortedSet(mutex, ss.tailSet(fromElement)); ! } } + } // class SynchronizedSortedSet + + /** + * Returns an unmodifiable view of the given collection. This allows + * "read-only" access, although changes in the backing collection show up + * in this view. Attempts to modify the collection directly or via iterators + * will fail with {@link UnsupportedOperationException}. + *

        + * + * Since the collection might be a List or a Set, and those have incompatible + * equals and hashCode requirements, this relies on Object's implementation + * rather than passing those calls on to the wrapped collection. The returned + * Collection implements Serializable, but can only be serialized if + * the collection it wraps is likewise Serializable. + * + * @param c the collection to wrap + * @return a read-only view of the collection + * @see Serializable + */ + public static Collection unmodifiableCollection(Collection c) + { + return new UnmodifiableCollection(c); } ! /** ! * The implementation of {@link #unmodifiableCollection(Collection)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static class UnmodifiableCollection ! implements Collection, Serializable { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 1820017752578914078L; ! /** ! * The wrapped collection. Package visible for use by subclasses. ! * @serial the real collection ! */ ! final Collection c; ! ! /** ! * Wrap a given collection. ! * @param c the collection to wrap ! * @throws NullPointerException if c is null ! */ ! UnmodifiableCollection(Collection c) { this.c = c; ! if (c == null) ! throw new NullPointerException(); } public boolean add(Object o) { ! throw new UnsupportedOperationException(); } ! ! public boolean addAll(Collection c) { ! throw new UnsupportedOperationException(); } + public void clear() { ! throw new UnsupportedOperationException(); } + public boolean contains(Object o) { ! return c.contains(o); } + public boolean containsAll(Collection c1) { ! return c.containsAll(c1); } + public boolean isEmpty() { ! return c.isEmpty(); } + public Iterator iterator() { ! return new UnmodifiableIterator(c.iterator()); } + public boolean remove(Object o) { ! throw new UnsupportedOperationException(); } ! ! public boolean removeAll(Collection c) { ! throw new UnsupportedOperationException(); } ! ! public boolean retainAll(Collection c) { ! throw new UnsupportedOperationException(); } + public int size() { ! return c.size(); } + public Object[] toArray() { ! return c.toArray(); } ! ! public Object[] toArray(Object[] a) { ! return c.toArray(a); } + public String toString() { ! return c.toString(); } ! } // class UnmodifiableCollection ! /** ! * The implementation of the various iterator methods in the ! * unmodifiable classes. ! * ! * @author Eric Blake ! */ ! private static class UnmodifiableIterator implements Iterator { ! /** ! * The wrapped iterator. ! */ ! private final Iterator i; ! /** ! * Only trusted code creates a wrapper. ! * @param i the wrapped iterator ! */ ! UnmodifiableIterator(Iterator i) { ! this.i = i; } ! ! public Object next() ! { ! return i.next(); ! } ! ! public boolean hasNext() ! { ! return i.hasNext(); ! } ! ! public void remove() ! { ! throw new UnsupportedOperationException(); ! } ! } // class UnmodifiableIterator ! ! /** ! * Returns an unmodifiable view of the given list. This allows ! * "read-only" access, although changes in the backing list show up ! * in this view. Attempts to modify the list directly, via iterators, or ! * via sublists, will fail with {@link UnsupportedOperationException}. ! *

        ! * ! * The returned List implements Serializable, but can only be serialized if ! * the list it wraps is likewise Serializable. In addition, if the wrapped ! * list implements RandomAccess, this does too. ! * ! * @param l the list to wrap ! * @return a read-only view of the list ! * @see Serializable ! * @see RandomAccess ! */ ! public static List unmodifiableList(List l) ! { ! if (l instanceof RandomAccess) ! return new UnmodifiableRandomAccessList(l); ! return new UnmodifiableList(l); ! } ! ! /** ! * The implementation of {@link #unmodifiableList(List)} for sequential ! * lists. This class name is required for compatibility with Sun's JDK ! * serializability. ! * ! * @author Eric Blake ! */ ! private static class UnmodifiableList extends UnmodifiableCollection ! implements List ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -283967356065247728L; ! ! ! /** ! * The wrapped list; stored both here and in the superclass to avoid ! * excessive casting. Package visible for use by subclass. ! * @serial the wrapped list ! */ ! final List list; ! ! /** ! * Wrap a given list. ! * @param l the list to wrap ! * @throws NullPointerException if l is null ! */ ! UnmodifiableList(List l) { super(l); ! list = l; } public void add(int index, Object o) { ! throw new UnsupportedOperationException(); } + public boolean addAll(int index, Collection c) { ! throw new UnsupportedOperationException(); } + public boolean equals(Object o) { ! return list.equals(o); } + public Object get(int index) { ! return list.get(index); } + public int hashCode() { ! return list.hashCode(); } + public int indexOf(Object o) { ! return list.indexOf(o); } + public int lastIndexOf(Object o) { ! return list.lastIndexOf(o); } + public ListIterator listIterator() { ! return new UnmodifiableListIterator(list.listIterator()); } + public ListIterator listIterator(int index) { ! return new UnmodifiableListIterator(list.listIterator(index)); } + public Object remove(int index) { ! throw new UnsupportedOperationException(); } + public Object set(int index, Object o) { ! throw new UnsupportedOperationException(); } + public List subList(int fromIndex, int toIndex) { ! return unmodifiableList(list.subList(fromIndex, toIndex)); } ! } // class UnmodifiableList ! /** ! * The implementation of {@link #unmodifiableList(List)} for random-access ! * lists. This class name is required for compatibility with Sun's JDK ! * serializability. ! * ! * @author Eric Blake ! */ ! private static final class UnmodifiableRandomAccessList ! extends UnmodifiableList implements RandomAccess { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -2542308836966382001L; ! /** ! * Wrap a given list. ! * @param l the list to wrap ! * @throws NullPointerException if l is null ! */ ! UnmodifiableRandomAccessList(List l) { ! super(l); } ! } // class UnmodifiableRandomAccessList ! /** ! * The implementation of {@link UnmodifiableList#listIterator()}. ! * ! * @author Eric Blake ! */ ! private static final class UnmodifiableListIterator ! extends UnmodifiableIterator implements ListIterator { ! /** ! * The wrapped iterator, stored both here and in the superclass to ! * avoid excessive casting. ! */ ! private final ListIterator li; ! /** ! * Only trusted code creates a wrapper. ! * @param li the wrapped iterator ! */ ! UnmodifiableListIterator(ListIterator li) { ! super(li); ! this.li = li; } ! public void add(Object o) { ! throw new UnsupportedOperationException(); } ! ! public boolean hasPrevious() { ! return li.hasPrevious(); } ! ! public int nextIndex() { ! return li.nextIndex(); } ! ! public Object previous() { ! return li.previous(); } ! ! public int previousIndex() { ! return li.previousIndex(); } ! ! public void set(Object o) { ! throw new UnsupportedOperationException(); } + } // class UnmodifiableListIterator + + /** + * Returns an unmodifiable view of the given map. This allows "read-only" + * access, although changes in the backing map show up in this view. + * Attempts to modify the map directly, or via collection views or their + * iterators will fail with {@link UnsupportedOperationException}. + *

        + * + * The returned Map implements Serializable, but can only be serialized if + * the map it wraps is likewise Serializable. + * + * @param m the map to wrap + * @return a read-only view of the map + * @see Serializable + */ + public static Map unmodifiableMap(Map m) + { + return new UnmodifiableMap(m); } ! /** ! * The implementation of {@link #unmodifiableMap(Map)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static class UnmodifiableMap implements Map, Serializable { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -1034234728574286014L; ! /** ! * The wrapped map. ! * @serial the real map ! */ ! private final Map m; ! ! /** ! * Cache the entry set. ! */ ! private transient Set entries; ! ! /** ! * Cache the key set. ! */ ! private transient Set keys; ! ! /** ! * Cache the value collection. ! */ ! private transient Collection values; ! ! /** ! * Wrap a given map. ! * @param m the map to wrap ! * @throws NullPointerException if m is null ! */ ! UnmodifiableMap(Map m) { this.m = m; ! if (m == null) ! throw new NullPointerException(); } public void clear() { ! throw new UnsupportedOperationException(); } + public boolean containsKey(Object key) { ! return m.containsKey(key); } + public boolean containsValue(Object value) { ! return m.containsValue(value); } public Set entrySet() { ! if (entries == null) ! entries = new UnmodifiableEntrySet(m.entrySet()); ! return entries; ! } ! ! /** ! * The implementation of {@link UnmodifiableMap#entrySet()}. This class ! * name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static final class UnmodifiableEntrySet extends UnmodifiableSet ! implements Serializable ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = 7854390611657943733L; ! ! /** ! * Wrap a given set. ! * @param s the set to wrap ! */ ! UnmodifiableEntrySet(Set s) { ! super(s); ! } ! ! // The iterator must return unmodifiable map entries. ! public Iterator iterator() ! { ! return new UnmodifiableIterator(c.iterator()) { ! public Object next() ! { ! final Map.Entry e = (Map.Entry) super.next(); ! return new Map.Entry() { ! public boolean equals(Object o) ! { ! return e.equals(o); ! } ! public Object getKey() ! { ! return e.getKey(); ! } ! public Object getValue() ! { ! return e.getValue(); ! } ! public int hashCode() ! { ! return e.hashCode(); ! } ! public Object setValue(Object value) ! { ! throw new UnsupportedOperationException(); ! } ! public String toString() ! { ! return e.toString(); ! } ! }; ! } }; } ! } // class UnmodifiableEntrySet ! public boolean equals(Object o) { ! return m.equals(o); } + public Object get(Object key) { ! return m.get(key); } + public Object put(Object key, Object value) { ! throw new UnsupportedOperationException(); } + public int hashCode() { ! return m.hashCode(); } + public boolean isEmpty() { ! return m.isEmpty(); } + public Set keySet() { ! if (keys == null) ! keys = new UnmodifiableSet(m.keySet()); ! return keys; } ! ! public void putAll(Map m) { ! throw new UnsupportedOperationException(); } + public Object remove(Object o) { ! throw new UnsupportedOperationException(); } public int size() { ! return m.size(); } ! ! public String toString() { ! return m.toString(); } ! ! public Collection values() { ! if (values == null) ! values = new UnmodifiableCollection(m.values()); ! return values; } + } // class UnmodifiableMap + + /** + * Returns an unmodifiable view of the given set. This allows + * "read-only" access, although changes in the backing set show up + * in this view. Attempts to modify the set directly or via iterators + * will fail with {@link UnsupportedOperationException}. + *

        + * + * The returned Set implements Serializable, but can only be serialized if + * the set it wraps is likewise Serializable. + * + * @param s the set to wrap + * @return a read-only view of the set + * @see Serializable + */ + public static Set unmodifiableSet(Set s) + { + return new UnmodifiableSet(s); } ! /** ! * The implementation of {@link #unmodifiableSet(Set)}. This class ! * name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static class UnmodifiableSet extends UnmodifiableCollection ! implements Set { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -9215047833775013803L; ! /** ! * Wrap a given set. ! * @param s the set to wrap ! * @throws NullPointerException if s is null ! */ ! UnmodifiableSet(Set s) { ! super(s); } ! ! public boolean equals(Object o) ! { ! return c.equals(o); ! } ! ! public int hashCode() ! { ! return c.hashCode(); ! } ! } // class UnmodifiableSet ! ! /** ! * Returns an unmodifiable view of the given sorted map. This allows ! * "read-only" access, although changes in the backing map show up in this ! * view. Attempts to modify the map directly, via subviews, via collection ! * views, or iterators, will fail with {@link UnsupportedOperationException}. ! *

        ! * ! * The returned SortedMap implements Serializable, but can only be ! * serialized if the map it wraps is likewise Serializable. ! * ! * @param m the map to wrap ! * @return a read-only view of the map ! * @see Serializable ! */ ! public static SortedMap unmodifiableSortedMap(SortedMap m) ! { ! return new UnmodifiableSortedMap(m); ! } ! ! /** ! * The implementation of {@link #unmodifiableSortedMap(SortedMap)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static class UnmodifiableSortedMap extends UnmodifiableMap ! implements SortedMap ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -8806743815996713206L; ! ! /** ! * The wrapped map; stored both here and in the superclass to avoid ! * excessive casting. ! * @serial the wrapped map ! */ ! private final SortedMap sm; ! ! /** ! * Wrap a given map. ! * @param sm the map to wrap ! * @throws NullPointerException if sm is null ! */ ! UnmodifiableSortedMap(SortedMap sm) { super(sm); this.sm = sm; *************** public class Collections *** 1819,1854 **** public Comparator comparator() { ! synchronized(sync) ! { ! return sm.comparator(); ! } } public Object firstKey() { ! synchronized(sync) ! { ! return sm.firstKey(); ! } } public Object lastKey() { ! synchronized(sync) ! { ! return sm.lastKey(); ! } } ! public SortedMap headMap(Object toKey) { ! return new SynchronizedSortedMap(sync, sm.headMap(toKey)); } public SortedMap tailMap(Object fromKey) { ! return new SynchronizedSortedMap(sync, sm.tailMap(fromKey)); } ! public SortedMap subMap(Object fromKey, Object toKey) { ! return new SynchronizedSortedMap(sync, sm.subMap(fromKey, toKey)); } ! } ! } --- 3361,3474 ---- public Comparator comparator() { ! return sm.comparator(); } + public Object firstKey() { ! return sm.firstKey(); } + + public SortedMap headMap(Object toKey) + { + return new UnmodifiableSortedMap(sm.headMap(toKey)); + } + public Object lastKey() { ! return sm.lastKey(); } ! ! public SortedMap subMap(Object fromKey, Object toKey) { ! return new UnmodifiableSortedMap(sm.subMap(fromKey, toKey)); } + public SortedMap tailMap(Object fromKey) { ! return new UnmodifiableSortedMap(sm.tailMap(fromKey)); } ! } // class UnmodifiableSortedMap ! ! /** ! * Returns an unmodifiable view of the given sorted set. This allows ! * "read-only" access, although changes in the backing set show up ! * in this view. Attempts to modify the set directly, via subsets, or via ! * iterators, will fail with {@link UnsupportedOperationException}. ! *

        ! * ! * The returns SortedSet implements Serializable, but can only be ! * serialized if the set it wraps is likewise Serializable. ! * ! * @param s the set to wrap ! * @return a read-only view of the set ! * @see Serializable ! */ ! public static SortedSet unmodifiableSortedSet(SortedSet s) ! { ! return new UnmodifiableSortedSet(s); ! } ! ! /** ! * The implementation of {@link #synchronizedSortedMap(SortedMap)}. This ! * class name is required for compatibility with Sun's JDK serializability. ! * ! * @author Eric Blake ! */ ! private static class UnmodifiableSortedSet extends UnmodifiableSet ! implements SortedSet ! { ! /** ! * Compatible with JDK 1.4. ! */ ! private static final long serialVersionUID = -4929149591599911165L; ! ! /** ! * The wrapped set; stored both here and in the superclass to avoid ! * excessive casting. ! * @serial the wrapped set ! */ ! private SortedSet ss; ! ! /** ! * Wrap a given set. ! * @param ss the set to wrap ! * @throws NullPointerException if ss is null ! */ ! UnmodifiableSortedSet(SortedSet ss) { ! super(ss); ! this.ss = ss; } ! ! public Comparator comparator() ! { ! return ss.comparator(); ! } ! ! public Object first() ! { ! return ss.first(); ! } ! ! public SortedSet headSet(Object toElement) ! { ! return new UnmodifiableSortedSet(ss.headSet(toElement)); ! } ! ! public Object last() ! { ! return ss.last(); ! } ! ! public SortedSet subSet(Object fromElement, Object toElement) ! { ! return new UnmodifiableSortedSet(ss.subSet(fromElement, toElement)); ! } ! ! public SortedSet tailSet(Object fromElement) ! { ! return new UnmodifiableSortedSet(ss.tailSet(fromElement)); ! } ! } // class UnmodifiableSortedSet ! } // class Collections diff -Nrc3pad gcc-3.0.4/libjava/java/util/Comparator.java gcc-3.1/libjava/java/util/Comparator.java *** gcc-3.0.4/libjava/java/util/Comparator.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/Comparator.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* Comparator.java -- Interface for objects that specify an ordering ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Comparator.java -- Interface for objects that specify an ordering ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,64 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; /** * Interface for objects that specify an ordering between objects. The ordering ! * can be total, such that two objects only compare equal if they are ! * equal by the equals method, or partial such that this is not ! * necessarily true. For example, a case-sensitive dictionary order comparison ! * of Strings is total, but if it is case-insensitive it is partial, because ! * "abc" and "ABC" compare as equal even though "abc".equals("ABC") returns ! * false. *

        * In general, Comparators should be Serializable, because when they are passed * to Serializable data structures such as SortedMap or SortedSet, the entire * data structure will only serialize correctly if the comparator is * Serializable. */ public interface Comparator { /** * Return an integer that is negative, zero or positive depending on whether * the first argument is less than, equal to or greater than the second ! * according to this ordering. This method should obey the following contract: ! *

          ! *
        • if compare(a, b) < 0 then compare(b, a) > 0
        • ! *
        • if compare(a, b) throws an exception, so does compare(b, a)
        • ! *
        • if compare(a, b) < 0 and compare(b, c) < 0 then compare(a, c) ! * < 0
        • ! *
        • if a.equals(b) or both a and b are null, then compare(a, b) == 0. ! * The converse need not be true, but if it is, this Comparator ! * specifies a total ordering.
        • ! *
        * * @throws ClassCastException if the elements are not of types that can be ! * compared by this ordering. */ int compare(Object o1, Object o2); } --- 18,119 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /** * Interface for objects that specify an ordering between objects. The ordering ! * should be total, such that any two objects of the correct type ! * can be compared, and the comparison is reflexive, anti-symmetric, and ! * transitive. It is also recommended that the comparator be consistent ! * with equals, although this is not a strict requirement. A relation ! * is consistent with equals if these two statements always have the same ! * results (if no exceptions occur):
        ! * compare((Object) e1, (Object) e2) == 0 and ! * e1.equals((Object) e2)
        ! * Comparators that violate consistency with equals may cause strange behavior ! * in sorted lists and sets. For example, a case-sensitive dictionary order ! * comparison of Strings is consistent with equals, but if it is ! * case-insensitive it is not, because "abc" and "ABC" compare as equal even ! * though "abc".equals("ABC") returns false. *

        * In general, Comparators should be Serializable, because when they are passed * to Serializable data structures such as SortedMap or SortedSet, the entire * data structure will only serialize correctly if the comparator is * Serializable. + * + * @author Original author unknown + * @author Eric Blake + * @see Comparable + * @see TreeMap + * @see TreeSet + * @see SortedMap + * @see SortedSet + * @see Arrays#sort(Object[], Comparator) + * @see java.io.Serializable + * @since 1.2 + * @status updated to 1.4 */ public interface Comparator { /** * Return an integer that is negative, zero or positive depending on whether * the first argument is less than, equal to or greater than the second ! * according to this ordering. This method should obey the following ! * contract: ! *

          ! *
        • if compare(a, b) < 0 then compare(b, a) > 0
        • ! *
        • if compare(a, b) throws an exception, so does compare(b, a)
        • ! *
        • if compare(a, b) < 0 and compare(b, c) < 0 then compare(a, c) ! * < 0
        • ! *
        • if compare(a, b) == 0 then compare(a, c) and compare(b, c) must ! * have the same sign
        • ! * To be consistent with equals, the following additional constraint is ! * in place: ! *
            ! *
          • if a.equals(b) or both a and b are null, then ! * compare(a, b) == 0.
          • ! *

          ! * ! * Although it is permissible for a comparator to provide an order ! * inconsistent with equals, that should be documented. * + * @param o1 the first object + * @param o2 the second object + * @return the comparison * @throws ClassCastException if the elements are not of types that can be ! * compared by this ordering. */ int compare(Object o1, Object o2); + + /** + * Return true if the object is equal to this object. To be + * considered equal, the argument object must satisfy the constraints + * of Object.equals(), be a Comparator, and impose the + * same ordering as this Comparator. The default implementation + * inherited from Object is usually adequate. + * + * @param obj The object + * @return true if it is a Comparator that imposes the same order + * @see Object#equals(Object) + */ + boolean equals(Object obj); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/ConcurrentModificationException.java gcc-3.1/libjava/java/util/ConcurrentModificationException.java *** gcc-3.0.4/libjava/java/util/ConcurrentModificationException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/ConcurrentModificationException.java Tue Jan 22 22:40:38 2002 *************** *** 1,33 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation - This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.util; ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct. */ ! ! /* Added in JDK 1.2 */ public class ConcurrentModificationException extends RuntimeException { public ConcurrentModificationException() { - super(); } ! public ConcurrentModificationException(String msg) { ! super(msg); } } --- 1,92 ---- ! /* ConcurrentModificationException.java -- Data structure concurrently modified ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. */ ! ! /** ! * Exception that is thrown by the collections classes when it is detected that ! * a modification has been made to a data structure when this is not allowed, ! * such as when a collection is structurally modified while an Iterator is ! * operating over it. In cases where this can be detected, a ! * ConcurrentModificationException will be thrown. An Iterator that detects ! * this condition is referred to as fail-fast. Notice that this can occur ! * even in single-threaded designs, if you call methods out of order. ! * ! * @author Warren Levy ! * @author Eric Blake ! * @see Collection ! * @see Iterator ! * @see ListIterator ! * @see Vector ! * @see LinkedList ! * @see HashSet ! * @see Hashtable ! * @see TreeMap ! * @see AbstractList ! * @since 1.2 ! * @status updated to 1.4 ! */ public class ConcurrentModificationException extends RuntimeException { + /** + * Compatible with JDK 1.2. + */ + private static final long serialVersionUID = -3666751008965953603L; + + /** + * Constructs a ConcurrentModificationException with no detail message. + */ public ConcurrentModificationException() { } ! /** ! * Constructs a ConcurrentModificationException with a detail message. ! * ! * @param detail the detail message for the exception ! */ ! public ConcurrentModificationException(String detail) { ! super(detail); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Date.java gcc-3.1/libjava/java/util/Date.java *** gcc-3.0.4/libjava/java/util/Date.java Tue Jan 9 07:07:51 2001 --- gcc-3.1/libjava/java/util/Date.java Tue Jan 22 22:40:38 2002 *************** *** 1,52 **** ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; - import java.text.*; /** * @author Per Bothner - * @date October 24, 1998. */ ! ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3, ! * "The Java Language Specification", ISBN 0-201-63451-1, ! * and O'Reilly's "Java in a Nutshell". ! * Status: Need to re-write toString(). ! * Missing: ToGMTString. ! */ ! public class Date implements java.io.Serializable, Cloneable { private static final long serialVersionUID = 7523967970034938905L; ! transient private long millis; ! public Date() { millis = System.currentTimeMillis(); } ! public Date(long millis) { this.millis = millis; } ! public Date(int year, int month, int date, int hours, ! int minutes, int seconds) { ! setTime(year, month, date, hours, minutes, seconds); } ! public Date(int year, int month, int date, int hours, int minutes) { ! setTime(year, month, date, hours, minutes, 0); } ! public Date(int year, int month, int date) { ! setTime(year, month, date, 0, 0, 0); } ! public Date (String s) { this(parse(s)); } private static int skipParens(String string, int offset) { --- 1,308 ---- ! /* java.util.Date ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /** + * This class represents a specific time in milliseconds since the epoch. + * The epoch is 1970, January 1 00:00:00.0000 UTC. + * + * Date is intended to reflect universal time coordinate (UTC), but doesn't + * handle the leap seconds. + * + * Prior to jdk 1.1 this class was the sole Time class and had also + * calendar functionality. But this can't be localized, so a new Calendar + * class was created, that you should use instead. The functions which + * get or return a year, month, day etc. are all deprecated and shouldn't be + * used. Use Calendar instead. + * + * @see Calendar + * @see GregorianCalendar + * @see java.text.DateFormat + * @author Jochen Hoenicke * @author Per Bothner */ ! public class Date implements Cloneable, Comparable, java.io.Serializable { + /** + * This is the serialization UID for this class + */ private static final long serialVersionUID = 7523967970034938905L; ! /** ! * The time in milliseconds since the epoch. ! */ ! private transient long time; ! /** ! * Creates a new Date Object representing the current time. ! */ ! public Date() ! { ! time = System.currentTimeMillis(); ! } ! /** ! * Creates a new Date Object representing the given time. ! * @param time the time in milliseconds since the epoch. ! */ ! public Date(long time) ! { ! this.time = time; ! } ! /** ! * Creates a new Date Object representing the given time. ! * @deprecated use new GregorianCalendar(year+1900, month, ! * day) instead. ! */ ! public Date(int year, int month, int day) { ! time = new GregorianCalendar(year + 1900, month, day).getTimeInMillis(); } ! /** ! * Creates a new Date Object representing the given time. ! * @deprecated use new GregorianCalendar(year+1900, month, ! * day, hour, min) instead. ! */ ! public Date(int year, int month, int day, int hour, int min) { ! time = ! new GregorianCalendar(year + 1900, month, day, hour, ! min).getTimeInMillis(); } ! /* ! * Creates a new Date Object representing the given time. ! * @deprecated use new GregorianCalendar(year+1900, month, ! * day) instead. ! */ ! public Date(int year, int month, int day, int hour, int min, int sec) { ! time = ! new GregorianCalendar(year + 1900, month, day, hour, min, ! sec).getTimeInMillis(); } ! /** ! * Creates a new Date from the given string representation. This ! * does the same as new Date(Date.parse(s)) ! * @see #parse ! * @deprecated use java.text.DateFormat.parse(s) instead. ! */ ! public Date(String s) ! { ! time = parse(s); ! } ! ! public Object clone() ! { ! try ! { ! return super.clone(); ! } ! catch (CloneNotSupportedException ex) ! { ! return null; ! } ! } ! ! /** ! * @deprecated Use Calendar with a UTC TimeZone instead. ! * @return the time in millis since the epoch. ! */ ! public static long UTC(int year, int month, int date, ! int hrs, int min, int sec) ! { ! GregorianCalendar cal = ! new GregorianCalendar(year + 1900, month, date, hrs, min, sec); ! cal.set(Calendar.ZONE_OFFSET, 0); ! cal.set(Calendar.DST_OFFSET, 0); ! return cal.getTimeInMillis(); ! } ! ! /** ! * Gets the time represented by this Object ! * @return the time in milliseconds since the epoch. ! */ ! public long getTime() ! { ! return time; ! } ! ! /** ! * @deprecated use ! * Calendar.get(Calendar.ZONE_OFFSET)+Calendar.get(Calendar.DST_OFFSET) ! * instead. ! * @return The time zone offset in minutes of the local time zone ! * relative to UTC. The time represented by this object is used to ! * determine if we should use daylight savings. ! */ ! public int getTimezoneOffset() ! { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! return (cal.get(Calendar.ZONE_OFFSET) ! + cal.get(Calendar.DST_OFFSET)) / (60 * 1000); ! } ! ! /** ! * Sets the time which this Object should represented. ! * @param time the time in milliseconds since the epoch. */ ! public void setTime(long time) ! { ! this.time = time; ! } ! ! /** ! * Tests if this date is after the specified date. ! * @param when the other date ! * @return true, if the date represented by this Object is ! * strictly later than the time represented by when. ! */ ! public boolean after(Date when) ! { ! return time > when.time; ! } ! ! /** ! * Tests if this date is before the specified date. ! * @param when the other date ! * @return true, if the date represented by when is strictly later ! * than the time represented by this object. ! */ ! public boolean before(Date when) ! { ! return time < when.time; ! } ! ! /** ! * Compares two dates for equality. ! * @param obj the object to compare. ! * @return true, if obj is a Date object and the date represented ! * by obj is exactly the same as the time represented by this ! * object. ! */ ! public boolean equals(Object obj) ! { ! return (obj instanceof Date && time == ((Date) obj).time); ! } ! ! /** ! * Compares two dates. ! * @param when the other date. ! * @return 0, if the date represented ! * by obj is exactly the same as the time represented by this ! * object, a negative if this Date is before the other Date, and ! * a positive value otherwise. ! */ ! public int compareTo(Date when) ! { ! return (time < when.time) ? -1 : (time == when.time) ? 0 : 1; ! } ! ! /** ! * Compares this Date to another. This behaves like ! * compareTo(Date), but it may throw a ! * ClassCastException ! * @param obj the other date. ! * @return 0, if the date represented ! * by obj is exactly the same as the time represented by this ! * object, a negative if this Date is before the other Date, and ! * a positive value otherwise. ! * @exception ClassCastException if obj is not of type Date. ! */ ! public int compareTo(Object obj) ! { ! return compareTo((Date) obj); ! } ! ! public int hashCode() ! { ! return (int) time ^ (int) (time >>> 32); ! } ! ! private static final String[] weekNames = { "Sun", "Mon", "Tue", "Wed", ! "Thu", "Fri", "Sat" }; ! ! private static final String[] monthNames = { "Jan", "Feb", "Mar", "Apr", ! "May", "Jun", "Jul", "Aug", ! "Sep", "Oct", "Nov", "Dec" }; ! ! public String toString() ! { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! String day = "0" + cal.get(Calendar.DATE); ! String hour = "0" + cal.get(Calendar.HOUR_OF_DAY); ! String min = "0" + cal.get(Calendar.MINUTE); ! String sec = "0" + cal.get(Calendar.SECOND); ! String year = "000" + cal.get(Calendar.YEAR); ! return weekNames[cal.get(Calendar.DAY_OF_WEEK) - 1] + " " ! + monthNames[cal.get(Calendar.MONTH)] + " " ! + day.substring(day.length() - 2) + " " ! + hour.substring(hour.length() - 2) + ":" ! + min.substring(min.length() - 2) + ":" ! + sec.substring(sec.length() - 2) + " " ! + ! cal.getTimeZone().getDisplayName(cal.getTimeZone().inDaylightTime(this), ! TimeZone.SHORT) + " " + ! year.substring(year.length() - 4); ! } ! ! /** Format this object in a locale-specific way. ! * @deprecated Use DateFormat.format(Date) ! */ ! public String toLocaleString() ! { ! return java.text.DateFormat.getInstance().format(this); ! } ! ! /** Format this object in a standard format in the GMT timezone. ! * @deprecated Use DateFormat.format(Date) with a GMT TimeZone. ! */ ! public String toGMTString() ! { ! java.text.DateFormat format = java.text.DateFormat.getInstance(); ! format.setTimeZone(TimeZone.getTimeZone("GMT")); ! return format.format(this); ! } private static int skipParens(String string, int offset) { *************** public class Date implements java.io.Ser *** 134,139 **** --- 390,399 ---- return false; } + /** Parse a String and return the time it represents. + * @param s The String to parse. + * @deprecated Use DateFormat.parse(String) + */ public static long parse(String string) { // Initialize date/time fields before parsing begins. *************** public class Date implements java.io.Ser *** 331,494 **** -timezone * 60 * 1000); } ! public boolean after (Date when) { return this.millis > when.millis; } ! public boolean before (Date when) { return this.millis < when.millis; } ! ! public boolean equals(Object obj) ! { ! return (obj != null && obj instanceof Date ! && ((Date)obj).millis == this.millis); ! } ! ! public long getTime() { return millis; } ! ! public int hashCode() ! { ! return (int)(millis^(millis>>>32)); ! } ! ! private void setTime(int year, int month, int date, ! int hours, int minutes, int seconds) ! { ! Calendar cal = new GregorianCalendar(year+1900, month, date, ! hours, minutes, seconds); ! millis = cal.getTimeInMillis(); ! } ! ! public void setTime(long millis) { this.millis = millis; } ! ! private int getField (int fld) ! { ! Calendar cal = new GregorianCalendar(); ! cal.setTime(this); ! return cal.get(fld); ! } ! ! public int getYear () ! { ! return getField(Calendar.YEAR) - 1900; ! } ! ! public int getMonth () ! { ! return getField(Calendar.MONTH); ! } ! ! public int getDate () ! { ! return getField(Calendar.DATE); ! } ! ! public int getDay () ! { ! return getField(Calendar.DAY_OF_WEEK) - 1; ! } ! ! public int getHours () ! { ! return getField(Calendar.HOUR_OF_DAY); ! } ! ! public int getMinutes () ! { ! return getField(Calendar.MINUTE); ! } ! ! public int getSeconds () { ! return getField(Calendar.SECOND); } ! private void setField (int fld, int value) { ! Calendar cal = new GregorianCalendar(); ! cal.setTime(this); ! cal.set(fld, value); ! millis = cal.getTimeInMillis(); } ! public void setYear (int year) { ! setField(Calendar.YEAR, 1900 + year); } ! public void setMonth (int month) { ! setField(Calendar.MONTH, month); } ! public void setDate (int date) { ! setField(Calendar.DATE, date); } ! public void setHours (int hours) { ! setField(Calendar.HOUR_OF_DAY, hours); } ! public void setMinutes (int minutes) { ! setField(Calendar.MINUTE, minutes); } ! public void setSeconds (int seconds) { ! setField(Calendar.SECOND, seconds); } ! public int getTimezoneOffset () { ! Calendar cal = new GregorianCalendar(); ! cal.setTime(this); ! return - (cal.get(Calendar.ZONE_OFFSET) ! + cal.get(Calendar.DST_OFFSET)/(60*1000)); } ! public String toString () { ! // This is slow, but does it matter? There is no particularly ! // fast way to do it, because we need the timezone offset, which ! // we don't store. Unix ctime() doesn't provide this information. ! SimpleDateFormat fmt = new SimpleDateFormat ("E MMM dd HH:mm:ss z yyyy", ! Locale.US); ! fmt.setTimeZone(TimeZone.getDefault()); ! return fmt.format(this); } ! public String toGMTString () { ! // This method is deprecated. We don't care if it is very slow. ! SimpleDateFormat fmt = new SimpleDateFormat ("d MMM yyyy HH:mm:ss 'GMT'", ! Locale.US); ! fmt.setTimeZone(TimeZone.getTimeZone("GMT")); ! return fmt.format(this); } ! public String toLocaleString () { ! // This method is deprecated. We don't care if it is very slow. ! DateFormat fmt = DateFormat.getDateTimeInstance(); ! fmt.setTimeZone(TimeZone.getDefault()); ! return fmt.format(this); } ! public static long UTC (int year, int month, int date, ! int hours, int minutes, int seconds) { ! GregorianCalendar cal = new GregorianCalendar (TimeZone.getTimeZone("GMT")); ! cal.set(year+1900, month, date, hours, minutes, seconds); ! return cal.getTimeInMillis(); } /** * Reads an Object from the stream. */ ! private void readObject (java.io.ObjectInputStream input) throws java.io.IOException, ClassNotFoundException { ! input.defaultReadObject (); ! millis = input.readLong (); } /** --- 591,774 ---- -timezone * 60 * 1000); } ! /** ! * @return the year minus 1900 represented by this date object. ! * @deprecated Use Calendar instead of Date, and use get(Calendar.YEAR) ! * instead. Note about the 1900 difference in year. ! */ ! public int getYear() { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! return cal.get(Calendar.YEAR) - 1900; } ! /** ! * Sets the year to year minus 1900, not changing the other fields. ! * @param year the year minus 1900. ! * @deprecated Use Calendar instead of Date, and use ! * set(Calendar.YEAR, year) instead. Note about the 1900 ! * difference in year. ! */ ! public void setYear(int year) { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! cal.set(Calendar.YEAR, 1900 + year); ! time = cal.getTimeInMillis(); } ! /** ! * @return the month represented by this date object (zero based). ! * @deprecated Use Calendar instead of Date, and use get(Calendar.MONTH) ! * instead. ! */ ! public int getMonth() { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! return cal.get(Calendar.MONTH); } ! /** ! * Sets the month to the given value, not changing the other fields. ! * @param month the month, zero based. ! * @deprecated Use Calendar instead of Date, and use ! * set(Calendar.MONTH, month) instead. ! */ ! public void setMonth(int month) { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! cal.set(Calendar.MONTH, month); ! time = cal.getTimeInMillis(); } ! /** ! * @return the day of month represented by this date object. ! * @deprecated Use Calendar instead of Date, and use get(Calendar.DATE) ! * instead. ! */ ! public int getDate() { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! return cal.get(Calendar.DATE); } ! /** ! * Sets the date to the given value, not changing the other fields. ! * @param date the date. ! * @deprecated Use Calendar instead of Date, and use ! * set(Calendar.DATE, date) instead. ! */ ! public void setDate(int date) { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! cal.set(Calendar.DATE, date); ! time = cal.getTimeInMillis(); } ! /** ! * @return the day represented by this date object. ! * @deprecated Use Calendar instead of Date, and use get(Calendar.DAY_OF_WEEK) ! * instead. ! */ ! public int getDay() { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! // For Calendar, Sunday is 1. For Date, Sunday is 0. ! return cal.get(Calendar.DAY_OF_WEEK) - 1; } ! /** ! * @return the hours represented by this date object. ! * @deprecated Use Calendar instead of Date, and use get(Calendar.HOUR_OF_DAY) ! * instead. ! */ ! public int getHours() { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! return cal.get(Calendar.HOUR_OF_DAY); } ! /** ! * Sets the hours to the given value, not changing the other fields. ! * @param hours the hours. ! * @deprecated Use Calendar instead of Date, and use ! * set(Calendar.HOUR_OF_DAY, hours) instead. ! */ ! public void setHours(int hours) { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! cal.set(Calendar.HOUR_OF_DAY, hours); ! time = cal.getTimeInMillis(); } ! /** ! * @return the minutes represented by this date object. ! * @deprecated Use Calendar instead of Date, and use get(Calendar.MINUTE) ! * instead. ! */ ! public int getMinutes() { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! return cal.get(Calendar.MINUTE); } ! /** ! * Sets the minutes to the given value, not changing the other fields. ! * @param minutes the minutes. ! * @deprecated Use Calendar instead of Date, and use ! * set(Calendar.MINUTE, minutes) instead. ! */ ! public void setMinutes(int minutes) { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! cal.set(Calendar.MINUTE, minutes); ! time = cal.getTimeInMillis(); } ! /** ! * @return the seconds represented by this date object. ! * @deprecated Use Calendar instead of Date, and use get(Calendar.SECOND) ! * instead. ! */ ! public int getSeconds() { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! return cal.get(Calendar.SECOND); } ! /** ! * Sets the seconds to the given value, not changing the other fields. ! * @param seconds the seconds. ! * @deprecated Use Calendar instead of Date, and use ! * set(Calendar.SECOND, seconds) instead. ! */ ! public void setSeconds(int seconds) { ! Calendar cal = Calendar.getInstance(); ! cal.setTimeInMillis(time); ! cal.set(Calendar.SECOND, seconds); ! time = cal.getTimeInMillis(); } /** * Reads an Object from the stream. */ ! private void readObject(java.io.ObjectInputStream input) throws java.io.IOException, ClassNotFoundException { ! input.defaultReadObject(); ! time = input.readLong(); } /** *************** public class Date implements java.io.Ser *** 497,506 **** * in milliseconds. This is the same value that is returned by the * method getTime(). */ ! private void writeObject (java.io.ObjectOutputStream output) throws java.io.IOException { ! output.defaultWriteObject (); ! output.writeLong (millis); } } --- 777,786 ---- * in milliseconds. This is the same value that is returned by the * method getTime(). */ ! private void writeObject(java.io.ObjectOutputStream output) throws java.io.IOException { ! output.defaultWriteObject(); ! output.writeLong(time); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Dictionary.java gcc-3.1/libjava/java/util/Dictionary.java *** gcc-3.0.4/libjava/java/util/Dictionary.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/Dictionary.java Tue Jan 22 22:40:38 2002 *************** *** 1,6 **** /* Dictionary.java -- an abstract (and essentially worthless) class which is Hashtable's superclass ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- /* Dictionary.java -- an abstract (and essentially worthless) class which is Hashtable's superclass ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** package java.util; *** 35,85 **** * This is an abstract class which has really gone by the wayside. * People at Javasoft are probably embarrassed by it. At this point, * it might as well be an interface rather than a class, but it remains ! * this poor, laugable skeleton for the sake of backwards compatibility. * At any rate, this was what came before the

          Map
          interface * in the Collections framework. * ! * @author Jon Zeppieri ! * @version $Revision: 1.3.4.1 $ ! * @modified $Id: Dictionary.java,v 1.3.4.1 2001/02/17 01:06:45 bryce Exp $ */ public abstract class Dictionary extends Object { ! /** returns an Enumeration of the values in this Dictionary */ public abstract Enumeration elements(); /** ! * returns the value associated with the supplied key, or null ! * if no such value exists * ! * @param key the key to use to fetch the value */ public abstract Object get(Object key); ! /** returns true IFF there are no elements in this Dictionary (size() == 0) */ public abstract boolean isEmpty(); ! /** returns an Enumeration of the keys in this Dictionary */ public abstract Enumeration keys(); /** ! * inserts a new value into this Dictionary, located by the ! * supllied key; note: Dictionary's subclasses (all 1 of them) ! * do not support null keys or values (I can only assume this ! * would have been more general) * ! * @param key the key which locates the value ! * @param value the value to put into the Dictionary */ public abstract Object put(Object key, Object value); /** ! * removes fro the Dictionary the value located by the given key * ! * @param key the key used to locate the value to be removed */ public abstract Object remove(Object key); ! /** returns the number of values currently in this Dictionary */ public abstract int size(); } --- 46,133 ---- * This is an abstract class which has really gone by the wayside. * People at Javasoft are probably embarrassed by it. At this point, * it might as well be an interface rather than a class, but it remains ! * this poor, laughable skeleton for the sake of backwards compatibility. * At any rate, this was what came before the
          Map
          interface * in the Collections framework. * ! * @author Jon Zeppieri ! * @author Eric Blake ! * @see Map ! * @see Hashtable ! * @since 1.0 ! * @status updated to 1.4 */ public abstract class Dictionary extends Object { ! /** ! * Sole constructor (often called implicitly). ! */ ! public Dictionary() ! { ! } ! ! /** ! * Returns an Enumeration of the values in this Dictionary. ! * ! * @return an Enumeration of the values ! * @see #keys() ! */ public abstract Enumeration elements(); /** ! * Returns the value associated with the supplied key, or null ! * if no such value exists. Since Dictionaries are not allowed null keys ! * or elements, a null result always means the key is not present. * ! * @param key the key to use to fetch the value ! * @return the mapped value ! * @throws NullPointerException if key is null ! * @see #put(Object, Object) */ public abstract Object get(Object key); ! /** ! * Returns true when there are no elements in this Dictionary. ! * ! * @return size() == 0 ! */ public abstract boolean isEmpty(); ! /** ! * Returns an Enumeration of the keys in this Dictionary ! * ! * @return an Enumeration of the keys ! * @see #elements() ! */ public abstract Enumeration keys(); /** ! * Inserts a new value into this Dictionary, located by the ! * supplied key. Dictionary does not support null keys or values, so ! * a null return can safely be interpreted as adding a new key. * ! * @param key the key which locates the value ! * @param value the value to put into the Dictionary ! * @return the previous value of the key, or null if there was none ! * @throws NullPointerException if key or value is null ! * @see #get(Object) */ public abstract Object put(Object key, Object value); /** ! * Removes from the Dictionary the value located by the given key. A null ! * return safely means that the key was not mapped in the Dictionary. * ! * @param key the key used to locate the value to be removed ! * @return the value associated with the removed key ! * @throws NullPointerException if key is null */ public abstract Object remove(Object key); ! /** ! * Returns the number of values currently in this Dictionary. ! * ! * @return the number of keys in the Dictionary ! */ public abstract int size(); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/EmptyStackException.java gcc-3.1/libjava/java/util/EmptyStackException.java *** gcc-3.0.4/libjava/java/util/EmptyStackException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/EmptyStackException.java Tue Jan 22 22:40:38 2002 *************** *** 1,27 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct. */ ! public class EmptyStackException extends RuntimeException { public EmptyStackException() { - super(); } } --- 1,69 ---- ! /* EmptyStackException.java -- Attempt to pop from an empty stack ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. */ ! ! /** ! * This exception is thrown by the Stack class when an attempt is made to pop ! * or otherwise access elements from an empty stack. ! * ! * @author Warren Levy ! * @author Eric Blake ! * @see Stack ! * @since 1.0 ! * @status updated to 1.4 ! */ public class EmptyStackException extends RuntimeException { + /** + * Compatible with JDK 1.0. + */ + private static final long serialVersionUID = 5084686378493302095L; + + /** + * Constructs an EmptyStackException with no detail message. + */ public EmptyStackException() { } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Enumeration.java gcc-3.1/libjava/java/util/Enumeration.java *** gcc-3.0.4/libjava/java/util/Enumeration.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/Enumeration.java Tue Jan 22 22:40:38 2002 *************** *** 1,24 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.util; ! ! /** ! * @author Warren Levy ! * @date August 25, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1. * Status: Believed complete and correct */ ! public interface Enumeration { ! public boolean hasMoreElements(); ! public Object nextElement() throws NoSuchElementException; } --- 1,81 ---- ! /* Enumeration.java -- Interface for enumerating lists of objects ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1. * Status: Believed complete and correct */ ! ! /** ! * Interface for lists of objects that can be returned in sequence. Successive ! * objects are obtained by the nextElement method. ! *

          ! * As of Java 1.2, the Iterator interface provides the same functionality, but ! * with shorter method names and a new optional method to remove items from the ! * list. If writing for 1.2, consider using Iterator instead. Enumerations over ! * the new collections classes, for use with legacy APIs that require them, can ! * be obtained by the enumeration method in class Collections. ! * ! * @author Warren Levy ! * @author Eric Blake ! * @see Iterator ! * @see Hashtable ! * @see Vector ! * @since 1.0 ! * @status updated to 1.4 ! */ public interface Enumeration { ! /** ! * Tests whether there are elements remaining in the enumeration. ! * ! * @return true if there is at least one more element in the enumeration, ! * that is, if the next call to nextElement will not throw a ! * NoSuchElementException. ! */ ! boolean hasMoreElements(); ! ! /** ! * Obtain the next element in the enumeration. ! * ! * @return the next element in the enumeration ! * @throws NoSuchElementException if there are no more elements ! */ ! Object nextElement(); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/EventListener.java gcc-3.1/libjava/java/util/EventListener.java *** gcc-3.0.4/libjava/java/util/EventListener.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/EventListener.java Tue Jan 22 22:40:38 2002 *************** *** 1,24 **** ! // EventListener.java - Listen for events from event source. ! /* Copyright (C) 1998, 1999 Free Software Foundation - This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - package java.util; - /** - * @author Tom Tromey - * @date December 12, 1998 - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Believed complete and correct. */ public interface EventListener { } --- 1,58 ---- ! /* An interface that all event listener interfaces must extend ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * Status: Believed complete and correct. */ + /** + * Empty interface that is implemented by classes that need to receive + * events. Subinterfaces define methods that can be called to fire an + * event notification. Normally the name of these subinterfaces end in + * Listener and all method described by the subinterface + * take as argument an subclass of EventObject. + * + * @author Tom Tromey + * @date December 12, 1998 + */ public interface EventListener { } diff -Nrc3pad gcc-3.0.4/libjava/java/util/EventObject.java gcc-3.1/libjava/java/util/EventObject.java *** gcc-3.0.4/libjava/java/util/EventObject.java Tue Oct 24 10:53:56 2000 --- gcc-3.1/libjava/java/util/EventObject.java Tue Jan 22 22:40:38 2002 *************** *** 1,28 **** /* EventObject.java - Represent events fired by objects. Copyright (C) 1999, 2000 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 1,39 ---- /* EventObject.java - Represent events fired by objects. Copyright (C) 1999, 2000 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; diff -Nrc3pad gcc-3.0.4/libjava/java/util/GregorianCalendar.java gcc-3.1/libjava/java/util/GregorianCalendar.java *** gcc-3.0.4/libjava/java/util/GregorianCalendar.java Thu Dec 28 05:55:56 2000 --- gcc-3.1/libjava/java/util/GregorianCalendar.java Sat Mar 23 16:12:49 2002 *************** *** 1,265 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; /** ! * @author Per Bothner ! * @date October 24, 1998. ! */ ! ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3, ! * and "The Java Language Specification", ISBN 0-201-63451-1. ! * Status: "leniency" is not handled, and neither is roll-over in ! * add and roll. This is partly because of unclear specification. ! * hashCode has no spec. */ ! ! public class GregorianCalendar extends Calendar { public static final int BC = 0; public static final int AD = 1; ! // The fields are as specified in Sun's "Serialized Form" ! // in the JDK 1.2 beta 4 API specification. ! // Value from a simple test program (getGregorianChange.getTime()). ! long gregorianCutover = -12219292800000L; ! private final static int[] mins = { ! 0 /* ERA */, ! 1 /* YEAR */, ! 0 /* MONTH */, ! 0 /* WEEK_OF_YEAR */, ! 0 /* WEEK_OF_MONTH */, ! 1 /* DATE */, ! 1 /* DAY_OF_YEAR */, ! 1 /* DAY_OF_WEEK */, ! -1 /* DAY_OF_WEEK_IN_MONTH */, ! 0 /* AM_PM */, ! 0 /* HOUR */, ! 0 /* HOUR_OF_DAY */, ! 0 /* MINUTE */, ! 0 /* SECOND */, ! 0 /* MILLISECOND */, ! -43200000 /* ZONE_OFFSET */, ! 0 /* DST_OFFSET */ ! }; ! private final static int[] maxs = { ! 1 /* ERA */, ! 5000000 /* YEAR */, ! 11 /* MONTH */, ! 54 /* WEEK_OF_YEAR */, ! 6 /* WEEK_OF_MONTH */, ! 31 /* DATE */, ! 366 /* DAY_OF_YEAR */, ! 7 /* DAY_OF_WEEK */, ! 6 /* DAY_OF_WEEK_IN_MONTH */, ! 1 /* AM_PM */, ! 12 /* HOUR */, ! 23 /* HOUR_OF_DAY */, ! 59 /* MINUTE */, ! 59 /* SECOND */, ! 999 /* MILLISECOND */, ! 43200000 /* ZONE_OFFSET */, ! 3600000 /* DST_OFFSET */ ! }; ! private final static int[] leastMaximums = { ! 1 /* ERA */, ! 5000000 /* YEAR */, ! 11 /* MONTH */, ! 53 /* WEEK_OF_YEAR */, ! 6 /* WEEK_OF_MONTH */, ! 28 /* DATE */, ! 365 /* DAY_OF_YEAR */, ! 7 /* DAY_OF_WEEK */, ! 4 /* DAY_OF_WEEK_IN_MONTH */, ! 1 /* AM_PM */, ! 11 /* HOUR */, ! 23 /* HOUR_OF_DAY */, ! 59 /* MINUTE */, ! 59 /* SECOND */, ! 999 /* MILLISECOND */, ! 43200000 /* ZONE_OFFSET */, ! 3600000 /* DST_OFFSET */ ! }; ! private static final long serialVersionUID = -8125100834729963327L; ! public GregorianCalendar () { ! this(TimeZone.getDefault (), Locale.getDefault ()); } ! public GregorianCalendar (TimeZone zone) { ! this (zone, Locale.getDefault ()); } ! public GregorianCalendar (Locale locale) { ! this (TimeZone.getDefault (), locale); } ! public GregorianCalendar (TimeZone zone, Locale locale) { ! super (zone, locale); ! setDefaultTime (); } ! public GregorianCalendar (int year, int month, int date) { ! this(); ! set (year, month, date, 0, 0, 0); } ! public GregorianCalendar (int year, int month, int date, ! int hour, int minute) { ! this(); ! set (year, month, date, hour, minute, 0); } ! public GregorianCalendar (int year, int month, int date, ! int hour, int minute, int second) { ! this(); ! set (year, month, date, hour, minute, second); } ! private final void setDefaultTime () { ! setTimeInMillis (System.currentTimeMillis()); } ! public int getMinimum(int calfield) { return mins[calfield]; } ! public int getGreatestMinimum(int calfield) { return mins[calfield]; } ! public int getMaximum(int calfield) { return maxs[calfield]; } ! public int getLeastMaximum(int calfield) { return leastMaximums[calfield]; } ! protected native void computeFields(); ! protected native void computeTime(); ! public void add (int fld, int amount) { ! if (fld >= ZONE_OFFSET) ! throw new IllegalArgumentException("bad field to add"); ! fields[fld] += amount; ! adjust(fld); } ! public void roll (int fld, boolean up) { ! if (fld >= ZONE_OFFSET) ! throw new IllegalArgumentException("bad field to roll"); ! int old = fields[fld]; ! if (up) { ! fields[fld] = old == getMaximum(fld) ? getMinimum(fld) ! : old + 1; } else { ! fields[fld] = old == getMinimum(fld) ? getMaximum(fld) ! : old - 1; } } ! private void adjust (int fld) { ! int value = fields[fld]; ! int radix = maxs[fld] + 1; ! switch (fld) { case MONTH: ! case SECOND: ! case MILLISECOND: ! if (value >= radix) { ! int next = value / radix; ! fields[fld] = value - radix * next; ! fields[fld - 1] += next; ! adjust(fld - 1); } ! else if (value < 0) // min[fld] { ! int next = (value - radix - 1) / radix; ! fields[fld] = value - radix * next; ! fields[fld - 1] += next; ! adjust(fld - 1); } break; } } - public final Date getGregorianChange() { return new Date(gregorianCutover); } - public void setGregorianChange (Date date) - { gregorianCutover = date.getTime(); } ! public boolean isLeapYear(int year) { ! if ((year % 4) != 0) ! return false; ! if ((year % 100) != 0 || (year % 400) == 0) ! return true; ! // year divisible by 100 but not 400. ! GregorianCalendar date = new GregorianCalendar(year, FEBRUARY, 28); ! return gregorianCutover < date.getTimeInMillis(); } ! public boolean after (Object cal) { ! return cal instanceof Calendar ! && getTimeInMillis() > ((Calendar) cal).getTimeInMillis(); } ! public boolean before (Object cal) { ! return cal instanceof Calendar ! && getTimeInMillis() < ((Calendar) cal).getTimeInMillis(); } ! public boolean equals (Object obj) { ! if (obj == null || ! (obj instanceof GregorianCalendar)) ! return false; ! GregorianCalendar other = (GregorianCalendar) obj; ! for (int i = FIELD_COUNT; --i >= 0; ) { ! boolean set = isSet[i]; ! if (set != other.isSet[i] ! || (set && fields[i] != other.fields[i])) ! return false; } - if (areFieldsSet != other.areFieldsSet - || isTimeSet != other.isTimeSet - || (isTimeSet && time != other.time) - || getFirstDayOfWeek() != other.getFirstDayOfWeek() - || getMinimalDaysInFirstWeek() != other.getMinimalDaysInFirstWeek() - || isLenient() != other.isLenient() - || ! getTimeZone().equals(other.getTimeZone())) - return false; - return true; } ! public int hashCode () { ! int hashcode = 0; ! for (int i = FIELD_COUNT; --i >= 0; ) { ! if (isSet[i]) ! hashcode += 37 * fields[i]; } - if (isTimeSet) - hashcode += 89 * time; - return hashcode; } } --- 1,1088 ---- ! /* java.util.GregorianCalendar ! Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /** ! * This class represents the Gregorian calendar, that is used in most ! * countries all over the world. It does also handle the Julian calendar ! * for dates smaller than the date of the change to the Gregorian calendar. ! * This change date is different from country to country, you can set it with ! * setGregorianChange ! * ! * The Gregorian calendar differs from the Julian calendar by a different ! * leap year rule (no leap year every 100 years, except if year is divisible ! * by 400). The non existing days that were omited when the change took ! * place are interpreted as gregorian date ! * ! * There are to eras available for the Gregorian calendar, namely BC and AD. ! * ! * @see Calendar ! * @see TimeZone */ ! public class GregorianCalendar extends Calendar ! { ! /** ! * Constant representing the era BC (before Christ). ! */ public static final int BC = 0; + + /** + * Constant representing the era AD (Anno Domini). + */ public static final int AD = 1; ! /** ! * The point at which the Gregorian calendar rules were used. ! * This is locale dependent; the default for most catholic ! * countries is midnight (UTC) on October 5, 1582 (Julian), ! * or October 15, 1582 (Gregorian). ! */ ! private long gregorianCutover; ! static final long serialVersionUID = -8125100834729963327L; ! /** ! * The name of the resource bundle. ! */ ! private static final String bundleName = "gnu.java.locale.Calendar"; ! /** ! * Constructs a new GregorianCalender representing the current ! * time, using the default time zone and the default locale. ! */ ! public GregorianCalendar() ! { ! this(TimeZone.getDefault(), Locale.getDefault()); ! } ! ! /** ! * Constructs a new GregorianCalender representing the current ! * time, using the specified time zone and the default locale. ! * @param zone a time zone. ! */ ! public GregorianCalendar(TimeZone zone) ! { ! this(zone, Locale.getDefault()); ! } ! ! /** ! * Constructs a new GregorianCalender representing the current ! * time, using the default time zone and the specified locale. ! * @param locale a locale. ! */ ! public GregorianCalendar(Locale locale) ! { ! this(TimeZone.getDefault(), locale); ! } ! /** ! * Constructs a new GregorianCalender representing the current ! * time with the given time zone and the given locale. ! * @param zone a time zone. ! * @param locale a locale. ! */ ! public GregorianCalendar(TimeZone zone, Locale locale) ! { ! super(zone, locale); ! ResourceBundle rb = ResourceBundle.getBundle(bundleName, locale); ! gregorianCutover = ((Date) rb.getObject("gregorianCutOver")).getTime(); ! setTimeInMillis(System.currentTimeMillis()); ! } ! /** ! * Constructs a new GregorianCalendar representing midnight on the ! * given date with the default time zone and locale. ! * @param year corresponds to the YEAR time field. ! * @param month corresponds to the MONTH time field. ! * @param day corresponds to the DAY time field. ! */ ! public GregorianCalendar(int year, int month, int day) { ! super(); ! set(year, month, day); } ! /** ! * Constructs a new GregorianCalendar representing midnight on the ! * given date with the default time zone and locale. ! * @param year corresponds to the YEAR time field. ! * @param month corresponds to the MONTH time field. ! * @param day corresponds to the DAY time field. ! * @param hour corresponds to the HOUR_OF_DAY time field. ! * @param minute corresponds to the MINUTE time field. ! */ ! public GregorianCalendar(int year, int month, int day, int hour, int minute) { ! super(); ! set(year, month, day, hour, minute); } ! /** ! * Constructs a new GregorianCalendar representing midnight on the ! * given date with the default time zone and locale. ! * @param year corresponds to the YEAR time field. ! * @param month corresponds to the MONTH time field. ! * @param day corresponds to the DAY time field. ! * @param hour corresponds to the HOUR_OF_DAY time field. ! * @param minute corresponds to the MINUTE time field. ! * @param second corresponds to the SECOND time field. ! */ ! public GregorianCalendar(int year, int month, int day, ! int hour, int minute, int second) { ! super(); ! set(year, month, day, hour, minute, second); } ! /** ! * Sets the date of the switch from Julian dates to Gregorian dates. ! * You can use new Date(Long.MAX_VALUE) to use a pure ! * Julian calendar, or Long.MIN_VALUE for a pure Gregorian ! * calendar. ! * @param date the date of the change. ! */ ! public void setGregorianChange(Date date) { ! gregorianCutover = date.getTime(); } ! /** ! * Gets the date of the switch from Julian dates to Gregorian dates. ! * @return the date of the change. ! */ ! public final Date getGregorianChange() { ! return new Date(gregorianCutover); } ! /** ! * Determines if the given year is a leap year. The result is ! * undefined if the gregorian change took place in 1800, so that ! * the end of february is skiped and you give that year ! * (well...).
          ! * ! * The year should be positive and you can't give an ERA. But ! * remember that before 4 BC there wasn't a consistent leap year ! * rule, so who cares. ! * ! * @param year a year use nonnegative value for BC. ! * @return true, if the given year is a leap year, false otherwise. */ ! public boolean isLeapYear(int year) { ! if ((year & 3) != 0) ! // Only years divisible by 4 can be leap years ! return false; ! ! // compute the linear day of the 29. February of that year. ! // The 13 is the number of days, that were omitted in the Gregorian ! // Calender until the epoch. ! int julianDay = (((year-1) * (365*4+1)) >> 2) + (31+29 - ! (((1970-1) * (365*4+1)) / 4 + 1 - 13)); ! ! // If that day is smaller than the gregorianChange the julian ! // rule applies: This is a leap year since it is divisible by 4. ! if (julianDay * (24 * 60 * 60 * 1000L) < gregorianCutover) ! return true; ! ! return ((year % 100) != 0 || (year % 400) == 0); } ! /** ! * Get the linear time in milliseconds since the epoch. If you ! * specify a nonpositive year it is interpreted as BC as ! * following: 0 is 1 BC, -1 is 2 BC and so on. The date is ! * interpreted as gregorian if the change occurred before that date. ! * ! * @param year the year of the date. ! * @param dayOfYear the day of year of the date; 1 based. ! * @param millis the millisecond in that day. ! * @return the days since the epoch, may be negative. */ ! private long getLinearTime(int year, int dayOfYear, int millis) { ! // The 13 is the number of days, that were omitted in the Gregorian ! // Calender until the epoch. ! // We shift right by 2 instead of dividing by 4, to get correct ! // results for negative years (and this is even more efficient). ! int julianDay = ((year * (365 * 4 + 1)) >> 2) + dayOfYear - ! ((1970 * (365 * 4 + 1)) / 4 + 1 - 13); ! long time = julianDay * (24 * 60 * 60 * 1000L) + millis; ! ! if (time >= gregorianCutover) ! { ! // subtract the days that are missing in gregorian calendar ! // with respect to julian calendar. ! // ! // Okay, here we rely on the fact that the gregorian ! // calendar was introduced in the AD era. This doesn't work ! // with negative years. ! // ! // The additional leap year factor accounts for the fact that ! // a leap day is not seen on Jan 1 of the leap year. ! int gregOffset = (year / 400) - (year / 100) + 2; ! if (isLeapYear (year, true) && dayOfYear < 31 + 29) ! --gregOffset; ! time += gregOffset * (24 * 60 * 60 * 1000L); ! } ! return time; } ! private int getWeekDay(int year, int dayOfYear) { ! int day = ! (int) (getLinearTime(year, dayOfYear, 0) / (24 * 60 * 60 * 1000L)); ! ! // The epoch was a thursday. ! int weekday = (day + THURSDAY) % 7; ! if (weekday <= 0) ! weekday += 7; ! return weekday; } ! /** ! * Calculate the dayOfYear from the fields array. ! * The relativeDays is used, to account for weeks that begin before ! * the gregorian change and end after it.
          ! * ! * We return two values, the first is used to determine, if we ! * should use Gregorian calendar or Julian calendar, in case of ! * the change year, the second is a relative day after the given ! * day. This is necessary for week calculation in the year in ! * which gregorian change occurs.
          ! * ! * @param year the year, negative for BC. ! * @return an array of two int values, the first containing a reference ! * day of current year, the second a relative count since this reference ! * day. */ ! private int[] getDayOfYear(int year) ! { ! if (isSet[MONTH]) ! { ! int dayOfYear; ! if (fields[MONTH] > FEBRUARY) ! { ! // The months after February are regular: ! // 9 is an offset found by try and error. ! dayOfYear = (fields[MONTH] * (31 + 30 + 31 + 30 + 31) - 9) / 5; ! if (isLeapYear(year)) ! dayOfYear++; ! } ! else ! dayOfYear = 31 * fields[MONTH]; ! if (isSet[DAY_OF_MONTH]) ! { ! return new int[] ! { ! dayOfYear + fields[DAY_OF_MONTH], 0}; ! } ! if (isSet[WEEK_OF_MONTH] && isSet[DAY_OF_WEEK]) ! { ! // the weekday of the first day in that month is: ! int weekday = getWeekDay(year, ++dayOfYear); ! return new int[] ! { ! dayOfYear, ! // the day of week in the first week ! // (weeks starting on sunday) is: ! fields[DAY_OF_WEEK] - weekday + ! // Now jump to the right week and correct the possible ! // error made by assuming sunday is the first week day. ! 7 * (fields[WEEK_OF_MONTH] ! + (fields[DAY_OF_WEEK] < getFirstDayOfWeek()? 0 : -1) ! + (weekday < getFirstDayOfWeek()? -1 : 0))}; ! } ! if (isSet[DAY_OF_WEEK] && isSet[DAY_OF_WEEK_IN_MONTH]) ! { ! // the weekday of the first day in that month is: ! int weekday = getWeekDay(year, ++dayOfYear); ! return new int[] { ! dayOfYear, ! fields[DAY_OF_WEEK] - weekday + ! 7 * (fields[DAY_OF_WEEK_IN_MONTH] ! + (fields[DAY_OF_WEEK] < weekday ? 0 : -1))}; ! } ! } ! ! // MONTH + something did not succeed. ! if (isSet[DAY_OF_YEAR]) ! { ! return new int[] {0, fields[DAY_OF_YEAR]}; ! } ! ! if (isSet[DAY_OF_WEEK] && isSet[WEEK_OF_YEAR]) ! { ! int dayOfYear = getMinimalDaysInFirstWeek(); ! // the weekday of the day, that begins the first week ! // in that year is: ! int weekday = getWeekDay(year, dayOfYear); ! ! return new int[] { ! dayOfYear, ! // the day of week in the first week ! // (weeks starting on sunday) is: ! fields[DAY_OF_WEEK] - weekday ! // Now jump to the right week and correct the possible ! // error made by assuming sunday is the first week day. ! + 7 * (fields[WEEK_OF_YEAR] ! + (fields[DAY_OF_WEEK] < getFirstDayOfWeek()? 0 : -1) ! + (weekday < getFirstDayOfWeek()? -1 : 0))}; ! } ! ! // As last resort return Jan, 1st. ! return new int[] {1, 0}; ! } ! ! /** ! * Converts the time field values (fields) to ! * milliseconds since the epoch UTC (time). ! */ ! protected synchronized void computeTime() { ! int era = isSet[ERA] ? fields[ERA] : AD; ! int year = isSet[YEAR] ? fields[YEAR] : 1970; ! if (era == BC) ! year = 1 - year; ! ! int[] daysOfYear = getDayOfYear(year); ! ! int hour = 0; ! if (isSet[HOUR_OF_DAY]) ! hour = fields[HOUR_OF_DAY]; ! else if (isSet[HOUR]) ! { ! hour = fields[HOUR]; ! if (isSet[AM_PM] && fields[AM_PM] == PM) ! hour += 12; ! } ! ! int minute = isSet[MINUTE] ? fields[MINUTE] : 0; ! int second = isSet[SECOND] ? fields[SECOND] : 0; ! int millis = isSet[MILLISECOND] ? fields[MILLISECOND] : 0; ! int millisInDay; ! ! if (isLenient()) ! { ! // prevent overflow ! long allMillis = (((hour * 60L) + minute) * 60L + second) * 1000L ! + millis; ! daysOfYear[1] += allMillis / (24 * 60 * 60 * 1000L); ! millisInDay = (int) (allMillis % (24 * 60 * 60 * 1000L)); ! } ! else ! { ! if (hour < 0 || hour >= 24 || minute < 0 || minute > 59 ! || second < 0 || second > 59 || millis < 0 || millis >= 1000) ! throw new IllegalArgumentException(); ! millisInDay = (((hour * 60) + minute) * 60 + second) * 1000 + millis; ! } ! time = getLinearTime(year, daysOfYear[0], millisInDay); ! ! // Add the relative days after calculating the linear time, to ! // get right behaviour when jumping over the gregorianCutover. ! time += daysOfYear[1] * (24 * 60 * 60 * 1000L); ! ! ! TimeZone zone = getTimeZone(); ! int rawOffset = isSet[ZONE_OFFSET] ! ? fields[ZONE_OFFSET] : zone.getRawOffset(); ! ! int dayOfYear = daysOfYear[0] + daysOfYear[1]; ! int month = (dayOfYear * 5 + 3) / (31 + 30 + 31 + 30 + 31); ! int day = (6 + (dayOfYear * 5 + 3) % (31 + 30 + 31 + 30 + 31)) / 5; ! int weekday = ((int) (time / (24 * 60 * 60 * 1000L)) + THURSDAY) % 7; ! if (weekday <= 0) ! weekday += 7; ! int dstOffset = isSet[DST_OFFSET] ! ? fields[DST_OFFSET] : (zone.getOffset((year < 0) ? BC : AD, ! (year < 0) ? 1 - year : year, ! month, day, weekday, millisInDay) ! - zone.getRawOffset()); ! time -= rawOffset + dstOffset; ! isTimeSet = true; } ! /** ! * Determines if the given year is a leap year. ! * ! * The year should be positive and you can't give an ERA. But ! * remember that before 4 BC there wasn't a consistent leap year ! * rule, so who cares. ! * ! * @param year a year use nonnegative value for BC. ! * @param gregorian if true, use gregorian leap year rule. ! * @return true, if the given year is a leap year, false otherwise. */ ! private boolean isLeapYear(int year, boolean gregorian) { ! if ((year & 3) != 0) ! // Only years divisible by 4 can be leap years ! return false; ! if (!gregorian) ! return true; ! ! // We rely on AD area here. ! return ((year % 100) != 0 || (year % 400) == 0); ! } ! ! /** ! * Get the linear day in days since the epoch, using the ! * Julian or Gregorian calendar as specified. If you specify a ! * nonpositive year it is interpreted as BC as following: 0 is 1 ! * BC, -1 is 2 BC and so on. ! * ! * @param year the year of the date. ! * @param dayOfYear the day of year of the date; 1 based. ! * @param gregorian True, if we should use Gregorian rules. ! * @return the days since the epoch, may be negative. */ ! private int getLinearDay(int year, int dayOfYear, boolean gregorian) ! { ! // The 13 is the number of days, that were omitted in the Gregorian ! // Calender until the epoch. ! // We shift right by 2 instead of dividing by 4, to get correct ! // results for negative years (and this is even more efficient). ! int julianDay = ((year * (365 * 4 + 1)) >> 2) + dayOfYear - ! ((1970 * (365 * 4 + 1)) / 4 + 1 - 13); ! ! if (gregorian) { ! // subtract the days that are missing in gregorian calendar ! // with respect to julian calendar. ! // ! // Okay, here we rely on the fact that the gregorian ! // calendar was introduced in the AD era. This doesn't work ! // with negative years. ! // ! // The additional leap year factor accounts for the fact that ! // a leap day is not seen on Jan 1 of the leap year. ! int gregOffset = (year / 400) - (year / 100) + 2; ! if (isLeapYear (year, true) && dayOfYear < 31 + 29) ! --gregOffset; ! julianDay += gregOffset; ! } ! return julianDay; ! } ! ! /** ! * Converts the given linear day into era, year, month, ! * day_of_year, day_of_month, day_of_week, and writes the result ! * into the fields array. ! * @param day the linear day. ! */ ! private void calculateDay(int day, boolean gregorian) ! { ! // the epoch is a Thursday. ! int weekday = (day + THURSDAY) % 7; ! if (weekday <= 0) ! weekday += 7; ! fields[DAY_OF_WEEK] = weekday; ! ! // get a first approximation of the year. This may be one ! // year to big. ! int year = 1970 + (gregorian ! ? ((day - 100) * 400) / (365 * 400 + 100 - 4 + 1) ! : ((day - 100) * 4) / (365 * 4 + 1)); ! if (day >= 0) ! year++; ! ! int firstDayOfYear = getLinearDay(year, 1, gregorian); ! ! // Now look in which year day really lies. ! if (day < firstDayOfYear) ! { ! year--; ! firstDayOfYear = getLinearDay(year, 1, gregorian); ! } ! ! day -= firstDayOfYear - 1; // day of year, one based. ! ! fields[DAY_OF_YEAR] = day; ! if (year <= 0) ! { ! fields[ERA] = BC; ! fields[YEAR] = 1 - year; } else { ! fields[ERA] = AD; ! fields[YEAR] = year; ! } ! ! int leapday = isLeapYear(year, gregorian) ? 1 : 0; ! if (day <= 31 + 28 + leapday) ! { ! fields[MONTH] = day / 32; // 31->JANUARY, 32->FEBRUARY ! fields[DAY_OF_MONTH] = day - 31 * fields[MONTH]; ! } ! else ! { ! // A few more magic formulas ! int scaledDay = (day - leapday) * 5 + 8; ! fields[MONTH] = scaledDay / (31 + 30 + 31 + 30 + 31); ! fields[DAY_OF_MONTH] = (scaledDay % (31 + 30 + 31 + 30 + 31)) / 5 + 1; } } ! /** ! * Converts the milliseconds since the epoch UTC ! * (time) to time fields ! * (fields). ! */ ! protected synchronized void computeFields() { ! boolean gregorian = (time >= gregorianCutover); ! ! TimeZone zone = getTimeZone(); ! fields[ZONE_OFFSET] = zone.getRawOffset(); ! long localTime = time + fields[ZONE_OFFSET]; ! ! int day = (int) (localTime / (24 * 60 * 60 * 1000L)); ! int millisInDay = (int) (localTime % (24 * 60 * 60 * 1000L)); ! if (millisInDay < 0) { + millisInDay += (24 * 60 * 60 * 1000); + day--; + } + + calculateDay(day, gregorian); + fields[DST_OFFSET] = + zone.getOffset(fields[ERA], fields[YEAR], fields[MONTH], + fields[DAY_OF_MONTH], fields[DAY_OF_WEEK], + millisInDay) - fields[ZONE_OFFSET]; + + millisInDay += fields[DST_OFFSET]; + if (millisInDay >= 24 * 60 * 60 * 1000) + { + millisInDay -= 24 * 60 * 60 * 1000; + calculateDay(++day, gregorian); + } + + fields[DAY_OF_WEEK_IN_MONTH] = (fields[DAY_OF_MONTH] + 6) / 7; + + // which day of the week are we (0..6), relative to getFirstDayOfWeek + int relativeWeekday = (7 + fields[DAY_OF_WEEK] - getFirstDayOfWeek()) % 7; + + fields[WEEK_OF_MONTH] = (fields[DAY_OF_MONTH] - relativeWeekday + 6) / 7; + + int weekOfYear = (fields[DAY_OF_YEAR] - relativeWeekday + 6) / 7; + + // Do the Correction: getMinimalDaysInFirstWeek() is always in the + // first week. + int minDays = getMinimalDaysInFirstWeek(); + int firstWeekday = + (7 + getWeekDay(fields[YEAR], minDays) - getFirstDayOfWeek()) % 7; + if (minDays - firstWeekday < 1) + weekOfYear++; + fields[WEEK_OF_YEAR] = weekOfYear; + + + int hourOfDay = millisInDay / (60 * 60 * 1000); + fields[AM_PM] = (hourOfDay < 12) ? AM : PM; + int hour = hourOfDay % 12; + fields[HOUR] = (hour == 0) ? 12 : hour; + fields[HOUR_OF_DAY] = hourOfDay; + millisInDay %= (60 * 60 * 1000); + fields[MINUTE] = millisInDay / (60 * 1000); + millisInDay %= (60 * 1000); + fields[SECOND] = millisInDay / (1000); + fields[MILLISECOND] = millisInDay % 1000; + + + areFieldsSet = isSet[ERA] = isSet[YEAR] = isSet[MONTH] = + isSet[WEEK_OF_YEAR] = isSet[WEEK_OF_MONTH] = + isSet[DAY_OF_MONTH] = isSet[DAY_OF_YEAR] = isSet[DAY_OF_WEEK] = + isSet[DAY_OF_WEEK_IN_MONTH] = isSet[AM_PM] = isSet[HOUR] = + isSet[HOUR_OF_DAY] = isSet[MINUTE] = isSet[SECOND] = + isSet[MILLISECOND] = isSet[ZONE_OFFSET] = isSet[DST_OFFSET] = true; + + } + + /** + * Compares the given calender with this. + * @param o the object to that we should compare. + * @return true, if the given object is a calendar, that represents + * the same time (but doesn't necessary have the same fields). + * @XXX Should we check if time zones, locale, cutover etc. are equal? + */ + public boolean equals(Object o) + { + if (!(o instanceof GregorianCalendar)) + return false; + + GregorianCalendar cal = (GregorianCalendar) o; + return (cal.getTimeInMillis() == getTimeInMillis()); + } + + // /** + // * Compares the given calender with this. + // * @param o the object to that we should compare. + // * @return true, if the given object is a calendar, and this calendar + // * represents a smaller time than the calender o. + // */ + // public boolean before(Object o) { + // if (!(o instanceof GregorianCalendar)) + // return false; + + // GregorianCalendar cal = (GregorianCalendar) o; + // return (cal.getTimeInMillis() < getTimeInMillis()); + // } + + // /** + // * Compares the given calender with this. + // * @param o the object to that we should compare. + // * @return true, if the given object is a calendar, and this calendar + // * represents a bigger time than the calender o. + // */ + // public boolean after(Object o) { + // if (!(o instanceof GregorianCalendar)) + // return false; + + // GregorianCalendar cal = (GregorianCalendar) o; + // return (cal.getTimeInMillis() > getTimeInMillis()); + // } + + /** + * Adds the specified amount of time to the given time field. The + * amount may be negative to subtract the time. If the field overflows + * it does what you expect: Jan, 25 + 10 Days is Feb, 4. + * @param field the time field. One of the time field constants. + * @param amount the amount of time. + */ + public void add(int field, int amount) + { + switch (field) + { + case YEAR: + complete(); + fields[YEAR] += amount; + isTimeSet = false; + break; case MONTH: ! complete(); ! int months = fields[MONTH] + amount; ! fields[YEAR] += months / 12; ! fields[MONTH] = months % 12; ! if (fields[MONTH] < 0) { ! fields[MONTH] += 12; ! fields[YEAR]--; } ! isTimeSet = false; ! int maxDay = getActualMaximum(DAY_OF_MONTH); ! if (fields[DAY_OF_MONTH] > maxDay) { ! fields[DAY_OF_MONTH] = maxDay; ! isTimeSet = false; } break; + case DAY_OF_MONTH: + case DAY_OF_YEAR: + case DAY_OF_WEEK: + if (!isTimeSet) + computeTime(); + time += amount * (24 * 60 * 60 * 1000L); + areFieldsSet = false; + break; + case WEEK_OF_YEAR: + case WEEK_OF_MONTH: + case DAY_OF_WEEK_IN_MONTH: + if (!isTimeSet) + computeTime(); + time += amount * (7 * 24 * 60 * 60 * 1000L); + areFieldsSet = false; + break; + case AM_PM: + if (!isTimeSet) + computeTime(); + time += amount * (12 * 60 * 60 * 1000L); + areFieldsSet = false; + break; + case HOUR: + case HOUR_OF_DAY: + if (!isTimeSet) + computeTime(); + time += amount * (60 * 60 * 1000L); + areFieldsSet = false; + break; + case MINUTE: + if (!isTimeSet) + computeTime(); + time += amount * (60 * 1000L); + areFieldsSet = false; + break; + case SECOND: + if (!isTimeSet) + computeTime(); + time += amount * (1000L); + areFieldsSet = false; + break; + case MILLISECOND: + if (!isTimeSet) + computeTime(); + time += amount; + areFieldsSet = false; + break; + case ZONE_OFFSET: + complete(); + fields[ZONE_OFFSET] += amount; + time -= amount; + break; + case DST_OFFSET: + complete(); + fields[DST_OFFSET] += amount; + isTimeSet = false; + break; + default: + throw new IllegalArgumentException + ("Unknown Calendar field: " + field); } } ! /** ! * Rolls the specified time field up or down. This means add one ! * to the specified field, but don't change the other fields. If ! * the maximum for this field is reached, start over with the ! * minimum value. ! * ! * Note: There may be situation, where the other ! * fields must be changed, e.g rolling the month on May, 31. ! * The date June, 31 is automatically converted to July, 1. ! * This requires lenient settings. ! * ! * @param field the time field. One of the time field constants. ! * @param up the direction, true for up, false for down. ! */ ! public void roll(int field, boolean up) { ! roll(field, up ? 1 : -1); } ! private void cleanUpAfterRoll(int field, int delta) { ! switch (field) ! { ! case ERA: ! case YEAR: ! case MONTH: ! // check that day of month is still in correct range ! if (fields[DAY_OF_MONTH] > getActualMaximum(DAY_OF_MONTH)) ! fields[DAY_OF_MONTH] = getActualMaximum(DAY_OF_MONTH); ! isTimeSet = false; ! isSet[WEEK_OF_MONTH] = false; ! isSet[DAY_OF_WEEK] = false; ! isSet[DAY_OF_WEEK_IN_MONTH] = false; ! isSet[DAY_OF_YEAR] = false; ! isSet[WEEK_OF_YEAR] = false; ! break; ! ! case DAY_OF_MONTH: ! isSet[WEEK_OF_MONTH] = false; ! isSet[DAY_OF_WEEK] = false; ! isSet[DAY_OF_WEEK_IN_MONTH] = false; ! isSet[DAY_OF_YEAR] = false; ! isSet[WEEK_OF_YEAR] = false; ! time += delta * (24 * 60 * 60 * 1000L); ! break; ! ! case WEEK_OF_MONTH: ! isSet[DAY_OF_MONTH] = false; ! isSet[DAY_OF_WEEK_IN_MONTH] = false; ! isSet[DAY_OF_YEAR] = false; ! isSet[WEEK_OF_YEAR] = false; ! time += delta * (7 * 24 * 60 * 60 * 1000L); ! break; ! case DAY_OF_WEEK_IN_MONTH: ! isSet[DAY_OF_MONTH] = false; ! isSet[WEEK_OF_MONTH] = false; ! isSet[DAY_OF_YEAR] = false; ! isSet[WEEK_OF_YEAR] = false; ! time += delta * (7 * 24 * 60 * 60 * 1000L); ! break; ! case DAY_OF_YEAR: ! isSet[MONTH] = false; ! isSet[DAY_OF_MONTH] = false; ! isSet[WEEK_OF_MONTH] = false; ! isSet[DAY_OF_WEEK_IN_MONTH] = false; ! isSet[DAY_OF_WEEK] = false; ! isSet[WEEK_OF_YEAR] = false; ! time += delta * (24 * 60 * 60 * 1000L); ! break; ! case WEEK_OF_YEAR: ! isSet[MONTH] = false; ! isSet[DAY_OF_MONTH] = false; ! isSet[WEEK_OF_MONTH] = false; ! isSet[DAY_OF_WEEK_IN_MONTH] = false; ! isSet[DAY_OF_YEAR] = false; ! time += delta * (7 * 24 * 60 * 60 * 1000L); ! break; ! ! case AM_PM: ! isSet[HOUR_OF_DAY] = false; ! time += delta * (12 * 60 * 60 * 1000L); ! break; ! case HOUR: ! isSet[HOUR_OF_DAY] = false; ! time += delta * (60 * 60 * 1000L); ! break; ! case HOUR_OF_DAY: ! isSet[HOUR] = false; ! isSet[AM_PM] = false; ! time += delta * (60 * 60 * 1000L); ! break; ! ! case MINUTE: ! time += delta * (60 * 1000L); ! break; ! case SECOND: ! time += delta * (1000L); ! break; ! case MILLISECOND: ! time += delta; ! break; ! } } ! /** ! * Rolls the specified time field by the given amount. This means ! * add amount to the specified field, but don't change the other ! * fields. If the maximum for this field is reached, start over ! * with the minimum value and vice versa for negative amounts. ! * ! * Note: There may be situation, where the other ! * fields must be changed, e.g rolling the month on May, 31. ! * The date June, 31 is automatically corrected to June, 30. ! * ! * @param field the time field. One of the time field constants. ! * @param amount the amount by which we should roll. ! */ ! public void roll(int field, int amount) { ! switch (field) ! { ! case DAY_OF_WEEK: ! // day of week is special: it rolls automatically ! add(field, amount); ! return; ! case ZONE_OFFSET: ! case DST_OFFSET: ! throw new IllegalArgumentException("Can't roll time zone"); ! } ! complete(); ! int min = getActualMinimum(field); ! int range = getActualMaximum(field) - min + 1; ! int oldval = fields[field]; ! int newval = (oldval - min + range + amount) % range + min; ! if (newval < min) ! newval += range; ! fields[field] = newval; ! cleanUpAfterRoll(field, newval - oldval); } ! private static final int[] minimums = ! { BC, 1, 0, 0, 1, 1, 1, SUNDAY, 1, ! AM, 1, 0, 1, 1, 1, -(12*60*60*1000), 0 }; ! ! private static final int[] maximums = ! { AD, 5000000, 11, 53, 5, 31, 366, SATURDAY, 5, ! PM, 12, 23, 59, 59, 999, +(12*60*60*1000), (12*60*60*1000) }; ! ! /** ! * Gets the smallest value that is allowed for the specified field. ! * @param field the time field. One of the time field constants. ! * @return the smallest value. ! */ ! public int getMinimum(int field) { ! return minimums[field]; ! } ! /** ! * Gets the biggest value that is allowed for the specified field. ! * @param field the time field. One of the time field constants. ! * @return the biggest value. ! */ ! public int getMaximum(int field) ! { ! return maximums[field]; ! } ! ! ! /** ! * Gets the greatest minimum value that is allowed for the specified field. ! * @param field the time field. One of the time field constants. ! * @return the greatest minimum value. ! */ ! public int getGreatestMinimum(int field) ! { ! if (field == WEEK_OF_YEAR) ! return 1; ! return minimums[field]; ! } ! ! /** ! * Gets the smallest maximum value that is allowed for the ! * specified field. For example this is 28 for DAY_OF_MONTH. ! * @param field the time field. One of the time field constants. ! * @return the least maximum value. ! * @since jdk1.2 ! */ ! public int getLeastMaximum(int field) ! { ! switch (field) { ! case WEEK_OF_YEAR: ! return 52; ! case DAY_OF_MONTH: ! return 28; ! case DAY_OF_YEAR: ! return 365; ! case DAY_OF_WEEK_IN_MONTH: ! case WEEK_OF_MONTH: ! return 4; ! default: ! return maximums[field]; } } ! /** ! * Gets the actual minimum value that is allowed for the specified field. ! * This value is dependent on the values of the other fields. Note that ! * this calls complete() if not enough fields are set. This ! * can have ugly side effects. ! * @param field the time field. One of the time field constants. ! * @return the actual minimum value. ! * @since jdk1.2 ! */ ! public int getActualMinimum(int field) { ! if (field == WEEK_OF_YEAR) { ! int min = getMinimalDaysInFirstWeek(); ! if (min == 0) ! return 1; ! if (!areFieldsSet || !isSet[ERA] || !isSet[YEAR]) ! complete(); ! ! int year = fields[ERA] == AD ? fields[YEAR] : 1 - fields[YEAR]; ! int weekday = getWeekDay(year, min); ! if ((7 + weekday - getFirstDayOfWeek()) % 7 >= min - 1) ! return 1; ! return 0; ! } ! return minimums[field]; ! } ! ! /** ! * Gets the actual maximum value that is allowed for the specified field. ! * This value is dependent on the values of the other fields. Note that ! * this calls complete() if not enough fields are set. This ! * can have ugly side effects. ! * @param field the time field. One of the time field constants. ! * @return the actual maximum value. ! */ ! public int getActualMaximum(int field) ! { ! switch (field) ! { ! case WEEK_OF_YEAR: ! { ! if (!areFieldsSet || !isSet[ERA] || !isSet[YEAR]) ! complete(); ! // This is wrong for the year that contains the gregorian change. ! // I.e it gives the weeks in the julian year or in the gregorian ! // year in that case. ! int year = fields[ERA] == AD ? fields[YEAR] : 1 - fields[YEAR]; ! int lastDay = isLeapYear(year) ? 366 : 365; ! int weekday = getWeekDay(year, lastDay); ! int week = (lastDay + 6 ! - (7 + weekday - getFirstDayOfWeek()) % 7) / 7; ! ! int minimalDays = getMinimalDaysInFirstWeek(); ! int firstWeekday = getWeekDay(year, minimalDays); ! if (minimalDays - (7 + firstWeekday - getFirstDayOfWeek()) % 7 < 1) ! return week + 1; ! } ! case DAY_OF_MONTH: ! { ! if (!areFieldsSet || !isSet[MONTH]) ! complete(); ! int month = fields[MONTH]; ! // If you change this, you should also change ! // SimpleTimeZone.getDaysInMonth(); ! if (month == FEBRUARY) ! { ! if (!isSet[YEAR] || !isSet[ERA]) ! complete(); ! int year = fields[ERA] == AD ? fields[YEAR] : 1 - fields[YEAR]; ! return isLeapYear(year) ? 29 : 28; ! } ! else if (month < AUGUST) ! return 31 - (month & 1); ! else ! return 30 + (month & 1); ! } ! case DAY_OF_YEAR: ! { ! if (!areFieldsSet || !isSet[ERA] || !isSet[YEAR]) ! complete(); ! int year = fields[ERA] == AD ? fields[YEAR] : 1 - fields[YEAR]; ! return isLeapYear(year) ? 366 : 365; ! } ! case DAY_OF_WEEK_IN_MONTH: ! { ! // This is wrong for the month that contains the gregorian change. ! int daysInMonth = getActualMaximum(DAY_OF_MONTH); ! // That's black magic, I know ! return (daysInMonth - (fields[DAY_OF_MONTH] - 1) % 7 + 6) / 7; ! } ! case WEEK_OF_MONTH: ! { ! int daysInMonth = getActualMaximum(DAY_OF_MONTH); ! int weekday = (daysInMonth - fields[DAY_OF_MONTH] ! + fields[DAY_OF_WEEK] - SUNDAY) % 7 + SUNDAY; ! return (daysInMonth + 6 ! - (7 + weekday - getFirstDayOfWeek()) % 7) / 7; ! } ! default: ! return maximums[field]; } } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/HashMap.java gcc-3.1/libjava/java/util/HashMap.java *** gcc-3.0.4/libjava/java/util/HashMap.java Sat Mar 24 08:06:26 2001 --- gcc-3.1/libjava/java/util/HashMap.java Tue Jan 22 22:40:38 2002 *************** *** 1,6 **** /* HashMap.java -- a class providing a basic hashtable data structure, mapping Object --> Object ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- /* HashMap.java -- a class providing a basic hashtable data structure, mapping Object --> Object ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.ObjectOutputStream; *** 37,119 **** // a bug in here, chances are you should make a similar change to the Hashtable // code. /** * This class provides a hashtable-backed implementation of the ! * Map interface. * ! * It uses a hash-bucket approach; that is, hash ! * collisions are handled by linking the new node off of the ! * pre-existing node (or list of nodes). In this manner, techniques ! * such as linear probing (which can casue primary clustering) and ! * rehashing (which does not fit very well with Java's method of ! * precomputing hash codes) are avoided. * ! * Under ideal circumstances (no collisions, HashMap offers O(1) ! * performance on most operations (

          containsValue()
          is, ! * of course, O(n)). In the worst case (all keys map to the same * hash code -- very unlikely), most operations are O(n). * ! * HashMap is part of the JDK1.2 Collections API. It differs from * Hashtable in that it accepts the null key and null values, and it ! * does not support "Enumeration views." * ! * @author Jon Zeppieri ! * @author Jochen Hoenicke ! * @author Bryce McKinlay */ public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { ! /** Default number of buckets. This is the value the JDK 1.3 uses. Some ! * early documentation specified this value as 101. That is incorrect. */ ! private static final int DEFAULT_CAPACITY = 11; ! /** The defaulty load factor; this is explicitly specified by the spec. */ ! private static final float DEFAULT_LOAD_FACTOR = 0.75f; private static final long serialVersionUID = 362498820763181265L; ! /** ! * The rounded product of the capacity and the load factor; when the number ! * of elements exceeds the threshold, the HashMap calls
          rehash()
          . ! * @serial */ ! int threshold; ! /** Load factor of this HashMap: used in computing the threshold. ! * @serial */ ! float loadFactor = DEFAULT_LOAD_FACTOR; ! /** ! * Array containing the actual key-value mappings */ ! transient Entry[] buckets; ! /** ! * counts the number of modifications this HashMap has undergone, used * by Iterators to know when to throw ConcurrentModificationExceptions. */ transient int modCount; ! /** the size of this HashMap: denotes the number of key-value pairs */ transient int size; /** * Class to represent an entry in the hash table. Holds a single key-value ! * pair. */ ! static class Entry extends BasicMapEntry { ! Entry next; ! ! Entry(Object key, Object value) { super(key, value); } } /** ! * construct a new HashMap with the default capacity (11) and the default * load factor (0.75). */ public HashMap() --- 48,198 ---- // a bug in here, chances are you should make a similar change to the Hashtable // code. + // NOTE: This implementation has some nasty coding style in order to + // support LinkedHashMap, which extends this. + /** * This class provides a hashtable-backed implementation of the ! * Map interface. ! *

          * ! * It uses a hash-bucket approach; that is, hash collisions are handled ! * by linking the new node off of the pre-existing node (or list of ! * nodes). In this manner, techniques such as linear probing (which ! * can cause primary clustering) and rehashing (which does not fit very ! * well with Java's method of precomputing hash codes) are avoided. ! *

          * ! * Under ideal circumstances (no collisions), HashMap offers O(1) ! * performance on most operations (containsValue() is, ! * of course, O(n)). In the worst case (all keys map to the same * hash code -- very unlikely), most operations are O(n). + *

          * ! * HashMap is part of the JDK1.2 Collections API. It differs from * Hashtable in that it accepts the null key and null values, and it ! * does not support "Enumeration views." Also, it is not synchronized; ! * if you plan to use it in multiple threads, consider using:
          ! * Map m = Collections.synchronizedMap(new HashMap(...)); ! *

          * ! * The iterators are fail-fast, meaning that any structural ! * modification, except for remove() called on the iterator ! * itself, cause the iterator to throw a ! * ConcurrentModificationException rather than exhibit ! * non-deterministic behavior. ! * ! * @author Jon Zeppieri ! * @author Jochen Hoenicke ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see Object#hashCode() ! * @see Collection ! * @see Map ! * @see TreeMap ! * @see LinkedHashMap ! * @see IdentityHashMap ! * @see Hashtable ! * @since 1.2 ! * @status updated to 1.4 */ public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { ! /** ! * Default number of buckets. This is the value the JDK 1.3 uses. Some ! * early documentation specified this value as 101. That is incorrect. ! * Package visible for use by HashSet. ! */ ! static final int DEFAULT_CAPACITY = 11; ! ! /** ! * The default load factor; this is explicitly specified by the spec. ! * Package visible for use by HashSet. ! */ ! static final float DEFAULT_LOAD_FACTOR = 0.75f; + /** + * Compatible with JDK 1.2. + */ private static final long serialVersionUID = 362498820763181265L; ! /** ! * The rounded product of the capacity and the load factor; when the number ! * of elements exceeds the threshold, the HashMap calls ! * rehash(). ! * @serial the threshold for rehashing */ ! private int threshold; ! /** ! * Load factor of this HashMap: used in computing the threshold. ! * Package visible for use by HashSet. ! * @serial the load factor */ ! final float loadFactor; ! /** ! * Array containing the actual key-value mappings. ! * Package visible for use by nested and subclasses. */ ! transient HashEntry[] buckets; ! /** ! * Counts the number of modifications this HashMap has undergone, used * by Iterators to know when to throw ConcurrentModificationExceptions. + * Package visible for use by nested and subclasses. */ transient int modCount; ! /** ! * The size of this HashMap: denotes the number of key-value pairs. ! * Package visible for use by nested and subclasses. ! */ transient int size; /** + * The cache for {@link #entrySet()}. + */ + private transient Set entries; + + /** * Class to represent an entry in the hash table. Holds a single key-value ! * pair. Package visible for use by subclass. ! * ! * @author Eric Blake */ ! static class HashEntry extends BasicMapEntry { ! /** ! * The next entry in the linked list. Package visible for use by subclass. ! */ ! HashEntry next; ! ! /** ! * Simple constructor. ! * @param key the key ! * @param value the value ! */ ! HashEntry(Object key, Object value) { super(key, value); } + + /** + * Called when this entry is removed from the map. This version simply + * returns the value, but in LinkedHashMap, it must also do bookkeeping. + * + * @return the value of this key as it is removed + */ + Object cleanup() + { + return value; + } } /** ! * Construct a new HashMap with the default capacity (11) and the default * load factor (0.75). */ public HashMap() *************** public class HashMap extends AbstractMap *** 122,358 **** } /** ! * construct a new HashMap from the given Map ! * ! * every element in Map t will be put into this new HashMap * ! * @param t a Map whose key / value pairs will be put into ! * the new HashMap. NOTE: key / value pairs ! * are not cloned in this constructor */ public HashMap(Map m) { ! int size = Math.max(m.size() * 2, DEFAULT_CAPACITY); ! buckets = new Entry[size]; ! threshold = (int) (size * loadFactor); ! putAll(m); } /** ! * construct a new HashMap with a specific inital capacity ! * ! * @param initialCapacity the initial capacity of this HashMap (>=0) * ! * @throws IllegalArgumentException if (initialCapacity < 0) */ ! public HashMap(int initialCapacity) throws IllegalArgumentException { this(initialCapacity, DEFAULT_LOAD_FACTOR); } /** ! * construct a new HashMap with a specific inital capacity and load factor * ! * @param initialCapacity the initial capacity (>=0) ! * @param loadFactor the load factor ! * ! * @throws IllegalArgumentException if (initialCapacity < 0) || ! * (loadFactor <= 0) */ public HashMap(int initialCapacity, float loadFactor) - throws IllegalArgumentException { if (initialCapacity < 0) ! throw new IllegalArgumentException("Illegal Initial Capacity: " ! + initialCapacity); ! if (loadFactor <= 0) ! throw new IllegalArgumentException("Illegal Load Factor: " + loadFactor); if (initialCapacity == 0) initialCapacity = 1; ! buckets = new Entry[initialCapacity]; this.loadFactor = loadFactor; ! this.threshold = (int) (initialCapacity * loadFactor); } ! /** returns the number of kay-value mappings currently in this Map */ public int size() { return size; } - /** returns true if there are no key-value mappings currently in this Map */ - public boolean isEmpty() - { - return size == 0; - } - /** ! * returns true if this HashMap contains a value

          o
          , such that ! *
          o.equals(value)
          . * ! * @param value the value to search for in this Hashtable */ ! public boolean containsValue(Object value) { ! for (int i = 0; i < buckets.length; i++) ! { ! Entry e = buckets[i]; ! while (e != null) ! { ! if (value == null ? e.value == null : value.equals(e.value)) ! return true; ! e = e.next; ! } ! } ! return false; } ! /** ! * returns true if the supplied object equals (
          equals()
          ) a key ! * in this HashMap * ! * @param key the key to search for in this HashMap */ ! public boolean containsKey(Object key) { int idx = hash(key); ! Entry e = buckets[idx]; while (e != null) { ! if (key == null ? e.key == null : key.equals(e.key)) ! return true; ! e = e.next; } ! return false; } /** ! * return the value in this Hashtable associated with the supplied key, or
          null
          ! * if the key maps to nothing * ! * @param key the key for which to fetch an associated value */ ! public Object get(Object key) { int idx = hash(key); ! Entry e = buckets[idx]; while (e != null) { ! if (key == null ? e.key == null : key.equals(e.key)) ! return e.value; ! e = e.next; } ! return null; } /** ! * puts the supplied value into the Map, mapped by the supplied key * ! * @param key the HashMap key used to locate the value ! * @param value the value to be stored in the HashMap */ public Object put(Object key, Object value) { - modCount++; int idx = hash(key); ! Entry e = buckets[idx]; ! while (e != null) { ! if (key == null ? e.key == null : key.equals(e.key)) ! { ! Object r = e.value; ! e.value = value; ! return r; ! } ! else ! { ! e = e.next; ! } } ! // At this point, we know we need to add a new entry. if (++size > threshold) { ! rehash(); ! // Need a new hash value to suit the bigger table. ! idx = hash(key); } ! e = new Entry(key, value); ! ! e.next = buckets[idx]; ! buckets[idx] = e; ! return null; } /** ! * removes from the HashMap and returns the value which is mapped by the ! * supplied key; if the key maps to nothing, then the HashMap remains unchanged, ! * and
          null
          is returned * ! * @param key the key used to locate the value to remove from the HashMap */ public Object remove(Object key) { - modCount++; int idx = hash(key); ! Entry e = buckets[idx]; ! Entry last = null; while (e != null) { ! if (key == null ? e.key == null : key.equals(e.key)) ! { ! if (last == null) ! buckets[idx] = e.next; ! else ! last.next = e.next; ! size--; ! return e.value; ! } ! last = e; ! e = e.next; } return null; } ! public void putAll(Map m) { ! int msize = m.size(); ! Iterator itr = m.entrySet().iterator(); ! ! for (int i=0; i < msize; i++) { ! Map.Entry e = (Map.Entry) itr.next(); ! // Optimize in case the Entry is one of our own. ! if (e instanceof BasicMapEntry) ! { ! BasicMapEntry entry = (BasicMapEntry) e; ! put(entry.key, entry.value); ! } ! else ! { ! put(e.getKey(), e.getValue()); ! } } } ! ! public void clear() { ! modCount++; ! for (int i=0; i < buckets.length; i++) { ! buckets[i] = null; } ! size = 0; } ! /** ! * returns a shallow clone of this HashMap (i.e. the Map itself is cloned, but ! * its contents are not) */ public Object clone() { --- 201,466 ---- } /** ! * Construct a new HashMap from the given Map, with initial capacity ! * the greater of the size of m or the default of 11. ! *

          * ! * Every element in Map m will be put into this new HashMap. ! * ! * @param m a Map whose key / value pairs will be put into the new HashMap. ! * NOTE: key / value pairs are not cloned in this constructor. ! * @throws NullPointerException if m is null */ public HashMap(Map m) { ! this(Math.max(m.size() * 2, DEFAULT_CAPACITY), DEFAULT_LOAD_FACTOR); ! putAllInternal(m); } /** ! * Construct a new HashMap with a specific inital capacity and ! * default load factor of 0.75. * ! * @param initialCapacity the initial capacity of this HashMap (>=0) ! * @throws IllegalArgumentException if (initialCapacity < 0) */ ! public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } /** ! * Construct a new HashMap with a specific inital capacity and load factor. * ! * @param initialCapacity the initial capacity (>=0) ! * @param loadFactor the load factor (> 0, not NaN) ! * @throws IllegalArgumentException if (initialCapacity < 0) || ! * ! (loadFactor > 0.0) */ public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) ! throw new IllegalArgumentException("Illegal Capacity: " ! + initialCapacity); ! if (! (loadFactor > 0)) // check for NaN too ! throw new IllegalArgumentException("Illegal Load: " + loadFactor); if (initialCapacity == 0) initialCapacity = 1; ! buckets = new HashEntry[initialCapacity]; this.loadFactor = loadFactor; ! threshold = (int) (initialCapacity * loadFactor); } ! /** ! * Returns the number of kay-value mappings currently in this Map. ! * ! * @return the size ! */ public int size() { return size; } /** ! * Returns true if there are no key-value mappings currently in this Map. * ! * @return size() == 0 */ ! public boolean isEmpty() { ! return size == 0; } ! /** ! * Return the value in this HashMap associated with the supplied key, ! * or null if the key maps to nothing. NOTE: Since the value ! * could also be null, you must use containsKey to see if this key ! * actually maps to something. * ! * @param key the key for which to fetch an associated value ! * @return what the key maps to, if present ! * @see #put(Object, Object) ! * @see #containsKey(Object) */ ! public Object get(Object key) { int idx = hash(key); ! HashEntry e = buckets[idx]; while (e != null) { ! if (equals(key, e.key)) ! return e.value; ! e = e.next; } ! return null; } /** ! * Returns true if the supplied object equals() a key ! * in this HashMap. * ! * @param key the key to search for in this HashMap ! * @return true if the key is in the table ! * @see #containsValue(Object) */ ! public boolean containsKey(Object key) { int idx = hash(key); ! HashEntry e = buckets[idx]; while (e != null) { ! if (equals(key, e.key)) ! return true; ! e = e.next; } ! return false; } /** ! * Puts the supplied value into the Map, mapped by the supplied key. ! * The value may be retrieved by any object which equals() ! * this key. NOTE: Since the prior value could also be null, you must ! * first use containsKey if you want to see if you are replacing the ! * key's mapping. * ! * @param key the key used to locate the value ! * @param value the value to be stored in the HashMap ! * @return the prior mapping of the key, or null if there was none ! * @see #get(Object) ! * @see Object#equals(Object) */ public Object put(Object key, Object value) { int idx = hash(key); ! HashEntry e = buckets[idx]; ! while (e != null) { ! if (equals(key, e.key)) ! // Must use this method for necessary bookkeeping in LinkedHashMap. ! return e.setValue(value); ! else ! e = e.next; } ! // At this point, we know we need to add a new entry. + modCount++; if (++size > threshold) { ! rehash(); ! // Need a new hash value to suit the bigger table. ! idx = hash(key); } ! // LinkedHashMap cannot override put(), hence this call. ! addEntry(key, value, idx, true); return null; } /** ! * Copies all elements of the given map into this hashtable. If this table ! * already has a mapping for a key, the new mapping replaces the current ! * one. * ! * @param m the map to be hashed into this ! */ ! public void putAll(Map m) ! { ! Iterator itr = m.entrySet().iterator(); ! ! for (int msize = m.size(); msize > 0; msize--) ! { ! Map.Entry e = (Map.Entry) itr.next(); ! // Optimize in case the Entry is one of our own. ! if (e instanceof BasicMapEntry) ! { ! BasicMapEntry entry = (BasicMapEntry) e; ! put(entry.key, entry.value); ! } ! else ! { ! put(e.getKey(), e.getValue()); ! } ! } ! } ! ! /** ! * Removes from the HashMap and returns the value which is mapped by the ! * supplied key. If the key maps to nothing, then the HashMap remains ! * unchanged, and null is returned. NOTE: Since the value ! * could also be null, you must use containsKey to see if you are ! * actually removing a mapping. ! * ! * @param key the key used to locate the value to remove ! * @return whatever the key mapped to, if present */ public Object remove(Object key) { int idx = hash(key); ! HashEntry e = buckets[idx]; ! HashEntry last = null; while (e != null) { ! if (equals(key, e.key)) ! { ! modCount++; ! if (last == null) ! buckets[idx] = e.next; ! else ! last.next = e.next; ! size--; ! // Method call necessary for LinkedHashMap to work correctly. ! return e.cleanup(); ! } ! last = e; ! e = e.next; } return null; } ! /** ! * Clears the Map so it has no keys. This is O(1). ! */ ! public void clear() { ! if (size != 0) { ! modCount++; ! Arrays.fill(buckets, null); ! size = 0; } } ! ! /** ! * Returns true if this HashMap contains a value o, such that ! * o.equals(value). ! * ! * @param value the value to search for in this HashMap ! * @return true if at least one key maps to the value ! * @see containsKey(Object) ! */ ! public boolean containsValue(Object value) { ! for (int i = buckets.length - 1; i >= 0; i--) { ! HashEntry e = buckets[i]; ! while (e != null) ! { ! if (equals(value, e.value)) ! return true; ! e = e.next; ! } } ! return false; } ! /** ! * Returns a shallow clone of this HashMap. The Map itself is cloned, ! * but its contents are not. This is O(n). ! * ! * @return the clone */ public Object clone() { *************** public class HashMap extends AbstractMap *** 363,618 **** } catch (CloneNotSupportedException x) { } ! copy.buckets = new Entry[buckets.length]; ! ! for (int i=0; i < buckets.length; i++) ! { ! Entry e = buckets[i]; ! Entry last = null; ! ! while (e != null) ! { ! if (last == null) ! { ! copy.buckets[i] = new Entry(e.key, e.value); ! last = copy.buckets[i]; ! } ! else ! { ! last.next = new Entry(e.key, e.value); ! last = last.next; ! } ! e = e.next; ! } ! } return copy; } ! /** returns a "set view" of this HashMap's keys */ public Set keySet() { ! // Create an AbstractSet with custom implementations of those methods that ! // can be overriden easily and efficiently. ! return new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new HashIterator(HashIterator.KEYS); ! } ! ! public void clear() { ! HashMap.this.clear(); ! } ! public boolean contains(Object o) ! { ! return HashMap.this.containsKey(o); ! } ! ! public boolean remove(Object o) ! { ! // Test against the size of the HashMap to determine if anything ! // really got removed. This is neccessary because the return value of ! // HashMap.remove() is ambiguous in the null case. ! int oldsize = size; ! HashMap.this.remove(o); ! return (oldsize != size); ! } ! }; } ! ! /** Returns a "collection view" (or "bag view") of this HashMap's values. */ public Collection values() { ! // We don't bother overriding many of the optional methods, as doing so ! // wouldn't provide any significant performance advantage. ! return new AbstractCollection() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new HashIterator(HashIterator.VALUES); ! } ! ! public void clear() { ! HashMap.this.clear(); ! } ! }; } ! /** Returns a "set view" of this HashMap's entries. */ public Set entrySet() { ! // Create an AbstractSet with custom implementations of those methods that ! // can be overriden easily and efficiently. ! return new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new HashIterator(HashIterator.ENTRIES); ! } ! ! public void clear() { ! HashMap.this.clear(); ! } ! public boolean contains(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Entry e = getEntry(me); ! return (e != null); ! } ! ! public boolean remove(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Entry e = getEntry(me); ! if (e != null) ! { ! HashMap.this.remove(e.key); ! return true; ! } ! return false; ! } ! }; } ! ! /** Return an index in the buckets array for `key' based on its hashCode() */ ! private int hash(Object key) { ! if (key == null) ! return 0; ! else ! return Math.abs(key.hashCode() % buckets.length); } ! /** Return an Entry who's key and value equal the supplied Map.Entry. ! * This is used by entrySet's contains() and remove() methods. They can't ! * use contains(key) and remove(key) directly because that would result ! * in entries with the same key but a different value being matched. */ ! private Entry getEntry(Map.Entry me) { int idx = hash(me.getKey()); ! Entry e = buckets[idx]; while (e != null) { if (e.equals(me)) ! return e; ! e = e.next; } return null; } ! ! /** ! * increases the size of the HashMap and rehashes all keys to new array ! * indices; this is called when the addition of a new value would cause ! * size() > threshold. Note that the existing Entry objects are reused in * the new hash table. */ private void rehash() { ! Entry[] oldBuckets = buckets; ! int newcapacity = (buckets.length * 2) + 1; threshold = (int) (newcapacity * loadFactor); ! buckets = new Entry[newcapacity]; ! ! for (int i = 0; i < oldBuckets.length; i++) { ! Entry e = oldBuckets[i]; while (e != null) ! { ! int idx = hash(e.key); ! Entry dest = buckets[idx]; ! if (dest != null) ! { ! while (dest.next != null) ! dest = dest.next; ! dest.next = e; ! } ! else ! { ! buckets[idx] = e; ! } ! Entry next = e.next; ! e.next = null; ! e = next; ! } } } /** * Serializes this object to the given stream. ! * @serialdata the capacity(int) that is the length of the ! * bucket array, the size(int) of the hash map are emitted ! * first. They are followed by size entries, each consisting of ! * a key (Object) and a value (Object). */ private void writeObject(ObjectOutputStream s) throws IOException { ! // the threshold and loadFactor fields s.defaultWriteObject(); s.writeInt(buckets.length); s.writeInt(size); ! Iterator it = entrySet().iterator(); while (it.hasNext()) { ! Map.Entry entry = (Map.Entry) it.next(); ! s.writeObject(entry.getKey()); ! s.writeObject(entry.getValue()); } } /** * Deserializes this object from the given stream. ! * @serialdata the capacity(int) that is the length of the ! * bucket array, the size(int) of the hash map are emitted ! * first. They are followed by size entries, each consisting of ! * a key (Object) and a value (Object). */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ! // the threshold and loadFactor fields s.defaultReadObject(); ! int capacity = s.readInt(); int len = s.readInt(); - size = 0; - modCount = 0; - buckets = new Entry[capacity]; ! for (int i = 0; i < len; i++) ! { ! Object key = s.readObject(); ! Object value = s.readObject(); ! put(key, value); ! } } /** --- 471,809 ---- } catch (CloneNotSupportedException x) { + // This is impossible. } ! copy.buckets = new HashEntry[buckets.length]; ! copy.putAllInternal(this); ! // Clear the entry cache. AbstractMap.clone() does the others. ! copy.entries = null; return copy; } ! /** ! * Returns a "set view" of this HashMap's keys. The set is backed by the ! * HashMap, so changes in one show up in the other. The set supports ! * element removal, but not element addition. ! * ! * @return a set view of the keys ! * @see #values() ! * @see #entrySet() ! */ public Set keySet() { ! if (keys == null) ! // Create an AbstractSet with custom implementations of those methods ! // that can be overridden easily and efficiently. ! keys = new AbstractSet() { ! public int size() ! { ! return size; ! } ! public Iterator iterator() ! { ! // Cannot create the iterator directly, because of LinkedHashMap. ! return HashMap.this.iterator(KEYS); ! } ! ! public void clear() ! { ! HashMap.this.clear(); ! } ! ! public boolean contains(Object o) ! { ! return containsKey(o); ! } ! ! public boolean remove(Object o) ! { ! // Test against the size of the HashMap to determine if anything ! // really got removed. This is neccessary because the return value ! // of HashMap.remove() is ambiguous in the null case. ! int oldsize = size; ! HashMap.this.remove(o); ! return oldsize != size; ! } ! }; ! return keys; } ! ! /** ! * Returns a "collection view" (or "bag view") of this HashMap's values. ! * The collection is backed by the HashMap, so changes in one show up ! * in the other. The collection supports element removal, but not element ! * addition. ! * ! * @return a bag view of the values ! * @see #keySet() ! * @see #entrySet() ! */ public Collection values() { ! if (values == null) ! // We don't bother overriding many of the optional methods, as doing so ! // wouldn't provide any significant performance advantage. ! values = new AbstractCollection() { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! // Cannot create the iterator directly, because of LinkedHashMap. ! return HashMap.this.iterator(VALUES); ! } ! ! public void clear() ! { ! HashMap.this.clear(); ! } ! }; ! return values; } ! /** ! * Returns a "set view" of this HashMap's entries. The set is backed by ! * the HashMap, so changes in one show up in the other. The set supports ! * element removal, but not element addition.

          ! * ! * Note that the iterators for all three views, from keySet(), entrySet(), ! * and values(), traverse the HashMap in the same sequence. ! * ! * @return a set view of the entries ! * @see #keySet() ! * @see #values() ! * @see Map.Entry ! */ public Set entrySet() { ! if (entries == null) ! // Create an AbstractSet with custom implementations of those methods ! // that can be overridden easily and efficiently. ! entries = new AbstractSet() { ! public int size() ! { ! return size; ! } ! public Iterator iterator() ! { ! // Cannot create the iterator directly, because of LinkedHashMap. ! return HashMap.this.iterator(ENTRIES); ! } ! ! public void clear() ! { ! HashMap.this.clear(); ! } ! ! public boolean contains(Object o) ! { ! return getEntry(o) != null; ! } ! ! public boolean remove(Object o) ! { ! HashEntry e = getEntry(o); ! if (e != null) ! { ! HashMap.this.remove(e.key); ! return true; ! } ! return false; ! } ! }; ! return entries; } ! ! /** ! * Helper method for put, that creates and adds a new Entry. This is ! * overridden in LinkedHashMap for bookkeeping purposes. ! * ! * @param key the key of the new Entry ! * @param value the value ! * @param idx the index in buckets where the new Entry belongs ! * @param callRemove whether to call the removeEldestEntry method ! * @see #put(Object, Object) ! */ ! void addEntry(Object key, Object value, int idx, boolean callRemove) { ! HashEntry e = new HashEntry(key, value); ! ! e.next = buckets[idx]; ! buckets[idx] = e; } ! /** ! * Helper method for entrySet(), which matches both key and value ! * simultaneously. ! * ! * @param o the entry to match ! * @return the matching entry, if found, or null ! * @see #entrySet() ! */ ! private HashEntry getEntry(Object o) { + if (!(o instanceof Map.Entry)) + return null; + Map.Entry me = (Map.Entry) o; int idx = hash(me.getKey()); ! HashEntry e = buckets[idx]; while (e != null) { if (e.equals(me)) ! return e; ! e = e.next; } return null; } ! ! /** ! * Helper method that returns an index in the buckets array for `key' ! * based on its hashCode(). Package visible for use by subclasses. ! * ! * @param key the key ! * @return the bucket number ! */ ! final int hash(Object key) ! { ! return key == null ? 0 : Math.abs(key.hashCode() % buckets.length); ! } ! ! /** ! * Generates a parameterized iterator. Must be overrideable, since ! * LinkedHashMap iterates in a different order. ! * ! * @param type {@link #KEYS}, {@link #VALUES}, or {@link #ENTRIES} ! * @return the appropriate iterator ! */ ! Iterator iterator(int type) ! { ! return new HashIterator(type); ! } ! ! /** ! * A simplified, more efficient internal implementation of putAll(). The ! * Map constructor and clone() should not call putAll or put, in order to ! * be compatible with the JDK implementation with respect to subclasses. ! * ! * @param m the map to initialize this from ! */ ! void putAllInternal(Map m) ! { ! Iterator itr = m.entrySet().iterator(); ! int msize = m.size(); ! this.size = msize; ! ! for (; msize > 0; msize--) ! { ! Map.Entry e = (Map.Entry) itr.next(); ! Object key = e.getKey(); ! int idx = hash(key); ! addEntry(key, e.getValue(), idx, false); ! } ! } ! ! /** ! * Increases the size of the HashMap and rehashes all keys to new array ! * indices; this is called when the addition of a new value would cause ! * size() > threshold. Note that the existing Entry objects are reused in * the new hash table. + *

          + * + * This is not specified, but the new size is twice the current size plus + * one; this number is not always prime, unfortunately. */ private void rehash() { ! HashEntry[] oldBuckets = buckets; ! int newcapacity = (buckets.length * 2) + 1; threshold = (int) (newcapacity * loadFactor); ! buckets = new HashEntry[newcapacity]; ! ! for (int i = oldBuckets.length - 1; i >= 0; i--) { ! HashEntry e = oldBuckets[i]; while (e != null) ! { ! int idx = hash(e.key); ! HashEntry dest = buckets[idx]; ! if (dest != null) ! { ! while (dest.next != null) ! dest = dest.next; ! dest.next = e; ! } ! else ! { ! buckets[idx] = e; ! } ! HashEntry next = e.next; ! e.next = null; ! e = next; ! } } } /** * Serializes this object to the given stream. ! * ! * @param s the stream to write to ! * @throws IOException if the underlying stream fails ! * @serialData the capacity(int) that is the length of the ! * bucket array, the size(int) of the hash map ! * are emitted first. They are followed by size entries, ! * each consisting of a key (Object) and a value (Object). */ private void writeObject(ObjectOutputStream s) throws IOException { ! // Write the threshold and loadFactor fields. s.defaultWriteObject(); s.writeInt(buckets.length); s.writeInt(size); ! // Avoid creating a wasted Set by creating the iterator directly. ! Iterator it = iterator(ENTRIES); while (it.hasNext()) { ! HashEntry entry = (HashEntry) it.next(); ! s.writeObject(entry.key); ! s.writeObject(entry.value); } } /** * Deserializes this object from the given stream. ! * ! * @param s the stream to read from ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @serialData the capacity(int) that is the length of the ! * bucket array, the size(int) of the hash map ! * are emitted first. They are followed by size entries, ! * each consisting of a key (Object) and a value (Object). */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ! // Read the threshold and loadFactor fields. s.defaultReadObject(); ! // Read and use capacity. ! buckets = new HashEntry[s.readInt()]; int len = s.readInt(); ! // Read and use key/value pairs. ! for ( ; len > 0; len--) ! put(s.readObject(), s.readObject()); } /** *************** public class HashMap extends AbstractMap *** 620,712 **** * This implementation is parameterized to give a sequential view of * keys, values, or entries. * ! * @author Jon Zeppieri */ ! class HashIterator implements Iterator { ! static final int KEYS = 0, ! VALUES = 1, ! ENTRIES = 2; ! ! // the type of this Iterator: KEYS, VALUES, or ENTRIES. ! int type; ! // the number of modifications to the backing Hashtable that we know about. ! int knownMod; ! // The total number of elements returned by next(). Used to determine if ! // there are more elements remaining. ! int count; ! // Current index in the physical hash table. ! int idx; ! // The last Entry returned by a next() call. ! Entry last; ! // The next entry that should be returned by next(). It is set to something ! // if we're iterating through a bucket that contains multiple linked ! // entries. It is null if next() needs to find a new bucket. ! Entry next; ! /* construct a new HashtableIterator with the supllied type: ! KEYS, VALUES, or ENTRIES */ HashIterator(int type) { this.type = type; - knownMod = HashMap.this.modCount; - count = 0; - idx = buckets.length; } ! /** returns true if the Iterator has more elements */ public boolean hasNext() { ! if (knownMod != HashMap.this.modCount) ! throw new ConcurrentModificationException(); ! return count < size; } ! /** returns the next element in the Iterator's sequential view */ public Object next() { ! if (knownMod != HashMap.this.modCount) ! throw new ConcurrentModificationException(); ! if (count == size) throw new NoSuchElementException(); ! count++; ! Entry e = null; ! if (next != null) ! e = next; while (e == null) ! { ! e = buckets[--idx]; ! } next = e.next; last = e; if (type == VALUES) return e.value; ! else if (type == KEYS) return e.key; return e; } ! /** ! * removes from the backing HashMap the last element which was fetched with the ! *

          next()
          method */ public void remove() { ! if (knownMod != HashMap.this.modCount) ! throw new ConcurrentModificationException(); if (last == null) ! { ! throw new IllegalStateException(); ! } ! else ! { ! HashMap.this.remove(last.key); ! knownMod++; ! count--; ! last = null; ! } } } } --- 811,906 ---- * This implementation is parameterized to give a sequential view of * keys, values, or entries. * ! * @author Jon Zeppieri */ ! private final class HashIterator implements Iterator { ! /** ! * The type of this Iterator: {@link #KEYS}, {@link #VALUES}, ! * or {@link #ENTRIES}. ! */ ! private final int type; ! /** ! * The number of modifications to the backing HashMap that we know about. ! */ ! private int knownMod = modCount; ! /** The number of elements remaining to be returned by next(). */ ! private int count = size; ! /** Current index in the physical hash table. */ ! private int idx = buckets.length; ! /** The last Entry returned by a next() call. */ ! private HashEntry last; ! /** ! * The next entry that should be returned by next(). It is set to something ! * if we're iterating through a bucket that contains multiple linked ! * entries. It is null if next() needs to find a new bucket. ! */ ! private HashEntry next; ! /** ! * Construct a new HashIterator with the supplied type. ! * @param type {@link #KEYS}, {@link #VALUES}, or {@link #ENTRIES} ! */ HashIterator(int type) { this.type = type; } ! /** ! * Returns true if the Iterator has more elements. ! * @return true if there are more elements ! * @throws ConcurrentModificationException if the HashMap was modified ! */ public boolean hasNext() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! return count > 0; } ! /** ! * Returns the next element in the Iterator's sequential view. ! * @return the next element ! * @throws ConcurrentModificationException if the HashMap was modified ! * @throws NoSuchElementException if there is none ! */ public Object next() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! if (count == 0) throw new NoSuchElementException(); ! count--; ! HashEntry e = next; while (e == null) ! e = buckets[--idx]; next = e.next; last = e; if (type == VALUES) return e.value; ! if (type == KEYS) return e.key; return e; } ! /** ! * Removes from the backing HashMap the last element which was fetched ! * with the next() method. ! * @throws ConcurrentModificationException if the HashMap was modified ! * @throws IllegalStateException if called when there is no last element */ public void remove() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); if (last == null) ! throw new IllegalStateException(); ! ! HashMap.this.remove(last.key); ! last = null; ! knownMod++; } } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/HashSet.java gcc-3.1/libjava/java/util/HashSet.java *** gcc-3.0.4/libjava/java/util/HashSet.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/HashSet.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** ! /* HashSet.java -- a class providing a HashMap-backet Set ! Copyright (C) 1998, 1999 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- ! /* HashSet.java -- a class providing a HashMap-backed Set ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.ObjectInputStream; *** 33,121 **** import java.io.ObjectOutputStream; /** ! * This class provides a HashMap-backed implementation of the ! * Set interface. ! * ! * Each element in the Set is a key in the backing HashMap; each key ! * maps to a static token, denoting that the key does, in fact, exist. * * Most operations are O(1), assuming no hash collisions. In the worst ! * case (where all hases collide), operations are O(n). * ! * HashSet is a part of the JDK1.2 Collections API. * ! * @author Jon Zeppieri ! * @version $Revision: 1.1.4.1 $ ! * @modified $Id: HashSet.java,v 1.1.4.1 2001/02/17 01:06:45 bryce Exp $ */ public class HashSet extends AbstractSet implements Set, Cloneable, Serializable { ! /** the HashMap which backs this Set */ ! transient HashMap map; ! static final long serialVersionUID = -5024744406713321676L; /** ! * construct a new, empty HashSet whose backing HashMap has the default ! * capacity and loadFacor */ public HashSet() { ! map = new HashMap(); } /** ! * construct a new, empty HashSet whose backing HashMap has the supplied ! * capacity and the default load factor * ! * @param initialCapacity the initial capacity of the backing ! * HashMap */ public HashSet(int initialCapacity) { ! map = new HashMap(initialCapacity); } /** ! * construct a new, empty HashSet whose backing HashMap has the supplied ! * capacity and load factor * ! * @param initialCapacity the initial capacity of the backing ! * HashMap ! * @param loadFactor the load factor of the backing HashMap */ public HashSet(int initialCapacity, float loadFactor) { ! map = new HashMap(initialCapacity, loadFactor); } /** ! * construct a new HashSet with the same elements as are in the supplied ! * collection (eliminating any duplicates, of course; the backing HashMap ! * will have the default capacity and load factor * ! * @param c a collection containing the elements with ! * which this set will be initialized */ public HashSet(Collection c) { ! map = new HashMap(); addAll(c); } /** ! * adds the given Object to the set if it is not already in the Set, ! * returns true if teh element was added, false otherwise * ! * @param o the Object to add to this Set */ public boolean add(Object o) { ! return (map.put(o, Boolean.TRUE) == null); } /** ! * empties this Set of all elements; this is a fast operation [O(1)] */ public void clear() { --- 44,158 ---- import java.io.ObjectOutputStream; /** ! * This class provides a HashMap-backed implementation of the Set interface. ! *

          * * Most operations are O(1), assuming no hash collisions. In the worst ! * case (where all hashes collide), operations are O(n). Setting the ! * initial capacity too low will force many resizing operations, but ! * setting the initial capacity too high (or loadfactor too low) leads ! * to wasted memory and slower iteration. ! *

          * ! * HashSet accepts the null key and null values. It is not synchronized, ! * so if you need multi-threaded access, consider using:
          ! * Set s = Collections.synchronizedSet(new HashSet(...)); ! *

          * ! * The iterators are fail-fast, meaning that any structural ! * modification, except for remove() called on the iterator ! * itself, cause the iterator to throw a ! * {@link ConcurrentModificationException} rather than exhibit ! * non-deterministic behavior. ! * ! * @author Jon Zeppieri ! * @author Eric Blake ! * @see Collection ! * @see Set ! * @see TreeSet ! * @see Collections#synchronizedSet(Set) ! * @see HashMap ! * @see LinkedHashSet ! * @since 1.2 ! * @status updated to 1.4 */ public class HashSet extends AbstractSet implements Set, Cloneable, Serializable { ! /** ! * Compatible with JDK 1.2. ! */ ! private static final long serialVersionUID = -5024744406713321676L; /** ! * The HashMap which backs this Set. ! */ ! private transient HashMap map; ! ! /** ! * Construct a new, empty HashSet whose backing HashMap has the default ! * capacity (11) and loadFacor (0.75). */ public HashSet() { ! this(HashMap.DEFAULT_CAPACITY, HashMap.DEFAULT_LOAD_FACTOR); } /** ! * Construct a new, empty HashSet whose backing HashMap has the supplied ! * capacity and the default load factor (0.75). * ! * @param initialCapacity the initial capacity of the backing HashMap ! * @throws IllegalArgumentException if the capacity is negative */ public HashSet(int initialCapacity) { ! this(initialCapacity, HashMap.DEFAULT_LOAD_FACTOR); } /** ! * Construct a new, empty HashSet whose backing HashMap has the supplied ! * capacity and load factor. * ! * @param initialCapacity the initial capacity of the backing HashMap ! * @param loadFactor the load factor of the backing HashMap ! * @throws IllegalArgumentException if either argument is negative, or ! * if loadFactor is POSITIVE_INFINITY or NaN */ public HashSet(int initialCapacity, float loadFactor) { ! map = init(initialCapacity, loadFactor); } /** ! * Construct a new HashSet with the same elements as are in the supplied ! * collection (eliminating any duplicates, of course). The backing storage ! * has twice the size of the collection, or the default size of 11, ! * whichever is greater; and the default load factor (0.75). * ! * @param c a collection of initial set elements ! * @throws NullPointerException if c is null */ public HashSet(Collection c) { ! this(Math.max(2 * c.size(), HashMap.DEFAULT_CAPACITY)); addAll(c); } /** ! * Adds the given Object to the set if it is not already in the Set. ! * This set permits a null element. * ! * @param o the Object to add to this Set ! * @return true if the set did not already contain o */ public boolean add(Object o) { ! return map.put(o, "") == null; } /** ! * Empties this Set of all elements; this takes constant time. */ public void clear() { *************** public class HashSet extends AbstractSet *** 123,175 **** } /** ! * returns a shallow copy of this Set (the Set itself is cloned; its ! * elements are not) */ public Object clone() { HashSet copy = null; try { ! copy = (HashSet) super.clone(); } catch (CloneNotSupportedException x) { } copy.map = (HashMap) map.clone(); return copy; } /** ! * returns true if the supplied element is in this Set, false otherwise * ! * @param o the Object whose presence in this Set we are testing for */ public boolean contains(Object o) { return map.containsKey(o); } ! /** ! * returns true if this set has no elements in it (size() == 0) */ public boolean isEmpty() { ! return map.isEmpty(); } /** ! * returns an Iterator over the elements of this Set; the Iterator allows ! * removal of elements */ public Iterator iterator() { ! return map.keySet().iterator(); } /** ! * removes the supplied Object from this Set if it is in the Set; returns ! * true if an element was removed, false otherwise */ public boolean remove(Object o) { --- 160,226 ---- } /** ! * Returns a shallow copy of this Set. The Set itself is cloned; its ! * elements are not. ! * ! * @return a shallow clone of the set */ public Object clone() { HashSet copy = null; try { ! copy = (HashSet) super.clone(); } catch (CloneNotSupportedException x) { + // Impossible to get here. } copy.map = (HashMap) map.clone(); return copy; } /** ! * Returns true if the supplied element is in this Set. * ! * @param o the Object to look for ! * @return true if it is in the set */ public boolean contains(Object o) { return map.containsKey(o); } ! /** ! * Returns true if this set has no elements in it. ! * ! * @return size() == 0. */ public boolean isEmpty() { ! return map.size == 0; } /** ! * Returns an Iterator over the elements of this Set, which visits the ! * elements in no particular order. For this class, the Iterator allows ! * removal of elements. The iterator is fail-fast, and will throw a ! * ConcurrentModificationException if the set is modified externally. ! * ! * @return a set iterator ! * @see ConcurrentModificationException */ public Iterator iterator() { ! // Avoid creating intermediate keySet() object by using non-public API. ! return map.iterator(HashMap.KEYS); } /** ! * Removes the supplied Object from this Set if it is in the Set. ! * ! * @param o the object to remove ! * @return true if an element was removed */ public boolean remove(Object o) { *************** public class HashSet extends AbstractSet *** 177,194 **** } /** ! * returns the number of elements in this Set */ public int size() { ! return map.size(); } ! /** Serialize this Object in a manner which is binary-compatible with the ! * JDK */ private void writeObject(ObjectOutputStream s) throws IOException { ! Iterator it = iterator(); s.writeInt(map.buckets.length); s.writeFloat(map.loadFactor); s.writeInt(map.size); --- 228,269 ---- } /** ! * Returns the number of elements in this Set (its cardinality). ! * ! * @return the size of the set */ public int size() { ! return map.size; } ! /** ! * Helper method which initializes the backing Map. Overridden by ! * LinkedHashSet for correct semantics. ! * ! * @param capacity the initial capacity ! * @param load the initial load factor ! * @return the backing HashMap ! */ ! HashMap init(int capacity, float load) ! { ! return new HashMap(capacity, load); ! } ! ! /** ! * Serializes this object to the given stream. ! * ! * @param s the stream to write to ! * @throws IOException if the underlying stream fails ! * @serialData the capacity (int) and loadFactor (float) ! * of the backing store, followed by the set size (int), ! * then a listing of its elements (Object) in no order ! */ private void writeObject(ObjectOutputStream s) throws IOException { ! s.defaultWriteObject(); ! // Avoid creating intermediate keySet() object by using non-public API. ! Iterator it = map.iterator(HashMap.KEYS); s.writeInt(map.buckets.length); s.writeFloat(map.loadFactor); s.writeInt(map.size); *************** public class HashSet extends AbstractSet *** 196,220 **** s.writeObject(it.next()); } ! /** Deserialize this Object in a manner which is binary-compatible with ! * the JDK */ ! private void readObject(ObjectInputStream s) throws IOException, ! ClassNotFoundException { ! int i, size, capacity; ! float loadFactor; ! Object element; ! ! capacity = s.readInt(); ! loadFactor = s.readFloat(); ! size = s.readInt(); ! ! map = new HashMap(capacity, loadFactor); ! for (i = 0; i < size; i++) ! { ! element = s.readObject(); ! map.put(element, Boolean.TRUE); ! } } } --- 271,293 ---- s.writeObject(it.next()); } ! /** ! * Deserializes this object from the given stream. ! * ! * @param s the stream to read from ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @serialData the capacity (int) and loadFactor (float) ! * of the backing store, followed by the set size (int), ! * then a listing of its elements (Object) in no order ! */ ! private void readObject(ObjectInputStream s) ! throws IOException, ClassNotFoundException { ! s.defaultReadObject(); ! map = init(s.readInt(), s.readFloat()); ! for (int size = s.readInt(); size > 0; size--) ! map.put(s.readObject(), ""); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Hashtable.java gcc-3.1/libjava/java/util/Hashtable.java *** gcc-3.0.4/libjava/java/util/Hashtable.java Sat Mar 24 08:06:26 2001 --- gcc-3.1/libjava/java/util/Hashtable.java Sun Apr 7 12:15:36 2002 *************** *** 1,6 **** /* Hashtable.java -- a class providing a basic hashtable data structure, mapping Object --> Object ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- /* Hashtable.java -- a class providing a basic hashtable data structure, mapping Object --> Object ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 8,14 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 8,14 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.ObjectOutputStream; *** 37,56 **** // code. /** ! * a class which implements a Hashtable data structure * * This implementation of Hashtable uses a hash-bucket approach. That is: * linear probing and rehashing is avoided; instead, each hashed value maps * to a simple linked-list which, in the best case, only has one node. * Assuming a large enough table, low enough load factor, and / or well ! * implemented hashCode() methods, Hashtable should provide O(1) * insertion, deletion, and searching of keys. Hashtable is O(n) in ! * the worst case for all of these (if all keys has to the same bucket). * ! * This is a JDK-1.2 compliant implementation of Hashtable. As such, it * belongs, partially, to the Collections framework (in that it implements ! * Map). For backwards compatibility, it inherits from the obsolete and * utterly useless Dictionary class. * * Being a hybrid of old and new, Hashtable has methods which provide redundant * capability, but with subtle and even crucial differences. --- 48,70 ---- // code. /** ! * A class which implements a hashtable data structure. ! *

          * * This implementation of Hashtable uses a hash-bucket approach. That is: * linear probing and rehashing is avoided; instead, each hashed value maps * to a simple linked-list which, in the best case, only has one node. * Assuming a large enough table, low enough load factor, and / or well ! * implemented hashCode() methods, Hashtable should provide O(1) * insertion, deletion, and searching of keys. Hashtable is O(n) in ! * the worst case for all of these (if all keys hash to the same bucket). ! *

          * ! * This is a JDK-1.2 compliant implementation of Hashtable. As such, it * belongs, partially, to the Collections framework (in that it implements ! * Map). For backwards compatibility, it inherits from the obsolete and * utterly useless Dictionary class. + *

          * * Being a hybrid of old and new, Hashtable has methods which provide redundant * capability, but with subtle and even crucial differences. *************** import java.io.ObjectOutputStream; *** 58,122 **** * either an Iterator (which is the JDK-1.2 way of doing things) or with an * Enumeration. The latter can end up in an undefined state if the Hashtable * changes while the Enumeration is open. * ! * Unlike HashMap, Hashtable does not accept `null' as a key value. * ! * @author Jon Zeppieri ! * @author Warren Levy ! * @author Bryce McKinlay */ ! public class Hashtable extends Dictionary implements Map, Cloneable, Serializable { ! /** Default number of buckets. This is the value the JDK 1.3 uses. Some ! * early documentation specified this value as 101. That is incorrect. */ ! private static final int DEFAULT_CAPACITY = 11; ! /** The defaulty load factor; this is explicitly specified by the spec. */ private static final float DEFAULT_LOAD_FACTOR = 0.75f; private static final long serialVersionUID = 1421746759512286392L; ! /** ! * The rounded product of the capacity and the load factor; when the number ! * of elements exceeds the threshold, the Hashtable calls

          rehash()
          . * @serial */ ! int threshold; ! /** Load factor of this Hashtable: used in computing the threshold. * @serial */ ! float loadFactor = DEFAULT_LOAD_FACTOR; ! /** ! * Array containing the actual key-value mappings */ ! transient Entry[] buckets; ! /** ! * counts the number of modifications this Hashtable has undergone, used ! * by Iterators to know when to throw ConcurrentModificationExceptions. */ transient int modCount; ! /** the size of this Hashtable: denotes the number of key-value pairs */ transient int size; /** * Class to represent an entry in the hash table. Holds a single key-value * pair. A Hashtable Entry is identical to a HashMap Entry, except that ! * `null' is not allowed for keys and values. */ ! static class Entry extends BasicMapEntry { ! Entry next; ! ! Entry(Object key, Object value) { super(key, value); } ! public final Object setValue(Object newVal) { if (newVal == null) throw new NullPointerException(); --- 72,203 ---- * either an Iterator (which is the JDK-1.2 way of doing things) or with an * Enumeration. The latter can end up in an undefined state if the Hashtable * changes while the Enumeration is open. + *

          * ! * Unlike HashMap, Hashtable does not accept `null' as a key value. Also, ! * all accesses are synchronized: in a single thread environment, this is ! * expensive, but in a multi-thread environment, this saves you the effort ! * of extra synchronization. However, the old-style enumerators are not ! * synchronized, because they can lead to unspecified behavior even if ! * they were synchronized. You have been warned. ! *

          * ! * The iterators are fail-fast, meaning that any structural ! * modification, except for remove() called on the iterator ! * itself, cause the iterator to throw a ! * ConcurrentModificationException rather than exhibit ! * non-deterministic behavior. ! * ! * @author Jon Zeppieri ! * @author Warren Levy ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see HashMap ! * @see TreeMap ! * @see IdentityHashMap ! * @see LinkedHashMap ! * @since 1.0 ! * @status updated to 1.4 */ ! public class Hashtable extends Dictionary implements Map, Cloneable, Serializable { ! /** Default number of buckets. This is the value the JDK 1.3 uses. Some ! * early documentation specified this value as 101. That is incorrect. ! */ ! private static final int DEFAULT_CAPACITY = 11; ! ! /** An "enum" of iterator types. */ ! // Package visible for use by nested classes. ! static final int KEYS = 0, ! VALUES = 1, ! ENTRIES = 2; ! ! /** ! * The default load factor; this is explicitly specified by the spec. ! */ private static final float DEFAULT_LOAD_FACTOR = 0.75f; + /** + * Compatible with JDK 1.0+. + */ private static final long serialVersionUID = 1421746759512286392L; ! /** ! * The rounded product of the capacity and the load factor; when the number ! * of elements exceeds the threshold, the Hashtable calls ! * rehash(). * @serial */ ! private int threshold; ! /** ! * Load factor of this Hashtable: used in computing the threshold. * @serial */ ! private final float loadFactor; ! /** ! * Array containing the actual key-value mappings. */ ! // Package visible for use by nested classes. ! transient HashEntry[] buckets; ! /** ! * Counts the number of modifications this Hashtable has undergone, used ! * by Iterators to know when to throw ConcurrentModificationExceptions. */ + // Package visible for use by nested classes. transient int modCount; ! /** ! * The size of this Hashtable: denotes the number of key-value pairs. ! */ ! // Package visible for use by nested classes. transient int size; /** + * The cache for {@link #keySet()}. + */ + private transient Set keys; + + /** + * The cache for {@link #values()}. + */ + private transient Collection values; + + /** + * The cache for {@link #entrySet()}. + */ + private transient Set entries; + + /** * Class to represent an entry in the hash table. Holds a single key-value * pair. A Hashtable Entry is identical to a HashMap Entry, except that ! * `null' is not allowed for keys and values. */ ! private static final class HashEntry extends BasicMapEntry { ! /** The next entry in the linked list. */ ! HashEntry next; ! ! /** ! * Simple constructor. ! * @param key the key, already guaranteed non-null ! * @param value the value, already guaranteed non-null ! */ ! HashEntry(Object key, Object value) { super(key, value); } ! /** ! * Resets the value. ! * @param newValue the new value ! * @return the prior value ! * @throws NullPointerException if newVal is null ! */ ! public Object setValue(Object newVal) { if (newVal == null) throw new NullPointerException(); *************** public class Hashtable extends Dictionar *** 125,131 **** } /** ! * construct a new Hashtable with the default capacity (11) and the default * load factor (0.75). */ public Hashtable() --- 206,212 ---- } /** ! * Construct a new Hashtable with the default capacity (11) and the default * load factor (0.75). */ public Hashtable() *************** public class Hashtable extends Dictionar *** 134,404 **** } /** ! * construct a new Hashtable from the given Map ! * ! * every element in Map t will be put into this new Hashtable * ! * @param t a Map whose key / value pairs will be put into ! * the new Hashtable. NOTE: key / value pairs ! * are not cloned in this constructor */ public Hashtable(Map m) { ! int size = Math.max(m.size() * 2, DEFAULT_CAPACITY); ! buckets = new Entry[size]; ! threshold = (int) (size * loadFactor); ! putAll(m); } /** ! * construct a new Hashtable with a specific inital capacity ! * ! * @param initialCapacity the initial capacity of this Hashtable (>=0) * ! * @throws IllegalArgumentException if (initialCapacity < 0) */ ! public Hashtable(int initialCapacity) throws IllegalArgumentException { this(initialCapacity, DEFAULT_LOAD_FACTOR); } /** ! * construct a new Hashtable with a specific inital capacity and load factor * ! * @param initialCapacity the initial capacity (>=0) ! * @param loadFactor the load factor ! * ! * @throws IllegalArgumentException if (initialCapacity < 0) || ! * (initialLoadFactor <= 0.0) */ public Hashtable(int initialCapacity, float loadFactor) - throws IllegalArgumentException { if (initialCapacity < 0) ! throw new IllegalArgumentException("Illegal Initial Capacity: " ! + initialCapacity); ! if (loadFactor <= 0) ! throw new IllegalArgumentException("Illegal Load Factor: " + loadFactor); ! if (initialCapacity == 0) ! initialCapacity = 1; ! buckets = new Entry[initialCapacity]; this.loadFactor = loadFactor; ! this.threshold = (int) (initialCapacity * loadFactor); } ! /** Returns the number of key-value mappings currently in this Map */ ! public int size() { return size; } ! /** returns true if there are no key-value mappings currently in this Map */ ! public boolean isEmpty() { return size == 0; } ! public synchronized Enumeration keys() { ! return new Enumerator(Enumerator.KEYS); } ! ! public synchronized Enumeration elements() { ! return new Enumerator(Enumerator.VALUES); } /** ! * returns true if this Hashtable contains a value

          o
          , ! * such that
          o.equals(value)
          . ! * ! * Note: this is one of the old Hashtable methods which does ! * not like null values; it throws NullPointerException if the ! * supplied parameter is null. ! * ! * @param value the value to search for in this Hashtable * ! * @throws NullPointerException if
          value
          is null */ public synchronized boolean contains(Object value) { ! for (int i = 0; i < buckets.length; i++) ! { ! Entry e = buckets[i]; ! while (e != null) ! { ! if (value.equals(e.value)) ! return true; ! e = e.next; ! } ! } ! return false; } /** ! * returns true if this Hashtable contains a value
          o
          , such that ! *
          o.equals(value)
          . ! * ! * @param value the value to search for in this Hashtable * ! * @throws NullPointerException if
          value
          is null */ public boolean containsValue(Object value) { ! return contains(value); } ! /** ! * returns true if the supplied object equals (
          equals()
          ) a key ! * in this Hashtable * ! * @param key the key to search for in this Hashtable */ public synchronized boolean containsKey(Object key) { int idx = hash(key); ! Entry e = buckets[idx]; while (e != null) { if (key.equals(e.key)) ! return true; ! e = e.next; } return false; } /** ! * return the value in this Hashtable associated with the supplied key, or
          null
          ! * if the key maps to nothing * ! * @param key the key for which to fetch an associated value */ public synchronized Object get(Object key) { int idx = hash(key); ! Entry e = buckets[idx]; while (e != null) { if (key.equals(e.key)) ! return e.value; ! e = e.next; } return null; } /** ! * puts the supplied value into the Map, mapped by the supplied key * ! * @param key the key used to locate the value ! * @param value the value to be stored in the table */ public synchronized Object put(Object key, Object value) { - modCount++; int idx = hash(key); ! Entry e = buckets[idx]; ! ! // Hashtable does not accept null values. This method doesn't dereference ! // `value' anywhere, so check for it explicitly. if (value == null) throw new NullPointerException(); while (e != null) { if (key.equals(e.key)) ! { ! Object r = e.value; ! e.value = value; ! return r; ! } ! else ! { ! e = e.next; ! } } ! // At this point, we know we need to add a new entry. if (++size > threshold) { ! rehash(); ! // Need a new hash value to suit the bigger table. ! idx = hash(key); } ! e = new Entry(key, value); ! e.next = buckets[idx]; buckets[idx] = e; ! return null; } /** ! * removes from the table and returns the value which is mapped by the ! * supplied key; if the key maps to nothing, then the table remains ! * unchanged, and
          null
          is returned * ! * @param key the key used to locate the value to remove */ public synchronized Object remove(Object key) { - modCount++; int idx = hash(key); ! Entry e = buckets[idx]; ! Entry last = null; while (e != null) { if (key.equals(e.key)) ! { ! if (last == null) ! buckets[idx] = e.next; ! else ! last.next = e.next; ! size--; ! return e.value; ! } ! last = e; ! e = e.next; } return null; } public synchronized void putAll(Map m) { - int msize = m.size(); Iterator itr = m.entrySet().iterator(); ! ! for (int i=0; i < msize; i++) { Map.Entry e = (Map.Entry) itr.next(); ! // Optimize in case the Entry is one of our own. ! if (e instanceof BasicMapEntry) ! { ! BasicMapEntry entry = (BasicMapEntry) e; ! put(entry.key, entry.value); ! } ! else ! { put(e.getKey(), e.getValue()); ! } } } ! public synchronized void clear() { ! modCount++; ! for (int i=0; i < buckets.length; i++) { ! buckets[i] = null; } - size = 0; } ! /** ! * returns a shallow clone of this Hashtable (i.e. the Map itself is cloned, ! * but its contents are not) */ public synchronized Object clone() { --- 215,546 ---- } /** ! * Construct a new Hashtable from the given Map, with initial capacity ! * the greater of the size of m or the default of 11. ! *

          * ! * Every element in Map m will be put into this new Hashtable. ! * ! * @param m a Map whose key / value pairs will be put into ! * the new Hashtable. NOTE: key / value pairs ! * are not cloned in this constructor. ! * @throws NullPointerException if m is null, or if m contains a mapping ! * to or from `null'. ! * @since 1.2 */ public Hashtable(Map m) { ! this(Math.max(m.size() * 2, DEFAULT_CAPACITY), DEFAULT_LOAD_FACTOR); ! putAllInternal(m); } /** ! * Construct a new Hashtable with a specific inital capacity and ! * default load factor of 0.75. * ! * @param initialCapacity the initial capacity of this Hashtable (>= 0) ! * @throws IllegalArgumentException if (initialCapacity < 0) */ ! public Hashtable(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } /** ! * Construct a new Hashtable with a specific initial capacity and ! * load factor. * ! * @param initialCapacity the initial capacity (>= 0) ! * @param loadFactor the load factor (> 0, not NaN) ! * @throws IllegalArgumentException if (initialCapacity < 0) || ! * ! (loadFactor > 0.0) */ public Hashtable(int initialCapacity, float loadFactor) { if (initialCapacity < 0) ! throw new IllegalArgumentException("Illegal Capacity: " ! + initialCapacity); ! if (! (loadFactor > 0)) // check for NaN too ! throw new IllegalArgumentException("Illegal Load: " + loadFactor); ! if (initialCapacity == 0) ! initialCapacity = 1; ! buckets = new HashEntry[initialCapacity]; this.loadFactor = loadFactor; ! threshold = (int) (initialCapacity * loadFactor); } ! /** ! * Returns the number of key-value mappings currently in this hashtable. ! * @return the size ! */ ! public synchronized int size() { return size; } ! /** ! * Returns true if there are no key-value mappings currently in this table. ! * @return size() == 0 ! */ ! public synchronized boolean isEmpty() { return size == 0; } ! /** ! * Return an enumeration of the keys of this table. There's no point ! * in synchronizing this, as you have already been warned that the ! * enumeration is not specified to be thread-safe. ! * ! * @return the keys ! * @see #elements() ! * @see #keySet() ! */ ! public Enumeration keys() { ! return new Enumerator(KEYS); } ! ! /** ! * Return an enumeration of the values of this table. There's no point ! * in synchronizing this, as you have already been warned that the ! * enumeration is not specified to be thread-safe. ! * ! * @return the values ! * @see #keys() ! * @see #values() ! */ ! public Enumeration elements() { ! return new Enumerator(VALUES); } /** ! * Returns true if this Hashtable contains a value o, ! * such that o.equals(value). This is the same as ! * containsValue(), and is O(n). ! *

          * ! * @param value the value to search for in this Hashtable ! * @return true if at least one key maps to the value ! * @throws NullPointerException if value is null ! * @see #containsValue(Object) ! * @see #containsKey(Object) */ public synchronized boolean contains(Object value) { ! return containsValue(value); } /** ! * Returns true if this Hashtable contains a value o, such that ! * o.equals(value). This is the new API for the old ! * contains(). * ! * @param value the value to search for in this Hashtable ! * @return true if at least one key maps to the value ! * @throws NullPointerException if value is null ! * @see #contains(Object) ! * @see #containsKey(Object) ! * @since 1.2 */ public boolean containsValue(Object value) { ! for (int i = buckets.length - 1; i >= 0; i--) ! { ! HashEntry e = buckets[i]; ! while (e != null) ! { ! if (value.equals(e.value)) ! return true; ! e = e.next; ! } ! } ! ! // Must throw on null argument even if the table is empty ! if (value == null) ! throw new NullPointerException(); ! ! return false; } ! /** ! * Returns true if the supplied object equals() a key ! * in this Hashtable. * ! * @param key the key to search for in this Hashtable ! * @return true if the key is in the table ! * @throws NullPointerException if key is null ! * @see #containsValue(Object) */ public synchronized boolean containsKey(Object key) { int idx = hash(key); ! HashEntry e = buckets[idx]; while (e != null) { if (key.equals(e.key)) ! return true; ! e = e.next; } return false; } /** ! * Return the value in this Hashtable associated with the supplied key, ! * or null if the key maps to nothing. * ! * @param key the key for which to fetch an associated value ! * @return what the key maps to, if present ! * @throws NullPointerException if key is null ! * @see #put(Object, Object) ! * @see #containsKey(Object) */ public synchronized Object get(Object key) { int idx = hash(key); ! HashEntry e = buckets[idx]; while (e != null) { if (key.equals(e.key)) ! return e.value; ! e = e.next; } return null; } /** ! * Puts the supplied value into the Map, mapped by the supplied key. ! * Neither parameter may be null. The value may be retrieved by any ! * object which equals() this key. * ! * @param key the key used to locate the value ! * @param value the value to be stored in the table ! * @return the prior mapping of the key, or null if there was none ! * @throws NullPointerException if key or value is null ! * @see #get(Object) ! * @see Object#equals(Object) */ public synchronized Object put(Object key, Object value) { int idx = hash(key); ! HashEntry e = buckets[idx]; ! ! // Check if value is null since it is not permitted. if (value == null) throw new NullPointerException(); while (e != null) { if (key.equals(e.key)) ! { ! // Bypass e.setValue, since we already know value is non-null. ! Object r = e.value; ! e.value = value; ! return r; ! } ! else ! { ! e = e.next; ! } } ! // At this point, we know we need to add a new entry. + modCount++; if (++size > threshold) { ! rehash(); ! // Need a new hash value to suit the bigger table. ! idx = hash(key); } ! e = new HashEntry(key, value); ! e.next = buckets[idx]; buckets[idx] = e; ! return null; } /** ! * Removes from the table and returns the value which is mapped by the ! * supplied key. If the key maps to nothing, then the table remains ! * unchanged, and null is returned. * ! * @param key the key used to locate the value to remove ! * @return whatever the key mapped to, if present */ public synchronized Object remove(Object key) { int idx = hash(key); ! HashEntry e = buckets[idx]; ! HashEntry last = null; while (e != null) { if (key.equals(e.key)) ! { ! modCount++; ! if (last == null) ! buckets[idx] = e.next; ! else ! last.next = e.next; ! size--; ! return e.value; ! } ! last = e; ! e = e.next; } return null; } + /** + * Copies all elements of the given map into this hashtable. However, no + * mapping can contain null as key or value. If this table already has + * a mapping for a key, the new mapping replaces the current one. + * + * @param m the map to be hashed into this + * @throws NullPointerException if m is null, or contains null keys or values + */ public synchronized void putAll(Map m) { Iterator itr = m.entrySet().iterator(); ! ! for (int msize = m.size(); msize > 0; msize--) { Map.Entry e = (Map.Entry) itr.next(); ! // Optimize in case the Entry is one of our own. ! if (e instanceof BasicMapEntry) ! { ! BasicMapEntry entry = (BasicMapEntry) e; ! put(entry.key, entry.value); ! } ! else ! { put(e.getKey(), e.getValue()); ! } } } ! ! /** ! * Clears the hashtable so it has no keys. This is O(1). ! */ public synchronized void clear() { ! if (size > 0) { ! modCount++; ! Arrays.fill(buckets, null); ! size = 0; } } ! /** ! * Returns a shallow clone of this Hashtable. The Map itself is cloned, ! * but its contents are not. This is O(n). ! * ! * @return the clone */ public synchronized Object clone() { *************** public class Hashtable extends Dictionar *** 409,821 **** } catch (CloneNotSupportedException x) { } ! copy.buckets = new Entry[buckets.length]; ! ! for (int i=0; i < buckets.length; i++) ! { ! Entry e = buckets[i]; ! Entry last = null; ! ! while (e != null) ! { ! if (last == null) ! { ! copy.buckets[i] = new Entry(e.key, e.value); ! last = copy.buckets[i]; ! } ! else ! { ! last.next = new Entry(e.key, e.value); ! last = last.next; ! } ! e = e.next; ! } ! } return copy; } ! public synchronized String toString() { ! Iterator entries = entrySet().iterator(); StringBuffer r = new StringBuffer("{"); ! for (int pos = 0; pos < size; pos++) { r.append(entries.next()); ! if (pos < size - 1) ! r.append(", "); } r.append("}"); ! return r.toString(); } ! /** returns a "set view" of this Hashtable's keys */ public Set keySet() { ! // Create a synchronized AbstractSet with custom implementations of those ! // methods that can be overriden easily and efficiently. ! Set r = new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new HashIterator(HashIterator.KEYS); ! } ! ! public void clear() { ! Hashtable.this.clear(); ! } ! public boolean contains(Object o) ! { ! return Hashtable.this.containsKey(o); ! } ! ! public boolean remove(Object o) ! { ! return (Hashtable.this.remove(o) != null); ! } ! }; ! return Collections.synchronizedSet(r); } ! ! /** Returns a "collection view" (or "bag view") of this Hashtable's values. ! */ public Collection values() { ! // We don't bother overriding many of the optional methods, as doing so ! // wouldn't provide any significant performance advantage. ! Collection r = new AbstractCollection() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new HashIterator(HashIterator.VALUES); ! } ! ! public void clear() { ! Hashtable.this.clear(); } ! }; ! ! return Collections.synchronizedCollection(r); } ! /** Returns a "set view" of this Hashtable's entries. */ public Set entrySet() { ! // Create an AbstractSet with custom implementations of those methods that ! // can be overriden easily and efficiently. ! Set r = new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new HashIterator(HashIterator.ENTRIES); ! } ! ! public void clear() { ! Hashtable.this.clear(); ! } ! public boolean contains(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Entry e = getEntry(me); ! return (e != null); ! } ! ! public boolean remove(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Entry e = getEntry(me); ! if (e != null) ! { ! Hashtable.this.remove(e.key); ! return true; ! } ! return false; } ! }; ! ! return Collections.synchronizedSet(r); } ! ! /** returns true if this Hashtable equals the supplied Object

          o
          ; ! * that is: *
          !    * if (o instanceof Map)
          !    * and
          !    * o.keySet().equals(keySet())
          !    * and
          !    * for each key in o.keySet(), o.get(key).equals(get(key))
          !    *
          */ public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Map)) return false; ! Map m = (Map) o; ! Set s = m.entrySet(); ! Iterator itr = entrySet().iterator(); ! ! if (m.size() != size) ! return false; ! ! for (int pos = 0; pos < size; pos++) ! { ! if (!s.contains(itr.next())) ! return false; ! } ! return true; } ! ! /** a Map's hashCode is the sum of the hashCodes of all of its ! Map.Entry objects */ ! public int hashCode() { int hashcode = 0; ! Iterator itr = entrySet().iterator(); ! for (int pos = 0; pos < size; pos++) ! { ! hashcode += itr.next().hashCode(); ! } ! return hashcode; } ! ! /** Return an index in the buckets array for `key' based on its hashCode() */ private int hash(Object key) { return Math.abs(key.hashCode() % buckets.length); } ! private Entry getEntry(Map.Entry me) { ! int idx = hash(me.getKey()); ! Entry e = buckets[idx]; while (e != null) { ! if (e.equals(me)) ! return e; ! e = e.next; } return null; } ! ! /** ! * increases the size of the Hashtable and rehashes all keys to new array ! * indices; this is called when the addition of a new value would cause ! * size() > threshold. Note that the existing Entry objects are reused in * the new hash table. */ protected void rehash() { ! Entry[] oldBuckets = buckets; ! int newcapacity = (buckets.length * 2) + 1; threshold = (int) (newcapacity * loadFactor); ! buckets = new Entry[newcapacity]; ! ! for (int i = 0; i < oldBuckets.length; i++) { ! Entry e = oldBuckets[i]; while (e != null) ! { ! int idx = hash(e.key); ! Entry dest = buckets[idx]; ! if (dest != null) ! { ! while (dest.next != null) ! dest = dest.next; ! dest.next = e; ! } ! else ! { ! buckets[idx] = e; ! } ! Entry next = e.next; ! e.next = null; ! e = next; ! } } } /** * Serializes this object to the given stream. ! * @serialdata the capacity(int) that is the length of the ! * bucket array, the size(int) of the hash map are emitted ! * first. They are followed by size entries, each consisting of ! * a key (Object) and a value (Object). */ ! private void writeObject(ObjectOutputStream s) throws IOException { ! // the threshold and loadFactor fields s.defaultWriteObject(); s.writeInt(buckets.length); s.writeInt(size); ! Iterator it = entrySet().iterator(); while (it.hasNext()) { ! Map.Entry entry = (Map.Entry) it.next(); ! s.writeObject(entry.getKey()); ! s.writeObject(entry.getValue()); } } /** * Deserializes this object from the given stream. ! * @serialdata the capacity(int) that is the length of the ! * bucket array, the size(int) of the hash map are emitted ! * first. They are followed by size entries, each consisting of ! * a key (Object) and a value (Object). */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ! // the threshold and loadFactor fields s.defaultReadObject(); ! int capacity = s.readInt(); int len = s.readInt(); - size = 0; - modCount = 0; - buckets = new Entry[capacity]; ! for (int i = 0; i < len; i++) ! { ! Object key = s.readObject(); ! Object value = s.readObject(); ! put(key, value); ! } } /** ! * a class which implements the Iterator interface and is used for ! * iterating over Hashtables; ! * this implementation is parameterized to give a sequential view of ! * keys, values, or entries; it also allows the removal of elements, ! * as per the Javasoft spec. * ! * @author Jon Zeppieri */ ! class HashIterator implements Iterator { ! static final int KEYS = 0, ! VALUES = 1, ! ENTRIES = 2; ! ! // The type of this Iterator: KEYS, VALUES, or ENTRIES. ! int type; ! // The number of modifications to the backing Hashtable that we know about. ! int knownMod; ! // The total number of elements returned by next(). Used to determine if ! // there are more elements remaining. ! int count; ! // Current index in the physical hash table. ! int idx; ! // The last Entry returned by a next() call. ! Entry last; ! // The next entry that should be returned by next(). It is set to something ! // if we're iterating through a bucket that contains multiple linked ! // entries. It is null if next() needs to find a new bucket. ! Entry next; ! /* Construct a new HashIterator with the supplied type: ! KEYS, VALUES, or ENTRIES */ HashIterator(int type) { this.type = type; - knownMod = Hashtable.this.modCount; - count = 0; - idx = buckets.length; } ! /** returns true if the Iterator has more elements */ public boolean hasNext() { ! if (knownMod != Hashtable.this.modCount) ! throw new ConcurrentModificationException(); ! return count < size; } ! /** Returns the next element in the Iterator's sequential view. */ public Object next() { ! if (knownMod != Hashtable.this.modCount) ! throw new ConcurrentModificationException(); ! if (count == size) throw new NoSuchElementException(); ! count++; ! Entry e = null; ! if (next != null) ! e = next; while (e == null) ! { ! e = buckets[--idx]; ! } next = e.next; last = e; if (type == VALUES) return e.value; ! else if (type == KEYS) return e.key; return e; } ! /** ! * Removes from the backing Hashtable the last element which was fetched ! * with the
          next()
          method. */ public void remove() { ! if (knownMod != Hashtable.this.modCount) ! throw new ConcurrentModificationException(); if (last == null) ! { ! throw new IllegalStateException(); ! } ! else ! { ! Hashtable.this.remove(last.key); ! knownMod++; ! count--; ! last = null; ! } } ! } /** ! * Enumeration view of this Hashtable, providing sequential access to its ! * elements; this implementation is parameterized to provide access either * to the keys or to the values in the Hashtable. * * NOTE: Enumeration is not safe if new elements are put in the table --- 551,1079 ---- } catch (CloneNotSupportedException x) { + // This is impossible. } ! copy.buckets = new HashEntry[buckets.length]; ! copy.putAllInternal(this); ! // Clear the caches. ! copy.keys = null; ! copy.values = null; ! copy.entries = null; return copy; } ! ! /** ! * Converts this Hashtable to a String, surrounded by braces, and with ! * key/value pairs listed with an equals sign between, separated by a ! * comma and space. For example, "{a=1, b=2}".

          ! * ! * NOTE: if the toString() method of any key or value ! * throws an exception, this will fail for the same reason. ! * ! * @return the string representation ! */ public synchronized String toString() { ! // Since we are already synchronized, and entrySet().iterator() ! // would repeatedly re-lock/release the monitor, we directly use the ! // unsynchronized HashIterator instead. ! Iterator entries = new HashIterator(ENTRIES); StringBuffer r = new StringBuffer("{"); ! for (int pos = size; pos > 0; pos--) { r.append(entries.next()); ! if (pos > 1) ! r.append(", "); } r.append("}"); ! return r.toString(); } ! /** ! * Returns a "set view" of this Hashtable's keys. The set is backed by ! * the hashtable, so changes in one show up in the other. The set supports ! * element removal, but not element addition. The set is properly ! * synchronized on the original hashtable. Sun has not documented the ! * proper interaction of null with this set, but has inconsistent behavior ! * in the JDK. Therefore, in this implementation, contains, remove, ! * containsAll, retainAll, removeAll, and equals just ignore a null key ! * rather than throwing a {@link NullPointerException}. ! * ! * @return a set view of the keys ! * @see #values() ! * @see #entrySet() ! * @since 1.2 ! */ public Set keySet() { ! if (keys == null) { ! // Create a synchronized AbstractSet with custom implementations of ! // those methods that can be overridden easily and efficiently. ! Set r = new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! public Iterator iterator() ! { ! return new HashIterator(KEYS); ! } ! public void clear() ! { ! Hashtable.this.clear(); ! } ! ! public boolean contains(Object o) ! { ! if (o == null) ! return false; ! return containsKey(o); ! } ! ! public boolean remove(Object o) ! { ! return Hashtable.this.remove(o) != null; ! } ! }; ! // We must specify the correct object to synchronize upon, hence the ! // use of a non-public API ! keys = new Collections.SynchronizedSet(this, r); ! } ! return keys; } ! ! /** ! * Returns a "collection view" (or "bag view") of this Hashtable's values. ! * The collection is backed by the hashtable, so changes in one show up ! * in the other. The collection supports element removal, but not element ! * addition. The collection is properly synchronized on the original ! * hashtable. Sun has not documented the proper interaction of null with ! * this set, but has inconsistent behavior in the JDK. Therefore, in this ! * implementation, contains, remove, containsAll, retainAll, removeAll, and ! * equals just ignore a null value rather than throwing a ! * {@link NullPointerException}. ! * ! * @return a bag view of the values ! * @see #keySet() ! * @see #entrySet() ! * @since 1.2 ! */ public Collection values() { ! if (values == null) { ! // We don't bother overriding many of the optional methods, as doing so ! // wouldn't provide any significant performance advantage. ! Collection r = new AbstractCollection() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new HashIterator(VALUES); ! } ! ! public void clear() ! { ! Hashtable.this.clear(); ! } ! }; ! // We must specify the correct object to synchronize upon, hence the ! // use of a non-public API ! values = new Collections.SynchronizedCollection(this, r); } ! return values; } ! /** ! * Returns a "set view" of this Hashtable's entries. The set is backed by ! * the hashtable, so changes in one show up in the other. The set supports ! * element removal, but not element addition. The set is properly ! * synchronized on the original hashtable. Sun has not documented the ! * proper interaction of null with this set, but has inconsistent behavior ! * in the JDK. Therefore, in this implementation, contains, remove, ! * containsAll, retainAll, removeAll, and equals just ignore a null entry, ! * or an entry with a null key or value, rather than throwing a ! * {@link NullPointerException}. However, calling entry.setValue(null) ! * will fail. ! *

          ! * ! * Note that the iterators for all three views, from keySet(), entrySet(), ! * and values(), traverse the hashtable in the same sequence. ! * ! * @return a set view of the entries ! * @see #keySet() ! * @see #values() ! * @see Map.Entry ! * @since 1.2 ! */ public Set entrySet() { ! if (entries == null) { ! // Create an AbstractSet with custom implementations of those methods ! // that can be overridden easily and efficiently. ! Set r = new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! public Iterator iterator() ! { ! return new HashIterator(ENTRIES); ! } ! ! public void clear() ! { ! Hashtable.this.clear(); ! } ! ! public boolean contains(Object o) ! { ! return getEntry(o) != null; ! } ! ! public boolean remove(Object o) ! { ! HashEntry e = getEntry(o); ! if (e != null) ! { ! Hashtable.this.remove(e.key); ! return true; ! } ! return false; ! } ! }; ! // We must specify the correct object to synchronize upon, hence the ! // use of a non-public API ! entries = new Collections.SynchronizedSet(this, r); } ! return entries; } ! ! /** ! * Returns true if this Hashtable equals the supplied Object o. ! * As specified by Map, this is: *

          !    * (o instanceof Map) && entrySet().equals(((Map) o).entrySet());
          !    * 
          ! * ! * @param o the object to compare to ! * @return true if o is an equal map ! * @since 1.2 */ public boolean equals(Object o) { + // no need to synchronize, entrySet().equals() does that if (o == this) return true; if (!(o instanceof Map)) return false; ! return entrySet().equals(((Map) o).entrySet()); } ! ! /** ! * Returns the hashCode for this Hashtable. As specified by Map, this is ! * the sum of the hashCodes of all of its Map.Entry objects ! * ! * @return the sum of the hashcodes of the entries ! * @since 1.2 ! */ ! public synchronized int hashCode() { + // Since we are already synchronized, and entrySet().iterator() + // would repeatedly re-lock/release the monitor, we directly use the + // unsynchronized HashIterator instead. + Iterator itr = new HashIterator(ENTRIES); int hashcode = 0; ! for (int pos = size; pos > 0; pos--) ! hashcode += itr.next().hashCode(); ! ! return hashcode; } ! ! /** ! * Helper method that returns an index in the buckets array for `key' ! * based on its hashCode(). ! * ! * @param key the key ! * @return the bucket number ! * @throws NullPointerException if key is null ! */ private int hash(Object key) { return Math.abs(key.hashCode() % buckets.length); } ! /** ! * Helper method for entrySet(), which matches both key and value ! * simultaneously. Ignores null, as mentioned in entrySet(). ! * ! * @param o the entry to match ! * @return the matching entry, if found, or null ! * @see #entrySet() ! */ ! private HashEntry getEntry(Object o) { ! if (! (o instanceof Map.Entry)) ! return null; ! Object key = ((Map.Entry) o).getKey(); ! if (key == null) ! return null; ! ! int idx = hash(key); ! HashEntry e = buckets[idx]; while (e != null) { ! if (o.equals(e)) ! return e; ! e = e.next; } return null; } ! ! /** ! * A simplified, more efficient internal implementation of putAll(). The ! * Map constructor and clone() should not call putAll or put, in order to ! * be compatible with the JDK implementation with respect to subclasses. ! * ! * @param m the map to initialize this from ! */ ! void putAllInternal(Map m) ! { ! Iterator itr = m.entrySet().iterator(); ! int msize = m.size(); ! this.size = msize; ! ! for (; msize > 0; msize--) ! { ! Map.Entry e = (Map.Entry) itr.next(); ! Object key = e.getKey(); ! int idx = hash(key); ! HashEntry he = new HashEntry(key, e.getValue()); ! he.next = buckets[idx]; ! buckets[idx] = he; ! } ! } ! ! /** ! * Increases the size of the Hashtable and rehashes all keys to new array ! * indices; this is called when the addition of a new value would cause ! * size() > threshold. Note that the existing Entry objects are reused in * the new hash table. + *

          + * + * This is not specified, but the new size is twice the current size plus + * one; this number is not always prime, unfortunately. This implementation + * is not synchronized, as it is only invoked from synchronized methods. */ protected void rehash() { ! HashEntry[] oldBuckets = buckets; ! int newcapacity = (buckets.length * 2) + 1; threshold = (int) (newcapacity * loadFactor); ! buckets = new HashEntry[newcapacity]; ! ! for (int i = oldBuckets.length - 1; i >= 0; i--) { ! HashEntry e = oldBuckets[i]; while (e != null) ! { ! int idx = hash(e.key); ! HashEntry dest = buckets[idx]; ! if (dest != null) ! { ! while (dest.next != null) ! dest = dest.next; ! dest.next = e; ! } ! else ! { ! buckets[idx] = e; ! } ! HashEntry next = e.next; ! e.next = null; ! e = next; ! } } } /** * Serializes this object to the given stream. ! * ! * @param s the stream to write to ! * @throws IOException if the underlying stream fails ! * @serialData the capacity (int) that is the length of the ! * bucket array, the size (int) of the hash map ! * are emitted first. They are followed by size entries, ! * each consisting of a key (Object) and a value (Object). */ ! private synchronized void writeObject(ObjectOutputStream s) ! throws IOException { ! // Write the threshold and loadFactor fields. s.defaultWriteObject(); s.writeInt(buckets.length); s.writeInt(size); ! // Since we are already synchronized, and entrySet().iterator() ! // would repeatedly re-lock/release the monitor, we directly use the ! // unsynchronized HashIterator instead. ! Iterator it = new HashIterator(ENTRIES); while (it.hasNext()) { ! HashEntry entry = (HashEntry) it.next(); ! s.writeObject(entry.key); ! s.writeObject(entry.value); } } /** * Deserializes this object from the given stream. ! * ! * @param s the stream to read from ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @serialData the capacity (int) that is the length of the ! * bucket array, the size (int) of the hash map ! * are emitted first. They are followed by size entries, ! * each consisting of a key (Object) and a value (Object). */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ! // Read the threshold and loadFactor fields. s.defaultReadObject(); ! // Read and use capacity. ! buckets = new HashEntry[s.readInt()]; int len = s.readInt(); ! // Read and use key/value pairs. ! // TODO: should we be defensive programmers, and check for illegal nulls? ! while (--len >= 0) ! put(s.readObject(), s.readObject()); } /** ! * A class which implements the Iterator interface and is used for ! * iterating over Hashtables. ! * This implementation is parameterized to give a sequential view of ! * keys, values, or entries; it also allows the removal of elements, ! * as per the Javasoft spec. Note that it is not synchronized; this is ! * a performance enhancer since it is never exposed externally and is ! * only used within synchronized blocks above. * ! * @author Jon Zeppieri */ ! private final class HashIterator implements Iterator { ! /** ! * The type of this Iterator: {@link #KEYS}, {@link #VALUES}, ! * or {@link #ENTRIES}. ! */ ! final int type; ! /** ! * The number of modifications to the backing Hashtable that we know about. ! */ ! int knownMod = modCount; ! /** The number of elements remaining to be returned by next(). */ ! int count = size; ! /** Current index in the physical hash table. */ ! int idx = buckets.length; ! /** The last Entry returned by a next() call. */ ! HashEntry last; ! /** ! * The next entry that should be returned by next(). It is set to something ! * if we're iterating through a bucket that contains multiple linked ! * entries. It is null if next() needs to find a new bucket. ! */ ! HashEntry next; ! /** ! * Construct a new HashIterator with the supplied type. ! * @param type {@link #KEYS}, {@link #VALUES}, or {@link #ENTRIES} ! */ HashIterator(int type) { this.type = type; } ! /** ! * Returns true if the Iterator has more elements. ! * @return true if there are more elements ! * @throws ConcurrentModificationException if the hashtable was modified ! */ public boolean hasNext() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! return count > 0; } ! /** ! * Returns the next element in the Iterator's sequential view. ! * @return the next element ! * @throws ConcurrentModificationException if the hashtable was modified ! * @throws NoSuchElementException if there is none ! */ public Object next() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! if (count == 0) throw new NoSuchElementException(); ! count--; ! HashEntry e = next; while (e == null) ! e = buckets[--idx]; next = e.next; last = e; if (type == VALUES) return e.value; ! if (type == KEYS) return e.key; return e; } ! /** ! * Removes from the backing Hashtable the last element which was fetched ! * with the next() method. ! * @throws ConcurrentModificationException if the hashtable was modified ! * @throws IllegalStateException if called when there is no last element */ public void remove() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); if (last == null) ! throw new IllegalStateException(); ! ! Hashtable.this.remove(last.key); ! last = null; ! knownMod++; } ! } // class HashIterator /** ! * Enumeration view of this Hashtable, providing sequential access to its ! * elements; this implementation is parameterized to provide access either * to the keys or to the values in the Hashtable. * * NOTE: Enumeration is not safe if new elements are put in the table *************** public class Hashtable extends Dictionar *** 825,876 **** * the "Java Class Libraries" book infers that modifications to the * hashtable during enumeration causes indeterminate results. Don't do it! * ! * @author Jon Zeppieri */ ! class Enumerator implements Enumeration { ! static final int KEYS = 0; ! static final int VALUES = 1; ! ! int type; ! // The total number of elements returned by nextElement(). Used to ! // determine if there are more elements remaining. ! int count; ! // current index in the physical hash table. ! int idx; ! // the last Entry returned. ! Entry last; ! Enumerator(int type) { this.type = type; - this.count = 0; - this.idx = buckets.length; } public boolean hasMoreElements() { ! return count < Hashtable.this.size; } public Object nextElement() { ! if (count >= size) ! throw new NoSuchElementException(); ! count++; ! Entry e = null; ! if (last != null) ! e = last.next; while (e == null) ! { ! e = buckets[--idx]; ! } ! last = e; ! if (type == VALUES) ! return e.value; ! return e.key; } ! } } --- 1083,1142 ---- * the "Java Class Libraries" book infers that modifications to the * hashtable during enumeration causes indeterminate results. Don't do it! * ! * @author Jon Zeppieri */ ! private final class Enumerator implements Enumeration { ! /** ! * The type of this Iterator: {@link #KEYS} or {@link #VALUES}. ! */ ! final int type; ! /** The number of elements remaining to be returned by next(). */ ! int count = size; ! /** Current index in the physical hash table. */ ! int idx = buckets.length; ! /** ! * Entry which will be returned by the next nextElement() call. It is ! * set if we are iterating through a bucket with multiple entries, or null ! * if we must look in the next bucket. ! */ ! HashEntry next; ! ! /** ! * Construct the enumeration. ! * @param type either {@link #KEYS} or {@link #VALUES}. ! */ Enumerator(int type) { this.type = type; } + /** + * Checks whether more elements remain in the enumeration. + * @return true if nextElement() will not fail. + */ public boolean hasMoreElements() { ! return count > 0; } + /** + * Returns the next element. + * @return the next element + * @throws NoSuchElementException if there is none. + */ public Object nextElement() { ! if (count == 0) ! throw new NoSuchElementException("Hashtable Enumerator"); ! count--; ! HashEntry e = next; while (e == null) ! e = buckets[--idx]; ! next = e.next; ! return type == VALUES ? e.value : e.key; } ! } // class Enumerator } diff -Nrc3pad gcc-3.0.4/libjava/java/util/IdentityHashMap.java gcc-3.1/libjava/java/util/IdentityHashMap.java *** gcc-3.0.4/libjava/java/util/IdentityHashMap.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/util/IdentityHashMap.java Tue Apr 2 13:56:44 2002 *************** *** 0 **** --- 1,927 ---- + /* IdentityHashMap.java -- a class providing a hashtable data structure, + mapping Object --> Object, which uses object identity for hashing. + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package java.util; + + import java.io.*; + + /** + * This class provides a hashtable-backed implementation of the + * Map interface, but uses object identity to do its hashing. In fact, + * it uses object identity for comparing values, as well. It uses a + * linear-probe hash table, which may have faster performance + * than the chaining employed by HashMap. + *

          + * + * WARNING: This is not a general purpose map. Because it uses + * System.identityHashCode and ==, instead of hashCode and equals, for + * comparison, it violated Map's general contract, and may cause + * undefined behavior when compared to other maps which are not + * IdentityHashMaps. This is designed only for the rare cases when + * identity semantics are needed. An example use is + * topology-preserving graph transformations, such as deep cloning, + * or as proxy object mapping such as in debugging. + *

          + * + * This map permits null keys and values, and does not + * guarantee that elements will stay in the same order over time. The + * basic operations (get and put) take + * constant time, provided System.identityHashCode is decent. You can + * tune the behavior by specifying the expected maximum size. As more + * elements are added, the map may need to allocate a larger table, + * which can be expensive. + *

          + * + * This implementation is unsynchronized. If you want multi-thread + * access to be consistent, you must synchronize it, perhaps by using + * Collections.synchronizedMap(new IdentityHashMap(...));. + * The iterators are fail-fast, meaning that a structural modification + * made to the map outside of an iterator's remove method cause the + * iterator, and in the case of the entrySet, the Map.Entry, to + * fail with a {@link ConcurrentModificationException}. + * + * @author Tom Tromey + * @author Eric Blake + * @see System#identityHashCode(Object) + * @see Collection + * @see Map + * @see HashMap + * @see TreeMap + * @see LinkedHashMap + * @see WeakHashMap + * @since 1.4 + * @status updated to 1.4 + */ + public class IdentityHashMap extends AbstractMap + implements Map, Serializable, Cloneable + { + /** The default capacity. */ + private static final int DEFAULT_CAPACITY = 21; + + /** + * This object is used to mark deleted items. Package visible for use by + * nested classes. + */ + static final Object tombstone = new Object(); + + /** + * This object is used to mark empty slots. We need this because + * using null is ambiguous. Package visible for use by nested classes. + */ + static final Object emptyslot = new Object(); + + /** + * Compatible with JDK 1.4. + */ + private static final long serialVersionUID = 8188218128353913216L; + + /** + * The number of mappings in the table. Package visible for use by nested + * classes. + * @serial + */ + int size; + + /** + * The table itself. Package visible for use by nested classes. + */ + transient Object[] table; + + /** + * The number of structural modifications made so far. Package visible for + * use by nested classes. + */ + transient int modCount; + + /** + * The cache for {@link #entrySet()}. + */ + private transient Set entries; + + /** + * The threshold for rehashing, which is 75% of (table.length / 2). + */ + private transient int threshold; + + /** + * Create a new IdentityHashMap with the default capacity (21 entries). + */ + public IdentityHashMap() + { + this(DEFAULT_CAPACITY); + } + + /** + * Create a new IdentityHashMap with the indicated number of + * entries. If the number of elements added to this hash map + * exceeds this maximum, the map will grow itself; however, that + * incurs a performance penalty. + * + * @param max initial size + * @throws IllegalArgumentException if max is negative + */ + public IdentityHashMap(int max) + { + if (max < 0) + throw new IllegalArgumentException(); + // Need at least two slots, or hash() will break. + if (max < 2) + max = 2; + table = new Object[2 * max]; + Arrays.fill(table, emptyslot); + threshold = max / 4 * 3; + } + + /** + * Create a new IdentityHashMap whose contents are taken from the + * given Map. + * + * @param m The map whose elements are to be put in this map + * @throws NullPointerException if m is null + */ + public IdentityHashMap(Map m) + { + this(Math.max(m.size() * 2, DEFAULT_CAPACITY)); + putAll(m); + } + + /** + * Remove all mappings from this map. + */ + public void clear() + { + if (size != 0) + { + modCount++; + Arrays.fill(table, emptyslot); + size = 0; + } + } + + /** + * Creates a shallow copy where keys and values are not cloned. + */ + public Object clone() + { + try + { + IdentityHashMap copy = (IdentityHashMap) super.clone(); + copy.table = (Object[]) table.clone(); + copy.entries = null; // invalidate the cache + return copy; + } + catch (CloneNotSupportedException e) + { + // Can't happen. + return null; + } + } + + /** + * Tests whether the specified key is in this map. Unlike normal Maps, + * this test uses entry == key instead of + * entry == null ? key == null : entry.equals(key). + * + * @param key the key to look for + * @return true if the key is contained in the map + * @see #containsValue(Object) + * @see #get(Object) + */ + public boolean containsKey(Object key) + { + return key == table[hash(key)]; + } + + /** + * Returns true if this HashMap contains the value. Unlike normal maps, + * this test uses entry == value instead of + * entry == null ? value == null : entry.equals(value). + * + * @param value the value to search for in this HashMap + * @return true if at least one key maps to the value + * @see #containsKey(Object) + */ + public boolean containsValue(Object value) + { + for (int i = table.length - 1; i > 0; i -= 2) + if (table[i] == value) + return true; + return false; + } + + /** + * Returns a "set view" of this Map's entries. The set is backed by + * the Map, so changes in one show up in the other. The set supports + * element removal, but not element addition. + *

          + * + * The semantics of this set, and of its contained entries, are + * different from the contract of Set and Map.Entry in order to make + * IdentityHashMap work. This means that while you can compare these + * objects between IdentityHashMaps, comparing them with regular sets + * or entries is likely to have undefined behavior. The entries + * in this set are reference-based, rather than the normal object + * equality. Therefore, e1.equals(e2) returns + * e1.getKey() == e2.getKey() && e1.getValue() == e2.getValue(), + * and e.hashCode() returns + * System.identityHashCode(e.getKey()) ^ + * System.identityHashCode(e.getValue()). + *

          + * + * Note that the iterators for all three views, from keySet(), entrySet(), + * and values(), traverse the Map in the same sequence. + * + * @return a set view of the entries + * @see #keySet() + * @see #values() + * @see Map.Entry + */ + public Set entrySet() + { + if (entries == null) + entries = new AbstractSet() + { + public int size() + { + return size; + } + + public Iterator iterator() + { + return new IdentityIterator(ENTRIES); + } + + public void clear() + { + IdentityHashMap.this.clear(); + } + + public boolean contains(Object o) + { + if (! (o instanceof Map.Entry)) + return false; + Map.Entry m = (Map.Entry) o; + return m.getValue() == table[hash(m.getKey()) + 1]; + } + + public int hashCode() + { + return IdentityHashMap.this.hashCode(); + } + + public boolean remove(Object o) + { + if (! (o instanceof Map.Entry)) + return false; + Object key = ((Map.Entry) o).getKey(); + int h = hash(key); + if (table[h] == key) + { + size--; + modCount++; + table[h] = tombstone; + table[h + 1] = tombstone; + return true; + } + return false; + } + }; + return entries; + } + + /** + * Compares two maps for equality. This returns true only if both maps + * have the same reference-identity comparisons. While this returns + * this.entrySet().equals(m.entrySet()) as specified by Map, + * this will not work with normal maps, since the entry set compares + * with == instead of .equals. + * + * @param o the object to compare to + * @return true if it is equal + */ + public boolean equals(Object o) + { + // Why did Sun specify this one? The superclass does the right thing. + return super.equals(o); + } + + /** + * Return the value in this Map associated with the supplied key, + * or

          null
          if the key maps to nothing. NOTE: Since the value + * could also be null, you must use containsKey to see if this key + * actually maps to something. Unlike normal maps, this tests for the key + * with entry == key instead of + * entry == null ? key == null : entry.equals(key). + * + * @param key the key for which to fetch an associated value + * @return what the key maps to, if present + * @see #put(Object, Object) + * @see #containsKey(Object) + */ + public Object get(Object key) + { + int h = hash(key); + return table[h] == key ? table[h + 1] : null; + } + + /** + * Returns the hashcode of this map. This guarantees that two + * IdentityHashMaps that compare with equals() will have the same hash code, + * but may break with comparison to normal maps since it uses + * System.identityHashCode() instead of hashCode(). + * + * @return the hash code + */ + public int hashCode() + { + int hash = 0; + for (int i = table.length - 2; i >= 0; i -= 2) + { + Object key = table[i]; + if (key == emptyslot || key == tombstone) + continue; + hash += (System.identityHashCode(key) + ^ System.identityHashCode(table[i + 1])); + } + return hash; + } + + /** + * Returns true if there are no key-value mappings currently in this Map + * @return size() == 0 + */ + public boolean isEmpty() + { + return size == 0; + } + + /** + * Returns a "set view" of this Map's keys. The set is backed by the + * Map, so changes in one show up in the other. The set supports + * element removal, but not element addition. + *

          + * + * The semantics of this set are different from the contract of Set + * in order to make IdentityHashMap work. This means that while you can + * compare these objects between IdentityHashMaps, comparing them with + * regular sets is likely to have undefined behavior. The hashCode + * of the set is the sum of the identity hash codes, instead of the + * regular hashCodes, and equality is determined by reference instead + * of by the equals method. + *

          + * + * @return a set view of the keys + * @see #values() + * @see #entrySet() + */ + public Set keySet() + { + if (keys == null) + keys = new AbstractSet() + { + public int size() + { + return size; + } + + public Iterator iterator() + { + return new IdentityIterator(KEYS); + } + + public void clear() + { + IdentityHashMap.this.clear(); + } + + public boolean contains(Object o) + { + return containsKey(o); + } + + public int hashCode() + { + int hash = 0; + for (int i = table.length - 2; i >= 0; i -= 2) + { + Object key = table[i]; + if (key == emptyslot || key == tombstone) + continue; + hash += System.identityHashCode(key); + } + return hash; + + } + + public boolean remove(Object o) + { + int h = hash(o); + if (table[h] == o) + { + size--; + modCount++; + table[h] = tombstone; + table[h + 1] = tombstone; + return true; + } + return false; + } + }; + return keys; + } + + /** + * Puts the supplied value into the Map, mapped by the supplied key. + * The value may be retrieved by any object which equals() + * this key. NOTE: Since the prior value could also be null, you must + * first use containsKey if you want to see if you are replacing the + * key's mapping. Unlike normal maps, this tests for the key + * with entry == key instead of + * entry == null ? key == null : entry.equals(key). + * + * @param key the key used to locate the value + * @param value the value to be stored in the HashMap + * @return the prior mapping of the key, or null if there was none + * @see #get(Object) + */ + public Object put(Object key, Object value) + { + // Rehash if the load factor is too high. + if (size > threshold) + { + Object[] old = table; + // This isn't necessarily prime, but it is an odd number of key/value + // slots, which has a higher probability of fewer collisions. + table = new Object[old.length * 2 + 2]; + Arrays.fill(table, emptyslot); + size = 0; + threshold = (table.length / 2) / 4 * 3; + + for (int i = old.length - 2; i >= 0; i -= 2) + { + Object oldkey = old[i]; + if (oldkey != tombstone && oldkey != emptyslot) + // Just use put. This isn't very efficient, but it is ok. + put(oldkey, old[i + 1]); + } + } + + int h = hash(key); + if (table[h] == key) + { + Object r = table[h + 1]; + table[h + 1] = value; + return r; + } + + // At this point, we add a new mapping. + modCount++; + size++; + table[h] = key; + table[h + 1] = value; + return null; + } + + /** + * Copies all of the mappings from the specified map to this. If a key + * is already in this map, its value is replaced. + * + * @param m the map to copy + * @throws NullPointerException if m is null + */ + public void putAll(Map m) + { + // Why did Sun specify this one? The superclass does the right thing. + super.putAll(m); + } + + /** + * Removes from the HashMap and returns the value which is mapped by the + * supplied key. If the key maps to nothing, then the HashMap remains + * unchanged, and

          null
          is returned. NOTE: Since the value + * could also be null, you must use containsKey to see if you are + * actually removing a mapping. Unlike normal maps, this tests for the + * key with entry == key instead of + * entry == null ? key == null : entry.equals(key). + * + * @param key the key used to locate the value to remove + * @return whatever the key mapped to, if present + */ + public Object remove(Object key) + { + int h = hash(key); + if (table[h] == key) + { + modCount++; + size--; + Object r = table[h + 1]; + table[h] = tombstone; + table[h + 1] = tombstone; + return r; + } + return null; + } + + /** + * Returns the number of kay-value mappings currently in this Map + * @return the size + */ + public int size() + { + return size; + } + + /** + * Returns a "collection view" (or "bag view") of this Map's values. + * The collection is backed by the Map, so changes in one show up + * in the other. The collection supports element removal, but not element + * addition. + *

          + * + * The semantics of this set are different from the contract of + * Collection in order to make IdentityHashMap work. This means that + * while you can compare these objects between IdentityHashMaps, comparing + * them with regular sets is likely to have undefined behavior. + * Likewise, contains and remove go by == instead of equals(). + *

          + * + * @return a bag view of the values + * @see #keySet() + * @see #entrySet() + */ + public Collection values() + { + if (values == null) + values = new AbstractCollection() + { + public int size() + { + return size; + } + + public Iterator iterator() + { + return new IdentityIterator(VALUES); + } + + public void clear() + { + IdentityHashMap.this.clear(); + } + + public boolean remove(Object o) + { + for (int i = table.length - 1; i > 0; i -= 2) + if (table[i] == o) + { + modCount++; + table[i - 1] = tombstone; + table[i] = tombstone; + size--; + return true; + } + return false; + } + }; + return values; + } + + /** + * Helper method which computes the hash code, then traverses the table + * until it finds the key, or the spot where the key would go. + * + * @param key the key to check + * @return the index where the key belongs + * @see #IdentityHashMap(int) + * @see #put(Object, Object) + */ + // Package visible for use by nested classes. + int hash(Object key) + { + // Implementation note: it is feasible for the table to have no + // emptyslots, if it is full with entries and tombstones, so we must + // remember where we started. If we encounter the key or an emptyslot, + // we are done. If we encounter a tombstone, the key may still be in + // the array. If we don't encounter the key, we use the first emptyslot + // or tombstone we encountered as the location where the key would go. + // By requiring at least 2 key/value slots, and rehashing at 75% + // capacity, we guarantee that there will always be either an emptyslot + // or a tombstone somewhere in the table. + int h = 2 * Math.abs(System.identityHashCode(key) % (table.length / 2)); + int del = -1; + int save = h; + + do + { + if (table[h] == key) + return h; + if (table[h] == emptyslot) + break; + if (table[h] == tombstone && del < 0) + del = h; + h -= 2; + if (h < 0) + h = table.length - 2; + } + while (h != save); + + return del < 0 ? h : del; + } + + /** + * This class allows parameterized iteration over IdentityHashMaps. Based + * on its construction, it returns the key or value of a mapping, or + * creates the appropriate Map.Entry object with the correct fail-fast + * semantics and identity comparisons. + * + * @author Tom Tromey + * @author Eric Blake + */ + private final class IdentityIterator implements Iterator + { + /** + * The type of this Iterator: {@link #KEYS}, {@link #VALUES}, + * or {@link #ENTRIES}. + */ + final int type; + /** The number of modifications to the backing Map that we know about. */ + int knownMod = modCount; + /** The number of elements remaining to be returned by next(). */ + int count = size; + /** Location in the table. */ + int loc = table.length; + + /** + * Construct a new Iterator with the supplied type. + * @param type {@link #KEYS}, {@link #VALUES}, or {@link #ENTRIES} + */ + IdentityIterator(int type) + { + this.type = type; + } + + /** + * Returns true if the Iterator has more elements. + * @return true if there are more elements + * @throws ConcurrentModificationException if the Map was modified + */ + public boolean hasNext() + { + if (knownMod != modCount) + throw new ConcurrentModificationException(); + return count > 0; + } + + /** + * Returns the next element in the Iterator's sequential view. + * @return the next element + * @throws ConcurrentModificationException if the Map was modified + * @throws NoSuchElementException if there is none + */ + public Object next() + { + if (knownMod != modCount) + throw new ConcurrentModificationException(); + if (count == 0) + throw new NoSuchElementException(); + count--; + + Object key; + do + { + loc -= 2; + key = table[loc]; + } + while (key == emptyslot || key == tombstone); + + return type == KEYS ? key : (type == VALUES ? table[loc + 1] + : new IdentityEntry(loc)); + } + + /** + * Removes from the backing Map the last element which was fetched + * with the

          next()
          method. + * @throws ConcurrentModificationException if the Map was modified + * @throws IllegalStateException if called when there is no last element + */ + public void remove() + { + if (knownMod != modCount) + throw new ConcurrentModificationException(); + if (loc == table.length || table[loc] == tombstone) + throw new IllegalStateException(); + modCount++; + size--; + table[loc] = tombstone; + table[loc + 1] = tombstone; + knownMod++; + } + } // class IdentityIterator + + /** + * This class provides Map.Entry objects for IdentityHashMaps. The entry + * is fail-fast, and will throw a ConcurrentModificationException if + * the underlying map is modified, or if remove is called on the iterator + * that generated this object. It is identity based, so it violates + * the general contract of Map.Entry, and is probably unsuitable for + * comparison to normal maps; but it works among other IdentityHashMaps. + * + * @author Eric Blake + */ + private final class IdentityEntry implements Map.Entry + { + /** The location of this entry. */ + final int loc; + /** The number of modifications to the backing Map that we know about. */ + final int knownMod = modCount; + + /** + * Constructs the Entry. + * + * @param loc the location of this entry in table + */ + IdentityEntry(int loc) + { + this.loc = loc; + } + + /** + * Compares the specified object with this entry, using identity + * semantics. Note that this can lead to undefined results with + * Entry objects created by normal maps. + * + * @param o the object to compare + * @return true if it is equal + * @throws ConcurrentModificationException if the entry was invalidated + * by modifying the Map or calling Iterator.remove() + */ + public boolean equals(Object o) + { + if (knownMod != modCount || table[loc] == tombstone) + throw new ConcurrentModificationException(); + if (! (o instanceof Map.Entry)) + return false; + Map.Entry e = (Map.Entry) o; + return table[loc] == e.getKey() && table[loc + 1] == e.getValue(); + } + + /** + * Returns the key of this entry. + * + * @return the key + * @throws ConcurrentModificationException if the entry was invalidated + * by modifying the Map or calling Iterator.remove() + */ + public Object getKey() + { + if (knownMod != modCount || table[loc] == tombstone) + throw new ConcurrentModificationException(); + return table[loc]; + } + + /** + * Returns the value of this entry. + * + * @return the value + * @throws ConcurrentModificationException if the entry was invalidated + * by modifying the Map or calling Iterator.remove() + */ + public Object getValue() + { + if (knownMod != modCount || table[loc] == tombstone) + throw new ConcurrentModificationException(); + return table[loc + 1]; + } + + /** + * Returns the hashcode of the entry, using identity semantics. + * Note that this can lead to undefined results with Entry objects + * created by normal maps. + * + * @return the hash code + * @throws ConcurrentModificationException if the entry was invalidated + * by modifying the Map or calling Iterator.remove() + */ + public int hashCode() + { + if (knownMod != modCount || table[loc] == tombstone) + throw new ConcurrentModificationException(); + return (System.identityHashCode(table[loc]) + ^ System.identityHashCode(table[loc + 1])); + } + + /** + * Replaces the value of this mapping, and returns the old value. + * + * @param value the new value + * @return the old value + * @throws ConcurrentModificationException if the entry was invalidated + * by modifying the Map or calling Iterator.remove() + */ + public Object setValue(Object value) + { + if (knownMod != modCount || table[loc] == tombstone) + throw new ConcurrentModificationException(); + Object r = table[loc + 1]; + table[loc + 1] = value; + return r; + } + + /** + * This provides a string representation of the entry. It is of the form + * "key=value", where string concatenation is used on key and value. + * + * @return the string representation + * @throws ConcurrentModificationException if the entry was invalidated + * by modifying the Map or calling Iterator.remove() + */ + public final String toString() + { + if (knownMod != modCount || table[loc] == tombstone) + throw new ConcurrentModificationException(); + return table[loc] + "=" + table[loc + 1]; + } + } // class IdentityEntry + + /** + * Reads the object from a serial stream. + * + * @param s the stream to read from + * @throws ClassNotFoundException if the underlying stream fails + * @throws IOException if the underlying stream fails + * @serialData expects the size (int), followed by that many key (Object) + * and value (Object) pairs, with the pairs in no particular + * order + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException + { + s.defaultReadObject(); + + int num = s.readInt(); + table = new Object[2 * Math.max(num * 2, DEFAULT_CAPACITY)]; + // Read key/value pairs. + while (--num >= 0) + put(s.readObject(), s.readObject()); + } + + /** + * Writes the object to a serial stream. + * + * @param s the stream to write to + * @throws IOException if the underlying stream fails + * @serialData outputs the size (int), followed by that many key (Object) + * and value (Object) pairs, with the pairs in no particular + * order + */ + private void writeObject(ObjectOutputStream s) + throws IOException + { + s.defaultWriteObject(); + s.writeInt(size); + for (int i = table.length - 2; i >= 0; i -= 2) + { + Object key = table[i]; + if (key != tombstone && key != emptyslot) + { + s.writeObject(key); + s.writeObject(table[i + 1]); + } + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Iterator.java gcc-3.1/libjava/java/util/Iterator.java *** gcc-3.0.4/libjava/java/util/Iterator.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/Iterator.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* Iterator.java -- Interface for iterating over collections ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Iterator.java -- Interface for iterating over collections ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,47 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; /** ! * An object which iterates over a collection. An Iterator is used to return the ! * items once only, in sequence, by successive calls to the next method. It is ! * also possible to remove elements from the underlying collection by using the ! * optional remove method. Iterator is intended as a replacement for the ! * Enumeration interface of previous versions of Java, which did not have the ! * remove method and had less conveniently named methods. */ public interface Iterator { /** ! * Tests whether there are elements remaining in the collection. * ! * @return true if there is at least one more element in the collection, ! * that is, if the next call to next will not throw NoSuchElementException. */ boolean hasNext(); --- 18,66 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /** ! * An object which iterates over a collection. An Iterator is used to return ! * the items once only, in sequence, by successive calls to the next method. ! * It is also possible to remove elements from the underlying collection by ! * using the optional remove method. Iterator is intended as a replacement ! * for the Enumeration interface of previous versions of Java, which did not ! * have the remove method and had less conveniently named methods. ! * ! * @author Original author unknown ! * @author Eric Blake ! * @see Collection ! * @see ListIterator ! * @see Enumeration ! * @since 1.2 ! * @status updated to 1.4 */ public interface Iterator { /** ! * Tests whether there are elements remaining in the collection. In other ! * words, calling next() will not throw an exception. * ! * @return true if there is at least one more element in the collection */ boolean hasNext(); *************** public interface Iterator *** 49,68 **** * Obtain the next element in the collection. * * @return the next element in the collection ! * @exception NoSuchElementException if there are no more elements */ Object next(); /** ! * Remove from the underlying collection the last element returned by next. ! * This method can be called only once after each call to next. It does not ! * affect what will be returned by subsequent calls to next. This operation is ! * optional, it may throw an UnsupportedOperationException. * ! * @exception IllegalStateException if next has not yet been called or remove ! * has already been called since the last call to next. ! * @exception UnsupportedOperationException if this Iterator does not support ! * the remove operation. */ void remove(); } --- 68,87 ---- * Obtain the next element in the collection. * * @return the next element in the collection ! * @throws NoSuchElementException if there are no more elements */ Object next(); /** ! * Remove from the underlying collection the last element returned by next ! * (optional operation). This method can be called only once after each ! * call to next(). It does not affect what will be returned ! * by subsequent calls to next. * ! * @throws IllegalStateException if next has not yet been called or remove ! * has already been called since the last call to next. ! * @throws UnsupportedOperationException if this Iterator does not support ! * the remove operation. */ void remove(); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/LinkedHashMap.java gcc-3.1/libjava/java/util/LinkedHashMap.java *** gcc-3.0.4/libjava/java/util/LinkedHashMap.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/util/LinkedHashMap.java Tue Jan 22 22:40:38 2002 *************** *** 0 **** --- 1,487 ---- + /* LinkedHashMap.java -- a class providing hashtable data structure, + mapping Object --> Object, with linked list traversal + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.util; + + /** + * This class provides a hashtable-backed implementation of the + * Map interface, with predictable traversal order. + *

          + * + * It uses a hash-bucket approach; that is, hash collisions are handled + * by linking the new node off of the pre-existing node (or list of + * nodes). In this manner, techniques such as linear probing (which + * can cause primary clustering) and rehashing (which does not fit very + * well with Java's method of precomputing hash codes) are avoided. In + * addition, this maintains a doubly-linked list which tracks either + * insertion or access order. Note that the insertion order is not + * modified if a put simply reinserts a key in the map. + *

          + * + * One of the nice features of tracking insertion order is that you can + * copy a hashtable, and regardless of the implementation of the original, + * produce the same results when iterating over the copy. This is possible + * without needing the overhead of TreeMap. + *

          + * + * When using this {@link #LinkedHashMap(int, float, boolean) constructor}, + * you build an access-order mapping. This can be used to implement LRU + * caches, for example. In this case, every invocation of put, + * putAll, or get moves the accessed entry to + * the end of the iteration list. By overriding + * {@link #removeEldestEntry(Map.Entry)}, you can also control the + * removal of the oldest entry, and thereby do things like keep the map + * at a fixed size. + *

          + * + * Under ideal circumstances (no collisions), LinkedHashMap offers O(1) + * performance on most operations (

          containsValue()
          is, + * of course, O(n)). In the worst case (all keys map to the same + * hash code -- very unlikely), most operations are O(n). + *

          + * + * LinkedHashMap accepts the null key and null values. It is not + * synchronized, so if you need multi-threaded access, consider using:
          + * Map m = Collections.synchronizedMap(new LinkedHashMap(...)); + *

          + * + * The iterators are fail-fast, meaning that any structural + * modification, except for remove() called on the iterator + * itself, cause the iterator to throw a + * {@link ConcurrentModificationException} rather than exhibit + * non-deterministic behavior. + * + * @author Eric Blake + * @see Object#hashCode() + * @see Collection + * @see Map + * @see HashMap + * @see TreeMap + * @see Hashtable + * @since 1.4 + * @status updated to 1.4 + */ + public class LinkedHashMap extends HashMap + { + /** + * Compatible with JDK 1.4. + */ + private static final long serialVersionUID = 3801124242820219131L; + + /** + * The first Entry to iterate over. + */ + transient LinkedHashEntry head; + + /** + * The last Entry to iterate over. + */ + transient LinkedHashEntry tail; + + /** + * The iteration order of this linked hash map: true for + * access-order, false for insertion-order. + * @serial + */ + final boolean accessOrder; + + /** + * Class to represent an entry in the hash table. Holds a single key-value + * pair and the doubly-linked insertion order list. + */ + class LinkedHashEntry extends HashEntry + { + /** The predecessor in the iteration list, null if this is the eldest. */ + LinkedHashEntry pred; + /** The successor in the iteration list, null if this is the newest. */ + LinkedHashEntry succ; + + /** + * Simple constructor. + * @param key the key + * @param value the value + */ + LinkedHashEntry(Object key, Object value) + { + super(key, value); + if (head == null) + head = this; + pred = tail; + tail = this; + if (pred != null) + pred.succ = this; + } + + /** + * Sets the value of this entry, and shuffles it to the end of + * the list if this is in access-order. + * @param value the new value + * @return the prior value + */ + public Object setValue(Object value) + { + if (accessOrder && succ != null) + { + succ.pred = pred; + if (pred == null) + head = succ; + else + pred.succ = succ; + succ = null; + pred = tail; + pred.succ = this; + tail = this; + } + return super.setValue(value); + } + + /** + * Called when this entry is removed from the map. This version does + * the necessary bookkeeping to keep the doubly-linked list in order. + * @return the value of this key as it is removed + */ + Object cleanup() + { + if (pred == null) + head = succ; + else + pred.succ = succ; + if (succ == null) + tail = pred; + else + succ.pred = pred; + + return value; + } + } + + /** + * Construct a new insertion-ordered LinkedHashMap with the default + * capacity (11) and the default load factor (0.75). + */ + public LinkedHashMap() + { + super(); + accessOrder = false; + } + + /** + * Construct a new insertion-ordered LinkedHashMap from the given Map, + * with initial capacity the greater of the size of m or + * the default of 11. + *

          + * + * Every element in Map m will be put into this new HashMap, in the + * order of m's iterator. + * + * @param m a Map whose key / value pairs will be put into + * the new HashMap. NOTE: key / value pairs + * are not cloned in this constructor. + * @throws NullPointerException if m is null + */ + public LinkedHashMap(Map m) + { + super(m); + accessOrder = false; + } + + /** + * Construct a new insertion-ordered LinkedHashMap with a specific + * inital capacity and default load factor of 0.75. + * + * @param initialCapacity the initial capacity of this HashMap (>= 0) + * @throws IllegalArgumentException if (initialCapacity < 0) + */ + public LinkedHashMap(int initialCapacity) + { + super(initialCapacity); + accessOrder = false; + } + + /** + * Construct a new insertion-orderd LinkedHashMap with a specific + * inital capacity and load factor. + * + * @param initialCapacity the initial capacity (>= 0) + * @param loadFactor the load factor (> 0, not NaN) + * @throws IllegalArgumentException if (initialCapacity < 0) || + * ! (loadFactor > 0.0) + */ + public LinkedHashMap(int initialCapacity, float loadFactor) + { + super(initialCapacity, loadFactor); + accessOrder = false; + } + + /** + * Construct a new LinkedHashMap with a specific inital capacity, load + * factor, and ordering mode. + * + * @param initialCapacity the initial capacity (>=0) + * @param loadFactor the load factor (>0, not NaN) + * @param accessOrder true for access-order, false for insertion-order + * @throws IllegalArgumentException if (initialCapacity < 0) || + * ! (loadFactor > 0.0) + */ + public LinkedHashMap(int initialCapacity, float loadFactor, + boolean accessOrder) + { + super(initialCapacity, loadFactor); + this.accessOrder = accessOrder; + } + + /** + * Clears the Map so it has no keys. This is O(1). + */ + public void clear() + { + super.clear(); + head = null; + tail = null; + } + + /** + * Returns true if this HashMap contains a value

          o
          , such that + *
          o.equals(value)
          . + * + * @param value the value to search for in this HashMap + * @return true if at least one key maps to the value + */ + public boolean containsValue(Object value) + { + LinkedHashEntry e = head; + while (e != null) + { + if (equals(value, e.value)) + return true; + e = e.succ; + } + return false; + } + + /** + * Return the value in this Map associated with the supplied key, + * or
          null
          if the key maps to nothing. If this is an + * access-ordered Map and the key is found, this performs structural + * modification, moving the key to the newest end of the list. NOTE: + * Since the value could also be null, you must use containsKey to + * see if this key actually maps to something. + * + * @param key the key for which to fetch an associated value + * @return what the key maps to, if present + * @see #put(Object, Object) + * @see #containsKey(Object) + */ + public Object get(Object key) + { + int idx = hash(key); + HashEntry e = buckets[idx]; + while (e != null) + { + if (equals(key, e.key)) + { + if (accessOrder) + { + modCount++; + LinkedHashEntry l = (LinkedHashEntry) e; + if (l.succ != null) + { + l.succ.pred = l.pred; + if (l.pred == null) + head = l.succ; + else + l.pred.succ = l.succ; + l.succ = null; + l.pred = tail; + tail.succ = l; + tail = l; + } + } + return e.value; + } + e = e.next; + } + return null; + } + + /** + * Returns true if this map should remove the eldest entry. + * This method is invoked by all calls to put and + * putAll which place a new entry in the map, providing + * the implementer an opportunity to remove the eldest entry any time + * a new one is added. This can be used to save memory usage of the + * hashtable, as well as emulating a cache, by deleting stale entries. + *

          + * + * For example, to keep the Map limited to 100 entries, override as follows: + *

          +    * private static final int MAX_ENTRIES = 100;
          +    *
          +    * protected boolean removeEldestEntry(Map.Entry eldest)
          +    * {
          +    *   return size() > MAX_ENTRIES;
          +    * }
          +    * 

          + * + * Typically, this method does not modify the map, but just uses the + * return value as an indication to put whether to proceed. + * However, if you override it to modify the map, you must return false + * (indicating that put should do nothing), or face + * unspecified behavior. + *

          + * + * This method is called after the eldest entry has been inserted, so + * if put was called on a previously empty map, the eldest + * entry is the one you just put in! The default implementation just + * returns false, so that this map always behaves like + * a normal one with unbounded growth. + * + * @param eldest the eldest element which would be removed if this + * returns true. For an access-order map, this is the least + * recently accessed; for an insertion-order map, this is the + * earliest element inserted. + * @return true if eldest should be removed + */ + protected boolean removeEldestEntry(Map.Entry eldest) + { + return false; + } + + /** + * Helper method called by put, which creates and adds a + * new Entry, followed by performing bookkeeping (like removeEldestEntry). + * + * @param key the key of the new Entry + * @param value the value + * @param idx the index in buckets where the new Entry belongs + * @param callRemove whether to call the removeEldestEntry method + * @see #put(Object, Object) + * @see #removeEldestEntry(Map.Entry) + */ + void addEntry(Object key, Object value, int idx, boolean callRemove) + { + LinkedHashEntry e = new LinkedHashEntry(key, value); + + e.next = buckets[idx]; + buckets[idx] = e; + + if (callRemove && removeEldestEntry(head)) + remove(head); + } + + /** + * Helper method, called by clone() to reset the doubly-linked list. + * @param m the map to add entries from + * @see #clone() + */ + void putAllInternal(Map m) + { + head = null; + tail = null; + super.putAllInternal(m); + } + + /** + * Generates a parameterized iterator. This allows traversal to follow + * the doubly-linked list instead of the random bin order of HashMap. + * @param type {@link #KEYS}, {@link #VALUES}, or {@link #ENTRIES} + * @return the appropriate iterator + */ + Iterator iterator(final int type) + { + return new Iterator() + { + /** The current Entry */ + LinkedHashEntry current = head; + + /** The previous Entry returned by next() */ + LinkedHashEntry last; + + /** The number of known modifications to the backing HashMap */ + int knownMod = modCount; + + /** + * Returns true if the Iterator has more elements. + * @return true if there are more elements + * @throws ConcurrentModificationException if the HashMap was modified + */ + public boolean hasNext() + { + if (knownMod != modCount) + throw new ConcurrentModificationException(); + return current != null; + } + + /** + * Returns the next element in the Iterator's sequential view. + * @return the next element + * @throws ConcurrentModificationException if the HashMap was modified + * @throws NoSuchElementException if there is none + */ + public Object next() + { + if (knownMod != modCount) + throw new ConcurrentModificationException(); + if (current == null) + throw new NoSuchElementException(); + last = current; + current = current.succ; + return type == VALUES ? last.value : type == KEYS ? last.key : last; + } + + /** + * Removes from the backing HashMap the last element which was fetched + * with the

          next()
          method. + * @throws ConcurrentModificationException if the HashMap was modified + * @throws IllegalStateException if called when there is no last element + */ + public void remove() + { + if (knownMod != modCount) + throw new ConcurrentModificationException(); + if (last == null) + throw new IllegalStateException(); + + LinkedHashMap.this.remove(last.key); + last = null; + knownMod++; + } + }; + } + } diff -Nrc3pad gcc-3.0.4/libjava/java/util/LinkedHashSet.java gcc-3.1/libjava/java/util/LinkedHashSet.java *** gcc-3.0.4/libjava/java/util/LinkedHashSet.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/util/LinkedHashSet.java Tue Jan 22 22:40:38 2002 *************** *** 0 **** --- 1,160 ---- + /* LinkedHashSet.java -- a set backed by a LinkedHashMap, for linked + list traversal. + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.util; + + import java.io.Serializable; + + /** + * This class provides a hashtable-backed implementation of the + * Set interface, with predictable traversal order. + *

          + * + * It uses a hash-bucket approach; that is, hash collisions are handled + * by linking the new node off of the pre-existing node (or list of + * nodes). In this manner, techniques such as linear probing (which + * can cause primary clustering) and rehashing (which does not fit very + * well with Java's method of precomputing hash codes) are avoided. In + * addition, this maintains a doubly-linked list which tracks insertion + * order. Note that the insertion order is not modified if an + * add simply reinserts an element in the set. + *

          + * + * One of the nice features of tracking insertion order is that you can + * copy a set, and regardless of the implementation of the original, + * produce the same results when iterating over the copy. This is possible + * without needing the overhead of TreeSet. + *

          + * + * Under ideal circumstances (no collisions), LinkedHashSet offers O(1) + * performance on most operations. In the worst case (all elements map + * to the same hash code -- very unlikely), most operations are O(n). + *

          + * + * LinkedHashSet accepts the null entry. It is not synchronized, so if + * you need multi-threaded access, consider using:
          + * Set s = Collections.synchronizedSet(new LinkedHashSet(...)); + *

          + * + * The iterators are fail-fast, meaning that any structural + * modification, except for remove() called on the iterator + * itself, cause the iterator to throw a + * {@link ConcurrentModificationException} rather than exhibit + * non-deterministic behavior. + * + * @author Eric Blake + * @see Object#hashCode() + * @see Collection + * @see Set + * @see HashSet + * @see TreeSet + * @see Collections#synchronizedSet(Set) + * @since 1.4 + * @status updated to 1.4 + */ + public class LinkedHashSet extends HashSet + implements Set, Cloneable, Serializable + { + /** + * Compatible with JDK 1.4. + */ + private static final long serialVersionUID = -2851667679971038690L; + + /** + * Construct a new, empty HashSet whose backing HashMap has the default + * capacity (11) and loadFacor (0.75). + */ + public LinkedHashSet() + { + super(); + } + + /** + * Construct a new, empty HashSet whose backing HashMap has the supplied + * capacity and the default load factor (0.75). + * + * @param initialCapacity the initial capacity of the backing HashMap + * @throws IllegalArgumentException if the capacity is negative + */ + public LinkedHashSet(int initialCapacity) + { + super(initialCapacity); + } + + /** + * Construct a new, empty HashSet whose backing HashMap has the supplied + * capacity and load factor. + * + * @param initialCapacity the initial capacity of the backing HashMap + * @param loadFactor the load factor of the backing HashMap + * @throws IllegalArgumentException if either argument is negative, or + * if loadFactor is POSITIVE_INFINITY or NaN + */ + public LinkedHashSet(int initialCapacity, float loadFactor) + { + super(initialCapacity, loadFactor); + } + + /** + * Construct a new HashSet with the same elements as are in the supplied + * collection (eliminating any duplicates, of course). The backing storage + * has twice the size of the collection, or the default size of 11, + * whichever is greater; and the default load factor (0.75). + * + * @param c a collection of initial set elements + * @throws NullPointerException if c is null + */ + public LinkedHashSet(Collection c) + { + super(c); + } + + /** + * Helper method which initializes the backing Map. + * + * @param capacity the initial capacity + * @param load the initial load factor + * @return the backing HashMap + */ + HashMap init(int capacity, float load) + { + return new LinkedHashMap(capacity, load); + } + + } diff -Nrc3pad gcc-3.0.4/libjava/java/util/LinkedList.java gcc-3.1/libjava/java/util/LinkedList.java *** gcc-3.0.4/libjava/java/util/LinkedList.java Mon Dec 4 10:20:00 2000 --- gcc-3.1/libjava/java/util/LinkedList.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* LinkedList.java -- Linked list implementation of the List interface ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* LinkedList.java -- Linked list implementation of the List interface ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.ObjectInputStream; *** 32,56 **** import java.io.IOException; import java.lang.reflect.Array; - // TO DO: - // ~ Doc comment for the class. - // ~ Doc comments for the non-list methods. - // ~ other general implementation notes. - /** ! * Linked list implementation of the List interface. */ public class LinkedList extends AbstractSequentialList implements List, Cloneable, Serializable { ! static final long serialVersionUID = 876323262645176354L; /** ! * An Entry containing the head (in the next field) and the tail (in the ! * previous field) of the list. The data field is null. If the list is empty, ! * both the head and the tail point to ends itself. */ transient Entry first; transient Entry last; /** --- 43,92 ---- import java.io.IOException; import java.lang.reflect.Array; /** ! * Linked list implementation of the List interface. In addition to the ! * methods of the List interface, this class provides access to the first ! * and last list elements in O(1) time for easy stack, queue, or double-ended ! * queue (deque) creation. The list is doubly-linked, with traversal to a ! * given index starting from the end closest to the element.

          ! * ! * LinkedList is not synchronized, so if you need multi-threaded access, ! * consider using:
          ! * List l = Collections.synchronizedList(new LinkedList(...)); ! *

          ! * ! * The iterators are fail-fast, meaning that any structural ! * modification, except for remove() called on the iterator ! * itself, cause the iterator to throw a ! * {@link ConcurrentModificationException} rather than exhibit ! * non-deterministic behavior. ! * ! * @author Original author unknown ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see List ! * @see ArrayList ! * @see Vector ! * @see Collections#synchronizedList(List) ! * @since 1.2 ! * @status missing javadoc, but complete to 1.4 */ public class LinkedList extends AbstractSequentialList implements List, Cloneable, Serializable { ! /** ! * Compatible with JDK 1.2. ! */ ! private static final long serialVersionUID = 876323262645176354L; /** ! * The first element in the list. */ transient Entry first; + + /** + * The last element in the list. + */ transient Entry last; /** *************** public class LinkedList extends Abstract *** 61,78 **** /** * Class to represent an entry in the list. Holds a single element. */ ! private static class Entry { Object data; Entry next; Entry previous; ! Entry(Object data) { this.data = data; } ! } ! /** * Obtain the Entry at a given position in a list. This method of course * takes linear time, but it is intelligent enough to take the shorter of the --- 97,123 ---- /** * Class to represent an entry in the list. Holds a single element. */ ! private static final class Entry { + /** The element in the list. */ Object data; + + /** The next list entry, null if this is last. */ Entry next; + + /** The previous list entry, null if this is first. */ Entry previous; ! ! /** ! * Construct an entry. ! * @param data the list element ! */ Entry(Object data) { this.data = data; } ! } // class Entry ! /** * Obtain the Entry at a given position in a list. This method of course * takes linear time, but it is intelligent enough to take the shorter of the *************** public class LinkedList extends Abstract *** 82,88 **** * For speed and flexibility, range checking is not done in this method: * Incorrect values will be returned if (n < 0) or (n >= size). * ! * @param n the number of the entry to get. */ private Entry getEntry(int n) { --- 127,134 ---- * For speed and flexibility, range checking is not done in this method: * Incorrect values will be returned if (n < 0) or (n >= size). * ! * @param n the number of the entry to get ! * @return the entry at position n */ private Entry getEntry(int n) { *************** public class LinkedList extends Abstract *** 90,139 **** if (n < size / 2) { e = first; ! // n less than size/2, iterate from start ! while (n-- > 0) ! { ! e = e.next; ! } } else { ! e = last; ! // n greater than size/2, iterate from end ! while (++n < size) ! { ! e = e.previous; ! } } return e; } ! ! /** Remove an entry from the list. This will adjust size and deal with ! * `first' and `last' appropriatly. It does not effect modCount, that is ! * the responsibility of the caller. */ private void removeEntry(Entry e) { ! if (size == 1) first = last = null; else { ! if (e == first) ! { ! first = e.next; ! e.next.previous = null; ! } ! else if (e == last) ! { ! last = e.previous; ! e.previous.next = null; ! } ! else ! { ! e.next.previous = e.previous; ! e.previous.next = e.next; ! } } ! size--; } /** --- 136,211 ---- if (n < size / 2) { e = first; ! // n less than size/2, iterate from start ! while (n-- > 0) ! e = e.next; } else { ! e = last; ! // n greater than size/2, iterate from end ! while (++n < size) ! e = e.previous; } return e; } ! ! /** ! * Remove an entry from the list. This will adjust size and deal with ! * `first' and `last' appropriatly. ! * ! * @param e the entry to remove ! */ private void removeEntry(Entry e) { ! modCount++; ! size--; ! if (size == 0) first = last = null; else { ! if (e == first) ! { ! first = e.next; ! e.next.previous = null; ! } ! else if (e == last) ! { ! last = e.previous; ! e.previous.next = null; ! } ! else ! { ! e.next.previous = e.previous; ! e.previous.next = e.next; ! } } ! } ! ! /** ! * Checks that the index is in the range of possible elements (inclusive). ! * ! * @param index the index to check ! * @throws IndexOutOfBoundsException if index < 0 || index > size ! */ ! private void checkBoundsInclusive(int index) ! { ! if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" ! + size); ! } ! ! /** ! * Checks that the index is in the range of existing elements (exclusive). ! * ! * @param index the index to check ! * @throws IndexOutOfBoundsException if index < 0 || index >= size ! */ ! private void checkBoundsExclusive(int index) ! { ! if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" ! + size); } /** *************** public class LinkedList extends Abstract *** 141,164 **** */ public LinkedList() { - super(); } /** * Create a linked list containing the elements, in order, of a given * collection. * ! * @param c the collection to populate this list from. */ public LinkedList(Collection c) { - super(); - // Note: addAll could be made slightly faster, but not enough so to justify - // re-implementing it from scratch. It is just a matter of a relatively - // small constant factor. addAll(c); } public Object getFirst() { if (size == 0) --- 213,238 ---- */ public LinkedList() { } /** * Create a linked list containing the elements, in order, of a given * collection. * ! * @param c the collection to populate this list from ! * @throws NullPointerException if c is null */ public LinkedList(Collection c) { addAll(c); } + /** + * Returns the first element in the list. + * + * @return the first list element + * @throws NoSuchElementException if the list is empty + */ public Object getFirst() { if (size == 0) *************** public class LinkedList extends Abstract *** 166,171 **** --- 240,251 ---- return first.data; } + /** + * Returns the last element in the list. + * + * @return the last list element + * @throws NoSuchElementException if the list is empty + */ public Object getLast() { if (size == 0) *************** public class LinkedList extends Abstract *** 173,445 **** return last.data; } public Object removeFirst() { if (size == 0) throw new NoSuchElementException(); - size--; modCount++; Object r = first.data; ! if (first.next != null) first.next.previous = null; else last = null; first = first.next; ! return r; } public Object removeLast() { if (size == 0) throw new NoSuchElementException(); - size--; modCount++; Object r = last.data; ! if (last.previous != null) last.previous.next = null; else first = null; ! last = last.previous; ! return r; } public void addFirst(Object o) { - modCount++; Entry e = new Entry(o); ! if (size == 0) first = last = e; else { ! e.next = first; first.previous = e; ! first = e; ! } size++; } public void addLast(Object o) { - modCount++; addLastEntry(new Entry(o)); } ! private void addLastEntry(Entry e) { if (size == 0) first = last = e; else { ! e.previous = last; last.next = e; ! last = e; } size++; } public boolean contains(Object o) { Entry e = first; while (e != null) { ! if (e.data == null ? o == null : o.equals(e.data)) ! return true; e = e.next; } return false; } public int size() { return size; } ! public boolean add(Object o) { - modCount++; addLastEntry(new Entry(o)); return true; } ! public boolean remove(Object o) { - modCount++; Entry e = first; while (e != null) { ! if (e.data == null ? o == null : o.equals(e.data)) ! { ! removeEntry(e); ! return true; ! } e = e.next; } return false; } public boolean addAll(Collection c) { return addAll(size, c); } ! public boolean addAll(int index, Collection c) { ! if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! modCount++; int csize = c.size(); if (csize == 0) return false; Iterator itr = c.iterator(); ! // Get the entries just before and after index. If index is at the start ! // of the list, BEFORE is null. If index is at the end of thelist, AFTER is ! // null. If the list is empty, both are null. Entry after = null; ! Entry before = null; if (index != size) { ! after = getEntry(index); ! before = after.previous; } else before = last; ! // Create the first new entry. We do not yet set the link from `before' ! // to the first entry, in order to deal with the case where (c == this). ! // [Actually, we don't have to handle this case to fufill the // contract for addAll(), but Sun's implementation appears to.] Entry e = new Entry(itr.next()); e.previous = before; Entry prev = e; Entry firstNew = e; ! // Create and link all the remaining entries. for (int pos = 1; pos < csize; pos++) { e = new Entry(itr.next()); ! e.previous = prev; ! prev.next = e; ! prev = e; } // Link the new chain of entries into the list. prev.next = after; if (after != null) after.previous = e; else last = e; ! if (before != null) before.next = firstNew; else first = firstNew; - - size += csize; return true; } public void clear() { ! modCount++; ! first = null; ! last = null; ! size = 0; } public Object get(int index) { ! if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! Entry e = getEntry(index); ! return e.data; } ! public Object set(int index, Object o) { ! if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); Entry e = getEntry(index); Object old = e.data; e.data = o; return old; } public void add(int index, Object o) { ! if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! modCount++; ! addEntry(index, new Entry(o)); ! } ! ! private void addEntry(int index, Entry e) ! { if (index < size) { ! Entry after = getEntry(index); ! e.next = after; ! e.previous = after.previous; ! if (after.previous == null) ! first = e; ! else ! after.previous.next = e; ! after.previous = e; ! size++; } else addLastEntry(e); } ! public Object remove(int index) { ! if (index < 0 || index >= size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); ! modCount++; Entry e = getEntry(index); removeEntry(e); return e.data; } ! public int indexOf(Object o) { int index = 0; Entry e = first; while (e != null) { ! if (e.data == null ? o == null : o.equals(e.data)) ! return index; ! ++index; e = e.next; } return -1; } ! public int lastIndexOf(Object o) { int index = size - 1; Entry e = last; while (e != null) { ! if (e.data == null ? o == null : o.equals(e.data)) ! return index; ! --index; e = e.previous; } ! return -1; } /** --- 253,626 ---- return last.data; } + /** + * Remove and return the first element in the list. + * + * @return the former first element in the list + * @throws NoSuchElementException if the list is empty + */ public Object removeFirst() { if (size == 0) throw new NoSuchElementException(); modCount++; + size--; Object r = first.data; ! if (first.next != null) first.next.previous = null; else last = null; first = first.next; ! return r; } + /** + * Remove and return the last element in the list. + * + * @return the former last element in the list + * @throws NoSuchElementException if the list is empty + */ public Object removeLast() { if (size == 0) throw new NoSuchElementException(); modCount++; + size--; Object r = last.data; ! if (last.previous != null) last.previous.next = null; else first = null; ! last = last.previous; ! return r; } + /** + * Insert an element at the first of the list. + * + * @param o the element to insert + */ public void addFirst(Object o) { Entry e = new Entry(o); ! ! modCount++; if (size == 0) first = last = e; else { ! e.next = first; first.previous = e; ! first = e; ! } size++; } + /** + * Insert an element at the last of the list. + * + * @param o the element to insert + */ public void addLast(Object o) { addLastEntry(new Entry(o)); } ! ! /** ! * Inserts an element at the end of the list. ! * ! * @param e the entry to add ! */ private void addLastEntry(Entry e) { + modCount++; if (size == 0) first = last = e; else { ! e.previous = last; last.next = e; ! last = e; } size++; } + /** + * Returns true if the list contains the given object. Comparison is done by + * o == null ? e = null : o.equals(e). + * + * @param o the element to look for + * @return true if it is found + */ public boolean contains(Object o) { Entry e = first; while (e != null) { ! if (equals(o, e.data)) ! return true; e = e.next; } return false; } + /** + * Returns the size of the list. + * + * @return the list size + */ public int size() { return size; } ! ! /** ! * Adds an element to the end of the list. ! * ! * @param e the entry to add ! * @return true, as it always succeeds ! */ public boolean add(Object o) { addLastEntry(new Entry(o)); return true; } ! ! /** ! * Removes the entry at the lowest index in the list that matches the given ! * object, comparing by o == null ? e = null : o.equals(e). ! * ! * @param o the object to remove ! * @return true if an instance of the object was removed ! */ public boolean remove(Object o) { Entry e = first; while (e != null) { ! if (equals(o, e.data)) ! { ! removeEntry(e); ! return true; ! } e = e.next; } return false; } + /** + * Append the elements of the collection in iteration order to the end of + * this list. If this list is modified externally (for example, if this + * list is the collection), behavior is unspecified. + * + * @param c the collection to append + * @return true if the list was modified + * @throws NullPointerException if c is null + */ public boolean addAll(Collection c) { return addAll(size, c); } ! ! /** ! * Insert the elements of the collection in iteration order at the given ! * index of this list. If this list is modified externally (for example, ! * if this list is the collection), behavior is unspecified. ! * ! * @param c the collection to append ! * @return true if the list was modified ! * @throws NullPointerException if c is null ! * @throws IndexOutOfBoundsException if index < 0 || index > size() ! */ public boolean addAll(int index, Collection c) { ! checkBoundsInclusive(index); int csize = c.size(); if (csize == 0) return false; Iterator itr = c.iterator(); ! // Get the entries just before and after index. If index is at the start ! // of the list, BEFORE is null. If index is at the end of the list, AFTER ! // is null. If the list is empty, both are null. Entry after = null; ! Entry before = null; if (index != size) { ! after = getEntry(index); ! before = after.previous; } else before = last; ! // Create the first new entry. We do not yet set the link from `before' ! // to the first entry, in order to deal with the case where (c == this). ! // [Actually, we don't have to handle this case to fufill the // contract for addAll(), but Sun's implementation appears to.] Entry e = new Entry(itr.next()); e.previous = before; Entry prev = e; Entry firstNew = e; ! // Create and link all the remaining entries. for (int pos = 1; pos < csize; pos++) { e = new Entry(itr.next()); ! e.previous = prev; ! prev.next = e; ! prev = e; } + // Link the new chain of entries into the list. + modCount++; + size += csize; prev.next = after; if (after != null) after.previous = e; else last = e; ! if (before != null) before.next = firstNew; else first = firstNew; return true; } + /** + * Remove all elements from this list. + */ public void clear() { ! if (size > 0) ! { ! modCount++; ! first = null; ! last = null; ! size = 0; ! } } + /** + * Return the element at index. + * + * @param index the place to look + * @return the element at index + * @throws IndexOutOfBoundsException if index < 0 || index >= size() + */ public Object get(int index) { ! checkBoundsExclusive(index); ! return getEntry(index).data; } ! ! /** ! * Replace the element at the given location in the list. ! * ! * @param index which index to change ! * @param o the new element ! * @return the prior element ! * @throws IndexOutOfBoundsException if index < 0 || index >= size() ! */ public Object set(int index, Object o) { ! checkBoundsExclusive(index); Entry e = getEntry(index); Object old = e.data; e.data = o; return old; } + /** + * Inserts an element in the given position in the list. + * + * @param index where to insert the element + * @param o the element to insert + * @throws IndexOutOfBoundsException if index < 0 || index > size() + */ public void add(int index, Object o) { ! checkBoundsInclusive(index); ! Entry e = new Entry(o); ! if (index < size) { ! modCount++; ! Entry after = getEntry(index); ! e.next = after; ! e.previous = after.previous; ! if (after.previous == null) ! first = e; ! else ! after.previous.next = e; ! after.previous = e; ! size++; } else addLastEntry(e); } ! ! /** ! * Removes the element at the given position from the list. ! * ! * @param index the location of the element to remove ! * @return the removed element ! * @throws IndexOutOfBoundsException if index < 0 || index > size() ! */ public Object remove(int index) { ! checkBoundsExclusive(index); Entry e = getEntry(index); removeEntry(e); return e.data; } ! ! /** ! * Returns the first index where the element is located in the list, or -1. ! * ! * @param o the element to look for ! * @return its position, or -1 if not found ! */ public int indexOf(Object o) { int index = 0; Entry e = first; while (e != null) { ! if (equals(o, e.data)) ! return index; ! index++; e = e.next; } return -1; } ! ! /** ! * Returns the last index where the element is located in the list, or -1. ! * ! * @param o the element to look for ! * @return its position, or -1 if not found ! */ public int lastIndexOf(Object o) { int index = size - 1; Entry e = last; while (e != null) { ! if (equals(o, e.data)) ! return index; ! index--; e = e.previous; } ! return -1; } /** *************** public class LinkedList extends Abstract *** 448,484 **** * methods. * * @param index the index of the element to be returned by the first call to ! * next(), or size() to be initially positioned at the end of the list. ! * @exception IndexOutOfBoundsException if index < 0 || index > size(). */ public ListIterator listIterator(int index) { ! if (index < 0 || index > size) ! throw new IndexOutOfBoundsException("Index: " + index + ", Size:" + ! size); return new LinkedListItr(index); } /** ! * Create a shallow copy of this LinkedList. * @return an object of the same class as this object, containing the ! * same elements in the same order. */ public Object clone() { LinkedList copy = null; try { ! copy = (LinkedList) super.clone(); } catch (CloneNotSupportedException ex) { } ! copy.size = 0; copy.addAll(this); return copy; } ! public Object[] toArray() { Object[] array = new Object[size]; --- 629,669 ---- * methods. * * @param index the index of the element to be returned by the first call to ! * next(), or size() to be initially positioned at the end of the list ! * @throws IndexOutOfBoundsException if index < 0 || index > size() */ public ListIterator listIterator(int index) { ! checkBoundsInclusive(index); return new LinkedListItr(index); } /** ! * Create a shallow copy of this LinkedList (the elements are not cloned). ! * * @return an object of the same class as this object, containing the ! * same elements in the same order */ public Object clone() { LinkedList copy = null; try { ! copy = (LinkedList) super.clone(); } catch (CloneNotSupportedException ex) { } ! copy.clear(); copy.addAll(this); return copy; } ! ! /** ! * Returns an array which contains the elements of the list in order. ! * ! * @return an array containing the list elements ! */ public Object[] toArray() { Object[] array = new Object[size]; *************** public class LinkedList extends Abstract *** 490,677 **** } return array; } ! ! public Object[] toArray(Object[] array) { ! if (array.length < size) ! array = (Object[]) Array.newInstance(array.getClass().getComponentType(), ! size); ! else if (array.length > size) ! array[size] = null; Entry e = first; for (int i = 0; i < size; i++) { ! array[i] = e.data; e = e.next; } ! return array; } /** ! * Serialize an object to a stream. ! * @serialdata the size of the list (int), followed by all the elements ! * (Object) in proper order. */ private void writeObject(ObjectOutputStream s) throws IOException { s.writeInt(size); ! Iterator itr = iterator(); ! for (int i = 0; i < size; i++) ! s.writeObject(itr.next()); } /** ! * Deserialize an object from a stream. ! * @serialdata the size of the list (int), followed by all the elements ! * (Object) in proper order. */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ! int serialSize = s.readInt(); ! for (int i = 0; i < serialSize; i++) addLastEntry(new Entry(s.readObject())); } ! ! /** A ListIterator over the list. This class keeps track of its ! * position in the list, the size of the list, and the two list ! * entries it is between. This enables it to be used identically ! * for both the list itself and a sublist of the list. */ ! class LinkedListItr implements ListIterator { ! int knownMod; ! Entry next; // entry that will be returned by next(). ! Entry previous; // entry that will be returned by previous(). ! Entry lastReturned; // entry that will be affected by remove() or set(). ! int position; // index of `next'. /** ! * Create a new Iter starting at a given Entry within the list, at a given ! * position, in a list of given size. */ LinkedListItr(int index) { if (index == size) { next = null; ! previous = last; ! } else { next = getEntry(index); ! previous = next.previous; ! } position = index; - knownMod = modCount; } private void checkMod() { if (knownMod != modCount) ! throw new ConcurrentModificationException(); } public int nextIndex() { checkMod(); return position; } public int previousIndex() { checkMod(); return position - 1; } public boolean hasNext() { checkMod(); return (next != null); } public boolean hasPrevious() { checkMod(); return (previous != null); } public Object next() { checkMod(); if (next == null) ! throw new NoSuchElementException(); position++; lastReturned = previous = next; next = lastReturned.next; return lastReturned.data; } public Object previous() { checkMod(); if (previous == null) ! throw new NoSuchElementException(); position--; lastReturned = next = previous; previous = lastReturned.previous; return lastReturned.data; } public void remove() { checkMod(); if (lastReturned == null) ! throw new IllegalStateException(); // Adjust the position to before the removed element, if the element // being removed is behind the cursor. if (lastReturned == previous) ! position--; next = lastReturned.next; previous = lastReturned.previous; - modCount++; - knownMod++; removeEntry(lastReturned); ! lastReturned = null; } public void add(Object o) { checkMod(); modCount++; knownMod++; Entry e = new Entry(o); e.previous = previous; e.next = next; if (previous != null) ! previous.next = e; else ! first = e; if (next != null) ! { ! next.previous = e; ! next = next.next; ! } else ! last = e; previous = e; - size++; - position++; lastReturned = null; } public void set(Object o) { checkMod(); if (lastReturned == null) ! throw new IllegalStateException(); lastReturned.data = o; } ! } // class LinkedListItr } --- 675,956 ---- } return array; } ! ! /** ! * Returns an Array whose component type is the runtime component type of ! * the passed-in Array. The returned Array is populated with all of the ! * elements in this LinkedList. If the passed-in Array is not large enough ! * to store all of the elements in this List, a new Array will be created ! * and returned; if the passed-in Array is larger than the size ! * of this List, then size() index will be set to null. ! * ! * @param a the passed-in Array ! * @return an array representation of this list ! * @throws ArrayStoreException if the runtime type of a does not allow ! * an element in this list ! * @throws NullPointerException if a is null ! */ ! public Object[] toArray(Object[] a) { ! if (a.length < size) ! a = (Object[]) Array.newInstance(a.getClass().getComponentType(), size); ! else if (a.length > size) ! a[size] = null; Entry e = first; for (int i = 0; i < size; i++) { ! a[i] = e.data; e = e.next; } ! return a; } /** ! * Serializes this object to the given stream. ! * ! * @param s the stream to write to ! * @throws IOException if the underlying stream fails ! * @serialData the size of the list (int), followed by all the elements ! * (Object) in proper order */ private void writeObject(ObjectOutputStream s) throws IOException { + s.defaultWriteObject(); s.writeInt(size); ! Entry e = first; ! while (e != null) ! { ! s.writeObject(e.data); ! e = e.next; ! } } /** ! * Deserializes this object from the given stream. ! * ! * @param s the stream to read from ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @serialData the size of the list (int), followed by all the elements ! * (Object) in proper order */ private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ! s.defaultReadObject(); ! int i = s.readInt(); ! while (--i >= 0) addLastEntry(new Entry(s.readObject())); } ! ! /** ! * A ListIterator over the list. This class keeps track of its ! * position in the list and the two list entries it is between. ! * ! * @author Original author unknown ! * @author Eric Blake */ ! private final class LinkedListItr implements ListIterator { ! /** Number of modifications we know about. */ ! private int knownMod = modCount; ! ! /** Entry that will be returned by next(). */ ! private Entry next; ! ! /** Entry that will be returned by previous(). */ ! private Entry previous; ! ! /** Entry that will be affected by remove() or set(). */ ! private Entry lastReturned; ! ! /** Index of `next'. */ ! private int position; /** ! * Initialize the iterator. ! * ! * @param index the initial index */ LinkedListItr(int index) { if (index == size) { next = null; ! previous = last; ! } else { next = getEntry(index); ! previous = next.previous; ! } position = index; } + /** + * Checks for iterator consistency. + * + * @throws ConcurrentModificationException if the list was modified + */ private void checkMod() { if (knownMod != modCount) ! throw new ConcurrentModificationException(); } + /** + * Returns the index of the next element. + * + * @return the next index + * @throws ConcurrentModificationException if the list was modified + */ public int nextIndex() { checkMod(); return position; } + /** + * Returns the index of the previous element. + * + * @return the previous index + * @throws ConcurrentModificationException if the list was modified + */ public int previousIndex() { checkMod(); return position - 1; } + /** + * Returns true if more elements exist via next. + * + * @return true if next will succeed + * @throws ConcurrentModificationException if the list was modified + */ public boolean hasNext() { checkMod(); return (next != null); } + /** + * Returns true if more elements exist via previous. + * + * @return true if previous will succeed + * @throws ConcurrentModificationException if the list was modified + */ public boolean hasPrevious() { checkMod(); return (previous != null); } + /** + * Returns the next element. + * + * @return the next element + * @throws ConcurrentModificationException if the list was modified + * @throws NoSuchElementException if there is no next + */ public Object next() { checkMod(); if (next == null) ! throw new NoSuchElementException(); position++; lastReturned = previous = next; next = lastReturned.next; return lastReturned.data; } + /** + * Returns the previous element. + * + * @return the previous element + * @throws ConcurrentModificationException if the list was modified + * @throws NoSuchElementException if there is no previous + */ public Object previous() { checkMod(); if (previous == null) ! throw new NoSuchElementException(); position--; lastReturned = next = previous; previous = lastReturned.previous; return lastReturned.data; } + /** + * Remove the most recently returned element from the list. + * + * @throws ConcurrentModificationException if the list was modified + * @throws IllegalStateException if there was no last element + */ public void remove() { checkMod(); if (lastReturned == null) ! throw new IllegalStateException(); // Adjust the position to before the removed element, if the element // being removed is behind the cursor. if (lastReturned == previous) ! position--; next = lastReturned.next; previous = lastReturned.previous; removeEntry(lastReturned); ! knownMod++; ! lastReturned = null; } + /** + * Adds an element between the previous and next, and advance to the next. + * + * @param o the element to add + * @throws ConcurrentModificationException if the list was modified + */ public void add(Object o) { checkMod(); modCount++; knownMod++; + size++; + position++; Entry e = new Entry(o); e.previous = previous; e.next = next; if (previous != null) ! previous.next = e; else ! first = e; if (next != null) ! next.previous = e; else ! last = e; previous = e; lastReturned = null; } + /** + * Changes the contents of the element most recently returned. + * + * @param o the new element + * @throws ConcurrentModificationException if the list was modified + * @throws IllegalStateException if there was no last element + */ public void set(Object o) { checkMod(); if (lastReturned == null) ! throw new IllegalStateException(); lastReturned.data = o; } ! } // class LinkedListItr } diff -Nrc3pad gcc-3.0.4/libjava/java/util/List.java gcc-3.1/libjava/java/util/List.java *** gcc-3.0.4/libjava/java/util/List.java Wed Nov 22 11:59:59 2000 --- gcc-3.1/libjava/java/util/List.java Tue Jan 22 22:40:38 2002 *************** *** 1,5 **** /* List.java -- An ordered collection which allows indexed access ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* List.java -- An ordered collection which allows indexed access ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,155 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Doc comment for the interface itself needs to be put into english. - // ~ Some more @see clauses might be nice. package java.util; /** ! * [This is what this doc comment will mention: ! * ~ Additional restrictions on some methods. Others included for completeness. ! * ~ ListIterator and what it can do ! * ~ Positional and iterated access ! * ~ search (but linear time) ! * ~ be careful when containing self as an element, because equals and hashCode ! * loop.] */ public interface List extends Collection { /** ! * Insert an element into the list at a given position. * ! * @param index the location to insert the item. ! * @param o the object to insert. ! * @exception UnsupportedOperationException if this list does not support the ! * add operation. ! * @exception IndexOutOfBoundsException if index < 0 || index > size() ! * @exception ClassCastException if o cannot be added to this list due to its ! * type. ! * @exception IllegalArgumentException if o cannot be added to this list for ! * some other reason. */ void add(int index, Object o); /** ! * Add an element to the end of the list. * ! * @param o the object to add. ! * @returns true, as Collection defines this method as returning true if the ! * list was modified as a result of this action, and it always is for a ! * list. ! * @exception UnsupportedOperationException if this list does not support the ! * add operation. ! * @exception ClassCastException if o cannot be added to this list due to its ! * type. ! * @exception IllegalArgumentException if o cannot be added to this list for ! * some other reason. */ boolean add(Object o); /** ! * Insert the contents of a collection into the list at a given position. * ! * @param index the location to insert the collection. ! * @param c the collection to insert. ! * @returns true if the list was modified by this action, that is, if c is ! * non-empty. ! * @exception UnsupportedOperationException if this list does not support the ! * addAll operation. ! * @exception IndexOutOfBoundsException if index < 0 || index > size() ! * @exception ClassCastException if some element of c cannot be added to this ! * list due to its type. ! * @exception IllegalArgumentException if some element of c cannot be added ! * to this list for some other reason. */ boolean addAll(int index, Collection c); /** ! * Add the contents of a collection to the end of the list. * ! * @param c the collection to add. ! * @returns true if the list was modified by this action, that is, if c is ! * non-empty. ! * @exception UnsupportedOperationException if this list does not support the ! * addAll operation. ! * @exception ClassCastException if some element of c cannot be added to this ! * list due to its type. ! * @exception IllegalArgumentException if some element of c cannot be added ! * to this list for some other reason. */ boolean addAll(Collection c); /** * Clear the list, such that a subsequent call to isEmpty() would return ! * true. * ! * @exception UnsupportedOperationException if this list does not support the ! * clear operation. */ void clear(); /** * Test whether this list contains a given object as one of its elements. * ! * @param o the element to look for. ! * @returns true if this list contains an element e such that o == ! * null ? e == null : o.equals(e). */ boolean contains(Object o); /** * Test whether this list contains every element in a given collection. * ! * @param c the collection to test for. ! * @returns true if for every element o in c, contains(o) would return true. */ boolean containsAll(Collection c); /** * Test whether this list is equal to another object. A List is defined to be * equal to an object if and only if that object is also a List, and the two ! * lists are equal. Two lists l1 and l2 are defined to be equal if and only * if l1.size() == l2.size(), and for every integer n between 0 * and l1.size() - 1 inclusive, l1.get(n) == null ? * l2.get(n) == null : l1.get(n).equals(l2.get(n)). * ! * @param o the object to test for equality with this list. ! * @returns true if o is equal to this list. */ ! boolean equals(Object o); /** * Get the element at a given index in this list. * ! * @param index the index of the element to be returned. ! * @returns the element at index index in this list. ! * @exception IndexOutOfBoundsException if index < 0 || index >= size() */ Object get(int index); --- 18,214 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; /** ! * An ordered collection (also known as a list). This collection allows ! * access to elements by position, as well as control on where elements ! * are inserted. Unlike sets, duplicate elements are permitted by this ! * general contract (if a subclass forbids duplicates, this should be ! * documented). ! *

          ! * ! * List places additional requirements on iterator, ! * add, remove, equals, and ! * hashCode, in addition to requiring more methods. List ! * indexing is 0-based (like arrays), although some implementations may ! * require time proportional to the index to obtain an arbitrary element. ! * The List interface is incompatible with Set; you cannot implement both ! * simultaneously. ! *

          ! * ! * Lists also provide a ListIterator which allows bidirectional ! * traversal and other features atop regular iterators. Lists can be ! * searched for arbitrary elements, and allow easy insertion and removal ! * of multiple elements in one method call. ! *

          ! * ! * Note: While lists may contain themselves as elements, this leads to ! * undefined (usually infinite recursive) behavior for some methods like ! * hashCode or equals. ! * ! * @author Original author unknown ! * @author Eric Blake ! * @see Collection ! * @see Set ! * @see ArrayList ! * @see LinkedList ! * @see Vector ! * @see Arrays#asList(Object[]) ! * @see Collections#nCopies(int, Object) ! * @see Collections#EMPTY_LIST ! * @see AbstractList ! * @see AbstractSequentialList ! * @since 1.2 ! * @status updated to 1.4 */ public interface List extends Collection { /** ! * Insert an element into the list at a given position (optional operation). ! * This shifts all existing elements from that position to the end one ! * index to the right. This version of add has no return, since it is ! * assumed to always succeed if there is no exception. * ! * @param index the location to insert the item ! * @param o the object to insert ! * @throws UnsupportedOperationException if this list does not support the ! * add operation ! * @throws IndexOutOfBoundsException if index < 0 || index > size() ! * @throws ClassCastException if o cannot be added to this list due to its ! * type ! * @throws IllegalArgumentException if o cannot be added to this list for ! * some other reason */ void add(int index, Object o); /** ! * Add an element to the end of the list (optional operation). If the list ! * imposes restraints on what can be inserted, such as no null elements, ! * this should be documented. * ! * @param o the object to add ! * @return true, as defined by Collection for a modified list ! * @throws UnsupportedOperationException if this list does not support the ! * add operation ! * @throws ClassCastException if o cannot be added to this list due to its ! * type ! * @throws IllegalArgumentException if o cannot be added to this list for ! * some other reason */ boolean add(Object o); /** ! * Insert the contents of a collection into the list at a given position ! * (optional operation). Shift all elements at that position to the right ! * by the number of elements inserted. This operation is undefined if ! * this list is modified during the operation (for example, if you try ! * to insert a list into itself). * ! * @param index the location to insert the collection ! * @param c the collection to insert ! * @return true if the list was modified by this action, that is, if c is ! * non-empty ! * @throws UnsupportedOperationException if this list does not support the ! * addAll operation ! * @throws IndexOutOfBoundsException if index < 0 || index > size() ! * @throws ClassCastException if some element of c cannot be added to this ! * list due to its type ! * @throws IllegalArgumentException if some element of c cannot be added ! * to this list for some other reason ! * @throws NullPointerException if the specified collection is null ! * @see #add(int, Object) */ boolean addAll(int index, Collection c); /** ! * Add the contents of a collection to the end of the list (optional ! * operation). This operation is undefined if this list is modified ! * during the operation (for example, if you try to insert a list into ! * itself). * ! * @param c the collection to add ! * @return true if the list was modified by this action, that is, if c is ! * non-empty ! * @throws UnsupportedOperationException if this list does not support the ! * addAll operation ! * @throws ClassCastException if some element of c cannot be added to this ! * list due to its type ! * @throws IllegalArgumentException if some element of c cannot be added ! * to this list for some other reason ! * @throws NullPointerException if the specified collection is null ! * @see #add(Object) */ boolean addAll(Collection c); /** * Clear the list, such that a subsequent call to isEmpty() would return ! * true (optional operation). * ! * @throws UnsupportedOperationException if this list does not support the ! * clear operation */ void clear(); /** * Test whether this list contains a given object as one of its elements. + * This is defined as the existence of an element e such that + * o == null ? e == null : o.equals(e). * ! * @param o the element to look for ! * @return true if this list contains the element */ boolean contains(Object o); /** * Test whether this list contains every element in a given collection. * ! * @param c the collection to test for ! * @return true if for every element o in c, contains(o) would return true ! * @throws NullPointerException if the collection is null ! * @see #contains(Object) */ boolean containsAll(Collection c); /** * Test whether this list is equal to another object. A List is defined to be * equal to an object if and only if that object is also a List, and the two ! * lists have the same sequence. Two lists l1 and l2 are equal if and only * if l1.size() == l2.size(), and for every integer n between 0 * and l1.size() - 1 inclusive, l1.get(n) == null ? * l2.get(n) == null : l1.get(n).equals(l2.get(n)). * ! * @param o the object to test for equality with this list ! * @return true if o is equal to this list ! * @see Object#equals(Object) ! * @see #hashCode() */ ! /* boolean equals(Object o);*/ /** * Get the element at a given index in this list. * ! * @param index the index of the element to be returned ! * @return the element at index index in this list ! * @throws IndexOutOfBoundsException if index < 0 || index >= size() */ Object get(int index); *************** public interface List extends Collection *** 159,172 **** *

               *   hashCode = 1;
               *   Iterator i = list.iterator();
          !    *   while (i.hasNext()) {
          !    *     Object obj = i.next();
          !    *     hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
          !    *   }
               * 
          * This ensures that the general contract of Object.hashCode() is adhered to. * ! * @returns the hash code of this list. */ int hashCode(); --- 218,234 ---- *
               *   hashCode = 1;
               *   Iterator i = list.iterator();
          !    *   while (i.hasNext())
          !    *     {
          !    *       Object obj = i.next();
          !    *       hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode());
          !    *     }
               * 
          * This ensures that the general contract of Object.hashCode() is adhered to. * ! * @return the hash code of this list ! * @see Object#hashCode() ! * @see #equals(Object) */ int hashCode(); *************** public interface List extends Collection *** 174,195 **** * Obtain the first index at which a given object is to be found in this * list. * ! * @returns the least integer n such that o == null ? get(n) == null : ! * o.equals(get(n)), or -1 if there is no such index. */ int indexOf(Object o); /** * Test whether this list is empty, that is, if size() == 0. * ! * @returns true if this list contains no elements. */ boolean isEmpty(); /** ! * Obtain an Iterator over this list. * ! * @returns an Iterator over the elements of this list, in order. */ Iterator iterator(); --- 236,258 ---- * Obtain the first index at which a given object is to be found in this * list. * ! * @param o the object to search for ! * @return the least integer n such that o == null ? get(n) == null : ! * o.equals(get(n)), or -1 if there is no such index */ int indexOf(Object o); /** * Test whether this list is empty, that is, if size() == 0. * ! * @return true if this list contains no elements */ boolean isEmpty(); /** ! * Obtain an Iterator over this list, whose sequence is the list order. * ! * @return an Iterator over the elements of this list, in order */ Iterator iterator(); *************** public interface List extends Collection *** 197,315 **** * Obtain the last index at which a given object is to be found in this * list. * ! * @returns the greatest integer n such that o == null ? get(n) == null ! * : o.equals(get(n)). */ int lastIndexOf(Object o); /** * Obtain a ListIterator over this list, starting at the beginning. * ! * @returns a ListIterator over the elements of this list, in order, starting ! * at the beginning. */ ListIterator listIterator(); /** * Obtain a ListIterator over this list, starting at a given position. * * @param index the position, between 0 and size() inclusive, to begin the ! * iteration from. ! * @returns a ListIterator over the elements of this list, in order, starting ! * at index. ! * @exception IndexOutOfBoundsException if index < 0 || index > size() */ ListIterator listIterator(int index); /** ! * Remove the element at a given position in this list. * ! * @param index the position within the list of the object to remove. ! * @returns the object that was removed. ! * @exception UnsupportedOperationException if this list does not support the ! * remove operation. ! * @exception IndexOutOfBoundsException if index < 0 || index > size() */ Object remove(int index); /** ! * Remove the first occurence of an object from this list. That is, remove ! * the first element e such that o == null ? e == null : ! * o.equals(e). * ! * @param o the object to remove. ! * @returns true if the list changed as a result of this call, that is, if ! * the list contained at least one occurrence of o. ! * @exception UnsupportedOperationException if this list does not support the ! * remove operation. */ boolean remove(Object o); /** ! * Remove all elements of a given collection from this list. That is, remove ! * every element e such that c.contains(e). * ! * @returns true if this list was modified as a result of this call. ! * @exception UnsupportedOperationException if this list does not support the ! * removeAll operation. */ boolean removeAll(Collection c); /** * Remove all elements of this list that are not contained in a given ! * collection. That is, remove every element e such that !c.contains(e). * ! * @returns true if this list was modified as a result of this call. ! * @exception UnsupportedOperationException if this list does not support the ! * retainAll operation. */ boolean retainAll(Collection c); /** ! * Replace an element of this list with another object. * ! * @param index the position within this list of the element to be replaced. ! * @param o the object to replace it with. ! * @returns the object that was replaced. ! * @exception UnsupportedOperationException if this list does not support the ! * set operation. ! * @exception IndexOutOfBoundsException if index < 0 || index >= size() ! * @exception ClassCastException if o cannot be added to this list due to its ! * type. ! * @exception IllegalArgumentException if o cannot be added to this list for ! * some other reason. */ Object set(int index, Object o); /** ! * Get the number of elements in this list. * ! * @returns the number of elements in the list. */ int size(); /** * Obtain a List view of a subsection of this list, from fromIndex ! * (inclusive) to toIndex (exclusive). The returned list should be modifiable ! * if and only if this list is modifiable. Changes to the returned list ! * should be reflected in this list. If this list is structurally modified in * any way other than through the returned list, the result of any subsequent * operations on the returned list is undefined. * * @param fromIndex the index that the returned list should start from ! * (inclusive). ! * @param toIndex the index that the returned list should go to (exclusive). ! * @returns a List backed by a subsection of this list. ! * @exception IndexOutOfBoundsException if fromIndex < 0 || toIndex > size() ! * || fromIndex > toIndex. */ List subList(int fromIndex, int toIndex); /** * Copy the current contents of this list into an array. * ! * @returns an array of type Object[] and length equal to the length of this ! * list, containing the elements currently in this list, in order. */ Object[] toArray(); --- 260,394 ---- * Obtain the last index at which a given object is to be found in this * list. * ! * @return the greatest integer n such that o == null ? get(n) == null ! * : o.equals(get(n)), or -1 if there is no such index */ int lastIndexOf(Object o); /** * Obtain a ListIterator over this list, starting at the beginning. * ! * @return a ListIterator over the elements of this list, in order, starting ! * at the beginning */ ListIterator listIterator(); /** * Obtain a ListIterator over this list, starting at a given position. + * A first call to next() would return the same as get(index), and a + * first call to previous() would return the same as get(index - 1). * * @param index the position, between 0 and size() inclusive, to begin the ! * iteration from ! * @return a ListIterator over the elements of this list, in order, starting ! * at index ! * @throws IndexOutOfBoundsException if index < 0 || index > size() */ ListIterator listIterator(int index); /** ! * Remove the element at a given position in this list (optional operation). ! * Shifts all remaining elements to the left to fill the gap. * ! * @param index the position within the list of the object to remove ! * @return the object that was removed ! * @throws UnsupportedOperationException if this list does not support the ! * remove operation ! * @throws IndexOutOfBoundsException if index < 0 || index >= size() */ Object remove(int index); /** ! * Remove the first occurence of an object from this list (optional ! * operation). That is, remove the first element e such that ! * o == null ? e == null : o.equals(e). * ! * @param o the object to remove ! * @return true if the list changed as a result of this call, that is, if ! * the list contained at least one occurrence of o ! * @throws UnsupportedOperationException if this list does not support the ! * remove operation */ boolean remove(Object o); /** ! * Remove all elements of a given collection from this list (optional ! * operation). That is, remove every element e such that c.contains(e). * ! * @param c the collection to filter out ! * @return true if this list was modified as a result of this call ! * @throws UnsupportedOperationException if this list does not support the ! * removeAll operation ! * @throws NullPointerException if the collection is null ! * @see #remove(Object) ! * @see #contains(Object) */ boolean removeAll(Collection c); /** * Remove all elements of this list that are not contained in a given ! * collection (optional operation). That is, remove every element e such ! * that !c.contains(e). * ! * @param c the collection to retain ! * @return true if this list was modified as a result of this call ! * @throws UnsupportedOperationException if this list does not support the ! * retainAll operation ! * @throws NullPointerException if the collection is null ! * @see #remove(Object) ! * @see #contains(Object) */ boolean retainAll(Collection c); /** ! * Replace an element of this list with another object (optional operation). * ! * @param index the position within this list of the element to be replaced ! * @param o the object to replace it with ! * @return the object that was replaced ! * @throws UnsupportedOperationException if this list does not support the ! * set operation ! * @throws IndexOutOfBoundsException if index < 0 || index >= size() ! * @throws ClassCastException if o cannot be added to this list due to its ! * type ! * @throws IllegalArgumentException if o cannot be added to this list for ! * some other reason */ Object set(int index, Object o); /** ! * Get the number of elements in this list. If the list contains more ! * than Integer.MAX_VALUE elements, return Integer.MAX_VALUE. * ! * @return the number of elements in the list */ int size(); /** * Obtain a List view of a subsection of this list, from fromIndex ! * (inclusive) to toIndex (exclusive). If the two indices are equal, the ! * sublist is empty. The returned list should be modifiable if and only ! * if this list is modifiable. Changes to the returned list should be ! * reflected in this list. If this list is structurally modified in * any way other than through the returned list, the result of any subsequent * operations on the returned list is undefined. * * @param fromIndex the index that the returned list should start from ! * (inclusive) ! * @param toIndex the index that the returned list should go to (exclusive) ! * @return a List backed by a subsection of this list ! * @throws IndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > size() || fromIndex > toIndex ! * @throws IllegalArgumentException if fromIndex > toIndex (according to ! * AbstractList). Don't you love Sun's inconsistent specifications? */ List subList(int fromIndex, int toIndex); /** * Copy the current contents of this list into an array. * ! * @return an array of type Object[] and length equal to the length of this ! * list, containing the elements currently in this list, in order */ Object[] toArray(); *************** public interface List extends Collection *** 323,333 **** * Note: The fact that the following element is set to null is only useful * if it is known that this list does not contain any null elements. * ! * @param a the array to copy this list into. ! * @returns an array containing the elements currently in this list, in ! * order. ! * @exception ArrayStoreException if the type of any element of the ! * collection is not a subtype of the element type of a. */ Object[] toArray(Object[] a); } --- 402,413 ---- * Note: The fact that the following element is set to null is only useful * if it is known that this list does not contain any null elements. * ! * @param a the array to copy this list into ! * @return an array containing the elements currently in this list, in ! * order ! * @throws ArrayStoreException if the type of any element of the ! * collection is not a subtype of the element type of a ! * @throws NullPointerException if the specified array is null */ Object[] toArray(Object[] a); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/ListIterator.java gcc-3.1/libjava/java/util/ListIterator.java *** gcc-3.0.4/libjava/java/util/ListIterator.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/ListIterator.java Tue Jan 22 22:40:39 2002 *************** *** 1,5 **** /* ListIterator.java -- Extended Iterator for iterating over ordered lists ! Copyright (C) 1998, 1999 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* ListIterator.java -- Extended Iterator for iterating over ordered lists ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** package java.util; *** 32,147 **** * elements may be accessed in forward or reverse order, elements may be * replaced as well as removed, and new elements may be inserted, during the * traversal of the list. */ public interface ListIterator extends Iterator { /** * Tests whether there are elements remaining in the list in the forward ! * direction. * ! * @return true if there is at least one more element in the list in the ! * forward direction, that is, if the next call to next will not throw ! * NoSuchElementException. */ boolean hasNext(); /** * Tests whether there are elements remaining in the list in the reverse ! * direction. * ! * @return true if there is at least one more element in the list in the ! * reverse direction, that is, if the next call to previous will not throw ! * NoSuchElementException. */ boolean hasPrevious(); /** * Obtain the next element in the list in the forward direction. Repeated ! * calls to next may be used to iterate over the entire list, or calls to next ! * and previous may be used together to go forwards and backwards. Alternating ! * calls to next and previous will return the same element. * * @return the next element in the list in the forward direction ! * @exception NoSuchElementException if there are no more elements */ Object next(); /** * Obtain the next element in the list in the reverse direction. Repeated ! * calls to previous may be used to iterate backwards over the entire list, or ! * calls to next and previous may be used together to go forwards and * backwards. Alternating calls to next and previous will return the same * element. * * @return the next element in the list in the reverse direction ! * @exception NoSuchElementException if there are no more elements */ Object previous(); /** * Find the index of the element that would be returned by a call to next. * ! * @return the index of the element that would be returned by a call to next, ! * or list.size() if the iterator is at the end of the list. */ int nextIndex(); /** ! * Find the index of the element that would be returned by a call to previous. * ! * @return the index of the element that would be returned by a call to ! * previous, or -1 if the iterator is at the beginning of the list. */ int previousIndex(); /** ! * Insert an element into the list at the current position of the iterator. ! * The element is inserted in between the element that would be returned by ! * previous and the element that would be returned by next. After the ! * insertion, a subsequent call to next is unaffected, but a call to ! * previous returns the item that was added. This operation is optional, it ! * may throw an UnsupportedOperationException. * * @param o the object to insert into the list ! * @exception ClassCastException the object is of a type which cannot be added ! * to this list ! * @exception IllegalArgumentException some other aspect of the object stops ! * it being added to this list ! * @exception UnsupportedOperationException if this ListIterator does not ! * support the add operation */ void add(Object o); /** * Remove from the list the element last returned by a call to next or ! * previous. This method may only be called if neither add nor remove have ! * been called since the last call to next or previous. This operation is ! * optional, it may throw an UnsupportedOperationException. * ! * @exception IllegalStateException if neither next or previous have been ! * called, or if add or remove has been called since the last call to next ! * or previous. ! * @exception UnsupportedOperationException if this ListIterator does not ! * support the remove operation. */ void remove(); /** * Replace the element last returned by a call to next or previous with a ! * given object. This method may only be called if neither add nor remove have ! * been called since the last call to next or previous. This operation is ! * optional, it may throw an UnsupportedOperationException. * * @param o the object to replace the element with ! * @exception ClassCastException the object is of a type which cannot be added ! * to this list ! * @exception IllegalArgumentException some other aspect of the object stops ! * it being added to this list ! * @exception IllegalStateException if neither next or previous have been ! * called, or if add or remove has been called since the last call to next ! * or previous. ! * @exception UnsupportedOperationException if this ListIterator does not ! * support the set operation. */ void set(Object o); } --- 43,170 ---- * elements may be accessed in forward or reverse order, elements may be * replaced as well as removed, and new elements may be inserted, during the * traversal of the list. + *

          + * + * A list with n elements provides n+1 iterator positions (the front, the end, + * or between two elements). Note that remove and set + * operate on the last element returned, whether it was by next + * or previous. + * + * @author Original author unknown + * @author Eric Blake + * @see Collection + * @see List + * @see Iterator + * @see Enumeration + * @since 1.2 + * @status updated to 1.4 */ public interface ListIterator extends Iterator { /** * Tests whether there are elements remaining in the list in the forward ! * direction. In other words, next() will not fail with a ! * NoSuchElementException. * ! * @return true if the list continues in the forward direction */ boolean hasNext(); /** * Tests whether there are elements remaining in the list in the reverse ! * direction. In other words, previous() will not fail with a ! * NoSuchElementException. * ! * @return true if the list continues in the reverse direction */ boolean hasPrevious(); /** * Obtain the next element in the list in the forward direction. Repeated ! * calls to next may be used to iterate over the entire list, or calls to ! * next and previous may be used together to go forwards and backwards. ! * Alternating calls to next and previous will return the same element. * * @return the next element in the list in the forward direction ! * @throws NoSuchElementException if there are no more elements */ Object next(); /** * Obtain the next element in the list in the reverse direction. Repeated ! * calls to previous may be used to iterate backwards over the entire list, ! * or calls to next and previous may be used together to go forwards and * backwards. Alternating calls to next and previous will return the same * element. * * @return the next element in the list in the reverse direction ! * @throws NoSuchElementException if there are no more elements */ Object previous(); /** * Find the index of the element that would be returned by a call to next. + * If hasNext() returns false, this returns the list size. * ! * @return the index of the element that would be returned by next() */ int nextIndex(); /** ! * Find the index of the element that would be returned by a call to ! * previous. If hasPrevious() returns false, this returns -1. * ! * @return the index of the element that would be returned by previous() */ int previousIndex(); /** ! * Insert an element into the list at the current position of the iterator ! * (optional operation). The element is inserted in between the element that ! * would be returned by previous and the element that would be returned by ! * next. After the insertion, a subsequent call to next is unaffected, but ! * a call to previous returns the item that was added. The values returned ! * by nextIndex() and previousIndex() are incremented. * * @param o the object to insert into the list ! * @throws ClassCastException the object is of a type which cannot be added ! * to this list ! * @throws IllegalArgumentException some other aspect of the object stops ! * it being added to this list ! * @throws UnsupportedOperationException if this ListIterator does not ! * support the add operation */ void add(Object o); /** * Remove from the list the element last returned by a call to next or ! * previous (optional operation). This method may only be called if neither ! * add nor remove have been called since the last call to next or previous. * ! * @throws IllegalStateException if neither next or previous have been ! * called, or if add or remove has been called since the last call ! * to next or previous ! * @throws UnsupportedOperationException if this ListIterator does not ! * support the remove operation */ void remove(); /** * Replace the element last returned by a call to next or previous with a ! * given object (optional operation). This method may only be called if ! * neither add nor remove have been called since the last call to next or ! * previous. * * @param o the object to replace the element with ! * @throws ClassCastException the object is of a type which cannot be added ! * to this list ! * @throws IllegalArgumentException some other aspect of the object stops ! * it being added to this list ! * @throws IllegalStateException if neither next or previous have been ! * called, or if add or remove has been called since the last call ! * to next or previous ! * @throws UnsupportedOperationException if this ListIterator does not ! * support the set operation */ void set(Object o); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/ListResourceBundle.java gcc-3.1/libjava/java/util/ListResourceBundle.java *** gcc-3.0.4/libjava/java/util/ListResourceBundle.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/ListResourceBundle.java Tue Jan 22 22:40:39 2002 *************** *** 1,52 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! ! This file is part of libgcj. ! ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.util; ! /** ! * @author Anthony Green ! * @date November 26, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3, ! * and "The Java Language Specification", ISBN 0-201-63451-1. */ ! public abstract class ListResourceBundle extends ResourceBundle ! { ! public final Object handleGetObject(String key) ! { ! Object a[][] = getContents(); ! for (int i = 0; i < a.length; i++) ! { ! if (key.compareTo((String) a[i][0]) == 0) ! return a[i][1]; ! } ! throw new MissingResourceException("can't find handle", ! getClass().getName(), ! key); ! } ! public Enumeration getKeys() ! { ! Object a[][] = getContents(); - Vector keys = new Vector(a.length); ! for (int i = 0; i < a.length; i++) ! keys.addElement(a[i][0]); ! return keys.elements(); ! } protected abstract Object[][] getContents(); ! public ListResourceBundle() { ! } } --- 1,111 ---- ! /* java.util.ListResourceBundle ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.util; ! /** ! * A ListResouceBundle provides an easy way, to create ! * your own resource bundle. It is an abstract class that you can ! * subclass. You should then overwrite the getContents method, that ! * provides a key/value list. ! *
          ! * The key/value list is a two dimensional list of Object. The first ! * dimension ranges over the resources. The second dimension ranges ! * from zero (key) to one (value). The keys must be of type String. ! *
          ! * XXX Example! ! * ! * @see Locale ! * @see PropertyResourceBundle ! * @author Jochen Hoenicke */ ! public abstract class ListResourceBundle extends ResourceBundle ! { ! /** ! * The constructor. It does nothing special. ! */ ! public ListResourceBundle() ! { ! } + /** + * Gets the key/value list. You must override this method. + * @return a two dimensional list of Objects. The first dimension + * ranges over the objects, and the second dimension ranges from + * zero (key) to one (value). + */ protected abstract Object[][] getContents(); ! /** ! * Override this method to provide the resource for a keys. This gets ! * called by getObject. ! * @param key The key of the resource. ! * @return The resource for the key or null if it doesn't exists. ! */ ! public final Object handleGetObject(String key) ! { ! Object[][] contents = getContents(); ! for (int i = 0; i < contents.length; i++) ! { ! if (key.equals(contents[i][0])) ! return contents[i][1]; ! } ! return null; ! } ! ! /** ! * This method should return all keys for which a resource exists. ! * @return An enumeration of the keys. ! */ ! public Enumeration getKeys() ! { ! final Object[][] contents = getContents(); ! ! return new Enumeration() { ! int i = 0; ! public boolean hasMoreElements() ! { ! return i < contents.length; ! } ! public Object nextElement() ! { ! return contents[i++][0]; ! } ! }; ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Locale.java gcc-3.1/libjava/java/util/Locale.java *** gcc-3.0.4/libjava/java/util/Locale.java Fri Oct 27 10:33:46 2000 --- gcc-3.1/libjava/java/util/Locale.java Tue Jan 22 22:40:39 2002 *************** *** 1,157 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package java.util; /** ! * @author Per Bothner ! * @date October 24, 1998. ! */ ! ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3, ! * and "The Java Language Specification", ISBN 0-201-63451-1. ! * Status: None of the getDisplayXXX or getISO3XXX methods are implemented. */ public final class Locale implements java.io.Serializable, Cloneable { ! // The fields are as specified in Sun's "Serialized Form" ! // in the JDK 1.2 beta 4 API specification. ! private String country; ! private int hashcode; private String language; private String variant; ! private static Locale defaultLocale; ! private static final long serialVersionUID = 9149081749638150636L; ! // These are as specified in the JDK 1.2 AP documentation ! // LANGUAGE constants ... country-neutral ! public static final Locale CHINESE = new Locale ("zh", ""); ! public static final Locale ENGLISH = new Locale ("en", ""); ! public static final Locale FRENCH = new Locale ("fr", ""); ! public static final Locale GERMAN = new Locale ("de", ""); ! public static final Locale ITALIAN = new Locale ("it", ""); ! public static final Locale JAPANESE = new Locale ("ja", ""); ! public static final Locale KOREAN = new Locale ("ko", ""); ! // COUNTRY constants ... countries can be multi-lingual ! public static final Locale CANADA = new Locale ("en", "CA"); ! public static final Locale CANADA_FRENCH = new Locale ("fr", "CA"); ! public static final Locale FRANCE = new Locale ("fr", "FR"); ! public static final Locale GERMANY = new Locale ("de", "DE"); ! public static final Locale ITALY = new Locale ("it", "IT"); ! public static final Locale JAPAN = new Locale ("ja", "JP"); ! public static final Locale KOREA = new Locale ("ko", "KR"); ! public static final Locale UK = new Locale ("en", "GB"); ! public static final Locale US = new Locale ("en", "US"); ! // Chinese has multiple scripts and political bodies ! public static final Locale SIMPLIFIED_CHINESE = new Locale ("zh", "CN"); ! public static final Locale TRADITIONAL_CHINESE = new Locale ("zh", "TW"); ! public static final Locale PRC = SIMPLIFIED_CHINESE; ! public static final Locale TAIWAN = TRADITIONAL_CHINESE; ! public static final Locale CHINA = PRC; ! public Locale (String languageCode, String countryCode) { ! this (languageCode, countryCode, ""); } ! public Locale (String languageCode, String countryCode, ! String variantCode) { ! language = languageCode.toLowerCase(); ! country = countryCode.toUpperCase(); ! variant = variantCode.toUpperCase(); ! hashcode = (languageCode.hashCode() ! ^ countryCode.hashCode() ! ^ variantCode.hashCode()); } ! public Object clone () { ! return (Object) new Locale (language, country, variant); } ! public boolean equals (Object obj) { ! if (! (obj instanceof Locale)) ! return false; ! Locale loc = (Locale) obj; ! return (language.equals(loc.language) ! && country.equals(loc.country) ! && variant.equals(loc.variant)); ! } ! public String getCountry () { ! return country; } ! public String getLanguage () { return language; } ! public String getVariant () { return variant; } ! public int hashCode () { ! return hashcode; } ! private static synchronized Locale setDefault() { ! if (defaultLocale != null) ! return defaultLocale; ! String language = System.getProperty("user.language"); ! String country = System.getProperty("user.region"); ! defaultLocale = new Locale (language == null ? "en" : language, ! country == null ? "" : country); ! return defaultLocale; } ! public static Locale getDefault () { ! return defaultLocale == null ? setDefault() : defaultLocale; } ! public static void setDefault (Locale newLocale) { ! defaultLocale = newLocale; } ! public String toString () { ! StringBuffer result = new StringBuffer(20); ! result.append(language); ! if (country.length() > 0) { ! result.append('_'); ! result.append(country); ! if (variant.length() > 0) ! { ! result.append('_'); ! result.append(variant); ! } } return result.toString(); } ! /** * @serialdata According to jdk1.2 the hashcode should always be * written as -1; */ ! private void writeObject(java.io.ObjectOutputStream output) throws java.io.IOException { int tmpHashcode = hashcode; --- 1,698 ---- ! /* java.util.Locale ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /** ! * Locales represent a specific country and culture. ! *

          ! * Classes which can be passed a Locale object tailor their information ! * for a given locale. For instance, currency number formatting is ! * handled differently for the USA and France. ! *

          ! * Locales are made up of a language code, a country code, and an optional ! * set of variant strings. ! *

          ! * Language codes are represented by ! * ISO 639:1988 ! * w/ additions from ISO 639/RA Newsletter No. 1/1989 ! * and a decision of the Advisory Committee of ISO/TC39 on ! * August 8, 1997. ! *

          ! * Country codes are represented by ! * ISO 3166. ! *

          ! * Variant strings are vendor and browser specific. Standard variant ! * strings include "POSIX" for POSIX, "WIN" for MS-Windows, and "MAC" for ! * Macintosh. When there is more than one variant string, they must ! * be separated by an underscore (U+005F). ! *

          ! * The default locale is determined by the values of the system properties ! * user.language, user.region, and user.variant. ! * @see ResourceBundle ! * @see java.text.Format ! * @see java.text.NumberFormat ! * @see java.text.Collator ! * @author Jochen Hoenicke ! * @author Paul Fisher */ public final class Locale implements java.io.Serializable, Cloneable { ! /** ! * Locale which represents the English language. ! */ ! public static final Locale ENGLISH = new Locale("en", ""); ! /** ! * Locale which represents the English language. ! */ ! public static final Locale FRENCH = new Locale("fr", ""); ! /** ! * Locale which represents the German language. ! */ ! public static final Locale GERMAN = new Locale("de", ""); ! /** ! * Locale which represents the Italian language. ! */ ! public static final Locale ITALIAN = new Locale("it", ""); ! /** ! * Locale which represents the Japanese language. ! */ ! public static final Locale JAPANESE = new Locale("ja", ""); ! /** ! * Locale which represents the Korean language. ! */ ! public static final Locale KOREAN = new Locale("ko", ""); ! /** ! * Locale which represents the Chinese language. ! */ ! public static final Locale CHINESE = new Locale("zh", ""); ! /** ! * Locale which represents the Chinese language as used in China. ! */ ! public static final Locale SIMPLIFIED_CHINESE = new Locale("zh", "CN"); ! /** ! * Locale which represents the Chinese language as used in Taiwan. ! * Same as TAIWAN Locale. ! */ ! public static final Locale TRADITIONAL_CHINESE = new Locale("zh", "TW"); ! /** ! * Locale which represents France. ! */ ! public static final Locale FRANCE = new Locale("fr", "FR"); ! /** ! * Locale which represents Germany. ! */ ! public static final Locale GERMANY = new Locale("de", "DE"); ! /** ! * Locale which represents Italy. ! */ ! public static final Locale ITALY = new Locale("it", "IT"); ! /** ! * Locale which represents Japan. ! */ ! public static final Locale JAPAN = new Locale("ja", "JP"); ! /** ! * Locale which represents Korea. ! */ ! public static final Locale KOREA = new Locale("ko", "KR"); ! /** ! * Locale which represents China. ! * Same as SIMPLIFIED_CHINESE Locale. ! */ ! public static final Locale CHINA = SIMPLIFIED_CHINESE; ! /** ! * Locale which represents the People's Republic of China. ! * Same as CHINA Locale. ! */ ! public static final Locale PRC = CHINA; ! /** ! * Locale which represents Taiwan. ! * Same as TRADITIONAL_CHINESE Locale. ! */ ! public static final Locale TAIWAN = TRADITIONAL_CHINESE; ! /** ! * Locale which represents the United Kingdom. ! */ ! public static final Locale UK = new Locale("en", "GB"); ! /** ! * Locale which represents the United States. ! */ ! public static final Locale US = new Locale("en", "US"); ! /** ! * Locale which represents the English speaking portion of Canada. ! */ ! public static final Locale CANADA = new Locale("en", "CA"); ! /** ! * Locale which represents the French speaking portion of Canada. ! */ ! public static final Locale CANADA_FRENCH = new Locale("fr", "CA"); ! ! /** ! * We are compatible to sun's Locale. ! */ ! static final long serialVersionUID = 9149081749638150636L; ! ! /** ! * The language code, as returned by getLanguage(). ! * @serial ! */ private String language; + /** + * The country code, as returned by getCountry(). + * @serial + */ + private String country; + /** + * The variant code, as returned by getVariant(). + * @serial + */ private String variant; ! /** ! * This is the cached hashcode. When writing to stream, we write -1. ! * @serial ! */ ! private int hashcode; ! /** ! * Convert old iso639 codes to the new ones. ! */ ! private String convertLanguage(String language) ! { ! if (language.equals("")) ! return language; + language = language.toLowerCase(); + int index = "iw,in,ji".indexOf(language); + if (index != -1) + return "he,id,yi".substring(index, index + 2); + return language; + } ! /** ! * Creates a new locale for the given language and country. ! * @param language lowercase two-letter ISO-639 A2 language code. ! * @param country uppercase two-letter ISO-3166 A2 contry code. ! * @param variant vendor and browser specific. ! */ ! public Locale(String language, String country, String variant) ! { ! this.language = convertLanguage(language); ! this.country = country.toUpperCase(); ! this.variant = variant.toUpperCase(); ! this.hashcode = (this.language.hashCode() ^ this.country.hashCode() ! ^ this.variant.hashCode()); ! } ! /** ! * Creates a new locale for the given language and country. ! * @param language lowercase two-letter ISO-639 A2 language code. ! * @param country uppercase two-letter ISO-3166 A2 country code. ! */ ! public Locale(String language, String country) ! { ! this(language, country, ""); ! } ! private static Locale defaultLocale = ! new Locale(System.getProperty("user.language", ""), ! System.getProperty("user.region", ""), ! System.getProperty("user.variant", "")); ! /** ! * Returns the default Locale. The default locale is generally ! * once set on start up and then never changed. Normally you ! * should use this locale for everywhere you need a locale. ! * The initial setting matches the default locale, the user has ! * chosen. ! */ ! public static Locale getDefault() { ! return defaultLocale; } ! /** ! * Changes the default locale. Normally only called on program ! * start up. Note that this doesn't change the locale for other ! * programs. ! */ ! public static void setDefault(Locale newLocale) { ! defaultLocale = newLocale; } ! /** ! * Returns the list of available locales. ! */ ! public static Locale[] getAvailableLocales() { ! /* I only return those for which localized language ! * or country information exists. ! * XXX - remove hard coded list. ! */ ! return new Locale[] ! { ! ENGLISH, FRENCH, GERMAN, new Locale("ga", "") ! }; } ! /** ! * Returns a list of all 2-letter uppercase country codes as defined ! * in ISO 3166 ! */ ! public static String[] getISOCountries() ! { ! return new String[] { ! "AF", "AL", "DZ", "AS", "AD", "AO", "AI", "AQ", "AG", ! "AR", "AM", "AW", "AU", "AT", "AZ", "BS", "BH", "BD", ! "BB", "BY", "BE", "BZ", "BJ", "BM", "BT", "BO", "BA", ! "BW", "BV", "BR", "IO", "BN", "BG", "BF", "BI", "KH", ! "CM", "CA", "CV", "KY", "CF", "TD", "CL", "CN", "CX", ! "CC", "CO", "KM", "CG", "CK", "CR", "CI", "HR", "CU", ! "CY", "CZ", "DK", "DJ", "DM", "DO", "TP", "EC", "EG", ! "SV", "GQ", "ER", "EE", "ET", "FK", "FO", "FJ", "FI", ! "FR", "FX", "GF", "PF", "TF", "GA", "GM", "GE", "DE", ! "GH", "GI", "GR", "GL", "GD", "GP", "GU", "GT", "GN", ! "GW", "GY", "HT", "HM", "HN", "HK", "HU", "IS", "IN", ! "ID", "IR", "IQ", "IE", "IL", "IT", "JM", "JP", "JO", ! "KZ", "KE", "KI", "KP", "KR", "KW", "KG", "LA", "LV", ! "LB", "LS", "LR", "LY", "LI", "LT", "LU", "MO", "MK", ! "MG", "MW", "MY", "MV", "ML", "MT", "MH", "MQ", "MR", ! "MU", "YT", "MX", "FM", "MD", "MC", "MN", "MS", "MA", ! "MZ", "MM", "NA", "NR", "NP", "NL", "AN", "NC", "NZ", ! "NI", "NE", "NG", "NU", "NF", "MP", "NO", "OM", "PK", ! "PW", "PA", "PG", "PY", "PE", "PH", "PN", "PL", "PT", ! "PR", "QA", "RE", "RO", "RU", "RW", "KN", "LC", "VC", ! "WS", "SM", "ST", "SA", "SN", "SC", "SL", "SG", "SK", ! "SI", "SB", "SO", "ZA", "GS", "ES", "LK", "SH", "PM", ! "SD", "SR", "SJ", "SZ", "SE", "CH", "SY", "TW", "TJ", ! "TZ", "TH", "TG", "TK", "TO", "TT", "TN", "TR", "TM", ! "TC", "TV", "UG", "UA", "AE", "GB", "US", "UM", "UY", ! "UZ", "VU", "VA", "VE", "VN", "VG", "VI", "WF", "EH", ! "YE", "YU", "ZR", "ZM", "ZW"}; ! } ! /** ! * Returns a list of all 2-letter lowercase language codes as defined ! * in ISO 639 (both old and new variant). ! */ ! public static String[] getISOLanguages() { ! return new String[] ! { ! "aa", "ab", "af", "am", "ar", "as", "ay", "az", "ba", ! "be", "bg", "bh", "bi", "bn", "bo", "br", "ca", "co", ! "cs", "cy", "da", "de", "dz", "el", "en", "eo", "es", ! "et", "eu", "fa", "fi", "fj", "fo", "fr", "fy", "ga", ! "gd", "gl", "gn", "gu", "ha", "iw", "he", "hi", "hr", ! "hu", "hy", "ia", "in", "id", "ie", "ik", "is", "it", ! "iu", "ja", "jw", "ka", "kk", "kl", "km", "kn", "ko", ! "ks", "ku", "ky", "la", "ln", "lo", "lt", "lv", "mg", ! "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", ! "na", "ne", "nl", "no", "oc", "om", "or", "pa", "pl", ! "ps", "pt", "qu", "rm", "rn", "ro", "ru", "rw", "sa", ! "sd", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", ! "sq", "sr", "ss", "st", "su", "sv", "sw", "ta", "te", ! "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", ! "tt", "tw", "ug", "uk", "ur", "uz", "vi", "vo", "wo", ! "xh", "ji", "yi", "yo", "za", "zh", "zu"}; } ! /** ! * Returns the language code of this locale. ! * @return language code portion of this locale, or an empty String if ! * none exists ! */ ! public String getLanguage() { return language; } ! /** ! * Returns the country code of this locale. ! * @return country code portion of this locale, or an empty String if ! * none exists ! */ ! public String getCountry() ! { ! return country; ! } ! ! /** ! * Returns the variant code of this locale. ! */ ! public String getVariant() { return variant; } ! /** ! * Gets the string representation of the current locale. This ! * consists of the language, the country, and the variant, ! * separated by an underscore. If one of this three component is ! * missing the underscore will also disappear. ! * @return the string representation of this Locale. ! */ ! public final String toString() { ! StringBuffer result = new StringBuffer(language); ! String underscore = ""; ! if (language.length() != 0) ! underscore = "_"; ! if (country.length() != 0) ! { ! result.append(underscore); ! result.append(country); ! underscore = "_"; ! } ! if (variant.length() != 0) ! { ! result.append(underscore); ! result.append(variant); ! } ! return result.toString(); } ! /** ! * Returns the three-letter ISO language abbrevation of this locale. ! * @exception MissingResourceException if the three-letter code is not ! * known. ! */ ! public String getISO3Language() throws MissingResourceException { ! int index = ! ("aa,ab,af,am,ar,as,ay,az,ba,be,bg,bh,bi,bn,bo,br,ca,co,cs,cy," + ! "da,de,dz,el,en,eo,es,et,eu,fa,fi,fj,fo,fr,fy,ga,gd,gl,gn,gu," + ! "gv,ha,hi,hr,hu,hy,ia,ie,ik,id,is,it,iu,he,ja,yi,jw,ka,kk,kl," + ! "km,kn,ko,ks,ku,kw,ky,la,lb,ln,lo,lt,lv,mg,mi,mk,ml,mn,mo,mr," + ! "ms,mt,my,na,ne,nl,no,oc,om,or,pa,pl,ps,pt,qu,rm,rn,ro,ru,rw," + ! "sa,sd,se,sg,sh,si,sk,sl,sm,sn,so,sq,sr,ss,st,su,sv,sw,ta,te," + ! "tg,th,ti,tk,tl,tn,to,tr,ts,tt,tw,ug,uk,ur,uz,vi,vo,wo,xh,yo," + ! "za,zh,zu,").indexOf(language + ","); ! ! if (index == -1 || language.length() != 2) ! throw new MissingResourceException ! ("Can't find ISO3 language for " + language, ! "java.util.Locale", language); ! ! /* Don't read this aloud. This are the three letter language codes ! */ ! return ! ("aarabkaframharaasmaymazebakbelbulbihbisbenbodbrecatcoscescym" + ! "dandeudzoellengepospaesteusfasfinfijfaofrafrygaigdhglggrnguj" + ! "maxhauhinhrvhunhyeinaileipkindislitaikuhebjpnyidjawkatkazkal" + ! "khmkankorkaskurcorkirlatltzlinlaolitlavmlgmrimkdmalmonmolmar" + ! "msamltmyanaunepnldnorociormoripanpolpusporquerohrunronruskin" + ! "sansndsmisagsrpsinslkslvsmosnasomsqisrpsswsotsunsweswatamtel" + ! "tgkthatirtuktgltsntonturtsotattwiuigukrurduzbvievolwolxhoyor" + ! "zhazhozul").substring(index, index + 3); } ! /** ! * Returns the three-letter ISO country abbrevation of the locale. ! * @exception MissingResourceException if the three-letter code is not ! * known. ! */ ! public String getISO3Country() throws MissingResourceException { ! int index = ! ("AF,AL,DZ,AS,AD,AO,AI,AQ,AG,AR,AM,AW,AU,AT,AZ,BS,BH,BD,BB,BY,BE," + ! "BZ,BJ,BM,BT,BO,BA,BW,BV,BR,IO,BN,BG,BF,BI,KH,CM,CA,CV,KY,CF,TD," + ! "CL,CN,CX,CC,CO,KM,CG,CD,CK,CR,CI,HR,CU,CY,CZ,DK,DJ,DM,DO,TP,EC," + ! "EG,SV,GQ,ER,EE,ET,FK,FO,FJ,FI,FR,FX,GF,PF,TF,GA,GM,GE,DE,GH,GI," + ! "GR,GL,GD,GP,GU,GT,GN,GW,GY,HT,HM,VA,HN,HK,HU,IS,IN,ID,IR,IQ,IE," + ! "IL,IT,JM,JP,JO,KZ,KE,KI,KP,KR,KW,KG,LA,LV,LB,LS,LR,LY,LI,LT,LU," + ! "MO,MK,MG,MW,MY,MV,ML,MT,MH,MQ,MR,MU,YT,MX,FM,MD,MC,MN,MS,MA,MZ," + ! "MM,NA,NR,NP,NL,AN,NC,NZ,NI,NE,NG,NU,NF,MP,NO,OM,PK,PW,PA,PG,PY," + ! "PE,PH,PN,PL,PT,PR,QA,RE,RO,RU,RW,KN,LC,VC,WS,SM,ST,SA,SN,SC,SL," + ! "SG,SK,SI,SB,SO,ZA,GS,ES,LK,SH,PM,SD,SR,SJ,SZ,SE,CH,SY,TW,TJ,TZ," + ! "TH,TG,TK,TO,TT,TN,TR,TM,TC,TV,UG,UA,AE,GB,US,UM,UY,UZ,VU,VE,VN," + ! "VG,VI,WF,EH,YE,YU,ZM,ZW,").indexOf(country + ","); ! ! if (index == -1 || language.length() != 2) ! throw new MissingResourceException ! ("Can't find ISO3 country for " + country, ! "java.util.Locale", country); ! ! /* Don't read this aloud. This are the three letter country codes ! */ ! return ! ("AFGALBDZAASMANDAGOAIAATAATGARGARMABWAUSAUTAZEBHSBHRBGDBRBBLRBEL" + ! "BLZBENBMUBTNBOLBIHBWABVTBRAIOTBRNBGRBFABDIKHMCMRCANCPVCYMCAFTCD" + ! "CHLCHNCXRCCKCOLCOMCOGCODCOKCRICIVHRVCUBCYPCZEDNKDJIDMADOMTMPECU" + ! "EGYSLVGNQERIESTETHFLKFROFJIFINFRAFXXGUFPYFATFGABGMBGEODEUGHAGIB" + ! "GRCGRLGRDGLPGUMGTMGINGNBGUYHTIHMDVATHNDHKGHUNISLINDIDNIRNIRQIRL" + ! "ISRITAJAMJPNJORKAZKENKIRPRKKORKWTKGZLAOLVALBNLSOLBRLBYLIELTULUX" + ! "MACMKDMDGMWIMYSMDVMLIMLTMHLMTQMRTMUSMYTMEXFSMMDAMCOMNGMSRMARMOZ" + ! "MMRNAMNRUNPLNLDANTNCLNZLNICNERNGANIUNFKMNPNOROMNPAKPLWPANPNGPRY" + ! "PERPHLPCNPOLPRTPRIQATREUROMRUSRWAKNALCAVCTWSMSMRSTPSAUSENSYCSLE" + ! "SGPSVKSVNSLBSOMZAFSGSESPLKASHNSPMSDNSURSJMSWZSWECHESYRTWNTJKTZA" + ! "THATGOTKLTONTTOTUNTURTKMTCATUVUGAUKRAREGBRUSAUMIURYUZBVUTVENVNM" + ! "VGBVIRWLFESHYEMYUGZMBZWE").substring(index, index + 3); } ! /** ! * Gets the country name suitable for display to the user, formatted ! * for the default locale. This has the same effect as ! *

          !    * getDisplayLanguage(Locale.getDefault());
          !    * 
          ! * ! * @return the language name of this locale localized to the ! * default locale. If the localized is not found, the ISO code ! * is returned. ! */ ! public String getDisplayLanguage() { ! return getDisplayLanguage(getDefault()); } ! /** ! * Gets the language name suitable for display to the user, formatted ! * for a specified locale. ! * @param locale locale to use for formatting ! * @return the language name of this locale localized to the ! * given locale. If the localized is not found, the ISO code ! * is returned. ! */ ! public String getDisplayLanguage(Locale locale) { ! try { ! ResourceBundle bundle ! = ResourceBundle.getBundle("gnu.java.locale.iso639", locale); ! return bundle.getString(language); ! } ! catch (MissingResourceException ex) ! { ! return language; } + } + + /** + * Returns the country name of this locale localized to the + * default locale. If the localized is not found, the ISO code + * is returned. This has the same effect as + *
          +    * getDisplayCountry(Locale.getDefault());
          +    * 
          + */ + public String getDisplayCountry() + { + return getDisplayCountry(getDefault()); + } + + /** + * Gets the country name suitable for display to the user, formatted + * for a specified locale. + * + * @param locale locale to use for formatting + * @return the country name of this locale localized to the given + * locale. If the localized is not found, the ISO country code is + * returned. */ + public String getDisplayCountry(Locale locale) + { + try + { + ResourceBundle bundle = + ResourceBundle.getBundle("gnu.java.locale.iso3166", locale); + return bundle.getString(country); + } + catch (MissingResourceException ex) + { + return country; + } + } + + /** + * Returns the variant name of this locale localized to the + * default locale. If the localized is not found, the variant code + * itself is returned. This has the same effect as + *
          +    * getDisplayVariant(Locale.getDefault());
          +    * 
          + */ + public String getDisplayVariant() + { + return getDisplayVariant(getDefault()); + } + + /** + * Returns the variant name of this locale localized to the + * given locale. If the localized is not found, the variant code + * itself is returned. + */ + public String getDisplayVariant(Locale locale) + { + /*XXX - load a bundle? */ + return variant; + } + + /** + * Gets all local components suitable for display to the user, formatted + * for the default locale. For the language component, getDisplayLanguage + * is called. For the country component, getDisplayCountry is called. + * For the variant set component, getDisplayVariant is called. + *

          + * The returned String will be one of the following forms:
          + *
          +    * language (country, variant)
          +    * language (country)
          +    * language (variant)
          +    * country (variant)
          +    * language
          +    * country
          +    * variant
          +    * 
          + * @return String version of this locale, suitable for display to the + * user. + */ + public String getDisplayName() + { + return getDisplayName(getDefault()); + } + + /** + * Gets all local components suitable for display to the user, formatted + * for a specified locale. For the language component, + * getDisplayLanguage(Locale) is called. For the country component, + * getDisplayCountry(Locale) is called. For the variant set component, + * getDisplayVariant(Locale) is called. + *

          + * The returned String will be one of the following forms:
          + *
          +    * language (country, variant)
          +    * language (country)
          +    * language (variant)
          +    * country (variant)
          +    * language
          +    * country
          +    * variant
          +    * 
          + * + * @param locale locale to use for formatting + * + * @return String version of this locale, suitable for display to the + * user. + */ + public String getDisplayName(Locale locale) + { + StringBuffer result = new StringBuffer(); + int count = 0; + String[] delimiters = {"", " (", ","}; + + if (language.length() != 0) + { + result.append(delimiters[count++]); + result.append(getDisplayLanguage(locale)); + } + + if (country.length() != 0) + { + result.append(delimiters[count++]); + result.append(getDisplayCountry(locale)); + } + + if (variant.length() != 0) + { + result.append(delimiters[count++]); + result.append(getDisplayVariant(locale)); + } + + if (count > 1) + result.append(")"); + return result.toString(); } ! /** ! * Does the same as Object.clone() but does not throw ! * an CloneNotSupportedException. Why anyone would ! * use this method is a secret to me, since this class is ! * immutable. ! */ ! public Object clone() ! { ! try ! { ! return super.clone(); ! } ! catch (CloneNotSupportedException ex) ! { ! return null; ! } ! } ! ! /** ! * Return the hash code for this locale. The hashcode is the logical ! * xor of the hash codes of the language, the country and the variant. ! * The hash code is precomputed, since Locales are often ! * used in hash tables. ! */ ! public synchronized int hashCode() ! { ! // This method is synchronized because writeObject() might reset ! // the hashcode. ! return hashcode; ! } ! ! /** ! * Compares two locales. ! * @param obj the other locale. ! * @return true, if obj is a Locale with the same language, country, and ! * variant code as this locale, otherwise false. ! */ ! public boolean equals(Object obj) ! { ! if (this == obj) ! return true; ! if (!(obj instanceof Locale)) ! return false; ! Locale l = (Locale) obj; ! return (language.equals(l.language) ! && country.equals(l.country) ! && variant.equals(l.variant)); ! } ! ! /** * @serialdata According to jdk1.2 the hashcode should always be * written as -1; */ ! private synchronized void writeObject(java.io.ObjectOutputStream output) throws java.io.IOException { int tmpHashcode = hashcode; diff -Nrc3pad gcc-3.0.4/libjava/java/util/Map.java gcc-3.1/libjava/java/util/Map.java *** gcc-3.0.4/libjava/java/util/Map.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/Map.java Tue Jan 22 22:40:39 2002 *************** *** 1,5 **** ! /* Map.java -- An object that maps keys to values ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- ! /* Map.java: interface Map -- An object that maps keys to values ! interface Map.Entry -- an Entry in a Map ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,58 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Doc comments for everything. package java.util; public interface Map { public void clear(); public boolean containsKey(Object key); public boolean containsValue(Object value); public Set entrySet(); public boolean equals(Object o); public Object get(Object key); public Object put(Object key, Object value); public int hashCode(); public boolean isEmpty(); public Set keySet(); public void putAll(Map m); public Object remove(Object o); public int size(); public Collection values(); public static interface Entry { public Object getKey(); public Object getValue(); public Object setValue(Object value); public int hashCode(); public boolean equals(Object o); } } --- 19,329 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; + /** + * An object that maps keys onto values. Keys cannot be duplicated. This + * interface replaces the obsolete {@link Dictionary} abstract class. + *

          + * + * The map has three collection views, which are backed by the map + * (modifications on one show up on the other): a set of keys, a collection + * of values, and a set of key-value mappings. Some maps have a guaranteed + * order, but not all do. + *

          + * + * Note: Be careful about using mutable keys. Behavior is unspecified if + * a key's comparison behavior is changed after the fact. As a corollary + * to this rule, don't use a Map as one of its own keys or values, as it makes + * hashCode and equals have undefined behavior. + *

          + * + * All maps are recommended to provide a no argument constructor, which builds + * an empty map, and one that accepts a Map parameter and copies the mappings + * (usually by putAll), to create an equivalent map. Unfortunately, Java + * cannot enforce these suggestions. + *

          + * + * The map may be unmodifiable, in which case unsupported operations will + * throw an UnsupportedOperationException. Note that some operations may be + * safe, such as putAll(m) where m is empty, even if the operation would + * normally fail with a non-empty argument. + * + * @author Original author unknown + * @author Eric Blake + * @see HashMap + * @see TreeMap + * @see Hashtable + * @see SortedMap + * @see Collection + * @see Set + * @since 1.2 + * @status updated to 1.4 + */ public interface Map { + /** + * Remove all entries from this Map (optional operation). + * + * @throws UnsupportedOperationException if clear is not supported + */ public void clear(); + + /** + * Returns true if this contains a mapping for the given key. + * + * @param key the key to search for + * @return true if the map contains the key + * @throws ClassCastException if the key is of an inappropriate type + * @throws NullPointerException if key is null but the map + * does not permit null keys + */ public boolean containsKey(Object key); + + /** + * Returns true if this contains at least one mapping with the given value. + * In other words, returns true if a value v exists where + * (value == null ? v == null : value.equals(v)). This usually + * requires linear time. + * + * @param value the value to search for + * @return true if the map contains the value + */ public boolean containsValue(Object value); + + /** + * Returns a set view of the mappings in this Map. Each element in the + * set is a Map.Entry. The set is backed by the map, so that changes in + * one show up in the other. Modifications made while an iterator is + * in progress cause undefined behavior. If the set supports removal, + * these methods remove the underlying mapping from the map: + * Iterator.remove, Set.remove, + * removeAll, retainAll, and clear. + * Element addition, via add or addAll, is + * not supported via this set. + * + * @return the set view of all mapping entries + * @see Map.Entry + */ public Set entrySet(); + + /** + * Compares the specified object with this map for equality. Returns + * true if the other object is a Map with the same mappings, + * that is,
          + * o instanceof Map && entrySet().equals(((Map) o).entrySet(); + * This allows comparison of maps, regardless of implementation. + * + * @param o the object to be compared + * @return true if the object equals this map + * @see Set#equals(Object) + */ public boolean equals(Object o); + + /** + * Returns the value mapped by the given key. Returns null if + * there is no mapping. However, in Maps that accept null values, you + * must rely on containsKey to determine if a mapping exists. + * + * @param key the key to look up + * @return the value associated with the key, or null if key not in map + * @throws ClassCastException if the key is an inappropriate type + * @throws NullPointerException if this map does not accept null keys + * @see #containsKey(Object) + */ public Object get(Object key); + + /** + * Associates the given key to the given value (optional operation). If the + * map already contains the key, its value is replaced. Be aware that in + * a map that permits null values, a null return does not + * always imply that the mapping was created. + * + * @param key the key to map + * @param value the value to be mapped + * @return the previous value of the key, or null if there was no mapping + * @throws UnsupportedOperationException if the operation is not supported + * @throws ClassCastException if the key or value is of the wrong type + * @throws IllegalArgumentException if something about this key or value + * prevents it from existing in this map + * @throws NullPointerException if the map forbids null keys or values + * @see #containsKey(Object) + */ public Object put(Object key, Object value); + + /** + * Returns the hash code for this map. This is the sum of all hashcodes + * for each Map.Entry object in entrySet. This allows comparison of maps, + * regardless of implementation, and satisfies the contract of + * Object.hashCode. + * + * @return the hash code + * @see Map.Entry#hashCode() + */ public int hashCode(); + + /** + * Returns true if the map contains no mappings. + * + * @return true if the map is empty + */ public boolean isEmpty(); + + /** + * Returns a set view of the keys in this Map. The set is backed by the + * map, so that changes in one show up in the other. Modifications made + * while an iterator is in progress cause undefined behavior. If the set + * supports removal, these methods remove the underlying mapping from + * the map: Iterator.remove, Set.remove, + * removeAll, retainAll, and clear. + * Element addition, via add or addAll, is + * not supported via this set. + * + * @return the set view of all keys + */ public Set keySet(); + + /** + * Copies all entries of the given map to this one (optional operation). If + * the map already contains a key, its value is replaced. + * + * @param m the mapping to load into this map + * @throws UnsupportedOperationException if the operation is not supported + * @throws ClassCastException if a key or value is of the wrong type + * @throws IllegalArgumentException if something about a key or value + * prevents it from existing in this map + * @throws NullPointerException if the map forbids null keys or values, or + * if m is null. + * @see #put(Object, Object) + */ public void putAll(Map m); + + /** + * Removes the mapping for this key if present (optional operation). If + * the key is not present, this returns null. Note that maps which permit + * null values may also return null if the key was removed. + * + * @param key the key to remove + * @return the value the key mapped to, or null if not present + * @throws UnsupportedOperationException if deletion is unsupported + */ public Object remove(Object o); + + /** + * Returns the number of key-value mappings in the map. If there are more + * than Integer.MAX_VALUE mappings, return Integer.MAX_VALUE. + * + * @return the number of mappings + */ public int size(); + + /** + * Returns a collection (or bag) view of the values in this Map. The + * collection is backed by the map, so that changes in one show up in + * the other. Modifications made while an iterator is in progress cause + * undefined behavior. If the collection supports removal, these methods + * remove the underlying mapping from the map: Iterator.remove, + * Collection.remove, removeAll, + * retainAll, and clear. Element addition, via + * add or addAll, is not supported via this + * collection. + * + * @return the collection view of all values + */ public Collection values(); + /** + * A map entry (key-value pair). The Map.entrySet() method returns a set + * view of these objects; there is no other valid way to come across them. + * These objects are only valid for the duration of an iteration; in other + * words, if you mess with one after modifying the map, you are asking + * for undefined behavior. + * + * @author Original author unknown + * @author Eric Blake + * @see Map + * @see Map#entrySet() + * @since 1.2 + * @status updated to 1.4 + */ public static interface Entry { + /** + * Get the key corresponding to this entry. + * + * @return the key + */ public Object getKey(); + + /** + * Get the value corresponding to this entry. If you already called + * Iterator.remove(), this is undefined. + * + * @return the value + */ public Object getValue(); + + /** + * Replaces the value with the specified object (optional operation). + * This writes through to the map, and is undefined if you already + * called Iterator.remove(). + * + * @param value the new value to store + * @return the old value + * @throws UnsupportedOperationException if the operation is not supported + * @throws ClassCastException if the value is of the wrong type + * @throws IllegalArgumentException if something about the value + * prevents it from existing in this map + * @throws NullPointerException if the map forbids null values + */ public Object setValue(Object value); + + /** + * Returns the hash code of the entry. This is defined as the exclusive-or + * of the hashcodes of the key and value (using 0 for null). In other + * words, this must be: + *

          +      *  (getKey() == null ? 0 : getKey().hashCode()) ^
          +      *  (getValue() == null ? 0 : getValue().hashCode())
          +      * 
          + * + * @return the hash code + */ public int hashCode(); + + /** + * Compares the specified object with this entry. Returns true only if + * the object is a mapping of identical key and value. In other words, + * this must be: + *
          +      * (o instanceof Map.Entry)
          +      * && (getKey() == null ? ((HashMap) o).getKey() == null
          +      *                      : getKey().equals(((HashMap) o).getKey()))
          +      * && (getValue() == null ? ((HashMap) o).getValue() == null
          +      *                        : getValue().equals(((HashMap) o).getValue()))
          +      * 
          + * + * @param o the object to compare + * @return true if it is equal + */ public boolean equals(Object o); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/MissingResourceException.java gcc-3.1/libjava/java/util/MissingResourceException.java *** gcc-3.0.4/libjava/java/util/MissingResourceException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/MissingResourceException.java Tue Jan 22 22:40:39 2002 *************** *** 1,43 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class MissingResourceException extends RuntimeException { private String className; private String key; ! public MissingResourceException(String msg, String cName, String k) { ! super(msg); ! className = cName; ! key = k; } public String getClassName() { return className; } public String getKey() { return key; } } - --- 1,99 ---- ! /* java.util.MissingResourceException ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This exception is thrown when a resource is missing. ! * ! * @see ResourceBundle ! * @author Jochen Hoenicke ! * @author Warren Levy ! */ public class MissingResourceException extends RuntimeException { + private static final long serialVersionUID = -4876345176062000401L; + + /** + * The name of the resource bundle requested by user. + */ private String className; + + /** + * The key of the resource in the bundle requested by user. + */ private String key; ! /** ! * Creates a new exception, with the specified parameters. ! * @param s the detail message. ! * @param className the name of the resource bundle. ! * @param key the key of the missing resource. ! */ ! public MissingResourceException(String s, String className, String key) { ! super(s); ! this.className = className; ! this.key = key; } + /** + * Gets the name of the resource bundle, for which a resource is missing. + * @return the name of the resource bundle. + */ public String getClassName() { return className; } + /** + * Gets the key of the resource that is missing bundle, this is an empty + * string if the whole resource bundle is missing. + * @return the name of the resource bundle. + */ public String getKey() { return key; } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/NoSuchElementException.java gcc-3.1/libjava/java/util/NoSuchElementException.java *** gcc-3.0.4/libjava/java/util/NoSuchElementException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/NoSuchElementException.java Tue Jan 22 22:40:39 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct. */ ! public class NoSuchElementException extends RuntimeException { public NoSuchElementException() { - super(); } ! public NoSuchElementException(String msg) { ! super(msg); } } --- 1,88 ---- ! /* NoSuchElementException.java -- Attempt to access element that does not exist ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. */ ! ! /** ! * Exception thrown when an attempt is made to access an element that does not ! * exist. This exception is thrown by the Enumeration, Iterator and ! * ListIterator classes if the nextElement, next or previous method goes ! * beyond the end of the list of elements that are being accessed. It is also ! * thrown by Vector and Stack when attempting to access the first or last ! * element of an empty collection. ! * ! * @author Warren Levy ! * @author Eric Blake ! * @see Enumeration ! * @see Iterator ! * @see ListIterator ! * @see Enumeration#nextElement() ! * @see Iterator#next() ! * @see ListIterator#previous() ! * @since 1.0 ! * @status updated to 1.4 ! */ public class NoSuchElementException extends RuntimeException { + /** + * Compatible with JDK 1.0. + */ + private static final long serialVersionUID = 6769829250639411880L; + + /** + * Constructs a NoSuchElementException with no detail message. + */ public NoSuchElementException() { } ! /** ! * Constructs a NoSuchElementException with a detail message. ! * ! * @param detail the detail message for the exception ! */ ! public NoSuchElementException(String detail) { ! super(detail); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Observable.java gcc-3.1/libjava/java/util/Observable.java *** gcc-3.0.4/libjava/java/util/Observable.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/Observable.java Tue Jan 22 22:40:39 2002 *************** *** 1,30 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class Observable { ! /* tracks whether this object has changed */ private boolean changed; /* list of the Observers registered as interested in this Observable */ ! private Vector observerVec; /* TBD: This might be better implemented as an Observer[] * but that would mean writing more code rather than making use of --- 1,60 ---- ! /* java.util.Observable ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ public class Observable { ! /** tracks whether this object has changed */ private boolean changed; /* list of the Observers registered as interested in this Observable */ ! private Vector observers; /* TBD: This might be better implemented as an Observer[] * but that would mean writing more code rather than making use of *************** public class Observable *** 34,96 **** * we may decide to make the tradeoff and reimplement with an Observer[]. */ public Observable() { changed = false; ! observerVec = new Vector(); } ! public synchronized void addObserver(Observer obs) { ! // JDK 1.2 spec says not to add this if it is already there ! if (!observerVec.contains(obs)) ! observerVec.addElement(obs); } protected synchronized void clearChanged() { changed = false; } public synchronized int countObservers() { ! return observerVec.size(); } ! public synchronized void deleteObserver(Observer obs) { ! observerVec.removeElement(obs); } public synchronized void deleteObservers() { ! observerVec.removeAllElements(); } public synchronized boolean hasChanged() { return changed; } public void notifyObservers() { notifyObservers(null); } ! public void notifyObservers(Object arg) { ! if (changed) ! { ! /* The JDK 1.2 spec states that though the order of notification ! * is unspecified in subclasses, in Observable it is in the order ! * of registration. ! */ ! for (int i = 0, numObs = observerVec.size(); i < numObs; i++) ! ((Observer) (observerVec.elementAt(i))).update(this, arg); ! changed = false; ! } } protected synchronized void setChanged() { changed = true; --- 64,164 ---- * we may decide to make the tradeoff and reimplement with an Observer[]. */ + /** + * Constructs an Observable with zero Observers. + */ public Observable() { changed = false; ! observers = new Vector(); } ! /** ! * Adds an Observer. If the observer was already added this method does ! * nothing. ! * ! * @param observer Observer to add. ! */ ! public synchronized void addObserver(Observer observer) { ! if (!observers.contains(observer)) ! observers.addElement(observer); } + /** + * Reset this Observable's state to unchanged. + */ protected synchronized void clearChanged() { changed = false; } + /** + * @return Number of Observers for this Observable. + */ public synchronized int countObservers() { ! return observers.size(); } ! /** ! * Deletes an Observer of this Observable. ! * ! * @param victim Observer to delete. ! */ ! public synchronized void deleteObserver(Observer victim) { ! observers.removeElement(victim); } + /** + * Deletes all Observers of this Observable. + */ public synchronized void deleteObservers() { ! observers.removeAllElements(); } + /** + * @return Whether or not this Observable has changed. + */ public synchronized boolean hasChanged() { return changed; } + /** + * If the Observable has actually changed then tell all Observers about it, + * then resets state to unchanged. + */ public void notifyObservers() { notifyObservers(null); } ! /** ! * If the Observable has actually changed then tell all Observers about it, ! * then resets state to unchanged. ! * Note that though the order of notification is unspecified in subclasses, ! * in Observable it is in the order of registration. ! * ! * @param obj Arguement to Observer's update method. ! */ ! public void notifyObservers(Object obj) { ! if (!hasChanged()) ! return; ! Vector ob1 = (Vector) observers.clone(); ! ! for (int i = 0; i < ob1.size(); i++) ! ((Observer) ob1.elementAt(i)).update(this, obj); ! ! clearChanged(); } + /** + * Marks this Observable as having changed. + */ protected synchronized void setChanged() { changed = true; diff -Nrc3pad gcc-3.0.4/libjava/java/util/Observer.java gcc-3.1/libjava/java/util/Observer.java *** gcc-3.0.4/libjava/java/util/Observer.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/Observer.java Tue Jan 22 22:40:39 2002 *************** *** 1,24 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; ! ! /** ! * @author Warren Levy ! * @date August 25, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct */ ! public interface Observer { ! public void update(Observable observed, Object arg); } --- 1,59 ---- ! /* Implemented when a class wants to be informed of changes in Observable ! objects. ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct */ ! ! /** ! * Interface that is implemented when a class wants to be informed of changes ! * in Observable objects. ! * ! * @see java.util.Observable ! * @author Warren Levy ! * @date August 25, 1998. ! */ public interface Observer { ! public void update(Observable observable, Object arg); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Properties.java gcc-3.1/libjava/java/util/Properties.java *** gcc-3.0.4/libjava/java/util/Properties.java Sat Oct 7 18:13:11 2000 --- gcc-3.1/libjava/java/util/Properties.java Tue Jan 22 22:40:39 2002 *************** *** 1,5 **** /* java.util.Properties ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* java.util.Properties ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.*; *** 61,488 **** * of get/put. * * @see PropertyResourceBundle ! * @author Jochen Hoenicke */ ! public class Properties extends Hashtable { ! /** ! * The property list that contains default values for any keys not ! * in this property list. ! */ ! protected Properties defaults; ! private static final long serialVersionUID = 4112578634029874840L; ! /** ! * Creates a new empty property list. ! */ ! public Properties() { ! this.defaults = null; ! } ! /** ! * Create a new empty property list with the specified default values. ! * @param defaults a Properties object containing the default values. ! */ ! public Properties(Properties defaults) { ! this.defaults = defaults; ! } ! /** ! * Reads a property list from an input stream. The stream should ! * have the following format:
          ! * ! * An empty line or a line starting with # or ! * ! is ignored. An backslash (\) at the ! * end of the line makes the line continueing on the next line ! * (but make sure there is no whitespace after the backslash). ! * Otherwise, each line describes a key/value pair.
          ! * ! * The chars up to the first whitespace, = or : are the key. You ! * can include this caracters in the key, if you precede them with ! * a backslash (\). The key is followed by optional ! * whitespaces, optionally one = or :, ! * and optionally some more whitespaces. The rest of the line is ! * the resource belonging to the key.
          ! * ! * Escape sequences \t, \n, \r, \\, \", \', \!, \#, \ (a ! * space), and unicode characters with the ! * \uxxxx notation are detected, and ! * converted to the corresponding single character.
          ! * ! *
          !      * # This is a comment
          !      * key     = value
          !      * k\:5      \ a string starting with space and ending with newline\n
          !      * # This is a multiline specification; note that the value contains
          !      * # no white space.
          !      * weekdays: Sunday,Monday,Tuesday,Wednesday,\
          !      *           Thursday,Friday,Saturday
          !      * # The safest way to include a space at the end of a value:
          !      * label   = Name:\u0020
          !      * 
          ! * ! * @param in the input stream ! * @exception IOException if an error occured when reading ! * from the input. */ ! public void load(InputStream inStream) throws IOException { ! BufferedReader reader = ! new BufferedReader(new InputStreamReader(inStream)); ! String line; ! while ((line = reader.readLine()) != null) { ! char c = 0; ! int pos = 0; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! // If line is empty or begins with a comment character, ! // skip this line. ! if (pos == line.length() || c == '#' || c == '!') ! continue; ! // The characaters up to the next Whitespace, ':', or '=' ! // describe the key. But look for escape sequences. ! StringBuffer key = new StringBuffer(); ! while (pos < line.length() ! && !Character.isWhitespace(c = line.charAt(pos++)) ! && c != '=' && c != ':') { ! if (c == '\\') { ! if (pos == line.length()) { ! // The line continues on the next line. ! line = reader.readLine(); ! pos = 0; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! } else { ! c = line.charAt(pos++); ! switch (c) { ! case 'n': ! key.append('\n'); ! break; ! case 't': ! key.append('\t'); ! break; ! case 'r': ! key.append('\r'); ! break; ! case 'u': ! if (pos+4 <= line.length()) { ! char uni = (char) Integer.parseInt ! (line.substring(pos, pos+4), 16); ! key.append(uni); ! } // else throw exception? ! break; ! default: ! key.append(c); ! break; ! } ! } ! } else ! key.append(c); ! } ! ! boolean isDelim = (c == ':' || c == '='); ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! if (!isDelim && (c == ':' || c == '=')) { ! pos++; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! } ! StringBuffer element = new StringBuffer(line.length()-pos); ! while (pos < line.length()) { ! c = line.charAt(pos++); ! if (c == '\\') { ! if (pos == line.length()) { ! // The line continues on the next line. ! line = reader.readLine(); ! pos = 0; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! element.ensureCapacity(line.length()-pos+element.length()); ! } else { ! c = line.charAt(pos++); ! switch (c) { ! case 'n': ! element.append('\n'); ! break; ! case 't': ! element.append('\t'); ! break; ! case 'r': ! element.append('\r'); ! break; ! case 'u': ! if (pos+4 <= line.length()) { ! char uni = (char) Integer.parseInt ! (line.substring(pos, pos+4), 16); ! element.append(uni); ! } // else throw exception? ! break; ! default: ! element.append(c); ! break; ! } ! } ! } else ! element.append(c); ! } ! put(key.toString(), element.toString()); ! } ! } ! /** ! * Calls store(OutputStream out, String header) and ! * ignores the IOException that may be thrown. ! * @deprecated use store instead. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public void save(OutputStream out, String header) { ! try { ! store(out,header); ! } catch (IOException ex) { ! } ! } ! ! /** ! * Writes the key/value pairs to the given output stream.
          ! * ! * If header is not null, this method writes a comment containing ! * the header as first line to the stream. The next line (or first ! * line if header is null) contains a comment with the current date. ! * Afterwards the key/value pairs are written to the stream in the ! * following format.
          ! * ! * Each line has the form key = value. Newlines, ! * Returns and tabs are written as \n,\t,\r resp. ! * The characters \, !, #, = and : are ! * preceeded by a backslash. Spaces are preceded with a backslash, ! * if and only if they are at the beginning of the key. Characters ! * that are not in the ascii range 33 to 127 are written in the ! * \uxxxx Form. ! * ! * @param out the output stream ! * @param header the header written in the first line, may be null. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public void store(OutputStream out, String header) throws IOException { ! PrintWriter writer = new PrintWriter(out); ! if (header != null) ! writer.println("#"+header); ! writer.println("#"+new Date().toString()); ! list(writer); ! writer.flush(); ! } ! ! /** ! * Adds the given key/value pair to this properties. This calls ! * the hashtable method put. ! * @param key the key for this property ! * @param value the value for this property ! * @return The old value for the given key. ! * @since JDK1.2 */ ! public Object setProperty(String key, String value) { ! return put(key,value); ! } ! /** ! * Gets the property with the specified key in this property list. ! * If the key is not found, the default property list is searched. ! * If the property is not found in default or the default of ! * default, null is returned. ! * @param key The key for this property. ! * @param defaulValue A default value ! * @return The value for the given key, or null if not found. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public String getProperty(String key) { ! return getProperty(key, null); ! } ! /** ! * Gets the property with the specified key in this property list. If ! * the key is not found, the default property list is searched. If the ! * property is not found in default or the default of default, the ! * specified defaultValue is returned. ! * @param key The key for this property. ! * @param defaulValue A default value ! * @return The value for the given key. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public String getProperty(String key, String defaultValue) { ! Properties prop = this; ! // Eliminate tail recursion. ! do { ! String value = (String) prop.get(key); ! if (value != null) ! return value; ! prop = prop.defaults; ! } while (prop != null); ! return defaultValue; ! } ! private final void addHashEntries (Hashtable base) { ! if (defaults != null) ! defaults.addHashEntries(base); ! Enumeration keys = keys (); ! while (keys.hasMoreElements()) ! base.put(keys.nextElement(), base); ! } ! /** ! * Returns an enumeration of all keys in this property list, including ! * the keys in the default property list. ! */ ! public Enumeration propertyNames () { ! // We make a new Hashtable that holds all the keys. Then we ! // return an enumeration for this hash. We do this because we ! // don't want modifications to be reflected in the enumeration ! // (per JCL), and because there doesn't seem to be a ! // particularly better way to ensure that duplicates are ! // ignored. ! Hashtable t = new Hashtable (); ! addHashEntries (t); ! return t.keys(); ! } ! /** ! * Formats a key/value pair for output in a properties file. ! * See store for a description of the format. ! * @param key the key. ! * @param value the value. ! * @see #store ! */ ! private String formatForOutput(String key, String value) { ! // This is a simple approximation of the expected line size. ! StringBuffer result = new StringBuffer(key.length()+value.length()+16); ! boolean head = true; ! for (int i=0; i< key.length(); i++) { ! char c = key.charAt(i); ! switch (c) { ! case '\n': ! result.append("\\n"); ! break; ! case '\r': ! result.append("\\r"); ! break; ! case '\t': ! result.append("\\t"); ! break; ! case '\\': ! result.append("\\\\"); ! break; ! case '!': ! result.append("\\!"); ! break; ! case '#': ! result.append("\\#"); ! break; ! case '=': ! result.append("\\="); ! break; ! case ':': ! result.append("\\:"); ! break; ! case ' ': ! result.append("\\ "); ! break; ! default: ! if (c < 32 || c > '~') { ! String hex = Integer.toHexString(c); ! result.append("\\u0000".substring(0, 6-hex.length())); ! result.append(hex); ! } else ! result.append(c); ! } ! if (c != 32) ! head = false; ! } ! result.append('='); ! head=true; ! for (int i=0; i< value.length(); i++) { ! char c = value.charAt(i); ! switch (c) { ! case '\n': ! result.append("\\n"); ! break; ! case '\r': ! result.append("\\r"); ! break; ! case '\t': ! result.append("\\t"); ! break; ! case '\\': ! result.append("\\\\"); ! break; ! case '!': ! result.append("\\!"); ! break; ! case '#': ! result.append("\\#"); ! break; ! case ' ': ! result.append(head ? "\\ ": " "); ! break; ! default: ! if (c < 32 || c > '~') { ! String hex = Integer.toHexString(c); ! result.append("\\u0000".substring(0, 6-hex.length())); ! result.append(hex); ! } else ! result.append(c); ! } ! if (c != 32) ! head = false; ! } ! return result.toString(); ! } ! /** ! * Writes the key/value pairs to the given print stream. They are ! * written in the way, described in the method store. ! * @param out the stream, where the key/value pairs are written to. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! * @see #store ! */ ! public void list(PrintStream out) { ! Enumeration keys = keys(); ! Enumeration elts = elements(); ! while (keys.hasMoreElements()) { ! String key = (String) keys.nextElement(); ! String elt = (String) elts.nextElement(); ! String output = formatForOutput(key,elt); ! out.println(output); ! } ! } ! /** ! * Writes the key/value pairs to the given print writer. They are ! * written in the way, described in the method store. ! * @param out the writer, where the key/value pairs are written to. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! * @see #store ! * @see #list(java.io.PrintStream) ! * @since JDK1.1 ! */ ! public void list(PrintWriter out) { ! Enumeration keys = keys(); ! Enumeration elts = elements(); ! while (keys.hasMoreElements()) { ! String key = (String) keys.nextElement(); ! String elt = (String) elts.nextElement(); ! String output = formatForOutput(key,elt); ! out.println(output); ! } ! } } --- 72,555 ---- * of get/put. * * @see PropertyResourceBundle ! * @author Jochen Hoenicke ! */ ! public class Properties extends Hashtable ! { ! /** ! * The property list that contains default values for any keys not ! * in this property list. ! */ ! protected Properties defaults; ! private static final long serialVersionUID = 4112578634029874840L; ! /** ! * Creates a new empty property list. ! */ ! public Properties() ! { ! this.defaults = null; ! } ! ! /** ! * Create a new empty property list with the specified default values. ! * @param defaults a Properties object containing the default values. ! */ ! public Properties(Properties defaults) ! { ! this.defaults = defaults; ! } ! ! /** ! * Reads a property list from an input stream. The stream should ! * have the following format:
          ! * ! * An empty line or a line starting with # or ! * ! is ignored. An backslash (\) at the ! * end of the line makes the line continueing on the next line ! * (but make sure there is no whitespace after the backslash). ! * Otherwise, each line describes a key/value pair.
          ! * ! * The chars up to the first whitespace, = or : are the key. You ! * can include this caracters in the key, if you precede them with ! * a backslash (\). The key is followed by optional ! * whitespaces, optionally one = or :, ! * and optionally some more whitespaces. The rest of the line is ! * the resource belonging to the key.
          ! * ! * Escape sequences \t, \n, \r, \\, \", \', \!, \#, \ (a ! * space), and unicode characters with the ! * \uxxxx notation are detected, and ! * converted to the corresponding single character.
          ! * ! *
          !    * # This is a comment
          !    * key     = value
          !    * k\:5      \ a string starting with space and ending with newline\n
          !    * # This is a multiline specification; note that the value contains
          !    * # no white space.
          !    * weekdays: Sunday,Monday,Tuesday,Wednesday,\
          !    *           Thursday,Friday,Saturday
          !    * # The safest way to include a space at the end of a value:
          !    * label   = Name:\u0020
          !    * 
          ! * ! * @param in the input stream ! * @exception IOException if an error occurred when reading ! * from the input. */ ! public void load(InputStream inStream) throws IOException ! { ! // The spec says that the file must be encoded using ISO-8859-1. ! BufferedReader reader = ! new BufferedReader(new InputStreamReader(inStream, "ISO-8859-1")); ! String line; ! while ((line = reader.readLine()) != null) ! { ! char c = 0; ! int pos = 0; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! // If line is empty or begins with a comment character, ! // skip this line. ! if (pos == line.length() || c == '#' || c == '!') ! continue; ! // The characters up to the next Whitespace, ':', or '=' ! // describe the key. But look for escape sequences. ! StringBuffer key = new StringBuffer(); ! while (pos < line.length() ! && !Character.isWhitespace(c = line.charAt(pos++)) ! && c != '=' && c != ':') ! { ! if (c == '\\') ! { ! if (pos == line.length()) ! { ! // The line continues on the next line. ! line = reader.readLine(); ! pos = 0; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! } ! else ! { ! c = line.charAt(pos++); ! switch (c) ! { ! case 'n': ! key.append('\n'); ! break; ! case 't': ! key.append('\t'); ! break; ! case 'r': ! key.append('\r'); ! break; ! case 'u': ! if (pos + 4 <= line.length()) ! { ! char uni = (char) Integer.parseInt ! (line.substring(pos, pos + 4), 16); ! key.append(uni); ! pos += 4; ! } // else throw exception? ! break; ! default: ! key.append(c); ! break; ! } ! } ! } ! else ! key.append(c); ! } ! boolean isDelim = (c == ':' || c == '='); ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! if (!isDelim && (c == ':' || c == '=')) ! { ! pos++; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! } ! StringBuffer element = new StringBuffer(line.length() - pos); ! while (pos < line.length()) ! { ! c = line.charAt(pos++); ! if (c == '\\') ! { ! if (pos == line.length()) ! { ! // The line continues on the next line. ! line = reader.readLine(); ! pos = 0; ! while (pos < line.length() ! && Character.isWhitespace(c = line.charAt(pos))) ! pos++; ! element.ensureCapacity(line.length() - pos + ! element.length()); ! } ! else ! { ! c = line.charAt(pos++); ! switch (c) ! { ! case 'n': ! element.append('\n'); ! break; ! case 't': ! element.append('\t'); ! break; ! case 'r': ! element.append('\r'); ! break; ! case 'u': ! if (pos + 4 <= line.length()) ! { ! char uni = (char) Integer.parseInt ! (line.substring(pos, pos + 4), 16); ! element.append(uni); ! pos += 4; ! } // else throw exception? ! break; ! default: ! element.append(c); ! break; ! } ! } ! } ! else ! element.append(c); ! } ! put(key.toString(), element.toString()); ! } ! } ! /** ! * Calls store(OutputStream out, String header) and ! * ignores the IOException that may be thrown. ! * @deprecated use store instead. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public void save(OutputStream out, String header) ! { ! try ! { ! store(out, header); ! } ! catch (IOException ex) ! { ! } ! } ! /** ! * Writes the key/value pairs to the given output stream.
          ! * ! * If header is not null, this method writes a comment containing ! * the header as first line to the stream. The next line (or first ! * line if header is null) contains a comment with the current date. ! * Afterwards the key/value pairs are written to the stream in the ! * following format.
          ! * ! * Each line has the form key = value. Newlines, ! * Returns and tabs are written as \n,\t,\r resp. ! * The characters \, !, #, = and : are ! * preceeded by a backslash. Spaces are preceded with a backslash, ! * if and only if they are at the beginning of the key. Characters ! * that are not in the ascii range 33 to 127 are written in the ! * \uxxxx Form. ! * ! * @param out the output stream ! * @param header the header written in the first line, may be null. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public void store(OutputStream out, String header) throws IOException ! { ! // The spec says that the file must be encoded using ISO-8859-1. ! PrintWriter writer ! = new PrintWriter(new OutputStreamWriter (out, "ISO-8859-1")); ! if (header != null) ! writer.println("#" + header); ! writer.println("#" + new Date().toString()); ! list(writer); ! writer.flush(); ! } ! /** ! * Adds the given key/value pair to this properties. This calls ! * the hashtable method put. ! * @param key the key for this property ! * @param value the value for this property ! * @return The old value for the given key. ! * @since JDK1.2 */ ! public Object setProperty(String key, String value) ! { ! return put(key, value); ! } ! /** ! * Gets the property with the specified key in this property list. ! * If the key is not found, the default property list is searched. ! * If the property is not found in default or the default of ! * default, null is returned. ! * @param key The key for this property. ! * @param defaulValue A default value ! * @return The value for the given key, or null if not found. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public String getProperty(String key) ! { ! return getProperty(key, null); ! } ! /** ! * Gets the property with the specified key in this property list. If ! * the key is not found, the default property list is searched. If the ! * property is not found in default or the default of default, the ! * specified defaultValue is returned. ! * @param key The key for this property. ! * @param defaulValue A default value ! * @return The value for the given key. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! */ ! public String getProperty(String key, String defaultValue) ! { ! Properties prop = this; ! // Eliminate tail recursion. ! do ! { ! String value = (String) prop.get(key); ! if (value != null) ! return value; ! prop = prop.defaults; ! } ! while (prop != null); ! return defaultValue; ! } ! private final void addHashEntries(Hashtable base) ! { ! if (defaults != null) ! defaults.addHashEntries(base); ! Enumeration keys = keys(); ! while (keys.hasMoreElements()) ! base.put(keys.nextElement(), base); ! } ! /** ! * Returns an enumeration of all keys in this property list, including ! * the keys in the default property list. ! */ ! public Enumeration propertyNames() ! { ! // We make a new Hashtable that holds all the keys. Then we ! // return an enumeration for this hash. We do this because we ! // don't want modifications to be reflected in the enumeration ! // (per JCL), and because there doesn't seem to be a ! // particularly better way to ensure that duplicates are ! // ignored. ! Hashtable t = new Hashtable(); ! addHashEntries(t); ! return t.keys(); ! } ! /** ! * Formats a key/value pair for output in a properties file. ! * See store for a description of the format. ! * @param key the key. ! * @param value the value. ! * @see #store ! */ ! private String formatForOutput(String key, String value) ! { ! // This is a simple approximation of the expected line size. ! StringBuffer result = ! new StringBuffer(key.length() + value.length() + 16); ! boolean head = true; ! for (int i = 0; i < key.length(); i++) ! { ! char c = key.charAt(i); ! switch (c) ! { ! case '\n': ! result.append("\\n"); ! break; ! case '\r': ! result.append("\\r"); ! break; ! case '\t': ! result.append("\\t"); ! break; ! case '\\': ! result.append("\\\\"); ! break; ! case '!': ! result.append("\\!"); ! break; ! case '#': ! result.append("\\#"); ! break; ! case '=': ! result.append("\\="); ! break; ! case ':': ! result.append("\\:"); ! break; ! case ' ': ! result.append("\\ "); ! break; ! default: ! if (c < 32 || c > '~') ! { ! String hex = Integer.toHexString(c); ! result.append("\\u0000".substring(0, 6 - hex.length())); ! result.append(hex); ! } ! else ! result.append(c); ! } ! if (c != 32) ! head = false; ! } ! result.append('='); ! head = true; ! for (int i = 0; i < value.length(); i++) ! { ! char c = value.charAt(i); ! switch (c) ! { ! case '\n': ! result.append("\\n"); ! break; ! case '\r': ! result.append("\\r"); ! break; ! case '\t': ! result.append("\\t"); ! break; ! case '\\': ! result.append("\\\\"); ! break; ! case '!': ! result.append("\\!"); ! break; ! case '#': ! result.append("\\#"); ! break; ! case ' ': ! result.append(head ? "\\ " : " "); ! break; ! default: ! if (c < 32 || c > '~') ! { ! String hex = Integer.toHexString(c); ! result.append("\\u0000".substring(0, 6 - hex.length())); ! result.append(hex); ! } ! else ! result.append(c); ! } ! if (c != 32) ! head = false; ! } ! return result.toString(); ! } ! ! /** ! * Writes the key/value pairs to the given print stream. They are ! * written in the way, described in the method store. ! * @param out the stream, where the key/value pairs are written to. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! * @see #store ! */ ! public void list(PrintStream out) ! { ! Enumeration keys = keys(); ! Enumeration elts = elements(); ! while (keys.hasMoreElements()) ! { ! String key = (String) keys.nextElement(); ! String elt = (String) elts.nextElement(); ! String output = formatForOutput(key, elt); ! out.println(output); ! } ! } ! ! /** ! * Writes the key/value pairs to the given print writer. They are ! * written in the way, described in the method store. ! * @param out the writer, where the key/value pairs are written to. ! * @exception ClassCastException if this property contains any key or ! * value that isn't a string. ! * @see #store ! * @see #list(java.io.PrintStream) ! * @since JDK1.1 ! */ ! public void list(PrintWriter out) ! { ! Enumeration keys = keys(); ! Enumeration elts = elements(); ! while (keys.hasMoreElements()) ! { ! String key = (String) keys.nextElement(); ! String elt = (String) elts.nextElement(); ! String output = formatForOutput(key, elt); ! out.println(output); ! } ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/PropertyPermission.java gcc-3.1/libjava/java/util/PropertyPermission.java *** gcc-3.0.4/libjava/java/util/PropertyPermission.java Sat Nov 18 02:29:13 2000 --- gcc-3.1/libjava/java/util/PropertyPermission.java Tue Jan 22 22:40:39 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; diff -Nrc3pad gcc-3.0.4/libjava/java/util/PropertyResourceBundle.java gcc-3.1/libjava/java/util/PropertyResourceBundle.java *** gcc-3.0.4/libjava/java/util/PropertyResourceBundle.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/PropertyResourceBundle.java Tue Jan 22 22:40:39 2002 *************** *** 1,47 **** ! /* Copyright (C) 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.util; ! import java.io.InputStream; ! import java.io.IOException; ! import gnu.gcj.util.EnumerationChain; ! /** ! * @author Anthony Green ! * @date April 29, 1999. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3, ! * and "The Java Language Specification", ISBN 0-201-63451-1. */ public class PropertyResourceBundle extends ResourceBundle { ! private Properties properties; ! public PropertyResourceBundle (InputStream pstream) throws IOException ! { ! // Initialize and load our Properties. ! properties = new Properties(); ! properties.load(pstream); ! } ! public Enumeration getKeys() ! { ! if (parent == null) ! return properties.propertyNames(); ! else ! return new EnumerationChain (properties.propertyNames(), ! parent.getKeys ()); ! } ! public Object handleGetObject (String key) ! { ! return properties.getProperty(key); ! } ! } --- 1,144 ---- ! /* java.util.PropertyResourceBundle ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! ! package java.util; + import gnu.java.util.DoubleEnumeration; + + /** + * This class is a concrete ResourceBundle that gets it + * resources from a property file. This implies that the resources are + * strings. For more information about resource bundles see the class + * ResourceBundle. + * + * You should not use this class directly, or subclass it, but you get + * an object of this class automatically when you call + * ResourceBundle.getBundle() and there is a properties + * file. + * + * If there is also a class for this resource and the same locale, the + * class does win. + * + * The properties file should have the name of the resource bundle, + * appended with the locale (e.g. _de.properties. The file should have the same format + * as for Properties.load() + * + * XXX- move this to properties. + * The file should have the following + * format: An empty line or a line starting with # is + * ignored. An backslash (\) at the end of the line + * makes the line continueing on the next line. Otherwise, each line + * describes a key/value pair. The chars up to the first whitespace, + * = or : are the key. The key is followed by one or more + * whitespaces, = or :. The rest of the + * line is the resource belonging to the key. You can give unicode + * characters with the \\uxxxx notation, where + * xxxx is the hex encoding of the 16 bit unicode char + * number. + * + * An example of a properties file for the german language is given + * here. This extends the example given in ListResourceBundle. + * Create a file MyResource_de.properties with the following contents + * and put it in the CLASSPATH. (The char \u00e4 is the + * german ä) + * + *
          +  * s1=3
          +  * s2=MeineDisk
          +  * s3=3. M\u00e4rz 96
          +  * s4=Die Diskette ''{1}'' enth\u00e4lt {0} in {2}.
          +  * s5=0
          +  * s6=keine Dateien
          +  * s7=1
          +  * s8=eine Datei
          +  * s9=2
          +  * s10={0,number} Dateien
          +  * s11=Die Formatierung warf eine Exception: {0}
          +  * s12=FEHLER
          +  * s13=Ergebnis
          +  * s14=Dialog
          +  * s15=Auswahlkriterium
          +  * s16=1,3
          +  * 
          + * + * @see ResourceBundle + * @see ListResourceBundle + * @see Properties#load() + * @author Jochen Hoenicke */ public class PropertyResourceBundle extends ResourceBundle { ! Properties properties; ! /** ! * Creates a new property resource bundle. ! * @param stream An input stream, where the resources are read from. ! */ ! public PropertyResourceBundle(java.io.InputStream stream) ! throws java.io.IOException ! { ! properties = new Properties(); ! properties.load(stream); ! } ! /** ! * Called by getObject when a resource is needed. This ! * returns the resource given by the key. ! * @param key The key of the resource. ! * @return The resource for the key or null if it doesn't exists. ! */ ! public Object handleGetObject(String key) ! { ! return properties.getProperty(key); ! } ! /** ! * This method should return all keys for which a resource exists. ! * @return An enumeration of the keys. ! */ ! public Enumeration getKeys() ! { ! // We must also return the keys of our parent. ! if (parent != null) ! { ! return new DoubleEnumeration(properties.propertyNames(), ! parent.getKeys()); ! } ! return properties.propertyNames(); ! } ! } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Random.java gcc-3.1/libjava/java/util/Random.java *** gcc-3.0.4/libjava/java/util/Random.java Fri Sep 8 19:37:09 2000 --- gcc-3.1/libjava/java/util/Random.java Tue Jan 22 22:40:39 2002 *************** *** 1,150 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.util; ! import java.io.Serializable; ! /** ! * @author Warren Levy ! * @date August 25, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 ! * "The Java Language Specification", ISBN 0-201-63451-1 ! * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. ! * Status: Believed complete and correct ! */ ! /* This class is completely specified by the spec to ensure absolute ! * portability between all implementations of Java ! */ ! public class Random implements Serializable ! { ! /* Used by next() to hold the state of the pseudorandom number generator */ ! private long seed; - /* Used by nextGaussian() to hold a precomputed value */ - /* to be delivered by that method the next time it is called */ - private double nextNextGaussian; ! /* Used by nextGaussian() to keep track of whether it is has precomputed */ ! /* and stashed away the next value to be delivered by that method */ ! private boolean haveNextNextGaussian = false; private static final long serialVersionUID = 3905348978240129619L; public Random() { ! this(System.currentTimeMillis()); } public Random(long seed) { setSeed(seed); } ! protected synchronized int next(int bits) ! { ! seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); ! return (int)(seed >>> (48 - bits)); ! } ! ! // JDK1.2 ! public boolean nextBoolean() ! { ! return next(1) != 0; ! } ! ! /* The method nextBytes() is not fully specified in the published specs. ! * At first I implemented it simply via: ! * for (int i = 0; i < buf.length; i++) ! * buf[i] = (byte)next(8); ! * but a simple test did not yield the same results as the std implementation. ! * There seemed to be a relationship where each i byte above was at pos 4*i+3 ! * in the std. For efficiency, by reducing calls to the expensive math ! * routines, the std probably was calling next(32) once rather than next(8) ! * 4 times. Changing the algorithm to the one below based on that assumption ! * then yielded identical results to the std. */ ! public void nextBytes(byte[] buf) ! { ! int randInt = 0; ! ! for (int i = 0; i < buf.length; i++) ! { ! int shift = (i % 4) * 8; ! if (shift == 0) ! randInt = next(32); ! buf[i] = (byte) (randInt >> shift); ! } ! } ! ! public double nextDouble() { ! return (((long)next(26) << 27) + next(27)) / (double)(1L << 53); } ! public float nextFloat() { ! return next(24) / ((float)(1 << 24)); } ! public synchronized double nextGaussian() { ! if (haveNextNextGaussian) { ! haveNextNextGaussian = false; ! return nextNextGaussian; } ! else { ! double v1, v2, s; ! do ! { ! v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0 ! v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0 ! s = v1 * v1 + v2 * v2; ! } while (s >= 1); ! double norm = Math.sqrt(-2 * Math.log(s)/s); ! nextNextGaussian = v2 * norm; ! haveNextNextGaussian = true; ! return v1 * norm; } } public int nextInt() { return next(32); } ! // JDK1.2 public int nextInt(int n) { if (n <= 0) throw new IllegalArgumentException("n must be positive"); ! int bits, val; do { ! bits = next(31); ! val = bits % n; ! } while (bits - val + (n-1) < 0); return val; } public long nextLong() { ! return ((long)next(32) << 32) + next(32); } ! public synchronized void setSeed(long seed) { ! this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1); ! haveNextNextGaussian = false; } } --- 1,390 ---- ! /* java.util.Random ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.util; ! ! /** ! * This class generates pseudorandom numbers. It uses the same ! * algorithm as the original JDK-class, so that your programs behave ! * exactly the same way, if started with the same seed. ! * ! * The algorithm is described in The Art of Computer Programming, ! * Volume 2 by Donald Knuth in Section 3.2.1. ! * ! * If two instances of this class are created with the same seed and ! * the same calls to these classes are made, they behave exactly the ! * same way. This should be even true for foreign implementations ! * (like this), so every port must use the same algorithm as described ! * here. ! * ! * If you want to implement your own pseudorandom algorithm, you ! * should extend this class and overload the next() and ! * setSeed(long) method. In that case the above ! * paragraph doesn't apply to you. ! * ! * This class shouldn't be used for security sensitive purposes (like ! * generating passwords or encryption keys. See SecureRandom ! * in package java.security for this purpose. ! * ! * For simple random doubles between 0.0 and 1.0, you may consider using ! * Math.random instead. ! * ! * @see java.security.SecureRandom ! * @see Math#random() ! * @author Jochen Hoenicke */ ! public class Random implements java.io.Serializable ! { ! /** ! * True if the next nextGaussian is available. This is used by ! * nextGaussian, which generates two gaussian numbers by one call, ! * and returns the second on the second call. ! * @see #nextGaussian. */ ! private boolean haveNextNextGaussian; ! /** ! * The next nextGaussian if available. This is used by nextGaussian, ! * which generates two gaussian numbers by one call, and returns the ! * second on the second call. ! * @see #nextGaussian. ! */ ! private double nextNextGaussian; ! /** ! * The seed. This is the number set by setSeed and which is used ! * in next. ! * @see #next ! */ ! private long seed; private static final long serialVersionUID = 3905348978240129619L; + /** + * Creates a new pseudorandom number generator. The seed is initialized + * to the current time as follows. + *
          +    * setSeed(System.currentTimeMillis());
          +    * 
          + * @see System#currentTimeMillis() + */ public Random() { ! setSeed(System.currentTimeMillis()); } + /** + * Creates a new pseudorandom number generator, starting with the + * specified seed. This does: + *
          +    * setSeed(seed);
          +    * 
          + * @param seed the initial seed. + */ public Random(long seed) { setSeed(seed); } ! /** ! * Sets the seed for this pseudorandom number generator. As described ! * above, two instances of the same random class, starting with the ! * same seed, should produce the same results, if the same methods ! * are called. The implementation for java.util.Random is: ! *
          !    * public synchronized void setSeed(long seed) {
          !    *     this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
          !    *     haveNextNextGaussian = false;
          !    * }
          !    * 
          */ ! public synchronized void setSeed(long seed) { ! this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1); ! haveNextNextGaussian = false; } ! /** ! * Generates the next pseudorandom number. This returns ! * an int value whose bits low order bits are ! * independent chosen random bits (0 and 1 are equally likely). ! * The implementation for java.util.Random is: ! *
          !    * protected synchronized int next(int bits) {
          !    *     seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
          !    *     return (int) (seed >>> (48 - bits));
          !    * }
          !    * 
          ! * @param bits the number of random bits to generate. Must be in range ! * 1..32. ! * @return the next pseudorandom value. ! * @since JDK1.1 ! */ ! protected synchronized int next(int bits) ! /*{ require { 1 <= bits && bits <=32 :: ! "bits "+bits+" not in range [1..32]" } } */ { ! seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); ! return (int) (seed >>> (48 - bits)); } ! /** ! * Fills an array of bytes with random numbers. All possible values ! * are (approximately) equally likely. ! * The JDK documentation gives no implementation, but it seems to be: ! *
          !    * public void nextBytes(byte[] bytes) {
          !    *     for (int i=0; i< bytes.length; i+=4) {
          !    *         int random = next(32);
          !    *         for (int j=0; i+j< bytes.length && j<4; j++)
          !    *             bytes[i+j] = (byte) (random & 0xff)
          !    *             random >>= 8;
          !    *         }
          !    *     }
          !    * }
          !    * 
          ! * @param bytes The byte array that should be filled. ! * @since JDK1.1 ! */ ! public void nextBytes(byte[] bytes) ! /*{ require { bytes != null :: "bytes is null"; } } */ { ! int random; ! /* Do a little bit unrolling of the above algorithm. */ ! int max = bytes.length & ~0x3; ! for (int i = 0; i < max; i += 4) { ! random = next(32); ! bytes[i] = (byte) random; ! bytes[i + 1] = (byte) (random >> 8); ! bytes[i + 2] = (byte) (random >> 16); ! bytes[i + 3] = (byte) (random >> 24); } ! if (max < bytes.length) { ! random = next(32); ! for (int j = max; j < bytes.length; j++) ! { ! bytes[j] = (byte) random; ! random >>= 8; ! } } } + /** + * Generates the next pseudorandom number. This returns + * an int value whose 32 bits are independent chosen random bits + * (0 and 1 are equally likely). The implementation for + * java.util.Random is: + *
          +    * public int nextInt() {
          +    *     return next(32);
          +    * }
          +    * 
          + * + * @return the next pseudorandom value. */ public int nextInt() { return next(32); } ! /** ! * Generates the next pseudorandom number. This returns ! * a value between 0(inclusive) and n(exclusive), and ! * each value has the same likelihodd (1/n). ! * (0 and 1 are equally likely). The implementation for ! * java.util.Random is: ! *
          !    * public int nextInt(int n) {
          !    *     if (n<=0)
          !    *         throw new IllegalArgumentException("n must be positive");
          !    *     if ((n & -n) == n)  // i.e., n is a power of 2
          !    *         return (int)((n * (long)next(31)) >> 31);
          !    *     int bits, val;
          !    *     do {
          !    *         bits = next(32);
          !    *         val = bits % n;
          !    *     } while(bits - val + (n-1) < 0);
          !    *     return val;
          !    * }
          !    * 
          ! * This algorithm would return every value with exactly the same ! * probability, if the next()-method would be a perfect random number ! * generator. ! * ! * The loop at the bottom only accepts a value, if the random ! * number was between 0 and the highest number less then 1<<31, ! * which is divisible by n. The probability for this is high for small ! * n, and the worst case is 1/2 (for n=(1<<30)+1). ! * ! * The special treatment for n = power of 2, selects the high bits of ! * the random number (the loop at the bottom would select the low order ! * bits). This is done, because the low order bits of linear congruential ! * number generators (like the one used in this class) are known to be ! * ``less random'' than the high order bits. ! * ! * @param n the upper bound. ! * @exception IllegalArgumentException if the given upper bound is negative ! * @return the next pseudorandom value. ! */ public int nextInt(int n) + /*{ require { n > 0 :: "n must be positive"; } } */ { if (n <= 0) throw new IllegalArgumentException("n must be positive"); ! if ((n & -n) == n) // i.e., n is a power of 2 ! return (int) ((n * (long) next(31)) >> 31); int bits, val; do { ! bits = next(32); ! val = bits % n; ! } ! while (bits - val + (n - 1) < 0); return val; } + /** + * Generates the next pseudorandom long number. All bits of this + * long are independently chosen and 0 and 1 have equal likelihood. + * The implementation for java.util.Random is: + *
          +    * public long nextLong() {
          +    *     return ((long)next(32) << 32) + next(32);
          +    * }
          +    * 
          + * @return the next pseudorandom value. + */ public long nextLong() { ! return ((long) next(32) << 32) + next(32); } ! /** ! * Generates the next pseudorandom boolean. True and false have ! * the same probability. The implementation is: ! *
          !    * public boolean nextBoolean() {
          !    *     return next(1) != 0;
          !    * }
          !    * 
          ! * @return the next pseudorandom boolean. ! */ ! public boolean nextBoolean() { ! return next(1) != 0; ! } ! ! /** ! * Generates the next pseudorandom float uniformly distributed ! * between 0.0f (inclusive) and 1.0 (exclusive). The ! * implementation is as follows. ! *
          !    * public float nextFloat() {
          !    *     return next(24) / ((float)(1 << 24));
          !    * }
          !    * 
          ! * @return the next pseudorandom float. */ ! public float nextFloat() ! { ! return next(24) / ((float) (1 << 24)); ! } ! ! /** ! * Generates the next pseudorandom double uniformly distributed ! * between 0.0f (inclusive) and 1.0 (exclusive). The ! * implementation is as follows. ! *
          !    * public double nextDouble() {
          !    *     return (((long)next(26) << 27) + next(27)) / (double)(1 << 53);
          !    * }
          !    * 
          ! * @return the next pseudorandom double. */ ! public double nextDouble() ! { ! return (((long) next(26) << 27) + next(27)) / (double) (1L << 53); ! } ! ! /** ! * Generates the next pseudorandom, Gaussian (normally) distributed ! * double value, with mean 0.0 and standard deviation 1.0. ! * The algorithm is as follows. ! *
          !    * public synchronized double nextGaussian() {
          !    *     if (haveNextNextGaussian) {
          !    *         haveNextNextGaussian = false;
          !    *         return nextNextGaussian;
          !    *     } else {
          !    *         double v1, v2, s;
          !    *         do {
          !    *             v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0
          !    *             v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0
          !    *             s = v1 * v1 + v2 * v2;
          !    *         } while (s >= 1);
          !    *         double norm = Math.sqrt(-2 * Math.log(s)/s);
          !    *         nextNextGaussian = v2 * norm;
          !    *         haveNextNextGaussian = true;
          !    *         return v1 * norm;
          !    *     }
          !    * }
          !    * 
          ! * This is described in section 3.4.1 of The Art of Computer ! * Programming, Volume 2 by Donald Knuth. ! * ! * @return the next pseudorandom Gaussian distributed double. ! */ ! public synchronized double nextGaussian() ! { ! if (haveNextNextGaussian) ! { ! haveNextNextGaussian = false; ! return nextNextGaussian; ! } ! else ! { ! double v1, v2, s; ! do ! { ! v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0 ! v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0 ! s = v1 * v1 + v2 * v2; ! } ! while (s >= 1); ! double norm = Math.sqrt(-2 * Math.log(s) / s); ! nextNextGaussian = v2 * norm; ! haveNextNextGaussian = true; ! return v1 * norm; ! } } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/RandomAccess.java gcc-3.1/libjava/java/util/RandomAccess.java *** gcc-3.0.4/libjava/java/util/RandomAccess.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/java/util/RandomAccess.java Tue Jan 22 22:40:39 2002 *************** *** 0 **** --- 1,64 ---- + /* RandomAccess.java -- A tagging interface that lists can use to tailor + operations to the correct algorithm + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + + package java.util; + + /** + * Marker interface used to inform List implementations that + * they support fast (usually constant time) random access. This allows + * generic list algorithms to tailor their behavior based on the list + * type. + *

          + * + * For example, some sorts are n*log(n) on an array, but decay to quadratic + * time on a linked list. As a rule of thumb, this interface should be + * used is this loop:
          + * for (int i = 0, n = list.size(); i < n; i++) list.get(i); + *
          runs faster than this loop:
          + * for (Iterator i = list.iterator(); i.hasNext(); ) i.next(); + * + * @author Eric Blake + * @see List + * @since 1.4 + * @status updated to 1.4 + */ + public interface RandomAccess + { + // Tagging interface only. + } diff -Nrc3pad gcc-3.0.4/libjava/java/util/ResourceBundle.java gcc-3.1/libjava/java/util/ResourceBundle.java *** gcc-3.0.4/libjava/java/util/ResourceBundle.java Sun May 6 14:08:26 2001 --- gcc-3.1/libjava/java/util/ResourceBundle.java Tue Jan 22 22:40:39 2002 *************** *** 1,223 **** ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package java.util; ! import java.io.InputStream; ! /** ! * @author Anthony Green ! * @date November 26, 1998. ! */ ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3, ! * and "The Java Language Specification", ISBN 0-201-63451-1. */ public abstract class ResourceBundle { protected ResourceBundle parent; ! // This is used to cache resource bundles. ! private static Hashtable resource_cache = new Hashtable (); ! public ResourceBundle () { } ! ! public Locale getLocale() { - // FIXME: Stub added for this missing method because it is needed for AWT. - return null; } ! public final String getString (String key) throws MissingResourceException ! { ! return (String) getObject(key); ! } ! public final String[] getStringArray (String key) throws MissingResourceException ! { ! return (String[]) getObject(key); ! } public final Object getObject(String key) throws MissingResourceException ! { ! Object result; ! try ! { ! return handleGetObject (key); ! } ! catch (MissingResourceException ex) ! { ! if (parent != null) ! return parent.getObject(key); ! else ! throw ex; ! } ! } ! public static final ResourceBundle getBundle(String baseName) throws MissingResourceException ! { ! return getBundle(baseName, Locale.getDefault()); ! } ! // Start searching with the name bundleName. Continue searching by ! // stripping off the '_' delimited tails until the search name is ! // the same as stopHere. ! private static final ResourceBundle trySomeGetBundle (String bundleName, ! String stopHere, ! ClassLoader loader) ! { ! Class rbc; ! ResourceBundle needs_parent = null, r, result = null; ! while (true) { ! try ! { ! rbc = Class.forName(bundleName, true, loader); ! r = null; ! try ! { ! r = (ResourceBundle) rbc.newInstance(); ! } ! catch (IllegalAccessException ex) ! { ! // Fall through ! } ! catch (InstantiationException ex) ! { ! // Fall through ! } ! if (r != null) ! { ! if (result == null) ! result = r; ! if (needs_parent != null) ! { ! // We've been through the loop one or more times ! // already. Set the parent and keep going. ! needs_parent.setParent(r); ! } ! needs_parent = r; ! } ! } ! catch (ClassNotFoundException ex) ! { ! // Fall through. ! } ! // Look for a properties file. ! InputStream i = loader.getResourceAsStream (bundleName.replace ('.', ! '/') ! + ".properties"); ! if (i != null) ! { ! try ! { ! return new PropertyResourceBundle (i); ! } ! catch (java.io.IOException e) ! { ! // The docs don't appear to define what happens in ! // this case, but it seems like continuing the ! // search is a reasonable thing to do. ! } ! } ! if (bundleName.equals(stopHere)) ! return result; ! else ! { ! int last = bundleName.lastIndexOf('_'); ! ! // No more underscores? ! if (last == -1) ! return result; ! // Loop around, testing this new shorter name. ! bundleName = bundleName.substring(0, last); ! } ! } ! } ! // Search for bundles, but stop at baseName_language (if required). ! // This is synchronized so that the cache works correctly. ! private static final synchronized ResourceBundle ! partialGetBundle (String baseName, Locale locale, boolean langStop, ! ClassLoader loader) ! { ! ResourceBundle rb; ! // Explicitly invoke locale.toString() to force a ! // NullPointerException when required. ! String bundleName = baseName + "_" + locale.toString(); ! // Check the cache. ! Object obj = resource_cache.get(bundleName); ! if (obj != null) ! return (ResourceBundle) obj; ! String stopHere = (baseName ! + (langStop ? ("_" + locale.getLanguage()) : "")); ! rb = trySomeGetBundle(bundleName, stopHere, loader); ! if (rb != null) ! resource_cache.put(bundleName, rb); ! return rb; ! } ! public static final ResourceBundle getBundle (String baseName, ! Locale locale) ! { ! return getBundle (baseName, locale, ClassLoader.getSystemClassLoader ()); } ! public static final ResourceBundle getBundle (String baseName, ! Locale locale, ! ClassLoader loader) throws MissingResourceException ! { ! ResourceBundle rb; ! Class rbc; ! if (baseName == null) ! throw new NullPointerException (); ! rb = partialGetBundle(baseName, locale, false, loader); ! if (rb != null) ! return rb; ! // Finally, try the default locale. ! if (! locale.equals(Locale.getDefault())) ! { ! rb = partialGetBundle(baseName, Locale.getDefault(), true, loader); ! if (rb != null) ! return rb; ! } ! throw new MissingResourceException("can't load bundle", ! baseName, ! "bundle"); ! } protected void setParent(ResourceBundle parent) ! { ! this.parent = parent; ! } ! protected abstract Object handleGetObject(String key) throws MissingResourceException; public abstract Enumeration getKeys(); } --- 1,474 ---- ! /* java.util.ResourceBundle ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ + + package java.util; + import java.lang.ref.Reference; + import java.lang.ref.SoftReference; + import java.security.AccessController; + import java.security.PrivilegedAction; + import gnu.classpath.Configuration; + + /** + * A resource bundle contains locale-specific data. If you need + * localized data, you can load a resource bundle that matches the + * locale with getBundle. Now you can get your object by + * calling getObject or getString on that + * bundle. + *
          + * When a bundle is demanded for a specific locale, the ResourceBundle + * is searched in following order (def. language code stands for + * the two letter ISO language code of the default locale (see + * Locale.getDefault()). + *

          +  * baseName_language code_country code_variant
          +  * baseName_language code_country code
          +  * baseName_language code
          +  * baseName_def. language code_def. country code_def. variant
          +  * baseName_def. language code_def. country code
          +  * baseName_def. language code
          +  * baseName
          +  * 
          + * + * A bundle is backed up, by less specific bundle (omiting variant, + * country or language). But it is not backed up by the default + * language locale. + *
          + * If you provide a bundle for a given locale, say + * Bundle_en_UK_POSIX, you must also provide a bundle for + * all sub locales, ie. Bundle_en_UK, Bundle_en, and + * Bundle. + *
          + * When a bundle is searched, we look first for a class with + * the given name and if that is not found for a file with + * .properties extension in the classpath. The name + * must be a fully qualified classname (with dots as path separators). + *
          + * (Note: This implementation always backs up the class with a + * properties file if that is existing, but you shouldn't rely on + * this, if you want to be compatible to the standard JDK.) + * + * @see Locale + * @see PropertyResourceBundle + * @author Jochen Hoenicke */ public abstract class ResourceBundle { + /** + * The parent bundle. This is consulted when you call getObject + * and there is no such resource in the current bundle. This + * field may be null. + */ protected ResourceBundle parent; ! /** ! * The locale of this resource bundle. You can read this with ! * getLocale and it is automatically set in ! * getBundle. ! */ ! private Locale locale; ! /** ! * We override SecurityManager in order to access getClassContext(). ! */ ! static class Security extends SecurityManager ! { ! /** Return the ClassLoader of the class which called into this ! ResourceBundle, or null if it cannot be determined. */ ! ClassLoader getCallingClassLoader() { + Class[] stack = super.getClassContext(); + for (int i = 0; i < stack.length; i++) + if (stack[i] != Security.class && stack[i] != ResourceBundle.class) + return stack[i].getClassLoader(); + return null; } ! } ! ! // This will always work since java.util classes have (all) system ! // permissions. ! static Security security = (Security) AccessController.doPrivileged ! ( ! new PrivilegedAction() ! { ! public Object run() ! { ! return new Security(); ! } ! } ! ); ! ! /** ! * The constructor. It does nothing special. ! */ ! public ResourceBundle() { } ! /** ! * Get a String from this resource bundle. Since most localized ! * Objects are Strings, this method provides a convenient way to get ! * them without casting. ! * @param key the name of the resource. ! * @exception MissingResourceException ! * if that particular object could not be found in this bundle nor ! * the parent bundle. ! */ ! public final String getString(String key) throws MissingResourceException ! { ! return (String) getObject(key); ! } ! /** ! * Get an array of Strings from this resource bundle. This method ! * provides a convenient way to get it without casting. ! * @param key the name of the resource. ! * @exception MissingResourceException ! * if that particular object could not be found in this bundle nor ! * the parent bundle. ! */ ! public final String[] getStringArray(String key) throws MissingResourceException ! { ! return (String[]) getObject(key); ! } + /** + * Get an object from this resource bundle. + * @param key the name of the resource. + * @exception MissingResourceException + * if that particular object could not be found in this bundle nor + * the parent bundle. + */ public final Object getObject(String key) throws MissingResourceException ! { ! for (ResourceBundle bundle = this; bundle != null; bundle = bundle.parent) ! { ! try ! { ! Object o = bundle.handleGetObject(key); ! if (o != null) ! return o; ! } ! catch (MissingResourceException ex) ! { ! } ! } ! throw new MissingResourceException ! ("Key not found", getClass().getName(), key); ! } ! /** ! * Get the appropriate ResourceBundle for the default locale. ! * @param baseName the name of the ResourceBundle. This should be ! * a name of a Class or a properties-File. See the class ! * description for details. ! * @return the desired resource bundle ! * @exception MissingResourceException ! * if the resource bundle couldn't be found. ! */ ! public static final ResourceBundle getBundle(String baseName) ! throws MissingResourceException ! { ! return getBundle(baseName, Locale.getDefault(), ! security.getCallingClassLoader()); ! } ! /** ! * Get the appropriate ResourceBundle for the given locale. ! * @param baseName the name of the ResourceBundle. This should be ! * a name of a Class or a properties-File. See the class ! * description for details. ! * @param locale A locale. ! * @return the desired resource bundle ! * @exception MissingResourceException ! * if the resource bundle couldn't be found. ! */ ! public static final ResourceBundle getBundle(String baseName, ! Locale locale) throws MissingResourceException ! { ! return getBundle(baseName, locale, security.getCallingClassLoader()); ! } ! /** ! * The resource bundle cache. This is a two-level hash map: The key ! * is the class loader, the value is a new HashMap. The key of this ! * second hash map is the localized name, the value is a soft ! * references to the resource bundle. */ ! private static Map resourceBundleCache = new HashMap(); ! /** ! * The `empty' locale is created once in order to optimize ! * tryBundle(). ! */ ! private static final Locale emptyLocale = new Locale ("", ""); ! ! /** ! * Tries to load a class or a property file with the specified name. ! * @param localizedName the name. ! * @param locale the locale, that must be used exactly. ! * @param classloader the classloader. ! * @param bundle the back up (parent) bundle ! * @return the resource bundle if that could be loaded, otherwise ! * bundle. ! */ ! private static final ResourceBundle tryBundle(String localizedName, ! Locale locale, ! ClassLoader classloader, ! ResourceBundle bundle, ! HashMap cache) ! { ! { ! // First look into the cache. ! // XXX We should remove cleared references from the cache. ! Reference ref = (Reference) cache.get(localizedName); ! if (ref != null) { ! ResourceBundle rb = (ResourceBundle) ref.get(); ! if (rb != null) ! // rb should already have the right parent, except if ! // something very strange happened. ! return rb; ! } ! } ! // foundBundle holds exact matches for the localizedName resource ! // bundle, which may later be cached. ! ResourceBundle foundBundle = null; ! try ! { ! java.io.InputStream is; ! final String resourceName = ! localizedName.replace('.', '/') + ".properties"; ! if (classloader == null) ! is = ClassLoader.getSystemResourceAsStream (resourceName); ! else ! is = classloader.getResourceAsStream (resourceName); ! if (is != null) ! { ! foundBundle = new PropertyResourceBundle(is); ! foundBundle.parent = bundle; ! foundBundle.locale = locale; ! } ! } ! catch (java.io.IOException ex) ! { ! } ! try ! { ! Class rbClass; ! if (classloader == null) ! rbClass = Class.forName(localizedName); ! else ! rbClass = classloader.loadClass(localizedName); ! foundBundle = (ResourceBundle) rbClass.newInstance(); ! foundBundle.parent = bundle; ! foundBundle.locale = locale; ! } ! catch (ClassNotFoundException ex) ! { ! } ! catch (IllegalAccessException ex) ! { ! } ! catch (InstantiationException ex) ! { ! // ignore them all ! // XXX should we also ignore ClassCastException? ! } ! if (foundBundle != null) ! cache.put(localizedName, new SoftReference(foundBundle)); ! return foundBundle != null ? foundBundle : bundle; ! } ! /** ! * Tries to load a the bundle for a given locale, also loads the backup ! * locales with the same language. ! * ! * @param name the name. ! * @param locale the locale, that must be used exactly. ! * @param classloader the classloader. ! * @param bundle the back up (parent) bundle ! * @return the resource bundle if that could be loaded, otherwise ! * bundle. ! */ ! private static final ResourceBundle tryLocalBundle(String baseName, ! Locale locale, ! ClassLoader classloader, ! ResourceBundle bundle, ! HashMap cache) ! { ! final String language = locale.getLanguage(); ! if (language.length() > 0) ! { ! final String country = locale.getCountry(); ! String name = baseName + "_" + language; + if (country.length() != 0) + { + bundle = tryBundle(name, + new Locale(language, ""), + classloader, bundle, cache); ! name += "_" + country; ! final String variant = locale.getVariant(); ! if (variant.length() != 0) ! { ! bundle = tryBundle(name, ! new Locale(language, ! country), ! classloader, bundle, cache); ! ! name += "_" + variant; ! } ! } ! bundle = tryBundle(name, locale, classloader, bundle, cache); ! } ! return bundle; } ! /** ! * Get the appropriate ResourceBundle for the given locale. ! * @param baseName the name of the ResourceBundle. This should be ! * a name of a Class or a properties file. See the class ! * description for details. ! * @param locale A locale. ! * @param classloader a ClassLoader. ! * @return the desired resource bundle ! * @exception MissingResourceException ! * if the resource bundle couldn't be found. ! */ ! // This method is synchronized so that the cache is properly ! // handled. ! public static final synchronized ResourceBundle getBundle(String baseName, ! Locale locale, ! ClassLoader classLoader) throws MissingResourceException ! { ! // This implementation searches the bundle in the reverse direction ! // and builds the parent chain on the fly. ! HashMap cache = (HashMap) resourceBundleCache.get(classLoader); ! if (cache == null) ! { ! cache = new HashMap(); ! resourceBundleCache.put(classLoader, cache); ! } ! else ! { ! // Fast path: If baseName + "_" + locale is in cache use it. ! String name = baseName + "_" + locale.toString(); ! Reference ref = (Reference) cache.get(name); ! if (ref != null) ! { ! ResourceBundle rb = (ResourceBundle) ref.get(); ! if (rb != null) ! // rb should already have the right parent, except if ! // something very strange happened. ! return rb; ! } ! } ! ResourceBundle baseBundle = tryBundle(baseName, emptyLocale, ! classLoader, null, cache); ! if (baseBundle == null) ! // JDK says, that if one provides a bundle base_en_UK, one ! // must also provide the bundles base_en and base. ! // This implies that if there is no bundle for base, there ! // is no bundle at all. ! throw new MissingResourceException("Bundle " + baseName + " not found", baseName, ""); ! // Now use the default locale. ! ResourceBundle bundle = tryLocalBundle(baseName, locale, ! classLoader, baseBundle, cache); ! if (bundle == baseBundle && !locale.equals(Locale.getDefault())) ! { ! bundle = tryLocalBundle(baseName, Locale.getDefault(), ! classLoader, baseBundle, cache); ! } ! return bundle; ! } ! /** ! * Return the actual locale of this bundle. You can use it after ! * calling getBundle, to know if the bundle for the desired locale ! * was loaded or if the fall back was used. ! */ ! public Locale getLocale() ! { ! return locale; ! } + /** + * Set the parent of this bundle. This is consulted when you call + * getObject and there is no such resource in the current bundle. + * @param parent the parent of this bundle. + */ protected void setParent(ResourceBundle parent) ! { ! // Shall we ignore the old parent? ! this.parent = parent; ! } ! /** ! * Override this method to provide the resource for a keys. This gets ! * called by getObject. If you don't have a resource ! * for the given key, you should return null instead throwing a ! * MissingResourceException. You don't have to ask the parent, ! * getObject() already does this. ! * ! * @param key The key of the resource. ! * @return The resource for the key, or null if not in bundle. ! * @exception MissingResourceException ! * you shouldn't throw this. ! */ ! protected abstract Object handleGetObject(String key) throws MissingResourceException; + /** + * This method should return all keys for which a resource exists. + * @return An enumeration of the keys. + */ public abstract Enumeration getKeys(); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Set.java gcc-3.1/libjava/java/util/Set.java *** gcc-3.0.4/libjava/java/util/Set.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/Set.java Tue Jan 22 22:40:39 2002 *************** *** 1,5 **** /* Set.java -- A collection that prohibits duplicates ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Set.java -- A collection that prohibits duplicates ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,49 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Doc comments for everything. package java.util; public interface Set extends Collection { boolean add(Object o); boolean addAll(Collection c); void clear(); boolean contains(Object o); boolean containsAll(Collection c); boolean equals(Object o); int hashCode(); boolean isEmpty(); Iterator iterator(); boolean remove(Object o); boolean removeAll(Collection c); boolean retainAll(Collection c); int size(); Object[] toArray(); } --- 18,243 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; + /** + * A collection that contains no duplicates. In other words, for two set + * elements e1 and e2, e1.equals(e2) returns false. There + * are additional stipulations on add, equals + * and hashCode, as well as the requirements that constructors + * do not permit duplicate elements. The Set interface is incompatible with + * List; you cannot implement both simultaneously. + *

          + * + * Note: Be careful about using mutable objects in sets. In particular, + * if a mutable object changes to become equal to another set element, you + * have violated the contract. As a special case of this, a Set is not + * allowed to be an element of itself, without risking undefined behavior. + * + * @author Original author unknown + * @author Eric Blake + * @see Collection + * @see List + * @see SortedSet + * @see HashSet + * @see TreeSet + * @see LinkedHashSet + * @see AbstractSet + * @see Collections#singleton(Object) + * @see Collections#EMPTY_SET + * @since 1.2 + * @status updated to 1.4 + */ public interface Set extends Collection { + /** + * Adds the specified element to the set if it is not already present + * (optional operation). In particular, the comparison algorithm is + * o == null ? e == null : o.equals(e). Sets need not permit + * all values, and may document what exceptions will be thrown if + * a value is not permitted. + * + * @param o the object to add + * @return true if the object was not previously in the set + * @throws UnsupportedOperationException if this operation is not allowed + * @throws ClassCastException if the class of o prevents it from being added + * @throws IllegalArgumentException if some aspect of o prevents it from + * being added + * @throws NullPointerException if null is not permitted in this set + */ boolean add(Object o); + + /** + * Adds all of the elements of the given collection to this set (optional + * operation). If the argument is also a Set, this returns the mathematical + * union of the two. The behavior is unspecified if the set is + * modified while this is taking place. + * + * @param c the collection to add + * @return true if the set changed as a result + * @throws UnsupportedOperationException if this operation is not allowed + * @throws ClassCastException if the class of an element prevents it from + * being added + * @throws IllegalArgumentException if something about an element prevents + * it from being added + * @throws NullPointerException if null is not permitted in this set, or + * if the argument c is null + * @see #add(Object) + */ boolean addAll(Collection c); + + /** + * Removes all elements from this set (optional operation). This set will + * be empty afterwords, unless an exception occurs. + * + * @throws UnsupportedOperationException if this operation is not allowed + */ void clear(); + + /** + * Returns true if the set contains the specified element. In other words, + * this looks for o == null ? e == null : o.equals(e). + * + * @param o the object to look for + * @return true if it is found in the set + */ boolean contains(Object o); + + /** + * Returns true if this set contains all elements in the specified + * collection. If the argument is also a set, this is the subset + * relationship. + * + * @param c the collection to check membership in + * @return true if all elements in this set are in c + * @throws NullPointerException if c is null + * @see #contains(Object) + */ boolean containsAll(Collection c); + + /** + * Compares the specified object to this for equality. For sets, the object + * must be a set, the two must have the same size, and every element in + * one must be in the other. + * + * @param o the object to compare to + * @return true if it is an equal set + */ boolean equals(Object o); + + /** + * Returns the hash code for this set. In order to satisfy the contract of + * equals, this is the sum of the hashcode of all elements in the set. + * + * @return the sum of the hashcodes of all set elements + */ int hashCode(); + + /** + * Returns true if the set contains no elements. + * + * @return true if the set is empty + */ boolean isEmpty(); + + /** + * Returns an iterator over the set. The iterator has no specific order, + * unless further specified. + * + * @return a set iterator + */ Iterator iterator(); + + /** + * Removes the specified element from this set (optional operation). If + * an element e exists, o == null ? e == null : o.equals(e), + * it is removed from the set. + * + * @param o the object to remove + * @return true if the set changed (an object was removed) + * @throws UnsupportedOperationException if this operation is not allowed + */ boolean remove(Object o); + + /** + * Removes from this set all elements contained in the specified collection + * (optional operation). If the argument is a set, this returns the + * asymmetric set difference of the two sets. + * + * @param c the collection to remove from this set + * @return true if this set changed as a result + * @throws UnsupportedOperationException if this operation is not allowed + * @throws NullPointerException if c is null + * @see #remove(Object) + */ boolean removeAll(Collection c); + + /** + * Retains only the elements in this set that are also in the specified + * collection (optional operation). If the argument is also a set, this + * performs the intersection of the two sets. + * + * @param c the collection to keep + * @return true if this set was modified + * @throws UnsupportedOperationException if this operation is not allowed + * @throws NullPointerException if c is null + * @see #remove(Object) + */ boolean retainAll(Collection c); + + /** + * Returns the number of elements in the set. If there are more + * than Integer.MAX_VALUE mappings, return Integer.MAX_VALUE. This is + * the cardinality of the set. + * + * @return the number of elements + */ int size(); + + /** + * Returns an array containing the elements of this set. If the set + * makes a guarantee about iteration order, the array has the same + * order. The array is distinct from the set; modifying one does not + * affect the other. + * + * @return an array of this set's elements + * @see #toArray(Object[]) + */ Object[] toArray(); + + /** + * Returns an array containing the elements of this set, of the same runtime + * type of the argument. If the given set is large enough, it is reused, + * and null is inserted in the first unused slot. Otherwise, reflection + * is used to build a new array. If the set makes a guarantee about iteration + * order, the array has the same order. The array is distinct from the set; + * modifying one does not affect the other. + * + * @param a the array to determine the return type; if it is big enough + * it is used and returned + * @return an array holding the elements of the set + * @throws ArrayStoreException if the runtime type of a is not a supertype + * of all elements in the set + * @throws NullPointerException if a is null + * @see #toArray() + */ + Object[] toArray(Object[] a); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/SimpleTimeZone.java gcc-3.1/libjava/java/util/SimpleTimeZone.java *** gcc-3.0.4/libjava/java/util/SimpleTimeZone.java Wed Nov 22 11:59:59 2000 --- gcc-3.1/libjava/java/util/SimpleTimeZone.java Tue Jan 22 22:40:39 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; diff -Nrc3pad gcc-3.0.4/libjava/java/util/SortedMap.java gcc-3.1/libjava/java/util/SortedMap.java *** gcc-3.0.4/libjava/java/util/SortedMap.java Sun Aug 27 22:06:44 2000 --- gcc-3.1/libjava/java/util/SortedMap.java Tue Jan 22 22:40:39 2002 *************** *** 1,5 **** /* SortedMap.java -- A map that makes guarantees about the order of its keys ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* SortedMap.java -- A map that makes guarantees about the order of its keys ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,40 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Doc comments for everything. package java.util; ! public interface SortedMap extends Map { Comparator comparator(); Object firstKey(); SortedMap headMap(Object toKey); Object lastKey(); SortedMap subMap(Object fromKey, Object toKey); SortedMap tailMap(Object fromKey); } --- 18,170 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; ! /** ! * A map which guarantees its key's iteration order. The entries in the ! * map are related by the natural ordering of the keys if they ! * are Comparable, or by the provided Comparator. Additional operations ! * take advantage of the sorted nature of the map. ! *

          ! * ! * All keys entered in the map must be mutually comparable; in other words, ! * k1.compareTo(k2) or comparator.compare(k1, k2) ! * must not throw a ClassCastException. The ordering must be consistent ! * with equals (see {@link Comparator} for this definition), if the ! * map is to obey the general contract of the Map interface. If not, ! * the results are well-defined, but probably not what you wanted. ! *

          ! * ! * It is recommended that all implementing classes provide four constructors: ! * 1) one that takes no arguments and builds an empty map sorted by natural ! * order of the keys; 2) one that takes a Comparator for the sorting order; ! * 3) one that takes a Map and sorts according to the natural order of its ! * keys; and 4) one that takes a SortedMap and sorts by the same comparator. ! * Unfortunately, the Java language does not provide a way to enforce this. ! * ! * @author Original author unknown ! * @author Eric Blake ! * @see Map ! * @see TreeMap ! * @see SortedSet ! * @see Comparable ! * @see Comparator ! * @see Collection ! * @see ClassCastException ! * @since 1.2 ! * @status updated to 1.4 ! */ ! public interface SortedMap extends Map ! { ! /** ! * Returns the comparator used in sorting this map, or null if it is ! * the keys' natural ordering. ! * ! * @return the sorting comparator ! */ Comparator comparator(); + + /** + * Returns the first (lowest sorted) key in the map. + * + * @return the first key + */ Object firstKey(); + + /** + * Returns a view of the portion of the map strictly less than toKey. The + * view is backed by this map, so changes in one show up in the other. + * The submap supports all optional operations of the original. + *

          + * + * The returned map throws an IllegalArgumentException any time a key is + * used which is out of the range of toKey. Note that the endpoint is not + * included; if you want the endpoint, pass the successor object in to + * toKey. For example, for Strings, you can request + * headMap(limit + "\0"). + * + * @param toKey the exclusive upper range of the submap + * @return the submap + * @throws ClassCastException if toKey is not comparable to the map contents + * @throws IllegalArgumentException if this is a subMap, and toKey is out + * of range + * @throws NullPointerException if toKey is null but the map does not allow + * null keys + */ SortedMap headMap(Object toKey); + + /** + * Returns the last (highest sorted) key in the map. + * + * @return the last key + */ Object lastKey(); + + /** + * Returns a view of the portion of the map greater than or equal to + * fromKey, and strictly less than toKey. The view is backed by this map, + * so changes in one show up in the other. The submap supports all + * optional operations of the original. + *

          + * + * The returned map throws an IllegalArgumentException any time a key is + * used which is out of the range of fromKey and toKey. Note that the + * lower endpoint is included, but the upper is not; if you want to + * change the inclusion or exclusion of an endpoint, pass the successor + * object in instead. For example, for Strings, you can request + * subMap(lowlimit + "\0", highlimit + "\0") to reverse + * the inclusiveness of both endpoints. + * + * @param fromKey the inclusive lower range of the submap + * @param toKey the exclusive upper range of the submap + * @return the submap + * @throws ClassCastException if fromKey or toKey is not comparable to + * the map contents + * @throws IllegalArgumentException if this is a subMap, and fromKey or + * toKey is out of range + * @throws NullPointerException if fromKey or toKey is null but the map + * does not allow null keys + */ SortedMap subMap(Object fromKey, Object toKey); + + /** + * Returns a view of the portion of the map greater than or equal to + * fromKey. The view is backed by this map, so changes in one show up + * in the other. The submap supports all optional operations of the original. + *

          + * + * The returned map throws an IllegalArgumentException any time a key is + * used which is out of the range of fromKey. Note that the endpoint is + * included; if you do not want the endpoint, pass the successor object in + * to fromKey. For example, for Strings, you can request + * tailMap(limit + "\0"). + * + * @param fromKey the inclusive lower range of the submap + * @return the submap + * @throws ClassCastException if fromKey is not comparable to the map + * contents + * @throws IllegalArgumentException if this is a subMap, and fromKey is out + * of range + * @throws NullPointerException if fromKey is null but the map does not allow + * null keys + */ SortedMap tailMap(Object fromKey); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/SortedSet.java gcc-3.1/libjava/java/util/SortedSet.java *** gcc-3.0.4/libjava/java/util/SortedSet.java Sat Feb 17 01:06:45 2001 --- gcc-3.1/libjava/java/util/SortedSet.java Tue Jan 22 22:40:39 2002 *************** *** 1,6 **** ! /* SortedSet.java -- A set that makes guarantees about the order of its elements ! Copyright (C) 1998 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- ! /* SortedSet.java -- A set that makes guarantees about the order of its elements ! Copyright (C) 1998, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 19,42 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ - // TO DO: - // ~ Doc comments for everything. package java.util; public interface SortedSet extends Set { Comparator comparator(); Object first(); SortedSet headSet(Object toElement); Object last(); SortedSet subSet(Object fromElement, Object toElement); SortedSet tailSet(Object fromElement); } --- 19,173 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ package java.util; + /** + * A set which guarantees its iteration order. The elements in the set + * are related by the natural ordering if they are Comparable, or + * by the provided Comparator. Additional operations take advantage of + * the sorted nature of the set. + *

          + * + * All elements entered in the set must be mutually comparable; in other words, + * k1.compareTo(k2) or comparator.compare(k1, k2) + * must not throw a ClassCastException. The ordering must be consistent + * with equals (see {@link Comparator} for this definition), if the + * map is to obey the general contract of the Set interface. If not, + * the results are well-defined, but probably not what you wanted. + *

          + * + * It is recommended that all implementing classes provide four constructors: + * 1) one that takes no arguments and builds an empty set sorted by natural + * order of the elements; 2) one that takes a Comparator for the sorting order; + * 3) one that takes a Set and sorts according to the natural order of its + * elements; and 4) one that takes a SortedSet and sorts by the same + * comparator. Unfortunately, the Java language does not provide a way to + * enforce this. + * + * @author Original author unknown + * @author Eric Blake + * @see Set + * @see TreeSet + * @see SortedMap + * @see Collection + * @see Comparable + * @see Comparator + * @see ClassCastException + * @since 1.2 + * @status updated to 1.4 + */ public interface SortedSet extends Set { + /** + * Returns the comparator used in sorting this set, or null if it is + * the elements' natural ordering. + * + * @return the sorting comparator + */ Comparator comparator(); + + /** + * Returns the first (lowest sorted) element in the map. + * + * @return the first element + */ Object first(); + + /** + * Returns a view of the portion of the set strictly less than toElement. The + * view is backed by this set, so changes in one show up in the other. + * The subset supports all optional operations of the original. + *

          + * + * The returned set throws an IllegalArgumentException any time an element is + * used which is out of the range of toElement. Note that the endpoint is not + * included; if you want the endpoint, pass the successor object in to + * toElement. For example, for Strings, you can request + * headSet(limit + "\0"). + * + * @param toElement the exclusive upper range of the subset + * @return the subset + * @throws ClassCastException if toElement is not comparable to the set + * contents + * @throws IllegalArgumentException if this is a subSet, and toElement is out + * of range + * @throws NullPointerException if toElement is null but the map does not + * allow null elements + */ SortedSet headSet(Object toElement); + + /** + * Returns the last (highest sorted) element in the map. + * + * @return the last element + */ Object last(); + + /** + * Returns a view of the portion of the set greater than or equal to + * fromElement, and strictly less than toElement. The view is backed by + * this set, so changes in one show up in the other. The subset supports all + * optional operations of the original. + *

          + * + * The returned set throws an IllegalArgumentException any time an element is + * used which is out of the range of fromElement and toElement. Note that the + * lower endpoint is included, but the upper is not; if you want to + * change the inclusion or exclusion of an endpoint, pass the successor + * object in instead. For example, for Strings, you can request + * subSet(lowlimit + "\0", highlimit + "\0") to reverse + * the inclusiveness of both endpoints. + * + * @param fromElement the inclusive lower range of the subset + * @param toElement the exclusive upper range of the subset + * @return the subset + * @throws ClassCastException if fromElement or toElement is not comparable + * to the set contents + * @throws IllegalArgumentException if this is a subSet, and fromElement or + * toElement is out of range + * @throws NullPointerException if fromElement or toElement is null but the + * set does not allow null elements + */ SortedSet subSet(Object fromElement, Object toElement); + + /** + * Returns a view of the portion of the set greater than or equal to + * fromElement. The view is backed by this set, so changes in one show up + * in the other. The subset supports all optional operations of the original. + *

          + * + * The returned set throws an IllegalArgumentException any time an element is + * used which is out of the range of fromElement. Note that the endpoint is + * included; if you do not want the endpoint, pass the successor object in + * to fromElement. For example, for Strings, you can request + * tailSet(limit + "\0"). + * + * @param fromElement the inclusive lower range of the subset + * @return the subset + * @throws ClassCastException if fromElement is not comparable to the set + * contents + * @throws IllegalArgumentException if this is a subSet, and fromElement is + * out of range + * @throws NullPointerException if fromElement is null but the set does not + * allow null elements + */ SortedSet tailSet(Object fromElement); } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Stack.java gcc-3.1/libjava/java/util/Stack.java *** gcc-3.0.4/libjava/java/util/Stack.java Fri Sep 8 19:37:09 2000 --- gcc-3.1/libjava/java/util/Stack.java Tue Jan 22 22:40:39 2002 *************** *** 1,76 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; - /** - * @author Warren Levy - * @date August 20, 1998. - */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct - */ public class Stack extends Vector { ! // Could use Vector methods internally for the following methods // but have used Vector fields directly for efficiency (i.e. this // often reduces out duplicate bounds checking). ! public boolean empty() { - return elementCount == 0; } ! public synchronized Object peek() { ! if (elementCount == 0) ! throw new EmptyStackException(); ! return elementData[elementCount - 1]; } public synchronized Object pop() { if (elementCount == 0) throw new EmptyStackException(); Object obj = elementData[--elementCount]; ! // Set topmost element to null to assist the gc in cleanup elementData[elementCount] = null; return obj; } ! public Object push(Object obj) { ! // When growing the Stack, use the Vector routines in case more ! // memory is needed. ! // Note: spec indicates that this method *always* returns obj passed in! ! addElement(obj); ! return obj; } ! public synchronized int search(Object obj) { ! // Return the position of obj on the stack as measured from the top; ! // i.e. the top element is 1, the next element down is 2, etc. ! // If obj is not on the stack, return -1 ! ! for (int i = elementCount-1; i >=0; --i) ! if (elementData[i].equals(obj)) ! return elementCount - i; return -1; } - - private static final long serialVersionUID = 1224463164541339165L; } --- 1,158 ---- ! /* Stack.java - Class that provides a Last In First Out (LIFO) ! datatype, known more commonly as a Stack ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct + /** + * Stack provides a Last In First Out (LIFO) data type, commonly known + * as a Stack. Stack itself extends Vector and provides the additional + * methods for stack manipulation (push, pop, peek). You can also seek for + * the 1-based position of an element on the stack. + * + * @author Warren Levy + * @author Eric Blake + * @see List + * @see AbstractList + * @see LinkedList + * @since 1.0 + * @status updated to 1.4 + */ public class Stack extends Vector { ! // We could use Vector methods internally for the following methods, // but have used Vector fields directly for efficiency (i.e. this // often reduces out duplicate bounds checking). ! /** ! * Compatible with JDK 1.0+. ! */ ! private static final long serialVersionUID = 1224463164541339165L; ! ! /** ! * This constructor creates a new Stack, initially empty ! */ ! public Stack() { } ! /** ! * Pushes an Object onto the top of the stack. This method is effectively ! * the same as addElement(item). ! * ! * @param item the Object to push onto the stack ! * @return the Object pushed onto the stack ! * @see Vector#addElement(Object) ! */ ! public Object push(Object item) { ! // When growing the Stack, use the Vector routines in case more ! // memory is needed. ! // Note: spec indicates that this method *always* returns obj passed in! ! addElement(item); ! return item; } + /** + * Pops an item from the stack and returns it. The item popped is + * removed from the Stack. + * + * @return the Object popped from the stack + * @throws EmptyStackException if the stack is empty + */ public synchronized Object pop() { if (elementCount == 0) throw new EmptyStackException(); + modCount++; Object obj = elementData[--elementCount]; ! // Set topmost element to null to assist the gc in cleanup. elementData[elementCount] = null; return obj; } ! /** ! * Returns the top Object on the stack without removing it. ! * ! * @return the top Object on the stack ! * @throws EmptyStackException if the stack is empty ! */ ! public synchronized Object peek() { ! if (elementCount == 0) ! throw new EmptyStackException(); ! return elementData[elementCount - 1]; } ! /** ! * Tests if the stack is empty. ! * ! * @return true if the stack contains no items, false otherwise ! */ ! public synchronized boolean empty() { ! return elementCount == 0; ! } + /** + * Returns the position of an Object on the stack, with the top + * most Object being at position 1, and each Object deeper in the + * stack at depth + 1. + * + * @param o The object to search for + * @return The 1 based depth of the Object, or -1 if the Object + * is not on the stack + */ + public synchronized int search(Object o) + { + int i = elementCount; + while (--i >= 0) + if (equals(o, elementData[i])) + return elementCount - i; return -1; } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/StringTokenizer.java gcc-3.1/libjava/java/util/StringTokenizer.java *** gcc-3.0.4/libjava/java/util/StringTokenizer.java Sun Apr 9 01:26:20 2000 --- gcc-3.1/libjava/java/util/StringTokenizer.java Tue Jan 22 22:40:39 2002 *************** *** 1,76 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; /** * @author Warren Levy - * @date August 24, 1998. - */ - /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 - * "The Java Language Specification", ISBN 0-201-63451-1 - * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. - * Status: Believed complete and correct */ - public class StringTokenizer implements Enumeration { ! /* String to be parsed */ ! private String inputString; ! /* String to be parsed put into a char array for efficient access */ ! private char[] chArray; ! /* Set of delimiter characters for separating tokens */ ! private String delimiters; ! /* Whether delimiters in this instance are treated as tokens themselves */ ! private boolean returnDelimiters; ! /* Index into the input string to start parsing for the next token */ ! private int inputStringIndex; ! public StringTokenizer(String str) { ! this(str, " \t\n\r", false); } ! public StringTokenizer(String str, String delims) { ! this(str, delims, false); } ! public StringTokenizer(String str, String delims, boolean retDelim) { ! inputString = str; ! delimiters = delims; ! returnDelimiters = retDelim; ! inputStringIndex = 0; ! // Work on a copy of the remaining string in a char array ! // to gain efficiency of using primitives ! chArray = new char[inputString.length()]; ! inputString.getChars(0, inputString.length(), chArray, 0); } public int countTokens() { int count = 0; int delimiterCount = 0; boolean tokenFound = false; // Set when a non-delimiter is found ! int offset = inputStringIndex; // Note for efficiency, we count up the delimiters rather than check ! // returnDelimiters every time we encounter one. That way, we can // just do the conditional once at the end of the method ! while (offset < chArray.length) { ! if (isDelimiter(chArray[offset++])) { if (tokenFound) { --- 1,247 ---- ! /* java.util.StringTokenizer ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; /** + * This class splits a string into tokens. The caller can set on which + * delimiters the string should be split and if the delimiters should be + * returned. + * + * You may change the delimiter set on the fly by calling + * nextToken(String). But the semantic is quite difficult; it even + * depends on calling hasMoreTokens(). You should call + * hasMoreTokens() before, otherwise the old delimiters + * after the last token are returned. + * + * If you want to get the delimiters, you have to use the three argument + * constructor. The delimiters are returned as token consisting of a + * single character. + * + * @author Jochen Hoenicke * @author Warren Levy */ public class StringTokenizer implements Enumeration { ! /** ! * The position in the str, where we currently are. ! */ ! private int pos; ! /** ! * The string that should be split into tokens. ! */ ! private String str; ! /** ! * The string containing the delimiter characters. ! */ ! private String delim; ! /** ! * Tells, if we should return the delimiters. ! */ ! private boolean retDelims; ! /*{ ! invariant { ! pos >= 0 :: "position is negative"; ! pos <= str.length() :: "position is out of string"; ! str != null :: "String is null"; ! delim != null :: "Delimiters are null"; ! } ! } */ ! /** ! * Creates a new StringTokenizer for the string str, ! * that should split on the default delimiter set (space, tap, ! * newline, return and formfeed), and which doesn't return the ! * delimiters. ! * @param str The string to split. ! */ ! public StringTokenizer(String str) ! /*{ require { str != null :: "str must not be null"; } } */ ! { ! this(str, " \t\n\r\f", false); ! } ! /** ! * Create a new StringTokenizer, that splits the given string on ! * the given delimiter characters. It doesn't return the delimiter ! * characters. ! * ! * @param str The string to split. ! * @param delim A string containing all delimiter characters. ! */ ! public StringTokenizer(String str, String delim) ! /*{ require { str != null :: "str must not be null"; ! delim != null :: "delim must not be null"; } } */ ! { ! this(str, delim, false); ! } ! /** ! * Create a new StringTokenizer, that splits the given string on ! * the given delimiter characters. If you set ! * returnDelims to true, the delimiter ! * characters are returned as tokens of their own. The delimiter ! * tokens always consist of a single character. ! * ! * @param str The string to split. ! * @param delim A string containing all delimiter characters. ! * @param returnDelims Tells, if you want to get the delimiters. ! */ ! public StringTokenizer(String str, String delim, boolean returnDelims) ! /*{ require { str != null :: "str must not be null"; ! delim != null :: "delim must not be null"; } } */ ! { ! this.str = str; ! this.delim = delim; ! this.retDelims = returnDelims; ! this.pos = 0; ! } ! /** ! * Tells if there are more tokens. ! * @return True, if the next call of nextToken() succeeds, false otherwise. ! */ ! public boolean hasMoreTokens() { ! if (!retDelims) ! { ! while (pos < str.length() && delim.indexOf(str.charAt(pos)) > -1) ! { ! pos++; ! } ! } ! return pos < str.length(); } ! /** ! * Returns the nextToken, changing the delimiter set to the given ! * delim. The change of the delimiter set is ! * permanent, ie. the next call of nextToken(), uses the same ! * delimiter set. ! * @param delim a string containing the new delimiter characters. ! * @return the next token with respect to the new delimiter characters. ! * @exception NoSuchElementException if there are no more tokens. ! */ ! public String nextToken(String delim) throws NoSuchElementException ! /*{ require { hasMoreTokens() :: "no more Tokens available"; ! ensure { $return != null && $return.length() > 0; } } */ { ! this.delim = delim; ! return nextToken(); } ! /** ! * Returns the nextToken of the string. ! * @param delim a string containing the new delimiter characters. ! * @return the next token with respect to the new delimiter characters. ! * @exception NoSuchElementException if there are no more tokens. ! */ ! public String nextToken() throws NoSuchElementException ! /*{ require { hasMoreTokens() :: "no more Tokens available"; ! ensure { $return != null && $return.length() > 0; } } */ { ! if (pos < str.length() && delim.indexOf(str.charAt(pos)) > -1) ! { ! if (retDelims) ! return str.substring(pos, ++pos); ! while (++pos < str.length() && delim.indexOf(str.charAt(pos)) > -1) ! { ! /* empty */ ! } ! } ! if (pos < str.length()) ! { ! int start = pos; ! while (++pos < str.length() && delim.indexOf(str.charAt(pos)) == -1) ! { ! /* empty */ ! } ! return str.substring(start, pos); ! } ! throw new NoSuchElementException(); } + /** + * This does the same as hasMoreTokens. This is the + * EnumerationEnumerationnextTokens() will + * succeed. + * @see #nextToken + */ public int countTokens() { int count = 0; int delimiterCount = 0; boolean tokenFound = false; // Set when a non-delimiter is found ! int tmpPos = pos; // Note for efficiency, we count up the delimiters rather than check ! // retDelims every time we encounter one. That way, we can // just do the conditional once at the end of the method ! while (tmpPos < str.length()) { ! if (delim.indexOf(str.charAt(tmpPos++)) > -1) { if (tokenFound) { *************** public class StringTokenizer implements *** 86,93 **** tokenFound = true; // Get to the end of the token ! while (offset < chArray.length && !isDelimiter(chArray[offset])) ! offset++; } } --- 257,265 ---- tokenFound = true; // Get to the end of the token ! while (tmpPos < str.length() ! && delim.indexOf(str.charAt(tmpPos)) == -1) ! ++tmpPos; } } *************** public class StringTokenizer implements *** 96,185 **** count++; // if counting delmiters add them into the token count ! return returnDelimiters ? count + delimiterCount : count; ! } ! ! public boolean hasMoreElements() ! { ! return hasMoreTokens(); ! } ! ! public boolean hasMoreTokens() ! { ! int offset = inputStringIndex; ! ! while (offset < chArray.length) ! if (!isDelimiter(chArray[offset++]) || returnDelimiters) ! { ! // update the current position with the start of the next token ! inputStringIndex = --offset; ! ! return true; ! } ! ! return false; ! } ! ! public Object nextElement() ! { ! return nextToken(); ! } ! ! public String nextToken() ! { ! int offset = inputStringIndex; ! int startSubstr = -1; ! ! // Make sure we have more chars left to parse ! // and then find the start of the next token ! while (offset < chArray.length && startSubstr < 0) ! { ! // Find the start of the token; skipping initial delimiters ! if (!isDelimiter(chArray[offset++])) ! startSubstr = offset - 1; ! else if (returnDelimiters) ! { ! // The single char delimiter is treated as a token ! inputStringIndex = offset; // update the current position ! ! return inputString.substring(offset - 1, inputStringIndex); ! } ! } ! ! // Now look for the end of the token ! while (offset < chArray.length) ! { ! if (isDelimiter(chArray[offset++])) ! { ! // Found the end of token ! inputStringIndex = offset - 1; // update the current position ! ! return inputString.substring(startSubstr, inputStringIndex); ! } ! } ! ! // Got to the end of the string without finding the start of a token ! if (startSubstr < 0) ! throw new NoSuchElementException(); ! ! // Got to the end of the string before a delimiter ! inputStringIndex = offset; // update the current position ! ! return inputString.substring(startSubstr, inputStringIndex); ! } ! ! public String nextToken(String delims) ! { ! // First replace with new set of delimiters ! delimiters = delims; ! ! return nextToken(); ! } ! ! // This private method could be inlined but the other methods are ! // more readable this way, so we'll take the hit on efficiency. ! private boolean isDelimiter(char ch) ! { ! return delimiters.indexOf(ch, 0) >= 0; } } --- 268,273 ---- count++; // if counting delmiters add them into the token count ! return retDelims ? count + delimiterCount : count; } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/TimeZone.java gcc-3.1/libjava/java/util/TimeZone.java *** gcc-3.0.4/libjava/java/util/TimeZone.java Thu Apr 19 01:06:35 2001 --- gcc-3.1/libjava/java/util/TimeZone.java Tue Jan 22 22:40:39 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** public abstract class TimeZone implement *** 118,123 **** --- 129,135 ---- Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600); timezones.put("PST", tz); + timezones.put("PST8PDT", tz); timezones.put("America/Dawson", tz); timezones.put("America/Los_Angeles", tz); timezones.put("America/Tijuana", tz); *************** public abstract class TimeZone implement *** 131,136 **** --- 143,149 ---- Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600); timezones.put("MST", tz); + timezones.put("MST7MDT", tz); timezones.put("America/Boise", tz); timezones.put("America/Chihuahua", tz); timezones.put("America/Denver", tz); *************** public abstract class TimeZone implement *** 139,145 **** timezones.put("America/Mazatlan", tz); timezones.put("America/Shiprock", tz); timezones.put("America/Yellowknife", tz); ! tz = new SimpleTimeZone(-7000 * 3600, "PNT"); timezones.put("PNT", tz); timezones.put("America/Dawson_Creek", tz); timezones.put("America/Hermosillo", tz); --- 152,159 ---- timezones.put("America/Mazatlan", tz); timezones.put("America/Shiprock", tz); timezones.put("America/Yellowknife", tz); ! tz = new SimpleTimeZone(-7000 * 3600, "MST7"); ! timezones.put("MST7", tz); timezones.put("PNT", tz); timezones.put("America/Dawson_Creek", tz); timezones.put("America/Hermosillo", tz); *************** public abstract class TimeZone implement *** 149,154 **** --- 163,169 ---- Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600); timezones.put("CST", tz); + timezones.put("CST6CDT", tz); timezones.put("America/Cambridge_Bay", tz); timezones.put("America/Cancun", tz); timezones.put("America/Chicago", tz); *************** public abstract class TimeZone implement *** 179,185 **** Calendar.OCTOBER, -1, Calendar.SUNDAY, 0 * 3600); timezones.put("America/Grand_Turk", tz); timezones.put("America/Havana", tz); ! tz = new SimpleTimeZone(-5000 * 3600, "IET"); timezones.put("IET", tz); timezones.put("America/Bogota", tz); timezones.put("America/Cayman", tz); --- 194,201 ---- Calendar.OCTOBER, -1, Calendar.SUNDAY, 0 * 3600); timezones.put("America/Grand_Turk", tz); timezones.put("America/Havana", tz); ! tz = new SimpleTimeZone(-5000 * 3600, "EST5"); ! timezones.put("EST5", tz); timezones.put("IET", tz); timezones.put("America/Bogota", tz); timezones.put("America/Cayman", tz); *************** public abstract class TimeZone implement *** 203,208 **** --- 219,225 ---- Calendar.APRIL, 1, Calendar.SUNDAY, 2000 * 3600, Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600); timezones.put("EST", tz); + timezones.put("EST5EDT", tz); timezones.put("America/Detroit", tz); timezones.put("America/Kentucky/Louisville", tz); timezones.put("America/Kentucky/Monticello", tz); diff -Nrc3pad gcc-3.0.4/libjava/java/util/Timer.java gcc-3.1/libjava/java/util/Timer.java *** gcc-3.0.4/libjava/java/util/Timer.java Fri Feb 9 23:28:55 2001 --- gcc-3.1/libjava/java/util/Timer.java Sun Mar 3 23:21:35 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** package java.util; *** 39,46 **** * scheduling guarantees more or less that the task will be executed at a * specific time, but if there is ever a delay in execution then the period * between successive executions will be shorter. The first method of ! * repeated scheduling is prefered for repeated tasks in response to user ! * interaction, the second method of repeated scheduling is prefered for tasks * that act like alarms. *

          * The Timer keeps a binary heap as a task priority queue which means that --- 50,57 ---- * scheduling guarantees more or less that the task will be executed at a * specific time, but if there is ever a delay in execution then the period * between successive executions will be shorter. The first method of ! * repeated scheduling is preferred for repeated tasks in response to user ! * interaction, the second method of repeated scheduling is preferred for tasks * that act like alarms. *

          * The Timer keeps a binary heap as a task priority queue which means that *************** public class Timer *** 65,71 **** /** Default size of this queue */ private final int DEFAULT_SIZE = 32; ! /** Wheter to return null when there is nothing in the queue */ private boolean nullOnEmpty; /** --- 76,82 ---- /** Default size of this queue */ private final int DEFAULT_SIZE = 32; ! /** Whether to return null when there is nothing in the queue */ private boolean nullOnEmpty; /** *************** public class Timer *** 282,287 **** --- 293,299 ---- public synchronized void stop() { this.heap = null; + this.elements = 0; this.notify(); } *************** public class Timer *** 337,343 **** } } ! // Calculate next time and possibly re-enqueue if (task.scheduled >= 0) { if (task.fixed) --- 349,355 ---- } } ! // Calculate next time and possibly re-enqueue. if (task.scheduled >= 0) { if (task.fixed) *************** public class Timer *** 348,354 **** { task.scheduled = task.period + System.currentTimeMillis(); } ! queue.enqueue(task); } } } --- 360,374 ---- { task.scheduled = task.period + System.currentTimeMillis(); } ! ! try ! { ! queue.enqueue(task); ! } ! catch (IllegalStateException ise) ! { ! // Ignore. Apparently the Timer queue has been stopped. ! } } } } *************** public class Timer *** 375,381 **** private boolean canceled; /** ! * Creates a new Timer with a non deamon Thread as Scheduler, with normal * priority and a default name. */ public Timer() --- 395,401 ---- private boolean canceled; /** ! * Creates a new Timer with a non daemon Thread as Scheduler, with normal * priority and a default name. */ public Timer() *************** public class Timer *** 384,390 **** } /** ! * Creates a new Timer with a deamon Thread as scheduler if deamon is true, * with normal priority and a default name. */ public Timer(boolean daemon) --- 404,410 ---- } /** ! * Creates a new Timer with a daemon Thread as scheduler if daemon is true, * with normal priority and a default name. */ public Timer(boolean daemon) *************** public class Timer *** 393,399 **** } /** ! * Creates a new Timer with a deamon Thread as scheduler if deamon is true, * with the priority given and a default name. */ private Timer(boolean daemon, int priority) --- 413,419 ---- } /** ! * Creates a new Timer with a daemon Thread as scheduler if daemon is true, * with the priority given and a default name. */ private Timer(boolean daemon, int priority) *************** public class Timer *** 402,408 **** } /** ! * Creates a new Timer with a deamon Thread as scheduler if deamon is true, * with the priority and name given.E */ private Timer(boolean daemon, int priority, String name) --- 422,428 ---- } /** ! * Creates a new Timer with a daemon Thread as scheduler if daemon is true, * with the priority and name given.E */ private Timer(boolean daemon, int priority, String name) diff -Nrc3pad gcc-3.0.4/libjava/java/util/TimerTask.java gcc-3.1/libjava/java/util/TimerTask.java *** gcc-3.0.4/libjava/java/util/TimerTask.java Sun Aug 27 22:06:44 2000 --- gcc-3.1/libjava/java/util/TimerTask.java Tue Jan 22 22:40:39 2002 *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** package java.util; *** 58,131 **** * @since 1.3 * @author Mark Wielaard (mark@klomp.org) */ ! public abstract class TimerTask implements Runnable { ! ! /** ! * If positive the next time this task should be run. ! * If negative this TimerTask is canceled or executed for the last time. ! */ ! long scheduled; ! /** ! * If positive the last time this task was run. ! * If negative this TimerTask has not yet been scheduled. ! */ ! long lastExecutionTime; ! /** ! * If positive the number of milliseconds between runs of this task. ! * If -1 this task doesn't have to be run more then once. ! */ ! long period; ! /** ! * If true the next time this task should be run is relative to ! * the last scheduled time, otherwise it can drift in time. ! */ ! boolean fixed; ! /** ! * Creates a TimerTask and marks it as not yet scheduled. ! */ ! protected TimerTask() { ! this.scheduled = 0; ! this.lastExecutionTime = -1; ! } ! /** ! * Marks the task as canceled and prevents any further execution. ! * Returns true if the task was scheduled for any execution in the future ! * and this cancel operation prevents that execution from happening. ! *

          ! * A task that has been canceled can never be scheduled again. ! *

          ! * In this implementation the TimerTask it is possible that the Timer does ! * keep a reference to the TimerTask until the first time the TimerTask ! * is actually scheduled. But the reference will disappear immediatly when ! * cancel is called from within the TimerTask run method. ! */ ! public boolean cancel() { ! boolean prevented_execution = (this.scheduled >= 0); ! this.scheduled = -1; ! return prevented_execution; ! } ! /** ! * Method that is called when this task is scheduled for execution. ! */ ! public abstract void run(); ! /** ! * Returns the last time this task was scheduled or (when called by the ! * task from the run method) the time the current execution of the task ! * was scheduled. When the task has not yet run the return value is ! * undefined. ! *

          ! * Can be used (when the task is scheduled at fixed rate) to see the ! * difference between the requested schedule time and the actual time ! * that can be found with System.currentTimeMillis(). ! */ ! public long scheduledExecutionTime() { ! return lastExecutionTime; ! } } --- 69,145 ---- * @since 1.3 * @author Mark Wielaard (mark@klomp.org) */ ! public abstract class TimerTask implements Runnable ! { ! /** ! * If positive the next time this task should be run. ! * If negative this TimerTask is canceled or executed for the last time. ! */ ! long scheduled; ! /** ! * If positive the last time this task was run. ! * If negative this TimerTask has not yet been scheduled. ! */ ! long lastExecutionTime; ! /** ! * If positive the number of milliseconds between runs of this task. ! * If -1 this task doesn't have to be run more then once. ! */ ! long period; ! /** ! * If true the next time this task should be run is relative to ! * the last scheduled time, otherwise it can drift in time. ! */ ! boolean fixed; ! /** ! * Creates a TimerTask and marks it as not yet scheduled. ! */ ! protected TimerTask() ! { ! this.scheduled = 0; ! this.lastExecutionTime = -1; ! } ! /** ! * Marks the task as canceled and prevents any further execution. ! * Returns true if the task was scheduled for any execution in the future ! * and this cancel operation prevents that execution from happening. ! *

          ! * A task that has been canceled can never be scheduled again. ! *

          ! * In this implementation the TimerTask it is possible that the Timer does ! * keep a reference to the TimerTask until the first time the TimerTask ! * is actually scheduled. But the reference will disappear immediatly when ! * cancel is called from within the TimerTask run method. ! */ ! public boolean cancel() ! { ! boolean prevented_execution = (this.scheduled >= 0); ! this.scheduled = -1; ! return prevented_execution; ! } ! /** ! * Method that is called when this task is scheduled for execution. ! */ ! public abstract void run(); ! /** ! * Returns the last time this task was scheduled or (when called by the ! * task from the run method) the time the current execution of the task ! * was scheduled. When the task has not yet run the return value is ! * undefined. ! *

          ! * Can be used (when the task is scheduled at fixed rate) to see the ! * difference between the requested schedule time and the actual time ! * that can be found with System.currentTimeMillis(). ! */ ! public long scheduledExecutionTime() ! { ! return lastExecutionTime; ! } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/TooManyListenersException.java gcc-3.1/libjava/java/util/TooManyListenersException.java *** gcc-3.0.4/libjava/java/util/TooManyListenersException.java Tue Mar 7 19:55:27 2000 --- gcc-3.1/libjava/java/util/TooManyListenersException.java Tue Jan 22 22:40:39 2002 *************** *** 1,32 **** ! /* Copyright (C) 1998, 1999 Free Software Foundation ! This file is part of libgcj. - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ package java.util; ! ! /** ! * @author Warren Levy ! * @date September 2, 1998. ! */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! public class TooManyListenersException extends Exception { public TooManyListenersException() { - super(); } ! public TooManyListenersException(String msg) { ! super(msg); } } --- 1,78 ---- ! /* java.util.TooManyListenersException ! Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; ! /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ ! ! /** ! * This exception is part of the java event model. It is thrown if an ! * event listener is added via the addXyzEventListener method, but the ! * object doesn't support any more listeners, e.g. it only supports a ! * single event listener. ! * ! * @see EventListener ! * @see EventObject ! * @author Jochen Hoenicke ! * @author Warren Levy ! */ ! public class TooManyListenersException extends Exception { + private static final long serialVersionUID = 5074640544770687831L; + + /** + * Constructs a TooManyListenersException with no detail message. + */ public TooManyListenersException() { } ! /** ! * Constructs a TooManyListenersException with a detail message. ! * @param detail the detail message. ! */ ! public TooManyListenersException(String detail) { ! super(detail); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/TreeMap.java gcc-3.1/libjava/java/util/TreeMap.java *** gcc-3.0.4/libjava/java/util/TreeMap.java Tue Mar 6 01:01:52 2001 --- gcc-3.1/libjava/java/util/TreeMap.java Tue Jan 22 22:40:39 2002 *************** along with GNU Classpath; see the file C *** 19,29 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 19,40 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.IOException; *** 38,117 **** * interface. Elements in the Map will be sorted by either a user-provided * Comparator object, or by the natural ordering of the keys. * ! * The algorithms are adopted from Corman, Leiserson, ! * and Rivest's Introduction to Algorithms. In other words, ! * I cribbed from the same pseudocode as Sun. Any similarity ! * between my code and Sun's (if there is any -- I have never looked ! * at Sun's) is a result of this fact. ! * ! * TreeMap guarantees O(log n) insertion and deletion of elements. That ! * being said, there is a large enough constant coefficient in front of ! * that "log n" (overhead involved in keeping the tree ! * balanced), that TreeMap may not be the best choice for small ! * collections. * * TreeMap is a part of the JDK1.2 Collections API. Null keys are allowed ! * only if a Comparator is used which can deal with them. Null values are ! * always allowed. * ! * @author Jon Zeppieri ! * @author Bryce McKinlay */ public class TreeMap extends AbstractMap implements SortedMap, Cloneable, Serializable { ! private static final int RED = -1, ! BLACK = 1; ! /** Sentinal node, used to avoid null checks for corner cases and make the ! delete rebalance code simpler. Note that this must not be static, due ! to thread-safety concerns. */ ! transient Node nil = new Node(null, null); ! /** The root node of this TreeMap */ ! transient Node root = nil; ! /** The size of this TreeMap */ ! transient int size = 0; ! /** Number of modifications */ ! transient int modCount = 0; ! /** This TreeMap's comparator, if any. */ ! Comparator comparator = null; ! static final long serialVersionUID = 919286545866124006L; ! private static class Node extends BasicMapEntry implements Map.Entry { int color; - Node left; - Node right; - Node parent; ! Node(Object key, Object value) { super(key, value); ! this.color = BLACK; } } /** ! * Instantiate a new TreeMap with no elements, using the keys' ! * natural ordering to sort. * ! * @see java.lang.Comparable */ public TreeMap() { } /** ! * Instantiate a new TreeMap with no elements, using the provided ! * comparator to sort. * ! * @param oComparator a Comparator object, used to sort ! * the keys of this SortedMap */ public TreeMap(Comparator c) { --- 49,214 ---- * interface. Elements in the Map will be sorted by either a user-provided * Comparator object, or by the natural ordering of the keys. * ! * The algorithms are adopted from Corman, Leiserson, and Rivest's ! * Introduction to Algorithms. TreeMap guarantees O(log n) ! * insertion and deletion of elements. That being said, there is a large ! * enough constant coefficient in front of that "log n" (overhead involved ! * in keeping the tree balanced), that TreeMap may not be the best choice ! * for small collections. If something is already sorted, you may want to ! * just use a LinkedHashMap to maintain the order while providing O(1) access. * * TreeMap is a part of the JDK1.2 Collections API. Null keys are allowed ! * only if a Comparator is used which can deal with them; natural ordering ! * cannot cope with null. Null values are always allowed. Note that the ! * ordering must be consistent with equals to correctly implement ! * the Map interface. If this condition is violated, the map is still ! * well-behaved, but you may have suprising results when comparing it to ! * other maps.

          * ! * This implementation is not synchronized. If you need to share this between ! * multiple threads, do something like:
          ! * SortedMap m ! * = Collections.synchronizedSortedMap(new TreeMap(...));

          ! * ! * The iterators are fail-fast, meaning that any structural ! * modification, except for remove() called on the iterator ! * itself, cause the iterator to throw a ! * ConcurrentModificationException rather than exhibit ! * non-deterministic behavior. ! * ! * @author Jon Zeppieri ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see Map ! * @see HashMap ! * @see Hashtable ! * @see LinkedHashMap ! * @see Comparable ! * @see Comparator ! * @see Collection ! * @see Collections#synchronizedSortedMap(SortedMap) ! * @since 1.2 ! * @status updated to 1.4 */ public class TreeMap extends AbstractMap implements SortedMap, Cloneable, Serializable { ! // Implementation note: ! // A red-black tree is a binary search tree with the additional properties ! // that all paths to a leaf node visit the same number of black nodes, ! // and no red node has red children. To avoid some null-pointer checks, ! // we use the special node nil which is always black, has no relatives, ! // and has key and value of null (but is not equal to a mapping of null). ! /** ! * Compatible with JDK 1.2. ! */ ! private static final long serialVersionUID = 919286545866124006L; ! /** ! * Color status of a node. Package visible for use by nested classes. ! */ ! static final int RED = -1, ! BLACK = 1; ! /** ! * Sentinal node, used to avoid null checks for corner cases and make the ! * delete rebalance code simpler. The rebalance code must never assign ! * the parent, left, or right of nil, but may safely reassign the color ! * to be black. This object must never be used as a key in a TreeMap, or ! * it will break bounds checking of a SubMap. ! */ ! static final Node nil = new Node(null, null, BLACK); ! static ! { ! // Nil is self-referential, so we must initialize it after creation. ! nil.parent = nil; ! nil.left = nil; ! nil.right = nil; ! } ! /** ! * The root node of this TreeMap. ! */ ! private transient Node root = nil; ! /** ! * The size of this TreeMap. Package visible for use by nested classes. ! */ ! transient int size; ! /** ! * The cache for {@link #entrySet()}. ! */ ! private transient Set entries; ! /** ! * Counts the number of modifications this TreeMap has undergone, used ! * by Iterators to know when to throw ConcurrentModificationExceptions. ! * Package visible for use by nested classes. ! */ ! transient int modCount; ! ! /** ! * This TreeMap's comparator, or null for natural ordering. ! * Package visible for use by nested classes. ! * @serial the comparator ordering this tree, or null ! */ ! final Comparator comparator; ! ! /** ! * Class to represent an entry in the tree. Holds a single key-value pair, ! * plus pointers to parent and child nodes. ! * ! * @author Eric Blake ! */ ! private static final class Node extends BasicMapEntry { + // All fields package visible for use by nested classes. + /** The color of this node. */ int color; ! /** The left child node. */ ! Node left = nil; ! /** The right child node. */ ! Node right = nil; ! /** The parent node. */ ! Node parent = nil; ! ! /** ! * Simple constructor. ! * @param key the key ! * @param value the value ! */ ! Node(Object key, Object value, int color) { super(key, value); ! this.color = color; } } /** ! * Instantiate a new TreeMap with no elements, using the keys' natural ! * ordering to sort. All entries in the map must have a key which implements ! * Comparable, and which are mutually comparable, otherwise map ! * operations may throw a {@link ClassCastException}. Attempts to use ! * a null key will throw a {@link NullPointerException}. * ! * @see Comparable */ public TreeMap() { + this((Comparator) null); } /** ! * Instantiate a new TreeMap with no elements, using the provided comparator ! * to sort. All entries in the map must have keys which are mutually ! * comparable by the Comparator, otherwise map operations may throw a ! * {@link ClassCastException}. * ! * @param comparator the sort order for the keys of this map, or null ! * for the natural order */ public TreeMap(Comparator c) { *************** public class TreeMap extends AbstractMap *** 119,180 **** } /** ! * Instantiate a new TreeMap, initializing it with all of the ! * elements in the provided Map. The elements will be sorted ! * using the natural ordering of the keys. ! * ! * @param map a Map, whose keys will be put into ! * this TreeMap ! * ! * @throws ClassCastException if the keys in the provided ! * Map do not implement ! * Comparable * ! * @see java.lang.Comparable */ public TreeMap(Map map) { putAll(map); } ! /** ! * Instantiate a new TreeMap, initializing it with all of the ! * elements in the provided SortedMap. The elements will be sorted ! * using the same method as in the provided SortedMap. */ public TreeMap(SortedMap sm) { this(sm.comparator()); ! ! int sm_size = sm.size(); Iterator itr = sm.entrySet().iterator(); ! fabricateTree(sm_size); Node node = firstNode(); ! ! for (int i = 0; i < sm_size; i++) { ! Map.Entry me = (Map.Entry) itr.next(); ! node.key = me.getKey(); ! node.value = me.getValue(); ! node = successor(node); } } ! public int size() ! { ! return size; ! } ! public void clear() { ! modCount++; ! root = nil; ! // nil node could have a residual parent reference, clear it for GC. ! nil.parent = null; ! size = 0; } public Object clone() { TreeMap copy = null; --- 216,285 ---- } /** ! * Instantiate a new TreeMap, initializing it with all of the elements in ! * the provided Map. The elements will be sorted using the natural ! * ordering of the keys. This algorithm runs in n*log(n) time. All entries ! * in the map must have keys which implement Comparable and are mutually ! * comparable, otherwise map operations may throw a ! * {@link ClassCastException}. * ! * @param map a Map, whose entries will be put into this TreeMap ! * @throws ClassCastException if the keys in the provided Map are not ! * comparable ! * @throws NullPointerException if map is null ! * @see Comparable */ public TreeMap(Map map) { + this((Comparator) null); putAll(map); } ! /** ! * Instantiate a new TreeMap, initializing it with all of the elements in ! * the provided SortedMap. The elements will be sorted using the same ! * comparator as in the provided SortedMap. This runs in linear time. ! * ! * @param sm a SortedMap, whose entries will be put into this TreeMap ! * @throws NullPointerException if sm is null */ public TreeMap(SortedMap sm) { this(sm.comparator()); ! int pos = sm.size(); Iterator itr = sm.entrySet().iterator(); ! fabricateTree(pos); Node node = firstNode(); ! ! while (--pos >= 0) { ! Map.Entry me = (Map.Entry) itr.next(); ! node.key = me.getKey(); ! node.value = me.getValue(); ! node = successor(node); } } ! /** ! * Clears the Map so it has no keys. This is O(1). ! */ public void clear() { ! if (size > 0) ! { ! modCount++; ! root = nil; ! size = 0; ! } } + /** + * Returns a shallow clone of this TreeMap. The Map itself is cloned, + * but its contents are not. + * + * @return the clone + */ public Object clone() { TreeMap copy = null; *************** public class TreeMap extends AbstractMap *** 185,731 **** catch (CloneNotSupportedException x) { } ! // Each instance must have a unique sentinal. ! copy.nil = new Node(null, null); copy.fabricateTree(size); Node node = firstNode(); Node cnode = copy.firstNode(); ! while (node != nil) { cnode.key = node.key; ! cnode.value = node.value; ! node = successor(node); ! cnode = copy.successor(cnode); } return copy; } ! public Comparator comparator() { return comparator; } public boolean containsKey(Object key) { return getNode(key) != nil; } public boolean containsValue(Object value) { Node node = firstNode(); - Object currentVal; - while (node != nil) { ! currentVal = node.getValue(); ! ! if (value == null ? currentVal == null : value.equals (currentVal)) ! return true; ! ! node = successor(node); } return false; } public Set entrySet() { ! // Create an AbstractSet with custom implementations of those methods that ! // can be overriden easily and efficiently. ! return new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() ! { ! return new TreeIterator(TreeIterator.ENTRIES); ! } ! ! public void clear() { ! TreeMap.this.clear(); ! } ! public boolean contains(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Node n = getNode(me.getKey()); ! return (n != nil && me.getValue().equals(n.value)); ! } ! ! public boolean remove(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Node n = getNode(me.getKey()); ! if (n != nil && me.getValue().equals(n.value)) ! { ! removeNode(n); ! return true; ! } ! return false; } ! }; } public Object firstKey() { if (root == nil) ! throw new NoSuchElementException("empty"); ! return firstNode().getKey(); ! } ! ! private Node firstNode() ! { ! if (root == nil) ! return nil; ! Node node = root; ! while (node.left != nil) ! node = node.left; ! return node; } ! public Object lastKey() ! { ! if (root == nil) ! throw new NoSuchElementException("empty"); ! return lastNode().getKey(); ! } ! ! private Node lastNode() ! { ! if (root == nil) ! return nil; ! Node node = root; ! while (node.right != nil) ! node = node.right; ! return node; ! } ! public Object get(Object key) { return getNode(key).value; } - - /** Return the TreeMap.Node associated with KEY, or the nil node if no such - node exists in the tree. */ - private Node getNode(Object key) - { - int comparison; - Node current = root; ! while (current != nil) ! { ! comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else ! return current; ! } ! return current; } public Set keySet() { ! // Create an AbstractSet with custom implementations of those methods that ! // can be overriden easily and efficiently. ! return new AbstractSet() ! { ! public int size() ! { ! return size; ! } ! ! public Iterator iterator() { ! return new TreeIterator(TreeIterator.KEYS); ! } ! public void clear() ! { ! TreeMap.this.clear(); ! } ! public boolean contains(Object o) ! { ! return TreeMap.this.containsKey(o); ! } ! ! public boolean remove(Object key) ! { ! Node n = getNode(key); ! if (n == nil) ! return false; ! TreeMap.this.removeNode(n); ! return true; ! } ! }; } public Object put(Object key, Object value) { - modCount++; Node current = root; Node parent = nil; int comparison = 0; ! // Find new node's parent. while (current != nil) { ! parent = current; ! comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else ! { ! // Key already in tree. ! Object r = current.value; ! current.value = value; ! return r; ! } } ! // Set up new node. ! Node n = new Node(key, value); ! n.color = RED; n.parent = parent; ! n.left = nil; ! n.right = nil; ! // Insert node in tree. size++; if (parent == nil) { ! // Special case: inserting into an empty tree. ! root = n; ! n.color = BLACK; ! return null; } ! else if (comparison > 0) parent.right = n; else ! parent.left = n; ! // Rebalance after insert. insertFixup(n); - //verifyTree(); return null; } ! /** Maintain red-black balance after inserting a new node. */ ! private void insertFixup(Node n) ! { ! // Only need to rebalance when parent is a RED node, and while at least ! // 2 levels deep into the tree (ie: node has a grandparent). ! while (n != root && n.parent.parent != nil && n.parent.color == RED) ! { ! if (n.parent == n.parent.parent.left) ! { ! Node uncle = n.parent.parent.right; ! if (uncle != nil && uncle.color == RED) ! { ! n.parent.color = BLACK; ! uncle.color = BLACK; ! n.parent.parent.color = RED; ! n = n.parent.parent; ! } ! else // Uncle is BLACK. ! { ! if (n == n.parent.right) ! { ! // Make n a left child. ! n = n.parent; ! rotateLeft(n); ! } ! ! // Recolor and rotate. ! n.parent.color = BLACK; ! n.parent.parent.color = RED; ! rotateRight(n.parent.parent); ! } ! } ! else ! { ! // Mirror image of above code. ! Node uncle = n.parent.parent.left; ! if (uncle != nil && uncle.color == RED) ! { ! n.parent.color = BLACK; ! uncle.color = BLACK; ! n.parent.parent.color = RED; ! n = n.parent.parent; ! } ! else ! { ! if (n == n.parent.left) ! { ! n = n.parent; ! rotateRight(n); ! } ! n.parent.color = BLACK; ! n.parent.parent.color = RED; ! rotateLeft(n.parent.parent); ! } ! } ! } ! root.color = BLACK; ! } ! public void putAll(Map m) { Iterator itr = m.entrySet().iterator(); ! int msize = m.size(); ! Map.Entry e; ! ! for (int i = 0; i < msize; i++) { ! e = (Map.Entry) itr.next(); ! put(e.getKey(), e.getValue()); } } public Object remove(Object key) { Node n = getNode(key); ! if (n != nil) ! { ! removeNode(n); ! return n.value; ! } ! return null; } ! ! // Remove node from tree. This will increment modCount and decrement size. ! // Node must exist in the tree. ! private void removeNode(Node node) // z { ! Node splice; // y ! Node child; // x ! ! modCount++; ! size--; ! // Find splice, the node at the position to actually remove from the tree. ! if (node.left == nil || node.right == nil) ! { ! // Node to be deleted has 0 or 1 children. ! splice = node; ! if (node.left == nil) ! child = node.right; ! else ! child = node.left; ! } ! else ! { ! // Node has 2 children. Splice is node's successor, and will be ! // swapped with node since we can't remove node directly. ! splice = node.right; ! while (splice.left != nil) ! splice = splice.left; ! child = splice.right; ! } ! // Unlink splice from the tree. ! Node parent = splice.parent; ! child.parent = parent; ! if (parent != nil) { ! if (splice == parent.left) ! parent.left = child; ! else ! parent.right = child; ! } ! else ! root = child; ! // Keep track of splice's color in case it gets changed in the swap. ! int spliceColor = splice.color; ! /* ! if (splice != node) ! { ! node.key = splice.key; ! node.value = splice.value; ! } ! */ ! if (splice != node) ! { ! // Swap SPLICE for NODE. Some implementations optimize here by simply ! // swapping the values, but we can't do that: if an iterator was ! // referencing a node in its "next" field, and that node got swapped, ! // things would get confused. ! if (node == root) ! { ! root = splice; ! } ! else ! { ! if (node.parent.left == node) ! node.parent.left = splice; ! else ! node.parent.right = splice; ! } ! splice.parent = node.parent; ! splice.left = node.left; ! splice.right = node.right; ! splice.left.parent = splice; ! splice.right.parent = splice; ! splice.color = node.color; ! } ! if (spliceColor == BLACK) ! deleteFixup (child); ! ! //verifyTree(); } ! /** Maintain red-black balance after deleting a node. */ ! private void deleteFixup (Node node) { ! // A black node has been removed, so we need to rebalance to avoid // violating the "same number of black nodes on any path" rule. If ! // node is red, we can simply recolor it black and all is well. while (node != root && node.color == BLACK) { ! if (node == node.parent.left) ! { ! // Rebalance left side. ! Node sibling = node.parent.right; ! if (sibling.color == RED) ! { sibling.color = BLACK; ! node.parent.color = RED; ! rotateLeft(node.parent); ! sibling = node.parent.right; ! } ! if (sibling.left.color == BLACK && sibling.right.color == BLACK) { ! // Case 2: Sibling has no red children. ! sibling.color = RED; ! // Black height has been decreased, so move up the tree and ! // repeat. ! node = node.parent; } ! else ! { ! if (sibling.right.color == BLACK) ! { ! // Case 3: Sibling has red left child. ! sibling.left.color = BLACK; ! sibling.color = RED; rotateRight(sibling); ! sibling = node.parent.right; ! } ! ! // Case 4: Sibling has red right child. ! sibling.color = sibling.parent.color; ! sibling.parent.color = BLACK; ! sibling.right.color = BLACK; ! rotateLeft(node.parent); node = root; // Finished. ! } ! } ! else ! { ! // Symmetric "mirror" of left-side case. ! Node sibling = node.parent.left; ! if (sibling.color == RED) ! { sibling.color = BLACK; ! node.parent.color = RED; ! rotateRight(node.parent); ! sibling = node.parent.left; ! } ! if (sibling.left.color == BLACK && sibling.right.color == BLACK) { ! sibling.color = RED; ! node = node.parent; } ! else ! { ! if (sibling.left.color == BLACK) ! { ! sibling.right.color = BLACK; ! sibling.color = RED; rotateLeft(sibling); ! sibling = node.parent.left; ! } ! ! sibling.color = sibling.parent.color; ! sibling.parent.color = BLACK; ! sibling.left.color = BLACK; ! rotateRight(node.parent); ! node = root; ! } ! } } node.color = BLACK; } ! public SortedMap subMap(Object fromKey, Object toKey) { ! if (compare(fromKey, toKey) <= 0) ! return new SubMap(fromKey, toKey); ! else ! throw new IllegalArgumentException("fromKey > toKey"); ! } ! public SortedMap headMap(Object toKey) ! { ! return new SubMap(nil, toKey); ! } ! public SortedMap tailMap(Object fromKey) ! { ! return new SubMap(fromKey, nil); ! } ! /** Returns a "collection view" (or "bag view") of this TreeMap's values. */ ! public Collection values() ! { ! // We don't bother overriding many of the optional methods, as doing so ! // wouldn't provide any significant performance advantage. ! return new AbstractCollection() ! { ! public int size() { ! return size; } ! ! public Iterator iterator() { ! return new TreeIterator(TreeIterator.VALUES); } ! ! public void clear() { ! TreeMap.this.clear(); } - }; } ! // Find the "highest" node which is < key. If key is nil, return last node. ! // Note that highestLessThan is exclusive (it won't return a key which is ! // equal to "key"), while lowestGreaterThan is inclusive, in order to be ! // consistent with the semantics of subMap(). ! private Node highestLessThan(Object key) { if (key == nil) return lastNode(); ! Node last = nil; Node current = root; int comparison = 0; --- 290,973 ---- catch (CloneNotSupportedException x) { } ! copy.entries = null; copy.fabricateTree(size); Node node = firstNode(); Node cnode = copy.firstNode(); ! while (node != nil) { cnode.key = node.key; ! cnode.value = node.value; ! node = successor(node); ! cnode = copy.successor(cnode); } return copy; } ! ! /** ! * Return the comparator used to sort this map, or null if it is by ! * natural order. ! * ! * @return the map's comparator ! */ public Comparator comparator() { return comparator; } + /** + * Returns true if the map contains a mapping for the given key. + * + * @param key the key to look for + * @return true if the key has a mapping + * @throws ClassCastException if key is not comparable to map elements + * @throws NullPointerException if key is null and the comparator is not + * tolerant of nulls + */ public boolean containsKey(Object key) { return getNode(key) != nil; } + /** + * Returns true if the map contains at least one mapping to the given value. + * This requires linear time. + * + * @param value the value to look for + * @return true if the value appears in a mapping + */ public boolean containsValue(Object value) { Node node = firstNode(); while (node != nil) { ! if (equals(value, node.value)) ! return true; ! node = successor(node); } return false; } + /** + * Returns a "set view" of this TreeMap's entries. The set is backed by + * the TreeMap, so changes in one show up in the other. The set supports + * element removal, but not element addition.

          + * + * Note that the iterators for all three views, from keySet(), entrySet(), + * and values(), traverse the TreeMap in sorted sequence. + * + * @return a set view of the entries + * @see #keySet() + * @see #values() + * @see Map.Entry + */ public Set entrySet() { ! if (entries == null) ! // Create an AbstractSet with custom implementations of those methods ! // that can be overriden easily and efficiently. ! entries = new AbstractSet() { ! public int size() ! { ! return size; ! } ! public Iterator iterator() ! { ! return new TreeIterator(ENTRIES); ! } ! ! public void clear() ! { ! TreeMap.this.clear(); ! } ! ! public boolean contains(Object o) ! { ! if (! (o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Node n = getNode(me.getKey()); ! return n != nil && AbstractSet.equals(me.getValue(), n.value); } ! ! public boolean remove(Object o) ! { ! if (! (o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Node n = getNode(me.getKey()); ! if (n != nil && AbstractSet.equals(me.getValue(), n.value)) ! { ! removeNode(n); ! return true; ! } ! return false; ! } ! }; ! return entries; } + /** + * Returns the first (lowest) key in the map. + * + * @return the first key + * @throws NoSuchElementException if the map is empty + */ public Object firstKey() { if (root == nil) ! throw new NoSuchElementException(); ! return firstNode().key; } ! /** ! * Return the value in this TreeMap associated with the supplied key, ! * or null if the key maps to nothing. NOTE: Since the value ! * could also be null, you must use containsKey to see if this key ! * actually maps to something. ! * ! * @param key the key for which to fetch an associated value ! * @return what the key maps to, if present ! * @throws ClassCastException if key is not comparable to elements in the map ! * @throws NullPointerException if key is null but the comparator does not ! * tolerate nulls ! * @see #put(Object, Object) ! * @see #containsKey(Object) ! */ public Object get(Object key) { + // Exploit fact that nil.value == null. return getNode(key).value; } ! /** ! * Returns a view of this Map including all entries with keys less than ! * toKey. The returned map is backed by the original, so changes ! * in one appear in the other. The submap will throw an ! * {@link IllegalArgumentException} for any attempt to access or add an ! * element beyond the specified cutoff. The returned map does not include ! * the endpoint; if you want inclusion, pass the successor element. ! * ! * @param toKey the (exclusive) cutoff point ! * @return a view of the map less than the cutoff ! * @throws ClassCastException if toKey is not compatible with ! * the comparator (or is not Comparable, for natural ordering) ! * @throws NullPointerException if toKey is null, but the comparator does not ! * tolerate null elements ! */ ! public SortedMap headMap(Object toKey) ! { ! return new SubMap(nil, toKey); } + /** + * Returns a "set view" of this TreeMap's keys. The set is backed by the + * TreeMap, so changes in one show up in the other. The set supports + * element removal, but not element addition. + * + * @return a set view of the keys + * @see #values() + * @see #entrySet() + */ public Set keySet() { ! if (keys == null) ! // Create an AbstractSet with custom implementations of those methods ! // that can be overriden easily and efficiently. ! keys = new AbstractSet() { ! public int size() ! { ! return size; ! } ! public Iterator iterator() ! { ! return new TreeIterator(KEYS); ! } ! public void clear() ! { ! TreeMap.this.clear(); ! } ! ! public boolean contains(Object o) ! { ! return containsKey(o); ! } ! ! public boolean remove(Object key) ! { ! Node n = getNode(key); ! if (n == nil) ! return false; ! removeNode(n); ! return true; ! } ! }; ! return keys; ! } ! ! /** ! * Returns the last (highest) key in the map. ! * ! * @return the last key ! * @throws NoSuchElementException if the map is empty ! */ ! public Object lastKey() ! { ! if (root == nil) ! throw new NoSuchElementException("empty"); ! return lastNode().key; } + /** + * Puts the supplied value into the Map, mapped by the supplied key. + * The value may be retrieved by any object which equals() + * this key. NOTE: Since the prior value could also be null, you must + * first use containsKey if you want to see if you are replacing the + * key's mapping. + * + * @param key the key used to locate the value + * @param value the value to be stored in the HashMap + * @return the prior mapping of the key, or null if there was none + * @throws ClassCastException if key is not comparable to current map keys + * @throws NullPointerException if key is null, but the comparator does + * not tolerate nulls + * @see #get(Object) + * @see Object#equals(Object) + */ public Object put(Object key, Object value) { Node current = root; Node parent = nil; int comparison = 0; ! // Find new node's parent. while (current != nil) { ! parent = current; ! comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else // Key already in tree. ! return current.setValue(value); } ! // Set up new node. ! Node n = new Node(key, value, RED); n.parent = parent; ! // Insert node in tree. + modCount++; size++; if (parent == nil) { ! // Special case inserting into an empty tree. ! root = n; ! return null; } ! if (comparison > 0) parent.right = n; else ! parent.left = n; ! // Rebalance after insert. insertFixup(n); return null; } ! /** ! * Copies all elements of the given map into this hashtable. If this table ! * already has a mapping for a key, the new mapping replaces the current ! * one. ! * ! * @param m the map to be hashed into this ! * @throws ClassCastException if a key in m is not comparable with keys ! * in the map ! * @throws NullPointerException if a key in m is null, and the comparator ! * does not tolerate nulls ! */ public void putAll(Map m) { Iterator itr = m.entrySet().iterator(); ! int pos = m.size(); ! while (--pos >= 0) { ! Map.Entry e = (Map.Entry) itr.next(); ! put(e.getKey(), e.getValue()); } } + /** + * Removes from the TreeMap and returns the value which is mapped by the + * supplied key. If the key maps to nothing, then the TreeMap remains + * unchanged, and null is returned. NOTE: Since the value + * could also be null, you must use containsKey to see if you are + * actually removing a mapping. + * + * @param key the key used to locate the value to remove + * @return whatever the key mapped to, if present + * @throws ClassCastException if key is not comparable to current map keys + * @throws NullPointerException if key is null, but the comparator does + * not tolerate nulls + */ public Object remove(Object key) { Node n = getNode(key); ! if (n == nil) ! return null; ! removeNode(n); ! return n.value; } ! ! /** ! * Returns the number of key-value mappings currently in this Map. ! * ! * @return the size ! */ ! public int size() { ! return size; ! } ! /** ! * Returns a view of this Map including all entries with keys greater or ! * equal to fromKey and less than toKey (a ! * half-open interval). The returned map is backed by the original, so ! * changes in one appear in the other. The submap will throw an ! * {@link IllegalArgumentException} for any attempt to access or add an ! * element beyond the specified cutoffs. The returned map includes the low ! * endpoint but not the high; if you want to reverse this behavior on ! * either end, pass in the successor element. ! * ! * @param fromKey the (inclusive) low cutoff point ! * @param toKey the (exclusive) high cutoff point ! * @return a view of the map between the cutoffs ! * @throws ClassCastException if either cutoff is not compatible with ! * the comparator (or is not Comparable, for natural ordering) ! * @throws NullPointerException if fromKey or toKey is null, but the ! * comparator does not tolerate null elements ! * @throws IllegalArgumentException if fromKey is greater than toKey ! */ ! public SortedMap subMap(Object fromKey, Object toKey) ! { ! return new SubMap(fromKey, toKey); ! } ! /** ! * Returns a view of this Map including all entries with keys greater or ! * equal to fromKey. The returned map is backed by the ! * original, so changes in one appear in the other. The submap will throw an ! * {@link IllegalArgumentException} for any attempt to access or add an ! * element beyond the specified cutoff. The returned map includes the ! * endpoint; if you want to exclude it, pass in the successor element. ! * ! * @param fromKey the (inclusive) low cutoff point ! * @return a view of the map above the cutoff ! * @throws ClassCastException if fromKey is not compatible with ! * the comparator (or is not Comparable, for natural ordering) ! * @throws NullPointerException if fromKey is null, but the comparator ! * does not tolerate null elements ! */ ! public SortedMap tailMap(Object fromKey) ! { ! return new SubMap(fromKey, nil); ! } ! ! /** ! * Returns a "collection view" (or "bag view") of this TreeMap's values. ! * The collection is backed by the TreeMap, so changes in one show up ! * in the other. The collection supports element removal, but not element ! * addition. ! * ! * @return a bag view of the values ! * @see #keySet() ! * @see #entrySet() ! */ ! public Collection values() ! { ! if (values == null) ! // We don't bother overriding many of the optional methods, as doing so ! // wouldn't provide any significant performance advantage. ! values = new AbstractCollection() { ! public int size() ! { ! return size; ! } ! public Iterator iterator() ! { ! return new TreeIterator(VALUES); ! } ! public void clear() ! { ! TreeMap.this.clear(); ! } ! }; ! return values; ! } ! /** ! * Compares two elements by the set comparator, or by natural ordering. ! * Package visible for use by nested classes. ! * ! * @param o1 the first object ! * @param o2 the second object ! * @throws ClassCastException if o1 and o2 are not mutually comparable, ! * or are not Comparable with natural ordering ! * @throws NullPointerException if o1 or o2 is null with natural ordering ! */ ! final int compare(Object o1, Object o2) ! { ! return (comparator == null ! ? ((Comparable) o1).compareTo(o2) ! : comparator.compare(o1, o2)); } ! /** ! * Maintain red-black balance after deleting a node. ! * ! * @param node the child of the node just deleted, possibly nil ! * @param parent the parent of the node just deleted, never nil ! */ ! private void deleteFixup(Node node, Node parent) { ! // if (parent == nil) ! // throw new InternalError(); ! // If a black node has been removed, we need to rebalance to avoid // violating the "same number of black nodes on any path" rule. If ! // node is red, we can simply recolor it black and all is well. while (node != root && node.color == BLACK) { ! if (node == parent.left) ! { ! // Rebalance left side. ! Node sibling = parent.right; ! // if (sibling == nil) ! // throw new InternalError(); ! if (sibling.color == RED) ! { ! // Case 1: Sibling is red. ! // Recolor sibling and parent, and rotate parent left. sibling.color = BLACK; ! parent.color = RED; ! rotateLeft(parent); ! sibling = parent.right; ! } ! if (sibling.left.color == BLACK && sibling.right.color == BLACK) { ! // Case 2: Sibling has no red children. ! // Recolor sibling, and move to parent. ! sibling.color = RED; ! node = parent; ! parent = parent.parent; } ! else ! { ! if (sibling.right.color == BLACK) ! { ! // Case 3: Sibling has red left child. ! // Recolor sibling and left child, rotate sibling right. ! sibling.left.color = BLACK; ! sibling.color = RED; rotateRight(sibling); ! sibling = parent.right; ! } ! // Case 4: Sibling has red right child. Recolor sibling, ! // right child, and parent, and rotate parent left. ! sibling.color = parent.color; ! parent.color = BLACK; ! sibling.right.color = BLACK; ! rotateLeft(parent); node = root; // Finished. ! } ! } ! else ! { ! // Symmetric "mirror" of left-side case. ! Node sibling = parent.left; ! // if (sibling == nil) ! // throw new InternalError(); ! if (sibling.color == RED) ! { ! // Case 1: Sibling is red. ! // Recolor sibling and parent, and rotate parent right. sibling.color = BLACK; ! parent.color = RED; ! rotateRight(parent); ! sibling = parent.left; ! } ! if (sibling.right.color == BLACK && sibling.left.color == BLACK) { ! // Case 2: Sibling has no red children. ! // Recolor sibling, and move to parent. ! sibling.color = RED; ! node = parent; ! parent = parent.parent; } ! else ! { ! if (sibling.left.color == BLACK) ! { ! // Case 3: Sibling has red right child. ! // Recolor sibling and right child, rotate sibling left. ! sibling.right.color = BLACK; ! sibling.color = RED; rotateLeft(sibling); ! sibling = parent.left; ! } ! // Case 4: Sibling has red left child. Recolor sibling, ! // left child, and parent, and rotate parent right. ! sibling.color = parent.color; ! parent.color = BLACK; ! sibling.left.color = BLACK; ! rotateRight(parent); ! node = root; // Finished. ! } ! } } node.color = BLACK; } ! /** ! * Construct a perfectly balanced tree consisting of n "blank" nodes. This ! * permits a tree to be generated from pre-sorted input in linear time. ! * ! * @param count the number of blank nodes, non-negative ! */ ! private void fabricateTree(final int count) { ! if (count == 0) ! return; ! // We color every row of nodes black, except for the overflow nodes. ! // I believe that this is the optimal arrangement. We construct the tree ! // in place by temporarily linking each node to the next node in the row, ! // then updating those links to the children when working on the next row. ! // Make the root node. ! root = new Node(null, null, BLACK); ! size = count; ! Node row = root; ! int rowsize; ! // Fill each row that is completely full of nodes. ! for (rowsize = 2; rowsize + rowsize < count; rowsize <<= 1) { ! Node parent = row; ! Node last = null; ! for (int i = 0; i < rowsize; i += 2) ! { ! Node left = new Node(null, null, BLACK); ! Node right = new Node(null, null, BLACK); ! left.parent = parent; ! left.right = right; ! right.parent = parent; ! parent.left = left; ! Node next = parent.right; ! parent.right = right; ! parent = next; ! if (last != null) ! last.right = left; ! last = right; ! } ! row = row.left; } ! ! // Now do the partial final row in red. ! int overflow = count - rowsize; ! Node parent = row; ! int i; ! for (i = 0; i < overflow; i += 2) { ! Node left = new Node(null, null, RED); ! Node right = new Node(null, null, RED); ! left.parent = parent; ! right.parent = parent; ! parent.left = left; ! Node next = parent.right; ! parent.right = right; ! parent = next; } ! // Add a lone left node if necessary. ! if (i - overflow == 0) { ! Node left = new Node(null, null, RED); ! left.parent = parent; ! parent.left = left; ! parent = parent.right; ! left.parent.right = nil; ! } ! // Unlink the remaining nodes of the previous row. ! while (parent != nil) ! { ! Node next = parent.right; ! parent.right = nil; ! parent = next; } } ! /** ! * Returns the first sorted node in the map, or nil if empty. Package ! * visible for use by nested classes. ! * ! * @return the first node ! */ ! final Node firstNode() ! { ! // Exploit fact that nil.left == nil. ! Node node = root; ! while (node.left != nil) ! node = node.left; ! return node; ! } ! ! /** ! * Return the TreeMap.Node associated with key, or the nil node if no such ! * node exists in the tree. Package visible for use by nested classes. ! * ! * @param key the key to search for ! * @return the node where the key is found, or nil ! */ ! final Node getNode(Object key) ! { ! Node current = root; ! while (current != nil) ! { ! int comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else ! return current; ! } ! return current; ! } ! ! /** ! * Find the "highest" node which is < key. If key is nil, return last ! * node. Package visible for use by nested classes. ! * ! * @param key the upper bound, exclusive ! * @return the previous node ! */ ! final Node highestLessThan(Object key) { if (key == nil) return lastNode(); ! Node last = nil; Node current = root; int comparison = 0; *************** public class TreeMap extends AbstractMap *** 734,757 **** { last = current; comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else /* Exact match. */ ! return predecessor(last); } ! if (comparison <= 0) ! return predecessor(last); ! else ! return last; } ! // Find the "lowest" node which is >= key. If key is nil, return first node. ! private Node lowestGreaterThan(Object key) { if (key == nil) ! return firstNode(); Node last = nil; Node current = root; --- 976,1093 ---- { last = current; comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else // Exact match. ! return predecessor(last); } ! return comparison <= 0 ? predecessor(last) : last; } ! /** ! * Maintain red-black balance after inserting a new node. ! * ! * @param n the newly inserted node ! */ ! private void insertFixup(Node n) ! { ! // Only need to rebalance when parent is a RED node, and while at least ! // 2 levels deep into the tree (ie: node has a grandparent). Remember ! // that nil.color == BLACK. ! while (n.parent.color == RED && n.parent.parent != nil) ! { ! if (n.parent == n.parent.parent.left) ! { ! Node uncle = n.parent.parent.right; ! // Uncle may be nil, in which case it is BLACK. ! if (uncle.color == RED) ! { ! // Case 1. Uncle is RED: Change colors of parent, uncle, ! // and grandparent, and move n to grandparent. ! n.parent.color = BLACK; ! uncle.color = BLACK; ! uncle.parent.color = RED; ! n = uncle.parent; ! } ! else ! { ! if (n == n.parent.right) ! { ! // Case 2. Uncle is BLACK and x is right child. ! // Move n to parent, and rotate n left. ! n = n.parent; ! rotateLeft(n); ! } ! // Case 3. Uncle is BLACK and x is left child. ! // Recolor parent, grandparent, and rotate grandparent right. ! n.parent.color = BLACK; ! n.parent.parent.color = RED; ! rotateRight(n.parent.parent); ! } ! } ! else ! { ! // Mirror image of above code. ! Node uncle = n.parent.parent.left; ! // Uncle may be nil, in which case it is BLACK. ! if (uncle.color == RED) ! { ! // Case 1. Uncle is RED: Change colors of parent, uncle, ! // and grandparent, and move n to grandparent. ! n.parent.color = BLACK; ! uncle.color = BLACK; ! uncle.parent.color = RED; ! n = uncle.parent; ! } ! else ! { ! if (n == n.parent.left) ! { ! // Case 2. Uncle is BLACK and x is left child. ! // Move n to parent, and rotate n right. ! n = n.parent; ! rotateRight(n); ! } ! // Case 3. Uncle is BLACK and x is right child. ! // Recolor parent, grandparent, and rotate grandparent left. ! n.parent.color = BLACK; ! n.parent.parent.color = RED; ! rotateLeft(n.parent.parent); ! } ! } ! } ! root.color = BLACK; ! } ! ! /** ! * Returns the last sorted node in the map, or nil if empty. ! * ! * @return the last node ! */ ! private Node lastNode() ! { ! // Exploit fact that nil.right == nil. ! Node node = root; ! while (node.right != nil) ! node = node.right; ! return node; ! } ! ! /** ! * Find the "lowest" node which is >= key. If key is nil, return either ! * nil or the first node, depending on the parameter first. ! * Package visible for use by nested classes. ! * ! * @param key the lower bound, inclusive ! * @param first true to return the first element instead of nil for nil key ! * @return the next node ! */ ! final Node lowestGreaterThan(Object key, boolean first) { if (key == nil) ! return first ? firstNode() : nil; Node last = nil; Node current = root; *************** public class TreeMap extends AbstractMap *** 761,855 **** { last = current; comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else ! return current; } ! if (comparison > 0) ! return successor(last); ! else ! return last; ! } ! private void writeObject(ObjectOutputStream out) throws IOException { ! out.defaultWriteObject(); ! Node node = firstNode(); ! out.writeInt(size); ! ! while (node != nil) { ! out.writeObject(node.key); ! out.writeObject(node.value); ! node = successor(node); } } ! private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { ! in.defaultReadObject(); ! int size = in.readInt(); ! putFromObjStream(in, size, true); ! } ! private int compare(Object o1, Object o2) ! { ! if (comparator == null) ! return ((Comparable) o1).compareTo(o2); ! else ! return comparator.compare(o1, o2); } ! /* Return the node following Node, or nil if there isn't one. */ ! private Node successor(Node node) { ! if (node.right != nil) ! { ! node = node.right; ! while (node.left != nil) ! node = node.left; ! return node; ! } ! Node parent = node.parent; ! while (parent != nil && node == parent.right) { ! node = parent; ! parent = parent.parent; } - return parent; } ! /* Return the node preceeding Node, or nil if there isn't one. */ ! private Node predecessor(Node node) { ! if (node.left != nil) { ! node = node.left; ! while (node.right != nil) ! node = node.right; ! return node; } ! ! Node parent = node.parent; ! while (parent != nil && node == parent.left) { ! node = parent; ! parent = parent.parent; } ! return parent; } ! /** Rotate node n to the left. */ private void rotateLeft(Node node) { Node child = node.right; ! // Establish node.right link. node.right = child.left; if (child.left != nil) --- 1097,1272 ---- { last = current; comparison = compare(key, current.key); ! if (comparison > 0) ! current = current.right; ! else if (comparison < 0) ! current = current.left; ! else ! return current; } ! return comparison > 0 ? successor(last) : last; ! } ! /** ! * Return the node preceding the given one, or nil if there isn't one. ! * ! * @param node the current node, not nil ! * @return the prior node in sorted order ! */ ! private Node predecessor(Node node) { ! if (node.left != nil) ! { ! node = node.left; ! while (node.right != nil) ! node = node.right; ! return node; ! } ! Node parent = node.parent; ! // Exploit fact that nil.left == nil and node is non-nil. ! while (node == parent.left) { ! node = parent; ! parent = node.parent; } + return parent; } ! /** ! * Construct a tree from sorted keys in linear time. Package visible for ! * use by TreeSet. ! * ! * @param s the stream to read from ! * @param count the number of keys to read ! * @param readValue true to read values, false to insert "" as the value ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @see #readObject(ObjectInputStream) ! * @see TreeSet#readObject(ObjectInputStream) ! */ ! final void putFromObjStream(ObjectInputStream s, int count, ! boolean readValues) throws IOException, ClassNotFoundException { ! fabricateTree(count); ! Node node = firstNode(); ! while (--count >= 0) ! { ! node.key = s.readObject(); ! node.value = readValues ? s.readObject() : ""; ! node = successor(node); ! } } ! /** ! * Construct a tree from sorted keys in linear time, with values of "". ! * Package visible for use by TreeSet. ! * ! * @param keys the iterator over the sorted keys ! * @param count the number of nodes to insert ! * @see TreeSet#TreeSet(SortedSet) ! */ ! final void putKeysLinear(Iterator keys, int count) { ! fabricateTree(count); ! Node node = firstNode(); ! while (--count >= 0) { ! node.key = keys.next(); ! node.value = ""; ! node = successor(node); } } ! /** ! * Deserializes this object from the given stream. ! * ! * @param s the stream to read from ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @serialData the size (int), followed by key (Object) and value ! * (Object) pairs in sorted order ! */ ! private void readObject(ObjectInputStream s) ! throws IOException, ClassNotFoundException { ! s.defaultReadObject(); ! int size = s.readInt(); ! putFromObjStream(s, size, true); ! } ! ! /** ! * Remove node from tree. This will increment modCount and decrement size. ! * Node must exist in the tree. Package visible for use by nested classes. ! * ! * @param node the node to remove ! */ ! final void removeNode(Node node) ! { ! Node splice; ! Node child; ! ! modCount++; ! size--; ! ! // Find splice, the node at the position to actually remove from the tree. ! if (node.left == nil) { ! // Node to be deleted has 0 or 1 children. ! splice = node; ! child = node.right; } ! else if (node.right == nil) { ! // Node to be deleted has 1 child. ! splice = node; ! child = node.left; } ! else ! { ! // Node has 2 children. Splice is node's predecessor, and we swap ! // its contents into node. ! splice = node.left; ! while (splice.right != nil) ! splice = splice.right; ! child = splice.left; ! node.key = splice.key; ! node.value = splice.value; ! } ! ! // Unlink splice from the tree. ! Node parent = splice.parent; ! if (child != nil) ! child.parent = parent; ! if (parent == nil) ! { ! // Special case for 0 or 1 node remaining. ! root = child; ! return; ! } ! if (splice == parent.left) ! parent.left = child; ! else ! parent.right = child; ! ! if (splice.color == BLACK) ! deleteFixup(child, parent); } ! /** ! * Rotate node n to the left. ! * ! * @param node the node to rotate ! */ private void rotateLeft(Node node) { Node child = node.right; ! // if (node == nil || child == nil) ! // throw new InternalError(); ! // Establish node.right link. node.right = child.left; if (child.left != nil) *************** public class TreeMap extends AbstractMap *** 860,1190 **** if (node.parent != nil) { if (node == node.parent.left) ! node.parent.left = child; ! else ! node.parent.right = child; } else root = child; // Link n and child. child.left = node; ! if (node != nil) ! node.parent = child; } ! /** Rotate node n to the right. */ private void rotateRight(Node node) { Node child = node.left; ! // Establish node.left link. node.left = child.right; if (child.right != nil) child.right.parent = node; ! // Establish child->parent link. child.parent = node.parent; if (node.parent != nil) { if (node == node.parent.right) ! node.parent.right = child; ! else ! node.parent.left = child; } else root = child; ! // Link n and child. child.right = node; ! if (node != nil) ! node.parent = child; ! } ! ! /* Construct a tree from sorted keys in linear time. This is used to ! implement TreeSet's SortedSet constructor. */ ! void putKeysLinear(Iterator keys, int count) ! { ! fabricateTree(count); ! Node node = firstNode(); ! ! for (int i = 0; i < count; i++) ! { ! node.key = keys.next(); ! node.value = Boolean.TRUE; ! node = successor(node); ! } ! } ! ! /* As above, but load keys from an ObjectInputStream. Used by readObject() ! methods. If "readValues" is set, entry values will also be read from the ! stream. If not, only keys will be read. */ ! void putFromObjStream(ObjectInputStream in, int count, boolean readValues) ! throws IOException, ClassNotFoundException ! { ! fabricateTree(count); ! Node node = firstNode(); ! ! for (int i = 0; i < count; i++) ! { ! node.key = in.readObject(); ! if (readValues) ! node.value = in.readObject(); ! else ! node.value = Boolean.TRUE; ! node = successor(node); ! } ! } ! ! /* Construct a perfectly balanced tree consisting of n "blank" nodes. ! This permits a tree to be generated from pre-sorted input in linear ! time. */ ! private void fabricateTree(int count) ! { ! if (count == 0) ! return; ! // Calculate the (maximum) depth of the perfectly balanced tree. ! double ddepth = (Math.log (count + 1) / Math.log (2)); ! int maxdepth = (int) Math.ceil (ddepth); ! ! // The number of nodes which can fit in a perfectly-balanced tree of ! // height "depth - 1". ! int max = (int) Math.pow (2, maxdepth - 1) - 1; ! ! // Number of nodes which spill over into the deepest row of the tree. ! int overflow = (int) count - max; ! ! size = count; ! // Make the root node. ! root = new Node(null, null); ! root.parent = nil; ! root.left = nil; ! root.right = nil; ! ! Node row = root; ! for (int depth = 2; depth <= maxdepth; depth++) // each row ! { ! // Number of nodes at this depth ! int rowcap = (int) Math.pow (2, depth - 1); ! Node parent = row; ! Node last = null; ! ! // Actual number of nodes to create in this row ! int rowsize; ! if (depth == maxdepth) ! rowsize = overflow; ! else ! rowsize = rowcap; ! ! // The bottom most row of nodes is coloured red, as is every second row ! // going up, except the root node (row 1). I'm not sure if this is the ! // optimal configuration for the tree, but it seems logical enough. ! // We just need to honour the black-height and red-parent rules here. ! boolean colorRowRed = (depth % 2 == maxdepth % 2); ! ! int i; ! for (i = 1; i <= rowsize; i++) // each node in row ! { ! Node node = new Node(null, null); ! node.parent = parent; ! if (i % 2 == 1) ! parent.left = node; ! else ! { ! Node nextparent = parent.right; ! parent.right = node; ! parent = nextparent; ! } ! ! // We use the "right" link to maintain a chain of nodes in ! // each row until the parent->child links are established. ! if (last != null) ! last.right = node; ! last = node; ! ! if (colorRowRed) ! node.color = RED; ! ! if (i == 1) ! row = node; ! } ! ! // Set nil child pointers on leaf nodes. ! if (depth == maxdepth) ! { ! // leaf nodes at maxdepth-1. ! if (parent != null) ! { ! if (i % 2 == 0) ! { ! // Current "parent" has "left" set already. ! Node next = parent.right; ! parent.right = nil; ! parent = next; ! } ! while (parent != null) ! { ! parent.left = nil; ! Node next = parent.right; ! parent.right = nil; ! parent = next; ! } ! } ! // leaf nodes at maxdepth. ! Node node = row; ! Node next; ! while (node != null) ! { ! node.left = nil; ! next = node.right; ! node.right = nil; ! node = next; ! } ! } ! } ! } ! ! private class VerifyResult ! { ! int count; // Total number of nodes. ! int black; // Black height/depth. ! int maxdepth; // Maximum depth of branch. } ! /* Check that red-black properties are consistent for the tree. */ ! private void verifyTree() ! { ! if (root == nil) ! { ! System.err.println ("Verify: empty tree"); ! if (size != 0) ! verifyError (this, "no root node but size=" + size); ! return; ! } ! VerifyResult vr = verifySub (root); ! if (vr.count != size) ! { ! verifyError (this, "Tree size not consistent with actual nodes counted. " ! + "counted " + vr.count + ", size=" + size); ! System.exit(1); ! } ! System.err.println ("Verify: " + vr.count + " nodes, black height=" + vr.black ! + ", maxdepth=" + vr.maxdepth); ! } ! ! /* Recursive call to check that rbtree rules hold. Returns total node count ! and black height of the given branch. */ ! private VerifyResult verifySub(Node n) { ! VerifyResult vr1 = null; ! VerifyResult vr2 = null; ! ! if (n.left == nil && n.right == nil) ! { ! // leaf node ! VerifyResult r = new VerifyResult(); ! r.black = (n.color == BLACK ? 1 : 0); ! r.count = 1; ! r.maxdepth = 1; ! return r; ! } ! ! if (n.left != nil) { ! if (n.left.parent != n) ! verifyError(n.left, "Node's parent link does not point to " + n); ! ! if (n.color == RED && n.left.color == RED) ! verifyError(n, "Red node has red left child"); ! ! vr1 = verifySub (n.left); ! if (n.right == nil) ! { ! if (n.color == BLACK) ! vr1.black++; ! vr1.count++; ! vr1.maxdepth++; ! return vr1; ! } } ! if (n.right != nil) { ! if (n.right.parent != n) ! verifyError(n.right, "Node's parent link does not point to " + n); ! ! if (n.color == RED && n.right.color == RED) ! verifyError(n, "Red node has red right child"); ! ! vr2 = verifySub (n.right); ! if (n.left == nil) ! { ! if (n.color == BLACK) ! vr2.black++; ! vr2.count++; ! vr2.maxdepth++; ! return vr2; ! } } ! ! if (vr1.black != vr2.black) ! verifyError (n, "Black heights: " + vr1.black + "," + vr2.black + " don't match."); ! vr1.count += vr2.count + 1; ! vr1.maxdepth = Math.max(vr1.maxdepth, vr2.maxdepth) + 1; ! if (n.color == BLACK) ! vr1.black++; ! return vr1; } ! ! private void verifyError (Object obj, String msg) { ! System.err.print ("Verify error: "); ! try ! { ! System.err.print (obj); ! } ! catch (Exception x) { ! System.err.print ("(error printing obj): " + x); } - System.err.println(); - System.err.println (msg); - Thread.dumpStack(); - System.exit(1); } /** ! * Iterate over HashMap's entries. ! * This implementation is parameterized to give a sequential view of ! * keys, values, or entries. ! */ ! class TreeIterator implements Iterator { ! static final int ENTRIES = 0, ! KEYS = 1, ! VALUES = 2; ! ! // the type of this Iterator: KEYS, VALUES, or ENTRIES. ! int type; ! // the number of modifications to the backing Map that we know about. ! int knownMod = TreeMap.this.modCount; ! // The last Entry returned by a next() call. ! Node last; ! // The next entry that should be returned by next(). ! Node next; ! // The last node visible to this iterator. This is used when iterating ! // on a SubMap. ! Node max; ! /* Create Iterator with the supplied type: KEYS, VALUES, or ENTRIES */ TreeIterator(int type) { this.type = type; this.next = firstNode(); } ! ! /* Construct an interator for a SubMap. Iteration will begin at node ! "first", and stop when "max" is reached. */ TreeIterator(int type, Node first, Node max) { this.type = type; --- 1277,1422 ---- if (node.parent != nil) { if (node == node.parent.left) ! node.parent.left = child; ! else ! node.parent.right = child; } else root = child; // Link n and child. child.left = node; ! node.parent = child; } ! /** ! * Rotate node n to the right. ! * ! * @param node the node to rotate ! */ private void rotateRight(Node node) { Node child = node.left; ! // if (node == nil || child == nil) ! // throw new InternalError(); ! // Establish node.left link. node.left = child.right; if (child.right != nil) child.right.parent = node; ! // Establish child->parent link. child.parent = node.parent; if (node.parent != nil) { if (node == node.parent.right) ! node.parent.right = child; ! else ! node.parent.left = child; } else root = child; ! // Link n and child. child.right = node; ! node.parent = child; } ! /** ! * Return the node following the given one, or nil if there isn't one. ! * Package visible for use by nested classes. ! * ! * @param node the current node, not nil ! * @return the next node in sorted order ! */ ! final Node successor(Node node) { ! if (node.right != nil) { ! node = node.right; ! while (node.left != nil) ! node = node.left; ! return node; } ! Node parent = node.parent; ! // Exploit fact that nil.right == nil and node is non-nil. ! while (node == parent.right) { ! node = parent; ! parent = parent.parent; } ! return parent; } ! ! /** ! * Serializes this object to the given stream. ! * ! * @param s the stream to write to ! * @throws IOException if the underlying stream fails ! * @serialData the size (int), followed by key (Object) and value ! * (Object) pairs in sorted order ! */ ! private void writeObject(ObjectOutputStream s) throws IOException { ! s.defaultWriteObject(); ! ! Node node = firstNode(); ! s.writeInt(size); ! while (node != nil) { ! s.writeObject(node.key); ! s.writeObject(node.value); ! node = successor(node); } } /** ! * Iterate over HashMap's entries. This implementation is parameterized ! * to give a sequential view of keys, values, or entries. ! * ! * @author Eric Blake ! */ ! private final class TreeIterator implements Iterator { ! /** ! * The type of this Iterator: {@link #KEYS}, {@link #VALUES}, ! * or {@link #ENTRIES}. ! */ ! private final int type; ! /** The number of modifications to the backing Map that we know about. */ ! private int knownMod = modCount; ! /** The last Entry returned by a next() call. */ ! private Node last; ! /** The next entry that should be returned by next(). */ ! private Node next; ! /** ! * The last node visible to this iterator. This is used when iterating ! * on a SubMap. ! */ ! private final Node max; ! /** ! * Construct a new TreeIterator with the supplied type. ! * @param type {@link #KEYS}, {@link #VALUES}, or {@link #ENTRIES} ! */ TreeIterator(int type) { + // FIXME gcj cannot handle this. Bug java/4695 + // this(type, firstNode(), nil); this.type = type; this.next = firstNode(); + this.max = nil; } ! ! /** ! * Construct a new TreeIterator with the supplied type. Iteration will ! * be from "first" (inclusive) to "max" (exclusive). ! * ! * @param type {@link #KEYS}, {@link #VALUES}, or {@link #ENTRIES} ! * @param first where to start iteration, nil for empty iterator ! * @param max the cutoff for iteration, nil for all remaining nodes ! */ TreeIterator(int type, Node first, Node max) { this.type = type; *************** public class TreeMap extends AbstractMap *** 1192,1454 **** this.max = max; } public boolean hasNext() { ! if (knownMod != TreeMap.this.modCount) ! throw new ConcurrentModificationException(); ! return (next != nil); } public Object next() { ! if (next == nil) ! throw new NoSuchElementException(); ! if (knownMod != TreeMap.this.modCount) ! throw new ConcurrentModificationException(); ! Node n = next; - // Check limit in case we are iterating through a submap. - if (n != max) - next = successor(n); - else - next = nil; - - last = n; - if (type == VALUES) ! return n.value; else if (type == KEYS) ! return n.key; ! return n; } public void remove() { if (last == null) ! throw new IllegalStateException(); ! if (knownMod != TreeMap.this.modCount) ! throw new ConcurrentModificationException(); ! /* ! Object key = null; ! if (next != nil) ! key = next.key; ! */ ! TreeMap.this.removeNode(last); ! knownMod++; ! /* ! if (key != null) ! next = getNode(key); ! */ last = null; } ! } ! class SubMap extends AbstractMap implements SortedMap { ! Object minKey; ! Object maxKey; ! /* Create a SubMap representing the elements between minKey and maxKey ! (inclusive). If minKey is nil, SubMap has no lower bound (headMap). ! If maxKey is nil, the SubMap has no upper bound (tailMap). */ SubMap(Object minKey, Object maxKey) { this.minKey = minKey; this.maxKey = maxKey; } public void clear() { ! Node current; ! Node next = lowestGreaterThan(minKey); ! Node max = highestLessThan(maxKey); ! ! if (compare(next.key, max.key) > 0) ! // Nothing to delete. ! return; ! ! do { ! current = next; ! next = successor(current); ! remove(current); ! } ! while (current != max); } ! ! /* Check if "key" is in within the range bounds for this SubMap. ! The lower ("from") SubMap range is inclusive, and the upper (to) bound ! is exclusive. */ ! private boolean keyInRange(Object key) { ! return ((minKey == nil || compare(key, minKey) >= 0) ! && (maxKey == nil || compare(key, maxKey) < 0)); } public boolean containsKey(Object key) { ! return (keyInRange(key) && TreeMap.this.containsKey(key)); } public boolean containsValue(Object value) { ! Node node = lowestGreaterThan(minKey); ! Node max = highestLessThan(maxKey); ! Object currentVal; ! if (node == nil || max == nil || compare(node.key, max.key) > 0) ! // Nothing to search. ! return false; ! while (true) ! { ! currentVal = node.getValue(); ! if (value == null ? currentVal == null : value.equals (currentVal)) ! return true; ! if (node == max) ! return false; ! node = successor(node); ! } } ! public Object get(Object key) { ! if (keyInRange(key)) ! return TreeMap.this.get(key); ! return null; } ! public Object put(Object key, Object value) { if (keyInRange(key)) ! return TreeMap.this.put(key, value); ! else ! throw new IllegalArgumentException("Key outside range"); } ! public Object remove(Object key) { ! if (keyInRange(key)) ! return TreeMap.this.remove(key); ! else ! return null; } ! public int size() { ! Node node = lowestGreaterThan(minKey); ! Node max = highestLessThan(maxKey); ! ! if (node == nil || max == nil || compare(node.key, max.key) > 0) ! return 0; // Empty. ! ! int count = 1; ! while (node != max) { ! count++; ! node = successor(node); ! } ! ! return count; ! } ! public Set entrySet() ! { ! // Create an AbstractSet with custom implementations of those methods that ! // can be overriden easily and efficiently. ! return new AbstractSet() ! { ! public int size() ! { ! return SubMap.this.size(); ! } ! public Iterator iterator() ! { ! Node first = lowestGreaterThan(minKey); ! Node max = highestLessThan(maxKey); ! return new TreeIterator(TreeIterator.ENTRIES, first, max); ! } ! public void clear() ! { ! this.clear(); ! } ! public boolean contains(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Object key = me.getKey(); ! if (!keyInRange(key)) ! return false; ! Node n = getNode(key); ! return (n != nil && me.getValue().equals(n.value)); ! } ! public boolean remove(Object o) ! { ! if (!(o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Object key = me.getKey(); ! if (!keyInRange(key)) ! return false; ! Node n = getNode(key); ! if (n != nil && me.getValue().equals(n.value)) ! { ! removeNode(n); ! return true; ! } ! return false; ! } ! }; } ! public Comparator comparator() { ! return comparator; } ! public Object firstKey() { ! Node node = lowestGreaterThan(minKey); ! if (node == nil || !keyInRange(node.key)) ! throw new NoSuchElementException ("empty"); ! return node.key; } ! public Object lastKey() { ! Node node = highestLessThan(maxKey); ! if (node == nil || !keyInRange(node.key)) ! throw new NoSuchElementException ("empty"); ! return node.key; } public SortedMap subMap(Object fromKey, Object toKey) { ! if (!keyInRange(fromKey) || !keyInRange(toKey)) throw new IllegalArgumentException("key outside range"); ! ! return TreeMap.this.subMap(fromKey, toKey); } ! public SortedMap headMap(Object toKey) { ! if (!keyInRange(toKey)) throw new IllegalArgumentException("key outside range"); ! ! return TreeMap.this.subMap(minKey, toKey); } ! public SortedMap tailMap(Object fromKey) { ! if (!keyInRange(fromKey)) ! throw new IllegalArgumentException("key outside range"); ! return TreeMap.this.subMap(fromKey, maxKey); } ! } ! } --- 1424,1774 ---- this.max = max; } + /** + * Returns true if the Iterator has more elements. + * @return true if there are more elements + * @throws ConcurrentModificationException if the TreeMap was modified + */ public boolean hasNext() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! return next != max; } + /** + * Returns the next element in the Iterator's sequential view. + * @return the next element + * @throws ConcurrentModificationException if the TreeMap was modified + * @throws NoSuchElementException if there is none + */ public Object next() { ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! if (next == max) ! throw new NoSuchElementException(); ! last = next; ! next = successor(last); if (type == VALUES) ! return last.value; else if (type == KEYS) ! return last.key; ! return last; } + /** + * Removes from the backing TreeMap the last element which was fetched + * with the next() method. + * @throws ConcurrentModificationException if the TreeMap was modified + * @throws IllegalStateException if called when there is no last element + */ public void remove() { + if (knownMod != modCount) + throw new ConcurrentModificationException(); if (last == null) ! throw new IllegalStateException(); ! ! removeNode(last); last = null; + knownMod++; } ! } // class TreeIterator ! /** ! * Implementation of {@link #subMap(Object, Object)} and other map ! * ranges. This class provides a view of a portion of the original backing ! * map, and throws {@link IllegalArgumentException} for attempts to ! * access beyond that range. ! * ! * @author Eric Blake ! */ ! private final class SubMap extends AbstractMap implements SortedMap { ! /** ! * The lower range of this view, inclusive, or nil for unbounded. ! * Package visible for use by nested classes. ! */ ! final Object minKey; ! /** ! * The upper range of this view, exclusive, or nil for unbounded. ! * Package visible for use by nested classes. ! */ ! final Object maxKey; ! ! /** ! * The cache for {@link #entrySet()}. ! */ ! private Set entries; ! ! /** ! * Create a SubMap representing the elements between minKey (inclusive) ! * and maxKey (exclusive). If minKey is nil, SubMap has no lower bound ! * (headMap). If maxKey is nil, the SubMap has no upper bound (tailMap). ! * ! * @param minKey the lower bound ! * @param maxKey the upper bound ! * @throws IllegalArgumentException if minKey > maxKey ! */ SubMap(Object minKey, Object maxKey) { + if (minKey != nil && maxKey != nil && compare(minKey, maxKey) > 0) + throw new IllegalArgumentException("fromKey > toKey"); this.minKey = minKey; this.maxKey = maxKey; } + /** + * Check if "key" is in within the range bounds for this SubMap. The + * lower ("from") SubMap range is inclusive, and the upper ("to") bound + * is exclusive. Package visible for use by nested classes. + * + * @param key the key to check + * @return true if the key is in range + */ + final boolean keyInRange(Object key) + { + return ((minKey == nil || compare(key, minKey) >= 0) + && (maxKey == nil || compare(key, maxKey) < 0)); + } + public void clear() { ! Node next = lowestGreaterThan(minKey, true); ! Node max = lowestGreaterThan(maxKey, false); ! while (next != max) { ! Node current = next; ! next = successor(current); ! removeNode(current); ! } } ! ! public Comparator comparator() { ! return comparator; } public boolean containsKey(Object key) { ! return keyInRange(key) && TreeMap.this.containsKey(key); } public boolean containsValue(Object value) { ! Node node = lowestGreaterThan(minKey, true); ! Node max = lowestGreaterThan(maxKey, false); ! while (node != max) ! { ! if (equals(value, node.getValue())) ! return true; ! node = successor(node); ! } ! return false; ! } ! public Set entrySet() ! { ! if (entries == null) ! // Create an AbstractSet with custom implementations of those methods ! // that can be overriden easily and efficiently. ! entries = new AbstractSet() ! { ! public int size() ! { ! return SubMap.this.size(); ! } ! public Iterator iterator() ! { ! Node first = lowestGreaterThan(minKey, true); ! Node max = lowestGreaterThan(maxKey, false); ! return new TreeIterator(ENTRIES, first, max); ! } ! ! public void clear() ! { ! SubMap.this.clear(); ! } ! ! public boolean contains(Object o) ! { ! if (! (o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Object key = me.getKey(); ! if (! keyInRange(key)) ! return false; ! Node n = getNode(key); ! return n != nil && AbstractSet.equals(me.getValue(), n.value); ! } ! ! public boolean remove(Object o) ! { ! if (! (o instanceof Map.Entry)) ! return false; ! Map.Entry me = (Map.Entry) o; ! Object key = me.getKey(); ! if (! keyInRange(key)) ! return false; ! Node n = getNode(key); ! if (n != nil && AbstractSet.equals(me.getValue(), n.value)) ! { ! removeNode(n); ! return true; ! } ! return false; ! } ! }; ! return entries; } ! public Object firstKey() { ! Node node = lowestGreaterThan(minKey, true); ! if (node == nil || ! keyInRange(node.key)) ! throw new NoSuchElementException(); ! return node.key; } ! public Object get(Object key) { if (keyInRange(key)) ! return TreeMap.this.get(key); ! return null; } ! public SortedMap headMap(Object toKey) { ! if (! keyInRange(toKey)) ! throw new IllegalArgumentException("key outside range"); ! return new SubMap(minKey, toKey); } ! public Set keySet() { ! if (this.keys == null) ! // Create an AbstractSet with custom implementations of those methods ! // that can be overriden easily and efficiently. ! this.keys = new AbstractSet() { ! public int size() ! { ! return SubMap.this.size(); ! } ! public Iterator iterator() ! { ! Node first = lowestGreaterThan(minKey, true); ! Node max = lowestGreaterThan(maxKey, false); ! return new TreeIterator(KEYS, first, max); ! } ! public void clear() ! { ! SubMap.this.clear(); ! } ! public boolean contains(Object o) ! { ! if (! keyInRange(o)) ! return false; ! return getNode(o) != nil; ! } ! public boolean remove(Object o) ! { ! if (! keyInRange(o)) ! return false; ! Node n = getNode(o); ! if (n != nil) ! { ! removeNode(n); ! return true; ! } ! return false; ! } ! }; ! return this.keys; ! } ! public Object lastKey() ! { ! Node node = highestLessThan(maxKey); ! if (node == nil || ! keyInRange(node.key)) ! throw new NoSuchElementException(); ! return node.key; } ! public Object put(Object key, Object value) { ! if (! keyInRange(key)) ! throw new IllegalArgumentException("Key outside range"); ! return TreeMap.this.put(key, value); } ! public Object remove(Object key) { ! if (keyInRange(key)) ! return TreeMap.this.remove(key); ! return null; } ! public int size() { ! Node node = lowestGreaterThan(minKey, true); ! Node max = lowestGreaterThan(maxKey, false); ! int count = 0; ! while (node != max) ! { ! count++; ! node = successor(node); ! } ! return count; } public SortedMap subMap(Object fromKey, Object toKey) { ! if (! keyInRange(fromKey) || ! keyInRange(toKey)) throw new IllegalArgumentException("key outside range"); ! return new SubMap(fromKey, toKey); } ! public SortedMap tailMap(Object fromKey) { ! if (! keyInRange(fromKey)) throw new IllegalArgumentException("key outside range"); ! return new SubMap(fromKey, maxKey); } ! public Collection values() { ! if (this.values == null) ! // Create an AbstractCollection with custom implementations of those ! // methods that can be overriden easily and efficiently. ! this.values = new AbstractCollection() ! { ! public int size() ! { ! return SubMap.this.size(); ! } ! public Iterator iterator() ! { ! Node first = lowestGreaterThan(minKey, true); ! Node max = lowestGreaterThan(maxKey, false); ! return new TreeIterator(VALUES, first, max); ! } ! ! public void clear() ! { ! SubMap.this.clear(); ! } ! }; ! return this.keys; } ! } // class SubMap ! } // class TreeMap diff -Nrc3pad gcc-3.0.4/libjava/java/util/TreeSet.java gcc-3.1/libjava/java/util/TreeSet.java *** gcc-3.0.4/libjava/java/util/TreeSet.java Tue Mar 6 01:01:52 2001 --- gcc-3.1/libjava/java/util/TreeSet.java Tue Jan 22 22:40:39 2002 *************** *** 1,4 **** ! /* TreeSet.java -- a class providing a TreeMap-backet SortedSet Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,4 ---- ! /* TreeSet.java -- a class providing a TreeMap-backed SortedSet Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.io.ObjectInputStream; *** 33,88 **** import java.io.ObjectOutputStream; /** ! * This class provides a TreeMap-backed implementation of the ! * SortedSet interface. * ! * Each element in the Set is a key in the backing TreeMap; each key ! * maps to a static token, denoting that the key does, in fact, exist. * ! * Most operations are O(log n). * ! * TreeSet is a part of the JDK1.2 Collections API. * ! * @author Jon Zeppieri ! * @version $Revision: 1.3.2.2 $ ! * @modified $Id: TreeSet.java,v 1.3.2.2 2001/03/06 01:01:52 bryce Exp $ */ - public class TreeSet extends AbstractSet implements SortedSet, Cloneable, Serializable { ! /** The TreeMap which backs this Set */ ! transient SortedMap map; ! static final long serialVersionUID = -2479143000061671589L; /** ! * Construct a new TreeSet whose backing TreeMap using the "natural" ! * ordering of keys. */ public TreeSet() { map = new TreeMap(); } ! /** ! * Construct a new TreeSet whose backing TreeMap uses the supplied ! * Comparator. * ! * @param oComparator the Comparator this Set will use */ public TreeSet(Comparator comparator) { map = new TreeMap(comparator); } ! /** * Construct a new TreeSet whose backing TreeMap uses the "natural" * orering of the keys and which contains all of the elements in the ! * supplied Collection. * ! * @param oCollection the new Set will be initialized with all ! * of the elements in this Collection */ public TreeSet(Collection collection) { --- 44,134 ---- import java.io.ObjectOutputStream; /** ! * This class provides a TreeMap-backed implementation of the SortedSet ! * interface. The elements will be sorted according to their natural ! * order, or according to the provided Comparator.

          * ! * Most operations are O(log n), but there is so much overhead that this ! * makes small sets expensive. Note that the ordering must be consistent ! * with equals to correctly implement the Set interface. If this ! * condition is violated, the set is still well-behaved, but you may have ! * suprising results when comparing it to other sets.

          * ! * This implementation is not synchronized. If you need to share this between ! * multiple threads, do something like:
          ! * SortedSet s ! * = Collections.synchronizedSortedSet(new TreeSet(...));

          * ! * The iterators are fail-fast, meaning that any structural ! * modification, except for remove() called on the iterator ! * itself, cause the iterator to throw a ! * ConcurrentModificationException rather than exhibit ! * non-deterministic behavior. * ! * @author Jon Zeppieri ! * @author Bryce McKinlay ! * @author Eric Blake ! * @see Collection ! * @see Set ! * @see HashSet ! * @see LinkedHashSet ! * @see Comparable ! * @see Comparator ! * @see Collections#synchronizedSortedSet(SortedSet) ! * @see TreeMap ! * @since 1.2 ! * @status updated to 1.4 */ public class TreeSet extends AbstractSet implements SortedSet, Cloneable, Serializable { ! /** ! * Compatible with JDK 1.2. ! */ ! private static final long serialVersionUID = -2479143000061671589L; ! /** ! * The SortedMap which backs this Set. ! */ ! // Not final because of readObject. This will always be one of TreeMap or ! // TreeMap.SubMap, which both extend AbstractMap. ! private transient SortedMap map; /** ! * Construct a new TreeSet whose backing TreeMap using the "natural" ! * ordering of keys. Elements that are not mutually comparable will cause ! * ClassCastExceptions down the road. ! * ! * @see Comparable */ public TreeSet() { map = new TreeMap(); } ! /** ! * Construct a new TreeSet whose backing TreeMap uses the supplied ! * Comparator. Elements that are not mutually comparable will cause ! * ClassCastExceptions down the road. * ! * @param comparator the Comparator this Set will use */ public TreeSet(Comparator comparator) { map = new TreeMap(comparator); } ! /** * Construct a new TreeSet whose backing TreeMap uses the "natural" * orering of the keys and which contains all of the elements in the ! * supplied Collection. This runs in n*log(n) time. * ! * @param collection the new Set will be initialized with all ! * of the elements in this Collection ! * @throws ClassCastException if the elements of the collection are not ! * comparable ! * @throws NullPointerException if the collection is null ! * @see Comparable */ public TreeSet(Collection collection) { *************** public class TreeSet extends AbstractSet *** 95,148 **** * SortedSet and containing all of the elements in the supplied SortedSet. * This constructor runs in linear time. * ! * @param sortedSet the new TreeSet will use this SortedSet's ! * comparator and will initialize itself ! * with all of the elements in this SortedSet */ public TreeSet(SortedSet sortedSet) { ! TreeMap map = new TreeMap(sortedSet.comparator()); ! int i = 0; Iterator itr = sortedSet.iterator(); ! map.putKeysLinear(itr, sortedSet.size()); ! this.map = map; } ! ! /* This private constructor is used to implement the subSet() calls around ! a backing TreeMap.SubMap. */ ! TreeSet(SortedMap backingMap) { map = backingMap; } ! /** * Adds the spplied Object to the Set if it is not already in the Set; ! * returns true if the element is added, false otherwise * ! * @param obj the Object to be added to this Set */ public boolean add(Object obj) { ! return (map.put(obj, Boolean.TRUE) == null); } /** * Adds all of the elements in the supplied Collection to this TreeSet. * ! * @param c All of the elements in this Collection ! * will be added to the Set. ! * ! * @return true if the Set is altered, false otherwise */ public boolean addAll(Collection c) { boolean result = false; ! int size = c.size(); Iterator itr = c.iterator(); ! ! for (int i = 0; i < size; i++) ! result |= (map.put(itr.next(), Boolean.TRUE) == null); ! return result; } --- 141,197 ---- * SortedSet and containing all of the elements in the supplied SortedSet. * This constructor runs in linear time. * ! * @param sortedSet the new TreeSet will use this SortedSet's comparator ! * and will initialize itself with all its elements ! * @throws NullPointerException if sortedSet is null */ public TreeSet(SortedSet sortedSet) { ! map = new TreeMap(sortedSet.comparator()); Iterator itr = sortedSet.iterator(); ! ((TreeMap) map).putKeysLinear(itr, sortedSet.size()); } ! ! /** ! * This private constructor is used to implement the subSet() calls around ! * a backing TreeMap.SubMap. ! * ! * @param backingMap the submap ! */ ! private TreeSet(SortedMap backingMap) { map = backingMap; } ! /** * Adds the spplied Object to the Set if it is not already in the Set; ! * returns true if the element is added, false otherwise. * ! * @param obj the Object to be added to this Set ! * @throws ClassCastException if the element cannot be compared with objects ! * already in the set */ public boolean add(Object obj) { ! return map.put(obj, "") == null; } /** * Adds all of the elements in the supplied Collection to this TreeSet. * ! * @param c The collection to add ! * @return true if the Set is altered, false otherwise ! * @throws NullPointerException if c is null ! * @throws ClassCastException if an element in c cannot be compared with ! * objects already in the set */ public boolean addAll(Collection c) { boolean result = false; ! int pos = c.size(); Iterator itr = c.iterator(); ! while (--pos >= 0) ! result |= (map.put(itr.next(), "") == null); return result; } *************** public class TreeSet extends AbstractSet *** 154,290 **** map.clear(); } ! /** Returns a shallow copy of this Set. */ public Object clone() { TreeSet copy = null; try { copy = (TreeSet) super.clone(); } catch (CloneNotSupportedException x) ! { } - copy.map = (SortedMap) ((TreeMap) map).clone(); return copy; } ! /** Returns this Set's comparator */ public Comparator comparator() { return map.comparator(); } ! /** ! * Returns true if this Set contains the supplied Object, ! * false otherwise * ! * @param oObject the Object whose existence in the Set is ! * being tested */ public boolean contains(Object obj) { return map.containsKey(obj); } ! /** Returns true if this Set has size 0, false otherwise */ ! public boolean isEmpty() { ! return map.isEmpty(); } ! /** Returns the number of elements in this Set */ ! public int size() { ! return map.size(); } ! /** ! * If the supplied Object is in this Set, it is removed, and true is ! * returned; otherwise, false is returned. * ! * @param obj the Object we are attempting to remove ! * from this Set */ ! public boolean remove(Object obj) { ! return (map.remove(obj) != null); } ! /** Returns the first (by order) element in this Set */ ! public Object first() { ! return map.firstKey(); } ! /** Returns the last (by order) element in this Set */ public Object last() { return map.lastKey(); } /** ! * Returns a view of this Set including all elements in the interval ! * [oFromElement, oToElement). * ! * @param from the resultant view will contain all ! * elements greater than or equal to this element ! * @param to the resultant view will contain all ! * elements less than this element */ ! public SortedSet subSet(Object from, Object to) { ! return new TreeSet(map.subMap(from, to)); } /** ! * Returns a view of this Set including all elements less than oToElement * ! * @param toElement the resultant view will contain all ! * elements less than this element */ ! public SortedSet headSet(Object to) { ! return new TreeSet(map.headMap(to)); } /** ! * Returns a view of this Set including all elements greater than or ! * equal to oFromElement. * ! * @param from the resultant view will contain all ! * elements greater than or equal to this element */ ! public SortedSet tailSet(Object from) { ! return new TreeSet(map.tailMap(from)); } ! /** Returns in Iterator over the elements in this TreeSet */ ! public Iterator iterator() { ! return map.keySet().iterator(); } ! private void writeObject(ObjectOutputStream out) throws IOException { Iterator itr = map.keySet().iterator(); ! int size = map.size(); ! ! out.writeObject(map.comparator()); ! out.writeInt(size); ! ! for (int i = 0; i < size; i++) ! out.writeObject(itr.next()); } ! private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { ! Comparator comparator = (Comparator) in.readObject(); ! int size = in.readInt(); ! TreeMap map = new TreeMap(comparator); ! map.putFromObjStream(in, size, false); ! this.map = map; } } --- 203,416 ---- map.clear(); } ! /** ! * Returns a shallow copy of this Set. The elements are not cloned. ! * ! * @return the cloned set ! */ public Object clone() { TreeSet copy = null; try { copy = (TreeSet) super.clone(); + // Map may be either TreeMap or TreeMap.SubMap, hence the ugly casts. + copy.map = (SortedMap) ((AbstractMap) map).clone(); } catch (CloneNotSupportedException x) ! { ! // Impossible result. } return copy; } ! /** ! * Returns this Set's comparator. ! * ! * @return the comparator, or null if the set uses natural ordering ! */ public Comparator comparator() { return map.comparator(); } ! /** ! * Returns true if this Set contains the supplied Object, false otherwise. * ! * @param obj the Object to check for ! * @return true if it is in the set ! * @throws ClassCastException if obj cannot be compared with objects ! * already in the set */ public boolean contains(Object obj) { return map.containsKey(obj); } ! /** ! * Returns the first (by order) element in this Set. ! * ! * @return the first element ! * @throws NoSuchElementException if the set is empty ! */ ! public Object first() { ! return map.firstKey(); } ! /** ! * Returns a view of this Set including all elements less than ! * to. The returned set is backed by the original, so changes ! * in one appear in the other. The subset will throw an ! * {@link IllegalArgumentException} for any attempt to access or add an ! * element beyond the specified cutoff. The returned set does not include ! * the endpoint; if you want inclusion, pass the successor element. ! * ! * @param to the (exclusive) cutoff point ! * @return a view of the set less than the cutoff ! * @throws ClassCastException if to is not compatible with ! * the comparator (or is not Comparable, for natural ordering) ! * @throws NullPointerException if to is null, but the comparator does not ! * tolerate null elements ! */ ! public SortedSet headSet(Object to) { ! return new TreeSet(map.headMap(to)); } ! /** ! * Returns true if this Set has size 0, false otherwise. * ! * @return true if the set is empty */ ! public boolean isEmpty() { ! return map.isEmpty(); } ! /** ! * Returns in Iterator over the elements in this TreeSet, which traverses ! * in ascending order. ! * ! * @return an iterator ! */ ! public Iterator iterator() { ! return map.keySet().iterator(); } ! /** ! * Returns the last (by order) element in this Set. ! * ! * @return the last element ! * @throws NoSuchElementException if the set is empty ! */ public Object last() { return map.lastKey(); } /** ! * If the supplied Object is in this Set, it is removed, and true is ! * returned; otherwise, false is returned. * ! * @param obj the Object to remove from this Set ! * @return true if the set was modified ! * @throws ClassCastException if obj cannot be compared to set elements */ ! public boolean remove(Object obj) { ! return map.remove(obj) != null; } /** ! * Returns the number of elements in this Set * ! * @return the set size */ ! public int size() { ! return map.size(); } /** ! * Returns a view of this Set including all elements greater or equal to ! * from and less than to (a half-open interval). ! * The returned set is backed by the original, so changes in one appear in ! * the other. The subset will throw an {@link IllegalArgumentException} ! * for any attempt to access or add an element beyond the specified cutoffs. ! * The returned set includes the low endpoint but not the high; if you want ! * to reverse this behavior on either end, pass in the successor element. * ! * @param from the (inclusive) low cutoff point ! * @param to the (exclusive) high cutoff point ! * @return a view of the set between the cutoffs ! * @throws ClassCastException if either cutoff is not compatible with ! * the comparator (or is not Comparable, for natural ordering) ! * @throws NullPointerException if from or to is null, but the comparator ! * does not tolerate null elements ! * @throws IllegalArgumentException if from is greater than to */ ! public SortedSet subSet(Object from, Object to) { ! return new TreeSet(map.subMap(from, to)); } ! /** ! * Returns a view of this Set including all elements greater or equal to ! * from. The returned set is backed by the original, so ! * changes in one appear in the other. The subset will throw an ! * {@link IllegalArgumentException} for any attempt to access or add an ! * element beyond the specified cutoff. The returned set includes the ! * endpoint; if you want to exclude it, pass in the successor element. ! * ! * @param from the (inclusive) low cutoff point ! * @return a view of the set above the cutoff ! * @throws ClassCastException if from is not compatible with ! * the comparator (or is not Comparable, for natural ordering) ! * @throws NullPointerException if from is null, but the comparator ! * does not tolerate null elements ! */ ! public SortedSet tailSet(Object from) { ! return new TreeSet(map.tailMap(from)); } ! /** ! * Serializes this object to the given stream. ! * ! * @param s the stream to write to ! * @throws IOException if the underlying stream fails ! * @serialData the comparator (Object), followed by the set size ! * (int), the the elements in sorted order (Object) ! */ ! private void writeObject(ObjectOutputStream s) throws IOException { + s.defaultWriteObject(); Iterator itr = map.keySet().iterator(); ! int pos = map.size(); ! s.writeObject(map.comparator()); ! s.writeInt(pos); ! while (--pos >= 0) ! s.writeObject(itr.next()); } ! /** ! * Deserializes this object from the given stream. ! * ! * @param s the stream to read from ! * @throws ClassNotFoundException if the underlying stream fails ! * @throws IOException if the underlying stream fails ! * @serialData the comparator (Object), followed by the set size ! * (int), the the elements in sorted order (Object) ! */ ! private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { ! s.defaultReadObject(); ! Comparator comparator = (Comparator) s.readObject(); ! int size = s.readInt(); ! map = new TreeMap(comparator); ! ((TreeMap) map).putFromObjStream(s, size, false); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/Vector.java gcc-3.1/libjava/java/util/Vector.java *** gcc-3.0.4/libjava/java/util/Vector.java Sat Dec 2 04:13:52 2000 --- gcc-3.1/libjava/java/util/Vector.java Sun Apr 7 07:42:30 2002 *************** *** 1,5 **** /* Vector.java -- Class that provides growable arrays. ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Vector.java -- Class that provides growable arrays. ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; *************** import java.lang.reflect.Array; *** 30,80 **** import java.io.Serializable; /** ! * the Vector classes implements growable arrays of Objects. * You can access elements in a Vector with an index, just as you ! * can in a built in array, but Vectors can grow and shrink to accomodate ! * more or fewer objects. * * Vectors try to mantain efficiency in growing by having a ! * capacityIncrement that can be specified at instantiation. * When a Vector can no longer hold a new Object, it grows by the amount ! * in capacityIncrement. * ! * Vector implements the JDK 1.2 List interface, and is therefor a fully ! * compliant Collection object. * - * @specnote The JCL claims that various methods in this class throw - * IndexOutOfBoundsException, which would be consistent with other collections - * classes. ArrayIndexOutOfBoundsException is actually thrown, per the online - * docs, even for List method implementations. - * * @author Scott G. Miller */ ! public class Vector extends AbstractList ! implements List, Cloneable, Serializable { /** ! * The amount the Vector's internal array should be increased in size when ! * a new element is added that exceeds the current size of the array, ! * or when {@link #ensureCapacity} is called. ! * @serial */ ! protected int capacityIncrement = 0; /** * The number of elements currently in the vector, also returned by * {@link #size}. ! * @serial */ ! protected int elementCount = 0; /** ! * The internal array used to hold members of a Vector ! * @serial */ ! protected Object[] elementData; ! ! private static final long serialVersionUID = -2767605614048989439L; /** * Constructs an empty vector with an initial size of 10, and --- 41,113 ---- import java.io.Serializable; /** ! * The Vector classes implements growable arrays of Objects. * You can access elements in a Vector with an index, just as you ! * can in a built in array, but Vectors can grow and shrink to accommodate ! * more or fewer objects.

          * * Vectors try to mantain efficiency in growing by having a ! * capacityIncrement that can be specified at instantiation. * When a Vector can no longer hold a new Object, it grows by the amount ! * in capacityIncrement. If this value is 0, the vector doubles in ! * size.

          * ! * Vector implements the JDK 1.2 List interface, and is therefore a fully ! * compliant Collection object. The iterators are fail-fast - if external ! * code structurally modifies the vector, any operation on the iterator will ! * then throw a {@link ConcurrentModificationException}. The Vector class is ! * fully synchronized, but the iterators are not. So, when iterating over a ! * vector, be sure to synchronize on the vector itself. If you don't want the ! * expense of synchronization, use ArrayList instead. On the other hand, the ! * Enumeration of elements() is not thread-safe, nor is it fail-fast; so it ! * can lead to undefined behavior even in a single thread if you modify the ! * vector during iteration.

          ! * ! * Note: Some methods, especially those specified by List, specify throwing ! * {@link IndexOutOfBoundsException}, but it is easier to implement by ! * throwing the subclass {@link ArrayIndexOutOfBoundsException}. Others ! * directly specify this subclass. * * @author Scott G. Miller + * @author Bryce McKinlay + * @author Eric Blake + * @see Collection + * @see List + * @see ArrayList + * @see LinkedList + * @since 1.0 + * @status updated to 1.4 */ ! public class Vector extends AbstractList ! implements List, RandomAccess, Cloneable, Serializable { /** ! * Compatible with JDK 1.0+. */ ! private static final long serialVersionUID = -2767605614048989439L; ! ! /** ! * The internal array used to hold members of a Vector. The elements are ! * in positions 0 through elementCount - 1, and all remaining slots are null. ! * @serial the elements ! */ ! protected Object[] elementData; /** * The number of elements currently in the vector, also returned by * {@link #size}. ! * @serial the size */ ! protected int elementCount; /** ! * The amount the Vector's internal array should be increased in size when ! * a new element is added that exceeds the current size of the array, ! * or when {@link #ensureCapacity} is called. If <= 0, the vector just ! * doubles in size. ! * @serial the amount to grow the vector by */ ! protected int capacityIncrement; /** * Constructs an empty vector with an initial size of 10, and *************** public class Vector extends AbstractList *** 82,117 **** */ public Vector() { ! this(10); } /** * Constructs a vector containing the contents of Collection, in the ! * order given by the collection * ! * @param c A collection of elements to be added to the newly constructed ! * vector */ public Vector(Collection c) { ! int csize = c.size(); ! elementData = new Object[csize]; ! elementCount = csize; ! Iterator itr = c.iterator(); ! for (int i = 0; i < csize; i++) ! { ! elementData[i] = itr.next(); ! } } /** ! * Constructs a Vector with the initial capacity and capacity ! * increment specified * ! * @param initialCapacity The initial size of the Vector's internal ! * array ! * @param capacityIncrement The amount the internal array should be ! * increased if necessary */ public Vector(int initialCapacity, int capacityIncrement) { --- 115,145 ---- */ public Vector() { ! this(10, 0); } /** * Constructs a vector containing the contents of Collection, in the ! * order given by the collection. * ! * @param c collection of elements to add to the new vector ! * @throws NullPointerException if c is null ! * @since 1.2 */ public Vector(Collection c) { ! elementCount = c.size(); ! elementData = c.toArray(new Object[elementCount]); } /** ! * Constructs a Vector with the initial capacity and capacity ! * increment specified. * ! * @param initialCapacity the initial size of the Vector's internal array ! * @param capacityIncrement the amount the internal array should be ! * increased by when necessary, 0 to double the size ! * @throws IllegalArgumentException if initialCapacity < 0 */ public Vector(int initialCapacity, int capacityIncrement) { *************** public class Vector extends AbstractList *** 122,158 **** } /** ! * Constructs a Vector with the initial capacity specified * ! * @param initialCapacity The initial size of the Vector's internal array */ public Vector(int initialCapacity) { ! if (initialCapacity < 0) ! throw new IllegalArgumentException(); ! elementData = new Object[initialCapacity]; } /** ! * Copies the contents of a provided array into the Vector. If the ! * array is too large to fit in the Vector, an ArrayIndexOutOfBoundsException ! * is thrown. Old elements in the Vector are overwritten by the new ! * elements * ! * @param anArray An array from which elements will be copied into the Vector ! * ! * @throws ArrayIndexOutOfBoundsException the array being copied ! * is larger than the Vectors internal data array */ ! public synchronized void copyInto(Object[] anArray) { ! System.arraycopy(elementData, 0, anArray, 0, elementCount); } /** * Trims the Vector down to size. If the internal data array is larger * than the number of Objects its holding, a new array is constructed ! * that precisely holds the elements. */ public synchronized void trimToSize() { --- 150,186 ---- } /** ! * Constructs a Vector with the initial capacity specified, and a capacity ! * increment of 0 (double in size). * ! * @param initialCapacity the initial size of the Vector's internal array ! * @throws IllegalArgumentException if initialCapacity < 0 */ public Vector(int initialCapacity) { ! this(initialCapacity, 0); } /** ! * Copies the contents of a provided array into the Vector. If the ! * array is too large to fit in the Vector, an IndexOutOfBoundsException ! * is thrown without modifying the array. Old elements in the Vector are ! * overwritten by the new elements. * ! * @param a target array for the copy ! * @throws IndexOutOfBoundsException the array is not large enough ! * @throws NullPointerException the array is null ! * @see #toArray(Object[]) */ ! public synchronized void copyInto(Object[] a) { ! System.arraycopy(elementData, 0, a, 0, elementCount); } /** * Trims the Vector down to size. If the internal data array is larger * than the number of Objects its holding, a new array is constructed ! * that precisely holds the elements. Otherwise this does nothing. */ public synchronized void trimToSize() { *************** public class Vector extends AbstractList *** 166,233 **** } /** ! * Ensures that minCapacity elements can fit within this Vector. ! * If it cannot hold this many elements, the internal data array is expanded ! * in the following manner. If the current size plus the capacityIncrement ! * is sufficient, the internal array is expanded by capacityIncrement. ! * If capacityIncrement is non-positive, the size is doubled. If ! * neither is sufficient, the internal array is expanded to size minCapacity * ! * @param minCapacity The minimum capacity the internal array should be ! * able to handle after executing this method */ public synchronized void ensureCapacity(int minCapacity) { if (elementData.length >= minCapacity) return; ! int newCapacity; if (capacityIncrement <= 0) newCapacity = elementData.length * 2; else newCapacity = elementData.length + capacityIncrement; ! Object[] newArray = new Object[Math.max(newCapacity, minCapacity)]; ! System.arraycopy(elementData, 0, newArray, 0, elementData.length); elementData = newArray; } /** ! * Explicitly sets the size of the internal data array, copying the ! * old values to the new internal array. If the new array is smaller ! * than the old one, old values that don't fit are lost. If the new size ! * is larger than the old one, the vector is padded with null entries. * * @param newSize The new size of the internal array */ public synchronized void setSize(int newSize) { modCount++; ! Object[] newArray = new Object[newSize]; ! System.arraycopy(elementData, 0, newArray, 0, ! Math.min(newSize, elementCount)); elementCount = newSize; - elementData = newArray; } /** * Returns the size of the internal data array (not the amount of elements ! * contained in the Vector) * ! * @returns capacity of the internal data array */ ! public int capacity() { return elementData.length; } /** ! * Returns the number of elements stored in this Vector * ! * @returns the number of elements in this Vector */ ! public int size() { return elementCount; } --- 194,263 ---- } /** ! * Ensures that minCapacity elements can fit within this Vector. ! * If elementData is too small, it is expanded as follows: ! * If the elementCount + capacityIncrement is adequate, that ! * is the new size. If capacityIncrement is non-zero, the ! * candidate size is double the current. If that is not enough, the new ! * size is minCapacity. * ! * @param minCapacity the desired minimum capacity, negative values ignored */ public synchronized void ensureCapacity(int minCapacity) { if (elementData.length >= minCapacity) return; ! int newCapacity; if (capacityIncrement <= 0) newCapacity = elementData.length * 2; else newCapacity = elementData.length + capacityIncrement; ! Object[] newArray = new Object[Math.max(newCapacity, minCapacity)]; ! System.arraycopy(elementData, 0, newArray, 0, elementCount); elementData = newArray; } /** ! * Explicitly sets the size of the vector (but not necessarily the size of ! * the internal data array). If the new size is smaller than the old one, ! * old values that don't fit are lost. If the new size is larger than the ! * old one, the vector is padded with null entries. * * @param newSize The new size of the internal array + * @throws ArrayIndexOutOfBoundsException if the new size is negative */ public synchronized void setSize(int newSize) { + // Don't bother checking for the case where size() == the capacity of the + // vector since that is a much less likely case; it's more efficient to + // not do the check and lose a bit of performance in that infrequent case modCount++; ! ensureCapacity(newSize); ! if (newSize < elementCount) ! Arrays.fill(elementData, newSize, elementCount, null); elementCount = newSize; } /** * Returns the size of the internal data array (not the amount of elements ! * contained in the Vector). * ! * @return capacity of the internal data array */ ! public synchronized int capacity() { return elementData.length; } /** ! * Returns the number of elements stored in this Vector. * ! * @return the number of elements in this Vector */ ! public synchronized int size() { return elementCount; } *************** public class Vector extends AbstractList *** 235,319 **** /** * Returns true if this Vector is empty, false otherwise * ! * @returns true if the Vector is empty, false otherwise */ ! public boolean isEmpty() { return elementCount == 0; } /** ! * Searches the vector starting at index for object elem ! * and returns the index of the first occurence of this Object. If ! * the object is not found, -1 is returned * ! * @param e The Object to search for ! * @param index Start searching at this index ! * @returns The index of the first occurence of elem, or -1 ! * if it is not found */ ! public synchronized int indexOf(Object e, int index) { ! for (int i = index; i < elementCount; i++) { ! if (e == null ? elementData[i] == null : e.equals(elementData[i])) ! return i; } ! return -1; } /** ! * Returns the first occurence of elem in the Vector, or -1 if ! * elem is not found. * ! * @param elem The object to search for ! * @returns The index of the first occurence of elem or -1 if ! * not found */ ! public int indexOf(Object elem) { ! return indexOf(elem, 0); } /** ! * Returns true if elem is contained in this Vector, false otherwise. * ! * @param elem The element to check ! * @returns true if the object is contained in this Vector, false otherwise */ ! public boolean contains(Object elem) { ! return indexOf(elem, 0) != -1; } /** ! * Returns the index of the first occurence of elem, when searching ! * backwards from index. If the object does not occur in this Vector, ! * -1 is returned. * ! * @param eThe object to search for ! * @param index The index to start searching in reverse from ! * @returns The index of the Object if found, -1 otherwise */ ! public synchronized int lastIndexOf(Object e, int index) { ! if (index >= elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); ! ! for (int i = index; i >= 0; i--) ! { ! if (e == null ? elementData[i] == null : e.equals(elementData[i])) ! return i; ! } return -1; } /** ! * Returns the last index of elem within this Vector, or -1 ! * if the object is not within the Vector * ! * @param elem The object to search for ! * @returns the last index of the object, or -1 if not found */ public int lastIndexOf(Object elem) { --- 265,353 ---- /** * Returns true if this Vector is empty, false otherwise * ! * @return true if the Vector is empty, false otherwise */ ! public synchronized boolean isEmpty() { return elementCount == 0; } /** ! * Returns an Enumeration of the elements of this Vector. The enumeration ! * visits the elements in increasing index order, but is NOT thread-safe. * ! * @return an Enumeration ! * @see #iterator() */ ! // No need to synchronize as the Enumeration is not thread-safe! ! public Enumeration elements() { ! return new Enumeration() ! { ! private int i = 0; ! ! public boolean hasMoreElements() { ! return i < elementCount; } ! ! public Object nextElement() ! { ! if (i >= elementCount) ! throw new NoSuchElementException(); ! return elementData[i++]; ! } ! }; } /** ! * Returns true when elem is contained in this Vector. * ! * @param elem the element to check ! * @return true if the object is contained in this Vector, false otherwise */ ! public boolean contains(Object elem) { ! return indexOf(elem, 0) >= 0; } /** ! * Returns the first occurrence of elem in the Vector, or -1 if ! * elem is not found. * ! * @param elem the object to search for ! * @return the index of the first occurrence, or -1 if not found */ ! public int indexOf(Object elem) { ! return indexOf(elem, 0); } /** ! * Searches the vector starting at index for object ! * elem and returns the index of the first occurrence of this ! * Object. If the object is not found, or index is larger than the size ! * of the vector, -1 is returned. * ! * @param e the Object to search for ! * @param index start searching at this index ! * @return the index of the next occurrence, or -1 if it is not found ! * @throws IndexOutOfBoundsException if index < 0 */ ! public synchronized int indexOf(Object e, int index) { ! for (int i = index; i < elementCount; i++) ! if (equals(e, elementData[i])) ! return i; return -1; } /** ! * Returns the last index of elem within this Vector, or -1 ! * if the object is not within the Vector. * ! * @param elem the object to search for ! * @return the last index of the object, or -1 if not found */ public int lastIndexOf(Object elem) { *************** public class Vector extends AbstractList *** 321,349 **** } /** ! * Returns the Object stored at index. If index is out of range ! * an ArrayIndexOutOfBoundsException is thrown. * * @param index the index of the Object to retrieve ! * @returns The object at index ! * @throws ArrayIndexOutOfBoundsException index is ! * larger than the Vector */ public synchronized Object elementAt(int index) { ! //Within the bounds of this Vector does not necessarily mean within ! //the bounds of the internal array ! if (index >= elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); ! return elementData[index]; } /** ! * Returns the first element in the Vector. If there is no first Object ! * (The vector is empty), a NoSuchElementException is thrown. * ! * @returns The first Object in the Vector * @throws NoSuchElementException the Vector is empty */ public synchronized Object firstElement() --- 355,396 ---- } /** ! * Returns the index of the first occurrence of elem, when ! * searching backwards from index. If the object does not ! * occur in this Vector, or index is less than 0, -1 is returned. ! * ! * @param e the object to search for ! * @param index the index to start searching in reverse from ! * @return the index of the Object if found, -1 otherwise ! * @throws IndexOutOfBoundsException if index >= size() ! */ ! public synchronized int lastIndexOf(Object e, int index) ! { ! checkBoundExclusive(index); ! for (int i = index; i >= 0; i--) ! if (equals(e, elementData[i])) ! return i; ! return -1; ! } ! ! /** ! * Returns the Object stored at index. * * @param index the index of the Object to retrieve ! * @return the object at index ! * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() ! * @see #get(int) */ public synchronized Object elementAt(int index) { ! checkBoundExclusive(index); return elementData[index]; } /** ! * Returns the first element (index 0) in the Vector. * ! * @return the first Object in the Vector * @throws NoSuchElementException the Vector is empty */ public synchronized Object firstElement() *************** public class Vector extends AbstractList *** 351,364 **** if (elementCount == 0) throw new NoSuchElementException(); ! return elementAt(0); } /** ! * Returns the last element in the Vector. If the Vector has no last element ! * (The vector is empty), a NoSuchElementException is thrown. * ! * @returns The last Object in the Vector * @throws NoSuchElementException the Vector is empty */ public synchronized Object lastElement() --- 398,410 ---- if (elementCount == 0) throw new NoSuchElementException(); ! return elementData[0]; } /** ! * Returns the last element in the Vector. * ! * @return the last Object in the Vector * @throws NoSuchElementException the Vector is empty */ public synchronized Object lastElement() *************** public class Vector extends AbstractList *** 366,460 **** if (elementCount == 0) throw new NoSuchElementException(); ! return elementAt(elementCount - 1); ! } ! ! /** ! * Places obj at index within the Vector. If index ! * refers to an index outside the Vector, an ArrayIndexOutOfBoundsException ! * is thrown. ! * ! * @param obj The object to store ! * @param index The position in the Vector to store the object ! * @throws ArrayIndexOutOfBoundsException the index is out of range ! */ ! public synchronized void setElementAt(Object obj, int index) ! { ! if (index >= elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); ! ! elementData[index] = obj; } /** ! * Puts element into the Vector at position index and returns ! * the Object that previously occupied that position. * ! * @param index The index within the Vector to place the Object ! * @param element The Object to store in the Vector ! * @returns The previous object at the specified index * @throws ArrayIndexOutOfBoundsException the index is out of range ! * */ ! public synchronized Object set(int index, Object element) { ! if (index >= elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); ! ! Object temp = elementData[index]; ! elementData[index] = element; ! return temp; } /** ! * Removes the element at index, and shifts all elements at ! * positions greater than index to their index - 1. * ! * @param index The index of the element to remove */ ! public synchronized void removeElementAt(int index) { ! if (index >= elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); ! ! modCount++; ! elementCount--; ! if (index < elementCount) ! System.arraycopy(elementData, index + 1, elementData, index, ! elementCount - index); ! //Delete the last element (which has been copied back one index) ! //so it can be garbage collected; ! elementData[elementCount] = null; } /** ! * Inserts a new element into the Vector at index. Any elements * at or greater than index are shifted up one position. * ! * @param obj The object to insert ! * @param index The index at which the object is inserted */ ! public void insertElementAt(Object obj, int index) { ! if (index > elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " > " + elementCount); ! if (elementCount == elementData.length) ensureCapacity(elementCount + 1); ! ++modCount; ! ++elementCount; System.arraycopy(elementData, index, elementData, index + 1, ! elementCount - 1 - index); elementData[index] = obj; } /** ! * Adds an element to the Vector at the end of the Vector. If the vector ! * cannot hold the element with its present capacity, its size is increased ! * based on the same rules followed if ensureCapacity was called with the ! * argument currentSize+1. * ! * @param obj The object to add to the Vector */ public synchronized void addElement(Object obj) { --- 412,472 ---- if (elementCount == 0) throw new NoSuchElementException(); ! return elementData[elementCount - 1]; } /** ! * Changes the element at index to be obj * ! * @param obj the object to store ! * @param index the position in the Vector to store the object * @throws ArrayIndexOutOfBoundsException the index is out of range ! * @see #set(int, Object) */ ! public void setElementAt(Object obj, int index) { ! set(index, obj); } /** ! * Removes the element at index, and shifts all elements at ! * positions greater than index to their index - 1. * ! * @param index the index of the element to remove ! * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size(); ! * @see #remove(int) */ ! public void removeElementAt(int index) { ! remove(index); } /** ! * Inserts a new element into the Vector at index. Any elements * at or greater than index are shifted up one position. * ! * @param obj the object to insert ! * @param index the index at which the object is inserted ! * @throws ArrayIndexOutOfBoundsException index < 0 || index > size() ! * @see #add(int, Object) */ ! public synchronized void insertElementAt(Object obj, int index) { ! checkBoundInclusive(index); if (elementCount == elementData.length) ensureCapacity(elementCount + 1); ! modCount++; System.arraycopy(elementData, index, elementData, index + 1, ! elementCount - index); ! elementCount++; elementData[index] = obj; } /** ! * Adds an element to the Vector at the end of the Vector. The vector ! * is increased by ensureCapacity(size() + 1) if needed. * ! * @param obj the object to add to the Vector */ public synchronized void addElement(Object obj) { *************** public class Vector extends AbstractList *** 465,484 **** } /** ! * Removes the first occurence of the given object from the Vector. ! * If such a remove was performed (the object was found), true is returned. ! * If there was no such object, false is returned. * ! * @param obj The object to remove from the Vector ! * @returns true if the Object was in the Vector, false otherwise */ public synchronized boolean removeElement(Object obj) { ! int idx = indexOf(obj); ! if (idx != -1) { ! removeElementAt(idx); ! return true; } return false; } --- 477,497 ---- } /** ! * Removes the first (the lowestindex) occurance of the given object from ! * the Vector. If such a remove was performed (the object was found), true ! * is returned. If there was no such object, false is returned. * ! * @param obj the object to remove from the Vector ! * @return true if the Object was in the Vector, false otherwise ! * @see #remove(Object) */ public synchronized boolean removeElement(Object obj) { ! int idx = indexOf(obj, 0); ! if (idx >= 0) { ! remove(idx); ! return true; } return false; } *************** public class Vector extends AbstractList *** 486,531 **** /** * Removes all elements from the Vector. Note that this does not * resize the internal data array. */ public synchronized void removeAllElements() { - modCount++; if (elementCount == 0) return; ! for (int i = elementCount - 1; i >= 0; --i) ! { ! elementData[i] = null; ! } elementCount = 0; } /** ! * Creates a new Vector with the same contents as this one. */ public synchronized Object clone() { try { ! Vector clone = (Vector) super.clone(); ! clone.elementData = (Object[]) elementData.clone(); ! return clone; } catch (CloneNotSupportedException ex) { ! throw new InternalError(ex.toString()); } } /** * Returns an Object array with the contents of this Vector, in the order ! * they are stored within this Vector. Note that the Object array returned ! * is not the internal data array, and that it holds only the elements ! * within the Vector. This is similar to creating a new Object[] with the * size of this Vector, then calling Vector.copyInto(yourArray). * ! * @returns An Object[] containing the contents of this Vector in order ! * */ public synchronized Object[] toArray() { --- 499,547 ---- /** * Removes all elements from the Vector. Note that this does not * resize the internal data array. + * + * @see #clear() */ public synchronized void removeAllElements() { if (elementCount == 0) return; ! modCount++; ! Arrays.fill(elementData, 0, elementCount, null); elementCount = 0; } /** ! * Creates a new Vector with the same contents as this one. The clone is ! * shallow; elements are not cloned. ! * ! * @return the clone of this vector */ public synchronized Object clone() { try { ! Vector clone = (Vector) super.clone(); ! clone.elementData = (Object[]) elementData.clone(); ! return clone; } catch (CloneNotSupportedException ex) { ! // Impossible to get here. ! throw new InternalError(ex.toString()); } } /** * Returns an Object array with the contents of this Vector, in the order ! * they are stored within this Vector. Note that the Object array returned ! * is not the internal data array, and that it holds only the elements ! * within the Vector. This is similar to creating a new Object[] with the * size of this Vector, then calling Vector.copyInto(yourArray). * ! * @return an Object[] containing the contents of this Vector in order ! * @since 1.2 */ public synchronized Object[] toArray() { *************** public class Vector extends AbstractList *** 535,610 **** } /** ! * Returns an array containing the contents of this Vector. * If the provided array is large enough, the contents are copied ! * into that array, and a null is placed in the position size(). * In this manner, you can obtain the size of a Vector by the position ! * of the null element. If the type of the provided array cannot ! * hold the elements, an ArrayStoreException is thrown. ! * ! * If the provided array is not large enough, ! * a new one is created with the contents of the Vector, and no null ! * element. The new array is of the same runtime type as the provided ! * array. ! * * ! * @param array An array to copy the Vector into if large enough ! * @returns An array with the contents of this Vector in order * @throws ArrayStoreException the runtime type of the provided array ! * cannot hold the elements of the Vector */ ! public synchronized Object[] toArray(Object[] array) { ! if (array.length < elementCount) ! array = (Object[]) Array.newInstance(array.getClass().getComponentType(), ! elementCount); ! else if (array.length > elementCount) ! array[elementCount] = null; ! System.arraycopy(elementData, 0, array, 0, elementCount); ! return array; } /** ! * Returns the element at position index * * @param index the position from which an element will be retrieved ! * @throws ArrayIndexOutOfBoundsException the index is not within the ! * range of the Vector */ ! public synchronized Object get(int index) { return elementAt(index); } /** ! * Removes the given Object from the Vector. If it exists, true ! * is returned, if not, false is returned. * ! * @param o The object to remove from the Vector ! * @returns true if the Object existed in the Vector, false otherwise */ ! public boolean remove(Object o) { ! return removeElement(o); } /** * Adds an object to the Vector. * ! * @param o The element to add to the Vector */ ! public synchronized boolean add(Object o) { addElement(o); return true; } /** * Adds an object at the specified index. Elements at or above * index are shifted up one position. * ! * @param index The index at which to add the element ! * @param element The element to add to the Vector */ public void add(int index, Object element) { --- 551,647 ---- } /** ! * Returns an array containing the contents of this Vector. * If the provided array is large enough, the contents are copied ! * into that array, and a null is placed in the position size(). * In this manner, you can obtain the size of a Vector by the position ! * of the null element, if you know the vector does not itself contain ! * null entries. If the array is not large enough, reflection is used ! * to create a bigger one of the same runtime type. * ! * @param a an array to copy the Vector into if large enough ! * @return an array with the contents of this Vector in order * @throws ArrayStoreException the runtime type of the provided array ! * cannot hold the elements of the Vector ! * @throws NullPointerException if a is null ! * @since 1.2 */ ! public synchronized Object[] toArray(Object[] a) { ! if (a.length < elementCount) ! a = (Object[]) Array.newInstance(a.getClass().getComponentType(), ! elementCount); ! else if (a.length > elementCount) ! a[elementCount] = null; ! System.arraycopy(elementData, 0, a, 0, elementCount); ! return a; } /** ! * Returns the element at position index. * * @param index the position from which an element will be retrieved ! * @return the element at that position ! * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() ! * @since 1.2 */ ! public Object get(int index) { return elementAt(index); } /** ! * Puts element into the Vector at position index ! * and returns the Object that previously occupied that position. * ! * @param index the index within the Vector to place the Object ! * @param element the Object to store in the Vector ! * @return the previous object at the specified index ! * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() ! * @since 1.2 */ ! public synchronized Object set(int index, Object element) { ! checkBoundExclusive(index); ! Object temp = elementData[index]; ! elementData[index] = element; ! return temp; } /** * Adds an object to the Vector. * ! * @param o the element to add to the Vector ! * @return true, as specified by List ! * @since 1.2 */ ! public boolean add(Object o) { addElement(o); return true; } /** + * Removes the given Object from the Vector. If it exists, true + * is returned, if not, false is returned. + * + * @param o the object to remove from the Vector + * @return true if the Object existed in the Vector, false otherwise + * @since 1.2 + */ + public boolean remove(Object o) + { + return removeElement(o); + } + + /** * Adds an object at the specified index. Elements at or above * index are shifted up one position. * ! * @param index the index at which to add the element ! * @param element the element to add to the Vector ! * @throws ArrayIndexOutOfBoundsException index < 0 || index > size() ! * @since 1.2 */ public void add(int index, Object element) { *************** public class Vector extends AbstractList *** 614,766 **** /** * Removes the element at the specified index, and returns it. * ! * @param index The position from which to remove the element ! * @returns The object removed ! * @throws ArrayIndexOutOfBoundsException the index was out of the range ! * of the Vector */ public synchronized Object remove(int index) { ! if (index >= elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); ! Object temp = elementData[index]; ! removeElementAt(index); return temp; } /** ! * Clears all elements in the Vector and sets its size to 0 */ public void clear() { removeAllElements(); } public synchronized boolean containsAll(Collection c) { ! Iterator itr = c.iterator(); ! int size = c.size(); ! for (int pos = 0; pos < size; pos++) ! { ! if (!contains(itr.next())) ! return false; ! } ! return true; } public synchronized boolean addAll(Collection c) { return addAll(elementCount, c); } ! public synchronized boolean removeAll(Collection c) { ! return super.removeAll(c); } ! public synchronized boolean retainAll(Collection c) { ! return super.retainAll(c); } public synchronized boolean addAll(int index, Collection c) { ! if (index < 0 || index > elementCount) ! throw new ArrayIndexOutOfBoundsException(index); ! modCount++; Iterator itr = c.iterator(); int csize = c.size(); ensureCapacity(elementCount + csize); int end = index + csize; if (elementCount > 0 && index != elementCount) ! System.arraycopy(elementData, index, elementData, end, csize); elementCount += csize; ! for (; index < end; index++) ! { ! elementData[index] = itr.next(); ! } ! return (csize > 0); } ! public synchronized boolean equals(Object c) { ! return super.equals(c); } public synchronized int hashCode() { return super.hashCode(); } /** ! * Returns a string representation of this Vector in the form ! * [element0, element1, ... elementN] * ! * @returns the String representation of this Vector */ public synchronized String toString() { ! String r = "["; ! for (int i = 0; i < elementCount; i++) ! { ! r += elementData[i]; ! if (i < elementCount - 1) ! r += ", "; ! } ! r += "]"; ! return r; } /** ! * Returns an Enumeration of the elements of this List. ! * The Enumeration returned is compatible behavior-wise with ! * the 1.1 elements() method, in that it does not check for ! * concurrent modification. * ! * @returns an Enumeration */ ! public synchronized Enumeration elements() { ! return new Enumeration() ! { ! int i = 0; ! public boolean hasMoreElements() ! { ! return (i < elementCount); ! } ! public Object nextElement() { ! if (i >= elementCount) ! throw new NoSuchElementException(); ! return (elementAt(i++)); } ! }; } ! ! public List subList(int fromIndex, int toIndex) { ! List sub = super.subList(fromIndex, toIndex); ! return Collections.synchronizedList(sub); } ! ! /** @specnote This is not specified as synchronized in the JCL, but it seems ! * to me that is should be. If it isn't, a clear() operation on a sublist ! * will not be synchronized w.r.t. the Vector object. ! */ ! protected synchronized void removeRange(int fromIndex, int toIndex) { ! modCount++; ! if (fromIndex != toIndex) ! { ! System.arraycopy(elementData, toIndex, elementData, fromIndex, ! elementCount - toIndex); ! // Clear unused elements so objects can be collected. ! int save = elementCount; ! elementCount -= (toIndex - fromIndex); ! for (int i = elementCount; i < save; ++i) ! elementData[i] = null; ! } } } --- 651,915 ---- /** * Removes the element at the specified index, and returns it. * ! * @param index the position from which to remove the element ! * @return the object removed ! * @throws ArrayIndexOutOfBoundsException index < 0 || index >= size() ! * @since 1.2 */ public synchronized Object remove(int index) { ! checkBoundExclusive(index); Object temp = elementData[index]; ! modCount++; ! elementCount--; ! if (index < elementCount) ! System.arraycopy(elementData, index + 1, elementData, index, ! elementCount - index); ! elementData[elementCount] = null; return temp; } /** ! * Clears all elements in the Vector and sets its size to 0. */ public void clear() { removeAllElements(); } + /** + * Returns true if this Vector contains all the elements in c. + * + * @param c the collection to compare to + * @return true if this vector contains all elements of c + * @throws NullPointerException if c is null + * @since 1.2 + */ public synchronized boolean containsAll(Collection c) { ! // Here just for the sychronization. ! return super.containsAll(c); } + /** + * Appends all elements of the given collection to the end of this Vector. + * Behavior is undefined if the collection is modified during this operation + * (for example, if this == c). + * + * @param c the collection to append + * @return true if this vector changed, in other words c was not empty + * @throws NullPointerException if c is null + * @since 1.2 + */ public synchronized boolean addAll(Collection c) { return addAll(elementCount, c); } ! ! /** ! * Remove from this vector all elements contained in the given collection. ! * ! * @param c the collection to filter out ! * @return true if this vector changed ! * @throws NullPointerException if c is null ! * @since 1.2 ! */ public synchronized boolean removeAll(Collection c) { ! if (c == null) ! throw new NullPointerException(); ! ! int i; ! int j; ! for (i = 0; i < elementCount; i++) ! if (c.contains(elementData[i])) ! break; ! if (i == elementCount) ! return false; ! ! modCount++; ! for (j = i++; i < elementCount; i++) ! if (! c.contains(elementData[i])) ! elementData[j++] = elementData[i]; ! elementCount -= i - j; ! return true; } ! ! /** ! * Retain in this vector only the elements contained in the given collection. ! * ! * @param c the collection to filter by ! * @return true if this vector changed ! * @throws NullPointerException if c is null ! * @since 1.2 ! */ public synchronized boolean retainAll(Collection c) { ! if (c == null) ! throw new NullPointerException(); ! ! int i; ! int j; ! for (i = 0; i < elementCount; i++) ! if (! c.contains(elementData[i])) ! break; ! if (i == elementCount) ! return false; ! ! modCount++; ! for (j = i++; i < elementCount; i++) ! if (c.contains(elementData[i])) ! elementData[j++] = elementData[i]; ! elementCount -= i - j; ! return true; } + /** + * Inserts all elements of the given collection at the given index of + * this Vector. Behavior is undefined if the collection is modified during + * this operation (for example, if this == c). + * + * @param c the collection to append + * @return true if this vector changed, in other words c was not empty + * @throws NullPointerException if c is null + * @throws ArrayIndexOutOfBoundsException index < 0 || index > size() + * @since 1.2 + */ public synchronized boolean addAll(int index, Collection c) { ! checkBoundInclusive(index); Iterator itr = c.iterator(); int csize = c.size(); + modCount++; ensureCapacity(elementCount + csize); int end = index + csize; if (elementCount > 0 && index != elementCount) ! System.arraycopy(elementData, index, ! elementData, end, elementCount - index); elementCount += csize; ! for ( ; index < end; index++) ! elementData[index] = itr.next(); ! return (csize > 0); } ! /** ! * Compares this to the given object. ! * ! * @param o the object to compare to ! * @return true if the two are equal ! * @since 1.2 ! */ ! public synchronized boolean equals(Object o) { ! // Here just for the sychronization. ! return super.equals(o); } + /** + * Computes the hashcode of this object. + * + * @return the hashcode + * @since 1.2 + */ public synchronized int hashCode() { + // Here just for the sychronization. return super.hashCode(); } /** ! * Returns a string representation of this Vector in the form ! * "[element0, element1, ... elementN]". * ! * @return the String representation of this Vector */ public synchronized String toString() { ! // Here just for the sychronization. ! return super.toString(); } /** ! * Obtain a List view of a subsection of this list, from fromIndex ! * (inclusive) to toIndex (exclusive). If the two indices are equal, the ! * sublist is empty. The returned list is modifiable, and changes in one ! * reflect in the other. If this list is structurally modified in ! * any way other than through the returned list, the result of any subsequent ! * operations on the returned list is undefined. ! *

          * ! * @param fromIndex the index that the returned list should start from ! * (inclusive) ! * @param toIndex the index that the returned list should go to (exclusive) ! * @return a List backed by a subsection of this vector ! * @throws IndexOutOfBoundsException if fromIndex < 0 ! * || toIndex > size() ! * @throws IllegalArgumentException if fromIndex > toIndex ! * @see ConcurrentModificationException ! * @since 1.2 */ ! public synchronized List subList(int fromIndex, int toIndex) { ! List sub = super.subList(fromIndex, toIndex); ! // We must specify the correct object to synchronize upon, hence the ! // use of a non-public API ! return new Collections.SynchronizedList(this, sub); ! } ! ! /** ! * Removes a range of elements from this list. ! * Does nothing when toIndex is equal to fromIndex. ! * ! * @param fromIndex the index to start deleting from (inclusive) ! * @param toIndex the index to delete up to (exclusive) ! * @throws IndexOutOfBoundsException if fromIndex > toIndex ! */ ! // This does not need to be synchronized, because it is only called through ! // clear() of a sublist, and clear() had already synchronized. ! protected void removeRange(int fromIndex, int toIndex) ! { ! int change = toIndex - fromIndex; ! if (change > 0) { ! modCount++; ! System.arraycopy(elementData, toIndex, elementData, fromIndex, ! elementCount - toIndex); ! int save = elementCount; ! elementCount -= change; ! Arrays.fill(elementData, elementCount, save, null); } ! else if (change < 0) ! throw new IndexOutOfBoundsException(); } ! ! /** ! * Checks that the index is in the range of possible elements (inclusive). ! * ! * @param index the index to check ! * @throws ArrayIndexOutOfBoundsException if index > size ! */ ! private void checkBoundInclusive(int index) { ! // Implementation note: we do not check for negative ranges here, since ! // use of a negative index will cause an ArrayIndexOutOfBoundsException ! // with no effort on our part. ! if (index > elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " > " + elementCount); } ! ! /** ! * Checks that the index is in the range of existing elements (exclusive). ! * ! * @param index the index to check ! * @throws ArrayIndexOutOfBoundsException if index >= size ! */ ! private void checkBoundExclusive(int index) { ! // Implementation note: we do not check for negative ranges here, since ! // use of a negative index will cause an ArrayIndexOutOfBoundsException ! // with no effort on our part. ! if (index >= elementCount) ! throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount); } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/WeakHashMap.java gcc-3.1/libjava/java/util/WeakHashMap.java *** gcc-3.0.4/libjava/java/util/WeakHashMap.java Mon Dec 11 03:47:47 2000 --- gcc-3.1/libjava/java/util/WeakHashMap.java Thu Feb 14 23:16:11 2002 *************** *** 1,5 **** ! /* java.util.WeakHashMap ! Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,6 ---- ! /* java.util.WeakHashMap -- a hashtable that keeps only weak references ! to its keys, allowing the virtual machine to reclaim them ! Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,31 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util; import java.lang.ref.WeakReference; import java.lang.ref.ReferenceQueue; --- 19,44 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util; + import java.lang.ref.WeakReference; import java.lang.ref.ReferenceQueue; *************** import java.lang.ref.ReferenceQueue; *** 50,102 **** * has similar phenomenons: The size may spontaneously shrink, or an * entry, that was in the set before, suddenly disappears.
          * ! * A weak hash map is not meant for caches; use a normal map, with ! * soft references as values instead.
          * ! * The weak hash map supports null values and null keys. Null keys ! * are never deleted from the map (except explictly of course). * The performance of the methods are similar to that of a hash map.
          * ! * The value object are strongly referenced by this table. So if a * value object maintains a strong reference to the key (either direct * or indirect) the key will never be removed from this map. According ! * to Sun, this problem may be fixed in a future release. It is not * possible to do it with the jdk 1.2 reference model, though. * ! * @since jdk1.2 ! * @author Jochen Hoenicke * @see HashMap ! * @see WeakReference */ public class WeakHashMap extends AbstractMap implements Map { ! /** ! * The default capacity for an instance of HashMap. * Sun's documentation mildly suggests that this (11) is the correct ! * value. */ private static final int DEFAULT_CAPACITY = 11; ! /** ! * The default load factor of a HashMap */ private static final float DEFAULT_LOAD_FACTOR = 0.75F; /** * This is used instead of the key value null. It is needed ! * to distinguish between an null key and a removed key. */ ! private static final Object NULL_KEY = new Object(); /** * The reference queue where our buckets (which are WeakReferences) are * registered to. */ ! private ReferenceQueue queue; /** * The number of entries in this hash map. */ ! private int size; /** * The load factor of this WeakHashMap. This is the maximum ratio of --- 63,142 ---- * has similar phenomenons: The size may spontaneously shrink, or an * entry, that was in the set before, suddenly disappears.
          * ! * A weak hash map is not meant for caches; use a normal map, with ! * soft references as values instead, or try {@link LinkedHashMap}.
          * ! * The weak hash map supports null values and null keys. The null key ! * is never deleted from the map (except explictly of course). * The performance of the methods are similar to that of a hash map.
          * ! * The value objects are strongly referenced by this table. So if a * value object maintains a strong reference to the key (either direct * or indirect) the key will never be removed from this map. According ! * to Sun, this problem may be fixed in a future release. It is not * possible to do it with the jdk 1.2 reference model, though. * ! * @author Jochen Hoenicke ! * @author Eric Blake * @see HashMap ! * @see WeakReference ! * @see LinkedHashMap ! * @since 1.2 ! * @status updated to 1.4 ! */ public class WeakHashMap extends AbstractMap implements Map { ! /** ! * The default capacity for an instance of HashMap. * Sun's documentation mildly suggests that this (11) is the correct ! * value. */ private static final int DEFAULT_CAPACITY = 11; ! /** ! * The default load factor of a HashMap. */ private static final float DEFAULT_LOAD_FACTOR = 0.75F; /** * This is used instead of the key value null. It is needed ! * to distinguish between an null key and a removed key. */ ! // Package visible for use by nested classes. ! static final Object NULL_KEY = new Object() ! { ! /** ! * Sets the hashCode to 0, since that's what null would map to. ! * @return the hash code 0 ! */ ! public int hashCode() ! { ! return 0; ! } ! ! /** ! * Compares this key to the given object. Normally, an object should ! * NEVER compare equal to null, but since we don't publicize NULL_VALUE, ! * it saves bytecode to do so here. ! * @return true iff o is this or null ! */ ! public boolean equals(Object o) ! { ! return null == o || this == o; ! } ! }; /** * The reference queue where our buckets (which are WeakReferences) are * registered to. */ ! private final ReferenceQueue queue; /** * The number of entries in this hash map. */ ! // Package visible for use by nested classes. ! int size; /** * The load factor of this WeakHashMap. This is the maximum ratio of *************** public class WeakHashMap extends Abstrac *** 108,114 **** /** * The rounded product of the capacity (i.e. number of buckets) and * the load factor. When the number of elements exceeds the ! * threshold, the HashMap calls

          rehash()
          . */ private int threshold; --- 148,154 ---- /** * The rounded product of the capacity (i.e. number of buckets) and * the load factor. When the number of elements exceeds the ! * threshold, the HashMap calls
          rehash()
          . */ private int threshold; *************** public class WeakHashMap extends Abstrac *** 119,135 **** * by the garbage collection. Instead the iterators must make * sure to have strong references to the entries they rely on. */ ! private int modCount; ! /** * The entry set. There is only one instance per hashmap, namely * theEntrySet. Note that the entry set may silently shrink, just * like the WeakHashMap. */ ! private class WeakEntrySet extends AbstractSet { /** ! * Returns the size of this set. */ public int size() { --- 159,185 ---- * by the garbage collection. Instead the iterators must make * sure to have strong references to the entries they rely on. */ ! // Package visible for use by nested classes. ! int modCount; ! /** * The entry set. There is only one instance per hashmap, namely * theEntrySet. Note that the entry set may silently shrink, just * like the WeakHashMap. */ ! private final class WeakEntrySet extends AbstractSet { /** ! * Non-private constructor to reduce bytecode emitted. ! */ ! WeakEntrySet() ! { ! } ! ! /** ! * Returns the size of this set. ! * ! * @return the set size */ public int size() { *************** public class WeakHashMap extends Abstrac *** 138,288 **** /** * Returns an iterator for all entries. */ public Iterator iterator() { return new Iterator() { ! /** ! * The entry that was returned by the last ! * next() call. This is also the entry whose ! * bucket should be removed by the remove call.
          ! * ! * It is null, if the next method wasn't ! * called yet, or if the entry was already removed.
          ! * ! * Remembering this entry here will also prevent it from ! * being removed under us, since the entry strongly refers ! * to the key. ! */ ! WeakBucket.Entry lastEntry; ! ! /** ! * The entry that will be returned by the next ! * next() call. It is null if there ! * is no further entry.
          ! * ! * Remembering this entry here will also prevent it from ! * being removed under us, since the entry strongly refers ! * to the key. ! */ ! WeakBucket.Entry nextEntry = findNext(null); ! /** ! * The known number of modification to the list, if it differs ! * from the real number, we through an exception. ! */ ! int knownMod = modCount; ! /** ! * Check the known number of modification to the number of ! * modifications of the table. If it differs from the real ! * number, we throw an exception. ! * @exception ConcurrentModificationException if the number ! * of modifications doesn't match. ! */ ! private void checkMod() ! { ! /* This method will get inlined */ ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! } ! /** ! * Get a strong reference to the next entry after ! * lastBucket. ! * @param lastBucket the previous bucket, or null if we should ! * get the first entry. ! * @return the next entry. ! */ ! private WeakBucket.Entry findNext(WeakBucket.Entry lastEntry) ! { ! int slot; ! WeakBucket nextBucket; ! if (lastEntry != null) ! { ! nextBucket = lastEntry.getBucket().next; ! slot = lastEntry.getBucket().slot; ! } ! else ! { ! nextBucket = buckets[0]; ! slot = 0; ! } ! while (true) ! { ! while (nextBucket != null) ! { ! WeakBucket.Entry entry = nextBucket.getEntry(); ! if (entry != null) ! /* This is the next entry */ ! return entry; ! /* entry was cleared, try next */ ! nextBucket = nextBucket.next; ! } ! slot++; ! if (slot == buckets.length) ! /* No more buckets, we are through */ ! return null; ! nextBucket = buckets[slot]; ! } ! } ! /** ! * Checks if there are more entries. ! * @return true, iff there are more elements. ! * @exception IllegalModificationException if the hash map was ! * modified. ! */ ! public boolean hasNext() ! { ! cleanQueue(); ! checkMod(); ! return (nextEntry != null); ! } ! /** ! * Returns the next entry. ! * @return the next entry. ! * @exception IllegalModificationException if the hash map was ! * modified. ! * @exception NoSuchElementException if there is no entry. ! */ ! public Object next() ! { ! cleanQueue(); ! checkMod(); ! if (nextEntry == null) ! throw new NoSuchElementException(); ! lastEntry = nextEntry; ! nextEntry = findNext(lastEntry); ! return lastEntry; ! } ! /** ! * Removes the last returned entry from this set. This will ! * also remove the bucket of the underlying weak hash map. ! * @exception IllegalModificationException if the hash map was ! * modified. ! * @exception IllegalStateException if next() was ! * never called or the element was already removed. ! */ ! public void remove() ! { ! cleanQueue(); ! checkMod(); ! if (lastEntry == null) ! throw new IllegalStateException(); ! internalRemove(lastEntry.getBucket()); ! lastEntry = null; ! modCount++; ! knownMod = modCount; ! } }; } } --- 188,337 ---- /** * Returns an iterator for all entries. + * + * @return an Entry iterator */ public Iterator iterator() { return new Iterator() { ! /** ! * The entry that was returned by the last ! * next() call. This is also the entry whose ! * bucket should be removed by the remove call.
          ! * ! * It is null, if the next method wasn't ! * called yet, or if the entry was already removed.
          ! * ! * Remembering this entry here will also prevent it from ! * being removed under us, since the entry strongly refers ! * to the key. ! */ ! WeakBucket.WeakEntry lastEntry; ! /** ! * The entry that will be returned by the next ! * next() call. It is null if there ! * is no further entry.
          ! * ! * Remembering this entry here will also prevent it from ! * being removed under us, since the entry strongly refers ! * to the key. ! */ ! WeakBucket.WeakEntry nextEntry = findNext(null); ! /** ! * The known number of modification to the list, if it differs ! * from the real number, we throw an exception. ! */ ! int knownMod = modCount; ! /** ! * Check the known number of modification to the number of ! * modifications of the table. If it differs from the real ! * number, we throw an exception. ! * @throws ConcurrentModificationException if the number ! * of modifications doesn't match. ! */ ! private void checkMod() ! { ! // This method will get inlined. ! cleanQueue(); ! if (knownMod != modCount) ! throw new ConcurrentModificationException(); ! } ! /** ! * Get a strong reference to the next entry after ! * lastBucket. ! * @param lastEntry the previous bucket, or null if we should ! * get the first entry. ! * @return the next entry. ! */ ! private WeakBucket.WeakEntry findNext(WeakBucket.WeakEntry lastEntry) ! { ! int slot; ! WeakBucket nextBucket; ! if (lastEntry != null) ! { ! nextBucket = lastEntry.getBucket().next; ! slot = lastEntry.getBucket().slot; ! } ! else ! { ! nextBucket = buckets[0]; ! slot = 0; ! } ! while (true) ! { ! while (nextBucket != null) ! { ! WeakBucket.WeakEntry entry = nextBucket.getEntry(); ! if (entry != null) ! // This is the next entry. ! return entry; ! // Entry was cleared, try next. ! nextBucket = nextBucket.next; ! } ! slot++; ! if (slot == buckets.length) ! // No more buckets, we are through. ! return null; + nextBucket = buckets[slot]; + } + } ! /** ! * Checks if there are more entries. ! * @return true, iff there are more elements. ! * @throws ConcurrentModificationException if the hash map was ! * modified. ! */ ! public boolean hasNext() ! { ! checkMod(); ! return nextEntry != null; ! } ! /** ! * Returns the next entry. ! * @return the next entry. ! * @throws ConcurrentModificationException if the hash map was ! * modified. ! * @throws NoSuchElementException if there is no entry. ! */ ! public Object next() ! { ! checkMod(); ! if (nextEntry == null) ! throw new NoSuchElementException(); ! lastEntry = nextEntry; ! nextEntry = findNext(lastEntry); ! return lastEntry; ! } ! /** ! * Removes the last returned entry from this set. This will ! * also remove the bucket of the underlying weak hash map. ! * @throws ConcurrentModificationException if the hash map was ! * modified. ! * @throws IllegalStateException if next() was ! * never called or the element was already removed. ! */ ! public void remove() ! { ! checkMod(); ! if (lastEntry == null) ! throw new IllegalStateException(); ! modCount++; ! internalRemove(lastEntry.getBucket()); ! lastEntry = null; ! knownMod++; ! } }; } } *************** public class WeakHashMap extends Abstrac *** 293,320 **** * number.
          * * It would be cleaner to have a WeakReference as field, instead of ! * extending it, but if a weak reference get cleared, we only get * the weak reference (by queue.poll) and wouldn't know where to * look for this reference in the hashtable, to remove that entry. * ! * @author Jochen Hoenicke */ private static class WeakBucket extends WeakReference { /** * The value of this entry. The key is stored in the weak ! * reference that we extend. */ Object value; /** * The next bucket describing another entry that uses the same ! * slot. */ WeakBucket next; /** ! * The slot of this entry. This should be *
                 *  Math.abs(key.hashCode() % buckets.length)
                 * 
          --- 342,369 ---- * number.
          * * It would be cleaner to have a WeakReference as field, instead of ! * extending it, but if a weak reference gets cleared, we only get * the weak reference (by queue.poll) and wouldn't know where to * look for this reference in the hashtable, to remove that entry. * ! * @author Jochen Hoenicke */ private static class WeakBucket extends WeakReference { /** * The value of this entry. The key is stored in the weak ! * reference that we extend. */ Object value; /** * The next bucket describing another entry that uses the same ! * slot. */ WeakBucket next; /** ! * The slot of this entry. This should be *
                 *  Math.abs(key.hashCode() % buckets.length)
                 * 
          *************** public class WeakHashMap extends Abstrac *** 329,340 **** * Creates a new bucket for the given key/value pair and the specified * slot. * @param key the key * @param value the value * @param slot the slot. This must match the slot where this bucket ! * will be enqueued. */ public WeakBucket(Object key, ReferenceQueue queue, Object value, ! int slot) { super(key, queue); this.value = value; --- 378,390 ---- * Creates a new bucket for the given key/value pair and the specified * slot. * @param key the key + * @param queue the queue the weak reference belongs to * @param value the value * @param slot the slot. This must match the slot where this bucket ! * will be enqueued. */ public WeakBucket(Object key, ReferenceQueue queue, Object value, ! int slot) { super(key, queue); this.value = value; *************** public class WeakHashMap extends Abstrac *** 342,352 **** } /** ! * This class gives the Entry representation of the * current bucket. It also keeps a strong reference to the * key; bad things may happen otherwise. */ ! class Entry implements Map.Entry { /** * The strong ref to the key. --- 392,402 ---- } /** ! * This class gives the Entry representation of the * current bucket. It also keeps a strong reference to the * key; bad things may happen otherwise. */ ! class WeakEntry implements Map.Entry { /** * The strong ref to the key. *************** public class WeakHashMap extends Abstrac *** 355,447 **** /** * Creates a new entry for the key. */ ! public Entry(Object key) { ! this.key = key; } /** * Returns the underlying bucket. */ public WeakBucket getBucket() { ! return WeakBucket.this; } /** * Returns the key. */ public Object getKey() { ! return key == NULL_KEY ? null : key; } /** * Returns the value. */ public Object getValue() { ! return value; } /** ! * This changes the value. This change takes place in * the underlying hash map. */ public Object setValue(Object newVal) { ! Object oldVal = value; ! value = newVal; ! return oldVal; } /** * The hashCode as specified in the Entry interface. */ public int hashCode() { ! return (key == NULL_KEY ? 0 : key.hashCode()) ! ^ (value == null ? 0 : value.hashCode()); } /** * The equals method as specified in the Entry interface. */ public boolean equals(Object o) { ! if (o instanceof Map.Entry) ! { ! Map.Entry e = (Map.Entry) o; ! return (key == NULL_KEY ! ? e.getKey() == null : key.equals(e.getKey())) ! && (value == null ! ? e.getValue() == null : value.equals(e.getValue())); ! } ! return false; } } /** * This returns the entry stored in this bucket, or null, if the * bucket got cleared in the mean time. */ ! Entry getEntry() { final Object key = this.get(); if (key == null) ! return null; ! return new Entry(key); } } /** * The entry set returned by entrySet(). */ ! private WeakEntrySet theEntrySet; /** ! * The hash buckets. This are linked lists. */ private WeakBucket[] buckets; --- 405,509 ---- /** * Creates a new entry for the key. + * @param key the key */ ! public WeakEntry(Object key) { ! this.key = key; } /** * Returns the underlying bucket. + * @return the owning bucket */ public WeakBucket getBucket() { ! return WeakBucket.this; } /** * Returns the key. + * @return the key */ public Object getKey() { ! return key == NULL_KEY ? null : key; } /** * Returns the value. + * @return the value */ public Object getValue() { ! return value; } /** ! * This changes the value. This change takes place in * the underlying hash map. + * @param newVal the new value + * @return the old value */ public Object setValue(Object newVal) { ! Object oldVal = value; ! value = newVal; ! return oldVal; } /** * The hashCode as specified in the Entry interface. + * @return the hash code */ public int hashCode() { ! return key.hashCode() ^ WeakHashMap.hashCode(value); } /** * The equals method as specified in the Entry interface. + * @param o the object to compare to + * @return true iff o represents the same key/value pair */ public boolean equals(Object o) { ! if (o instanceof Map.Entry) ! { ! Map.Entry e = (Map.Entry) o; ! return key.equals(e.getKey()) ! && WeakHashMap.equals(value, e.getValue()); ! } ! return false; ! } ! ! public String toString() ! { ! return key + "=" + value; } } /** * This returns the entry stored in this bucket, or null, if the * bucket got cleared in the mean time. + * @return the Entry for this bucket, if it exists */ ! WeakEntry getEntry() { final Object key = this.get(); if (key == null) ! return null; ! return new WeakEntry(key); } } /** * The entry set returned by entrySet(). */ ! private final WeakEntrySet theEntrySet; /** ! * The hash buckets. These are linked lists. */ private WeakBucket[] buckets; *************** public class WeakHashMap extends Abstrac *** 457,463 **** /** * Creates a new weak hash map with default load factor and the given * capacity. ! * @param initialCapacity the initial capacity */ public WeakHashMap(int initialCapacity) { --- 519,526 ---- /** * Creates a new weak hash map with default load factor and the given * capacity. ! * @param initialCapacity the initial capacity ! * @throws IllegalArgumentException if initialCapacity is negative */ public WeakHashMap(int initialCapacity) { *************** public class WeakHashMap extends Abstrac *** 466,478 **** /** * Creates a new weak hash map with the given initial capacity and ! * load factor. * @param initialCapacity the initial capacity. * @param loadFactor the load factor (see class description of HashMap). */ public WeakHashMap(int initialCapacity, float loadFactor) { ! if (initialCapacity < 0 || loadFactor <= 0 || loadFactor > 1) throw new IllegalArgumentException(); this.loadFactor = loadFactor; threshold = (int) (initialCapacity * loadFactor); --- 529,544 ---- /** * Creates a new weak hash map with the given initial capacity and ! * load factor. * @param initialCapacity the initial capacity. * @param loadFactor the load factor (see class description of HashMap). + * @throws IllegalArgumentException if initialCapacity is negative, or + * loadFactor is non-positive */ public WeakHashMap(int initialCapacity, float loadFactor) { ! // Check loadFactor for NaN as well. ! if (initialCapacity < 0 || ! (loadFactor > 0)) throw new IllegalArgumentException(); this.loadFactor = loadFactor; threshold = (int) (initialCapacity * loadFactor); *************** public class WeakHashMap extends Abstrac *** 481,488 **** buckets = new WeakBucket[initialCapacity]; } ! /** ! * simply hashes a non-null Object to its array index */ private int hash(Object key) { --- 547,570 ---- buckets = new WeakBucket[initialCapacity]; } ! /** ! * Construct a new WeakHashMap with the same mappings as the given map. ! * The WeakHashMap has a default load factor of 0.75. ! * ! * @param m the map to copy ! * @throws NullPointerException if m is null ! * @since 1.3 ! */ ! public WeakHashMap(Map m) ! { ! this(m.size(), DEFAULT_LOAD_FACTOR); ! putAll(m); ! } ! ! /** ! * Simply hashes a non-null Object to its array index. ! * @param key the key to hash ! * @return its slot number */ private int hash(Object key) { *************** public class WeakHashMap extends Abstrac *** 498,565 **** * Currently the iterator maintains a strong reference to the key, so * that is no problem. */ ! private void cleanQueue() { Object bucket = queue.poll(); while (bucket != null) { ! internalRemove((WeakBucket) bucket); ! bucket = queue.poll(); } } /** * Rehashes this hashtable. This will be called by the ! * add() method if the size grows beyond the threshold. * It will grow the bucket size at least by factor two and allocates * new buckets. */ private void rehash() { WeakBucket[] oldBuckets = buckets; ! int newsize = buckets.length * 2 + 1; // XXX should be prime. threshold = (int) (newsize * loadFactor); buckets = new WeakBucket[newsize]; ! /* Now we have to insert the buckets again. ! */ for (int i = 0; i < oldBuckets.length; i++) { ! WeakBucket bucket = oldBuckets[i]; ! WeakBucket nextBucket; ! while (bucket != null) ! { ! nextBucket = bucket.next; ! Object key = bucket.get(); ! if (key == null) ! { ! /* This bucket should be removed; it is probably ! * already on the reference queue. We don't insert it ! * at all, and mark it as cleared. */ ! bucket.slot = -1; ! size--; ! } ! else ! { ! /* add this bucket to its new slot */ ! int slot = hash(key); ! bucket.slot = slot; ! bucket.next = buckets[slot]; ! buckets[slot] = bucket; ! } ! bucket = nextBucket; ! } } } /** * Finds the entry corresponding to key. Since it returns an Entry * it will also prevent the key from being removed under us. ! * @param key the key. It may be null. ! * @return The WeakBucket.Entry or null, if the key wasn't found. */ ! private WeakBucket.Entry internalGet(Object key) { if (key == null) key = NULL_KEY; --- 580,647 ---- * Currently the iterator maintains a strong reference to the key, so * that is no problem. */ ! // Package visible for use by nested classes. ! void cleanQueue() { Object bucket = queue.poll(); while (bucket != null) { ! internalRemove((WeakBucket) bucket); ! bucket = queue.poll(); } } /** * Rehashes this hashtable. This will be called by the ! * add() method if the size grows beyond the threshold. * It will grow the bucket size at least by factor two and allocates * new buckets. */ private void rehash() { WeakBucket[] oldBuckets = buckets; ! int newsize = buckets.length * 2 + 1; // XXX should be prime. threshold = (int) (newsize * loadFactor); buckets = new WeakBucket[newsize]; ! // Now we have to insert the buckets again. for (int i = 0; i < oldBuckets.length; i++) { ! WeakBucket bucket = oldBuckets[i]; ! WeakBucket nextBucket; ! while (bucket != null) ! { ! nextBucket = bucket.next; ! Object key = bucket.get(); ! if (key == null) ! { ! // This bucket should be removed; it is probably ! // already on the reference queue. We don't insert it ! // at all, and mark it as cleared. ! bucket.slot = -1; ! size--; ! } ! else ! { ! // Add this bucket to its new slot. ! int slot = hash(key); ! bucket.slot = slot; ! bucket.next = buckets[slot]; ! buckets[slot] = bucket; ! } ! bucket = nextBucket; ! } } } /** * Finds the entry corresponding to key. Since it returns an Entry * it will also prevent the key from being removed under us. ! * @param key the key, may be null ! * @return The WeakBucket.WeakEntry or null, if the key wasn't found. */ ! private WeakBucket.WeakEntry internalGet(Object key) { if (key == null) key = NULL_KEY; *************** public class WeakHashMap extends Abstrac *** 567,577 **** WeakBucket bucket = buckets[slot]; while (bucket != null) { ! WeakBucket.Entry entry = bucket.getEntry(); ! if (entry != null && key.equals(entry.key)) ! return entry; ! bucket = bucket.next; } return null; } --- 649,659 ---- WeakBucket bucket = buckets[slot]; while (bucket != null) { ! WeakBucket.WeakEntry entry = bucket.getEntry(); ! if (entry != null && key.equals(entry.key)) ! return entry; ! bucket = bucket.next; } return null; } *************** public class WeakHashMap extends Abstrac *** 595,635 **** /** * Removes a bucket from this hash map, if it wasn't removed before * (e.g. one time through rehashing and one time through reference queue) ! * @param bucket the bucket to remove. */ private void internalRemove(WeakBucket bucket) { int slot = bucket.slot; if (slot == -1) ! /* this bucket was already removed. */ return; ! /* mark the bucket as removed. This is necessary, since the ! * bucket may be enqueued later by the garbage collection and ! * internalRemove, will be called a second time. ! */ bucket.slot = -1; if (buckets[slot] == bucket) buckets[slot] = bucket.next; else { ! WeakBucket prev = buckets[slot]; ! /* This may throw a NullPointerException. It shouldn't but if ! * a race condition occured (two threads removing the same ! * bucket at the same time) it may happen.
          ! * But with race condition many much worse things may happen ! * anyway. ! */ ! while (prev.next != bucket) ! prev = prev.next; ! prev.next = bucket.next; } size--; } /** * Returns the size of this hash map. Note that the size() may shrink ! * spontanously, if the some of the keys were only weakly reachable. * @return the number of entries in this hash map. */ public int size() --- 677,716 ---- /** * Removes a bucket from this hash map, if it wasn't removed before * (e.g. one time through rehashing and one time through reference queue) ! * @param bucket the bucket to remove. */ private void internalRemove(WeakBucket bucket) { int slot = bucket.slot; if (slot == -1) ! // This bucket was already removed. return; ! // Mark the bucket as removed. This is necessary, since the ! // bucket may be enqueued later by the garbage collection, and ! // internalRemove will be called a second time. bucket.slot = -1; if (buckets[slot] == bucket) buckets[slot] = bucket.next; else { ! WeakBucket prev = buckets[slot]; ! /* This may throw a NullPointerException. It shouldn't but if ! * a race condition occurred (two threads removing the same ! * bucket at the same time) it may happen.
          ! * But with race condition many much worse things may happen ! * anyway. ! */ ! while (prev.next != bucket) ! prev = prev.next; ! prev.next = bucket.next; } size--; } /** * Returns the size of this hash map. Note that the size() may shrink ! * spontaneously, if the some of the keys were only weakly reachable. * @return the number of entries in this hash map. */ public int size() *************** public class WeakHashMap extends Abstrac *** 651,659 **** /** * Tells if the map contains the given key. Note that the result ! * may change spontanously, if all the key was only weakly ! * reachable. ! * @return true, iff the map contains an entry for the given key. */ public boolean containsKey(Object key) { --- 732,741 ---- /** * Tells if the map contains the given key. Note that the result ! * may change spontanously, if the key was only weakly ! * reachable. ! * @param key the key to look for ! * @return true, iff the map contains an entry for the given key. */ public boolean containsKey(Object key) { *************** public class WeakHashMap extends Abstrac *** 662,699 **** } /** ! * Gets the value the key will be mapped to. * @return the value the key was mapped to. It returns null if ! * the key wasn't in this map, or if the mapped value was explicitly ! * set to null. */ public Object get(Object key) { cleanQueue(); ! WeakBucket.Entry entry = internalGet(key); return entry == null ? null : entry.getValue(); } /** * Adds a new key/value mapping to this map. ! * @param key the key. This may be null. ! * @param value the value. This may be null. * @return the value the key was mapped to previously. It returns ! * null if the key wasn't in this map, or if the mapped value was ! * explicitly set to null. */ public Object put(Object key, Object value) { cleanQueue(); ! WeakBucket.Entry entry = internalGet(key); if (entry != null) return entry.setValue(value); if (size >= threshold) rehash(); internalAdd(key, value); - modCount++; return null; } --- 744,781 ---- } /** ! * Gets the value the key is mapped to. * @return the value the key was mapped to. It returns null if ! * the key wasn't in this map, or if the mapped value was ! * explicitly set to null. */ public Object get(Object key) { cleanQueue(); ! WeakBucket.WeakEntry entry = internalGet(key); return entry == null ? null : entry.getValue(); } /** * Adds a new key/value mapping to this map. ! * @param key the key, may be null ! * @param value the value, may be null * @return the value the key was mapped to previously. It returns ! * null if the key wasn't in this map, or if the mapped value ! * was explicitly set to null. */ public Object put(Object key, Object value) { cleanQueue(); ! WeakBucket.WeakEntry entry = internalGet(key); if (entry != null) return entry.setValue(value); + modCount++; if (size >= threshold) rehash(); internalAdd(key, value); return null; } *************** public class WeakHashMap extends Abstrac *** 701,718 **** * Removes the key and the corresponding value from this map. * @param key the key. This may be null. * @return the value the key was mapped to previously. It returns ! * null if the key wasn't in this map, or if the mapped value was ! * explicitly set to null. */ public Object remove(Object key) { cleanQueue(); ! WeakBucket.Entry entry = internalGet(key); if (entry == null) ! { ! return null; ! } ! internalRemove(entry.getBucket()); modCount++; return entry.getValue(); } --- 783,800 ---- * Removes the key and the corresponding value from this map. * @param key the key. This may be null. * @return the value the key was mapped to previously. It returns ! * null if the key wasn't in this map, or if the mapped value was ! * explicitly set to null. ! */ public Object remove(Object key) { cleanQueue(); ! WeakBucket.WeakEntry entry = internalGet(key); if (entry == null) ! return null; ! modCount++; + internalRemove(entry.getBucket()); return entry.getValue(); } *************** public class WeakHashMap extends Abstrac *** 721,731 **** * set will not have strong references to the keys, so they can be * silently removed. The returned set has therefore the same * strange behaviour (shrinking size(), disappearing entries) as ! * this weak hash map. ! * @return a set representation of the entries. */ public Set entrySet() { cleanQueue(); return theEntrySet; } } --- 803,873 ---- * set will not have strong references to the keys, so they can be * silently removed. The returned set has therefore the same * strange behaviour (shrinking size(), disappearing entries) as ! * this weak hash map. ! * @return a set representation of the entries. ! */ public Set entrySet() { cleanQueue(); return theEntrySet; } + + /** + * Clears all entries from this map. + */ + public void clear() + { + super.clear(); + } + + /** + * Returns true if the map contains at least one key which points to + * the specified object as a value. Note that the result + * may change spontanously, if its key was only weakly reachable. + * @param value the value to search for + * @return true if it is found in the set. + */ + public boolean containsValue(Object value) + { + cleanQueue(); + return super.containsValue(value); + } + + /** + * Returns a set representation of the keys in this map. This + * set will not have strong references to the keys, so they can be + * silently removed. The returned set has therefore the same + * strange behaviour (shrinking size(), disappearing entries) as + * this weak hash map. + * @return a set representation of the keys. + */ + public Set keySet() + { + cleanQueue(); + return super.keySet(); + } + + /** + * Puts all of the mappings from the given map into this one. If the + * key already exists in this map, its value is replaced. + * @param m the map to copy in + */ + public void putAll(Map m) + { + super.putAll(m); + } + + /** + * Returns a collection representation of the values in this map. This + * collection will not have strong references to the keys, so mappings + * can be silently removed. The returned collection has therefore the same + * strange behaviour (shrinking size(), disappearing entries) as + * this weak hash map. + * @return a collection representation of the values. + */ + public Collection values() + { + cleanQueue(); + return super.values(); + } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/jar/Attributes.java gcc-3.1/libjava/java/util/jar/Attributes.java *** gcc-3.0.4/libjava/java/util/jar/Attributes.java Sat Nov 18 02:00:06 2000 --- gcc-3.1/libjava/java/util/jar/Attributes.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.jar; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.jar; *************** import java.util.Set; *** 45,51 **** * manipulating the Attributes more or less type safe. *

          * Most of the methods are wrappers to implement the Map interface. The really ! * usefull and often used methods are getValue(Name) and * getValue(String). If you actually want to set attributes you * may want to use the putValue(String, String) method * (sorry there is no public type safe putValue(Name, String) --- 56,62 ---- * manipulating the Attributes more or less type safe. *

          * Most of the methods are wrappers to implement the Map interface. The really ! * useful and often used methods are getValue(Name) and * getValue(String). If you actually want to set attributes you * may want to use the putValue(String, String) method * (sorry there is no public type safe putValue(Name, String) diff -Nrc3pad gcc-3.0.4/libjava/java/util/jar/JarEntry.java gcc-3.1/libjava/java/util/jar/JarEntry.java *** gcc-3.0.4/libjava/java/util/jar/JarEntry.java Sat Nov 18 02:00:06 2000 --- gcc-3.1/libjava/java/util/jar/JarEntry.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.jar; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.jar; *************** import java.util.zip.ZipEntry; *** 46,52 **** public class JarEntry extends ZipEntry { ! // (Packge local) fields Attributes attr; Certificate certs[]; --- 57,63 ---- public class JarEntry extends ZipEntry { ! // (Package local) fields Attributes attr; Certificate certs[]; diff -Nrc3pad gcc-3.0.4/libjava/java/util/jar/JarException.java gcc-3.1/libjava/java/util/jar/JarException.java *** gcc-3.0.4/libjava/java/util/jar/JarException.java Sat Nov 18 02:00:06 2000 --- gcc-3.1/libjava/java/util/jar/JarException.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.jar; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.jar; diff -Nrc3pad gcc-3.0.4/libjava/java/util/jar/JarFile.java gcc-3.1/libjava/java/util/jar/JarFile.java *** gcc-3.0.4/libjava/java/util/jar/JarFile.java Sat Nov 18 02:00:06 2000 --- gcc-3.1/libjava/java/util/jar/JarFile.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.jar; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.jar; diff -Nrc3pad gcc-3.0.4/libjava/java/util/jar/JarInputStream.java gcc-3.1/libjava/java/util/jar/JarInputStream.java *** gcc-3.0.4/libjava/java/util/jar/JarInputStream.java Sat Nov 18 02:00:06 2000 --- gcc-3.1/libjava/java/util/jar/JarInputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.jar; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.jar; *************** public class JarInputStream extends ZipI *** 75,81 **** * tries to verify all the entry signatures while reading. * * @param in InputStream to read the jar from ! * @param verify wheter or not to verify the manifest entries * @exception IOException when an error occurs when opening or reading */ public JarInputStream(InputStream in, boolean verify) throws IOException --- 86,92 ---- * tries to verify all the entry signatures while reading. * * @param in InputStream to read the jar from ! * @param verify whether or not to verify the manifest entries * @exception IOException when an error occurs when opening or reading */ public JarInputStream(InputStream in, boolean verify) throws IOException diff -Nrc3pad gcc-3.0.4/libjava/java/util/jar/JarOutputStream.java gcc-3.1/libjava/java/util/jar/JarOutputStream.java *** gcc-3.0.4/libjava/java/util/jar/JarOutputStream.java Sat Nov 18 02:00:06 2000 --- gcc-3.1/libjava/java/util/jar/JarOutputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.jar; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.jar; *************** public class JarOutputStream extends Zip *** 93,99 **** * This implementation just calls super.putNextEntre(). * * @param entry The information for the next entry ! * @exception IOException when some unexpected I/O exception occured */ public void putNextEntry(ZipEntry entry) throws IOException { --- 104,110 ---- * This implementation just calls super.putNextEntre(). * * @param entry The information for the next entry ! * @exception IOException when some unexpected I/O exception occurred */ public void putNextEntry(ZipEntry entry) throws IOException { diff -Nrc3pad gcc-3.0.4/libjava/java/util/jar/Manifest.java gcc-3.1/libjava/java/util/jar/Manifest.java *** gcc-3.0.4/libjava/java/util/jar/Manifest.java Sat Nov 18 02:00:06 2000 --- gcc-3.1/libjava/java/util/jar/Manifest.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.jar; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.jar; diff -Nrc3pad gcc-3.0.4/libjava/java/util/natGregorianCalendar.cc gcc-3.1/libjava/java/util/natGregorianCalendar.cc *** gcc-3.0.4/libjava/java/util/natGregorianCalendar.cc Fri Apr 20 09:41:11 2001 --- gcc-3.1/libjava/java/util/natGregorianCalendar.cc Thu Jan 1 00:00:00 1970 *************** *** 1,159 **** - /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - #include - - #ifdef ECOS - #include - #endif - - #include - #include - #include - #include - #include - - void - java::util::GregorianCalendar::computeTime () - { - struct tm tim; - tim.tm_sec = elements(fields)[SECOND]; - tim.tm_min = elements(fields)[MINUTE]; - tim.tm_hour = elements(fields)[HOUR_OF_DAY]; - tim.tm_mday = elements(fields)[DATE]; - tim.tm_mon = elements(fields)[MONTH]; - tim.tm_year = elements(fields)[YEAR] - 1900; - tim.tm_isdst = 0; - #ifndef ECOS - // FIXME: None of the standard C library access to the ECOS calendar - // is yet available. - time_t t = mktime (&tim); - - if (!isLenient ()) - { - // mktime will correct for any time leniencies (e.g. 31-Apr becomes - // 1-May). - // Daylight savings time is a special case since times in hour 23 - // will compute to hour 0 of the next day. - if (tim.tm_isdst == 0 || elements(fields)[HOUR_OF_DAY] != 23) - { - if (tim.tm_sec != elements(fields)[SECOND] || - tim.tm_min != elements(fields)[MINUTE] || - tim.tm_hour != elements(fields)[HOUR_OF_DAY] + - (tim.tm_isdst > 0 ? 1 : 0) || - tim.tm_mday != elements(fields)[DATE] || - tim.tm_mon != elements(fields)[MONTH] || - tim.tm_year != elements(fields)[YEAR] - 1900) - throw new java::lang::IllegalArgumentException (); - } - else - { - // The easiest thing to do is to temporarily shift the clock - // back from the 23th hour so mktime doesn't cause the extra - // hour for DST to roll the date to the next day. - struct tm tmp_tim; - tmp_tim.tm_sec = elements(fields)[SECOND]; - tmp_tim.tm_min = elements(fields)[MINUTE]; - tmp_tim.tm_hour = elements(fields)[HOUR_OF_DAY] - 1; - tmp_tim.tm_mday = elements(fields)[DATE]; - tmp_tim.tm_mon = elements(fields)[MONTH]; - tmp_tim.tm_year = elements(fields)[YEAR] - 1900; - tmp_tim.tm_isdst = 0; - mktime (&tmp_tim); - if (tmp_tim.tm_sec != elements(fields)[SECOND] || - tmp_tim.tm_min != elements(fields)[MINUTE] || - tmp_tim.tm_hour != elements(fields)[HOUR_OF_DAY] || - tmp_tim.tm_mday != elements(fields)[DATE] || - tmp_tim.tm_mon != elements(fields)[MONTH] || - tmp_tim.tm_year != elements(fields)[YEAR] - 1900) - throw new java::lang::IllegalArgumentException (); - } - } - #else - time_t t = 0; - #endif - - // Adjust for local timezone (introduced by mktime) and our - // timezone. - #if defined (STRUCT_TM_HAS_GMTOFF) - t -= tim.tm_gmtoff; - #elif defined (HAVE_TIMEZONE) - t += timezone; - #endif - // Adjust for milliseconds. - time = t * (jlong) 1000 + elements(fields)[MILLISECOND]; - - // Now adjust for the real timezone, i.e. our timezone, which is in millis. - java::util::TimeZone *zone = getTimeZone (); - time += zone->getRawOffset(); - - isTimeSet = true; - } - - void - java::util::GregorianCalendar::computeFields () - { - time_t t = time / 1000; - int millis = time % 1000; - if (t < 0 && millis != 0) - { - t--; - millis = t - 1000 * t; - } - elements(fields)[MILLISECOND] = millis; - struct tm tim; - java::util::TimeZone *zone = getTimeZone (); - - // FIXME: None of the standard C library access to the ECOS calendar - // is yet available. - #ifdef ECOS - memset (&tim, 0, sizeof tim); - #else - if (zone->getRawOffset() == 0 || ! zone->useDaylightTime()) - { - #if defined(__JV_POSIX_THREADS__) && defined(HAVE_GMTIME_R) - gmtime_r (&t, &tim); - #else - // Get global lock (because gmtime uses a global buffer). FIXME - tim = *(struct tm*) gmtime (&t); - // Release global lock. FIXME - #endif - } - else - { - #if defined(__JV_POSIX_THREADS__) && defined(HAVE_LOCALTIME_R) - localtime_r (&t, &tim); - #else - // Get global lock (because localtime uses a global buffer). FIXME - tim = *(struct tm*) localtime (&t); - // Release global lock. FIXME - #endif - } - #endif /* ECOS */ - elements(fields)[SECOND] = tim.tm_sec; - elements(fields)[MINUTE] = tim.tm_min; - elements(fields)[HOUR_OF_DAY] = tim.tm_hour; - elements(fields)[AM_PM] = tim.tm_hour < 12 ? AM : PM; - elements(fields)[HOUR] = tim.tm_hour % 12; - elements(fields)[DATE] = tim.tm_mday; - elements(fields)[MONTH] = tim.tm_mon; - elements(fields)[YEAR] = 1900 + tim.tm_year; - elements(fields)[DAY_OF_WEEK] = tim.tm_wday + 1; - elements(fields)[DAY_OF_WEEK_IN_MONTH] = ((tim.tm_mday - 1) / 7) + 1; - elements(fields)[DAY_OF_YEAR] = tim.tm_yday + 1; - elements(fields)[WEEK_OF_MONTH] - = (tim.tm_mday + 6 + (5 - tim.tm_wday + getFirstDayOfWeek()) % 7) / 7; - elements(fields)[WEEK_OF_YEAR] - = (tim.tm_yday + 7 + (5 - tim.tm_wday + getFirstDayOfWeek()) % 7) / 7; - elements(fields)[ERA] = AD; - elements(fields)[DST_OFFSET] = tim.tm_isdst <= 0 ? 0 : 60*60*1000; - elements(fields)[ZONE_OFFSET] = getTimeZone()->getRawOffset(); - areFieldsSet = true; - for (int i = 0; i < FIELD_COUNT; i++) - elements(isSet__)[i] = true; - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/Adler32.java gcc-3.1/libjava/java/util/zip/Adler32.java *** gcc-3.0.4/libjava/java/util/zip/Adler32.java Fri Nov 17 21:42:27 2000 --- gcc-3.1/libjava/java/util/zip/Adler32.java Tue Jan 22 22:40:41 2002 *************** *** 1,5 **** ! /* Adler.java - Computes Adler32 data checksum of a data stream ! Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- ! /* Adler32.java - Computes Adler32 data checksum of a data stream ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; *************** package java.util.zip; *** 34,62 **** */ /** ! * Computes Adler32 data checksum of a data stream. ! * The actual Adler32 algorithm is described in RFC 1950 ! * (ZLIB Compressed Data Format Specification version 3.3). ! * Can be used to get the CRC32 over a stream if used with checked input/output ! * streams. * ! * @see InflaterInputStream ! * @see InflaterOutputStream * ! * @author Per Bothner ! * @date April 6, 1999. */ public class Adler32 implements Checksum { /** largest prime smaller than 65536 */ ! private static int BASE = 65521; ! ! private int s1; ! private int s2; /** ! * Creates an Adler32 data checksum. */ public Adler32 () { --- 45,115 ---- */ /** ! * Computes Adler32 checksum for a stream of data. An Adler32 ! * checksum is not as reliable as a CRC32 checksum, but a lot faster to ! * compute. ! *

          ! * The specification for Adler32 may be found in RFC 1950. ! * (ZLIB Compressed Data Format Specification version 3.3) ! *

          ! *

          ! * From that document: ! *

          ! * "ADLER32 (Adler-32 checksum) ! * This contains a checksum value of the uncompressed data ! * (excluding any dictionary data) computed according to Adler-32 ! * algorithm. This algorithm is a 32-bit extension and improvement ! * of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 ! * standard. ! *

          ! * Adler-32 is composed of two sums accumulated per byte: s1 is ! * the sum of all bytes, s2 is the sum of all s1 values. Both sums ! * are done modulo 65521. s1 is initialized to 1, s2 to zero. The ! * Adler-32 checksum is stored as s2*65536 + s1 in most- ! * significant-byte first (network) order." ! *

          ! * "8.2. The Adler-32 algorithm ! *

          ! * The Adler-32 algorithm is much faster than the CRC32 algorithm yet ! * still provides an extremely low probability of undetected errors. ! *

          ! * The modulo on unsigned long accumulators can be delayed for 5552 ! * bytes, so the modulo operation time is negligible. If the bytes ! * are a, b, c, the second sum is 3a + 2b + c + 3, and so is position ! * and order sensitive, unlike the first sum, which is just a ! * checksum. That 65521 is prime is important to avoid a possible ! * large class of two-byte errors that leave the check unchanged. ! * (The Fletcher checksum uses 255, which is not prime and which also ! * makes the Fletcher check insensitive to single byte changes 0 <-> ! * 255.) ! *

          ! * The sum s1 is initialized to 1 instead of zero to make the length ! * of the sequence part of s2, so that the length does not have to be ! * checked separately. (Any sequence of zeroes has a Fletcher ! * checksum of zero.)" * ! * @author John Leuner, Per Bothner ! * @since JDK 1.1 * ! * @see InflaterInputStream ! * @see DeflaterOutputStream */ public class Adler32 implements Checksum { /** largest prime smaller than 65536 */ ! private static final int BASE = 65521; ! ! private int checksum; //we do all in int. ! ! //Note that java doesn't have unsigned integers, ! //so we have to be careful with what arithmetic ! //we do. We return the checksum as a long to ! //avoid sign confusion. /** ! * Creates a new instance of the Adler32 class. ! * The checksum starts off with a value of 1. */ public Adler32 () { *************** public class Adler32 implements Checksum *** 64,86 **** } /** ! * Resets the Adler32 data checksum as if no update was ever called. */ ! public void reset () { s1 = 1; s2 = 0; } /** ! * Adds one byte to the data checksum. * * @param bval the data value to add. The high byte of the int is ignored. */ public void update (int bval) { s1 = (s1 + (bval & 0xFF)) % BASE; s2 = (s1 + s2) % BASE; } /** ! * Adds the complete byte array to the data checksum. */ public void update (byte[] buffer) { --- 117,151 ---- } /** ! * Resets the Adler32 checksum to the initial value. */ ! public void reset () ! { ! checksum = 1; //Initialize to 1 ! } /** ! * Updates the checksum with the byte b. * * @param bval the data value to add. The high byte of the int is ignored. */ public void update (int bval) { + //We could make a length 1 byte array and call update again, but I + //would rather not have that overhead + int s1 = checksum & 0xffff; + int s2 = checksum >>> 16; + s1 = (s1 + (bval & 0xFF)) % BASE; s2 = (s1 + s2) % BASE; + + checksum = (s2 << 16) + s1; } /** ! * Updates the checksum with the bytes taken from the array. ! * ! * @param buffer an array of bytes */ public void update (byte[] buffer) { *************** public class Adler32 implements Checksum *** 88,107 **** } /** ! * Adds the byte array to the data checksum. ! * ! * @param buf the buffer which contains the data ! * @param off the offset in the buffer where the data starts ! * @param len the length of the data */ public void update (byte[] buf, int off, int len) { ! int s1 = this.s1; ! int s2 = this.s2; while (len > 0) { ! // We can defer the modulo operation. ! int n = 4000; if (n > len) n = len; len -= n; --- 153,176 ---- } /** ! * Updates the checksum with the bytes taken from the array. ! * ! * @param buf an array of bytes ! * @param off the start of the data used for this update ! * @param len the number of bytes to use for this update */ public void update (byte[] buf, int off, int len) { ! //(By Per Bothner) ! int s1 = checksum & 0xffff; ! int s2 = checksum >>> 16; ! while (len > 0) { ! // We can defer the modulo operation: ! // s1 maximally grows from 65521 to 65521 + 255 * 3800 ! // s2 maximally grows by 3800 * median(s1) = 2090079800 < 2^31 ! int n = 3800; if (n > len) n = len; len -= n; *************** public class Adler32 implements Checksum *** 113,120 **** s1 %= BASE; s2 %= BASE; } ! this.s1 = s1; ! this.s2 = s2; } /** --- 182,198 ---- s1 %= BASE; s2 %= BASE; } ! ! /*Old implementation, borrowed from somewhere: ! int n; ! ! while (len-- > 0) { ! ! s1 = (s1 + (bs[offset++] & 0xff)) % BASE; ! s2 = (s2 + s1) % BASE; ! }*/ ! ! checksum = (s2 << 16) | s1; } /** *************** public class Adler32 implements Checksum *** 122,127 **** */ public long getValue() { ! return ((long) s2 << 16) + s1; } } --- 200,205 ---- */ public long getValue() { ! return (long) checksum & 0xffffffffL; } } diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/CRC32.java gcc-3.1/libjava/java/util/zip/CRC32.java *** gcc-3.0.4/libjava/java/util/zip/CRC32.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/CRC32.java Tue Jan 22 22:40:41 2002 *************** *** 1,5 **** /* CRC32.java - Computes CRC32 data checksum of a data stream ! Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* CRC32.java - Computes CRC32 data checksum of a data stream ! Copyright (C) 1999. 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; *************** package java.util.zip; *** 41,47 **** * streams. * * @see InflaterInputStream ! * @see InflaterOutputStream * * @author Per Bothner * @date April 1, 1999. --- 52,58 ---- * streams. * * @see InflaterInputStream ! * @see DeflaterOutputStream * * @author Per Bothner * @date April 1, 1999. *************** public class CRC32 implements Checksum *** 86,91 **** --- 97,108 ---- */ public void reset () { crc = 0; } + /** + * Updates the checksum with the int bval. + * + * @param bval (the byte is taken as the lower 8 bits of bval) + */ + public void update (int bval) { int c = ~crc; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/CheckedInputStream.java gcc-3.1/libjava/java/util/zip/CheckedInputStream.java *** gcc-3.0.4/libjava/java/util/zip/CheckedInputStream.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/CheckedInputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/CheckedOutputStream.java gcc-3.1/libjava/java/util/zip/CheckedOutputStream.java *** gcc-3.0.4/libjava/java/util/zip/CheckedOutputStream.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/CheckedOutputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/Checksum.java gcc-3.1/libjava/java/util/zip/Checksum.java *** gcc-3.0.4/libjava/java/util/zip/Checksum.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/Checksum.java Tue Jan 22 22:40:41 2002 *************** *** 1,5 **** /* Checksum.java - Interface to compute a data checksum ! Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* Checksum.java - Interface to compute a data checksum ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; *************** package java.util.zip; *** 43,49 **** * @see CheckedOutputStream * * @author Per Bothner ! * @date January 9, 1999. */ public interface Checksum { --- 54,60 ---- * @see CheckedOutputStream * * @author Per Bothner ! * @author Jochen Hoenicke */ public interface Checksum { diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/DataFormatException.java gcc-3.1/libjava/java/util/zip/DataFormatException.java *** gcc-3.0.4/libjava/java/util/zip/DataFormatException.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/DataFormatException.java Tue Jan 22 22:40:41 2002 *************** *** 1,5 **** /* DataformatException.java - Exception thrown when compressed data is corrupt ! Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* DataformatException.java - Exception thrown when compressed data is corrupt ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,35 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ ! package java.util.zip; ! /** ! * @author Tom Tromey ! * @date May 17, 1999 ! */ /* Written using on-line Java Platform 1.2 API Specification. * Believed complete and correct. --- 18,41 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.util.zip; /* Written using on-line Java Platform 1.2 API Specification. * Believed complete and correct. *************** package java.util.zip; *** 37,42 **** --- 43,52 ---- /** * Exception thrown when compressed data is corrupt. + * + * @author Tom Tromey + * @author John Leuner + * @since JDK 1.1 */ public class DataFormatException extends Exception { diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/Deflater.java gcc-3.1/libjava/java/util/zip/Deflater.java *** gcc-3.0.4/libjava/java/util/zip/Deflater.java Thu Dec 21 18:39:19 2000 --- gcc-3.1/libjava/java/util/zip/Deflater.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/DeflaterOutputStream.java gcc-3.1/libjava/java/util/zip/DeflaterOutputStream.java *** gcc-3.0.4/libjava/java/util/zip/DeflaterOutputStream.java Sun Apr 1 21:24:31 2001 --- gcc-3.1/libjava/java/util/zip/DeflaterOutputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/GZIPInputStream.java gcc-3.1/libjava/java/util/zip/GZIPInputStream.java *** gcc-3.0.4/libjava/java/util/zip/GZIPInputStream.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/GZIPInputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/GZIPOutputStream.java gcc-3.1/libjava/java/util/zip/GZIPOutputStream.java *** gcc-3.0.4/libjava/java/util/zip/GZIPOutputStream.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/GZIPOutputStream.java Tue Jan 22 22:40:41 2002 *************** *** 1,5 **** /* GZIPOutputStream.java - Create a file in gzip format ! Copyright (C) 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* GZIPOutputStream.java - Create a file in gzip format ! Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; *************** public class GZIPOutputStream extends De *** 78,83 **** --- 89,100 ---- crc = new CRC32 (); } + public synchronized void write (int bval) throws IOException + { + super.write (bval); + crc.update (bval); + } + public synchronized void write (byte[] buf) throws IOException { write (buf, 0, buf.length); diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/Inflater.java gcc-3.1/libjava/java/util/zip/Inflater.java *** gcc-3.0.4/libjava/java/util/zip/Inflater.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/Inflater.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/InflaterInputStream.java gcc-3.1/libjava/java/util/zip/InflaterInputStream.java *** gcc-3.0.4/libjava/java/util/zip/InflaterInputStream.java Wed Nov 29 10:37:40 2000 --- gcc-3.1/libjava/java/util/zip/InflaterInputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/ZipConstants.java gcc-3.1/libjava/java/util/zip/ZipConstants.java *** gcc-3.0.4/libjava/java/util/zip/ZipConstants.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/ZipConstants.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/ZipEntry.java gcc-3.1/libjava/java/util/zip/ZipEntry.java *** gcc-3.0.4/libjava/java/util/zip/ZipEntry.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/ZipEntry.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/ZipException.java gcc-3.1/libjava/java/util/zip/ZipException.java *** gcc-3.0.4/libjava/java/util/zip/ZipException.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/ZipException.java Tue Jan 22 22:40:41 2002 *************** *** 1,5 **** /* ZipException.java - Exception representing a zip related error ! Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU Classpath. --- 1,5 ---- /* ZipException.java - Exception representing a zip related error ! Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU Classpath. *************** GNU Classpath is free software; you can *** 7,13 **** it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --- 7,13 ---- it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ! GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *************** along with GNU Classpath; see the file C *** 18,40 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ ! package java.util.zip; ! /** ! * @author Per Bothner ! * @date January 9, 1999. ! */ /* Written using on-line Java Platform 1.2 API Specification. * Believed complete and correct. */ public class ZipException extends java.io.IOException { public ZipException () --- 18,53 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! package java.util.zip; /* Written using on-line Java Platform 1.2 API Specification. * Believed complete and correct. */ + /** + * Is thrown during the creation or input of a zip file. + * + * @author Jochen Hoenicke + * @author Per Bothner + * @since JDK 1.1 + */ public class ZipException extends java.io.IOException { public ZipException () diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/ZipFile.java gcc-3.1/libjava/java/util/zip/ZipFile.java *** gcc-3.0.4/libjava/java/util/zip/ZipFile.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/ZipFile.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/ZipInputStream.java gcc-3.1/libjava/java/util/zip/ZipInputStream.java *** gcc-3.0.4/libjava/java/util/zip/ZipInputStream.java Fri Nov 17 21:42:28 2000 --- gcc-3.1/libjava/java/util/zip/ZipInputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; import java.io.*; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; import java.io.*; diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/ZipOutputStream.java gcc-3.1/libjava/java/util/zip/ZipOutputStream.java *** gcc-3.0.4/libjava/java/util/zip/ZipOutputStream.java Sun Apr 1 21:24:31 2001 --- gcc-3.1/libjava/java/util/zip/ZipOutputStream.java Tue Jan 22 22:40:41 2002 *************** along with GNU Classpath; see the file C *** 18,28 **** Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! As a special exception, if you link this library with other files to ! produce an executable, this library does not by itself cause the ! resulting executable to be covered by the GNU General Public License. ! This exception does not however invalidate any other reasons why the ! executable file might be covered by the GNU General Public License. */ package java.util.zip; --- 18,39 ---- Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package java.util.zip; *************** public class ZipOutputStream extends Def *** 237,242 **** --- 248,254 ---- def.reset(); def.setLevel(compr); sum.reset(); + uncompressed_size = 0; } public void setLevel (int level) diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/natDeflater.cc gcc-3.1/libjava/java/util/zip/natDeflater.cc *** gcc-3.0.4/libjava/java/util/zip/natDeflater.cc Tue Mar 7 19:55:28 2000 --- gcc-3.1/libjava/java/util/zip/natDeflater.cc Mon Mar 26 07:05:32 2001 *************** java::util::zip::Deflater::deflate (jbyt *** 37,45 **** z_streamp s = (z_streamp) zstream; if (! buf) ! _Jv_Throw (new java::lang::NullPointerException); if (off < 0 || len < 0 || off + len > buf->length) ! _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException); if (len == 0) return 0; --- 37,45 ---- z_streamp s = (z_streamp) zstream; if (! buf) ! throw new java::lang::NullPointerException; if (off < 0 || len < 0 || off + len > buf->length) ! throw new java::lang::ArrayIndexOutOfBoundsException; if (len == 0) return 0; *************** java::util::zip::Deflater::deflate (jbyt *** 58,64 **** case Z_STREAM_ERROR: case Z_BUF_ERROR: // FIXME? ! _Jv_Throw (new java::lang::InternalError); break; case Z_OK: --- 58,64 ---- case Z_STREAM_ERROR: case Z_BUF_ERROR: // FIXME? ! throw new java::lang::InternalError; break; case Z_OK: *************** java::util::zip::Deflater::setDictionary *** 134,142 **** z_streamp s = (z_streamp) zstream; if (! buf) ! _Jv_Throw (new java::lang::NullPointerException); if (off < 0 || len < 0 || off + len > buf->length) ! _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException); // Ignore errors. deflateSetDictionary (s, (Bytef *) (elements (buf) + off), len); --- 134,142 ---- z_streamp s = (z_streamp) zstream; if (! buf) ! throw new java::lang::NullPointerException; if (off < 0 || len < 0 || off + len > buf->length) ! throw new java::lang::ArrayIndexOutOfBoundsException; // Ignore errors. deflateSetDictionary (s, (Bytef *) (elements (buf) + off), len); *************** java::util::zip::Deflater::setInput (jby *** 149,157 **** z_streamp s = (z_streamp) zstream; if (! buf) ! _Jv_Throw (new java::lang::NullPointerException); if (off < 0 || len < 0 || off + len > buf->length) ! _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException); s->next_in = (Bytef *) (elements (buf) + off); s->avail_in = len; --- 149,157 ---- z_streamp s = (z_streamp) zstream; if (! buf) ! throw new java::lang::NullPointerException; if (off < 0 || len < 0 || off + len > buf->length) ! throw new java::lang::ArrayIndexOutOfBoundsException; s->next_in = (Bytef *) (elements (buf) + off); s->avail_in = len; *************** java::util::zip::Deflater::init (jint le *** 205,211 **** jstring msg = NULL; if (stream->msg != NULL) msg = JvNewStringLatin1 (stream->msg); ! _Jv_Throw (new java::lang::InternalError (msg)); } zstream = reinterpret_cast (stream); --- 205,211 ---- jstring msg = NULL; if (stream->msg != NULL) msg = JvNewStringLatin1 (stream->msg); ! throw new java::lang::InternalError (msg); } zstream = reinterpret_cast (stream); diff -Nrc3pad gcc-3.0.4/libjava/java/util/zip/natInflater.cc gcc-3.1/libjava/java/util/zip/natInflater.cc *** gcc-3.0.4/libjava/java/util/zip/natInflater.cc Mon Dec 18 01:00:23 2000 --- gcc-3.1/libjava/java/util/zip/natInflater.cc Mon Mar 26 07:05:32 2001 *************** java::util::zip::Inflater::inflate (jbyt *** 94,102 **** z_streamp s = (z_streamp) zstream; if (! buf) ! _Jv_Throw (new java::lang::NullPointerException); if (off < 0 || len < 0 || off + len > buf->length) ! _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException); if (len == 0) return 0; --- 94,102 ---- z_streamp s = (z_streamp) zstream; if (! buf) ! throw new java::lang::NullPointerException; if (off < 0 || len < 0 || off + len > buf->length) ! throw new java::lang::ArrayIndexOutOfBoundsException; if (len == 0) return 0; *************** java::util::zip::Inflater::inflate (jbyt *** 127,138 **** break; case Z_DATA_ERROR: ! _Jv_Throw (new java::util::zip::DataFormatException ! (s->msg == NULL ? NULL : JvNewStringLatin1 (s->msg))); break; case Z_MEM_ERROR: ! _Jv_Throw (new java::lang::OutOfMemoryError); break; case Z_OK: --- 127,138 ---- break; case Z_DATA_ERROR: ! throw new java::util::zip::DataFormatException ! (s->msg == NULL ? NULL : JvNewStringLatin1 (s->msg)); break; case Z_MEM_ERROR: ! throw new java::lang::OutOfMemoryError; break; case Z_OK: *************** java::util::zip::Inflater::setDictionary *** 158,166 **** z_streamp s = (z_streamp) zstream; if (! buf) ! _Jv_Throw (new java::lang::NullPointerException); if (off < 0 || len < 0 || off + len > buf->length) ! _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException); // Ignore errors. inflateSetDictionary (s, (Bytef *) (elements (buf) + off), len); --- 158,166 ---- z_streamp s = (z_streamp) zstream; if (! buf) ! throw new java::lang::NullPointerException; if (off < 0 || len < 0 || off + len > buf->length) ! throw new java::lang::ArrayIndexOutOfBoundsException; // Ignore errors. inflateSetDictionary (s, (Bytef *) (elements (buf) + off), len); *************** java::util::zip::Inflater::setInput (jby *** 174,182 **** z_streamp s = (z_streamp) zstream; if (! buf) ! _Jv_Throw (new java::lang::NullPointerException); if (off < 0 || len < 0 || off + len > buf->length) ! _Jv_Throw (new java::lang::ArrayIndexOutOfBoundsException); s->next_in = (Bytef *) (elements (buf) + off); s->avail_in = len; --- 174,182 ---- z_streamp s = (z_streamp) zstream; if (! buf) ! throw new java::lang::NullPointerException; if (off < 0 || len < 0 || off + len > buf->length) ! throw new java::lang::ArrayIndexOutOfBoundsException; s->next_in = (Bytef *) (elements (buf) + off); s->avail_in = len; *************** java::util::zip::Inflater::init (jboolea *** 202,208 **** jstring msg = NULL; if (stream->msg != NULL) msg = JvNewStringLatin1 (stream->msg); ! _Jv_Throw (new java::lang::InternalError (msg)); } zstream = reinterpret_cast (stream); --- 202,208 ---- jstring msg = NULL; if (stream->msg != NULL) msg = JvNewStringLatin1 (stream->msg); ! throw new java::lang::InternalError (msg); } zstream = reinterpret_cast (stream); diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/BinaryRefAddr.java gcc-3.1/libjava/javax/naming/BinaryRefAddr.java *** gcc-3.0.4/libjava/javax/naming/BinaryRefAddr.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/BinaryRefAddr.java Tue Jan 22 22:40:42 2002 *************** *** 0 **** --- 1,155 ---- + /* BinaryRefAddr.java -- RefAddr that uses a byte array as content. + Copyright (C) 2001 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + package javax.naming; + + import java.util.Arrays; + + /** + * RefAddr that uses a byte array as content. + * This can be used to reference objects that can only be represented as + * byte arrays. + * + * @see Reference + * @since 1.3 + * @author Mark Wielaard (mark@klomp.org) + */ + public class BinaryRefAddr extends RefAddr + { + + /** + * The possibly null content of this RefAddr. + * Set by the constructor and returned by getContent. + */ + private final byte[] buf; + + /** + * Contructs a new BinaryRefAddr with the given type and content. + * The complete content of the byte array is copied to a new array. + */ + public BinaryRefAddr (String addrType, byte[] buf) + { + this(addrType, buf, 0, buf.length); + } + + /** + * Contructs a new BinaryRefAddr with the given type and the content + * taken from the given byte array. + * The content of the byte array is copied to a new array. + */ + public BinaryRefAddr (String addrType, byte[] buf, int off, int length) + { + super(addrType); + this.buf = new byte[length]; + System.arraycopy(buf, off, this.buf, 0, length); + } + + /** + * Returns the byte array contents as given to the constructor. + * The returned byte array is shared with this object and other callers. + * Changing the content of the buffer is discouraged and should only be + * done when the byte array is locked. + */ + public Object getContent () + { + return buf; + } + + /** + * Checks if the object is a BinaryRefAddr with the same type and with the + * same bytes in the content. + * + * @return true if the given object is an instance of BinaryRefAddr, + * the addrType is the same as this addrType and the bytes of the + * content are the same. + */ + public boolean equals (Object o) + { + if (o instanceof BinaryRefAddr) + { + BinaryRefAddr refAddr = (BinaryRefAddr) o; + if (this.getType().equals(refAddr.getType())) + { + byte[] c1 = (byte[]) this.getContent(); + byte[] c2 = (byte[]) refAddr.getContent(); + return Arrays.equals(c1, c2); + } + } + return false; + } + + /** + * Returns the hashCode which is the hasCode of the String returned by + * getType() plus the hashCode of the byte array returned by + * getContent. The hashCode of the byte array is calculated + * by taking the xor of all the bytes in the array, or zero when there are + * no bytes in the array. + */ + public int hashCode() + { + int result = 0; + byte[] b = (byte[]) getContent(); + for (int i=0; i < b.length; i++) + result = result^b[i]; + + return getType().hashCode() + result; + } + + private static char[] hex = {'0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + /** + * Returns a String representation of the RefAddr. Only the first 32 bytes + * of the content are added as hex encoded characters. + * Should only be used for debugging purposes. + */ + public String toString() + { + StringBuffer sb = new StringBuffer("[RefAddr type: "); + sb.append(getType()); + sb.append(" content: 0x"); + byte[] b = (byte[]) getContent(); + for (int i=0; i < b.length && i < 32; i++) + { + sb.append(hex[(b[i]&0xf0)>>4]); + sb.append(hex[b[i]&0x0f]); + } + if (b.length > 32) + sb.append("..."); + sb.append("]"); + return sb.toString(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/Binding.java gcc-3.1/libjava/javax/naming/Binding.java *** gcc-3.0.4/libjava/javax/naming/Binding.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/Binding.java Wed Oct 24 21:39:15 2001 *************** *** 0 **** --- 1,68 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming; + + /** + * @author Tom Tromey + * @date May 16, 2001 + */ + public class Binding extends NameClassPair + { + public Binding (String name, Object obj) + { + super (name, null); + boundObj = obj; + } + + public Binding (String name, Object obj, boolean isRelative) + { + super (name, null, isRelative); + boundObj = obj; + } + + public Binding (String name, String className, Object obj) + { + super (name, className); + boundObj = obj; + } + + public Binding (String name, String className, Object obj, + boolean isRelative) + { + super (name, className, isRelative); + boundObj = obj; + } + + public String getClassName () + { + String r = super.getClassName (); + if (r != null) + return r; + return boundObj == null ? null : boundObj.getClass ().getName (); + } + + public Object getObject () + { + return boundObj; + } + + public void setObject (Object obj) + { + boundObj = obj; + } + + public String toString () + { + // Format specified by the documentation. + return super.toString () + ":" + boundObj.toString (); + } + + // This name is fixed by the serialization spec. + private Object boundObj; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/CannotProceedException.java gcc-3.1/libjava/javax/naming/CannotProceedException.java *** gcc-3.0.4/libjava/javax/naming/CannotProceedException.java Mon Nov 27 05:57:58 2000 --- gcc-3.1/libjava/javax/naming/CannotProceedException.java Wed Oct 24 21:39:15 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 9,17 **** --- 9,29 ---- package javax.naming; import java.lang.Exception; + import java.util.Hashtable; + /** + * @author Warren Levy + * @date June 14, 2001 + */ + public class CannotProceedException extends NamingException { + // Serialized fields. + protected Name remainingNewName; + protected Hashtable environment; + protected Name altName; + protected Context altNameCtx; + public CannotProceedException () { super (); *************** public class CannotProceedException exte *** 21,24 **** --- 33,76 ---- { super (msg); } + + public Hashtable getEnvironment() + { + return environment; + } + + public void setEnvironment(Hashtable environment) + { + this.environment = environment; + } + + public Name getRemainingNewName() + { + return remainingNewName; + } + + public void setRemainingNewName(Name newName) + { + remainingNewName = (Name) newName.clone(); + } + + public Name getAltName() + { + return altName; + } + + public void setAltName(Name altName) + { + this.altName = altName; + } + + public Context getAltNameCtx() + { + return altNameCtx; + } + + public void setAltNameCtx(Context altNameCtx) + { + this.altNameCtx = altNameCtx; + } } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/CompositeName.java gcc-3.1/libjava/javax/naming/CompositeName.java *** gcc-3.0.4/libjava/javax/naming/CompositeName.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/CompositeName.java Wed Oct 24 21:39:15 2001 *************** *** 0 **** --- 1,289 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming; + + import java.io.Serializable; + import java.util.Enumeration; + import java.util.NoSuchElementException; + import java.util.Vector; + + /** + * @author Tom Tromey + * @date May 16, 2001 + * + * FIXME: must write readObject and writeObject to conform to + * serialization spec. + */ + public class CompositeName implements Name, Cloneable, Serializable + { + public CompositeName () + { + elts = new Vector (); + } + + protected CompositeName (Enumeration comps) + { + elts = new Vector (); + try + { + while (comps.hasMoreElements ()) + elts.add (comps.nextElement ()); + } + catch (NoSuchElementException ignore) + { + } + } + + public CompositeName (String n) throws InvalidNameException + { + elts = new Vector (); + // Parse the string into its components. + final char no_quote = 'x'; // Use 'x' to mean no quoting. + char quote = no_quote; + boolean escaped = false; + StringBuffer new_element = new StringBuffer (); + for (int i = 0; i < n.length (); ++i) + { + char c = n.charAt (i); + if (escaped) + escaped = false; + else if (c == '\\') + { + escaped = true; + continue; + } + else if (quote != no_quote) + { + if (quote == c) + { + // The quotes must surround a complete component. + if (i + 1 < n.length () && n.charAt (i + 1) != '/') + throw new InvalidNameException ("close quote before end of component"); + elts.add (new_element.toString ()); + new_element.setLength (0); + quote = no_quote; + continue; + } + // Otherwise, fall through. + } + // Quotes are only special at the start of a component. + else if (new_element.length () == 0 + && (c == '\'' || c == '"')) + { + quote = c; + continue; + } + else if (c == '/') + { + elts.add (new_element.toString ()); + new_element.setLength (0); + continue; + } + + new_element.append (c); + } + + if (new_element.length () != 0) + elts.add (new_element.toString ()); + + // Error checking. + if (quote != no_quote) + throw new InvalidNameException ("unterminated quote"); + if (escaped) + throw new InvalidNameException ("trailing escape character"); + } + + public Name add (int posn, String comp) throws InvalidNameException + { + elts.add (posn, comp); + return this; + } + + public Name add (String comp) throws InvalidNameException + { + elts.add (comp); + return this; + } + + public Name addAll (int posn, Name n) throws InvalidNameException + { + Enumeration e = n.getAll (); + try + { + while (e.hasMoreElements ()) + { + elts.add (posn, e.nextElement ()); + ++posn; + } + } + catch (NoSuchElementException ignore) + { + } + return this; + } + + public Name addAll (Name suffix) throws InvalidNameException + { + Enumeration e = suffix.getAll (); + try + { + while (e.hasMoreElements ()) + elts.add (e.nextElement ()); + } + catch (NoSuchElementException ignore) + { + } + return this; + } + + public Object clone () + { + return new CompositeName (elts.elements ()); + } + + public int compareTo (Object obj) + { + if (obj == null || ! (obj instanceof CompositeName)) + throw new ClassCastException ("CompositeName.compareTo() expected CompositeName"); + CompositeName cn = (CompositeName) obj; + int last = Math.min (cn.elts.size (), elts.size ()); + for (int i = 0; i < last; ++i) + { + String f = (String) elts.get (i); + int comp = f.compareTo ((String) cn.elts.get (i)); + if (comp != 0) + return comp; + } + return elts.size () - cn.elts.size (); + } + + public boolean endsWith (Name n) + { + if (! (n instanceof CompositeName)) + return false; + CompositeName cn = (CompositeName) n; + if (cn.elts.size () > elts.size ()) + return false; + int delta = elts.size () - cn.elts.size (); + for (int i = 0; i < cn.elts.size (); ++i) + { + if (! cn.elts.get (i).equals (elts.get (delta + i))) + return false; + } + return true; + } + + public boolean equals (Object obj) + { + if (! (obj instanceof CompositeName)) + return false; + CompositeName cn = (CompositeName) obj; + return elts.equals (cn.elts); + } + + public String get (int posn) + { + return (String) elts.get (posn); + } + + public Enumeration getAll () + { + return elts.elements (); + } + + public Name getPrefix (int posn) + { + CompositeName cn = new CompositeName (); + for (int i = 0; i < posn; ++i) + cn.elts.add ((String) elts.get (i)); + return cn; + } + + public Name getSuffix (int posn) + { + if (posn > elts.size ()) + throw new ArrayIndexOutOfBoundsException (posn); + CompositeName cn = new CompositeName (); + for (int i = posn; i < elts.size (); ++i) + cn.elts.add ((String) elts.get (i)); + return cn; + } + + public int hashCode () + { + // Specified in documentation. + int h = 0; + for (int i = 0; i < elts.size (); ++i) + h += elts.get (i).hashCode (); + return h; + } + + public boolean isEmpty () + { + return elts.isEmpty (); + } + + public Object remove (int posn) throws InvalidNameException + { + return elts.remove (posn); + } + + public int size () + { + return elts.size (); + } + + public boolean startsWith (Name n) + { + if (! (n instanceof CompositeName)) + return false; + CompositeName cn = (CompositeName) n; + if (cn.elts.size () > elts.size ()) + return false; + for (int i = 0; i < cn.elts.size (); ++i) + { + if (! cn.elts.get (i).equals (elts.get (i))) + return false; + } + return true; + } + + public String toString () + { + StringBuffer result = new StringBuffer (); + for (int i = 0; i < elts.size (); ++i) + { + // For simplicity we choose to always quote using escapes and + // never quotes. + String elt = (String) elts.get (i); + if (i > 0 + || (i == elts.size () - 1 && elt.equals (""))) + result.append ('/'); + for (int k = 0; k < elt.length (); ++k) + { + char c = elt.charAt (k); + // We must quote + // ... a leading quote, + if ((k == 0 && (c == '"' || c == '\'')) + // ... an escape preceding a meta character, + // or at the end of a component, + || (c == '\\' + && (k == elt.length () - 1 + || "\\'\"/".indexOf (elt.charAt (k + 1)) != -1)) + // ... or a component separator. + || c == '/') + result.append ('\\'); + result.append (c); + } + } + return result.toString (); + } + + private transient Vector elts; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/CompoundName.java gcc-3.1/libjava/javax/naming/CompoundName.java *** gcc-3.0.4/libjava/javax/naming/CompoundName.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/CompoundName.java Wed Oct 24 21:39:15 2001 *************** *** 0 **** --- 1,460 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming; + + import java.io.Serializable; + import java.util.Enumeration; + import java.util.Properties; + import java.util.NoSuchElementException; + import java.util.Vector; + + /** + * @author Tom Tromey + * @date May 16, 2001 + * + * FIXME: must write readObject and writeObject to conform to + * serialization spec. + * + * FIXME: this class is underspecified. For instance, the `flat' + * direction is never described. If it means that the CompoundName + * can only have a single element, then the Enumeration-based + * constructor ought to throw InvalidNameException. + */ + public class CompoundName implements Name, Cloneable, Serializable + { + private CompoundName (Properties syntax) + { + elts = new Vector (); + mySyntax = syntax; + initializeSyntax (); + } + + protected CompoundName (Enumeration comps, Properties syntax) + { + elts = new Vector (); + mySyntax = syntax; + initializeSyntax (); + try + { + while (comps.hasMoreElements ()) + elts.add (comps.nextElement ()); + } + catch (NoSuchElementException ignore) + { + } + } + + public CompoundName (String n, Properties syntax) + throws InvalidNameException + { + elts = new Vector (); + mySyntax = syntax; + initializeSyntax (); + + StringBuffer new_element = new StringBuffer (); + int i = 0; + // QUOTE==null means no quoting right now. When it is set it is + // the value of the closing quote. + String quote = null; + while (i < n.length ()) + { + String special = isSpecial (n, i); + + if (special == escape && escape != null) + { + if (n.length () == i + special.length ()) + { + // A trailing escape is treated as itself. + new_element.append (special); + i += special.length (); + } + else + { + String eSpecial = isSpecial (n, i + special.length ()); + if (eSpecial != null) + { + // Treat the escape as an escape. + new_element.append (eSpecial); + i += special.length () + eSpecial.length (); + } + else + { + // Treat the escape as itself. + new_element.append (special); + i += special.length (); + } + continue; + } + } + else if (quote != null) + { + // It is safe to use == here. + if (quote == special) + { + // Quotes must surround a complete component. + if (i + quote.length () < n.length () + && ! n.startsWith (separator, i + quote.length ())) + throw new InvalidNameException ("close quote before end of component"); + elts.add (new_element.toString ()); + new_element.setLength (0); + i += quote.length (); + quote = null; + continue; + } + // Otherwise, fall through. + } + // Quotes are only special at the start of a component. + else if (new_element.length () == 0 && special == beginQuote) + { + quote = endQuote; + i += special.length (); + continue; + } + else if (new_element.length () == 0 && special == beginQuote2) + { + quote = endQuote2; + i += special.length (); + continue; + } + else if (special == separator) + { + elts.add (new_element.toString ()); + new_element.setLength (0); + i += special.length (); + continue; + } + + // Nothing in particular, so try the next character. + new_element.append (n.charAt (i)); + ++i; + } + + if (new_element.length () != 0) + elts.add (new_element.toString ()); + + if (direction == RIGHT_TO_LEFT) + { + // Reverse the order of the elements. + int len = elts.size (); + for (i = 0; i < len / 2; ++i) + { + Object t = elts.set (i, elts.get (len - i - 1)); + elts.set (len - i - 1, t); + } + } + + // Error checking. + if (quote != null) + throw new InvalidNameException ("unterminated quote"); + } + + public Name add (int posn, String comp) throws InvalidNameException + { + elts.add (posn, comp); + return this; + } + + public Name add (String comp) throws InvalidNameException + { + elts.add (comp); + return this; + } + + public Name addAll (int posn, Name n) throws InvalidNameException + { + Enumeration e = n.getAll (); + try + { + while (e.hasMoreElements ()) + { + elts.add (posn, e.nextElement ()); + ++posn; + } + } + catch (NoSuchElementException ignore) + { + } + return this; + } + + public Name addAll (Name suffix) throws InvalidNameException + { + Enumeration e = suffix.getAll (); + try + { + while (e.hasMoreElements ()) + elts.add (e.nextElement ()); + } + catch (NoSuchElementException ignore) + { + } + return this; + } + + public Object clone () + { + return new CompoundName (elts.elements (), mySyntax); + } + + public int compareTo (Object obj) + { + if (obj == null || ! (obj instanceof CompoundName)) + throw new ClassCastException ("CompoundName.compareTo() expected CompoundName"); + CompoundName cn = (CompoundName) obj; + int last = Math.min (cn.elts.size (), elts.size ()); + for (int i = 0; i < last; ++i) + { + String f = canonicalize ((String) elts.get (i)); + int comp = f.compareTo (canonicalize ((String) cn.elts.get (i))); + if (comp != 0) + return comp; + } + return elts.size () - cn.elts.size (); + } + + public boolean endsWith (Name n) + { + if (! (n instanceof CompoundName)) + return false; + CompoundName cn = (CompoundName) n; + if (cn.elts.size () > elts.size ()) + return false; + int delta = elts.size () - cn.elts.size (); + for (int i = 0; i < cn.elts.size (); ++i) + { + String f = canonicalize ((String) elts.get (i)); + if (! f.equals (canonicalize ((String) cn.elts.get (i)))) + return false; + } + return true; + } + + public boolean equals (Object obj) + { + if (! (obj instanceof CompoundName)) + return false; + return compareTo (obj) == 0; + } + + public String get (int posn) + { + return (String) elts.get (posn); + } + + public Enumeration getAll () + { + return elts.elements (); + } + + public Name getPrefix (int posn) + { + CompoundName cn = new CompoundName (mySyntax); + for (int i = 0; i < posn; ++i) + cn.elts.add (elts.get (i)); + return cn; + } + + public Name getSuffix (int posn) + { + if (posn > elts.size ()) + throw new ArrayIndexOutOfBoundsException (posn); + CompoundName cn = new CompoundName (mySyntax); + for (int i = posn; i < elts.size (); ++i) + cn.elts.add (elts.get (i)); + return cn; + } + + public int hashCode () + { + int h = 0; + for (int i = 0; i < elts.size (); ++i) + h += canonicalize ((String) elts.get (i)).hashCode (); + return h; + } + + public boolean isEmpty () + { + return elts.isEmpty (); + } + + public Object remove (int posn) throws InvalidNameException + { + return elts.remove (posn); + } + + public int size () + { + return elts.size (); + } + + public boolean startsWith (Name n) + { + if (! (n instanceof CompoundName)) + return false; + CompoundName cn = (CompoundName) n; + if (cn.elts.size () > elts.size ()) + return false; + for (int i = 0; i < cn.elts.size (); ++i) + { + String f = canonicalize ((String) elts.get (i)); + if (! f.equals (canonicalize ((String) cn.elts.get (i)))) + return false; + } + return true; + } + + // If ELEMENT starts with some meta-sequence at OFFSET, then return + // the string representing the meta-sequence. Otherwise return + // null. + private String isSpecial (String element, int offset) + { + String special = null; + if (separator != null && element.startsWith (separator, offset)) + special = separator; + else if (escape != null && element.startsWith (escape, offset)) + special = escape; + else if (beginQuote != null && element.startsWith (beginQuote, offset)) + special = beginQuote; + else if (endQuote != null && element.startsWith (endQuote, offset)) + special = endQuote; + else if (beginQuote2 != null + && element.startsWith (beginQuote2, offset)) + special = beginQuote2; + else if (endQuote2 != null && element.startsWith (endQuote2, offset)) + special = endQuote2; + + return special; + } + + public String toString () + { + StringBuffer result = new StringBuffer (); + int size = elts.size (); + for (int i = 0; i < size; ++i) + { + // Find the appropriate element. FIXME: not clear what FLAT + // means. + int offset = (direction == RIGHT_TO_LEFT) ? (size - i - 1) : i; + String element = (String) elts.get (offset); + if (i > 0 + || (i == size - 1 && element.equals (""))) + result.append (separator); + + int k = 0; + while (k < element.length ()) + { + String special = isSpecial (element, k); + if (special != null) + { + result.append (escape); + result.append (special); + k += special.length (); + } + else + { + result.append (element.charAt (k)); + ++k; + } + } + } + + return result.toString (); + } + + // This canonicalizes a String, based on the syntax, for comparison + // or other similar purposes. + private String canonicalize (String element) + { + String ret = element; + + if (ignoreCase) + ret = ret.toLowerCase (); + + if (trimBlanks) + { + int first = 0; + while (first < ret.length () + && Character.isWhitespace (ret.charAt (first))) + ++first; + + int last = ret.length () - 1; + while (last >= first + && Character.isWhitespace (ret.charAt (last))) + --last; + + ret = ret.substring (first, last); + } + + return ret; + } + + // This initializes all the syntax variables. This seems easier + // than re-querying the properties every time. We're allowed to do + // this because the spec says that subclasses should consider the + // syntax as being read-only. + private void initializeSyntax () + { + String t = mySyntax.getProperty ("jndi.syntax.direction", "flat"); + if (t.equals ("right_to_left")) + this.direction = RIGHT_TO_LEFT; + else if (t.equals ("left_to_right")) + this.direction = LEFT_TO_RIGHT; + else + { + // If we don't recognize it, default to flat. + this.direction = FLAT; + } + + // This is required unless the direction is FLAT. Unfortunately + // there is no way to report this error. + this.separator = mySyntax.getProperty ("jndi.syntax.separator", ""); + + this.ignoreCase + = Boolean.valueOf (mySyntax.getProperty ("jndi.syntax.ignorecase", + "false")).booleanValue (); + this.escape = mySyntax.getProperty ("jndi.syntax.escape", null); + this.beginQuote = mySyntax.getProperty ("jndi.syntax.beginquote", null); + this.endQuote = mySyntax.getProperty ("jndi.syntax.endquote", + this.beginQuote); + this.beginQuote2 = mySyntax.getProperty ("jndi.syntax.beginquote2", + null); + this.endQuote2 = mySyntax.getProperty ("jndi.syntax.endquote2", + this.beginQuote2); + this.trimBlanks + = Boolean.valueOf (mySyntax.getProperty ("jndi.syntax.trimblanks", + "false")).booleanValue (); + } + + // The spec specifies this but does not document it in any way (it + // is a package-private class). It is useless as far as I can tell. + // So we ignore it. + // protected transient NameImpl impl; + protected transient Properties mySyntax; + + // The actual elements. + private transient Vector elts; + + // The following are all used for syntax. + private transient int direction; + private transient String separator; + private transient boolean ignoreCase; + private transient String escape; + private transient String beginQuote; + private transient String endQuote; + private transient String beginQuote2; + private transient String endQuote2; + private transient boolean trimBlanks; + // We didn't need these for parsing, so they are gone. + // private transient String avaSeparator; + // private transient String typevalSeparator; + + private static final int RIGHT_TO_LEFT = -1; + private static final int LEFT_TO_RIGHT = 1; + private static final int FLAT = 0; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/InitialContext.java gcc-3.1/libjava/javax/naming/InitialContext.java *** gcc-3.0.4/libjava/javax/naming/InitialContext.java Wed Mar 28 00:15:01 2001 --- gcc-3.1/libjava/javax/naming/InitialContext.java Fri Oct 19 20:36:07 2001 *************** public class InitialContext implements C *** 308,319 **** public Object addToEnvironment (String propName, Object propVal) throws NamingException { ! myProps.put (propName, propVal); } public Object removeFromEnvironment (String propName) throws NamingException { ! myProps.remove (propName); } public Hashtable getEnvironment () throws NamingException --- 308,319 ---- public Object addToEnvironment (String propName, Object propVal) throws NamingException { ! return myProps.put (propName, propVal); } public Object removeFromEnvironment (String propName) throws NamingException { ! return myProps.remove (propName); } public Hashtable getEnvironment () throws NamingException diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/InvalidNameException.java gcc-3.1/libjava/javax/naming/InvalidNameException.java *** gcc-3.0.4/libjava/javax/naming/InvalidNameException.java Mon Nov 27 05:57:58 2000 --- gcc-3.1/libjava/javax/naming/InvalidNameException.java Tue Jan 22 22:40:42 2002 *************** *** 1,22 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package javax.naming; ! import java.lang.Exception; ! public class InvalidNameException extends NamingException { public InvalidNameException () { super (); } public InvalidNameException (String msg) { super (msg); --- 1,64 ---- ! /* InvalidNameException.java -- Exception indicating an invalid component/name ! Copyright (C) 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package javax.naming; ! /** ! * Exception indicating an invalid component or Name. ! * Thrown when a Name or component of a name is encountered that ! * does not follow the syntactic rules of a particular Name class. ! * ! * @author Anthony Green (green@redhat.com) ! * @author Mark Wielaard (mark@klomp.org) ! */ public class InvalidNameException extends NamingException { + /** + * Creates a new exception without setting any of its fields. + */ public InvalidNameException () { super (); } + /** + * Creates a new exception and sets the detailed message field. + * All other fields are not set. + */ public InvalidNameException (String msg) { super (msg); diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/LinkException.java gcc-3.1/libjava/javax/naming/LinkException.java *** gcc-3.0.4/libjava/javax/naming/LinkException.java Mon Nov 27 05:57:58 2000 --- gcc-3.1/libjava/javax/naming/LinkException.java Wed Oct 24 21:39:15 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** package javax.naming; *** 10,17 **** --- 10,28 ---- import java.lang.Exception; + /** + * @author Warren Levy + * @date June 14, 2001 + */ + public class LinkException extends NamingException { + // Serialized fields. + protected Name linkResolvedName; + protected Object linkResolvedObj; + protected Name linkRemainingName; + protected String linkExplanation; + public LinkException () { super (); *************** public class LinkException extends Namin *** 21,24 **** --- 32,88 ---- { super (msg); } + + public Name getLinkResolvedName() + { + return linkResolvedName; + } + + public Name getLinkRemainingName() + { + return linkRemainingName; + } + + public Object getLinkResolvedObj() + { + return linkResolvedObj; + } + + public String getLinkExplanation() + { + return linkExplanation; + } + + public void setLinkExplanation(String msg) + { + linkExplanation = msg; + } + + public void setLinkResolvedName(Name name) + { + linkResolvedName = (Name) name.clone(); + } + + public void setLinkRemainingName(Name name) + { + linkRemainingName = (Name) name.clone(); + } + + public void setLinkResolvedObj(Object obj) + { + linkResolvedObj = obj; + } + + public String toString () + { + return super.toString () + "; " + linkRemainingName.toString (); + } + + public String toString (boolean detail) + { + String r = super.toString (detail) + "; " + linkRemainingName.toString (); + if (detail) + r += "; " + linkResolvedObj.toString (); + return r; + } } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/LinkRef.java gcc-3.1/libjava/javax/naming/LinkRef.java *** gcc-3.0.4/libjava/javax/naming/LinkRef.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/LinkRef.java Wed Oct 24 21:39:15 2001 *************** *** 0 **** --- 1,35 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming; + + import java.io.Serializable; + + /** + * @author Tom Tromey + * @date May 16, 2001 + */ + public class LinkRef extends Reference + { + public LinkRef (Name name) + { + this (name.toString ()); + } + + public LinkRef (String name) + { + // FIXME: javax.naming.LinkRef? + super ("LinkRef", new StringRefAddr ("LinkAddress", name)); + } + + public String getLinkName () + { + StringRefAddr sra = (StringRefAddr) get (0); + return (String) sra.getContent (); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/Name.java gcc-3.1/libjava/javax/naming/Name.java *** gcc-3.0.4/libjava/javax/naming/Name.java Wed Mar 28 00:15:01 2001 --- gcc-3.1/libjava/javax/naming/Name.java Tue Jan 22 22:40:42 2002 *************** *** 1,31 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package javax.naming; import java.util.Enumeration; import java.io.Serializable; public interface Name extends Cloneable, Serializable { ! public Object clone(); ! public int compareTo(Object obj); public int size(); public boolean isEmpty(); public Enumeration getAll(); ! public String get(int posn); ! public Name getPrefix(int posn); ! public Name getSuffix(int posn); ! public boolean startsWith(Name n); ! public boolean endsWith(Name n); ! public Name addAll(Name suffix) throws InvalidNameException; ! public Name addAll(int posn, Name n) throws InvalidNameException; public Name add(String comp) throws InvalidNameException; public Name add(int posn, String comp) throws InvalidNameException; public Object remove(int posn) throws InvalidNameException; } --- 1,196 ---- ! /* Name.java -- Name build up from different components ! Copyright (C) 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package javax.naming; import java.util.Enumeration; import java.io.Serializable; + /** + * Interface descriping a name build up from different components. + * The components are represented as Strings which are + * ordered from most significant to least significant. There are methods to + * get the number of components. Methods to get a particular component or group + * of components. Components can be added as Strings or + * Names and a component can be removed from any position in the + * Name. + * A Name can be compared to another Name and it can + * be checked if a particular Name starts or ends with the same + * components as another Name. Finally Names can be + * serialized and cloned. + *

          + * Since Names can be empty (have no components) methods that + * return a Name will never return null. + * + * @since 1.3 + * @author Anthony Green (green@redhat.com) + * @author Mark Wielaard (mark@klomp.org) + */ public interface Name extends Cloneable, Serializable { ! /** ! * Returns the number of components of this Name. ! * The returned number can be zero. ! */ public int size(); + + /** + * Returns true if the number of components of this + * Name is zero, false otherwise. + */ public boolean isEmpty(); + + /** + * Returns a non-null (but possibly empty) Enumeration of the + * components of the Name as Strings. + */ public Enumeration getAll(); ! ! /** ! * Gets the component at the given index. ! * ! * @exception ArrayIndexOutOfBoundsException if the given index is smaller ! * then zero or greater then or equal to size(). ! */ ! public String get(int i); ! ! /** ! * Returns the components till the given index as a Name. ! * The returned Name can be modified without changing the ! * original. ! * ! * @exception ArrayIndexOutOfBoundsException if the given index is smaller ! * then zero or greater then or equal to size(). ! */ ! public Name getPrefix(int i); ! ! /** ! * Returns the components from the given index till the end as a ! * Name. ! * The returned Name can be modified without changing the ! * original. ! * ! * @exception ArrayIndexOutOfBoundsException if the given index is smaller ! * then zero or greater then or equal to size(). ! */ ! public Name getSuffix(int i); ! ! /** ! * Adds the given String component to the end of this ! * Name. The method modifies the current Name and ! * then returns it. ! * ! * @exception InvalidNameException if the given String is not a ! * valid component for this Name. ! */ public Name add(String comp) throws InvalidNameException; + + /** + * Inserts the given String component to this Name + * at the given index. The method modifies the current Name and + * then returns it. + * + * @exception ArrayIndexOutOfBoundsException if the given index is smaller + * then zero or greater then or equal to size(). + * @exception InvalidNameException if the given String is not a + * valid component for this Name. + */ public Name add(int posn, String comp) throws InvalidNameException; + + /** + * Adds all the components of the given Name to the end of this + * Name. The method modifies the current Name and + * then returns it. + * + * @exception InvalidNameException if any of the given components is not a + * valid component for this Name. + */ + public Name addAll(Name suffix) throws InvalidNameException; + + /** + * Inserts all the components of the given Name to this + * Name at the given index. The method modifies the current + * Name and then returns it. + * + * @exception ArrayIndexOutOfBoundsException if the given index is smaller + * then zero or greater then or equal to size(). + * @exception InvalidNameException if any of the given components is not a + * valid component for this Name. + */ + public Name addAll(int posn, Name n) throws InvalidNameException; + + /** + * Removes the component at the given index from this Name. + * The method modifies the current Name and then returns it. + * + * @exception InvalidNameException if the given String is not a + * valid component for this Name. + */ public Object remove(int posn) throws InvalidNameException; + + /** + * Returns true if this Name starts with the + * components of the given Name, false otherwise. + */ + public boolean startsWith(Name name); + + /** + * Returns true if this Name ends with the + * components of the given Name, false otherwise. + */ + public boolean endsWith(Name name); + + /** + * Compares the given object to this Name. + * Returns a negative value if the given Object is smaller then + * this Name, a positive value if the Object is + * bigger, and zero if the are equal. If the Object is not of + * a class that can be compared to the class of this Name then + * a ClassCastException is thrown. Note that it is not + * guaranteed that Names implemented in different classes can + * be compared. The definition of smaller, bigger and equal is up to the + * actual implementing class. + */ + public int compareTo(Object obj); + + /** + * Returns a clone of this Name. It will be a deep copy of + * all the components of the Name so that changes to components + * of the components does not change the component in this Name. + */ + public Object clone(); } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/NameClassPair.java gcc-3.1/libjava/javax/naming/NameClassPair.java *** gcc-3.0.4/libjava/javax/naming/NameClassPair.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/NameClassPair.java Wed Oct 24 21:39:15 2001 *************** *** 0 **** --- 1,71 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming; + + import java.io.Serializable; + + /** + * @author Tom Tromey + * @date May 16, 2001 + */ + public class NameClassPair implements Serializable + { + public NameClassPair (String name, String className) + { + this (name, className, true); + } + + public NameClassPair (String name, String className, boolean isRelative) + { + this.name = name; + this.className = className; + this.isRel = isRelative; + } + + public String getClassName () + { + return className; + } + + public String getName () + { + return name; + } + + public boolean isRelative () + { + return isRel; + } + + public void setClassName (String name) + { + this.className = name; + } + + public void setName (String name) + { + this.name = name; + } + + public void setRelative (boolean r) + { + this.isRel = r; + } + + public String toString () + { + // Specified by class documentation. + return name + ":" + className; + } + + // These field names are fixed by the serialization spec. + private String name; + private String className; + private boolean isRel; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/NamingException.java gcc-3.1/libjava/javax/naming/NamingException.java *** gcc-3.0.4/libjava/javax/naming/NamingException.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/NamingException.java Tue Jan 22 22:40:42 2002 *************** *** 1,36 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package javax.naming; ! import java.lang.Exception; ! public class NamingException extends Exception { protected Throwable rootException; ! public NamingException() { super(); } ! public NamingException(String msg) { super(msg); } public Throwable getRootCause () { return rootException; } public void setRootCause (Throwable e) { rootException = e; } } --- 1,314 ---- ! /* NamingException.java -- Superclass of all naming Exceptions ! Copyright (C) 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + package javax.naming; ! import java.io.PrintStream; ! import java.io.PrintWriter; ! ! /** ! * Superclass of all naming Exceptions. ! * Can contain extra information about the root cause of this exception ! * (for example when the original exception was not a subclass of ! * NamingException), the part of the Name that ! * could be resolved (including the Object it resolved to) ! * and the part of the Name that could not be resolved when ! * the exception occurred. ! * ! * @since 1.3 ! * @author Anthony Green (green@redhat.com) ! * @author Mark Wielaard (mark@klomp.org) ! */ public class NamingException extends Exception { + + /** + * The root cause of this exception. Might be null. Set by calling + * setRootCause(), can be accessed by calling + * getRootCause(). + */ protected Throwable rootException; ! /** ! * If the exception was caused while resolving a Name then ! * this field contains that part of the name that could be resolved. ! * Field might be null. Set by calling setResolvedName(). ! * Can be accessed by calling getResolvedName. ! */ ! protected Name resolvedName; ! ! /** ! * If the exception was caused while resolving a Name then ! * this field contains the object that part of the name could be resolved to. ! * Field might be null. Set by calling setResolvedObj(). ! * Can be accessed by calling getResolvedObj. ! */ ! protected Object resolvedObj; ! ! /** ! * If the exception was caused while resolving a Name then ! * this field contains that part of the name that could not be resolved. ! * Field might be null. Set by calling setRemainingName(). ! * The field can be extended by calling appendRemainingName() ! * or appendRemainingComponent(). ! * Can be accessed by calling getRemainingName. ! */ ! protected Name remainingName; ! ! /** ! * Creates a new NamingException without a message. Does not set any of the ! * rootException, resolvedName, ! * resolvedObj or remainingObject, fields. ! * These fields can be set later. ! */ ! public NamingException () { super(); } ! /** ! * Creates a new NamingException with a detailed message. Does not set ! * the rootException, resolvedName, ! * resolvedObj or remainingObject, fields. ! * These fields can be set later. ! */ ! public NamingException (String msg) { super(msg); } + /** + * Gets the root cause field rootException of this Exception. + */ public Throwable getRootCause () { return rootException; } + /** + * Sets the root cause field rootException of this Exception. + */ public void setRootCause (Throwable e) { rootException = e; } + + /** + * Gets the part of the name that could be resolved before this exception + * happend. Returns the resolvedName field of this Exception. + */ + public Name getResolvedName () + { + return resolvedName; + } + + /** + * Sets the part of the name that could be resolved before this exception + * happend. Sets the resolvedName field of this Exception. + */ + public void setResolvedName (Name name) + { + resolvedName = name; + } + + /** + * Gets the Object to which (part of) the name could be resolved before this + * exception happend. Returns the resolvedObj field of this + * Exception. + */ + public Object getResolvedObj () + { + return resolvedObj; + } + + /** + * Sets the Object to which (part of) the name could be resolved before this + * exception happend. Sets the resolvedObj field of this + * Exception. + */ + public void setResolvedObj (Object o) + { + resolvedObj = o; + } + + /** + * Gets the part of the name that could not be resolved before this exception + * happend. Returns the remainingName field of this Exception. + */ + public Name getRemainingName () + { + return remainingName; + } + + /** + * Sets the part of the name that could be resolved before this exception + * happend. Sets the resolvedName field of this Exception. + * The field can be extended by calling appendRemainingName() + * or appendRemainingComponent(). + */ + public void setRemainingName (Name name) + { + remainingName = name; + } + + /** + * Adds the given Name to the remainingName field. + * Does nothing when name is null or when a + * InvalidNameException is thrown when adding the name. + * + * @see Name#addAll(Name) + */ + public void appendRemainingName (Name name) + { + if (name != null) + try + { + remainingName.addAll(name); + } + catch(InvalidNameException ine) { /* ignored */ } + } + + /** + * Adds the given String to the remainingName field. + * Does nothing when name is null or when a + * InvalidNameException is thrown when adding the component. + * + * @see Name#add(String) + */ + public void appendRemainingComponent (String name) + { + if (name != null) + try + { + remainingName.add(name); + } + catch(InvalidNameException ine) { /* ignored */ } + } + + /** + * Gets the message given to the constructor or null if no message was given. + * + * @see Throwable#getMessage(); + */ + public String getExplanation() + { + return getMessage(); + } + + /** + * Returns a String representation of this exception and possibly including + * the part object that could be resolved if the given flag is set to true. + * Always includes the root cause and the remaining name if not null. + */ + public String toString(boolean objectInfo) + { + StringBuffer sb = new StringBuffer(super.toString()); + Throwable cause = getRootCause(); + if (cause != null) + { + sb.append(" caused by "); + sb.append(cause); + } + Name remaining = getRemainingName(); + if (remaining != null) + { + sb.append(" [remainingName: "); + sb.append(remaining); + } + Object resolved = getResolvedObj(); + if (objectInfo && resolved != null) + { + if (remainingName == null) + sb.append(" ["); + else + sb.append(", "); + sb.append("resolvedObj: "); + sb.append(resolved); + } + if ((remaining != null) || (objectInfo && resolved != null)) + sb.append(']'); + + return sb.toString(); + } + + /** + * Returns a string representation of this exception. + * Calls toString(false). + */ + public String toString() + { + return toString(false); + } + /** + * Prints the stacktrace of this exception or of the root cause if not null. + */ + public void printStackTrace() + { + Throwable cause = getRootCause(); + if (cause != null) + cause.printStackTrace(); + else + super.printStackTrace(); + } + + /** + * Prints the stacktrace of this exception or of the root cause if not null + * to the given PrintStream. + */ + public void printStackTrace(PrintStream ps) + { + Throwable cause = getRootCause(); + if (cause != null) + cause.printStackTrace(ps); + else + super.printStackTrace(ps); + } + + /** + * Prints the stacktrace of this exception or of the root cause if not null + * to the given PrintWriter. + */ + public void printStackTrace(PrintWriter pw) + { + Throwable cause = getRootCause(); + if (cause != null) + cause.printStackTrace(pw); + else + super.printStackTrace(pw); + } } + diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/OperationNotSupportedException.java gcc-3.1/libjava/javax/naming/OperationNotSupportedException.java *** gcc-3.0.4/libjava/javax/naming/OperationNotSupportedException.java Mon Nov 27 05:57:58 2000 --- gcc-3.1/libjava/javax/naming/OperationNotSupportedException.java Fri Oct 19 20:36:07 2001 *************** details. */ *** 8,16 **** package javax.naming; ! import java.lang.Exception; ! ! public class OperationNotSupportedException extends Exception { public OperationNotSupportedException() { --- 8,14 ---- package javax.naming; ! public class OperationNotSupportedException extends NamingException { public OperationNotSupportedException() { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/RefAddr.java gcc-3.1/libjava/javax/naming/RefAddr.java *** gcc-3.0.4/libjava/javax/naming/RefAddr.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/RefAddr.java Tue Jan 22 22:40:42 2002 *************** *** 1,15 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ package javax.naming; import java.io.Serializable; ! public class RefAddr implements Serializable { } --- 1,142 ---- ! /* RefAddr.java -- Abstract superclass of addresses used in References ! Copyright (C) 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ package javax.naming; import java.io.Serializable; ! /** ! * Abstract superclass of addresses used in References. ! * A Reference object contains a Vector of ! * RefAddrs which are used to reference/address the object. ! * This abstract superclass keeps track of the type of address, which will be ! * returned by getType(). And defines a abstract method ! * getContent() which must be implemented in concrete subclasses ! * such as BinaryRefAddr and StringRefAddr. ! * ! * @see Reference ! * @see BinaryRefAddr ! * @see StringRefAddr ! * @since 1.3 ! * @author Anthony Green (green@redhat.com) ! * @author Mark Wielaard (mark@klomp.org) ! */ ! public abstract class RefAddr implements Serializable { + /** + * The string resprenstation of the type of address. + * Set by the constructor and returned by the getType() method. + */ + protected final String addrType; + + /** + * Protected constructor for use by subclasses. + * Sets the addrType field of this object to the supplied String. + * + * @exception NullPointerException if the supplied String is null. + */ + protected RefAddr(String addrType) + { + if (addrType == null) + throw new NullPointerException("addrType cannot be null"); + + this.addrType = addrType; + } + + /** + * Returns the non-null address type given to the constructor. + */ + public String getType() + { + return addrType; + } + + /** + * Returns the possibly null content of this RefAddr. + * The actual value is defined by the non-abstract subclass. + */ + public abstract Object getContent(); + + /** + * Checks if the object is a RefAddr with the same type and content. + * + * @return true if the given object is an instance of RefAddr, the addrType + * is the same as this addrType and the content is equals to the + * content of this object. + */ + public boolean equals (Object o) + { + if (o instanceof RefAddr) + { + RefAddr refAddr = (RefAddr) o; + if (this.getType().equals(refAddr.getType())) + { + Object c1 = this.getContent(); + Object c2 = refAddr.getContent(); + if (c1 == null) + return c2 == null; + else + return c1.equals(c2); + } + } + return false; + } + + /** + * Returns the hashCode which is the hasCode of the String returned by + * getType() plus the hashCode of the Object returned by + * getContent (when not null). + */ + public int hashCode() + { + int result = getType().hashCode(); + Object o = getContent(); + if (o != null) + result += o.hashCode(); + + return result; + } + + /** + * Returns a String representation of the RefAddr. + * Should only be used for debugging purposes. + */ + public String toString() + { + return "[RefAddr type: " + getType() + " content: " + getContent() + ']'; + } } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/Reference.java gcc-3.1/libjava/javax/naming/Reference.java *** gcc-3.0.4/libjava/javax/naming/Reference.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/Reference.java Wed Oct 24 21:39:15 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 9,30 **** package javax.naming; import java.io.Serializable; public class Reference implements Cloneable, Serializable { public Reference (String className, String factory, String factoryLocation) { this.className = className; } ! void add (RefAddr addr) { ! throw new Error ("javax.naming.Reference.add not implemented"); } ! RefAddr get (String addrType) { ! throw new Error ("javax.naming.Reference.get not implemented"); } public String getClassName () --- 9,113 ---- package javax.naming; import java.io.Serializable; + import java.util.Enumeration; + import java.util.Vector; + /** + * @author Tom Tromey + * @date May 16, 2001 + */ public class Reference implements Cloneable, Serializable { + public Reference (String className) + { + this.className = className; + addrs = new Vector (); + } + + public Reference (String className, RefAddr addr) + { + this.className = className; + addrs = new Vector (); + addrs.add (addr); + } + public Reference (String className, String factory, String factoryLocation) { this.className = className; + this.classFactory = factory; + this.classFactoryLocation = factoryLocation; + addrs = new Vector (); } ! public Reference (String className, RefAddr addr, ! String factory, String factoryLocation) { ! this.className = className; ! this.classFactory = factory; ! this.classFactoryLocation = factoryLocation; ! addrs = new Vector (); ! addrs.add (addr); } ! public void add (int posn, RefAddr addr) { ! addrs.add (posn, addr); ! } ! ! public void add (RefAddr addr) ! { ! addrs.add (addr); ! } ! ! public void clear () ! { ! addrs.clear (); ! } ! ! public Object clone () ! { ! Reference r = new Reference (className, classFactory, ! classFactoryLocation); ! r.addrs = (Vector) addrs.clone (); ! return r; ! } ! ! // Convenience function. ! private boolean equals (String a, String b) ! { ! return (a == null) ? (b == null) : a.equals (b); ! } ! ! public boolean equals (Object obj) ! { ! if (! (obj instanceof Reference)) ! return false; ! Reference r = (Reference) obj; ! return (equals (classFactory, r.classFactory) ! && equals (classFactoryLocation, r.classFactoryLocation) ! && equals (className, r.className) ! && addrs.equals (r.addrs)); ! } ! ! public RefAddr get (int posn) ! { ! return (RefAddr) addrs.get (posn); ! } ! ! public RefAddr get (String addrType) ! { ! for (int i = 0; i < addrs.size (); ++i) ! { ! RefAddr r = (RefAddr) addrs.get (i); ! if (addrType.equals (r.getType ())) ! return r; ! } ! return null; ! } ! ! public Enumeration getAll () ! { ! return addrs.elements (); } public String getClassName () *************** public class Reference implements Clonea *** 32,36 **** return className; } ! private String className; } --- 115,164 ---- return className; } ! public String getFactoryClassLocation () ! { ! return classFactoryLocation; ! } ! ! public String getFactoryClassName () ! { ! return classFactory; ! } ! ! public int hashCode () ! { ! // The spec says the hash code is the sum of the hash codes of the ! // addresses. It does not mention the other fields. ! int h = 0; ! for (int i = 0; i < addrs.size (); ++i) ! h += addrs.get (i).hashCode (); ! return h; ! } ! ! public Object remove (int posn) ! { ! return addrs.remove (posn); ! } ! ! public int size () ! { ! return addrs.size (); ! } ! ! public String toString () ! { ! String x = getClass ().toString () + "["; ! for (int i = 0; i < addrs.size (); ++i) ! { ! if (i > 0) ! x += ","; ! x += addrs.get (i).toString (); ! } ! return x + "]"; ! } ! ! protected Vector addrs; ! protected String classFactory; ! protected String classFactoryLocation; ! protected String className; } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ReferralException.java gcc-3.1/libjava/javax/naming/ReferralException.java *** gcc-3.0.4/libjava/javax/naming/ReferralException.java Mon Nov 27 05:57:58 2000 --- gcc-3.1/libjava/javax/naming/ReferralException.java Wed Oct 24 21:39:15 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 9,24 **** package javax.naming; import java.lang.Exception; ! public class ReferralException extends NamingException { ! public ReferralException () { super (); } ! public ReferralException (String msg) { super (msg); } } --- 9,37 ---- package javax.naming; import java.lang.Exception; + import java.util.Hashtable; ! /** ! * @author Warren Levy ! * @date June 14, 2001 ! */ ! ! public abstract class ReferralException extends NamingException { ! protected ReferralException () { super (); } ! protected ReferralException (String msg) { super (msg); } + + public abstract Object getReferralInfo(); + public abstract Context getReferralContext() throws NamingException; + public abstract Context getReferralContext(Hashtable env) + throws NamingException; + public abstract boolean skipReferral(); + public abstract void retryReferral(); } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/StringRefAddr.java gcc-3.1/libjava/javax/naming/StringRefAddr.java *** gcc-3.0.4/libjava/javax/naming/StringRefAddr.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/StringRefAddr.java Tue Jan 22 22:40:42 2002 *************** *** 1,24 **** ! /* Copyright (C) 2000 Free Software Foundation ! This file is part of libgcj. ! This software is copyrighted work licensed under the terms of the ! Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ! details. */ ! package javax.naming; ! import java.io.Serializable; public class StringRefAddr extends RefAddr { ! public StringRefAddr (String addrType, String addr) { ! throw new Error ("javax.naming.StringRefAddr not implemented"); } ! public Object getContent () { ! throw new Error ("javax.naming.StringRefAddr.getContent not implemented"); } } --- 1,74 ---- ! /* StringRefAddr.java -- RefAddr that uses a String as content. ! Copyright (C) 2000, 2001 Free Software Foundation, Inc. ! This file is part of GNU Classpath. ! GNU Classpath is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! GNU Classpath is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! General Public License for more details. ! You should have received a copy of the GNU General Public License ! along with GNU Classpath; see the file COPYING. If not, write to the ! Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ! 02111-1307 USA. ! Linking this library statically or dynamically with other modules is ! making a combined work based on this library. Thus, the terms and ! conditions of the GNU General Public License cover the whole ! combination. ! ! As a special exception, the copyright holders of this library give you ! permission to link this library with independent modules to produce an ! executable, regardless of the license terms of these independent ! modules, and to copy and distribute the resulting executable under ! terms of your choice, provided that you also meet, for each linked ! independent module, the terms and conditions of the license of that ! module. An independent module is a module which is not derived from ! or based on this library. If you modify this library, you may extend ! this exception to your version of the library, but you are not ! obligated to do so. If you do not wish to do so, delete this ! exception statement from your version. */ ! ! package javax.naming; + /** + * RefAddr that uses a String as content. + * This can for example be used to address things through URLs. + * + * @see Reference + * @since 1.3 + * @author Anthony Green (green@redhat.com) + * @author Mark Wielaard (mark@klomp.org) + */ public class StringRefAddr extends RefAddr { ! ! /** ! * The possibly null content of this RefAddr. ! * Set by the constructor and returned by getContent. ! */ ! private final String contents; ! ! /** ! * Contructs a new StringRefAddr with the given type and content. ! */ ! public StringRefAddr (String addrType, String contents) { ! super(addrType); ! this.contents = contents; } ! ! /** ! * Returns the String contents as given to the constructor. ! */ public Object getContent () { ! return contents; } } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/Attribute.java gcc-3.1/libjava/javax/naming/directory/Attribute.java *** gcc-3.0.4/libjava/javax/naming/directory/Attribute.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/directory/Attribute.java Wed Oct 24 21:39:16 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** package javax.naming.directory; *** 11,20 **** import javax.naming.*; import java.io.Serializable; public interface Attribute extends Cloneable, Serializable { ! // FIXME ! NamingEnumeration getAll (); } - --- 11,40 ---- import javax.naming.*; import java.io.Serializable; + /** + * @author Warren Levy + * @date June 14, 2001 + */ + public interface Attribute extends Cloneable, Serializable { ! // FIXME: Need to set value from JNDI 1.1.1 fro interoperability. ! // public static final long serialVersionUID = ; ! public NamingEnumeration getAll() throws NamingException; ! public Object get() throws NamingException; ! public int size(); ! public String getID(); ! public boolean contains(Object attrVal); ! public boolean add(Object attrVal); ! public boolean remove(Object attrval); ! public void clear(); ! public DirContext getAttributeSyntaxDefinition() throws NamingException; ! public DirContext getAttributeDefinition() throws NamingException; ! public Object clone(); ! public boolean isOrdered(); ! public Object get(int ix) throws NamingException; ! public Object remove(int ix); ! public void add(int ix, Object attrVal); ! public Object set(int ix, Object attrVal); } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/AttributeInUseException.java gcc-3.1/libjava/javax/naming/directory/AttributeInUseException.java *** gcc-3.0.4/libjava/javax/naming/directory/AttributeInUseException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/AttributeInUseException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class AttributeInUseException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class AttributeInUseException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/AttributeModificationException.java gcc-3.1/libjava/javax/naming/directory/AttributeModificationException.java *** gcc-3.0.4/libjava/javax/naming/directory/AttributeModificationException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/AttributeModificationException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,17 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class AttributeModificationException extends NamingException { public AttributeModificationException () { super (); --- 6,25 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; ! ! /** ! * @author Warren Levy ! * @date June 14, 2001 ! */ public class AttributeModificationException extends NamingException { + // Serialized fields. + private ModificationItem[] unexecs; + public AttributeModificationException () { super (); *************** public class AttributeModificationExcept *** 21,24 **** --- 29,47 ---- { super (msg); } + + public void setUnexecutedModifications(ModificationItem[] e) + { + unexecs = e; + } + + public ModificationItem[] getUnexecutedModifications() + { + return unexecs; + } + + public String toString() + { + return super.toString () + ": " + unexecs[0].toString (); + } } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/Attributes.java gcc-3.1/libjava/javax/naming/directory/Attributes.java *** gcc-3.0.4/libjava/javax/naming/directory/Attributes.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/directory/Attributes.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** package javax.naming.directory; *** 11,20 **** import javax.naming.*; import java.io.Serializable; public interface Attributes extends Cloneable, Serializable { ! // FIXME ! ! NamingEnumeration getAll (); } --- 11,31 ---- import javax.naming.*; import java.io.Serializable; + /** + * @author Warren Levy + * @date June 14, 2001 + */ + public interface Attributes extends Cloneable, Serializable { ! public boolean isCaseIgnored(); ! public int size(); ! public Attribute get(String attrID); ! public NamingEnumeration getAll(); ! public NamingEnumeration getIDs(); ! public Attribute put(String attrID, Object val); ! public Attribute put(Attribute attr); ! public Attribute remove(String attrID); ! public Object clone(); } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/BasicAttribute.java gcc-3.1/libjava/javax/naming/directory/BasicAttribute.java *** gcc-3.0.4/libjava/javax/naming/directory/BasicAttribute.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/directory/BasicAttribute.java Wed Oct 24 21:39:17 2001 *************** *** 0 **** --- 1,298 ---- + /* Copyright (C) 2000, 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.directory; + + import javax.naming.*; + import java.util.*; + + /** + * @author Tom Tromey + * @date June 20, 2001 + */ + public class BasicAttribute implements Attribute + { + /** The ID of this attribute. */ + protected String attrID; + /** True if this attribute's values are ordered. */ + protected boolean ordered; + /** Values for this attribute. */ + protected transient Vector values; + + // Used by cloning. + private BasicAttribute () + { + } + + public BasicAttribute (String id) + { + this (id, false); + } + + public BasicAttribute (String id, boolean ordered) + { + attrID = id; + this.ordered = ordered; + values = new Vector (); + } + + public BasicAttribute (String id, Object value) + { + this (id, value, false); + } + + public BasicAttribute (String id, Object value, boolean ordered) + { + attrID = id; + this.ordered = ordered; + values = new Vector (); + values.add (value); + } + + public void add (int index, Object val) + { + if (! ordered && contains (val)) + throw new IllegalStateException ("value already in attribute"); + values.add (index, val); + } + + public boolean add (Object val) + { + if (! ordered && contains (val)) + throw new IllegalStateException ("value already in attribute"); + return values.add (val); + } + + public void clear () + { + values.clear (); + } + + public Object clone () + { + BasicAttribute c = new BasicAttribute (); + c.attrID = attrID; + c.ordered = ordered; + c.values = (Vector) values.clone (); + return c; + } + + public boolean contains (Object val) + { + for (int i = 0; i < values.size (); ++i) + { + if (equals (val, values.get (i))) + return true; + } + + return false; + } + + public boolean equals (Object obj) + { + if (! (obj instanceof BasicAttribute)) + return false; + BasicAttribute b = (BasicAttribute) obj; + + if (ordered != b.ordered + || ! attrID.equals (b.attrID) + || values.size () != b.values.size ()) + return false; + + for (int i = 0; i < values.size (); ++i) + { + boolean ok = false; + if (ordered) + ok = equals (values.get (i), b.values.get (i)); + else + { + for (int j = 0; j < b.values.size (); ++j) + { + if (equals (values.get (i), b.values.get (j))) + { + ok = true; + break; + } + } + } + + if (! ok) + return false; + } + + return true; + } + + public Object get () + { + if (values.size () == 0) + throw new NoSuchElementException ("no values"); + return get (0); + } + + public Object get (int index) + { + return values.get (index); + } + + public NamingEnumeration getAll () + { + return new BasicAttributeEnumeration (); + } + + public DirContext getAttributeDefinition () + throws OperationNotSupportedException, NamingException + { + throw new OperationNotSupportedException (); + } + + public DirContext getAttributeSyntaxDefinition () + throws OperationNotSupportedException, NamingException + { + throw new OperationNotSupportedException (); + } + + public String getID () + { + return attrID; + } + + public int hashCode () + { + int val = attrID.hashCode (); + for (int i = 0; i < values.size (); ++i) + { + Object o = values.get (i); + if (o == null) + { + // Nothing. + } + else if (o instanceof Object[]) + { + Object[] a = (Object[]) o; + for (int j = 0; j < a.length; ++j) + val += a[j].hashCode (); + } + else + val += o.hashCode (); + } + + return val; + } + + public boolean isOrdered () + { + return ordered; + } + + public Object remove (int index) + { + return values.remove (index); + } + + public boolean remove (Object val) + { + for (int i = 0; i < values.size (); ++i) + { + if (equals (val, values.get (i))) + { + values.remove (i); + return true; + } + } + + return false; + } + + public Object set (int index, Object val) + { + if (! ordered && contains (val)) + throw new IllegalStateException ("value already in attribute"); + return values.set (index, val); + } + + public int size () + { + return values.size (); + } + + public String toString () + { + String r = attrID; + for (int i = 0; i < values.size (); ++i) + r += ";" + values.get (i).toString (); + return r; + } + + // This is used for testing equality of two Objects according to our + // local rules. + private boolean equals (Object one, Object two) + { + if (one == null) + return two == null; + + if (one instanceof Object[]) + { + if (! (two instanceof Object[])) + return false; + + Object[] aone = (Object[]) one; + Object[] atwo = (Object[]) two; + + if (aone.length != atwo.length) + return false; + + for (int i = 0; i < aone.length; ++i) + { + if (! aone[i].equals (atwo[i])) + return false; + } + + return true; + } + + return one.equals (two); + } + + // Used when enumerating this attribute. + private class BasicAttributeEnumeration implements NamingEnumeration + { + int where = -1; + + public BasicAttributeEnumeration () + { + } + + public void close () throws NamingException + { + } + + public boolean hasMore () throws NamingException + { + return hasMoreElements (); + } + + public Object next () throws NamingException + { + return nextElement (); + } + + public boolean hasMoreElements () + { + return where < values.size (); + } + + public Object nextElement () throws NoSuchElementException + { + if (where + 1 >= values.size ()) + throw new NoSuchElementException ("no more elements"); + ++where; + return values.get (where); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/BasicAttributes.java gcc-3.1/libjava/javax/naming/directory/BasicAttributes.java *** gcc-3.0.4/libjava/javax/naming/directory/BasicAttributes.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/directory/BasicAttributes.java Wed Oct 24 21:39:17 2001 *************** *** 0 **** --- 1,194 ---- + /* Copyright (C) 2000, 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.directory; + + import javax.naming.*; + import java.util.*; + + /** + * @author Tom Tromey + * @date June 22, 2001 + */ + public class BasicAttributes implements Attributes + { + public BasicAttributes () + { + this (false); + } + + public BasicAttributes (boolean ignoreCase) + { + this.ignoreCase = ignoreCase; + this.attributes = new Vector (); + } + + public BasicAttributes (String attrID, Object val) + { + this (attrID, val, false); + } + + public BasicAttributes (String attrID, Object val, boolean ignoreCase) + { + this.ignoreCase = ignoreCase; + attributes = new Vector (); + attributes.add (new BasicAttribute (attrID, val)); + } + + public Object clone () + { + // Slightly inefficient as we make a garbage Vector here. + BasicAttributes ba = new BasicAttributes (ignoreCase); + ba.attributes = (Vector) attributes.clone (); + return ba; + } + + public boolean equals (Object obj) + { + if (! (obj instanceof BasicAttributes)) + return false; + BasicAttributes b = (BasicAttributes) obj; + if (ignoreCase != b.ignoreCase + || attributes.size () != b.attributes.size ()) + return false; + + // Does order matter? + for (int i = 0; i < attributes.size (); ++i) + { + if (! attributes.get (i).equals (b.attributes.get (i))) + return false; + } + + return true; + } + + public Attribute get (String attrID) + { + for (int i = 0; i < attributes.size (); ++i) + { + Attribute at = (Attribute) attributes.get (i); + if ((ignoreCase && attrID.equalsIgnoreCase (at.getID ())) + || (! ignoreCase && attrID.equals (at.getID ()))) + return at; + } + + return null; + } + + public NamingEnumeration getAll () + { + return new BasicAttributesEnumeration (false); + } + + public NamingEnumeration getIDs () + { + return new BasicAttributesEnumeration (true); + } + + public int hashCode () + { + int val = 0; + for (int i = 0; i < attributes.size (); ++i) + val += attributes.get (i).hashCode (); + return val; + } + + public boolean isCaseIgnored () + { + return ignoreCase; + } + + public Attribute put (Attribute attr) + { + Attribute r = remove (attr.getID ()); + attributes.add (attr); + return r; + } + + public Attribute put (String attrID, Object val) + { + return put (new BasicAttribute (attrID, val)); + } + + public Attribute remove (String attrID) + { + for (int i = 0; i < attributes.size (); ++i) + { + Attribute at = (Attribute) attributes.get (i); + if ((ignoreCase && attrID.equalsIgnoreCase (at.getID ())) + || (! ignoreCase && attrID.equals (at.getID ()))) + { + attributes.remove (i); + return at; + } + } + + return null; + } + + public int size () + { + return attributes.size (); + } + + public String toString () + { + String r = ""; + for (int i = 0; i < attributes.size (); ++i) + { + if (i > 0) + r += "; "; + r += attributes.get (i).toString (); + } + return r; + } + + // This is set by the serialization spec. + private boolean ignoreCase; + private transient Vector attributes; + + // Used when enumerating. + private class BasicAttributesEnumeration implements NamingEnumeration + { + int where = -1; + boolean id; + + public BasicAttributesEnumeration (boolean id) + { + this.id = id; + } + + public void close () throws NamingException + { + } + + public boolean hasMore () throws NamingException + { + return hasMoreElements (); + } + + public Object next () throws NamingException + { + return nextElement (); + } + + public boolean hasMoreElements () + { + return where < attributes.size (); + } + + public Object nextElement () throws NoSuchElementException + { + if (where + 1 >= attributes.size ()) + throw new NoSuchElementException ("no more elements"); + ++where; + Attribute at = (Attribute) attributes.get (where); + return id ? (Object) at.getID () : (Object) at; + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/DirContext.java gcc-3.1/libjava/javax/naming/directory/DirContext.java *** gcc-3.0.4/libjava/javax/naming/directory/DirContext.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/directory/DirContext.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** package javax.naming.directory; *** 10,18 **** import javax.naming.*; public interface DirContext extends Context { ! public Attributes getAttributes (String name); ! public Attributes getAttributes (String name, String[] attrIds); ! } --- 10,50 ---- import javax.naming.*; + /** + * @author Warren Levy + * @date June 13, 2001 + */ + public interface DirContext extends Context { ! public static final int ADD_ATTRIBUTE = 1; ! public static final int REPLACE_ATTRIBUTE = 2; ! public static final int REMOVE_ATTRIBUTE = 3; + public Attributes getAttributes (String name) throws NamingException; + public Attributes getAttributes (String name, String[] attrIds) throws NamingException; + public Attributes getAttributes (Name name) throws NamingException; + public Attributes getAttributes(Name name, String[] attrIds) throws NamingException; + public void modifyAttributes(Name name, int mod_op, Attributes attrs) throws NamingException; + public void modifyAttributes(String name, int mod_op, Attributes attrs) throws NamingException; + public void modifyAttributes(Name name, ModificationItem[] mods) throws NamingException; + public void modifyAttributes(String name, ModificationItem[] mods) throws NamingException; + public void bind(Name name, Object obj, Attributes attrs) throws NamingException; + public void bind(String name, Object obj, Attributes attrs) throws NamingException; + public void rebind(Name name, Object obj, Attributes attrs) throws NamingException; + public void rebind(String name, Object obj, Attributes attrs) throws NamingException; + public DirContext createSubcontext(Name name, Attributes attrs) throws NamingException; + public DirContext createSubcontext(String name, Attributes attrs) throws NamingException; + public DirContext getSchema(Name name) throws NamingException; + public DirContext getSchema(String name) throws NamingException; + public DirContext getSchemaClassDefinition(Name name) throws NamingException; + public DirContext getSchemaClassDefinition(String name) throws NamingException; + public NamingEnumeration search(Name name, Attributes matchingAttributes, String[] attributesToReturn) throws NamingException; + public NamingEnumeration search(String name, Attributes matchingAttributes, String[] attributesToReturn) throws NamingException; + public NamingEnumeration search(Name name, Attributes matchingAttributes) throws NamingException; + public NamingEnumeration search(String name, Attributes matchingAttributes) throws NamingException; + public NamingEnumeration search(Name name, String filter, SearchControls cons) throws NamingException; + public NamingEnumeration search(String name, String filter, SearchControls cons) throws NamingException; + public NamingEnumeration search(Name name, String filterExpr, Object[] filterArgs, SearchControls cons) throws NamingException; + public NamingEnumeration search(String name, String filterExpr, Object[] filterArgs, SearchControls cons) throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/InitialDirContext.java gcc-3.1/libjava/javax/naming/directory/InitialDirContext.java *** gcc-3.0.4/libjava/javax/naming/directory/InitialDirContext.java Mon Nov 27 03:16:13 2000 --- gcc-3.1/libjava/javax/naming/directory/InitialDirContext.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** package javax.naming.directory; *** 11,20 **** import javax.naming.*; import java.util.Hashtable; public class InitialDirContext extends InitialContext implements DirContext { public InitialDirContext (Hashtable environment) { ! throw new Error ("javax.naming.directory.InitialDirContext not implemented"); } } --- 11,228 ---- import javax.naming.*; import java.util.Hashtable; + /** + * @author Tom Tromey + * @date June 25, 2001 + */ public class InitialDirContext extends InitialContext implements DirContext { + public InitialDirContext () + throws NamingException + { + this (null); + } + + protected InitialDirContext (boolean lazy) + throws NamingException + { + super (lazy); + } + public InitialDirContext (Hashtable environment) + throws NamingException { ! super (environment); ! } ! ! // The InitialContext docs suggest that this exist. And it does ! // seem like a good idea. but the InitialDirContext docs indicate ! // it cannot be non-private. ! private DirContext getURLOrDefaultInitDirCtx (Name name) ! throws NamingException ! { ! Context c = getURLOrDefaultInitCtx (name); ! if (c == null) ! throw new NoInitialContextException (); ! else if (! (c instanceof DirContext)) ! throw new NotContextException (); ! return (DirContext) c; ! } ! ! private DirContext getURLOrDefaultInitDirCtx (String name) ! throws NamingException ! { ! Context c = getURLOrDefaultInitCtx (name); ! if (c == null) ! throw new NoInitialContextException (); ! else if (! (c instanceof DirContext)) ! throw new NotContextException (); ! return (DirContext) c; ! } ! ! public Attributes getAttributes (String name) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getAttributes (name); ! } ! ! public Attributes getAttributes (String name, String[] attrIds) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getAttributes (name, attrIds); ! } ! ! public Attributes getAttributes (Name name) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getAttributes (name); ! } ! ! public Attributes getAttributes(Name name, String[] attrIds) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getAttributes (name, attrIds); ! } ! ! public void modifyAttributes(Name name, int mod_op, Attributes attrs) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).modifyAttributes (name, mod_op, attrs); ! } ! ! public void modifyAttributes(String name, int mod_op, Attributes attrs) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).modifyAttributes (name, mod_op, attrs); ! } ! ! public void modifyAttributes(Name name, ModificationItem[] mods) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).modifyAttributes (name, mods); ! } ! ! public void modifyAttributes(String name, ModificationItem[] mods) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).modifyAttributes (name, mods); ! } ! ! public void bind(Name name, Object obj, Attributes attrs) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).bind (name, obj, attrs); ! } ! ! public void bind(String name, Object obj, Attributes attrs) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).bind (name, obj, attrs); ! } ! ! public void rebind(Name name, Object obj, Attributes attrs) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).rebind (name, obj, attrs); ! } ! ! public void rebind(String name, Object obj, Attributes attrs) ! throws NamingException ! { ! getURLOrDefaultInitDirCtx (name).rebind (name, obj, attrs); ! } ! ! public DirContext createSubcontext(Name name, Attributes attrs) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).createSubcontext (name, attrs); ! } ! ! public DirContext createSubcontext(String name, Attributes attrs) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).createSubcontext (name, attrs); ! } ! ! public DirContext getSchema(Name name) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getSchema (name); ! } ! ! public DirContext getSchema(String name) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getSchema (name); ! } ! ! public DirContext getSchemaClassDefinition(Name name) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getSchemaClassDefinition (name); ! } ! ! public DirContext getSchemaClassDefinition(String name) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).getSchemaClassDefinition (name); ! } ! ! public NamingEnumeration search(Name name, Attributes matchingAttributes, ! String[] attributesToReturn) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, matchingAttributes, ! attributesToReturn); ! } ! ! public NamingEnumeration search(String name, Attributes matchingAttributes, ! String[] attributesToReturn) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, matchingAttributes, ! attributesToReturn); ! } ! ! public NamingEnumeration search(Name name, Attributes matchingAttributes) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, matchingAttributes); ! } ! ! public NamingEnumeration search(String name, Attributes matchingAttributes) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, matchingAttributes); ! } ! ! public NamingEnumeration search(Name name, String filter, ! SearchControls cons) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, filter, cons); ! } ! ! public NamingEnumeration search(String name, String filter, ! SearchControls cons) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, filter, cons); ! } ! ! public NamingEnumeration search(Name name, String filterExpr, ! Object[] filterArgs, SearchControls cons) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, filterExpr, ! filterArgs, cons); ! } ! ! public NamingEnumeration search(String name, String filterExpr, ! Object[] filterArgs, SearchControls cons) ! throws NamingException ! { ! return getURLOrDefaultInitDirCtx (name).search (name, filterExpr, ! filterArgs, cons); } } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/InvalidAttributeIdentifierException.java gcc-3.1/libjava/javax/naming/directory/InvalidAttributeIdentifierException.java *** gcc-3.0.4/libjava/javax/naming/directory/InvalidAttributeIdentifierException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/InvalidAttributeIdentifierException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class InvalidAttributeIdentifierException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class InvalidAttributeIdentifierException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/InvalidAttributeValueException.java gcc-3.1/libjava/javax/naming/directory/InvalidAttributeValueException.java *** gcc-3.0.4/libjava/javax/naming/directory/InvalidAttributeValueException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/InvalidAttributeValueException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class InvalidAttributeValueException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class InvalidAttributeValueException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/InvalidAttributesException.java gcc-3.1/libjava/javax/naming/directory/InvalidAttributesException.java *** gcc-3.0.4/libjava/javax/naming/directory/InvalidAttributesException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/InvalidAttributesException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class InvalidAttributesException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class InvalidAttributesException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/InvalidSearchControlsException.java gcc-3.1/libjava/javax/naming/directory/InvalidSearchControlsException.java *** gcc-3.0.4/libjava/javax/naming/directory/InvalidSearchControlsException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/InvalidSearchControlsException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class InvalidSearchControlsException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class InvalidSearchControlsException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/InvalidSearchFilterException.java gcc-3.1/libjava/javax/naming/directory/InvalidSearchFilterException.java *** gcc-3.0.4/libjava/javax/naming/directory/InvalidSearchFilterException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/InvalidSearchFilterException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class InvalidSearchFilterException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class InvalidSearchFilterException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/ModificationItem.java gcc-3.1/libjava/javax/naming/directory/ModificationItem.java *** gcc-3.0.4/libjava/javax/naming/directory/ModificationItem.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/directory/ModificationItem.java Wed Oct 24 21:39:17 2001 *************** *** 0 **** --- 1,49 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.directory; + import java.io.Serializable; + + /** + * @author Warren Levy + * @date June 13, 2001 + */ + + public class ModificationItem implements Serializable + { + // Serialized fields. + private int mod_op; + private Attribute attr; + + public ModificationItem(int mod_op, Attribute attr) + { + if (attr == null) + throw new IllegalArgumentException("attr is null"); + if (mod_op != DirContext.ADD_ATTRIBUTE && + mod_op != DirContext.REPLACE_ATTRIBUTE && + mod_op != DirContext.REMOVE_ATTRIBUTE) + throw new IllegalArgumentException("mod_op is invalid"); + this.mod_op = mod_op; + this.attr = attr; + } + + public int getModificationOp() + { + return mod_op; + } + + public Attribute getAttribute() + { + return attr; + } + + public String toString() + { + return "mod_op=" + mod_op + ":" + "attr=" + attr.toString(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/NoSuchAttributeException.java gcc-3.1/libjava/javax/naming/directory/NoSuchAttributeException.java *** gcc-3.0.4/libjava/javax/naming/directory/NoSuchAttributeException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/NoSuchAttributeException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class NoSuchAttributeException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class NoSuchAttributeException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/SchemaViolationException.java gcc-3.1/libjava/javax/naming/directory/SchemaViolationException.java *** gcc-3.0.4/libjava/javax/naming/directory/SchemaViolationException.java Mon Nov 27 08:44:59 2000 --- gcc-3.1/libjava/javax/naming/directory/SchemaViolationException.java Wed Oct 24 21:39:17 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** This software is copyrighted work licens *** 6,14 **** Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming; ! import java.lang.Exception; public class SchemaViolationException extends NamingException { --- 6,14 ---- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ ! package javax.naming.directory; ! import javax.naming.NamingException; public class SchemaViolationException extends NamingException { diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/SearchControls.java gcc-3.1/libjava/javax/naming/directory/SearchControls.java *** gcc-3.0.4/libjava/javax/naming/directory/SearchControls.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/directory/SearchControls.java Wed Oct 24 21:39:17 2001 *************** *** 0 **** --- 1,106 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.directory; + import java.io.Serializable; + + /** + * @author Warren Levy + * @date June 5, 2001 + */ + + public class SearchControls extends Object implements Serializable + { + public static final int OBJECT_SCOPE = 0; + public static final int ONELEVEL_SCOPE = 1; + public static final int SUBTREE_SCOPE = 2; + + // Serialized fields. + private int searchScope; + private int timeLimit; + private boolean derefLink; + private boolean returnObj; + private long countLimit; + private String[] attributesToReturn; + + public SearchControls() + { + this(ONELEVEL_SCOPE, 0L, 0, null, false, false); + } + + public SearchControls(int scope, long countlim, int timelim, String[] attrs, + boolean retobj, boolean deref) + { + searchScope = scope; + timeLimit = timelim; + derefLink = deref; + returnObj = retobj; + countLimit = countlim; + attributesToReturn = attrs; + } + + public int getSearchScope() + { + return searchScope; + } + + public int getTimeLimit() + { + return timeLimit; + } + + public boolean getDerefLinkFlag() + { + return derefLink; + } + + public boolean getReturningObjFlag() + { + return returnObj; + } + + public long getCountLimit() + { + return countLimit; + } + + public String[] getReturningAttributes() + { + return attributesToReturn; + } + + public void setSearchScope(int scope) + { + searchScope = scope; + } + + public void setTimeLimit(int ms) + { + timeLimit = ms; + } + + public void setDerefLinkFlag(boolean on) + { + derefLink = on; + } + + public void setReturningObjFlag(boolean on) + { + returnObj = on; + } + + public void setCountLimit(long limit) + { + countLimit = limit; + } + + public void setReturningAttributes(String[] attrs) + { + attributesToReturn = attrs; + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/directory/SearchResult.java gcc-3.1/libjava/javax/naming/directory/SearchResult.java *** gcc-3.0.4/libjava/javax/naming/directory/SearchResult.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/directory/SearchResult.java Wed Oct 24 21:39:17 2001 *************** *** 0 **** --- 1,64 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.directory; + import javax.naming.*; + import java.io.Serializable; + + /** + * @author Warren Levy + * @date June 13, 2001 + */ + + public class SearchResult extends Binding + { + // Serialized fields. + private Attributes attrs; + + public SearchResult(String name, Object obj, Attributes attrs) + { + super(name, obj); + this.attrs = attrs; + } + + public SearchResult(String name, Object obj, Attributes attrs, + boolean isRelative) + { + super(name, obj, isRelative); + this.attrs = attrs; + } + + public SearchResult(String name, String className, Object obj, + Attributes attrs) + { + super(name, className, obj); + this.attrs = attrs; + } + + public SearchResult(String name, String className, Object obj, + Attributes attrs, boolean isRelative) + { + super(name, className, obj, isRelative); + this.attrs = attrs; + } + + public Attributes getAttributes() + { + return attrs; + } + + public void setAttributes(Attributes attrs) + { + this.attrs = attrs; + } + + public String toString() + { + return super.toString() + ":" + attrs.toString(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/event/EventContext.java gcc-3.1/libjava/javax/naming/event/EventContext.java *** gcc-3.0.4/libjava/javax/naming/event/EventContext.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/event/EventContext.java Wed Oct 24 21:39:18 2001 *************** *** 0 **** --- 1,29 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.event; + import javax.naming.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface EventContext extends Context + { + public static final int OBJECT_SCOPE = 0; + public static final int ONELEVEL_SCOPE = 1; + public static final int SUBTREE_SCOPE = 2; + + public void addNamingListener(Name target, int scope, NamingListener l) + throws NamingException; + public void addNamingListener(String target, int scope, NamingListener l) + throws NamingException; + public void removeNamingListener(NamingListener l) throws NamingException; + public boolean targetMustExist() throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/event/EventDirContext.java gcc-3.1/libjava/javax/naming/event/EventDirContext.java *** gcc-3.0.4/libjava/javax/naming/event/EventDirContext.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/event/EventDirContext.java Wed Oct 24 21:39:18 2001 *************** *** 0 **** --- 1,31 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.event; + import javax.naming.*; + import javax.naming.directory.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface EventDirContext extends EventContext, DirContext + { + public void addNamingListener(Name target, String filter, SearchControls ctls, + NamingListener l) throws NamingException; + public void addNamingListener(String target, String filter, + SearchControls ctls, NamingListener l) + throws NamingException; + public void addNamingListener(Name target, String filter, Object[] filterArgs, + SearchControls ctls, NamingListener l) + throws NamingException; + public void addNamingListener(String target, String filter, + Object[] filterArgs, SearchControls ctls, + NamingListener l) throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/event/NamespaceChangeListener.java gcc-3.1/libjava/javax/naming/event/NamespaceChangeListener.java *** gcc-3.0.4/libjava/javax/naming/event/NamespaceChangeListener.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/event/NamespaceChangeListener.java Wed Oct 24 21:39:18 2001 *************** *** 0 **** --- 1,21 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.event; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface NamespaceChangeListener extends NamingListener + { + public void objectAdded(NamingEvent evt); + public void objectRemoved(NamingEvent evt); + public void objectRenamed(NamingEvent evt); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/event/NamingEvent.java gcc-3.1/libjava/javax/naming/event/NamingEvent.java *** gcc-3.0.4/libjava/javax/naming/event/NamingEvent.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/event/NamingEvent.java Wed Oct 24 21:39:18 2001 *************** *** 0 **** --- 1,89 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.event; + import javax.naming.*; + import java.util.EventObject; + + /** + * @author Warren Levy + * @date June 5, 2001 + */ + + public class NamingEvent extends EventObject + { + public static final int OBJECT_ADDED = 0; + public static final int OBJECT_REMOVED = 1; + public static final int OBJECT_RENAMED = 2; + public static final int OBJECT_CHANGED = 3; + + // Serialized fields. + protected Object changeInfo; + protected int type; + protected Binding oldBinding; + protected Binding newBinding; + + public NamingEvent(EventContext source, int type, Binding newBd, + Binding oldBd, Object changeInfo) + { + super(source); + this.type = type; + this.oldBinding = oldBd; + this.newBinding = newBd; + this.changeInfo = changeInfo; + // FIXME: for OBJECT_ADDED, newBd must not be null; + // FIXME: for OBJECT_CHANGED, newBd and oldBd must not be null; + // FIXME: for OBJECT_RENAMED, one of newBd or oldBd may be null if newBd or + // FIXME: oldBd is outside of the scope for which listener has registered. + // FIXME: namingExceptionThrown() is called for the listener in question. + } + + public int getType() + { + return type; + } + + public EventContext getEventContext() + { + return (EventContext) getSource(); + } + + public Binding getOldBinding() + { + return oldBinding; + } + + public Binding getNewBinding() + { + return newBinding; + } + + public Object getChangeInfo() + { + return changeInfo; + } + + public void dispatch(NamingListener listener) + { + switch (type) + { + case OBJECT_ADDED: + ((NamespaceChangeListener) listener).objectAdded(this); + break; + case OBJECT_REMOVED: + ((NamespaceChangeListener) listener).objectRemoved(this); + break; + case OBJECT_RENAMED: + ((NamespaceChangeListener) listener).objectRenamed(this); + break; + case OBJECT_CHANGED: + ((ObjectChangeListener) listener).objectChanged(this); + break; + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/event/NamingExceptionEvent.java gcc-3.1/libjava/javax/naming/event/NamingExceptionEvent.java *** gcc-3.0.4/libjava/javax/naming/event/NamingExceptionEvent.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/event/NamingExceptionEvent.java Wed Oct 24 21:39:18 2001 *************** *** 0 **** --- 1,43 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.event; + import javax.naming.*; + import java.util.EventObject; + + /** + * @author Warren Levy + * @date June 5, 2001 + */ + + public class NamingExceptionEvent extends EventObject + { + // Serialized fields. + private NamingException exception; + + public NamingExceptionEvent(EventContext source, NamingException exc) + { + super(source); + exception = exc; + } + + public NamingException getException() + { + return exception; + } + + public EventContext getEventContext() + { + return (EventContext) getSource(); + } + + public void dispatch(NamingListener listener) + { + listener.namingExceptionThrown(this); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/event/NamingListener.java gcc-3.1/libjava/javax/naming/event/NamingListener.java *** gcc-3.0.4/libjava/javax/naming/event/NamingListener.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/event/NamingListener.java Wed Oct 24 21:39:18 2001 *************** *** 0 **** --- 1,20 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.event; + import java.util.EventListener; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface NamingListener extends EventListener + { + public void namingExceptionThrown(NamingExceptionEvent evt); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/event/ObjectChangeListener.java gcc-3.1/libjava/javax/naming/event/ObjectChangeListener.java *** gcc-3.0.4/libjava/javax/naming/event/ObjectChangeListener.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/event/ObjectChangeListener.java Wed Oct 24 21:39:18 2001 *************** *** 0 **** --- 1,19 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.event; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface ObjectChangeListener extends NamingListener + { + public void objectChanged(NamingEvent evt); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/Control.java gcc-3.1/libjava/javax/naming/ldap/Control.java *** gcc-3.0.4/libjava/javax/naming/ldap/Control.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/Control.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,25 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import java.io.Serializable; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface Control extends Serializable + { + public static final boolean CRITICAL = true; + public static final boolean NONCRITICAL = false; + + public String getID(); + public boolean isCritical(); + public byte[] getEncodedValue(); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/ControlFactory.java gcc-3.1/libjava/javax/naming/ldap/ControlFactory.java *** gcc-3.0.4/libjava/javax/naming/ldap/ControlFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/ControlFactory.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,75 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + + import javax.naming.*; + import java.util.StringTokenizer; + import java.util.Hashtable; + + /** + * @author Tom Tromey + * @date June 22, 2001 + */ + public abstract class ControlFactory + { + protected ControlFactory () + { + } + + public abstract Control getControlInstance (Control control) + throws NamingException; + + public static Control getControlInstance (Control control, + Context ctx, + Hashtable env) + throws NamingException + { + String path = (String) env.get (LdapContext.CONTROL_FACTORIES); + String path2 = null; + if (ctx != null) + path2 = (String) ctx.getEnvironment ().get (LdapContext.CONTROL_FACTORIES); + if (path == null) + path = path2; + else if (path2 != null) + path += ":" + path2; + + StringTokenizer tokens = new StringTokenizer (path, ":"); + while (tokens.hasMoreTokens ()) + { + String name = tokens.nextToken (); + try + { + Class k = Class.forName (name); + ControlFactory cf = (ControlFactory) k.newInstance (); + Control ctrl = cf.getControlInstance (control); + if (ctrl != null) + return ctrl; + } + catch (ClassNotFoundException _1) + { + // Ignore it. + } + catch (ClassCastException _2) + { + // Ignore it. + } + catch (InstantiationException _3) + { + // If we couldn't instantiate the factory we might get + // this. + } + catch (IllegalAccessException _4) + { + // Another possibility when instantiating. + } + } + + return control; + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/ExtendedRequest.java gcc-3.1/libjava/javax/naming/ldap/ExtendedRequest.java *** gcc-3.0.4/libjava/javax/naming/ldap/ExtendedRequest.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/ExtendedRequest.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,26 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import java.io.Serializable; + import javax.naming.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface ExtendedRequest extends Serializable + { + public String getID(); + public byte[] getEncodedValue(); + public ExtendedResponse createExtendedResponse(String id, + byte[] berValue, int offset, + int length) + throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/ExtendedResponse.java gcc-3.1/libjava/javax/naming/ldap/ExtendedResponse.java *** gcc-3.0.4/libjava/javax/naming/ldap/ExtendedResponse.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/ExtendedResponse.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,21 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import java.io.Serializable; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface ExtendedResponse extends Serializable + { + public String getID(); + public byte[] getEncodedValue(); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/HasControls.java gcc-3.1/libjava/javax/naming/ldap/HasControls.java *** gcc-3.0.4/libjava/javax/naming/ldap/HasControls.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/HasControls.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,20 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import javax.naming.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface HasControls + { + public Control[] getControls() throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/InitialLdapContext.java gcc-3.1/libjava/javax/naming/ldap/InitialLdapContext.java *** gcc-3.0.4/libjava/javax/naming/ldap/InitialLdapContext.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/InitialLdapContext.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,99 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + + import javax.naming.*; + import javax.naming.directory.InitialDirContext; + import java.util.Hashtable; + + /** + * @author Tom Tromey + * @date June 21, 2001 + */ + public class InitialLdapContext + extends InitialDirContext + implements LdapContext + { + public InitialLdapContext () + throws NamingException + { + this (null, null); + } + + public InitialLdapContext (Hashtable environment, Control[] connControls) + throws NamingException + { + super (false); + + if (connControls != null) + { + if (environment == null) + environment = new Hashtable (); + else + environment = (Hashtable) environment.clone (); + environment.put ("java.naming.ldap.control.connect", + connControls); + } + + init (environment); + } + + private LdapContext getDefaultInitLdapCtx () + throws NamingException + { + Context c = getDefaultInitCtx (); + if (c == null) + throw new NoInitialContextException (); + else if (! (c instanceof LdapContext)) + throw new NotContextException (); + return (LdapContext) c; + } + + public ExtendedResponse extendedOperation (ExtendedRequest request) + throws NamingException + { + return getDefaultInitLdapCtx ().extendedOperation (request); + } + + public Control[] getConnectControls () + throws NamingException + { + return getDefaultInitLdapCtx ().getConnectControls (); + } + + public Control[] getRequestControls () + throws NamingException + { + return getDefaultInitLdapCtx ().getRequestControls (); + } + + public Control[] getResponseControls () + throws NamingException + { + return getDefaultInitLdapCtx ().getResponseControls (); + } + + public LdapContext newInstance (Control[] reqControls) + throws NamingException + { + return getDefaultInitLdapCtx ().newInstance (reqControls); + } + + public void reconnect (Control[] connControls) + throws NamingException + { + getDefaultInitLdapCtx ().reconnect (connControls); + } + + public void setRequestControls (Control[] reqControls) + throws NamingException + { + getDefaultInitLdapCtx ().setRequestControls (reqControls); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/LdapContext.java gcc-3.1/libjava/javax/naming/ldap/LdapContext.java *** gcc-3.0.4/libjava/javax/naming/ldap/LdapContext.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/LdapContext.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,32 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import javax.naming.*; + import javax.naming.directory.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface LdapContext extends DirContext + { + public static final String CONTROL_FACTORIES = "java.naming.factory.control"; + + public ExtendedResponse extendedOperation(ExtendedRequest request) + throws NamingException; + public LdapContext newInstance(Control[] requestControls) + throws NamingException; + public void reconnect(Control[] connCtls) throws NamingException; + public Control[] getConnectControls() throws NamingException; + public void setRequestControls(Control[] requestControls) + throws NamingException; + public Control[] getRequestControls() throws NamingException; + public Control[] getResponseControls() throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/LdapReferralException.java gcc-3.1/libjava/javax/naming/ldap/LdapReferralException.java *** gcc-3.0.4/libjava/javax/naming/ldap/LdapReferralException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/LdapReferralException.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,35 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import javax.naming.*; + import java.util.Hashtable; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public abstract class LdapReferralException extends ReferralException + { + protected LdapReferralException() + { + super(); + } + + protected LdapReferralException(String explanation) + { + super(explanation); + } + + public abstract Context getReferralContext() throws NamingException; + public abstract Context getReferralContext(Hashtable env) + throws NamingException; + public abstract Context getReferralContext(Hashtable env, Control[] reqCtls) + throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/UnsolicitedNotification.java gcc-3.1/libjava/javax/naming/ldap/UnsolicitedNotification.java *** gcc-3.0.4/libjava/javax/naming/ldap/UnsolicitedNotification.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/UnsolicitedNotification.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,21 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import javax.naming.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface UnsolicitedNotification extends ExtendedResponse, HasControls + { + public String[] getReferrals(); + public NamingException getException(); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/UnsolicitedNotificationEvent.java gcc-3.1/libjava/javax/naming/ldap/UnsolicitedNotificationEvent.java *** gcc-3.0.4/libjava/javax/naming/ldap/UnsolicitedNotificationEvent.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/UnsolicitedNotificationEvent.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,38 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import java.util.EventObject; + + /** + * @author Warren Levy + * @date June 5, 2001 + */ + + public class UnsolicitedNotificationEvent extends EventObject + { + // Serialized fields. + private UnsolicitedNotification notice; + + public UnsolicitedNotificationEvent(Object src, + UnsolicitedNotification notice) + { + super(src); + this.notice = notice; + } + + public UnsolicitedNotification getNotification() + { + return notice; + } + + public void dispatch(UnsolicitedNotificationListener listener) + { + listener.notificationReceived(this); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/ldap/UnsolicitedNotificationListener.java gcc-3.1/libjava/javax/naming/ldap/UnsolicitedNotificationListener.java *** gcc-3.0.4/libjava/javax/naming/ldap/UnsolicitedNotificationListener.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/ldap/UnsolicitedNotificationListener.java Wed Oct 24 21:39:20 2001 *************** *** 0 **** --- 1,20 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.ldap; + import javax.naming.event.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface UnsolicitedNotificationListener extends NamingListener + { + public void notificationReceived(UnsolicitedNotificationEvent evt); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/DirObjectFactory.java gcc-3.1/libjava/javax/naming/spi/DirObjectFactory.java *** gcc-3.0.4/libjava/javax/naming/spi/DirObjectFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/spi/DirObjectFactory.java Wed Oct 24 21:39:21 2001 *************** *** 0 **** --- 1,24 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.spi; + import javax.naming.*; + import javax.naming.directory.*; + import java.util.Hashtable; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface DirObjectFactory extends ObjectFactory + { + public Object getObjectInstance(Object obj, Name name, Context nameCtx, + Hashtable environment, Attributes attrs) + throws Exception; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/DirStateFactory.java gcc-3.1/libjava/javax/naming/spi/DirStateFactory.java *** gcc-3.0.4/libjava/javax/naming/spi/DirStateFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/spi/DirStateFactory.java Wed Oct 24 21:39:21 2001 *************** *** 0 **** --- 1,50 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.spi; + import javax.naming.*; + import javax.naming.directory.*; + import java.util.Hashtable; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface DirStateFactory extends StateFactory + { + // Inner class + + public static class Result + { + private Object obj; + private Attributes outAttrs; + + public Result(Object obj, Attributes outAttrs) + { + this.obj = obj; + this.outAttrs = outAttrs; + } + + public Object getObject() + { + return obj; + } + + public Attributes getAttributes() + { + return outAttrs; + } + } + + public DirStateFactory.Result getStateToBind(Object obj, Name name, + Context nameCtx, + Hashtable environment, + Attributes inAttrs) + throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/DirectoryManager.java gcc-3.1/libjava/javax/naming/spi/DirectoryManager.java *** gcc-3.0.4/libjava/javax/naming/spi/DirectoryManager.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/spi/DirectoryManager.java Wed Oct 24 21:39:21 2001 *************** *** 0 **** --- 1,204 ---- + /* Copyright (C) 2000, 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.spi; + + import javax.naming.*; + import javax.naming.directory.*; + import java.util.Hashtable; + import java.util.StringTokenizer; + import java.util.Enumeration; + + /** + * @author Tom Tromey + * @date June 25, 2001 + */ + public class DirectoryManager extends NamingManager + { + // Can't instantiate this class. + DirectoryManager () + { + } + + public static DirContext getContinuationDirContext (CannotProceedException c) + throws NamingException + { + return (DirContext) getContinuationContext (c); + } + + // Try to create an object using the factory. Return null on + // failure. + private static Object tryCreateObject (ObjectFactory factory, + Object refInfo, + Name name, + Context nameCtx, + Hashtable environment, + Attributes attrs) + throws Exception + { + if (factory instanceof DirObjectFactory) + { + DirObjectFactory dof = (DirObjectFactory) factory; + return dof.getObjectInstance (refInfo, name, nameCtx, + environment, attrs); + } + else + return factory.getObjectInstance (refInfo, name, nameCtx, + environment); + } + + public static Object getObjectInstance (Object refInfo, Name name, + Context nameCtx, + Hashtable environment, + Attributes attrs) + throws Exception + { + ObjectFactory factory = null; + + if (ofb != null) + factory = ofb.createObjectFactory (refInfo, environment); + else + { + // First see if we have a Reference or a Referenceable. If so + // we do some special processing. + Object ref2 = refInfo; + if (refInfo instanceof Referenceable) + ref2 = ((Referenceable) refInfo).getReference (); + if (ref2 instanceof Reference) + { + Reference ref = (Reference) ref2; + + // If we have a factory class name then we use that. + String fClass = ref.getFactoryClassName (); + if (fClass != null) + { + // Exceptions here are passed to the caller. + Class k = Class.forName (fClass); + factory = (ObjectFactory) k.newInstance (); + } + else + { + // There's no factory class name. If the address is a + // StringRefAddr with address type `URL', then we try + // the URL's context factory. + Enumeration e = ref.getAll (); + while (e.hasMoreElements ()) + { + RefAddr ra = (RefAddr) e.nextElement (); + if (ra instanceof StringRefAddr + && "URL".equals (ra.getType ())) + { + factory + = (ObjectFactory) getURLContext (refInfo, + name, + nameCtx, + (String) ra.getContent (), + environment); + Object obj = tryCreateObject (factory, + refInfo, + name, + nameCtx, + environment, + attrs); + if (obj != null) + return obj; + } + } + + // Have to try the next step. + factory = null; + } + } + + // Now look at OBJECT_FACTORIES to find the factory. + if (factory == null) + { + StringTokenizer tokens = getPlusPath (Context.OBJECT_FACTORIES, + environment, nameCtx); + + while (tokens.hasMoreTokens ()) + { + String klassName = tokens.nextToken (); + Class k = Class.forName (klassName); + factory = (ObjectFactory) k.newInstance (); + Object obj = tryCreateObject (factory, refInfo, name, + nameCtx, environment, attrs); + if (obj != null) + return obj; + } + + // Failure. + return refInfo; + } + } + + if (factory == null) + return refInfo; + Object obj = tryCreateObject (factory, refInfo, name, + nameCtx, environment, attrs); + return obj == null ? refInfo : obj; + } + + public static DirStateFactory.Result getStateToBind (Object obj, + Name name, + Context nameCtx, + Hashtable environment, + Attributes attrs) + throws NamingException + { + StringTokenizer tokens = getPlusPath (Context.STATE_FACTORIES, + environment, nameCtx); + while (tokens.hasMoreTokens ()) + { + String klassName = tokens.nextToken (); + try + { + Class k = Class.forName (klassName); + StateFactory factory = (StateFactory) k.newInstance (); + + DirStateFactory.Result result = null; + if (factory instanceof DirStateFactory) + { + DirStateFactory dsf = (DirStateFactory) factory; + result = dsf.getStateToBind (obj, name, nameCtx, environment, + attrs); + } + else + { + Object o = factory.getStateToBind (obj, name, nameCtx, + environment); + if (o != null) + result = new DirStateFactory.Result (o, attrs); + } + if (result != null) + return result; + } + catch (ClassNotFoundException _1) + { + // Ignore it. + } + catch (ClassCastException _2) + { + // This means that the class we found was not an + // ObjectFactory or that the factory returned something + // which was not a Context. + } + catch (InstantiationException _3) + { + // If we couldn't instantiate the factory we might get + // this. + } + catch (IllegalAccessException _4) + { + // Another possibility when instantiating. + } + } + + return new DirStateFactory.Result (obj, attrs); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/NamingManager.java gcc-3.1/libjava/javax/naming/spi/NamingManager.java *** gcc-3.0.4/libjava/javax/naming/spi/NamingManager.java Mon Nov 27 03:16:14 2000 --- gcc-3.1/libjava/javax/naming/spi/NamingManager.java Wed Oct 24 21:39:21 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. *************** *** 8,26 **** package javax.naming.spi; ! import java.util.Hashtable; import javax.naming.*; public class NamingManager { private static InitialContextFactoryBuilder icfb = null; public static boolean hasInitialContextFactoryBuilder () { return icfb != null; } ! public static Context getInitialContext (Hashtable environment) throws NamingException { InitialContextFactory icf = null; --- 8,35 ---- package javax.naming.spi; ! import java.util.*; import javax.naming.*; public class NamingManager { + public static final String CPE = "java.naming.spi.CannotProceedException"; + private static InitialContextFactoryBuilder icfb = null; + private static ObjectFactoryBuilder ofb = null; + + // This class cannot be instantiated. + NamingManager () + { + } public static boolean hasInitialContextFactoryBuilder () { return icfb != null; } ! public static Context getInitialContext (Hashtable environment) ! throws NamingException { InitialContextFactory icf = null; *************** public class NamingManager *** 33,57 **** java_naming_factory_initial = (String) environment.get (Context.INITIAL_CONTEXT_FACTORY); if (java_naming_factory_initial == null) ! throw new NoInitialContextException ("Can't find property: " + Context.INITIAL_CONTEXT_FACTORY); ! ! try { ! icf = (InitialContextFactory) Thread.currentThread().getContextClassLoader().loadClass(java_naming_factory_initial).newInstance(); ! } catch (Exception exception) { ! NoInitialContextException e ! = new NoInitialContextException("Can't load InitialContextFactory class: " + java_naming_factory_initial); ! e.setRootCause(exception); ! throw e; ! } } ! return icf.getInitialContext (environment); } ! public static Context getURLContext(String scheme, ! Hashtable environment) throws NamingException { ! throw new Error ("javax.naming.spi.NamingManager.getURLContext not implemented"); } } --- 42,338 ---- java_naming_factory_initial = (String) environment.get (Context.INITIAL_CONTEXT_FACTORY); if (java_naming_factory_initial == null) ! java_naming_factory_initial = ! System.getProperty (Context.INITIAL_CONTEXT_FACTORY); ! if (java_naming_factory_initial == null) ! throw new ! NoInitialContextException ("Can't find property: " ! + Context.INITIAL_CONTEXT_FACTORY); ! ! try ! { ! icf = (InitialContextFactory) Class.forName (java_naming_factory_initial).newInstance (); ! } ! catch (Exception exception) ! { ! NoInitialContextException e ! = new NoInitialContextException ("Can't load InitialContextFactory class: " ! + java_naming_factory_initial); ! e.setRootCause(exception); ! throw e; ! } } ! return icf.getInitialContext (environment); } ! static Context getURLContext (Object refInfo, ! Name name, ! Context nameCtx, ! String scheme, ! Hashtable environment) ! throws NamingException ! { ! String prefixes = null; ! if (environment != null) ! prefixes = (String) environment.get (Context.URL_PKG_PREFIXES); ! if (prefixes == null) ! prefixes = System.getProperty (Context.URL_PKG_PREFIXES); ! if (prefixes == null) ! { ! // Specified as the default in the docs. Unclear if this is ! // right for us. ! prefixes = "com.sun.jndi.url"; ! } ! ! scheme += "URLContextFactory"; ! ! StringTokenizer tokens = new StringTokenizer (prefixes, ":"); ! while (tokens.hasMoreTokens ()) ! { ! String aTry = tokens.nextToken (); ! try ! { ! Class factoryClass = Class.forName (aTry + "." + scheme); ! ObjectFactory factory = ! (ObjectFactory) factoryClass.newInstance (); ! Object obj = factory.getObjectInstance (refInfo, name, ! nameCtx, environment); ! Context ctx = (Context) obj; ! if (ctx != null) ! return ctx; ! } ! catch (ClassNotFoundException _1) ! { ! // Ignore it. ! } ! catch (ClassCastException _2) ! { ! // This means that the class we found was not an ! // ObjectFactory or that the factory returned something ! // which was not a Context. ! } ! catch (InstantiationException _3) ! { ! // If we couldn't instantiate the factory we might get ! // this. ! } ! catch (IllegalAccessException _4) ! { ! // Another possibility when instantiating. ! } ! catch (NamingException _5) ! { ! throw _5; ! } ! catch (Exception _6) ! { ! // Anything from getObjectInstance. ! } ! } ! ! return null; ! } ! ! public static Context getURLContext (String scheme, ! Hashtable environment) throws NamingException { ! return getURLContext (null, null, null, scheme, environment); ! } ! ! public static void setObjectFactoryBuilder (ObjectFactoryBuilder builder) ! throws NamingException ! { ! SecurityManager sm = System.getSecurityManager (); ! if (sm != null) ! sm.checkSetFactory (); ! // Once the builder is installed it cannot be replaced. ! if (ofb != null) ! throw new IllegalStateException ("builder already installed"); ! if (builder != null) ! ofb = builder; ! } ! ! static StringTokenizer getPlusPath (String property, Hashtable env, ! Context nameCtx) ! throws NamingException ! { ! String path = (String) env.get (property); ! if (nameCtx == null) ! nameCtx = getInitialContext (env); ! String path2 = (String) nameCtx.getEnvironment ().get (property); ! if (path == null) ! path = path2; ! else if (path2 != null) ! path += ":" + path2; ! return new StringTokenizer (path, ":"); ! } ! ! public static Object getObjectInstance (Object refInfo, ! Name name, ! Context nameCtx, ! Hashtable environment) ! throws Exception ! { ! ObjectFactory factory = null; ! ! if (ofb != null) ! factory = ofb.createObjectFactory (refInfo, environment); ! else ! { ! // First see if we have a Reference or a Referenceable. If so ! // we do some special processing. ! Object ref2 = refInfo; ! if (refInfo instanceof Referenceable) ! ref2 = ((Referenceable) refInfo).getReference (); ! if (ref2 instanceof Reference) ! { ! Reference ref = (Reference) ref2; ! ! // If we have a factory class name then we use that. ! String fClass = ref.getFactoryClassName (); ! if (fClass != null) ! { ! // Exceptions here are passed to the caller. ! Class k = Class.forName (fClass); ! factory = (ObjectFactory) k.newInstance (); ! } ! else ! { ! // There's no factory class name. If the address is a ! // StringRefAddr with address type `URL', then we try ! // the URL's context factory. ! Enumeration e = ref.getAll (); ! while (e.hasMoreElements ()) ! { ! RefAddr ra = (RefAddr) e.nextElement (); ! if (ra instanceof StringRefAddr ! && "URL".equals (ra.getType ())) ! { ! factory ! = (ObjectFactory) getURLContext (refInfo, ! name, ! nameCtx, ! (String) ra.getContent (), ! environment); ! Object obj = factory.getObjectInstance (refInfo, ! name, ! nameCtx, ! environment); ! if (obj != null) ! return obj; ! } ! } ! ! // Have to try the next step. ! factory = null; ! } ! } ! ! // Now look at OBJECT_FACTORIES to find the factory. ! if (factory == null) ! { ! StringTokenizer tokens = getPlusPath (Context.OBJECT_FACTORIES, ! environment, nameCtx); ! ! while (tokens.hasMoreTokens ()) ! { ! String klassName = tokens.nextToken (); ! Class k = Class.forName (klassName); ! factory = (ObjectFactory) k.newInstance (); ! Object obj = factory.getObjectInstance (refInfo, name, ! nameCtx, environment); ! if (obj != null) ! return obj; ! } ! ! // Failure. ! return refInfo; ! } ! } ! ! if (factory == null) ! return refInfo; ! Object obj = factory.getObjectInstance (refInfo, name, ! nameCtx, environment); ! return obj == null ? refInfo : obj; ! } ! ! public static void setInitialContextFactoryBuilder (InitialContextFactoryBuilder builder) ! throws NamingException ! { ! SecurityManager sm = System.getSecurityManager (); ! if (sm != null) ! sm.checkSetFactory (); ! // Once the builder is installed it cannot be replaced. ! if (icfb != null) ! throw new IllegalStateException ("builder already installed"); ! if (builder != null) ! icfb = builder; ! } ! ! public static Context getContinuationContext (CannotProceedException cpe) ! throws NamingException ! { ! Hashtable env = cpe.getEnvironment (); ! if (env != null) ! env.put (CPE, cpe); ! ! // It is really unclear to me if this is right. ! try ! { ! Object obj = getObjectInstance (null, cpe.getAltName (), ! cpe.getAltNameCtx (), env); ! if (obj != null) ! return (Context) obj; ! } ! catch (Exception _) ! { ! } ! ! throw cpe; ! } ! ! public static Object getStateToBind (Object obj, Name name, ! Context nameCtx, Hashtable environment) ! throws NamingException ! { ! StringTokenizer tokens = getPlusPath (Context.STATE_FACTORIES, ! environment, nameCtx); ! while (tokens.hasMoreTokens ()) ! { ! String klassName = tokens.nextToken (); ! try ! { ! Class k = Class.forName (klassName); ! StateFactory factory = (StateFactory) k.newInstance (); ! Object o = factory.getStateToBind (obj, name, nameCtx, ! environment); ! if (o != null) ! return o; ! } ! catch (ClassNotFoundException _1) ! { ! // Ignore it. ! } ! catch (ClassCastException _2) ! { ! // This means that the class we found was not an ! // ObjectFactory or that the factory returned something ! // which was not a Context. ! } ! catch (InstantiationException _3) ! { ! // If we couldn't instantiate the factory we might get ! // this. ! } ! catch (IllegalAccessException _4) ! { ! // Another possibility when instantiating. ! } ! } ! ! return obj; } } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/ObjectFactory.java gcc-3.1/libjava/javax/naming/spi/ObjectFactory.java *** gcc-3.0.4/libjava/javax/naming/spi/ObjectFactory.java Mon Nov 27 03:16:14 2000 --- gcc-3.1/libjava/javax/naming/spi/ObjectFactory.java Wed Oct 24 21:39:22 2001 *************** *** 1,4 **** ! /* Copyright (C) 2000 Free Software Foundation This file is part of libgcj. --- 1,4 ---- ! /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. *************** package javax.naming.spi; *** 11,24 **** import java.util.Hashtable; import javax.naming.*; ! public class ObjectFactory { public Object getObjectInstance (Object obj, Name name, Context nameCtx, Hashtable environment) ! throws Exception ! { ! throw new Error ("javax.naming.spi.ObjectFactory.getObjectInstance not implemented"); ! } } --- 11,21 ---- import java.util.Hashtable; import javax.naming.*; ! public interface ObjectFactory { public Object getObjectInstance (Object obj, Name name, Context nameCtx, Hashtable environment) ! throws Exception; } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/ObjectFactoryBuilder.java gcc-3.1/libjava/javax/naming/spi/ObjectFactoryBuilder.java *** gcc-3.0.4/libjava/javax/naming/spi/ObjectFactoryBuilder.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/spi/ObjectFactoryBuilder.java Wed Oct 24 21:39:22 2001 *************** *** 0 **** --- 1,23 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.spi; + import javax.naming.*; + import java.util.Hashtable; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface ObjectFactoryBuilder + { + public ObjectFactory createObjectFactory(Object obj, + Hashtable environment) + throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/ResolveResult.java gcc-3.1/libjava/javax/naming/spi/ResolveResult.java *** gcc-3.0.4/libjava/javax/naming/spi/ResolveResult.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/spi/ResolveResult.java Wed Oct 24 21:39:22 2001 *************** *** 0 **** --- 1,93 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.spi; + import javax.naming.*; + import java.util.EventObject; + import java.io.Serializable; + + /** + * @author Warren Levy + * @date June 5, 2001 + */ + + public class ResolveResult implements Serializable + { + // Serialized fields. + protected Object resolvedObj; + protected Name remainingName; + + protected ResolveResult() + { + resolvedObj = null; + remainingName = null; + } + + public ResolveResult(Object robj, String rcomp) + { + if (robj == null || rcomp == null) + throw new IllegalArgumentException (); + resolvedObj = robj; + remainingName = new CompositeName (); + try + { + remainingName.add (rcomp); + } + catch (InvalidNameException _) + { + } + } + + public ResolveResult(Object robj, Name rname) + { + resolvedObj = robj; + remainingName = rname; + } + + public Name getRemainingName() + { + return remainingName; + } + + public Object getResolvedObj() + { + return resolvedObj; + } + + public void setRemainingName(Name name) + { + remainingName = (Name) name.clone(); + } + + public void appendRemainingName(Name name) + { + try + { + remainingName.addAll(name); + } + catch (InvalidNameException _) + { + } + } + + public void appendRemainingComponent(String name) + { + try + { + remainingName.add(name); + } + catch (InvalidNameException _) + { + } + } + + public void setResolvedObj(Object obj) + { + resolvedObj = obj; + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/Resolver.java gcc-3.1/libjava/javax/naming/spi/Resolver.java *** gcc-3.0.4/libjava/javax/naming/spi/Resolver.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/spi/Resolver.java Wed Oct 24 21:39:22 2001 *************** *** 0 **** --- 1,23 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.spi; + import javax.naming.*; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface Resolver + { + public ResolveResult resolveToClass(Name name, Class contextType) + throws NamingException; + public ResolveResult resolveToClass(String name, Class contextType) + throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/naming/spi/StateFactory.java gcc-3.1/libjava/javax/naming/spi/StateFactory.java *** gcc-3.0.4/libjava/javax/naming/spi/StateFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/naming/spi/StateFactory.java Wed Oct 24 21:39:22 2001 *************** *** 0 **** --- 1,22 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.naming.spi; + import javax.naming.*; + import java.util.Hashtable; + + /** + * @author Warren Levy + * @date June 1, 2001 + */ + + public interface StateFactory + { + public Object getStateToBind(Object obj, Name name, Context nameCtx, + Hashtable environment) throws NamingException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/HeuristicCommitException.java gcc-3.1/libjava/javax/transaction/HeuristicCommitException.java *** gcc-3.0.4/libjava/javax/transaction/HeuristicCommitException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/HeuristicCommitException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,27 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public class HeuristicCommitException extends java.lang.Exception + { + public HeuristicCommitException () + { + super(); + } + + public HeuristicCommitException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/HeuristicMixedException.java gcc-3.1/libjava/javax/transaction/HeuristicMixedException.java *** gcc-3.0.4/libjava/javax/transaction/HeuristicMixedException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/HeuristicMixedException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,27 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public class HeuristicMixedException extends java.lang.Exception + { + public HeuristicMixedException () + { + super(); + } + + public HeuristicMixedException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/HeuristicRollbackException.java gcc-3.1/libjava/javax/transaction/HeuristicRollbackException.java *** gcc-3.0.4/libjava/javax/transaction/HeuristicRollbackException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/HeuristicRollbackException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,27 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public class HeuristicRollbackException extends java.lang.Exception + { + public HeuristicRollbackException () + { + super(); + } + + public HeuristicRollbackException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/InvalidTransactionException.java gcc-3.1/libjava/javax/transaction/InvalidTransactionException.java *** gcc-3.0.4/libjava/javax/transaction/InvalidTransactionException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/InvalidTransactionException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,29 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + import java.rmi.RemoteException; + + /** + * @author Tom Tromey + * @date April 18, 2001 + */ + + public class InvalidTransactionException extends RemoteException + { + public InvalidTransactionException () + { + super(); + } + + public InvalidTransactionException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/NotSupportedException.java gcc-3.1/libjava/javax/transaction/NotSupportedException.java *** gcc-3.0.4/libjava/javax/transaction/NotSupportedException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/NotSupportedException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,27 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public class NotSupportedException extends java.lang.Exception + { + public NotSupportedException () + { + super(); + } + + public NotSupportedException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/RollbackException.java gcc-3.1/libjava/javax/transaction/RollbackException.java *** gcc-3.0.4/libjava/javax/transaction/RollbackException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/RollbackException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,27 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public class RollbackException extends java.lang.Exception + { + public RollbackException () + { + super(); + } + + public RollbackException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/Status.java gcc-3.1/libjava/javax/transaction/Status.java *** gcc-3.0.4/libjava/javax/transaction/Status.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/Status.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,28 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public abstract interface Status + { + public static final int STATUS_ACTIVE = 0; + public static final int STATUS_MARKED_ROLLBACK = 1; + public static final int STATUS_PREPARED = 2; + public static final int STATUS_COMMITTED = 3; + public static final int STATUS_ROLLEDBACK = 4; + public static final int STATUS_UNKNOWN = 5; + public static final int STATUS_NO_TRANSACTION = 6; + public static final int STATUS_PREPARING = 7; + public static final int STATUS_COMMITTING = 8; + public static final int STATUS_ROLLING_BACK = 9; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/Synchronization.java gcc-3.1/libjava/javax/transaction/Synchronization.java *** gcc-3.0.4/libjava/javax/transaction/Synchronization.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/Synchronization.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,20 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public abstract interface Synchronization + { + public void beforeCompletion(); + public void afterCompletion(int status); + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/SystemException.java gcc-3.1/libjava/javax/transaction/SystemException.java *** gcc-3.0.4/libjava/javax/transaction/SystemException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/SystemException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,35 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public class SystemException extends java.lang.Exception + { + public int errorCode; + + public SystemException () + { + super(); + } + + public SystemException (String msg) + { + super(msg); + } + + public SystemException(int errcode) + { + super (); + this.errorCode = errcode; + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/Transaction.java gcc-3.1/libjava/javax/transaction/Transaction.java *** gcc-3.0.4/libjava/javax/transaction/Transaction.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/Transaction.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,33 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + import javax.transaction.xa.XAResource; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public abstract interface Transaction + { + public void commit() + throws RollbackException, HeuristicMixedException, + HeuristicRollbackException, java.lang.SecurityException, SystemException; + public boolean delistResource(XAResource xaRes, int flag) + throws java.lang.IllegalStateException, SystemException; + public boolean enlistResource(XAResource xaRes) + throws RollbackException, java.lang.IllegalStateException, SystemException; + public int getStatus() throws SystemException; + public void registerSynchronization(Synchronization sync) + throws RollbackException, java.lang.IllegalStateException, SystemException; + public void rollback() + throws java.lang.IllegalStateException, SystemException; + public void setRollbackOnly() + throws java.lang.IllegalStateException, SystemException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/TransactionManager.java gcc-3.1/libjava/javax/transaction/TransactionManager.java *** gcc-3.0.4/libjava/javax/transaction/TransactionManager.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/TransactionManager.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,35 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public abstract interface TransactionManager + { + public void begin() throws NotSupportedException, SystemException; + public void commit() + throws RollbackException, HeuristicMixedException, + HeuristicRollbackException, java.lang.SecurityException, + java.lang.IllegalStateException, SystemException; + public int getStatus() throws SystemException; + public Transaction getTransaction() throws SystemException; + public void resume(Transaction tobj) + throws InvalidTransactionException, java.lang.IllegalStateException, + SystemException; + public void rollback() + throws java.lang.IllegalStateException, java.lang.SecurityException, + SystemException; + public void setRollbackOnly() + throws java.lang.IllegalStateException, SystemException; + public void setTransactionTimeout(int seconds) throws SystemException; + public Transaction suspend() throws SystemException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/TransactionRequiredException.java gcc-3.1/libjava/javax/transaction/TransactionRequiredException.java *** gcc-3.0.4/libjava/javax/transaction/TransactionRequiredException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/TransactionRequiredException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,29 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + import java.rmi.RemoteException; + + /** + * @author Tom Tromey + * @date April 18, 2001 + */ + + public class TransactionRequiredException extends RemoteException + { + public TransactionRequiredException () + { + super(); + } + + public TransactionRequiredException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/TransactionRolledbackException.java gcc-3.1/libjava/javax/transaction/TransactionRolledbackException.java *** gcc-3.0.4/libjava/javax/transaction/TransactionRolledbackException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/TransactionRolledbackException.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,29 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + import java.rmi.RemoteException; + + /** + * @author Tom Tromey + * @date April 18, 2001 + */ + + public class TransactionRolledbackException extends RemoteException + { + public TransactionRolledbackException () + { + super(); + } + + public TransactionRolledbackException (String msg) + { + super(msg); + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/UserTransaction.java gcc-3.1/libjava/javax/transaction/UserTransaction.java *** gcc-3.0.4/libjava/javax/transaction/UserTransaction.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/UserTransaction.java Wed Oct 24 21:39:23 2001 *************** *** 0 **** --- 1,30 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public abstract interface UserTransaction + { + public void begin() throws NotSupportedException, SystemException; + public void commit() + throws RollbackException, HeuristicMixedException, + HeuristicRollbackException, java.lang.SecurityException, + java.lang.IllegalStateException, SystemException; + public void rollback() + throws java.lang.IllegalStateException, java.lang.SecurityException, + SystemException; + public void setRollbackOnly() + throws java.lang.IllegalStateException, SystemException; + public int getStatus() throws SystemException; + public void setTransactionTimeout(int seconds) throws SystemException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/xa/XAException.java gcc-3.1/libjava/javax/transaction/xa/XAException.java *** gcc-3.0.4/libjava/javax/transaction/xa/XAException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/xa/XAException.java Wed Oct 24 21:39:24 2001 *************** *** 0 **** --- 1,60 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction.xa; + + /** + * @author Tom Tromey + * @date April 18, 2001 + */ + + public class XAException extends Exception + { + public int errorCode; + public static final int XA_RBBASE = 100; + public static final int XA_RBROLLBACK = 100; + public static final int XA_RBCOMMFAIL = 101; + public static final int XA_RBDEADLOCK = 102; + public static final int XA_RBINTEGRITY = 103; + public static final int XA_RBOTHER = 104; + public static final int XA_RBPROTO = 105; + public static final int XA_RBTIMEOUT = 106; + public static final int XA_RBTRANSIENT = 107; + public static final int XA_RBEND = 107; + public static final int XA_NOMIGRATE = 9; + public static final int XA_HEURHAZ = 8; + public static final int XA_HEURCOM = 7; + public static final int XA_HEURRB = 6; + public static final int XA_HEURMIX = 5; + public static final int XA_RETRY = 4; + public static final int XA_RDONLY = 3; + public static final int XAER_ASYNC = -2; + public static final int XAER_RMERR = -3; + public static final int XAER_NOTA = -4; + public static final int XAER_INVAL = -5; + public static final int XAER_PROTO = -6; + public static final int XAER_RMFAIL = -7; + public static final int XAER_DUPID = -8; + public static final int XAER_OUTSIDE = -9; + + public XAException () + { + super (); + } + + public XAException (String msg) + { + super (msg); + } + + public XAException (int errcode) + { + super (); + this.errorCode = errcode; + } + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/xa/XAResource.java gcc-3.1/libjava/javax/transaction/xa/XAResource.java *** gcc-3.0.4/libjava/javax/transaction/xa/XAResource.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/xa/XAResource.java Wed Oct 24 21:39:24 2001 *************** *** 0 **** --- 1,40 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction.xa; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public abstract interface XAResource + { + public static final int TMENDRSCAN = 8388608; + public static final int TMFAIL = 536870912; + public static final int TMJOIN = 2097152; + public static final int TMNOFLAGS = 0; + public static final int TMONEPHASE = 1073741824; + public static final int TMRESUME = 134217728; + public static final int TMSTARTRSCAN = 16777216; + public static final int TMSUCCESS = 67108864; + public static final int TMSUSPEND = 33554432; + public static final int XA_RDONLY = 3; + public static final int XA_OK = 0; + + public void commit(Xid xid, boolean onePhase) throws XAException; + public void end(Xid xid, int flags) throws XAException; + public void forget(Xid xid) throws XAException; + public int getTransactionTimeout() throws XAException; + public boolean isSameRM(XAResource xares) throws XAException; + public int prepare(Xid xid) throws XAException; + public Xid[] recover(int flag) throws XAException; + public void rollback(Xid xid) throws XAException; + public boolean setTransactionTimeout(int seconds) throws XAException; + public void start(Xid xid, int flags) throws XAException; + } diff -Nrc3pad gcc-3.0.4/libjava/javax/transaction/xa/Xid.java gcc-3.1/libjava/javax/transaction/xa/Xid.java *** gcc-3.0.4/libjava/javax/transaction/xa/Xid.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/javax/transaction/xa/Xid.java Wed Oct 24 21:39:24 2001 *************** *** 0 **** --- 1,24 ---- + /* Copyright (C) 2001 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + package javax.transaction.xa; + + /** + * @author Warren Levy + * @date May 25, 2001 + */ + + public abstract interface Xid + { + public static final int MAXGTRIDSIZE = 64; + public static final int MAXBQUALSIZE = 64; + + public int getFormatId(); + public byte[] getGlobalTransactionId(); + public byte[] getBranchQualifier(); + } diff -Nrc3pad gcc-3.0.4/libjava/jni.cc gcc-3.1/libjava/jni.cc *** gcc-3.0.4/libjava/jni.cc Mon Nov 5 19:10:34 2001 --- gcc-3.1/libjava/jni.cc Tue Mar 5 22:40:01 2002 *************** *** 1,6 **** // jni.cc - JNI implementation, including the jump table. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // jni.cc - JNI implementation, including the jump table. ! /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 13,21 **** #include #include - // Define this before including jni.h. - #define __GCJ_JNI_IMPL__ - #include #include #include --- 13,18 ---- *************** details. */ *** 29,35 **** #include #include #include ! #include #include #include #include --- 26,32 ---- #include #include #include ! #include #include #include #include *************** details. */ *** 37,59 **** #include #include #include ! #include #include #include ! #include #include #include #include ! // FIXME: remove these defines. ! #define ClassClass java::lang::Class::class$ ! #define ObjectClass java::lang::Object::class$ ! #define ThrowableClass java::lang::Throwable::class$ ! #define MethodClass java::lang::reflect::Method::class$ ! #define ThreadGroupClass java::lang::ThreadGroup::class$ ! #define NativeThreadClass gnu::gcj::jni::NativeThread::class$ // This enum is used to select different template instantiations in // the invocation code. --- 34,51 ---- #include #include #include ! #include #include #include ! #include #include #include #include + #include ! using namespace gcj; // This enum is used to select different template instantiations in // the invocation code. *************** struct _Jv_JNI_LocalFrame *** 97,104 **** jobject vec[0]; }; ! // This holds a reference count for all local and global references. ! static java::util::Hashtable *ref_table; // The only VM. static JavaVM *the_vm; --- 89,98 ---- jobject vec[0]; }; ! // This holds a reference count for all local references. ! static java::util::IdentityHashMap *local_ref_table; ! // This holds a reference count for all global references. ! static java::util::IdentityHashMap *global_ref_table; // The only VM. static JavaVM *the_vm; *************** jvmpiDisableEvent (jint event_type, void *** 153,160 **** void _Jv_JNI_Init (void) { ! ref_table = new java::util::Hashtable; ! #ifdef ENABLE_JVMPI _Jv_JVMPI_Interface.version = 1; _Jv_JVMPI_Interface.EnableEvent = &jvmpiEnableEvent; --- 147,155 ---- void _Jv_JNI_Init (void) { ! local_ref_table = new java::util::IdentityHashMap; ! global_ref_table = new java::util::IdentityHashMap; ! #ifdef ENABLE_JVMPI _Jv_JVMPI_Interface.version = 1; _Jv_JVMPI_Interface.EnableEvent = &jvmpiEnableEvent; *************** _Jv_JNI_Init (void) *** 167,173 **** // Tell the GC that a certain pointer is live. static void ! mark_for_gc (jobject obj) { JvSynchronize sync (ref_table); --- 162,168 ---- // Tell the GC that a certain pointer is live. static void ! mark_for_gc (jobject obj, java::util::IdentityHashMap *ref_table) { JvSynchronize sync (ref_table); *************** mark_for_gc (jobject obj) *** 180,186 **** // Unmark a pointer. static void ! unmark_for_gc (jobject obj) { JvSynchronize sync (ref_table); --- 175,181 ---- // Unmark a pointer. static void ! unmark_for_gc (jobject obj, java::util::IdentityHashMap *ref_table) { JvSynchronize sync (ref_table); *************** unmark_for_gc (jobject obj) *** 188,193 **** --- 183,189 ---- Integer *refcount = (Integer *) ref_table->get (obj); JvAssert (refcount); jint val = refcount->intValue () - 1; + JvAssert (val >= 0); if (val == 0) ref_table->remove (obj); else *************** unmark_for_gc (jobject obj) *** 195,213 **** ref_table->put (obj, new Integer (val)); } static jobject _Jv_JNI_NewGlobalRef (JNIEnv *, jobject obj) { ! mark_for_gc (obj); return obj; } static void _Jv_JNI_DeleteGlobalRef (JNIEnv *, jobject obj) { ! unmark_for_gc (obj); } static void --- 191,236 ---- ref_table->put (obj, new Integer (val)); } + // "Unwrap" some random non-reference type. This exists to simplify + // other template functions. + template + static T + unwrap (T val) + { + return val; + } + + // Unwrap a weak reference, if required. + template + static T * + unwrap (T *obj) + { + using namespace gnu::gcj::runtime; + // We can compare the class directly because JNIWeakRef is `final'. + // Doing it this way is much faster. + if (obj == NULL || obj->getClass () != &JNIWeakRef::class$) + return obj; + JNIWeakRef *wr = reinterpret_cast (obj); + return reinterpret_cast (wr->get ()); + } + static jobject _Jv_JNI_NewGlobalRef (JNIEnv *, jobject obj) { ! // This seems weird but I think it is correct. ! obj = unwrap (obj); ! mark_for_gc (obj, global_ref_table); return obj; } static void _Jv_JNI_DeleteGlobalRef (JNIEnv *, jobject obj) { ! // This seems weird but I think it is correct. ! obj = unwrap (obj); ! unmark_for_gc (obj, global_ref_table); } static void *************** _Jv_JNI_DeleteLocalRef (JNIEnv *env, job *** 215,228 **** { _Jv_JNI_LocalFrame *frame; for (frame = env->locals; frame != NULL; frame = frame->next) { ! for (int i = 0; i < FRAME_SIZE; ++i) { if (frame->vec[i] == obj) { frame->vec[i] = NULL; ! unmark_for_gc (obj); return; } } --- 238,254 ---- { _Jv_JNI_LocalFrame *frame; + // This seems weird but I think it is correct. + obj = unwrap (obj); + for (frame = env->locals; frame != NULL; frame = frame->next) { ! for (int i = 0; i < frame->size; ++i) { if (frame->vec[i] == obj) { frame->vec[i] = NULL; ! unmark_for_gc (obj, local_ref_table); return; } } *************** _Jv_JNI_PushLocalFrame (JNIEnv *env, jin *** 278,283 **** --- 304,312 ---- static jobject _Jv_JNI_NewLocalRef (JNIEnv *env, jobject obj) { + // This seems weird but I think it is correct. + obj = unwrap (obj); + // Try to find an open slot somewhere in the topmost frame. _Jv_JNI_LocalFrame *frame = env->locals; bool done = false, set = false; *************** _Jv_JNI_NewLocalRef (JNIEnv *env, jobjec *** 296,302 **** // If we found a slot, or if the frame we just searched is the // mark frame, then we are done. ! if (done || frame->marker != MARK_NONE) break; } --- 325,331 ---- // If we found a slot, or if the frame we just searched is the // mark frame, then we are done. ! if (done || frame == NULL || frame->marker != MARK_NONE) break; } *************** _Jv_JNI_NewLocalRef (JNIEnv *env, jobjec *** 309,315 **** env->locals->vec[0] = obj; } ! mark_for_gc (obj); return obj; } --- 338,344 ---- env->locals->vec[0] = obj; } ! mark_for_gc (obj, local_ref_table); return obj; } *************** _Jv_JNI_PopLocalFrame (JNIEnv *env, jobj *** 323,329 **** { for (int i = 0; i < rf->size; ++i) if (rf->vec[i] != NULL) ! unmark_for_gc (rf->vec[i]); // If the frame we just freed is the marker frame, we are done. done = (rf->marker == stop); --- 352,358 ---- { for (int i = 0; i < rf->size; ++i) if (rf->vec[i] != NULL) ! unmark_for_gc (rf->vec[i], local_ref_table); // If the frame we just freed is the marker frame, we are done. done = (rf->marker == stop); *************** _Jv_JNI_DefineClass (JNIEnv *env, jobjec *** 404,409 **** --- 433,440 ---- { try { + loader = unwrap (loader); + jbyteArray bytes = JvNewByteArray (bufLen); jbyte *elts = elements (bytes); *************** _Jv_JNI_FindClass (JNIEnv *env, const ch *** 461,480 **** static jclass _Jv_JNI_GetSuperclass (JNIEnv *env, jclass clazz) { ! return (jclass) wrap_value (env, clazz->getSuperclass ()); } static jboolean _Jv_JNI_IsAssignableFrom(JNIEnv *, jclass clazz1, jclass clazz2) { ! return clazz1->isAssignableFrom (clazz2); } static jint _Jv_JNI_Throw (JNIEnv *env, jthrowable obj) { // We check in case the user did some funky cast. ! JvAssert (obj != NULL && (&ThrowableClass)->isInstance (obj)); env->ex = obj; return 0; } --- 492,512 ---- static jclass _Jv_JNI_GetSuperclass (JNIEnv *env, jclass clazz) { ! return (jclass) wrap_value (env, unwrap (clazz)->getSuperclass ()); } static jboolean _Jv_JNI_IsAssignableFrom(JNIEnv *, jclass clazz1, jclass clazz2) { ! return unwrap (clazz1)->isAssignableFrom (unwrap (clazz2)); } static jint _Jv_JNI_Throw (JNIEnv *env, jthrowable obj) { // We check in case the user did some funky cast. ! obj = unwrap (obj); ! JvAssert (obj != NULL && java::lang::Throwable::class$.isInstance (obj)); env->ex = obj; return 0; } *************** _Jv_JNI_ThrowNew (JNIEnv *env, jclass cl *** 484,496 **** { using namespace java::lang::reflect; ! JvAssert ((&ThrowableClass)->isAssignableFrom (clazz)); int r = JNI_OK; try { JArray *argtypes ! = (JArray *) JvNewObjectArray (1, &ClassClass, NULL); jclass *elts = elements (argtypes); elts[0] = &StringClass; --- 516,530 ---- { using namespace java::lang::reflect; ! clazz = unwrap (clazz); ! JvAssert (java::lang::Throwable::class$.isAssignableFrom (clazz)); int r = JNI_OK; try { JArray *argtypes ! = (JArray *) JvNewObjectArray (1, &java::lang::Class::class$, ! NULL); jclass *elts = elements (argtypes); elts[0] = &StringClass; *************** _Jv_JNI_FatalError (JNIEnv *, const char *** 550,556 **** static jboolean _Jv_JNI_IsSameObject (JNIEnv *, jobject obj1, jobject obj2) { ! return obj1 == obj2; } static jobject --- 584,590 ---- static jboolean _Jv_JNI_IsSameObject (JNIEnv *, jobject obj1, jobject obj2) { ! return unwrap (obj1) == unwrap (obj2); } static jobject *************** _Jv_JNI_AllocObject (JNIEnv *env, jclass *** 561,566 **** --- 595,601 ---- try { + clazz = unwrap (clazz); JvAssert (clazz && ! clazz->isArray ()); if (clazz->isInterface() || Modifier::isAbstract(clazz->getModifiers())) env->ex = new java::lang::InstantiationException (); *************** _Jv_JNI_AllocObject (JNIEnv *env, jclass *** 581,586 **** --- 616,622 ---- static jclass _Jv_JNI_GetObjectClass (JNIEnv *env, jobject obj) { + obj = unwrap (obj); JvAssert (obj); return (jclass) wrap_value (env, obj->getClass()); } *************** _Jv_JNI_GetObjectClass (JNIEnv *env, job *** 588,594 **** static jboolean _Jv_JNI_IsInstanceOf (JNIEnv *, jobject obj, jclass clazz) { ! return clazz->isInstance(obj); } --- 624,630 ---- static jboolean _Jv_JNI_IsInstanceOf (JNIEnv *, jobject obj, jclass clazz) { ! return unwrap (clazz)->isInstance(unwrap (obj)); } *************** _Jv_JNI_GetAnyMethodID (JNIEnv *env, jcl *** 604,609 **** --- 640,646 ---- { try { + clazz = unwrap (clazz); _Jv_InitClass (clazz); _Jv_Utf8Const *name_u = _Jv_makeUtf8Const ((char *) name, -1); *************** array_from_valist (jvalue *values, JArra *** 676,682 **** else { // An object. ! values[i].l = va_arg (vargs, jobject); } } } --- 713,719 ---- else { // An object. ! values[i].l = unwrap (va_arg (vargs, jobject)); } } } *************** static T *** 688,693 **** --- 725,733 ---- _Jv_JNI_CallAnyMethodV (JNIEnv *env, jobject obj, jclass klass, jmethodID id, va_list vargs) { + obj = unwrap (obj); + klass = unwrap (klass); + if (style == normal) id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature); *************** static T *** 748,753 **** --- 788,796 ---- _Jv_JNI_CallAnyMethodA (JNIEnv *env, jobject obj, jclass klass, jmethodID id, jvalue *args) { + obj = unwrap (obj); + klass = unwrap (klass); + if (style == normal) id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature); *************** _Jv_JNI_CallAnyMethodA (JNIEnv *env, job *** 765,774 **** if (style == constructor) return_type = klass; jvalue result; jthrowable ex = _Jv_CallAnyMethodA (obj, return_type, id, style == constructor, ! arg_types, args, &result); if (ex != NULL) env->ex = ex; --- 808,828 ---- if (style == constructor) return_type = klass; + // Unwrap arguments as required. Eww. + jclass *type_elts = elements (arg_types); + jvalue arg_copy[arg_types->length]; + for (int i = 0; i < arg_types->length; ++i) + { + if (type_elts[i]->isPrimitive ()) + arg_copy[i] = args[i]; + else + arg_copy[i].l = unwrap (args[i].l); + } + jvalue result; jthrowable ex = _Jv_CallAnyMethodA (obj, return_type, id, style == constructor, ! arg_types, arg_copy, &result); if (ex != NULL) env->ex = ex; *************** static void *** 789,794 **** --- 843,851 ---- _Jv_JNI_CallAnyVoidMethodV (JNIEnv *env, jobject obj, jclass klass, jmethodID id, va_list vargs) { + obj = unwrap (obj); + klass = unwrap (klass); + if (style == normal) id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature); *************** _Jv_JNI_CallAnyVoidMethodA (JNIEnv *env, *** 852,857 **** --- 909,925 ---- _Jv_GetTypesFromSignature (id, decl_class, &arg_types, &return_type); + // Unwrap arguments as required. Eww. + jclass *type_elts = elements (arg_types); + jvalue arg_copy[arg_types->length]; + for (int i = 0; i < arg_types->length; ++i) + { + if (type_elts[i]->isPrimitive ()) + arg_copy[i] = args[i]; + else + arg_copy[i].l = unwrap (args[i].l); + } + jthrowable ex = _Jv_CallAnyMethodA (obj, return_type, id, style == constructor, arg_types, args, NULL); *************** _Jv_JNI_CallStaticMethodV (JNIEnv *env, *** 929,935 **** jmethodID id, va_list args) { JvAssert (((id->accflags) & java::lang::reflect::Modifier::STATIC)); ! JvAssert ((&ClassClass)->isInstance (klass)); return _Jv_JNI_CallAnyMethodV (env, NULL, klass, id, args); } --- 997,1003 ---- jmethodID id, va_list args) { JvAssert (((id->accflags) & java::lang::reflect::Modifier::STATIC)); ! JvAssert (java::lang::Class::class$.isInstance (unwrap (klass))); return _Jv_JNI_CallAnyMethodV (env, NULL, klass, id, args); } *************** _Jv_JNI_CallStaticMethod (JNIEnv *env, j *** 944,950 **** T result; JvAssert (((id->accflags) & java::lang::reflect::Modifier::STATIC)); ! JvAssert ((&ClassClass)->isInstance (klass)); va_start (args, id); result = _Jv_JNI_CallAnyMethodV (env, NULL, klass, --- 1012,1018 ---- T result; JvAssert (((id->accflags) & java::lang::reflect::Modifier::STATIC)); ! JvAssert (java::lang::Class::class$.isInstance (unwrap (klass))); va_start (args, id); result = _Jv_JNI_CallAnyMethodV (env, NULL, klass, *************** _Jv_JNI_CallStaticMethodA (JNIEnv *env, *** 962,968 **** jvalue *args) { JvAssert (((id->accflags) & java::lang::reflect::Modifier::STATIC)); ! JvAssert ((&ClassClass)->isInstance (klass)); return _Jv_JNI_CallAnyMethodA (env, NULL, klass, id, args); } --- 1030,1036 ---- jvalue *args) { JvAssert (((id->accflags) & java::lang::reflect::Modifier::STATIC)); ! JvAssert (java::lang::Class::class$.isInstance (unwrap (klass))); return _Jv_JNI_CallAnyMethodA (env, NULL, klass, id, args); } *************** template *** 1048,1053 **** --- 1116,1122 ---- static T _Jv_JNI_GetField (JNIEnv *env, jobject obj, jfieldID field) { + obj = unwrap (obj); JvAssert (obj); T *ptr = (T *) ((char *) obj + field->getOffset ()); return wrap_value (env, *ptr); *************** template *** 1057,1062 **** --- 1126,1134 ---- static void _Jv_JNI_SetField (JNIEnv *, jobject obj, jfieldID field, T value) { + obj = unwrap (obj); + value = unwrap (value); + JvAssert (obj); T *ptr = (T *) ((char *) obj + field->getOffset ()); *ptr = value; *************** _Jv_JNI_GetAnyFieldID (JNIEnv *env, jcla *** 1069,1074 **** --- 1141,1148 ---- { try { + clazz = unwrap (clazz); + _Jv_InitClass (clazz); _Jv_Utf8Const *a_name = _Jv_makeUtf8Const ((char *) name, -1); *************** template *** 1133,1138 **** --- 1207,1213 ---- static void _Jv_JNI_SetStaticField (JNIEnv *, jclass, jfieldID field, T value) { + value = unwrap (value); T *ptr = (T *) field->u.addr; *ptr = value; } *************** _Jv_JNI_NewString (JNIEnv *env, const jc *** 1155,1168 **** static jsize _Jv_JNI_GetStringLength (JNIEnv *, jstring string) { ! return string->length(); } static const jchar * _Jv_JNI_GetStringChars (JNIEnv *, jstring string, jboolean *isCopy) { jchar *result = _Jv_GetStringChars (string); ! mark_for_gc (string); if (isCopy) *isCopy = false; return (const jchar *) result; --- 1230,1244 ---- static jsize _Jv_JNI_GetStringLength (JNIEnv *, jstring string) { ! return unwrap (string)->length(); } static const jchar * _Jv_JNI_GetStringChars (JNIEnv *, jstring string, jboolean *isCopy) { + string = unwrap (string); jchar *result = _Jv_GetStringChars (string); ! mark_for_gc (string, global_ref_table); if (isCopy) *isCopy = false; return (const jchar *) result; *************** _Jv_JNI_GetStringChars (JNIEnv *, jstrin *** 1171,1177 **** static void _Jv_JNI_ReleaseStringChars (JNIEnv *, jstring string, const jchar *) { ! unmark_for_gc (string); } static jstring --- 1247,1253 ---- static void _Jv_JNI_ReleaseStringChars (JNIEnv *, jstring string, const jchar *) { ! unmark_for_gc (unwrap (string), global_ref_table); } static jstring *************** _Jv_JNI_NewStringUTF (JNIEnv *env, const *** 1192,1203 **** static jsize _Jv_JNI_GetStringUTFLength (JNIEnv *, jstring string) { ! return JvGetStringUTFLength (string); } static const char * _Jv_JNI_GetStringUTFChars (JNIEnv *env, jstring string, jboolean *isCopy) { jsize len = JvGetStringUTFLength (string); try { --- 1268,1280 ---- static jsize _Jv_JNI_GetStringUTFLength (JNIEnv *, jstring string) { ! return JvGetStringUTFLength (unwrap (string)); } static const char * _Jv_JNI_GetStringUTFChars (JNIEnv *env, jstring string, jboolean *isCopy) { + string = unwrap (string); jsize len = JvGetStringUTFLength (string); try { *************** static void *** 1227,1232 **** --- 1304,1310 ---- _Jv_JNI_GetStringRegion (JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf) { + string = unwrap (string); jchar *result = _Jv_GetStringChars (string); if (start < 0 || start > string->length () || len < 0 || start + len > string->length ()) *************** static void *** 1248,1253 **** --- 1326,1333 ---- _Jv_JNI_GetStringUTFRegion (JNIEnv *env, jstring str, jsize start, jsize len, char *buf) { + str = unwrap (str); + if (start < 0 || start > str->length () || len < 0 || start + len > str->length ()) { *************** _Jv_JNI_GetStringUTFRegion (JNIEnv *env, *** 1267,1273 **** static const jchar * _Jv_JNI_GetStringCritical (JNIEnv *, jstring str, jboolean *isCopy) { ! jchar *result = _Jv_GetStringChars (str); if (isCopy) *isCopy = false; return result; --- 1347,1353 ---- static const jchar * _Jv_JNI_GetStringCritical (JNIEnv *, jstring str, jboolean *isCopy) { ! jchar *result = _Jv_GetStringChars (unwrap (str)); if (isCopy) *isCopy = false; return result; *************** _Jv_JNI_ReleaseStringCritical (JNIEnv *, *** 1282,1288 **** static jsize _Jv_JNI_GetArrayLength (JNIEnv *, jarray array) { ! return array->length; } static jarray --- 1362,1368 ---- static jsize _Jv_JNI_GetArrayLength (JNIEnv *, jarray array) { ! return unwrap (array)->length; } static jarray *************** _Jv_JNI_NewObjectArray (JNIEnv *env, jsi *** 1291,1296 **** --- 1371,1379 ---- { try { + elementClass = unwrap (elementClass); + init = unwrap (init); + jarray result = JvNewObjectArray (length, elementClass, init); return (jarray) wrap_value (env, result); } *************** _Jv_JNI_NewObjectArray (JNIEnv *env, jsi *** 1304,1310 **** static jobject _Jv_JNI_GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index) { ! jobject *elts = elements (array); return wrap_value (env, elts[index]); } --- 1387,1393 ---- static jobject _Jv_JNI_GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index) { ! jobject *elts = elements (unwrap (array)); return wrap_value (env, elts[index]); } *************** _Jv_JNI_SetObjectArrayElement (JNIEnv *e *** 1314,1319 **** --- 1397,1405 ---- { try { + array = unwrap (array); + value = unwrap (value); + _Jv_CheckArrayStore (array, value); jobject *elts = elements (array); elts[index] = value; *************** static T * *** 1344,1356 **** _Jv_JNI_GetPrimitiveArrayElements (JNIEnv *, JArray *array, jboolean *isCopy) { T *elts = elements (array); if (isCopy) { // We elect never to copy. *isCopy = false; } ! mark_for_gc (array); return elts; } --- 1430,1443 ---- _Jv_JNI_GetPrimitiveArrayElements (JNIEnv *, JArray *array, jboolean *isCopy) { + array = unwrap (array); T *elts = elements (array); if (isCopy) { // We elect never to copy. *isCopy = false; } ! mark_for_gc (array, global_ref_table); return elts; } *************** static void *** 1359,1368 **** _Jv_JNI_ReleasePrimitiveArrayElements (JNIEnv *, JArray *array, T *, jint /* mode */) { // Note that we ignore MODE. We can do this because we never copy // the array elements. My reading of the JNI documentation is that // this is an option for the implementor. ! unmark_for_gc (array); } template --- 1446,1456 ---- _Jv_JNI_ReleasePrimitiveArrayElements (JNIEnv *, JArray *array, T *, jint /* mode */) { + array = unwrap (array); // Note that we ignore MODE. We can do this because we never copy // the array elements. My reading of the JNI documentation is that // this is an option for the implementor. ! unmark_for_gc (array, global_ref_table); } template *************** _Jv_JNI_GetPrimitiveArrayRegion (JNIEnv *** 1371,1376 **** --- 1459,1466 ---- jsize start, jsize len, T *buf) { + array = unwrap (array); + // The cast to unsigned lets us save a comparison. if (start < 0 || len < 0 || (unsigned long) (start + len) > (unsigned long) array->length) *************** static void *** 1398,1403 **** --- 1488,1495 ---- _Jv_JNI_SetPrimitiveArrayRegion (JNIEnv *env, JArray *array, jsize start, jsize len, T *buf) { + array = unwrap (array); + // The cast to unsigned lets us save a comparison. if (start < 0 || len < 0 || (unsigned long) (start + len) > (unsigned long) array->length) *************** static void * *** 1423,1428 **** --- 1515,1521 ---- _Jv_JNI_GetPrimitiveArrayCritical (JNIEnv *, jarray array, jboolean *isCopy) { + array = unwrap (array); // FIXME: does this work? jclass klass = array->getClass()->getComponentType(); JvAssert (klass->isPrimitive ()); *************** _Jv_JNI_MonitorEnter (JNIEnv *env, jobje *** 1443,1449 **** { try { ! return _Jv_MonitorEnter (obj); } catch (jthrowable t) { --- 1536,1543 ---- { try { ! _Jv_MonitorEnter (unwrap (obj)); ! return 0; } catch (jthrowable t) { *************** _Jv_JNI_MonitorExit (JNIEnv *env, jobjec *** 1457,1463 **** { try { ! return _Jv_MonitorExit (obj); } catch (jthrowable t) { --- 1551,1558 ---- { try { ! _Jv_MonitorExit (unwrap (obj)); ! return 0; } catch (jthrowable t) { *************** _Jv_JNI_ToReflectedField (JNIEnv *env, j *** 1473,1478 **** --- 1568,1574 ---- { try { + cls = unwrap (cls); java::lang::reflect::Field *field = new java::lang::reflect::Field(); field->declaringClass = cls; field->offset = (char*) fieldID - (char *) cls->fields; *************** _Jv_JNI_FromReflectedField (JNIEnv *, jo *** 1492,1497 **** --- 1588,1594 ---- { using namespace java::lang::reflect; + f = unwrap (f); Field *field = reinterpret_cast (f); return _Jv_FromReflectedField (field); } *************** _Jv_JNI_ToReflectedMethod (JNIEnv *env, *** 1502,1511 **** { using namespace java::lang::reflect; - // FIXME. - static _Jv_Utf8Const *init_name = _Jv_makeUtf8Const ("", 6); - jobject result = NULL; try { --- 1599,1606 ---- { using namespace java::lang::reflect; jobject result = NULL; + klass = unwrap (klass); try { *************** static jmethodID *** 1537,1561 **** _Jv_JNI_FromReflectedMethod (JNIEnv *, jobject method) { using namespace java::lang::reflect; ! if ((&MethodClass)->isInstance (method)) return _Jv_FromReflectedMethod (reinterpret_cast (method)); return _Jv_FromReflectedConstructor (reinterpret_cast (method)); } static jint ! _Jv_JNI_RegisterNatives (JNIEnv *env, jclass k, const JNINativeMethod *methods, jint nMethods) { ! #ifdef INTERPRETER ! // For now, this only matters for interpreted methods. FIXME. ! if (! _Jv_IsInterpretedClass (k)) ! { ! // FIXME: throw exception. ! return JNI_ERR; ! } ! _Jv_InterpClass *klass = reinterpret_cast<_Jv_InterpClass *> (k); // Look at each descriptor given us, and find the corresponding // method in the class. --- 1632,1800 ---- _Jv_JNI_FromReflectedMethod (JNIEnv *, jobject method) { using namespace java::lang::reflect; ! method = unwrap (method); ! if (Method::class$.isInstance (method)) return _Jv_FromReflectedMethod (reinterpret_cast (method)); return _Jv_FromReflectedConstructor (reinterpret_cast (method)); } + // JDK 1.2. + jweak + _Jv_JNI_NewWeakGlobalRef (JNIEnv *env, jobject obj) + { + using namespace gnu::gcj::runtime; + JNIWeakRef *ref = NULL; + + try + { + // This seems weird but I think it is correct. + obj = unwrap (obj); + ref = new JNIWeakRef (obj); + mark_for_gc (ref, global_ref_table); + } + catch (jthrowable t) + { + env->ex = t; + } + + return reinterpret_cast (ref); + } + + void + _Jv_JNI_DeleteWeakGlobalRef (JNIEnv *, jweak obj) + { + using namespace gnu::gcj::runtime; + JNIWeakRef *ref = reinterpret_cast (obj); + unmark_for_gc (ref, global_ref_table); + ref->clear (); + } + + + + // Hash table of native methods. + static JNINativeMethod *nathash; + // Number of slots used. + static int nathash_count = 0; + // Number of slots available. Must be power of 2. + static int nathash_size = 0; + + #define DELETED_ENTRY ((char *) (~0)) + + // Compute a hash value for a native method descriptor. + static int + hash (const JNINativeMethod *method) + { + char *ptr; + int hash = 0; + + ptr = method->name; + while (*ptr) + hash = (31 * hash) + *ptr++; + + ptr = method->signature; + while (*ptr) + hash = (31 * hash) + *ptr++; + + return hash; + } + + // Find the slot where a native method goes. + static JNINativeMethod * + nathash_find_slot (const JNINativeMethod *method) + { + jint h = hash (method); + int step = (h ^ (h >> 16)) | 1; + int w = h & (nathash_size - 1); + int del = -1; + + for (;;) + { + JNINativeMethod *slotp = &nathash[w]; + if (slotp->name == NULL) + { + if (del >= 0) + return &nathash[del]; + else + return slotp; + } + else if (slotp->name == DELETED_ENTRY) + del = w; + else if (! strcmp (slotp->name, method->name) + && ! strcmp (slotp->signature, method->signature)) + return slotp; + w = (w + step) & (nathash_size - 1); + } + } + + // Find a method. Return NULL if it isn't in the hash table. + static void * + nathash_find (JNINativeMethod *method) + { + if (nathash == NULL) + return NULL; + JNINativeMethod *slot = nathash_find_slot (method); + if (slot->name == NULL || slot->name == DELETED_ENTRY) + return NULL; + return slot->fnPtr; + } + + static void + natrehash () + { + if (nathash == NULL) + { + nathash_size = 1024; + nathash = + (JNINativeMethod *) _Jv_AllocBytes (nathash_size + * sizeof (JNINativeMethod)); + memset (nathash, 0, nathash_size * sizeof (JNINativeMethod)); + } + else + { + int savesize = nathash_size; + JNINativeMethod *savehash = nathash; + nathash_size *= 2; + nathash = + (JNINativeMethod *) _Jv_AllocBytes (nathash_size + * sizeof (JNINativeMethod)); + memset (nathash, 0, nathash_size * sizeof (JNINativeMethod)); + + for (int i = 0; i < savesize; ++i) + { + if (savehash[i].name != NULL && savehash[i].name != DELETED_ENTRY) + { + JNINativeMethod *slot = nathash_find_slot (&savehash[i]); + *slot = savehash[i]; + } + } + } + } + + static void + nathash_add (const JNINativeMethod *method) + { + if (3 * nathash_count >= 2 * nathash_size) + natrehash (); + JNINativeMethod *slot = nathash_find_slot (method); + // If the slot has a real entry in it, then there is no work to do. + if (slot->name != NULL && slot->name != DELETED_ENTRY) + return; + // FIXME + slot->name = strdup (method->name); + slot->signature = strdup (method->signature); + slot->fnPtr = method->fnPtr; + } + static jint ! _Jv_JNI_RegisterNatives (JNIEnv *env, jclass klass, const JNINativeMethod *methods, jint nMethods) { ! // Synchronize while we do the work. This must match ! // synchronization in some other functions that manipulate or use ! // the nathash table. ! JvSynchronize sync (global_ref_table); // Look at each descriptor given us, and find the corresponding // method in the class. *************** _Jv_JNI_RegisterNatives (JNIEnv *env, jc *** 1563,1573 **** { bool found = false; ! _Jv_MethodBase **imeths = _Jv_GetFirstMethod (klass); for (int i = 0; i < JvNumMethods (klass); ++i) { ! _Jv_MethodBase *meth = imeths[i]; ! _Jv_Method *self = meth->get_method (); if (! strcmp (self->name->data, methods[j].name) && ! strcmp (self->signature->data, methods[j].signature)) --- 1802,1811 ---- { bool found = false; ! _Jv_Method *imeths = JvGetFirstMethod (klass); for (int i = 0; i < JvNumMethods (klass); ++i) { ! _Jv_Method *self = &imeths[i]; if (! strcmp (self->name->data, methods[j].name) && ! strcmp (self->signature->data, methods[j].signature)) *************** _Jv_JNI_RegisterNatives (JNIEnv *env, jc *** 1577,1585 **** break; // Found a match that is native. - _Jv_JNIMethod *jmeth = reinterpret_cast<_Jv_JNIMethod *> (meth); - jmeth->set_function (methods[i].fnPtr); found = true; break; } } --- 1815,1823 ---- break; // Found a match that is native. found = true; + nathash_add (&methods[j]); + break; } } *************** _Jv_JNI_RegisterNatives (JNIEnv *env, jc *** 1600,1613 **** } return JNI_OK; - #else /* INTERPRETER */ - return JNI_ERR; - #endif /* INTERPRETER */ } static jint _Jv_JNI_UnregisterNatives (JNIEnv *, jclass) { return JNI_ERR; } --- 1838,1849 ---- } return JNI_OK; } static jint _Jv_JNI_UnregisterNatives (JNIEnv *, jclass) { + // FIXME -- we could implement this. return JNI_ERR; } *************** _Jv_LookupJNIMethod (jclass klass, _Jv_U *** 1751,1756 **** --- 1987,2008 ---- int long_start; void *function; + // Synchronize on something convenient. Right now we use the hash. + JvSynchronize sync (global_ref_table); + + // First see if we have an override in the hash table. + strncpy (buf, name->data, name->length); + buf[name->length] = '\0'; + strncpy (buf + name->length + 1, signature->data, signature->length); + buf[name->length + signature->length + 1] = '\0'; + JNINativeMethod meth; + meth.name = buf; + meth.signature = buf + name->length + 1; + function = nathash_find (&meth); + if (function != NULL) + return function; + + // If there was no override, then look in the symbol table. mangled_name (klass, name, signature, buf, &long_start); char c = buf[long_start]; buf[long_start] = '\0'; *************** _Jv_LookupJNIMethod (jclass klass, _Jv_U *** 1762,1768 **** if (function == NULL) { jstring str = JvNewStringUTF (name->data); ! JvThrow (new java::lang::AbstractMethodError (str)); } } --- 2014,2020 ---- if (function == NULL) { jstring str = JvNewStringUTF (name->data); ! throw new java::lang::UnsatisfiedLinkError (str); } } *************** _Jv_JNIMethod::call (ffi_cif *, void *re *** 1787,1796 **** // We cache the value that we find, of course, but if we don't find // a value we don't cache that fact -- we might subsequently load a // library which finds the function in question. ! if (_this->function == NULL) ! _this->function = _Jv_LookupJNIMethod (_this->defining_class, ! _this->self->name, ! _this->self->signature); JvAssert (_this->args_raw_size % sizeof (ffi_raw) == 0); ffi_raw real_args[2 + _this->args_raw_size / sizeof (ffi_raw)]; --- 2039,2054 ---- // We cache the value that we find, of course, but if we don't find // a value we don't cache that fact -- we might subsequently load a // library which finds the function in question. ! { ! // Synchronize on a convenient object to ensure sanity in case two ! // threads reach this point for the same function at the same ! // time. ! JvSynchronize sync (global_ref_table); ! if (_this->function == NULL) ! _this->function = _Jv_LookupJNIMethod (_this->defining_class, ! _this->self->name, ! _this->self->signature); ! } JvAssert (_this->args_raw_size % sizeof (ffi_raw) == 0); ffi_raw real_args[2 + _this->args_raw_size / sizeof (ffi_raw)]; *************** _Jv_JNIMethod::call (ffi_cif *, void *re *** 1804,1809 **** --- 2062,2078 ---- if ((_this->self->accflags & java::lang::reflect::Modifier::STATIC)) real_args[offset++].ptr = _this->defining_class; + // In libgcj, the callee synchronizes. + jobject sync = NULL; + if ((_this->self->accflags & java::lang::reflect::Modifier::SYNCHRONIZED)) + { + if ((_this->self->accflags & java::lang::reflect::Modifier::STATIC)) + sync = _this->defining_class; + else + sync = (jobject) args[0].ptr; + _Jv_MonitorEnter (sync); + } + // Copy over passed-in arguments. memcpy (&real_args[offset], args, _this->args_raw_size); *************** _Jv_JNIMethod::call (ffi_cif *, void *re *** 1811,1816 **** --- 2080,2088 ---- ffi_raw_call (&_this->jni_cif, (void (*)()) _this->function, ret, real_args); + if (sync != NULL) + _Jv_MonitorExit (sync); + _Jv_JNI_PopSystemFrame (env); } *************** _Jv_JNI_AttachCurrentThread (JavaVM *, j *** 1836,1842 **** && attach->version != JNI_VERSION_1_1) return JNI_EVERSION; ! JvAssert ((&ThreadGroupClass)->isInstance (attach->group)); group = reinterpret_cast (attach->group); } --- 2108,2114 ---- && attach->version != JNI_VERSION_1_1) return JNI_EVERSION; ! JvAssert (java::lang::ThreadGroup::class$.isInstance (attach->group)); group = reinterpret_cast (attach->group); } *************** _Jv_JNI_AttachCurrentThread (JavaVM *, j *** 1859,1864 **** --- 2131,2144 ---- _Jv_Free (env); return JNI_ERR; } + + env->locals->marker = MARK_SYSTEM; + env->locals->size = FRAME_SIZE; + env->locals->next = NULL; + + for (int i = 0; i < env->locals->size; ++i) + env->locals->vec[i] = NULL; + *penv = reinterpret_cast (env); // This thread might already be a Java thread -- this function might *************** _Jv_JNI_AttachCurrentThread (JavaVM *, j *** 1867,1873 **** { try { ! (void) new gnu::gcj::jni::NativeThread (group, name); } catch (jthrowable t) { --- 2147,2153 ---- { try { ! _Jv_AttachCurrentThread (name, group); } catch (jthrowable t) { *************** _Jv_JNI_DestroyJavaVM (JavaVM *vm) *** 1921,1948 **** return JNI_ERR; } ! static jint _Jv_JNI_DetachCurrentThread (JavaVM *) { ! java::lang::Thread *t = _Jv_ThreadCurrent (); ! if (t == NULL) ! return JNI_EDETACHED; ! ! // FIXME: we only allow threads attached via AttachCurrentThread to ! // be detached. I have no idea how we could implement detaching ! // other threads, given the requirement that we must release all the ! // monitors. That just seems evil. ! JvAssert ((&NativeThreadClass)->isInstance (t)); ! ! // FIXME: release the monitors. We'll take this to mean all ! // monitors acquired via the JNI interface. This means we have to ! // keep track of them. ! ! gnu::gcj::jni::NativeThread *nt ! = reinterpret_cast (t); ! nt->finish (); ! ! return 0; } static jint --- 2201,2211 ---- return JNI_ERR; } ! jint _Jv_JNI_DetachCurrentThread (JavaVM *) { ! jint code = _Jv_DetachCurrentThread (); ! return code ? JNI_EDETACHED : 0; } static jint *************** jint *** 1995,2000 **** --- 2258,2266 ---- JNI_CreateJavaVM (JavaVM **vm, void **penv, void *args) { JvAssert (! the_vm); + + _Jv_CreateJavaVM (NULL); + // FIXME: synchronize JavaVM *nvm = (JavaVM *) _Jv_MallocUnchecked (sizeof (JavaVM)); if (nvm == NULL) *************** JNI_CreateJavaVM (JavaVM **vm, void **pe *** 2049,2054 **** --- 2315,2321 ---- the_vm = nvm; *vm = the_vm; + return 0; } *************** _Jv_JNI_GetJavaVM (JNIEnv *, JavaVM **vm *** 2101,2107 **** - #define NOT_IMPL NULL #define RESERVED NULL struct JNINativeInterface _Jv_JNIFunctions = --- 2368,2373 ---- *************** struct JNINativeInterface _Jv_JNIFunctio *** 2345,2352 **** _Jv_JNI_GetStringCritical, // GetStringCritical _Jv_JNI_ReleaseStringCritical, // ReleaseStringCritical ! NOT_IMPL /* newweakglobalref */, ! NOT_IMPL /* deleteweakglobalref */, _Jv_JNI_ExceptionCheck }; --- 2611,2618 ---- _Jv_JNI_GetStringCritical, // GetStringCritical _Jv_JNI_ReleaseStringCritical, // ReleaseStringCritical ! _Jv_JNI_NewWeakGlobalRef, // NewWeakGlobalRef ! _Jv_JNI_DeleteWeakGlobalRef, // DeleteWeakGlobalRef _Jv_JNI_ExceptionCheck }; diff -Nrc3pad gcc-3.0.4/libjava/libgcj.spec.in gcc-3.1/libjava/libgcj.spec.in *** gcc-3.0.4/libjava/libgcj.spec.in Wed Jul 18 16:56:40 2001 --- gcc-3.1/libjava/libgcj.spec.in Sun Mar 31 18:26:31 2002 *************** *** 6,16 **** %rename lib liborig *lib: -lgcj -lm @LIBICONV@ @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) %(liborig) ! *jc1: @DIVIDESPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ ! ! # ! # On some systems we force in a data_start symbol so that the GC will work ! # with shared libraries. ! # ! %rename startfile startfileorig ! *startfile: %(startfileorig) @LIBDATASTARTSPEC@ --- 6,9 ---- %rename lib liborig *lib: -lgcj -lm @LIBICONV@ @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) %(liborig) ! *jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ -fkeep-inline-functions diff -Nrc3pad gcc-3.0.4/libjava/libgcjdata.c gcc-3.1/libjava/libgcjdata.c *** gcc-3.0.4/libjava/libgcjdata.c Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/libgcjdata.c Thu Jan 1 00:00:00 1970 *************** *** 1,12 **** - /* Copyright (C) 1998, 1999 Free Software Foundation - - This file is part of libgcj. - - This software is copyrighted work licensed under the terms of the - Libgcj License. Please consult the file "LIBGCJ_LICENSE" for - details. */ - - /* Some systems need data_start defined so the GC be built as a shared - library. */ - - int data_start = 0; --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/libltdl/.cvsignore gcc-3.1/libjava/libltdl/.cvsignore *** gcc-3.0.4/libjava/libltdl/.cvsignore Sun Sep 10 07:53:51 2000 --- gcc-3.1/libjava/libltdl/.cvsignore Sun Apr 28 18:42:21 2002 *************** *** 1,13 **** .deps .libs Makefile ! Makefile.in ! acinclude.m4 ! aclocal.m4 ! configure ! config.* conftest* libtool *.lo *.la ! stamp-h* --- 1,10 ---- .deps .libs Makefile ! config.status ! config.log conftest* libtool *.lo *.la ! stamp-h diff -Nrc3pad gcc-3.0.4/libjava/libltdl/ChangeLog gcc-3.1/libjava/libltdl/ChangeLog *** gcc-3.0.4/libjava/libltdl/ChangeLog Wed Feb 20 18:46:46 2002 --- gcc-3.1/libjava/libltdl/ChangeLog Wed May 15 02:25:07 2002 *************** *** 1,22 **** ! 2002-02-20 Release Manager ! ! * GCC 3.0.4 Released. ! ! 2001-12-20 Release Manager ! ! * GCC 3.0.3 Released. ! ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. 2001-07-02 Tom Tromey --- 1,14 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-04-28 Mark Mitchell ! * .cvsignore: Remove files that are present in CVS. 2001-07-02 Tom Tromey *************** *** 24,32 **** * configure.in: Added aux-dir hacks to satisfy automake and in-tree builds. ! 20010617 Release Manager ! * GCC 3.0 Released. 2000-09-10 Alexandre Oliva --- 16,25 ---- * configure.in: Added aux-dir hacks to satisfy automake and in-tree builds. ! 2001-05-21 Bryce McKinlay ! * configure.in: Use correct include dir for new Boehm GC. ! * configure: Rebuilt. 2000-09-10 Alexandre Oliva diff -Nrc3pad gcc-3.0.4/libjava/libltdl/configure gcc-3.1/libjava/libltdl/configure *** gcc-3.0.4/libjava/libltdl/configure Wed Feb 20 19:40:48 2002 --- gcc-3.1/libjava/libltdl/configure Wed May 15 02:40:18 2002 *************** fi *** 2508,2514 **** GCINCS= if test "$GC" = "boehm"; then ! GCINCS='-I$(top_srcdir)/../../boehm-gc -I$(top_builddir)/../../boehm-gc' GCINCS="$GCINCS `cat ../../boehm-gc/boehm-cflags`" cat >> confdefs.h <<\EOF #define HAVE_BOEHM_GC 1 --- 2508,2514 ---- GCINCS= if test "$GC" = "boehm"; then ! GCINCS='-I$(top_srcdir)/../../boehm-gc/include' GCINCS="$GCINCS `cat ../../boehm-gc/boehm-cflags`" cat >> confdefs.h <<\EOF #define HAVE_BOEHM_GC 1 diff -Nrc3pad gcc-3.0.4/libjava/libltdl/configure.in gcc-3.1/libjava/libltdl/configure.in *** gcc-3.0.4/libjava/libltdl/configure.in Tue Jul 3 22:33:47 2001 --- gcc-3.1/libjava/libltdl/configure.in Tue Jul 3 22:33:24 2001 *************** changequote([,]) *** 47,53 **** GCINCS= if test "$GC" = "boehm"; then ! GCINCS='-I$(top_srcdir)/../../boehm-gc -I$(top_builddir)/../../boehm-gc' GCINCS="$GCINCS `cat ../../boehm-gc/boehm-cflags`" AC_DEFINE(HAVE_BOEHM_GC) fi --- 47,53 ---- GCINCS= if test "$GC" = "boehm"; then ! GCINCS='-I$(top_srcdir)/../../boehm-gc/include' GCINCS="$GCINCS `cat ../../boehm-gc/boehm-cflags`" AC_DEFINE(HAVE_BOEHM_GC) fi diff -Nrc3pad gcc-3.0.4/libjava/libtool-version gcc-3.1/libjava/libtool-version *** gcc-3.0.4/libjava/libtool-version Thu Apr 5 15:11:49 2001 --- gcc-3.1/libjava/libtool-version Sun Mar 17 00:46:00 2002 *************** *** 3,6 **** # a separate file so that version updates don't involve re-running # automake. # CURRENT:REVISION:AGE ! 2:0:0 --- 3,6 ---- # a separate file so that version updates don't involve re-running # automake. # CURRENT:REVISION:AGE ! 3:0:0 diff -Nrc3pad gcc-3.0.4/libjava/mauve-libgcj gcc-3.1/libjava/mauve-libgcj *** gcc-3.0.4/libjava/mauve-libgcj Fri Dec 1 10:04:02 2000 --- gcc-3.1/libjava/mauve-libgcj Sun Apr 21 12:35:21 2002 *************** *** 1,34 **** ! # Config file that tells mauve about the `libjava' tag. JDK1.0 JDK1.1 JDK1.2 JDBC2.0 ! !java.applet ! !java.awt ! java.beans ! !java.beans.DescriptorTest ! !java.beans.IntrospectorTest ! java.lang.Character.classify12 ! java.lang.String.hash ! # We support 1.2 for these 3 tests. ! java.lang.reflect.Modifier.toString12 ! java.io.ObjectInputOutput.InputTest ! java.io.ObjectInputOutput.OutputTest ! java.io.ObjectStreamClass.Test ! java.math ! !java.rmi # These 2 are tests that fail with JDBC2.0 but the tags don't seem to # have the right effect. !java.sql.Connection.TestJdbc10 !java.sql.DatabaseMetaData.TestJdbc10 ! java.text.FieldPosition.Test ! java.text.ParsePosition.Test ! java.text.SimpleDateFormat.getAndSet2DigitYearStart ! java.text.StringCharacterIterator.iter !java.text.ACIAttribute ! !java.text.Annotation ! !java.text.AttributedCharacterIterator ! !java.text.AttributedString ! !java.text.DecimalFormatSymbols.DumpDefault12 ! !java.text.DecimalFormatSymbols.GetSet12 ! !java.text.resources --- 1,33 ---- ! # Config file that tells mauve about the `libgcj' tag. JDK1.0 JDK1.1 JDK1.2 + JDK1.3 + JDK1.4 + JLS1.0 + JLS1.1 + JLS1.2 JDBC2.0 ! # These 2 are tests that fail with JDBC2.0 but the tags don't seem to # have the right effect. !java.sql.Connection.TestJdbc10 !java.sql.DatabaseMetaData.TestJdbc10 ! ! # Cannot be compiled !java.text.ACIAttribute ! ! # The following tests seem to (sometimes) hang or crash the testsuite ! !java.io.ObjectInputOutput ! !java.lang.reflect.Array.newInstance ! !java.util.ResourceBundle.getBundle ! !java.util.zip.GZIPInputStream.basic ! !java.net.DatagramSocket.DatagramSocketTest2 ! ! # Character.unicode seems to be very broken (the test) ! # Does not give meaningfull test results at the moment. ! !java.lang.Character.unicode ! ! # These are almost certainly buggy test cases. ! # The behaviour of the garbarge collector cannot be predicted. ! !java.lang.ref diff -Nrc3pad gcc-3.0.4/libjava/name-finder.cc gcc-3.1/libjava/name-finder.cc *** gcc-3.0.4/libjava/name-finder.cc Tue Oct 16 07:45:20 2001 --- gcc-3.1/libjava/name-finder.cc Sat Mar 23 16:17:07 2002 *************** *** 1,6 **** // name-finder.cc - Convert addresses to names ! /* Copyright (C) 2000 Red Hat Inc This file is part of libgcj. --- 1,6 ---- // name-finder.cc - Convert addresses to names ! /* Copyright (C) 2000, 2002 Free Software Foundation, Inc This file is part of libgcj. *************** _Jv_name_finder::_Jv_name_finder (char * *** 61,66 **** --- 61,73 ---- #if defined (HAVE_PIPE) && defined (HAVE_FORK) && defined (HAVE_EXECVP) error = 0; + // Initialize file descriptors so that shutdown works properly. + f_pipe[0] = -1; + f_pipe[1] = -1; + b_pipe[0] = -1; + b_pipe[1] = -1; + b_pipe_fd = NULL; + char *argv[6]; { int arg = 0; *************** _Jv_name_finder::_Jv_name_finder (char * *** 93,100 **** --- 100,111 ---- _exit (127); } + // Close child end of pipes. Set local descriptors to -1 so we + // don't try to close the fd again. close (f_pipe [0]); + f_pipe[0] = -1; close (b_pipe [1]); + b_pipe[1] = -1; if (pid < 0) { *************** _Jv_name_finder::_Jv_name_finder (char * *** 104,109 **** --- 115,126 ---- b_pipe_fd = fdopen (b_pipe[0], "r"); error |= !b_pipe_fd; + + if (! error) + { + // Don't try to close the fd twice. + b_pipe[0] = -1; + } #endif } *************** _Jv_name_finder::_Jv_name_finder (char * *** 112,118 **** void _Jv_name_finder::toHex (void *p) { ! unsigned long long n = (unsigned long long)p; int digits = sizeof (void *) * 2; strcpy (hex, "0x"); --- 129,136 ---- void _Jv_name_finder::toHex (void *p) { ! typedef unsigned word_t __attribute ((mode (word))); ! word_t n = (word_t) p; int digits = sizeof (void *) * 2; strcpy (hex, "0x"); diff -Nrc3pad gcc-3.0.4/libjava/no-threads.cc gcc-3.1/libjava/no-threads.cc *** gcc-3.0.4/libjava/no-threads.cc Tue Mar 7 19:55:24 2000 --- gcc-3.1/libjava/no-threads.cc Wed Oct 10 22:25:42 2001 *************** *** 1,6 **** // no-thread.cc - Implementation of `no threads' threads. ! /* Copyright (C) 1998, 1999 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // no-thread.cc - Implementation of `no threads' threads. ! /* Copyright (C) 1998, 1999, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 13,29 **** #include #include #include java::lang::Thread *_Jv_OnlyThread = NULL; void ! _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *, ! _Jv_ThreadStartFunc *meth) { ! // Don't use JvAssert, since we want this to fail even when compiled ! // without assertions. ! if (_Jv_OnlyThread) ! JvFail ("only thread already running"); ! _Jv_OnlyThread = thread; ! (*meth) (thread); } --- 13,33 ---- #include #include #include + #include java::lang::Thread *_Jv_OnlyThread = NULL; + _Jv_Thread_t * + _Jv_ThreadInitData (java::lang::Thread *thread) + { + // It is ok to create a new Thread object, as long as it isn't started. + if (_Jv_OnlyThread == NULL) + _Jv_OnlyThread = thread; + return NULL; + } + void ! _Jv_ThreadStart (java::lang::Thread *, _Jv_Thread_t *, _Jv_ThreadStartFunc *) { ! throw new java::lang::InternalError (JvNewStringLatin1 ("Thread.start called but threads not available")); } diff -Nrc3pad gcc-3.0.4/libjava/nogc.cc gcc-3.1/libjava/nogc.cc *** gcc-3.0.4/libjava/nogc.cc Sat Dec 30 12:18:38 2000 --- gcc-3.1/libjava/nogc.cc Sun Jan 27 22:33:35 2002 *************** *** 1,6 **** // nogc.cc - Implement null garbage collector. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // nogc.cc - Implement null garbage collector. ! /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 19,37 **** // Total amount of memory allocated. static long total = 0; - #ifdef INTERPRETER void * ! _Jv_BuildGCDescr(jclass klass) { return 0; } - #endif void * _Jv_AllocObj (jsize size, jclass klass) { total += size; void *obj = calloc (size, 1); *((_Jv_VTable **) obj) = klass->vtable; return obj; } --- 19,46 ---- // Total amount of memory allocated. static long total = 0; void * ! _Jv_BuildGCDescr(jclass) { return 0; } void * _Jv_AllocObj (jsize size, jclass klass) { total += size; void *obj = calloc (size, 1); + if (!obj) _Jv_ThrowNoMemory(); + *((_Jv_VTable **) obj) = klass->vtable; + return obj; + } + + void * + _Jv_AllocPtrFreeObj (jsize size, jclass klass) + { + total += size; + void *obj = calloc (size, 1); + if (!obj) _Jv_ThrowNoMemory(); *((_Jv_VTable **) obj) = klass->vtable; return obj; } *************** _Jv_AllocArray (jsize size, jclass klass *** 41,46 **** --- 50,56 ---- { total += size; void *obj = calloc (size, 1); + if (!obj) _Jv_ThrowNoMemory(); *((_Jv_VTable **) obj) = klass->vtable; return obj; } *************** void * *** 49,54 **** --- 59,73 ---- _Jv_AllocBytes (jsize size) { total += size; + void *obj = calloc (size, 1); + if (!obj) _Jv_ThrowNoMemory(); + return obj; + } + + void * + _Jv_AllocRawObj (jsize size) + { + total += size; return calloc (size, 1); } *************** _Jv_RunAllFinalizers (void) *** 71,76 **** --- 90,100 ---- } void + _Jv_GCInitializeFinalizers (void (*) (void)) + { + } + + void _Jv_RunGC (void) { } *************** _Jv_GCFreeMemory (void) *** 88,99 **** } void ! _Jv_GCSetInitialHeapSize (size_t size) { } void ! _Jv_GCSetMaximumHeapSize (size_t size) { } --- 112,123 ---- } void ! _Jv_GCSetInitialHeapSize (size_t) { } void ! _Jv_GCSetMaximumHeapSize (size_t) { } *************** void *** 111,113 **** --- 135,167 ---- _Jv_InitGC (void) { } + + void + _Jv_GCRegisterDisappearingLink (jobject *) + { + } + + jboolean + _Jv_GCCanReclaimSoftReference (jobject) + { + // For now, always reclaim soft references. FIXME. + return true; + } + + #ifdef JV_HASH_SYNCHRONIZATION + void * + _Jv_AllocTraceOne (jsize size /* includes vtable slot */) + { + void *obj = calloc(size, 1); + if (!obj) _Jv_ThrowNoMemory(); + return result; + } + + void * + _Jv_AllocTraceTwo (jsize size /* includes vtable slot */) + { + void *obj = calloc(size, 1); + if (!obj) _Jv_ThrowNoMemory(); + return result; + } + #endif /* JV_HASH_SYNCHRONIZATION */ diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Attr.java gcc-3.1/libjava/org/w3c/dom/Attr.java *** gcc-3.0.4/libjava/org/w3c/dom/Attr.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Attr.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,111 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The Attr interface represents an attribute in an + * Element object. Typically the allowable values for the + * attribute are defined in a document type definition. + *

          Attr objects inherit the Node interface, but + * since they are not actually child nodes of the element they describe, the + * DOM does not consider them part of the document tree. Thus, the + * Node attributes parentNode, + * previousSibling, and nextSibling have a + * null value for Attr objects. The DOM takes the + * view that attributes are properties of elements rather than having a + * separate identity from the elements they are associated with; this should + * make it more efficient to implement such features as default attributes + * associated with all elements of a given type. Furthermore, + * Attr nodes may not be immediate children of a + * DocumentFragment. However, they can be associated with + * Element nodes contained within a + * DocumentFragment. In short, users and implementors of the + * DOM need to be aware that Attr nodes have some things in + * common with other objects inheriting the Node interface, but + * they also are quite distinct. + *

          The attribute's effective value is determined as follows: if this + * attribute has been explicitly assigned any value, that value is the + * attribute's effective value; otherwise, if there is a declaration for + * this attribute, and that declaration includes a default value, then that + * default value is the attribute's effective value; otherwise, the + * attribute does not exist on this element in the structure model until it + * has been explicitly added. Note that the nodeValue attribute + * on the Attr instance can also be used to retrieve the string + * version of the attribute's value(s). + *

          In XML, where the value of an attribute can contain entity references, + * the child nodes of the Attr node may be either + * Text or EntityReference nodes (when these are + * in use; see the description of EntityReference for + * discussion). Because the DOM Core is not aware of attribute types, it + * treats all attribute values as simple strings, even if the DTD or schema + * declares them as having tokenized types. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Attr extends Node { + /** + * Returns the name of this attribute. + */ + public String getName(); + + /** + * If this attribute was explicitly given a value in the original + * document, this is true; otherwise, it is + * false. Note that the implementation is in charge of this + * attribute, not the user. If the user changes the value of the + * attribute (even if it ends up having the same value as the default + * value) then the specified flag is automatically flipped + * to true. To re-specify the attribute as the default + * value from the DTD, the user must delete the attribute. The + * implementation will then make a new attribute available with + * specified set to false and the default + * value (if one exists). + *
          In summary: If the attribute has an assigned value in the document + * then specified is true, and the value is + * the assigned value. If the attribute has no assigned value in the + * document and has a default value in the DTD, then + * specified is false, and the value is the + * default value in the DTD. If the attribute has no assigned value in + * the document and has a value of #IMPLIED in the DTD, then the + * attribute does not appear in the structure model of the document. If + * the ownerElement attribute is null (i.e. + * because it was just created or was set to null by the + * various removal and cloning operations) specified is + * true. + */ + public boolean getSpecified(); + + /** + * On retrieval, the value of the attribute is returned as a string. + * Character and general entity references are replaced with their + * values. See also the method getAttribute on the + * Element interface. + *
          On setting, this creates a Text node with the unparsed + * contents of the string. I.e. any characters that an XML processor + * would recognize as markup are instead treated as literal text. See + * also the method setAttribute on the Element + * interface. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly. + */ + public String getValue(); + public void setValue(String value) + throws DOMException; + + /** + * The Element node this attribute is attached to or + * null if this attribute is not in use. + * @since DOM Level 2 + */ + public Element getOwnerElement(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/CDATASection.java gcc-3.1/libjava/org/w3c/dom/CDATASection.java *** gcc-3.0.4/libjava/org/w3c/dom/CDATASection.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/CDATASection.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,48 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * CDATA sections are used to escape blocks of text containing characters that + * would otherwise be regarded as markup. The only delimiter that is + * recognized in a CDATA section is the "]]>" string that ends the CDATA + * section. CDATA sections cannot be nested. Their primary purpose is for + * including material such as XML fragments, without needing to escape all + * the delimiters. + *

          The DOMString attribute of the Text node holds + * the text that is contained by the CDATA section. Note that this may + * contain characters that need to be escaped outside of CDATA sections and + * that, depending on the character encoding ("charset") chosen for + * serialization, it may be impossible to write out some characters as part + * of a CDATA section. + *

          The CDATASection interface inherits from the + * CharacterData interface through the Text + * interface. Adjacent CDATASection nodes are not merged by use + * of the normalize method of the Node interface. + * Because no markup is recognized within a CDATASection, + * character numeric references cannot be used as an escape mechanism when + * serializing. Therefore, action needs to be taken when serializing a + * CDATASection with a character encoding where some of the + * contained characters cannot be represented. Failure to do so would not + * produce well-formed XML.One potential solution in the serialization + * process is to end the CDATA section before the character, output the + * character using a character reference or entity reference, and open a new + * CDATA section for any further characters in the text node. Note, however, + * that some code conversion libraries at the time of writing do not return + * an error or exception when a character is missing from the encoding, + * making the task of ensuring that data is not corrupted on serialization + * more difficult. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface CDATASection extends Text { + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/CharacterData.java gcc-3.1/libjava/org/w3c/dom/CharacterData.java *** gcc-3.0.4/libjava/org/w3c/dom/CharacterData.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/CharacterData.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,144 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The CharacterData interface extends Node with a set of + * attributes and methods for accessing character data in the DOM. For + * clarity this set is defined here rather than on each object that uses + * these attributes and methods. No DOM objects correspond directly to + * CharacterData, though Text and others do + * inherit the interface from it. All offsets in this interface + * start from 0. + *

          As explained in the DOMString interface, text strings in + * the DOM are represented in UTF-16, i.e. as a sequence of 16-bit units. In + * the following, the term 16-bit units is used whenever necessary to + * indicate that indexing on CharacterData is done in 16-bit units. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface CharacterData extends Node { + /** + * The character data of the node that implements this interface. The DOM + * implementation may not put arbitrary limits on the amount of data + * that may be stored in a CharacterData node. However, + * implementation limits may mean that the entirety of a node's data may + * not fit into a single DOMString. In such cases, the user + * may call substringData to retrieve the data in + * appropriately sized pieces. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly. + * @exception DOMException + * DOMSTRING_SIZE_ERR: Raised when it would return more characters than + * fit in a DOMString variable on the implementation + * platform. + */ + public String getData() + throws DOMException; + public void setData(String data) + throws DOMException; + + /** + * The number of 16-bit units that are available through data + * and the substringData method below. This may have the + * value zero, i.e., CharacterData nodes may be empty. + */ + public int getLength(); + + /** + * Extracts a range of data from the node. + * @param offsetStart offset of substring to extract. + * @param countThe number of 16-bit units to extract. + * @return The specified substring. If the sum of offset and + * count exceeds the length, then all 16-bit + * units to the end of the data are returned. + * @exception DOMException + * INDEX_SIZE_ERR: Raised if the specified offset is + * negative or greater than the number of 16-bit units in + * data, or if the specified count is + * negative. + *
          DOMSTRING_SIZE_ERR: Raised if the specified range of text does + * not fit into a DOMString. + */ + public String substringData(int offset, + int count) + throws DOMException; + + /** + * Append the string to the end of the character data of the node. Upon + * success, data provides access to the concatenation of + * data and the DOMString specified. + * @param argThe DOMString to append. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public void appendData(String arg) + throws DOMException; + + /** + * Insert a string at the specified 16-bit unit offset. + * @param offsetThe character offset at which to insert. + * @param argThe DOMString to insert. + * @exception DOMException + * INDEX_SIZE_ERR: Raised if the specified offset is + * negative or greater than the number of 16-bit units in + * data. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public void insertData(int offset, + String arg) + throws DOMException; + + /** + * Remove a range of 16-bit units from the node. Upon success, + * data and length reflect the change. + * @param offsetThe offset from which to start removing. + * @param countThe number of 16-bit units to delete. If the sum of + * offset and count exceeds + * length then all 16-bit units from offset + * to the end of the data are deleted. + * @exception DOMException + * INDEX_SIZE_ERR: Raised if the specified offset is + * negative or greater than the number of 16-bit units in + * data, or if the specified count is + * negative. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public void deleteData(int offset, + int count) + throws DOMException; + + /** + * Replace the characters starting at the specified 16-bit unit offset + * with the specified string. + * @param offsetThe offset from which to start replacing. + * @param countThe number of 16-bit units to replace. If the sum of + * offset and count exceeds + * length, then all 16-bit units to the end of the data + * are replaced; (i.e., the effect is the same as a remove + * method call with the same range, followed by an append + * method invocation). + * @param argThe DOMString with which the range must be + * replaced. + * @exception DOMException + * INDEX_SIZE_ERR: Raised if the specified offset is + * negative or greater than the number of 16-bit units in + * data, or if the specified count is + * negative. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public void replaceData(int offset, + int count, + String arg) + throws DOMException; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Comment.java gcc-3.1/libjava/org/w3c/dom/Comment.java *** gcc-3.0.4/libjava/org/w3c/dom/Comment.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Comment.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,24 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * This interface inherits from CharacterData and represents the + * content of a comment, i.e., all the characters between the starting ' + * <!--' and ending '-->'. Note that this is + * the definition of a comment in XML, and, in practice, HTML, although some + * HTML tools may implement the full SGML comment structure. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Comment extends CharacterData { + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/DOMException.java gcc-3.1/libjava/org/w3c/dom/DOMException.java *** gcc-3.0.4/libjava/org/w3c/dom/DOMException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/DOMException.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,117 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * DOM operations only raise exceptions in "exceptional" circumstances, i.e., + * when an operation is impossible to perform (either for logical reasons, + * because data is lost, or because the implementation has become unstable). + * In general, DOM methods return specific error values in ordinary + * processing situations, such as out-of-bound errors when using + * NodeList. + *

          Implementations should raise other exceptions under other circumstances. + * For example, implementations should raise an implementation-dependent + * exception if a null argument is passed. + *

          Some languages and object systems do not support the concept of + * exceptions. For such systems, error conditions may be indicated using + * native error reporting mechanisms. For some bindings, for example, + * methods may return error codes similar to those listed in the + * corresponding method descriptions. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public class DOMException extends RuntimeException { + public DOMException(short code, String message) { + super(message); + this.code = code; + } + /** @serial */ + public short code; + // ExceptionCode + /** + * If index or size is negative, or greater than the allowed value + */ + public static final short INDEX_SIZE_ERR = 1; + /** + * If the specified range of text does not fit into a DOMString + */ + public static final short DOMSTRING_SIZE_ERR = 2; + /** + * If any node is inserted somewhere it doesn't belong + */ + public static final short HIERARCHY_REQUEST_ERR = 3; + /** + * If a node is used in a different document than the one that created it + * (that doesn't support it) + */ + public static final short WRONG_DOCUMENT_ERR = 4; + /** + * If an invalid or illegal character is specified, such as in a name. See + * production 2 in the XML specification for the definition of a legal + * character, and production 5 for the definition of a legal name + * character. + */ + public static final short INVALID_CHARACTER_ERR = 5; + /** + * If data is specified for a node which does not support data + */ + public static final short NO_DATA_ALLOWED_ERR = 6; + /** + * If an attempt is made to modify an object where modifications are not + * allowed + */ + public static final short NO_MODIFICATION_ALLOWED_ERR = 7; + /** + * If an attempt is made to reference a node in a context where it does + * not exist + */ + public static final short NOT_FOUND_ERR = 8; + /** + * If the implementation does not support the requested type of object or + * operation. + */ + public static final short NOT_SUPPORTED_ERR = 9; + /** + * If an attempt is made to add an attribute that is already in use + * elsewhere + */ + public static final short INUSE_ATTRIBUTE_ERR = 10; + /** + * If an attempt is made to use an object that is not, or is no longer, + * usable. + * @since DOM Level 2 + */ + public static final short INVALID_STATE_ERR = 11; + /** + * If an invalid or illegal string is specified. + * @since DOM Level 2 + */ + public static final short SYNTAX_ERR = 12; + /** + * If an attempt is made to modify the type of the underlying object. + * @since DOM Level 2 + */ + public static final short INVALID_MODIFICATION_ERR = 13; + /** + * If an attempt is made to create or change an object in a way which is + * incorrect with regard to namespaces. + * @since DOM Level 2 + */ + public static final short NAMESPACE_ERR = 14; + /** + * If a parameter or an operation is not supported by the underlying + * object. + * @since DOM Level 2 + */ + public static final short INVALID_ACCESS_ERR = 15; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/DOMImplementation.java gcc-3.1/libjava/org/w3c/dom/DOMImplementation.java *** gcc-3.0.4/libjava/org/w3c/dom/DOMImplementation.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/DOMImplementation.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,100 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The DOMImplementation interface provides a number of methods + * for performing operations that are independent of any particular instance + * of the document object model. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface DOMImplementation { + /** + * Test if the DOM implementation implements a specific feature. + * @param featureThe name of the feature to test (case-insensitive). The + * values used by DOM features are defined throughout the DOM Level 2 + * specifications and listed in the section. The name must be an XML + * name. To avoid possible conflicts, as a convention, names referring + * to features defined outside the DOM specification should be made + * unique by reversing the name of the Internet domain name of the + * person (or the organization that the person belongs to) who defines + * the feature, component by component, and using this as a prefix. + * For instance, the W3C SVG Working Group defines the feature + * "org.w3c.dom.svg". + * @param versionThis is the version number of the feature to test. In + * Level 2, the string can be either "2.0" or "1.0". If the version is + * not specified, supporting any version of the feature causes the + * method to return true. + * @return true if the feature is implemented in the + * specified version, false otherwise. + */ + public boolean hasFeature(String feature, + String version); + + /** + * Creates an empty DocumentType node. Entity declarations + * and notations are not made available. Entity reference expansions and + * default attribute additions do not occur. It is expected that a + * future version of the DOM will provide a way for populating a + * DocumentType. + *
          HTML-only DOM implementations do not need to implement this method. + * @param qualifiedNameThe qualified name of the document type to be + * created. + * @param publicIdThe external subset public identifier. + * @param systemIdThe external subset system identifier. + * @return A new DocumentType node with + * Node.ownerDocument set to null. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified qualified name + * contains an illegal character. + *
          NAMESPACE_ERR: Raised if the qualifiedName is + * malformed. + * @since DOM Level 2 + */ + public DocumentType createDocumentType(String qualifiedName, + String publicId, + String systemId) + throws DOMException; + + /** + * Creates an XML Document object of the specified type with + * its document element. HTML-only DOM implementations do not need to + * implement this method. + * @param namespaceURIThe namespace URI of the document element to create. + * @param qualifiedNameThe qualified name of the document element to be + * created. + * @param doctypeThe type of document to be created or null. + * When doctype is not null, its + * Node.ownerDocument attribute is set to the document + * being created. + * @return A new Document object. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified qualified name + * contains an illegal character. + *
          NAMESPACE_ERR: Raised if the qualifiedName is + * malformed, if the qualifiedName has a prefix and the + * namespaceURI is null, or if the + * qualifiedName has a prefix that is "xml" and the + * namespaceURI is different from " + * http://www.w3.org/XML/1998/namespace" . + *
          WRONG_DOCUMENT_ERR: Raised if doctype has already + * been used with a different document or was created from a different + * implementation. + * @since DOM Level 2 + */ + public Document createDocument(String namespaceURI, + String qualifiedName, + DocumentType doctype) + throws DOMException; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Document.java gcc-3.1/libjava/org/w3c/dom/Document.java *** gcc-3.0.4/libjava/org/w3c/dom/Document.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Document.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,365 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The Document interface represents the entire HTML or XML + * document. Conceptually, it is the root of the document tree, and provides + * the primary access to the document's data. + *

          Since elements, text nodes, comments, processing instructions, etc. + * cannot exist outside the context of a Document, the + * Document interface also contains the factory methods needed + * to create these objects. The Node objects created have a + * ownerDocument attribute which associates them with the + * Document within whose context they were created. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Document extends Node { + /** + * The Document Type Declaration (see DocumentType) + * associated with this document. For HTML documents as well as XML + * documents without a document type declaration this returns + * null. The DOM Level 2 does not support editing the + * Document Type Declaration. docType cannot be altered in + * any way, including through the use of methods inherited from the + * Node interface, such as insertNode or + * removeNode. + */ + public DocumentType getDoctype(); + + /** + * The DOMImplementation object that handles this document. A + * DOM application may use objects from multiple implementations. + */ + public DOMImplementation getImplementation(); + + /** + * This is a convenience attribute that allows direct access to the child + * node that is the root element of the document. For HTML documents, + * this is the element with the tagName "HTML". + */ + public Element getDocumentElement(); + + /** + * Creates an element of the type specified. Note that the instance + * returned implements the Element interface, so attributes + * can be specified directly on the returned object. + *
          In addition, if there are known attributes with default values, + * Attr nodes representing them are automatically created + * and attached to the element. + *
          To create an element with a qualified name and namespace URI, use + * the createElementNS method. + * @param tagNameThe name of the element type to instantiate. For XML, + * this is case-sensitive. For HTML, the tagName + * parameter may be provided in any case, but it must be mapped to the + * canonical uppercase form by the DOM implementation. + * @return A new Element object with the + * nodeName attribute set to tagName, and + * localName, prefix, and + * namespaceURI set to null. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified name contains an + * illegal character. + */ + public Element createElement(String tagName) + throws DOMException; + + /** + * Creates an empty DocumentFragment object. + * @return A new DocumentFragment. + */ + public DocumentFragment createDocumentFragment(); + + /** + * Creates a Text node given the specified string. + * @param dataThe data for the node. + * @return The new Text object. + */ + public Text createTextNode(String data); + + /** + * Creates a Comment node given the specified string. + * @param dataThe data for the node. + * @return The new Comment object. + */ + public Comment createComment(String data); + + /** + * Creates a CDATASection node whose value is the specified + * string. + * @param dataThe data for the CDATASection contents. + * @return The new CDATASection object. + * @exception DOMException + * NOT_SUPPORTED_ERR: Raised if this document is an HTML document. + */ + public CDATASection createCDATASection(String data) + throws DOMException; + + /** + * Creates a ProcessingInstruction node given the specified + * name and data strings. + * @param targetThe target part of the processing instruction. + * @param dataThe data for the node. + * @return The new ProcessingInstruction object. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified target contains an + * illegal character. + *
          NOT_SUPPORTED_ERR: Raised if this document is an HTML document. + */ + public ProcessingInstruction createProcessingInstruction(String target, + String data) + throws DOMException; + + /** + * Creates an Attr of the given name. Note that the + * Attr instance can then be set on an Element + * using the setAttributeNode method. + *
          To create an attribute with a qualified name and namespace URI, use + * the createAttributeNS method. + * @param nameThe name of the attribute. + * @return A new Attr object with the nodeName + * attribute set to name, and localName, + * prefix, and namespaceURI set to + * null. The value of the attribute is the empty string. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified name contains an + * illegal character. + */ + public Attr createAttribute(String name) + throws DOMException; + + /** + * Creates an EntityReference object. In addition, if the + * referenced entity is known, the child list of the + * EntityReference node is made the same as that of the + * corresponding Entity node.If any descendant of the + * Entity node has an unbound namespace prefix, the + * corresponding descendant of the created EntityReference + * node is also unbound; (its namespaceURI is + * null). The DOM Level 2 does not support any mechanism to + * resolve namespace prefixes. + * @param nameThe name of the entity to reference. + * @return The new EntityReference object. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified name contains an + * illegal character. + *
          NOT_SUPPORTED_ERR: Raised if this document is an HTML document. + */ + public EntityReference createEntityReference(String name) + throws DOMException; + + /** + * Returns a NodeList of all the Elements with a + * given tag name in the order in which they are encountered in a + * preorder traversal of the Document tree. + * @param tagnameThe name of the tag to match on. The special value "*" + * matches all tags. + * @return A new NodeList object containing all the matched + * Elements. + */ + public NodeList getElementsByTagName(String tagname); + + /** + * Imports a node from another document to this document. The returned + * node has no parent; (parentNode is null). + * The source node is not altered or removed from the original document; + * this method creates a new copy of the source node. + *
          For all nodes, importing a node creates a node object owned by the + * importing document, with attribute values identical to the source + * node's nodeName and nodeType, plus the + * attributes related to namespaces (prefix, + * localName, and namespaceURI). As in the + * cloneNode operation on a Node, the source + * node is not altered. + *
          Additional information is copied as appropriate to the + * nodeType, attempting to mirror the behavior expected if + * a fragment of XML or HTML source was copied from one document to + * another, recognizing that the two documents may have different DTDs + * in the XML case. The following list describes the specifics for each + * type of node. + *

          + *
          ATTRIBUTE_NODE
          + *
          The ownerElement attribute + * is set to null and the specified flag is + * set to true on the generated Attr. The + * descendants of the source Attr are recursively imported + * and the resulting nodes reassembled to form the corresponding subtree. + * Note that the deep parameter has no effect on + * Attr nodes; they always carry their children with them + * when imported.
          + *
          DOCUMENT_FRAGMENT_NODE
          + *
          If the deep option + * was set to true, the descendants of the source element + * are recursively imported and the resulting nodes reassembled to form + * the corresponding subtree. Otherwise, this simply generates an empty + * DocumentFragment.
          + *
          DOCUMENT_NODE
          + *
          Document + * nodes cannot be imported.
          + *
          DOCUMENT_TYPE_NODE
          + *
          DocumentType + * nodes cannot be imported.
          + *
          ELEMENT_NODE
          + *
          Specified attribute nodes of the + * source element are imported, and the generated Attr + * nodes are attached to the generated Element. Default + * attributes are not copied, though if the document being imported into + * defines default attributes for this element name, those are assigned. + * If the importNode deep parameter was set to + * true, the descendants of the source element are + * recursively imported and the resulting nodes reassembled to form the + * corresponding subtree.
          + *
          ENTITY_NODE
          + *
          Entity nodes can be + * imported, however in the current release of the DOM the + * DocumentType is readonly. Ability to add these imported + * nodes to a DocumentType will be considered for addition + * to a future release of the DOM.On import, the publicId, + * systemId, and notationName attributes are + * copied. If a deep import is requested, the descendants + * of the the source Entity are recursively imported and + * the resulting nodes reassembled to form the corresponding subtree.
          + *
          + * ENTITY_REFERENCE_NODE
          + *
          Only the EntityReference itself is + * copied, even if a deep import is requested, since the + * source and destination documents might have defined the entity + * differently. If the document being imported into provides a + * definition for this entity name, its value is assigned.
          + *
          NOTATION_NODE
          + *
          + * Notation nodes can be imported, however in the current + * release of the DOM the DocumentType is readonly. Ability + * to add these imported nodes to a DocumentType will be + * considered for addition to a future release of the DOM.On import, the + * publicId and systemId attributes are copied. + * Note that the deep parameter has no effect on + * Notation nodes since they never have any children.
          + *
          + * PROCESSING_INSTRUCTION_NODE
          + *
          The imported node copies its + * target and data values from those of the + * source node.
          + *
          TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE
          + *
          These three + * types of nodes inheriting from CharacterData copy their + * data and length attributes from those of + * the source node.
          + * + * @param importedNodeThe node to import. + * @param deepIf true, recursively import the subtree under + * the specified node; if false, import only the node + * itself, as explained above. This has no effect on Attr + * , EntityReference, and Notation nodes. + * @return The imported node that belongs to this Document. + * @exception DOMException + * NOT_SUPPORTED_ERR: Raised if the type of node being imported is not + * supported. + * @since DOM Level 2 + */ + public Node importNode(Node importedNode, + boolean deep) + throws DOMException; + + /** + * Creates an element of the given qualified name and namespace URI. + * HTML-only DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the element to create. + * @param qualifiedNameThe qualified name of the element type to + * instantiate. + * @return A new Element object with the following + * attributes:AttributeValueNode.nodeName + * qualifiedNameNode.namespaceURI + * namespaceURINode.prefixprefix, extracted + * from qualifiedName, or null if there is + * no prefixNode.localNamelocal name, extracted from + * qualifiedNameElement.tagName + * qualifiedName + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified qualified name + * contains an illegal character. + *
          NAMESPACE_ERR: Raised if the qualifiedName is + * malformed, if the qualifiedName has a prefix and the + * namespaceURI is null, or if the + * qualifiedName has a prefix that is "xml" and the + * namespaceURI is different from " + * http://www.w3.org/XML/1998/namespace" . + * @since DOM Level 2 + */ + public Element createElementNS(String namespaceURI, + String qualifiedName) + throws DOMException; + + /** + * Creates an attribute of the given qualified name and namespace URI. + * HTML-only DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the attribute to create. + * @param qualifiedNameThe qualified name of the attribute to instantiate. + * @return A new Attr object with the following attributes: + * AttributeValueNode.nodeNamequalifiedName + * Node.namespaceURInamespaceURI + * Node.prefixprefix, extracted from + * qualifiedName, or null if there is no + * prefixNode.localNamelocal name, extracted from + * qualifiedNameAttr.name + * qualifiedNameNode.nodeValuethe empty + * string + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified qualified name + * contains an illegal character. + *
          NAMESPACE_ERR: Raised if the qualifiedName is + * malformed, if the qualifiedName has a prefix and the + * namespaceURI is null, if the + * qualifiedName has a prefix that is "xml" and the + * namespaceURI is different from " + * http://www.w3.org/XML/1998/namespace", or if the + * qualifiedName is "xmlns" and the + * namespaceURI is different from " + * http://www.w3.org/2000/xmlns/". + * @since DOM Level 2 + */ + public Attr createAttributeNS(String namespaceURI, + String qualifiedName) + throws DOMException; + + /** + * Returns a NodeList of all the Elements with a + * given local name and namespace URI in the order in which they are + * encountered in a preorder traversal of the Document tree. + * @param namespaceURIThe namespace URI of the elements to match on. The + * special value "*" matches all namespaces. + * @param localNameThe local name of the elements to match on. The + * special value "*" matches all local names. + * @return A new NodeList object containing all the matched + * Elements. + * @since DOM Level 2 + */ + public NodeList getElementsByTagNameNS(String namespaceURI, + String localName); + + /** + * Returns the Element whose ID is given by + * elementId. If no such element exists, returns + * null. Behavior is not defined if more than one element + * has this ID. The DOM implementation must have + * information that says which attributes are of type ID. Attributes + * with the name "ID" are not of type ID unless so defined. + * Implementations that do not know whether attributes are of type ID or + * not are expected to return null. + * @param elementIdThe unique id value for an element. + * @return The matching element. + * @since DOM Level 2 + */ + public Element getElementById(String elementId); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/DocumentFragment.java gcc-3.1/libjava/org/w3c/dom/DocumentFragment.java *** gcc-3.0.4/libjava/org/w3c/dom/DocumentFragment.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/DocumentFragment.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,52 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * DocumentFragment is a "lightweight" or "minimal" + * Document object. It is very common to want to be able to + * extract a portion of a document's tree or to create a new fragment of a + * document. Imagine implementing a user command like cut or rearranging a + * document by moving fragments around. It is desirable to have an object + * which can hold such fragments and it is quite natural to use a Node for + * this purpose. While it is true that a Document object could + * fulfill this role, a Document object can potentially be a + * heavyweight object, depending on the underlying implementation. What is + * really needed for this is a very lightweight object. + * DocumentFragment is such an object. + *

          Furthermore, various operations -- such as inserting nodes as children + * of another Node -- may take DocumentFragment + * objects as arguments; this results in all the child nodes of the + * DocumentFragment being moved to the child list of this node. + *

          The children of a DocumentFragment node are zero or more + * nodes representing the tops of any sub-trees defining the structure of + * the document. DocumentFragment nodes do not need to be + * well-formed XML documents (although they do need to follow the rules + * imposed upon well-formed XML parsed entities, which can have multiple top + * nodes). For example, a DocumentFragment might have only one + * child and that child node could be a Text node. Such a + * structure model represents neither an HTML document nor a well-formed XML + * document. + *

          When a DocumentFragment is inserted into a + * Document (or indeed any other Node that may + * take children) the children of the DocumentFragment and not + * the DocumentFragment itself are inserted into the + * Node. This makes the DocumentFragment very + * useful when the user wishes to create nodes that are siblings; the + * DocumentFragment acts as the parent of these nodes so that + * the user can use the standard methods from the Node + * interface, such as insertBefore and appendChild. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface DocumentFragment extends Node { + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/DocumentType.java gcc-3.1/libjava/org/w3c/dom/DocumentType.java *** gcc-3.0.4/libjava/org/w3c/dom/DocumentType.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/DocumentType.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,79 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * Each Document has a doctype attribute whose value + * is either null or a DocumentType object. The + * DocumentType interface in the DOM Core provides an interface + * to the list of entities that are defined for the document, and little + * else because the effect of namespaces and the various XML schema efforts + * on DTD representation are not clearly understood as of this writing. + *

          The DOM Level 2 doesn't support editing DocumentType nodes. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface DocumentType extends Node { + /** + * The name of DTD; i.e., the name immediately following the + * DOCTYPE keyword. + */ + public String getName(); + + /** + * A NamedNodeMap containing the general entities, both + * external and internal, declared in the DTD. Parameter entities are + * not contained. Duplicates are discarded. For example in: + *

          <!DOCTYPE 
          +      * ex SYSTEM "ex.dtd" [ <!ENTITY foo "foo"> <!ENTITY bar 
          +      * "bar"> <!ENTITY bar "bar2"> <!ENTITY % baz "baz"> 
          +      * ]> <ex/>
          + * the interface provides access to foo + * and the first declaration of bar but not the second + * declaration of bar or baz. Every node in + * this map also implements the Entity interface. + *
          The DOM Level 2 does not support editing entities, therefore + * entities cannot be altered in any way. + */ + public NamedNodeMap getEntities(); + + /** + * A NamedNodeMap containing the notations declared in the + * DTD. Duplicates are discarded. Every node in this map also implements + * the Notation interface. + *
          The DOM Level 2 does not support editing notations, therefore + * notations cannot be altered in any way. + */ + public NamedNodeMap getNotations(); + + /** + * The public identifier of the external subset. + * @since DOM Level 2 + */ + public String getPublicId(); + + /** + * The system identifier of the external subset. + * @since DOM Level 2 + */ + public String getSystemId(); + + /** + * The internal subset as a string.The actual content returned depends on + * how much information is available to the implementation. This may + * vary depending on various parameters, including the XML processor + * used to build the document. + * @since DOM Level 2 + */ + public String getInternalSubset(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Element.java gcc-3.1/libjava/org/w3c/dom/Element.java *** gcc-3.0.4/libjava/org/w3c/dom/Element.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Element.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,302 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The Element interface represents an element in an HTML or XML + * document. Elements may have attributes associated with them; since the + * Element interface inherits from Node, the + * generic Node interface attribute attributes may + * be used to retrieve the set of all attributes for an element. There are + * methods on the Element interface to retrieve either an + * Attr object by name or an attribute value by name. In XML, + * where an attribute value may contain entity references, an + * Attr object should be retrieved to examine the possibly + * fairly complex sub-tree representing the attribute value. On the other + * hand, in HTML, where all attributes have simple string values, methods to + * directly access an attribute value can safely be used as a convenience.In + * DOM Level 2, the method normalize is inherited from the + * Node interface where it was moved. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Element extends Node { + /** + * The name of the element. For example, in: + *

           <elementExample 
          +      * id="demo"> ... </elementExample> , 
          + * tagName has + * the value "elementExample". Note that this is + * case-preserving in XML, as are all of the operations of the DOM. The + * HTML DOM returns the tagName of an HTML element in the + * canonical uppercase form, regardless of the case in the source HTML + * document. + */ + public String getTagName(); + + /** + * Retrieves an attribute value by name. + * @param nameThe name of the attribute to retrieve. + * @return The Attr value as a string, or the empty string + * if that attribute does not have a specified or default value. + */ + public String getAttribute(String name); + + /** + * Adds a new attribute. If an attribute with that name is already present + * in the element, its value is changed to be that of the value + * parameter. This value is a simple string; it is not parsed as it is + * being set. So any markup (such as syntax to be recognized as an + * entity reference) is treated as literal text, and needs to be + * appropriately escaped by the implementation when it is written out. + * In order to assign an attribute value that contains entity + * references, the user must create an Attr node plus any + * Text and EntityReference nodes, build the + * appropriate subtree, and use setAttributeNode to assign + * it as the value of an attribute. + *
          To set an attribute with a qualified name and namespace URI, use + * the setAttributeNS method. + * @param nameThe name of the attribute to create or alter. + * @param valueValue to set in string form. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified name contains an + * illegal character. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public void setAttribute(String name, + String value) + throws DOMException; + + /** + * Removes an attribute by name. If the removed attribute is known to have + * a default value, an attribute immediately appears containing the + * default value as well as the corresponding namespace URI, local name, + * and prefix when applicable. + *
          To remove an attribute by local name and namespace URI, use the + * removeAttributeNS method. + * @param nameThe name of the attribute to remove. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public void removeAttribute(String name) + throws DOMException; + + /** + * Retrieves an attribute node by name. + *
          To retrieve an attribute node by qualified name and namespace URI, + * use the getAttributeNodeNS method. + * @param nameThe name (nodeName) of the attribute to + * retrieve. + * @return The Attr node with the specified name ( + * nodeName) or null if there is no such + * attribute. + */ + public Attr getAttributeNode(String name); + + /** + * Adds a new attribute node. If an attribute with that name ( + * nodeName) is already present in the element, it is + * replaced by the new one. + *
          To add a new attribute node with a qualified name and namespace + * URI, use the setAttributeNodeNS method. + * @param newAttrThe Attr node to add to the attribute list. + * @return If the newAttr attribute replaces an existing + * attribute, the replaced Attr node is returned, + * otherwise null is returned. + * @exception DOMException + * WRONG_DOCUMENT_ERR: Raised if newAttr was created from a + * different document than the one that created the element. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + *
          INUSE_ATTRIBUTE_ERR: Raised if newAttr is already an + * attribute of another Element object. The DOM user must + * explicitly clone Attr nodes to re-use them in other + * elements. + */ + public Attr setAttributeNode(Attr newAttr) + throws DOMException; + + /** + * Removes the specified attribute node. If the removed Attr + * has a default value it is immediately replaced. The replacing + * attribute has the same namespace URI and local name, as well as the + * original prefix, when applicable. + * @param oldAttrThe Attr node to remove from the attribute + * list. + * @return The Attr node that was removed. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + *
          NOT_FOUND_ERR: Raised if oldAttr is not an attribute + * of the element. + */ + public Attr removeAttributeNode(Attr oldAttr) + throws DOMException; + + /** + * Returns a NodeList of all descendant Elements + * with a given tag name, in the order in which they are encountered in + * a preorder traversal of this Element tree. + * @param nameThe name of the tag to match on. The special value "*" + * matches all tags. + * @return A list of matching Element nodes. + */ + public NodeList getElementsByTagName(String name); + + /** + * Retrieves an attribute value by local name and namespace URI. HTML-only + * DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the attribute to retrieve. + * @param localNameThe local name of the attribute to retrieve. + * @return The Attr value as a string, or the empty string + * if that attribute does not have a specified or default value. + * @since DOM Level 2 + */ + public String getAttributeNS(String namespaceURI, + String localName); + + /** + * Adds a new attribute. If an attribute with the same local name and + * namespace URI is already present on the element, its prefix is + * changed to be the prefix part of the qualifiedName, and + * its value is changed to be the value parameter. This + * value is a simple string; it is not parsed as it is being set. So any + * markup (such as syntax to be recognized as an entity reference) is + * treated as literal text, and needs to be appropriately escaped by the + * implementation when it is written out. In order to assign an + * attribute value that contains entity references, the user must create + * an Attr node plus any Text and + * EntityReference nodes, build the appropriate subtree, + * and use setAttributeNodeNS or + * setAttributeNode to assign it as the value of an + * attribute. + *
          HTML-only DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the attribute to create or + * alter. + * @param qualifiedNameThe qualified name of the attribute to create or + * alter. + * @param valueThe value to set in string form. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified qualified name + * contains an illegal character. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + *
          NAMESPACE_ERR: Raised if the qualifiedName is + * malformed, if the qualifiedName has a prefix and the + * namespaceURI is null, if the + * qualifiedName has a prefix that is "xml" and the + * namespaceURI is different from " + * http://www.w3.org/XML/1998/namespace", or if the + * qualifiedName is "xmlns" and the + * namespaceURI is different from " + * http://www.w3.org/2000/xmlns/". + * @since DOM Level 2 + */ + public void setAttributeNS(String namespaceURI, + String qualifiedName, + String value) + throws DOMException; + + /** + * Removes an attribute by local name and namespace URI. If the removed + * attribute has a default value it is immediately replaced. The + * replacing attribute has the same namespace URI and local name, as + * well as the original prefix. + *
          HTML-only DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the attribute to remove. + * @param localNameThe local name of the attribute to remove. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + * @since DOM Level 2 + */ + public void removeAttributeNS(String namespaceURI, + String localName) + throws DOMException; + + /** + * Retrieves an Attr node by local name and namespace URI. + * HTML-only DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the attribute to retrieve. + * @param localNameThe local name of the attribute to retrieve. + * @return The Attr node with the specified attribute local + * name and namespace URI or null if there is no such + * attribute. + * @since DOM Level 2 + */ + public Attr getAttributeNodeNS(String namespaceURI, + String localName); + + /** + * Adds a new attribute. If an attribute with that local name and that + * namespace URI is already present in the element, it is replaced by + * the new one. + *
          HTML-only DOM implementations do not need to implement this method. + * @param newAttrThe Attr node to add to the attribute list. + * @return If the newAttr attribute replaces an existing + * attribute with the same local name and namespace URI, the replaced + * Attr node is returned, otherwise null is + * returned. + * @exception DOMException + * WRONG_DOCUMENT_ERR: Raised if newAttr was created from a + * different document than the one that created the element. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + *
          INUSE_ATTRIBUTE_ERR: Raised if newAttr is already an + * attribute of another Element object. The DOM user must + * explicitly clone Attr nodes to re-use them in other + * elements. + * @since DOM Level 2 + */ + public Attr setAttributeNodeNS(Attr newAttr) + throws DOMException; + + /** + * Returns a NodeList of all the descendant + * Elements with a given local name and namespace URI in + * the order in which they are encountered in a preorder traversal of + * this Element tree. + *
          HTML-only DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the elements to match on. The + * special value "*" matches all namespaces. + * @param localNameThe local name of the elements to match on. The + * special value "*" matches all local names. + * @return A new NodeList object containing all the matched + * Elements. + * @since DOM Level 2 + */ + public NodeList getElementsByTagNameNS(String namespaceURI, + String localName); + + /** + * Returns true when an attribute with a given name is + * specified on this element or has a default value, false + * otherwise. + * @param nameThe name of the attribute to look for. + * @return true if an attribute with the given name is + * specified on this element or has a default value, false + * otherwise. + * @since DOM Level 2 + */ + public boolean hasAttribute(String name); + + /** + * Returns true when an attribute with a given local name and + * namespace URI is specified on this element or has a default value, + * false otherwise. HTML-only DOM implementations do not + * need to implement this method. + * @param namespaceURIThe namespace URI of the attribute to look for. + * @param localNameThe local name of the attribute to look for. + * @return true if an attribute with the given local name + * and namespace URI is specified or has a default value on this + * element, false otherwise. + * @since DOM Level 2 + */ + public boolean hasAttributeNS(String namespaceURI, + String localName); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Entity.java gcc-3.1/libjava/org/w3c/dom/Entity.java *** gcc-3.0.4/libjava/org/w3c/dom/Entity.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Entity.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,68 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * This interface represents an entity, either parsed or unparsed, in an XML + * document. Note that this models the entity itself not the entity + * declaration. Entity declaration modeling has been left for a + * later Level of the DOM specification. + *

          The nodeName attribute that is inherited from + * Node contains the name of the entity. + *

          An XML processor may choose to completely expand entities before the + * structure model is passed to the DOM; in this case there will be no + * EntityReference nodes in the document tree. + *

          XML does not mandate that a non-validating XML processor read and + * process entity declarations made in the external subset or declared in + * external parameter entities. This means that parsed entities declared in + * the external subset need not be expanded by some classes of applications, + * and that the replacement value of the entity may not be available. When + * the replacement value is available, the corresponding Entity + * node's child list represents the structure of that replacement text. + * Otherwise, the child list is empty. + *

          The DOM Level 2 does not support editing Entity nodes; if a + * user wants to make changes to the contents of an Entity, + * every related EntityReference node has to be replaced in the + * structure model by a clone of the Entity's contents, and + * then the desired changes must be made to each of those clones instead. + * Entity nodes and all their descendants are readonly. + *

          An Entity node does not have any parent.If the entity + * contains an unbound namespace prefix, the namespaceURI of + * the corresponding node in the Entity node subtree is + * null. The same is true for EntityReference + * nodes that refer to this entity, when they are created using the + * createEntityReference method of the Document + * interface. The DOM Level 2 does not support any mechanism to resolve + * namespace prefixes. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Entity extends Node { + /** + * The public identifier associated with the entity, if specified. If the + * public identifier was not specified, this is null. + */ + public String getPublicId(); + + /** + * The system identifier associated with the entity, if specified. If the + * system identifier was not specified, this is null. + */ + public String getSystemId(); + + /** + * For unparsed entities, the name of the notation for the entity. For + * parsed entities, this is null. + */ + public String getNotationName(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/EntityReference.java gcc-3.1/libjava/org/w3c/dom/EntityReference.java *** gcc-3.0.4/libjava/org/w3c/dom/EntityReference.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/EntityReference.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,39 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * EntityReference objects may be inserted into the structure + * model when an entity reference is in the source document, or when the + * user wishes to insert an entity reference. Note that character references + * and references to predefined entities are considered to be expanded by + * the HTML or XML processor so that characters are represented by their + * Unicode equivalent rather than by an entity reference. Moreover, the XML + * processor may completely expand references to entities while building the + * structure model, instead of providing EntityReference + * objects. If it does provide such objects, then for a given + * EntityReference node, it may be that there is no + * Entity node representing the referenced entity. If such an + * Entity exists, then the subtree of the + * EntityReference node is in general a copy of the + * Entity node subtree. However, this may not be true when an + * entity contains an unbound namespace prefix. In such a case, because the + * namespace prefix resolution depends on where the entity reference is, the + * descendants of the EntityReference node may be bound to + * different namespace URIs. + *

          As for Entity nodes, EntityReference nodes and + * all their descendants are readonly. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface EntityReference extends Node { + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/NamedNodeMap.java gcc-3.1/libjava/org/w3c/dom/NamedNodeMap.java *** gcc-3.0.4/libjava/org/w3c/dom/NamedNodeMap.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/NamedNodeMap.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,156 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * Objects implementing the NamedNodeMap interface are used to + * represent collections of nodes that can be accessed by name. Note that + * NamedNodeMap does not inherit from NodeList; + * NamedNodeMaps are not maintained in any particular order. + * Objects contained in an object implementing NamedNodeMap may + * also be accessed by an ordinal index, but this is simply to allow + * convenient enumeration of the contents of a NamedNodeMap, + * and does not imply that the DOM specifies an order to these Nodes. + *

          NamedNodeMap objects in the DOM are live. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface NamedNodeMap { + /** + * Retrieves a node specified by name. + * @param nameThe nodeName of a node to retrieve. + * @return A Node (of any type) with the specified + * nodeName, or null if it does not identify + * any node in this map. + */ + public Node getNamedItem(String name); + + /** + * Adds a node using its nodeName attribute. If a node with + * that name is already present in this map, it is replaced by the new + * one. + *
          As the nodeName attribute is used to derive the name + * which the node must be stored under, multiple nodes of certain types + * (those that have a "special" string value) cannot be stored as the + * names would clash. This is seen as preferable to allowing nodes to be + * aliased. + * @param argA node to store in this map. The node will later be + * accessible using the value of its nodeName attribute. + * @return If the new Node replaces an existing node the + * replaced Node is returned, otherwise null + * is returned. + * @exception DOMException + * WRONG_DOCUMENT_ERR: Raised if arg was created from a + * different document than the one that created this map. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly. + *
          INUSE_ATTRIBUTE_ERR: Raised if arg is an + * Attr that is already an attribute of another + * Element object. The DOM user must explicitly clone + * Attr nodes to re-use them in other elements. + */ + public Node setNamedItem(Node arg) + throws DOMException; + + /** + * Removes a node specified by name. When this map contains the attributes + * attached to an element, if the removed attribute is known to have a + * default value, an attribute immediately appears containing the + * default value as well as the corresponding namespace URI, local name, + * and prefix when applicable. + * @param nameThe nodeName of the node to remove. + * @return The node removed from this map if a node with such a name + * exists. + * @exception DOMException + * NOT_FOUND_ERR: Raised if there is no node named name in + * this map. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly. + */ + public Node removeNamedItem(String name) + throws DOMException; + + /** + * Returns the indexth item in the map. If index + * is greater than or equal to the number of nodes in this map, this + * returns null. + * @param indexIndex into this map. + * @return The node at the indexth position in the map, or + * null if that is not a valid index. + */ + public Node item(int index); + + /** + * The number of nodes in this map. The range of valid child node indices + * is 0 to length-1 inclusive. + */ + public int getLength(); + + /** + * Retrieves a node specified by local name and namespace URI. HTML-only + * DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the node to retrieve. + * @param localNameThe local name of the node to retrieve. + * @return A Node (of any type) with the specified local + * name and namespace URI, or null if they do not + * identify any node in this map. + * @since DOM Level 2 + */ + public Node getNamedItemNS(String namespaceURI, + String localName); + + /** + * Adds a node using its namespaceURI and + * localName. If a node with that namespace URI and that + * local name is already present in this map, it is replaced by the new + * one. + *
          HTML-only DOM implementations do not need to implement this method. + * @param argA node to store in this map. The node will later be + * accessible using the value of its namespaceURI and + * localName attributes. + * @return If the new Node replaces an existing node the + * replaced Node is returned, otherwise null + * is returned. + * @exception DOMException + * WRONG_DOCUMENT_ERR: Raised if arg was created from a + * different document than the one that created this map. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly. + *
          INUSE_ATTRIBUTE_ERR: Raised if arg is an + * Attr that is already an attribute of another + * Element object. The DOM user must explicitly clone + * Attr nodes to re-use them in other elements. + * @since DOM Level 2 + */ + public Node setNamedItemNS(Node arg) + throws DOMException; + + /** + * Removes a node specified by local name and namespace URI. A removed + * attribute may be known to have a default value when this map contains + * the attributes attached to an element, as returned by the attributes + * attribute of the Node interface. If so, an attribute + * immediately appears containing the default value as well as the + * corresponding namespace URI, local name, and prefix when applicable. + *
          HTML-only DOM implementations do not need to implement this method. + * @param namespaceURIThe namespace URI of the node to remove. + * @param localNameThe local name of the node to remove. + * @return The node removed from this map if a node with such a local + * name and namespace URI exists. + * @exception DOMException + * NOT_FOUND_ERR: Raised if there is no node with the specified + * namespaceURI and localName in this map. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this map is readonly. + * @since DOM Level 2 + */ + public Node removeNamedItemNS(String namespaceURI, + String localName) + throws DOMException; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Node.java gcc-3.1/libjava/org/w3c/dom/Node.java *** gcc-3.0.4/libjava/org/w3c/dom/Node.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Node.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,390 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The Node interface is the primary datatype for the entire + * Document Object Model. It represents a single node in the document tree. + * While all objects implementing the Node interface expose + * methods for dealing with children, not all objects implementing the + * Node interface may have children. For example, + * Text nodes may not have children, and adding children to + * such nodes results in a DOMException being raised. + *

          The attributes nodeName, nodeValue and + * attributes are included as a mechanism to get at node + * information without casting down to the specific derived interface. In + * cases where there is no obvious mapping of these attributes for a + * specific nodeType (e.g., nodeValue for an + * Element or attributes for a Comment + * ), this returns null. Note that the specialized interfaces + * may contain additional and more convenient mechanisms to get and set the + * relevant information. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Node { + // NodeType + /** + * The node is an Element. + */ + public static final short ELEMENT_NODE = 1; + /** + * The node is an Attr. + */ + public static final short ATTRIBUTE_NODE = 2; + /** + * The node is a Text node. + */ + public static final short TEXT_NODE = 3; + /** + * The node is a CDATASection. + */ + public static final short CDATA_SECTION_NODE = 4; + /** + * The node is an EntityReference. + */ + public static final short ENTITY_REFERENCE_NODE = 5; + /** + * The node is an Entity. + */ + public static final short ENTITY_NODE = 6; + /** + * The node is a ProcessingInstruction. + */ + public static final short PROCESSING_INSTRUCTION_NODE = 7; + /** + * The node is a Comment. + */ + public static final short COMMENT_NODE = 8; + /** + * The node is a Document. + */ + public static final short DOCUMENT_NODE = 9; + /** + * The node is a DocumentType. + */ + public static final short DOCUMENT_TYPE_NODE = 10; + /** + * The node is a DocumentFragment. + */ + public static final short DOCUMENT_FRAGMENT_NODE = 11; + /** + * The node is a Notation. + */ + public static final short NOTATION_NODE = 12; + + /** + * The name of this node, depending on its type; see the table above. + */ + public String getNodeName(); + + /** + * The value of this node, depending on its type; see the table above. + * When it is defined to be null, setting it has no effect. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly. + * @exception DOMException + * DOMSTRING_SIZE_ERR: Raised when it would return more characters than + * fit in a DOMString variable on the implementation + * platform. + */ + public String getNodeValue() + throws DOMException; + public void setNodeValue(String nodeValue) + throws DOMException; + + /** + * A code representing the type of the underlying object, as defined above. + */ + public short getNodeType(); + + /** + * The parent of this node. All nodes, except Attr, + * Document, DocumentFragment, + * Entity, and Notation may have a parent. + * However, if a node has just been created and not yet added to the + * tree, or if it has been removed from the tree, this is + * null. + */ + public Node getParentNode(); + + /** + * A NodeList that contains all children of this node. If + * there are no children, this is a NodeList containing no + * nodes. + */ + public NodeList getChildNodes(); + + /** + * The first child of this node. If there is no such node, this returns + * null. + */ + public Node getFirstChild(); + + /** + * The last child of this node. If there is no such node, this returns + * null. + */ + public Node getLastChild(); + + /** + * The node immediately preceding this node. If there is no such node, + * this returns null. + */ + public Node getPreviousSibling(); + + /** + * The node immediately following this node. If there is no such node, + * this returns null. + */ + public Node getNextSibling(); + + /** + * A NamedNodeMap containing the attributes of this node (if + * it is an Element) or null otherwise. + */ + public NamedNodeMap getAttributes(); + + /** + * The Document object associated with this node. This is + * also the Document object used to create new nodes. When + * this node is a Document or a DocumentType + * which is not used with any Document yet, this is + * null. + * @version DOM Level 2 + */ + public Document getOwnerDocument(); + + /** + * Inserts the node newChild before the existing child node + * refChild. If refChild is null, + * insert newChild at the end of the list of children. + *
          If newChild is a DocumentFragment object, + * all of its children are inserted, in the same order, before + * refChild. If the newChild is already in the + * tree, it is first removed. + * @param newChildThe node to insert. + * @param refChildThe reference node, i.e., the node before which the new + * node must be inserted. + * @return The node being inserted. + * @exception DOMException + * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not + * allow children of the type of the newChild node, or if + * the node to insert is one of this node's ancestors. + *
          WRONG_DOCUMENT_ERR: Raised if newChild was created + * from a different document than the one that created this node. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly or + * if the parent of the node being inserted is readonly. + *
          NOT_FOUND_ERR: Raised if refChild is not a child of + * this node. + */ + public Node insertBefore(Node newChild, + Node refChild) + throws DOMException; + + /** + * Replaces the child node oldChild with newChild + * in the list of children, and returns the oldChild node. + *
          If newChild is a DocumentFragment object, + * oldChild is replaced by all of the + * DocumentFragment children, which are inserted in the + * same order. If the newChild is already in the tree, it + * is first removed. + * @param newChildThe new node to put in the child list. + * @param oldChildThe node being replaced in the list. + * @return The node replaced. + * @exception DOMException + * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not + * allow children of the type of the newChild node, or if + * the node to put in is one of this node's ancestors. + *
          WRONG_DOCUMENT_ERR: Raised if newChild was created + * from a different document than the one that created this node. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node or the parent of + * the new node is readonly. + *
          NOT_FOUND_ERR: Raised if oldChild is not a child of + * this node. + */ + public Node replaceChild(Node newChild, + Node oldChild) + throws DOMException; + + /** + * Removes the child node indicated by oldChild from the list + * of children, and returns it. + * @param oldChildThe node being removed. + * @return The node removed. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + *
          NOT_FOUND_ERR: Raised if oldChild is not a child of + * this node. + */ + public Node removeChild(Node oldChild) + throws DOMException; + + /** + * Adds the node newChild to the end of the list of children + * of this node. If the newChild is already in the tree, it + * is first removed. + * @param newChildThe node to add.If it is a DocumentFragment + * object, the entire contents of the document fragment are moved + * into the child list of this node + * @return The node added. + * @exception DOMException + * HIERARCHY_REQUEST_ERR: Raised if this node is of a type that does not + * allow children of the type of the newChild node, or if + * the node to append is one of this node's ancestors. + *
          WRONG_DOCUMENT_ERR: Raised if newChild was created + * from a different document than the one that created this node. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public Node appendChild(Node newChild) + throws DOMException; + + /** + * Returns whether this node has any children. + * @return true if this node has any children, + * false otherwise. + */ + public boolean hasChildNodes(); + + /** + * Returns a duplicate of this node, i.e., serves as a generic copy + * constructor for nodes. The duplicate node has no parent; ( + * parentNode is null.). + *
          Cloning an Element copies all attributes and their + * values, including those generated by the XML processor to represent + * defaulted attributes, but this method does not copy any text it + * contains unless it is a deep clone, since the text is contained in a + * child Text node. Cloning an Attribute + * directly, as opposed to be cloned as part of an Element + * cloning operation, returns a specified attribute ( + * specified is true). Cloning any other type + * of node simply returns a copy of this node. + *
          Note that cloning an immutable subtree results in a mutable copy, + * but the children of an EntityReference clone are readonly + * . In addition, clones of unspecified Attr nodes are + * specified. And, cloning Document, + * DocumentType, Entity, and + * Notation nodes is implementation dependent. + * @param deepIf true, recursively clone the subtree under + * the specified node; if false, clone only the node + * itself (and its attributes, if it is an Element). + * @return The duplicate node. + */ + public Node cloneNode(boolean deep); + + /** + * Puts all Text nodes in the full depth of the sub-tree + * underneath this Node, including attribute nodes, into a + * "normal" form where only structure (e.g., elements, comments, + * processing instructions, CDATA sections, and entity references) + * separates Text nodes, i.e., there are neither adjacent + * Text nodes nor empty Text nodes. This can + * be used to ensure that the DOM view of a document is the same as if + * it were saved and re-loaded, and is useful when operations (such as + * XPointer lookups) that depend on a particular document tree + * structure are to be used.In cases where the document contains + * CDATASections, the normalize operation alone may not be + * sufficient, since XPointers do not differentiate between + * Text nodes and CDATASection nodes. + * @version DOM Level 2 + */ + public void normalize(); + + /** + * Tests whether the DOM implementation implements a specific feature and + * that feature is supported by this node. + * @param featureThe name of the feature to test. This is the same name + * which can be passed to the method hasFeature on + * DOMImplementation. + * @param versionThis is the version number of the feature to test. In + * Level 2, version 1, this is the string "2.0". If the version is not + * specified, supporting any version of the feature will cause the + * method to return true. + * @return Returns true if the specified feature is + * supported on this node, false otherwise. + * @since DOM Level 2 + */ + public boolean isSupported(String feature, + String version); + + /** + * The namespace URI of this node, or null if it is + * unspecified. + *
          This is not a computed value that is the result of a namespace + * lookup based on an examination of the namespace declarations in + * scope. It is merely the namespace URI given at creation time. + *
          For nodes of any type other than ELEMENT_NODE and + * ATTRIBUTE_NODE and nodes created with a DOM Level 1 + * method, such as createElement from the + * Document interface, this is always null.Per + * the Namespaces in XML Specification an attribute does not inherit + * its namespace from the element it is attached to. If an attribute is + * not explicitly given a namespace, it simply has no namespace. + * @since DOM Level 2 + */ + public String getNamespaceURI(); + + /** + * The namespace prefix of this node, or null if it is + * unspecified. + *
          Note that setting this attribute, when permitted, changes the + * nodeName attribute, which holds the qualified name, as + * well as the tagName and name attributes of + * the Element and Attr interfaces, when + * applicable. + *
          Note also that changing the prefix of an attribute that is known to + * have a default value, does not make a new attribute with the default + * value and the original prefix appear, since the + * namespaceURI and localName do not change. + *
          For nodes of any type other than ELEMENT_NODE and + * ATTRIBUTE_NODE and nodes created with a DOM Level 1 + * method, such as createElement from the + * Document interface, this is always null. + * @exception DOMException + * INVALID_CHARACTER_ERR: Raised if the specified prefix contains an + * illegal character. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + *
          NAMESPACE_ERR: Raised if the specified prefix is + * malformed, if the namespaceURI of this node is + * null, if the specified prefix is "xml" and the + * namespaceURI of this node is different from " + * http://www.w3.org/XML/1998/namespace", if this node is an attribute + * and the specified prefix is "xmlns" and the + * namespaceURI of this node is different from " + * http://www.w3.org/2000/xmlns/", or if this node is an attribute and + * the qualifiedName of this node is "xmlns" . + * @since DOM Level 2 + */ + public String getPrefix(); + public void setPrefix(String prefix) + throws DOMException; + + /** + * Returns the local part of the qualified name of this node. + *
          For nodes of any type other than ELEMENT_NODE and + * ATTRIBUTE_NODE and nodes created with a DOM Level 1 + * method, such as createElement from the + * Document interface, this is always null. + * @since DOM Level 2 + */ + public String getLocalName(); + + /** + * Returns whether this node (if it is an element) has any attributes. + * @return true if this node has any attributes, + * false otherwise. + * @since DOM Level 2 + */ + public boolean hasAttributes(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/NodeList.java gcc-3.1/libjava/org/w3c/dom/NodeList.java *** gcc-3.0.4/libjava/org/w3c/dom/NodeList.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/NodeList.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,41 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The NodeList interface provides the abstraction of an ordered + * collection of nodes, without defining or constraining how this collection + * is implemented. NodeList objects in the DOM are live. + *

          The items in the NodeList are accessible via an integral + * index, starting from 0. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface NodeList { + /** + * Returns the indexth item in the collection. If + * index is greater than or equal to the number of nodes in + * the list, this returns null. + * @param indexIndex into the collection. + * @return The node at the indexth position in the + * NodeList, or null if that is not a valid + * index. + */ + public Node item(int index); + + /** + * The number of nodes in the list. The range of valid child node indices + * is 0 to length-1 inclusive. + */ + public int getLength(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Notation.java gcc-3.1/libjava/org/w3c/dom/Notation.java *** gcc-3.0.4/libjava/org/w3c/dom/Notation.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Notation.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,40 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * This interface represents a notation declared in the DTD. A notation either + * declares, by name, the format of an unparsed entity (see section 4.7 of + * the XML 1.0 specification ), or is used for formal declaration of + * processing instruction targets (see section 2.6 of the XML 1.0 + * specification ). The nodeName attribute inherited from + * Node is set to the declared name of the notation. + *

          The DOM Level 1 does not support editing Notation nodes; + * they are therefore readonly. + *

          A Notation node does not have any parent. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Notation extends Node { + /** + * The public identifier of this notation. If the public identifier was + * not specified, this is null. + */ + public String getPublicId(); + + /** + * The system identifier of this notation. If the system identifier was + * not specified, this is null. + */ + public String getSystemId(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/ProcessingInstruction.java gcc-3.1/libjava/org/w3c/dom/ProcessingInstruction.java *** gcc-3.0.4/libjava/org/w3c/dom/ProcessingInstruction.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/ProcessingInstruction.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,40 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The ProcessingInstruction interface represents a "processing + * instruction", used in XML as a way to keep processor-specific information + * in the text of the document. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface ProcessingInstruction extends Node { + /** + * The target of this processing instruction. XML defines this as being + * the first token following the markup that begins the processing + * instruction. + */ + public String getTarget(); + + /** + * The content of this processing instruction. This is from the first non + * white space character after the target to the character immediately + * preceding the ?>. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly. + */ + public String getData(); + public void setData(String data) + throws DOMException; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/Text.java gcc-3.1/libjava/org/w3c/dom/Text.java *** gcc-3.0.4/libjava/org/w3c/dom/Text.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/Text.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,56 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom; + + /** + * The Text interface inherits from CharacterData + * and represents the textual content (termed character data in XML) of an + * Element or Attr. If there is no markup inside + * an element's content, the text is contained in a single object + * implementing the Text interface that is the only child of + * the element. If there is markup, it is parsed into the information items + * (elements, comments, etc.) and Text nodes that form the list + * of children of the element. + *

          When a document is first made available via the DOM, there is only one + * Text node for each block of text. Users may create adjacent + * Text nodes that represent the contents of a given element + * without any intervening markup, but should be aware that there is no way + * to represent the separations between these nodes in XML or HTML, so they + * will not (in general) persist between DOM editing sessions. The + * normalize() method on Node merges any such + * adjacent Text objects into a single node for each block of + * text. + *

          See also the Document Object Model (DOM) Level 2 Core Specification. + */ + public interface Text extends CharacterData { + /** + * Breaks this node into two nodes at the specified offset, + * keeping both in the tree as siblings. After being split, this node + * will contain all the content up to the offset point. A + * new node of the same type, which contains all the content at and + * after the offset point, is returned. If the original + * node had a parent node, the new node is inserted as the next sibling + * of the original node. When the offset is equal to the + * length of this node, the new node has no data. + * @param offsetThe 16-bit unit offset at which to split, starting from + * 0. + * @return The new node, of the same type as this node. + * @exception DOMException + * INDEX_SIZE_ERR: Raised if the specified offset is negative or greater + * than the number of 16-bit units in data. + *
          NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. + */ + public Text splitText(int offset) + throws DOMException; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/ranges/DocumentRange.java gcc-3.1/libjava/org/w3c/dom/ranges/DocumentRange.java *** gcc-3.0.4/libjava/org/w3c/dom/ranges/DocumentRange.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/ranges/DocumentRange.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,33 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom.ranges; + + /** + *

          See also the Document Object Model (DOM) Level 2 Traversal and Range Specification. + * @since DOM Level 2 + */ + public interface DocumentRange { + /** + * This interface can be obtained from the object implementing the + * Document interface using binding-specific casting + * methods. + * @return The initial state of the Range returned from this method is + * such that both of its boundary-points are positioned at the + * beginning of the corresponding Document, before any content. The + * Range returned can only be used to select content associated with + * this Document, or with DocumentFragments and Attrs for which this + * Document is the ownerDocument. + */ + public Range createRange(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/ranges/Range.java gcc-3.1/libjava/org/w3c/dom/ranges/Range.java *** gcc-3.0.4/libjava/org/w3c/dom/ranges/Range.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/ranges/Range.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,399 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom.ranges; + + import org.w3c.dom.Node; + import org.w3c.dom.DocumentFragment; + import org.w3c.dom.DOMException; + + /** + *

          See also the Document Object Model (DOM) Level 2 Traversal and Range Specification. + * @since DOM Level 2 + */ + public interface Range { + /** + * Node within which the Range begins + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public Node getStartContainer() + throws DOMException; + + /** + * Offset within the starting node of the Range. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public int getStartOffset() + throws DOMException; + + /** + * Node within which the Range ends + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public Node getEndContainer() + throws DOMException; + + /** + * Offset within the ending node of the Range. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public int getEndOffset() + throws DOMException; + + /** + * TRUE if the Range is collapsed + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public boolean getCollapsed() + throws DOMException; + + /** + * The deepest common ancestor container of the Range's two + * boundary-points. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public Node getCommonAncestorContainer() + throws DOMException; + + /** + * Sets the attributes describing the start of the Range. + * @param refNodeThe refNode value. This parameter must be + * different from null. + * @param offsetThe startOffset value. + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if refNode or an ancestor + * of refNode is an Entity, Notation, or DocumentType + * node. + * @exception DOMException + * INDEX_SIZE_ERR: Raised if offset is negative or greater + * than the number of child units in refNode. Child units + * are 16-bit units if refNode is a type of CharacterData + * node (e.g., a Text or Comment node) or a ProcessingInstruction + * node. Child units are Nodes in all other cases. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + */ + public void setStart(Node refNode, + int offset) + throws RangeException, DOMException; + + /** + * Sets the attributes describing the end of a Range. + * @param refNodeThe refNode value. This parameter must be + * different from null. + * @param offsetThe endOffset value. + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if refNode or an ancestor + * of refNode is an Entity, Notation, or DocumentType + * node. + * @exception DOMException + * INDEX_SIZE_ERR: Raised if offset is negative or greater + * than the number of child units in refNode. Child units + * are 16-bit units if refNode is a type of CharacterData + * node (e.g., a Text or Comment node) or a ProcessingInstruction + * node. Child units are Nodes in all other cases. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + */ + public void setEnd(Node refNode, + int offset) + throws RangeException, DOMException; + + /** + * Sets the start position to be before a node + * @param refNodeRange starts before refNode + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if the root container of + * refNode is not an Attr, Document, or DocumentFragment + * node or if refNode is a Document, DocumentFragment, + * Attr, Entity, or Notation node. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void setStartBefore(Node refNode) + throws RangeException, DOMException; + + /** + * Sets the start position to be after a node + * @param refNodeRange starts after refNode + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if the root container of + * refNode is not an Attr, Document, or DocumentFragment + * node or if refNode is a Document, DocumentFragment, + * Attr, Entity, or Notation node. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void setStartAfter(Node refNode) + throws RangeException, DOMException; + + /** + * Sets the end position to be before a node. + * @param refNodeRange ends before refNode + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if the root container of + * refNode is not an Attr, Document, or DocumentFragment + * node or if refNode is a Document, DocumentFragment, + * Attr, Entity, or Notation node. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void setEndBefore(Node refNode) + throws RangeException, DOMException; + + /** + * Sets the end of a Range to be after a node + * @param refNodeRange ends after refNode. + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if the root container of + * refNode is not an Attr, Document or DocumentFragment + * node or if refNode is a Document, DocumentFragment, + * Attr, Entity, or Notation node. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void setEndAfter(Node refNode) + throws RangeException, DOMException; + + /** + * Collapse a Range onto one of its boundary-points + * @param toStartIf TRUE, collapses the Range onto its start; if FALSE, + * collapses it onto its end. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void collapse(boolean toStart) + throws DOMException; + + /** + * Select a node and its contents + * @param refNodeThe node to select. + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if an ancestor of refNode + * is an Entity, Notation or DocumentType node or if + * refNode is a Document, DocumentFragment, Attr, Entity, + * or Notation node. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void selectNode(Node refNode) + throws RangeException, DOMException; + + /** + * Select the contents within a node + * @param refNodeNode to select from + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if refNode or an ancestor + * of refNode is an Entity, Notation or DocumentType node. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void selectNodeContents(Node refNode) + throws RangeException, DOMException; + + // CompareHow + /** + * Compare start boundary-point of sourceRange to start + * boundary-point of Range on which compareBoundaryPoints + * is invoked. + */ + public static final short START_TO_START = 0; + /** + * Compare start boundary-point of sourceRange to end + * boundary-point of Range on which compareBoundaryPoints + * is invoked. + */ + public static final short START_TO_END = 1; + /** + * Compare end boundary-point of sourceRange to end + * boundary-point of Range on which compareBoundaryPoints + * is invoked. + */ + public static final short END_TO_END = 2; + /** + * Compare end boundary-point of sourceRange to start + * boundary-point of Range on which compareBoundaryPoints + * is invoked. + */ + public static final short END_TO_START = 3; + + /** + * Compare the boundary-points of two Ranges in a document. + * @param howA code representing the type of comparison, as defined above. + * @param sourceRangeThe Range on which this current + * Range is compared to. + * @return -1, 0 or 1 depending on whether the corresponding + * boundary-point of the Range is respectively before, equal to, or + * after the corresponding boundary-point of sourceRange. + * @exception DOMException + * WRONG_DOCUMENT_ERR: Raised if the two Ranges are not in the same + * Document or DocumentFragment. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + */ + public short compareBoundaryPoints(short how, + Range sourceRange) + throws DOMException; + + /** + * Removes the contents of a Range from the containing document or + * document fragment without returning a reference to the removed + * content. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of + * the Range is read-only or any of the nodes that contain any of the + * content of the Range are read-only. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + */ + public void deleteContents() + throws DOMException; + + /** + * Moves the contents of a Range from the containing document or document + * fragment to a new DocumentFragment. + * @return A DocumentFragment containing the extracted contents. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of + * the Range is read-only or any of the nodes which contain any of the + * content of the Range are read-only. + *
          HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be + * extracted into the new DocumentFragment. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + */ + public DocumentFragment extractContents() + throws DOMException; + + /** + * Duplicates the contents of a Range + * @return A DocumentFragment that contains content equivalent to this + * Range. + * @exception DOMException + * HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be + * extracted into the new DocumentFragment. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + */ + public DocumentFragment cloneContents() + throws DOMException; + + /** + * Inserts a node into the Document or DocumentFragment at the start of + * the Range. If the container is a Text node, this will be split at the + * start of the Range (as if the Text node's splitText method was + * performed at the insertion point) and the insertion will occur + * between the two resulting Text nodes. Adjacent Text nodes will not be + * automatically merged. If the node to be inserted is a + * DocumentFragment node, the children will be inserted rather than the + * DocumentFragment node itself. + * @param newNodeThe node to insert at the start of the Range + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of the + * start of the Range is read-only. + *
          WRONG_DOCUMENT_ERR: Raised if newNode and the + * container of the start of the Range were not created from the same + * document. + *
          HIERARCHY_REQUEST_ERR: Raised if the container of the start of + * the Range is of a type that does not allow children of the type of + * newNode or if newNode is an ancestor of + * the container. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + * @exception RangeException + * INVALID_NODE_TYPE_ERR: Raised if newNode is an Attr, + * Entity, Notation, or Document node. + */ + public void insertNode(Node newNode) + throws DOMException, RangeException; + + /** + * Reparents the contents of the Range to the given node and inserts the + * node at the position of the start of the Range. + * @param newParentThe node to surround the contents with. + * @exception DOMException + * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of + * either boundary-point of the Range is read-only. + *
          WRONG_DOCUMENT_ERR: Raised if newParent and the + * container of the start of the Range were not created from the same + * document. + *
          HIERARCHY_REQUEST_ERR: Raised if the container of the start of + * the Range is of a type that does not allow children of the type of + * newParent or if newParent is an ancestor + * of the container or if node would end up with a child + * node of a type not allowed by the type of node. + *
          INVALID_STATE_ERR: Raised if detach() has already + * been invoked on this object. + * @exception RangeException + * BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a + * non-text node. + *
          INVALID_NODE_TYPE_ERR: Raised if node is an Attr, + * Entity, DocumentType, Notation, Document, or DocumentFragment node. + */ + public void surroundContents(Node newParent) + throws DOMException, RangeException; + + /** + * Produces a new Range whose boundary-points are equal to the + * boundary-points of the Range. + * @return The duplicated Range. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public Range cloneRange() + throws DOMException; + + /** + * Returns the contents of a Range as a string. This string contains only + * the data characters, not any markup. + * @return The contents of the Range. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public String toString() + throws DOMException; + + /** + * Called to indicate that the Range is no longer in use and that the + * implementation may relinquish any resources associated with this + * Range. Subsequent calls to any methods or attribute getters on this + * Range will result in a DOMException being thrown with an + * error code of INVALID_STATE_ERR. + * @exception DOMException + * INVALID_STATE_ERR: Raised if detach() has already been + * invoked on this object. + */ + public void detach() + throws DOMException; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/ranges/RangeException.java gcc-3.1/libjava/org/w3c/dom/ranges/RangeException.java *** gcc-3.0.4/libjava/org/w3c/dom/ranges/RangeException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/ranges/RangeException.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,39 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom.ranges; + + /** + * Range operations may throw a RangeException as specified in + * their method descriptions. + *

          See also the Document Object Model (DOM) Level 2 Traversal and Range Specification. + * @since DOM Level 2 + */ + public class RangeException extends RuntimeException { + public RangeException(short code, String message) { + super(message); + this.code = code; + } + public short code; + // RangeExceptionCode + /** + * If the boundary-points of a Range do not meet specific requirements. + */ + public static final short BAD_BOUNDARYPOINTS_ERR = 1; + /** + * If the container of an boundary-point of a Range is being set to either + * a node of an invalid type or a node with an ancestor of an invalid + * type. + */ + public static final short INVALID_NODE_TYPE_ERR = 2; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/traversal/DocumentTraversal.java gcc-3.1/libjava/org/w3c/dom/traversal/DocumentTraversal.java *** gcc-3.0.4/libjava/org/w3c/dom/traversal/DocumentTraversal.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/traversal/DocumentTraversal.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,90 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom.traversal; + + import org.w3c.dom.Node; + import org.w3c.dom.DOMException; + + /** + * DocumentTraversal contains methods that create iterators and + * tree-walkers to traverse a node and its children in document order (depth + * first, pre-order traversal, which is equivalent to the order in which the + * start tags occur in the text representation of the document). In DOMs + * which support the Traversal feature, DocumentTraversal will + * be implemented by the same objects that implement the Document interface. + *

          See also the Document Object Model (DOM) Level 2 Traversal and Range Specification. + * @since DOM Level 2 + */ + public interface DocumentTraversal { + /** + * Create a new NodeIterator over the subtree rooted at the + * specified node. + * @param rootThe node which will be iterated together with its children. + * The iterator is initially positioned just before this node. The + * whatToShow flags and the filter, if any, are not + * considered when setting this position. The root must not be + * null. + * @param whatToShowThis flag specifies which node types may appear in + * the logical view of the tree presented by the iterator. See the + * description of NodeFilter for the set of possible + * SHOW_ values.These flags can be combined using + * OR. + * @param filterThe NodeFilter to be used with this + * TreeWalker, or null to indicate no filter. + * @param entityReferenceExpansionThe value of this flag determines + * whether entity reference nodes are expanded. + * @return The newly created NodeIterator. + * @exception DOMException + * NOT_SUPPORTED_ERR: Raised if the specified root is + * null. + */ + public NodeIterator createNodeIterator(Node root, + int whatToShow, + NodeFilter filter, + boolean entityReferenceExpansion) + throws DOMException; + + /** + * Create a new TreeWalker over the subtree rooted at the + * specified node. + * @param rootThe node which will serve as the root for the + * TreeWalker. The whatToShow flags and the + * NodeFilter are not considered when setting this value; + * any node type will be accepted as the root. The + * currentNode of the TreeWalker is + * initialized to this node, whether or not it is visible. The + * root functions as a stopping point for traversal + * methods that look upward in the document structure, such as + * parentNode and nextNode. The root must + * not be null. + * @param whatToShowThis flag specifies which node types may appear in + * the logical view of the tree presented by the tree-walker. See the + * description of NodeFilter for the set of possible + * SHOW_ values.These flags can be combined using OR. + * @param filterThe NodeFilter to be used with this + * TreeWalker, or null to indicate no filter. + * @param entityReferenceExpansionIf this flag is false, the contents of + * EntityReference nodes are not presented in the logical + * view. + * @return The newly created TreeWalker. + * @exception DOMException + * NOT_SUPPORTED_ERR: Raised if the specified root is + * null. + */ + public TreeWalker createTreeWalker(Node root, + int whatToShow, + NodeFilter filter, + boolean entityReferenceExpansion) + throws DOMException; + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/traversal/NodeFilter.java gcc-3.1/libjava/org/w3c/dom/traversal/NodeFilter.java *** gcc-3.0.4/libjava/org/w3c/dom/traversal/NodeFilter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/traversal/NodeFilter.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,142 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom.traversal; + + import org.w3c.dom.Node; + + /** + * Filters are objects that know how to "filter out" nodes. If a + * NodeIterator or TreeWalker is given a + * NodeFilter, it applies the filter before it returns the next + * node. If the filter says to accept the node, the traversal logic returns + * it; otherwise, traversal looks for the next node and pretends that the + * node that was rejected was not there. + *

          The DOM does not provide any filters. NodeFilter is just an + * interface that users can implement to provide their own filters. + *

          NodeFilters do not need to know how to traverse from node + * to node, nor do they need to know anything about the data structure that + * is being traversed. This makes it very easy to write filters, since the + * only thing they have to know how to do is evaluate a single node. One + * filter may be used with a number of different kinds of traversals, + * encouraging code reuse. + *

          See also the Document Object Model (DOM) Level 2 Traversal and Range Specification. + * @since DOM Level 2 + */ + public interface NodeFilter { + // Constants returned by acceptNode + /** + * Accept the node. Navigation methods defined for + * NodeIterator or TreeWalker will return this + * node. + */ + public static final short FILTER_ACCEPT = 1; + /** + * Reject the node. Navigation methods defined for + * NodeIterator or TreeWalker will not return + * this node. For TreeWalker, the children of this node + * will also be rejected. NodeIterators treat this as a + * synonym for FILTER_SKIP. + */ + public static final short FILTER_REJECT = 2; + /** + * Skip this single node. Navigation methods defined for + * NodeIterator or TreeWalker will not return + * this node. For both NodeIterator and + * TreeWalker, the children of this node will still be + * considered. + */ + public static final short FILTER_SKIP = 3; + + // Constants for whatToShow + /** + * Show all Nodes. + */ + public static final int SHOW_ALL = 0xFFFFFFFF; + /** + * Show Element nodes. + */ + public static final int SHOW_ELEMENT = 0x00000001; + /** + * Show Attr nodes. This is meaningful only when creating an + * iterator or tree-walker with an attribute node as its + * root; in this case, it means that the attribute node + * will appear in the first position of the iteration or traversal. + * Since attributes are never children of other nodes, they do not + * appear when traversing over the document tree. + */ + public static final int SHOW_ATTRIBUTE = 0x00000002; + /** + * Show Text nodes. + */ + public static final int SHOW_TEXT = 0x00000004; + /** + * Show CDATASection nodes. + */ + public static final int SHOW_CDATA_SECTION = 0x00000008; + /** + * Show EntityReference nodes. + */ + public static final int SHOW_ENTITY_REFERENCE = 0x00000010; + /** + * Show Entity nodes. This is meaningful only when creating + * an iterator or tree-walker with an Entity node as its + * root; in this case, it means that the Entity + * node will appear in the first position of the traversal. Since + * entities are not part of the document tree, they do not appear when + * traversing over the document tree. + */ + public static final int SHOW_ENTITY = 0x00000020; + /** + * Show ProcessingInstruction nodes. + */ + public static final int SHOW_PROCESSING_INSTRUCTION = 0x00000040; + /** + * Show Comment nodes. + */ + public static final int SHOW_COMMENT = 0x00000080; + /** + * Show Document nodes. + */ + public static final int SHOW_DOCUMENT = 0x00000100; + /** + * Show DocumentType nodes. + */ + public static final int SHOW_DOCUMENT_TYPE = 0x00000200; + /** + * Show DocumentFragment nodes. + */ + public static final int SHOW_DOCUMENT_FRAGMENT = 0x00000400; + /** + * Show Notation nodes. This is meaningful only when creating + * an iterator or tree-walker with a Notation node as its + * root; in this case, it means that the + * Notation node will appear in the first position of the + * traversal. Since notations are not part of the document tree, they do + * not appear when traversing over the document tree. + */ + public static final int SHOW_NOTATION = 0x00000800; + + /** + * Test whether a specified node is visible in the logical view of a + * TreeWalker or NodeIterator. This function + * will be called by the implementation of TreeWalker and + * NodeIterator; it is not normally called directly from + * user code. (Though you could do so if you wanted to use the same + * filter to guide your own application logic.) + * @param nThe node to check to see if it passes the filter or not. + * @return a constant to determine whether the node is accepted, + * rejected, or skipped, as defined above. + */ + public short acceptNode(Node n); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/traversal/NodeIterator.java gcc-3.1/libjava/org/w3c/dom/traversal/NodeIterator.java *** gcc-3.0.4/libjava/org/w3c/dom/traversal/NodeIterator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/traversal/NodeIterator.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,108 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom.traversal; + + import org.w3c.dom.Node; + import org.w3c.dom.DOMException; + + /** + * Iterators are used to step through a set of nodes, e.g. the + * set of nodes in a NodeList, the document subtree governed by + * a particular Node, the results of a query, or any other set + * of nodes. The set of nodes to be iterated is determined by the + * implementation of the NodeIterator. DOM Level 2 specifies a + * single NodeIterator implementation for document-order + * traversal of a document subtree. Instances of these iterators are created + * by calling DocumentTraversal + * .createNodeIterator(). + *

          See also the Document Object Model (DOM) Level 2 Traversal and Range Specification. + * @since DOM Level 2 + */ + public interface NodeIterator { + /** + * The root node of the NodeIterator, as specified when it + * was created. + */ + public Node getRoot(); + + /** + * This attribute determines which node types are presented via the + * iterator. The available set of constants is defined in the + * NodeFilter interface. Nodes not accepted by + * whatToShow will be skipped, but their children may still + * be considered. Note that this skip takes precedence over the filter, + * if any. + */ + public int getWhatToShow(); + + /** + * The NodeFilter used to screen nodes. + */ + public NodeFilter getFilter(); + + /** + * The value of this flag determines whether the children of entity + * reference nodes are visible to the iterator. If false, they and + * their descendants will be rejected. Note that this rejection takes + * precedence over whatToShow and the filter. Also note + * that this is currently the only situation where + * NodeIterators may reject a complete subtree rather than + * skipping individual nodes. + *
          + *
          To produce a view of the document that has entity references + * expanded and does not expose the entity reference node itself, use + * the whatToShow flags to hide the entity reference node + * and set expandEntityReferences to true when creating the + * iterator. To produce a view of the document that has entity reference + * nodes but no entity expansion, use the whatToShow flags + * to show the entity reference node and set + * expandEntityReferences to false. + */ + public boolean getExpandEntityReferences(); + + /** + * Returns the next node in the set and advances the position of the + * iterator in the set. After a NodeIterator is created, + * the first call to nextNode() returns the first node in + * the set. + * @return The next Node in the set being iterated over, or + * null if there are no more members in that set. + * @exception DOMException + * INVALID_STATE_ERR: Raised if this method is called after the + * detach method was invoked. + */ + public Node nextNode() + throws DOMException; + + /** + * Returns the previous node in the set and moves the position of the + * NodeIterator backwards in the set. + * @return The previous Node in the set being iterated over, + * or null if there are no more members in that set. + * @exception DOMException + * INVALID_STATE_ERR: Raised if this method is called after the + * detach method was invoked. + */ + public Node previousNode() + throws DOMException; + + /** + * Detaches the NodeIterator from the set which it iterated + * over, releasing any computational resources and placing the iterator + * in the INVALID state. After detach has been invoked, + * calls to nextNode or previousNode will + * raise the exception INVALID_STATE_ERR. + */ + public void detach(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/w3c/dom/traversal/TreeWalker.java gcc-3.1/libjava/org/w3c/dom/traversal/TreeWalker.java *** gcc-3.0.4/libjava/org/w3c/dom/traversal/TreeWalker.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/w3c/dom/traversal/TreeWalker.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,167 ---- + /* + * Copyright (c) 2000 World Wide Web Consortium, + * (Massachusetts Institute of Technology, Institut National de + * Recherche en Informatique et en Automatique, Keio University). All + * Rights Reserved. This program is distributed under the W3C's Software + * Intellectual Property License. This program is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. + * See W3C License http://www.w3.org/Consortium/Legal/ for more details. + */ + + package org.w3c.dom.traversal; + + import org.w3c.dom.Node; + import org.w3c.dom.DOMException; + + /** + * TreeWalker objects are used to navigate a document tree or + * subtree using the view of the document defined by their + * whatToShow flags and filter (if any). Any function which + * performs navigation using a TreeWalker will automatically + * support any view defined by a TreeWalker. + *

          Omitting nodes from the logical view of a subtree can result in a + * structure that is substantially different from the same subtree in the + * complete, unfiltered document. Nodes that are siblings in the + * TreeWalker view may be children of different, widely + * separated nodes in the original view. For instance, consider a + * NodeFilter that skips all nodes except for Text nodes and + * the root node of a document. In the logical view that results, all text + * nodes will be siblings and appear as direct children of the root node, no + * matter how deeply nested the structure of the original document. + *

          See also the Document Object Model (DOM) Level 2 Traversal and Range Specification. + * @since DOM Level 2 + */ + public interface TreeWalker { + /** + * The root node of the TreeWalker, as specified + * when it was created. + */ + public Node getRoot(); + + /** + * This attribute determines which node types are presented via the + * TreeWalker. The available set of constants is defined in + * the NodeFilter interface. Nodes not accepted by + * whatToShow will be skipped, but their children may still + * be considered. Note that this skip takes precedence over the filter, + * if any. + */ + public int getWhatToShow(); + + /** + * The filter used to screen nodes. + */ + public NodeFilter getFilter(); + + /** + * The value of this flag determines whether the children of entity + * reference nodes are visible to the TreeWalker. If false, + * they and their descendants will be rejected. Note that this + * rejection takes precedence over whatToShow and the + * filter, if any. + *
          To produce a view of the document that has entity references + * expanded and does not expose the entity reference node itself, use + * the whatToShow flags to hide the entity reference node + * and set expandEntityReferences to true when creating the + * TreeWalker. To produce a view of the document that has + * entity reference nodes but no entity expansion, use the + * whatToShow flags to show the entity reference node and + * set expandEntityReferences to false. + */ + public boolean getExpandEntityReferences(); + + /** + * The node at which the TreeWalker is currently positioned. + *
          Alterations to the DOM tree may cause the current node to no longer + * be accepted by the TreeWalker's associated filter. + * currentNode may also be explicitly set to any node, + * whether or not it is within the subtree specified by the + * root node or would be accepted by the filter and + * whatToShow flags. Further traversal occurs relative to + * currentNode even if it is not part of the current view, + * by applying the filters in the requested direction; if no traversal + * is possible, currentNode is not changed. + * @exception DOMException + * NOT_SUPPORTED_ERR: Raised if an attempt is made to set + * currentNode to null. + */ + public Node getCurrentNode(); + public void setCurrentNode(Node currentNode) + throws DOMException; + + /** + * Moves to and returns the closest visible ancestor node of the current + * node. If the search for parentNode attempts to step + * upward from the TreeWalker's root node, or + * if it fails to find a visible ancestor node, this method retains the + * current position and returns null. + * @return The new parent node, or null if the current node + * has no parent in the TreeWalker's logical view. + */ + public Node parentNode(); + + /** + * Moves the TreeWalker to the first visible child of the + * current node, and returns the new node. If the current node has no + * visible children, returns null, and retains the current + * node. + * @return The new node, or null if the current node has no + * visible children in the TreeWalker's logical view. + */ + public Node firstChild(); + + /** + * Moves the TreeWalker to the last visible child of the + * current node, and returns the new node. If the current node has no + * visible children, returns null, and retains the current + * node. + * @return The new node, or null if the current node has no + * children in the TreeWalker's logical view. + */ + public Node lastChild(); + + /** + * Moves the TreeWalker to the previous sibling of the + * current node, and returns the new node. If the current node has no + * visible previous sibling, returns null, and retains the + * current node. + * @return The new node, or null if the current node has no + * previous sibling. in the TreeWalker's logical view. + */ + public Node previousSibling(); + + /** + * Moves the TreeWalker to the next sibling of the current + * node, and returns the new node. If the current node has no visible + * next sibling, returns null, and retains the current node. + * @return The new node, or null if the current node has no + * next sibling. in the TreeWalker's logical view. + */ + public Node nextSibling(); + + /** + * Moves the TreeWalker to the previous visible node in + * document order relative to the current node, and returns the new + * node. If the current node has no previous node, or if the search for + * previousNode attempts to step upward from the + * TreeWalker's root node, returns + * null, and retains the current node. + * @return The new node, or null if the current node has no + * previous node in the TreeWalker's logical view. + */ + public Node previousNode(); + + /** + * Moves the TreeWalker to the next visible node in document + * order relative to the current node, and returns the new node. If the + * current node has no next node, or if the search for nextNode attempts + * to step upward from the TreeWalker's root + * node, returns null, and retains the current node. + * @return The new node, or null if the current node has no + * next node in the TreeWalker's logical view. + */ + public Node nextNode(); + + } diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/AttributeList.java gcc-3.1/libjava/org/xml/sax/AttributeList.java *** gcc-3.0.4/libjava/org/xml/sax/AttributeList.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/AttributeList.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,191 ---- + // SAX Attribute List Interface. + // No warranty; no copyright -- use this as you will. + // $Id: AttributeList.java,v 1.1 2000/10/02 02:43:16 sboag Exp $ + + package org.xml.sax; + + /** + * Interface for an element's attribute specifications. + * + *

          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This is the original SAX1 interface for reporting an element's + * attributes. Unlike the new {@link org.xml.sax.Attributes Attributes} + * interface, it does not support Namespace-related information.

          + * + *

          When an attribute list is supplied as part of a + * {@link org.xml.sax.DocumentHandler#startElement startElement} + * event, the list will return valid results only during the + * scope of the event; once the event handler returns control + * to the parser, the attribute list is invalid. To save a + * persistent copy of the attribute list, use the SAX1 + * {@link org.xml.sax.helpers.AttributeListImpl AttributeListImpl} + * helper class.

          + * + *

          An attribute list includes only attributes that have been + * specified or defaulted: #IMPLIED attributes will not be included.

          + * + *

          There are two ways for the SAX application to obtain information + * from the AttributeList. First, it can iterate through the entire + * list:

          + * + *
          +  * public void startElement (String name, AttributeList atts) {
          +  *   for (int i = 0; i < atts.getLength(); i++) {
          +  *     String name = atts.getName(i);
          +  *     String type = atts.getType(i);
          +  *     String value = atts.getValue(i);
          +  *     [...]
          +  *   }
          +  * }
          +  * 
          + * + *

          (Note that the result of getLength() will be zero if there + * are no attributes.) + * + *

          As an alternative, the application can request the value or + * type of specific attributes:

          + * + *
          +  * public void startElement (String name, AttributeList atts) {
          +  *   String identifier = atts.getValue("id");
          +  *   String label = atts.getValue("label");
          +  *   [...]
          +  * }
          +  * 
          + * + * @deprecated This interface has been replaced by the SAX2 + * {@link org.xml.sax.Attributes Attributes} + * interface, which includes Namespace support. + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.DocumentHandler#startElement startElement + * @see org.xml.sax.helpers.AttributeListImpl AttributeListImpl + */ + public interface AttributeList { + + + //////////////////////////////////////////////////////////////////// + // Iteration methods. + //////////////////////////////////////////////////////////////////// + + + /** + * Return the number of attributes in this list. + * + *

          The SAX parser may provide attributes in any + * arbitrary order, regardless of the order in which they were + * declared or specified. The number of attributes may be + * zero.

          + * + * @return The number of attributes in the list. + */ + public abstract int getLength (); + + + /** + * Return the name of an attribute in this list (by position). + * + *

          The names must be unique: the SAX parser shall not include the + * same attribute twice. Attributes without values (those declared + * #IMPLIED without a value specified in the start tag) will be + * omitted from the list.

          + * + *

          If the attribute name has a namespace prefix, the prefix + * will still be attached.

          + * + * @param i The index of the attribute in the list (starting at 0). + * @return The name of the indexed attribute, or null + * if the index is out of range. + * @see #getLength + */ + public abstract String getName (int i); + + + /** + * Return the type of an attribute in the list (by position). + * + *

          The attribute type is one of the strings "CDATA", "ID", + * "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES", + * or "NOTATION" (always in upper case).

          + * + *

          If the parser has not read a declaration for the attribute, + * or if the parser does not report attribute types, then it must + * return the value "CDATA" as stated in the XML 1.0 Recommentation + * (clause 3.3.3, "Attribute-Value Normalization").

          + * + *

          For an enumerated attribute that is not a notation, the + * parser will report the type as "NMTOKEN".

          + * + * @param i The index of the attribute in the list (starting at 0). + * @return The attribute type as a string, or + * null if the index is out of range. + * @see #getLength + * @see #getType(java.lang.String) + */ + public abstract String getType (int i); + + + /** + * Return the value of an attribute in the list (by position). + * + *

          If the attribute value is a list of tokens (IDREFS, + * ENTITIES, or NMTOKENS), the tokens will be concatenated + * into a single string separated by whitespace.

          + * + * @param i The index of the attribute in the list (starting at 0). + * @return The attribute value as a string, or + * null if the index is out of range. + * @see #getLength + * @see #getValue(java.lang.String) + */ + public abstract String getValue (int i); + + + + //////////////////////////////////////////////////////////////////// + // Lookup methods. + //////////////////////////////////////////////////////////////////// + + + /** + * Return the type of an attribute in the list (by name). + * + *

          The return value is the same as the return value for + * getType(int).

          + * + *

          If the attribute name has a namespace prefix in the document, + * the application must include the prefix here.

          + * + * @param name The name of the attribute. + * @return The attribute type as a string, or null if no + * such attribute exists. + * @see #getType(int) + */ + public abstract String getType (String name); + + + /** + * Return the value of an attribute in the list (by name). + * + *

          The return value is the same as the return value for + * getValue(int).

          + * + *

          If the attribute name has a namespace prefix in the document, + * the application must include the prefix here.

          + * + * @param i The index of the attribute in the list. + * @return The attribute value as a string, or null if + * no such attribute exists. + * @see #getValue(int) + */ + public abstract String getValue (String name); + + } + + // end of AttributeList.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/Attributes.java gcc-3.1/libjava/org/xml/sax/Attributes.java *** gcc-3.0.4/libjava/org/xml/sax/Attributes.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/Attributes.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,243 ---- + // Attributes.java - attribute list with Namespace support + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the public domain. + + // $Id: Attributes.java,v 1.1 2000/10/02 02:43:16 sboag Exp $ + + + package org.xml.sax; + + + /** + * Interface for a list of XML attributes. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This interface allows access to a list of attributes in + * three different ways:

          + * + *
            + *
          1. by attribute index;
          2. + *
          3. by Namespace-qualified name; or
          4. + *
          5. by qualified (prefixed) name.
          6. + *
          + * + *

          The list will not contain attributes that were declared + * #IMPLIED but not specified in the start tag. It will also not + * contain attributes used as Namespace declarations (xmlns*) unless + * the http://xml.org/sax/features/namespace-prefixes + * feature is set to true (it is false by + * default).

          + * + *

          If the namespace-prefixes feature (see above) is false, + * access by qualified name may not be available; if the + * http://xml.org/sax/features/namespaces + * feature is false, access by Namespace-qualified names + * may not be available.

          + * + *

          This interface replaces the now-deprecated SAX1 {@link + * org.xml.sax.AttributeList AttributeList} interface, which does not + * contain Namespace support. In addition to Namespace support, it + * adds the getIndex methods (below).

          + * + *

          The order of attributes in the list is unspecified, and will + * vary from implementation to implementation.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.helpers.AttributeListImpl + */ + public interface Attributes + { + + + //////////////////////////////////////////////////////////////////// + // Indexed access. + //////////////////////////////////////////////////////////////////// + + + /** + * Return the number of attributes in the list. + * + *

          Once you know the number of attributes, you can iterate + * through the list.

          + * + * @return The number of attributes in the list. + * @see #getURI(int) + * @see #getLocalName(int) + * @see #getQName(int) + * @see #getType(int) + * @see #getValue(int) + */ + public abstract int getLength (); + + + /** + * Look up an attribute's Namespace URI by index. + * + * @param index The attribute index (zero-based). + * @return The Namespace URI, or the empty string if none + * is available, or null if the index is out of + * range. + * @see #getLength + */ + public abstract String getURI (int index); + + + /** + * Look up an attribute's local name by index. + * + * @param index The attribute index (zero-based). + * @return The local name, or the empty string if Namespace + * processing is not being performed, or null + * if the index is out of range. + * @see #getLength + */ + public abstract String getLocalName (int index); + + + /** + * Look up an attribute's XML 1.0 qualified name by index. + * + * @param index The attribute index (zero-based). + * @return The XML 1.0 qualified name, or the empty string + * if none is available, or null if the index + * is out of range. + * @see #getLength + */ + public abstract String getQName (int index); + + + /** + * Look up an attribute's type by index. + * + *

          The attribute type is one of the strings "CDATA", "ID", + * "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES", + * or "NOTATION" (always in upper case).

          + * + *

          If the parser has not read a declaration for the attribute, + * or if the parser does not report attribute types, then it must + * return the value "CDATA" as stated in the XML 1.0 Recommentation + * (clause 3.3.3, "Attribute-Value Normalization").

          + * + *

          For an enumerated attribute that is not a notation, the + * parser will report the type as "NMTOKEN".

          + * + * @param index The attribute index (zero-based). + * @return The attribute's type as a string, or null if the + * index is out of range. + * @see #getLength + */ + public abstract String getType (int index); + + + /** + * Look up an attribute's value by index. + * + *

          If the attribute value is a list of tokens (IDREFS, + * ENTITIES, or NMTOKENS), the tokens will be concatenated + * into a single string with each token separated by a + * single space.

          + * + * @param index The attribute index (zero-based). + * @return The attribute's value as a string, or null if the + * index is out of range. + * @see #getLength + */ + public abstract String getValue (int index); + + + + //////////////////////////////////////////////////////////////////// + // Name-based query. + //////////////////////////////////////////////////////////////////// + + + /** + * Look up the index of an attribute by Namespace name. + * + * @param uri The Namespace URI, or the empty string if + * the name has no Namespace URI. + * @param localName The attribute's local name. + * @return The index of the attribute, or -1 if it does not + * appear in the list. + */ + public int getIndex (String uri, String localPart); + + + /** + * Look up the index of an attribute by XML 1.0 qualified name. + * + * @param qName The qualified (prefixed) name. + * @return The index of the attribute, or -1 if it does not + * appear in the list. + */ + public int getIndex (String qName); + + + /** + * Look up an attribute's type by Namespace name. + * + *

          See {@link #getType(int) getType(int)} for a description + * of the possible types.

          + * + * @param uri The Namespace URI, or the empty String if the + * name has no Namespace URI. + * @param localName The local name of the attribute. + * @return The attribute type as a string, or null if the + * attribute is not in the list or if Namespace + * processing is not being performed. + */ + public abstract String getType (String uri, String localName); + + + /** + * Look up an attribute's type by XML 1.0 qualified name. + * + *

          See {@link #getType(int) getType(int)} for a description + * of the possible types.

          + * + * @param qName The XML 1.0 qualified name. + * @return The attribute type as a string, or null if the + * attribute is not in the list or if qualified names + * are not available. + */ + public abstract String getType (String qName); + + + /** + * Look up an attribute's value by Namespace name. + * + *

          See {@link #getValue(int) getValue(int)} for a description + * of the possible values.

          + * + * @param uri The Namespace URI, or the empty String if the + * name has no Namespace URI. + * @param localName The local name of the attribute. + * @return The attribute value as a string, or null if the + * attribute is not in the list. + */ + public abstract String getValue (String uri, String localName); + + + /** + * Look up an attribute's value by XML 1.0 qualified name. + * + *

          See {@link #getValue(int) getValue(int)} for a description + * of the possible values.

          + * + * @param qName The XML 1.0 qualified name. + * @return The attribute value as a string, or null if the + * attribute is not in the list or if qualified names + * are not available. + */ + public abstract String getValue (String qName); + + } + + // end of Attributes.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/ContentHandler.java gcc-3.1/libjava/org/xml/sax/ContentHandler.java *** gcc-3.0.4/libjava/org/xml/sax/ContentHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/ContentHandler.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,374 ---- + // ContentHandler.java - handle main document content. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the public domain. + + // $Id: ContentHandler.java,v 1.1 2000/10/02 02:43:16 sboag Exp $ + + package org.xml.sax; + + + /** + * Receive notification of the logical content of a document. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This is the main interface that most SAX applications + * implement: if the application needs to be informed of basic parsing + * events, it implements this interface and registers an instance with + * the SAX parser using the {@link org.xml.sax.XMLReader#setContentHandler + * setContentHandler} method. The parser uses the instance to report + * basic document-related events like the start and end of elements + * and character data.

          + * + *

          The order of events in this interface is very important, and + * mirrors the order of information in the document itself. For + * example, all of an element's content (character data, processing + * instructions, and/or subelements) will appear, in order, between + * the startElement event and the corresponding endElement event.

          + * + *

          This interface is similar to the now-deprecated SAX 1.0 + * DocumentHandler interface, but it adds support for Namespaces + * and for reporting skipped entities (in non-validating XML + * processors).

          + * + *

          Implementors should note that there is also a Java class + * {@link java.net.ContentHandler ContentHandler} in the java.net + * package; that means that it's probably a bad idea to do

          + * + *
          + * import java.net.*; + * import org.xml.sax.*; + *
          + * + *

          In fact, "import ...*" is usually a sign of sloppy programming + * anyway, so the user should consider this a feature rather than a + * bug.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.XMLReader + * @see org.xml.sax.DTDHandler + * @see org.xml.sax.ErrorHandler + */ + public interface ContentHandler + { + + /** + * Receive an object for locating the origin of SAX document events. + * + *

          SAX parsers are strongly encouraged (though not absolutely + * required) to supply a locator: if it does so, it must supply + * the locator to the application by invoking this method before + * invoking any of the other methods in the ContentHandler + * interface.

          + * + *

          The locator allows the application to determine the end + * position of any document-related event, even if the parser is + * not reporting an error. Typically, the application will + * use this information for reporting its own errors (such as + * character content that does not match an application's + * business rules). The information returned by the locator + * is probably not sufficient for use with a search engine.

          + * + *

          Note that the locator will return correct information only + * during the invocation of the events in this interface. The + * application should not attempt to use it at any other time.

          + * + * @param locator An object that can return the location of + * any SAX document event. + * @see org.xml.sax.Locator + */ + public void setDocumentLocator (Locator locator); + + + /** + * Receive notification of the beginning of a document. + * + *

          The SAX parser will invoke this method only once, before any + * other methods in this interface or in {@link org.xml.sax.DTDHandler + * DTDHandler} (except for {@link #setDocumentLocator + * setDocumentLocator}).

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #endDocument + */ + public void startDocument () + throws SAXException; + + + /** + * Receive notification of the end of a document. + * + *

          The SAX parser will invoke this method only once, and it will + * be the last method invoked during the parse. The parser shall + * not invoke this method until it has either abandoned parsing + * (because of an unrecoverable error) or reached the end of + * input.

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #startDocument + */ + public void endDocument() + throws SAXException; + + + /** + * Begin the scope of a prefix-URI Namespace mapping. + * + *

          The information from this event is not necessary for + * normal Namespace processing: the SAX XML reader will + * automatically replace prefixes for element and attribute + * names when the http://xml.org/sax/features/namespaces + * feature is true (the default).

          + * + *

          There are cases, however, when applications need to + * use prefixes in character data or in attribute values, + * where they cannot safely be expanded automatically; the + * start/endPrefixMapping event supplies the information + * to the application to expand prefixes in those contexts + * itself, if necessary.

          + * + *

          Note that start/endPrefixMapping events are not + * guaranteed to be properly nested relative to each-other: + * all startPrefixMapping events will occur before the + * corresponding {@link #startElement startElement} event, + * and all {@link #endPrefixMapping endPrefixMapping} + * events will occur after the corresponding {@link #endElement + * endElement} event, but their order is not otherwise + * guaranteed.

          + * + *

          There should never be start/endPrefixMapping events for the + * "xml" prefix, since it is predeclared and immutable.

          + * + * @param prefix The Namespace prefix being declared. + * @param uri The Namespace URI the prefix is mapped to. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see #endPrefixMapping + * @see #startElement + */ + public void startPrefixMapping (String prefix, String uri) + throws SAXException; + + + /** + * End the scope of a prefix-URI mapping. + * + *

          See {@link #startPrefixMapping startPrefixMapping} for + * details. This event will always occur after the corresponding + * {@link #endElement endElement} event, but the order of + * {@link #endPrefixMapping endPrefixMapping} events is not otherwise + * guaranteed.

          + * + * @param prefix The prefix that was being mapping. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see #startPrefixMapping + * @see #endElement + */ + public void endPrefixMapping (String prefix) + throws SAXException; + + + /** + * Receive notification of the beginning of an element. + * + *

          The Parser will invoke this method at the beginning of every + * element in the XML document; there will be a corresponding + * {@link #endElement endElement} event for every startElement event + * (even when the element is empty). All of the element's content will be + * reported, in order, before the corresponding endElement + * event.

          + * + *

          This event allows up to three name components for each + * element:

          + * + *
            + *
          1. the Namespace URI;
          2. + *
          3. the local name; and
          4. + *
          5. the qualified (prefixed) name.
          6. + *
          + * + *

          Any or all of these may be provided, depending on the + * values of the http://xml.org/sax/features/namespaces + * and the http://xml.org/sax/features/namespace-prefixes + * properties:

          + * + *
            + *
          • the Namespace URI and local name are required when + * the namespaces property is true (the default), and are + * optional when the namespaces property is false (if one is + * specified, both must be);
          • + *
          • the qualified name is required when the namespace-prefixes property + * is true, and is optional when the namespace-prefixes property + * is false (the default).
          • + *
          + * + *

          Note that the attribute list provided will contain only + * attributes with explicit values (specified or defaulted): + * #IMPLIED attributes will be omitted. The attribute list + * will contain attributes used for Namespace declarations + * (xmlns* attributes) only if the + * http://xml.org/sax/features/namespace-prefixes + * property is true (it is false by default, and support for a + * true value is optional).

          + * + * @param uri The Namespace URI, or the empty string if the + * element has no Namespace URI or if Namespace + * processing is not being performed. + * @param localName The local name (without prefix), or the + * empty string if Namespace processing is not being + * performed. + * @param qName The qualified name (with prefix), or the + * empty string if qualified names are not available. + * @param atts The attributes attached to the element. If + * there are no attributes, it shall be an empty + * Attributes object. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #endElement + * @see org.xml.sax.Attributes + */ + public void startElement (String namespaceURI, String localName, + String qName, Attributes atts) + throws SAXException; + + + /** + * Receive notification of the end of an element. + * + *

          The SAX parser will invoke this method at the end of every + * element in the XML document; there will be a corresponding + * {@link #startElement startElement} event for every endElement + * event (even when the element is empty).

          + * + *

          For information on the names, see startElement.

          + * + * @param uri The Namespace URI, or the empty string if the + * element has no Namespace URI or if Namespace + * processing is not being performed. + * @param localName The local name (without prefix), or the + * empty string if Namespace processing is not being + * performed. + * @param qName The qualified XML 1.0 name (with prefix), or the + * empty string if qualified names are not available. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + */ + public void endElement (String namespaceURI, String localName, + String qName) + throws SAXException; + + + /** + * Receive notification of character data. + * + *

          The Parser will call this method to report each chunk of + * character data. SAX parsers may return all contiguous character + * data in a single chunk, or they may split it into several + * chunks; however, all of the characters in any single event + * must come from the same external entity so that the Locator + * provides useful information.

          + * + *

          The application must not attempt to read from the array + * outside of the specified range.

          + * + *

          Note that some parsers will report whitespace in element + * content using the {@link #ignorableWhitespace ignorableWhitespace} + * method rather than this one (validating parsers must + * do so).

          + * + * @param ch The characters from the XML document. + * @param start The start position in the array. + * @param length The number of characters to read from the array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #ignorableWhitespace + * @see org.xml.sax.Locator + */ + public void characters (char ch[], int start, int length) + throws SAXException; + + + /** + * Receive notification of ignorable whitespace in element content. + * + *

          Validating Parsers must use this method to report each chunk + * of whitespace in element content (see the W3C XML 1.0 recommendation, + * section 2.10): non-validating parsers may also use this method + * if they are capable of parsing and using content models.

          + * + *

          SAX parsers may return all contiguous whitespace in a single + * chunk, or they may split it into several chunks; however, all of + * the characters in any single event must come from the same + * external entity, so that the Locator provides useful + * information.

          + * + *

          The application must not attempt to read from the array + * outside of the specified range.

          + * + * @param ch The characters from the XML document. + * @param start The start position in the array. + * @param length The number of characters to read from the array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #characters + */ + public void ignorableWhitespace (char ch[], int start, int length) + throws SAXException; + + + /** + * Receive notification of a processing instruction. + * + *

          The Parser will invoke this method once for each processing + * instruction found: note that processing instructions may occur + * before or after the main document element.

          + * + *

          A SAX parser must never report an XML declaration (XML 1.0, + * section 2.8) or a text declaration (XML 1.0, section 4.3.1) + * using this method.

          + * + * @param target The processing instruction target. + * @param data The processing instruction data, or null if + * none was supplied. The data does not include any + * whitespace separating it from the target. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + */ + public void processingInstruction (String target, String data) + throws SAXException; + + + /** + * Receive notification of a skipped entity. + * + *

          The Parser will invoke this method once for each entity + * skipped. Non-validating processors may skip entities if they + * have not seen the declarations (because, for example, the + * entity was declared in an external DTD subset). All processors + * may skip external entities, depending on the values of the + * http://xml.org/sax/features/external-general-entities + * and the + * http://xml.org/sax/features/external-parameter-entities + * properties.

          + * + * @param name The name of the skipped entity. If it is a + * parameter entity, the name will begin with '%', and if + * it is the external DTD subset, it will be the string + * "[dtd]". + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + */ + public void skippedEntity (String name) + throws SAXException; + } + + // end of ContentHandler.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/DTDHandler.java gcc-3.1/libjava/org/xml/sax/DTDHandler.java *** gcc-3.0.4/libjava/org/xml/sax/DTDHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/DTDHandler.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,108 ---- + // SAX DTD handler. + // No warranty; no copyright -- use this as you will. + // $Id: DTDHandler.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + /** + * Receive notification of basic DTD-related events. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          If a SAX application needs information about notations and + * unparsed entities, then the application implements this + * interface and registers an instance with the SAX parser using + * the parser's setDTDHandler method. The parser uses the + * instance to report notation and unparsed entity declarations to + * the application.

          + * + *

          Note that this interface includes only those DTD events that + * the XML recommendation requires processors to report: + * notation and unparsed entity declarations.

          + * + *

          The SAX parser may report these events in any order, regardless + * of the order in which the notations and unparsed entities were + * declared; however, all DTD events must be reported after the + * document handler's startDocument event, and before the first + * startElement event.

          + * + *

          It is up to the application to store the information for + * future use (perhaps in a hash table or object tree). + * If the application encounters attributes of type "NOTATION", + * "ENTITY", or "ENTITIES", it can use the information that it + * obtained through this interface to find the entity and/or + * notation corresponding with the attribute value.

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Parser#setDTDHandler + * @see org.xml.sax.HandlerBase + */ + public interface DTDHandler { + + + /** + * Receive notification of a notation declaration event. + * + *

          It is up to the application to record the notation for later + * reference, if necessary.

          + * + *

          At least one of publicId and systemId must be non-null. + * If a system identifier is present, and it is a URL, the SAX + * parser must resolve it fully before passing it to the + * application through this event.

          + * + *

          There is no guarantee that the notation declaration will be + * reported before any unparsed entities that use it.

          + * + * @param name The notation name. + * @param publicId The notation's public identifier, or null if + * none was given. + * @param systemId The notation's system identifier, or null if + * none was given. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #unparsedEntityDecl + * @see org.xml.sax.AttributeList + */ + public abstract void notationDecl (String name, + String publicId, + String systemId) + throws SAXException; + + + /** + * Receive notification of an unparsed entity declaration event. + * + *

          Note that the notation name corresponds to a notation + * reported by the {@link #notationDecl notationDecl} event. + * It is up to the application to record the entity for later + * reference, if necessary.

          + * + *

          If the system identifier is a URL, the parser must resolve it + * fully before passing it to the application.

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @param name The unparsed entity's name. + * @param publicId The entity's public identifier, or null if none + * was given. + * @param systemId The entity's system identifier. + * @param notation name The name of the associated notation. + * @see #notationDecl + * @see org.xml.sax.AttributeList + */ + public abstract void unparsedEntityDecl (String name, + String publicId, + String systemId, + String notationName) + throws SAXException; + + } + + // end of DTDHandler.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/DocumentHandler.java gcc-3.1/libjava/org/xml/sax/DocumentHandler.java *** gcc-3.0.4/libjava/org/xml/sax/DocumentHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/DocumentHandler.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,230 ---- + // SAX document handler. + // No warranty; no copyright -- use this as you will. + // $Id: DocumentHandler.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + /** + * Receive notification of general document events. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This was the main event-handling interface for SAX1; in + * SAX2, it has been replaced by {@link org.xml.sax.ContentHandler + * ContentHandler}, which provides Namespace support and reporting + * of skipped entities. This interface is included in SAX2 only + * to support legacy SAX1 applications.

          + * + *

          The order of events in this interface is very important, and + * mirrors the order of information in the document itself. For + * example, all of an element's content (character data, processing + * instructions, and/or subelements) will appear, in order, between + * the startElement event and the corresponding endElement event.

          + * + *

          Application writers who do not want to implement the entire + * interface can derive a class from HandlerBase, which implements + * the default functionality; parser writers can instantiate + * HandlerBase to obtain a default handler. The application can find + * the location of any document event using the Locator interface + * supplied by the Parser through the setDocumentLocator method.

          + * + * @deprecated This interface has been replaced by the SAX2 + * {@link org.xml.sax.ContentHandler ContentHandler} + * interface, which includes Namespace support. + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Parser#setDocumentHandler + * @see org.xml.sax.Locator + * @see org.xml.sax.HandlerBase + */ + public interface DocumentHandler { + + + /** + * Receive an object for locating the origin of SAX document events. + * + *

          SAX parsers are strongly encouraged (though not absolutely + * required) to supply a locator: if it does so, it must supply + * the locator to the application by invoking this method before + * invoking any of the other methods in the DocumentHandler + * interface.

          + * + *

          The locator allows the application to determine the end + * position of any document-related event, even if the parser is + * not reporting an error. Typically, the application will + * use this information for reporting its own errors (such as + * character content that does not match an application's + * business rules). The information returned by the locator + * is probably not sufficient for use with a search engine.

          + * + *

          Note that the locator will return correct information only + * during the invocation of the events in this interface. The + * application should not attempt to use it at any other time.

          + * + * @param locator An object that can return the location of + * any SAX document event. + * @see org.xml.sax.Locator + */ + public abstract void setDocumentLocator (Locator locator); + + + /** + * Receive notification of the beginning of a document. + * + *

          The SAX parser will invoke this method only once, before any + * other methods in this interface or in DTDHandler (except for + * setDocumentLocator).

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + */ + public abstract void startDocument () + throws SAXException; + + + /** + * Receive notification of the end of a document. + * + *

          The SAX parser will invoke this method only once, and it will + * be the last method invoked during the parse. The parser shall + * not invoke this method until it has either abandoned parsing + * (because of an unrecoverable error) or reached the end of + * input.

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + */ + public abstract void endDocument () + throws SAXException; + + + /** + * Receive notification of the beginning of an element. + * + *

          The Parser will invoke this method at the beginning of every + * element in the XML document; there will be a corresponding + * endElement() event for every startElement() event (even when the + * element is empty). All of the element's content will be + * reported, in order, before the corresponding endElement() + * event.

          + * + *

          If the element name has a namespace prefix, the prefix will + * still be attached. Note that the attribute list provided will + * contain only attributes with explicit values (specified or + * defaulted): #IMPLIED attributes will be omitted.

          + * + * @param name The element type name. + * @param atts The attributes attached to the element, if any. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #endElement + * @see org.xml.sax.AttributeList + */ + public abstract void startElement (String name, AttributeList atts) + throws SAXException; + + + /** + * Receive notification of the end of an element. + * + *

          The SAX parser will invoke this method at the end of every + * element in the XML document; there will be a corresponding + * startElement() event for every endElement() event (even when the + * element is empty).

          + * + *

          If the element name has a namespace prefix, the prefix will + * still be attached to the name.

          + * + * @param name The element type name + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + */ + public abstract void endElement (String name) + throws SAXException; + + + /** + * Receive notification of character data. + * + *

          The Parser will call this method to report each chunk of + * character data. SAX parsers may return all contiguous character + * data in a single chunk, or they may split it into several + * chunks; however, all of the characters in any single event + * must come from the same external entity, so that the Locator + * provides useful information.

          + * + *

          The application must not attempt to read from the array + * outside of the specified range.

          + * + *

          Note that some parsers will report whitespace using the + * ignorableWhitespace() method rather than this one (validating + * parsers must do so).

          + * + * @param ch The characters from the XML document. + * @param start The start position in the array. + * @param length The number of characters to read from the array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #ignorableWhitespace + * @see org.xml.sax.Locator + */ + public abstract void characters (char ch[], int start, int length) + throws SAXException; + + + /** + * Receive notification of ignorable whitespace in element content. + * + *

          Validating Parsers must use this method to report each chunk + * of ignorable whitespace (see the W3C XML 1.0 recommendation, + * section 2.10): non-validating parsers may also use this method + * if they are capable of parsing and using content models.

          + * + *

          SAX parsers may return all contiguous whitespace in a single + * chunk, or they may split it into several chunks; however, all of + * the characters in any single event must come from the same + * external entity, so that the Locator provides useful + * information.

          + * + *

          The application must not attempt to read from the array + * outside of the specified range.

          + * + * @param ch The characters from the XML document. + * @param start The start position in the array. + * @param length The number of characters to read from the array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see #characters + */ + public abstract void ignorableWhitespace (char ch[], int start, int length) + throws SAXException; + + + /** + * Receive notification of a processing instruction. + * + *

          The Parser will invoke this method once for each processing + * instruction found: note that processing instructions may occur + * before or after the main document element.

          + * + *

          A SAX parser should never report an XML declaration (XML 1.0, + * section 2.8) or a text declaration (XML 1.0, section 4.3.1) + * using this method.

          + * + * @param target The processing instruction target. + * @param data The processing instruction data, or null if + * none was supplied. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + */ + public abstract void processingInstruction (String target, String data) + throws SAXException; + + } + + // end of DocumentHandler.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/EntityResolver.java gcc-3.1/libjava/org/xml/sax/EntityResolver.java *** gcc-3.0.4/libjava/org/xml/sax/EntityResolver.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/EntityResolver.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,110 ---- + // SAX entity resolver. + // No warranty; no copyright -- use this as you will. + // $Id: EntityResolver.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + import java.io.IOException; + + + /** + * Basic interface for resolving entities. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          If a SAX application needs to implement customized handling + * for external entities, it must implement this interface and + * register an instance with the SAX driver using the + * {@link org.xml.sax.XMLReader#setEntityResolver setEntityResolver} + * method.

          + * + *

          The XML reader will then allow the application to intercept any + * external entities (including the external DTD subset and external + * parameter entities, if any) before including them.

          + * + *

          Many SAX applications will not need to implement this interface, + * but it will be especially useful for applications that build + * XML documents from databases or other specialised input sources, + * or for applications that use URI types other than URLs.

          + * + *

          The following resolver would provide the application + * with a special character stream for the entity with the system + * identifier "http://www.myhost.com/today":

          + * + *
          +  * import org.xml.sax.EntityResolver;
          +  * import org.xml.sax.InputSource;
          +  *
          +  * public class MyResolver implements EntityResolver {
          +  *   public InputSource resolveEntity (String publicId, String systemId)
          +  *   {
          +  *     if (systemId.equals("http://www.myhost.com/today")) {
          +  *              // return a special input source
          +  *       MyReader reader = new MyReader();
          +  *       return new InputSource(reader);
          +  *     } else {
          +  *              // use the default behaviour
          +  *       return null;
          +  *     }
          +  *   }
          +  * }
          +  * 
          + * + *

          The application can also use this interface to redirect system + * identifiers to local URIs or to look up replacements in a catalog + * (possibly by using the public identifier).

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Parser#setEntityResolver + * @see org.xml.sax.InputSource + */ + public interface EntityResolver { + + + /** + * Allow the application to resolve external entities. + * + *

          The Parser will call this method before opening any external + * entity except the top-level document entity (including the + * external DTD subset, external entities referenced within the + * DTD, and external entities referenced within the document + * element): the application may request that the parser resolve + * the entity itself, that it use an alternative URI, or that it + * use an entirely different input source.

          + * + *

          Application writers can use this method to redirect external + * system identifiers to secure and/or local URIs, to look up + * public identifiers in a catalogue, or to read an entity from a + * database or other input source (including, for example, a dialog + * box).

          + * + *

          If the system identifier is a URL, the SAX parser must + * resolve it fully before reporting it to the application.

          + * + * @param publicId The public identifier of the external entity + * being referenced, or null if none was supplied. + * @param systemId The system identifier of the external entity + * being referenced. + * @return An InputSource object describing the new input source, + * or null to request that the parser open a regular + * URI connection to the system identifier. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @exception java.io.IOException A Java-specific IO exception, + * possibly the result of creating a new InputStream + * or Reader for the InputSource. + * @see org.xml.sax.InputSource + */ + public abstract InputSource resolveEntity (String publicId, + String systemId) + throws SAXException, IOException; + + } + + // end of EntityResolver.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/ErrorHandler.java gcc-3.1/libjava/org/xml/sax/ErrorHandler.java *** gcc-3.0.4/libjava/org/xml/sax/ErrorHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/ErrorHandler.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,123 ---- + // SAX error handler. + // No warranty; no copyright -- use this as you will. + // $Id: ErrorHandler.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + + /** + * Basic interface for SAX error handlers. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          If a SAX application needs to implement customized error + * handling, it must implement this interface and then register an + * instance with the XML reader using the + * {@link org.xml.sax.XMLReader#setErrorHandler setErrorHandler} + * method. The parser will then report all errors and warnings + * through this interface.

          + * + *

          WARNING: If an application does not + * register an ErrorHandler, XML parsing errors will go unreported + * and bizarre behaviour may result.

          + * + *

          For XML processing errors, a SAX driver must use this interface + * instead of throwing an exception: it is up to the application + * to decide whether to throw an exception for different types of + * errors and warnings. Note, however, that there is no requirement that + * the parser continue to provide useful information after a call to + * {@link #fatalError fatalError} (in other words, a SAX driver class + * could catch an exception and report a fatalError).

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Parser#setErrorHandler + * @see org.xml.sax.SAXParseException + */ + public interface ErrorHandler { + + + /** + * Receive notification of a warning. + * + *

          SAX parsers will use this method to report conditions that + * are not errors or fatal errors as defined by the XML 1.0 + * recommendation. The default behaviour is to take no action.

          + * + *

          The SAX parser must continue to provide normal parsing events + * after invoking this method: it should still be possible for the + * application to process the document through to the end.

          + * + *

          Filters may use this method to report other, non-XML warnings + * as well.

          + * + * @param exception The warning information encapsulated in a + * SAX parse exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.SAXParseException + */ + public abstract void warning (SAXParseException exception) + throws SAXException; + + + /** + * Receive notification of a recoverable error. + * + *

          This corresponds to the definition of "error" in section 1.2 + * of the W3C XML 1.0 Recommendation. For example, a validating + * parser would use this callback to report the violation of a + * validity constraint. The default behaviour is to take no + * action.

          + * + *

          The SAX parser must continue to provide normal parsing events + * after invoking this method: it should still be possible for the + * application to process the document through to the end. If the + * application cannot do so, then the parser should report a fatal + * error even if the XML 1.0 recommendation does not require it to + * do so.

          + * + *

          Filters may use this method to report other, non-XML errors + * as well.

          + * + * @param exception The error information encapsulated in a + * SAX parse exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.SAXParseException + */ + public abstract void error (SAXParseException exception) + throws SAXException; + + + /** + * Receive notification of a non-recoverable error. + * + *

          This corresponds to the definition of "fatal error" in + * section 1.2 of the W3C XML 1.0 Recommendation. For example, a + * parser would use this callback to report the violation of a + * well-formedness constraint.

          + * + *

          The application must assume that the document is unusable + * after the parser has invoked this method, and should continue + * (if at all) only for the sake of collecting addition error + * messages: in fact, SAX parsers are free to stop reporting any + * other events once this method has been invoked.

          + * + * @param exception The error information encapsulated in a + * SAX parse exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.SAXParseException + */ + public abstract void fatalError (SAXParseException exception) + throws SAXException; + + } + + // end of ErrorHandler.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/HandlerBase.java gcc-3.1/libjava/org/xml/sax/HandlerBase.java *** gcc-3.0.4/libjava/org/xml/sax/HandlerBase.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/HandlerBase.java Wed Oct 31 00:48:17 2001 *************** *** 0 **** --- 1,368 ---- + // SAX default handler base class. + // No warranty; no copyright -- use this as you will. + // $Id: HandlerBase.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + /** + * Default base class for handlers. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class implements the default behaviour for four SAX1 + * interfaces: EntityResolver, DTDHandler, DocumentHandler, + * and ErrorHandler. It is now obsolete, but is included in SAX2 to + * support legacy SAX1 applications. SAX2 applications should use + * the {@link org.xml.sax.helpers.DefaultHandler DefaultHandler} + * class instead.

          + * + *

          Application writers can extend this class when they need to + * implement only part of an interface; parser writers can + * instantiate this class to provide default handlers when the + * application has not supplied its own.

          + * + *

          Note that the use of this class is optional.

          + * + * @deprecated This class works with the deprecated + * {@link org.xml.sax.DocumentHandler DocumentHandler} + * interface. It has been replaced by the SAX2 + * {@link org.xml.sax.helpers.DefaultHandler DefaultHandler} + * class. + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.EntityResolver + * @see org.xml.sax.DTDHandler + * @see org.xml.sax.DocumentHandler + * @see org.xml.sax.ErrorHandler + */ + public class HandlerBase + implements EntityResolver, DTDHandler, DocumentHandler, ErrorHandler + { + + + //////////////////////////////////////////////////////////////////// + // Default implementation of the EntityResolver interface. + //////////////////////////////////////////////////////////////////// + + /** + * Resolve an external entity. + * + *

          Always return null, so that the parser will use the system + * identifier provided in the XML document. This method implements + * the SAX default behaviour: application writers can override it + * in a subclass to do special translations such as catalog lookups + * or URI redirection.

          + * + * @param publicId The public identifier, or null if none is + * available. + * @param systemId The system identifier provided in the XML + * document. + * @return The new input source, or null to require the + * default behaviour. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.EntityResolver#resolveEntity + */ + public InputSource resolveEntity (String publicId, String systemId) + throws SAXException + { + return null; + } + + + + //////////////////////////////////////////////////////////////////// + // Default implementation of DTDHandler interface. + //////////////////////////////////////////////////////////////////// + + + /** + * Receive notification of a notation declaration. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass if they wish to keep track of the notations + * declared in a document.

          + * + * @param name The notation name. + * @param publicId The notation public identifier, or null if not + * available. + * @param systemId The notation system identifier. + * @see org.xml.sax.DTDHandler#notationDecl + */ + public void notationDecl (String name, String publicId, String systemId) + { + // no op + } + + + /** + * Receive notification of an unparsed entity declaration. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to keep track of the unparsed entities + * declared in a document.

          + * + * @param name The entity name. + * @param publicId The entity public identifier, or null if not + * available. + * @param systemId The entity system identifier. + * @param notationName The name of the associated notation. + * @see org.xml.sax.DTDHandler#unparsedEntityDecl + */ + public void unparsedEntityDecl (String name, String publicId, + String systemId, String notationName) + { + // no op + } + + + + //////////////////////////////////////////////////////////////////// + // Default implementation of DocumentHandler interface. + //////////////////////////////////////////////////////////////////// + + + /** + * Receive a Locator object for document events. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass if they wish to store the locator for use + * with other document events.

          + * + * @param locator A locator for all SAX document events. + * @see org.xml.sax.DocumentHandler#setDocumentLocator + * @see org.xml.sax.Locator + */ + public void setDocumentLocator (Locator locator) + { + // no op + } + + + /** + * Receive notification of the beginning of the document. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the beginning + * of a document (such as allocating the root node of a tree or + * creating an output file).

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DocumentHandler#startDocument + */ + public void startDocument () + throws SAXException + { + // no op + } + + + /** + * Receive notification of the end of the document. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the beginning + * of a document (such as finalising a tree or closing an output + * file).

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DocumentHandler#endDocument + */ + public void endDocument () + throws SAXException + { + // no op + } + + + /** + * Receive notification of the start of an element. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the start of + * each element (such as allocating a new tree node or writing + * output to a file).

          + * + * @param name The element type name. + * @param attributes The specified or defaulted attributes. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DocumentHandler#startElement + */ + public void startElement (String name, AttributeList attributes) + throws SAXException + { + // no op + } + + + /** + * Receive notification of the end of an element. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the end of + * each element (such as finalising a tree node or writing + * output to a file).

          + * + * @param name The element type name. + * @param attributes The specified or defaulted attributes. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DocumentHandler#endElement + */ + public void endElement (String name) + throws SAXException + { + // no op + } + + + /** + * Receive notification of character data inside an element. + * + *

          By default, do nothing. Application writers may override this + * method to take specific actions for each chunk of character data + * (such as adding the data to a node or buffer, or printing it to + * a file).

          + * + * @param ch The characters. + * @param start The start position in the character array. + * @param length The number of characters to use from the + * character array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DocumentHandler#characters + */ + public void characters (char ch[], int start, int length) + throws SAXException + { + // no op + } + + + /** + * Receive notification of ignorable whitespace in element content. + * + *

          By default, do nothing. Application writers may override this + * method to take specific actions for each chunk of ignorable + * whitespace (such as adding data to a node or buffer, or printing + * it to a file).

          + * + * @param ch The whitespace characters. + * @param start The start position in the character array. + * @param length The number of characters to use from the + * character array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DocumentHandler#ignorableWhitespace + */ + public void ignorableWhitespace (char ch[], int start, int length) + throws SAXException + { + // no op + } + + + /** + * Receive notification of a processing instruction. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions for each + * processing instruction, such as setting status variables or + * invoking other methods.

          + * + * @param target The processing instruction target. + * @param data The processing instruction data, or null if + * none is supplied. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DocumentHandler#processingInstruction + */ + public void processingInstruction (String target, String data) + throws SAXException + { + // no op + } + + + + //////////////////////////////////////////////////////////////////// + // Default implementation of the ErrorHandler interface. + //////////////////////////////////////////////////////////////////// + + + /** + * Receive notification of a parser warning. + * + *

          The default implementation does nothing. Application writers + * may override this method in a subclass to take specific actions + * for each warning, such as inserting the message in a log file or + * printing it to the console.

          + * + * @param e The warning information encoded as an exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ErrorHandler#warning + * @see org.xml.sax.SAXParseException + */ + public void warning (SAXParseException e) + throws SAXException + { + // no op + } + + + /** + * Receive notification of a recoverable parser error. + * + *

          The default implementation does nothing. Application writers + * may override this method in a subclass to take specific actions + * for each error, such as inserting the message in a log file or + * printing it to the console.

          + * + * @param e The warning information encoded as an exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ErrorHandler#warning + * @see org.xml.sax.SAXParseException + */ + public void error (SAXParseException e) + throws SAXException + { + // no op + } + + + /** + * Report a fatal XML parsing error. + * + *

          The default implementation throws a SAXParseException. + * Application writers may override this method in a subclass if + * they need to take specific actions for each fatal error (such as + * collecting all of the errors into a single report): in any case, + * the application must stop all regular processing when this + * method is invoked, since the document is no longer reliable, and + * the parser may no longer report parsing events.

          + * + * @param e The error information encoded as an exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ErrorHandler#fatalError + * @see org.xml.sax.SAXParseException + */ + public void fatalError (SAXParseException e) + throws SAXException + { + throw e; + } + + } + + // end of HandlerBase.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/InputSource.java gcc-3.1/libjava/org/xml/sax/InputSource.java *** gcc-3.0.4/libjava/org/xml/sax/InputSource.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/InputSource.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,321 ---- + // SAX input source. + // No warranty; no copyright -- use this as you will. + // $Id: InputSource.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + import java.io.Reader; + import java.io.InputStream; + + /** + * A single input source for an XML entity. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class allows a SAX application to encapsulate information + * about an input source in a single object, which may include + * a public identifier, a system identifier, a byte stream (possibly + * with a specified encoding), and/or a character stream.

          + * + *

          There are two places that the application will deliver this + * input source to the parser: as the argument to the Parser.parse + * method, or as the return value of the EntityResolver.resolveEntity + * method.

          + * + *

          The SAX parser will use the InputSource object to determine how + * to read XML input. If there is a character stream available, the + * parser will read that stream directly; if not, the parser will use + * a byte stream, if available; if neither a character stream nor a + * byte stream is available, the parser will attempt to open a URI + * connection to the resource identified by the system + * identifier.

          + * + *

          An InputSource object belongs to the application: the SAX parser + * shall never modify it in any way (it may modify a copy if + * necessary).

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Parser#parse + * @see org.xml.sax.EntityResolver#resolveEntity + * @see java.io.InputStream + * @see java.io.Reader + */ + public class InputSource { + + /** + * Zero-argument default constructor. + * + * @see #setPublicId + * @see #setSystemId + * @see #setByteStream + * @see #setCharacterStream + * @see #setEncoding + */ + public InputSource () + { + } + + + /** + * Create a new input source with a system identifier. + * + *

          Applications may use setPublicId to include a + * public identifier as well, or setEncoding to specify + * the character encoding, if known.

          + * + *

          If the system identifier is a URL, it must be full resolved.

          + * + * @param systemId The system identifier (URI). + * @see #setPublicId + * @see #setSystemId + * @see #setByteStream + * @see #setEncoding + * @see #setCharacterStream + */ + public InputSource (String systemId) + { + setSystemId(systemId); + } + + + /** + * Create a new input source with a byte stream. + * + *

          Application writers may use setSystemId to provide a base + * for resolving relative URIs, setPublicId to include a + * public identifier, and/or setEncoding to specify the object's + * character encoding.

          + * + * @param byteStream The raw byte stream containing the document. + * @see #setPublicId + * @see #setSystemId + * @see #setEncoding + * @see #setByteStream + * @see #setCharacterStream + */ + public InputSource (InputStream byteStream) + { + setByteStream(byteStream); + } + + + /** + * Create a new input source with a character stream. + * + *

          Application writers may use setSystemId() to provide a base + * for resolving relative URIs, and setPublicId to include a + * public identifier.

          + * + *

          The character stream shall not include a byte order mark.

          + * + * @see #setPublicId + * @see #setSystemId + * @see #setByteStream + * @see #setCharacterStream + */ + public InputSource (Reader characterStream) + { + setCharacterStream(characterStream); + } + + + /** + * Set the public identifier for this input source. + * + *

          The public identifier is always optional: if the application + * writer includes one, it will be provided as part of the + * location information.

          + * + * @param publicId The public identifier as a string. + * @see #getPublicId + * @see org.xml.sax.Locator#getPublicId + * @see org.xml.sax.SAXParseException#getPublicId + */ + public void setPublicId (String publicId) + { + this.publicId = publicId; + } + + + /** + * Get the public identifier for this input source. + * + * @return The public identifier, or null if none was supplied. + * @see #setPublicId + */ + public String getPublicId () + { + return publicId; + } + + + /** + * Set the system identifier for this input source. + * + *

          The system identifier is optional if there is a byte stream + * or a character stream, but it is still useful to provide one, + * since the application can use it to resolve relative URIs + * and can include it in error messages and warnings (the parser + * will attempt to open a connection to the URI only if + * there is no byte stream or character stream specified).

          + * + *

          If the application knows the character encoding of the + * object pointed to by the system identifier, it can register + * the encoding using the setEncoding method.

          + * + *

          If the system ID is a URL, it must be fully resolved.

          + * + * @param systemId The system identifier as a string. + * @see #setEncoding + * @see #getSystemId + * @see org.xml.sax.Locator#getSystemId + * @see org.xml.sax.SAXParseException#getSystemId + */ + public void setSystemId (String systemId) + { + this.systemId = systemId; + } + + + /** + * Get the system identifier for this input source. + * + *

          The getEncoding method will return the character encoding + * of the object pointed to, or null if unknown.

          + * + *

          If the system ID is a URL, it will be fully resolved.

          + * + * @return The system identifier. + * @see #setSystemId + * @see #getEncoding + */ + public String getSystemId () + { + return systemId; + } + + + /** + * Set the byte stream for this input source. + * + *

          The SAX parser will ignore this if there is also a character + * stream specified, but it will use a byte stream in preference + * to opening a URI connection itself.

          + * + *

          If the application knows the character encoding of the + * byte stream, it should set it with the setEncoding method.

          + * + * @param byteStream A byte stream containing an XML document or + * other entity. + * @see #setEncoding + * @see #getByteStream + * @see #getEncoding + * @see java.io.InputStream + */ + public void setByteStream (InputStream byteStream) + { + this.byteStream = byteStream; + } + + + /** + * Get the byte stream for this input source. + * + *

          The getEncoding method will return the character + * encoding for this byte stream, or null if unknown.

          + * + * @return The byte stream, or null if none was supplied. + * @see #getEncoding + * @see #setByteStream + */ + public InputStream getByteStream () + { + return byteStream; + } + + + /** + * Set the character encoding, if known. + * + *

          The encoding must be a string acceptable for an + * XML encoding declaration (see section 4.3.3 of the XML 1.0 + * recommendation).

          + * + *

          This method has no effect when the application provides a + * character stream.

          + * + * @param encoding A string describing the character encoding. + * @see #setSystemId + * @see #setByteStream + * @see #getEncoding + */ + public void setEncoding (String encoding) + { + this.encoding = encoding; + } + + + /** + * Get the character encoding for a byte stream or URI. + * + * @return The encoding, or null if none was supplied. + * @see #setByteStream + * @see #getSystemId + * @see #getByteStream + */ + public String getEncoding () + { + return encoding; + } + + + /** + * Set the character stream for this input source. + * + *

          If there is a character stream specified, the SAX parser + * will ignore any byte stream and will not attempt to open + * a URI connection to the system identifier.

          + * + * @param characterStream The character stream containing the + * XML document or other entity. + * @see #getCharacterStream + * @see java.io.Reader + */ + public void setCharacterStream (Reader characterStream) + { + this.characterStream = characterStream; + } + + + /** + * Get the character stream for this input source. + * + * @return The character stream, or null if none was supplied. + * @see #setCharacterStream + */ + public Reader getCharacterStream () + { + return characterStream; + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private String publicId; + private String systemId; + private InputStream byteStream; + private String encoding; + private Reader characterStream; + + } + + // end of InputSource.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/Locator.java gcc-3.1/libjava/org/xml/sax/Locator.java *** gcc-3.0.4/libjava/org/xml/sax/Locator.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/Locator.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,126 ---- + // SAX locator interface for document events. + // No warranty; no copyright -- use this as you will. + // $Id: Locator.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + + /** + * Interface for associating a SAX event with a document location. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          If a SAX parser provides location information to the SAX + * application, it does so by implementing this interface and then + * passing an instance to the application using the content + * handler's {@link org.xml.sax.ContentHandler#setDocumentLocator + * setDocumentLocator} method. The application can use the + * object to obtain the location of any other content handler event + * in the XML source document.

          + * + *

          Note that the results returned by the object will be valid only + * during the scope of each content handler method: the application + * will receive unpredictable results if it attempts to use the + * locator at any other time.

          + * + *

          SAX parsers are not required to supply a locator, but they are + * very strongly encouraged to do so. If the parser supplies a + * locator, it must do so before reporting any other document events. + * If no locator has been set by the time the application receives + * the {@link org.xml.sax.ContentHandler#startDocument startDocument} + * event, the application should assume that a locator is not + * available.

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.ContentHandler#setDocumentLocator + */ + public interface Locator { + + + /** + * Return the public identifier for the current document event. + * + *

          The return value is the public identifier of the document + * entity or of the external parsed entity in which the markup + * triggering the event appears.

          + * + * @return A string containing the public identifier, or + * null if none is available. + * @see #getSystemId + */ + public abstract String getPublicId (); + + + /** + * Return the system identifier for the current document event. + * + *

          The return value is the system identifier of the document + * entity or of the external parsed entity in which the markup + * triggering the event appears.

          + * + *

          If the system identifier is a URL, the parser must resolve it + * fully before passing it to the application.

          + * + * @return A string containing the system identifier, or null + * if none is available. + * @see #getPublicId + */ + public abstract String getSystemId (); + + + /** + * Return the line number where the current document event ends. + * + *

          Warning: The return value from the method + * is intended only as an approximation for the sake of error + * reporting; it is not intended to provide sufficient information + * to edit the character content of the original XML document.

          + * + *

          The return value is an approximation of the line number + * in the document entity or external parsed entity where the + * markup triggering the event appears.

          + * + *

          If possible, the SAX driver should provide the line position + * of the first character after the text associated with the document + * event. The first line in the document is line 1.

          + * + * @return The line number, or -1 if none is available. + * @see #getColumnNumber + */ + public abstract int getLineNumber (); + + + /** + * Return the column number where the current document event ends. + * + *

          Warning: The return value from the method + * is intended only as an approximation for the sake of error + * reporting; it is not intended to provide sufficient information + * to edit the character content of the original XML document.

          + * + *

          The return value is an approximation of the column number + * in the document entity or external parsed entity where the + * markup triggering the event appears.

          + * + *

          If possible, the SAX driver should provide the line position + * of the first character after the text associated with the document + * event.

          + * + *

          If possible, the SAX driver should provide the line position + * of the first character after the text associated with the document + * event. The first column in each line is column 1.

          + * + * @return The column number, or -1 if none is available. + * @see #getLineNumber + */ + public abstract int getColumnNumber (); + + } + + // end of Locator.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/Parser.java gcc-3.1/libjava/org/xml/sax/Parser.java *** gcc-3.0.4/libjava/org/xml/sax/Parser.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/Parser.java Wed Jul 11 03:59:15 2001 *************** *** 0 **** --- 1,207 ---- + // SAX parser interface. + // No warranty; no copyright -- use this as you will. + // $Id: Parser.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + import java.io.IOException; + import java.util.Locale; + + + /** + * Basic interface for SAX (Simple API for XML) parsers. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This was the main event supplier interface for SAX1; it has + * been replaced in SAX2 by {@link org.xml.sax.XMLReader XMLReader}, + * which includes Namespace support and sophisticated configurability + * and extensibility.

          + * + *

          All SAX1 parsers must implement this basic interface: it allows + * applications to register handlers for different types of events + * and to initiate a parse from a URI, or a character stream.

          + * + *

          All SAX1 parsers must also implement a zero-argument constructor + * (though other constructors are also allowed).

          + * + *

          SAX1 parsers are reusable but not re-entrant: the application + * may reuse a parser object (possibly with a different input source) + * once the first parse has completed successfully, but it may not + * invoke the parse() methods recursively within a parse.

          + * + * @deprecated This interface has been replaced by the SAX2 + * {@link org.xml.sax.XMLReader XMLReader} + * interface, which includes Namespace support. + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.EntityResolver + * @see org.xml.sax.DTDHandler + * @see org.xml.sax.DocumentHandler + * @see org.xml.sax.ErrorHandler + * @see org.xml.sax.HandlerBase + * @see org.xml.sax.InputSource + */ + public interface Parser + { + + /** + * Allow an application to request a locale for errors and warnings. + * + *

          SAX parsers are not required to provide localisation for errors + * and warnings; if they cannot support the requested locale, + * however, they must throw a SAX exception. Applications may + * not request a locale change in the middle of a parse.

          + * + * @param locale A Java Locale object. + * @exception org.xml.sax.SAXException Throws an exception + * (using the previous or default locale) if the + * requested locale is not supported. + * @see org.xml.sax.SAXException + * @see org.xml.sax.SAXParseException + */ + public abstract void setLocale (Locale locale) + throws SAXException; + + + /** + * Allow an application to register a custom entity resolver. + * + *

          If the application does not register an entity resolver, the + * SAX parser will resolve system identifiers and open connections + * to entities itself (this is the default behaviour implemented in + * HandlerBase).

          + * + *

          Applications may register a new or different entity resolver + * in the middle of a parse, and the SAX parser must begin using + * the new resolver immediately.

          + * + * @param resolver The object for resolving entities. + * @see EntityResolver + * @see HandlerBase + */ + public abstract void setEntityResolver (EntityResolver resolver); + + + /** + * Allow an application to register a DTD event handler. + * + *

          If the application does not register a DTD handler, all DTD + * events reported by the SAX parser will be silently + * ignored (this is the default behaviour implemented by + * HandlerBase).

          + * + *

          Applications may register a new or different + * handler in the middle of a parse, and the SAX parser must + * begin using the new handler immediately.

          + * + * @param handler The DTD handler. + * @see DTDHandler + * @see HandlerBase + */ + public abstract void setDTDHandler (DTDHandler handler); + + + /** + * Allow an application to register a document event handler. + * + *

          If the application does not register a document handler, all + * document events reported by the SAX parser will be silently + * ignored (this is the default behaviour implemented by + * HandlerBase).

          + * + *

          Applications may register a new or different handler in the + * middle of a parse, and the SAX parser must begin using the new + * handler immediately.

          + * + * @param handler The document handler. + * @see DocumentHandler + * @see HandlerBase + */ + public abstract void setDocumentHandler (DocumentHandler handler); + + + /** + * Allow an application to register an error event handler. + * + *

          If the application does not register an error event handler, + * all error events reported by the SAX parser will be silently + * ignored, except for fatalError, which will throw a SAXException + * (this is the default behaviour implemented by HandlerBase).

          + * + *

          Applications may register a new or different handler in the + * middle of a parse, and the SAX parser must begin using the new + * handler immediately.

          + * + * @param handler The error handler. + * @see ErrorHandler + * @see SAXException + * @see HandlerBase + */ + public abstract void setErrorHandler (ErrorHandler handler); + + + /** + * Parse an XML document. + * + *

          The application can use this method to instruct the SAX parser + * to begin parsing an XML document from any valid input + * source (a character stream, a byte stream, or a URI).

          + * + *

          Applications may not invoke this method while a parse is in + * progress (they should create a new Parser instead for each + * additional XML document). Once a parse is complete, an + * application may reuse the same Parser object, possibly with a + * different input source.

          + * + * @param source The input source for the top-level of the + * XML document. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @exception java.io.IOException An IO exception from the parser, + * possibly from a byte stream or character stream + * supplied by the application. + * @see org.xml.sax.InputSource + * @see #parse(java.lang.String) + * @see #setEntityResolver + * @see #setDTDHandler + * @see #setDocumentHandler + * @see #setErrorHandler + */ + public abstract void parse (InputSource source) + throws SAXException, IOException; + + + /** + * Parse an XML document from a system identifier (URI). + * + *

          This method is a shortcut for the common case of reading a + * document from a system identifier. It is the exact + * equivalent of the following:

          + * + *
          +      * parse(new InputSource(systemId));
          +      * 
          + * + *

          If the system identifier is a URL, it must be fully resolved + * by the application before it is passed to the parser.

          + * + * @param systemId The system identifier (URI). + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @exception java.io.IOException An IO exception from the parser, + * possibly from a byte stream or character stream + * supplied by the application. + * @see #parse(org.xml.sax.InputSource) + */ + public abstract void parse (String systemId) + throws SAXException, IOException; + + } + + // end of Parser.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/SAXException.java gcc-3.1/libjava/org/xml/sax/SAXException.java *** gcc-3.0.4/libjava/org/xml/sax/SAXException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/SAXException.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,144 ---- + // SAX exception class. + // No warranty; no copyright -- use this as you will. + // $Id: SAXException.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + /** + * Encapsulate a general SAX error or warning. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class can contain basic error or warning information from + * either the XML parser or the application: a parser writer or + * application writer can subclass it to provide additional + * functionality. SAX handlers may throw this exception or + * any exception subclassed from it.

          + * + *

          If the application needs to pass through other types of + * exceptions, it must wrap those exceptions in a SAXException + * or an exception derived from a SAXException.

          + * + *

          If the parser or application needs to include information about a + * specific location in an XML document, it should use the + * {@link org.xml.sax.SAXParseException SAXParseException} subclass.

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.SAXParseException + */ + public class SAXException extends Exception { + + + /** + * Create a new SAXException. + * + * @param message The error or warning message. + * @see org.xml.sax.Parser#setLocale + */ + public SAXException (String message) { + super(message); + this.exception = null; + } + + + /** + * Create a new SAXException wrapping an existing exception. + * + *

          The existing exception will be embedded in the new + * one, and its message will become the default message for + * the SAXException.

          + * + * @param e The exception to be wrapped in a SAXException. + */ + public SAXException (Exception e) + { + super(); + this.exception = e; + } + + + /** + * Create a new SAXException from an existing exception. + * + *

          The existing exception will be embedded in the new + * one, but the new exception will have its own message.

          + * + * @param message The detail message. + * @param e The exception to be wrapped in a SAXException. + * @see org.xml.sax.Parser#setLocale + */ + public SAXException (String message, Exception e) + { + super(message); + this.exception = e; + } + + + /** + * Return a detail message for this exception. + * + *

          If there is an embedded exception, and if the SAXException + * has no detail message of its own, this method will return + * the detail message from the embedded exception.

          + * + * @return The error or warning message. + * @see org.xml.sax.Parser#setLocale + */ + public String getMessage () + { + String message = super.getMessage(); + + if (message == null && exception != null) { + return exception.getMessage(); + } else { + return message; + } + } + + + /** + * Return the embedded exception, if any. + * + * @return The embedded exception, or null if there is none. + */ + public Exception getException () + { + return exception; + } + + + /** + * Override toString to pick up any embedded exception. + * + * @return A string representation of this exception. + */ + public String toString () + { + if (exception != null) { + return exception.toString(); + } else { + return super.toString(); + } + } + + + + ////////////////////////////////////////////////////////////////////// + // Internal state. + ////////////////////////////////////////////////////////////////////// + + + /** + * @serial The embedded exception if tunnelling, or null. + */ + private Exception exception; + + } + + // end of SAXException.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/SAXNotRecognizedException.java gcc-3.1/libjava/org/xml/sax/SAXNotRecognizedException.java *** gcc-3.0.4/libjava/org/xml/sax/SAXNotRecognizedException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/SAXNotRecognizedException.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,44 ---- + // SAXNotRecognizedException.java - unrecognized feature or value. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the Public Domain. + + // $Id: SAXNotRecognizedException.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + + package org.xml.sax; + + + /** + * Exception class for an unrecognized identifier. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          An XMLReader will throw this exception when it finds an + * unrecognized feature or property identifier; SAX applications and + * extensions may use this class for other, similar purposes.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.SAXNotSupportedException + */ + public class SAXNotRecognizedException extends SAXException + { + + /** + * Construct a new exception with the given message. + * + * @param message The text message of the exception. + */ + public SAXNotRecognizedException (String message) + { + super(message); + } + + } + + // end of SAXNotRecognizedException.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/SAXNotSupportedException.java gcc-3.1/libjava/org/xml/sax/SAXNotSupportedException.java *** gcc-3.0.4/libjava/org/xml/sax/SAXNotSupportedException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/SAXNotSupportedException.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,44 ---- + // SAXNotSupportedException.java - unsupported feature or value. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the Public Domain. + + // $Id: SAXNotSupportedException.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + + package org.xml.sax; + + /** + * Exception class for an unsupported operation. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          An XMLReader will throw this exception when it recognizes a + * feature or property identifier, but cannot perform the requested + * operation (setting a state or value). Other SAX2 applications and + * extensions may use this class for similar purposes.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.SAXNotRecognizedException + */ + public class SAXNotSupportedException extends SAXException + { + + /** + * Construct a new exception with the given message. + * + * @param message The text message of the exception. + */ + public SAXNotSupportedException (String message) + { + super(message); + } + + } + + // end of SAXNotSupportedException.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/SAXParseException.java gcc-3.1/libjava/org/xml/sax/SAXParseException.java *** gcc-3.0.4/libjava/org/xml/sax/SAXParseException.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/SAXParseException.java Wed Oct 31 00:48:17 2001 *************** *** 0 **** --- 1,264 ---- + // SAX exception class. + // No warranty; no copyright -- use this as you will. + // $Id: SAXParseException.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + /** + * Encapsulate an XML parse error or warning. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This exception will include information for locating the error + * in the original XML document. Note that although the application + * will receive a SAXParseException as the argument to the handlers + * in the {@link org.xml.sax.ErrorHandler ErrorHandler} interface, + * the application is not actually required to throw the exception; + * instead, it can simply read the information in it and take a + * different action.

          + * + *

          Since this exception is a subclass of {@link org.xml.sax.SAXException + * SAXException}, it inherits the ability to wrap another exception.

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.SAXException + * @see org.xml.sax.Locator + * @see org.xml.sax.ErrorHandler + */ + public class SAXParseException extends SAXException { + + + ////////////////////////////////////////////////////////////////////// + // Constructors. + ////////////////////////////////////////////////////////////////////// + + + /** + * Create a new SAXParseException from a message and a Locator. + * + *

          This constructor is especially useful when an application is + * creating its own exception from within a {@link org.xml.sax.ContentHandler + * ContentHandler} callback.

          + * + * @param message The error or warning message. + * @param locator The locator object for the error or warning (may be + * null). + * @see org.xml.sax.Locator + * @see org.xml.sax.Parser#setLocale + */ + public SAXParseException (String message, Locator locator) { + super(message); + if (locator != null) { + init(locator.getPublicId(), locator.getSystemId(), + locator.getLineNumber(), locator.getColumnNumber()); + } else { + init(null, null, -1, -1); + } + } + + + /** + * Wrap an existing exception in a SAXParseException. + * + *

          This constructor is especially useful when an application is + * creating its own exception from within a {@link org.xml.sax.ContentHandler + * ContentHandler} callback, and needs to wrap an existing exception that is not a + * subclass of {@link org.xml.sax.SAXException SAXException}.

          + * + * @param message The error or warning message, or null to + * use the message from the embedded exception. + * @param locator The locator object for the error or warning (may be + * null). + * @param e Any exception. + * @see org.xml.sax.Locator + * @see org.xml.sax.Parser#setLocale + */ + public SAXParseException (String message, Locator locator, + Exception e) { + super(message, e); + if (locator != null) { + init(locator.getPublicId(), locator.getSystemId(), + locator.getLineNumber(), locator.getColumnNumber()); + } else { + init(null, null, -1, -1); + } + } + + + /** + * Create a new SAXParseException. + * + *

          This constructor is most useful for parser writers.

          + * + *

          If the system identifier is a URL, the parser must resolve it + * fully before creating the exception.

          + * + * @param message The error or warning message. + * @param publicId The public identifier of the entity that generated + * the error or warning. + * @param systemId The system identifier of the entity that generated + * the error or warning. + * @param lineNumber The line number of the end of the text that + * caused the error or warning. + * @param columnNumber The column number of the end of the text that + * cause the error or warning. + * @see org.xml.sax.Parser#setLocale + */ + public SAXParseException (String message, String publicId, String systemId, + int lineNumber, int columnNumber) + { + super(message); + init(publicId, systemId, lineNumber, columnNumber); + } + + + /** + * Create a new SAXParseException with an embedded exception. + * + *

          This constructor is most useful for parser writers who + * need to wrap an exception that is not a subclass of + * {@link org.xml.sax.SAXException SAXException}.

          + * + *

          If the system identifier is a URL, the parser must resolve it + * fully before creating the exception.

          + * + * @param message The error or warning message, or null to use + * the message from the embedded exception. + * @param publicId The public identifier of the entity that generated + * the error or warning. + * @param systemId The system identifier of the entity that generated + * the error or warning. + * @param lineNumber The line number of the end of the text that + * caused the error or warning. + * @param columnNumber The column number of the end of the text that + * cause the error or warning. + * @param e Another exception to embed in this one. + * @see org.xml.sax.Parser#setLocale + */ + public SAXParseException (String message, String publicId, String systemId, + int lineNumber, int columnNumber, Exception e) + { + super(message, e); + init(publicId, systemId, lineNumber, columnNumber); + } + + + /** + * Internal initialization method. + * + * @param publicId The public identifier of the entity which generated the exception, + * or null. + * @param systemId The system identifier of the entity which generated the exception, + * or null. + * @param lineNumber The line number of the error, or -1. + * @param columnNumber The column number of the error, or -1. + */ + private void init (String publicId, String systemId, + int lineNumber, int columnNumber) + { + this.publicId = publicId; + this.systemId = systemId; + this.lineNumber = lineNumber; + this.columnNumber = columnNumber; + } + + + /** + * Get the public identifier of the entity where the exception occurred. + * + * @return A string containing the public identifier, or null + * if none is available. + * @see org.xml.sax.Locator#getPublicId + */ + public String getPublicId () + { + return this.publicId; + } + + + /** + * Get the system identifier of the entity where the exception occurred. + * + *

          If the system identifier is a URL, it will be resolved + * fully.

          + * + * @return A string containing the system identifier, or null + * if none is available. + * @see org.xml.sax.Locator#getSystemId + */ + public String getSystemId () + { + return this.systemId; + } + + + /** + * The line number of the end of the text where the exception occurred. + * + * @return An integer representing the line number, or -1 + * if none is available. + * @see org.xml.sax.Locator#getLineNumber + */ + public int getLineNumber () + { + return this.lineNumber; + } + + + /** + * The column number of the end of the text where the exception occurred. + * + *

          The first column in a line is position 1.

          + * + * @return An integer representing the column number, or -1 + * if none is available. + * @see org.xml.sax.Locator#getColumnNumber + */ + public int getColumnNumber () + { + return this.columnNumber; + } + + + + ////////////////////////////////////////////////////////////////////// + // Internal state. + ////////////////////////////////////////////////////////////////////// + + + /** + * @serial The public identifier, or null. + * @see #getPublicId + */ + private String publicId; + + + /** + * @serial The system identifier, or null. + * @see #getSystemId + */ + private String systemId; + + + /** + * @serial The line number, or -1. + * @see #getLineNumber + */ + private int lineNumber; + + + /** + * @serial The column number, or -1. + * @see #getColumnNumber + */ + private int columnNumber; + + } + + // end of SAXParseException.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/XMLFilter.java gcc-3.1/libjava/org/xml/sax/XMLFilter.java *** gcc-3.0.4/libjava/org/xml/sax/XMLFilter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/XMLFilter.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,65 ---- + // XMLFilter.java - filter SAX2 events. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the Public Domain. + + // $Id: XMLFilter.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + + package org.xml.sax; + + + /** + * Interface for an XML filter. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          An XML filter is like an XML reader, except that it obtains its + * events from another XML reader rather than a primary source like + * an XML document or database. Filters can modify a stream of + * events as they pass on to the final application.

          + * + *

          The XMLFilterImpl helper class provides a convenient base + * for creating SAX2 filters, by passing on all {@link org.xml.sax.EntityResolver + * EntityResolver}, {@link org.xml.sax.DTDHandler DTDHandler}, + * {@link org.xml.sax.ContentHandler ContentHandler} and {@link org.xml.sax.ErrorHandler + * ErrorHandler} events automatically.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.helpers.XMLFilterImpl + */ + public interface XMLFilter extends XMLReader + { + + /** + * Set the parent reader. + * + *

          This method allows the application to link the filter to + * a parent reader (which may be another filter). The argument + * may not be null.

          + * + * @param parent The parent reader. + */ + public abstract void setParent (XMLReader parent); + + + /** + * Get the parent reader. + * + *

          This method allows the application to query the parent + * reader (which may be another filter). It is generally a + * bad idea to perform any operations on the parent reader + * directly: they should all pass through this filter.

          + * + * @return The parent filter, or null if none has been set. + */ + public abstract XMLReader getParent (); + + } + + // end of XMLFilter.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/XMLReader.java gcc-3.1/libjava/org/xml/sax/XMLReader.java *** gcc-3.0.4/libjava/org/xml/sax/XMLReader.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/XMLReader.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,415 ---- + // XMLReader.java - read an XML document. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the Public Domain. + + // $Id: XMLReader.java,v 1.1 2000/10/02 02:43:17 sboag Exp $ + + package org.xml.sax; + + import java.io.IOException; + + + /** + * Interface for reading an XML document using callbacks. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          Note: despite its name, this interface does + * not extend the standard Java {@link java.io.Reader Reader} + * interface, because reading XML is a fundamentally different activity + * than reading character data.

          + * + *

          XMLReader is the interface that an XML parser's SAX2 driver must + * implement. This interface allows an application to set and + * query features and properties in the parser, to register + * event handlers for document processing, and to initiate + * a document parse.

          + * + *

          All SAX interfaces are assumed to be synchronous: the + * {@link #parse parse} methods must not return until parsing + * is complete, and readers must wait for an event-handler callback + * to return before reporting the next event.

          + * + *

          This interface replaces the (now deprecated) SAX 1.0 {@link + * org.xml.sax.Parser Parser} interface. The XMLReader interface + * contains two important enhancements over the old Parser + * interface:

          + * + *
            + *
          1. it adds a standard way to query and set features and + * properties; and
          2. + *
          3. it adds Namespace support, which is required for many + * higher-level XML standards.
          4. + *
          + * + *

          There are adapters available to convert a SAX1 Parser to + * a SAX2 XMLReader and vice-versa.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.XMLFilter + * @see org.xml.sax.helpers.ParserAdapter + * @see org.xml.sax.helpers.XMLReaderAdapter + */ + public interface XMLReader + { + + + //////////////////////////////////////////////////////////////////// + // Configuration. + //////////////////////////////////////////////////////////////////// + + + /** + * Look up the value of a feature. + * + *

          The feature name is any fully-qualified URI. It is + * possible for an XMLReader to recognize a feature name but + * to be unable to return its value; this is especially true + * in the case of an adapter for a SAX1 Parser, which has + * no way of knowing whether the underlying parser is + * performing validation or expanding external entities.

          + * + *

          All XMLReaders are required to recognize the + * http://xml.org/sax/features/namespaces and the + * http://xml.org/sax/features/namespace-prefixes feature names.

          + * + *

          Some feature values may be available only in specific + * contexts, such as before, during, or after a parse.

          + * + *

          Typical usage is something like this:

          + * + *
          +      * XMLReader r = new MySAXDriver();
          +      *
          +      *                         // try to activate validation
          +      * try {
          +      *   r.setFeature("http://xml.org/sax/features/validation", true);
          +      * } catch (SAXException e) {
          +      *   System.err.println("Cannot activate validation."); 
          +      * }
          +      *
          +      *                         // register event handlers
          +      * r.setContentHandler(new MyContentHandler());
          +      * r.setErrorHandler(new MyErrorHandler());
          +      *
          +      *                         // parse the first document
          +      * try {
          +      *   r.parse("http://www.foo.com/mydoc.xml");
          +      * } catch (IOException e) {
          +      *   System.err.println("I/O exception reading XML document");
          +      * } catch (SAXException e) {
          +      *   System.err.println("XML exception reading document.");
          +      * }
          +      * 
          + * + *

          Implementors are free (and encouraged) to invent their own features, + * using names built on their own URIs.

          + * + * @param name The feature name, which is a fully-qualified URI. + * @return The current state of the feature (true or false). + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the feature name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the feature name but + * cannot determine its value at this time. + * @see #setFeature + */ + public boolean getFeature (String name) + throws SAXNotRecognizedException, SAXNotSupportedException; + + + /** + * Set the state of a feature. + * + *

          The feature name is any fully-qualified URI. It is + * possible for an XMLReader to recognize a feature name but + * to be unable to set its value; this is especially true + * in the case of an adapter for a SAX1 {@link org.xml.sax.Parser Parser}, + * which has no way of affecting whether the underlying parser is + * validating, for example.

          + * + *

          All XMLReaders are required to support setting + * http://xml.org/sax/features/namespaces to true and + * http://xml.org/sax/features/namespace-prefixes to false.

          + * + *

          Some feature values may be immutable or mutable only + * in specific contexts, such as before, during, or after + * a parse.

          + * + * @param name The feature name, which is a fully-qualified URI. + * @param state The requested state of the feature (true or false). + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the feature name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the feature name but + * cannot set the requested value. + * @see #getFeature + */ + public void setFeature (String name, boolean value) + throws SAXNotRecognizedException, SAXNotSupportedException; + + + /** + * Look up the value of a property. + * + *

          The property name is any fully-qualified URI. It is + * possible for an XMLReader to recognize a property name but + * to be unable to return its state; this is especially true + * in the case of an adapter for a SAX1 {@link org.xml.sax.Parser + * Parser}.

          + * + *

          XMLReaders are not required to recognize any specific + * property names, though an initial core set is documented for + * SAX2.

          + * + *

          Some property values may be available only in specific + * contexts, such as before, during, or after a parse.

          + * + *

          Implementors are free (and encouraged) to invent their own properties, + * using names built on their own URIs.

          + * + * @param name The property name, which is a fully-qualified URI. + * @return The current value of the property. + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the property name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the property name but + * cannot determine its value at this time. + * @see #setProperty + */ + public Object getProperty (String name) + throws SAXNotRecognizedException, SAXNotSupportedException; + + + /** + * Set the value of a property. + * + *

          The property name is any fully-qualified URI. It is + * possible for an XMLReader to recognize a property name but + * to be unable to set its value; this is especially true + * in the case of an adapter for a SAX1 {@link org.xml.sax.Parser + * Parser}.

          + * + *

          XMLReaders are not required to recognize setting + * any specific property names, though a core set is provided with + * SAX2.

          + * + *

          Some property values may be immutable or mutable only + * in specific contexts, such as before, during, or after + * a parse.

          + * + *

          This method is also the standard mechanism for setting + * extended handlers.

          + * + * @param name The property name, which is a fully-qualified URI. + * @param state The requested value for the property. + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the property name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the property name but + * cannot set the requested value. + */ + public void setProperty (String name, Object value) + throws SAXNotRecognizedException, SAXNotSupportedException; + + + + //////////////////////////////////////////////////////////////////// + // Event handlers. + //////////////////////////////////////////////////////////////////// + + + /** + * Allow an application to register an entity resolver. + * + *

          If the application does not register an entity resolver, + * the XMLReader will perform its own default resolution.

          + * + *

          Applications may register a new or different resolver in the + * middle of a parse, and the SAX parser must begin using the new + * resolver immediately.

          + * + * @param resolver The entity resolver. + * @exception java.lang.NullPointerException If the resolver + * argument is null. + * @see #getEntityResolver + */ + public void setEntityResolver (EntityResolver resolver); + + + /** + * Return the current entity resolver. + * + * @return The current entity resolver, or null if none + * has been registered. + * @see #setEntityResolver + */ + public EntityResolver getEntityResolver (); + + + /** + * Allow an application to register a DTD event handler. + * + *

          If the application does not register a DTD handler, all DTD + * events reported by the SAX parser will be silently ignored.

          + * + *

          Applications may register a new or different handler in the + * middle of a parse, and the SAX parser must begin using the new + * handler immediately.

          + * + * @param handler The DTD handler. + * @exception java.lang.NullPointerException If the handler + * argument is null. + * @see #getDTDHandler + */ + public void setDTDHandler (DTDHandler handler); + + + /** + * Return the current DTD handler. + * + * @return The current DTD handler, or null if none + * has been registered. + * @see #setDTDHandler + */ + public DTDHandler getDTDHandler (); + + + /** + * Allow an application to register a content event handler. + * + *

          If the application does not register a content handler, all + * content events reported by the SAX parser will be silently + * ignored.

          + * + *

          Applications may register a new or different handler in the + * middle of a parse, and the SAX parser must begin using the new + * handler immediately.

          + * + * @param handler The content handler. + * @exception java.lang.NullPointerException If the handler + * argument is null. + * @see #getContentHandler + */ + public void setContentHandler (ContentHandler handler); + + + /** + * Return the current content handler. + * + * @return The current content handler, or null if none + * has been registered. + * @see #setContentHandler + */ + public ContentHandler getContentHandler (); + + + /** + * Allow an application to register an error event handler. + * + *

          If the application does not register an error handler, all + * error events reported by the SAX parser will be silently + * ignored; however, normal processing may not continue. It is + * highly recommended that all SAX applications implement an + * error handler to avoid unexpected bugs.

          + * + *

          Applications may register a new or different handler in the + * middle of a parse, and the SAX parser must begin using the new + * handler immediately.

          + * + * @param handler The error handler. + * @exception java.lang.NullPointerException If the handler + * argument is null. + * @see #getErrorHandler + */ + public void setErrorHandler (ErrorHandler handler); + + + /** + * Return the current error handler. + * + * @return The current error handler, or null if none + * has been registered. + * @see #setErrorHandler + */ + public ErrorHandler getErrorHandler (); + + + + //////////////////////////////////////////////////////////////////// + // Parsing. + //////////////////////////////////////////////////////////////////// + + /** + * Parse an XML document. + * + *

          The application can use this method to instruct the XML + * reader to begin parsing an XML document from any valid input + * source (a character stream, a byte stream, or a URI).

          + * + *

          Applications may not invoke this method while a parse is in + * progress (they should create a new XMLReader instead for each + * nested XML document). Once a parse is complete, an + * application may reuse the same XMLReader object, possibly with a + * different input source.

          + * + *

          During the parse, the XMLReader will provide information + * about the XML document through the registered event + * handlers.

          + * + *

          This method is synchronous: it will not return until parsing + * has ended. If a client application wants to terminate + * parsing early, it should throw an exception.

          + * + * @param source The input source for the top-level of the + * XML document. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @exception java.io.IOException An IO exception from the parser, + * possibly from a byte stream or character stream + * supplied by the application. + * @see org.xml.sax.InputSource + * @see #parse(java.lang.String) + * @see #setEntityResolver + * @see #setDTDHandler + * @see #setContentHandler + * @see #setErrorHandler + */ + public void parse (InputSource input) + throws IOException, SAXException; + + + /** + * Parse an XML document from a system identifier (URI). + * + *

          This method is a shortcut for the common case of reading a + * document from a system identifier. It is the exact + * equivalent of the following:

          + * + *
          +      * parse(new InputSource(systemId));
          +      * 
          + * + *

          If the system identifier is a URL, it must be fully resolved + * by the application before it is passed to the parser.

          + * + * @param systemId The system identifier (URI). + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @exception java.io.IOException An IO exception from the parser, + * possibly from a byte stream or character stream + * supplied by the application. + * @see #parse(org.xml.sax.InputSource) + */ + public void parse (String systemId) + throws IOException, SAXException; + + } + + // end of XMLReader.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/ext/DeclHandler.java gcc-3.1/libjava/org/xml/sax/ext/DeclHandler.java *** gcc-3.0.4/libjava/org/xml/sax/ext/DeclHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/ext/DeclHandler.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,131 ---- + // DeclHandler.java - Optional handler for DTD declaration events. + // Public Domain: no warranty. + // $Id: DeclHandler.java,v 1.1 2000/10/02 02:43:19 sboag Exp $ + + package org.xml.sax.ext; + + import org.xml.sax.SAXException; + + + /** + * SAX2 extension handler for DTD declaration events. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This is an optional extension handler for SAX2 to provide + * information about DTD declarations in an XML document. XML + * readers are not required to support this handler.

          + * + *

          Note that data-related DTD declarations (unparsed entities and + * notations) are already reported through the {@link + * org.xml.sax.DTDHandler DTDHandler} interface.

          + * + *

          If you are using the declaration handler together with a lexical + * handler, all of the events will occur between the + * {@link org.xml.sax.ext.LexicalHandler#startDTD startDTD} and the + * {@link org.xml.sax.ext.LexicalHandler#endDTD endDTD} events.

          + * + *

          To set the DeclHandler for an XML reader, use the + * {@link org.xml.sax.XMLReader#setProperty setProperty} method + * with the propertyId "http://xml.org/sax/handlers/DeclHandler". + * If the reader does not support declaration events, it will throw a + * {@link org.xml.sax.SAXNotRecognizedException SAXNotRecognizedException} + * or a + * {@link org.xml.sax.SAXNotSupportedException SAXNotSupportedException} + * when you attempt to register the handler.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0beta + * @see org.xml.sax.XMLReader + */ + public interface DeclHandler + { + + /** + * Report an element type declaration. + * + *

          The content model will consist of the string "EMPTY", the + * string "ANY", or a parenthesised group, optionally followed + * by an occurrence indicator. The model will be normalized so + * that all whitespace is removed,and will include the enclosing + * parentheses.

          + * + * @param name The element type name. + * @param model The content model as a normalized string. + * @exception SAXException The application may raise an exception. + */ + public abstract void elementDecl (String name, String model) + throws SAXException; + + + /** + * Report an attribute type declaration. + * + *

          Only the effective (first) declaration for an attribute will + * be reported. The type will be one of the strings "CDATA", + * "ID", "IDREF", "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", + * "ENTITIES", or "NOTATION", or a parenthesized token group with + * the separator "|" and all whitespace removed.

          + * + * @param eName The name of the associated element. + * @param aName The name of the attribute. + * @param type A string representing the attribute type. + * @param valueDefault A string representing the attribute default + * ("#IMPLIED", "#REQUIRED", or "#FIXED") or null if + * none of these applies. + * @param value A string representing the attribute's default value, + * or null if there is none. + * @exception SAXException The application may raise an exception. + */ + public abstract void attributeDecl (String eName, + String aName, + String type, + String valueDefault, + String value) + throws SAXException; + + + /** + * Report an internal entity declaration. + * + *

          Only the effective (first) declaration for each entity + * will be reported.

          + * + * @param name The name of the entity. If it is a parameter + * entity, the name will begin with '%'. + * @param value The replacement text of the entity. + * @exception SAXException The application may raise an exception. + * @see #externalEntityDecl + * @see org.xml.sax.DTDHandler#unparsedEntityDecl + */ + public abstract void internalEntityDecl (String name, String value) + throws SAXException; + + + /** + * Report a parsed external entity declaration. + * + *

          Only the effective (first) declaration for each entity + * will be reported.

          + * + * @param name The name of the entity. If it is a parameter + * entity, the name will begin with '%'. + * @param publicId The declared public identifier of the entity, or + * null if none was declared. + * @param systemId The declared system identifier of the entity. + * @exception SAXException The application may raise an exception. + * @see #internalEntityDecl + * @see org.xml.sax.DTDHandler#unparsedEntityDecl + */ + public abstract void externalEntityDecl (String name, String publicId, + String systemId) + throws SAXException; + + } + + // end of DeclHandler.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/ext/LexicalHandler.java gcc-3.1/libjava/org/xml/sax/ext/LexicalHandler.java *** gcc-3.0.4/libjava/org/xml/sax/ext/LexicalHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/ext/LexicalHandler.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,161 ---- + // LexicalHandler.java - optional handler for lexical parse events. + // Public Domain: no warranty. + // $Id: LexicalHandler.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.ext; + + import org.xml.sax.SAXException; + + /** + * SAX2 extension handler for lexical events. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This is an optional extension handler for SAX2 to provide + * lexical information about an XML document, such as comments + * and CDATA section boundaries; XML readers are not required to + * support this handler.

          + * + *

          The events in the lexical handler apply to the entire document, + * not just to the document element, and all lexical handler events + * must appear between the content handler's startDocument and + * endDocument events.

          + * + *

          To set the LexicalHandler for an XML reader, use the + * {@link org.xml.sax.XMLReader#setProperty setProperty} method + * with the propertyId "http://xml.org/sax/handlers/LexicalHandler". + * If the reader does not support lexical events, it will throw a + * {@link org.xml.sax.SAXNotRecognizedException SAXNotRecognizedException} + * or a + * {@link org.xml.sax.SAXNotSupportedException SAXNotSupportedException} + * when you attempt to register the handler.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0beta + * @see org.xml.sax.XMLReader#setProperty + * @see org.xml.sax.SAXNotRecognizedException + * @see org.xml.sax.SAXNotSupportedException + */ + public interface LexicalHandler + { + + /** + * Report the start of DTD declarations, if any. + * + *

          Any declarations are assumed to be in the internal subset + * unless otherwise indicated by a {@link #startEntity startEntity} + * event.

          + * + *

          Note that the start/endDTD events will appear within + * the start/endDocument events from ContentHandler and + * before the first startElement event.

          + * + * @param name The document type name. + * @param publicId The declared public identifier for the + * external DTD subset, or null if none was declared. + * @param systemId The declared system identifier for the + * external DTD subset, or null if none was declared. + * @exception SAXException The application may raise an + * exception. + * @see #endDTD + * @see #startEntity + */ + public abstract void startDTD (String name, String publicId, + String systemId) + throws SAXException; + + + /** + * Report the end of DTD declarations. + * + * @exception SAXException The application may raise an exception. + * @see #startDTD + */ + public abstract void endDTD () + throws SAXException; + + + /** + * Report the beginning of an entity in content. + * + *

          NOTE: entity references in attribute + * values -- and the start and end of the document entity -- + * are never reported.

          + * + *

          The start and end of the external DTD subset are reported + * using the pseudo-name "[dtd]". All other events must be + * properly nested within start/end entity events.

          + * + *

          Note that skipped entities will be reported through the + * {@link org.xml.sax.ContentHandler#skippedEntity skippedEntity} + * event, which is part of the ContentHandler interface.

          + * + * @param name The name of the entity. If it is a parameter + * entity, the name will begin with '%'. + * @exception SAXException The application may raise an exception. + * @see #endEntity + * @see org.xml.sax.ext.DeclHandler#internalEntityDecl + * @see org.xml.sax.ext.DeclHandler#externalEntityDecl + */ + public abstract void startEntity (String name) + throws SAXException; + + + /** + * Report the end of an entity. + * + * @param name The name of the entity that is ending. + * @exception SAXException The application may raise an exception. + * @see #startEntity + */ + public abstract void endEntity (String name) + throws SAXException; + + + /** + * Report the start of a CDATA section. + * + *

          The contents of the CDATA section will be reported through + * the regular {@link org.xml.sax.ContentHandler#characters + * characters} event.

          + * + * @exception SAXException The application may raise an exception. + * @see #endCDATA + */ + public abstract void startCDATA () + throws SAXException; + + + /** + * Report the end of a CDATA section. + * + * @exception SAXException The application may raise an exception. + * @see #startCDATA + */ + public abstract void endCDATA () + throws SAXException; + + + /** + * Report an XML comment anywhere in the document. + * + *

          This callback will be used for comments inside or outside the + * document element, including comments in the external DTD + * subset (if read).

          + * + * @param ch An array holding the characters in the comment. + * @param start The starting position in the array. + * @param length The number of characters to use from the array. + * @exception SAXException The application may raise an exception. + */ + public abstract void comment (char ch[], int start, int length) + throws SAXException; + + } + + // end of LexicalHandler.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/AttributeListImpl.java gcc-3.1/libjava/org/xml/sax/helpers/AttributeListImpl.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/AttributeListImpl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/AttributeListImpl.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,310 ---- + // SAX default implementation for AttributeList. + // No warranty; no copyright -- use this as you will. + // $Id: AttributeListImpl.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import org.xml.sax.AttributeList; + + import java.util.Vector; + + + /** + * Default implementation for AttributeList. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          AttributeList implements the deprecated SAX1 {@link + * org.xml.sax.AttributeList AttributeList} interface, and has been + * replaced by the new SAX2 {@link org.xml.sax.helpers.AttributesImpl + * AttributesImpl} interface.

          + * + *

          This class provides a convenience implementation of the SAX + * {@link org.xml.sax.AttributeList AttributeList} interface. This + * implementation is useful both for SAX parser writers, who can use + * it to provide attributes to the application, and for SAX application + * writers, who can use it to create a persistent copy of an element's + * attribute specifications:

          + * + *
          +  * private AttributeList myatts;
          +  *
          +  * public void startElement (String name, AttributeList atts)
          +  * {
          +  *              // create a persistent copy of the attribute list
          +  *              // for use outside this method
          +  *   myatts = new AttributeListImpl(atts);
          +  *   [...]
          +  * }
          +  * 
          + * + *

          Please note that SAX parsers are not required to use this + * class to provide an implementation of AttributeList; it is + * supplied only as an optional convenience. In particular, + * parser writers are encouraged to invent more efficient + * implementations.

          + * + * @deprecated This class implements a deprecated interface, + * {@link org.xml.sax.AttributeList AttributeList}; + * that interface has been replaced by + * {@link org.xml.sax.Attributes Attributes}, + * which is implemented in the + * {@link org.xml.sax.helpers.AttributesImpl + * AttributesImpl} helper class. + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.AttributeList + * @see org.xml.sax.DocumentHandler#startElement + */ + public class AttributeListImpl implements AttributeList + { + + /** + * Create an empty attribute list. + * + *

          This constructor is most useful for parser writers, who + * will use it to create a single, reusable attribute list that + * can be reset with the clear method between elements.

          + * + * @see #addAttribute + * @see #clear + */ + public AttributeListImpl () + { + } + + + /** + * Construct a persistent copy of an existing attribute list. + * + *

          This constructor is most useful for application writers, + * who will use it to create a persistent copy of an existing + * attribute list.

          + * + * @param atts The attribute list to copy + * @see org.xml.sax.DocumentHandler#startElement + */ + public AttributeListImpl (AttributeList atts) + { + setAttributeList(atts); + } + + + + //////////////////////////////////////////////////////////////////// + // Methods specific to this class. + //////////////////////////////////////////////////////////////////// + + + /** + * Set the attribute list, discarding previous contents. + * + *

          This method allows an application writer to reuse an + * attribute list easily.

          + * + * @param atts The attribute list to copy. + */ + public void setAttributeList (AttributeList atts) + { + int count = atts.getLength(); + + clear(); + + for (int i = 0; i < count; i++) { + addAttribute(atts.getName(i), atts.getType(i), atts.getValue(i)); + } + } + + + /** + * Add an attribute to an attribute list. + * + *

          This method is provided for SAX parser writers, to allow them + * to build up an attribute list incrementally before delivering + * it to the application.

          + * + * @param name The attribute name. + * @param type The attribute type ("NMTOKEN" for an enumeration). + * @param value The attribute value (must not be null). + * @see #removeAttribute + * @see org.xml.sax.DocumentHandler#startElement + */ + public void addAttribute (String name, String type, String value) + { + names.addElement(name); + types.addElement(type); + values.addElement(value); + } + + + /** + * Remove an attribute from the list. + * + *

          SAX application writers can use this method to filter an + * attribute out of an AttributeList. Note that invoking this + * method will change the length of the attribute list and + * some of the attribute's indices.

          + * + *

          If the requested attribute is not in the list, this is + * a no-op.

          + * + * @param name The attribute name. + * @see #addAttribute + */ + public void removeAttribute (String name) + { + int i = names.indexOf(name); + + if (i >= 0) { + names.removeElementAt(i); + types.removeElementAt(i); + values.removeElementAt(i); + } + } + + + /** + * Clear the attribute list. + * + *

          SAX parser writers can use this method to reset the attribute + * list between DocumentHandler.startElement events. Normally, + * it will make sense to reuse the same AttributeListImpl object + * rather than allocating a new one each time.

          + * + * @see org.xml.sax.DocumentHandler#startElement + */ + public void clear () + { + names.removeAllElements(); + types.removeAllElements(); + values.removeAllElements(); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.AttributeList + //////////////////////////////////////////////////////////////////// + + + /** + * Return the number of attributes in the list. + * + * @return The number of attributes in the list. + * @see org.xml.sax.AttributeList#getLength + */ + public int getLength () + { + return names.size(); + } + + + /** + * Get the name of an attribute (by position). + * + * @param i The position of the attribute in the list. + * @return The attribute name as a string, or null if there + * is no attribute at that position. + * @see org.xml.sax.AttributeList#getName(int) + */ + public String getName (int i) + { + if (i < 0) { + return null; + } + try { + return (String)names.elementAt(i); + } catch (ArrayIndexOutOfBoundsException e) { + return null; + } + } + + + /** + * Get the type of an attribute (by position). + * + * @param i The position of the attribute in the list. + * @return The attribute type as a string ("NMTOKEN" for an + * enumeration, and "CDATA" if no declaration was + * read), or null if there is no attribute at + * that position. + * @see org.xml.sax.AttributeList#getType(int) + */ + public String getType (int i) + { + if (i < 0) { + return null; + } + try { + return (String)types.elementAt(i); + } catch (ArrayIndexOutOfBoundsException e) { + return null; + } + } + + + /** + * Get the value of an attribute (by position). + * + * @param i The position of the attribute in the list. + * @return The attribute value as a string, or null if + * there is no attribute at that position. + * @see org.xml.sax.AttributeList#getValue(int) + */ + public String getValue (int i) + { + if (i < 0) { + return null; + } + try { + return (String)values.elementAt(i); + } catch (ArrayIndexOutOfBoundsException e) { + return null; + } + } + + + /** + * Get the type of an attribute (by name). + * + * @param name The attribute name. + * @return The attribute type as a string ("NMTOKEN" for an + * enumeration, and "CDATA" if no declaration was + * read). + * @see org.xml.sax.AttributeList#getType(java.lang.String) + */ + public String getType (String name) + { + return getType(names.indexOf(name)); + } + + + /** + * Get the value of an attribute (by name). + * + * @param name The attribute name. + * @see org.xml.sax.AttributeList#getValue(java.lang.String) + */ + public String getValue (String name) + { + return getValue(names.indexOf(name)); + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + Vector names = new Vector(); + Vector types = new Vector(); + Vector values = new Vector(); + + } + + // end of AttributeListImpl.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/AttributesImpl.java gcc-3.1/libjava/org/xml/sax/helpers/AttributesImpl.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/AttributesImpl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/AttributesImpl.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,606 ---- + // AttributesImpl.java - default implementation of Attributes. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the public domain. + + // $Id: AttributesImpl.java,v 1.2 2001/05/31 16:03:17 garyp Exp $ + + + package org.xml.sax.helpers; + + import org.xml.sax.Attributes; + + + /** + * Default implementation of the Attributes interface. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class provides a default implementation of the SAX2 + * {@link org.xml.sax.Attributes Attributes} interface, with the + * addition of manipulators so that the list can be modified or + * reused.

          + * + *

          There are two typical uses of this class:

          + * + *
            + *
          1. to take a persistent snapshot of an Attributes object + * in a {@link org.xml.sax.ContentHandler#startElement startElement} event; or
          2. + *
          3. to construct or modify an Attributes object in a SAX2 driver or filter.
          4. + *
          + * + *

          This class replaces the now-deprecated SAX1 {@link + * org.xml.sax.helpers.AttributeListImpl AttributeListImpl} + * class; in addition to supporting the updated Attributes + * interface rather than the deprecated {@link org.xml.sax.AttributeList + * AttributeList} interface, it also includes a much more efficient + * implementation using a single array rather than a set of Vectors.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + */ + public class AttributesImpl implements Attributes + { + + + //////////////////////////////////////////////////////////////////// + // Constructors. + //////////////////////////////////////////////////////////////////// + + + /** + * Construct a new, empty AttributesImpl object. + */ + public AttributesImpl () + { + length = 0; + data = null; + } + + + /** + * Copy an existing Attributes object. + * + *

          This constructor is especially useful inside a + * {@link org.xml.sax.ContentHandler#startElement startElement} event.

          + * + * @param atts The existing Attributes object. + */ + public AttributesImpl (Attributes atts) + { + setAttributes(atts); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.Attributes. + //////////////////////////////////////////////////////////////////// + + + /** + * Return the number of attributes in the list. + * + * @return The number of attributes in the list. + * @see org.xml.sax.Attributes#getLength + */ + public int getLength () + { + return length; + } + + + /** + * Return an attribute's Namespace URI. + * + * @param index The attribute's index (zero-based). + * @return The Namespace URI, the empty string if none is + * available, or null if the index is out of range. + * @see org.xml.sax.Attributes#getURI + */ + public String getURI (int index) + { + if (index >= 0 && index < length) { + return data[index*5]; + } else { + return null; + } + } + + + /** + * Return an attribute's local name. + * + * @param index The attribute's index (zero-based). + * @return The attribute's local name, the empty string if + * none is available, or null if the index if out of range. + * @see org.xml.sax.Attributes#getLocalName + */ + public String getLocalName (int index) + { + if (index >= 0 && index < length) { + return data[index*5+1]; + } else { + return null; + } + } + + + /** + * Return an attribute's qualified (prefixed) name. + * + * @param index The attribute's index (zero-based). + * @return The attribute's qualified name, the empty string if + * none is available, or null if the index is out of bounds. + * @see org.xml.sax.Attributes#getQName + */ + public String getQName (int index) + { + if (index >= 0 && index < length) { + return data[index*5+2]; + } else { + return null; + } + } + + + /** + * Return an attribute's type by index. + * + * @param index The attribute's index (zero-based). + * @return The attribute's type, "CDATA" if the type is unknown, or null + * if the index is out of bounds. + * @see org.xml.sax.Attributes#getType(int) + */ + public String getType (int index) + { + if (index >= 0 && index < length) { + return data[index*5+3]; + } else { + return null; + } + } + + + /** + * Return an attribute's value by index. + * + * @param index The attribute's index (zero-based). + * @return The attribute's value or null if the index is out of bounds. + * @see org.xml.sax.Attributes#getValue(int) + */ + public String getValue (int index) + { + if (index >= 0 && index < length) { + return data[index*5+4]; + } else { + return null; + } + } + + + /** + * Look up an attribute's index by Namespace name. + * + *

          In many cases, it will be more efficient to look up the name once and + * use the index query methods rather than using the name query methods + * repeatedly.

          + * + * @param uri The attribute's Namespace URI, or the empty + * string if none is available. + * @param localName The attribute's local name. + * @return The attribute's index, or -1 if none matches. + * @see org.xml.sax.Attributes#getIndex(java.lang.String,java.lang.String) + */ + public int getIndex (String uri, String localName) + { + int max = length * 5; + for (int i = 0; i < max; i += 5) { + if (data[i].equals(uri) && data[i+1].equals(localName)) { + return i / 5; + } + } + return -1; + } + + + /** + * Look up an attribute's index by qualified (prefixed) name. + * + * @param qName The qualified name. + * @return The attribute's index, or -1 if none matches. + * @see org.xml.sax.Attributes#getIndex(java.lang.String) + */ + public int getIndex (String qName) + { + int max = length * 5; + for (int i = 0; i < max; i += 5) { + if (data[i+2].equals(qName)) { + return i / 5; + } + } + return -1; + } + + + /** + * Look up an attribute's type by Namespace-qualified name. + * + * @param uri The Namespace URI, or the empty string for a name + * with no explicit Namespace URI. + * @param localName The local name. + * @return The attribute's type, or null if there is no + * matching attribute. + * @see org.xml.sax.Attributes#getType(java.lang.String,java.lang.String) + */ + public String getType (String uri, String localName) + { + int max = length * 5; + for (int i = 0; i < max; i += 5) { + if (data[i].equals(uri) && data[i+1].equals(localName)) { + return data[i+3]; + } + } + return null; + } + + + /** + * Look up an attribute's type by qualified (prefixed) name. + * + * @param qName The qualified name. + * @return The attribute's type, or null if there is no + * matching attribute. + * @see org.xml.sax.Attributes#getType(java.lang.String) + */ + public String getType (String qName) + { + int max = length * 5; + for (int i = 0; i < max; i += 5) { + if (data[i+2].equals(qName)) { + return data[i+3]; + } + } + return null; + } + + + /** + * Look up an attribute's value by Namespace-qualified name. + * + * @param uri The Namespace URI, or the empty string for a name + * with no explicit Namespace URI. + * @param localName The local name. + * @return The attribute's value, or null if there is no + * matching attribute. + * @see org.xml.sax.Attributes#getValue(java.lang.String,java.lang.String) + */ + public String getValue (String uri, String localName) + { + int max = length * 5; + for (int i = 0; i < max; i += 5) { + if (data[i].equals(uri) && data[i+1].equals(localName)) { + return data[i+4]; + } + } + return null; + } + + + /** + * Look up an attribute's value by qualified (prefixed) name. + * + * @param qName The qualified name. + * @return The attribute's value, or null if there is no + * matching attribute. + * @see org.xml.sax.Attributes#getValue(java.lang.String) + */ + public String getValue (String qName) + { + int max = length * 5; + for (int i = 0; i < max; i += 5) { + if (data[i+2].equals(qName)) { + return data[i+4]; + } + } + return null; + } + + + + //////////////////////////////////////////////////////////////////// + // Manipulators. + //////////////////////////////////////////////////////////////////// + + + /** + * Clear the attribute list for reuse. + * + *

          Note that no memory is actually freed by this call: + * the current arrays are kept so that they can be + * reused.

          + */ + public void clear () + { + length = 0; + } + + + /** + * Copy an entire Attributes object. + * + *

          It may be more efficient to reuse an existing object + * rather than constantly allocating new ones.

          + * + * @param atts The attributes to copy. + */ + public void setAttributes (Attributes atts) + { + clear(); + length = atts.getLength(); + data = new String[length*5]; + for (int i = 0; i < length; i++) { + data[i*5] = atts.getURI(i); + data[i*5+1] = atts.getLocalName(i); + data[i*5+2] = atts.getQName(i); + data[i*5+3] = atts.getType(i); + data[i*5+4] = atts.getValue(i); + } + } + + + /** + * Add an attribute to the end of the list. + * + *

          For the sake of speed, this method does no checking + * to see if the attribute is already in the list: that is + * the responsibility of the application.

          + * + * @param uri The Namespace URI, or the empty string if + * none is available or Namespace processing is not + * being performed. + * @param localName The local name, or the empty string if + * Namespace processing is not being performed. + * @param qName The qualified (prefixed) name, or the empty string + * if qualified names are not available. + * @param type The attribute type as a string. + * @param value The attribute value. + */ + public void addAttribute (String uri, String localName, String qName, + String type, String value) + { + ensureCapacity(length+1); + data[length*5] = uri; + data[length*5+1] = localName; + data[length*5+2] = qName; + data[length*5+3] = type; + data[length*5+4] = value; + length++; + } + + + /** + * Set an attribute in the list. + * + *

          For the sake of speed, this method does no checking + * for name conflicts or well-formedness: such checks are the + * responsibility of the application.

          + * + * @param index The index of the attribute (zero-based). + * @param uri The Namespace URI, or the empty string if + * none is available or Namespace processing is not + * being performed. + * @param localName The local name, or the empty string if + * Namespace processing is not being performed. + * @param qName The qualified name, or the empty string + * if qualified names are not available. + * @param type The attribute type as a string. + * @param value The attribute value. + * @exception java.lang.ArrayIndexOutOfBoundsException When the + * supplied index does not point to an attribute + * in the list. + */ + public void setAttribute (int index, String uri, String localName, + String qName, String type, String value) + { + if (index >= 0 && index < length) { + data[index*5] = uri; + data[index*5+1] = localName; + data[index*5+2] = qName; + data[index*5+3] = type; + data[index*5+4] = value; + } else { + badIndex(index); + } + } + + + /** + * Remove an attribute from the list. + * + * @param index The index of the attribute (zero-based). + * @exception java.lang.ArrayIndexOutOfBoundsException When the + * supplied index does not point to an attribute + * in the list. + */ + public void removeAttribute (int index) + { + if (index >= 0 && index < length) { + data[index*5] = null; + data[index*5+1] = null; + data[index*5+2] = null; + data[index*5+3] = null; + data[index*5+4] = null; + if (index < length - 1) { + System.arraycopy(data, (index+1)*5, data, index*5, + (length-index-1)*5); + } + length--; + } else { + badIndex(index); + } + } + + + /** + * Set the Namespace URI of a specific attribute. + * + * @param index The index of the attribute (zero-based). + * @param uri The attribute's Namespace URI, or the empty + * string for none. + * @exception java.lang.ArrayIndexOutOfBoundsException When the + * supplied index does not point to an attribute + * in the list. + */ + public void setURI (int index, String uri) + { + if (index >= 0 && index < length) { + data[index*5] = uri; + } else { + badIndex(index); + } + } + + + /** + * Set the local name of a specific attribute. + * + * @param index The index of the attribute (zero-based). + * @param localName The attribute's local name, or the empty + * string for none. + * @exception java.lang.ArrayIndexOutOfBoundsException When the + * supplied index does not point to an attribute + * in the list. + */ + public void setLocalName (int index, String localName) + { + if (index >= 0 && index < length) { + data[index*5+1] = localName; + } else { + badIndex(index); + } + } + + + /** + * Set the qualified name of a specific attribute. + * + * @param index The index of the attribute (zero-based). + * @param qName The attribute's qualified name, or the empty + * string for none. + * @exception java.lang.ArrayIndexOutOfBoundsException When the + * supplied index does not point to an attribute + * in the list. + */ + public void setQName (int index, String qName) + { + if (index >= 0 && index < length) { + data[index*5+2] = qName; + } else { + badIndex(index); + } + } + + + /** + * Set the type of a specific attribute. + * + * @param index The index of the attribute (zero-based). + * @param type The attribute's type. + * @exception java.lang.ArrayIndexOutOfBoundsException When the + * supplied index does not point to an attribute + * in the list. + */ + public void setType (int index, String type) + { + if (index >= 0 && index < length) { + data[index*5+3] = type; + } else { + badIndex(index); + } + } + + + /** + * Set the value of a specific attribute. + * + * @param index The index of the attribute (zero-based). + * @param value The attribute's value. + * @exception java.lang.ArrayIndexOutOfBoundsException When the + * supplied index does not point to an attribute + * in the list. + */ + public void setValue (int index, String value) + { + if (index >= 0 && index < length) { + data[index*5+4] = value; + } else { + badIndex(index); + } + } + + + + //////////////////////////////////////////////////////////////////// + // Internal methods. + //////////////////////////////////////////////////////////////////// + + + /** + * Ensure the internal array's capacity. + * + * @param n The minimum number of attributes that the array must + * be able to hold. + */ + private void ensureCapacity (int n) + { + if (n > 0 && data == null) { + data = new String[25]; + } + + int max = data.length; + if (max >= n * 5) { + return; + } + + + while (max < n * 5) { + max *= 2; + } + String newData[] = new String[max]; + System.arraycopy(data, 0, newData, 0, length*5); + data = newData; + } + + + /** + * Report a bad array index in a manipulator. + * + * @param index The index to report. + * @exception java.lang.ArrayIndexOutOfBoundsException Always. + */ + private void badIndex (int index) + throws ArrayIndexOutOfBoundsException + { + String msg = + "Attempt to modify attribute at illegal index: " + index; + throw new ArrayIndexOutOfBoundsException(msg); + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + int length; + String data []; + + } + + // end of AttributesImpl.java + diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/DefaultHandler.java gcc-3.1/libjava/org/xml/sax/helpers/DefaultHandler.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/DefaultHandler.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/DefaultHandler.java Wed Oct 31 00:48:17 2001 *************** *** 0 **** --- 1,447 ---- + // DefaultHandler.java - default implementation of the core handlers. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the public domain. + + // $Id: DefaultHandler.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import org.xml.sax.InputSource; + import org.xml.sax.Locator; + import org.xml.sax.Attributes; + import org.xml.sax.EntityResolver; + import org.xml.sax.DTDHandler; + import org.xml.sax.ContentHandler; + import org.xml.sax.ErrorHandler; + import org.xml.sax.SAXException; + import org.xml.sax.SAXParseException; + + + /** + * Default base class for SAX2 event handlers. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class is available as a convenience base class for SAX2 + * applications: it provides default implementations for all of the + * callbacks in the four core SAX2 handler classes:

          + * + *
            + *
          • {@link org.xml.sax.EntityResolver EntityResolver}
          • + *
          • {@link org.xml.sax.DTDHandler DTDHandler}
          • + *
          • {@link org.xml.sax.ContentHandler ContentHandler}
          • + *
          • {@link org.xml.sax.ErrorHandler ErrorHandler}
          • + *
          + * + *

          Application writers can extend this class when they need to + * implement only part of an interface; parser writers can + * instantiate this class to provide default handlers when the + * application has not supplied its own.

          + * + *

          This class replaces the deprecated SAX1 + * {@link org.xml.sax.HandlerBase HandlerBase} class.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.EntityResolver + * @see org.xml.sax.DTDHandler + * @see org.xml.sax.ContentHandler + * @see org.xml.sax.ErrorHandler + */ + public class DefaultHandler + implements EntityResolver, DTDHandler, ContentHandler, ErrorHandler + { + + + //////////////////////////////////////////////////////////////////// + // Default implementation of the EntityResolver interface. + //////////////////////////////////////////////////////////////////// + + /** + * Resolve an external entity. + * + *

          Always return null, so that the parser will use the system + * identifier provided in the XML document. This method implements + * the SAX default behaviour: application writers can override it + * in a subclass to do special translations such as catalog lookups + * or URI redirection.

          + * + * @param publicId The public identifier, or null if none is + * available. + * @param systemId The system identifier provided in the XML + * document. + * @return The new input source, or null to require the + * default behaviour. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.EntityResolver#resolveEntity + */ + public InputSource resolveEntity (String publicId, String systemId) + throws SAXException + { + return null; + } + + + + //////////////////////////////////////////////////////////////////// + // Default implementation of DTDHandler interface. + //////////////////////////////////////////////////////////////////// + + + /** + * Receive notification of a notation declaration. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass if they wish to keep track of the notations + * declared in a document.

          + * + * @param name The notation name. + * @param publicId The notation public identifier, or null if not + * available. + * @param systemId The notation system identifier. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DTDHandler#notationDecl + */ + public void notationDecl (String name, String publicId, String systemId) + throws SAXException + { + // no op + } + + + /** + * Receive notification of an unparsed entity declaration. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to keep track of the unparsed entities + * declared in a document.

          + * + * @param name The entity name. + * @param publicId The entity public identifier, or null if not + * available. + * @param systemId The entity system identifier. + * @param notationName The name of the associated notation. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.DTDHandler#unparsedEntityDecl + */ + public void unparsedEntityDecl (String name, String publicId, + String systemId, String notationName) + throws SAXException + { + // no op + } + + + + //////////////////////////////////////////////////////////////////// + // Default implementation of ContentHandler interface. + //////////////////////////////////////////////////////////////////// + + + /** + * Receive a Locator object for document events. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass if they wish to store the locator for use + * with other document events.

          + * + * @param locator A locator for all SAX document events. + * @see org.xml.sax.ContentHandler#setDocumentLocator + * @see org.xml.sax.Locator + */ + public void setDocumentLocator (Locator locator) + { + // no op + } + + + /** + * Receive notification of the beginning of the document. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the beginning + * of a document (such as allocating the root node of a tree or + * creating an output file).

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#startDocument + */ + public void startDocument () + throws SAXException + { + // no op + } + + + /** + * Receive notification of the end of the document. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the end + * of a document (such as finalising a tree or closing an output + * file).

          + * + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#endDocument + */ + public void endDocument () + throws SAXException + { + // no op + } + + + /** + * Receive notification of the start of a Namespace mapping. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the start of + * each Namespace prefix scope (such as storing the prefix mapping).

          + * + * @param prefix The Namespace prefix being declared. + * @param uri The Namespace URI mapped to the prefix. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#startPrefixMapping + */ + public void startPrefixMapping (String prefix, String uri) + throws SAXException + { + // no op + } + + + /** + * Receive notification of the end of a Namespace mapping. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the end of + * each prefix mapping.

          + * + * @param prefix The Namespace prefix being declared. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#endPrefixMapping + */ + public void endPrefixMapping (String prefix) + throws SAXException + { + // no op + } + + + /** + * Receive notification of the start of an element. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the start of + * each element (such as allocating a new tree node or writing + * output to a file).

          + * + * @param name The element type name. + * @param attributes The specified or defaulted attributes. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#startElement + */ + public void startElement (String uri, String localName, + String qName, Attributes attributes) + throws SAXException + { + // no op + } + + + /** + * Receive notification of the end of an element. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions at the end of + * each element (such as finalising a tree node or writing + * output to a file).

          + * + * @param name The element type name. + * @param attributes The specified or defaulted attributes. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#endElement + */ + public void endElement (String uri, String localName, String qName) + throws SAXException + { + // no op + } + + + /** + * Receive notification of character data inside an element. + * + *

          By default, do nothing. Application writers may override this + * method to take specific actions for each chunk of character data + * (such as adding the data to a node or buffer, or printing it to + * a file).

          + * + * @param ch The characters. + * @param start The start position in the character array. + * @param length The number of characters to use from the + * character array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#characters + */ + public void characters (char ch[], int start, int length) + throws SAXException + { + // no op + } + + + /** + * Receive notification of ignorable whitespace in element content. + * + *

          By default, do nothing. Application writers may override this + * method to take specific actions for each chunk of ignorable + * whitespace (such as adding data to a node or buffer, or printing + * it to a file).

          + * + * @param ch The whitespace characters. + * @param start The start position in the character array. + * @param length The number of characters to use from the + * character array. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#ignorableWhitespace + */ + public void ignorableWhitespace (char ch[], int start, int length) + throws SAXException + { + // no op + } + + + /** + * Receive notification of a processing instruction. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions for each + * processing instruction, such as setting status variables or + * invoking other methods.

          + * + * @param target The processing instruction target. + * @param data The processing instruction data, or null if + * none is supplied. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#processingInstruction + */ + public void processingInstruction (String target, String data) + throws SAXException + { + // no op + } + + + /** + * Receive notification of a skipped entity. + * + *

          By default, do nothing. Application writers may override this + * method in a subclass to take specific actions for each + * processing instruction, such as setting status variables or + * invoking other methods.

          + * + * @param name The name of the skipped entity. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ContentHandler#processingInstruction + */ + public void skippedEntity (String name) + throws SAXException + { + // no op + } + + + + //////////////////////////////////////////////////////////////////// + // Default implementation of the ErrorHandler interface. + //////////////////////////////////////////////////////////////////// + + + /** + * Receive notification of a parser warning. + * + *

          The default implementation does nothing. Application writers + * may override this method in a subclass to take specific actions + * for each warning, such as inserting the message in a log file or + * printing it to the console.

          + * + * @param e The warning information encoded as an exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ErrorHandler#warning + * @see org.xml.sax.SAXParseException + */ + public void warning (SAXParseException e) + throws SAXException + { + // no op + } + + + /** + * Receive notification of a recoverable parser error. + * + *

          The default implementation does nothing. Application writers + * may override this method in a subclass to take specific actions + * for each error, such as inserting the message in a log file or + * printing it to the console.

          + * + * @param e The warning information encoded as an exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ErrorHandler#warning + * @see org.xml.sax.SAXParseException + */ + public void error (SAXParseException e) + throws SAXException + { + // no op + } + + + /** + * Report a fatal XML parsing error. + * + *

          The default implementation throws a SAXParseException. + * Application writers may override this method in a subclass if + * they need to take specific actions for each fatal error (such as + * collecting all of the errors into a single report): in any case, + * the application must stop all regular processing when this + * method is invoked, since the document is no longer reliable, and + * the parser may no longer report parsing events.

          + * + * @param e The error information encoded as an exception. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @see org.xml.sax.ErrorHandler#fatalError + * @see org.xml.sax.SAXParseException + */ + public void fatalError (SAXParseException e) + throws SAXException + { + throw e; + } + + } + + // end of DefaultHandler.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/LocatorImpl.java gcc-3.1/libjava/org/xml/sax/helpers/LocatorImpl.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/LocatorImpl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/LocatorImpl.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,212 ---- + // SAX default implementation for Locator. + // No warranty; no copyright -- use this as you will. + // $Id: LocatorImpl.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import org.xml.sax.Locator; + + + /** + * Provide an optional convenience implementation of Locator. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class is available mainly for application writers, who + * can use it to make a persistent snapshot of a locator at any + * point during a document parse:

          + * + *
          +  * Locator locator;
          +  * Locator startloc;
          +  *
          +  * public void setLocator (Locator locator)
          +  * {
          +  *         // note the locator
          +  *   this.locator = locator;
          +  * }
          +  *
          +  * public void startDocument ()
          +  * {
          +  *         // save the location of the start of the document
          +  *         // for future use.
          +  *   Locator startloc = new LocatorImpl(locator);
          +  * }
          +  *
          + * + *

          Normally, parser writers will not use this class, since it + * is more efficient to provide location information only when + * requested, rather than constantly updating a Locator object.

          + * + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Locator Locator + */ + public class LocatorImpl implements Locator + { + + + /** + * Zero-argument constructor. + * + *

          This will not normally be useful, since the main purpose + * of this class is to make a snapshot of an existing Locator.

          + */ + public LocatorImpl () + { + } + + + /** + * Copy constructor. + * + *

          Create a persistent copy of the current state of a locator. + * When the original locator changes, this copy will still keep + * the original values (and it can be used outside the scope of + * DocumentHandler methods).

          + * + * @param locator The locator to copy. + */ + public LocatorImpl (Locator locator) + { + setPublicId(locator.getPublicId()); + setSystemId(locator.getSystemId()); + setLineNumber(locator.getLineNumber()); + setColumnNumber(locator.getColumnNumber()); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.Locator + //////////////////////////////////////////////////////////////////// + + + /** + * Return the saved public identifier. + * + * @return The public identifier as a string, or null if none + * is available. + * @see org.xml.sax.Locator#getPublicId + * @see #setPublicId + */ + public String getPublicId () + { + return publicId; + } + + + /** + * Return the saved system identifier. + * + * @return The system identifier as a string, or null if none + * is available. + * @see org.xml.sax.Locator#getSystemId + * @see #setSystemId + */ + public String getSystemId () + { + return systemId; + } + + + /** + * Return the saved line number (1-based). + * + * @return The line number as an integer, or -1 if none is available. + * @see org.xml.sax.Locator#getLineNumber + * @see #setLineNumber + */ + public int getLineNumber () + { + return lineNumber; + } + + + /** + * Return the saved column number (1-based). + * + * @return The column number as an integer, or -1 if none is available. + * @see org.xml.sax.Locator#getColumnNumber + * @see #setColumnNumber + */ + public int getColumnNumber () + { + return columnNumber; + } + + + + //////////////////////////////////////////////////////////////////// + // Setters for the properties (not in org.xml.sax.Locator) + //////////////////////////////////////////////////////////////////// + + + /** + * Set the public identifier for this locator. + * + * @param publicId The new public identifier, or null + * if none is available. + * @see #getPublicId + */ + public void setPublicId (String publicId) + { + this.publicId = publicId; + } + + + /** + * Set the system identifier for this locator. + * + * @param systemId The new system identifier, or null + * if none is available. + * @see #getSystemId + */ + public void setSystemId (String systemId) + { + this.systemId = systemId; + } + + + /** + * Set the line number for this locator (1-based). + * + * @param lineNumber The line number, or -1 if none is available. + * @see #getLineNumber + */ + public void setLineNumber (int lineNumber) + { + this.lineNumber = lineNumber; + } + + + /** + * Set the column number for this locator (1-based). + * + * @param columnNumber The column number, or -1 if none is available. + * @see #getColumnNumber + */ + public void setColumnNumber (int columnNumber) + { + this.columnNumber = columnNumber; + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private String publicId; + private String systemId; + private int lineNumber; + private int columnNumber; + + } + + // end of LocatorImpl.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/NamespaceSupport.java gcc-3.1/libjava/org/xml/sax/helpers/NamespaceSupport.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/NamespaceSupport.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/NamespaceSupport.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,689 ---- + // NamespaceSupport.java - generic Namespace support for SAX. + // Written by David Megginson, sax@megginson.com + // This class is in the Public Domain. NO WARRANTY! + + // $Id: NamespaceSupport.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import java.util.EmptyStackException; + import java.util.Enumeration; + import java.util.Hashtable; + import java.util.Vector; + + + /** + * Encapsulate Namespace logic for use by SAX drivers. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class encapsulates the logic of Namespace processing: + * it tracks the declarations currently in force for each context + * and automatically processes qualified XML 1.0 names into their + * Namespace parts; it can also be used in reverse for generating + * XML 1.0 from Namespaces.

          + * + *

          Namespace support objects are reusable, but the reset method + * must be invoked between each session.

          + * + *

          Here is a simple session:

          + * + *
          +  * String parts[] = new String[3];
          +  * NamespaceSupport support = new NamespaceSupport();
          +  *
          +  * support.pushContext();
          +  * support.declarePrefix("", "http://www.w3.org/1999/xhtml");
          +  * support.declarePrefix("dc", "http://www.purl.org/dc#");
          +  *
          +  * String parts[] = support.processName("p", parts, false);
          +  * System.out.println("Namespace URI: " + parts[0]);
          +  * System.out.println("Local name: " + parts[1]);
          +  * System.out.println("Raw name: " + parts[2]);
          + 
          +  * String parts[] = support.processName("dc:title", parts, false);
          +  * System.out.println("Namespace URI: " + parts[0]);
          +  * System.out.println("Local name: " + parts[1]);
          +  * System.out.println("Raw name: " + parts[2]);
          + 
          +  * support.popContext();
          +  * 
          + * + *

          Note that this class is optimized for the use case where most + * elements do not contain Namespace declarations: if the same + * prefix/URI mapping is repeated for each context (for example), this + * class will be somewhat less efficient.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + */ + public class NamespaceSupport + { + + + //////////////////////////////////////////////////////////////////// + // Constants. + //////////////////////////////////////////////////////////////////// + + + /** + * The XML Namespace as a constant. + * + *

          This is the Namespace URI that is automatically mapped + * to the "xml" prefix.

          + */ + public final static String XMLNS = + "http://www.w3.org/XML/1998/namespace"; + + + /** + * An empty enumeration. + */ + private final static Enumeration EMPTY_ENUMERATION = + new Vector().elements(); + + + //////////////////////////////////////////////////////////////////// + // Constructor. + //////////////////////////////////////////////////////////////////// + + + /** + * Create a new Namespace support object. + */ + public NamespaceSupport () + { + reset(); + } + + + + //////////////////////////////////////////////////////////////////// + // Context management. + //////////////////////////////////////////////////////////////////// + + + /** + * Reset this Namespace support object for reuse. + * + *

          It is necessary to invoke this method before reusing the + * Namespace support object for a new session.

          + */ + public void reset () + { + contexts = new Context[32]; + contextPos = 0; + contexts[contextPos] = currentContext = new Context(); + currentContext.declarePrefix("xml", XMLNS); + } + + + /** + * Start a new Namespace context. + * + *

          Normally, you should push a new context at the beginning + * of each XML element: the new context will automatically inherit + * the declarations of its parent context, but it will also keep + * track of which declarations were made within this context.

          + * + *

          The Namespace support object always starts with a base context + * already in force: in this context, only the "xml" prefix is + * declared.

          + * + * @see #popContext + */ + public void pushContext () + { + int max = contexts.length; + contextPos++; + + // Extend the array if necessary + if (contextPos >= max) { + Context newContexts[] = new Context[max*2]; + System.arraycopy(contexts, 0, newContexts, 0, max); + max *= 2; + contexts = newContexts; + } + + // Allocate the context if necessary. + currentContext = contexts[contextPos]; + if (currentContext == null) { + contexts[contextPos] = currentContext = new Context(); + } + + // Set the parent, if any. + if (contextPos > 0) { + currentContext.setParent(contexts[contextPos - 1]); + } + } + + + /** + * Revert to the previous Namespace context. + * + *

          Normally, you should pop the context at the end of each + * XML element. After popping the context, all Namespace prefix + * mappings that were previously in force are restored.

          + * + *

          You must not attempt to declare additional Namespace + * prefixes after popping a context, unless you push another + * context first.

          + * + * @see #pushContext + */ + public void popContext () + { + contextPos--; + if (contextPos < 0) { + throw new EmptyStackException(); + } + currentContext = contexts[contextPos]; + } + + + + //////////////////////////////////////////////////////////////////// + // Operations within a context. + //////////////////////////////////////////////////////////////////// + + + /** + * Declare a Namespace prefix. + * + *

          This method declares a prefix in the current Namespace + * context; the prefix will remain in force until this context + * is popped, unless it is shadowed in a descendant context.

          + * + *

          To declare a default Namespace, use the empty string. The + * prefix must not be "xml" or "xmlns".

          + * + *

          Note that you must not declare a prefix after + * you've pushed and popped another Namespace.

          + * + *

          Note that there is an asymmetry in this library: while {@link + * #getPrefix getPrefix} will not return the default "" prefix, + * even if you have declared one; to check for a default prefix, + * you have to look it up explicitly using {@link #getURI getURI}. + * This asymmetry exists to make it easier to look up prefixes + * for attribute names, where the default prefix is not allowed.

          + * + * @param prefix The prefix to declare, or null for the empty + * string. + * @param uri The Namespace URI to associate with the prefix. + * @return true if the prefix was legal, false otherwise + * @see #processName + * @see #getURI + * @see #getPrefix + */ + public boolean declarePrefix (String prefix, String uri) + { + if (prefix.equals("xml") || prefix.equals("xmlns")) { + return false; + } else { + currentContext.declarePrefix(prefix, uri); + return true; + } + } + + + /** + * Process a raw XML 1.0 name. + * + *

          This method processes a raw XML 1.0 name in the current + * context by removing the prefix and looking it up among the + * prefixes currently declared. The return value will be the + * array supplied by the caller, filled in as follows:

          + * + *
          + *
          parts[0]
          + *
          The Namespace URI, or an empty string if none is + * in use.
          + *
          parts[1]
          + *
          The local name (without prefix).
          + *
          parts[2]
          + *
          The original raw name.
          + *
          + * + *

          All of the strings in the array will be internalized. If + * the raw name has a prefix that has not been declared, then + * the return value will be null.

          + * + *

          Note that attribute names are processed differently than + * element names: an unprefixed element name will received the + * default Namespace (if any), while an unprefixed element name + * will not.

          + * + * @param qName The raw XML 1.0 name to be processed. + * @param parts An array supplied by the caller, capable of + * holding at least three members. + * @param isAttribute A flag indicating whether this is an + * attribute name (true) or an element name (false). + * @return The supplied array holding three internalized strings + * representing the Namespace URI (or empty string), the + * local name, and the raw XML 1.0 name; or null if there + * is an undeclared prefix. + * @see #declarePrefix + * @see java.lang.String#intern */ + public String [] processName (String qName, String parts[], + boolean isAttribute) + { + String myParts[] = currentContext.processName(qName, isAttribute); + if (myParts == null) { + return null; + } else { + parts[0] = myParts[0]; + parts[1] = myParts[1]; + parts[2] = myParts[2]; + return parts; + } + } + + + /** + * Look up a prefix and get the currently-mapped Namespace URI. + * + *

          This method looks up the prefix in the current context. + * Use the empty string ("") for the default Namespace.

          + * + * @param prefix The prefix to look up. + * @return The associated Namespace URI, or null if the prefix + * is undeclared in this context. + * @see #getPrefix + * @see #getPrefixes + */ + public String getURI (String prefix) + { + return currentContext.getURI(prefix); + } + + + /** + * Return an enumeration of all prefixes currently declared. + * + *

          Note: if there is a default prefix, it will not be + * returned in this enumeration; check for the default prefix + * using the {@link #getURI getURI} with an argument of "".

          + * + * @return An enumeration of all prefixes declared in the + * current context except for the empty (default) + * prefix. + * @see #getDeclaredPrefixes + * @see #getURI + */ + public Enumeration getPrefixes () + { + return currentContext.getPrefixes(); + } + + + /** + * Return one of the prefixes mapped to a Namespace URI. + * + *

          If more than one prefix is currently mapped to the same + * URI, this method will make an arbitrary selection; if you + * want all of the prefixes, use the {@link #getPrefixes} + * method instead.

          + * + *

          Note: this will never return the empty (default) prefix; + * to check for a default prefix, use the {@link #getURI getURI} + * method with an argument of "".

          + * + * @param uri The Namespace URI. + * @param isAttribute true if this prefix is for an attribute + * (and the default Namespace is not allowed). + * @return One of the prefixes currently mapped to the URI supplied, + * or null if none is mapped or if the URI is assigned to + * the default Namespace. + * @see #getPrefixes(java.lang.String) + * @see #getURI + */ + public String getPrefix (String uri) + { + return currentContext.getPrefix(uri); + } + + + /** + * Return an enumeration of all prefixes currently declared for a URI. + * + *

          This method returns prefixes mapped to a specific Namespace + * URI. The xml: prefix will be included. If you want only one + * prefix that's mapped to the Namespace URI, and you don't care + * which one you get, use the {@link #getPrefix getPrefix} + * method instead.

          + * + *

          Note: the empty (default) prefix is never included + * in this enumeration; to check for the presence of a default + * Namespace, use the {@link #getURI getURI} method with an + * argument of "".

          + * + * @param uri The Namespace URI. + * @return An enumeration of all prefixes declared in the + * current context. + * @see #getPrefix + * @see #getDeclaredPrefixes + * @see #getURI + */ + public Enumeration getPrefixes (String uri) + { + Vector prefixes = new Vector(); + Enumeration allPrefixes = getPrefixes(); + while (allPrefixes.hasMoreElements()) { + String prefix = (String)allPrefixes.nextElement(); + if (uri.equals(getURI(prefix))) { + prefixes.addElement(prefix); + } + } + return prefixes.elements(); + } + + + /** + * Return an enumeration of all prefixes declared in this context. + * + *

          The empty (default) prefix will be included in this + * enumeration; note that this behaviour differs from that of + * {@link #getPrefix} and {@link #getPrefixes}.

          + * + * @return An enumeration of all prefixes declared in this + * context. + * @see #getPrefixes + * @see #getURI + */ + public Enumeration getDeclaredPrefixes () + { + return currentContext.getDeclaredPrefixes(); + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private Context contexts[]; + private Context currentContext; + private int contextPos; + + + + //////////////////////////////////////////////////////////////////// + // Internal classes. + //////////////////////////////////////////////////////////////////// + + /** + * Internal class for a single Namespace context. + * + *

          This module caches and reuses Namespace contexts, so the number allocated + * will be equal to the element depth of the document, not to the total + * number of elements (i.e. 5-10 rather than tens of thousands).

          + */ + final class Context { + + /** + * Create the root-level Namespace context. + */ + Context () + { + copyTables(); + } + + + /** + * (Re)set the parent of this Namespace context. + * + * @param context The parent Namespace context object. + */ + void setParent (Context parent) + { + this.parent = parent; + declarations = null; + prefixTable = parent.prefixTable; + uriTable = parent.uriTable; + elementNameTable = parent.elementNameTable; + attributeNameTable = parent.attributeNameTable; + defaultNS = parent.defaultNS; + tablesDirty = false; + } + + + /** + * Declare a Namespace prefix for this context. + * + * @param prefix The prefix to declare. + * @param uri The associated Namespace URI. + * @see org.xml.sax.helpers.NamespaceSupport#declarePrefix + */ + void declarePrefix (String prefix, String uri) + { + // Lazy processing... + if (!tablesDirty) { + copyTables(); + } + if (declarations == null) { + declarations = new Vector(); + } + + prefix = prefix.intern(); + uri = uri.intern(); + if ("".equals(prefix)) { + if ("".equals(uri)) { + defaultNS = null; + } else { + defaultNS = uri; + } + } else { + prefixTable.put(prefix, uri); + uriTable.put(uri, prefix); // may wipe out another prefix + } + declarations.addElement(prefix); + } + + + /** + * Process a raw XML 1.0 name in this context. + * + * @param qName The raw XML 1.0 name. + * @param isAttribute true if this is an attribute name. + * @return An array of three strings containing the + * URI part (or empty string), the local part, + * and the raw name, all internalized, or null + * if there is an undeclared prefix. + * @see org.xml.sax.helpers.NamespaceSupport#processName + */ + String [] processName (String qName, boolean isAttribute) + { + String name[]; + Hashtable table; + + // Select the appropriate table. + if (isAttribute) { + table = elementNameTable; + } else { + table = attributeNameTable; + } + + // Start by looking in the cache, and + // return immediately if the name + // is already known in this content + name = (String[])table.get(qName); + if (name != null) { + return name; + } + + // We haven't seen this name in this + // context before. + name = new String[3]; + int index = qName.indexOf(':'); + + + // No prefix. + if (index == -1) { + if (isAttribute || defaultNS == null) { + name[0] = ""; + } else { + name[0] = defaultNS; + } + name[1] = qName.intern(); + name[2] = name[1]; + } + + // Prefix + else { + String prefix = qName.substring(0, index); + String local = qName.substring(index+1); + String uri; + if ("".equals(prefix)) { + uri = defaultNS; + } else { + uri = (String)prefixTable.get(prefix); + } + if (uri == null) { + return null; + } + name[0] = uri; + name[1] = local.intern(); + name[2] = qName.intern(); + } + + // Save in the cache for future use. + table.put(name[2], name); + tablesDirty = true; + return name; + } + + + /** + * Look up the URI associated with a prefix in this context. + * + * @param prefix The prefix to look up. + * @return The associated Namespace URI, or null if none is + * declared. + * @see org.xml.sax.helpers.NamespaceSupport#getURI + */ + String getURI (String prefix) + { + if ("".equals(prefix)) { + return defaultNS; + } else if (prefixTable == null) { + return null; + } else { + return (String)prefixTable.get(prefix); + } + } + + + /** + * Look up one of the prefixes associated with a URI in this context. + * + *

          Since many prefixes may be mapped to the same URI, + * the return value may be unreliable.

          + * + * @param uri The URI to look up. + * @return The associated prefix, or null if none is declared. + * @see org.xml.sax.helpers.NamespaceSupport#getPrefix + */ + String getPrefix (String uri) + { + if (uriTable == null) { + return null; + } else { + return (String)uriTable.get(uri); + } + } + + + /** + * Return an enumeration of prefixes declared in this context. + * + * @return An enumeration of prefixes (possibly empty). + * @see org.xml.sax.helpers.NamespaceSupport#getDeclaredPrefixes + */ + Enumeration getDeclaredPrefixes () + { + if (declarations == null) { + return EMPTY_ENUMERATION; + } else { + return declarations.elements(); + } + } + + + /** + * Return an enumeration of all prefixes currently in force. + * + *

          The default prefix, if in force, is not + * returned, and will have to be checked for separately.

          + * + * @return An enumeration of prefixes (never empty). + * @see org.xml.sax.helpers.NamespaceSupport#getPrefixes + */ + Enumeration getPrefixes () + { + if (prefixTable == null) { + return EMPTY_ENUMERATION; + } else { + return prefixTable.keys(); + } + } + + + + //////////////////////////////////////////////////////////////// + // Internal methods. + //////////////////////////////////////////////////////////////// + + + /** + * Copy on write for the internal tables in this context. + * + *

          This class is optimized for the normal case where most + * elements do not contain Namespace declarations.

          + */ + private void copyTables () + { + if (prefixTable != null) { + prefixTable = (Hashtable)prefixTable.clone(); + } else { + prefixTable = new Hashtable(); + } + if (uriTable != null) { + uriTable = (Hashtable)uriTable.clone(); + } else { + uriTable = new Hashtable(); + } + elementNameTable = new Hashtable(); + attributeNameTable = new Hashtable(); + tablesDirty = true; + } + + + + //////////////////////////////////////////////////////////////// + // Protected state. + //////////////////////////////////////////////////////////////// + + Hashtable prefixTable; + Hashtable uriTable; + Hashtable elementNameTable; + Hashtable attributeNameTable; + String defaultNS = null; + + + + //////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////// + + private Vector declarations = null; + private boolean tablesDirty = false; + private Context parent = null; + } + } + + // end of NamespaceSupport.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/ParserAdapter.java gcc-3.1/libjava/org/xml/sax/helpers/ParserAdapter.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/ParserAdapter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/ParserAdapter.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,1008 ---- + // ParserAdapter.java - adapt a SAX1 Parser to a SAX2 XMLReader. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the public domain. + + // $Id: ParserAdapter.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import java.io.IOException; + import java.util.Enumeration; + + import org.xml.sax.Parser; // deprecated + import org.xml.sax.InputSource; + import org.xml.sax.Locator; + import org.xml.sax.AttributeList; // deprecated + import org.xml.sax.EntityResolver; + import org.xml.sax.DTDHandler; + import org.xml.sax.DocumentHandler; // deprecated + import org.xml.sax.ErrorHandler; + import org.xml.sax.SAXException; + import org.xml.sax.SAXParseException; + + import org.xml.sax.XMLReader; + import org.xml.sax.Attributes; + import org.xml.sax.ContentHandler; + import org.xml.sax.SAXNotRecognizedException; + import org.xml.sax.SAXNotSupportedException; + + + /** + * Adapt a SAX1 Parser as a SAX2 XMLReader. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class wraps a SAX1 {@link org.xml.sax.Parser Parser} + * and makes it act as a SAX2 {@link org.xml.sax.XMLReader XMLReader}, + * with feature, property, and Namespace support. Note + * that it is not possible to report {@link org.xml.sax.ContentHandler#skippedEntity + * skippedEntity} events, since SAX1 does not make that information available.

          + * + *

          This adapter does not test for duplicate Namespace-qualified + * attribute names.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.helpers.XMLReaderAdapter + * @see org.xml.sax.XMLReader + * @see org.xml.sax.Parser + */ + public class ParserAdapter implements XMLReader, DocumentHandler + { + + + //////////////////////////////////////////////////////////////////// + // Constructors. + //////////////////////////////////////////////////////////////////// + + + /** + * Construct a new parser adapter. + * + *

          Use the "org.xml.sax.parser" property to locate the + * embedded SAX1 driver.

          + * + * @exception org.xml.sax.SAXException If the embedded driver + * cannot be instantiated or if the + * org.xml.sax.parser property is not specified. + */ + public ParserAdapter () + throws SAXException + { + super(); + + String driver = System.getProperty("org.xml.sax.parser"); + + try { + setup(ParserFactory.makeParser()); + } catch (ClassNotFoundException e1) { + throw new + SAXException("Cannot find SAX1 driver class " + + driver, e1); + } catch (IllegalAccessException e2) { + throw new + SAXException("SAX1 driver class " + + driver + + " found but cannot be loaded", e2); + } catch (InstantiationException e3) { + throw new + SAXException("SAX1 driver class " + + driver + + " loaded but cannot be instantiated", e3); + } catch (ClassCastException e4) { + throw new + SAXException("SAX1 driver class " + + driver + + " does not implement org.xml.sax.Parser"); + } catch (NullPointerException e5) { + throw new + SAXException("System property org.xml.sax.parser not specified"); + } + } + + + /** + * Construct a new parser adapter. + * + *

          Note that the embedded parser cannot be changed once the + * adapter is created; to embed a different parser, allocate + * a new ParserAdapter.

          + * + * @param parser The SAX1 parser to embed. + * @exception java.lang.NullPointerException If the parser parameter + * is null. + */ + public ParserAdapter (Parser parser) + { + super(); + setup(parser); + } + + + /** + * Internal setup method. + * + * @param parser The embedded parser. + * @exception java.lang.NullPointerException If the parser parameter + * is null. + */ + private void setup (Parser parser) + { + if (parser == null) { + throw new + NullPointerException("Parser argument must not be null"); + } + this.parser = parser; + atts = new AttributesImpl(); + nsSupport = new NamespaceSupport(); + attAdapter = new AttributeListAdapter(); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.XMLReader. + //////////////////////////////////////////////////////////////////// + + + // + // Internal constants for the sake of convenience. + // + private final static String FEATURES = "http://xml.org/sax/features/"; + private final static String NAMESPACES = FEATURES + "namespaces"; + private final static String NAMESPACE_PREFIXES = FEATURES + "namespace-prefixes"; + private final static String VALIDATION = FEATURES + "validation"; + private final static String EXTERNAL_GENERAL = + FEATURES + "external-general-entities"; + private final static String EXTERNAL_PARAMETER = + FEATURES + "external-parameter-entities"; + + + /** + * Set a feature for the parser. + * + *

          The only features supported are namespaces and + * namespace-prefixes.

          + * + * @param name The feature name, as a complete URI. + * @param state The requested feature state. + * @exception org.xml.sax.SAXNotRecognizedException If the feature + * name is not known. + * @exception org.xml.sax.SAXNotSupportedException If the feature + * state is not supported. + * @see org.xml.sax.XMLReader#setFeature + */ + public void setFeature (String name, boolean state) + throws SAXNotRecognizedException, SAXNotSupportedException + { + if (name.equals(NAMESPACES)) { + checkNotParsing("feature", name); + namespaces = state; + if (!namespaces && !prefixes) { + prefixes = true; + } + } else if (name.equals(NAMESPACE_PREFIXES)) { + checkNotParsing("feature", name); + prefixes = state; + if (!prefixes && !namespaces) { + namespaces = true; + } + } else if (name.equals(VALIDATION) || + name.equals(EXTERNAL_GENERAL) || + name.equals(EXTERNAL_PARAMETER)) { + throw new SAXNotSupportedException("Feature: " + name); + } else { + throw new SAXNotRecognizedException("Feature: " + name); + } + } + + + /** + * Check a parser feature. + * + *

          The only features supported are namespaces and + * namespace-prefixes.

          + * + * @param name The feature name, as a complete URI. + * @return The current feature state. + * @exception org.xml.sax.SAXNotRecognizedException If the feature + * name is not known. + * @exception org.xml.sax.SAXNotSupportedException If querying the + * feature state is not supported. + * @see org.xml.sax.XMLReader#setFeature + */ + public boolean getFeature (String name) + throws SAXNotRecognizedException, SAXNotSupportedException + { + if (name.equals(NAMESPACES)) { + return namespaces; + } else if (name.equals(NAMESPACE_PREFIXES)) { + return prefixes; + } else if (name.equals(VALIDATION) || + name.equals(EXTERNAL_GENERAL) || + name.equals(EXTERNAL_PARAMETER)) { + throw new SAXNotSupportedException("Feature: " + name); + } else { + throw new SAXNotRecognizedException("Feature: " + name); + } + } + + + /** + * Set a parser property. + * + *

          No special properties are currently supported.

          + * + * @param name The property name. + * @param value The property value. + * @exception org.xml.sax.SAXNotRecognizedException If the feature + * name is not known. + * @exception org.xml.sax.SAXNotSupportedException If the feature + * state is not supported. + * @see org.xml.sax.XMLReader#setProperty + */ + public void setProperty (String name, Object value) + throws SAXNotRecognizedException, SAXNotSupportedException + { + throw new SAXNotRecognizedException("Property: " + name); + } + + + /** + * Get a parser property. + * + *

          No special properties are currently supported.

          + * + * @param name The property name. + * @return The property value. + * @exception org.xml.sax.SAXNotRecognizedException If the feature + * name is not known. + * @exception org.xml.sax.SAXNotSupportedException If the feature + * state is not supported. + * @see org.xml.sax.XMLReader#getProperty + */ + public Object getProperty (String name) + throws SAXNotRecognizedException, SAXNotSupportedException + { + throw new SAXNotRecognizedException("Property: " + name); + } + + + /** + * Set the entity resolver. + * + * @param resolver The new entity resolver. + * @exception java.lang.NullPointerException If the entity resolver + * parameter is null. + * @see org.xml.sax.XMLReader#setEntityResolver + */ + public void setEntityResolver (EntityResolver resolver) + { + if (resolver == null) { + throw new NullPointerException("Null entity resolver"); + } + entityResolver = resolver; + } + + + /** + * Return the current entity resolver. + * + * @return The current entity resolver, or null if none was supplied. + * @see org.xml.sax.XMLReader#getEntityResolver + */ + public EntityResolver getEntityResolver () + { + return entityResolver; + } + + + /** + * Set the DTD handler. + * + * @param resolver The new DTD handler. + * @exception java.lang.NullPointerException If the DTD handler + * parameter is null. + * @see org.xml.sax.XMLReader#setEntityResolver + */ + public void setDTDHandler (DTDHandler handler) + { + if (handler == null) { + throw new NullPointerException("Null DTD handler"); + } + dtdHandler = handler; + } + + + /** + * Return the current DTD handler. + * + * @return The current DTD handler, or null if none was supplied. + * @see org.xml.sax.XMLReader#getEntityResolver + */ + public DTDHandler getDTDHandler () + { + return dtdHandler; + } + + + /** + * Set the content handler. + * + * @param resolver The new content handler. + * @exception java.lang.NullPointerException If the content handler + * parameter is null. + * @see org.xml.sax.XMLReader#setEntityResolver + */ + public void setContentHandler (ContentHandler handler) + { + if (handler == null) { + throw new NullPointerException("Null content handler"); + } + contentHandler = handler; + } + + + /** + * Return the current content handler. + * + * @return The current content handler, or null if none was supplied. + * @see org.xml.sax.XMLReader#getEntityResolver + */ + public ContentHandler getContentHandler () + { + return contentHandler; + } + + + /** + * Set the error handler. + * + * @param resolver The new error handler. + * @exception java.lang.NullPointerException If the error handler + * parameter is null. + * @see org.xml.sax.XMLReader#setEntityResolver + */ + public void setErrorHandler (ErrorHandler handler) + { + if (handler == null) { + throw new NullPointerException("Null error handler"); + } + errorHandler = handler; + } + + + /** + * Return the current error handler. + * + * @return The current error handler, or null if none was supplied. + * @see org.xml.sax.XMLReader#getEntityResolver + */ + public ErrorHandler getErrorHandler () + { + return errorHandler; + } + + + /** + * Parse an XML document. + * + * @param systemId The absolute URL of the document. + * @exception java.io.IOException If there is a problem reading + * the raw content of the document. + * @exception org.xml.sax.SAXException If there is a problem + * processing the document. + * @see #parse(org.xml.sax.InputSource) + * @see org.xml.sax.Parser#parse(java.lang.String) + */ + public void parse (String systemId) + throws IOException, SAXException + { + parse(new InputSource(systemId)); + } + + + /** + * Parse an XML document. + * + * @param input An input source for the document. + * @exception java.io.IOException If there is a problem reading + * the raw content of the document. + * @exception org.xml.sax.SAXException If there is a problem + * processing the document. + * @see #parse(java.lang.String) + * @see org.xml.sax.Parser#parse(org.xml.sax.InputSource) + */ + public void parse (InputSource input) + throws IOException, SAXException + { + if (parsing) { + throw new SAXException("Parser is already in use"); + } + setupParser(); + parsing = true; + try { + parser.parse(input); + } finally { + parsing = false; + } + parsing = false; + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.DocumentHandler. + //////////////////////////////////////////////////////////////////// + + + /** + * Adapt a SAX1 document locator event. + * + * @param locator A document locator. + * @see org.xml.sax.ContentHandler#setDocumentLocator + */ + public void setDocumentLocator (Locator locator) + { + this.locator = locator; + if (contentHandler != null) { + contentHandler.setDocumentLocator(locator); + } + } + + + /** + * Adapt a SAX1 start document event. + * + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.DocumentHandler#startDocument + */ + public void startDocument () + throws SAXException + { + if (contentHandler != null) { + contentHandler.startDocument(); + } + } + + + /** + * Adapt a SAX1 end document event. + * + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.DocumentHandler#endDocument + */ + public void endDocument () + throws SAXException + { + if (contentHandler != null) { + contentHandler.endDocument(); + } + } + + + /** + * Adapt a SAX1 startElement event. + * + *

          If necessary, perform Namespace processing.

          + * + * @param qName The qualified (prefixed) name. + * @param qAtts The XML 1.0 attribute list (with qnames). + */ + public void startElement (String qName, AttributeList qAtts) + throws SAXException + { + // If we're not doing Namespace + // processing, dispatch this quickly. + if (!namespaces) { + if (contentHandler != null) { + attAdapter.setAttributeList(qAtts); + contentHandler.startElement("", "", qName.intern(), + attAdapter); + } + return; + } + + + // OK, we're doing Namespace processing. + nsSupport.pushContext(); + boolean seenDecl = false; + atts.clear(); + + // Take a first pass and copy all + // attributes into the SAX2 attribute + // list, noting any Namespace + // declarations. + int length = qAtts.getLength(); + for (int i = 0; i < length; i++) { + String attQName = qAtts.getName(i); + String type = qAtts.getType(i); + String value = qAtts.getValue(i); + + // Found a declaration... + if (attQName.startsWith("xmlns")) { + String prefix; + int n = attQName.indexOf(':'); + if (n == -1) { + prefix = ""; + } else { + prefix = attQName.substring(n+1); + } + if (!nsSupport.declarePrefix(prefix, value)) { + reportError("Illegal Namespace prefix: " + prefix); + } + if (contentHandler != null) { + contentHandler.startPrefixMapping(prefix, value); + } + // We may still have to add this to + // the list. + if (prefixes) { + atts.addAttribute("", "", attQName.intern(), + type, value); + } + seenDecl = true; + + // This isn't a declaration. + } else { + String attName[] = processName(attQName, true); + atts.addAttribute(attName[0], attName[1], attName[2], + type, value); + } + } + + // If there was a Namespace declaration, + // we have to make a second pass just + // to be safe -- this will happen very + // rarely, possibly only once for each + // document. + if (seenDecl) { + length = atts.getLength(); + for (int i = 0; i < length; i++) { + String attQName = atts.getQName(i); + if (!attQName.startsWith("xmlns")) { + String attName[] = processName(attQName, true); + atts.setURI(i, attName[0]); + atts.setLocalName(i, attName[1]); + } + } + } + + // OK, finally report the event. + if (contentHandler != null) { + String name[] = processName(qName, false); + contentHandler.startElement(name[0], name[1], name[2], atts); + } + } + + + /** + * Adapt a SAX1 end element event. + * + * @param qName The qualified (prefixed) name. + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.DocumentHandler#endElement + */ + public void endElement (String qName) + throws SAXException + { + // If we're not doing Namespace + // processing, dispatch this quickly. + if (!namespaces) { + if (contentHandler != null) { + contentHandler.endElement("", "", qName.intern()); + } + return; + } + + // Split the name. + String names[] = processName(qName, false); + if (contentHandler != null) { + contentHandler.endElement(names[0], names[1], names[2]); + Enumeration prefixes = nsSupport.getDeclaredPrefixes(); + while (prefixes.hasMoreElements()) { + String prefix = (String)prefixes.nextElement(); + contentHandler.endPrefixMapping(prefix); + } + } + nsSupport.popContext(); + } + + + /** + * Adapt a SAX1 characters event. + * + * @param ch An array of characters. + * @param start The starting position in the array. + * @param length The number of characters to use. + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.DocumentHandler#characters + */ + public void characters (char ch[], int start, int length) + throws SAXException + { + if (contentHandler != null) { + contentHandler.characters(ch, start, length); + } + } + + + /** + * Adapt a SAX1 ignorable whitespace event. + * + * @param ch An array of characters. + * @param start The starting position in the array. + * @param length The number of characters to use. + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.DocumentHandler#ignorableWhitespace + */ + public void ignorableWhitespace (char ch[], int start, int length) + throws SAXException + { + if (contentHandler != null) { + contentHandler.ignorableWhitespace(ch, start, length); + } + } + + + /** + * Adapt a SAX1 processing instruction event. + * + * @param target The processing instruction target. + * @param data The remainder of the processing instruction + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.DocumentHandler#processingInstruction + */ + public void processingInstruction (String target, String data) + throws SAXException + { + if (contentHandler != null) { + contentHandler.processingInstruction(target, data); + } + } + + + + //////////////////////////////////////////////////////////////////// + // Internal utility methods. + //////////////////////////////////////////////////////////////////// + + + /** + * Initialize the parser before each run. + */ + private void setupParser () + { + nsSupport.reset(); + + if (entityResolver != null) { + parser.setEntityResolver(entityResolver); + } + if (dtdHandler != null) { + parser.setDTDHandler(dtdHandler); + } + if (errorHandler != null) { + parser.setErrorHandler(errorHandler); + } + parser.setDocumentHandler(this); + locator = null; + } + + + /** + * Process a qualified (prefixed) name. + * + *

          If the name has an undeclared prefix, use only the qname + * and make an ErrorHandler.error callback in case the app is + * interested.

          + * + * @param qName The qualified (prefixed) name. + * @param isAttribute true if this is an attribute name. + * @return The name split into three parts. + * @exception org.xml.sax.SAXException The client may throw + * an exception if there is an error callback. + */ + private String [] processName (String qName, boolean isAttribute) + throws SAXException + { + String parts[] = nsSupport.processName(qName, nameParts, + isAttribute); + if (parts == null) { + parts = new String[3]; + parts[2] = qName.intern(); + reportError("Undeclared prefix: " + qName); + } + return parts; + } + + + /** + * Report a non-fatal error. + * + * @param message The error message. + * @exception org.xml.sax.SAXException The client may throw + * an exception. + */ + void reportError (String message) + throws SAXException + { + if (errorHandler == null) { + return; + } + + SAXParseException e; + if (locator != null) { + e = new SAXParseException(message, locator); + } else { + e = new SAXParseException(message, null, null, -1, -1); + } + errorHandler.error(e); + } + + + /** + * Throw an exception if we are parsing. + * + *

          Use this method to detect illegal feature or + * property changes.

          + * + * @param type The type of thing (feature or property). + * @param name The feature or property name. + * @exception org.xml.sax.SAXNotSupportedException If a + * document is currently being parsed. + */ + private void checkNotParsing (String type, String name) + throws SAXNotSupportedException + { + if (parsing) { + throw new SAXNotSupportedException("Cannot change " + + type + ' ' + + name + " while parsing"); + + } + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private NamespaceSupport nsSupport; + private AttributeListAdapter attAdapter; + + private boolean parsing = false; + private String nameParts[] = new String[3]; + + private Parser parser = null; + + private AttributesImpl atts = null; + + // Features + private boolean namespaces = true; + private boolean prefixes = false; + + // Properties + + // Handlers + Locator locator; + + EntityResolver entityResolver = null; + DTDHandler dtdHandler = null; + ContentHandler contentHandler = null; + ErrorHandler errorHandler = null; + + + + //////////////////////////////////////////////////////////////////// + // Inner class to wrap an AttributeList when not doing NS proc. + //////////////////////////////////////////////////////////////////// + + + /** + * Adapt a SAX1 AttributeList as a SAX2 Attributes object. + * + *

          This class is in the Public Domain, and comes with NO + * WARRANTY of any kind.

          + * + *

          This wrapper class is used only when Namespace support + * is disabled -- it provides pretty much a direct mapping + * from SAX1 to SAX2, except that names and types are + * interned whenever requested.

          + */ + final class AttributeListAdapter implements Attributes + { + + /** + * Construct a new adapter. + */ + AttributeListAdapter () + { + } + + + /** + * Set the embedded AttributeList. + * + *

          This method must be invoked before any of the others + * can be used.

          + * + * @param The SAX1 attribute list (with qnames). + */ + void setAttributeList (AttributeList qAtts) + { + this.qAtts = qAtts; + } + + + /** + * Return the length of the attribute list. + * + * @return The number of attributes in the list. + * @see org.xml.sax.Attributes#getLength + */ + public int getLength () + { + return qAtts.getLength(); + } + + + /** + * Return the Namespace URI of the specified attribute. + * + * @param The attribute's index. + * @return Always the empty string. + * @see org.xml.sax.Attributes#getURI + */ + public String getURI (int i) + { + return ""; + } + + + /** + * Return the local name of the specified attribute. + * + * @param The attribute's index. + * @return Always the empty string. + * @see org.xml.sax.Attributes#getLocalName + */ + public String getLocalName (int i) + { + return ""; + } + + + /** + * Return the qualified (prefixed) name of the specified attribute. + * + * @param The attribute's index. + * @return The attribute's qualified name, internalized. + */ + public String getQName (int i) + { + return qAtts.getName(i).intern(); + } + + + /** + * Return the type of the specified attribute. + * + * @param The attribute's index. + * @return The attribute's type as an internalized string. + */ + public String getType (int i) + { + return qAtts.getType(i).intern(); + } + + + /** + * Return the value of the specified attribute. + * + * @param The attribute's index. + * @return The attribute's value. + */ + public String getValue (int i) + { + return qAtts.getValue(i); + } + + + /** + * Look up an attribute index by Namespace name. + * + * @param uri The Namespace URI or the empty string. + * @param localName The local name. + * @return The attributes index, or -1 if none was found. + * @see org.xml.sax.Attributes#getIndex(java.lang.String,java.lang.String) + */ + public int getIndex (String uri, String localName) + { + return -1; + } + + + /** + * Look up an attribute index by qualified (prefixed) name. + * + * @param qName The qualified name. + * @return The attributes index, or -1 if none was found. + * @see org.xml.sax.Attributes#getIndex(java.lang.String) + */ + public int getIndex (String qName) + { + int max = atts.getLength(); + for (int i = 0; i < max; i++) { + if (qAtts.getName(i).equals(qName)) { + return i; + } + } + return -1; + } + + + /** + * Look up the type of an attribute by Namespace name. + * + * @param uri The Namespace URI + * @param localName The local name. + * @return The attribute's type as an internalized string. + */ + public String getType (String uri, String localName) + { + return null; + } + + + /** + * Look up the type of an attribute by qualified (prefixed) name. + * + * @param qName The qualified name. + * @return The attribute's type as an internalized string. + */ + public String getType (String qName) + { + return qAtts.getType(qName).intern(); + } + + + /** + * Look up the value of an attribute by Namespace name. + * + * @param uri The Namespace URI + * @param localName The local name. + * @return The attribute's value. + */ + public String getValue (String uri, String localName) + { + return null; + } + + + /** + * Look up the value of an attribute by qualified (prefixed) name. + * + * @param qName The qualified name. + * @return The attribute's value. + */ + public String getValue (String qName) + { + return qAtts.getValue(qName); + } + + private AttributeList qAtts; + } + } + + // end of ParserAdapter.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/ParserFactory.java gcc-3.1/libjava/org/xml/sax/helpers/ParserFactory.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/ParserFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/ParserFactory.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,129 ---- + // SAX parser factory. + // No warranty; no copyright -- use this as you will. + // $Id: ParserFactory.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import java.lang.ClassNotFoundException; + import java.lang.IllegalAccessException; + import java.lang.InstantiationException; + import java.lang.SecurityException; + import java.lang.ClassCastException; + + import org.xml.sax.Parser; + + + /** + * Java-specific class for dynamically loading SAX parsers. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          Note: This class is designed to work with the now-deprecated + * SAX1 {@link org.xml.sax.Parser Parser} class. SAX2 applications should use + * {@link org.xml.sax.helpers.XMLReaderFactory XMLReaderFactory} instead.

          + * + *

          ParserFactory is not part of the platform-independent definition + * of SAX; it is an additional convenience class designed + * specifically for Java XML application writers. SAX applications + * can use the static methods in this class to allocate a SAX parser + * dynamically at run-time based either on the value of the + * `org.xml.sax.parser' system property or on a string containing the class + * name.

          + * + *

          Note that the application still requires an XML parser that + * implements SAX1.

          + * + * @deprecated This class works with the deprecated + * {@link org.xml.sax.Parser Parser} + * interface. + * @since SAX 1.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Parser + * @see java.lang.Class + */ + public class ParserFactory { + + + /** + * Private null constructor. + */ + private ParserFactory () + { + } + + + /** + * Create a new SAX parser using the `org.xml.sax.parser' system property. + * + *

          The named class must exist and must implement the + * {@link org.xml.sax.Parser Parser} interface.

          + * + * @exception java.lang.NullPointerException There is no value + * for the `org.xml.sax.parser' system property. + * @exception java.lang.ClassNotFoundException The SAX parser + * class was not found (check your CLASSPATH). + * @exception IllegalAccessException The SAX parser class was + * found, but you do not have permission to load + * it. + * @exception InstantiationException The SAX parser class was + * found but could not be instantiated. + * @exception java.lang.ClassCastException The SAX parser class + * was found and instantiated, but does not implement + * org.xml.sax.Parser. + * @see #makeParser(java.lang.String) + * @see org.xml.sax.Parser + */ + public static Parser makeParser () + throws ClassNotFoundException, + IllegalAccessException, + InstantiationException, + NullPointerException, + ClassCastException + { + String className = System.getProperty("org.xml.sax.parser"); + if (className == null) { + throw new NullPointerException("No value for sax.parser property"); + } else { + return makeParser(className); + } + } + + + /** + * Create a new SAX parser object using the class name provided. + * + *

          The named class must exist and must implement the + * {@link org.xml.sax.Parser Parser} interface.

          + * + * @param className A string containing the name of the + * SAX parser class. + * @exception java.lang.ClassNotFoundException The SAX parser + * class was not found (check your CLASSPATH). + * @exception IllegalAccessException The SAX parser class was + * found, but you do not have permission to load + * it. + * @exception InstantiationException The SAX parser class was + * found but could not be instantiated. + * @exception java.lang.ClassCastException The SAX parser class + * was found and instantiated, but does not implement + * org.xml.sax.Parser. + * @see #makeParser() + * @see org.xml.sax.Parser + */ + public static Parser makeParser (String className) + throws ClassNotFoundException, + IllegalAccessException, + InstantiationException, + ClassCastException + { + return (Parser)(Class.forName(className).newInstance()); + } + + } + + // end of ParserFactory.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/XMLFilterImpl.java gcc-3.1/libjava/org/xml/sax/helpers/XMLFilterImpl.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/XMLFilterImpl.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/XMLFilterImpl.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,769 ---- + // XMLFilterImpl.java - base SAX2 filter implementation. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the Public Domain. + + // $Id: XMLFilterImpl.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import java.io.IOException; + + import org.xml.sax.XMLReader; + import org.xml.sax.XMLFilter; + import org.xml.sax.InputSource; + import org.xml.sax.Locator; + import org.xml.sax.Attributes; + import org.xml.sax.EntityResolver; + import org.xml.sax.DTDHandler; + import org.xml.sax.ContentHandler; + import org.xml.sax.ErrorHandler; + import org.xml.sax.SAXException; + import org.xml.sax.SAXParseException; + import org.xml.sax.SAXNotSupportedException; + import org.xml.sax.SAXNotRecognizedException; + + + /** + * Base class for deriving an XML filter. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class is designed to sit between an {@link org.xml.sax.XMLReader + * XMLReader} and the client application's event handlers. By default, it + * does nothing but pass requests up to the reader and events + * on to the handlers unmodified, but subclasses can override + * specific methods to modify the event stream or the configuration + * requests as they pass through.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.XMLFilter + * @see org.xml.sax.XMLReader + * @see org.xml.sax.EntityResolver + * @see org.xml.sax.DTDHandler + * @see org.xml.sax.ContentHandler + * @see org.xml.sax.ErrorHandler + */ + public class XMLFilterImpl + implements XMLFilter, EntityResolver, DTDHandler, ContentHandler, ErrorHandler + { + + + //////////////////////////////////////////////////////////////////// + // Constructors. + //////////////////////////////////////////////////////////////////// + + + /** + * Construct an empty XML filter, with no parent. + * + *

          This filter will have no parent: you must assign a parent + * before you start a parse or do any configuration with + * setFeature or setProperty.

          + * + * @see org.xml.sax.XMLReader#setFeature + * @see org.xml.sax.XMLReader#setProperty + */ + public XMLFilterImpl () + { + super(); + } + + + /** + * Construct an XML filter with the specified parent. + * + * @see #setParent + * @see #getParent + */ + public XMLFilterImpl (XMLReader parent) + { + super(); + setParent(parent); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.XMLFilter. + //////////////////////////////////////////////////////////////////// + + + /** + * Set the parent reader. + * + *

          This is the {@link org.xml.sax.XMLReader XMLReader} from which + * this filter will obtain its events and to which it will pass its + * configuration requests. The parent may itself be another filter.

          + * + *

          If there is no parent reader set, any attempt to parse + * or to set or get a feature or property will fail.

          + * + * @param parent The parent XML reader. + * @exception java.lang.NullPointerException If the parent is null. + * @see #getParent + */ + public void setParent (XMLReader parent) + { + if (parent == null) { + throw new NullPointerException("Null parent"); + } + this.parent = parent; + } + + + /** + * Get the parent reader. + * + * @return The parent XML reader, or null if none is set. + * @see #setParent + */ + public XMLReader getParent () + { + return parent; + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.XMLReader. + //////////////////////////////////////////////////////////////////// + + + /** + * Set the state of a feature. + * + *

          This will always fail if the parent is null.

          + * + * @param name The feature name. + * @param state The requested feature state. + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the feature name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the feature name but + * cannot set the requested value. + * @see org.xml.sax.XMLReader#setFeature + */ + public void setFeature (String name, boolean state) + throws SAXNotRecognizedException, SAXNotSupportedException + { + if (parent != null) { + parent.setFeature(name, state); + } else { + throw new SAXNotRecognizedException("Feature: " + name); + } + } + + + /** + * Look up the state of a feature. + * + *

          This will always fail if the parent is null.

          + * + * @param name The feature name. + * @return The current state of the feature. + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the feature name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the feature name but + * cannot determine its state at this time. + * @see org.xml.sax.XMLReader#getFeature + */ + public boolean getFeature (String name) + throws SAXNotRecognizedException, SAXNotSupportedException + { + if (parent != null) { + return parent.getFeature(name); + } else { + throw new SAXNotRecognizedException("Feature: " + name); + } + } + + + /** + * Set the value of a property. + * + *

          This will always fail if the parent is null.

          + * + * @param name The property name. + * @param state The requested property value. + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the property name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the property name but + * cannot set the requested value. + * @see org.xml.sax.XMLReader#setProperty + */ + public void setProperty (String name, Object value) + throws SAXNotRecognizedException, SAXNotSupportedException + { + if (parent != null) { + parent.setProperty(name, value); + } else { + throw new SAXNotRecognizedException("Property: " + name); + } + } + + + /** + * Look up the value of a property. + * + * @param name The property name. + * @return The current value of the property. + * @exception org.xml.sax.SAXNotRecognizedException When the + * XMLReader does not recognize the feature name. + * @exception org.xml.sax.SAXNotSupportedException When the + * XMLReader recognizes the property name but + * cannot determine its value at this time. + * @see org.xml.sax.XMLReader#setFeature + */ + public Object getProperty (String name) + throws SAXNotRecognizedException, SAXNotSupportedException + { + if (parent != null) { + return parent.getProperty(name); + } else { + throw new SAXNotRecognizedException("Property: " + name); + } + } + + + /** + * Set the entity resolver. + * + * @param resolver The new entity resolver. + * @exception java.lang.NullPointerException If the resolver + * is null. + * @see org.xml.sax.XMLReader#setEntityResolver + */ + public void setEntityResolver (EntityResolver resolver) + { + if (resolver == null) { + throw new NullPointerException("Null entity resolver"); + } else { + entityResolver = resolver; + } + } + + + /** + * Get the current entity resolver. + * + * @return The current entity resolver, or null if none was set. + * @see org.xml.sax.XMLReader#getEntityResolver + */ + public EntityResolver getEntityResolver () + { + return entityResolver; + } + + + /** + * Set the DTD event handler. + * + * @param resolver The new DTD handler. + * @exception java.lang.NullPointerException If the handler + * is null. + * @see org.xml.sax.XMLReader#setDTDHandler + */ + public void setDTDHandler (DTDHandler handler) + { + if (handler == null) { + throw new NullPointerException("Null DTD handler"); + } else { + dtdHandler = handler; + } + } + + + /** + * Get the current DTD event handler. + * + * @return The current DTD handler, or null if none was set. + * @see org.xml.sax.XMLReader#getDTDHandler + */ + public DTDHandler getDTDHandler () + { + return dtdHandler; + } + + + /** + * Set the content event handler. + * + * @param resolver The new content handler. + * @exception java.lang.NullPointerException If the handler + * is null. + * @see org.xml.sax.XMLReader#setContentHandler + */ + public void setContentHandler (ContentHandler handler) + { + if (handler == null) { + throw new NullPointerException("Null content handler"); + } else { + contentHandler = handler; + } + } + + + /** + * Get the content event handler. + * + * @return The current content handler, or null if none was set. + * @see org.xml.sax.XMLReader#getContentHandler + */ + public ContentHandler getContentHandler () + { + return contentHandler; + } + + + /** + * Set the error event handler. + * + * @param handle The new error handler. + * @exception java.lang.NullPointerException If the handler + * is null. + * @see org.xml.sax.XMLReader#setErrorHandler + */ + public void setErrorHandler (ErrorHandler handler) + { + if (handler == null) { + throw new NullPointerException("Null error handler"); + } else { + errorHandler = handler; + } + } + + + /** + * Get the current error event handler. + * + * @return The current error handler, or null if none was set. + * @see org.xml.sax.XMLReader#getErrorHandler + */ + public ErrorHandler getErrorHandler () + { + return errorHandler; + } + + + /** + * Parse a document. + * + * @param input The input source for the document entity. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @exception java.io.IOException An IO exception from the parser, + * possibly from a byte stream or character stream + * supplied by the application. + * @see org.xml.sax.XMLReader#parse(org.xml.sax.InputSource) + */ + public void parse (InputSource input) + throws SAXException, IOException + { + setupParse(); + parent.parse(input); + } + + + /** + * Parse a document. + * + * @param systemId The system identifier as a fully-qualified URI. + * @exception org.xml.sax.SAXException Any SAX exception, possibly + * wrapping another exception. + * @exception java.io.IOException An IO exception from the parser, + * possibly from a byte stream or character stream + * supplied by the application. + * @see org.xml.sax.XMLReader#parse(java.lang.String) + */ + public void parse (String systemId) + throws SAXException, IOException + { + parse(new InputSource(systemId)); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.EntityResolver. + //////////////////////////////////////////////////////////////////// + + + /** + * Filter an external entity resolution. + * + * @param publicId The entity's public identifier, or null. + * @param systemId The entity's system identifier. + * @return A new InputSource or null for the default. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @exception java.io.IOException The client may throw an + * I/O-related exception while obtaining the + * new InputSource. + * @see org.xml.sax.EntityResolver#resolveEntity + */ + public InputSource resolveEntity (String publicId, String systemId) + throws SAXException, IOException + { + if (entityResolver != null) { + return entityResolver.resolveEntity(publicId, systemId); + } else { + return null; + } + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.DTDHandler. + //////////////////////////////////////////////////////////////////// + + + /** + * Filter a notation declaration event. + * + * @param name The notation name. + * @param publicId The notation's public identifier, or null. + * @param systemId The notation's system identifier, or null. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.DTDHandler#notationDecl + */ + public void notationDecl (String name, String publicId, String systemId) + throws SAXException + { + if (dtdHandler != null) { + dtdHandler.notationDecl(name, publicId, systemId); + } + } + + + /** + * Filter an unparsed entity declaration event. + * + * @param name The entity name. + * @param publicId The entity's public identifier, or null. + * @param systemId The entity's system identifier, or null. + * @param notationName The name of the associated notation. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.DTDHandler#unparsedEntityDecl + */ + public void unparsedEntityDecl (String name, String publicId, + String systemId, String notationName) + throws SAXException + { + if (dtdHandler != null) { + dtdHandler.unparsedEntityDecl(name, publicId, systemId, + notationName); + } + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.ContentHandler. + //////////////////////////////////////////////////////////////////// + + + /** + * Filter a new document locator event. + * + * @param locator The document locator. + * @see org.xml.sax.ContentHandler#setDocumentLocator + */ + public void setDocumentLocator (Locator locator) + { + this.locator = locator; + if (contentHandler != null) { + contentHandler.setDocumentLocator(locator); + } + } + + + /** + * Filter a start document event. + * + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#startDocument + */ + public void startDocument () + throws SAXException + { + if (contentHandler != null) { + contentHandler.startDocument(); + } + } + + + /** + * Filter an end document event. + * + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#endDocument + */ + public void endDocument () + throws SAXException + { + if (contentHandler != null) { + contentHandler.endDocument(); + } + } + + + /** + * Filter a start Namespace prefix mapping event. + * + * @param prefix The Namespace prefix. + * @param uri The Namespace URI. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#startPrefixMapping + */ + public void startPrefixMapping (String prefix, String uri) + throws SAXException + { + if (contentHandler != null) { + contentHandler.startPrefixMapping(prefix, uri); + } + } + + + /** + * Filter an end Namespace prefix mapping event. + * + * @param prefix The Namespace prefix. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#endPrefixMapping + */ + public void endPrefixMapping (String prefix) + throws SAXException + { + if (contentHandler != null) { + contentHandler.endPrefixMapping(prefix); + } + } + + + /** + * Filter a start element event. + * + * @param uri The element's Namespace URI, or the empty string. + * @param localName The element's local name, or the empty string. + * @param qName The element's qualified (prefixed) name, or the empty + * string. + * @param atts The element's attributes. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#startElement + */ + public void startElement (String uri, String localName, String qName, + Attributes atts) + throws SAXException + { + if (contentHandler != null) { + contentHandler.startElement(uri, localName, qName, atts); + } + } + + + /** + * Filter an end element event. + * + * @param uri The element's Namespace URI, or the empty string. + * @param localName The element's local name, or the empty string. + * @param qName The element's qualified (prefixed) name, or the empty + * string. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#endElement + */ + public void endElement (String uri, String localName, String qName) + throws SAXException + { + if (contentHandler != null) { + contentHandler.endElement(uri, localName, qName); + } + } + + + /** + * Filter a character data event. + * + * @param ch An array of characters. + * @param start The starting position in the array. + * @param length The number of characters to use from the array. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#characters + */ + public void characters (char ch[], int start, int length) + throws SAXException + { + if (contentHandler != null) { + contentHandler.characters(ch, start, length); + } + } + + + /** + * Filter an ignorable whitespace event. + * + * @param ch An array of characters. + * @param start The starting position in the array. + * @param length The number of characters to use from the array. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#ignorableWhitespace + */ + public void ignorableWhitespace (char ch[], int start, int length) + throws SAXException + { + if (contentHandler != null) { + contentHandler.ignorableWhitespace(ch, start, length); + } + } + + + /** + * Filter a processing instruction event. + * + * @param target The processing instruction target. + * @param data The text following the target. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#processingInstruction + */ + public void processingInstruction (String target, String data) + throws SAXException + { + if (contentHandler != null) { + contentHandler.processingInstruction(target, data); + } + } + + + /** + * Filter a skipped entity event. + * + * @param name The name of the skipped entity. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ContentHandler#skippedEntity + */ + public void skippedEntity (String name) + throws SAXException + { + if (contentHandler != null) { + contentHandler.skippedEntity(name); + } + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.ErrorHandler. + //////////////////////////////////////////////////////////////////// + + + /** + * Filter a warning event. + * + * @param e The nwarning as an exception. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ErrorHandler#warning + */ + public void warning (SAXParseException e) + throws SAXException + { + if (errorHandler != null) { + errorHandler.warning(e); + } + } + + + /** + * Filter an error event. + * + * @param e The error as an exception. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ErrorHandler#error + */ + public void error (SAXParseException e) + throws SAXException + { + if (errorHandler != null) { + errorHandler.error(e); + } + } + + + /** + * Filter a fatal error event. + * + * @param e The error as an exception. + * @exception org.xml.sax.SAXException The client may throw + * an exception during processing. + * @see org.xml.sax.ErrorHandler#fatalError + */ + public void fatalError (SAXParseException e) + throws SAXException + { + if (errorHandler != null) { + errorHandler.fatalError(e); + } + } + + + + //////////////////////////////////////////////////////////////////// + // Internal methods. + //////////////////////////////////////////////////////////////////// + + + /** + * Set up before a parse. + * + *

          Before every parse, check whether the parent is + * non-null, and re-register the filter for all of the + * events.

          + */ + private void setupParse () + { + if (parent == null) { + throw new NullPointerException("No parent for filter"); + } + parent.setEntityResolver(this); + parent.setDTDHandler(this); + parent.setContentHandler(this); + parent.setErrorHandler(this); + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private XMLReader parent = null; + private Locator locator = null; + private EntityResolver entityResolver = null; + private DTDHandler dtdHandler = null; + private ContentHandler contentHandler = null; + private ErrorHandler errorHandler = null; + + } + + // end of XMLFilterImpl.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/XMLReaderAdapter.java gcc-3.1/libjava/org/xml/sax/helpers/XMLReaderAdapter.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/XMLReaderAdapter.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/XMLReaderAdapter.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,526 ---- + // XMLReaderAdapter.java - adapt an SAX2 XMLReader to a SAX1 Parser + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the public domain. + + // $Id: XMLReaderAdapter.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + + import java.io.IOException; + import java.util.Locale; + + import org.xml.sax.Parser; // deprecated + import org.xml.sax.Locator; + import org.xml.sax.InputSource; + import org.xml.sax.AttributeList; // deprecated + import org.xml.sax.EntityResolver; + import org.xml.sax.DTDHandler; + import org.xml.sax.DocumentHandler; // deprecated + import org.xml.sax.ErrorHandler; + import org.xml.sax.SAXException; + + import org.xml.sax.XMLReader; + import org.xml.sax.Attributes; + import org.xml.sax.ContentHandler; + import org.xml.sax.SAXNotSupportedException; + + + /** + * Adapt a SAX2 XMLReader as a SAX1 Parser. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class wraps a SAX2 {@link org.xml.sax.XMLReader XMLReader} + * and makes it act as a SAX1 {@link org.xml.sax.Parser Parser}. The XMLReader + * must support a true value for the + * http://xml.org/sax/features/namespace-prefixes property or parsing will fail + * with a {@link org.xml.sax.SAXException SAXException}; if the XMLReader + * supports a false value for the http://xml.org/sax/features/namespaces + * property, that will also be used to improve efficiency.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.Parser + * @see org.xml.sax.XMLReader + */ + public class XMLReaderAdapter implements Parser, ContentHandler + { + + + //////////////////////////////////////////////////////////////////// + // Constructor. + //////////////////////////////////////////////////////////////////// + + + /** + * Create a new adapter. + * + *

          Use the "org.xml.sax.driver" property to locate the SAX2 + * driver to embed.

          + * + * @exception org.xml.sax.SAXException If the embedded driver + * cannot be instantiated or if the + * org.xml.sax.driver property is not specified. + */ + public XMLReaderAdapter () + throws SAXException + { + setup(XMLReaderFactory.createXMLReader()); + } + + + /** + * Create a new adapter. + * + *

          Create a new adapter, wrapped around a SAX2 XMLReader. + * The adapter will make the XMLReader act like a SAX1 + * Parser.

          + * + * @param xmlReader The SAX2 XMLReader to wrap. + * @exception java.lang.NullPointerException If the argument is null. + */ + public XMLReaderAdapter (XMLReader xmlReader) + { + setup(xmlReader); + } + + + + /** + * Internal setup. + * + * @param xmlReader The embedded XMLReader. + */ + private void setup (XMLReader xmlReader) + { + if (xmlReader == null) { + throw new NullPointerException("XMLReader must not be null"); + } + this.xmlReader = xmlReader; + qAtts = new AttributesAdapter(); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.Parser. + //////////////////////////////////////////////////////////////////// + + + /** + * Set the locale for error reporting. + * + *

          This is not supported in SAX2, and will always throw + * an exception.

          + * + * @param The locale for error reporting. + * @see org.xml.sax.Parser#setLocale + */ + public void setLocale (Locale locale) + throws SAXException + { + throw new SAXNotSupportedException("setLocale not supported"); + } + + + /** + * Register the entity resolver. + * + * @param resolver The new resolver. + * @see org.xml.sax.Parser#setEntityResolver + */ + public void setEntityResolver (EntityResolver resolver) + { + xmlReader.setEntityResolver(resolver); + } + + + /** + * Register the DTD event handler. + * + * @param handler The new DTD event handler. + * @see org.xml.sax.Parser#setDTDHandler + */ + public void setDTDHandler (DTDHandler handler) + { + xmlReader.setDTDHandler(handler); + } + + + /** + * Register the SAX1 document event handler. + * + *

          Note that the SAX1 document handler has no Namespace + * support.

          + * + * @param handler The new SAX1 document event handler. + * @see org.xml.sax.Parser#setDocumentHandler + */ + public void setDocumentHandler (DocumentHandler handler) + { + documentHandler = handler; + } + + + /** + * Register the error event handler. + * + * @param handler The new error event handler. + * @see org.xml.sax.Parser#setErrorHandler + */ + public void setErrorHandler (ErrorHandler handler) + { + xmlReader.setErrorHandler(handler); + } + + + /** + * Parse the document. + * + *

          This method will throw an exception if the embedded + * XMLReader does not support the + * http://xml.org/sax/features/namespace-prefixes property.

          + * + * @param systemId The absolute URL of the document. + * @exception java.io.IOException If there is a problem reading + * the raw content of the document. + * @exception org.xml.sax.SAXException If there is a problem + * processing the document. + * @see #parse(org.xml.sax.InputSource) + * @see org.xml.sax.Parser#parse(java.lang.String) + */ + public void parse (String systemId) + throws IOException, SAXException + { + parse(new InputSource(systemId)); + } + + + /** + * Parse the document. + * + *

          This method will throw an exception if the embedded + * XMLReader does not support the + * http://xml.org/sax/features/namespace-prefixes property.

          + * + * @param input An input source for the document. + * @exception java.io.IOException If there is a problem reading + * the raw content of the document. + * @exception org.xml.sax.SAXException If there is a problem + * processing the document. + * @see #parse(java.lang.String) + * @see org.xml.sax.Parser#parse(org.xml.sax.InputSource) + */ + public void parse (InputSource input) + throws IOException, SAXException + { + setupXMLReader(); + xmlReader.parse(input); + } + + + /** + * Set up the XML reader. + */ + private void setupXMLReader () + throws SAXException + { + xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true); + try { + xmlReader.setFeature("http://xml.org/sax/features/namespaces", + false); + } catch (SAXException e) { + // NO OP: it's just extra information, and we can ignore it + } + xmlReader.setContentHandler(this); + } + + + + //////////////////////////////////////////////////////////////////// + // Implementation of org.xml.sax.ContentHandler. + //////////////////////////////////////////////////////////////////// + + + /** + * Set a document locator. + * + * @param locator The document locator. + * @see org.xml.sax.ContentHandler#setDocumentLocator + */ + public void setDocumentLocator (Locator locator) + { + documentHandler.setDocumentLocator(locator); + } + + + /** + * Start document event. + * + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.ContentHandler#startDocument + */ + public void startDocument () + throws SAXException + { + documentHandler.startDocument(); + } + + + /** + * End document event. + * + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.ContentHandler#endDocument + */ + public void endDocument () + throws SAXException + { + documentHandler.endDocument(); + } + + + /** + * Adapt a SAX2 start prefix mapping event. + * + * @param prefix The prefix being mapped. + * @param uri The Namespace URI being mapped to. + * @see org.xml.sax.ContentHandler#startPrefixMapping + */ + public void startPrefixMapping (String prefix, String uri) + { + } + + + /** + * Adapt a SAX2 end prefix mapping event. + * + * @param prefix The prefix being mapped. + * @see org.xml.sax.ContentHandler#endPrefixMapping + */ + public void endPrefixMapping (String prefix) + { + } + + + /** + * Adapt a SAX2 start element event. + * + * @param uri The Namespace URI. + * @param localName The Namespace local name. + * @param qName The qualified (prefixed) name. + * @param atts The SAX2 attributes. + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.ContentHandler#endDocument + */ + public void startElement (String uri, String localName, + String qName, Attributes atts) + throws SAXException + { + qAtts.setAttributes(atts); + documentHandler.startElement(qName, qAtts); + } + + + /** + * Adapt a SAX2 end element event. + * + * @param uri The Namespace URI. + * @param localName The Namespace local name. + * @param qName The qualified (prefixed) name. + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.ContentHandler#endElement + */ + public void endElement (String uri, String localName, + String qName) + throws SAXException + { + documentHandler.endElement(qName); + } + + + /** + * Adapt a SAX2 characters event. + * + * @param ch An array of characters. + * @param start The starting position in the array. + * @param length The number of characters to use. + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.ContentHandler#characters + */ + public void characters (char ch[], int start, int length) + throws SAXException + { + documentHandler.characters(ch, start, length); + } + + + /** + * Adapt a SAX2 ignorable whitespace event. + * + * @param ch An array of characters. + * @param start The starting position in the array. + * @param length The number of characters to use. + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.ContentHandler#ignorableWhitespace + */ + public void ignorableWhitespace (char ch[], int start, int length) + throws SAXException + { + documentHandler.ignorableWhitespace(ch, start, length); + } + + + /** + * Adapt a SAX2 processing instruction event. + * + * @param target The processing instruction target. + * @param data The remainder of the processing instruction + * @exception org.xml.sax.SAXException The client may raise a + * processing exception. + * @see org.xml.sax.ContentHandler#processingInstruction + */ + public void processingInstruction (String target, String data) + throws SAXException + { + documentHandler.processingInstruction(target, data); + } + + + /** + * Adapt a SAX2 skipped entity event. + * + * @param name The name of the skipped entity. + * @see org.xml.sax.ContentHandler#skippedEntity + */ + public void skippedEntity (String name) + throws SAXException + { + } + + + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + XMLReader xmlReader; + DocumentHandler documentHandler; + AttributesAdapter qAtts; + + + + //////////////////////////////////////////////////////////////////// + // Internal class. + //////////////////////////////////////////////////////////////////// + + + /** + * Internal class to wrap a SAX2 Attributes object for SAX1. + */ + final class AttributesAdapter implements AttributeList + { + AttributesAdapter () + { + } + + + /** + * Set the embedded Attributes object. + * + * @param The embedded SAX2 Attributes. + */ + void setAttributes (Attributes attributes) + { + this.attributes = attributes; + } + + + /** + * Return the number of attributes. + * + * @return The length of the attribute list. + * @see org.xml.sax.AttributeList#getLength + */ + public int getLength () + { + return attributes.getLength(); + } + + + /** + * Return the qualified (prefixed) name of an attribute by position. + * + * @return The qualified name. + * @see org.xml.sax.AttributeList#getName + */ + public String getName (int i) + { + return attributes.getQName(i); + } + + + /** + * Return the type of an attribute by position. + * + * @return The type. + * @see org.xml.sax.AttributeList#getType(int) + */ + public String getType (int i) + { + return attributes.getType(i); + } + + + /** + * Return the value of an attribute by position. + * + * @return The value. + * @see org.xml.sax.AttributeList#getValue(int) + */ + public String getValue (int i) + { + return attributes.getValue(i); + } + + + /** + * Return the type of an attribute by qualified (prefixed) name. + * + * @return The type. + * @see org.xml.sax.AttributeList#getType(java.lang.String) + */ + public String getType (String qName) + { + return attributes.getType(qName); + } + + + /** + * Return the value of an attribute by qualified (prefixed) name. + * + * @return The value. + * @see org.xml.sax.AttributeList#getValue(java.lang.String) + */ + public String getValue (String qName) + { + return attributes.getValue(qName); + } + + private Attributes attributes; + } + + } + + // end of XMLReaderAdapter.java diff -Nrc3pad gcc-3.0.4/libjava/org/xml/sax/helpers/XMLReaderFactory.java gcc-3.1/libjava/org/xml/sax/helpers/XMLReaderFactory.java *** gcc-3.0.4/libjava/org/xml/sax/helpers/XMLReaderFactory.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/org/xml/sax/helpers/XMLReaderFactory.java Wed Jul 11 03:59:16 2001 *************** *** 0 **** --- 1,136 ---- + // XMLReaderFactory.java - factory for creating a new reader. + // Written by David Megginson, sax@megginson.com + // NO WARRANTY! This class is in the Public Domain. + + // $Id: XMLReaderFactory.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ + + package org.xml.sax.helpers; + import org.xml.sax.Parser; + import org.xml.sax.XMLReader; + import org.xml.sax.SAXException; + + + /** + * Factory for creating an XML reader. + * + *
          + * This module, both source code and documentation, is in the + * Public Domain, and comes with NO WARRANTY. + *
          + * + *

          This class contains static methods for creating an XML reader + * from an explicit class name, or for creating an XML reader based + * on the value of the org.xml.sax.driver system + * property:

          + * + *
          +  * try {
          +  *   XMLReader myReader = XMLReaderFactory.createXMLReader();
          +  * } catch (SAXException e) {
          +  *   System.err.println(e.getMessage());
          +  * }
          +  * 
          + * + *

          Note that these methods will not be usable in environments where + * system properties are not accessible or where the application or + * applet is not permitted to load classes dynamically.

          + * + *

          Note to implementors: SAX implementations in specialized + * environments may replace this class with a different one optimized for the + * environment, as long as its method signatures remain the same.

          + * + * @since SAX 2.0 + * @author David Megginson, + * sax@megginson.com + * @version 2.0 + * @see org.xml.sax.XMLReader + */ + final public class XMLReaderFactory + { + + /** + * Private constructor. + * + *

          This constructor prevents the class from being instantiated.

          + */ + private XMLReaderFactory () + { + } + + + /** + * Attempt to create an XML reader from a system property. + * + *

          This method uses the value of the system property + * "org.xml.sax.driver" as the full name of a Java class + * and tries to instantiate that class as a SAX2 + * XMLReader.

          + * + *

          Note that many Java interpreters allow system properties + * to be specified on the command line.

          + * + * @return A new XMLReader. + * @exception org.xml.sax.SAXException If the value of the + * "org.xml.sax.driver" system property is null, + * or if the class cannot be loaded and instantiated. + * @see #createXMLReader(java.lang.String) + */ + public static XMLReader createXMLReader () + throws SAXException + { + String className = System.getProperty("org.xml.sax.driver"); + if (className == null) { + Parser parser; + try { + parser = ParserFactory.makeParser(); + } catch (Exception e) { + parser = null; + } + if (parser == null) { + throw new + SAXException("System property org.xml.sax.driver not specified"); + } else { + return new ParserAdapter(parser); + } + } else { + return createXMLReader(className); + } + } + + + /** + * Attempt to create an XML reader from a class name. + * + *

          Given a class name, this method attempts to load + * and instantiate the class as an XML reader.

          + * + * @return A new XML reader. + * @exception org.xml.sax.SAXException If the class cannot be + * loaded, instantiated, and cast to XMLReader. + * @see #createXMLReader() + */ + public static XMLReader createXMLReader (String className) + throws SAXException + { + try { + return (XMLReader)(Class.forName(className).newInstance()); + } catch (ClassNotFoundException e1) { + throw new SAXException("SAX2 driver class " + className + + " not found", e1); + } catch (IllegalAccessException e2) { + throw new SAXException("SAX2 driver class " + className + + " found but cannot be loaded", e2); + } catch (InstantiationException e3) { + throw new SAXException("SAX2 driver class " + className + + " loaded but cannot be instantiated (no empty public constructor?)", + e3); + } catch (ClassCastException e4) { + throw new SAXException("SAX2 driver class " + className + + " does not implement XMLReader", e4); + } + + } + + } + + // end of XMLReaderFactory.java diff -Nrc3pad gcc-3.0.4/libjava/posix-threads.cc gcc-3.1/libjava/posix-threads.cc *** gcc-3.0.4/libjava/posix-threads.cc Sun May 20 16:24:40 2001 --- gcc-3.1/libjava/posix-threads.cc Thu Mar 21 00:34:57 2002 *************** *** 1,6 **** // posix-threads.cc - interface between libjava and POSIX threads. ! /* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // posix-threads.cc - interface between libjava and POSIX threads. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. *************** details. */ *** 16,26 **** // If we're using the Boehm GC, then we need to override some of the // thread primitives. This is fairly gross. #ifdef HAVE_BOEHM_GC - extern "C" - { - #include #include - }; #endif /* HAVE_BOEHM_GC */ #include --- 16,22 ---- *************** static pthread_cond_t daemon_cond; *** 59,66 **** static int non_daemon_count; // The signal to use when interrupting a thread. ! #ifdef LINUX_THREADS // LinuxThreads (prior to glibc 2.1) usurps both SIGUSR1 and SIGUSR2. # define INTR SIGHUP #else /* LINUX_THREADS */ # define INTR SIGUSR2 --- 55,63 ---- static int non_daemon_count; // The signal to use when interrupting a thread. ! #if defined(LINUX_THREADS) || defined(FREEBSD_THREADS) // LinuxThreads (prior to glibc 2.1) usurps both SIGUSR1 and SIGUSR2. + // GC on FreeBSD uses both SIGUSR1 and SIGUSR2. # define INTR SIGHUP #else /* LINUX_THREADS */ # define INTR SIGUSR2 *************** _Jv_CondWait (_Jv_ConditionVariable_t *c *** 164,170 **** mu->owner = self; mu->count = count; ! // If we were interrupted, or if a timeout occured, remove ourself from // the cv wait list now. (If we were notified normally, notify() will have // already taken care of this) if (r == ETIMEDOUT || interrupted) --- 161,167 ---- mu->owner = self; mu->count = count; ! // If we were interrupted, or if a timeout occurred, remove ourself from // the cv wait list now. (If we were notified normally, notify() will have // already taken care of this) if (r == ETIMEDOUT || interrupted) *************** _Jv_ThreadInterrupt (_Jv_Thread_t *data) *** 267,273 **** data->thread_obj->interrupt_flag = true; // Interrupt blocking system calls using a signal. ! // pthread_kill (data->thread, INTR); pthread_cond_signal (&data->wait_cond); --- 264,270 ---- data->thread_obj->interrupt_flag = true; // Interrupt blocking system calls using a signal. ! pthread_kill (data->thread, INTR); pthread_cond_signal (&data->wait_cond); *************** _Jv_ThreadSetPriority (_Jv_Thread_t *dat *** 330,335 **** --- 327,367 ---- } } + void + _Jv_ThreadRegister (_Jv_Thread_t *data) + { + pthread_setspecific (_Jv_ThreadKey, data->thread_obj); + pthread_setspecific (_Jv_ThreadDataKey, data); + + // glibc 2.1.3 doesn't set the value of `thread' until after start_routine + // is called. Since it may need to be accessed from the new thread, work + // around the potential race here by explicitly setting it again. + data->thread = pthread_self (); + + # ifdef SLOW_PTHREAD_SELF + // Clear all self cache slots that might be needed by this thread. + int dummy; + int low_index = SC_INDEX(&dummy) + SC_CLEAR_MIN; + int high_index = SC_INDEX(&dummy) + SC_CLEAR_MAX; + for (int i = low_index; i <= high_index; ++i) + { + int current_index = i; + if (current_index < 0) + current_index += SELF_CACHE_SIZE; + if (current_index >= SELF_CACHE_SIZE) + current_index -= SELF_CACHE_SIZE; + _Jv_self_cache[current_index].high_sp_bits = BAD_HIGH_SP_VALUE; + } + # endif + } + + void + _Jv_ThreadUnRegister () + { + pthread_setspecific (_Jv_ThreadKey, NULL); + pthread_setspecific (_Jv_ThreadDataKey, NULL); + } + // This function is called when a thread is started. We don't arrange // to call the `run' method directly, because this function must // return a value. *************** really_start (void *x) *** 338,353 **** { struct starter *info = (struct starter *) x; ! pthread_setspecific (_Jv_ThreadKey, info->data->thread_obj); ! pthread_setspecific (_Jv_ThreadDataKey, info->data); ! ! // glibc 2.1.3 doesn't set the value of `thread' until after start_routine ! // is called. Since it may need to be accessed from the new thread, work ! // around the potential race here by explicitly setting it again. ! info->data->thread = pthread_self (); info->method (info->data->thread_obj); ! if (! (info->data->flags & FLAG_DAEMON)) { pthread_mutex_lock (&daemon_mutex); --- 370,379 ---- { struct starter *info = (struct starter *) x; ! _Jv_ThreadRegister (info->data); info->method (info->data->thread_obj); ! if (! (info->data->flags & FLAG_DAEMON)) { pthread_mutex_lock (&daemon_mutex); *************** really_start (void *x) *** 356,362 **** pthread_cond_signal (&daemon_cond); pthread_mutex_unlock (&daemon_mutex); } ! return NULL; } --- 382,388 ---- pthread_cond_signal (&daemon_cond); pthread_mutex_unlock (&daemon_mutex); } ! return NULL; } *************** _Jv_ThreadStart (java::lang::Thread *thr *** 378,384 **** pthread_attr_setschedparam (&attr, ¶m); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); - // FIXME: handle marking the info object for GC. info = (struct starter *) _Jv_AllocBytes (sizeof (struct starter)); info->method = meth; info->data = data; --- 404,409 ---- *************** _Jv_ThreadStart (java::lang::Thread *thr *** 398,404 **** if (r) { const char* msg = "Cannot create additional threads"; ! JvThrow (new java::lang::OutOfMemoryError (JvNewStringUTF (msg))); } } --- 423,429 ---- if (r) { const char* msg = "Cannot create additional threads"; ! throw new java::lang::OutOfMemoryError (JvNewStringUTF (msg)); } } *************** _Jv_ThreadWait (void) *** 410,412 **** --- 435,456 ---- pthread_cond_wait (&daemon_cond, &daemon_mutex); pthread_mutex_unlock (&daemon_mutex); } + + #if defined(SLOW_PTHREAD_SELF) + + #include "sysdep/locks.h" + + // Support for pthread_self() lookup cache. + volatile self_cache_entry _Jv_self_cache[SELF_CACHE_SIZE]; + + _Jv_ThreadId_t + _Jv_ThreadSelf_out_of_line(volatile self_cache_entry *sce, size_t high_sp_bits) + { + pthread_t self = pthread_self(); + sce -> high_sp_bits = high_sp_bits; + write_barrier(); + sce -> self = self; + return self; + } + + #endif /* SLOW_PTHREAD_SELF */ diff -Nrc3pad gcc-3.0.4/libjava/posix.cc gcc-3.1/libjava/posix.cc *** gcc-3.0.4/libjava/posix.cc Sat Feb 17 01:06:44 2001 --- gcc-3.1/libjava/posix.cc Sun Apr 7 11:30:07 2002 *************** *** 1,6 **** // posix.cc -- Helper functions for POSIX-flavored OSs. ! /* Copyright (C) 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // posix.cc -- Helper functions for POSIX-flavored OSs. ! /* Copyright (C) 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 12,52 **** #include "posix.h" #include #include #include #include #if defined (ECOS) extern "C" unsigned long long _clock (void); #endif // gettimeofday implementation. ! void ! _Jv_gettimeofday (struct timeval *tv) { #if defined (HAVE_GETTIMEOFDAY) ! gettimeofday (tv, NULL); #elif defined (HAVE_TIME) ! tv->tv_sec = time (NULL); ! tv->tv_usec = 0; #elif defined (HAVE_FTIME) struct timeb t; ftime (&t); ! tv->tv_sec = t.time; ! tv->tv_usec = t.millitm * 1000; #elif defined (ECOS) // FIXME. ! tv->tv_sec = _clock () / 1000; ! tv->tv_usec = 0; #else // In the absence of any function, time remains forever fixed. ! tv->tv_sec = 23; ! tv->tv_usec = 0; #endif } // A wrapper for select() which ignores EINTR. int _Jv_select (int n, fd_set *readfds, fd_set *writefds, --- 12,98 ---- #include "posix.h" + #include #include + #include #include #include #include + #include #if defined (ECOS) extern "C" unsigned long long _clock (void); #endif // gettimeofday implementation. ! jlong ! _Jv_platform_gettimeofday () { #if defined (HAVE_GETTIMEOFDAY) ! timeval tv; ! gettimeofday (&tv, NULL); ! return (tv.tv_sec * 1000LL) + (tv.tv_usec / 1000LL); #elif defined (HAVE_TIME) ! return time (NULL) * 1000LL; #elif defined (HAVE_FTIME) struct timeb t; ftime (&t); ! return (t.time * 1000LL) + t.millitm; #elif defined (ECOS) // FIXME. ! return _clock(); #else // In the absence of any function, time remains forever fixed. ! return 23000; ! #endif ! } ! ! // Platform-specific VM initialization. ! void ! _Jv_platform_initialize (void) ! { ! #if defined (HAVE_SIGACTION) ! // We only want this on POSIX systems. ! struct sigaction act; ! act.sa_handler = SIG_IGN; ! sigemptyset (&act.sa_mask); ! act.sa_flags = 0; ! sigaction (SIGPIPE, &act, NULL); ! #else ! signal (SIGPIPE, SIG_IGN); #endif } + // Set platform-specific System properties. + void + _Jv_platform_initProperties (java::util::Properties* newprops) + { + // A convenience define. + #define SET(Prop,Val) \ + newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val)) + + SET ("file.separator", "/"); + SET ("path.separator", ":"); + SET ("line.separator", "\n"); + char *tmpdir = ::getenv("TMPDIR"); + if (! tmpdir) + tmpdir = "/tmp"; + SET ("java.io.tmpdir", tmpdir); + } + + static inline void + internal_gettimeofday (struct timeval *result) + { + #if defined (HAVE_GETTIMEOFDAY) + gettimeofday (result, NULL); + #else + jlong val = _Jv_platform_gettimeofday (); + result->tv_sec = val / 1000; + result->tv_usec = (val % 1000) * 1000; + #endif /* HAVE_GETTIMEOFDAY */ + } + // A wrapper for select() which ignores EINTR. int _Jv_select (int n, fd_set *readfds, fd_set *writefds, *************** _Jv_select (int n, fd_set *readfds, fd_s *** 57,63 **** struct timeval end, delay; if (timeout) { ! _Jv_gettimeofday (&end); end.tv_usec += timeout->tv_usec; if (end.tv_usec >= 1000000) { --- 103,109 ---- struct timeval end, delay; if (timeout) { ! internal_gettimeofday (&end); end.tv_usec += timeout->tv_usec; if (end.tv_usec >= 1000000) { *************** _Jv_select (int n, fd_set *readfds, fd_s *** 87,93 **** struct timeval after; if (timeout) { ! _Jv_gettimeofday (&after); // Now compute new timeout argument. delay.tv_usec = end.tv_usec - after.tv_usec; delay.tv_sec = end.tv_sec - after.tv_sec; --- 133,139 ---- struct timeval after; if (timeout) { ! internal_gettimeofday (&after); // Now compute new timeout argument. delay.tv_usec = end.tv_usec - after.tv_usec; delay.tv_sec = end.tv_sec - after.tv_sec; diff -Nrc3pad gcc-3.0.4/libjava/prims.cc gcc-3.1/libjava/prims.cc *** gcc-3.0.4/libjava/prims.cc Sun May 20 16:24:40 2001 --- gcc-3.1/libjava/prims.cc Sun Mar 10 03:30:48 2002 *************** *** 1,6 **** // prims.cc - Code for core of runtime environment. ! /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // prims.cc - Code for core of runtime environment. ! /* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation This file is part of libgcj. *************** Libgcj License. Please consult the file *** 9,23 **** details. */ #include ! ! #ifdef USE_WIN32_SIGNALLING ! #include ! #endif /* USE_WIN32_SIGNALLING */ ! ! #ifdef USE_WINSOCK ! #undef __INSIDE_CYGWIN__ ! #include ! #endif /* USE_WINSOCK */ #include #include --- 9,15 ---- details. */ #include ! #include #include #include *************** details. */ *** 36,41 **** --- 28,34 ---- #ifdef ENABLE_JVMPI #include + #include #endif #ifndef DISABLE_GETENV_PROPERTIES *************** details. */ *** 52,67 **** #include #include #include - #include #include #include #include #include #include #include #include #include #include #ifdef USE_LTDL #include --- 45,65 ---- #include #include #include #include #include #include + #include #include #include #include #include #include #include + #include + #include + #include + #include + #include #ifdef USE_LTDL #include *************** static java::lang::OutOfMemoryError *no_ *** 74,81 **** // Largest representable size_t. #define SIZE_T_MAX ((size_t) (~ (size_t) 0)) // Properties set at compile time. ! const char **_Jv_Compiler_Properties; // The JAR file to add to the beginning of java.class.path. const char *_Jv_Jar_Class_Path; --- 72,81 ---- // Largest representable size_t. #define SIZE_T_MAX ((size_t) (~ (size_t) 0)) + static const char *no_properties[] = { NULL }; + // Properties set at compile time. ! const char **_Jv_Compiler_Properties = no_properties; // The JAR file to add to the beginning of java.class.path. const char *_Jv_Jar_Class_Path; *************** property_pair *_Jv_Environment_Propertie *** 86,92 **** #endif // The name of this executable. ! static char * _Jv_execName; // Stash the argv pointer to benefit native libraries that need it. const char **_Jv_argv; --- 86,92 ---- #endif // The name of this executable. ! static char *_Jv_execName; // Stash the argv pointer to benefit native libraries that need it. const char **_Jv_argv; *************** void (*_Jv_JVMPI_Notify_THREAD_END) (JVM *** 100,116 **** #endif ! extern "C" void _Jv_ThrowSignal (void *) __attribute ((noreturn)); // Just like _Jv_Throw, but fill in the stack trace first. Although // this is declared extern in order that its name not be mangled, it // is not intended to be used outside this file. void ! _Jv_ThrowSignal (void *e) { - java::lang::Throwable *throwable = (java::lang::Throwable *)e; throwable->fillInStackTrace (); ! _Jv_Throw (throwable); } #ifdef HANDLE_SEGV --- 100,115 ---- #endif ! extern "C" void _Jv_ThrowSignal (jthrowable) __attribute ((noreturn)); // Just like _Jv_Throw, but fill in the stack trace first. Although // this is declared extern in order that its name not be mangled, it // is not intended to be used outside this file. void ! _Jv_ThrowSignal (jthrowable throwable) { throwable->fillInStackTrace (); ! throw throwable; } #ifdef HANDLE_SEGV *************** _Jv_strLengthUtf8(char* str, int len) *** 216,226 **** ptr = (unsigned char*) str; limit = ptr + len; str_length = 0; ! for (; ptr < limit; str_length++) { ! if (UTF8_GET (ptr, limit) < 0) { ! return (-1); } - } return (str_length); } --- 215,225 ---- ptr = (unsigned char*) str; limit = ptr + len; str_length = 0; ! for (; ptr < limit; str_length++) ! { ! if (UTF8_GET (ptr, limit) < 0) ! return (-1); } return (str_length); } *************** _Jv_makeUtf8Const (char* s, int len) *** 250,257 **** if (len < 0) len = strlen (s); Utf8Const* m = (Utf8Const*) _Jv_AllocBytes (sizeof(Utf8Const) + len + 1); - if (! m) - JvThrow (no_memory); memcpy (m->data, s, len); m->data[len] = 0; m->length = len; --- 249,254 ---- *************** _Jv_makeUtf8Const (jstring string) *** 266,272 **** jint len = _Jv_GetStringUTFLength (string); Utf8Const* m = (Utf8Const*) ! _Jv_AllocBytesChecked (sizeof(Utf8Const) + len + 1); m->hash = hash; m->length = len; --- 263,269 ---- jint len = _Jv_GetStringUTFLength (string); Utf8Const* m = (Utf8Const*) ! _Jv_AllocBytes (sizeof(Utf8Const) + len + 1); m->hash = hash; m->length = len; *************** _Jv_Abort (const char *, const char *, i *** 293,302 **** "libgcj failure: %s\n in function %s, file %s, line %d\n", message, function, file, line); #else ! java::io::PrintStream *err = java::lang::System::err; ! err->print(JvNewStringLatin1 ("libgcj failure: ")); ! err->println(JvNewStringLatin1 (message)); ! err->flush(); #endif abort (); } --- 290,296 ---- "libgcj failure: %s\n in function %s, file %s, line %d\n", message, function, file, line); #else ! fprintf (stderr, "libgcj failure: %s\n", message); #endif abort (); } *************** _Jv_GCWatch (jobject obj) *** 316,363 **** void _Jv_ThrowBadArrayIndex(jint bad_index) { ! JvThrow (new java::lang::ArrayIndexOutOfBoundsException ! (java::lang::String::valueOf(bad_index))); } void _Jv_ThrowNullPointerException () { ! throw new java::lang::NullPointerException (); } ! // Allocate some unscanned memory and throw an exception if no memory. ! void * ! _Jv_AllocBytesChecked (jsize size) { ! void *r = _Jv_AllocBytes (size); ! if (! r) ! _Jv_Throw (no_memory); ! return r; } // Allocate a new object of class KLASS. SIZE is the size of the object // to allocate. You might think this is redundant, but it isn't; some // classes, such as String, aren't of fixed size. jobject ! _Jv_AllocObject (jclass klass, jint size) { ! _Jv_InitClass (klass); jobject obj = (jobject) _Jv_AllocObj (size, klass); ! if (__builtin_expect (! obj, false)) ! JvThrow (no_memory); ! // If this class has inherited finalize from Object, then don't ! // bother registering a finalizer. We know that finalize() is the ! // very first method after the dummy entry. If this turns out to be ! // unreliable, a more robust implementation can be written. Such an ! // implementation would look for Object.finalize in Object's method ! // table at startup, and then use that information to find the ! // appropriate index in the method vector. ! if (klass->vtable->get_finalizer() ! != java::lang::Object::class$.vtable->get_finalizer()) _Jv_RegisterFinalizer (obj, _Jv_FinalizeObject); #ifdef ENABLE_JVMPI // Service JVMPI request. --- 310,419 ---- void _Jv_ThrowBadArrayIndex(jint bad_index) { ! throw new java::lang::ArrayIndexOutOfBoundsException ! (java::lang::String::valueOf (bad_index)); } void _Jv_ThrowNullPointerException () { ! throw new java::lang::NullPointerException; } ! // Explicitly throw a no memory exception. ! // The collector calls this when it encounters an out-of-memory condition. ! void _Jv_ThrowNoMemory() { ! throw no_memory; } + #ifdef ENABLE_JVMPI + static void + jvmpi_notify_alloc(jclass klass, jint size, jobject obj) + { + // Service JVMPI allocation request. + if (__builtin_expect (_Jv_JVMPI_Notify_OBJECT_ALLOC != 0, false)) + { + JVMPI_Event event; + + event.event_type = JVMPI_EVENT_OBJECT_ALLOC; + event.env_id = NULL; + event.u.obj_alloc.arena_id = 0; + event.u.obj_alloc.class_id = (jobjectID) klass; + event.u.obj_alloc.is_array = 0; + event.u.obj_alloc.size = size; + event.u.obj_alloc.obj_id = (jobjectID) obj; + + // FIXME: This doesn't look right for the Boehm GC. A GC may + // already be in progress. _Jv_DisableGC () doesn't wait for it. + // More importantly, I don't see the need for disabling GC, since we + // blatantly have a pointer to obj on our stack, ensuring that the + // object can't be collected. Even for a nonconservative collector, + // it appears to me that this must be true, since we are about to + // return obj. Isn't this whole approach way too intrusive for + // a useful profiling interface? - HB + _Jv_DisableGC (); + (*_Jv_JVMPI_Notify_OBJECT_ALLOC) (&event); + _Jv_EnableGC (); + } + } + #else /* !ENABLE_JVMPI */ + # define jvmpi_notify_alloc(klass,size,obj) /* do nothing */ + #endif + // Allocate a new object of class KLASS. SIZE is the size of the object // to allocate. You might think this is redundant, but it isn't; some // classes, such as String, aren't of fixed size. + // First a version that assumes that we have no finalizer, and that + // the class is already initialized. + // If we know that JVMPI is disabled, this can be replaced by a direct call + // to the allocator for the appropriate GC. jobject ! _Jv_AllocObjectNoInitNoFinalizer (jclass klass, jint size) { ! jobject obj = (jobject) _Jv_AllocObj (size, klass); ! jvmpi_notify_alloc (klass, size, obj); ! return obj; ! } + // And now a version that initializes if necessary. + jobject + _Jv_AllocObjectNoFinalizer (jclass klass, jint size) + { + _Jv_InitClass (klass); jobject obj = (jobject) _Jv_AllocObj (size, klass); ! jvmpi_notify_alloc (klass, size, obj); ! return obj; ! } ! // And now the general version that registers a finalizer if necessary. ! jobject ! _Jv_AllocObject (jclass klass, jint size) ! { ! jobject obj = _Jv_AllocObjectNoFinalizer (klass, size); ! ! // We assume that the compiler only generates calls to this routine ! // if there really is an interesting finalizer. ! // Unfortunately, we still have to the dynamic test, since there may ! // be cni calls to this routine. ! // Nore that on IA64 get_finalizer() returns the starting address of the ! // function, not a function pointer. Thus this still works. ! if (klass->vtable->get_finalizer () ! != java::lang::Object::class$.vtable->get_finalizer ()) _Jv_RegisterFinalizer (obj, _Jv_FinalizeObject); + return obj; + } + + // A version of the above that assumes the object contains no pointers, + // and requires no finalization. This can't happen if we need pointers + // to locks. + #ifdef JV_HASH_SYNCHRONIZATION + jobject + _Jv_AllocPtrFreeObject (jclass klass, jint size) + { + _Jv_InitClass (klass); + + jobject obj = (jobject) _Jv_AllocPtrFreeObj (size, klass); #ifdef ENABLE_JVMPI // Service JVMPI request. *************** _Jv_AllocObject (jclass klass, jint size *** 382,387 **** --- 438,445 ---- return obj; } + #endif /* JV_HASH_SYNCHRONIZATION */ + // Allocate a new array of Java objects. Each object is of type // `elementClass'. `init' is used to initialize each slot in the *************** jobjectArray *** 390,396 **** _Jv_NewObjectArray (jsize count, jclass elementClass, jobject init) { if (__builtin_expect (count < 0, false)) ! JvThrow (new java::lang::NegativeArraySizeException); JvAssert (! elementClass->isPrimitive ()); --- 448,454 ---- _Jv_NewObjectArray (jsize count, jclass elementClass, jobject init) { if (__builtin_expect (count < 0, false)) ! throw new java::lang::NegativeArraySizeException; JvAssert (! elementClass->isPrimitive ()); *************** _Jv_NewObjectArray (jsize count, jclass *** 403,410 **** jclass klass = _Jv_GetArrayClass (elementClass, 0); obj = (jobjectArray) _Jv_AllocArray (size, klass); - if (__builtin_expect (! obj, false)) - JvThrow (no_memory); // Cast away const. jsize *lp = const_cast (&obj->length); *lp = count; --- 461,466 ---- *************** _Jv_NewPrimArray (jclass eltype, jint co *** 426,432 **** { int elsize = eltype->size(); if (__builtin_expect (count < 0, false)) ! JvThrow (new java::lang::NegativeArraySizeException ()); JvAssert (eltype->isPrimitive ()); jobject dummy = NULL; --- 482,488 ---- { int elsize = eltype->size(); if (__builtin_expect (count < 0, false)) ! throw new java::lang::NegativeArraySizeException; JvAssert (eltype->isPrimitive ()); jobject dummy = NULL; *************** _Jv_NewPrimArray (jclass eltype, jint co *** 435,451 **** // Check for overflow. if (__builtin_expect ((size_t) count > (SIZE_T_MAX - size) / elsize, false)) ! JvThrow (no_memory); jclass klass = _Jv_GetArrayClass (eltype, 0); __JArray *arr = (__JArray*) _Jv_AllocObj (size + elsize * count, klass); ! if (__builtin_expect (! arr, false)) ! JvThrow (no_memory); // Cast away const. jsize *lp = const_cast (&arr->length); *lp = count; - // Note that we assume we are given zeroed memory by the allocator. return arr; } --- 491,513 ---- // Check for overflow. if (__builtin_expect ((size_t) count > (SIZE_T_MAX - size) / elsize, false)) ! throw no_memory; jclass klass = _Jv_GetArrayClass (eltype, 0); + # ifdef JV_HASH_SYNCHRONIZATION + // Since the vtable is always statically allocated, + // these are completely pointerfree! Make sure the GC doesn't touch them. + __JArray *arr = + (__JArray*) _Jv_AllocPtrFreeObj (size + elsize * count, klass); + memset((char *)arr + size, 0, elsize * count); + # else __JArray *arr = (__JArray*) _Jv_AllocObj (size + elsize * count, klass); ! // Note that we assume we are given zeroed memory by the allocator. ! # endif // Cast away const. jsize *lp = const_cast (&arr->length); *lp = count; return arr; } *************** _Jv_NewArray (jint type, jint size) *** 464,475 **** case 10: return JvNewIntArray (size); case 11: return JvNewLongArray (size); } ! JvFail ("newarray - bad type code"); ! return NULL; // Placate compiler. } ! jobject ! _Jv_NewMultiArray (jclass type, jint dimensions, jint *sizes) { JvAssert (type->isArray()); jclass element_type = type->getComponentType(); --- 526,539 ---- case 10: return JvNewIntArray (size); case 11: return JvNewLongArray (size); } ! throw new java::lang::InternalError ! (JvNewStringLatin1 ("invalid type code in _Jv_NewArray")); } ! // Allocate a possibly multi-dimensional array but don't check that ! // any array length is <0. ! static jobject ! _Jv_NewMultiArrayUnchecked (jclass type, jint dimensions, jint *sizes) { JvAssert (type->isArray()); jclass element_type = type->getComponentType(); *************** _Jv_NewMultiArray (jclass type, jint dim *** 485,498 **** JvAssert (element_type->isArray()); jobject *contents = elements ((jobjectArray) result); for (int i = 0; i < sizes[0]; ++i) ! contents[i] = _Jv_NewMultiArray (element_type, dimensions - 1, ! sizes + 1); } return result; } jobject _Jv_NewMultiArray (jclass array_type, jint dimensions, ...) { va_list args; --- 549,572 ---- JvAssert (element_type->isArray()); jobject *contents = elements ((jobjectArray) result); for (int i = 0; i < sizes[0]; ++i) ! contents[i] = _Jv_NewMultiArrayUnchecked (element_type, dimensions - 1, ! sizes + 1); } return result; } jobject + _Jv_NewMultiArray (jclass type, jint dimensions, jint *sizes) + { + for (int i = 0; i < dimensions; ++i) + if (sizes[i] < 0) + throw new java::lang::NegativeArraySizeException; + + return _Jv_NewMultiArrayUnchecked (type, dimensions, sizes); + } + + jobject _Jv_NewMultiArray (jclass array_type, jint dimensions, ...) { va_list args; *************** _Jv_NewMultiArray (jclass array_type, ji *** 501,530 **** for (int i = 0; i < dimensions; ++i) { jint size = va_arg (args, jint); sizes[i] = size; } va_end (args); ! return _Jv_NewMultiArray (array_type, dimensions, sizes); } ! #define DECLARE_PRIM_TYPE(NAME, SIG, LEN) \ ! _Jv_ArrayVTable _Jv_##NAME##VTable; \ ! java::lang::Class _Jv_##NAME##Class ((jobject) #NAME, \ ! (jbyte) SIG, (jint) LEN, \ ! (jobject) &_Jv_##NAME##VTable); ! DECLARE_PRIM_TYPE(byte, 'B', 1); ! DECLARE_PRIM_TYPE(short, 'S', 2); ! DECLARE_PRIM_TYPE(int, 'I', 4); ! DECLARE_PRIM_TYPE(long, 'J', 8); ! DECLARE_PRIM_TYPE(boolean, 'Z', 1); ! DECLARE_PRIM_TYPE(char, 'C', 2); ! DECLARE_PRIM_TYPE(float, 'F', 4); ! DECLARE_PRIM_TYPE(double, 'D', 8); ! DECLARE_PRIM_TYPE(void, 'V', 0); jclass _Jv_FindClassFromSignature (char *sig, java::lang::ClassLoader *loader) --- 575,630 ---- for (int i = 0; i < dimensions; ++i) { jint size = va_arg (args, jint); + if (size < 0) + throw new java::lang::NegativeArraySizeException; sizes[i] = size; } va_end (args); ! return _Jv_NewMultiArrayUnchecked (array_type, dimensions, sizes); } ! // Ensure 8-byte alignment, for hash synchronization. ! #define DECLARE_PRIM_TYPE(NAME) \ ! _Jv_ArrayVTable _Jv_##NAME##VTable; \ ! java::lang::Class _Jv_##NAME##Class __attribute__ ((aligned (8))); ! DECLARE_PRIM_TYPE(byte); ! DECLARE_PRIM_TYPE(short); ! DECLARE_PRIM_TYPE(int); ! DECLARE_PRIM_TYPE(long); ! DECLARE_PRIM_TYPE(boolean); ! DECLARE_PRIM_TYPE(char); ! DECLARE_PRIM_TYPE(float); ! DECLARE_PRIM_TYPE(double); ! DECLARE_PRIM_TYPE(void); ! ! void ! _Jv_InitPrimClass (jclass cl, char *cname, char sig, int len, ! _Jv_ArrayVTable *array_vtable) ! { ! using namespace java::lang::reflect; ! ! _Jv_InitNewClassFields (cl); ! ! // We must set the vtable for the class; the Java constructor ! // doesn't do this. ! (*(_Jv_VTable **) cl) = java::lang::Class::class$.vtable; ! ! // Initialize the fields we care about. We do this in the same ! // order they are declared in Class.h. ! cl->name = _Jv_makeUtf8Const ((char *) cname, -1); ! cl->accflags = Modifier::PUBLIC | Modifier::FINAL | Modifier::ABSTRACT; ! cl->method_count = sig; ! cl->size_in_bytes = len; ! cl->vtable = JV_PRIMITIVE_VTABLE; ! cl->state = JV_STATE_DONE; ! cl->depth = -1; ! if (sig != 'V') ! _Jv_NewArrayClass (cl, NULL, (_Jv_VTable *) array_vtable); ! } jclass _Jv_FindClassFromSignature (char *sig, java::lang::ClassLoader *loader) *************** JvConvertArgv (int argc, const char **ar *** 578,589 **** if (argc < 0) argc = 0; jobjectArray ar = JvNewObjectArray(argc, &StringClass, NULL); ! jobject* ptr = elements(ar); for (int i = 0; i < argc; i++) { const char *arg = argv[i]; ! // FIXME - should probably use JvNewStringUTF. ! *ptr++ = JvNewStringLatin1(arg, strlen(arg)); } return (JArray*) ar; } --- 678,697 ---- if (argc < 0) argc = 0; jobjectArray ar = JvNewObjectArray(argc, &StringClass, NULL); ! jobject *ptr = elements(ar); ! jbyteArray bytes = NULL; for (int i = 0; i < argc; i++) { const char *arg = argv[i]; ! int len = strlen (arg); ! if (bytes == NULL || bytes->length < len) ! bytes = JvNewByteArray (len); ! jbyte *bytePtr = elements (bytes); ! // We assume jbyte == char. ! memcpy (bytePtr, arg, len); ! ! // Now convert using the default encoding. ! *ptr++ = new java::lang::String (bytes, 0, len); } return (JArray*) ar; } *************** JvConvertArgv (int argc, const char **ar *** 594,600 **** // it will only scan the qthreads stacks. // Command line arguments. ! static jobject arg_vec; // The primary thread. static java::lang::Thread *main_thread; --- 702,708 ---- // it will only scan the qthreads stacks. // Command line arguments. ! static JArray *arg_vec; // The primary thread. static java::lang::Thread *main_thread; *************** _Jv_ThisExecutable (const char *name) *** 615,691 **** } } - #ifdef USE_WIN32_SIGNALLING - - extern "C" int* win32_get_restart_frame (void *); - - LONG CALLBACK - win32_exception_handler (LPEXCEPTION_POINTERS e) - { - int* setjmp_buf; - if (e->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) - setjmp_buf = win32_get_restart_frame (nullp); - else if (e->ExceptionRecord->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO) - setjmp_buf = win32_get_restart_frame (arithexception); - else - return EXCEPTION_CONTINUE_SEARCH; - - e->ContextRecord->Ebp = setjmp_buf[0]; - // FIXME: Why does i386-signal.h increment the PC here, do we need to do it? - e->ContextRecord->Eip = setjmp_buf[1]; - // FIXME: Is this the stack pointer? Do we need it? - e->ContextRecord->Esp = setjmp_buf[2]; - - return EXCEPTION_CONTINUE_EXECUTION; - } - - #endif - - static void - main_init () - { - // Turn stack trace generation off while creating exception objects. - _Jv_InitClass (&java::lang::Throwable::class$); - java::lang::Throwable::trace_enabled = 0; - - INIT_SEGV; - #ifdef HANDLE_FPE - INIT_FPE; - #else - arithexception = new java::lang::ArithmeticException - (JvNewStringLatin1 ("/ by zero")); - #endif - - no_memory = new java::lang::OutOfMemoryError; - - java::lang::Throwable::trace_enabled = 1; - - #ifdef USE_LTDL - LTDL_SET_PRELOADED_SYMBOLS (); - #endif - - #ifdef USE_WINSOCK - // Initialise winsock for networking - WSADATA data; - if (WSAStartup (MAKEWORD (1, 1), &data)) - MessageBox (NULL, "Error initialising winsock library.", "Error", MB_OK | MB_ICONEXCLAMATION); - #endif /* USE_WINSOCK */ - - #ifdef USE_WIN32_SIGNALLING - // Install exception handler - SetUnhandledExceptionFilter (win32_exception_handler); - #else - // We only want this on POSIX systems. - struct sigaction act; - act.sa_handler = SIG_IGN; - sigemptyset (&act.sa_mask); - act.sa_flags = 0; - sigaction (SIGPIPE, &act, NULL); - #endif /* USE_WIN32_SIGNALLING */ - - _Jv_JNI_Init (); - } - #ifndef DISABLE_GETENV_PROPERTIES static char * --- 723,728 ---- *************** process_gcj_properties () *** 829,914 **** } #endif // DISABLE_GETENV_PROPERTIES ! void ! JvRunMain (jclass klass, int argc, const char **argv) { PROCESS_GCJ_PROPERTIES; ! _Jv_argv = argv; ! _Jv_argc = argc; ! main_init (); ! #ifdef HAVE_PROC_SELF_EXE ! char exec_name[20]; ! sprintf (exec_name, "/proc/%d/exe", getpid ()); ! _Jv_ThisExecutable (exec_name); #else ! _Jv_ThisExecutable (argv[0]); #endif ! arg_vec = JvConvertArgv (argc - 1, argv + 1); ! main_thread = new gnu::gcj::runtime::FirstThread (klass, arg_vec); ! main_thread->start(); ! _Jv_ThreadWait (); ! int status = (int) java::lang::ThreadGroup::had_uncaught_exception; ! ! java::lang::Runtime::getRuntime ()->_exit (status); } void ! _Jv_RunMain (const char *name, int argc, const char **argv, bool is_jar) { ! jstring class_name; ! PROCESS_GCJ_PROPERTIES; - main_init (); #ifdef HAVE_PROC_SELF_EXE char exec_name[20]; sprintf (exec_name, "/proc/%d/exe", getpid ()); _Jv_ThisExecutable (exec_name); ! #endif ! if (is_jar) { ! // name specifies a jar file. We must now extract the ! // Main-Class attribute from the jar's manifest file. This is ! // done by gnu.gcj.runtime.FirstThread.main. ! _Jv_Jar_Class_Path = strdup (name); ! arg_vec = JvConvertArgv (1, &_Jv_Jar_Class_Path); ! ! main_thread = ! new gnu::gcj::runtime::FirstThread (&gnu::gcj::runtime::FirstThread::class$, ! arg_vec); ! main_thread->start(); ! _Jv_ThreadWait (); ! ! // FirstThread.main extracts the main class name and stores it ! // here. ! class_name = gnu::gcj::runtime::FirstThread::jarMainClassName; ! // We need a new ClassLoader because the classpath must be the ! // jar file only. The easiest way to do this is to lose our ! // reference to the previous classloader. ! java::lang::ClassLoader::system = NULL; ! } ! else ! class_name = JvNewStringLatin1 (name); ! arg_vec = JvConvertArgv (argc - 1, argv + 1); ! if (class_name) { ! main_thread = new gnu::gcj::runtime::FirstThread (class_name, arg_vec); ! main_thread->start(); ! _Jv_ThreadWait (); } int status = (int) java::lang::ThreadGroup::had_uncaught_exception; ! java::lang::Runtime::getRuntime ()->exit (status); } --- 866,1023 ---- } #endif // DISABLE_GETENV_PROPERTIES ! namespace gcj ! { ! _Jv_Utf8Const *void_signature; ! _Jv_Utf8Const *clinit_name; ! _Jv_Utf8Const *init_name; ! _Jv_Utf8Const *finit_name; ! ! bool runtimeInitialized = false; ! } ! ! jint ! _Jv_CreateJavaVM (void* /*vm_args*/) { + using namespace gcj; + + if (runtimeInitialized) + return -1; + + runtimeInitialized = true; + PROCESS_GCJ_PROPERTIES; ! _Jv_InitThreads (); ! _Jv_InitGC (); ! _Jv_InitializeSyncMutex (); ! /* Initialize Utf8 constants declared in jvm.h. */ ! void_signature = _Jv_makeUtf8Const ("()V", 3); ! clinit_name = _Jv_makeUtf8Const ("", 8); ! init_name = _Jv_makeUtf8Const ("", 6); ! finit_name = _Jv_makeUtf8Const ("finit$", 6); ! ! /* Initialize built-in classes to represent primitive TYPEs. */ ! _Jv_InitPrimClass (&_Jv_byteClass, "byte", 'B', 1, &_Jv_byteVTable); ! _Jv_InitPrimClass (&_Jv_shortClass, "short", 'S', 2, &_Jv_shortVTable); ! _Jv_InitPrimClass (&_Jv_intClass, "int", 'I', 4, &_Jv_intVTable); ! _Jv_InitPrimClass (&_Jv_longClass, "long", 'J', 8, &_Jv_longVTable); ! _Jv_InitPrimClass (&_Jv_booleanClass, "boolean", 'Z', 1, &_Jv_booleanVTable); ! _Jv_InitPrimClass (&_Jv_charClass, "char", 'C', 2, &_Jv_charVTable); ! _Jv_InitPrimClass (&_Jv_floatClass, "float", 'F', 4, &_Jv_floatVTable); ! _Jv_InitPrimClass (&_Jv_doubleClass, "double", 'D', 8, &_Jv_doubleVTable); ! _Jv_InitPrimClass (&_Jv_voidClass, "void", 'V', 0, &_Jv_voidVTable); ! ! // Turn stack trace generation off while creating exception objects. ! _Jv_InitClass (&java::lang::Throwable::class$); ! java::lang::Throwable::trace_enabled = 0; ! ! INIT_SEGV; ! #ifdef HANDLE_FPE ! INIT_FPE; #else ! arithexception = new java::lang::ArithmeticException ! (JvNewStringLatin1 ("/ by zero")); #endif ! no_memory = new java::lang::OutOfMemoryError; ! java::lang::Throwable::trace_enabled = 1; ! #ifdef USE_LTDL ! LTDL_SET_PRELOADED_SYMBOLS (); ! #endif ! ! _Jv_platform_initialize (); ! ! _Jv_JNI_Init (); ! ! _Jv_GCInitializeFinalizers (&::gnu::gcj::runtime::FinalizerThread::finalizerReady); ! ! // Start the GC finalizer thread. A VirtualMachineError can be ! // thrown by the runtime if, say, threads aren't available. In this ! // case finalizers simply won't run. ! try ! { ! using namespace gnu::gcj::runtime; ! FinalizerThread *ft = new FinalizerThread (); ! ft->start (); ! } ! catch (java::lang::VirtualMachineError *ignore) ! { ! } ! ! return 0; } void ! _Jv_RunMain (jclass klass, const char *name, int argc, const char **argv, ! bool is_jar) { ! _Jv_argv = argv; ! _Jv_argc = argc; ! ! java::lang::Runtime *runtime = NULL; + #ifdef DISABLE_MAIN_ARGS + _Jv_ThisExecutable ("[Embedded App]"); + #else #ifdef HAVE_PROC_SELF_EXE char exec_name[20]; sprintf (exec_name, "/proc/%d/exe", getpid ()); _Jv_ThisExecutable (exec_name); ! #else ! _Jv_ThisExecutable (argv[0]); ! #endif /* HAVE_PROC_SELF_EXE */ ! #endif /* DISABLE_MAIN_ARGS */ ! try { ! // Set this very early so that it is seen when java.lang.System ! // is initialized. ! if (is_jar) ! _Jv_Jar_Class_Path = strdup (name); ! _Jv_CreateJavaVM (NULL); ! // Get the Runtime here. We want to initialize it before searching ! // for `main'; that way it will be set up if `main' is a JNI method. ! runtime = java::lang::Runtime::getRuntime (); ! #ifdef DISABLE_MAIN_ARGS ! arg_vec = JvConvertArgv (0, 0); ! #else ! arg_vec = JvConvertArgv (argc - 1, argv + 1); ! #endif ! using namespace gnu::gcj::runtime; ! if (klass) ! main_thread = new FirstThread (klass, arg_vec); ! else ! main_thread = new FirstThread (JvNewStringLatin1 (name), ! arg_vec, is_jar); ! } ! catch (java::lang::Throwable *t) { ! java::lang::System::err->println (JvNewStringLatin1 ! ("Exception during runtime initialization")); ! t->printStackTrace(); ! runtime->exit (1); } + _Jv_AttachCurrentThread (main_thread); + _Jv_ThreadRun (main_thread); + _Jv_ThreadWait (); + int status = (int) java::lang::ThreadGroup::had_uncaught_exception; + runtime->exit (status); + } ! void ! JvRunMain (jclass klass, int argc, const char **argv) ! { ! _Jv_RunMain (klass, NULL, argc, argv, false); } *************** _Jv_Malloc (jsize size) *** 953,959 **** size = 1; void *ptr = malloc ((size_t) size); if (__builtin_expect (ptr == NULL, false)) ! JvThrow (no_memory); return ptr; } --- 1062,1068 ---- size = 1; void *ptr = malloc ((size_t) size); if (__builtin_expect (ptr == NULL, false)) ! throw no_memory; return ptr; } *************** _Jv_Realloc (void *ptr, jsize size) *** 964,970 **** size = 1; ptr = realloc (ptr, (size_t) size); if (__builtin_expect (ptr == NULL, false)) ! JvThrow (no_memory); return ptr; } --- 1073,1079 ---- size = 1; ptr = realloc (ptr, (size_t) size); if (__builtin_expect (ptr == NULL, false)) ! throw no_memory; return ptr; } diff -Nrc3pad gcc-3.0.4/libjava/resolve.cc gcc-3.1/libjava/resolve.cc *** gcc-3.0.4/libjava/resolve.cc Wed Oct 3 08:31:50 2001 --- gcc-3.1/libjava/resolve.cc Tue Jan 8 20:51:45 2002 *************** *** 1,6 **** // resolve.cc - Code for linking and resolving classes and pool entries. ! /* Copyright (C) 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. --- 1,6 ---- // resolve.cc - Code for linking and resolving classes and pool entries. ! /* Copyright (C) 1999, 2000, 2001 , 2002 Free Software Foundation This file is part of libgcj. *************** details. */ *** 32,37 **** --- 32,39 ---- #include #include + using namespace gcj; + void _Jv_ResolveField (_Jv_Field *field, java::lang::ClassLoader *loader) { *************** _Jv_BuildResolvedMethod (_Jv_Method*, *** 65,76 **** jint); - // We need to know the name of a constructor. - static _Jv_Utf8Const *init_name = _Jv_makeUtf8Const ("", 6); - static void throw_incompatible_class_change_error (jstring msg) { ! JvThrow (new java::lang::IncompatibleClassChangeError (msg)); } _Jv_word --- 67,75 ---- jint); static void throw_incompatible_class_change_error (jstring msg) { ! throw new java::lang::IncompatibleClassChangeError (msg); } _Jv_word *************** _Jv_ResolvePoolEntry (jclass klass, int *** 98,104 **** if (! found) { jstring str = _Jv_NewStringUTF (name->data); ! JvThrow (new java::lang::ClassNotFoundException (str)); } if ((found->accflags & Modifier::PUBLIC) == Modifier::PUBLIC --- 97,103 ---- if (! found) { jstring str = _Jv_NewStringUTF (name->data); ! throw new java::lang::ClassNotFoundException (str); } if ((found->accflags & Modifier::PUBLIC) == Modifier::PUBLIC *************** _Jv_ResolvePoolEntry (jclass klass, int *** 110,116 **** } else { ! JvThrow (new java::lang::IllegalAccessError (found->getName())); } } break; --- 109,115 ---- } else { ! throw new java::lang::IllegalAccessError (found->getName()); } } break; *************** _Jv_ResolvePoolEntry (jclass klass, int *** 185,201 **** _Jv_ResolveField (field, cls->loader); if (field_type != 0 && field->type != field_type) ! JvThrow ! (new java::lang::LinkageError ! (JvNewStringLatin1 ! ("field type mismatch with different loaders"))); the_field = field; goto end_of_field_search; } else { ! JvThrow (new java::lang::IllegalAccessError); } } } --- 184,199 ---- _Jv_ResolveField (field, cls->loader); if (field_type != 0 && field->type != field_type) ! throw new java::lang::LinkageError ! (JvNewStringLatin1 ! ("field type mismatch with different loaders")); the_field = field; goto end_of_field_search; } else { ! throw new java::lang::IllegalAccessError; } } } *************** _Jv_ResolvePoolEntry (jclass klass, int *** 319,325 **** msg = msg->concat (JvNewStringLatin1(".")); msg = msg->concat (_Jv_NewStringUTF (method_name->data)); msg = msg->concat (JvNewStringLatin1(" was not found.")); ! JvThrow(new java::lang::NoSuchMethodError (msg)); } pool->data[index].rmethod = --- 317,323 ---- msg = msg->concat (JvNewStringLatin1(".")); msg = msg->concat (_Jv_NewStringUTF (method_name->data)); msg = msg->concat (JvNewStringLatin1(" was not found.")); ! throw new java::lang::NoSuchMethodError (msg); } pool->data[index].rmethod = *************** _Jv_SearchMethodInClass (jclass cls, jcl *** 366,372 **** } else { ! JvThrow (new java::lang::IllegalAccessError); } } return 0; --- 364,370 ---- } else { ! throw new java::lang::IllegalAccessError; } } return 0; *************** _Jv_DetermineVTableIndex (jclass klass, *** 486,492 **** static void _Jv_abstractMethodError () { ! JvThrow (new java::lang::AbstractMethodError); } void --- 484,490 ---- static void _Jv_abstractMethodError () { ! throw new java::lang::AbstractMethodError; } void *************** _Jv_PrepareClass(jclass klass) *** 580,590 **** // set the instance size for the class clz->size_in_bytes = instance_size; ! // allocate static memory if (static_size != 0) { ! char *static_data = (char*)_Jv_AllocBytesChecked (static_size); memset (static_data, 0, static_size); --- 578,588 ---- // set the instance size for the class clz->size_in_bytes = instance_size; ! // allocate static memory if (static_size != 0) { ! char *static_data = (char*)_Jv_AllocBytes (static_size); memset (static_data, 0, static_size); *************** _Jv_PrepareClass(jclass klass) *** 630,635 **** --- 628,634 ---- else if (imeth != 0) // it could be abstract { _Jv_InterpMethod *im = reinterpret_cast<_Jv_InterpMethod *> (imeth); + _Jv_VerifyMethod (im); clz->methods[i].ncode = im->ncode (); } } *************** _Jv_PrepareClass(jclass klass) *** 684,691 **** { clz->state = JV_STATE_ERROR; clz->notifyAll (); ! JvThrow (new java::lang::IncompatibleClassChangeError ! (clz->getName ())); } /* FIXME: At this point, if (loader != super_class->loader), we --- 683,689 ---- { clz->state = JV_STATE_ERROR; clz->notifyAll (); ! throw new java::lang::IncompatibleClassChangeError (clz->getName ()); } /* FIXME: At this point, if (loader != super_class->loader), we *************** get_ffi_type_from_signature (unsigned ch *** 961,969 **** * function is non-static, then one is added to the number of elements * found in the signature */ ! static int ! count_arguments (_Jv_Utf8Const *signature, ! jboolean staticp) { unsigned char *ptr = (unsigned char*) signature->data; int arg_count = staticp ? 0 : 1; --- 959,967 ---- * function is non-static, then one is added to the number of elements * found in the signature */ ! int ! _Jv_count_arguments (_Jv_Utf8Const *signature, ! jboolean staticp) { unsigned char *ptr = (unsigned char*) signature->data; int arg_count = staticp ? 0 : 1; *************** init_cif (_Jv_Utf8Const* signature, *** 1051,1057 **** #endif /* we put this one here, and not in interpret.cc because it ! * calls the utility routines count_arguments * which are static to this module. The following struct defines the * layout we use for the stubs, it's only used in the ncode method. */ --- 1049,1055 ---- #endif /* we put this one here, and not in interpret.cc because it ! * calls the utility routines _Jv_count_arguments * which are static to this module. The following struct defines the * layout we use for the stubs, it's only used in the ncode method. */ *************** _Jv_InterpMethod::ncode () *** 1072,1081 **** return self->ncode; jboolean staticp = (self->accflags & Modifier::STATIC) != 0; ! int arg_count = count_arguments (self->signature, staticp); ncode_closure *closure = ! (ncode_closure*)_Jv_AllocBytesChecked (sizeof (ncode_closure) + arg_count * sizeof (ffi_type*)); init_cif (self->signature, --- 1070,1079 ---- return self->ncode; jboolean staticp = (self->accflags & Modifier::STATIC) != 0; ! int arg_count = _Jv_count_arguments (self->signature, staticp); ncode_closure *closure = ! (ncode_closure*)_Jv_AllocBytes (sizeof (ncode_closure) + arg_count * sizeof (ffi_type*)); init_cif (self->signature, *************** _Jv_JNIMethod::ncode () *** 1122,1132 **** return self->ncode; jboolean staticp = (self->accflags & Modifier::STATIC) != 0; ! int arg_count = count_arguments (self->signature, staticp); ncode_closure *closure = ! (ncode_closure*)_Jv_AllocBytesChecked (sizeof (ncode_closure) ! + arg_count * sizeof (ffi_type*)); ffi_type *rtype; init_cif (self->signature, --- 1120,1130 ---- return self->ncode; jboolean staticp = (self->accflags & Modifier::STATIC) != 0; ! int arg_count = _Jv_count_arguments (self->signature, staticp); ncode_closure *closure = ! (ncode_closure*)_Jv_AllocBytes (sizeof (ncode_closure) ! + arg_count * sizeof (ffi_type*)); ffi_type *rtype; init_cif (self->signature, *************** _Jv_BuildResolvedMethod (_Jv_Method* met *** 1183,1193 **** jboolean staticp, jint vtable_index) { ! int arg_count = count_arguments (method->signature, staticp); _Jv_ResolvedMethod* result = (_Jv_ResolvedMethod*) ! _Jv_AllocBytesChecked (sizeof (_Jv_ResolvedMethod) ! + arg_count*sizeof (ffi_type*)); result->stack_item_count = init_cif (method->signature, --- 1181,1191 ---- jboolean staticp, jint vtable_index) { ! int arg_count = _Jv_count_arguments (method->signature, staticp); _Jv_ResolvedMethod* result = (_Jv_ResolvedMethod*) ! _Jv_AllocBytes (sizeof (_Jv_ResolvedMethod) ! + arg_count*sizeof (ffi_type*)); result->stack_item_count = init_cif (method->signature, *************** _Jv_BuildResolvedMethod (_Jv_Method* met *** 1208,1217 **** static void throw_class_format_error (jstring msg) { ! if (msg == 0) ! JvThrow (new java::lang::ClassFormatError); ! else ! JvThrow (new java::lang::ClassFormatError (msg)); } static void --- 1206,1214 ---- static void throw_class_format_error (jstring msg) { ! throw (msg ! ? new java::lang::ClassFormatError (msg) ! : new java::lang::ClassFormatError); } static void *************** throw_class_format_error (char *msg) *** 1223,1230 **** static void throw_internal_error (char *msg) { ! JvThrow ! (new java::lang::InternalError (JvNewStringLatin1 (msg))); } --- 1220,1226 ---- static void throw_internal_error (char *msg) { ! throw new java::lang::InternalError (JvNewStringLatin1 (msg)); } diff -Nrc3pad gcc-3.0.4/libjava/scripts/MakeCharTables.java gcc-3.1/libjava/scripts/MakeCharTables.java *** gcc-3.0.4/libjava/scripts/MakeCharTables.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/scripts/MakeCharTables.java Wed Mar 6 19:13:01 2002 *************** *** 0 **** --- 1,212 ---- + /* MakeCharTables.java - converts gnu.java.lang.CharData into + include/java-chartables.h + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + import gnu.java.lang.CharData; + + public class MakeCharTables implements CharData + { + public static void main(String[] args) + { + System.out.println("/* java-chartables.h -- Character tables for java.lang.Character -*- c++ -*-\n" + + " Copyright (C) 2002 Free Software Foundation, Inc.\n" + + " *** This file is generated by scripts/MakeCharTables.java ***\n" + + "\n" + + "This file is part of GNU Classpath.\n" + + "\n" + + "GNU Classpath is free software; you can redistribute it and/or modify\n" + + "it under the terms of the GNU General Public License as published by\n" + + "the Free Software Foundation; either version 2, or (at your option)\n" + + "any later version.\n" + + "\n" + + "GNU Classpath is distributed in the hope that it will be useful, but\n" + + "WITHOUT ANY WARRANTY; without even the implied warranty of\n" + + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" + + "General Public License for more details.\n" + + "\n" + + "You should have received a copy of the GNU General Public License\n" + + "along with GNU Classpath; see the file COPYING. If not, write to the\n" + + "Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\n" + + "02111-1307 USA.\n" + + "\n" + + "Linking this library statically or dynamically with other modules is\n" + + "making a combined work based on this library. Thus, the terms and\n" + + "conditions of the GNU General Public License cover the whole\n" + + "combination.\n" + + "\n" + + "As a special exception, the copyright holders of this library give you\n" + + "permission to link this library with independent modules to produce an\n" + + "executable, regardless of the license terms of these independent\n" + + "modules, and to copy and distribute the resulting executable under\n" + + "terms of your choice, provided that you also meet, for each linked\n" + + "independent module, the terms and conditions of the license of that\n" + + "module. An independent module is a module which is not derived from\n" + + "or based on this library. If you modify this library, you may extend\n" + + "this exception to your version of the library, but you are not\n" + + "obligated to do so. If you do not wish to do so, delete this\n" + + "exception statement from your version. */\n" + + "\n" + + "#ifndef __JAVA_CHARTABLES_H__\n" + + "#define __JAVA_CHARTABLES_H__\n" + + "\n" + + "// These tables are automatically generated by scripts/MakeCharTables.java.\n" + + "// This is in turn parsing gnu.java.lang.CharData, which is generated by\n" + + "// scripts/unicode-muncher.pl. The Unicode data comes from\n" + + "// www.unicode.org; this header is based on\n" + + "// " + SOURCE + ". JDK 1.4 uses Unicode version 3.0.0.\n" + + "// DO NOT EDIT the tables. Instead, fix the upstream scripts and run\n" + + "// them again.\n" + + "\n" + + "// The data is stored in C style arrays of the appropriate CNI types, to\n" + + "// guarantee that the data is constant and non-relocatable. The field\n" + + "// blocks stores the offset of a block of 2\n" + + "// characters within data. The data field, in turn, stores\n" + + "// information about each character in the low order bits, and an offset\n" + + "// into the attribute tables upper, lower,\n" + + "// numValue, and direction. Notice that the\n" + + "// attribute tables are much smaller than 0xffff entries; as many characters\n" + + "// in Unicode share common attributes. Finally, there is a listing for\n" + + "// title exceptions (most characters just have the same title\n" + + "// case as upper case).\n" + + "\n" + + "// This file should only be included by natCharacter.cc\n" + + "\n" + + "/**\n" + + " * The character shift amount to look up the block offset. In other words,\n" + + " * (char) (blocks[ch >> SHIFT] + ch) is the index where\n" + + " * ch is described in data.\n" + + " */\n" + + "#define SHIFT " + SHIFT); + + convertString("/**\n" + + " * The mapping of character blocks to their location in data.\n" + + " * Each entry has been adjusted so that a modulo 16 sum with the desired\n" + + " * character gives the actual index into data.\n" + + " */", + char.class, "blocks", BLOCKS); + + convertString("/**\n" + + " * Information about each character. The low order 5 bits form the\n" + + " * character type, the next bit is a flag for non-breaking spaces, and the\n" + + " * next bit is a flag for mirrored directionality. The high order 9 bits\n" + + " * form the offset into the attribute tables. Note that this limits the\n" + + " * number of unique character attributes to 512, which is not a problem\n" + + " * as of Unicode version 3.2.0, but may soon become one.\n" + + " */", + char.class, "data", DATA); + + convertString("/**\n" + + " * This is the attribute table for computing the numeric value of a\n" + + " * character. The value is -1 if Unicode does not define a value, -2\n" + + " * if the value is not a positive integer, otherwise it is the value.\n" + + " */", + short.class, "numValue", NUM_VALUE); + + convertString("/**\n" + + " * This is the attribute table for computing the uppercase representation\n" + + " * of a character. The value is the difference between the character and\n" + + " * its uppercase version.\n" + + " */", + short.class, "upper", UPPER); + + convertString("/**\n" + + " * This is the attribute table for computing the lowercase representation\n" + + " * of a character. The value is the difference between the character and\n" + + " * its lowercase version.\n" + + " */", + short.class, "lower", LOWER); + + convertString("/**\n" + + " * This is the attribute table for computing the directionality class\n" + + " * of a character. At present, the value is in the range 0 - 18 if the\n" + + " * character has a direction, otherwise it is -1.\n" + + " */", + byte.class, "direction", DIRECTION); + + convertString("/**\n" + + " * This is the listing of titlecase special cases (all other character\n" + + " * can use upper to determine their titlecase). The listing\n" + + " * is a sequence of character pairs; converting the first character of the\n" + + " * pair to titlecase produces the second character.\n" + + " */", + char.class, "title", TITLE); + + System.out.println(); + System.out.println("#endif /* __JAVA_CHARTABLES_H__ */"); + } + + private static void convertString(String header, Class type, + String name, String field) + { + System.out.println(); + System.out.println(header); + System.out.println("static const j" + type.getName() + " " + name + + "[] = {"); + char[] data = field.toCharArray(); + int wrap; + if (type == char.class) + wrap = 10; + else if (type == byte.class) + wrap = 21; + else if (type == short.class) + wrap = 13; + else + throw new Error("Unexpeced type"); + for (int i = 0; i < data.length; i += wrap) + { + System.out.print(" "); + for (int j = 0; j < wrap; j++) + { + if (i + j >= data.length) + break; + System.out.print(" "); + if (type == char.class) + System.out.print((int) data[i + j]); + else if (type == byte.class) + System.out.print((byte) data[i + j]); + else if (type == short.class) + System.out.print((short) data[i + j]); + System.out.print(","); + } + System.out.println(); + } + System.out.println(" };\n" + + "/** Length of " + name + ". */\n" + + "static const int " + name + "_length = " + + data.length + ";"); + } + } diff -Nrc3pad gcc-3.0.4/libjava/scripts/blocks.pl gcc-3.1/libjava/scripts/blocks.pl *** gcc-3.0.4/libjava/scripts/blocks.pl Fri Dec 15 05:53:39 2000 --- gcc-3.1/libjava/scripts/blocks.pl Thu Jan 1 00:00:00 1970 *************** *** 1,65 **** - #! /usr/bin/perl - - if ($ARGV[0] eq '') - { - $file = 'Blocks.txt'; - if (! -f $file) - { - # Too painful to figure out how to get Perl to do it. - system 'wget -o .wget-log http://www.unicode.org/Public/UNIDATA/Blocks.txt'; - } - } - else - { - $file = $ARGV[0]; - } - - open (INPUT, "< $file") || die "couldn't open $file: $!"; - - @array = (); - while () - { - next if /^#/; - chop; - next if /^$/; - - ($start, $to, $text) = split (/; /); - ($symbol = $text) =~ tr/a-z/A-Z/; - $symbol =~ s/[- ]/_/g; - - # Special case for one of the SPECIALS. - next if $start eq 'FEFF'; - - # Special case some areas that our heuristic mishandles. - if ($symbol eq 'HIGH_SURROGATES') - { - $symbol = 'SURROGATES_AREA'; - $text = 'Surrogates Area'; - $to = 'DFFF'; - } - elsif ($symbol =~ /SURROGATES/) - { - next; - } - elsif ($symbol eq 'PRIVATE_USE') - { - $symbol .= '_AREA'; - $text = 'Private Use Area'; - } - - printf " public static final UnicodeBlock %s = new UnicodeBlock (\"%s\", '\\u%s', '\\u%s');\n", - $symbol, $text, $start, $to; - - push (@array, $symbol); - } - - printf " private static final UnicodeBlock[] blocks = {\n"; - foreach (@array) - { - printf " %s", $_; - printf "," unless $_ eq 'SPECIALS'; - printf "\n"; - } - printf " };\n"; - - close (INPUT); --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/scripts/encodings.pl gcc-3.1/libjava/scripts/encodings.pl *** gcc-3.0.4/libjava/scripts/encodings.pl Wed Nov 1 17:00:02 2000 --- gcc-3.1/libjava/scripts/encodings.pl Tue Jun 26 04:36:47 2001 *************** if ($ARGV[0] eq '') *** 17,23 **** if (! -f $file) { # Too painful to figure out how to get Perl to do it. ! system 'wget -o .wget-log http://www.isi.edu/in-notes/iana/assignments/character-sets'; } } else --- 17,23 ---- if (! -f $file) { # Too painful to figure out how to get Perl to do it. ! system 'wget -o .wget-log http://www.iana.org/assignments/character-sets'; } } else *************** while () *** 42,53 **** } ($type, $name) = split (/\s+/); if ($type eq 'Name:') { $current = $map{$name}; if ($current) { ! print " hash.put (\"$name\", \"$current\");\n"; } } elsif ($type eq 'Alias:') --- 42,56 ---- } ($type, $name) = split (/\s+/); + # Encoding names are case-insensitive. We do all processing on + # the lower-case form. + my $lower = lc ($name); if ($type eq 'Name:') { $current = $map{$name}; if ($current) { ! print " hash.put (\"$lower\", \"$current\");\n"; } } elsif ($type eq 'Alias:') *************** while () *** 55,61 **** # The IANA list has some ugliness. if ($name ne '' && $name ne 'NONE' && $current) { ! print " hash.put (\"$name\", \"$current\");\n"; } } } --- 58,64 ---- # The IANA list has some ugliness. if ($name ne '' && $name ne 'NONE' && $current) { ! print " hash.put (\"$lower\", \"$current\");\n"; } } } diff -Nrc3pad gcc-3.0.4/libjava/scripts/unicode-blocks.pl gcc-3.1/libjava/scripts/unicode-blocks.pl *** gcc-3.0.4/libjava/scripts/unicode-blocks.pl Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/scripts/unicode-blocks.pl Wed Mar 6 19:13:01 2002 *************** *** 0 **** --- 1,210 ---- + #!/usr/bin/perl -w + # unicode-blocks.pl -- Script to generate java.lang.Character.UnicodeBlock + # Copyright (C) 2002 Free Software Foundation, Inc. + # + # This file is part of GNU Classpath. + # + # GNU Classpath is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by + # the Free Software Foundation; either version 2, or (at your option) + # any later version. + # + # GNU Classpath is distributed in the hope that it will be useful, but + # WITHOUT ANY WARRANTY; without even the implied warranty of + # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License + # along with GNU Classpath; see the file COPYING. If not, write to the + # Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + # 02111-1307 USA. + # + # Linking this library statically or dynamically with other modules is + # making a combined work based on this library. Thus, the terms and + # conditions of the GNU General Public License cover the whole + # combination. + # + # As a special exception, the copyright holders of this library give you + # permission to link this library with independent modules to produce an + # executable, regardless of the license terms of these independent + # modules, and to copy and distribute the resulting executable under + # terms of your choice, provided that you also meet, for each linked + # independent module, the terms and conditions of the license of that + # module. An independent module is a module which is not derived from + # or based on this library. If you modify this library, you may extend + # this exception to your version of the library, but you are not + # obligated to do so. If you do not wish to do so, delete this + # exception statement from your version. + + + # Code for reading Blocks.txt and generating (to standard out) the code for + # java.lang.Character.UnicodeBlock, for pasting into java/lang/Character.java. + # You should probably check that the results are accurate to the + # specification, but I made sure it works OOB for Unicode 3.0.0 and JDK 1.4. + # As the grammar for the Blocks.txt file is changing in Unicode 3.2.0, you + # will have to tweak this some for future use. For now, the relevant + # Unicode definition files are found in libjava/gnu/gcj/convert/. + # + # author Eric Blake + # + # usage: unicode-blocks.pl + # where is obtained from www.unicode.org (named Blocks-3.txt + # for Unicode version 3.0.0). + + + die "Usage: $0 " unless @ARGV == 1; + open (BLOCKS, $ARGV[0]) || die "Can't open Unicode block file: $!\n"; + + # A hash of added fields and the JDK they were added in, to automatically + # print @since tags. Maintaining this is optional (and tedious), but nice. + my %additions = ("SYRIAC" => "1.4", + "THAANA" => "1.4", + "SINHALA" => "1.4", + "MYANMAR" => "1.4", + "ETHIOPIC" => "1.4", + "CHEROKEE" => "1.4", + "UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS" => "1.4", + "OGHAM" => "1.4", + "RUNIC" => "1.4", + "KHMER" => "1.4", + "MONGOLIAN" => "1.4", + "BRAILLE_PATTERNS" => "1.4", + "CJK_RADICALS_SUPPLEMENT" => "1.4", + "KANGXI_RADICALS" => "1.4", + "IDEOGRAPHIC_DESCRIPTION_CHARACTERS" => "1.4", + "BOPOMOFO_EXTENDED" => "1.4", + "CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A" => "1.4", + "YI_SYLLABLES" => "1.4", + "YI_RADICALS" => "1.4", + ); + + print <<'EOF'; + /** + * A family of character subsets in the Unicode specification. A character + * is in at most one of these blocks. + * + * This inner class was generated automatically from + * $ARGV[0], by some perl scripts. + * This Unicode definition file can be found on the + * http://www.unicode.org website. + * JDK 1.4 uses Unicode version 3.0.0. + * + * @author scripts/unicode-blocks.pl (written by Eric Blake) + * @since 1.2 + */ + public static final class UnicodeBlock extends Subset + { + /** The start of the subset. */ + private final char start; + + /** The end of the subset. */ + private final char end; + + /** + * Constructor for strictly defined blocks. + * + * @param start the start character of the range + * @param end the end character of the range + * @param name the block name + */ + private UnicodeBlock(char start, char end, String name) + { + super(name); + this.start = start; + this.end = end; + } + + /** + * Returns the Unicode character block which a character belongs to. + * + * @param ch the character to look up + * @return the set it belongs to, or null if it is not in one + */ + public static UnicodeBlock of(char ch) + { + // Special case, since SPECIALS contains two ranges. + if (ch == '\uFEFF') + return SPECIALS; + // Simple binary search for the correct block. + int low = 0; + int hi = sets.length - 1; + while (low <= hi) + { + int mid = (low + hi) >> 1; + UnicodeBlock b = sets[mid]; + if (ch < b.start) + hi = mid - 1; + else if (ch > b.end) + low = mid + 1; + else + return b; + } + return null; + } + EOF + + my $seenSpecials = 0; + my $seenSurrogates = 0; + my $surrogateStart = 0; + my @names = (); + while () { + next if /^\#/; + my ($start, $end, $block) = split(/; /); + next unless defined $block; + chomp $block; + $block =~ s/ *$//; + if (! $seenSpecials and $block =~ /Specials/) { + # Special case SPECIALS, since it is two disjoint ranges + $seenSpecials = 1; + next; + } + if ($block =~ /Surrogates/) { + # Special case SURROGATES_AREA, since it one range, not three + # consecutive, in Java + $seenSurrogates++; + if ($seenSurrogates == 1) { + $surrogateStart = $start; + next; + } elsif ($seenSurrogates == 2) { + next; + } else { + $start = $surrogateStart; + $block = "Surrogates Area"; + } + } + # Special case the name of PRIVATE_USE_AREA. + $block =~ s/(Private Use)/$1 Area/; + + (my $name = $block) =~ tr/a-z -/A-Z__/; + push @names, $name; + my $since = (defined $additions{$name} + ? "\n * \@since $additions{$name}" : ""); + my $extra = ($block =~ /Specials/ ? "'\\uFEFF', " : ""); + print < + # where is obtained from www.unicode.org (named + # UnicodeData-3.0.0.txt for Unicode version 3.0.0), and + # is the final location of include/java-chardecomp.h. + # As of JDK 1.4, use Unicode version 3.0.0 for best results. + # + # If this exits with nonzero status, then you must investigate the + # cause of the problem. + # Diagnostics and other information to stderr. + # With -n, the files are not created, but all processing still occurs. + + # These maps characters to their decompositions. + my %canonical_decomposition = (); + my %full_decomposition = (); + + # Handle `-n' and open output files. + if ($ARGV[0] && $ARGV[0] eq '-n') + { + shift @ARGV; + $ARGV[1] = '/dev/null'; + } + die "Usage: $0 " unless @ARGV == 2; + open (UNICODE, "< $ARGV[0]") || die "Can't open Unicode attribute file: $!\n"; + + # Process the Unicode file. + $| = 1; + my $count = 0; + print STDERR "Parsing attributes file"; + while () + { + print STDERR "." unless $count++ % 1000; + chomp; + s/\r//g; + my ($ch, undef, undef, undef, undef, $decomp) = split ';'; + $ch = hex($ch); + + if ($decomp ne '') + { + my $is_full = 0; + my @decomp = (); + foreach (split (' ', $decomp)) + { + if (/^\<.*\>$/) + { + $is_full = 1; + next; + } + push (@decomp, hex ($_)); + } + my $s = pack "n*", @decomp; + if ($is_full) + { + $full_decomposition{$ch} = $s; + } + else + { + $canonical_decomposition{$ch} = $s; + } + } + } + + # Now generate decomposition tables. + open DECOMP, "> $ARGV[1]" or die "Can't open output file: $!\n"; + print STDERR "\nGenerating tables\n"; + print DECOMP < + # + # Usage: ./unicode-muncher + # where is obtained from www.unicode.org (named + # UnicodeData-3.0.0.txt for Unicode version 3.0.0), and + # is the final location for the Java interface gnu.java.lang.CharData. + # As of JDK 1.4, use Unicode version 3.0.0 for best results. + + ## + ## Convert a 16-bit integer to a Java source code String literal character + ## + sub javaChar($) { + my ($char) = @_; + die "Out of range: $char\n" if $char < -0x8000 or $char > 0xffff; + $char += 0x10000 if $char < 0; + # Special case characters that must be escaped, or are shorter as ASCII + return sprintf("\\%03o", $char) if $char < 0x20; + return "\\\"" if $char == 0x22; + return "\\\\" if $char == 0x5c; + return pack("C", $char) if $char < 0x7f; + return sprintf("\\u%04x", $char); + } + + ## + ## Convert the text UnicodeData file from www.unicode.org into a Java + ## interface with string constants holding the compressed information. + ## + my @TYPECODES = qw(Cn Lu Ll Lt Lm Lo Mn Me Mc Nd Nl No Zs Zl Zp Cc Cf + SKIPPED Co Cs Pd Ps Pe Pc Po Sm Sc Sk So Pi Pf); + my @DIRCODES = qw(L R AL EN ES ET AN CS NSM BN B S WS ON LRE LRO RLE RLO PDF); + + my $NOBREAK_FLAG = 32; + my $MIRRORED_FLAG = 64; + + my @info = (); + my $titlecase = ""; + my $count = 0; + my $range = 0; + + die "Usage: $0 " unless @ARGV == 2; + open (UNICODE, "< $ARGV[0]") || die "Can't open Unicode attribute file: $!\n"; + + # Stage 1: Parse the attribute file + $| = 1; + print "GNU Classpath Unicode Attribute Database Generator 2.0\n"; + print "Copyright (C) 1998, 2002 Free Software Foundation, Inc.\n"; + print "Parsing attributes file"; + while() { + print "." unless $count++ % 1000; + chomp; + s/\r//g; + my ($ch, $name, $category, undef, $bidir, $decomp, undef, undef, $numeric, + $mirrored, undef, undef, $upcase, $lowcase, $title) = split ';'; + $ch = hex($ch); + next if $ch > 0xffff; # Ignore surrogate pairs, since Java does + + my ($type, $numValue, $upperchar, $lowerchar, $direction); + + $type = 0; + while ($category !~ /^$TYPECODES[$type]$/) { + if (++$type == @TYPECODES) { + die "$ch: Unknown type: $category"; + } + } + $type |= $NOBREAK_FLAG if ($decomp =~ /noBreak/); + $type |= $MIRRORED_FLAG if ($mirrored =~ /Y/); + + if ($numeric =~ /^[0-9]+$/) { + $numValue = $numeric; + die "numValue too big: $ch, $numValue\n" if $numValue >= 0x7fff; + } elsif ($numeric eq "") { + # Special case sequences of 'a'-'z' + if ($ch >= 0x0041 && $ch <= 0x005a) { + $numValue = $ch - 0x0037; + } elsif ($ch >= 0x0061 && $ch <= 0x007a) { + $numValue = $ch - 0x0057; + } elsif ($ch >= 0xff21 && $ch <= 0xff3a) { + $numValue = $ch - 0xff17; + } elsif ($ch >= 0xff41 && $ch <= 0xff5a) { + $numValue = $ch - 0xff37; + } else { + $numValue = -1; + } + } else { + $numValue = -2; + } + + $upperchar = $upcase ? hex($upcase) - $ch : 0; + $lowerchar = $lowcase ? hex($lowcase) - $ch : 0; + if ($title ne $upcase) { + my $titlechar = $title ? hex($title) : $ch; + $titlecase .= pack("n2", $ch, $titlechar); + } + + $direction = 0; + while ($bidir !~ /^$DIRCODES[$direction]$/) { + if (++$direction == @DIRCODES) { + $direction = -1; + last; + } + } + + if ($range) { + die "Expecting end of range at $ch\n" unless $name =~ /Last>$/; + for ($range + 1 .. $ch - 1) { + $info[$_] = pack("n5", $type, $numValue, $upperchar, + $lowerchar, $direction); + } + $range = 0; + } elsif ($name =~ /First>$/) { + $range = $ch; + } + $info[$ch] = pack("n5", $type, $numValue, $upperchar, $lowerchar, + $direction); + } + close UNICODE; + + # Stage 2: Compress the data structures + printf "\nCompressing data structures"; + $count = 0; + my $info = (); + my %charhash = (); + my @charinfo = (); + + for my $ch (0 .. 0xffff) { + print "." unless $count++ % 0x1000; + if (! defined $info[$ch]) { + $info[$ch] = pack("n5", 0, -1, 0, 0, -1); + } + + my ($type, $numVal, $upper, $lower, $direction) = unpack("n5", $info[$ch]); + if (! exists $charhash{$info[$ch]}) { + push @charinfo, [ $numVal, $upper, $lower, $direction ]; + $charhash{$info[$ch]} = $#charinfo; + } + $info .= pack("n", ($charhash{$info[$ch]} << 7) | $type); + } + + my $charlen = @charinfo; + my $bestshift; + my $bestest = 1000000; + my $bestblkstr; + die "Too many unique character entries: $charlen\n" if $charlen > 512; + print "\nUnique character entries: $charlen\n"; + + for my $i (3 .. 8) { + my $blksize = 1 << $i; + my %blocks = (); + my @blkarray = (); + my ($j, $k); + print "shift: $i"; + + for ($j = 0; $j < 0x10000; $j += $blksize) { + my $blkkey = substr $info, 2 * $j, 2 * $blksize; + if (! exists $blocks{$blkkey}) { + push @blkarray, $blkkey; + $blocks{$blkkey} = $#blkarray; + } + } + my $blknum = @blkarray; + my $blocklen = $blknum * $blksize; + printf " before %5d", $blocklen; + + # Now we try to pack the blkarray as tight as possible by finding matching + # heads and tails. + for ($j = $blksize - 1; $j > 0; $j--) { + my %tails = (); + for $k (0 .. $#blkarray) { + next if ! defined $blkarray[$k]; + my $len = length $blkarray[$k]; + my $tail = substr $blkarray[$k], $len - $j * 2; + if (exists $tails{$tail}) { + push @{$tails{$tail}}, $k; + } else { + $tails{$tail} = [ $k ]; + } + } + + # tails are calculated, now calculate the heads and merge. + BLOCK: + for $k (0 .. $#blkarray) { + next if ! defined $blkarray[$k]; + my $tomerge = $k; + while (1) { + my $head = substr($blkarray[$tomerge], 0, $j * 2); + my $entry = $tails{$head}; + next BLOCK if ! defined $entry; + + my $other = shift @{$entry}; + if ($other == $tomerge) { + if (@{$entry}) { + push @{$entry}, $other; + $other = shift @{$entry}; + } else { + push @{$entry}, $other; + next BLOCK; + } + } + if (@{$entry} == 0) { + delete $tails{$head}; + } + + # a match was found + my $merge = $blkarray[$other] + . substr($blkarray[$tomerge], $j * 2); + $blocklen -= $j; + $blknum--; + + if ($other < $tomerge) { + $blkarray[$tomerge] = undef; + $blkarray[$other] = $merge; + my $len = length $merge; + my $tail = substr $merge, $len - $j * 2; + $tails{$tail} = [ map { $_ == $tomerge ? $other : $_ } + @{$tails{$tail}} ]; + next BLOCK; + } + $blkarray[$tomerge] = $merge; + $blkarray[$other] = undef; + } + } + } + my $blockstr; + for $k (0 .. $#blkarray) { + $blockstr .= $blkarray[$k] if defined $blkarray[$k]; + } + + die "Unexpected $blocklen" if length($blockstr) != 2 * $blocklen; + my $estimate = 2 * $blocklen + (0x20000 >> $i); + + printf " after merge %5d: %6d bytes\n", $blocklen, $estimate; + if ($estimate < $bestest) { + $bestest = $estimate; + $bestshift = $i; + $bestblkstr = $blockstr; + } + } + + my @blocks; + my $blksize = 1 << $bestshift; + for (my $j = 0; $j < 0x10000; $j += $blksize) { + my $blkkey = substr $info, 2 * $j, 2 * $blksize; + my $index = index $bestblkstr, $blkkey; + while ($index & 1) { + die "not found: $j" if $index == -1; + $index = index $bestblkstr, $blkkey, $index + 1; + } + push @blocks, ($index / 2 - $j) & 0xffff; + } + + # Phase 3: Generate the file + die "UTF-8 limit of blocks may be exceeded: " . scalar(@blocks) . "\n" + if @blocks > 0xffff / 3; + die "UTF-8 limit of data may be exceeded: " . length($bestblkstr) . "\n" + if length($bestblkstr) > 0xffff / 3; + { + print "Generating $ARGV[1] with shift of $bestshift"; + my ($i, $j); + + open OUTPUT, "> $ARGV[1]" or die "Failed creating output file: $!\n"; + print OUTPUT <$ARGV[0]
          , by some + * perl scripts. This Unicode definition file can be found on the + * http://www.unicode.org website. + * JDK 1.4 uses Unicode version 3.0.0. + * + * The data is stored as string constants, but Character will convert these + * Strings to their respective char[] components. The field + * BLOCKS stores the offset of a block of 2SHIFT + * characters within DATA. The DATA field, in turn, stores + * information about each character in the low order bits, and an offset + * into the attribute tables UPPER, LOWER, + * NUM_VALUE, and DIRECTION. Notice that the + * attribute tables are much smaller than 0xffff entries; as many characters + * in Unicode share common attributes. Finally, there is a listing for + * TITLE exceptions (most characters just have the same + * title case as upper case). + * + * \@author scripts/unicode-muncher.pl (written by Jochen Hoenicke, + * Eric Blake) + * \@see Character + */ + public interface CharData + { + /** + * The Unicode definition file that was parsed to build this database. + */ + String SOURCE = \"$ARGV[0]\"; + + /** + * The character shift amount to look up the block offset. In other words, + * (char) (BLOCKS.value[ch >> SHIFT] + ch) is the index where + * ch is described in DATA. + */ + int SHIFT = $bestshift; + + /** + * The mapping of character blocks to their location in DATA. + * Each entry has been adjusted so that the 16-bit sum with the desired + * character gives the actual index into DATA. + */ + String BLOCKS + EOF + + for ($i = 0; $i < @blocks / 11; $i++) { + print OUTPUT $i ? "\n + \"" : " = \""; + for $j (0 .. 10) { + last if @blocks <= $i * 11 + $j; + my $val = $blocks[$i * 11 + $j]; + print OUTPUT javaChar($val); + } + print OUTPUT "\""; + } + + print OUTPUT <UPPER
          to determine their titlecase). The listing + * is a sequence of character pairs; converting the first character of the + * pair to titlecase produces the second character. + */ + String TITLE + EOF + + $len = length($titlecase) / 2; + for ($i = 0; $i < $len / 11; $i++) { + print OUTPUT $i ? "\n + \"" : " = \""; + for $j (0 .. 10) { + last if $len <= $i * 11 + $j; + my $val = unpack "n", substr($titlecase, 2 * ($i*11 + $j), 2); + print OUTPUT javaChar($val); + } + print OUTPUT "\""; + } + + print OUTPUT ";\n}\n"; + close OUTPUT; + } + print "\nDone.\n"; diff -Nrc3pad gcc-3.0.4/libjava/sysdep/alpha/locks.h gcc-3.1/libjava/sysdep/alpha/locks.h *** gcc-3.0.4/libjava/sysdep/alpha/locks.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/sysdep/alpha/locks.h Sun Mar 10 03:44:39 2002 *************** *** 0 **** --- 1,53 ---- + // locks.h - Thread synchronization primitives. Alpha implementation. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #ifndef __SYSDEP_LOCKS_H__ + #define __SYSDEP_LOCKS_H__ + + typedef size_t obj_addr_t; /* Integer type big enough for object */ + /* address. */ + + inline static bool + compare_and_swap(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + unsigned long oldval; + char result; + __asm__ __volatile__( + "1:ldq_l %0, %1\n\t" \ + "cmpeq %0, %5, %2\n\t" \ + "beq %2, 2f\n\t" \ + "mov %3, %0\n\t" \ + "stq_c %0, %1\n\t" \ + "bne %0, 2f\n\t" \ + "br 1b\n\t" \ + "2:mb" + : "=&r"(oldval), "=m"(*addr), "=&r"(result) + : "r" (new_val), "m"(*addr), "r"(old) : "memory"); + return (bool) result; + } + + inline static void + release_set(volatile obj_addr_t *addr, obj_addr_t new_val) + { + __asm__ __volatile__("mb" : : : "memory"); + *(addr) = new_val; + } + + inline static bool + compare_and_swap_release(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + return compare_and_swap(addr, old, new_val); + } + + #endif diff -Nrc3pad gcc-3.0.4/libjava/sysdep/generic/locks.h gcc-3.1/libjava/sysdep/generic/locks.h *** gcc-3.0.4/libjava/sysdep/generic/locks.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/sysdep/generic/locks.h Sun Mar 10 03:44:40 2002 *************** *** 0 **** --- 1,11 ---- + // locks.h - Thread synchronization primitives. Generic implementation. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #error Thread synchronization primitives not implemented for this platform. diff -Nrc3pad gcc-3.0.4/libjava/sysdep/i386/locks.h gcc-3.1/libjava/sysdep/i386/locks.h *** gcc-3.0.4/libjava/sysdep/i386/locks.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/sysdep/i386/locks.h Thu Mar 21 00:34:57 2002 *************** *** 0 **** --- 1,73 ---- + // locks.h - Thread synchronization primitives. X86 implementation. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #ifndef __SYSDEP_LOCKS_H__ + #define __SYSDEP_LOCKS_H__ + + typedef size_t obj_addr_t; /* Integer type big enough for object */ + /* address. */ + + // Atomically replace *addr by new_val if it was initially equal to old. + // Return true if the comparison succeeded. + // Assumed to have acquire semantics, i.e. later memory operations + // cannot execute before the compare_and_swap finishes. + inline static bool + compare_and_swap(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + char result; + __asm__ __volatile__("lock; cmpxchgl %2, %0; setz %1" + : "+m"(*(addr)), "=q"(result) + : "r" (new_val), "a"(old) + : "memory"); + return (bool) result; + } + + // Set *addr to new_val with release semantics, i.e. making sure + // that prior loads and stores complete before this + // assignment. + // On X86, the hardware shouldn't reorder reads and writes, + // so we just have to convince gcc not to do it either. + inline static void + release_set(volatile obj_addr_t *addr, obj_addr_t new_val) + { + __asm__ __volatile__(" " : : : "memory"); + *(addr) = new_val; + } + + // Compare_and_swap with release semantics instead of acquire semantics. + // On many architecture, the operation makes both guarantees, so the + // implementation can be the same. + inline static bool + compare_and_swap_release(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + return compare_and_swap(addr, old, new_val); + } + + // Ensure that subsequent instructions do not execute on stale + // data that was loaded from memory before the barrier. + // On X86, the hardware ensures that reads are properly ordered. + inline static void + read_barrier() + { + } + + // Ensure that prior stores to memory are completed with respect to other + // processors. + inline static void + write_barrier() + { + // X86 does not reorder writes. We just need to ensure that gcc also doesn't. + __asm__ __volatile__(" " : : : "memory"); + } + #endif diff -Nrc3pad gcc-3.0.4/libjava/sysdep/ia64/locks.h gcc-3.1/libjava/sysdep/ia64/locks.h *** gcc-3.0.4/libjava/sysdep/ia64/locks.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/sysdep/ia64/locks.h Sun Mar 10 03:44:41 2002 *************** *** 0 **** --- 1,50 ---- + // locks.h - Thread synchronization primitives. IA64 implementation. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #ifndef __SYSDEP_LOCKS_H__ + #define __SYSDEP_LOCKS_H__ + + typedef size_t obj_addr_t; /* Integer type big enough for object */ + /* address. */ + + inline static bool + compare_and_swap(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + unsigned long oldval; + __asm__ __volatile__("mov ar.ccv=%4 ;; cmpxchg8.acq %0=%1,%2,ar.ccv" + : "=r"(oldval), "=m"(*addr) + : "r"(new_val), "1"(*addr), "r"(old) : "memory"); + return (oldval == old); + } + + // The fact that *addr is volatile should cause the compiler to + // automatically generate an st8.rel. + inline static void + release_set(volatile obj_addr_t *addr, obj_addr_t new_val) + { + __asm__ __volatile__(" " : : : "memory"); + *(addr) = new_val; + } + + inline static bool + compare_and_swap_release(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + unsigned long oldval; + __asm__ __volatile__("mov ar.ccv=%4 ;; cmpxchg8.rel %0=%1,%2,ar.ccv" + : "=r"(oldval), "=m"(*addr) + : "r"(new_val), "1"(*addr), "r"(old) : "memory"); + return (oldval == old); + } + + #endif diff -Nrc3pad gcc-3.0.4/libjava/sysdep/powerpc/locks.h gcc-3.1/libjava/sysdep/powerpc/locks.h *** gcc-3.0.4/libjava/sysdep/powerpc/locks.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/sysdep/powerpc/locks.h Thu Mar 21 00:34:57 2002 *************** *** 0 **** --- 1,86 ---- + // locks.h - Thread synchronization primitives. PowerPC implementation. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #ifndef __SYSDEP_LOCKS_H__ + #define __SYSDEP_LOCKS_H__ + + typedef size_t obj_addr_t; /* Integer type big enough for object */ + /* address. */ + + inline static bool + compare_and_swap(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + int ret; + + __asm__ __volatile__ ( + "0: lwarx %0,0,%1 ;" + " xor. %0,%3,%0;" + " bne 1f;" + " stwcx. %2,0,%1;" + " bne- 0b;" + "1: " + : "=&r"(ret) + : "r"(addr), "r"(new_val), "r"(old) + : "cr0", "memory"); + /* This version of __compare_and_swap is to be used when acquiring + a lock, so we don't need to worry about whether other memory + operations have completed, but we do need to be sure that any loads + after this point really occur after we have acquired the lock. */ + __asm__ __volatile__ ("isync" : : : "memory"); + return ret == 0; + } + + inline static void + release_set(volatile obj_addr_t *addr, obj_addr_t new_val) + { + __asm__ __volatile__ ("sync" : : : "memory"); + *(addr) = new_val; + } + + inline static bool + compare_and_swap_release(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + int ret; + + __asm__ __volatile__ ("sync" : : : "memory"); + __asm__ __volatile__ ( + "0: lwarx %0,0,%1 ;" + " xor. %0,%3,%0;" + " bne 1f;" + " stwcx. %2,0,%1;" + " bne- 0b;" + "1: " + : "=&r"(ret) + : "r"(addr), "r"(new_val), "r"(old) + : "cr0", "memory"); + return ret == 0; + } + + // Ensure that subsequent instructions do not execute on stale + // data that was loaded from memory before the barrier. + inline static void + read_barrier() + { + __asm__ __volatile__ ("isync" : : : "memory"); + } + + // Ensure that prior stores to memory are completed with respect to other + // processors. + inline static void + write_barrier() + { + __asm__ __volatile__ ("sync" : : : "memory"); + } + + #endif diff -Nrc3pad gcc-3.0.4/libjava/sysdep/sparc/locks.h gcc-3.1/libjava/sysdep/sparc/locks.h *** gcc-3.0.4/libjava/sysdep/sparc/locks.h Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/sysdep/sparc/locks.h Sun Apr 21 09:36:06 2002 *************** *** 0 **** --- 1,120 ---- + // locks.h - Thread synchronization primitives. Sparc implementation. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #ifndef __SYSDEP_LOCKS_H__ + #define __SYSDEP_LOCKS_H__ + + typedef size_t obj_addr_t; /* Integer type big enough for object */ + /* address. */ + + #ifdef __arch64__ + /* Sparc64 implementation, use cas instruction. */ + inline static bool + compare_and_swap(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + __asm__ __volatile__("casx [%2], %3, %0\n\t" + "membar #StoreLoad | #StoreStore" + : "=&r" (new_val) + : "0" (new_val), "r" (addr), "r" (old) + : "memory"); + + return (new_val == old) ? true : false; + } + + inline static void + release_set(volatile obj_addr_t *addr, obj_addr_t new_val) + { + __asm__ __volatile__("membar #StoreStore | #LoadStore" : : : "memory"); + *(addr) = new_val; + } + + inline static bool + compare_and_swap_release(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + return compare_and_swap(addr, old, new_val); + } + #else + /* Sparc32 implementation, use a spinlock. */ + static unsigned char __cas_lock = 0; + + inline static void + __cas_start_atomic(void) + { + unsigned int tmp; + __asm__ __volatile__( + "1: ldstub [%1], %0\n" + " orcc %0, 0x0, %g0\n" + " be 3f\n" + " nop\n" + "2: ldub [%1], %0\n" + " orcc %0, 0x0, %g0\n" + " bne 2b\n" + " nop\n" + "3:" : "=&r" (tmp) + : "r" (&__cas_lock) + : "memory", "cc"); + } + + inline static void + __cas_end_atomic(void) + { + __asm__ __volatile__( + "stb %%g0, [%0]" + : /* no outputs */ + : "r" (&__cas_lock) + : "memory"); + } + + inline static bool + compare_and_swap(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + bool ret; + + __cas_start_atomic (); + if (*addr != old) + { + ret = false; + } + else + { + *addr = new_val; + ret = true; + } + __cas_end_atomic (); + + return ret; + } + + inline static void + release_set(volatile obj_addr_t *addr, obj_addr_t new_val) + { + /* Technically stbar would be needed here but no sparc32 + system actually requires it. Also the stbar would mean + this code would not work on sparcv7 chips. */ + __asm__ __volatile__("" : : : "memory"); + *(addr) = new_val; + } + + inline static bool + compare_and_swap_release(volatile obj_addr_t *addr, + obj_addr_t old, + obj_addr_t new_val) + { + return compare_and_swap(addr, old, new_val); + } + #endif /* __arch64__ */ + + #endif /* ! __SYSDEP_LOCKS_H__ */ diff -Nrc3pad gcc-3.0.4/libjava/testsuite/ChangeLog gcc-3.1/libjava/testsuite/ChangeLog *** gcc-3.0.4/libjava/testsuite/ChangeLog Wed Feb 20 18:46:54 2002 --- gcc-3.1/libjava/testsuite/ChangeLog Wed May 15 02:25:12 2002 *************** *** 1,31 **** ! 2002-02-20 Release Manager ! * GCC 3.0.4 Released. ! 2001-12-20 Release Manager ! * GCC 3.0.3 Released. ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. 2001-07-27 Rainer Orth * lib/libjava.exp (${tool}_set_ld_library_path): New, copied from g++.exp. ! 20010617 Release Manager ! * GCC 3.0 Released. 2001-05-03 Tom Tromey --- 1,333 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-04-21 Mark Wielaard ! * libjava.mauve/xfail: Expect failures for PR java/6391 and ! libgcj/6389. ! 2002-04-16 Mark Wielaard ! * libjava.lang/negzero.java: New. ! * libjava.lang/negzero.out: New. ! 2002-04-14 Mark Wielaard ! * libjava.mauve/xfails: Expect failures for PR libgcj/6302 and ! libgcj/6298. ! ! 2002-04-14 Mark Wielaard ! ! * libjava.mauve/xfails: Expect failures for PR libgcj/6293, ! libgcj/6295, libgcj/6296 and libgcj/6297. ! ! 2002-04-11 Anthony Green ! ! * lib/libjava.exp: Use libgcj-3.1.jar, not libgcj.jar. ! ! 2002-04-07 Mark Wielaard ! ! * libjava.mauve/xfails: Add CASE_INSENSITIVE_ORDER, result was ! unspecified and test should be updated to match latest spec. ! Add AcuniaPropertiesTest, known bug #6219. Add test_getClassLoader, ! what we do seems to be not really right or wrong. ! ! 2002-04-06 Mark Wielaard ! ! * libjava.mauve/mauve.exp: Use libgcj.jar not libgcj.zip. ! * libjava.mauve/xfails: add Character.classify12 (number 1), ! Character.getType (number 11), Character.getType (number 20) and ! Character.getType (number 22). We implement 1.4 Character. ! ! 2002-03-28 Andrew Haley ! ! * libjava.lang/Throw_2.java: New. ! * libjava.lang/Throw_2.out: New. ! ! 2002-03-27 Anthony Green ! ! * libjava.lang/InvokeReturn.java: Modify test for targets ! which do not yet support reflection. ! ! 2002-03-27 Anthony Green ! ! * libjava.jni/jni.exp (gcj_jni_run): Fix cross build test. ! ! 2002-03-27 Anthony Green ! ! * lib/libjava.exp: Add the wrapper link options only when we're ! linking. ! ! 2002-03-26 Tom Tromey ! ! * libjava.mauve/mauve.exp (test_mauve): Use correct stderr ! redirection code. ! ! 2002-03-22 Eric Blake ! ! For PR java/6026: ! * libjava.compile/PR6026.java: New file. ! ! 2002-03-21 Andrew Haley ! ! * libjava.lang/Thread_Interrupt.java (Looper.calibrate): New. ! (yields): New. ! ! 2002-03-18 Tom Tromey ! ! * libjava.jni/jni.exp (gcj_jni_test_one): Find libstdc++ in build ! tree. ! (gcj_invoke): Added ld_library_additions argument. ! ! 2002-03-17 Tom Tromey ! ! * libjava.jni/jni.exp (gcj_jni_build_header): Use local_exec, not ! target_compile. Fixes PR other/5874. ! ! 2002-03-15 Eric Blake ! ! For PR java/5902: ! * libjava.compile/PR5902.java: Does not need to execute. ! For PR java/5913: ! * libjava.compile/PR5913.java: Ditto. ! ! 2002-03-12 Tom Tromey ! ! Test for PR java/5848: ! * libjava.compile/PR5848.xfail: New file. ! * libjava.compile/PR5848.java: New file. ! ! 2002-03-12 Eric Blake ! ! * libjava.compile/PR5913.java: Expand test. ! ! 2002-03-11 Eric Blake ! ! * libjava.compile/PR5902.java: New file. ! * libjava.compile/PR5913.java: New file. ! * libjava.compile/PR5913.xfail: New file. ! ! 2002-02-23 Jeff Sturm ! ! * libjava.lang/InvokeReturn.java: New file. ! * libjava.lang/InvokeReturn.out: New file. ! ! 2002-02-20 Bryce McKinlay ! ! * lib/libjava.exp: Add "xfail-byte-output" and "xfail-source-output". ! Don't display expected and actual output for a failed output test. ! ! * libjava.lang/ArrayStore.java: New file. ! * libjava.lang/ArrayStore.out: New file. ! * libjava.lang/ArrayStore.xfail: New file. xfail-byte-output. ! * libjava.lang/ArrayStore2.java: New file. ! * libjava.lang/ArrayStore2.out: New file. ! * libjava.lang/ArrayStore2.xfail: New file. xfail-source-output. ! ! * libjava.lang/stringconst.xfail: xfail-output -> xfail-source-output. ! ! 2002-02-18 Bryce McKinlay ! ! * libjava.lang/err7.xfail: Removed. ! * libjava.lang/err8.xfail: Removed. ! ! * libjava.lang/ArrayStore.java: New file. ! * libjava.lang/ArrayStore.out: New file. ! ! 2002-02-10 Tom Tromey ! ! For PR java/5641: ! * libjava.compile/PR5641.xfail: New file. ! * libjava.compile/PR5641.java: New file. ! ! 2002-02-10 Rainer Orth ! ! * lib/libjava.exp (libjava_find_lib): Remove duplicate .la files. ! ! 2002-01-05 H.J. Lu ! ! * libjava.jni/jni.exp: Add -I.. for generated header. ! ! 2001-12-20 Tom Tromey ! ! For PR java/4766: ! * libjava.compile/PR4766.java: New file. ! ! 2001-12-20 Andrew Haley ! ! * libjava.lang/FileHandleGcTest.out: New file. ! * libjava.lang/FileHandleGcTest.java: New file. ! * libjava.lang/Array_3.out: New file. ! * libjava.lang/Array_3.java: New file. ! ! 2001-12-18 Tom Tromey ! ! For PR java/3417: ! * libjava.compile/PR3417.xfail: New file. ! * libjava.compile/PR3417.java: New file. ! ! 2001-12-17 Tom Tromey ! ! * libjava.lang/PR3731.xfail: Removed. ! ! Inspired by PR java/5057: ! * libjava.lang/PR5057_2.java: New file. ! * libjava.lang/PR5057_2.out: New file. ! ! For PR java/5057: ! * libjava.lang/PR5057.out: New file. ! * libjava.lang/PR5057.java: New file. ! ! 2001-12-13 Tom Tromey ! ! For PR libgcj/5103: ! * libjava.jni/cxxtest.out: New file. ! * libjava.jni/cxxtest.cc: New file. ! * libjava.jni/cxxtest.java: New file. ! * libjava.jni/jni.exp (gcj_jni_test_one): If there is no .c file, ! assume there is a .cc file. ! ! 2001-12-09 Bryce McKinlay ! ! * libjava.lang/PR3731.out: Adjust output to reflect that "instanceof" ! shouldn't trigger class initialization. ! ! 2001-12-06 Tom Tromey ! ! * libjava.compile/BlankFinal.java: Removed; incorrect test. ! ! 2001-11-02 Bryce McKinlay ! ! * libjava.lang/TLtest.xfail: New file. Needs threads. ! ! 2001-10-04 Alexandre Petit-Bianco ! ! * libjava.lang/PR3096.java: New file. ! * libjava.lang/PR3096.out: Likewise. ! ! 2001-09-27 Alexandre Petit-Bianco ! ! * libjava.compile/final_initialization_in_ctor.java: New file ! ! 2001-08-28 Alexandre Petit-Bianco ! ! * libjava.compile/final_assignment_check.java: New file. ! * libjava.compile/final_assignment_check.xfail: Likewise. ! * libjava.compile/final_local_switch.java: Likewise. ! ! 2001-08-24 Alexandre Petit-Bianco ! ! * libjava.lang/KeepInline.out: Fixed content. ! ! 2001-08-17 Alexandre Petit-Bianco ! ! * libjava.compile/XercesBug.java: New file. ! ! 2001-08-12 Alexandre Petit-Bianco ! ! * libjava.lang/Matrix4f.java: New file. ! * libjava.lang/Matrix4f.out: New file. ! ! 2001-08-03 Richard Henderson ! ! * libjava.jni/calls.c (Java_calls_docall): Fix typo. ! ! 2001-08-01 Jeff Sturm ! ! * libjava.lang/KeepInline.java: New file. ! * libjava.lang/KeepInline.out: New file. ! ! 2001-07-30 Jeff Sturm ! ! * libjava.lang/SyncTest.java: New file. ! * libjava.lang/SyncTest.out: New file. ! * libjava.lang/SyncTest.xfail: New file. 2001-07-27 Rainer Orth * lib/libjava.exp (${tool}_set_ld_library_path): New, copied from g++.exp. ! 2001-07-19 Jeff Sturm ! * libjava.lang/PR3731.java: New file. ! * libjava.lang/PR3731.out: New file. ! * libjava.lang/PR3731.xfail: New file. ! ! 2001-07-12 Alexandre Petit-Bianco ! ! * libjava.compile/anon_ctor_itf_arg.java: Moved to `libjava.lang.' ! * libjava.compile/anon_ctor_itf_arg.out: Likewise ! * libjava.lang/invoke_from_inner.java: New file. ! * libjava.lang/invoke_from_inner.out: Likewise. ! ! 2001-07-12 Alexandre Petit-Bianco ! ! * libjava.compile/anon_ctor_itf_arg.java: New file. ! * libjava.compile/anon_ctor_itf_arg.out: New file. ! ! 2001-07-12 Tom Tromey ! ! * libjava.lang/N19990310_4.xfail: Removed. ! ! 2001-07-10 Alexandre Petit-Bianco ! ! * libjava.lang/TLtest.java: New file. ! * libjava.lang/TLtest.out: New file. ! ! 2001-07-06 Andrew Haley ! ! * libjava.lang/Divide_1.java: Add many more test cases. ! * libjava.lang/Divide_1.out: Likewise. ! ! 2001-07-03 Jeff Sturm ! ! * libjava.lang/II.java: New file. ! * libjava.lang/II.out: New file. ! ! 2001-06-25 Tom Tromey ! ! * libjava.lang/stub.xfail: Removed. ! ! 2001-06-24 Andreas Jaeger ! ! * libjava.jni/jni.exp (gcj_jni_compile_c_to_so): Fix path for ! jni.h. ! ! 2001-06-14 Tom Tromey ! ! * libjava.jni/jni.exp: New file. ! * lib/libjava.exp (gcj_link): New proc. ! ! 2001-06-08 Tom Tromey ! ! Fix for PR libgcj/2874: ! * libjava.mauve/mauve.exp (gcj_run_mauve_tests): New proc. ! (test_mauve): Return 0 on failure. ! * lib/libjava.exp (test_libjava_from_source): Remove generated ! files if test is successful. ! (test_libjava_from_javac): Likewise. ! (gcj_cleanup): New proc. ! ! 2001-06-05 Jeff Sturm ! ! * lib/libjava.exp (libjava_arguments): Build with `-no-install' ! when $mode == "link". ! ! 2001-06-02 Anthony Green ! ! * libjava.lang/invokethrow.java: Fake a pass for systems which ! don't support invocation. ! ! 2001-05-30 Tom Tromey ! ! * libjava.lang/invokethrow.out: New file. ! * libjava.lang/invokethrow.java: New file. 2001-05-03 Tom Tromey *************** *** 70,75 **** --- 372,383 ---- * libjava.lang/instinit2.out: Fixed. + 2001-03-22 Tom Tromey + + * libjava.jni/field.out: New file. + * libjava.jni/field.c: New file. + * libjava.jni/field.java: New file. + 2001-03-20 Tom Tromey * libjava.compile/uesc.java: New file. *************** *** 182,188 **** Fri Nov 24 11:25:20 2000 Anthony Green * lib/libjava.exp (bytecompile_file): Change default from javac to ! gcj -C. (libjava_arguments): Fix classpath. * libjava.compile/PR129_B.no-link: New file. --- 490,496 ---- Fri Nov 24 11:25:20 2000 Anthony Green * lib/libjava.exp (bytecompile_file): Change default from javac to ! gcj -C. (libjava_arguments): Fix classpath. * libjava.compile/PR129_B.no-link: New file. *************** Sun Oct 8 19:14:05 2000 Anthony Green *** 310,316 **** Test for PR gcj/224: * libjava.compile/PR224.java: New file. ! * libjava.compile/PR224.xfail: New file. 2000-04-28 Bryce McKinlay --- 618,624 ---- Test for PR gcj/224: * libjava.compile/PR224.java: New file. ! * libjava.compile/PR224.xfail: New file. 2000-04-28 Bryce McKinlay *************** Sun Oct 8 19:14:05 2000 Anthony Green *** 722,728 **** * lib/libjava.exp (bytecompile_file): Use `env(SUN_JAVAC)', that defaults to javac, as Sun-javac compiler or compatible. ! (libjava_init): Get GCJ from environment if neither GCJ_UNDER_TEST nor TOOL_EXECUTABLE are set. Set `original_ld_library_path' from environment. (libjava_arguments): Prepend `.' and `$srcdir/$subdir' to --- 1030,1036 ---- * lib/libjava.exp (bytecompile_file): Use `env(SUN_JAVAC)', that defaults to javac, as Sun-javac compiler or compatible. ! (libjava_init): Get GCJ from environment if neither GCJ_UNDER_TEST nor TOOL_EXECUTABLE are set. Set `original_ld_library_path' from environment. (libjava_arguments): Prepend `.' and `$srcdir/$subdir' to *************** Sun Oct 8 19:14:05 2000 Anthony Green *** 828,834 **** Thu Jul 1 16:22:19 1999 Anthony Green * libjava.mauve/mauve.exp: Don't stop counting test results ! prematurely. 1999-06-25 Tom Tromey --- 1136,1142 ---- Thu Jul 1 16:22:19 1999 Anthony Green * libjava.mauve/mauve.exp: Don't stop counting test results ! prematurely. 1999-06-25 Tom Tromey *************** Fri Sep 18 12:43:52 1998 Warren Levy < *** 1123,1143 **** * libjava.lang/Integer_1.java, libjava.lang/Integer_1.out, libjava.lang/Integer_2.java, libjava.lang/Integer_2.out: Created. ! * libjava.lang/String_2.java, libjava.lang/String_2.out: Use JDK 1.2 values for hashCode. Thu Sep 10 12:44:42 1998 Warren Levy * libjava.lang/String_1.java, libjava.lang/String_1.out, ! libjava.lang/String_2.java, libjava.lang/String_2.out, ! libjava.lang/String_3.java, libjava.lang/String_3.out, ! libjava.lang/String_4.java, libjava.lang/String_4.out, ! libjava.lang/String_5.java, libjava.lang/String_5.out, ! libjava.lang/String_6.java, libjava.lang/String_6.out, ! libjava.lang/String_7.java, libjava.lang/String_7.out, ! libjava.lang/String_8.java, libjava.lang/String_8.out, ! libjava.lang/String_9.java, libjava.lang/String_9.out: Created. Tue Sep 8 13:31:59 1998 Warren Levy --- 1431,1451 ---- * libjava.lang/Integer_1.java, libjava.lang/Integer_1.out, libjava.lang/Integer_2.java, libjava.lang/Integer_2.out: Created. ! * libjava.lang/String_2.java, libjava.lang/String_2.out: Use JDK 1.2 values for hashCode. Thu Sep 10 12:44:42 1998 Warren Levy * libjava.lang/String_1.java, libjava.lang/String_1.out, ! libjava.lang/String_2.java, libjava.lang/String_2.out, ! libjava.lang/String_3.java, libjava.lang/String_3.out, ! libjava.lang/String_4.java, libjava.lang/String_4.out, ! libjava.lang/String_5.java, libjava.lang/String_5.out, ! libjava.lang/String_6.java, libjava.lang/String_6.out, ! libjava.lang/String_7.java, libjava.lang/String_7.out, ! libjava.lang/String_8.java, libjava.lang/String_8.out, ! libjava.lang/String_9.java, libjava.lang/String_9.out: Created. Tue Sep 8 13:31:59 1998 Warren Levy *************** Tue Sep 8 13:31:59 1998 Warren Levy < *** 1147,1156 **** Thu Sep 3 15:57:57 1998 Warren Levy * libjava.lang/Boolean_1.java, libjava.lang/Boolean_1.out, ! libjava.lang/Boolean_2.java, libjava.lang/Boolean_2.out, ! libjava.lang/Boolean_3.java, libjava.lang/Boolean_3.out, ! libjava.lang/Boolean_4.java, libjava.lang/Boolean_4.out, ! libjava.lang/Boolean_5.java, libjava.lang/Boolean_5.out: Created. Tue Sep 1 12:27:54 1998 Tom Tromey --- 1455,1464 ---- Thu Sep 3 15:57:57 1998 Warren Levy * libjava.lang/Boolean_1.java, libjava.lang/Boolean_1.out, ! libjava.lang/Boolean_2.java, libjava.lang/Boolean_2.out, ! libjava.lang/Boolean_3.java, libjava.lang/Boolean_3.out, ! libjava.lang/Boolean_4.java, libjava.lang/Boolean_4.out, ! libjava.lang/Boolean_5.java, libjava.lang/Boolean_5.out: Created. Tue Sep 1 12:27:54 1998 Tom Tromey *************** Tue Sep 1 12:27:54 1998 Tom Tromey * libjava.util/Random_1.java, libjava.util/Random_1.out, ! libjava.util/Random_2.java, libjava.util/Random_2.out, ! libjava.util/Random_3.java, libjava.util/Random_3.out, ! libjava.util/Random_4.java, libjava.util/Random_4.out, ! libjava.util/Random_5.java, libjava.util/Random_5.out, ! libjava.util/Random_6.java, libjava.util/Random_6.out, ! libjava.util/Random_7.java, libjava.util/Random_7.out, ! libjava.util/Random_8.java, libjava.util/Random_8.out, ! libjava.util/test.exp: Created. Mon Aug 31 16:37:19 1998 Tom Tromey --- 1495,1508 ---- Mon Aug 31 17:49:21 1998 Warren Levy * libjava.util/Random_1.java, libjava.util/Random_1.out, ! libjava.util/Random_2.java, libjava.util/Random_2.out, ! libjava.util/Random_3.java, libjava.util/Random_3.out, ! libjava.util/Random_4.java, libjava.util/Random_4.out, ! libjava.util/Random_5.java, libjava.util/Random_5.out, ! libjava.util/Random_6.java, libjava.util/Random_6.out, ! libjava.util/Random_7.java, libjava.util/Random_7.out, ! libjava.util/Random_8.java, libjava.util/Random_8.out, ! libjava.util/test.exp: Created. Mon Aug 31 16:37:19 1998 Tom Tromey *************** Tue Aug 25 17:27:37 1998 Anthony Green *** 1216,1219 **** libjava.lang/Finalize_1.java, libjava.lang/Finalize_1.out, libjava.lang/Float_1.java, libjava.lang/Float_1.out libjava.lang/test.exp, Makefile.am, Makefile.in: Created. - --- 1524,1526 ---- diff -Nrc3pad gcc-3.0.4/libjava/testsuite/Makefile.in gcc-3.1/libjava/testsuite/Makefile.in *** gcc-3.0.4/libjava/testsuite/Makefile.in Wed Jul 18 16:56:42 2001 --- gcc-3.1/libjava/testsuite/Makefile.in Wed Apr 10 13:10:16 2002 *************** *** 1,6 **** ! # Makefile.in generated automatically by automake 1.4 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. --- 1,6 ---- ! # Makefile.in generated automatically by automake 1.4-p5 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. *************** AM_RUNTESTFLAGS = @AM_RUNTESTFLAGS@ *** 67,72 **** --- 67,73 ---- AR = @AR@ AS = @AS@ CC = @CC@ + CHECKREFSPEC = @CHECKREFSPEC@ COMPPATH = @COMPPATH@ CXX = @CXX@ CXXCPP = @CXXCPP@ *************** GCLIBS = @GCLIBS@ *** 85,94 **** GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! ICONV_LDFLAGS = @ICONV_LDFLAGS@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBDATASTARTSPEC = @LIBDATASTARTSPEC@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ --- 86,96 ---- GCOBJS = @GCOBJS@ GCSPEC = @GCSPEC@ GCTESTSPEC = @GCTESTSPEC@ ! HASH_SYNC_SPEC = @HASH_SYNC_SPEC@ INCLTDL = @INCLTDL@ JC1GCSPEC = @JC1GCSPEC@ ! LIBFFI = @LIBFFI@ ! LIBFFIINCS = @LIBFFIINCS@ LIBGCJDEBUG = @LIBGCJDEBUG@ LIBGCJTESTSPEC = @LIBGCJTESTSPEC@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ *************** OBJDUMP = @OBJDUMP@ *** 104,127 **** OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ - ZDEPS = @ZDEPS@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ AUTOMAKE_OPTIONS = foreign dejagnu --- 106,134 ---- OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PERL = @PERL@ + PLATFORMOBJS = @PLATFORMOBJS@ RANLIB = @RANLIB@ STRIP = @STRIP@ SYSDEP_SOURCES = @SYSDEP_SOURCES@ SYSTEMSPEC = @SYSTEMSPEC@ + SYS_ZLIBS = @SYS_ZLIBS@ THREADDEPS = @THREADDEPS@ THREADINCS = @THREADINCS@ + THREADLDFLAGS = @THREADLDFLAGS@ THREADLIBS = @THREADLIBS@ THREADOBJS = @THREADOBJS@ THREADSPEC = @THREADSPEC@ VERSION = @VERSION@ ZINCS = @ZINCS@ ZLIBS = @ZLIBS@ ZLIBSPEC = @ZLIBSPEC@ ZLIBTESTSPEC = @ZLIBTESTSPEC@ + gcc_version = @gcc_version@ + glibjava_CXX = @glibjava_CXX@ here = @here@ libgcj_basedir = @libgcj_basedir@ mkinstalldirs = @mkinstalldirs@ + tool_include_dir = @tool_include_dir@ AUTOMAKE_OPTIONS = foreign dejagnu *************** RUNTEST = `if [ -f $(top_srcdir)/../deja *** 137,150 **** RUNTESTFLAGS = @AM_RUNTESTFLAGS@ ! CONFIG_HEADER = ../include/config.h CONFIG_CLEAN_FILES = DIST_COMMON = ChangeLog Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = tar GZIP_ENV = --best all: all-redirect .SUFFIXES: --- 144,157 ---- RUNTESTFLAGS = @AM_RUNTESTFLAGS@ ! CONFIG_HEADER = ../include/config.h ../gcj/libgcj-config.h CONFIG_CLEAN_FILES = DIST_COMMON = ChangeLog Makefile.am Makefile.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = gtar GZIP_ENV = --best all: all-redirect .SUFFIXES: *************** distdir: $(DISTFILES) *** 172,178 **** @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ --- 179,185 ---- @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ ! cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ diff -Nrc3pad gcc-3.0.4/libjava/testsuite/lib/libjava.exp gcc-3.1/libjava/testsuite/lib/libjava.exp *** gcc-3.0.4/libjava/testsuite/lib/libjava.exp Fri Jul 27 12:17:05 2001 --- gcc-3.1/libjava/testsuite/lib/libjava.exp Wed May 8 23:18:37 2002 *************** *** 1,4 **** ! # Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation load_lib "libgloss.exp" --- 1,4 ---- ! # Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation load_lib "libgloss.exp" *************** proc libjava_init { args } { *** 112,117 **** --- 112,119 ---- global TOOL_EXECUTABLE global original_ld_library_path global env objdir + global tool_root_dir + global libjava_libgcc_s_path if { $libjava_initialized == 1 } { return; } *************** proc libjava_init { args } { *** 127,134 **** } } # The -B is so we find libgcj.spec. ! set text [eval exec "$GCJ_UNDER_TEST -B$objdir/../ -v 2>@ stdout"] regexp -- "Thread model: (\[^\n\]+)\n" $text ignore model set libjava_uses_threads [expr {! ($model == "no" || $model == "none" --- 129,141 ---- } } + # FIXME: This finds libgcj.spec for the default multilib. + # If thread models differ between multilibs, this has to be moved + # to libjava_arguments + set specdir [libjava_find_spec] + # The -B is so we find libgcj.spec. ! set text [eval exec "$GCJ_UNDER_TEST -B$specdir -v 2>@ stdout"] regexp -- "Thread model: (\[^\n\]+)\n" $text ignore model set libjava_uses_threads [expr {! ($model == "no" || $model == "none" *************** proc libjava_init { args } { *** 159,164 **** --- 166,194 ---- } } + # Finally, add the gcc build directory so that we can find the + # shared libgcc. This, like much of dejagnu, is hideous. + set libjava_libgcc_s_path {} + set gccdir [lookfor_file $tool_root_dir gcc/libgcc_s.so] + if {$gccdir != ""} { + set gccdir [file dirname $gccdir] + lappend libjava_libgcc_s_path $gccdir + set compiler ${gccdir}/xgcc + if { [is_remote host] == 0 && [which $compiler] != 0 } { + foreach i "[exec $compiler --print-multi-lib]" { + set mldir "" + regexp -- "\[a-z0-9=/\.-\]*;" $i mldir + set mldir [string trimright $mldir "\;@"] + if { "$mldir" == "." } { + continue + } + if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] == 1 } { + lappend libjava_libgcc_s_path "${gccdir}/${mldir}" + } + } + } + } + set libjava_initialized 1 } *************** proc libjava_find_lib {dir name} { *** 175,185 **** foreach sub {.libs _libs} { if {$gp != ""} { if {[file exists $gp/$dir/$sub/lib${name}.a]} then { ! return "$gp/$dir/lib${name}.la -L$gp/$dir/$sub" } } set lib [findfile $base_dir/../../$dir/$sub/lib${name}.a \ ! "$base_dir/../../$dir/lib${name}.la -L$base_dir/../../$dir/$sub" \ ""] if {$lib != ""} { return $lib --- 205,219 ---- foreach sub {.libs _libs} { if {$gp != ""} { if {[file exists $gp/$dir/$sub/lib${name}.a]} then { ! # Just return the `-L' option. The library itself ! # will be picked up via the spec file. ! return "-L$gp/$dir/$sub" } } + # Just return the `-L' option. The library itself will be + # picked up via the spec file. set lib [findfile $base_dir/../../$dir/$sub/lib${name}.a \ ! "-L$base_dir/../../$dir/$sub" \ ""] if {$lib != ""} { return $lib *************** proc libjava_find_lib {dir name} { *** 188,193 **** --- 222,255 ---- return "" } + # Find libgcj.spec. We need to use the file corresponding to the multilib + # under test since they might differ. Append a trailing slash since this + # is used with -B. + proc libjava_find_spec {} { + global objdir + set gp [get_multilibs] + + if {[file exists $gp/libjava/libgcj.spec]} then { + return "$gp/libjava/" + } + return "$objdir/../" + } + + # Remove a bunch of files. + proc gcj_cleanup {args} { + foreach file $args { + if {[string match *.o $file]} { + verbose "removing [file rootname $file].lo" + file delete -force [file rootname $file].lo + } + file delete -force -- $file + verbose "removing $file" + } + # It is simplest to do this instead of trying to figure out what + # bits in .libs ought to be removed. + catch {system "rm -rf .libs"} + } + # Compute arguments needed for compiler. MODE is a libtool mode: # either compile or link. proc libjava_arguments {{mode compile}} { *************** proc libjava_arguments {{mode compile}} *** 203,208 **** --- 265,271 ---- global runtests global env global tool_root_dir + global libjava_libgcc_s_path if [info exists LIBJAVA] { set libjava $LIBJAVA; *************** proc libjava_arguments {{mode compile}} *** 252,264 **** } } ! # Finally, add the gcc build directory so that we can find the ! # shared libgcc. This, like much of dejagnu, is hideous. ! set gccdir [lookfor_file $tool_root_dir gcc/libgcc_s.so] ! if {$gccdir != ""} { ! lappend lpath [file dirname $gccdir] ! } ! set ld_library_path [join $lpath :] # That's enough to make things work for the normal case. --- 315,321 ---- } } ! set lpath [concat $lpath $libjava_libgcc_s_path] set ld_library_path [join $lpath :] # That's enough to make things work for the normal case. *************** proc libjava_arguments {{mode compile}} *** 273,290 **** verbose "LD_LIBRARY_PATH = $env(LD_LIBRARY_PATH)" # Set the CLASSPATH environment variable ! verbose "CLASSPATH is .:$srcdir/$subdir:$objdir:$objdir/../libgcj.jar" global env ! set env(CLASSPATH) ".:$srcdir/$subdir:$objdir:$objdir/../libgcj.jar" ! global wrapper_file wrap_compile_flags; ! lappend args "additional_flags=$wrap_compile_flags"; ! lappend args "libs=$wrapper_file"; ! lappend args "libs=$libjava"; ! lappend args "libs=$libgc"; ! lappend args "libs=$libqthreads" ! lappend args "libs=$libz" ! lappend args debug if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { lappend args "libs=${gluefile}" --- 330,349 ---- verbose "LD_LIBRARY_PATH = $env(LD_LIBRARY_PATH)" # Set the CLASSPATH environment variable ! verbose "CLASSPATH is .:$srcdir/$subdir:$objdir:$objdir/../libgcj-3.1.jar" global env ! set env(CLASSPATH) ".:$srcdir/$subdir:$objdir:$objdir/../libgcj-3.1.jar" ! if {$mode == "link"} { ! global wrapper_file wrap_compile_flags; ! lappend args "additional_flags=$wrap_compile_flags"; ! lappend args "libs=$wrapper_file"; ! lappend args "libs=$libjava"; ! lappend args "libs=$libgc"; ! lappend args "libs=$libqthreads" ! lappend args "libs=$libz" ! lappend args debug ! } if { [target_info needs_status_wrapper]!="" && [info exists gluefile] } { lappend args "libs=${gluefile}" *************** proc libjava_arguments {{mode compile}} *** 295,300 **** --- 354,362 ---- lappend args "additional_flags=$TOOL_OPTIONS" } + # Determine libgcj.spec corresponding to multilib under test. + set specdir [libjava_find_spec] + # Search for libtool. We need it to link. set found_compiler 0 set d [absolute $objdir] *************** proc libjava_arguments {{mode compile}} *** 302,321 **** if {[file exists $d/$x/libtool]} then { # We have to run silently to avoid DejaGNU lossage. lappend args \ ! "compiler=$d/$x/libtool --silent --tag=GCJ --mode=$mode $GCJ_UNDER_TEST -B$objdir/../" set found_compiler 1 break } } if {! $found_compiler} { ! # Append -B$objdir/../ so that we find libgcj.spec before it # is installed. ! lappend args "compiler=$GCJ_UNDER_TEST -B$objdir/../" } return $args } # # Run the test specified by srcfile and resultfile. compile_args and --- 364,409 ---- if {[file exists $d/$x/libtool]} then { # We have to run silently to avoid DejaGNU lossage. lappend args \ ! "compiler=$d/$x/libtool --silent --tag=GCJ --mode=$mode $GCJ_UNDER_TEST -B$specdir" set found_compiler 1 break } } if {! $found_compiler} { ! # Append -B$specdir so that we find libgcj.spec before it # is installed. ! lappend args "compiler=$GCJ_UNDER_TEST -B$specdir" ! } ! ! # Avoid libtool wrapper scripts when possible. ! if {$mode == "link"} { ! lappend args "additional_flags=-no-install" } return $args } + # Link a bunch of objects into a program. MAIN is the name of the + # class holding `main'. Return 0 on failure. + proc gcj_link {program main files {options {}}} { + set arguments [libjava_arguments link] + if {[llength $options]} { + eval lappend arguments $options + } + lappend arguments "additional_flags=--main=$main" + set x [prune_warnings [libjava_tcompile $files $program executable \ + $arguments]] + if {$x != ""} { + verbose "link failure: $x" 2 + fail "linking $program" + setup_xfail "*-*-*" + fail "running $program" + return 0 + } + + pass "linking $program" + return 1 + } # # Run the test specified by srcfile and resultfile. compile_args and *************** proc test_libjava_from_source { options *** 378,383 **** --- 466,473 ---- set errname "$errname $compile_args" } + set removeList [list $executable] + set x [prune_warnings \ [libjava_tcompile $srcfile "$executable" $target $args]] if {[info exists opts(xfail-gcj)]} { *************** proc test_libjava_from_source { options *** 388,393 **** --- 478,484 ---- if {[info exists opts(shouldfail)]} { pass "$errname compilation from source" + eval gcj_cleanup $removeList return } *************** proc test_libjava_from_source { options *** 414,422 **** --- 505,515 ---- untested "$errname execution from source compiled test" untested "$errname output from source compiled test" } + eval gcj_cleanup $removeList return } if {[info exists opts(no-link)]} { + eval gcj_cleanup $removeList return } *************** proc test_libjava_from_source { options *** 460,470 **** if {[info exists opts(xfail-output)]} { setup_xfail *-*-* } if { $passed == 1 } { pass "$errname output from source compiled test" } else { - clone_output "expected was $expected" - clone_output "output was $output" fail "$errname output from source compiled test" } close $id; --- 553,565 ---- if {[info exists opts(xfail-output)]} { setup_xfail *-*-* } + if {[info exists opts(xfail-source-output)]} { + setup_xfail *-*-* + } if { $passed == 1 } { pass "$errname output from source compiled test" + eval gcj_cleanup $removeList } else { fail "$errname output from source compiled test" } close $id; *************** proc test_libjava_from_javac { options s *** 537,557 **** } pass "$errname byte compilation" # Find name to use for --main, and name of all class files. set jvscan [find_jvscan] verbose "jvscan is $jvscan" - # We insulate ourselves from the user's locale by forcing the - # encoding on jvscan. - set jvscan "compiler=$jvscan additional_flags=--encoding=UTF-8" set main_name [string trim \ [prune_warnings \ ! [libjava_tcompile $srcfile "" none \ ! "$jvscan additional_flags=--print-main"]]] verbose "main name is $main_name" set class_out [string trim \ [prune_warnings \ ! [libjava_tcompile $srcfile "" none \ ! "$jvscan additional_flags=--list-class"]]] verbose "class list is $class_out" if {[string match "*parse error*" $main_name] --- 632,649 ---- } pass "$errname byte compilation" + set removeList {} + # Find name to use for --main, and name of all class files. set jvscan [find_jvscan] verbose "jvscan is $jvscan" set main_name [string trim \ [prune_warnings \ ! [lindex [local_exec "$jvscan --encoding=UTF-8 $srcfile --print-main" "" "" 300] 1]]] verbose "main name is $main_name" set class_out [string trim \ [prune_warnings \ ! [lindex [local_exec "$jvscan --encoding=UTF-8 $srcfile --list-class" "" "" 300] 1]]] verbose "class list is $class_out" if {[string match "*parse error*" $main_name] *************** proc test_libjava_from_javac { options s *** 573,578 **** --- 665,672 ---- lappend class_files $objdir/$file.class } + eval lappend removeList $class_files + # Usually it is an error for a test program not to have a `main' # method. However, for no-exec tests it is ok. Treat no-link # like no-exec here. *************** proc test_libjava_from_javac { options s *** 615,632 **** set executable [file rootname [file tail $c_file]].o set x [prune_warnings \ [libjava_tcompile $c_file "$executable" $type $args]] if {$x != ""} { break } } } else { ! # This is no evil: we de-listify CLASS_FILES so that we can # turn around and quote the `$' in it for the shell. I really # hate DejaGNU. It is so !@#$!@# unpredictable. set hack "" foreach stupid $class_files { set hack "$hack $stupid" } set x [prune_warnings \ [libjava_tcompile $hack "$executable" $type $args]] } --- 709,728 ---- set executable [file rootname [file tail $c_file]].o set x [prune_warnings \ [libjava_tcompile $c_file "$executable" $type $args]] + lappend removeList $executable if {$x != ""} { break } } } else { ! # This is so evil: we de-listify CLASS_FILES so that we can # turn around and quote the `$' in it for the shell. I really # hate DejaGNU. It is so !@#$!@# unpredictable. set hack "" foreach stupid $class_files { set hack "$hack $stupid" } + lappend removeList $executable set x [prune_warnings \ [libjava_tcompile $hack "$executable" $type $args]] } *************** proc test_libjava_from_javac { options s *** 650,655 **** --- 746,752 ---- untested "$errname execution from bytecode->native test" untested "$errname output from bytecode->native test" } + eval gcj_cleanup $removeList return } *************** proc test_libjava_from_javac { options s *** 662,668 **** $status "$errname execution from bytecode->native test" if { $status != "pass" } { untested "$errname output from bytecode->native test" ! return; } verbose "resultfile is $resultfile" --- 759,765 ---- $status "$errname execution from bytecode->native test" if { $status != "pass" } { untested "$errname output from bytecode->native test" ! return } verbose "resultfile is $resultfile" *************** proc test_libjava_from_javac { options s *** 684,689 **** --- 781,789 ---- if {[info exists opts(xfail-output)]} { setup_xfail *-*-* } + if {[info exists opts(xfail-byte-output)]} { + setup_xfail *-*-* + } if {$options == "regexp_match"} { if [regexp $expected $output] { set passed 1; *************** proc test_libjava_from_javac { options s *** 695,703 **** } if { $passed == 1 } { pass "$errname output from bytecode->native test" } else { - clone_output "expected was $expected" - clone_output "output was $output" fail "$errname output from bytecode->native test" } close $id; --- 795,802 ---- } if { $passed == 1 } { pass "$errname output from bytecode->native test" + eval gcj_cleanup $removeList } else { fail "$errname output from bytecode->native test" } close $id; *************** proc test_libjava_from_javac { options s *** 720,725 **** --- 819,828 ---- # `xfail-exec' exec will fail # `xfail-output' # output will be wrong + # `xfail-byte-output' + # output will be wrong when compiled from bytecode + # `xfail-source-output' + # output will be wrong when compiled from source code # `need-threads' # test relies on thread support # diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/BlankFinal.java gcc-3.1/libjava/testsuite/libjava.compile/BlankFinal.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/BlankFinal.java Fri Jan 21 21:12:47 2000 --- gcc-3.1/libjava/testsuite/libjava.compile/BlankFinal.java Thu Jan 1 00:00:00 1970 *************** *** 1,16 **** - // Test to see if "blank final" variables work. - // From Mo DeJong - - public class BlankFinal { - static final boolean cond; - - static { - try - { - cond = true; - } - catch(Exception e) { - // do nothing - } - } - } --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR3417.java gcc-3.1/libjava/testsuite/libjava.compile/PR3417.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR3417.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR3417.java Tue Dec 18 16:36:40 2001 *************** *** 0 **** --- 1,6 ---- + // Make sure that assignment conversion checks are done for `return'. + + class PR3417 + { + char func (int i) { return i; } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR3417.xfail gcc-3.1/libjava/testsuite/libjava.compile/PR3417.xfail *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR3417.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR3417.xfail Tue Dec 18 16:36:40 2001 *************** *** 0 **** --- 1 ---- + shouldfail diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR4766.java gcc-3.1/libjava/testsuite/libjava.compile/PR4766.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR4766.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR4766.java Thu Dec 20 18:05:20 2001 *************** *** 0 **** --- 1,25 ---- + // Test that bytecode generation works even when `finally' clause + // doesn't return normally. + + public class PR4766 + { + public static int myfunction() + { + try + { + System.out.println ("hi"); + } + catch( Exception e ) + { + e.printStackTrace(); + } + finally + { + return 0; + } + } + + public static void main (String[] args) + { + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR5641.java gcc-3.1/libjava/testsuite/libjava.compile/PR5641.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR5641.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR5641.java Mon Feb 11 00:18:52 2002 *************** *** 0 **** --- 1,20 ---- + interface I + { + void m(); + } + abstract class C implements I {} + class Foo + { + void Bar(C c) + { + c.m(); + } + void blah(C c) + { + c.m(); + } + + public static void main (String[] args) + { + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR5641.xfail gcc-3.1/libjava/testsuite/libjava.compile/PR5641.xfail *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR5641.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR5641.xfail Mon Feb 11 00:18:52 2002 *************** *** 0 **** --- 1,2 ---- + no-link + xfail-byte diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR5848.java gcc-3.1/libjava/testsuite/libjava.compile/PR5848.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR5848.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR5848.java Tue Mar 12 19:53:35 2002 *************** *** 0 **** --- 1,14 ---- + import java.util.Vector; + import java.util.Enumeration; + + public class PR5848 + { + private Vector data; + void sub() + { + long sz = 0; + for (Enumeration e = data.elements() ; e.hasMoreElements() ;) { + sz =+ ((byte[])e.nextElement()).length; + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR5848.xfail gcc-3.1/libjava/testsuite/libjava.compile/PR5848.xfail *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR5848.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR5848.xfail Tue Mar 12 19:53:35 2002 *************** *** 0 **** --- 1 ---- + no-link diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR5902.java gcc-3.1/libjava/testsuite/libjava.compile/PR5902.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR5902.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR5902.java Fri Mar 15 19:16:02 2002 *************** *** 0 **** --- 1,4 ---- + class PR5902 + { + double d = 019f; + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR5913.java gcc-3.1/libjava/testsuite/libjava.compile/PR5913.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR5913.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR5913.java Fri Mar 15 19:16:02 2002 *************** *** 0 **** --- 1,6 ---- + class PR5913 + { + boolean test1 = ("" + 1) instanceof String; + // This also tests literal parsing, as mentioned in PR 5902. + boolean test2 = "" + 0x1instanceof String; + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR5913.xfail gcc-3.1/libjava/testsuite/libjava.compile/PR5913.xfail *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR5913.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR5913.xfail Tue Mar 12 07:20:43 2002 *************** *** 0 **** --- 1,2 ---- + xfail-gcj + xfail-gcjC diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/PR6026.java gcc-3.1/libjava/testsuite/libjava.compile/PR6026.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/PR6026.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/PR6026.java Sat Mar 23 00:04:30 2002 *************** *** 0 **** --- 1,4 ---- + class PR6026 + { + double d = 0.4e1+0.8; + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/XercesBug.java gcc-3.1/libjava/testsuite/libjava.compile/XercesBug.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/XercesBug.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/XercesBug.java Fri Aug 17 22:26:15 2001 *************** *** 0 **** --- 1,13 ---- + // This is java/4007 + public final class XercesBug + { + static final class OrderedHashtable + { + private Entry[] fEntries = null; + public static final class Entry + { + int x; + } + + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/final_assignment_check.java gcc-3.1/libjava/testsuite/libjava.compile/final_assignment_check.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/final_assignment_check.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/final_assignment_check.java Sat Sep 1 04:54:05 2001 *************** *** 0 **** --- 1,12 ---- + class f { + final static char c = 3; + final static byte b = 0.1; + final static short s = 3.5f; + final static int i = 4L; + final static long x = 2.5; + final static float y = 2.6; + final static String S = new Object (); + void foo () { + final int i = 2.1; + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/final_assignment_check.xfail gcc-3.1/libjava/testsuite/libjava.compile/final_assignment_check.xfail *** gcc-3.0.4/libjava/testsuite/libjava.compile/final_assignment_check.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/final_assignment_check.xfail Sat Sep 1 04:54:05 2001 *************** *** 0 **** --- 1 ---- + shouldfail diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/final_initialization_in_ctor.java gcc-3.1/libjava/testsuite/libjava.compile/final_initialization_in_ctor.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/final_initialization_in_ctor.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/final_initialization_in_ctor.java Thu Sep 27 19:17:16 2001 *************** *** 0 **** --- 1,21 ---- + // This test case was insipred by + // http://gcc.gnu.org/ml/java/2001-09/msg00181.html + + class M { + int size () { return 3; } + } + + class final_initialization_in_ctor { + + final float loadFactor; + + public final_initialization_in_ctor(M m) + { + this(Math.max(m.size() * 2, 30), (float)40.0); + } + + public final_initialization_in_ctor(int initialCapacity, float loadFactor) + { + this.loadFactor = loadFactor; + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.compile/final_local_switch.java gcc-3.1/libjava/testsuite/libjava.compile/final_local_switch.java *** gcc-3.0.4/libjava/testsuite/libjava.compile/final_local_switch.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.compile/final_local_switch.java Sat Sep 1 04:54:05 2001 *************** *** 0 **** --- 1,16 ---- + // This bug was discovered while working on java/1413 (compiling freetds.) + // http://gcc.gnu.org/ml/java-prs/2000-q4/msg00156.html + // The following code should build. + + class final_local_switch { + void foo (int type) { + final byte CHARSET_CHANGE = (byte)3; + final byte CHARSET_CHANGES = (byte)4; + switch (type) { + case CHARSET_CHANGE: + break; + case CHARSET_CHANGES: + break; + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/calls.c gcc-3.1/libjava/testsuite/libjava.jni/calls.c *** gcc-3.0.4/libjava/testsuite/libjava.jni/calls.c Thu Feb 17 00:49:27 2000 --- gcc-3.1/libjava/testsuite/libjava.jni/calls.c Fri Aug 3 16:21:23 2001 *************** Java_calls_docall (JNIEnv *env, jobject *** 29,35 **** method = (*env)->GetMethodID (env, klass, "char_f", "(I)C"); val.i = 10; ! c = (*env)->CallCharMethodV (env, _this, method, &val); if (c != ('a' + 10)) ++fails; --- 29,35 ---- method = (*env)->GetMethodID (env, klass, "char_f", "(I)C"); val.i = 10; ! c = (*env)->CallCharMethodA (env, _this, method, &val); if (c != ('a' + 10)) ++fails; diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/cxxtest.cc gcc-3.1/libjava/testsuite/libjava.jni/cxxtest.cc *** gcc-3.0.4/libjava/testsuite/libjava.jni/cxxtest.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.jni/cxxtest.cc Fri Dec 14 21:56:29 2001 *************** *** 0 **** --- 1,24 ---- + #include + #include + + jobjectArray + Java_cxxtest_fetch (JNIEnv *env, jobject _this) + { + jclass cls; + jfieldID fid; + jobjectArray obj; + + cls = env->GetObjectClass (_this); + if (! cls) + return 0; + + fid = env->GetFieldID (cls, "F", "[Ljava/lang/Object;"); + if (! fid) + return 0; + + obj = reinterpret_cast (env->GetObjectField (_this, fid)); + + return obj; + } + + diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/cxxtest.java gcc-3.1/libjava/testsuite/libjava.jni/cxxtest.java *** gcc-3.0.4/libjava/testsuite/libjava.jni/cxxtest.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.jni/cxxtest.java Fri Dec 14 21:56:29 2001 *************** *** 0 **** --- 1,25 ---- + // Test for array field lookup. + + public class cxxtest + { + // A field for us to look up. + public Object[] F = new Object[7]; + + public native Object[] fetch (); + + public void doit () + { + System.out.println (F == fetch ()); + } + + public static void main (String[] args) + { + cxxtest q = new cxxtest (); + q.doit (); + } + + static + { + System.loadLibrary ("cxxtest"); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/cxxtest.out gcc-3.1/libjava/testsuite/libjava.jni/cxxtest.out *** gcc-3.0.4/libjava/testsuite/libjava.jni/cxxtest.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.jni/cxxtest.out Fri Dec 14 21:56:29 2001 *************** *** 0 **** --- 1 ---- + true diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/field.c gcc-3.1/libjava/testsuite/libjava.jni/field.c *** gcc-3.0.4/libjava/testsuite/libjava.jni/field.c Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.jni/field.c Fri Mar 23 05:57:00 2001 *************** *** 0 **** --- 1,24 ---- + #include + #include + + jobjectArray + Java_field_fetch (JNIEnv *env, jobject this) + { + jclass cls; + jfieldID fid; + jobjectArray obj; + + cls = (*env)->GetObjectClass (env, this); + if (! cls) + return 0; + + fid = (*env)->GetFieldID (env, cls, "F", "[Ljava/lang/Object;"); + if (! fid) + return 0; + + obj = (*env)->GetObjectField (env, this, fid); + + return obj; + } + + diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/field.java gcc-3.1/libjava/testsuite/libjava.jni/field.java *** gcc-3.0.4/libjava/testsuite/libjava.jni/field.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.jni/field.java Fri Mar 23 05:57:00 2001 *************** *** 0 **** --- 1,25 ---- + // Test for array field lookup. + + public class field + { + // A field for us to look up. + public Object[] F = new Object[7]; + + public native Object[] fetch (); + + public void doit () + { + System.out.println (F == fetch ()); + } + + public static void main (String[] args) + { + field q = new field (); + q.doit (); + } + + static + { + System.loadLibrary ("field"); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/field.out gcc-3.1/libjava/testsuite/libjava.jni/field.out *** gcc-3.0.4/libjava/testsuite/libjava.jni/field.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.jni/field.out Fri Mar 23 05:57:00 2001 *************** *** 0 **** --- 1 ---- + true diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.jni/jni.exp gcc-3.1/libjava/testsuite/libjava.jni/jni.exp *** gcc-3.0.4/libjava/testsuite/libjava.jni/jni.exp Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.jni/jni.exp Wed Mar 27 16:28:23 2002 *************** *** 0 **** --- 1,180 ---- + # Tests for JNI code. + + # Compile a single C file and produce a .so file. OPTIONS is a list + # of options to pass to the compiler. Returns 0 on failure, 1 on + # success. + proc gcj_jni_compile_c_to_so {file {options {}}} { + global srcdir + + set name [file rootname [file tail $file]] + set soname lib${name}.so + + lappend options "additional_flags=-shared -fPIC" + # Find the generated header. + lappend options "additional_flags=-I. -I.." + # Find jni.h. + lappend options "additional_flags=-I$srcdir/../include" + + set x [prune_warnings [target_compile $file $soname executable $options]] + if {$x != ""} { + verbose "target_compile failed: $x" 2 + fail "$name.c compilation" + return 0 + } + + pass "$name.c compilation" + return 1 + } + + # Build a header file from a .class file. Return 0 on failure. + proc gcj_jni_build_header {file} { + set gcjh [find_gcjh] + set file [file rootname $file] + set x [string trim [prune_warnings \ + [lindex [local_exec "$gcjh -jni $file" "" "" 300] 1]]] + if {$x != ""} { + verbose "local_exec failed: $x" 2 + fail "$file header generation" + return 0 + } + + pass "$file header generation" + return 1 + } + + # Invoke the program and see what happens. Return 0 on failure. + proc gcj_invoke {program expectFile ld_library_additions} { + global env + set lib_path $env(LD_LIBRARY_PATH) + + set newval . + if {[llength $ld_library_additions] > 0} { + append newval :[join $ld_library_additions :] + } + append newval :$lib_path + + setenv LD_LIBRARY_PATH $newval + setenv SHLIB_PATH $newval + + verbose "LD_LIBRARY_PATH=$env(LD_LIBRARY_PATH)" + + set result [libjava_load ./$program] + set status [lindex $result 0] + set output [lindex $result 1] + + # Restore setting + setenv LD_LIBRARY_PATH $lib_path + setenv SHLIB_PATH $lib_path + + if {$status != "pass"} { + verbose "got $output" + fail "$program run" + untested "$program output" + return 0 + } + + set id [open $expectFile r] + set expected [read $id] + close $id + + if {! [string compare $output $expected]} { + pass "$program output" + return 1 + } else { + fail "$program output" + return 0 + } + } + + # Do all the work for a single JNI test. Return 0 on failure. + proc gcj_jni_test_one {file} { + global runtests + + # The base name. We use it for several purposes. + set main [file rootname [file tail $file]] + if {! [runtest_file_p $runtests $main]} { + # Simply skip it. + return 1 + } + + if {! [bytecompile_file $file [pwd]]} { + fail "bytecompile $file" + # FIXME - should use `untested' on all remaining tests. + # But that is hard. + return 0 + } + pass "bytecompile $file" + + set bytefile [file rootname [file tail $file]].class + if {! [gcj_jni_build_header $bytefile]} { + # FIXME + return 0 + } + + set cfile [file rootname $file].c + set cxxflags "" + set cxxldlibflags {} + # If there is no `.c' file, assume there is a `.cc' file. + if {! [file exists $cfile]} { + set cfile [file rootname $file].cc + + set cxxflaglist {} + foreach arg [split [libjava_find_lib libstdc++-v3/src stdc++] " "] { + switch -glob -- $arg { + "-L*" { + set arg [string range $arg 2 end] + lappend cxxldlibflags $arg + # Strip the `.libs' directory; we link with libtool which + # doesn't need it. + set arg "-L[file dirname $arg]" + } + } + lappend cxxflaglist $arg + } + + lappend cxxflaglist "-lstdc++" + set cxxflags [join $cxxflaglist] + } + + if {! [gcj_jni_compile_c_to_so $cfile]} { + # FIXME + return 0 + } + + # We use -l$main because the .so is named the same as the main + # program. + set args [list "additional_flags=-fjni -L. -l$main $cxxflags"] + if {! [gcj_link $main $main $file $args]} { + # FIXME + return 0 + } + + if {! [gcj_invoke $main [file rootname $file].out $cxxldlibflags]} { + # FIXME + return 0 + } + + # When we succeed we remove all our clutter. + eval gcj_cleanup [glob -nocomplain -- ${main}.*] [list $main lib${main}.so] + + return 1 + } + + # Run the JNI tests. + proc gcj_jni_run {} { + global srcdir subdir + global build_triplet host_triplet + + # For now we only test JNI on native builds. + if {$build_triplet == $host_triplet} { + catch "glob -nocomplain ${srcdir}/${subdir}/*.java" srcfiles + + foreach x $srcfiles { + gcj_jni_test_one $x + } + } else { + verbose "JNI tests not run in cross-compilation environment" + } + } + + gcj_jni_run diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore.java gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore.java Wed Feb 20 04:14:15 2002 *************** *** 0 **** --- 1,52 ---- + public class ArrayStore + { + public static void main(String[] args) + { + ArrayStore s = new ArrayStore(); + + /* Check that bounds check takes precedence over array store check. */ + try + { + s.a(new String[1]); + } + catch (Exception x) + { + System.out.println (x.getClass().getName()); + } + + try + { + s.a(new String[2]); + } + catch (Exception x) + { + System.out.println (x.getClass().getName()); + } + + /* Check that += operator on String[] element works and throws bounds + exception. */ + try + { + s.b(new String[1]); + } + catch (Exception x) + { + System.out.println (x.getClass().getName()); + } + + String[] sb = new String[2]; + sb[1] = "foo"; + s.b(sb); + System.out.println (sb[1]); + } + + void a(Object[] oa) + { + oa[1] = new Integer(2); + } + + void b(String[] sa) + { + sa[1] += "bar"; + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore.out gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore.out Wed Feb 20 04:14:15 2002 *************** *** 0 **** --- 1,4 ---- + java.lang.ArrayIndexOutOfBoundsException + java.lang.ArrayStoreException + java.lang.ArrayIndexOutOfBoundsException + foobar diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore.xfail gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore.xfail Wed Feb 20 04:14:15 2002 *************** *** 0 **** --- 1 ---- + xfail-byte-output diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore2.java gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore2.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore2.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore2.java Wed Feb 20 04:14:15 2002 *************** *** 0 **** --- 1,31 ---- + public class ArrayStore2 + { + public static void main(String[] args) + { + new ArrayStore2().a(new Object[2], 3); + } + + void a(Object[] oa, int i) + { + try + { + oa[index()] = obj(); + } + catch (Exception x) + { + System.out.println (x.getClass().getName()); + } + } + + int index() + { + System.out.println ("index"); + return 3; + } + + Object obj() + { + System.out.println ("rhs"); + return new Object(); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore2.out gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore2.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore2.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore2.out Wed Feb 20 04:14:15 2002 *************** *** 0 **** --- 1,3 ---- + index + rhs + java.lang.ArrayIndexOutOfBoundsException diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore2.xfail gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore2.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/ArrayStore2.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/ArrayStore2.xfail Wed Feb 20 04:14:15 2002 *************** *** 0 **** --- 1 ---- + xfail-source-output diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Array_3.java gcc-3.1/libjava/testsuite/libjava.lang/Array_3.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/Array_3.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/Array_3.java Thu Dec 20 14:09:03 2001 *************** *** 0 **** --- 1,59 ---- + // Test to make sure null arrays throw the right execption + + public class Array_3 + { + static Object foo () + { + return null; + } + + static int[] bar () + { + return null; + } + + public static void main(String args[]) + { + boolean ok = false; + int nn = 0; + + try + { + int[] x = (int[])foo(); + nn = x.length; + } + catch (NullPointerException _) + { + ok = true; + } + if (!ok) + throw new RuntimeException("test failed"); + + ok = false; + try + { + int[] x = bar(); + nn = x.length; + } + catch (NullPointerException _) + { + ok = true; + } + if (!ok) + throw new RuntimeException("test failed"); + + ok = false; + try + { + int[] x = bar(); + nn = x[0]; + } + catch (NullPointerException _) + { + ok = true; + } + + if (!ok || nn != 0) + throw new RuntimeException("test failed"); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Divide_1.java gcc-3.1/libjava/testsuite/libjava.lang/Divide_1.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/Divide_1.java Thu May 20 08:26:55 1999 --- gcc-3.1/libjava/testsuite/libjava.lang/Divide_1.java Fri Jul 6 16:32:40 2001 *************** public class Divide_1 *** 4,10 **** int b1 = Integer.parseInt ("-1"); static int zero = Integer.parseInt ("0"); ! void probe () { try { int a = Integer.parseInt ("-80000000", 16); --- 4,10 ---- int b1 = Integer.parseInt ("-1"); static int zero = Integer.parseInt ("0"); ! void probe_1 () { try { int a = Integer.parseInt ("-80000000", 16); *************** public class Divide_1 *** 98,105 **** System.out.println (_); } } ! public static void main (String[] args) { ! new Divide_1 ().probe (); } } --- 98,203 ---- System.out.println (_); } } + + void probe_2 () + { + try { + int a = -0x80000000; + int c = a/b; + System.out.println (c); + } catch (Exception _) { + System.out.println (_); + } + + try { + int a = -0x80000000; + int c = a/-1; + System.out.println (c); + } catch (Exception _) { + System.out.println (_); + } ! try { ! int a = -0x80000000; ! int c = a%b; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! int a = -0x80000000; ! int c = a%b1; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! int a = -0x80000000; ! int c = a%-1; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! int a = 0x8000; ! int b = 0; ! int c = a/b; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! int a = 0x8000; ! int b = 0; ! int c = a%b; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! long a = -0x7fffffffffffffffL - 1; ! long c = a/b; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! long a = -0x7fffffffffffffffL - 1; ! long c = a%b; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! long a = 0x8000; ! long b = 0; ! long c = a/b; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! ! try { ! long a = 0x8000; ! long b = 0; ! long c = a%b; ! System.out.println (c); ! } catch (Exception _) { ! System.out.println (_); ! } ! } ! ! public static void main (String[] args) ! { ! Divide_1 d = new Divide_1 (); ! d.probe_1 (); ! d.probe_2 (); } } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Divide_1.out gcc-3.1/libjava/testsuite/libjava.lang/Divide_1.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/Divide_1.out Thu May 20 08:26:55 1999 --- gcc-3.1/libjava/testsuite/libjava.lang/Divide_1.out Fri Jul 6 16:32:40 2001 *************** java.lang.ArithmeticException: / by zero *** 9,11 **** --- 9,22 ---- 0 java.lang.ArithmeticException: / by zero java.lang.ArithmeticException: / by zero + -2147483648 + -2147483648 + 0 + 0 + 0 + java.lang.ArithmeticException: / by zero + java.lang.ArithmeticException: / by zero + -9223372036854775808 + 0 + java.lang.ArithmeticException: / by zero + java.lang.ArithmeticException: / by zero diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/FileHandleGcTest.java gcc-3.1/libjava/testsuite/libjava.lang/FileHandleGcTest.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/FileHandleGcTest.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/FileHandleGcTest.java Thu Dec 20 14:09:03 2001 *************** *** 0 **** --- 1,24 ---- + // Make sure that file handles are garbage collected. + import java.io.*; + public class FileHandleGcTest + { + static void kill () throws FileNotFoundException + { + for (int i = 0; i < 65536; i++) + { + FileInputStream f = new FileInputStream ("/dev/null"); + } + } + + public static void + main (String argv []) + { + try + { + kill (); + } + catch (FileNotFoundException _) + { + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/II.java gcc-3.1/libjava/testsuite/libjava.lang/II.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/II.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/II.java Tue Jul 3 23:52:27 2001 *************** *** 0 **** --- 1,16 ---- + public class II { + { + System.out.println("ii"); + } + public II() + { + } + public II(int x) + { + this(); + } + public static void main(String[] args) + { + new II(0); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/II.out gcc-3.1/libjava/testsuite/libjava.lang/II.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/II.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/II.out Tue Jul 3 23:52:27 2001 *************** *** 0 **** --- 1 ---- + ii diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/InvokeReturn.java gcc-3.1/libjava/testsuite/libjava.lang/InvokeReturn.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/InvokeReturn.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/InvokeReturn.java Wed Mar 27 16:30:58 2002 *************** *** 0 **** --- 1,80 ---- + import java.lang.reflect.Method; + + // Test return values of Method.invoke. + public class InvokeReturn { + public boolean bTrue() { + return true; + } + + public boolean bFalse() { + return false; + } + + public char cc() { + return 'c'; + } + + public short s5() { + return (short)5; + } + + public int i6() { + return 6; + } + + public long l7() { + return (long)7; + } + + public float f8() { + return (float)8.0; + } + + public double d9() { + return 9.0; + } + + public static void main(String[] args) { + try { + Object o = new InvokeReturn(); + Method m; + + // test boolean result + m = o.getClass().getDeclaredMethod("bTrue", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + + m = o.getClass().getDeclaredMethod("bFalse", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + + // test char result + m = o.getClass().getDeclaredMethod("cc", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + + // test short result + m = o.getClass().getDeclaredMethod("s5", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + + // test int result + m = o.getClass().getDeclaredMethod("i6", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + + // test long result + m = o.getClass().getDeclaredMethod("l7", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + + // test float result + m = o.getClass().getDeclaredMethod("f8", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + + // test double result + m = o.getClass().getDeclaredMethod("d9", new Class[0]); + System.out.println(m.invoke(o, new Object[0])); + } catch (UnsupportedOperationException e) { + // We get this on targets which don't support reflection (no + // libffi port yet). We might as well fake PASSes. + System.out.println("true\nfalse\nc\n5\n6\n7\n8.0\n9.0"); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/InvokeReturn.out gcc-3.1/libjava/testsuite/libjava.lang/InvokeReturn.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/InvokeReturn.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/InvokeReturn.out Sun Feb 24 06:45:19 2002 *************** *** 0 **** --- 1,8 ---- + true + false + c + 5 + 6 + 7 + 8.0 + 9.0 diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/KeepInline.java gcc-3.1/libjava/testsuite/libjava.lang/KeepInline.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/KeepInline.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/KeepInline.java Wed Aug 1 12:40:06 2001 *************** *** 0 **** --- 1,18 ---- + // Demonstrate that private methods can be reflected even if they are + // not referenced at compile-time (i.e. -fkeep-inline-functions works). + import java.lang.reflect.Method; + public class KeepInline { + private void example() { + System.out.println("example"); + } + public static void main(String[] args) { + try { + KeepInline pr = new KeepInline(); + Method[] meths = pr.getClass().getDeclaredMethods(); + for (int n = 0; n < meths.length; n++) + System.out.println(meths[n]); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/KeepInline.out gcc-3.1/libjava/testsuite/libjava.lang/KeepInline.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/KeepInline.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/KeepInline.out Mon Aug 27 13:31:06 2001 *************** *** 0 **** --- 1,2 ---- + private void KeepInline.example() + public static void KeepInline.main(java.lang.String[]) diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Matrix4f.java gcc-3.1/libjava/testsuite/libjava.lang/Matrix4f.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/Matrix4f.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/Matrix4f.java Mon Aug 13 18:06:22 2001 *************** *** 0 **** --- 1,129 ---- + /* + * Instance initializers are now turned into a new function instinit$ and called + * from the ctor. SAVE_EXPRs can't be easily shared. + * + * Contributed by Adam King + * + */ + + public class Matrix4f + { + public float m00; + public float m01; + public float m02; + public float m03; + public float m10; + public float m11; + public float m12; + public float m13; + public float m20; + public float m21; + public float m22; + public float m23; + public float m30; + public float m31; + public float m32; + public float m33; + + private float scale; + + static boolean initialized; + static Matrix4f xmat; + static Matrix4f ymat; + static Matrix4f zmat; + static Matrix4f tempMatrix1; + static Matrix4f tempMatrix2; + + { + if( !initialized ) + { + System.out.println ("not initialized"); + initialized = true; + xmat = new Matrix4f(); + ymat = new Matrix4f(); + zmat = new Matrix4f(); + tempMatrix1 = new Matrix4f(); + tempMatrix2 = new Matrix4f(); + } + else { System.out.println ("initialized"); } + + } + + public Matrix4f() + { + m00 = 1; + m01 = 0; + m02 = 0; + m03 = 0; + m10 = 0; + m11 = 1; + m12 = 0; + m13 = 0; + m20 = 0; + m21 = 0; + m22 = 1; + m23 = 0; + m30 = 0; + m31 = 0; + m32 = 0; + m33 = 1; + } + + public Matrix4f( float v[] ) + { + m00 = v[0]; + m01 = v[1]; + m02 = v[2]; + m03 = v[3]; + m10 = v[4]; + m11 = v[5]; + m12 = v[6]; + m13 = v[7]; + m20 = v[8]; + m21 = v[9]; + m22 = v[10]; + m23 = v[11]; + m30 = v[12]; + m31 = v[13]; + m32 = v[14]; + m33 = v[15]; + } + + public Matrix4f( float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33 ) + { + this.m00 = m00; + this.m01 = m01; + this.m02 = m02; + this.m03 = m03; + this.m10 = m10; + this.m11 = m11; + this.m12 = m12; + this.m13 = m13; + this.m20 = m20; + this.m21 = m21; + this.m22 = m22; + this.m23 = m23; + this.m30 = m30; + this.m31 = m31; + this.m32 = m32; + this.m33 = m33; + } + + public static void main( String[] args ) + { + System.out.println( "Test main..." ); + new Matrix4f (); + new Matrix4f (0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0); + new Matrix4f (new float [] {0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0}); + } + } + diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Matrix4f.out gcc-3.1/libjava/testsuite/libjava.lang/Matrix4f.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/Matrix4f.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/Matrix4f.out Mon Aug 13 18:06:22 2001 *************** *** 0 **** --- 1,9 ---- + Test main... + not initialized + initialized + initialized + initialized + initialized + initialized + initialized + initialized diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/N19990310_4.xfail gcc-3.1/libjava/testsuite/libjava.lang/N19990310_4.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/N19990310_4.xfail Sat Dec 16 19:02:54 2000 --- gcc-3.1/libjava/testsuite/libjava.lang/N19990310_4.xfail Thu Jan 1 00:00:00 1970 *************** *** 1 **** - xfail-output --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR3096.java gcc-3.1/libjava/testsuite/libjava.lang/PR3096.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR3096.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR3096.java Thu Oct 25 21:13:18 2001 *************** *** 0 **** --- 1,36 ---- + // This test case was built for java/3096. + + class PR3096 + { + static void foo (int x[], int i) { + ++x[i]; + } + static void foo (float x[], int i) { + ++x[i]; + } + public static void main(String [] args) { + int a[] = new int [1]; + float f[] = new float [1]; + int b[]; + int i = 0; + foo (a,0); + foo (f,0); + System.out.println (a[0]); + System.out.println (f[0]); + System.out.println ((b=a)[0]); + (b=a)[i]=99; + b[0]++; + System.out.println (a[0]+", "+b[0]); + System.out.println (++a[i]); + System.out.println (a[i]); + System.out.println (a[i]++); + System.out.println (a[i]); + String s[] = new String [1]; + String y[]; + s[0]=""; + s[0] += "Peace "; + System.out.println (s[0]); + (y=s)[0] += "now!"; + System.out.println (s[0]+", "+y[0]); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR3096.out gcc-3.1/libjava/testsuite/libjava.lang/PR3096.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR3096.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR3096.out Thu Oct 25 21:13:18 2001 *************** *** 0 **** --- 1,10 ---- + 1 + 1.0 + 1 + 100, 100 + 101 + 101 + 101 + 102 + Peace + Peace now!, Peace now! diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR3731.java gcc-3.1/libjava/testsuite/libjava.lang/PR3731.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR3731.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR3731.java Thu Jul 19 14:03:08 2001 *************** *** 0 **** --- 1,14 ---- + // Check whether "instanceof" initializes its class argument. + + public class PR3731 { + static B b; + public static void main(String[] args) { + System.out.println(b instanceof B); + } + } + + class B { + static { + System.out.println("Initialized"); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR3731.out gcc-3.1/libjava/testsuite/libjava.lang/PR3731.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR3731.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR3731.out Sun Dec 9 23:49:29 2001 *************** *** 0 **** --- 1 ---- + false diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057.java gcc-3.1/libjava/testsuite/libjava.lang/PR5057.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR5057.java Tue Dec 18 04:38:04 2001 *************** *** 0 **** --- 1,16 ---- + /* Test to make sure is generated correctly. */ + + public class PR5057 + { + public static int x; + + static + { + x = 72; + } + + public static void main (String[] args) + { + System.out.println (x); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057.out gcc-3.1/libjava/testsuite/libjava.lang/PR5057.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR5057.out Tue Dec 18 04:38:04 2001 *************** *** 0 **** --- 1 ---- + 72 diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057_2.java gcc-3.1/libjava/testsuite/libjava.lang/PR5057_2.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057_2.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR5057_2.java Tue Dec 18 04:59:18 2001 *************** *** 0 **** --- 1,19 ---- + /* Test to make sure is generated correctly. */ + + class R + { + public static int z = 23; + } + + public class PR5057_2 extends R + { + static + { + R.z = 72; + } + + public static void main (String[] args) + { + System.out.println (R.z); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057_2.out gcc-3.1/libjava/testsuite/libjava.lang/PR5057_2.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/PR5057_2.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/PR5057_2.out Tue Dec 18 04:59:18 2001 *************** *** 0 **** --- 1 ---- + 72 diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/SyncTest.java gcc-3.1/libjava/testsuite/libjava.lang/SyncTest.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/SyncTest.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/SyncTest.java Tue Jul 31 02:13:46 2001 *************** *** 0 **** --- 1,31 ---- + // Test atomic increment via synchronized blocks. + public class SyncTest implements Runnable { + static int counter; + + public void run() { + for (int n = 0; n < 1000000; n++) + synchronized (SyncTest.class) { + counter++; + } + } + + public static void main(String[] args) { + SyncTest test = new SyncTest(); + Thread[] thr = new Thread[4]; + + for (int n = 0; n < thr.length; n++) { + thr[n] = new Thread(test); + thr[n].start(); + } + + for (int n = 0; n < thr.length; n++) { + try { + thr[n].join(); + } catch (InterruptedException ex) { + } + } + + System.out.println(counter == 1000000 * thr.length ? + "ok" : "fail: " + counter); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/SyncTest.out gcc-3.1/libjava/testsuite/libjava.lang/SyncTest.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/SyncTest.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/SyncTest.out Tue Jul 31 02:13:46 2001 *************** *** 0 **** --- 1 ---- + ok diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/SyncTest.xfail gcc-3.1/libjava/testsuite/libjava.lang/SyncTest.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/SyncTest.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/SyncTest.xfail Tue Jul 31 02:13:46 2001 *************** *** 0 **** --- 1 ---- + need-threads diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/TLtest.java gcc-3.1/libjava/testsuite/libjava.lang/TLtest.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/TLtest.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/TLtest.java Wed Jul 11 00:47:37 2001 *************** *** 0 **** --- 1,60 ---- + class TLtest extends Thread { + + public static void main (String [] args) { + Data d = new Data (); + new ThreadTest (d, "A").start (); + new ThreadTest (d, "B").start (); + } + } + + class Data { + + private static ThreadLocal owner = new ThreadLocal () { + public Object initialValue () { return ("0"); } + }; + /* A thread will call `set' to set a value it wants an instance + of Data to associate with it and only it. */ + synchronized public void set (String v){owner.set (v);} + /* A thread will call `get' to get a value it wants an instance + of Data to associate with it and only it. */ + synchronized public String get (){return (String)owner.get();} + } + + class ThreadTest extends Thread { + + public Data d; + + ThreadTest (Data d, String name) { + super (name); + this.d = d; + } + + public void run () { + + int value = 0; + int ref = 0; + + for (int i = 0; i < 20; i++) { + + int rand = (int)(Math.random ()*20); + + /* Read `value', ref is kept for comparison */ + value = Integer.parseInt (d.get()); + + /* change `value' and ref by a random number, store `value'. */ + value += rand; ref += rand; + d.set (Integer.toString (value)); + + try { + sleep((int)(Math.random() * 500)); + } catch (InterruptedException e) {} + } + + /* If a thread didn't have private value to attach to the + instance of Data, results wouldn't be the same */ + if (ref == value) + System.out.println ("test OK."); + else + System.out.println ("test failed."); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/TLtest.out gcc-3.1/libjava/testsuite/libjava.lang/TLtest.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/TLtest.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/TLtest.out Wed Jul 11 00:47:37 2001 *************** *** 0 **** --- 1,2 ---- + test OK. + test OK. diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/TLtest.xfail gcc-3.1/libjava/testsuite/libjava.lang/TLtest.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/TLtest.xfail Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/TLtest.xfail Fri Nov 2 06:50:33 2001 *************** *** 0 **** --- 1 ---- + need-threads diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Thread_Interrupt.java gcc-3.1/libjava/testsuite/libjava.lang/Thread_Interrupt.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/Thread_Interrupt.java Thu Mar 23 12:35:44 2000 --- gcc-3.1/libjava/testsuite/libjava.lang/Thread_Interrupt.java Fri Mar 22 11:19:49 2002 *************** class Sleeper extends Thread *** 44,55 **** class Looper extends Thread { public void run() { System.out.println ("Busy waiting"); int count = 0; ! for (int i=0; i < 1000000; i++) { Thread.yield(); count += 5; --- 44,76 ---- class Looper extends Thread { + // Return the number of Thread.yield()s we can do in 500ms. + static long calibrate () + { + long i = 1; + + for (int tries = 0; tries < 40; tries++) + { + long t = System.currentTimeMillis(); + for (long n = 0; n < i; n++) + Thread.yield(); + long t_prime = System.currentTimeMillis(); + if (t_prime - t > 500) + return i; + i *= 2; + } + // We have no system clock. Give up. + throw new RuntimeException ("We have no system clock."); + } + + static long yields = calibrate (); + public void run() { System.out.println ("Busy waiting"); int count = 0; ! for (long i=0; i < yields; i++) { Thread.yield(); count += 5; diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Thread_Wait.java gcc-3.1/libjava/testsuite/libjava.lang/Thread_Wait.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/Thread_Wait.java Thu Mar 23 12:35:44 2000 --- gcc-3.1/libjava/testsuite/libjava.lang/Thread_Wait.java Wed Oct 31 00:48:17 2001 *************** public class Thread_Wait implements Runn *** 20,26 **** } catch (Exception x) { ! System.out.println("exception occured: " + x); } synchronized (this) --- 20,26 ---- } catch (Exception x) { ! System.out.println("exception occurred: " + x); } synchronized (this) *************** public class Thread_Wait implements Runn *** 41,47 **** } catch (Exception x) { ! System.out.println("exception occured: " + x); } } System.out.println ("thread notified okay"); --- 41,47 ---- } catch (Exception x) { ! System.out.println("exception occurred: " + x); } } System.out.println ("thread notified okay"); diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/Throw_2.java gcc-3.1/libjava/testsuite/libjava.lang/Throw_2.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/Throw_2.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/Throw_2.java Thu Mar 28 16:21:56 2002 *************** *** 0 **** --- 1,57 ---- + // Check that NullPointerExceptions thrown from library code are + // caught. This detects a number of failures that can be caused by + // libgcj being built incorrectly. In particular, we ensure that a + // SEGV in native (i.e. C++) code in libgcj is handled correctly. + + // Regrettably, we cannot guarantee that Double.parseDouble() will + // always be native code, or that it will never be inlined. It could + // be argued that we should add a method to libgcj that will be + // guaranteed forever to be native, but I'm reluctant to add to the + // library for the sole purpose of performing this test. + + public class Throw_2 + { + public static Throwable obj() + { + return null; + } + + public static String str() + { + return null; + } + + static double d; + + public static void main (String[] args) + { + // This NullPointerException will, at the time of writing, be + // thrown from Java code in libgcj. + try + { + java.util.Vector v = new java.util.Vector (null); + System.out.println ("fail: no exception thrown"); + } + catch (NullPointerException _) + { + } + catch (Throwable _) + { + System.out.println ("fail: " + _); + } + // This one will, at the time of writing, be thrown from C++ + // code in libgcj. + try + { + d = Double.parseDouble(str()); + System.out.println ("fail: no exception thrown"); + } + catch (NullPointerException _) + { + } + catch (Throwable _) + { + System.out.println ("fail: " + _); + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.java gcc-3.1/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.java Fri Jul 13 19:45:05 2001 *************** *** 0 **** --- 1,38 ---- + /* From java/3285, By p.thio@valescom.com */ + + interface I + { + void print (); + }; + + class C1 + implements I + { + public void print () { System.out.println ("C1: Message"); } + } + + abstract + class C2 + { + C2(I i) + { + i.print (); + } + abstract void h(); + } + + public + class anon_ctor_itf_arg + { + public static + void main(String argv[]) + { + C1 c1 = new C1(); + new C2(c1) + { + void h() + { + } + }; + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.out gcc-3.1/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/anon_ctor_itf_arg.out Fri Jul 13 19:45:05 2001 *************** *** 0 **** --- 1 ---- + C1: Message diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/err7.xfail gcc-3.1/libjava/testsuite/libjava.lang/err7.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/err7.xfail Sat Dec 16 05:59:45 2000 --- gcc-3.1/libjava/testsuite/libjava.lang/err7.xfail Thu Jan 1 00:00:00 1970 *************** *** 1 **** - xfail-byte --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/err8.xfail gcc-3.1/libjava/testsuite/libjava.lang/err8.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/err8.xfail Sat Dec 16 05:59:45 2000 --- gcc-3.1/libjava/testsuite/libjava.lang/err8.xfail Thu Jan 1 00:00:00 1970 *************** *** 1 **** - xfail-byte --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/invoke_from_inner.java gcc-3.1/libjava/testsuite/libjava.lang/invoke_from_inner.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/invoke_from_inner.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/invoke_from_inner.java Fri Jul 13 19:45:05 2001 *************** *** 0 **** --- 1,37 ---- + // This test case once showed that `f[0].execute(x)' woudln't be + // expanded properly, attempting to retrieve this$0 to be used in + // place of `f[0]'. + + abstract class A { + abstract public void execute(C x); + } + + class C {} + + class Z extends A { + public void execute (C x) { + System.out.println ("Z.execute"); + } + } + + public class invoke_from_inner extends A { + + Z f[] = new Z[1]; + class D extends C { + D (C x) { + f[0].execute (x); + execute (x); + } + } + public void execute (C x) { + System.out.println ("invoke_from_inner.execute"); + } + + public static void main (String a[]) { + new invoke_from_inner().foo(); + } + void foo () { + f[0] = new Z(); + new D(new C()); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/invoke_from_inner.out gcc-3.1/libjava/testsuite/libjava.lang/invoke_from_inner.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/invoke_from_inner.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/invoke_from_inner.out Fri Jul 13 19:45:05 2001 *************** *** 0 **** --- 1,2 ---- + Z.execute + invoke_from_inner.execute diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/invokethrow.java gcc-3.1/libjava/testsuite/libjava.lang/invokethrow.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/invokethrow.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/invokethrow.java Sat Jun 2 09:18:14 2001 *************** *** 0 **** --- 1,35 ---- + // Test a `throw' across a libffi call. + + import java.lang.reflect.*; + + public class invokethrow + { + public static void doit () throws Throwable + { + throw new Throwable ("hi!"); + } + + public static void main (String[] args) + { + Class k = invokethrow.class; + try + { + Class[] noargs = new Class[0]; + Method m = k.getMethod ("doit", noargs); + m.invoke (null, null); + } + catch (InvocationTargetException x1) + { + System.out.println (x1.getTargetException ().getMessage ()); + } + catch (UnsupportedOperationException _) + { + // Some systems don't support invocation, in which case we + // will fake a passing result. + System.out.println ("hi!"); + } + catch (Throwable _) + { + } + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/invokethrow.out gcc-3.1/libjava/testsuite/libjava.lang/invokethrow.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/invokethrow.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/invokethrow.out Wed May 30 15:23:23 2001 *************** *** 0 **** --- 1 ---- + hi! diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/negzero.java gcc-3.1/libjava/testsuite/libjava.lang/negzero.java *** gcc-3.0.4/libjava/testsuite/libjava.lang/negzero.java Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/negzero.java Wed Apr 17 16:40:32 2002 *************** *** 0 **** --- 1,8 ---- + public class negzero + { + public static void main(String[] args) + { + System.out.println(-0.0); + System.out.println(-0.0f); + } + } diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/negzero.out gcc-3.1/libjava/testsuite/libjava.lang/negzero.out *** gcc-3.0.4/libjava/testsuite/libjava.lang/negzero.out Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/testsuite/libjava.lang/negzero.out Wed Apr 17 16:40:32 2002 *************** *** 0 **** --- 1,2 ---- + -0.0 + -0.0 diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/stringconst.xfail gcc-3.1/libjava/testsuite/libjava.lang/stringconst.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/stringconst.xfail Sat Dec 16 19:02:54 2000 --- gcc-3.1/libjava/testsuite/libjava.lang/stringconst.xfail Wed Feb 20 04:18:54 2002 *************** *** 1 **** ! xfail-output --- 1 ---- ! xfail-source-output diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.lang/stub.xfail gcc-3.1/libjava/testsuite/libjava.lang/stub.xfail *** gcc-3.0.4/libjava/testsuite/libjava.lang/stub.xfail Sat Dec 16 19:02:54 2000 --- gcc-3.1/libjava/testsuite/libjava.lang/stub.xfail Thu Jan 1 00:00:00 1970 *************** *** 1,3 **** - xfail-byte - xfail-gcj - xfail-gcjC --- 0 ---- diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.mauve/mauve.exp gcc-3.1/libjava/testsuite/libjava.mauve/mauve.exp *** gcc-3.0.4/libjava/testsuite/libjava.mauve/mauve.exp Thu Feb 8 12:04:57 2001 --- gcc-3.1/libjava/testsuite/libjava.mauve/mauve.exp Sun Apr 7 09:22:00 2002 *************** *** 1,4 **** ! # Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation. # Written by Tom Tromey . # Incorporate Mauve into libjava's DejaGNU test suite framework. --- 1,4 ---- ! # Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation. # Written by Tom Tromey . # Incorporate Mauve into libjava's DejaGNU test suite framework. *************** proc mauve_compute_uses {aName} { *** 52,64 **** return [lsort [array names uses]] } ! # Run all the Mauve tests. proc test_mauve {} { global srcdir objdir subdir env if {! [info exists env(MAUVEDIR)]} then { verbose "MAUVEDIR not set; not running Mauve tests" ! return } # Run in subdir so we don't overwrite our own Makefile. --- 52,65 ---- return [lsort [array names uses]] } ! # Run all the Mauve tests. Return 1 on success, 0 on any failure. If ! # the tests are skipped, that is treated like success. proc test_mauve {} { global srcdir objdir subdir env if {! [info exists env(MAUVEDIR)]} then { verbose "MAUVEDIR not set; not running Mauve tests" ! return 1 } # Run in subdir so we don't overwrite our own Makefile. *************** proc test_mauve {} { *** 88,101 **** # Append -B and -I so that libgcj.spec and libgcj.zip are found # before they're installed. ! set env(GCJ) "$GCJ_UNDER_TEST -B$objdir/../ -I$objdir/../libgcj.zip" if {[catch { ! system "$env(MAUVEDIR)/configure --with-gcj 2>@ stdout" } msg]} then { fail "Mauve configure" verbose "configure failed with $msg" ! return } pass "Mauve configure" --- 89,102 ---- # Append -B and -I so that libgcj.spec and libgcj.zip are found # before they're installed. ! set env(GCJ) "$GCJ_UNDER_TEST -B$objdir/../ -I$objdir/../libgcj.jar" if {[catch { ! system "$env(MAUVEDIR)/configure --with-gcj 2>&1" } msg]} then { fail "Mauve configure" verbose "configure failed with $msg" ! return 0 } pass "Mauve configure" *************** proc test_mauve {} { *** 114,127 **** } msg]} then { fail "Mauve build" verbose "build failed with $msg" ! return } pass "Mauve build" set srcfile $full_srcdir/$subdir/DejaGNUTestHarness.java if {! [bytecompile_file $srcfile [pwd] $env(MAUVEDIR):[pwd]]} then { fail "Compile DejaGNUTestHarness.java" ! return } pass "Compile DejaGNUTestHarness.java" --- 115,128 ---- } msg]} then { fail "Mauve build" verbose "build failed with $msg" ! return 0 } pass "Mauve build" set srcfile $full_srcdir/$subdir/DejaGNUTestHarness.java if {! [bytecompile_file $srcfile [pwd] $env(MAUVEDIR):[pwd]]} then { fail "Compile DejaGNUTestHarness.java" ! return 0 } pass "Compile DejaGNUTestHarness.java" *************** proc test_mauve {} { *** 149,157 **** lappend objlist $obj } if {! $ok} then { ! return } set Executable DejaGNUTestHarness foreach file $choices { # Turn `java/lang/Foo.java' into `java.lang.Foo'. --- 150,159 ---- lappend objlist $obj } if {! $ok} then { ! return 0 } + set proc_ok 1 set Executable DejaGNUTestHarness foreach file $choices { # Turn `java/lang/Foo.java' into `java.lang.Foo'. *************** proc test_mauve {} { *** 174,185 **** --- 176,189 ---- } } if {! $ok} then { + set proc_ok 0 continue } set x [prune_warnings [target_compile [concat $uses($file) $objlist] \ $Executable executable $link_args]] if {$x != ""} then { + set proc_ok 0 fail "Link for $class" continue } *************** proc test_mauve {} { *** 197,219 **** if {$what == "PASS" || $what == "XPASS"} then { pass $msg } else { fail $msg } } } } } # Run all the Mauve tests in a sim environment. In this case, the # program cannot use argv[] because there's no way to pass in the # command line, so tha name of the class to test is substituted by ! # patching the source of the DejaGNUTestHarness. proc test_mauve_sim {} { global srcdir subdir env if {! [info exists env(MAUVEDIR)]} then { verbose "MAUVEDIR not set; not running Mauve tests" ! return } # Run in subdir so we don't overwrite our own Makefile. --- 201,228 ---- if {$what == "PASS" || $what == "XPASS"} then { pass $msg } else { + set proc_ok 0 fail $msg } } } } + + return $proc_ok } # Run all the Mauve tests in a sim environment. In this case, the # program cannot use argv[] because there's no way to pass in the # command line, so tha name of the class to test is substituted by ! # patching the source of the DejaGNUTestHarness. Return 1 on success, ! # 0 on any failure. If the tests are skipped, that is treated like ! # success. proc test_mauve_sim {} { global srcdir subdir env if {! [info exists env(MAUVEDIR)]} then { verbose "MAUVEDIR not set; not running Mauve tests" ! return 1 } # Run in subdir so we don't overwrite our own Makefile. *************** proc test_mauve_sim {} { *** 230,236 **** } msg]} then { fail "Mauve configure" verbose "configure failed with $msg" ! return } pass "Mauve configure" --- 239,245 ---- } msg]} then { fail "Mauve configure" verbose "configure failed with $msg" ! return 0 } pass "Mauve configure" *************** proc test_mauve_sim {} { *** 249,255 **** } msg]} then { fail "Mauve build" verbose "build failed with $msg" ! return } pass "Mauve build" --- 258,264 ---- } msg]} then { fail "Mauve build" verbose "build failed with $msg" ! return 0 } pass "Mauve build" *************** proc test_mauve_sim {} { *** 279,289 **** lappend objlist $obj } if {! $ok} then { ! return } lappend objlist gnu/testlet/DejaGNUTestHarness.o set Executable DejaGNUTestHarness foreach file $choices { # Turn `java/lang/Foo.java' into `java.lang.Foo'. --- 288,299 ---- lappend objlist $obj } if {! $ok} then { ! return 0 } lappend objlist gnu/testlet/DejaGNUTestHarness.o + set proc_ok 1 set Executable DejaGNUTestHarness foreach file $choices { # Turn `java/lang/Foo.java' into `java.lang.Foo'. *************** proc test_mauve_sim {} { *** 307,312 **** --- 317,323 ---- } } if {! $ok} then { + set proc_ok 0 continue } *************** proc test_mauve_sim {} { *** 328,334 **** if {! [bytecompile_file [pwd]/gnu/testlet/$srcfile [pwd]/gnu/testlet \ $env(MAUVEDIR):[pwd]]} then { fail "Compile DejaGNUTestHarness.java" ! return } set x [prune_warnings \ --- 339,345 ---- if {! [bytecompile_file [pwd]/gnu/testlet/$srcfile [pwd]/gnu/testlet \ $env(MAUVEDIR):[pwd]]} then { fail "Compile DejaGNUTestHarness.java" ! return 0 } set x [prune_warnings \ *************** proc test_mauve_sim {} { *** 336,347 **** gnu/testlet/DejaGNUTestHarness.o object $compile_args]] if {$x != ""} then { fail "Compile DejaGNUTestHarness.java" continue ! } set x [prune_warnings [target_compile [concat $uses($file) $objlist] \ $Executable executable $link_args]] if {$x != ""} then { fail "Link for $class" continue } --- 347,360 ---- gnu/testlet/DejaGNUTestHarness.o object $compile_args]] if {$x != ""} then { fail "Compile DejaGNUTestHarness.java" + set proc_ok 0 continue ! } set x [prune_warnings [target_compile [concat $uses($file) $objlist] \ $Executable executable $link_args]] if {$x != ""} then { + set proc_ok 0 fail "Link for $class" continue } *************** proc test_mauve_sim {} { *** 359,377 **** if {$what == "PASS" || $what == "XPASS"} then { pass $msg } else { fail $msg } } } } } ! # The test_mauve* procs will change the current directory. It's ! # simpler to fix this up here than to keep track of this in the procs. ! set here [pwd] ! if { [board_info target exists is_simulator] } { ! test_mauve_sim ! } else { ! test_mauve } ! cd $here --- 372,404 ---- if {$what == "PASS" || $what == "XPASS"} then { pass $msg } else { + set proc_ok 0 fail $msg } } } } + + return $proc_ok } ! proc gcj_run_mauve_tests {} { ! # The test_mauve* procs will change the current directory. It's ! # simpler to fix this up here than to keep track of this in the ! # procs. ! set here [pwd] ! if { [board_info target exists is_simulator] } { ! set r [test_mauve_sim] ! } else { ! set r [test_mauve] ! } ! cd $here ! ! if {$r} { ! # No need to keep the build around. FIXME: this knows how the ! # tests work. This whole file could use a rewrite. ! system "rm -rf mauve-build" ! } } ! ! gcj_run_mauve_tests diff -Nrc3pad gcc-3.0.4/libjava/testsuite/libjava.mauve/xfails gcc-3.1/libjava/testsuite/libjava.mauve/xfails *** gcc-3.0.4/libjava/testsuite/libjava.mauve/xfails Thu Feb 8 12:04:57 2001 --- gcc-3.1/libjava/testsuite/libjava.mauve/xfails Sun Apr 21 12:35:22 2002 *************** *** 1,5 **** ! FAIL: gnu.testlet.java.lang.Double.DoubleTest: Error: test_shortbyteValue failed - 5 (number 1) ! FAIL: gnu.testlet.java.lang.Float.FloatTest: Error: test_shortbyteValue failed - 5 (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Four Byte Range Error (0) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Four Byte Range Error (1) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Five Bytes (0) (number 1) --- 1,24 ---- ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 1) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 2) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 4) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 9) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 10) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 12) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 13) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 14) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 15) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 16) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 17) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 19) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 21) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 22) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 24) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 25) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 27) ! FAIL: gnu.testlet.java.beans.Introspector.jdk11: getBeanInfo (number 28) ! FAIL: gnu.testlet.java.io.BufferedByteOutputStream.interrupt: single-byte writes (number 3) ! FAIL: gnu.testlet.java.io.BufferedByteOutputStream.interrupt: single-byte writes (number 4) ! FAIL: gnu.testlet.java.io.PipedStream.close (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Four Byte Range Error (0) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Four Byte Range Error (1) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Five Bytes (0) (number 1) *************** FAIL: gnu.testlet.java.io.Utf8Encoding.m *** 9,25 **** FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Orphan Continuation (1) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Orphan Continuation (2) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Four Byte Range Error (2) (number 1) ! FAIL: gnu.testlet.java.io.ObjectStreamClass.Test: getSerialVersionUID (number 7) FAIL: gnu.testlet.java.text.DateFormatSymbols.Test: patterns (number 2) FAIL: gnu.testlet.java.text.SimpleDateFormat.Test: equals() (number 1) FAIL: gnu.testlet.java.text.SimpleDateFormat.Test: parse() strict (number 1) FAIL: gnu.testlet.java.text.SimpleDateFormat.getAndSet2DigitYearStart: get2DigitYearStart() initial (number 1) FAIL: gnu.testlet.java.net.ServerSocket.ServerSocketTest: Error : test_params failed - 5getInetAddress did not return proper values (number 1) FAIL: gnu.testlet.java.net.Socket.SocketTest: Error : test_BasicServer failed - 11 exception was thrown :Illegal seek (number 1) FAIL: gnu.testlet.java.net.URLConnection.URLConnectionTest: Error in test_Basics - 2 should not have raised Throwable here (number 1) FAIL: gnu.testlet.java.net.URL.URLTest: openStream (number 1) FAIL: gnu.testlet.java.net.URL.URLTest: sameFile (number 2) FAIL: gnu.testlet.java.net.URL.URLTest: Error in test_toString - 5 exception should not be thrown here (number 1) FAIL: gnu.testlet.java.net.URL.URLTest: new URL(protocol, host, file) (number 26) FAIL: gnu.testlet.java.net.URL.URLTest: new URL(protocol, host, file) (number 54) FAIL: gnu.testlet.java.net.MulticastSocket.MulticastSocketTest: joinGroup() twice. (number 1) --- 28,71 ---- FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Orphan Continuation (1) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Orphan Continuation (2) (number 1) FAIL: gnu.testlet.java.io.Utf8Encoding.mojo: Four Byte Range Error (2) (number 1) ! FAIL: gnu.testlet.java.lang.Character.classify12 (number 1) ! FAIL: gnu.testlet.java.lang.Character.getType (number 11) ! FAIL: gnu.testlet.java.lang.Character.getType (number 20) ! FAIL: gnu.testlet.java.lang.Character.getType (number 22) ! FAIL: gnu.testlet.java.lang.Class.ClassTest: Error: test_getClassLoader failed - 1 (number 1) ! FAIL: gnu.testlet.java.lang.Class.ClassTest: Error: test_getClassLoader failed - 2 (number 1) ! FAIL: gnu.testlet.java.lang.Double.DoubleTest: Error: test_intValue returned wrong results CYGNUS: Float to int conversions - 1 (number 1) ! FAIL: gnu.testlet.java.lang.Double.DoubleTest: Error: test_longValue returned wrong results CYGNUS: Float to int conversions - 1 (number 1) ! FAIL: gnu.testlet.java.lang.Float.FloatTest: Error: test_intValue returned wrong results - 1 (number 1) ! FAIL: gnu.testlet.java.lang.String.CASE_INSENSITIVE_ORDER: unicode mappings (number 1) ! FAIL: gnu.testlet.java.lang.String.CASE_INSENSITIVE_ORDER: unicode mappings (number 2) ! FAIL: gnu.testlet.java.lang.System.getProperty: '' (number 1) ! FAIL: gnu.testlet.java.text.AttributedString.Test: Attribute key count (number 1) FAIL: gnu.testlet.java.text.DateFormatSymbols.Test: patterns (number 2) FAIL: gnu.testlet.java.text.SimpleDateFormat.Test: equals() (number 1) FAIL: gnu.testlet.java.text.SimpleDateFormat.Test: parse() strict (number 1) FAIL: gnu.testlet.java.text.SimpleDateFormat.getAndSet2DigitYearStart: get2DigitYearStart() initial (number 1) + FAIL: gnu.testlet.java.text.SimpleDateFormat.regress: CDT (number 1) + FAIL: gnu.testlet.java.text.SimpleDateFormat.regress: EDT (number 1) + FAIL: gnu.testlet.java.text.SimpleDateFormat.regress: EST (number 1) + FAIL: gnu.testlet.java.text.SimpleDateFormat.regress: PDT (number 1) + FAIL: gnu.testlet.java.text.DateFormatSymbols.Test: invalid locale (number 1) FAIL: gnu.testlet.java.net.ServerSocket.ServerSocketTest: Error : test_params failed - 5getInetAddress did not return proper values (number 1) FAIL: gnu.testlet.java.net.Socket.SocketTest: Error : test_BasicServer failed - 11 exception was thrown :Illegal seek (number 1) FAIL: gnu.testlet.java.net.URLConnection.URLConnectionTest: Error in test_Basics - 2 should not have raised Throwable here (number 1) + FAIL: gnu.testlet.java.net.URLConnection.URLConnectionTest: Error in test_getHeaderField - 2 4 header field wrong (number 1) FAIL: gnu.testlet.java.net.URL.URLTest: openStream (number 1) FAIL: gnu.testlet.java.net.URL.URLTest: sameFile (number 2) FAIL: gnu.testlet.java.net.URL.URLTest: Error in test_toString - 5 exception should not be thrown here (number 1) + FAIL: gnu.testlet.java.net.URL.URLTest: new URL(string) (number 16) + FAIL: gnu.testlet.java.net.URL.URLTest: new URL(string) (number 18) FAIL: gnu.testlet.java.net.URL.URLTest: new URL(protocol, host, file) (number 26) FAIL: gnu.testlet.java.net.URL.URLTest: new URL(protocol, host, file) (number 54) FAIL: gnu.testlet.java.net.MulticastSocket.MulticastSocketTest: joinGroup() twice. (number 1) + FAIL: gnu.testlet.java.util.Properties.AcuniaPropertiesTest: should throw NullPointerException -- 1 (number 1) + FAIL: gnu.testlet.java.util.Properties.AcuniaPropertiesTest: v does not contain:$longvalue=I'mtryingtogiveavaluelongerthen40characters$ (number 1) + FAIL: gnu.testlet.java.util.Properties.AcuniaPropertiesTest: should throw NullPointerException -- 1 (number 1) + FAIL: gnu.testlet.java.util.Properties.AcuniaPropertiesTest: all elements are the same (number 1) + FAIL: gnu.testlet.java.util.Properties.AcuniaPropertiesTest: checkvalue -- got:$ents=$ (number 1) + FAIL: gnu.testlet.java.util.Properties.AcuniaPropertiesTest: checkvalue -- got:$dog=nocat $ (number 1) + FAIL: gnu.testlet.java.util.Properties.AcuniaPropertiesTest: check if all elements were found -- got: [dog=no\cat ] (number 1) diff -Nrc3pad gcc-3.0.4/libjava/verify.cc gcc-3.1/libjava/verify.cc *** gcc-3.0.4/libjava/verify.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/verify.cc Sun Mar 10 04:50:55 2002 *************** *** 0 **** --- 1,3088 ---- + // defineclass.cc - defining a class from .class format. + + /* Copyright (C) 2001, 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + // Written by Tom Tromey + + // Define VERIFY_DEBUG to enable debugging output. + + #include + + #include + #include + #include + #include + + #ifdef INTERPRETER + + #include + #include + #include + #include + #include + + #ifdef VERIFY_DEBUG + #include + #endif /* VERIFY_DEBUG */ + + + static void debug_print (const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + + static inline void + debug_print (const char *fmt, ...) + { + #ifdef VERIFY_DEBUG + va_list ap; + va_start (ap, fmt); + vfprintf (stderr, fmt, ap); + va_end (ap); + #endif /* VERIFY_DEBUG */ + } + + class _Jv_BytecodeVerifier + { + private: + + static const int FLAG_INSN_START = 1; + static const int FLAG_BRANCH_TARGET = 2; + + struct state; + struct type; + struct subr_info; + struct subr_entry_info; + struct linked_utf8; + + // The current PC. + int PC; + // The PC corresponding to the start of the current instruction. + int start_PC; + + // The current state of the stack, locals, etc. + state *current_state; + + // We store the state at branch targets, for merging. This holds + // such states. + state **states; + + // We keep a linked list of all the PCs which we must reverify. + // The link is done using the PC values. This is the head of the + // list. + int next_verify_pc; + + // We keep some flags for each instruction. The values are the + // FLAG_* constants defined above. + char *flags; + + // We need to keep track of which instructions can call a given + // subroutine. FIXME: this is inefficient. We keep a linked list + // of all calling `jsr's at at each jsr target. + subr_info **jsr_ptrs; + + // We keep a linked list of entries which map each `ret' instruction + // to its unique subroutine entry point. We expect that there won't + // be many `ret' instructions, so a linked list is ok. + subr_entry_info *entry_points; + + // The bytecode itself. + unsigned char *bytecode; + // The exceptions. + _Jv_InterpException *exception; + + // Defining class. + jclass current_class; + // This method. + _Jv_InterpMethod *current_method; + + // A linked list of utf8 objects we allocate. This is really ugly, + // but without this our utf8 objects would be collected. + linked_utf8 *utf8_list; + + struct linked_utf8 + { + _Jv_Utf8Const *val; + linked_utf8 *next; + }; + + _Jv_Utf8Const *make_utf8_const (char *s, int len) + { + _Jv_Utf8Const *val = _Jv_makeUtf8Const (s, len); + _Jv_Utf8Const *r = (_Jv_Utf8Const *) _Jv_Malloc (sizeof (_Jv_Utf8Const) + + val->length + + 1); + r->length = val->length; + r->hash = val->hash; + memcpy (r->data, val->data, val->length + 1); + + linked_utf8 *lu = (linked_utf8 *) _Jv_Malloc (sizeof (linked_utf8)); + lu->val = r; + lu->next = utf8_list; + utf8_list = lu; + + return r; + } + + // This enum holds a list of tags for all the different types we + // need to handle. Reference types are treated specially by the + // type class. + enum type_val + { + void_type, + + // The values for primitive types are chosen to correspond to values + // specified to newarray. + boolean_type = 4, + char_type = 5, + float_type = 6, + double_type = 7, + byte_type = 8, + short_type = 9, + int_type = 10, + long_type = 11, + + // Used when overwriting second word of a double or long in the + // local variables. Also used after merging local variable states + // to indicate an unusable value. + unsuitable_type, + return_address_type, + continuation_type, + + // There is an obscure special case which requires us to note when + // a local variable has not been used by a subroutine. See + // push_jump_merge for more information. + unused_by_subroutine_type, + + // Everything after `reference_type' must be a reference type. + reference_type, + null_type, + unresolved_reference_type, + uninitialized_reference_type, + uninitialized_unresolved_reference_type + }; + + // Return the type_val corresponding to a primitive signature + // character. For instance `I' returns `int.class'. + type_val get_type_val_for_signature (jchar sig) + { + type_val rt; + switch (sig) + { + case 'Z': + rt = boolean_type; + break; + case 'B': + rt = byte_type; + break; + case 'C': + rt = char_type; + break; + case 'S': + rt = short_type; + break; + case 'I': + rt = int_type; + break; + case 'J': + rt = long_type; + break; + case 'F': + rt = float_type; + break; + case 'D': + rt = double_type; + break; + case 'V': + rt = void_type; + break; + default: + verify_fail ("invalid signature"); + } + return rt; + } + + // Return the type_val corresponding to a primitive class. + type_val get_type_val_for_signature (jclass k) + { + return get_type_val_for_signature ((jchar) k->method_count); + } + + // This is like _Jv_IsAssignableFrom, but it works even if SOURCE or + // TARGET haven't been prepared. + static bool is_assignable_from_slow (jclass target, jclass source) + { + // This will terminate when SOURCE==Object. + while (true) + { + if (source == target) + return true; + + if (target->isPrimitive () || source->isPrimitive ()) + return false; + + if (target->isArray ()) + { + if (! source->isArray ()) + return false; + target = target->getComponentType (); + source = source->getComponentType (); + } + else if (target->isInterface ()) + { + for (int i = 0; i < source->interface_count; ++i) + { + // We use a recursive call because we also need to + // check superinterfaces. + if (is_assignable_from_slow (target, source->interfaces[i])) + return true; + } + source = source->getSuperclass (); + if (source == NULL) + return false; + } + // We must do this check before we check to see if SOURCE is + // an interface. This way we know that any interface is + // assignable to an Object. + else if (target == &java::lang::Object::class$) + return true; + else if (source->isInterface ()) + { + for (int i = 0; i < target->interface_count; ++i) + { + // We use a recursive call because we also need to + // check superinterfaces. + if (is_assignable_from_slow (target->interfaces[i], source)) + return true; + } + target = target->getSuperclass (); + if (target == NULL) + return false; + } + else if (source == &java::lang::Object::class$) + return false; + else + source = source->getSuperclass (); + } + } + + // This is used to keep track of which `jsr's correspond to a given + // jsr target. + struct subr_info + { + // PC of the instruction just after the jsr. + int pc; + // Link. + subr_info *next; + }; + + // This is used to keep track of which subroutine entry point + // corresponds to which `ret' instruction. + struct subr_entry_info + { + // PC of the subroutine entry point. + int pc; + // PC of the `ret' instruction. + int ret_pc; + // Link. + subr_entry_info *next; + }; + + // The `type' class is used to represent a single type in the + // verifier. + struct type + { + // The type. + type_val key; + // Some associated data. + union + { + // For a resolved reference type, this is a pointer to the class. + jclass klass; + // For other reference types, this it the name of the class. + _Jv_Utf8Const *name; + } data; + // This is used when constructing a new object. It is the PC of the + // `new' instruction which created the object. We use the special + // value -2 to mean that this is uninitialized, and the special + // value -1 for the case where the current method is itself the + // method. + int pc; + + static const int UNINIT = -2; + static const int SELF = -1; + + // Basic constructor. + type () + { + key = unsuitable_type; + data.klass = NULL; + pc = UNINIT; + } + + // Make a new instance given the type tag. We assume a generic + // `reference_type' means Object. + type (type_val k) + { + key = k; + data.klass = NULL; + if (key == reference_type) + data.klass = &java::lang::Object::class$; + pc = UNINIT; + } + + // Make a new instance given a class. + type (jclass klass) + { + key = reference_type; + data.klass = klass; + pc = UNINIT; + } + + // Make a new instance given the name of a class. + type (_Jv_Utf8Const *n) + { + key = unresolved_reference_type; + data.name = n; + pc = UNINIT; + } + + // Copy constructor. + type (const type &t) + { + key = t.key; + data = t.data; + pc = t.pc; + } + + // These operators are required because libgcj can't link in + // -lstdc++. + void *operator new[] (size_t bytes) + { + return _Jv_Malloc (bytes); + } + + void operator delete[] (void *mem) + { + _Jv_Free (mem); + } + + type& operator= (type_val k) + { + key = k; + data.klass = NULL; + pc = UNINIT; + return *this; + } + + type& operator= (const type& t) + { + key = t.key; + data = t.data; + pc = t.pc; + return *this; + } + + // Promote a numeric type. + type &promote () + { + if (key == boolean_type || key == char_type + || key == byte_type || key == short_type) + key = int_type; + return *this; + } + + // If *THIS is an unresolved reference type, resolve it. + void resolve (_Jv_BytecodeVerifier *verifier) + { + if (key != unresolved_reference_type + && key != uninitialized_unresolved_reference_type) + return; + + using namespace java::lang; + java::lang::ClassLoader *loader + = verifier->current_class->getClassLoader(); + // We might see either kind of name. Sigh. + if (data.name->data[0] == 'L' + && data.name->data[data.name->length - 1] == ';') + data.klass = _Jv_FindClassFromSignature (data.name->data, loader); + else + data.klass = Class::forName (_Jv_NewStringUtf8Const (data.name), + false, loader); + key = (key == unresolved_reference_type + ? reference_type + : uninitialized_reference_type); + } + + // Mark this type as the uninitialized result of `new'. + void set_uninitialized (int npc, _Jv_BytecodeVerifier *verifier) + { + if (key == reference_type) + key = uninitialized_reference_type; + else if (key == unresolved_reference_type) + key = uninitialized_unresolved_reference_type; + else + verifier->verify_fail ("internal error in type::uninitialized"); + pc = npc; + } + + // Mark this type as now initialized. + void set_initialized (int npc) + { + if (npc != UNINIT && pc == npc + && (key == uninitialized_reference_type + || key == uninitialized_unresolved_reference_type)) + { + key = (key == uninitialized_reference_type + ? reference_type + : unresolved_reference_type); + pc = UNINIT; + } + } + + + // Return true if an object of type K can be assigned to a variable + // of type *THIS. Handle various special cases too. Might modify + // *THIS or K. Note however that this does not perform numeric + // promotion. + bool compatible (type &k, _Jv_BytecodeVerifier *verifier) + { + // Any type is compatible with the unsuitable type. + if (key == unsuitable_type) + return true; + + if (key < reference_type || k.key < reference_type) + return key == k.key; + + // The `null' type is convertible to any reference type. + // FIXME: is this correct for THIS? + if (key == null_type || k.key == null_type) + return true; + + // Any reference type is convertible to Object. This is a special + // case so we don't need to unnecessarily resolve a class. + if (key == reference_type + && data.klass == &java::lang::Object::class$) + return true; + + // An initialized type and an uninitialized type are not + // compatible. + if (isinitialized () != k.isinitialized ()) + return false; + + // Two uninitialized objects are compatible if either: + // * The PCs are identical, or + // * One PC is UNINIT. + if (! isinitialized ()) + { + if (pc != k.pc && pc != UNINIT && k.pc != UNINIT) + return false; + } + + // Two unresolved types are equal if their names are the same. + if (! isresolved () + && ! k.isresolved () + && _Jv_equalUtf8Consts (data.name, k.data.name)) + return true; + + // We must resolve both types and check assignability. + resolve (verifier); + k.resolve (verifier); + return is_assignable_from_slow (data.klass, k.data.klass); + } + + bool isvoid () const + { + return key == void_type; + } + + bool iswide () const + { + return key == long_type || key == double_type; + } + + // Return number of stack or local variable slots taken by this + // type. + int depth () const + { + return iswide () ? 2 : 1; + } + + bool isarray () const + { + // We treat null_type as not an array. This is ok based on the + // current uses of this method. + if (key == reference_type) + return data.klass->isArray (); + else if (key == unresolved_reference_type) + return data.name->data[0] == '['; + return false; + } + + bool isnull () const + { + return key == null_type; + } + + bool isinterface (_Jv_BytecodeVerifier *verifier) + { + resolve (verifier); + if (key != reference_type) + return false; + return data.klass->isInterface (); + } + + bool isabstract (_Jv_BytecodeVerifier *verifier) + { + resolve (verifier); + if (key != reference_type) + return false; + using namespace java::lang::reflect; + return Modifier::isAbstract (data.klass->getModifiers ()); + } + + // Return the element type of an array. + type element_type (_Jv_BytecodeVerifier *verifier) + { + // FIXME: maybe should do string manipulation here. + resolve (verifier); + if (key != reference_type) + verifier->verify_fail ("programmer error in type::element_type()", -1); + + jclass k = data.klass->getComponentType (); + if (k->isPrimitive ()) + return type (verifier->get_type_val_for_signature (k)); + return type (k); + } + + // Return the array type corresponding to an initialized + // reference. We could expand this to work for other kinds of + // types, but currently we don't need to. + type to_array (_Jv_BytecodeVerifier *verifier) + { + // Resolving isn't ideal, because it might force us to load + // another class, but it's easy. FIXME? + if (key == unresolved_reference_type) + resolve (verifier); + + if (key == reference_type) + return type (_Jv_GetArrayClass (data.klass, + data.klass->getClassLoader ())); + else + verifier->verify_fail ("internal error in type::to_array()"); + } + + bool isreference () const + { + return key >= reference_type; + } + + int get_pc () const + { + return pc; + } + + bool isinitialized () const + { + return (key == reference_type + || key == null_type + || key == unresolved_reference_type); + } + + bool isresolved () const + { + return (key == reference_type + || key == null_type + || key == uninitialized_reference_type); + } + + void verify_dimensions (int ndims, _Jv_BytecodeVerifier *verifier) + { + // The way this is written, we don't need to check isarray(). + if (key == reference_type) + { + jclass k = data.klass; + while (k->isArray () && ndims > 0) + { + k = k->getComponentType (); + --ndims; + } + } + else + { + // We know KEY == unresolved_reference_type. + char *p = data.name->data; + while (*p++ == '[' && ndims-- > 0) + ; + } + + if (ndims > 0) + verifier->verify_fail ("array type has fewer dimensions than required"); + } + + // Merge OLD_TYPE into this. On error throw exception. + bool merge (type& old_type, bool local_semantics, + _Jv_BytecodeVerifier *verifier) + { + bool changed = false; + bool refo = old_type.isreference (); + bool refn = isreference (); + if (refo && refn) + { + if (old_type.key == null_type) + ; + else if (key == null_type) + { + *this = old_type; + changed = true; + } + else if (isinitialized () != old_type.isinitialized ()) + verifier->verify_fail ("merging initialized and uninitialized types"); + else + { + if (! isinitialized ()) + { + if (pc == UNINIT) + pc = old_type.pc; + else if (old_type.pc == UNINIT) + ; + else if (pc != old_type.pc) + verifier->verify_fail ("merging different uninitialized types"); + } + + if (! isresolved () + && ! old_type.isresolved () + && _Jv_equalUtf8Consts (data.name, old_type.data.name)) + { + // Types are identical. + } + else + { + resolve (verifier); + old_type.resolve (verifier); + + jclass k = data.klass; + jclass oldk = old_type.data.klass; + + int arraycount = 0; + while (k->isArray () && oldk->isArray ()) + { + ++arraycount; + k = k->getComponentType (); + oldk = oldk->getComponentType (); + } + + // Ordinarily this terminates when we hit Object... + while (k != NULL) + { + if (is_assignable_from_slow (k, oldk)) + break; + k = k->getSuperclass (); + changed = true; + } + // ... but K could have been an interface, in which + // case we'll end up here. We just convert this + // into Object. + if (k == NULL) + k = &java::lang::Object::class$; + + if (changed) + { + while (arraycount > 0) + { + java::lang::ClassLoader *loader + = verifier->current_class->getClassLoader(); + k = _Jv_GetArrayClass (k, loader); + --arraycount; + } + data.klass = k; + } + } + } + } + else if (refo || refn || key != old_type.key) + { + if (local_semantics) + { + // If we're merging into an "unused" slot, then we + // simply accept whatever we're merging from. + if (key == unused_by_subroutine_type) + { + *this = old_type; + changed = true; + } + else if (old_type.key == unused_by_subroutine_type) + { + // Do nothing. + } + // If we already have an `unsuitable' type, then we + // don't need to change again. + else if (key != unsuitable_type) + { + key = unsuitable_type; + changed = true; + } + } + else + verifier->verify_fail ("unmergeable type"); + } + return changed; + } + + #ifdef VERIFY_DEBUG + void print (void) const + { + char c = '?'; + switch (key) + { + case boolean_type: c = 'Z'; break; + case byte_type: c = 'B'; break; + case char_type: c = 'C'; break; + case short_type: c = 'S'; break; + case int_type: c = 'I'; break; + case long_type: c = 'J'; break; + case float_type: c = 'F'; break; + case double_type: c = 'D'; break; + case void_type: c = 'V'; break; + case unsuitable_type: c = '-'; break; + case return_address_type: c = 'r'; break; + case continuation_type: c = '+'; break; + case unused_by_subroutine_type: c = '_'; break; + case reference_type: c = 'L'; break; + case null_type: c = '@'; break; + case unresolved_reference_type: c = 'l'; break; + case uninitialized_reference_type: c = 'U'; break; + case uninitialized_unresolved_reference_type: c = 'u'; break; + } + debug_print ("%c", c); + } + #endif /* VERIFY_DEBUG */ + }; + + // This class holds all the state information we need for a given + // location. + struct state + { + // The current top of the stack, in terms of slots. + int stacktop; + // The current depth of the stack. This will be larger than + // STACKTOP when wide types are on the stack. + int stackdepth; + // The stack. + type *stack; + // The local variables. + type *locals; + // This is used in subroutines to keep track of which local + // variables have been accessed. + bool *local_changed; + // If not 0, then we are in a subroutine. The value is the PC of + // the subroutine's entry point. We can use 0 as an exceptional + // value because PC=0 can never be a subroutine. + int subroutine; + // This is used to keep a linked list of all the states which + // require re-verification. We use the PC to keep track. + int next; + // We keep track of the type of `this' specially. This is used to + // ensure that an instance initializer invokes another initializer + // on `this' before returning. We must keep track of this + // specially because otherwise we might be confused by code which + // assigns to locals[0] (overwriting `this') and then returns + // without really initializing. + type this_type; + + // INVALID marks a state which is not on the linked list of states + // requiring reverification. + static const int INVALID = -1; + // NO_NEXT marks the state at the end of the reverification list. + static const int NO_NEXT = -2; + + // This is used to mark the stack depth at the instruction just + // after a `jsr' when we haven't yet processed the corresponding + // `ret'. See handle_jsr_insn for more information. + static const int NO_STACK = -1; + + state () + : this_type () + { + stack = NULL; + locals = NULL; + local_changed = NULL; + } + + state (int max_stack, int max_locals) + : this_type () + { + stacktop = 0; + stackdepth = 0; + stack = new type[max_stack]; + for (int i = 0; i < max_stack; ++i) + stack[i] = unsuitable_type; + locals = new type[max_locals]; + local_changed = (bool *) _Jv_Malloc (sizeof (bool) * max_locals); + for (int i = 0; i < max_locals; ++i) + { + locals[i] = unsuitable_type; + local_changed[i] = false; + } + next = INVALID; + subroutine = 0; + } + + state (const state *orig, int max_stack, int max_locals, + bool ret_semantics = false) + { + stack = new type[max_stack]; + locals = new type[max_locals]; + local_changed = (bool *) _Jv_Malloc (sizeof (bool) * max_locals); + copy (orig, max_stack, max_locals, ret_semantics); + next = INVALID; + } + + ~state () + { + if (stack) + delete[] stack; + if (locals) + delete[] locals; + if (local_changed) + _Jv_Free (local_changed); + } + + void *operator new[] (size_t bytes) + { + return _Jv_Malloc (bytes); + } + + void operator delete[] (void *mem) + { + _Jv_Free (mem); + } + + void *operator new (size_t bytes) + { + return _Jv_Malloc (bytes); + } + + void operator delete (void *mem) + { + _Jv_Free (mem); + } + + void copy (const state *copy, int max_stack, int max_locals, + bool ret_semantics = false) + { + stacktop = copy->stacktop; + stackdepth = copy->stackdepth; + subroutine = copy->subroutine; + for (int i = 0; i < max_stack; ++i) + stack[i] = copy->stack[i]; + for (int i = 0; i < max_locals; ++i) + { + // See push_jump_merge to understand this case. + if (ret_semantics) + locals[i] = type (copy->local_changed[i] + ? unsuitable_type + : unused_by_subroutine_type); + else + locals[i] = copy->locals[i]; + local_changed[i] = copy->local_changed[i]; + } + this_type = copy->this_type; + // Don't modify `next'. + } + + // Modify this state to reflect entry to an exception handler. + void set_exception (type t, int max_stack) + { + stackdepth = 1; + stacktop = 1; + stack[0] = t; + for (int i = stacktop; i < max_stack; ++i) + stack[i] = unsuitable_type; + } + + // Modify this state to reflect entry into a subroutine. + void enter_subroutine (int npc, int max_locals) + { + subroutine = npc; + // Mark all items as unchanged. Each subroutine needs to keep + // track of its `changed' state independently. In the case of + // nested subroutines, this information will be merged back into + // parent by the `ret'. + for (int i = 0; i < max_locals; ++i) + local_changed[i] = false; + } + + // Merge STATE_OLD into this state. Destructively modifies this + // state. Returns true if the new state was in fact changed. + // Will throw an exception if the states are not mergeable. + bool merge (state *state_old, bool ret_semantics, + int max_locals, _Jv_BytecodeVerifier *verifier) + { + bool changed = false; + + // Special handling for `this'. If one or the other is + // uninitialized, then the merge is uninitialized. + if (this_type.isinitialized ()) + this_type = state_old->this_type; + + // Merge subroutine states. Here we just keep track of what + // subroutine we think we're in. We only check for a merge + // (which is invalid) when we see a `ret'. + if (subroutine == state_old->subroutine) + { + // Nothing. + } + else if (subroutine == 0) + { + subroutine = state_old->subroutine; + changed = true; + } + else + { + // If the subroutines differ, indicate that the state + // changed. This is needed to detect when subroutines have + // merged. + changed = true; + } + + // Merge stacks. Special handling for NO_STACK case. + if (state_old->stacktop == NO_STACK) + { + // Nothing to do in this case; we don't care about modifying + // the old state. + } + else if (stacktop == NO_STACK) + { + stacktop = state_old->stacktop; + stackdepth = state_old->stackdepth; + for (int i = 0; i < stacktop; ++i) + stack[i] = state_old->stack[i]; + changed = true; + } + else if (state_old->stacktop != stacktop) + verifier->verify_fail ("stack sizes differ"); + else + { + for (int i = 0; i < state_old->stacktop; ++i) + { + if (stack[i].merge (state_old->stack[i], false, verifier)) + changed = true; + } + } + + // Merge local variables. + for (int i = 0; i < max_locals; ++i) + { + // If we're not processing a `ret', then we merge every + // local variable. If we are processing a `ret', then we + // only merge locals which changed in the subroutine. When + // processing a `ret', STATE_OLD is the state at the point + // of the `ret', and THIS is the state just after the `jsr'. + if (! ret_semantics || state_old->local_changed[i]) + { + if (locals[i].merge (state_old->locals[i], true, verifier)) + { + // Note that we don't call `note_variable' here. + // This change doesn't represent a real change to a + // local, but rather a merge artifact. If we're in + // a subroutine which is called with two + // incompatible types in a slot that is unused by + // the subroutine, then we don't want to mark that + // variable as having been modified. + changed = true; + } + } + + // If we're in a subroutine, we must compute the union of + // all the changed local variables. + if (state_old->local_changed[i]) + note_variable (i); + } + + return changed; + } + + // Throw an exception if there is an uninitialized object on the + // stack or in a local variable. EXCEPTION_SEMANTICS controls + // whether we're using backwards-branch or exception-handing + // semantics. + void check_no_uninitialized_objects (int max_locals, + _Jv_BytecodeVerifier *verifier, + bool exception_semantics = false) + { + if (! exception_semantics) + { + for (int i = 0; i < stacktop; ++i) + if (stack[i].isreference () && ! stack[i].isinitialized ()) + verifier->verify_fail ("uninitialized object on stack"); + } + + for (int i = 0; i < max_locals; ++i) + if (locals[i].isreference () && ! locals[i].isinitialized ()) + verifier->verify_fail ("uninitialized object in local variable"); + + check_this_initialized (verifier); + } + + // Ensure that `this' has been initialized. + void check_this_initialized (_Jv_BytecodeVerifier *verifier) + { + if (this_type.isreference () && ! this_type.isinitialized ()) + verifier->verify_fail ("`this' is uninitialized"); + } + + // Set type of `this'. + void set_this_type (const type &k) + { + this_type = k; + } + + // Note that a local variable was modified. + void note_variable (int index) + { + if (subroutine > 0) + local_changed[index] = true; + } + + // Mark each `new'd object we know of that was allocated at PC as + // initialized. + void set_initialized (int pc, int max_locals) + { + for (int i = 0; i < stacktop; ++i) + stack[i].set_initialized (pc); + for (int i = 0; i < max_locals; ++i) + locals[i].set_initialized (pc); + this_type.set_initialized (pc); + } + + // Return true if this state is the unmerged result of a `ret'. + bool is_unmerged_ret_state (int max_locals) const + { + if (stacktop == NO_STACK) + return true; + for (int i = 0; i < max_locals; ++i) + { + if (locals[i].key == unused_by_subroutine_type) + return true; + } + return false; + } + + #ifdef VERIFY_DEBUG + void print (const char *leader, int pc, + int max_stack, int max_locals) const + { + debug_print ("%s [%4d]: [stack] ", leader, pc); + int i; + for (i = 0; i < stacktop; ++i) + stack[i].print (); + for (; i < max_stack; ++i) + debug_print ("."); + debug_print (" [local] "); + for (i = 0; i < max_locals; ++i) + { + locals[i].print (); + debug_print (local_changed[i] ? "+" : " "); + } + if (subroutine == 0) + debug_print (" | None"); + else + debug_print (" | %4d", subroutine); + debug_print (" | %p\n", this); + } + #else + inline void print (const char *, int, int, int) const + { + } + #endif /* VERIFY_DEBUG */ + }; + + type pop_raw () + { + if (current_state->stacktop <= 0) + verify_fail ("stack empty"); + type r = current_state->stack[--current_state->stacktop]; + current_state->stackdepth -= r.depth (); + if (current_state->stackdepth < 0) + verify_fail ("stack empty", start_PC); + return r; + } + + type pop32 () + { + type r = pop_raw (); + if (r.iswide ()) + verify_fail ("narrow pop of wide type"); + return r; + } + + type pop64 () + { + type r = pop_raw (); + if (! r.iswide ()) + verify_fail ("wide pop of narrow type"); + return r; + } + + type pop_type (type match) + { + match.promote (); + type t = pop_raw (); + if (! match.compatible (t, this)) + verify_fail ("incompatible type on stack"); + return t; + } + + // Pop a reference type or a return address. + type pop_ref_or_return () + { + type t = pop_raw (); + if (! t.isreference () && t.key != return_address_type) + verify_fail ("expected reference or return address on stack"); + return t; + } + + void push_type (type t) + { + // If T is a numeric type like short, promote it to int. + t.promote (); + + int depth = t.depth (); + if (current_state->stackdepth + depth > current_method->max_stack) + verify_fail ("stack overflow"); + current_state->stack[current_state->stacktop++] = t; + current_state->stackdepth += depth; + } + + void set_variable (int index, type t) + { + // If T is a numeric type like short, promote it to int. + t.promote (); + + int depth = t.depth (); + if (index > current_method->max_locals - depth) + verify_fail ("invalid local variable"); + current_state->locals[index] = t; + current_state->note_variable (index); + + if (depth == 2) + { + current_state->locals[index + 1] = continuation_type; + current_state->note_variable (index + 1); + } + if (index > 0 && current_state->locals[index - 1].iswide ()) + { + current_state->locals[index - 1] = unsuitable_type; + // There's no need to call note_variable here. + } + } + + type get_variable (int index, type t) + { + int depth = t.depth (); + if (index > current_method->max_locals - depth) + verify_fail ("invalid local variable"); + if (! t.compatible (current_state->locals[index], this)) + verify_fail ("incompatible type in local variable"); + if (depth == 2) + { + type t (continuation_type); + if (! current_state->locals[index + 1].compatible (t, this)) + verify_fail ("invalid local variable"); + } + return current_state->locals[index]; + } + + // Make sure ARRAY is an array type and that its elements are + // compatible with type ELEMENT. Returns the actual element type. + type require_array_type (type array, type element) + { + // An odd case. Here we just pretend that everything went ok. If + // the requested element type is some kind of reference, return + // the null type instead. + if (array.isnull ()) + return element.isreference () ? type (null_type) : element; + + if (! array.isarray ()) + verify_fail ("array required"); + + type t = array.element_type (this); + if (! element.compatible (t, this)) + { + // Special case for byte arrays, which must also be boolean + // arrays. + bool ok = true; + if (element.key == byte_type) + { + type e2 (boolean_type); + ok = e2.compatible (t, this); + } + if (! ok) + verify_fail ("incompatible array element type"); + } + + // Return T and not ELEMENT, because T might be specialized. + return t; + } + + jint get_byte () + { + if (PC >= current_method->code_length) + verify_fail ("premature end of bytecode"); + return (jint) bytecode[PC++] & 0xff; + } + + jint get_ushort () + { + jint b1 = get_byte (); + jint b2 = get_byte (); + return (jint) ((b1 << 8) | b2) & 0xffff; + } + + jint get_short () + { + jint b1 = get_byte (); + jint b2 = get_byte (); + jshort s = (b1 << 8) | b2; + return (jint) s; + } + + jint get_int () + { + jint b1 = get_byte (); + jint b2 = get_byte (); + jint b3 = get_byte (); + jint b4 = get_byte (); + return (b1 << 24) | (b2 << 16) | (b3 << 8) | b4; + } + + int compute_jump (int offset) + { + int npc = start_PC + offset; + if (npc < 0 || npc >= current_method->code_length) + verify_fail ("branch out of range", start_PC); + return npc; + } + + // Merge the indicated state into the state at the branch target and + // schedule a new PC if there is a change. If RET_SEMANTICS is + // true, then we are merging from a `ret' instruction into the + // instruction after a `jsr'. This is a special case with its own + // modified semantics. + void push_jump_merge (int npc, state *nstate, bool ret_semantics = false) + { + bool changed = true; + if (states[npc] == NULL) + { + // There's a weird situation here. If are examining the + // branch that results from a `ret', and there is not yet a + // state available at the branch target (the instruction just + // after the `jsr'), then we have to construct a special kind + // of state at that point for future merging. This special + // state has the type `unused_by_subroutine_type' in each slot + // which was not modified by the subroutine. + states[npc] = new state (nstate, current_method->max_stack, + current_method->max_locals, ret_semantics); + debug_print ("== New state in push_jump_merge\n"); + states[npc]->print ("New", npc, current_method->max_stack, + current_method->max_locals); + } + else + { + debug_print ("== Merge states in push_jump_merge\n"); + nstate->print ("Frm", start_PC, current_method->max_stack, + current_method->max_locals); + states[npc]->print (" To", npc, current_method->max_stack, + current_method->max_locals); + changed = states[npc]->merge (nstate, ret_semantics, + current_method->max_locals, this); + states[npc]->print ("New", npc, current_method->max_stack, + current_method->max_locals); + } + + if (changed && states[npc]->next == state::INVALID) + { + // The merge changed the state, and the new PC isn't yet on our + // list of PCs to re-verify. + states[npc]->next = next_verify_pc; + next_verify_pc = npc; + } + } + + void push_jump (int offset) + { + int npc = compute_jump (offset); + if (npc < PC) + current_state->check_no_uninitialized_objects (current_method->max_locals, this); + push_jump_merge (npc, current_state); + } + + void push_exception_jump (type t, int pc) + { + current_state->check_no_uninitialized_objects (current_method->max_locals, + this, true); + state s (current_state, current_method->max_stack, + current_method->max_locals); + if (current_method->max_stack < 1) + verify_fail ("stack overflow at exception handler"); + s.set_exception (t, current_method->max_stack); + push_jump_merge (pc, &s); + } + + int pop_jump () + { + int *prev_loc = &next_verify_pc; + int npc = next_verify_pc; + bool skipped = false; + + while (npc != state::NO_NEXT) + { + // If the next available PC is an unmerged `ret' state, then + // we aren't yet ready to handle it. That's because we would + // need all kind of special cases to do so. So instead we + // defer this jump until after we've processed it via a + // fall-through. This has to happen because the instruction + // before this one must be a `jsr'. + if (! states[npc]->is_unmerged_ret_state (current_method->max_locals)) + { + *prev_loc = states[npc]->next; + states[npc]->next = state::INVALID; + return npc; + } + + skipped = true; + prev_loc = &states[npc]->next; + npc = states[npc]->next; + } + + // Note that we might have gotten here even when there are + // remaining states to process. That can happen if we find a + // `jsr' without a `ret'. + return state::NO_NEXT; + } + + void invalidate_pc () + { + PC = state::NO_NEXT; + } + + void note_branch_target (int pc, bool is_jsr_target = false) + { + // Don't check `pc <= PC', because we've advanced PC after + // fetching the target and we haven't yet checked the next + // instruction. + if (pc < PC && ! (flags[pc] & FLAG_INSN_START)) + verify_fail ("branch not to instruction start", start_PC); + flags[pc] |= FLAG_BRANCH_TARGET; + if (is_jsr_target) + { + // Record the jsr which called this instruction. + subr_info *info = (subr_info *) _Jv_Malloc (sizeof (subr_info)); + info->pc = PC; + info->next = jsr_ptrs[pc]; + jsr_ptrs[pc] = info; + } + } + + void skip_padding () + { + while ((PC % 4) > 0) + if (get_byte () != 0) + verify_fail ("found nonzero padding byte"); + } + + // Return the subroutine to which the instruction at PC belongs. + int get_subroutine (int pc) + { + if (states[pc] == NULL) + return 0; + return states[pc]->subroutine; + } + + // Do the work for a `ret' instruction. INDEX is the index into the + // local variables. + void handle_ret_insn (int index) + { + get_variable (index, return_address_type); + + int csub = current_state->subroutine; + if (csub == 0) + verify_fail ("no subroutine"); + + // Check to see if we've merged subroutines. + subr_entry_info *entry; + for (entry = entry_points; entry != NULL; entry = entry->next) + { + if (entry->ret_pc == start_PC) + break; + } + if (entry == NULL) + { + entry = (subr_entry_info *) _Jv_Malloc (sizeof (subr_entry_info)); + entry->pc = csub; + entry->ret_pc = start_PC; + entry->next = entry_points; + entry_points = entry; + } + else if (entry->pc != csub) + verify_fail ("subroutines merged"); + + for (subr_info *subr = jsr_ptrs[csub]; subr != NULL; subr = subr->next) + { + // Temporarily modify the current state so it looks like we're + // in the enclosing context. + current_state->subroutine = get_subroutine (subr->pc); + if (subr->pc < PC) + current_state->check_no_uninitialized_objects (current_method->max_locals, this); + push_jump_merge (subr->pc, current_state, true); + } + + current_state->subroutine = csub; + invalidate_pc (); + } + + // We're in the subroutine SUB, calling a subroutine at DEST. Make + // sure this subroutine isn't already on the stack. + void check_nonrecursive_call (int sub, int dest) + { + if (sub == 0) + return; + if (sub == dest) + verify_fail ("recursive subroutine call"); + for (subr_info *info = jsr_ptrs[sub]; info != NULL; info = info->next) + check_nonrecursive_call (get_subroutine (info->pc), dest); + } + + void handle_jsr_insn (int offset) + { + int npc = compute_jump (offset); + + if (npc < PC) + current_state->check_no_uninitialized_objects (current_method->max_locals, this); + check_nonrecursive_call (current_state->subroutine, npc); + + // Modify our state as appropriate for entry into a subroutine. + push_type (return_address_type); + push_jump_merge (npc, current_state); + // Clean up. + pop_type (return_address_type); + + // On entry to the subroutine, the subroutine number must be set + // and the locals must be marked as cleared. We do this after + // merging state so that we don't erroneously "notice" a variable + // change merely on entry. + states[npc]->enter_subroutine (npc, current_method->max_locals); + + // Indicate that we don't know the stack depth of the instruction + // following the `jsr'. The idea here is that we need to merge + // the local variable state across the jsr, but the subroutine + // might change the stack depth, so we can't make any assumptions + // about it. So we have yet another special case. We know that + // at this point PC points to the instruction after the jsr. + + // FIXME: what if we have a jsr at the end of the code, but that + // jsr has no corresponding ret? Is this verifiable, or is it + // not? If it is then we need a special case here. + if (PC >= current_method->code_length) + verify_fail ("fell off end"); + + current_state->stacktop = state::NO_STACK; + push_jump_merge (PC, current_state); + invalidate_pc (); + } + + jclass construct_primitive_array_type (type_val prim) + { + jclass k = NULL; + switch (prim) + { + case boolean_type: + k = JvPrimClass (boolean); + break; + case char_type: + k = JvPrimClass (char); + break; + case float_type: + k = JvPrimClass (float); + break; + case double_type: + k = JvPrimClass (double); + break; + case byte_type: + k = JvPrimClass (byte); + break; + case short_type: + k = JvPrimClass (short); + break; + case int_type: + k = JvPrimClass (int); + break; + case long_type: + k = JvPrimClass (long); + break; + default: + verify_fail ("unknown type in construct_primitive_array_type"); + } + k = _Jv_GetArrayClass (k, NULL); + return k; + } + + // This pass computes the location of branch targets and also + // instruction starts. + void branch_prepass () + { + flags = (char *) _Jv_Malloc (current_method->code_length); + jsr_ptrs = (subr_info **) _Jv_Malloc (sizeof (subr_info *) + * current_method->code_length); + + for (int i = 0; i < current_method->code_length; ++i) + { + flags[i] = 0; + jsr_ptrs[i] = NULL; + } + + bool last_was_jsr = false; + + PC = 0; + while (PC < current_method->code_length) + { + // Set `start_PC' early so that error checking can have the + // correct value. + start_PC = PC; + flags[PC] |= FLAG_INSN_START; + + // If the previous instruction was a jsr, then the next + // instruction is a branch target -- the branch being the + // corresponding `ret'. + if (last_was_jsr) + note_branch_target (PC); + last_was_jsr = false; + + java_opcode opcode = (java_opcode) bytecode[PC++]; + switch (opcode) + { + case op_nop: + case op_aconst_null: + case op_iconst_m1: + case op_iconst_0: + case op_iconst_1: + case op_iconst_2: + case op_iconst_3: + case op_iconst_4: + case op_iconst_5: + case op_lconst_0: + case op_lconst_1: + case op_fconst_0: + case op_fconst_1: + case op_fconst_2: + case op_dconst_0: + case op_dconst_1: + case op_iload_0: + case op_iload_1: + case op_iload_2: + case op_iload_3: + case op_lload_0: + case op_lload_1: + case op_lload_2: + case op_lload_3: + case op_fload_0: + case op_fload_1: + case op_fload_2: + case op_fload_3: + case op_dload_0: + case op_dload_1: + case op_dload_2: + case op_dload_3: + case op_aload_0: + case op_aload_1: + case op_aload_2: + case op_aload_3: + case op_iaload: + case op_laload: + case op_faload: + case op_daload: + case op_aaload: + case op_baload: + case op_caload: + case op_saload: + case op_istore_0: + case op_istore_1: + case op_istore_2: + case op_istore_3: + case op_lstore_0: + case op_lstore_1: + case op_lstore_2: + case op_lstore_3: + case op_fstore_0: + case op_fstore_1: + case op_fstore_2: + case op_fstore_3: + case op_dstore_0: + case op_dstore_1: + case op_dstore_2: + case op_dstore_3: + case op_astore_0: + case op_astore_1: + case op_astore_2: + case op_astore_3: + case op_iastore: + case op_lastore: + case op_fastore: + case op_dastore: + case op_aastore: + case op_bastore: + case op_castore: + case op_sastore: + case op_pop: + case op_pop2: + case op_dup: + case op_dup_x1: + case op_dup_x2: + case op_dup2: + case op_dup2_x1: + case op_dup2_x2: + case op_swap: + case op_iadd: + case op_isub: + case op_imul: + case op_idiv: + case op_irem: + case op_ishl: + case op_ishr: + case op_iushr: + case op_iand: + case op_ior: + case op_ixor: + case op_ladd: + case op_lsub: + case op_lmul: + case op_ldiv: + case op_lrem: + case op_lshl: + case op_lshr: + case op_lushr: + case op_land: + case op_lor: + case op_lxor: + case op_fadd: + case op_fsub: + case op_fmul: + case op_fdiv: + case op_frem: + case op_dadd: + case op_dsub: + case op_dmul: + case op_ddiv: + case op_drem: + case op_ineg: + case op_i2b: + case op_i2c: + case op_i2s: + case op_lneg: + case op_fneg: + case op_dneg: + case op_i2l: + case op_i2f: + case op_i2d: + case op_l2i: + case op_l2f: + case op_l2d: + case op_f2i: + case op_f2l: + case op_f2d: + case op_d2i: + case op_d2l: + case op_d2f: + case op_lcmp: + case op_fcmpl: + case op_fcmpg: + case op_dcmpl: + case op_dcmpg: + case op_monitorenter: + case op_monitorexit: + case op_ireturn: + case op_lreturn: + case op_freturn: + case op_dreturn: + case op_areturn: + case op_return: + case op_athrow: + case op_arraylength: + break; + + case op_bipush: + case op_ldc: + case op_iload: + case op_lload: + case op_fload: + case op_dload: + case op_aload: + case op_istore: + case op_lstore: + case op_fstore: + case op_dstore: + case op_astore: + case op_ret: + case op_newarray: + get_byte (); + break; + + case op_iinc: + case op_sipush: + case op_ldc_w: + case op_ldc2_w: + case op_getstatic: + case op_getfield: + case op_putfield: + case op_putstatic: + case op_new: + case op_anewarray: + case op_instanceof: + case op_checkcast: + case op_invokespecial: + case op_invokestatic: + case op_invokevirtual: + get_short (); + break; + + case op_multianewarray: + get_short (); + get_byte (); + break; + + case op_jsr: + last_was_jsr = true; + // Fall through. + case op_ifeq: + case op_ifne: + case op_iflt: + case op_ifge: + case op_ifgt: + case op_ifle: + case op_if_icmpeq: + case op_if_icmpne: + case op_if_icmplt: + case op_if_icmpge: + case op_if_icmpgt: + case op_if_icmple: + case op_if_acmpeq: + case op_if_acmpne: + case op_ifnull: + case op_ifnonnull: + case op_goto: + note_branch_target (compute_jump (get_short ()), last_was_jsr); + break; + + case op_tableswitch: + { + skip_padding (); + note_branch_target (compute_jump (get_int ())); + jint low = get_int (); + jint hi = get_int (); + if (low > hi) + verify_fail ("invalid tableswitch", start_PC); + for (int i = low; i <= hi; ++i) + note_branch_target (compute_jump (get_int ())); + } + break; + + case op_lookupswitch: + { + skip_padding (); + note_branch_target (compute_jump (get_int ())); + int npairs = get_int (); + if (npairs < 0) + verify_fail ("too few pairs in lookupswitch", start_PC); + while (npairs-- > 0) + { + get_int (); + note_branch_target (compute_jump (get_int ())); + } + } + break; + + case op_invokeinterface: + get_short (); + get_byte (); + get_byte (); + break; + + case op_wide: + { + opcode = (java_opcode) get_byte (); + get_short (); + if (opcode == op_iinc) + get_short (); + } + break; + + case op_jsr_w: + last_was_jsr = true; + // Fall through. + case op_goto_w: + note_branch_target (compute_jump (get_int ()), last_was_jsr); + break; + + default: + verify_fail ("unrecognized instruction in branch_prepass", + start_PC); + } + + // See if any previous branch tried to branch to the middle of + // this instruction. + for (int pc = start_PC + 1; pc < PC; ++pc) + { + if ((flags[pc] & FLAG_BRANCH_TARGET)) + verify_fail ("branch to middle of instruction", pc); + } + } + + // Verify exception handlers. + for (int i = 0; i < current_method->exc_count; ++i) + { + if (! (flags[exception[i].handler_pc] & FLAG_INSN_START)) + verify_fail ("exception handler not at instruction start", + exception[i].handler_pc); + if (! (flags[exception[i].start_pc] & FLAG_INSN_START)) + verify_fail ("exception start not at instruction start", + exception[i].start_pc); + if (exception[i].end_pc != current_method->code_length + && ! (flags[exception[i].end_pc] & FLAG_INSN_START)) + verify_fail ("exception end not at instruction start", + exception[i].end_pc); + + flags[exception[i].handler_pc] |= FLAG_BRANCH_TARGET; + } + } + + void check_pool_index (int index) + { + if (index < 0 || index >= current_class->constants.size) + verify_fail ("constant pool index out of range", start_PC); + } + + type check_class_constant (int index) + { + check_pool_index (index); + _Jv_Constants *pool = ¤t_class->constants; + if (pool->tags[index] == JV_CONSTANT_ResolvedClass) + return type (pool->data[index].clazz); + else if (pool->tags[index] == JV_CONSTANT_Class) + return type (pool->data[index].utf8); + verify_fail ("expected class constant", start_PC); + } + + type check_constant (int index) + { + check_pool_index (index); + _Jv_Constants *pool = ¤t_class->constants; + if (pool->tags[index] == JV_CONSTANT_ResolvedString + || pool->tags[index] == JV_CONSTANT_String) + return type (&java::lang::String::class$); + else if (pool->tags[index] == JV_CONSTANT_Integer) + return type (int_type); + else if (pool->tags[index] == JV_CONSTANT_Float) + return type (float_type); + verify_fail ("String, int, or float constant expected", start_PC); + } + + type check_wide_constant (int index) + { + check_pool_index (index); + _Jv_Constants *pool = ¤t_class->constants; + if (pool->tags[index] == JV_CONSTANT_Long) + return type (long_type); + else if (pool->tags[index] == JV_CONSTANT_Double) + return type (double_type); + verify_fail ("long or double constant expected", start_PC); + } + + // Helper for both field and method. These are laid out the same in + // the constant pool. + type handle_field_or_method (int index, int expected, + _Jv_Utf8Const **name, + _Jv_Utf8Const **fmtype) + { + check_pool_index (index); + _Jv_Constants *pool = ¤t_class->constants; + if (pool->tags[index] != expected) + verify_fail ("didn't see expected constant", start_PC); + // Once we know we have a Fieldref or Methodref we assume that it + // is correctly laid out in the constant pool. I think the code + // in defineclass.cc guarantees this. + _Jv_ushort class_index, name_and_type_index; + _Jv_loadIndexes (&pool->data[index], + class_index, + name_and_type_index); + _Jv_ushort name_index, desc_index; + _Jv_loadIndexes (&pool->data[name_and_type_index], + name_index, desc_index); + + *name = pool->data[name_index].utf8; + *fmtype = pool->data[desc_index].utf8; + + return check_class_constant (class_index); + } + + // Return field's type, compute class' type if requested. + type check_field_constant (int index, type *class_type = NULL) + { + _Jv_Utf8Const *name, *field_type; + type ct = handle_field_or_method (index, + JV_CONSTANT_Fieldref, + &name, &field_type); + if (class_type) + *class_type = ct; + if (field_type->data[0] == '[' || field_type->data[0] == 'L') + return type (field_type); + return get_type_val_for_signature (field_type->data[0]); + } + + type check_method_constant (int index, bool is_interface, + _Jv_Utf8Const **method_name, + _Jv_Utf8Const **method_signature) + { + return handle_field_or_method (index, + (is_interface + ? JV_CONSTANT_InterfaceMethodref + : JV_CONSTANT_Methodref), + method_name, method_signature); + } + + type get_one_type (char *&p) + { + char *start = p; + + int arraycount = 0; + while (*p == '[') + { + ++arraycount; + ++p; + } + + char v = *p++; + + if (v == 'L') + { + while (*p != ';') + ++p; + ++p; + _Jv_Utf8Const *name = make_utf8_const (start, p - start); + return type (name); + } + + // Casting to jchar here is ok since we are looking at an ASCII + // character. + type_val rt = get_type_val_for_signature (jchar (v)); + + if (arraycount == 0) + { + // Callers of this function eventually push their arguments on + // the stack. So, promote them here. + return type (rt).promote (); + } + + jclass k = construct_primitive_array_type (rt); + while (--arraycount > 0) + k = _Jv_GetArrayClass (k, NULL); + return type (k); + } + + void compute_argument_types (_Jv_Utf8Const *signature, + type *types) + { + char *p = signature->data; + // Skip `('. + ++p; + + int i = 0; + while (*p != ')') + types[i++] = get_one_type (p); + } + + type compute_return_type (_Jv_Utf8Const *signature) + { + char *p = signature->data; + while (*p != ')') + ++p; + ++p; + return get_one_type (p); + } + + void check_return_type (type onstack) + { + type rt = compute_return_type (current_method->self->signature); + if (! rt.compatible (onstack, this)) + verify_fail ("incompatible return type"); + } + + // Initialize the stack for the new method. Returns true if this + // method is an instance initializer. + bool initialize_stack () + { + int var = 0; + bool is_init = false; + + using namespace java::lang::reflect; + if (! Modifier::isStatic (current_method->self->accflags)) + { + type kurr (current_class); + if (_Jv_equalUtf8Consts (current_method->self->name, gcj::init_name)) + { + kurr.set_uninitialized (type::SELF, this); + is_init = true; + } + set_variable (0, kurr); + current_state->set_this_type (kurr); + ++var; + } + + // We have to handle wide arguments specially here. + int arg_count = _Jv_count_arguments (current_method->self->signature); + type arg_types[arg_count]; + compute_argument_types (current_method->self->signature, arg_types); + for (int i = 0; i < arg_count; ++i) + { + set_variable (var, arg_types[i]); + ++var; + if (arg_types[i].iswide ()) + ++var; + } + + return is_init; + } + + void verify_instructions_0 () + { + current_state = new state (current_method->max_stack, + current_method->max_locals); + + PC = 0; + start_PC = 0; + + // True if we are verifying an instance initializer. + bool this_is_init = initialize_stack (); + + states = (state **) _Jv_Malloc (sizeof (state *) + * current_method->code_length); + for (int i = 0; i < current_method->code_length; ++i) + states[i] = NULL; + + next_verify_pc = state::NO_NEXT; + + while (true) + { + // If the PC was invalidated, get a new one from the work list. + if (PC == state::NO_NEXT) + { + PC = pop_jump (); + if (PC == state::INVALID) + verify_fail ("can't happen: saw state::INVALID"); + if (PC == state::NO_NEXT) + break; + debug_print ("== State pop from pending list\n"); + // Set up the current state. + current_state->copy (states[PC], current_method->max_stack, + current_method->max_locals); + } + else + { + // Control can't fall off the end of the bytecode. We + // only need to check this in the fall-through case, + // because branch bounds are checked when they are + // pushed. + if (PC >= current_method->code_length) + verify_fail ("fell off end"); + + // We only have to do this checking in the situation where + // control flow falls through from the previous + // instruction. Otherwise merging is done at the time we + // push the branch. + if (states[PC] != NULL) + { + // We've already visited this instruction. So merge + // the states together. If this yields no change then + // we don't have to re-verify. However, if the new + // state is an the result of an unmerged `ret', we + // must continue through it. + debug_print ("== Fall through merge\n"); + states[PC]->print ("Old", PC, current_method->max_stack, + current_method->max_locals); + current_state->print ("Cur", PC, current_method->max_stack, + current_method->max_locals); + if (! current_state->merge (states[PC], false, + current_method->max_locals, this) + && ! states[PC]->is_unmerged_ret_state (current_method->max_locals)) + { + debug_print ("== Fall through optimization\n"); + invalidate_pc (); + continue; + } + // Save a copy of it for later. + states[PC]->copy (current_state, current_method->max_stack, + current_method->max_locals); + current_state->print ("New", PC, current_method->max_stack, + current_method->max_locals); + } + } + + // We only have to keep saved state at branch targets. If + // we're at a branch target and the state here hasn't been set + // yet, we set it now. + if (states[PC] == NULL && (flags[PC] & FLAG_BRANCH_TARGET)) + { + states[PC] = new state (current_state, current_method->max_stack, + current_method->max_locals); + } + + // Set this before handling exceptions so that debug output is + // sane. + start_PC = PC; + + // Update states for all active exception handlers. Ordinarily + // there are not many exception handlers. So we simply run + // through them all. + for (int i = 0; i < current_method->exc_count; ++i) + { + if (PC >= exception[i].start_pc && PC < exception[i].end_pc) + { + type handler (&java::lang::Throwable::class$); + if (exception[i].handler_type != 0) + handler = check_class_constant (exception[i].handler_type); + push_exception_jump (handler, exception[i].handler_pc); + } + } + + current_state->print (" ", PC, current_method->max_stack, + current_method->max_locals); + java_opcode opcode = (java_opcode) bytecode[PC++]; + switch (opcode) + { + case op_nop: + break; + + case op_aconst_null: + push_type (null_type); + break; + + case op_iconst_m1: + case op_iconst_0: + case op_iconst_1: + case op_iconst_2: + case op_iconst_3: + case op_iconst_4: + case op_iconst_5: + push_type (int_type); + break; + + case op_lconst_0: + case op_lconst_1: + push_type (long_type); + break; + + case op_fconst_0: + case op_fconst_1: + case op_fconst_2: + push_type (float_type); + break; + + case op_dconst_0: + case op_dconst_1: + push_type (double_type); + break; + + case op_bipush: + get_byte (); + push_type (int_type); + break; + + case op_sipush: + get_short (); + push_type (int_type); + break; + + case op_ldc: + push_type (check_constant (get_byte ())); + break; + case op_ldc_w: + push_type (check_constant (get_ushort ())); + break; + case op_ldc2_w: + push_type (check_wide_constant (get_ushort ())); + break; + + case op_iload: + push_type (get_variable (get_byte (), int_type)); + break; + case op_lload: + push_type (get_variable (get_byte (), long_type)); + break; + case op_fload: + push_type (get_variable (get_byte (), float_type)); + break; + case op_dload: + push_type (get_variable (get_byte (), double_type)); + break; + case op_aload: + push_type (get_variable (get_byte (), reference_type)); + break; + + case op_iload_0: + case op_iload_1: + case op_iload_2: + case op_iload_3: + push_type (get_variable (opcode - op_iload_0, int_type)); + break; + case op_lload_0: + case op_lload_1: + case op_lload_2: + case op_lload_3: + push_type (get_variable (opcode - op_lload_0, long_type)); + break; + case op_fload_0: + case op_fload_1: + case op_fload_2: + case op_fload_3: + push_type (get_variable (opcode - op_fload_0, float_type)); + break; + case op_dload_0: + case op_dload_1: + case op_dload_2: + case op_dload_3: + push_type (get_variable (opcode - op_dload_0, double_type)); + break; + case op_aload_0: + case op_aload_1: + case op_aload_2: + case op_aload_3: + push_type (get_variable (opcode - op_aload_0, reference_type)); + break; + case op_iaload: + pop_type (int_type); + push_type (require_array_type (pop_type (reference_type), + int_type)); + break; + case op_laload: + pop_type (int_type); + push_type (require_array_type (pop_type (reference_type), + long_type)); + break; + case op_faload: + pop_type (int_type); + push_type (require_array_type (pop_type (reference_type), + float_type)); + break; + case op_daload: + pop_type (int_type); + push_type (require_array_type (pop_type (reference_type), + double_type)); + break; + case op_aaload: + pop_type (int_type); + push_type (require_array_type (pop_type (reference_type), + reference_type)); + break; + case op_baload: + pop_type (int_type); + require_array_type (pop_type (reference_type), byte_type); + push_type (int_type); + break; + case op_caload: + pop_type (int_type); + require_array_type (pop_type (reference_type), char_type); + push_type (int_type); + break; + case op_saload: + pop_type (int_type); + require_array_type (pop_type (reference_type), short_type); + push_type (int_type); + break; + case op_istore: + set_variable (get_byte (), pop_type (int_type)); + break; + case op_lstore: + set_variable (get_byte (), pop_type (long_type)); + break; + case op_fstore: + set_variable (get_byte (), pop_type (float_type)); + break; + case op_dstore: + set_variable (get_byte (), pop_type (double_type)); + break; + case op_astore: + set_variable (get_byte (), pop_ref_or_return ()); + break; + case op_istore_0: + case op_istore_1: + case op_istore_2: + case op_istore_3: + set_variable (opcode - op_istore_0, pop_type (int_type)); + break; + case op_lstore_0: + case op_lstore_1: + case op_lstore_2: + case op_lstore_3: + set_variable (opcode - op_lstore_0, pop_type (long_type)); + break; + case op_fstore_0: + case op_fstore_1: + case op_fstore_2: + case op_fstore_3: + set_variable (opcode - op_fstore_0, pop_type (float_type)); + break; + case op_dstore_0: + case op_dstore_1: + case op_dstore_2: + case op_dstore_3: + set_variable (opcode - op_dstore_0, pop_type (double_type)); + break; + case op_astore_0: + case op_astore_1: + case op_astore_2: + case op_astore_3: + set_variable (opcode - op_astore_0, pop_ref_or_return ()); + break; + case op_iastore: + pop_type (int_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), int_type); + break; + case op_lastore: + pop_type (long_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), long_type); + break; + case op_fastore: + pop_type (float_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), float_type); + break; + case op_dastore: + pop_type (double_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), double_type); + break; + case op_aastore: + pop_type (reference_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), reference_type); + break; + case op_bastore: + pop_type (int_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), byte_type); + break; + case op_castore: + pop_type (int_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), char_type); + break; + case op_sastore: + pop_type (int_type); + pop_type (int_type); + require_array_type (pop_type (reference_type), short_type); + break; + case op_pop: + pop32 (); + break; + case op_pop2: + pop64 (); + break; + case op_dup: + { + type t = pop32 (); + push_type (t); + push_type (t); + } + break; + case op_dup_x1: + { + type t1 = pop32 (); + type t2 = pop32 (); + push_type (t1); + push_type (t2); + push_type (t1); + } + break; + case op_dup_x2: + { + type t1 = pop32 (); + type t2 = pop_raw (); + if (! t2.iswide ()) + { + type t3 = pop32 (); + push_type (t1); + push_type (t3); + } + else + push_type (t1); + push_type (t2); + push_type (t1); + } + break; + case op_dup2: + { + type t = pop_raw (); + if (! t.iswide ()) + { + type t2 = pop32 (); + push_type (t2); + push_type (t); + push_type (t2); + } + else + push_type (t); + push_type (t); + } + break; + case op_dup2_x1: + { + type t1 = pop_raw (); + type t2 = pop32 (); + if (! t1.iswide ()) + { + type t3 = pop32 (); + push_type (t2); + push_type (t1); + push_type (t3); + } + else + push_type (t1); + push_type (t2); + push_type (t1); + } + break; + case op_dup2_x2: + { + type t1 = pop_raw (); + if (t1.iswide ()) + { + type t2 = pop_raw (); + if (t2.iswide ()) + { + push_type (t1); + push_type (t2); + } + else + { + type t3 = pop32 (); + push_type (t1); + push_type (t3); + push_type (t2); + } + push_type (t1); + } + else + { + type t2 = pop32 (); + type t3 = pop_raw (); + if (t3.iswide ()) + { + push_type (t2); + push_type (t1); + } + else + { + type t4 = pop32 (); + push_type (t2); + push_type (t1); + push_type (t4); + } + push_type (t3); + push_type (t2); + push_type (t1); + } + } + break; + case op_swap: + { + type t1 = pop32 (); + type t2 = pop32 (); + push_type (t1); + push_type (t2); + } + break; + case op_iadd: + case op_isub: + case op_imul: + case op_idiv: + case op_irem: + case op_ishl: + case op_ishr: + case op_iushr: + case op_iand: + case op_ior: + case op_ixor: + pop_type (int_type); + push_type (pop_type (int_type)); + break; + case op_ladd: + case op_lsub: + case op_lmul: + case op_ldiv: + case op_lrem: + case op_land: + case op_lor: + case op_lxor: + pop_type (long_type); + push_type (pop_type (long_type)); + break; + case op_lshl: + case op_lshr: + case op_lushr: + pop_type (int_type); + push_type (pop_type (long_type)); + break; + case op_fadd: + case op_fsub: + case op_fmul: + case op_fdiv: + case op_frem: + pop_type (float_type); + push_type (pop_type (float_type)); + break; + case op_dadd: + case op_dsub: + case op_dmul: + case op_ddiv: + case op_drem: + pop_type (double_type); + push_type (pop_type (double_type)); + break; + case op_ineg: + case op_i2b: + case op_i2c: + case op_i2s: + push_type (pop_type (int_type)); + break; + case op_lneg: + push_type (pop_type (long_type)); + break; + case op_fneg: + push_type (pop_type (float_type)); + break; + case op_dneg: + push_type (pop_type (double_type)); + break; + case op_iinc: + get_variable (get_byte (), int_type); + get_byte (); + break; + case op_i2l: + pop_type (int_type); + push_type (long_type); + break; + case op_i2f: + pop_type (int_type); + push_type (float_type); + break; + case op_i2d: + pop_type (int_type); + push_type (double_type); + break; + case op_l2i: + pop_type (long_type); + push_type (int_type); + break; + case op_l2f: + pop_type (long_type); + push_type (float_type); + break; + case op_l2d: + pop_type (long_type); + push_type (double_type); + break; + case op_f2i: + pop_type (float_type); + push_type (int_type); + break; + case op_f2l: + pop_type (float_type); + push_type (long_type); + break; + case op_f2d: + pop_type (float_type); + push_type (double_type); + break; + case op_d2i: + pop_type (double_type); + push_type (int_type); + break; + case op_d2l: + pop_type (double_type); + push_type (long_type); + break; + case op_d2f: + pop_type (double_type); + push_type (float_type); + break; + case op_lcmp: + pop_type (long_type); + pop_type (long_type); + push_type (int_type); + break; + case op_fcmpl: + case op_fcmpg: + pop_type (float_type); + pop_type (float_type); + push_type (int_type); + break; + case op_dcmpl: + case op_dcmpg: + pop_type (double_type); + pop_type (double_type); + push_type (int_type); + break; + case op_ifeq: + case op_ifne: + case op_iflt: + case op_ifge: + case op_ifgt: + case op_ifle: + pop_type (int_type); + push_jump (get_short ()); + break; + case op_if_icmpeq: + case op_if_icmpne: + case op_if_icmplt: + case op_if_icmpge: + case op_if_icmpgt: + case op_if_icmple: + pop_type (int_type); + pop_type (int_type); + push_jump (get_short ()); + break; + case op_if_acmpeq: + case op_if_acmpne: + pop_type (reference_type); + pop_type (reference_type); + push_jump (get_short ()); + break; + case op_goto: + push_jump (get_short ()); + invalidate_pc (); + break; + case op_jsr: + handle_jsr_insn (get_short ()); + break; + case op_ret: + handle_ret_insn (get_byte ()); + break; + case op_tableswitch: + { + pop_type (int_type); + skip_padding (); + push_jump (get_int ()); + jint low = get_int (); + jint high = get_int (); + // Already checked LOW -vs- HIGH. + for (int i = low; i <= high; ++i) + push_jump (get_int ()); + invalidate_pc (); + } + break; + + case op_lookupswitch: + { + pop_type (int_type); + skip_padding (); + push_jump (get_int ()); + jint npairs = get_int (); + // Already checked NPAIRS >= 0. + jint lastkey = 0; + for (int i = 0; i < npairs; ++i) + { + jint key = get_int (); + if (i > 0 && key <= lastkey) + verify_fail ("lookupswitch pairs unsorted", start_PC); + lastkey = key; + push_jump (get_int ()); + } + invalidate_pc (); + } + break; + case op_ireturn: + check_return_type (pop_type (int_type)); + invalidate_pc (); + break; + case op_lreturn: + check_return_type (pop_type (long_type)); + invalidate_pc (); + break; + case op_freturn: + check_return_type (pop_type (float_type)); + invalidate_pc (); + break; + case op_dreturn: + check_return_type (pop_type (double_type)); + invalidate_pc (); + break; + case op_areturn: + check_return_type (pop_type (reference_type)); + invalidate_pc (); + break; + case op_return: + // We only need to check this when the return type is + // void, because all instance initializers return void. + if (this_is_init) + current_state->check_this_initialized (this); + check_return_type (void_type); + invalidate_pc (); + break; + case op_getstatic: + push_type (check_field_constant (get_ushort ())); + break; + case op_putstatic: + pop_type (check_field_constant (get_ushort ())); + break; + case op_getfield: + { + type klass; + type field = check_field_constant (get_ushort (), &klass); + pop_type (klass); + push_type (field); + } + break; + case op_putfield: + { + type klass; + type field = check_field_constant (get_ushort (), &klass); + pop_type (field); + + // We have an obscure special case here: we can use + // `putfield' on a field declared in this class, even if + // `this' has not yet been initialized. + if (! current_state->this_type.isinitialized () + && current_state->this_type.pc == type::SELF) + klass.set_uninitialized (type::SELF, this); + pop_type (klass); + } + break; + + case op_invokevirtual: + case op_invokespecial: + case op_invokestatic: + case op_invokeinterface: + { + _Jv_Utf8Const *method_name, *method_signature; + type class_type + = check_method_constant (get_ushort (), + opcode == op_invokeinterface, + &method_name, + &method_signature); + // NARGS is only used when we're processing + // invokeinterface. It is simplest for us to compute it + // here and then verify it later. + int nargs = 0; + if (opcode == op_invokeinterface) + { + nargs = get_byte (); + if (get_byte () != 0) + verify_fail ("invokeinterface dummy byte is wrong"); + } + + bool is_init = false; + if (_Jv_equalUtf8Consts (method_name, gcj::init_name)) + { + is_init = true; + if (opcode != op_invokespecial) + verify_fail ("can't invoke "); + } + else if (method_name->data[0] == '<') + verify_fail ("can't invoke method starting with `<'"); + + // Pop arguments and check types. + int arg_count = _Jv_count_arguments (method_signature); + type arg_types[arg_count]; + compute_argument_types (method_signature, arg_types); + for (int i = arg_count - 1; i >= 0; --i) + { + // This is only used for verifying the byte for + // invokeinterface. + nargs -= arg_types[i].depth (); + pop_type (arg_types[i]); + } + + if (opcode == op_invokeinterface + && nargs != 1) + verify_fail ("wrong argument count for invokeinterface"); + + if (opcode != op_invokestatic) + { + type t = class_type; + if (is_init) + { + // In this case the PC doesn't matter. + t.set_uninitialized (type::UNINIT, this); + } + type raw = pop_raw (); + bool ok = false; + if (t.compatible (raw, this)) + { + ok = true; + } + else if (opcode == op_invokeinterface) + { + // This is a hack. We might have merged two + // items and gotten `Object'. This can happen + // because we don't keep track of where merges + // come from. This is safe as long as the + // interpreter checks interfaces at runtime. + type obj (&java::lang::Object::class$); + ok = raw.compatible (obj, this); + } + + if (! ok) + verify_fail ("incompatible type on stack"); + + if (is_init) + current_state->set_initialized (raw.get_pc (), + current_method->max_locals); + } + + type rt = compute_return_type (method_signature); + if (! rt.isvoid ()) + push_type (rt); + } + break; + + case op_new: + { + type t = check_class_constant (get_ushort ()); + if (t.isarray () || t.isinterface (this) || t.isabstract (this)) + verify_fail ("type is array, interface, or abstract"); + t.set_uninitialized (start_PC, this); + push_type (t); + } + break; + + case op_newarray: + { + int atype = get_byte (); + // We intentionally have chosen constants to make this + // valid. + if (atype < boolean_type || atype > long_type) + verify_fail ("type not primitive", start_PC); + pop_type (int_type); + push_type (construct_primitive_array_type (type_val (atype))); + } + break; + case op_anewarray: + pop_type (int_type); + push_type (check_class_constant (get_ushort ()).to_array (this)); + break; + case op_arraylength: + { + type t = pop_type (reference_type); + if (! t.isarray () && ! t.isnull ()) + verify_fail ("array type expected"); + push_type (int_type); + } + break; + case op_athrow: + pop_type (type (&java::lang::Throwable::class$)); + invalidate_pc (); + break; + case op_checkcast: + pop_type (reference_type); + push_type (check_class_constant (get_ushort ())); + break; + case op_instanceof: + pop_type (reference_type); + check_class_constant (get_ushort ()); + push_type (int_type); + break; + case op_monitorenter: + pop_type (reference_type); + break; + case op_monitorexit: + pop_type (reference_type); + break; + case op_wide: + { + switch (get_byte ()) + { + case op_iload: + push_type (get_variable (get_ushort (), int_type)); + break; + case op_lload: + push_type (get_variable (get_ushort (), long_type)); + break; + case op_fload: + push_type (get_variable (get_ushort (), float_type)); + break; + case op_dload: + push_type (get_variable (get_ushort (), double_type)); + break; + case op_aload: + push_type (get_variable (get_ushort (), reference_type)); + break; + case op_istore: + set_variable (get_ushort (), pop_type (int_type)); + break; + case op_lstore: + set_variable (get_ushort (), pop_type (long_type)); + break; + case op_fstore: + set_variable (get_ushort (), pop_type (float_type)); + break; + case op_dstore: + set_variable (get_ushort (), pop_type (double_type)); + break; + case op_astore: + set_variable (get_ushort (), pop_type (reference_type)); + break; + case op_ret: + handle_ret_insn (get_short ()); + break; + case op_iinc: + get_variable (get_ushort (), int_type); + get_short (); + break; + default: + verify_fail ("unrecognized wide instruction", start_PC); + } + } + break; + case op_multianewarray: + { + type atype = check_class_constant (get_ushort ()); + int dim = get_byte (); + if (dim < 1) + verify_fail ("too few dimensions to multianewarray", start_PC); + atype.verify_dimensions (dim, this); + for (int i = 0; i < dim; ++i) + pop_type (int_type); + push_type (atype); + } + break; + case op_ifnull: + case op_ifnonnull: + pop_type (reference_type); + push_jump (get_short ()); + break; + case op_goto_w: + push_jump (get_int ()); + invalidate_pc (); + break; + case op_jsr_w: + handle_jsr_insn (get_int ()); + break; + + default: + // Unrecognized opcode. + verify_fail ("unrecognized instruction in verify_instructions_0", + start_PC); + } + } + } + + __attribute__ ((__noreturn__)) void verify_fail (char *s, jint pc = -1) + { + using namespace java::lang; + StringBuffer *buf = new StringBuffer (); + + buf->append (JvNewStringLatin1 ("verification failed")); + if (pc == -1) + pc = start_PC; + if (pc != -1) + { + buf->append (JvNewStringLatin1 (" at PC ")); + buf->append (pc); + } + + _Jv_InterpMethod *method = current_method; + buf->append (JvNewStringLatin1 (" in ")); + buf->append (current_class->getName()); + buf->append ((jchar) ':'); + buf->append (JvNewStringUTF (method->get_method()->name->data)); + buf->append ((jchar) '('); + buf->append (JvNewStringUTF (method->get_method()->signature->data)); + buf->append ((jchar) ')'); + + buf->append (JvNewStringLatin1 (": ")); + buf->append (JvNewStringLatin1 (s)); + throw new java::lang::VerifyError (buf->toString ()); + } + + public: + + void verify_instructions () + { + branch_prepass (); + verify_instructions_0 (); + } + + _Jv_BytecodeVerifier (_Jv_InterpMethod *m) + { + // We just print the text as utf-8. This is just for debugging + // anyway. + debug_print ("--------------------------------\n"); + debug_print ("-- Verifying method `%s'\n", m->self->name->data); + + current_method = m; + bytecode = m->bytecode (); + exception = m->exceptions (); + current_class = m->defining_class; + + states = NULL; + flags = NULL; + jsr_ptrs = NULL; + utf8_list = NULL; + entry_points = NULL; + } + + ~_Jv_BytecodeVerifier () + { + if (states) + _Jv_Free (states); + if (flags) + _Jv_Free (flags); + + if (jsr_ptrs) + { + for (int i = 0; i < current_method->code_length; ++i) + { + if (jsr_ptrs[i] != NULL) + { + subr_info *info = jsr_ptrs[i]; + while (info != NULL) + { + subr_info *next = info->next; + _Jv_Free (info); + info = next; + } + } + } + _Jv_Free (jsr_ptrs); + } + + while (utf8_list != NULL) + { + linked_utf8 *n = utf8_list->next; + _Jv_Free (utf8_list->val); + _Jv_Free (utf8_list); + utf8_list = n; + } + + while (entry_points != NULL) + { + subr_entry_info *next = entry_points->next; + _Jv_Free (entry_points); + entry_points = next; + } + } + }; + + void + _Jv_VerifyMethod (_Jv_InterpMethod *meth) + { + _Jv_BytecodeVerifier v (meth); + v.verify_instructions (); + } + #endif /* INTERPRETER */ diff -Nrc3pad gcc-3.0.4/libjava/win32-threads.cc gcc-3.1/libjava/win32-threads.cc *** gcc-3.0.4/libjava/win32-threads.cc Sat Dec 30 12:18:39 2000 --- gcc-3.1/libjava/win32-threads.cc Mon Feb 25 02:01:29 2002 *************** *** 1,6 **** // win32-threads.cc - interface between libjava and Win32 threads. ! /* Copyright (C) 1998, 1999 Red Hat, Inc. This file is part of libgcj. --- 1,6 ---- // win32-threads.cc - interface between libjava and Win32 threads. ! /* Copyright (C) 1998, 1999 Free Software Foundation, Inc. This file is part of libgcj. *************** details. */ *** 15,22 **** #ifdef HAVE_BOEHM_GC extern "C" { - #include #include }; #endif /* HAVE_BOEHM_GC */ --- 15,23 ---- #ifdef HAVE_BOEHM_GC extern "C" { #include + // #define's STRICT, which conflicts with Modifier.h + #undef STRICT }; #endif /* HAVE_BOEHM_GC */ *************** extern "C" *** 35,41 **** struct starter { _Jv_ThreadStartFunc *method; - java::lang::Thread *object; _Jv_Thread_t *data; }; --- 36,41 ---- *************** DWORD _Jv_ThreadDataKey; *** 63,112 **** // Condition variables. // int ! _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, jlong millis, jint nanos) { - DWORD time; - DWORD rval; ! // FIXME: check for mutex ownership? _Jv_MutexUnlock (mu); ! if((millis == 0) && (nanos > 0)) ! time = 1; ! else if(millis == 0) ! time = INFINITE; ! else ! time = millis; - rval = WaitForSingleObject (*cv, time); _Jv_MutexLock (mu); ! if (rval == WAIT_FAILED) ! return _JV_NOT_OWNER; // FIXME? ! else ! return 0; } ! // ! // Mutexes. ! // int ! _Jv_MutexLock (_Jv_Mutex_t *mu) { ! DWORD rval; ! // FIXME: Are Win32 mutexs recursive? Should we use critical section objects ! rval = WaitForSingleObject (*mu, INFINITE); ! if (rval == WAIT_FAILED) ! return GetLastError (); // FIXME: Map to errno? ! else if (rval == WAIT_TIMEOUT) ! return ETIMEDOUT; ! else ! return 0; } // --- 63,159 ---- // Condition variables. // + // we do lazy creation of Events since CreateEvent() is insanely + // expensive, and because the rest of libgcj will call _Jv_CondInit + // when only a mutex is needed. + + inline void + ensure_condvar_initialized(_Jv_ConditionVariable_t *cv) + { + if (cv->ev[0] == 0) { + cv->ev[0] = CreateEvent (NULL, 0, 0, NULL); + if (cv->ev[0] == 0) JvFail("CreateEvent() failed"); + cv->ev[1] = CreateEvent (NULL, 1, 0, NULL); + if (cv->ev[1] == 0) JvFail("CreateEvent() failed"); + } + } + + // Reimplementation of the general algorithm described at + // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html (isomorphic to + // 3.2, not a cut-and-paste). + int ! _Jv_CondWait(_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, jlong millis, jint nanos) { ! EnterCriticalSection(&cv->count_mutex); ! ensure_condvar_initialized(cv); ! cv->blocked_count++; ! LeaveCriticalSection(&cv->count_mutex); ! ! DWORD time; ! if ((millis == 0) && (nanos > 0)) time = 1; ! else if (millis == 0) time = INFINITE; ! else time = millis; _Jv_MutexUnlock (mu); ! DWORD rval = WaitForMultipleObjects (2, &(cv->ev[0]), 0, time); ! ! EnterCriticalSection(&cv->count_mutex); ! cv->blocked_count--; ! // If we were unblocked by the second event (the broadcast one) and nobody is ! // left, then reset the signal. ! int last_waiter = rval == WAIT_OBJECT_0 + 1 && cv->blocked_count == 0; ! LeaveCriticalSection(&cv->count_mutex); ! ! if (last_waiter) ResetEvent(&cv->ev[1]); _Jv_MutexLock (mu); ! if (rval == WAIT_FAILED) return GetLastError(); ! else if (rval == WAIT_TIMEOUT) return ETIMEDOUT; ! else return 0; } ! void ! _Jv_CondInit (_Jv_ConditionVariable_t *cv) ! { ! // we do lazy creation of Events since CreateEvent() is insanely expensive ! cv->ev[0] = 0; ! InitializeCriticalSection(&cv->count_mutex); ! cv->blocked_count = 0; ! } ! ! void ! _Jv_CondDestroy (_Jv_ConditionVariable_t *cv) ! { ! if (cv->ev[0] != 0) CloseHandle(cv->ev[0]); ! cv = NULL; ! } int ! _Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *) { ! EnterCriticalSection(&cv->count_mutex); ! ensure_condvar_initialized(cv); ! int somebody_is_blocked = cv->blocked_count > 0; ! LeaveCriticalSection(&cv->count_mutex); ! if (somebody_is_blocked) return SetEvent (cv->ev[0]) ? 0 : GetLastError(); ! else return 0; ! } ! int ! _Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *) ! { ! EnterCriticalSection(&cv->count_mutex); ! ensure_condvar_initialized(cv); ! int somebody_is_blocked = cv->blocked_count > 0; ! LeaveCriticalSection(&cv->count_mutex); ! ! if (somebody_is_blocked) return SetEvent (cv->ev[1]) ? 0 : GetLastError(); ! else return 0; } // *************** _Jv_InitThreads (void) *** 124,133 **** } _Jv_Thread_t * ! _Jv_ThreadInitData (java::lang::Thread *) { ! _Jv_Thread_t *data = new _Jv_Thread_t; data->flags = 0; return data; } --- 171,181 ---- } _Jv_Thread_t * ! _Jv_ThreadInitData (java::lang::Thread* obj) { ! _Jv_Thread_t *data = (_Jv_Thread_t*)_Jv_Malloc(sizeof(_Jv_Thread_t)); data->flags = 0; + data->thread_obj = obj; return data; } *************** _Jv_ThreadInitData (java::lang::Thread * *** 135,141 **** void _Jv_ThreadDestroyData (_Jv_Thread_t *data) { ! delete data; } void --- 183,189 ---- void _Jv_ThreadDestroyData (_Jv_Thread_t *data) { ! _Jv_Free(data); } void *************** _Jv_ThreadSetPriority (_Jv_Thread_t *dat *** 176,192 **** } } // This function is called when a thread is started. We don't arrange // to call the `run' method directly, because this function must // return a value. ! static DWORD __stdcall really_start (void* x) { struct starter *info = (struct starter *) x; ! TlsSetValue (_Jv_ThreadKey, info->object); ! TlsSetValue (_Jv_ThreadDataKey, info->data); ! info->method (info->object); if (! (info->data->flags & FLAG_DAEMON)) { --- 224,254 ---- } } + void + _Jv_ThreadRegister (_Jv_Thread_t *data) + { + TlsSetValue (_Jv_ThreadKey, data->thread_obj); + TlsSetValue (_Jv_ThreadDataKey, data); + } + + void + _Jv_ThreadUnRegister () + { + TlsSetValue (_Jv_ThreadKey, NULL); + TlsSetValue (_Jv_ThreadDataKey, NULL); + } + // This function is called when a thread is started. We don't arrange // to call the `run' method directly, because this function must // return a value. ! static DWORD WINAPI really_start (void* x) { struct starter *info = (struct starter *) x; ! _Jv_ThreadRegister (info->data); ! ! info->method (info->data->thread_obj); if (! (info->data->flags & FLAG_DAEMON)) { *************** _Jv_ThreadStart (java::lang::Thread *thr *** 214,220 **** // FIXME: handle marking the info object for GC. info = (struct starter *) _Jv_AllocBytes (sizeof (struct starter)); info->method = meth; - info->object = thread; info->data = data; if (! thread->isDaemon ()) --- 276,281 ---- *************** _Jv_ThreadStart (java::lang::Thread *thr *** 226,232 **** else data->flags |= FLAG_DAEMON; ! HANDLE h = CreateThread(NULL, 0, really_start, info, 0, &id); _Jv_ThreadSetPriority(data, thread->getPriority()); //if (!h) --- 287,293 ---- else data->flags |= FLAG_DAEMON; ! HANDLE h = GC_CreateThread(NULL, 0, really_start, info, 0, &id); _Jv_ThreadSetPriority(data, thread->getPriority()); //if (!h) diff -Nrc3pad gcc-3.0.4/libjava/win32.cc gcc-3.1/libjava/win32.cc *** gcc-3.0.4/libjava/win32.cc Thu Jan 1 00:00:00 1970 --- gcc-3.1/libjava/win32.cc Wed Apr 24 01:04:44 2002 *************** *** 0 **** --- 1,219 ---- + // win32.cc - Helper functions for Microsoft-flavored OSs. + + /* Copyright (C) 2002 Free Software Foundation + + This file is part of libgcj. + + This software is copyrighted work licensed under the terms of the + Libgcj License. Please consult the file "LIBGCJ_LICENSE" for + details. */ + + #include + #include + #include + #include + + #include "platform.h" + #include + #include + + static LONG CALLBACK + win32_exception_handler (LPEXCEPTION_POINTERS e) + { + if (e->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) + _Jv_ThrowNullPointerException(); + else if (e->ExceptionRecord->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO) + throw new java::lang::ArithmeticException; + else + return EXCEPTION_CONTINUE_SEARCH; + } + + // Platform-specific VM initialization. + void + _Jv_platform_initialize (void) + { + // Initialise winsock for networking + WSADATA data; + if (WSAStartup (MAKEWORD (1, 1), &data)) + MessageBox (NULL, "Error initialising winsock library.", "Error", + MB_OK | MB_ICONEXCLAMATION); + // Install exception handler + SetUnhandledExceptionFilter (win32_exception_handler); + } + + // gettimeofday implementation. + jlong + _Jv_platform_gettimeofday () + { + struct timeb t; + ftime (&t); + return t.time * 1000LL + t.millitm; + } + + // The following definitions "fake out" mingw to think that -mthreads + // was enabled and that mingwthr.dll was linked. GCJ-compiled + // applications don't need this helper library because we can safely + // detect thread death (return from Thread.run()). + + int _CRT_MT = 1; + + extern "C" int + __mingwthr_key_dtor (DWORD, void (*) (void *)) + { + // FIXME: for now we do nothing; this causes a memory leak of + // approximately 24 bytes per thread created. + return 0; + } + + // Set platform-specific System properties. + void + _Jv_platform_initProperties (java::util::Properties* newprops) + { + // A convenience define. + #define SET(Prop,Val) \ + newprops->put(JvNewStringLatin1 (Prop), JvNewStringLatin1 (Val)) + + SET ("file.separator", "\\"); + SET ("path.separator", ";"); + SET ("line.separator", "\r\n"); + + // Use GetCurrentDirectory to set 'user.dir'. + DWORD buflen = MAX_PATH; + char *buffer = (char *) _Jv_MallocUnchecked (buflen); + if (buffer != NULL) + { + if (GetCurrentDirectory (buflen, buffer)) + SET ("user.dir", buffer); + + if (GetTempPath (buflen, buffer)) + SET ("java.io.tmpdir", buffer); + + _Jv_Free (buffer); + } + + // Use GetUserName to set 'user.name'. + buflen = 257; // UNLEN + 1 + buffer = (char *) _Jv_MallocUnchecked (buflen); + if (buffer != NULL) + { + if (GetUserName (buffer, &buflen)) + SET ("user.name", buffer); + _Jv_Free (buffer); + } + + // According to the api documentation for 'GetWindowsDirectory()', the + // environmental variable HOMEPATH always specifies the user's home + // directory or a default directory. On the 3 windows machines I checked + // only 1 had it set. If it's not set, JDK1.3.1 seems to set it to + // the windows directory, so we'll do the same. + char *userHome = NULL; + if ((userHome = ::getenv ("HOMEPATH")) == NULL ) + { + // Check HOME since it's what I use. + if ((userHome = ::getenv ("HOME")) == NULL ) + { + // Not found - use the windows directory like JDK1.3.1 does. + char *winHome = (char *) _Jv_MallocUnchecked (MAX_PATH); + if (winHome != NULL) + { + if (GetWindowsDirectory (winHome, MAX_PATH)) + SET ("user.home", winHome); + _Jv_Free (winHome); + } + } + } + if (userHome != NULL) + SET ("user.home", userHome); + + // Get and set some OS info. + OSVERSIONINFO osvi; + ZeroMemory (&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if (GetVersionEx (&osvi)) + { + char *buffer = (char *) _Jv_MallocUnchecked (30); + if (buffer != NULL) + { + sprintf (buffer, "%d.%d", (int) osvi.dwMajorVersion, + (int) osvi.dwMinorVersion); + SET ("os.version", buffer); + _Jv_Free (buffer); + } + + switch (osvi.dwPlatformId) + { + case VER_PLATFORM_WIN32_WINDOWS: + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) + SET ("os.name", "Windows 95"); + else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) + SET ("os.name", "Windows 98"); + else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) + SET ("os.name", "Windows Me"); + else + SET ("os.name", "Windows ??"); + break; + + case VER_PLATFORM_WIN32_NT: + if (osvi.dwMajorVersion <= 4 ) + SET ("os.name", "Windows NT"); + else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) + SET ("os.name", "Windows 2000"); + else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) + SET ("os.name", "Windows XP"); + else + SET ("os.name", "Windows NT ??"); + break; + + default: + SET ("os.name", "Windows UNKNOWN"); + break; + } + } + + // Set the OS architecture. + SYSTEM_INFO si; + GetSystemInfo (&si); + switch (si.dwProcessorType) + { + case PROCESSOR_INTEL_386: + SET ("os.arch", "i386"); + break; + case PROCESSOR_INTEL_486: + SET ("os.arch", "i486"); + break; + case PROCESSOR_INTEL_PENTIUM: + SET ("os.arch", "i586"); + break; + case PROCESSOR_MIPS_R4000: + SET ("os.arch", "MIPS4000"); + break; + case PROCESSOR_ALPHA_21064: + SET ("os.arch", "ALPHA"); + break; + default: + SET ("os.arch", "unknown"); + break; + } + } + + /* Store up to SIZE return address of the current program state in + ARRAY and return the exact number of values stored. */ + int + backtrace (void **__array, int __size) + { + register void *_ebp __asm__ ("ebp"); + register void *_esp __asm__ ("esp"); + unsigned int *rfp; + + int i=0; + for (rfp = *(unsigned int**)_ebp; + rfp && i < __size; + rfp = *(unsigned int **)rfp) + { + int diff = *rfp - (unsigned int)rfp; + if ((void*)rfp < _esp || diff > 4 * 1024 || diff < 0) break; + + __array[i++] = (void*)(rfp[1]-4); + } + return i; + } diff -Nrc3pad gcc-3.0.4/zlib/ChangeLog gcc-3.1/zlib/ChangeLog *** gcc-3.0.4/zlib/ChangeLog Wed Feb 20 18:47:42 2002 --- gcc-3.1/zlib/ChangeLog Wed May 15 02:27:34 2002 *************** *** 1,30 **** ! 2002-02-20 Release Manager ! ! * GCC 3.0.4 Released. ! ! 2001-12-20 Release Manager ! ! * GCC 3.0.3 Released. ! ! 2001-10-23 Release Manager ! * GCC 3.0.2 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 2001-08-19 Release Manager ! * GCC 3.0.1 Released. ! 20010617 Release Manager ! * GCC 3.0 Released. ChangeLog file for zlib Changes in 1.1.3 (9 July 1998) - fix "an inflate input buffer bug that shows up on rare but persistent occasions" (Mark) --- 1,36 ---- ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-14 Release Manager ! * GCC 3.1 Released. ! 2002-05-08 Alexandre Oliva ! * configure.in (ORIGINAL_LD_FOR_MULTILIBS): Preserve LD at ! script entry, and set LD to it when configuring multilibs. ! * configure: Rebuilt. ! 2001-06-09 Alexandre Oliva , Stephen L Moshier ! * configure.in (AC_EXEEXT): Work around in case it expands to ! nothing, as in autoconf 2.50. ! * configure: Rebuilt. ChangeLog file for zlib + Changes in 1.1.4 (11 March 2002) + - ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in + http://www.zlib.org/advisory-2002-03-11.txt + - Returned incorrect error (Z_MEM_ERROR) on some invalid data + - Avoid accesses before window for invalid distances with inflate window + less than 32K. + - force windowBits > 8 to avoid a bug in the encoder for a window size + of 256 bytes. (A complete fix will be available in 1.1.5). + Changes in 1.1.3 (9 July 1998) - fix "an inflate input buffer bug that shows up on rare but persistent occasions" (Mark) *************** Changes in 1.0.6 (19 Jan 1998) *** 239,245 **** - use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) - added makelcc.bat for lcc-win32 (Tom St Denis) - in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) ! - Avoid expanded $Id: ChangeLog,v 1.1.8.6 2002/02/20 18:47:42 mmitchel Exp $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. - check for unistd.h in configure (for off_t) - remove useless check parameter in inflate_blocks_free - avoid useless assignment of s->check to itself in inflate_blocks_new --- 245,251 ---- - use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) - added makelcc.bat for lcc-win32 (Tom St Denis) - in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) ! - Avoid expanded $Id: ChangeLog,v 1.2.16.4 2002/05/15 02:27:34 mmitchel Exp $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. - check for unistd.h in configure (for off_t) - remove useless check parameter in inflate_blocks_free - avoid useless assignment of s->check to itself in inflate_blocks_new diff -Nrc3pad gcc-3.0.4/zlib/ChangeLog.gcj gcc-3.1/zlib/ChangeLog.gcj *** gcc-3.0.4/zlib/ChangeLog.gcj Tue Jul 3 22:29:13 2001 --- gcc-3.1/zlib/ChangeLog.gcj Sun Mar 17 00:45:47 2002 *************** *** 1,3 **** --- 1,12 ---- + 2002-03-17 Bryce McKinlay + + * Makefile.am: Make target library a convenience library. + * Makefile.in: Rebuilt. + + 2002-03-11 Tom Tromey + + * ChangeLog.gcj: Imported 1.1.4, while preserving local changes. + 2001-07-03 Tom Tromey Fix for PR bootstrap/3281: diff -Nrc3pad gcc-3.0.4/zlib/FAQ gcc-3.1/zlib/FAQ *** gcc-3.0.4/zlib/FAQ Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/FAQ Mon Mar 11 22:18:17 2002 *************** *** 3,72 **** If your question is not there, please check the zlib home page ! http://www.cdrom.com/pub/infozip/zlib/ which may have more recent information. ! 1) I need a Windows DLL ! 2) I need a Visual Basic interface to zlib ! 3) compress() returns Z_BUF_ERROR ! 4) deflate or inflate returns Z_BUF_ERROR ! 5) Where is the zlib documentation (man pages, etc...)? ! 6) Why don't you use GNU autoconf, libtool, etc...? ! 7) There is a bug in zlib. ! 8) I get "undefined reference to gzputc" ! 1) I need a Windows DLL ! The zlib sources can be compiled without change to produce a DLL. ! If you want a precompiled DLL, see http://www.winimage.com/zLibDll ! 2) I need a Visual Basic interface to zlib ! See http://www.tcfb.com/dowseware/cmp-z-it.zip ! http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm ! and contrib/visual-basic.txt ! 3) compress() returns Z_BUF_ERROR ! Make sure that before the call of compress, the length of the ! compressed buffer is equal to the total size of the compressed buffer ! and not zero. For Visual Basic, check that this parameter is passed ! by reference ("as any"), not by value ("as long"). ! 4) deflate or inflate returns Z_BUF_ERROR ! Make sure that before the call avail_in and avail_out are not zero. ! 5) Where is the zlib documentation (man pages, etc...)? ! It's in zlib.h for the moment. Volunteers to transform this ! to man pages, please contact jloup@gzip.org. Examples of zlib usage ! are in the files example.c and minigzip.c. ! 6) Why don't you use GNU autoconf, libtool, etc...? ! Because we would like to keep zlib as a very small and simple package. ! zlib is rather portable and doesn't need much configuration. ! 7) There is a bug in zlib. ! Most of the time, such problems are due to an incorrect usage ! of zlib. Please try to reproduce the problem with a small ! program and send us the corresponding source at zlib@quest.jpl.nasa.gov ! Do not send multi-megabyte data files without prior agreement. ! 8) I get "undefined reference to gzputc" ! If "make test" produces something like ! example.o(.text+0x174): ! check that you don't have old files libz.* in /usr/lib, /usr/local/lib ! or /usr/X11R6/lib. Remove old versions then do "make install". --- 3,100 ---- If your question is not there, please check the zlib home page ! http://www.zlib.org which may have more recent information. ! The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html ! 1. Is zlib Y2K-compliant? + Yes. zlib doesn't handle dates. + 2. Where can I get a Windows DLL version? ! The zlib sources can be compiled without change to produce a DLL. If you ! want a precompiled DLL, see http://www.winimage.com/zLibDll/ . Questions ! about the zlib DLL should be sent to Gilles Vollant (info@winimage.com). ! 3. Where can I get a Visual Basic interface to zlib? + See + * http://www.winimage.com/zLibDll/cmp-z-it.zip + * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm + * contrib/visual-basic.txt in the zlib distribution ! 4. compress() returns Z_BUF_ERROR ! Make sure that before the call of compress, the length of the compressed ! buffer is equal to the total size of the compressed buffer and not ! zero. For Visual Basic, check that this parameter is passed by reference ! ("as any"), not by value ("as long"). ! 5. deflate() or inflate() returns Z_BUF_ERROR ! Before making the call, make sure that avail_in and avail_out are not ! zero. When setting the parameter flush equal to Z_FINISH, also make sure ! that avail_out is big enough to allow processing all pending input. + 6. Where's the zlib documentation (man pages, etc.)? ! It's in zlib.h for the moment, and Francis S. Lin has converted it to a ! web page zlib.html. Volunteers to transform this to Unix-style man pages, ! please contact Jean-loup Gailly (jloup@gzip.org). Examples of zlib usage ! are in the files example.c and minigzip.c. ! 7. Why don't you use GNU autoconf or libtool or ...? + Because we would like to keep zlib as a very small and simple + package. zlib is rather portable and doesn't need much configuration. ! 8. I found a bug in zlib. ! Most of the time, such problems are due to an incorrect usage of ! zlib. Please try to reproduce the problem with a small program and send ! the corresponding source to us at zlib@gzip.org . Do not send ! multi-megabyte data files without prior agreement. + 9. Why do I get "undefined reference to gzputc"? ! If "make test" produces something like ! example.o(.text+0x154): undefined reference to `gzputc' ! ! check that you don't have old files libz.* in /usr/lib, /usr/local/lib or ! /usr/X11R6/lib. Remove any old versions, then do "make install". + 10. I need a Delphi interface to zlib. ! See the directories contrib/delphi and contrib/delphi2 in the zlib ! distribution. ! 11. Can zlib handle .zip archives? ! ! See the directory contrib/minizip in the zlib distribution. + 12. Can zlib handle .Z files? ! No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt ! the code of uncompress on your own. ! 13. How can I make a Unix shared library? ! ! make clean ! ./configure -s ! make + 14. Why does "make test" fail on Mac OS X? + + Mac OS X already includes zlib as a shared library, and so -lz links the + shared library instead of the one that the "make" compiled. For zlib + 1.1.3, the two are incompatible due to different compile-time + options. Simply change the -lz in the Makefile to libz.a, and it will use + the compiled library instead of the shared one and the "make test" will + succeed. + + 15. I have a question about OttoPDF + + We are not the authors of OttoPDF. The real author is on the OttoPDF web + site Joel Hainley jhainley@myndkryme.com. diff -Nrc3pad gcc-3.0.4/zlib/Makefile.am gcc-3.1/zlib/Makefile.am *** gcc-3.0.4/zlib/Makefile.am Sun Sep 3 19:54:20 2000 --- gcc-3.1/zlib/Makefile.am Sun Mar 17 00:45:47 2002 *************** inffixed.h inflate.c inftrees.c inftrees *** 25,36 **** trees.h uncompr.c zconf.h zlib.h zutil.c zutil.h if TARGET_LIBRARY ! ## We don't use `libz.la' because we don't want to conflict with a ! ## system library of that name. ! toolexeclib_LTLIBRARIES = @target_all@ ! EXTRA_LTLIBRARIES = libzgcj.la ! libzgcj_la_SOURCES = $(ZLIB_SOURCES) ! libzgcj_la_LDFLAGS = -version-info 0:0:0 -rpath $(toolexeclibdir) else toolexeclib_LIBRARIES = libz.a libz_a_SOURCES = $(ZLIB_SOURCES) --- 25,32 ---- trees.h uncompr.c zconf.h zlib.h zutil.c zutil.h if TARGET_LIBRARY ! noinst_LTLIBRARIES = libzgcj_convenience.la ! libzgcj_convenience_la_SOURCES = $(ZLIB_SOURCES) else toolexeclib_LIBRARIES = libz.a libz_a_SOURCES = $(ZLIB_SOURCES) diff -Nrc3pad gcc-3.0.4/zlib/Makefile.in gcc-3.1/zlib/Makefile.in *** gcc-3.0.4/zlib/Makefile.in Tue Jul 3 22:29:13 2001 --- gcc-3.1/zlib/Makefile.in Sun Mar 17 00:45:47 2002 *************** *** 1,6 **** ! # Makefile.in generated automatically by automake 1.4 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. --- 1,6 ---- ! # Makefile.in generated automatically by automake 1.4-p5 from Makefile.am ! # Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. *************** MULTIDIRS = *** 96,107 **** MULTISUBDIR = MULTIDO = true MULTICLEAN = true ! @USE_LIBDIR_TRUE@toolexeclibdir = \ ! @USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexeclibdir = \ ! @USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexecdir = \ ! @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) ZLIB_SOURCES = adler32.c compress.c crc32.c deflate.c deflate.h \ gzio.c infblock.c infblock.h infcodes.c infcodes.h inffast.c inffast.h \ --- 96,104 ---- MULTISUBDIR = MULTIDO = true MULTICLEAN = true ! @USE_LIBDIR_TRUE@toolexeclibdir = @USE_LIBDIR_TRUE@$(libdir)$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexeclibdir = @USE_LIBDIR_FALSE@$(toolexecdir)/lib$(MULTISUBDIR) ! @USE_LIBDIR_FALSE@toolexecdir = @USE_LIBDIR_FALSE@$(exec_prefix)/$(target_alias) ZLIB_SOURCES = adler32.c compress.c crc32.c deflate.c deflate.h \ gzio.c infblock.c infblock.h infcodes.c infcodes.h inffast.c inffast.h \ *************** inffixed.h inflate.c inftrees.c inftrees *** 109,126 **** trees.h uncompr.c zconf.h zlib.h zutil.c zutil.h ! @TARGET_LIBRARY_TRUE@toolexeclib_LTLIBRARIES = \ ! @TARGET_LIBRARY_TRUE@@target_all@ ! @TARGET_LIBRARY_TRUE@EXTRA_LTLIBRARIES = \ ! @TARGET_LIBRARY_TRUE@libzgcj.la ! @TARGET_LIBRARY_TRUE@libzgcj_la_SOURCES = \ ! @TARGET_LIBRARY_TRUE@$(ZLIB_SOURCES) ! @TARGET_LIBRARY_TRUE@libzgcj_la_LDFLAGS = \ ! @TARGET_LIBRARY_TRUE@-version-info 0:0:0 -rpath $(toolexeclibdir) ! @TARGET_LIBRARY_FALSE@toolexeclib_LIBRARIES = \ ! @TARGET_LIBRARY_FALSE@libz.a ! @TARGET_LIBRARY_FALSE@libz_a_SOURCES = \ ! @TARGET_LIBRARY_FALSE@$(ZLIB_SOURCES) # Work around what appears to be a GNU make bug handling MAKEFLAGS # values defined in terms of make variables, as is the case for CC and --- 106,115 ---- trees.h uncompr.c zconf.h zlib.h zutil.c zutil.h ! @TARGET_LIBRARY_TRUE@noinst_LTLIBRARIES = @TARGET_LIBRARY_TRUE@libzgcj_convenience.la ! @TARGET_LIBRARY_TRUE@libzgcj_convenience_la_SOURCES = @TARGET_LIBRARY_TRUE@$(ZLIB_SOURCES) ! @TARGET_LIBRARY_FALSE@toolexeclib_LIBRARIES = @TARGET_LIBRARY_FALSE@libz.a ! @TARGET_LIBRARY_FALSE@libz_a_SOURCES = @TARGET_LIBRARY_FALSE@$(ZLIB_SOURCES) # Work around what appears to be a GNU make bug handling MAKEFLAGS # values defined in terms of make variables, as is the case for CC and *************** libz_a_LIBADD = *** 181,193 **** @TARGET_LIBRARY_FALSE@inftrees.$(OBJEXT) infutil.$(OBJEXT) \ @TARGET_LIBRARY_FALSE@trees.$(OBJEXT) uncompr.$(OBJEXT) zutil.$(OBJEXT) AR = ar ! LTLIBRARIES = $(toolexeclib_LTLIBRARIES) ! libzgcj_la_LIBADD = ! @TARGET_LIBRARY_TRUE@libzgcj_la_OBJECTS = adler32.lo compress.lo \ ! @TARGET_LIBRARY_TRUE@crc32.lo deflate.lo gzio.lo infblock.lo \ ! @TARGET_LIBRARY_TRUE@infcodes.lo inffast.lo inflate.lo inftrees.lo \ ! @TARGET_LIBRARY_TRUE@infutil.lo trees.lo uncompr.lo zutil.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) --- 170,184 ---- @TARGET_LIBRARY_FALSE@inftrees.$(OBJEXT) infutil.$(OBJEXT) \ @TARGET_LIBRARY_FALSE@trees.$(OBJEXT) uncompr.$(OBJEXT) zutil.$(OBJEXT) AR = ar ! LTLIBRARIES = $(noinst_LTLIBRARIES) ! libzgcj_convenience_la_LDFLAGS = ! libzgcj_convenience_la_LIBADD = ! @TARGET_LIBRARY_TRUE@libzgcj_convenience_la_OBJECTS = adler32.lo \ ! @TARGET_LIBRARY_TRUE@compress.lo crc32.lo deflate.lo gzio.lo \ ! @TARGET_LIBRARY_TRUE@infblock.lo infcodes.lo inffast.lo inflate.lo \ ! @TARGET_LIBRARY_TRUE@inftrees.lo infutil.lo trees.lo uncompr.lo \ ! @TARGET_LIBRARY_TRUE@zutil.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) *************** aclocal.m4 configure configure.in *** 199,208 **** DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = tar GZIP_ENV = --best ! SOURCES = $(libz_a_SOURCES) $(libzgcj_la_SOURCES) ! OBJECTS = $(libz_a_OBJECTS) $(libzgcj_la_OBJECTS) all: all-redirect .SUFFIXES: --- 190,199 ---- DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ! TAR = gtar GZIP_ENV = --best ! SOURCES = $(libz_a_SOURCES) $(libzgcj_convenience_la_SOURCES) ! OBJECTS = $(libz_a_OBJECTS) $(libzgcj_convenience_la_OBJECTS) all: all-redirect .SUFFIXES: *************** libz.a: $(libz_a_OBJECTS) $(libz_a_DEPEN *** 303,335 **** $(AR) cru libz.a $(libz_a_OBJECTS) $(libz_a_LIBADD) $(RANLIB) libz.a ! mostlyclean-toolexeclibLTLIBRARIES: ! ! clean-toolexeclibLTLIBRARIES: ! -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) ! ! distclean-toolexeclibLTLIBRARIES: ! maintainer-clean-toolexeclibLTLIBRARIES: ! install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) ! @$(NORMAL_INSTALL) ! $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) ! @list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ ! if test -f $$p; then \ ! echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p"; \ ! $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(toolexeclibdir)/$$p; \ ! else :; fi; \ ! done ! uninstall-toolexeclibLTLIBRARIES: ! @$(NORMAL_UNINSTALL) ! list='$(toolexeclib_LTLIBRARIES)'; for p in $$list; do \ ! $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(toolexeclibdir)/$$p; \ ! done ! libzgcj.la: $(libzgcj_la_OBJECTS) $(libzgcj_la_DEPENDENCIES) ! $(LINK) $(libzgcj_la_LDFLAGS) $(libzgcj_la_OBJECTS) $(libzgcj_la_LIBADD) $(LIBS) tags: TAGS --- 294,310 ---- $(AR) cru libz.a $(libz_a_OBJECTS) $(libz_a_LIBADD) $(RANLIB) libz.a ! mostlyclean-noinstLTLIBRARIES: ! clean-noinstLTLIBRARIES: ! -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) ! distclean-noinstLTLIBRARIES: ! maintainer-clean-noinstLTLIBRARIES: ! libzgcj_convenience.la: $(libzgcj_convenience_la_OBJECTS) $(libzgcj_convenience_la_DEPENDENCIES) ! $(LINK) $(libzgcj_convenience_la_LDFLAGS) $(libzgcj_convenience_la_OBJECTS) $(libzgcj_convenience_la_LIBADD) $(LIBS) tags: TAGS *************** distdir: $(DISTFILES) *** 401,407 **** @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ ! cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ --- 376,382 ---- @for file in $(DISTFILES); do \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ ! cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ *************** installcheck-am: *** 418,425 **** installcheck: installcheck-am install-info-am: install-info: install-info-am ! install-exec-am: install-toolexeclibLIBRARIES \ ! install-toolexeclibLTLIBRARIES install-exec: install-exec-am install-data-am: --- 393,399 ---- installcheck: installcheck-am install-info-am: install-info: install-info-am ! install-exec-am: install-toolexeclibLIBRARIES install-exec: install-exec-am install-data-am: *************** install-data: install-data-am *** 428,443 **** install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am ! uninstall-am: uninstall-toolexeclibLIBRARIES \ ! uninstall-toolexeclibLTLIBRARIES uninstall: uninstall-am all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: ! $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) \ ! $(DESTDIR)$(toolexeclibdir) mostlyclean-generic: --- 402,415 ---- install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am ! uninstall-am: uninstall-toolexeclibLIBRARIES uninstall: uninstall-am all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: ! $(mkinstalldirs) $(DESTDIR)$(toolexeclibdir) mostlyclean-generic: *************** distclean-generic: *** 450,468 **** maintainer-clean-generic: mostlyclean-am: mostlyclean-toolexeclibLIBRARIES mostlyclean-compile \ ! mostlyclean-libtool mostlyclean-toolexeclibLTLIBRARIES \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-toolexeclibLIBRARIES clean-compile clean-libtool \ ! clean-toolexeclibLTLIBRARIES clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-toolexeclibLIBRARIES distclean-compile \ ! distclean-libtool distclean-toolexeclibLTLIBRARIES \ distclean-tags distclean-generic clean-am -rm -f libtool --- 422,440 ---- maintainer-clean-generic: mostlyclean-am: mostlyclean-toolexeclibLIBRARIES mostlyclean-compile \ ! mostlyclean-libtool mostlyclean-noinstLTLIBRARIES \ mostlyclean-tags mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-toolexeclibLIBRARIES clean-compile clean-libtool \ ! clean-noinstLTLIBRARIES clean-tags clean-generic \ mostlyclean-am clean: clean-am distclean-am: distclean-toolexeclibLIBRARIES distclean-compile \ ! distclean-libtool distclean-noinstLTLIBRARIES \ distclean-tags distclean-generic clean-am -rm -f libtool *************** distclean: distclean-am *** 471,477 **** maintainer-clean-am: maintainer-clean-toolexeclibLIBRARIES \ maintainer-clean-compile maintainer-clean-libtool \ ! maintainer-clean-toolexeclibLTLIBRARIES \ maintainer-clean-tags maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" --- 443,449 ---- maintainer-clean-am: maintainer-clean-toolexeclibLIBRARIES \ maintainer-clean-compile maintainer-clean-libtool \ ! maintainer-clean-noinstLTLIBRARIES \ maintainer-clean-tags maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" *************** clean-toolexeclibLIBRARIES maintainer-cl *** 485,501 **** uninstall-toolexeclibLIBRARIES install-toolexeclibLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile mostlyclean-libtool distclean-libtool \ ! clean-libtool maintainer-clean-libtool \ ! mostlyclean-toolexeclibLTLIBRARIES distclean-toolexeclibLTLIBRARIES \ ! clean-toolexeclibLTLIBRARIES maintainer-clean-toolexeclibLTLIBRARIES \ ! uninstall-toolexeclibLTLIBRARIES install-toolexeclibLTLIBRARIES tags \ ! mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \ ! distdir info-am info dvi-am dvi check check-am installcheck-am \ ! installcheck install-info-am install-info install-exec-am install-exec \ ! install-data-am install-data install-am install uninstall-am uninstall \ ! all-redirect all-am all installdirs mostlyclean-generic \ ! distclean-generic clean-generic maintainer-clean-generic clean \ ! mostlyclean distclean maintainer-clean # Multilib support. --- 457,471 ---- uninstall-toolexeclibLIBRARIES install-toolexeclibLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile mostlyclean-libtool distclean-libtool \ ! clean-libtool maintainer-clean-libtool mostlyclean-noinstLTLIBRARIES \ ! distclean-noinstLTLIBRARIES clean-noinstLTLIBRARIES \ ! maintainer-clean-noinstLTLIBRARIES tags mostlyclean-tags distclean-tags \ ! clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ ! check-am installcheck-am installcheck install-info-am install-info \ ! install-exec-am install-exec install-data-am install-data install-am \ ! install uninstall-am uninstall all-redirect all-am all installdirs \ ! mostlyclean-generic distclean-generic clean-generic \ ! maintainer-clean-generic clean mostlyclean distclean maintainer-clean # Multilib support. diff -Nrc3pad gcc-3.0.4/zlib/README gcc-3.1/zlib/README *** gcc-3.0.4/zlib/README Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/README Mon Mar 11 22:18:17 2002 *************** *** 1,7 **** ! zlib 1.1.3 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files ! ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). These documents are also available in other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html --- 1,7 ---- ! zlib 1.1.4 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files ! http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). These documents are also available in other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html *************** except example.c and minigzip.c. *** 14,64 **** To compile all files and run the test program, follow the instructions given at the top of Makefile. In short "make test; make install" ! should work for most machines. For Unix: "configure; make test; make install" For MSDOS, use one of the special makefiles such as Makefile.msc. For VMS, use Make_vms.com or descrip.mms. ! Questions about zlib should be sent to , or to Gilles Vollant for the Windows DLL version. ! The zlib home page is http://www.cdrom.com/pub/infozip/zlib/ ! The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/ ! Before reporting a problem, please check those sites to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. ! Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available in ! http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm ! The changes made in version 1.1.3 are documented in the file ChangeLog. ! The main changes since 1.1.2 are: ! - fix "an inflate input buffer bug that shows up on rare but persistent ! occasions" (Mark) ! - fix gzread and gztell for concatenated .gz files (Didier Le Botlan) ! - fix gzseek(..., SEEK_SET) in write mode ! - fix crc check after a gzeek (Frank Faubert) ! - fix miniunzip when the last entry in a zip file is itself a zip file ! (J Lillge) ! - add contrib/asm586 and contrib/asm686 (Brian Raiter) ! See http://www.muppetlabs.com/~breadbox/software/assembly.html ! - add support for Delphi 3 in contrib/delphi (Bob Dellaca) ! - add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) ! - do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) ! - use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) ! - added a FAQ file - plus many changes for portability. Unsupported third party contributions are provided in directory "contrib". ! A Java implementation of zlib is available in the Java Development Kit 1.1 http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html ! See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details. A Perl interface to zlib written by Paul Marquess ! is in the CPAN (Comprehensive Perl Archive Network) sites, such as: ! ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib* A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see --- 14,63 ---- To compile all files and run the test program, follow the instructions given at the top of Makefile. In short "make test; make install" ! should work for most machines. For Unix: "./configure; make test; make install" For MSDOS, use one of the special makefiles such as Makefile.msc. For VMS, use Make_vms.com or descrip.mms. ! Questions about zlib should be sent to , or to Gilles Vollant for the Windows DLL version. ! The zlib home page is http://www.zlib.org or http://www.gzip.org/zlib/ ! Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. ! PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html ! before asking for help. ! ! Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available in ! http://dogma.net/markn/articles/zlibtool/zlibtool.htm ! The changes made in version 1.1.4 are documented in the file ChangeLog. ! The only changes made since 1.1.3 are bug corrections: ! - ZFREE was repeated on same allocation on some error conditions. ! This creates a security problem described in ! http://www.zlib.org/advisory-2002-03-11.txt ! - Returned incorrect error (Z_MEM_ERROR) on some invalid data ! - Avoid accesses before window for invalid distances with inflate window ! less than 32K. ! - force windowBits > 8 to avoid a bug in the encoder for a window size ! of 256 bytes. (A complete fix will be available in 1.1.5). ! ! The beta version 1.1.5beta includes many more changes. A new official ! version 1.1.5 will be released as soon as extensive testing has been ! completed on it. Unsupported third party contributions are provided in directory "contrib". ! A Java implementation of zlib is available in the Java Development Kit http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html ! See the zlib home page http://www.zlib.org for details. A Perl interface to zlib written by Paul Marquess ! is in the CPAN (Comprehensive Perl Archive Network) sites ! http://www.cpan.org/modules/by-module/Compress/ A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see *************** Acknowledgments: *** 117,123 **** Copyright notice: ! (C) 1995-1998 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages --- 116,122 ---- Copyright notice: ! (C) 1995-2002 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff -Nrc3pad gcc-3.0.4/zlib/adler32.c gcc-3.1/zlib/adler32.c *** gcc-3.0.4/zlib/adler32.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/adler32.c Mon Mar 11 22:18:17 2002 *************** *** 1,9 **** /* adler32.c -- compute the Adler-32 checksum of a data stream ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: adler32.c,v 1.1 1999/05/04 19:30:26 tromey Exp $ */ #include "zlib.h" --- 1,9 ---- /* adler32.c -- compute the Adler-32 checksum of a data stream ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: adler32.c,v 1.1.26.1 2002/03/11 22:18:17 tromey Exp $ */ #include "zlib.h" diff -Nrc3pad gcc-3.0.4/zlib/compress.c gcc-3.1/zlib/compress.c *** gcc-3.0.4/zlib/compress.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/compress.c Mon Mar 11 22:18:17 2002 *************** *** 1,9 **** /* compress.c -- compress a memory buffer ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: compress.c,v 1.1 1999/05/04 19:30:26 tromey Exp $ */ #include "zlib.h" --- 1,9 ---- /* compress.c -- compress a memory buffer ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: compress.c,v 1.1.26.1 2002/03/11 22:18:17 tromey Exp $ */ #include "zlib.h" diff -Nrc3pad gcc-3.0.4/zlib/configure gcc-3.1/zlib/configure *** gcc-3.0.4/zlib/configure Tue Jul 3 22:29:13 2001 --- gcc-3.1/zlib/configure Wed May 8 04:28:44 2002 *************** fi *** 557,562 **** --- 557,568 ---- + # This works around the fact that libtool configuration may change LD + # for this particular configuration, but some shells, instead of + # keeping the changes in LD private, export them just because LD is + # exported. + ORIGINAL_LD_FOR_MULTILIBS=$LD + if test "x${with_target_subdir}" != x && \ test "${srcdir}" = "."; then *************** else { echo "configure: error: can not r *** 640,646 **** fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:644: checking host system type" >&5 host_alias=$host case "$host_alias" in --- 646,652 ---- fi echo $ac_n "checking host system type""... $ac_c" 1>&6 ! echo "configure:650: checking host system type" >&5 host_alias=$host case "$host_alias" in *************** host_os=`echo $host | sed 's/^\([^-]*\)- *** 661,667 **** echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 ! echo "configure:665: checking target system type" >&5 target_alias=$target case "$target_alias" in --- 667,673 ---- echo "$ac_t""$host" 1>&6 echo $ac_n "checking target system type""... $ac_c" 1>&6 ! echo "configure:671: checking target system type" >&5 target_alias=$target case "$target_alias" in *************** target_os=`echo $target | sed 's/^\([^-] *** 679,685 **** echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:683: checking build system type" >&5 build_alias=$build case "$build_alias" in --- 685,691 ---- echo "$ac_t""$target" 1>&6 echo $ac_n "checking build system type""... $ac_c" 1>&6 ! echo "configure:689: checking build system type" >&5 build_alias=$build case "$build_alias" in *************** mkinstalldirs="`cd $ac_aux_dir && pwd`/m *** 718,724 **** # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:722: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 724,730 ---- # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ! echo "configure:728: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** test -z "$INSTALL_SCRIPT" && INSTALL_SCR *** 771,777 **** test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:775: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile --- 777,783 ---- test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ! echo "configure:781: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile *************** test "$program_suffix" != NONE && *** 828,834 **** test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:832: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 834,840 ---- test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ! echo "configure:838: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** EOF *** 874,880 **** missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:878: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 880,886 ---- missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ! echo "configure:884: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 887,893 **** fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:891: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 893,899 ---- fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ! echo "configure:897: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 900,906 **** fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:904: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 906,912 ---- fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 ! echo "configure:910: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 913,919 **** fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:917: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 919,925 ---- fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ! echo "configure:923: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** else *** 926,932 **** fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:930: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. --- 932,938 ---- fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ! echo "configure:936: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. *************** fi *** 941,947 **** echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:945: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" --- 947,953 ---- echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 ! echo "configure:951: checking whether to enable maintainer-specific portions of Makefiles" >&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" *************** fi *** 1000,1006 **** # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1004: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1006,1012 ---- # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1010: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -z "$CC"; then *** 1030,1036 **** # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1034: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1036,1042 ---- # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1040: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1079,1085 **** fi echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:1083: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1085,1091 ---- fi echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ! echo "configure:1089: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1088,1094 **** yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1092: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no --- 1094,1100 ---- yes; #endif EOF ! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1098: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no *************** if test $ac_cv_prog_gcc = yes; then *** 1103,1109 **** ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:1107: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1109,1115 ---- ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ! echo "configure:1113: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1138,1150 **** # automake happy, but we dont execute it, since we dont care about # the result. if false; then echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 ! echo "configure:1143: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:1153: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else --- 1165,1171 ---- return __CYGWIN__; ; return 0; } EOF ! if { (eval echo configure:1169: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else *************** echo "$ac_t""$ac_cv_cygwin" 1>&6 *** 1172,1190 **** CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:1176: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else --- 1182,1200 ---- CYGWIN= test "$ac_cv_cygwin" = yes && CYGWIN=yes echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 ! echo "configure:1186: checking for mingw32 environment" >&5 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_mingw32=yes else *************** test "$ac_cv_mingw32" = yes && MINGW32=y *** 1203,1209 **** echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1207: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1213,1219 ---- echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 ! echo "configure:1217: checking for executable suffix" >&5 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1213,1219 **** rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1217: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in *.c | *.o | *.obj | *.ilk | *.pdb) ;; --- 1223,1229 ---- rm -f conftest* echo 'int main () { return 0; }' > conftest.$ac_ext ac_cv_exeext= ! if { (eval echo configure:1227: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then for file in conftest.*; do case $file in *.c | *.o | *.obj | *.ilk | *.pdb) ;; *************** ac_prog=ld *** 1315,1321 **** if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1319: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw --- 1325,1331 ---- if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 ! echo "configure:1329: checking for ld used by GCC" >&5 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw *************** echo "configure:1319: checking for ld us *** 1345,1354 **** esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1349: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1352: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 1355,1364 ---- esac elif test "$with_gnu_ld" = yes; then echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 ! echo "configure:1359: checking for GNU ld" >&5 else echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 ! echo "configure:1362: checking for non-GNU ld" >&5 fi if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 1383,1389 **** fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1387: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1393,1399 ---- fi test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 ! echo "configure:1397: checking if the linker ($LD) is GNU ld" >&5 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** with_gnu_ld=$lt_cv_prog_gnu_ld *** 1400,1406 **** echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1404: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1410,1416 ---- echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6 ! echo "configure:1414: checking for $LD option to reload object files" >&5 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** reload_flag=$lt_cv_ld_reload_flag *** 1412,1418 **** test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1416: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1422,1428 ---- test -n "$reload_flag" && reload_flag=" $reload_flag" echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 ! echo "configure:1426: checking for BSD-compatible nm" >&5 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** NM="$lt_cv_path_NM" *** 1450,1456 **** echo "$ac_t""$NM" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:1454: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1460,1466 ---- echo "$ac_t""$NM" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 ! echo "configure:1464: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 1471,1477 **** fi echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1475: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1481,1487 ---- fi echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6 ! echo "configure:1485: checking how to recognise dependant libraries" >&5 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** file_magic_cmd=$lt_cv_file_magic_cmd *** 1635,1647 **** deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:1639: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:1645: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; --- 1645,1657 ---- deplibs_check_method=$lt_cv_deplibs_check_method echo $ac_n "checking for object suffix""... $ac_c" 1>&6 ! echo "configure:1649: checking for object suffix" >&5 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else rm -f conftest* echo 'int i = 1;' > conftest.$ac_ext ! if { (eval echo configure:1655: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then for ac_file in conftest.*; do case $ac_file in *.c) ;; *************** case $deplibs_check_method in *** 1671,1677 **** file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:1675: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1681,1687 ---- file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 ! echo "configure:1685: checking for ${ac_tool_prefix}file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1733,1739 **** if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:1737: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1743,1749 ---- if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo $ac_n "checking for file""... $ac_c" 1>&6 ! echo "configure:1747: checking for file" >&5 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** esac *** 1804,1810 **** # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1808: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1814,1820 ---- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1818: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 1836,1842 **** # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1840: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1846,1852 ---- # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1850: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** fi *** 1871,1877 **** # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1875: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1881,1887 ---- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1885: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** if test -n "$ac_tool_prefix"; then *** 1903,1909 **** # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1907: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 1913,1919 ---- # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ! echo "configure:1917: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** test x"$pic_mode" = xno && libtool_flags *** 1970,1977 **** case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 1974 "configure"' > conftest.$ac_ext ! if { (eval echo configure:1975: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" --- 1980,1987 ---- case $host in *-*-irix6*) # Find out which ABI we are using. ! echo '#line 1984 "configure"' > conftest.$ac_ext ! if { (eval echo configure:1985: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" *************** case $host in *** 1992,1998 **** SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:1996: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2002,2008 ---- SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 ! echo "configure:2006: checking whether the C compiler needs -belf" >&5 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** ac_link='${CC-cc} -o conftest${ac_exeext *** 2005,2018 **** cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else --- 2015,2028 ---- cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* lt_cv_cc_needs_belf=yes else *************** fi *** 2138,2144 **** # Find CPP now so that any conditional tests below won't do it and # thereby make the resulting definitions conditional. echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:2142: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= --- 2148,2154 ---- # Find CPP now so that any conditional tests below won't do it and # thereby make the resulting definitions conditional. echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 ! echo "configure:2152: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= *************** else *** 2153,2165 **** # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2163,2175 ---- # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2173: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2170,2182 **** rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2180: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2180,2192 ---- rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2190: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2187,2199 **** rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : --- 2197,2209 ---- rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2207: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : *************** else *** 2241,2257 **** do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:2245: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2255: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 2251,2267 ---- do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:2255: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2265: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** done *** 2280,2291 **** for ac_func in getpagesize do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:2284: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:2294: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 2318,2324 ---- ; return 0; } EOF ! if { (eval echo configure:2322: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** fi *** 2333,2339 **** done echo $ac_n "checking for working mmap""... $ac_c" 1>&6 ! echo "configure:2337: checking for working mmap" >&5 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else --- 2343,2349 ---- done echo $ac_n "checking for working mmap""... $ac_c" 1>&6 ! echo "configure:2347: checking for working mmap" >&5 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else *************** else *** 2341,2347 **** ac_cv_func_mmap_fixed_mapped=no else cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_mmap_fixed_mapped=yes else --- 2491,2497 ---- } EOF ! if { (eval echo configure:2495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then ac_cv_func_mmap_fixed_mapped=yes else *************** fi *** 2506,2517 **** for ac_func in memcpy strerror do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ! echo "configure:2510: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&6 ! echo "configure:2520: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else --- 2544,2550 ---- ; return 0; } EOF ! if { (eval echo configure:2548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else *************** done *** 2561,2567 **** if test "$with_system_zlib" = yes; then echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6 ! echo "configure:2565: checking for deflate in -lz" >&5 ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 --- 2571,2577 ---- if test "$with_system_zlib" = yes; then echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6 ! echo "configure:2575: checking for deflate in -lz" >&5 ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 *************** else *** 2569,2575 **** ac_save_LIBS="$LIBS" LIBS="-lz $LIBS" cat > conftest.$ac_ext < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else --- 2590,2596 ---- deflate() ; return 0; } EOF ! if { (eval echo configure:2594: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else *************** for ac_hdr in unistd.h *** 2612,2628 **** do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:2616: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2626: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* --- 2622,2638 ---- do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ! echo "configure:2626: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ! { (eval echo configure:2636: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* *************** CXX="${CXX}" *** 2979,2984 **** --- 2989,2995 ---- EOF cat >> $CONFIG_STATUS <<\EOF if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" ac_file=Makefile . ${zlib_basedir}/../config-ml.in fi exit 0 diff -Nrc3pad gcc-3.0.4/zlib/configure.in gcc-3.1/zlib/configure.in *** gcc-3.0.4/zlib/configure.in Tue Jul 3 22:29:14 2001 --- gcc-3.1/zlib/configure.in Wed May 8 04:28:44 2002 *************** dnl Process this with autoconf to create *** 2,7 **** --- 2,13 ---- AC_INIT(zlib.h) + # This works around the fact that libtool configuration may change LD + # for this particular configuration, but some shells, instead of + # keeping the changes in LD private, export them just because LD is + # exported. + ORIGINAL_LD_FOR_MULTILIBS=$LD + dnl We may get other options which we dont document: dnl --with-target-subdir, --with-multisrctop, --with-multisubdir *************** LIB_AC_PROG_CC *** 61,66 **** --- 67,76 ---- # automake happy, but we dont execute it, since we dont care about # the result. if false; then + # autoconf 2.50 runs AC_EXEEXT by default, and the macro expands + # to nothing, so nothing would remain between `then' and `fi' if it + # were not for the `:' below. + : AC_EXEEXT fi AM_PROG_LIBTOOL *************** fi *** 114,119 **** --- 124,130 ---- AC_OUTPUT(Makefile, [if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" ac_file=Makefile . ${zlib_basedir}/../config-ml.in fi], srcdir=${srcdir} diff -Nrc3pad gcc-3.0.4/zlib/contrib/iostream2/zstream.h gcc-3.1/zlib/contrib/iostream2/zstream.h *** gcc-3.0.4/zlib/contrib/iostream2/zstream.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/contrib/iostream2/zstream.h Mon Mar 11 22:18:23 2002 *************** *** 21,27 **** /* * zstream.h - C++ interface to the 'zlib' general purpose compression library ! * $Id: zstream.h,v 1.1 1999/05/04 19:30:27 tromey Exp $ */ #include --- 21,27 ---- /* * zstream.h - C++ interface to the 'zlib' general purpose compression library ! * $Id: zstream.h,v 1.1.26.1 2002/03/11 22:18:23 tromey Exp $ */ #include diff -Nrc3pad gcc-3.0.4/zlib/crc32.c gcc-3.1/zlib/crc32.c *** gcc-3.0.4/zlib/crc32.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/crc32.c Mon Mar 11 22:18:17 2002 *************** *** 1,9 **** /* crc32.c -- compute the CRC-32 of a data stream ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: crc32.c,v 1.1 1999/05/04 19:30:26 tromey Exp $ */ #include "zlib.h" --- 1,9 ---- /* crc32.c -- compute the CRC-32 of a data stream ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: crc32.c,v 1.1.26.1 2002/03/11 22:18:17 tromey Exp $ */ #include "zlib.h" diff -Nrc3pad gcc-3.0.4/zlib/deflate.c gcc-3.1/zlib/deflate.c *** gcc-3.0.4/zlib/deflate.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/deflate.c Mon Mar 11 22:18:17 2002 *************** *** 1,5 **** /* deflate.c -- compress data using the deflation algorithm ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* deflate.c -- compress data using the deflation algorithm ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ *************** *** 47,58 **** * */ ! /* @(#) $Id: deflate.c,v 1.1 1999/05/04 19:30:26 tromey Exp $ */ #include "deflate.h" const char deflate_copyright[] = ! " deflate 1.1.3 Copyright 1995-1998 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot --- 47,58 ---- * */ ! /* @(#) $Id: deflate.c,v 1.1.26.1 2002/03/11 22:18:17 tromey Exp $ */ #include "deflate.h" const char deflate_copyright[] = ! " deflate 1.1.4 Copyright 1995-2002 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot *************** int ZEXPORT deflateInit2_(strm, level, m *** 242,248 **** windowBits = -windowBits; } if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || ! windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { return Z_STREAM_ERROR; } --- 242,248 ---- windowBits = -windowBits; } if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || ! windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { return Z_STREAM_ERROR; } diff -Nrc3pad gcc-3.0.4/zlib/deflate.h gcc-3.1/zlib/deflate.h *** gcc-3.0.4/zlib/deflate.h Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/deflate.h Mon Mar 11 22:18:17 2002 *************** *** 1,5 **** /* deflate.h -- internal compression state ! * Copyright (C) 1995-1998 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* deflate.h -- internal compression state ! * Copyright (C) 1995-2002 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ *************** *** 8,14 **** subject to change. Applications should only use zlib.h. */ ! /* @(#) $Id: deflate.h,v 1.1 1999/05/04 19:30:26 tromey Exp $ */ #ifndef _DEFLATE_H #define _DEFLATE_H --- 8,14 ---- subject to change. Applications should only use zlib.h. */ ! /* @(#) $Id: deflate.h,v 1.1.26.1 2002/03/11 22:18:17 tromey Exp $ */ #ifndef _DEFLATE_H #define _DEFLATE_H diff -Nrc3pad gcc-3.0.4/zlib/example.c gcc-3.1/zlib/example.c *** gcc-3.0.4/zlib/example.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/example.c Mon Mar 11 22:18:18 2002 *************** *** 1,9 **** /* example.c -- usage example of the zlib compression library ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: example.c,v 1.1 1999/05/04 19:30:26 tromey Exp $ */ #include #include "zlib.h" --- 1,9 ---- /* example.c -- usage example of the zlib compression library ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: example.c,v 1.1.26.1 2002/03/11 22:18:18 tromey Exp $ */ #include #include "zlib.h" diff -Nrc3pad gcc-3.0.4/zlib/gzio.c gcc-3.1/zlib/gzio.c *** gcc-3.0.4/zlib/gzio.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/gzio.c Mon Mar 11 22:18:18 2002 *************** *** 1,11 **** /* gzio.c -- IO on .gz files ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_DEFLATE to avoid the compression code. */ ! /* @(#) $Id: gzio.c,v 1.1 1999/05/04 19:30:26 tromey Exp $ */ #include --- 1,11 ---- /* gzio.c -- IO on .gz files ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_DEFLATE to avoid the compression code. */ ! /* @(#) $Id: gzio.c,v 1.1.26.1 2002/03/11 22:18:18 tromey Exp $ */ #include diff -Nrc3pad gcc-3.0.4/zlib/infblock.c gcc-3.1/zlib/infblock.c *** gcc-3.0.4/zlib/infblock.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/infblock.c Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* infblock.c -- interpret and process block types to last block ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* infblock.c -- interpret and process block types to last block ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ *************** int r; *** 249,258 **** &s->sub.trees.tb, s->hufts, z); if (t != Z_OK) { - ZFREE(z, s->sub.trees.blens); r = t; if (r == Z_DATA_ERROR) s->mode = BAD; LEAVE } s->sub.trees.index = 0; --- 249,260 ---- &s->sub.trees.tb, s->hufts, z); if (t != Z_OK) { r = t; if (r == Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); s->mode = BAD; + } LEAVE } s->sub.trees.index = 0; *************** int r; *** 313,323 **** t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), s->sub.trees.blens, &bl, &bd, &tl, &td, s->hufts, z); - ZFREE(z, s->sub.trees.blens); if (t != Z_OK) { if (t == (uInt)Z_DATA_ERROR) s->mode = BAD; r = t; LEAVE } --- 315,327 ---- t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), s->sub.trees.blens, &bl, &bd, &tl, &td, s->hufts, z); if (t != Z_OK) { if (t == (uInt)Z_DATA_ERROR) + { + ZFREE(z, s->sub.trees.blens); s->mode = BAD; + } r = t; LEAVE } *************** int r; *** 329,334 **** --- 333,339 ---- } s->sub.decode.codes = c; } + ZFREE(z, s->sub.trees.blens); s->mode = CODES; case CODES: UPDATE diff -Nrc3pad gcc-3.0.4/zlib/infblock.h gcc-3.1/zlib/infblock.h *** gcc-3.0.4/zlib/infblock.h Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/infblock.h Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* infblock.h -- header to use infblock.c ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* infblock.h -- header to use infblock.c ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/infcodes.c gcc-3.1/zlib/infcodes.c *** gcc-3.0.4/zlib/infcodes.c Tue May 4 19:30:26 1999 --- gcc-3.1/zlib/infcodes.c Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* infcodes.c -- process literals and length/distance pairs ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* infcodes.c -- process literals and length/distance pairs ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ *************** int r; *** 196,210 **** Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); c->mode = COPY; case COPY: /* o: copying bytes in window, waiting for space */ - #ifndef __TURBOC__ /* Turbo C bug for following expression */ - f = (uInt)(q - s->window) < c->sub.copy.dist ? - s->end - (c->sub.copy.dist - (q - s->window)) : - q - c->sub.copy.dist; - #else f = q - c->sub.copy.dist; ! if ((uInt)(q - s->window) < c->sub.copy.dist) ! f = s->end - (c->sub.copy.dist - (uInt)(q - s->window)); ! #endif while (c->len) { NEEDOUT --- 196,204 ---- Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); c->mode = COPY; case COPY: /* o: copying bytes in window, waiting for space */ f = q - c->sub.copy.dist; ! while (f < s->window) /* modulo window size-"while" instead */ ! f += s->end - s->window; /* of "if" handles invalid distances */ while (c->len) { NEEDOUT diff -Nrc3pad gcc-3.0.4/zlib/infcodes.h gcc-3.1/zlib/infcodes.h *** gcc-3.0.4/zlib/infcodes.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/infcodes.h Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* infcodes.h -- header to use infcodes.c ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* infcodes.h -- header to use infcodes.c ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/inffast.c gcc-3.1/zlib/inffast.c *** gcc-3.0.4/zlib/inffast.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/inffast.c Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* inffast.c -- process literals and length/distance pairs fast ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* inffast.c -- process literals and length/distance pairs fast ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ *************** z_streamp z; *** 93,120 **** /* do the copy */ m -= c; ! if ((uInt)(q - s->window) >= d) /* offset before dest */ ! { /* just copy */ ! r = q - d; ! *q++ = *r++; c--; /* minimum count is three, */ ! *q++ = *r++; c--; /* so unroll loop a little */ ! } ! else /* else offset after destination */ { ! e = d - (uInt)(q - s->window); /* bytes from offset to end */ ! r = s->end - e; /* pointer to offset */ ! if (c > e) /* if source crosses, */ { ! c -= e; /* copy to end of window */ do { ! *q++ = *r++; } while (--e); ! r = s->window; /* copy rest from start of window */ } } ! do { /* copy all or what's left */ ! *q++ = *r++; ! } while (--c); break; } else if ((e & 64) == 0) --- 93,133 ---- /* do the copy */ m -= c; ! r = q - d; ! if (r < s->window) /* wrap if needed */ { ! do { ! r += s->end - s->window; /* force pointer in window */ ! } while (r < s->window); /* covers invalid distances */ ! e = s->end - r; ! if (c > e) { ! c -= e; /* wrapped copy */ do { ! *q++ = *r++; } while (--e); ! r = s->window; ! do { ! *q++ = *r++; ! } while (--c); ! } ! else /* normal copy */ ! { ! *q++ = *r++; c--; ! *q++ = *r++; c--; ! do { ! *q++ = *r++; ! } while (--c); } } ! else /* normal copy */ ! { ! *q++ = *r++; c--; ! *q++ = *r++; c--; ! do { ! *q++ = *r++; ! } while (--c); ! } break; } else if ((e & 64) == 0) diff -Nrc3pad gcc-3.0.4/zlib/inffast.h gcc-3.1/zlib/inffast.h *** gcc-3.0.4/zlib/inffast.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/inffast.h Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* inffast.h -- header to use inffast.c ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* inffast.h -- header to use inffast.c ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/inflate.c gcc-3.1/zlib/inflate.c *** gcc-3.0.4/zlib/inflate.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/inflate.c Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* inflate.c -- zlib interface to inflate modules ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* inflate.c -- zlib interface to inflate modules ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/inftrees.c gcc-3.1/zlib/inftrees.c *** gcc-3.0.4/zlib/inftrees.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/inftrees.c Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* inftrees.c -- generate Huffman trees for efficient decoding ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* inftrees.c -- generate Huffman trees for efficient decoding ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ *************** *** 11,17 **** #endif const char inflate_copyright[] = ! " inflate 1.1.3 Copyright 1995-1998 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot --- 11,17 ---- #endif const char inflate_copyright[] = ! " inflate 1.1.4 Copyright 1995-2002 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot *************** uIntf *v; /* working area: *** 104,111 **** /* Given a list of code lengths and a maximum table size, make a set of tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR if the given code set is incomplete (the tables are still built in this ! case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of ! lengths), or Z_MEM_ERROR if not enough memory. */ { uInt a; /* counter for codes of length k */ --- 104,110 ---- /* Given a list of code lengths and a maximum table size, make a set of tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR if the given code set is incomplete (the tables are still built in this ! case), or Z_DATA_ERROR if the input is invalid. */ { uInt a; /* counter for codes of length k */ *************** uIntf *v; /* working area: *** 231,237 **** /* allocate new table */ if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ ! return Z_MEM_ERROR; /* not enough memory */ u[h] = q = hp + *hn; *hn += z; --- 230,236 ---- /* allocate new table */ if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ ! return Z_DATA_ERROR; /* overflow of MANY */ u[h] = q = hp + *hn; *hn += z; diff -Nrc3pad gcc-3.0.4/zlib/inftrees.h gcc-3.1/zlib/inftrees.h *** gcc-3.0.4/zlib/inftrees.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/inftrees.h Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* inftrees.h -- header to use inftrees.c ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* inftrees.h -- header to use inftrees.c ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/infutil.c gcc-3.1/zlib/infutil.c *** gcc-3.0.4/zlib/infutil.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/infutil.c Mon Mar 11 22:18:18 2002 *************** *** 1,5 **** /* inflate_util.c -- data and routines common to blocks and codes ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* inflate_util.c -- data and routines common to blocks and codes ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/infutil.h gcc-3.1/zlib/infutil.h *** gcc-3.0.4/zlib/infutil.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/infutil.h Mon Mar 11 22:18:19 2002 *************** *** 1,5 **** /* infutil.h -- types and macros common to blocks and codes ! * Copyright (C) 1995-1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* infutil.h -- types and macros common to blocks and codes ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/maketree.c gcc-3.1/zlib/maketree.c *** gcc-3.0.4/zlib/maketree.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/maketree.c Mon Mar 11 22:18:19 2002 *************** *** 1,5 **** /* maketree.c -- make inffixed.h table for decoding fixed codes ! * Copyright (C) 1998 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* maketree.c -- make inffixed.h table for decoding fixed codes ! * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff -Nrc3pad gcc-3.0.4/zlib/minigzip.c gcc-3.1/zlib/minigzip.c *** gcc-3.0.4/zlib/minigzip.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/minigzip.c Mon Mar 11 22:18:19 2002 *************** *** 1,5 **** /* minigzip.c -- simulate gzip using the zlib compression library ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* minigzip.c -- simulate gzip using the zlib compression library ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ *************** *** 13,19 **** * or in pipe mode. */ ! /* @(#) $Id: minigzip.c,v 1.1 1999/05/04 19:30:27 tromey Exp $ */ #include #include "zlib.h" --- 13,19 ---- * or in pipe mode. */ ! /* @(#) $Id: minigzip.c,v 1.1.26.1 2002/03/11 22:18:19 tromey Exp $ */ #include #include "zlib.h" diff -Nrc3pad gcc-3.0.4/zlib/trees.c gcc-3.1/zlib/trees.c *** gcc-3.0.4/zlib/trees.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/trees.c Mon Mar 11 22:18:19 2002 *************** *** 1,5 **** /* trees.c -- output deflated data using Huffman coding ! * Copyright (C) 1995-1998 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* trees.c -- output deflated data using Huffman coding ! * Copyright (C) 1995-2002 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ *************** *** 29,35 **** * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ ! /* @(#) $Id: trees.c,v 1.1 1999/05/04 19:30:27 tromey Exp $ */ /* #define GEN_TREES_H */ --- 29,35 ---- * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ ! /* @(#) $Id: trees.c,v 1.1.26.1 2002/03/11 22:18:19 tromey Exp $ */ /* #define GEN_TREES_H */ diff -Nrc3pad gcc-3.0.4/zlib/uncompr.c gcc-3.1/zlib/uncompr.c *** gcc-3.0.4/zlib/uncompr.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/uncompr.c Mon Mar 11 22:18:19 2002 *************** *** 1,9 **** /* uncompr.c -- decompress a memory buffer ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: uncompr.c,v 1.1 1999/05/04 19:30:27 tromey Exp $ */ #include "zlib.h" --- 1,9 ---- /* uncompr.c -- decompress a memory buffer ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: uncompr.c,v 1.1.26.1 2002/03/11 22:18:19 tromey Exp $ */ #include "zlib.h" diff -Nrc3pad gcc-3.0.4/zlib/zconf.h gcc-3.1/zlib/zconf.h *** gcc-3.0.4/zlib/zconf.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/zconf.h Mon Mar 11 22:18:19 2002 *************** *** 1,9 **** /* zconf.h -- configuration of the zlib compression library ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: zconf.h,v 1.1 1999/05/04 19:30:27 tromey Exp $ */ #ifndef _ZCONF_H #define _ZCONF_H --- 1,9 ---- /* zconf.h -- configuration of the zlib compression library ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: zconf.h,v 1.1.26.1 2002/03/11 22:18:19 tromey Exp $ */ #ifndef _ZCONF_H #define _ZCONF_H diff -Nrc3pad gcc-3.0.4/zlib/zlib.3 gcc-3.1/zlib/zlib.3 *** gcc-3.0.4/zlib/zlib.3 Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/zlib.3 Mon Mar 11 22:18:19 2002 *************** *** 1,4 **** ! .TH ZLIB 3 "9 July 1998" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS --- 1,4 ---- ! .TH ZLIB 3 "11 March 2002" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS *************** These documents are also available in ot *** 81,88 **** .IP ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html .SH AUTHORS ! Version 1.1.3 ! Copyright (C) 1995-1998 Jean-loup Gailly (jloup@gzip.org) and Mark Adler (madler@alumni.caltech.edu). .LP This software is provided "as-is," --- 81,88 ---- .IP ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html .SH AUTHORS ! Version 1.1.4 ! Copyright (C) 1995-2002 Jean-loup Gailly (jloup@gzip.org) and Mark Adler (madler@alumni.caltech.edu). .LP This software is provided "as-is," diff -Nrc3pad gcc-3.0.4/zlib/zlib.h gcc-3.1/zlib/zlib.h *** gcc-3.0.4/zlib/zlib.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/zlib.h Mon Mar 11 22:18:19 2002 *************** *** 1,7 **** /* zlib.h -- interface of the 'zlib' general purpose compression library ! version 1.1.3, July 9th, 1998 ! Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages --- 1,7 ---- /* zlib.h -- interface of the 'zlib' general purpose compression library ! version 1.1.4, March 11th, 2002 ! Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages *************** *** 37,43 **** extern "C" { #endif ! #define ZLIB_VERSION "1.1.3" /* The 'zlib' compression library provides in-memory compression and --- 37,43 ---- extern "C" { #endif ! #define ZLIB_VERSION "1.1.4" /* The 'zlib' compression library provides in-memory compression and diff -Nrc3pad gcc-3.0.4/zlib/zlib.html gcc-3.1/zlib/zlib.html *** gcc-3.0.4/zlib/zlib.html Thu Jan 1 00:00:00 1970 --- gcc-3.1/zlib/zlib.html Mon Mar 11 22:18:19 2002 *************** *** 0 **** --- 1,971 ---- + + + + zlib general purpose compression library version 1.1.4 + + + + + +

          zlib 1.1.4 Manual

          +
          +

          Contents

          +
            +
          1. Prologue +
          2. Introduction +
          3. Utility functions +
          4. Basic functions +
          5. Advanced functions +
          6. Constants +
          7. struct z_stream_s +
          8. Checksum functions +
          9. Misc +
          +
          +

          Prologue

          + 'zlib' general purpose compression library version 1.1.4, March 11th, 2002 +

          + Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler +

          + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. +

          + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: +

            +
          1. The origin of this software must not be misrepresented ; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +
          2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +
          3. This notice may not be removed or altered from any source distribution. +
          + +
          +
          Jean-loup Gailly +
          jloup@gzip.org +
          Mark Adler +
          madler@alumni.caltech.edu +
          + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files + + ftp://ds.internic.net/rfc/rfc1950.txt + (zlib format), + + rfc1951.txt + (deflate format) and + + rfc1952.txt + (gzip format). +

          + This manual is converted from zlib.h by + piaip +

          + Visit + http://ftp.cdrom.com/pub/infozip/zlib/ + for the official zlib web page. +

          + +


          +

          Introduction

          + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. +

          + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. +

          + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio. +

          + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +

          + +


          +

          Utility functions

          + The following utility functions are implemented on top of the +
          basic stream-oriented functions. + To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +

          Function list

          +
            +
          • int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
          • int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); +
          • int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
          • typedef voidp gzFile; +
          • gzFile gzopen (const char *path, const char *mode); +
          • gzFile gzdopen (int fd, const char *mode); +
          • int gzsetparams (gzFile file, int level, int strategy); +
          • int gzread (gzFile file, voidp buf, unsigned len); +
          • int gzwrite (gzFile file, const voidp buf, unsigned len); +
          • int VA gzprintf (gzFile file, const char *format, ...); +
          • int gzputs (gzFile file, const char *s); +
          • char * gzgets (gzFile file, char *buf, int len); +
          • int gzputc (gzFile file, int c); +
          • int gzgetc (gzFile file); +
          • int gzflush (gzFile file, int flush); +
          • z_off_t gzseek (gzFile file, z_off_t offset, int whence); +
          • z_off_t gztell (gzFile file); +
          • int gzrewind (gzFile file); +
          • int gzeof (gzFile file); +
          • int gzclose (gzFile file); +
          • const char * gzerror (gzFile file, int *errnum); +
          +

          Function description

          +
          +
          int compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
          + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least 0.1% larger than + sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the + compressed buffer.

          + This function can be used to compress a whole file at once if the + input file is mmap'ed.

          + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer.

          + +

          int compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level); +
          + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. +

          + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +

          + +

          int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); +
          + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer.

          + This function can be used to decompress a whole file at once if the + input file is mmap'ed. +

          + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +

          + +

          typedef voidp gzFile; +

          + +

          gzFile gzopen (const char *path, const char *mode); +
          + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h". (See the description + of deflateInit2 for more information about the strategy parameter.) +

          + + gzopen can be used to read a file which is not in gzip format ; in this + case gzread will directly read from the file without decompression. +

          + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state ; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +

          + +

          gzFile gzdopen (int fd, const char *mode); +
          + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. +

          + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). +

          + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +

          + +

          int gzsetparams (gzFile file, int level, int strategy); +
          + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. +

          + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +

          + +

          int gzread (gzFile file, voidp buf, unsigned len); +
          + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. +

          + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). +

          + +

          int gzwrite (gzFile file, const voidp buf, unsigned len); +
          + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +

          + +

          int VA gzprintf (gzFile file, const char *format, ...); +
          + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +

          + +

          int gzputs (gzFile file, const char *s); +
          + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. +

          + gzputs returns the number of characters written, or -1 in case of error. +

          + +

          char * gzgets (gzFile file, char *buf, int len); +
          + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. +

          + gzgets returns buf, or Z_NULL in case of error. +

          + +

          int gzputc (gzFile file, int c); +
          + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +

          + +

          int gzgetc (gzFile file); +
          + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +

          + +

          int gzflush (gzFile file, int flush); +
          + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. +

          + gzflush should be called only when strictly necessary because it can + degrade compression. +

          + +

          z_off_t gzseek (gzFile file, z_off_t offset, int whence); +
          + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. +

          + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported ; gzseek then compresses a sequence of zeroes up to the new + starting position. +

          + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +

          + +

          int gzrewind (gzFile file); +
          + Rewinds the given file. This function is supported only for reading. +

          + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +

          + +

          z_off_t gztell (gzFile file); +
          + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. +

          + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +

          + +

          int gzeof (gzFile file); +
          + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +

          + +

          int gzclose (gzFile file); +
          + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +

          + +

          const char * gzerror (gzFile file, int *errnum); +
          + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +

          +

          +
          +

          Basic functions

          +

          Function list

          +
          + +

          Function description

          +
          +
          const char * zlibVersion (void); +
          The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. +

          + +

          int deflateInit (z_streamp strm, int level); +
          + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. +

          + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). +

          + + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). +

          + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +

          + +

          int deflate (z_streamp strm, int flush); +
          + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush.

          + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + +

            +
          • Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + +
          • + Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. +

          + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly ; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. +

          + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. +

          + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + the compression. +

          + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). +

          + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space ; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. +

          + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + 0.1% larger than avail_in plus 12 bytes. If deflate does not return + Z_STREAM_END, then it must be called again as described above. +

          + + deflate() sets strm-> adler to the adler32 checksum of all input read + so far (that is, total_in bytes). +

          + + deflate() may update data_type if it can make a good guess about + the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. +

          + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). +

          + +

          int deflateEnd (z_streamp strm); +
          + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. +

          + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +

          + +

          int inflateInit (z_streamp strm); +
          + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly ; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. +

          + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +

          + +

          int inflate (z_streamp strm, int flush); +
          + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may some + introduce some output latency (reading input without producing any output) + except when forced to flush. +

          + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + +

            +
          • Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + +
          • Provide more output starting at next_out and update next_out and + avail_out accordingly. inflate() provides as much output as possible, + until there is no more input data or no more space in the output buffer + (see below about the flush parameter). +

          + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. +

          + + If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much + output as possible to the output buffer. The flushing behavior of inflate is + not specified for values of the flush parameter other than Z_SYNC_FLUSH + and Z_FINISH, but the current implementation actually flushes as much output + as possible anyway. +

          + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed ; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster routine + may be used for the single inflate() call. +

          + + If a preset dictionary is needed at this point (see inflateSetDictionary + below), inflate sets strm-adler to the adler32 checksum of the + dictionary chosen by the compressor and returns Z_NEED_DICT ; otherwise + it sets strm-> adler to the adler32 checksum of all output produced + so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or + an error code as described below. At the end of the stream, inflate() + checks that its computed adler32 checksum is equal to that saved by the + compressor and returns Z_STREAM_END only if the checksum is correct. +

          + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect + adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent + (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if no progress is possible or if there was not + enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR + case, the application may then call inflateSync to look for a good + compression block. +

          + +

          int inflateEnd (z_streamp strm); +
          + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. +

          + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +

          +
          +

          Advanced functions

          + The following functions are needed only in some special applications. +

          Function list

          +
          +

          Function description

          +
          +
          int deflateInit2 (z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy); + +
          This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller.

          + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library.

          + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead.

          + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio ; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel.

          + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match). Filtered data consists mostly of small values with a + somewhat random distribution. In this case, the compression algorithm is + tuned to compress them better. The effect of Z_FILTERED is to force more + Huffman coding and less string matching ; it is somewhat intermediate + between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects + the compression ratio but not the correctness of the compressed output even + if it is not set appropriately.

          + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate().

          + +

          int deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength); +
          + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary).

          + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy ; the data can then be compressed better than + with the default empty dictionary.

          + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front.

          + + Upon return of this function, strm-> adler is set to the Adler32 value + of the dictionary ; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The Adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.)

          + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate().

          + +

          int deflateCopy (z_streamp dest, z_streamp source); +
          + Sets the destination stream as a complete copy of the source stream.

          + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory.

          + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination.

          + +

          int deflateReset (z_streamp strm); +
          This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2.

          + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL).

          + +

          int deflateParams (z_streamp strm, int level, int strategy); +
          + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate().

          + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm-> avail_out must be + non-zero.

          + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero.

          + +

          int inflateInit2 (z_streamp strm, int windowBits); + +
          This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller.

          + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. If a compressed stream with a larger window size is given as + input, inflate() will return with the error code Z_DATA_ERROR instead of + trying to allocate a larger window.

          + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative + memLevel). msg is set to null if there is no error message. inflateInit2 + does not perform any decompression apart from reading the zlib header if + present: this will be done by inflate(). (So next_in and avail_in may be + modified, but next_out and avail_out are unchanged.)

          + +

          int inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength); +
          + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate + if this call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the Adler32 value returned by this call of + inflate. The compressor and decompressor must use exactly the same + dictionary (see deflateSetDictionary).

          + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect Adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate().

          + +

          int inflateSync (z_streamp strm); + +
          Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided.

          + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data.

          + +

          int inflateReset (z_streamp strm); +
          + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. +

          + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +

          +

          + +
          +

          Checksum functions

          + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +

          Function list

          +
          +

          Function description

          +
          +
          uLong adler32 (uLong adler, const Bytef *buf, uInt len); +
          + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. +

          + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: +

          + 
          +      uLong adler = adler32(0L, Z_NULL, 0);
          + 
          +      while (read_buffer(buffer, length) != EOF) {
          +        adler = adler32(adler, buffer, length);
          +      }
          +      if (adler != original_adler) error();
          +    
          + +
          uLong crc32 (uLong crc, const Bytef *buf, uInt len); +
          + Update a running crc with the bytes buf[0..len-1] and return the updated + crc. If buf is NULL, this function returns the required initial value + for the crc. Pre- and post-conditioning (one's complement) is performed + within this function so it shouldn't be done by the application. + Usage example: +
          + 
          +      uLong crc = crc32(0L, Z_NULL, 0);
          + 
          +      while (read_buffer(buffer, length) != EOF) {
          +        crc = crc32(crc, buffer, length);
          +      }
          +      if (crc != original_crc) error();
          +    
          +
          +
          +

          struct z_stream_s

          + +
          +
          + typedef struct z_stream_s {
          +     Bytef    *next_in;  /* next input byte */
          +     uInt     avail_in;  /* number of bytes available at next_in */
          +     uLong    total_in;  /* total nb of input bytes read so far */
          + 
          +     Bytef    *next_out; /* next output byte should be put there */
          +     uInt     avail_out; /* remaining free space at next_out */
          +     uLong    total_out; /* total nb of bytes output so far */
          + 
          +     char     *msg;      /* last error message, NULL if no error */
          +     struct internal_state FAR *state; /* not visible by applications */
          + 
          +     alloc_func zalloc;  /* used to allocate the internal state */
          +     free_func  zfree;   /* used to free the internal state */
          +     voidpf     opaque;  /* private data object passed to zalloc and zfree */
          + 
          +     int     data_type;  /* best guess about the data type: ascii or binary */
          +     uLong   adler;      /* adler32 value of the uncompressed data */
          +     uLong   reserved;   /* reserved for future use */
          + } z_stream ;
          + 
          + typedef z_stream FAR * z_streamp;  ÿ 
          + 
          +
          + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application.

          + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value.

          + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe.

          + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). +

          + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step).

          + +


          +

          Constants

          + +
          + #define Z_NO_FLUSH      0
          + #define Z_PARTIAL_FLUSH 1 
          + 	/* will be removed, use Z_SYNC_FLUSH instead */
          + #define Z_SYNC_FLUSH    2
          + #define Z_FULL_FLUSH    3
          + #define Z_FINISH        4
          + /* Allowed flush values ; see deflate() below for details */
          + 
          + #define Z_OK            0
          + #define Z_STREAM_END    1
          + #define Z_NEED_DICT     2
          + #define Z_ERRNO        (-1)
          + #define Z_STREAM_ERROR (-2)
          + #define Z_DATA_ERROR   (-3)
          + #define Z_MEM_ERROR    (-4)
          + #define Z_BUF_ERROR    (-5)
          + #define Z_VERSION_ERROR (-6)
          + /* Return codes for the compression/decompression functions. Negative
          +  * values are errors, positive values are used for special but normal events.
          +  */
          + 
          + #define Z_NO_COMPRESSION         0
          + #define Z_BEST_SPEED             1
          + #define Z_BEST_COMPRESSION       9
          + #define Z_DEFAULT_COMPRESSION  (-1)
          + /* compression levels */
          + 
          + #define Z_FILTERED            1
          + #define Z_HUFFMAN_ONLY        2
          + #define Z_DEFAULT_STRATEGY    0
          + /* compression strategy ; see deflateInit2() below for details */
          + 
          + #define Z_BINARY   0
          + #define Z_ASCII    1
          + #define Z_UNKNOWN  2
          + /* Possible values of the data_type field */
          + 
          + #define Z_DEFLATED   8
          + /* The deflate compression method (the only one supported in this version) */
          + 
          + #define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
          + 
          + #define zlib_version zlibVersion()
          + /* for compatibility with versions less than 1.0.2 */
          + 
          +
          + +
          +

          Misc

          +
          deflateInit and inflateInit are macros to allow checking the zlib version + and the compiler's view of z_stream. +

          + Other functions: +

          +
          const char * zError (int err); +
          int inflateSyncPoint (z_streamp z); +
          const uLongf * get_crc_table (void); +
          +
          + + Last update: Wed Oct 13 20:42:34 1999
          + piapi@csie.ntu.edu.tw +
          + + + diff -Nrc3pad gcc-3.0.4/zlib/zutil.c gcc-3.1/zlib/zutil.c *** gcc-3.0.4/zlib/zutil.c Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/zutil.c Mon Mar 11 22:18:20 2002 *************** *** 1,9 **** /* zutil.c -- target dependent utility functions for the compression library ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: zutil.c,v 1.1 1999/05/04 19:30:27 tromey Exp $ */ #include "zutil.h" --- 1,9 ---- /* zutil.c -- target dependent utility functions for the compression library ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ ! /* @(#) $Id: zutil.c,v 1.1.26.1 2002/03/11 22:18:20 tromey Exp $ */ #include "zutil.h" diff -Nrc3pad gcc-3.0.4/zlib/zutil.h gcc-3.1/zlib/zutil.h *** gcc-3.0.4/zlib/zutil.h Tue May 4 19:30:27 1999 --- gcc-3.1/zlib/zutil.h Mon Mar 11 22:18:20 2002 *************** *** 1,5 **** /* zutil.h -- internal interface and configuration of the compression library ! * Copyright (C) 1995-1998 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ --- 1,5 ---- /* zutil.h -- internal interface and configuration of the compression library ! * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ *************** *** 8,14 **** subject to change. Applications should only use zlib.h. */ ! /* @(#) $Id: zutil.h,v 1.1 1999/05/04 19:30:27 tromey Exp $ */ #ifndef _Z_UTIL_H #define _Z_UTIL_H --- 8,14 ---- subject to change. Applications should only use zlib.h. */ ! /* @(#) $Id: zutil.h,v 1.1.26.1 2002/03/11 22:18:20 tromey Exp $ */ #ifndef _Z_UTIL_H #define _Z_UTIL_H